From a8b355188c8077a5b7f3e0d8676ccee067ecb907 Mon Sep 17 00:00:00 2001 From: James Ketrenos Date: Fri, 16 May 2025 13:37:05 -0700 Subject: [PATCH] Cleaning up --- Dockerfile | 10 +- chromadb-prod/.keep | 0 docker-compose.yml | 2 +- frontend/.gitignore | 1 + frontend/deployed/adaptive-icon.png | Bin 17547 -> 0 bytes frontend/deployed/asset-manifest.json | 157 ------------------ frontend/deployed/backstory_favicon.ico | Bin 4592 -> 0 bytes frontend/deployed/disable-jpk.png | Bin 4983 -> 0 bytes frontend/deployed/docs/about-app.md | 21 --- frontend/deployed/docs/about.md | 28 ---- frontend/deployed/docs/resume-generation.md | 100 ----------- frontend/deployed/favicon.ico | Bin 9662 -> 0 bytes frontend/deployed/favicon.png | Bin 41223 -> 0 bytes frontend/deployed/icon.png | Bin 22380 -> 0 bytes frontend/deployed/index.html | 1 - frontend/deployed/logo.png | Bin 1281730 -> 0 bytes frontend/deployed/logo192.png | Bin 32353 -> 0 bytes frontend/deployed/logo512.png | Bin 153023 -> 0 bytes frontend/deployed/main-logo.png | Bin 1248577 -> 0 bytes frontend/deployed/manifest.json | 25 --- frontend/deployed/partial-react-logo.png | Bin 5075 -> 0 bytes frontend/deployed/react-logo.png | Bin 6341 -> 0 bytes frontend/deployed/react-logo@2x.png | Bin 14225 -> 0 bytes frontend/deployed/react-logo@3x.png | Bin 21252 -> 0 bytes frontend/deployed/robots.txt | 3 - frontend/deployed/settings.png | Bin 4846 -> 0 bytes frontend/deployed/splash-icon.png | Bin 17547 -> 0 bytes .../deployed/static/css/main.3c3ddc39.css | 2 - .../deployed/static/css/main.3c3ddc39.css.map | 1 - .../deployed/static/js/109.fea37f16.chunk.js | 2 - .../static/js/109.fea37f16.chunk.js.map | 1 - .../deployed/static/js/126.9837c9af.chunk.js | 2 - .../static/js/126.9837c9af.chunk.js.map | 1 - .../deployed/static/js/147.660f25b1.chunk.js | 2 - .../static/js/147.660f25b1.chunk.js.map | 1 - .../deployed/static/js/203.e56567f8.chunk.js | 2 - .../static/js/203.e56567f8.chunk.js.map | 1 - .../deployed/static/js/255.28a7c83e.chunk.js | 2 - .../static/js/255.28a7c83e.chunk.js.map | 1 - .../deployed/static/js/282.876bf6b3.chunk.js | 2 - .../static/js/282.876bf6b3.chunk.js.map | 1 - .../deployed/static/js/314.5b42713c.chunk.js | 2 - .../static/js/314.5b42713c.chunk.js.map | 1 - .../deployed/static/js/318.239ef60c.chunk.js | 1 - .../deployed/static/js/320.f30ff8c0.chunk.js | 2 - .../static/js/320.f30ff8c0.chunk.js.map | 1 - .../deployed/static/js/349.dfb2510e.chunk.js | 2 - .../static/js/349.dfb2510e.chunk.js.map | 1 - .../deployed/static/js/35.b34bde96.chunk.js | 2 - .../static/js/35.b34bde96.chunk.js.map | 1 - .../deployed/static/js/355.143eaed8.chunk.js | 2 - .../static/js/355.143eaed8.chunk.js.map | 1 - .../deployed/static/js/358.7641aa7d.chunk.js | 2 - .../static/js/358.7641aa7d.chunk.js.map | 1 - .../deployed/static/js/370.721ed12b.chunk.js | 2 - .../static/js/370.721ed12b.chunk.js.map | 1 - .../deployed/static/js/372.1ba03aa4.chunk.js | 1 - .../deployed/static/js/415.d031fb39.chunk.js | 2 - .../static/js/415.d031fb39.chunk.js.map | 1 - .../deployed/static/js/448.0ebff170.chunk.js | 2 - .../static/js/448.0ebff170.chunk.js.map | 1 - .../deployed/static/js/453.6fae039d.chunk.js | 2 - .../static/js/453.6fae039d.chunk.js.map | 1 - .../deployed/static/js/461.dcde3ae6.chunk.js | 2 - .../static/js/461.dcde3ae6.chunk.js.map | 1 - .../deployed/static/js/467.ed8fe19b.chunk.js | 2 - .../static/js/467.ed8fe19b.chunk.js.map | 1 - .../deployed/static/js/502.89ac9055.chunk.js | 2 - .../static/js/502.89ac9055.chunk.js.map | 1 - .../deployed/static/js/62.785a92ce.chunk.js | 2 - .../static/js/62.785a92ce.chunk.js.map | 1 - .../deployed/static/js/621.a72de2cb.chunk.js | 2 - .../static/js/621.a72de2cb.chunk.js.map | 1 - .../deployed/static/js/622.95b51007.chunk.js | 2 - .../static/js/622.95b51007.chunk.js.map | 1 - .../deployed/static/js/626.6df36496.chunk.js | 2 - .../static/js/626.6df36496.chunk.js.map | 1 - .../deployed/static/js/646.3df37337.chunk.js | 3 - .../js/646.3df37337.chunk.js.LICENSE.txt | 9 - .../static/js/646.3df37337.chunk.js.map | 1 - .../deployed/static/js/674.cb2cf2f8.chunk.js | 2 - .../static/js/674.cb2cf2f8.chunk.js.map | 1 - .../deployed/static/js/732.b7e64c48.chunk.js | 2 - .../static/js/732.b7e64c48.chunk.js.map | 1 - .../deployed/static/js/761.64498d2a.chunk.js | 2 - .../static/js/761.64498d2a.chunk.js.map | 1 - .../deployed/static/js/807.a9b3c2ae.chunk.js | 2 - .../static/js/807.a9b3c2ae.chunk.js.map | 1 - .../deployed/static/js/824.71eb7c8f.chunk.js | 2 - .../static/js/824.71eb7c8f.chunk.js.map | 1 - .../deployed/static/js/854.2162dcf9.chunk.js | 2 - .../static/js/854.2162dcf9.chunk.js.map | 1 - .../deployed/static/js/859.88148fa8.chunk.js | 2 - .../static/js/859.88148fa8.chunk.js.map | 1 - .../deployed/static/js/914.0546aa7a.chunk.js | 1 - .../deployed/static/js/922.10b19c61.chunk.js | 2 - .../static/js/922.10b19c61.chunk.js.map | 1 - .../deployed/static/js/929.7d5d6402.chunk.js | 1 - .../deployed/static/js/972.19d4b287.chunk.js | 2 - .../static/js/972.19d4b287.chunk.js.map | 1 - .../deployed/static/js/974.879246cb.chunk.js | 1 - .../deployed/static/js/987.378e3c51.chunk.js | 1 - frontend/deployed/static/js/main.b1c48cdf.js | 103 ------------ .../static/js/main.b1c48cdf.js.LICENSE.txt | 157 ------------------ .../deployed/static/js/main.b1c48cdf.js.map | 1 - ...illic-300-normal.44340549d94d10899346.woff | Bin 9760 -> 0 bytes ...llic-300-normal.89d0351bce4bc857dba6.woff2 | Bin 11832 -> 0 bytes ...llic-400-normal.86d5c52f4588f9f221d7.woff2 | Bin 11840 -> 0 bytes ...illic-400-normal.d67ac585bb6a05dbf71c.woff | Bin 9716 -> 0 bytes ...llic-500-normal.1fb2c6d685bfb888cfa3.woff2 | Bin 11976 -> 0 bytes ...illic-500-normal.36f79cc7e73a69da4438.woff | Bin 9904 -> 0 bytes ...illic-700-normal.e00802373a2c2db6b30d.woff | Bin 9916 -> 0 bytes ...llic-700-normal.fd3dfdd6cb1a9175b63d.woff2 | Bin 11968 -> 0 bytes ...c-ext-300-normal.a80c0d0719b1acb8f731.woff | Bin 15732 -> 0 bytes ...-ext-300-normal.b9d87b04a9119d8d2fdf.woff2 | Bin 16912 -> 0 bytes ...-ext-400-normal.31476620b88eec076438.woff2 | Bin 16848 -> 0 bytes ...c-ext-400-normal.5e3f232f89080810567d.woff | Bin 15716 -> 0 bytes ...-ext-500-normal.634ee2238bf30f362d52.woff2 | Bin 17160 -> 0 bytes ...c-ext-500-normal.d6c661248da2fde17768.woff | Bin 15908 -> 0 bytes ...-ext-700-normal.361cdfd3a3f9c4bb09ca.woff2 | Bin 17112 -> 0 bytes ...c-ext-700-normal.6b08bc756cd72f5af9e8.woff | Bin 15924 -> 0 bytes ...greek-300-normal.8300b541aa89b8301a6f.woff | Bin 7484 -> 0 bytes ...reek-300-normal.fdd1f928a606aa116a44.woff2 | Bin 9560 -> 0 bytes ...reek-400-normal.98a717d5a38e77c0f657.woff2 | Bin 9644 -> 0 bytes ...greek-400-normal.ecd8572d631f20ff5bd5.woff | Bin 7480 -> 0 bytes ...greek-500-normal.4fe733bc436afc295c24.woff | Bin 7524 -> 0 bytes ...reek-500-normal.5c8100481d4e784afbf2.woff2 | Bin 9640 -> 0 bytes ...greek-700-normal.d23e03cf87ba44e5af6f.woff | Bin 7512 -> 0 bytes ...reek-700-normal.d7dfd0b02cd8311e2a97.woff2 | Bin 9680 -> 0 bytes ...k-ext-300-normal.60729cafbded24073dfb.woff | Bin 1452 -> 0 bytes ...-ext-300-normal.a88b77bb10633a8045e3.woff2 | Bin 3656 -> 0 bytes ...-ext-400-normal.2d5875b032a1cca91eb2.woff2 | Bin 3676 -> 0 bytes ...k-ext-400-normal.a0baf7d6726d8f751a27.woff | Bin 1488 -> 0 bytes ...k-ext-500-normal.1964239c2800b6bd7e39.woff | Bin 1468 -> 0 bytes ...-ext-500-normal.bef9c15c7164d6435aad.woff2 | Bin 3692 -> 0 bytes ...k-ext-700-normal.1aff9f4cd71608489b9a.woff | Bin 1472 -> 0 bytes ...-ext-700-normal.eb28a447335ba6d54fcb.woff2 | Bin 3660 -> 0 bytes ...latin-300-normal.cb14f8e80cc69ddbac34.woff | Bin 19916 -> 0 bytes ...atin-300-normal.db56943a88e4852343ae.woff2 | Bin 20712 -> 0 bytes ...latin-400-normal.50a0a61e29c19a2f05cb.woff | Bin 19704 -> 0 bytes ...atin-400-normal.df1be0be92f6f19b8115.woff2 | Bin 20612 -> 0 bytes ...atin-500-normal.599f66a60bdf974e578e.woff2 | Bin 20928 -> 0 bytes ...latin-500-normal.c320def131b39bceabd8.woff | Bin 19792 -> 0 bytes ...latin-700-normal.bcfbe8accc968a375a8e.woff | Bin 19864 -> 0 bytes ...atin-700-normal.c4d6cab43bec89049809.woff2 | Bin 20996 -> 0 bytes ...n-ext-300-normal.6ddd1cfdbc5e74bcdab8.woff | Bin 12712 -> 0 bytes ...-ext-300-normal.948c05192b1e64d931b1.woff2 | Bin 13736 -> 0 bytes ...-ext-400-normal.0f86a30ca7e981fcfc99.woff2 | Bin 13740 -> 0 bytes ...n-ext-400-normal.2bfbba2d51a85c8702dd.woff | Bin 12620 -> 0 bytes ...-ext-500-normal.8f02573e78730021ef49.woff2 | Bin 13976 -> 0 bytes ...n-ext-500-normal.aecaab4c4da2bf91377a.woff | Bin 12688 -> 0 bytes ...n-ext-700-normal.2d3c3ba6fe2d9c1026a5.woff | Bin 12652 -> 0 bytes ...-ext-700-normal.8e656eff240311c6050a.woff2 | Bin 13964 -> 0 bytes ...-math-300-normal.90364ecfad5101ceb1a0.woff | Bin 18500 -> 0 bytes ...math-300-normal.acc9c7c1d1fe3a1c7d44.woff2 | Bin 19680 -> 0 bytes ...-math-400-normal.3d3a272e5233c5fb1969.woff | Bin 18348 -> 0 bytes ...math-400-normal.b60d9fba1e21da7497e6.woff2 | Bin 19660 -> 0 bytes ...math-500-normal.41db483cb764343fca71.woff2 | Bin 19976 -> 0 bytes ...-math-500-normal.c3014a611cd9d8fa6252.woff | Bin 18416 -> 0 bytes ...-math-700-normal.a6fde3ddcb1629fd58b7.woff | Bin 18480 -> 0 bytes ...math-700-normal.f6f4b54add6ab9d60a0f.woff2 | Bin 19980 -> 0 bytes ...mbols-300-normal.52cdf8344b378f0c4580.woff | Bin 8780 -> 0 bytes ...bols-300-normal.616638ec44336b3da884.woff2 | Bin 10624 -> 0 bytes ...bols-400-normal.bb5b5d1459beb07bd3d5.woff2 | Bin 10576 -> 0 bytes ...mbols-400-normal.f4f7e3bd8264f1a640cb.woff | Bin 8708 -> 0 bytes ...mbols-500-normal.09b674875029289fd9a7.woff | Bin 8688 -> 0 bytes ...bols-500-normal.a5457b0ec984fd4cc8da.woff2 | Bin 10728 -> 0 bytes ...mbols-700-normal.017e476ef02f62144169.woff | Bin 8736 -> 0 bytes ...bols-700-normal.634070e045ac99822c21.woff2 | Bin 10796 -> 0 bytes ...amese-300-normal.53f399e4522b647bafa7.woff | Bin 5576 -> 0 bytes ...mese-300-normal.6f0bf63e956c09377ef8.woff2 | Bin 7840 -> 0 bytes ...amese-400-normal.1cffe58e71a9109191a2.woff | Bin 5544 -> 0 bytes ...mese-400-normal.b1b8baa94fbcaa57d098.woff2 | Bin 7856 -> 0 bytes ...mese-500-normal.148734d63bd96c6e964f.woff2 | Bin 7840 -> 0 bytes ...amese-500-normal.72dbf2a25dd55b80b137.woff | Bin 5588 -> 0 bytes ...mese-700-normal.44a103f706f3ffe6a041.woff2 | Bin 7880 -> 0 bytes ...amese-700-normal.fa58a041a3336692af1e.woff | Bin 5564 -> 0 bytes frontend/src/VectorVisualizer.tsx | 63 ++++++- src/server.py | 2 +- src/utils/defines.py | 13 +- 180 files changed, 72 insertions(+), 733 deletions(-) delete mode 100644 chromadb-prod/.keep delete mode 100755 frontend/deployed/adaptive-icon.png delete mode 100644 frontend/deployed/asset-manifest.json delete mode 100755 frontend/deployed/backstory_favicon.ico delete mode 100755 frontend/deployed/disable-jpk.png delete mode 100644 frontend/deployed/docs/about-app.md delete mode 100644 frontend/deployed/docs/about.md delete mode 100644 frontend/deployed/docs/resume-generation.md delete mode 100755 frontend/deployed/favicon.ico delete mode 100755 frontend/deployed/favicon.png delete mode 100755 frontend/deployed/icon.png delete mode 100644 frontend/deployed/index.html delete mode 100755 frontend/deployed/logo.png delete mode 100644 frontend/deployed/logo192.png delete mode 100644 frontend/deployed/logo512.png delete mode 100755 frontend/deployed/main-logo.png delete mode 100644 frontend/deployed/manifest.json delete mode 100755 frontend/deployed/partial-react-logo.png delete mode 100755 frontend/deployed/react-logo.png delete mode 100755 frontend/deployed/react-logo@2x.png delete mode 100755 frontend/deployed/react-logo@3x.png delete mode 100644 frontend/deployed/robots.txt delete mode 100755 frontend/deployed/settings.png delete mode 100755 frontend/deployed/splash-icon.png delete mode 100644 frontend/deployed/static/css/main.3c3ddc39.css delete mode 100644 frontend/deployed/static/css/main.3c3ddc39.css.map delete mode 100644 frontend/deployed/static/js/109.fea37f16.chunk.js delete mode 100644 frontend/deployed/static/js/109.fea37f16.chunk.js.map delete mode 100644 frontend/deployed/static/js/126.9837c9af.chunk.js delete mode 100644 frontend/deployed/static/js/126.9837c9af.chunk.js.map delete mode 100644 frontend/deployed/static/js/147.660f25b1.chunk.js delete mode 100644 frontend/deployed/static/js/147.660f25b1.chunk.js.map delete mode 100644 frontend/deployed/static/js/203.e56567f8.chunk.js delete mode 100644 frontend/deployed/static/js/203.e56567f8.chunk.js.map delete mode 100644 frontend/deployed/static/js/255.28a7c83e.chunk.js delete mode 100644 frontend/deployed/static/js/255.28a7c83e.chunk.js.map delete mode 100644 frontend/deployed/static/js/282.876bf6b3.chunk.js delete mode 100644 frontend/deployed/static/js/282.876bf6b3.chunk.js.map delete mode 100644 frontend/deployed/static/js/314.5b42713c.chunk.js delete mode 100644 frontend/deployed/static/js/314.5b42713c.chunk.js.map delete mode 100644 frontend/deployed/static/js/318.239ef60c.chunk.js delete mode 100644 frontend/deployed/static/js/320.f30ff8c0.chunk.js delete mode 100644 frontend/deployed/static/js/320.f30ff8c0.chunk.js.map delete mode 100644 frontend/deployed/static/js/349.dfb2510e.chunk.js delete mode 100644 frontend/deployed/static/js/349.dfb2510e.chunk.js.map delete mode 100644 frontend/deployed/static/js/35.b34bde96.chunk.js delete mode 100644 frontend/deployed/static/js/35.b34bde96.chunk.js.map delete mode 100644 frontend/deployed/static/js/355.143eaed8.chunk.js delete mode 100644 frontend/deployed/static/js/355.143eaed8.chunk.js.map delete mode 100644 frontend/deployed/static/js/358.7641aa7d.chunk.js delete mode 100644 frontend/deployed/static/js/358.7641aa7d.chunk.js.map delete mode 100644 frontend/deployed/static/js/370.721ed12b.chunk.js delete mode 100644 frontend/deployed/static/js/370.721ed12b.chunk.js.map delete mode 100644 frontend/deployed/static/js/372.1ba03aa4.chunk.js delete mode 100644 frontend/deployed/static/js/415.d031fb39.chunk.js delete mode 100644 frontend/deployed/static/js/415.d031fb39.chunk.js.map delete mode 100644 frontend/deployed/static/js/448.0ebff170.chunk.js delete mode 100644 frontend/deployed/static/js/448.0ebff170.chunk.js.map delete mode 100644 frontend/deployed/static/js/453.6fae039d.chunk.js delete mode 100644 frontend/deployed/static/js/453.6fae039d.chunk.js.map delete mode 100644 frontend/deployed/static/js/461.dcde3ae6.chunk.js delete mode 100644 frontend/deployed/static/js/461.dcde3ae6.chunk.js.map delete mode 100644 frontend/deployed/static/js/467.ed8fe19b.chunk.js delete mode 100644 frontend/deployed/static/js/467.ed8fe19b.chunk.js.map delete mode 100644 frontend/deployed/static/js/502.89ac9055.chunk.js delete mode 100644 frontend/deployed/static/js/502.89ac9055.chunk.js.map delete mode 100644 frontend/deployed/static/js/62.785a92ce.chunk.js delete mode 100644 frontend/deployed/static/js/62.785a92ce.chunk.js.map delete mode 100644 frontend/deployed/static/js/621.a72de2cb.chunk.js delete mode 100644 frontend/deployed/static/js/621.a72de2cb.chunk.js.map delete mode 100644 frontend/deployed/static/js/622.95b51007.chunk.js delete mode 100644 frontend/deployed/static/js/622.95b51007.chunk.js.map delete mode 100644 frontend/deployed/static/js/626.6df36496.chunk.js delete mode 100644 frontend/deployed/static/js/626.6df36496.chunk.js.map delete mode 100644 frontend/deployed/static/js/646.3df37337.chunk.js delete mode 100644 frontend/deployed/static/js/646.3df37337.chunk.js.LICENSE.txt delete mode 100644 frontend/deployed/static/js/646.3df37337.chunk.js.map delete mode 100644 frontend/deployed/static/js/674.cb2cf2f8.chunk.js delete mode 100644 frontend/deployed/static/js/674.cb2cf2f8.chunk.js.map delete mode 100644 frontend/deployed/static/js/732.b7e64c48.chunk.js delete mode 100644 frontend/deployed/static/js/732.b7e64c48.chunk.js.map delete mode 100644 frontend/deployed/static/js/761.64498d2a.chunk.js delete mode 100644 frontend/deployed/static/js/761.64498d2a.chunk.js.map delete mode 100644 frontend/deployed/static/js/807.a9b3c2ae.chunk.js delete mode 100644 frontend/deployed/static/js/807.a9b3c2ae.chunk.js.map delete mode 100644 frontend/deployed/static/js/824.71eb7c8f.chunk.js delete mode 100644 frontend/deployed/static/js/824.71eb7c8f.chunk.js.map delete mode 100644 frontend/deployed/static/js/854.2162dcf9.chunk.js delete mode 100644 frontend/deployed/static/js/854.2162dcf9.chunk.js.map delete mode 100644 frontend/deployed/static/js/859.88148fa8.chunk.js delete mode 100644 frontend/deployed/static/js/859.88148fa8.chunk.js.map delete mode 100644 frontend/deployed/static/js/914.0546aa7a.chunk.js delete mode 100644 frontend/deployed/static/js/922.10b19c61.chunk.js delete mode 100644 frontend/deployed/static/js/922.10b19c61.chunk.js.map delete mode 100644 frontend/deployed/static/js/929.7d5d6402.chunk.js delete mode 100644 frontend/deployed/static/js/972.19d4b287.chunk.js delete mode 100644 frontend/deployed/static/js/972.19d4b287.chunk.js.map delete mode 100644 frontend/deployed/static/js/974.879246cb.chunk.js delete mode 100644 frontend/deployed/static/js/987.378e3c51.chunk.js delete mode 100644 frontend/deployed/static/js/main.b1c48cdf.js delete mode 100644 frontend/deployed/static/js/main.b1c48cdf.js.LICENSE.txt delete mode 100644 frontend/deployed/static/js/main.b1c48cdf.js.map delete mode 100644 frontend/deployed/static/media/roboto-cyrillic-300-normal.44340549d94d10899346.woff delete mode 100644 frontend/deployed/static/media/roboto-cyrillic-300-normal.89d0351bce4bc857dba6.woff2 delete mode 100644 frontend/deployed/static/media/roboto-cyrillic-400-normal.86d5c52f4588f9f221d7.woff2 delete mode 100644 frontend/deployed/static/media/roboto-cyrillic-400-normal.d67ac585bb6a05dbf71c.woff delete mode 100644 frontend/deployed/static/media/roboto-cyrillic-500-normal.1fb2c6d685bfb888cfa3.woff2 delete mode 100644 frontend/deployed/static/media/roboto-cyrillic-500-normal.36f79cc7e73a69da4438.woff delete mode 100644 frontend/deployed/static/media/roboto-cyrillic-700-normal.e00802373a2c2db6b30d.woff delete mode 100644 frontend/deployed/static/media/roboto-cyrillic-700-normal.fd3dfdd6cb1a9175b63d.woff2 delete mode 100644 frontend/deployed/static/media/roboto-cyrillic-ext-300-normal.a80c0d0719b1acb8f731.woff delete mode 100644 frontend/deployed/static/media/roboto-cyrillic-ext-300-normal.b9d87b04a9119d8d2fdf.woff2 delete mode 100644 frontend/deployed/static/media/roboto-cyrillic-ext-400-normal.31476620b88eec076438.woff2 delete mode 100644 frontend/deployed/static/media/roboto-cyrillic-ext-400-normal.5e3f232f89080810567d.woff delete mode 100644 frontend/deployed/static/media/roboto-cyrillic-ext-500-normal.634ee2238bf30f362d52.woff2 delete mode 100644 frontend/deployed/static/media/roboto-cyrillic-ext-500-normal.d6c661248da2fde17768.woff delete mode 100644 frontend/deployed/static/media/roboto-cyrillic-ext-700-normal.361cdfd3a3f9c4bb09ca.woff2 delete mode 100644 frontend/deployed/static/media/roboto-cyrillic-ext-700-normal.6b08bc756cd72f5af9e8.woff delete mode 100644 frontend/deployed/static/media/roboto-greek-300-normal.8300b541aa89b8301a6f.woff delete mode 100644 frontend/deployed/static/media/roboto-greek-300-normal.fdd1f928a606aa116a44.woff2 delete mode 100644 frontend/deployed/static/media/roboto-greek-400-normal.98a717d5a38e77c0f657.woff2 delete mode 100644 frontend/deployed/static/media/roboto-greek-400-normal.ecd8572d631f20ff5bd5.woff delete mode 100644 frontend/deployed/static/media/roboto-greek-500-normal.4fe733bc436afc295c24.woff delete mode 100644 frontend/deployed/static/media/roboto-greek-500-normal.5c8100481d4e784afbf2.woff2 delete mode 100644 frontend/deployed/static/media/roboto-greek-700-normal.d23e03cf87ba44e5af6f.woff delete mode 100644 frontend/deployed/static/media/roboto-greek-700-normal.d7dfd0b02cd8311e2a97.woff2 delete mode 100644 frontend/deployed/static/media/roboto-greek-ext-300-normal.60729cafbded24073dfb.woff delete mode 100644 frontend/deployed/static/media/roboto-greek-ext-300-normal.a88b77bb10633a8045e3.woff2 delete mode 100644 frontend/deployed/static/media/roboto-greek-ext-400-normal.2d5875b032a1cca91eb2.woff2 delete mode 100644 frontend/deployed/static/media/roboto-greek-ext-400-normal.a0baf7d6726d8f751a27.woff delete mode 100644 frontend/deployed/static/media/roboto-greek-ext-500-normal.1964239c2800b6bd7e39.woff delete mode 100644 frontend/deployed/static/media/roboto-greek-ext-500-normal.bef9c15c7164d6435aad.woff2 delete mode 100644 frontend/deployed/static/media/roboto-greek-ext-700-normal.1aff9f4cd71608489b9a.woff delete mode 100644 frontend/deployed/static/media/roboto-greek-ext-700-normal.eb28a447335ba6d54fcb.woff2 delete mode 100644 frontend/deployed/static/media/roboto-latin-300-normal.cb14f8e80cc69ddbac34.woff delete mode 100644 frontend/deployed/static/media/roboto-latin-300-normal.db56943a88e4852343ae.woff2 delete mode 100644 frontend/deployed/static/media/roboto-latin-400-normal.50a0a61e29c19a2f05cb.woff delete mode 100644 frontend/deployed/static/media/roboto-latin-400-normal.df1be0be92f6f19b8115.woff2 delete mode 100644 frontend/deployed/static/media/roboto-latin-500-normal.599f66a60bdf974e578e.woff2 delete mode 100644 frontend/deployed/static/media/roboto-latin-500-normal.c320def131b39bceabd8.woff delete mode 100644 frontend/deployed/static/media/roboto-latin-700-normal.bcfbe8accc968a375a8e.woff delete mode 100644 frontend/deployed/static/media/roboto-latin-700-normal.c4d6cab43bec89049809.woff2 delete mode 100644 frontend/deployed/static/media/roboto-latin-ext-300-normal.6ddd1cfdbc5e74bcdab8.woff delete mode 100644 frontend/deployed/static/media/roboto-latin-ext-300-normal.948c05192b1e64d931b1.woff2 delete mode 100644 frontend/deployed/static/media/roboto-latin-ext-400-normal.0f86a30ca7e981fcfc99.woff2 delete mode 100644 frontend/deployed/static/media/roboto-latin-ext-400-normal.2bfbba2d51a85c8702dd.woff delete mode 100644 frontend/deployed/static/media/roboto-latin-ext-500-normal.8f02573e78730021ef49.woff2 delete mode 100644 frontend/deployed/static/media/roboto-latin-ext-500-normal.aecaab4c4da2bf91377a.woff delete mode 100644 frontend/deployed/static/media/roboto-latin-ext-700-normal.2d3c3ba6fe2d9c1026a5.woff delete mode 100644 frontend/deployed/static/media/roboto-latin-ext-700-normal.8e656eff240311c6050a.woff2 delete mode 100644 frontend/deployed/static/media/roboto-math-300-normal.90364ecfad5101ceb1a0.woff delete mode 100644 frontend/deployed/static/media/roboto-math-300-normal.acc9c7c1d1fe3a1c7d44.woff2 delete mode 100644 frontend/deployed/static/media/roboto-math-400-normal.3d3a272e5233c5fb1969.woff delete mode 100644 frontend/deployed/static/media/roboto-math-400-normal.b60d9fba1e21da7497e6.woff2 delete mode 100644 frontend/deployed/static/media/roboto-math-500-normal.41db483cb764343fca71.woff2 delete mode 100644 frontend/deployed/static/media/roboto-math-500-normal.c3014a611cd9d8fa6252.woff delete mode 100644 frontend/deployed/static/media/roboto-math-700-normal.a6fde3ddcb1629fd58b7.woff delete mode 100644 frontend/deployed/static/media/roboto-math-700-normal.f6f4b54add6ab9d60a0f.woff2 delete mode 100644 frontend/deployed/static/media/roboto-symbols-300-normal.52cdf8344b378f0c4580.woff delete mode 100644 frontend/deployed/static/media/roboto-symbols-300-normal.616638ec44336b3da884.woff2 delete mode 100644 frontend/deployed/static/media/roboto-symbols-400-normal.bb5b5d1459beb07bd3d5.woff2 delete mode 100644 frontend/deployed/static/media/roboto-symbols-400-normal.f4f7e3bd8264f1a640cb.woff delete mode 100644 frontend/deployed/static/media/roboto-symbols-500-normal.09b674875029289fd9a7.woff delete mode 100644 frontend/deployed/static/media/roboto-symbols-500-normal.a5457b0ec984fd4cc8da.woff2 delete mode 100644 frontend/deployed/static/media/roboto-symbols-700-normal.017e476ef02f62144169.woff delete mode 100644 frontend/deployed/static/media/roboto-symbols-700-normal.634070e045ac99822c21.woff2 delete mode 100644 frontend/deployed/static/media/roboto-vietnamese-300-normal.53f399e4522b647bafa7.woff delete mode 100644 frontend/deployed/static/media/roboto-vietnamese-300-normal.6f0bf63e956c09377ef8.woff2 delete mode 100644 frontend/deployed/static/media/roboto-vietnamese-400-normal.1cffe58e71a9109191a2.woff delete mode 100644 frontend/deployed/static/media/roboto-vietnamese-400-normal.b1b8baa94fbcaa57d098.woff2 delete mode 100644 frontend/deployed/static/media/roboto-vietnamese-500-normal.148734d63bd96c6e964f.woff2 delete mode 100644 frontend/deployed/static/media/roboto-vietnamese-500-normal.72dbf2a25dd55b80b137.woff delete mode 100644 frontend/deployed/static/media/roboto-vietnamese-700-normal.44a103f706f3ffe6a041.woff2 delete mode 100644 frontend/deployed/static/media/roboto-vietnamese-700-normal.fa58a041a3336692af1e.woff diff --git a/Dockerfile b/Dockerfile index d07414a..899189f 100644 --- a/Dockerfile +++ b/Dockerfile @@ -116,14 +116,12 @@ RUN { \ # Activate the pip environment on all shell calls SHELL [ "/opt/backstory/shell" ] -# From https://pytorch-extension.intel.com/installation?platform=gpu&version=v2.6.10%2Bxpu&os=linux%2Fwsl2&package=pip RUN pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/xpu -#RUN pip install intel-extension-for-pytorch==2.6.10+xpu oneccl_bind_pt==2.6.0+xpu --extra-index-url https://pytorch-extension.intel.com/release-whl/stable/xpu/us/ # From https://huggingface.co/docs/bitsandbytes/main/en/installation?backend=Intel+CPU+%2B+GPU#multi-backend RUN pip install "transformers>=4.45.1" -#RUN pip install 'https://github.com/bitsandbytes-foundation/bitsandbytes/releases/download/continuous-release_multi-backend-refactor/bitsandbytes-0.44.1.dev0-py3-none-manylinux_2_24_x86_64.whl' -RUN pip install 'https://github.com/bitsandbytes-foundation/bitsandbytes/releases/download/continuous-release_multi-backend-refactor/bitsandbytes-0.45.3.dev272-py3-none-manylinux_2_24_x86_64.whl' +# Note, if you don't want to reinstall BNBs dependencies, append the `--no-deps` flag! +#RUN pip install --force-reinstall 'https://github.com/bitsandbytes-foundation/bitsandbytes/releases/download/continuous-release_multi-backend-refactor/bitsandbytes-0.44.1.dev0-py3-none-manylinux_2_24_x86_64.whl' # Install ollama python module RUN pip install ollama langchain-ollama @@ -475,6 +473,10 @@ FROM ubuntu:oracular AS frontend # easy creation of an Android app as well as web app RUN apt-get update \ && DEBIAN_FRONTEND=noninteractive apt-get install -y \ + rsync \ + nano \ + wget \ + curl \ nodejs \ npm \ && apt-get clean \ diff --git a/chromadb-prod/.keep b/chromadb-prod/.keep deleted file mode 100644 index e69de29..0000000 diff --git a/docker-compose.yml b/docker-compose.yml index 3a050a2..5de9168 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -58,7 +58,7 @@ services: - ./chromadb-prod:/opt/backstory/chromadb:rw # Persist ChromaDB - ./sessions-prod:/opt/backstory/sessions:rw # Persist sessions - ./docs-prod:/opt/backstory/docs:rw # Live mount of RAG content - - ./frontend/deployed:/opt/backstory/deployed:ro # Live mount built frontend + - ./frontend/deployed:/opt/backstory/frontend/deployed:ro # Live mount built frontend cap_add: # used for running ze-monitor within container - CAP_DAC_READ_SEARCH # Bypass all filesystem read access checks - CAP_PERFMON # Access to perf_events (vs. overloaded CAP_SYS_ADMIN) diff --git a/frontend/.gitignore b/frontend/.gitignore index 3867a46..7418c6f 100644 --- a/frontend/.gitignore +++ b/frontend/.gitignore @@ -1,5 +1,6 @@ # See https://help.github.com/articles/ignoring-files/ for more about ignoring files. build +deployed # dependencies /node_modules diff --git a/frontend/deployed/adaptive-icon.png b/frontend/deployed/adaptive-icon.png deleted file mode 100755 index 03d6f6b6c6727954aec1d8206222769afd178d8d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17547 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

dU*>z19(a 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 KPy7G;A^aD?)@(We diff --git a/frontend/deployed/disable-jpk.png b/frontend/deployed/disable-jpk.png deleted file mode 100755 index 826227cb3d254dfc1a71c19ea4a6372fdddd29b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 4983 zcmeHLc~leU77vO*qkz>s7v$*}&>CctNiqpZOsGImphoim6|AU}$pog5g=9hkXjRl! zDs?GhU63jjH(XGtw1tXDP};gvA7YhKtpY^>Ma2d6eF>;|Ue9^Qb6)>5IkVmG-rslc z?=B~kOy%^c?sP9YjYe}150giNs}LN6-CV#qt|;pPxSU9fj-etk3uG|rHDnS2QK<$3 zBCMo_MzdblDt~paf(CWRf3~`DxGgJWh@W}c>iMH`{W6V1PGVcCMEBd9w$Aei4*y~} z{0##M%ZWI>{J4Bn7PQRuTe-)JT!@xX|SH@a7RQ}qwYY~$s}9WGgQZSk>5Y3WCxq2?n++~QL% zmu64DGOcF8z2J$a{U>U?wqBZ?cawsi(&Y5mT74;3Pop_4BSS)z;UOU}A_8&bE?OrG zt5Pyn%&3hB_47y>oLr;adMlr~y5O_WBIO18e#yr2d!Cz7Ulx0HMq*{T|5COmy~cMOTwo^r~U~`!SOeHRkH;0cVIW2jqr~1gow{d6IvgX&M?=v=B+jr4xU+sH~ zu^qb)s=u2q_=K@x?GzU#1678)3$K;5?uc32EN!_y#{6`ok@d&kjCHt^Ibm(w`wz!- z=k1@lIq&Wl%YAOmB7*$3NB3(u+q{K-tOG`hZl2z6T3zc3O)Z{t)XBqRX(o?2_@un7 z!lHZL&~mEX^>&ysStJb^2?{TT1O*nOm?pvXS~jNEs|dDLYXFr;qe@HbpieoGgh_8U z;zVc)p`(2ILa6bV_6D;t$q|kk=MYJR7O0xQuH4tQoEolBzO=AY5Kn3i4l6+RYnl|P zc}3Q1zS&nC;q-L`n7_n*P5VXc4rQRFP)Ou@+-!F*TrOkU_m`;kIH{I6ZgHVNq~U8s zFdv*@6hR1Bgdsv$9H8O~1q2?zNAW&T;W`tA>2Sgh1;E)Pz`;-+PaqWYV4P3^2uv)5 zMFfh%Y7r_FVFWG=;EVb|%rKImDzT)#UfH4407``Ocw7{C!^03BjH-A9jB!N-j0$lc z7C;F2`~bcKN{vgV=#5$oq?6QQ@dU@9i+3#836}&Z!(~h!8+j#BCSjBY7=Ruib!xrE z^lB-Z)Dlq?X6KU|fbs=Gp-3!7#Uei1-9-8rX2#ZTfSUYfQC|I6ehglN{BDv?O=P`+NG!q0l+CqZiJt3H|6hiIr z6JYf$;R%>7o&fWsw_sn$$-gKDp-RmYqGB8tse~YJVi689C>Fq691&`SJdp-P#jm5A z^cu>78Hu2Hz$4%a6sUtMXhLtQSg-3_5(s-90A(`h-0tPsW3aR>ER)Oyi( zZk%sBjHRcqPkJ2qLEGI;13%wj%}6l0eYX({+T=Uu2(2ig;KzyC@+-U9p<_PUKe;u!a7y7JD1Cx4z5Yn*40f#_m6n z>`Ym1&9KDMbQW>FDfWEO^D$Aoa}JJfc+%m_Iq~(H)JwpUIr#roK+xq;nvMp!MoSE~-J@!`63uHjf`Ikq|dez>ZAey*fBliqn^H?kOKX4mrR4XMd-ukk@05C - -A. I could; but I don't want to store your data. I also don't want to have to be on the hook for support of this service. I like it, it's fun, but it's not what I want as my day-gig, you know? If it was, I wouldn't be looking for a job... - -Q. - -A. Try it. See what you find out :) diff --git a/frontend/deployed/docs/resume-generation.md b/frontend/deployed/docs/resume-generation.md deleted file mode 100644 index 2ed3143..0000000 --- a/frontend/deployed/docs/resume-generation.md +++ /dev/null @@ -1,100 +0,0 @@ -The system follows a carefully designed pipeline with isolated stages to prevent fabrication: - -## System Architecture Overview - -The system uses a pipeline of isolated analysis and generation steps: - -1. **Stage 1: Isolated Analysis** (three sub-stages) - - **1A: Job Analysis** - Extracts requirements from job description only - - **1B: Candidate Analysis** - Catalogs qualifications from resume/context only - - **1C: Mapping Analysis** - Identifies legitimate matches between requirements and qualifications - -2. **Stage 2: Resume Generation** - - Uses mapping output to create a tailored resume with evidence-based content - -3. **Stage 3: Verification** - - Performs fact-checking to catch any remaining fabrications - -```mermaid -flowchart TD - subgraph "Stage 1: Isolated Analysis" - subgraph "Stage 1A: Job Analysis" - A1[Job Description Input] --> A2[Job Analysis LLM] - A2 --> A3[Job Requirements JSON] - end - - subgraph "Stage 1B: Candidate Analysis" - B1[Resume & Context Input] --> B2[Candidate Analysis LLM] - B2 --> B3[Candidate Qualifications JSON] - end - - subgraph "Stage 1C: Mapping Analysis" - C1[Job Requirements JSON] --> C2[Candidate Qualifications JSON] - C2 --> C3[Mapping Analysis LLM] - C3 --> C4[Skills Mapping JSON] - end - end - - subgraph "Stage 2: Resume Generation" - D1[Skills Mapping JSON] --> D2[Original Resume Reference] - D2 --> D3[Resume Generation LLM] - D3 --> D4[Tailored Resume Draft] - end - - subgraph "Stage 3: Verification" - E1[Skills Mapping JSON] --> E2[Original Materials] - E2 --> E3[Tailored Resume Draft] - E3 --> E4[Verification LLM] - E4 --> E5{Verification Check} - E5 -->|PASS| E6[Approved Resume] - E5 -->|FAIL| E7[Correction Instructions] - E7 --> D3 - end - - A3 --> C1 - B3 --> C2 - C4 --> D1 - D4 --> E3 - - style A2 fill:#f9d77e,stroke:#333,stroke-width:2px - style B2 fill:#f9d77e,stroke:#333,stroke-width:2px - style C3 fill:#f9d77e,stroke:#333,stroke-width:2px - style D3 fill:#f9d77e,stroke:#333,stroke-width:2px - style E4 fill:#f9d77e,stroke:#333,stroke-width:2px - style E5 fill:#a3e4d7,stroke:#333,stroke-width:2px - style E6 fill:#aed6f1,stroke:#333,stroke-width:2px - style E7 fill:#f5b7b1,stroke:#333,stroke-width:2px -``` - -## Stage 1: Isolated Analysis (three separate sub-stages) - -1. **Job Analysis**: Extracts requirements from just the job description -2. **Candidate Analysis**: Catalogs qualifications from just the resume/context -3. **Mapping Analysis**: Identifies legitimate matches between requirements and qualifications - -## Stage 2: Resume Generation - -Creates a tailored resume using only verified information from the mapping - -## Stage 3: Verification - -1. Performs fact-checking to catch any remaining fabrications -2. Corrects issues if needed and re-verifies - -### Key Anti-Fabrication Mechanisms - -The system uses several techniques to prevent fabrication: - -* **Isolation of Analysis Stages**: By analyzing the job and candidate separately, the system prevents the LLM from prematurely creating connections that might lead to fabrication. -* **Evidence Requirements**: Each qualification included must have explicit evidence from the original materials. -* **Conservative Transferability**: The system is instructed to be conservative when claiming skills are transferable. -* **Verification Layer**: A dedicated verification step acts as a safety check to catch any remaining fabrications. -* **Strict JSON Structures**: Using structured JSON formats ensures information flows properly between stages. - -## Implementation Details - -* **Prompt Engineering**: Each stage has carefully designed prompts with clear instructions and output formats. -* **Error Handling**: Comprehensive validation and error handling throughout the pipeline. -* **Correction Loop**: If verification fails, the system attempts to correct issues and re-verify. -* **Traceability**: Information in the final resume can be traced back to specific evidence in the original materials. - diff --git a/frontend/deployed/favicon.ico b/frontend/deployed/favicon.ico deleted file mode 100755 index b5e7fd69fcb945c3698afbc4a9f221642d0db21e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9662 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 diff --git a/frontend/deployed/favicon.png b/frontend/deployed/favicon.png deleted file mode 100755 index a3b4495ca6181a70ef7940300a29e7f90a187a2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 41223 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 AWdHyG diff --git a/frontend/deployed/icon.png b/frontend/deployed/icon.png deleted file mode 100755 index a0b1526fc7b78680fd8d733dbc6113e1af695487..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22380 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 diff --git a/frontend/deployed/index.html b/frontend/deployed/index.html deleted file mode 100644 index f8f57f6..0000000 --- a/frontend/deployed/index.html +++ /dev/null @@ -1 +0,0 @@ -Backstory

\ No newline at end of file diff --git a/frontend/deployed/logo.png b/frontend/deployed/logo.png deleted file mode 100755 index ae6209faa2bcf27999af8ddc568097f9633b45e5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1281730 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�=`Av6|gscY)k-A8Krx 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%0AkTWs;R4&r>&` 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 z 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%0D?=W2~=t?(2z``V@-xeKgtR549L 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 B4qyNP diff --git a/frontend/deployed/logo192.png b/frontend/deployed/logo192.png deleted file mode 100644 index 1b3f16874ddd9c2e1f233eda45d2f8714ec912cb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32353 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𝔩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

UPK5dxzh7qpV!9y7|j0O*_{F%oM0Z)yH@D_3OZ# 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

#82@!cBlteUNl`j{o^0XH5fyt<~xd!hjs6u>` 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%0Aqg}5-p;Iwwy0*9?Q ztvY_l4c{#uyf=??hwQ23Q-Z-l8d;HiRaooSUy5~|`_q1`iU>2+yG3vwEg=Wy8 z}d@m0ojLI zK;F9@Kkt7uYq-qCv`UpIQ-(pm*@s?*NxY)UIrhHX-PNrQ3PF;xh<1W8JmAcARs zd+XIxC0<1p3Xs=iN+Y$zJ`arc_hc zi2LHK0UiEq(L#4Vc>xZMllPrNec~Gov5Q%9n+or(wpicpQDFCW`H4&E6`WN=P7lwsQOVjNIhS_r>~F zA2rxI{jl>Lv9rUS4(qzjH(OalT*MY-1d{e`lZ?NK^hrzn?XpJPr_(-6sOt1Nbh{6% z2oATJ&E9sv(8CmyY2@y71u!4sIjvZ#QqC$kM$i;f9H@o!UqrBGTltS{PjtlFdiC^JgARRucH>E7 zgjuN5tBupu-h5un9{4KS+-W@n&Sa7^M^|M3n?wc;5T?BC!JoYUH)DH_O_F5lOKply zV!sCp85v-iNdiS88H&QA=;@pGj3bLYcv&+9Df z)2`aSci|TaO0~4V!at$4)ELaaYhwwh5}VqdI=ygbzW)!}AqtsLzK2N@0kPE7hM0fL zcM|kE>waHu4y0;XHse~pIX?Ff4D@|IYp<+&g|pmo}K6pe!UW` zt2bOH^+jC@x8>i-=|`y;njG4*UyDp;YsI}QqgY2EcRl5}haU4ETEN_L^O9aKwaeWJ zxuhZ$BksLFnY4~uiymt^B%=h2^2y?(3*n@7maZNBpDHFKNnQK+{CKGTVJS`8DxSC3 zW>L3W8RnmD3Fe(%igJGus~`1JV!p?#C&Y>Ah`F(t$0t`a94%nMnZo%`3039B}{h9hjC zUR98??tlen?k#^rgJ0|O3DZ#)gp~Xo2Lw##?~1=ZEm)LPb>kH z7Ag9Q95-CM{jVAFgp~x2jkP^1LGwVx8>f?P9{-C`I~V9^T0NJ~fSgp^Kihdz6$3hr z0l5J7iv}02TXt(rlJ->%!j*T=hF0`kJr!xbnVEJ4+R|6ZqK!3(s5A3^UM?0o7H#3; z)x$PC(Q05&R+NeuRNyjlo(w~{#3-lJg}+@_=%;C^?i^Oz5==T(WG`Jdu+K4INz7#p za^38I6~glzK|4%~q6Z@U8KAh`9!#vd=PZg%?~QjKPJqWOH#zFRxaSM^U!}*Sq9?dT zyLMqzB)A#b9c9uKU_rNk-saR`RK)i25(u+a=dV=R@Co0%)SG0>}IkjYG~Q|zq! zX{H%6WP_;T`fldJKyPXc;|_j4c1Nh!wHyo8RJvsJ2{3hV#SUu8c$vAnvCy7OOjjD6 zj_kg4eogs0noQj3;nNnwe^B97<$N6}8(`mJ0n�Z{we|1!><=4Vi?;K-*B+QPVkB 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 JS{d`u{|BCWauWam diff --git a/frontend/deployed/main-logo.png b/frontend/deployed/main-logo.png deleted file mode 100755 index ae5ddec4b63ae743b55ff7426434597ed3c5a45a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1248577 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�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ٺM9wiSM-Kblim$B}qV4`NW8{}) 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

c5pZuRRqQ_+{qY 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÷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

6(Uo1q3;mfYaw8n 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 g7Zes5Xj7^!Tr64)l8~I>@sxvEz0Vg~TwU;p z;*dIln#c}fVVUwylE;nzdhp4vL$Od*YH(?LT!!o^IweAiD>Q+%K86CwsJoS+l)g&3 zG&AeDv%YWXsaSr+F)JB=For4#V&E6p|U>;1z|vN9Ok2KAZ$UngxDNnA~^1 zqFnWhsNEZfla&2VjaKijN^>uuD{ac4890R|h&fSdk))LT&zNcKx54QlSjq76_kskPB?(HTV{gmjibkBmyKq`0b z$B4+y@mnUGbl-U~mSwZ~l?)8C)79<(a@M*0Wya)1h3gJcN0nFE=^hgztu4T4kkptE zwOy`LH!}u(3ua;qTNZcO2(|!fS;kIP?96jSk-kA0tHB3UW__dD23MXEBXR%&Th#&7 z2~3jX{D0@Zy_o568*?-`Xy@tA;Jl4P`}j8I!mGgUM*piP>B$|H`-JMEx%3GyaUuX6 z5~3YR$ozV8>BjD(VG@KYtUPHa=?pQAJUBRTk{k=Cbw70v28*psGTM5jPGC0PvB?&C zefY1acId5J{VBDJRyhjP*j2O>X?UU4RZKxAt_4xrX*O;DMieGQvj-Bkwx$HZK4G3F z;>i0WA~jE7Xdn~P3nV2IhJ}wttyBj7CmWcS@xO<8o0w^{IX=haQxmIxG%I@s;^`TA8A_BaKd?+ly<>F1W1HP5d;OdZyyjg+l;ln9n z{pea5_8?05m<7@Tx%~B&n%7tEHKMHrpCx`ckW#~zjFd(pnT?=V@7xrtF)~DK+F?v{ zovtI{G&mpxE~$aP+$~V$U|ziNxtfxn^h;Qi_qq5RDs=GyyvdGQ~=!3ktt<*ioh;_Au}Om zG`NWx*u`EJYGUa;tnde$sXAdYK>qUc4|Qh3=W=!6df`OEA@>Y)_9YB5h;I6@>SsfBY~QX%f_r%CZxXF z@n^^deo+6%KHf)D=cmT9mfgQP@e%HocJn0RK?>;|rA3v@oOJ14VZ`p@N;~i3tFI<> zzwceut9^i3pSV!C3!$52?T(HkZ|-H;wC=EZpQr}Ztj6&v3lq&}o7vM>D~(p3@kES< zTO>83R--o;lU*CCs;g??UXP6Mmql)%0AEeUo^>| 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 z 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

OG^bt6yG2??7FhdGVc8feK}syBta)V!iG4 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:100%}.Conversation{background-color:#f5f5f5;border:1px solid #e0e0e0;display:flex;flex-direction:column;flex-grow:1;font-size:.9rem;height:calc(100vh - 72px);margin:0 auto;overflow-y:auto;padding:10px;width:100%}.BackstoryTextField:disabled{opacity:.38}.BackstoryTextField::placeholder{color:#2e2e2e61}.BackstoryTextField:active,.BackstoryTextField:focus{outline:2px solid #000}.BackstoryTextField:hover:not(:active):not(:focus){outline:1px solid #000}.BackstoryTextField{border:none;outline:1px solid #2e2e2e61}.ResumeBuilder .JsonViewScrollable{border:1px solid orange;max-height:30rem!important;min-height:0!important;min-height:auto!important;overflow-x:auto!important}.Snack{display:flex}.App{overflow:hidden}div{box-sizing:border-box;overflow-wrap:break-word;word-break:break-word}.gl-container #scene{left:0!important;top:0!important}pre{border:3px solid #e0e0e0;box-sizing:border-box;max-height:100%;max-width:100%;overflow:auto;white-space:pre-wrap}button{overflow-wrap:normal;word-break:normal}.TabPanel{display:flex;height:100%}.MuiToolbar-root .MuiBox-root{border-bottom:none}.MuiTabs-root .MuiTabs-indicator{background-color:orange}.SystemInfo{display:flex;flex-direction:column;flex-grow:1;gap:5px;padding:5px}.SystemInfoItem{display:flex;flex-direction:row;flex-grow:1}.SystemInfoItem>div:first-child{display:flex;justify-self:end;width:10rem}.SystemInfoItem>div:last-child{display:flex;flex-grow:1;justify-self:end}.DocBox{margin:0 auto;max-width:2048px}.Controls,.DocBox{display:flex;flex-direction:column;flex-grow:1}.Controls{background-color:#f5f5f5;border:1px solid #e0e0e0;box-sizing:border-box;margin-left:10px;min-width:10rem;overflow-x:visible;overflow-y:auto;padding:10px}.MenuCard.MuiCard-root{background-color:#1a2536;border-radius:0;color:#d3cdbf;display:flex;flex-direction:column;flex-grow:1;min-width:10rem}.MenuCard.MuiCard-root button{min-height:64px}.MuiToolbar-root{min-height:72px!important;padding-left:16px!important;padding-right:16px!important}.ChatBox{background-color:#d3cdbf;display:flex;flex-direction:column;flex-grow:1;margin:0 auto;max-width:1024px;width:100%}.user-message.MuiCard-root{align-items:self-end;align-self:end;background-color:#dcf8c6;border:1px solid #b2e0a7;border-radius:.25rem;justify-self:right;margin-left:1rem;max-width:80%;min-width:80%}.About.MuiCard-root,.assistant-message.MuiCard-root,.user-message.MuiCard-root{color:#333;display:flex;flex-direction:column;flex-grow:0;margin-bottom:.75rem;overflow-wrap:break-word;white-space:pre-wrap;word-break:break-word}.About.MuiCard-root,.assistant-message.MuiCard-root{background-color:#fff;border:1px solid #e0e0e0;border-radius:.25rem;font-size:.9rem;justify-self:left;margin-right:1rem;min-width:70%;padding:16px 0}.About.MuiCard-root{display:flex;flex-grow:1;margin-left:0;margin-right:0;width:100%}.About .MuiCardContent-root,.assistant-message .MuiCardContent-root{font-size:.9rem;padding:0 16px!important}.About span,.assistant-message span{font-size:.9rem}.About .MuiCardContent-root:last-child,.assistant-message .MuiCardContent-root:last-child,.user-message .MuiCardContent-root:last-child{padding:16px}.users>div{padding:.25rem}.user-active{font-weight:700}.metadata{border:1px solid #e0e0e0;font-size:.75rem;padding:.125rem}* p.MuiTypography-root{font-size:.9rem;margin-bottom:.5rem;margin-top:.5rem}* h1.MuiTypography-root,* h2.MuiTypography-root,* h3.MuiTypography-root,* h4.MuiTypography-root,* h5.MuiTypography-root,* h6.MuiTypography-root{font-size:1rem;margin-bottom:.5rem;margin-top:1rem}* ol.MuiTypography-root,* ul.MuiTypography-root{font-size:.9rem;margin-bottom:.5rem;margin-top:.5rem}* li.MuiTypography-root{font-size:.9rem;margin-bottom:.25rem}* .MuiTypography-root li{font-size:.9rem;margin-bottom:0;margin-top:0;padding:0}* .MuiTypography-root pre{border:1px solid #f5f5f5;border-radius:.5rem;font-size:.9rem;margin-bottom:0;margin-top:0;padding:.5rem .75rem}.PromptStats .MuiTableCell-root{font-size:.8rem}#SystemPromptInput{font-size:.9rem;line-height:1.25rem}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:300;src:url(/static/media/roboto-cyrillic-ext-300-normal.b9d87b04a9119d8d2fdf.woff2) format("woff2"),url(/static/media/roboto-cyrillic-ext-300-normal.a80c0d0719b1acb8f731.woff) format("woff");unicode-range:u+0460-052f,u+1c80-1c8a,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:300;src:url(/static/media/roboto-cyrillic-300-normal.89d0351bce4bc857dba6.woff2) format("woff2"),url(/static/media/roboto-cyrillic-300-normal.44340549d94d10899346.woff) format("woff");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:300;src:url(/static/media/roboto-greek-ext-300-normal.a88b77bb10633a8045e3.woff2) format("woff2"),url(/static/media/roboto-greek-ext-300-normal.60729cafbded24073dfb.woff) format("woff");unicode-range:u+1f??}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:300;src:url(/static/media/roboto-greek-300-normal.fdd1f928a606aa116a44.woff2) format("woff2"),url(/static/media/roboto-greek-300-normal.8300b541aa89b8301a6f.woff) format("woff");unicode-range:u+0370-0377,u+037a-037f,u+0384-038a,u+038c,u+038e-03a1,u+03a3-03ff}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:300;src:url(/static/media/roboto-math-300-normal.acc9c7c1d1fe3a1c7d44.woff2) format("woff2"),url(/static/media/roboto-math-300-normal.90364ecfad5101ceb1a0.woff) format("woff");unicode-range:u+0302-0303,u+0305,u+0307-0308,u+0310,u+0312,u+0315,u+031a,u+0326-0327,u+032c,u+032f-0330,u+0332-0333,u+0338,u+033a,u+0346,u+034d,u+0391-03a1,u+03a3-03a9,u+03b1-03c9,u+03d1,u+03d5-03d6,u+03f0-03f1,u+03f4-03f5,u+2016-2017,u+2034-2038,u+203c,u+2040,u+2043,u+2047,u+2050,u+2057,u+205f,u+2070-2071,u+2074-208e,u+2090-209c,u+20d0-20dc,u+20e1,u+20e5-20ef,u+2100-2112,u+2114-2115,u+2117-2121,u+2123-214f,u+2190,u+2192,u+2194-21ae,u+21b0-21e5,u+21f1-21f2,u+21f4-2211,u+2213-2214,u+2216-22ff,u+2308-230b,u+2310,u+2319,u+231c-2321,u+2336-237a,u+237c,u+2395,u+239b-23b7,u+23d0,u+23dc-23e1,u+2474-2475,u+25af,u+25b3,u+25b7,u+25bd,u+25c1,u+25ca,u+25cc,u+25fb,u+266d-266f,u+27c0-27ff,u+2900-2aff,u+2b0e-2b11,u+2b30-2b4c,u+2bfe,u+3030,u+ff5b,u+ff5d,u+1d400-1d7ff,u+1ee??}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:300;src:url(/static/media/roboto-symbols-300-normal.616638ec44336b3da884.woff2) format("woff2"),url(/static/media/roboto-symbols-300-normal.52cdf8344b378f0c4580.woff) format("woff");unicode-range:u+0001-000c,u+000e-001f,u+007f-009f,u+20dd-20e0,u+20e2-20e4,u+2150-218f,u+2190,u+2192,u+2194-2199,u+21af,u+21e6-21f0,u+21f3,u+2218-2219,u+2299,u+22c4-22c6,u+2300-243f,u+2440-244a,u+2460-24ff,u+25a0-27bf,u+28??,u+2921-2922,u+2981,u+29bf,u+29eb,u+2b??,u+4dc0-4dff,u+fff9-fffb,u+10140-1018e,u+10190-1019c,u+101a0,u+101d0-101fd,u+102e0-102fb,u+10e60-10e7e,u+1d2c0-1d2d3,u+1d2e0-1d37f,u+1f0??,u+1f100-1f1ad,u+1f1e6-1f1ff,u+1f30d-1f30f,u+1f315,u+1f31c,u+1f31e,u+1f320-1f32c,u+1f336,u+1f378,u+1f37d,u+1f382,u+1f393-1f39f,u+1f3a7-1f3a8,u+1f3ac-1f3af,u+1f3c2,u+1f3c4-1f3c6,u+1f3ca-1f3ce,u+1f3d4-1f3e0,u+1f3ed,u+1f3f1-1f3f3,u+1f3f5-1f3f7,u+1f408,u+1f415,u+1f41f,u+1f426,u+1f43f,u+1f441-1f442,u+1f444,u+1f446-1f449,u+1f44c-1f44e,u+1f453,u+1f46a,u+1f47d,u+1f4a3,u+1f4b0,u+1f4b3,u+1f4b9,u+1f4bb,u+1f4bf,u+1f4c8-1f4cb,u+1f4d6,u+1f4da,u+1f4df,u+1f4e3-1f4e6,u+1f4ea-1f4ed,u+1f4f7,u+1f4f9-1f4fb,u+1f4fd-1f4fe,u+1f503,u+1f507-1f50b,u+1f50d,u+1f512-1f513,u+1f53e-1f54a,u+1f54f-1f5fa,u+1f610,u+1f650-1f67f,u+1f687,u+1f68d,u+1f691,u+1f694,u+1f698,u+1f6ad,u+1f6b2,u+1f6b9-1f6ba,u+1f6bc,u+1f6c6-1f6cf,u+1f6d3-1f6d7,u+1f6e0-1f6ea,u+1f6f0-1f6f3,u+1f6f7-1f6fc,u+1f7??,u+1f800-1f80b,u+1f810-1f847,u+1f850-1f859,u+1f860-1f887,u+1f890-1f8ad,u+1f8b0-1f8bb,u+1f8c0-1f8c1,u+1f900-1f90b,u+1f93b,u+1f946,u+1f984,u+1f996,u+1f9e9,u+1fa00-1fa6f,u+1fa70-1fa7c,u+1fa80-1fa89,u+1fa8f-1fac6,u+1face-1fadc,u+1fadf-1fae9,u+1faf0-1faf8,u+1fb??}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:300;src:url(/static/media/roboto-vietnamese-300-normal.6f0bf63e956c09377ef8.woff2) format("woff2"),url(/static/media/roboto-vietnamese-300-normal.53f399e4522b647bafa7.woff) format("woff");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:300;src:url(/static/media/roboto-latin-ext-300-normal.948c05192b1e64d931b1.woff2) format("woff2"),url(/static/media/roboto-latin-ext-300-normal.6ddd1cfdbc5e74bcdab8.woff) format("woff");unicode-range:u+0100-02ba,u+02bd-02c5,u+02c7-02cc,u+02ce-02d7,u+02dd-02ff,u+0304,u+0308,u+0329,u+1d00-1dbf,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20c0,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:300;src:url(/static/media/roboto-latin-300-normal.db56943a88e4852343ae.woff2) format("woff2"),url(/static/media/roboto-latin-300-normal.cb14f8e80cc69ddbac34.woff) format("woff");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:url(/static/media/roboto-cyrillic-ext-400-normal.31476620b88eec076438.woff2) format("woff2"),url(/static/media/roboto-cyrillic-ext-400-normal.5e3f232f89080810567d.woff) format("woff");unicode-range:u+0460-052f,u+1c80-1c8a,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:url(/static/media/roboto-cyrillic-400-normal.86d5c52f4588f9f221d7.woff2) format("woff2"),url(/static/media/roboto-cyrillic-400-normal.d67ac585bb6a05dbf71c.woff) format("woff");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:url(/static/media/roboto-greek-ext-400-normal.2d5875b032a1cca91eb2.woff2) format("woff2"),url(/static/media/roboto-greek-ext-400-normal.a0baf7d6726d8f751a27.woff) format("woff");unicode-range:u+1f??}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:url(/static/media/roboto-greek-400-normal.98a717d5a38e77c0f657.woff2) format("woff2"),url(/static/media/roboto-greek-400-normal.ecd8572d631f20ff5bd5.woff) format("woff");unicode-range:u+0370-0377,u+037a-037f,u+0384-038a,u+038c,u+038e-03a1,u+03a3-03ff}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:url(/static/media/roboto-math-400-normal.b60d9fba1e21da7497e6.woff2) format("woff2"),url(/static/media/roboto-math-400-normal.3d3a272e5233c5fb1969.woff) format("woff");unicode-range:u+0302-0303,u+0305,u+0307-0308,u+0310,u+0312,u+0315,u+031a,u+0326-0327,u+032c,u+032f-0330,u+0332-0333,u+0338,u+033a,u+0346,u+034d,u+0391-03a1,u+03a3-03a9,u+03b1-03c9,u+03d1,u+03d5-03d6,u+03f0-03f1,u+03f4-03f5,u+2016-2017,u+2034-2038,u+203c,u+2040,u+2043,u+2047,u+2050,u+2057,u+205f,u+2070-2071,u+2074-208e,u+2090-209c,u+20d0-20dc,u+20e1,u+20e5-20ef,u+2100-2112,u+2114-2115,u+2117-2121,u+2123-214f,u+2190,u+2192,u+2194-21ae,u+21b0-21e5,u+21f1-21f2,u+21f4-2211,u+2213-2214,u+2216-22ff,u+2308-230b,u+2310,u+2319,u+231c-2321,u+2336-237a,u+237c,u+2395,u+239b-23b7,u+23d0,u+23dc-23e1,u+2474-2475,u+25af,u+25b3,u+25b7,u+25bd,u+25c1,u+25ca,u+25cc,u+25fb,u+266d-266f,u+27c0-27ff,u+2900-2aff,u+2b0e-2b11,u+2b30-2b4c,u+2bfe,u+3030,u+ff5b,u+ff5d,u+1d400-1d7ff,u+1ee??}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:url(/static/media/roboto-symbols-400-normal.bb5b5d1459beb07bd3d5.woff2) format("woff2"),url(/static/media/roboto-symbols-400-normal.f4f7e3bd8264f1a640cb.woff) format("woff");unicode-range:u+0001-000c,u+000e-001f,u+007f-009f,u+20dd-20e0,u+20e2-20e4,u+2150-218f,u+2190,u+2192,u+2194-2199,u+21af,u+21e6-21f0,u+21f3,u+2218-2219,u+2299,u+22c4-22c6,u+2300-243f,u+2440-244a,u+2460-24ff,u+25a0-27bf,u+28??,u+2921-2922,u+2981,u+29bf,u+29eb,u+2b??,u+4dc0-4dff,u+fff9-fffb,u+10140-1018e,u+10190-1019c,u+101a0,u+101d0-101fd,u+102e0-102fb,u+10e60-10e7e,u+1d2c0-1d2d3,u+1d2e0-1d37f,u+1f0??,u+1f100-1f1ad,u+1f1e6-1f1ff,u+1f30d-1f30f,u+1f315,u+1f31c,u+1f31e,u+1f320-1f32c,u+1f336,u+1f378,u+1f37d,u+1f382,u+1f393-1f39f,u+1f3a7-1f3a8,u+1f3ac-1f3af,u+1f3c2,u+1f3c4-1f3c6,u+1f3ca-1f3ce,u+1f3d4-1f3e0,u+1f3ed,u+1f3f1-1f3f3,u+1f3f5-1f3f7,u+1f408,u+1f415,u+1f41f,u+1f426,u+1f43f,u+1f441-1f442,u+1f444,u+1f446-1f449,u+1f44c-1f44e,u+1f453,u+1f46a,u+1f47d,u+1f4a3,u+1f4b0,u+1f4b3,u+1f4b9,u+1f4bb,u+1f4bf,u+1f4c8-1f4cb,u+1f4d6,u+1f4da,u+1f4df,u+1f4e3-1f4e6,u+1f4ea-1f4ed,u+1f4f7,u+1f4f9-1f4fb,u+1f4fd-1f4fe,u+1f503,u+1f507-1f50b,u+1f50d,u+1f512-1f513,u+1f53e-1f54a,u+1f54f-1f5fa,u+1f610,u+1f650-1f67f,u+1f687,u+1f68d,u+1f691,u+1f694,u+1f698,u+1f6ad,u+1f6b2,u+1f6b9-1f6ba,u+1f6bc,u+1f6c6-1f6cf,u+1f6d3-1f6d7,u+1f6e0-1f6ea,u+1f6f0-1f6f3,u+1f6f7-1f6fc,u+1f7??,u+1f800-1f80b,u+1f810-1f847,u+1f850-1f859,u+1f860-1f887,u+1f890-1f8ad,u+1f8b0-1f8bb,u+1f8c0-1f8c1,u+1f900-1f90b,u+1f93b,u+1f946,u+1f984,u+1f996,u+1f9e9,u+1fa00-1fa6f,u+1fa70-1fa7c,u+1fa80-1fa89,u+1fa8f-1fac6,u+1face-1fadc,u+1fadf-1fae9,u+1faf0-1faf8,u+1fb??}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:url(/static/media/roboto-vietnamese-400-normal.b1b8baa94fbcaa57d098.woff2) format("woff2"),url(/static/media/roboto-vietnamese-400-normal.1cffe58e71a9109191a2.woff) format("woff");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:url(/static/media/roboto-latin-ext-400-normal.0f86a30ca7e981fcfc99.woff2) format("woff2"),url(/static/media/roboto-latin-ext-400-normal.2bfbba2d51a85c8702dd.woff) format("woff");unicode-range:u+0100-02ba,u+02bd-02c5,u+02c7-02cc,u+02ce-02d7,u+02dd-02ff,u+0304,u+0308,u+0329,u+1d00-1dbf,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20c0,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:400;src:url(/static/media/roboto-latin-400-normal.df1be0be92f6f19b8115.woff2) format("woff2"),url(/static/media/roboto-latin-400-normal.50a0a61e29c19a2f05cb.woff) format("woff");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:url(/static/media/roboto-cyrillic-ext-500-normal.634ee2238bf30f362d52.woff2) format("woff2"),url(/static/media/roboto-cyrillic-ext-500-normal.d6c661248da2fde17768.woff) format("woff");unicode-range:u+0460-052f,u+1c80-1c8a,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:url(/static/media/roboto-cyrillic-500-normal.1fb2c6d685bfb888cfa3.woff2) format("woff2"),url(/static/media/roboto-cyrillic-500-normal.36f79cc7e73a69da4438.woff) format("woff");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:url(/static/media/roboto-greek-ext-500-normal.bef9c15c7164d6435aad.woff2) format("woff2"),url(/static/media/roboto-greek-ext-500-normal.1964239c2800b6bd7e39.woff) format("woff");unicode-range:u+1f??}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:url(/static/media/roboto-greek-500-normal.5c8100481d4e784afbf2.woff2) format("woff2"),url(/static/media/roboto-greek-500-normal.4fe733bc436afc295c24.woff) format("woff");unicode-range:u+0370-0377,u+037a-037f,u+0384-038a,u+038c,u+038e-03a1,u+03a3-03ff}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:url(/static/media/roboto-math-500-normal.41db483cb764343fca71.woff2) format("woff2"),url(/static/media/roboto-math-500-normal.c3014a611cd9d8fa6252.woff) format("woff");unicode-range:u+0302-0303,u+0305,u+0307-0308,u+0310,u+0312,u+0315,u+031a,u+0326-0327,u+032c,u+032f-0330,u+0332-0333,u+0338,u+033a,u+0346,u+034d,u+0391-03a1,u+03a3-03a9,u+03b1-03c9,u+03d1,u+03d5-03d6,u+03f0-03f1,u+03f4-03f5,u+2016-2017,u+2034-2038,u+203c,u+2040,u+2043,u+2047,u+2050,u+2057,u+205f,u+2070-2071,u+2074-208e,u+2090-209c,u+20d0-20dc,u+20e1,u+20e5-20ef,u+2100-2112,u+2114-2115,u+2117-2121,u+2123-214f,u+2190,u+2192,u+2194-21ae,u+21b0-21e5,u+21f1-21f2,u+21f4-2211,u+2213-2214,u+2216-22ff,u+2308-230b,u+2310,u+2319,u+231c-2321,u+2336-237a,u+237c,u+2395,u+239b-23b7,u+23d0,u+23dc-23e1,u+2474-2475,u+25af,u+25b3,u+25b7,u+25bd,u+25c1,u+25ca,u+25cc,u+25fb,u+266d-266f,u+27c0-27ff,u+2900-2aff,u+2b0e-2b11,u+2b30-2b4c,u+2bfe,u+3030,u+ff5b,u+ff5d,u+1d400-1d7ff,u+1ee??}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:url(/static/media/roboto-symbols-500-normal.a5457b0ec984fd4cc8da.woff2) format("woff2"),url(/static/media/roboto-symbols-500-normal.09b674875029289fd9a7.woff) format("woff");unicode-range:u+0001-000c,u+000e-001f,u+007f-009f,u+20dd-20e0,u+20e2-20e4,u+2150-218f,u+2190,u+2192,u+2194-2199,u+21af,u+21e6-21f0,u+21f3,u+2218-2219,u+2299,u+22c4-22c6,u+2300-243f,u+2440-244a,u+2460-24ff,u+25a0-27bf,u+28??,u+2921-2922,u+2981,u+29bf,u+29eb,u+2b??,u+4dc0-4dff,u+fff9-fffb,u+10140-1018e,u+10190-1019c,u+101a0,u+101d0-101fd,u+102e0-102fb,u+10e60-10e7e,u+1d2c0-1d2d3,u+1d2e0-1d37f,u+1f0??,u+1f100-1f1ad,u+1f1e6-1f1ff,u+1f30d-1f30f,u+1f315,u+1f31c,u+1f31e,u+1f320-1f32c,u+1f336,u+1f378,u+1f37d,u+1f382,u+1f393-1f39f,u+1f3a7-1f3a8,u+1f3ac-1f3af,u+1f3c2,u+1f3c4-1f3c6,u+1f3ca-1f3ce,u+1f3d4-1f3e0,u+1f3ed,u+1f3f1-1f3f3,u+1f3f5-1f3f7,u+1f408,u+1f415,u+1f41f,u+1f426,u+1f43f,u+1f441-1f442,u+1f444,u+1f446-1f449,u+1f44c-1f44e,u+1f453,u+1f46a,u+1f47d,u+1f4a3,u+1f4b0,u+1f4b3,u+1f4b9,u+1f4bb,u+1f4bf,u+1f4c8-1f4cb,u+1f4d6,u+1f4da,u+1f4df,u+1f4e3-1f4e6,u+1f4ea-1f4ed,u+1f4f7,u+1f4f9-1f4fb,u+1f4fd-1f4fe,u+1f503,u+1f507-1f50b,u+1f50d,u+1f512-1f513,u+1f53e-1f54a,u+1f54f-1f5fa,u+1f610,u+1f650-1f67f,u+1f687,u+1f68d,u+1f691,u+1f694,u+1f698,u+1f6ad,u+1f6b2,u+1f6b9-1f6ba,u+1f6bc,u+1f6c6-1f6cf,u+1f6d3-1f6d7,u+1f6e0-1f6ea,u+1f6f0-1f6f3,u+1f6f7-1f6fc,u+1f7??,u+1f800-1f80b,u+1f810-1f847,u+1f850-1f859,u+1f860-1f887,u+1f890-1f8ad,u+1f8b0-1f8bb,u+1f8c0-1f8c1,u+1f900-1f90b,u+1f93b,u+1f946,u+1f984,u+1f996,u+1f9e9,u+1fa00-1fa6f,u+1fa70-1fa7c,u+1fa80-1fa89,u+1fa8f-1fac6,u+1face-1fadc,u+1fadf-1fae9,u+1faf0-1faf8,u+1fb??}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:url(/static/media/roboto-vietnamese-500-normal.148734d63bd96c6e964f.woff2) format("woff2"),url(/static/media/roboto-vietnamese-500-normal.72dbf2a25dd55b80b137.woff) format("woff");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:url(/static/media/roboto-latin-ext-500-normal.8f02573e78730021ef49.woff2) format("woff2"),url(/static/media/roboto-latin-ext-500-normal.aecaab4c4da2bf91377a.woff) format("woff");unicode-range:u+0100-02ba,u+02bd-02c5,u+02c7-02cc,u+02ce-02d7,u+02dd-02ff,u+0304,u+0308,u+0329,u+1d00-1dbf,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20c0,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:500;src:url(/static/media/roboto-latin-500-normal.599f66a60bdf974e578e.woff2) format("woff2"),url(/static/media/roboto-latin-500-normal.c320def131b39bceabd8.woff) format("woff");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:700;src:url(/static/media/roboto-cyrillic-ext-700-normal.361cdfd3a3f9c4bb09ca.woff2) format("woff2"),url(/static/media/roboto-cyrillic-ext-700-normal.6b08bc756cd72f5af9e8.woff) format("woff");unicode-range:u+0460-052f,u+1c80-1c8a,u+20b4,u+2de0-2dff,u+a640-a69f,u+fe2e-fe2f}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:700;src:url(/static/media/roboto-cyrillic-700-normal.fd3dfdd6cb1a9175b63d.woff2) format("woff2"),url(/static/media/roboto-cyrillic-700-normal.e00802373a2c2db6b30d.woff) format("woff");unicode-range:u+0301,u+0400-045f,u+0490-0491,u+04b0-04b1,u+2116}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:700;src:url(/static/media/roboto-greek-ext-700-normal.eb28a447335ba6d54fcb.woff2) format("woff2"),url(/static/media/roboto-greek-ext-700-normal.1aff9f4cd71608489b9a.woff) format("woff");unicode-range:u+1f??}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:700;src:url(/static/media/roboto-greek-700-normal.d7dfd0b02cd8311e2a97.woff2) format("woff2"),url(/static/media/roboto-greek-700-normal.d23e03cf87ba44e5af6f.woff) format("woff");unicode-range:u+0370-0377,u+037a-037f,u+0384-038a,u+038c,u+038e-03a1,u+03a3-03ff}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:700;src:url(/static/media/roboto-math-700-normal.f6f4b54add6ab9d60a0f.woff2) format("woff2"),url(/static/media/roboto-math-700-normal.a6fde3ddcb1629fd58b7.woff) format("woff");unicode-range:u+0302-0303,u+0305,u+0307-0308,u+0310,u+0312,u+0315,u+031a,u+0326-0327,u+032c,u+032f-0330,u+0332-0333,u+0338,u+033a,u+0346,u+034d,u+0391-03a1,u+03a3-03a9,u+03b1-03c9,u+03d1,u+03d5-03d6,u+03f0-03f1,u+03f4-03f5,u+2016-2017,u+2034-2038,u+203c,u+2040,u+2043,u+2047,u+2050,u+2057,u+205f,u+2070-2071,u+2074-208e,u+2090-209c,u+20d0-20dc,u+20e1,u+20e5-20ef,u+2100-2112,u+2114-2115,u+2117-2121,u+2123-214f,u+2190,u+2192,u+2194-21ae,u+21b0-21e5,u+21f1-21f2,u+21f4-2211,u+2213-2214,u+2216-22ff,u+2308-230b,u+2310,u+2319,u+231c-2321,u+2336-237a,u+237c,u+2395,u+239b-23b7,u+23d0,u+23dc-23e1,u+2474-2475,u+25af,u+25b3,u+25b7,u+25bd,u+25c1,u+25ca,u+25cc,u+25fb,u+266d-266f,u+27c0-27ff,u+2900-2aff,u+2b0e-2b11,u+2b30-2b4c,u+2bfe,u+3030,u+ff5b,u+ff5d,u+1d400-1d7ff,u+1ee??}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:700;src:url(/static/media/roboto-symbols-700-normal.634070e045ac99822c21.woff2) format("woff2"),url(/static/media/roboto-symbols-700-normal.017e476ef02f62144169.woff) format("woff");unicode-range:u+0001-000c,u+000e-001f,u+007f-009f,u+20dd-20e0,u+20e2-20e4,u+2150-218f,u+2190,u+2192,u+2194-2199,u+21af,u+21e6-21f0,u+21f3,u+2218-2219,u+2299,u+22c4-22c6,u+2300-243f,u+2440-244a,u+2460-24ff,u+25a0-27bf,u+28??,u+2921-2922,u+2981,u+29bf,u+29eb,u+2b??,u+4dc0-4dff,u+fff9-fffb,u+10140-1018e,u+10190-1019c,u+101a0,u+101d0-101fd,u+102e0-102fb,u+10e60-10e7e,u+1d2c0-1d2d3,u+1d2e0-1d37f,u+1f0??,u+1f100-1f1ad,u+1f1e6-1f1ff,u+1f30d-1f30f,u+1f315,u+1f31c,u+1f31e,u+1f320-1f32c,u+1f336,u+1f378,u+1f37d,u+1f382,u+1f393-1f39f,u+1f3a7-1f3a8,u+1f3ac-1f3af,u+1f3c2,u+1f3c4-1f3c6,u+1f3ca-1f3ce,u+1f3d4-1f3e0,u+1f3ed,u+1f3f1-1f3f3,u+1f3f5-1f3f7,u+1f408,u+1f415,u+1f41f,u+1f426,u+1f43f,u+1f441-1f442,u+1f444,u+1f446-1f449,u+1f44c-1f44e,u+1f453,u+1f46a,u+1f47d,u+1f4a3,u+1f4b0,u+1f4b3,u+1f4b9,u+1f4bb,u+1f4bf,u+1f4c8-1f4cb,u+1f4d6,u+1f4da,u+1f4df,u+1f4e3-1f4e6,u+1f4ea-1f4ed,u+1f4f7,u+1f4f9-1f4fb,u+1f4fd-1f4fe,u+1f503,u+1f507-1f50b,u+1f50d,u+1f512-1f513,u+1f53e-1f54a,u+1f54f-1f5fa,u+1f610,u+1f650-1f67f,u+1f687,u+1f68d,u+1f691,u+1f694,u+1f698,u+1f6ad,u+1f6b2,u+1f6b9-1f6ba,u+1f6bc,u+1f6c6-1f6cf,u+1f6d3-1f6d7,u+1f6e0-1f6ea,u+1f6f0-1f6f3,u+1f6f7-1f6fc,u+1f7??,u+1f800-1f80b,u+1f810-1f847,u+1f850-1f859,u+1f860-1f887,u+1f890-1f8ad,u+1f8b0-1f8bb,u+1f8c0-1f8c1,u+1f900-1f90b,u+1f93b,u+1f946,u+1f984,u+1f996,u+1f9e9,u+1fa00-1fa6f,u+1fa70-1fa7c,u+1fa80-1fa89,u+1fa8f-1fac6,u+1face-1fadc,u+1fadf-1fae9,u+1faf0-1faf8,u+1fb??}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:700;src:url(/static/media/roboto-vietnamese-700-normal.44a103f706f3ffe6a041.woff2) format("woff2"),url(/static/media/roboto-vietnamese-700-normal.fa58a041a3336692af1e.woff) format("woff");unicode-range:u+0102-0103,u+0110-0111,u+0128-0129,u+0168-0169,u+01a0-01a1,u+01af-01b0,u+0300-0301,u+0303-0304,u+0308-0309,u+0323,u+0329,u+1ea0-1ef9,u+20ab}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:700;src:url(/static/media/roboto-latin-ext-700-normal.8e656eff240311c6050a.woff2) format("woff2"),url(/static/media/roboto-latin-ext-700-normal.2d3c3ba6fe2d9c1026a5.woff) format("woff");unicode-range:u+0100-02ba,u+02bd-02c5,u+02c7-02cc,u+02ce-02d7,u+02dd-02ff,u+0304,u+0308,u+0329,u+1d00-1dbf,u+1e00-1e9f,u+1ef2-1eff,u+2020,u+20a0-20ab,u+20ad-20c0,u+2113,u+2c60-2c7f,u+a720-a7ff}@font-face{font-display:swap;font-family:Roboto;font-style:normal;font-weight:700;src:url(/static/media/roboto-latin-700-normal.c4d6cab43bec89049809.woff2) format("woff2"),url(/static/media/roboto-latin-700-normal.bcfbe8accc968a375a8e.woff) format("woff");unicode-range:u+00??,u+0131,u+0152-0153,u+02bb-02bc,u+02c6,u+02da,u+02dc,u+0304,u+0308,u+0329,u+2000-206f,u+20ac,u+2122,u+2191,u+2193,u+2212,u+2215,u+feff,u+fffd} -/*# sourceMappingURL=main.3c3ddc39.css.map*/ \ No newline at end of file diff --git a/frontend/deployed/static/css/main.3c3ddc39.css.map b/frontend/deployed/static/css/main.3c3ddc39.css.map deleted file mode 100644 index 93f69bd..0000000 --- a/frontend/deployed/static/css/main.3c3ddc39.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"static/css/main.3c3ddc39.css","mappings":"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","sources":["index.css","StyledMarkdown.css","Conversation.css","BackstoryTextField.css","ResumeBuilder.css","Snack.css","App.css","../node_modules/@fontsource/roboto/300.css","../node_modules/@fontsource/roboto/400.css","../node_modules/@fontsource/roboto/500.css","../node_modules/@fontsource/roboto/700.css"],"sourcesContent":["body {\n margin: 0;\n font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', 'Roboto', 'Oxygen',\n 'Ubuntu', 'Cantarell', 'Fira Sans', 'Droid Sans', 'Helvetica Neue',\n sans-serif;\n -webkit-font-smoothing: antialiased;\n -moz-osx-font-smoothing: grayscale;\n padding: 0;\n height: 100dvh;\n overflow: hidden;\n}\n\ncode {\n font-family: source-code-pro, Menlo, Monaco, Consolas, 'Courier New',\n monospace;\n}\n","pre:not(.MessageContent) {\n overflow: initial;\n max-height: initial;\n}\n\n.MessageContent pre {\n border: none;\n border-left: 1px solid white;\n padding-left: 1rem;\n height: fit-content; /* Natural height */\n font-family: monospace; /* Ensure monospace font */\n display: flex;\n flex-grow: 1;\n overflow: visible;\n}\n\n.MuiMarkdown > div {\n width: 100%;\n}","\n.Conversation {\n display: flex;\n background-color: #F5F5F5;\n border: 1px solid #E0E0E0;\n flex-grow: 1;\n padding: 10px;\n flex-direction: column;\n font-size: 0.9rem;\n width: 100%;\n margin: 0 auto;\n overflow-y: auto;\n height: calc(100vh - 72px);\n}\n","\n.BackstoryTextField:disabled {\n opacity: 0.38;\n}\n\n/* .BackstoryTextField:not(:active):not(:focus):not(:hover) {\n} */\n\n.BackstoryTextField::placeholder {\n color: rgba(46, 46, 46, 0.38);\n}\n\n.BackstoryTextField:focus,\n.BackstoryTextField:active {\n outline: 2px solid black;\n}\n\n.BackstoryTextField:hover:not(:active):not(:focus) {\n outline: 1px solid black;\n}\n\n.BackstoryTextField {\n outline: 1px solid rgba(46, 46, 46, 0.38);\n border: none;\n}",".ResumeBuilder .JsonViewScrollable {\n min-height: unset !important;\n max-height: 30rem !important;\n border: 1px solid orange;\n overflow-x: auto !important;\n}",".Snack {\n display: flex;\n}",".App {\n overflow: hidden;\n}\n\ndiv {\n box-sizing: border-box;\n overflow-wrap: break-word;\n word-break: break-word;\n}\n\n.gl-container #scene {\n top: 0px !important;\n left: 0px !important;\n}\n\npre {\n max-width: 100%;\n max-height: 100%;\n overflow: auto;\n white-space: pre-wrap;\n box-sizing: border-box;\n border: 3px solid #E0E0E0;\n}\n\nbutton {\n overflow-wrap: initial;\n word-break: initial;\n}\n\n.TabPanel {\n display: flex;\n height: 100%;\n}\n\n.MuiToolbar-root .MuiBox-root {\n border-bottom: none;\n}\n\n.MuiTabs-root .MuiTabs-indicator {\n background-color: orange;\n}\n\n.SystemInfo {\n display: flex;\n flex-direction: column;\n gap: 5px;\n padding: 5px;\n flex-grow: 1;\n}\n\n.SystemInfoItem {\n display: flex; /* Grid for individual items */\n flex-direction: row;\n flex-grow: 1;\n}\n\n.SystemInfoItem > div:first-child {\n display: flex;\n justify-self: end; /* Align the first column content to the right */\n width: 10rem;\n}\n\n.SystemInfoItem > div:last-child {\n display: flex;\n flex-grow: 1;\n justify-self: end; /* Align the first column content to the right */\n}\n\n.DocBox {\n display: flex;\n flex-direction: column;\n flex-grow: 1;\n max-width: 2048px;\n margin: 0 auto;\n}\n\n.Controls {\n display: flex;\n background-color: #F5F5F5;\n border: 1px solid #E0E0E0;\n overflow-y: auto;\n padding: 10px;\n flex-direction: column;\n margin-left: 10px;\n box-sizing: border-box;\n overflow-x: visible;\n min-width: 10rem;\n flex-grow: 1;\n}\n\n.MenuCard.MuiCard-root {\n display: flex;\n flex-direction: column;\n min-width: 10rem;\n flex-grow: 1;\n background-color: #1A2536; /* Midnight Blue */\n color: #D3CDBF; /* Warm Gray */\n border-radius: 0;\n}\n\n.MenuCard.MuiCard-root button {\n min-height: 64px;\n}\n/* Prevent toolbar from shrinking vertically when media < 600px */\n.MuiToolbar-root {\n min-height: 72px !important;\n padding-left: 16px !important;\n padding-right: 16px !important;\n}\n\n.ChatBox {\n display: flex;\n flex-direction: column;\n flex-grow: 1;\n max-width: 1024px;\n width: 100%;\n margin: 0 auto;\n background-color: #D3CDBF;\n}\n\n.user-message.MuiCard-root {\n background-color: #DCF8C6;\n border: 1px solid #B2E0A7;\n color: #333333;\n margin-bottom: 0.75rem;\n margin-left: 1rem;\n border-radius: 0.25rem;\n min-width: 80%;\n max-width: 80%;\n justify-self: right;\n display: flex;\n white-space: pre-wrap;\n overflow-wrap: break-word;\n word-break: break-word;\n flex-direction: column;\n align-items: self-end;\n align-self: end;\n flex-grow: 0;\n}\n\n.About.MuiCard-root,\n.assistant-message.MuiCard-root {\n border: 1px solid #E0E0E0;\n background-color: #FFFFFF;\n color: #333333;\n margin-bottom: 0.75rem;\n margin-right: 1rem;\n min-width: 70%;\n border-radius: 0.25rem;\n justify-self: left;\n display: flex;\n white-space: pre-wrap;\n overflow-wrap: break-word;\n word-break: break-word;\n flex-direction: column;\n flex-grow: 0;\n padding: 16px 0;\n font-size: 0.9rem;\n}\n\n\n.About.MuiCard-root {\n display: flex;\n flex-grow: 1;\n width: 100%;\n margin-left: 0;\n margin-right: 0;\n}\n\n.About .MuiCardContent-root,\n.assistant-message .MuiCardContent-root {\n padding: 0 16px !important;\n font-size: 0.9rem;\n}\n\n.About span,\n.assistant-message span {\n font-size: 0.9rem;\n}\n\n.user-message .MuiCardContent-root:last-child,\n.assistant-message .MuiCardContent-root:last-child,\n.About .MuiCardContent-root:last-child {\n padding: 16px;\n}\n\n.users > div {\n padding: 0.25rem;\n}\n\n.user-active {\n font-weight: bold;\n}\n\n.metadata {\n border: 1px solid #E0E0E0;\n font-size: 0.75rem;\n padding: 0.125rem;\n}\n\n/* Reduce general whitespace in markdown content */\n* p.MuiTypography-root {\n margin-top: 0.5rem;\n margin-bottom: 0.5rem;\n font-size: 0.9rem;\n}\n\n/* Reduce space between headings and content */\n* h1.MuiTypography-root,\n* h2.MuiTypography-root,\n* h3.MuiTypography-root,\n* h4.MuiTypography-root,\n* h5.MuiTypography-root,\n* h6.MuiTypography-root {\n margin-top: 1rem;\n margin-bottom: 0.5rem;\n font-size: 1rem;\n}\n\n/* Reduce space in lists */\n* ul.MuiTypography-root,\n* ol.MuiTypography-root {\n margin-top: 0.5rem;\n margin-bottom: 0.5rem;\n font-size: 0.9rem;\n}\n\n* li.MuiTypography-root {\n margin-bottom: 0.25rem;\n font-size: 0.9rem;\n}\n\n* .MuiTypography-root li {\n margin-top: 0;\n margin-bottom: 0;\n padding: 0;\n font-size: 0.9rem;\n}\n\n/* Reduce space around code blocks */\n* .MuiTypography-root pre {\n border: 1px solid #F5F5F5;\n border-radius: 0.5rem;\n padding: 0.5rem 0.75rem;\n margin-top: 0;\n margin-bottom: 0;\n font-size: 0.9rem;\n}\n\n.PromptStats .MuiTableCell-root {\n font-size: 0.8rem;\n}\n\n#SystemPromptInput {\n font-size: 0.9rem;\n line-height: 1.25rem;\n}","/* roboto-cyrillic-ext-300-normal */\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 300;\n src: url(./files/roboto-cyrillic-ext-300-normal.woff2) format('woff2'), url(./files/roboto-cyrillic-ext-300-normal.woff) format('woff');\n unicode-range: U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F;\n}\n\n/* roboto-cyrillic-300-normal */\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 300;\n src: url(./files/roboto-cyrillic-300-normal.woff2) format('woff2'), url(./files/roboto-cyrillic-300-normal.woff) format('woff');\n unicode-range: U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;\n}\n\n/* roboto-greek-ext-300-normal */\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 300;\n src: url(./files/roboto-greek-ext-300-normal.woff2) format('woff2'), url(./files/roboto-greek-ext-300-normal.woff) format('woff');\n unicode-range: U+1F00-1FFF;\n}\n\n/* roboto-greek-300-normal */\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 300;\n src: url(./files/roboto-greek-300-normal.woff2) format('woff2'), url(./files/roboto-greek-300-normal.woff) format('woff');\n unicode-range: U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF;\n}\n\n/* roboto-math-300-normal */\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 300;\n src: url(./files/roboto-math-300-normal.woff2) format('woff2'), url(./files/roboto-math-300-normal.woff) format('woff');\n unicode-range: U+0302-0303,U+0305,U+0307-0308,U+0310,U+0312,U+0315,U+031A,U+0326-0327,U+032C,U+032F-0330,U+0332-0333,U+0338,U+033A,U+0346,U+034D,U+0391-03A1,U+03A3-03A9,U+03B1-03C9,U+03D1,U+03D5-03D6,U+03F0-03F1,U+03F4-03F5,U+2016-2017,U+2034-2038,U+203C,U+2040,U+2043,U+2047,U+2050,U+2057,U+205F,U+2070-2071,U+2074-208E,U+2090-209C,U+20D0-20DC,U+20E1,U+20E5-20EF,U+2100-2112,U+2114-2115,U+2117-2121,U+2123-214F,U+2190,U+2192,U+2194-21AE,U+21B0-21E5,U+21F1-21F2,U+21F4-2211,U+2213-2214,U+2216-22FF,U+2308-230B,U+2310,U+2319,U+231C-2321,U+2336-237A,U+237C,U+2395,U+239B-23B7,U+23D0,U+23DC-23E1,U+2474-2475,U+25AF,U+25B3,U+25B7,U+25BD,U+25C1,U+25CA,U+25CC,U+25FB,U+266D-266F,U+27C0-27FF,U+2900-2AFF,U+2B0E-2B11,U+2B30-2B4C,U+2BFE,U+3030,U+FF5B,U+FF5D,U+1D400-1D7FF,U+1EE00-1EEFF;\n}\n\n/* roboto-symbols-300-normal */\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 300;\n src: url(./files/roboto-symbols-300-normal.woff2) format('woff2'), url(./files/roboto-symbols-300-normal.woff) format('woff');\n unicode-range: U+0001-000C,U+000E-001F,U+007F-009F,U+20DD-20E0,U+20E2-20E4,U+2150-218F,U+2190,U+2192,U+2194-2199,U+21AF,U+21E6-21F0,U+21F3,U+2218-2219,U+2299,U+22C4-22C6,U+2300-243F,U+2440-244A,U+2460-24FF,U+25A0-27BF,U+2800-28FF,U+2921-2922,U+2981,U+29BF,U+29EB,U+2B00-2BFF,U+4DC0-4DFF,U+FFF9-FFFB,U+10140-1018E,U+10190-1019C,U+101A0,U+101D0-101FD,U+102E0-102FB,U+10E60-10E7E,U+1D2C0-1D2D3,U+1D2E0-1D37F,U+1F000-1F0FF,U+1F100-1F1AD,U+1F1E6-1F1FF,U+1F30D-1F30F,U+1F315,U+1F31C,U+1F31E,U+1F320-1F32C,U+1F336,U+1F378,U+1F37D,U+1F382,U+1F393-1F39F,U+1F3A7-1F3A8,U+1F3AC-1F3AF,U+1F3C2,U+1F3C4-1F3C6,U+1F3CA-1F3CE,U+1F3D4-1F3E0,U+1F3ED,U+1F3F1-1F3F3,U+1F3F5-1F3F7,U+1F408,U+1F415,U+1F41F,U+1F426,U+1F43F,U+1F441-1F442,U+1F444,U+1F446-1F449,U+1F44C-1F44E,U+1F453,U+1F46A,U+1F47D,U+1F4A3,U+1F4B0,U+1F4B3,U+1F4B9,U+1F4BB,U+1F4BF,U+1F4C8-1F4CB,U+1F4D6,U+1F4DA,U+1F4DF,U+1F4E3-1F4E6,U+1F4EA-1F4ED,U+1F4F7,U+1F4F9-1F4FB,U+1F4FD-1F4FE,U+1F503,U+1F507-1F50B,U+1F50D,U+1F512-1F513,U+1F53E-1F54A,U+1F54F-1F5FA,U+1F610,U+1F650-1F67F,U+1F687,U+1F68D,U+1F691,U+1F694,U+1F698,U+1F6AD,U+1F6B2,U+1F6B9-1F6BA,U+1F6BC,U+1F6C6-1F6CF,U+1F6D3-1F6D7,U+1F6E0-1F6EA,U+1F6F0-1F6F3,U+1F6F7-1F6FC,U+1F700-1F7FF,U+1F800-1F80B,U+1F810-1F847,U+1F850-1F859,U+1F860-1F887,U+1F890-1F8AD,U+1F8B0-1F8BB,U+1F8C0-1F8C1,U+1F900-1F90B,U+1F93B,U+1F946,U+1F984,U+1F996,U+1F9E9,U+1FA00-1FA6F,U+1FA70-1FA7C,U+1FA80-1FA89,U+1FA8F-1FAC6,U+1FACE-1FADC,U+1FADF-1FAE9,U+1FAF0-1FAF8,U+1FB00-1FBFF;\n}\n\n/* roboto-vietnamese-300-normal */\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 300;\n src: url(./files/roboto-vietnamese-300-normal.woff2) format('woff2'), url(./files/roboto-vietnamese-300-normal.woff) format('woff');\n unicode-range: U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB;\n}\n\n/* roboto-latin-ext-300-normal */\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 300;\n src: url(./files/roboto-latin-ext-300-normal.woff2) format('woff2'), url(./files/roboto-latin-ext-300-normal.woff) format('woff');\n unicode-range: U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;\n}\n\n/* roboto-latin-300-normal */\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 300;\n src: url(./files/roboto-latin-300-normal.woff2) format('woff2'), url(./files/roboto-latin-300-normal.woff) format('woff');\n unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;\n}","/* roboto-cyrillic-ext-400-normal */\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 400;\n src: url(./files/roboto-cyrillic-ext-400-normal.woff2) format('woff2'), url(./files/roboto-cyrillic-ext-400-normal.woff) format('woff');\n unicode-range: U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F;\n}\n\n/* roboto-cyrillic-400-normal */\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 400;\n src: url(./files/roboto-cyrillic-400-normal.woff2) format('woff2'), url(./files/roboto-cyrillic-400-normal.woff) format('woff');\n unicode-range: U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;\n}\n\n/* roboto-greek-ext-400-normal */\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 400;\n src: url(./files/roboto-greek-ext-400-normal.woff2) format('woff2'), url(./files/roboto-greek-ext-400-normal.woff) format('woff');\n unicode-range: U+1F00-1FFF;\n}\n\n/* roboto-greek-400-normal */\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 400;\n src: url(./files/roboto-greek-400-normal.woff2) format('woff2'), url(./files/roboto-greek-400-normal.woff) format('woff');\n unicode-range: U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF;\n}\n\n/* roboto-math-400-normal */\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 400;\n src: url(./files/roboto-math-400-normal.woff2) format('woff2'), url(./files/roboto-math-400-normal.woff) format('woff');\n unicode-range: U+0302-0303,U+0305,U+0307-0308,U+0310,U+0312,U+0315,U+031A,U+0326-0327,U+032C,U+032F-0330,U+0332-0333,U+0338,U+033A,U+0346,U+034D,U+0391-03A1,U+03A3-03A9,U+03B1-03C9,U+03D1,U+03D5-03D6,U+03F0-03F1,U+03F4-03F5,U+2016-2017,U+2034-2038,U+203C,U+2040,U+2043,U+2047,U+2050,U+2057,U+205F,U+2070-2071,U+2074-208E,U+2090-209C,U+20D0-20DC,U+20E1,U+20E5-20EF,U+2100-2112,U+2114-2115,U+2117-2121,U+2123-214F,U+2190,U+2192,U+2194-21AE,U+21B0-21E5,U+21F1-21F2,U+21F4-2211,U+2213-2214,U+2216-22FF,U+2308-230B,U+2310,U+2319,U+231C-2321,U+2336-237A,U+237C,U+2395,U+239B-23B7,U+23D0,U+23DC-23E1,U+2474-2475,U+25AF,U+25B3,U+25B7,U+25BD,U+25C1,U+25CA,U+25CC,U+25FB,U+266D-266F,U+27C0-27FF,U+2900-2AFF,U+2B0E-2B11,U+2B30-2B4C,U+2BFE,U+3030,U+FF5B,U+FF5D,U+1D400-1D7FF,U+1EE00-1EEFF;\n}\n\n/* roboto-symbols-400-normal */\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 400;\n src: url(./files/roboto-symbols-400-normal.woff2) format('woff2'), url(./files/roboto-symbols-400-normal.woff) format('woff');\n unicode-range: U+0001-000C,U+000E-001F,U+007F-009F,U+20DD-20E0,U+20E2-20E4,U+2150-218F,U+2190,U+2192,U+2194-2199,U+21AF,U+21E6-21F0,U+21F3,U+2218-2219,U+2299,U+22C4-22C6,U+2300-243F,U+2440-244A,U+2460-24FF,U+25A0-27BF,U+2800-28FF,U+2921-2922,U+2981,U+29BF,U+29EB,U+2B00-2BFF,U+4DC0-4DFF,U+FFF9-FFFB,U+10140-1018E,U+10190-1019C,U+101A0,U+101D0-101FD,U+102E0-102FB,U+10E60-10E7E,U+1D2C0-1D2D3,U+1D2E0-1D37F,U+1F000-1F0FF,U+1F100-1F1AD,U+1F1E6-1F1FF,U+1F30D-1F30F,U+1F315,U+1F31C,U+1F31E,U+1F320-1F32C,U+1F336,U+1F378,U+1F37D,U+1F382,U+1F393-1F39F,U+1F3A7-1F3A8,U+1F3AC-1F3AF,U+1F3C2,U+1F3C4-1F3C6,U+1F3CA-1F3CE,U+1F3D4-1F3E0,U+1F3ED,U+1F3F1-1F3F3,U+1F3F5-1F3F7,U+1F408,U+1F415,U+1F41F,U+1F426,U+1F43F,U+1F441-1F442,U+1F444,U+1F446-1F449,U+1F44C-1F44E,U+1F453,U+1F46A,U+1F47D,U+1F4A3,U+1F4B0,U+1F4B3,U+1F4B9,U+1F4BB,U+1F4BF,U+1F4C8-1F4CB,U+1F4D6,U+1F4DA,U+1F4DF,U+1F4E3-1F4E6,U+1F4EA-1F4ED,U+1F4F7,U+1F4F9-1F4FB,U+1F4FD-1F4FE,U+1F503,U+1F507-1F50B,U+1F50D,U+1F512-1F513,U+1F53E-1F54A,U+1F54F-1F5FA,U+1F610,U+1F650-1F67F,U+1F687,U+1F68D,U+1F691,U+1F694,U+1F698,U+1F6AD,U+1F6B2,U+1F6B9-1F6BA,U+1F6BC,U+1F6C6-1F6CF,U+1F6D3-1F6D7,U+1F6E0-1F6EA,U+1F6F0-1F6F3,U+1F6F7-1F6FC,U+1F700-1F7FF,U+1F800-1F80B,U+1F810-1F847,U+1F850-1F859,U+1F860-1F887,U+1F890-1F8AD,U+1F8B0-1F8BB,U+1F8C0-1F8C1,U+1F900-1F90B,U+1F93B,U+1F946,U+1F984,U+1F996,U+1F9E9,U+1FA00-1FA6F,U+1FA70-1FA7C,U+1FA80-1FA89,U+1FA8F-1FAC6,U+1FACE-1FADC,U+1FADF-1FAE9,U+1FAF0-1FAF8,U+1FB00-1FBFF;\n}\n\n/* roboto-vietnamese-400-normal */\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 400;\n src: url(./files/roboto-vietnamese-400-normal.woff2) format('woff2'), url(./files/roboto-vietnamese-400-normal.woff) format('woff');\n unicode-range: U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB;\n}\n\n/* roboto-latin-ext-400-normal */\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 400;\n src: url(./files/roboto-latin-ext-400-normal.woff2) format('woff2'), url(./files/roboto-latin-ext-400-normal.woff) format('woff');\n unicode-range: U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;\n}\n\n/* roboto-latin-400-normal */\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 400;\n src: url(./files/roboto-latin-400-normal.woff2) format('woff2'), url(./files/roboto-latin-400-normal.woff) format('woff');\n unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;\n}","/* roboto-cyrillic-ext-500-normal */\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 500;\n src: url(./files/roboto-cyrillic-ext-500-normal.woff2) format('woff2'), url(./files/roboto-cyrillic-ext-500-normal.woff) format('woff');\n unicode-range: U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F;\n}\n\n/* roboto-cyrillic-500-normal */\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 500;\n src: url(./files/roboto-cyrillic-500-normal.woff2) format('woff2'), url(./files/roboto-cyrillic-500-normal.woff) format('woff');\n unicode-range: U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;\n}\n\n/* roboto-greek-ext-500-normal */\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 500;\n src: url(./files/roboto-greek-ext-500-normal.woff2) format('woff2'), url(./files/roboto-greek-ext-500-normal.woff) format('woff');\n unicode-range: U+1F00-1FFF;\n}\n\n/* roboto-greek-500-normal */\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 500;\n src: url(./files/roboto-greek-500-normal.woff2) format('woff2'), url(./files/roboto-greek-500-normal.woff) format('woff');\n unicode-range: U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF;\n}\n\n/* roboto-math-500-normal */\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 500;\n src: url(./files/roboto-math-500-normal.woff2) format('woff2'), url(./files/roboto-math-500-normal.woff) format('woff');\n unicode-range: U+0302-0303,U+0305,U+0307-0308,U+0310,U+0312,U+0315,U+031A,U+0326-0327,U+032C,U+032F-0330,U+0332-0333,U+0338,U+033A,U+0346,U+034D,U+0391-03A1,U+03A3-03A9,U+03B1-03C9,U+03D1,U+03D5-03D6,U+03F0-03F1,U+03F4-03F5,U+2016-2017,U+2034-2038,U+203C,U+2040,U+2043,U+2047,U+2050,U+2057,U+205F,U+2070-2071,U+2074-208E,U+2090-209C,U+20D0-20DC,U+20E1,U+20E5-20EF,U+2100-2112,U+2114-2115,U+2117-2121,U+2123-214F,U+2190,U+2192,U+2194-21AE,U+21B0-21E5,U+21F1-21F2,U+21F4-2211,U+2213-2214,U+2216-22FF,U+2308-230B,U+2310,U+2319,U+231C-2321,U+2336-237A,U+237C,U+2395,U+239B-23B7,U+23D0,U+23DC-23E1,U+2474-2475,U+25AF,U+25B3,U+25B7,U+25BD,U+25C1,U+25CA,U+25CC,U+25FB,U+266D-266F,U+27C0-27FF,U+2900-2AFF,U+2B0E-2B11,U+2B30-2B4C,U+2BFE,U+3030,U+FF5B,U+FF5D,U+1D400-1D7FF,U+1EE00-1EEFF;\n}\n\n/* roboto-symbols-500-normal */\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 500;\n src: url(./files/roboto-symbols-500-normal.woff2) format('woff2'), url(./files/roboto-symbols-500-normal.woff) format('woff');\n unicode-range: U+0001-000C,U+000E-001F,U+007F-009F,U+20DD-20E0,U+20E2-20E4,U+2150-218F,U+2190,U+2192,U+2194-2199,U+21AF,U+21E6-21F0,U+21F3,U+2218-2219,U+2299,U+22C4-22C6,U+2300-243F,U+2440-244A,U+2460-24FF,U+25A0-27BF,U+2800-28FF,U+2921-2922,U+2981,U+29BF,U+29EB,U+2B00-2BFF,U+4DC0-4DFF,U+FFF9-FFFB,U+10140-1018E,U+10190-1019C,U+101A0,U+101D0-101FD,U+102E0-102FB,U+10E60-10E7E,U+1D2C0-1D2D3,U+1D2E0-1D37F,U+1F000-1F0FF,U+1F100-1F1AD,U+1F1E6-1F1FF,U+1F30D-1F30F,U+1F315,U+1F31C,U+1F31E,U+1F320-1F32C,U+1F336,U+1F378,U+1F37D,U+1F382,U+1F393-1F39F,U+1F3A7-1F3A8,U+1F3AC-1F3AF,U+1F3C2,U+1F3C4-1F3C6,U+1F3CA-1F3CE,U+1F3D4-1F3E0,U+1F3ED,U+1F3F1-1F3F3,U+1F3F5-1F3F7,U+1F408,U+1F415,U+1F41F,U+1F426,U+1F43F,U+1F441-1F442,U+1F444,U+1F446-1F449,U+1F44C-1F44E,U+1F453,U+1F46A,U+1F47D,U+1F4A3,U+1F4B0,U+1F4B3,U+1F4B9,U+1F4BB,U+1F4BF,U+1F4C8-1F4CB,U+1F4D6,U+1F4DA,U+1F4DF,U+1F4E3-1F4E6,U+1F4EA-1F4ED,U+1F4F7,U+1F4F9-1F4FB,U+1F4FD-1F4FE,U+1F503,U+1F507-1F50B,U+1F50D,U+1F512-1F513,U+1F53E-1F54A,U+1F54F-1F5FA,U+1F610,U+1F650-1F67F,U+1F687,U+1F68D,U+1F691,U+1F694,U+1F698,U+1F6AD,U+1F6B2,U+1F6B9-1F6BA,U+1F6BC,U+1F6C6-1F6CF,U+1F6D3-1F6D7,U+1F6E0-1F6EA,U+1F6F0-1F6F3,U+1F6F7-1F6FC,U+1F700-1F7FF,U+1F800-1F80B,U+1F810-1F847,U+1F850-1F859,U+1F860-1F887,U+1F890-1F8AD,U+1F8B0-1F8BB,U+1F8C0-1F8C1,U+1F900-1F90B,U+1F93B,U+1F946,U+1F984,U+1F996,U+1F9E9,U+1FA00-1FA6F,U+1FA70-1FA7C,U+1FA80-1FA89,U+1FA8F-1FAC6,U+1FACE-1FADC,U+1FADF-1FAE9,U+1FAF0-1FAF8,U+1FB00-1FBFF;\n}\n\n/* roboto-vietnamese-500-normal */\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 500;\n src: url(./files/roboto-vietnamese-500-normal.woff2) format('woff2'), url(./files/roboto-vietnamese-500-normal.woff) format('woff');\n unicode-range: U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB;\n}\n\n/* roboto-latin-ext-500-normal */\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 500;\n src: url(./files/roboto-latin-ext-500-normal.woff2) format('woff2'), url(./files/roboto-latin-ext-500-normal.woff) format('woff');\n unicode-range: U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;\n}\n\n/* roboto-latin-500-normal */\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 500;\n src: url(./files/roboto-latin-500-normal.woff2) format('woff2'), url(./files/roboto-latin-500-normal.woff) format('woff');\n unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;\n}","/* roboto-cyrillic-ext-700-normal */\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 700;\n src: url(./files/roboto-cyrillic-ext-700-normal.woff2) format('woff2'), url(./files/roboto-cyrillic-ext-700-normal.woff) format('woff');\n unicode-range: U+0460-052F,U+1C80-1C8A,U+20B4,U+2DE0-2DFF,U+A640-A69F,U+FE2E-FE2F;\n}\n\n/* roboto-cyrillic-700-normal */\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 700;\n src: url(./files/roboto-cyrillic-700-normal.woff2) format('woff2'), url(./files/roboto-cyrillic-700-normal.woff) format('woff');\n unicode-range: U+0301,U+0400-045F,U+0490-0491,U+04B0-04B1,U+2116;\n}\n\n/* roboto-greek-ext-700-normal */\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 700;\n src: url(./files/roboto-greek-ext-700-normal.woff2) format('woff2'), url(./files/roboto-greek-ext-700-normal.woff) format('woff');\n unicode-range: U+1F00-1FFF;\n}\n\n/* roboto-greek-700-normal */\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 700;\n src: url(./files/roboto-greek-700-normal.woff2) format('woff2'), url(./files/roboto-greek-700-normal.woff) format('woff');\n unicode-range: U+0370-0377,U+037A-037F,U+0384-038A,U+038C,U+038E-03A1,U+03A3-03FF;\n}\n\n/* roboto-math-700-normal */\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 700;\n src: url(./files/roboto-math-700-normal.woff2) format('woff2'), url(./files/roboto-math-700-normal.woff) format('woff');\n unicode-range: U+0302-0303,U+0305,U+0307-0308,U+0310,U+0312,U+0315,U+031A,U+0326-0327,U+032C,U+032F-0330,U+0332-0333,U+0338,U+033A,U+0346,U+034D,U+0391-03A1,U+03A3-03A9,U+03B1-03C9,U+03D1,U+03D5-03D6,U+03F0-03F1,U+03F4-03F5,U+2016-2017,U+2034-2038,U+203C,U+2040,U+2043,U+2047,U+2050,U+2057,U+205F,U+2070-2071,U+2074-208E,U+2090-209C,U+20D0-20DC,U+20E1,U+20E5-20EF,U+2100-2112,U+2114-2115,U+2117-2121,U+2123-214F,U+2190,U+2192,U+2194-21AE,U+21B0-21E5,U+21F1-21F2,U+21F4-2211,U+2213-2214,U+2216-22FF,U+2308-230B,U+2310,U+2319,U+231C-2321,U+2336-237A,U+237C,U+2395,U+239B-23B7,U+23D0,U+23DC-23E1,U+2474-2475,U+25AF,U+25B3,U+25B7,U+25BD,U+25C1,U+25CA,U+25CC,U+25FB,U+266D-266F,U+27C0-27FF,U+2900-2AFF,U+2B0E-2B11,U+2B30-2B4C,U+2BFE,U+3030,U+FF5B,U+FF5D,U+1D400-1D7FF,U+1EE00-1EEFF;\n}\n\n/* roboto-symbols-700-normal */\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 700;\n src: url(./files/roboto-symbols-700-normal.woff2) format('woff2'), url(./files/roboto-symbols-700-normal.woff) format('woff');\n unicode-range: U+0001-000C,U+000E-001F,U+007F-009F,U+20DD-20E0,U+20E2-20E4,U+2150-218F,U+2190,U+2192,U+2194-2199,U+21AF,U+21E6-21F0,U+21F3,U+2218-2219,U+2299,U+22C4-22C6,U+2300-243F,U+2440-244A,U+2460-24FF,U+25A0-27BF,U+2800-28FF,U+2921-2922,U+2981,U+29BF,U+29EB,U+2B00-2BFF,U+4DC0-4DFF,U+FFF9-FFFB,U+10140-1018E,U+10190-1019C,U+101A0,U+101D0-101FD,U+102E0-102FB,U+10E60-10E7E,U+1D2C0-1D2D3,U+1D2E0-1D37F,U+1F000-1F0FF,U+1F100-1F1AD,U+1F1E6-1F1FF,U+1F30D-1F30F,U+1F315,U+1F31C,U+1F31E,U+1F320-1F32C,U+1F336,U+1F378,U+1F37D,U+1F382,U+1F393-1F39F,U+1F3A7-1F3A8,U+1F3AC-1F3AF,U+1F3C2,U+1F3C4-1F3C6,U+1F3CA-1F3CE,U+1F3D4-1F3E0,U+1F3ED,U+1F3F1-1F3F3,U+1F3F5-1F3F7,U+1F408,U+1F415,U+1F41F,U+1F426,U+1F43F,U+1F441-1F442,U+1F444,U+1F446-1F449,U+1F44C-1F44E,U+1F453,U+1F46A,U+1F47D,U+1F4A3,U+1F4B0,U+1F4B3,U+1F4B9,U+1F4BB,U+1F4BF,U+1F4C8-1F4CB,U+1F4D6,U+1F4DA,U+1F4DF,U+1F4E3-1F4E6,U+1F4EA-1F4ED,U+1F4F7,U+1F4F9-1F4FB,U+1F4FD-1F4FE,U+1F503,U+1F507-1F50B,U+1F50D,U+1F512-1F513,U+1F53E-1F54A,U+1F54F-1F5FA,U+1F610,U+1F650-1F67F,U+1F687,U+1F68D,U+1F691,U+1F694,U+1F698,U+1F6AD,U+1F6B2,U+1F6B9-1F6BA,U+1F6BC,U+1F6C6-1F6CF,U+1F6D3-1F6D7,U+1F6E0-1F6EA,U+1F6F0-1F6F3,U+1F6F7-1F6FC,U+1F700-1F7FF,U+1F800-1F80B,U+1F810-1F847,U+1F850-1F859,U+1F860-1F887,U+1F890-1F8AD,U+1F8B0-1F8BB,U+1F8C0-1F8C1,U+1F900-1F90B,U+1F93B,U+1F946,U+1F984,U+1F996,U+1F9E9,U+1FA00-1FA6F,U+1FA70-1FA7C,U+1FA80-1FA89,U+1FA8F-1FAC6,U+1FACE-1FADC,U+1FADF-1FAE9,U+1FAF0-1FAF8,U+1FB00-1FBFF;\n}\n\n/* roboto-vietnamese-700-normal */\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 700;\n src: url(./files/roboto-vietnamese-700-normal.woff2) format('woff2'), url(./files/roboto-vietnamese-700-normal.woff) format('woff');\n unicode-range: U+0102-0103,U+0110-0111,U+0128-0129,U+0168-0169,U+01A0-01A1,U+01AF-01B0,U+0300-0301,U+0303-0304,U+0308-0309,U+0323,U+0329,U+1EA0-1EF9,U+20AB;\n}\n\n/* roboto-latin-ext-700-normal */\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 700;\n src: url(./files/roboto-latin-ext-700-normal.woff2) format('woff2'), url(./files/roboto-latin-ext-700-normal.woff) format('woff');\n unicode-range: U+0100-02BA,U+02BD-02C5,U+02C7-02CC,U+02CE-02D7,U+02DD-02FF,U+0304,U+0308,U+0329,U+1D00-1DBF,U+1E00-1E9F,U+1EF2-1EFF,U+2020,U+20A0-20AB,U+20AD-20C0,U+2113,U+2C60-2C7F,U+A720-A7FF;\n}\n\n/* roboto-latin-700-normal */\n@font-face {\n font-family: 'Roboto';\n font-style: normal;\n font-display: swap;\n font-weight: 700;\n src: url(./files/roboto-latin-700-normal.woff2) format('woff2'), url(./files/roboto-latin-700-normal.woff) format('woff');\n unicode-range: U+0000-00FF,U+0131,U+0152-0153,U+02BB-02BC,U+02C6,U+02DA,U+02DC,U+0304,U+0308,U+0329,U+2000-206F,U+20AC,U+2122,U+2191,U+2193,U+2212,U+2215,U+FEFF,U+FFFD;\n}"],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/frontend/deployed/static/js/109.fea37f16.chunk.js b/frontend/deployed/static/js/109.fea37f16.chunk.js deleted file mode 100644 index 548dc71..0000000 --- a/frontend/deployed/static/js/109.fea37f16.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunkbackstory=self.webpackChunkbackstory||[]).push([[109],{3490:(e,t,a)=>{a.d(t,{diagram:()=>b});var i=a(7799),n=a(634),l=a(3957),r=a(3759),s=a(5502),o=a(700),c=r.UI.pie,p={sections:new Map,showData:!1,config:c},d=p.sections,g=p.showData,u=structuredClone(c),h=(0,r.K2)((()=>structuredClone(u)),"getConfig"),m=(0,r.K2)((()=>{d=new Map,g=p.showData,(0,r.IU)()}),"clear"),f=(0,r.K2)((e=>{let{label:t,value:a}=e;d.has(t)||(d.set(t,a),r.Rm.debug(`added new section: ${t}, with value: ${a}`))}),"addSection"),S=(0,r.K2)((()=>d),"getSections"),x=(0,r.K2)((e=>{g=e}),"setShowData"),w=(0,r.K2)((()=>g),"getShowData"),D={getConfig:h,clear:m,setDiagramTitle:r.ke,getDiagramTitle:r.ab,setAccTitle:r.SV,getAccTitle:r.iN,setAccDescription:r.EI,getAccDescription:r.m7,addSection:f,getSections:S,setShowData:x,getShowData:w},y=(0,r.K2)(((e,t)=>{(0,i.S)(e,t),t.setShowData(e.showData),e.sections.map(t.addSection)}),"populateDb"),T={parse:(0,r.K2)((async e=>{const t=await(0,s.qg)("pie",e);r.Rm.debug(t),y(t,D)}),"parse")},$=(0,r.K2)((e=>`\n .pieCircle{\n stroke: ${e.pieStrokeColor};\n stroke-width : ${e.pieStrokeWidth};\n opacity : ${e.pieOpacity};\n }\n .pieOuterCircle{\n stroke: ${e.pieOuterStrokeColor};\n stroke-width: ${e.pieOuterStrokeWidth};\n fill: none;\n }\n .pieTitleText {\n text-anchor: middle;\n font-size: ${e.pieTitleTextSize};\n fill: ${e.pieTitleTextColor};\n font-family: ${e.fontFamily};\n }\n .slice {\n font-family: ${e.fontFamily};\n fill: ${e.pieSectionTextColor};\n font-size:${e.pieSectionTextSize};\n // fill: white;\n }\n .legend text {\n fill: ${e.pieLegendTextColor};\n font-family: ${e.fontFamily};\n font-size: ${e.pieLegendTextSize};\n }\n`),"getStyles"),C=(0,r.K2)((e=>{const t=[...e.entries()].map((e=>({label:e[0],value:e[1]}))).sort(((e,t)=>t.value-e.value));return(0,o.rLf)().value((e=>e.value))(t)}),"createPieArcs"),b={parser:T,db:D,renderer:{draw:(0,r.K2)(((e,t,a,i)=>{r.Rm.debug("rendering pie chart\n"+e);const s=i.db,c=(0,r.D7)(),p=(0,n.$t)(s.getConfig(),c.pie),d=18,g=450,u=g,h=(0,l.D)(t),m=h.append("g");m.attr("transform","translate(225,225)");const{themeVariables:f}=c;let[S]=(0,n.I5)(f.pieOuterStrokeWidth);S??=2;const x=p.textPosition,w=Math.min(u,g)/2-40,D=(0,o.JLW)().innerRadius(0).outerRadius(w),y=(0,o.JLW)().innerRadius(w*x).outerRadius(w*x);m.append("circle").attr("cx",0).attr("cy",0).attr("r",w+S/2).attr("class","pieOuterCircle");const T=s.getSections(),$=C(T),b=[f.pie1,f.pie2,f.pie3,f.pie4,f.pie5,f.pie6,f.pie7,f.pie8,f.pie9,f.pie10,f.pie11,f.pie12],k=(0,o.UMr)(b);m.selectAll("mySlices").data($).enter().append("path").attr("d",D).attr("fill",(e=>k(e.data.label))).attr("class","pieCircle");let K=0;T.forEach((e=>{K+=e})),m.selectAll("mySlices").data($).enter().append("text").text((e=>(e.data.value/K*100).toFixed(0)+"%")).attr("transform",(e=>"translate("+y.centroid(e)+")")).style("text-anchor","middle").attr("class","slice"),m.append("text").text(s.getDiagramTitle()).attr("x",0).attr("y",-200).attr("class","pieTitleText");const v=m.selectAll(".legend").data(k.domain()).enter().append("g").attr("class","legend").attr("transform",((e,t)=>"translate(216,"+(22*t-22*k.domain().length/2)+")"));v.append("rect").attr("width",d).attr("height",d).style("fill",k).style("stroke",k),v.data($).append("text").attr("x",22).attr("y",14).text((e=>{const{label:t,value:a}=e.data;return s.getShowData()?`${t} [${a}]`:t}));const A=512+Math.max(...v.selectAll("text").nodes().map((e=>e?.getBoundingClientRect().width??0)));h.attr("viewBox",`0 0 ${A} 450`),(0,r.a$)(h,g,A,p.useMaxWidth)}),"draw")},styles:$}},7799:(e,t,a)=>{function i(e,t){e.accDescr&&t.setAccDescription?.(e.accDescr),e.accTitle&&t.setAccTitle?.(e.accTitle),e.title&&t.setDiagramTitle?.(e.title)}a.d(t,{S:()=>i}),(0,a(3759).K2)(i,"populateCommonDb")}}]); -//# sourceMappingURL=109.fea37f16.chunk.js.map \ No newline at end of file diff --git a/frontend/deployed/static/js/109.fea37f16.chunk.js.map b/frontend/deployed/static/js/109.fea37f16.chunk.js.map deleted file mode 100644 index 1fb0be6..0000000 --- a/frontend/deployed/static/js/109.fea37f16.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"static/js/109.fea37f16.chunk.js","mappings":"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","sources":["../node_modules/mermaid/dist/chunks/mermaid.core/pieDiagram-IB7DONF6.mjs","../node_modules/mermaid/dist/chunks/mermaid.core/chunk-4BMEZGHF.mjs"],"sourcesContent":["import {\n populateCommonDb\n} from \"./chunk-4BMEZGHF.mjs\";\nimport {\n cleanAndMerge,\n parseFontSize\n} from \"./chunk-O4NI6UNU.mjs\";\nimport {\n selectSvgElement\n} from \"./chunk-7B677QYD.mjs\";\nimport {\n __name,\n clear,\n configureSvgSize,\n defaultConfig_default,\n getAccDescription,\n getAccTitle,\n getConfig2 as getConfig,\n getDiagramTitle,\n log,\n setAccDescription,\n setAccTitle,\n setDiagramTitle\n} from \"./chunk-YTJNT7DU.mjs\";\n\n// src/diagrams/pie/pieParser.ts\nimport { parse } from \"@mermaid-js/parser\";\n\n// src/diagrams/pie/pieDb.ts\nvar DEFAULT_PIE_CONFIG = defaultConfig_default.pie;\nvar DEFAULT_PIE_DB = {\n sections: /* @__PURE__ */ new Map(),\n showData: false,\n config: DEFAULT_PIE_CONFIG\n};\nvar sections = DEFAULT_PIE_DB.sections;\nvar showData = DEFAULT_PIE_DB.showData;\nvar config = structuredClone(DEFAULT_PIE_CONFIG);\nvar getConfig2 = /* @__PURE__ */ __name(() => structuredClone(config), \"getConfig\");\nvar clear2 = /* @__PURE__ */ __name(() => {\n sections = /* @__PURE__ */ new Map();\n showData = DEFAULT_PIE_DB.showData;\n clear();\n}, \"clear\");\nvar addSection = /* @__PURE__ */ __name(({ label, value }) => {\n if (!sections.has(label)) {\n sections.set(label, value);\n log.debug(`added new section: ${label}, with value: ${value}`);\n }\n}, \"addSection\");\nvar getSections = /* @__PURE__ */ __name(() => sections, \"getSections\");\nvar setShowData = /* @__PURE__ */ __name((toggle) => {\n showData = toggle;\n}, \"setShowData\");\nvar getShowData = /* @__PURE__ */ __name(() => showData, \"getShowData\");\nvar db = {\n getConfig: getConfig2,\n clear: clear2,\n setDiagramTitle,\n getDiagramTitle,\n setAccTitle,\n getAccTitle,\n setAccDescription,\n getAccDescription,\n addSection,\n getSections,\n setShowData,\n getShowData\n};\n\n// src/diagrams/pie/pieParser.ts\nvar populateDb = /* @__PURE__ */ __name((ast, db2) => {\n populateCommonDb(ast, db2);\n db2.setShowData(ast.showData);\n ast.sections.map(db2.addSection);\n}, \"populateDb\");\nvar parser = {\n parse: /* @__PURE__ */ __name(async (input) => {\n const ast = await parse(\"pie\", input);\n log.debug(ast);\n populateDb(ast, db);\n }, \"parse\")\n};\n\n// src/diagrams/pie/pieStyles.ts\nvar getStyles = /* @__PURE__ */ __name((options) => `\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`, \"getStyles\");\nvar pieStyles_default = getStyles;\n\n// src/diagrams/pie/pieRenderer.ts\nimport { arc, pie as d3pie, scaleOrdinal } from \"d3\";\nvar createPieArcs = /* @__PURE__ */ __name((sections2) => {\n const pieData = [...sections2.entries()].map((element) => {\n return {\n label: element[0],\n value: element[1]\n };\n }).sort((a, b) => {\n return b.value - a.value;\n });\n const pie = d3pie().value(\n (d3Section) => d3Section.value\n );\n return pie(pieData);\n}, \"createPieArcs\");\nvar draw = /* @__PURE__ */ __name((text, id, _version, diagObj) => {\n log.debug(\"rendering pie chart\\n\" + text);\n const db2 = diagObj.db;\n const globalConfig = getConfig();\n const pieConfig = cleanAndMerge(db2.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 = height;\n const svg = selectSvgElement(id);\n const group = svg.append(\"g\");\n group.attr(\"transform\", \"translate(\" + pieWidth / 2 + \",\" + height / 2 + \")\");\n const { themeVariables } = globalConfig;\n let [outerStrokeWidth] = parseFontSize(themeVariables.pieOuterStrokeWidth);\n outerStrokeWidth ??= 2;\n const textPosition = pieConfig.textPosition;\n const radius = Math.min(pieWidth, height) / 2 - MARGIN;\n const arcGenerator = arc().innerRadius(0).outerRadius(radius);\n const labelArcGenerator = arc().innerRadius(radius * textPosition).outerRadius(radius * textPosition);\n group.append(\"circle\").attr(\"cx\", 0).attr(\"cy\", 0).attr(\"r\", radius + outerStrokeWidth / 2).attr(\"class\", \"pieOuterCircle\");\n const sections2 = db2.getSections();\n const arcs = createPieArcs(sections2);\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 const color = scaleOrdinal(myGeneratedColors);\n group.selectAll(\"mySlices\").data(arcs).enter().append(\"path\").attr(\"d\", arcGenerator).attr(\"fill\", (datum) => {\n return color(datum.data.label);\n }).attr(\"class\", \"pieCircle\");\n let sum = 0;\n sections2.forEach((section) => {\n sum += section;\n });\n group.selectAll(\"mySlices\").data(arcs).enter().append(\"text\").text((datum) => {\n return (datum.data.value / sum * 100).toFixed(0) + \"%\";\n }).attr(\"transform\", (datum) => {\n return \"translate(\" + labelArcGenerator.centroid(datum) + \")\";\n }).style(\"text-anchor\", \"middle\").attr(\"class\", \"slice\");\n group.append(\"text\").text(db2.getDiagramTitle()).attr(\"x\", 0).attr(\"y\", -(height - 50) / 2).attr(\"class\", \"pieTitleText\");\n const legend = group.selectAll(\".legend\").data(color.domain()).enter().append(\"g\").attr(\"class\", \"legend\").attr(\"transform\", (_datum, index) => {\n const height2 = LEGEND_RECT_SIZE + LEGEND_SPACING;\n const offset = height2 * color.domain().length / 2;\n const horizontal = 12 * LEGEND_RECT_SIZE;\n const vertical = index * height2 - offset;\n return \"translate(\" + horizontal + \",\" + vertical + \")\";\n });\n legend.append(\"rect\").attr(\"width\", LEGEND_RECT_SIZE).attr(\"height\", LEGEND_RECT_SIZE).style(\"fill\", color).style(\"stroke\", color);\n legend.data(arcs).append(\"text\").attr(\"x\", LEGEND_RECT_SIZE + LEGEND_SPACING).attr(\"y\", LEGEND_RECT_SIZE - LEGEND_SPACING).text((datum) => {\n const { label, value } = datum.data;\n if (db2.getShowData()) {\n return `${label} [${value}]`;\n }\n return label;\n });\n const longestTextWidth = Math.max(\n ...legend.selectAll(\"text\").nodes().map((node) => node?.getBoundingClientRect().width ?? 0)\n );\n const totalWidth = pieWidth + MARGIN + LEGEND_RECT_SIZE + LEGEND_SPACING + longestTextWidth;\n svg.attr(\"viewBox\", `0 0 ${totalWidth} ${height}`);\n configureSvgSize(svg, height, totalWidth, pieConfig.useMaxWidth);\n}, \"draw\");\nvar renderer = { draw };\n\n// src/diagrams/pie/pieDiagram.ts\nvar diagram = {\n parser,\n db,\n renderer,\n styles: pieStyles_default\n};\nexport {\n diagram\n};\n","import {\n __name\n} from \"./chunk-YTJNT7DU.mjs\";\n\n// src/diagrams/common/populateCommonDb.ts\nfunction populateCommonDb(ast, db) {\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__name(populateCommonDb, \"populateCommonDb\");\n\nexport {\n populateCommonDb\n};\n"],"names":["DEFAULT_PIE_CONFIG","defaultConfig_default","pie","DEFAULT_PIE_DB","sections","Map","showData","config","structuredClone","getConfig2","__name","clear2","clear","addSection","_ref","label","value","has","set","log","debug","getSections","setShowData","toggle","getShowData","db","getConfig","setDiagramTitle","getDiagramTitle","setAccTitle","getAccTitle","setAccDescription","getAccDescription","populateDb","ast","db2","populateCommonDb","map","parser","parse","async","input","pieStyles_default","options","pieStrokeColor","pieStrokeWidth","pieOpacity","pieOuterStrokeColor","pieOuterStrokeWidth","pieTitleTextSize","pieTitleTextColor","fontFamily","pieSectionTextColor","pieSectionTextSize","pieLegendTextColor","pieLegendTextSize","createPieArcs","sections2","pieData","entries","element","sort","a","b","d3pie","d3Section","diagram","renderer","draw","text","id","_version","diagObj","globalConfig","pieConfig","cleanAndMerge","LEGEND_RECT_SIZE","height","pieWidth","svg","selectSvgElement","group","append","attr","themeVariables","outerStrokeWidth","parseFontSize","textPosition","radius","Math","min","arcGenerator","arc","innerRadius","outerRadius","labelArcGenerator","arcs","myGeneratedColors","pie1","pie2","pie3","pie4","pie5","pie6","pie7","pie8","pie9","pie10","pie11","pie12","color","scaleOrdinal","selectAll","data","enter","datum","sum","forEach","section","toFixed","centroid","style","legend","domain","_datum","index","length","totalWidth","max","nodes","node","getBoundingClientRect","width","configureSvgSize","useMaxWidth","styles","accDescr","accTitle","title"],"sourceRoot":""} \ No newline at end of file diff --git a/frontend/deployed/static/js/126.9837c9af.chunk.js b/frontend/deployed/static/js/126.9837c9af.chunk.js deleted file mode 100644 index a2d057a..0000000 --- a/frontend/deployed/static/js/126.9837c9af.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunkbackstory=self.webpackChunkbackstory||[]).push([[126],{2126:(r,s,e)=>{e.d(s,{diagram:()=>c});var a=e(8035),t=(e(6327),e(53),e(1580),e(2598),e(958),e(8434),e(9711),e(2596),e(634),e(3759)),c={parser:a._$,get db(){return new a.NM},renderer:a.Lh,styles:a.tM,init:(0,t.K2)((r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute}),"init")}}}]); -//# sourceMappingURL=126.9837c9af.chunk.js.map \ No newline at end of file diff --git a/frontend/deployed/static/js/126.9837c9af.chunk.js.map b/frontend/deployed/static/js/126.9837c9af.chunk.js.map deleted file mode 100644 index ec17fbe..0000000 --- a/frontend/deployed/static/js/126.9837c9af.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"static/js/126.9837c9af.chunk.js","mappings":"0NAoBIA,EAAU,CACZC,OAAQC,EAAAA,GACR,MAAIC,GACF,OAAO,IAAIC,EAAAA,EACb,EACAC,SAAUC,EAAAA,GACVC,OAAQC,EAAAA,GACRC,MAAsBC,EAAAA,EAAAA,KAAQC,IACvBA,EAAIC,QACPD,EAAIC,MAAQ,CAAC,GAEfD,EAAIC,MAAMC,oBAAsBF,EAAIE,mBAAmB,GACtD,Q","sources":["../node_modules/mermaid/dist/chunks/mermaid.core/classDiagram-v2-COTLJTTW.mjs"],"sourcesContent":["import {\n ClassDB,\n classDiagram_default,\n classRenderer_v3_unified_default,\n styles_default\n} from \"./chunk-A2AXSNBT.mjs\";\nimport \"./chunk-RZ5BOZE2.mjs\";\nimport \"./chunk-TYCBKAJE.mjs\";\nimport \"./chunk-IIMUDSI4.mjs\";\nimport \"./chunk-VV3M67IP.mjs\";\nimport \"./chunk-HRU6DDCH.mjs\";\nimport \"./chunk-K557N5IZ.mjs\";\nimport \"./chunk-H2D2JQ3I.mjs\";\nimport \"./chunk-C3MQ5ANM.mjs\";\nimport \"./chunk-O4NI6UNU.mjs\";\nimport {\n __name\n} from \"./chunk-YTJNT7DU.mjs\";\n\n// src/diagrams/class/classDiagram-v2.ts\nvar diagram = {\n parser: classDiagram_default,\n get db() {\n return new ClassDB();\n },\n renderer: classRenderer_v3_unified_default,\n styles: styles_default,\n init: /* @__PURE__ */ __name((cnf) => {\n if (!cnf.class) {\n cnf.class = {};\n }\n cnf.class.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute;\n }, \"init\")\n};\nexport {\n diagram\n};\n"],"names":["diagram","parser","classDiagram_default","db","ClassDB","renderer","classRenderer_v3_unified_default","styles","styles_default","init","__name","cnf","class","arrowMarkerAbsolute"],"sourceRoot":""} \ No newline at end of file diff --git a/frontend/deployed/static/js/147.660f25b1.chunk.js b/frontend/deployed/static/js/147.660f25b1.chunk.js deleted file mode 100644 index fa70d15..0000000 --- a/frontend/deployed/static/js/147.660f25b1.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunkbackstory=self.webpackChunkbackstory||[]).push([[147],{8147:(t,e,a)=>{a.d(e,{diagram:()=>A});var i,n=a(3355),r=(a(6327),a(53),a(1580),a(2598),a(958),a(8434),a(9711),a(2596),a(634)),d=a(3759),s=a(700),o=a(62),g=a(772),p={},c=(0,d.K2)(((t,e)=>{p[t]=e}),"set"),h=(0,d.K2)((t=>p[t]),"get"),l=(0,d.K2)((()=>Object.keys(p)),"keys"),x=(0,d.K2)((()=>l().length),"size"),D={get:h,set:c,keys:l,size:x},u=(0,d.K2)((t=>t.append("circle").attr("class","start-state").attr("r",(0,d.D7)().state.sizeUnit).attr("cx",(0,d.D7)().state.padding+(0,d.D7)().state.sizeUnit).attr("cy",(0,d.D7)().state.padding+(0,d.D7)().state.sizeUnit)),"drawStartState"),f=(0,d.K2)((t=>t.append("line").style("stroke","grey").style("stroke-dasharray","3").attr("x1",(0,d.D7)().state.textHeight).attr("class","divider").attr("x2",2*(0,d.D7)().state.textHeight).attr("y1",0).attr("y2",0)),"drawDivider"),y=(0,d.K2)(((t,e)=>{const a=t.append("text").attr("x",2*(0,d.D7)().state.padding).attr("y",(0,d.D7)().state.textHeight+2*(0,d.D7)().state.padding).attr("font-size",(0,d.D7)().state.fontSize).attr("class","state-title").text(e.id),i=a.node().getBBox();return t.insert("rect",":first-child").attr("x",(0,d.D7)().state.padding).attr("y",(0,d.D7)().state.padding).attr("width",i.width+2*(0,d.D7)().state.padding).attr("height",i.height+2*(0,d.D7)().state.padding).attr("rx",(0,d.D7)().state.radius),a}),"drawSimpleState"),w=(0,d.K2)(((t,e)=>{const a=(0,d.K2)((function(t,e,a){const i=t.append("tspan").attr("x",2*(0,d.D7)().state.padding).text(e);a||i.attr("dy",(0,d.D7)().state.textHeight)}),"addTspan"),i=t.append("text").attr("x",2*(0,d.D7)().state.padding).attr("y",(0,d.D7)().state.textHeight+1.3*(0,d.D7)().state.padding).attr("font-size",(0,d.D7)().state.fontSize).attr("class","state-title").text(e.descriptions[0]).node().getBBox(),n=i.height,r=t.append("text").attr("x",(0,d.D7)().state.padding).attr("y",n+.4*(0,d.D7)().state.padding+(0,d.D7)().state.dividerMargin+(0,d.D7)().state.textHeight).attr("class","state-description");let s=!0,o=!0;e.descriptions.forEach((function(t){s||(a(r,t,o),o=!1),s=!1}));const g=t.append("line").attr("x1",(0,d.D7)().state.padding).attr("y1",(0,d.D7)().state.padding+n+(0,d.D7)().state.dividerMargin/2).attr("y2",(0,d.D7)().state.padding+n+(0,d.D7)().state.dividerMargin/2).attr("class","descr-divider"),p=r.node().getBBox(),c=Math.max(p.width,i.width);return g.attr("x2",c+3*(0,d.D7)().state.padding),t.insert("rect",":first-child").attr("x",(0,d.D7)().state.padding).attr("y",(0,d.D7)().state.padding).attr("width",c+2*(0,d.D7)().state.padding).attr("height",p.height+n+2*(0,d.D7)().state.padding).attr("rx",(0,d.D7)().state.radius),t}),"drawDescrState"),m=(0,d.K2)(((t,e,a)=>{const i=(0,d.D7)().state.padding,n=2*(0,d.D7)().state.padding,r=t.node().getBBox(),s=r.width,o=r.x,g=t.append("text").attr("x",0).attr("y",(0,d.D7)().state.titleShift).attr("font-size",(0,d.D7)().state.fontSize).attr("class","state-title").text(e.id),p=g.node().getBBox().width+n;let c,h=Math.max(p,s);h===s&&(h+=n);const l=t.node().getBBox();e.doc,c=o-i,p>s&&(c=(s-h)/2+i),Math.abs(o-l.x)s&&(c=o-(p-s)/2);const x=1-(0,d.D7)().state.textHeight;return t.insert("rect",":first-child").attr("x",c).attr("y",x).attr("class",a?"alt-composit":"composit").attr("width",h).attr("height",l.height+(0,d.D7)().state.textHeight+(0,d.D7)().state.titleShift+1).attr("rx","0"),g.attr("x",c+i),p<=s&&g.attr("x",o+(h-n)/2-p/2+i),t.insert("rect",":first-child").attr("x",c).attr("y",(0,d.D7)().state.titleShift-(0,d.D7)().state.textHeight-(0,d.D7)().state.padding).attr("width",h).attr("height",3*(0,d.D7)().state.textHeight).attr("rx",(0,d.D7)().state.radius),t.insert("rect",":first-child").attr("x",c).attr("y",(0,d.D7)().state.titleShift-(0,d.D7)().state.textHeight-(0,d.D7)().state.padding).attr("width",h).attr("height",l.height+3+2*(0,d.D7)().state.textHeight).attr("rx",(0,d.D7)().state.radius),t}),"addTitleAndBox"),b=(0,d.K2)((t=>(t.append("circle").attr("class","end-state-outer").attr("r",(0,d.D7)().state.sizeUnit+(0,d.D7)().state.miniPadding).attr("cx",(0,d.D7)().state.padding+(0,d.D7)().state.sizeUnit+(0,d.D7)().state.miniPadding).attr("cy",(0,d.D7)().state.padding+(0,d.D7)().state.sizeUnit+(0,d.D7)().state.miniPadding),t.append("circle").attr("class","end-state-inner").attr("r",(0,d.D7)().state.sizeUnit).attr("cx",(0,d.D7)().state.padding+(0,d.D7)().state.sizeUnit+2).attr("cy",(0,d.D7)().state.padding+(0,d.D7)().state.sizeUnit+2))),"drawEndState"),B=(0,d.K2)(((t,e)=>{let a=(0,d.D7)().state.forkWidth,i=(0,d.D7)().state.forkHeight;if(e.parentId){let t=a;a=i,i=t}return t.append("rect").style("stroke","black").style("fill","black").attr("width",a).attr("height",i).attr("x",(0,d.D7)().state.padding).attr("y",(0,d.D7)().state.padding)}),"drawForkJoinState"),k=(0,d.K2)(((t,e,a,i)=>{let n=0;const r=i.append("text");r.style("text-anchor","start"),r.attr("class","noteText");let s=t.replace(/\r\n/g,"
");s=s.replace(/\n/g,"
");const o=s.split(d.Y2.lineBreakRegex);let g=1.25*(0,d.D7)().state.noteMargin;for(const p of o){const t=p.trim();if(t.length>0){const i=r.append("tspan");if(i.text(t),0===g){g+=i.node().getBBox().height}n+=g,i.attr("x",e+(0,d.D7)().state.noteMargin),i.attr("y",a+n+1.25*(0,d.D7)().state.noteMargin)}}return{textWidth:r.node().getBBox().width,textHeight:n}}),"_drawLongText"),S=(0,d.K2)(((t,e)=>{e.attr("class","state-note");const a=e.append("rect").attr("x",0).attr("y",(0,d.D7)().state.padding),i=e.append("g"),{textWidth:n,textHeight:r}=k(t,0,0,i);return a.attr("height",r+2*(0,d.D7)().state.noteMargin),a.attr("width",n+2*(0,d.D7)().state.noteMargin),a}),"drawNote"),N=(0,d.K2)((function(t,e){const a=e.id,i={id:a,label:e.id,width:0,height:0},n=t.append("g").attr("id",a).attr("class","stateGroup");"start"===e.type&&u(n),"end"===e.type&&b(n),"fork"!==e.type&&"join"!==e.type||B(n,e),"note"===e.type&&S(e.note.text,n),"divider"===e.type&&f(n),"default"===e.type&&0===e.descriptions.length&&y(n,e),"default"===e.type&&e.descriptions.length>0&&w(n,e);const r=n.node().getBBox();return i.width=r.width+2*(0,d.D7)().state.padding,i.height=r.height+2*(0,d.D7)().state.padding,D.set(a,i),i}),"drawState"),E=0,K=(0,d.K2)((function(t,e,a){const i=(0,d.K2)((function(t){switch(t){case n.u4.relationType.AGGREGATION:return"aggregation";case n.u4.relationType.EXTENSION:return"extension";case n.u4.relationType.COMPOSITION:return"composition";case n.u4.relationType.DEPENDENCY:return"dependency"}}),"getRelationType");e.points=e.points.filter((t=>!Number.isNaN(t.y)));const o=e.points,g=(0,s.n8j)().x((function(t){return t.x})).y((function(t){return t.y})).curve(s.qrM),p=t.append("path").attr("d",g(o)).attr("id","edge"+E).attr("class","transition");let c="";if((0,d.D7)().state.arrowMarkerAbsolute&&(c=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,c=c.replace(/\(/g,"\\("),c=c.replace(/\)/g,"\\)")),p.attr("marker-end","url("+c+"#"+i(n.u4.relationType.DEPENDENCY)+"End)"),void 0!==a.title){const i=t.append("g").attr("class","stateLabel"),{x:n,y:s}=r._K.calcLabelPosition(e.points),o=d.Y2.getRows(a.title);let g=0;const p=[];let c=0,h=0;for(let t=0;t<=o.length;t++){const e=i.append("text").attr("text-anchor","middle").text(o[t]).attr("x",n).attr("y",s+g),a=e.node().getBBox();if(c=Math.max(c,a.width),h=Math.min(h,a.x),d.Rm.info(a.x,n,s+g),0===g){const t=e.node().getBBox();g=t.height,d.Rm.info("Title height",g,s)}p.push(e)}let l=g*o.length;if(o.length>1){const t=(o.length-1)*g*.5;p.forEach(((e,a)=>e.attr("y",s+a*g-t))),l=g*o.length}const x=i.node().getBBox();i.insert("rect",":first-child").attr("class","box").attr("x",n-c/2-(0,d.D7)().state.padding/2).attr("y",s-l/2-(0,d.D7)().state.padding/2-3.5).attr("width",c+(0,d.D7)().state.padding).attr("height",l+(0,d.D7)().state.padding),d.Rm.info(x)}E++}),"drawEdge"),M={},v=(0,d.K2)((function(){}),"setConf"),R=(0,d.K2)((function(t){t.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"),z=(0,d.K2)((function(t,e,a,n){i=(0,d.D7)().state;const r=(0,d.D7)().securityLevel;let o;"sandbox"===r&&(o=(0,s.Ltv)("#i"+e));const g="sandbox"===r?(0,s.Ltv)(o.nodes()[0].contentDocument.body):(0,s.Ltv)("body"),p="sandbox"===r?o.nodes()[0].contentDocument:document;d.Rm.debug("Rendering diagram "+t);const c=g.select(`[id='${e}']`);R(c);const h=n.db.getRootDoc();T(h,c,void 0,!1,g,p,n);const l=i.padding,x=c.node().getBBox(),D=x.width+2*l,u=x.height+2*l,f=1.75*D;(0,d.a$)(c,u,f,i.useMaxWidth),c.attr("viewBox",`${x.x-i.padding} ${x.y-i.padding} `+D+" "+u)}),"draw"),H=(0,d.K2)((t=>t?t.length*i.fontSizeFactor:1),"getLabelWidth"),T=(0,d.K2)(((t,e,a,n,r,s,p)=>{const c=new g.T({compound:!0,multigraph:!0});let h,l=!0;for(h=0;h{const e=t.parentElement;let a=0,i=0;e&&(e.parentElement&&(a=e.parentElement.getBBox().width),i=parseInt(e.getAttribute("data-x-shift"),10),Number.isNaN(i)&&(i=0)),t.setAttribute("x1",0-i+8),t.setAttribute("x2",a-i-8)}))}else d.Rm.debug("No Node "+t+": "+JSON.stringify(c.node(t)))}));let w=y.getBBox();c.edges().forEach((function(t){void 0!==t&&void 0!==c.edge(t)&&(d.Rm.debug("Edge "+t.v+" -> "+t.w+": "+JSON.stringify(c.edge(t))),K(e,c.edge(t),c.edge(t).relation))})),w=y.getBBox();const b={id:a||"root",label:a||"root",width:0,height:0};return b.width=w.width+2*i.padding,b.height=w.height+2*i.padding,d.Rm.debug("Doc rendered",b,c),b}),"renderDoc"),L={setConf:v,draw:z},A={parser:n.Zk,get db(){return new n.u4(1)},renderer:L,styles:n.tM,init:(0,d.K2)((t=>{t.state||(t.state={}),t.state.arrowMarkerAbsolute=t.arrowMarkerAbsolute}),"init")}}}]); -//# sourceMappingURL=147.660f25b1.chunk.js.map \ No newline at end of file diff --git a/frontend/deployed/static/js/147.660f25b1.chunk.js.map b/frontend/deployed/static/js/147.660f25b1.chunk.js.map deleted file mode 100644 index 1c8048b..0000000 --- a/frontend/deployed/static/js/147.660f25b1.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"static/js/147.660f25b1.chunk.js","mappings":"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","sources":["../node_modules/mermaid/dist/chunks/mermaid.core/stateDiagram-DGXRK772.mjs"],"sourcesContent":["import {\n StateDB,\n stateDiagram_default,\n styles_default\n} from \"./chunk-AEK57VVT.mjs\";\nimport \"./chunk-RZ5BOZE2.mjs\";\nimport \"./chunk-TYCBKAJE.mjs\";\nimport \"./chunk-IIMUDSI4.mjs\";\nimport \"./chunk-VV3M67IP.mjs\";\nimport \"./chunk-HRU6DDCH.mjs\";\nimport \"./chunk-K557N5IZ.mjs\";\nimport \"./chunk-H2D2JQ3I.mjs\";\nimport \"./chunk-C3MQ5ANM.mjs\";\nimport {\n utils_default\n} from \"./chunk-O4NI6UNU.mjs\";\nimport {\n __name,\n common_default,\n configureSvgSize,\n getConfig2 as getConfig,\n log\n} from \"./chunk-YTJNT7DU.mjs\";\n\n// src/diagrams/state/stateRenderer.js\nimport { 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\";\n\n// src/diagrams/state/shapes.js\nimport { line, curveBasis } from \"d3\";\n\n// src/diagrams/state/id-cache.js\nvar idCache = {};\nvar set = /* @__PURE__ */ __name((key, val) => {\n idCache[key] = val;\n}, \"set\");\nvar get = /* @__PURE__ */ __name((k) => idCache[k], \"get\");\nvar keys = /* @__PURE__ */ __name(() => Object.keys(idCache), \"keys\");\nvar size = /* @__PURE__ */ __name(() => keys().length, \"size\");\nvar id_cache_default = {\n get,\n set,\n keys,\n size\n};\n\n// src/diagrams/state/shapes.js\nvar 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\");\nvar 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\");\nvar drawSimpleState = /* @__PURE__ */ __name((g, stateDef) => {\n 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);\n const classBox = state.node().getBBox();\n 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);\n return state;\n}, \"drawSimpleState\");\nvar drawDescrState = /* @__PURE__ */ __name((g, stateDef) => {\n const addTspan = /* @__PURE__ */ __name(function(textEl, txt, isFirst2) {\n const tSpan = textEl.append(\"tspan\").attr(\"x\", 2 * getConfig().state.padding).text(txt);\n if (!isFirst2) {\n tSpan.attr(\"dy\", getConfig().state.textHeight);\n }\n }, \"addTspan\");\n 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]);\n const titleBox = title.node().getBBox();\n const titleHeight = titleBox.height;\n const description = g.append(\"text\").attr(\"x\", getConfig().state.padding).attr(\n \"y\",\n titleHeight + getConfig().state.padding * 0.4 + getConfig().state.dividerMargin + getConfig().state.textHeight\n ).attr(\"class\", \"state-description\");\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 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\");\n const descrBox = description.node().getBBox();\n const width = Math.max(descrBox.width, titleBox.width);\n descrLine.attr(\"x2\", width + 3 * getConfig().state.padding);\n 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);\n return g;\n}, \"drawDescrState\");\nvar addTitleAndBox = /* @__PURE__ */ __name((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 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);\n const titleBox = title.node().getBBox();\n const titleWidth = titleBox.width + dblPad;\n let width = Math.max(titleWidth, orgWidth);\n if (width === orgWidth) {\n width = width + dblPad;\n }\n let startX;\n const graphBox = g.node().getBBox();\n if (stateDef.doc) {\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 const lineY = 1 - getConfig().state.textHeight;\n g.insert(\"rect\", \":first-child\").attr(\"x\", startX).attr(\"y\", lineY).attr(\"class\", altBkg ? \"alt-composit\" : \"composit\").attr(\"width\", width).attr(\n \"height\",\n graphBox.height + getConfig().state.textHeight + getConfig().state.titleShift + 1\n ).attr(\"rx\", \"0\");\n title.attr(\"x\", startX + pad);\n if (titleWidth <= orgWidth) {\n title.attr(\"x\", orgX + (width - dblPad) / 2 - titleWidth / 2 + pad);\n }\n g.insert(\"rect\", \":first-child\").attr(\"x\", startX).attr(\n \"y\",\n getConfig().state.titleShift - getConfig().state.textHeight - getConfig().state.padding\n ).attr(\"width\", width).attr(\"height\", getConfig().state.textHeight * 3).attr(\"rx\", getConfig().state.radius);\n g.insert(\"rect\", \":first-child\").attr(\"x\", startX).attr(\n \"y\",\n getConfig().state.titleShift - getConfig().state.textHeight - getConfig().state.padding\n ).attr(\"width\", width).attr(\"height\", graphBox.height + 3 + 2 * getConfig().state.textHeight).attr(\"rx\", getConfig().state.radius);\n return g;\n}, \"addTitleAndBox\");\nvar drawEndState = /* @__PURE__ */ __name((g) => {\n g.append(\"circle\").attr(\"class\", \"end-state-outer\").attr(\"r\", getConfig().state.sizeUnit + getConfig().state.miniPadding).attr(\n \"cx\",\n getConfig().state.padding + getConfig().state.sizeUnit + getConfig().state.miniPadding\n ).attr(\n \"cy\",\n getConfig().state.padding + getConfig().state.sizeUnit + getConfig().state.miniPadding\n );\n 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);\n}, \"drawEndState\");\nvar drawForkJoinState = /* @__PURE__ */ __name((g, stateDef) => {\n let width = getConfig().state.forkWidth;\n let height = getConfig().state.forkHeight;\n if (stateDef.parentId) {\n let tmp = width;\n width = height;\n height = tmp;\n }\n 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);\n}, \"drawForkJoinState\");\nvar _drawLongText = /* @__PURE__ */ __name((_text, x, y, g) => {\n let textHeight = 0;\n const textElem = g.append(\"text\");\n textElem.style(\"text-anchor\", \"start\");\n textElem.attr(\"class\", \"noteText\");\n let text = _text.replace(/\\r\\n/g, \"
\");\n text = text.replace(/\\n/g, \"
\");\n const lines = text.split(common_default.lineBreakRegex);\n let tHeight = 1.25 * getConfig().state.noteMargin;\n for (const line2 of lines) {\n const txt = line2.trim();\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}, \"_drawLongText\");\nvar drawNote = /* @__PURE__ */ __name((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 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 return note;\n}, \"drawNote\");\nvar drawState = /* @__PURE__ */ __name(function(elem, stateDef) {\n const id = stateDef.id;\n const stateInfo = {\n id,\n label: stateDef.id,\n width: 0,\n height: 0\n };\n const g = elem.append(\"g\").attr(\"id\", id).attr(\"class\", \"stateGroup\");\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 const stateBox = g.node().getBBox();\n stateInfo.width = stateBox.width + 2 * getConfig().state.padding;\n stateInfo.height = stateBox.height + 2 * getConfig().state.padding;\n id_cache_default.set(id, stateInfo);\n return stateInfo;\n}, \"drawState\");\nvar edgeCount = 0;\nvar drawEdge = /* @__PURE__ */ __name(function(elem, path, relation) {\n const getRelationType = /* @__PURE__ */ __name(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 }, \"getRelationType\");\n path.points = path.points.filter((p) => !Number.isNaN(p.y));\n const lineData = path.points;\n const lineFunction = line().x(function(d) {\n return d.x;\n }).y(function(d) {\n return d.y;\n }).curve(curveBasis);\n const svgPath = elem.append(\"path\").attr(\"d\", lineFunction(lineData)).attr(\"id\", \"edge\" + edgeCount).attr(\"class\", \"transition\");\n let url = \"\";\n if (getConfig().state.arrowMarkerAbsolute) {\n url = window.location.protocol + \"//\" + window.location.host + window.location.pathname + window.location.search;\n url = url.replace(/\\(/g, \"\\\\(\");\n url = url.replace(/\\)/g, \"\\\\)\");\n }\n svgPath.attr(\n \"marker-end\",\n \"url(\" + url + \"#\" + getRelationType(StateDB.relationType.DEPENDENCY) + \"End)\"\n );\n if (relation.title !== void 0) {\n const label = elem.append(\"g\").attr(\"class\", \"stateLabel\");\n const { x, y } = utils_default.calcLabelPosition(path.points);\n const rows = common_default.getRows(relation.title);\n let titleHeight = 0;\n const titleRows = [];\n let maxWidth = 0;\n let minX = 0;\n for (let i = 0; i <= rows.length; i++) {\n const title = label.append(\"text\").attr(\"text-anchor\", \"middle\").text(rows[i]).attr(\"x\", x).attr(\"y\", y + titleHeight);\n const boundsTmp = title.node().getBBox();\n maxWidth = Math.max(maxWidth, boundsTmp.width);\n minX = Math.min(minX, boundsTmp.x);\n log.info(boundsTmp.x, x, y + titleHeight);\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 let boxHeight = titleHeight * rows.length;\n if (rows.length > 1) {\n const heightAdj = (rows.length - 1) * titleHeight * 0.5;\n titleRows.forEach((title, i) => title.attr(\"y\", y + i * titleHeight - heightAdj));\n boxHeight = titleHeight * rows.length;\n }\n const bounds = label.node().getBBox();\n 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);\n log.info(bounds);\n }\n edgeCount++;\n}, \"drawEdge\");\n\n// src/diagrams/state/stateRenderer.js\nvar conf;\nvar transformationLog = {};\nvar setConf = /* @__PURE__ */ __name(function() {\n}, \"setConf\");\nvar insertMarkers = /* @__PURE__ */ __name(function(elem) {\n 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\");\n}, \"insertMarkers\");\nvar draw = /* @__PURE__ */ __name(function(text, id, _version, diagObj) {\n conf = getConfig().state;\n const securityLevel = getConfig().securityLevel;\n let sandboxElement;\n if (securityLevel === \"sandbox\") {\n sandboxElement = select(\"#i\" + id);\n }\n const root = securityLevel === \"sandbox\" ? select(sandboxElement.nodes()[0].contentDocument.body) : select(\"body\");\n const doc = securityLevel === \"sandbox\" ? sandboxElement.nodes()[0].contentDocument : document;\n log.debug(\"Rendering diagram \" + text);\n const diagram2 = root.select(`[id='${id}']`);\n insertMarkers(diagram2);\n const rootDoc = diagObj.db.getRootDoc();\n renderDoc(rootDoc, diagram2, void 0, false, root, doc, diagObj);\n const padding = conf.padding;\n const bounds = diagram2.node().getBBox();\n const width = bounds.width + padding * 2;\n const height = bounds.height + padding * 2;\n const svgWidth = width * 1.75;\n configureSvgSize(diagram2, height, svgWidth, conf.useMaxWidth);\n diagram2.attr(\n \"viewBox\",\n `${bounds.x - conf.padding} ${bounds.y - conf.padding} ` + width + \" \" + height\n );\n}, \"draw\");\nvar getLabelWidth = /* @__PURE__ */ __name((text) => {\n return text ? text.length * conf.fontSizeFactor : 1;\n}, \"getLabelWidth\");\nvar renderDoc = /* @__PURE__ */ __name((doc, diagram2, parentId, altBkg, root, domDocument, diagObj) => {\n const graph = new graphlib.Graph({\n compound: true,\n multigraph: true\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 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 graph.setDefaultEdgeLabel(function() {\n return {};\n });\n const states = diagObj.db.getStates();\n const relations = diagObj.db.getRelations();\n const keys2 = Object.keys(states);\n let first = true;\n for (const key of keys2) {\n const stateDef = states[key];\n if (parentId) {\n stateDef.parentId = parentId;\n }\n let node;\n if (stateDef.doc) {\n let sub = diagram2.append(\"g\").attr(\"id\", stateDef.id).attr(\"class\", \"stateGroup\");\n node = renderDoc(stateDef.doc, sub, stateDef.id, !altBkg, root, domDocument, diagObj);\n if (first) {\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 let boxBounds = sub.node().getBBox();\n node.width = boxBounds.width;\n node.height = boxBounds.height;\n }\n } else {\n node = drawState(diagram2, stateDef, graph);\n }\n if (stateDef.note) {\n const noteDef = {\n descriptions: [],\n id: stateDef.id + \"-note\",\n note: stateDef.note,\n type: \"note\"\n };\n const note = drawState(diagram2, noteDef, graph);\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.setParent(node.id, node.id + \"-group\");\n graph.setParent(node.id + \"-note\", node.id + \"-group\");\n } else {\n graph.setNode(node.id, node);\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,\n width: getLabelWidth(relation.title),\n height: conf.labelHeight * common_default.getRows(relation.title).length,\n labelpos: \"c\"\n },\n \"id\" + cnt\n );\n });\n dagreLayout(graph);\n log.debug(\"Graph after layout\", graph.nodes());\n const svgElem = diagram2.node();\n graph.nodes().forEach(function(v) {\n if (v !== void 0 && graph.node(v) !== void 0) {\n log.warn(\"Node \" + v + \": \" + JSON.stringify(graph.node(v)));\n root.select(\"#\" + svgElem.id + \" #\" + v).attr(\n \"transform\",\n \"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) + \" )\"\n );\n root.select(\"#\" + svgElem.id + \" #\" + v).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 let stateBox = svgElem.getBBox();\n graph.edges().forEach(function(e) {\n if (e !== void 0 && graph.edge(e) !== void 0) {\n log.debug(\"Edge \" + e.v + \" -> \" + e.w + \": \" + JSON.stringify(graph.edge(e)));\n drawEdge(diagram2, graph.edge(e), graph.edge(e).relation);\n }\n });\n stateBox = svgElem.getBBox();\n const stateInfo = {\n id: parentId ? parentId : \"root\",\n label: parentId ? parentId : \"root\",\n width: 0,\n height: 0\n };\n stateInfo.width = stateBox.width + 2 * conf.padding;\n stateInfo.height = stateBox.height + 2 * conf.padding;\n log.debug(\"Doc rendered\", stateInfo, graph);\n return stateInfo;\n}, \"renderDoc\");\nvar stateRenderer_default = {\n setConf,\n draw\n};\n\n// src/diagrams/state/stateDiagram.ts\nvar diagram = {\n parser: stateDiagram_default,\n get db() {\n return new StateDB(1);\n },\n renderer: stateRenderer_default,\n styles: styles_default,\n init: /* @__PURE__ */ __name((cnf) => {\n if (!cnf.state) {\n cnf.state = {};\n }\n cnf.state.arrowMarkerAbsolute = cnf.arrowMarkerAbsolute;\n }, \"init\")\n};\nexport {\n diagram\n};\n"],"names":["conf","idCache","set","__name","key","val","get","k","keys","Object","size","length","id_cache_default","drawStartState","g","append","attr","getConfig","state","sizeUnit","padding","drawDivider","style","textHeight","drawSimpleState","stateDef","fontSize","text","id","classBox","node","getBBox","insert","width","height","radius","drawDescrState","addTspan","textEl","txt","isFirst2","tSpan","titleBox","descriptions","titleHeight","description","dividerMargin","isFirst","isSecond","forEach","descr","descrLine","descrBox","Math","max","addTitleAndBox","altBkg","pad","dblPad","orgBox","orgWidth","orgX","x","title","titleShift","titleWidth","startX","graphBox","doc","abs","lineY","drawEndState","miniPadding","drawForkJoinState","forkWidth","forkHeight","parentId","tmp","_drawLongText","_text","y","textElem","replace","lines","split","common_default","lineBreakRegex","tHeight","noteMargin","line2","trim","span","textWidth","drawNote","note","rectElem","drawState","elem","stateInfo","label","type","stateBox","edgeCount","drawEdge","path","relation","getRelationType","StateDB","relationType","AGGREGATION","EXTENSION","COMPOSITION","DEPENDENCY","points","filter","p","Number","isNaN","lineData","lineFunction","line","d","curve","curveBasis","svgPath","url","arrowMarkerAbsolute","window","location","protocol","host","pathname","search","utils_default","calcLabelPosition","rows","getRows","titleRows","maxWidth","minX","i","boundsTmp","min","log","info","push","boxHeight","heightAdj","bounds","transformationLog","setConf","insertMarkers","draw","_version","diagObj","securityLevel","sandboxElement","select","root","nodes","contentDocument","body","document","debug","diagram2","rootDoc","db","getRootDoc","renderDoc","svgWidth","configureSvgSize","useMaxWidth","getLabelWidth","fontSizeFactor","domDocument","graph","graphlib","compound","multigraph","edgeFreeDoc","stmt","setGraph","rankdir","ranker","ranksep","edgeLengthFactor","nodeSep","isMultiGraph","setDefaultEdgeLabel","states","getStates","relations","getRelations","keys2","sub","boxBounds","compositTitleSize","noteDef","position","setNode","setParent","nodeCount","cnt","setEdge","id1","id2","labelHeight","labelpos","dagreLayout","svgElem","v","warn","JSON","stringify","querySelectorAll","divider","parent","parentElement","pWidth","pShift","parseInt","getAttribute","setAttribute","edges","e","edge","w","stateRenderer_default","diagram","parser","stateDiagram_default","renderer","styles","styles_default","init","cnf"],"sourceRoot":""} \ No newline at end of file diff --git a/frontend/deployed/static/js/203.e56567f8.chunk.js b/frontend/deployed/static/js/203.e56567f8.chunk.js deleted file mode 100644 index 3b4dcde..0000000 --- a/frontend/deployed/static/js/203.e56567f8.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunkbackstory=self.webpackChunkbackstory||[]).push([[203],{5203:(t,e,i)=>{i.d(e,{diagram:()=>v});var a=i(3759),n=i(700),s=function(){var t=(0,a.K2)((function(t,e,i,a){for(i=i||{},a=t.length;a--;i[t[a]]=e);return i}),"o"),e=[1,3],i=[1,4],n=[1,5],s=[1,6],r=[1,7],o=[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],l=[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],h=[55,56,57],c=[2,36],d=[1,37],u=[1,36],x=[1,38],f=[1,35],g=[1,43],y=[1,41],p=[1,14],T=[1,23],m=[1,18],q=[1,19],A=[1,20],_=[1,21],b=[1,22],S=[1,24],k=[1,25],F=[1,26],P=[1,27],C=[1,28],L=[1,29],v=[1,32],I=[1,33],E=[1,34],D=[1,39],z=[1,40],w=[1,42],K=[1,44],U=[1,62],N=[1,61],R=[4,5,8,10,12,13,14,18,44,47,49,55,56,57,63,64,65,66,67],B=[1,65],W=[1,66],$=[1,67],Q=[1,68],O=[1,69],X=[1,70],H=[1,71],M=[1,72],Y=[1,73],j=[1,74],G=[1,75],V=[1,76],Z=[4,5,6,7,8,9,10,11,12,13,14,15,18],J=[1,90],tt=[1,91],et=[1,92],it=[1,99],at=[1,93],nt=[1,96],st=[1,94],rt=[1,95],ot=[1,97],lt=[1,98],ht=[1,102],ct=[10,55,56,57],dt=[4,5,6,8,10,11,13,17,18,19,20,55,56,57],ut={trace:(0,a.K2)((function(){}),"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:(0,a.K2)((function(t,e,i,a,n,s,r){var o=s.length-1;switch(n){case 23:case 68:this.$=s[o];break;case 24:case 69:this.$=s[o-1]+""+s[o];break;case 26:this.$=s[o-1]+s[o];break;case 27:this.$=[s[o].trim()];break;case 28:s[o-2].push(s[o].trim()),this.$=s[o-2];break;case 29:this.$=s[o-4],a.addClass(s[o-2],s[o]);break;case 37:this.$=[];break;case 42:this.$=s[o].trim(),a.setDiagramTitle(this.$);break;case 43:this.$=s[o].trim(),a.setAccTitle(this.$);break;case 44:case 45:this.$=s[o].trim(),a.setAccDescription(this.$);break;case 46:a.addSection(s[o].substr(8)),this.$=s[o].substr(8);break;case 47:a.addPoint(s[o-3],"",s[o-1],s[o],[]);break;case 48:a.addPoint(s[o-4],s[o-3],s[o-1],s[o],[]);break;case 49:a.addPoint(s[o-4],"",s[o-2],s[o-1],s[o]);break;case 50:a.addPoint(s[o-5],s[o-4],s[o-2],s[o-1],s[o]);break;case 51:a.setXAxisLeftText(s[o-2]),a.setXAxisRightText(s[o]);break;case 52:s[o-1].text+=" \u27f6 ",a.setXAxisLeftText(s[o-1]);break;case 53:a.setXAxisLeftText(s[o]);break;case 54:a.setYAxisBottomText(s[o-2]),a.setYAxisTopText(s[o]);break;case 55:s[o-1].text+=" \u27f6 ",a.setYAxisBottomText(s[o-1]);break;case 56:a.setYAxisBottomText(s[o]);break;case 57:a.setQuadrant1Text(s[o]);break;case 58:a.setQuadrant2Text(s[o]);break;case 59:a.setQuadrant3Text(s[o]);break;case 60:a.setQuadrant4Text(s[o]);break;case 64:case 66:this.$={text:s[o],type:"text"};break;case 65:this.$={text:s[o-1].text+""+s[o],type:s[o-1].type};break;case 67:this.$={text:s[o],type:"markdown"}}}),"anonymous"),table:[{18:e,26:1,27:2,28:i,55:n,56:s,57:r},{1:[3]},{18:e,26:8,27:2,28:i,55:n,56:s,57:r},{18:e,26:9,27:2,28:i,55:n,56:s,57:r},t(o,[2,33],{29:10}),t(l,[2,61]),t(l,[2,62]),t(l,[2,63]),{1:[2,30]},{1:[2,31]},t(h,c,{30:11,31:12,24:13,32:15,33:16,34:17,43:30,58:31,1:[2,32],4:d,5:u,10:x,12:f,13:g,14:y,18:p,25:T,35:m,37:q,39:A,41:_,42:b,48:S,50:k,51:F,52:P,53:C,54:L,60:v,61:I,63:E,64:D,65:z,66:w,67:K}),t(o,[2,34]),{27:45,55:n,56:s,57:r},t(h,[2,37]),t(h,c,{24:13,32:15,33:16,34:17,43:30,58:31,31:46,4:d,5:u,10:x,12:f,13:g,14:y,18:p,25:T,35:m,37:q,39:A,41:_,42:b,48:S,50:k,51:F,52:P,53:C,54:L,60:v,61:I,63:E,64:D,65:z,66:w,67:K}),t(h,[2,39]),t(h,[2,40]),t(h,[2,41]),{36:[1,47]},{38:[1,48]},{40:[1,49]},t(h,[2,45]),t(h,[2,46]),{18:[1,50]},{4:d,5:u,10:x,12:f,13:g,14:y,43:51,58:31,60:v,61:I,63:E,64:D,65:z,66:w,67:K},{4:d,5:u,10:x,12:f,13:g,14:y,43:52,58:31,60:v,61:I,63:E,64:D,65:z,66:w,67:K},{4:d,5:u,10:x,12:f,13:g,14:y,43:53,58:31,60:v,61:I,63:E,64:D,65:z,66:w,67:K},{4:d,5:u,10:x,12:f,13:g,14:y,43:54,58:31,60:v,61:I,63:E,64:D,65:z,66:w,67:K},{4:d,5:u,10:x,12:f,13:g,14:y,43:55,58:31,60:v,61:I,63:E,64:D,65:z,66:w,67:K},{4:d,5:u,10:x,12:f,13:g,14:y,43:56,58:31,60:v,61:I,63:E,64:D,65:z,66:w,67:K},{4:d,5:u,8:U,10:x,12:f,13:g,14:y,18:N,44:[1,57],47:[1,58],58:60,59:59,63:E,64:D,65:z,66:w,67:K},t(R,[2,64]),t(R,[2,66]),t(R,[2,67]),t(R,[2,70]),t(R,[2,71]),t(R,[2,72]),t(R,[2,73]),t(R,[2,74]),t(R,[2,75]),t(R,[2,76]),t(R,[2,77]),t(R,[2,78]),t(R,[2,79]),t(R,[2,80]),t(o,[2,35]),t(h,[2,38]),t(h,[2,42]),t(h,[2,43]),t(h,[2,44]),{3:64,4:B,5:W,6:$,7:Q,8:O,9:X,10:H,11:M,12:Y,13:j,14:G,15:V,21:63},t(h,[2,53],{59:59,58:60,4:d,5:u,8:U,10:x,12:f,13:g,14:y,18:N,49:[1,77],63:E,64:D,65:z,66:w,67:K}),t(h,[2,56],{59:59,58:60,4:d,5:u,8:U,10:x,12:f,13:g,14:y,18:N,49:[1,78],63:E,64:D,65:z,66:w,67:K}),t(h,[2,57],{59:59,58:60,4:d,5:u,8:U,10:x,12:f,13:g,14:y,18:N,63:E,64:D,65:z,66:w,67:K}),t(h,[2,58],{59:59,58:60,4:d,5:u,8:U,10:x,12:f,13:g,14:y,18:N,63:E,64:D,65:z,66:w,67:K}),t(h,[2,59],{59:59,58:60,4:d,5:u,8:U,10:x,12:f,13:g,14:y,18:N,63:E,64:D,65:z,66:w,67:K}),t(h,[2,60],{59:59,58:60,4:d,5:u,8:U,10:x,12:f,13:g,14:y,18:N,63:E,64:D,65:z,66:w,67:K}),{45:[1,79]},{44:[1,80]},t(R,[2,65]),t(R,[2,81]),t(R,[2,82]),t(R,[2,83]),{3:82,4:B,5:W,6:$,7:Q,8:O,9:X,10:H,11:M,12:Y,13:j,14:G,15:V,18:[1,81]},t(Z,[2,23]),t(Z,[2,1]),t(Z,[2,2]),t(Z,[2,3]),t(Z,[2,4]),t(Z,[2,5]),t(Z,[2,6]),t(Z,[2,7]),t(Z,[2,8]),t(Z,[2,9]),t(Z,[2,10]),t(Z,[2,11]),t(Z,[2,12]),t(h,[2,52],{58:31,43:83,4:d,5:u,10:x,12:f,13:g,14:y,60:v,61:I,63:E,64:D,65:z,66:w,67:K}),t(h,[2,55],{58:31,43:84,4:d,5:u,10:x,12:f,13:g,14:y,60:v,61:I,63:E,64:D,65:z,66:w,67:K}),{46:[1,85]},{45:[1,86]},{4:J,5:tt,6:et,8:it,11:at,13:nt,16:89,17:st,18:rt,19:ot,20:lt,22:88,23:87},t(Z,[2,24]),t(h,[2,51],{59:59,58:60,4:d,5:u,8:U,10:x,12:f,13:g,14:y,18:N,63:E,64:D,65:z,66:w,67:K}),t(h,[2,54],{59:59,58:60,4:d,5:u,8:U,10:x,12:f,13:g,14:y,18:N,63:E,64:D,65:z,66:w,67:K}),t(h,[2,47],{22:88,16:89,23:100,4:J,5:tt,6:et,8:it,11:at,13:nt,17:st,18:rt,19:ot,20:lt}),{46:[1,101]},t(h,[2,29],{10:ht}),t(ct,[2,27],{16:103,4:J,5:tt,6:et,8:it,11:at,13:nt,17:st,18:rt,19:ot,20:lt}),t(dt,[2,25]),t(dt,[2,13]),t(dt,[2,14]),t(dt,[2,15]),t(dt,[2,16]),t(dt,[2,17]),t(dt,[2,18]),t(dt,[2,19]),t(dt,[2,20]),t(dt,[2,21]),t(dt,[2,22]),t(h,[2,49],{10:ht}),t(h,[2,48],{22:88,16:89,23:104,4:J,5:tt,6:et,8:it,11:at,13:nt,17:st,18:rt,19:ot,20:lt}),{4:J,5:tt,6:et,8:it,11:at,13:nt,16:89,17:st,18:rt,19:ot,20:lt,22:105},t(dt,[2,26]),t(h,[2,50],{10:ht}),t(ct,[2,28],{16:103,4:J,5:tt,6:et,8:it,11:at,13:nt,17:st,18:rt,19:ot,20:lt})],defaultActions:{8:[2,30],9:[2,31]},parseError:(0,a.K2)((function(t,e){if(!e.recoverable){var i=new Error(t);throw i.hash=e,i}this.trace(t)}),"parseError"),parse:(0,a.K2)((function(t){var e=this,i=[0],n=[],s=[null],r=[],o=this.table,l="",h=0,c=0,d=0,u=r.slice.call(arguments,1),x=Object.create(this.lexer),f={yy:{}};for(var g in this.yy)Object.prototype.hasOwnProperty.call(this.yy,g)&&(f.yy[g]=this.yy[g]);x.setInput(t,f.yy),f.yy.lexer=x,f.yy.parser=this,"undefined"==typeof x.yylloc&&(x.yylloc={});var y=x.yylloc;r.push(y);var p=x.options&&x.options.ranges;function T(){var t;return"number"!==typeof(t=n.pop()||x.lex()||1)&&(t instanceof Array&&(t=(n=t).pop()),t=e.symbols_[t]||t),t}"function"===typeof f.yy.parseError?this.parseError=f.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError,(0,a.K2)((function(t){i.length=i.length-2*t,s.length=s.length-t,r.length=r.length-t}),"popStack"),(0,a.K2)(T,"lex");for(var m,q,A,_,b,S,k,F,P,C={};;){if(A=i[i.length-1],this.defaultActions[A]?_=this.defaultActions[A]:(null!==m&&"undefined"!=typeof m||(m=T()),_=o[A]&&o[A][m]),"undefined"===typeof _||!_.length||!_[0]){var L="";for(S in P=[],o[A])this.terminals_[S]&&S>2&&P.push("'"+this.terminals_[S]+"'");L=x.showPosition?"Parse error on line "+(h+1)+":\n"+x.showPosition()+"\nExpecting "+P.join(", ")+", got '"+(this.terminals_[m]||m)+"'":"Parse error on line "+(h+1)+": Unexpected "+(1==m?"end of input":"'"+(this.terminals_[m]||m)+"'"),this.parseError(L,{text:x.match,token:this.terminals_[m]||m,line:x.yylineno,loc:y,expected:P})}if(_[0]instanceof Array&&_.length>1)throw new Error("Parse Error: multiple actions possible at state: "+A+", token: "+m);switch(_[0]){case 1:i.push(m),s.push(x.yytext),r.push(x.yylloc),i.push(_[1]),m=null,q?(m=q,q=null):(c=x.yyleng,l=x.yytext,h=x.yylineno,y=x.yylloc,d>0&&d--);break;case 2:if(k=this.productions_[_[1]][1],C.$=s[s.length-k],C._$={first_line:r[r.length-(k||1)].first_line,last_line:r[r.length-1].last_line,first_column:r[r.length-(k||1)].first_column,last_column:r[r.length-1].last_column},p&&(C._$.range=[r[r.length-(k||1)].range[0],r[r.length-1].range[1]]),"undefined"!==typeof(b=this.performAction.apply(C,[l,c,h,f.yy,_[1],s,r].concat(u))))return b;k&&(i=i.slice(0,-1*k*2),s=s.slice(0,-1*k),r=r.slice(0,-1*k)),i.push(this.productions_[_[1]][0]),s.push(C.$),r.push(C._$),F=o[i[i.length-2]][i[i.length-1]],i.push(F);break;case 3:return!0}}return!0}),"parse")},xt=function(){return{EOF:1,parseError:(0,a.K2)((function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)}),"parseError"),setInput:(0,a.K2)((function(t,e){return this.yy=e||this.yy||{},this._input=t,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:(0,a.K2)((function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t}),"input"),unput:(0,a.K2)((function(t){var e=t.length,i=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var a=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),i.length-1&&(this.yylineno-=i.length-1);var n=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:i?(i.length===a.length?this.yylloc.first_column:0)+a[a.length-i.length].length-i[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[n[0],n[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this}),"unput"),more:(0,a.K2)((function(){return this._more=!0,this}),"more"),reject:(0,a.K2)((function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):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})}),"reject"),less:(0,a.K2)((function(t){this.unput(this.match.slice(t))}),"less"),pastInput:(0,a.K2)((function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")}),"pastInput"),upcomingInput:(0,a.K2)((function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")}),"upcomingInput"),showPosition:(0,a.K2)((function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"}),"showPosition"),test_match:(0,a.K2)((function(t,e){var i,a,n;if(this.options.backtrack_lexer&&(n={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&&(n.yylloc.range=this.yylloc.range.slice(0))),(a=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=a.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:a?a[a.length-1].length-a[a.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,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(t[0].length),this.matched+=t[0],i=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),i)return i;if(this._backtrack){for(var s in n)this[s]=n[s];return!1}return!1}),"test_match"),next:(0,a.K2)((function(){if(this.done)return this.EOF;var t,e,i,a;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var n=this._currentRules(),s=0;se[0].length)){if(e=i,a=s,this.options.backtrack_lexer){if(!1!==(t=this.test_match(i,n[s])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,n[a]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})}),"next"),lex:(0,a.K2)((function(){var t=this.next();return t||this.lex()}),"lex"),begin:(0,a.K2)((function(t){this.conditionStack.push(t)}),"begin"),popState:(0,a.K2)((function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]}),"popState"),_currentRules:(0,a.K2)((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:(0,a.K2)((function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"}),"topState"),pushState:(0,a.K2)((function(t){this.begin(t)}),"pushState"),stateStackSize:(0,a.K2)((function(){return this.conditionStack.length}),"stateStackSize"),options:{"case-insensitive":!0},performAction:(0,a.K2)((function(t,e,i,a){switch(i){case 0:case 1:case 3:break;case 2:return 55;case 4:return this.begin("title"),35;case 5:return this.popState(),"title_value";case 6:return this.begin("acc_title"),37;case 7:return this.popState(),"acc_title_value";case 8:return this.begin("acc_descr"),39;case 9:return this.popState(),"acc_descr_value";case 10:this.begin("acc_descr_multiline");break;case 11:case 23:case 25:case 31:this.popState();break;case 12:return"acc_descr_multiline_value";case 13:return 48;case 14:return 50;case 15:return 49;case 16:return 51;case 17:return 52;case 18:return 53;case 19:return 54;case 20:return 25;case 21:this.begin("md_string");break;case 22:return"MD_STR";case 24:this.begin("string");break;case 26:return"STR";case 27:this.begin("class_name");break;case 28:return this.popState(),47;case 29:return this.begin("point_start"),44;case 30:return this.begin("point_x"),45;case 32:this.popState(),this.begin("point_y");break;case 33:return this.popState(),46;case 34:return 28;case 35:return 4;case 36:return 11;case 37:return 64;case 38:return 10;case 39:case 40:return 65;case 41:return 14;case 42:return 13;case 43:return 67;case 44:return 66;case 45:return 12;case 46:return 8;case 47:return 5;case 48:return 18;case 49:return 56;case 50:return 63;case 51:return 57}}),"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:!1},point_y:{rules:[33],inclusive:!1},point_x:{rules:[32],inclusive:!1},point_start:{rules:[30,31],inclusive:!1},acc_descr_multiline:{rules:[11,12],inclusive:!1},acc_descr:{rules:[9],inclusive:!1},acc_title:{rules:[7],inclusive:!1},title:{rules:[5],inclusive:!1},md_string:{rules:[22,23],inclusive:!1},string:{rules:[25,26],inclusive:!1},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:!0}}}}();function ft(){this.yy={}}return ut.lexer=xt,(0,a.K2)(ft,"Parser"),ft.prototype=ut,ut.Parser=ft,new ft}();s.parser=s;var r=s,o=(0,a.P$)(),l=class{constructor(){this.classes=new Map,this.config=this.getDefaultConfig(),this.themeConfig=this.getDefaultThemeConfig(),this.data=this.getDefaultData()}static#t=(()=>(0,a.K2)(this,"QuadrantBuilder"))();getDefaultData(){return{titleText:"",quadrant1Text:"",quadrant2Text:"",quadrant3Text:"",quadrant4Text:"",xAxisLeftText:"",xAxisRightText:"",yAxisBottomText:"",yAxisTopText:"",points:[]}}getDefaultConfig(){return{showXAxis:!0,showYAxis:!0,showTitle:!0,chartHeight:a.UI.quadrantChart?.chartWidth||500,chartWidth:a.UI.quadrantChart?.chartHeight||500,titlePadding:a.UI.quadrantChart?.titlePadding||10,titleFontSize:a.UI.quadrantChart?.titleFontSize||20,quadrantPadding:a.UI.quadrantChart?.quadrantPadding||5,xAxisLabelPadding:a.UI.quadrantChart?.xAxisLabelPadding||5,yAxisLabelPadding:a.UI.quadrantChart?.yAxisLabelPadding||5,xAxisLabelFontSize:a.UI.quadrantChart?.xAxisLabelFontSize||16,yAxisLabelFontSize:a.UI.quadrantChart?.yAxisLabelFontSize||16,quadrantLabelFontSize:a.UI.quadrantChart?.quadrantLabelFontSize||16,quadrantTextTopPadding:a.UI.quadrantChart?.quadrantTextTopPadding||5,pointTextPadding:a.UI.quadrantChart?.pointTextPadding||5,pointLabelFontSize:a.UI.quadrantChart?.pointLabelFontSize||12,pointRadius:a.UI.quadrantChart?.pointRadius||5,xAxisPosition:a.UI.quadrantChart?.xAxisPosition||"top",yAxisPosition:a.UI.quadrantChart?.yAxisPosition||"left",quadrantInternalBorderStrokeWidth:a.UI.quadrantChart?.quadrantInternalBorderStrokeWidth||1,quadrantExternalBorderStrokeWidth:a.UI.quadrantChart?.quadrantExternalBorderStrokeWidth||2}}getDefaultThemeConfig(){return{quadrant1Fill:o.quadrant1Fill,quadrant2Fill:o.quadrant2Fill,quadrant3Fill:o.quadrant3Fill,quadrant4Fill:o.quadrant4Fill,quadrant1TextFill:o.quadrant1TextFill,quadrant2TextFill:o.quadrant2TextFill,quadrant3TextFill:o.quadrant3TextFill,quadrant4TextFill:o.quadrant4TextFill,quadrantPointFill:o.quadrantPointFill,quadrantPointTextFill:o.quadrantPointTextFill,quadrantXAxisTextFill:o.quadrantXAxisTextFill,quadrantYAxisTextFill:o.quadrantYAxisTextFill,quadrantTitleFill:o.quadrantTitleFill,quadrantInternalBorderStrokeFill:o.quadrantInternalBorderStrokeFill,quadrantExternalBorderStrokeFill:o.quadrantExternalBorderStrokeFill}}clear(){this.config=this.getDefaultConfig(),this.themeConfig=this.getDefaultThemeConfig(),this.data=this.getDefaultData(),this.classes=new Map,a.Rm.info("clear called")}setData(t){this.data={...this.data,...t}}addPoints(t){this.data.points=[...t,...this.data.points]}addClass(t,e){this.classes.set(t,e)}setConfig(t){a.Rm.trace("setConfig called with: ",t),this.config={...this.config,...t}}setThemeConfig(t){a.Rm.trace("setThemeConfig called with: ",t),this.themeConfig={...this.themeConfig,...t}}calculateSpace(t,e,i,a){const n=2*this.config.xAxisLabelPadding+this.config.xAxisLabelFontSize,s={top:"top"===t&&e?n:0,bottom:"bottom"===t&&e?n:0},r=2*this.config.yAxisLabelPadding+this.config.yAxisLabelFontSize,o={left:"left"===this.config.yAxisPosition&&i?r:0,right:"right"===this.config.yAxisPosition&&i?r:0},l=this.config.titleFontSize+2*this.config.titlePadding,h={top:a?l:0},c=this.config.quadrantPadding+o.left,d=this.config.quadrantPadding+s.top+h.top,u=this.config.chartWidth-2*this.config.quadrantPadding-o.left-o.right,x=this.config.chartHeight-2*this.config.quadrantPadding-s.top-s.bottom-h.top;return{xAxisSpace:s,yAxisSpace:o,titleSpace:h,quadrantSpace:{quadrantLeft:c,quadrantTop:d,quadrantWidth:u,quadrantHalfWidth:u/2,quadrantHeight:x,quadrantHalfHeight:x/2}}}getAxisLabels(t,e,i,a){const{quadrantSpace:n,titleSpace:s}=a,{quadrantHalfHeight:r,quadrantHeight:o,quadrantLeft:l,quadrantHalfWidth:h,quadrantTop:c,quadrantWidth:d}=n,u=Boolean(this.data.xAxisRightText),x=Boolean(this.data.yAxisTopText),f=[];return this.data.xAxisLeftText&&e&&f.push({text:this.data.xAxisLeftText,fill:this.themeConfig.quadrantXAxisTextFill,x:l+(u?h/2:0),y:"top"===t?this.config.xAxisLabelPadding+s.top:this.config.xAxisLabelPadding+c+o+this.config.quadrantPadding,fontSize:this.config.xAxisLabelFontSize,verticalPos:u?"center":"left",horizontalPos:"top",rotation:0}),this.data.xAxisRightText&&e&&f.push({text:this.data.xAxisRightText,fill:this.themeConfig.quadrantXAxisTextFill,x:l+h+(u?h/2:0),y:"top"===t?this.config.xAxisLabelPadding+s.top:this.config.xAxisLabelPadding+c+o+this.config.quadrantPadding,fontSize:this.config.xAxisLabelFontSize,verticalPos:u?"center":"left",horizontalPos:"top",rotation:0}),this.data.yAxisBottomText&&i&&f.push({text:this.data.yAxisBottomText,fill:this.themeConfig.quadrantYAxisTextFill,x:"left"===this.config.yAxisPosition?this.config.yAxisLabelPadding:this.config.yAxisLabelPadding+l+d+this.config.quadrantPadding,y:c+o-(x?r/2:0),fontSize:this.config.yAxisLabelFontSize,verticalPos:x?"center":"left",horizontalPos:"top",rotation:-90}),this.data.yAxisTopText&&i&&f.push({text:this.data.yAxisTopText,fill:this.themeConfig.quadrantYAxisTextFill,x:"left"===this.config.yAxisPosition?this.config.yAxisLabelPadding:this.config.yAxisLabelPadding+l+d+this.config.quadrantPadding,y:c+r-(x?r/2:0),fontSize:this.config.yAxisLabelFontSize,verticalPos:x?"center":"left",horizontalPos:"top",rotation:-90}),f}getQuadrants(t){const{quadrantSpace:e}=t,{quadrantHalfHeight:i,quadrantLeft:a,quadrantHalfWidth:n,quadrantTop:s}=e,r=[{text:{text:this.data.quadrant1Text,fill:this.themeConfig.quadrant1TextFill,x:0,y:0,fontSize:this.config.quadrantLabelFontSize,verticalPos:"center",horizontalPos:"middle",rotation:0},x:a+n,y:s,width:n,height:i,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:a,y:s,width:n,height:i,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:a,y:s+i,width:n,height:i,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:a+n,y:s+i,width:n,height:i,fill:this.themeConfig.quadrant4Fill}];for(const o of r)o.text.x=o.x+o.width/2,0===this.data.points.length?(o.text.y=o.y+o.height/2,o.text.horizontalPos="middle"):(o.text.y=o.y+this.config.quadrantTextTopPadding,o.text.horizontalPos="top");return r}getQuadrantPoints(t){const{quadrantSpace:e}=t,{quadrantHeight:i,quadrantLeft:a,quadrantTop:s,quadrantWidth:r}=e,o=(0,n.m4Y)().domain([0,1]).range([a,r+a]),l=(0,n.m4Y)().domain([0,1]).range([i+s,s]);return this.data.points.map((t=>{const e=this.classes.get(t.className);e&&(t={...e,...t});return{x:o(t.x),y:l(t.y),fill:t.color??this.themeConfig.quadrantPointFill,radius:t.radius??this.config.pointRadius,text:{text:t.text,fill:this.themeConfig.quadrantPointTextFill,x:o(t.x),y:l(t.y)+this.config.pointTextPadding,verticalPos:"center",horizontalPos:"top",fontSize:this.config.pointLabelFontSize,rotation:0},strokeColor:t.strokeColor??this.themeConfig.quadrantPointFill,strokeWidth:t.strokeWidth??"0px"}}))}getBorders(t){const e=this.config.quadrantExternalBorderStrokeWidth/2,{quadrantSpace:i}=t,{quadrantHalfHeight:a,quadrantHeight:n,quadrantLeft:s,quadrantHalfWidth:r,quadrantTop:o,quadrantWidth:l}=i;return[{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:s-e,y1:o,x2:s+l+e,y2:o},{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:s+l,y1:o+e,x2:s+l,y2:o+n-e},{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:s-e,y1:o+n,x2:s+l+e,y2:o+n},{strokeFill:this.themeConfig.quadrantExternalBorderStrokeFill,strokeWidth:this.config.quadrantExternalBorderStrokeWidth,x1:s,y1:o+e,x2:s,y2:o+n-e},{strokeFill:this.themeConfig.quadrantInternalBorderStrokeFill,strokeWidth:this.config.quadrantInternalBorderStrokeWidth,x1:s+r,y1:o+e,x2:s+r,y2:o+n-e},{strokeFill:this.themeConfig.quadrantInternalBorderStrokeFill,strokeWidth:this.config.quadrantInternalBorderStrokeWidth,x1:s+e,y1:o+a,x2:s+l-e,y2:o+a}]}getTitle(t){if(t)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}}build(){const t=this.config.showXAxis&&!(!this.data.xAxisLeftText&&!this.data.xAxisRightText),e=this.config.showYAxis&&!(!this.data.yAxisTopText&&!this.data.yAxisBottomText),i=this.config.showTitle&&!!this.data.titleText,a=this.data.points.length>0?"bottom":this.config.xAxisPosition,n=this.calculateSpace(a,t,e,i);return{points:this.getQuadrantPoints(n),quadrants:this.getQuadrants(n),axisLabels:this.getAxisLabels(a,t,e,n),borderLines:this.getBorders(n),title:this.getTitle(i)}}},h=class extends Error{static#t=(()=>(0,a.K2)(this,"InvalidStyleError"))();constructor(t,e,i){super(`value for ${t} ${e} is invalid, please use a valid ${i}`),this.name="InvalidStyleError"}};function c(t){return!/^#?([\dA-Fa-f]{6}|[\dA-Fa-f]{3})$/.test(t)}function d(t){return!/^\d+$/.test(t)}function u(t){return!/^\d+px$/.test(t)}(0,a.K2)(c,"validateHexCode"),(0,a.K2)(d,"validateNumber"),(0,a.K2)(u,"validateSizeInPixels");var x=(0,a.D7)();function f(t){return(0,a.jZ)(t.trim(),x)}(0,a.K2)(f,"textSanitizer");var g=new l;function y(t){g.setData({quadrant1Text:f(t.text)})}function p(t){g.setData({quadrant2Text:f(t.text)})}function T(t){g.setData({quadrant3Text:f(t.text)})}function m(t){g.setData({quadrant4Text:f(t.text)})}function q(t){g.setData({xAxisLeftText:f(t.text)})}function A(t){g.setData({xAxisRightText:f(t.text)})}function _(t){g.setData({yAxisTopText:f(t.text)})}function b(t){g.setData({yAxisBottomText:f(t.text)})}function S(t){const e={};for(const i of t){const[t,a]=i.trim().split(/\s*:\s*/);if("radius"===t){if(d(a))throw new h(t,a,"number");e.radius=parseInt(a)}else if("color"===t){if(c(a))throw new h(t,a,"hex code");e.color=a}else if("stroke-color"===t){if(c(a))throw new h(t,a,"hex code");e.strokeColor=a}else{if("stroke-width"!==t)throw new Error(`style named ${t} is not supported.`);if(u(a))throw new h(t,a,"number of pixels (eg. 10px)");e.strokeWidth=a}}return e}function k(t,e,i,a,n){const s=S(n);g.addPoints([{x:i,y:a,text:f(t.text),className:e,...s}])}function F(t,e){g.addClass(t,S(e))}function P(t){g.setConfig({chartWidth:t})}function C(t){g.setConfig({chartHeight:t})}function L(){const t=(0,a.D7)(),{themeVariables:e,quadrantChart:i}=t;return i&&g.setConfig(i),g.setThemeConfig({quadrant1Fill:e.quadrant1Fill,quadrant2Fill:e.quadrant2Fill,quadrant3Fill:e.quadrant3Fill,quadrant4Fill:e.quadrant4Fill,quadrant1TextFill:e.quadrant1TextFill,quadrant2TextFill:e.quadrant2TextFill,quadrant3TextFill:e.quadrant3TextFill,quadrant4TextFill:e.quadrant4TextFill,quadrantPointFill:e.quadrantPointFill,quadrantPointTextFill:e.quadrantPointTextFill,quadrantXAxisTextFill:e.quadrantXAxisTextFill,quadrantYAxisTextFill:e.quadrantYAxisTextFill,quadrantExternalBorderStrokeFill:e.quadrantExternalBorderStrokeFill,quadrantInternalBorderStrokeFill:e.quadrantInternalBorderStrokeFill,quadrantTitleFill:e.quadrantTitleFill}),g.setData({titleText:(0,a.ab)()}),g.build()}(0,a.K2)(y,"setQuadrant1Text"),(0,a.K2)(p,"setQuadrant2Text"),(0,a.K2)(T,"setQuadrant3Text"),(0,a.K2)(m,"setQuadrant4Text"),(0,a.K2)(q,"setXAxisLeftText"),(0,a.K2)(A,"setXAxisRightText"),(0,a.K2)(_,"setYAxisTopText"),(0,a.K2)(b,"setYAxisBottomText"),(0,a.K2)(S,"parseStyles"),(0,a.K2)(k,"addPoint"),(0,a.K2)(F,"addClass"),(0,a.K2)(P,"setWidth"),(0,a.K2)(C,"setHeight"),(0,a.K2)(L,"getQuadrantData");var v={parser:r,db:{setWidth:P,setHeight:C,setQuadrant1Text:y,setQuadrant2Text:p,setQuadrant3Text:T,setQuadrant4Text:m,setXAxisLeftText:q,setXAxisRightText:A,setYAxisTopText:_,setYAxisBottomText:b,parseStyles:S,addPoint:k,addClass:F,getQuadrantData:L,clear:(0,a.K2)((function(){g.clear(),(0,a.IU)()}),"clear"),setAccTitle:a.SV,getAccTitle:a.iN,setDiagramTitle:a.ke,getDiagramTitle:a.ab,getAccDescription:a.m7,setAccDescription:a.EI},renderer:{draw:(0,a.K2)(((t,e,i,s)=>{function r(t){return"top"===t?"hanging":"middle"}function o(t){return"left"===t?"start":"middle"}function l(t){return`translate(${t.x}, ${t.y}) rotate(${t.rotation||0})`}(0,a.K2)(r,"getDominantBaseLine"),(0,a.K2)(o,"getTextAnchor"),(0,a.K2)(l,"getTransformation");const h=(0,a.D7)();a.Rm.debug("Rendering quadrant chart\n"+t);const c=h.securityLevel;let d;"sandbox"===c&&(d=(0,n.Ltv)("#i"+e));const u=("sandbox"===c?(0,n.Ltv)(d.nodes()[0].contentDocument.body):(0,n.Ltv)("body")).select(`[id="${e}"]`),x=u.append("g").attr("class","main"),f=h.quadrantChart?.chartWidth??500,g=h.quadrantChart?.chartHeight??500;(0,a.a$)(u,g,f,h.quadrantChart?.useMaxWidth??!0),u.attr("viewBox","0 0 "+f+" "+g),s.db.setHeight(g),s.db.setWidth(f);const y=s.db.getQuadrantData(),p=x.append("g").attr("class","quadrants"),T=x.append("g").attr("class","border"),m=x.append("g").attr("class","data-points"),q=x.append("g").attr("class","labels"),A=x.append("g").attr("class","title");y.title&&A.append("text").attr("x",0).attr("y",0).attr("fill",y.title.fill).attr("font-size",y.title.fontSize).attr("dominant-baseline",r(y.title.horizontalPos)).attr("text-anchor",o(y.title.verticalPos)).attr("transform",l(y.title)).text(y.title.text),y.borderLines&&T.selectAll("line").data(y.borderLines).enter().append("line").attr("x1",(t=>t.x1)).attr("y1",(t=>t.y1)).attr("x2",(t=>t.x2)).attr("y2",(t=>t.y2)).style("stroke",(t=>t.strokeFill)).style("stroke-width",(t=>t.strokeWidth));const _=p.selectAll("g.quadrant").data(y.quadrants).enter().append("g").attr("class","quadrant");_.append("rect").attr("x",(t=>t.x)).attr("y",(t=>t.y)).attr("width",(t=>t.width)).attr("height",(t=>t.height)).attr("fill",(t=>t.fill)),_.append("text").attr("x",0).attr("y",0).attr("fill",(t=>t.text.fill)).attr("font-size",(t=>t.text.fontSize)).attr("dominant-baseline",(t=>r(t.text.horizontalPos))).attr("text-anchor",(t=>o(t.text.verticalPos))).attr("transform",(t=>l(t.text))).text((t=>t.text.text));q.selectAll("g.label").data(y.axisLabels).enter().append("g").attr("class","label").append("text").attr("x",0).attr("y",0).text((t=>t.text)).attr("fill",(t=>t.fill)).attr("font-size",(t=>t.fontSize)).attr("dominant-baseline",(t=>r(t.horizontalPos))).attr("text-anchor",(t=>o(t.verticalPos))).attr("transform",(t=>l(t)));const b=m.selectAll("g.data-point").data(y.points).enter().append("g").attr("class","data-point");b.append("circle").attr("cx",(t=>t.x)).attr("cy",(t=>t.y)).attr("r",(t=>t.radius)).attr("fill",(t=>t.fill)).attr("stroke",(t=>t.strokeColor)).attr("stroke-width",(t=>t.strokeWidth)),b.append("text").attr("x",0).attr("y",0).text((t=>t.text.text)).attr("fill",(t=>t.text.fill)).attr("font-size",(t=>t.text.fontSize)).attr("dominant-baseline",(t=>r(t.text.horizontalPos))).attr("text-anchor",(t=>o(t.text.verticalPos))).attr("transform",(t=>l(t.text)))}),"draw")},styles:(0,a.K2)((()=>""),"styles")}}}]); -//# sourceMappingURL=203.e56567f8.chunk.js.map \ No newline at end of file diff --git a/frontend/deployed/static/js/203.e56567f8.chunk.js.map b/frontend/deployed/static/js/203.e56567f8.chunk.js.map deleted file mode 100644 index c5c8b6e..0000000 --- a/frontend/deployed/static/js/203.e56567f8.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"static/js/203.e56567f8.chunk.js","mappings":"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","sources":["../node_modules/mermaid/dist/chunks/mermaid.core/quadrantDiagram-7GDLP6J5.mjs"],"sourcesContent":["import {\n __name,\n clear,\n configureSvgSize,\n defaultConfig_default,\n getAccDescription,\n getAccTitle,\n getConfig2 as getConfig,\n getDiagramTitle,\n getThemeVariables,\n log,\n sanitizeText,\n setAccDescription,\n setAccTitle,\n setDiagramTitle\n} from \"./chunk-YTJNT7DU.mjs\";\n\n// src/diagrams/quadrant-chart/parser/quadrant.jison\nvar parser = function() {\n var o = /* @__PURE__ */ __name(function(k, v, o2, l) {\n for (o2 = o2 || {}, l = k.length; l--; o2[k[l]] = v) ;\n return o2;\n }, \"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];\n var parser2 = {\n trace: /* @__PURE__ */ __name(function trace() {\n }, \"trace\"),\n yy: {},\n 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 },\n 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\" },\n 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]],\n performAction: /* @__PURE__ */ __name(function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) {\n var $0 = $$.length - 1;\n switch (yystate) {\n case 23:\n this.$ = $$[$0];\n break;\n case 24:\n this.$ = $$[$0 - 1] + \"\" + $$[$0];\n break;\n case 26:\n this.$ = $$[$0 - 1] + $$[$0];\n break;\n case 27:\n this.$ = [$$[$0].trim()];\n break;\n case 28:\n $$[$0 - 2].push($$[$0].trim());\n this.$ = $$[$0 - 2];\n break;\n case 29:\n this.$ = $$[$0 - 4];\n yy.addClass($$[$0 - 2], $$[$0]);\n break;\n case 37:\n this.$ = [];\n break;\n case 42:\n this.$ = $$[$0].trim();\n yy.setDiagramTitle(this.$);\n break;\n case 43:\n this.$ = $$[$0].trim();\n yy.setAccTitle(this.$);\n break;\n case 44:\n case 45:\n this.$ = $$[$0].trim();\n yy.setAccDescription(this.$);\n break;\n case 46:\n yy.addSection($$[$0].substr(8));\n this.$ = $$[$0].substr(8);\n break;\n case 47:\n yy.addPoint($$[$0 - 3], \"\", $$[$0 - 1], $$[$0], []);\n break;\n case 48:\n yy.addPoint($$[$0 - 4], $$[$0 - 3], $$[$0 - 1], $$[$0], []);\n break;\n case 49:\n yy.addPoint($$[$0 - 4], \"\", $$[$0 - 2], $$[$0 - 1], $$[$0]);\n break;\n case 50:\n yy.addPoint($$[$0 - 5], $$[$0 - 4], $$[$0 - 2], $$[$0 - 1], $$[$0]);\n break;\n case 51:\n yy.setXAxisLeftText($$[$0 - 2]);\n yy.setXAxisRightText($$[$0]);\n break;\n case 52:\n $$[$0 - 1].text += \" \\u27F6 \";\n yy.setXAxisLeftText($$[$0 - 1]);\n break;\n case 53:\n yy.setXAxisLeftText($$[$0]);\n break;\n case 54:\n yy.setYAxisBottomText($$[$0 - 2]);\n yy.setYAxisTopText($$[$0]);\n break;\n case 55:\n $$[$0 - 1].text += \" \\u27F6 \";\n yy.setYAxisBottomText($$[$0 - 1]);\n break;\n case 56:\n yy.setYAxisBottomText($$[$0]);\n break;\n case 57:\n yy.setQuadrant1Text($$[$0]);\n break;\n case 58:\n yy.setQuadrant2Text($$[$0]);\n break;\n case 59:\n yy.setQuadrant3Text($$[$0]);\n break;\n case 60:\n yy.setQuadrant4Text($$[$0]);\n break;\n case 64:\n this.$ = { text: $$[$0], type: \"text\" };\n break;\n case 65:\n this.$ = { text: $$[$0 - 1].text + \"\" + $$[$0], type: $$[$0 - 1].type };\n break;\n case 66:\n this.$ = { text: $$[$0], type: \"text\" };\n break;\n case 67:\n this.$ = { text: $$[$0], type: \"markdown\" };\n break;\n case 68:\n this.$ = $$[$0];\n break;\n case 69:\n this.$ = $$[$0 - 1] + \"\" + $$[$0];\n break;\n }\n }, \"anonymous\"),\n 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 })],\n defaultActions: { 8: [2, 30], 9: [2, 31] },\n parseError: /* @__PURE__ */ __name(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 }, \"parseError\"),\n parse: /* @__PURE__ */ __name(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 lexer2 = 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 lexer2.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer2;\n sharedState.yy.parser = this;\n if (typeof lexer2.yylloc == \"undefined\") {\n lexer2.yylloc = {};\n }\n var yyloc = lexer2.yylloc;\n lstack.push(yyloc);\n var ranges = lexer2.options && lexer2.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 __name(popStack, \"popStack\");\n function lex() {\n var token;\n token = tstack.pop() || lexer2.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 __name(lex, \"lex\");\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 (lexer2.showPosition) {\n errStr = \"Parse error on line \" + (yylineno + 1) + \":\\n\" + lexer2.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: lexer2.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer2.yylineno,\n loc: yyloc,\n 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(lexer2.yytext);\n lstack.push(lexer2.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = lexer2.yyleng;\n yytext = lexer2.yytext;\n yylineno = lexer2.yylineno;\n yyloc = lexer2.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 }, \"parse\")\n };\n var lexer = /* @__PURE__ */ function() {\n var lexer2 = {\n EOF: 1,\n parseError: /* @__PURE__ */ __name(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 }, \"parseError\"),\n // resets the lexer, sets new input\n setInput: /* @__PURE__ */ __name(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 }, \"setInput\"),\n // consumes and returns one char from the input\n input: /* @__PURE__ */ __name(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 this._input = this._input.slice(1);\n return ch;\n }, \"input\"),\n // unshifts one char (or a string) into the input\n unput: /* @__PURE__ */ __name(function(ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - 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 if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\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 ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len\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 }, \"unput\"),\n // When called from action, caches matched text and appends it on next action\n more: /* @__PURE__ */ __name(function() {\n this._more = true;\n return this;\n }, \"more\"),\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.\n reject: /* @__PURE__ */ __name(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 return this;\n }, \"reject\"),\n // retain first n characters of the match\n less: /* @__PURE__ */ __name(function(n) {\n this.unput(this.match.slice(n));\n }, \"less\"),\n // displays already matched input, i.e. for error messages\n pastInput: /* @__PURE__ */ __name(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 }, \"pastInput\"),\n // displays upcoming input, i.e. for error messages\n upcomingInput: /* @__PURE__ */ __name(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 }, \"upcomingInput\"),\n // displays the character position where the lexing error occurred, i.e. for error messages\n showPosition: /* @__PURE__ */ __name(function() {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n }, \"showPosition\"),\n // test the lexed token: return FALSE when not a match, otherwise return token\n test_match: /* @__PURE__ */ __name(function(match, indexed_rule) {\n var token, lines, backup;\n if (this.options.backtrack_lexer) {\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 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 ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length : 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 for (var k in backup) {\n this[k] = backup[k];\n }\n return false;\n }\n return false;\n }, \"test_match\"),\n // return next match in input\n next: /* @__PURE__ */ __name(function() {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n var token, match, tempMatch, 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;\n } else {\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 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 }, \"next\"),\n // return next match that has a token\n lex: /* @__PURE__ */ __name(function lex() {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n }, \"lex\"),\n // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\n begin: /* @__PURE__ */ __name(function begin(condition) {\n this.conditionStack.push(condition);\n }, \"begin\"),\n // pop the previously active lexer condition state off the condition stack\n popState: /* @__PURE__ */ __name(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 }, \"popState\"),\n // produce the lexer rule set which is active for the currently active lexer condition state\n _currentRules: /* @__PURE__ */ __name(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 }, \"_currentRules\"),\n // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\n topState: /* @__PURE__ */ __name(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 }, \"topState\"),\n // alias for begin(condition)\n pushState: /* @__PURE__ */ __name(function pushState(condition) {\n this.begin(condition);\n }, \"pushState\"),\n // return the number of states currently on the stack\n stateStackSize: /* @__PURE__ */ __name(function stateStackSize() {\n return this.conditionStack.length;\n }, \"stateStackSize\"),\n options: { \"case-insensitive\": true },\n performAction: /* @__PURE__ */ __name(function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) {\n var YYSTATE = YY_START;\n switch ($avoiding_name_collisions) {\n case 0:\n break;\n case 1:\n break;\n case 2:\n return 55;\n break;\n case 3:\n break;\n case 4:\n this.begin(\"title\");\n return 35;\n break;\n case 5:\n this.popState();\n return \"title_value\";\n break;\n case 6:\n this.begin(\"acc_title\");\n return 37;\n break;\n case 7:\n this.popState();\n return \"acc_title_value\";\n break;\n case 8:\n this.begin(\"acc_descr\");\n return 39;\n break;\n case 9:\n this.popState();\n return \"acc_descr_value\";\n break;\n case 10:\n this.begin(\"acc_descr_multiline\");\n break;\n case 11:\n this.popState();\n break;\n case 12:\n return \"acc_descr_multiline_value\";\n break;\n case 13:\n return 48;\n break;\n case 14:\n return 50;\n break;\n case 15:\n return 49;\n break;\n case 16:\n return 51;\n break;\n case 17:\n return 52;\n break;\n case 18:\n return 53;\n break;\n case 19:\n return 54;\n break;\n case 20:\n return 25;\n break;\n case 21:\n this.begin(\"md_string\");\n break;\n case 22:\n return \"MD_STR\";\n break;\n case 23:\n this.popState();\n break;\n case 24:\n this.begin(\"string\");\n break;\n case 25:\n this.popState();\n break;\n case 26:\n return \"STR\";\n break;\n case 27:\n this.begin(\"class_name\");\n break;\n case 28:\n this.popState();\n return 47;\n break;\n case 29:\n this.begin(\"point_start\");\n return 44;\n break;\n case 30:\n this.begin(\"point_x\");\n return 45;\n break;\n case 31:\n this.popState();\n break;\n case 32:\n this.popState();\n this.begin(\"point_y\");\n break;\n case 33:\n this.popState();\n return 46;\n break;\n case 34:\n return 28;\n break;\n case 35:\n return 4;\n break;\n case 36:\n return 11;\n break;\n case 37:\n return 64;\n break;\n case 38:\n return 10;\n break;\n case 39:\n return 65;\n break;\n case 40:\n return 65;\n break;\n case 41:\n return 14;\n break;\n case 42:\n return 13;\n break;\n case 43:\n return 67;\n break;\n case 44:\n return 66;\n break;\n case 45:\n return 12;\n break;\n case 46:\n return 8;\n break;\n case 47:\n return 5;\n break;\n case 48:\n return 18;\n break;\n case 49:\n return 56;\n break;\n case 50:\n return 63;\n break;\n case 51:\n return 57;\n break;\n }\n }, \"anonymous\"),\n 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],\n 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 } }\n };\n return lexer2;\n }();\n parser2.lexer = lexer;\n function Parser() {\n this.yy = {};\n }\n __name(Parser, \"Parser\");\n Parser.prototype = parser2;\n parser2.Parser = Parser;\n return new Parser();\n}();\nparser.parser = parser;\nvar quadrant_default = parser;\n\n// src/diagrams/quadrant-chart/quadrantBuilder.ts\nimport { scaleLinear } from \"d3\";\nvar defaultThemeVariables = getThemeVariables();\nvar QuadrantBuilder = class {\n constructor() {\n this.classes = /* @__PURE__ */ new Map();\n this.config = this.getDefaultConfig();\n this.themeConfig = this.getDefaultThemeConfig();\n this.data = this.getDefaultData();\n }\n static {\n __name(this, \"QuadrantBuilder\");\n }\n getDefaultData() {\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 getDefaultConfig() {\n return {\n showXAxis: true,\n showYAxis: true,\n showTitle: true,\n chartHeight: defaultConfig_default.quadrantChart?.chartWidth || 500,\n chartWidth: defaultConfig_default.quadrantChart?.chartHeight || 500,\n titlePadding: defaultConfig_default.quadrantChart?.titlePadding || 10,\n titleFontSize: defaultConfig_default.quadrantChart?.titleFontSize || 20,\n quadrantPadding: defaultConfig_default.quadrantChart?.quadrantPadding || 5,\n xAxisLabelPadding: defaultConfig_default.quadrantChart?.xAxisLabelPadding || 5,\n yAxisLabelPadding: defaultConfig_default.quadrantChart?.yAxisLabelPadding || 5,\n xAxisLabelFontSize: defaultConfig_default.quadrantChart?.xAxisLabelFontSize || 16,\n yAxisLabelFontSize: defaultConfig_default.quadrantChart?.yAxisLabelFontSize || 16,\n quadrantLabelFontSize: defaultConfig_default.quadrantChart?.quadrantLabelFontSize || 16,\n quadrantTextTopPadding: defaultConfig_default.quadrantChart?.quadrantTextTopPadding || 5,\n pointTextPadding: defaultConfig_default.quadrantChart?.pointTextPadding || 5,\n pointLabelFontSize: defaultConfig_default.quadrantChart?.pointLabelFontSize || 12,\n pointRadius: defaultConfig_default.quadrantChart?.pointRadius || 5,\n xAxisPosition: defaultConfig_default.quadrantChart?.xAxisPosition || \"top\",\n yAxisPosition: defaultConfig_default.quadrantChart?.yAxisPosition || \"left\",\n quadrantInternalBorderStrokeWidth: defaultConfig_default.quadrantChart?.quadrantInternalBorderStrokeWidth || 1,\n quadrantExternalBorderStrokeWidth: defaultConfig_default.quadrantChart?.quadrantExternalBorderStrokeWidth || 2\n };\n }\n getDefaultThemeConfig() {\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 clear() {\n this.config = this.getDefaultConfig();\n this.themeConfig = this.getDefaultThemeConfig();\n this.data = this.getDefaultData();\n this.classes = /* @__PURE__ */ new Map();\n log.info(\"clear called\");\n }\n setData(data) {\n this.data = { ...this.data, ...data };\n }\n addPoints(points) {\n this.data.points = [...points, ...this.data.points];\n }\n addClass(className, styles) {\n this.classes.set(className, styles);\n }\n setConfig(config2) {\n log.trace(\"setConfig called with: \", config2);\n this.config = { ...this.config, ...config2 };\n }\n setThemeConfig(themeConfig) {\n log.trace(\"setThemeConfig called with: \", themeConfig);\n this.themeConfig = { ...this.themeConfig, ...themeConfig };\n }\n calculateSpace(xAxisPosition, showXAxis, showYAxis, showTitle) {\n const xAxisSpaceCalculation = 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 const yAxisSpaceCalculation = 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 const titleSpaceCalculation = this.config.titleFontSize + this.config.titlePadding * 2;\n const titleSpace = {\n top: showTitle ? titleSpaceCalculation : 0\n };\n const quadrantLeft = this.config.quadrantPadding + yAxisSpace.left;\n const quadrantTop = this.config.quadrantPadding + xAxisSpace.top + titleSpace.top;\n const quadrantWidth = this.config.chartWidth - this.config.quadrantPadding * 2 - yAxisSpace.left - yAxisSpace.right;\n const quadrantHeight = this.config.chartHeight - this.config.quadrantPadding * 2 - xAxisSpace.top - xAxisSpace.bottom - titleSpace.top;\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 return {\n xAxisSpace,\n yAxisSpace,\n titleSpace,\n quadrantSpace\n };\n }\n getAxisLabels(xAxisPosition, showXAxis, showYAxis, spaceData) {\n const { quadrantSpace, titleSpace } = spaceData;\n const {\n quadrantHalfHeight,\n quadrantHeight,\n quadrantLeft,\n quadrantHalfWidth,\n quadrantTop,\n quadrantWidth\n } = quadrantSpace;\n const drawXAxisLabelsInMiddle = Boolean(this.data.xAxisRightText);\n const drawYAxisLabelsInMiddle = Boolean(this.data.yAxisTopText);\n const axisLabels = [];\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: xAxisPosition === \"top\" ? this.config.xAxisLabelPadding + titleSpace.top : this.config.xAxisLabelPadding + quadrantTop + quadrantHeight + 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: xAxisPosition === \"top\" ? this.config.xAxisLabelPadding + titleSpace.top : this.config.xAxisLabelPadding + quadrantTop + quadrantHeight + 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.yAxisBottomText && showYAxis) {\n axisLabels.push({\n text: this.data.yAxisBottomText,\n fill: this.themeConfig.quadrantYAxisTextFill,\n x: this.config.yAxisPosition === \"left\" ? this.config.yAxisLabelPadding : this.config.yAxisLabelPadding + quadrantLeft + quadrantWidth + 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: this.config.yAxisPosition === \"left\" ? this.config.yAxisLabelPadding : this.config.yAxisLabelPadding + quadrantLeft + quadrantWidth + this.config.quadrantPadding,\n y: 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 getQuadrants(spaceData) {\n const { quadrantSpace } = spaceData;\n const { quadrantHalfHeight, quadrantLeft, quadrantHalfWidth, quadrantTop } = quadrantSpace;\n const quadrants = [\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 if (this.data.points.length === 0) {\n quadrant.text.y = quadrant.y + quadrant.height / 2;\n quadrant.text.horizontalPos = \"middle\";\n } else {\n quadrant.text.y = quadrant.y + this.config.quadrantTextTopPadding;\n quadrant.text.horizontalPos = \"top\";\n }\n }\n return quadrants;\n }\n getQuadrantPoints(spaceData) {\n const { quadrantSpace } = spaceData;\n const { quadrantHeight, quadrantLeft, quadrantTop, quadrantWidth } = quadrantSpace;\n const xAxis = scaleLinear().domain([0, 1]).range([quadrantLeft, quadrantWidth + quadrantLeft]);\n const yAxis = scaleLinear().domain([0, 1]).range([quadrantHeight + quadrantTop, quadrantTop]);\n const points = this.data.points.map((point) => {\n const classStyles = this.classes.get(point.className);\n if (classStyles) {\n point = { ...classStyles, ...point };\n }\n const props = {\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 getBorders(spaceData) {\n const halfExternalBorderWidth = this.config.quadrantExternalBorderStrokeWidth / 2;\n const { quadrantSpace } = spaceData;\n const {\n quadrantHalfHeight,\n quadrantHeight,\n quadrantLeft,\n quadrantHalfWidth,\n quadrantTop,\n quadrantWidth\n } = quadrantSpace;\n const borderLines = [\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 getTitle(showTitle) {\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 build() {\n const showXAxis = this.config.showXAxis && !!(this.data.xAxisLeftText || this.data.xAxisRightText);\n const showYAxis = this.config.showYAxis && !!(this.data.yAxisTopText || this.data.yAxisBottomText);\n const showTitle = this.config.showTitle && !!this.data.titleText;\n const xAxisPosition = this.data.points.length > 0 ? \"bottom\" : this.config.xAxisPosition;\n const calculatedSpace = this.calculateSpace(xAxisPosition, showXAxis, showYAxis, showTitle);\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\n// src/diagrams/quadrant-chart/utils.ts\nvar InvalidStyleError = class extends Error {\n static {\n __name(this, \"InvalidStyleError\");\n }\n constructor(style, value, type) {\n super(`value for ${style} ${value} is invalid, please use a valid ${type}`);\n this.name = \"InvalidStyleError\";\n }\n};\nfunction validateHexCode(value) {\n return !/^#?([\\dA-Fa-f]{6}|[\\dA-Fa-f]{3})$/.test(value);\n}\n__name(validateHexCode, \"validateHexCode\");\nfunction validateNumber(value) {\n return !/^\\d+$/.test(value);\n}\n__name(validateNumber, \"validateNumber\");\nfunction validateSizeInPixels(value) {\n return !/^\\d+px$/.test(value);\n}\n__name(validateSizeInPixels, \"validateSizeInPixels\");\n\n// src/diagrams/quadrant-chart/quadrantDb.ts\nvar config = getConfig();\nfunction textSanitizer(text) {\n return sanitizeText(text.trim(), config);\n}\n__name(textSanitizer, \"textSanitizer\");\nvar quadrantBuilder = new QuadrantBuilder();\nfunction setQuadrant1Text(textObj) {\n quadrantBuilder.setData({ quadrant1Text: textSanitizer(textObj.text) });\n}\n__name(setQuadrant1Text, \"setQuadrant1Text\");\nfunction setQuadrant2Text(textObj) {\n quadrantBuilder.setData({ quadrant2Text: textSanitizer(textObj.text) });\n}\n__name(setQuadrant2Text, \"setQuadrant2Text\");\nfunction setQuadrant3Text(textObj) {\n quadrantBuilder.setData({ quadrant3Text: textSanitizer(textObj.text) });\n}\n__name(setQuadrant3Text, \"setQuadrant3Text\");\nfunction setQuadrant4Text(textObj) {\n quadrantBuilder.setData({ quadrant4Text: textSanitizer(textObj.text) });\n}\n__name(setQuadrant4Text, \"setQuadrant4Text\");\nfunction setXAxisLeftText(textObj) {\n quadrantBuilder.setData({ xAxisLeftText: textSanitizer(textObj.text) });\n}\n__name(setXAxisLeftText, \"setXAxisLeftText\");\nfunction setXAxisRightText(textObj) {\n quadrantBuilder.setData({ xAxisRightText: textSanitizer(textObj.text) });\n}\n__name(setXAxisRightText, \"setXAxisRightText\");\nfunction setYAxisTopText(textObj) {\n quadrantBuilder.setData({ yAxisTopText: textSanitizer(textObj.text) });\n}\n__name(setYAxisTopText, \"setYAxisTopText\");\nfunction setYAxisBottomText(textObj) {\n quadrantBuilder.setData({ yAxisBottomText: textSanitizer(textObj.text) });\n}\n__name(setYAxisBottomText, \"setYAxisBottomText\");\nfunction parseStyles(styles) {\n const 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__name(parseStyles, \"parseStyles\");\nfunction addPoint(textObj, className, x, y, styles) {\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__name(addPoint, \"addPoint\");\nfunction addClass(className, styles) {\n quadrantBuilder.addClass(className, parseStyles(styles));\n}\n__name(addClass, \"addClass\");\nfunction setWidth(width) {\n quadrantBuilder.setConfig({ chartWidth: width });\n}\n__name(setWidth, \"setWidth\");\nfunction setHeight(height) {\n quadrantBuilder.setConfig({ chartHeight: height });\n}\n__name(setHeight, \"setHeight\");\nfunction getQuadrantData() {\n const config2 = getConfig();\n const { themeVariables, quadrantChart: quadrantChartConfig } = config2;\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__name(getQuadrantData, \"getQuadrantData\");\nvar clear2 = /* @__PURE__ */ __name(function() {\n quadrantBuilder.clear();\n clear();\n}, \"clear\");\nvar quadrantDb_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: clear2,\n setAccTitle,\n getAccTitle,\n setDiagramTitle,\n getDiagramTitle,\n getAccDescription,\n setAccDescription\n};\n\n// src/diagrams/quadrant-chart/quadrantRenderer.ts\nimport { select } from \"d3\";\nvar draw = /* @__PURE__ */ __name((txt, id, _version, diagObj) => {\n function getDominantBaseLine(horizontalPos) {\n return horizontalPos === \"top\" ? \"hanging\" : \"middle\";\n }\n __name(getDominantBaseLine, \"getDominantBaseLine\");\n function getTextAnchor(verticalPos) {\n return verticalPos === \"left\" ? \"start\" : \"middle\";\n }\n __name(getTextAnchor, \"getTextAnchor\");\n function getTransformation(data) {\n return `translate(${data.x}, ${data.y}) rotate(${data.rotation || 0})`;\n }\n __name(getTransformation, \"getTransformation\");\n const conf = getConfig();\n log.debug(\"Rendering quadrant chart\\n\" + txt);\n const securityLevel = conf.securityLevel;\n let sandboxElement;\n if (securityLevel === \"sandbox\") {\n sandboxElement = select(\"#i\" + id);\n }\n const root = securityLevel === \"sandbox\" ? select(sandboxElement.nodes()[0].contentDocument.body) : select(\"body\");\n const svg = root.select(`[id=\"${id}\"]`);\n const group = svg.append(\"g\").attr(\"class\", \"main\");\n const width = conf.quadrantChart?.chartWidth ?? 500;\n const height = conf.quadrantChart?.chartHeight ?? 500;\n configureSvgSize(svg, height, width, conf.quadrantChart?.useMaxWidth ?? true);\n svg.attr(\"viewBox\", \"0 0 \" + width + \" \" + height);\n diagObj.db.setHeight(height);\n diagObj.db.setWidth(width);\n const quadrantData = diagObj.db.getQuadrantData();\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 if (quadrantData.title) {\n 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);\n }\n if (quadrantData.borderLines) {\n 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);\n }\n const quadrants = quadrantsGroup.selectAll(\"g.quadrant\").data(quadrantData.quadrants).enter().append(\"g\").attr(\"class\", \"quadrant\");\n 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);\n quadrants.append(\"text\").attr(\"x\", 0).attr(\"y\", 0).attr(\"fill\", (data) => data.text.fill).attr(\"font-size\", (data) => data.text.fontSize).attr(\n \"dominant-baseline\",\n (data) => getDominantBaseLine(data.text.horizontalPos)\n ).attr(\"text-anchor\", (data) => getTextAnchor(data.text.verticalPos)).attr(\"transform\", (data) => getTransformation(data.text)).text((data) => data.text.text);\n const labels = labelGroup.selectAll(\"g.label\").data(quadrantData.axisLabels).enter().append(\"g\").attr(\"class\", \"label\");\n 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));\n const dataPoints = dataPointGroup.selectAll(\"g.data-point\").data(quadrantData.points).enter().append(\"g\").attr(\"class\", \"data-point\");\n 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);\n 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(\n \"dominant-baseline\",\n (data) => getDominantBaseLine(data.text.horizontalPos)\n ).attr(\"text-anchor\", (data) => getTextAnchor(data.text.verticalPos)).attr(\"transform\", (data) => getTransformation(data.text));\n}, \"draw\");\nvar quadrantRenderer_default = {\n draw\n};\n\n// src/diagrams/quadrant-chart/quadrantDiagram.ts\nvar diagram = {\n parser: quadrant_default,\n db: quadrantDb_default,\n renderer: quadrantRenderer_default,\n styles: /* @__PURE__ */ __name(() => \"\", \"styles\")\n};\nexport {\n diagram\n};\n"],"names":["parser","o","__name","k","v","o2","l","length","$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","$VT","$VU","$VV","$VW","$VX","$VY","$VZ","$V_","$V$","parser2","trace","yy","symbols_","terminals_","productions_","performAction","yytext","yyleng","yylineno","yystate","$$","_$","$0","this","$","trim","push","addClass","setDiagramTitle","setAccTitle","setAccDescription","addSection","substr","addPoint","setXAxisLeftText","setXAxisRightText","text","setYAxisBottomText","setYAxisTopText","setQuadrant1Text","setQuadrant2Text","setQuadrant3Text","setQuadrant4Text","type","table","defaultActions","parseError","str","hash","recoverable","error","Error","parse","input","self","stack","tstack","vstack","lstack","recovering","args","slice","call","arguments","lexer2","Object","create","lexer","sharedState","prototype","hasOwnProperty","setInput","yylloc","yyloc","ranges","options","lex","token","pop","Array","getPrototypeOf","n","symbol","preErrorSymbol","state","action","r","p","len","newState","expected","yyval","errStr","showPosition","join","match","line","loc","first_line","last_line","first_column","last_column","range","apply","concat","EOF","_input","_more","_backtrack","done","matched","conditionStack","offset","ch","unput","lines","split","oldLines","more","reject","backtrack_lexer","less","pastInput","past","replace","upcomingInput","next","pre","c","test_match","indexed_rule","backup","matches","tempMatch","index","rules","_currentRules","i","flex","begin","condition","popState","conditions","topState","Math","abs","pushState","stateStackSize","yy_","$avoiding_name_collisions","YY_START","Parser","quadrant_default","defaultThemeVariables","getThemeVariables","QuadrantBuilder","constructor","classes","Map","config","getDefaultConfig","themeConfig","getDefaultThemeConfig","data","getDefaultData","titleText","quadrant1Text","quadrant2Text","quadrant3Text","quadrant4Text","xAxisLeftText","xAxisRightText","yAxisBottomText","yAxisTopText","points","showXAxis","showYAxis","showTitle","chartHeight","defaultConfig_default","quadrantChart","chartWidth","titlePadding","titleFontSize","quadrantPadding","xAxisLabelPadding","yAxisLabelPadding","xAxisLabelFontSize","yAxisLabelFontSize","quadrantLabelFontSize","quadrantTextTopPadding","pointTextPadding","pointLabelFontSize","pointRadius","xAxisPosition","yAxisPosition","quadrantInternalBorderStrokeWidth","quadrantExternalBorderStrokeWidth","quadrant1Fill","quadrant2Fill","quadrant3Fill","quadrant4Fill","quadrant1TextFill","quadrant2TextFill","quadrant3TextFill","quadrant4TextFill","quadrantPointFill","quadrantPointTextFill","quadrantXAxisTextFill","quadrantYAxisTextFill","quadrantTitleFill","quadrantInternalBorderStrokeFill","quadrantExternalBorderStrokeFill","clear","log","info","setData","addPoints","className","styles","set","setConfig","config2","setThemeConfig","calculateSpace","xAxisSpaceCalculation","xAxisSpace","top","bottom","yAxisSpaceCalculation","yAxisSpace","left","right","titleSpaceCalculation","titleSpace","quadrantLeft","quadrantTop","quadrantWidth","quadrantHeight","quadrantSpace","quadrantHalfWidth","quadrantHalfHeight","getAxisLabels","spaceData","drawXAxisLabelsInMiddle","Boolean","drawYAxisLabelsInMiddle","axisLabels","fill","x","y","fontSize","verticalPos","horizontalPos","rotation","getQuadrants","quadrants","width","height","quadrant","getQuadrantPoints","xAxis","scaleLinear","domain","yAxis","map","point","classStyles","get","color","radius","strokeColor","strokeWidth","getBorders","halfExternalBorderWidth","strokeFill","x1","y1","x2","y2","getTitle","build","calculatedSpace","borderLines","title","InvalidStyleError","style","value","super","name","validateHexCode","test","validateNumber","validateSizeInPixels","getConfig","textSanitizer","sanitizeText","quadrantBuilder","textObj","parseStyles","stylesObject","key","parseInt","setWidth","setHeight","getQuadrantData","themeVariables","quadrantChartConfig","getDiagramTitle","diagram","db","getAccTitle","getAccDescription","renderer","draw","txt","id","_version","diagObj","getDominantBaseLine","getTextAnchor","getTransformation","conf","debug","securityLevel","sandboxElement","select","svg","nodes","contentDocument","body","group","append","attr","configureSvgSize","useMaxWidth","quadrantData","quadrantsGroup","borderGroup","dataPointGroup","labelGroup","titleGroup","selectAll","enter","dataPoints"],"sourceRoot":""} \ No newline at end of file diff --git a/frontend/deployed/static/js/255.28a7c83e.chunk.js b/frontend/deployed/static/js/255.28a7c83e.chunk.js deleted file mode 100644 index c2da1d0..0000000 --- a/frontend/deployed/static/js/255.28a7c83e.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(self.webpackChunkbackstory=self.webpackChunkbackstory||[]).push([[255],{620:function(t,e,i){var n;n=function(t){return function(t){var e={};function i(n){if(e[n])return e[n].exports;var r=e[n]={i:n,l:!1,exports:{}};return t[n].call(r.exports,r,r.exports,i),r.l=!0,r.exports}return i.m=t,i.c=e,i.i=function(t){return t},i.d=function(t,e,n){i.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:n})},i.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return i.d(e,"a",e),e},i.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},i.p="",i(i.s=7)}([function(e,i){e.exports=t},function(t,e,i){"use strict";var n=i(0).FDLayoutConstants;function r(){}for(var o in n)r[o]=n[o];r.DEFAULT_USE_MULTI_LEVEL_SCALING=!1,r.DEFAULT_RADIAL_SEPARATION=n.DEFAULT_EDGE_LENGTH,r.DEFAULT_COMPONENT_SEPERATION=60,r.TILE=!0,r.TILING_PADDING_VERTICAL=10,r.TILING_PADDING_HORIZONTAL=10,r.TREE_REDUCTION_ON_INCREMENTAL=!1,t.exports=r},function(t,e,i){"use strict";var n=i(0).FDLayoutEdge;function r(t,e,i){n.call(this,t,e,i)}for(var o in r.prototype=Object.create(n.prototype),n)r[o]=n[o];t.exports=r},function(t,e,i){"use strict";var n=i(0).LGraph;function r(t,e,i){n.call(this,t,e,i)}for(var o in r.prototype=Object.create(n.prototype),n)r[o]=n[o];t.exports=r},function(t,e,i){"use strict";var n=i(0).LGraphManager;function r(t){n.call(this,t)}for(var o in r.prototype=Object.create(n.prototype),n)r[o]=n[o];t.exports=r},function(t,e,i){"use strict";var n=i(0).FDLayoutNode,r=i(0).IMath;function o(t,e,i,r){n.call(this,t,e,i,r)}for(var s in o.prototype=Object.create(n.prototype),n)o[s]=n[s];o.prototype.move=function(){var t=this.graphManager.getLayout();this.displacementX=t.coolingFactor*(this.springForceX+this.repulsionForceX+this.gravitationForceX)/this.noOfChildren,this.displacementY=t.coolingFactor*(this.springForceY+this.repulsionForceY+this.gravitationForceY)/this.noOfChildren,Math.abs(this.displacementX)>t.coolingFactor*t.maxNodeDisplacement&&(this.displacementX=t.coolingFactor*t.maxNodeDisplacement*r.sign(this.displacementX)),Math.abs(this.displacementY)>t.coolingFactor*t.maxNodeDisplacement&&(this.displacementY=t.coolingFactor*t.maxNodeDisplacement*r.sign(this.displacementY)),null==this.child||0==this.child.getNodes().length?this.moveBy(this.displacementX,this.displacementY):this.propogateDisplacementToChildren(this.displacementX,this.displacementY),t.totalDisplacement+=Math.abs(this.displacementX)+Math.abs(this.displacementY),this.springForceX=0,this.springForceY=0,this.repulsionForceX=0,this.repulsionForceY=0,this.gravitationForceX=0,this.gravitationForceY=0,this.displacementX=0,this.displacementY=0},o.prototype.propogateDisplacementToChildren=function(t,e){for(var i,n=this.getChild().getNodes(),r=0;r0)this.positionNodesRadially(t);else{this.reduceTrees(),this.graphManager.resetAllNodesToApplyGravitation();var e=new Set(this.getAllNodes()),i=this.nodesWithGravity.filter((function(t){return e.has(t)}));this.graphManager.setAllNodesToApplyGravitation(i),this.positionNodesRandomly()}}return this.initSpringEmbedder(),this.runSpringEmbedder(),!0},_.prototype.tick=function(){if(this.totalIterations++,this.totalIterations===this.maxIterations&&!this.isTreeGrowing&&!this.isGrowthFinished){if(!(this.prunedNodesAll.length>0))return!0;this.isTreeGrowing=!0}if(this.totalIterations%l.CONVERGENCE_CHECK_PERIOD==0&&!this.isTreeGrowing&&!this.isGrowthFinished){if(this.isConverged()){if(!(this.prunedNodesAll.length>0))return!0;this.isTreeGrowing=!0}this.coolingCycle++,0==this.layoutQuality?this.coolingAdjuster=this.coolingCycle:1==this.layoutQuality&&(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 t=new Set(this.getAllNodes()),e=this.nodesWithGravity.filter((function(e){return t.has(e)}));this.graphManager.setAllNodesToApplyGravitation(e),this.graphManager.updateBounds(),this.updateGrid(),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()),this.coolingFactor=l.DEFAULT_COOLING_FACTOR_INCREMENTAL*((100-this.afterGrowthIterations)/100),this.afterGrowthIterations++}var i=!this.isTreeGrowing&&!this.isGrowthFinished,n=this.growTreeIterations%10==1&&this.isTreeGrowing||this.afterGrowthIterations%10==1&&this.isGrowthFinished;return this.totalDisplacement=0,this.graphManager.updateBounds(),this.calcSpringForces(),this.calcRepulsionForces(i,n),this.calcGravitationalForces(),this.moveNodes(),this.animate(),!1},_.prototype.getPositionsData=function(){for(var t=this.graphManager.getAllNodes(),e={},i=0;i1)for(a=0;an&&(n=Math.floor(s.y)),o=Math.floor(s.x+h.DEFAULT_COMPONENT_SEPERATION)}this.transform(new u(c.WORLD_CENTER_X-s.x/2,c.WORLD_CENTER_Y-s.y/2))},_.radialLayout=function(t,e,i){var n=Math.max(this.maxDiagonalInTree(t),h.DEFAULT_RADIAL_SEPARATION);_.branchRadialLayout(e,null,0,359,0,n);var r=y.calculateBounds(t),o=new E;o.setDeviceOrgX(r.getMinX()),o.setDeviceOrgY(r.getMinY()),o.setWorldOrgX(i.x),o.setWorldOrgY(i.y);for(var s=0;s1;){var E=y[0];y.splice(0,1);var m=c.indexOf(E);m>=0&&c.splice(m,1),p--,g--}u=null!=e?(c.indexOf(y[0])+1)%p:0;for(var v=Math.abs(n-i)/g,N=u;d!=g;N=++N%p){var A=c[N].getOtherEnd(t);if(A!=e){var L=(i+d*v)%360,T=(L+v)%360;_.branchRadialLayout(A,t,L,T,r+o,o),d++}}},_.maxDiagonalInTree=function(t){for(var e=p.MIN_VALUE,i=0;ie&&(e=n)}return e},_.prototype.calcRepulsionRange=function(){return 2*(this.level+1)*this.idealEdgeLength},_.prototype.groupZeroDegreeMembers=function(){var t=this,e={};this.memberGroups={},this.idToDummyNode={};for(var i=[],n=this.graphManager.getAllNodes(),r=0;r1){var n="DummyCompound_"+i;t.memberGroups[n]=e[i];var r=e[i][0].getParent(),o=new s(t.graphManager);o.id=n,o.paddingLeft=r.paddingLeft||0,o.paddingRight=r.paddingRight||0,o.paddingBottom=r.paddingBottom||0,o.paddingTop=r.paddingTop||0,t.idToDummyNode[n]=o;var a=t.getGraphManager().add(t.newGraph(),o),h=r.getChild();h.add(o);for(var l=0;l=0;t--){var e=this.compoundOrder[t],i=e.id,n=e.paddingLeft,r=e.paddingTop;this.adjustLocations(this.tiledMemberPack[i],e.rect.x,e.rect.y,n,r)}},_.prototype.repopulateZeroDegreeMembers=function(){var t=this,e=this.tiledZeroDegreePack;Object.keys(e).forEach((function(i){var n=t.idToDummyNode[i],r=n.paddingLeft,o=n.paddingTop;t.adjustLocations(e[i],n.rect.x,n.rect.y,r,o)}))},_.prototype.getToBeTiled=function(t){var e=t.id;if(null!=this.toBeTiled[e])return this.toBeTiled[e];var i=t.getChild();if(null==i)return this.toBeTiled[e]=!1,!1;for(var n=i.getNodes(),r=0;r0)return this.toBeTiled[e]=!1,!1;if(null!=o.getChild()){if(!this.getToBeTiled(o))return this.toBeTiled[e]=!1,!1}else this.toBeTiled[o.id]=!1}return this.toBeTiled[e]=!0,!0},_.prototype.getNodeDegree=function(t){t.id;for(var e=t.getEdges(),i=0,n=0;nh&&(h=c.rect.height)}i+=h+t.verticalPadding}},_.prototype.tileCompoundMembers=function(t,e){var i=this;this.tiledMemberPack=[],Object.keys(t).forEach((function(n){var r=e[n];i.tiledMemberPack[n]=i.tileNodes(t[n],r.paddingLeft+r.paddingRight),r.rect.width=i.tiledMemberPack[n].width,r.rect.height=i.tiledMemberPack[n].height}))},_.prototype.tileNodes=function(t,e){var i={rows:[],rowWidth:[],rowHeight:[],width:0,height:e,verticalPadding:h.TILING_PADDING_VERTICAL,horizontalPadding:h.TILING_PADDING_HORIZONTAL};t.sort((function(t,e){return t.rect.width*t.rect.height>e.rect.width*e.rect.height?-1:t.rect.width*t.rect.height0&&(o+=t.horizontalPadding),t.rowWidth[i]=o,t.width0&&(s+=t.verticalPadding);var a=0;s>t.rowHeight[i]&&(a=t.rowHeight[i],t.rowHeight[i]=s,a=t.rowHeight[i]-a),t.height+=a,t.rows[i].push(e)},_.prototype.getShortestRowIndex=function(t){for(var e=-1,i=Number.MAX_VALUE,n=0;ni&&(e=n,i=t.rowWidth[n]);return e},_.prototype.canAddHorizontal=function(t,e,i){var n=this.getShortestRowIndex(t);if(n<0)return!0;var r=t.rowWidth[n];if(r+t.horizontalPadding+e<=t.width)return!0;var o,s,a=0;return t.rowHeight[n]0&&(a=i+t.verticalPadding-t.rowHeight[n]),o=t.width-r>=e+t.horizontalPadding?(t.height+a)/(r+e+t.horizontalPadding):(t.height+a)/t.width,a=i+t.verticalPadding,(s=t.widtho&&e!=i){n.splice(-1,1),t.rows[i].push(r),t.rowWidth[e]=t.rowWidth[e]-o,t.rowWidth[i]=t.rowWidth[i]+o,t.width=t.rowWidth[instance.getLongestRowIndex(t)];for(var s=Number.MIN_VALUE,a=0;as&&(s=n[a].height);e>0&&(s+=t.verticalPadding);var h=t.rowHeight[e]+t.rowHeight[i];t.rowHeight[e]=s,t.rowHeight[i]0)for(var c=r;c<=o;c++)h[0]+=this.grid[c][s-1].length+this.grid[c][s].length-1;if(o0)for(c=s;c<=a;c++)h[3]+=this.grid[r-1][c].length+this.grid[r][c].length-1;for(var g,u,d=p.MAX_VALUE,f=0;f{"use strict";i.d(e,{diagram:()=>X});var n=i(2596),r=i(634),o=i(3957),s=i(3759),a=i(646),h=i(5262),l=i(700),c=i(8194),g=i(6362),u=i(5554),d=function(){var t=(0,s.K2)((function(t,e,i,n){for(i=i||{},n=t.length;n--;i[t[n]]=e);return i}),"o"),e=[1,4],i=[1,13],n=[1,12],r=[1,15],o=[1,16],a=[1,20],h=[1,19],l=[6,7,8],c=[1,26],g=[1,24],u=[1,25],d=[6,7,11],p=[1,6,13,15,16,19,22],f=[1,33],y=[1,34],E=[1,6,7,11,13,15,16,19,22],_={trace:(0,s.K2)((function(){}),"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:(0,s.K2)((function(t,e,i,n,r,o,s){var a=o.length-1;switch(r){case 6:case 7:return n;case 8:n.getLogger().trace("Stop NL ");break;case 9:n.getLogger().trace("Stop EOF ");break;case 11:n.getLogger().trace("Stop NL2 ");break;case 12:n.getLogger().trace("Stop EOF2 ");break;case 15:n.getLogger().info("Node: ",o[a].id),n.addNode(o[a-1].length,o[a].id,o[a].descr,o[a].type);break;case 16:n.getLogger().trace("Icon: ",o[a]),n.decorateNode({icon:o[a]});break;case 17:case 21:n.decorateNode({class:o[a]});break;case 18:n.getLogger().trace("SPACELIST");break;case 19:n.getLogger().trace("Node: ",o[a].id),n.addNode(0,o[a].id,o[a].descr,o[a].type);break;case 20:n.decorateNode({icon:o[a]});break;case 25:n.getLogger().trace("node found ..",o[a-2]),this.$={id:o[a-1],descr:o[a-1],type:n.getType(o[a-2],o[a])};break;case 26:this.$={id:o[a],descr:o[a],type:n.nodeType.DEFAULT};break;case 27:n.getLogger().trace("node found ..",o[a-3]),this.$={id:o[a-3],descr:o[a-1],type:n.getType(o[a-2],o[a])}}}),"anonymous"),table:[{3:1,4:2,5:3,6:[1,5],8:e},{1:[3]},{1:[2,1]},{4:6,6:[1,7],7:[1,8],8:e},{6:i,7:[1,10],9:9,12:11,13:n,14:14,15:r,16:o,17:17,18:18,19:a,22:h},t(l,[2,3]),{1:[2,2]},t(l,[2,4]),t(l,[2,5]),{1:[2,6],6:i,12:21,13:n,14:14,15:r,16:o,17:17,18:18,19:a,22:h},{6:i,9:22,12:11,13:n,14:14,15:r,16:o,17:17,18:18,19:a,22:h},{6:c,7:g,10:23,11:u},t(d,[2,22],{17:17,18:18,14:27,15:[1,28],16:[1,29],19:a,22:h}),t(d,[2,18]),t(d,[2,19]),t(d,[2,20]),t(d,[2,21]),t(d,[2,23]),t(d,[2,24]),t(d,[2,26],{19:[1,30]}),{20:[1,31]},{6:c,7:g,10:32,11:u},{1:[2,7],6:i,12:21,13:n,14:14,15:r,16:o,17:17,18:18,19:a,22:h},t(p,[2,14],{7:f,11:y}),t(E,[2,8]),t(E,[2,9]),t(E,[2,10]),t(d,[2,15]),t(d,[2,16]),t(d,[2,17]),{20:[1,35]},{21:[1,36]},t(p,[2,13],{7:f,11:y}),t(E,[2,11]),t(E,[2,12]),{21:[1,37]},t(d,[2,25]),t(d,[2,27])],defaultActions:{2:[2,1],6:[2,2]},parseError:(0,s.K2)((function(t,e){if(!e.recoverable){var i=new Error(t);throw i.hash=e,i}this.trace(t)}),"parseError"),parse:(0,s.K2)((function(t){var e=this,i=[0],n=[],r=[null],o=[],a=this.table,h="",l=0,c=0,g=0,u=o.slice.call(arguments,1),d=Object.create(this.lexer),p={yy:{}};for(var f in this.yy)Object.prototype.hasOwnProperty.call(this.yy,f)&&(p.yy[f]=this.yy[f]);d.setInput(t,p.yy),p.yy.lexer=d,p.yy.parser=this,"undefined"==typeof d.yylloc&&(d.yylloc={});var y=d.yylloc;o.push(y);var E=d.options&&d.options.ranges;function _(){var t;return"number"!==typeof(t=n.pop()||d.lex()||1)&&(t instanceof Array&&(t=(n=t).pop()),t=e.symbols_[t]||t),t}"function"===typeof p.yy.parseError?this.parseError=p.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError,(0,s.K2)((function(t){i.length=i.length-2*t,r.length=r.length-t,o.length=o.length-t}),"popStack"),(0,s.K2)(_,"lex");for(var m,v,N,A,L,T,O,D,I,w={};;){if(N=i[i.length-1],this.defaultActions[N]?A=this.defaultActions[N]:(null!==m&&"undefined"!=typeof m||(m=_()),A=a[N]&&a[N][m]),"undefined"===typeof A||!A.length||!A[0]){var R="";for(T in I=[],a[N])this.terminals_[T]&&T>2&&I.push("'"+this.terminals_[T]+"'");R=d.showPosition?"Parse error on line "+(l+1)+":\n"+d.showPosition()+"\nExpecting "+I.join(", ")+", got '"+(this.terminals_[m]||m)+"'":"Parse error on line "+(l+1)+": Unexpected "+(1==m?"end of input":"'"+(this.terminals_[m]||m)+"'"),this.parseError(R,{text:d.match,token:this.terminals_[m]||m,line:d.yylineno,loc:y,expected:I})}if(A[0]instanceof Array&&A.length>1)throw new Error("Parse Error: multiple actions possible at state: "+N+", token: "+m);switch(A[0]){case 1:i.push(m),r.push(d.yytext),o.push(d.yylloc),i.push(A[1]),m=null,v?(m=v,v=null):(c=d.yyleng,h=d.yytext,l=d.yylineno,y=d.yylloc,g>0&&g--);break;case 2:if(O=this.productions_[A[1]][1],w.$=r[r.length-O],w._$={first_line:o[o.length-(O||1)].first_line,last_line:o[o.length-1].last_line,first_column:o[o.length-(O||1)].first_column,last_column:o[o.length-1].last_column},E&&(w._$.range=[o[o.length-(O||1)].range[0],o[o.length-1].range[1]]),"undefined"!==typeof(L=this.performAction.apply(w,[h,c,l,p.yy,A[1],r,o].concat(u))))return L;O&&(i=i.slice(0,-1*O*2),r=r.slice(0,-1*O),o=o.slice(0,-1*O)),i.push(this.productions_[A[1]][0]),r.push(w.$),o.push(w._$),D=a[i[i.length-2]][i[i.length-1]],i.push(D);break;case 3:return!0}}return!0}),"parse")},m=function(){return{EOF:1,parseError:(0,s.K2)((function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)}),"parseError"),setInput:(0,s.K2)((function(t,e){return this.yy=e||this.yy||{},this._input=t,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:(0,s.K2)((function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t}),"input"),unput:(0,s.K2)((function(t){var e=t.length,i=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var n=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),i.length-1&&(this.yylineno-=i.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:i?(i.length===n.length?this.yylloc.first_column:0)+n[n.length-i.length].length-i[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this}),"unput"),more:(0,s.K2)((function(){return this._more=!0,this}),"more"),reject:(0,s.K2)((function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):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})}),"reject"),less:(0,s.K2)((function(t){this.unput(this.match.slice(t))}),"less"),pastInput:(0,s.K2)((function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")}),"pastInput"),upcomingInput:(0,s.K2)((function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")}),"upcomingInput"),showPosition:(0,s.K2)((function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"}),"showPosition"),test_match:(0,s.K2)((function(t,e){var i,n,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))),(n=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=n.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:n?n[n.length-1].length-n[n.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,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(t[0].length),this.matched+=t[0],i=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),i)return i;if(this._backtrack){for(var o in r)this[o]=r[o];return!1}return!1}),"test_match"),next:(0,s.K2)((function(){if(this.done)return this.EOF;var t,e,i,n;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),o=0;oe[0].length)){if(e=i,n=o,this.options.backtrack_lexer){if(!1!==(t=this.test_match(i,r[o])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[n]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})}),"next"),lex:(0,s.K2)((function(){var t=this.next();return t||this.lex()}),"lex"),begin:(0,s.K2)((function(t){this.conditionStack.push(t)}),"begin"),popState:(0,s.K2)((function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]}),"popState"),_currentRules:(0,s.K2)((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:(0,s.K2)((function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"}),"topState"),pushState:(0,s.K2)((function(t){this.begin(t)}),"pushState"),stateStackSize:(0,s.K2)((function(){return this.conditionStack.length}),"stateStackSize"),options:{"case-insensitive":!0},performAction:(0,s.K2)((function(t,e,i,n){switch(i){case 0:return t.getLogger().trace("Found comment",e.yytext),6;case 1:return 8;case 2:this.begin("CLASS");break;case 3:return this.popState(),16;case 4:case 23:case 26:this.popState();break;case 5:t.getLogger().trace("Begin icon"),this.begin("ICON");break;case 6:return t.getLogger().trace("SPACELINE"),6;case 7:return 7;case 8:return 15;case 9:t.getLogger().trace("end icon"),this.popState();break;case 10:return t.getLogger().trace("Exploding node"),this.begin("NODE"),19;case 11:return t.getLogger().trace("Cloud"),this.begin("NODE"),19;case 12:return t.getLogger().trace("Explosion Bang"),this.begin("NODE"),19;case 13:return t.getLogger().trace("Cloud Bang"),this.begin("NODE"),19;case 14:case 15:case 16:case 17:return this.begin("NODE"),19;case 18:return 13;case 19:return 22;case 20:return 11;case 21:this.begin("NSTR2");break;case 22:return"NODE_DESCR";case 24:t.getLogger().trace("Starting NSTR"),this.begin("NSTR");break;case 25:return t.getLogger().trace("description:",e.yytext),"NODE_DESCR";case 27:return this.popState(),t.getLogger().trace("node end ))"),"NODE_DEND";case 28:return this.popState(),t.getLogger().trace("node end )"),"NODE_DEND";case 29:return this.popState(),t.getLogger().trace("node end ...",e.yytext),"NODE_DEND";case 30:case 33:case 34:return this.popState(),t.getLogger().trace("node end (("),"NODE_DEND";case 31:case 32:return this.popState(),t.getLogger().trace("node end (-"),"NODE_DEND";case 35:case 36:return t.getLogger().trace("Long description:",e.yytext),20}}),"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:!1},ICON:{rules:[8,9],inclusive:!1},NSTR2:{rules:[22,23],inclusive:!1},NSTR:{rules:[25,26],inclusive:!1},NODE:{rules:[21,24,27,28,29,30,31,32,33,34,35,36],inclusive:!1},INITIAL:{rules:[0,1,2,5,6,7,10,11,12,13,14,15,16,17,18,19,20],inclusive:!0}}}}();function v(){this.yy={}}return _.lexer=m,(0,s.K2)(v,"Parser"),v.prototype=_,_.Parser=v,new v}();d.parser=d;var p=d,f=[],y=0,E={},_=(0,s.K2)((()=>{f=[],y=0,E={}}),"clear"),m=(0,s.K2)((function(t){for(let e=f.length-1;e>=0;e--)if(f[e].levelf.length>0?f[0]:null),"getMindmap"),N=(0,s.K2)(((t,e,i,n)=>{s.Rm.info("addNode",t,e,i,n);const r=(0,s.D7)();let o=r.mindmap?.padding??s.UI.mindmap.padding;switch(n){case A.ROUNDED_RECT:case A.RECT:case A.HEXAGON:o*=2}const a={id:y++,nodeId:(0,s.jZ)(e,r),level:t,descr:(0,s.jZ)(i,r),type:n,children:[],width:r.mindmap?.maxNodeWidth??s.UI.mindmap.maxNodeWidth,padding:o},h=m(t);if(h)h.children.push(a),f.push(a);else{if(0!==f.length)throw new Error('There can be only one root. No parent could be found for ("'+a.descr+'")');f.push(a)}}),"addNode"),A={DEFAULT:0,NO_BORDER:0,ROUNDED_RECT:1,RECT:2,CIRCLE:3,CLOUD:4,BANG:5,HEXAGON:6},L={clear:_,addNode:N,getMindmap:v,nodeType:A,getType:(0,s.K2)(((t,e)=>{switch(s.Rm.debug("In get type",t,e),t){case"[":return A.RECT;case"(":return")"===e?A.ROUNDED_RECT:A.CLOUD;case"((":return A.CIRCLE;case")":return A.CLOUD;case"))":return A.BANG;case"{{":return A.HEXAGON;default:return A.DEFAULT}}),"getType"),setElementForId:(0,s.K2)(((t,e)=>{E[t]=e}),"setElementForId"),decorateNode:(0,s.K2)((t=>{if(!t)return;const e=(0,s.D7)(),i=f[f.length-1];t.icon&&(i.icon=(0,s.jZ)(t.icon,e)),t.class&&(i.class=(0,s.jZ)(t.class,e))}),"decorateNode"),type2Str:(0,s.K2)((t=>{switch(t){case A.DEFAULT:return"no-border";case A.RECT:return"rect";case A.ROUNDED_RECT:return"rounded-rect";case A.CIRCLE:return"circle";case A.CLOUD:return"cloud";case A.BANG:return"bang";case A.HEXAGON:return"hexgon";default:return"no-border"}}),"type2Str"),getLogger:(0,s.K2)((()=>s.Rm),"getLogger"),getElementById:(0,s.K2)((t=>E[t]),"getElementById")},T=(0,s.K2)((function(t,e,i,n){e.append("path").attr("id","node-"+i.id).attr("class","node-bkg node-"+t.type2Str(i.type)).attr("d",`M0 ${i.height-5} v${10-i.height} q0,-5 5,-5 h${i.width-10} q5,0 5,5 v${i.height-5} H0 Z`),e.append("line").attr("class","node-line-"+n).attr("x1",0).attr("y1",i.height).attr("x2",i.width).attr("y2",i.height)}),"defaultBkg"),O=(0,s.K2)((function(t,e,i){e.append("rect").attr("id","node-"+i.id).attr("class","node-bkg node-"+t.type2Str(i.type)).attr("height",i.height).attr("width",i.width)}),"rectBkg"),D=(0,s.K2)((function(t,e,i){const n=i.width,r=i.height,o=.15*n,s=.25*n,a=.35*n,h=.2*n;e.append("path").attr("id","node-"+i.id).attr("class","node-bkg node-"+t.type2Str(i.type)).attr("d",`M0 0 a${o},${o} 0 0,1 ${.25*n},${-1*n*.1}\n a${a},${a} 1 0,1 ${.4*n},${-1*n*.1}\n a${s},${s} 1 0,1 ${.35*n},${1*n*.2}\n\n a${o},${o} 1 0,1 ${.15*n},${1*r*.35}\n a${h},${h} 1 0,1 ${-1*n*.15},${1*r*.65}\n\n a${s},${o} 1 0,1 ${-1*n*.25},${.15*n}\n a${a},${a} 1 0,1 ${-1*n*.5},0\n a${o},${o} 1 0,1 ${-1*n*.25},${-1*n*.15}\n\n a${o},${o} 1 0,1 ${-1*n*.1},${-1*r*.35}\n a${h},${h} 1 0,1 ${.1*n},${-1*r*.65}\n\n H0 V0 Z`)}),"cloudBkg"),I=(0,s.K2)((function(t,e,i){const n=i.width,r=i.height,o=.15*n;e.append("path").attr("id","node-"+i.id).attr("class","node-bkg node-"+t.type2Str(i.type)).attr("d",`M0 0 a${o},${o} 1 0,0 ${.25*n},${-1*r*.1}\n a${o},${o} 1 0,0 ${.25*n},0\n a${o},${o} 1 0,0 ${.25*n},0\n a${o},${o} 1 0,0 ${.25*n},${1*r*.1}\n\n a${o},${o} 1 0,0 ${.15*n},${1*r*.33}\n a${.8*o},${.8*o} 1 0,0 0,${1*r*.34}\n a${o},${o} 1 0,0 ${-1*n*.15},${1*r*.33}\n\n a${o},${o} 1 0,0 ${-1*n*.25},${.15*r}\n a${o},${o} 1 0,0 ${-1*n*.25},0\n a${o},${o} 1 0,0 ${-1*n*.25},0\n a${o},${o} 1 0,0 ${-1*n*.25},${-1*r*.15}\n\n a${o},${o} 1 0,0 ${-1*n*.1},${-1*r*.33}\n a${.8*o},${.8*o} 1 0,0 0,${-1*r*.34}\n a${o},${o} 1 0,0 ${.1*n},${-1*r*.33}\n\n H0 V0 Z`)}),"bangBkg"),w=(0,s.K2)((function(t,e,i){e.append("circle").attr("id","node-"+i.id).attr("class","node-bkg node-"+t.type2Str(i.type)).attr("r",i.width/2)}),"circleBkg");function R(t,e,i,n,r){return t.insert("polygon",":first-child").attr("points",n.map((function(t){return t.x+","+t.y})).join(" ")).attr("transform","translate("+(r.width-e)/2+", "+i+")")}(0,s.K2)(R,"insertPolygonShape");var C=(0,s.K2)((function(t,e,i){const n=i.height,r=n/4,o=i.width-i.padding+2*r;R(e,o,n,[{x:r,y:0},{x:o-r,y:0},{x:o,y:-n/2},{x:o-r,y:-n},{x:r,y:-n},{x:0,y:-n/2}],i)}),"hexagonBkg"),M=(0,s.K2)((function(t,e,i){e.append("rect").attr("id","node-"+i.id).attr("class","node-bkg node-"+t.type2Str(i.type)).attr("height",i.height).attr("rx",i.padding).attr("ry",i.padding).attr("width",i.width)}),"roundedRectBkg"),x=(0,s.K2)((async function(t,e,i,o,s){const a=s.htmlLabels,h=o%11,l=e.append("g");i.section=h;let c="section-"+h;h<0&&(c+=" section-root"),l.attr("class",(i.class?i.class+" ":"")+"mindmap-node "+c);const g=l.append("g"),u=l.append("g"),d=i.descr.replace(/()/g,"\n");await(0,n.GZ)(u,d,{useHtmlLabels:a,width:i.width,classes:"mindmap-node-label"},s),a||u.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle");const p=u.node().getBBox(),[f]=(0,r.I5)(s.fontSize);if(i.height=p.height+1.1*f*.5+i.padding,i.width=p.width+2*i.padding,i.icon)if(i.type===t.nodeType.CIRCLE){i.height+=50,i.width+=50;l.append("foreignObject").attr("height","50px").attr("width",i.width).attr("style","text-align: center;").append("div").attr("class","icon-container").append("i").attr("class","node-icon-"+h+" "+i.icon),u.attr("transform","translate("+i.width/2+", "+(i.height/2-1.5*i.padding)+")")}else{i.width+=50;const t=i.height;i.height=Math.max(t,60);const e=Math.abs(i.height-t);l.append("foreignObject").attr("width","60px").attr("height",i.height).attr("style","text-align: center;margin-top:"+e/2+"px;").append("div").attr("class","icon-container").append("i").attr("class","node-icon-"+h+" "+i.icon),u.attr("transform","translate("+(25+i.width/2)+", "+(e/2+i.padding/2)+")")}else if(a){const t=(i.width-p.width)/2,e=(i.height-p.height)/2;u.attr("transform","translate("+t+", "+e+")")}else{const t=i.width/2,e=i.padding/2;u.attr("transform","translate("+t+", "+e+")")}switch(i.type){case t.nodeType.DEFAULT:T(t,g,i,h);break;case t.nodeType.ROUNDED_RECT:M(t,g,i,h);break;case t.nodeType.RECT:O(t,g,i,h);break;case t.nodeType.CIRCLE:g.attr("transform","translate("+i.width/2+", "+ +i.height/2+")"),w(t,g,i,h);break;case t.nodeType.CLOUD:D(t,g,i,h);break;case t.nodeType.BANG:I(t,g,i,h);break;case t.nodeType.HEXAGON:C(t,g,i,h)}return t.setElementForId(i.id,l),i.height}),"drawNode"),G=(0,s.K2)((function(t,e){const i=t.getElementById(e.id),n=e.x||0,r=e.y||0;i.attr("transform","translate("+n+","+r+")")}),"positionNode");async function S(t,e,i,n,r){await x(t,e,i,n,r),i.children&&await Promise.all(i.children.map(((i,o)=>S(t,e,i,n<0?o:n,r))))}function b(t,e){e.edges().map(((e,i)=>{const n=e.data();if(e[0]._private.bodyBounds){const r=e[0]._private.rscratch;s.Rm.trace("Edge: ",i,n),t.insert("path").attr("d",`M ${r.startX},${r.startY} L ${r.midX},${r.midY} L${r.endX},${r.endY} `).attr("class","edge section-edge-"+n.section+" edge-depth-"+n.depth)}}))}function F(t,e,i,n){e.add({group:"nodes",data:{id:t.id.toString(),labelText:t.descr,height:t.height,width:t.width,level:n,nodeId:t.id,padding:t.padding,type:t.type},position:{x:t.x,y:t.y}}),t.children&&t.children.forEach((r=>{F(r,e,i,n+1),e.add({group:"edges",data:{id:`${t.id}_${r.id}`,source:t.id,target:r.id,depth:n,section:r.section}})}))}function P(t,e){return new Promise((i=>{const n=(0,l.Ltv)("body").append("div").attr("id","cy").attr("style","display:none"),r=(0,a.A)({container:document.getElementById("cy"),style:[{selector:"edge",style:{"curve-style":"bezier"}}]});n.remove(),F(t,r,e,0),r.nodes().forEach((function(t){t.layoutDimensions=()=>{const e=t.data();return{w:e.width,h:e.height}}})),r.layout({name:"cose-bilkent",quality:"proof",styleEnabled:!1,animate:!1}).run(),r.ready((t=>{s.Rm.info("Ready",t),i(r)}))}))}function U(t,e){e.nodes().map(((e,i)=>{const n=e.data();n.x=e.position().x,n.y=e.position().y,G(t,n);const r=t.getElementById(n.nodeId);s.Rm.info("Id:",i,"Position: (",e.position().x,", ",e.position().y,")",n),r.attr("transform",`translate(${e.position().x-n.width/2}, ${e.position().y-n.height/2})`),r.attr("attr",`apa-${i})`)}))}a.A.use(h),(0,s.K2)(S,"drawNodes"),(0,s.K2)(b,"drawEdges"),(0,s.K2)(F,"addNodes"),(0,s.K2)(P,"layoutMindmap"),(0,s.K2)(U,"positionNodes");var k={draw:(0,s.K2)((async(t,e,i,n)=>{s.Rm.debug("Rendering mindmap diagram\n"+t);const r=n.db,a=r.getMindmap();if(!a)return;const h=(0,s.D7)();h.htmlLabels=!1;const l=(0,o.D)(e),c=l.append("g");c.attr("class","mindmap-edges");const g=l.append("g");g.attr("class","mindmap-nodes"),await S(r,g,a,-1,h);const u=await P(a,h);b(c,u),U(r,u),(0,s.ot)(void 0,l,h.mindmap?.padding??s.UI.mindmap.padding,h.mindmap?.useMaxWidth??s.UI.mindmap.useMaxWidth)}),"draw")},Y=(0,s.K2)((t=>{let e="";for(let i=0;i`\n .edge {\n stroke-width: 3;\n }\n ${Y(t)}\n .section-root rect, .section-root path, .section-root circle, .section-root polygon {\n fill: ${t.git0};\n }\n .section-root text {\n fill: ${t.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`),"getStyles")}},5262:function(t,e,i){var n;n=function(t){return function(t){var e={};function i(n){if(e[n])return e[n].exports;var r=e[n]={i:n,l:!1,exports:{}};return t[n].call(r.exports,r,r.exports,i),r.l=!0,r.exports}return i.m=t,i.c=e,i.i=function(t){return t},i.d=function(t,e,n){i.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:n})},i.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return i.d(e,"a",e),e},i.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},i.p="",i(i.s=1)}([function(e,i){e.exports=t},function(t,e,i){"use strict";var n=i(0).layoutBase.LayoutConstants,r=i(0).layoutBase.FDLayoutConstants,o=i(0).CoSEConstants,s=i(0).CoSELayout,a=i(0).CoSENode,h=i(0).layoutBase.PointD,l=i(0).layoutBase.DimensionD,c={ready:function(){},stop:function(){},quality:"default",nodeDimensionsIncludeLabels:!1,refresh:30,fit:!0,padding:10,randomize:!0,nodeRepulsion:4500,idealEdgeLength:50,edgeElasticity:.45,nestingFactor:.1,gravity:.25,numIter:2500,tile:!0,animate:"end",animationDuration:500,tilingPaddingVertical:10,tilingPaddingHorizontal:10,gravityRangeCompound:1.5,gravityCompound:1,gravityRange:3.8,initialEnergyOnIncremental:.5};function g(t){this.options=function(t,e){var i={};for(var n in t)i[n]=t[n];for(var n in e)i[n]=e[n];return i}(c,t),u(this.options)}var u=function(t){null!=t.nodeRepulsion&&(o.DEFAULT_REPULSION_STRENGTH=r.DEFAULT_REPULSION_STRENGTH=t.nodeRepulsion),null!=t.idealEdgeLength&&(o.DEFAULT_EDGE_LENGTH=r.DEFAULT_EDGE_LENGTH=t.idealEdgeLength),null!=t.edgeElasticity&&(o.DEFAULT_SPRING_STRENGTH=r.DEFAULT_SPRING_STRENGTH=t.edgeElasticity),null!=t.nestingFactor&&(o.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=r.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=t.nestingFactor),null!=t.gravity&&(o.DEFAULT_GRAVITY_STRENGTH=r.DEFAULT_GRAVITY_STRENGTH=t.gravity),null!=t.numIter&&(o.MAX_ITERATIONS=r.MAX_ITERATIONS=t.numIter),null!=t.gravityRange&&(o.DEFAULT_GRAVITY_RANGE_FACTOR=r.DEFAULT_GRAVITY_RANGE_FACTOR=t.gravityRange),null!=t.gravityCompound&&(o.DEFAULT_COMPOUND_GRAVITY_STRENGTH=r.DEFAULT_COMPOUND_GRAVITY_STRENGTH=t.gravityCompound),null!=t.gravityRangeCompound&&(o.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=r.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=t.gravityRangeCompound),null!=t.initialEnergyOnIncremental&&(o.DEFAULT_COOLING_FACTOR_INCREMENTAL=r.DEFAULT_COOLING_FACTOR_INCREMENTAL=t.initialEnergyOnIncremental),"draft"==t.quality?n.QUALITY=0:"proof"==t.quality?n.QUALITY=2:n.QUALITY=1,o.NODE_DIMENSIONS_INCLUDE_LABELS=r.NODE_DIMENSIONS_INCLUDE_LABELS=n.NODE_DIMENSIONS_INCLUDE_LABELS=t.nodeDimensionsIncludeLabels,o.DEFAULT_INCREMENTAL=r.DEFAULT_INCREMENTAL=n.DEFAULT_INCREMENTAL=!t.randomize,o.ANIMATE=r.ANIMATE=n.ANIMATE=t.animate,o.TILE=t.tile,o.TILING_PADDING_VERTICAL="function"===typeof t.tilingPaddingVertical?t.tilingPaddingVertical.call():t.tilingPaddingVertical,o.TILING_PADDING_HORIZONTAL="function"===typeof t.tilingPaddingHorizontal?t.tilingPaddingHorizontal.call():t.tilingPaddingHorizontal};g.prototype.run=function(){var t,e,i=this.options,n=(this.idToLNode={},this.layout=new s),r=this;r.stopped=!1,this.cy=this.options.cy,this.cy.trigger({type:"layoutstart",layout:this});var o=n.newGraphManager();this.gm=o;var a=this.options.eles.nodes(),h=this.options.eles.edges();this.root=o.addRoot(),this.processChildrenList(this.root,this.getTopMostNodes(a),n);for(var l=0;l0&&(s=i.getGraphManager().add(i.newGraph(),o),this.processChildrenList(s,g,i))}},g.prototype.stop=function(){return this.stopped=!0,this};var d=function(t){t("layout","cose-bilkent",g)};"undefined"!==typeof cytoscape&&d(cytoscape),t.exports=d}])},t.exports=n(i(620))},9612:function(t){var e;e=function(){return function(t){var e={};function i(n){if(e[n])return e[n].exports;var r=e[n]={i:n,l:!1,exports:{}};return t[n].call(r.exports,r,r.exports,i),r.l=!0,r.exports}return i.m=t,i.c=e,i.i=function(t){return t},i.d=function(t,e,n){i.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:n})},i.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return i.d(e,"a",e),e},i.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},i.p="",i(i.s=26)}([function(t,e,i){"use strict";function n(){}n.QUALITY=1,n.DEFAULT_CREATE_BENDS_AS_NEEDED=!1,n.DEFAULT_INCREMENTAL=!1,n.DEFAULT_ANIMATION_ON_LAYOUT=!0,n.DEFAULT_ANIMATION_DURING_LAYOUT=!1,n.DEFAULT_ANIMATION_PERIOD=50,n.DEFAULT_UNIFORM_LEAF_NODE_SIZES=!1,n.DEFAULT_GRAPH_MARGIN=15,n.NODE_DIMENSIONS_INCLUDE_LABELS=!1,n.SIMPLE_NODE_SIZE=40,n.SIMPLE_NODE_HALF_SIZE=n.SIMPLE_NODE_SIZE/2,n.EMPTY_COMPOUND_NODE_SIZE=40,n.MIN_EDGE_LENGTH=1,n.WORLD_BOUNDARY=1e6,n.INITIAL_WORLD_BOUNDARY=n.WORLD_BOUNDARY/1e3,n.WORLD_CENTER_X=1200,n.WORLD_CENTER_Y=900,t.exports=n},function(t,e,i){"use strict";var n=i(2),r=i(8),o=i(9);function s(t,e,i){n.call(this,i),this.isOverlapingSourceAndTarget=!1,this.vGraphObject=i,this.bendpoints=[],this.source=t,this.target=e}for(var a in s.prototype=Object.create(n.prototype),n)s[a]=n[a];s.prototype.getSource=function(){return this.source},s.prototype.getTarget=function(){return this.target},s.prototype.isInterGraph=function(){return this.isInterGraph},s.prototype.getLength=function(){return this.length},s.prototype.isOverlapingSourceAndTarget=function(){return this.isOverlapingSourceAndTarget},s.prototype.getBendpoints=function(){return this.bendpoints},s.prototype.getLca=function(){return this.lca},s.prototype.getSourceInLca=function(){return this.sourceInLca},s.prototype.getTargetInLca=function(){return this.targetInLca},s.prototype.getOtherEnd=function(t){if(this.source===t)return this.target;if(this.target===t)return this.source;throw"Node is not incident with this edge"},s.prototype.getOtherEndInGraph=function(t,e){for(var i=this.getOtherEnd(t),n=e.getGraphManager().getRoot();;){if(i.getOwner()==e)return i;if(i.getOwner()==n)break;i=i.getOwner().getParent()}return null},s.prototype.updateLength=function(){var t=new Array(4);this.isOverlapingSourceAndTarget=r.getIntersection(this.target.getRect(),this.source.getRect(),t),this.isOverlapingSourceAndTarget||(this.lengthX=t[0]-t[2],this.lengthY=t[1]-t[3],Math.abs(this.lengthX)<1&&(this.lengthX=o.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=o.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY))},s.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=o.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=o.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY)},t.exports=s},function(t,e,i){"use strict";t.exports=function(t){this.vGraphObject=t}},function(t,e,i){"use strict";var n=i(2),r=i(10),o=i(13),s=i(0),a=i(16),h=i(4);function l(t,e,i,s){null==i&&null==s&&(s=e),n.call(this,s),null!=t.graphManager&&(t=t.graphManager),this.estimatedSize=r.MIN_VALUE,this.inclusionTreeDepth=r.MAX_VALUE,this.vGraphObject=s,this.edges=[],this.graphManager=t,this.rect=null!=i&&null!=e?new o(e.x,e.y,i.width,i.height):new o}for(var c in l.prototype=Object.create(n.prototype),n)l[c]=n[c];l.prototype.getEdges=function(){return this.edges},l.prototype.getChild=function(){return this.child},l.prototype.getOwner=function(){return this.owner},l.prototype.getWidth=function(){return this.rect.width},l.prototype.setWidth=function(t){this.rect.width=t},l.prototype.getHeight=function(){return this.rect.height},l.prototype.setHeight=function(t){this.rect.height=t},l.prototype.getCenterX=function(){return this.rect.x+this.rect.width/2},l.prototype.getCenterY=function(){return this.rect.y+this.rect.height/2},l.prototype.getCenter=function(){return new h(this.rect.x+this.rect.width/2,this.rect.y+this.rect.height/2)},l.prototype.getLocation=function(){return new h(this.rect.x,this.rect.y)},l.prototype.getRect=function(){return this.rect},l.prototype.getDiagonal=function(){return Math.sqrt(this.rect.width*this.rect.width+this.rect.height*this.rect.height)},l.prototype.getHalfTheDiagonal=function(){return Math.sqrt(this.rect.height*this.rect.height+this.rect.width*this.rect.width)/2},l.prototype.setRect=function(t,e){this.rect.x=t.x,this.rect.y=t.y,this.rect.width=e.width,this.rect.height=e.height},l.prototype.setCenter=function(t,e){this.rect.x=t-this.rect.width/2,this.rect.y=e-this.rect.height/2},l.prototype.setLocation=function(t,e){this.rect.x=t,this.rect.y=e},l.prototype.moveBy=function(t,e){this.rect.x+=t,this.rect.y+=e},l.prototype.getEdgeListToNode=function(t){var e=[],i=this;return i.edges.forEach((function(n){if(n.target==t){if(n.source!=i)throw"Incorrect edge source!";e.push(n)}})),e},l.prototype.getEdgesBetween=function(t){var e=[],i=this;return i.edges.forEach((function(n){if(n.source!=i&&n.target!=i)throw"Incorrect edge source and/or target";n.target!=t&&n.source!=t||e.push(n)})),e},l.prototype.getNeighborsList=function(){var t=new Set,e=this;return e.edges.forEach((function(i){if(i.source==e)t.add(i.target);else{if(i.target!=e)throw"Incorrect incidency!";t.add(i.source)}})),t},l.prototype.withChildren=function(){var t=new Set;if(t.add(this),null!=this.child)for(var e=this.child.getNodes(),i=0;ie&&(this.rect.x-=(this.labelWidth-e)/2,this.setWidth(this.labelWidth)),this.labelHeight>i&&("center"==this.labelPos?this.rect.y-=(this.labelHeight-i)/2:"top"==this.labelPos&&(this.rect.y-=this.labelHeight-i),this.setHeight(this.labelHeight))}}},l.prototype.getInclusionTreeDepth=function(){if(this.inclusionTreeDepth==r.MAX_VALUE)throw"assert failed";return this.inclusionTreeDepth},l.prototype.transform=function(t){var e=this.rect.x;e>s.WORLD_BOUNDARY?e=s.WORLD_BOUNDARY:e<-s.WORLD_BOUNDARY&&(e=-s.WORLD_BOUNDARY);var i=this.rect.y;i>s.WORLD_BOUNDARY?i=s.WORLD_BOUNDARY:i<-s.WORLD_BOUNDARY&&(i=-s.WORLD_BOUNDARY);var n=new h(e,i),r=t.inverseTransformPoint(n);this.setLocation(r.x,r.y)},l.prototype.getLeft=function(){return this.rect.x},l.prototype.getRight=function(){return this.rect.x+this.rect.width},l.prototype.getTop=function(){return this.rect.y},l.prototype.getBottom=function(){return this.rect.y+this.rect.height},l.prototype.getParent=function(){return null==this.owner?null:this.owner.getParent()},t.exports=l},function(t,e,i){"use strict";function n(t,e){null==t&&null==e?(this.x=0,this.y=0):(this.x=t,this.y=e)}n.prototype.getX=function(){return this.x},n.prototype.getY=function(){return this.y},n.prototype.setX=function(t){this.x=t},n.prototype.setY=function(t){this.y=t},n.prototype.getDifference=function(t){return new DimensionD(this.x-t.x,this.y-t.y)},n.prototype.getCopy=function(){return new n(this.x,this.y)},n.prototype.translate=function(t){return this.x+=t.width,this.y+=t.height,this},t.exports=n},function(t,e,i){"use strict";var n=i(2),r=i(10),o=i(0),s=i(6),a=i(3),h=i(1),l=i(13),c=i(12),g=i(11);function u(t,e,i){n.call(this,i),this.estimatedSize=r.MIN_VALUE,this.margin=o.DEFAULT_GRAPH_MARGIN,this.edges=[],this.nodes=[],this.isConnected=!1,this.parent=t,null!=e&&e instanceof s?this.graphManager=e:null!=e&&e instanceof Layout&&(this.graphManager=e.graphManager)}for(var d in u.prototype=Object.create(n.prototype),n)u[d]=n[d];u.prototype.getNodes=function(){return this.nodes},u.prototype.getEdges=function(){return this.edges},u.prototype.getGraphManager=function(){return this.graphManager},u.prototype.getParent=function(){return this.parent},u.prototype.getLeft=function(){return this.left},u.prototype.getRight=function(){return this.right},u.prototype.getTop=function(){return this.top},u.prototype.getBottom=function(){return this.bottom},u.prototype.isConnected=function(){return this.isConnected},u.prototype.add=function(t,e,i){if(null==e&&null==i){var n=t;if(null==this.graphManager)throw"Graph has no graph mgr!";if(this.getNodes().indexOf(n)>-1)throw"Node already in graph!";return n.owner=this,this.getNodes().push(n),n}var r=t;if(!(this.getNodes().indexOf(e)>-1&&this.getNodes().indexOf(i)>-1))throw"Source or target not in graph!";if(e.owner!=i.owner||e.owner!=this)throw"Both owners must be this graph!";return e.owner!=i.owner?null:(r.source=e,r.target=i,r.isInterGraph=!1,this.getEdges().push(r),e.edges.push(r),i!=e&&i.edges.push(r),r)},u.prototype.remove=function(t){var e=t;if(t instanceof a){if(null==e)throw"Node is null!";if(null==e.owner||e.owner!=this)throw"Owner graph is invalid!";if(null==this.graphManager)throw"Owner graph manager is invalid!";for(var i=e.edges.slice(),n=i.length,r=0;r-1&&c>-1))throw"Source and/or target doesn't know this edge!";if(o.source.edges.splice(l,1),o.target!=o.source&&o.target.edges.splice(c,1),-1==(s=o.source.owner.getEdges().indexOf(o)))throw"Not in owner's edge list!";o.source.owner.getEdges().splice(s,1)}},u.prototype.updateLeftTop=function(){for(var t,e,i,n=r.MAX_VALUE,o=r.MAX_VALUE,s=this.getNodes(),a=s.length,h=0;h(t=l.getTop())&&(n=t),o>(e=l.getLeft())&&(o=e)}return n==r.MAX_VALUE?null:(i=void 0!=s[0].getParent().paddingLeft?s[0].getParent().paddingLeft:this.margin,this.left=o-i,this.top=n-i,new c(this.left,this.top))},u.prototype.updateBounds=function(t){for(var e,i,n,o,s,a=r.MAX_VALUE,h=-r.MAX_VALUE,c=r.MAX_VALUE,g=-r.MAX_VALUE,u=this.nodes,d=u.length,p=0;p(e=f.getLeft())&&(a=e),h<(i=f.getRight())&&(h=i),c>(n=f.getTop())&&(c=n),g<(o=f.getBottom())&&(g=o)}var y=new l(a,c,h-a,g-c);a==r.MAX_VALUE&&(this.left=this.parent.getLeft(),this.right=this.parent.getRight(),this.top=this.parent.getTop(),this.bottom=this.parent.getBottom()),s=void 0!=u[0].getParent().paddingLeft?u[0].getParent().paddingLeft:this.margin,this.left=y.x-s,this.right=y.x+y.width+s,this.top=y.y-s,this.bottom=y.y+y.height+s},u.calculateBounds=function(t){for(var e,i,n,o,s=r.MAX_VALUE,a=-r.MAX_VALUE,h=r.MAX_VALUE,c=-r.MAX_VALUE,g=t.length,u=0;u(e=d.getLeft())&&(s=e),a<(i=d.getRight())&&(a=i),h>(n=d.getTop())&&(h=n),c<(o=d.getBottom())&&(c=o)}return new l(s,h,a-s,c-h)},u.prototype.getInclusionTreeDepth=function(){return this==this.graphManager.getRoot()?1:this.parent.getInclusionTreeDepth()},u.prototype.getEstimatedSize=function(){if(this.estimatedSize==r.MIN_VALUE)throw"assert failed";return this.estimatedSize},u.prototype.calcEstimatedSize=function(){for(var t=0,e=this.nodes,i=e.length,n=0;n=this.nodes.length){var h=0;r.forEach((function(e){e.owner==t&&h++})),h==this.nodes.length&&(this.isConnected=!0)}}else this.isConnected=!0},t.exports=u},function(t,e,i){"use strict";var n,r=i(1);function o(t){n=i(5),this.layout=t,this.graphs=[],this.edges=[]}o.prototype.addRoot=function(){var t=this.layout.newGraph(),e=this.layout.newNode(null),i=this.add(t,e);return this.setRootGraph(i),this.rootGraph},o.prototype.add=function(t,e,i,n,r){if(null==i&&null==n&&null==r){if(null==t)throw"Graph is null!";if(null==e)throw"Parent node is null!";if(this.graphs.indexOf(t)>-1)throw"Graph already in this graph mgr!";if(this.graphs.push(t),null!=t.parent)throw"Already has a parent!";if(null!=e.child)throw"Already has a child!";return t.parent=e,e.child=t,t}r=i,i=t;var o=(n=e).getOwner(),s=r.getOwner();if(null==o||o.getGraphManager()!=this)throw"Source not in this graph mgr!";if(null==s||s.getGraphManager()!=this)throw"Target not in this graph mgr!";if(o==s)return i.isInterGraph=!1,o.add(i,n,r);if(i.isInterGraph=!0,i.source=n,i.target=r,this.edges.indexOf(i)>-1)throw"Edge already in inter-graph edge list!";if(this.edges.push(i),null==i.source||null==i.target)throw"Edge source and/or target is null!";if(-1!=i.source.edges.indexOf(i)||-1!=i.target.edges.indexOf(i))throw"Edge already in source and/or target incidency list!";return i.source.edges.push(i),i.target.edges.push(i),i},o.prototype.remove=function(t){if(t instanceof n){var e=t;if(e.getGraphManager()!=this)throw"Graph not in this graph mgr";if(e!=this.rootGraph&&(null==e.parent||e.parent.graphManager!=this))throw"Invalid parent node!";for(var i,o=[],s=(o=o.concat(e.getEdges())).length,a=0;a=e.getRight()?i[0]+=Math.min(e.getX()-t.getX(),t.getRight()-e.getRight()):e.getX()<=t.getX()&&e.getRight()>=t.getRight()&&(i[0]+=Math.min(t.getX()-e.getX(),e.getRight()-t.getRight())),t.getY()<=e.getY()&&t.getBottom()>=e.getBottom()?i[1]+=Math.min(e.getY()-t.getY(),t.getBottom()-e.getBottom()):e.getY()<=t.getY()&&e.getBottom()>=t.getBottom()&&(i[1]+=Math.min(t.getY()-e.getY(),e.getBottom()-t.getBottom()));var o=Math.abs((e.getCenterY()-t.getCenterY())/(e.getCenterX()-t.getCenterX()));e.getCenterY()===t.getCenterY()&&e.getCenterX()===t.getCenterX()&&(o=1);var s=o*i[0],a=i[1]/o;i[0]s)return i[0]=n,i[1]=h,i[2]=o,i[3]=m,!1;if(ro)return i[0]=a,i[1]=r,i[2]=E,i[3]=s,!1;if(no?(i[0]=c,i[1]=g,L=!0):(i[0]=l,i[1]=h,L=!0):O===I&&(n>o?(i[0]=a,i[1]=h,L=!0):(i[0]=u,i[1]=g,L=!0)),-D===I?o>n?(i[2]=_,i[3]=m,T=!0):(i[2]=E,i[3]=y,T=!0):D===I&&(o>n?(i[2]=f,i[3]=y,T=!0):(i[2]=v,i[3]=m,T=!0)),L&&T)return!1;if(n>o?r>s?(w=this.getCardinalDirection(O,I,4),R=this.getCardinalDirection(D,I,2)):(w=this.getCardinalDirection(-O,I,3),R=this.getCardinalDirection(-D,I,1)):r>s?(w=this.getCardinalDirection(-O,I,1),R=this.getCardinalDirection(-D,I,3)):(w=this.getCardinalDirection(O,I,2),R=this.getCardinalDirection(D,I,4)),!L)switch(w){case 1:M=h,C=n+-p/I,i[0]=C,i[1]=M;break;case 2:C=u,M=r+d*I,i[0]=C,i[1]=M;break;case 3:M=g,C=n+p/I,i[0]=C,i[1]=M;break;case 4:C=c,M=r+-d*I,i[0]=C,i[1]=M}if(!T)switch(R){case 1:G=y,x=o+-A/I,i[2]=x,i[3]=G;break;case 2:x=v,G=s+N*I,i[2]=x,i[3]=G;break;case 3:G=m,x=o+A/I,i[2]=x,i[3]=G;break;case 4:x=_,G=s+-N*I,i[2]=x,i[3]=G}}return!1},r.getCardinalDirection=function(t,e,i){return t>e?i:1+i%4},r.getIntersection=function(t,e,i,r){if(null==r)return this.getIntersection2(t,e,i);var o,s,a,h,l,c,g,u=t.x,d=t.y,p=e.x,f=e.y,y=i.x,E=i.y,_=r.x,m=r.y;return 0===(g=(o=f-d)*(h=y-_)-(s=m-E)*(a=u-p))?null:new n((a*(c=_*E-y*m)-h*(l=p*d-u*f))/g,(s*l-o*c)/g)},r.angleOfVector=function(t,e,i,n){var r=void 0;return t!==i?(r=Math.atan((n-e)/(i-t)),i0?1:t<0?-1:0},n.floor=function(t){return t<0?Math.ceil(t):Math.floor(t)},n.ceil=function(t){return t<0?Math.floor(t):Math.ceil(t)},t.exports=n},function(t,e,i){"use strict";function n(){}n.MAX_VALUE=2147483647,n.MIN_VALUE=-2147483648,t.exports=n},function(t,e,i){"use strict";var n=function(){function t(t,e){for(var i=0;i0&&e;){for(a.push(l[0]);a.length>0&&e;){var c=a[0];a.splice(0,1),s.add(c);var g=c.getEdges();for(o=0;o-1&&l.splice(f,1)}s=new Set,h=new Map}else t=[]}return t},u.prototype.createDummyNodesForBendpoints=function(t){for(var e=[],i=t.source,n=this.graphManager.calcLowestCommonAncestor(t.source,t.target),r=0;r0){for(var r=this.edgeToDummyNodes.get(i),o=0;o=0&&e.splice(g,1),c.getNeighborsList().forEach((function(t){if(i.indexOf(t)<0){var e=n.get(t)-1;1==e&&h.push(t),n.set(t,e)}}))}i=i.concat(h),1!=e.length&&2!=e.length||(r=!0,o=e[0])}return o},u.prototype.setGraphManager=function(t){this.graphManager=t},t.exports=u},function(t,e,i){"use strict";function n(){}n.seed=1,n.x=0,n.nextDouble=function(){return n.x=1e4*Math.sin(n.seed++),n.x-Math.floor(n.x)},t.exports=n},function(t,e,i){"use strict";var n=i(4);function r(t,e){this.lworldOrgX=0,this.lworldOrgY=0,this.ldeviceOrgX=0,this.ldeviceOrgY=0,this.lworldExtX=1,this.lworldExtY=1,this.ldeviceExtX=1,this.ldeviceExtY=1}r.prototype.getWorldOrgX=function(){return this.lworldOrgX},r.prototype.setWorldOrgX=function(t){this.lworldOrgX=t},r.prototype.getWorldOrgY=function(){return this.lworldOrgY},r.prototype.setWorldOrgY=function(t){this.lworldOrgY=t},r.prototype.getWorldExtX=function(){return this.lworldExtX},r.prototype.setWorldExtX=function(t){this.lworldExtX=t},r.prototype.getWorldExtY=function(){return this.lworldExtY},r.prototype.setWorldExtY=function(t){this.lworldExtY=t},r.prototype.getDeviceOrgX=function(){return this.ldeviceOrgX},r.prototype.setDeviceOrgX=function(t){this.ldeviceOrgX=t},r.prototype.getDeviceOrgY=function(){return this.ldeviceOrgY},r.prototype.setDeviceOrgY=function(t){this.ldeviceOrgY=t},r.prototype.getDeviceExtX=function(){return this.ldeviceExtX},r.prototype.setDeviceExtX=function(t){this.ldeviceExtX=t},r.prototype.getDeviceExtY=function(){return this.ldeviceExtY},r.prototype.setDeviceExtY=function(t){this.ldeviceExtY=t},r.prototype.transformX=function(t){var e=0,i=this.lworldExtX;return 0!=i&&(e=this.ldeviceOrgX+(t-this.lworldOrgX)*this.ldeviceExtX/i),e},r.prototype.transformY=function(t){var e=0,i=this.lworldExtY;return 0!=i&&(e=this.ldeviceOrgY+(t-this.lworldOrgY)*this.ldeviceExtY/i),e},r.prototype.inverseTransformX=function(t){var e=0,i=this.ldeviceExtX;return 0!=i&&(e=this.lworldOrgX+(t-this.ldeviceOrgX)*this.lworldExtX/i),e},r.prototype.inverseTransformY=function(t){var e=0,i=this.ldeviceExtY;return 0!=i&&(e=this.lworldOrgY+(t-this.ldeviceOrgY)*this.lworldExtY/i),e},r.prototype.inverseTransformPoint=function(t){return new n(this.inverseTransformX(t.x),this.inverseTransformY(t.y))},t.exports=r},function(t,e,i){"use strict";var n=i(15),r=i(7),o=i(0),s=i(8),a=i(9);function h(){n.call(this),this.useSmartIdealEdgeLengthCalculation=r.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION,this.idealEdgeLength=r.DEFAULT_EDGE_LENGTH,this.springConstant=r.DEFAULT_SPRING_STRENGTH,this.repulsionConstant=r.DEFAULT_REPULSION_STRENGTH,this.gravityConstant=r.DEFAULT_GRAVITY_STRENGTH,this.compoundGravityConstant=r.DEFAULT_COMPOUND_GRAVITY_STRENGTH,this.gravityRangeFactor=r.DEFAULT_GRAVITY_RANGE_FACTOR,this.compoundGravityRangeFactor=r.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR,this.displacementThresholdPerNode=3*r.DEFAULT_EDGE_LENGTH/100,this.coolingFactor=r.DEFAULT_COOLING_FACTOR_INCREMENTAL,this.initialCoolingFactor=r.DEFAULT_COOLING_FACTOR_INCREMENTAL,this.totalDisplacement=0,this.oldTotalDisplacement=0,this.maxIterations=r.MAX_ITERATIONS}for(var l in h.prototype=Object.create(n.prototype),n)h[l]=n[l];h.prototype.initParameters=function(){n.prototype.initParameters.call(this,arguments),this.totalIterations=0,this.notAnimatedIterations=0,this.useFRGridVariant=r.DEFAULT_USE_SMART_REPULSION_RANGE_CALCULATION,this.grid=[]},h.prototype.calcIdealEdgeLengths=function(){for(var t,e,i,n,s,a,h=this.getGraphManager().getAllEdges(),l=0;lr.ADAPTATION_LOWER_NODE_LIMIT&&(this.coolingFactor=Math.max(this.coolingFactor*r.COOLING_ADAPTATION_FACTOR,this.coolingFactor-(t-r.ADAPTATION_LOWER_NODE_LIMIT)/(r.ADAPTATION_UPPER_NODE_LIMIT-r.ADAPTATION_LOWER_NODE_LIMIT)*this.coolingFactor*(1-r.COOLING_ADAPTATION_FACTOR))),this.maxNodeDisplacement=r.MAX_NODE_DISPLACEMENT_INCREMENTAL):(t>r.ADAPTATION_LOWER_NODE_LIMIT?this.coolingFactor=Math.max(r.COOLING_ADAPTATION_FACTOR,1-(t-r.ADAPTATION_LOWER_NODE_LIMIT)/(r.ADAPTATION_UPPER_NODE_LIMIT-r.ADAPTATION_LOWER_NODE_LIMIT)*(1-r.COOLING_ADAPTATION_FACTOR)):this.coolingFactor=1,this.initialCoolingFactor=this.coolingFactor,this.maxNodeDisplacement=r.MAX_NODE_DISPLACEMENT),this.maxIterations=Math.max(5*this.getAllNodes().length,this.maxIterations),this.totalDisplacementThreshold=this.displacementThresholdPerNode*this.getAllNodes().length,this.repulsionRange=this.calcRepulsionRange()},h.prototype.calcSpringForces=function(){for(var t,e=this.getAllEdges(),i=0;i0&&void 0!==arguments[0])||arguments[0],a=arguments.length>1&&void 0!==arguments[1]&&arguments[1],h=this.getAllNodes();if(this.useFRGridVariant)for(this.totalIterations%r.GRID_CALCULATION_CHECK_PERIOD==1&&s&&this.updateGrid(),o=new Set,t=0;t(h=e.getEstimatedSize()*this.gravityRangeFactor)||a>h)&&(t.gravitationForceX=-this.gravityConstant*r,t.gravitationForceY=-this.gravityConstant*o):(s>(h=e.getEstimatedSize()*this.compoundGravityRangeFactor)||a>h)&&(t.gravitationForceX=-this.gravityConstant*r*this.compoundGravityConstant,t.gravitationForceY=-this.gravityConstant*o*this.compoundGravityConstant)},h.prototype.isConverged=function(){var t,e=!1;return this.totalIterations>this.maxIterations/3&&(e=Math.abs(this.totalDisplacement-this.oldTotalDisplacement)<2),t=this.totalDisplacement=a.length||l>=a[0].length))for(var c=0;ct}}]),t}();t.exports=o},function(t,e,i){"use strict";var n=function(){function t(t,e){for(var i=0;i2&&void 0!==arguments[2]?arguments[2]:1,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:-1,o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:-1;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.sequence1=e,this.sequence2=i,this.match_score=n,this.mismatch_penalty=r,this.gap_penalty=o,this.iMax=e.length+1,this.jMax=i.length+1,this.grid=new Array(this.iMax);for(var s=0;s=0;i--){var n=this.listeners[i];n.event===t&&n.callback===e&&this.listeners.splice(i,1)}},r.emit=function(t,e){for(var i=0;i 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 // a simple node, just move it\n if (this.child == null) {\n this.moveBy(this.displacementX, this.displacementY);\n }\n // an empty compound node, again just move it\n else if (this.child.getNodes().length == 0) {\n this.moveBy(this.displacementX, this.displacementY);\n }\n // non-empty compound node, propogate movement to children as well\n else {\n this.propogateDisplacementToChildren(this.displacementX, this.displacementY);\n }\n\n layout.totalDisplacement += Math.abs(this.displacementX) + Math.abs(this.displacementY);\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.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.moveBy(dX, dY);\n node.displacementX += dX;\n node.displacementY += dY;\n } else {\n node.propogateDisplacementToChildren(dX, dY);\n }\n }\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/* 6 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar FDLayout = __webpack_require__(0).FDLayout;\nvar CoSEGraphManager = __webpack_require__(4);\nvar CoSEGraph = __webpack_require__(3);\nvar CoSENode = __webpack_require__(5);\nvar CoSEEdge = __webpack_require__(2);\nvar CoSEConstants = __webpack_require__(1);\nvar FDLayoutConstants = __webpack_require__(0).FDLayoutConstants;\nvar LayoutConstants = __webpack_require__(0).LayoutConstants;\nvar Point = __webpack_require__(0).Point;\nvar PointD = __webpack_require__(0).PointD;\nvar Layout = __webpack_require__(0).Layout;\nvar Integer = __webpack_require__(0).Integer;\nvar IGeometry = __webpack_require__(0).IGeometry;\nvar LGraph = __webpack_require__(0).LGraph;\nvar Transform = __webpack_require__(0).Transform;\n\nfunction CoSELayout() {\n FDLayout.call(this);\n\n this.toBeTiled = {}; // Memorize if a node is to be tiled or is tiled\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.springConstant = FDLayoutConstants.DEFAULT_SPRING_STRENGTH;\n this.repulsionConstant = FDLayoutConstants.DEFAULT_REPULSION_STRENGTH;\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 // variables for cooling\n this.coolingCycle = 0;\n this.maxCoolingCycle = this.maxIterations / FDLayoutConstants.CONVERGENCE_CHECK_PERIOD;\n this.finalTemperature = FDLayoutConstants.CONVERGENCE_CHECK_PERIOD / this.maxIterations;\n this.coolingAdjuster = 1;\n }\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 this.initSpringEmbedder();\n this.runSpringEmbedder();\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 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 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\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 });\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\n this.adjustLocations(this.tiledMemberPack[id], lCompoundNode.rect.x, lCompoundNode.rect.y, horizontalMargin, verticalMargin);\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\n // Adjust the positions of nodes wrt its compound\n self.adjustLocations(tiledPack[id], compoundNode.rect.x, compoundNode.rect.y, horizontalMargin, verticalMargin);\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) {\n x += compoundHorizontalMargin;\n y += compoundVerticalMargin;\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 });\n};\n\nCoSELayout.prototype.tileNodes = function (nodes, minWidth) {\n var verticalPadding = CoSEConstants.TILING_PADDING_VERTICAL;\n var horizontalPadding = CoSEConstants.TILING_PADDING_HORIZONTAL;\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 };\n\n // Sort the nodes in ascending order of their areas\n nodes.sort(function (n1, n2) {\n if (n1.rect.width * n1.rect.height > n2.rect.width * n2.rect.height) return -1;\n if (n1.rect.width * n1.rect.height < n2.rect.width * n2.rect.height) return 1;\n return 0;\n });\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 this.insertNodeToRow(organization, lNode, this.getShortestRowIndex(organization), 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 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 prunedNodesInStepTemp.push([node, node.getEdges()[0], node.getOwner()]);\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 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\nmodule.exports = CoSELayout;\n\n/***/ }),\n/* 7 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar coseBase = {};\n\ncoseBase.layoutBase = __webpack_require__(0);\ncoseBase.CoSEConstants = __webpack_require__(1);\ncoseBase.CoSEEdge = __webpack_require__(2);\ncoseBase.CoSEGraph = __webpack_require__(3);\ncoseBase.CoSEGraphManager = __webpack_require__(4);\ncoseBase.CoSELayout = __webpack_require__(6);\ncoseBase.CoSENode = __webpack_require__(5);\n\nmodule.exports = coseBase;\n\n/***/ })\n/******/ ]);\n});","import {\n createText\n} from \"./chunk-C3MQ5ANM.mjs\";\nimport {\n parseFontSize\n} from \"./chunk-O4NI6UNU.mjs\";\nimport {\n selectSvgElement\n} from \"./chunk-7B677QYD.mjs\";\nimport {\n __name,\n defaultConfig_default,\n getConfig2 as getConfig,\n log,\n sanitizeText,\n setupGraphViewbox\n} from \"./chunk-YTJNT7DU.mjs\";\n\n// src/diagrams/mindmap/parser/mindmap.jison\nvar parser = function() {\n var o = /* @__PURE__ */ __name(function(k, v, o2, l) {\n for (o2 = o2 || {}, l = k.length; l--; o2[k[l]] = v) ;\n return o2;\n }, \"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];\n var parser2 = {\n trace: /* @__PURE__ */ __name(function trace() {\n }, \"trace\"),\n yy: {},\n 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 },\n 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\" },\n 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]],\n performAction: /* @__PURE__ */ __name(function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) {\n var $0 = $$.length - 1;\n switch (yystate) {\n case 6:\n case 7:\n return yy;\n break;\n case 8:\n yy.getLogger().trace(\"Stop NL \");\n break;\n case 9:\n yy.getLogger().trace(\"Stop EOF \");\n break;\n case 11:\n yy.getLogger().trace(\"Stop NL2 \");\n break;\n case 12:\n yy.getLogger().trace(\"Stop EOF2 \");\n break;\n case 15:\n yy.getLogger().info(\"Node: \", $$[$0].id);\n yy.addNode($$[$0 - 1].length, $$[$0].id, $$[$0].descr, $$[$0].type);\n break;\n case 16:\n yy.getLogger().trace(\"Icon: \", $$[$0]);\n yy.decorateNode({ icon: $$[$0] });\n break;\n case 17:\n case 21:\n yy.decorateNode({ class: $$[$0] });\n break;\n case 18:\n yy.getLogger().trace(\"SPACELIST\");\n break;\n case 19:\n yy.getLogger().trace(\"Node: \", $$[$0].id);\n yy.addNode(0, $$[$0].id, $$[$0].descr, $$[$0].type);\n break;\n case 20:\n yy.decorateNode({ icon: $$[$0] });\n break;\n case 25:\n yy.getLogger().trace(\"node found ..\", $$[$0 - 2]);\n this.$ = { id: $$[$0 - 1], descr: $$[$0 - 1], type: yy.getType($$[$0 - 2], $$[$0]) };\n break;\n case 26:\n this.$ = { id: $$[$0], descr: $$[$0], type: yy.nodeType.DEFAULT };\n break;\n case 27:\n yy.getLogger().trace(\"node found ..\", $$[$0 - 3]);\n this.$ = { id: $$[$0 - 3], descr: $$[$0 - 1], type: yy.getType($$[$0 - 2], $$[$0]) };\n break;\n }\n }, \"anonymous\"),\n 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])],\n defaultActions: { 2: [2, 1], 6: [2, 2] },\n parseError: /* @__PURE__ */ __name(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 }, \"parseError\"),\n parse: /* @__PURE__ */ __name(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 lexer2 = 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 lexer2.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer2;\n sharedState.yy.parser = this;\n if (typeof lexer2.yylloc == \"undefined\") {\n lexer2.yylloc = {};\n }\n var yyloc = lexer2.yylloc;\n lstack.push(yyloc);\n var ranges = lexer2.options && lexer2.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 __name(popStack, \"popStack\");\n function lex() {\n var token;\n token = tstack.pop() || lexer2.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 __name(lex, \"lex\");\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 (lexer2.showPosition) {\n errStr = \"Parse error on line \" + (yylineno + 1) + \":\\n\" + lexer2.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: lexer2.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer2.yylineno,\n loc: yyloc,\n 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(lexer2.yytext);\n lstack.push(lexer2.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = lexer2.yyleng;\n yytext = lexer2.yytext;\n yylineno = lexer2.yylineno;\n yyloc = lexer2.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 }, \"parse\")\n };\n var lexer = /* @__PURE__ */ function() {\n var lexer2 = {\n EOF: 1,\n parseError: /* @__PURE__ */ __name(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 }, \"parseError\"),\n // resets the lexer, sets new input\n setInput: /* @__PURE__ */ __name(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 }, \"setInput\"),\n // consumes and returns one char from the input\n input: /* @__PURE__ */ __name(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 this._input = this._input.slice(1);\n return ch;\n }, \"input\"),\n // unshifts one char (or a string) into the input\n unput: /* @__PURE__ */ __name(function(ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - 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 if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\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 ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len\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 }, \"unput\"),\n // When called from action, caches matched text and appends it on next action\n more: /* @__PURE__ */ __name(function() {\n this._more = true;\n return this;\n }, \"more\"),\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.\n reject: /* @__PURE__ */ __name(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 return this;\n }, \"reject\"),\n // retain first n characters of the match\n less: /* @__PURE__ */ __name(function(n) {\n this.unput(this.match.slice(n));\n }, \"less\"),\n // displays already matched input, i.e. for error messages\n pastInput: /* @__PURE__ */ __name(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 }, \"pastInput\"),\n // displays upcoming input, i.e. for error messages\n upcomingInput: /* @__PURE__ */ __name(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 }, \"upcomingInput\"),\n // displays the character position where the lexing error occurred, i.e. for error messages\n showPosition: /* @__PURE__ */ __name(function() {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n }, \"showPosition\"),\n // test the lexed token: return FALSE when not a match, otherwise return token\n test_match: /* @__PURE__ */ __name(function(match, indexed_rule) {\n var token, lines, backup;\n if (this.options.backtrack_lexer) {\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 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 ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length : 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 for (var k in backup) {\n this[k] = backup[k];\n }\n return false;\n }\n return false;\n }, \"test_match\"),\n // return next match in input\n next: /* @__PURE__ */ __name(function() {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n var token, match, tempMatch, 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;\n } else {\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 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 }, \"next\"),\n // return next match that has a token\n lex: /* @__PURE__ */ __name(function lex() {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n }, \"lex\"),\n // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\n begin: /* @__PURE__ */ __name(function begin(condition) {\n this.conditionStack.push(condition);\n }, \"begin\"),\n // pop the previously active lexer condition state off the condition stack\n popState: /* @__PURE__ */ __name(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 }, \"popState\"),\n // produce the lexer rule set which is active for the currently active lexer condition state\n _currentRules: /* @__PURE__ */ __name(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 }, \"_currentRules\"),\n // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\n topState: /* @__PURE__ */ __name(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 }, \"topState\"),\n // alias for begin(condition)\n pushState: /* @__PURE__ */ __name(function pushState(condition) {\n this.begin(condition);\n }, \"pushState\"),\n // return the number of states currently on the stack\n stateStackSize: /* @__PURE__ */ __name(function stateStackSize() {\n return this.conditionStack.length;\n }, \"stateStackSize\"),\n options: { \"case-insensitive\": true },\n performAction: /* @__PURE__ */ __name(function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) {\n var YYSTATE = YY_START;\n switch ($avoiding_name_collisions) {\n case 0:\n yy.getLogger().trace(\"Found comment\", yy_.yytext);\n return 6;\n break;\n case 1:\n return 8;\n break;\n case 2:\n this.begin(\"CLASS\");\n break;\n case 3:\n this.popState();\n return 16;\n break;\n case 4:\n this.popState();\n break;\n case 5:\n yy.getLogger().trace(\"Begin icon\");\n this.begin(\"ICON\");\n break;\n case 6:\n yy.getLogger().trace(\"SPACELINE\");\n return 6;\n break;\n case 7:\n return 7;\n break;\n case 8:\n return 15;\n break;\n case 9:\n yy.getLogger().trace(\"end icon\");\n this.popState();\n break;\n case 10:\n yy.getLogger().trace(\"Exploding node\");\n this.begin(\"NODE\");\n return 19;\n break;\n case 11:\n yy.getLogger().trace(\"Cloud\");\n this.begin(\"NODE\");\n return 19;\n break;\n case 12:\n yy.getLogger().trace(\"Explosion Bang\");\n this.begin(\"NODE\");\n return 19;\n break;\n case 13:\n yy.getLogger().trace(\"Cloud Bang\");\n this.begin(\"NODE\");\n return 19;\n break;\n case 14:\n this.begin(\"NODE\");\n return 19;\n break;\n case 15:\n this.begin(\"NODE\");\n return 19;\n break;\n case 16:\n this.begin(\"NODE\");\n return 19;\n break;\n case 17:\n this.begin(\"NODE\");\n return 19;\n break;\n case 18:\n return 13;\n break;\n case 19:\n return 22;\n break;\n case 20:\n return 11;\n break;\n case 21:\n this.begin(\"NSTR2\");\n break;\n case 22:\n return \"NODE_DESCR\";\n break;\n case 23:\n this.popState();\n break;\n case 24:\n yy.getLogger().trace(\"Starting NSTR\");\n this.begin(\"NSTR\");\n break;\n case 25:\n yy.getLogger().trace(\"description:\", yy_.yytext);\n return \"NODE_DESCR\";\n break;\n case 26:\n this.popState();\n break;\n case 27:\n this.popState();\n yy.getLogger().trace(\"node end ))\");\n return \"NODE_DEND\";\n break;\n case 28:\n this.popState();\n yy.getLogger().trace(\"node end )\");\n return \"NODE_DEND\";\n break;\n case 29:\n this.popState();\n yy.getLogger().trace(\"node end ...\", yy_.yytext);\n return \"NODE_DEND\";\n break;\n case 30:\n this.popState();\n yy.getLogger().trace(\"node end ((\");\n return \"NODE_DEND\";\n break;\n case 31:\n this.popState();\n yy.getLogger().trace(\"node end (-\");\n return \"NODE_DEND\";\n break;\n case 32:\n this.popState();\n yy.getLogger().trace(\"node end (-\");\n return \"NODE_DEND\";\n break;\n case 33:\n this.popState();\n yy.getLogger().trace(\"node end ((\");\n return \"NODE_DEND\";\n break;\n case 34:\n this.popState();\n yy.getLogger().trace(\"node end ((\");\n return \"NODE_DEND\";\n break;\n case 35:\n yy.getLogger().trace(\"Long description:\", yy_.yytext);\n return 20;\n break;\n case 36:\n yy.getLogger().trace(\"Long description:\", yy_.yytext);\n return 20;\n break;\n }\n }, \"anonymous\"),\n 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],\n 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 } }\n };\n return lexer2;\n }();\n parser2.lexer = lexer;\n function Parser() {\n this.yy = {};\n }\n __name(Parser, \"Parser\");\n Parser.prototype = parser2;\n parser2.Parser = Parser;\n return new Parser();\n}();\nparser.parser = parser;\nvar mindmap_default = parser;\n\n// src/diagrams/mindmap/mindmapDb.ts\nvar nodes = [];\nvar cnt = 0;\nvar elements = {};\nvar clear = /* @__PURE__ */ __name(() => {\n nodes = [];\n cnt = 0;\n elements = {};\n}, \"clear\");\nvar getParent = /* @__PURE__ */ __name(function(level) {\n for (let i = nodes.length - 1; i >= 0; i--) {\n if (nodes[i].level < level) {\n return nodes[i];\n }\n }\n return null;\n}, \"getParent\");\nvar getMindmap = /* @__PURE__ */ __name(() => {\n return nodes.length > 0 ? nodes[0] : null;\n}, \"getMindmap\");\nvar addNode = /* @__PURE__ */ __name((level, id, descr, type) => {\n log.info(\"addNode\", level, id, descr, type);\n const conf = getConfig();\n let padding = conf.mindmap?.padding ?? defaultConfig_default.mindmap.padding;\n switch (type) {\n case nodeType.ROUNDED_RECT:\n case nodeType.RECT:\n case nodeType.HEXAGON:\n padding *= 2;\n }\n const node = {\n id: cnt++,\n nodeId: sanitizeText(id, conf),\n level,\n descr: sanitizeText(descr, conf),\n type,\n children: [],\n width: conf.mindmap?.maxNodeWidth ?? defaultConfig_default.mindmap.maxNodeWidth,\n padding\n };\n const parent = getParent(level);\n if (parent) {\n parent.children.push(node);\n nodes.push(node);\n } else {\n if (nodes.length === 0) {\n 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}, \"addNode\");\nvar 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};\nvar getType = /* @__PURE__ */ __name((startStr, endStr) => {\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}, \"getType\");\nvar setElementForId = /* @__PURE__ */ __name((id, element) => {\n elements[id] = element;\n}, \"setElementForId\");\nvar decorateNode = /* @__PURE__ */ __name((decoration) => {\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.class = sanitizeText(decoration.class, config);\n }\n}, \"decorateNode\");\nvar type2Str = /* @__PURE__ */ __name((type) => {\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\";\n // cspell: disable-line\n default:\n return \"no-border\";\n }\n}, \"type2Str\");\nvar getLogger = /* @__PURE__ */ __name(() => log, \"getLogger\");\nvar getElementById = /* @__PURE__ */ __name((id) => elements[id], \"getElementById\");\nvar db = {\n clear,\n addNode,\n getMindmap,\n nodeType,\n getType,\n setElementForId,\n decorateNode,\n type2Str,\n getLogger,\n getElementById\n};\nvar mindmapDb_default = db;\n\n// src/diagrams/mindmap/mindmapRenderer.ts\nimport cytoscape from \"cytoscape\";\nimport coseBilkent from \"cytoscape-cose-bilkent\";\nimport { select } from \"d3\";\n\n// src/diagrams/mindmap/svgDraw.ts\nvar MAX_SECTIONS = 12;\nvar defaultBkg = /* @__PURE__ */ __name(function(db2, elem, node, section) {\n const rd = 5;\n elem.append(\"path\").attr(\"id\", \"node-\" + node.id).attr(\"class\", \"node-bkg node-\" + db2.type2Str(node.type)).attr(\n \"d\",\n `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`\n );\n elem.append(\"line\").attr(\"class\", \"node-line-\" + section).attr(\"x1\", 0).attr(\"y1\", node.height).attr(\"x2\", node.width).attr(\"y2\", node.height);\n}, \"defaultBkg\");\nvar rectBkg = /* @__PURE__ */ __name(function(db2, elem, node) {\n elem.append(\"rect\").attr(\"id\", \"node-\" + node.id).attr(\"class\", \"node-bkg node-\" + db2.type2Str(node.type)).attr(\"height\", node.height).attr(\"width\", node.width);\n}, \"rectBkg\");\nvar cloudBkg = /* @__PURE__ */ __name(function(db2, elem, node) {\n const w = node.width;\n const h = node.height;\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 elem.append(\"path\").attr(\"id\", \"node-\" + node.id).attr(\"class\", \"node-bkg node-\" + db2.type2Str(node.type)).attr(\n \"d\",\n `M0 0 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},${1 * w * 0.2}\n\n a${r1},${r1} 1 0,1 ${w * 0.15},${1 * h * 0.35}\n a${r4},${r4} 1 0,1 ${-1 * w * 0.15},${1 * 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\n H0 V0 Z`\n );\n}, \"cloudBkg\");\nvar bangBkg = /* @__PURE__ */ __name(function(db2, elem, node) {\n const w = node.width;\n const h = node.height;\n const r = 0.15 * w;\n elem.append(\"path\").attr(\"id\", \"node-\" + node.id).attr(\"class\", \"node-bkg node-\" + db2.type2Str(node.type)).attr(\n \"d\",\n `M0 0 a${r},${r} 1 0,0 ${w * 0.25},${-1 * h * 0.1}\n a${r},${r} 1 0,0 ${w * 0.25},${0}\n a${r},${r} 1 0,0 ${w * 0.25},${0}\n a${r},${r} 1 0,0 ${w * 0.25},${1 * h * 0.1}\n\n a${r},${r} 1 0,0 ${w * 0.15},${1 * h * 0.33}\n a${r * 0.8},${r * 0.8} 1 0,0 ${0},${1 * h * 0.34}\n a${r},${r} 1 0,0 ${-1 * w * 0.15},${1 * h * 0.33}\n\n a${r},${r} 1 0,0 ${-1 * w * 0.25},${h * 0.15}\n a${r},${r} 1 0,0 ${-1 * w * 0.25},${0}\n a${r},${r} 1 0,0 ${-1 * w * 0.25},${0}\n a${r},${r} 1 0,0 ${-1 * w * 0.25},${-1 * h * 0.15}\n\n a${r},${r} 1 0,0 ${-1 * w * 0.1},${-1 * h * 0.33}\n a${r * 0.8},${r * 0.8} 1 0,0 ${0},${-1 * h * 0.34}\n a${r},${r} 1 0,0 ${w * 0.1},${-1 * h * 0.33}\n\n H0 V0 Z`\n );\n}, \"bangBkg\");\nvar circleBkg = /* @__PURE__ */ __name(function(db2, elem, node) {\n elem.append(\"circle\").attr(\"id\", \"node-\" + node.id).attr(\"class\", \"node-bkg node-\" + db2.type2Str(node.type)).attr(\"r\", node.width / 2);\n}, \"circleBkg\");\nfunction insertPolygonShape(parent, w, h, points, node) {\n return parent.insert(\"polygon\", \":first-child\").attr(\n \"points\",\n points.map(function(d) {\n return d.x + \",\" + d.y;\n }).join(\" \")\n ).attr(\"transform\", \"translate(\" + (node.width - w) / 2 + \", \" + h + \")\");\n}\n__name(insertPolygonShape, \"insertPolygonShape\");\nvar hexagonBkg = /* @__PURE__ */ __name(function(_db, elem, node) {\n const h = node.height;\n const f = 4;\n const m = h / f;\n const w = node.width - node.padding + 2 * m;\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 insertPolygonShape(elem, w, h, points, node);\n}, \"hexagonBkg\");\nvar roundedRectBkg = /* @__PURE__ */ __name(function(db2, elem, node) {\n elem.append(\"rect\").attr(\"id\", \"node-\" + node.id).attr(\"class\", \"node-bkg node-\" + db2.type2Str(node.type)).attr(\"height\", node.height).attr(\"rx\", node.padding).attr(\"ry\", node.padding).attr(\"width\", node.width);\n}, \"roundedRectBkg\");\nvar drawNode = /* @__PURE__ */ __name(async function(db2, elem, node, fullSection, conf) {\n const htmlLabels = conf.htmlLabels;\n const section = fullSection % (MAX_SECTIONS - 1);\n const nodeElem = elem.append(\"g\");\n node.section = section;\n let sectionClass = \"section-\" + section;\n if (section < 0) {\n sectionClass += \" section-root\";\n }\n nodeElem.attr(\"class\", (node.class ? node.class + \" \" : \"\") + \"mindmap-node \" + sectionClass);\n const bkgElem = nodeElem.append(\"g\");\n const textElem = nodeElem.append(\"g\");\n const description = node.descr.replace(/()/g, \"\\n\");\n await createText(\n textElem,\n description,\n {\n useHtmlLabels: htmlLabels,\n width: node.width,\n classes: \"mindmap-node-label\"\n },\n conf\n );\n if (!htmlLabels) {\n textElem.attr(\"dy\", \"1em\").attr(\"alignment-baseline\", \"middle\").attr(\"dominant-baseline\", \"middle\").attr(\"text-anchor\", \"middle\");\n }\n const bbox = textElem.node().getBBox();\n const [fontSize] = parseFontSize(conf.fontSize);\n node.height = bbox.height + fontSize * 1.1 * 0.5 + node.padding;\n node.width = bbox.width + 2 * node.padding;\n if (node.icon) {\n if (node.type === db2.nodeType.CIRCLE) {\n node.height += 50;\n node.width += 50;\n const icon = nodeElem.append(\"foreignObject\").attr(\"height\", \"50px\").attr(\"width\", node.width).attr(\"style\", \"text-align: center;\");\n icon.append(\"div\").attr(\"class\", \"icon-container\").append(\"i\").attr(\"class\", \"node-icon-\" + section + \" \" + node.icon);\n textElem.attr(\n \"transform\",\n \"translate(\" + node.width / 2 + \", \" + (node.height / 2 - 1.5 * node.padding) + \")\"\n );\n } else {\n node.width += 50;\n const orgHeight = node.height;\n node.height = Math.max(orgHeight, 60);\n const heightDiff = Math.abs(node.height - orgHeight);\n const icon = nodeElem.append(\"foreignObject\").attr(\"width\", \"60px\").attr(\"height\", node.height).attr(\"style\", \"text-align: center;margin-top:\" + heightDiff / 2 + \"px;\");\n icon.append(\"div\").attr(\"class\", \"icon-container\").append(\"i\").attr(\"class\", \"node-icon-\" + section + \" \" + node.icon);\n textElem.attr(\n \"transform\",\n \"translate(\" + (25 + node.width / 2) + \", \" + (heightDiff / 2 + node.padding / 2) + \")\"\n );\n }\n } else {\n if (!htmlLabels) {\n const dx = node.width / 2;\n const dy = node.padding / 2;\n textElem.attr(\"transform\", \"translate(\" + dx + \", \" + dy + \")\");\n } else {\n const dx = (node.width - bbox.width) / 2;\n const dy = (node.height - bbox.height) / 2;\n textElem.attr(\"transform\", \"translate(\" + dx + \", \" + dy + \")\");\n }\n }\n switch (node.type) {\n case db2.nodeType.DEFAULT:\n defaultBkg(db2, bkgElem, node, section);\n break;\n case db2.nodeType.ROUNDED_RECT:\n roundedRectBkg(db2, bkgElem, node, section);\n break;\n case db2.nodeType.RECT:\n rectBkg(db2, bkgElem, node, section);\n break;\n case db2.nodeType.CIRCLE:\n bkgElem.attr(\"transform\", \"translate(\" + node.width / 2 + \", \" + +node.height / 2 + \")\");\n circleBkg(db2, bkgElem, node, section);\n break;\n case db2.nodeType.CLOUD:\n cloudBkg(db2, bkgElem, node, section);\n break;\n case db2.nodeType.BANG:\n bangBkg(db2, bkgElem, node, section);\n break;\n case db2.nodeType.HEXAGON:\n hexagonBkg(db2, bkgElem, node, section);\n break;\n }\n db2.setElementForId(node.id, nodeElem);\n return node.height;\n}, \"drawNode\");\nvar positionNode = /* @__PURE__ */ __name(function(db2, node) {\n const nodeElem = db2.getElementById(node.id);\n const x = node.x || 0;\n const y = node.y || 0;\n nodeElem.attr(\"transform\", \"translate(\" + x + \",\" + y + \")\");\n}, \"positionNode\");\n\n// src/diagrams/mindmap/mindmapRenderer.ts\ncytoscape.use(coseBilkent);\nasync function drawNodes(db2, svg, mindmap, section, conf) {\n await drawNode(db2, svg, mindmap, section, conf);\n if (mindmap.children) {\n await Promise.all(\n mindmap.children.map(\n (child, index) => drawNodes(db2, svg, child, section < 0 ? index : section, conf)\n )\n );\n }\n}\n__name(drawNodes, \"drawNodes\");\nfunction drawEdges(edgesEl, cy) {\n cy.edges().map((edge, id) => {\n const data = edge.data();\n if (edge[0]._private.bodyBounds) {\n const bounds = edge[0]._private.rscratch;\n log.trace(\"Edge: \", id, data);\n edgesEl.insert(\"path\").attr(\n \"d\",\n `M ${bounds.startX},${bounds.startY} L ${bounds.midX},${bounds.midY} L${bounds.endX},${bounds.endY} `\n ).attr(\"class\", \"edge section-edge-\" + data.section + \" edge-depth-\" + data.depth);\n }\n });\n}\n__name(drawEdges, \"drawEdges\");\nfunction addNodes(mindmap, cy, conf, level) {\n cy.add({\n group: \"nodes\",\n data: {\n id: mindmap.id.toString(),\n labelText: mindmap.descr,\n height: mindmap.height,\n width: mindmap.width,\n level,\n nodeId: mindmap.id,\n padding: mindmap.padding,\n type: mindmap.type\n },\n position: {\n x: mindmap.x,\n y: mindmap.y\n }\n });\n if (mindmap.children) {\n mindmap.children.forEach((child) => {\n addNodes(child, cy, conf, level + 1);\n cy.add({\n group: \"edges\",\n data: {\n id: `${mindmap.id}_${child.id}`,\n source: mindmap.id,\n target: child.id,\n depth: level,\n section: child.section\n }\n });\n });\n }\n}\n__name(addNodes, \"addNodes\");\nfunction layoutMindmap(node, conf) {\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 // container to render in\n style: [\n {\n selector: \"edge\",\n style: {\n \"curve-style\": \"bezier\"\n }\n }\n ]\n });\n renderEl.remove();\n addNodes(node, cy, conf, 0);\n cy.nodes().forEach(function(n) {\n n.layoutDimensions = () => {\n const data = n.data();\n return { w: data.width, h: data.height };\n };\n });\n cy.layout({\n name: \"cose-bilkent\",\n // @ts-ignore Types for cose-bilkent are not correct?\n quality: \"proof\",\n styleEnabled: false,\n animate: false\n }).run();\n cy.ready((e) => {\n log.info(\"Ready\", e);\n resolve(cy);\n });\n });\n}\n__name(layoutMindmap, \"layoutMindmap\");\nfunction positionNodes(db2, cy) {\n cy.nodes().map((node, id) => {\n const data = node.data();\n data.x = node.position().x;\n data.y = node.position().y;\n positionNode(db2, data);\n const el = db2.getElementById(data.nodeId);\n log.info(\"Id:\", id, \"Position: (\", node.position().x, \", \", node.position().y, \")\", data);\n el.attr(\n \"transform\",\n `translate(${node.position().x - data.width / 2}, ${node.position().y - data.height / 2})`\n );\n el.attr(\"attr\", `apa-${id})`);\n });\n}\n__name(positionNodes, \"positionNodes\");\nvar draw = /* @__PURE__ */ __name(async (text, id, _version, diagObj) => {\n log.debug(\"Rendering mindmap diagram\\n\" + text);\n const db2 = diagObj.db;\n const mm = db2.getMindmap();\n if (!mm) {\n return;\n }\n const conf = getConfig();\n conf.htmlLabels = false;\n const svg = selectSvgElement(id);\n const edgesElem = svg.append(\"g\");\n edgesElem.attr(\"class\", \"mindmap-edges\");\n const nodesElem = svg.append(\"g\");\n nodesElem.attr(\"class\", \"mindmap-nodes\");\n await drawNodes(db2, nodesElem, mm, -1, conf);\n const cy = await layoutMindmap(mm, conf);\n drawEdges(edgesElem, cy);\n positionNodes(db2, cy);\n setupGraphViewbox(\n void 0,\n svg,\n conf.mindmap?.padding ?? defaultConfig_default.mindmap.padding,\n conf.mindmap?.useMaxWidth ?? defaultConfig_default.mindmap.useMaxWidth\n );\n}, \"draw\");\nvar mindmapRenderer_default = {\n draw\n};\n\n// src/diagrams/mindmap/styles.ts\nimport { darken, lighten, isDark } from \"khroma\";\nvar genSections = /* @__PURE__ */ __name((options) => {\n let sections = \"\";\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 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-${i - 1} 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}, \"genSections\");\nvar getStyles = /* @__PURE__ */ __name((options) => `\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 .mindmap-node-label {\n dy: 1em;\n alignment-baseline: middle;\n text-anchor: middle;\n dominant-baseline: middle;\n text-align: center;\n }\n`, \"getStyles\");\nvar styles_default = getStyles;\n\n// src/diagrams/mindmap/mindmap-definition.ts\nvar diagram = {\n db: mindmapDb_default,\n renderer: mindmapRenderer_default,\n parser: mindmap_default,\n styles: styles_default\n};\nexport {\n diagram\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[\"cytoscapeCoseBilkent\"] = factory(require(\"cose-base\"));\n\telse\n\t\troot[\"cytoscapeCoseBilkent\"] = factory(root[\"coseBase\"]);\n})(this, function(__WEBPACK_EXTERNAL_MODULE_0__) {\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 = 1);\n/******/ })\n/************************************************************************/\n/******/ ([\n/* 0 */\n/***/ (function(module, exports) {\n\nmodule.exports = __WEBPACK_EXTERNAL_MODULE_0__;\n\n/***/ }),\n/* 1 */\n/***/ (function(module, exports, __webpack_require__) {\n\n\"use strict\";\n\n\nvar LayoutConstants = __webpack_require__(0).layoutBase.LayoutConstants;\nvar FDLayoutConstants = __webpack_require__(0).layoutBase.FDLayoutConstants;\nvar CoSEConstants = __webpack_require__(0).CoSEConstants;\nvar CoSELayout = __webpack_require__(0).CoSELayout;\nvar CoSENode = __webpack_require__(0).CoSENode;\nvar PointD = __webpack_require__(0).layoutBase.PointD;\nvar DimensionD = __webpack_require__(0).layoutBase.DimensionD;\n\nvar defaults = {\n // Called on `layoutready`\n ready: function ready() {},\n // Called on `layoutstop`\n stop: function stop() {},\n // 'draft', 'default' or 'proof\" \n // - 'draft' fast cooling rate \n // - 'default' moderate cooling rate \n // - \"proof\" slow cooling rate\n quality: 'default',\n // include labels in node dimensions\n nodeDimensionsIncludeLabels: false,\n // number of ticks per frame; higher is faster but more jerky\n refresh: 30,\n // Whether to fit the network view after when done\n fit: true,\n // Padding on fit\n padding: 10,\n // Whether to enable incremental mode\n randomize: true,\n // Node repulsion (non overlapping) multiplier\n nodeRepulsion: 4500,\n // Ideal edge (non nested) length\n idealEdgeLength: 50,\n // Divisor to compute edge forces\n edgeElasticity: 0.45,\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 // Type of layout animation. The option set is {'during', 'end', false}\n animate: 'end',\n // Duration for animate:end\n animationDuration: 500,\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.5\n};\n\nfunction extend(defaults, options) {\n var obj = {};\n\n for (var i in defaults) {\n obj[i] = defaults[i];\n }\n\n for (var i in options) {\n obj[i] = options[i];\n }\n\n return obj;\n};\n\nfunction _CoSELayout(_options) {\n this.options = extend(defaults, _options);\n getUserOptions(this.options);\n}\n\nvar getUserOptions = function getUserOptions(options) {\n if (options.nodeRepulsion != null) CoSEConstants.DEFAULT_REPULSION_STRENGTH = FDLayoutConstants.DEFAULT_REPULSION_STRENGTH = options.nodeRepulsion;\n if (options.idealEdgeLength != null) CoSEConstants.DEFAULT_EDGE_LENGTH = FDLayoutConstants.DEFAULT_EDGE_LENGTH = options.idealEdgeLength;\n if (options.edgeElasticity != null) CoSEConstants.DEFAULT_SPRING_STRENGTH = FDLayoutConstants.DEFAULT_SPRING_STRENGTH = options.edgeElasticity;\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.quality == 'draft') LayoutConstants.QUALITY = 0;else if (options.quality == 'proof') LayoutConstants.QUALITY = 2;else LayoutConstants.QUALITY = 1;\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\n_CoSELayout.prototype.run = function () {\n var ready;\n var frameId;\n var options = this.options;\n var idToLNode = this.idToLNode = {};\n var layout = this.layout = new CoSELayout();\n var self = this;\n\n self.stopped = false;\n\n this.cy = this.options.cy;\n\n this.cy.trigger({ type: 'layoutstart', layout: this });\n\n var gm = layout.newGraphManager();\n this.gm = gm;\n\n var nodes = this.options.eles.nodes();\n var edges = this.options.eles.edges();\n\n this.root = gm.addRoot();\n this.processChildrenList(this.root, this.getTopMostNodes(nodes), layout);\n\n for (var i = 0; i < edges.length; i++) {\n var edge = edges[i];\n var sourceNode = this.idToLNode[edge.data(\"source\")];\n var targetNode = this.idToLNode[edge.data(\"target\")];\n if (sourceNode !== targetNode && sourceNode.getEdgesBetween(targetNode).length == 0) {\n var e1 = gm.add(layout.newEdge(), sourceNode, targetNode);\n e1.id = edge.id();\n }\n }\n\n var getPositions = function getPositions(ele, i) {\n if (typeof ele === \"number\") {\n ele = i;\n }\n var theId = ele.data('id');\n var lNode = self.idToLNode[theId];\n\n return {\n x: lNode.getRect().getCenterX(),\n y: lNode.getRect().getCenterY()\n };\n };\n\n /*\n * Reposition nodes in iterations animatedly\n */\n var iterateAnimated = function iterateAnimated() {\n // Thigs to perform after nodes are repositioned on screen\n var afterReposition = function afterReposition() {\n if (options.fit) {\n options.cy.fit(options.eles, options.padding);\n }\n\n if (!ready) {\n ready = true;\n self.cy.one('layoutready', options.ready);\n self.cy.trigger({ type: 'layoutready', layout: self });\n }\n };\n\n var ticksPerFrame = self.options.refresh;\n var isDone;\n\n for (var i = 0; i < ticksPerFrame && !isDone; i++) {\n isDone = self.stopped || self.layout.tick();\n }\n\n // If layout is done\n if (isDone) {\n // If the layout is not a sublayout and it is successful perform post layout.\n if (layout.checkLayoutSuccess() && !layout.isSubLayout) {\n layout.doPostLayout();\n }\n\n // If layout has a tilingPostLayout function property call it.\n if (layout.tilingPostLayout) {\n layout.tilingPostLayout();\n }\n\n layout.isLayoutFinished = true;\n\n self.options.eles.nodes().positions(getPositions);\n\n afterReposition();\n\n // trigger layoutstop when the layout stops (e.g. finishes)\n self.cy.one('layoutstop', self.options.stop);\n self.cy.trigger({ type: 'layoutstop', layout: self });\n\n if (frameId) {\n cancelAnimationFrame(frameId);\n }\n\n ready = false;\n return;\n }\n\n var animationData = self.layout.getPositionsData(); // Get positions of layout nodes note that all nodes may not be layout nodes because of tiling\n\n // Position nodes, for the nodes whose id does not included in data (because they are removed from their parents and included in dummy compounds)\n // use position of their ancestors or dummy ancestors\n options.eles.nodes().positions(function (ele, i) {\n if (typeof ele === \"number\") {\n ele = i;\n }\n // If ele is a compound node, then its position will be defined by its children\n if (!ele.isParent()) {\n var theId = ele.id();\n var pNode = animationData[theId];\n var temp = ele;\n // If pNode is undefined search until finding position data of its first ancestor (It may be dummy as well)\n while (pNode == null) {\n pNode = animationData[temp.data('parent')] || animationData['DummyCompound_' + temp.data('parent')];\n animationData[theId] = pNode;\n temp = temp.parent()[0];\n if (temp == undefined) {\n break;\n }\n }\n if (pNode != null) {\n return {\n x: pNode.x,\n y: pNode.y\n };\n } else {\n return {\n x: ele.position('x'),\n y: ele.position('y')\n };\n }\n }\n });\n\n afterReposition();\n\n frameId = requestAnimationFrame(iterateAnimated);\n };\n\n /*\n * Listen 'layoutstarted' event and start animated iteration if animate option is 'during'\n */\n layout.addListener('layoutstarted', function () {\n if (self.options.animate === 'during') {\n frameId = requestAnimationFrame(iterateAnimated);\n }\n });\n\n layout.runLayout(); // Run cose layout\n\n /*\n * If animate option is not 'during' ('end' or false) perform these here (If it is 'during' similar things are already performed)\n */\n if (this.options.animate !== \"during\") {\n self.options.eles.nodes().not(\":parent\").layoutPositions(self, self.options, getPositions); // Use layout positions to reposition the nodes it considers the options parameter\n ready = false;\n }\n\n return this; // chaining\n};\n\n//Get the top most ones of a list of nodes\n_CoSELayout.prototype.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_CoSELayout.prototype.processChildrenList = function (parent, children, layout) {\n var size = children.length;\n for (var i = 0; i < size; i++) {\n var theChild = children[i];\n var children_of_children = theChild.children();\n var theNode;\n\n var dimensions = theChild.layoutDimensions({\n nodeDimensionsIncludeLabels: this.options.nodeDimensionsIncludeLabels\n });\n\n if (theChild.outerWidth() != null && theChild.outerHeight() != null) {\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 } else {\n theNode = parent.add(new CoSENode(this.graphManager));\n }\n // Attach id to the layout node\n theNode.id = theChild.data(\"id\");\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 compound if labels will be included in node dimensions \n if (this.options.nodeDimensionsIncludeLabels) {\n if (theChild.isParent()) {\n var labelWidth = theChild.boundingBox({ includeLabels: true, includeNodes: false }).w;\n var labelHeight = theChild.boundingBox({ includeLabels: true, includeNodes: false }).h;\n var labelPos = theChild.css(\"text-halign\");\n theNode.labelWidth = labelWidth;\n theNode.labelHeight = labelHeight;\n theNode.labelPos = labelPos;\n }\n }\n\n // Map the layout node\n this.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;\n theNewGraph = layout.getGraphManager().add(layout.newGraph(), theNode);\n this.processChildrenList(theNewGraph, children_of_children, layout);\n }\n }\n};\n\n/**\n * @brief : called on continuous layouts to stop them before they finish\n */\n_CoSELayout.prototype.stop = function () {\n this.stopped = true;\n\n return this; // chaining\n};\n\nvar register = function register(cytoscape) {\n // var Layout = getLayout( cytoscape );\n\n cytoscape('layout', 'cose-bilkent', _CoSELayout);\n};\n\n// auto reg for globals\nif (typeof cytoscape !== 'undefined') {\n register(cytoscape);\n}\n\nmodule.exports = register;\n\n/***/ })\n/******/ ]);\n});","(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 = 26);\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__(4);\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 > width) {\n this.rect.x -= (this.labelWidth - width) / 2;\n this.setWidth(this.labelWidth);\n }\n\n if (this.labelHeight > height) {\n if (this.labelPos == \"center\") {\n this.rect.y -= (this.labelHeight - height) / 2;\n } else if (this.labelPos == \"top\") {\n this.rect.y -= this.labelHeight - height;\n }\n this.setHeight(this.labelHeight);\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\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/* 5 */\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__(6);\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/* 6 */\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__(5); // 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\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 return true;\n }\n }\n return false;\n};\n\nmodule.exports = LGraphManager;\n\n/***/ }),\n/* 7 */\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/* 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// 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__(6);\nvar LNode = __webpack_require__(3);\nvar LEdge = __webpack_require__(1);\nvar LGraph = __webpack_require__(5);\nvar PointD = __webpack_require__(4);\nvar Transform = __webpack_require__(17);\nvar Emitter = __webpack_require__(27);\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__(4);\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__(7);\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.idealEdgeLength = FDLayoutConstants.DEFAULT_EDGE_LENGTH;\n this.springConstant = FDLayoutConstants.DEFAULT_SPRING_STRENGTH;\n this.repulsionConstant = FDLayoutConstants.DEFAULT_REPULSION_STRENGTH;\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 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 edge.idealLength = this.idealEdgeLength;\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 += FDLayoutConstants.DEFAULT_EDGE_LENGTH * 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 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 = this.springConstant * (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 repulsionForce = this.repulsionConstant * 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__(7);\n\nfunction FDLayoutEdge(source, target, vEdge) {\n LEdge.call(this, source, target, vEdge);\n this.idealLength = FDLayoutConstants.DEFAULT_EDGE_LENGTH;\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);\n\nfunction FDLayoutNode(gm, loc, size, vNode) {\n // alternative constructor is handled inside LNode\n LNode.call(this, gm, loc, size, vNode);\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\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/* 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 * 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/* 26 */\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__(7);\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__(4);\nlayoutBase.RandomSeed = __webpack_require__(16);\nlayoutBase.RectangleD = __webpack_require__(13);\nlayoutBase.Transform = __webpack_require__(17);\nlayoutBase.UniqueIDGeneretor = __webpack_require__(14);\nlayoutBase.Quicksort = __webpack_require__(24);\nlayoutBase.LinkedList = __webpack_require__(11);\nlayoutBase.LGraphObject = __webpack_require__(2);\nlayoutBase.LGraph = __webpack_require__(5);\nlayoutBase.LEdge = __webpack_require__(1);\nlayoutBase.LGraphManager = __webpack_require__(6);\nlayoutBase.LNode = __webpack_require__(3);\nlayoutBase.Layout = __webpack_require__(15);\nlayoutBase.LayoutConstants = __webpack_require__(0);\nlayoutBase.NeedlemanWunsch = __webpack_require__(25);\n\nmodule.exports = layoutBase;\n\n/***/ }),\n/* 27 */\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});"],"names":["factory","__WEBPACK_EXTERNAL_MODULE_0__","modules","installedModules","__webpack_require__","moduleId","exports","module","i","l","call","m","c","value","d","name","getter","o","Object","defineProperty","configurable","enumerable","get","n","__esModule","object","property","prototype","hasOwnProperty","p","s","FDLayoutConstants","CoSEConstants","prop","DEFAULT_USE_MULTI_LEVEL_SCALING","DEFAULT_RADIAL_SEPARATION","DEFAULT_EDGE_LENGTH","DEFAULT_COMPONENT_SEPERATION","TILE","TILING_PADDING_VERTICAL","TILING_PADDING_HORIZONTAL","TREE_REDUCTION_ON_INCREMENTAL","FDLayoutEdge","CoSEEdge","source","target","vEdge","this","create","LGraph","CoSEGraph","parent","graphMgr","vGraph","LGraphManager","CoSEGraphManager","layout","FDLayoutNode","IMath","CoSENode","gm","loc","size","vNode","move","graphManager","getLayout","displacementX","coolingFactor","springForceX","repulsionForceX","gravitationForceX","noOfChildren","displacementY","springForceY","repulsionForceY","gravitationForceY","Math","abs","maxNodeDisplacement","sign","child","getNodes","length","moveBy","propogateDisplacementToChildren","totalDisplacement","dX","dY","node","nodes","getChild","setPred1","pred1","getPred1","getPred2","pred2","setNext","next","getNext","setProcessed","processed","isProcessed","FDLayout","LayoutConstants","Point","PointD","Layout","Integer","IGeometry","Transform","CoSELayout","toBeTiled","newGraphManager","newGraph","newNode","newEdge","initParameters","arguments","isSubLayout","idealEdgeLength","useSmartIdealEdgeLengthCalculation","DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION","springConstant","DEFAULT_SPRING_STRENGTH","repulsionConstant","DEFAULT_REPULSION_STRENGTH","gravityConstant","DEFAULT_GRAVITY_STRENGTH","compoundGravityConstant","DEFAULT_COMPOUND_GRAVITY_STRENGTH","gravityRangeFactor","DEFAULT_GRAVITY_RANGE_FACTOR","compoundGravityRangeFactor","DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR","prunedNodesAll","growTreeIterations","afterGrowthIterations","isTreeGrowing","isGrowthFinished","coolingCycle","maxCoolingCycle","maxIterations","CONVERGENCE_CHECK_PERIOD","finalTemperature","coolingAdjuster","DEFAULT_CREATE_BENDS_AS_NEEDED","createBendpoints","resetAllEdges","level","classicLayout","nodesWithGravity","calculateNodesToApplyGravitationTo","setAllNodesToApplyGravitation","calcNoOfChildrenForAllNodes","calcLowestCommonAncestors","calcInclusionTreeDepths","getRoot","calcEstimatedSize","calcIdealEdgeLengths","incremental","reduceTrees","resetAllNodesToApplyGravitation","allNodes","Set","getAllNodes","intersection","filter","x","has","forest","getFlatForest","positionNodesRadially","positionNodesRandomly","initSpringEmbedder","runSpringEmbedder","tick","totalIterations","isConverged","layoutQuality","max","initialCoolingFactor","pow","log","animationPeriod","ceil","initialAnimationPeriod","sqrt","updateBounds","updateGrid","growTree","DEFAULT_COOLING_FACTOR_INCREMENTAL","gridUpdateAllowed","forceToNodeSurroundingUpdate","calcSpringForces","calcRepulsionForces","calcGravitationalForces","moveNodes","animate","getPositionsData","pData","rect","id","getCenterX","y","getCenterY","w","width","h","height","layoutEnded","ANIMATE","emit","graph","nodeList","graphs","getGraphs","updateConnected","isConnected","concat","edges","getAllEdges","visited","edge","getSource","getTarget","getBendpoints","push","createDummyNodesForBendpoints","add","edgeList","getEdgeListToNode","k","multiEdge","forEach","currentStartingPoint","numberOfColumns","currentY","currentX","point","tree","centerNode","findCenterOfTree","radialLayout","floor","transform","WORLD_CENTER_X","WORLD_CENTER_Y","startingPoint","radialSep","maxDiagonalInTree","branchRadialLayout","bounds","calculateBounds","setDeviceOrgX","getMinX","setDeviceOrgY","getMinY","setWorldOrgX","setWorldOrgY","bottomRight","getMaxX","getMaxY","inverseTransformPoint","parentOfNode","startAngle","endAngle","distance","radialSeparation","halfInterval","teta","TWO_PI","x_","cos","y_","sin","setCenter","neighborEdges","childCount","getEdges","startIndex","branchCount","incEdgesCount","getEdgesBetween","temp","splice","index","indexOf","stepAngle","currentNeighbor","getOtherEnd","childStartAngle","childEndAngle","maxDiagonal","MIN_VALUE","diagonal","getDiagonal","calcRepulsionRange","groupZeroDegreeMembers","self","tempMemberGroups","memberGroups","idToDummyNode","zeroDegree","getParent","getNodeDegreeWithChildren","undefined","getToBeTiled","p_id","keys","dummyCompoundId","dummyCompound","paddingLeft","paddingRight","paddingBottom","paddingTop","dummyParentGraph","getGraphManager","parentGraph","remove","clearCompounds","childGraphMap","idToNode","performDFSOnCompounds","compoundOrder","resetAllNodes","tileCompoundMembers","clearZeroDegreeMembers","tiledZeroDegreePack","compoundNode","tileNodes","repopulateCompounds","lCompoundNode","horizontalMargin","verticalMargin","adjustLocations","tiledMemberPack","repopulateZeroDegreeMembers","tiledPack","childGraph","children","theChild","getNodeDegree","degree","fillCompexOrderByDFS","organization","compoundHorizontalMargin","compoundVerticalMargin","left","rows","row","maxHeight","j","lnode","horizontalPadding","verticalPadding","minWidth","rowWidth","rowHeight","sort","n1","n2","lNode","insertNodeToRow","canAddHorizontal","getShortestRowIndex","shiftToLastRow","rowIndex","minCompoundSize","extraHeight","r","min","Number","MAX_VALUE","getLongestRowIndex","extraWidth","sri","add_to_row_ratio","add_new_row_ratio","hDiff","longest","last","diff","instance","prevTotal","finalTotal","tilingPreLayout","tilingPostLayout","containsLeaf","prunedNodesInStepTemp","isInterGraph","getOwner","prunedNodesInStep","nodeData","findPlaceforPrunedNode","gridForPrunedNode","nodeToConnect","prunedNode","startGridX","startX","finishGridX","finishX","startGridY","startY","finishGridY","finishY","controlRegions","grid","minCount","minIndex","random","getHeight","getWidth","coseBase","layoutBase","require","parser","__name","v","o2","$V0","$V1","$V2","$V3","$V4","$V5","$V6","$V7","$V8","$V9","$Va","$Vb","$Vc","$Vd","$Ve","$Vf","parser2","trace","yy","symbols_","terminals_","productions_","performAction","yytext","yyleng","yylineno","yystate","$$","_$","$0","getLogger","info","addNode","descr","type","decorateNode","icon","class","$","getType","nodeType","DEFAULT","table","defaultActions","parseError","str","hash","recoverable","error","Error","parse","input","stack","tstack","vstack","lstack","recovering","args","slice","lexer2","lexer","sharedState","setInput","yylloc","yyloc","ranges","options","lex","token","pop","Array","getPrototypeOf","symbol","preErrorSymbol","state","action","len","newState","expected","yyval","errStr","showPosition","join","text","match","line","first_line","last_line","first_column","last_column","range","apply","EOF","_input","_more","_backtrack","done","matched","conditionStack","offset","ch","unput","lines","split","substr","oldLines","more","reject","backtrack_lexer","less","pastInput","past","replace","upcomingInput","pre","test_match","indexed_rule","backup","matches","tempMatch","rules","_currentRules","flex","begin","condition","popState","conditions","topState","pushState","stateStackSize","yy_","$avoiding_name_collisions","YY_START","Parser","mindmap_default","cnt","elements","clear","getMindmap","conf","getConfig","padding","mindmap","defaultConfig_default","ROUNDED_RECT","RECT","HEXAGON","nodeId","sanitizeText","maxNodeWidth","NO_BORDER","CIRCLE","CLOUD","BANG","mindmapDb_default","startStr","endStr","debug","setElementForId","element","decoration","config","type2Str","getElementById","defaultBkg","db2","elem","section","append","attr","rectBkg","cloudBkg","r1","r2","r3","r4","bangBkg","circleBkg","insertPolygonShape","points","insert","map","hexagonBkg","_db","roundedRectBkg","drawNode","async","fullSection","htmlLabels","nodeElem","sectionClass","bkgElem","textElem","description","createText","useHtmlLabels","classes","bbox","getBBox","fontSize","parseFontSize","orgHeight","heightDiff","dx","dy","positionNode","drawNodes","svg","Promise","all","drawEdges","edgesEl","cy","data","_private","bodyBounds","rscratch","midX","midY","endX","endY","depth","addNodes","group","toString","labelText","position","layoutMindmap","resolve","renderEl","select","cytoscape","container","document","style","selector","layoutDimensions","quality","styleEnabled","run","ready","e","positionNodes","el","use","coseBilkent","mindmapRenderer_default","draw","_version","diagObj","db","mm","selectSvgElement","edgesElem","nodesElem","setupGraphViewbox","useMaxWidth","genSections","sections","THEME_COLOR_LIMIT","isDark","lighten","darken","sw","diagram","renderer","styles","git0","gitBranchLabel0","DimensionD","defaults","stop","nodeDimensionsIncludeLabels","refresh","fit","randomize","nodeRepulsion","edgeElasticity","nestingFactor","gravity","numIter","tile","animationDuration","tilingPaddingVertical","tilingPaddingHorizontal","gravityRangeCompound","gravityCompound","gravityRange","initialEnergyOnIncremental","_CoSELayout","_options","obj","extend","getUserOptions","PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR","MAX_ITERATIONS","QUALITY","NODE_DIMENSIONS_INCLUDE_LABELS","DEFAULT_INCREMENTAL","frameId","idToLNode","stopped","trigger","eles","root","addRoot","processChildrenList","getTopMostNodes","sourceNode","targetNode","getPositions","ele","theId","getRect","iterateAnimated","isDone","afterReposition","one","ticksPerFrame","checkLayoutSuccess","doPostLayout","isLayoutFinished","positions","cancelAnimationFrame","animationData","isParent","pNode","requestAnimationFrame","addListener","runLayout","not","layoutPositions","nodesMap","roots","theNode","theNewGraph","children_of_children","dimensions","outerWidth","outerHeight","parseFloat","parseInt","css","labelWidth","boundingBox","includeLabels","includeNodes","labelHeight","labelPos","isNaN","register","DEFAULT_ANIMATION_ON_LAYOUT","DEFAULT_ANIMATION_DURING_LAYOUT","DEFAULT_ANIMATION_PERIOD","DEFAULT_UNIFORM_LEAF_NODE_SIZES","DEFAULT_GRAPH_MARGIN","SIMPLE_NODE_SIZE","SIMPLE_NODE_HALF_SIZE","EMPTY_COMPOUND_NODE_SIZE","MIN_EDGE_LENGTH","WORLD_BOUNDARY","INITIAL_WORLD_BOUNDARY","LGraphObject","LEdge","isOverlapingSourceAndTarget","vGraphObject","bendpoints","getLength","getLca","lca","getSourceInLca","sourceInLca","getTargetInLca","targetInLca","getOtherEndInGraph","otherEnd","updateLength","clipPointCoordinates","getIntersection","lengthX","lengthY","updateLengthSimple","RectangleD","RandomSeed","LNode","estimatedSize","inclusionTreeDepth","owner","setWidth","setHeight","getCenter","getLocation","getHalfTheDiagonal","setRect","upperLeft","dimension","cx","setLocation","to","other","getNeighborsList","neighbors","withChildren","withNeighborsList","getNoOfChildren","getEstimatedSize","scatter","randomCenterX","randomCenterY","minX","maxX","nextDouble","minY","maxY","getLeft","getTop","getRight","getBottom","getInclusionTreeDepth","trans","top","leftTop","vLeftTop","getX","getY","setX","setY","getDifference","pt","getCopy","translate","dim","LinkedList","obj2","margin","right","bottom","obj1","edgesToBeRemoved","sourceIndex","targetIndex","updateLeftTop","nodeTop","nodeLeft","recursive","nodeRight","nodeBottom","boundingRect","queue","currentNode","shift","noOfVisitedInThisGraph","visitedNode","ngraph","nnode","setRootGraph","rootGraph","parentNode","sourceGraph","targetGraph","lObj","nodesToBeRemoved","allEdges","allNodesToApplyGravitation","getAllNodesToApplyGravitation","isOneAncestorOfOther","firstNode","secondNode","ownerGraph","sourceAncestorGraph","targetAncestorGraph","calcLowestCommonAncestor","firstOwnerGraph","secondOwnerGraph","includesInvalidEdge","DEFAULT_USE_SMART_REPULSION_RANGE_CALCULATION","COOLING_ADAPTATION_FACTOR","ADAPTATION_LOWER_NODE_LIMIT","ADAPTATION_UPPER_NODE_LIMIT","MAX_NODE_DISPLACEMENT_INCREMENTAL","MAX_NODE_DISPLACEMENT","MIN_REPULSION_DIST","GRID_CALCULATION_CHECK_PERIOD","calcSeparationAmount","rectA","rectB","overlapAmount","separationBuffer","intersects","directions","decideDirectionsForOverlappingNodes","slope","moveByY","moveByX","getIntersection2","result","p1x","p1y","p2x","p2y","topLeftAx","topLeftAy","topRightAx","bottomLeftAx","bottomLeftAy","bottomRightAx","halfWidthA","getWidthHalf","halfHeightA","getHeightHalf","topLeftBx","topLeftBy","topRightBx","bottomLeftBx","bottomLeftBy","bottomRightBx","halfWidthB","halfHeightB","clipPointAFound","clipPointBFound","slopeA","slopeB","slopePrime","cardinalDirectionA","cardinalDirectionB","tempPointAx","tempPointAy","tempPointBx","tempPointBy","getCardinalDirection","s1","s2","f1","f2","a1","a2","b1","b2","c1","c2","denom","x1","y1","x2","y2","x3","y3","x4","y4","angleOfVector","Cx","Cy","Nx","Ny","C_angle","atan","PI","ONE_AND_HALF_PI","HALF_PI","doIntersect","p1","p2","p3","p4","a","b","q","det","lambda","gamma","THREE_PI","_createClass","defineProperties","props","descriptor","writable","key","Constructor","protoProps","staticProps","nodeFrom","prev","list","head","tail","_remove","vals","_this","TypeError","_classCallCheck","val","otherNode","current","constructor","equals","_typeof","Symbol","iterator","UniqueIDGeneretor","lastID","createID","isPrimitive","uniqueID","getString","arg","_toConsumableArray","arr","isArray","arr2","from","Emitter","isRemoteUse","createBendsAsNeeded","animationOnLayout","animationDuringLayout","uniformLeafNodeSizes","edgeToDummyNodes","Map","RANDOM_SEED","isLayoutSuccessfull","update","update2","createBendpointsFromDummyNodes","newLeftTop","flatForest","isForest","isFlat","toBeVisited","parents","unProcessedNodes","set","dummyNodes","dummyNode","Dimension","dummyEdge","lEdge","path","ebp","sliderValue","defaultValue","minDiv","maxMul","removedNodes","remainingDegrees","foundCenter","tempList","tempList2","neighbour","newDegree","setGraphManager","seed","lworldOrgX","lworldOrgY","ldeviceOrgX","ldeviceOrgY","lworldExtX","lworldExtY","ldeviceExtX","ldeviceExtY","getWorldOrgX","wox","getWorldOrgY","woy","getWorldExtX","setWorldExtX","wex","getWorldExtY","setWorldExtY","wey","getDeviceOrgX","dox","getDeviceOrgY","doy","getDeviceExtX","setDeviceExtX","dex","getDeviceExtY","setDeviceExtY","dey","transformX","xDevice","worldExtX","transformY","yDevice","worldExtY","inverseTransformX","xWorld","deviceExtX","inverseTransformY","yWorld","deviceExtY","inPoint","displacementThresholdPerNode","oldTotalDisplacement","notAnimatedIterations","useFRGridVariant","lcaDepth","sizeOfSourceInLca","sizeOfTargetInLca","idealLength","totalDisplacementThreshold","repulsionRange","lEdges","calcSpringForce","nodeA","nodeB","processedNodeSet","lNodes","calculateRepulsionForceOfANode","calcRepulsionForce","calcGravitationalForce","springForce","distanceX","distanceY","distanceSquared","repulsionForce","clipPoints","childrenConstant","ownerCenterX","ownerCenterY","absDistanceX","absDistanceY","converged","oscilating","calcGrid","sizeX","sizeY","addNodeToGrid","setGridCoordinates","surrounding","_startX","_finishX","_startY","_finishY","HashMap","put","contains","keySet","HashSet","isEmpty","addAllTo","addAll","Quicksort","A","compareFunction","_defaultCompareFunction","_quicksort","_partition","_get","_swap","get_object_at","set_object_at","_set","NeedlemanWunsch","sequence1","sequence2","match_score","mismatch_penalty","gap_penalty","iMax","jMax","tracebackGrid","_i","_j","alignments","score","computeGrids","_i2","_j2","maxOf","indices","arrayAllMaxIndexes","includes","inProcessAlignments","pos","seq1","seq2","indexes","array","getAllIndexes","listeners","event","callback","removeListener"],"sourceRoot":""} \ No newline at end of file diff --git a/frontend/deployed/static/js/282.876bf6b3.chunk.js b/frontend/deployed/static/js/282.876bf6b3.chunk.js deleted file mode 100644 index b93d20a..0000000 --- a/frontend/deployed/static/js/282.876bf6b3.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunkbackstory=self.webpackChunkbackstory||[]).push([[282],{5282:(t,e,n)=>{n.d(e,{diagram:()=>J});var i=n(3759),s=n(700),r=n(8194),a=n(6362),o=n(5554),c=function(){var t=(0,i.K2)((function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n}),"o"),e=[6,8,10,11,12,14,16,17,20,21],n=[1,9],s=[1,10],r=[1,11],a=[1,12],o=[1,13],c=[1,16],l=[1,17],h={trace:(0,i.K2)((function(){}),"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:(0,i.K2)((function(t,e,n,i,s,r,a){var o=r.length-1;switch(s){case 1:return r[o-1];case 2:case 6:case 7:this.$=[];break;case 3:r[o-1].push(r[o]),this.$=r[o-1];break;case 4:case 5:this.$=r[o];break;case 8:i.getCommonDb().setDiagramTitle(r[o].substr(6)),this.$=r[o].substr(6);break;case 9:this.$=r[o].trim(),i.getCommonDb().setAccTitle(this.$);break;case 10:case 11:this.$=r[o].trim(),i.getCommonDb().setAccDescription(this.$);break;case 12:i.addSection(r[o].substr(8)),this.$=r[o].substr(8);break;case 15:i.addTask(r[o],0,""),this.$=r[o];break;case 16:i.addEvent(r[o].substr(2)),this.$=r[o]}}),"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},t(e,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:n,12:s,14:r,16:a,17:o,18:14,19:15,20:c,21:l},t(e,[2,7],{1:[2,1]}),t(e,[2,3]),{9:18,11:n,12:s,14:r,16:a,17:o,18:14,19:15,20:c,21:l},t(e,[2,5]),t(e,[2,6]),t(e,[2,8]),{13:[1,19]},{15:[1,20]},t(e,[2,11]),t(e,[2,12]),t(e,[2,13]),t(e,[2,14]),t(e,[2,15]),t(e,[2,16]),t(e,[2,4]),t(e,[2,9]),t(e,[2,10])],defaultActions:{},parseError:(0,i.K2)((function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)}),"parseError"),parse:(0,i.K2)((function(t){var e=this,n=[0],s=[],r=[null],a=[],o=this.table,c="",l=0,h=0,d=0,u=a.slice.call(arguments,1),p=Object.create(this.lexer),y={yy:{}};for(var g in this.yy)Object.prototype.hasOwnProperty.call(this.yy,g)&&(y.yy[g]=this.yy[g]);p.setInput(t,y.yy),y.yy.lexer=p,y.yy.parser=this,"undefined"==typeof p.yylloc&&(p.yylloc={});var f=p.yylloc;a.push(f);var m=p.options&&p.options.ranges;function x(){var t;return"number"!==typeof(t=s.pop()||p.lex()||1)&&(t instanceof Array&&(t=(s=t).pop()),t=e.symbols_[t]||t),t}"function"===typeof y.yy.parseError?this.parseError=y.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError,(0,i.K2)((function(t){n.length=n.length-2*t,r.length=r.length-t,a.length=a.length-t}),"popStack"),(0,i.K2)(x,"lex");for(var b,k,_,w,v,K,S,$,E,T={};;){if(_=n[n.length-1],this.defaultActions[_]?w=this.defaultActions[_]:(null!==b&&"undefined"!=typeof b||(b=x()),w=o[_]&&o[_][b]),"undefined"===typeof w||!w.length||!w[0]){var I="";for(K in E=[],o[_])this.terminals_[K]&&K>2&&E.push("'"+this.terminals_[K]+"'");I=p.showPosition?"Parse error on line "+(l+1)+":\n"+p.showPosition()+"\nExpecting "+E.join(", ")+", got '"+(this.terminals_[b]||b)+"'":"Parse error on line "+(l+1)+": Unexpected "+(1==b?"end of input":"'"+(this.terminals_[b]||b)+"'"),this.parseError(I,{text:p.match,token:this.terminals_[b]||b,line:p.yylineno,loc:f,expected:E})}if(w[0]instanceof Array&&w.length>1)throw new Error("Parse Error: multiple actions possible at state: "+_+", token: "+b);switch(w[0]){case 1:n.push(b),r.push(p.yytext),a.push(p.yylloc),n.push(w[1]),b=null,k?(b=k,k=null):(h=p.yyleng,c=p.yytext,l=p.yylineno,f=p.yylloc,d>0&&d--);break;case 2:if(S=this.productions_[w[1]][1],T.$=r[r.length-S],T._$={first_line:a[a.length-(S||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(S||1)].first_column,last_column:a[a.length-1].last_column},m&&(T._$.range=[a[a.length-(S||1)].range[0],a[a.length-1].range[1]]),"undefined"!==typeof(v=this.performAction.apply(T,[c,h,l,y.yy,w[1],r,a].concat(u))))return v;S&&(n=n.slice(0,-1*S*2),r=r.slice(0,-1*S),a=a.slice(0,-1*S)),n.push(this.productions_[w[1]][0]),r.push(T.$),a.push(T._$),$=o[n[n.length-2]][n[n.length-1]],n.push($);break;case 3:return!0}}return!0}),"parse")},d=function(){return{EOF:1,parseError:(0,i.K2)((function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)}),"parseError"),setInput:(0,i.K2)((function(t,e){return this.yy=e||this.yy||{},this._input=t,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:(0,i.K2)((function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t}),"input"),unput:(0,i.K2)((function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=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),n.length-1&&(this.yylineno-=n.length-1);var s=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:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[s[0],s[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this}),"unput"),more:(0,i.K2)((function(){return this._more=!0,this}),"more"),reject:(0,i.K2)((function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):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})}),"reject"),less:(0,i.K2)((function(t){this.unput(this.match.slice(t))}),"less"),pastInput:(0,i.K2)((function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")}),"pastInput"),upcomingInput:(0,i.K2)((function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")}),"upcomingInput"),showPosition:(0,i.K2)((function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"}),"showPosition"),test_match:(0,i.K2)((function(t,e){var n,i,s;if(this.options.backtrack_lexer&&(s={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&&(s.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,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(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var r in s)this[r]=s[r];return!1}return!1}),"test_match"),next:(0,i.K2)((function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var s=this._currentRules(),r=0;re[0].length)){if(e=n,i=r,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,s[r])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,s[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})}),"next"),lex:(0,i.K2)((function(){var t=this.next();return t||this.lex()}),"lex"),begin:(0,i.K2)((function(t){this.conditionStack.push(t)}),"begin"),popState:(0,i.K2)((function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]}),"popState"),_currentRules:(0,i.K2)((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:(0,i.K2)((function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"}),"topState"),pushState:(0,i.K2)((function(t){this.begin(t)}),"pushState"),stateStackSize:(0,i.K2)((function(){return this.conditionStack.length}),"stateStackSize"),options:{"case-insensitive":!0},performAction:(0,i.K2)((function(t,e,n,i){switch(n){case 0:case 1:case 3:case 4:break;case 2:return 10;case 5:return 4;case 6:return 11;case 7:return this.begin("acc_title"),12;case 8:return this.popState(),"acc_title_value";case 9:return this.begin("acc_descr"),14;case 10:return this.popState(),"acc_descr_value";case 11:this.begin("acc_descr_multiline");break;case 12:this.popState();break;case 13:return"acc_descr_multiline_value";case 14:return 17;case 15:return 21;case 16:return 20;case 17:return 6;case 18:return"INVALID"}}),"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]+)/i,/^(?:[^#:\n]+)/i,/^(?:$)/i,/^(?:.)/i],conditions:{acc_descr_multiline:{rules:[12,13],inclusive:!1},acc_descr:{rules:[10],inclusive:!1},acc_title:{rules:[8],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,9,11,14,15,16,17,18],inclusive:!0}}}}();function u(){this.yy={}}return h.lexer=d,(0,i.K2)(u,"Parser"),u.prototype=h,h.Parser=u,new u}();c.parser=c;var l=c,h={};(0,i.VA)(h,{addEvent:()=>w,addSection:()=>x,addTask:()=>_,addTaskOrg:()=>v,clear:()=>m,default:()=>S,getCommonDb:()=>f,getSections:()=>b,getTasks:()=>k});var d="",u=0,p=[],y=[],g=[],f=(0,i.K2)((()=>i.Wt),"getCommonDb"),m=(0,i.K2)((function(){p.length=0,y.length=0,d="",g.length=0,(0,i.IU)()}),"clear"),x=(0,i.K2)((function(t){d=t,p.push(t)}),"addSection"),b=(0,i.K2)((function(){return p}),"getSections"),k=(0,i.K2)((function(){let t=K();let e=0;for(;!t&&e<100;)t=K(),e++;return y.push(...g),y}),"getTasks"),_=(0,i.K2)((function(t,e,n){const i={id:u++,section:d,type:d,task:t,score:e||0,events:n?[n]:[]};g.push(i)}),"addTask"),w=(0,i.K2)((function(t){g.find((t=>t.id===u-1)).events.push(t)}),"addEvent"),v=(0,i.K2)((function(t){const e={section:d,type:d,description:t,task:t,classes:[]};y.push(e)}),"addTaskOrg"),K=(0,i.K2)((function(){const t=(0,i.K2)((function(t){return g[t].processed}),"compileTask");let e=!0;for(const[n,i]of g.entries())t(n),e=e&&i.processed;return e}),"compileTasks"),S={clear:m,getCommonDb:f,addSection:x,getSections:b,getTasks:k,addTask:_,addTaskOrg:v,addEvent:w},$=(0,i.K2)((function(t,e){const n=t.append("rect");return n.attr("x",e.x),n.attr("y",e.y),n.attr("fill",e.fill),n.attr("stroke",e.stroke),n.attr("width",e.width),n.attr("height",e.height),n.attr("rx",e.rx),n.attr("ry",e.ry),void 0!==e.class&&n.attr("class",e.class),n}),"drawRect"),E=(0,i.K2)((function(t,e){const n=15,r=t.append("circle").attr("cx",e.cx).attr("cy",e.cy).attr("class","face").attr("r",n).attr("stroke-width",2).attr("overflow","visible"),a=t.append("g");function o(t){const i=(0,s.JLW)().startAngle(Math.PI/2).endAngle(Math.PI/2*3).innerRadius(7.5).outerRadius(n/2.2);t.append("path").attr("class","mouth").attr("d",i).attr("transform","translate("+e.cx+","+(e.cy+2)+")")}function c(t){const i=(0,s.JLW)().startAngle(3*Math.PI/2).endAngle(Math.PI/2*5).innerRadius(7.5).outerRadius(n/2.2);t.append("path").attr("class","mouth").attr("d",i).attr("transform","translate("+e.cx+","+(e.cy+7)+")")}function l(t){t.append("line").attr("class","mouth").attr("stroke",2).attr("x1",e.cx-5).attr("y1",e.cy+7).attr("x2",e.cx+5).attr("y2",e.cy+7).attr("class","mouth").attr("stroke-width","1px").attr("stroke","#666")}return a.append("circle").attr("cx",e.cx-5).attr("cy",e.cy-5).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666"),a.append("circle").attr("cx",e.cx+5).attr("cy",e.cy-5).attr("r",1.5).attr("stroke-width",2).attr("fill","#666").attr("stroke","#666"),(0,i.K2)(o,"smile"),(0,i.K2)(c,"sad"),(0,i.K2)(l,"ambivalent"),e.score>3?o(a):e.score<3?c(a):l(a),r}),"drawFace"),T=(0,i.K2)((function(t,e){const n=t.append("circle");return n.attr("cx",e.cx),n.attr("cy",e.cy),n.attr("class","actor-"+e.pos),n.attr("fill",e.fill),n.attr("stroke",e.stroke),n.attr("r",e.r),void 0!==n.class&&n.attr("class",n.class),void 0!==e.title&&n.append("title").text(e.title),n}),"drawCircle"),I=(0,i.K2)((function(t,e){const n=e.text.replace(//gi," "),i=t.append("text");i.attr("x",e.x),i.attr("y",e.y),i.attr("class","legend"),i.style("text-anchor",e.anchor),void 0!==e.class&&i.attr("class",e.class);const s=i.append("tspan");return s.attr("x",e.x+2*e.textMargin),s.text(n),i}),"drawText"),R=(0,i.K2)((function(t,e){function n(t,e,n,i,s){return t+","+e+" "+(t+n)+","+e+" "+(t+n)+","+(e+i-s)+" "+(t+n-1.2*s)+","+(e+i)+" "+t+","+(e+i)}(0,i.K2)(n,"genPoints");const s=t.append("polygon");s.attr("points",n(e.x,e.y,50,20,7)),s.attr("class","labelBox"),e.y=e.y+e.labelMargin,e.x=e.x+.5*e.labelMargin,I(t,e)}),"drawLabel"),A=(0,i.K2)((function(t,e,n){const i=t.append("g"),s=P();s.x=e.x,s.y=e.y,s.fill=e.fill,s.width=n.width,s.height=n.height,s.class="journey-section section-type-"+e.num,s.rx=3,s.ry=3,$(i,s),H(n)(e.text,i,s.x,s.y,s.width,s.height,{class:"journey-section section-type-"+e.num},n,e.colour)}),"drawSection"),L=-1,M=(0,i.K2)((function(t,e,n){const i=e.x+n.width/2,s=t.append("g");L++;s.append("line").attr("id","task"+L).attr("x1",i).attr("y1",e.y).attr("x2",i).attr("y2",450).attr("class","task-line").attr("stroke-width","1px").attr("stroke-dasharray","4 2").attr("stroke","#666"),E(s,{cx:i,cy:300+30*(5-e.score),score:e.score});const r=P();r.x=e.x,r.y=e.y,r.fill=e.fill,r.width=n.width,r.height=n.height,r.class="task task-type-"+e.num,r.rx=3,r.ry=3,$(s,r),H(n)(e.task,s,r.x,r.y,r.width,r.height,{class:"task"},n,e.colour)}),"drawTask"),C=(0,i.K2)((function(t,e){$(t,{x:e.startx,y:e.starty,width:e.stopx-e.startx,height:e.stopy-e.starty,fill:e.fill,class:"rect"}).lower()}),"drawBackgroundRect"),N=(0,i.K2)((function(){return{x:0,y:0,fill:void 0,"text-anchor":"start",width:100,height:100,textMargin:0,rx:0,ry:0}}),"getTextObj"),P=(0,i.K2)((function(){return{x:0,y:0,width:100,anchor:"start",height:100,rx:0,ry:0}}),"getNoteRect"),H=function(){function t(t,e,n,i,r,a,o,c){s(e.append("text").attr("x",n+r/2).attr("y",i+a/2+5).style("font-color",c).style("text-anchor","middle").text(t),o)}function e(t,e,n,i,r,a,o,c,l){const{taskFontSize:h,taskFontFamily:d}=c,u=t.split(//gi);for(let p=0;p)/).reverse(),r=[],a=n.attr("y"),o=parseFloat(n.attr("dy")),c=n.text(null).append("tspan").attr("x",0).attr("y",a).attr("dy",o+"em");for(let s=0;se||"
"===t)&&(r.pop(),c.text(r.join(" ").trim()),r="
"===t?[""]:[t],c=n.append("tspan").attr("x",0).attr("y",a).attr("dy","1.1em").text(t))}))}(0,i.K2)(j,"wrap");var D=(0,i.K2)((function(t,e,n,i){const s=n%12-1,r=t.append("g");e.section=s,r.attr("class",(e.class?e.class+" ":"")+"timeline-node section-"+s);const a=r.append("g"),o=r.append("g"),c=o.append("text").text(e.descr).attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle").call(j,e.width).node().getBBox(),l=i.fontSize?.replace?i.fontSize.replace("px",""):i.fontSize;return e.height=c.height+1.1*l*.5+e.padding,e.height=Math.max(e.height,e.maxHeight),e.width=e.width+2*e.padding,o.attr("transform","translate("+e.width/2+", "+e.padding/2+")"),W(a,e,s,i),e}),"drawNode"),z=(0,i.K2)((function(t,e,n){const i=t.append("g"),s=i.append("text").text(e.descr).attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle").call(j,e.width).node().getBBox(),r=n.fontSize?.replace?n.fontSize.replace("px",""):n.fontSize;return i.remove(),s.height+1.1*r*.5+e.padding}),"getVirtualNodeHeight"),W=(0,i.K2)((function(t,e,n){t.append("path").attr("id","node-"+e.id).attr("class","node-bkg node-"+e.type).attr("d",`M0 ${e.height-5} v${10-e.height} q0,-5 5,-5 h${e.width-10} q5,0 5,5 v${e.height-5} H0 Z`),t.append("line").attr("class","node-line-"+n).attr("x1",0).attr("y1",e.height).attr("x2",e.width).attr("y2",e.height)}),"defaultBkg"),B={drawRect:$,drawCircle:T,drawSection:A,drawText:I,drawLabel:R,drawTask:M,drawBackgroundRect:C,getTextObj:N,getNoteRect:P,initGraphics:O,drawNode:D,getVirtualNodeHeight:z},F=(0,i.K2)((function(t,e,n,r){const a=(0,i.D7)(),o=a.leftMargin??50;i.Rm.debug("timeline",r.db);const c=a.securityLevel;let l;"sandbox"===c&&(l=(0,s.Ltv)("#i"+e));const h=("sandbox"===c?(0,s.Ltv)(l.nodes()[0].contentDocument.body):(0,s.Ltv)("body")).select("#"+e);h.append("g");const d=r.db.getTasks(),u=r.db.getCommonDb().getDiagramTitle();i.Rm.debug("task",d),B.initGraphics(h);const p=r.db.getSections();i.Rm.debug("sections",p);let y=0,g=0,f=0,m=0,x=50+o,b=50;m=50;let k=0,_=!0;p.forEach((function(t){const e={number:k,descr:t,section:k,width:150,padding:20,maxHeight:y},n=B.getVirtualNodeHeight(h,e,a);i.Rm.debug("sectionHeight before draw",n),y=Math.max(y,n+20)}));let w=0,v=0;i.Rm.debug("tasks.length",d.length);for(const[s,S]of d.entries()){const t={number:s,descr:S,section:S.section,width:150,padding:20,maxHeight:g},e=B.getVirtualNodeHeight(h,t,a);i.Rm.debug("taskHeight before draw",e),g=Math.max(g,e+20),w=Math.max(w,S.events.length);let n=0;for(const i of S.events){const t={descr:i,section:S.section,number:S.section,width:150,padding:20,maxHeight:50};n+=B.getVirtualNodeHeight(h,t,a)}v=Math.max(v,n)}i.Rm.debug("maxSectionHeight before draw",y),i.Rm.debug("maxTaskHeight before draw",g),p&&p.length>0?p.forEach((t=>{const e=d.filter((e=>e.section===t)),n={number:k,descr:t,section:k,width:200*Math.max(e.length,1)-50,padding:20,maxHeight:y};i.Rm.debug("sectionNode",n);const s=h.append("g"),r=B.drawNode(s,n,k,a);i.Rm.debug("sectionNode output",r),s.attr("transform",`translate(${x}, 50)`),b+=y+50,e.length>0&&V(h,e,k,x,b,g,a,w,v,y,!1),x+=200*Math.max(e.length,1),b=50,k++})):(_=!1,V(h,d,k,x,b,g,a,w,v,y,!0));const K=h.node().getBBox();i.Rm.debug("bounds",K),u&&h.append("text").text(u).attr("x",K.width/2-o).attr("font-size","4ex").attr("font-weight","bold").attr("y",20),f=_?y+g+150:g+100;h.append("g").attr("class","lineWrapper").append("line").attr("x1",o).attr("y1",f).attr("x2",K.width+3*o).attr("y2",f).attr("stroke-width",4).attr("stroke","black").attr("marker-end","url(#arrowhead)"),(0,i.ot)(void 0,h,a.timeline?.padding??50,a.timeline?.useMaxWidth??!1)}),"draw"),V=(0,i.K2)((function(t,e,n,s,r,a,o,c,l,h,d){for(const u of e){const e={descr:u.task,section:n,number:n,width:150,padding:20,maxHeight:a};i.Rm.debug("taskNode",e);const c=t.append("g").attr("class","taskWrapper"),p=B.drawNode(c,e,n,o).height;if(i.Rm.debug("taskHeight after draw",p),c.attr("transform",`translate(${s}, ${r})`),a=Math.max(a,p),u.events){const e=t.append("g").attr("class","lineWrapper");let i=a;r+=100,i+=G(t,u.events,n,s,r,o),r-=100,e.append("line").attr("x1",s+95).attr("y1",r+a).attr("x2",s+95).attr("y2",r+a+(d?a:h)+l+120).attr("stroke-width",2).attr("stroke","black").attr("marker-end","url(#arrowhead)").attr("stroke-dasharray","5,5")}s+=200,d&&!o.timeline?.disableMulticolor&&n++}r-=10}),"drawTasks"),G=(0,i.K2)((function(t,e,n,s,r,a){let o=0;const c=r;r+=100;for(const l of e){const e={descr:l,section:n,number:n,width:150,padding:20,maxHeight:50};i.Rm.debug("eventNode",e);const c=t.append("g").attr("class","eventWrapper"),h=B.drawNode(c,e,n,a).height;o+=h,c.attr("transform",`translate(${s}, ${r})`),r=r+10+h}return r=c,o}),"drawEvents"),U={setConf:(0,i.K2)((()=>{}),"setConf"),draw:F},q=(0,i.K2)((t=>{let e="";for(let n=0;n`\n .edge {\n stroke-width: 3;\n }\n ${q(t)}\n .section-root rect, .section-root path, .section-root circle {\n fill: ${t.git0};\n }\n .section-root text {\n fill: ${t.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`),"getStyles")}}}]); -//# sourceMappingURL=282.876bf6b3.chunk.js.map \ No newline at end of file diff --git a/frontend/deployed/static/js/282.876bf6b3.chunk.js.map b/frontend/deployed/static/js/282.876bf6b3.chunk.js.map deleted file mode 100644 index 676e579..0000000 --- a/frontend/deployed/static/js/282.876bf6b3.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"static/js/282.876bf6b3.chunk.js","mappings":"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","sources":["../node_modules/mermaid/dist/chunks/mermaid.core/timeline-definition-BDJGKUSR.mjs"],"sourcesContent":["import {\n __export,\n __name,\n clear,\n commonDb_exports,\n getConfig2 as getConfig,\n log,\n setupGraphViewbox\n} from \"./chunk-YTJNT7DU.mjs\";\n\n// src/diagrams/timeline/parser/timeline.jison\nvar parser = function() {\n var o = /* @__PURE__ */ __name(function(k, v, o2, l) {\n for (o2 = o2 || {}, l = k.length; l--; o2[k[l]] = v) ;\n return o2;\n }, \"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];\n var parser2 = {\n trace: /* @__PURE__ */ __name(function trace() {\n }, \"trace\"),\n yy: {},\n 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 },\n 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\" },\n 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]],\n performAction: /* @__PURE__ */ __name(function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) {\n var $0 = $$.length - 1;\n switch (yystate) {\n case 1:\n return $$[$0 - 1];\n break;\n case 2:\n this.$ = [];\n break;\n case 3:\n $$[$0 - 1].push($$[$0]);\n this.$ = $$[$0 - 1];\n break;\n case 4:\n case 5:\n this.$ = $$[$0];\n break;\n case 6:\n case 7:\n this.$ = [];\n break;\n case 8:\n yy.getCommonDb().setDiagramTitle($$[$0].substr(6));\n this.$ = $$[$0].substr(6);\n break;\n case 9:\n this.$ = $$[$0].trim();\n yy.getCommonDb().setAccTitle(this.$);\n break;\n case 10:\n case 11:\n this.$ = $$[$0].trim();\n yy.getCommonDb().setAccDescription(this.$);\n break;\n case 12:\n yy.addSection($$[$0].substr(8));\n this.$ = $$[$0].substr(8);\n break;\n case 15:\n yy.addTask($$[$0], 0, \"\");\n this.$ = $$[$0];\n break;\n case 16:\n yy.addEvent($$[$0].substr(2));\n this.$ = $$[$0];\n break;\n }\n }, \"anonymous\"),\n 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])],\n defaultActions: {},\n parseError: /* @__PURE__ */ __name(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 }, \"parseError\"),\n parse: /* @__PURE__ */ __name(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 lexer2 = 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 lexer2.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer2;\n sharedState.yy.parser = this;\n if (typeof lexer2.yylloc == \"undefined\") {\n lexer2.yylloc = {};\n }\n var yyloc = lexer2.yylloc;\n lstack.push(yyloc);\n var ranges = lexer2.options && lexer2.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 __name(popStack, \"popStack\");\n function lex() {\n var token;\n token = tstack.pop() || lexer2.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 __name(lex, \"lex\");\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 (lexer2.showPosition) {\n errStr = \"Parse error on line \" + (yylineno + 1) + \":\\n\" + lexer2.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: lexer2.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer2.yylineno,\n loc: yyloc,\n 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(lexer2.yytext);\n lstack.push(lexer2.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = lexer2.yyleng;\n yytext = lexer2.yytext;\n yylineno = lexer2.yylineno;\n yyloc = lexer2.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 }, \"parse\")\n };\n var lexer = /* @__PURE__ */ function() {\n var lexer2 = {\n EOF: 1,\n parseError: /* @__PURE__ */ __name(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 }, \"parseError\"),\n // resets the lexer, sets new input\n setInput: /* @__PURE__ */ __name(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 }, \"setInput\"),\n // consumes and returns one char from the input\n input: /* @__PURE__ */ __name(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 this._input = this._input.slice(1);\n return ch;\n }, \"input\"),\n // unshifts one char (or a string) into the input\n unput: /* @__PURE__ */ __name(function(ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - 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 if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\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 ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len\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 }, \"unput\"),\n // When called from action, caches matched text and appends it on next action\n more: /* @__PURE__ */ __name(function() {\n this._more = true;\n return this;\n }, \"more\"),\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.\n reject: /* @__PURE__ */ __name(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 return this;\n }, \"reject\"),\n // retain first n characters of the match\n less: /* @__PURE__ */ __name(function(n) {\n this.unput(this.match.slice(n));\n }, \"less\"),\n // displays already matched input, i.e. for error messages\n pastInput: /* @__PURE__ */ __name(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 }, \"pastInput\"),\n // displays upcoming input, i.e. for error messages\n upcomingInput: /* @__PURE__ */ __name(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 }, \"upcomingInput\"),\n // displays the character position where the lexing error occurred, i.e. for error messages\n showPosition: /* @__PURE__ */ __name(function() {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n }, \"showPosition\"),\n // test the lexed token: return FALSE when not a match, otherwise return token\n test_match: /* @__PURE__ */ __name(function(match, indexed_rule) {\n var token, lines, backup;\n if (this.options.backtrack_lexer) {\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 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 ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length : 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 for (var k in backup) {\n this[k] = backup[k];\n }\n return false;\n }\n return false;\n }, \"test_match\"),\n // return next match in input\n next: /* @__PURE__ */ __name(function() {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n var token, match, tempMatch, 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;\n } else {\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 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 }, \"next\"),\n // return next match that has a token\n lex: /* @__PURE__ */ __name(function lex() {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n }, \"lex\"),\n // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\n begin: /* @__PURE__ */ __name(function begin(condition) {\n this.conditionStack.push(condition);\n }, \"begin\"),\n // pop the previously active lexer condition state off the condition stack\n popState: /* @__PURE__ */ __name(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 }, \"popState\"),\n // produce the lexer rule set which is active for the currently active lexer condition state\n _currentRules: /* @__PURE__ */ __name(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 }, \"_currentRules\"),\n // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\n topState: /* @__PURE__ */ __name(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 }, \"topState\"),\n // alias for begin(condition)\n pushState: /* @__PURE__ */ __name(function pushState(condition) {\n this.begin(condition);\n }, \"pushState\"),\n // return the number of states currently on the stack\n stateStackSize: /* @__PURE__ */ __name(function stateStackSize() {\n return this.conditionStack.length;\n }, \"stateStackSize\"),\n options: { \"case-insensitive\": true },\n performAction: /* @__PURE__ */ __name(function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) {\n var YYSTATE = YY_START;\n switch ($avoiding_name_collisions) {\n case 0:\n break;\n case 1:\n break;\n case 2:\n return 10;\n break;\n case 3:\n break;\n case 4:\n break;\n case 5:\n return 4;\n break;\n case 6:\n return 11;\n break;\n case 7:\n this.begin(\"acc_title\");\n return 12;\n break;\n case 8:\n this.popState();\n return \"acc_title_value\";\n break;\n case 9:\n this.begin(\"acc_descr\");\n return 14;\n break;\n case 10:\n this.popState();\n return \"acc_descr_value\";\n break;\n case 11:\n this.begin(\"acc_descr_multiline\");\n break;\n case 12:\n this.popState();\n break;\n case 13:\n return \"acc_descr_multiline_value\";\n break;\n case 14:\n return 17;\n break;\n case 15:\n return 21;\n break;\n case 16:\n return 20;\n break;\n case 17:\n return 6;\n break;\n case 18:\n return \"INVALID\";\n break;\n }\n }, \"anonymous\"),\n 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]+)/i, /^(?:[^#:\\n]+)/i, /^(?:$)/i, /^(?:.)/i],\n 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 } }\n };\n return lexer2;\n }();\n parser2.lexer = lexer;\n function Parser() {\n this.yy = {};\n }\n __name(Parser, \"Parser\");\n Parser.prototype = parser2;\n parser2.Parser = Parser;\n return new Parser();\n}();\nparser.parser = parser;\nvar timeline_default = parser;\n\n// src/diagrams/timeline/timelineDb.js\nvar timelineDb_exports = {};\n__export(timelineDb_exports, {\n addEvent: () => addEvent,\n addSection: () => addSection,\n addTask: () => addTask,\n addTaskOrg: () => addTaskOrg,\n clear: () => clear2,\n default: () => timelineDb_default,\n getCommonDb: () => getCommonDb,\n getSections: () => getSections,\n getTasks: () => getTasks\n});\nvar currentSection = \"\";\nvar currentTaskId = 0;\nvar sections = [];\nvar tasks = [];\nvar rawTasks = [];\nvar getCommonDb = /* @__PURE__ */ __name(() => commonDb_exports, \"getCommonDb\");\nvar clear2 = /* @__PURE__ */ __name(function() {\n sections.length = 0;\n tasks.length = 0;\n currentSection = \"\";\n rawTasks.length = 0;\n clear();\n}, \"clear\");\nvar addSection = /* @__PURE__ */ __name(function(txt) {\n currentSection = txt;\n sections.push(txt);\n}, \"addSection\");\nvar getSections = /* @__PURE__ */ __name(function() {\n return sections;\n}, \"getSections\");\nvar getTasks = /* @__PURE__ */ __name(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 tasks.push(...rawTasks);\n return tasks;\n}, \"getTasks\");\nvar addTask = /* @__PURE__ */ __name(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}, \"addTask\");\nvar addEvent = /* @__PURE__ */ __name(function(event) {\n const currentTask = rawTasks.find((task) => task.id === currentTaskId - 1);\n currentTask.events.push(event);\n}, \"addEvent\");\nvar addTaskOrg = /* @__PURE__ */ __name(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}, \"addTaskOrg\");\nvar compileTasks = /* @__PURE__ */ __name(function() {\n const compileTask = /* @__PURE__ */ __name(function(pos) {\n return rawTasks[pos].processed;\n }, \"compileTask\");\n let allProcessed = true;\n for (const [i, rawTask] of rawTasks.entries()) {\n compileTask(i);\n allProcessed = allProcessed && rawTask.processed;\n }\n return allProcessed;\n}, \"compileTasks\");\nvar timelineDb_default = {\n clear: clear2,\n getCommonDb,\n addSection,\n getSections,\n getTasks,\n addTask,\n addTaskOrg,\n addEvent\n};\n\n// src/diagrams/timeline/timelineRenderer.ts\nimport { select as select2 } from \"d3\";\n\n// src/diagrams/timeline/svgDraw.js\nimport { arc as d3arc, select } from \"d3\";\nvar MAX_SECTIONS = 12;\nvar drawRect = /* @__PURE__ */ __name(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 if (rectData.class !== void 0) {\n rectElem.attr(\"class\", rectData.class);\n }\n return rectElem;\n}, \"drawRect\");\nvar drawFace = /* @__PURE__ */ __name(function(element, faceData) {\n const radius = 15;\n 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\");\n const face = element.append(\"g\");\n 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\");\n 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\");\n function smile(face2) {\n const arc = d3arc().startAngle(Math.PI / 2).endAngle(3 * (Math.PI / 2)).innerRadius(radius / 2).outerRadius(radius / 2.2);\n face2.append(\"path\").attr(\"class\", \"mouth\").attr(\"d\", arc).attr(\"transform\", \"translate(\" + faceData.cx + \",\" + (faceData.cy + 2) + \")\");\n }\n __name(smile, \"smile\");\n function sad(face2) {\n const arc = d3arc().startAngle(3 * Math.PI / 2).endAngle(5 * (Math.PI / 2)).innerRadius(radius / 2).outerRadius(radius / 2.2);\n face2.append(\"path\").attr(\"class\", \"mouth\").attr(\"d\", arc).attr(\"transform\", \"translate(\" + faceData.cx + \",\" + (faceData.cy + 7) + \")\");\n }\n __name(sad, \"sad\");\n function ambivalent(face2) {\n 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\");\n }\n __name(ambivalent, \"ambivalent\");\n if (faceData.score > 3) {\n smile(face);\n } else if (faceData.score < 3) {\n sad(face);\n } else {\n ambivalent(face);\n }\n return circleElement;\n}, \"drawFace\");\nvar drawCircle = /* @__PURE__ */ __name(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 if (circleElement.class !== void 0) {\n circleElement.attr(\"class\", circleElement.class);\n }\n if (circleData.title !== void 0) {\n circleElement.append(\"title\").text(circleData.title);\n }\n return circleElement;\n}, \"drawCircle\");\nvar drawText = /* @__PURE__ */ __name(function(elem, textData) {\n const nText = textData.text.replace(//gi, \" \");\n const textElem = elem.append(\"text\");\n textElem.attr(\"x\", textData.x);\n textElem.attr(\"y\", textData.y);\n textElem.attr(\"class\", \"legend\");\n textElem.style(\"text-anchor\", textData.anchor);\n if (textData.class !== void 0) {\n textElem.attr(\"class\", textData.class);\n }\n const span = textElem.append(\"tspan\");\n span.attr(\"x\", textData.x + textData.textMargin * 2);\n span.text(nText);\n return textElem;\n}, \"drawText\");\nvar drawLabel = /* @__PURE__ */ __name(function(elem, txtObject) {\n function genPoints(x, y, width, height, cut) {\n return x + \",\" + y + \" \" + (x + width) + \",\" + y + \" \" + (x + width) + \",\" + (y + height - cut) + \" \" + (x + width - cut * 1.2) + \",\" + (y + height) + \" \" + x + \",\" + (y + height);\n }\n __name(genPoints, \"genPoints\");\n const polygon = elem.append(\"polygon\");\n polygon.attr(\"points\", genPoints(txtObject.x, txtObject.y, 50, 20, 7));\n polygon.attr(\"class\", \"labelBox\");\n txtObject.y = txtObject.y + txtObject.labelMargin;\n txtObject.x = txtObject.x + 0.5 * txtObject.labelMargin;\n drawText(elem, txtObject);\n}, \"drawLabel\");\nvar drawSection = /* @__PURE__ */ __name(function(elem, section, conf) {\n const g = elem.append(\"g\");\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 _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}, \"drawSection\");\nvar taskCount = -1;\nvar drawTask = /* @__PURE__ */ __name(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\").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\");\n drawFace(g, {\n cx: center,\n cy: 300 + (5 - task.score) * 30,\n score: task.score\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 _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}, \"drawTask\");\nvar drawBackgroundRect = /* @__PURE__ */ __name(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}, \"drawBackgroundRect\");\nvar getTextObj = /* @__PURE__ */ __name(function() {\n return {\n x: 0,\n y: 0,\n fill: void 0,\n \"text-anchor\": \"start\",\n width: 100,\n height: 100,\n textMargin: 0,\n rx: 0,\n ry: 0\n };\n}, \"getTextObj\");\nvar getNoteRect = /* @__PURE__ */ __name(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}, \"getNoteRect\");\nvar _drawTextCandidateFunc = /* @__PURE__ */ function() {\n function byText(content, g, x, y, width, height, textAttrs, colour) {\n 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);\n _setTextAttrs(text, textAttrs);\n }\n __name(byText, \"byText\");\n function byTspan(content, g, x, y, width, height, textAttrs, conf, colour) {\n const { taskFontSize, taskFontFamily } = conf;\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.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);\n text.append(\"tspan\").attr(\"x\", x + width / 2).attr(\"dy\", dy).text(lines[i]);\n text.attr(\"y\", y + height / 2).attr(\"dominant-baseline\", \"central\").attr(\"alignment-baseline\", \"central\");\n _setTextAttrs(text, textAttrs);\n }\n }\n __name(byTspan, \"byTspan\");\n function byFo(content, g, x, y, width, height, textAttrs, conf) {\n const body = g.append(\"switch\");\n const f = body.append(\"foreignObject\").attr(\"x\", x).attr(\"y\", y).attr(\"width\", width).attr(\"height\", height).attr(\"position\", \"fixed\");\n const text = f.append(\"xhtml:div\").style(\"display\", \"table\").style(\"height\", \"100%\").style(\"width\", \"100%\");\n text.append(\"div\").attr(\"class\", \"label\").style(\"display\", \"table-cell\").style(\"text-align\", \"center\").style(\"vertical-align\", \"middle\").text(content);\n byTspan(content, body, x, y, width, height, textAttrs, conf);\n _setTextAttrs(text, textAttrs);\n }\n __name(byFo, \"byFo\");\n function _setTextAttrs(toText, fromTextAttrsDict) {\n for (const key in fromTextAttrsDict) {\n if (key in fromTextAttrsDict) {\n toText.attr(key, fromTextAttrsDict[key]);\n }\n }\n }\n __name(_setTextAttrs, \"_setTextAttrs\");\n return function(conf) {\n return conf.textPlacement === \"fo\" ? byFo : conf.textPlacement === \"old\" ? byText : byTspan;\n };\n}();\nvar initGraphics = /* @__PURE__ */ __name(function(graphics) {\n 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\");\n}, \"initGraphics\");\nfunction wrap(text, width) {\n text.each(function() {\n 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\");\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 tspan = text2.append(\"tspan\").attr(\"x\", 0).attr(\"y\", y).attr(\"dy\", lineHeight + \"em\").text(word);\n }\n }\n });\n}\n__name(wrap, \"wrap\");\nvar drawNode = /* @__PURE__ */ __name(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 const textElem = nodeElem.append(\"g\");\n 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);\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 textElem.attr(\"transform\", \"translate(\" + node.width / 2 + \", \" + node.padding / 2 + \")\");\n defaultBkg(bkgElem, node, section, conf);\n return node;\n}, \"drawNode\");\nvar getVirtualNodeHeight = /* @__PURE__ */ __name(function(elem, node, conf) {\n const textElem = elem.append(\"g\");\n 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);\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}, \"getVirtualNodeHeight\");\nvar defaultBkg = /* @__PURE__ */ __name(function(elem, node, section) {\n const rd = 5;\n elem.append(\"path\").attr(\"id\", \"node-\" + node.id).attr(\"class\", \"node-bkg node-\" + node.type).attr(\n \"d\",\n `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`\n );\n elem.append(\"line\").attr(\"class\", \"node-line-\" + section).attr(\"x1\", 0).attr(\"y1\", node.height).attr(\"x2\", node.width).attr(\"y2\", node.height);\n}, \"defaultBkg\");\nvar svgDraw_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\n// src/diagrams/timeline/timelineRenderer.ts\nvar draw = /* @__PURE__ */ __name(function(text, id, version, diagObj) {\n const conf = getConfig();\n const LEFT_MARGIN = conf.leftMargin ?? 50;\n log.debug(\"timeline\", diagObj.db);\n const securityLevel = conf.securityLevel;\n let sandboxElement;\n if (securityLevel === \"sandbox\") {\n sandboxElement = select2(\"#i\" + id);\n }\n const root = securityLevel === \"sandbox\" ? select2(sandboxElement.nodes()[0].contentDocument.body) : select2(\"body\");\n const svg = root.select(\"#\" + id);\n svg.append(\"g\");\n const tasks2 = diagObj.db.getTasks();\n const title = diagObj.db.getCommonDb().getDiagramTitle();\n log.debug(\"task\", tasks2);\n svgDraw_default.initGraphics(svg);\n const sections2 = diagObj.db.getSections();\n log.debug(\"sections\", sections2);\n let maxSectionHeight = 0;\n let maxTaskHeight = 0;\n let depthY = 0;\n let sectionBeginY = 0;\n let masterX = 50 + LEFT_MARGIN;\n let masterY = 50;\n sectionBeginY = 50;\n let sectionNumber = 0;\n let hasSections = true;\n sections2.forEach(function(section) {\n const sectionNode = {\n number: sectionNumber,\n descr: section,\n section: sectionNumber,\n width: 150,\n padding: 20,\n maxHeight: maxSectionHeight\n };\n const sectionHeight = svgDraw_default.getVirtualNodeHeight(svg, sectionNode, conf);\n log.debug(\"sectionHeight before draw\", sectionHeight);\n maxSectionHeight = Math.max(maxSectionHeight, sectionHeight + 20);\n });\n let maxEventCount = 0;\n let maxEventLineLength = 0;\n log.debug(\"tasks.length\", tasks2.length);\n for (const [i, task] of tasks2.entries()) {\n const taskNode = {\n number: i,\n descr: task,\n section: task.section,\n width: 150,\n padding: 20,\n maxHeight: maxTaskHeight\n };\n const taskHeight = svgDraw_default.getVirtualNodeHeight(svg, taskNode, conf);\n log.debug(\"taskHeight before draw\", taskHeight);\n maxTaskHeight = Math.max(maxTaskHeight, taskHeight + 20);\n maxEventCount = Math.max(maxEventCount, task.events.length);\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_default.getVirtualNodeHeight(svg, eventNode, conf);\n }\n maxEventLineLength = Math.max(maxEventLineLength, maxEventLineLengthTemp);\n }\n log.debug(\"maxSectionHeight before draw\", maxSectionHeight);\n log.debug(\"maxTaskHeight before draw\", maxTaskHeight);\n if (sections2 && sections2.length > 0) {\n sections2.forEach((section) => {\n const tasksForSection = tasks2.filter((task) => task.section === section);\n const sectionNode = {\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_default.drawNode(sectionNodeWrapper, sectionNode, sectionNumber, conf);\n log.debug(\"sectionNode output\", node);\n sectionNodeWrapper.attr(\"transform\", `translate(${masterX}, ${sectionBeginY})`);\n masterY += maxSectionHeight + 50;\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 masterX += 200 * Math.max(tasksForSection.length, 1);\n masterY = sectionBeginY;\n sectionNumber++;\n });\n } else {\n hasSections = false;\n drawTasks(\n svg,\n tasks2,\n sectionNumber,\n masterX,\n masterY,\n maxTaskHeight,\n conf,\n maxEventCount,\n maxEventLineLength,\n maxSectionHeight,\n true\n );\n }\n const box = svg.node().getBBox();\n log.debug(\"bounds\", box);\n if (title) {\n svg.append(\"text\").text(title).attr(\"x\", box.width / 2 - LEFT_MARGIN).attr(\"font-size\", \"4ex\").attr(\"font-weight\", \"bold\").attr(\"y\", 20);\n }\n depthY = hasSections ? maxSectionHeight + maxTaskHeight + 150 : maxTaskHeight + 100;\n const lineWrapper = svg.append(\"g\").attr(\"class\", \"lineWrapper\");\n 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)\");\n setupGraphViewbox(\n void 0,\n svg,\n conf.timeline?.padding ?? 50,\n conf.timeline?.useMaxWidth ?? false\n );\n}, \"draw\");\nvar drawTasks = /* @__PURE__ */ __name(function(diagram2, tasks2, sectionColor, masterX, masterY, maxTaskHeight, conf, maxEventCount, maxEventLineLength, maxSectionHeight, isWithoutSections) {\n for (const task of tasks2) {\n const taskNode = {\n descr: task.task,\n section: sectionColor,\n number: sectionColor,\n width: 150,\n padding: 20,\n maxHeight: maxTaskHeight\n };\n log.debug(\"taskNode\", taskNode);\n const taskWrapper = diagram2.append(\"g\").attr(\"class\", \"taskWrapper\");\n const node = svgDraw_default.drawNode(taskWrapper, taskNode, sectionColor, conf);\n const taskHeight = node.height;\n log.debug(\"taskHeight after draw\", taskHeight);\n taskWrapper.attr(\"transform\", `translate(${masterX}, ${masterY})`);\n maxTaskHeight = Math.max(maxTaskHeight, taskHeight);\n if (task.events) {\n const lineWrapper = diagram2.append(\"g\").attr(\"class\", \"lineWrapper\");\n let lineLength = maxTaskHeight;\n masterY += 100;\n lineLength = lineLength + drawEvents(diagram2, task.events, sectionColor, masterX, masterY, conf);\n masterY -= 100;\n lineWrapper.append(\"line\").attr(\"x1\", masterX + 190 / 2).attr(\"y1\", masterY + maxTaskHeight).attr(\"x2\", masterX + 190 / 2).attr(\n \"y2\",\n masterY + maxTaskHeight + (isWithoutSections ? maxTaskHeight : maxSectionHeight) + maxEventLineLength + 120\n ).attr(\"stroke-width\", 2).attr(\"stroke\", \"black\").attr(\"marker-end\", \"url(#arrowhead)\").attr(\"stroke-dasharray\", \"5,5\");\n }\n masterX = masterX + 200;\n if (isWithoutSections && !conf.timeline?.disableMulticolor) {\n sectionColor++;\n }\n }\n masterY = masterY - 10;\n}, \"drawTasks\");\nvar drawEvents = /* @__PURE__ */ __name(function(diagram2, events, sectionColor, masterX, masterY, conf) {\n let maxEventHeight = 0;\n const eventBeginY = masterY;\n masterY = masterY + 100;\n for (const event of events) {\n const eventNode = {\n descr: event,\n section: sectionColor,\n number: sectionColor,\n width: 150,\n padding: 20,\n maxHeight: 50\n };\n log.debug(\"eventNode\", eventNode);\n const eventWrapper = diagram2.append(\"g\").attr(\"class\", \"eventWrapper\");\n const node = svgDraw_default.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 masterY = eventBeginY;\n return maxEventHeight;\n}, \"drawEvents\");\nvar timelineRenderer_default = {\n setConf: /* @__PURE__ */ __name(() => {\n }, \"setConf\"),\n draw\n};\n\n// src/diagrams/timeline/styles.js\nimport { darken, lighten, isDark } from \"khroma\";\nvar genSections = /* @__PURE__ */ __name((options) => {\n let sections2 = \"\";\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 for (let i = 0; i < options.THEME_COLOR_LIMIT; i++) {\n const sw = \"\" + (17 - 3 * i);\n sections2 += `\n .section-${i - 1} rect, .section-${i - 1} path, .section-${i - 1} circle, .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 .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 sections2;\n}, \"genSections\");\nvar getStyles = /* @__PURE__ */ __name((options) => `\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`, \"getStyles\");\nvar styles_default = getStyles;\n\n// src/diagrams/timeline/timeline-definition.ts\nvar diagram = {\n db: timelineDb_exports,\n renderer: timelineRenderer_default,\n parser: timeline_default,\n styles: styles_default\n};\nexport {\n diagram\n};\n"],"names":["parser","o","__name","k","v","o2","l","length","$V0","$V1","$V2","$V3","$V4","$V5","$V6","$V7","parser2","trace","yy","symbols_","terminals_","productions_","performAction","yytext","yyleng","yylineno","yystate","$$","_$","$0","this","$","push","getCommonDb","setDiagramTitle","substr","trim","setAccTitle","setAccDescription","addSection","addTask","addEvent","table","defaultActions","parseError","str","hash","recoverable","error","Error","parse","input","self","stack","tstack","vstack","lstack","recovering","args","slice","call","arguments","lexer2","Object","create","lexer","sharedState","prototype","hasOwnProperty","setInput","yylloc","yyloc","ranges","options","lex","token","pop","Array","getPrototypeOf","n","symbol","preErrorSymbol","state","action","r","p","len","newState","expected","yyval","errStr","showPosition","join","text","match","line","loc","first_line","last_line","first_column","last_column","range","apply","concat","EOF","_input","_more","_backtrack","done","matched","conditionStack","offset","ch","unput","lines","split","oldLines","more","reject","backtrack_lexer","less","pastInput","past","replace","upcomingInput","next","pre","c","test_match","indexed_rule","backup","matches","tempMatch","index","rules","_currentRules","i","flex","begin","condition","popState","conditions","topState","Math","abs","pushState","stateStackSize","yy_","$avoiding_name_collisions","YY_START","Parser","timeline_default","timelineDb_exports","__export","addTaskOrg","clear","clear2","default","timelineDb_default","getSections","getTasks","currentSection","currentTaskId","sections","tasks","rawTasks","commonDb_exports","txt","allItemsProcessed","compileTasks","iterationCount","period","event","rawTask","id","section","type","task","score","events","find","descr","newTask","description","classes","compileTask","pos","processed","allProcessed","entries","drawRect","elem","rectData","rectElem","append","attr","x","y","fill","stroke","width","height","rx","ry","class","drawFace","element","faceData","radius","circleElement","cx","cy","face","smile","face2","arc","d3arc","startAngle","PI","endAngle","innerRadius","outerRadius","sad","ambivalent","drawCircle","circleData","title","drawText","textData","nText","textElem","style","anchor","span","textMargin","drawLabel","txtObject","genPoints","cut","polygon","labelMargin","drawSection","conf","g","rect","getNoteRect","num","_drawTextCandidateFunc","colour","taskCount","drawTask","center","drawBackgroundRect","bounds","startx","starty","stopx","stopy","lower","getTextObj","byText","content","textAttrs","_setTextAttrs","byTspan","taskFontSize","taskFontFamily","dy","byFo","body","toText","fromTextAttrsDict","key","textPlacement","initGraphics","graphics","wrap","each","word","text2","select","words","reverse","parseFloat","tspan","j","node","getComputedTextLength","lineHeight","drawNode","fullSection","nodeElem","bkgElem","bbox","getBBox","fontSize","padding","max","maxHeight","defaultBkg","getVirtualNodeHeight","remove","svgDraw_default","draw","version","diagObj","getConfig","LEFT_MARGIN","leftMargin","log","debug","db","securityLevel","sandboxElement","select2","svg","nodes","contentDocument","tasks2","getDiagramTitle","sections2","maxSectionHeight","maxTaskHeight","depthY","sectionBeginY","masterX","masterY","sectionNumber","hasSections","forEach","sectionNode","number","sectionHeight","maxEventCount","maxEventLineLength","taskNode","taskHeight","maxEventLineLengthTemp","eventNode","tasksForSection","filter","sectionNodeWrapper","drawTasks","box","setupGraphViewbox","timeline","useMaxWidth","diagram2","sectionColor","isWithoutSections","taskWrapper","lineWrapper","lineLength","drawEvents","disableMulticolor","maxEventHeight","eventBeginY","eventWrapper","eventHeight","timelineRenderer_default","setConf","genSections","THEME_COLOR_LIMIT","isDark","lighten","darken","sw","diagram","renderer","styles","git0","gitBranchLabel0"],"sourceRoot":""} \ No newline at end of file diff --git a/frontend/deployed/static/js/314.5b42713c.chunk.js b/frontend/deployed/static/js/314.5b42713c.chunk.js deleted file mode 100644 index a6b8d90..0000000 --- a/frontend/deployed/static/js/314.5b42713c.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunkbackstory=self.webpackChunkbackstory||[]).push([[314],{5400:(t,e,a)=>{a.d(e,{CP:()=>l,HT:()=>h,PB:()=>d,aC:()=>c,lC:()=>n,m:()=>o,tk:()=>i});var s=a(3759),r=a(3755),i=(0,s.K2)(((t,e)=>{const a=t.append("rect");if(a.attr("x",e.x),a.attr("y",e.y),a.attr("fill",e.fill),a.attr("stroke",e.stroke),a.attr("width",e.width),a.attr("height",e.height),e.name&&a.attr("name",e.name),e.rx&&a.attr("rx",e.rx),e.ry&&a.attr("ry",e.ry),void 0!==e.attrs)for(const s in e.attrs)a.attr(s,e.attrs[s]);return e.class&&a.attr("class",e.class),a}),"drawRect"),n=(0,s.K2)(((t,e)=>{const a={x:e.startx,y:e.starty,width:e.stopx-e.startx,height:e.stopy-e.starty,fill:e.fill,stroke:e.stroke,class:"rect"};i(t,a).lower()}),"drawBackgroundRect"),o=(0,s.K2)(((t,e)=>{const a=e.text.replace(s.H1," "),r=t.append("text");r.attr("x",e.x),r.attr("y",e.y),r.attr("class","legend"),r.style("text-anchor",e.anchor),e.class&&r.attr("class",e.class);const i=r.append("tspan");return i.attr("x",e.x+2*e.textMargin),i.text(a),r}),"drawText"),c=(0,s.K2)(((t,e,a,s)=>{const i=t.append("image");i.attr("x",e),i.attr("y",a);const n=(0,r.J)(s);i.attr("xlink:href",n)}),"drawImage"),l=(0,s.K2)(((t,e,a,s)=>{const i=t.append("use");i.attr("x",e),i.attr("y",a);const n=(0,r.J)(s);i.attr("xlink:href",`#${n}`)}),"drawEmbeddedImage"),d=(0,s.K2)((()=>({x:0,y:0,width:100,height:100,fill:"#EDF2AE",stroke:"#666",anchor:"start",rx:0,ry:0})),"getNoteRect"),h=(0,s.K2)((()=>({x:0,y:0,width:100,height:100,"text-anchor":"start",style:"#666",textMargin:0,rx:0,ry:0,tspan:!0})),"getTextObj")},9314:(t,e,a)=>{a.d(e,{diagram:()=>mt});var s=a(5400),r=a(9837),i=a(634),n=a(3759),o=a(700),c=a(3755),l=function(){var t=(0,n.K2)((function(t,e,a,s){for(a=a||{},s=t.length;s--;a[t[s]]=e);return a}),"o"),e=[1,2],a=[1,3],s=[1,4],r=[2,4],i=[1,9],o=[1,11],c=[1,13],l=[1,14],d=[1,16],h=[1,17],p=[1,18],g=[1,24],u=[1,25],x=[1,26],y=[1,27],m=[1,28],b=[1,29],T=[1,30],E=[1,31],f=[1,32],w=[1,33],I=[1,34],L=[1,35],P=[1,36],_=[1,37],k=[1,38],v=[1,39],A=[1,41],N=[1,42],M=[1,43],D=[1,44],O=[1,45],S=[1,46],R=[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,54,59,60,61,62,70],Y=[4,5,16,50,52,53],K=[4,5,13,14,16,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,50,52,53,54,59,60,61,62,70],C=[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,54,59,60,61,62,70],B=[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,54,59,60,61,62,70],$=[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,54,59,60,61,62,70],V=[68,69,70],F=[1,122],W={trace:(0,n.K2)((function(){}),"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,note:54,placement:55,text2:56,over:57,actor_pair:58,links:59,link:60,properties:61,details:62,spaceList:63,",":64,left_of:65,right_of:66,signaltype:67,"+":68,"-":69,ACTOR:70,SOLID_OPEN_ARROW:71,DOTTED_OPEN_ARROW:72,SOLID_ARROW:73,BIDIRECTIONAL_SOLID_ARROW:74,DOTTED_ARROW:75,BIDIRECTIONAL_DOTTED_ARROW:76,SOLID_CROSS:77,DOTTED_CROSS:78,SOLID_POINT:79,DOTTED_POINT:80,TXT:81,$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",54:"note",57:"over",59:"links",60:"link",61:"properties",62:"details",64:",",65:"left_of",66:"right_of",68:"+",69:"-",70:"ACTOR",71:"SOLID_OPEN_ARROW",72:"DOTTED_OPEN_ARROW",73:"SOLID_ARROW",74:"BIDIRECTIONAL_SOLID_ARROW",75:"DOTTED_ARROW",76:"BIDIRECTIONAL_DOTTED_ARROW",77:"SOLID_CROSS",78:"DOTTED_CROSS",79:"SOLID_POINT",80:"DOTTED_POINT",81:"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],[24,4],[24,4],[25,3],[26,3],[27,3],[28,3],[63,2],[63,1],[58,3],[58,1],[55,1],[55,1],[17,5],[17,5],[17,4],[22,1],[67,1],[67,1],[67,1],[67,1],[67,1],[67,1],[67,1],[67,1],[67,1],[67,1],[56,1]],performAction:(0,n.K2)((function(t,e,a,s,r,i,n){var o=i.length-1;switch(r){case 3:return s.apply(i[o]),i[o];case 4:case 9:case 8:case 13:this.$=[];break;case 5:case 10:i[o-1].push(i[o]),this.$=i[o-1];break;case 6:case 7:case 11:case 12:case 62:this.$=i[o];break;case 15:i[o].type="createParticipant",this.$=i[o];break;case 16:i[o-1].unshift({type:"boxStart",boxData:s.parseBoxData(i[o-2])}),i[o-1].push({type:"boxEnd",boxText:i[o-2]}),this.$=i[o-1];break;case 18:this.$={type:"sequenceIndex",sequenceIndex:Number(i[o-2]),sequenceIndexStep:Number(i[o-1]),sequenceVisible:!0,signalType:s.LINETYPE.AUTONUMBER};break;case 19:this.$={type:"sequenceIndex",sequenceIndex:Number(i[o-1]),sequenceIndexStep:1,sequenceVisible:!0,signalType:s.LINETYPE.AUTONUMBER};break;case 20:this.$={type:"sequenceIndex",sequenceVisible:!1,signalType:s.LINETYPE.AUTONUMBER};break;case 21:this.$={type:"sequenceIndex",sequenceVisible:!0,signalType:s.LINETYPE.AUTONUMBER};break;case 22:this.$={type:"activeStart",signalType:s.LINETYPE.ACTIVE_START,actor:i[o-1].actor};break;case 23:this.$={type:"activeEnd",signalType:s.LINETYPE.ACTIVE_END,actor:i[o-1].actor};break;case 29:s.setDiagramTitle(i[o].substring(6)),this.$=i[o].substring(6);break;case 30:s.setDiagramTitle(i[o].substring(7)),this.$=i[o].substring(7);break;case 31:this.$=i[o].trim(),s.setAccTitle(this.$);break;case 32:case 33:this.$=i[o].trim(),s.setAccDescription(this.$);break;case 34:i[o-1].unshift({type:"loopStart",loopText:s.parseMessage(i[o-2]),signalType:s.LINETYPE.LOOP_START}),i[o-1].push({type:"loopEnd",loopText:i[o-2],signalType:s.LINETYPE.LOOP_END}),this.$=i[o-1];break;case 35:i[o-1].unshift({type:"rectStart",color:s.parseMessage(i[o-2]),signalType:s.LINETYPE.RECT_START}),i[o-1].push({type:"rectEnd",color:s.parseMessage(i[o-2]),signalType:s.LINETYPE.RECT_END}),this.$=i[o-1];break;case 36:i[o-1].unshift({type:"optStart",optText:s.parseMessage(i[o-2]),signalType:s.LINETYPE.OPT_START}),i[o-1].push({type:"optEnd",optText:s.parseMessage(i[o-2]),signalType:s.LINETYPE.OPT_END}),this.$=i[o-1];break;case 37:i[o-1].unshift({type:"altStart",altText:s.parseMessage(i[o-2]),signalType:s.LINETYPE.ALT_START}),i[o-1].push({type:"altEnd",signalType:s.LINETYPE.ALT_END}),this.$=i[o-1];break;case 38:i[o-1].unshift({type:"parStart",parText:s.parseMessage(i[o-2]),signalType:s.LINETYPE.PAR_START}),i[o-1].push({type:"parEnd",signalType:s.LINETYPE.PAR_END}),this.$=i[o-1];break;case 39:i[o-1].unshift({type:"parStart",parText:s.parseMessage(i[o-2]),signalType:s.LINETYPE.PAR_OVER_START}),i[o-1].push({type:"parEnd",signalType:s.LINETYPE.PAR_END}),this.$=i[o-1];break;case 40:i[o-1].unshift({type:"criticalStart",criticalText:s.parseMessage(i[o-2]),signalType:s.LINETYPE.CRITICAL_START}),i[o-1].push({type:"criticalEnd",signalType:s.LINETYPE.CRITICAL_END}),this.$=i[o-1];break;case 41:i[o-1].unshift({type:"breakStart",breakText:s.parseMessage(i[o-2]),signalType:s.LINETYPE.BREAK_START}),i[o-1].push({type:"breakEnd",optText:s.parseMessage(i[o-2]),signalType:s.LINETYPE.BREAK_END}),this.$=i[o-1];break;case 43:this.$=i[o-3].concat([{type:"option",optionText:s.parseMessage(i[o-1]),signalType:s.LINETYPE.CRITICAL_OPTION},i[o]]);break;case 45:this.$=i[o-3].concat([{type:"and",parText:s.parseMessage(i[o-1]),signalType:s.LINETYPE.PAR_AND},i[o]]);break;case 47:this.$=i[o-3].concat([{type:"else",altText:s.parseMessage(i[o-1]),signalType:s.LINETYPE.ALT_ELSE},i[o]]);break;case 48:i[o-3].draw="participant",i[o-3].type="addParticipant",i[o-3].description=s.parseMessage(i[o-1]),this.$=i[o-3];break;case 49:i[o-1].draw="participant",i[o-1].type="addParticipant",this.$=i[o-1];break;case 50:i[o-3].draw="actor",i[o-3].type="addParticipant",i[o-3].description=s.parseMessage(i[o-1]),this.$=i[o-3];break;case 51:i[o-1].draw="actor",i[o-1].type="addParticipant",this.$=i[o-1];break;case 52:i[o-1].type="destroyParticipant",this.$=i[o-1];break;case 53:this.$=[i[o-1],{type:"addNote",placement:i[o-2],actor:i[o-1].actor,text:i[o]}];break;case 54:i[o-2]=[].concat(i[o-1],i[o-1]).slice(0,2),i[o-2][0]=i[o-2][0].actor,i[o-2][1]=i[o-2][1].actor,this.$=[i[o-1],{type:"addNote",placement:s.PLACEMENT.OVER,actor:i[o-2].slice(0,2),text:i[o]}];break;case 55:this.$=[i[o-1],{type:"addLinks",actor:i[o-1].actor,text:i[o]}];break;case 56:this.$=[i[o-1],{type:"addALink",actor:i[o-1].actor,text:i[o]}];break;case 57:this.$=[i[o-1],{type:"addProperties",actor:i[o-1].actor,text:i[o]}];break;case 58:this.$=[i[o-1],{type:"addDetails",actor:i[o-1].actor,text:i[o]}];break;case 61:this.$=[i[o-2],i[o]];break;case 63:this.$=s.PLACEMENT.LEFTOF;break;case 64:this.$=s.PLACEMENT.RIGHTOF;break;case 65:this.$=[i[o-4],i[o-1],{type:"addMessage",from:i[o-4].actor,to:i[o-1].actor,signalType:i[o-3],msg:i[o],activate:!0},{type:"activeStart",signalType:s.LINETYPE.ACTIVE_START,actor:i[o-1].actor}];break;case 66:this.$=[i[o-4],i[o-1],{type:"addMessage",from:i[o-4].actor,to:i[o-1].actor,signalType:i[o-3],msg:i[o]},{type:"activeEnd",signalType:s.LINETYPE.ACTIVE_END,actor:i[o-4].actor}];break;case 67:this.$=[i[o-3],i[o-1],{type:"addMessage",from:i[o-3].actor,to:i[o-1].actor,signalType:i[o-2],msg:i[o]}];break;case 68:this.$={type:"addParticipant",actor:i[o]};break;case 69:this.$=s.LINETYPE.SOLID_OPEN;break;case 70:this.$=s.LINETYPE.DOTTED_OPEN;break;case 71:this.$=s.LINETYPE.SOLID;break;case 72:this.$=s.LINETYPE.BIDIRECTIONAL_SOLID;break;case 73:this.$=s.LINETYPE.DOTTED;break;case 74:this.$=s.LINETYPE.BIDIRECTIONAL_DOTTED;break;case 75:this.$=s.LINETYPE.SOLID_CROSS;break;case 76:this.$=s.LINETYPE.DOTTED_CROSS;break;case 77:this.$=s.LINETYPE.SOLID_POINT;break;case 78:this.$=s.LINETYPE.DOTTED_POINT;break;case 79:this.$=s.parseMessage(i[o].trim().substring(1))}}),"anonymous"),table:[{3:1,4:e,5:a,6:s},{1:[3]},{3:5,4:e,5:a,6:s},{3:6,4:e,5:a,6:s},t([1,4,5,13,14,18,21,23,29,30,31,33,35,36,37,38,39,41,43,44,46,50,52,53,54,59,60,61,62,70],r,{7:7}),{1:[2,1]},{1:[2,2]},{1:[2,3],4:i,5:o,8:8,9:10,12:12,13:c,14:l,17:15,18:d,21:h,22:40,23:p,24:19,25:20,26:21,27:22,28:23,29:g,30:u,31:x,33:y,35:m,36:b,37:T,38:E,39:f,41:w,43:I,44:L,46:P,50:_,52:k,53:v,54:A,59:N,60:M,61:D,62:O,70:S},t(R,[2,5]),{9:47,12:12,13:c,14:l,17:15,18:d,21:h,22:40,23:p,24:19,25:20,26:21,27:22,28:23,29:g,30:u,31:x,33:y,35:m,36:b,37:T,38:E,39:f,41:w,43:I,44:L,46:P,50:_,52:k,53:v,54:A,59:N,60:M,61:D,62:O,70:S},t(R,[2,7]),t(R,[2,8]),t(R,[2,14]),{12:48,50:_,52:k,53:v},{15:[1,49]},{5:[1,50]},{5:[1,53],19:[1,51],20:[1,52]},{22:54,70:S},{22:55,70:S},{5:[1,56]},{5:[1,57]},{5:[1,58]},{5:[1,59]},{5:[1,60]},t(R,[2,29]),t(R,[2,30]),{32:[1,61]},{34:[1,62]},t(R,[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,70:S},{22:72,70:S},{22:73,70:S},{67:74,71:[1,75],72:[1,76],73:[1,77],74:[1,78],75:[1,79],76:[1,80],77:[1,81],78:[1,82],79:[1,83],80:[1,84]},{55:85,57:[1,86],65:[1,87],66:[1,88]},{22:89,70:S},{22:90,70:S},{22:91,70:S},{22:92,70:S},t([5,51,64,71,72,73,74,75,76,77,78,79,80,81],[2,68]),t(R,[2,6]),t(R,[2,15]),t(Y,[2,9],{10:93}),t(R,[2,17]),{5:[1,95],19:[1,94]},{5:[1,96]},t(R,[2,21]),{5:[1,97]},{5:[1,98]},t(R,[2,24]),t(R,[2,25]),t(R,[2,26]),t(R,[2,27]),t(R,[2,28]),t(R,[2,31]),t(R,[2,32]),t(K,r,{7:99}),t(K,r,{7:100}),t(K,r,{7:101}),t(C,r,{40:102,7:103}),t(B,r,{42:104,7:105}),t(B,r,{7:105,42:106}),t($,r,{45:107,7:108}),t(K,r,{7:109}),{5:[1,111],51:[1,110]},{5:[1,113],51:[1,112]},{5:[1,114]},{22:117,68:[1,115],69:[1,116],70:S},t(V,[2,69]),t(V,[2,70]),t(V,[2,71]),t(V,[2,72]),t(V,[2,73]),t(V,[2,74]),t(V,[2,75]),t(V,[2,76]),t(V,[2,77]),t(V,[2,78]),{22:118,70:S},{22:120,58:119,70:S},{70:[2,63]},{70:[2,64]},{56:121,81:F},{56:123,81:F},{56:124,81:F},{56:125,81:F},{4:[1,128],5:[1,130],11:127,12:129,16:[1,126],50:_,52:k,53:v},{5:[1,131]},t(R,[2,19]),t(R,[2,20]),t(R,[2,22]),t(R,[2,23]),{4:i,5:o,8:8,9:10,12:12,13:c,14:l,16:[1,132],17:15,18:d,21:h,22:40,23:p,24:19,25:20,26:21,27:22,28:23,29:g,30:u,31:x,33:y,35:m,36:b,37:T,38:E,39:f,41:w,43:I,44:L,46:P,50:_,52:k,53:v,54:A,59:N,60:M,61:D,62:O,70:S},{4:i,5:o,8:8,9:10,12:12,13:c,14:l,16:[1,133],17:15,18:d,21:h,22:40,23:p,24:19,25:20,26:21,27:22,28:23,29:g,30:u,31:x,33:y,35:m,36:b,37:T,38:E,39:f,41:w,43:I,44:L,46:P,50:_,52:k,53:v,54:A,59:N,60:M,61:D,62:O,70:S},{4:i,5:o,8:8,9:10,12:12,13:c,14:l,16:[1,134],17:15,18:d,21:h,22:40,23:p,24:19,25:20,26:21,27:22,28:23,29:g,30:u,31:x,33:y,35:m,36:b,37:T,38:E,39:f,41:w,43:I,44:L,46:P,50:_,52:k,53:v,54:A,59:N,60:M,61:D,62:O,70:S},{16:[1,135]},{4:i,5:o,8:8,9:10,12:12,13:c,14:l,16:[2,46],17:15,18:d,21:h,22:40,23:p,24:19,25:20,26:21,27:22,28:23,29:g,30:u,31:x,33:y,35:m,36:b,37:T,38:E,39:f,41:w,43:I,44:L,46:P,49:[1,136],50:_,52:k,53:v,54:A,59:N,60:M,61:D,62:O,70:S},{16:[1,137]},{4:i,5:o,8:8,9:10,12:12,13:c,14:l,16:[2,44],17:15,18:d,21:h,22:40,23:p,24:19,25:20,26:21,27:22,28:23,29:g,30:u,31:x,33:y,35:m,36:b,37:T,38:E,39:f,41:w,43:I,44:L,46:P,48:[1,138],50:_,52:k,53:v,54:A,59:N,60:M,61:D,62:O,70:S},{16:[1,139]},{16:[1,140]},{4:i,5:o,8:8,9:10,12:12,13:c,14:l,16:[2,42],17:15,18:d,21:h,22:40,23:p,24:19,25:20,26:21,27:22,28:23,29:g,30:u,31:x,33:y,35:m,36:b,37:T,38:E,39:f,41:w,43:I,44:L,46:P,47:[1,141],50:_,52:k,53:v,54:A,59:N,60:M,61:D,62:O,70:S},{4:i,5:o,8:8,9:10,12:12,13:c,14:l,16:[1,142],17:15,18:d,21:h,22:40,23:p,24:19,25:20,26:21,27:22,28:23,29:g,30:u,31:x,33:y,35:m,36:b,37:T,38:E,39:f,41:w,43:I,44:L,46:P,50:_,52:k,53:v,54:A,59:N,60:M,61:D,62:O,70:S},{15:[1,143]},t(R,[2,49]),{15:[1,144]},t(R,[2,51]),t(R,[2,52]),{22:145,70:S},{22:146,70:S},{56:147,81:F},{56:148,81:F},{56:149,81:F},{64:[1,150],81:[2,62]},{5:[2,55]},{5:[2,79]},{5:[2,56]},{5:[2,57]},{5:[2,58]},t(R,[2,16]),t(Y,[2,10]),{12:151,50:_,52:k,53:v},t(Y,[2,12]),t(Y,[2,13]),t(R,[2,18]),t(R,[2,34]),t(R,[2,35]),t(R,[2,36]),t(R,[2,37]),{15:[1,152]},t(R,[2,38]),{15:[1,153]},t(R,[2,39]),t(R,[2,40]),{15:[1,154]},t(R,[2,41]),{5:[1,155]},{5:[1,156]},{56:157,81:F},{56:158,81:F},{5:[2,67]},{5:[2,53]},{5:[2,54]},{22:159,70:S},t(Y,[2,11]),t(C,r,{7:103,40:160}),t(B,r,{7:105,42:161}),t($,r,{7:108,45:162}),t(R,[2,48]),t(R,[2,50]),{5:[2,65]},{5:[2,66]},{81:[2,61]},{16:[2,47]},{16:[2,45]},{16:[2,43]}],defaultActions:{5:[2,1],6:[2,2],87:[2,63],88:[2,64],121:[2,55],122:[2,79],123:[2,56],124:[2,57],125:[2,58],147:[2,67],148:[2,53],149:[2,54],157:[2,65],158:[2,66],159:[2,61],160:[2,47],161:[2,45],162:[2,43]},parseError:(0,n.K2)((function(t,e){if(!e.recoverable){var a=new Error(t);throw a.hash=e,a}this.trace(t)}),"parseError"),parse:(0,n.K2)((function(t){var e=this,a=[0],s=[],r=[null],i=[],o=this.table,c="",l=0,d=0,h=0,p=i.slice.call(arguments,1),g=Object.create(this.lexer),u={yy:{}};for(var x in this.yy)Object.prototype.hasOwnProperty.call(this.yy,x)&&(u.yy[x]=this.yy[x]);g.setInput(t,u.yy),u.yy.lexer=g,u.yy.parser=this,"undefined"==typeof g.yylloc&&(g.yylloc={});var y=g.yylloc;i.push(y);var m=g.options&&g.options.ranges;function b(){var t;return"number"!==typeof(t=s.pop()||g.lex()||1)&&(t instanceof Array&&(t=(s=t).pop()),t=e.symbols_[t]||t),t}"function"===typeof u.yy.parseError?this.parseError=u.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError,(0,n.K2)((function(t){a.length=a.length-2*t,r.length=r.length-t,i.length=i.length-t}),"popStack"),(0,n.K2)(b,"lex");for(var T,E,f,w,I,L,P,_,k,v={};;){if(f=a[a.length-1],this.defaultActions[f]?w=this.defaultActions[f]:(null!==T&&"undefined"!=typeof T||(T=b()),w=o[f]&&o[f][T]),"undefined"===typeof w||!w.length||!w[0]){var A="";for(L in k=[],o[f])this.terminals_[L]&&L>2&&k.push("'"+this.terminals_[L]+"'");A=g.showPosition?"Parse error on line "+(l+1)+":\n"+g.showPosition()+"\nExpecting "+k.join(", ")+", got '"+(this.terminals_[T]||T)+"'":"Parse error on line "+(l+1)+": Unexpected "+(1==T?"end of input":"'"+(this.terminals_[T]||T)+"'"),this.parseError(A,{text:g.match,token:this.terminals_[T]||T,line:g.yylineno,loc:y,expected:k})}if(w[0]instanceof Array&&w.length>1)throw new Error("Parse Error: multiple actions possible at state: "+f+", token: "+T);switch(w[0]){case 1:a.push(T),r.push(g.yytext),i.push(g.yylloc),a.push(w[1]),T=null,E?(T=E,E=null):(d=g.yyleng,c=g.yytext,l=g.yylineno,y=g.yylloc,h>0&&h--);break;case 2:if(P=this.productions_[w[1]][1],v.$=r[r.length-P],v._$={first_line:i[i.length-(P||1)].first_line,last_line:i[i.length-1].last_line,first_column:i[i.length-(P||1)].first_column,last_column:i[i.length-1].last_column},m&&(v._$.range=[i[i.length-(P||1)].range[0],i[i.length-1].range[1]]),"undefined"!==typeof(I=this.performAction.apply(v,[c,d,l,u.yy,w[1],r,i].concat(p))))return I;P&&(a=a.slice(0,-1*P*2),r=r.slice(0,-1*P),i=i.slice(0,-1*P)),a.push(this.productions_[w[1]][0]),r.push(v.$),i.push(v._$),_=o[a[a.length-2]][a[a.length-1]],a.push(_);break;case 3:return!0}}return!0}),"parse")},q=function(){return{EOF:1,parseError:(0,n.K2)((function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)}),"parseError"),setInput:(0,n.K2)((function(t,e){return this.yy=e||this.yy||{},this._input=t,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:(0,n.K2)((function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t}),"input"),unput:(0,n.K2)((function(t){var e=t.length,a=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var s=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),a.length-1&&(this.yylineno-=a.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:a?(a.length===s.length?this.yylloc.first_column:0)+s[s.length-a.length].length-a[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this}),"unput"),more:(0,n.K2)((function(){return this._more=!0,this}),"more"),reject:(0,n.K2)((function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):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})}),"reject"),less:(0,n.K2)((function(t){this.unput(this.match.slice(t))}),"less"),pastInput:(0,n.K2)((function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")}),"pastInput"),upcomingInput:(0,n.K2)((function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")}),"upcomingInput"),showPosition:(0,n.K2)((function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"}),"showPosition"),test_match:(0,n.K2)((function(t,e){var a,s,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))),(s=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=s.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:s?s[s.length-1].length-s[s.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,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(t[0].length),this.matched+=t[0],a=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),a)return a;if(this._backtrack){for(var i in r)this[i]=r[i];return!1}return!1}),"test_match"),next:(0,n.K2)((function(){if(this.done)return this.EOF;var t,e,a,s;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),i=0;ie[0].length)){if(e=a,s=i,this.options.backtrack_lexer){if(!1!==(t=this.test_match(a,r[i])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,r[s]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})}),"next"),lex:(0,n.K2)((function(){var t=this.next();return t||this.lex()}),"lex"),begin:(0,n.K2)((function(t){this.conditionStack.push(t)}),"begin"),popState:(0,n.K2)((function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]}),"popState"),_currentRules:(0,n.K2)((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:(0,n.K2)((function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"}),"topState"),pushState:(0,n.K2)((function(t){this.begin(t)}),"pushState"),stateStackSize:(0,n.K2)((function(){return this.conditionStack.length}),"stateStackSize"),options:{"case-insensitive":!0},performAction:(0,n.K2)((function(t,e,a,s){switch(a){case 0:case 51:case 66:return 5;case 1:case 2:case 3:case 4:case 5:break;case 6:return 19;case 7:return this.begin("LINE"),14;case 8:return this.begin("ID"),50;case 9:return this.begin("ID"),52;case 10:return 13;case 11:return this.begin("ID"),53;case 12:return e.yytext=e.yytext.trim(),this.begin("ALIAS"),70;case 13:return this.popState(),this.popState(),this.begin("LINE"),51;case 14:return this.popState(),this.popState(),5;case 15:return this.begin("LINE"),36;case 16:return this.begin("LINE"),37;case 17:return this.begin("LINE"),38;case 18:return this.begin("LINE"),39;case 19:return this.begin("LINE"),49;case 20:return this.begin("LINE"),41;case 21:return this.begin("LINE"),43;case 22:return this.begin("LINE"),48;case 23:return this.begin("LINE"),44;case 24:return this.begin("LINE"),47;case 25:return this.begin("LINE"),46;case 26:return this.popState(),15;case 27:return 16;case 28:return 65;case 29:return 66;case 30:return 59;case 31:return 60;case 32:return 61;case 33:return 62;case 34:return 57;case 35:return 54;case 36:return this.begin("ID"),21;case 37:return this.begin("ID"),23;case 38:return 29;case 39:return 30;case 40:return this.begin("acc_title"),31;case 41:return this.popState(),"acc_title_value";case 42:return this.begin("acc_descr"),33;case 43:return this.popState(),"acc_descr_value";case 44:this.begin("acc_descr_multiline");break;case 45:this.popState();break;case 46:return"acc_descr_multiline_value";case 47:return 6;case 48:return 18;case 49:return 20;case 50:return 64;case 52:return e.yytext=e.yytext.trim(),70;case 53:return 73;case 54:return 74;case 55:return 75;case 56:return 76;case 57:return 71;case 58:return 72;case 59:return 77;case 60:return 78;case 61:return 79;case 62:return 80;case 63:return 81;case 64:return 68;case 65:return 69;case 67:return"INVALID"}}),"anonymous"),rules:[/^(?:[\n]+)/i,/^(?:\s+)/i,/^(?:((?!\n)\s)+)/i,/^(?:#[^\n]*)/i,/^(?:%(?!\{)[^\n]*)/i,/^(?:[^\}]%%[^\n]*)/i,/^(?:[0-9]+(?=[ \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],conditions:{acc_descr_multiline:{rules:[45,46],inclusive:!1},acc_descr:{rules:[43],inclusive:!1},acc_title:{rules:[41],inclusive:!1},ID:{rules:[2,3,12],inclusive:!1},ALIAS:{rules:[2,3,13,14],inclusive:!1},LINE:{rules:[2,3,26],inclusive:!1},INITIAL:{rules:[0,1,3,4,5,6,7,8,9,10,11,15,16,17,18,19,20,21,22,23,24,25,27,28,29,30,31,32,33,34,35,36,37,38,39,40,42,44,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67],inclusive:!0}}}}();function z(){this.yy={}}return W.lexer=q,(0,n.K2)(z,"Parser"),z.prototype=W,W.Parser=z,new z}();l.parser=l;var d=l,h={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},p={FILLED:0,OPEN:1},g={LEFTOF:0,RIGHTOF:1,OVER:2},u=class{constructor(){this.state=new r.m((()=>({prevActor:void 0,actors:new Map,createdActors:new Map,destroyedActors:new Map,boxes:[],messages:[],notes:[],sequenceNumbersEnabled:!1,wrapEnabled:void 0,currentBox:void 0,lastCreated:void 0,lastDestroyed:void 0}))),this.setAccTitle=n.SV,this.setAccDescription=n.EI,this.setDiagramTitle=n.ke,this.getAccTitle=n.iN,this.getAccDescription=n.m7,this.getDiagramTitle=n.ab,this.apply=this.apply.bind(this),this.parseBoxData=this.parseBoxData.bind(this),this.parseMessage=this.parseMessage.bind(this),this.clear(),this.setWrap((0,n.D7)().wrap),this.LINETYPE=h,this.ARROWTYPE=p,this.PLACEMENT=g}static#t=(()=>(0,n.K2)(this,"SequenceDB"))();addBox(t){this.state.records.boxes.push({name:t.text,wrap:t.wrap??this.autoWrap(),fill:t.color,actorKeys:[]}),this.state.records.currentBox=this.state.records.boxes.slice(-1)[0]}addActor(t,e,a,s){let r=this.state.records.currentBox;const i=this.state.records.actors.get(t);if(i){if(this.state.records.currentBox&&i.box&&this.state.records.currentBox!==i.box)throw new Error(`A same participant should only be defined in one Box: ${i.name} can't be in '${i.box.name}' and in '${this.state.records.currentBox.name}' at the same time.`);if(r=i.box?i.box:this.state.records.currentBox,i.box=r,i&&e===i.name&&null==a)return}if(null==a?.text&&(a={text:e,type:s}),null!=s&&null!=a.text||(a={text:e,type:s}),this.state.records.actors.set(t,{box:r,name:e,description:a.text,wrap:a.wrap??this.autoWrap(),prevActor:this.state.records.prevActor,links:{},properties:{},actorCnt:null,rectData:null,type:s??"participant"}),this.state.records.prevActor){const e=this.state.records.actors.get(this.state.records.prevActor);e&&(e.nextActor=t)}this.state.records.currentBox&&this.state.records.currentBox.actorKeys.push(t),this.state.records.prevActor=t}activationCount(t){let e,a=0;if(!t)return 0;for(e=0;e4&&void 0!==arguments[4]&&arguments[4];if(s===this.LINETYPE.ACTIVE_END){if(this.activationCount(t??"")<1){const e=new Error("Trying to inactivate an inactive participant ("+t+")");throw e.hash={text:"->>-",token:"->>-",line:"1",loc:{first_line:1,last_line:1,first_column:1,last_column:1},expected:["'ACTIVE_PARTICIPANT'"]},e}}return this.state.records.messages.push({id:this.state.records.messages.length.toString(),from:t,to:e,message:a?.text??"",wrap:a?.wrap??this.autoWrap(),type:s,activate:r}),!0}hasAtLeastOneBox(){return this.state.records.boxes.length>0}hasAtLeastOneBoxWithTitle(){return this.state.records.boxes.some((t=>t.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(t){return this.state.records.actors.get(t)}getActorKeys(){return[...this.state.records.actors.keys()]}enableSequenceNumbers(){this.state.records.sequenceNumbersEnabled=!0}disableSequenceNumbers(){this.state.records.sequenceNumbersEnabled=!1}showSequenceNumbers(){return this.state.records.sequenceNumbersEnabled}setWrap(t){this.state.records.wrapEnabled=t}extractWrap(t){if(void 0===t)return{};t=t.trim();const e=null!==/^:?wrap:/.exec(t)||null===/^:?nowrap:/.exec(t)&&void 0;return{cleanedText:(void 0===e?t:t.replace(/^:?(?:no)?wrap:/,"")).trim(),wrap:e}}autoWrap(){return void 0!==this.state.records.wrapEnabled?this.state.records.wrapEnabled:(0,n.D7)().sequence?.wrap??!1}clear(){this.state.reset(),(0,n.IU)()}parseMessage(t){const e=t.trim(),{wrap:a,cleanedText:s}=this.extractWrap(e),r={text:s,wrap:a};return n.Rm.debug(`parseMessage: ${JSON.stringify(r)}`),r}parseBoxData(t){const e=/^((?:rgba?|hsla?)\s*\(.*\)|\w*)(.*)$/.exec(t);let a=e?.[1]?e[1].trim():"transparent",s=e?.[2]?e[2].trim():void 0;if(window?.CSS)window.CSS.supports("color",a)||(a="transparent",s=t.trim());else{const e=(new Option).style;e.color=a,e.color!==a&&(a="transparent",s=t.trim())}const{wrap:r,cleanedText:i}=this.extractWrap(s);return{text:i?(0,n.jZ)(i,(0,n.D7)()):void 0,color:a,wrap:r}}addNote(t,e,a){const s={actor:t,placement:e,message:a.text,wrap:a.wrap??this.autoWrap()},r=[].concat(t,t);this.state.records.notes.push(s),this.state.records.messages.push({id:this.state.records.messages.length.toString(),from:r[0],to:r[1],message:a.text,wrap:a.wrap??this.autoWrap(),type:this.LINETYPE.NOTE,placement:e})}addLinks(t,e){const a=this.getActor(t);try{let t=(0,n.jZ)(e.text,(0,n.D7)());t=t.replace(/=/g,"="),t=t.replace(/&/g,"&");const s=JSON.parse(t);this.insertLinks(a,s)}catch(s){n.Rm.error("error while parsing actor link text",s)}}addALink(t,e){const a=this.getActor(t);try{const t={};let s=(0,n.jZ)(e.text,(0,n.D7)());const r=s.indexOf("@");s=s.replace(/=/g,"="),s=s.replace(/&/g,"&");const i=s.slice(0,r-1).trim(),o=s.slice(r+1).trim();t[i]=o,this.insertLinks(a,t)}catch(s){n.Rm.error("error while parsing actor link text",s)}}insertLinks(t,e){if(null==t.links)t.links=e;else for(const a in e)t.links[a]=e[a]}addProperties(t,e){const a=this.getActor(t);try{const t=(0,n.jZ)(e.text,(0,n.D7)()),s=JSON.parse(t);this.insertProperties(a,s)}catch(s){n.Rm.error("error while parsing actor properties text",s)}}insertProperties(t,e){if(null==t.properties)t.properties=e;else for(const a in e)t.properties[a]=e[a]}boxEnd(){this.state.records.currentBox=void 0}addDetails(t,e){const a=this.getActor(t),s=document.getElementById(e.text);try{const t=s.innerHTML,e=JSON.parse(t);e.properties&&this.insertProperties(a,e.properties),e.links&&this.insertLinks(a,e.links)}catch(r){n.Rm.error("error while parsing actor details text",r)}}getActorProperty(t,e){if(void 0!==t?.properties)return t.properties[e]}apply(t){if(Array.isArray(t))t.forEach((t=>{this.apply(t)}));else switch(t.type){case"sequenceIndex":this.state.records.messages.push({id:this.state.records.messages.length.toString(),from:void 0,to:void 0,message:{start:t.sequenceIndex,step:t.sequenceIndexStep,visible:t.sequenceVisible},wrap:!1,type:t.signalType});break;case"addParticipant":this.addActor(t.actor,t.actor,t.description,t.draw);break;case"createParticipant":if(this.state.records.actors.has(t.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=t.actor,this.addActor(t.actor,t.actor,t.description,t.draw),this.state.records.createdActors.set(t.actor,this.state.records.messages.length);break;case"destroyParticipant":this.state.records.lastDestroyed=t.actor,this.state.records.destroyedActors.set(t.actor,this.state.records.messages.length);break;case"activeStart":case"activeEnd":this.addSignal(t.actor,void 0,void 0,t.signalType);break;case"addNote":this.addNote(t.actor,t.placement,t.text);break;case"addLinks":this.addLinks(t.actor,t.text);break;case"addALink":this.addALink(t.actor,t.text);break;case"addProperties":this.addProperties(t.actor,t.text);break;case"addDetails":this.addDetails(t.actor,t.text);break;case"addMessage":if(this.state.records.lastCreated){if(t.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.");this.state.records.lastCreated=void 0}else if(this.state.records.lastDestroyed){if(t.to!==this.state.records.lastDestroyed&&t.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.");this.state.records.lastDestroyed=void 0}this.addSignal(t.from,t.to,t.msg,t.signalType,t.activate);break;case"boxStart":this.addBox(t.boxData);break;case"boxEnd":this.boxEnd();break;case"loopStart":this.addSignal(void 0,void 0,t.loopText,t.signalType);break;case"loopEnd":case"rectEnd":case"optEnd":case"altEnd":case"parEnd":case"criticalEnd":case"breakEnd":this.addSignal(void 0,void 0,void 0,t.signalType);break;case"rectStart":this.addSignal(void 0,void 0,t.color,t.signalType);break;case"optStart":this.addSignal(void 0,void 0,t.optText,t.signalType);break;case"altStart":case"else":this.addSignal(void 0,void 0,t.altText,t.signalType);break;case"setAccTitle":(0,n.SV)(t.text);break;case"parStart":case"and":this.addSignal(void 0,void 0,t.parText,t.signalType);break;case"criticalStart":this.addSignal(void 0,void 0,t.criticalText,t.signalType);break;case"option":this.addSignal(void 0,void 0,t.optionText,t.signalType);break;case"breakStart":this.addSignal(void 0,void 0,t.breakText,t.signalType)}}getConfig(){return(0,n.D7)().sequence}},x=(0,n.K2)((t=>`.actor {\n stroke: ${t.actorBorder};\n fill: ${t.actorBkg};\n }\n\n text.actor > tspan {\n fill: ${t.actorTextColor};\n stroke: none;\n }\n\n .actor-line {\n stroke: ${t.actorLineColor};\n }\n\n .messageLine0 {\n stroke-width: 1.5;\n stroke-dasharray: none;\n stroke: ${t.signalColor};\n }\n\n .messageLine1 {\n stroke-width: 1.5;\n stroke-dasharray: 2, 2;\n stroke: ${t.signalColor};\n }\n\n #arrowhead path {\n fill: ${t.signalColor};\n stroke: ${t.signalColor};\n }\n\n .sequenceNumber {\n fill: ${t.sequenceNumberColor};\n }\n\n #sequencenumber {\n fill: ${t.signalColor};\n }\n\n #crosshead path {\n fill: ${t.signalColor};\n stroke: ${t.signalColor};\n }\n\n .messageText {\n fill: ${t.signalTextColor};\n stroke: none;\n }\n\n .labelBox {\n stroke: ${t.labelBoxBorderColor};\n fill: ${t.labelBoxBkgColor};\n }\n\n .labelText, .labelText > tspan {\n fill: ${t.labelTextColor};\n stroke: none;\n }\n\n .loopText, .loopText > tspan {\n fill: ${t.loopTextColor};\n stroke: none;\n }\n\n .loopLine {\n stroke-width: 2px;\n stroke-dasharray: 2, 2;\n stroke: ${t.labelBoxBorderColor};\n fill: ${t.labelBoxBorderColor};\n }\n\n .note {\n //stroke: #decc93;\n stroke: ${t.noteBorderColor};\n fill: ${t.noteBkgColor};\n }\n\n .noteText, .noteText > tspan {\n fill: ${t.noteTextColor};\n stroke: none;\n }\n\n .activation0 {\n fill: ${t.activationBkgColor};\n stroke: ${t.activationBorderColor};\n }\n\n .activation1 {\n fill: ${t.activationBkgColor};\n stroke: ${t.activationBorderColor};\n }\n\n .activation2 {\n fill: ${t.activationBkgColor};\n stroke: ${t.activationBorderColor};\n }\n\n .actorPopupMenu {\n position: absolute;\n }\n\n .actorPopupMenuPanel {\n position: absolute;\n fill: ${t.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: ${t.actorBorder};\n fill: ${t.actorBkg};\n }\n .actor-man circle, line {\n stroke: ${t.actorBorder};\n fill: ${t.actorBkg};\n stroke-width: 2px;\n }\n`),"getStyles"),y="actor-top",m="actor-bottom",b="actor-man",T=(0,n.K2)((function(t,e){return(0,s.tk)(t,e)}),"drawRect"),E=(0,n.K2)((function(t,e,a,s,r){if(void 0===e.links||null===e.links||0===Object.keys(e.links).length)return{height:0,width:0};const i=e.links,n=e.actorCnt,o=e.rectData;var l="none";r&&(l="block !important");const d=t.append("g");d.attr("id","actor"+n+"_popup"),d.attr("class","actorPopupMenu"),d.attr("display",l);var h="";void 0!==o.class&&(h=" "+o.class);let p=o.width>a?o.width:a;const g=d.append("rect");if(g.attr("class","actorPopupMenuPanel"+h),g.attr("x",o.x),g.attr("y",o.height),g.attr("fill",o.fill),g.attr("stroke",o.stroke),g.attr("width",p),g.attr("height",o.height),g.attr("rx",o.rx),g.attr("ry",o.ry),null!=i){var u=20;for(let t in i){var x=d.append("a"),y=(0,c.J)(i[t]);x.attr("xlink:href",y),x.attr("target","_blank"),z(s)(t,x,o.x+10,o.height+u,p,20,{class:"actor"},s),u+=30}}return g.attr("height",u),{height:o.height+u,width:p}}),"drawPopup"),f=(0,n.K2)((function(t){return"var pu = document.getElementById('"+t+"'); if (pu != null) { pu.style.display = pu.style.display == 'block' ? 'none' : 'block'; }"}),"popupMenuToggle"),w=(0,n.K2)((async function(t,e){let a=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,s=t.append("foreignObject");const r=await(0,n.VJ)(e.text,(0,n.zj)()),i=s.append("xhtml:div").attr("style","width: fit-content;").attr("xmlns","http://www.w3.org/1999/xhtml").html(r).node().getBoundingClientRect();if(s.attr("height",Math.round(i.height)).attr("width",Math.round(i.width)),"noteText"===e.class){const a=t.node().firstChild;a.setAttribute("height",i.height+2*e.textMargin);const r=a.getBBox();s.attr("x",Math.round(r.x+r.width/2-i.width/2)).attr("y",Math.round(r.y+r.height/2-i.height/2))}else if(a){let{startx:t,stopx:r,starty:n}=a;if(t>r){const e=t;t=r,r=e}s.attr("x",Math.round(t+Math.abs(t-r)/2-i.width/2)),"loopText"===e.class?s.attr("y",Math.round(n)):s.attr("y",Math.round(n-i.height))}return[s]}),"drawKatex"),I=(0,n.K2)((function(t,e){let a=0,s=0;const r=e.text.split(n.Y2.lineBreakRegex),[o,c]=(0,i.I5)(e.fontSize);let l=[],d=0,h=(0,n.K2)((()=>e.y),"yfunc");if(void 0!==e.valign&&void 0!==e.textMargin&&e.textMargin>0)switch(e.valign){case"top":case"start":h=(0,n.K2)((()=>Math.round(e.y+e.textMargin)),"yfunc");break;case"middle":case"center":h=(0,n.K2)((()=>Math.round(e.y+(a+s+e.textMargin)/2)),"yfunc");break;case"bottom":case"end":h=(0,n.K2)((()=>Math.round(e.y+(a+s+2*e.textMargin)-e.textMargin)),"yfunc")}if(void 0!==e.anchor&&void 0!==e.textMargin&&void 0!==e.width)switch(e.anchor){case"left":case"start":e.x=Math.round(e.x+e.textMargin),e.anchor="start",e.dominantBaseline="middle",e.alignmentBaseline="middle";break;case"middle":case"center":e.x=Math.round(e.x+e.width/2),e.anchor="middle",e.dominantBaseline="middle",e.alignmentBaseline="middle";break;case"right":case"end":e.x=Math.round(e.x+e.width-e.textMargin),e.anchor="end",e.dominantBaseline="middle",e.alignmentBaseline="middle"}for(let[n,p]of r.entries()){void 0!==e.textMargin&&0===e.textMargin&&void 0!==o&&(d=n*o);const r=t.append("text");r.attr("x",e.x),r.attr("y",h()),void 0!==e.anchor&&r.attr("text-anchor",e.anchor).attr("dominant-baseline",e.dominantBaseline).attr("alignment-baseline",e.alignmentBaseline),void 0!==e.fontFamily&&r.style("font-family",e.fontFamily),void 0!==c&&r.style("font-size",c),void 0!==e.fontWeight&&r.style("font-weight",e.fontWeight),void 0!==e.fill&&r.attr("fill",e.fill),void 0!==e.class&&r.attr("class",e.class),void 0!==e.dy?r.attr("dy",e.dy):0!==d&&r.attr("dy",d);const g=p||i.pe;if(e.tspan){const t=r.append("tspan");t.attr("x",e.x),void 0!==e.fill&&t.attr("fill",e.fill),t.text(g)}else r.text(g);void 0!==e.valign&&void 0!==e.textMargin&&e.textMargin>0&&(s+=(r._groups||r)[0][0].getBBox().height,a=s),l.push(r)}return l}),"drawText"),L=(0,n.K2)((function(t,e){function a(t,e,a,s,r){return t+","+e+" "+(t+a)+","+e+" "+(t+a)+","+(e+s-r)+" "+(t+a-1.2*r)+","+(e+s)+" "+t+","+(e+s)}(0,n.K2)(a,"genPoints");const s=t.append("polygon");return s.attr("points",a(e.x,e.y,e.width,e.height,7)),s.attr("class","labelBox"),e.y=e.y+e.height/2,I(t,e),s}),"drawLabel"),P=-1,_=(0,n.K2)(((t,e,a,s)=>{t.select&&a.forEach((a=>{const r=e.get(a),i=t.select("#actor"+r.actorCnt);!s.mirrorActors&&r.stopy?i.attr("y2",r.stopy+r.height/2):s.mirrorActors&&i.attr("y2",r.stopy)}))}),"fixLifeLineHeights"),k=(0,n.K2)((function(t,e,a,r){const i=r?e.stopy:e.starty,o=e.x+e.width/2,c=i+e.height,l=t.append("g").lower();var d=l;r||(P++,Object.keys(e.links||{}).length&&!a.forceMenus&&d.attr("onclick",f(`actor${P}_popup`)).attr("cursor","pointer"),d.append("line").attr("id","actor"+P).attr("x1",o).attr("y1",c).attr("x2",o).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",e.name),d=l.append("g"),e.actorCnt=P,null!=e.links&&d.attr("id","root-"+P));const h=(0,s.PB)();var p="actor";e.properties?.class?p=e.properties.class:h.fill="#eaeaea",p+=r?` ${m}`:` ${y}`,h.x=e.x,h.y=i,h.width=e.width,h.height=e.height,h.class=p,h.rx=3,h.ry=3,h.name=e.name;const g=T(d,h);if(e.rectData=h,e.properties?.icon){const t=e.properties.icon.trim();"@"===t.charAt(0)?(0,s.CP)(d,h.x+h.width-20,h.y+10,t.substr(1)):(0,s.aC)(d,h.x+h.width-20,h.y+10,t)}q(a,(0,n.Wi)(e.description))(e.description,d,h.x,h.y,h.width,h.height,{class:"actor actor-box"},a);let u=e.height;if(g.node){const t=g.node().getBBox();e.height=t.height,u=t.height}return u}),"drawActorTypeParticipant"),v=(0,n.K2)((function(t,e,a,r){const i=r?e.stopy:e.starty,o=e.x+e.width/2,c=i+80,l=t.append("g").lower();r||(P++,l.append("line").attr("id","actor"+P).attr("x1",o).attr("y1",c).attr("x2",o).attr("y2",2e3).attr("class","actor-line 200").attr("stroke-width","0.5px").attr("stroke","#999").attr("name",e.name),e.actorCnt=P);const d=t.append("g");let h=b;h+=r?` ${m}`:` ${y}`,d.attr("class",h),d.attr("name",e.name);const p=(0,s.PB)();p.x=e.x,p.y=i,p.fill="#eaeaea",p.width=e.width,p.height=e.height,p.class="actor",p.rx=3,p.ry=3,d.append("line").attr("id","actor-man-torso"+P).attr("x1",o).attr("y1",i+25).attr("x2",o).attr("y2",i+45),d.append("line").attr("id","actor-man-arms"+P).attr("x1",o-18).attr("y1",i+33).attr("x2",o+18).attr("y2",i+33),d.append("line").attr("x1",o-18).attr("y1",i+60).attr("x2",o).attr("y2",i+45),d.append("line").attr("x1",o).attr("y1",i+45).attr("x2",o+18-2).attr("y2",i+60);const g=d.append("circle");g.attr("cx",e.x+e.width/2),g.attr("cy",i+10),g.attr("r",15),g.attr("width",e.width),g.attr("height",e.height);const u=d.node().getBBox();return e.height=u.height,q(a,(0,n.Wi)(e.description))(e.description,d,p.x,p.y+35,p.width,p.height,{class:`actor ${b}`},a),e.height}),"drawActorTypeActor"),A=(0,n.K2)((async function(t,e,a,s){switch(e.type){case"actor":return await v(t,e,a,s);case"participant":return await k(t,e,a,s)}}),"drawActor"),N=(0,n.K2)((function(t,e,a){const s=t.append("g");S(s,e),e.name&&q(a)(e.name,s,e.x,e.y+(e.textMaxHeight||0)/2,e.width,0,{class:"text"},a),s.lower()}),"drawBox"),M=(0,n.K2)((function(t){return t.append("g")}),"anchorElement"),D=(0,n.K2)((function(t,e,a,r,i){const n=(0,s.PB)(),o=e.anchored;n.x=e.startx,n.y=e.starty,n.class="activation"+i%3,n.width=e.stopx-e.startx,n.height=a-e.starty,T(o,n)}),"drawActivation"),O=(0,n.K2)((async function(t,e,a,r){const{boxMargin:i,boxTextMargin:o,labelBoxHeight:c,labelBoxWidth:l,messageFontFamily:d,messageFontSize:h,messageFontWeight:p}=r,g=t.append("g"),u=(0,n.K2)((function(t,e,a,s){return g.append("line").attr("x1",t).attr("y1",e).attr("x2",a).attr("y2",s).attr("class","loopLine")}),"drawLoopLine");u(e.startx,e.starty,e.stopx,e.starty),u(e.stopx,e.starty,e.stopx,e.stopy),u(e.startx,e.stopy,e.stopx,e.stopy),u(e.startx,e.starty,e.startx,e.stopy),void 0!==e.sections&&e.sections.forEach((function(t){u(e.startx,t.y,e.stopx,t.y).style("stroke-dasharray","3, 3")}));let x=(0,s.HT)();x.text=a,x.x=e.startx,x.y=e.starty,x.fontFamily=d,x.fontSize=h,x.fontWeight=p,x.anchor="middle",x.valign="middle",x.tspan=!1,x.width=l||50,x.height=c||20,x.textMargin=o,x.class="labelText",L(g,x),x=F(),x.text=e.title,x.x=e.startx+l/2+(e.stopx-e.startx)/2,x.y=e.starty+i+o,x.anchor="middle",x.valign="middle",x.textMargin=o,x.class="loopText",x.fontFamily=d,x.fontSize=h,x.fontWeight=p,x.wrap=!0;let y=(0,n.Wi)(x.text)?await w(g,x,e):I(g,x);if(void 0!==e.sectionTitles)for(const[s,m]of Object.entries(e.sectionTitles))if(m.message){x.text=m.message,x.x=e.startx+(e.stopx-e.startx)/2,x.y=e.sections[s].y+i+o,x.class="loopText",x.anchor="middle",x.valign="middle",x.tspan=!1,x.fontFamily=d,x.fontSize=h,x.fontWeight=p,x.wrap=e.wrap,(0,n.Wi)(x.text)?(e.starty=e.sections[s].y,await w(g,x,e)):I(g,x);let t=Math.round(y.map((t=>(t._groups||t)[0][0].getBBox().height)).reduce(((t,e)=>t+e)));e.sections[s].height+=t-(i+o)}return e.height=Math.round(e.stopy-e.starty),g}),"drawLoop"),S=(0,n.K2)((function(t,e){(0,s.lC)(t,e)}),"drawBackgroundRect"),R=(0,n.K2)((function(t){t.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"),Y=(0,n.K2)((function(t){t.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"),K=(0,n.K2)((function(t){t.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"),C=(0,n.K2)((function(t){t.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"),B=(0,n.K2)((function(t){t.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"),$=(0,n.K2)((function(t){t.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"),V=(0,n.K2)((function(t){t.append("defs").append("marker").attr("id","crosshead").attr("markerWidth",15).attr("markerHeight",8).attr("orient","auto").attr("refX",4).attr("refY",4.5).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"),F=(0,n.K2)((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:!0,valign:void 0}}),"getTextObj"),W=(0,n.K2)((function(){return{x:0,y:0,fill:"#EDF2AE",stroke:"#666",width:100,anchor:"start",height:100,rx:0,ry:0}}),"getNoteRect"),q=function(){function t(t,e,a,s,i,n,o){r(e.append("text").attr("x",a+i/2).attr("y",s+n/2+5).style("text-anchor","middle").text(t),o)}function e(t,e,a,s,o,c,l,d){const{actorFontSize:h,actorFontFamily:p,actorFontWeight:g}=d,[u,x]=(0,i.I5)(h),y=t.split(n.Y2.lineBreakRegex);for(let i=0;i1&&void 0!==arguments[1]&&arguments[1]?s:"fo"===r.textPlacement?a:"old"===r.textPlacement?t:e}}(),z=function(){function t(t,e,a,r,i,n,o){s(e.append("text").attr("x",a).attr("y",r).style("text-anchor","start").text(t),o)}function e(t,e,a,r,i,o,c,l){const{actorFontSize:d,actorFontFamily:h,actorFontWeight:p}=l,g=t.split(n.Y2.lineBreakRegex);for(let n=0;nt.height||0)))+(0===this.loops.length?0:this.loops.map((t=>t.height||0)).reduce(((t,e)=>t+e)))+(0===this.messages.length?0:this.messages.map((t=>t.height||0)).reduce(((t,e)=>t+e)))+(0===this.notes.length?0:this.notes.map((t=>t.height||0)).reduce(((t,e)=>t+e)))}),"getHeight"),clear:(0,n.K2)((function(){this.actors=[],this.boxes=[],this.loops=[],this.messages=[],this.notes=[]}),"clear"),addBox:(0,n.K2)((function(t){this.boxes.push(t)}),"addBox"),addActor:(0,n.K2)((function(t){this.actors.push(t)}),"addActor"),addLoop:(0,n.K2)((function(t){this.loops.push(t)}),"addLoop"),addMessage:(0,n.K2)((function(t){this.messages.push(t)}),"addMessage"),addNote:(0,n.K2)((function(t){this.notes.push(t)}),"addNote"),lastActor:(0,n.K2)((function(){return this.actors[this.actors.length-1]}),"lastActor"),lastLoop:(0,n.K2)((function(){return this.loops[this.loops.length-1]}),"lastLoop"),lastMessage:(0,n.K2)((function(){return this.messages[this.messages.length-1]}),"lastMessage"),lastNote:(0,n.K2)((function(){return this.notes[this.notes.length-1]}),"lastNote"),actors:[],boxes:[],loops:[],messages:[],notes:[]},init:(0,n.K2)((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,rt((0,n.D7)())}),"init"),updateVal:(0,n.K2)((function(t,e,a,s){void 0===t[e]?t[e]=a:t[e]=s(a,t[e])}),"updateVal"),updateBounds:(0,n.K2)((function(t,e,a,s){const r=this;let i=0;function o(o){return(0,n.K2)((function(n){i++;const c=r.sequenceItems.length-i+1;r.updateVal(n,"starty",e-c*j.boxMargin,Math.min),r.updateVal(n,"stopy",s+c*j.boxMargin,Math.max),r.updateVal(U.data,"startx",t-c*j.boxMargin,Math.min),r.updateVal(U.data,"stopx",a+c*j.boxMargin,Math.max),"activation"!==o&&(r.updateVal(n,"startx",t-c*j.boxMargin,Math.min),r.updateVal(n,"stopx",a+c*j.boxMargin,Math.max),r.updateVal(U.data,"starty",e-c*j.boxMargin,Math.min),r.updateVal(U.data,"stopy",s+c*j.boxMargin,Math.max))}),"updateItemBounds")}(0,n.K2)(o,"updateFn"),this.sequenceItems.forEach(o()),this.activations.forEach(o("activation"))}),"updateBounds"),insert:(0,n.K2)((function(t,e,a,s){const r=n.Y2.getMin(t,a),i=n.Y2.getMax(t,a),o=n.Y2.getMin(e,s),c=n.Y2.getMax(e,s);this.updateVal(U.data,"startx",r,Math.min),this.updateVal(U.data,"starty",o,Math.min),this.updateVal(U.data,"stopx",i,Math.max),this.updateVal(U.data,"stopy",c,Math.max),this.updateBounds(r,o,i,c)}),"insert"),newActivation:(0,n.K2)((function(t,e,a){const s=a.get(t.from),r=it(t.from).length||0,i=s.x+s.width/2+(r-1)*j.activationWidth/2;this.activations.push({startx:i,starty:this.verticalPos+2,stopx:i+j.activationWidth,stopy:void 0,actor:t.from,anchored:H.anchorElement(e)})}),"newActivation"),endActivation:(0,n.K2)((function(t){const e=this.activations.map((function(t){return t.actor})).lastIndexOf(t.from);return this.activations.splice(e,1)[0]}),"endActivation"),createLoop:(0,n.K2)((function(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{message:void 0,wrap:!1,width:void 0},e=arguments.length>1?arguments[1]:void 0;return{startx:void 0,starty:this.verticalPos,stopx:void 0,stopy:void 0,title:t.message,wrap:t.wrap,width:t.width,height:0,fill:e}}),"createLoop"),newLoop:(0,n.K2)((function(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{message:void 0,wrap:!1,width:void 0},e=arguments.length>1?arguments[1]:void 0;this.sequenceItems.push(this.createLoop(t,e))}),"newLoop"),endLoop:(0,n.K2)((function(){return this.sequenceItems.pop()}),"endLoop"),isLoopOverlap:(0,n.K2)((function(){return!!this.sequenceItems.length&&this.sequenceItems[this.sequenceItems.length-1].overlap}),"isLoopOverlap"),addSectionToLoop:(0,n.K2)((function(t){const e=this.sequenceItems.pop();e.sections=e.sections||[],e.sectionTitles=e.sectionTitles||[],e.sections.push({y:U.getVerticalPos(),height:0}),e.sectionTitles.push(t),this.sequenceItems.push(e)}),"addSectionToLoop"),saveVerticalPos:(0,n.K2)((function(){this.isLoopOverlap()&&(this.savedVerticalPos=this.verticalPos)}),"saveVerticalPos"),resetVerticalPos:(0,n.K2)((function(){this.isLoopOverlap()&&(this.verticalPos=this.savedVerticalPos)}),"resetVerticalPos"),bumpVerticalPos:(0,n.K2)((function(t){this.verticalPos=this.verticalPos+t,this.data.stopy=n.Y2.getMax(this.data.stopy,this.verticalPos)}),"bumpVerticalPos"),getVerticalPos:(0,n.K2)((function(){return this.verticalPos}),"getVerticalPos"),getBounds:(0,n.K2)((function(){return{bounds:this.data,models:this.models}}),"getBounds")},X=(0,n.K2)((async function(t,e){U.bumpVerticalPos(j.boxMargin),e.height=j.boxMargin,e.starty=U.getVerticalPos();const a=(0,s.PB)();a.x=e.startx,a.y=e.starty,a.width=e.width||j.width,a.class="note";const r=t.append("g"),i=H.drawRect(r,a),o=(0,s.HT)();o.x=e.startx,o.y=e.starty,o.width=a.width,o.dy="1em",o.text=e.message,o.class="noteText",o.fontFamily=j.noteFontFamily,o.fontSize=j.noteFontSize,o.fontWeight=j.noteFontWeight,o.anchor=j.noteAlign,o.textMargin=j.noteMargin,o.valign="center";const c=(0,n.Wi)(o.text)?await w(r,o):I(r,o),l=Math.round(c.map((t=>(t._groups||t)[0][0].getBBox().height)).reduce(((t,e)=>t+e)));i.attr("height",l+2*j.noteMargin),e.height+=l+2*j.noteMargin,U.bumpVerticalPos(l+2*j.noteMargin),e.stopy=e.starty+l+2*j.noteMargin,e.stopx=e.startx+a.width,U.insert(e.startx,e.starty,e.stopx,e.stopy),U.models.addNote(e)}),"drawNote"),J=(0,n.K2)((t=>({fontFamily:t.messageFontFamily,fontSize:t.messageFontSize,fontWeight:t.messageFontWeight})),"messageFont"),G=(0,n.K2)((t=>({fontFamily:t.noteFontFamily,fontSize:t.noteFontSize,fontWeight:t.noteFontWeight})),"noteFont"),Z=(0,n.K2)((t=>({fontFamily:t.actorFontFamily,fontSize:t.actorFontSize,fontWeight:t.actorFontWeight})),"actorFont");async function Q(t,e){U.bumpVerticalPos(10);const{startx:a,stopx:s,message:r}=e,o=n.Y2.splitBreaks(r).length,c=(0,n.Wi)(r),l=c?await(0,n.Dl)(r,(0,n.D7)()):i._K.calculateTextDimensions(r,J(j));if(!c){const t=l.height/o;e.height+=t,U.bumpVerticalPos(t)}let d,h=l.height-10;const p=l.width;if(a===s){d=U.getVerticalPos()+h,j.rightAngles||(h+=j.boxMargin,d=U.getVerticalPos()+h),h+=30;const t=n.Y2.getMax(p/2,j.width/2);U.insert(a-t,U.getVerticalPos()-10+h,s+t,U.getVerticalPos()+30+h)}else h+=j.boxMargin,d=U.getVerticalPos()+h,U.insert(a,d-10,s,d);return U.bumpVerticalPos(h),e.height+=h,e.stopy=e.starty+e.height,U.insert(e.fromBounds,e.starty,e.toBounds,e.stopy),d}(0,n.K2)(Q,"boundMessage");var tt=(0,n.K2)((async function(t,e,a,r){const{startx:o,stopx:c,starty:l,message:d,type:h,sequenceIndex:p,sequenceVisible:g}=e,u=i._K.calculateTextDimensions(d,J(j)),x=(0,s.HT)();x.x=o,x.y=l+10,x.width=c-o,x.class="messageText",x.dy="1em",x.text=d,x.fontFamily=j.messageFontFamily,x.fontSize=j.messageFontSize,x.fontWeight=j.messageFontWeight,x.anchor=j.messageAlign,x.valign="center",x.textMargin=j.wrapPadding,x.tspan=!1,(0,n.Wi)(x.text)?await w(t,x,{startx:o,stopx:c,starty:a}):I(t,x);const y=u.width;let m;o===c?m=j.rightAngles?t.append("path").attr("d",`M ${o},${a} H ${o+n.Y2.getMax(j.width/2,y/2)} V ${a+25} H ${o}`):t.append("path").attr("d","M "+o+","+a+" C "+(o+60)+","+(a-10)+" "+(o+60)+","+(a+30)+" "+o+","+(a+20)):(m=t.append("line"),m.attr("x1",o),m.attr("y1",a),m.attr("x2",c),m.attr("y2",a)),h===r.db.LINETYPE.DOTTED||h===r.db.LINETYPE.DOTTED_CROSS||h===r.db.LINETYPE.DOTTED_POINT||h===r.db.LINETYPE.DOTTED_OPEN||h===r.db.LINETYPE.BIDIRECTIONAL_DOTTED?(m.style("stroke-dasharray","3, 3"),m.attr("class","messageLine1")):m.attr("class","messageLine0");let b="";j.arrowMarkerAbsolute&&(b=window.location.protocol+"//"+window.location.host+window.location.pathname+window.location.search,b=b.replace(/\(/g,"\\("),b=b.replace(/\)/g,"\\)")),m.attr("stroke-width",2),m.attr("stroke","none"),m.style("fill","none"),h!==r.db.LINETYPE.SOLID&&h!==r.db.LINETYPE.DOTTED||m.attr("marker-end","url("+b+"#arrowhead)"),h!==r.db.LINETYPE.BIDIRECTIONAL_SOLID&&h!==r.db.LINETYPE.BIDIRECTIONAL_DOTTED||(m.attr("marker-start","url("+b+"#arrowhead)"),m.attr("marker-end","url("+b+"#arrowhead)")),h!==r.db.LINETYPE.SOLID_POINT&&h!==r.db.LINETYPE.DOTTED_POINT||m.attr("marker-end","url("+b+"#filled-head)"),h!==r.db.LINETYPE.SOLID_CROSS&&h!==r.db.LINETYPE.DOTTED_CROSS||m.attr("marker-end","url("+b+"#crosshead)"),(g||j.showSequenceNumbers)&&(m.attr("marker-start","url("+b+"#sequencenumber)"),t.append("text").attr("x",o).attr("y",a+4).attr("font-family","sans-serif").attr("font-size","12px").attr("text-anchor","middle").attr("class","sequenceNumber").text(p))}),"drawMessage"),et=(0,n.K2)((function(t,e,a,s,r,i,o){let c,l=0,d=0,h=0;for(const p of s){const t=e.get(p),s=t.box;c&&c!=s&&(o||U.models.addBox(c),d+=j.boxMargin+c.margin),s&&s!=c&&(o||(s.x=l+d,s.y=r),d+=s.margin),t.width=t.width||j.width,t.height=n.Y2.getMax(t.height||j.height,j.height),t.margin=t.margin||j.actorMargin,h=n.Y2.getMax(h,t.height),a.get(t.name)&&(d+=t.width/2),t.x=l+d,t.starty=U.getVerticalPos(),U.insert(t.x,r,t.x+t.width,t.height),l+=t.width+d,t.box&&(t.box.width=l+s.margin-t.box.x),d=t.margin,c=t.box,U.models.addActor(t)}c&&!o&&U.models.addBox(c),U.bumpVerticalPos(h)}),"addActorRenderingData"),at=(0,n.K2)((async function(t,e,a,s){if(s){let s=0;U.bumpVerticalPos(2*j.boxMargin);for(const r of a){const a=e.get(r);a.stopy||(a.stopy=U.getVerticalPos());const i=await H.drawActor(t,a,j,!0);s=n.Y2.getMax(s,i)}U.bumpVerticalPos(s+j.boxMargin)}else for(const r of a){const a=e.get(r);await H.drawActor(t,a,j,!1)}}),"drawActors"),st=(0,n.K2)((function(t,e,a,s){let r=0,i=0;for(const n of a){const a=e.get(n),o=ht(a),c=H.drawPopup(t,a,o,j,j.forceMenus,s);c.height>r&&(r=c.height),c.width+a.x>i&&(i=c.width+a.x)}return{maxHeight:r,maxWidth:i}}),"drawActorsPopup"),rt=(0,n.K2)((function(t){(0,n.hH)(j,t),t.fontFamily&&(j.actorFontFamily=j.noteFontFamily=j.messageFontFamily=t.fontFamily),t.fontSize&&(j.actorFontSize=j.noteFontSize=j.messageFontSize=t.fontSize),t.fontWeight&&(j.actorFontWeight=j.noteFontWeight=j.messageFontWeight=t.fontWeight)}),"setConf"),it=(0,n.K2)((function(t){return U.activations.filter((function(e){return e.actor===t}))}),"actorActivations"),nt=(0,n.K2)((function(t,e){const a=e.get(t),s=it(t);return[s.reduce((function(t,e){return n.Y2.getMin(t,e.startx)}),a.x+a.width/2-1),s.reduce((function(t,e){return n.Y2.getMax(t,e.stopx)}),a.x+a.width/2+1)]}),"activationBounds");function ot(t,e,a,s,r){U.bumpVerticalPos(a);let o=s;if(e.id&&e.message&&t[e.id]){const a=t[e.id].width,r=J(j);e.message=i._K.wrapLabel(`[${e.message}]`,a-2*j.wrapPadding,r),e.width=a,e.wrap=!0;const c=i._K.calculateTextDimensions(e.message,r),l=n.Y2.getMax(c.height,j.labelBoxHeight);o=s+l,n.Rm.debug(`${l} - ${e.message}`)}r(e),U.bumpVerticalPos(o)}function ct(t,e,a,s,r,i,o){function c(a,s){a.x{t.add(e.from),t.add(e.to)})),y=y.filter((e=>t.has(e)))}et(h,p,g,y,0,m,!1);const w=await xt(m,p,f,s);function I(t,e){const a=U.endActivation(t);a.starty+18>e&&(a.starty=e-6,e+=12),H.drawActivation(h,a,e,j,it(t.from).length),U.insert(a.startx,e-10,a.stopx,e)}H.insertArrowHead(h),H.insertArrowCrossHead(h),H.insertArrowFilledHead(h),H.insertSequenceNumber(h),(0,n.K2)(I,"activeEnd");let L=1,P=1;const k=[],v=[];let A=0;for(const o of m){let t,e,a;switch(o.type){case s.db.LINETYPE.NOTE:U.resetVerticalPos(),e=o.noteModel,await X(h,e);break;case s.db.LINETYPE.ACTIVE_START:U.newActivation(o,h,p);break;case s.db.LINETYPE.ACTIVE_END:I(o,U.getVerticalPos());break;case s.db.LINETYPE.LOOP_START:ot(w,o,j.boxMargin,j.boxMargin+j.boxTextMargin,(t=>U.newLoop(t)));break;case s.db.LINETYPE.LOOP_END:t=U.endLoop(),await H.drawLoop(h,t,"loop",j),U.bumpVerticalPos(t.stopy-U.getVerticalPos()),U.models.addLoop(t);break;case s.db.LINETYPE.RECT_START:ot(w,o,j.boxMargin,j.boxMargin,(t=>U.newLoop(void 0,t.message)));break;case s.db.LINETYPE.RECT_END:t=U.endLoop(),v.push(t),U.models.addLoop(t),U.bumpVerticalPos(t.stopy-U.getVerticalPos());break;case s.db.LINETYPE.OPT_START:ot(w,o,j.boxMargin,j.boxMargin+j.boxTextMargin,(t=>U.newLoop(t)));break;case s.db.LINETYPE.OPT_END:t=U.endLoop(),await H.drawLoop(h,t,"opt",j),U.bumpVerticalPos(t.stopy-U.getVerticalPos()),U.models.addLoop(t);break;case s.db.LINETYPE.ALT_START:ot(w,o,j.boxMargin,j.boxMargin+j.boxTextMargin,(t=>U.newLoop(t)));break;case s.db.LINETYPE.ALT_ELSE:ot(w,o,j.boxMargin+j.boxTextMargin,j.boxMargin,(t=>U.addSectionToLoop(t)));break;case s.db.LINETYPE.ALT_END:t=U.endLoop(),await H.drawLoop(h,t,"alt",j),U.bumpVerticalPos(t.stopy-U.getVerticalPos()),U.models.addLoop(t);break;case s.db.LINETYPE.PAR_START:case s.db.LINETYPE.PAR_OVER_START:ot(w,o,j.boxMargin,j.boxMargin+j.boxTextMargin,(t=>U.newLoop(t))),U.saveVerticalPos();break;case s.db.LINETYPE.PAR_AND:ot(w,o,j.boxMargin+j.boxTextMargin,j.boxMargin,(t=>U.addSectionToLoop(t)));break;case s.db.LINETYPE.PAR_END:t=U.endLoop(),await H.drawLoop(h,t,"par",j),U.bumpVerticalPos(t.stopy-U.getVerticalPos()),U.models.addLoop(t);break;case s.db.LINETYPE.AUTONUMBER:L=o.message.start||L,P=o.message.step||P,o.message.visible?s.db.enableSequenceNumbers():s.db.disableSequenceNumbers();break;case s.db.LINETYPE.CRITICAL_START:ot(w,o,j.boxMargin,j.boxMargin+j.boxTextMargin,(t=>U.newLoop(t)));break;case s.db.LINETYPE.CRITICAL_OPTION:ot(w,o,j.boxMargin+j.boxTextMargin,j.boxMargin,(t=>U.addSectionToLoop(t)));break;case s.db.LINETYPE.CRITICAL_END:t=U.endLoop(),await H.drawLoop(h,t,"critical",j),U.bumpVerticalPos(t.stopy-U.getVerticalPos()),U.models.addLoop(t);break;case s.db.LINETYPE.BREAK_START:ot(w,o,j.boxMargin,j.boxMargin+j.boxTextMargin,(t=>U.newLoop(t)));break;case s.db.LINETYPE.BREAK_END:t=U.endLoop(),await H.drawLoop(h,t,"break",j),U.bumpVerticalPos(t.stopy-U.getVerticalPos()),U.models.addLoop(t);break;default:try{a=o.msgModel,a.starty=U.getVerticalPos(),a.sequenceIndex=L,a.sequenceVisible=s.db.showSequenceNumbers();const t=await Q(0,a);ct(o,a,t,A,p,g,u),k.push({messageModel:a,lineStartY:t}),U.models.addMessage(a)}catch(K){n.Rm.error("error while drawing message",K)}}[s.db.LINETYPE.SOLID_OPEN,s.db.LINETYPE.DOTTED_OPEN,s.db.LINETYPE.SOLID,s.db.LINETYPE.DOTTED,s.db.LINETYPE.SOLID_CROSS,s.db.LINETYPE.DOTTED_CROSS,s.db.LINETYPE.SOLID_POINT,s.db.LINETYPE.DOTTED_POINT,s.db.LINETYPE.BIDIRECTIONAL_SOLID,s.db.LINETYPE.BIDIRECTIONAL_DOTTED].includes(o.type)&&(L+=P),A++}n.Rm.debug("createdActors",g),n.Rm.debug("destroyedActors",u),await at(h,p,y,!1);for(const n of k)await tt(h,n.messageModel,n.lineStartY,s);j.mirrorActors&&await at(h,p,y,!0),v.forEach((t=>H.drawBackgroundRect(h,t))),_(h,p,y,j);for(const n of U.models.boxes)n.height=U.getVerticalPos()-n.y,U.insert(n.x,n.y,n.x+n.width,n.height),n.startx=n.x,n.starty=n.y,n.stopx=n.startx+n.width,n.stopy=n.starty+n.height,n.stroke="rgb(0,0,0, 0.5)",H.drawBox(h,n,j);T&&U.bumpVerticalPos(j.boxMargin);const N=st(h,p,y,d),{bounds:M}=U.getBounds();void 0===M.startx&&(M.startx=0),void 0===M.starty&&(M.starty=0),void 0===M.stopx&&(M.stopx=0),void 0===M.stopy&&(M.stopy=0);let D=M.stopy-M.starty;D{const a=J(j);let s=e.actorKeys.reduce(((e,a)=>e+(t.get(a).width+(t.get(a).margin||0))),0);s-=2*j.boxTextMargin,e.wrap&&(e.name=i._K.wrapLabel(e.name,s-2*j.wrapPadding,a));const o=i._K.calculateTextDimensions(e.name,a);r=n.Y2.getMax(o.height,r);const c=n.Y2.getMax(s,o.width+2*j.wrapPadding);if(e.margin=j.boxTextMargin,st.textMaxHeight=r)),n.Y2.getMax(s,j.height)}(0,n.K2)(pt,"calculateActorMargins");var gt=(0,n.K2)((async function(t,e,a){const s=e.get(t.from),r=e.get(t.to),o=s.x,c=r.x,l=t.wrap&&t.message;let d=(0,n.Wi)(t.message)?await(0,n.Dl)(t.message,(0,n.D7)()):i._K.calculateTextDimensions(l?i._K.wrapLabel(t.message,j.width,G(j)):t.message,G(j));const h={width:l?j.width:n.Y2.getMax(j.width,d.width+2*j.noteMargin),height:0,startx:s.x,stopx:0,starty:0,stopy:0,message:t.message};return t.placement===a.db.PLACEMENT.RIGHTOF?(h.width=l?n.Y2.getMax(j.width,d.width):n.Y2.getMax(s.width/2+r.width/2,d.width+2*j.noteMargin),h.startx=o+(s.width+j.actorMargin)/2):t.placement===a.db.PLACEMENT.LEFTOF?(h.width=l?n.Y2.getMax(j.width,d.width+2*j.noteMargin):n.Y2.getMax(s.width/2+r.width/2,d.width+2*j.noteMargin),h.startx=o-h.width+(s.width-j.actorMargin)/2):t.to===t.from?(d=i._K.calculateTextDimensions(l?i._K.wrapLabel(t.message,n.Y2.getMax(j.width,s.width),G(j)):t.message,G(j)),h.width=l?n.Y2.getMax(j.width,s.width):n.Y2.getMax(s.width,j.width,d.width+2*j.noteMargin),h.startx=o+(s.width-h.width)/2):(h.width=Math.abs(o+s.width/2-(c+r.width/2))+j.actorMargin,h.startx=o2,g=(0,n.K2)((t=>l?-t:t),"adjustValue");t.from===t.to?h=d:(t.activate&&!p&&(h+=g(j.activationWidth/2-1)),[a.db.LINETYPE.SOLID_OPEN,a.db.LINETYPE.DOTTED_OPEN].includes(t.type)||(h+=g(3)),[a.db.LINETYPE.BIDIRECTIONAL_SOLID,a.db.LINETYPE.BIDIRECTIONAL_DOTTED].includes(t.type)&&(d-=g(3)));const u=[s,r,o,c],x=Math.abs(d-h);t.wrap&&t.message&&(t.message=i._K.wrapLabel(t.message,n.Y2.getMax(x+2*j.wrapPadding,j.width),J(j)));const y=i._K.calculateTextDimensions(t.message,J(j));return{width:n.Y2.getMax(t.wrap?0:y.width+2*j.wrapPadding,x+2*j.wrapPadding,j.width),height:0,startx:d,stopx:h,starty:0,stopy:0,message:t.message,type:t.type,wrap:t.wrap,fromBounds:Math.min.apply(null,u),toBounds:Math.max.apply(null,u)}}),"buildMessageModel"),xt=(0,n.K2)((async function(t,e,a,s){const r={},i=[];let o,c,l;for(const d of t){switch(d.type){case s.db.LINETYPE.LOOP_START:case s.db.LINETYPE.ALT_START:case s.db.LINETYPE.OPT_START:case s.db.LINETYPE.PAR_START:case s.db.LINETYPE.PAR_OVER_START:case s.db.LINETYPE.CRITICAL_START:case s.db.LINETYPE.BREAK_START:i.push({id:d.id,msg:d.message,from:Number.MAX_SAFE_INTEGER,to:Number.MIN_SAFE_INTEGER,width:0});break;case s.db.LINETYPE.ALT_ELSE:case s.db.LINETYPE.PAR_AND:case s.db.LINETYPE.CRITICAL_OPTION:d.message&&(o=i.pop(),r[o.id]=o,r[d.id]=o,i.push(o));break;case s.db.LINETYPE.LOOP_END:case s.db.LINETYPE.ALT_END:case s.db.LINETYPE.OPT_END:case s.db.LINETYPE.PAR_END:case s.db.LINETYPE.CRITICAL_END:case s.db.LINETYPE.BREAK_END:o=i.pop(),r[o.id]=o;break;case s.db.LINETYPE.ACTIVE_START:{const t=e.get(d.from?d.from:d.to.actor),a=it(d.from?d.from:d.to.actor).length,s=t.x+t.width/2+(a-1)*j.activationWidth/2,r={startx:s,stopx:s+j.activationWidth,actor:d.from,enabled:!0};U.activations.push(r)}break;case s.db.LINETYPE.ACTIVE_END:{const t=U.activations.map((t=>t.actor)).lastIndexOf(d.from);U.activations.splice(t,1).splice(0,1)}}void 0!==d.placement?(c=await gt(d,e,s),d.noteModel=c,i.forEach((t=>{o=t,o.from=n.Y2.getMin(o.from,c.startx),o.to=n.Y2.getMax(o.to,c.startx+c.width),o.width=n.Y2.getMax(o.width,Math.abs(o.from-o.to))-j.labelBoxWidth}))):(l=ut(d,e,s),d.msgModel=l,l.startx&&l.stopx&&i.length>0&&i.forEach((t=>{if(o=t,l.startx===l.stopx){const t=e.get(d.from),a=e.get(d.to);o.from=n.Y2.getMin(t.x-l.width/2,t.x-t.width/2,o.from),o.to=n.Y2.getMax(a.x+l.width/2,a.x+t.width/2,o.to),o.width=n.Y2.getMax(o.width,Math.abs(o.to-o.from))-j.labelBoxWidth}else o.from=n.Y2.getMin(l.startx,o.from),o.to=n.Y2.getMax(l.stopx,o.to),o.width=n.Y2.getMax(o.width,l.width)-j.labelBoxWidth})))}return U.activations=[],n.Rm.debug("Loop type widths:",r),r}),"calculateLoopBounds"),yt={bounds:U,drawActors:at,drawActorsPopup:st,setConf:rt,draw:lt},mt={parser:d,get db(){return new u},renderer:yt,styles:x,init:(0,n.K2)((t=>{t.sequence||(t.sequence={}),t.wrap&&(t.sequence.wrap=t.wrap,(0,n.XV)({sequence:{wrap:t.wrap}}))}),"init")}},9837:(t,e,a)=>{a.d(e,{m:()=>r});var s=a(3759),r=class{constructor(t){this.init=t,this.records=this.init()}static#t=(()=>(0,s.K2)(this,"ImperativeState"))();reset(){this.records=this.init()}}}}]); -//# sourceMappingURL=314.5b42713c.chunk.js.map \ No newline at end of file diff --git a/frontend/deployed/static/js/314.5b42713c.chunk.js.map b/frontend/deployed/static/js/314.5b42713c.chunk.js.map deleted file mode 100644 index 2da9270..0000000 --- a/frontend/deployed/static/js/314.5b42713c.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"static/js/314.5b42713c.chunk.js","mappings":"oMAOIA,GAA2BC,EAAAA,EAAAA,KAAO,CAACC,EAASC,KAC9C,MAAMC,EAAcF,EAAQG,OAAO,QAgBnC,GAfAD,EAAYE,KAAK,IAAKH,EAASI,GAC/BH,EAAYE,KAAK,IAAKH,EAASK,GAC/BJ,EAAYE,KAAK,OAAQH,EAASM,MAClCL,EAAYE,KAAK,SAAUH,EAASO,QACpCN,EAAYE,KAAK,QAASH,EAASQ,OACnCP,EAAYE,KAAK,SAAUH,EAASS,QAChCT,EAASU,MACXT,EAAYE,KAAK,OAAQH,EAASU,MAEhCV,EAASW,IACXV,EAAYE,KAAK,KAAMH,EAASW,IAE9BX,EAASY,IACXX,EAAYE,KAAK,KAAMH,EAASY,SAEX,IAAnBZ,EAASa,MACX,IAAK,MAAMC,KAAWd,EAASa,MAC7BZ,EAAYE,KAAKW,EAASd,EAASa,MAAMC,IAM7C,OAHId,EAASe,OACXd,EAAYE,KAAK,QAASH,EAASe,OAE9Bd,CAAW,GACjB,YACCe,GAAqClB,EAAAA,EAAAA,KAAO,CAACC,EAASkB,KACxD,MAAMjB,EAAW,CACfI,EAAGa,EAAOC,OACVb,EAAGY,EAAOE,OACVX,MAAOS,EAAOG,MAAQH,EAAOC,OAC7BT,OAAQQ,EAAOI,MAAQJ,EAAOE,OAC9Bb,KAAMW,EAAOX,KACbC,OAAQU,EAAOV,OACfQ,MAAO,QAEWlB,EAASE,EAASC,GAC1BsB,OAAO,GAClB,sBACCC,GAA2BzB,EAAAA,EAAAA,KAAO,CAACC,EAASyB,KAC9C,MAAMC,EAAQD,EAASE,KAAKC,QAAQC,EAAAA,GAAgB,KAC9CC,EAAW9B,EAAQG,OAAO,QAChC2B,EAAS1B,KAAK,IAAKqB,EAASpB,GAC5ByB,EAAS1B,KAAK,IAAKqB,EAASnB,GAC5BwB,EAAS1B,KAAK,QAAS,UACvB0B,EAASC,MAAM,cAAeN,EAASO,QACnCP,EAAST,OACXc,EAAS1B,KAAK,QAASqB,EAAST,OAElC,MAAMiB,EAAQH,EAAS3B,OAAO,SAG9B,OAFA8B,EAAM7B,KAAK,IAAKqB,EAASpB,EAA0B,EAAtBoB,EAASS,YACtCD,EAAMN,KAAKD,GACJI,CAAQ,GACd,YACCK,GAA4BpC,EAAAA,EAAAA,KAAO,CAACqC,EAAM/B,EAAGC,EAAG+B,KAClD,MAAMC,EAAeF,EAAKjC,OAAO,SACjCmC,EAAalC,KAAK,IAAKC,GACvBiC,EAAalC,KAAK,IAAKE,GACvB,MAAMiC,GAAgBC,EAAAA,EAAAA,GAAYH,GAClCC,EAAalC,KAAK,aAAcmC,EAAc,GAC7C,aACCE,GAAoC1C,EAAAA,EAAAA,KAAO,CAACC,EAASK,EAAGC,EAAG+B,KAC7D,MAAMC,EAAetC,EAAQG,OAAO,OACpCmC,EAAalC,KAAK,IAAKC,GACvBiC,EAAalC,KAAK,IAAKE,GACvB,MAAMiC,GAAgBC,EAAAA,EAAAA,GAAYH,GAClCC,EAAalC,KAAK,aAAc,IAAImC,IAAgB,GACnD,qBACCG,GAA8B3C,EAAAA,EAAAA,KAAO,KAClB,CACnBM,EAAG,EACHC,EAAG,EACHG,MAAO,IACPC,OAAQ,IACRH,KAAM,UACNC,OAAQ,OACRwB,OAAQ,QACRpB,GAAI,EACJC,GAAI,KAGL,eACC8B,GAA6B5C,EAAAA,EAAAA,KAAO,KACnB,CACjBM,EAAG,EACHC,EAAG,EACHG,MAAO,IACPC,OAAQ,IACR,cAAe,QACfqB,MAAO,OACPG,WAAY,EACZtB,GAAI,EACJC,GAAI,EACJoB,OAAO,KAGR,a,uGCjECW,EAAS,WACX,IAAIC,GAAoB9C,EAAAA,EAAAA,KAAO,SAAS+C,EAAGC,EAAGC,EAAIC,GAChD,IAAKD,EAAKA,GAAM,CAAC,EAAGC,EAAIH,EAAEI,OAAQD,IAAKD,EAAGF,EAAEG,IAAMF,GAClD,OAAOC,CACT,GAAG,KAAMG,EAAM,CAAC,EAAG,GAAIC,EAAM,CAAC,EAAG,GAAIC,EAAM,CAAC,EAAG,GAAIC,EAAM,CAAC,EAAG,GAAIC,EAAM,CAAC,EAAG,GAAIC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAKC,EAAM,CAAC,EAAG,EAAG,GAAI,GAAI,GAAI,IAAKC,EAAM,CAAC,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAKC,EAAM,CAAC,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAKC,EAAM,CAAC,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAKC,EAAM,CAAC,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI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","sources":["../node_modules/mermaid/dist/chunks/mermaid.core/chunk-D6G4REZN.mjs","../node_modules/mermaid/dist/chunks/mermaid.core/sequenceDiagram-X6HHIX6F.mjs","../node_modules/mermaid/dist/chunks/mermaid.core/chunk-XZIHB7SX.mjs"],"sourcesContent":["import {\n __name,\n lineBreakRegex\n} from \"./chunk-YTJNT7DU.mjs\";\n\n// src/diagrams/common/svgDrawCommon.ts\nimport { sanitizeUrl } from \"@braintree/sanitize-url\";\nvar drawRect = /* @__PURE__ */ __name((element, rectData) => {\n const rectElement = 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 if (rectData.attrs !== void 0) {\n for (const attrKey in rectData.attrs) {\n rectElement.attr(attrKey, rectData.attrs[attrKey]);\n }\n }\n if (rectData.class) {\n rectElement.attr(\"class\", rectData.class);\n }\n return rectElement;\n}, \"drawRect\");\nvar drawBackgroundRect = /* @__PURE__ */ __name((element, bounds) => {\n const 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 = drawRect(element, rectData);\n rectElement.lower();\n}, \"drawBackgroundRect\");\nvar drawText = /* @__PURE__ */ __name((element, textData) => {\n const nText = textData.text.replace(lineBreakRegex, \" \");\n const textElem = element.append(\"text\");\n textElem.attr(\"x\", textData.x);\n textElem.attr(\"y\", textData.y);\n textElem.attr(\"class\", \"legend\");\n textElem.style(\"text-anchor\", textData.anchor);\n if (textData.class) {\n textElem.attr(\"class\", textData.class);\n }\n const tspan = textElem.append(\"tspan\");\n tspan.attr(\"x\", textData.x + textData.textMargin * 2);\n tspan.text(nText);\n return textElem;\n}, \"drawText\");\nvar drawImage = /* @__PURE__ */ __name((elem, x, y, link) => {\n const imageElement = elem.append(\"image\");\n imageElement.attr(\"x\", x);\n imageElement.attr(\"y\", y);\n const sanitizedLink = sanitizeUrl(link);\n imageElement.attr(\"xlink:href\", sanitizedLink);\n}, \"drawImage\");\nvar drawEmbeddedImage = /* @__PURE__ */ __name((element, x, y, link) => {\n const imageElement = element.append(\"use\");\n imageElement.attr(\"x\", x);\n imageElement.attr(\"y\", y);\n const sanitizedLink = sanitizeUrl(link);\n imageElement.attr(\"xlink:href\", `#${sanitizedLink}`);\n}, \"drawEmbeddedImage\");\nvar getNoteRect = /* @__PURE__ */ __name(() => {\n const noteRectData = {\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}, \"getNoteRect\");\nvar getTextObj = /* @__PURE__ */ __name(() => {\n const testObject = {\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}, \"getTextObj\");\n\nexport {\n drawRect,\n drawBackgroundRect,\n drawText,\n drawImage,\n drawEmbeddedImage,\n getNoteRect,\n getTextObj\n};\n","import {\n drawBackgroundRect,\n drawEmbeddedImage,\n drawImage,\n drawRect,\n getNoteRect,\n getTextObj\n} from \"./chunk-D6G4REZN.mjs\";\nimport {\n ImperativeState\n} from \"./chunk-XZIHB7SX.mjs\";\nimport {\n ZERO_WIDTH_SPACE,\n parseFontSize,\n utils_default\n} from \"./chunk-O4NI6UNU.mjs\";\nimport {\n __name,\n assignWithDepth_default,\n calculateMathMLDimensions,\n clear,\n common_default,\n configureSvgSize,\n getAccDescription,\n getAccTitle,\n getConfig,\n getConfig2,\n getDiagramTitle,\n hasKatex,\n log,\n renderKatex,\n sanitizeText,\n setAccDescription,\n setAccTitle,\n setConfig2 as setConfig,\n setDiagramTitle\n} from \"./chunk-YTJNT7DU.mjs\";\n\n// src/diagrams/sequence/parser/sequenceDiagram.jison\nvar parser = function() {\n var o = /* @__PURE__ */ __name(function(k, v, o2, l) {\n for (o2 = o2 || {}, l = k.length; l--; o2[k[l]] = v) ;\n return o2;\n }, \"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, 54, 59, 60, 61, 62, 70], $Vy = [4, 5, 16, 50, 52, 53], $Vz = [4, 5, 13, 14, 16, 18, 21, 23, 29, 30, 31, 33, 35, 36, 37, 38, 39, 41, 43, 44, 46, 50, 52, 53, 54, 59, 60, 61, 62, 70], $VA = [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, 54, 59, 60, 61, 62, 70], $VB = [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, 54, 59, 60, 61, 62, 70], $VC = [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, 54, 59, 60, 61, 62, 70], $VD = [68, 69, 70], $VE = [1, 122];\n var parser2 = {\n trace: /* @__PURE__ */ __name(function trace() {\n }, \"trace\"),\n yy: {},\n 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, \"note\": 54, \"placement\": 55, \"text2\": 56, \"over\": 57, \"actor_pair\": 58, \"links\": 59, \"link\": 60, \"properties\": 61, \"details\": 62, \"spaceList\": 63, \",\": 64, \"left_of\": 65, \"right_of\": 66, \"signaltype\": 67, \"+\": 68, \"-\": 69, \"ACTOR\": 70, \"SOLID_OPEN_ARROW\": 71, \"DOTTED_OPEN_ARROW\": 72, \"SOLID_ARROW\": 73, \"BIDIRECTIONAL_SOLID_ARROW\": 74, \"DOTTED_ARROW\": 75, \"BIDIRECTIONAL_DOTTED_ARROW\": 76, \"SOLID_CROSS\": 77, \"DOTTED_CROSS\": 78, \"SOLID_POINT\": 79, \"DOTTED_POINT\": 80, \"TXT\": 81, \"$accept\": 0, \"$end\": 1 },\n 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\", 54: \"note\", 57: \"over\", 59: \"links\", 60: \"link\", 61: \"properties\", 62: \"details\", 64: \",\", 65: \"left_of\", 66: \"right_of\", 68: \"+\", 69: \"-\", 70: \"ACTOR\", 71: \"SOLID_OPEN_ARROW\", 72: \"DOTTED_OPEN_ARROW\", 73: \"SOLID_ARROW\", 74: \"BIDIRECTIONAL_SOLID_ARROW\", 75: \"DOTTED_ARROW\", 76: \"BIDIRECTIONAL_DOTTED_ARROW\", 77: \"SOLID_CROSS\", 78: \"DOTTED_CROSS\", 79: \"SOLID_POINT\", 80: \"DOTTED_POINT\", 81: \"TXT\" },\n 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], [24, 4], [24, 4], [25, 3], [26, 3], [27, 3], [28, 3], [63, 2], [63, 1], [58, 3], [58, 1], [55, 1], [55, 1], [17, 5], [17, 5], [17, 4], [22, 1], [67, 1], [67, 1], [67, 1], [67, 1], [67, 1], [67, 1], [67, 1], [67, 1], [67, 1], [67, 1], [56, 1]],\n performAction: /* @__PURE__ */ __name(function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) {\n var $0 = $$.length - 1;\n switch (yystate) {\n case 3:\n yy.apply($$[$0]);\n return $$[$0];\n break;\n case 4:\n case 9:\n this.$ = [];\n break;\n case 5:\n case 10:\n $$[$0 - 1].push($$[$0]);\n this.$ = $$[$0 - 1];\n break;\n case 6:\n case 7:\n case 11:\n case 12:\n this.$ = $$[$0];\n break;\n case 8:\n case 13:\n this.$ = [];\n break;\n case 15:\n $$[$0].type = \"createParticipant\";\n this.$ = $$[$0];\n break;\n case 16:\n $$[$0 - 1].unshift({ type: \"boxStart\", boxData: yy.parseBoxData($$[$0 - 2]) });\n $$[$0 - 1].push({ type: \"boxEnd\", boxText: $$[$0 - 2] });\n this.$ = $$[$0 - 1];\n break;\n case 18:\n this.$ = { type: \"sequenceIndex\", sequenceIndex: Number($$[$0 - 2]), sequenceIndexStep: Number($$[$0 - 1]), sequenceVisible: true, signalType: yy.LINETYPE.AUTONUMBER };\n break;\n case 19:\n this.$ = { type: \"sequenceIndex\", sequenceIndex: Number($$[$0 - 1]), sequenceIndexStep: 1, sequenceVisible: true, signalType: yy.LINETYPE.AUTONUMBER };\n break;\n case 20:\n this.$ = { type: \"sequenceIndex\", sequenceVisible: false, signalType: yy.LINETYPE.AUTONUMBER };\n break;\n case 21:\n this.$ = { type: \"sequenceIndex\", sequenceVisible: true, signalType: yy.LINETYPE.AUTONUMBER };\n break;\n case 22:\n this.$ = { type: \"activeStart\", signalType: yy.LINETYPE.ACTIVE_START, actor: $$[$0 - 1].actor };\n break;\n case 23:\n this.$ = { type: \"activeEnd\", signalType: yy.LINETYPE.ACTIVE_END, actor: $$[$0 - 1].actor };\n break;\n case 29:\n yy.setDiagramTitle($$[$0].substring(6));\n this.$ = $$[$0].substring(6);\n break;\n case 30:\n yy.setDiagramTitle($$[$0].substring(7));\n this.$ = $$[$0].substring(7);\n break;\n case 31:\n this.$ = $$[$0].trim();\n yy.setAccTitle(this.$);\n break;\n case 32:\n case 33:\n this.$ = $$[$0].trim();\n yy.setAccDescription(this.$);\n break;\n case 34:\n $$[$0 - 1].unshift({ type: \"loopStart\", loopText: yy.parseMessage($$[$0 - 2]), signalType: yy.LINETYPE.LOOP_START });\n $$[$0 - 1].push({ type: \"loopEnd\", loopText: $$[$0 - 2], signalType: yy.LINETYPE.LOOP_END });\n this.$ = $$[$0 - 1];\n break;\n case 35:\n $$[$0 - 1].unshift({ type: \"rectStart\", color: yy.parseMessage($$[$0 - 2]), signalType: yy.LINETYPE.RECT_START });\n $$[$0 - 1].push({ type: \"rectEnd\", color: yy.parseMessage($$[$0 - 2]), signalType: yy.LINETYPE.RECT_END });\n this.$ = $$[$0 - 1];\n break;\n case 36:\n $$[$0 - 1].unshift({ type: \"optStart\", optText: yy.parseMessage($$[$0 - 2]), signalType: yy.LINETYPE.OPT_START });\n $$[$0 - 1].push({ type: \"optEnd\", optText: yy.parseMessage($$[$0 - 2]), signalType: yy.LINETYPE.OPT_END });\n this.$ = $$[$0 - 1];\n break;\n case 37:\n $$[$0 - 1].unshift({ type: \"altStart\", altText: yy.parseMessage($$[$0 - 2]), signalType: yy.LINETYPE.ALT_START });\n $$[$0 - 1].push({ type: \"altEnd\", signalType: yy.LINETYPE.ALT_END });\n this.$ = $$[$0 - 1];\n break;\n case 38:\n $$[$0 - 1].unshift({ type: \"parStart\", parText: yy.parseMessage($$[$0 - 2]), signalType: yy.LINETYPE.PAR_START });\n $$[$0 - 1].push({ type: \"parEnd\", signalType: yy.LINETYPE.PAR_END });\n this.$ = $$[$0 - 1];\n break;\n case 39:\n $$[$0 - 1].unshift({ type: \"parStart\", parText: yy.parseMessage($$[$0 - 2]), signalType: yy.LINETYPE.PAR_OVER_START });\n $$[$0 - 1].push({ type: \"parEnd\", signalType: yy.LINETYPE.PAR_END });\n this.$ = $$[$0 - 1];\n break;\n case 40:\n $$[$0 - 1].unshift({ type: \"criticalStart\", criticalText: yy.parseMessage($$[$0 - 2]), signalType: yy.LINETYPE.CRITICAL_START });\n $$[$0 - 1].push({ type: \"criticalEnd\", signalType: yy.LINETYPE.CRITICAL_END });\n this.$ = $$[$0 - 1];\n break;\n case 41:\n $$[$0 - 1].unshift({ type: \"breakStart\", breakText: yy.parseMessage($$[$0 - 2]), signalType: yy.LINETYPE.BREAK_START });\n $$[$0 - 1].push({ type: \"breakEnd\", optText: yy.parseMessage($$[$0 - 2]), signalType: yy.LINETYPE.BREAK_END });\n this.$ = $$[$0 - 1];\n break;\n case 43:\n this.$ = $$[$0 - 3].concat([{ type: \"option\", optionText: yy.parseMessage($$[$0 - 1]), signalType: yy.LINETYPE.CRITICAL_OPTION }, $$[$0]]);\n break;\n case 45:\n this.$ = $$[$0 - 3].concat([{ type: \"and\", parText: yy.parseMessage($$[$0 - 1]), signalType: yy.LINETYPE.PAR_AND }, $$[$0]]);\n break;\n case 47:\n this.$ = $$[$0 - 3].concat([{ type: \"else\", altText: yy.parseMessage($$[$0 - 1]), signalType: yy.LINETYPE.ALT_ELSE }, $$[$0]]);\n break;\n case 48:\n $$[$0 - 3].draw = \"participant\";\n $$[$0 - 3].type = \"addParticipant\";\n $$[$0 - 3].description = yy.parseMessage($$[$0 - 1]);\n this.$ = $$[$0 - 3];\n break;\n case 49:\n $$[$0 - 1].draw = \"participant\";\n $$[$0 - 1].type = \"addParticipant\";\n this.$ = $$[$0 - 1];\n break;\n case 50:\n $$[$0 - 3].draw = \"actor\";\n $$[$0 - 3].type = \"addParticipant\";\n $$[$0 - 3].description = yy.parseMessage($$[$0 - 1]);\n this.$ = $$[$0 - 3];\n break;\n case 51:\n $$[$0 - 1].draw = \"actor\";\n $$[$0 - 1].type = \"addParticipant\";\n this.$ = $$[$0 - 1];\n break;\n case 52:\n $$[$0 - 1].type = \"destroyParticipant\";\n this.$ = $$[$0 - 1];\n break;\n case 53:\n this.$ = [$$[$0 - 1], { type: \"addNote\", placement: $$[$0 - 2], actor: $$[$0 - 1].actor, text: $$[$0] }];\n break;\n case 54:\n $$[$0 - 2] = [].concat($$[$0 - 1], $$[$0 - 1]).slice(0, 2);\n $$[$0 - 2][0] = $$[$0 - 2][0].actor;\n $$[$0 - 2][1] = $$[$0 - 2][1].actor;\n this.$ = [$$[$0 - 1], { type: \"addNote\", placement: yy.PLACEMENT.OVER, actor: $$[$0 - 2].slice(0, 2), text: $$[$0] }];\n break;\n case 55:\n this.$ = [$$[$0 - 1], { type: \"addLinks\", actor: $$[$0 - 1].actor, text: $$[$0] }];\n break;\n case 56:\n this.$ = [$$[$0 - 1], { type: \"addALink\", actor: $$[$0 - 1].actor, text: $$[$0] }];\n break;\n case 57:\n this.$ = [$$[$0 - 1], { type: \"addProperties\", actor: $$[$0 - 1].actor, text: $$[$0] }];\n break;\n case 58:\n this.$ = [$$[$0 - 1], { type: \"addDetails\", actor: $$[$0 - 1].actor, text: $$[$0] }];\n break;\n case 61:\n this.$ = [$$[$0 - 2], $$[$0]];\n break;\n case 62:\n this.$ = $$[$0];\n break;\n case 63:\n this.$ = yy.PLACEMENT.LEFTOF;\n break;\n case 64:\n this.$ = yy.PLACEMENT.RIGHTOF;\n break;\n case 65:\n this.$ = [\n $$[$0 - 4],\n $$[$0 - 1],\n { type: \"addMessage\", from: $$[$0 - 4].actor, to: $$[$0 - 1].actor, signalType: $$[$0 - 3], msg: $$[$0], activate: true },\n { type: \"activeStart\", signalType: yy.LINETYPE.ACTIVE_START, actor: $$[$0 - 1].actor }\n ];\n break;\n case 66:\n this.$ = [\n $$[$0 - 4],\n $$[$0 - 1],\n { type: \"addMessage\", from: $$[$0 - 4].actor, to: $$[$0 - 1].actor, signalType: $$[$0 - 3], msg: $$[$0] },\n { type: \"activeEnd\", signalType: yy.LINETYPE.ACTIVE_END, actor: $$[$0 - 4].actor }\n ];\n break;\n case 67:\n this.$ = [$$[$0 - 3], $$[$0 - 1], { type: \"addMessage\", from: $$[$0 - 3].actor, to: $$[$0 - 1].actor, signalType: $$[$0 - 2], msg: $$[$0] }];\n break;\n case 68:\n this.$ = { type: \"addParticipant\", actor: $$[$0] };\n break;\n case 69:\n this.$ = yy.LINETYPE.SOLID_OPEN;\n break;\n case 70:\n this.$ = yy.LINETYPE.DOTTED_OPEN;\n break;\n case 71:\n this.$ = yy.LINETYPE.SOLID;\n break;\n case 72:\n this.$ = yy.LINETYPE.BIDIRECTIONAL_SOLID;\n break;\n case 73:\n this.$ = yy.LINETYPE.DOTTED;\n break;\n case 74:\n this.$ = yy.LINETYPE.BIDIRECTIONAL_DOTTED;\n break;\n case 75:\n this.$ = yy.LINETYPE.SOLID_CROSS;\n break;\n case 76:\n this.$ = yy.LINETYPE.DOTTED_CROSS;\n break;\n case 77:\n this.$ = yy.LINETYPE.SOLID_POINT;\n break;\n case 78:\n this.$ = yy.LINETYPE.DOTTED_POINT;\n break;\n case 79:\n this.$ = yy.parseMessage($$[$0].trim().substring(1));\n break;\n }\n }, \"anonymous\"),\n 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, 54, 59, 60, 61, 62, 70], $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, 54: $Vr, 59: $Vs, 60: $Vt, 61: $Vu, 62: $Vv, 70: $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, 54: $Vr, 59: $Vs, 60: $Vt, 61: $Vu, 62: $Vv, 70: $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, 70: $Vw }, { 22: 55, 70: $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, 70: $Vw }, { 22: 72, 70: $Vw }, { 22: 73, 70: $Vw }, { 67: 74, 71: [1, 75], 72: [1, 76], 73: [1, 77], 74: [1, 78], 75: [1, 79], 76: [1, 80], 77: [1, 81], 78: [1, 82], 79: [1, 83], 80: [1, 84] }, { 55: 85, 57: [1, 86], 65: [1, 87], 66: [1, 88] }, { 22: 89, 70: $Vw }, { 22: 90, 70: $Vw }, { 22: 91, 70: $Vw }, { 22: 92, 70: $Vw }, o([5, 51, 64, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81], [2, 68]), o($Vx, [2, 6]), o($Vx, [2, 15]), o($Vy, [2, 9], { 10: 93 }), o($Vx, [2, 17]), { 5: [1, 95], 19: [1, 94] }, { 5: [1, 96] }, o($Vx, [2, 21]), { 5: [1, 97] }, { 5: [1, 98] }, 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($Vz, $V3, { 7: 99 }), o($Vz, $V3, { 7: 100 }), o($Vz, $V3, { 7: 101 }), o($VA, $V3, { 40: 102, 7: 103 }), o($VB, $V3, { 42: 104, 7: 105 }), o($VB, $V3, { 7: 105, 42: 106 }), o($VC, $V3, { 45: 107, 7: 108 }), o($Vz, $V3, { 7: 109 }), { 5: [1, 111], 51: [1, 110] }, { 5: [1, 113], 51: [1, 112] }, { 5: [1, 114] }, { 22: 117, 68: [1, 115], 69: [1, 116], 70: $Vw }, o($VD, [2, 69]), o($VD, [2, 70]), o($VD, [2, 71]), o($VD, [2, 72]), o($VD, [2, 73]), o($VD, [2, 74]), o($VD, [2, 75]), o($VD, [2, 76]), o($VD, [2, 77]), o($VD, [2, 78]), { 22: 118, 70: $Vw }, { 22: 120, 58: 119, 70: $Vw }, { 70: [2, 63] }, { 70: [2, 64] }, { 56: 121, 81: $VE }, { 56: 123, 81: $VE }, { 56: 124, 81: $VE }, { 56: 125, 81: $VE }, { 4: [1, 128], 5: [1, 130], 11: 127, 12: 129, 16: [1, 126], 50: $Vo, 52: $Vp, 53: $Vq }, { 5: [1, 131] }, 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, 132], 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, 54: $Vr, 59: $Vs, 60: $Vt, 61: $Vu, 62: $Vv, 70: $Vw }, { 4: $V4, 5: $V5, 8: 8, 9: 10, 12: 12, 13: $V6, 14: $V7, 16: [1, 133], 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, 54: $Vr, 59: $Vs, 60: $Vt, 61: $Vu, 62: $Vv, 70: $Vw }, { 4: $V4, 5: $V5, 8: 8, 9: 10, 12: 12, 13: $V6, 14: $V7, 16: [1, 134], 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, 54: $Vr, 59: $Vs, 60: $Vt, 61: $Vu, 62: $Vv, 70: $Vw }, { 16: [1, 135] }, { 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, 136], 50: $Vo, 52: $Vp, 53: $Vq, 54: $Vr, 59: $Vs, 60: $Vt, 61: $Vu, 62: $Vv, 70: $Vw }, { 16: [1, 137] }, { 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, 138], 50: $Vo, 52: $Vp, 53: $Vq, 54: $Vr, 59: $Vs, 60: $Vt, 61: $Vu, 62: $Vv, 70: $Vw }, { 16: [1, 139] }, { 16: [1, 140] }, { 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, 141], 50: $Vo, 52: $Vp, 53: $Vq, 54: $Vr, 59: $Vs, 60: $Vt, 61: $Vu, 62: $Vv, 70: $Vw }, { 4: $V4, 5: $V5, 8: 8, 9: 10, 12: 12, 13: $V6, 14: $V7, 16: [1, 142], 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, 54: $Vr, 59: $Vs, 60: $Vt, 61: $Vu, 62: $Vv, 70: $Vw }, { 15: [1, 143] }, o($Vx, [2, 49]), { 15: [1, 144] }, o($Vx, [2, 51]), o($Vx, [2, 52]), { 22: 145, 70: $Vw }, { 22: 146, 70: $Vw }, { 56: 147, 81: $VE }, { 56: 148, 81: $VE }, { 56: 149, 81: $VE }, { 64: [1, 150], 81: [2, 62] }, { 5: [2, 55] }, { 5: [2, 79] }, { 5: [2, 56] }, { 5: [2, 57] }, { 5: [2, 58] }, o($Vx, [2, 16]), o($Vy, [2, 10]), { 12: 151, 50: $Vo, 52: $Vp, 53: $Vq }, o($Vy, [2, 12]), o($Vy, [2, 13]), o($Vx, [2, 18]), o($Vx, [2, 34]), o($Vx, [2, 35]), o($Vx, [2, 36]), o($Vx, [2, 37]), { 15: [1, 152] }, o($Vx, [2, 38]), { 15: [1, 153] }, o($Vx, [2, 39]), o($Vx, [2, 40]), { 15: [1, 154] }, o($Vx, [2, 41]), { 5: [1, 155] }, { 5: [1, 156] }, { 56: 157, 81: $VE }, { 56: 158, 81: $VE }, { 5: [2, 67] }, { 5: [2, 53] }, { 5: [2, 54] }, { 22: 159, 70: $Vw }, o($Vy, [2, 11]), o($VA, $V3, { 7: 103, 40: 160 }), o($VB, $V3, { 7: 105, 42: 161 }), o($VC, $V3, { 7: 108, 45: 162 }), o($Vx, [2, 48]), o($Vx, [2, 50]), { 5: [2, 65] }, { 5: [2, 66] }, { 81: [2, 61] }, { 16: [2, 47] }, { 16: [2, 45] }, { 16: [2, 43] }],\n defaultActions: { 5: [2, 1], 6: [2, 2], 87: [2, 63], 88: [2, 64], 121: [2, 55], 122: [2, 79], 123: [2, 56], 124: [2, 57], 125: [2, 58], 147: [2, 67], 148: [2, 53], 149: [2, 54], 157: [2, 65], 158: [2, 66], 159: [2, 61], 160: [2, 47], 161: [2, 45], 162: [2, 43] },\n parseError: /* @__PURE__ */ __name(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 }, \"parseError\"),\n parse: /* @__PURE__ */ __name(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 lexer2 = 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 lexer2.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer2;\n sharedState.yy.parser = this;\n if (typeof lexer2.yylloc == \"undefined\") {\n lexer2.yylloc = {};\n }\n var yyloc = lexer2.yylloc;\n lstack.push(yyloc);\n var ranges = lexer2.options && lexer2.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 __name(popStack, \"popStack\");\n function lex() {\n var token;\n token = tstack.pop() || lexer2.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 __name(lex, \"lex\");\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 (lexer2.showPosition) {\n errStr = \"Parse error on line \" + (yylineno + 1) + \":\\n\" + lexer2.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: lexer2.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer2.yylineno,\n loc: yyloc,\n 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(lexer2.yytext);\n lstack.push(lexer2.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = lexer2.yyleng;\n yytext = lexer2.yytext;\n yylineno = lexer2.yylineno;\n yyloc = lexer2.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 }, \"parse\")\n };\n var lexer = /* @__PURE__ */ function() {\n var lexer2 = {\n EOF: 1,\n parseError: /* @__PURE__ */ __name(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 }, \"parseError\"),\n // resets the lexer, sets new input\n setInput: /* @__PURE__ */ __name(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 }, \"setInput\"),\n // consumes and returns one char from the input\n input: /* @__PURE__ */ __name(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 this._input = this._input.slice(1);\n return ch;\n }, \"input\"),\n // unshifts one char (or a string) into the input\n unput: /* @__PURE__ */ __name(function(ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - 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 if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\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 ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len\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 }, \"unput\"),\n // When called from action, caches matched text and appends it on next action\n more: /* @__PURE__ */ __name(function() {\n this._more = true;\n return this;\n }, \"more\"),\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.\n reject: /* @__PURE__ */ __name(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 return this;\n }, \"reject\"),\n // retain first n characters of the match\n less: /* @__PURE__ */ __name(function(n) {\n this.unput(this.match.slice(n));\n }, \"less\"),\n // displays already matched input, i.e. for error messages\n pastInput: /* @__PURE__ */ __name(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 }, \"pastInput\"),\n // displays upcoming input, i.e. for error messages\n upcomingInput: /* @__PURE__ */ __name(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 }, \"upcomingInput\"),\n // displays the character position where the lexing error occurred, i.e. for error messages\n showPosition: /* @__PURE__ */ __name(function() {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n }, \"showPosition\"),\n // test the lexed token: return FALSE when not a match, otherwise return token\n test_match: /* @__PURE__ */ __name(function(match, indexed_rule) {\n var token, lines, backup;\n if (this.options.backtrack_lexer) {\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 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 ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length : 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 for (var k in backup) {\n this[k] = backup[k];\n }\n return false;\n }\n return false;\n }, \"test_match\"),\n // return next match in input\n next: /* @__PURE__ */ __name(function() {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n var token, match, tempMatch, 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;\n } else {\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 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 }, \"next\"),\n // return next match that has a token\n lex: /* @__PURE__ */ __name(function lex() {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n }, \"lex\"),\n // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\n begin: /* @__PURE__ */ __name(function begin(condition) {\n this.conditionStack.push(condition);\n }, \"begin\"),\n // pop the previously active lexer condition state off the condition stack\n popState: /* @__PURE__ */ __name(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 }, \"popState\"),\n // produce the lexer rule set which is active for the currently active lexer condition state\n _currentRules: /* @__PURE__ */ __name(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 }, \"_currentRules\"),\n // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\n topState: /* @__PURE__ */ __name(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 }, \"topState\"),\n // alias for begin(condition)\n pushState: /* @__PURE__ */ __name(function pushState(condition) {\n this.begin(condition);\n }, \"pushState\"),\n // return the number of states currently on the stack\n stateStackSize: /* @__PURE__ */ __name(function stateStackSize() {\n return this.conditionStack.length;\n }, \"stateStackSize\"),\n options: { \"case-insensitive\": true },\n performAction: /* @__PURE__ */ __name(function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) {\n var YYSTATE = YY_START;\n switch ($avoiding_name_collisions) {\n case 0:\n return 5;\n break;\n case 1:\n break;\n case 2:\n break;\n case 3:\n break;\n case 4:\n break;\n case 5:\n break;\n case 6:\n return 19;\n break;\n case 7:\n this.begin(\"LINE\");\n return 14;\n break;\n case 8:\n this.begin(\"ID\");\n return 50;\n break;\n case 9:\n this.begin(\"ID\");\n return 52;\n break;\n case 10:\n return 13;\n break;\n case 11:\n this.begin(\"ID\");\n return 53;\n break;\n case 12:\n yy_.yytext = yy_.yytext.trim();\n this.begin(\"ALIAS\");\n return 70;\n break;\n case 13:\n this.popState();\n this.popState();\n this.begin(\"LINE\");\n return 51;\n break;\n case 14:\n this.popState();\n this.popState();\n return 5;\n break;\n case 15:\n this.begin(\"LINE\");\n return 36;\n break;\n case 16:\n this.begin(\"LINE\");\n return 37;\n break;\n case 17:\n this.begin(\"LINE\");\n return 38;\n break;\n case 18:\n this.begin(\"LINE\");\n return 39;\n break;\n case 19:\n this.begin(\"LINE\");\n return 49;\n break;\n case 20:\n this.begin(\"LINE\");\n return 41;\n break;\n case 21:\n this.begin(\"LINE\");\n return 43;\n break;\n case 22:\n this.begin(\"LINE\");\n return 48;\n break;\n case 23:\n this.begin(\"LINE\");\n return 44;\n break;\n case 24:\n this.begin(\"LINE\");\n return 47;\n break;\n case 25:\n this.begin(\"LINE\");\n return 46;\n break;\n case 26:\n this.popState();\n return 15;\n break;\n case 27:\n return 16;\n break;\n case 28:\n return 65;\n break;\n case 29:\n return 66;\n break;\n case 30:\n return 59;\n break;\n case 31:\n return 60;\n break;\n case 32:\n return 61;\n break;\n case 33:\n return 62;\n break;\n case 34:\n return 57;\n break;\n case 35:\n return 54;\n break;\n case 36:\n this.begin(\"ID\");\n return 21;\n break;\n case 37:\n this.begin(\"ID\");\n return 23;\n break;\n case 38:\n return 29;\n break;\n case 39:\n return 30;\n break;\n case 40:\n this.begin(\"acc_title\");\n return 31;\n break;\n case 41:\n this.popState();\n return \"acc_title_value\";\n break;\n case 42:\n this.begin(\"acc_descr\");\n return 33;\n break;\n case 43:\n this.popState();\n return \"acc_descr_value\";\n break;\n case 44:\n this.begin(\"acc_descr_multiline\");\n break;\n case 45:\n this.popState();\n break;\n case 46:\n return \"acc_descr_multiline_value\";\n break;\n case 47:\n return 6;\n break;\n case 48:\n return 18;\n break;\n case 49:\n return 20;\n break;\n case 50:\n return 64;\n break;\n case 51:\n return 5;\n break;\n case 52:\n yy_.yytext = yy_.yytext.trim();\n return 70;\n break;\n case 53:\n return 73;\n break;\n case 54:\n return 74;\n break;\n case 55:\n return 75;\n break;\n case 56:\n return 76;\n break;\n case 57:\n return 71;\n break;\n case 58:\n return 72;\n break;\n case 59:\n return 77;\n break;\n case 60:\n return 78;\n break;\n case 61:\n return 79;\n break;\n case 62:\n return 80;\n break;\n case 63:\n return 81;\n break;\n case 64:\n return 68;\n break;\n case 65:\n return 69;\n break;\n case 66:\n return 5;\n break;\n case 67:\n return \"INVALID\";\n break;\n }\n }, \"anonymous\"),\n rules: [/^(?:[\\n]+)/i, /^(?:\\s+)/i, /^(?:((?!\\n)\\s)+)/i, /^(?:#[^\\n]*)/i, /^(?:%(?!\\{)[^\\n]*)/i, /^(?:[^\\}]%%[^\\n]*)/i, /^(?:[0-9]+(?=[ \\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],\n conditions: { \"acc_descr_multiline\": { \"rules\": [45, 46], \"inclusive\": false }, \"acc_descr\": { \"rules\": [43], \"inclusive\": false }, \"acc_title\": { \"rules\": [41], \"inclusive\": false }, \"ID\": { \"rules\": [2, 3, 12], \"inclusive\": false }, \"ALIAS\": { \"rules\": [2, 3, 13, 14], \"inclusive\": false }, \"LINE\": { \"rules\": [2, 3, 26], \"inclusive\": false }, \"INITIAL\": { \"rules\": [0, 1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 42, 44, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67], \"inclusive\": true } }\n };\n return lexer2;\n }();\n parser2.lexer = lexer;\n function Parser() {\n this.yy = {};\n }\n __name(Parser, \"Parser\");\n Parser.prototype = parser2;\n parser2.Parser = Parser;\n return new Parser();\n}();\nparser.parser = parser;\nvar sequenceDiagram_default = parser;\n\n// src/diagrams/sequence/sequenceDb.ts\nvar 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};\nvar ARROWTYPE = {\n FILLED: 0,\n OPEN: 1\n};\nvar PLACEMENT = {\n LEFTOF: 0,\n RIGHTOF: 1,\n OVER: 2\n};\nvar SequenceDB = class {\n constructor() {\n this.state = new ImperativeState(() => ({\n prevActor: void 0,\n actors: /* @__PURE__ */ new Map(),\n createdActors: /* @__PURE__ */ new Map(),\n destroyedActors: /* @__PURE__ */ new Map(),\n boxes: [],\n messages: [],\n notes: [],\n sequenceNumbersEnabled: false,\n wrapEnabled: void 0,\n currentBox: void 0,\n lastCreated: void 0,\n lastDestroyed: void 0\n }));\n this.setAccTitle = setAccTitle;\n this.setAccDescription = setAccDescription;\n this.setDiagramTitle = setDiagramTitle;\n this.getAccTitle = getAccTitle;\n this.getAccDescription = getAccDescription;\n this.getDiagramTitle = getDiagramTitle;\n this.apply = this.apply.bind(this);\n this.parseBoxData = this.parseBoxData.bind(this);\n this.parseMessage = this.parseMessage.bind(this);\n this.clear();\n this.setWrap(getConfig2().wrap);\n this.LINETYPE = LINETYPE;\n this.ARROWTYPE = ARROWTYPE;\n this.PLACEMENT = PLACEMENT;\n }\n static {\n __name(this, \"SequenceDB\");\n }\n addBox(data) {\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 addActor(id, name, description, type) {\n let assignedBox = this.state.records.currentBox;\n const old = this.state.records.actors.get(id);\n if (old) {\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 assignedBox = old.box ? old.box : this.state.records.currentBox;\n old.box = assignedBox;\n if (old && name === old.name && description == null) {\n return;\n }\n }\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 this.state.records.actors.set(id, {\n box: assignedBox,\n 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 if (this.state.records.currentBox) {\n this.state.records.currentBox.actorKeys.push(id);\n }\n this.state.records.prevActor = id;\n }\n activationCount(part) {\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 (this.state.records.messages[i].type === this.LINETYPE.ACTIVE_START && this.state.records.messages[i].from === part) {\n count++;\n }\n if (this.state.records.messages[i].type === this.LINETYPE.ACTIVE_END && this.state.records.messages[i].from === part) {\n count--;\n }\n }\n return count;\n }\n addMessage(idFrom, idTo, message, answer) {\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\n });\n }\n addSignal(idFrom, idTo, message, messageType, activate = false) {\n if (messageType === this.LINETYPE.ACTIVE_END) {\n const cnt = this.activationCount(idFrom ?? \"\");\n if (cnt < 1) {\n const error = new Error(\"Trying to inactivate an inactive participant (\" + idFrom + \")\");\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 hasAtLeastOneBox() {\n return this.state.records.boxes.length > 0;\n }\n hasAtLeastOneBoxWithTitle() {\n return this.state.records.boxes.some((b) => b.name);\n }\n getMessages() {\n return this.state.records.messages;\n }\n getBoxes() {\n return this.state.records.boxes;\n }\n getActors() {\n return this.state.records.actors;\n }\n getCreatedActors() {\n return this.state.records.createdActors;\n }\n getDestroyedActors() {\n return this.state.records.destroyedActors;\n }\n getActor(id) {\n return this.state.records.actors.get(id);\n }\n getActorKeys() {\n return [...this.state.records.actors.keys()];\n }\n enableSequenceNumbers() {\n this.state.records.sequenceNumbersEnabled = true;\n }\n disableSequenceNumbers() {\n this.state.records.sequenceNumbersEnabled = false;\n }\n showSequenceNumbers() {\n return this.state.records.sequenceNumbersEnabled;\n }\n setWrap(wrapSetting) {\n this.state.records.wrapEnabled = wrapSetting;\n }\n extractWrap(text) {\n if (text === void 0) {\n return {};\n }\n text = text.trim();\n const wrap = /^:?wrap:/.exec(text) !== null ? true : /^:?nowrap:/.exec(text) !== null ? false : void 0;\n const cleanedText = (wrap === void 0 ? text : text.replace(/^:?(?:no)?wrap:/, \"\")).trim();\n return { cleanedText, wrap };\n }\n autoWrap() {\n if (this.state.records.wrapEnabled !== void 0) {\n return this.state.records.wrapEnabled;\n }\n return getConfig2().sequence?.wrap ?? false;\n }\n clear() {\n this.state.reset();\n clear();\n }\n parseMessage(str) {\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 // 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 parseBoxData(str) {\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() : void 0;\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, getConfig2()) : void 0,\n color,\n wrap\n };\n }\n addNote(actor, placement, message) {\n const note = {\n actor,\n placement,\n message: message.text,\n wrap: message.wrap ?? this.autoWrap()\n };\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\n });\n }\n addLinks(actorId, text) {\n const actor = this.getActor(actorId);\n try {\n let sanitizedText = sanitizeText(text.text, getConfig2());\n sanitizedText = sanitizedText.replace(/=/g, \"=\");\n sanitizedText = sanitizedText.replace(/&/g, \"&\");\n const links = JSON.parse(sanitizedText);\n this.insertLinks(actor, links);\n } catch (e) {\n log.error(\"error while parsing actor link text\", e);\n }\n }\n addALink(actorId, text) {\n const actor = this.getActor(actorId);\n try {\n const links = {};\n let sanitizedText = sanitizeText(text.text, getConfig2());\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 links[label] = link;\n this.insertLinks(actor, links);\n } catch (e) {\n log.error(\"error while parsing actor link text\", e);\n }\n }\n insertLinks(actor, links) {\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 addProperties(actorId, text) {\n const actor = this.getActor(actorId);\n try {\n const sanitizedText = sanitizeText(text.text, getConfig2());\n const properties = JSON.parse(sanitizedText);\n this.insertProperties(actor, properties);\n } catch (e) {\n log.error(\"error while parsing actor properties text\", e);\n }\n }\n insertProperties(actor, properties) {\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 boxEnd() {\n this.state.records.currentBox = void 0;\n }\n addDetails(actorId, text) {\n const actor = this.getActor(actorId);\n const elem = document.getElementById(text.text);\n try {\n const text2 = elem.innerHTML;\n const details = JSON.parse(text2);\n if (details.properties) {\n this.insertProperties(actor, details.properties);\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 getActorProperty(actor, key) {\n if (actor?.properties !== void 0) {\n return actor.properties[key];\n }\n return void 0;\n }\n // eslint-disable-next-line @typescript-eslint/no-explicit-any, @typescript-eslint/no-redundant-type-constituents\n apply(param) {\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: void 0,\n to: void 0,\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);\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);\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, void 0, void 0, param.signalType);\n break;\n case \"activeEnd\":\n this.addSignal(param.actor, void 0, void 0, 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 \" + this.state.records.lastCreated.name + \" does not have an associated creating message after its declaration. Please check the sequence diagram.\"\n );\n } else {\n this.state.records.lastCreated = void 0;\n }\n } else if (this.state.records.lastDestroyed) {\n if (param.to !== this.state.records.lastDestroyed && param.from !== this.state.records.lastDestroyed) {\n throw new Error(\n \"The destroyed participant \" + this.state.records.lastDestroyed.name + \" does not have an associated destroying message after its declaration. Please check the sequence diagram.\"\n );\n } else {\n this.state.records.lastDestroyed = void 0;\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(void 0, void 0, param.loopText, param.signalType);\n break;\n case \"loopEnd\":\n this.addSignal(void 0, void 0, void 0, param.signalType);\n break;\n case \"rectStart\":\n this.addSignal(void 0, void 0, param.color, param.signalType);\n break;\n case \"rectEnd\":\n this.addSignal(void 0, void 0, void 0, param.signalType);\n break;\n case \"optStart\":\n this.addSignal(void 0, void 0, param.optText, param.signalType);\n break;\n case \"optEnd\":\n this.addSignal(void 0, void 0, void 0, param.signalType);\n break;\n case \"altStart\":\n this.addSignal(void 0, void 0, param.altText, param.signalType);\n break;\n case \"else\":\n this.addSignal(void 0, void 0, param.altText, param.signalType);\n break;\n case \"altEnd\":\n this.addSignal(void 0, void 0, void 0, param.signalType);\n break;\n case \"setAccTitle\":\n setAccTitle(param.text);\n break;\n case \"parStart\":\n this.addSignal(void 0, void 0, param.parText, param.signalType);\n break;\n case \"and\":\n this.addSignal(void 0, void 0, param.parText, param.signalType);\n break;\n case \"parEnd\":\n this.addSignal(void 0, void 0, void 0, param.signalType);\n break;\n case \"criticalStart\":\n this.addSignal(void 0, void 0, param.criticalText, param.signalType);\n break;\n case \"option\":\n this.addSignal(void 0, void 0, param.optionText, param.signalType);\n break;\n case \"criticalEnd\":\n this.addSignal(void 0, void 0, void 0, param.signalType);\n break;\n case \"breakStart\":\n this.addSignal(void 0, void 0, param.breakText, param.signalType);\n break;\n case \"breakEnd\":\n this.addSignal(void 0, void 0, void 0, param.signalType);\n break;\n }\n }\n }\n getConfig() {\n return getConfig2().sequence;\n }\n};\n\n// src/diagrams/sequence/styles.js\nvar getStyles = /* @__PURE__ */ __name((options) => `.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 .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`, \"getStyles\");\nvar styles_default = getStyles;\n\n// src/diagrams/sequence/sequenceRenderer.ts\nimport { select } from \"d3\";\n\n// src/diagrams/sequence/svgDraw.js\nimport { sanitizeUrl } from \"@braintree/sanitize-url\";\nvar ACTOR_TYPE_WIDTH = 18 * 2;\nvar TOP_ACTOR_CLASS = \"actor-top\";\nvar BOTTOM_ACTOR_CLASS = \"actor-bottom\";\nvar ACTOR_BOX_CLASS = \"actor-box\";\nvar ACTOR_MAN_FIGURE_CLASS = \"actor-man\";\nvar drawRect2 = /* @__PURE__ */ __name(function(elem, rectData) {\n return drawRect(elem, rectData);\n}, \"drawRect\");\nvar drawPopup = /* @__PURE__ */ __name(function(elem, actor, minMenuWidth, textAttrs, forceMenus) {\n if (actor.links === void 0 || actor.links === null || Object.keys(actor.links).length === 0) {\n return { height: 0, width: 0 };\n }\n const links = actor.links;\n const actorCnt2 = actor.actorCnt;\n const rectData = actor.rectData;\n var displayValue = \"none\";\n if (forceMenus) {\n displayValue = \"block !important\";\n }\n const g = elem.append(\"g\");\n g.attr(\"id\", \"actor\" + actorCnt2 + \"_popup\");\n g.attr(\"class\", \"actorPopupMenu\");\n g.attr(\"display\", displayValue);\n var actorClass = \"\";\n if (rectData.class !== void 0) {\n actorClass = \" \" + rectData.class;\n }\n let menuWidth = rectData.width > minMenuWidth ? rectData.width : minMenuWidth;\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 _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 linkY += 30;\n }\n }\n rectElem.attr(\"height\", linkY);\n return { height: rectData.height + linkY, width: menuWidth };\n}, \"drawPopup\");\nvar popupMenuToggle = /* @__PURE__ */ __name(function(popId) {\n return \"var pu = document.getElementById('\" + popId + \"'); if (pu != null) { pu.style.display = pu.style.display == 'block' ? 'none' : 'block'; }\";\n}, \"popupMenuToggle\");\nvar drawKatex = /* @__PURE__ */ __name(async function(elem, textData, msgModel = null) {\n let textElem = elem.append(\"foreignObject\");\n const lines = await renderKatex(textData.text, getConfig());\n const divElem = textElem.append(\"xhtml:div\").attr(\"style\", \"width: fit-content;\").attr(\"xmlns\", \"http://www.w3.org/1999/xhtml\").html(lines);\n const dim = divElem.node().getBoundingClientRect();\n textElem.attr(\"height\", Math.round(dim.height)).attr(\"width\", Math.round(dim.width));\n if (textData.class === \"noteText\") {\n const rectElem = elem.node().firstChild;\n rectElem.setAttribute(\"height\", dim.height + 2 * textData.textMargin);\n const rectDim = rectElem.getBBox();\n 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));\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 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 return [textElem];\n}, \"drawKatex\");\nvar drawText = /* @__PURE__ */ __name(function(elem, textData) {\n let prevTextHeight = 0;\n let textHeight = 0;\n const lines = textData.text.split(common_default.lineBreakRegex);\n const [_textFontSize, _textFontSizePx] = parseFontSize(textData.fontSize);\n let textElems = [];\n let dy = 0;\n let yfunc = /* @__PURE__ */ __name(() => textData.y, \"yfunc\");\n if (textData.valign !== void 0 && textData.textMargin !== void 0 && textData.textMargin > 0) {\n switch (textData.valign) {\n case \"top\":\n case \"start\":\n yfunc = /* @__PURE__ */ __name(() => Math.round(textData.y + textData.textMargin), \"yfunc\");\n break;\n case \"middle\":\n case \"center\":\n yfunc = /* @__PURE__ */ __name(() => Math.round(textData.y + (prevTextHeight + textHeight + textData.textMargin) / 2), \"yfunc\");\n break;\n case \"bottom\":\n case \"end\":\n yfunc = /* @__PURE__ */ __name(() => Math.round(\n textData.y + (prevTextHeight + textHeight + 2 * textData.textMargin) - textData.textMargin\n ), \"yfunc\");\n break;\n }\n }\n if (textData.anchor !== void 0 && textData.textMargin !== void 0 && textData.width !== void 0) {\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 for (let [i, line] of lines.entries()) {\n if (textData.textMargin !== void 0 && textData.textMargin === 0 && _textFontSize !== void 0) {\n dy = i * _textFontSize;\n }\n const textElem = elem.append(\"text\");\n textElem.attr(\"x\", textData.x);\n textElem.attr(\"y\", yfunc());\n if (textData.anchor !== void 0) {\n textElem.attr(\"text-anchor\", textData.anchor).attr(\"dominant-baseline\", textData.dominantBaseline).attr(\"alignment-baseline\", textData.alignmentBaseline);\n }\n if (textData.fontFamily !== void 0) {\n textElem.style(\"font-family\", textData.fontFamily);\n }\n if (_textFontSizePx !== void 0) {\n textElem.style(\"font-size\", _textFontSizePx);\n }\n if (textData.fontWeight !== void 0) {\n textElem.style(\"font-weight\", textData.fontWeight);\n }\n if (textData.fill !== void 0) {\n textElem.attr(\"fill\", textData.fill);\n }\n if (textData.class !== void 0) {\n textElem.attr(\"class\", textData.class);\n }\n if (textData.dy !== void 0) {\n textElem.attr(\"dy\", textData.dy);\n } else if (dy !== 0) {\n textElem.attr(\"dy\", dy);\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 !== void 0) {\n span.attr(\"fill\", textData.fill);\n }\n span.text(text);\n } else {\n textElem.text(text);\n }\n if (textData.valign !== void 0 && textData.textMargin !== void 0 && textData.textMargin > 0) {\n textHeight += (textElem._groups || textElem)[0][0].getBBox().height;\n prevTextHeight = textHeight;\n }\n textElems.push(textElem);\n }\n return textElems;\n}, \"drawText\");\nvar drawLabel = /* @__PURE__ */ __name(function(elem, txtObject) {\n function genPoints(x, y, width, height, cut) {\n return x + \",\" + y + \" \" + (x + width) + \",\" + y + \" \" + (x + width) + \",\" + (y + height - cut) + \" \" + (x + width - cut * 1.2) + \",\" + (y + height) + \" \" + x + \",\" + (y + height);\n }\n __name(genPoints, \"genPoints\");\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 txtObject.y = txtObject.y + txtObject.height / 2;\n drawText(elem, txtObject);\n return polygon;\n}, \"drawLabel\");\nvar actorCnt = -1;\nvar fixLifeLineHeights = /* @__PURE__ */ __name((diagram2, actors, actorKeys, conf2) => {\n if (!diagram2.select) {\n return;\n }\n actorKeys.forEach((actorKey) => {\n const actor = actors.get(actorKey);\n const actorDOM = diagram2.select(\"#actor\" + actor.actorCnt);\n if (!conf2.mirrorActors && actor.stopy) {\n actorDOM.attr(\"y2\", actor.stopy + actor.height / 2);\n } else if (conf2.mirrorActors) {\n actorDOM.attr(\"y2\", actor.stopy);\n }\n });\n}, \"fixLifeLineHeights\");\nvar drawActorTypeParticipant = /* @__PURE__ */ __name(function(elem, actor, conf2, isFooter) {\n const actorY = isFooter ? actor.stopy : actor.starty;\n const center = actor.x + actor.width / 2;\n const centerY = actorY + actor.height;\n const boxplusLineGroup = elem.append(\"g\").lower();\n var g = boxplusLineGroup;\n if (!isFooter) {\n actorCnt++;\n if (Object.keys(actor.links || {}).length && !conf2.forceMenus) {\n g.attr(\"onclick\", popupMenuToggle(`actor${actorCnt}_popup`)).attr(\"cursor\", \"pointer\");\n }\n 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);\n g = boxplusLineGroup.append(\"g\");\n actor.actorCnt = actorCnt;\n if (actor.links != null) {\n g.attr(\"id\", \"root-\" + actorCnt);\n }\n }\n const rect = 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 = drawRect2(g, rect);\n actor.rectData = rect;\n if (actor.properties?.icon) {\n const iconSrc = actor.properties.icon.trim();\n if (iconSrc.charAt(0) === \"@\") {\n drawEmbeddedImage(g, rect.x + rect.width - 20, rect.y + 10, iconSrc.substr(1));\n } else {\n drawImage(g, rect.x + rect.width - 20, rect.y + 10, iconSrc);\n }\n }\n _drawTextCandidateFunc(conf2, 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 conf2\n );\n let height = actor.height;\n if (rectElem.node) {\n const bounds2 = rectElem.node().getBBox();\n actor.height = bounds2.height;\n height = bounds2.height;\n }\n return height;\n}, \"drawActorTypeParticipant\");\nvar drawActorTypeActor = /* @__PURE__ */ __name(function(elem, actor, conf2, isFooter) {\n const actorY = isFooter ? actor.stopy : actor.starty;\n const center = actor.x + actor.width / 2;\n const centerY = actorY + 80;\n const line = elem.append(\"g\").lower();\n if (!isFooter) {\n actorCnt++;\n 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);\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 const rect = 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 actElem.append(\"line\").attr(\"id\", \"actor-man-torso\" + actorCnt).attr(\"x1\", center).attr(\"y1\", actorY + 25).attr(\"x2\", center).attr(\"y2\", actorY + 45);\n 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);\n actElem.append(\"line\").attr(\"x1\", center - ACTOR_TYPE_WIDTH / 2).attr(\"y1\", actorY + 60).attr(\"x2\", center).attr(\"y2\", actorY + 45);\n actElem.append(\"line\").attr(\"x1\", center).attr(\"y1\", actorY + 45).attr(\"x2\", center + ACTOR_TYPE_WIDTH / 2 - 2).attr(\"y2\", actorY + 60);\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 const bounds2 = actElem.node().getBBox();\n actor.height = bounds2.height;\n _drawTextCandidateFunc(conf2, 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 conf2\n );\n return actor.height;\n}, \"drawActorTypeActor\");\nvar drawActor = /* @__PURE__ */ __name(async function(elem, actor, conf2, isFooter) {\n switch (actor.type) {\n case \"actor\":\n return await drawActorTypeActor(elem, actor, conf2, isFooter);\n case \"participant\":\n return await drawActorTypeParticipant(elem, actor, conf2, isFooter);\n }\n}, \"drawActor\");\nvar drawBox = /* @__PURE__ */ __name(function(elem, box, conf2) {\n const boxplusTextGroup = elem.append(\"g\");\n const g = boxplusTextGroup;\n drawBackgroundRect2(g, box);\n if (box.name) {\n _drawTextCandidateFunc(conf2)(\n box.name,\n g,\n box.x,\n box.y + (box.textMaxHeight || 0) / 2,\n box.width,\n 0,\n { class: \"text\" },\n conf2\n );\n }\n g.lower();\n}, \"drawBox\");\nvar anchorElement = /* @__PURE__ */ __name(function(elem) {\n return elem.append(\"g\");\n}, \"anchorElement\");\nvar drawActivation = /* @__PURE__ */ __name(function(elem, bounds2, verticalPos, conf2, actorActivations2) {\n const rect = getNoteRect();\n const g = bounds2.anchored;\n rect.x = bounds2.startx;\n rect.y = bounds2.starty;\n rect.class = \"activation\" + actorActivations2 % 3;\n rect.width = bounds2.stopx - bounds2.startx;\n rect.height = verticalPos - bounds2.starty;\n drawRect2(g, rect);\n}, \"drawActivation\");\nvar drawLoop = /* @__PURE__ */ __name(async function(elem, loopModel, labelText, conf2) {\n const {\n boxMargin,\n boxTextMargin,\n labelBoxHeight,\n labelBoxWidth,\n messageFontFamily: fontFamily,\n messageFontSize: fontSize,\n messageFontWeight: fontWeight\n } = conf2;\n const g = elem.append(\"g\");\n const drawLoopLine = /* @__PURE__ */ __name(function(startx, starty, stopx, stopy) {\n return g.append(\"line\").attr(\"x1\", startx).attr(\"y1\", starty).attr(\"x2\", stopx).attr(\"y2\", stopy).attr(\"class\", \"loopLine\");\n }, \"drawLoopLine\");\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 !== void 0) {\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 let txt = 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 drawLabel(g, txt);\n txt = getTextObj2();\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 let textElem = hasKatex(txt.text) ? await drawKatex(g, txt, loopModel) : drawText(g, txt);\n if (loopModel.sectionTitles !== void 0) {\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 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.map((te) => (te._groups || te)[0][0].getBBox().height).reduce((acc, curr) => acc + curr)\n );\n loopModel.sections[idx].height += sectionHeight - (boxMargin + boxTextMargin);\n }\n }\n }\n loopModel.height = Math.round(loopModel.stopy - loopModel.starty);\n return g;\n}, \"drawLoop\");\nvar drawBackgroundRect2 = /* @__PURE__ */ __name(function(elem, bounds2) {\n drawBackgroundRect(elem, bounds2);\n}, \"drawBackgroundRect\");\nvar insertDatabaseIcon = /* @__PURE__ */ __name(function(elem) {\n elem.append(\"defs\").append(\"symbol\").attr(\"id\", \"database\").attr(\"fill-rule\", \"evenodd\").attr(\"clip-rule\", \"evenodd\").append(\"path\").attr(\"transform\", \"scale(.5)\").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}, \"insertDatabaseIcon\");\nvar insertComputerIcon = /* @__PURE__ */ __name(function(elem) {\n elem.append(\"defs\").append(\"symbol\").attr(\"id\", \"computer\").attr(\"width\", \"24\").attr(\"height\", \"24\").append(\"path\").attr(\"transform\", \"scale(.5)\").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}, \"insertComputerIcon\");\nvar insertClockIcon = /* @__PURE__ */ __name(function(elem) {\n elem.append(\"defs\").append(\"symbol\").attr(\"id\", \"clock\").attr(\"width\", \"24\").attr(\"height\", \"24\").append(\"path\").attr(\"transform\", \"scale(.5)\").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}, \"insertClockIcon\");\nvar insertArrowHead = /* @__PURE__ */ __name(function(elem) {\n 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\");\n}, \"insertArrowHead\");\nvar insertArrowFilledHead = /* @__PURE__ */ __name(function(elem) {\n 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\");\n}, \"insertArrowFilledHead\");\nvar insertSequenceNumber = /* @__PURE__ */ __name(function(elem) {\n 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);\n}, \"insertSequenceNumber\");\nvar insertArrowCrossHead = /* @__PURE__ */ __name(function(elem) {\n const defs = elem.append(\"defs\");\n const marker = defs.append(\"marker\").attr(\"id\", \"crosshead\").attr(\"markerWidth\", 15).attr(\"markerHeight\", 8).attr(\"orient\", \"auto\").attr(\"refX\", 4).attr(\"refY\", 4.5);\n 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\");\n}, \"insertArrowCrossHead\");\nvar getTextObj2 = /* @__PURE__ */ __name(function() {\n return {\n x: 0,\n y: 0,\n fill: void 0,\n anchor: void 0,\n style: \"#666\",\n width: void 0,\n height: void 0,\n textMargin: 0,\n rx: 0,\n ry: 0,\n tspan: true,\n valign: void 0\n };\n}, \"getTextObj\");\nvar getNoteRect2 = /* @__PURE__ */ __name(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}, \"getNoteRect\");\nvar _drawTextCandidateFunc = /* @__PURE__ */ function() {\n function byText(content, g, x, y, width, height, textAttrs) {\n const text = g.append(\"text\").attr(\"x\", x + width / 2).attr(\"y\", y + height / 2 + 5).style(\"text-anchor\", \"middle\").text(content);\n _setTextAttrs(text, textAttrs);\n }\n __name(byText, \"byText\");\n function byTspan(content, g, x, y, width, height, textAttrs, conf2) {\n const { actorFontSize, actorFontFamily, actorFontWeight } = conf2;\n const [_actorFontSize, _actorFontSizePx] = parseFontSize(actorFontSize);\n const lines = content.split(common_default.lineBreakRegex);\n for (let i = 0; i < lines.length; i++) {\n const dy = i * _actorFontSize - _actorFontSize * (lines.length - 1) / 2;\n 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);\n text.append(\"tspan\").attr(\"x\", x + width / 2).attr(\"dy\", dy).text(lines[i]);\n text.attr(\"y\", y + height / 2).attr(\"dominant-baseline\", \"central\").attr(\"alignment-baseline\", \"central\");\n _setTextAttrs(text, textAttrs);\n }\n }\n __name(byTspan, \"byTspan\");\n function byFo(content, g, x, y, width, height, textAttrs, conf2) {\n const s = g.append(\"switch\");\n const f = s.append(\"foreignObject\").attr(\"x\", x).attr(\"y\", y).attr(\"width\", width).attr(\"height\", height);\n const text = f.append(\"xhtml:div\").style(\"display\", \"table\").style(\"height\", \"100%\").style(\"width\", \"100%\");\n text.append(\"div\").style(\"display\", \"table-cell\").style(\"text-align\", \"center\").style(\"vertical-align\", \"middle\").text(content);\n byTspan(content, s, x, y, width, height, textAttrs, conf2);\n _setTextAttrs(text, textAttrs);\n }\n __name(byFo, \"byFo\");\n async function byKatex(content, g, x, y, width, height, textAttrs, conf2) {\n const dim = await calculateMathMLDimensions(content, getConfig());\n const s = g.append(\"switch\");\n 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);\n const text = f.append(\"xhtml:div\").style(\"height\", \"100%\").style(\"width\", \"100%\");\n text.append(\"div\").style(\"text-align\", \"center\").style(\"vertical-align\", \"middle\").html(await renderKatex(content, getConfig()));\n byTspan(content, s, x, y, width, height, textAttrs, conf2);\n _setTextAttrs(text, textAttrs);\n }\n __name(byKatex, \"byKatex\");\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 __name(_setTextAttrs, \"_setTextAttrs\");\n return function(conf2, hasKatex2 = false) {\n if (hasKatex2) {\n return byKatex;\n }\n return conf2.textPlacement === \"fo\" ? byFo : conf2.textPlacement === \"old\" ? byText : byTspan;\n };\n}();\nvar _drawMenuItemTextCandidateFunc = /* @__PURE__ */ function() {\n function byText(content, g, x, y, width, height, textAttrs) {\n const text = g.append(\"text\").attr(\"x\", x).attr(\"y\", y).style(\"text-anchor\", \"start\").text(content);\n _setTextAttrs(text, textAttrs);\n }\n __name(byText, \"byText\");\n function byTspan(content, g, x, y, width, height, textAttrs, conf2) {\n const { actorFontSize, actorFontFamily, actorFontWeight } = conf2;\n const lines = content.split(common_default.lineBreakRegex);\n for (let i = 0; i < lines.length; i++) {\n const dy = i * actorFontSize - actorFontSize * (lines.length - 1) / 2;\n 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);\n text.append(\"tspan\").attr(\"x\", x).attr(\"dy\", dy).text(lines[i]);\n text.attr(\"y\", y + height / 2).attr(\"dominant-baseline\", \"central\").attr(\"alignment-baseline\", \"central\");\n _setTextAttrs(text, textAttrs);\n }\n }\n __name(byTspan, \"byTspan\");\n function byFo(content, g, x, y, width, height, textAttrs, conf2) {\n const s = g.append(\"switch\");\n const f = s.append(\"foreignObject\").attr(\"x\", x).attr(\"y\", y).attr(\"width\", width).attr(\"height\", height);\n const text = f.append(\"xhtml:div\").style(\"display\", \"table\").style(\"height\", \"100%\").style(\"width\", \"100%\");\n text.append(\"div\").style(\"display\", \"table-cell\").style(\"text-align\", \"center\").style(\"vertical-align\", \"middle\").text(content);\n byTspan(content, s, x, y, width, height, textAttrs, conf2);\n _setTextAttrs(text, textAttrs);\n }\n __name(byFo, \"byFo\");\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 __name(_setTextAttrs, \"_setTextAttrs\");\n return function(conf2) {\n return conf2.textPlacement === \"fo\" ? byFo : conf2.textPlacement === \"old\" ? byText : byTspan;\n };\n}();\nvar svgDraw_default = {\n drawRect: drawRect2,\n drawText,\n drawLabel,\n drawActor,\n drawBox,\n drawPopup,\n anchorElement,\n drawActivation,\n drawLoop,\n drawBackgroundRect: drawBackgroundRect2,\n insertArrowHead,\n insertArrowFilledHead,\n insertSequenceNumber,\n insertArrowCrossHead,\n insertDatabaseIcon,\n insertComputerIcon,\n insertClockIcon,\n getTextObj: getTextObj2,\n getNoteRect: getNoteRect2,\n fixLifeLineHeights,\n sanitizeUrl\n};\n\n// src/diagrams/sequence/sequenceRenderer.ts\nvar conf = {};\nvar bounds = {\n data: {\n startx: void 0,\n stopx: void 0,\n starty: void 0,\n stopy: void 0\n },\n verticalPos: 0,\n sequenceItems: [],\n activations: [],\n models: {\n getHeight: /* @__PURE__ */ __name(function() {\n return Math.max.apply(\n null,\n this.actors.length === 0 ? [0] : this.actors.map((actor) => actor.height || 0)\n ) + (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));\n }, \"getHeight\"),\n clear: /* @__PURE__ */ __name(function() {\n this.actors = [];\n this.boxes = [];\n this.loops = [];\n this.messages = [];\n this.notes = [];\n }, \"clear\"),\n addBox: /* @__PURE__ */ __name(function(boxModel) {\n this.boxes.push(boxModel);\n }, \"addBox\"),\n addActor: /* @__PURE__ */ __name(function(actorModel) {\n this.actors.push(actorModel);\n }, \"addActor\"),\n addLoop: /* @__PURE__ */ __name(function(loopModel) {\n this.loops.push(loopModel);\n }, \"addLoop\"),\n addMessage: /* @__PURE__ */ __name(function(msgModel) {\n this.messages.push(msgModel);\n }, \"addMessage\"),\n addNote: /* @__PURE__ */ __name(function(noteModel) {\n this.notes.push(noteModel);\n }, \"addNote\"),\n lastActor: /* @__PURE__ */ __name(function() {\n return this.actors[this.actors.length - 1];\n }, \"lastActor\"),\n lastLoop: /* @__PURE__ */ __name(function() {\n return this.loops[this.loops.length - 1];\n }, \"lastLoop\"),\n lastMessage: /* @__PURE__ */ __name(function() {\n return this.messages[this.messages.length - 1];\n }, \"lastMessage\"),\n lastNote: /* @__PURE__ */ __name(function() {\n return this.notes[this.notes.length - 1];\n }, \"lastNote\"),\n actors: [],\n boxes: [],\n loops: [],\n messages: [],\n notes: []\n },\n init: /* @__PURE__ */ __name(function() {\n this.sequenceItems = [];\n this.activations = [];\n this.models.clear();\n this.data = {\n startx: void 0,\n stopx: void 0,\n starty: void 0,\n stopy: void 0\n };\n this.verticalPos = 0;\n setConf(getConfig2());\n }, \"init\"),\n updateVal: /* @__PURE__ */ __name(function(obj, key, val, fun) {\n if (obj[key] === void 0) {\n obj[key] = val;\n } else {\n obj[key] = fun(val, obj[key]);\n }\n }, \"updateVal\"),\n updateBounds: /* @__PURE__ */ __name(function(startx, starty, stopx, stopy) {\n const _self = this;\n let cnt = 0;\n function updateFn(type) {\n return /* @__PURE__ */ __name(function updateItemBounds(item) {\n cnt++;\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 _self.updateVal(bounds.data, \"startx\", startx - n * conf.boxMargin, Math.min);\n _self.updateVal(bounds.data, \"stopx\", stopx + n * conf.boxMargin, Math.max);\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 _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 }, \"updateItemBounds\");\n }\n __name(updateFn, \"updateFn\");\n this.sequenceItems.forEach(updateFn());\n this.activations.forEach(updateFn(\"activation\"));\n }, \"updateBounds\"),\n insert: /* @__PURE__ */ __name(function(startx, starty, stopx, stopy) {\n const _startx = common_default.getMin(startx, stopx);\n const _stopx = common_default.getMax(startx, stopx);\n const _starty = common_default.getMin(starty, stopy);\n const _stopy = common_default.getMax(starty, stopy);\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 this.updateBounds(_startx, _starty, _stopx, _stopy);\n }, \"insert\"),\n newActivation: /* @__PURE__ */ __name(function(message, diagram2, 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: void 0,\n actor: message.from,\n anchored: svgDraw_default.anchorElement(diagram2)\n });\n }, \"newActivation\"),\n endActivation: /* @__PURE__ */ __name(function(message) {\n const lastActorActivationIdx = this.activations.map(function(activation) {\n return activation.actor;\n }).lastIndexOf(message.from);\n return this.activations.splice(lastActorActivationIdx, 1)[0];\n }, \"endActivation\"),\n createLoop: /* @__PURE__ */ __name(function(title = { message: void 0, wrap: false, width: void 0 }, fill) {\n return {\n startx: void 0,\n starty: this.verticalPos,\n stopx: void 0,\n stopy: void 0,\n title: title.message,\n wrap: title.wrap,\n width: title.width,\n height: 0,\n fill\n };\n }, \"createLoop\"),\n newLoop: /* @__PURE__ */ __name(function(title = { message: void 0, wrap: false, width: void 0 }, fill) {\n this.sequenceItems.push(this.createLoop(title, fill));\n }, \"newLoop\"),\n endLoop: /* @__PURE__ */ __name(function() {\n return this.sequenceItems.pop();\n }, \"endLoop\"),\n isLoopOverlap: /* @__PURE__ */ __name(function() {\n return this.sequenceItems.length ? this.sequenceItems[this.sequenceItems.length - 1].overlap : false;\n }, \"isLoopOverlap\"),\n addSectionToLoop: /* @__PURE__ */ __name(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 }, \"addSectionToLoop\"),\n saveVerticalPos: /* @__PURE__ */ __name(function() {\n if (this.isLoopOverlap()) {\n this.savedVerticalPos = this.verticalPos;\n }\n }, \"saveVerticalPos\"),\n resetVerticalPos: /* @__PURE__ */ __name(function() {\n if (this.isLoopOverlap()) {\n this.verticalPos = this.savedVerticalPos;\n }\n }, \"resetVerticalPos\"),\n bumpVerticalPos: /* @__PURE__ */ __name(function(bump) {\n this.verticalPos = this.verticalPos + bump;\n this.data.stopy = common_default.getMax(this.data.stopy, this.verticalPos);\n }, \"bumpVerticalPos\"),\n getVerticalPos: /* @__PURE__ */ __name(function() {\n return this.verticalPos;\n }, \"getVerticalPos\"),\n getBounds: /* @__PURE__ */ __name(function() {\n return { bounds: this.data, models: this.models };\n }, \"getBounds\")\n};\nvar drawNote = /* @__PURE__ */ __name(async function(elem, noteModel) {\n bounds.bumpVerticalPos(conf.boxMargin);\n noteModel.height = conf.boxMargin;\n noteModel.starty = bounds.getVerticalPos();\n const rect = getNoteRect();\n rect.x = noteModel.startx;\n rect.y = noteModel.starty;\n rect.width = noteModel.width || conf.width;\n rect.class = \"note\";\n const g = elem.append(\"g\");\n const rectElem = svgDraw_default.drawRect(g, rect);\n const textObj = 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 const textElem = hasKatex(textObj.text) ? await drawKatex(g, textObj) : drawText(g, textObj);\n const textHeight = Math.round(\n textElem.map((te) => (te._groups || te)[0][0].getBBox().height).reduce((acc, curr) => acc + curr)\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}, \"drawNote\");\nvar messageFont = /* @__PURE__ */ __name((cnf) => {\n return {\n fontFamily: cnf.messageFontFamily,\n fontSize: cnf.messageFontSize,\n fontWeight: cnf.messageFontWeight\n };\n}, \"messageFont\");\nvar noteFont = /* @__PURE__ */ __name((cnf) => {\n return {\n fontFamily: cnf.noteFontFamily,\n fontSize: cnf.noteFontSize,\n fontWeight: cnf.noteFontWeight\n };\n}, \"noteFont\");\nvar actorFont = /* @__PURE__ */ __name((cnf) => {\n return {\n fontFamily: cnf.actorFontFamily,\n fontSize: cnf.actorFontSize,\n fontWeight: cnf.actorFontWeight\n };\n}, \"actorFont\");\nasync function boundMessage(_diagram, msgModel) {\n bounds.bumpVerticalPos(10);\n const { startx, stopx, message } = msgModel;\n const lines = common_default.splitBreaks(message).length;\n const isKatexMsg = hasKatex(message);\n const textDims = isKatexMsg ? await calculateMathMLDimensions(message, getConfig2()) : utils_default.calculateTextDimensions(message, messageFont(conf));\n if (!isKatexMsg) {\n const lineHeight = textDims.height / lines;\n msgModel.height += lineHeight;\n bounds.bumpVerticalPos(lineHeight);\n }\n let lineStartY;\n let totalOffset = textDims.height - 10;\n const textWidth = textDims.width;\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_default.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 return lineStartY;\n}\n__name(boundMessage, \"boundMessage\");\nvar drawMessage = /* @__PURE__ */ __name(async function(diagram2, msgModel, lineStartY, diagObj) {\n const { startx, stopx, starty, message, type, sequenceIndex, sequenceVisible } = msgModel;\n const textDims = utils_default.calculateTextDimensions(message, messageFont(conf));\n const textObj = 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 if (hasKatex(textObj.text)) {\n await drawKatex(diagram2, textObj, { startx, stopx, starty: lineStartY });\n } else {\n drawText(diagram2, textObj);\n }\n const textWidth = textDims.width;\n let line;\n if (startx === stopx) {\n if (conf.rightAngles) {\n line = diagram2.append(\"path\").attr(\n \"d\",\n `M ${startx},${lineStartY} H ${startx + common_default.getMax(conf.width / 2, textWidth / 2)} V ${lineStartY + 25} H ${startx}`\n );\n } else {\n line = diagram2.append(\"path\").attr(\n \"d\",\n \"M \" + startx + \",\" + lineStartY + \" C \" + (startx + 60) + \",\" + (lineStartY - 10) + \" \" + (startx + 60) + \",\" + (lineStartY + 30) + \" \" + startx + \",\" + (lineStartY + 20)\n );\n }\n } else {\n line = diagram2.append(\"line\");\n line.attr(\"x1\", startx);\n line.attr(\"y1\", lineStartY);\n line.attr(\"x2\", stopx);\n line.attr(\"y2\", lineStartY);\n }\n 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) {\n line.style(\"stroke-dasharray\", \"3, 3\");\n line.attr(\"class\", \"messageLine1\");\n } else {\n line.attr(\"class\", \"messageLine0\");\n }\n let url = \"\";\n if (conf.arrowMarkerAbsolute) {\n url = window.location.protocol + \"//\" + window.location.host + window.location.pathname + window.location.search;\n url = url.replace(/\\(/g, \"\\\\(\");\n url = url.replace(/\\)/g, \"\\\\)\");\n }\n line.attr(\"stroke-width\", 2);\n line.attr(\"stroke\", \"none\");\n line.style(\"fill\", \"none\");\n if (type === diagObj.db.LINETYPE.SOLID || type === diagObj.db.LINETYPE.DOTTED) {\n line.attr(\"marker-end\", \"url(\" + url + \"#arrowhead)\");\n }\n if (type === diagObj.db.LINETYPE.BIDIRECTIONAL_SOLID || type === diagObj.db.LINETYPE.BIDIRECTIONAL_DOTTED) {\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 if (type === diagObj.db.LINETYPE.SOLID_CROSS || type === diagObj.db.LINETYPE.DOTTED_CROSS) {\n line.attr(\"marker-end\", \"url(\" + url + \"#crosshead)\");\n }\n if (sequenceVisible || conf.showSequenceNumbers) {\n line.attr(\"marker-start\", \"url(\" + url + \"#sequencenumber)\");\n 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);\n }\n}, \"drawMessage\");\nvar addActorRenderingData = /* @__PURE__ */ __name(function(diagram2, actors, createdActors, actorKeys, verticalPos, messages, isFooter) {\n let prevWidth = 0;\n let prevMargin = 0;\n let prevBox = void 0;\n let maxHeight = 0;\n for (const actorKey of actorKeys) {\n const actor = actors.get(actorKey);\n const box = actor.box;\n if (prevBox && prevBox != box) {\n if (!isFooter) {\n bounds.models.addBox(prevBox);\n }\n prevMargin += conf.boxMargin + prevBox.margin;\n }\n if (box && box != prevBox) {\n if (!isFooter) {\n box.x = prevWidth + prevMargin;\n box.y = verticalPos;\n }\n prevMargin += box.margin;\n }\n actor.width = actor.width || conf.width;\n actor.height = common_default.getMax(actor.height || conf.height, conf.height);\n actor.margin = actor.margin || conf.actorMargin;\n maxHeight = common_default.getMax(maxHeight, actor.height);\n if (createdActors.get(actor.name)) {\n prevMargin += actor.width / 2;\n }\n actor.x = prevWidth + prevMargin;\n actor.starty = bounds.getVerticalPos();\n bounds.insert(actor.x, verticalPos, actor.x + actor.width, actor.height);\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 if (prevBox && !isFooter) {\n bounds.models.addBox(prevBox);\n }\n bounds.bumpVerticalPos(maxHeight);\n}, \"addActorRenderingData\");\nvar drawActors = /* @__PURE__ */ __name(async function(diagram2, actors, actorKeys, isFooter) {\n if (!isFooter) {\n for (const actorKey of actorKeys) {\n const actor = actors.get(actorKey);\n await svgDraw_default.drawActor(diagram2, 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_default.drawActor(diagram2, actor, conf, true);\n maxHeight = common_default.getMax(maxHeight, height);\n }\n bounds.bumpVerticalPos(maxHeight + conf.boxMargin);\n }\n}, \"drawActors\");\nvar drawActorsPopup = /* @__PURE__ */ __name(function(diagram2, 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_default.drawPopup(\n diagram2,\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 return { maxHeight, maxWidth };\n}, \"drawActorsPopup\");\nvar setConf = /* @__PURE__ */ __name(function(cnf) {\n assignWithDepth_default(conf, cnf);\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}, \"setConf\");\nvar actorActivations = /* @__PURE__ */ __name(function(actor) {\n return bounds.activations.filter(function(activation) {\n return activation.actor === actor;\n });\n}, \"actorActivations\");\nvar activationBounds = /* @__PURE__ */ __name(function(actor, actors) {\n const actorObj = actors.get(actor);\n const activations = actorActivations(actor);\n const left = activations.reduce(\n function(acc, activation) {\n return common_default.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_default.getMax(acc, activation.stopx);\n },\n actorObj.x + actorObj.width / 2 + 1\n );\n return [left, right];\n}, \"activationBounds\");\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_default.wrapLabel(`[${msg.message}]`, loopWidth - 2 * conf.wrapPadding, textConf);\n msg.width = loopWidth;\n msg.wrap = true;\n const textDims = utils_default.calculateTextDimensions(msg.message, textConf);\n const totalOffset = common_default.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__name(adjustLoopHeightForWrap, \"adjustLoopHeightForWrap\");\nfunction adjustCreatedDestroyedData(msg, msgModel, lineStartY, index, actors, createdActors, destroyedActors) {\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 __name(receiverAdjustment, \"receiverAdjustment\");\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 __name(senderAdjustment, \"senderAdjustment\");\n if (createdActors.get(msg.to) == index) {\n const actor = actors.get(msg.to);\n const adjustment = actor.type == \"actor\" ? ACTOR_TYPE_WIDTH / 2 + 3 : actor.width / 2 + 3;\n receiverAdjustment(actor, adjustment);\n actor.starty = lineStartY - actor.height / 2;\n bounds.bumpVerticalPos(actor.height / 2);\n } else if (destroyedActors.get(msg.from) == index) {\n const actor = actors.get(msg.from);\n if (conf.mirrorActors) {\n const adjustment = actor.type == \"actor\" ? 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 } else if (destroyedActors.get(msg.to) == index) {\n const actor = actors.get(msg.to);\n if (conf.mirrorActors) {\n const adjustment = actor.type == \"actor\" ? ACTOR_TYPE_WIDTH / 2 + 3 : 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__name(adjustCreatedDestroyedData, \"adjustCreatedDestroyedData\");\nvar draw = /* @__PURE__ */ __name(async function(_text, id, _version, diagObj) {\n const { securityLevel, sequence } = getConfig2();\n conf = sequence;\n let sandboxElement;\n if (securityLevel === \"sandbox\") {\n sandboxElement = select(\"#i\" + id);\n }\n const root = securityLevel === \"sandbox\" ? select(sandboxElement.nodes()[0].contentDocument.body) : select(\"body\");\n const doc = securityLevel === \"sandbox\" ? sandboxElement.nodes()[0].contentDocument : document;\n bounds.init();\n log.debug(diagObj.db);\n const diagram2 = securityLevel === \"sandbox\" ? root.select(`[id=\"${id}\"]`) : select(`[id=\"${id}\"]`);\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 svgDraw_default.insertComputerIcon(diagram2);\n svgDraw_default.insertDatabaseIcon(diagram2);\n svgDraw_default.insertClockIcon(diagram2);\n if (hasBoxes) {\n bounds.bumpVerticalPos(conf.boxMargin);\n if (hasBoxTitles) {\n bounds.bumpVerticalPos(boxes[0].textMaxHeight);\n }\n }\n if (conf.hideUnusedParticipants === true) {\n const newActors = /* @__PURE__ */ 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 addActorRenderingData(diagram2, actors, createdActors, actorKeys, 0, messages, false);\n const loopWidths = await calculateLoopBounds(messages, actors, maxMessageWidthPerActor, diagObj);\n svgDraw_default.insertArrowHead(diagram2);\n svgDraw_default.insertArrowCrossHead(diagram2);\n svgDraw_default.insertArrowFilledHead(diagram2);\n svgDraw_default.insertSequenceNumber(diagram2);\n function activeEnd(msg, verticalPos) {\n const activationData = bounds.endActivation(msg);\n if (activationData.starty + 18 > verticalPos) {\n activationData.starty = verticalPos - 6;\n verticalPos += 12;\n }\n svgDraw_default.drawActivation(\n diagram2,\n activationData,\n verticalPos,\n conf,\n actorActivations(msg.from).length\n );\n bounds.insert(activationData.startx, verticalPos - 10, activationData.stopx, verticalPos);\n }\n __name(activeEnd, \"activeEnd\");\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 switch (msg.type) {\n case diagObj.db.LINETYPE.NOTE:\n bounds.resetVerticalPos();\n noteModel = msg.noteModel;\n await drawNote(diagram2, noteModel);\n break;\n case diagObj.db.LINETYPE.ACTIVE_START:\n bounds.newActivation(msg, diagram2, 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_default.drawLoop(diagram2, 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(\n loopWidths,\n msg,\n conf.boxMargin,\n conf.boxMargin,\n (message) => bounds.newLoop(void 0, 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_default.drawLoop(diagram2, 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_default.drawLoop(diagram2, 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_default.drawLoop(diagram2, 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_default.drawLoop(diagram2, 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_default.drawLoop(diagram2, 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(diagram2, msgModel);\n adjustCreatedDestroyedData(\n msg,\n msgModel,\n lineStartY,\n index,\n actors,\n createdActors,\n destroyedActors\n );\n messagesToDraw.push({ messageModel: msgModel, lineStartY });\n bounds.models.addMessage(msgModel);\n } catch (e) {\n log.error(\"error while drawing message\", e);\n }\n }\n if ([\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 sequenceIndex = sequenceIndex + sequenceIndexStep;\n }\n index++;\n }\n log.debug(\"createdActors\", createdActors);\n log.debug(\"destroyedActors\", destroyedActors);\n await drawActors(diagram2, actors, actorKeys, false);\n for (const e of messagesToDraw) {\n await drawMessage(diagram2, e.messageModel, e.lineStartY, diagObj);\n }\n if (conf.mirrorActors) {\n await drawActors(diagram2, actors, actorKeys, true);\n }\n backgrounds.forEach((e) => svgDraw_default.drawBackgroundRect(diagram2, e));\n fixLifeLineHeights(diagram2, actors, actorKeys, conf);\n for (const box2 of bounds.models.boxes) {\n box2.height = bounds.getVerticalPos() - box2.y;\n bounds.insert(box2.x, box2.y, box2.x + box2.width, box2.height);\n box2.startx = box2.x;\n box2.starty = box2.y;\n box2.stopx = box2.startx + box2.width;\n box2.stopy = box2.starty + box2.height;\n box2.stroke = \"rgb(0,0,0, 0.5)\";\n svgDraw_default.drawBox(diagram2, box2, conf);\n }\n if (hasBoxes) {\n bounds.bumpVerticalPos(conf.boxMargin);\n }\n const requiredBoxSize = drawActorsPopup(diagram2, actors, actorKeys, doc);\n const { bounds: box } = bounds.getBounds();\n if (box.startx === void 0) {\n box.startx = 0;\n }\n if (box.starty === void 0) {\n box.starty = 0;\n }\n if (box.stopx === void 0) {\n box.stopx = 0;\n }\n if (box.stopy === void 0) {\n box.stopy = 0;\n }\n let boxHeight = box.stopy - box.starty;\n if (boxHeight < requiredBoxSize.maxHeight) {\n boxHeight = requiredBoxSize.maxHeight;\n }\n let height = boxHeight + 2 * conf.diagramMarginY;\n if (conf.mirrorActors) {\n height = height - conf.boxMargin + conf.bottomMarginAdj;\n }\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 if (title) {\n diagram2.append(\"text\").text(title).attr(\"x\", (box.stopx - box.startx) / 2 - 2 * conf.diagramMarginX).attr(\"y\", -25);\n }\n configureSvgSize(diagram2, height, width, conf.useMaxWidth);\n const extraVertForTitle = title ? 40 : 0;\n diagram2.attr(\n \"viewBox\",\n box.startx - conf.diagramMarginX + \" -\" + (conf.diagramMarginY + extraVertForTitle) + \" \" + width + \" \" + (height + extraVertForTitle)\n );\n log.debug(`models:`, bounds.models);\n}, \"draw\");\nasync function getMaxMessageWidthPerActor(actors, messages, diagObj) {\n const maxMessageWidthPerActor = {};\n for (const msg of messages) {\n if (actors.get(msg.to) && actors.get(msg.from)) {\n const actor = actors.get(msg.to);\n if (msg.placement === diagObj.db.PLACEMENT.LEFTOF && !actor.prevActor) {\n continue;\n }\n if (msg.placement === diagObj.db.PLACEMENT.RIGHTOF && !actor.nextActor) {\n continue;\n }\n const isNote = msg.placement !== void 0;\n const isMessage = !isNote;\n const textFont = isNote ? noteFont(conf) : messageFont(conf);\n const wrappedMessage = msg.wrap ? utils_default.wrapLabel(msg.message, conf.width - 2 * conf.wrapPadding, textFont) : msg.message;\n const messageDimensions = hasKatex(wrappedMessage) ? await calculateMathMLDimensions(msg.message, getConfig2()) : utils_default.calculateTextDimensions(wrappedMessage, textFont);\n const messageWidth = messageDimensions.width + 2 * conf.wrapPadding;\n if (isMessage && msg.from === actor.nextActor) {\n maxMessageWidthPerActor[msg.to] = common_default.getMax(\n maxMessageWidthPerActor[msg.to] || 0,\n messageWidth\n );\n } else if (isMessage && msg.from === actor.prevActor) {\n maxMessageWidthPerActor[msg.from] = common_default.getMax(\n maxMessageWidthPerActor[msg.from] || 0,\n messageWidth\n );\n } else if (isMessage && msg.from === msg.to) {\n maxMessageWidthPerActor[msg.from] = common_default.getMax(\n maxMessageWidthPerActor[msg.from] || 0,\n messageWidth / 2\n );\n maxMessageWidthPerActor[msg.to] = common_default.getMax(\n maxMessageWidthPerActor[msg.to] || 0,\n messageWidth / 2\n );\n } else if (msg.placement === diagObj.db.PLACEMENT.RIGHTOF) {\n maxMessageWidthPerActor[msg.from] = common_default.getMax(\n maxMessageWidthPerActor[msg.from] || 0,\n messageWidth\n );\n } else if (msg.placement === diagObj.db.PLACEMENT.LEFTOF) {\n maxMessageWidthPerActor[actor.prevActor] = common_default.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_default.getMax(\n maxMessageWidthPerActor[actor.prevActor] || 0,\n messageWidth / 2\n );\n }\n if (actor.nextActor) {\n maxMessageWidthPerActor[msg.from] = common_default.getMax(\n maxMessageWidthPerActor[msg.from] || 0,\n messageWidth / 2\n );\n }\n }\n }\n }\n log.debug(\"maxMessageWidthPerActor:\", maxMessageWidthPerActor);\n return maxMessageWidthPerActor;\n}\n__name(getMaxMessageWidthPerActor, \"getMaxMessageWidthPerActor\");\nvar getRequiredPopupWidth = /* @__PURE__ */ __name(function(actor) {\n let requiredPopupWidth = 0;\n const textFont = actorFont(conf);\n for (const key in actor.links) {\n const labelDimensions = utils_default.calculateTextDimensions(key, textFont);\n const labelWidth = labelDimensions.width + 2 * conf.wrapPadding + 2 * conf.boxMargin;\n if (requiredPopupWidth < labelWidth) {\n requiredPopupWidth = labelWidth;\n }\n }\n return requiredPopupWidth;\n}, \"getRequiredPopupWidth\");\nasync function calculateActorMargins(actors, actorToMessageWidth, boxes) {\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_default.wrapLabel(\n actor.description,\n conf.width - 2 * conf.wrapPadding,\n actorFont(conf)\n );\n }\n const actDims = hasKatex(actor.description) ? await calculateMathMLDimensions(actor.description, getConfig2()) : utils_default.calculateTextDimensions(actor.description, actorFont(conf));\n actor.width = actor.wrap ? conf.width : common_default.getMax(conf.width, actDims.width + 2 * conf.wrapPadding);\n actor.height = actor.wrap ? common_default.getMax(actDims.height, conf.height) : conf.height;\n maxHeight = common_default.getMax(maxHeight, actor.height);\n }\n for (const actorKey in actorToMessageWidth) {\n const actor = actors.get(actorKey);\n if (!actor) {\n continue;\n }\n const nextActor = actors.get(actor.nextActor);\n if (!nextActor) {\n const messageWidth2 = actorToMessageWidth[actorKey];\n const actorWidth2 = messageWidth2 + conf.actorMargin - actor.width / 2;\n actor.margin = common_default.getMax(actorWidth2, conf.actorMargin);\n continue;\n }\n const messageWidth = actorToMessageWidth[actorKey];\n const actorWidth = messageWidth + conf.actorMargin - actor.width / 2 - nextActor.width / 2;\n actor.margin = common_default.getMax(actorWidth, conf.actorMargin);\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 totalWidth -= 2 * conf.boxTextMargin;\n if (box.wrap) {\n box.name = utils_default.wrapLabel(box.name, totalWidth - 2 * conf.wrapPadding, textFont);\n }\n const boxMsgDimensions = utils_default.calculateTextDimensions(box.name, textFont);\n maxBoxHeight = common_default.getMax(boxMsgDimensions.height, maxBoxHeight);\n const minWidth = common_default.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 return common_default.getMax(maxHeight, conf.height);\n}\n__name(calculateActorMargins, \"calculateActorMargins\");\nvar buildNoteModel = /* @__PURE__ */ __name(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 let textDimensions = hasKatex(msg.message) ? await calculateMathMLDimensions(msg.message, getConfig2()) : utils_default.calculateTextDimensions(\n shouldWrap ? utils_default.wrapLabel(msg.message, conf.width, noteFont(conf)) : msg.message,\n noteFont(conf)\n );\n const noteModel = {\n width: shouldWrap ? conf.width : common_default.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 ? common_default.getMax(conf.width, textDimensions.width) : common_default.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 ? common_default.getMax(conf.width, textDimensions.width + 2 * conf.noteMargin) : common_default.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_default.calculateTextDimensions(\n shouldWrap ? utils_default.wrapLabel(msg.message, common_default.getMax(conf.width, fromActor.width), noteFont(conf)) : msg.message,\n noteFont(conf)\n );\n noteModel.width = shouldWrap ? common_default.getMax(conf.width, fromActor.width) : common_default.getMax(fromActor.width, conf.width, textDimensions.width + 2 * conf.noteMargin);\n noteModel.startx = startx + (fromActor.width - noteModel.width) / 2;\n } else {\n noteModel.width = Math.abs(startx + fromActor.width / 2 - (stopx + toActor.width / 2)) + conf.actorMargin;\n noteModel.startx = startx < stopx ? startx + fromActor.width / 2 - conf.actorMargin / 2 : stopx + toActor.width / 2 - conf.actorMargin / 2;\n }\n if (shouldWrap) {\n noteModel.message = utils_default.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}, \"buildNoteModel\");\nvar buildMessageModel = /* @__PURE__ */ __name(function(msg, actors, diagObj) {\n if (![\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 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 const isArrowToActivation = Math.abs(toLeft - toRight) > 2;\n const adjustValue = /* @__PURE__ */ __name((value) => {\n return isArrowToRight ? -value : value;\n }, \"adjustValue\");\n if (msg.from === msg.to) {\n stopx = startx;\n } else {\n if (msg.activate && !isArrowToActivation) {\n stopx += adjustValue(conf.activationWidth / 2 - 1);\n }\n if (![diagObj.db.LINETYPE.SOLID_OPEN, diagObj.db.LINETYPE.DOTTED_OPEN].includes(msg.type)) {\n stopx += adjustValue(3);\n }\n if ([diagObj.db.LINETYPE.BIDIRECTIONAL_SOLID, diagObj.db.LINETYPE.BIDIRECTIONAL_DOTTED].includes(\n msg.type\n )) {\n startx -= adjustValue(3);\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_default.wrapLabel(\n msg.message,\n common_default.getMax(boundedWidth + 2 * conf.wrapPadding, conf.width),\n messageFont(conf)\n );\n }\n const msgDims = utils_default.calculateTextDimensions(msg.message, messageFont(conf));\n return {\n width: common_default.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}, \"buildMessageModel\");\nvar calculateLoopBounds = /* @__PURE__ */ __name(async function(messages, actors, _maxWidthPerActor, diagObj) {\n const loops = {};\n const stack = [];\n let current, noteModel, msgModel;\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 = 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.map((a) => a.actor).lastIndexOf(msg.from);\n bounds.activations.splice(lastActorActivationIdx, 1).splice(0, 1);\n }\n break;\n }\n const isNote = msg.placement !== void 0;\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_default.getMin(current.from, noteModel.startx);\n current.to = common_default.getMax(current.to, noteModel.startx + noteModel.width);\n current.width = common_default.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_default.getMin(\n from.x - msgModel.width / 2,\n from.x - from.width / 2,\n current.from\n );\n current.to = common_default.getMax(\n to.x + msgModel.width / 2,\n to.x + from.width / 2,\n current.to\n );\n current.width = common_default.getMax(current.width, Math.abs(current.to - current.from)) - conf.labelBoxWidth;\n } else {\n current.from = common_default.getMin(msgModel.startx, current.from);\n current.to = common_default.getMax(msgModel.stopx, current.to);\n current.width = common_default.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}, \"calculateLoopBounds\");\nvar sequenceRenderer_default = {\n bounds,\n drawActors,\n drawActorsPopup,\n setConf,\n draw\n};\n\n// src/diagrams/sequence/sequenceDiagram.ts\nvar diagram = {\n parser: sequenceDiagram_default,\n get db() {\n return new SequenceDB();\n },\n renderer: sequenceRenderer_default,\n styles: styles_default,\n init: /* @__PURE__ */ __name((cnf) => {\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 }, \"init\")\n};\nexport {\n diagram\n};\n","import {\n __name\n} from \"./chunk-YTJNT7DU.mjs\";\n\n// src/utils/imperativeState.ts\nvar ImperativeState = class {\n /**\n * @param init - Function that creates the default state.\n */\n constructor(init) {\n this.init = init;\n this.records = this.init();\n }\n static {\n __name(this, \"ImperativeState\");\n }\n reset() {\n this.records = this.init();\n }\n};\n\nexport {\n ImperativeState\n};\n"],"names":["drawRect","__name","element","rectData","rectElement","append","attr","x","y","fill","stroke","width","height","name","rx","ry","attrs","attrKey","class","drawBackgroundRect","bounds","startx","starty","stopx","stopy","lower","drawText","textData","nText","text","replace","lineBreakRegex","textElem","style","anchor","tspan","textMargin","drawImage","elem","link","imageElement","sanitizedLink","sanitizeUrl","drawEmbeddedImage","getNoteRect","getTextObj","parser","o","k","v","o2","l","length","$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","parser2","trace","yy","symbols_","terminals_","productions_","performAction","yytext","yyleng","yylineno","yystate","$$","_$","$0","apply","this","$","push","type","unshift","boxData","parseBoxData","boxText","sequenceIndex","Number","sequenceIndexStep","sequenceVisible","signalType","LINETYPE","AUTONUMBER","ACTIVE_START","actor","ACTIVE_END","setDiagramTitle","substring","trim","setAccTitle","setAccDescription","loopText","parseMessage","LOOP_START","LOOP_END","color","RECT_START","RECT_END","optText","OPT_START","OPT_END","altText","ALT_START","ALT_END","parText","PAR_START","PAR_END","PAR_OVER_START","criticalText","CRITICAL_START","CRITICAL_END","breakText","BREAK_START","BREAK_END","concat","optionText","CRITICAL_OPTION","PAR_AND","ALT_ELSE","draw","description","placement","slice","PLACEMENT","OVER","LEFTOF","RIGHTOF","from","to","msg","activate","SOLID_OPEN","DOTTED_OPEN","SOLID","BIDIRECTIONAL_SOLID","DOTTED","BIDIRECTIONAL_DOTTED","SOLID_CROSS","DOTTED_CROSS","SOLID_POINT","DOTTED_POINT","table","defaultActions","parseError","str","hash","recoverable","error","Error","parse","input","self","stack","tstack","vstack","lstack","recovering","args","call","arguments","lexer2","Object","create","lexer","sharedState","prototype","hasOwnProperty","setInput","yylloc","yyloc","ranges","options","lex","token","pop","Array","getPrototypeOf","n","symbol","preErrorSymbol","state","action","r","p","len","newState","expected","yyval","errStr","showPosition","join","match","line","loc","first_line","last_line","first_column","last_column","range","EOF","_input","_more","_backtrack","done","matched","conditionStack","offset","ch","unput","lines","split","substr","oldLines","more","reject","backtrack_lexer","less","pastInput","past","upcomingInput","next","pre","c","test_match","indexed_rule","backup","matches","tempMatch","index","rules","_currentRules","i","flex","begin","condition","popState","conditions","topState","Math","abs","pushState","stateStackSize","yy_","$avoiding_name_collisions","YY_START","Parser","sequenceDiagram_default","NOTE","ARROWTYPE","FILLED","OPEN","SequenceDB","constructor","ImperativeState","prevActor","actors","Map","createdActors","destroyedActors","boxes","messages","notes","sequenceNumbersEnabled","wrapEnabled","currentBox","lastCreated","lastDestroyed","getAccTitle","getAccDescription","getDiagramTitle","bind","clear","setWrap","getConfig2","wrap","addBox","data","records","autoWrap","actorKeys","addActor","id","assignedBox","old","get","box","set","links","properties","actorCnt","prevActorInRecords","nextActor","activationCount","part","count","addMessage","idFrom","idTo","message","answer","toString","addSignal","messageType","undefined","hasAtLeastOneBox","hasAtLeastOneBoxWithTitle","some","b","getMessages","getBoxes","getActors","getCreatedActors","getDestroyedActors","getActor","getActorKeys","keys","enableSequenceNumbers","disableSequenceNumbers","showSequenceNumbers","wrapSetting","extractWrap","exec","cleanedText","sequence","reset","trimmedStr","log","debug","JSON","stringify","title","window","CSS","supports","Option","sanitizeText","addNote","note","addLinks","actorId","sanitizedText","insertLinks","e","addALink","sep","indexOf","label","key","addProperties","insertProperties","boxEnd","addDetails","document","getElementById","text2","innerHTML","details","getActorProperty","param","isArray","forEach","item","start","step","visible","has","getConfig","styles_default","actorBorder","actorBkg","actorTextColor","actorLineColor","signalColor","sequenceNumberColor","signalTextColor","labelBoxBorderColor","labelBoxBkgColor","labelTextColor","loopTextColor","noteBorderColor","noteBkgColor","noteTextColor","activationBkgColor","activationBorderColor","TOP_ACTOR_CLASS","BOTTOM_ACTOR_CLASS","ACTOR_MAN_FIGURE_CLASS","drawRect2","drawPopup","minMenuWidth","textAttrs","forceMenus","actorCnt2","displayValue","g","actorClass","menuWidth","rectElem","linkY","linkElem","_drawMenuItemTextCandidateFunc","popupMenuToggle","popId","drawKatex","async","msgModel","renderKatex","dim","html","node","getBoundingClientRect","round","firstChild","setAttribute","rectDim","getBBox","temp","prevTextHeight","textHeight","common_default","_textFontSize","_textFontSizePx","parseFontSize","fontSize","textElems","dy","yfunc","valign","dominantBaseline","alignmentBaseline","entries","fontFamily","fontWeight","ZERO_WIDTH_SPACE","span","_groups","drawLabel","txtObject","genPoints","cut","polygon","fixLifeLineHeights","diagram2","conf2","select","actorKey","actorDOM","mirrorActors","drawActorTypeParticipant","isFooter","actorY","center","centerY","boxplusLineGroup","rect","cssclass","icon","iconSrc","charAt","_drawTextCandidateFunc","hasKatex","bounds2","drawActorTypeActor","actElem","cssClass","ACTOR_TYPE_WIDTH","circle","drawActor","drawBox","drawBackgroundRect2","textMaxHeight","anchorElement","drawActivation","verticalPos","actorActivations2","anchored","drawLoop","loopModel","labelText","boxMargin","boxTextMargin","labelBoxHeight","labelBoxWidth","messageFontFamily","messageFontSize","messageFontWeight","drawLoopLine","sections","txt","getTextObj2","sectionTitles","idx","sectionHeight","map","te","reduce","acc","curr","insertDatabaseIcon","insertComputerIcon","insertClockIcon","insertArrowHead","insertArrowFilledHead","insertSequenceNumber","insertArrowCrossHead","getNoteRect2","byText","content","_setTextAttrs","byTspan","actorFontSize","actorFontFamily","actorFontWeight","_actorFontSize","_actorFontSizePx","byFo","s","byKatex","calculateMathMLDimensions","toText","fromTextAttrsDict","textPlacement","svgDraw_default","conf","sequenceItems","activations","models","getHeight","max","loops","it","h","boxModel","actorModel","addLoop","noteModel","lastActor","lastLoop","lastMessage","lastNote","init","setConf","updateVal","obj","val","fun","updateBounds","_self","cnt","updateFn","min","insert","_startx","getMin","_stopx","getMax","_starty","_stopy","newActivation","actorRect","stackedSize","actorActivations","activationWidth","endActivation","lastActorActivationIdx","activation","lastIndexOf","splice","createLoop","newLoop","endLoop","isLoopOverlap","overlap","addSectionToLoop","loop","getVerticalPos","saveVerticalPos","savedVerticalPos","resetVerticalPos","bumpVerticalPos","bump","getBounds","drawNote","textObj","noteFontFamily","noteFontSize","noteFontWeight","noteAlign","noteMargin","messageFont","cnf","noteFont","actorFont","boundMessage","_diagram","splitBreaks","isKatexMsg","textDims","utils_default","calculateTextDimensions","lineHeight","lineStartY","totalOffset","textWidth","rightAngles","dx","fromBounds","toBounds","drawMessage","diagObj","messageAlign","wrapPadding","db","url","arrowMarkerAbsolute","location","protocol","host","pathname","search","addActorRenderingData","prevBox","prevWidth","prevMargin","maxHeight","margin","actorMargin","drawActors","drawActorsPopup","doc","maxWidth","getRequiredPopupWidth","menuDimensions","assignWithDepth_default","filter","activationBounds","actorObj","adjustLoopHeightForWrap","loopWidths","preMargin","postMargin","addLoopFn","heightAdjust","loopWidth","textConf","wrapLabel","adjustCreatedDestroyedData","receiverAdjustment","adjustment","senderAdjustment","_text","_version","securityLevel","sandboxElement","root","nodes","contentDocument","body","hasBoxes","hasBoxTitles","maxMessageWidthPerActor","getMaxMessageWidthPerActor","calculateActorMargins","hideUnusedParticipants","newActors","Set","add","calculateLoopBounds","activeEnd","activationData","messagesToDraw","backgrounds","messageModel","includes","box2","requiredBoxSize","boxHeight","diagramMarginY","bottomMarginAdj","boxWidth","diagramMarginX","configureSvgSize","useMaxWidth","extraVertForTitle","isNote","isMessage","textFont","wrappedMessage","messageWidth","requiredPopupWidth","labelWidth","actorToMessageWidth","prop","actDims","actorWidth2","actorWidth","maxBoxHeight","totalWidth","total","aKey","boxMsgDimensions","minWidth","missing","buildNoteModel","fromActor","toActor","shouldWrap","textDimensions","buildMessageModel","fromLeft","fromRight","toLeft","toRight","isArrowToRight","isArrowToActivation","adjustValue","value","allBounds","boundedWidth","msgDims","_maxWidthPerActor","current","MAX_SAFE_INTEGER","MIN_SAFE_INTEGER","toAdd","enabled","a","stk","sequenceRenderer_default","diagram","renderer","styles","setConfig"],"sourceRoot":""} \ No newline at end of file diff --git a/frontend/deployed/static/js/318.239ef60c.chunk.js b/frontend/deployed/static/js/318.239ef60c.chunk.js deleted file mode 100644 index 59d9f73..0000000 --- a/frontend/deployed/static/js/318.239ef60c.chunk.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkbackstory=self.webpackChunkbackstory||[]).push([[318],{318:(e,s,a)=>{a.d(s,{createGitGraphServices:()=>c.b});var c=a(3670);a(1584)}}]); \ No newline at end of file diff --git a/frontend/deployed/static/js/320.f30ff8c0.chunk.js b/frontend/deployed/static/js/320.f30ff8c0.chunk.js deleted file mode 100644 index 93225cc..0000000 --- a/frontend/deployed/static/js/320.f30ff8c0.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunkbackstory=self.webpackChunkbackstory||[]).push([[320],{5320:(e,t,s)=>{s.d(t,{diagram:()=>m});var i=s(6327),n=s(53),r=(s(1580),s(2598),s(958),s(8434),s(9711),s(2596),s(634)),a=s(3759),l=function(){var e=(0,a.K2)((function(e,t,s,i){for(s=s||{},i=e.length;i--;s[e[i]]=t);return s}),"o"),t=[1,3],s=[1,4],i=[1,5],n=[1,6],r=[5,6,8,9,11,13,21,22,23,24,41,42,43,44,45,46,54,72,74,77,89,90],l=[1,22],c=[2,7],o=[1,26],h=[1,27],u=[1,28],y=[1,29],m=[1,33],d=[1,34],E=[1,35],p=[1,36],R=[1,37],f=[1,38],_=[1,24],g=[1,31],S=[1,32],I=[1,30],b=[1,39],T=[1,40],k=[5,8,9,11,13,21,22,23,24,41,42,43,44,45,46,54,72,74,77,89,90],N=[1,61],q=[89,90],A=[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],C=[27,29],v=[1,70],w=[1,71],x=[1,72],L=[1,73],D=[1,74],O=[1,75],$=[1,76],M=[1,83],F=[1,80],K=[1,84],P=[1,85],V=[1,86],U=[1,87],Y=[1,88],B=[1,89],Q=[1,90],H=[1,91],W=[1,92],j=[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],G=[63,64],z=[1,101],X=[5,8,9,11,13,21,22,23,24,41,42,43,44,45,46,54,72,74,76,77,89,90],J=[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],Z=[1,110],ee=[1,106],te=[1,107],se=[1,108],ie=[1,109],ne=[1,111],re=[1,116],ae=[1,117],le=[1,114],ce=[1,115],oe={trace:(0,a.K2)((function(){}),"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:(0,a.K2)((function(e,t,s,i,n,r,a){var l=r.length-1;switch(n){case 4:this.$=r[l].trim(),i.setAccTitle(this.$);break;case 5:case 6:this.$=r[l].trim(),i.setAccDescription(this.$);break;case 7:this.$=[];break;case 17:i.setDirection("TB");break;case 18:i.setDirection("BT");break;case 19:i.setDirection("RL");break;case 20:i.setDirection("LR");break;case 21:i.addRequirement(r[l-3],r[l-4]);break;case 22:i.addRequirement(r[l-5],r[l-6]),i.setClass([r[l-5]],r[l-3]);break;case 23:i.setNewReqId(r[l-2]);break;case 24:i.setNewReqText(r[l-2]);break;case 25:i.setNewReqRisk(r[l-2]);break;case 26:i.setNewReqVerifyMethod(r[l-2]);break;case 29:this.$=i.RequirementType.REQUIREMENT;break;case 30:this.$=i.RequirementType.FUNCTIONAL_REQUIREMENT;break;case 31:this.$=i.RequirementType.INTERFACE_REQUIREMENT;break;case 32:this.$=i.RequirementType.PERFORMANCE_REQUIREMENT;break;case 33:this.$=i.RequirementType.PHYSICAL_REQUIREMENT;break;case 34:this.$=i.RequirementType.DESIGN_CONSTRAINT;break;case 35:this.$=i.RiskLevel.LOW_RISK;break;case 36:this.$=i.RiskLevel.MED_RISK;break;case 37:this.$=i.RiskLevel.HIGH_RISK;break;case 38:this.$=i.VerifyType.VERIFY_ANALYSIS;break;case 39:this.$=i.VerifyType.VERIFY_DEMONSTRATION;break;case 40:this.$=i.VerifyType.VERIFY_INSPECTION;break;case 41:this.$=i.VerifyType.VERIFY_TEST;break;case 42:i.addElement(r[l-3]);break;case 43:i.addElement(r[l-5]),i.setClass([r[l-5]],r[l-3]);break;case 44:i.setNewElementType(r[l-2]);break;case 45:i.setNewElementDocRef(r[l-2]);break;case 48:i.addRelationship(r[l-2],r[l],r[l-4]);break;case 49:i.addRelationship(r[l-2],r[l-4],r[l]);break;case 50:this.$=i.Relationships.CONTAINS;break;case 51:this.$=i.Relationships.COPIES;break;case 52:this.$=i.Relationships.DERIVES;break;case 53:this.$=i.Relationships.SATISFIES;break;case 54:this.$=i.Relationships.VERIFIES;break;case 55:this.$=i.Relationships.REFINES;break;case 56:this.$=i.Relationships.TRACES;break;case 57:this.$=r[l-2],i.defineClass(r[l-1],r[l]);break;case 58:i.setClass(r[l-1],r[l]);break;case 59:i.setClass([r[l-2]],r[l]);break;case 60:case 62:case 65:this.$=[r[l]];break;case 61:case 63:this.$=r[l-2].concat([r[l]]);break;case 64:this.$=r[l-2],i.setCssStyle(r[l-1],r[l]);break;case 66:r[l-2].push(r[l]),this.$=r[l-2];break;case 68:this.$=r[l-1]+r[l]}}),"anonymous"),table:[{3:1,4:2,6:t,9:s,11:i,13:n},{1:[3]},{3:8,4:2,5:[1,7],6:t,9:s,11:i,13:n},{5:[1,9]},{10:[1,10]},{12:[1,11]},e(r,[2,6]),{3:12,4:2,6:t,9:s,11:i,13:n},{1:[2,2]},{4:17,5:l,7:13,8:c,9:s,11:i,13:n,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:o,22:h,23:u,24:y,25:23,33:25,41:m,42:d,43:E,44:p,45:R,46:f,54:_,72:g,74:S,77:I,89:b,90:T},e(r,[2,4]),e(r,[2,5]),{1:[2,1]},{8:[1,41]},{4:17,5:l,7:42,8:c,9:s,11:i,13:n,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:o,22:h,23:u,24:y,25:23,33:25,41:m,42:d,43:E,44:p,45:R,46:f,54:_,72:g,74:S,77:I,89:b,90:T},{4:17,5:l,7:43,8:c,9:s,11:i,13:n,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:o,22:h,23:u,24:y,25:23,33:25,41:m,42:d,43:E,44:p,45:R,46:f,54:_,72:g,74:S,77:I,89:b,90:T},{4:17,5:l,7:44,8:c,9:s,11:i,13:n,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:o,22:h,23:u,24:y,25:23,33:25,41:m,42:d,43:E,44:p,45:R,46:f,54:_,72:g,74:S,77:I,89:b,90:T},{4:17,5:l,7:45,8:c,9:s,11:i,13:n,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:o,22:h,23:u,24:y,25:23,33:25,41:m,42:d,43:E,44:p,45:R,46:f,54:_,72:g,74:S,77:I,89:b,90:T},{4:17,5:l,7:46,8:c,9:s,11:i,13:n,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:o,22:h,23:u,24:y,25:23,33:25,41:m,42:d,43:E,44:p,45:R,46:f,54:_,72:g,74:S,77:I,89:b,90:T},{4:17,5:l,7:47,8:c,9:s,11:i,13:n,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:o,22:h,23:u,24:y,25:23,33:25,41:m,42:d,43:E,44:p,45:R,46:f,54:_,72:g,74:S,77:I,89:b,90:T},{4:17,5:l,7:48,8:c,9:s,11:i,13:n,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:o,22:h,23:u,24:y,25:23,33:25,41:m,42:d,43:E,44:p,45:R,46:f,54:_,72:g,74:S,77:I,89:b,90:T},{4:17,5:l,7:49,8:c,9:s,11:i,13:n,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:o,22:h,23:u,24:y,25:23,33:25,41:m,42:d,43:E,44:p,45:R,46:f,54:_,72:g,74:S,77:I,89:b,90:T},{4:17,5:l,7:50,8:c,9:s,11:i,13:n,14:14,15:15,16:16,17:18,18:19,19:20,20:21,21:o,22:h,23:u,24:y,25:23,33:25,41:m,42:d,43:E,44:p,45:R,46:f,54:_,72:g,74:S,77:I,89:b,90:T},{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]},e(k,[2,17]),e(k,[2,18]),e(k,[2,19]),e(k,[2,20]),{30:60,33:62,75:N,89:b,90:T},{30:63,33:62,75:N,89:b,90:T},{30:64,33:62,75:N,89:b,90:T},e(q,[2,29]),e(q,[2,30]),e(q,[2,31]),e(q,[2,32]),e(q,[2,33]),e(q,[2,34]),e(A,[2,81]),e(A,[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]},e(C,[2,79]),e(C,[2,80]),{27:[1,67],29:[1,68]},e(C,[2,85]),e(C,[2,86]),{62:69,65:v,66:w,67:x,68:L,69:D,70:O,71:$},{62:77,65:v,66:w,67:x,68:L,69:D,70:O,71:$},{30:78,33:62,75:N,89:b,90:T},{73:79,75:M,76:F,78:81,79:82,80:K,81:P,82:V,83:U,84:Y,85:B,86:Q,87:H,88:W},e(j,[2,60]),e(j,[2,62]),{73:93,75:M,76:F,78:81,79:82,80:K,81:P,82:V,83:U,84:Y,85:B,86:Q,87:H,88:W},{30:94,33:62,75:N,76:F,89:b,90:T},{5:[1,95]},{30:96,33:62,75:N,89:b,90:T},{5:[1,97]},{30:98,33:62,75:N,89:b,90:T},{63:[1,99]},e(G,[2,50]),e(G,[2,51]),e(G,[2,52]),e(G,[2,53]),e(G,[2,54]),e(G,[2,55]),e(G,[2,56]),{64:[1,100]},e(k,[2,59],{76:F}),e(k,[2,64],{76:z}),{33:103,75:[1,102],89:b,90:T},e(X,[2,65],{79:104,75:M,80:K,81:P,82:V,83:U,84:Y,85:B,86:Q,87:H,88:W}),e(J,[2,67]),e(J,[2,69]),e(J,[2,70]),e(J,[2,71]),e(J,[2,72]),e(J,[2,73]),e(J,[2,74]),e(J,[2,75]),e(J,[2,76]),e(J,[2,77]),e(J,[2,78]),e(k,[2,57],{76:z}),e(k,[2,58],{76:F}),{5:Z,28:105,31:ee,34:te,36:se,38:ie,40:ne},{27:[1,112],76:F},{5:re,40:ae,56:113,57:le,59:ce},{27:[1,118],76:F},{33:119,89:b,90:T},{33:120,89:b,90:T},{75:M,78:121,79:82,80:K,81:P,82:V,83:U,84:Y,85:B,86:Q,87:H,88:W},e(j,[2,61]),e(j,[2,63]),e(J,[2,68]),e(k,[2,21]),{32:[1,122]},{32:[1,123]},{32:[1,124]},{32:[1,125]},{5:Z,28:126,31:ee,34:te,36:se,38:ie,40:ne},e(k,[2,28]),{5:[1,127]},e(k,[2,42]),{32:[1,128]},{32:[1,129]},{5:re,40:ae,56:130,57:le,59:ce},e(k,[2,47]),{5:[1,131]},e(k,[2,48]),e(k,[2,49]),e(X,[2,66],{79:104,75:M,80:K,81:P,82:V,83:U,84:Y,85:B,86:Q,87:H,88:W}),{33:132,89:b,90:T},{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]},e(k,[2,27]),{5:Z,28:145,31:ee,34:te,36:se,38:ie,40:ne},{58:146,89:[1,147],90:[1,148]},{60:149,89:[1,150],90:[1,151]},e(k,[2,46]),{5:re,40:ae,56:152,57:le,59:ce},{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]},e(k,[2,22]),{5:[1,157]},{5:[2,87]},{5:[2,88]},{5:[1,158]},{5:[2,89]},{5:[2,90]},e(k,[2,43]),{5:Z,28:159,31:ee,34:te,36:se,38:ie,40:ne},{5:Z,28:160,31:ee,34:te,36:se,38:ie,40:ne},{5:Z,28:161,31:ee,34:te,36:se,38:ie,40:ne},{5:Z,28:162,31:ee,34:te,36:se,38:ie,40:ne},{5:re,40:ae,56:163,57:le,59:ce},{5:re,40:ae,56:164,57:le,59:ce},e(k,[2,23]),e(k,[2,24]),e(k,[2,25]),e(k,[2,26]),e(k,[2,44]),e(k,[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:(0,a.K2)((function(e,t){if(!t.recoverable){var s=new Error(e);throw s.hash=t,s}this.trace(e)}),"parseError"),parse:(0,a.K2)((function(e){var t=this,s=[0],i=[],n=[null],r=[],l=this.table,c="",o=0,h=0,u=0,y=r.slice.call(arguments,1),m=Object.create(this.lexer),d={yy:{}};for(var E in this.yy)Object.prototype.hasOwnProperty.call(this.yy,E)&&(d.yy[E]=this.yy[E]);m.setInput(e,d.yy),d.yy.lexer=m,d.yy.parser=this,"undefined"==typeof m.yylloc&&(m.yylloc={});var p=m.yylloc;r.push(p);var R=m.options&&m.options.ranges;function f(){var e;return"number"!==typeof(e=i.pop()||m.lex()||1)&&(e instanceof Array&&(e=(i=e).pop()),e=t.symbols_[e]||e),e}"function"===typeof d.yy.parseError?this.parseError=d.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError,(0,a.K2)((function(e){s.length=s.length-2*e,n.length=n.length-e,r.length=r.length-e}),"popStack"),(0,a.K2)(f,"lex");for(var _,g,S,I,b,T,k,N,q,A={};;){if(S=s[s.length-1],this.defaultActions[S]?I=this.defaultActions[S]:(null!==_&&"undefined"!=typeof _||(_=f()),I=l[S]&&l[S][_]),"undefined"===typeof I||!I.length||!I[0]){var C="";for(T in q=[],l[S])this.terminals_[T]&&T>2&&q.push("'"+this.terminals_[T]+"'");C=m.showPosition?"Parse error on line "+(o+1)+":\n"+m.showPosition()+"\nExpecting "+q.join(", ")+", got '"+(this.terminals_[_]||_)+"'":"Parse error on line "+(o+1)+": Unexpected "+(1==_?"end of input":"'"+(this.terminals_[_]||_)+"'"),this.parseError(C,{text:m.match,token:this.terminals_[_]||_,line:m.yylineno,loc:p,expected:q})}if(I[0]instanceof Array&&I.length>1)throw new Error("Parse Error: multiple actions possible at state: "+S+", token: "+_);switch(I[0]){case 1:s.push(_),n.push(m.yytext),r.push(m.yylloc),s.push(I[1]),_=null,g?(_=g,g=null):(h=m.yyleng,c=m.yytext,o=m.yylineno,p=m.yylloc,u>0&&u--);break;case 2:if(k=this.productions_[I[1]][1],A.$=n[n.length-k],A._$={first_line:r[r.length-(k||1)].first_line,last_line:r[r.length-1].last_line,first_column:r[r.length-(k||1)].first_column,last_column:r[r.length-1].last_column},R&&(A._$.range=[r[r.length-(k||1)].range[0],r[r.length-1].range[1]]),"undefined"!==typeof(b=this.performAction.apply(A,[c,h,o,d.yy,I[1],n,r].concat(y))))return b;k&&(s=s.slice(0,-1*k*2),n=n.slice(0,-1*k),r=r.slice(0,-1*k)),s.push(this.productions_[I[1]][0]),n.push(A.$),r.push(A._$),N=l[s[s.length-2]][s[s.length-1]],s.push(N);break;case 3:return!0}}return!0}),"parse")},he=function(){return{EOF:1,parseError:(0,a.K2)((function(e,t){if(!this.yy.parser)throw new Error(e);this.yy.parser.parseError(e,t)}),"parseError"),setInput:(0,a.K2)((function(e,t){return this.yy=t||this.yy||{},this._input=e,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:(0,a.K2)((function(){var e=this._input[0];return this.yytext+=e,this.yyleng++,this.offset++,this.match+=e,this.matched+=e,e.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),e}),"input"),unput:(0,a.K2)((function(e){var t=e.length,s=e.split(/(?:\r\n?|\n)/g);this._input=e+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-t),this.offset-=t;var i=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),s.length-1&&(this.yylineno-=s.length-1);var n=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:s?(s.length===i.length?this.yylloc.first_column:0)+i[i.length-s.length].length-s[0].length:this.yylloc.first_column-t},this.options.ranges&&(this.yylloc.range=[n[0],n[0]+this.yyleng-t]),this.yyleng=this.yytext.length,this}),"unput"),more:(0,a.K2)((function(){return this._more=!0,this}),"more"),reject:(0,a.K2)((function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):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})}),"reject"),less:(0,a.K2)((function(e){this.unput(this.match.slice(e))}),"less"),pastInput:(0,a.K2)((function(){var e=this.matched.substr(0,this.matched.length-this.match.length);return(e.length>20?"...":"")+e.substr(-20).replace(/\n/g,"")}),"pastInput"),upcomingInput:(0,a.K2)((function(){var e=this.match;return e.length<20&&(e+=this._input.substr(0,20-e.length)),(e.substr(0,20)+(e.length>20?"...":"")).replace(/\n/g,"")}),"upcomingInput"),showPosition:(0,a.K2)((function(){var e=this.pastInput(),t=new Array(e.length+1).join("-");return e+this.upcomingInput()+"\n"+t+"^"}),"showPosition"),test_match:(0,a.K2)((function(e,t){var s,i,n;if(this.options.backtrack_lexer&&(n={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&&(n.yylloc.range=this.yylloc.range.slice(0))),(i=e[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+e[0].length},this.yytext+=e[0],this.match+=e[0],this.matches=e,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(e[0].length),this.matched+=e[0],s=this.performAction.call(this,this.yy,this,t,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),s)return s;if(this._backtrack){for(var r in n)this[r]=n[r];return!1}return!1}),"test_match"),next:(0,a.K2)((function(){if(this.done)return this.EOF;var e,t,s,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var n=this._currentRules(),r=0;rt[0].length)){if(t=s,i=r,this.options.backtrack_lexer){if(!1!==(e=this.test_match(s,n[r])))return e;if(this._backtrack){t=!1;continue}return!1}if(!this.options.flex)break}return t?!1!==(e=this.test_match(t,n[i]))&&e:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})}),"next"),lex:(0,a.K2)((function(){var e=this.next();return e||this.lex()}),"lex"),begin:(0,a.K2)((function(e){this.conditionStack.push(e)}),"begin"),popState:(0,a.K2)((function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]}),"popState"),_currentRules:(0,a.K2)((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:(0,a.K2)((function(e){return(e=this.conditionStack.length-1-Math.abs(e||0))>=0?this.conditionStack[e]:"INITIAL"}),"topState"),pushState:(0,a.K2)((function(e){this.begin(e)}),"pushState"),stateStackSize:(0,a.K2)((function(){return this.conditionStack.length}),"stateStackSize"),options:{"case-insensitive":!0},performAction:(0,a.K2)((function(e,t,s,i){switch(s){case 0:return"title";case 1:return this.begin("acc_title"),9;case 2:return this.popState(),"acc_title_value";case 3:return this.begin("acc_descr"),11;case 4:return this.popState(),"acc_descr_value";case 5:this.begin("acc_descr_multiline");break;case 6:case 58:case 65:this.popState();break;case 7:return"acc_descr_multiline_value";case 8:return 21;case 9:return 22;case 10:return 23;case 11:return 24;case 12:return 5;case 13:case 14:case 15:case 56:break;case 16:return 8;case 17:return 6;case 18:return 27;case 19:return 40;case 20:return 29;case 21:return 32;case 22:return 31;case 23:return 34;case 24:return 36;case 25:return 38;case 26:return 41;case 27:return 42;case 28:return 43;case 29:return 44;case 30:return 45;case 31:return 46;case 32:return 47;case 33:return 48;case 34:return 49;case 35:return 50;case 36:return 51;case 37:return 52;case 38:return 53;case 39:return 54;case 40:return 65;case 41:return 66;case 42:return 67;case 43:return 68;case 44:return 69;case 45:return 70;case 46:return 71;case 47:return 57;case 48:return 59;case 49:return this.begin("style"),77;case 50:case 68:return 75;case 51:return 81;case 52:return 88;case 53:return"PERCENT";case 54:return 86;case 55:return 84;case 57:case 64:this.begin("string");break;case 59:return this.begin("style"),72;case 60:return this.begin("style"),74;case 61:return 61;case 62:return 64;case 63:return 63;case 66:return"qString";case 67:return t.yytext=t.yytext.trim(),89;case 69:return 80;case 70:return 76}}),"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:!1},acc_descr:{rules:[4,68,69,70],inclusive:!1},acc_title:{rules:[2,68,69,70],inclusive:!1},style:{rules:[50,51,52,53,54,55,56,57,58,68,69,70],inclusive:!1},unqString:{rules:[68,69,70],inclusive:!1},token:{rules:[68,69,70],inclusive:!1},string:{rules:[65,66,68,69,70],inclusive:!1},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:!0}}}}();function ue(){this.yy={}}return oe.lexer=he,(0,a.K2)(ue,"Parser"),ue.prototype=oe,oe.Parser=ue,new ue}();l.parser=l;var c=l,o=class{constructor(){this.relations=[],this.latestRequirement=this.getInitialRequirement(),this.requirements=new Map,this.latestElement=this.getInitialElement(),this.elements=new Map,this.classes=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=a.SV,this.getAccTitle=a.iN,this.setAccDescription=a.EI,this.getAccDescription=a.m7,this.setDiagramTitle=a.ke,this.getDiagramTitle=a.ab,this.getConfig=(0,a.K2)((()=>(0,a.D7)().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#e=(()=>(0,a.K2)(this,"RequirementDB"))();getDirection(){return this.direction}setDirection(e){this.direction=e}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(e,t){return this.requirements.has(e)||this.requirements.set(e,{name:e,type:t,requirementId:this.latestRequirement.requirementId,text:this.latestRequirement.text,risk:this.latestRequirement.risk,verifyMethod:this.latestRequirement.verifyMethod,cssStyles:[],classes:["default"]}),this.resetLatestRequirement(),this.requirements.get(e)}getRequirements(){return this.requirements}setNewReqId(e){void 0!==this.latestRequirement&&(this.latestRequirement.requirementId=e)}setNewReqText(e){void 0!==this.latestRequirement&&(this.latestRequirement.text=e)}setNewReqRisk(e){void 0!==this.latestRequirement&&(this.latestRequirement.risk=e)}setNewReqVerifyMethod(e){void 0!==this.latestRequirement&&(this.latestRequirement.verifyMethod=e)}addElement(e){return this.elements.has(e)||(this.elements.set(e,{name:e,type:this.latestElement.type,docRef:this.latestElement.docRef,cssStyles:[],classes:["default"]}),a.Rm.info("Added new element: ",e)),this.resetLatestElement(),this.elements.get(e)}getElements(){return this.elements}setNewElementType(e){void 0!==this.latestElement&&(this.latestElement.type=e)}setNewElementDocRef(e){void 0!==this.latestElement&&(this.latestElement.docRef=e)}addRelationship(e,t,s){this.relations.push({type:e,src:t,dst:s})}getRelationships(){return this.relations}clear(){this.relations=[],this.resetLatestRequirement(),this.requirements=new Map,this.resetLatestElement(),this.elements=new Map,this.classes=new Map,(0,a.IU)()}setCssStyle(e,t){for(const s of e){const e=this.requirements.get(s)??this.elements.get(s);if(!t||!e)return;for(const s of t)s.includes(",")?e.cssStyles.push(...s.split(",")):e.cssStyles.push(s)}}setClass(e,t){for(const s of e){const e=this.requirements.get(s)??this.elements.get(s);if(e)for(const s of t){e.classes.push(s);const t=this.classes.get(s)?.styles;t&&e.cssStyles.push(...t)}}}defineClass(e,t){for(const s of e){let e=this.classes.get(s);void 0===e&&(e={id:s,styles:[],textStyles:[]},this.classes.set(s,e)),t&&t.forEach((function(t){if(/color/.exec(t)){const s=t.replace("fill","bgFill");e.textStyles.push(s)}e.styles.push(t)})),this.requirements.forEach((e=>{e.classes.includes(s)&&e.cssStyles.push(...t.flatMap((e=>e.split(","))))})),this.elements.forEach((e=>{e.classes.includes(s)&&e.cssStyles.push(...t.flatMap((e=>e.split(","))))}))}}getClasses(){return this.classes}getData(){const e=(0,a.D7)(),t=[],s=[];for(const i of this.requirements.values()){const s=i;s.id=i.name,s.cssStyles=i.cssStyles,s.cssClasses=i.classes.join(" "),s.shape="requirementBox",s.look=e.look,t.push(s)}for(const i of this.elements.values()){const s=i;s.shape="requirementBox",s.look=e.look,s.id=i.name,s.cssStyles=i.cssStyles,s.cssClasses=i.classes.join(" "),t.push(s)}for(const i of this.relations){let t=0;const n=i.type===this.Relationships.CONTAINS,r={id:`${i.src}-${i.dst}-${t}`,start:this.requirements.get(i.src)?.name??this.elements.get(i.src)?.name,end:this.requirements.get(i.dst)?.name??this.elements.get(i.dst)?.name,label:`<<${i.type}>>`,classes:"relationshipLine",style:["fill:none",n?"":"stroke-dasharray: 10,7"],labelpos:"c",thickness:"normal",type:"normal",pattern:n?"normal":"dashed",arrowTypeStart:n?"requirement_contains":"",arrowTypeEnd:n?"":"requirement_arrow",look:e.look};s.push(r),t++}return{nodes:t,edges:s,other:{},config:e,direction:this.getDirection()}}},h=(0,a.K2)((e=>`\n\n marker {\n fill: ${e.relationColor};\n stroke: ${e.relationColor};\n }\n\n marker.cross {\n stroke: ${e.lineColor};\n }\n\n svg {\n font-family: ${e.fontFamily};\n font-size: ${e.fontSize};\n }\n\n .reqBox {\n fill: ${e.requirementBackground};\n fill-opacity: 1.0;\n stroke: ${e.requirementBorderColor};\n stroke-width: ${e.requirementBorderSize};\n }\n \n .reqTitle, .reqLabel{\n fill: ${e.requirementTextColor};\n }\n .reqLabelBox {\n fill: ${e.relationLabelBackground};\n fill-opacity: 1.0;\n }\n\n .req-title-line {\n stroke: ${e.requirementBorderColor};\n stroke-width: ${e.requirementBorderSize};\n }\n .relationshipLine {\n stroke: ${e.relationColor};\n stroke-width: 1;\n }\n .relationshipLabel {\n fill: ${e.relationLabelColor};\n }\n .divider {\n stroke: ${e.nodeBorder};\n stroke-width: 1;\n }\n .label {\n font-family: ${e.fontFamily};\n color: ${e.nodeTextColor||e.textColor};\n }\n .label text,span {\n fill: ${e.nodeTextColor||e.textColor};\n color: ${e.nodeTextColor||e.textColor};\n }\n .labelBkg {\n background-color: ${e.edgeLabelBackground};\n }\n\n`),"getStyles"),u={};(0,a.VA)(u,{draw:()=>y});var y=(0,a.K2)((async function(e,t,s,l){a.Rm.info("REF0:"),a.Rm.info("Drawing requirement diagram (unified)",t);const{securityLevel:c,state:o,layout:h}=(0,a.D7)(),u=l.db.getData(),y=(0,i.A)(t,c);u.type=l.type,u.layoutAlgorithm=(0,n.q7)(h),u.nodeSpacing=o?.nodeSpacing??50,u.rankSpacing=o?.rankSpacing??50,u.markers=["requirement_contains","requirement_arrow"],u.diagramId=t,await(0,n.XX)(u,y);r._K.insertTitle(y,"requirementDiagramTitleText",o?.titleTopMargin??25,l.db.getDiagramTitle()),(0,i.P)(y,8,"requirementDiagram",o?.useMaxWidth??!0)}),"draw"),m={parser:c,get db(){return new o},renderer:u,styles:h}},6327:(e,t,s)=>{s.d(t,{A:()=>r,P:()=>a});var i=s(3759),n=s(700),r=(0,i.K2)(((e,t)=>{let s;"sandbox"===t&&(s=(0,n.Ltv)("#i"+e));return("sandbox"===t?(0,n.Ltv)(s.nodes()[0].contentDocument.body):(0,n.Ltv)("body")).select(`[id="${e}"]`)}),"getDiagramElement"),a=(0,i.K2)(((e,t,s,n)=>{e.attr("class",s);const{width:r,height:a,x:o,y:h}=l(e,t);(0,i.a$)(e,a,r,n);const u=c(o,h,r,a,t);e.attr("viewBox",u),i.Rm.debug(`viewBox configured: ${u} with padding: ${t}`)}),"setupViewPortForSVG"),l=(0,i.K2)(((e,t)=>{const s=e.node()?.getBBox()||{width:0,height:0,x:0,y:0};return{width:s.width+2*t,height:s.height+2*t,x:s.x,y:s.y}}),"calculateDimensionsWithPadding"),c=(0,i.K2)(((e,t,s,i,n)=>`${e-n} ${t-n} ${s} ${i}`),"createViewBox")}}]); -//# sourceMappingURL=320.f30ff8c0.chunk.js.map \ No newline at end of file diff --git a/frontend/deployed/static/js/320.f30ff8c0.chunk.js.map b/frontend/deployed/static/js/320.f30ff8c0.chunk.js.map deleted file mode 100644 index 6331c69..0000000 --- a/frontend/deployed/static/js/320.f30ff8c0.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"static/js/320.f30ff8c0.chunk.js","mappings":"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","sources":["../node_modules/mermaid/dist/chunks/mermaid.core/requirementDiagram-KVF5MWMF.mjs","../node_modules/mermaid/dist/chunks/mermaid.core/chunk-RZ5BOZE2.mjs"],"sourcesContent":["import {\n getDiagramElement,\n setupViewPortForSVG\n} from \"./chunk-RZ5BOZE2.mjs\";\nimport {\n getRegisteredLayoutAlgorithm,\n render\n} from \"./chunk-TYCBKAJE.mjs\";\nimport \"./chunk-IIMUDSI4.mjs\";\nimport \"./chunk-VV3M67IP.mjs\";\nimport \"./chunk-HRU6DDCH.mjs\";\nimport \"./chunk-K557N5IZ.mjs\";\nimport \"./chunk-H2D2JQ3I.mjs\";\nimport \"./chunk-C3MQ5ANM.mjs\";\nimport {\n utils_default\n} from \"./chunk-O4NI6UNU.mjs\";\nimport {\n __export,\n __name,\n clear,\n getAccDescription,\n getAccTitle,\n getConfig2 as getConfig,\n getDiagramTitle,\n log,\n setAccDescription,\n setAccTitle,\n setDiagramTitle\n} from \"./chunk-YTJNT7DU.mjs\";\n\n// src/diagrams/requirement/parser/requirementDiagram.jison\nvar parser = function() {\n var o = /* @__PURE__ */ __name(function(k, v, o2, l) {\n for (o2 = o2 || {}, l = k.length; l--; o2[k[l]] = v) ;\n return o2;\n }, \"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];\n var parser2 = {\n trace: /* @__PURE__ */ __name(function trace() {\n }, \"trace\"),\n yy: {},\n 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 },\n 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\" },\n 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]],\n performAction: /* @__PURE__ */ __name(function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) {\n var $0 = $$.length - 1;\n switch (yystate) {\n case 4:\n this.$ = $$[$0].trim();\n yy.setAccTitle(this.$);\n break;\n case 5:\n case 6:\n this.$ = $$[$0].trim();\n yy.setAccDescription(this.$);\n break;\n case 7:\n this.$ = [];\n break;\n case 17:\n yy.setDirection(\"TB\");\n break;\n case 18:\n yy.setDirection(\"BT\");\n break;\n case 19:\n yy.setDirection(\"RL\");\n break;\n case 20:\n yy.setDirection(\"LR\");\n break;\n case 21:\n yy.addRequirement($$[$0 - 3], $$[$0 - 4]);\n break;\n case 22:\n yy.addRequirement($$[$0 - 5], $$[$0 - 6]);\n yy.setClass([$$[$0 - 5]], $$[$0 - 3]);\n break;\n case 23:\n yy.setNewReqId($$[$0 - 2]);\n break;\n case 24:\n yy.setNewReqText($$[$0 - 2]);\n break;\n case 25:\n yy.setNewReqRisk($$[$0 - 2]);\n break;\n case 26:\n yy.setNewReqVerifyMethod($$[$0 - 2]);\n break;\n case 29:\n this.$ = yy.RequirementType.REQUIREMENT;\n break;\n case 30:\n this.$ = yy.RequirementType.FUNCTIONAL_REQUIREMENT;\n break;\n case 31:\n this.$ = yy.RequirementType.INTERFACE_REQUIREMENT;\n break;\n case 32:\n this.$ = yy.RequirementType.PERFORMANCE_REQUIREMENT;\n break;\n case 33:\n this.$ = yy.RequirementType.PHYSICAL_REQUIREMENT;\n break;\n case 34:\n this.$ = yy.RequirementType.DESIGN_CONSTRAINT;\n break;\n case 35:\n this.$ = yy.RiskLevel.LOW_RISK;\n break;\n case 36:\n this.$ = yy.RiskLevel.MED_RISK;\n break;\n case 37:\n this.$ = yy.RiskLevel.HIGH_RISK;\n break;\n case 38:\n this.$ = yy.VerifyType.VERIFY_ANALYSIS;\n break;\n case 39:\n this.$ = yy.VerifyType.VERIFY_DEMONSTRATION;\n break;\n case 40:\n this.$ = yy.VerifyType.VERIFY_INSPECTION;\n break;\n case 41:\n this.$ = yy.VerifyType.VERIFY_TEST;\n break;\n case 42:\n yy.addElement($$[$0 - 3]);\n break;\n case 43:\n yy.addElement($$[$0 - 5]);\n yy.setClass([$$[$0 - 5]], $$[$0 - 3]);\n break;\n case 44:\n yy.setNewElementType($$[$0 - 2]);\n break;\n case 45:\n yy.setNewElementDocRef($$[$0 - 2]);\n break;\n case 48:\n yy.addRelationship($$[$0 - 2], $$[$0], $$[$0 - 4]);\n break;\n case 49:\n yy.addRelationship($$[$0 - 2], $$[$0 - 4], $$[$0]);\n break;\n case 50:\n this.$ = yy.Relationships.CONTAINS;\n break;\n case 51:\n this.$ = yy.Relationships.COPIES;\n break;\n case 52:\n this.$ = yy.Relationships.DERIVES;\n break;\n case 53:\n this.$ = yy.Relationships.SATISFIES;\n break;\n case 54:\n this.$ = yy.Relationships.VERIFIES;\n break;\n case 55:\n this.$ = yy.Relationships.REFINES;\n break;\n case 56:\n this.$ = yy.Relationships.TRACES;\n break;\n case 57:\n this.$ = $$[$0 - 2];\n yy.defineClass($$[$0 - 1], $$[$0]);\n break;\n case 58:\n yy.setClass($$[$0 - 1], $$[$0]);\n break;\n case 59:\n yy.setClass([$$[$0 - 2]], $$[$0]);\n break;\n case 60:\n case 62:\n this.$ = [$$[$0]];\n break;\n case 61:\n case 63:\n this.$ = $$[$0 - 2].concat([$$[$0]]);\n break;\n case 64:\n this.$ = $$[$0 - 2];\n yy.setCssStyle($$[$0 - 1], $$[$0]);\n break;\n case 65:\n this.$ = [$$[$0]];\n break;\n case 66:\n $$[$0 - 2].push($$[$0]);\n this.$ = $$[$0 - 2];\n break;\n case 68:\n this.$ = $$[$0 - 1] + $$[$0];\n break;\n }\n }, \"anonymous\"),\n 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])],\n 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] },\n parseError: /* @__PURE__ */ __name(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 }, \"parseError\"),\n parse: /* @__PURE__ */ __name(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 lexer2 = 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 lexer2.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer2;\n sharedState.yy.parser = this;\n if (typeof lexer2.yylloc == \"undefined\") {\n lexer2.yylloc = {};\n }\n var yyloc = lexer2.yylloc;\n lstack.push(yyloc);\n var ranges = lexer2.options && lexer2.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 __name(popStack, \"popStack\");\n function lex() {\n var token;\n token = tstack.pop() || lexer2.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 __name(lex, \"lex\");\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 (lexer2.showPosition) {\n errStr = \"Parse error on line \" + (yylineno + 1) + \":\\n\" + lexer2.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: lexer2.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer2.yylineno,\n loc: yyloc,\n 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(lexer2.yytext);\n lstack.push(lexer2.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = lexer2.yyleng;\n yytext = lexer2.yytext;\n yylineno = lexer2.yylineno;\n yyloc = lexer2.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 }, \"parse\")\n };\n var lexer = /* @__PURE__ */ function() {\n var lexer2 = {\n EOF: 1,\n parseError: /* @__PURE__ */ __name(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 }, \"parseError\"),\n // resets the lexer, sets new input\n setInput: /* @__PURE__ */ __name(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 }, \"setInput\"),\n // consumes and returns one char from the input\n input: /* @__PURE__ */ __name(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 this._input = this._input.slice(1);\n return ch;\n }, \"input\"),\n // unshifts one char (or a string) into the input\n unput: /* @__PURE__ */ __name(function(ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - 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 if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\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 ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len\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 }, \"unput\"),\n // When called from action, caches matched text and appends it on next action\n more: /* @__PURE__ */ __name(function() {\n this._more = true;\n return this;\n }, \"more\"),\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.\n reject: /* @__PURE__ */ __name(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 return this;\n }, \"reject\"),\n // retain first n characters of the match\n less: /* @__PURE__ */ __name(function(n) {\n this.unput(this.match.slice(n));\n }, \"less\"),\n // displays already matched input, i.e. for error messages\n pastInput: /* @__PURE__ */ __name(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 }, \"pastInput\"),\n // displays upcoming input, i.e. for error messages\n upcomingInput: /* @__PURE__ */ __name(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 }, \"upcomingInput\"),\n // displays the character position where the lexing error occurred, i.e. for error messages\n showPosition: /* @__PURE__ */ __name(function() {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n }, \"showPosition\"),\n // test the lexed token: return FALSE when not a match, otherwise return token\n test_match: /* @__PURE__ */ __name(function(match, indexed_rule) {\n var token, lines, backup;\n if (this.options.backtrack_lexer) {\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 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 ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length : 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 for (var k in backup) {\n this[k] = backup[k];\n }\n return false;\n }\n return false;\n }, \"test_match\"),\n // return next match in input\n next: /* @__PURE__ */ __name(function() {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n var token, match, tempMatch, 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;\n } else {\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 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 }, \"next\"),\n // return next match that has a token\n lex: /* @__PURE__ */ __name(function lex() {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n }, \"lex\"),\n // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\n begin: /* @__PURE__ */ __name(function begin(condition) {\n this.conditionStack.push(condition);\n }, \"begin\"),\n // pop the previously active lexer condition state off the condition stack\n popState: /* @__PURE__ */ __name(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 }, \"popState\"),\n // produce the lexer rule set which is active for the currently active lexer condition state\n _currentRules: /* @__PURE__ */ __name(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 }, \"_currentRules\"),\n // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\n topState: /* @__PURE__ */ __name(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 }, \"topState\"),\n // alias for begin(condition)\n pushState: /* @__PURE__ */ __name(function pushState(condition) {\n this.begin(condition);\n }, \"pushState\"),\n // return the number of states currently on the stack\n stateStackSize: /* @__PURE__ */ __name(function stateStackSize() {\n return this.conditionStack.length;\n }, \"stateStackSize\"),\n options: { \"case-insensitive\": true },\n performAction: /* @__PURE__ */ __name(function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) {\n var YYSTATE = YY_START;\n switch ($avoiding_name_collisions) {\n case 0:\n return \"title\";\n break;\n case 1:\n this.begin(\"acc_title\");\n return 9;\n break;\n case 2:\n this.popState();\n return \"acc_title_value\";\n break;\n case 3:\n this.begin(\"acc_descr\");\n return 11;\n break;\n case 4:\n this.popState();\n return \"acc_descr_value\";\n break;\n case 5:\n this.begin(\"acc_descr_multiline\");\n break;\n case 6:\n this.popState();\n break;\n case 7:\n return \"acc_descr_multiline_value\";\n break;\n case 8:\n return 21;\n break;\n case 9:\n return 22;\n break;\n case 10:\n return 23;\n break;\n case 11:\n return 24;\n break;\n case 12:\n return 5;\n break;\n case 13:\n break;\n case 14:\n break;\n case 15:\n break;\n case 16:\n return 8;\n break;\n case 17:\n return 6;\n break;\n case 18:\n return 27;\n break;\n case 19:\n return 40;\n break;\n case 20:\n return 29;\n break;\n case 21:\n return 32;\n break;\n case 22:\n return 31;\n break;\n case 23:\n return 34;\n break;\n case 24:\n return 36;\n break;\n case 25:\n return 38;\n break;\n case 26:\n return 41;\n break;\n case 27:\n return 42;\n break;\n case 28:\n return 43;\n break;\n case 29:\n return 44;\n break;\n case 30:\n return 45;\n break;\n case 31:\n return 46;\n break;\n case 32:\n return 47;\n break;\n case 33:\n return 48;\n break;\n case 34:\n return 49;\n break;\n case 35:\n return 50;\n break;\n case 36:\n return 51;\n break;\n case 37:\n return 52;\n break;\n case 38:\n return 53;\n break;\n case 39:\n return 54;\n break;\n case 40:\n return 65;\n break;\n case 41:\n return 66;\n break;\n case 42:\n return 67;\n break;\n case 43:\n return 68;\n break;\n case 44:\n return 69;\n break;\n case 45:\n return 70;\n break;\n case 46:\n return 71;\n break;\n case 47:\n return 57;\n break;\n case 48:\n return 59;\n break;\n case 49:\n this.begin(\"style\");\n return 77;\n break;\n case 50:\n return 75;\n break;\n case 51:\n return 81;\n break;\n case 52:\n return 88;\n break;\n case 53:\n return \"PERCENT\";\n break;\n case 54:\n return 86;\n break;\n case 55:\n return 84;\n break;\n case 56:\n break;\n case 57:\n this.begin(\"string\");\n break;\n case 58:\n this.popState();\n break;\n case 59:\n this.begin(\"style\");\n return 72;\n break;\n case 60:\n this.begin(\"style\");\n return 74;\n break;\n case 61:\n return 61;\n break;\n case 62:\n return 64;\n break;\n case 63:\n return 63;\n break;\n case 64:\n this.begin(\"string\");\n break;\n case 65:\n this.popState();\n break;\n case 66:\n return \"qString\";\n break;\n case 67:\n yy_.yytext = yy_.yytext.trim();\n return 89;\n break;\n case 68:\n return 75;\n break;\n case 69:\n return 80;\n break;\n case 70:\n return 76;\n break;\n }\n }, \"anonymous\"),\n 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],\n 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 } }\n };\n return lexer2;\n }();\n parser2.lexer = lexer;\n function Parser() {\n this.yy = {};\n }\n __name(Parser, \"Parser\");\n Parser.prototype = parser2;\n parser2.Parser = Parser;\n return new Parser();\n}();\nparser.parser = parser;\nvar requirementDiagram_default = parser;\n\n// src/diagrams/requirement/requirementDb.ts\nvar RequirementDB = class {\n constructor() {\n this.relations = [];\n this.latestRequirement = this.getInitialRequirement();\n this.requirements = /* @__PURE__ */ new Map();\n this.latestElement = this.getInitialElement();\n this.elements = /* @__PURE__ */ new Map();\n this.classes = /* @__PURE__ */ new Map();\n this.direction = \"TB\";\n this.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 this.RiskLevel = {\n LOW_RISK: \"Low\",\n MED_RISK: \"Medium\",\n HIGH_RISK: \"High\"\n };\n this.VerifyType = {\n VERIFY_ANALYSIS: \"Analysis\",\n VERIFY_DEMONSTRATION: \"Demonstration\",\n VERIFY_INSPECTION: \"Inspection\",\n VERIFY_TEST: \"Test\"\n };\n this.Relationships = {\n CONTAINS: \"contains\",\n COPIES: \"copies\",\n DERIVES: \"derives\",\n SATISFIES: \"satisfies\",\n VERIFIES: \"verifies\",\n REFINES: \"refines\",\n TRACES: \"traces\"\n };\n this.setAccTitle = setAccTitle;\n this.getAccTitle = getAccTitle;\n this.setAccDescription = setAccDescription;\n this.getAccDescription = getAccDescription;\n this.setDiagramTitle = setDiagramTitle;\n this.getDiagramTitle = getDiagramTitle;\n this.getConfig = /* @__PURE__ */ __name(() => getConfig().requirement, \"getConfig\");\n this.clear();\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 static {\n __name(this, \"RequirementDB\");\n }\n getDirection() {\n return this.direction;\n }\n setDirection(dir) {\n this.direction = dir;\n }\n resetLatestRequirement() {\n this.latestRequirement = this.getInitialRequirement();\n }\n resetLatestElement() {\n this.latestElement = this.getInitialElement();\n }\n getInitialRequirement() {\n return {\n requirementId: \"\",\n text: \"\",\n risk: \"\",\n verifyMethod: \"\",\n name: \"\",\n type: \"\",\n cssStyles: [],\n classes: [\"default\"]\n };\n }\n getInitialElement() {\n return {\n name: \"\",\n type: \"\",\n docRef: \"\",\n cssStyles: [],\n classes: [\"default\"]\n };\n }\n addRequirement(name, type) {\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 return this.requirements.get(name);\n }\n getRequirements() {\n return this.requirements;\n }\n setNewReqId(id) {\n if (this.latestRequirement !== void 0) {\n this.latestRequirement.requirementId = id;\n }\n }\n setNewReqText(text) {\n if (this.latestRequirement !== void 0) {\n this.latestRequirement.text = text;\n }\n }\n setNewReqRisk(risk) {\n if (this.latestRequirement !== void 0) {\n this.latestRequirement.risk = risk;\n }\n }\n setNewReqVerifyMethod(verifyMethod) {\n if (this.latestRequirement !== void 0) {\n this.latestRequirement.verifyMethod = verifyMethod;\n }\n }\n addElement(name) {\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 return this.elements.get(name);\n }\n getElements() {\n return this.elements;\n }\n setNewElementType(type) {\n if (this.latestElement !== void 0) {\n this.latestElement.type = type;\n }\n }\n setNewElementDocRef(docRef) {\n if (this.latestElement !== void 0) {\n this.latestElement.docRef = docRef;\n }\n }\n addRelationship(type, src, dst) {\n this.relations.push({\n type,\n src,\n dst\n });\n }\n getRelationships() {\n return this.relations;\n }\n clear() {\n this.relations = [];\n this.resetLatestRequirement();\n this.requirements = /* @__PURE__ */ new Map();\n this.resetLatestElement();\n this.elements = /* @__PURE__ */ new Map();\n this.classes = /* @__PURE__ */ new Map();\n clear();\n }\n setCssStyle(ids, styles) {\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 setClass(ids, classNames) {\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 defineClass(ids, style) {\n for (const id of ids) {\n let styleClass = this.classes.get(id);\n if (styleClass === void 0) {\n styleClass = { id, styles: [], textStyles: [] };\n this.classes.set(id, styleClass);\n }\n if (style) {\n style.forEach(function(s) {\n if (/color/.exec(s)) {\n const newStyle = s.replace(\"fill\", \"bgFill\");\n styleClass.textStyles.push(newStyle);\n }\n styleClass.styles.push(s);\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 getClasses() {\n return this.classes;\n }\n getData() {\n const config = getConfig();\n const nodes = [];\n const edges = [];\n for (const requirement of this.requirements.values()) {\n const node = requirement;\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 for (const element of this.elements.values()) {\n const node = element;\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 nodes.push(node);\n }\n for (const relation of this.relations) {\n let counter = 0;\n const isContains = relation.type === this.Relationships.CONTAINS;\n const 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 edges.push(edge);\n counter++;\n }\n return { nodes, edges, other: {}, config, direction: this.getDirection() };\n }\n};\n\n// src/diagrams/requirement/styles.js\nvar getStyles = /* @__PURE__ */ __name((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`, \"getStyles\");\nvar styles_default = getStyles;\n\n// src/diagrams/requirement/requirementRenderer.ts\nvar requirementRenderer_exports = {};\n__export(requirementRenderer_exports, {\n draw: () => draw\n});\nvar draw = /* @__PURE__ */ __name(async function(text, id, _version, diag) {\n log.info(\"REF0:\");\n log.info(\"Drawing requirement diagram (unified)\", id);\n const { securityLevel, state: conf, layout } = getConfig();\n const data4Layout = diag.db.getData();\n const svg = getDiagramElement(id, securityLevel);\n data4Layout.type = diag.type;\n data4Layout.layoutAlgorithm = getRegisteredLayoutAlgorithm(layout);\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_default.insertTitle(\n svg,\n \"requirementDiagramTitleText\",\n conf?.titleTopMargin ?? 25,\n diag.db.getDiagramTitle()\n );\n setupViewPortForSVG(svg, padding, \"requirementDiagram\", conf?.useMaxWidth ?? true);\n}, \"draw\");\n\n// src/diagrams/requirement/requirementDiagram.ts\nvar diagram = {\n parser: requirementDiagram_default,\n get db() {\n return new RequirementDB();\n },\n renderer: requirementRenderer_exports,\n styles: styles_default\n};\nexport {\n diagram\n};\n","import {\n __name,\n configureSvgSize,\n log\n} from \"./chunk-YTJNT7DU.mjs\";\n\n// src/rendering-util/insertElementsForSize.js\nimport { select } from \"d3\";\nvar getDiagramElement = /* @__PURE__ */ __name((id, securityLevel) => {\n let sandboxElement;\n if (securityLevel === \"sandbox\") {\n sandboxElement = select(\"#i\" + id);\n }\n const root = securityLevel === \"sandbox\" ? select(sandboxElement.nodes()[0].contentDocument.body) : select(\"body\");\n const svg = root.select(`[id=\"${id}\"]`);\n return svg;\n}, \"getDiagramElement\");\n\n// src/rendering-util/setupViewPortForSVG.ts\nvar setupViewPortForSVG = /* @__PURE__ */ __name((svg, padding, cssDiagram, useMaxWidth) => {\n svg.attr(\"class\", cssDiagram);\n const { width, height, x, y } = calculateDimensionsWithPadding(svg, padding);\n configureSvgSize(svg, height, width, useMaxWidth);\n const viewBox = createViewBox(x, y, width, height, padding);\n svg.attr(\"viewBox\", viewBox);\n log.debug(`viewBox configured: ${viewBox} with padding: ${padding}`);\n}, \"setupViewPortForSVG\");\nvar calculateDimensionsWithPadding = /* @__PURE__ */ __name((svg, padding) => {\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}, \"calculateDimensionsWithPadding\");\nvar createViewBox = /* @__PURE__ */ __name((x, y, width, height, padding) => {\n return `${x - padding} ${y - padding} ${width} ${height}`;\n}, \"createViewBox\");\n\nexport {\n getDiagramElement,\n setupViewPortForSVG\n};\n"],"names":["parser","o","__name","k","v","o2","l","length","$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","$VT","$VU","$VV","$VW","$VX","$VY","parser2","trace","yy","symbols_","terminals_","productions_","performAction","yytext","yyleng","yylineno","yystate","$$","_$","$0","this","$","trim","setAccTitle","setAccDescription","setDirection","addRequirement","setClass","setNewReqId","setNewReqText","setNewReqRisk","setNewReqVerifyMethod","RequirementType","REQUIREMENT","FUNCTIONAL_REQUIREMENT","INTERFACE_REQUIREMENT","PERFORMANCE_REQUIREMENT","PHYSICAL_REQUIREMENT","DESIGN_CONSTRAINT","RiskLevel","LOW_RISK","MED_RISK","HIGH_RISK","VerifyType","VERIFY_ANALYSIS","VERIFY_DEMONSTRATION","VERIFY_INSPECTION","VERIFY_TEST","addElement","setNewElementType","setNewElementDocRef","addRelationship","Relationships","CONTAINS","COPIES","DERIVES","SATISFIES","VERIFIES","REFINES","TRACES","defineClass","concat","setCssStyle","push","table","defaultActions","parseError","str","hash","recoverable","error","Error","parse","input","self","stack","tstack","vstack","lstack","recovering","args","slice","call","arguments","lexer2","Object","create","lexer","sharedState","prototype","hasOwnProperty","setInput","yylloc","yyloc","ranges","options","lex","token","pop","Array","getPrototypeOf","n","symbol","preErrorSymbol","state","action","r","p","len","newState","expected","yyval","errStr","showPosition","join","text","match","line","loc","first_line","last_line","first_column","last_column","range","apply","EOF","_input","_more","_backtrack","done","matched","conditionStack","offset","ch","unput","lines","split","substr","oldLines","more","reject","backtrack_lexer","less","pastInput","past","replace","upcomingInput","next","pre","c","test_match","indexed_rule","backup","matches","tempMatch","index","rules","_currentRules","i","flex","begin","condition","popState","conditions","topState","Math","abs","pushState","stateStackSize","yy_","$avoiding_name_collisions","YY_START","Parser","requirementDiagram_default","RequirementDB","constructor","relations","latestRequirement","getInitialRequirement","requirements","Map","latestElement","getInitialElement","elements","classes","direction","getAccTitle","getAccDescription","setDiagramTitle","getDiagramTitle","getConfig","requirement","clear","bind","getDirection","dir","resetLatestRequirement","resetLatestElement","requirementId","risk","verifyMethod","name","type","cssStyles","docRef","has","set","get","getRequirements","id","log","info","getElements","src","dst","getRelationships","ids","styles","node","s","includes","classNames","_class","style","styleClass","textStyles","forEach","exec","newStyle","value","flatMap","getClasses","getData","config","nodes","edges","values","cssClasses","shape","look","element","relation","counter","isContains","edge","start","end","label","labelpos","thickness","pattern","arrowTypeStart","arrowTypeEnd","other","styles_default","relationColor","lineColor","fontFamily","fontSize","requirementBackground","requirementBorderColor","requirementBorderSize","requirementTextColor","relationLabelBackground","relationLabelColor","nodeBorder","nodeTextColor","textColor","edgeLabelBackground","requirementRenderer_exports","__export","draw","async","_version","diag","securityLevel","conf","layout","data4Layout","db","svg","getDiagramElement","layoutAlgorithm","getRegisteredLayoutAlgorithm","nodeSpacing","rankSpacing","markers","diagramId","render","utils_default","insertTitle","titleTopMargin","setupViewPortForSVG","useMaxWidth","diagram","renderer","sandboxElement","select","contentDocument","body","padding","cssDiagram","attr","width","height","x","y","calculateDimensionsWithPadding","configureSvgSize","viewBox","createViewBox","debug","bounds","getBBox"],"sourceRoot":""} \ No newline at end of file diff --git a/frontend/deployed/static/js/349.dfb2510e.chunk.js b/frontend/deployed/static/js/349.dfb2510e.chunk.js deleted file mode 100644 index 9307990..0000000 --- a/frontend/deployed/static/js/349.dfb2510e.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunkbackstory=self.webpackChunkbackstory||[]).push([[349],{349:(e,t,r)=>{r.d(t,{default:()=>en});class a{constructor(e,t,r){this.lexer=void 0,this.start=void 0,this.end=void 0,this.lexer=e,this.start=t,this.end=r}static range(e,t){return t?e&&e.loc&&t.loc&&e.loc.lexer===t.loc.lexer?new a(e.loc.lexer,e.loc.start,t.loc.end):null:e&&e.loc}}class n{constructor(e,t){this.text=void 0,this.loc=void 0,this.noexpand=void 0,this.treatAsRelax=void 0,this.text=e,this.loc=t}range(e,t){return new n(t,a.range(this,e))}}class i{constructor(e,t){this.name=void 0,this.position=void 0,this.length=void 0,this.rawMessage=void 0;var r,a,n="KaTeX parse error: "+e,o=t&&t.loc;if(o&&o.start<=o.end){var s=o.lexer.input;r=o.start,a=o.end,r===s.length?n+=" at end of input: ":n+=" at position "+(r+1)+": ";var l=s.slice(r,a).replace(/[^]/g,"$&\u0332");n+=(r>15?"\u2026"+s.slice(r-15,r):s.slice(0,r))+l+(a+15":">","<":"<",'"':""","'":"'"},l=/[&><"']/g;var h=function e(t){return"ordgroup"===t.type||"color"===t.type?1===t.body.length?e(t.body[0]):t:"font"===t.type?e(t.body):t},m={contains:function(e,t){return-1!==e.indexOf(t)},deflt:function(e,t){return void 0===e?t:e},escape:function(e){return String(e).replace(l,(e=>s[e]))},hyphenate:function(e){return e.replace(o,"-$1").toLowerCase()},getBaseElem:h,isCharacterBox:function(e){var t=h(e);return"mathord"===t.type||"textord"===t.type||"atom"===t.type},protocolFromUrl:function(e){var t=/^[\x00-\x20]*([^\\/#?]*?)(:|�*58|�*3a|&colon)/i.exec(e);return t?":"!==t[2]?null:/^[a-zA-Z][a-zA-Z0-9+\-.]*$/.test(t[1])?t[1].toLowerCase():null:"_relative"}},c={displayMode:{type:"boolean",description:"Render math in display mode, which puts the math in display style (so \\int and \\sum are large, for example), and centers the math on the page on its own line.",cli:"-d, --display-mode"},output:{type:{enum:["htmlAndMathml","html","mathml"]},description:"Determines the markup language of the output.",cli:"-F, --format "},leqno:{type:"boolean",description:"Render display math in leqno style (left-justified tags)."},fleqn:{type:"boolean",description:"Render display math flush left."},throwOnError:{type:"boolean",default:!0,cli:"-t, --no-throw-on-error",cliDescription:"Render errors (in the color given by --error-color) instead of throwing a ParseError exception when encountering an error."},errorColor:{type:"string",default:"#cc0000",cli:"-c, --error-color ",cliDescription:"A color string given in the format 'rgb' or 'rrggbb' (no #). This option determines the color of errors rendered by the -t option.",cliProcessor:e=>"#"+e},macros:{type:"object",cli:"-m, --macro ",cliDescription:"Define custom macro of the form '\\foo:expansion' (use multiple -m arguments for multiple macros).",cliDefault:[],cliProcessor:(e,t)=>(t.push(e),t)},minRuleThickness:{type:"number",description:"Specifies a minimum thickness, in ems, for fraction lines, `\\sqrt` top lines, `{array}` vertical lines, `\\hline`, `\\hdashline`, `\\underline`, `\\overline`, and the borders of `\\fbox`, `\\boxed`, and `\\fcolorbox`.",processor:e=>Math.max(0,e),cli:"--min-rule-thickness ",cliProcessor:parseFloat},colorIsTextColor:{type:"boolean",description:"Makes \\color behave like LaTeX's 2-argument \\textcolor, instead of LaTeX's one-argument \\color mode change.",cli:"-b, --color-is-text-color"},strict:{type:[{enum:["warn","ignore","error"]},"boolean","function"],description:"Turn on strict / LaTeX faithfulness mode, which throws an error if the input uses features that are not supported by LaTeX.",cli:"-S, --strict",cliDefault:!1},trust:{type:["boolean","function"],description:"Trust the input, enabling all HTML features such as \\url.",cli:"-T, --trust"},maxSize:{type:"number",default:1/0,description:"If non-zero, all user-specified sizes, e.g. in \\rule{500em}{500em}, will be capped to maxSize ems. Otherwise, elements and spaces can be arbitrarily large",processor:e=>Math.max(0,e),cli:"-s, --max-size ",cliProcessor:parseInt},maxExpand:{type:"number",default:1e3,description:"Limit the number of macro expansions to the specified number, to prevent e.g. infinite macro loops. If set to Infinity, the macro expander will try to fully expand as in LaTeX.",processor:e=>Math.max(0,e),cli:"-e, --max-expand ",cliProcessor:e=>"Infinity"===e?1/0:parseInt(e)},globalGroup:{type:"boolean",cli:!1}};function p(e){if(e.default)return e.default;var t=e.type,r=Array.isArray(t)?t[0]:t;if("string"!==typeof r)return r.enum[0];switch(r){case"boolean":return!1;case"string":return"";case"number":return 0;case"object":return{}}}class u{constructor(e){for(var t in this.displayMode=void 0,this.output=void 0,this.leqno=void 0,this.fleqn=void 0,this.throwOnError=void 0,this.errorColor=void 0,this.macros=void 0,this.minRuleThickness=void 0,this.colorIsTextColor=void 0,this.strict=void 0,this.trust=void 0,this.maxSize=void 0,this.maxExpand=void 0,this.globalGroup=void 0,e=e||{},c)if(c.hasOwnProperty(t)){var r=c[t];this[t]=void 0!==e[t]?r.processor?r.processor(e[t]):e[t]:p(r)}}reportNonstrict(e,t,r){var a=this.strict;if("function"===typeof a&&(a=a(e,t,r)),a&&"ignore"!==a){if(!0===a||"error"===a)throw new i("LaTeX-incompatible input and strict mode is set to 'error': "+t+" ["+e+"]",r);"warn"===a?"undefined"!==typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+t+" ["+e+"]"):"undefined"!==typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+a+"': "+t+" ["+e+"]")}}useStrictBehavior(e,t,r){var a=this.strict;if("function"===typeof a)try{a=a(e,t,r)}catch(n){a="error"}return!(!a||"ignore"===a)&&(!0===a||"error"===a||("warn"===a?("undefined"!==typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to 'warn': "+t+" ["+e+"]"),!1):("undefined"!==typeof console&&console.warn("LaTeX-incompatible input and strict mode is set to unrecognized '"+a+"': "+t+" ["+e+"]"),!1)))}isTrusted(e){if(e.url&&!e.protocol){var t=m.protocolFromUrl(e.url);if(null==t)return!1;e.protocol=t}var r="function"===typeof this.trust?this.trust(e):this.trust;return Boolean(r)}}class d{constructor(e,t,r){this.id=void 0,this.size=void 0,this.cramped=void 0,this.id=e,this.size=t,this.cramped=r}sup(){return g[f[this.id]]}sub(){return g[v[this.id]]}fracNum(){return g[b[this.id]]}fracDen(){return g[y[this.id]]}cramp(){return g[x[this.id]]}text(){return g[w[this.id]]}isTight(){return this.size>=2}}var g=[new d(0,0,!1),new d(1,0,!0),new d(2,1,!1),new d(3,1,!0),new d(4,2,!1),new d(5,2,!0),new d(6,3,!1),new d(7,3,!0)],f=[4,5,4,5,6,7,6,7],v=[5,5,5,5,7,7,7,7],b=[2,3,4,5,6,7,6,7],y=[3,3,5,5,7,7,7,7],x=[1,1,3,3,5,5,7,7],w=[0,1,2,3,2,3,2,3],k={DISPLAY:g[0],TEXT:g[2],SCRIPT:g[4],SCRIPTSCRIPT:g[6]},S=[{name:"latin",blocks:[[256,591],[768,879]]},{name:"cyrillic",blocks:[[1024,1279]]},{name:"armenian",blocks:[[1328,1423]]},{name:"brahmic",blocks:[[2304,4255]]},{name:"georgian",blocks:[[4256,4351]]},{name:"cjk",blocks:[[12288,12543],[19968,40879],[65280,65376]]},{name:"hangul",blocks:[[44032,55215]]}];var M=[];function z(e){for(var t=0;t=M[t]&&e<=M[t+1])return!0;return!1}S.forEach((e=>e.blocks.forEach((e=>M.push(...e)))));var A=80,T={doubleleftarrow:"M262 157\nl10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3\n 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28\n 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5\nc2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5\n 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87\n-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7\n-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z\nm8 0v40h399730v-40zm0 194v40h399730v-40z",doublerightarrow:"M399738 392l\n-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5\n 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88\n-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68\n-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18\n-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782\nc-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3\n-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z",leftarrow:"M400000 241H110l3-3c68.7-52.7 113.7-120\n 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8\n-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247\nc-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208\n 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3\n 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202\n l-3-3h399890zM100 241v40h399900v-40z",leftbrace:"M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117\n-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7\n 5-6 9-10 13-.7 1-7.3 1-20 1H6z",leftbraceunder:"M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13\n 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688\n 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7\n-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z",leftgroup:"M400000 80\nH435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0\n 435 0h399565z",leftgroupunder:"M400000 262\nH435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219\n 435 219h399565z",leftharpoon:"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3\n-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5\n-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7\n-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z",leftharpoonplus:"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5\n 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3\n-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7\n-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z\nm0 0v40h400000v-40z",leftharpoondown:"M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333\n 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5\n 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667\n-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z",leftharpoondownplus:"M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12\n 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7\n-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0\nv40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z",lefthook:"M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5\n-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3\n-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21\n 71.5 23h399859zM103 281v-40h399897v40z",leftlinesegment:"M40 281 V428 H0 V94 H40 V241 H400000 v40z\nM40 281 V428 H0 V94 H40 V241 H400000 v40z",leftmapsto:"M40 281 V448H0V74H40V241H400000v40z\nM40 281 V448H0V74H40V241H400000v40z",leftToFrom:"M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23\n-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8\nc28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3\n 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z",longequal:"M0 50 h400000 v40H0z m0 194h40000v40H0z\nM0 50 h400000 v40H0z m0 194h40000v40H0z",midbrace:"M200428 334\nc-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14\n-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7\n 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11\n 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z",midbraceunder:"M199572 214\nc100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14\n 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3\n 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0\n-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z",oiintSize1:"M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6\n-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z\nm368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8\n60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z",oiintSize2:"M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8\n-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z\nm502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2\nc0 110 84 276 504 276s502.4-166 502.4-276z",oiiintSize1:"M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6\n-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z\nm525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0\n85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z",oiiintSize2:"M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8\n-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z\nm770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1\nc0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z",rightarrow:"M0 241v40h399891c-47.3 35.3-84 78-110 128\n-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20\n 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7\n 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85\n-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n 151.7 139 205zm0 0v40h399900v-40z",rightbrace:"M400000 542l\n-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5\ns-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1\nc124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z",rightbraceunder:"M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3\n 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237\n-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z",rightgroup:"M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0\n 3-1 3-3v-38c-76-158-257-219-435-219H0z",rightgroupunder:"M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18\n 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z",rightharpoon:"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3\n-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2\n-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58\n 69.2 92 94.5zm0 0v40h399900v-40z",rightharpoonplus:"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11\n-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7\n 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z\nm0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z",rightharpoondown:"M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8\n 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5\n-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95\n-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z",rightharpoondownplus:"M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8\n 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3\n 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3\n-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z\nm0-194v40h400000v-40zm0 0v40h400000v-40z",righthook:"M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3\n 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0\n-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21\n 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z",rightlinesegment:"M399960 241 V94 h40 V428 h-40 V281 H0 v-40z\nM399960 241 V94 h40 V428 h-40 V281 H0 v-40z",rightToFrom:"M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23\n 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32\n-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142\n-167z M100 147v40h399900v-40zM0 341v40h399900v-40z",twoheadleftarrow:"M0 167c68 40\n 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69\n-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3\n-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19\n-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101\n 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z",twoheadrightarrow:"M400000 167\nc-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3\n 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42\n 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333\n-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70\n 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z",tilde1:"M200 55.538c-77 0-168 73.953-177 73.953-3 0-7\n-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0\n 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0\n 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128\n-68.267.847-113-73.952-191-73.952z",tilde2:"M344 55.266c-142 0-300.638 81.316-311.5 86.418\n-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9\n 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114\nc1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751\n 181.476 676 181.476c-149 0-189-126.21-332-126.21z",tilde3:"M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457\n-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0\n 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697\n 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696\n -338 0-409-156.573-744-156.573z",tilde4:"M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345\n-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409\n 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9\n 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409\n -175.236-744-175.236z",vec:"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\nc-16-25.333-24-45-24-59z",widehat1:"M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22\nc-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z",widehat2:"M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widehat3:"M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widehat4:"M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10\n-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z",widecheck1:"M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1,\n-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z",widecheck2:"M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",widecheck3:"M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",widecheck4:"M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\n-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z",baraboveleftarrow:"M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202\nc4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5\nc-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130\ns-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47\n121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6\ns2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11\nc0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z\nM100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z",rightarrowabovebar:"M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32\n-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0\n13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39\n-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5\n-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\n151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z",baraboveshortleftharpoon:"M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17\nc2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21\nc-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40\nc-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z\nM0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z",rightharpoonaboveshortbar:"M0,241 l0,40c399126,0,399993,0,399993,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z",shortbaraboveleftharpoon:"M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9,\n1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7,\n-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z\nM93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z",shortrightharpoonabovebar:"M53,241l0,40c398570,0,399437,0,399437,0\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\nM500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z"};class B{constructor(e){this.children=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.children=e,this.classes=[],this.height=0,this.depth=0,this.maxFontSize=0,this.style={}}hasClass(e){return m.contains(this.classes,e)}toNode(){for(var e=document.createDocumentFragment(),t=0;te.toText())).join("")}}var C={"AMS-Regular":{32:[0,0,0,0,.25],65:[0,.68889,0,0,.72222],66:[0,.68889,0,0,.66667],67:[0,.68889,0,0,.72222],68:[0,.68889,0,0,.72222],69:[0,.68889,0,0,.66667],70:[0,.68889,0,0,.61111],71:[0,.68889,0,0,.77778],72:[0,.68889,0,0,.77778],73:[0,.68889,0,0,.38889],74:[.16667,.68889,0,0,.5],75:[0,.68889,0,0,.77778],76:[0,.68889,0,0,.66667],77:[0,.68889,0,0,.94445],78:[0,.68889,0,0,.72222],79:[.16667,.68889,0,0,.77778],80:[0,.68889,0,0,.61111],81:[.16667,.68889,0,0,.77778],82:[0,.68889,0,0,.72222],83:[0,.68889,0,0,.55556],84:[0,.68889,0,0,.66667],85:[0,.68889,0,0,.72222],86:[0,.68889,0,0,.72222],87:[0,.68889,0,0,1],88:[0,.68889,0,0,.72222],89:[0,.68889,0,0,.72222],90:[0,.68889,0,0,.66667],107:[0,.68889,0,0,.55556],160:[0,0,0,0,.25],165:[0,.675,.025,0,.75],174:[.15559,.69224,0,0,.94666],240:[0,.68889,0,0,.55556],295:[0,.68889,0,0,.54028],710:[0,.825,0,0,2.33334],732:[0,.9,0,0,2.33334],770:[0,.825,0,0,2.33334],771:[0,.9,0,0,2.33334],989:[.08167,.58167,0,0,.77778],1008:[0,.43056,.04028,0,.66667],8245:[0,.54986,0,0,.275],8463:[0,.68889,0,0,.54028],8487:[0,.68889,0,0,.72222],8498:[0,.68889,0,0,.55556],8502:[0,.68889,0,0,.66667],8503:[0,.68889,0,0,.44445],8504:[0,.68889,0,0,.66667],8513:[0,.68889,0,0,.63889],8592:[-.03598,.46402,0,0,.5],8594:[-.03598,.46402,0,0,.5],8602:[-.13313,.36687,0,0,1],8603:[-.13313,.36687,0,0,1],8606:[.01354,.52239,0,0,1],8608:[.01354,.52239,0,0,1],8610:[.01354,.52239,0,0,1.11111],8611:[.01354,.52239,0,0,1.11111],8619:[0,.54986,0,0,1],8620:[0,.54986,0,0,1],8621:[-.13313,.37788,0,0,1.38889],8622:[-.13313,.36687,0,0,1],8624:[0,.69224,0,0,.5],8625:[0,.69224,0,0,.5],8630:[0,.43056,0,0,1],8631:[0,.43056,0,0,1],8634:[.08198,.58198,0,0,.77778],8635:[.08198,.58198,0,0,.77778],8638:[.19444,.69224,0,0,.41667],8639:[.19444,.69224,0,0,.41667],8642:[.19444,.69224,0,0,.41667],8643:[.19444,.69224,0,0,.41667],8644:[.1808,.675,0,0,1],8646:[.1808,.675,0,0,1],8647:[.1808,.675,0,0,1],8648:[.19444,.69224,0,0,.83334],8649:[.1808,.675,0,0,1],8650:[.19444,.69224,0,0,.83334],8651:[.01354,.52239,0,0,1],8652:[.01354,.52239,0,0,1],8653:[-.13313,.36687,0,0,1],8654:[-.13313,.36687,0,0,1],8655:[-.13313,.36687,0,0,1],8666:[.13667,.63667,0,0,1],8667:[.13667,.63667,0,0,1],8669:[-.13313,.37788,0,0,1],8672:[-.064,.437,0,0,1.334],8674:[-.064,.437,0,0,1.334],8705:[0,.825,0,0,.5],8708:[0,.68889,0,0,.55556],8709:[.08167,.58167,0,0,.77778],8717:[0,.43056,0,0,.42917],8722:[-.03598,.46402,0,0,.5],8724:[.08198,.69224,0,0,.77778],8726:[.08167,.58167,0,0,.77778],8733:[0,.69224,0,0,.77778],8736:[0,.69224,0,0,.72222],8737:[0,.69224,0,0,.72222],8738:[.03517,.52239,0,0,.72222],8739:[.08167,.58167,0,0,.22222],8740:[.25142,.74111,0,0,.27778],8741:[.08167,.58167,0,0,.38889],8742:[.25142,.74111,0,0,.5],8756:[0,.69224,0,0,.66667],8757:[0,.69224,0,0,.66667],8764:[-.13313,.36687,0,0,.77778],8765:[-.13313,.37788,0,0,.77778],8769:[-.13313,.36687,0,0,.77778],8770:[-.03625,.46375,0,0,.77778],8774:[.30274,.79383,0,0,.77778],8776:[-.01688,.48312,0,0,.77778],8778:[.08167,.58167,0,0,.77778],8782:[.06062,.54986,0,0,.77778],8783:[.06062,.54986,0,0,.77778],8785:[.08198,.58198,0,0,.77778],8786:[.08198,.58198,0,0,.77778],8787:[.08198,.58198,0,0,.77778],8790:[0,.69224,0,0,.77778],8791:[.22958,.72958,0,0,.77778],8796:[.08198,.91667,0,0,.77778],8806:[.25583,.75583,0,0,.77778],8807:[.25583,.75583,0,0,.77778],8808:[.25142,.75726,0,0,.77778],8809:[.25142,.75726,0,0,.77778],8812:[.25583,.75583,0,0,.5],8814:[.20576,.70576,0,0,.77778],8815:[.20576,.70576,0,0,.77778],8816:[.30274,.79383,0,0,.77778],8817:[.30274,.79383,0,0,.77778],8818:[.22958,.72958,0,0,.77778],8819:[.22958,.72958,0,0,.77778],8822:[.1808,.675,0,0,.77778],8823:[.1808,.675,0,0,.77778],8828:[.13667,.63667,0,0,.77778],8829:[.13667,.63667,0,0,.77778],8830:[.22958,.72958,0,0,.77778],8831:[.22958,.72958,0,0,.77778],8832:[.20576,.70576,0,0,.77778],8833:[.20576,.70576,0,0,.77778],8840:[.30274,.79383,0,0,.77778],8841:[.30274,.79383,0,0,.77778],8842:[.13597,.63597,0,0,.77778],8843:[.13597,.63597,0,0,.77778],8847:[.03517,.54986,0,0,.77778],8848:[.03517,.54986,0,0,.77778],8858:[.08198,.58198,0,0,.77778],8859:[.08198,.58198,0,0,.77778],8861:[.08198,.58198,0,0,.77778],8862:[0,.675,0,0,.77778],8863:[0,.675,0,0,.77778],8864:[0,.675,0,0,.77778],8865:[0,.675,0,0,.77778],8872:[0,.69224,0,0,.61111],8873:[0,.69224,0,0,.72222],8874:[0,.69224,0,0,.88889],8876:[0,.68889,0,0,.61111],8877:[0,.68889,0,0,.61111],8878:[0,.68889,0,0,.72222],8879:[0,.68889,0,0,.72222],8882:[.03517,.54986,0,0,.77778],8883:[.03517,.54986,0,0,.77778],8884:[.13667,.63667,0,0,.77778],8885:[.13667,.63667,0,0,.77778],8888:[0,.54986,0,0,1.11111],8890:[.19444,.43056,0,0,.55556],8891:[.19444,.69224,0,0,.61111],8892:[.19444,.69224,0,0,.61111],8901:[0,.54986,0,0,.27778],8903:[.08167,.58167,0,0,.77778],8905:[.08167,.58167,0,0,.77778],8906:[.08167,.58167,0,0,.77778],8907:[0,.69224,0,0,.77778],8908:[0,.69224,0,0,.77778],8909:[-.03598,.46402,0,0,.77778],8910:[0,.54986,0,0,.76042],8911:[0,.54986,0,0,.76042],8912:[.03517,.54986,0,0,.77778],8913:[.03517,.54986,0,0,.77778],8914:[0,.54986,0,0,.66667],8915:[0,.54986,0,0,.66667],8916:[0,.69224,0,0,.66667],8918:[.0391,.5391,0,0,.77778],8919:[.0391,.5391,0,0,.77778],8920:[.03517,.54986,0,0,1.33334],8921:[.03517,.54986,0,0,1.33334],8922:[.38569,.88569,0,0,.77778],8923:[.38569,.88569,0,0,.77778],8926:[.13667,.63667,0,0,.77778],8927:[.13667,.63667,0,0,.77778],8928:[.30274,.79383,0,0,.77778],8929:[.30274,.79383,0,0,.77778],8934:[.23222,.74111,0,0,.77778],8935:[.23222,.74111,0,0,.77778],8936:[.23222,.74111,0,0,.77778],8937:[.23222,.74111,0,0,.77778],8938:[.20576,.70576,0,0,.77778],8939:[.20576,.70576,0,0,.77778],8940:[.30274,.79383,0,0,.77778],8941:[.30274,.79383,0,0,.77778],8994:[.19444,.69224,0,0,.77778],8995:[.19444,.69224,0,0,.77778],9416:[.15559,.69224,0,0,.90222],9484:[0,.69224,0,0,.5],9488:[0,.69224,0,0,.5],9492:[0,.37788,0,0,.5],9496:[0,.37788,0,0,.5],9585:[.19444,.68889,0,0,.88889],9586:[.19444,.74111,0,0,.88889],9632:[0,.675,0,0,.77778],9633:[0,.675,0,0,.77778],9650:[0,.54986,0,0,.72222],9651:[0,.54986,0,0,.72222],9654:[.03517,.54986,0,0,.77778],9660:[0,.54986,0,0,.72222],9661:[0,.54986,0,0,.72222],9664:[.03517,.54986,0,0,.77778],9674:[.11111,.69224,0,0,.66667],9733:[.19444,.69224,0,0,.94445],10003:[0,.69224,0,0,.83334],10016:[0,.69224,0,0,.83334],10731:[.11111,.69224,0,0,.66667],10846:[.19444,.75583,0,0,.61111],10877:[.13667,.63667,0,0,.77778],10878:[.13667,.63667,0,0,.77778],10885:[.25583,.75583,0,0,.77778],10886:[.25583,.75583,0,0,.77778],10887:[.13597,.63597,0,0,.77778],10888:[.13597,.63597,0,0,.77778],10889:[.26167,.75726,0,0,.77778],10890:[.26167,.75726,0,0,.77778],10891:[.48256,.98256,0,0,.77778],10892:[.48256,.98256,0,0,.77778],10901:[.13667,.63667,0,0,.77778],10902:[.13667,.63667,0,0,.77778],10933:[.25142,.75726,0,0,.77778],10934:[.25142,.75726,0,0,.77778],10935:[.26167,.75726,0,0,.77778],10936:[.26167,.75726,0,0,.77778],10937:[.26167,.75726,0,0,.77778],10938:[.26167,.75726,0,0,.77778],10949:[.25583,.75583,0,0,.77778],10950:[.25583,.75583,0,0,.77778],10955:[.28481,.79383,0,0,.77778],10956:[.28481,.79383,0,0,.77778],57350:[.08167,.58167,0,0,.22222],57351:[.08167,.58167,0,0,.38889],57352:[.08167,.58167,0,0,.77778],57353:[0,.43056,.04028,0,.66667],57356:[.25142,.75726,0,0,.77778],57357:[.25142,.75726,0,0,.77778],57358:[.41951,.91951,0,0,.77778],57359:[.30274,.79383,0,0,.77778],57360:[.30274,.79383,0,0,.77778],57361:[.41951,.91951,0,0,.77778],57366:[.25142,.75726,0,0,.77778],57367:[.25142,.75726,0,0,.77778],57368:[.25142,.75726,0,0,.77778],57369:[.25142,.75726,0,0,.77778],57370:[.13597,.63597,0,0,.77778],57371:[.13597,.63597,0,0,.77778]},"Caligraphic-Regular":{32:[0,0,0,0,.25],65:[0,.68333,0,.19445,.79847],66:[0,.68333,.03041,.13889,.65681],67:[0,.68333,.05834,.13889,.52653],68:[0,.68333,.02778,.08334,.77139],69:[0,.68333,.08944,.11111,.52778],70:[0,.68333,.09931,.11111,.71875],71:[.09722,.68333,.0593,.11111,.59487],72:[0,.68333,.00965,.11111,.84452],73:[0,.68333,.07382,0,.54452],74:[.09722,.68333,.18472,.16667,.67778],75:[0,.68333,.01445,.05556,.76195],76:[0,.68333,0,.13889,.68972],77:[0,.68333,0,.13889,1.2009],78:[0,.68333,.14736,.08334,.82049],79:[0,.68333,.02778,.11111,.79611],80:[0,.68333,.08222,.08334,.69556],81:[.09722,.68333,0,.11111,.81667],82:[0,.68333,0,.08334,.8475],83:[0,.68333,.075,.13889,.60556],84:[0,.68333,.25417,0,.54464],85:[0,.68333,.09931,.08334,.62583],86:[0,.68333,.08222,0,.61278],87:[0,.68333,.08222,.08334,.98778],88:[0,.68333,.14643,.13889,.7133],89:[.09722,.68333,.08222,.08334,.66834],90:[0,.68333,.07944,.13889,.72473],160:[0,0,0,0,.25]},"Fraktur-Regular":{32:[0,0,0,0,.25],33:[0,.69141,0,0,.29574],34:[0,.69141,0,0,.21471],38:[0,.69141,0,0,.73786],39:[0,.69141,0,0,.21201],40:[.24982,.74947,0,0,.38865],41:[.24982,.74947,0,0,.38865],42:[0,.62119,0,0,.27764],43:[.08319,.58283,0,0,.75623],44:[0,.10803,0,0,.27764],45:[.08319,.58283,0,0,.75623],46:[0,.10803,0,0,.27764],47:[.24982,.74947,0,0,.50181],48:[0,.47534,0,0,.50181],49:[0,.47534,0,0,.50181],50:[0,.47534,0,0,.50181],51:[.18906,.47534,0,0,.50181],52:[.18906,.47534,0,0,.50181],53:[.18906,.47534,0,0,.50181],54:[0,.69141,0,0,.50181],55:[.18906,.47534,0,0,.50181],56:[0,.69141,0,0,.50181],57:[.18906,.47534,0,0,.50181],58:[0,.47534,0,0,.21606],59:[.12604,.47534,0,0,.21606],61:[-.13099,.36866,0,0,.75623],63:[0,.69141,0,0,.36245],65:[0,.69141,0,0,.7176],66:[0,.69141,0,0,.88397],67:[0,.69141,0,0,.61254],68:[0,.69141,0,0,.83158],69:[0,.69141,0,0,.66278],70:[.12604,.69141,0,0,.61119],71:[0,.69141,0,0,.78539],72:[.06302,.69141,0,0,.7203],73:[0,.69141,0,0,.55448],74:[.12604,.69141,0,0,.55231],75:[0,.69141,0,0,.66845],76:[0,.69141,0,0,.66602],77:[0,.69141,0,0,1.04953],78:[0,.69141,0,0,.83212],79:[0,.69141,0,0,.82699],80:[.18906,.69141,0,0,.82753],81:[.03781,.69141,0,0,.82699],82:[0,.69141,0,0,.82807],83:[0,.69141,0,0,.82861],84:[0,.69141,0,0,.66899],85:[0,.69141,0,0,.64576],86:[0,.69141,0,0,.83131],87:[0,.69141,0,0,1.04602],88:[0,.69141,0,0,.71922],89:[.18906,.69141,0,0,.83293],90:[.12604,.69141,0,0,.60201],91:[.24982,.74947,0,0,.27764],93:[.24982,.74947,0,0,.27764],94:[0,.69141,0,0,.49965],97:[0,.47534,0,0,.50046],98:[0,.69141,0,0,.51315],99:[0,.47534,0,0,.38946],100:[0,.62119,0,0,.49857],101:[0,.47534,0,0,.40053],102:[.18906,.69141,0,0,.32626],103:[.18906,.47534,0,0,.5037],104:[.18906,.69141,0,0,.52126],105:[0,.69141,0,0,.27899],106:[0,.69141,0,0,.28088],107:[0,.69141,0,0,.38946],108:[0,.69141,0,0,.27953],109:[0,.47534,0,0,.76676],110:[0,.47534,0,0,.52666],111:[0,.47534,0,0,.48885],112:[.18906,.52396,0,0,.50046],113:[.18906,.47534,0,0,.48912],114:[0,.47534,0,0,.38919],115:[0,.47534,0,0,.44266],116:[0,.62119,0,0,.33301],117:[0,.47534,0,0,.5172],118:[0,.52396,0,0,.5118],119:[0,.52396,0,0,.77351],120:[.18906,.47534,0,0,.38865],121:[.18906,.47534,0,0,.49884],122:[.18906,.47534,0,0,.39054],160:[0,0,0,0,.25],8216:[0,.69141,0,0,.21471],8217:[0,.69141,0,0,.21471],58112:[0,.62119,0,0,.49749],58113:[0,.62119,0,0,.4983],58114:[.18906,.69141,0,0,.33328],58115:[.18906,.69141,0,0,.32923],58116:[.18906,.47534,0,0,.50343],58117:[0,.69141,0,0,.33301],58118:[0,.62119,0,0,.33409],58119:[0,.47534,0,0,.50073]},"Main-Bold":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.35],34:[0,.69444,0,0,.60278],35:[.19444,.69444,0,0,.95833],36:[.05556,.75,0,0,.575],37:[.05556,.75,0,0,.95833],38:[0,.69444,0,0,.89444],39:[0,.69444,0,0,.31944],40:[.25,.75,0,0,.44722],41:[.25,.75,0,0,.44722],42:[0,.75,0,0,.575],43:[.13333,.63333,0,0,.89444],44:[.19444,.15556,0,0,.31944],45:[0,.44444,0,0,.38333],46:[0,.15556,0,0,.31944],47:[.25,.75,0,0,.575],48:[0,.64444,0,0,.575],49:[0,.64444,0,0,.575],50:[0,.64444,0,0,.575],51:[0,.64444,0,0,.575],52:[0,.64444,0,0,.575],53:[0,.64444,0,0,.575],54:[0,.64444,0,0,.575],55:[0,.64444,0,0,.575],56:[0,.64444,0,0,.575],57:[0,.64444,0,0,.575],58:[0,.44444,0,0,.31944],59:[.19444,.44444,0,0,.31944],60:[.08556,.58556,0,0,.89444],61:[-.10889,.39111,0,0,.89444],62:[.08556,.58556,0,0,.89444],63:[0,.69444,0,0,.54305],64:[0,.69444,0,0,.89444],65:[0,.68611,0,0,.86944],66:[0,.68611,0,0,.81805],67:[0,.68611,0,0,.83055],68:[0,.68611,0,0,.88194],69:[0,.68611,0,0,.75555],70:[0,.68611,0,0,.72361],71:[0,.68611,0,0,.90416],72:[0,.68611,0,0,.9],73:[0,.68611,0,0,.43611],74:[0,.68611,0,0,.59444],75:[0,.68611,0,0,.90138],76:[0,.68611,0,0,.69166],77:[0,.68611,0,0,1.09166],78:[0,.68611,0,0,.9],79:[0,.68611,0,0,.86388],80:[0,.68611,0,0,.78611],81:[.19444,.68611,0,0,.86388],82:[0,.68611,0,0,.8625],83:[0,.68611,0,0,.63889],84:[0,.68611,0,0,.8],85:[0,.68611,0,0,.88472],86:[0,.68611,.01597,0,.86944],87:[0,.68611,.01597,0,1.18888],88:[0,.68611,0,0,.86944],89:[0,.68611,.02875,0,.86944],90:[0,.68611,0,0,.70277],91:[.25,.75,0,0,.31944],92:[.25,.75,0,0,.575],93:[.25,.75,0,0,.31944],94:[0,.69444,0,0,.575],95:[.31,.13444,.03194,0,.575],97:[0,.44444,0,0,.55902],98:[0,.69444,0,0,.63889],99:[0,.44444,0,0,.51111],100:[0,.69444,0,0,.63889],101:[0,.44444,0,0,.52708],102:[0,.69444,.10903,0,.35139],103:[.19444,.44444,.01597,0,.575],104:[0,.69444,0,0,.63889],105:[0,.69444,0,0,.31944],106:[.19444,.69444,0,0,.35139],107:[0,.69444,0,0,.60694],108:[0,.69444,0,0,.31944],109:[0,.44444,0,0,.95833],110:[0,.44444,0,0,.63889],111:[0,.44444,0,0,.575],112:[.19444,.44444,0,0,.63889],113:[.19444,.44444,0,0,.60694],114:[0,.44444,0,0,.47361],115:[0,.44444,0,0,.45361],116:[0,.63492,0,0,.44722],117:[0,.44444,0,0,.63889],118:[0,.44444,.01597,0,.60694],119:[0,.44444,.01597,0,.83055],120:[0,.44444,0,0,.60694],121:[.19444,.44444,.01597,0,.60694],122:[0,.44444,0,0,.51111],123:[.25,.75,0,0,.575],124:[.25,.75,0,0,.31944],125:[.25,.75,0,0,.575],126:[.35,.34444,0,0,.575],160:[0,0,0,0,.25],163:[0,.69444,0,0,.86853],168:[0,.69444,0,0,.575],172:[0,.44444,0,0,.76666],176:[0,.69444,0,0,.86944],177:[.13333,.63333,0,0,.89444],184:[.17014,0,0,0,.51111],198:[0,.68611,0,0,1.04166],215:[.13333,.63333,0,0,.89444],216:[.04861,.73472,0,0,.89444],223:[0,.69444,0,0,.59722],230:[0,.44444,0,0,.83055],247:[.13333,.63333,0,0,.89444],248:[.09722,.54167,0,0,.575],305:[0,.44444,0,0,.31944],338:[0,.68611,0,0,1.16944],339:[0,.44444,0,0,.89444],567:[.19444,.44444,0,0,.35139],710:[0,.69444,0,0,.575],711:[0,.63194,0,0,.575],713:[0,.59611,0,0,.575],714:[0,.69444,0,0,.575],715:[0,.69444,0,0,.575],728:[0,.69444,0,0,.575],729:[0,.69444,0,0,.31944],730:[0,.69444,0,0,.86944],732:[0,.69444,0,0,.575],733:[0,.69444,0,0,.575],915:[0,.68611,0,0,.69166],916:[0,.68611,0,0,.95833],920:[0,.68611,0,0,.89444],923:[0,.68611,0,0,.80555],926:[0,.68611,0,0,.76666],928:[0,.68611,0,0,.9],931:[0,.68611,0,0,.83055],933:[0,.68611,0,0,.89444],934:[0,.68611,0,0,.83055],936:[0,.68611,0,0,.89444],937:[0,.68611,0,0,.83055],8211:[0,.44444,.03194,0,.575],8212:[0,.44444,.03194,0,1.14999],8216:[0,.69444,0,0,.31944],8217:[0,.69444,0,0,.31944],8220:[0,.69444,0,0,.60278],8221:[0,.69444,0,0,.60278],8224:[.19444,.69444,0,0,.51111],8225:[.19444,.69444,0,0,.51111],8242:[0,.55556,0,0,.34444],8407:[0,.72444,.15486,0,.575],8463:[0,.69444,0,0,.66759],8465:[0,.69444,0,0,.83055],8467:[0,.69444,0,0,.47361],8472:[.19444,.44444,0,0,.74027],8476:[0,.69444,0,0,.83055],8501:[0,.69444,0,0,.70277],8592:[-.10889,.39111,0,0,1.14999],8593:[.19444,.69444,0,0,.575],8594:[-.10889,.39111,0,0,1.14999],8595:[.19444,.69444,0,0,.575],8596:[-.10889,.39111,0,0,1.14999],8597:[.25,.75,0,0,.575],8598:[.19444,.69444,0,0,1.14999],8599:[.19444,.69444,0,0,1.14999],8600:[.19444,.69444,0,0,1.14999],8601:[.19444,.69444,0,0,1.14999],8636:[-.10889,.39111,0,0,1.14999],8637:[-.10889,.39111,0,0,1.14999],8640:[-.10889,.39111,0,0,1.14999],8641:[-.10889,.39111,0,0,1.14999],8656:[-.10889,.39111,0,0,1.14999],8657:[.19444,.69444,0,0,.70277],8658:[-.10889,.39111,0,0,1.14999],8659:[.19444,.69444,0,0,.70277],8660:[-.10889,.39111,0,0,1.14999],8661:[.25,.75,0,0,.70277],8704:[0,.69444,0,0,.63889],8706:[0,.69444,.06389,0,.62847],8707:[0,.69444,0,0,.63889],8709:[.05556,.75,0,0,.575],8711:[0,.68611,0,0,.95833],8712:[.08556,.58556,0,0,.76666],8715:[.08556,.58556,0,0,.76666],8722:[.13333,.63333,0,0,.89444],8723:[.13333,.63333,0,0,.89444],8725:[.25,.75,0,0,.575],8726:[.25,.75,0,0,.575],8727:[-.02778,.47222,0,0,.575],8728:[-.02639,.47361,0,0,.575],8729:[-.02639,.47361,0,0,.575],8730:[.18,.82,0,0,.95833],8733:[0,.44444,0,0,.89444],8734:[0,.44444,0,0,1.14999],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.31944],8741:[.25,.75,0,0,.575],8743:[0,.55556,0,0,.76666],8744:[0,.55556,0,0,.76666],8745:[0,.55556,0,0,.76666],8746:[0,.55556,0,0,.76666],8747:[.19444,.69444,.12778,0,.56875],8764:[-.10889,.39111,0,0,.89444],8768:[.19444,.69444,0,0,.31944],8771:[.00222,.50222,0,0,.89444],8773:[.027,.638,0,0,.894],8776:[.02444,.52444,0,0,.89444],8781:[.00222,.50222,0,0,.89444],8801:[.00222,.50222,0,0,.89444],8804:[.19667,.69667,0,0,.89444],8805:[.19667,.69667,0,0,.89444],8810:[.08556,.58556,0,0,1.14999],8811:[.08556,.58556,0,0,1.14999],8826:[.08556,.58556,0,0,.89444],8827:[.08556,.58556,0,0,.89444],8834:[.08556,.58556,0,0,.89444],8835:[.08556,.58556,0,0,.89444],8838:[.19667,.69667,0,0,.89444],8839:[.19667,.69667,0,0,.89444],8846:[0,.55556,0,0,.76666],8849:[.19667,.69667,0,0,.89444],8850:[.19667,.69667,0,0,.89444],8851:[0,.55556,0,0,.76666],8852:[0,.55556,0,0,.76666],8853:[.13333,.63333,0,0,.89444],8854:[.13333,.63333,0,0,.89444],8855:[.13333,.63333,0,0,.89444],8856:[.13333,.63333,0,0,.89444],8857:[.13333,.63333,0,0,.89444],8866:[0,.69444,0,0,.70277],8867:[0,.69444,0,0,.70277],8868:[0,.69444,0,0,.89444],8869:[0,.69444,0,0,.89444],8900:[-.02639,.47361,0,0,.575],8901:[-.02639,.47361,0,0,.31944],8902:[-.02778,.47222,0,0,.575],8968:[.25,.75,0,0,.51111],8969:[.25,.75,0,0,.51111],8970:[.25,.75,0,0,.51111],8971:[.25,.75,0,0,.51111],8994:[-.13889,.36111,0,0,1.14999],8995:[-.13889,.36111,0,0,1.14999],9651:[.19444,.69444,0,0,1.02222],9657:[-.02778,.47222,0,0,.575],9661:[.19444,.69444,0,0,1.02222],9667:[-.02778,.47222,0,0,.575],9711:[.19444,.69444,0,0,1.14999],9824:[.12963,.69444,0,0,.89444],9825:[.12963,.69444,0,0,.89444],9826:[.12963,.69444,0,0,.89444],9827:[.12963,.69444,0,0,.89444],9837:[0,.75,0,0,.44722],9838:[.19444,.69444,0,0,.44722],9839:[.19444,.69444,0,0,.44722],10216:[.25,.75,0,0,.44722],10217:[.25,.75,0,0,.44722],10815:[0,.68611,0,0,.9],10927:[.19667,.69667,0,0,.89444],10928:[.19667,.69667,0,0,.89444],57376:[.19444,.69444,0,0,0]},"Main-BoldItalic":{32:[0,0,0,0,.25],33:[0,.69444,.11417,0,.38611],34:[0,.69444,.07939,0,.62055],35:[.19444,.69444,.06833,0,.94444],37:[.05556,.75,.12861,0,.94444],38:[0,.69444,.08528,0,.88555],39:[0,.69444,.12945,0,.35555],40:[.25,.75,.15806,0,.47333],41:[.25,.75,.03306,0,.47333],42:[0,.75,.14333,0,.59111],43:[.10333,.60333,.03306,0,.88555],44:[.19444,.14722,0,0,.35555],45:[0,.44444,.02611,0,.41444],46:[0,.14722,0,0,.35555],47:[.25,.75,.15806,0,.59111],48:[0,.64444,.13167,0,.59111],49:[0,.64444,.13167,0,.59111],50:[0,.64444,.13167,0,.59111],51:[0,.64444,.13167,0,.59111],52:[.19444,.64444,.13167,0,.59111],53:[0,.64444,.13167,0,.59111],54:[0,.64444,.13167,0,.59111],55:[.19444,.64444,.13167,0,.59111],56:[0,.64444,.13167,0,.59111],57:[0,.64444,.13167,0,.59111],58:[0,.44444,.06695,0,.35555],59:[.19444,.44444,.06695,0,.35555],61:[-.10889,.39111,.06833,0,.88555],63:[0,.69444,.11472,0,.59111],64:[0,.69444,.09208,0,.88555],65:[0,.68611,0,0,.86555],66:[0,.68611,.0992,0,.81666],67:[0,.68611,.14208,0,.82666],68:[0,.68611,.09062,0,.87555],69:[0,.68611,.11431,0,.75666],70:[0,.68611,.12903,0,.72722],71:[0,.68611,.07347,0,.89527],72:[0,.68611,.17208,0,.8961],73:[0,.68611,.15681,0,.47166],74:[0,.68611,.145,0,.61055],75:[0,.68611,.14208,0,.89499],76:[0,.68611,0,0,.69777],77:[0,.68611,.17208,0,1.07277],78:[0,.68611,.17208,0,.8961],79:[0,.68611,.09062,0,.85499],80:[0,.68611,.0992,0,.78721],81:[.19444,.68611,.09062,0,.85499],82:[0,.68611,.02559,0,.85944],83:[0,.68611,.11264,0,.64999],84:[0,.68611,.12903,0,.7961],85:[0,.68611,.17208,0,.88083],86:[0,.68611,.18625,0,.86555],87:[0,.68611,.18625,0,1.15999],88:[0,.68611,.15681,0,.86555],89:[0,.68611,.19803,0,.86555],90:[0,.68611,.14208,0,.70888],91:[.25,.75,.1875,0,.35611],93:[.25,.75,.09972,0,.35611],94:[0,.69444,.06709,0,.59111],95:[.31,.13444,.09811,0,.59111],97:[0,.44444,.09426,0,.59111],98:[0,.69444,.07861,0,.53222],99:[0,.44444,.05222,0,.53222],100:[0,.69444,.10861,0,.59111],101:[0,.44444,.085,0,.53222],102:[.19444,.69444,.21778,0,.4],103:[.19444,.44444,.105,0,.53222],104:[0,.69444,.09426,0,.59111],105:[0,.69326,.11387,0,.35555],106:[.19444,.69326,.1672,0,.35555],107:[0,.69444,.11111,0,.53222],108:[0,.69444,.10861,0,.29666],109:[0,.44444,.09426,0,.94444],110:[0,.44444,.09426,0,.64999],111:[0,.44444,.07861,0,.59111],112:[.19444,.44444,.07861,0,.59111],113:[.19444,.44444,.105,0,.53222],114:[0,.44444,.11111,0,.50167],115:[0,.44444,.08167,0,.48694],116:[0,.63492,.09639,0,.385],117:[0,.44444,.09426,0,.62055],118:[0,.44444,.11111,0,.53222],119:[0,.44444,.11111,0,.76777],120:[0,.44444,.12583,0,.56055],121:[.19444,.44444,.105,0,.56166],122:[0,.44444,.13889,0,.49055],126:[.35,.34444,.11472,0,.59111],160:[0,0,0,0,.25],168:[0,.69444,.11473,0,.59111],176:[0,.69444,0,0,.94888],184:[.17014,0,0,0,.53222],198:[0,.68611,.11431,0,1.02277],216:[.04861,.73472,.09062,0,.88555],223:[.19444,.69444,.09736,0,.665],230:[0,.44444,.085,0,.82666],248:[.09722,.54167,.09458,0,.59111],305:[0,.44444,.09426,0,.35555],338:[0,.68611,.11431,0,1.14054],339:[0,.44444,.085,0,.82666],567:[.19444,.44444,.04611,0,.385],710:[0,.69444,.06709,0,.59111],711:[0,.63194,.08271,0,.59111],713:[0,.59444,.10444,0,.59111],714:[0,.69444,.08528,0,.59111],715:[0,.69444,0,0,.59111],728:[0,.69444,.10333,0,.59111],729:[0,.69444,.12945,0,.35555],730:[0,.69444,0,0,.94888],732:[0,.69444,.11472,0,.59111],733:[0,.69444,.11472,0,.59111],915:[0,.68611,.12903,0,.69777],916:[0,.68611,0,0,.94444],920:[0,.68611,.09062,0,.88555],923:[0,.68611,0,0,.80666],926:[0,.68611,.15092,0,.76777],928:[0,.68611,.17208,0,.8961],931:[0,.68611,.11431,0,.82666],933:[0,.68611,.10778,0,.88555],934:[0,.68611,.05632,0,.82666],936:[0,.68611,.10778,0,.88555],937:[0,.68611,.0992,0,.82666],8211:[0,.44444,.09811,0,.59111],8212:[0,.44444,.09811,0,1.18221],8216:[0,.69444,.12945,0,.35555],8217:[0,.69444,.12945,0,.35555],8220:[0,.69444,.16772,0,.62055],8221:[0,.69444,.07939,0,.62055]},"Main-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.12417,0,.30667],34:[0,.69444,.06961,0,.51444],35:[.19444,.69444,.06616,0,.81777],37:[.05556,.75,.13639,0,.81777],38:[0,.69444,.09694,0,.76666],39:[0,.69444,.12417,0,.30667],40:[.25,.75,.16194,0,.40889],41:[.25,.75,.03694,0,.40889],42:[0,.75,.14917,0,.51111],43:[.05667,.56167,.03694,0,.76666],44:[.19444,.10556,0,0,.30667],45:[0,.43056,.02826,0,.35778],46:[0,.10556,0,0,.30667],47:[.25,.75,.16194,0,.51111],48:[0,.64444,.13556,0,.51111],49:[0,.64444,.13556,0,.51111],50:[0,.64444,.13556,0,.51111],51:[0,.64444,.13556,0,.51111],52:[.19444,.64444,.13556,0,.51111],53:[0,.64444,.13556,0,.51111],54:[0,.64444,.13556,0,.51111],55:[.19444,.64444,.13556,0,.51111],56:[0,.64444,.13556,0,.51111],57:[0,.64444,.13556,0,.51111],58:[0,.43056,.0582,0,.30667],59:[.19444,.43056,.0582,0,.30667],61:[-.13313,.36687,.06616,0,.76666],63:[0,.69444,.1225,0,.51111],64:[0,.69444,.09597,0,.76666],65:[0,.68333,0,0,.74333],66:[0,.68333,.10257,0,.70389],67:[0,.68333,.14528,0,.71555],68:[0,.68333,.09403,0,.755],69:[0,.68333,.12028,0,.67833],70:[0,.68333,.13305,0,.65277],71:[0,.68333,.08722,0,.77361],72:[0,.68333,.16389,0,.74333],73:[0,.68333,.15806,0,.38555],74:[0,.68333,.14028,0,.525],75:[0,.68333,.14528,0,.76888],76:[0,.68333,0,0,.62722],77:[0,.68333,.16389,0,.89666],78:[0,.68333,.16389,0,.74333],79:[0,.68333,.09403,0,.76666],80:[0,.68333,.10257,0,.67833],81:[.19444,.68333,.09403,0,.76666],82:[0,.68333,.03868,0,.72944],83:[0,.68333,.11972,0,.56222],84:[0,.68333,.13305,0,.71555],85:[0,.68333,.16389,0,.74333],86:[0,.68333,.18361,0,.74333],87:[0,.68333,.18361,0,.99888],88:[0,.68333,.15806,0,.74333],89:[0,.68333,.19383,0,.74333],90:[0,.68333,.14528,0,.61333],91:[.25,.75,.1875,0,.30667],93:[.25,.75,.10528,0,.30667],94:[0,.69444,.06646,0,.51111],95:[.31,.12056,.09208,0,.51111],97:[0,.43056,.07671,0,.51111],98:[0,.69444,.06312,0,.46],99:[0,.43056,.05653,0,.46],100:[0,.69444,.10333,0,.51111],101:[0,.43056,.07514,0,.46],102:[.19444,.69444,.21194,0,.30667],103:[.19444,.43056,.08847,0,.46],104:[0,.69444,.07671,0,.51111],105:[0,.65536,.1019,0,.30667],106:[.19444,.65536,.14467,0,.30667],107:[0,.69444,.10764,0,.46],108:[0,.69444,.10333,0,.25555],109:[0,.43056,.07671,0,.81777],110:[0,.43056,.07671,0,.56222],111:[0,.43056,.06312,0,.51111],112:[.19444,.43056,.06312,0,.51111],113:[.19444,.43056,.08847,0,.46],114:[0,.43056,.10764,0,.42166],115:[0,.43056,.08208,0,.40889],116:[0,.61508,.09486,0,.33222],117:[0,.43056,.07671,0,.53666],118:[0,.43056,.10764,0,.46],119:[0,.43056,.10764,0,.66444],120:[0,.43056,.12042,0,.46389],121:[.19444,.43056,.08847,0,.48555],122:[0,.43056,.12292,0,.40889],126:[.35,.31786,.11585,0,.51111],160:[0,0,0,0,.25],168:[0,.66786,.10474,0,.51111],176:[0,.69444,0,0,.83129],184:[.17014,0,0,0,.46],198:[0,.68333,.12028,0,.88277],216:[.04861,.73194,.09403,0,.76666],223:[.19444,.69444,.10514,0,.53666],230:[0,.43056,.07514,0,.71555],248:[.09722,.52778,.09194,0,.51111],338:[0,.68333,.12028,0,.98499],339:[0,.43056,.07514,0,.71555],710:[0,.69444,.06646,0,.51111],711:[0,.62847,.08295,0,.51111],713:[0,.56167,.10333,0,.51111],714:[0,.69444,.09694,0,.51111],715:[0,.69444,0,0,.51111],728:[0,.69444,.10806,0,.51111],729:[0,.66786,.11752,0,.30667],730:[0,.69444,0,0,.83129],732:[0,.66786,.11585,0,.51111],733:[0,.69444,.1225,0,.51111],915:[0,.68333,.13305,0,.62722],916:[0,.68333,0,0,.81777],920:[0,.68333,.09403,0,.76666],923:[0,.68333,0,0,.69222],926:[0,.68333,.15294,0,.66444],928:[0,.68333,.16389,0,.74333],931:[0,.68333,.12028,0,.71555],933:[0,.68333,.11111,0,.76666],934:[0,.68333,.05986,0,.71555],936:[0,.68333,.11111,0,.76666],937:[0,.68333,.10257,0,.71555],8211:[0,.43056,.09208,0,.51111],8212:[0,.43056,.09208,0,1.02222],8216:[0,.69444,.12417,0,.30667],8217:[0,.69444,.12417,0,.30667],8220:[0,.69444,.1685,0,.51444],8221:[0,.69444,.06961,0,.51444],8463:[0,.68889,0,0,.54028]},"Main-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.27778],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.77778],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.19444,.10556,0,0,.27778],45:[0,.43056,0,0,.33333],46:[0,.10556,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.64444,0,0,.5],49:[0,.64444,0,0,.5],50:[0,.64444,0,0,.5],51:[0,.64444,0,0,.5],52:[0,.64444,0,0,.5],53:[0,.64444,0,0,.5],54:[0,.64444,0,0,.5],55:[0,.64444,0,0,.5],56:[0,.64444,0,0,.5],57:[0,.64444,0,0,.5],58:[0,.43056,0,0,.27778],59:[.19444,.43056,0,0,.27778],60:[.0391,.5391,0,0,.77778],61:[-.13313,.36687,0,0,.77778],62:[.0391,.5391,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.77778],65:[0,.68333,0,0,.75],66:[0,.68333,0,0,.70834],67:[0,.68333,0,0,.72222],68:[0,.68333,0,0,.76389],69:[0,.68333,0,0,.68056],70:[0,.68333,0,0,.65278],71:[0,.68333,0,0,.78472],72:[0,.68333,0,0,.75],73:[0,.68333,0,0,.36111],74:[0,.68333,0,0,.51389],75:[0,.68333,0,0,.77778],76:[0,.68333,0,0,.625],77:[0,.68333,0,0,.91667],78:[0,.68333,0,0,.75],79:[0,.68333,0,0,.77778],80:[0,.68333,0,0,.68056],81:[.19444,.68333,0,0,.77778],82:[0,.68333,0,0,.73611],83:[0,.68333,0,0,.55556],84:[0,.68333,0,0,.72222],85:[0,.68333,0,0,.75],86:[0,.68333,.01389,0,.75],87:[0,.68333,.01389,0,1.02778],88:[0,.68333,0,0,.75],89:[0,.68333,.025,0,.75],90:[0,.68333,0,0,.61111],91:[.25,.75,0,0,.27778],92:[.25,.75,0,0,.5],93:[.25,.75,0,0,.27778],94:[0,.69444,0,0,.5],95:[.31,.12056,.02778,0,.5],97:[0,.43056,0,0,.5],98:[0,.69444,0,0,.55556],99:[0,.43056,0,0,.44445],100:[0,.69444,0,0,.55556],101:[0,.43056,0,0,.44445],102:[0,.69444,.07778,0,.30556],103:[.19444,.43056,.01389,0,.5],104:[0,.69444,0,0,.55556],105:[0,.66786,0,0,.27778],106:[.19444,.66786,0,0,.30556],107:[0,.69444,0,0,.52778],108:[0,.69444,0,0,.27778],109:[0,.43056,0,0,.83334],110:[0,.43056,0,0,.55556],111:[0,.43056,0,0,.5],112:[.19444,.43056,0,0,.55556],113:[.19444,.43056,0,0,.52778],114:[0,.43056,0,0,.39167],115:[0,.43056,0,0,.39445],116:[0,.61508,0,0,.38889],117:[0,.43056,0,0,.55556],118:[0,.43056,.01389,0,.52778],119:[0,.43056,.01389,0,.72222],120:[0,.43056,0,0,.52778],121:[.19444,.43056,.01389,0,.52778],122:[0,.43056,0,0,.44445],123:[.25,.75,0,0,.5],124:[.25,.75,0,0,.27778],125:[.25,.75,0,0,.5],126:[.35,.31786,0,0,.5],160:[0,0,0,0,.25],163:[0,.69444,0,0,.76909],167:[.19444,.69444,0,0,.44445],168:[0,.66786,0,0,.5],172:[0,.43056,0,0,.66667],176:[0,.69444,0,0,.75],177:[.08333,.58333,0,0,.77778],182:[.19444,.69444,0,0,.61111],184:[.17014,0,0,0,.44445],198:[0,.68333,0,0,.90278],215:[.08333,.58333,0,0,.77778],216:[.04861,.73194,0,0,.77778],223:[0,.69444,0,0,.5],230:[0,.43056,0,0,.72222],247:[.08333,.58333,0,0,.77778],248:[.09722,.52778,0,0,.5],305:[0,.43056,0,0,.27778],338:[0,.68333,0,0,1.01389],339:[0,.43056,0,0,.77778],567:[.19444,.43056,0,0,.30556],710:[0,.69444,0,0,.5],711:[0,.62847,0,0,.5],713:[0,.56778,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.66786,0,0,.27778],730:[0,.69444,0,0,.75],732:[0,.66786,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.68333,0,0,.625],916:[0,.68333,0,0,.83334],920:[0,.68333,0,0,.77778],923:[0,.68333,0,0,.69445],926:[0,.68333,0,0,.66667],928:[0,.68333,0,0,.75],931:[0,.68333,0,0,.72222],933:[0,.68333,0,0,.77778],934:[0,.68333,0,0,.72222],936:[0,.68333,0,0,.77778],937:[0,.68333,0,0,.72222],8211:[0,.43056,.02778,0,.5],8212:[0,.43056,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5],8224:[.19444,.69444,0,0,.44445],8225:[.19444,.69444,0,0,.44445],8230:[0,.123,0,0,1.172],8242:[0,.55556,0,0,.275],8407:[0,.71444,.15382,0,.5],8463:[0,.68889,0,0,.54028],8465:[0,.69444,0,0,.72222],8467:[0,.69444,0,.11111,.41667],8472:[.19444,.43056,0,.11111,.63646],8476:[0,.69444,0,0,.72222],8501:[0,.69444,0,0,.61111],8592:[-.13313,.36687,0,0,1],8593:[.19444,.69444,0,0,.5],8594:[-.13313,.36687,0,0,1],8595:[.19444,.69444,0,0,.5],8596:[-.13313,.36687,0,0,1],8597:[.25,.75,0,0,.5],8598:[.19444,.69444,0,0,1],8599:[.19444,.69444,0,0,1],8600:[.19444,.69444,0,0,1],8601:[.19444,.69444,0,0,1],8614:[.011,.511,0,0,1],8617:[.011,.511,0,0,1.126],8618:[.011,.511,0,0,1.126],8636:[-.13313,.36687,0,0,1],8637:[-.13313,.36687,0,0,1],8640:[-.13313,.36687,0,0,1],8641:[-.13313,.36687,0,0,1],8652:[.011,.671,0,0,1],8656:[-.13313,.36687,0,0,1],8657:[.19444,.69444,0,0,.61111],8658:[-.13313,.36687,0,0,1],8659:[.19444,.69444,0,0,.61111],8660:[-.13313,.36687,0,0,1],8661:[.25,.75,0,0,.61111],8704:[0,.69444,0,0,.55556],8706:[0,.69444,.05556,.08334,.5309],8707:[0,.69444,0,0,.55556],8709:[.05556,.75,0,0,.5],8711:[0,.68333,0,0,.83334],8712:[.0391,.5391,0,0,.66667],8715:[.0391,.5391,0,0,.66667],8722:[.08333,.58333,0,0,.77778],8723:[.08333,.58333,0,0,.77778],8725:[.25,.75,0,0,.5],8726:[.25,.75,0,0,.5],8727:[-.03472,.46528,0,0,.5],8728:[-.05555,.44445,0,0,.5],8729:[-.05555,.44445,0,0,.5],8730:[.2,.8,0,0,.83334],8733:[0,.43056,0,0,.77778],8734:[0,.43056,0,0,1],8736:[0,.69224,0,0,.72222],8739:[.25,.75,0,0,.27778],8741:[.25,.75,0,0,.5],8743:[0,.55556,0,0,.66667],8744:[0,.55556,0,0,.66667],8745:[0,.55556,0,0,.66667],8746:[0,.55556,0,0,.66667],8747:[.19444,.69444,.11111,0,.41667],8764:[-.13313,.36687,0,0,.77778],8768:[.19444,.69444,0,0,.27778],8771:[-.03625,.46375,0,0,.77778],8773:[-.022,.589,0,0,.778],8776:[-.01688,.48312,0,0,.77778],8781:[-.03625,.46375,0,0,.77778],8784:[-.133,.673,0,0,.778],8801:[-.03625,.46375,0,0,.77778],8804:[.13597,.63597,0,0,.77778],8805:[.13597,.63597,0,0,.77778],8810:[.0391,.5391,0,0,1],8811:[.0391,.5391,0,0,1],8826:[.0391,.5391,0,0,.77778],8827:[.0391,.5391,0,0,.77778],8834:[.0391,.5391,0,0,.77778],8835:[.0391,.5391,0,0,.77778],8838:[.13597,.63597,0,0,.77778],8839:[.13597,.63597,0,0,.77778],8846:[0,.55556,0,0,.66667],8849:[.13597,.63597,0,0,.77778],8850:[.13597,.63597,0,0,.77778],8851:[0,.55556,0,0,.66667],8852:[0,.55556,0,0,.66667],8853:[.08333,.58333,0,0,.77778],8854:[.08333,.58333,0,0,.77778],8855:[.08333,.58333,0,0,.77778],8856:[.08333,.58333,0,0,.77778],8857:[.08333,.58333,0,0,.77778],8866:[0,.69444,0,0,.61111],8867:[0,.69444,0,0,.61111],8868:[0,.69444,0,0,.77778],8869:[0,.69444,0,0,.77778],8872:[.249,.75,0,0,.867],8900:[-.05555,.44445,0,0,.5],8901:[-.05555,.44445,0,0,.27778],8902:[-.03472,.46528,0,0,.5],8904:[.005,.505,0,0,.9],8942:[.03,.903,0,0,.278],8943:[-.19,.313,0,0,1.172],8945:[-.1,.823,0,0,1.282],8968:[.25,.75,0,0,.44445],8969:[.25,.75,0,0,.44445],8970:[.25,.75,0,0,.44445],8971:[.25,.75,0,0,.44445],8994:[-.14236,.35764,0,0,1],8995:[-.14236,.35764,0,0,1],9136:[.244,.744,0,0,.412],9137:[.244,.745,0,0,.412],9651:[.19444,.69444,0,0,.88889],9657:[-.03472,.46528,0,0,.5],9661:[.19444,.69444,0,0,.88889],9667:[-.03472,.46528,0,0,.5],9711:[.19444,.69444,0,0,1],9824:[.12963,.69444,0,0,.77778],9825:[.12963,.69444,0,0,.77778],9826:[.12963,.69444,0,0,.77778],9827:[.12963,.69444,0,0,.77778],9837:[0,.75,0,0,.38889],9838:[.19444,.69444,0,0,.38889],9839:[.19444,.69444,0,0,.38889],10216:[.25,.75,0,0,.38889],10217:[.25,.75,0,0,.38889],10222:[.244,.744,0,0,.412],10223:[.244,.745,0,0,.412],10229:[.011,.511,0,0,1.609],10230:[.011,.511,0,0,1.638],10231:[.011,.511,0,0,1.859],10232:[.024,.525,0,0,1.609],10233:[.024,.525,0,0,1.638],10234:[.024,.525,0,0,1.858],10236:[.011,.511,0,0,1.638],10815:[0,.68333,0,0,.75],10927:[.13597,.63597,0,0,.77778],10928:[.13597,.63597,0,0,.77778],57376:[.19444,.69444,0,0,0]},"Math-BoldItalic":{32:[0,0,0,0,.25],48:[0,.44444,0,0,.575],49:[0,.44444,0,0,.575],50:[0,.44444,0,0,.575],51:[.19444,.44444,0,0,.575],52:[.19444,.44444,0,0,.575],53:[.19444,.44444,0,0,.575],54:[0,.64444,0,0,.575],55:[.19444,.44444,0,0,.575],56:[0,.64444,0,0,.575],57:[.19444,.44444,0,0,.575],65:[0,.68611,0,0,.86944],66:[0,.68611,.04835,0,.8664],67:[0,.68611,.06979,0,.81694],68:[0,.68611,.03194,0,.93812],69:[0,.68611,.05451,0,.81007],70:[0,.68611,.15972,0,.68889],71:[0,.68611,0,0,.88673],72:[0,.68611,.08229,0,.98229],73:[0,.68611,.07778,0,.51111],74:[0,.68611,.10069,0,.63125],75:[0,.68611,.06979,0,.97118],76:[0,.68611,0,0,.75555],77:[0,.68611,.11424,0,1.14201],78:[0,.68611,.11424,0,.95034],79:[0,.68611,.03194,0,.83666],80:[0,.68611,.15972,0,.72309],81:[.19444,.68611,0,0,.86861],82:[0,.68611,.00421,0,.87235],83:[0,.68611,.05382,0,.69271],84:[0,.68611,.15972,0,.63663],85:[0,.68611,.11424,0,.80027],86:[0,.68611,.25555,0,.67778],87:[0,.68611,.15972,0,1.09305],88:[0,.68611,.07778,0,.94722],89:[0,.68611,.25555,0,.67458],90:[0,.68611,.06979,0,.77257],97:[0,.44444,0,0,.63287],98:[0,.69444,0,0,.52083],99:[0,.44444,0,0,.51342],100:[0,.69444,0,0,.60972],101:[0,.44444,0,0,.55361],102:[.19444,.69444,.11042,0,.56806],103:[.19444,.44444,.03704,0,.5449],104:[0,.69444,0,0,.66759],105:[0,.69326,0,0,.4048],106:[.19444,.69326,.0622,0,.47083],107:[0,.69444,.01852,0,.6037],108:[0,.69444,.0088,0,.34815],109:[0,.44444,0,0,1.0324],110:[0,.44444,0,0,.71296],111:[0,.44444,0,0,.58472],112:[.19444,.44444,0,0,.60092],113:[.19444,.44444,.03704,0,.54213],114:[0,.44444,.03194,0,.5287],115:[0,.44444,0,0,.53125],116:[0,.63492,0,0,.41528],117:[0,.44444,0,0,.68102],118:[0,.44444,.03704,0,.56666],119:[0,.44444,.02778,0,.83148],120:[0,.44444,0,0,.65903],121:[.19444,.44444,.03704,0,.59028],122:[0,.44444,.04213,0,.55509],160:[0,0,0,0,.25],915:[0,.68611,.15972,0,.65694],916:[0,.68611,0,0,.95833],920:[0,.68611,.03194,0,.86722],923:[0,.68611,0,0,.80555],926:[0,.68611,.07458,0,.84125],928:[0,.68611,.08229,0,.98229],931:[0,.68611,.05451,0,.88507],933:[0,.68611,.15972,0,.67083],934:[0,.68611,0,0,.76666],936:[0,.68611,.11653,0,.71402],937:[0,.68611,.04835,0,.8789],945:[0,.44444,0,0,.76064],946:[.19444,.69444,.03403,0,.65972],947:[.19444,.44444,.06389,0,.59003],948:[0,.69444,.03819,0,.52222],949:[0,.44444,0,0,.52882],950:[.19444,.69444,.06215,0,.50833],951:[.19444,.44444,.03704,0,.6],952:[0,.69444,.03194,0,.5618],953:[0,.44444,0,0,.41204],954:[0,.44444,0,0,.66759],955:[0,.69444,0,0,.67083],956:[.19444,.44444,0,0,.70787],957:[0,.44444,.06898,0,.57685],958:[.19444,.69444,.03021,0,.50833],959:[0,.44444,0,0,.58472],960:[0,.44444,.03704,0,.68241],961:[.19444,.44444,0,0,.6118],962:[.09722,.44444,.07917,0,.42361],963:[0,.44444,.03704,0,.68588],964:[0,.44444,.13472,0,.52083],965:[0,.44444,.03704,0,.63055],966:[.19444,.44444,0,0,.74722],967:[.19444,.44444,0,0,.71805],968:[.19444,.69444,.03704,0,.75833],969:[0,.44444,.03704,0,.71782],977:[0,.69444,0,0,.69155],981:[.19444,.69444,0,0,.7125],982:[0,.44444,.03194,0,.975],1009:[.19444,.44444,0,0,.6118],1013:[0,.44444,0,0,.48333],57649:[0,.44444,0,0,.39352],57911:[.19444,.44444,0,0,.43889]},"Math-Italic":{32:[0,0,0,0,.25],48:[0,.43056,0,0,.5],49:[0,.43056,0,0,.5],50:[0,.43056,0,0,.5],51:[.19444,.43056,0,0,.5],52:[.19444,.43056,0,0,.5],53:[.19444,.43056,0,0,.5],54:[0,.64444,0,0,.5],55:[.19444,.43056,0,0,.5],56:[0,.64444,0,0,.5],57:[.19444,.43056,0,0,.5],65:[0,.68333,0,.13889,.75],66:[0,.68333,.05017,.08334,.75851],67:[0,.68333,.07153,.08334,.71472],68:[0,.68333,.02778,.05556,.82792],69:[0,.68333,.05764,.08334,.7382],70:[0,.68333,.13889,.08334,.64306],71:[0,.68333,0,.08334,.78625],72:[0,.68333,.08125,.05556,.83125],73:[0,.68333,.07847,.11111,.43958],74:[0,.68333,.09618,.16667,.55451],75:[0,.68333,.07153,.05556,.84931],76:[0,.68333,0,.02778,.68056],77:[0,.68333,.10903,.08334,.97014],78:[0,.68333,.10903,.08334,.80347],79:[0,.68333,.02778,.08334,.76278],80:[0,.68333,.13889,.08334,.64201],81:[.19444,.68333,0,.08334,.79056],82:[0,.68333,.00773,.08334,.75929],83:[0,.68333,.05764,.08334,.6132],84:[0,.68333,.13889,.08334,.58438],85:[0,.68333,.10903,.02778,.68278],86:[0,.68333,.22222,0,.58333],87:[0,.68333,.13889,0,.94445],88:[0,.68333,.07847,.08334,.82847],89:[0,.68333,.22222,0,.58056],90:[0,.68333,.07153,.08334,.68264],97:[0,.43056,0,0,.52859],98:[0,.69444,0,0,.42917],99:[0,.43056,0,.05556,.43276],100:[0,.69444,0,.16667,.52049],101:[0,.43056,0,.05556,.46563],102:[.19444,.69444,.10764,.16667,.48959],103:[.19444,.43056,.03588,.02778,.47697],104:[0,.69444,0,0,.57616],105:[0,.65952,0,0,.34451],106:[.19444,.65952,.05724,0,.41181],107:[0,.69444,.03148,0,.5206],108:[0,.69444,.01968,.08334,.29838],109:[0,.43056,0,0,.87801],110:[0,.43056,0,0,.60023],111:[0,.43056,0,.05556,.48472],112:[.19444,.43056,0,.08334,.50313],113:[.19444,.43056,.03588,.08334,.44641],114:[0,.43056,.02778,.05556,.45116],115:[0,.43056,0,.05556,.46875],116:[0,.61508,0,.08334,.36111],117:[0,.43056,0,.02778,.57246],118:[0,.43056,.03588,.02778,.48472],119:[0,.43056,.02691,.08334,.71592],120:[0,.43056,0,.02778,.57153],121:[.19444,.43056,.03588,.05556,.49028],122:[0,.43056,.04398,.05556,.46505],160:[0,0,0,0,.25],915:[0,.68333,.13889,.08334,.61528],916:[0,.68333,0,.16667,.83334],920:[0,.68333,.02778,.08334,.76278],923:[0,.68333,0,.16667,.69445],926:[0,.68333,.07569,.08334,.74236],928:[0,.68333,.08125,.05556,.83125],931:[0,.68333,.05764,.08334,.77986],933:[0,.68333,.13889,.05556,.58333],934:[0,.68333,0,.08334,.66667],936:[0,.68333,.11,.05556,.61222],937:[0,.68333,.05017,.08334,.7724],945:[0,.43056,.0037,.02778,.6397],946:[.19444,.69444,.05278,.08334,.56563],947:[.19444,.43056,.05556,0,.51773],948:[0,.69444,.03785,.05556,.44444],949:[0,.43056,0,.08334,.46632],950:[.19444,.69444,.07378,.08334,.4375],951:[.19444,.43056,.03588,.05556,.49653],952:[0,.69444,.02778,.08334,.46944],953:[0,.43056,0,.05556,.35394],954:[0,.43056,0,0,.57616],955:[0,.69444,0,0,.58334],956:[.19444,.43056,0,.02778,.60255],957:[0,.43056,.06366,.02778,.49398],958:[.19444,.69444,.04601,.11111,.4375],959:[0,.43056,0,.05556,.48472],960:[0,.43056,.03588,0,.57003],961:[.19444,.43056,0,.08334,.51702],962:[.09722,.43056,.07986,.08334,.36285],963:[0,.43056,.03588,0,.57141],964:[0,.43056,.1132,.02778,.43715],965:[0,.43056,.03588,.02778,.54028],966:[.19444,.43056,0,.08334,.65417],967:[.19444,.43056,0,.05556,.62569],968:[.19444,.69444,.03588,.11111,.65139],969:[0,.43056,.03588,0,.62245],977:[0,.69444,0,.08334,.59144],981:[.19444,.69444,0,.08334,.59583],982:[0,.43056,.02778,0,.82813],1009:[.19444,.43056,0,.08334,.51702],1013:[0,.43056,0,.05556,.4059],57649:[0,.43056,0,.02778,.32246],57911:[.19444,.43056,0,.08334,.38403]},"SansSerif-Bold":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.36667],34:[0,.69444,0,0,.55834],35:[.19444,.69444,0,0,.91667],36:[.05556,.75,0,0,.55],37:[.05556,.75,0,0,1.02912],38:[0,.69444,0,0,.83056],39:[0,.69444,0,0,.30556],40:[.25,.75,0,0,.42778],41:[.25,.75,0,0,.42778],42:[0,.75,0,0,.55],43:[.11667,.61667,0,0,.85556],44:[.10556,.13056,0,0,.30556],45:[0,.45833,0,0,.36667],46:[0,.13056,0,0,.30556],47:[.25,.75,0,0,.55],48:[0,.69444,0,0,.55],49:[0,.69444,0,0,.55],50:[0,.69444,0,0,.55],51:[0,.69444,0,0,.55],52:[0,.69444,0,0,.55],53:[0,.69444,0,0,.55],54:[0,.69444,0,0,.55],55:[0,.69444,0,0,.55],56:[0,.69444,0,0,.55],57:[0,.69444,0,0,.55],58:[0,.45833,0,0,.30556],59:[.10556,.45833,0,0,.30556],61:[-.09375,.40625,0,0,.85556],63:[0,.69444,0,0,.51945],64:[0,.69444,0,0,.73334],65:[0,.69444,0,0,.73334],66:[0,.69444,0,0,.73334],67:[0,.69444,0,0,.70278],68:[0,.69444,0,0,.79445],69:[0,.69444,0,0,.64167],70:[0,.69444,0,0,.61111],71:[0,.69444,0,0,.73334],72:[0,.69444,0,0,.79445],73:[0,.69444,0,0,.33056],74:[0,.69444,0,0,.51945],75:[0,.69444,0,0,.76389],76:[0,.69444,0,0,.58056],77:[0,.69444,0,0,.97778],78:[0,.69444,0,0,.79445],79:[0,.69444,0,0,.79445],80:[0,.69444,0,0,.70278],81:[.10556,.69444,0,0,.79445],82:[0,.69444,0,0,.70278],83:[0,.69444,0,0,.61111],84:[0,.69444,0,0,.73334],85:[0,.69444,0,0,.76389],86:[0,.69444,.01528,0,.73334],87:[0,.69444,.01528,0,1.03889],88:[0,.69444,0,0,.73334],89:[0,.69444,.0275,0,.73334],90:[0,.69444,0,0,.67223],91:[.25,.75,0,0,.34306],93:[.25,.75,0,0,.34306],94:[0,.69444,0,0,.55],95:[.35,.10833,.03056,0,.55],97:[0,.45833,0,0,.525],98:[0,.69444,0,0,.56111],99:[0,.45833,0,0,.48889],100:[0,.69444,0,0,.56111],101:[0,.45833,0,0,.51111],102:[0,.69444,.07639,0,.33611],103:[.19444,.45833,.01528,0,.55],104:[0,.69444,0,0,.56111],105:[0,.69444,0,0,.25556],106:[.19444,.69444,0,0,.28611],107:[0,.69444,0,0,.53056],108:[0,.69444,0,0,.25556],109:[0,.45833,0,0,.86667],110:[0,.45833,0,0,.56111],111:[0,.45833,0,0,.55],112:[.19444,.45833,0,0,.56111],113:[.19444,.45833,0,0,.56111],114:[0,.45833,.01528,0,.37222],115:[0,.45833,0,0,.42167],116:[0,.58929,0,0,.40417],117:[0,.45833,0,0,.56111],118:[0,.45833,.01528,0,.5],119:[0,.45833,.01528,0,.74445],120:[0,.45833,0,0,.5],121:[.19444,.45833,.01528,0,.5],122:[0,.45833,0,0,.47639],126:[.35,.34444,0,0,.55],160:[0,0,0,0,.25],168:[0,.69444,0,0,.55],176:[0,.69444,0,0,.73334],180:[0,.69444,0,0,.55],184:[.17014,0,0,0,.48889],305:[0,.45833,0,0,.25556],567:[.19444,.45833,0,0,.28611],710:[0,.69444,0,0,.55],711:[0,.63542,0,0,.55],713:[0,.63778,0,0,.55],728:[0,.69444,0,0,.55],729:[0,.69444,0,0,.30556],730:[0,.69444,0,0,.73334],732:[0,.69444,0,0,.55],733:[0,.69444,0,0,.55],915:[0,.69444,0,0,.58056],916:[0,.69444,0,0,.91667],920:[0,.69444,0,0,.85556],923:[0,.69444,0,0,.67223],926:[0,.69444,0,0,.73334],928:[0,.69444,0,0,.79445],931:[0,.69444,0,0,.79445],933:[0,.69444,0,0,.85556],934:[0,.69444,0,0,.79445],936:[0,.69444,0,0,.85556],937:[0,.69444,0,0,.79445],8211:[0,.45833,.03056,0,.55],8212:[0,.45833,.03056,0,1.10001],8216:[0,.69444,0,0,.30556],8217:[0,.69444,0,0,.30556],8220:[0,.69444,0,0,.55834],8221:[0,.69444,0,0,.55834]},"SansSerif-Italic":{32:[0,0,0,0,.25],33:[0,.69444,.05733,0,.31945],34:[0,.69444,.00316,0,.5],35:[.19444,.69444,.05087,0,.83334],36:[.05556,.75,.11156,0,.5],37:[.05556,.75,.03126,0,.83334],38:[0,.69444,.03058,0,.75834],39:[0,.69444,.07816,0,.27778],40:[.25,.75,.13164,0,.38889],41:[.25,.75,.02536,0,.38889],42:[0,.75,.11775,0,.5],43:[.08333,.58333,.02536,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,.01946,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,.13164,0,.5],48:[0,.65556,.11156,0,.5],49:[0,.65556,.11156,0,.5],50:[0,.65556,.11156,0,.5],51:[0,.65556,.11156,0,.5],52:[0,.65556,.11156,0,.5],53:[0,.65556,.11156,0,.5],54:[0,.65556,.11156,0,.5],55:[0,.65556,.11156,0,.5],56:[0,.65556,.11156,0,.5],57:[0,.65556,.11156,0,.5],58:[0,.44444,.02502,0,.27778],59:[.125,.44444,.02502,0,.27778],61:[-.13,.37,.05087,0,.77778],63:[0,.69444,.11809,0,.47222],64:[0,.69444,.07555,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,.08293,0,.66667],67:[0,.69444,.11983,0,.63889],68:[0,.69444,.07555,0,.72223],69:[0,.69444,.11983,0,.59722],70:[0,.69444,.13372,0,.56945],71:[0,.69444,.11983,0,.66667],72:[0,.69444,.08094,0,.70834],73:[0,.69444,.13372,0,.27778],74:[0,.69444,.08094,0,.47222],75:[0,.69444,.11983,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,.08094,0,.875],78:[0,.69444,.08094,0,.70834],79:[0,.69444,.07555,0,.73611],80:[0,.69444,.08293,0,.63889],81:[.125,.69444,.07555,0,.73611],82:[0,.69444,.08293,0,.64584],83:[0,.69444,.09205,0,.55556],84:[0,.69444,.13372,0,.68056],85:[0,.69444,.08094,0,.6875],86:[0,.69444,.1615,0,.66667],87:[0,.69444,.1615,0,.94445],88:[0,.69444,.13372,0,.66667],89:[0,.69444,.17261,0,.66667],90:[0,.69444,.11983,0,.61111],91:[.25,.75,.15942,0,.28889],93:[.25,.75,.08719,0,.28889],94:[0,.69444,.0799,0,.5],95:[.35,.09444,.08616,0,.5],97:[0,.44444,.00981,0,.48056],98:[0,.69444,.03057,0,.51667],99:[0,.44444,.08336,0,.44445],100:[0,.69444,.09483,0,.51667],101:[0,.44444,.06778,0,.44445],102:[0,.69444,.21705,0,.30556],103:[.19444,.44444,.10836,0,.5],104:[0,.69444,.01778,0,.51667],105:[0,.67937,.09718,0,.23889],106:[.19444,.67937,.09162,0,.26667],107:[0,.69444,.08336,0,.48889],108:[0,.69444,.09483,0,.23889],109:[0,.44444,.01778,0,.79445],110:[0,.44444,.01778,0,.51667],111:[0,.44444,.06613,0,.5],112:[.19444,.44444,.0389,0,.51667],113:[.19444,.44444,.04169,0,.51667],114:[0,.44444,.10836,0,.34167],115:[0,.44444,.0778,0,.38333],116:[0,.57143,.07225,0,.36111],117:[0,.44444,.04169,0,.51667],118:[0,.44444,.10836,0,.46111],119:[0,.44444,.10836,0,.68334],120:[0,.44444,.09169,0,.46111],121:[.19444,.44444,.10836,0,.46111],122:[0,.44444,.08752,0,.43472],126:[.35,.32659,.08826,0,.5],160:[0,0,0,0,.25],168:[0,.67937,.06385,0,.5],176:[0,.69444,0,0,.73752],184:[.17014,0,0,0,.44445],305:[0,.44444,.04169,0,.23889],567:[.19444,.44444,.04169,0,.26667],710:[0,.69444,.0799,0,.5],711:[0,.63194,.08432,0,.5],713:[0,.60889,.08776,0,.5],714:[0,.69444,.09205,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,.09483,0,.5],729:[0,.67937,.07774,0,.27778],730:[0,.69444,0,0,.73752],732:[0,.67659,.08826,0,.5],733:[0,.69444,.09205,0,.5],915:[0,.69444,.13372,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,.07555,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,.12816,0,.66667],928:[0,.69444,.08094,0,.70834],931:[0,.69444,.11983,0,.72222],933:[0,.69444,.09031,0,.77778],934:[0,.69444,.04603,0,.72222],936:[0,.69444,.09031,0,.77778],937:[0,.69444,.08293,0,.72222],8211:[0,.44444,.08616,0,.5],8212:[0,.44444,.08616,0,1],8216:[0,.69444,.07816,0,.27778],8217:[0,.69444,.07816,0,.27778],8220:[0,.69444,.14205,0,.5],8221:[0,.69444,.00316,0,.5]},"SansSerif-Regular":{32:[0,0,0,0,.25],33:[0,.69444,0,0,.31945],34:[0,.69444,0,0,.5],35:[.19444,.69444,0,0,.83334],36:[.05556,.75,0,0,.5],37:[.05556,.75,0,0,.83334],38:[0,.69444,0,0,.75834],39:[0,.69444,0,0,.27778],40:[.25,.75,0,0,.38889],41:[.25,.75,0,0,.38889],42:[0,.75,0,0,.5],43:[.08333,.58333,0,0,.77778],44:[.125,.08333,0,0,.27778],45:[0,.44444,0,0,.33333],46:[0,.08333,0,0,.27778],47:[.25,.75,0,0,.5],48:[0,.65556,0,0,.5],49:[0,.65556,0,0,.5],50:[0,.65556,0,0,.5],51:[0,.65556,0,0,.5],52:[0,.65556,0,0,.5],53:[0,.65556,0,0,.5],54:[0,.65556,0,0,.5],55:[0,.65556,0,0,.5],56:[0,.65556,0,0,.5],57:[0,.65556,0,0,.5],58:[0,.44444,0,0,.27778],59:[.125,.44444,0,0,.27778],61:[-.13,.37,0,0,.77778],63:[0,.69444,0,0,.47222],64:[0,.69444,0,0,.66667],65:[0,.69444,0,0,.66667],66:[0,.69444,0,0,.66667],67:[0,.69444,0,0,.63889],68:[0,.69444,0,0,.72223],69:[0,.69444,0,0,.59722],70:[0,.69444,0,0,.56945],71:[0,.69444,0,0,.66667],72:[0,.69444,0,0,.70834],73:[0,.69444,0,0,.27778],74:[0,.69444,0,0,.47222],75:[0,.69444,0,0,.69445],76:[0,.69444,0,0,.54167],77:[0,.69444,0,0,.875],78:[0,.69444,0,0,.70834],79:[0,.69444,0,0,.73611],80:[0,.69444,0,0,.63889],81:[.125,.69444,0,0,.73611],82:[0,.69444,0,0,.64584],83:[0,.69444,0,0,.55556],84:[0,.69444,0,0,.68056],85:[0,.69444,0,0,.6875],86:[0,.69444,.01389,0,.66667],87:[0,.69444,.01389,0,.94445],88:[0,.69444,0,0,.66667],89:[0,.69444,.025,0,.66667],90:[0,.69444,0,0,.61111],91:[.25,.75,0,0,.28889],93:[.25,.75,0,0,.28889],94:[0,.69444,0,0,.5],95:[.35,.09444,.02778,0,.5],97:[0,.44444,0,0,.48056],98:[0,.69444,0,0,.51667],99:[0,.44444,0,0,.44445],100:[0,.69444,0,0,.51667],101:[0,.44444,0,0,.44445],102:[0,.69444,.06944,0,.30556],103:[.19444,.44444,.01389,0,.5],104:[0,.69444,0,0,.51667],105:[0,.67937,0,0,.23889],106:[.19444,.67937,0,0,.26667],107:[0,.69444,0,0,.48889],108:[0,.69444,0,0,.23889],109:[0,.44444,0,0,.79445],110:[0,.44444,0,0,.51667],111:[0,.44444,0,0,.5],112:[.19444,.44444,0,0,.51667],113:[.19444,.44444,0,0,.51667],114:[0,.44444,.01389,0,.34167],115:[0,.44444,0,0,.38333],116:[0,.57143,0,0,.36111],117:[0,.44444,0,0,.51667],118:[0,.44444,.01389,0,.46111],119:[0,.44444,.01389,0,.68334],120:[0,.44444,0,0,.46111],121:[.19444,.44444,.01389,0,.46111],122:[0,.44444,0,0,.43472],126:[.35,.32659,0,0,.5],160:[0,0,0,0,.25],168:[0,.67937,0,0,.5],176:[0,.69444,0,0,.66667],184:[.17014,0,0,0,.44445],305:[0,.44444,0,0,.23889],567:[.19444,.44444,0,0,.26667],710:[0,.69444,0,0,.5],711:[0,.63194,0,0,.5],713:[0,.60889,0,0,.5],714:[0,.69444,0,0,.5],715:[0,.69444,0,0,.5],728:[0,.69444,0,0,.5],729:[0,.67937,0,0,.27778],730:[0,.69444,0,0,.66667],732:[0,.67659,0,0,.5],733:[0,.69444,0,0,.5],915:[0,.69444,0,0,.54167],916:[0,.69444,0,0,.83334],920:[0,.69444,0,0,.77778],923:[0,.69444,0,0,.61111],926:[0,.69444,0,0,.66667],928:[0,.69444,0,0,.70834],931:[0,.69444,0,0,.72222],933:[0,.69444,0,0,.77778],934:[0,.69444,0,0,.72222],936:[0,.69444,0,0,.77778],937:[0,.69444,0,0,.72222],8211:[0,.44444,.02778,0,.5],8212:[0,.44444,.02778,0,1],8216:[0,.69444,0,0,.27778],8217:[0,.69444,0,0,.27778],8220:[0,.69444,0,0,.5],8221:[0,.69444,0,0,.5]},"Script-Regular":{32:[0,0,0,0,.25],65:[0,.7,.22925,0,.80253],66:[0,.7,.04087,0,.90757],67:[0,.7,.1689,0,.66619],68:[0,.7,.09371,0,.77443],69:[0,.7,.18583,0,.56162],70:[0,.7,.13634,0,.89544],71:[0,.7,.17322,0,.60961],72:[0,.7,.29694,0,.96919],73:[0,.7,.19189,0,.80907],74:[.27778,.7,.19189,0,1.05159],75:[0,.7,.31259,0,.91364],76:[0,.7,.19189,0,.87373],77:[0,.7,.15981,0,1.08031],78:[0,.7,.3525,0,.9015],79:[0,.7,.08078,0,.73787],80:[0,.7,.08078,0,1.01262],81:[0,.7,.03305,0,.88282],82:[0,.7,.06259,0,.85],83:[0,.7,.19189,0,.86767],84:[0,.7,.29087,0,.74697],85:[0,.7,.25815,0,.79996],86:[0,.7,.27523,0,.62204],87:[0,.7,.27523,0,.80532],88:[0,.7,.26006,0,.94445],89:[0,.7,.2939,0,.70961],90:[0,.7,.24037,0,.8212],160:[0,0,0,0,.25]},"Size1-Regular":{32:[0,0,0,0,.25],40:[.35001,.85,0,0,.45834],41:[.35001,.85,0,0,.45834],47:[.35001,.85,0,0,.57778],91:[.35001,.85,0,0,.41667],92:[.35001,.85,0,0,.57778],93:[.35001,.85,0,0,.41667],123:[.35001,.85,0,0,.58334],125:[.35001,.85,0,0,.58334],160:[0,0,0,0,.25],710:[0,.72222,0,0,.55556],732:[0,.72222,0,0,.55556],770:[0,.72222,0,0,.55556],771:[0,.72222,0,0,.55556],8214:[-99e-5,.601,0,0,.77778],8593:[1e-5,.6,0,0,.66667],8595:[1e-5,.6,0,0,.66667],8657:[1e-5,.6,0,0,.77778],8659:[1e-5,.6,0,0,.77778],8719:[.25001,.75,0,0,.94445],8720:[.25001,.75,0,0,.94445],8721:[.25001,.75,0,0,1.05556],8730:[.35001,.85,0,0,1],8739:[-.00599,.606,0,0,.33333],8741:[-.00599,.606,0,0,.55556],8747:[.30612,.805,.19445,0,.47222],8748:[.306,.805,.19445,0,.47222],8749:[.306,.805,.19445,0,.47222],8750:[.30612,.805,.19445,0,.47222],8896:[.25001,.75,0,0,.83334],8897:[.25001,.75,0,0,.83334],8898:[.25001,.75,0,0,.83334],8899:[.25001,.75,0,0,.83334],8968:[.35001,.85,0,0,.47222],8969:[.35001,.85,0,0,.47222],8970:[.35001,.85,0,0,.47222],8971:[.35001,.85,0,0,.47222],9168:[-99e-5,.601,0,0,.66667],10216:[.35001,.85,0,0,.47222],10217:[.35001,.85,0,0,.47222],10752:[.25001,.75,0,0,1.11111],10753:[.25001,.75,0,0,1.11111],10754:[.25001,.75,0,0,1.11111],10756:[.25001,.75,0,0,.83334],10758:[.25001,.75,0,0,.83334]},"Size2-Regular":{32:[0,0,0,0,.25],40:[.65002,1.15,0,0,.59722],41:[.65002,1.15,0,0,.59722],47:[.65002,1.15,0,0,.81111],91:[.65002,1.15,0,0,.47222],92:[.65002,1.15,0,0,.81111],93:[.65002,1.15,0,0,.47222],123:[.65002,1.15,0,0,.66667],125:[.65002,1.15,0,0,.66667],160:[0,0,0,0,.25],710:[0,.75,0,0,1],732:[0,.75,0,0,1],770:[0,.75,0,0,1],771:[0,.75,0,0,1],8719:[.55001,1.05,0,0,1.27778],8720:[.55001,1.05,0,0,1.27778],8721:[.55001,1.05,0,0,1.44445],8730:[.65002,1.15,0,0,1],8747:[.86225,1.36,.44445,0,.55556],8748:[.862,1.36,.44445,0,.55556],8749:[.862,1.36,.44445,0,.55556],8750:[.86225,1.36,.44445,0,.55556],8896:[.55001,1.05,0,0,1.11111],8897:[.55001,1.05,0,0,1.11111],8898:[.55001,1.05,0,0,1.11111],8899:[.55001,1.05,0,0,1.11111],8968:[.65002,1.15,0,0,.52778],8969:[.65002,1.15,0,0,.52778],8970:[.65002,1.15,0,0,.52778],8971:[.65002,1.15,0,0,.52778],10216:[.65002,1.15,0,0,.61111],10217:[.65002,1.15,0,0,.61111],10752:[.55001,1.05,0,0,1.51112],10753:[.55001,1.05,0,0,1.51112],10754:[.55001,1.05,0,0,1.51112],10756:[.55001,1.05,0,0,1.11111],10758:[.55001,1.05,0,0,1.11111]},"Size3-Regular":{32:[0,0,0,0,.25],40:[.95003,1.45,0,0,.73611],41:[.95003,1.45,0,0,.73611],47:[.95003,1.45,0,0,1.04445],91:[.95003,1.45,0,0,.52778],92:[.95003,1.45,0,0,1.04445],93:[.95003,1.45,0,0,.52778],123:[.95003,1.45,0,0,.75],125:[.95003,1.45,0,0,.75],160:[0,0,0,0,.25],710:[0,.75,0,0,1.44445],732:[0,.75,0,0,1.44445],770:[0,.75,0,0,1.44445],771:[0,.75,0,0,1.44445],8730:[.95003,1.45,0,0,1],8968:[.95003,1.45,0,0,.58334],8969:[.95003,1.45,0,0,.58334],8970:[.95003,1.45,0,0,.58334],8971:[.95003,1.45,0,0,.58334],10216:[.95003,1.45,0,0,.75],10217:[.95003,1.45,0,0,.75]},"Size4-Regular":{32:[0,0,0,0,.25],40:[1.25003,1.75,0,0,.79167],41:[1.25003,1.75,0,0,.79167],47:[1.25003,1.75,0,0,1.27778],91:[1.25003,1.75,0,0,.58334],92:[1.25003,1.75,0,0,1.27778],93:[1.25003,1.75,0,0,.58334],123:[1.25003,1.75,0,0,.80556],125:[1.25003,1.75,0,0,.80556],160:[0,0,0,0,.25],710:[0,.825,0,0,1.8889],732:[0,.825,0,0,1.8889],770:[0,.825,0,0,1.8889],771:[0,.825,0,0,1.8889],8730:[1.25003,1.75,0,0,1],8968:[1.25003,1.75,0,0,.63889],8969:[1.25003,1.75,0,0,.63889],8970:[1.25003,1.75,0,0,.63889],8971:[1.25003,1.75,0,0,.63889],9115:[.64502,1.155,0,0,.875],9116:[1e-5,.6,0,0,.875],9117:[.64502,1.155,0,0,.875],9118:[.64502,1.155,0,0,.875],9119:[1e-5,.6,0,0,.875],9120:[.64502,1.155,0,0,.875],9121:[.64502,1.155,0,0,.66667],9122:[-99e-5,.601,0,0,.66667],9123:[.64502,1.155,0,0,.66667],9124:[.64502,1.155,0,0,.66667],9125:[-99e-5,.601,0,0,.66667],9126:[.64502,1.155,0,0,.66667],9127:[1e-5,.9,0,0,.88889],9128:[.65002,1.15,0,0,.88889],9129:[.90001,0,0,0,.88889],9130:[0,.3,0,0,.88889],9131:[1e-5,.9,0,0,.88889],9132:[.65002,1.15,0,0,.88889],9133:[.90001,0,0,0,.88889],9143:[.88502,.915,0,0,1.05556],10216:[1.25003,1.75,0,0,.80556],10217:[1.25003,1.75,0,0,.80556],57344:[-.00499,.605,0,0,1.05556],57345:[-.00499,.605,0,0,1.05556],57680:[0,.12,0,0,.45],57681:[0,.12,0,0,.45],57682:[0,.12,0,0,.45],57683:[0,.12,0,0,.45]},"Typewriter-Regular":{32:[0,0,0,0,.525],33:[0,.61111,0,0,.525],34:[0,.61111,0,0,.525],35:[0,.61111,0,0,.525],36:[.08333,.69444,0,0,.525],37:[.08333,.69444,0,0,.525],38:[0,.61111,0,0,.525],39:[0,.61111,0,0,.525],40:[.08333,.69444,0,0,.525],41:[.08333,.69444,0,0,.525],42:[0,.52083,0,0,.525],43:[-.08056,.53055,0,0,.525],44:[.13889,.125,0,0,.525],45:[-.08056,.53055,0,0,.525],46:[0,.125,0,0,.525],47:[.08333,.69444,0,0,.525],48:[0,.61111,0,0,.525],49:[0,.61111,0,0,.525],50:[0,.61111,0,0,.525],51:[0,.61111,0,0,.525],52:[0,.61111,0,0,.525],53:[0,.61111,0,0,.525],54:[0,.61111,0,0,.525],55:[0,.61111,0,0,.525],56:[0,.61111,0,0,.525],57:[0,.61111,0,0,.525],58:[0,.43056,0,0,.525],59:[.13889,.43056,0,0,.525],60:[-.05556,.55556,0,0,.525],61:[-.19549,.41562,0,0,.525],62:[-.05556,.55556,0,0,.525],63:[0,.61111,0,0,.525],64:[0,.61111,0,0,.525],65:[0,.61111,0,0,.525],66:[0,.61111,0,0,.525],67:[0,.61111,0,0,.525],68:[0,.61111,0,0,.525],69:[0,.61111,0,0,.525],70:[0,.61111,0,0,.525],71:[0,.61111,0,0,.525],72:[0,.61111,0,0,.525],73:[0,.61111,0,0,.525],74:[0,.61111,0,0,.525],75:[0,.61111,0,0,.525],76:[0,.61111,0,0,.525],77:[0,.61111,0,0,.525],78:[0,.61111,0,0,.525],79:[0,.61111,0,0,.525],80:[0,.61111,0,0,.525],81:[.13889,.61111,0,0,.525],82:[0,.61111,0,0,.525],83:[0,.61111,0,0,.525],84:[0,.61111,0,0,.525],85:[0,.61111,0,0,.525],86:[0,.61111,0,0,.525],87:[0,.61111,0,0,.525],88:[0,.61111,0,0,.525],89:[0,.61111,0,0,.525],90:[0,.61111,0,0,.525],91:[.08333,.69444,0,0,.525],92:[.08333,.69444,0,0,.525],93:[.08333,.69444,0,0,.525],94:[0,.61111,0,0,.525],95:[.09514,0,0,0,.525],96:[0,.61111,0,0,.525],97:[0,.43056,0,0,.525],98:[0,.61111,0,0,.525],99:[0,.43056,0,0,.525],100:[0,.61111,0,0,.525],101:[0,.43056,0,0,.525],102:[0,.61111,0,0,.525],103:[.22222,.43056,0,0,.525],104:[0,.61111,0,0,.525],105:[0,.61111,0,0,.525],106:[.22222,.61111,0,0,.525],107:[0,.61111,0,0,.525],108:[0,.61111,0,0,.525],109:[0,.43056,0,0,.525],110:[0,.43056,0,0,.525],111:[0,.43056,0,0,.525],112:[.22222,.43056,0,0,.525],113:[.22222,.43056,0,0,.525],114:[0,.43056,0,0,.525],115:[0,.43056,0,0,.525],116:[0,.55358,0,0,.525],117:[0,.43056,0,0,.525],118:[0,.43056,0,0,.525],119:[0,.43056,0,0,.525],120:[0,.43056,0,0,.525],121:[.22222,.43056,0,0,.525],122:[0,.43056,0,0,.525],123:[.08333,.69444,0,0,.525],124:[.08333,.69444,0,0,.525],125:[.08333,.69444,0,0,.525],126:[0,.61111,0,0,.525],127:[0,.61111,0,0,.525],160:[0,0,0,0,.525],176:[0,.61111,0,0,.525],184:[.19445,0,0,0,.525],305:[0,.43056,0,0,.525],567:[.22222,.43056,0,0,.525],711:[0,.56597,0,0,.525],713:[0,.56555,0,0,.525],714:[0,.61111,0,0,.525],715:[0,.61111,0,0,.525],728:[0,.61111,0,0,.525],730:[0,.61111,0,0,.525],770:[0,.61111,0,0,.525],771:[0,.61111,0,0,.525],776:[0,.61111,0,0,.525],915:[0,.61111,0,0,.525],916:[0,.61111,0,0,.525],920:[0,.61111,0,0,.525],923:[0,.61111,0,0,.525],926:[0,.61111,0,0,.525],928:[0,.61111,0,0,.525],931:[0,.61111,0,0,.525],933:[0,.61111,0,0,.525],934:[0,.61111,0,0,.525],936:[0,.61111,0,0,.525],937:[0,.61111,0,0,.525],8216:[0,.61111,0,0,.525],8217:[0,.61111,0,0,.525],8242:[0,.61111,0,0,.525],9251:[.11111,.21944,0,0,.525]}},N={slant:[.25,.25,.25],space:[0,0,0],stretch:[0,0,0],shrink:[0,0,0],xHeight:[.431,.431,.431],quad:[1,1.171,1.472],extraSpace:[0,0,0],num1:[.677,.732,.925],num2:[.394,.384,.387],num3:[.444,.471,.504],denom1:[.686,.752,1.025],denom2:[.345,.344,.532],sup1:[.413,.503,.504],sup2:[.363,.431,.404],sup3:[.289,.286,.294],sub1:[.15,.143,.2],sub2:[.247,.286,.4],supDrop:[.386,.353,.494],subDrop:[.05,.071,.1],delim1:[2.39,1.7,1.98],delim2:[1.01,1.157,1.42],axisHeight:[.25,.25,.25],defaultRuleThickness:[.04,.049,.049],bigOpSpacing1:[.111,.111,.111],bigOpSpacing2:[.166,.166,.166],bigOpSpacing3:[.2,.2,.2],bigOpSpacing4:[.6,.611,.611],bigOpSpacing5:[.1,.143,.143],sqrtRuleThickness:[.04,.04,.04],ptPerEm:[10,10,10],doubleRuleSep:[.2,.2,.2],arrayRuleWidth:[.04,.04,.04],fboxsep:[.3,.3,.3],fboxrule:[.04,.04,.04]},q={"\xc5":"A","\xd0":"D","\xde":"o","\xe5":"a","\xf0":"d","\xfe":"o","\u0410":"A","\u0411":"B","\u0412":"B","\u0413":"F","\u0414":"A","\u0415":"E","\u0416":"K","\u0417":"3","\u0418":"N","\u0419":"N","\u041a":"K","\u041b":"N","\u041c":"M","\u041d":"H","\u041e":"O","\u041f":"N","\u0420":"P","\u0421":"C","\u0422":"T","\u0423":"y","\u0424":"O","\u0425":"X","\u0426":"U","\u0427":"h","\u0428":"W","\u0429":"W","\u042a":"B","\u042b":"X","\u042c":"B","\u042d":"3","\u042e":"X","\u042f":"R","\u0430":"a","\u0431":"b","\u0432":"a","\u0433":"r","\u0434":"y","\u0435":"e","\u0436":"m","\u0437":"e","\u0438":"n","\u0439":"n","\u043a":"n","\u043b":"n","\u043c":"m","\u043d":"n","\u043e":"o","\u043f":"n","\u0440":"p","\u0441":"c","\u0442":"o","\u0443":"y","\u0444":"b","\u0445":"x","\u0446":"n","\u0447":"n","\u0448":"w","\u0449":"w","\u044a":"a","\u044b":"m","\u044c":"a","\u044d":"e","\u044e":"m","\u044f":"r"};function I(e,t,r){if(!C[t])throw new Error("Font metrics not found for font: "+t+".");var a=e.charCodeAt(0),n=C[t][a];if(!n&&e[0]in q&&(a=q[e[0]].charCodeAt(0),n=C[t][a]),n||"text"!==r||z(a)&&(n=C[t][77]),n)return{depth:n[0],height:n[1],italic:n[2],skew:n[3],width:n[4]}}var R={};var H=[[1,1,1],[2,1,1],[3,1,1],[4,2,1],[5,2,1],[6,3,1],[7,4,2],[8,6,3],[9,7,6],[10,8,7],[11,10,9]],O=[.5,.6,.7,.8,.9,1,1.2,1.44,1.728,2.074,2.488],E=function(e,t){return t.size<2?e:H[e-1][t.size-1]};class L{constructor(e){this.style=void 0,this.color=void 0,this.size=void 0,this.textSize=void 0,this.phantom=void 0,this.font=void 0,this.fontFamily=void 0,this.fontWeight=void 0,this.fontShape=void 0,this.sizeMultiplier=void 0,this.maxSize=void 0,this.minRuleThickness=void 0,this._fontMetrics=void 0,this.style=e.style,this.color=e.color,this.size=e.size||L.BASESIZE,this.textSize=e.textSize||this.size,this.phantom=!!e.phantom,this.font=e.font||"",this.fontFamily=e.fontFamily||"",this.fontWeight=e.fontWeight||"",this.fontShape=e.fontShape||"",this.sizeMultiplier=O[this.size-1],this.maxSize=e.maxSize,this.minRuleThickness=e.minRuleThickness,this._fontMetrics=void 0}extend(e){var t={style:this.style,size:this.size,textSize:this.textSize,color:this.color,phantom:this.phantom,font:this.font,fontFamily:this.fontFamily,fontWeight:this.fontWeight,fontShape:this.fontShape,maxSize:this.maxSize,minRuleThickness:this.minRuleThickness};for(var r in e)e.hasOwnProperty(r)&&(t[r]=e[r]);return new L(t)}havingStyle(e){return this.style===e?this:this.extend({style:e,size:E(this.textSize,e)})}havingCrampedStyle(){return this.havingStyle(this.style.cramp())}havingSize(e){return this.size===e&&this.textSize===e?this:this.extend({style:this.style.text(),size:e,textSize:e,sizeMultiplier:O[e-1]})}havingBaseStyle(e){e=e||this.style.text();var t=E(L.BASESIZE,e);return this.size===t&&this.textSize===L.BASESIZE&&this.style===e?this:this.extend({style:e,size:t})}havingBaseSizing(){var e;switch(this.style.id){case 4:case 5:e=3;break;case 6:case 7:e=1;break;default:e=6}return this.extend({style:this.style.text(),size:e})}withColor(e){return this.extend({color:e})}withPhantom(){return this.extend({phantom:!0})}withFont(e){return this.extend({font:e})}withTextFontFamily(e){return this.extend({fontFamily:e,font:""})}withTextFontWeight(e){return this.extend({fontWeight:e,font:""})}withTextFontShape(e){return this.extend({fontShape:e,font:""})}sizingClasses(e){return e.size!==this.size?["sizing","reset-size"+e.size,"size"+this.size]:[]}baseSizingClasses(){return this.size!==L.BASESIZE?["sizing","reset-size"+this.size,"size"+L.BASESIZE]:[]}fontMetrics(){return this._fontMetrics||(this._fontMetrics=function(e){var t;if(!R[t=e>=5?0:e>=3?1:2]){var r=R[t]={cssEmPerMu:N.quad[t]/18};for(var a in N)N.hasOwnProperty(a)&&(r[a]=N[a][t])}return R[t]}(this.size)),this._fontMetrics}getColor(){return this.phantom?"transparent":this.color}}L.BASESIZE=6;var D={pt:1,mm:7227/2540,cm:7227/254,in:72.27,bp:1.00375,pc:12,dd:1238/1157,cc:14856/1157,nd:685/642,nc:1370/107,sp:1/65536,px:1.00375},V={ex:!0,em:!0,mu:!0},P=function(e){return"string"!==typeof e&&(e=e.unit),e in D||e in V||"ex"===e},F=function(e,t){var r;if(e.unit in D)r=D[e.unit]/t.fontMetrics().ptPerEm/t.sizeMultiplier;else if("mu"===e.unit)r=t.fontMetrics().cssEmPerMu;else{var a;if(a=t.style.isTight()?t.havingStyle(t.style.text()):t,"ex"===e.unit)r=a.fontMetrics().xHeight;else{if("em"!==e.unit)throw new i("Invalid unit: '"+e.unit+"'");r=a.fontMetrics().quad}a!==t&&(r*=a.sizeMultiplier/t.sizeMultiplier)}return Math.min(e.number*r,t.maxSize)},G=function(e){return+e.toFixed(4)+"em"},U=function(e){return e.filter((e=>e)).join(" ")},Y=function(e,t,r){if(this.classes=e||[],this.attributes={},this.height=0,this.depth=0,this.maxFontSize=0,this.style=r||{},t){t.style.isTight()&&this.classes.push("mtight");var a=t.getColor();a&&(this.style.color=a)}},X=function(e){var t=document.createElement(e);for(var r in t.className=U(this.classes),this.style)this.style.hasOwnProperty(r)&&(t.style[r]=this.style[r]);for(var a in this.attributes)this.attributes.hasOwnProperty(a)&&t.setAttribute(a,this.attributes[a]);for(var n=0;n/=\x00-\x1f]/,_=function(e){var t="<"+e;this.classes.length&&(t+=' class="'+m.escape(U(this.classes))+'"');var r="";for(var a in this.style)this.style.hasOwnProperty(a)&&(r+=m.hyphenate(a)+":"+this.style[a]+";");for(var n in r&&(t+=' style="'+m.escape(r)+'"'),this.attributes)if(this.attributes.hasOwnProperty(n)){if(W.test(n))throw new i("Invalid attribute name '"+n+"'");t+=" "+n+'="'+m.escape(this.attributes[n])+'"'}t+=">";for(var o=0;o"};class j{constructor(e,t,r,a){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.width=void 0,this.maxFontSize=void 0,this.style=void 0,Y.call(this,e,r,a),this.children=t||[]}setAttribute(e,t){this.attributes[e]=t}hasClass(e){return m.contains(this.classes,e)}toNode(){return X.call(this,"span")}toMarkup(){return _.call(this,"span")}}class ${constructor(e,t,r,a){this.children=void 0,this.attributes=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,Y.call(this,t,a),this.children=r||[],this.setAttribute("href",e)}setAttribute(e,t){this.attributes[e]=t}hasClass(e){return m.contains(this.classes,e)}toNode(){return X.call(this,"a")}toMarkup(){return _.call(this,"a")}}class Z{constructor(e,t,r){this.src=void 0,this.alt=void 0,this.classes=void 0,this.height=void 0,this.depth=void 0,this.maxFontSize=void 0,this.style=void 0,this.alt=t,this.src=e,this.classes=["mord"],this.style=r}hasClass(e){return m.contains(this.classes,e)}toNode(){var e=document.createElement("img");for(var t in e.src=this.src,e.alt=this.alt,e.className="mord",this.style)this.style.hasOwnProperty(t)&&(e.style[t]=this.style[t]);return e}toMarkup(){var e=''+m.escape(this.alt)+'=n[0]&&e<=n[1])return r.name}return null}(this.text.charCodeAt(0));l&&this.classes.push(l+"_fallback"),/[\xee\xef\xed\xec]/.test(this.text)&&(this.text=K[this.text])}hasClass(e){return m.contains(this.classes,e)}toNode(){var e=document.createTextNode(this.text),t=null;for(var r in this.italic>0&&((t=document.createElement("span")).style.marginRight=G(this.italic)),this.classes.length>0&&((t=t||document.createElement("span")).className=U(this.classes)),this.style)this.style.hasOwnProperty(r)&&((t=t||document.createElement("span")).style[r]=this.style[r]);return t?(t.appendChild(e),t):e}toMarkup(){var e=!1,t="0&&(r+="margin-right:"+this.italic+"em;"),this.style)this.style.hasOwnProperty(a)&&(r+=m.hyphenate(a)+":"+this.style[a]+";");r&&(e=!0,t+=' style="'+m.escape(r)+'"');var n=m.escape(this.text);return e?(t+=">",t+=n,t+=""):n}}class Q{constructor(e,t){this.children=void 0,this.attributes=void 0,this.children=e||[],this.attributes=t||{}}toNode(){var e=document.createElementNS("http://www.w3.org/2000/svg","svg");for(var t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&e.setAttribute(t,this.attributes[t]);for(var r=0;r':''}}class te{constructor(e){this.attributes=void 0,this.attributes=e||{}}toNode(){var e=document.createElementNS("http://www.w3.org/2000/svg","line");for(var t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&e.setAttribute(t,this.attributes[t]);return e}toMarkup(){var e="","\\gt",!0),oe(se,he,ye,"\u2208","\\in",!0),oe(se,he,ye,"\ue020","\\@not"),oe(se,he,ye,"\u2282","\\subset",!0),oe(se,he,ye,"\u2283","\\supset",!0),oe(se,he,ye,"\u2286","\\subseteq",!0),oe(se,he,ye,"\u2287","\\supseteq",!0),oe(se,me,ye,"\u2288","\\nsubseteq",!0),oe(se,me,ye,"\u2289","\\nsupseteq",!0),oe(se,he,ye,"\u22a8","\\models"),oe(se,he,ye,"\u2190","\\leftarrow",!0),oe(se,he,ye,"\u2264","\\le"),oe(se,he,ye,"\u2264","\\leq",!0),oe(se,he,ye,"<","\\lt",!0),oe(se,he,ye,"\u2192","\\rightarrow",!0),oe(se,he,ye,"\u2192","\\to"),oe(se,me,ye,"\u2271","\\ngeq",!0),oe(se,me,ye,"\u2270","\\nleq",!0),oe(se,he,xe,"\xa0","\\ "),oe(se,he,xe,"\xa0","\\space"),oe(se,he,xe,"\xa0","\\nobreakspace"),oe(le,he,xe,"\xa0","\\ "),oe(le,he,xe,"\xa0"," "),oe(le,he,xe,"\xa0","\\space"),oe(le,he,xe,"\xa0","\\nobreakspace"),oe(se,he,xe,null,"\\nobreak"),oe(se,he,xe,null,"\\allowbreak"),oe(se,he,be,",",","),oe(se,he,be,";",";"),oe(se,me,pe,"\u22bc","\\barwedge",!0),oe(se,me,pe,"\u22bb","\\veebar",!0),oe(se,he,pe,"\u2299","\\odot",!0),oe(se,he,pe,"\u2295","\\oplus",!0),oe(se,he,pe,"\u2297","\\otimes",!0),oe(se,he,we,"\u2202","\\partial",!0),oe(se,he,pe,"\u2298","\\oslash",!0),oe(se,me,pe,"\u229a","\\circledcirc",!0),oe(se,me,pe,"\u22a1","\\boxdot",!0),oe(se,he,pe,"\u25b3","\\bigtriangleup"),oe(se,he,pe,"\u25bd","\\bigtriangledown"),oe(se,he,pe,"\u2020","\\dagger"),oe(se,he,pe,"\u22c4","\\diamond"),oe(se,he,pe,"\u22c6","\\star"),oe(se,he,pe,"\u25c3","\\triangleleft"),oe(se,he,pe,"\u25b9","\\triangleright"),oe(se,he,ve,"{","\\{"),oe(le,he,we,"{","\\{"),oe(le,he,we,"{","\\textbraceleft"),oe(se,he,ue,"}","\\}"),oe(le,he,we,"}","\\}"),oe(le,he,we,"}","\\textbraceright"),oe(se,he,ve,"{","\\lbrace"),oe(se,he,ue,"}","\\rbrace"),oe(se,he,ve,"[","\\lbrack",!0),oe(le,he,we,"[","\\lbrack",!0),oe(se,he,ue,"]","\\rbrack",!0),oe(le,he,we,"]","\\rbrack",!0),oe(se,he,ve,"(","\\lparen",!0),oe(se,he,ue,")","\\rparen",!0),oe(le,he,we,"<","\\textless",!0),oe(le,he,we,">","\\textgreater",!0),oe(se,he,ve,"\u230a","\\lfloor",!0),oe(se,he,ue,"\u230b","\\rfloor",!0),oe(se,he,ve,"\u2308","\\lceil",!0),oe(se,he,ue,"\u2309","\\rceil",!0),oe(se,he,we,"\\","\\backslash"),oe(se,he,we,"\u2223","|"),oe(se,he,we,"\u2223","\\vert"),oe(le,he,we,"|","\\textbar",!0),oe(se,he,we,"\u2225","\\|"),oe(se,he,we,"\u2225","\\Vert"),oe(le,he,we,"\u2225","\\textbardbl"),oe(le,he,we,"~","\\textasciitilde"),oe(le,he,we,"\\","\\textbackslash"),oe(le,he,we,"^","\\textasciicircum"),oe(se,he,ye,"\u2191","\\uparrow",!0),oe(se,he,ye,"\u21d1","\\Uparrow",!0),oe(se,he,ye,"\u2193","\\downarrow",!0),oe(se,he,ye,"\u21d3","\\Downarrow",!0),oe(se,he,ye,"\u2195","\\updownarrow",!0),oe(se,he,ye,"\u21d5","\\Updownarrow",!0),oe(se,he,fe,"\u2210","\\coprod"),oe(se,he,fe,"\u22c1","\\bigvee"),oe(se,he,fe,"\u22c0","\\bigwedge"),oe(se,he,fe,"\u2a04","\\biguplus"),oe(se,he,fe,"\u22c2","\\bigcap"),oe(se,he,fe,"\u22c3","\\bigcup"),oe(se,he,fe,"\u222b","\\int"),oe(se,he,fe,"\u222b","\\intop"),oe(se,he,fe,"\u222c","\\iint"),oe(se,he,fe,"\u222d","\\iiint"),oe(se,he,fe,"\u220f","\\prod"),oe(se,he,fe,"\u2211","\\sum"),oe(se,he,fe,"\u2a02","\\bigotimes"),oe(se,he,fe,"\u2a01","\\bigoplus"),oe(se,he,fe,"\u2a00","\\bigodot"),oe(se,he,fe,"\u222e","\\oint"),oe(se,he,fe,"\u222f","\\oiint"),oe(se,he,fe,"\u2230","\\oiiint"),oe(se,he,fe,"\u2a06","\\bigsqcup"),oe(se,he,fe,"\u222b","\\smallint"),oe(le,he,de,"\u2026","\\textellipsis"),oe(se,he,de,"\u2026","\\mathellipsis"),oe(le,he,de,"\u2026","\\ldots",!0),oe(se,he,de,"\u2026","\\ldots",!0),oe(se,he,de,"\u22ef","\\@cdots",!0),oe(se,he,de,"\u22f1","\\ddots",!0),oe(se,he,we,"\u22ee","\\varvdots"),oe(le,he,we,"\u22ee","\\varvdots"),oe(se,he,ce,"\u02ca","\\acute"),oe(se,he,ce,"\u02cb","\\grave"),oe(se,he,ce,"\xa8","\\ddot"),oe(se,he,ce,"~","\\tilde"),oe(se,he,ce,"\u02c9","\\bar"),oe(se,he,ce,"\u02d8","\\breve"),oe(se,he,ce,"\u02c7","\\check"),oe(se,he,ce,"^","\\hat"),oe(se,he,ce,"\u20d7","\\vec"),oe(se,he,ce,"\u02d9","\\dot"),oe(se,he,ce,"\u02da","\\mathring"),oe(se,he,ge,"\ue131","\\@imath"),oe(se,he,ge,"\ue237","\\@jmath"),oe(se,he,we,"\u0131","\u0131"),oe(se,he,we,"\u0237","\u0237"),oe(le,he,we,"\u0131","\\i",!0),oe(le,he,we,"\u0237","\\j",!0),oe(le,he,we,"\xdf","\\ss",!0),oe(le,he,we,"\xe6","\\ae",!0),oe(le,he,we,"\u0153","\\oe",!0),oe(le,he,we,"\xf8","\\o",!0),oe(le,he,we,"\xc6","\\AE",!0),oe(le,he,we,"\u0152","\\OE",!0),oe(le,he,we,"\xd8","\\O",!0),oe(le,he,ce,"\u02ca","\\'"),oe(le,he,ce,"\u02cb","\\`"),oe(le,he,ce,"\u02c6","\\^"),oe(le,he,ce,"\u02dc","\\~"),oe(le,he,ce,"\u02c9","\\="),oe(le,he,ce,"\u02d8","\\u"),oe(le,he,ce,"\u02d9","\\."),oe(le,he,ce,"\xb8","\\c"),oe(le,he,ce,"\u02da","\\r"),oe(le,he,ce,"\u02c7","\\v"),oe(le,he,ce,"\xa8",'\\"'),oe(le,he,ce,"\u02dd","\\H"),oe(le,he,ce,"\u25ef","\\textcircled");var ke={"--":!0,"---":!0,"``":!0,"''":!0};oe(le,he,we,"\u2013","--",!0),oe(le,he,we,"\u2013","\\textendash"),oe(le,he,we,"\u2014","---",!0),oe(le,he,we,"\u2014","\\textemdash"),oe(le,he,we,"\u2018","`",!0),oe(le,he,we,"\u2018","\\textquoteleft"),oe(le,he,we,"\u2019","'",!0),oe(le,he,we,"\u2019","\\textquoteright"),oe(le,he,we,"\u201c","``",!0),oe(le,he,we,"\u201c","\\textquotedblleft"),oe(le,he,we,"\u201d","''",!0),oe(le,he,we,"\u201d","\\textquotedblright"),oe(se,he,we,"\xb0","\\degree",!0),oe(le,he,we,"\xb0","\\degree"),oe(le,he,we,"\xb0","\\textdegree",!0),oe(se,he,we,"\xa3","\\pounds"),oe(se,he,we,"\xa3","\\mathsterling",!0),oe(le,he,we,"\xa3","\\pounds"),oe(le,he,we,"\xa3","\\textsterling",!0),oe(se,me,we,"\u2720","\\maltese"),oe(le,me,we,"\u2720","\\maltese");for(var Se='0123456789/@."',Me=0;Me<14;Me++){var ze=Se.charAt(Me);oe(se,he,we,ze,ze)}for(var Ae='0123456789!@*()-=+";:?/.,',Te=0;Te<25;Te++){var Be=Ae.charAt(Te);oe(le,he,we,Be,Be)}for(var Ce="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz",Ne=0;Ne<52;Ne++){var qe=Ce.charAt(Ne);oe(se,he,ge,qe,qe),oe(le,he,we,qe,qe)}oe(se,me,we,"C","\u2102"),oe(le,me,we,"C","\u2102"),oe(se,me,we,"H","\u210d"),oe(le,me,we,"H","\u210d"),oe(se,me,we,"N","\u2115"),oe(le,me,we,"N","\u2115"),oe(se,me,we,"P","\u2119"),oe(le,me,we,"P","\u2119"),oe(se,me,we,"Q","\u211a"),oe(le,me,we,"Q","\u211a"),oe(se,me,we,"R","\u211d"),oe(le,me,we,"R","\u211d"),oe(se,me,we,"Z","\u2124"),oe(le,me,we,"Z","\u2124"),oe(se,he,ge,"h","\u210e"),oe(le,he,ge,"h","\u210e");for(var Ie="",Re=0;Re<52;Re++){var He=Ce.charAt(Re);oe(se,he,ge,He,Ie=String.fromCharCode(55349,56320+Re)),oe(le,he,we,He,Ie),oe(se,he,ge,He,Ie=String.fromCharCode(55349,56372+Re)),oe(le,he,we,He,Ie),oe(se,he,ge,He,Ie=String.fromCharCode(55349,56424+Re)),oe(le,he,we,He,Ie),oe(se,he,ge,He,Ie=String.fromCharCode(55349,56580+Re)),oe(le,he,we,He,Ie),oe(se,he,ge,He,Ie=String.fromCharCode(55349,56684+Re)),oe(le,he,we,He,Ie),oe(se,he,ge,He,Ie=String.fromCharCode(55349,56736+Re)),oe(le,he,we,He,Ie),oe(se,he,ge,He,Ie=String.fromCharCode(55349,56788+Re)),oe(le,he,we,He,Ie),oe(se,he,ge,He,Ie=String.fromCharCode(55349,56840+Re)),oe(le,he,we,He,Ie),oe(se,he,ge,He,Ie=String.fromCharCode(55349,56944+Re)),oe(le,he,we,He,Ie),Re<26&&(oe(se,he,ge,He,Ie=String.fromCharCode(55349,56632+Re)),oe(le,he,we,He,Ie),oe(se,he,ge,He,Ie=String.fromCharCode(55349,56476+Re)),oe(le,he,we,He,Ie))}oe(se,he,ge,"k",Ie=String.fromCharCode(55349,56668)),oe(le,he,we,"k",Ie);for(var Oe=0;Oe<10;Oe++){var Ee=Oe.toString();oe(se,he,ge,Ee,Ie=String.fromCharCode(55349,57294+Oe)),oe(le,he,we,Ee,Ie),oe(se,he,ge,Ee,Ie=String.fromCharCode(55349,57314+Oe)),oe(le,he,we,Ee,Ie),oe(se,he,ge,Ee,Ie=String.fromCharCode(55349,57324+Oe)),oe(le,he,we,Ee,Ie),oe(se,he,ge,Ee,Ie=String.fromCharCode(55349,57334+Oe)),oe(le,he,we,Ee,Ie)}for(var Le="\xd0\xde\xfe",De=0;De<3;De++){var Ve=Le.charAt(De);oe(se,he,ge,Ve,Ve),oe(le,he,we,Ve,Ve)}var Pe=[["mathbf","textbf","Main-Bold"],["mathbf","textbf","Main-Bold"],["mathnormal","textit","Math-Italic"],["mathnormal","textit","Math-Italic"],["boldsymbol","boldsymbol","Main-BoldItalic"],["boldsymbol","boldsymbol","Main-BoldItalic"],["mathscr","textscr","Script-Regular"],["","",""],["","",""],["","",""],["mathfrak","textfrak","Fraktur-Regular"],["mathfrak","textfrak","Fraktur-Regular"],["mathbb","textbb","AMS-Regular"],["mathbb","textbb","AMS-Regular"],["mathboldfrak","textboldfrak","Fraktur-Regular"],["mathboldfrak","textboldfrak","Fraktur-Regular"],["mathsf","textsf","SansSerif-Regular"],["mathsf","textsf","SansSerif-Regular"],["mathboldsf","textboldsf","SansSerif-Bold"],["mathboldsf","textboldsf","SansSerif-Bold"],["mathitsf","textitsf","SansSerif-Italic"],["mathitsf","textitsf","SansSerif-Italic"],["","",""],["","",""],["mathtt","texttt","Typewriter-Regular"],["mathtt","texttt","Typewriter-Regular"]],Fe=[["mathbf","textbf","Main-Bold"],["","",""],["mathsf","textsf","SansSerif-Regular"],["mathboldsf","textboldsf","SansSerif-Bold"],["mathtt","texttt","Typewriter-Regular"]],Ge=function(e,t,r){return ie[r][e]&&ie[r][e].replace&&(e=ie[r][e].replace),{value:e,metrics:I(e,t,r)}},Ue=function(e,t,r,a,n){var i,o=Ge(e,t,r),s=o.metrics;if(e=o.value,s){var l=s.italic;("text"===r||a&&"mathit"===a.font)&&(l=0),i=new J(e,s.height,s.depth,l,s.skew,s.width,n)}else"undefined"!==typeof console&&console.warn("No character metrics for '"+e+"' in style '"+t+"' and mode '"+r+"'"),i=new J(e,0,0,0,0,0,n);if(a){i.maxFontSize=a.sizeMultiplier,a.style.isTight()&&i.classes.push("mtight");var h=a.getColor();h&&(i.style.color=h)}return i},Ye=(e,t)=>{if(U(e.classes)!==U(t.classes)||e.skew!==t.skew||e.maxFontSize!==t.maxFontSize)return!1;if(1===e.classes.length){var r=e.classes[0];if("mbin"===r||"mord"===r)return!1}for(var a in e.style)if(e.style.hasOwnProperty(a)&&e.style[a]!==t.style[a])return!1;for(var n in t.style)if(t.style.hasOwnProperty(n)&&e.style[n]!==t.style[n])return!1;return!0},Xe=function(e){for(var t=0,r=0,a=0,n=0;nt&&(t=i.height),i.depth>r&&(r=i.depth),i.maxFontSize>a&&(a=i.maxFontSize)}e.height=t,e.depth=r,e.maxFontSize=a},We=function(e,t,r,a){var n=new j(e,t,r,a);return Xe(n),n},_e=(e,t,r,a)=>new j(e,t,r,a),je=function(e){var t=new B(e);return Xe(t),t},$e=function(e,t,r){var a="";switch(e){case"amsrm":a="AMS";break;case"textrm":a="Main";break;case"textsf":a="SansSerif";break;case"texttt":a="Typewriter";break;default:a=e}return a+"-"+("textbf"===t&&"textit"===r?"BoldItalic":"textbf"===t?"Bold":"textit"===t?"Italic":"Regular")},Ze={mathbf:{variant:"bold",fontName:"Main-Bold"},mathrm:{variant:"normal",fontName:"Main-Regular"},textit:{variant:"italic",fontName:"Main-Italic"},mathit:{variant:"italic",fontName:"Main-Italic"},mathnormal:{variant:"italic",fontName:"Math-Italic"},mathsfit:{variant:"sans-serif-italic",fontName:"SansSerif-Italic"},mathbb:{variant:"double-struck",fontName:"AMS-Regular"},mathcal:{variant:"script",fontName:"Caligraphic-Regular"},mathfrak:{variant:"fraktur",fontName:"Fraktur-Regular"},mathscr:{variant:"script",fontName:"Script-Regular"},mathsf:{variant:"sans-serif",fontName:"SansSerif-Regular"},mathtt:{variant:"monospace",fontName:"Typewriter-Regular"}},Ke={vec:["vec",.471,.714],oiintSize1:["oiintSize1",.957,.499],oiintSize2:["oiintSize2",1.472,.659],oiiintSize1:["oiiintSize1",1.304,.499],oiiintSize2:["oiiintSize2",1.98,.659]},Je={fontMap:Ze,makeSymbol:Ue,mathsym:function(e,t,r,a){return void 0===a&&(a=[]),"boldsymbol"===r.font&&Ge(e,"Main-Bold",t).metrics?Ue(e,"Main-Bold",t,r,a.concat(["mathbf"])):"\\"===e||"main"===ie[t][e].font?Ue(e,"Main-Regular",t,r,a):Ue(e,"AMS-Regular",t,r,a.concat(["amsrm"]))},makeSpan:We,makeSvgSpan:_e,makeLineSpan:function(e,t,r){var a=We([e],[],t);return a.height=Math.max(r||t.fontMetrics().defaultRuleThickness,t.minRuleThickness),a.style.borderBottomWidth=G(a.height),a.maxFontSize=1,a},makeAnchor:function(e,t,r,a){var n=new $(e,t,r,a);return Xe(n),n},makeFragment:je,wrapFragment:function(e,t){return e instanceof B?We([],[e],t):e},makeVList:function(e,t){for(var{children:r,depth:a}=function(e){if("individualShift"===e.positionType){for(var t=e.children,r=[t[0]],a=-t[0].shift-t[0].elem.depth,n=a,i=1;i0)return Ue(n,h,a,t,o.concat(m));if(l){var c,p;if("boldsymbol"===l){var u=function(e,t,r,a,n){return"textord"!==n&&Ge(e,"Math-BoldItalic",t).metrics?{fontName:"Math-BoldItalic",fontClass:"boldsymbol"}:{fontName:"Main-Bold",fontClass:"mathbf"}}(n,a,0,0,r);c=u.fontName,p=[u.fontClass]}else s?(c=Ze[l].fontName,p=[l]):(c=$e(l,t.fontWeight,t.fontShape),p=[l,t.fontWeight,t.fontShape]);if(Ge(n,c,a).metrics)return Ue(n,c,a,t,o.concat(p));if(ke.hasOwnProperty(n)&&"Typewriter"===c.slice(0,10)){for(var d=[],g=0;g{var r=We(["mspace"],[],t),a=F(e,t);return r.style.marginRight=G(a),r},staticSvg:function(e,t){var[r,a,n]=Ke[e],i=new ee(r),o=new Q([i],{width:G(a),height:G(n),style:"width:"+G(a),viewBox:"0 0 "+1e3*a+" "+1e3*n,preserveAspectRatio:"xMinYMin"}),s=_e(["overlay"],[o],t);return s.height=n,s.style.height=G(n),s.style.width=G(a),s},svgData:Ke,tryCombineChars:e=>{for(var t=0;t{var r=t.classes[0],a=e.classes[0];"mbin"===r&&m.contains(ut,a)?t.classes[0]="mord":"mbin"===a&&m.contains(pt,r)&&(e.classes[0]="mord")}),{node:c},p,u),vt(n,((e,t)=>{var r=xt(t),a=xt(e),n=r&&a?e.hasClass("mtight")?at[r][a]:rt[r][a]:null;if(n)return Je.makeGlue(n,l)}),{node:c},p,u),n},vt=function e(t,r,a,n,i){n&&t.push(n);for(var o=0;or=>{t.splice(e+1,0,r),o++})(o)}}n&&t.pop()},bt=function(e){return e instanceof B||e instanceof $||e instanceof j&&e.hasClass("enclosing")?e:null},yt=function e(t,r){var a=bt(t);if(a){var n=a.children;if(n.length){if("right"===r)return e(n[n.length-1],"right");if("left"===r)return e(n[0],"left")}}return t},xt=function(e,t){return e?(t&&(e=yt(e,t)),gt[e.classes[0]]||null):null},wt=function(e,t){var r=["nulldelimiter"].concat(e.baseSizingClasses());return ct(t.concat(r))},kt=function(e,t,r){if(!e)return ct();if(it[e.type]){var a=it[e.type](e,t);if(r&&t.size!==r.size){a=ct(t.sizingClasses(r),[a],t);var n=t.sizeMultiplier/r.sizeMultiplier;a.height*=n,a.depth*=n}return a}throw new i("Got group of unknown type: '"+e.type+"'")};function St(e,t){var r=ct(["base"],e,t),a=ct(["strut"]);return a.style.height=G(r.height+r.depth),r.depth&&(a.style.verticalAlign=G(-r.depth)),r.children.unshift(a),r}function Mt(e,t){var r=null;1===e.length&&"tag"===e[0].type&&(r=e[0].tag,e=e[0].body);var a,n=ft(e,t,"root");2===n.length&&n[1].hasClass("tag")&&(a=n.pop());for(var i,o=[],s=[],l=0;l0&&(o.push(St(s,t)),s=[]),o.push(n[l]));s.length>0&&o.push(St(s,t)),r?((i=St(ft(r,t,!0))).classes=["tag"],o.push(i)):a&&o.push(a);var m=ct(["katex-html"],o);if(m.setAttribute("aria-hidden","true"),i){var c=i.children[0];c.style.height=G(m.height+m.depth),m.depth&&(c.style.verticalAlign=G(-m.depth))}return m}function zt(e){return new B(e)}class At{constructor(e,t,r){this.type=void 0,this.attributes=void 0,this.children=void 0,this.classes=void 0,this.type=e,this.attributes={},this.children=t||[],this.classes=r||[]}setAttribute(e,t){this.attributes[e]=t}getAttribute(e){return this.attributes[e]}toNode(){var e=document.createElementNS("http://www.w3.org/1998/Math/MathML",this.type);for(var t in this.attributes)Object.prototype.hasOwnProperty.call(this.attributes,t)&&e.setAttribute(t,this.attributes[t]);this.classes.length>0&&(e.className=U(this.classes));for(var r=0;r0&&(e+=' class ="'+m.escape(U(this.classes))+'"'),e+=">";for(var r=0;r"}toText(){return this.children.map((e=>e.toText())).join("")}}class Tt{constructor(e){this.text=void 0,this.text=e}toNode(){return document.createTextNode(this.text)}toMarkup(){return m.escape(this.toText())}toText(){return this.text}}var Bt={MathNode:At,TextNode:Tt,SpaceNode:class{constructor(e){this.width=void 0,this.character=void 0,this.width=e,this.character=e>=.05555&&e<=.05556?"\u200a":e>=.1666&&e<=.1667?"\u2009":e>=.2222&&e<=.2223?"\u2005":e>=.2777&&e<=.2778?"\u2005\u200a":e>=-.05556&&e<=-.05555?"\u200a\u2063":e>=-.1667&&e<=-.1666?"\u2009\u2063":e>=-.2223&&e<=-.2222?"\u205f\u2063":e>=-.2778&&e<=-.2777?"\u2005\u2063":null}toNode(){if(this.character)return document.createTextNode(this.character);var e=document.createElementNS("http://www.w3.org/1998/Math/MathML","mspace");return e.setAttribute("width",G(this.width)),e}toMarkup(){return this.character?""+this.character+"":''}toText(){return this.character?this.character:" "}},newDocumentFragment:zt},Ct=function(e,t,r){return!ie[t][e]||!ie[t][e].replace||55349===e.charCodeAt(0)||ke.hasOwnProperty(e)&&r&&(r.fontFamily&&"tt"===r.fontFamily.slice(4,6)||r.font&&"tt"===r.font.slice(4,6))||(e=ie[t][e].replace),new Bt.TextNode(e)},Nt=function(e){return 1===e.length?e[0]:new Bt.MathNode("mrow",e)},qt=function(e,t){if("texttt"===t.fontFamily)return"monospace";if("textsf"===t.fontFamily)return"textit"===t.fontShape&&"textbf"===t.fontWeight?"sans-serif-bold-italic":"textit"===t.fontShape?"sans-serif-italic":"textbf"===t.fontWeight?"bold-sans-serif":"sans-serif";if("textit"===t.fontShape&&"textbf"===t.fontWeight)return"bold-italic";if("textit"===t.fontShape)return"italic";if("textbf"===t.fontWeight)return"bold";var r=t.font;if(!r||"mathnormal"===r)return null;var a=e.mode;if("mathit"===r)return"italic";if("boldsymbol"===r)return"textord"===e.type?"bold":"bold-italic";if("mathbf"===r)return"bold";if("mathbb"===r)return"double-struck";if("mathsfit"===r)return"sans-serif-italic";if("mathfrak"===r)return"fraktur";if("mathscr"===r||"mathcal"===r)return"script";if("mathsf"===r)return"sans-serif";if("mathtt"===r)return"monospace";var n=e.text;return m.contains(["\\imath","\\jmath"],n)?null:(ie[a][n]&&ie[a][n].replace&&(n=ie[a][n].replace),I(n,Je.fontMap[r].fontName,a)?Je.fontMap[r].variant:null)};function It(e){if(!e)return!1;if("mi"===e.type&&1===e.children.length){var t=e.children[0];return t instanceof Tt&&"."===t.text}if("mo"===e.type&&1===e.children.length&&"true"===e.getAttribute("separator")&&"0em"===e.getAttribute("lspace")&&"0em"===e.getAttribute("rspace")){var r=e.children[0];return r instanceof Tt&&","===r.text}return!1}var Rt=function(e,t,r){if(1===e.length){var a=Ot(e[0],t);return r&&a instanceof At&&"mo"===a.type&&(a.setAttribute("lspace","0em"),a.setAttribute("rspace","0em")),[a]}for(var n,i=[],o=0;o=1&&("mn"===n.type||It(n))){var l=s.children[0];l instanceof At&&"mn"===l.type&&(l.children=[...n.children,...l.children],i.pop())}else if("mi"===n.type&&1===n.children.length){var h=n.children[0];if(h instanceof Tt&&"\u0338"===h.text&&("mo"===s.type||"mi"===s.type||"mn"===s.type)){var m=s.children[0];m instanceof Tt&&m.text.length>0&&(m.text=m.text.slice(0,1)+"\u0338"+m.text.slice(1),i.pop())}}}i.push(s),n=s}return i},Ht=function(e,t,r){return Nt(Rt(e,t,r))},Ot=function(e,t){if(!e)return new Bt.MathNode("mrow");if(ot[e.type])return ot[e.type](e,t);throw new i("Got group of unknown type: '"+e.type+"'")};function Et(e,t,r,a,n){var i,o=Rt(e,r);i=1===o.length&&o[0]instanceof At&&m.contains(["mrow","mtable"],o[0].type)?o[0]:new Bt.MathNode("mrow",o);var s=new Bt.MathNode("annotation",[new Bt.TextNode(t)]);s.setAttribute("encoding","application/x-tex");var l=new Bt.MathNode("semantics",[i,s]),h=new Bt.MathNode("math",[l]);h.setAttribute("xmlns","http://www.w3.org/1998/Math/MathML"),a&&h.setAttribute("display","block");var c=n?"katex":"katex-mathml";return Je.makeSpan([c],[h])}var Lt=function(e){return new L({style:e.displayMode?k.DISPLAY:k.TEXT,maxSize:e.maxSize,minRuleThickness:e.minRuleThickness})},Dt=function(e,t){if(t.displayMode){var r=["katex-display"];t.leqno&&r.push("leqno"),t.fleqn&&r.push("fleqn"),e=Je.makeSpan(r,[e])}return e},Vt={widehat:"^",widecheck:"\u02c7",widetilde:"~",utilde:"~",overleftarrow:"\u2190",underleftarrow:"\u2190",xleftarrow:"\u2190",overrightarrow:"\u2192",underrightarrow:"\u2192",xrightarrow:"\u2192",underbrace:"\u23df",overbrace:"\u23de",overgroup:"\u23e0",undergroup:"\u23e1",overleftrightarrow:"\u2194",underleftrightarrow:"\u2194",xleftrightarrow:"\u2194",Overrightarrow:"\u21d2",xRightarrow:"\u21d2",overleftharpoon:"\u21bc",xleftharpoonup:"\u21bc",overrightharpoon:"\u21c0",xrightharpoonup:"\u21c0",xLeftarrow:"\u21d0",xLeftrightarrow:"\u21d4",xhookleftarrow:"\u21a9",xhookrightarrow:"\u21aa",xmapsto:"\u21a6",xrightharpoondown:"\u21c1",xleftharpoondown:"\u21bd",xrightleftharpoons:"\u21cc",xleftrightharpoons:"\u21cb",xtwoheadleftarrow:"\u219e",xtwoheadrightarrow:"\u21a0",xlongequal:"=",xtofrom:"\u21c4",xrightleftarrows:"\u21c4",xrightequilibrium:"\u21cc",xleftequilibrium:"\u21cb","\\cdrightarrow":"\u2192","\\cdleftarrow":"\u2190","\\cdlongequal":"="},Pt={overrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],overleftarrow:[["leftarrow"],.888,522,"xMinYMin"],underrightarrow:[["rightarrow"],.888,522,"xMaxYMin"],underleftarrow:[["leftarrow"],.888,522,"xMinYMin"],xrightarrow:[["rightarrow"],1.469,522,"xMaxYMin"],"\\cdrightarrow":[["rightarrow"],3,522,"xMaxYMin"],xleftarrow:[["leftarrow"],1.469,522,"xMinYMin"],"\\cdleftarrow":[["leftarrow"],3,522,"xMinYMin"],Overrightarrow:[["doublerightarrow"],.888,560,"xMaxYMin"],xRightarrow:[["doublerightarrow"],1.526,560,"xMaxYMin"],xLeftarrow:[["doubleleftarrow"],1.526,560,"xMinYMin"],overleftharpoon:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoonup:[["leftharpoon"],.888,522,"xMinYMin"],xleftharpoondown:[["leftharpoondown"],.888,522,"xMinYMin"],overrightharpoon:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoonup:[["rightharpoon"],.888,522,"xMaxYMin"],xrightharpoondown:[["rightharpoondown"],.888,522,"xMaxYMin"],xlongequal:[["longequal"],.888,334,"xMinYMin"],"\\cdlongequal":[["longequal"],3,334,"xMinYMin"],xtwoheadleftarrow:[["twoheadleftarrow"],.888,334,"xMinYMin"],xtwoheadrightarrow:[["twoheadrightarrow"],.888,334,"xMaxYMin"],overleftrightarrow:[["leftarrow","rightarrow"],.888,522],overbrace:[["leftbrace","midbrace","rightbrace"],1.6,548],underbrace:[["leftbraceunder","midbraceunder","rightbraceunder"],1.6,548],underleftrightarrow:[["leftarrow","rightarrow"],.888,522],xleftrightarrow:[["leftarrow","rightarrow"],1.75,522],xLeftrightarrow:[["doubleleftarrow","doublerightarrow"],1.75,560],xrightleftharpoons:[["leftharpoondownplus","rightharpoonplus"],1.75,716],xleftrightharpoons:[["leftharpoonplus","rightharpoondownplus"],1.75,716],xhookleftarrow:[["leftarrow","righthook"],1.08,522],xhookrightarrow:[["lefthook","rightarrow"],1.08,522],overlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],underlinesegment:[["leftlinesegment","rightlinesegment"],.888,522],overgroup:[["leftgroup","rightgroup"],.888,342],undergroup:[["leftgroupunder","rightgroupunder"],.888,342],xmapsto:[["leftmapsto","rightarrow"],1.5,522],xtofrom:[["leftToFrom","rightToFrom"],1.75,528],xrightleftarrows:[["baraboveleftarrow","rightarrowabovebar"],1.75,901],xrightequilibrium:[["baraboveshortleftharpoon","rightharpoonaboveshortbar"],1.75,716],xleftequilibrium:[["shortbaraboveleftharpoon","shortrightharpoonabovebar"],1.75,716]},Ft=function(e,t,r,a,n){var i,o=e.height+e.depth+r+a;if(/fbox|color|angl/.test(t)){if(i=Je.makeSpan(["stretchy",t],[],n),"fbox"===t){var s=n.color&&n.getColor();s&&(i.style.borderColor=s)}}else{var l=[];/^[bx]cancel$/.test(t)&&l.push(new te({x1:"0",y1:"0",x2:"100%",y2:"100%","stroke-width":"0.046em"})),/^x?cancel$/.test(t)&&l.push(new te({x1:"0",y1:"100%",x2:"100%",y2:"0","stroke-width":"0.046em"}));var h=new Q(l,{width:"100%",height:G(o)});i=Je.makeSvgSpan([],[h],n)}return i.height=o,i.style.height=G(o),i},Gt=function(e){var t=new Bt.MathNode("mo",[new Bt.TextNode(Vt[e.replace(/^\\/,"")])]);return t.setAttribute("stretchy","true"),t},Ut=function(e,t){var{span:r,minWidth:a,height:n}=function(){var r=4e5,a=e.label.slice(1);if(m.contains(["widehat","widecheck","widetilde","utilde"],a)){var n,i,o,s="ordgroup"===(d=e.base).type?d.body.length:1;if(s>5)"widehat"===a||"widecheck"===a?(n=420,r=2364,o=.42,i=a+"4"):(n=312,r=2340,o=.34,i="tilde4");else{var l=[1,1,2,2,3,3][s];"widehat"===a||"widecheck"===a?(r=[0,1062,2364,2364,2364][l],n=[0,239,300,360,420][l],o=[0,.24,.3,.3,.36,.42][l],i=a+l):(r=[0,600,1033,2339,2340][l],n=[0,260,286,306,312][l],o=[0,.26,.286,.3,.306,.34][l],i="tilde"+l)}var h=new ee(i),c=new Q([h],{width:"100%",height:G(o),viewBox:"0 0 "+r+" "+n,preserveAspectRatio:"none"});return{span:Je.makeSvgSpan([],[c],t),minWidth:0,height:o}}var p,u,d,g=[],f=Pt[a],[v,b,y]=f,x=y/1e3,w=v.length;if(1===w)p=["hide-tail"],u=[f[3]];else if(2===w)p=["halfarrow-left","halfarrow-right"],u=["xMinYMin","xMaxYMin"];else{if(3!==w)throw new Error("Correct katexImagesData or update code here to support\n "+w+" children.");p=["brace-left","brace-center","brace-right"],u=["xMinYMin","xMidYMin","xMaxYMin"]}for(var k=0;k0&&(r.style.minWidth=G(a)),r};function Yt(e,t){if(!e||e.type!==t)throw new Error("Expected node of type "+t+", but got "+(e?"node of type "+e.type:String(e)));return e}function Xt(e){var t=Wt(e);if(!t)throw new Error("Expected node of symbol group type, but got "+(e?"node of type "+e.type:String(e)));return t}function Wt(e){return e&&("atom"===e.type||ne.hasOwnProperty(e.type))?e:null}var _t=(e,t)=>{var r,a,n;e&&"supsub"===e.type?(r=(a=Yt(e.base,"accent")).base,e.base=r,n=function(e){if(e instanceof j)return e;throw new Error("Expected span but got "+String(e)+".")}(kt(e,t)),e.base=a):r=(a=Yt(e,"accent")).base;var i=kt(r,t.havingCrampedStyle()),o=0;if(a.isShifty&&m.isCharacterBox(r)){var s=m.getBaseElem(r);o=re(kt(s,t.havingCrampedStyle())).skew}var l,h="\\c"===a.label,c=h?i.height+i.depth:Math.min(i.height,t.fontMetrics().xHeight);if(a.isStretchy)l=Ut(a,t),l=Je.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:i},{type:"elem",elem:l,wrapperClasses:["svg-align"],wrapperStyle:o>0?{width:"calc(100% - "+G(2*o)+")",marginLeft:G(2*o)}:void 0}]},t);else{var p,u;"\\vec"===a.label?(p=Je.staticSvg("vec",t),u=Je.svgData.vec[1]):((p=re(p=Je.makeOrd({mode:a.mode,text:a.label},t,"textord"))).italic=0,u=p.width,h&&(c+=p.depth)),l=Je.makeSpan(["accent-body"],[p]);var d="\\textcircled"===a.label;d&&(l.classes.push("accent-full"),c=i.height);var g=o;d||(g-=u/2),l.style.left=G(g),"\\textcircled"===a.label&&(l.style.top=".2em"),l=Je.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:i},{type:"kern",size:-c},{type:"elem",elem:l}]},t)}var f=Je.makeSpan(["mord","accent"],[l],t);return n?(n.children[0]=f,n.height=Math.max(f.height,n.height),n.classes[0]="mord",n):f},jt=(e,t)=>{var r=e.isStretchy?Gt(e.label):new Bt.MathNode("mo",[Ct(e.label,e.mode)]),a=new Bt.MathNode("mover",[Ot(e.base,t),r]);return a.setAttribute("accent","true"),a},$t=new RegExp(["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring"].map((e=>"\\"+e)).join("|"));st({type:"accent",names:["\\acute","\\grave","\\ddot","\\tilde","\\bar","\\breve","\\check","\\hat","\\vec","\\dot","\\mathring","\\widecheck","\\widehat","\\widetilde","\\overrightarrow","\\overleftarrow","\\Overrightarrow","\\overleftrightarrow","\\overgroup","\\overlinesegment","\\overleftharpoon","\\overrightharpoon"],props:{numArgs:1},handler:(e,t)=>{var r=ht(t[0]),a=!$t.test(e.funcName),n=!a||"\\widehat"===e.funcName||"\\widetilde"===e.funcName||"\\widecheck"===e.funcName;return{type:"accent",mode:e.parser.mode,label:e.funcName,isStretchy:a,isShifty:n,base:r}},htmlBuilder:_t,mathmlBuilder:jt}),st({type:"accent",names:["\\'","\\`","\\^","\\~","\\=","\\u","\\.",'\\"',"\\c","\\r","\\H","\\v","\\textcircled"],props:{numArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["primitive"]},handler:(e,t)=>{var r=t[0],a=e.parser.mode;return"math"===a&&(e.parser.settings.reportNonstrict("mathVsTextAccents","LaTeX's accent "+e.funcName+" works only in text mode"),a="text"),{type:"accent",mode:a,label:e.funcName,isStretchy:!1,isShifty:!0,base:r}},htmlBuilder:_t,mathmlBuilder:jt}),st({type:"accentUnder",names:["\\underleftarrow","\\underrightarrow","\\underleftrightarrow","\\undergroup","\\underlinesegment","\\utilde"],props:{numArgs:1},handler:(e,t)=>{var{parser:r,funcName:a}=e,n=t[0];return{type:"accentUnder",mode:r.mode,label:a,base:n}},htmlBuilder:(e,t)=>{var r=kt(e.base,t),a=Ut(e,t),n="\\utilde"===e.label?.12:0,i=Je.makeVList({positionType:"top",positionData:r.height,children:[{type:"elem",elem:a,wrapperClasses:["svg-align"]},{type:"kern",size:n},{type:"elem",elem:r}]},t);return Je.makeSpan(["mord","accentunder"],[i],t)},mathmlBuilder:(e,t)=>{var r=Gt(e.label),a=new Bt.MathNode("munder",[Ot(e.base,t),r]);return a.setAttribute("accentunder","true"),a}});var Zt=e=>{var t=new Bt.MathNode("mpadded",e?[e]:[]);return t.setAttribute("width","+0.6em"),t.setAttribute("lspace","0.3em"),t};st({type:"xArrow",names:["\\xleftarrow","\\xrightarrow","\\xLeftarrow","\\xRightarrow","\\xleftrightarrow","\\xLeftrightarrow","\\xhookleftarrow","\\xhookrightarrow","\\xmapsto","\\xrightharpoondown","\\xrightharpoonup","\\xleftharpoondown","\\xleftharpoonup","\\xrightleftharpoons","\\xleftrightharpoons","\\xlongequal","\\xtwoheadrightarrow","\\xtwoheadleftarrow","\\xtofrom","\\xrightleftarrows","\\xrightequilibrium","\\xleftequilibrium","\\\\cdrightarrow","\\\\cdleftarrow","\\\\cdlongequal"],props:{numArgs:1,numOptionalArgs:1},handler(e,t,r){var{parser:a,funcName:n}=e;return{type:"xArrow",mode:a.mode,label:n,body:t[0],below:r[0]}},htmlBuilder(e,t){var r,a=t.style,n=t.havingStyle(a.sup()),i=Je.wrapFragment(kt(e.body,n,t),t),o="\\x"===e.label.slice(0,2)?"x":"cd";i.classes.push(o+"-arrow-pad"),e.below&&(n=t.havingStyle(a.sub()),(r=Je.wrapFragment(kt(e.below,n,t),t)).classes.push(o+"-arrow-pad"));var s,l=Ut(e,t),h=-t.fontMetrics().axisHeight+.5*l.height,m=-t.fontMetrics().axisHeight-.5*l.height-.111;if((i.depth>.25||"\\xleftequilibrium"===e.label)&&(m-=i.depth),r){var c=-t.fontMetrics().axisHeight+r.height+.5*l.height+.111;s=Je.makeVList({positionType:"individualShift",children:[{type:"elem",elem:i,shift:m},{type:"elem",elem:l,shift:h},{type:"elem",elem:r,shift:c}]},t)}else s=Je.makeVList({positionType:"individualShift",children:[{type:"elem",elem:i,shift:m},{type:"elem",elem:l,shift:h}]},t);return s.children[0].children[0].children[1].classes.push("svg-align"),Je.makeSpan(["mrel","x-arrow"],[s],t)},mathmlBuilder(e,t){var r,a=Gt(e.label);if(a.setAttribute("minsize","x"===e.label.charAt(0)?"1.75em":"3.0em"),e.body){var n=Zt(Ot(e.body,t));if(e.below){var i=Zt(Ot(e.below,t));r=new Bt.MathNode("munderover",[a,i,n])}else r=new Bt.MathNode("mover",[a,n])}else if(e.below){var o=Zt(Ot(e.below,t));r=new Bt.MathNode("munder",[a,o])}else r=Zt(),r=new Bt.MathNode("mover",[a,r]);return r}});var Kt=Je.makeSpan;function Jt(e,t){var r=ft(e.body,t,!0);return Kt([e.mclass],r,t)}function Qt(e,t){var r,a=Rt(e.body,t);return"minner"===e.mclass?r=new Bt.MathNode("mpadded",a):"mord"===e.mclass?e.isCharacterBox?(r=a[0]).type="mi":r=new Bt.MathNode("mi",a):(e.isCharacterBox?(r=a[0]).type="mo":r=new Bt.MathNode("mo",a),"mbin"===e.mclass?(r.attributes.lspace="0.22em",r.attributes.rspace="0.22em"):"mpunct"===e.mclass?(r.attributes.lspace="0em",r.attributes.rspace="0.17em"):"mopen"===e.mclass||"mclose"===e.mclass?(r.attributes.lspace="0em",r.attributes.rspace="0em"):"minner"===e.mclass&&(r.attributes.lspace="0.0556em",r.attributes.width="+0.1111em")),r}st({type:"mclass",names:["\\mathord","\\mathbin","\\mathrel","\\mathopen","\\mathclose","\\mathpunct","\\mathinner"],props:{numArgs:1,primitive:!0},handler(e,t){var{parser:r,funcName:a}=e,n=t[0];return{type:"mclass",mode:r.mode,mclass:"m"+a.slice(5),body:mt(n),isCharacterBox:m.isCharacterBox(n)}},htmlBuilder:Jt,mathmlBuilder:Qt});var er=e=>{var t="ordgroup"===e.type&&e.body.length?e.body[0]:e;return"atom"!==t.type||"bin"!==t.family&&"rel"!==t.family?"mord":"m"+t.family};st({type:"mclass",names:["\\@binrel"],props:{numArgs:2},handler(e,t){var{parser:r}=e;return{type:"mclass",mode:r.mode,mclass:er(t[0]),body:mt(t[1]),isCharacterBox:m.isCharacterBox(t[1])}}}),st({type:"mclass",names:["\\stackrel","\\overset","\\underset"],props:{numArgs:2},handler(e,t){var r,{parser:a,funcName:n}=e,i=t[1],o=t[0];r="\\stackrel"!==n?er(i):"mrel";var s={type:"op",mode:i.mode,limits:!0,alwaysHandleSupSub:!0,parentIsSupSub:!1,symbol:!1,suppressBaseShift:"\\stackrel"!==n,body:mt(i)},l={type:"supsub",mode:o.mode,base:s,sup:"\\underset"===n?null:o,sub:"\\underset"===n?o:null};return{type:"mclass",mode:a.mode,mclass:r,body:[l],isCharacterBox:m.isCharacterBox(l)}},htmlBuilder:Jt,mathmlBuilder:Qt}),st({type:"pmb",names:["\\pmb"],props:{numArgs:1,allowedInText:!0},handler(e,t){var{parser:r}=e;return{type:"pmb",mode:r.mode,mclass:er(t[0]),body:mt(t[0])}},htmlBuilder(e,t){var r=ft(e.body,t,!0),a=Je.makeSpan([e.mclass],r,t);return a.style.textShadow="0.02em 0.01em 0.04px",a},mathmlBuilder(e,t){var r=Rt(e.body,t),a=new Bt.MathNode("mstyle",r);return a.setAttribute("style","text-shadow: 0.02em 0.01em 0.04px"),a}});var tr={">":"\\\\cdrightarrow","<":"\\\\cdleftarrow","=":"\\\\cdlongequal",A:"\\uparrow",V:"\\downarrow","|":"\\Vert",".":"no arrow"},rr=e=>"textord"===e.type&&"@"===e.text;function ar(e,t,r){var a=tr[e];switch(a){case"\\\\cdrightarrow":case"\\\\cdleftarrow":return r.callFunction(a,[t[0]],[t[1]]);case"\\uparrow":case"\\downarrow":var n={type:"atom",text:a,mode:"math",family:"rel"},i={type:"ordgroup",mode:"math",body:[r.callFunction("\\\\cdleft",[t[0]],[]),r.callFunction("\\Big",[n],[]),r.callFunction("\\\\cdright",[t[1]],[])]};return r.callFunction("\\\\cdparent",[i],[]);case"\\\\cdlongequal":return r.callFunction("\\\\cdlongequal",[],[]);case"\\Vert":return r.callFunction("\\Big",[{type:"textord",text:"\\Vert",mode:"math"}],[]);default:return{type:"textord",text:" ",mode:"math"}}}st({type:"cdlabel",names:["\\\\cdleft","\\\\cdright"],props:{numArgs:1},handler(e,t){var{parser:r,funcName:a}=e;return{type:"cdlabel",mode:r.mode,side:a.slice(4),label:t[0]}},htmlBuilder(e,t){var r=t.havingStyle(t.style.sup()),a=Je.wrapFragment(kt(e.label,r,t),t);return a.classes.push("cd-label-"+e.side),a.style.bottom=G(.8-a.depth),a.height=0,a.depth=0,a},mathmlBuilder(e,t){var r=new Bt.MathNode("mrow",[Ot(e.label,t)]);return(r=new Bt.MathNode("mpadded",[r])).setAttribute("width","0"),"left"===e.side&&r.setAttribute("lspace","-1width"),r.setAttribute("voffset","0.7em"),(r=new Bt.MathNode("mstyle",[r])).setAttribute("displaystyle","false"),r.setAttribute("scriptlevel","1"),r}}),st({type:"cdlabelparent",names:["\\\\cdparent"],props:{numArgs:1},handler(e,t){var{parser:r}=e;return{type:"cdlabelparent",mode:r.mode,fragment:t[0]}},htmlBuilder(e,t){var r=Je.wrapFragment(kt(e.fragment,t),t);return r.classes.push("cd-vert-arrow"),r},mathmlBuilder:(e,t)=>new Bt.MathNode("mrow",[Ot(e.fragment,t)])}),st({type:"textord",names:["\\@char"],props:{numArgs:1,allowedInText:!0},handler(e,t){for(var{parser:r}=e,a=Yt(t[0],"ordgroup").body,n="",o=0;o=1114111)throw new i("\\@char with invalid code point "+n);return l<=65535?s=String.fromCharCode(l):(l-=65536,s=String.fromCharCode(55296+(l>>10),56320+(1023&l))),{type:"textord",mode:r.mode,text:s}}});var nr=(e,t)=>{var r=ft(e.body,t.withColor(e.color),!1);return Je.makeFragment(r)},ir=(e,t)=>{var r=Rt(e.body,t.withColor(e.color)),a=new Bt.MathNode("mstyle",r);return a.setAttribute("mathcolor",e.color),a};st({type:"color",names:["\\textcolor"],props:{numArgs:2,allowedInText:!0,argTypes:["color","original"]},handler(e,t){var{parser:r}=e,a=Yt(t[0],"color-token").color,n=t[1];return{type:"color",mode:r.mode,color:a,body:mt(n)}},htmlBuilder:nr,mathmlBuilder:ir}),st({type:"color",names:["\\color"],props:{numArgs:1,allowedInText:!0,argTypes:["color"]},handler(e,t){var{parser:r,breakOnTokenText:a}=e,n=Yt(t[0],"color-token").color;r.gullet.macros.set("\\current@color",n);var i=r.parseExpression(!0,a);return{type:"color",mode:r.mode,color:n,body:i}},htmlBuilder:nr,mathmlBuilder:ir}),st({type:"cr",names:["\\\\"],props:{numArgs:0,numOptionalArgs:0,allowedInText:!0},handler(e,t,r){var{parser:a}=e,n="["===a.gullet.future().text?a.parseSizeGroup(!0):null,i=!a.settings.displayMode||!a.settings.useStrictBehavior("newLineInDisplayMode","In LaTeX, \\\\ or \\newline does nothing in display mode");return{type:"cr",mode:a.mode,newLine:i,size:n&&Yt(n,"size").value}},htmlBuilder(e,t){var r=Je.makeSpan(["mspace"],[],t);return e.newLine&&(r.classes.push("newline"),e.size&&(r.style.marginTop=G(F(e.size,t)))),r},mathmlBuilder(e,t){var r=new Bt.MathNode("mspace");return e.newLine&&(r.setAttribute("linebreak","newline"),e.size&&r.setAttribute("height",G(F(e.size,t)))),r}});var or={"\\global":"\\global","\\long":"\\\\globallong","\\\\globallong":"\\\\globallong","\\def":"\\gdef","\\gdef":"\\gdef","\\edef":"\\xdef","\\xdef":"\\xdef","\\let":"\\\\globallet","\\futurelet":"\\\\globalfuture"},sr=e=>{var t=e.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(t))throw new i("Expected a control sequence",e);return t},lr=(e,t,r,a)=>{var n=e.gullet.macros.get(r.text);null==n&&(r.noexpand=!0,n={tokens:[r],numArgs:0,unexpandable:!e.gullet.isExpandable(r.text)}),e.gullet.macros.set(t,n,a)};st({type:"internal",names:["\\global","\\long","\\\\globallong"],props:{numArgs:0,allowedInText:!0},handler(e){var{parser:t,funcName:r}=e;t.consumeSpaces();var a=t.fetch();if(or[a.text])return"\\global"!==r&&"\\\\globallong"!==r||(a.text=or[a.text]),Yt(t.parseFunction(),"internal");throw new i("Invalid token after macro prefix",a)}}),st({type:"internal",names:["\\def","\\gdef","\\edef","\\xdef"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(e){var{parser:t,funcName:r}=e,a=t.gullet.popToken(),n=a.text;if(/^(?:[\\{}$&#^_]|EOF)$/.test(n))throw new i("Expected a control sequence",a);for(var o,s=0,l=[[]];"{"!==t.gullet.future().text;)if("#"===(a=t.gullet.popToken()).text){if("{"===t.gullet.future().text){o=t.gullet.future(),l[s].push("{");break}if(a=t.gullet.popToken(),!/^[1-9]$/.test(a.text))throw new i('Invalid argument number "'+a.text+'"');if(parseInt(a.text)!==s+1)throw new i('Argument number "'+a.text+'" out of order');s++,l.push([])}else{if("EOF"===a.text)throw new i("Expected a macro definition");l[s].push(a.text)}var{tokens:h}=t.gullet.consumeArg();return o&&h.unshift(o),"\\edef"!==r&&"\\xdef"!==r||(h=t.gullet.expandTokens(h)).reverse(),t.gullet.macros.set(n,{tokens:h,numArgs:s,delimiters:l},r===or[r]),{type:"internal",mode:t.mode}}}),st({type:"internal",names:["\\let","\\\\globallet"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(e){var{parser:t,funcName:r}=e,a=sr(t.gullet.popToken());t.gullet.consumeSpaces();var n=(e=>{var t=e.gullet.popToken();return"="===t.text&&" "===(t=e.gullet.popToken()).text&&(t=e.gullet.popToken()),t})(t);return lr(t,a,n,"\\\\globallet"===r),{type:"internal",mode:t.mode}}}),st({type:"internal",names:["\\futurelet","\\\\globalfuture"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(e){var{parser:t,funcName:r}=e,a=sr(t.gullet.popToken()),n=t.gullet.popToken(),i=t.gullet.popToken();return lr(t,a,i,"\\\\globalfuture"===r),t.gullet.pushToken(i),t.gullet.pushToken(n),{type:"internal",mode:t.mode}}});var hr=function(e,t,r){var a=I(ie.math[e]&&ie.math[e].replace||e,t,r);if(!a)throw new Error("Unsupported symbol "+e+" and font size "+t+".");return a},mr=function(e,t,r,a){var n=r.havingBaseStyle(t),i=Je.makeSpan(a.concat(n.sizingClasses(r)),[e],r),o=n.sizeMultiplier/r.sizeMultiplier;return i.height*=o,i.depth*=o,i.maxFontSize=n.sizeMultiplier,i},cr=function(e,t,r){var a=t.havingBaseStyle(r),n=(1-t.sizeMultiplier/a.sizeMultiplier)*t.fontMetrics().axisHeight;e.classes.push("delimcenter"),e.style.top=G(n),e.height-=n,e.depth+=n},pr=function(e,t,r,a,n,i){var o=function(e,t,r,a){return Je.makeSymbol(e,"Size"+t+"-Regular",r,a)}(e,t,n,a),s=mr(Je.makeSpan(["delimsizing","size"+t],[o],a),k.TEXT,a,i);return r&&cr(s,a,k.TEXT),s},ur=function(e,t,r){var a;return a="Size1-Regular"===t?"delim-size1":"delim-size4",{type:"elem",elem:Je.makeSpan(["delimsizinginner",a],[Je.makeSpan([],[Je.makeSymbol(e,t,r)])])}},dr=function(e,t,r){var a=C["Size4-Regular"][e.charCodeAt(0)]?C["Size4-Regular"][e.charCodeAt(0)][4]:C["Size1-Regular"][e.charCodeAt(0)][4],n=new ee("inner",function(e,t){switch(e){case"\u239c":return"M291 0 H417 V"+t+" H291z M291 0 H417 V"+t+" H291z";case"\u2223":return"M145 0 H188 V"+t+" H145z M145 0 H188 V"+t+" H145z";case"\u2225":return"M145 0 H188 V"+t+" H145z M145 0 H188 V"+t+" H145zM367 0 H410 V"+t+" H367z M367 0 H410 V"+t+" H367z";case"\u239f":return"M457 0 H583 V"+t+" H457z M457 0 H583 V"+t+" H457z";case"\u23a2":return"M319 0 H403 V"+t+" H319z M319 0 H403 V"+t+" H319z";case"\u23a5":return"M263 0 H347 V"+t+" H263z M263 0 H347 V"+t+" H263z";case"\u23aa":return"M384 0 H504 V"+t+" H384z M384 0 H504 V"+t+" H384z";case"\u23d0":return"M312 0 H355 V"+t+" H312z M312 0 H355 V"+t+" H312z";case"\u2016":return"M257 0 H300 V"+t+" H257z M257 0 H300 V"+t+" H257zM478 0 H521 V"+t+" H478z M478 0 H521 V"+t+" H478z";default:return""}}(e,Math.round(1e3*t))),i=new Q([n],{width:G(a),height:G(t),style:"width:"+G(a),viewBox:"0 0 "+1e3*a+" "+Math.round(1e3*t),preserveAspectRatio:"xMinYMin"}),o=Je.makeSvgSpan([],[i],r);return o.height=t,o.style.height=G(t),o.style.width=G(a),{type:"elem",elem:o}},gr={type:"kern",size:-.008},fr=["|","\\lvert","\\rvert","\\vert"],vr=["\\|","\\lVert","\\rVert","\\Vert"],br=function(e,t,r,a,n,i){var o,s,l,h,c="",p=0;o=l=h=e,s=null;var u="Size1-Regular";"\\uparrow"===e?l=h="\u23d0":"\\Uparrow"===e?l=h="\u2016":"\\downarrow"===e?o=l="\u23d0":"\\Downarrow"===e?o=l="\u2016":"\\updownarrow"===e?(o="\\uparrow",l="\u23d0",h="\\downarrow"):"\\Updownarrow"===e?(o="\\Uparrow",l="\u2016",h="\\Downarrow"):m.contains(fr,e)?(l="\u2223",c="vert",p=333):m.contains(vr,e)?(l="\u2225",c="doublevert",p=556):"["===e||"\\lbrack"===e?(o="\u23a1",l="\u23a2",h="\u23a3",u="Size4-Regular",c="lbrack",p=667):"]"===e||"\\rbrack"===e?(o="\u23a4",l="\u23a5",h="\u23a6",u="Size4-Regular",c="rbrack",p=667):"\\lfloor"===e||"\u230a"===e?(l=o="\u23a2",h="\u23a3",u="Size4-Regular",c="lfloor",p=667):"\\lceil"===e||"\u2308"===e?(o="\u23a1",l=h="\u23a2",u="Size4-Regular",c="lceil",p=667):"\\rfloor"===e||"\u230b"===e?(l=o="\u23a5",h="\u23a6",u="Size4-Regular",c="rfloor",p=667):"\\rceil"===e||"\u2309"===e?(o="\u23a4",l=h="\u23a5",u="Size4-Regular",c="rceil",p=667):"("===e||"\\lparen"===e?(o="\u239b",l="\u239c",h="\u239d",u="Size4-Regular",c="lparen",p=875):")"===e||"\\rparen"===e?(o="\u239e",l="\u239f",h="\u23a0",u="Size4-Regular",c="rparen",p=875):"\\{"===e||"\\lbrace"===e?(o="\u23a7",s="\u23a8",h="\u23a9",l="\u23aa",u="Size4-Regular"):"\\}"===e||"\\rbrace"===e?(o="\u23ab",s="\u23ac",h="\u23ad",l="\u23aa",u="Size4-Regular"):"\\lgroup"===e||"\u27ee"===e?(o="\u23a7",h="\u23a9",l="\u23aa",u="Size4-Regular"):"\\rgroup"===e||"\u27ef"===e?(o="\u23ab",h="\u23ad",l="\u23aa",u="Size4-Regular"):"\\lmoustache"===e||"\u23b0"===e?(o="\u23a7",h="\u23ad",l="\u23aa",u="Size4-Regular"):"\\rmoustache"!==e&&"\u23b1"!==e||(o="\u23ab",h="\u23a9",l="\u23aa",u="Size4-Regular");var d=hr(o,u,n),g=d.height+d.depth,f=hr(l,u,n),v=f.height+f.depth,b=hr(h,u,n),y=b.height+b.depth,x=0,w=1;if(null!==s){var S=hr(s,u,n);x=S.height+S.depth,w=2}var M=g+y+x,z=M+Math.max(0,Math.ceil((t-M)/(w*v)))*w*v,A=a.fontMetrics().axisHeight;r&&(A*=a.sizeMultiplier);var T=z/2-A,B=[];if(c.length>0){var C=z-g-y,N=Math.round(1e3*z),q=function(e,t){switch(e){case"lbrack":return"M403 1759 V84 H666 V0 H319 V1759 v"+t+" v1759 h347 v-84\nH403z M403 1759 V0 H319 V1759 v"+t+" v1759 h84z";case"rbrack":return"M347 1759 V0 H0 V84 H263 V1759 v"+t+" v1759 H0 v84 H347z\nM347 1759 V0 H263 V1759 v"+t+" v1759 h84z";case"vert":return"M145 15 v585 v"+t+" v585 c2.667,10,9.667,15,21,15\nc10,0,16.667,-5,20,-15 v-585 v"+-t+" v-585 c-2.667,-10,-9.667,-15,-21,-15\nc-10,0,-16.667,5,-20,15z M188 15 H145 v585 v"+t+" v585 h43z";case"doublevert":return"M145 15 v585 v"+t+" v585 c2.667,10,9.667,15,21,15\nc10,0,16.667,-5,20,-15 v-585 v"+-t+" v-585 c-2.667,-10,-9.667,-15,-21,-15\nc-10,0,-16.667,5,-20,15z M188 15 H145 v585 v"+t+" v585 h43z\nM367 15 v585 v"+t+" v585 c2.667,10,9.667,15,21,15\nc10,0,16.667,-5,20,-15 v-585 v"+-t+" v-585 c-2.667,-10,-9.667,-15,-21,-15\nc-10,0,-16.667,5,-20,15z M410 15 H367 v585 v"+t+" v585 h43z";case"lfloor":return"M319 602 V0 H403 V602 v"+t+" v1715 h263 v84 H319z\nMM319 602 V0 H403 V602 v"+t+" v1715 H319z";case"rfloor":return"M319 602 V0 H403 V602 v"+t+" v1799 H0 v-84 H319z\nMM319 602 V0 H403 V602 v"+t+" v1715 H319z";case"lceil":return"M403 1759 V84 H666 V0 H319 V1759 v"+t+" v602 h84z\nM403 1759 V0 H319 V1759 v"+t+" v602 h84z";case"rceil":return"M347 1759 V0 H0 V84 H263 V1759 v"+t+" v602 h84z\nM347 1759 V0 h-84 V1759 v"+t+" v602 h84z";case"lparen":return"M863,9c0,-2,-2,-5,-6,-9c0,0,-17,0,-17,0c-12.7,0,-19.3,0.3,-20,1\nc-5.3,5.3,-10.3,11,-15,17c-242.7,294.7,-395.3,682,-458,1162c-21.3,163.3,-33.3,349,\n-36,557 l0,"+(t+84)+"c0.2,6,0,26,0,60c2,159.3,10,310.7,24,454c53.3,528,210,\n949.7,470,1265c4.7,6,9.7,11.7,15,17c0.7,0.7,7,1,19,1c0,0,18,0,18,0c4,-4,6,-7,6,-9\nc0,-2.7,-3.3,-8.7,-10,-18c-135.3,-192.7,-235.5,-414.3,-300.5,-665c-65,-250.7,-102.5,\n-544.7,-112.5,-882c-2,-104,-3,-167,-3,-189\nl0,-"+(t+92)+"c0,-162.7,5.7,-314,17,-454c20.7,-272,63.7,-513,129,-723c65.3,\n-210,155.3,-396.3,270,-559c6.7,-9.3,10,-15.3,10,-18z";case"rparen":return"M76,0c-16.7,0,-25,3,-25,9c0,2,2,6.3,6,13c21.3,28.7,42.3,60.3,\n63,95c96.7,156.7,172.8,332.5,228.5,527.5c55.7,195,92.8,416.5,111.5,664.5\nc11.3,139.3,17,290.7,17,454c0,28,1.7,43,3.3,45l0,"+(t+9)+"\nc-3,4,-3.3,16.7,-3.3,38c0,162,-5.7,313.7,-17,455c-18.7,248,-55.8,469.3,-111.5,664\nc-55.7,194.7,-131.8,370.3,-228.5,527c-20.7,34.7,-41.7,66.3,-63,95c-2,3.3,-4,7,-6,11\nc0,7.3,5.7,11,17,11c0,0,11,0,11,0c9.3,0,14.3,-0.3,15,-1c5.3,-5.3,10.3,-11,15,-17\nc242.7,-294.7,395.3,-681.7,458,-1161c21.3,-164.7,33.3,-350.7,36,-558\nl0,-"+(t+144)+"c-2,-159.3,-10,-310.7,-24,-454c-53.3,-528,-210,-949.7,\n-470,-1265c-4.7,-6,-9.7,-11.7,-15,-17c-0.7,-0.7,-6.7,-1,-18,-1z";default:throw new Error("Unknown stretchy delimiter.")}}(c,Math.round(1e3*C)),I=new ee(c,q),R=(p/1e3).toFixed(3)+"em",H=(N/1e3).toFixed(3)+"em",O=new Q([I],{width:R,height:H,viewBox:"0 0 "+p+" "+N}),E=Je.makeSvgSpan([],[O],a);E.height=N/1e3,E.style.width=R,E.style.height=H,B.push({type:"elem",elem:E})}else{if(B.push(ur(h,u,n)),B.push(gr),null===s){var L=z-g-y+.016;B.push(dr(l,L,a))}else{var D=(z-g-y-x)/2+.016;B.push(dr(l,D,a)),B.push(gr),B.push(ur(s,u,n)),B.push(gr),B.push(dr(l,D,a))}B.push(gr),B.push(ur(o,u,n))}var V=a.havingBaseStyle(k.TEXT),P=Je.makeVList({positionType:"bottom",positionData:T,children:B},V);return mr(Je.makeSpan(["delimsizing","mult"],[P],V),k.TEXT,a,i)},yr=.08,xr=function(e,t,r,a,n){var i=function(e,t,r){t*=1e3;var a="";switch(e){case"sqrtMain":a=function(e,t){return"M95,"+(622+e+t)+"\nc-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14\nc0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54\nc44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10\ns173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429\nc69,-144,104.5,-217.7,106.5,-221\nl"+e/2.075+" -"+e+"\nc5.3,-9.3,12,-14,20,-14\nH400000v"+(40+e)+"H845.2724\ns-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7\nc-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z\nM"+(834+e)+" "+t+"h400000v"+(40+e)+"h-400000z"}(t,A);break;case"sqrtSize1":a=function(e,t){return"M263,"+(601+e+t)+"c0.7,0,18,39.7,52,119\nc34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120\nc340,-704.7,510.7,-1060.3,512,-1067\nl"+e/2.084+" -"+e+"\nc4.7,-7.3,11,-11,19,-11\nH40000v"+(40+e)+"H1012.3\ns-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232\nc-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1\ns-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26\nc-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z\nM"+(1001+e)+" "+t+"h400000v"+(40+e)+"h-400000z"}(t,A);break;case"sqrtSize2":a=function(e,t){return"M983 "+(10+e+t)+"\nl"+e/3.13+" -"+e+"\nc4,-6.7,10,-10,18,-10 H400000v"+(40+e)+"\nH1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7\ns-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744\nc-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30\nc26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722\nc56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5\nc53.7,-170.3,84.5,-266.8,92.5,-289.5z\nM"+(1001+e)+" "+t+"h400000v"+(40+e)+"h-400000z"}(t,A);break;case"sqrtSize3":a=function(e,t){return"M424,"+(2398+e+t)+"\nc-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514\nc0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20\ns-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121\ns209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081\nl"+e/4.223+" -"+e+"c4,-6.7,10,-10,18,-10 H400000\nv"+(40+e)+"H1014.6\ns-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185\nc-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2z M"+(1001+e)+" "+t+"\nh400000v"+(40+e)+"h-400000z"}(t,A);break;case"sqrtSize4":a=function(e,t){return"M473,"+(2713+e+t)+"\nc339.3,-1799.3,509.3,-2700,510,-2702 l"+e/5.298+" -"+e+"\nc3.3,-7.3,9.3,-11,18,-11 H400000v"+(40+e)+"H1017.7\ns-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9\nc-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200\nc0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26\ns76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104,\n606zM"+(1001+e)+" "+t+"h400000v"+(40+e)+"H1017.7z"}(t,A);break;case"sqrtTall":a=function(e,t,r){return"M702 "+(e+t)+"H400000"+(40+e)+"\nH742v"+(r-54-t-e)+"l-4 4-4 4c-.667.7 -2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1\nh-12l-28-84c-16.667-52-96.667 -294.333-240-727l-212 -643 -85 170\nc-4-3.333-8.333-7.667-13 -13l-13-13l77-155 77-156c66 199.333 139 419.667\n219 661 l218 661zM702 "+t+"H400000v"+(40+e)+"H742z"}(t,A,r)}return a}(e,a,r),o=new ee(e,i),s=new Q([o],{width:"400em",height:G(t),viewBox:"0 0 400000 "+r,preserveAspectRatio:"xMinYMin slice"});return Je.makeSvgSpan(["hide-tail"],[s],n)},wr=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230a","\u230b","\\lceil","\\rceil","\u2308","\u2309","\\surd"],kr=["\\uparrow","\\downarrow","\\updownarrow","\\Uparrow","\\Downarrow","\\Updownarrow","|","\\|","\\vert","\\Vert","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27ee","\u27ef","\\lmoustache","\\rmoustache","\u23b0","\u23b1"],Sr=["<",">","\\langle","\\rangle","/","\\backslash","\\lt","\\gt"],Mr=[0,1.2,1.8,2.4,3],zr=[{type:"small",style:k.SCRIPTSCRIPT},{type:"small",style:k.SCRIPT},{type:"small",style:k.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4}],Ar=[{type:"small",style:k.SCRIPTSCRIPT},{type:"small",style:k.SCRIPT},{type:"small",style:k.TEXT},{type:"stack"}],Tr=[{type:"small",style:k.SCRIPTSCRIPT},{type:"small",style:k.SCRIPT},{type:"small",style:k.TEXT},{type:"large",size:1},{type:"large",size:2},{type:"large",size:3},{type:"large",size:4},{type:"stack"}],Br=function(e){if("small"===e.type)return"Main-Regular";if("large"===e.type)return"Size"+e.size+"-Regular";if("stack"===e.type)return"Size4-Regular";throw new Error("Add support for delim type '"+e.type+"' here.")},Cr=function(e,t,r,a){for(var n=Math.min(2,3-a.style.size);nt)return r[n]}return r[r.length-1]},Nr=function(e,t,r,a,n,i){var o;"<"===e||"\\lt"===e||"\u27e8"===e?e="\\langle":">"!==e&&"\\gt"!==e&&"\u27e9"!==e||(e="\\rangle"),o=m.contains(Sr,e)?zr:m.contains(wr,e)?Tr:Ar;var s=Cr(e,t,o,a);return"small"===s.type?function(e,t,r,a,n,i){var o=Je.makeSymbol(e,"Main-Regular",n,a),s=mr(o,t,a,i);return r&&cr(s,a,t),s}(e,s.style,r,a,n,i):"large"===s.type?pr(e,s.size,r,a,n,i):br(e,t,r,a,n,i)},qr={sqrtImage:function(e,t){var r,a,n=t.havingBaseSizing(),i=Cr("\\surd",e*n.sizeMultiplier,Tr,n),o=n.sizeMultiplier,s=Math.max(0,t.minRuleThickness-t.fontMetrics().sqrtRuleThickness),l=0,h=0,m=0;return"small"===i.type?(e<1?o=1:e<1.4&&(o=.7),h=(1+s)/o,(r=xr("sqrtMain",l=(1+s+yr)/o,m=1e3+1e3*s+80,s,t)).style.minWidth="0.853em",a=.833/o):"large"===i.type?(m=1080*Mr[i.size],h=(Mr[i.size]+s)/o,l=(Mr[i.size]+s+yr)/o,(r=xr("sqrtSize"+i.size,l,m,s,t)).style.minWidth="1.02em",a=1/o):(l=e+s+yr,h=e+s,m=Math.floor(1e3*e+s)+80,(r=xr("sqrtTall",l,m,s,t)).style.minWidth="0.742em",a=1.056),r.height=h,r.style.height=G(l),{span:r,advanceWidth:a,ruleWidth:(t.fontMetrics().sqrtRuleThickness+s)*o}},sizedDelim:function(e,t,r,a,n){if("<"===e||"\\lt"===e||"\u27e8"===e?e="\\langle":">"!==e&&"\\gt"!==e&&"\u27e9"!==e||(e="\\rangle"),m.contains(wr,e)||m.contains(Sr,e))return pr(e,t,!1,r,a,n);if(m.contains(kr,e))return br(e,Mr[t],!1,r,a,n);throw new i("Illegal delimiter: '"+e+"'")},sizeToMaxHeight:Mr,customSizedDelim:Nr,leftRightDelim:function(e,t,r,a,n,i){var o=a.fontMetrics().axisHeight*a.sizeMultiplier,s=5/a.fontMetrics().ptPerEm,l=Math.max(t-o,r+o),h=Math.max(l/500*901,2*l-s);return Nr(e,h,!0,a,n,i)}},Ir={"\\bigl":{mclass:"mopen",size:1},"\\Bigl":{mclass:"mopen",size:2},"\\biggl":{mclass:"mopen",size:3},"\\Biggl":{mclass:"mopen",size:4},"\\bigr":{mclass:"mclose",size:1},"\\Bigr":{mclass:"mclose",size:2},"\\biggr":{mclass:"mclose",size:3},"\\Biggr":{mclass:"mclose",size:4},"\\bigm":{mclass:"mrel",size:1},"\\Bigm":{mclass:"mrel",size:2},"\\biggm":{mclass:"mrel",size:3},"\\Biggm":{mclass:"mrel",size:4},"\\big":{mclass:"mord",size:1},"\\Big":{mclass:"mord",size:2},"\\bigg":{mclass:"mord",size:3},"\\Bigg":{mclass:"mord",size:4}},Rr=["(","\\lparen",")","\\rparen","[","\\lbrack","]","\\rbrack","\\{","\\lbrace","\\}","\\rbrace","\\lfloor","\\rfloor","\u230a","\u230b","\\lceil","\\rceil","\u2308","\u2309","<",">","\\langle","\u27e8","\\rangle","\u27e9","\\lt","\\gt","\\lvert","\\rvert","\\lVert","\\rVert","\\lgroup","\\rgroup","\u27ee","\u27ef","\\lmoustache","\\rmoustache","\u23b0","\u23b1","/","\\backslash","|","\\vert","\\|","\\Vert","\\uparrow","\\Uparrow","\\downarrow","\\Downarrow","\\updownarrow","\\Updownarrow","."];function Hr(e,t){var r=Wt(e);if(r&&m.contains(Rr,r.text))return r;throw new i(r?"Invalid delimiter '"+r.text+"' after '"+t.funcName+"'":"Invalid delimiter type '"+e.type+"'",e)}function Or(e){if(!e.body)throw new Error("Bug: The leftright ParseNode wasn't fully parsed.")}st({type:"delimsizing",names:["\\bigl","\\Bigl","\\biggl","\\Biggl","\\bigr","\\Bigr","\\biggr","\\Biggr","\\bigm","\\Bigm","\\biggm","\\Biggm","\\big","\\Big","\\bigg","\\Bigg"],props:{numArgs:1,argTypes:["primitive"]},handler:(e,t)=>{var r=Hr(t[0],e);return{type:"delimsizing",mode:e.parser.mode,size:Ir[e.funcName].size,mclass:Ir[e.funcName].mclass,delim:r.text}},htmlBuilder:(e,t)=>"."===e.delim?Je.makeSpan([e.mclass]):qr.sizedDelim(e.delim,e.size,t,e.mode,[e.mclass]),mathmlBuilder:e=>{var t=[];"."!==e.delim&&t.push(Ct(e.delim,e.mode));var r=new Bt.MathNode("mo",t);"mopen"===e.mclass||"mclose"===e.mclass?r.setAttribute("fence","true"):r.setAttribute("fence","false"),r.setAttribute("stretchy","true");var a=G(qr.sizeToMaxHeight[e.size]);return r.setAttribute("minsize",a),r.setAttribute("maxsize",a),r}}),st({type:"leftright-right",names:["\\right"],props:{numArgs:1,primitive:!0},handler:(e,t)=>{var r=e.parser.gullet.macros.get("\\current@color");if(r&&"string"!==typeof r)throw new i("\\current@color set to non-string in \\right");return{type:"leftright-right",mode:e.parser.mode,delim:Hr(t[0],e).text,color:r}}}),st({type:"leftright",names:["\\left"],props:{numArgs:1,primitive:!0},handler:(e,t)=>{var r=Hr(t[0],e),a=e.parser;++a.leftrightDepth;var n=a.parseExpression(!1);--a.leftrightDepth,a.expect("\\right",!1);var i=Yt(a.parseFunction(),"leftright-right");return{type:"leftright",mode:a.mode,body:n,left:r.text,right:i.delim,rightColor:i.color}},htmlBuilder:(e,t)=>{Or(e);for(var r,a,n=ft(e.body,t,!0,["mopen","mclose"]),i=0,o=0,s=!1,l=0;l{Or(e);var r=Rt(e.body,t);if("."!==e.left){var a=new Bt.MathNode("mo",[Ct(e.left,e.mode)]);a.setAttribute("fence","true"),r.unshift(a)}if("."!==e.right){var n=new Bt.MathNode("mo",[Ct(e.right,e.mode)]);n.setAttribute("fence","true"),e.rightColor&&n.setAttribute("mathcolor",e.rightColor),r.push(n)}return Nt(r)}}),st({type:"middle",names:["\\middle"],props:{numArgs:1,primitive:!0},handler:(e,t)=>{var r=Hr(t[0],e);if(!e.parser.leftrightDepth)throw new i("\\middle without preceding \\left",r);return{type:"middle",mode:e.parser.mode,delim:r.text}},htmlBuilder:(e,t)=>{var r;if("."===e.delim)r=wt(t,[]);else{r=qr.sizedDelim(e.delim,1,t,e.mode,[]);var a={delim:e.delim,options:t};r.isMiddle=a}return r},mathmlBuilder:(e,t)=>{var r="\\vert"===e.delim||"|"===e.delim?Ct("|","text"):Ct(e.delim,e.mode),a=new Bt.MathNode("mo",[r]);return a.setAttribute("fence","true"),a.setAttribute("lspace","0.05em"),a.setAttribute("rspace","0.05em"),a}});var Er=(e,t)=>{var r,a,n,i=Je.wrapFragment(kt(e.body,t),t),o=e.label.slice(1),s=t.sizeMultiplier,l=0,h=m.isCharacterBox(e.body);if("sout"===o)(r=Je.makeSpan(["stretchy","sout"])).height=t.fontMetrics().defaultRuleThickness/s,l=-.5*t.fontMetrics().xHeight;else if("phase"===o){var c=F({number:.6,unit:"pt"},t),p=F({number:.35,unit:"ex"},t);s/=t.havingBaseSizing().sizeMultiplier;var u=i.height+i.depth+c+p;i.style.paddingLeft=G(u/2+c);var d=Math.floor(1e3*u*s),g="M400000 "+(a=d)+" H0 L"+a/2+" 0 l65 45 L145 "+(a-80)+" H400000z",f=new Q([new ee("phase",g)],{width:"400em",height:G(d/1e3),viewBox:"0 0 400000 "+d,preserveAspectRatio:"xMinYMin slice"});(r=Je.makeSvgSpan(["hide-tail"],[f],t)).style.height=G(u),l=i.depth+c+p}else{/cancel/.test(o)?h||i.classes.push("cancel-pad"):"angl"===o?i.classes.push("anglpad"):i.classes.push("boxpad");var v=0,b=0,y=0;/box/.test(o)?(y=Math.max(t.fontMetrics().fboxrule,t.minRuleThickness),b=v=t.fontMetrics().fboxsep+("colorbox"===o?0:y)):"angl"===o?(v=4*(y=Math.max(t.fontMetrics().defaultRuleThickness,t.minRuleThickness)),b=Math.max(0,.25-i.depth)):b=v=h?.2:0,r=Ft(i,o,v,b,t),/fbox|boxed|fcolorbox/.test(o)?(r.style.borderStyle="solid",r.style.borderWidth=G(y)):"angl"===o&&.049!==y&&(r.style.borderTopWidth=G(y),r.style.borderRightWidth=G(y)),l=i.depth+b,e.backgroundColor&&(r.style.backgroundColor=e.backgroundColor,e.borderColor&&(r.style.borderColor=e.borderColor))}if(e.backgroundColor)n=Je.makeVList({positionType:"individualShift",children:[{type:"elem",elem:r,shift:l},{type:"elem",elem:i,shift:0}]},t);else{var x=/cancel|phase/.test(o)?["svg-align"]:[];n=Je.makeVList({positionType:"individualShift",children:[{type:"elem",elem:i,shift:0},{type:"elem",elem:r,shift:l,wrapperClasses:x}]},t)}return/cancel/.test(o)&&(n.height=i.height,n.depth=i.depth),/cancel/.test(o)&&!h?Je.makeSpan(["mord","cancel-lap"],[n],t):Je.makeSpan(["mord"],[n],t)},Lr=(e,t)=>{var r=0,a=new Bt.MathNode(e.label.indexOf("colorbox")>-1?"mpadded":"menclose",[Ot(e.body,t)]);switch(e.label){case"\\cancel":a.setAttribute("notation","updiagonalstrike");break;case"\\bcancel":a.setAttribute("notation","downdiagonalstrike");break;case"\\phase":a.setAttribute("notation","phasorangle");break;case"\\sout":a.setAttribute("notation","horizontalstrike");break;case"\\fbox":a.setAttribute("notation","box");break;case"\\angl":a.setAttribute("notation","actuarial");break;case"\\fcolorbox":case"\\colorbox":if(r=t.fontMetrics().fboxsep*t.fontMetrics().ptPerEm,a.setAttribute("width","+"+2*r+"pt"),a.setAttribute("height","+"+2*r+"pt"),a.setAttribute("lspace",r+"pt"),a.setAttribute("voffset",r+"pt"),"\\fcolorbox"===e.label){var n=Math.max(t.fontMetrics().fboxrule,t.minRuleThickness);a.setAttribute("style","border: "+n+"em solid "+String(e.borderColor))}break;case"\\xcancel":a.setAttribute("notation","updiagonalstrike downdiagonalstrike")}return e.backgroundColor&&a.setAttribute("mathbackground",e.backgroundColor),a};st({type:"enclose",names:["\\colorbox"],props:{numArgs:2,allowedInText:!0,argTypes:["color","text"]},handler(e,t,r){var{parser:a,funcName:n}=e,i=Yt(t[0],"color-token").color,o=t[1];return{type:"enclose",mode:a.mode,label:n,backgroundColor:i,body:o}},htmlBuilder:Er,mathmlBuilder:Lr}),st({type:"enclose",names:["\\fcolorbox"],props:{numArgs:3,allowedInText:!0,argTypes:["color","color","text"]},handler(e,t,r){var{parser:a,funcName:n}=e,i=Yt(t[0],"color-token").color,o=Yt(t[1],"color-token").color,s=t[2];return{type:"enclose",mode:a.mode,label:n,backgroundColor:o,borderColor:i,body:s}},htmlBuilder:Er,mathmlBuilder:Lr}),st({type:"enclose",names:["\\fbox"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!0},handler(e,t){var{parser:r}=e;return{type:"enclose",mode:r.mode,label:"\\fbox",body:t[0]}}}),st({type:"enclose",names:["\\cancel","\\bcancel","\\xcancel","\\sout","\\phase"],props:{numArgs:1},handler(e,t){var{parser:r,funcName:a}=e,n=t[0];return{type:"enclose",mode:r.mode,label:a,body:n}},htmlBuilder:Er,mathmlBuilder:Lr}),st({type:"enclose",names:["\\angl"],props:{numArgs:1,argTypes:["hbox"],allowedInText:!1},handler(e,t){var{parser:r}=e;return{type:"enclose",mode:r.mode,label:"\\angl",body:t[0]}}});var Dr={};function Vr(e){for(var{type:t,names:r,props:a,handler:n,htmlBuilder:i,mathmlBuilder:o}=e,s={type:t,numArgs:a.numArgs||0,allowedInText:!1,numOptionalArgs:0,handler:n},l=0;l{if(!e.parser.settings.displayMode)throw new i("{"+e.envName+"} can be used only in display mode.")};function Yr(e){if(-1===e.indexOf("ed"))return-1===e.indexOf("*")}function Xr(e,t,r){var{hskipBeforeAndAfter:a,addJot:o,cols:s,arraystretch:l,colSeparationType:h,autoTag:m,singleRow:c,emptySingleRow:p,maxNumCols:u,leqno:d}=t;if(e.gullet.beginGroup(),c||e.gullet.macros.set("\\cr","\\\\\\relax"),!l){var g=e.gullet.expandMacroAsText("\\arraystretch");if(null==g)l=1;else if(!(l=parseFloat(g))||l<0)throw new i("Invalid \\arraystretch: "+g)}e.gullet.beginGroup();var f=[],v=[f],b=[],y=[],x=null!=m?[]:void 0;function w(){m&&e.gullet.macros.set("\\@eqnsw","1",!0)}function k(){x&&(e.gullet.macros.get("\\df@tag")?(x.push(e.subparse([new n("\\df@tag")])),e.gullet.macros.set("\\df@tag",void 0,!0)):x.push(Boolean(m)&&"1"===e.gullet.macros.get("\\@eqnsw")))}for(w(),y.push(Gr(e));;){var S=e.parseExpression(!1,c?"\\end":"\\\\");e.gullet.endGroup(),e.gullet.beginGroup(),S={type:"ordgroup",mode:e.mode,body:S},r&&(S={type:"styling",mode:e.mode,style:r,body:[S]}),f.push(S);var M=e.fetch().text;if("&"===M){if(u&&f.length===u){if(c||h)throw new i("Too many tab characters: &",e.nextToken);e.settings.reportNonstrict("textEnv","Too few columns specified in the {array} column argument.")}e.consume()}else{if("\\end"===M){k(),1===f.length&&"styling"===S.type&&0===S.body[0].body.length&&(v.length>1||!p)&&v.pop(),y.length0&&(y+=.25),h.push({pos:y,isDashed:e[t]})}for(x(o[0]),r=0;r0&&(M<(B+=b)&&(M=B),B=0),e.addJot&&(M+=g),z.height=S,z.depth=M,y+=S,z.pos=y,y+=M+B,l[r]=z,x(o[r+1])}var C,N,q=y/2+t.fontMetrics().axisHeight,I=e.cols||[],R=[],H=[];if(e.tags&&e.tags.some((e=>e)))for(r=0;r=s)){var W=void 0;(a>0||e.hskipBeforeAndAfter)&&0!==(W=m.deflt(V.pregap,u))&&((C=Je.makeSpan(["arraycolsep"],[])).style.width=G(W),R.push(C));var _=[];for(r=0;r0){for(var K=Je.makeLineSpan("hline",t,c),J=Je.makeLineSpan("hdashline",t,c),Q=[{type:"elem",elem:l,shift:0}];h.length>0;){var ee=h.pop(),te=ee.pos-q;ee.isDashed?Q.push({type:"elem",elem:J,shift:te}):Q.push({type:"elem",elem:K,shift:te})}l=Je.makeVList({positionType:"individualShift",children:Q},t)}if(0===H.length)return Je.makeSpan(["mord"],[l],t);var re=Je.makeVList({positionType:"individualShift",children:H},t);return re=Je.makeSpan(["tag"],[re],t),Je.makeFragment([l,re])},jr={c:"center ",l:"left ",r:"right "},$r=function(e,t){for(var r=[],a=new Bt.MathNode("mtd",[],["mtr-glue"]),n=new Bt.MathNode("mtd",[],["mml-eqn-num"]),i=0;i0){var u=e.cols,d="",g=!1,f=0,v=u.length;"separator"===u[0].type&&(c+="top ",f=1),"separator"===u[u.length-1].type&&(c+="bottom ",v-=1);for(var b=f;b0?"left ":"",c+=S[S.length-1].length>0?"right ":"";for(var M=1;M-1?"alignat":"align",o="split"===e.envName,s=Xr(e.parser,{cols:a,addJot:!0,autoTag:o?void 0:Yr(e.envName),emptySingleRow:!0,colSeparationType:n,maxNumCols:o?2:void 0,leqno:e.parser.settings.leqno},"display"),l=0,h={type:"ordgroup",mode:e.mode,body:[]};if(t[0]&&"ordgroup"===t[0].type){for(var m="",c=0;c0&&p&&(g=1),a[u]={type:"align",align:d,pregap:g,postgap:0}}return s.colSeparationType=p?"align":"alignat",s};Vr({type:"array",names:["array","darray"],props:{numArgs:1},handler(e,t){var r=(Wt(t[0])?[t[0]]:Yt(t[0],"ordgroup").body).map((function(e){var t=Xt(e).text;if(-1!=="lcr".indexOf(t))return{type:"align",align:t};if("|"===t)return{type:"separator",separator:"|"};if(":"===t)return{type:"separator",separator:":"};throw new i("Unknown column alignment: "+t,e)})),a={cols:r,hskipBeforeAndAfter:!0,maxNumCols:r.length};return Xr(e.parser,a,Wr(e.envName))},htmlBuilder:_r,mathmlBuilder:$r}),Vr({type:"array",names:["matrix","pmatrix","bmatrix","Bmatrix","vmatrix","Vmatrix","matrix*","pmatrix*","bmatrix*","Bmatrix*","vmatrix*","Vmatrix*"],props:{numArgs:0},handler(e){var t={matrix:null,pmatrix:["(",")"],bmatrix:["[","]"],Bmatrix:["\\{","\\}"],vmatrix:["|","|"],Vmatrix:["\\Vert","\\Vert"]}[e.envName.replace("*","")],r="c",a={hskipBeforeAndAfter:!1,cols:[{type:"align",align:r}]};if("*"===e.envName.charAt(e.envName.length-1)){var n=e.parser;if(n.consumeSpaces(),"["===n.fetch().text){if(n.consume(),n.consumeSpaces(),r=n.fetch().text,-1==="lcr".indexOf(r))throw new i("Expected l or c or r",n.nextToken);n.consume(),n.consumeSpaces(),n.expect("]"),n.consume(),a.cols=[{type:"align",align:r}]}}var o=Xr(e.parser,a,Wr(e.envName)),s=Math.max(0,...o.body.map((e=>e.length)));return o.cols=new Array(s).fill({type:"align",align:r}),t?{type:"leftright",mode:e.mode,body:[o],left:t[0],right:t[1],rightColor:void 0}:o},htmlBuilder:_r,mathmlBuilder:$r}),Vr({type:"array",names:["smallmatrix"],props:{numArgs:0},handler(e){var t=Xr(e.parser,{arraystretch:.5},"script");return t.colSeparationType="small",t},htmlBuilder:_r,mathmlBuilder:$r}),Vr({type:"array",names:["subarray"],props:{numArgs:1},handler(e,t){var r=(Wt(t[0])?[t[0]]:Yt(t[0],"ordgroup").body).map((function(e){var t=Xt(e).text;if(-1!=="lc".indexOf(t))return{type:"align",align:t};throw new i("Unknown column alignment: "+t,e)}));if(r.length>1)throw new i("{subarray} can contain only one column");var a={cols:r,hskipBeforeAndAfter:!1,arraystretch:.5};if((a=Xr(e.parser,a,"script")).body.length>0&&a.body[0].length>1)throw new i("{subarray} can contain only one column");return a},htmlBuilder:_r,mathmlBuilder:$r}),Vr({type:"array",names:["cases","dcases","rcases","drcases"],props:{numArgs:0},handler(e){var t=Xr(e.parser,{arraystretch:1.2,cols:[{type:"align",align:"l",pregap:0,postgap:1},{type:"align",align:"l",pregap:0,postgap:0}]},Wr(e.envName));return{type:"leftright",mode:e.mode,body:[t],left:e.envName.indexOf("r")>-1?".":"\\{",right:e.envName.indexOf("r")>-1?"\\}":".",rightColor:void 0}},htmlBuilder:_r,mathmlBuilder:$r}),Vr({type:"array",names:["align","align*","aligned","split"],props:{numArgs:0},handler:Zr,htmlBuilder:_r,mathmlBuilder:$r}),Vr({type:"array",names:["gathered","gather","gather*"],props:{numArgs:0},handler(e){m.contains(["gather","gather*"],e.envName)&&Ur(e);var t={cols:[{type:"align",align:"c"}],addJot:!0,colSeparationType:"gather",autoTag:Yr(e.envName),emptySingleRow:!0,leqno:e.parser.settings.leqno};return Xr(e.parser,t,"display")},htmlBuilder:_r,mathmlBuilder:$r}),Vr({type:"array",names:["alignat","alignat*","alignedat"],props:{numArgs:1},handler:Zr,htmlBuilder:_r,mathmlBuilder:$r}),Vr({type:"array",names:["equation","equation*"],props:{numArgs:0},handler(e){Ur(e);var t={autoTag:Yr(e.envName),emptySingleRow:!0,singleRow:!0,maxNumCols:1,leqno:e.parser.settings.leqno};return Xr(e.parser,t,"display")},htmlBuilder:_r,mathmlBuilder:$r}),Vr({type:"array",names:["CD"],props:{numArgs:0},handler:e=>(Ur(e),function(e){var t=[];for(e.gullet.beginGroup(),e.gullet.macros.set("\\cr","\\\\\\relax"),e.gullet.beginGroup();;){t.push(e.parseExpression(!1,"\\\\")),e.gullet.endGroup(),e.gullet.beginGroup();var r=e.fetch().text;if("&"!==r&&"\\\\"!==r){if("\\end"===r){0===t[t.length-1].length&&t.pop();break}throw new i("Expected \\\\ or \\cr or \\end",e.nextToken)}e.consume()}for(var a,n,o=[],s=[o],l=0;l-1);else{if(!("<>AV".indexOf(p)>-1))throw new i('Expected one of "<>AV=|." after @',h[c]);for(var d=0;d<2;d++){for(var g=!0,f=c+1;f{var r=e.font,a=t.withFont(r);return kt(e.body,a)},Qr=(e,t)=>{var r=e.font,a=t.withFont(r);return Ot(e.body,a)},ea={"\\Bbb":"\\mathbb","\\bold":"\\mathbf","\\frak":"\\mathfrak","\\bm":"\\boldsymbol"};st({type:"font",names:["\\mathrm","\\mathit","\\mathbf","\\mathnormal","\\mathsfit","\\mathbb","\\mathcal","\\mathfrak","\\mathscr","\\mathsf","\\mathtt","\\Bbb","\\bold","\\frak"],props:{numArgs:1,allowedInArgument:!0},handler:(e,t)=>{var{parser:r,funcName:a}=e,n=ht(t[0]),i=a;return i in ea&&(i=ea[i]),{type:"font",mode:r.mode,font:i.slice(1),body:n}},htmlBuilder:Jr,mathmlBuilder:Qr}),st({type:"mclass",names:["\\boldsymbol","\\bm"],props:{numArgs:1},handler:(e,t)=>{var{parser:r}=e,a=t[0],n=m.isCharacterBox(a);return{type:"mclass",mode:r.mode,mclass:er(a),body:[{type:"font",mode:r.mode,font:"boldsymbol",body:a}],isCharacterBox:n}}}),st({type:"font",names:["\\rm","\\sf","\\tt","\\bf","\\it","\\cal"],props:{numArgs:0,allowedInText:!0},handler:(e,t)=>{var{parser:r,funcName:a,breakOnTokenText:n}=e,{mode:i}=r,o=r.parseExpression(!0,n);return{type:"font",mode:i,font:"math"+a.slice(1),body:{type:"ordgroup",mode:r.mode,body:o}}},htmlBuilder:Jr,mathmlBuilder:Qr});var ta=(e,t)=>{var r=t;return"display"===e?r=r.id>=k.SCRIPT.id?r.text():k.DISPLAY:"text"===e&&r.size===k.DISPLAY.size?r=k.TEXT:"script"===e?r=k.SCRIPT:"scriptscript"===e&&(r=k.SCRIPTSCRIPT),r},ra=(e,t)=>{var r,a=ta(e.size,t.style),n=a.fracNum(),i=a.fracDen();r=t.havingStyle(n);var o=kt(e.numer,r,t);if(e.continued){var s=8.5/t.fontMetrics().ptPerEm,l=3.5/t.fontMetrics().ptPerEm;o.height=o.height0?3*c:7*c,d=t.fontMetrics().denom1):(m>0?(p=t.fontMetrics().num2,u=c):(p=t.fontMetrics().num3,u=3*c),d=t.fontMetrics().denom2),h){var x=t.fontMetrics().axisHeight;p-o.depth-(x+.5*m){var r=new Bt.MathNode("mfrac",[Ot(e.numer,t),Ot(e.denom,t)]);if(e.hasBarLine){if(e.barSize){var a=F(e.barSize,t);r.setAttribute("linethickness",G(a))}}else r.setAttribute("linethickness","0px");var n=ta(e.size,t.style);if(n.size!==t.style.size){r=new Bt.MathNode("mstyle",[r]);var i=n.size===k.DISPLAY.size?"true":"false";r.setAttribute("displaystyle",i),r.setAttribute("scriptlevel","0")}if(null!=e.leftDelim||null!=e.rightDelim){var o=[];if(null!=e.leftDelim){var s=new Bt.MathNode("mo",[new Bt.TextNode(e.leftDelim.replace("\\",""))]);s.setAttribute("fence","true"),o.push(s)}if(o.push(r),null!=e.rightDelim){var l=new Bt.MathNode("mo",[new Bt.TextNode(e.rightDelim.replace("\\",""))]);l.setAttribute("fence","true"),o.push(l)}return Nt(o)}return r};st({type:"genfrac",names:["\\dfrac","\\frac","\\tfrac","\\dbinom","\\binom","\\tbinom","\\\\atopfrac","\\\\bracefrac","\\\\brackfrac"],props:{numArgs:2,allowedInArgument:!0},handler:(e,t)=>{var r,{parser:a,funcName:n}=e,i=t[0],o=t[1],s=null,l=null,h="auto";switch(n){case"\\dfrac":case"\\frac":case"\\tfrac":r=!0;break;case"\\\\atopfrac":r=!1;break;case"\\dbinom":case"\\binom":case"\\tbinom":r=!1,s="(",l=")";break;case"\\\\bracefrac":r=!1,s="\\{",l="\\}";break;case"\\\\brackfrac":r=!1,s="[",l="]";break;default:throw new Error("Unrecognized genfrac command")}switch(n){case"\\dfrac":case"\\dbinom":h="display";break;case"\\tfrac":case"\\tbinom":h="text"}return{type:"genfrac",mode:a.mode,continued:!1,numer:i,denom:o,hasBarLine:r,leftDelim:s,rightDelim:l,size:h,barSize:null}},htmlBuilder:ra,mathmlBuilder:aa}),st({type:"genfrac",names:["\\cfrac"],props:{numArgs:2},handler:(e,t)=>{var{parser:r,funcName:a}=e,n=t[0],i=t[1];return{type:"genfrac",mode:r.mode,continued:!0,numer:n,denom:i,hasBarLine:!0,leftDelim:null,rightDelim:null,size:"display",barSize:null}}}),st({type:"infix",names:["\\over","\\choose","\\atop","\\brace","\\brack"],props:{numArgs:0,infix:!0},handler(e){var t,{parser:r,funcName:a,token:n}=e;switch(a){case"\\over":t="\\frac";break;case"\\choose":t="\\binom";break;case"\\atop":t="\\\\atopfrac";break;case"\\brace":t="\\\\bracefrac";break;case"\\brack":t="\\\\brackfrac";break;default:throw new Error("Unrecognized infix genfrac command")}return{type:"infix",mode:r.mode,replaceWith:t,token:n}}});var na=["display","text","script","scriptscript"],ia=function(e){var t=null;return e.length>0&&(t="."===(t=e)?null:t),t};st({type:"genfrac",names:["\\genfrac"],props:{numArgs:6,allowedInArgument:!0,argTypes:["math","math","size","text","math","math"]},handler(e,t){var r,{parser:a}=e,n=t[4],i=t[5],o=ht(t[0]),s="atom"===o.type&&"open"===o.family?ia(o.text):null,l=ht(t[1]),h="atom"===l.type&&"close"===l.family?ia(l.text):null,m=Yt(t[2],"size"),c=null;r=!!m.isBlank||(c=m.value).number>0;var p="auto",u=t[3];if("ordgroup"===u.type){if(u.body.length>0){var d=Yt(u.body[0],"textord");p=na[Number(d.text)]}}else u=Yt(u,"textord"),p=na[Number(u.text)];return{type:"genfrac",mode:a.mode,numer:n,denom:i,continued:!1,hasBarLine:r,barSize:c,leftDelim:s,rightDelim:h,size:p}},htmlBuilder:ra,mathmlBuilder:aa}),st({type:"infix",names:["\\above"],props:{numArgs:1,argTypes:["size"],infix:!0},handler(e,t){var{parser:r,funcName:a,token:n}=e;return{type:"infix",mode:r.mode,replaceWith:"\\\\abovefrac",size:Yt(t[0],"size").value,token:n}}}),st({type:"genfrac",names:["\\\\abovefrac"],props:{numArgs:3,argTypes:["math","size","math"]},handler:(e,t)=>{var{parser:r,funcName:a}=e,n=t[0],i=function(e){if(!e)throw new Error("Expected non-null, but got "+String(e));return e}(Yt(t[1],"infix").size),o=t[2],s=i.number>0;return{type:"genfrac",mode:r.mode,numer:n,denom:o,continued:!1,hasBarLine:s,barSize:i,leftDelim:null,rightDelim:null,size:"auto"}},htmlBuilder:ra,mathmlBuilder:aa});var oa=(e,t)=>{var r,a,n=t.style;"supsub"===e.type?(r=e.sup?kt(e.sup,t.havingStyle(n.sup()),t):kt(e.sub,t.havingStyle(n.sub()),t),a=Yt(e.base,"horizBrace")):a=Yt(e,"horizBrace");var i,o=kt(a.base,t.havingBaseStyle(k.DISPLAY)),s=Ut(a,t);if(a.isOver?(i=Je.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:o},{type:"kern",size:.1},{type:"elem",elem:s}]},t)).children[0].children[0].children[1].classes.push("svg-align"):(i=Je.makeVList({positionType:"bottom",positionData:o.depth+.1+s.height,children:[{type:"elem",elem:s},{type:"kern",size:.1},{type:"elem",elem:o}]},t)).children[0].children[0].children[0].classes.push("svg-align"),r){var l=Je.makeSpan(["mord",a.isOver?"mover":"munder"],[i],t);i=a.isOver?Je.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:l},{type:"kern",size:.2},{type:"elem",elem:r}]},t):Je.makeVList({positionType:"bottom",positionData:l.depth+.2+r.height+r.depth,children:[{type:"elem",elem:r},{type:"kern",size:.2},{type:"elem",elem:l}]},t)}return Je.makeSpan(["mord",a.isOver?"mover":"munder"],[i],t)};st({type:"horizBrace",names:["\\overbrace","\\underbrace"],props:{numArgs:1},handler(e,t){var{parser:r,funcName:a}=e;return{type:"horizBrace",mode:r.mode,label:a,isOver:/^\\over/.test(a),base:t[0]}},htmlBuilder:oa,mathmlBuilder:(e,t)=>{var r=Gt(e.label);return new Bt.MathNode(e.isOver?"mover":"munder",[Ot(e.base,t),r])}}),st({type:"href",names:["\\href"],props:{numArgs:2,argTypes:["url","original"],allowedInText:!0},handler:(e,t)=>{var{parser:r}=e,a=t[1],n=Yt(t[0],"url").url;return r.settings.isTrusted({command:"\\href",url:n})?{type:"href",mode:r.mode,href:n,body:mt(a)}:r.formatUnsupportedCmd("\\href")},htmlBuilder:(e,t)=>{var r=ft(e.body,t,!1);return Je.makeAnchor(e.href,[],r,t)},mathmlBuilder:(e,t)=>{var r=Ht(e.body,t);return r instanceof At||(r=new At("mrow",[r])),r.setAttribute("href",e.href),r}}),st({type:"href",names:["\\url"],props:{numArgs:1,argTypes:["url"],allowedInText:!0},handler:(e,t)=>{var{parser:r}=e,a=Yt(t[0],"url").url;if(!r.settings.isTrusted({command:"\\url",url:a}))return r.formatUnsupportedCmd("\\url");for(var n=[],i=0;inew Bt.MathNode("mrow",Rt(e.body,t))}),st({type:"html",names:["\\htmlClass","\\htmlId","\\htmlStyle","\\htmlData"],props:{numArgs:2,argTypes:["raw","original"],allowedInText:!0},handler:(e,t)=>{var r,{parser:a,funcName:n,token:o}=e,s=Yt(t[0],"raw").string,l=t[1];a.settings.strict&&a.settings.reportNonstrict("htmlExtension","HTML extension is disabled on strict mode");var h={};switch(n){case"\\htmlClass":h.class=s,r={command:"\\htmlClass",class:s};break;case"\\htmlId":h.id=s,r={command:"\\htmlId",id:s};break;case"\\htmlStyle":h.style=s,r={command:"\\htmlStyle",style:s};break;case"\\htmlData":for(var m=s.split(","),c=0;c{var r=ft(e.body,t,!1),a=["enclosing"];e.attributes.class&&a.push(...e.attributes.class.trim().split(/\s+/));var n=Je.makeSpan(a,r,t);for(var i in e.attributes)"class"!==i&&e.attributes.hasOwnProperty(i)&&n.setAttribute(i,e.attributes[i]);return n},mathmlBuilder:(e,t)=>Ht(e.body,t)}),st({type:"htmlmathml",names:["\\html@mathml"],props:{numArgs:2,allowedInText:!0},handler:(e,t)=>{var{parser:r}=e;return{type:"htmlmathml",mode:r.mode,html:mt(t[0]),mathml:mt(t[1])}},htmlBuilder:(e,t)=>{var r=ft(e.html,t,!1);return Je.makeFragment(r)},mathmlBuilder:(e,t)=>Ht(e.mathml,t)});var sa=function(e){if(/^[-+]? *(\d+(\.\d*)?|\.\d+)$/.test(e))return{number:+e,unit:"bp"};var t=/([-+]?) *(\d+(?:\.\d*)?|\.\d+) *([a-z]{2})/.exec(e);if(!t)throw new i("Invalid size: '"+e+"' in \\includegraphics");var r={number:+(t[1]+t[2]),unit:t[3]};if(!P(r))throw new i("Invalid unit: '"+r.unit+"' in \\includegraphics.");return r};st({type:"includegraphics",names:["\\includegraphics"],props:{numArgs:1,numOptionalArgs:1,argTypes:["raw","url"],allowedInText:!1},handler:(e,t,r)=>{var{parser:a}=e,n={number:0,unit:"em"},o={number:.9,unit:"em"},s={number:0,unit:"em"},l="";if(r[0])for(var h=Yt(r[0],"raw").string.split(","),m=0;m{var r=F(e.height,t),a=0;e.totalheight.number>0&&(a=F(e.totalheight,t)-r);var n=0;e.width.number>0&&(n=F(e.width,t));var i={height:G(r+a)};n>0&&(i.width=G(n)),a>0&&(i.verticalAlign=G(-a));var o=new Z(e.src,e.alt,i);return o.height=r,o.depth=a,o},mathmlBuilder:(e,t)=>{var r=new Bt.MathNode("mglyph",[]);r.setAttribute("alt",e.alt);var a=F(e.height,t),n=0;if(e.totalheight.number>0&&(n=F(e.totalheight,t)-a,r.setAttribute("valign",G(-n))),r.setAttribute("height",G(a+n)),e.width.number>0){var i=F(e.width,t);r.setAttribute("width",G(i))}return r.setAttribute("src",e.src),r}}),st({type:"kern",names:["\\kern","\\mkern","\\hskip","\\mskip"],props:{numArgs:1,argTypes:["size"],primitive:!0,allowedInText:!0},handler(e,t){var{parser:r,funcName:a}=e,n=Yt(t[0],"size");if(r.settings.strict){var i="m"===a[1],o="mu"===n.value.unit;i?(o||r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+a+" supports only mu units, not "+n.value.unit+" units"),"math"!==r.mode&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+a+" works only in math mode")):o&&r.settings.reportNonstrict("mathVsTextUnits","LaTeX's "+a+" doesn't support mu units")}return{type:"kern",mode:r.mode,dimension:n.value}},htmlBuilder:(e,t)=>Je.makeGlue(e.dimension,t),mathmlBuilder(e,t){var r=F(e.dimension,t);return new Bt.SpaceNode(r)}}),st({type:"lap",names:["\\mathllap","\\mathrlap","\\mathclap"],props:{numArgs:1,allowedInText:!0},handler:(e,t)=>{var{parser:r,funcName:a}=e,n=t[0];return{type:"lap",mode:r.mode,alignment:a.slice(5),body:n}},htmlBuilder:(e,t)=>{var r;"clap"===e.alignment?(r=Je.makeSpan([],[kt(e.body,t)]),r=Je.makeSpan(["inner"],[r],t)):r=Je.makeSpan(["inner"],[kt(e.body,t)]);var a=Je.makeSpan(["fix"],[]),n=Je.makeSpan([e.alignment],[r,a],t),i=Je.makeSpan(["strut"]);return i.style.height=G(n.height+n.depth),n.depth&&(i.style.verticalAlign=G(-n.depth)),n.children.unshift(i),n=Je.makeSpan(["thinbox"],[n],t),Je.makeSpan(["mord","vbox"],[n],t)},mathmlBuilder:(e,t)=>{var r=new Bt.MathNode("mpadded",[Ot(e.body,t)]);if("rlap"!==e.alignment){var a="llap"===e.alignment?"-1":"-0.5";r.setAttribute("lspace",a+"width")}return r.setAttribute("width","0px"),r}}),st({type:"styling",names:["\\(","$"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(e,t){var{funcName:r,parser:a}=e,n=a.mode;a.switchMode("math");var i="\\("===r?"\\)":"$",o=a.parseExpression(!1,i);return a.expect(i),a.switchMode(n),{type:"styling",mode:a.mode,style:"text",body:o}}}),st({type:"text",names:["\\)","\\]"],props:{numArgs:0,allowedInText:!0,allowedInMath:!1},handler(e,t){throw new i("Mismatched "+e.funcName)}});var la=(e,t)=>{switch(t.style.size){case k.DISPLAY.size:return e.display;case k.TEXT.size:return e.text;case k.SCRIPT.size:return e.script;case k.SCRIPTSCRIPT.size:return e.scriptscript;default:return e.text}};st({type:"mathchoice",names:["\\mathchoice"],props:{numArgs:4,primitive:!0},handler:(e,t)=>{var{parser:r}=e;return{type:"mathchoice",mode:r.mode,display:mt(t[0]),text:mt(t[1]),script:mt(t[2]),scriptscript:mt(t[3])}},htmlBuilder:(e,t)=>{var r=la(e,t),a=ft(r,t,!1);return Je.makeFragment(a)},mathmlBuilder:(e,t)=>{var r=la(e,t);return Ht(r,t)}});var ha=(e,t,r,a,n,i,o)=>{e=Je.makeSpan([],[e]);var s,l,h,c=r&&m.isCharacterBox(r);if(t){var p=kt(t,a.havingStyle(n.sup()),a);l={elem:p,kern:Math.max(a.fontMetrics().bigOpSpacing1,a.fontMetrics().bigOpSpacing3-p.depth)}}if(r){var u=kt(r,a.havingStyle(n.sub()),a);s={elem:u,kern:Math.max(a.fontMetrics().bigOpSpacing2,a.fontMetrics().bigOpSpacing4-u.height)}}if(l&&s){var d=a.fontMetrics().bigOpSpacing5+s.elem.height+s.elem.depth+s.kern+e.depth+o;h=Je.makeVList({positionType:"bottom",positionData:d,children:[{type:"kern",size:a.fontMetrics().bigOpSpacing5},{type:"elem",elem:s.elem,marginLeft:G(-i)},{type:"kern",size:s.kern},{type:"elem",elem:e},{type:"kern",size:l.kern},{type:"elem",elem:l.elem,marginLeft:G(i)},{type:"kern",size:a.fontMetrics().bigOpSpacing5}]},a)}else if(s){var g=e.height-o;h=Je.makeVList({positionType:"top",positionData:g,children:[{type:"kern",size:a.fontMetrics().bigOpSpacing5},{type:"elem",elem:s.elem,marginLeft:G(-i)},{type:"kern",size:s.kern},{type:"elem",elem:e}]},a)}else{if(!l)return e;var f=e.depth+o;h=Je.makeVList({positionType:"bottom",positionData:f,children:[{type:"elem",elem:e},{type:"kern",size:l.kern},{type:"elem",elem:l.elem,marginLeft:G(i)},{type:"kern",size:a.fontMetrics().bigOpSpacing5}]},a)}var v=[h];if(s&&0!==i&&!c){var b=Je.makeSpan(["mspace"],[],a);b.style.marginRight=G(i),v.unshift(b)}return Je.makeSpan(["mop","op-limits"],v,a)},ma=["\\smallint"],ca=(e,t)=>{var r,a,n,i=!1;"supsub"===e.type?(r=e.sup,a=e.sub,n=Yt(e.base,"op"),i=!0):n=Yt(e,"op");var o,s=t.style,l=!1;if(s.size===k.DISPLAY.size&&n.symbol&&!m.contains(ma,n.name)&&(l=!0),n.symbol){var h=l?"Size2-Regular":"Size1-Regular",c="";if("\\oiint"!==n.name&&"\\oiiint"!==n.name||(c=n.name.slice(1),n.name="oiint"===c?"\\iint":"\\iiint"),o=Je.makeSymbol(n.name,h,"math",t,["mop","op-symbol",l?"large-op":"small-op"]),c.length>0){var p=o.italic,u=Je.staticSvg(c+"Size"+(l?"2":"1"),t);o=Je.makeVList({positionType:"individualShift",children:[{type:"elem",elem:o,shift:0},{type:"elem",elem:u,shift:l?.08:0}]},t),n.name="\\"+c,o.classes.unshift("mop"),o.italic=p}}else if(n.body){var d=ft(n.body,t,!0);1===d.length&&d[0]instanceof J?(o=d[0]).classes[0]="mop":o=Je.makeSpan(["mop"],d,t)}else{for(var g=[],f=1;f{var r;if(e.symbol)r=new At("mo",[Ct(e.name,e.mode)]),m.contains(ma,e.name)&&r.setAttribute("largeop","false");else if(e.body)r=new At("mo",Rt(e.body,t));else{r=new At("mi",[new Tt(e.name.slice(1))]);var a=new At("mo",[Ct("\u2061","text")]);r=e.parentIsSupSub?new At("mrow",[r,a]):zt([r,a])}return r},ua={"\u220f":"\\prod","\u2210":"\\coprod","\u2211":"\\sum","\u22c0":"\\bigwedge","\u22c1":"\\bigvee","\u22c2":"\\bigcap","\u22c3":"\\bigcup","\u2a00":"\\bigodot","\u2a01":"\\bigoplus","\u2a02":"\\bigotimes","\u2a04":"\\biguplus","\u2a06":"\\bigsqcup"};st({type:"op",names:["\\coprod","\\bigvee","\\bigwedge","\\biguplus","\\bigcap","\\bigcup","\\intop","\\prod","\\sum","\\bigotimes","\\bigoplus","\\bigodot","\\bigsqcup","\\smallint","\u220f","\u2210","\u2211","\u22c0","\u22c1","\u22c2","\u22c3","\u2a00","\u2a01","\u2a02","\u2a04","\u2a06"],props:{numArgs:0},handler:(e,t)=>{var{parser:r,funcName:a}=e,n=a;return 1===n.length&&(n=ua[n]),{type:"op",mode:r.mode,limits:!0,parentIsSupSub:!1,symbol:!0,name:n}},htmlBuilder:ca,mathmlBuilder:pa}),st({type:"op",names:["\\mathop"],props:{numArgs:1,primitive:!0},handler:(e,t)=>{var{parser:r}=e,a=t[0];return{type:"op",mode:r.mode,limits:!1,parentIsSupSub:!1,symbol:!1,body:mt(a)}},htmlBuilder:ca,mathmlBuilder:pa});var da={"\u222b":"\\int","\u222c":"\\iint","\u222d":"\\iiint","\u222e":"\\oint","\u222f":"\\oiint","\u2230":"\\oiiint"};st({type:"op",names:["\\arcsin","\\arccos","\\arctan","\\arctg","\\arcctg","\\arg","\\ch","\\cos","\\cosec","\\cosh","\\cot","\\cotg","\\coth","\\csc","\\ctg","\\cth","\\deg","\\dim","\\exp","\\hom","\\ker","\\lg","\\ln","\\log","\\sec","\\sin","\\sinh","\\sh","\\tan","\\tanh","\\tg","\\th"],props:{numArgs:0},handler(e){var{parser:t,funcName:r}=e;return{type:"op",mode:t.mode,limits:!1,parentIsSupSub:!1,symbol:!1,name:r}},htmlBuilder:ca,mathmlBuilder:pa}),st({type:"op",names:["\\det","\\gcd","\\inf","\\lim","\\max","\\min","\\Pr","\\sup"],props:{numArgs:0},handler(e){var{parser:t,funcName:r}=e;return{type:"op",mode:t.mode,limits:!0,parentIsSupSub:!1,symbol:!1,name:r}},htmlBuilder:ca,mathmlBuilder:pa}),st({type:"op",names:["\\int","\\iint","\\iiint","\\oint","\\oiint","\\oiiint","\u222b","\u222c","\u222d","\u222e","\u222f","\u2230"],props:{numArgs:0},handler(e){var{parser:t,funcName:r}=e,a=r;return 1===a.length&&(a=da[a]),{type:"op",mode:t.mode,limits:!1,parentIsSupSub:!1,symbol:!0,name:a}},htmlBuilder:ca,mathmlBuilder:pa});var ga=(e,t)=>{var r,a,n,i,o=!1;if("supsub"===e.type?(r=e.sup,a=e.sub,n=Yt(e.base,"operatorname"),o=!0):n=Yt(e,"operatorname"),n.body.length>0){for(var s=n.body.map((e=>{var t=e.text;return"string"===typeof t?{type:"textord",mode:e.mode,text:t}:e})),l=ft(s,t.withFont("mathrm"),!0),h=0;h{var{parser:r,funcName:a}=e,n=t[0];return{type:"operatorname",mode:r.mode,body:mt(n),alwaysHandleSupSub:"\\operatornamewithlimits"===a,limits:!1,parentIsSupSub:!1}},htmlBuilder:ga,mathmlBuilder:(e,t)=>{for(var r=Rt(e.body,t.withFont("mathrm")),a=!0,n=0;ne.toText())).join("");r=[new Bt.TextNode(s)]}var l=new Bt.MathNode("mi",r);l.setAttribute("mathvariant","normal");var h=new Bt.MathNode("mo",[Ct("\u2061","text")]);return e.parentIsSupSub?new Bt.MathNode("mrow",[l,h]):Bt.newDocumentFragment([l,h])}}),Fr("\\operatorname","\\@ifstar\\operatornamewithlimits\\operatorname@"),lt({type:"ordgroup",htmlBuilder:(e,t)=>e.semisimple?Je.makeFragment(ft(e.body,t,!1)):Je.makeSpan(["mord"],ft(e.body,t,!0),t),mathmlBuilder:(e,t)=>Ht(e.body,t,!0)}),st({type:"overline",names:["\\overline"],props:{numArgs:1},handler(e,t){var{parser:r}=e,a=t[0];return{type:"overline",mode:r.mode,body:a}},htmlBuilder(e,t){var r=kt(e.body,t.havingCrampedStyle()),a=Je.makeLineSpan("overline-line",t),n=t.fontMetrics().defaultRuleThickness,i=Je.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r},{type:"kern",size:3*n},{type:"elem",elem:a},{type:"kern",size:n}]},t);return Je.makeSpan(["mord","overline"],[i],t)},mathmlBuilder(e,t){var r=new Bt.MathNode("mo",[new Bt.TextNode("\u203e")]);r.setAttribute("stretchy","true");var a=new Bt.MathNode("mover",[Ot(e.body,t),r]);return a.setAttribute("accent","true"),a}}),st({type:"phantom",names:["\\phantom"],props:{numArgs:1,allowedInText:!0},handler:(e,t)=>{var{parser:r}=e,a=t[0];return{type:"phantom",mode:r.mode,body:mt(a)}},htmlBuilder:(e,t)=>{var r=ft(e.body,t.withPhantom(),!1);return Je.makeFragment(r)},mathmlBuilder:(e,t)=>{var r=Rt(e.body,t);return new Bt.MathNode("mphantom",r)}}),st({type:"hphantom",names:["\\hphantom"],props:{numArgs:1,allowedInText:!0},handler:(e,t)=>{var{parser:r}=e,a=t[0];return{type:"hphantom",mode:r.mode,body:a}},htmlBuilder:(e,t)=>{var r=Je.makeSpan([],[kt(e.body,t.withPhantom())]);if(r.height=0,r.depth=0,r.children)for(var a=0;a{var r=Rt(mt(e.body),t),a=new Bt.MathNode("mphantom",r),n=new Bt.MathNode("mpadded",[a]);return n.setAttribute("height","0px"),n.setAttribute("depth","0px"),n}}),st({type:"vphantom",names:["\\vphantom"],props:{numArgs:1,allowedInText:!0},handler:(e,t)=>{var{parser:r}=e,a=t[0];return{type:"vphantom",mode:r.mode,body:a}},htmlBuilder:(e,t)=>{var r=Je.makeSpan(["inner"],[kt(e.body,t.withPhantom())]),a=Je.makeSpan(["fix"],[]);return Je.makeSpan(["mord","rlap"],[r,a],t)},mathmlBuilder:(e,t)=>{var r=Rt(mt(e.body),t),a=new Bt.MathNode("mphantom",r),n=new Bt.MathNode("mpadded",[a]);return n.setAttribute("width","0px"),n}}),st({type:"raisebox",names:["\\raisebox"],props:{numArgs:2,argTypes:["size","hbox"],allowedInText:!0},handler(e,t){var{parser:r}=e,a=Yt(t[0],"size").value,n=t[1];return{type:"raisebox",mode:r.mode,dy:a,body:n}},htmlBuilder(e,t){var r=kt(e.body,t),a=F(e.dy,t);return Je.makeVList({positionType:"shift",positionData:-a,children:[{type:"elem",elem:r}]},t)},mathmlBuilder(e,t){var r=new Bt.MathNode("mpadded",[Ot(e.body,t)]),a=e.dy.number+e.dy.unit;return r.setAttribute("voffset",a),r}}),st({type:"internal",names:["\\relax"],props:{numArgs:0,allowedInText:!0},handler(e){var{parser:t}=e;return{type:"internal",mode:t.mode}}}),st({type:"rule",names:["\\rule"],props:{numArgs:2,numOptionalArgs:1,allowedInText:!0,allowedInMath:!0,argTypes:["size","size","size"]},handler(e,t,r){var{parser:a}=e,n=r[0],i=Yt(t[0],"size"),o=Yt(t[1],"size");return{type:"rule",mode:a.mode,shift:n&&Yt(n,"size").value,width:i.value,height:o.value}},htmlBuilder(e,t){var r=Je.makeSpan(["mord","rule"],[],t),a=F(e.width,t),n=F(e.height,t),i=e.shift?F(e.shift,t):0;return r.style.borderRightWidth=G(a),r.style.borderTopWidth=G(n),r.style.bottom=G(i),r.width=a,r.height=n+i,r.depth=-i,r.maxFontSize=1.125*n*t.sizeMultiplier,r},mathmlBuilder(e,t){var r=F(e.width,t),a=F(e.height,t),n=e.shift?F(e.shift,t):0,i=t.color&&t.getColor()||"black",o=new Bt.MathNode("mspace");o.setAttribute("mathbackground",i),o.setAttribute("width",G(r)),o.setAttribute("height",G(a));var s=new Bt.MathNode("mpadded",[o]);return n>=0?s.setAttribute("height",G(n)):(s.setAttribute("height",G(n)),s.setAttribute("depth",G(-n))),s.setAttribute("voffset",G(n)),s}});var va=["\\tiny","\\sixptsize","\\scriptsize","\\footnotesize","\\small","\\normalsize","\\large","\\Large","\\LARGE","\\huge","\\Huge"];st({type:"sizing",names:va,props:{numArgs:0,allowedInText:!0},handler:(e,t)=>{var{breakOnTokenText:r,funcName:a,parser:n}=e,i=n.parseExpression(!1,r);return{type:"sizing",mode:n.mode,size:va.indexOf(a)+1,body:i}},htmlBuilder:(e,t)=>{var r=t.havingSize(e.size);return fa(e.body,r,t)},mathmlBuilder:(e,t)=>{var r=t.havingSize(e.size),a=Rt(e.body,r),n=new Bt.MathNode("mstyle",a);return n.setAttribute("mathsize",G(r.sizeMultiplier)),n}}),st({type:"smash",names:["\\smash"],props:{numArgs:1,numOptionalArgs:1,allowedInText:!0},handler:(e,t,r)=>{var{parser:a}=e,n=!1,i=!1,o=r[0]&&Yt(r[0],"ordgroup");if(o)for(var s="",l=0;l{var r=Je.makeSpan([],[kt(e.body,t)]);if(!e.smashHeight&&!e.smashDepth)return r;if(e.smashHeight&&(r.height=0,r.children))for(var a=0;a{var r=new Bt.MathNode("mpadded",[Ot(e.body,t)]);return e.smashHeight&&r.setAttribute("height","0px"),e.smashDepth&&r.setAttribute("depth","0px"),r}}),st({type:"sqrt",names:["\\sqrt"],props:{numArgs:1,numOptionalArgs:1},handler(e,t,r){var{parser:a}=e,n=r[0],i=t[0];return{type:"sqrt",mode:a.mode,body:i,index:n}},htmlBuilder(e,t){var r=kt(e.body,t.havingCrampedStyle());0===r.height&&(r.height=t.fontMetrics().xHeight),r=Je.wrapFragment(r,t);var a=t.fontMetrics().defaultRuleThickness,n=a;t.style.idr.height+r.depth+i&&(i=(i+m-r.height-r.depth)/2);var c=s.height-r.height-i-l;r.style.paddingLeft=G(h);var p=Je.makeVList({positionType:"firstBaseline",children:[{type:"elem",elem:r,wrapperClasses:["svg-align"]},{type:"kern",size:-(r.height+c)},{type:"elem",elem:s},{type:"kern",size:l}]},t);if(e.index){var u=t.havingStyle(k.SCRIPTSCRIPT),d=kt(e.index,u,t),g=.6*(p.height-p.depth),f=Je.makeVList({positionType:"shift",positionData:-g,children:[{type:"elem",elem:d}]},t),v=Je.makeSpan(["root"],[f]);return Je.makeSpan(["mord","sqrt"],[v,p],t)}return Je.makeSpan(["mord","sqrt"],[p],t)},mathmlBuilder(e,t){var{body:r,index:a}=e;return a?new Bt.MathNode("mroot",[Ot(r,t),Ot(a,t)]):new Bt.MathNode("msqrt",[Ot(r,t)])}});var ba={display:k.DISPLAY,text:k.TEXT,script:k.SCRIPT,scriptscript:k.SCRIPTSCRIPT};st({type:"styling",names:["\\displaystyle","\\textstyle","\\scriptstyle","\\scriptscriptstyle"],props:{numArgs:0,allowedInText:!0,primitive:!0},handler(e,t){var{breakOnTokenText:r,funcName:a,parser:n}=e,i=n.parseExpression(!0,r),o=a.slice(1,a.length-5);return{type:"styling",mode:n.mode,style:o,body:i}},htmlBuilder(e,t){var r=ba[e.style],a=t.havingStyle(r).withFont("");return fa(e.body,a,t)},mathmlBuilder(e,t){var r=ba[e.style],a=t.havingStyle(r),n=Rt(e.body,a),i=new Bt.MathNode("mstyle",n),o={display:["0","true"],text:["0","false"],script:["1","false"],scriptscript:["2","false"]}[e.style];return i.setAttribute("scriptlevel",o[0]),i.setAttribute("displaystyle",o[1]),i}});lt({type:"supsub",htmlBuilder(e,t){var r=function(e,t){var r=e.base;return r?"op"===r.type?r.limits&&(t.style.size===k.DISPLAY.size||r.alwaysHandleSupSub)?ca:null:"operatorname"===r.type?r.alwaysHandleSupSub&&(t.style.size===k.DISPLAY.size||r.limits)?ga:null:"accent"===r.type?m.isCharacterBox(r.base)?_t:null:"horizBrace"===r.type&&!e.sub===r.isOver?oa:null:null}(e,t);if(r)return r(e,t);var a,n,i,{base:o,sup:s,sub:l}=e,h=kt(o,t),c=t.fontMetrics(),p=0,u=0,d=o&&m.isCharacterBox(o);if(s){var g=t.havingStyle(t.style.sup());a=kt(s,g,t),d||(p=h.height-g.fontMetrics().supDrop*g.sizeMultiplier/t.sizeMultiplier)}if(l){var f=t.havingStyle(t.style.sub());n=kt(l,f,t),d||(u=h.depth+f.fontMetrics().subDrop*f.sizeMultiplier/t.sizeMultiplier)}i=t.style===k.DISPLAY?c.sup1:t.style.cramped?c.sup3:c.sup2;var v,b=t.sizeMultiplier,y=G(.5/c.ptPerEm/b),x=null;if(n){var w=e.base&&"op"===e.base.type&&e.base.name&&("\\oiint"===e.base.name||"\\oiiint"===e.base.name);(h instanceof J||w)&&(x=G(-h.italic))}if(a&&n){p=Math.max(p,i,a.depth+.25*c.xHeight),u=Math.max(u,c.sub2);var S=4*c.defaultRuleThickness;if(p-a.depth-(n.height-u)0&&(p+=M,u-=M)}var z=[{type:"elem",elem:n,shift:u,marginRight:y,marginLeft:x},{type:"elem",elem:a,shift:-p,marginRight:y}];v=Je.makeVList({positionType:"individualShift",children:z},t)}else if(n){u=Math.max(u,c.sub1,n.height-.8*c.xHeight);var A=[{type:"elem",elem:n,marginLeft:x,marginRight:y}];v=Je.makeVList({positionType:"shift",positionData:u,children:A},t)}else{if(!a)throw new Error("supsub must have either sup or sub.");p=Math.max(p,i,a.depth+.25*c.xHeight),v=Je.makeVList({positionType:"shift",positionData:-p,children:[{type:"elem",elem:a,marginRight:y}]},t)}var T=xt(h,"right")||"mord";return Je.makeSpan([T],[h,Je.makeSpan(["msupsub"],[v])],t)},mathmlBuilder(e,t){var r,a=!1;e.base&&"horizBrace"===e.base.type&&!!e.sup===e.base.isOver&&(a=!0,r=e.base.isOver),!e.base||"op"!==e.base.type&&"operatorname"!==e.base.type||(e.base.parentIsSupSub=!0);var n,i=[Ot(e.base,t)];if(e.sub&&i.push(Ot(e.sub,t)),e.sup&&i.push(Ot(e.sup,t)),a)n=r?"mover":"munder";else if(e.sub)if(e.sup){var o=e.base;n=o&&"op"===o.type&&o.limits&&t.style===k.DISPLAY||o&&"operatorname"===o.type&&o.alwaysHandleSupSub&&(t.style===k.DISPLAY||o.limits)?"munderover":"msubsup"}else{var s=e.base;n=s&&"op"===s.type&&s.limits&&(t.style===k.DISPLAY||s.alwaysHandleSupSub)||s&&"operatorname"===s.type&&s.alwaysHandleSupSub&&(s.limits||t.style===k.DISPLAY)?"munder":"msub"}else{var l=e.base;n=l&&"op"===l.type&&l.limits&&(t.style===k.DISPLAY||l.alwaysHandleSupSub)||l&&"operatorname"===l.type&&l.alwaysHandleSupSub&&(l.limits||t.style===k.DISPLAY)?"mover":"msup"}return new Bt.MathNode(n,i)}}),lt({type:"atom",htmlBuilder:(e,t)=>Je.mathsym(e.text,e.mode,t,["m"+e.family]),mathmlBuilder(e,t){var r=new Bt.MathNode("mo",[Ct(e.text,e.mode)]);if("bin"===e.family){var a=qt(e,t);"bold-italic"===a&&r.setAttribute("mathvariant",a)}else"punct"===e.family?r.setAttribute("separator","true"):"open"!==e.family&&"close"!==e.family||r.setAttribute("stretchy","false");return r}});var ya={mi:"italic",mn:"normal",mtext:"normal"};lt({type:"mathord",htmlBuilder:(e,t)=>Je.makeOrd(e,t,"mathord"),mathmlBuilder(e,t){var r=new Bt.MathNode("mi",[Ct(e.text,e.mode,t)]),a=qt(e,t)||"italic";return a!==ya[r.type]&&r.setAttribute("mathvariant",a),r}}),lt({type:"textord",htmlBuilder:(e,t)=>Je.makeOrd(e,t,"textord"),mathmlBuilder(e,t){var r,a=Ct(e.text,e.mode,t),n=qt(e,t)||"normal";return r="text"===e.mode?new Bt.MathNode("mtext",[a]):/[0-9]/.test(e.text)?new Bt.MathNode("mn",[a]):"\\prime"===e.text?new Bt.MathNode("mo",[a]):new Bt.MathNode("mi",[a]),n!==ya[r.type]&&r.setAttribute("mathvariant",n),r}});var xa={"\\nobreak":"nobreak","\\allowbreak":"allowbreak"},wa={" ":{},"\\ ":{},"~":{className:"nobreak"},"\\space":{},"\\nobreakspace":{className:"nobreak"}};lt({type:"spacing",htmlBuilder(e,t){if(wa.hasOwnProperty(e.text)){var r=wa[e.text].className||"";if("text"===e.mode){var a=Je.makeOrd(e,t,"textord");return a.classes.push(r),a}return Je.makeSpan(["mspace",r],[Je.mathsym(e.text,e.mode,t)],t)}if(xa.hasOwnProperty(e.text))return Je.makeSpan(["mspace",xa[e.text]],[],t);throw new i('Unknown type of space "'+e.text+'"')},mathmlBuilder(e,t){if(!wa.hasOwnProperty(e.text)){if(xa.hasOwnProperty(e.text))return new Bt.MathNode("mspace");throw new i('Unknown type of space "'+e.text+'"')}return new Bt.MathNode("mtext",[new Bt.TextNode("\xa0")])}});var ka=()=>{var e=new Bt.MathNode("mtd",[]);return e.setAttribute("width","50%"),e};lt({type:"tag",mathmlBuilder(e,t){var r=new Bt.MathNode("mtable",[new Bt.MathNode("mtr",[ka(),new Bt.MathNode("mtd",[Ht(e.body,t)]),ka(),new Bt.MathNode("mtd",[Ht(e.tag,t)])])]);return r.setAttribute("width","100%"),r}});var Sa={"\\text":void 0,"\\textrm":"textrm","\\textsf":"textsf","\\texttt":"texttt","\\textnormal":"textrm"},Ma={"\\textbf":"textbf","\\textmd":"textmd"},za={"\\textit":"textit","\\textup":"textup"},Aa=(e,t)=>{var r=e.font;return r?Sa[r]?t.withTextFontFamily(Sa[r]):Ma[r]?t.withTextFontWeight(Ma[r]):"\\emph"===r?"textit"===t.fontShape?t.withTextFontShape("textup"):t.withTextFontShape("textit"):t.withTextFontShape(za[r]):t};st({type:"text",names:["\\text","\\textrm","\\textsf","\\texttt","\\textnormal","\\textbf","\\textmd","\\textit","\\textup","\\emph"],props:{numArgs:1,argTypes:["text"],allowedInArgument:!0,allowedInText:!0},handler(e,t){var{parser:r,funcName:a}=e,n=t[0];return{type:"text",mode:r.mode,body:mt(n),font:a}},htmlBuilder(e,t){var r=Aa(e,t),a=ft(e.body,r,!0);return Je.makeSpan(["mord","text"],a,r)},mathmlBuilder(e,t){var r=Aa(e,t);return Ht(e.body,r)}}),st({type:"underline",names:["\\underline"],props:{numArgs:1,allowedInText:!0},handler(e,t){var{parser:r}=e;return{type:"underline",mode:r.mode,body:t[0]}},htmlBuilder(e,t){var r=kt(e.body,t),a=Je.makeLineSpan("underline-line",t),n=t.fontMetrics().defaultRuleThickness,i=Je.makeVList({positionType:"top",positionData:r.height,children:[{type:"kern",size:n},{type:"elem",elem:a},{type:"kern",size:3*n},{type:"elem",elem:r}]},t);return Je.makeSpan(["mord","underline"],[i],t)},mathmlBuilder(e,t){var r=new Bt.MathNode("mo",[new Bt.TextNode("\u203e")]);r.setAttribute("stretchy","true");var a=new Bt.MathNode("munder",[Ot(e.body,t),r]);return a.setAttribute("accentunder","true"),a}}),st({type:"vcenter",names:["\\vcenter"],props:{numArgs:1,argTypes:["original"],allowedInText:!1},handler(e,t){var{parser:r}=e;return{type:"vcenter",mode:r.mode,body:t[0]}},htmlBuilder(e,t){var r=kt(e.body,t),a=t.fontMetrics().axisHeight,n=.5*(r.height-a-(r.depth+a));return Je.makeVList({positionType:"shift",positionData:n,children:[{type:"elem",elem:r}]},t)},mathmlBuilder:(e,t)=>new Bt.MathNode("mpadded",[Ot(e.body,t)],["vcenter"])}),st({type:"verb",names:["\\verb"],props:{numArgs:0,allowedInText:!0},handler(e,t,r){throw new i("\\verb ended by end of line instead of matching delimiter")},htmlBuilder(e,t){for(var r=Ta(e),a=[],n=t.havingStyle(t.style.text()),i=0;ie.body.replace(/ /g,e.star?"\u2423":"\xa0"),Ba=nt,Ca="[ \r\n\t]",Na="(\\\\[a-zA-Z@]+)"+Ca+"*",qa="[\u0300-\u036f]",Ia=new RegExp(qa+"+$"),Ra="("+Ca+"+)|\\\\(\n|[ \r\t]+\n?)[ \r\t]*|([!-\\[\\]-\u2027\u202a-\ud7ff\uf900-\uffff]"+qa+"*|[\ud800-\udbff][\udc00-\udfff]"+qa+"*|\\\\verb\\*([^]).*?\\4|\\\\verb([^*a-zA-Z]).*?\\5|"+Na+"|\\\\[^\ud800-\udfff])";class Ha{constructor(e,t){this.input=void 0,this.settings=void 0,this.tokenRegex=void 0,this.catcodes=void 0,this.input=e,this.settings=t,this.tokenRegex=new RegExp(Ra,"g"),this.catcodes={"%":14,"~":13}}setCatcode(e,t){this.catcodes[e]=t}lex(){var e=this.input,t=this.tokenRegex.lastIndex;if(t===e.length)return new n("EOF",new a(this,t,t));var r=this.tokenRegex.exec(e);if(null===r||r.index!==t)throw new i("Unexpected character: '"+e[t]+"'",new n(e[t],new a(this,t,t+1)));var o=r[6]||r[3]||(r[2]?"\\ ":" ");if(14===this.catcodes[o]){var s=e.indexOf("\n",this.tokenRegex.lastIndex);return-1===s?(this.tokenRegex.lastIndex=e.length,this.settings.reportNonstrict("commentAtEnd","% comment has no terminating newline; LaTeX would fail because of commenting the end of math mode (e.g. $)")):this.tokenRegex.lastIndex=s+1,this.lex()}return new n(o,new a(this,t,this.tokenRegex.lastIndex))}}class Oa{constructor(e,t){void 0===e&&(e={}),void 0===t&&(t={}),this.current=void 0,this.builtins=void 0,this.undefStack=void 0,this.current=t,this.builtins=e,this.undefStack=[]}beginGroup(){this.undefStack.push({})}endGroup(){if(0===this.undefStack.length)throw new i("Unbalanced namespace destruction: attempt to pop global namespace; please report this as a bug");var e=this.undefStack.pop();for(var t in e)e.hasOwnProperty(t)&&(null==e[t]?delete this.current[t]:this.current[t]=e[t])}endGroups(){for(;this.undefStack.length>0;)this.endGroup()}has(e){return this.current.hasOwnProperty(e)||this.builtins.hasOwnProperty(e)}get(e){return this.current.hasOwnProperty(e)?this.current[e]:this.builtins[e]}set(e,t,r){if(void 0===r&&(r=!1),r){for(var a=0;a0&&(this.undefStack[this.undefStack.length-1][e]=t)}else{var n=this.undefStack[this.undefStack.length-1];n&&!n.hasOwnProperty(e)&&(n[e]=this.current[e])}null==t?delete this.current[e]:this.current[e]=t}}var Ea=Pr;Fr("\\noexpand",(function(e){var t=e.popToken();return e.isExpandable(t.text)&&(t.noexpand=!0,t.treatAsRelax=!0),{tokens:[t],numArgs:0}})),Fr("\\expandafter",(function(e){var t=e.popToken();return e.expandOnce(!0),{tokens:[t],numArgs:0}})),Fr("\\@firstoftwo",(function(e){return{tokens:e.consumeArgs(2)[0],numArgs:0}})),Fr("\\@secondoftwo",(function(e){return{tokens:e.consumeArgs(2)[1],numArgs:0}})),Fr("\\@ifnextchar",(function(e){var t=e.consumeArgs(3);e.consumeSpaces();var r=e.future();return 1===t[0].length&&t[0][0].text===r.text?{tokens:t[1],numArgs:0}:{tokens:t[2],numArgs:0}})),Fr("\\@ifstar","\\@ifnextchar *{\\@firstoftwo{#1}}"),Fr("\\TextOrMath",(function(e){var t=e.consumeArgs(2);return"text"===e.mode?{tokens:t[0],numArgs:0}:{tokens:t[1],numArgs:0}}));var La={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,a:10,A:10,b:11,B:11,c:12,C:12,d:13,D:13,e:14,E:14,f:15,F:15};Fr("\\char",(function(e){var t,r=e.popToken(),a="";if("'"===r.text)t=8,r=e.popToken();else if('"'===r.text)t=16,r=e.popToken();else if("`"===r.text)if("\\"===(r=e.popToken()).text[0])a=r.text.charCodeAt(1);else{if("EOF"===r.text)throw new i("\\char` missing argument");a=r.text.charCodeAt(0)}else t=10;if(t){if(null==(a=La[r.text])||a>=t)throw new i("Invalid base-"+t+" digit "+r.text);for(var n;null!=(n=La[e.future().text])&&n{var n=e.consumeArg().tokens;if(1!==n.length)throw new i("\\newcommand's first argument must be a macro name");var o=n[0].text,s=e.isDefined(o);if(s&&!t)throw new i("\\newcommand{"+o+"} attempting to redefine "+o+"; use \\renewcommand");if(!s&&!r)throw new i("\\renewcommand{"+o+"} when command "+o+" does not yet exist; use \\newcommand");var l=0;if(1===(n=e.consumeArg().tokens).length&&"["===n[0].text){for(var h="",m=e.expandNextToken();"]"!==m.text&&"EOF"!==m.text;)h+=m.text,m=e.expandNextToken();if(!h.match(/^\s*[0-9]+\s*$/))throw new i("Invalid number of arguments: "+h);l=parseInt(h),n=e.consumeArg().tokens}return s&&a||e.macros.set(o,{tokens:n,numArgs:l}),""};Fr("\\newcommand",(e=>Da(e,!1,!0,!1))),Fr("\\renewcommand",(e=>Da(e,!0,!1,!1))),Fr("\\providecommand",(e=>Da(e,!0,!0,!0))),Fr("\\message",(e=>{var t=e.consumeArgs(1)[0];return console.log(t.reverse().map((e=>e.text)).join("")),""})),Fr("\\errmessage",(e=>{var t=e.consumeArgs(1)[0];return console.error(t.reverse().map((e=>e.text)).join("")),""})),Fr("\\show",(e=>{var t=e.popToken(),r=t.text;return console.log(t,e.macros.get(r),Ba[r],ie.math[r],ie.text[r]),""})),Fr("\\bgroup","{"),Fr("\\egroup","}"),Fr("~","\\nobreakspace"),Fr("\\lq","`"),Fr("\\rq","'"),Fr("\\aa","\\r a"),Fr("\\AA","\\r A"),Fr("\\textcopyright","\\html@mathml{\\textcircled{c}}{\\char`\xa9}"),Fr("\\copyright","\\TextOrMath{\\textcopyright}{\\text{\\textcopyright}}"),Fr("\\textregistered","\\html@mathml{\\textcircled{\\scriptsize R}}{\\char`\xae}"),Fr("\u212c","\\mathscr{B}"),Fr("\u2130","\\mathscr{E}"),Fr("\u2131","\\mathscr{F}"),Fr("\u210b","\\mathscr{H}"),Fr("\u2110","\\mathscr{I}"),Fr("\u2112","\\mathscr{L}"),Fr("\u2133","\\mathscr{M}"),Fr("\u211b","\\mathscr{R}"),Fr("\u212d","\\mathfrak{C}"),Fr("\u210c","\\mathfrak{H}"),Fr("\u2128","\\mathfrak{Z}"),Fr("\\Bbbk","\\Bbb{k}"),Fr("\xb7","\\cdotp"),Fr("\\llap","\\mathllap{\\textrm{#1}}"),Fr("\\rlap","\\mathrlap{\\textrm{#1}}"),Fr("\\clap","\\mathclap{\\textrm{#1}}"),Fr("\\mathstrut","\\vphantom{(}"),Fr("\\underbar","\\underline{\\text{#1}}"),Fr("\\not",'\\html@mathml{\\mathrel{\\mathrlap\\@not}}{\\char"338}'),Fr("\\neq","\\html@mathml{\\mathrel{\\not=}}{\\mathrel{\\char`\u2260}}"),Fr("\\ne","\\neq"),Fr("\u2260","\\neq"),Fr("\\notin","\\html@mathml{\\mathrel{{\\in}\\mathllap{/\\mskip1mu}}}{\\mathrel{\\char`\u2209}}"),Fr("\u2209","\\notin"),Fr("\u2258","\\html@mathml{\\mathrel{=\\kern{-1em}\\raisebox{0.4em}{$\\scriptsize\\frown$}}}{\\mathrel{\\char`\u2258}}"),Fr("\u2259","\\html@mathml{\\stackrel{\\tiny\\wedge}{=}}{\\mathrel{\\char`\u2258}}"),Fr("\u225a","\\html@mathml{\\stackrel{\\tiny\\vee}{=}}{\\mathrel{\\char`\u225a}}"),Fr("\u225b","\\html@mathml{\\stackrel{\\scriptsize\\star}{=}}{\\mathrel{\\char`\u225b}}"),Fr("\u225d","\\html@mathml{\\stackrel{\\tiny\\mathrm{def}}{=}}{\\mathrel{\\char`\u225d}}"),Fr("\u225e","\\html@mathml{\\stackrel{\\tiny\\mathrm{m}}{=}}{\\mathrel{\\char`\u225e}}"),Fr("\u225f","\\html@mathml{\\stackrel{\\tiny?}{=}}{\\mathrel{\\char`\u225f}}"),Fr("\u27c2","\\perp"),Fr("\u203c","\\mathclose{!\\mkern-0.8mu!}"),Fr("\u220c","\\notni"),Fr("\u231c","\\ulcorner"),Fr("\u231d","\\urcorner"),Fr("\u231e","\\llcorner"),Fr("\u231f","\\lrcorner"),Fr("\xa9","\\copyright"),Fr("\xae","\\textregistered"),Fr("\ufe0f","\\textregistered"),Fr("\\ulcorner",'\\html@mathml{\\@ulcorner}{\\mathop{\\char"231c}}'),Fr("\\urcorner",'\\html@mathml{\\@urcorner}{\\mathop{\\char"231d}}'),Fr("\\llcorner",'\\html@mathml{\\@llcorner}{\\mathop{\\char"231e}}'),Fr("\\lrcorner",'\\html@mathml{\\@lrcorner}{\\mathop{\\char"231f}}'),Fr("\\vdots","{\\varvdots\\rule{0pt}{15pt}}"),Fr("\u22ee","\\vdots"),Fr("\\varGamma","\\mathit{\\Gamma}"),Fr("\\varDelta","\\mathit{\\Delta}"),Fr("\\varTheta","\\mathit{\\Theta}"),Fr("\\varLambda","\\mathit{\\Lambda}"),Fr("\\varXi","\\mathit{\\Xi}"),Fr("\\varPi","\\mathit{\\Pi}"),Fr("\\varSigma","\\mathit{\\Sigma}"),Fr("\\varUpsilon","\\mathit{\\Upsilon}"),Fr("\\varPhi","\\mathit{\\Phi}"),Fr("\\varPsi","\\mathit{\\Psi}"),Fr("\\varOmega","\\mathit{\\Omega}"),Fr("\\substack","\\begin{subarray}{c}#1\\end{subarray}"),Fr("\\colon","\\nobreak\\mskip2mu\\mathpunct{}\\mathchoice{\\mkern-3mu}{\\mkern-3mu}{}{}{:}\\mskip6mu\\relax"),Fr("\\boxed","\\fbox{$\\displaystyle{#1}$}"),Fr("\\iff","\\DOTSB\\;\\Longleftrightarrow\\;"),Fr("\\implies","\\DOTSB\\;\\Longrightarrow\\;"),Fr("\\impliedby","\\DOTSB\\;\\Longleftarrow\\;"),Fr("\\dddot","{\\overset{\\raisebox{-0.1ex}{\\normalsize ...}}{#1}}"),Fr("\\ddddot","{\\overset{\\raisebox{-0.1ex}{\\normalsize ....}}{#1}}");var Va={",":"\\dotsc","\\not":"\\dotsb","+":"\\dotsb","=":"\\dotsb","<":"\\dotsb",">":"\\dotsb","-":"\\dotsb","*":"\\dotsb",":":"\\dotsb","\\DOTSB":"\\dotsb","\\coprod":"\\dotsb","\\bigvee":"\\dotsb","\\bigwedge":"\\dotsb","\\biguplus":"\\dotsb","\\bigcap":"\\dotsb","\\bigcup":"\\dotsb","\\prod":"\\dotsb","\\sum":"\\dotsb","\\bigotimes":"\\dotsb","\\bigoplus":"\\dotsb","\\bigodot":"\\dotsb","\\bigsqcup":"\\dotsb","\\And":"\\dotsb","\\longrightarrow":"\\dotsb","\\Longrightarrow":"\\dotsb","\\longleftarrow":"\\dotsb","\\Longleftarrow":"\\dotsb","\\longleftrightarrow":"\\dotsb","\\Longleftrightarrow":"\\dotsb","\\mapsto":"\\dotsb","\\longmapsto":"\\dotsb","\\hookrightarrow":"\\dotsb","\\doteq":"\\dotsb","\\mathbin":"\\dotsb","\\mathrel":"\\dotsb","\\relbar":"\\dotsb","\\Relbar":"\\dotsb","\\xrightarrow":"\\dotsb","\\xleftarrow":"\\dotsb","\\DOTSI":"\\dotsi","\\int":"\\dotsi","\\oint":"\\dotsi","\\iint":"\\dotsi","\\iiint":"\\dotsi","\\iiiint":"\\dotsi","\\idotsint":"\\dotsi","\\DOTSX":"\\dotsx"};Fr("\\dots",(function(e){var t="\\dotso",r=e.expandAfterFuture().text;return r in Va?t=Va[r]:("\\not"===r.slice(0,4)||r in ie.math&&m.contains(["bin","rel"],ie.math[r].group))&&(t="\\dotsb"),t}));var Pa={")":!0,"]":!0,"\\rbrack":!0,"\\}":!0,"\\rbrace":!0,"\\rangle":!0,"\\rceil":!0,"\\rfloor":!0,"\\rgroup":!0,"\\rmoustache":!0,"\\right":!0,"\\bigr":!0,"\\biggr":!0,"\\Bigr":!0,"\\Biggr":!0,$:!0,";":!0,".":!0,",":!0};Fr("\\dotso",(function(e){return e.future().text in Pa?"\\ldots\\,":"\\ldots"})),Fr("\\dotsc",(function(e){var t=e.future().text;return t in Pa&&","!==t?"\\ldots\\,":"\\ldots"})),Fr("\\cdots",(function(e){return e.future().text in Pa?"\\@cdots\\,":"\\@cdots"})),Fr("\\dotsb","\\cdots"),Fr("\\dotsm","\\cdots"),Fr("\\dotsi","\\!\\cdots"),Fr("\\dotsx","\\ldots\\,"),Fr("\\DOTSI","\\relax"),Fr("\\DOTSB","\\relax"),Fr("\\DOTSX","\\relax"),Fr("\\tmspace","\\TextOrMath{\\kern#1#3}{\\mskip#1#2}\\relax"),Fr("\\,","\\tmspace+{3mu}{.1667em}"),Fr("\\thinspace","\\,"),Fr("\\>","\\mskip{4mu}"),Fr("\\:","\\tmspace+{4mu}{.2222em}"),Fr("\\medspace","\\:"),Fr("\\;","\\tmspace+{5mu}{.2777em}"),Fr("\\thickspace","\\;"),Fr("\\!","\\tmspace-{3mu}{.1667em}"),Fr("\\negthinspace","\\!"),Fr("\\negmedspace","\\tmspace-{4mu}{.2222em}"),Fr("\\negthickspace","\\tmspace-{5mu}{.277em}"),Fr("\\enspace","\\kern.5em "),Fr("\\enskip","\\hskip.5em\\relax"),Fr("\\quad","\\hskip1em\\relax"),Fr("\\qquad","\\hskip2em\\relax"),Fr("\\tag","\\@ifstar\\tag@literal\\tag@paren"),Fr("\\tag@paren","\\tag@literal{({#1})}"),Fr("\\tag@literal",(e=>{if(e.macros.get("\\df@tag"))throw new i("Multiple \\tag");return"\\gdef\\df@tag{\\text{#1}}"})),Fr("\\bmod","\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}\\mathbin{\\rm mod}\\mathchoice{\\mskip1mu}{\\mskip1mu}{\\mskip5mu}{\\mskip5mu}"),Fr("\\pod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern8mu}{\\mkern8mu}{\\mkern8mu}(#1)"),Fr("\\pmod","\\pod{{\\rm mod}\\mkern6mu#1}"),Fr("\\mod","\\allowbreak\\mathchoice{\\mkern18mu}{\\mkern12mu}{\\mkern12mu}{\\mkern12mu}{\\rm mod}\\,\\,#1"),Fr("\\newline","\\\\\\relax"),Fr("\\TeX","\\textrm{\\html@mathml{T\\kern-.1667em\\raisebox{-.5ex}{E}\\kern-.125emX}{TeX}}");var Fa=G(C["Main-Regular"]["T".charCodeAt(0)][1]-.7*C["Main-Regular"]["A".charCodeAt(0)][1]);Fr("\\LaTeX","\\textrm{\\html@mathml{L\\kern-.36em\\raisebox{"+Fa+"}{\\scriptstyle A}\\kern-.15em\\TeX}{LaTeX}}"),Fr("\\KaTeX","\\textrm{\\html@mathml{K\\kern-.17em\\raisebox{"+Fa+"}{\\scriptstyle A}\\kern-.15em\\TeX}{KaTeX}}"),Fr("\\hspace","\\@ifstar\\@hspacer\\@hspace"),Fr("\\@hspace","\\hskip #1\\relax"),Fr("\\@hspacer","\\rule{0pt}{0pt}\\hskip #1\\relax"),Fr("\\ordinarycolon",":"),Fr("\\vcentcolon","\\mathrel{\\mathop\\ordinarycolon}"),Fr("\\dblcolon",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}}{\\mathop{\\char"2237}}'),Fr("\\coloneqq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2254}}'),Fr("\\Coloneqq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}=}}{\\mathop{\\char"2237\\char"3d}}'),Fr("\\coloneq",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"3a\\char"2212}}'),Fr("\\Coloneq",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}}{\\mathop{\\char"2237\\char"2212}}'),Fr("\\eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2255}}'),Fr("\\Eqqcolon",'\\html@mathml{\\mathrel{=\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"3d\\char"2237}}'),Fr("\\eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}}{\\mathop{\\char"2239}}'),Fr("\\Eqcolon",'\\html@mathml{\\mathrel{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}}{\\mathop{\\char"2212\\char"2237}}'),Fr("\\colonapprox",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"3a\\char"2248}}'),Fr("\\Colonapprox",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}}{\\mathop{\\char"2237\\char"2248}}'),Fr("\\colonsim",'\\html@mathml{\\mathrel{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"3a\\char"223c}}'),Fr("\\Colonsim",'\\html@mathml{\\mathrel{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}}{\\mathop{\\char"2237\\char"223c}}'),Fr("\u2237","\\dblcolon"),Fr("\u2239","\\eqcolon"),Fr("\u2254","\\coloneqq"),Fr("\u2255","\\eqqcolon"),Fr("\u2a74","\\Coloneqq"),Fr("\\ratio","\\vcentcolon"),Fr("\\coloncolon","\\dblcolon"),Fr("\\colonequals","\\coloneqq"),Fr("\\coloncolonequals","\\Coloneqq"),Fr("\\equalscolon","\\eqqcolon"),Fr("\\equalscoloncolon","\\Eqqcolon"),Fr("\\colonminus","\\coloneq"),Fr("\\coloncolonminus","\\Coloneq"),Fr("\\minuscolon","\\eqcolon"),Fr("\\minuscoloncolon","\\Eqcolon"),Fr("\\coloncolonapprox","\\Colonapprox"),Fr("\\coloncolonsim","\\Colonsim"),Fr("\\simcolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),Fr("\\simcoloncolon","\\mathrel{\\sim\\mathrel{\\mkern-1.2mu}\\dblcolon}"),Fr("\\approxcolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\vcentcolon}"),Fr("\\approxcoloncolon","\\mathrel{\\approx\\mathrel{\\mkern-1.2mu}\\dblcolon}"),Fr("\\notni","\\html@mathml{\\not\\ni}{\\mathrel{\\char`\u220c}}"),Fr("\\limsup","\\DOTSB\\operatorname*{lim\\,sup}"),Fr("\\liminf","\\DOTSB\\operatorname*{lim\\,inf}"),Fr("\\injlim","\\DOTSB\\operatorname*{inj\\,lim}"),Fr("\\projlim","\\DOTSB\\operatorname*{proj\\,lim}"),Fr("\\varlimsup","\\DOTSB\\operatorname*{\\overline{lim}}"),Fr("\\varliminf","\\DOTSB\\operatorname*{\\underline{lim}}"),Fr("\\varinjlim","\\DOTSB\\operatorname*{\\underrightarrow{lim}}"),Fr("\\varprojlim","\\DOTSB\\operatorname*{\\underleftarrow{lim}}"),Fr("\\gvertneqq","\\html@mathml{\\@gvertneqq}{\u2269}"),Fr("\\lvertneqq","\\html@mathml{\\@lvertneqq}{\u2268}"),Fr("\\ngeqq","\\html@mathml{\\@ngeqq}{\u2271}"),Fr("\\ngeqslant","\\html@mathml{\\@ngeqslant}{\u2271}"),Fr("\\nleqq","\\html@mathml{\\@nleqq}{\u2270}"),Fr("\\nleqslant","\\html@mathml{\\@nleqslant}{\u2270}"),Fr("\\nshortmid","\\html@mathml{\\@nshortmid}{\u2224}"),Fr("\\nshortparallel","\\html@mathml{\\@nshortparallel}{\u2226}"),Fr("\\nsubseteqq","\\html@mathml{\\@nsubseteqq}{\u2288}"),Fr("\\nsupseteqq","\\html@mathml{\\@nsupseteqq}{\u2289}"),Fr("\\varsubsetneq","\\html@mathml{\\@varsubsetneq}{\u228a}"),Fr("\\varsubsetneqq","\\html@mathml{\\@varsubsetneqq}{\u2acb}"),Fr("\\varsupsetneq","\\html@mathml{\\@varsupsetneq}{\u228b}"),Fr("\\varsupsetneqq","\\html@mathml{\\@varsupsetneqq}{\u2acc}"),Fr("\\imath","\\html@mathml{\\@imath}{\u0131}"),Fr("\\jmath","\\html@mathml{\\@jmath}{\u0237}"),Fr("\\llbracket","\\html@mathml{\\mathopen{[\\mkern-3.2mu[}}{\\mathopen{\\char`\u27e6}}"),Fr("\\rrbracket","\\html@mathml{\\mathclose{]\\mkern-3.2mu]}}{\\mathclose{\\char`\u27e7}}"),Fr("\u27e6","\\llbracket"),Fr("\u27e7","\\rrbracket"),Fr("\\lBrace","\\html@mathml{\\mathopen{\\{\\mkern-3.2mu[}}{\\mathopen{\\char`\u2983}}"),Fr("\\rBrace","\\html@mathml{\\mathclose{]\\mkern-3.2mu\\}}}{\\mathclose{\\char`\u2984}}"),Fr("\u2983","\\lBrace"),Fr("\u2984","\\rBrace"),Fr("\\minuso","\\mathbin{\\html@mathml{{\\mathrlap{\\mathchoice{\\kern{0.145em}}{\\kern{0.145em}}{\\kern{0.1015em}}{\\kern{0.0725em}}\\circ}{-}}}{\\char`\u29b5}}"),Fr("\u29b5","\\minuso"),Fr("\\darr","\\downarrow"),Fr("\\dArr","\\Downarrow"),Fr("\\Darr","\\Downarrow"),Fr("\\lang","\\langle"),Fr("\\rang","\\rangle"),Fr("\\uarr","\\uparrow"),Fr("\\uArr","\\Uparrow"),Fr("\\Uarr","\\Uparrow"),Fr("\\N","\\mathbb{N}"),Fr("\\R","\\mathbb{R}"),Fr("\\Z","\\mathbb{Z}"),Fr("\\alef","\\aleph"),Fr("\\alefsym","\\aleph"),Fr("\\Alpha","\\mathrm{A}"),Fr("\\Beta","\\mathrm{B}"),Fr("\\bull","\\bullet"),Fr("\\Chi","\\mathrm{X}"),Fr("\\clubs","\\clubsuit"),Fr("\\cnums","\\mathbb{C}"),Fr("\\Complex","\\mathbb{C}"),Fr("\\Dagger","\\ddagger"),Fr("\\diamonds","\\diamondsuit"),Fr("\\empty","\\emptyset"),Fr("\\Epsilon","\\mathrm{E}"),Fr("\\Eta","\\mathrm{H}"),Fr("\\exist","\\exists"),Fr("\\harr","\\leftrightarrow"),Fr("\\hArr","\\Leftrightarrow"),Fr("\\Harr","\\Leftrightarrow"),Fr("\\hearts","\\heartsuit"),Fr("\\image","\\Im"),Fr("\\infin","\\infty"),Fr("\\Iota","\\mathrm{I}"),Fr("\\isin","\\in"),Fr("\\Kappa","\\mathrm{K}"),Fr("\\larr","\\leftarrow"),Fr("\\lArr","\\Leftarrow"),Fr("\\Larr","\\Leftarrow"),Fr("\\lrarr","\\leftrightarrow"),Fr("\\lrArr","\\Leftrightarrow"),Fr("\\Lrarr","\\Leftrightarrow"),Fr("\\Mu","\\mathrm{M}"),Fr("\\natnums","\\mathbb{N}"),Fr("\\Nu","\\mathrm{N}"),Fr("\\Omicron","\\mathrm{O}"),Fr("\\plusmn","\\pm"),Fr("\\rarr","\\rightarrow"),Fr("\\rArr","\\Rightarrow"),Fr("\\Rarr","\\Rightarrow"),Fr("\\real","\\Re"),Fr("\\reals","\\mathbb{R}"),Fr("\\Reals","\\mathbb{R}"),Fr("\\Rho","\\mathrm{P}"),Fr("\\sdot","\\cdot"),Fr("\\sect","\\S"),Fr("\\spades","\\spadesuit"),Fr("\\sub","\\subset"),Fr("\\sube","\\subseteq"),Fr("\\supe","\\supseteq"),Fr("\\Tau","\\mathrm{T}"),Fr("\\thetasym","\\vartheta"),Fr("\\weierp","\\wp"),Fr("\\Zeta","\\mathrm{Z}"),Fr("\\argmin","\\DOTSB\\operatorname*{arg\\,min}"),Fr("\\argmax","\\DOTSB\\operatorname*{arg\\,max}"),Fr("\\plim","\\DOTSB\\mathop{\\operatorname{plim}}\\limits"),Fr("\\bra","\\mathinner{\\langle{#1}|}"),Fr("\\ket","\\mathinner{|{#1}\\rangle}"),Fr("\\braket","\\mathinner{\\langle{#1}\\rangle}"),Fr("\\Bra","\\left\\langle#1\\right|"),Fr("\\Ket","\\left|#1\\right\\rangle");var Ga=e=>t=>{var r=t.consumeArg().tokens,a=t.consumeArg().tokens,n=t.consumeArg().tokens,i=t.consumeArg().tokens,o=t.macros.get("|"),s=t.macros.get("\\|");t.macros.beginGroup();var l=t=>r=>{e&&(r.macros.set("|",o),n.length&&r.macros.set("\\|",s));var i=t;!t&&n.length&&("|"===r.future().text&&(r.popToken(),i=!0));return{tokens:i?n:a,numArgs:0}};t.macros.set("|",l(!1)),n.length&&t.macros.set("\\|",l(!0));var h=t.consumeArg().tokens,m=t.expandTokens([...i,...h,...r]);return t.macros.endGroup(),{tokens:m.reverse(),numArgs:0}};Fr("\\bra@ket",Ga(!1)),Fr("\\bra@set",Ga(!0)),Fr("\\Braket","\\bra@ket{\\left\\langle}{\\,\\middle\\vert\\,}{\\,\\middle\\vert\\,}{\\right\\rangle}"),Fr("\\Set","\\bra@set{\\left\\{\\:}{\\;\\middle\\vert\\;}{\\;\\middle\\Vert\\;}{\\:\\right\\}}"),Fr("\\set","\\bra@set{\\{\\,}{\\mid}{}{\\,\\}}"),Fr("\\angln","{\\angl n}"),Fr("\\blue","\\textcolor{##6495ed}{#1}"),Fr("\\orange","\\textcolor{##ffa500}{#1}"),Fr("\\pink","\\textcolor{##ff00af}{#1}"),Fr("\\red","\\textcolor{##df0030}{#1}"),Fr("\\green","\\textcolor{##28ae7b}{#1}"),Fr("\\gray","\\textcolor{gray}{#1}"),Fr("\\purple","\\textcolor{##9d38bd}{#1}"),Fr("\\blueA","\\textcolor{##ccfaff}{#1}"),Fr("\\blueB","\\textcolor{##80f6ff}{#1}"),Fr("\\blueC","\\textcolor{##63d9ea}{#1}"),Fr("\\blueD","\\textcolor{##11accd}{#1}"),Fr("\\blueE","\\textcolor{##0c7f99}{#1}"),Fr("\\tealA","\\textcolor{##94fff5}{#1}"),Fr("\\tealB","\\textcolor{##26edd5}{#1}"),Fr("\\tealC","\\textcolor{##01d1c1}{#1}"),Fr("\\tealD","\\textcolor{##01a995}{#1}"),Fr("\\tealE","\\textcolor{##208170}{#1}"),Fr("\\greenA","\\textcolor{##b6ffb0}{#1}"),Fr("\\greenB","\\textcolor{##8af281}{#1}"),Fr("\\greenC","\\textcolor{##74cf70}{#1}"),Fr("\\greenD","\\textcolor{##1fab54}{#1}"),Fr("\\greenE","\\textcolor{##0d923f}{#1}"),Fr("\\goldA","\\textcolor{##ffd0a9}{#1}"),Fr("\\goldB","\\textcolor{##ffbb71}{#1}"),Fr("\\goldC","\\textcolor{##ff9c39}{#1}"),Fr("\\goldD","\\textcolor{##e07d10}{#1}"),Fr("\\goldE","\\textcolor{##a75a05}{#1}"),Fr("\\redA","\\textcolor{##fca9a9}{#1}"),Fr("\\redB","\\textcolor{##ff8482}{#1}"),Fr("\\redC","\\textcolor{##f9685d}{#1}"),Fr("\\redD","\\textcolor{##e84d39}{#1}"),Fr("\\redE","\\textcolor{##bc2612}{#1}"),Fr("\\maroonA","\\textcolor{##ffbde0}{#1}"),Fr("\\maroonB","\\textcolor{##ff92c6}{#1}"),Fr("\\maroonC","\\textcolor{##ed5fa6}{#1}"),Fr("\\maroonD","\\textcolor{##ca337c}{#1}"),Fr("\\maroonE","\\textcolor{##9e034e}{#1}"),Fr("\\purpleA","\\textcolor{##ddd7ff}{#1}"),Fr("\\purpleB","\\textcolor{##c6b9fc}{#1}"),Fr("\\purpleC","\\textcolor{##aa87ff}{#1}"),Fr("\\purpleD","\\textcolor{##7854ab}{#1}"),Fr("\\purpleE","\\textcolor{##543b78}{#1}"),Fr("\\mintA","\\textcolor{##f5f9e8}{#1}"),Fr("\\mintB","\\textcolor{##edf2df}{#1}"),Fr("\\mintC","\\textcolor{##e0e5cc}{#1}"),Fr("\\grayA","\\textcolor{##f6f7f7}{#1}"),Fr("\\grayB","\\textcolor{##f0f1f2}{#1}"),Fr("\\grayC","\\textcolor{##e3e5e6}{#1}"),Fr("\\grayD","\\textcolor{##d6d8da}{#1}"),Fr("\\grayE","\\textcolor{##babec2}{#1}"),Fr("\\grayF","\\textcolor{##888d93}{#1}"),Fr("\\grayG","\\textcolor{##626569}{#1}"),Fr("\\grayH","\\textcolor{##3b3e40}{#1}"),Fr("\\grayI","\\textcolor{##21242c}{#1}"),Fr("\\kaBlue","\\textcolor{##314453}{#1}"),Fr("\\kaGreen","\\textcolor{##71B307}{#1}");var Ua={"^":!0,_:!0,"\\limits":!0,"\\nolimits":!0};class Ya{constructor(e,t,r){this.settings=void 0,this.expansionCount=void 0,this.lexer=void 0,this.macros=void 0,this.stack=void 0,this.mode=void 0,this.settings=t,this.expansionCount=0,this.feed(e),this.macros=new Oa(Ea,t.macros),this.mode=r,this.stack=[]}feed(e){this.lexer=new Ha(e,this.settings)}switchMode(e){this.mode=e}beginGroup(){this.macros.beginGroup()}endGroup(){this.macros.endGroup()}endGroups(){this.macros.endGroups()}future(){return 0===this.stack.length&&this.pushToken(this.lexer.lex()),this.stack[this.stack.length-1]}popToken(){return this.future(),this.stack.pop()}pushToken(e){this.stack.push(e)}pushTokens(e){this.stack.push(...e)}scanArgument(e){var t,r,a;if(e){if(this.consumeSpaces(),"["!==this.future().text)return null;t=this.popToken(),({tokens:a,end:r}=this.consumeArg(["]"]))}else({tokens:a,start:t,end:r}=this.consumeArg());return this.pushToken(new n("EOF",r.loc)),this.pushTokens(a),t.range(r,"")}consumeSpaces(){for(;;){if(" "!==this.future().text)break;this.stack.pop()}}consumeArg(e){var t=[],r=e&&e.length>0;r||this.consumeSpaces();var a,n=this.future(),o=0,s=0;do{if(a=this.popToken(),t.push(a),"{"===a.text)++o;else if("}"===a.text){if(-1===--o)throw new i("Extra }",a)}else if("EOF"===a.text)throw new i("Unexpected end of input in a macro argument, expected '"+(e&&r?e[s]:"}")+"'",a);if(e&&r)if((0===o||1===o&&"{"===e[s])&&a.text===e[s]){if(++s===e.length){t.splice(-s,s);break}}else s=0}while(0!==o||r);return"{"===n.text&&"}"===t[t.length-1].text&&(t.pop(),t.shift()),t.reverse(),{tokens:t,start:n,end:a}}consumeArgs(e,t){if(t){if(t.length!==e+1)throw new i("The length of delimiters doesn't match the number of args!");for(var r=t[0],a=0;athis.settings.maxExpand)throw new i("Too many expansions: infinite loop or need to increase maxExpand setting")}expandOnce(e){var t=this.popToken(),r=t.text,a=t.noexpand?null:this._getExpansion(r);if(null==a||e&&a.unexpandable){if(e&&null==a&&"\\"===r[0]&&!this.isDefined(r))throw new i("Undefined control sequence: "+r);return this.pushToken(t),!1}this.countExpansion(1);var n=a.tokens,o=this.consumeArgs(a.numArgs,a.delimiters);if(a.numArgs)for(var s=(n=n.slice()).length-1;s>=0;--s){var l=n[s];if("#"===l.text){if(0===s)throw new i("Incomplete placeholder at end of macro body",l);if("#"===(l=n[--s]).text)n.splice(s+1,1);else{if(!/^[1-9]$/.test(l.text))throw new i("Not a valid argument number",l);n.splice(s,2,...o[+l.text-1])}}}return this.pushTokens(n),n.length}expandAfterFuture(){return this.expandOnce(),this.future()}expandNextToken(){for(;;)if(!1===this.expandOnce()){var e=this.stack.pop();return e.treatAsRelax&&(e.text="\\relax"),e}throw new Error}expandMacro(e){return this.macros.has(e)?this.expandTokens([new n(e)]):void 0}expandTokens(e){var t=[],r=this.stack.length;for(this.pushTokens(e);this.stack.length>r;)if(!1===this.expandOnce(!0)){var a=this.stack.pop();a.treatAsRelax&&(a.noexpand=!1,a.treatAsRelax=!1),t.push(a)}return this.countExpansion(t.length),t}expandMacroAsText(e){var t=this.expandMacro(e);return t?t.map((e=>e.text)).join(""):t}_getExpansion(e){var t=this.macros.get(e);if(null==t)return t;if(1===e.length){var r=this.lexer.catcodes[e];if(null!=r&&13!==r)return}var a="function"===typeof t?t(this):t;if("string"===typeof a){var n=0;if(-1!==a.indexOf("#"))for(var i=a.replace(/##/g,"");-1!==i.indexOf("#"+(n+1));)++n;for(var o=new Ha(a,this.settings),s=[],l=o.lex();"EOF"!==l.text;)s.push(l),l=o.lex();return s.reverse(),{tokens:s,numArgs:n}}return a}isDefined(e){return this.macros.has(e)||Ba.hasOwnProperty(e)||ie.math.hasOwnProperty(e)||ie.text.hasOwnProperty(e)||Ua.hasOwnProperty(e)}isExpandable(e){var t=this.macros.get(e);return null!=t?"string"===typeof t||"function"===typeof t||!t.unexpandable:Ba.hasOwnProperty(e)&&!Ba[e].primitive}}var Xa=/^[\u208a\u208b\u208c\u208d\u208e\u2080\u2081\u2082\u2083\u2084\u2085\u2086\u2087\u2088\u2089\u2090\u2091\u2095\u1d62\u2c7c\u2096\u2097\u2098\u2099\u2092\u209a\u1d63\u209b\u209c\u1d64\u1d65\u2093\u1d66\u1d67\u1d68\u1d69\u1d6a]/,Wa=Object.freeze({"\u208a":"+","\u208b":"-","\u208c":"=","\u208d":"(","\u208e":")","\u2080":"0","\u2081":"1","\u2082":"2","\u2083":"3","\u2084":"4","\u2085":"5","\u2086":"6","\u2087":"7","\u2088":"8","\u2089":"9","\u2090":"a","\u2091":"e","\u2095":"h","\u1d62":"i","\u2c7c":"j","\u2096":"k","\u2097":"l","\u2098":"m","\u2099":"n","\u2092":"o","\u209a":"p","\u1d63":"r","\u209b":"s","\u209c":"t","\u1d64":"u","\u1d65":"v","\u2093":"x","\u1d66":"\u03b2","\u1d67":"\u03b3","\u1d68":"\u03c1","\u1d69":"\u03d5","\u1d6a":"\u03c7","\u207a":"+","\u207b":"-","\u207c":"=","\u207d":"(","\u207e":")","\u2070":"0","\xb9":"1","\xb2":"2","\xb3":"3","\u2074":"4","\u2075":"5","\u2076":"6","\u2077":"7","\u2078":"8","\u2079":"9","\u1d2c":"A","\u1d2e":"B","\u1d30":"D","\u1d31":"E","\u1d33":"G","\u1d34":"H","\u1d35":"I","\u1d36":"J","\u1d37":"K","\u1d38":"L","\u1d39":"M","\u1d3a":"N","\u1d3c":"O","\u1d3e":"P","\u1d3f":"R","\u1d40":"T","\u1d41":"U","\u2c7d":"V","\u1d42":"W","\u1d43":"a","\u1d47":"b","\u1d9c":"c","\u1d48":"d","\u1d49":"e","\u1da0":"f","\u1d4d":"g","\u02b0":"h","\u2071":"i","\u02b2":"j","\u1d4f":"k","\u02e1":"l","\u1d50":"m","\u207f":"n","\u1d52":"o","\u1d56":"p","\u02b3":"r","\u02e2":"s","\u1d57":"t","\u1d58":"u","\u1d5b":"v","\u02b7":"w","\u02e3":"x","\u02b8":"y","\u1dbb":"z","\u1d5d":"\u03b2","\u1d5e":"\u03b3","\u1d5f":"\u03b4","\u1d60":"\u03d5","\u1d61":"\u03c7","\u1dbf":"\u03b8"}),_a={"\u0301":{text:"\\'",math:"\\acute"},"\u0300":{text:"\\`",math:"\\grave"},"\u0308":{text:'\\"',math:"\\ddot"},"\u0303":{text:"\\~",math:"\\tilde"},"\u0304":{text:"\\=",math:"\\bar"},"\u0306":{text:"\\u",math:"\\breve"},"\u030c":{text:"\\v",math:"\\check"},"\u0302":{text:"\\^",math:"\\hat"},"\u0307":{text:"\\.",math:"\\dot"},"\u030a":{text:"\\r",math:"\\mathring"},"\u030b":{text:"\\H"},"\u0327":{text:"\\c"}},ja={"\xe1":"a\u0301","\xe0":"a\u0300","\xe4":"a\u0308","\u01df":"a\u0308\u0304","\xe3":"a\u0303","\u0101":"a\u0304","\u0103":"a\u0306","\u1eaf":"a\u0306\u0301","\u1eb1":"a\u0306\u0300","\u1eb5":"a\u0306\u0303","\u01ce":"a\u030c","\xe2":"a\u0302","\u1ea5":"a\u0302\u0301","\u1ea7":"a\u0302\u0300","\u1eab":"a\u0302\u0303","\u0227":"a\u0307","\u01e1":"a\u0307\u0304","\xe5":"a\u030a","\u01fb":"a\u030a\u0301","\u1e03":"b\u0307","\u0107":"c\u0301","\u1e09":"c\u0327\u0301","\u010d":"c\u030c","\u0109":"c\u0302","\u010b":"c\u0307","\xe7":"c\u0327","\u010f":"d\u030c","\u1e0b":"d\u0307","\u1e11":"d\u0327","\xe9":"e\u0301","\xe8":"e\u0300","\xeb":"e\u0308","\u1ebd":"e\u0303","\u0113":"e\u0304","\u1e17":"e\u0304\u0301","\u1e15":"e\u0304\u0300","\u0115":"e\u0306","\u1e1d":"e\u0327\u0306","\u011b":"e\u030c","\xea":"e\u0302","\u1ebf":"e\u0302\u0301","\u1ec1":"e\u0302\u0300","\u1ec5":"e\u0302\u0303","\u0117":"e\u0307","\u0229":"e\u0327","\u1e1f":"f\u0307","\u01f5":"g\u0301","\u1e21":"g\u0304","\u011f":"g\u0306","\u01e7":"g\u030c","\u011d":"g\u0302","\u0121":"g\u0307","\u0123":"g\u0327","\u1e27":"h\u0308","\u021f":"h\u030c","\u0125":"h\u0302","\u1e23":"h\u0307","\u1e29":"h\u0327","\xed":"i\u0301","\xec":"i\u0300","\xef":"i\u0308","\u1e2f":"i\u0308\u0301","\u0129":"i\u0303","\u012b":"i\u0304","\u012d":"i\u0306","\u01d0":"i\u030c","\xee":"i\u0302","\u01f0":"j\u030c","\u0135":"j\u0302","\u1e31":"k\u0301","\u01e9":"k\u030c","\u0137":"k\u0327","\u013a":"l\u0301","\u013e":"l\u030c","\u013c":"l\u0327","\u1e3f":"m\u0301","\u1e41":"m\u0307","\u0144":"n\u0301","\u01f9":"n\u0300","\xf1":"n\u0303","\u0148":"n\u030c","\u1e45":"n\u0307","\u0146":"n\u0327","\xf3":"o\u0301","\xf2":"o\u0300","\xf6":"o\u0308","\u022b":"o\u0308\u0304","\xf5":"o\u0303","\u1e4d":"o\u0303\u0301","\u1e4f":"o\u0303\u0308","\u022d":"o\u0303\u0304","\u014d":"o\u0304","\u1e53":"o\u0304\u0301","\u1e51":"o\u0304\u0300","\u014f":"o\u0306","\u01d2":"o\u030c","\xf4":"o\u0302","\u1ed1":"o\u0302\u0301","\u1ed3":"o\u0302\u0300","\u1ed7":"o\u0302\u0303","\u022f":"o\u0307","\u0231":"o\u0307\u0304","\u0151":"o\u030b","\u1e55":"p\u0301","\u1e57":"p\u0307","\u0155":"r\u0301","\u0159":"r\u030c","\u1e59":"r\u0307","\u0157":"r\u0327","\u015b":"s\u0301","\u1e65":"s\u0301\u0307","\u0161":"s\u030c","\u1e67":"s\u030c\u0307","\u015d":"s\u0302","\u1e61":"s\u0307","\u015f":"s\u0327","\u1e97":"t\u0308","\u0165":"t\u030c","\u1e6b":"t\u0307","\u0163":"t\u0327","\xfa":"u\u0301","\xf9":"u\u0300","\xfc":"u\u0308","\u01d8":"u\u0308\u0301","\u01dc":"u\u0308\u0300","\u01d6":"u\u0308\u0304","\u01da":"u\u0308\u030c","\u0169":"u\u0303","\u1e79":"u\u0303\u0301","\u016b":"u\u0304","\u1e7b":"u\u0304\u0308","\u016d":"u\u0306","\u01d4":"u\u030c","\xfb":"u\u0302","\u016f":"u\u030a","\u0171":"u\u030b","\u1e7d":"v\u0303","\u1e83":"w\u0301","\u1e81":"w\u0300","\u1e85":"w\u0308","\u0175":"w\u0302","\u1e87":"w\u0307","\u1e98":"w\u030a","\u1e8d":"x\u0308","\u1e8b":"x\u0307","\xfd":"y\u0301","\u1ef3":"y\u0300","\xff":"y\u0308","\u1ef9":"y\u0303","\u0233":"y\u0304","\u0177":"y\u0302","\u1e8f":"y\u0307","\u1e99":"y\u030a","\u017a":"z\u0301","\u017e":"z\u030c","\u1e91":"z\u0302","\u017c":"z\u0307","\xc1":"A\u0301","\xc0":"A\u0300","\xc4":"A\u0308","\u01de":"A\u0308\u0304","\xc3":"A\u0303","\u0100":"A\u0304","\u0102":"A\u0306","\u1eae":"A\u0306\u0301","\u1eb0":"A\u0306\u0300","\u1eb4":"A\u0306\u0303","\u01cd":"A\u030c","\xc2":"A\u0302","\u1ea4":"A\u0302\u0301","\u1ea6":"A\u0302\u0300","\u1eaa":"A\u0302\u0303","\u0226":"A\u0307","\u01e0":"A\u0307\u0304","\xc5":"A\u030a","\u01fa":"A\u030a\u0301","\u1e02":"B\u0307","\u0106":"C\u0301","\u1e08":"C\u0327\u0301","\u010c":"C\u030c","\u0108":"C\u0302","\u010a":"C\u0307","\xc7":"C\u0327","\u010e":"D\u030c","\u1e0a":"D\u0307","\u1e10":"D\u0327","\xc9":"E\u0301","\xc8":"E\u0300","\xcb":"E\u0308","\u1ebc":"E\u0303","\u0112":"E\u0304","\u1e16":"E\u0304\u0301","\u1e14":"E\u0304\u0300","\u0114":"E\u0306","\u1e1c":"E\u0327\u0306","\u011a":"E\u030c","\xca":"E\u0302","\u1ebe":"E\u0302\u0301","\u1ec0":"E\u0302\u0300","\u1ec4":"E\u0302\u0303","\u0116":"E\u0307","\u0228":"E\u0327","\u1e1e":"F\u0307","\u01f4":"G\u0301","\u1e20":"G\u0304","\u011e":"G\u0306","\u01e6":"G\u030c","\u011c":"G\u0302","\u0120":"G\u0307","\u0122":"G\u0327","\u1e26":"H\u0308","\u021e":"H\u030c","\u0124":"H\u0302","\u1e22":"H\u0307","\u1e28":"H\u0327","\xcd":"I\u0301","\xcc":"I\u0300","\xcf":"I\u0308","\u1e2e":"I\u0308\u0301","\u0128":"I\u0303","\u012a":"I\u0304","\u012c":"I\u0306","\u01cf":"I\u030c","\xce":"I\u0302","\u0130":"I\u0307","\u0134":"J\u0302","\u1e30":"K\u0301","\u01e8":"K\u030c","\u0136":"K\u0327","\u0139":"L\u0301","\u013d":"L\u030c","\u013b":"L\u0327","\u1e3e":"M\u0301","\u1e40":"M\u0307","\u0143":"N\u0301","\u01f8":"N\u0300","\xd1":"N\u0303","\u0147":"N\u030c","\u1e44":"N\u0307","\u0145":"N\u0327","\xd3":"O\u0301","\xd2":"O\u0300","\xd6":"O\u0308","\u022a":"O\u0308\u0304","\xd5":"O\u0303","\u1e4c":"O\u0303\u0301","\u1e4e":"O\u0303\u0308","\u022c":"O\u0303\u0304","\u014c":"O\u0304","\u1e52":"O\u0304\u0301","\u1e50":"O\u0304\u0300","\u014e":"O\u0306","\u01d1":"O\u030c","\xd4":"O\u0302","\u1ed0":"O\u0302\u0301","\u1ed2":"O\u0302\u0300","\u1ed6":"O\u0302\u0303","\u022e":"O\u0307","\u0230":"O\u0307\u0304","\u0150":"O\u030b","\u1e54":"P\u0301","\u1e56":"P\u0307","\u0154":"R\u0301","\u0158":"R\u030c","\u1e58":"R\u0307","\u0156":"R\u0327","\u015a":"S\u0301","\u1e64":"S\u0301\u0307","\u0160":"S\u030c","\u1e66":"S\u030c\u0307","\u015c":"S\u0302","\u1e60":"S\u0307","\u015e":"S\u0327","\u0164":"T\u030c","\u1e6a":"T\u0307","\u0162":"T\u0327","\xda":"U\u0301","\xd9":"U\u0300","\xdc":"U\u0308","\u01d7":"U\u0308\u0301","\u01db":"U\u0308\u0300","\u01d5":"U\u0308\u0304","\u01d9":"U\u0308\u030c","\u0168":"U\u0303","\u1e78":"U\u0303\u0301","\u016a":"U\u0304","\u1e7a":"U\u0304\u0308","\u016c":"U\u0306","\u01d3":"U\u030c","\xdb":"U\u0302","\u016e":"U\u030a","\u0170":"U\u030b","\u1e7c":"V\u0303","\u1e82":"W\u0301","\u1e80":"W\u0300","\u1e84":"W\u0308","\u0174":"W\u0302","\u1e86":"W\u0307","\u1e8c":"X\u0308","\u1e8a":"X\u0307","\xdd":"Y\u0301","\u1ef2":"Y\u0300","\u0178":"Y\u0308","\u1ef8":"Y\u0303","\u0232":"Y\u0304","\u0176":"Y\u0302","\u1e8e":"Y\u0307","\u0179":"Z\u0301","\u017d":"Z\u030c","\u1e90":"Z\u0302","\u017b":"Z\u0307","\u03ac":"\u03b1\u0301","\u1f70":"\u03b1\u0300","\u1fb1":"\u03b1\u0304","\u1fb0":"\u03b1\u0306","\u03ad":"\u03b5\u0301","\u1f72":"\u03b5\u0300","\u03ae":"\u03b7\u0301","\u1f74":"\u03b7\u0300","\u03af":"\u03b9\u0301","\u1f76":"\u03b9\u0300","\u03ca":"\u03b9\u0308","\u0390":"\u03b9\u0308\u0301","\u1fd2":"\u03b9\u0308\u0300","\u1fd1":"\u03b9\u0304","\u1fd0":"\u03b9\u0306","\u03cc":"\u03bf\u0301","\u1f78":"\u03bf\u0300","\u03cd":"\u03c5\u0301","\u1f7a":"\u03c5\u0300","\u03cb":"\u03c5\u0308","\u03b0":"\u03c5\u0308\u0301","\u1fe2":"\u03c5\u0308\u0300","\u1fe1":"\u03c5\u0304","\u1fe0":"\u03c5\u0306","\u03ce":"\u03c9\u0301","\u1f7c":"\u03c9\u0300","\u038e":"\u03a5\u0301","\u1fea":"\u03a5\u0300","\u03ab":"\u03a5\u0308","\u1fe9":"\u03a5\u0304","\u1fe8":"\u03a5\u0306","\u038f":"\u03a9\u0301","\u1ffa":"\u03a9\u0300"};class $a{constructor(e,t){this.mode=void 0,this.gullet=void 0,this.settings=void 0,this.leftrightDepth=void 0,this.nextToken=void 0,this.mode="math",this.gullet=new Ya(e,t,this.mode),this.settings=t,this.leftrightDepth=0}expect(e,t){if(void 0===t&&(t=!0),this.fetch().text!==e)throw new i("Expected '"+e+"', got '"+this.fetch().text+"'",this.fetch());t&&this.consume()}consume(){this.nextToken=null}fetch(){return null==this.nextToken&&(this.nextToken=this.gullet.expandNextToken()),this.nextToken}switchMode(e){this.mode=e,this.gullet.switchMode(e)}parse(){this.settings.globalGroup||this.gullet.beginGroup(),this.settings.colorIsTextColor&&this.gullet.macros.set("\\color","\\textcolor");try{var e=this.parseExpression(!1);return this.expect("EOF"),this.settings.globalGroup||this.gullet.endGroup(),e}finally{this.gullet.endGroups()}}subparse(e){var t=this.nextToken;this.consume(),this.gullet.pushToken(new n("}")),this.gullet.pushTokens(e);var r=this.parseExpression(!1);return this.expect("}"),this.nextToken=t,r}parseExpression(e,t){for(var r=[];;){"math"===this.mode&&this.consumeSpaces();var a=this.fetch();if(-1!==$a.endOfExpression.indexOf(a.text))break;if(t&&a.text===t)break;if(e&&Ba[a.text]&&Ba[a.text].infix)break;var n=this.parseAtom(t);if(!n)break;"internal"!==n.type&&r.push(n)}return"text"===this.mode&&this.formLigatures(r),this.handleInfixNodes(r)}handleInfixNodes(e){for(var t,r=-1,a=0;a=0&&this.settings.reportNonstrict("unicodeTextInMathMode",'Latin-1/Unicode text character "'+t[0]+'" used in math mode',e);var l,h=ie[this.mode][t].group,m=a.range(e);if(ae.hasOwnProperty(h)){var c=h;l={type:"atom",mode:this.mode,family:c,loc:m,text:t}}else l={type:h,mode:this.mode,loc:m,text:t};o=l}else{if(!(t.charCodeAt(0)>=128))return null;this.settings.strict&&(z(t.charCodeAt(0))?"math"===this.mode&&this.settings.reportNonstrict("unicodeTextInMathMode",'Unicode text character "'+t[0]+'" used in math mode',e):this.settings.reportNonstrict("unknownSymbol",'Unrecognized Unicode character "'+t[0]+'" ('+t.charCodeAt(0)+")",e)),o={type:"textord",mode:"text",loc:a.range(e),text:t}}if(this.consume(),s)for(var p=0;p 15) {\n left = \"…\" + input.slice(start - 15, start);\n } else {\n left = input.slice(0, start);\n }\n\n var right;\n\n if (end + 15 < input.length) {\n right = input.slice(end, end + 15) + \"…\";\n } else {\n right = input.slice(end);\n }\n\n error += left + underlined + right;\n } // Some hackery to make ParseError a prototype of Error\n // See http://stackoverflow.com/a/8460753\n // $FlowFixMe\n\n\n var self = new Error(error);\n self.name = \"ParseError\"; // $FlowFixMe\n\n self.__proto__ = ParseError.prototype;\n self.position = start;\n\n if (start != null && end != null) {\n self.length = end - start;\n }\n\n self.rawMessage = message;\n return self;\n }\n\n} // $FlowFixMe More hackery\n\n\nParseError.prototype.__proto__ = Error.prototype;\n\n/**\n * This file contains a list of utility functions which are useful in other\n * files.\n */\n\n/**\n * Return whether an element is contained in a list\n */\nvar contains = function contains(list, elem) {\n return list.indexOf(elem) !== -1;\n};\n/**\n * Provide a default value if a setting is undefined\n * NOTE: Couldn't use `T` as the output type due to facebook/flow#5022.\n */\n\n\nvar deflt = function deflt(setting, defaultIfUndefined) {\n return setting === undefined ? defaultIfUndefined : setting;\n}; // hyphenate and escape adapted from Facebook's React under Apache 2 license\n\n\nvar uppercase = /([A-Z])/g;\n\nvar hyphenate = function hyphenate(str) {\n return str.replace(uppercase, \"-$1\").toLowerCase();\n};\n\nvar ESCAPE_LOOKUP = {\n \"&\": \"&\",\n \">\": \">\",\n \"<\": \"<\",\n \"\\\"\": \""\",\n \"'\": \"'\"\n};\nvar ESCAPE_REGEX = /[&><\"']/g;\n/**\n * Escapes text to prevent scripting attacks.\n */\n\nfunction escape(text) {\n return String(text).replace(ESCAPE_REGEX, match => ESCAPE_LOOKUP[match]);\n}\n/**\n * Sometimes we want to pull out the innermost element of a group. In most\n * cases, this will just be the group itself, but when ordgroups and colors have\n * a single element, we want to pull that out.\n */\n\n\nvar getBaseElem = function getBaseElem(group) {\n if (group.type === \"ordgroup\") {\n if (group.body.length === 1) {\n return getBaseElem(group.body[0]);\n } else {\n return group;\n }\n } else if (group.type === \"color\") {\n if (group.body.length === 1) {\n return getBaseElem(group.body[0]);\n } else {\n return group;\n }\n } else if (group.type === \"font\") {\n return getBaseElem(group.body);\n } else {\n return group;\n }\n};\n/**\n * TeXbook algorithms often reference \"character boxes\", which are simply groups\n * with a single character in them. To decide if something is a character box,\n * we find its innermost group, and see if it is a single character.\n */\n\n\nvar isCharacterBox = function isCharacterBox(group) {\n var baseElem = getBaseElem(group); // These are all they types of groups which hold single characters\n\n return baseElem.type === \"mathord\" || baseElem.type === \"textord\" || baseElem.type === \"atom\";\n};\n\nvar assert = function assert(value) {\n if (!value) {\n throw new Error('Expected non-null, but got ' + String(value));\n }\n\n return value;\n};\n/**\n * Return the protocol of a URL, or \"_relative\" if the URL does not specify a\n * protocol (and thus is relative), or `null` if URL has invalid protocol\n * (so should be outright rejected).\n */\n\nvar protocolFromUrl = function protocolFromUrl(url) {\n // Check for possible leading protocol.\n // https://url.spec.whatwg.org/#url-parsing strips leading whitespace\n // (U+20) or C0 control (U+00-U+1F) characters.\n // eslint-disable-next-line no-control-regex\n var protocol = /^[\\x00-\\x20]*([^\\\\/#?]*?)(:|�*58|�*3a|&colon)/i.exec(url);\n\n if (!protocol) {\n return \"_relative\";\n } // Reject weird colons\n\n\n if (protocol[2] !== \":\") {\n return null;\n } // Reject invalid characters in scheme according to\n // https://datatracker.ietf.org/doc/html/rfc3986#section-3.1\n\n\n if (!/^[a-zA-Z][a-zA-Z0-9+\\-.]*$/.test(protocol[1])) {\n return null;\n } // Lowercase the protocol\n\n\n return protocol[1].toLowerCase();\n};\nvar utils = {\n contains,\n deflt,\n escape,\n hyphenate,\n getBaseElem,\n isCharacterBox,\n protocolFromUrl\n};\n\n/* eslint no-console:0 */\n// TODO: automatically generate documentation\n// TODO: check all properties on Settings exist\n// TODO: check the type of a property on Settings matches\nvar SETTINGS_SCHEMA = {\n displayMode: {\n type: \"boolean\",\n description: \"Render math in display mode, which puts the math in \" + \"display style (so \\\\int and \\\\sum are large, for example), and \" + \"centers the math on the page on its own line.\",\n cli: \"-d, --display-mode\"\n },\n output: {\n type: {\n enum: [\"htmlAndMathml\", \"html\", \"mathml\"]\n },\n description: \"Determines the markup language of the output.\",\n cli: \"-F, --format \"\n },\n leqno: {\n type: \"boolean\",\n description: \"Render display math in leqno style (left-justified tags).\"\n },\n fleqn: {\n type: \"boolean\",\n description: \"Render display math flush left.\"\n },\n throwOnError: {\n type: \"boolean\",\n default: true,\n cli: \"-t, --no-throw-on-error\",\n cliDescription: \"Render errors (in the color given by --error-color) ins\" + \"tead of throwing a ParseError exception when encountering an error.\"\n },\n errorColor: {\n type: \"string\",\n default: \"#cc0000\",\n cli: \"-c, --error-color \",\n cliDescription: \"A color string given in the format 'rgb' or 'rrggbb' \" + \"(no #). This option determines the color of errors rendered by the \" + \"-t option.\",\n cliProcessor: color => \"#\" + color\n },\n macros: {\n type: \"object\",\n cli: \"-m, --macro \",\n cliDescription: \"Define custom macro of the form '\\\\foo:expansion' (use \" + \"multiple -m arguments for multiple macros).\",\n cliDefault: [],\n cliProcessor: (def, defs) => {\n defs.push(def);\n return defs;\n }\n },\n minRuleThickness: {\n type: \"number\",\n description: \"Specifies a minimum thickness, in ems, for fraction lines,\" + \" `\\\\sqrt` top lines, `{array}` vertical lines, `\\\\hline`, \" + \"`\\\\hdashline`, `\\\\underline`, `\\\\overline`, and the borders of \" + \"`\\\\fbox`, `\\\\boxed`, and `\\\\fcolorbox`.\",\n processor: t => Math.max(0, t),\n cli: \"--min-rule-thickness \",\n cliProcessor: parseFloat\n },\n colorIsTextColor: {\n type: \"boolean\",\n description: \"Makes \\\\color behave like LaTeX's 2-argument \\\\textcolor, \" + \"instead of LaTeX's one-argument \\\\color mode change.\",\n cli: \"-b, --color-is-text-color\"\n },\n strict: {\n type: [{\n enum: [\"warn\", \"ignore\", \"error\"]\n }, \"boolean\", \"function\"],\n description: \"Turn on strict / LaTeX faithfulness mode, which throws an \" + \"error if the input uses features that are not supported by LaTeX.\",\n cli: \"-S, --strict\",\n cliDefault: false\n },\n trust: {\n type: [\"boolean\", \"function\"],\n description: \"Trust the input, enabling all HTML features such as \\\\url.\",\n cli: \"-T, --trust\"\n },\n maxSize: {\n type: \"number\",\n default: Infinity,\n description: \"If non-zero, all user-specified sizes, e.g. in \" + \"\\\\rule{500em}{500em}, will be capped to maxSize ems. Otherwise, \" + \"elements and spaces can be arbitrarily large\",\n processor: s => Math.max(0, s),\n cli: \"-s, --max-size \",\n cliProcessor: parseInt\n },\n maxExpand: {\n type: \"number\",\n default: 1000,\n description: \"Limit the number of macro expansions to the specified \" + \"number, to prevent e.g. infinite macro loops. If set to Infinity, \" + \"the macro expander will try to fully expand as in LaTeX.\",\n processor: n => Math.max(0, n),\n cli: \"-e, --max-expand \",\n cliProcessor: n => n === \"Infinity\" ? Infinity : parseInt(n)\n },\n globalGroup: {\n type: \"boolean\",\n cli: false\n }\n};\n\nfunction getDefaultValue(schema) {\n if (schema.default) {\n return schema.default;\n }\n\n var type = schema.type;\n var defaultType = Array.isArray(type) ? type[0] : type;\n\n if (typeof defaultType !== 'string') {\n return defaultType.enum[0];\n }\n\n switch (defaultType) {\n case 'boolean':\n return false;\n\n case 'string':\n return '';\n\n case 'number':\n return 0;\n\n case 'object':\n return {};\n }\n}\n/**\n * The main Settings object\n *\n * The current options stored are:\n * - displayMode: Whether the expression should be typeset as inline math\n * (false, the default), meaning that the math starts in\n * \\textstyle and is placed in an inline-block); or as display\n * math (true), meaning that the math starts in \\displaystyle\n * and is placed in a block with vertical margin.\n */\n\n\nclass Settings {\n constructor(options) {\n this.displayMode = void 0;\n this.output = void 0;\n this.leqno = void 0;\n this.fleqn = void 0;\n this.throwOnError = void 0;\n this.errorColor = void 0;\n this.macros = void 0;\n this.minRuleThickness = void 0;\n this.colorIsTextColor = void 0;\n this.strict = void 0;\n this.trust = void 0;\n this.maxSize = void 0;\n this.maxExpand = void 0;\n this.globalGroup = void 0;\n // allow null options\n options = options || {};\n\n for (var prop in SETTINGS_SCHEMA) {\n if (SETTINGS_SCHEMA.hasOwnProperty(prop)) {\n // $FlowFixMe\n var schema = SETTINGS_SCHEMA[prop]; // TODO: validate options\n // $FlowFixMe\n\n this[prop] = options[prop] !== undefined ? schema.processor ? schema.processor(options[prop]) : options[prop] : getDefaultValue(schema);\n }\n }\n }\n /**\n * Report nonstrict (non-LaTeX-compatible) input.\n * Can safely not be called if `this.strict` is false in JavaScript.\n */\n\n\n reportNonstrict(errorCode, errorMsg, token) {\n var strict = this.strict;\n\n if (typeof strict === \"function\") {\n // Allow return value of strict function to be boolean or string\n // (or null/undefined, meaning no further processing).\n strict = strict(errorCode, errorMsg, token);\n }\n\n if (!strict || strict === \"ignore\") {\n return;\n } else if (strict === true || strict === \"error\") {\n throw new ParseError(\"LaTeX-incompatible input and strict mode is set to 'error': \" + (errorMsg + \" [\" + errorCode + \"]\"), token);\n } else if (strict === \"warn\") {\n typeof console !== \"undefined\" && console.warn(\"LaTeX-incompatible input and strict mode is set to 'warn': \" + (errorMsg + \" [\" + errorCode + \"]\"));\n } else {\n // won't happen in type-safe code\n typeof console !== \"undefined\" && console.warn(\"LaTeX-incompatible input and strict mode is set to \" + (\"unrecognized '\" + strict + \"': \" + errorMsg + \" [\" + errorCode + \"]\"));\n }\n }\n /**\n * Check whether to apply strict (LaTeX-adhering) behavior for unusual\n * input (like `\\\\`). Unlike `nonstrict`, will not throw an error;\n * instead, \"error\" translates to a return value of `true`, while \"ignore\"\n * translates to a return value of `false`. May still print a warning:\n * \"warn\" prints a warning and returns `false`.\n * This is for the second category of `errorCode`s listed in the README.\n */\n\n\n useStrictBehavior(errorCode, errorMsg, token) {\n var strict = this.strict;\n\n if (typeof strict === \"function\") {\n // Allow return value of strict function to be boolean or string\n // (or null/undefined, meaning no further processing).\n // But catch any exceptions thrown by function, treating them\n // like \"error\".\n try {\n strict = strict(errorCode, errorMsg, token);\n } catch (error) {\n strict = \"error\";\n }\n }\n\n if (!strict || strict === \"ignore\") {\n return false;\n } else if (strict === true || strict === \"error\") {\n return true;\n } else if (strict === \"warn\") {\n typeof console !== \"undefined\" && console.warn(\"LaTeX-incompatible input and strict mode is set to 'warn': \" + (errorMsg + \" [\" + errorCode + \"]\"));\n return false;\n } else {\n // won't happen in type-safe code\n typeof console !== \"undefined\" && console.warn(\"LaTeX-incompatible input and strict mode is set to \" + (\"unrecognized '\" + strict + \"': \" + errorMsg + \" [\" + errorCode + \"]\"));\n return false;\n }\n }\n /**\n * Check whether to test potentially dangerous input, and return\n * `true` (trusted) or `false` (untrusted). The sole argument `context`\n * should be an object with `command` field specifying the relevant LaTeX\n * command (as a string starting with `\\`), and any other arguments, etc.\n * If `context` has a `url` field, a `protocol` field will automatically\n * get added by this function (changing the specified object).\n */\n\n\n isTrusted(context) {\n if (context.url && !context.protocol) {\n var protocol = utils.protocolFromUrl(context.url);\n\n if (protocol == null) {\n return false;\n }\n\n context.protocol = protocol;\n }\n\n var trust = typeof this.trust === \"function\" ? this.trust(context) : this.trust;\n return Boolean(trust);\n }\n\n}\n\n/**\n * This file contains information and classes for the various kinds of styles\n * used in TeX. It provides a generic `Style` class, which holds information\n * about a specific style. It then provides instances of all the different kinds\n * of styles possible, and provides functions to move between them and get\n * information about them.\n */\n\n/**\n * The main style class. Contains a unique id for the style, a size (which is\n * the same for cramped and uncramped version of a style), and a cramped flag.\n */\nclass Style {\n constructor(id, size, cramped) {\n this.id = void 0;\n this.size = void 0;\n this.cramped = void 0;\n this.id = id;\n this.size = size;\n this.cramped = cramped;\n }\n /**\n * Get the style of a superscript given a base in the current style.\n */\n\n\n sup() {\n return styles[sup[this.id]];\n }\n /**\n * Get the style of a subscript given a base in the current style.\n */\n\n\n sub() {\n return styles[sub[this.id]];\n }\n /**\n * Get the style of a fraction numerator given the fraction in the current\n * style.\n */\n\n\n fracNum() {\n return styles[fracNum[this.id]];\n }\n /**\n * Get the style of a fraction denominator given the fraction in the current\n * style.\n */\n\n\n fracDen() {\n return styles[fracDen[this.id]];\n }\n /**\n * Get the cramped version of a style (in particular, cramping a cramped style\n * doesn't change the style).\n */\n\n\n cramp() {\n return styles[cramp[this.id]];\n }\n /**\n * Get a text or display version of this style.\n */\n\n\n text() {\n return styles[text$1[this.id]];\n }\n /**\n * Return true if this style is tightly spaced (scriptstyle/scriptscriptstyle)\n */\n\n\n isTight() {\n return this.size >= 2;\n }\n\n} // Export an interface for type checking, but don't expose the implementation.\n// This way, no more styles can be generated.\n\n\n// IDs of the different styles\nvar D = 0;\nvar Dc = 1;\nvar T = 2;\nvar Tc = 3;\nvar S = 4;\nvar Sc = 5;\nvar SS = 6;\nvar SSc = 7; // Instances of the different styles\n\nvar styles = [new Style(D, 0, false), new Style(Dc, 0, true), new Style(T, 1, false), new Style(Tc, 1, true), new Style(S, 2, false), new Style(Sc, 2, true), new Style(SS, 3, false), new Style(SSc, 3, true)]; // Lookup tables for switching from one style to another\n\nvar sup = [S, Sc, S, Sc, SS, SSc, SS, SSc];\nvar sub = [Sc, Sc, Sc, Sc, SSc, SSc, SSc, SSc];\nvar fracNum = [T, Tc, S, Sc, SS, SSc, SS, SSc];\nvar fracDen = [Tc, Tc, Sc, Sc, SSc, SSc, SSc, SSc];\nvar cramp = [Dc, Dc, Tc, Tc, Sc, Sc, SSc, SSc];\nvar text$1 = [D, Dc, T, Tc, T, Tc, T, Tc]; // We only export some of the styles.\n\nvar Style$1 = {\n DISPLAY: styles[D],\n TEXT: styles[T],\n SCRIPT: styles[S],\n SCRIPTSCRIPT: styles[SS]\n};\n\n/*\n * This file defines the Unicode scripts and script families that we\n * support. To add new scripts or families, just add a new entry to the\n * scriptData array below. Adding scripts to the scriptData array allows\n * characters from that script to appear in \\text{} environments.\n */\n\n/**\n * Each script or script family has a name and an array of blocks.\n * Each block is an array of two numbers which specify the start and\n * end points (inclusive) of a block of Unicode codepoints.\n */\n\n/**\n * Unicode block data for the families of scripts we support in \\text{}.\n * Scripts only need to appear here if they do not have font metrics.\n */\nvar scriptData = [{\n // Latin characters beyond the Latin-1 characters we have metrics for.\n // Needed for Czech, Hungarian and Turkish text, for example.\n name: 'latin',\n blocks: [[0x0100, 0x024f], // Latin Extended-A and Latin Extended-B\n [0x0300, 0x036f] // Combining Diacritical marks\n ]\n}, {\n // The Cyrillic script used by Russian and related languages.\n // A Cyrillic subset used to be supported as explicitly defined\n // symbols in symbols.js\n name: 'cyrillic',\n blocks: [[0x0400, 0x04ff]]\n}, {\n // Armenian\n name: 'armenian',\n blocks: [[0x0530, 0x058F]]\n}, {\n // The Brahmic scripts of South and Southeast Asia\n // Devanagari (0900–097F)\n // Bengali (0980–09FF)\n // Gurmukhi (0A00–0A7F)\n // Gujarati (0A80–0AFF)\n // Oriya (0B00–0B7F)\n // Tamil (0B80–0BFF)\n // Telugu (0C00–0C7F)\n // Kannada (0C80–0CFF)\n // Malayalam (0D00–0D7F)\n // Sinhala (0D80–0DFF)\n // Thai (0E00–0E7F)\n // Lao (0E80–0EFF)\n // Tibetan (0F00–0FFF)\n // Myanmar (1000–109F)\n name: 'brahmic',\n blocks: [[0x0900, 0x109F]]\n}, {\n name: 'georgian',\n blocks: [[0x10A0, 0x10ff]]\n}, {\n // Chinese and Japanese.\n // The \"k\" in cjk is for Korean, but we've separated Korean out\n name: \"cjk\",\n blocks: [[0x3000, 0x30FF], // CJK symbols and punctuation, Hiragana, Katakana\n [0x4E00, 0x9FAF], // CJK ideograms\n [0xFF00, 0xFF60] // Fullwidth punctuation\n // TODO: add halfwidth Katakana and Romanji glyphs\n ]\n}, {\n // Korean\n name: 'hangul',\n blocks: [[0xAC00, 0xD7AF]]\n}];\n/**\n * Given a codepoint, return the name of the script or script family\n * it is from, or null if it is not part of a known block\n */\n\nfunction scriptFromCodepoint(codepoint) {\n for (var i = 0; i < scriptData.length; i++) {\n var script = scriptData[i];\n\n for (var _i = 0; _i < script.blocks.length; _i++) {\n var block = script.blocks[_i];\n\n if (codepoint >= block[0] && codepoint <= block[1]) {\n return script.name;\n }\n }\n }\n\n return null;\n}\n/**\n * A flattened version of all the supported blocks in a single array.\n * This is an optimization to make supportedCodepoint() fast.\n */\n\nvar allBlocks = [];\nscriptData.forEach(s => s.blocks.forEach(b => allBlocks.push(...b)));\n/**\n * Given a codepoint, return true if it falls within one of the\n * scripts or script families defined above and false otherwise.\n *\n * Micro benchmarks shows that this is faster than\n * /[\\u3000-\\u30FF\\u4E00-\\u9FAF\\uFF00-\\uFF60\\uAC00-\\uD7AF\\u0900-\\u109F]/.test()\n * in Firefox, Chrome and Node.\n */\n\nfunction supportedCodepoint(codepoint) {\n for (var i = 0; i < allBlocks.length; i += 2) {\n if (codepoint >= allBlocks[i] && codepoint <= allBlocks[i + 1]) {\n return true;\n }\n }\n\n return false;\n}\n\n/**\n * This file provides support to domTree.js and delimiter.js.\n * It's a storehouse of path geometry for SVG images.\n */\n// In all paths below, the viewBox-to-em scale is 1000:1.\nvar hLinePad = 80; // padding above a sqrt vinculum. Prevents image cropping.\n// The vinculum of a \\sqrt can be made thicker by a KaTeX rendering option.\n// Think of variable extraVinculum as two detours in the SVG path.\n// The detour begins at the lower left of the area labeled extraVinculum below.\n// The detour proceeds one extraVinculum distance up and slightly to the right,\n// displacing the radiused corner between surd and vinculum. The radius is\n// traversed as usual, then the detour resumes. It goes right, to the end of\n// the very long vinculum, then down one extraVinculum distance,\n// after which it resumes regular path geometry for the radical.\n\n/* vinculum\n /\n /▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒←extraVinculum\n / █████████████████████←0.04em (40 unit) std vinculum thickness\n / /\n / /\n / /\\\n / / surd\n*/\n\nvar sqrtMain = function sqrtMain(extraVinculum, hLinePad) {\n // sqrtMain path geometry is from glyph U221A in the font KaTeX Main\n return \"M95,\" + (622 + extraVinculum + hLinePad) + \"\\nc-2.7,0,-7.17,-2.7,-13.5,-8c-5.8,-5.3,-9.5,-10,-9.5,-14\\nc0,-2,0.3,-3.3,1,-4c1.3,-2.7,23.83,-20.7,67.5,-54\\nc44.2,-33.3,65.8,-50.3,66.5,-51c1.3,-1.3,3,-2,5,-2c4.7,0,8.7,3.3,12,10\\ns173,378,173,378c0.7,0,35.3,-71,104,-213c68.7,-142,137.5,-285,206.5,-429\\nc69,-144,104.5,-217.7,106.5,-221\\nl\" + extraVinculum / 2.075 + \" -\" + extraVinculum + \"\\nc5.3,-9.3,12,-14,20,-14\\nH400000v\" + (40 + extraVinculum) + \"H845.2724\\ns-225.272,467,-225.272,467s-235,486,-235,486c-2.7,4.7,-9,7,-19,7\\nc-6,0,-10,-1,-12,-3s-194,-422,-194,-422s-65,47,-65,47z\\nM\" + (834 + extraVinculum) + \" \" + hLinePad + \"h400000v\" + (40 + extraVinculum) + \"h-400000z\";\n};\n\nvar sqrtSize1 = function sqrtSize1(extraVinculum, hLinePad) {\n // size1 is from glyph U221A in the font KaTeX_Size1-Regular\n return \"M263,\" + (601 + extraVinculum + hLinePad) + \"c0.7,0,18,39.7,52,119\\nc34,79.3,68.167,158.7,102.5,238c34.3,79.3,51.8,119.3,52.5,120\\nc340,-704.7,510.7,-1060.3,512,-1067\\nl\" + extraVinculum / 2.084 + \" -\" + extraVinculum + \"\\nc4.7,-7.3,11,-11,19,-11\\nH40000v\" + (40 + extraVinculum) + \"H1012.3\\ns-271.3,567,-271.3,567c-38.7,80.7,-84,175,-136,283c-52,108,-89.167,185.3,-111.5,232\\nc-22.3,46.7,-33.8,70.3,-34.5,71c-4.7,4.7,-12.3,7,-23,7s-12,-1,-12,-1\\ns-109,-253,-109,-253c-72.7,-168,-109.3,-252,-110,-252c-10.7,8,-22,16.7,-34,26\\nc-22,17.3,-33.3,26,-34,26s-26,-26,-26,-26s76,-59,76,-59s76,-60,76,-60z\\nM\" + (1001 + extraVinculum) + \" \" + hLinePad + \"h400000v\" + (40 + extraVinculum) + \"h-400000z\";\n};\n\nvar sqrtSize2 = function sqrtSize2(extraVinculum, hLinePad) {\n // size2 is from glyph U221A in the font KaTeX_Size2-Regular\n return \"M983 \" + (10 + extraVinculum + hLinePad) + \"\\nl\" + extraVinculum / 3.13 + \" -\" + extraVinculum + \"\\nc4,-6.7,10,-10,18,-10 H400000v\" + (40 + extraVinculum) + \"\\nH1013.1s-83.4,268,-264.1,840c-180.7,572,-277,876.3,-289,913c-4.7,4.7,-12.7,7,-24,7\\ns-12,0,-12,0c-1.3,-3.3,-3.7,-11.7,-7,-25c-35.3,-125.3,-106.7,-373.3,-214,-744\\nc-10,12,-21,25,-33,39s-32,39,-32,39c-6,-5.3,-15,-14,-27,-26s25,-30,25,-30\\nc26.7,-32.7,52,-63,76,-91s52,-60,52,-60s208,722,208,722\\nc56,-175.3,126.3,-397.3,211,-666c84.7,-268.7,153.8,-488.2,207.5,-658.5\\nc53.7,-170.3,84.5,-266.8,92.5,-289.5z\\nM\" + (1001 + extraVinculum) + \" \" + hLinePad + \"h400000v\" + (40 + extraVinculum) + \"h-400000z\";\n};\n\nvar sqrtSize3 = function sqrtSize3(extraVinculum, hLinePad) {\n // size3 is from glyph U221A in the font KaTeX_Size3-Regular\n return \"M424,\" + (2398 + extraVinculum + hLinePad) + \"\\nc-1.3,-0.7,-38.5,-172,-111.5,-514c-73,-342,-109.8,-513.3,-110.5,-514\\nc0,-2,-10.7,14.3,-32,49c-4.7,7.3,-9.8,15.7,-15.5,25c-5.7,9.3,-9.8,16,-12.5,20\\ns-5,7,-5,7c-4,-3.3,-8.3,-7.7,-13,-13s-13,-13,-13,-13s76,-122,76,-122s77,-121,77,-121\\ns209,968,209,968c0,-2,84.7,-361.7,254,-1079c169.3,-717.3,254.7,-1077.7,256,-1081\\nl\" + extraVinculum / 4.223 + \" -\" + extraVinculum + \"c4,-6.7,10,-10,18,-10 H400000\\nv\" + (40 + extraVinculum) + \"H1014.6\\ns-87.3,378.7,-272.6,1166c-185.3,787.3,-279.3,1182.3,-282,1185\\nc-2,6,-10,9,-24,9\\nc-8,0,-12,-0.7,-12,-2z M\" + (1001 + extraVinculum) + \" \" + hLinePad + \"\\nh400000v\" + (40 + extraVinculum) + \"h-400000z\";\n};\n\nvar sqrtSize4 = function sqrtSize4(extraVinculum, hLinePad) {\n // size4 is from glyph U221A in the font KaTeX_Size4-Regular\n return \"M473,\" + (2713 + extraVinculum + hLinePad) + \"\\nc339.3,-1799.3,509.3,-2700,510,-2702 l\" + extraVinculum / 5.298 + \" -\" + extraVinculum + \"\\nc3.3,-7.3,9.3,-11,18,-11 H400000v\" + (40 + extraVinculum) + \"H1017.7\\ns-90.5,478,-276.2,1466c-185.7,988,-279.5,1483,-281.5,1485c-2,6,-10,9,-24,9\\nc-8,0,-12,-0.7,-12,-2c0,-1.3,-5.3,-32,-16,-92c-50.7,-293.3,-119.7,-693.3,-207,-1200\\nc0,-1.3,-5.3,8.7,-16,30c-10.7,21.3,-21.3,42.7,-32,64s-16,33,-16,33s-26,-26,-26,-26\\ns76,-153,76,-153s77,-151,77,-151c0.7,0.7,35.7,202,105,604c67.3,400.7,102,602.7,104,\\n606zM\" + (1001 + extraVinculum) + \" \" + hLinePad + \"h400000v\" + (40 + extraVinculum) + \"H1017.7z\";\n};\n\nvar phasePath = function phasePath(y) {\n var x = y / 2; // x coordinate at top of angle\n\n return \"M400000 \" + y + \" H0 L\" + x + \" 0 l65 45 L145 \" + (y - 80) + \" H400000z\";\n};\n\nvar sqrtTall = function sqrtTall(extraVinculum, hLinePad, viewBoxHeight) {\n // sqrtTall is from glyph U23B7 in the font KaTeX_Size4-Regular\n // One path edge has a variable length. It runs vertically from the vinculum\n // to a point near (14 units) the bottom of the surd. The vinculum\n // is normally 40 units thick. So the length of the line in question is:\n var vertSegment = viewBoxHeight - 54 - hLinePad - extraVinculum;\n return \"M702 \" + (extraVinculum + hLinePad) + \"H400000\" + (40 + extraVinculum) + \"\\nH742v\" + vertSegment + \"l-4 4-4 4c-.667.7 -2 1.5-4 2.5s-4.167 1.833-6.5 2.5-5.5 1-9.5 1\\nh-12l-28-84c-16.667-52-96.667 -294.333-240-727l-212 -643 -85 170\\nc-4-3.333-8.333-7.667-13 -13l-13-13l77-155 77-156c66 199.333 139 419.667\\n219 661 l218 661zM702 \" + hLinePad + \"H400000v\" + (40 + extraVinculum) + \"H742z\";\n};\n\nvar sqrtPath = function sqrtPath(size, extraVinculum, viewBoxHeight) {\n extraVinculum = 1000 * extraVinculum; // Convert from document ems to viewBox.\n\n var path = \"\";\n\n switch (size) {\n case \"sqrtMain\":\n path = sqrtMain(extraVinculum, hLinePad);\n break;\n\n case \"sqrtSize1\":\n path = sqrtSize1(extraVinculum, hLinePad);\n break;\n\n case \"sqrtSize2\":\n path = sqrtSize2(extraVinculum, hLinePad);\n break;\n\n case \"sqrtSize3\":\n path = sqrtSize3(extraVinculum, hLinePad);\n break;\n\n case \"sqrtSize4\":\n path = sqrtSize4(extraVinculum, hLinePad);\n break;\n\n case \"sqrtTall\":\n path = sqrtTall(extraVinculum, hLinePad, viewBoxHeight);\n }\n\n return path;\n};\nvar innerPath = function innerPath(name, height) {\n // The inner part of stretchy tall delimiters\n switch (name) {\n case \"\\u239c\":\n return \"M291 0 H417 V\" + height + \" H291z M291 0 H417 V\" + height + \" H291z\";\n\n case \"\\u2223\":\n return \"M145 0 H188 V\" + height + \" H145z M145 0 H188 V\" + height + \" H145z\";\n\n case \"\\u2225\":\n return \"M145 0 H188 V\" + height + \" H145z M145 0 H188 V\" + height + \" H145z\" + (\"M367 0 H410 V\" + height + \" H367z M367 0 H410 V\" + height + \" H367z\");\n\n case \"\\u239f\":\n return \"M457 0 H583 V\" + height + \" H457z M457 0 H583 V\" + height + \" H457z\";\n\n case \"\\u23a2\":\n return \"M319 0 H403 V\" + height + \" H319z M319 0 H403 V\" + height + \" H319z\";\n\n case \"\\u23a5\":\n return \"M263 0 H347 V\" + height + \" H263z M263 0 H347 V\" + height + \" H263z\";\n\n case \"\\u23aa\":\n return \"M384 0 H504 V\" + height + \" H384z M384 0 H504 V\" + height + \" H384z\";\n\n case \"\\u23d0\":\n return \"M312 0 H355 V\" + height + \" H312z M312 0 H355 V\" + height + \" H312z\";\n\n case \"\\u2016\":\n return \"M257 0 H300 V\" + height + \" H257z M257 0 H300 V\" + height + \" H257z\" + (\"M478 0 H521 V\" + height + \" H478z M478 0 H521 V\" + height + \" H478z\");\n\n default:\n return \"\";\n }\n};\nvar path = {\n // The doubleleftarrow geometry is from glyph U+21D0 in the font KaTeX Main\n doubleleftarrow: \"M262 157\\nl10-10c34-36 62.7-77 86-123 3.3-8 5-13.3 5-16 0-5.3-6.7-8-20-8-7.3\\n 0-12.2.5-14.5 1.5-2.3 1-4.8 4.5-7.5 10.5-49.3 97.3-121.7 169.3-217 216-28\\n 14-57.3 25-88 33-6.7 2-11 3.8-13 5.5-2 1.7-3 4.2-3 7.5s1 5.8 3 7.5\\nc2 1.7 6.3 3.5 13 5.5 68 17.3 128.2 47.8 180.5 91.5 52.3 43.7 93.8 96.2 124.5\\n 157.5 9.3 8 15.3 12.3 18 13h6c12-.7 18-4 18-10 0-2-1.7-7-5-15-23.3-46-52-87\\n-86-123l-10-10h399738v-40H218c328 0 0 0 0 0l-10-8c-26.7-20-65.7-43-117-69 2.7\\n-2 6-3.7 10-5 36.7-16 72.3-37.3 107-64l10-8h399782v-40z\\nm8 0v40h399730v-40zm0 194v40h399730v-40z\",\n // doublerightarrow is from glyph U+21D2 in font KaTeX Main\n doublerightarrow: \"M399738 392l\\n-10 10c-34 36-62.7 77-86 123-3.3 8-5 13.3-5 16 0 5.3 6.7 8 20 8 7.3 0 12.2-.5\\n 14.5-1.5 2.3-1 4.8-4.5 7.5-10.5 49.3-97.3 121.7-169.3 217-216 28-14 57.3-25 88\\n-33 6.7-2 11-3.8 13-5.5 2-1.7 3-4.2 3-7.5s-1-5.8-3-7.5c-2-1.7-6.3-3.5-13-5.5-68\\n-17.3-128.2-47.8-180.5-91.5-52.3-43.7-93.8-96.2-124.5-157.5-9.3-8-15.3-12.3-18\\n-13h-6c-12 .7-18 4-18 10 0 2 1.7 7 5 15 23.3 46 52 87 86 123l10 10H0v40h399782\\nc-328 0 0 0 0 0l10 8c26.7 20 65.7 43 117 69-2.7 2-6 3.7-10 5-36.7 16-72.3 37.3\\n-107 64l-10 8H0v40zM0 157v40h399730v-40zm0 194v40h399730v-40z\",\n // leftarrow is from glyph U+2190 in font KaTeX Main\n leftarrow: \"M400000 241H110l3-3c68.7-52.7 113.7-120\\n 135-202 4-14.7 6-23 6-25 0-7.3-7-11-21-11-8 0-13.2.8-15.5 2.5-2.3 1.7-4.2 5.8\\n-5.5 12.5-1.3 4.7-2.7 10.3-4 17-12 48.7-34.8 92-68.5 130S65.3 228.3 18 247\\nc-10 4-16 7.7-18 11 0 8.7 6 14.3 18 17 47.3 18.7 87.8 47 121.5 85S196 441.3 208\\n 490c.7 2 1.3 5 2 9s1.2 6.7 1.5 8c.3 1.3 1 3.3 2 6s2.2 4.5 3.5 5.5c1.3 1 3.3\\n 1.8 6 2.5s6 1 10 1c14 0 21-3.7 21-11 0-2-2-10.3-6-25-20-79.3-65-146.7-135-202\\n l-3-3h399890zM100 241v40h399900v-40z\",\n // overbrace is from glyphs U+23A9/23A8/23A7 in font KaTeX_Size4-Regular\n leftbrace: \"M6 548l-6-6v-35l6-11c56-104 135.3-181.3 238-232 57.3-28.7 117\\n-45 179-50h399577v120H403c-43.3 7-81 15-113 26-100.7 33-179.7 91-237 174-2.7\\n 5-6 9-10 13-.7 1-7.3 1-20 1H6z\",\n leftbraceunder: \"M0 6l6-6h17c12.688 0 19.313.3 20 1 4 4 7.313 8.3 10 13\\n 35.313 51.3 80.813 93.8 136.5 127.5 55.688 33.7 117.188 55.8 184.5 66.5.688\\n 0 2 .3 4 1 18.688 2.7 76 4.3 172 5h399450v120H429l-6-1c-124.688-8-235-61.7\\n-331-161C60.687 138.7 32.312 99.3 7 54L0 41V6z\",\n // overgroup is from the MnSymbol package (public domain)\n leftgroup: \"M400000 80\\nH435C64 80 168.3 229.4 21 260c-5.9 1.2-18 0-18 0-2 0-3-1-3-3v-38C76 61 257 0\\n 435 0h399565z\",\n leftgroupunder: \"M400000 262\\nH435C64 262 168.3 112.6 21 82c-5.9-1.2-18 0-18 0-2 0-3 1-3 3v38c76 158 257 219\\n 435 219h399565z\",\n // Harpoons are from glyph U+21BD in font KaTeX Main\n leftharpoon: \"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3\\n-3.3 10.2-9.5 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5\\n-18.3 3-21-1.3-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7\\n-196 228-6.7 4.7-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40z\",\n leftharpoonplus: \"M0 267c.7 5.3 3 10 7 14h399993v-40H93c3.3-3.3 10.2-9.5\\n 20.5-18.5s17.8-15.8 22.5-20.5c50.7-52 88-110.3 112-175 4-11.3 5-18.3 3-21-1.3\\n-4-7.3-6-18-6-8 0-13 .7-15 2s-4.7 6.7-8 16c-42 98.7-107.3 174.7-196 228-6.7 4.7\\n-10.7 8-12 10-1.3 2-2 5.7-2 11zm100-26v40h399900v-40zM0 435v40h400000v-40z\\nm0 0v40h400000v-40z\",\n leftharpoondown: \"M7 241c-4 4-6.333 8.667-7 14 0 5.333.667 9 2 11s5.333\\n 5.333 12 10c90.667 54 156 130 196 228 3.333 10.667 6.333 16.333 9 17 2 .667 5\\n 1 9 1h5c10.667 0 16.667-2 18-6 2-2.667 1-9.667-3-21-32-87.333-82.667-157.667\\n-152-211l-3-3h399907v-40zM93 281 H400000 v-40L7 241z\",\n leftharpoondownplus: \"M7 435c-4 4-6.3 8.7-7 14 0 5.3.7 9 2 11s5.3 5.3 12\\n 10c90.7 54 156 130 196 228 3.3 10.7 6.3 16.3 9 17 2 .7 5 1 9 1h5c10.7 0 16.7\\n-2 18-6 2-2.7 1-9.7-3-21-32-87.3-82.7-157.7-152-211l-3-3h399907v-40H7zm93 0\\nv40h399900v-40zM0 241v40h399900v-40zm0 0v40h399900v-40z\",\n // hook is from glyph U+21A9 in font KaTeX Main\n lefthook: \"M400000 281 H103s-33-11.2-61-33.5S0 197.3 0 164s14.2-61.2 42.5\\n-83.5C70.8 58.2 104 47 142 47 c16.7 0 25 6.7 25 20 0 12-8.7 18.7-26 20-40 3.3\\n-68.7 15.7-86 37-10 12-15 25.3-15 40 0 22.7 9.8 40.7 29.5 54 19.7 13.3 43.5 21\\n 71.5 23h399859zM103 281v-40h399897v40z\",\n leftlinesegment: \"M40 281 V428 H0 V94 H40 V241 H400000 v40z\\nM40 281 V428 H0 V94 H40 V241 H400000 v40z\",\n leftmapsto: \"M40 281 V448H0V74H40V241H400000v40z\\nM40 281 V448H0V74H40V241H400000v40z\",\n // tofrom is from glyph U+21C4 in font KaTeX AMS Regular\n leftToFrom: \"M0 147h400000v40H0zm0 214c68 40 115.7 95.7 143 167h22c15.3 0 23\\n-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69-70-101l-7-8h399905v-40H95l7-8\\nc28.7-32 52-65.7 70-101 10.7-23.3 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 265.3\\n 68 321 0 361zm0-174v-40h399900v40zm100 154v40h399900v-40z\",\n longequal: \"M0 50 h400000 v40H0z m0 194h40000v40H0z\\nM0 50 h400000 v40H0z m0 194h40000v40H0z\",\n midbrace: \"M200428 334\\nc-100.7-8.3-195.3-44-280-108-55.3-42-101.7-93-139-153l-9-14c-2.7 4-5.7 8.7-9 14\\n-53.3 86.7-123.7 153-211 199-66.7 36-137.3 56.3-212 62H0V214h199568c178.3-11.7\\n 311.7-78.3 403-201 6-8 9.7-12 11-12 .7-.7 6.7-1 18-1s17.3.3 18 1c1.3 0 5 4 11\\n 12 44.7 59.3 101.3 106.3 170 141s145.3 54.3 229 60h199572v120z\",\n midbraceunder: \"M199572 214\\nc100.7 8.3 195.3 44 280 108 55.3 42 101.7 93 139 153l9 14c2.7-4 5.7-8.7 9-14\\n 53.3-86.7 123.7-153 211-199 66.7-36 137.3-56.3 212-62h199568v120H200432c-178.3\\n 11.7-311.7 78.3-403 201-6 8-9.7 12-11 12-.7.7-6.7 1-18 1s-17.3-.3-18-1c-1.3 0\\n-5-4-11-12-44.7-59.3-101.3-106.3-170-141s-145.3-54.3-229-60H0V214z\",\n oiintSize1: \"M512.6 71.6c272.6 0 320.3 106.8 320.3 178.2 0 70.8-47.7 177.6\\n-320.3 177.6S193.1 320.6 193.1 249.8c0-71.4 46.9-178.2 319.5-178.2z\\nm368.1 178.2c0-86.4-60.9-215.4-368.1-215.4-306.4 0-367.3 129-367.3 215.4 0 85.8\\n60.9 214.8 367.3 214.8 307.2 0 368.1-129 368.1-214.8z\",\n oiintSize2: \"M757.8 100.1c384.7 0 451.1 137.6 451.1 230 0 91.3-66.4 228.8\\n-451.1 228.8-386.3 0-452.7-137.5-452.7-228.8 0-92.4 66.4-230 452.7-230z\\nm502.4 230c0-111.2-82.4-277.2-502.4-277.2s-504 166-504 277.2\\nc0 110 84 276 504 276s502.4-166 502.4-276z\",\n oiiintSize1: \"M681.4 71.6c408.9 0 480.5 106.8 480.5 178.2 0 70.8-71.6 177.6\\n-480.5 177.6S202.1 320.6 202.1 249.8c0-71.4 70.5-178.2 479.3-178.2z\\nm525.8 178.2c0-86.4-86.8-215.4-525.7-215.4-437.9 0-524.7 129-524.7 215.4 0\\n85.8 86.8 214.8 524.7 214.8 438.9 0 525.7-129 525.7-214.8z\",\n oiiintSize2: \"M1021.2 53c603.6 0 707.8 165.8 707.8 277.2 0 110-104.2 275.8\\n-707.8 275.8-606 0-710.2-165.8-710.2-275.8C311 218.8 415.2 53 1021.2 53z\\nm770.4 277.1c0-131.2-126.4-327.6-770.5-327.6S248.4 198.9 248.4 330.1\\nc0 130 128.8 326.4 772.7 326.4s770.5-196.4 770.5-326.4z\",\n rightarrow: \"M0 241v40h399891c-47.3 35.3-84 78-110 128\\n-16.7 32-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20\\n 11 8 0 13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7\\n 39-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85\\n-40.5-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\\n 151.7 139 205zm0 0v40h399900v-40z\",\n rightbrace: \"M400000 542l\\n-6 6h-17c-12.7 0-19.3-.3-20-1-4-4-7.3-8.3-10-13-35.3-51.3-80.8-93.8-136.5-127.5\\ns-117.2-55.8-184.5-66.5c-.7 0-2-.3-4-1-18.7-2.7-76-4.3-172-5H0V214h399571l6 1\\nc124.7 8 235 61.7 331 161 31.3 33.3 59.7 72.7 85 118l7 13v35z\",\n rightbraceunder: \"M399994 0l6 6v35l-6 11c-56 104-135.3 181.3-238 232-57.3\\n 28.7-117 45-179 50H-300V214h399897c43.3-7 81-15 113-26 100.7-33 179.7-91 237\\n-174 2.7-5 6-9 10-13 .7-1 7.3-1 20-1h17z\",\n rightgroup: \"M0 80h399565c371 0 266.7 149.4 414 180 5.9 1.2 18 0 18 0 2 0\\n 3-1 3-3v-38c-76-158-257-219-435-219H0z\",\n rightgroupunder: \"M0 262h399565c371 0 266.7-149.4 414-180 5.9-1.2 18 0 18\\n 0 2 0 3 1 3 3v38c-76 158-257 219-435 219H0z\",\n rightharpoon: \"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3\\n-3.7-15.3-11-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2\\n-10.7 0-16.7 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58\\n 69.2 92 94.5zm0 0v40h399900v-40z\",\n rightharpoonplus: \"M0 241v40h399993c4.7-4.7 7-9.3 7-14 0-9.3-3.7-15.3-11\\n-18-92.7-56.7-159-133.7-199-231-3.3-9.3-6-14.7-8-16-2-1.3-7-2-15-2-10.7 0-16.7\\n 2-18 6-2 2.7-1 9.7 3 21 15.3 42 36.7 81.8 64 119.5 27.3 37.7 58 69.2 92 94.5z\\nm0 0v40h399900v-40z m100 194v40h399900v-40zm0 0v40h399900v-40z\",\n rightharpoondown: \"M399747 511c0 7.3 6.7 11 20 11 8 0 13-.8 15-2.5s4.7-6.8\\n 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3 8.5-5.8 9.5\\n-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3-64.7 57-92 95\\n-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 241v40h399900v-40z\",\n rightharpoondownplus: \"M399747 705c0 7.3 6.7 11 20 11 8 0 13-.8\\n 15-2.5s4.7-6.8 8-15.5c40-94 99.3-166.3 178-217 13.3-8 20.3-12.3 21-13 5.3-3.3\\n 8.5-5.8 9.5-7.5 1-1.7 1.5-5.2 1.5-10.5s-2.3-10.3-7-15H0v40h399908c-34 25.3\\n-64.7 57-92 95-27.3 38-48.7 77.7-64 119-3.3 8.7-5 14-5 16zM0 435v40h399900v-40z\\nm0-194v40h400000v-40zm0 0v40h400000v-40z\",\n righthook: \"M399859 241c-764 0 0 0 0 0 40-3.3 68.7-15.7 86-37 10-12 15-25.3\\n 15-40 0-22.7-9.8-40.7-29.5-54-19.7-13.3-43.5-21-71.5-23-17.3-1.3-26-8-26-20 0\\n-13.3 8.7-20 26-20 38 0 71 11.2 99 33.5 0 0 7 5.6 21 16.7 14 11.2 21 33.5 21\\n 66.8s-14 61.2-42 83.5c-28 22.3-61 33.5-99 33.5L0 241z M0 281v-40h399859v40z\",\n rightlinesegment: \"M399960 241 V94 h40 V428 h-40 V281 H0 v-40z\\nM399960 241 V94 h40 V428 h-40 V281 H0 v-40z\",\n rightToFrom: \"M400000 167c-70.7-42-118-97.7-142-167h-23c-15.3 0-23 .3-23\\n 1 0 1.3 5.3 13.7 16 37 18 35.3 41.3 69 70 101l7 8H0v40h399905l-7 8c-28.7 32\\n-52 65.7-70 101-10.7 23.3-16 35.7-16 37 0 .7 7.7 1 23 1h23c24-69.3 71.3-125 142\\n-167z M100 147v40h399900v-40zM0 341v40h399900v-40z\",\n // twoheadleftarrow is from glyph U+219E in font KaTeX AMS Regular\n twoheadleftarrow: \"M0 167c68 40\\n 115.7 95.7 143 167h22c15.3 0 23-.3 23-1 0-1.3-5.3-13.7-16-37-18-35.3-41.3-69\\n-70-101l-7-8h125l9 7c50.7 39.3 85 86 103 140h46c0-4.7-6.3-18.7-19-42-18-35.3\\n-40-67.3-66-96l-9-9h399716v-40H284l9-9c26-28.7 48-60.7 66-96 12.7-23.333 19\\n-37.333 19-42h-46c-18 54-52.3 100.7-103 140l-9 7H95l7-8c28.7-32 52-65.7 70-101\\n 10.7-23.333 16-35.7 16-37 0-.7-7.7-1-23-1h-22C115.7 71.3 68 127 0 167z\",\n twoheadrightarrow: \"M400000 167\\nc-68-40-115.7-95.7-143-167h-22c-15.3 0-23 .3-23 1 0 1.3 5.3 13.7 16 37 18 35.3\\n 41.3 69 70 101l7 8h-125l-9-7c-50.7-39.3-85-86-103-140h-46c0 4.7 6.3 18.7 19 42\\n 18 35.3 40 67.3 66 96l9 9H0v40h399716l-9 9c-26 28.7-48 60.7-66 96-12.7 23.333\\n-19 37.333-19 42h46c18-54 52.3-100.7 103-140l9-7h125l-7 8c-28.7 32-52 65.7-70\\n 101-10.7 23.333-16 35.7-16 37 0 .7 7.7 1 23 1h22c27.3-71.3 75-127 143-167z\",\n // tilde1 is a modified version of a glyph from the MnSymbol package\n tilde1: \"M200 55.538c-77 0-168 73.953-177 73.953-3 0-7\\n-2.175-9-5.437L2 97c-1-2-2-4-2-6 0-4 2-7 5-9l20-12C116 12 171 0 207 0c86 0\\n 114 68 191 68 78 0 168-68 177-68 4 0 7 2 9 5l12 19c1 2.175 2 4.35 2 6.525 0\\n 4.35-2 7.613-5 9.788l-19 13.05c-92 63.077-116.937 75.308-183 76.128\\n-68.267.847-113-73.952-191-73.952z\",\n // ditto tilde2, tilde3, & tilde4\n tilde2: \"M344 55.266c-142 0-300.638 81.316-311.5 86.418\\n-8.01 3.762-22.5 10.91-23.5 5.562L1 120c-1-2-1-3-1-4 0-5 3-9 8-10l18.4-9C160.9\\n 31.9 283 0 358 0c148 0 188 122 331 122s314-97 326-97c4 0 8 2 10 7l7 21.114\\nc1 2.14 1 3.21 1 4.28 0 5.347-3 9.626-7 10.696l-22.3 12.622C852.6 158.372 751\\n 181.476 676 181.476c-149 0-189-126.21-332-126.21z\",\n tilde3: \"M786 59C457 59 32 175.242 13 175.242c-6 0-10-3.457\\n-11-10.37L.15 138c-1-7 3-12 10-13l19.2-6.4C378.4 40.7 634.3 0 804.3 0c337 0\\n 411.8 157 746.8 157 328 0 754-112 773-112 5 0 10 3 11 9l1 14.075c1 8.066-.697\\n 16.595-6.697 17.492l-21.052 7.31c-367.9 98.146-609.15 122.696-778.15 122.696\\n -338 0-409-156.573-744-156.573z\",\n tilde4: \"M786 58C457 58 32 177.487 13 177.487c-6 0-10-3.345\\n-11-10.035L.15 143c-1-7 3-12 10-13l22-6.7C381.2 35 637.15 0 807.15 0c337 0 409\\n 177 744 177 328 0 754-127 773-127 5 0 10 3 11 9l1 14.794c1 7.805-3 13.38-9\\n 14.495l-20.7 5.574c-366.85 99.79-607.3 139.372-776.3 139.372-338 0-409\\n -175.236-744-175.236z\",\n // vec is from glyph U+20D7 in font KaTeX Main\n vec: \"M377 20c0-5.333 1.833-10 5.5-14S391 0 397 0c4.667 0 8.667 1.667 12 5\\n3.333 2.667 6.667 9 10 19 6.667 24.667 20.333 43.667 41 57 7.333 4.667 11\\n10.667 11 18 0 6-1 10-3 12s-6.667 5-14 9c-28.667 14.667-53.667 35.667-75 63\\n-1.333 1.333-3.167 3.5-5.5 6.5s-4 4.833-5 5.5c-1 .667-2.5 1.333-4.5 2s-4.333 1\\n-7 1c-4.667 0-9.167-1.833-13.5-5.5S337 184 337 178c0-12.667 15.667-32.333 47-59\\nH213l-171-1c-8.667-6-13-12.333-13-19 0-4.667 4.333-11.333 13-20h359\\nc-16-25.333-24-45-24-59z\",\n // widehat1 is a modified version of a glyph from the MnSymbol package\n widehat1: \"M529 0h5l519 115c5 1 9 5 9 10 0 1-1 2-1 3l-4 22\\nc-1 5-5 9-11 9h-2L532 67 19 159h-2c-5 0-9-4-11-9l-5-22c-1-6 2-12 8-13z\",\n // ditto widehat2, widehat3, & widehat4\n widehat2: \"M1181 0h2l1171 176c6 0 10 5 10 11l-2 23c-1 6-5 10\\n-11 10h-1L1182 67 15 220h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z\",\n widehat3: \"M1181 0h2l1171 236c6 0 10 5 10 11l-2 23c-1 6-5 10\\n-11 10h-1L1182 67 15 280h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z\",\n widehat4: \"M1181 0h2l1171 296c6 0 10 5 10 11l-2 23c-1 6-5 10\\n-11 10h-1L1182 67 15 340h-1c-6 0-10-4-11-10l-2-23c-1-6 4-11 10-11z\",\n // widecheck paths are all inverted versions of widehat\n widecheck1: \"M529,159h5l519,-115c5,-1,9,-5,9,-10c0,-1,-1,-2,-1,-3l-4,-22c-1,\\n-5,-5,-9,-11,-9h-2l-512,92l-513,-92h-2c-5,0,-9,4,-11,9l-5,22c-1,6,2,12,8,13z\",\n widecheck2: \"M1181,220h2l1171,-176c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\\n-11,-10h-1l-1168,153l-1167,-153h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z\",\n widecheck3: \"M1181,280h2l1171,-236c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\\n-11,-10h-1l-1168,213l-1167,-213h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z\",\n widecheck4: \"M1181,340h2l1171,-296c6,0,10,-5,10,-11l-2,-23c-1,-6,-5,-10,\\n-11,-10h-1l-1168,273l-1167,-273h-1c-6,0,-10,4,-11,10l-2,23c-1,6,4,11,10,11z\",\n // The next ten paths support reaction arrows from the mhchem package.\n // Arrows for \\ce{<-->} are offset from xAxis by 0.22ex, per mhchem in LaTeX\n // baraboveleftarrow is mostly from glyph U+2190 in font KaTeX Main\n baraboveleftarrow: \"M400000 620h-399890l3 -3c68.7 -52.7 113.7 -120 135 -202\\nc4 -14.7 6 -23 6 -25c0 -7.3 -7 -11 -21 -11c-8 0 -13.2 0.8 -15.5 2.5\\nc-2.3 1.7 -4.2 5.8 -5.5 12.5c-1.3 4.7 -2.7 10.3 -4 17c-12 48.7 -34.8 92 -68.5 130\\ns-74.2 66.3 -121.5 85c-10 4 -16 7.7 -18 11c0 8.7 6 14.3 18 17c47.3 18.7 87.8 47\\n121.5 85s56.5 81.3 68.5 130c0.7 2 1.3 5 2 9s1.2 6.7 1.5 8c0.3 1.3 1 3.3 2 6\\ns2.2 4.5 3.5 5.5c1.3 1 3.3 1.8 6 2.5s6 1 10 1c14 0 21 -3.7 21 -11\\nc0 -2 -2 -10.3 -6 -25c-20 -79.3 -65 -146.7 -135 -202l-3 -3h399890z\\nM100 620v40h399900v-40z M0 241v40h399900v-40zM0 241v40h399900v-40z\",\n // rightarrowabovebar is mostly from glyph U+2192, KaTeX Main\n rightarrowabovebar: \"M0 241v40h399891c-47.3 35.3-84 78-110 128-16.7 32\\n-27.7 63.7-33 95 0 1.3-.2 2.7-.5 4-.3 1.3-.5 2.3-.5 3 0 7.3 6.7 11 20 11 8 0\\n13.2-.8 15.5-2.5 2.3-1.7 4.2-5.5 5.5-11.5 2-13.3 5.7-27 11-41 14.7-44.7 39\\n-84.5 73-119.5s73.7-60.2 119-75.5c6-2 9-5.7 9-11s-3-9-9-11c-45.3-15.3-85-40.5\\n-119-75.5s-58.3-74.8-73-119.5c-4.7-14-8.3-27.3-11-40-1.3-6.7-3.2-10.8-5.5\\n-12.5-2.3-1.7-7.5-2.5-15.5-2.5-14 0-21 3.7-21 11 0 2 2 10.3 6 25 20.7 83.3 67\\n151.7 139 205zm96 379h399894v40H0zm0 0h399904v40H0z\",\n // The short left harpoon has 0.5em (i.e. 500 units) kern on the left end.\n // Ref from mhchem.sty: \\rlap{\\raisebox{-.22ex}{$\\kern0.5em\n baraboveshortleftharpoon: \"M507,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17\\nc2,0.7,5,1,9,1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21\\nc-32,-87.3,-82.7,-157.7,-152,-211c0,0,-3,-3,-3,-3l399351,0l0,-40\\nc-398570,0,-399437,0,-399437,0z M593 435 v40 H399500 v-40z\\nM0 281 v-40 H399908 v40z M0 281 v-40 H399908 v40z\",\n rightharpoonaboveshortbar: \"M0,241 l0,40c399126,0,399993,0,399993,0\\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\\nM0 241 v40 H399908 v-40z M0 475 v-40 H399500 v40z M0 475 v-40 H399500 v40z\",\n shortbaraboveleftharpoon: \"M7,435c-4,4,-6.3,8.7,-7,14c0,5.3,0.7,9,2,11\\nc1.3,2,5.3,5.3,12,10c90.7,54,156,130,196,228c3.3,10.7,6.3,16.3,9,17c2,0.7,5,1,9,\\n1c0,0,5,0,5,0c10.7,0,16.7,-2,18,-6c2,-2.7,1,-9.7,-3,-21c-32,-87.3,-82.7,-157.7,\\n-152,-211c0,0,-3,-3,-3,-3l399907,0l0,-40c-399126,0,-399993,0,-399993,0z\\nM93 435 v40 H400000 v-40z M500 241 v40 H400000 v-40z M500 241 v40 H400000 v-40z\",\n shortrightharpoonabovebar: \"M53,241l0,40c398570,0,399437,0,399437,0\\nc4.7,-4.7,7,-9.3,7,-14c0,-9.3,-3.7,-15.3,-11,-18c-92.7,-56.7,-159,-133.7,-199,\\n-231c-3.3,-9.3,-6,-14.7,-8,-16c-2,-1.3,-7,-2,-15,-2c-10.7,0,-16.7,2,-18,6\\nc-2,2.7,-1,9.7,3,21c15.3,42,36.7,81.8,64,119.5c27.3,37.7,58,69.2,92,94.5z\\nM500 241 v40 H399408 v-40z M500 435 v40 H400000 v-40z\"\n};\nvar tallDelim = function tallDelim(label, midHeight) {\n switch (label) {\n case \"lbrack\":\n return \"M403 1759 V84 H666 V0 H319 V1759 v\" + midHeight + \" v1759 h347 v-84\\nH403z M403 1759 V0 H319 V1759 v\" + midHeight + \" v1759 h84z\";\n\n case \"rbrack\":\n return \"M347 1759 V0 H0 V84 H263 V1759 v\" + midHeight + \" v1759 H0 v84 H347z\\nM347 1759 V0 H263 V1759 v\" + midHeight + \" v1759 h84z\";\n\n case \"vert\":\n return \"M145 15 v585 v\" + midHeight + \" v585 c2.667,10,9.667,15,21,15\\nc10,0,16.667,-5,20,-15 v-585 v\" + -midHeight + \" v-585 c-2.667,-10,-9.667,-15,-21,-15\\nc-10,0,-16.667,5,-20,15z M188 15 H145 v585 v\" + midHeight + \" v585 h43z\";\n\n case \"doublevert\":\n return \"M145 15 v585 v\" + midHeight + \" v585 c2.667,10,9.667,15,21,15\\nc10,0,16.667,-5,20,-15 v-585 v\" + -midHeight + \" v-585 c-2.667,-10,-9.667,-15,-21,-15\\nc-10,0,-16.667,5,-20,15z M188 15 H145 v585 v\" + midHeight + \" v585 h43z\\nM367 15 v585 v\" + midHeight + \" v585 c2.667,10,9.667,15,21,15\\nc10,0,16.667,-5,20,-15 v-585 v\" + -midHeight + \" v-585 c-2.667,-10,-9.667,-15,-21,-15\\nc-10,0,-16.667,5,-20,15z M410 15 H367 v585 v\" + midHeight + \" v585 h43z\";\n\n case \"lfloor\":\n return \"M319 602 V0 H403 V602 v\" + midHeight + \" v1715 h263 v84 H319z\\nMM319 602 V0 H403 V602 v\" + midHeight + \" v1715 H319z\";\n\n case \"rfloor\":\n return \"M319 602 V0 H403 V602 v\" + midHeight + \" v1799 H0 v-84 H319z\\nMM319 602 V0 H403 V602 v\" + midHeight + \" v1715 H319z\";\n\n case \"lceil\":\n return \"M403 1759 V84 H666 V0 H319 V1759 v\" + midHeight + \" v602 h84z\\nM403 1759 V0 H319 V1759 v\" + midHeight + \" v602 h84z\";\n\n case \"rceil\":\n return \"M347 1759 V0 H0 V84 H263 V1759 v\" + midHeight + \" v602 h84z\\nM347 1759 V0 h-84 V1759 v\" + midHeight + \" v602 h84z\";\n\n case \"lparen\":\n return \"M863,9c0,-2,-2,-5,-6,-9c0,0,-17,0,-17,0c-12.7,0,-19.3,0.3,-20,1\\nc-5.3,5.3,-10.3,11,-15,17c-242.7,294.7,-395.3,682,-458,1162c-21.3,163.3,-33.3,349,\\n-36,557 l0,\" + (midHeight + 84) + \"c0.2,6,0,26,0,60c2,159.3,10,310.7,24,454c53.3,528,210,\\n949.7,470,1265c4.7,6,9.7,11.7,15,17c0.7,0.7,7,1,19,1c0,0,18,0,18,0c4,-4,6,-7,6,-9\\nc0,-2.7,-3.3,-8.7,-10,-18c-135.3,-192.7,-235.5,-414.3,-300.5,-665c-65,-250.7,-102.5,\\n-544.7,-112.5,-882c-2,-104,-3,-167,-3,-189\\nl0,-\" + (midHeight + 92) + \"c0,-162.7,5.7,-314,17,-454c20.7,-272,63.7,-513,129,-723c65.3,\\n-210,155.3,-396.3,270,-559c6.7,-9.3,10,-15.3,10,-18z\";\n\n case \"rparen\":\n return \"M76,0c-16.7,0,-25,3,-25,9c0,2,2,6.3,6,13c21.3,28.7,42.3,60.3,\\n63,95c96.7,156.7,172.8,332.5,228.5,527.5c55.7,195,92.8,416.5,111.5,664.5\\nc11.3,139.3,17,290.7,17,454c0,28,1.7,43,3.3,45l0,\" + (midHeight + 9) + \"\\nc-3,4,-3.3,16.7,-3.3,38c0,162,-5.7,313.7,-17,455c-18.7,248,-55.8,469.3,-111.5,664\\nc-55.7,194.7,-131.8,370.3,-228.5,527c-20.7,34.7,-41.7,66.3,-63,95c-2,3.3,-4,7,-6,11\\nc0,7.3,5.7,11,17,11c0,0,11,0,11,0c9.3,0,14.3,-0.3,15,-1c5.3,-5.3,10.3,-11,15,-17\\nc242.7,-294.7,395.3,-681.7,458,-1161c21.3,-164.7,33.3,-350.7,36,-558\\nl0,-\" + (midHeight + 144) + \"c-2,-159.3,-10,-310.7,-24,-454c-53.3,-528,-210,-949.7,\\n-470,-1265c-4.7,-6,-9.7,-11.7,-15,-17c-0.7,-0.7,-6.7,-1,-18,-1z\";\n\n default:\n // We should not ever get here.\n throw new Error(\"Unknown stretchy delimiter.\");\n }\n};\n\n/**\n * This node represents a document fragment, which contains elements, but when\n * placed into the DOM doesn't have any representation itself. It only contains\n * children and doesn't have any DOM node properties.\n */\nclass DocumentFragment {\n // HtmlDomNode\n // Never used; needed for satisfying interface.\n constructor(children) {\n this.children = void 0;\n this.classes = void 0;\n this.height = void 0;\n this.depth = void 0;\n this.maxFontSize = void 0;\n this.style = void 0;\n this.children = children;\n this.classes = [];\n this.height = 0;\n this.depth = 0;\n this.maxFontSize = 0;\n this.style = {};\n }\n\n hasClass(className) {\n return utils.contains(this.classes, className);\n }\n /** Convert the fragment into a node. */\n\n\n toNode() {\n var frag = document.createDocumentFragment();\n\n for (var i = 0; i < this.children.length; i++) {\n frag.appendChild(this.children[i].toNode());\n }\n\n return frag;\n }\n /** Convert the fragment into HTML markup. */\n\n\n toMarkup() {\n var markup = \"\"; // Simply concatenate the markup for the children together.\n\n for (var i = 0; i < this.children.length; i++) {\n markup += this.children[i].toMarkup();\n }\n\n return markup;\n }\n /**\n * Converts the math node into a string, similar to innerText. Applies to\n * MathDomNode's only.\n */\n\n\n toText() {\n // To avoid this, we would subclass documentFragment separately for\n // MathML, but polyfills for subclassing is expensive per PR 1469.\n // $FlowFixMe: Only works for ChildType = MathDomNode.\n var toText = child => child.toText();\n\n return this.children.map(toText).join(\"\");\n }\n\n}\n\n// This file is GENERATED by buildMetrics.sh. DO NOT MODIFY.\nvar fontMetricsData = {\n \"AMS-Regular\": {\n \"32\": [0, 0, 0, 0, 0.25],\n \"65\": [0, 0.68889, 0, 0, 0.72222],\n \"66\": [0, 0.68889, 0, 0, 0.66667],\n \"67\": [0, 0.68889, 0, 0, 0.72222],\n \"68\": [0, 0.68889, 0, 0, 0.72222],\n \"69\": [0, 0.68889, 0, 0, 0.66667],\n \"70\": [0, 0.68889, 0, 0, 0.61111],\n \"71\": [0, 0.68889, 0, 0, 0.77778],\n \"72\": [0, 0.68889, 0, 0, 0.77778],\n \"73\": [0, 0.68889, 0, 0, 0.38889],\n \"74\": [0.16667, 0.68889, 0, 0, 0.5],\n \"75\": [0, 0.68889, 0, 0, 0.77778],\n \"76\": [0, 0.68889, 0, 0, 0.66667],\n \"77\": [0, 0.68889, 0, 0, 0.94445],\n \"78\": [0, 0.68889, 0, 0, 0.72222],\n \"79\": [0.16667, 0.68889, 0, 0, 0.77778],\n \"80\": [0, 0.68889, 0, 0, 0.61111],\n \"81\": [0.16667, 0.68889, 0, 0, 0.77778],\n \"82\": [0, 0.68889, 0, 0, 0.72222],\n \"83\": [0, 0.68889, 0, 0, 0.55556],\n \"84\": [0, 0.68889, 0, 0, 0.66667],\n \"85\": [0, 0.68889, 0, 0, 0.72222],\n \"86\": [0, 0.68889, 0, 0, 0.72222],\n \"87\": [0, 0.68889, 0, 0, 1.0],\n \"88\": [0, 0.68889, 0, 0, 0.72222],\n \"89\": [0, 0.68889, 0, 0, 0.72222],\n \"90\": [0, 0.68889, 0, 0, 0.66667],\n \"107\": [0, 0.68889, 0, 0, 0.55556],\n \"160\": [0, 0, 0, 0, 0.25],\n \"165\": [0, 0.675, 0.025, 0, 0.75],\n \"174\": [0.15559, 0.69224, 0, 0, 0.94666],\n \"240\": [0, 0.68889, 0, 0, 0.55556],\n \"295\": [0, 0.68889, 0, 0, 0.54028],\n \"710\": [0, 0.825, 0, 0, 2.33334],\n \"732\": [0, 0.9, 0, 0, 2.33334],\n \"770\": [0, 0.825, 0, 0, 2.33334],\n \"771\": [0, 0.9, 0, 0, 2.33334],\n \"989\": [0.08167, 0.58167, 0, 0, 0.77778],\n \"1008\": [0, 0.43056, 0.04028, 0, 0.66667],\n \"8245\": [0, 0.54986, 0, 0, 0.275],\n \"8463\": [0, 0.68889, 0, 0, 0.54028],\n \"8487\": [0, 0.68889, 0, 0, 0.72222],\n \"8498\": [0, 0.68889, 0, 0, 0.55556],\n \"8502\": [0, 0.68889, 0, 0, 0.66667],\n \"8503\": [0, 0.68889, 0, 0, 0.44445],\n \"8504\": [0, 0.68889, 0, 0, 0.66667],\n \"8513\": [0, 0.68889, 0, 0, 0.63889],\n \"8592\": [-0.03598, 0.46402, 0, 0, 0.5],\n \"8594\": [-0.03598, 0.46402, 0, 0, 0.5],\n \"8602\": [-0.13313, 0.36687, 0, 0, 1.0],\n \"8603\": [-0.13313, 0.36687, 0, 0, 1.0],\n \"8606\": [0.01354, 0.52239, 0, 0, 1.0],\n \"8608\": [0.01354, 0.52239, 0, 0, 1.0],\n \"8610\": [0.01354, 0.52239, 0, 0, 1.11111],\n \"8611\": [0.01354, 0.52239, 0, 0, 1.11111],\n \"8619\": [0, 0.54986, 0, 0, 1.0],\n \"8620\": [0, 0.54986, 0, 0, 1.0],\n \"8621\": [-0.13313, 0.37788, 0, 0, 1.38889],\n \"8622\": [-0.13313, 0.36687, 0, 0, 1.0],\n \"8624\": [0, 0.69224, 0, 0, 0.5],\n \"8625\": [0, 0.69224, 0, 0, 0.5],\n \"8630\": [0, 0.43056, 0, 0, 1.0],\n \"8631\": [0, 0.43056, 0, 0, 1.0],\n \"8634\": [0.08198, 0.58198, 0, 0, 0.77778],\n \"8635\": [0.08198, 0.58198, 0, 0, 0.77778],\n \"8638\": [0.19444, 0.69224, 0, 0, 0.41667],\n \"8639\": [0.19444, 0.69224, 0, 0, 0.41667],\n \"8642\": [0.19444, 0.69224, 0, 0, 0.41667],\n \"8643\": [0.19444, 0.69224, 0, 0, 0.41667],\n \"8644\": [0.1808, 0.675, 0, 0, 1.0],\n \"8646\": [0.1808, 0.675, 0, 0, 1.0],\n \"8647\": [0.1808, 0.675, 0, 0, 1.0],\n \"8648\": [0.19444, 0.69224, 0, 0, 0.83334],\n \"8649\": [0.1808, 0.675, 0, 0, 1.0],\n \"8650\": [0.19444, 0.69224, 0, 0, 0.83334],\n \"8651\": [0.01354, 0.52239, 0, 0, 1.0],\n \"8652\": [0.01354, 0.52239, 0, 0, 1.0],\n \"8653\": [-0.13313, 0.36687, 0, 0, 1.0],\n \"8654\": [-0.13313, 0.36687, 0, 0, 1.0],\n \"8655\": [-0.13313, 0.36687, 0, 0, 1.0],\n \"8666\": [0.13667, 0.63667, 0, 0, 1.0],\n \"8667\": [0.13667, 0.63667, 0, 0, 1.0],\n \"8669\": [-0.13313, 0.37788, 0, 0, 1.0],\n \"8672\": [-0.064, 0.437, 0, 0, 1.334],\n \"8674\": [-0.064, 0.437, 0, 0, 1.334],\n \"8705\": [0, 0.825, 0, 0, 0.5],\n \"8708\": [0, 0.68889, 0, 0, 0.55556],\n \"8709\": [0.08167, 0.58167, 0, 0, 0.77778],\n \"8717\": [0, 0.43056, 0, 0, 0.42917],\n \"8722\": [-0.03598, 0.46402, 0, 0, 0.5],\n \"8724\": [0.08198, 0.69224, 0, 0, 0.77778],\n \"8726\": [0.08167, 0.58167, 0, 0, 0.77778],\n \"8733\": [0, 0.69224, 0, 0, 0.77778],\n \"8736\": [0, 0.69224, 0, 0, 0.72222],\n \"8737\": [0, 0.69224, 0, 0, 0.72222],\n \"8738\": [0.03517, 0.52239, 0, 0, 0.72222],\n \"8739\": [0.08167, 0.58167, 0, 0, 0.22222],\n \"8740\": [0.25142, 0.74111, 0, 0, 0.27778],\n \"8741\": [0.08167, 0.58167, 0, 0, 0.38889],\n \"8742\": [0.25142, 0.74111, 0, 0, 0.5],\n \"8756\": [0, 0.69224, 0, 0, 0.66667],\n \"8757\": [0, 0.69224, 0, 0, 0.66667],\n \"8764\": [-0.13313, 0.36687, 0, 0, 0.77778],\n \"8765\": [-0.13313, 0.37788, 0, 0, 0.77778],\n \"8769\": [-0.13313, 0.36687, 0, 0, 0.77778],\n \"8770\": [-0.03625, 0.46375, 0, 0, 0.77778],\n \"8774\": [0.30274, 0.79383, 0, 0, 0.77778],\n \"8776\": [-0.01688, 0.48312, 0, 0, 0.77778],\n \"8778\": [0.08167, 0.58167, 0, 0, 0.77778],\n \"8782\": [0.06062, 0.54986, 0, 0, 0.77778],\n \"8783\": [0.06062, 0.54986, 0, 0, 0.77778],\n \"8785\": [0.08198, 0.58198, 0, 0, 0.77778],\n \"8786\": [0.08198, 0.58198, 0, 0, 0.77778],\n \"8787\": [0.08198, 0.58198, 0, 0, 0.77778],\n \"8790\": [0, 0.69224, 0, 0, 0.77778],\n \"8791\": [0.22958, 0.72958, 0, 0, 0.77778],\n \"8796\": [0.08198, 0.91667, 0, 0, 0.77778],\n \"8806\": [0.25583, 0.75583, 0, 0, 0.77778],\n \"8807\": [0.25583, 0.75583, 0, 0, 0.77778],\n \"8808\": [0.25142, 0.75726, 0, 0, 0.77778],\n \"8809\": [0.25142, 0.75726, 0, 0, 0.77778],\n \"8812\": [0.25583, 0.75583, 0, 0, 0.5],\n \"8814\": [0.20576, 0.70576, 0, 0, 0.77778],\n \"8815\": [0.20576, 0.70576, 0, 0, 0.77778],\n \"8816\": [0.30274, 0.79383, 0, 0, 0.77778],\n \"8817\": [0.30274, 0.79383, 0, 0, 0.77778],\n \"8818\": [0.22958, 0.72958, 0, 0, 0.77778],\n \"8819\": [0.22958, 0.72958, 0, 0, 0.77778],\n \"8822\": [0.1808, 0.675, 0, 0, 0.77778],\n \"8823\": [0.1808, 0.675, 0, 0, 0.77778],\n \"8828\": [0.13667, 0.63667, 0, 0, 0.77778],\n \"8829\": [0.13667, 0.63667, 0, 0, 0.77778],\n \"8830\": [0.22958, 0.72958, 0, 0, 0.77778],\n \"8831\": [0.22958, 0.72958, 0, 0, 0.77778],\n \"8832\": [0.20576, 0.70576, 0, 0, 0.77778],\n \"8833\": [0.20576, 0.70576, 0, 0, 0.77778],\n \"8840\": [0.30274, 0.79383, 0, 0, 0.77778],\n \"8841\": [0.30274, 0.79383, 0, 0, 0.77778],\n \"8842\": [0.13597, 0.63597, 0, 0, 0.77778],\n \"8843\": [0.13597, 0.63597, 0, 0, 0.77778],\n \"8847\": [0.03517, 0.54986, 0, 0, 0.77778],\n \"8848\": [0.03517, 0.54986, 0, 0, 0.77778],\n \"8858\": [0.08198, 0.58198, 0, 0, 0.77778],\n \"8859\": [0.08198, 0.58198, 0, 0, 0.77778],\n \"8861\": [0.08198, 0.58198, 0, 0, 0.77778],\n \"8862\": [0, 0.675, 0, 0, 0.77778],\n \"8863\": [0, 0.675, 0, 0, 0.77778],\n \"8864\": [0, 0.675, 0, 0, 0.77778],\n \"8865\": [0, 0.675, 0, 0, 0.77778],\n \"8872\": [0, 0.69224, 0, 0, 0.61111],\n \"8873\": [0, 0.69224, 0, 0, 0.72222],\n \"8874\": [0, 0.69224, 0, 0, 0.88889],\n \"8876\": [0, 0.68889, 0, 0, 0.61111],\n \"8877\": [0, 0.68889, 0, 0, 0.61111],\n \"8878\": [0, 0.68889, 0, 0, 0.72222],\n \"8879\": [0, 0.68889, 0, 0, 0.72222],\n \"8882\": [0.03517, 0.54986, 0, 0, 0.77778],\n \"8883\": [0.03517, 0.54986, 0, 0, 0.77778],\n \"8884\": [0.13667, 0.63667, 0, 0, 0.77778],\n \"8885\": [0.13667, 0.63667, 0, 0, 0.77778],\n \"8888\": [0, 0.54986, 0, 0, 1.11111],\n \"8890\": [0.19444, 0.43056, 0, 0, 0.55556],\n \"8891\": [0.19444, 0.69224, 0, 0, 0.61111],\n \"8892\": [0.19444, 0.69224, 0, 0, 0.61111],\n \"8901\": [0, 0.54986, 0, 0, 0.27778],\n \"8903\": [0.08167, 0.58167, 0, 0, 0.77778],\n \"8905\": [0.08167, 0.58167, 0, 0, 0.77778],\n \"8906\": [0.08167, 0.58167, 0, 0, 0.77778],\n \"8907\": [0, 0.69224, 0, 0, 0.77778],\n \"8908\": [0, 0.69224, 0, 0, 0.77778],\n \"8909\": [-0.03598, 0.46402, 0, 0, 0.77778],\n \"8910\": [0, 0.54986, 0, 0, 0.76042],\n \"8911\": [0, 0.54986, 0, 0, 0.76042],\n \"8912\": [0.03517, 0.54986, 0, 0, 0.77778],\n \"8913\": [0.03517, 0.54986, 0, 0, 0.77778],\n \"8914\": [0, 0.54986, 0, 0, 0.66667],\n \"8915\": [0, 0.54986, 0, 0, 0.66667],\n \"8916\": [0, 0.69224, 0, 0, 0.66667],\n \"8918\": [0.0391, 0.5391, 0, 0, 0.77778],\n \"8919\": [0.0391, 0.5391, 0, 0, 0.77778],\n \"8920\": [0.03517, 0.54986, 0, 0, 1.33334],\n \"8921\": [0.03517, 0.54986, 0, 0, 1.33334],\n \"8922\": [0.38569, 0.88569, 0, 0, 0.77778],\n \"8923\": [0.38569, 0.88569, 0, 0, 0.77778],\n \"8926\": [0.13667, 0.63667, 0, 0, 0.77778],\n \"8927\": [0.13667, 0.63667, 0, 0, 0.77778],\n \"8928\": [0.30274, 0.79383, 0, 0, 0.77778],\n \"8929\": [0.30274, 0.79383, 0, 0, 0.77778],\n \"8934\": [0.23222, 0.74111, 0, 0, 0.77778],\n \"8935\": [0.23222, 0.74111, 0, 0, 0.77778],\n \"8936\": [0.23222, 0.74111, 0, 0, 0.77778],\n \"8937\": [0.23222, 0.74111, 0, 0, 0.77778],\n \"8938\": [0.20576, 0.70576, 0, 0, 0.77778],\n \"8939\": [0.20576, 0.70576, 0, 0, 0.77778],\n \"8940\": [0.30274, 0.79383, 0, 0, 0.77778],\n \"8941\": [0.30274, 0.79383, 0, 0, 0.77778],\n \"8994\": [0.19444, 0.69224, 0, 0, 0.77778],\n \"8995\": [0.19444, 0.69224, 0, 0, 0.77778],\n \"9416\": [0.15559, 0.69224, 0, 0, 0.90222],\n \"9484\": [0, 0.69224, 0, 0, 0.5],\n \"9488\": [0, 0.69224, 0, 0, 0.5],\n \"9492\": [0, 0.37788, 0, 0, 0.5],\n \"9496\": [0, 0.37788, 0, 0, 0.5],\n \"9585\": [0.19444, 0.68889, 0, 0, 0.88889],\n \"9586\": [0.19444, 0.74111, 0, 0, 0.88889],\n \"9632\": [0, 0.675, 0, 0, 0.77778],\n \"9633\": [0, 0.675, 0, 0, 0.77778],\n \"9650\": [0, 0.54986, 0, 0, 0.72222],\n \"9651\": [0, 0.54986, 0, 0, 0.72222],\n \"9654\": [0.03517, 0.54986, 0, 0, 0.77778],\n \"9660\": [0, 0.54986, 0, 0, 0.72222],\n \"9661\": [0, 0.54986, 0, 0, 0.72222],\n \"9664\": [0.03517, 0.54986, 0, 0, 0.77778],\n \"9674\": [0.11111, 0.69224, 0, 0, 0.66667],\n \"9733\": [0.19444, 0.69224, 0, 0, 0.94445],\n \"10003\": [0, 0.69224, 0, 0, 0.83334],\n \"10016\": [0, 0.69224, 0, 0, 0.83334],\n \"10731\": [0.11111, 0.69224, 0, 0, 0.66667],\n \"10846\": [0.19444, 0.75583, 0, 0, 0.61111],\n \"10877\": [0.13667, 0.63667, 0, 0, 0.77778],\n \"10878\": [0.13667, 0.63667, 0, 0, 0.77778],\n \"10885\": [0.25583, 0.75583, 0, 0, 0.77778],\n \"10886\": [0.25583, 0.75583, 0, 0, 0.77778],\n \"10887\": [0.13597, 0.63597, 0, 0, 0.77778],\n \"10888\": [0.13597, 0.63597, 0, 0, 0.77778],\n \"10889\": [0.26167, 0.75726, 0, 0, 0.77778],\n \"10890\": [0.26167, 0.75726, 0, 0, 0.77778],\n \"10891\": [0.48256, 0.98256, 0, 0, 0.77778],\n \"10892\": [0.48256, 0.98256, 0, 0, 0.77778],\n \"10901\": [0.13667, 0.63667, 0, 0, 0.77778],\n \"10902\": [0.13667, 0.63667, 0, 0, 0.77778],\n \"10933\": [0.25142, 0.75726, 0, 0, 0.77778],\n \"10934\": [0.25142, 0.75726, 0, 0, 0.77778],\n \"10935\": [0.26167, 0.75726, 0, 0, 0.77778],\n \"10936\": [0.26167, 0.75726, 0, 0, 0.77778],\n \"10937\": [0.26167, 0.75726, 0, 0, 0.77778],\n \"10938\": [0.26167, 0.75726, 0, 0, 0.77778],\n \"10949\": [0.25583, 0.75583, 0, 0, 0.77778],\n \"10950\": [0.25583, 0.75583, 0, 0, 0.77778],\n \"10955\": [0.28481, 0.79383, 0, 0, 0.77778],\n \"10956\": [0.28481, 0.79383, 0, 0, 0.77778],\n \"57350\": [0.08167, 0.58167, 0, 0, 0.22222],\n \"57351\": [0.08167, 0.58167, 0, 0, 0.38889],\n \"57352\": [0.08167, 0.58167, 0, 0, 0.77778],\n \"57353\": [0, 0.43056, 0.04028, 0, 0.66667],\n \"57356\": [0.25142, 0.75726, 0, 0, 0.77778],\n \"57357\": [0.25142, 0.75726, 0, 0, 0.77778],\n \"57358\": [0.41951, 0.91951, 0, 0, 0.77778],\n \"57359\": [0.30274, 0.79383, 0, 0, 0.77778],\n \"57360\": [0.30274, 0.79383, 0, 0, 0.77778],\n \"57361\": [0.41951, 0.91951, 0, 0, 0.77778],\n \"57366\": [0.25142, 0.75726, 0, 0, 0.77778],\n \"57367\": [0.25142, 0.75726, 0, 0, 0.77778],\n \"57368\": [0.25142, 0.75726, 0, 0, 0.77778],\n \"57369\": [0.25142, 0.75726, 0, 0, 0.77778],\n \"57370\": [0.13597, 0.63597, 0, 0, 0.77778],\n \"57371\": [0.13597, 0.63597, 0, 0, 0.77778]\n },\n \"Caligraphic-Regular\": {\n \"32\": [0, 0, 0, 0, 0.25],\n \"65\": [0, 0.68333, 0, 0.19445, 0.79847],\n \"66\": [0, 0.68333, 0.03041, 0.13889, 0.65681],\n \"67\": [0, 0.68333, 0.05834, 0.13889, 0.52653],\n \"68\": [0, 0.68333, 0.02778, 0.08334, 0.77139],\n \"69\": [0, 0.68333, 0.08944, 0.11111, 0.52778],\n \"70\": [0, 0.68333, 0.09931, 0.11111, 0.71875],\n \"71\": [0.09722, 0.68333, 0.0593, 0.11111, 0.59487],\n \"72\": [0, 0.68333, 0.00965, 0.11111, 0.84452],\n \"73\": [0, 0.68333, 0.07382, 0, 0.54452],\n \"74\": [0.09722, 0.68333, 0.18472, 0.16667, 0.67778],\n \"75\": [0, 0.68333, 0.01445, 0.05556, 0.76195],\n \"76\": [0, 0.68333, 0, 0.13889, 0.68972],\n \"77\": [0, 0.68333, 0, 0.13889, 1.2009],\n \"78\": [0, 0.68333, 0.14736, 0.08334, 0.82049],\n \"79\": [0, 0.68333, 0.02778, 0.11111, 0.79611],\n \"80\": [0, 0.68333, 0.08222, 0.08334, 0.69556],\n \"81\": [0.09722, 0.68333, 0, 0.11111, 0.81667],\n \"82\": [0, 0.68333, 0, 0.08334, 0.8475],\n \"83\": [0, 0.68333, 0.075, 0.13889, 0.60556],\n \"84\": [0, 0.68333, 0.25417, 0, 0.54464],\n \"85\": [0, 0.68333, 0.09931, 0.08334, 0.62583],\n \"86\": [0, 0.68333, 0.08222, 0, 0.61278],\n \"87\": [0, 0.68333, 0.08222, 0.08334, 0.98778],\n \"88\": [0, 0.68333, 0.14643, 0.13889, 0.7133],\n \"89\": [0.09722, 0.68333, 0.08222, 0.08334, 0.66834],\n \"90\": [0, 0.68333, 0.07944, 0.13889, 0.72473],\n \"160\": [0, 0, 0, 0, 0.25]\n },\n \"Fraktur-Regular\": {\n \"32\": [0, 0, 0, 0, 0.25],\n \"33\": [0, 0.69141, 0, 0, 0.29574],\n \"34\": [0, 0.69141, 0, 0, 0.21471],\n \"38\": [0, 0.69141, 0, 0, 0.73786],\n \"39\": [0, 0.69141, 0, 0, 0.21201],\n \"40\": [0.24982, 0.74947, 0, 0, 0.38865],\n \"41\": [0.24982, 0.74947, 0, 0, 0.38865],\n \"42\": [0, 0.62119, 0, 0, 0.27764],\n \"43\": [0.08319, 0.58283, 0, 0, 0.75623],\n \"44\": [0, 0.10803, 0, 0, 0.27764],\n \"45\": [0.08319, 0.58283, 0, 0, 0.75623],\n \"46\": [0, 0.10803, 0, 0, 0.27764],\n \"47\": [0.24982, 0.74947, 0, 0, 0.50181],\n \"48\": [0, 0.47534, 0, 0, 0.50181],\n \"49\": [0, 0.47534, 0, 0, 0.50181],\n \"50\": [0, 0.47534, 0, 0, 0.50181],\n \"51\": [0.18906, 0.47534, 0, 0, 0.50181],\n \"52\": [0.18906, 0.47534, 0, 0, 0.50181],\n \"53\": [0.18906, 0.47534, 0, 0, 0.50181],\n \"54\": [0, 0.69141, 0, 0, 0.50181],\n \"55\": [0.18906, 0.47534, 0, 0, 0.50181],\n \"56\": [0, 0.69141, 0, 0, 0.50181],\n \"57\": [0.18906, 0.47534, 0, 0, 0.50181],\n \"58\": [0, 0.47534, 0, 0, 0.21606],\n \"59\": [0.12604, 0.47534, 0, 0, 0.21606],\n \"61\": [-0.13099, 0.36866, 0, 0, 0.75623],\n \"63\": [0, 0.69141, 0, 0, 0.36245],\n \"65\": [0, 0.69141, 0, 0, 0.7176],\n \"66\": [0, 0.69141, 0, 0, 0.88397],\n \"67\": [0, 0.69141, 0, 0, 0.61254],\n \"68\": [0, 0.69141, 0, 0, 0.83158],\n \"69\": [0, 0.69141, 0, 0, 0.66278],\n \"70\": [0.12604, 0.69141, 0, 0, 0.61119],\n \"71\": [0, 0.69141, 0, 0, 0.78539],\n \"72\": [0.06302, 0.69141, 0, 0, 0.7203],\n \"73\": [0, 0.69141, 0, 0, 0.55448],\n \"74\": [0.12604, 0.69141, 0, 0, 0.55231],\n \"75\": [0, 0.69141, 0, 0, 0.66845],\n \"76\": [0, 0.69141, 0, 0, 0.66602],\n \"77\": [0, 0.69141, 0, 0, 1.04953],\n \"78\": [0, 0.69141, 0, 0, 0.83212],\n \"79\": [0, 0.69141, 0, 0, 0.82699],\n \"80\": [0.18906, 0.69141, 0, 0, 0.82753],\n \"81\": [0.03781, 0.69141, 0, 0, 0.82699],\n \"82\": [0, 0.69141, 0, 0, 0.82807],\n \"83\": [0, 0.69141, 0, 0, 0.82861],\n \"84\": [0, 0.69141, 0, 0, 0.66899],\n \"85\": [0, 0.69141, 0, 0, 0.64576],\n \"86\": [0, 0.69141, 0, 0, 0.83131],\n \"87\": [0, 0.69141, 0, 0, 1.04602],\n \"88\": [0, 0.69141, 0, 0, 0.71922],\n \"89\": [0.18906, 0.69141, 0, 0, 0.83293],\n \"90\": [0.12604, 0.69141, 0, 0, 0.60201],\n \"91\": [0.24982, 0.74947, 0, 0, 0.27764],\n \"93\": [0.24982, 0.74947, 0, 0, 0.27764],\n \"94\": [0, 0.69141, 0, 0, 0.49965],\n \"97\": [0, 0.47534, 0, 0, 0.50046],\n \"98\": [0, 0.69141, 0, 0, 0.51315],\n \"99\": [0, 0.47534, 0, 0, 0.38946],\n \"100\": [0, 0.62119, 0, 0, 0.49857],\n \"101\": [0, 0.47534, 0, 0, 0.40053],\n \"102\": [0.18906, 0.69141, 0, 0, 0.32626],\n \"103\": [0.18906, 0.47534, 0, 0, 0.5037],\n \"104\": [0.18906, 0.69141, 0, 0, 0.52126],\n \"105\": [0, 0.69141, 0, 0, 0.27899],\n \"106\": [0, 0.69141, 0, 0, 0.28088],\n \"107\": [0, 0.69141, 0, 0, 0.38946],\n \"108\": [0, 0.69141, 0, 0, 0.27953],\n \"109\": [0, 0.47534, 0, 0, 0.76676],\n \"110\": [0, 0.47534, 0, 0, 0.52666],\n \"111\": [0, 0.47534, 0, 0, 0.48885],\n \"112\": [0.18906, 0.52396, 0, 0, 0.50046],\n \"113\": [0.18906, 0.47534, 0, 0, 0.48912],\n \"114\": [0, 0.47534, 0, 0, 0.38919],\n \"115\": [0, 0.47534, 0, 0, 0.44266],\n \"116\": [0, 0.62119, 0, 0, 0.33301],\n \"117\": [0, 0.47534, 0, 0, 0.5172],\n \"118\": [0, 0.52396, 0, 0, 0.5118],\n \"119\": [0, 0.52396, 0, 0, 0.77351],\n \"120\": [0.18906, 0.47534, 0, 0, 0.38865],\n \"121\": [0.18906, 0.47534, 0, 0, 0.49884],\n \"122\": [0.18906, 0.47534, 0, 0, 0.39054],\n \"160\": [0, 0, 0, 0, 0.25],\n \"8216\": [0, 0.69141, 0, 0, 0.21471],\n \"8217\": [0, 0.69141, 0, 0, 0.21471],\n \"58112\": [0, 0.62119, 0, 0, 0.49749],\n \"58113\": [0, 0.62119, 0, 0, 0.4983],\n \"58114\": [0.18906, 0.69141, 0, 0, 0.33328],\n \"58115\": [0.18906, 0.69141, 0, 0, 0.32923],\n \"58116\": [0.18906, 0.47534, 0, 0, 0.50343],\n \"58117\": [0, 0.69141, 0, 0, 0.33301],\n \"58118\": [0, 0.62119, 0, 0, 0.33409],\n \"58119\": [0, 0.47534, 0, 0, 0.50073]\n },\n \"Main-Bold\": {\n \"32\": [0, 0, 0, 0, 0.25],\n \"33\": [0, 0.69444, 0, 0, 0.35],\n \"34\": [0, 0.69444, 0, 0, 0.60278],\n \"35\": [0.19444, 0.69444, 0, 0, 0.95833],\n \"36\": [0.05556, 0.75, 0, 0, 0.575],\n \"37\": [0.05556, 0.75, 0, 0, 0.95833],\n \"38\": [0, 0.69444, 0, 0, 0.89444],\n \"39\": [0, 0.69444, 0, 0, 0.31944],\n \"40\": [0.25, 0.75, 0, 0, 0.44722],\n \"41\": [0.25, 0.75, 0, 0, 0.44722],\n \"42\": [0, 0.75, 0, 0, 0.575],\n \"43\": [0.13333, 0.63333, 0, 0, 0.89444],\n \"44\": [0.19444, 0.15556, 0, 0, 0.31944],\n \"45\": [0, 0.44444, 0, 0, 0.38333],\n \"46\": [0, 0.15556, 0, 0, 0.31944],\n \"47\": [0.25, 0.75, 0, 0, 0.575],\n \"48\": [0, 0.64444, 0, 0, 0.575],\n \"49\": [0, 0.64444, 0, 0, 0.575],\n \"50\": [0, 0.64444, 0, 0, 0.575],\n \"51\": [0, 0.64444, 0, 0, 0.575],\n \"52\": [0, 0.64444, 0, 0, 0.575],\n \"53\": [0, 0.64444, 0, 0, 0.575],\n \"54\": [0, 0.64444, 0, 0, 0.575],\n \"55\": [0, 0.64444, 0, 0, 0.575],\n \"56\": [0, 0.64444, 0, 0, 0.575],\n \"57\": [0, 0.64444, 0, 0, 0.575],\n \"58\": [0, 0.44444, 0, 0, 0.31944],\n \"59\": [0.19444, 0.44444, 0, 0, 0.31944],\n \"60\": [0.08556, 0.58556, 0, 0, 0.89444],\n \"61\": [-0.10889, 0.39111, 0, 0, 0.89444],\n \"62\": [0.08556, 0.58556, 0, 0, 0.89444],\n \"63\": [0, 0.69444, 0, 0, 0.54305],\n \"64\": [0, 0.69444, 0, 0, 0.89444],\n \"65\": [0, 0.68611, 0, 0, 0.86944],\n \"66\": [0, 0.68611, 0, 0, 0.81805],\n \"67\": [0, 0.68611, 0, 0, 0.83055],\n \"68\": [0, 0.68611, 0, 0, 0.88194],\n \"69\": [0, 0.68611, 0, 0, 0.75555],\n \"70\": [0, 0.68611, 0, 0, 0.72361],\n \"71\": [0, 0.68611, 0, 0, 0.90416],\n \"72\": [0, 0.68611, 0, 0, 0.9],\n \"73\": [0, 0.68611, 0, 0, 0.43611],\n \"74\": [0, 0.68611, 0, 0, 0.59444],\n \"75\": [0, 0.68611, 0, 0, 0.90138],\n \"76\": [0, 0.68611, 0, 0, 0.69166],\n \"77\": [0, 0.68611, 0, 0, 1.09166],\n \"78\": [0, 0.68611, 0, 0, 0.9],\n \"79\": [0, 0.68611, 0, 0, 0.86388],\n \"80\": [0, 0.68611, 0, 0, 0.78611],\n \"81\": [0.19444, 0.68611, 0, 0, 0.86388],\n \"82\": [0, 0.68611, 0, 0, 0.8625],\n \"83\": [0, 0.68611, 0, 0, 0.63889],\n \"84\": [0, 0.68611, 0, 0, 0.8],\n \"85\": [0, 0.68611, 0, 0, 0.88472],\n \"86\": [0, 0.68611, 0.01597, 0, 0.86944],\n \"87\": [0, 0.68611, 0.01597, 0, 1.18888],\n \"88\": [0, 0.68611, 0, 0, 0.86944],\n \"89\": [0, 0.68611, 0.02875, 0, 0.86944],\n \"90\": [0, 0.68611, 0, 0, 0.70277],\n \"91\": [0.25, 0.75, 0, 0, 0.31944],\n \"92\": [0.25, 0.75, 0, 0, 0.575],\n \"93\": [0.25, 0.75, 0, 0, 0.31944],\n \"94\": [0, 0.69444, 0, 0, 0.575],\n \"95\": [0.31, 0.13444, 0.03194, 0, 0.575],\n \"97\": [0, 0.44444, 0, 0, 0.55902],\n \"98\": [0, 0.69444, 0, 0, 0.63889],\n \"99\": [0, 0.44444, 0, 0, 0.51111],\n \"100\": [0, 0.69444, 0, 0, 0.63889],\n \"101\": [0, 0.44444, 0, 0, 0.52708],\n \"102\": [0, 0.69444, 0.10903, 0, 0.35139],\n \"103\": [0.19444, 0.44444, 0.01597, 0, 0.575],\n \"104\": [0, 0.69444, 0, 0, 0.63889],\n \"105\": [0, 0.69444, 0, 0, 0.31944],\n \"106\": [0.19444, 0.69444, 0, 0, 0.35139],\n \"107\": [0, 0.69444, 0, 0, 0.60694],\n \"108\": [0, 0.69444, 0, 0, 0.31944],\n \"109\": [0, 0.44444, 0, 0, 0.95833],\n \"110\": [0, 0.44444, 0, 0, 0.63889],\n \"111\": [0, 0.44444, 0, 0, 0.575],\n \"112\": [0.19444, 0.44444, 0, 0, 0.63889],\n \"113\": [0.19444, 0.44444, 0, 0, 0.60694],\n \"114\": [0, 0.44444, 0, 0, 0.47361],\n \"115\": [0, 0.44444, 0, 0, 0.45361],\n \"116\": [0, 0.63492, 0, 0, 0.44722],\n \"117\": [0, 0.44444, 0, 0, 0.63889],\n \"118\": [0, 0.44444, 0.01597, 0, 0.60694],\n \"119\": [0, 0.44444, 0.01597, 0, 0.83055],\n \"120\": [0, 0.44444, 0, 0, 0.60694],\n \"121\": [0.19444, 0.44444, 0.01597, 0, 0.60694],\n \"122\": [0, 0.44444, 0, 0, 0.51111],\n \"123\": [0.25, 0.75, 0, 0, 0.575],\n \"124\": [0.25, 0.75, 0, 0, 0.31944],\n \"125\": [0.25, 0.75, 0, 0, 0.575],\n \"126\": [0.35, 0.34444, 0, 0, 0.575],\n \"160\": [0, 0, 0, 0, 0.25],\n \"163\": [0, 0.69444, 0, 0, 0.86853],\n \"168\": [0, 0.69444, 0, 0, 0.575],\n \"172\": [0, 0.44444, 0, 0, 0.76666],\n \"176\": [0, 0.69444, 0, 0, 0.86944],\n \"177\": [0.13333, 0.63333, 0, 0, 0.89444],\n \"184\": [0.17014, 0, 0, 0, 0.51111],\n \"198\": [0, 0.68611, 0, 0, 1.04166],\n \"215\": [0.13333, 0.63333, 0, 0, 0.89444],\n \"216\": [0.04861, 0.73472, 0, 0, 0.89444],\n \"223\": [0, 0.69444, 0, 0, 0.59722],\n \"230\": [0, 0.44444, 0, 0, 0.83055],\n \"247\": [0.13333, 0.63333, 0, 0, 0.89444],\n \"248\": [0.09722, 0.54167, 0, 0, 0.575],\n \"305\": [0, 0.44444, 0, 0, 0.31944],\n \"338\": [0, 0.68611, 0, 0, 1.16944],\n \"339\": [0, 0.44444, 0, 0, 0.89444],\n \"567\": [0.19444, 0.44444, 0, 0, 0.35139],\n \"710\": [0, 0.69444, 0, 0, 0.575],\n \"711\": [0, 0.63194, 0, 0, 0.575],\n \"713\": [0, 0.59611, 0, 0, 0.575],\n \"714\": [0, 0.69444, 0, 0, 0.575],\n \"715\": [0, 0.69444, 0, 0, 0.575],\n \"728\": [0, 0.69444, 0, 0, 0.575],\n \"729\": [0, 0.69444, 0, 0, 0.31944],\n \"730\": [0, 0.69444, 0, 0, 0.86944],\n \"732\": [0, 0.69444, 0, 0, 0.575],\n \"733\": [0, 0.69444, 0, 0, 0.575],\n \"915\": [0, 0.68611, 0, 0, 0.69166],\n \"916\": [0, 0.68611, 0, 0, 0.95833],\n \"920\": [0, 0.68611, 0, 0, 0.89444],\n \"923\": [0, 0.68611, 0, 0, 0.80555],\n \"926\": [0, 0.68611, 0, 0, 0.76666],\n \"928\": [0, 0.68611, 0, 0, 0.9],\n \"931\": [0, 0.68611, 0, 0, 0.83055],\n \"933\": [0, 0.68611, 0, 0, 0.89444],\n \"934\": [0, 0.68611, 0, 0, 0.83055],\n \"936\": [0, 0.68611, 0, 0, 0.89444],\n \"937\": [0, 0.68611, 0, 0, 0.83055],\n \"8211\": [0, 0.44444, 0.03194, 0, 0.575],\n \"8212\": [0, 0.44444, 0.03194, 0, 1.14999],\n \"8216\": [0, 0.69444, 0, 0, 0.31944],\n \"8217\": [0, 0.69444, 0, 0, 0.31944],\n \"8220\": [0, 0.69444, 0, 0, 0.60278],\n \"8221\": [0, 0.69444, 0, 0, 0.60278],\n \"8224\": [0.19444, 0.69444, 0, 0, 0.51111],\n \"8225\": [0.19444, 0.69444, 0, 0, 0.51111],\n \"8242\": [0, 0.55556, 0, 0, 0.34444],\n \"8407\": [0, 0.72444, 0.15486, 0, 0.575],\n \"8463\": [0, 0.69444, 0, 0, 0.66759],\n \"8465\": [0, 0.69444, 0, 0, 0.83055],\n \"8467\": [0, 0.69444, 0, 0, 0.47361],\n \"8472\": [0.19444, 0.44444, 0, 0, 0.74027],\n \"8476\": [0, 0.69444, 0, 0, 0.83055],\n \"8501\": [0, 0.69444, 0, 0, 0.70277],\n \"8592\": [-0.10889, 0.39111, 0, 0, 1.14999],\n \"8593\": [0.19444, 0.69444, 0, 0, 0.575],\n \"8594\": [-0.10889, 0.39111, 0, 0, 1.14999],\n \"8595\": [0.19444, 0.69444, 0, 0, 0.575],\n \"8596\": [-0.10889, 0.39111, 0, 0, 1.14999],\n \"8597\": [0.25, 0.75, 0, 0, 0.575],\n \"8598\": [0.19444, 0.69444, 0, 0, 1.14999],\n \"8599\": [0.19444, 0.69444, 0, 0, 1.14999],\n \"8600\": [0.19444, 0.69444, 0, 0, 1.14999],\n \"8601\": [0.19444, 0.69444, 0, 0, 1.14999],\n \"8636\": [-0.10889, 0.39111, 0, 0, 1.14999],\n \"8637\": [-0.10889, 0.39111, 0, 0, 1.14999],\n \"8640\": [-0.10889, 0.39111, 0, 0, 1.14999],\n \"8641\": [-0.10889, 0.39111, 0, 0, 1.14999],\n \"8656\": [-0.10889, 0.39111, 0, 0, 1.14999],\n \"8657\": [0.19444, 0.69444, 0, 0, 0.70277],\n \"8658\": [-0.10889, 0.39111, 0, 0, 1.14999],\n \"8659\": [0.19444, 0.69444, 0, 0, 0.70277],\n \"8660\": [-0.10889, 0.39111, 0, 0, 1.14999],\n \"8661\": [0.25, 0.75, 0, 0, 0.70277],\n \"8704\": [0, 0.69444, 0, 0, 0.63889],\n \"8706\": [0, 0.69444, 0.06389, 0, 0.62847],\n \"8707\": [0, 0.69444, 0, 0, 0.63889],\n \"8709\": [0.05556, 0.75, 0, 0, 0.575],\n \"8711\": [0, 0.68611, 0, 0, 0.95833],\n \"8712\": [0.08556, 0.58556, 0, 0, 0.76666],\n \"8715\": [0.08556, 0.58556, 0, 0, 0.76666],\n \"8722\": [0.13333, 0.63333, 0, 0, 0.89444],\n \"8723\": [0.13333, 0.63333, 0, 0, 0.89444],\n \"8725\": [0.25, 0.75, 0, 0, 0.575],\n \"8726\": [0.25, 0.75, 0, 0, 0.575],\n \"8727\": [-0.02778, 0.47222, 0, 0, 0.575],\n \"8728\": [-0.02639, 0.47361, 0, 0, 0.575],\n \"8729\": [-0.02639, 0.47361, 0, 0, 0.575],\n \"8730\": [0.18, 0.82, 0, 0, 0.95833],\n \"8733\": [0, 0.44444, 0, 0, 0.89444],\n \"8734\": [0, 0.44444, 0, 0, 1.14999],\n \"8736\": [0, 0.69224, 0, 0, 0.72222],\n \"8739\": [0.25, 0.75, 0, 0, 0.31944],\n \"8741\": [0.25, 0.75, 0, 0, 0.575],\n \"8743\": [0, 0.55556, 0, 0, 0.76666],\n \"8744\": [0, 0.55556, 0, 0, 0.76666],\n \"8745\": [0, 0.55556, 0, 0, 0.76666],\n \"8746\": [0, 0.55556, 0, 0, 0.76666],\n \"8747\": [0.19444, 0.69444, 0.12778, 0, 0.56875],\n \"8764\": [-0.10889, 0.39111, 0, 0, 0.89444],\n \"8768\": [0.19444, 0.69444, 0, 0, 0.31944],\n \"8771\": [0.00222, 0.50222, 0, 0, 0.89444],\n \"8773\": [0.027, 0.638, 0, 0, 0.894],\n \"8776\": [0.02444, 0.52444, 0, 0, 0.89444],\n \"8781\": [0.00222, 0.50222, 0, 0, 0.89444],\n \"8801\": [0.00222, 0.50222, 0, 0, 0.89444],\n \"8804\": [0.19667, 0.69667, 0, 0, 0.89444],\n \"8805\": [0.19667, 0.69667, 0, 0, 0.89444],\n \"8810\": [0.08556, 0.58556, 0, 0, 1.14999],\n \"8811\": [0.08556, 0.58556, 0, 0, 1.14999],\n \"8826\": [0.08556, 0.58556, 0, 0, 0.89444],\n \"8827\": [0.08556, 0.58556, 0, 0, 0.89444],\n \"8834\": [0.08556, 0.58556, 0, 0, 0.89444],\n \"8835\": [0.08556, 0.58556, 0, 0, 0.89444],\n \"8838\": [0.19667, 0.69667, 0, 0, 0.89444],\n \"8839\": [0.19667, 0.69667, 0, 0, 0.89444],\n \"8846\": [0, 0.55556, 0, 0, 0.76666],\n \"8849\": [0.19667, 0.69667, 0, 0, 0.89444],\n \"8850\": [0.19667, 0.69667, 0, 0, 0.89444],\n \"8851\": [0, 0.55556, 0, 0, 0.76666],\n \"8852\": [0, 0.55556, 0, 0, 0.76666],\n \"8853\": [0.13333, 0.63333, 0, 0, 0.89444],\n \"8854\": [0.13333, 0.63333, 0, 0, 0.89444],\n \"8855\": [0.13333, 0.63333, 0, 0, 0.89444],\n \"8856\": [0.13333, 0.63333, 0, 0, 0.89444],\n \"8857\": [0.13333, 0.63333, 0, 0, 0.89444],\n \"8866\": [0, 0.69444, 0, 0, 0.70277],\n \"8867\": [0, 0.69444, 0, 0, 0.70277],\n \"8868\": [0, 0.69444, 0, 0, 0.89444],\n \"8869\": [0, 0.69444, 0, 0, 0.89444],\n \"8900\": [-0.02639, 0.47361, 0, 0, 0.575],\n \"8901\": [-0.02639, 0.47361, 0, 0, 0.31944],\n \"8902\": [-0.02778, 0.47222, 0, 0, 0.575],\n \"8968\": [0.25, 0.75, 0, 0, 0.51111],\n \"8969\": [0.25, 0.75, 0, 0, 0.51111],\n \"8970\": [0.25, 0.75, 0, 0, 0.51111],\n \"8971\": [0.25, 0.75, 0, 0, 0.51111],\n \"8994\": [-0.13889, 0.36111, 0, 0, 1.14999],\n \"8995\": [-0.13889, 0.36111, 0, 0, 1.14999],\n \"9651\": [0.19444, 0.69444, 0, 0, 1.02222],\n \"9657\": [-0.02778, 0.47222, 0, 0, 0.575],\n \"9661\": [0.19444, 0.69444, 0, 0, 1.02222],\n \"9667\": [-0.02778, 0.47222, 0, 0, 0.575],\n \"9711\": [0.19444, 0.69444, 0, 0, 1.14999],\n \"9824\": [0.12963, 0.69444, 0, 0, 0.89444],\n \"9825\": [0.12963, 0.69444, 0, 0, 0.89444],\n \"9826\": [0.12963, 0.69444, 0, 0, 0.89444],\n \"9827\": [0.12963, 0.69444, 0, 0, 0.89444],\n \"9837\": [0, 0.75, 0, 0, 0.44722],\n \"9838\": [0.19444, 0.69444, 0, 0, 0.44722],\n \"9839\": [0.19444, 0.69444, 0, 0, 0.44722],\n \"10216\": [0.25, 0.75, 0, 0, 0.44722],\n \"10217\": [0.25, 0.75, 0, 0, 0.44722],\n \"10815\": [0, 0.68611, 0, 0, 0.9],\n \"10927\": [0.19667, 0.69667, 0, 0, 0.89444],\n \"10928\": [0.19667, 0.69667, 0, 0, 0.89444],\n \"57376\": [0.19444, 0.69444, 0, 0, 0]\n },\n \"Main-BoldItalic\": {\n \"32\": [0, 0, 0, 0, 0.25],\n \"33\": [0, 0.69444, 0.11417, 0, 0.38611],\n \"34\": [0, 0.69444, 0.07939, 0, 0.62055],\n \"35\": [0.19444, 0.69444, 0.06833, 0, 0.94444],\n \"37\": [0.05556, 0.75, 0.12861, 0, 0.94444],\n \"38\": [0, 0.69444, 0.08528, 0, 0.88555],\n \"39\": [0, 0.69444, 0.12945, 0, 0.35555],\n \"40\": [0.25, 0.75, 0.15806, 0, 0.47333],\n \"41\": [0.25, 0.75, 0.03306, 0, 0.47333],\n \"42\": [0, 0.75, 0.14333, 0, 0.59111],\n \"43\": [0.10333, 0.60333, 0.03306, 0, 0.88555],\n \"44\": [0.19444, 0.14722, 0, 0, 0.35555],\n \"45\": [0, 0.44444, 0.02611, 0, 0.41444],\n \"46\": [0, 0.14722, 0, 0, 0.35555],\n \"47\": [0.25, 0.75, 0.15806, 0, 0.59111],\n \"48\": [0, 0.64444, 0.13167, 0, 0.59111],\n \"49\": [0, 0.64444, 0.13167, 0, 0.59111],\n \"50\": [0, 0.64444, 0.13167, 0, 0.59111],\n \"51\": [0, 0.64444, 0.13167, 0, 0.59111],\n \"52\": [0.19444, 0.64444, 0.13167, 0, 0.59111],\n \"53\": [0, 0.64444, 0.13167, 0, 0.59111],\n \"54\": [0, 0.64444, 0.13167, 0, 0.59111],\n \"55\": [0.19444, 0.64444, 0.13167, 0, 0.59111],\n \"56\": [0, 0.64444, 0.13167, 0, 0.59111],\n \"57\": [0, 0.64444, 0.13167, 0, 0.59111],\n \"58\": [0, 0.44444, 0.06695, 0, 0.35555],\n \"59\": [0.19444, 0.44444, 0.06695, 0, 0.35555],\n \"61\": [-0.10889, 0.39111, 0.06833, 0, 0.88555],\n \"63\": [0, 0.69444, 0.11472, 0, 0.59111],\n \"64\": [0, 0.69444, 0.09208, 0, 0.88555],\n \"65\": [0, 0.68611, 0, 0, 0.86555],\n \"66\": [0, 0.68611, 0.0992, 0, 0.81666],\n \"67\": [0, 0.68611, 0.14208, 0, 0.82666],\n \"68\": [0, 0.68611, 0.09062, 0, 0.87555],\n \"69\": [0, 0.68611, 0.11431, 0, 0.75666],\n \"70\": [0, 0.68611, 0.12903, 0, 0.72722],\n \"71\": [0, 0.68611, 0.07347, 0, 0.89527],\n \"72\": [0, 0.68611, 0.17208, 0, 0.8961],\n \"73\": [0, 0.68611, 0.15681, 0, 0.47166],\n \"74\": [0, 0.68611, 0.145, 0, 0.61055],\n \"75\": [0, 0.68611, 0.14208, 0, 0.89499],\n \"76\": [0, 0.68611, 0, 0, 0.69777],\n \"77\": [0, 0.68611, 0.17208, 0, 1.07277],\n \"78\": [0, 0.68611, 0.17208, 0, 0.8961],\n \"79\": [0, 0.68611, 0.09062, 0, 0.85499],\n \"80\": [0, 0.68611, 0.0992, 0, 0.78721],\n \"81\": [0.19444, 0.68611, 0.09062, 0, 0.85499],\n \"82\": [0, 0.68611, 0.02559, 0, 0.85944],\n \"83\": [0, 0.68611, 0.11264, 0, 0.64999],\n \"84\": [0, 0.68611, 0.12903, 0, 0.7961],\n \"85\": [0, 0.68611, 0.17208, 0, 0.88083],\n \"86\": [0, 0.68611, 0.18625, 0, 0.86555],\n \"87\": [0, 0.68611, 0.18625, 0, 1.15999],\n \"88\": [0, 0.68611, 0.15681, 0, 0.86555],\n \"89\": [0, 0.68611, 0.19803, 0, 0.86555],\n \"90\": [0, 0.68611, 0.14208, 0, 0.70888],\n \"91\": [0.25, 0.75, 0.1875, 0, 0.35611],\n \"93\": [0.25, 0.75, 0.09972, 0, 0.35611],\n \"94\": [0, 0.69444, 0.06709, 0, 0.59111],\n \"95\": [0.31, 0.13444, 0.09811, 0, 0.59111],\n \"97\": [0, 0.44444, 0.09426, 0, 0.59111],\n \"98\": [0, 0.69444, 0.07861, 0, 0.53222],\n \"99\": [0, 0.44444, 0.05222, 0, 0.53222],\n \"100\": [0, 0.69444, 0.10861, 0, 0.59111],\n \"101\": [0, 0.44444, 0.085, 0, 0.53222],\n \"102\": [0.19444, 0.69444, 0.21778, 0, 0.4],\n \"103\": [0.19444, 0.44444, 0.105, 0, 0.53222],\n \"104\": [0, 0.69444, 0.09426, 0, 0.59111],\n \"105\": [0, 0.69326, 0.11387, 0, 0.35555],\n \"106\": [0.19444, 0.69326, 0.1672, 0, 0.35555],\n \"107\": [0, 0.69444, 0.11111, 0, 0.53222],\n \"108\": [0, 0.69444, 0.10861, 0, 0.29666],\n \"109\": [0, 0.44444, 0.09426, 0, 0.94444],\n \"110\": [0, 0.44444, 0.09426, 0, 0.64999],\n \"111\": [0, 0.44444, 0.07861, 0, 0.59111],\n \"112\": [0.19444, 0.44444, 0.07861, 0, 0.59111],\n \"113\": [0.19444, 0.44444, 0.105, 0, 0.53222],\n \"114\": [0, 0.44444, 0.11111, 0, 0.50167],\n \"115\": [0, 0.44444, 0.08167, 0, 0.48694],\n \"116\": [0, 0.63492, 0.09639, 0, 0.385],\n \"117\": [0, 0.44444, 0.09426, 0, 0.62055],\n \"118\": [0, 0.44444, 0.11111, 0, 0.53222],\n \"119\": [0, 0.44444, 0.11111, 0, 0.76777],\n \"120\": [0, 0.44444, 0.12583, 0, 0.56055],\n \"121\": [0.19444, 0.44444, 0.105, 0, 0.56166],\n \"122\": [0, 0.44444, 0.13889, 0, 0.49055],\n \"126\": [0.35, 0.34444, 0.11472, 0, 0.59111],\n \"160\": [0, 0, 0, 0, 0.25],\n \"168\": [0, 0.69444, 0.11473, 0, 0.59111],\n \"176\": [0, 0.69444, 0, 0, 0.94888],\n \"184\": [0.17014, 0, 0, 0, 0.53222],\n \"198\": [0, 0.68611, 0.11431, 0, 1.02277],\n \"216\": [0.04861, 0.73472, 0.09062, 0, 0.88555],\n \"223\": [0.19444, 0.69444, 0.09736, 0, 0.665],\n \"230\": [0, 0.44444, 0.085, 0, 0.82666],\n \"248\": [0.09722, 0.54167, 0.09458, 0, 0.59111],\n \"305\": [0, 0.44444, 0.09426, 0, 0.35555],\n \"338\": [0, 0.68611, 0.11431, 0, 1.14054],\n \"339\": [0, 0.44444, 0.085, 0, 0.82666],\n \"567\": [0.19444, 0.44444, 0.04611, 0, 0.385],\n \"710\": [0, 0.69444, 0.06709, 0, 0.59111],\n \"711\": [0, 0.63194, 0.08271, 0, 0.59111],\n \"713\": [0, 0.59444, 0.10444, 0, 0.59111],\n \"714\": [0, 0.69444, 0.08528, 0, 0.59111],\n \"715\": [0, 0.69444, 0, 0, 0.59111],\n \"728\": [0, 0.69444, 0.10333, 0, 0.59111],\n \"729\": [0, 0.69444, 0.12945, 0, 0.35555],\n \"730\": [0, 0.69444, 0, 0, 0.94888],\n \"732\": [0, 0.69444, 0.11472, 0, 0.59111],\n \"733\": [0, 0.69444, 0.11472, 0, 0.59111],\n \"915\": [0, 0.68611, 0.12903, 0, 0.69777],\n \"916\": [0, 0.68611, 0, 0, 0.94444],\n \"920\": [0, 0.68611, 0.09062, 0, 0.88555],\n \"923\": [0, 0.68611, 0, 0, 0.80666],\n \"926\": [0, 0.68611, 0.15092, 0, 0.76777],\n \"928\": [0, 0.68611, 0.17208, 0, 0.8961],\n \"931\": [0, 0.68611, 0.11431, 0, 0.82666],\n \"933\": [0, 0.68611, 0.10778, 0, 0.88555],\n \"934\": [0, 0.68611, 0.05632, 0, 0.82666],\n \"936\": [0, 0.68611, 0.10778, 0, 0.88555],\n \"937\": [0, 0.68611, 0.0992, 0, 0.82666],\n \"8211\": [0, 0.44444, 0.09811, 0, 0.59111],\n \"8212\": [0, 0.44444, 0.09811, 0, 1.18221],\n \"8216\": [0, 0.69444, 0.12945, 0, 0.35555],\n \"8217\": [0, 0.69444, 0.12945, 0, 0.35555],\n \"8220\": [0, 0.69444, 0.16772, 0, 0.62055],\n \"8221\": [0, 0.69444, 0.07939, 0, 0.62055]\n },\n \"Main-Italic\": {\n \"32\": [0, 0, 0, 0, 0.25],\n \"33\": [0, 0.69444, 0.12417, 0, 0.30667],\n \"34\": [0, 0.69444, 0.06961, 0, 0.51444],\n \"35\": [0.19444, 0.69444, 0.06616, 0, 0.81777],\n \"37\": [0.05556, 0.75, 0.13639, 0, 0.81777],\n \"38\": [0, 0.69444, 0.09694, 0, 0.76666],\n \"39\": [0, 0.69444, 0.12417, 0, 0.30667],\n \"40\": [0.25, 0.75, 0.16194, 0, 0.40889],\n \"41\": [0.25, 0.75, 0.03694, 0, 0.40889],\n \"42\": [0, 0.75, 0.14917, 0, 0.51111],\n \"43\": [0.05667, 0.56167, 0.03694, 0, 0.76666],\n \"44\": [0.19444, 0.10556, 0, 0, 0.30667],\n \"45\": [0, 0.43056, 0.02826, 0, 0.35778],\n \"46\": [0, 0.10556, 0, 0, 0.30667],\n \"47\": [0.25, 0.75, 0.16194, 0, 0.51111],\n \"48\": [0, 0.64444, 0.13556, 0, 0.51111],\n \"49\": [0, 0.64444, 0.13556, 0, 0.51111],\n \"50\": [0, 0.64444, 0.13556, 0, 0.51111],\n \"51\": [0, 0.64444, 0.13556, 0, 0.51111],\n \"52\": [0.19444, 0.64444, 0.13556, 0, 0.51111],\n \"53\": [0, 0.64444, 0.13556, 0, 0.51111],\n \"54\": [0, 0.64444, 0.13556, 0, 0.51111],\n \"55\": [0.19444, 0.64444, 0.13556, 0, 0.51111],\n \"56\": [0, 0.64444, 0.13556, 0, 0.51111],\n \"57\": [0, 0.64444, 0.13556, 0, 0.51111],\n \"58\": [0, 0.43056, 0.0582, 0, 0.30667],\n \"59\": [0.19444, 0.43056, 0.0582, 0, 0.30667],\n \"61\": [-0.13313, 0.36687, 0.06616, 0, 0.76666],\n \"63\": [0, 0.69444, 0.1225, 0, 0.51111],\n \"64\": [0, 0.69444, 0.09597, 0, 0.76666],\n \"65\": [0, 0.68333, 0, 0, 0.74333],\n \"66\": [0, 0.68333, 0.10257, 0, 0.70389],\n \"67\": [0, 0.68333, 0.14528, 0, 0.71555],\n \"68\": [0, 0.68333, 0.09403, 0, 0.755],\n \"69\": [0, 0.68333, 0.12028, 0, 0.67833],\n \"70\": [0, 0.68333, 0.13305, 0, 0.65277],\n \"71\": [0, 0.68333, 0.08722, 0, 0.77361],\n \"72\": [0, 0.68333, 0.16389, 0, 0.74333],\n \"73\": [0, 0.68333, 0.15806, 0, 0.38555],\n \"74\": [0, 0.68333, 0.14028, 0, 0.525],\n \"75\": [0, 0.68333, 0.14528, 0, 0.76888],\n \"76\": [0, 0.68333, 0, 0, 0.62722],\n \"77\": [0, 0.68333, 0.16389, 0, 0.89666],\n \"78\": [0, 0.68333, 0.16389, 0, 0.74333],\n \"79\": [0, 0.68333, 0.09403, 0, 0.76666],\n \"80\": [0, 0.68333, 0.10257, 0, 0.67833],\n \"81\": [0.19444, 0.68333, 0.09403, 0, 0.76666],\n \"82\": [0, 0.68333, 0.03868, 0, 0.72944],\n \"83\": [0, 0.68333, 0.11972, 0, 0.56222],\n \"84\": [0, 0.68333, 0.13305, 0, 0.71555],\n \"85\": [0, 0.68333, 0.16389, 0, 0.74333],\n \"86\": [0, 0.68333, 0.18361, 0, 0.74333],\n \"87\": [0, 0.68333, 0.18361, 0, 0.99888],\n \"88\": [0, 0.68333, 0.15806, 0, 0.74333],\n \"89\": [0, 0.68333, 0.19383, 0, 0.74333],\n \"90\": [0, 0.68333, 0.14528, 0, 0.61333],\n \"91\": [0.25, 0.75, 0.1875, 0, 0.30667],\n \"93\": [0.25, 0.75, 0.10528, 0, 0.30667],\n \"94\": [0, 0.69444, 0.06646, 0, 0.51111],\n \"95\": [0.31, 0.12056, 0.09208, 0, 0.51111],\n \"97\": [0, 0.43056, 0.07671, 0, 0.51111],\n \"98\": [0, 0.69444, 0.06312, 0, 0.46],\n \"99\": [0, 0.43056, 0.05653, 0, 0.46],\n \"100\": [0, 0.69444, 0.10333, 0, 0.51111],\n \"101\": [0, 0.43056, 0.07514, 0, 0.46],\n \"102\": [0.19444, 0.69444, 0.21194, 0, 0.30667],\n \"103\": [0.19444, 0.43056, 0.08847, 0, 0.46],\n \"104\": [0, 0.69444, 0.07671, 0, 0.51111],\n \"105\": [0, 0.65536, 0.1019, 0, 0.30667],\n \"106\": [0.19444, 0.65536, 0.14467, 0, 0.30667],\n \"107\": [0, 0.69444, 0.10764, 0, 0.46],\n \"108\": [0, 0.69444, 0.10333, 0, 0.25555],\n \"109\": [0, 0.43056, 0.07671, 0, 0.81777],\n \"110\": [0, 0.43056, 0.07671, 0, 0.56222],\n \"111\": [0, 0.43056, 0.06312, 0, 0.51111],\n \"112\": [0.19444, 0.43056, 0.06312, 0, 0.51111],\n \"113\": [0.19444, 0.43056, 0.08847, 0, 0.46],\n \"114\": [0, 0.43056, 0.10764, 0, 0.42166],\n \"115\": [0, 0.43056, 0.08208, 0, 0.40889],\n \"116\": [0, 0.61508, 0.09486, 0, 0.33222],\n \"117\": [0, 0.43056, 0.07671, 0, 0.53666],\n \"118\": [0, 0.43056, 0.10764, 0, 0.46],\n \"119\": [0, 0.43056, 0.10764, 0, 0.66444],\n \"120\": [0, 0.43056, 0.12042, 0, 0.46389],\n \"121\": [0.19444, 0.43056, 0.08847, 0, 0.48555],\n \"122\": [0, 0.43056, 0.12292, 0, 0.40889],\n \"126\": [0.35, 0.31786, 0.11585, 0, 0.51111],\n \"160\": [0, 0, 0, 0, 0.25],\n \"168\": [0, 0.66786, 0.10474, 0, 0.51111],\n \"176\": [0, 0.69444, 0, 0, 0.83129],\n \"184\": [0.17014, 0, 0, 0, 0.46],\n \"198\": [0, 0.68333, 0.12028, 0, 0.88277],\n \"216\": [0.04861, 0.73194, 0.09403, 0, 0.76666],\n \"223\": [0.19444, 0.69444, 0.10514, 0, 0.53666],\n \"230\": [0, 0.43056, 0.07514, 0, 0.71555],\n \"248\": [0.09722, 0.52778, 0.09194, 0, 0.51111],\n \"338\": [0, 0.68333, 0.12028, 0, 0.98499],\n \"339\": [0, 0.43056, 0.07514, 0, 0.71555],\n \"710\": [0, 0.69444, 0.06646, 0, 0.51111],\n \"711\": [0, 0.62847, 0.08295, 0, 0.51111],\n \"713\": [0, 0.56167, 0.10333, 0, 0.51111],\n \"714\": [0, 0.69444, 0.09694, 0, 0.51111],\n \"715\": [0, 0.69444, 0, 0, 0.51111],\n \"728\": [0, 0.69444, 0.10806, 0, 0.51111],\n \"729\": [0, 0.66786, 0.11752, 0, 0.30667],\n \"730\": [0, 0.69444, 0, 0, 0.83129],\n \"732\": [0, 0.66786, 0.11585, 0, 0.51111],\n \"733\": [0, 0.69444, 0.1225, 0, 0.51111],\n \"915\": [0, 0.68333, 0.13305, 0, 0.62722],\n \"916\": [0, 0.68333, 0, 0, 0.81777],\n \"920\": [0, 0.68333, 0.09403, 0, 0.76666],\n \"923\": [0, 0.68333, 0, 0, 0.69222],\n \"926\": [0, 0.68333, 0.15294, 0, 0.66444],\n \"928\": [0, 0.68333, 0.16389, 0, 0.74333],\n \"931\": [0, 0.68333, 0.12028, 0, 0.71555],\n \"933\": [0, 0.68333, 0.11111, 0, 0.76666],\n \"934\": [0, 0.68333, 0.05986, 0, 0.71555],\n \"936\": [0, 0.68333, 0.11111, 0, 0.76666],\n \"937\": [0, 0.68333, 0.10257, 0, 0.71555],\n \"8211\": [0, 0.43056, 0.09208, 0, 0.51111],\n \"8212\": [0, 0.43056, 0.09208, 0, 1.02222],\n \"8216\": [0, 0.69444, 0.12417, 0, 0.30667],\n \"8217\": [0, 0.69444, 0.12417, 0, 0.30667],\n \"8220\": [0, 0.69444, 0.1685, 0, 0.51444],\n \"8221\": [0, 0.69444, 0.06961, 0, 0.51444],\n \"8463\": [0, 0.68889, 0, 0, 0.54028]\n },\n \"Main-Regular\": {\n \"32\": [0, 0, 0, 0, 0.25],\n \"33\": [0, 0.69444, 0, 0, 0.27778],\n \"34\": [0, 0.69444, 0, 0, 0.5],\n \"35\": [0.19444, 0.69444, 0, 0, 0.83334],\n \"36\": [0.05556, 0.75, 0, 0, 0.5],\n \"37\": [0.05556, 0.75, 0, 0, 0.83334],\n \"38\": [0, 0.69444, 0, 0, 0.77778],\n \"39\": [0, 0.69444, 0, 0, 0.27778],\n \"40\": [0.25, 0.75, 0, 0, 0.38889],\n \"41\": [0.25, 0.75, 0, 0, 0.38889],\n \"42\": [0, 0.75, 0, 0, 0.5],\n \"43\": [0.08333, 0.58333, 0, 0, 0.77778],\n \"44\": [0.19444, 0.10556, 0, 0, 0.27778],\n \"45\": [0, 0.43056, 0, 0, 0.33333],\n \"46\": [0, 0.10556, 0, 0, 0.27778],\n \"47\": [0.25, 0.75, 0, 0, 0.5],\n \"48\": [0, 0.64444, 0, 0, 0.5],\n \"49\": [0, 0.64444, 0, 0, 0.5],\n \"50\": [0, 0.64444, 0, 0, 0.5],\n \"51\": [0, 0.64444, 0, 0, 0.5],\n \"52\": [0, 0.64444, 0, 0, 0.5],\n \"53\": [0, 0.64444, 0, 0, 0.5],\n \"54\": [0, 0.64444, 0, 0, 0.5],\n \"55\": [0, 0.64444, 0, 0, 0.5],\n \"56\": [0, 0.64444, 0, 0, 0.5],\n \"57\": [0, 0.64444, 0, 0, 0.5],\n \"58\": [0, 0.43056, 0, 0, 0.27778],\n \"59\": [0.19444, 0.43056, 0, 0, 0.27778],\n \"60\": [0.0391, 0.5391, 0, 0, 0.77778],\n \"61\": [-0.13313, 0.36687, 0, 0, 0.77778],\n \"62\": [0.0391, 0.5391, 0, 0, 0.77778],\n \"63\": [0, 0.69444, 0, 0, 0.47222],\n \"64\": [0, 0.69444, 0, 0, 0.77778],\n \"65\": [0, 0.68333, 0, 0, 0.75],\n \"66\": [0, 0.68333, 0, 0, 0.70834],\n \"67\": [0, 0.68333, 0, 0, 0.72222],\n \"68\": [0, 0.68333, 0, 0, 0.76389],\n \"69\": [0, 0.68333, 0, 0, 0.68056],\n \"70\": [0, 0.68333, 0, 0, 0.65278],\n \"71\": [0, 0.68333, 0, 0, 0.78472],\n \"72\": [0, 0.68333, 0, 0, 0.75],\n \"73\": [0, 0.68333, 0, 0, 0.36111],\n \"74\": [0, 0.68333, 0, 0, 0.51389],\n \"75\": [0, 0.68333, 0, 0, 0.77778],\n \"76\": [0, 0.68333, 0, 0, 0.625],\n \"77\": [0, 0.68333, 0, 0, 0.91667],\n \"78\": [0, 0.68333, 0, 0, 0.75],\n \"79\": [0, 0.68333, 0, 0, 0.77778],\n \"80\": [0, 0.68333, 0, 0, 0.68056],\n \"81\": [0.19444, 0.68333, 0, 0, 0.77778],\n \"82\": [0, 0.68333, 0, 0, 0.73611],\n \"83\": [0, 0.68333, 0, 0, 0.55556],\n \"84\": [0, 0.68333, 0, 0, 0.72222],\n \"85\": [0, 0.68333, 0, 0, 0.75],\n \"86\": [0, 0.68333, 0.01389, 0, 0.75],\n \"87\": [0, 0.68333, 0.01389, 0, 1.02778],\n \"88\": [0, 0.68333, 0, 0, 0.75],\n \"89\": [0, 0.68333, 0.025, 0, 0.75],\n \"90\": [0, 0.68333, 0, 0, 0.61111],\n \"91\": [0.25, 0.75, 0, 0, 0.27778],\n \"92\": [0.25, 0.75, 0, 0, 0.5],\n \"93\": [0.25, 0.75, 0, 0, 0.27778],\n \"94\": [0, 0.69444, 0, 0, 0.5],\n \"95\": [0.31, 0.12056, 0.02778, 0, 0.5],\n \"97\": [0, 0.43056, 0, 0, 0.5],\n \"98\": [0, 0.69444, 0, 0, 0.55556],\n \"99\": [0, 0.43056, 0, 0, 0.44445],\n \"100\": [0, 0.69444, 0, 0, 0.55556],\n \"101\": [0, 0.43056, 0, 0, 0.44445],\n \"102\": [0, 0.69444, 0.07778, 0, 0.30556],\n \"103\": [0.19444, 0.43056, 0.01389, 0, 0.5],\n \"104\": [0, 0.69444, 0, 0, 0.55556],\n \"105\": [0, 0.66786, 0, 0, 0.27778],\n \"106\": [0.19444, 0.66786, 0, 0, 0.30556],\n \"107\": [0, 0.69444, 0, 0, 0.52778],\n \"108\": [0, 0.69444, 0, 0, 0.27778],\n \"109\": [0, 0.43056, 0, 0, 0.83334],\n \"110\": [0, 0.43056, 0, 0, 0.55556],\n \"111\": [0, 0.43056, 0, 0, 0.5],\n \"112\": [0.19444, 0.43056, 0, 0, 0.55556],\n \"113\": [0.19444, 0.43056, 0, 0, 0.52778],\n \"114\": [0, 0.43056, 0, 0, 0.39167],\n \"115\": [0, 0.43056, 0, 0, 0.39445],\n \"116\": [0, 0.61508, 0, 0, 0.38889],\n \"117\": [0, 0.43056, 0, 0, 0.55556],\n \"118\": [0, 0.43056, 0.01389, 0, 0.52778],\n \"119\": [0, 0.43056, 0.01389, 0, 0.72222],\n \"120\": [0, 0.43056, 0, 0, 0.52778],\n \"121\": [0.19444, 0.43056, 0.01389, 0, 0.52778],\n \"122\": [0, 0.43056, 0, 0, 0.44445],\n \"123\": [0.25, 0.75, 0, 0, 0.5],\n \"124\": [0.25, 0.75, 0, 0, 0.27778],\n \"125\": [0.25, 0.75, 0, 0, 0.5],\n \"126\": [0.35, 0.31786, 0, 0, 0.5],\n \"160\": [0, 0, 0, 0, 0.25],\n \"163\": [0, 0.69444, 0, 0, 0.76909],\n \"167\": [0.19444, 0.69444, 0, 0, 0.44445],\n \"168\": [0, 0.66786, 0, 0, 0.5],\n \"172\": [0, 0.43056, 0, 0, 0.66667],\n \"176\": [0, 0.69444, 0, 0, 0.75],\n \"177\": [0.08333, 0.58333, 0, 0, 0.77778],\n \"182\": [0.19444, 0.69444, 0, 0, 0.61111],\n \"184\": [0.17014, 0, 0, 0, 0.44445],\n \"198\": [0, 0.68333, 0, 0, 0.90278],\n \"215\": [0.08333, 0.58333, 0, 0, 0.77778],\n \"216\": [0.04861, 0.73194, 0, 0, 0.77778],\n \"223\": [0, 0.69444, 0, 0, 0.5],\n \"230\": [0, 0.43056, 0, 0, 0.72222],\n \"247\": [0.08333, 0.58333, 0, 0, 0.77778],\n \"248\": [0.09722, 0.52778, 0, 0, 0.5],\n \"305\": [0, 0.43056, 0, 0, 0.27778],\n \"338\": [0, 0.68333, 0, 0, 1.01389],\n \"339\": [0, 0.43056, 0, 0, 0.77778],\n \"567\": [0.19444, 0.43056, 0, 0, 0.30556],\n \"710\": [0, 0.69444, 0, 0, 0.5],\n \"711\": [0, 0.62847, 0, 0, 0.5],\n \"713\": [0, 0.56778, 0, 0, 0.5],\n \"714\": [0, 0.69444, 0, 0, 0.5],\n \"715\": [0, 0.69444, 0, 0, 0.5],\n \"728\": [0, 0.69444, 0, 0, 0.5],\n \"729\": [0, 0.66786, 0, 0, 0.27778],\n \"730\": [0, 0.69444, 0, 0, 0.75],\n \"732\": [0, 0.66786, 0, 0, 0.5],\n \"733\": [0, 0.69444, 0, 0, 0.5],\n \"915\": [0, 0.68333, 0, 0, 0.625],\n \"916\": [0, 0.68333, 0, 0, 0.83334],\n \"920\": [0, 0.68333, 0, 0, 0.77778],\n \"923\": [0, 0.68333, 0, 0, 0.69445],\n \"926\": [0, 0.68333, 0, 0, 0.66667],\n \"928\": [0, 0.68333, 0, 0, 0.75],\n \"931\": [0, 0.68333, 0, 0, 0.72222],\n \"933\": [0, 0.68333, 0, 0, 0.77778],\n \"934\": [0, 0.68333, 0, 0, 0.72222],\n \"936\": [0, 0.68333, 0, 0, 0.77778],\n \"937\": [0, 0.68333, 0, 0, 0.72222],\n \"8211\": [0, 0.43056, 0.02778, 0, 0.5],\n \"8212\": [0, 0.43056, 0.02778, 0, 1.0],\n \"8216\": [0, 0.69444, 0, 0, 0.27778],\n \"8217\": [0, 0.69444, 0, 0, 0.27778],\n \"8220\": [0, 0.69444, 0, 0, 0.5],\n \"8221\": [0, 0.69444, 0, 0, 0.5],\n \"8224\": [0.19444, 0.69444, 0, 0, 0.44445],\n \"8225\": [0.19444, 0.69444, 0, 0, 0.44445],\n \"8230\": [0, 0.123, 0, 0, 1.172],\n \"8242\": [0, 0.55556, 0, 0, 0.275],\n \"8407\": [0, 0.71444, 0.15382, 0, 0.5],\n \"8463\": [0, 0.68889, 0, 0, 0.54028],\n \"8465\": [0, 0.69444, 0, 0, 0.72222],\n \"8467\": [0, 0.69444, 0, 0.11111, 0.41667],\n \"8472\": [0.19444, 0.43056, 0, 0.11111, 0.63646],\n \"8476\": [0, 0.69444, 0, 0, 0.72222],\n \"8501\": [0, 0.69444, 0, 0, 0.61111],\n \"8592\": [-0.13313, 0.36687, 0, 0, 1.0],\n \"8593\": [0.19444, 0.69444, 0, 0, 0.5],\n \"8594\": [-0.13313, 0.36687, 0, 0, 1.0],\n \"8595\": [0.19444, 0.69444, 0, 0, 0.5],\n \"8596\": [-0.13313, 0.36687, 0, 0, 1.0],\n \"8597\": [0.25, 0.75, 0, 0, 0.5],\n \"8598\": [0.19444, 0.69444, 0, 0, 1.0],\n \"8599\": [0.19444, 0.69444, 0, 0, 1.0],\n \"8600\": [0.19444, 0.69444, 0, 0, 1.0],\n \"8601\": [0.19444, 0.69444, 0, 0, 1.0],\n \"8614\": [0.011, 0.511, 0, 0, 1.0],\n \"8617\": [0.011, 0.511, 0, 0, 1.126],\n \"8618\": [0.011, 0.511, 0, 0, 1.126],\n \"8636\": [-0.13313, 0.36687, 0, 0, 1.0],\n \"8637\": [-0.13313, 0.36687, 0, 0, 1.0],\n \"8640\": [-0.13313, 0.36687, 0, 0, 1.0],\n \"8641\": [-0.13313, 0.36687, 0, 0, 1.0],\n \"8652\": [0.011, 0.671, 0, 0, 1.0],\n \"8656\": [-0.13313, 0.36687, 0, 0, 1.0],\n \"8657\": [0.19444, 0.69444, 0, 0, 0.61111],\n \"8658\": [-0.13313, 0.36687, 0, 0, 1.0],\n \"8659\": [0.19444, 0.69444, 0, 0, 0.61111],\n \"8660\": [-0.13313, 0.36687, 0, 0, 1.0],\n \"8661\": [0.25, 0.75, 0, 0, 0.61111],\n \"8704\": [0, 0.69444, 0, 0, 0.55556],\n \"8706\": [0, 0.69444, 0.05556, 0.08334, 0.5309],\n \"8707\": [0, 0.69444, 0, 0, 0.55556],\n \"8709\": [0.05556, 0.75, 0, 0, 0.5],\n \"8711\": [0, 0.68333, 0, 0, 0.83334],\n \"8712\": [0.0391, 0.5391, 0, 0, 0.66667],\n \"8715\": [0.0391, 0.5391, 0, 0, 0.66667],\n \"8722\": [0.08333, 0.58333, 0, 0, 0.77778],\n \"8723\": [0.08333, 0.58333, 0, 0, 0.77778],\n \"8725\": [0.25, 0.75, 0, 0, 0.5],\n \"8726\": [0.25, 0.75, 0, 0, 0.5],\n \"8727\": [-0.03472, 0.46528, 0, 0, 0.5],\n \"8728\": [-0.05555, 0.44445, 0, 0, 0.5],\n \"8729\": [-0.05555, 0.44445, 0, 0, 0.5],\n \"8730\": [0.2, 0.8, 0, 0, 0.83334],\n \"8733\": [0, 0.43056, 0, 0, 0.77778],\n \"8734\": [0, 0.43056, 0, 0, 1.0],\n \"8736\": [0, 0.69224, 0, 0, 0.72222],\n \"8739\": [0.25, 0.75, 0, 0, 0.27778],\n \"8741\": [0.25, 0.75, 0, 0, 0.5],\n \"8743\": [0, 0.55556, 0, 0, 0.66667],\n \"8744\": [0, 0.55556, 0, 0, 0.66667],\n \"8745\": [0, 0.55556, 0, 0, 0.66667],\n \"8746\": [0, 0.55556, 0, 0, 0.66667],\n \"8747\": [0.19444, 0.69444, 0.11111, 0, 0.41667],\n \"8764\": [-0.13313, 0.36687, 0, 0, 0.77778],\n \"8768\": [0.19444, 0.69444, 0, 0, 0.27778],\n \"8771\": [-0.03625, 0.46375, 0, 0, 0.77778],\n \"8773\": [-0.022, 0.589, 0, 0, 0.778],\n \"8776\": [-0.01688, 0.48312, 0, 0, 0.77778],\n \"8781\": [-0.03625, 0.46375, 0, 0, 0.77778],\n \"8784\": [-0.133, 0.673, 0, 0, 0.778],\n \"8801\": [-0.03625, 0.46375, 0, 0, 0.77778],\n \"8804\": [0.13597, 0.63597, 0, 0, 0.77778],\n \"8805\": [0.13597, 0.63597, 0, 0, 0.77778],\n \"8810\": [0.0391, 0.5391, 0, 0, 1.0],\n \"8811\": [0.0391, 0.5391, 0, 0, 1.0],\n \"8826\": [0.0391, 0.5391, 0, 0, 0.77778],\n \"8827\": [0.0391, 0.5391, 0, 0, 0.77778],\n \"8834\": [0.0391, 0.5391, 0, 0, 0.77778],\n \"8835\": [0.0391, 0.5391, 0, 0, 0.77778],\n \"8838\": [0.13597, 0.63597, 0, 0, 0.77778],\n \"8839\": [0.13597, 0.63597, 0, 0, 0.77778],\n \"8846\": [0, 0.55556, 0, 0, 0.66667],\n \"8849\": [0.13597, 0.63597, 0, 0, 0.77778],\n \"8850\": [0.13597, 0.63597, 0, 0, 0.77778],\n \"8851\": [0, 0.55556, 0, 0, 0.66667],\n \"8852\": [0, 0.55556, 0, 0, 0.66667],\n \"8853\": [0.08333, 0.58333, 0, 0, 0.77778],\n \"8854\": [0.08333, 0.58333, 0, 0, 0.77778],\n \"8855\": [0.08333, 0.58333, 0, 0, 0.77778],\n \"8856\": [0.08333, 0.58333, 0, 0, 0.77778],\n \"8857\": [0.08333, 0.58333, 0, 0, 0.77778],\n \"8866\": [0, 0.69444, 0, 0, 0.61111],\n \"8867\": [0, 0.69444, 0, 0, 0.61111],\n \"8868\": [0, 0.69444, 0, 0, 0.77778],\n \"8869\": [0, 0.69444, 0, 0, 0.77778],\n \"8872\": [0.249, 0.75, 0, 0, 0.867],\n \"8900\": [-0.05555, 0.44445, 0, 0, 0.5],\n \"8901\": [-0.05555, 0.44445, 0, 0, 0.27778],\n \"8902\": [-0.03472, 0.46528, 0, 0, 0.5],\n \"8904\": [0.005, 0.505, 0, 0, 0.9],\n \"8942\": [0.03, 0.903, 0, 0, 0.278],\n \"8943\": [-0.19, 0.313, 0, 0, 1.172],\n \"8945\": [-0.1, 0.823, 0, 0, 1.282],\n \"8968\": [0.25, 0.75, 0, 0, 0.44445],\n \"8969\": [0.25, 0.75, 0, 0, 0.44445],\n \"8970\": [0.25, 0.75, 0, 0, 0.44445],\n \"8971\": [0.25, 0.75, 0, 0, 0.44445],\n \"8994\": [-0.14236, 0.35764, 0, 0, 1.0],\n \"8995\": [-0.14236, 0.35764, 0, 0, 1.0],\n \"9136\": [0.244, 0.744, 0, 0, 0.412],\n \"9137\": [0.244, 0.745, 0, 0, 0.412],\n \"9651\": [0.19444, 0.69444, 0, 0, 0.88889],\n \"9657\": [-0.03472, 0.46528, 0, 0, 0.5],\n \"9661\": [0.19444, 0.69444, 0, 0, 0.88889],\n \"9667\": [-0.03472, 0.46528, 0, 0, 0.5],\n \"9711\": [0.19444, 0.69444, 0, 0, 1.0],\n \"9824\": [0.12963, 0.69444, 0, 0, 0.77778],\n \"9825\": [0.12963, 0.69444, 0, 0, 0.77778],\n \"9826\": [0.12963, 0.69444, 0, 0, 0.77778],\n \"9827\": [0.12963, 0.69444, 0, 0, 0.77778],\n \"9837\": [0, 0.75, 0, 0, 0.38889],\n \"9838\": [0.19444, 0.69444, 0, 0, 0.38889],\n \"9839\": [0.19444, 0.69444, 0, 0, 0.38889],\n \"10216\": [0.25, 0.75, 0, 0, 0.38889],\n \"10217\": [0.25, 0.75, 0, 0, 0.38889],\n \"10222\": [0.244, 0.744, 0, 0, 0.412],\n \"10223\": [0.244, 0.745, 0, 0, 0.412],\n \"10229\": [0.011, 0.511, 0, 0, 1.609],\n \"10230\": [0.011, 0.511, 0, 0, 1.638],\n \"10231\": [0.011, 0.511, 0, 0, 1.859],\n \"10232\": [0.024, 0.525, 0, 0, 1.609],\n \"10233\": [0.024, 0.525, 0, 0, 1.638],\n \"10234\": [0.024, 0.525, 0, 0, 1.858],\n \"10236\": [0.011, 0.511, 0, 0, 1.638],\n \"10815\": [0, 0.68333, 0, 0, 0.75],\n \"10927\": [0.13597, 0.63597, 0, 0, 0.77778],\n \"10928\": [0.13597, 0.63597, 0, 0, 0.77778],\n \"57376\": [0.19444, 0.69444, 0, 0, 0]\n },\n \"Math-BoldItalic\": {\n \"32\": [0, 0, 0, 0, 0.25],\n \"48\": [0, 0.44444, 0, 0, 0.575],\n \"49\": [0, 0.44444, 0, 0, 0.575],\n \"50\": [0, 0.44444, 0, 0, 0.575],\n \"51\": [0.19444, 0.44444, 0, 0, 0.575],\n \"52\": [0.19444, 0.44444, 0, 0, 0.575],\n \"53\": [0.19444, 0.44444, 0, 0, 0.575],\n \"54\": [0, 0.64444, 0, 0, 0.575],\n \"55\": [0.19444, 0.44444, 0, 0, 0.575],\n \"56\": [0, 0.64444, 0, 0, 0.575],\n \"57\": [0.19444, 0.44444, 0, 0, 0.575],\n \"65\": [0, 0.68611, 0, 0, 0.86944],\n \"66\": [0, 0.68611, 0.04835, 0, 0.8664],\n \"67\": [0, 0.68611, 0.06979, 0, 0.81694],\n \"68\": [0, 0.68611, 0.03194, 0, 0.93812],\n \"69\": [0, 0.68611, 0.05451, 0, 0.81007],\n \"70\": [0, 0.68611, 0.15972, 0, 0.68889],\n \"71\": [0, 0.68611, 0, 0, 0.88673],\n \"72\": [0, 0.68611, 0.08229, 0, 0.98229],\n \"73\": [0, 0.68611, 0.07778, 0, 0.51111],\n \"74\": [0, 0.68611, 0.10069, 0, 0.63125],\n \"75\": [0, 0.68611, 0.06979, 0, 0.97118],\n \"76\": [0, 0.68611, 0, 0, 0.75555],\n \"77\": [0, 0.68611, 0.11424, 0, 1.14201],\n \"78\": [0, 0.68611, 0.11424, 0, 0.95034],\n \"79\": [0, 0.68611, 0.03194, 0, 0.83666],\n \"80\": [0, 0.68611, 0.15972, 0, 0.72309],\n \"81\": [0.19444, 0.68611, 0, 0, 0.86861],\n \"82\": [0, 0.68611, 0.00421, 0, 0.87235],\n \"83\": [0, 0.68611, 0.05382, 0, 0.69271],\n \"84\": [0, 0.68611, 0.15972, 0, 0.63663],\n \"85\": [0, 0.68611, 0.11424, 0, 0.80027],\n \"86\": [0, 0.68611, 0.25555, 0, 0.67778],\n \"87\": [0, 0.68611, 0.15972, 0, 1.09305],\n \"88\": [0, 0.68611, 0.07778, 0, 0.94722],\n \"89\": [0, 0.68611, 0.25555, 0, 0.67458],\n \"90\": [0, 0.68611, 0.06979, 0, 0.77257],\n \"97\": [0, 0.44444, 0, 0, 0.63287],\n \"98\": [0, 0.69444, 0, 0, 0.52083],\n \"99\": [0, 0.44444, 0, 0, 0.51342],\n \"100\": [0, 0.69444, 0, 0, 0.60972],\n \"101\": [0, 0.44444, 0, 0, 0.55361],\n \"102\": [0.19444, 0.69444, 0.11042, 0, 0.56806],\n \"103\": [0.19444, 0.44444, 0.03704, 0, 0.5449],\n \"104\": [0, 0.69444, 0, 0, 0.66759],\n \"105\": [0, 0.69326, 0, 0, 0.4048],\n \"106\": [0.19444, 0.69326, 0.0622, 0, 0.47083],\n \"107\": [0, 0.69444, 0.01852, 0, 0.6037],\n \"108\": [0, 0.69444, 0.0088, 0, 0.34815],\n \"109\": [0, 0.44444, 0, 0, 1.0324],\n \"110\": [0, 0.44444, 0, 0, 0.71296],\n \"111\": [0, 0.44444, 0, 0, 0.58472],\n \"112\": [0.19444, 0.44444, 0, 0, 0.60092],\n \"113\": [0.19444, 0.44444, 0.03704, 0, 0.54213],\n \"114\": [0, 0.44444, 0.03194, 0, 0.5287],\n \"115\": [0, 0.44444, 0, 0, 0.53125],\n \"116\": [0, 0.63492, 0, 0, 0.41528],\n \"117\": [0, 0.44444, 0, 0, 0.68102],\n \"118\": [0, 0.44444, 0.03704, 0, 0.56666],\n \"119\": [0, 0.44444, 0.02778, 0, 0.83148],\n \"120\": [0, 0.44444, 0, 0, 0.65903],\n \"121\": [0.19444, 0.44444, 0.03704, 0, 0.59028],\n \"122\": [0, 0.44444, 0.04213, 0, 0.55509],\n \"160\": [0, 0, 0, 0, 0.25],\n \"915\": [0, 0.68611, 0.15972, 0, 0.65694],\n \"916\": [0, 0.68611, 0, 0, 0.95833],\n \"920\": [0, 0.68611, 0.03194, 0, 0.86722],\n \"923\": [0, 0.68611, 0, 0, 0.80555],\n \"926\": [0, 0.68611, 0.07458, 0, 0.84125],\n \"928\": [0, 0.68611, 0.08229, 0, 0.98229],\n \"931\": [0, 0.68611, 0.05451, 0, 0.88507],\n \"933\": [0, 0.68611, 0.15972, 0, 0.67083],\n \"934\": [0, 0.68611, 0, 0, 0.76666],\n \"936\": [0, 0.68611, 0.11653, 0, 0.71402],\n \"937\": [0, 0.68611, 0.04835, 0, 0.8789],\n \"945\": [0, 0.44444, 0, 0, 0.76064],\n \"946\": [0.19444, 0.69444, 0.03403, 0, 0.65972],\n \"947\": [0.19444, 0.44444, 0.06389, 0, 0.59003],\n \"948\": [0, 0.69444, 0.03819, 0, 0.52222],\n \"949\": [0, 0.44444, 0, 0, 0.52882],\n \"950\": [0.19444, 0.69444, 0.06215, 0, 0.50833],\n \"951\": [0.19444, 0.44444, 0.03704, 0, 0.6],\n \"952\": [0, 0.69444, 0.03194, 0, 0.5618],\n \"953\": [0, 0.44444, 0, 0, 0.41204],\n \"954\": [0, 0.44444, 0, 0, 0.66759],\n \"955\": [0, 0.69444, 0, 0, 0.67083],\n \"956\": [0.19444, 0.44444, 0, 0, 0.70787],\n \"957\": [0, 0.44444, 0.06898, 0, 0.57685],\n \"958\": [0.19444, 0.69444, 0.03021, 0, 0.50833],\n \"959\": [0, 0.44444, 0, 0, 0.58472],\n \"960\": [0, 0.44444, 0.03704, 0, 0.68241],\n \"961\": [0.19444, 0.44444, 0, 0, 0.6118],\n \"962\": [0.09722, 0.44444, 0.07917, 0, 0.42361],\n \"963\": [0, 0.44444, 0.03704, 0, 0.68588],\n \"964\": [0, 0.44444, 0.13472, 0, 0.52083],\n \"965\": [0, 0.44444, 0.03704, 0, 0.63055],\n \"966\": [0.19444, 0.44444, 0, 0, 0.74722],\n \"967\": [0.19444, 0.44444, 0, 0, 0.71805],\n \"968\": [0.19444, 0.69444, 0.03704, 0, 0.75833],\n \"969\": [0, 0.44444, 0.03704, 0, 0.71782],\n \"977\": [0, 0.69444, 0, 0, 0.69155],\n \"981\": [0.19444, 0.69444, 0, 0, 0.7125],\n \"982\": [0, 0.44444, 0.03194, 0, 0.975],\n \"1009\": [0.19444, 0.44444, 0, 0, 0.6118],\n \"1013\": [0, 0.44444, 0, 0, 0.48333],\n \"57649\": [0, 0.44444, 0, 0, 0.39352],\n \"57911\": [0.19444, 0.44444, 0, 0, 0.43889]\n },\n \"Math-Italic\": {\n \"32\": [0, 0, 0, 0, 0.25],\n \"48\": [0, 0.43056, 0, 0, 0.5],\n \"49\": [0, 0.43056, 0, 0, 0.5],\n \"50\": [0, 0.43056, 0, 0, 0.5],\n \"51\": [0.19444, 0.43056, 0, 0, 0.5],\n \"52\": [0.19444, 0.43056, 0, 0, 0.5],\n \"53\": [0.19444, 0.43056, 0, 0, 0.5],\n \"54\": [0, 0.64444, 0, 0, 0.5],\n \"55\": [0.19444, 0.43056, 0, 0, 0.5],\n \"56\": [0, 0.64444, 0, 0, 0.5],\n \"57\": [0.19444, 0.43056, 0, 0, 0.5],\n \"65\": [0, 0.68333, 0, 0.13889, 0.75],\n \"66\": [0, 0.68333, 0.05017, 0.08334, 0.75851],\n \"67\": [0, 0.68333, 0.07153, 0.08334, 0.71472],\n \"68\": [0, 0.68333, 0.02778, 0.05556, 0.82792],\n \"69\": [0, 0.68333, 0.05764, 0.08334, 0.7382],\n \"70\": [0, 0.68333, 0.13889, 0.08334, 0.64306],\n \"71\": [0, 0.68333, 0, 0.08334, 0.78625],\n \"72\": [0, 0.68333, 0.08125, 0.05556, 0.83125],\n \"73\": [0, 0.68333, 0.07847, 0.11111, 0.43958],\n \"74\": [0, 0.68333, 0.09618, 0.16667, 0.55451],\n \"75\": [0, 0.68333, 0.07153, 0.05556, 0.84931],\n \"76\": [0, 0.68333, 0, 0.02778, 0.68056],\n \"77\": [0, 0.68333, 0.10903, 0.08334, 0.97014],\n \"78\": [0, 0.68333, 0.10903, 0.08334, 0.80347],\n \"79\": [0, 0.68333, 0.02778, 0.08334, 0.76278],\n \"80\": [0, 0.68333, 0.13889, 0.08334, 0.64201],\n \"81\": [0.19444, 0.68333, 0, 0.08334, 0.79056],\n \"82\": [0, 0.68333, 0.00773, 0.08334, 0.75929],\n \"83\": [0, 0.68333, 0.05764, 0.08334, 0.6132],\n \"84\": [0, 0.68333, 0.13889, 0.08334, 0.58438],\n \"85\": [0, 0.68333, 0.10903, 0.02778, 0.68278],\n \"86\": [0, 0.68333, 0.22222, 0, 0.58333],\n \"87\": [0, 0.68333, 0.13889, 0, 0.94445],\n \"88\": [0, 0.68333, 0.07847, 0.08334, 0.82847],\n \"89\": [0, 0.68333, 0.22222, 0, 0.58056],\n \"90\": [0, 0.68333, 0.07153, 0.08334, 0.68264],\n \"97\": [0, 0.43056, 0, 0, 0.52859],\n \"98\": [0, 0.69444, 0, 0, 0.42917],\n \"99\": [0, 0.43056, 0, 0.05556, 0.43276],\n \"100\": [0, 0.69444, 0, 0.16667, 0.52049],\n \"101\": [0, 0.43056, 0, 0.05556, 0.46563],\n \"102\": [0.19444, 0.69444, 0.10764, 0.16667, 0.48959],\n \"103\": [0.19444, 0.43056, 0.03588, 0.02778, 0.47697],\n \"104\": [0, 0.69444, 0, 0, 0.57616],\n \"105\": [0, 0.65952, 0, 0, 0.34451],\n \"106\": [0.19444, 0.65952, 0.05724, 0, 0.41181],\n \"107\": [0, 0.69444, 0.03148, 0, 0.5206],\n \"108\": [0, 0.69444, 0.01968, 0.08334, 0.29838],\n \"109\": [0, 0.43056, 0, 0, 0.87801],\n \"110\": [0, 0.43056, 0, 0, 0.60023],\n \"111\": [0, 0.43056, 0, 0.05556, 0.48472],\n \"112\": [0.19444, 0.43056, 0, 0.08334, 0.50313],\n \"113\": [0.19444, 0.43056, 0.03588, 0.08334, 0.44641],\n \"114\": [0, 0.43056, 0.02778, 0.05556, 0.45116],\n \"115\": [0, 0.43056, 0, 0.05556, 0.46875],\n \"116\": [0, 0.61508, 0, 0.08334, 0.36111],\n \"117\": [0, 0.43056, 0, 0.02778, 0.57246],\n \"118\": [0, 0.43056, 0.03588, 0.02778, 0.48472],\n \"119\": [0, 0.43056, 0.02691, 0.08334, 0.71592],\n \"120\": [0, 0.43056, 0, 0.02778, 0.57153],\n \"121\": [0.19444, 0.43056, 0.03588, 0.05556, 0.49028],\n \"122\": [0, 0.43056, 0.04398, 0.05556, 0.46505],\n \"160\": [0, 0, 0, 0, 0.25],\n \"915\": [0, 0.68333, 0.13889, 0.08334, 0.61528],\n \"916\": [0, 0.68333, 0, 0.16667, 0.83334],\n \"920\": [0, 0.68333, 0.02778, 0.08334, 0.76278],\n \"923\": [0, 0.68333, 0, 0.16667, 0.69445],\n \"926\": [0, 0.68333, 0.07569, 0.08334, 0.74236],\n \"928\": [0, 0.68333, 0.08125, 0.05556, 0.83125],\n \"931\": [0, 0.68333, 0.05764, 0.08334, 0.77986],\n \"933\": [0, 0.68333, 0.13889, 0.05556, 0.58333],\n \"934\": [0, 0.68333, 0, 0.08334, 0.66667],\n \"936\": [0, 0.68333, 0.11, 0.05556, 0.61222],\n \"937\": [0, 0.68333, 0.05017, 0.08334, 0.7724],\n \"945\": [0, 0.43056, 0.0037, 0.02778, 0.6397],\n \"946\": [0.19444, 0.69444, 0.05278, 0.08334, 0.56563],\n \"947\": [0.19444, 0.43056, 0.05556, 0, 0.51773],\n \"948\": [0, 0.69444, 0.03785, 0.05556, 0.44444],\n \"949\": [0, 0.43056, 0, 0.08334, 0.46632],\n \"950\": [0.19444, 0.69444, 0.07378, 0.08334, 0.4375],\n \"951\": [0.19444, 0.43056, 0.03588, 0.05556, 0.49653],\n \"952\": [0, 0.69444, 0.02778, 0.08334, 0.46944],\n \"953\": [0, 0.43056, 0, 0.05556, 0.35394],\n \"954\": [0, 0.43056, 0, 0, 0.57616],\n \"955\": [0, 0.69444, 0, 0, 0.58334],\n \"956\": [0.19444, 0.43056, 0, 0.02778, 0.60255],\n \"957\": [0, 0.43056, 0.06366, 0.02778, 0.49398],\n \"958\": [0.19444, 0.69444, 0.04601, 0.11111, 0.4375],\n \"959\": [0, 0.43056, 0, 0.05556, 0.48472],\n \"960\": [0, 0.43056, 0.03588, 0, 0.57003],\n \"961\": [0.19444, 0.43056, 0, 0.08334, 0.51702],\n \"962\": [0.09722, 0.43056, 0.07986, 0.08334, 0.36285],\n \"963\": [0, 0.43056, 0.03588, 0, 0.57141],\n \"964\": [0, 0.43056, 0.1132, 0.02778, 0.43715],\n \"965\": [0, 0.43056, 0.03588, 0.02778, 0.54028],\n \"966\": [0.19444, 0.43056, 0, 0.08334, 0.65417],\n \"967\": [0.19444, 0.43056, 0, 0.05556, 0.62569],\n \"968\": [0.19444, 0.69444, 0.03588, 0.11111, 0.65139],\n \"969\": [0, 0.43056, 0.03588, 0, 0.62245],\n \"977\": [0, 0.69444, 0, 0.08334, 0.59144],\n \"981\": [0.19444, 0.69444, 0, 0.08334, 0.59583],\n \"982\": [0, 0.43056, 0.02778, 0, 0.82813],\n \"1009\": [0.19444, 0.43056, 0, 0.08334, 0.51702],\n \"1013\": [0, 0.43056, 0, 0.05556, 0.4059],\n \"57649\": [0, 0.43056, 0, 0.02778, 0.32246],\n \"57911\": [0.19444, 0.43056, 0, 0.08334, 0.38403]\n },\n \"SansSerif-Bold\": {\n \"32\": [0, 0, 0, 0, 0.25],\n \"33\": [0, 0.69444, 0, 0, 0.36667],\n \"34\": [0, 0.69444, 0, 0, 0.55834],\n \"35\": [0.19444, 0.69444, 0, 0, 0.91667],\n \"36\": [0.05556, 0.75, 0, 0, 0.55],\n \"37\": [0.05556, 0.75, 0, 0, 1.02912],\n \"38\": [0, 0.69444, 0, 0, 0.83056],\n \"39\": [0, 0.69444, 0, 0, 0.30556],\n \"40\": [0.25, 0.75, 0, 0, 0.42778],\n \"41\": [0.25, 0.75, 0, 0, 0.42778],\n \"42\": [0, 0.75, 0, 0, 0.55],\n \"43\": [0.11667, 0.61667, 0, 0, 0.85556],\n \"44\": [0.10556, 0.13056, 0, 0, 0.30556],\n \"45\": [0, 0.45833, 0, 0, 0.36667],\n \"46\": [0, 0.13056, 0, 0, 0.30556],\n \"47\": [0.25, 0.75, 0, 0, 0.55],\n \"48\": [0, 0.69444, 0, 0, 0.55],\n \"49\": [0, 0.69444, 0, 0, 0.55],\n \"50\": [0, 0.69444, 0, 0, 0.55],\n \"51\": [0, 0.69444, 0, 0, 0.55],\n \"52\": [0, 0.69444, 0, 0, 0.55],\n \"53\": [0, 0.69444, 0, 0, 0.55],\n \"54\": [0, 0.69444, 0, 0, 0.55],\n \"55\": [0, 0.69444, 0, 0, 0.55],\n \"56\": [0, 0.69444, 0, 0, 0.55],\n \"57\": [0, 0.69444, 0, 0, 0.55],\n \"58\": [0, 0.45833, 0, 0, 0.30556],\n \"59\": [0.10556, 0.45833, 0, 0, 0.30556],\n \"61\": [-0.09375, 0.40625, 0, 0, 0.85556],\n \"63\": [0, 0.69444, 0, 0, 0.51945],\n \"64\": [0, 0.69444, 0, 0, 0.73334],\n \"65\": [0, 0.69444, 0, 0, 0.73334],\n \"66\": [0, 0.69444, 0, 0, 0.73334],\n \"67\": [0, 0.69444, 0, 0, 0.70278],\n \"68\": [0, 0.69444, 0, 0, 0.79445],\n \"69\": [0, 0.69444, 0, 0, 0.64167],\n \"70\": [0, 0.69444, 0, 0, 0.61111],\n \"71\": [0, 0.69444, 0, 0, 0.73334],\n \"72\": [0, 0.69444, 0, 0, 0.79445],\n \"73\": [0, 0.69444, 0, 0, 0.33056],\n \"74\": [0, 0.69444, 0, 0, 0.51945],\n \"75\": [0, 0.69444, 0, 0, 0.76389],\n \"76\": [0, 0.69444, 0, 0, 0.58056],\n \"77\": [0, 0.69444, 0, 0, 0.97778],\n \"78\": [0, 0.69444, 0, 0, 0.79445],\n \"79\": [0, 0.69444, 0, 0, 0.79445],\n \"80\": [0, 0.69444, 0, 0, 0.70278],\n \"81\": [0.10556, 0.69444, 0, 0, 0.79445],\n \"82\": [0, 0.69444, 0, 0, 0.70278],\n \"83\": [0, 0.69444, 0, 0, 0.61111],\n \"84\": [0, 0.69444, 0, 0, 0.73334],\n \"85\": [0, 0.69444, 0, 0, 0.76389],\n \"86\": [0, 0.69444, 0.01528, 0, 0.73334],\n \"87\": [0, 0.69444, 0.01528, 0, 1.03889],\n \"88\": [0, 0.69444, 0, 0, 0.73334],\n \"89\": [0, 0.69444, 0.0275, 0, 0.73334],\n \"90\": [0, 0.69444, 0, 0, 0.67223],\n \"91\": [0.25, 0.75, 0, 0, 0.34306],\n \"93\": [0.25, 0.75, 0, 0, 0.34306],\n \"94\": [0, 0.69444, 0, 0, 0.55],\n \"95\": [0.35, 0.10833, 0.03056, 0, 0.55],\n \"97\": [0, 0.45833, 0, 0, 0.525],\n \"98\": [0, 0.69444, 0, 0, 0.56111],\n \"99\": [0, 0.45833, 0, 0, 0.48889],\n \"100\": [0, 0.69444, 0, 0, 0.56111],\n \"101\": [0, 0.45833, 0, 0, 0.51111],\n \"102\": [0, 0.69444, 0.07639, 0, 0.33611],\n \"103\": [0.19444, 0.45833, 0.01528, 0, 0.55],\n \"104\": [0, 0.69444, 0, 0, 0.56111],\n \"105\": [0, 0.69444, 0, 0, 0.25556],\n \"106\": [0.19444, 0.69444, 0, 0, 0.28611],\n \"107\": [0, 0.69444, 0, 0, 0.53056],\n \"108\": [0, 0.69444, 0, 0, 0.25556],\n \"109\": [0, 0.45833, 0, 0, 0.86667],\n \"110\": [0, 0.45833, 0, 0, 0.56111],\n \"111\": [0, 0.45833, 0, 0, 0.55],\n \"112\": [0.19444, 0.45833, 0, 0, 0.56111],\n \"113\": [0.19444, 0.45833, 0, 0, 0.56111],\n \"114\": [0, 0.45833, 0.01528, 0, 0.37222],\n \"115\": [0, 0.45833, 0, 0, 0.42167],\n \"116\": [0, 0.58929, 0, 0, 0.40417],\n \"117\": [0, 0.45833, 0, 0, 0.56111],\n \"118\": [0, 0.45833, 0.01528, 0, 0.5],\n \"119\": [0, 0.45833, 0.01528, 0, 0.74445],\n \"120\": [0, 0.45833, 0, 0, 0.5],\n \"121\": [0.19444, 0.45833, 0.01528, 0, 0.5],\n \"122\": [0, 0.45833, 0, 0, 0.47639],\n \"126\": [0.35, 0.34444, 0, 0, 0.55],\n \"160\": [0, 0, 0, 0, 0.25],\n \"168\": [0, 0.69444, 0, 0, 0.55],\n \"176\": [0, 0.69444, 0, 0, 0.73334],\n \"180\": [0, 0.69444, 0, 0, 0.55],\n \"184\": [0.17014, 0, 0, 0, 0.48889],\n \"305\": [0, 0.45833, 0, 0, 0.25556],\n \"567\": [0.19444, 0.45833, 0, 0, 0.28611],\n \"710\": [0, 0.69444, 0, 0, 0.55],\n \"711\": [0, 0.63542, 0, 0, 0.55],\n \"713\": [0, 0.63778, 0, 0, 0.55],\n \"728\": [0, 0.69444, 0, 0, 0.55],\n \"729\": [0, 0.69444, 0, 0, 0.30556],\n \"730\": [0, 0.69444, 0, 0, 0.73334],\n \"732\": [0, 0.69444, 0, 0, 0.55],\n \"733\": [0, 0.69444, 0, 0, 0.55],\n \"915\": [0, 0.69444, 0, 0, 0.58056],\n \"916\": [0, 0.69444, 0, 0, 0.91667],\n \"920\": [0, 0.69444, 0, 0, 0.85556],\n \"923\": [0, 0.69444, 0, 0, 0.67223],\n \"926\": [0, 0.69444, 0, 0, 0.73334],\n \"928\": [0, 0.69444, 0, 0, 0.79445],\n \"931\": [0, 0.69444, 0, 0, 0.79445],\n \"933\": [0, 0.69444, 0, 0, 0.85556],\n \"934\": [0, 0.69444, 0, 0, 0.79445],\n \"936\": [0, 0.69444, 0, 0, 0.85556],\n \"937\": [0, 0.69444, 0, 0, 0.79445],\n \"8211\": [0, 0.45833, 0.03056, 0, 0.55],\n \"8212\": [0, 0.45833, 0.03056, 0, 1.10001],\n \"8216\": [0, 0.69444, 0, 0, 0.30556],\n \"8217\": [0, 0.69444, 0, 0, 0.30556],\n \"8220\": [0, 0.69444, 0, 0, 0.55834],\n \"8221\": [0, 0.69444, 0, 0, 0.55834]\n },\n \"SansSerif-Italic\": {\n \"32\": [0, 0, 0, 0, 0.25],\n \"33\": [0, 0.69444, 0.05733, 0, 0.31945],\n \"34\": [0, 0.69444, 0.00316, 0, 0.5],\n \"35\": [0.19444, 0.69444, 0.05087, 0, 0.83334],\n \"36\": [0.05556, 0.75, 0.11156, 0, 0.5],\n \"37\": [0.05556, 0.75, 0.03126, 0, 0.83334],\n \"38\": [0, 0.69444, 0.03058, 0, 0.75834],\n \"39\": [0, 0.69444, 0.07816, 0, 0.27778],\n \"40\": [0.25, 0.75, 0.13164, 0, 0.38889],\n \"41\": [0.25, 0.75, 0.02536, 0, 0.38889],\n \"42\": [0, 0.75, 0.11775, 0, 0.5],\n \"43\": [0.08333, 0.58333, 0.02536, 0, 0.77778],\n \"44\": [0.125, 0.08333, 0, 0, 0.27778],\n \"45\": [0, 0.44444, 0.01946, 0, 0.33333],\n \"46\": [0, 0.08333, 0, 0, 0.27778],\n \"47\": [0.25, 0.75, 0.13164, 0, 0.5],\n \"48\": [0, 0.65556, 0.11156, 0, 0.5],\n \"49\": [0, 0.65556, 0.11156, 0, 0.5],\n \"50\": [0, 0.65556, 0.11156, 0, 0.5],\n \"51\": [0, 0.65556, 0.11156, 0, 0.5],\n \"52\": [0, 0.65556, 0.11156, 0, 0.5],\n \"53\": [0, 0.65556, 0.11156, 0, 0.5],\n \"54\": [0, 0.65556, 0.11156, 0, 0.5],\n \"55\": [0, 0.65556, 0.11156, 0, 0.5],\n \"56\": [0, 0.65556, 0.11156, 0, 0.5],\n \"57\": [0, 0.65556, 0.11156, 0, 0.5],\n \"58\": [0, 0.44444, 0.02502, 0, 0.27778],\n \"59\": [0.125, 0.44444, 0.02502, 0, 0.27778],\n \"61\": [-0.13, 0.37, 0.05087, 0, 0.77778],\n \"63\": [0, 0.69444, 0.11809, 0, 0.47222],\n \"64\": [0, 0.69444, 0.07555, 0, 0.66667],\n \"65\": [0, 0.69444, 0, 0, 0.66667],\n \"66\": [0, 0.69444, 0.08293, 0, 0.66667],\n \"67\": [0, 0.69444, 0.11983, 0, 0.63889],\n \"68\": [0, 0.69444, 0.07555, 0, 0.72223],\n \"69\": [0, 0.69444, 0.11983, 0, 0.59722],\n \"70\": [0, 0.69444, 0.13372, 0, 0.56945],\n \"71\": [0, 0.69444, 0.11983, 0, 0.66667],\n \"72\": [0, 0.69444, 0.08094, 0, 0.70834],\n \"73\": [0, 0.69444, 0.13372, 0, 0.27778],\n \"74\": [0, 0.69444, 0.08094, 0, 0.47222],\n \"75\": [0, 0.69444, 0.11983, 0, 0.69445],\n \"76\": [0, 0.69444, 0, 0, 0.54167],\n \"77\": [0, 0.69444, 0.08094, 0, 0.875],\n \"78\": [0, 0.69444, 0.08094, 0, 0.70834],\n \"79\": [0, 0.69444, 0.07555, 0, 0.73611],\n \"80\": [0, 0.69444, 0.08293, 0, 0.63889],\n \"81\": [0.125, 0.69444, 0.07555, 0, 0.73611],\n \"82\": [0, 0.69444, 0.08293, 0, 0.64584],\n \"83\": [0, 0.69444, 0.09205, 0, 0.55556],\n \"84\": [0, 0.69444, 0.13372, 0, 0.68056],\n \"85\": [0, 0.69444, 0.08094, 0, 0.6875],\n \"86\": [0, 0.69444, 0.1615, 0, 0.66667],\n \"87\": [0, 0.69444, 0.1615, 0, 0.94445],\n \"88\": [0, 0.69444, 0.13372, 0, 0.66667],\n \"89\": [0, 0.69444, 0.17261, 0, 0.66667],\n \"90\": [0, 0.69444, 0.11983, 0, 0.61111],\n \"91\": [0.25, 0.75, 0.15942, 0, 0.28889],\n \"93\": [0.25, 0.75, 0.08719, 0, 0.28889],\n \"94\": [0, 0.69444, 0.0799, 0, 0.5],\n \"95\": [0.35, 0.09444, 0.08616, 0, 0.5],\n \"97\": [0, 0.44444, 0.00981, 0, 0.48056],\n \"98\": [0, 0.69444, 0.03057, 0, 0.51667],\n \"99\": [0, 0.44444, 0.08336, 0, 0.44445],\n \"100\": [0, 0.69444, 0.09483, 0, 0.51667],\n \"101\": [0, 0.44444, 0.06778, 0, 0.44445],\n \"102\": [0, 0.69444, 0.21705, 0, 0.30556],\n \"103\": [0.19444, 0.44444, 0.10836, 0, 0.5],\n \"104\": [0, 0.69444, 0.01778, 0, 0.51667],\n \"105\": [0, 0.67937, 0.09718, 0, 0.23889],\n \"106\": [0.19444, 0.67937, 0.09162, 0, 0.26667],\n \"107\": [0, 0.69444, 0.08336, 0, 0.48889],\n \"108\": [0, 0.69444, 0.09483, 0, 0.23889],\n \"109\": [0, 0.44444, 0.01778, 0, 0.79445],\n \"110\": [0, 0.44444, 0.01778, 0, 0.51667],\n \"111\": [0, 0.44444, 0.06613, 0, 0.5],\n \"112\": [0.19444, 0.44444, 0.0389, 0, 0.51667],\n \"113\": [0.19444, 0.44444, 0.04169, 0, 0.51667],\n \"114\": [0, 0.44444, 0.10836, 0, 0.34167],\n \"115\": [0, 0.44444, 0.0778, 0, 0.38333],\n \"116\": [0, 0.57143, 0.07225, 0, 0.36111],\n \"117\": [0, 0.44444, 0.04169, 0, 0.51667],\n \"118\": [0, 0.44444, 0.10836, 0, 0.46111],\n \"119\": [0, 0.44444, 0.10836, 0, 0.68334],\n \"120\": [0, 0.44444, 0.09169, 0, 0.46111],\n \"121\": [0.19444, 0.44444, 0.10836, 0, 0.46111],\n \"122\": [0, 0.44444, 0.08752, 0, 0.43472],\n \"126\": [0.35, 0.32659, 0.08826, 0, 0.5],\n \"160\": [0, 0, 0, 0, 0.25],\n \"168\": [0, 0.67937, 0.06385, 0, 0.5],\n \"176\": [0, 0.69444, 0, 0, 0.73752],\n \"184\": [0.17014, 0, 0, 0, 0.44445],\n \"305\": [0, 0.44444, 0.04169, 0, 0.23889],\n \"567\": [0.19444, 0.44444, 0.04169, 0, 0.26667],\n \"710\": [0, 0.69444, 0.0799, 0, 0.5],\n \"711\": [0, 0.63194, 0.08432, 0, 0.5],\n \"713\": [0, 0.60889, 0.08776, 0, 0.5],\n \"714\": [0, 0.69444, 0.09205, 0, 0.5],\n \"715\": [0, 0.69444, 0, 0, 0.5],\n \"728\": [0, 0.69444, 0.09483, 0, 0.5],\n \"729\": [0, 0.67937, 0.07774, 0, 0.27778],\n \"730\": [0, 0.69444, 0, 0, 0.73752],\n \"732\": [0, 0.67659, 0.08826, 0, 0.5],\n \"733\": [0, 0.69444, 0.09205, 0, 0.5],\n \"915\": [0, 0.69444, 0.13372, 0, 0.54167],\n \"916\": [0, 0.69444, 0, 0, 0.83334],\n \"920\": [0, 0.69444, 0.07555, 0, 0.77778],\n \"923\": [0, 0.69444, 0, 0, 0.61111],\n \"926\": [0, 0.69444, 0.12816, 0, 0.66667],\n \"928\": [0, 0.69444, 0.08094, 0, 0.70834],\n \"931\": [0, 0.69444, 0.11983, 0, 0.72222],\n \"933\": [0, 0.69444, 0.09031, 0, 0.77778],\n \"934\": [0, 0.69444, 0.04603, 0, 0.72222],\n \"936\": [0, 0.69444, 0.09031, 0, 0.77778],\n \"937\": [0, 0.69444, 0.08293, 0, 0.72222],\n \"8211\": [0, 0.44444, 0.08616, 0, 0.5],\n \"8212\": [0, 0.44444, 0.08616, 0, 1.0],\n \"8216\": [0, 0.69444, 0.07816, 0, 0.27778],\n \"8217\": [0, 0.69444, 0.07816, 0, 0.27778],\n \"8220\": [0, 0.69444, 0.14205, 0, 0.5],\n \"8221\": [0, 0.69444, 0.00316, 0, 0.5]\n },\n \"SansSerif-Regular\": {\n \"32\": [0, 0, 0, 0, 0.25],\n \"33\": [0, 0.69444, 0, 0, 0.31945],\n \"34\": [0, 0.69444, 0, 0, 0.5],\n \"35\": [0.19444, 0.69444, 0, 0, 0.83334],\n \"36\": [0.05556, 0.75, 0, 0, 0.5],\n \"37\": [0.05556, 0.75, 0, 0, 0.83334],\n \"38\": [0, 0.69444, 0, 0, 0.75834],\n \"39\": [0, 0.69444, 0, 0, 0.27778],\n \"40\": [0.25, 0.75, 0, 0, 0.38889],\n \"41\": [0.25, 0.75, 0, 0, 0.38889],\n \"42\": [0, 0.75, 0, 0, 0.5],\n \"43\": [0.08333, 0.58333, 0, 0, 0.77778],\n \"44\": [0.125, 0.08333, 0, 0, 0.27778],\n \"45\": [0, 0.44444, 0, 0, 0.33333],\n \"46\": [0, 0.08333, 0, 0, 0.27778],\n \"47\": [0.25, 0.75, 0, 0, 0.5],\n \"48\": [0, 0.65556, 0, 0, 0.5],\n \"49\": [0, 0.65556, 0, 0, 0.5],\n \"50\": [0, 0.65556, 0, 0, 0.5],\n \"51\": [0, 0.65556, 0, 0, 0.5],\n \"52\": [0, 0.65556, 0, 0, 0.5],\n \"53\": [0, 0.65556, 0, 0, 0.5],\n \"54\": [0, 0.65556, 0, 0, 0.5],\n \"55\": [0, 0.65556, 0, 0, 0.5],\n \"56\": [0, 0.65556, 0, 0, 0.5],\n \"57\": [0, 0.65556, 0, 0, 0.5],\n \"58\": [0, 0.44444, 0, 0, 0.27778],\n \"59\": [0.125, 0.44444, 0, 0, 0.27778],\n \"61\": [-0.13, 0.37, 0, 0, 0.77778],\n \"63\": [0, 0.69444, 0, 0, 0.47222],\n \"64\": [0, 0.69444, 0, 0, 0.66667],\n \"65\": [0, 0.69444, 0, 0, 0.66667],\n \"66\": [0, 0.69444, 0, 0, 0.66667],\n \"67\": [0, 0.69444, 0, 0, 0.63889],\n \"68\": [0, 0.69444, 0, 0, 0.72223],\n \"69\": [0, 0.69444, 0, 0, 0.59722],\n \"70\": [0, 0.69444, 0, 0, 0.56945],\n \"71\": [0, 0.69444, 0, 0, 0.66667],\n \"72\": [0, 0.69444, 0, 0, 0.70834],\n \"73\": [0, 0.69444, 0, 0, 0.27778],\n \"74\": [0, 0.69444, 0, 0, 0.47222],\n \"75\": [0, 0.69444, 0, 0, 0.69445],\n \"76\": [0, 0.69444, 0, 0, 0.54167],\n \"77\": [0, 0.69444, 0, 0, 0.875],\n \"78\": [0, 0.69444, 0, 0, 0.70834],\n \"79\": [0, 0.69444, 0, 0, 0.73611],\n \"80\": [0, 0.69444, 0, 0, 0.63889],\n \"81\": [0.125, 0.69444, 0, 0, 0.73611],\n \"82\": [0, 0.69444, 0, 0, 0.64584],\n \"83\": [0, 0.69444, 0, 0, 0.55556],\n \"84\": [0, 0.69444, 0, 0, 0.68056],\n \"85\": [0, 0.69444, 0, 0, 0.6875],\n \"86\": [0, 0.69444, 0.01389, 0, 0.66667],\n \"87\": [0, 0.69444, 0.01389, 0, 0.94445],\n \"88\": [0, 0.69444, 0, 0, 0.66667],\n \"89\": [0, 0.69444, 0.025, 0, 0.66667],\n \"90\": [0, 0.69444, 0, 0, 0.61111],\n \"91\": [0.25, 0.75, 0, 0, 0.28889],\n \"93\": [0.25, 0.75, 0, 0, 0.28889],\n \"94\": [0, 0.69444, 0, 0, 0.5],\n \"95\": [0.35, 0.09444, 0.02778, 0, 0.5],\n \"97\": [0, 0.44444, 0, 0, 0.48056],\n \"98\": [0, 0.69444, 0, 0, 0.51667],\n \"99\": [0, 0.44444, 0, 0, 0.44445],\n \"100\": [0, 0.69444, 0, 0, 0.51667],\n \"101\": [0, 0.44444, 0, 0, 0.44445],\n \"102\": [0, 0.69444, 0.06944, 0, 0.30556],\n \"103\": [0.19444, 0.44444, 0.01389, 0, 0.5],\n \"104\": [0, 0.69444, 0, 0, 0.51667],\n \"105\": [0, 0.67937, 0, 0, 0.23889],\n \"106\": [0.19444, 0.67937, 0, 0, 0.26667],\n \"107\": [0, 0.69444, 0, 0, 0.48889],\n \"108\": [0, 0.69444, 0, 0, 0.23889],\n \"109\": [0, 0.44444, 0, 0, 0.79445],\n \"110\": [0, 0.44444, 0, 0, 0.51667],\n \"111\": [0, 0.44444, 0, 0, 0.5],\n \"112\": [0.19444, 0.44444, 0, 0, 0.51667],\n \"113\": [0.19444, 0.44444, 0, 0, 0.51667],\n \"114\": [0, 0.44444, 0.01389, 0, 0.34167],\n \"115\": [0, 0.44444, 0, 0, 0.38333],\n \"116\": [0, 0.57143, 0, 0, 0.36111],\n \"117\": [0, 0.44444, 0, 0, 0.51667],\n \"118\": [0, 0.44444, 0.01389, 0, 0.46111],\n \"119\": [0, 0.44444, 0.01389, 0, 0.68334],\n \"120\": [0, 0.44444, 0, 0, 0.46111],\n \"121\": [0.19444, 0.44444, 0.01389, 0, 0.46111],\n \"122\": [0, 0.44444, 0, 0, 0.43472],\n \"126\": [0.35, 0.32659, 0, 0, 0.5],\n \"160\": [0, 0, 0, 0, 0.25],\n \"168\": [0, 0.67937, 0, 0, 0.5],\n \"176\": [0, 0.69444, 0, 0, 0.66667],\n \"184\": [0.17014, 0, 0, 0, 0.44445],\n \"305\": [0, 0.44444, 0, 0, 0.23889],\n \"567\": [0.19444, 0.44444, 0, 0, 0.26667],\n \"710\": [0, 0.69444, 0, 0, 0.5],\n \"711\": [0, 0.63194, 0, 0, 0.5],\n \"713\": [0, 0.60889, 0, 0, 0.5],\n \"714\": [0, 0.69444, 0, 0, 0.5],\n \"715\": [0, 0.69444, 0, 0, 0.5],\n \"728\": [0, 0.69444, 0, 0, 0.5],\n \"729\": [0, 0.67937, 0, 0, 0.27778],\n \"730\": [0, 0.69444, 0, 0, 0.66667],\n \"732\": [0, 0.67659, 0, 0, 0.5],\n \"733\": [0, 0.69444, 0, 0, 0.5],\n \"915\": [0, 0.69444, 0, 0, 0.54167],\n \"916\": [0, 0.69444, 0, 0, 0.83334],\n \"920\": [0, 0.69444, 0, 0, 0.77778],\n \"923\": [0, 0.69444, 0, 0, 0.61111],\n \"926\": [0, 0.69444, 0, 0, 0.66667],\n \"928\": [0, 0.69444, 0, 0, 0.70834],\n \"931\": [0, 0.69444, 0, 0, 0.72222],\n \"933\": [0, 0.69444, 0, 0, 0.77778],\n \"934\": [0, 0.69444, 0, 0, 0.72222],\n \"936\": [0, 0.69444, 0, 0, 0.77778],\n \"937\": [0, 0.69444, 0, 0, 0.72222],\n \"8211\": [0, 0.44444, 0.02778, 0, 0.5],\n \"8212\": [0, 0.44444, 0.02778, 0, 1.0],\n \"8216\": [0, 0.69444, 0, 0, 0.27778],\n \"8217\": [0, 0.69444, 0, 0, 0.27778],\n \"8220\": [0, 0.69444, 0, 0, 0.5],\n \"8221\": [0, 0.69444, 0, 0, 0.5]\n },\n \"Script-Regular\": {\n \"32\": [0, 0, 0, 0, 0.25],\n \"65\": [0, 0.7, 0.22925, 0, 0.80253],\n \"66\": [0, 0.7, 0.04087, 0, 0.90757],\n \"67\": [0, 0.7, 0.1689, 0, 0.66619],\n \"68\": [0, 0.7, 0.09371, 0, 0.77443],\n \"69\": [0, 0.7, 0.18583, 0, 0.56162],\n \"70\": [0, 0.7, 0.13634, 0, 0.89544],\n \"71\": [0, 0.7, 0.17322, 0, 0.60961],\n \"72\": [0, 0.7, 0.29694, 0, 0.96919],\n \"73\": [0, 0.7, 0.19189, 0, 0.80907],\n \"74\": [0.27778, 0.7, 0.19189, 0, 1.05159],\n \"75\": [0, 0.7, 0.31259, 0, 0.91364],\n \"76\": [0, 0.7, 0.19189, 0, 0.87373],\n \"77\": [0, 0.7, 0.15981, 0, 1.08031],\n \"78\": [0, 0.7, 0.3525, 0, 0.9015],\n \"79\": [0, 0.7, 0.08078, 0, 0.73787],\n \"80\": [0, 0.7, 0.08078, 0, 1.01262],\n \"81\": [0, 0.7, 0.03305, 0, 0.88282],\n \"82\": [0, 0.7, 0.06259, 0, 0.85],\n \"83\": [0, 0.7, 0.19189, 0, 0.86767],\n \"84\": [0, 0.7, 0.29087, 0, 0.74697],\n \"85\": [0, 0.7, 0.25815, 0, 0.79996],\n \"86\": [0, 0.7, 0.27523, 0, 0.62204],\n \"87\": [0, 0.7, 0.27523, 0, 0.80532],\n \"88\": [0, 0.7, 0.26006, 0, 0.94445],\n \"89\": [0, 0.7, 0.2939, 0, 0.70961],\n \"90\": [0, 0.7, 0.24037, 0, 0.8212],\n \"160\": [0, 0, 0, 0, 0.25]\n },\n \"Size1-Regular\": {\n \"32\": [0, 0, 0, 0, 0.25],\n \"40\": [0.35001, 0.85, 0, 0, 0.45834],\n \"41\": [0.35001, 0.85, 0, 0, 0.45834],\n \"47\": [0.35001, 0.85, 0, 0, 0.57778],\n \"91\": [0.35001, 0.85, 0, 0, 0.41667],\n \"92\": [0.35001, 0.85, 0, 0, 0.57778],\n \"93\": [0.35001, 0.85, 0, 0, 0.41667],\n \"123\": [0.35001, 0.85, 0, 0, 0.58334],\n \"125\": [0.35001, 0.85, 0, 0, 0.58334],\n \"160\": [0, 0, 0, 0, 0.25],\n \"710\": [0, 0.72222, 0, 0, 0.55556],\n \"732\": [0, 0.72222, 0, 0, 0.55556],\n \"770\": [0, 0.72222, 0, 0, 0.55556],\n \"771\": [0, 0.72222, 0, 0, 0.55556],\n \"8214\": [-0.00099, 0.601, 0, 0, 0.77778],\n \"8593\": [1e-05, 0.6, 0, 0, 0.66667],\n \"8595\": [1e-05, 0.6, 0, 0, 0.66667],\n \"8657\": [1e-05, 0.6, 0, 0, 0.77778],\n \"8659\": [1e-05, 0.6, 0, 0, 0.77778],\n \"8719\": [0.25001, 0.75, 0, 0, 0.94445],\n \"8720\": [0.25001, 0.75, 0, 0, 0.94445],\n \"8721\": [0.25001, 0.75, 0, 0, 1.05556],\n \"8730\": [0.35001, 0.85, 0, 0, 1.0],\n \"8739\": [-0.00599, 0.606, 0, 0, 0.33333],\n \"8741\": [-0.00599, 0.606, 0, 0, 0.55556],\n \"8747\": [0.30612, 0.805, 0.19445, 0, 0.47222],\n \"8748\": [0.306, 0.805, 0.19445, 0, 0.47222],\n \"8749\": [0.306, 0.805, 0.19445, 0, 0.47222],\n \"8750\": [0.30612, 0.805, 0.19445, 0, 0.47222],\n \"8896\": [0.25001, 0.75, 0, 0, 0.83334],\n \"8897\": [0.25001, 0.75, 0, 0, 0.83334],\n \"8898\": [0.25001, 0.75, 0, 0, 0.83334],\n \"8899\": [0.25001, 0.75, 0, 0, 0.83334],\n \"8968\": [0.35001, 0.85, 0, 0, 0.47222],\n \"8969\": [0.35001, 0.85, 0, 0, 0.47222],\n \"8970\": [0.35001, 0.85, 0, 0, 0.47222],\n \"8971\": [0.35001, 0.85, 0, 0, 0.47222],\n \"9168\": [-0.00099, 0.601, 0, 0, 0.66667],\n \"10216\": [0.35001, 0.85, 0, 0, 0.47222],\n \"10217\": [0.35001, 0.85, 0, 0, 0.47222],\n \"10752\": [0.25001, 0.75, 0, 0, 1.11111],\n \"10753\": [0.25001, 0.75, 0, 0, 1.11111],\n \"10754\": [0.25001, 0.75, 0, 0, 1.11111],\n \"10756\": [0.25001, 0.75, 0, 0, 0.83334],\n \"10758\": [0.25001, 0.75, 0, 0, 0.83334]\n },\n \"Size2-Regular\": {\n \"32\": [0, 0, 0, 0, 0.25],\n \"40\": [0.65002, 1.15, 0, 0, 0.59722],\n \"41\": [0.65002, 1.15, 0, 0, 0.59722],\n \"47\": [0.65002, 1.15, 0, 0, 0.81111],\n \"91\": [0.65002, 1.15, 0, 0, 0.47222],\n \"92\": [0.65002, 1.15, 0, 0, 0.81111],\n \"93\": [0.65002, 1.15, 0, 0, 0.47222],\n \"123\": [0.65002, 1.15, 0, 0, 0.66667],\n \"125\": [0.65002, 1.15, 0, 0, 0.66667],\n \"160\": [0, 0, 0, 0, 0.25],\n \"710\": [0, 0.75, 0, 0, 1.0],\n \"732\": [0, 0.75, 0, 0, 1.0],\n \"770\": [0, 0.75, 0, 0, 1.0],\n \"771\": [0, 0.75, 0, 0, 1.0],\n \"8719\": [0.55001, 1.05, 0, 0, 1.27778],\n \"8720\": [0.55001, 1.05, 0, 0, 1.27778],\n \"8721\": [0.55001, 1.05, 0, 0, 1.44445],\n \"8730\": [0.65002, 1.15, 0, 0, 1.0],\n \"8747\": [0.86225, 1.36, 0.44445, 0, 0.55556],\n \"8748\": [0.862, 1.36, 0.44445, 0, 0.55556],\n \"8749\": [0.862, 1.36, 0.44445, 0, 0.55556],\n \"8750\": [0.86225, 1.36, 0.44445, 0, 0.55556],\n \"8896\": [0.55001, 1.05, 0, 0, 1.11111],\n \"8897\": [0.55001, 1.05, 0, 0, 1.11111],\n \"8898\": [0.55001, 1.05, 0, 0, 1.11111],\n \"8899\": [0.55001, 1.05, 0, 0, 1.11111],\n \"8968\": [0.65002, 1.15, 0, 0, 0.52778],\n \"8969\": [0.65002, 1.15, 0, 0, 0.52778],\n \"8970\": [0.65002, 1.15, 0, 0, 0.52778],\n \"8971\": [0.65002, 1.15, 0, 0, 0.52778],\n \"10216\": [0.65002, 1.15, 0, 0, 0.61111],\n \"10217\": [0.65002, 1.15, 0, 0, 0.61111],\n \"10752\": [0.55001, 1.05, 0, 0, 1.51112],\n \"10753\": [0.55001, 1.05, 0, 0, 1.51112],\n \"10754\": [0.55001, 1.05, 0, 0, 1.51112],\n \"10756\": [0.55001, 1.05, 0, 0, 1.11111],\n \"10758\": [0.55001, 1.05, 0, 0, 1.11111]\n },\n \"Size3-Regular\": {\n \"32\": [0, 0, 0, 0, 0.25],\n \"40\": [0.95003, 1.45, 0, 0, 0.73611],\n \"41\": [0.95003, 1.45, 0, 0, 0.73611],\n \"47\": [0.95003, 1.45, 0, 0, 1.04445],\n \"91\": [0.95003, 1.45, 0, 0, 0.52778],\n \"92\": [0.95003, 1.45, 0, 0, 1.04445],\n \"93\": [0.95003, 1.45, 0, 0, 0.52778],\n \"123\": [0.95003, 1.45, 0, 0, 0.75],\n \"125\": [0.95003, 1.45, 0, 0, 0.75],\n \"160\": [0, 0, 0, 0, 0.25],\n \"710\": [0, 0.75, 0, 0, 1.44445],\n \"732\": [0, 0.75, 0, 0, 1.44445],\n \"770\": [0, 0.75, 0, 0, 1.44445],\n \"771\": [0, 0.75, 0, 0, 1.44445],\n \"8730\": [0.95003, 1.45, 0, 0, 1.0],\n \"8968\": [0.95003, 1.45, 0, 0, 0.58334],\n \"8969\": [0.95003, 1.45, 0, 0, 0.58334],\n \"8970\": [0.95003, 1.45, 0, 0, 0.58334],\n \"8971\": [0.95003, 1.45, 0, 0, 0.58334],\n \"10216\": [0.95003, 1.45, 0, 0, 0.75],\n \"10217\": [0.95003, 1.45, 0, 0, 0.75]\n },\n \"Size4-Regular\": {\n \"32\": [0, 0, 0, 0, 0.25],\n \"40\": [1.25003, 1.75, 0, 0, 0.79167],\n \"41\": [1.25003, 1.75, 0, 0, 0.79167],\n \"47\": [1.25003, 1.75, 0, 0, 1.27778],\n \"91\": [1.25003, 1.75, 0, 0, 0.58334],\n \"92\": [1.25003, 1.75, 0, 0, 1.27778],\n \"93\": [1.25003, 1.75, 0, 0, 0.58334],\n \"123\": [1.25003, 1.75, 0, 0, 0.80556],\n \"125\": [1.25003, 1.75, 0, 0, 0.80556],\n \"160\": [0, 0, 0, 0, 0.25],\n \"710\": [0, 0.825, 0, 0, 1.8889],\n \"732\": [0, 0.825, 0, 0, 1.8889],\n \"770\": [0, 0.825, 0, 0, 1.8889],\n \"771\": [0, 0.825, 0, 0, 1.8889],\n \"8730\": [1.25003, 1.75, 0, 0, 1.0],\n \"8968\": [1.25003, 1.75, 0, 0, 0.63889],\n \"8969\": [1.25003, 1.75, 0, 0, 0.63889],\n \"8970\": [1.25003, 1.75, 0, 0, 0.63889],\n \"8971\": [1.25003, 1.75, 0, 0, 0.63889],\n \"9115\": [0.64502, 1.155, 0, 0, 0.875],\n \"9116\": [1e-05, 0.6, 0, 0, 0.875],\n \"9117\": [0.64502, 1.155, 0, 0, 0.875],\n \"9118\": [0.64502, 1.155, 0, 0, 0.875],\n \"9119\": [1e-05, 0.6, 0, 0, 0.875],\n \"9120\": [0.64502, 1.155, 0, 0, 0.875],\n \"9121\": [0.64502, 1.155, 0, 0, 0.66667],\n \"9122\": [-0.00099, 0.601, 0, 0, 0.66667],\n \"9123\": [0.64502, 1.155, 0, 0, 0.66667],\n \"9124\": [0.64502, 1.155, 0, 0, 0.66667],\n \"9125\": [-0.00099, 0.601, 0, 0, 0.66667],\n \"9126\": [0.64502, 1.155, 0, 0, 0.66667],\n \"9127\": [1e-05, 0.9, 0, 0, 0.88889],\n \"9128\": [0.65002, 1.15, 0, 0, 0.88889],\n \"9129\": [0.90001, 0, 0, 0, 0.88889],\n \"9130\": [0, 0.3, 0, 0, 0.88889],\n \"9131\": [1e-05, 0.9, 0, 0, 0.88889],\n \"9132\": [0.65002, 1.15, 0, 0, 0.88889],\n \"9133\": [0.90001, 0, 0, 0, 0.88889],\n \"9143\": [0.88502, 0.915, 0, 0, 1.05556],\n \"10216\": [1.25003, 1.75, 0, 0, 0.80556],\n \"10217\": [1.25003, 1.75, 0, 0, 0.80556],\n \"57344\": [-0.00499, 0.605, 0, 0, 1.05556],\n \"57345\": [-0.00499, 0.605, 0, 0, 1.05556],\n \"57680\": [0, 0.12, 0, 0, 0.45],\n \"57681\": [0, 0.12, 0, 0, 0.45],\n \"57682\": [0, 0.12, 0, 0, 0.45],\n \"57683\": [0, 0.12, 0, 0, 0.45]\n },\n \"Typewriter-Regular\": {\n \"32\": [0, 0, 0, 0, 0.525],\n \"33\": [0, 0.61111, 0, 0, 0.525],\n \"34\": [0, 0.61111, 0, 0, 0.525],\n \"35\": [0, 0.61111, 0, 0, 0.525],\n \"36\": [0.08333, 0.69444, 0, 0, 0.525],\n \"37\": [0.08333, 0.69444, 0, 0, 0.525],\n \"38\": [0, 0.61111, 0, 0, 0.525],\n \"39\": [0, 0.61111, 0, 0, 0.525],\n \"40\": [0.08333, 0.69444, 0, 0, 0.525],\n \"41\": [0.08333, 0.69444, 0, 0, 0.525],\n \"42\": [0, 0.52083, 0, 0, 0.525],\n \"43\": [-0.08056, 0.53055, 0, 0, 0.525],\n \"44\": [0.13889, 0.125, 0, 0, 0.525],\n \"45\": [-0.08056, 0.53055, 0, 0, 0.525],\n \"46\": [0, 0.125, 0, 0, 0.525],\n \"47\": [0.08333, 0.69444, 0, 0, 0.525],\n \"48\": [0, 0.61111, 0, 0, 0.525],\n \"49\": [0, 0.61111, 0, 0, 0.525],\n \"50\": [0, 0.61111, 0, 0, 0.525],\n \"51\": [0, 0.61111, 0, 0, 0.525],\n \"52\": [0, 0.61111, 0, 0, 0.525],\n \"53\": [0, 0.61111, 0, 0, 0.525],\n \"54\": [0, 0.61111, 0, 0, 0.525],\n \"55\": [0, 0.61111, 0, 0, 0.525],\n \"56\": [0, 0.61111, 0, 0, 0.525],\n \"57\": [0, 0.61111, 0, 0, 0.525],\n \"58\": [0, 0.43056, 0, 0, 0.525],\n \"59\": [0.13889, 0.43056, 0, 0, 0.525],\n \"60\": [-0.05556, 0.55556, 0, 0, 0.525],\n \"61\": [-0.19549, 0.41562, 0, 0, 0.525],\n \"62\": [-0.05556, 0.55556, 0, 0, 0.525],\n \"63\": [0, 0.61111, 0, 0, 0.525],\n \"64\": [0, 0.61111, 0, 0, 0.525],\n \"65\": [0, 0.61111, 0, 0, 0.525],\n \"66\": [0, 0.61111, 0, 0, 0.525],\n \"67\": [0, 0.61111, 0, 0, 0.525],\n \"68\": [0, 0.61111, 0, 0, 0.525],\n \"69\": [0, 0.61111, 0, 0, 0.525],\n \"70\": [0, 0.61111, 0, 0, 0.525],\n \"71\": [0, 0.61111, 0, 0, 0.525],\n \"72\": [0, 0.61111, 0, 0, 0.525],\n \"73\": [0, 0.61111, 0, 0, 0.525],\n \"74\": [0, 0.61111, 0, 0, 0.525],\n \"75\": [0, 0.61111, 0, 0, 0.525],\n \"76\": [0, 0.61111, 0, 0, 0.525],\n \"77\": [0, 0.61111, 0, 0, 0.525],\n \"78\": [0, 0.61111, 0, 0, 0.525],\n \"79\": [0, 0.61111, 0, 0, 0.525],\n \"80\": [0, 0.61111, 0, 0, 0.525],\n \"81\": [0.13889, 0.61111, 0, 0, 0.525],\n \"82\": [0, 0.61111, 0, 0, 0.525],\n \"83\": [0, 0.61111, 0, 0, 0.525],\n \"84\": [0, 0.61111, 0, 0, 0.525],\n \"85\": [0, 0.61111, 0, 0, 0.525],\n \"86\": [0, 0.61111, 0, 0, 0.525],\n \"87\": [0, 0.61111, 0, 0, 0.525],\n \"88\": [0, 0.61111, 0, 0, 0.525],\n \"89\": [0, 0.61111, 0, 0, 0.525],\n \"90\": [0, 0.61111, 0, 0, 0.525],\n \"91\": [0.08333, 0.69444, 0, 0, 0.525],\n \"92\": [0.08333, 0.69444, 0, 0, 0.525],\n \"93\": [0.08333, 0.69444, 0, 0, 0.525],\n \"94\": [0, 0.61111, 0, 0, 0.525],\n \"95\": [0.09514, 0, 0, 0, 0.525],\n \"96\": [0, 0.61111, 0, 0, 0.525],\n \"97\": [0, 0.43056, 0, 0, 0.525],\n \"98\": [0, 0.61111, 0, 0, 0.525],\n \"99\": [0, 0.43056, 0, 0, 0.525],\n \"100\": [0, 0.61111, 0, 0, 0.525],\n \"101\": [0, 0.43056, 0, 0, 0.525],\n \"102\": [0, 0.61111, 0, 0, 0.525],\n \"103\": [0.22222, 0.43056, 0, 0, 0.525],\n \"104\": [0, 0.61111, 0, 0, 0.525],\n \"105\": [0, 0.61111, 0, 0, 0.525],\n \"106\": [0.22222, 0.61111, 0, 0, 0.525],\n \"107\": [0, 0.61111, 0, 0, 0.525],\n \"108\": [0, 0.61111, 0, 0, 0.525],\n \"109\": [0, 0.43056, 0, 0, 0.525],\n \"110\": [0, 0.43056, 0, 0, 0.525],\n \"111\": [0, 0.43056, 0, 0, 0.525],\n \"112\": [0.22222, 0.43056, 0, 0, 0.525],\n \"113\": [0.22222, 0.43056, 0, 0, 0.525],\n \"114\": [0, 0.43056, 0, 0, 0.525],\n \"115\": [0, 0.43056, 0, 0, 0.525],\n \"116\": [0, 0.55358, 0, 0, 0.525],\n \"117\": [0, 0.43056, 0, 0, 0.525],\n \"118\": [0, 0.43056, 0, 0, 0.525],\n \"119\": [0, 0.43056, 0, 0, 0.525],\n \"120\": [0, 0.43056, 0, 0, 0.525],\n \"121\": [0.22222, 0.43056, 0, 0, 0.525],\n \"122\": [0, 0.43056, 0, 0, 0.525],\n \"123\": [0.08333, 0.69444, 0, 0, 0.525],\n \"124\": [0.08333, 0.69444, 0, 0, 0.525],\n \"125\": [0.08333, 0.69444, 0, 0, 0.525],\n \"126\": [0, 0.61111, 0, 0, 0.525],\n \"127\": [0, 0.61111, 0, 0, 0.525],\n \"160\": [0, 0, 0, 0, 0.525],\n \"176\": [0, 0.61111, 0, 0, 0.525],\n \"184\": [0.19445, 0, 0, 0, 0.525],\n \"305\": [0, 0.43056, 0, 0, 0.525],\n \"567\": [0.22222, 0.43056, 0, 0, 0.525],\n \"711\": [0, 0.56597, 0, 0, 0.525],\n \"713\": [0, 0.56555, 0, 0, 0.525],\n \"714\": [0, 0.61111, 0, 0, 0.525],\n \"715\": [0, 0.61111, 0, 0, 0.525],\n \"728\": [0, 0.61111, 0, 0, 0.525],\n \"730\": [0, 0.61111, 0, 0, 0.525],\n \"770\": [0, 0.61111, 0, 0, 0.525],\n \"771\": [0, 0.61111, 0, 0, 0.525],\n \"776\": [0, 0.61111, 0, 0, 0.525],\n \"915\": [0, 0.61111, 0, 0, 0.525],\n \"916\": [0, 0.61111, 0, 0, 0.525],\n \"920\": [0, 0.61111, 0, 0, 0.525],\n \"923\": [0, 0.61111, 0, 0, 0.525],\n \"926\": [0, 0.61111, 0, 0, 0.525],\n \"928\": [0, 0.61111, 0, 0, 0.525],\n \"931\": [0, 0.61111, 0, 0, 0.525],\n \"933\": [0, 0.61111, 0, 0, 0.525],\n \"934\": [0, 0.61111, 0, 0, 0.525],\n \"936\": [0, 0.61111, 0, 0, 0.525],\n \"937\": [0, 0.61111, 0, 0, 0.525],\n \"8216\": [0, 0.61111, 0, 0, 0.525],\n \"8217\": [0, 0.61111, 0, 0, 0.525],\n \"8242\": [0, 0.61111, 0, 0, 0.525],\n \"9251\": [0.11111, 0.21944, 0, 0, 0.525]\n }\n};\n\n/**\n * This file contains metrics regarding fonts and individual symbols. The sigma\n * and xi variables, as well as the metricMap map contain data extracted from\n * TeX, TeX font metrics, and the TTF files. These data are then exposed via the\n * `metrics` variable and the getCharacterMetrics function.\n */\n// In TeX, there are actually three sets of dimensions, one for each of\n// textstyle (size index 5 and higher: >=9pt), scriptstyle (size index 3 and 4:\n// 7-8pt), and scriptscriptstyle (size index 1 and 2: 5-6pt). These are\n// provided in the arrays below, in that order.\n//\n// The font metrics are stored in fonts cmsy10, cmsy7, and cmsy5 respectively.\n// This was determined by running the following script:\n//\n// latex -interaction=nonstopmode \\\n// '\\documentclass{article}\\usepackage{amsmath}\\begin{document}' \\\n// '$a$ \\expandafter\\show\\the\\textfont2' \\\n// '\\expandafter\\show\\the\\scriptfont2' \\\n// '\\expandafter\\show\\the\\scriptscriptfont2' \\\n// '\\stop'\n//\n// The metrics themselves were retrieved using the following commands:\n//\n// tftopl cmsy10\n// tftopl cmsy7\n// tftopl cmsy5\n//\n// The output of each of these commands is quite lengthy. The only part we\n// care about is the FONTDIMEN section. Each value is measured in EMs.\nvar sigmasAndXis = {\n slant: [0.250, 0.250, 0.250],\n // sigma1\n space: [0.000, 0.000, 0.000],\n // sigma2\n stretch: [0.000, 0.000, 0.000],\n // sigma3\n shrink: [0.000, 0.000, 0.000],\n // sigma4\n xHeight: [0.431, 0.431, 0.431],\n // sigma5\n quad: [1.000, 1.171, 1.472],\n // sigma6\n extraSpace: [0.000, 0.000, 0.000],\n // sigma7\n num1: [0.677, 0.732, 0.925],\n // sigma8\n num2: [0.394, 0.384, 0.387],\n // sigma9\n num3: [0.444, 0.471, 0.504],\n // sigma10\n denom1: [0.686, 0.752, 1.025],\n // sigma11\n denom2: [0.345, 0.344, 0.532],\n // sigma12\n sup1: [0.413, 0.503, 0.504],\n // sigma13\n sup2: [0.363, 0.431, 0.404],\n // sigma14\n sup3: [0.289, 0.286, 0.294],\n // sigma15\n sub1: [0.150, 0.143, 0.200],\n // sigma16\n sub2: [0.247, 0.286, 0.400],\n // sigma17\n supDrop: [0.386, 0.353, 0.494],\n // sigma18\n subDrop: [0.050, 0.071, 0.100],\n // sigma19\n delim1: [2.390, 1.700, 1.980],\n // sigma20\n delim2: [1.010, 1.157, 1.420],\n // sigma21\n axisHeight: [0.250, 0.250, 0.250],\n // sigma22\n // These font metrics are extracted from TeX by using tftopl on cmex10.tfm;\n // they correspond to the font parameters of the extension fonts (family 3).\n // See the TeXbook, page 441. In AMSTeX, the extension fonts scale; to\n // match cmex7, we'd use cmex7.tfm values for script and scriptscript\n // values.\n defaultRuleThickness: [0.04, 0.049, 0.049],\n // xi8; cmex7: 0.049\n bigOpSpacing1: [0.111, 0.111, 0.111],\n // xi9\n bigOpSpacing2: [0.166, 0.166, 0.166],\n // xi10\n bigOpSpacing3: [0.2, 0.2, 0.2],\n // xi11\n bigOpSpacing4: [0.6, 0.611, 0.611],\n // xi12; cmex7: 0.611\n bigOpSpacing5: [0.1, 0.143, 0.143],\n // xi13; cmex7: 0.143\n // The \\sqrt rule width is taken from the height of the surd character.\n // Since we use the same font at all sizes, this thickness doesn't scale.\n sqrtRuleThickness: [0.04, 0.04, 0.04],\n // This value determines how large a pt is, for metrics which are defined\n // in terms of pts.\n // This value is also used in katex.scss; if you change it make sure the\n // values match.\n ptPerEm: [10.0, 10.0, 10.0],\n // The space between adjacent `|` columns in an array definition. From\n // `\\showthe\\doublerulesep` in LaTeX. Equals 2.0 / ptPerEm.\n doubleRuleSep: [0.2, 0.2, 0.2],\n // The width of separator lines in {array} environments. From\n // `\\showthe\\arrayrulewidth` in LaTeX. Equals 0.4 / ptPerEm.\n arrayRuleWidth: [0.04, 0.04, 0.04],\n // Two values from LaTeX source2e:\n fboxsep: [0.3, 0.3, 0.3],\n // 3 pt / ptPerEm\n fboxrule: [0.04, 0.04, 0.04] // 0.4 pt / ptPerEm\n\n}; // This map contains a mapping from font name and character code to character\n// should have Latin-1 and Cyrillic characters, but may not depending on the\n// operating system. The metrics do not account for extra height from the\n// accents. In the case of Cyrillic characters which have both ascenders and\n// descenders we prefer approximations with ascenders, primarily to prevent\n// the fraction bar or root line from intersecting the glyph.\n// TODO(kevinb) allow union of multiple glyph metrics for better accuracy.\n\nvar extraCharacterMap = {\n // Latin-1\n 'Å': 'A',\n 'Ð': 'D',\n 'Þ': 'o',\n 'å': 'a',\n 'ð': 'd',\n 'þ': 'o',\n // Cyrillic\n 'А': 'A',\n 'Б': 'B',\n 'В': 'B',\n 'Г': 'F',\n 'Д': 'A',\n 'Е': 'E',\n 'Ж': 'K',\n 'З': '3',\n 'И': 'N',\n 'Й': 'N',\n 'К': 'K',\n 'Л': 'N',\n 'М': 'M',\n 'Н': 'H',\n 'О': 'O',\n 'П': 'N',\n 'Р': 'P',\n 'С': 'C',\n 'Т': 'T',\n 'У': 'y',\n 'Ф': 'O',\n 'Х': 'X',\n 'Ц': 'U',\n 'Ч': 'h',\n 'Ш': 'W',\n 'Щ': 'W',\n 'Ъ': 'B',\n 'Ы': 'X',\n 'Ь': 'B',\n 'Э': '3',\n 'Ю': 'X',\n 'Я': 'R',\n 'а': 'a',\n 'б': 'b',\n 'в': 'a',\n 'г': 'r',\n 'д': 'y',\n 'е': 'e',\n 'ж': 'm',\n 'з': 'e',\n 'и': 'n',\n 'й': 'n',\n 'к': 'n',\n 'л': 'n',\n 'м': 'm',\n 'н': 'n',\n 'о': 'o',\n 'п': 'n',\n 'р': 'p',\n 'с': 'c',\n 'т': 'o',\n 'у': 'y',\n 'ф': 'b',\n 'х': 'x',\n 'ц': 'n',\n 'ч': 'n',\n 'ш': 'w',\n 'щ': 'w',\n 'ъ': 'a',\n 'ы': 'm',\n 'ь': 'a',\n 'э': 'e',\n 'ю': 'm',\n 'я': 'r'\n};\n\n/**\n * This function adds new font metrics to default metricMap\n * It can also override existing metrics\n */\nfunction setFontMetrics(fontName, metrics) {\n fontMetricsData[fontName] = metrics;\n}\n/**\n * This function is a convenience function for looking up information in the\n * metricMap table. It takes a character as a string, and a font.\n *\n * Note: the `width` property may be undefined if fontMetricsData.js wasn't\n * built using `Make extended_metrics`.\n */\n\nfunction getCharacterMetrics(character, font, mode) {\n if (!fontMetricsData[font]) {\n throw new Error(\"Font metrics not found for font: \" + font + \".\");\n }\n\n var ch = character.charCodeAt(0);\n var metrics = fontMetricsData[font][ch];\n\n if (!metrics && character[0] in extraCharacterMap) {\n ch = extraCharacterMap[character[0]].charCodeAt(0);\n metrics = fontMetricsData[font][ch];\n }\n\n if (!metrics && mode === 'text') {\n // We don't typically have font metrics for Asian scripts.\n // But since we support them in text mode, we need to return\n // some sort of metrics.\n // So if the character is in a script we support but we\n // don't have metrics for it, just use the metrics for\n // the Latin capital letter M. This is close enough because\n // we (currently) only care about the height of the glyph\n // not its width.\n if (supportedCodepoint(ch)) {\n metrics = fontMetricsData[font][77]; // 77 is the charcode for 'M'\n }\n }\n\n if (metrics) {\n return {\n depth: metrics[0],\n height: metrics[1],\n italic: metrics[2],\n skew: metrics[3],\n width: metrics[4]\n };\n }\n}\nvar fontMetricsBySizeIndex = {};\n/**\n * Get the font metrics for a given size.\n */\n\nfunction getGlobalMetrics(size) {\n var sizeIndex;\n\n if (size >= 5) {\n sizeIndex = 0;\n } else if (size >= 3) {\n sizeIndex = 1;\n } else {\n sizeIndex = 2;\n }\n\n if (!fontMetricsBySizeIndex[sizeIndex]) {\n var metrics = fontMetricsBySizeIndex[sizeIndex] = {\n cssEmPerMu: sigmasAndXis.quad[sizeIndex] / 18\n };\n\n for (var key in sigmasAndXis) {\n if (sigmasAndXis.hasOwnProperty(key)) {\n metrics[key] = sigmasAndXis[key][sizeIndex];\n }\n }\n }\n\n return fontMetricsBySizeIndex[sizeIndex];\n}\n\n/**\n * This file contains information about the options that the Parser carries\n * around with it while parsing. Data is held in an `Options` object, and when\n * recursing, a new `Options` object can be created with the `.with*` and\n * `.reset` functions.\n */\nvar sizeStyleMap = [// Each element contains [textsize, scriptsize, scriptscriptsize].\n// The size mappings are taken from TeX with \\normalsize=10pt.\n[1, 1, 1], // size1: [5, 5, 5] \\tiny\n[2, 1, 1], // size2: [6, 5, 5]\n[3, 1, 1], // size3: [7, 5, 5] \\scriptsize\n[4, 2, 1], // size4: [8, 6, 5] \\footnotesize\n[5, 2, 1], // size5: [9, 6, 5] \\small\n[6, 3, 1], // size6: [10, 7, 5] \\normalsize\n[7, 4, 2], // size7: [12, 8, 6] \\large\n[8, 6, 3], // size8: [14.4, 10, 7] \\Large\n[9, 7, 6], // size9: [17.28, 12, 10] \\LARGE\n[10, 8, 7], // size10: [20.74, 14.4, 12] \\huge\n[11, 10, 9] // size11: [24.88, 20.74, 17.28] \\HUGE\n];\nvar sizeMultipliers = [// fontMetrics.js:getGlobalMetrics also uses size indexes, so if\n// you change size indexes, change that function.\n0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.2, 1.44, 1.728, 2.074, 2.488];\n\nvar sizeAtStyle = function sizeAtStyle(size, style) {\n return style.size < 2 ? size : sizeStyleMap[size - 1][style.size - 1];\n}; // In these types, \"\" (empty string) means \"no change\".\n\n\n/**\n * This is the main options class. It contains the current style, size, color,\n * and font.\n *\n * Options objects should not be modified. To create a new Options with\n * different properties, call a `.having*` method.\n */\nclass Options {\n // A font family applies to a group of fonts (i.e. SansSerif), while a font\n // represents a specific font (i.e. SansSerif Bold).\n // See: https://tex.stackexchange.com/questions/22350/difference-between-textrm-and-mathrm\n\n /**\n * The base size index.\n */\n constructor(data) {\n this.style = void 0;\n this.color = void 0;\n this.size = void 0;\n this.textSize = void 0;\n this.phantom = void 0;\n this.font = void 0;\n this.fontFamily = void 0;\n this.fontWeight = void 0;\n this.fontShape = void 0;\n this.sizeMultiplier = void 0;\n this.maxSize = void 0;\n this.minRuleThickness = void 0;\n this._fontMetrics = void 0;\n this.style = data.style;\n this.color = data.color;\n this.size = data.size || Options.BASESIZE;\n this.textSize = data.textSize || this.size;\n this.phantom = !!data.phantom;\n this.font = data.font || \"\";\n this.fontFamily = data.fontFamily || \"\";\n this.fontWeight = data.fontWeight || '';\n this.fontShape = data.fontShape || '';\n this.sizeMultiplier = sizeMultipliers[this.size - 1];\n this.maxSize = data.maxSize;\n this.minRuleThickness = data.minRuleThickness;\n this._fontMetrics = undefined;\n }\n /**\n * Returns a new options object with the same properties as \"this\". Properties\n * from \"extension\" will be copied to the new options object.\n */\n\n\n extend(extension) {\n var data = {\n style: this.style,\n size: this.size,\n textSize: this.textSize,\n color: this.color,\n phantom: this.phantom,\n font: this.font,\n fontFamily: this.fontFamily,\n fontWeight: this.fontWeight,\n fontShape: this.fontShape,\n maxSize: this.maxSize,\n minRuleThickness: this.minRuleThickness\n };\n\n for (var key in extension) {\n if (extension.hasOwnProperty(key)) {\n data[key] = extension[key];\n }\n }\n\n return new Options(data);\n }\n /**\n * Return an options object with the given style. If `this.style === style`,\n * returns `this`.\n */\n\n\n havingStyle(style) {\n if (this.style === style) {\n return this;\n } else {\n return this.extend({\n style: style,\n size: sizeAtStyle(this.textSize, style)\n });\n }\n }\n /**\n * Return an options object with a cramped version of the current style. If\n * the current style is cramped, returns `this`.\n */\n\n\n havingCrampedStyle() {\n return this.havingStyle(this.style.cramp());\n }\n /**\n * Return an options object with the given size and in at least `\\textstyle`.\n * Returns `this` if appropriate.\n */\n\n\n havingSize(size) {\n if (this.size === size && this.textSize === size) {\n return this;\n } else {\n return this.extend({\n style: this.style.text(),\n size: size,\n textSize: size,\n sizeMultiplier: sizeMultipliers[size - 1]\n });\n }\n }\n /**\n * Like `this.havingSize(BASESIZE).havingStyle(style)`. If `style` is omitted,\n * changes to at least `\\textstyle`.\n */\n\n\n havingBaseStyle(style) {\n style = style || this.style.text();\n var wantSize = sizeAtStyle(Options.BASESIZE, style);\n\n if (this.size === wantSize && this.textSize === Options.BASESIZE && this.style === style) {\n return this;\n } else {\n return this.extend({\n style: style,\n size: wantSize\n });\n }\n }\n /**\n * Remove the effect of sizing changes such as \\Huge.\n * Keep the effect of the current style, such as \\scriptstyle.\n */\n\n\n havingBaseSizing() {\n var size;\n\n switch (this.style.id) {\n case 4:\n case 5:\n size = 3; // normalsize in scriptstyle\n\n break;\n\n case 6:\n case 7:\n size = 1; // normalsize in scriptscriptstyle\n\n break;\n\n default:\n size = 6;\n // normalsize in textstyle or displaystyle\n }\n\n return this.extend({\n style: this.style.text(),\n size: size\n });\n }\n /**\n * Create a new options object with the given color.\n */\n\n\n withColor(color) {\n return this.extend({\n color: color\n });\n }\n /**\n * Create a new options object with \"phantom\" set to true.\n */\n\n\n withPhantom() {\n return this.extend({\n phantom: true\n });\n }\n /**\n * Creates a new options object with the given math font or old text font.\n * @type {[type]}\n */\n\n\n withFont(font) {\n return this.extend({\n font\n });\n }\n /**\n * Create a new options objects with the given fontFamily.\n */\n\n\n withTextFontFamily(fontFamily) {\n return this.extend({\n fontFamily,\n font: \"\"\n });\n }\n /**\n * Creates a new options object with the given font weight\n */\n\n\n withTextFontWeight(fontWeight) {\n return this.extend({\n fontWeight,\n font: \"\"\n });\n }\n /**\n * Creates a new options object with the given font weight\n */\n\n\n withTextFontShape(fontShape) {\n return this.extend({\n fontShape,\n font: \"\"\n });\n }\n /**\n * Return the CSS sizing classes required to switch from enclosing options\n * `oldOptions` to `this`. Returns an array of classes.\n */\n\n\n sizingClasses(oldOptions) {\n if (oldOptions.size !== this.size) {\n return [\"sizing\", \"reset-size\" + oldOptions.size, \"size\" + this.size];\n } else {\n return [];\n }\n }\n /**\n * Return the CSS sizing classes required to switch to the base size. Like\n * `this.havingSize(BASESIZE).sizingClasses(this)`.\n */\n\n\n baseSizingClasses() {\n if (this.size !== Options.BASESIZE) {\n return [\"sizing\", \"reset-size\" + this.size, \"size\" + Options.BASESIZE];\n } else {\n return [];\n }\n }\n /**\n * Return the font metrics for this size.\n */\n\n\n fontMetrics() {\n if (!this._fontMetrics) {\n this._fontMetrics = getGlobalMetrics(this.size);\n }\n\n return this._fontMetrics;\n }\n /**\n * Gets the CSS color of the current options object\n */\n\n\n getColor() {\n if (this.phantom) {\n return \"transparent\";\n } else {\n return this.color;\n }\n }\n\n}\n\nOptions.BASESIZE = 6;\n\n/**\n * This file does conversion between units. In particular, it provides\n * calculateSize to convert other units into ems.\n */\n// Thus, multiplying a length by this number converts the length from units\n// into pts. Dividing the result by ptPerEm gives the number of ems\n// *assuming* a font size of ptPerEm (normal size, normal style).\n\nvar ptPerUnit = {\n // https://en.wikibooks.org/wiki/LaTeX/Lengths and\n // https://tex.stackexchange.com/a/8263\n \"pt\": 1,\n // TeX point\n \"mm\": 7227 / 2540,\n // millimeter\n \"cm\": 7227 / 254,\n // centimeter\n \"in\": 72.27,\n // inch\n \"bp\": 803 / 800,\n // big (PostScript) points\n \"pc\": 12,\n // pica\n \"dd\": 1238 / 1157,\n // didot\n \"cc\": 14856 / 1157,\n // cicero (12 didot)\n \"nd\": 685 / 642,\n // new didot\n \"nc\": 1370 / 107,\n // new cicero (12 new didot)\n \"sp\": 1 / 65536,\n // scaled point (TeX's internal smallest unit)\n // https://tex.stackexchange.com/a/41371\n \"px\": 803 / 800 // \\pdfpxdimen defaults to 1 bp in pdfTeX and LuaTeX\n\n}; // Dictionary of relative units, for fast validity testing.\n\nvar relativeUnit = {\n \"ex\": true,\n \"em\": true,\n \"mu\": true\n};\n\n/**\n * Determine whether the specified unit (either a string defining the unit\n * or a \"size\" parse node containing a unit field) is valid.\n */\nvar validUnit = function validUnit(unit) {\n if (typeof unit !== \"string\") {\n unit = unit.unit;\n }\n\n return unit in ptPerUnit || unit in relativeUnit || unit === \"ex\";\n};\n/*\n * Convert a \"size\" parse node (with numeric \"number\" and string \"unit\" fields,\n * as parsed by functions.js argType \"size\") into a CSS em value for the\n * current style/scale. `options` gives the current options.\n */\n\nvar calculateSize = function calculateSize(sizeValue, options) {\n var scale;\n\n if (sizeValue.unit in ptPerUnit) {\n // Absolute units\n scale = ptPerUnit[sizeValue.unit] // Convert unit to pt\n / options.fontMetrics().ptPerEm // Convert pt to CSS em\n / options.sizeMultiplier; // Unscale to make absolute units\n } else if (sizeValue.unit === \"mu\") {\n // `mu` units scale with scriptstyle/scriptscriptstyle.\n scale = options.fontMetrics().cssEmPerMu;\n } else {\n // Other relative units always refer to the *textstyle* font\n // in the current size.\n var unitOptions;\n\n if (options.style.isTight()) {\n // isTight() means current style is script/scriptscript.\n unitOptions = options.havingStyle(options.style.text());\n } else {\n unitOptions = options;\n } // TODO: In TeX these units are relative to the quad of the current\n // *text* font, e.g. cmr10. KaTeX instead uses values from the\n // comparably-sized *Computer Modern symbol* font. At 10pt, these\n // match. At 7pt and 5pt, they differ: cmr7=1.138894, cmsy7=1.170641;\n // cmr5=1.361133, cmsy5=1.472241. Consider $\\scriptsize a\\kern1emb$.\n // TeX \\showlists shows a kern of 1.13889 * fontsize;\n // KaTeX shows a kern of 1.171 * fontsize.\n\n\n if (sizeValue.unit === \"ex\") {\n scale = unitOptions.fontMetrics().xHeight;\n } else if (sizeValue.unit === \"em\") {\n scale = unitOptions.fontMetrics().quad;\n } else {\n throw new ParseError(\"Invalid unit: '\" + sizeValue.unit + \"'\");\n }\n\n if (unitOptions !== options) {\n scale *= unitOptions.sizeMultiplier / options.sizeMultiplier;\n }\n }\n\n return Math.min(sizeValue.number * scale, options.maxSize);\n};\n/**\n * Round `n` to 4 decimal places, or to the nearest 1/10,000th em. See\n * https://github.com/KaTeX/KaTeX/pull/2460.\n */\n\nvar makeEm = function makeEm(n) {\n return +n.toFixed(4) + \"em\";\n};\n\n/**\n * These objects store the data about the DOM nodes we create, as well as some\n * extra data. They can then be transformed into real DOM nodes with the\n * `toNode` function or HTML markup using `toMarkup`. They are useful for both\n * storing extra properties on the nodes, as well as providing a way to easily\n * work with the DOM.\n *\n * Similar functions for working with MathML nodes exist in mathMLTree.js.\n *\n * TODO: refactor `span` and `anchor` into common superclass when\n * target environments support class inheritance\n */\n\n/**\n * Create an HTML className based on a list of classes. In addition to joining\n * with spaces, we also remove empty classes.\n */\nvar createClass = function createClass(classes) {\n return classes.filter(cls => cls).join(\" \");\n};\n\nvar initNode = function initNode(classes, options, style) {\n this.classes = classes || [];\n this.attributes = {};\n this.height = 0;\n this.depth = 0;\n this.maxFontSize = 0;\n this.style = style || {};\n\n if (options) {\n if (options.style.isTight()) {\n this.classes.push(\"mtight\");\n }\n\n var color = options.getColor();\n\n if (color) {\n this.style.color = color;\n }\n }\n};\n/**\n * Convert into an HTML node\n */\n\n\nvar toNode = function toNode(tagName) {\n var node = document.createElement(tagName); // Apply the class\n\n node.className = createClass(this.classes); // Apply inline styles\n\n for (var style in this.style) {\n if (this.style.hasOwnProperty(style)) {\n // $FlowFixMe Flow doesn't seem to understand span.style's type.\n node.style[style] = this.style[style];\n }\n } // Apply attributes\n\n\n for (var attr in this.attributes) {\n if (this.attributes.hasOwnProperty(attr)) {\n node.setAttribute(attr, this.attributes[attr]);\n }\n } // Append the children, also as HTML nodes\n\n\n for (var i = 0; i < this.children.length; i++) {\n node.appendChild(this.children[i].toNode());\n }\n\n return node;\n};\n/**\n * https://w3c.github.io/html-reference/syntax.html#syntax-attributes\n *\n * > Attribute Names must consist of one or more characters\n * other than the space characters, U+0000 NULL,\n * '\"', \"'\", \">\", \"/\", \"=\", the control characters,\n * and any characters that are not defined by Unicode.\n */\n\n\nvar invalidAttributeNameRegex = /[\\s\"'>/=\\x00-\\x1f]/;\n/**\n * Convert into an HTML markup string\n */\n\nvar toMarkup = function toMarkup(tagName) {\n var markup = \"<\" + tagName; // Add the class\n\n if (this.classes.length) {\n markup += \" class=\\\"\" + utils.escape(createClass(this.classes)) + \"\\\"\";\n }\n\n var styles = \"\"; // Add the styles, after hyphenation\n\n for (var style in this.style) {\n if (this.style.hasOwnProperty(style)) {\n styles += utils.hyphenate(style) + \":\" + this.style[style] + \";\";\n }\n }\n\n if (styles) {\n markup += \" style=\\\"\" + utils.escape(styles) + \"\\\"\";\n } // Add the attributes\n\n\n for (var attr in this.attributes) {\n if (this.attributes.hasOwnProperty(attr)) {\n if (invalidAttributeNameRegex.test(attr)) {\n throw new ParseError(\"Invalid attribute name '\" + attr + \"'\");\n }\n\n markup += \" \" + attr + \"=\\\"\" + utils.escape(this.attributes[attr]) + \"\\\"\";\n }\n }\n\n markup += \">\"; // Add the markup of the children, also as markup\n\n for (var i = 0; i < this.children.length; i++) {\n markup += this.children[i].toMarkup();\n }\n\n markup += \"\";\n return markup;\n}; // Making the type below exact with all optional fields doesn't work due to\n// - https://github.com/facebook/flow/issues/4582\n// - https://github.com/facebook/flow/issues/5688\n// However, since *all* fields are optional, $Shape<> works as suggested in 5688\n// above.\n// This type does not include all CSS properties. Additional properties should\n// be added as needed.\n\n\n/**\n * This node represents a span node, with a className, a list of children, and\n * an inline style. It also contains information about its height, depth, and\n * maxFontSize.\n *\n * Represents two types with different uses: SvgSpan to wrap an SVG and DomSpan\n * otherwise. This typesafety is important when HTML builders access a span's\n * children.\n */\nclass Span {\n constructor(classes, children, options, style) {\n this.children = void 0;\n this.attributes = void 0;\n this.classes = void 0;\n this.height = void 0;\n this.depth = void 0;\n this.width = void 0;\n this.maxFontSize = void 0;\n this.style = void 0;\n initNode.call(this, classes, options, style);\n this.children = children || [];\n }\n /**\n * Sets an arbitrary attribute on the span. Warning: use this wisely. Not\n * all browsers support attributes the same, and having too many custom\n * attributes is probably bad.\n */\n\n\n setAttribute(attribute, value) {\n this.attributes[attribute] = value;\n }\n\n hasClass(className) {\n return utils.contains(this.classes, className);\n }\n\n toNode() {\n return toNode.call(this, \"span\");\n }\n\n toMarkup() {\n return toMarkup.call(this, \"span\");\n }\n\n}\n/**\n * This node represents an anchor (
) element with a hyperlink. See `span`\n * for further details.\n */\n\nclass Anchor {\n constructor(href, classes, children, options) {\n this.children = void 0;\n this.attributes = void 0;\n this.classes = void 0;\n this.height = void 0;\n this.depth = void 0;\n this.maxFontSize = void 0;\n this.style = void 0;\n initNode.call(this, classes, options);\n this.children = children || [];\n this.setAttribute('href', href);\n }\n\n setAttribute(attribute, value) {\n this.attributes[attribute] = value;\n }\n\n hasClass(className) {\n return utils.contains(this.classes, className);\n }\n\n toNode() {\n return toNode.call(this, \"a\");\n }\n\n toMarkup() {\n return toMarkup.call(this, \"a\");\n }\n\n}\n/**\n * This node represents an image embed () element.\n */\n\nclass Img {\n constructor(src, alt, style) {\n this.src = void 0;\n this.alt = void 0;\n this.classes = void 0;\n this.height = void 0;\n this.depth = void 0;\n this.maxFontSize = void 0;\n this.style = void 0;\n this.alt = alt;\n this.src = src;\n this.classes = [\"mord\"];\n this.style = style;\n }\n\n hasClass(className) {\n return utils.contains(this.classes, className);\n }\n\n toNode() {\n var node = document.createElement(\"img\");\n node.src = this.src;\n node.alt = this.alt;\n node.className = \"mord\"; // Apply inline styles\n\n for (var style in this.style) {\n if (this.style.hasOwnProperty(style)) {\n // $FlowFixMe\n node.style[style] = this.style[style];\n }\n }\n\n return node;\n }\n\n toMarkup() {\n var markup = \"\\\"\"\";\n return markup;\n }\n\n}\nvar iCombinations = {\n 'î': '\\u0131\\u0302',\n 'ï': '\\u0131\\u0308',\n 'í': '\\u0131\\u0301',\n // 'ī': '\\u0131\\u0304', // enable when we add Extended Latin\n 'ì': '\\u0131\\u0300'\n};\n/**\n * A symbol node contains information about a single symbol. It either renders\n * to a single text node, or a span with a single text node in it, depending on\n * whether it has CSS classes, styles, or needs italic correction.\n */\n\nclass SymbolNode {\n constructor(text, height, depth, italic, skew, width, classes, style) {\n this.text = void 0;\n this.height = void 0;\n this.depth = void 0;\n this.italic = void 0;\n this.skew = void 0;\n this.width = void 0;\n this.maxFontSize = void 0;\n this.classes = void 0;\n this.style = void 0;\n this.text = text;\n this.height = height || 0;\n this.depth = depth || 0;\n this.italic = italic || 0;\n this.skew = skew || 0;\n this.width = width || 0;\n this.classes = classes || [];\n this.style = style || {};\n this.maxFontSize = 0; // Mark text from non-Latin scripts with specific classes so that we\n // can specify which fonts to use. This allows us to render these\n // characters with a serif font in situations where the browser would\n // either default to a sans serif or render a placeholder character.\n // We use CSS class names like cjk_fallback, hangul_fallback and\n // brahmic_fallback. See ./unicodeScripts.js for the set of possible\n // script names\n\n var script = scriptFromCodepoint(this.text.charCodeAt(0));\n\n if (script) {\n this.classes.push(script + \"_fallback\");\n }\n\n if (/[îïíì]/.test(this.text)) {\n // add ī when we add Extended Latin\n this.text = iCombinations[this.text];\n }\n }\n\n hasClass(className) {\n return utils.contains(this.classes, className);\n }\n /**\n * Creates a text node or span from a symbol node. Note that a span is only\n * created if it is needed.\n */\n\n\n toNode() {\n var node = document.createTextNode(this.text);\n var span = null;\n\n if (this.italic > 0) {\n span = document.createElement(\"span\");\n span.style.marginRight = makeEm(this.italic);\n }\n\n if (this.classes.length > 0) {\n span = span || document.createElement(\"span\");\n span.className = createClass(this.classes);\n }\n\n for (var style in this.style) {\n if (this.style.hasOwnProperty(style)) {\n span = span || document.createElement(\"span\"); // $FlowFixMe Flow doesn't seem to understand span.style's type.\n\n span.style[style] = this.style[style];\n }\n }\n\n if (span) {\n span.appendChild(node);\n return span;\n } else {\n return node;\n }\n }\n /**\n * Creates markup for a symbol node.\n */\n\n\n toMarkup() {\n // TODO(alpert): More duplication than I'd like from\n // span.prototype.toMarkup and symbolNode.prototype.toNode...\n var needsSpan = false;\n var markup = \" 0) {\n styles += \"margin-right:\" + this.italic + \"em;\";\n }\n\n for (var style in this.style) {\n if (this.style.hasOwnProperty(style)) {\n styles += utils.hyphenate(style) + \":\" + this.style[style] + \";\";\n }\n }\n\n if (styles) {\n needsSpan = true;\n markup += \" style=\\\"\" + utils.escape(styles) + \"\\\"\";\n }\n\n var escaped = utils.escape(this.text);\n\n if (needsSpan) {\n markup += \">\";\n markup += escaped;\n markup += \"\";\n return markup;\n } else {\n return escaped;\n }\n }\n\n}\n/**\n * SVG nodes are used to render stretchy wide elements.\n */\n\nclass SvgNode {\n constructor(children, attributes) {\n this.children = void 0;\n this.attributes = void 0;\n this.children = children || [];\n this.attributes = attributes || {};\n }\n\n toNode() {\n var svgNS = \"http://www.w3.org/2000/svg\";\n var node = document.createElementNS(svgNS, \"svg\"); // Apply attributes\n\n for (var attr in this.attributes) {\n if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {\n node.setAttribute(attr, this.attributes[attr]);\n }\n }\n\n for (var i = 0; i < this.children.length; i++) {\n node.appendChild(this.children[i].toNode());\n }\n\n return node;\n }\n\n toMarkup() {\n var markup = \"\";\n\n for (var i = 0; i < this.children.length; i++) {\n markup += this.children[i].toMarkup();\n }\n\n markup += \"\";\n return markup;\n }\n\n}\nclass PathNode {\n constructor(pathName, alternate) {\n this.pathName = void 0;\n this.alternate = void 0;\n this.pathName = pathName;\n this.alternate = alternate; // Used only for \\sqrt, \\phase, & tall delims\n }\n\n toNode() {\n var svgNS = \"http://www.w3.org/2000/svg\";\n var node = document.createElementNS(svgNS, \"path\");\n\n if (this.alternate) {\n node.setAttribute(\"d\", this.alternate);\n } else {\n node.setAttribute(\"d\", path[this.pathName]);\n }\n\n return node;\n }\n\n toMarkup() {\n if (this.alternate) {\n return \"\";\n } else {\n return \"\";\n }\n }\n\n}\nclass LineNode {\n constructor(attributes) {\n this.attributes = void 0;\n this.attributes = attributes || {};\n }\n\n toNode() {\n var svgNS = \"http://www.w3.org/2000/svg\";\n var node = document.createElementNS(svgNS, \"line\"); // Apply attributes\n\n for (var attr in this.attributes) {\n if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {\n node.setAttribute(attr, this.attributes[attr]);\n }\n }\n\n return node;\n }\n\n toMarkup() {\n var markup = \"\";\n return markup;\n }\n\n}\nfunction assertSymbolDomNode(group) {\n if (group instanceof SymbolNode) {\n return group;\n } else {\n throw new Error(\"Expected symbolNode but got \" + String(group) + \".\");\n }\n}\nfunction assertSpan(group) {\n if (group instanceof Span) {\n return group;\n } else {\n throw new Error(\"Expected span but got \" + String(group) + \".\");\n }\n}\n\n/**\n * This file holds a list of all no-argument functions and single-character\n * symbols (like 'a' or ';').\n *\n * For each of the symbols, there are three properties they can have:\n * - font (required): the font to be used for this symbol. Either \"main\" (the\n normal font), or \"ams\" (the ams fonts).\n * - group (required): the ParseNode group type the symbol should have (i.e.\n \"textord\", \"mathord\", etc).\n See https://github.com/KaTeX/KaTeX/wiki/Examining-TeX#group-types\n * - replace: the character that this symbol or function should be\n * replaced with (i.e. \"\\phi\" has a replace value of \"\\u03d5\", the phi\n * character in the main font).\n *\n * The outermost map in the table indicates what mode the symbols should be\n * accepted in (e.g. \"math\" or \"text\").\n */\n// Some of these have a \"-token\" suffix since these are also used as `ParseNode`\n// types for raw text tokens, and we want to avoid conflicts with higher-level\n// `ParseNode` types. These `ParseNode`s are constructed within `Parser` by\n// looking up the `symbols` map.\nvar ATOMS = {\n \"bin\": 1,\n \"close\": 1,\n \"inner\": 1,\n \"open\": 1,\n \"punct\": 1,\n \"rel\": 1\n};\nvar NON_ATOMS = {\n \"accent-token\": 1,\n \"mathord\": 1,\n \"op-token\": 1,\n \"spacing\": 1,\n \"textord\": 1\n};\nvar symbols = {\n \"math\": {},\n \"text\": {}\n};\n/** `acceptUnicodeChar = true` is only applicable if `replace` is set. */\n\nfunction defineSymbol(mode, font, group, replace, name, acceptUnicodeChar) {\n symbols[mode][name] = {\n font,\n group,\n replace\n };\n\n if (acceptUnicodeChar && replace) {\n symbols[mode][replace] = symbols[mode][name];\n }\n} // Some abbreviations for commonly used strings.\n// This helps minify the code, and also spotting typos using jshint.\n// modes:\n\nvar math = \"math\";\nvar text = \"text\"; // fonts:\n\nvar main = \"main\";\nvar ams = \"ams\"; // groups:\n\nvar accent = \"accent-token\";\nvar bin = \"bin\";\nvar close = \"close\";\nvar inner = \"inner\";\nvar mathord = \"mathord\";\nvar op = \"op-token\";\nvar open = \"open\";\nvar punct = \"punct\";\nvar rel = \"rel\";\nvar spacing = \"spacing\";\nvar textord = \"textord\"; // Now comes the symbol table\n// Relation Symbols\n\ndefineSymbol(math, main, rel, \"\\u2261\", \"\\\\equiv\", true);\ndefineSymbol(math, main, rel, \"\\u227a\", \"\\\\prec\", true);\ndefineSymbol(math, main, rel, \"\\u227b\", \"\\\\succ\", true);\ndefineSymbol(math, main, rel, \"\\u223c\", \"\\\\sim\", true);\ndefineSymbol(math, main, rel, \"\\u22a5\", \"\\\\perp\");\ndefineSymbol(math, main, rel, \"\\u2aaf\", \"\\\\preceq\", true);\ndefineSymbol(math, main, rel, \"\\u2ab0\", \"\\\\succeq\", true);\ndefineSymbol(math, main, rel, \"\\u2243\", \"\\\\simeq\", true);\ndefineSymbol(math, main, rel, \"\\u2223\", \"\\\\mid\", true);\ndefineSymbol(math, main, rel, \"\\u226a\", \"\\\\ll\", true);\ndefineSymbol(math, main, rel, \"\\u226b\", \"\\\\gg\", true);\ndefineSymbol(math, main, rel, \"\\u224d\", \"\\\\asymp\", true);\ndefineSymbol(math, main, rel, \"\\u2225\", \"\\\\parallel\");\ndefineSymbol(math, main, rel, \"\\u22c8\", \"\\\\bowtie\", true);\ndefineSymbol(math, main, rel, \"\\u2323\", \"\\\\smile\", true);\ndefineSymbol(math, main, rel, \"\\u2291\", \"\\\\sqsubseteq\", true);\ndefineSymbol(math, main, rel, \"\\u2292\", \"\\\\sqsupseteq\", true);\ndefineSymbol(math, main, rel, \"\\u2250\", \"\\\\doteq\", true);\ndefineSymbol(math, main, rel, \"\\u2322\", \"\\\\frown\", true);\ndefineSymbol(math, main, rel, \"\\u220b\", \"\\\\ni\", true);\ndefineSymbol(math, main, rel, \"\\u221d\", \"\\\\propto\", true);\ndefineSymbol(math, main, rel, \"\\u22a2\", \"\\\\vdash\", true);\ndefineSymbol(math, main, rel, \"\\u22a3\", \"\\\\dashv\", true);\ndefineSymbol(math, main, rel, \"\\u220b\", \"\\\\owns\"); // Punctuation\n\ndefineSymbol(math, main, punct, \"\\u002e\", \"\\\\ldotp\");\ndefineSymbol(math, main, punct, \"\\u22c5\", \"\\\\cdotp\"); // Misc Symbols\n\ndefineSymbol(math, main, textord, \"\\u0023\", \"\\\\#\");\ndefineSymbol(text, main, textord, \"\\u0023\", \"\\\\#\");\ndefineSymbol(math, main, textord, \"\\u0026\", \"\\\\&\");\ndefineSymbol(text, main, textord, \"\\u0026\", \"\\\\&\");\ndefineSymbol(math, main, textord, \"\\u2135\", \"\\\\aleph\", true);\ndefineSymbol(math, main, textord, \"\\u2200\", \"\\\\forall\", true);\ndefineSymbol(math, main, textord, \"\\u210f\", \"\\\\hbar\", true);\ndefineSymbol(math, main, textord, \"\\u2203\", \"\\\\exists\", true);\ndefineSymbol(math, main, textord, \"\\u2207\", \"\\\\nabla\", true);\ndefineSymbol(math, main, textord, \"\\u266d\", \"\\\\flat\", true);\ndefineSymbol(math, main, textord, \"\\u2113\", \"\\\\ell\", true);\ndefineSymbol(math, main, textord, \"\\u266e\", \"\\\\natural\", true);\ndefineSymbol(math, main, textord, \"\\u2663\", \"\\\\clubsuit\", true);\ndefineSymbol(math, main, textord, \"\\u2118\", \"\\\\wp\", true);\ndefineSymbol(math, main, textord, \"\\u266f\", \"\\\\sharp\", true);\ndefineSymbol(math, main, textord, \"\\u2662\", \"\\\\diamondsuit\", true);\ndefineSymbol(math, main, textord, \"\\u211c\", \"\\\\Re\", true);\ndefineSymbol(math, main, textord, \"\\u2661\", \"\\\\heartsuit\", true);\ndefineSymbol(math, main, textord, \"\\u2111\", \"\\\\Im\", true);\ndefineSymbol(math, main, textord, \"\\u2660\", \"\\\\spadesuit\", true);\ndefineSymbol(math, main, textord, \"\\u00a7\", \"\\\\S\", true);\ndefineSymbol(text, main, textord, \"\\u00a7\", \"\\\\S\");\ndefineSymbol(math, main, textord, \"\\u00b6\", \"\\\\P\", true);\ndefineSymbol(text, main, textord, \"\\u00b6\", \"\\\\P\"); // Math and Text\n\ndefineSymbol(math, main, textord, \"\\u2020\", \"\\\\dag\");\ndefineSymbol(text, main, textord, \"\\u2020\", \"\\\\dag\");\ndefineSymbol(text, main, textord, \"\\u2020\", \"\\\\textdagger\");\ndefineSymbol(math, main, textord, \"\\u2021\", \"\\\\ddag\");\ndefineSymbol(text, main, textord, \"\\u2021\", \"\\\\ddag\");\ndefineSymbol(text, main, textord, \"\\u2021\", \"\\\\textdaggerdbl\"); // Large Delimiters\n\ndefineSymbol(math, main, close, \"\\u23b1\", \"\\\\rmoustache\", true);\ndefineSymbol(math, main, open, \"\\u23b0\", \"\\\\lmoustache\", true);\ndefineSymbol(math, main, close, \"\\u27ef\", \"\\\\rgroup\", true);\ndefineSymbol(math, main, open, \"\\u27ee\", \"\\\\lgroup\", true); // Binary Operators\n\ndefineSymbol(math, main, bin, \"\\u2213\", \"\\\\mp\", true);\ndefineSymbol(math, main, bin, \"\\u2296\", \"\\\\ominus\", true);\ndefineSymbol(math, main, bin, \"\\u228e\", \"\\\\uplus\", true);\ndefineSymbol(math, main, bin, \"\\u2293\", \"\\\\sqcap\", true);\ndefineSymbol(math, main, bin, \"\\u2217\", \"\\\\ast\");\ndefineSymbol(math, main, bin, \"\\u2294\", \"\\\\sqcup\", true);\ndefineSymbol(math, main, bin, \"\\u25ef\", \"\\\\bigcirc\", true);\ndefineSymbol(math, main, bin, \"\\u2219\", \"\\\\bullet\", true);\ndefineSymbol(math, main, bin, \"\\u2021\", \"\\\\ddagger\");\ndefineSymbol(math, main, bin, \"\\u2240\", \"\\\\wr\", true);\ndefineSymbol(math, main, bin, \"\\u2a3f\", \"\\\\amalg\");\ndefineSymbol(math, main, bin, \"\\u0026\", \"\\\\And\"); // from amsmath\n// Arrow Symbols\n\ndefineSymbol(math, main, rel, \"\\u27f5\", \"\\\\longleftarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21d0\", \"\\\\Leftarrow\", true);\ndefineSymbol(math, main, rel, \"\\u27f8\", \"\\\\Longleftarrow\", true);\ndefineSymbol(math, main, rel, \"\\u27f6\", \"\\\\longrightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21d2\", \"\\\\Rightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u27f9\", \"\\\\Longrightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u2194\", \"\\\\leftrightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u27f7\", \"\\\\longleftrightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21d4\", \"\\\\Leftrightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u27fa\", \"\\\\Longleftrightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21a6\", \"\\\\mapsto\", true);\ndefineSymbol(math, main, rel, \"\\u27fc\", \"\\\\longmapsto\", true);\ndefineSymbol(math, main, rel, \"\\u2197\", \"\\\\nearrow\", true);\ndefineSymbol(math, main, rel, \"\\u21a9\", \"\\\\hookleftarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21aa\", \"\\\\hookrightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u2198\", \"\\\\searrow\", true);\ndefineSymbol(math, main, rel, \"\\u21bc\", \"\\\\leftharpoonup\", true);\ndefineSymbol(math, main, rel, \"\\u21c0\", \"\\\\rightharpoonup\", true);\ndefineSymbol(math, main, rel, \"\\u2199\", \"\\\\swarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21bd\", \"\\\\leftharpoondown\", true);\ndefineSymbol(math, main, rel, \"\\u21c1\", \"\\\\rightharpoondown\", true);\ndefineSymbol(math, main, rel, \"\\u2196\", \"\\\\nwarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21cc\", \"\\\\rightleftharpoons\", true); // AMS Negated Binary Relations\n\ndefineSymbol(math, ams, rel, \"\\u226e\", \"\\\\nless\", true); // Symbol names preceded by \"@\" each have a corresponding macro.\n\ndefineSymbol(math, ams, rel, \"\\ue010\", \"\\\\@nleqslant\");\ndefineSymbol(math, ams, rel, \"\\ue011\", \"\\\\@nleqq\");\ndefineSymbol(math, ams, rel, \"\\u2a87\", \"\\\\lneq\", true);\ndefineSymbol(math, ams, rel, \"\\u2268\", \"\\\\lneqq\", true);\ndefineSymbol(math, ams, rel, \"\\ue00c\", \"\\\\@lvertneqq\");\ndefineSymbol(math, ams, rel, \"\\u22e6\", \"\\\\lnsim\", true);\ndefineSymbol(math, ams, rel, \"\\u2a89\", \"\\\\lnapprox\", true);\ndefineSymbol(math, ams, rel, \"\\u2280\", \"\\\\nprec\", true); // unicode-math maps \\u22e0 to \\npreccurlyeq. We'll use the AMS synonym.\n\ndefineSymbol(math, ams, rel, \"\\u22e0\", \"\\\\npreceq\", true);\ndefineSymbol(math, ams, rel, \"\\u22e8\", \"\\\\precnsim\", true);\ndefineSymbol(math, ams, rel, \"\\u2ab9\", \"\\\\precnapprox\", true);\ndefineSymbol(math, ams, rel, \"\\u2241\", \"\\\\nsim\", true);\ndefineSymbol(math, ams, rel, \"\\ue006\", \"\\\\@nshortmid\");\ndefineSymbol(math, ams, rel, \"\\u2224\", \"\\\\nmid\", true);\ndefineSymbol(math, ams, rel, \"\\u22ac\", \"\\\\nvdash\", true);\ndefineSymbol(math, ams, rel, \"\\u22ad\", \"\\\\nvDash\", true);\ndefineSymbol(math, ams, rel, \"\\u22ea\", \"\\\\ntriangleleft\");\ndefineSymbol(math, ams, rel, \"\\u22ec\", \"\\\\ntrianglelefteq\", true);\ndefineSymbol(math, ams, rel, \"\\u228a\", \"\\\\subsetneq\", true);\ndefineSymbol(math, ams, rel, \"\\ue01a\", \"\\\\@varsubsetneq\");\ndefineSymbol(math, ams, rel, \"\\u2acb\", \"\\\\subsetneqq\", true);\ndefineSymbol(math, ams, rel, \"\\ue017\", \"\\\\@varsubsetneqq\");\ndefineSymbol(math, ams, rel, \"\\u226f\", \"\\\\ngtr\", true);\ndefineSymbol(math, ams, rel, \"\\ue00f\", \"\\\\@ngeqslant\");\ndefineSymbol(math, ams, rel, \"\\ue00e\", \"\\\\@ngeqq\");\ndefineSymbol(math, ams, rel, \"\\u2a88\", \"\\\\gneq\", true);\ndefineSymbol(math, ams, rel, \"\\u2269\", \"\\\\gneqq\", true);\ndefineSymbol(math, ams, rel, \"\\ue00d\", \"\\\\@gvertneqq\");\ndefineSymbol(math, ams, rel, \"\\u22e7\", \"\\\\gnsim\", true);\ndefineSymbol(math, ams, rel, \"\\u2a8a\", \"\\\\gnapprox\", true);\ndefineSymbol(math, ams, rel, \"\\u2281\", \"\\\\nsucc\", true); // unicode-math maps \\u22e1 to \\nsucccurlyeq. We'll use the AMS synonym.\n\ndefineSymbol(math, ams, rel, \"\\u22e1\", \"\\\\nsucceq\", true);\ndefineSymbol(math, ams, rel, \"\\u22e9\", \"\\\\succnsim\", true);\ndefineSymbol(math, ams, rel, \"\\u2aba\", \"\\\\succnapprox\", true); // unicode-math maps \\u2246 to \\simneqq. We'll use the AMS synonym.\n\ndefineSymbol(math, ams, rel, \"\\u2246\", \"\\\\ncong\", true);\ndefineSymbol(math, ams, rel, \"\\ue007\", \"\\\\@nshortparallel\");\ndefineSymbol(math, ams, rel, \"\\u2226\", \"\\\\nparallel\", true);\ndefineSymbol(math, ams, rel, \"\\u22af\", \"\\\\nVDash\", true);\ndefineSymbol(math, ams, rel, \"\\u22eb\", \"\\\\ntriangleright\");\ndefineSymbol(math, ams, rel, \"\\u22ed\", \"\\\\ntrianglerighteq\", true);\ndefineSymbol(math, ams, rel, \"\\ue018\", \"\\\\@nsupseteqq\");\ndefineSymbol(math, ams, rel, \"\\u228b\", \"\\\\supsetneq\", true);\ndefineSymbol(math, ams, rel, \"\\ue01b\", \"\\\\@varsupsetneq\");\ndefineSymbol(math, ams, rel, \"\\u2acc\", \"\\\\supsetneqq\", true);\ndefineSymbol(math, ams, rel, \"\\ue019\", \"\\\\@varsupsetneqq\");\ndefineSymbol(math, ams, rel, \"\\u22ae\", \"\\\\nVdash\", true);\ndefineSymbol(math, ams, rel, \"\\u2ab5\", \"\\\\precneqq\", true);\ndefineSymbol(math, ams, rel, \"\\u2ab6\", \"\\\\succneqq\", true);\ndefineSymbol(math, ams, rel, \"\\ue016\", \"\\\\@nsubseteqq\");\ndefineSymbol(math, ams, bin, \"\\u22b4\", \"\\\\unlhd\");\ndefineSymbol(math, ams, bin, \"\\u22b5\", \"\\\\unrhd\"); // AMS Negated Arrows\n\ndefineSymbol(math, ams, rel, \"\\u219a\", \"\\\\nleftarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u219b\", \"\\\\nrightarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21cd\", \"\\\\nLeftarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21cf\", \"\\\\nRightarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21ae\", \"\\\\nleftrightarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21ce\", \"\\\\nLeftrightarrow\", true); // AMS Misc\n\ndefineSymbol(math, ams, rel, \"\\u25b3\", \"\\\\vartriangle\");\ndefineSymbol(math, ams, textord, \"\\u210f\", \"\\\\hslash\");\ndefineSymbol(math, ams, textord, \"\\u25bd\", \"\\\\triangledown\");\ndefineSymbol(math, ams, textord, \"\\u25ca\", \"\\\\lozenge\");\ndefineSymbol(math, ams, textord, \"\\u24c8\", \"\\\\circledS\");\ndefineSymbol(math, ams, textord, \"\\u00ae\", \"\\\\circledR\");\ndefineSymbol(text, ams, textord, \"\\u00ae\", \"\\\\circledR\");\ndefineSymbol(math, ams, textord, \"\\u2221\", \"\\\\measuredangle\", true);\ndefineSymbol(math, ams, textord, \"\\u2204\", \"\\\\nexists\");\ndefineSymbol(math, ams, textord, \"\\u2127\", \"\\\\mho\");\ndefineSymbol(math, ams, textord, \"\\u2132\", \"\\\\Finv\", true);\ndefineSymbol(math, ams, textord, \"\\u2141\", \"\\\\Game\", true);\ndefineSymbol(math, ams, textord, \"\\u2035\", \"\\\\backprime\");\ndefineSymbol(math, ams, textord, \"\\u25b2\", \"\\\\blacktriangle\");\ndefineSymbol(math, ams, textord, \"\\u25bc\", \"\\\\blacktriangledown\");\ndefineSymbol(math, ams, textord, \"\\u25a0\", \"\\\\blacksquare\");\ndefineSymbol(math, ams, textord, \"\\u29eb\", \"\\\\blacklozenge\");\ndefineSymbol(math, ams, textord, \"\\u2605\", \"\\\\bigstar\");\ndefineSymbol(math, ams, textord, \"\\u2222\", \"\\\\sphericalangle\", true);\ndefineSymbol(math, ams, textord, \"\\u2201\", \"\\\\complement\", true); // unicode-math maps U+F0 to \\matheth. We map to AMS function \\eth\n\ndefineSymbol(math, ams, textord, \"\\u00f0\", \"\\\\eth\", true);\ndefineSymbol(text, main, textord, \"\\u00f0\", \"\\u00f0\");\ndefineSymbol(math, ams, textord, \"\\u2571\", \"\\\\diagup\");\ndefineSymbol(math, ams, textord, \"\\u2572\", \"\\\\diagdown\");\ndefineSymbol(math, ams, textord, \"\\u25a1\", \"\\\\square\");\ndefineSymbol(math, ams, textord, \"\\u25a1\", \"\\\\Box\");\ndefineSymbol(math, ams, textord, \"\\u25ca\", \"\\\\Diamond\"); // unicode-math maps U+A5 to \\mathyen. We map to AMS function \\yen\n\ndefineSymbol(math, ams, textord, \"\\u00a5\", \"\\\\yen\", true);\ndefineSymbol(text, ams, textord, \"\\u00a5\", \"\\\\yen\", true);\ndefineSymbol(math, ams, textord, \"\\u2713\", \"\\\\checkmark\", true);\ndefineSymbol(text, ams, textord, \"\\u2713\", \"\\\\checkmark\"); // AMS Hebrew\n\ndefineSymbol(math, ams, textord, \"\\u2136\", \"\\\\beth\", true);\ndefineSymbol(math, ams, textord, \"\\u2138\", \"\\\\daleth\", true);\ndefineSymbol(math, ams, textord, \"\\u2137\", \"\\\\gimel\", true); // AMS Greek\n\ndefineSymbol(math, ams, textord, \"\\u03dd\", \"\\\\digamma\", true);\ndefineSymbol(math, ams, textord, \"\\u03f0\", \"\\\\varkappa\"); // AMS Delimiters\n\ndefineSymbol(math, ams, open, \"\\u250c\", \"\\\\@ulcorner\", true);\ndefineSymbol(math, ams, close, \"\\u2510\", \"\\\\@urcorner\", true);\ndefineSymbol(math, ams, open, \"\\u2514\", \"\\\\@llcorner\", true);\ndefineSymbol(math, ams, close, \"\\u2518\", \"\\\\@lrcorner\", true); // AMS Binary Relations\n\ndefineSymbol(math, ams, rel, \"\\u2266\", \"\\\\leqq\", true);\ndefineSymbol(math, ams, rel, \"\\u2a7d\", \"\\\\leqslant\", true);\ndefineSymbol(math, ams, rel, \"\\u2a95\", \"\\\\eqslantless\", true);\ndefineSymbol(math, ams, rel, \"\\u2272\", \"\\\\lesssim\", true);\ndefineSymbol(math, ams, rel, \"\\u2a85\", \"\\\\lessapprox\", true);\ndefineSymbol(math, ams, rel, \"\\u224a\", \"\\\\approxeq\", true);\ndefineSymbol(math, ams, bin, \"\\u22d6\", \"\\\\lessdot\");\ndefineSymbol(math, ams, rel, \"\\u22d8\", \"\\\\lll\", true);\ndefineSymbol(math, ams, rel, \"\\u2276\", \"\\\\lessgtr\", true);\ndefineSymbol(math, ams, rel, \"\\u22da\", \"\\\\lesseqgtr\", true);\ndefineSymbol(math, ams, rel, \"\\u2a8b\", \"\\\\lesseqqgtr\", true);\ndefineSymbol(math, ams, rel, \"\\u2251\", \"\\\\doteqdot\");\ndefineSymbol(math, ams, rel, \"\\u2253\", \"\\\\risingdotseq\", true);\ndefineSymbol(math, ams, rel, \"\\u2252\", \"\\\\fallingdotseq\", true);\ndefineSymbol(math, ams, rel, \"\\u223d\", \"\\\\backsim\", true);\ndefineSymbol(math, ams, rel, \"\\u22cd\", \"\\\\backsimeq\", true);\ndefineSymbol(math, ams, rel, \"\\u2ac5\", \"\\\\subseteqq\", true);\ndefineSymbol(math, ams, rel, \"\\u22d0\", \"\\\\Subset\", true);\ndefineSymbol(math, ams, rel, \"\\u228f\", \"\\\\sqsubset\", true);\ndefineSymbol(math, ams, rel, \"\\u227c\", \"\\\\preccurlyeq\", true);\ndefineSymbol(math, ams, rel, \"\\u22de\", \"\\\\curlyeqprec\", true);\ndefineSymbol(math, ams, rel, \"\\u227e\", \"\\\\precsim\", true);\ndefineSymbol(math, ams, rel, \"\\u2ab7\", \"\\\\precapprox\", true);\ndefineSymbol(math, ams, rel, \"\\u22b2\", \"\\\\vartriangleleft\");\ndefineSymbol(math, ams, rel, \"\\u22b4\", \"\\\\trianglelefteq\");\ndefineSymbol(math, ams, rel, \"\\u22a8\", \"\\\\vDash\", true);\ndefineSymbol(math, ams, rel, \"\\u22aa\", \"\\\\Vvdash\", true);\ndefineSymbol(math, ams, rel, \"\\u2323\", \"\\\\smallsmile\");\ndefineSymbol(math, ams, rel, \"\\u2322\", \"\\\\smallfrown\");\ndefineSymbol(math, ams, rel, \"\\u224f\", \"\\\\bumpeq\", true);\ndefineSymbol(math, ams, rel, \"\\u224e\", \"\\\\Bumpeq\", true);\ndefineSymbol(math, ams, rel, \"\\u2267\", \"\\\\geqq\", true);\ndefineSymbol(math, ams, rel, \"\\u2a7e\", \"\\\\geqslant\", true);\ndefineSymbol(math, ams, rel, \"\\u2a96\", \"\\\\eqslantgtr\", true);\ndefineSymbol(math, ams, rel, \"\\u2273\", \"\\\\gtrsim\", true);\ndefineSymbol(math, ams, rel, \"\\u2a86\", \"\\\\gtrapprox\", true);\ndefineSymbol(math, ams, bin, \"\\u22d7\", \"\\\\gtrdot\");\ndefineSymbol(math, ams, rel, \"\\u22d9\", \"\\\\ggg\", true);\ndefineSymbol(math, ams, rel, \"\\u2277\", \"\\\\gtrless\", true);\ndefineSymbol(math, ams, rel, \"\\u22db\", \"\\\\gtreqless\", true);\ndefineSymbol(math, ams, rel, \"\\u2a8c\", \"\\\\gtreqqless\", true);\ndefineSymbol(math, ams, rel, \"\\u2256\", \"\\\\eqcirc\", true);\ndefineSymbol(math, ams, rel, \"\\u2257\", \"\\\\circeq\", true);\ndefineSymbol(math, ams, rel, \"\\u225c\", \"\\\\triangleq\", true);\ndefineSymbol(math, ams, rel, \"\\u223c\", \"\\\\thicksim\");\ndefineSymbol(math, ams, rel, \"\\u2248\", \"\\\\thickapprox\");\ndefineSymbol(math, ams, rel, \"\\u2ac6\", \"\\\\supseteqq\", true);\ndefineSymbol(math, ams, rel, \"\\u22d1\", \"\\\\Supset\", true);\ndefineSymbol(math, ams, rel, \"\\u2290\", \"\\\\sqsupset\", true);\ndefineSymbol(math, ams, rel, \"\\u227d\", \"\\\\succcurlyeq\", true);\ndefineSymbol(math, ams, rel, \"\\u22df\", \"\\\\curlyeqsucc\", true);\ndefineSymbol(math, ams, rel, \"\\u227f\", \"\\\\succsim\", true);\ndefineSymbol(math, ams, rel, \"\\u2ab8\", \"\\\\succapprox\", true);\ndefineSymbol(math, ams, rel, \"\\u22b3\", \"\\\\vartriangleright\");\ndefineSymbol(math, ams, rel, \"\\u22b5\", \"\\\\trianglerighteq\");\ndefineSymbol(math, ams, rel, \"\\u22a9\", \"\\\\Vdash\", true);\ndefineSymbol(math, ams, rel, \"\\u2223\", \"\\\\shortmid\");\ndefineSymbol(math, ams, rel, \"\\u2225\", \"\\\\shortparallel\");\ndefineSymbol(math, ams, rel, \"\\u226c\", \"\\\\between\", true);\ndefineSymbol(math, ams, rel, \"\\u22d4\", \"\\\\pitchfork\", true);\ndefineSymbol(math, ams, rel, \"\\u221d\", \"\\\\varpropto\");\ndefineSymbol(math, ams, rel, \"\\u25c0\", \"\\\\blacktriangleleft\"); // unicode-math says that \\therefore is a mathord atom.\n// We kept the amssymb atom type, which is rel.\n\ndefineSymbol(math, ams, rel, \"\\u2234\", \"\\\\therefore\", true);\ndefineSymbol(math, ams, rel, \"\\u220d\", \"\\\\backepsilon\");\ndefineSymbol(math, ams, rel, \"\\u25b6\", \"\\\\blacktriangleright\"); // unicode-math says that \\because is a mathord atom.\n// We kept the amssymb atom type, which is rel.\n\ndefineSymbol(math, ams, rel, \"\\u2235\", \"\\\\because\", true);\ndefineSymbol(math, ams, rel, \"\\u22d8\", \"\\\\llless\");\ndefineSymbol(math, ams, rel, \"\\u22d9\", \"\\\\gggtr\");\ndefineSymbol(math, ams, bin, \"\\u22b2\", \"\\\\lhd\");\ndefineSymbol(math, ams, bin, \"\\u22b3\", \"\\\\rhd\");\ndefineSymbol(math, ams, rel, \"\\u2242\", \"\\\\eqsim\", true);\ndefineSymbol(math, main, rel, \"\\u22c8\", \"\\\\Join\");\ndefineSymbol(math, ams, rel, \"\\u2251\", \"\\\\Doteq\", true); // AMS Binary Operators\n\ndefineSymbol(math, ams, bin, \"\\u2214\", \"\\\\dotplus\", true);\ndefineSymbol(math, ams, bin, \"\\u2216\", \"\\\\smallsetminus\");\ndefineSymbol(math, ams, bin, \"\\u22d2\", \"\\\\Cap\", true);\ndefineSymbol(math, ams, bin, \"\\u22d3\", \"\\\\Cup\", true);\ndefineSymbol(math, ams, bin, \"\\u2a5e\", \"\\\\doublebarwedge\", true);\ndefineSymbol(math, ams, bin, \"\\u229f\", \"\\\\boxminus\", true);\ndefineSymbol(math, ams, bin, \"\\u229e\", \"\\\\boxplus\", true);\ndefineSymbol(math, ams, bin, \"\\u22c7\", \"\\\\divideontimes\", true);\ndefineSymbol(math, ams, bin, \"\\u22c9\", \"\\\\ltimes\", true);\ndefineSymbol(math, ams, bin, \"\\u22ca\", \"\\\\rtimes\", true);\ndefineSymbol(math, ams, bin, \"\\u22cb\", \"\\\\leftthreetimes\", true);\ndefineSymbol(math, ams, bin, \"\\u22cc\", \"\\\\rightthreetimes\", true);\ndefineSymbol(math, ams, bin, \"\\u22cf\", \"\\\\curlywedge\", true);\ndefineSymbol(math, ams, bin, \"\\u22ce\", \"\\\\curlyvee\", true);\ndefineSymbol(math, ams, bin, \"\\u229d\", \"\\\\circleddash\", true);\ndefineSymbol(math, ams, bin, \"\\u229b\", \"\\\\circledast\", true);\ndefineSymbol(math, ams, bin, \"\\u22c5\", \"\\\\centerdot\");\ndefineSymbol(math, ams, bin, \"\\u22ba\", \"\\\\intercal\", true);\ndefineSymbol(math, ams, bin, \"\\u22d2\", \"\\\\doublecap\");\ndefineSymbol(math, ams, bin, \"\\u22d3\", \"\\\\doublecup\");\ndefineSymbol(math, ams, bin, \"\\u22a0\", \"\\\\boxtimes\", true); // AMS Arrows\n// Note: unicode-math maps \\u21e2 to their own function \\rightdasharrow.\n// We'll map it to AMS function \\dashrightarrow. It produces the same atom.\n\ndefineSymbol(math, ams, rel, \"\\u21e2\", \"\\\\dashrightarrow\", true); // unicode-math maps \\u21e0 to \\leftdasharrow. We'll use the AMS synonym.\n\ndefineSymbol(math, ams, rel, \"\\u21e0\", \"\\\\dashleftarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21c7\", \"\\\\leftleftarrows\", true);\ndefineSymbol(math, ams, rel, \"\\u21c6\", \"\\\\leftrightarrows\", true);\ndefineSymbol(math, ams, rel, \"\\u21da\", \"\\\\Lleftarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u219e\", \"\\\\twoheadleftarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21a2\", \"\\\\leftarrowtail\", true);\ndefineSymbol(math, ams, rel, \"\\u21ab\", \"\\\\looparrowleft\", true);\ndefineSymbol(math, ams, rel, \"\\u21cb\", \"\\\\leftrightharpoons\", true);\ndefineSymbol(math, ams, rel, \"\\u21b6\", \"\\\\curvearrowleft\", true); // unicode-math maps \\u21ba to \\acwopencirclearrow. We'll use the AMS synonym.\n\ndefineSymbol(math, ams, rel, \"\\u21ba\", \"\\\\circlearrowleft\", true);\ndefineSymbol(math, ams, rel, \"\\u21b0\", \"\\\\Lsh\", true);\ndefineSymbol(math, ams, rel, \"\\u21c8\", \"\\\\upuparrows\", true);\ndefineSymbol(math, ams, rel, \"\\u21bf\", \"\\\\upharpoonleft\", true);\ndefineSymbol(math, ams, rel, \"\\u21c3\", \"\\\\downharpoonleft\", true);\ndefineSymbol(math, main, rel, \"\\u22b6\", \"\\\\origof\", true); // not in font\n\ndefineSymbol(math, main, rel, \"\\u22b7\", \"\\\\imageof\", true); // not in font\n\ndefineSymbol(math, ams, rel, \"\\u22b8\", \"\\\\multimap\", true);\ndefineSymbol(math, ams, rel, \"\\u21ad\", \"\\\\leftrightsquigarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21c9\", \"\\\\rightrightarrows\", true);\ndefineSymbol(math, ams, rel, \"\\u21c4\", \"\\\\rightleftarrows\", true);\ndefineSymbol(math, ams, rel, \"\\u21a0\", \"\\\\twoheadrightarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21a3\", \"\\\\rightarrowtail\", true);\ndefineSymbol(math, ams, rel, \"\\u21ac\", \"\\\\looparrowright\", true);\ndefineSymbol(math, ams, rel, \"\\u21b7\", \"\\\\curvearrowright\", true); // unicode-math maps \\u21bb to \\cwopencirclearrow. We'll use the AMS synonym.\n\ndefineSymbol(math, ams, rel, \"\\u21bb\", \"\\\\circlearrowright\", true);\ndefineSymbol(math, ams, rel, \"\\u21b1\", \"\\\\Rsh\", true);\ndefineSymbol(math, ams, rel, \"\\u21ca\", \"\\\\downdownarrows\", true);\ndefineSymbol(math, ams, rel, \"\\u21be\", \"\\\\upharpoonright\", true);\ndefineSymbol(math, ams, rel, \"\\u21c2\", \"\\\\downharpoonright\", true);\ndefineSymbol(math, ams, rel, \"\\u21dd\", \"\\\\rightsquigarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21dd\", \"\\\\leadsto\");\ndefineSymbol(math, ams, rel, \"\\u21db\", \"\\\\Rrightarrow\", true);\ndefineSymbol(math, ams, rel, \"\\u21be\", \"\\\\restriction\");\ndefineSymbol(math, main, textord, \"\\u2018\", \"`\");\ndefineSymbol(math, main, textord, \"$\", \"\\\\$\");\ndefineSymbol(text, main, textord, \"$\", \"\\\\$\");\ndefineSymbol(text, main, textord, \"$\", \"\\\\textdollar\");\ndefineSymbol(math, main, textord, \"%\", \"\\\\%\");\ndefineSymbol(text, main, textord, \"%\", \"\\\\%\");\ndefineSymbol(math, main, textord, \"_\", \"\\\\_\");\ndefineSymbol(text, main, textord, \"_\", \"\\\\_\");\ndefineSymbol(text, main, textord, \"_\", \"\\\\textunderscore\");\ndefineSymbol(math, main, textord, \"\\u2220\", \"\\\\angle\", true);\ndefineSymbol(math, main, textord, \"\\u221e\", \"\\\\infty\", true);\ndefineSymbol(math, main, textord, \"\\u2032\", \"\\\\prime\");\ndefineSymbol(math, main, textord, \"\\u25b3\", \"\\\\triangle\");\ndefineSymbol(math, main, textord, \"\\u0393\", \"\\\\Gamma\", true);\ndefineSymbol(math, main, textord, \"\\u0394\", \"\\\\Delta\", true);\ndefineSymbol(math, main, textord, \"\\u0398\", \"\\\\Theta\", true);\ndefineSymbol(math, main, textord, \"\\u039b\", \"\\\\Lambda\", true);\ndefineSymbol(math, main, textord, \"\\u039e\", \"\\\\Xi\", true);\ndefineSymbol(math, main, textord, \"\\u03a0\", \"\\\\Pi\", true);\ndefineSymbol(math, main, textord, \"\\u03a3\", \"\\\\Sigma\", true);\ndefineSymbol(math, main, textord, \"\\u03a5\", \"\\\\Upsilon\", true);\ndefineSymbol(math, main, textord, \"\\u03a6\", \"\\\\Phi\", true);\ndefineSymbol(math, main, textord, \"\\u03a8\", \"\\\\Psi\", true);\ndefineSymbol(math, main, textord, \"\\u03a9\", \"\\\\Omega\", true);\ndefineSymbol(math, main, textord, \"A\", \"\\u0391\");\ndefineSymbol(math, main, textord, \"B\", \"\\u0392\");\ndefineSymbol(math, main, textord, \"E\", \"\\u0395\");\ndefineSymbol(math, main, textord, \"Z\", \"\\u0396\");\ndefineSymbol(math, main, textord, \"H\", \"\\u0397\");\ndefineSymbol(math, main, textord, \"I\", \"\\u0399\");\ndefineSymbol(math, main, textord, \"K\", \"\\u039A\");\ndefineSymbol(math, main, textord, \"M\", \"\\u039C\");\ndefineSymbol(math, main, textord, \"N\", \"\\u039D\");\ndefineSymbol(math, main, textord, \"O\", \"\\u039F\");\ndefineSymbol(math, main, textord, \"P\", \"\\u03A1\");\ndefineSymbol(math, main, textord, \"T\", \"\\u03A4\");\ndefineSymbol(math, main, textord, \"X\", \"\\u03A7\");\ndefineSymbol(math, main, textord, \"\\u00ac\", \"\\\\neg\", true);\ndefineSymbol(math, main, textord, \"\\u00ac\", \"\\\\lnot\");\ndefineSymbol(math, main, textord, \"\\u22a4\", \"\\\\top\");\ndefineSymbol(math, main, textord, \"\\u22a5\", \"\\\\bot\");\ndefineSymbol(math, main, textord, \"\\u2205\", \"\\\\emptyset\");\ndefineSymbol(math, ams, textord, \"\\u2205\", \"\\\\varnothing\");\ndefineSymbol(math, main, mathord, \"\\u03b1\", \"\\\\alpha\", true);\ndefineSymbol(math, main, mathord, \"\\u03b2\", \"\\\\beta\", true);\ndefineSymbol(math, main, mathord, \"\\u03b3\", \"\\\\gamma\", true);\ndefineSymbol(math, main, mathord, \"\\u03b4\", \"\\\\delta\", true);\ndefineSymbol(math, main, mathord, \"\\u03f5\", \"\\\\epsilon\", true);\ndefineSymbol(math, main, mathord, \"\\u03b6\", \"\\\\zeta\", true);\ndefineSymbol(math, main, mathord, \"\\u03b7\", \"\\\\eta\", true);\ndefineSymbol(math, main, mathord, \"\\u03b8\", \"\\\\theta\", true);\ndefineSymbol(math, main, mathord, \"\\u03b9\", \"\\\\iota\", true);\ndefineSymbol(math, main, mathord, \"\\u03ba\", \"\\\\kappa\", true);\ndefineSymbol(math, main, mathord, \"\\u03bb\", \"\\\\lambda\", true);\ndefineSymbol(math, main, mathord, \"\\u03bc\", \"\\\\mu\", true);\ndefineSymbol(math, main, mathord, \"\\u03bd\", \"\\\\nu\", true);\ndefineSymbol(math, main, mathord, \"\\u03be\", \"\\\\xi\", true);\ndefineSymbol(math, main, mathord, \"\\u03bf\", \"\\\\omicron\", true);\ndefineSymbol(math, main, mathord, \"\\u03c0\", \"\\\\pi\", true);\ndefineSymbol(math, main, mathord, \"\\u03c1\", \"\\\\rho\", true);\ndefineSymbol(math, main, mathord, \"\\u03c3\", \"\\\\sigma\", true);\ndefineSymbol(math, main, mathord, \"\\u03c4\", \"\\\\tau\", true);\ndefineSymbol(math, main, mathord, \"\\u03c5\", \"\\\\upsilon\", true);\ndefineSymbol(math, main, mathord, \"\\u03d5\", \"\\\\phi\", true);\ndefineSymbol(math, main, mathord, \"\\u03c7\", \"\\\\chi\", true);\ndefineSymbol(math, main, mathord, \"\\u03c8\", \"\\\\psi\", true);\ndefineSymbol(math, main, mathord, \"\\u03c9\", \"\\\\omega\", true);\ndefineSymbol(math, main, mathord, \"\\u03b5\", \"\\\\varepsilon\", true);\ndefineSymbol(math, main, mathord, \"\\u03d1\", \"\\\\vartheta\", true);\ndefineSymbol(math, main, mathord, \"\\u03d6\", \"\\\\varpi\", true);\ndefineSymbol(math, main, mathord, \"\\u03f1\", \"\\\\varrho\", true);\ndefineSymbol(math, main, mathord, \"\\u03c2\", \"\\\\varsigma\", true);\ndefineSymbol(math, main, mathord, \"\\u03c6\", \"\\\\varphi\", true);\ndefineSymbol(math, main, bin, \"\\u2217\", \"*\", true);\ndefineSymbol(math, main, bin, \"+\", \"+\");\ndefineSymbol(math, main, bin, \"\\u2212\", \"-\", true);\ndefineSymbol(math, main, bin, \"\\u22c5\", \"\\\\cdot\", true);\ndefineSymbol(math, main, bin, \"\\u2218\", \"\\\\circ\", true);\ndefineSymbol(math, main, bin, \"\\u00f7\", \"\\\\div\", true);\ndefineSymbol(math, main, bin, \"\\u00b1\", \"\\\\pm\", true);\ndefineSymbol(math, main, bin, \"\\u00d7\", \"\\\\times\", true);\ndefineSymbol(math, main, bin, \"\\u2229\", \"\\\\cap\", true);\ndefineSymbol(math, main, bin, \"\\u222a\", \"\\\\cup\", true);\ndefineSymbol(math, main, bin, \"\\u2216\", \"\\\\setminus\", true);\ndefineSymbol(math, main, bin, \"\\u2227\", \"\\\\land\");\ndefineSymbol(math, main, bin, \"\\u2228\", \"\\\\lor\");\ndefineSymbol(math, main, bin, \"\\u2227\", \"\\\\wedge\", true);\ndefineSymbol(math, main, bin, \"\\u2228\", \"\\\\vee\", true);\ndefineSymbol(math, main, textord, \"\\u221a\", \"\\\\surd\");\ndefineSymbol(math, main, open, \"\\u27e8\", \"\\\\langle\", true);\ndefineSymbol(math, main, open, \"\\u2223\", \"\\\\lvert\");\ndefineSymbol(math, main, open, \"\\u2225\", \"\\\\lVert\");\ndefineSymbol(math, main, close, \"?\", \"?\");\ndefineSymbol(math, main, close, \"!\", \"!\");\ndefineSymbol(math, main, close, \"\\u27e9\", \"\\\\rangle\", true);\ndefineSymbol(math, main, close, \"\\u2223\", \"\\\\rvert\");\ndefineSymbol(math, main, close, \"\\u2225\", \"\\\\rVert\");\ndefineSymbol(math, main, rel, \"=\", \"=\");\ndefineSymbol(math, main, rel, \":\", \":\");\ndefineSymbol(math, main, rel, \"\\u2248\", \"\\\\approx\", true);\ndefineSymbol(math, main, rel, \"\\u2245\", \"\\\\cong\", true);\ndefineSymbol(math, main, rel, \"\\u2265\", \"\\\\ge\");\ndefineSymbol(math, main, rel, \"\\u2265\", \"\\\\geq\", true);\ndefineSymbol(math, main, rel, \"\\u2190\", \"\\\\gets\");\ndefineSymbol(math, main, rel, \">\", \"\\\\gt\", true);\ndefineSymbol(math, main, rel, \"\\u2208\", \"\\\\in\", true);\ndefineSymbol(math, main, rel, \"\\ue020\", \"\\\\@not\");\ndefineSymbol(math, main, rel, \"\\u2282\", \"\\\\subset\", true);\ndefineSymbol(math, main, rel, \"\\u2283\", \"\\\\supset\", true);\ndefineSymbol(math, main, rel, \"\\u2286\", \"\\\\subseteq\", true);\ndefineSymbol(math, main, rel, \"\\u2287\", \"\\\\supseteq\", true);\ndefineSymbol(math, ams, rel, \"\\u2288\", \"\\\\nsubseteq\", true);\ndefineSymbol(math, ams, rel, \"\\u2289\", \"\\\\nsupseteq\", true);\ndefineSymbol(math, main, rel, \"\\u22a8\", \"\\\\models\");\ndefineSymbol(math, main, rel, \"\\u2190\", \"\\\\leftarrow\", true);\ndefineSymbol(math, main, rel, \"\\u2264\", \"\\\\le\");\ndefineSymbol(math, main, rel, \"\\u2264\", \"\\\\leq\", true);\ndefineSymbol(math, main, rel, \"<\", \"\\\\lt\", true);\ndefineSymbol(math, main, rel, \"\\u2192\", \"\\\\rightarrow\", true);\ndefineSymbol(math, main, rel, \"\\u2192\", \"\\\\to\");\ndefineSymbol(math, ams, rel, \"\\u2271\", \"\\\\ngeq\", true);\ndefineSymbol(math, ams, rel, \"\\u2270\", \"\\\\nleq\", true);\ndefineSymbol(math, main, spacing, \"\\u00a0\", \"\\\\ \");\ndefineSymbol(math, main, spacing, \"\\u00a0\", \"\\\\space\"); // Ref: LaTeX Source 2e: \\DeclareRobustCommand{\\nobreakspace}{%\n\ndefineSymbol(math, main, spacing, \"\\u00a0\", \"\\\\nobreakspace\");\ndefineSymbol(text, main, spacing, \"\\u00a0\", \"\\\\ \");\ndefineSymbol(text, main, spacing, \"\\u00a0\", \" \");\ndefineSymbol(text, main, spacing, \"\\u00a0\", \"\\\\space\");\ndefineSymbol(text, main, spacing, \"\\u00a0\", \"\\\\nobreakspace\");\ndefineSymbol(math, main, spacing, null, \"\\\\nobreak\");\ndefineSymbol(math, main, spacing, null, \"\\\\allowbreak\");\ndefineSymbol(math, main, punct, \",\", \",\");\ndefineSymbol(math, main, punct, \";\", \";\");\ndefineSymbol(math, ams, bin, \"\\u22bc\", \"\\\\barwedge\", true);\ndefineSymbol(math, ams, bin, \"\\u22bb\", \"\\\\veebar\", true);\ndefineSymbol(math, main, bin, \"\\u2299\", \"\\\\odot\", true);\ndefineSymbol(math, main, bin, \"\\u2295\", \"\\\\oplus\", true);\ndefineSymbol(math, main, bin, \"\\u2297\", \"\\\\otimes\", true);\ndefineSymbol(math, main, textord, \"\\u2202\", \"\\\\partial\", true);\ndefineSymbol(math, main, bin, \"\\u2298\", \"\\\\oslash\", true);\ndefineSymbol(math, ams, bin, \"\\u229a\", \"\\\\circledcirc\", true);\ndefineSymbol(math, ams, bin, \"\\u22a1\", \"\\\\boxdot\", true);\ndefineSymbol(math, main, bin, \"\\u25b3\", \"\\\\bigtriangleup\");\ndefineSymbol(math, main, bin, \"\\u25bd\", \"\\\\bigtriangledown\");\ndefineSymbol(math, main, bin, \"\\u2020\", \"\\\\dagger\");\ndefineSymbol(math, main, bin, \"\\u22c4\", \"\\\\diamond\");\ndefineSymbol(math, main, bin, \"\\u22c6\", \"\\\\star\");\ndefineSymbol(math, main, bin, \"\\u25c3\", \"\\\\triangleleft\");\ndefineSymbol(math, main, bin, \"\\u25b9\", \"\\\\triangleright\");\ndefineSymbol(math, main, open, \"{\", \"\\\\{\");\ndefineSymbol(text, main, textord, \"{\", \"\\\\{\");\ndefineSymbol(text, main, textord, \"{\", \"\\\\textbraceleft\");\ndefineSymbol(math, main, close, \"}\", \"\\\\}\");\ndefineSymbol(text, main, textord, \"}\", \"\\\\}\");\ndefineSymbol(text, main, textord, \"}\", \"\\\\textbraceright\");\ndefineSymbol(math, main, open, \"{\", \"\\\\lbrace\");\ndefineSymbol(math, main, close, \"}\", \"\\\\rbrace\");\ndefineSymbol(math, main, open, \"[\", \"\\\\lbrack\", true);\ndefineSymbol(text, main, textord, \"[\", \"\\\\lbrack\", true);\ndefineSymbol(math, main, close, \"]\", \"\\\\rbrack\", true);\ndefineSymbol(text, main, textord, \"]\", \"\\\\rbrack\", true);\ndefineSymbol(math, main, open, \"(\", \"\\\\lparen\", true);\ndefineSymbol(math, main, close, \")\", \"\\\\rparen\", true);\ndefineSymbol(text, main, textord, \"<\", \"\\\\textless\", true); // in T1 fontenc\n\ndefineSymbol(text, main, textord, \">\", \"\\\\textgreater\", true); // in T1 fontenc\n\ndefineSymbol(math, main, open, \"\\u230a\", \"\\\\lfloor\", true);\ndefineSymbol(math, main, close, \"\\u230b\", \"\\\\rfloor\", true);\ndefineSymbol(math, main, open, \"\\u2308\", \"\\\\lceil\", true);\ndefineSymbol(math, main, close, \"\\u2309\", \"\\\\rceil\", true);\ndefineSymbol(math, main, textord, \"\\\\\", \"\\\\backslash\");\ndefineSymbol(math, main, textord, \"\\u2223\", \"|\");\ndefineSymbol(math, main, textord, \"\\u2223\", \"\\\\vert\");\ndefineSymbol(text, main, textord, \"|\", \"\\\\textbar\", true); // in T1 fontenc\n\ndefineSymbol(math, main, textord, \"\\u2225\", \"\\\\|\");\ndefineSymbol(math, main, textord, \"\\u2225\", \"\\\\Vert\");\ndefineSymbol(text, main, textord, \"\\u2225\", \"\\\\textbardbl\");\ndefineSymbol(text, main, textord, \"~\", \"\\\\textasciitilde\");\ndefineSymbol(text, main, textord, \"\\\\\", \"\\\\textbackslash\");\ndefineSymbol(text, main, textord, \"^\", \"\\\\textasciicircum\");\ndefineSymbol(math, main, rel, \"\\u2191\", \"\\\\uparrow\", true);\ndefineSymbol(math, main, rel, \"\\u21d1\", \"\\\\Uparrow\", true);\ndefineSymbol(math, main, rel, \"\\u2193\", \"\\\\downarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21d3\", \"\\\\Downarrow\", true);\ndefineSymbol(math, main, rel, \"\\u2195\", \"\\\\updownarrow\", true);\ndefineSymbol(math, main, rel, \"\\u21d5\", \"\\\\Updownarrow\", true);\ndefineSymbol(math, main, op, \"\\u2210\", \"\\\\coprod\");\ndefineSymbol(math, main, op, \"\\u22c1\", \"\\\\bigvee\");\ndefineSymbol(math, main, op, \"\\u22c0\", \"\\\\bigwedge\");\ndefineSymbol(math, main, op, \"\\u2a04\", \"\\\\biguplus\");\ndefineSymbol(math, main, op, \"\\u22c2\", \"\\\\bigcap\");\ndefineSymbol(math, main, op, \"\\u22c3\", \"\\\\bigcup\");\ndefineSymbol(math, main, op, \"\\u222b\", \"\\\\int\");\ndefineSymbol(math, main, op, \"\\u222b\", \"\\\\intop\");\ndefineSymbol(math, main, op, \"\\u222c\", \"\\\\iint\");\ndefineSymbol(math, main, op, \"\\u222d\", \"\\\\iiint\");\ndefineSymbol(math, main, op, \"\\u220f\", \"\\\\prod\");\ndefineSymbol(math, main, op, \"\\u2211\", \"\\\\sum\");\ndefineSymbol(math, main, op, \"\\u2a02\", \"\\\\bigotimes\");\ndefineSymbol(math, main, op, \"\\u2a01\", \"\\\\bigoplus\");\ndefineSymbol(math, main, op, \"\\u2a00\", \"\\\\bigodot\");\ndefineSymbol(math, main, op, \"\\u222e\", \"\\\\oint\");\ndefineSymbol(math, main, op, \"\\u222f\", \"\\\\oiint\");\ndefineSymbol(math, main, op, \"\\u2230\", \"\\\\oiiint\");\ndefineSymbol(math, main, op, \"\\u2a06\", \"\\\\bigsqcup\");\ndefineSymbol(math, main, op, \"\\u222b\", \"\\\\smallint\");\ndefineSymbol(text, main, inner, \"\\u2026\", \"\\\\textellipsis\");\ndefineSymbol(math, main, inner, \"\\u2026\", \"\\\\mathellipsis\");\ndefineSymbol(text, main, inner, \"\\u2026\", \"\\\\ldots\", true);\ndefineSymbol(math, main, inner, \"\\u2026\", \"\\\\ldots\", true);\ndefineSymbol(math, main, inner, \"\\u22ef\", \"\\\\@cdots\", true);\ndefineSymbol(math, main, inner, \"\\u22f1\", \"\\\\ddots\", true); // \\vdots is a macro that uses one of these two symbols (with made-up names):\n\ndefineSymbol(math, main, textord, \"\\u22ee\", \"\\\\varvdots\");\ndefineSymbol(text, main, textord, \"\\u22ee\", \"\\\\varvdots\");\ndefineSymbol(math, main, accent, \"\\u02ca\", \"\\\\acute\");\ndefineSymbol(math, main, accent, \"\\u02cb\", \"\\\\grave\");\ndefineSymbol(math, main, accent, \"\\u00a8\", \"\\\\ddot\");\ndefineSymbol(math, main, accent, \"\\u007e\", \"\\\\tilde\");\ndefineSymbol(math, main, accent, \"\\u02c9\", \"\\\\bar\");\ndefineSymbol(math, main, accent, \"\\u02d8\", \"\\\\breve\");\ndefineSymbol(math, main, accent, \"\\u02c7\", \"\\\\check\");\ndefineSymbol(math, main, accent, \"\\u005e\", \"\\\\hat\");\ndefineSymbol(math, main, accent, \"\\u20d7\", \"\\\\vec\");\ndefineSymbol(math, main, accent, \"\\u02d9\", \"\\\\dot\");\ndefineSymbol(math, main, accent, \"\\u02da\", \"\\\\mathring\"); // \\imath and \\jmath should be invariant to \\mathrm, \\mathbf, etc., so use PUA\n\ndefineSymbol(math, main, mathord, \"\\ue131\", \"\\\\@imath\");\ndefineSymbol(math, main, mathord, \"\\ue237\", \"\\\\@jmath\");\ndefineSymbol(math, main, textord, \"\\u0131\", \"\\u0131\");\ndefineSymbol(math, main, textord, \"\\u0237\", \"\\u0237\");\ndefineSymbol(text, main, textord, \"\\u0131\", \"\\\\i\", true);\ndefineSymbol(text, main, textord, \"\\u0237\", \"\\\\j\", true);\ndefineSymbol(text, main, textord, \"\\u00df\", \"\\\\ss\", true);\ndefineSymbol(text, main, textord, \"\\u00e6\", \"\\\\ae\", true);\ndefineSymbol(text, main, textord, \"\\u0153\", \"\\\\oe\", true);\ndefineSymbol(text, main, textord, \"\\u00f8\", \"\\\\o\", true);\ndefineSymbol(text, main, textord, \"\\u00c6\", \"\\\\AE\", true);\ndefineSymbol(text, main, textord, \"\\u0152\", \"\\\\OE\", true);\ndefineSymbol(text, main, textord, \"\\u00d8\", \"\\\\O\", true);\ndefineSymbol(text, main, accent, \"\\u02ca\", \"\\\\'\"); // acute\n\ndefineSymbol(text, main, accent, \"\\u02cb\", \"\\\\`\"); // grave\n\ndefineSymbol(text, main, accent, \"\\u02c6\", \"\\\\^\"); // circumflex\n\ndefineSymbol(text, main, accent, \"\\u02dc\", \"\\\\~\"); // tilde\n\ndefineSymbol(text, main, accent, \"\\u02c9\", \"\\\\=\"); // macron\n\ndefineSymbol(text, main, accent, \"\\u02d8\", \"\\\\u\"); // breve\n\ndefineSymbol(text, main, accent, \"\\u02d9\", \"\\\\.\"); // dot above\n\ndefineSymbol(text, main, accent, \"\\u00b8\", \"\\\\c\"); // cedilla\n\ndefineSymbol(text, main, accent, \"\\u02da\", \"\\\\r\"); // ring above\n\ndefineSymbol(text, main, accent, \"\\u02c7\", \"\\\\v\"); // caron\n\ndefineSymbol(text, main, accent, \"\\u00a8\", '\\\\\"'); // diaresis\n\ndefineSymbol(text, main, accent, \"\\u02dd\", \"\\\\H\"); // double acute\n\ndefineSymbol(text, main, accent, \"\\u25ef\", \"\\\\textcircled\"); // \\bigcirc glyph\n// These ligatures are detected and created in Parser.js's `formLigatures`.\n\nvar ligatures = {\n \"--\": true,\n \"---\": true,\n \"``\": true,\n \"''\": true\n};\ndefineSymbol(text, main, textord, \"\\u2013\", \"--\", true);\ndefineSymbol(text, main, textord, \"\\u2013\", \"\\\\textendash\");\ndefineSymbol(text, main, textord, \"\\u2014\", \"---\", true);\ndefineSymbol(text, main, textord, \"\\u2014\", \"\\\\textemdash\");\ndefineSymbol(text, main, textord, \"\\u2018\", \"`\", true);\ndefineSymbol(text, main, textord, \"\\u2018\", \"\\\\textquoteleft\");\ndefineSymbol(text, main, textord, \"\\u2019\", \"'\", true);\ndefineSymbol(text, main, textord, \"\\u2019\", \"\\\\textquoteright\");\ndefineSymbol(text, main, textord, \"\\u201c\", \"``\", true);\ndefineSymbol(text, main, textord, \"\\u201c\", \"\\\\textquotedblleft\");\ndefineSymbol(text, main, textord, \"\\u201d\", \"''\", true);\ndefineSymbol(text, main, textord, \"\\u201d\", \"\\\\textquotedblright\"); // \\degree from gensymb package\n\ndefineSymbol(math, main, textord, \"\\u00b0\", \"\\\\degree\", true);\ndefineSymbol(text, main, textord, \"\\u00b0\", \"\\\\degree\"); // \\textdegree from inputenc package\n\ndefineSymbol(text, main, textord, \"\\u00b0\", \"\\\\textdegree\", true); // TODO: In LaTeX, \\pounds can generate a different character in text and math\n// mode, but among our fonts, only Main-Regular defines this character \"163\".\n\ndefineSymbol(math, main, textord, \"\\u00a3\", \"\\\\pounds\");\ndefineSymbol(math, main, textord, \"\\u00a3\", \"\\\\mathsterling\", true);\ndefineSymbol(text, main, textord, \"\\u00a3\", \"\\\\pounds\");\ndefineSymbol(text, main, textord, \"\\u00a3\", \"\\\\textsterling\", true);\ndefineSymbol(math, ams, textord, \"\\u2720\", \"\\\\maltese\");\ndefineSymbol(text, ams, textord, \"\\u2720\", \"\\\\maltese\"); // There are lots of symbols which are the same, so we add them in afterwards.\n// All of these are textords in math mode\n\nvar mathTextSymbols = \"0123456789/@.\\\"\";\n\nfor (var i = 0; i < mathTextSymbols.length; i++) {\n var ch = mathTextSymbols.charAt(i);\n defineSymbol(math, main, textord, ch, ch);\n} // All of these are textords in text mode\n\n\nvar textSymbols = \"0123456789!@*()-=+\\\";:?/.,\";\n\nfor (var _i = 0; _i < textSymbols.length; _i++) {\n var _ch = textSymbols.charAt(_i);\n\n defineSymbol(text, main, textord, _ch, _ch);\n} // All of these are textords in text mode, and mathords in math mode\n\n\nvar letters = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\n\nfor (var _i2 = 0; _i2 < letters.length; _i2++) {\n var _ch2 = letters.charAt(_i2);\n\n defineSymbol(math, main, mathord, _ch2, _ch2);\n defineSymbol(text, main, textord, _ch2, _ch2);\n} // Blackboard bold and script letters in Unicode range\n\n\ndefineSymbol(math, ams, textord, \"C\", \"\\u2102\"); // blackboard bold\n\ndefineSymbol(text, ams, textord, \"C\", \"\\u2102\");\ndefineSymbol(math, ams, textord, \"H\", \"\\u210D\");\ndefineSymbol(text, ams, textord, \"H\", \"\\u210D\");\ndefineSymbol(math, ams, textord, \"N\", \"\\u2115\");\ndefineSymbol(text, ams, textord, \"N\", \"\\u2115\");\ndefineSymbol(math, ams, textord, \"P\", \"\\u2119\");\ndefineSymbol(text, ams, textord, \"P\", \"\\u2119\");\ndefineSymbol(math, ams, textord, \"Q\", \"\\u211A\");\ndefineSymbol(text, ams, textord, \"Q\", \"\\u211A\");\ndefineSymbol(math, ams, textord, \"R\", \"\\u211D\");\ndefineSymbol(text, ams, textord, \"R\", \"\\u211D\");\ndefineSymbol(math, ams, textord, \"Z\", \"\\u2124\");\ndefineSymbol(text, ams, textord, \"Z\", \"\\u2124\");\ndefineSymbol(math, main, mathord, \"h\", \"\\u210E\"); // italic h, Planck constant\n\ndefineSymbol(text, main, mathord, \"h\", \"\\u210E\"); // The next loop loads wide (surrogate pair) characters.\n// We support some letters in the Unicode range U+1D400 to U+1D7FF,\n// Mathematical Alphanumeric Symbols.\n// Some editors do not deal well with wide characters. So don't write the\n// string into this file. Instead, create the string from the surrogate pair.\n\nvar wideChar = \"\";\n\nfor (var _i3 = 0; _i3 < letters.length; _i3++) {\n var _ch3 = letters.charAt(_i3); // The hex numbers in the next line are a surrogate pair.\n // 0xD835 is the high surrogate for all letters in the range we support.\n // 0xDC00 is the low surrogate for bold A.\n\n\n wideChar = String.fromCharCode(0xD835, 0xDC00 + _i3); // A-Z a-z bold\n\n defineSymbol(math, main, mathord, _ch3, wideChar);\n defineSymbol(text, main, textord, _ch3, wideChar);\n wideChar = String.fromCharCode(0xD835, 0xDC34 + _i3); // A-Z a-z italic\n\n defineSymbol(math, main, mathord, _ch3, wideChar);\n defineSymbol(text, main, textord, _ch3, wideChar);\n wideChar = String.fromCharCode(0xD835, 0xDC68 + _i3); // A-Z a-z bold italic\n\n defineSymbol(math, main, mathord, _ch3, wideChar);\n defineSymbol(text, main, textord, _ch3, wideChar);\n wideChar = String.fromCharCode(0xD835, 0xDD04 + _i3); // A-Z a-z Fraktur\n\n defineSymbol(math, main, mathord, _ch3, wideChar);\n defineSymbol(text, main, textord, _ch3, wideChar);\n wideChar = String.fromCharCode(0xD835, 0xDD6C + _i3); // A-Z a-z bold Fraktur\n\n defineSymbol(math, main, mathord, _ch3, wideChar);\n defineSymbol(text, main, textord, _ch3, wideChar);\n wideChar = String.fromCharCode(0xD835, 0xDDA0 + _i3); // A-Z a-z sans-serif\n\n defineSymbol(math, main, mathord, _ch3, wideChar);\n defineSymbol(text, main, textord, _ch3, wideChar);\n wideChar = String.fromCharCode(0xD835, 0xDDD4 + _i3); // A-Z a-z sans bold\n\n defineSymbol(math, main, mathord, _ch3, wideChar);\n defineSymbol(text, main, textord, _ch3, wideChar);\n wideChar = String.fromCharCode(0xD835, 0xDE08 + _i3); // A-Z a-z sans italic\n\n defineSymbol(math, main, mathord, _ch3, wideChar);\n defineSymbol(text, main, textord, _ch3, wideChar);\n wideChar = String.fromCharCode(0xD835, 0xDE70 + _i3); // A-Z a-z monospace\n\n defineSymbol(math, main, mathord, _ch3, wideChar);\n defineSymbol(text, main, textord, _ch3, wideChar);\n\n if (_i3 < 26) {\n // KaTeX fonts have only capital letters for blackboard bold and script.\n // See exception for k below.\n wideChar = String.fromCharCode(0xD835, 0xDD38 + _i3); // A-Z double struck\n\n defineSymbol(math, main, mathord, _ch3, wideChar);\n defineSymbol(text, main, textord, _ch3, wideChar);\n wideChar = String.fromCharCode(0xD835, 0xDC9C + _i3); // A-Z script\n\n defineSymbol(math, main, mathord, _ch3, wideChar);\n defineSymbol(text, main, textord, _ch3, wideChar);\n } // TODO: Add bold script when it is supported by a KaTeX font.\n\n} // \"k\" is the only double struck lower case letter in the KaTeX fonts.\n\n\nwideChar = String.fromCharCode(0xD835, 0xDD5C); // k double struck\n\ndefineSymbol(math, main, mathord, \"k\", wideChar);\ndefineSymbol(text, main, textord, \"k\", wideChar); // Next, some wide character numerals\n\nfor (var _i4 = 0; _i4 < 10; _i4++) {\n var _ch4 = _i4.toString();\n\n wideChar = String.fromCharCode(0xD835, 0xDFCE + _i4); // 0-9 bold\n\n defineSymbol(math, main, mathord, _ch4, wideChar);\n defineSymbol(text, main, textord, _ch4, wideChar);\n wideChar = String.fromCharCode(0xD835, 0xDFE2 + _i4); // 0-9 sans serif\n\n defineSymbol(math, main, mathord, _ch4, wideChar);\n defineSymbol(text, main, textord, _ch4, wideChar);\n wideChar = String.fromCharCode(0xD835, 0xDFEC + _i4); // 0-9 bold sans\n\n defineSymbol(math, main, mathord, _ch4, wideChar);\n defineSymbol(text, main, textord, _ch4, wideChar);\n wideChar = String.fromCharCode(0xD835, 0xDFF6 + _i4); // 0-9 monospace\n\n defineSymbol(math, main, mathord, _ch4, wideChar);\n defineSymbol(text, main, textord, _ch4, wideChar);\n} // We add these Latin-1 letters as symbols for backwards-compatibility,\n// but they are not actually in the font, nor are they supported by the\n// Unicode accent mechanism, so they fall back to Times font and look ugly.\n// TODO(edemaine): Fix this.\n\n\nvar extraLatin = \"\\u00d0\\u00de\\u00fe\";\n\nfor (var _i5 = 0; _i5 < extraLatin.length; _i5++) {\n var _ch5 = extraLatin.charAt(_i5);\n\n defineSymbol(math, main, mathord, _ch5, _ch5);\n defineSymbol(text, main, textord, _ch5, _ch5);\n}\n\n/**\n * This file provides support for Unicode range U+1D400 to U+1D7FF,\n * Mathematical Alphanumeric Symbols.\n *\n * Function wideCharacterFont takes a wide character as input and returns\n * the font information necessary to render it properly.\n */\n/**\n * Data below is from https://www.unicode.org/charts/PDF/U1D400.pdf\n * That document sorts characters into groups by font type, say bold or italic.\n *\n * In the arrays below, each subarray consists three elements:\n * * The CSS class of that group when in math mode.\n * * The CSS class of that group when in text mode.\n * * The font name, so that KaTeX can get font metrics.\n */\n\nvar wideLatinLetterData = [[\"mathbf\", \"textbf\", \"Main-Bold\"], // A-Z bold upright\n[\"mathbf\", \"textbf\", \"Main-Bold\"], // a-z bold upright\n[\"mathnormal\", \"textit\", \"Math-Italic\"], // A-Z italic\n[\"mathnormal\", \"textit\", \"Math-Italic\"], // a-z italic\n[\"boldsymbol\", \"boldsymbol\", \"Main-BoldItalic\"], // A-Z bold italic\n[\"boldsymbol\", \"boldsymbol\", \"Main-BoldItalic\"], // a-z bold italic\n// Map fancy A-Z letters to script, not calligraphic.\n// This aligns with unicode-math and math fonts (except Cambria Math).\n[\"mathscr\", \"textscr\", \"Script-Regular\"], // A-Z script\n[\"\", \"\", \"\"], // a-z script. No font\n[\"\", \"\", \"\"], // A-Z bold script. No font\n[\"\", \"\", \"\"], // a-z bold script. No font\n[\"mathfrak\", \"textfrak\", \"Fraktur-Regular\"], // A-Z Fraktur\n[\"mathfrak\", \"textfrak\", \"Fraktur-Regular\"], // a-z Fraktur\n[\"mathbb\", \"textbb\", \"AMS-Regular\"], // A-Z double-struck\n[\"mathbb\", \"textbb\", \"AMS-Regular\"], // k double-struck\n// Note that we are using a bold font, but font metrics for regular Fraktur.\n[\"mathboldfrak\", \"textboldfrak\", \"Fraktur-Regular\"], // A-Z bold Fraktur\n[\"mathboldfrak\", \"textboldfrak\", \"Fraktur-Regular\"], // a-z bold Fraktur\n[\"mathsf\", \"textsf\", \"SansSerif-Regular\"], // A-Z sans-serif\n[\"mathsf\", \"textsf\", \"SansSerif-Regular\"], // a-z sans-serif\n[\"mathboldsf\", \"textboldsf\", \"SansSerif-Bold\"], // A-Z bold sans-serif\n[\"mathboldsf\", \"textboldsf\", \"SansSerif-Bold\"], // a-z bold sans-serif\n[\"mathitsf\", \"textitsf\", \"SansSerif-Italic\"], // A-Z italic sans-serif\n[\"mathitsf\", \"textitsf\", \"SansSerif-Italic\"], // a-z italic sans-serif\n[\"\", \"\", \"\"], // A-Z bold italic sans. No font\n[\"\", \"\", \"\"], // a-z bold italic sans. No font\n[\"mathtt\", \"texttt\", \"Typewriter-Regular\"], // A-Z monospace\n[\"mathtt\", \"texttt\", \"Typewriter-Regular\"] // a-z monospace\n];\nvar wideNumeralData = [[\"mathbf\", \"textbf\", \"Main-Bold\"], // 0-9 bold\n[\"\", \"\", \"\"], // 0-9 double-struck. No KaTeX font.\n[\"mathsf\", \"textsf\", \"SansSerif-Regular\"], // 0-9 sans-serif\n[\"mathboldsf\", \"textboldsf\", \"SansSerif-Bold\"], // 0-9 bold sans-serif\n[\"mathtt\", \"texttt\", \"Typewriter-Regular\"] // 0-9 monospace\n];\nvar wideCharacterFont = function wideCharacterFont(wideChar, mode) {\n // IE doesn't support codePointAt(). So work with the surrogate pair.\n var H = wideChar.charCodeAt(0); // high surrogate\n\n var L = wideChar.charCodeAt(1); // low surrogate\n\n var codePoint = (H - 0xD800) * 0x400 + (L - 0xDC00) + 0x10000;\n var j = mode === \"math\" ? 0 : 1; // column index for CSS class.\n\n if (0x1D400 <= codePoint && codePoint < 0x1D6A4) {\n // wideLatinLetterData contains exactly 26 chars on each row.\n // So we can calculate the relevant row. No traverse necessary.\n var i = Math.floor((codePoint - 0x1D400) / 26);\n return [wideLatinLetterData[i][2], wideLatinLetterData[i][j]];\n } else if (0x1D7CE <= codePoint && codePoint <= 0x1D7FF) {\n // Numerals, ten per row.\n var _i = Math.floor((codePoint - 0x1D7CE) / 10);\n\n return [wideNumeralData[_i][2], wideNumeralData[_i][j]];\n } else if (codePoint === 0x1D6A5 || codePoint === 0x1D6A6) {\n // dotless i or j\n return [wideLatinLetterData[0][2], wideLatinLetterData[0][j]];\n } else if (0x1D6A6 < codePoint && codePoint < 0x1D7CE) {\n // Greek letters. Not supported, yet.\n return [\"\", \"\"];\n } else {\n // We don't support any wide characters outside 1D400–1D7FF.\n throw new ParseError(\"Unsupported character: \" + wideChar);\n }\n};\n\n/* eslint no-console:0 */\n\n/**\n * Looks up the given symbol in fontMetrics, after applying any symbol\n * replacements defined in symbol.js\n */\nvar lookupSymbol = function lookupSymbol(value, // TODO(#963): Use a union type for this.\nfontName, mode) {\n // Replace the value with its replaced value from symbol.js\n if (symbols[mode][value] && symbols[mode][value].replace) {\n value = symbols[mode][value].replace;\n }\n\n return {\n value: value,\n metrics: getCharacterMetrics(value, fontName, mode)\n };\n};\n/**\n * Makes a symbolNode after translation via the list of symbols in symbols.js.\n * Correctly pulls out metrics for the character, and optionally takes a list of\n * classes to be attached to the node.\n *\n * TODO: make argument order closer to makeSpan\n * TODO: add a separate argument for math class (e.g. `mop`, `mbin`), which\n * should if present come first in `classes`.\n * TODO(#953): Make `options` mandatory and always pass it in.\n */\n\n\nvar makeSymbol = function makeSymbol(value, fontName, mode, options, classes) {\n var lookup = lookupSymbol(value, fontName, mode);\n var metrics = lookup.metrics;\n value = lookup.value;\n var symbolNode;\n\n if (metrics) {\n var italic = metrics.italic;\n\n if (mode === \"text\" || options && options.font === \"mathit\") {\n italic = 0;\n }\n\n symbolNode = new SymbolNode(value, metrics.height, metrics.depth, italic, metrics.skew, metrics.width, classes);\n } else {\n // TODO(emily): Figure out a good way to only print this in development\n typeof console !== \"undefined\" && console.warn(\"No character metrics \" + (\"for '\" + value + \"' in style '\" + fontName + \"' and mode '\" + mode + \"'\"));\n symbolNode = new SymbolNode(value, 0, 0, 0, 0, 0, classes);\n }\n\n if (options) {\n symbolNode.maxFontSize = options.sizeMultiplier;\n\n if (options.style.isTight()) {\n symbolNode.classes.push(\"mtight\");\n }\n\n var color = options.getColor();\n\n if (color) {\n symbolNode.style.color = color;\n }\n }\n\n return symbolNode;\n};\n/**\n * Makes a symbol in Main-Regular or AMS-Regular.\n * Used for rel, bin, open, close, inner, and punct.\n */\n\n\nvar mathsym = function mathsym(value, mode, options, classes) {\n if (classes === void 0) {\n classes = [];\n }\n\n // Decide what font to render the symbol in by its entry in the symbols\n // table.\n // Have a special case for when the value = \\ because the \\ is used as a\n // textord in unsupported command errors but cannot be parsed as a regular\n // text ordinal and is therefore not present as a symbol in the symbols\n // table for text, as well as a special case for boldsymbol because it\n // can be used for bold + and -\n if (options.font === \"boldsymbol\" && lookupSymbol(value, \"Main-Bold\", mode).metrics) {\n return makeSymbol(value, \"Main-Bold\", mode, options, classes.concat([\"mathbf\"]));\n } else if (value === \"\\\\\" || symbols[mode][value].font === \"main\") {\n return makeSymbol(value, \"Main-Regular\", mode, options, classes);\n } else {\n return makeSymbol(value, \"AMS-Regular\", mode, options, classes.concat([\"amsrm\"]));\n }\n};\n/**\n * Determines which of the two font names (Main-Bold and Math-BoldItalic) and\n * corresponding style tags (mathbf or boldsymbol) to use for font \"boldsymbol\",\n * depending on the symbol. Use this function instead of fontMap for font\n * \"boldsymbol\".\n */\n\n\nvar boldsymbol = function boldsymbol(value, mode, options, classes, type) {\n if (type !== \"textord\" && lookupSymbol(value, \"Math-BoldItalic\", mode).metrics) {\n return {\n fontName: \"Math-BoldItalic\",\n fontClass: \"boldsymbol\"\n };\n } else {\n // Some glyphs do not exist in Math-BoldItalic so we need to use\n // Main-Bold instead.\n return {\n fontName: \"Main-Bold\",\n fontClass: \"mathbf\"\n };\n }\n};\n/**\n * Makes either a mathord or textord in the correct font and color.\n */\n\n\nvar makeOrd = function makeOrd(group, options, type) {\n var mode = group.mode;\n var text = group.text;\n var classes = [\"mord\"]; // Math mode or Old font (i.e. \\rm)\n\n var isFont = mode === \"math\" || mode === \"text\" && options.font;\n var fontOrFamily = isFont ? options.font : options.fontFamily;\n var wideFontName = \"\";\n var wideFontClass = \"\";\n\n if (text.charCodeAt(0) === 0xD835) {\n [wideFontName, wideFontClass] = wideCharacterFont(text, mode);\n }\n\n if (wideFontName.length > 0) {\n // surrogate pairs get special treatment\n return makeSymbol(text, wideFontName, mode, options, classes.concat(wideFontClass));\n } else if (fontOrFamily) {\n var fontName;\n var fontClasses;\n\n if (fontOrFamily === \"boldsymbol\") {\n var fontData = boldsymbol(text, mode, options, classes, type);\n fontName = fontData.fontName;\n fontClasses = [fontData.fontClass];\n } else if (isFont) {\n fontName = fontMap[fontOrFamily].fontName;\n fontClasses = [fontOrFamily];\n } else {\n fontName = retrieveTextFontName(fontOrFamily, options.fontWeight, options.fontShape);\n fontClasses = [fontOrFamily, options.fontWeight, options.fontShape];\n }\n\n if (lookupSymbol(text, fontName, mode).metrics) {\n return makeSymbol(text, fontName, mode, options, classes.concat(fontClasses));\n } else if (ligatures.hasOwnProperty(text) && fontName.slice(0, 10) === \"Typewriter\") {\n // Deconstruct ligatures in monospace fonts (\\texttt, \\tt).\n var parts = [];\n\n for (var i = 0; i < text.length; i++) {\n parts.push(makeSymbol(text[i], fontName, mode, options, classes.concat(fontClasses)));\n }\n\n return makeFragment(parts);\n }\n } // Makes a symbol in the default font for mathords and textords.\n\n\n if (type === \"mathord\") {\n return makeSymbol(text, \"Math-Italic\", mode, options, classes.concat([\"mathnormal\"]));\n } else if (type === \"textord\") {\n var font = symbols[mode][text] && symbols[mode][text].font;\n\n if (font === \"ams\") {\n var _fontName = retrieveTextFontName(\"amsrm\", options.fontWeight, options.fontShape);\n\n return makeSymbol(text, _fontName, mode, options, classes.concat(\"amsrm\", options.fontWeight, options.fontShape));\n } else if (font === \"main\" || !font) {\n var _fontName2 = retrieveTextFontName(\"textrm\", options.fontWeight, options.fontShape);\n\n return makeSymbol(text, _fontName2, mode, options, classes.concat(options.fontWeight, options.fontShape));\n } else {\n // fonts added by plugins\n var _fontName3 = retrieveTextFontName(font, options.fontWeight, options.fontShape); // We add font name as a css class\n\n\n return makeSymbol(text, _fontName3, mode, options, classes.concat(_fontName3, options.fontWeight, options.fontShape));\n }\n } else {\n throw new Error(\"unexpected type: \" + type + \" in makeOrd\");\n }\n};\n/**\n * Returns true if subsequent symbolNodes have the same classes, skew, maxFont,\n * and styles.\n */\n\n\nvar canCombine = (prev, next) => {\n if (createClass(prev.classes) !== createClass(next.classes) || prev.skew !== next.skew || prev.maxFontSize !== next.maxFontSize) {\n return false;\n } // If prev and next both are just \"mbin\"s or \"mord\"s we don't combine them\n // so that the proper spacing can be preserved.\n\n\n if (prev.classes.length === 1) {\n var cls = prev.classes[0];\n\n if (cls === \"mbin\" || cls === \"mord\") {\n return false;\n }\n }\n\n for (var style in prev.style) {\n if (prev.style.hasOwnProperty(style) && prev.style[style] !== next.style[style]) {\n return false;\n }\n }\n\n for (var _style in next.style) {\n if (next.style.hasOwnProperty(_style) && prev.style[_style] !== next.style[_style]) {\n return false;\n }\n }\n\n return true;\n};\n/**\n * Combine consecutive domTree.symbolNodes into a single symbolNode.\n * Note: this function mutates the argument.\n */\n\n\nvar tryCombineChars = chars => {\n for (var i = 0; i < chars.length - 1; i++) {\n var prev = chars[i];\n var next = chars[i + 1];\n\n if (prev instanceof SymbolNode && next instanceof SymbolNode && canCombine(prev, next)) {\n prev.text += next.text;\n prev.height = Math.max(prev.height, next.height);\n prev.depth = Math.max(prev.depth, next.depth); // Use the last character's italic correction since we use\n // it to add padding to the right of the span created from\n // the combined characters.\n\n prev.italic = next.italic;\n chars.splice(i + 1, 1);\n i--;\n }\n }\n\n return chars;\n};\n/**\n * Calculate the height, depth, and maxFontSize of an element based on its\n * children.\n */\n\n\nvar sizeElementFromChildren = function sizeElementFromChildren(elem) {\n var height = 0;\n var depth = 0;\n var maxFontSize = 0;\n\n for (var i = 0; i < elem.children.length; i++) {\n var child = elem.children[i];\n\n if (child.height > height) {\n height = child.height;\n }\n\n if (child.depth > depth) {\n depth = child.depth;\n }\n\n if (child.maxFontSize > maxFontSize) {\n maxFontSize = child.maxFontSize;\n }\n }\n\n elem.height = height;\n elem.depth = depth;\n elem.maxFontSize = maxFontSize;\n};\n/**\n * Makes a span with the given list of classes, list of children, and options.\n *\n * TODO(#953): Ensure that `options` is always provided (currently some call\n * sites don't pass it) and make the type below mandatory.\n * TODO: add a separate argument for math class (e.g. `mop`, `mbin`), which\n * should if present come first in `classes`.\n */\n\n\nvar makeSpan$2 = function makeSpan(classes, children, options, style) {\n var span = new Span(classes, children, options, style);\n sizeElementFromChildren(span);\n return span;\n}; // SVG one is simpler -- doesn't require height, depth, max-font setting.\n// This is also a separate method for typesafety.\n\n\nvar makeSvgSpan = (classes, children, options, style) => new Span(classes, children, options, style);\n\nvar makeLineSpan = function makeLineSpan(className, options, thickness) {\n var line = makeSpan$2([className], [], options);\n line.height = Math.max(thickness || options.fontMetrics().defaultRuleThickness, options.minRuleThickness);\n line.style.borderBottomWidth = makeEm(line.height);\n line.maxFontSize = 1.0;\n return line;\n};\n/**\n * Makes an anchor with the given href, list of classes, list of children,\n * and options.\n */\n\n\nvar makeAnchor = function makeAnchor(href, classes, children, options) {\n var anchor = new Anchor(href, classes, children, options);\n sizeElementFromChildren(anchor);\n return anchor;\n};\n/**\n * Makes a document fragment with the given list of children.\n */\n\n\nvar makeFragment = function makeFragment(children) {\n var fragment = new DocumentFragment(children);\n sizeElementFromChildren(fragment);\n return fragment;\n};\n/**\n * Wraps group in a span if it's a document fragment, allowing to apply classes\n * and styles\n */\n\n\nvar wrapFragment = function wrapFragment(group, options) {\n if (group instanceof DocumentFragment) {\n return makeSpan$2([], [group], options);\n }\n\n return group;\n}; // These are exact object types to catch typos in the names of the optional fields.\n\n\n// Computes the updated `children` list and the overall depth.\n//\n// This helper function for makeVList makes it easier to enforce type safety by\n// allowing early exits (returns) in the logic.\nvar getVListChildrenAndDepth = function getVListChildrenAndDepth(params) {\n if (params.positionType === \"individualShift\") {\n var oldChildren = params.children;\n var children = [oldChildren[0]]; // Add in kerns to the list of params.children to get each element to be\n // shifted to the correct specified shift\n\n var _depth = -oldChildren[0].shift - oldChildren[0].elem.depth;\n\n var currPos = _depth;\n\n for (var i = 1; i < oldChildren.length; i++) {\n var diff = -oldChildren[i].shift - currPos - oldChildren[i].elem.depth;\n var size = diff - (oldChildren[i - 1].elem.height + oldChildren[i - 1].elem.depth);\n currPos = currPos + diff;\n children.push({\n type: \"kern\",\n size\n });\n children.push(oldChildren[i]);\n }\n\n return {\n children,\n depth: _depth\n };\n }\n\n var depth;\n\n if (params.positionType === \"top\") {\n // We always start at the bottom, so calculate the bottom by adding up\n // all the sizes\n var bottom = params.positionData;\n\n for (var _i = 0; _i < params.children.length; _i++) {\n var child = params.children[_i];\n bottom -= child.type === \"kern\" ? child.size : child.elem.height + child.elem.depth;\n }\n\n depth = bottom;\n } else if (params.positionType === \"bottom\") {\n depth = -params.positionData;\n } else {\n var firstChild = params.children[0];\n\n if (firstChild.type !== \"elem\") {\n throw new Error('First child must have type \"elem\".');\n }\n\n if (params.positionType === \"shift\") {\n depth = -firstChild.elem.depth - params.positionData;\n } else if (params.positionType === \"firstBaseline\") {\n depth = -firstChild.elem.depth;\n } else {\n throw new Error(\"Invalid positionType \" + params.positionType + \".\");\n }\n }\n\n return {\n children: params.children,\n depth\n };\n};\n/**\n * Makes a vertical list by stacking elements and kerns on top of each other.\n * Allows for many different ways of specifying the positioning method.\n *\n * See VListParam documentation above.\n */\n\n\nvar makeVList = function makeVList(params, options) {\n var {\n children,\n depth\n } = getVListChildrenAndDepth(params); // Create a strut that is taller than any list item. The strut is added to\n // each item, where it will determine the item's baseline. Since it has\n // `overflow:hidden`, the strut's top edge will sit on the item's line box's\n // top edge and the strut's bottom edge will sit on the item's baseline,\n // with no additional line-height spacing. This allows the item baseline to\n // be positioned precisely without worrying about font ascent and\n // line-height.\n\n var pstrutSize = 0;\n\n for (var i = 0; i < children.length; i++) {\n var child = children[i];\n\n if (child.type === \"elem\") {\n var elem = child.elem;\n pstrutSize = Math.max(pstrutSize, elem.maxFontSize, elem.height);\n }\n }\n\n pstrutSize += 2;\n var pstrut = makeSpan$2([\"pstrut\"], []);\n pstrut.style.height = makeEm(pstrutSize); // Create a new list of actual children at the correct offsets\n\n var realChildren = [];\n var minPos = depth;\n var maxPos = depth;\n var currPos = depth;\n\n for (var _i2 = 0; _i2 < children.length; _i2++) {\n var _child = children[_i2];\n\n if (_child.type === \"kern\") {\n currPos += _child.size;\n } else {\n var _elem = _child.elem;\n var classes = _child.wrapperClasses || [];\n var style = _child.wrapperStyle || {};\n var childWrap = makeSpan$2(classes, [pstrut, _elem], undefined, style);\n childWrap.style.top = makeEm(-pstrutSize - currPos - _elem.depth);\n\n if (_child.marginLeft) {\n childWrap.style.marginLeft = _child.marginLeft;\n }\n\n if (_child.marginRight) {\n childWrap.style.marginRight = _child.marginRight;\n }\n\n realChildren.push(childWrap);\n currPos += _elem.height + _elem.depth;\n }\n\n minPos = Math.min(minPos, currPos);\n maxPos = Math.max(maxPos, currPos);\n } // The vlist contents go in a table-cell with `vertical-align:bottom`.\n // This cell's bottom edge will determine the containing table's baseline\n // without overly expanding the containing line-box.\n\n\n var vlist = makeSpan$2([\"vlist\"], realChildren);\n vlist.style.height = makeEm(maxPos); // A second row is used if necessary to represent the vlist's depth.\n\n var rows;\n\n if (minPos < 0) {\n // We will define depth in an empty span with display: table-cell.\n // It should render with the height that we define. But Chrome, in\n // contenteditable mode only, treats that span as if it contains some\n // text content. And that min-height over-rides our desired height.\n // So we put another empty span inside the depth strut span.\n var emptySpan = makeSpan$2([], []);\n var depthStrut = makeSpan$2([\"vlist\"], [emptySpan]);\n depthStrut.style.height = makeEm(-minPos); // Safari wants the first row to have inline content; otherwise it\n // puts the bottom of the *second* row on the baseline.\n\n var topStrut = makeSpan$2([\"vlist-s\"], [new SymbolNode(\"\\u200b\")]);\n rows = [makeSpan$2([\"vlist-r\"], [vlist, topStrut]), makeSpan$2([\"vlist-r\"], [depthStrut])];\n } else {\n rows = [makeSpan$2([\"vlist-r\"], [vlist])];\n }\n\n var vtable = makeSpan$2([\"vlist-t\"], rows);\n\n if (rows.length === 2) {\n vtable.classes.push(\"vlist-t2\");\n }\n\n vtable.height = maxPos;\n vtable.depth = -minPos;\n return vtable;\n}; // Glue is a concept from TeX which is a flexible space between elements in\n// either a vertical or horizontal list. In KaTeX, at least for now, it's\n// static space between elements in a horizontal layout.\n\n\nvar makeGlue = (measurement, options) => {\n // Make an empty span for the space\n var rule = makeSpan$2([\"mspace\"], [], options);\n var size = calculateSize(measurement, options);\n rule.style.marginRight = makeEm(size);\n return rule;\n}; // Takes font options, and returns the appropriate fontLookup name\n\n\nvar retrieveTextFontName = function retrieveTextFontName(fontFamily, fontWeight, fontShape) {\n var baseFontName = \"\";\n\n switch (fontFamily) {\n case \"amsrm\":\n baseFontName = \"AMS\";\n break;\n\n case \"textrm\":\n baseFontName = \"Main\";\n break;\n\n case \"textsf\":\n baseFontName = \"SansSerif\";\n break;\n\n case \"texttt\":\n baseFontName = \"Typewriter\";\n break;\n\n default:\n baseFontName = fontFamily;\n // use fonts added by a plugin\n }\n\n var fontStylesName;\n\n if (fontWeight === \"textbf\" && fontShape === \"textit\") {\n fontStylesName = \"BoldItalic\";\n } else if (fontWeight === \"textbf\") {\n fontStylesName = \"Bold\";\n } else if (fontWeight === \"textit\") {\n fontStylesName = \"Italic\";\n } else {\n fontStylesName = \"Regular\";\n }\n\n return baseFontName + \"-\" + fontStylesName;\n};\n/**\n * Maps TeX font commands to objects containing:\n * - variant: string used for \"mathvariant\" attribute in buildMathML.js\n * - fontName: the \"style\" parameter to fontMetrics.getCharacterMetrics\n */\n// A map between tex font commands an MathML mathvariant attribute values\n\n\nvar fontMap = {\n // styles\n \"mathbf\": {\n variant: \"bold\",\n fontName: \"Main-Bold\"\n },\n \"mathrm\": {\n variant: \"normal\",\n fontName: \"Main-Regular\"\n },\n \"textit\": {\n variant: \"italic\",\n fontName: \"Main-Italic\"\n },\n \"mathit\": {\n variant: \"italic\",\n fontName: \"Main-Italic\"\n },\n \"mathnormal\": {\n variant: \"italic\",\n fontName: \"Math-Italic\"\n },\n \"mathsfit\": {\n variant: \"sans-serif-italic\",\n fontName: \"SansSerif-Italic\"\n },\n // \"boldsymbol\" is missing because they require the use of multiple fonts:\n // Math-BoldItalic and Main-Bold. This is handled by a special case in\n // makeOrd which ends up calling boldsymbol.\n // families\n \"mathbb\": {\n variant: \"double-struck\",\n fontName: \"AMS-Regular\"\n },\n \"mathcal\": {\n variant: \"script\",\n fontName: \"Caligraphic-Regular\"\n },\n \"mathfrak\": {\n variant: \"fraktur\",\n fontName: \"Fraktur-Regular\"\n },\n \"mathscr\": {\n variant: \"script\",\n fontName: \"Script-Regular\"\n },\n \"mathsf\": {\n variant: \"sans-serif\",\n fontName: \"SansSerif-Regular\"\n },\n \"mathtt\": {\n variant: \"monospace\",\n fontName: \"Typewriter-Regular\"\n }\n};\nvar svgData = {\n // path, width, height\n vec: [\"vec\", 0.471, 0.714],\n // values from the font glyph\n oiintSize1: [\"oiintSize1\", 0.957, 0.499],\n // oval to overlay the integrand\n oiintSize2: [\"oiintSize2\", 1.472, 0.659],\n oiiintSize1: [\"oiiintSize1\", 1.304, 0.499],\n oiiintSize2: [\"oiiintSize2\", 1.98, 0.659]\n};\n\nvar staticSvg = function staticSvg(value, options) {\n // Create a span with inline SVG for the element.\n var [pathName, width, height] = svgData[value];\n var path = new PathNode(pathName);\n var svgNode = new SvgNode([path], {\n \"width\": makeEm(width),\n \"height\": makeEm(height),\n // Override CSS rule `.katex svg { width: 100% }`\n \"style\": \"width:\" + makeEm(width),\n \"viewBox\": \"0 0 \" + 1000 * width + \" \" + 1000 * height,\n \"preserveAspectRatio\": \"xMinYMin\"\n });\n var span = makeSvgSpan([\"overlay\"], [svgNode], options);\n span.height = height;\n span.style.height = makeEm(height);\n span.style.width = makeEm(width);\n return span;\n};\n\nvar buildCommon = {\n fontMap,\n makeSymbol,\n mathsym,\n makeSpan: makeSpan$2,\n makeSvgSpan,\n makeLineSpan,\n makeAnchor,\n makeFragment,\n wrapFragment,\n makeVList,\n makeOrd,\n makeGlue,\n staticSvg,\n svgData,\n tryCombineChars\n};\n\n/**\n * Describes spaces between different classes of atoms.\n */\nvar thinspace = {\n number: 3,\n unit: \"mu\"\n};\nvar mediumspace = {\n number: 4,\n unit: \"mu\"\n};\nvar thickspace = {\n number: 5,\n unit: \"mu\"\n}; // Making the type below exact with all optional fields doesn't work due to\n// - https://github.com/facebook/flow/issues/4582\n// - https://github.com/facebook/flow/issues/5688\n// However, since *all* fields are optional, $Shape<> works as suggested in 5688\n// above.\n\n// Spacing relationships for display and text styles\nvar spacings = {\n mord: {\n mop: thinspace,\n mbin: mediumspace,\n mrel: thickspace,\n minner: thinspace\n },\n mop: {\n mord: thinspace,\n mop: thinspace,\n mrel: thickspace,\n minner: thinspace\n },\n mbin: {\n mord: mediumspace,\n mop: mediumspace,\n mopen: mediumspace,\n minner: mediumspace\n },\n mrel: {\n mord: thickspace,\n mop: thickspace,\n mopen: thickspace,\n minner: thickspace\n },\n mopen: {},\n mclose: {\n mop: thinspace,\n mbin: mediumspace,\n mrel: thickspace,\n minner: thinspace\n },\n mpunct: {\n mord: thinspace,\n mop: thinspace,\n mrel: thickspace,\n mopen: thinspace,\n mclose: thinspace,\n mpunct: thinspace,\n minner: thinspace\n },\n minner: {\n mord: thinspace,\n mop: thinspace,\n mbin: mediumspace,\n mrel: thickspace,\n mopen: thinspace,\n mpunct: thinspace,\n minner: thinspace\n }\n}; // Spacing relationships for script and scriptscript styles\n\nvar tightSpacings = {\n mord: {\n mop: thinspace\n },\n mop: {\n mord: thinspace,\n mop: thinspace\n },\n mbin: {},\n mrel: {},\n mopen: {},\n mclose: {\n mop: thinspace\n },\n mpunct: {},\n minner: {\n mop: thinspace\n }\n};\n\n/** Context provided to function handlers for error messages. */\n// Note: reverse the order of the return type union will cause a flow error.\n// See https://github.com/facebook/flow/issues/3663.\n// More general version of `HtmlBuilder` for nodes (e.g. \\sum, accent types)\n// whose presence impacts super/subscripting. In this case, ParseNode<\"supsub\">\n// delegates its HTML building to the HtmlBuilder corresponding to these nodes.\n\n/**\n * Final function spec for use at parse time.\n * This is almost identical to `FunctionPropSpec`, except it\n * 1. includes the function handler, and\n * 2. requires all arguments except argTypes.\n * It is generated by `defineFunction()` below.\n */\n\n/**\n * All registered functions.\n * `functions.js` just exports this same dictionary again and makes it public.\n * `Parser.js` requires this dictionary.\n */\nvar _functions = {};\n/**\n * All HTML builders. Should be only used in the `define*` and the `build*ML`\n * functions.\n */\n\nvar _htmlGroupBuilders = {};\n/**\n * All MathML builders. Should be only used in the `define*` and the `build*ML`\n * functions.\n */\n\nvar _mathmlGroupBuilders = {};\nfunction defineFunction(_ref) {\n var {\n type,\n names,\n props,\n handler,\n htmlBuilder,\n mathmlBuilder\n } = _ref;\n // Set default values of functions\n var data = {\n type,\n numArgs: props.numArgs,\n argTypes: props.argTypes,\n allowedInArgument: !!props.allowedInArgument,\n allowedInText: !!props.allowedInText,\n allowedInMath: props.allowedInMath === undefined ? true : props.allowedInMath,\n numOptionalArgs: props.numOptionalArgs || 0,\n infix: !!props.infix,\n primitive: !!props.primitive,\n handler: handler\n };\n\n for (var i = 0; i < names.length; ++i) {\n _functions[names[i]] = data;\n }\n\n if (type) {\n if (htmlBuilder) {\n _htmlGroupBuilders[type] = htmlBuilder;\n }\n\n if (mathmlBuilder) {\n _mathmlGroupBuilders[type] = mathmlBuilder;\n }\n }\n}\n/**\n * Use this to register only the HTML and MathML builders for a function (e.g.\n * if the function's ParseNode is generated in Parser.js rather than via a\n * stand-alone handler provided to `defineFunction`).\n */\n\nfunction defineFunctionBuilders(_ref2) {\n var {\n type,\n htmlBuilder,\n mathmlBuilder\n } = _ref2;\n defineFunction({\n type,\n names: [],\n props: {\n numArgs: 0\n },\n\n handler() {\n throw new Error('Should never be called.');\n },\n\n htmlBuilder,\n mathmlBuilder\n });\n}\nvar normalizeArgument = function normalizeArgument(arg) {\n return arg.type === \"ordgroup\" && arg.body.length === 1 ? arg.body[0] : arg;\n}; // Since the corresponding buildHTML/buildMathML function expects a\n// list of elements, we normalize for different kinds of arguments\n\nvar ordargument = function ordargument(arg) {\n return arg.type === \"ordgroup\" ? arg.body : [arg];\n};\n\n/**\n * This file does the main work of building a domTree structure from a parse\n * tree. The entry point is the `buildHTML` function, which takes a parse tree.\n * Then, the buildExpression, buildGroup, and various groupBuilders functions\n * are called, to produce a final HTML tree.\n */\nvar makeSpan$1 = buildCommon.makeSpan; // Binary atoms (first class `mbin`) change into ordinary atoms (`mord`)\n// depending on their surroundings. See TeXbook pg. 442-446, Rules 5 and 6,\n// and the text before Rule 19.\n\nvar binLeftCanceller = [\"leftmost\", \"mbin\", \"mopen\", \"mrel\", \"mop\", \"mpunct\"];\nvar binRightCanceller = [\"rightmost\", \"mrel\", \"mclose\", \"mpunct\"];\nvar styleMap$1 = {\n \"display\": Style$1.DISPLAY,\n \"text\": Style$1.TEXT,\n \"script\": Style$1.SCRIPT,\n \"scriptscript\": Style$1.SCRIPTSCRIPT\n};\nvar DomEnum = {\n mord: \"mord\",\n mop: \"mop\",\n mbin: \"mbin\",\n mrel: \"mrel\",\n mopen: \"mopen\",\n mclose: \"mclose\",\n mpunct: \"mpunct\",\n minner: \"minner\"\n};\n\n/**\n * Take a list of nodes, build them in order, and return a list of the built\n * nodes. documentFragments are flattened into their contents, so the\n * returned list contains no fragments. `isRealGroup` is true if `expression`\n * is a real group (no atoms will be added on either side), as opposed to\n * a partial group (e.g. one created by \\color). `surrounding` is an array\n * consisting type of nodes that will be added to the left and right.\n */\nvar buildExpression$1 = function buildExpression(expression, options, isRealGroup, surrounding) {\n if (surrounding === void 0) {\n surrounding = [null, null];\n }\n\n // Parse expressions into `groups`.\n var groups = [];\n\n for (var i = 0; i < expression.length; i++) {\n var output = buildGroup$1(expression[i], options);\n\n if (output instanceof DocumentFragment) {\n var children = output.children;\n groups.push(...children);\n } else {\n groups.push(output);\n }\n } // Combine consecutive domTree.symbolNodes into a single symbolNode.\n\n\n buildCommon.tryCombineChars(groups); // If `expression` is a partial group, let the parent handle spacings\n // to avoid processing groups multiple times.\n\n if (!isRealGroup) {\n return groups;\n }\n\n var glueOptions = options;\n\n if (expression.length === 1) {\n var node = expression[0];\n\n if (node.type === \"sizing\") {\n glueOptions = options.havingSize(node.size);\n } else if (node.type === \"styling\") {\n glueOptions = options.havingStyle(styleMap$1[node.style]);\n }\n } // Dummy spans for determining spacings between surrounding atoms.\n // If `expression` has no atoms on the left or right, class \"leftmost\"\n // or \"rightmost\", respectively, is used to indicate it.\n\n\n var dummyPrev = makeSpan$1([surrounding[0] || \"leftmost\"], [], options);\n var dummyNext = makeSpan$1([surrounding[1] || \"rightmost\"], [], options); // TODO: These code assumes that a node's math class is the first element\n // of its `classes` array. A later cleanup should ensure this, for\n // instance by changing the signature of `makeSpan`.\n // Before determining what spaces to insert, perform bin cancellation.\n // Binary operators change to ordinary symbols in some contexts.\n\n var isRoot = isRealGroup === \"root\";\n traverseNonSpaceNodes(groups, (node, prev) => {\n var prevType = prev.classes[0];\n var type = node.classes[0];\n\n if (prevType === \"mbin\" && utils.contains(binRightCanceller, type)) {\n prev.classes[0] = \"mord\";\n } else if (type === \"mbin\" && utils.contains(binLeftCanceller, prevType)) {\n node.classes[0] = \"mord\";\n }\n }, {\n node: dummyPrev\n }, dummyNext, isRoot);\n traverseNonSpaceNodes(groups, (node, prev) => {\n var prevType = getTypeOfDomTree(prev);\n var type = getTypeOfDomTree(node); // 'mtight' indicates that the node is script or scriptscript style.\n\n var space = prevType && type ? node.hasClass(\"mtight\") ? tightSpacings[prevType][type] : spacings[prevType][type] : null;\n\n if (space) {\n // Insert glue (spacing) after the `prev`.\n return buildCommon.makeGlue(space, glueOptions);\n }\n }, {\n node: dummyPrev\n }, dummyNext, isRoot);\n return groups;\n}; // Depth-first traverse non-space `nodes`, calling `callback` with the current and\n// previous node as arguments, optionally returning a node to insert after the\n// previous node. `prev` is an object with the previous node and `insertAfter`\n// function to insert after it. `next` is a node that will be added to the right.\n// Used for bin cancellation and inserting spacings.\n\nvar traverseNonSpaceNodes = function traverseNonSpaceNodes(nodes, callback, prev, next, isRoot) {\n if (next) {\n // temporarily append the right node, if exists\n nodes.push(next);\n }\n\n var i = 0;\n\n for (; i < nodes.length; i++) {\n var node = nodes[i];\n var partialGroup = checkPartialGroup(node);\n\n if (partialGroup) {\n // Recursive DFS\n // $FlowFixMe: make nodes a $ReadOnlyArray by returning a new array\n traverseNonSpaceNodes(partialGroup.children, callback, prev, null, isRoot);\n continue;\n } // Ignore explicit spaces (e.g., \\;, \\,) when determining what implicit\n // spacing should go between atoms of different classes\n\n\n var nonspace = !node.hasClass(\"mspace\");\n\n if (nonspace) {\n var result = callback(node, prev.node);\n\n if (result) {\n if (prev.insertAfter) {\n prev.insertAfter(result);\n } else {\n // insert at front\n nodes.unshift(result);\n i++;\n }\n }\n }\n\n if (nonspace) {\n prev.node = node;\n } else if (isRoot && node.hasClass(\"newline\")) {\n prev.node = makeSpan$1([\"leftmost\"]); // treat like beginning of line\n }\n\n prev.insertAfter = (index => n => {\n nodes.splice(index + 1, 0, n);\n i++;\n })(i);\n }\n\n if (next) {\n nodes.pop();\n }\n}; // Check if given node is a partial group, i.e., does not affect spacing around.\n\n\nvar checkPartialGroup = function checkPartialGroup(node) {\n if (node instanceof DocumentFragment || node instanceof Anchor || node instanceof Span && node.hasClass(\"enclosing\")) {\n return node;\n }\n\n return null;\n}; // Return the outermost node of a domTree.\n\n\nvar getOutermostNode = function getOutermostNode(node, side) {\n var partialGroup = checkPartialGroup(node);\n\n if (partialGroup) {\n var children = partialGroup.children;\n\n if (children.length) {\n if (side === \"right\") {\n return getOutermostNode(children[children.length - 1], \"right\");\n } else if (side === \"left\") {\n return getOutermostNode(children[0], \"left\");\n }\n }\n }\n\n return node;\n}; // Return math atom class (mclass) of a domTree.\n// If `side` is given, it will get the type of the outermost node at given side.\n\n\nvar getTypeOfDomTree = function getTypeOfDomTree(node, side) {\n if (!node) {\n return null;\n }\n\n if (side) {\n node = getOutermostNode(node, side);\n } // This makes a lot of assumptions as to where the type of atom\n // appears. We should do a better job of enforcing this.\n\n\n return DomEnum[node.classes[0]] || null;\n};\nvar makeNullDelimiter = function makeNullDelimiter(options, classes) {\n var moreClasses = [\"nulldelimiter\"].concat(options.baseSizingClasses());\n return makeSpan$1(classes.concat(moreClasses));\n};\n/**\n * buildGroup is the function that takes a group and calls the correct groupType\n * function for it. It also handles the interaction of size and style changes\n * between parents and children.\n */\n\nvar buildGroup$1 = function buildGroup(group, options, baseOptions) {\n if (!group) {\n return makeSpan$1();\n }\n\n if (_htmlGroupBuilders[group.type]) {\n // Call the groupBuilders function\n // $FlowFixMe\n var groupNode = _htmlGroupBuilders[group.type](group, options); // If the size changed between the parent and the current group, account\n // for that size difference.\n\n if (baseOptions && options.size !== baseOptions.size) {\n groupNode = makeSpan$1(options.sizingClasses(baseOptions), [groupNode], options);\n var multiplier = options.sizeMultiplier / baseOptions.sizeMultiplier;\n groupNode.height *= multiplier;\n groupNode.depth *= multiplier;\n }\n\n return groupNode;\n } else {\n throw new ParseError(\"Got group of unknown type: '\" + group.type + \"'\");\n }\n};\n/**\n * Combine an array of HTML DOM nodes (e.g., the output of `buildExpression`)\n * into an unbreakable HTML node of class .base, with proper struts to\n * guarantee correct vertical extent. `buildHTML` calls this repeatedly to\n * make up the entire expression as a sequence of unbreakable units.\n */\n\nfunction buildHTMLUnbreakable(children, options) {\n // Compute height and depth of this chunk.\n var body = makeSpan$1([\"base\"], children, options); // Add strut, which ensures that the top of the HTML element falls at\n // the height of the expression, and the bottom of the HTML element\n // falls at the depth of the expression.\n\n var strut = makeSpan$1([\"strut\"]);\n strut.style.height = makeEm(body.height + body.depth);\n\n if (body.depth) {\n strut.style.verticalAlign = makeEm(-body.depth);\n }\n\n body.children.unshift(strut);\n return body;\n}\n/**\n * Take an entire parse tree, and build it into an appropriate set of HTML\n * nodes.\n */\n\n\nfunction buildHTML(tree, options) {\n // Strip off outer tag wrapper for processing below.\n var tag = null;\n\n if (tree.length === 1 && tree[0].type === \"tag\") {\n tag = tree[0].tag;\n tree = tree[0].body;\n } // Build the expression contained in the tree\n\n\n var expression = buildExpression$1(tree, options, \"root\");\n var eqnNum;\n\n if (expression.length === 2 && expression[1].hasClass(\"tag\")) {\n // An environment with automatic equation numbers, e.g. {gather}.\n eqnNum = expression.pop();\n }\n\n var children = []; // Create one base node for each chunk between potential line breaks.\n // The TeXBook [p.173] says \"A formula will be broken only after a\n // relation symbol like $=$ or $<$ or $\\rightarrow$, or after a binary\n // operation symbol like $+$ or $-$ or $\\times$, where the relation or\n // binary operation is on the ``outer level'' of the formula (i.e., not\n // enclosed in {...} and not part of an \\over construction).\"\n\n var parts = [];\n\n for (var i = 0; i < expression.length; i++) {\n parts.push(expression[i]);\n\n if (expression[i].hasClass(\"mbin\") || expression[i].hasClass(\"mrel\") || expression[i].hasClass(\"allowbreak\")) {\n // Put any post-operator glue on same line as operator.\n // Watch for \\nobreak along the way, and stop at \\newline.\n var nobreak = false;\n\n while (i < expression.length - 1 && expression[i + 1].hasClass(\"mspace\") && !expression[i + 1].hasClass(\"newline\")) {\n i++;\n parts.push(expression[i]);\n\n if (expression[i].hasClass(\"nobreak\")) {\n nobreak = true;\n }\n } // Don't allow break if \\nobreak among the post-operator glue.\n\n\n if (!nobreak) {\n children.push(buildHTMLUnbreakable(parts, options));\n parts = [];\n }\n } else if (expression[i].hasClass(\"newline\")) {\n // Write the line except the newline\n parts.pop();\n\n if (parts.length > 0) {\n children.push(buildHTMLUnbreakable(parts, options));\n parts = [];\n } // Put the newline at the top level\n\n\n children.push(expression[i]);\n }\n }\n\n if (parts.length > 0) {\n children.push(buildHTMLUnbreakable(parts, options));\n } // Now, if there was a tag, build it too and append it as a final child.\n\n\n var tagChild;\n\n if (tag) {\n tagChild = buildHTMLUnbreakable(buildExpression$1(tag, options, true));\n tagChild.classes = [\"tag\"];\n children.push(tagChild);\n } else if (eqnNum) {\n children.push(eqnNum);\n }\n\n var htmlNode = makeSpan$1([\"katex-html\"], children);\n htmlNode.setAttribute(\"aria-hidden\", \"true\"); // Adjust the strut of the tag to be the maximum height of all children\n // (the height of the enclosing htmlNode) for proper vertical alignment.\n\n if (tagChild) {\n var strut = tagChild.children[0];\n strut.style.height = makeEm(htmlNode.height + htmlNode.depth);\n\n if (htmlNode.depth) {\n strut.style.verticalAlign = makeEm(-htmlNode.depth);\n }\n }\n\n return htmlNode;\n}\n\n/**\n * These objects store data about MathML nodes. This is the MathML equivalent\n * of the types in domTree.js. Since MathML handles its own rendering, and\n * since we're mainly using MathML to improve accessibility, we don't manage\n * any of the styling state that the plain DOM nodes do.\n *\n * The `toNode` and `toMarkup` functions work similarly to how they do in\n * domTree.js, creating namespaced DOM nodes and HTML text markup respectively.\n */\nfunction newDocumentFragment(children) {\n return new DocumentFragment(children);\n}\n/**\n * This node represents a general purpose MathML node of any type. The\n * constructor requires the type of node to create (for example, `\"mo\"` or\n * `\"mspace\"`, corresponding to `` and `` tags).\n */\n\nclass MathNode {\n constructor(type, children, classes) {\n this.type = void 0;\n this.attributes = void 0;\n this.children = void 0;\n this.classes = void 0;\n this.type = type;\n this.attributes = {};\n this.children = children || [];\n this.classes = classes || [];\n }\n /**\n * Sets an attribute on a MathML node. MathML depends on attributes to convey a\n * semantic content, so this is used heavily.\n */\n\n\n setAttribute(name, value) {\n this.attributes[name] = value;\n }\n /**\n * Gets an attribute on a MathML node.\n */\n\n\n getAttribute(name) {\n return this.attributes[name];\n }\n /**\n * Converts the math node into a MathML-namespaced DOM element.\n */\n\n\n toNode() {\n var node = document.createElementNS(\"http://www.w3.org/1998/Math/MathML\", this.type);\n\n for (var attr in this.attributes) {\n if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {\n node.setAttribute(attr, this.attributes[attr]);\n }\n }\n\n if (this.classes.length > 0) {\n node.className = createClass(this.classes);\n }\n\n for (var i = 0; i < this.children.length; i++) {\n // Combine multiple TextNodes into one TextNode, to prevent\n // screen readers from reading each as a separate word [#3995]\n if (this.children[i] instanceof TextNode && this.children[i + 1] instanceof TextNode) {\n var text = this.children[i].toText() + this.children[++i].toText();\n\n while (this.children[i + 1] instanceof TextNode) {\n text += this.children[++i].toText();\n }\n\n node.appendChild(new TextNode(text).toNode());\n } else {\n node.appendChild(this.children[i].toNode());\n }\n }\n\n return node;\n }\n /**\n * Converts the math node into an HTML markup string.\n */\n\n\n toMarkup() {\n var markup = \"<\" + this.type; // Add the attributes\n\n for (var attr in this.attributes) {\n if (Object.prototype.hasOwnProperty.call(this.attributes, attr)) {\n markup += \" \" + attr + \"=\\\"\";\n markup += utils.escape(this.attributes[attr]);\n markup += \"\\\"\";\n }\n }\n\n if (this.classes.length > 0) {\n markup += \" class =\\\"\" + utils.escape(createClass(this.classes)) + \"\\\"\";\n }\n\n markup += \">\";\n\n for (var i = 0; i < this.children.length; i++) {\n markup += this.children[i].toMarkup();\n }\n\n markup += \"\";\n return markup;\n }\n /**\n * Converts the math node into a string, similar to innerText, but escaped.\n */\n\n\n toText() {\n return this.children.map(child => child.toText()).join(\"\");\n }\n\n}\n/**\n * This node represents a piece of text.\n */\n\nclass TextNode {\n constructor(text) {\n this.text = void 0;\n this.text = text;\n }\n /**\n * Converts the text node into a DOM text node.\n */\n\n\n toNode() {\n return document.createTextNode(this.text);\n }\n /**\n * Converts the text node into escaped HTML markup\n * (representing the text itself).\n */\n\n\n toMarkup() {\n return utils.escape(this.toText());\n }\n /**\n * Converts the text node into a string\n * (representing the text itself).\n */\n\n\n toText() {\n return this.text;\n }\n\n}\n/**\n * This node represents a space, but may render as or as text,\n * depending on the width.\n */\n\nclass SpaceNode {\n /**\n * Create a Space node with width given in CSS ems.\n */\n constructor(width) {\n this.width = void 0;\n this.character = void 0;\n this.width = width; // See https://www.w3.org/TR/2000/WD-MathML2-20000328/chapter6.html\n // for a table of space-like characters. We use Unicode\n // representations instead of &LongNames; as it's not clear how to\n // make the latter via document.createTextNode.\n\n if (width >= 0.05555 && width <= 0.05556) {\n this.character = \"\\u200a\"; //  \n } else if (width >= 0.1666 && width <= 0.1667) {\n this.character = \"\\u2009\"; //  \n } else if (width >= 0.2222 && width <= 0.2223) {\n this.character = \"\\u2005\"; //  \n } else if (width >= 0.2777 && width <= 0.2778) {\n this.character = \"\\u2005\\u200a\"; //   \n } else if (width >= -0.05556 && width <= -0.05555) {\n this.character = \"\\u200a\\u2063\"; // ​\n } else if (width >= -0.1667 && width <= -0.1666) {\n this.character = \"\\u2009\\u2063\"; // ​\n } else if (width >= -0.2223 && width <= -0.2222) {\n this.character = \"\\u205f\\u2063\"; // ​\n } else if (width >= -0.2778 && width <= -0.2777) {\n this.character = \"\\u2005\\u2063\"; // ​\n } else {\n this.character = null;\n }\n }\n /**\n * Converts the math node into a MathML-namespaced DOM element.\n */\n\n\n toNode() {\n if (this.character) {\n return document.createTextNode(this.character);\n } else {\n var node = document.createElementNS(\"http://www.w3.org/1998/Math/MathML\", \"mspace\");\n node.setAttribute(\"width\", makeEm(this.width));\n return node;\n }\n }\n /**\n * Converts the math node into an HTML markup string.\n */\n\n\n toMarkup() {\n if (this.character) {\n return \"\" + this.character + \"\";\n } else {\n return \"\";\n }\n }\n /**\n * Converts the math node into a string, similar to innerText.\n */\n\n\n toText() {\n if (this.character) {\n return this.character;\n } else {\n return \" \";\n }\n }\n\n}\n\nvar mathMLTree = {\n MathNode,\n TextNode,\n SpaceNode,\n newDocumentFragment\n};\n\n/**\n * This file converts a parse tree into a corresponding MathML tree. The main\n * entry point is the `buildMathML` function, which takes a parse tree from the\n * parser.\n */\n\n/**\n * Takes a symbol and converts it into a MathML text node after performing\n * optional replacement from symbols.js.\n */\nvar makeText = function makeText(text, mode, options) {\n if (symbols[mode][text] && symbols[mode][text].replace && text.charCodeAt(0) !== 0xD835 && !(ligatures.hasOwnProperty(text) && options && (options.fontFamily && options.fontFamily.slice(4, 6) === \"tt\" || options.font && options.font.slice(4, 6) === \"tt\"))) {\n text = symbols[mode][text].replace;\n }\n\n return new mathMLTree.TextNode(text);\n};\n/**\n * Wrap the given array of nodes in an node if needed, i.e.,\n * unless the array has length 1. Always returns a single node.\n */\n\nvar makeRow = function makeRow(body) {\n if (body.length === 1) {\n return body[0];\n } else {\n return new mathMLTree.MathNode(\"mrow\", body);\n }\n};\n/**\n * Returns the math variant as a string or null if none is required.\n */\n\nvar getVariant = function getVariant(group, options) {\n // Handle \\text... font specifiers as best we can.\n // MathML has a limited list of allowable mathvariant specifiers; see\n // https://www.w3.org/TR/MathML3/chapter3.html#presm.commatt\n if (options.fontFamily === \"texttt\") {\n return \"monospace\";\n } else if (options.fontFamily === \"textsf\") {\n if (options.fontShape === \"textit\" && options.fontWeight === \"textbf\") {\n return \"sans-serif-bold-italic\";\n } else if (options.fontShape === \"textit\") {\n return \"sans-serif-italic\";\n } else if (options.fontWeight === \"textbf\") {\n return \"bold-sans-serif\";\n } else {\n return \"sans-serif\";\n }\n } else if (options.fontShape === \"textit\" && options.fontWeight === \"textbf\") {\n return \"bold-italic\";\n } else if (options.fontShape === \"textit\") {\n return \"italic\";\n } else if (options.fontWeight === \"textbf\") {\n return \"bold\";\n }\n\n var font = options.font;\n\n if (!font || font === \"mathnormal\") {\n return null;\n }\n\n var mode = group.mode;\n\n if (font === \"mathit\") {\n return \"italic\";\n } else if (font === \"boldsymbol\") {\n return group.type === \"textord\" ? \"bold\" : \"bold-italic\";\n } else if (font === \"mathbf\") {\n return \"bold\";\n } else if (font === \"mathbb\") {\n return \"double-struck\";\n } else if (font === \"mathsfit\") {\n return \"sans-serif-italic\";\n } else if (font === \"mathfrak\") {\n return \"fraktur\";\n } else if (font === \"mathscr\" || font === \"mathcal\") {\n // MathML makes no distinction between script and calligraphic\n return \"script\";\n } else if (font === \"mathsf\") {\n return \"sans-serif\";\n } else if (font === \"mathtt\") {\n return \"monospace\";\n }\n\n var text = group.text;\n\n if (utils.contains([\"\\\\imath\", \"\\\\jmath\"], text)) {\n return null;\n }\n\n if (symbols[mode][text] && symbols[mode][text].replace) {\n text = symbols[mode][text].replace;\n }\n\n var fontName = buildCommon.fontMap[font].fontName;\n\n if (getCharacterMetrics(text, fontName, mode)) {\n return buildCommon.fontMap[font].variant;\n }\n\n return null;\n};\n/**\n * Check for . which is how a dot renders in MathML,\n * or ,\n * which is how a braced comma {,} renders in MathML\n */\n\nfunction isNumberPunctuation(group) {\n if (!group) {\n return false;\n }\n\n if (group.type === 'mi' && group.children.length === 1) {\n var child = group.children[0];\n return child instanceof TextNode && child.text === '.';\n } else if (group.type === 'mo' && group.children.length === 1 && group.getAttribute('separator') === 'true' && group.getAttribute('lspace') === '0em' && group.getAttribute('rspace') === '0em') {\n var _child = group.children[0];\n return _child instanceof TextNode && _child.text === ',';\n } else {\n return false;\n }\n}\n/**\n * Takes a list of nodes, builds them, and returns a list of the generated\n * MathML nodes. Also combine consecutive outputs into a single\n * tag.\n */\n\n\nvar buildExpression = function buildExpression(expression, options, isOrdgroup) {\n if (expression.length === 1) {\n var group = buildGroup(expression[0], options);\n\n if (isOrdgroup && group instanceof MathNode && group.type === \"mo\") {\n // When TeX writers want to suppress spacing on an operator,\n // they often put the operator by itself inside braces.\n group.setAttribute(\"lspace\", \"0em\");\n group.setAttribute(\"rspace\", \"0em\");\n }\n\n return [group];\n }\n\n var groups = [];\n var lastGroup;\n\n for (var i = 0; i < expression.length; i++) {\n var _group = buildGroup(expression[i], options);\n\n if (_group instanceof MathNode && lastGroup instanceof MathNode) {\n // Concatenate adjacent s\n if (_group.type === 'mtext' && lastGroup.type === 'mtext' && _group.getAttribute('mathvariant') === lastGroup.getAttribute('mathvariant')) {\n lastGroup.children.push(..._group.children);\n continue; // Concatenate adjacent s\n } else if (_group.type === 'mn' && lastGroup.type === 'mn') {\n lastGroup.children.push(..._group.children);\n continue; // Concatenate ... followed by .\n } else if (isNumberPunctuation(_group) && lastGroup.type === 'mn') {\n lastGroup.children.push(..._group.children);\n continue; // Concatenate . followed by ...\n } else if (_group.type === 'mn' && isNumberPunctuation(lastGroup)) {\n _group.children = [...lastGroup.children, ..._group.children];\n groups.pop(); // Put preceding ... or . inside base of\n // ...base......exponent... (or )\n } else if ((_group.type === 'msup' || _group.type === 'msub') && _group.children.length >= 1 && (lastGroup.type === 'mn' || isNumberPunctuation(lastGroup))) {\n var base = _group.children[0];\n\n if (base instanceof MathNode && base.type === 'mn') {\n base.children = [...lastGroup.children, ...base.children];\n groups.pop();\n } // \\not\n\n } else if (lastGroup.type === 'mi' && lastGroup.children.length === 1) {\n var lastChild = lastGroup.children[0];\n\n if (lastChild instanceof TextNode && lastChild.text === '\\u0338' && (_group.type === 'mo' || _group.type === 'mi' || _group.type === 'mn')) {\n var child = _group.children[0];\n\n if (child instanceof TextNode && child.text.length > 0) {\n // Overlay with combining character long solidus\n child.text = child.text.slice(0, 1) + \"\\u0338\" + child.text.slice(1);\n groups.pop();\n }\n }\n }\n }\n\n groups.push(_group);\n lastGroup = _group;\n }\n\n return groups;\n};\n/**\n * Equivalent to buildExpression, but wraps the elements in an \n * if there's more than one. Returns a single node instead of an array.\n */\n\nvar buildExpressionRow = function buildExpressionRow(expression, options, isOrdgroup) {\n return makeRow(buildExpression(expression, options, isOrdgroup));\n};\n/**\n * Takes a group from the parser and calls the appropriate groupBuilders function\n * on it to produce a MathML node.\n */\n\nvar buildGroup = function buildGroup(group, options) {\n if (!group) {\n return new mathMLTree.MathNode(\"mrow\");\n }\n\n if (_mathmlGroupBuilders[group.type]) {\n // Call the groupBuilders function\n // $FlowFixMe\n var result = _mathmlGroupBuilders[group.type](group, options); // $FlowFixMe\n\n return result;\n } else {\n throw new ParseError(\"Got group of unknown type: '\" + group.type + \"'\");\n }\n};\n/**\n * Takes a full parse tree and settings and builds a MathML representation of\n * it. In particular, we put the elements from building the parse tree into a\n * tag so we can also include that TeX source as an annotation.\n *\n * Note that we actually return a domTree element with a `` inside it so\n * we can do appropriate styling.\n */\n\nfunction buildMathML(tree, texExpression, options, isDisplayMode, forMathmlOnly) {\n var expression = buildExpression(tree, options); // TODO: Make a pass thru the MathML similar to buildHTML.traverseNonSpaceNodes\n // and add spacing nodes. This is necessary only adjacent to math operators\n // like \\sin or \\lim or to subsup elements that contain math operators.\n // MathML takes care of the other spacing issues.\n // Wrap up the expression in an mrow so it is presented in the semantics\n // tag correctly, unless it's a single or .\n\n var wrapper;\n\n if (expression.length === 1 && expression[0] instanceof MathNode && utils.contains([\"mrow\", \"mtable\"], expression[0].type)) {\n wrapper = expression[0];\n } else {\n wrapper = new mathMLTree.MathNode(\"mrow\", expression);\n } // Build a TeX annotation of the source\n\n\n var annotation = new mathMLTree.MathNode(\"annotation\", [new mathMLTree.TextNode(texExpression)]);\n annotation.setAttribute(\"encoding\", \"application/x-tex\");\n var semantics = new mathMLTree.MathNode(\"semantics\", [wrapper, annotation]);\n var math = new mathMLTree.MathNode(\"math\", [semantics]);\n math.setAttribute(\"xmlns\", \"http://www.w3.org/1998/Math/MathML\");\n\n if (isDisplayMode) {\n math.setAttribute(\"display\", \"block\");\n } // You can't style nodes, so we wrap the node in a span.\n // NOTE: The span class is not typed to have nodes as children, and\n // we don't want to make the children type more generic since the children\n // of span are expected to have more fields in `buildHtml` contexts.\n\n\n var wrapperClass = forMathmlOnly ? \"katex\" : \"katex-mathml\"; // $FlowFixMe\n\n return buildCommon.makeSpan([wrapperClass], [math]);\n}\n\nvar optionsFromSettings = function optionsFromSettings(settings) {\n return new Options({\n style: settings.displayMode ? Style$1.DISPLAY : Style$1.TEXT,\n maxSize: settings.maxSize,\n minRuleThickness: settings.minRuleThickness\n });\n};\n\nvar displayWrap = function displayWrap(node, settings) {\n if (settings.displayMode) {\n var classes = [\"katex-display\"];\n\n if (settings.leqno) {\n classes.push(\"leqno\");\n }\n\n if (settings.fleqn) {\n classes.push(\"fleqn\");\n }\n\n node = buildCommon.makeSpan(classes, [node]);\n }\n\n return node;\n};\n\nvar buildTree = function buildTree(tree, expression, settings) {\n var options = optionsFromSettings(settings);\n var katexNode;\n\n if (settings.output === \"mathml\") {\n return buildMathML(tree, expression, options, settings.displayMode, true);\n } else if (settings.output === \"html\") {\n var htmlNode = buildHTML(tree, options);\n katexNode = buildCommon.makeSpan([\"katex\"], [htmlNode]);\n } else {\n var mathMLNode = buildMathML(tree, expression, options, settings.displayMode, false);\n\n var _htmlNode = buildHTML(tree, options);\n\n katexNode = buildCommon.makeSpan([\"katex\"], [mathMLNode, _htmlNode]);\n }\n\n return displayWrap(katexNode, settings);\n};\nvar buildHTMLTree = function buildHTMLTree(tree, expression, settings) {\n var options = optionsFromSettings(settings);\n var htmlNode = buildHTML(tree, options);\n var katexNode = buildCommon.makeSpan([\"katex\"], [htmlNode]);\n return displayWrap(katexNode, settings);\n};\n\n/**\n * This file provides support to buildMathML.js and buildHTML.js\n * for stretchy wide elements rendered from SVG files\n * and other CSS trickery.\n */\nvar stretchyCodePoint = {\n widehat: \"^\",\n widecheck: \"ˇ\",\n widetilde: \"~\",\n utilde: \"~\",\n overleftarrow: \"\\u2190\",\n underleftarrow: \"\\u2190\",\n xleftarrow: \"\\u2190\",\n overrightarrow: \"\\u2192\",\n underrightarrow: \"\\u2192\",\n xrightarrow: \"\\u2192\",\n underbrace: \"\\u23df\",\n overbrace: \"\\u23de\",\n overgroup: \"\\u23e0\",\n undergroup: \"\\u23e1\",\n overleftrightarrow: \"\\u2194\",\n underleftrightarrow: \"\\u2194\",\n xleftrightarrow: \"\\u2194\",\n Overrightarrow: \"\\u21d2\",\n xRightarrow: \"\\u21d2\",\n overleftharpoon: \"\\u21bc\",\n xleftharpoonup: \"\\u21bc\",\n overrightharpoon: \"\\u21c0\",\n xrightharpoonup: \"\\u21c0\",\n xLeftarrow: \"\\u21d0\",\n xLeftrightarrow: \"\\u21d4\",\n xhookleftarrow: \"\\u21a9\",\n xhookrightarrow: \"\\u21aa\",\n xmapsto: \"\\u21a6\",\n xrightharpoondown: \"\\u21c1\",\n xleftharpoondown: \"\\u21bd\",\n xrightleftharpoons: \"\\u21cc\",\n xleftrightharpoons: \"\\u21cb\",\n xtwoheadleftarrow: \"\\u219e\",\n xtwoheadrightarrow: \"\\u21a0\",\n xlongequal: \"=\",\n xtofrom: \"\\u21c4\",\n xrightleftarrows: \"\\u21c4\",\n xrightequilibrium: \"\\u21cc\",\n // Not a perfect match.\n xleftequilibrium: \"\\u21cb\",\n // None better available.\n \"\\\\cdrightarrow\": \"\\u2192\",\n \"\\\\cdleftarrow\": \"\\u2190\",\n \"\\\\cdlongequal\": \"=\"\n};\n\nvar mathMLnode = function mathMLnode(label) {\n var node = new mathMLTree.MathNode(\"mo\", [new mathMLTree.TextNode(stretchyCodePoint[label.replace(/^\\\\/, '')])]);\n node.setAttribute(\"stretchy\", \"true\");\n return node;\n}; // Many of the KaTeX SVG images have been adapted from glyphs in KaTeX fonts.\n// Copyright (c) 2009-2010, Design Science, Inc. ()\n// Copyright (c) 2014-2017 Khan Academy ()\n// Licensed under the SIL Open Font License, Version 1.1.\n// See \\nhttp://scripts.sil.org/OFL\n// Very Long SVGs\n// Many of the KaTeX stretchy wide elements use a long SVG image and an\n// overflow: hidden tactic to achieve a stretchy image while avoiding\n// distortion of arrowheads or brace corners.\n// The SVG typically contains a very long (400 em) arrow.\n// The SVG is in a container span that has overflow: hidden, so the span\n// acts like a window that exposes only part of the SVG.\n// The SVG always has a longer, thinner aspect ratio than the container span.\n// After the SVG fills 100% of the height of the container span,\n// there is a long arrow shaft left over. That left-over shaft is not shown.\n// Instead, it is sliced off because the span's CSS has overflow: hidden.\n// Thus, the reader sees an arrow that matches the subject matter width\n// without distortion.\n// Some functions, such as \\cancel, need to vary their aspect ratio. These\n// functions do not get the overflow SVG treatment.\n// Second Brush Stroke\n// Low resolution monitors struggle to display images in fine detail.\n// So browsers apply anti-aliasing. A long straight arrow shaft therefore\n// will sometimes appear as if it has a blurred edge.\n// To mitigate this, these SVG files contain a second \"brush-stroke\" on the\n// arrow shafts. That is, a second long thin rectangular SVG path has been\n// written directly on top of each arrow shaft. This reinforcement causes\n// some of the screen pixels to display as black instead of the anti-aliased\n// gray pixel that a single path would generate. So we get arrow shafts\n// whose edges appear to be sharper.\n// In the katexImagesData object just below, the dimensions all\n// correspond to path geometry inside the relevant SVG.\n// For example, \\overrightarrow uses the same arrowhead as glyph U+2192\n// from the KaTeX Main font. The scaling factor is 1000.\n// That is, inside the font, that arrowhead is 522 units tall, which\n// corresponds to 0.522 em inside the document.\n\n\nvar katexImagesData = {\n // path(s), minWidth, height, align\n overrightarrow: [[\"rightarrow\"], 0.888, 522, \"xMaxYMin\"],\n overleftarrow: [[\"leftarrow\"], 0.888, 522, \"xMinYMin\"],\n underrightarrow: [[\"rightarrow\"], 0.888, 522, \"xMaxYMin\"],\n underleftarrow: [[\"leftarrow\"], 0.888, 522, \"xMinYMin\"],\n xrightarrow: [[\"rightarrow\"], 1.469, 522, \"xMaxYMin\"],\n \"\\\\cdrightarrow\": [[\"rightarrow\"], 3.0, 522, \"xMaxYMin\"],\n // CD minwwidth2.5pc\n xleftarrow: [[\"leftarrow\"], 1.469, 522, \"xMinYMin\"],\n \"\\\\cdleftarrow\": [[\"leftarrow\"], 3.0, 522, \"xMinYMin\"],\n Overrightarrow: [[\"doublerightarrow\"], 0.888, 560, \"xMaxYMin\"],\n xRightarrow: [[\"doublerightarrow\"], 1.526, 560, \"xMaxYMin\"],\n xLeftarrow: [[\"doubleleftarrow\"], 1.526, 560, \"xMinYMin\"],\n overleftharpoon: [[\"leftharpoon\"], 0.888, 522, \"xMinYMin\"],\n xleftharpoonup: [[\"leftharpoon\"], 0.888, 522, \"xMinYMin\"],\n xleftharpoondown: [[\"leftharpoondown\"], 0.888, 522, \"xMinYMin\"],\n overrightharpoon: [[\"rightharpoon\"], 0.888, 522, \"xMaxYMin\"],\n xrightharpoonup: [[\"rightharpoon\"], 0.888, 522, \"xMaxYMin\"],\n xrightharpoondown: [[\"rightharpoondown\"], 0.888, 522, \"xMaxYMin\"],\n xlongequal: [[\"longequal\"], 0.888, 334, \"xMinYMin\"],\n \"\\\\cdlongequal\": [[\"longequal\"], 3.0, 334, \"xMinYMin\"],\n xtwoheadleftarrow: [[\"twoheadleftarrow\"], 0.888, 334, \"xMinYMin\"],\n xtwoheadrightarrow: [[\"twoheadrightarrow\"], 0.888, 334, \"xMaxYMin\"],\n overleftrightarrow: [[\"leftarrow\", \"rightarrow\"], 0.888, 522],\n overbrace: [[\"leftbrace\", \"midbrace\", \"rightbrace\"], 1.6, 548],\n underbrace: [[\"leftbraceunder\", \"midbraceunder\", \"rightbraceunder\"], 1.6, 548],\n underleftrightarrow: [[\"leftarrow\", \"rightarrow\"], 0.888, 522],\n xleftrightarrow: [[\"leftarrow\", \"rightarrow\"], 1.75, 522],\n xLeftrightarrow: [[\"doubleleftarrow\", \"doublerightarrow\"], 1.75, 560],\n xrightleftharpoons: [[\"leftharpoondownplus\", \"rightharpoonplus\"], 1.75, 716],\n xleftrightharpoons: [[\"leftharpoonplus\", \"rightharpoondownplus\"], 1.75, 716],\n xhookleftarrow: [[\"leftarrow\", \"righthook\"], 1.08, 522],\n xhookrightarrow: [[\"lefthook\", \"rightarrow\"], 1.08, 522],\n overlinesegment: [[\"leftlinesegment\", \"rightlinesegment\"], 0.888, 522],\n underlinesegment: [[\"leftlinesegment\", \"rightlinesegment\"], 0.888, 522],\n overgroup: [[\"leftgroup\", \"rightgroup\"], 0.888, 342],\n undergroup: [[\"leftgroupunder\", \"rightgroupunder\"], 0.888, 342],\n xmapsto: [[\"leftmapsto\", \"rightarrow\"], 1.5, 522],\n xtofrom: [[\"leftToFrom\", \"rightToFrom\"], 1.75, 528],\n // The next three arrows are from the mhchem package.\n // In mhchem.sty, min-length is 2.0em. But these arrows might appear in the\n // document as \\xrightarrow or \\xrightleftharpoons. Those have\n // min-length = 1.75em, so we set min-length on these next three to match.\n xrightleftarrows: [[\"baraboveleftarrow\", \"rightarrowabovebar\"], 1.75, 901],\n xrightequilibrium: [[\"baraboveshortleftharpoon\", \"rightharpoonaboveshortbar\"], 1.75, 716],\n xleftequilibrium: [[\"shortbaraboveleftharpoon\", \"shortrightharpoonabovebar\"], 1.75, 716]\n};\n\nvar groupLength = function groupLength(arg) {\n if (arg.type === \"ordgroup\") {\n return arg.body.length;\n } else {\n return 1;\n }\n};\n\nvar svgSpan = function svgSpan(group, options) {\n // Create a span with inline SVG for the element.\n function buildSvgSpan_() {\n var viewBoxWidth = 400000; // default\n\n var label = group.label.slice(1);\n\n if (utils.contains([\"widehat\", \"widecheck\", \"widetilde\", \"utilde\"], label)) {\n // Each type in the `if` statement corresponds to one of the ParseNode\n // types below. This narrowing is required to access `grp.base`.\n // $FlowFixMe\n var grp = group; // There are four SVG images available for each function.\n // Choose a taller image when there are more characters.\n\n var numChars = groupLength(grp.base);\n var viewBoxHeight;\n var pathName;\n\n var _height;\n\n if (numChars > 5) {\n if (label === \"widehat\" || label === \"widecheck\") {\n viewBoxHeight = 420;\n viewBoxWidth = 2364;\n _height = 0.42;\n pathName = label + \"4\";\n } else {\n viewBoxHeight = 312;\n viewBoxWidth = 2340;\n _height = 0.34;\n pathName = \"tilde4\";\n }\n } else {\n var imgIndex = [1, 1, 2, 2, 3, 3][numChars];\n\n if (label === \"widehat\" || label === \"widecheck\") {\n viewBoxWidth = [0, 1062, 2364, 2364, 2364][imgIndex];\n viewBoxHeight = [0, 239, 300, 360, 420][imgIndex];\n _height = [0, 0.24, 0.3, 0.3, 0.36, 0.42][imgIndex];\n pathName = label + imgIndex;\n } else {\n viewBoxWidth = [0, 600, 1033, 2339, 2340][imgIndex];\n viewBoxHeight = [0, 260, 286, 306, 312][imgIndex];\n _height = [0, 0.26, 0.286, 0.3, 0.306, 0.34][imgIndex];\n pathName = \"tilde\" + imgIndex;\n }\n }\n\n var path = new PathNode(pathName);\n var svgNode = new SvgNode([path], {\n \"width\": \"100%\",\n \"height\": makeEm(_height),\n \"viewBox\": \"0 0 \" + viewBoxWidth + \" \" + viewBoxHeight,\n \"preserveAspectRatio\": \"none\"\n });\n return {\n span: buildCommon.makeSvgSpan([], [svgNode], options),\n minWidth: 0,\n height: _height\n };\n } else {\n var spans = [];\n var data = katexImagesData[label];\n var [paths, _minWidth, _viewBoxHeight] = data;\n\n var _height2 = _viewBoxHeight / 1000;\n\n var numSvgChildren = paths.length;\n var widthClasses;\n var aligns;\n\n if (numSvgChildren === 1) {\n // $FlowFixMe: All these cases must be of the 4-tuple type.\n var align1 = data[3];\n widthClasses = [\"hide-tail\"];\n aligns = [align1];\n } else if (numSvgChildren === 2) {\n widthClasses = [\"halfarrow-left\", \"halfarrow-right\"];\n aligns = [\"xMinYMin\", \"xMaxYMin\"];\n } else if (numSvgChildren === 3) {\n widthClasses = [\"brace-left\", \"brace-center\", \"brace-right\"];\n aligns = [\"xMinYMin\", \"xMidYMin\", \"xMaxYMin\"];\n } else {\n throw new Error(\"Correct katexImagesData or update code here to support\\n \" + numSvgChildren + \" children.\");\n }\n\n for (var i = 0; i < numSvgChildren; i++) {\n var _path = new PathNode(paths[i]);\n\n var _svgNode = new SvgNode([_path], {\n \"width\": \"400em\",\n \"height\": makeEm(_height2),\n \"viewBox\": \"0 0 \" + viewBoxWidth + \" \" + _viewBoxHeight,\n \"preserveAspectRatio\": aligns[i] + \" slice\"\n });\n\n var _span = buildCommon.makeSvgSpan([widthClasses[i]], [_svgNode], options);\n\n if (numSvgChildren === 1) {\n return {\n span: _span,\n minWidth: _minWidth,\n height: _height2\n };\n } else {\n _span.style.height = makeEm(_height2);\n spans.push(_span);\n }\n }\n\n return {\n span: buildCommon.makeSpan([\"stretchy\"], spans, options),\n minWidth: _minWidth,\n height: _height2\n };\n }\n } // buildSvgSpan_()\n\n\n var {\n span,\n minWidth,\n height\n } = buildSvgSpan_(); // Note that we are returning span.depth = 0.\n // Any adjustments relative to the baseline must be done in buildHTML.\n\n span.height = height;\n span.style.height = makeEm(height);\n\n if (minWidth > 0) {\n span.style.minWidth = makeEm(minWidth);\n }\n\n return span;\n};\n\nvar encloseSpan = function encloseSpan(inner, label, topPad, bottomPad, options) {\n // Return an image span for \\cancel, \\bcancel, \\xcancel, \\fbox, or \\angl\n var img;\n var totalHeight = inner.height + inner.depth + topPad + bottomPad;\n\n if (/fbox|color|angl/.test(label)) {\n img = buildCommon.makeSpan([\"stretchy\", label], [], options);\n\n if (label === \"fbox\") {\n var color = options.color && options.getColor();\n\n if (color) {\n img.style.borderColor = color;\n }\n }\n } else {\n // \\cancel, \\bcancel, or \\xcancel\n // Since \\cancel's SVG is inline and it omits the viewBox attribute,\n // its stroke-width will not vary with span area.\n var lines = [];\n\n if (/^[bx]cancel$/.test(label)) {\n lines.push(new LineNode({\n \"x1\": \"0\",\n \"y1\": \"0\",\n \"x2\": \"100%\",\n \"y2\": \"100%\",\n \"stroke-width\": \"0.046em\"\n }));\n }\n\n if (/^x?cancel$/.test(label)) {\n lines.push(new LineNode({\n \"x1\": \"0\",\n \"y1\": \"100%\",\n \"x2\": \"100%\",\n \"y2\": \"0\",\n \"stroke-width\": \"0.046em\"\n }));\n }\n\n var svgNode = new SvgNode(lines, {\n \"width\": \"100%\",\n \"height\": makeEm(totalHeight)\n });\n img = buildCommon.makeSvgSpan([], [svgNode], options);\n }\n\n img.height = totalHeight;\n img.style.height = makeEm(totalHeight);\n return img;\n};\n\nvar stretchy = {\n encloseSpan,\n mathMLnode,\n svgSpan\n};\n\n/**\n * Asserts that the node is of the given type and returns it with stricter\n * typing. Throws if the node's type does not match.\n */\nfunction assertNodeType(node, type) {\n if (!node || node.type !== type) {\n throw new Error(\"Expected node of type \" + type + \", but got \" + (node ? \"node of type \" + node.type : String(node)));\n } // $FlowFixMe, >=0.125\n\n\n return node;\n}\n/**\n * Returns the node more strictly typed iff it is of the given type. Otherwise,\n * returns null.\n */\n\nfunction assertSymbolNodeType(node) {\n var typedNode = checkSymbolNodeType(node);\n\n if (!typedNode) {\n throw new Error(\"Expected node of symbol group type, but got \" + (node ? \"node of type \" + node.type : String(node)));\n }\n\n return typedNode;\n}\n/**\n * Returns the node more strictly typed iff it is of the given type. Otherwise,\n * returns null.\n */\n\nfunction checkSymbolNodeType(node) {\n if (node && (node.type === \"atom\" || NON_ATOMS.hasOwnProperty(node.type))) {\n // $FlowFixMe\n return node;\n }\n\n return null;\n}\n\n// NOTE: Unlike most `htmlBuilder`s, this one handles not only \"accent\", but\n// also \"supsub\" since an accent can affect super/subscripting.\nvar htmlBuilder$a = (grp, options) => {\n // Accents are handled in the TeXbook pg. 443, rule 12.\n var base;\n var group;\n var supSubGroup;\n\n if (grp && grp.type === \"supsub\") {\n // If our base is a character box, and we have superscripts and\n // subscripts, the supsub will defer to us. In particular, we want\n // to attach the superscripts and subscripts to the inner body (so\n // that the position of the superscripts and subscripts won't be\n // affected by the height of the accent). We accomplish this by\n // sticking the base of the accent into the base of the supsub, and\n // rendering that, while keeping track of where the accent is.\n // The real accent group is the base of the supsub group\n group = assertNodeType(grp.base, \"accent\"); // The character box is the base of the accent group\n\n base = group.base; // Stick the character box into the base of the supsub group\n\n grp.base = base; // Rerender the supsub group with its new base, and store that\n // result.\n\n supSubGroup = assertSpan(buildGroup$1(grp, options)); // reset original base\n\n grp.base = group;\n } else {\n group = assertNodeType(grp, \"accent\");\n base = group.base;\n } // Build the base group\n\n\n var body = buildGroup$1(base, options.havingCrampedStyle()); // Does the accent need to shift for the skew of a character?\n\n var mustShift = group.isShifty && utils.isCharacterBox(base); // Calculate the skew of the accent. This is based on the line \"If the\n // nucleus is not a single character, let s = 0; otherwise set s to the\n // kern amount for the nucleus followed by the \\skewchar of its font.\"\n // Note that our skew metrics are just the kern between each character\n // and the skewchar.\n\n var skew = 0;\n\n if (mustShift) {\n // If the base is a character box, then we want the skew of the\n // innermost character. To do that, we find the innermost character:\n var baseChar = utils.getBaseElem(base); // Then, we render its group to get the symbol inside it\n\n var baseGroup = buildGroup$1(baseChar, options.havingCrampedStyle()); // Finally, we pull the skew off of the symbol.\n\n skew = assertSymbolDomNode(baseGroup).skew; // Note that we now throw away baseGroup, because the layers we\n // removed with getBaseElem might contain things like \\color which\n // we can't get rid of.\n // TODO(emily): Find a better way to get the skew\n }\n\n var accentBelow = group.label === \"\\\\c\"; // calculate the amount of space between the body and the accent\n\n var clearance = accentBelow ? body.height + body.depth : Math.min(body.height, options.fontMetrics().xHeight); // Build the accent\n\n var accentBody;\n\n if (!group.isStretchy) {\n var accent;\n var width;\n\n if (group.label === \"\\\\vec\") {\n // Before version 0.9, \\vec used the combining font glyph U+20D7.\n // But browsers, especially Safari, are not consistent in how they\n // render combining characters when not preceded by a character.\n // So now we use an SVG.\n // If Safari reforms, we should consider reverting to the glyph.\n accent = buildCommon.staticSvg(\"vec\", options);\n width = buildCommon.svgData.vec[1];\n } else {\n accent = buildCommon.makeOrd({\n mode: group.mode,\n text: group.label\n }, options, \"textord\");\n accent = assertSymbolDomNode(accent); // Remove the italic correction of the accent, because it only serves to\n // shift the accent over to a place we don't want.\n\n accent.italic = 0;\n width = accent.width;\n\n if (accentBelow) {\n clearance += accent.depth;\n }\n }\n\n accentBody = buildCommon.makeSpan([\"accent-body\"], [accent]); // \"Full\" accents expand the width of the resulting symbol to be\n // at least the width of the accent, and overlap directly onto the\n // character without any vertical offset.\n\n var accentFull = group.label === \"\\\\textcircled\";\n\n if (accentFull) {\n accentBody.classes.push('accent-full');\n clearance = body.height;\n } // Shift the accent over by the skew.\n\n\n var left = skew; // CSS defines `.katex .accent .accent-body:not(.accent-full) { width: 0 }`\n // so that the accent doesn't contribute to the bounding box.\n // We need to shift the character by its width (effectively half\n // its width) to compensate.\n\n if (!accentFull) {\n left -= width / 2;\n }\n\n accentBody.style.left = makeEm(left); // \\textcircled uses the \\bigcirc glyph, so it needs some\n // vertical adjustment to match LaTeX.\n\n if (group.label === \"\\\\textcircled\") {\n accentBody.style.top = \".2em\";\n }\n\n accentBody = buildCommon.makeVList({\n positionType: \"firstBaseline\",\n children: [{\n type: \"elem\",\n elem: body\n }, {\n type: \"kern\",\n size: -clearance\n }, {\n type: \"elem\",\n elem: accentBody\n }]\n }, options);\n } else {\n accentBody = stretchy.svgSpan(group, options);\n accentBody = buildCommon.makeVList({\n positionType: \"firstBaseline\",\n children: [{\n type: \"elem\",\n elem: body\n }, {\n type: \"elem\",\n elem: accentBody,\n wrapperClasses: [\"svg-align\"],\n wrapperStyle: skew > 0 ? {\n width: \"calc(100% - \" + makeEm(2 * skew) + \")\",\n marginLeft: makeEm(2 * skew)\n } : undefined\n }]\n }, options);\n }\n\n var accentWrap = buildCommon.makeSpan([\"mord\", \"accent\"], [accentBody], options);\n\n if (supSubGroup) {\n // Here, we replace the \"base\" child of the supsub with our newly\n // generated accent.\n supSubGroup.children[0] = accentWrap; // Since we don't rerun the height calculation after replacing the\n // accent, we manually recalculate height.\n\n supSubGroup.height = Math.max(accentWrap.height, supSubGroup.height); // Accents should always be ords, even when their innards are not.\n\n supSubGroup.classes[0] = \"mord\";\n return supSubGroup;\n } else {\n return accentWrap;\n }\n};\n\nvar mathmlBuilder$9 = (group, options) => {\n var accentNode = group.isStretchy ? stretchy.mathMLnode(group.label) : new mathMLTree.MathNode(\"mo\", [makeText(group.label, group.mode)]);\n var node = new mathMLTree.MathNode(\"mover\", [buildGroup(group.base, options), accentNode]);\n node.setAttribute(\"accent\", \"true\");\n return node;\n};\n\nvar NON_STRETCHY_ACCENT_REGEX = new RegExp([\"\\\\acute\", \"\\\\grave\", \"\\\\ddot\", \"\\\\tilde\", \"\\\\bar\", \"\\\\breve\", \"\\\\check\", \"\\\\hat\", \"\\\\vec\", \"\\\\dot\", \"\\\\mathring\"].map(accent => \"\\\\\" + accent).join(\"|\")); // Accents\n\ndefineFunction({\n type: \"accent\",\n names: [\"\\\\acute\", \"\\\\grave\", \"\\\\ddot\", \"\\\\tilde\", \"\\\\bar\", \"\\\\breve\", \"\\\\check\", \"\\\\hat\", \"\\\\vec\", \"\\\\dot\", \"\\\\mathring\", \"\\\\widecheck\", \"\\\\widehat\", \"\\\\widetilde\", \"\\\\overrightarrow\", \"\\\\overleftarrow\", \"\\\\Overrightarrow\", \"\\\\overleftrightarrow\", \"\\\\overgroup\", \"\\\\overlinesegment\", \"\\\\overleftharpoon\", \"\\\\overrightharpoon\"],\n props: {\n numArgs: 1\n },\n handler: (context, args) => {\n var base = normalizeArgument(args[0]);\n var isStretchy = !NON_STRETCHY_ACCENT_REGEX.test(context.funcName);\n var isShifty = !isStretchy || context.funcName === \"\\\\widehat\" || context.funcName === \"\\\\widetilde\" || context.funcName === \"\\\\widecheck\";\n return {\n type: \"accent\",\n mode: context.parser.mode,\n label: context.funcName,\n isStretchy: isStretchy,\n isShifty: isShifty,\n base: base\n };\n },\n htmlBuilder: htmlBuilder$a,\n mathmlBuilder: mathmlBuilder$9\n}); // Text-mode accents\n\ndefineFunction({\n type: \"accent\",\n names: [\"\\\\'\", \"\\\\`\", \"\\\\^\", \"\\\\~\", \"\\\\=\", \"\\\\u\", \"\\\\.\", '\\\\\"', \"\\\\c\", \"\\\\r\", \"\\\\H\", \"\\\\v\", \"\\\\textcircled\"],\n props: {\n numArgs: 1,\n allowedInText: true,\n allowedInMath: true,\n // unless in strict mode\n argTypes: [\"primitive\"]\n },\n handler: (context, args) => {\n var base = args[0];\n var mode = context.parser.mode;\n\n if (mode === \"math\") {\n context.parser.settings.reportNonstrict(\"mathVsTextAccents\", \"LaTeX's accent \" + context.funcName + \" works only in text mode\");\n mode = \"text\";\n }\n\n return {\n type: \"accent\",\n mode: mode,\n label: context.funcName,\n isStretchy: false,\n isShifty: true,\n base: base\n };\n },\n htmlBuilder: htmlBuilder$a,\n mathmlBuilder: mathmlBuilder$9\n});\n\n// Horizontal overlap functions\ndefineFunction({\n type: \"accentUnder\",\n names: [\"\\\\underleftarrow\", \"\\\\underrightarrow\", \"\\\\underleftrightarrow\", \"\\\\undergroup\", \"\\\\underlinesegment\", \"\\\\utilde\"],\n props: {\n numArgs: 1\n },\n handler: (_ref, args) => {\n var {\n parser,\n funcName\n } = _ref;\n var base = args[0];\n return {\n type: \"accentUnder\",\n mode: parser.mode,\n label: funcName,\n base: base\n };\n },\n htmlBuilder: (group, options) => {\n // Treat under accents much like underlines.\n var innerGroup = buildGroup$1(group.base, options);\n var accentBody = stretchy.svgSpan(group, options);\n var kern = group.label === \"\\\\utilde\" ? 0.12 : 0; // Generate the vlist, with the appropriate kerns\n\n var vlist = buildCommon.makeVList({\n positionType: \"top\",\n positionData: innerGroup.height,\n children: [{\n type: \"elem\",\n elem: accentBody,\n wrapperClasses: [\"svg-align\"]\n }, {\n type: \"kern\",\n size: kern\n }, {\n type: \"elem\",\n elem: innerGroup\n }]\n }, options);\n return buildCommon.makeSpan([\"mord\", \"accentunder\"], [vlist], options);\n },\n mathmlBuilder: (group, options) => {\n var accentNode = stretchy.mathMLnode(group.label);\n var node = new mathMLTree.MathNode(\"munder\", [buildGroup(group.base, options), accentNode]);\n node.setAttribute(\"accentunder\", \"true\");\n return node;\n }\n});\n\n// Helper function\nvar paddedNode = group => {\n var node = new mathMLTree.MathNode(\"mpadded\", group ? [group] : []);\n node.setAttribute(\"width\", \"+0.6em\");\n node.setAttribute(\"lspace\", \"0.3em\");\n return node;\n}; // Stretchy arrows with an optional argument\n\n\ndefineFunction({\n type: \"xArrow\",\n names: [\"\\\\xleftarrow\", \"\\\\xrightarrow\", \"\\\\xLeftarrow\", \"\\\\xRightarrow\", \"\\\\xleftrightarrow\", \"\\\\xLeftrightarrow\", \"\\\\xhookleftarrow\", \"\\\\xhookrightarrow\", \"\\\\xmapsto\", \"\\\\xrightharpoondown\", \"\\\\xrightharpoonup\", \"\\\\xleftharpoondown\", \"\\\\xleftharpoonup\", \"\\\\xrightleftharpoons\", \"\\\\xleftrightharpoons\", \"\\\\xlongequal\", \"\\\\xtwoheadrightarrow\", \"\\\\xtwoheadleftarrow\", \"\\\\xtofrom\", // The next 3 functions are here to support the mhchem extension.\n // Direct use of these functions is discouraged and may break someday.\n \"\\\\xrightleftarrows\", \"\\\\xrightequilibrium\", \"\\\\xleftequilibrium\", // The next 3 functions are here only to support the {CD} environment.\n \"\\\\\\\\cdrightarrow\", \"\\\\\\\\cdleftarrow\", \"\\\\\\\\cdlongequal\"],\n props: {\n numArgs: 1,\n numOptionalArgs: 1\n },\n\n handler(_ref, args, optArgs) {\n var {\n parser,\n funcName\n } = _ref;\n return {\n type: \"xArrow\",\n mode: parser.mode,\n label: funcName,\n body: args[0],\n below: optArgs[0]\n };\n },\n\n // Flow is unable to correctly infer the type of `group`, even though it's\n // unambiguously determined from the passed-in `type` above.\n htmlBuilder(group, options) {\n var style = options.style; // Build the argument groups in the appropriate style.\n // Ref: amsmath.dtx: \\hbox{$\\scriptstyle\\mkern#3mu{#6}\\mkern#4mu$}%\n // Some groups can return document fragments. Handle those by wrapping\n // them in a span.\n\n var newOptions = options.havingStyle(style.sup());\n var upperGroup = buildCommon.wrapFragment(buildGroup$1(group.body, newOptions, options), options);\n var arrowPrefix = group.label.slice(0, 2) === \"\\\\x\" ? \"x\" : \"cd\";\n upperGroup.classes.push(arrowPrefix + \"-arrow-pad\");\n var lowerGroup;\n\n if (group.below) {\n // Build the lower group\n newOptions = options.havingStyle(style.sub());\n lowerGroup = buildCommon.wrapFragment(buildGroup$1(group.below, newOptions, options), options);\n lowerGroup.classes.push(arrowPrefix + \"-arrow-pad\");\n }\n\n var arrowBody = stretchy.svgSpan(group, options); // Re shift: Note that stretchy.svgSpan returned arrowBody.depth = 0.\n // The point we want on the math axis is at 0.5 * arrowBody.height.\n\n var arrowShift = -options.fontMetrics().axisHeight + 0.5 * arrowBody.height; // 2 mu kern. Ref: amsmath.dtx: #7\\if0#2\\else\\mkern#2mu\\fi\n\n var upperShift = -options.fontMetrics().axisHeight - 0.5 * arrowBody.height - 0.111; // 0.111 em = 2 mu\n\n if (upperGroup.depth > 0.25 || group.label === \"\\\\xleftequilibrium\") {\n upperShift -= upperGroup.depth; // shift up if depth encroaches\n } // Generate the vlist\n\n\n var vlist;\n\n if (lowerGroup) {\n var lowerShift = -options.fontMetrics().axisHeight + lowerGroup.height + 0.5 * arrowBody.height + 0.111;\n vlist = buildCommon.makeVList({\n positionType: \"individualShift\",\n children: [{\n type: \"elem\",\n elem: upperGroup,\n shift: upperShift\n }, {\n type: \"elem\",\n elem: arrowBody,\n shift: arrowShift\n }, {\n type: \"elem\",\n elem: lowerGroup,\n shift: lowerShift\n }]\n }, options);\n } else {\n vlist = buildCommon.makeVList({\n positionType: \"individualShift\",\n children: [{\n type: \"elem\",\n elem: upperGroup,\n shift: upperShift\n }, {\n type: \"elem\",\n elem: arrowBody,\n shift: arrowShift\n }]\n }, options);\n } // $FlowFixMe: Replace this with passing \"svg-align\" into makeVList.\n\n\n vlist.children[0].children[0].children[1].classes.push(\"svg-align\");\n return buildCommon.makeSpan([\"mrel\", \"x-arrow\"], [vlist], options);\n },\n\n mathmlBuilder(group, options) {\n var arrowNode = stretchy.mathMLnode(group.label);\n arrowNode.setAttribute(\"minsize\", group.label.charAt(0) === \"x\" ? \"1.75em\" : \"3.0em\");\n var node;\n\n if (group.body) {\n var upperNode = paddedNode(buildGroup(group.body, options));\n\n if (group.below) {\n var lowerNode = paddedNode(buildGroup(group.below, options));\n node = new mathMLTree.MathNode(\"munderover\", [arrowNode, lowerNode, upperNode]);\n } else {\n node = new mathMLTree.MathNode(\"mover\", [arrowNode, upperNode]);\n }\n } else if (group.below) {\n var _lowerNode = paddedNode(buildGroup(group.below, options));\n\n node = new mathMLTree.MathNode(\"munder\", [arrowNode, _lowerNode]);\n } else {\n // This should never happen.\n // Parser.js throws an error if there is no argument.\n node = paddedNode();\n node = new mathMLTree.MathNode(\"mover\", [arrowNode, node]);\n }\n\n return node;\n }\n\n});\n\nvar makeSpan = buildCommon.makeSpan;\n\nfunction htmlBuilder$9(group, options) {\n var elements = buildExpression$1(group.body, options, true);\n return makeSpan([group.mclass], elements, options);\n}\n\nfunction mathmlBuilder$8(group, options) {\n var node;\n var inner = buildExpression(group.body, options);\n\n if (group.mclass === \"minner\") {\n node = new mathMLTree.MathNode(\"mpadded\", inner);\n } else if (group.mclass === \"mord\") {\n if (group.isCharacterBox) {\n node = inner[0];\n node.type = \"mi\";\n } else {\n node = new mathMLTree.MathNode(\"mi\", inner);\n }\n } else {\n if (group.isCharacterBox) {\n node = inner[0];\n node.type = \"mo\";\n } else {\n node = new mathMLTree.MathNode(\"mo\", inner);\n } // Set spacing based on what is the most likely adjacent atom type.\n // See TeXbook p170.\n\n\n if (group.mclass === \"mbin\") {\n node.attributes.lspace = \"0.22em\"; // medium space\n\n node.attributes.rspace = \"0.22em\";\n } else if (group.mclass === \"mpunct\") {\n node.attributes.lspace = \"0em\";\n node.attributes.rspace = \"0.17em\"; // thinspace\n } else if (group.mclass === \"mopen\" || group.mclass === \"mclose\") {\n node.attributes.lspace = \"0em\";\n node.attributes.rspace = \"0em\";\n } else if (group.mclass === \"minner\") {\n node.attributes.lspace = \"0.0556em\"; // 1 mu is the most likely option\n\n node.attributes.width = \"+0.1111em\";\n } // MathML default space is 5/18 em, so needs no action.\n // Ref: https://developer.mozilla.org/en-US/docs/Web/MathML/Element/mo\n\n }\n\n return node;\n} // Math class commands except \\mathop\n\n\ndefineFunction({\n type: \"mclass\",\n names: [\"\\\\mathord\", \"\\\\mathbin\", \"\\\\mathrel\", \"\\\\mathopen\", \"\\\\mathclose\", \"\\\\mathpunct\", \"\\\\mathinner\"],\n props: {\n numArgs: 1,\n primitive: true\n },\n\n handler(_ref, args) {\n var {\n parser,\n funcName\n } = _ref;\n var body = args[0];\n return {\n type: \"mclass\",\n mode: parser.mode,\n mclass: \"m\" + funcName.slice(5),\n // TODO(kevinb): don't prefix with 'm'\n body: ordargument(body),\n isCharacterBox: utils.isCharacterBox(body)\n };\n },\n\n htmlBuilder: htmlBuilder$9,\n mathmlBuilder: mathmlBuilder$8\n});\nvar binrelClass = arg => {\n // \\binrel@ spacing varies with (bin|rel|ord) of the atom in the argument.\n // (by rendering separately and with {}s before and after, and measuring\n // the change in spacing). We'll do roughly the same by detecting the\n // atom type directly.\n var atom = arg.type === \"ordgroup\" && arg.body.length ? arg.body[0] : arg;\n\n if (atom.type === \"atom\" && (atom.family === \"bin\" || atom.family === \"rel\")) {\n return \"m\" + atom.family;\n } else {\n return \"mord\";\n }\n}; // \\@binrel{x}{y} renders like y but as mbin/mrel/mord if x is mbin/mrel/mord.\n// This is equivalent to \\binrel@{x}\\binrel@@{y} in AMSTeX.\n\ndefineFunction({\n type: \"mclass\",\n names: [\"\\\\@binrel\"],\n props: {\n numArgs: 2\n },\n\n handler(_ref2, args) {\n var {\n parser\n } = _ref2;\n return {\n type: \"mclass\",\n mode: parser.mode,\n mclass: binrelClass(args[0]),\n body: ordargument(args[1]),\n isCharacterBox: utils.isCharacterBox(args[1])\n };\n }\n\n}); // Build a relation or stacked op by placing one symbol on top of another\n\ndefineFunction({\n type: \"mclass\",\n names: [\"\\\\stackrel\", \"\\\\overset\", \"\\\\underset\"],\n props: {\n numArgs: 2\n },\n\n handler(_ref3, args) {\n var {\n parser,\n funcName\n } = _ref3;\n var baseArg = args[1];\n var shiftedArg = args[0];\n var mclass;\n\n if (funcName !== \"\\\\stackrel\") {\n // LaTeX applies \\binrel spacing to \\overset and \\underset.\n mclass = binrelClass(baseArg);\n } else {\n mclass = \"mrel\"; // for \\stackrel\n }\n\n var baseOp = {\n type: \"op\",\n mode: baseArg.mode,\n limits: true,\n alwaysHandleSupSub: true,\n parentIsSupSub: false,\n symbol: false,\n suppressBaseShift: funcName !== \"\\\\stackrel\",\n body: ordargument(baseArg)\n };\n var supsub = {\n type: \"supsub\",\n mode: shiftedArg.mode,\n base: baseOp,\n sup: funcName === \"\\\\underset\" ? null : shiftedArg,\n sub: funcName === \"\\\\underset\" ? shiftedArg : null\n };\n return {\n type: \"mclass\",\n mode: parser.mode,\n mclass,\n body: [supsub],\n isCharacterBox: utils.isCharacterBox(supsub)\n };\n },\n\n htmlBuilder: htmlBuilder$9,\n mathmlBuilder: mathmlBuilder$8\n});\n\n// \\pmb is a simulation of bold font.\n// The version of \\pmb in ambsy.sty works by typesetting three copies\n// with small offsets. We use CSS text-shadow.\n// It's a hack. Not as good as a real bold font. Better than nothing.\ndefineFunction({\n type: \"pmb\",\n names: [\"\\\\pmb\"],\n props: {\n numArgs: 1,\n allowedInText: true\n },\n\n handler(_ref, args) {\n var {\n parser\n } = _ref;\n return {\n type: \"pmb\",\n mode: parser.mode,\n mclass: binrelClass(args[0]),\n body: ordargument(args[0])\n };\n },\n\n htmlBuilder(group, options) {\n var elements = buildExpression$1(group.body, options, true);\n var node = buildCommon.makeSpan([group.mclass], elements, options);\n node.style.textShadow = \"0.02em 0.01em 0.04px\";\n return node;\n },\n\n mathmlBuilder(group, style) {\n var inner = buildExpression(group.body, style); // Wrap with an element.\n\n var node = new mathMLTree.MathNode(\"mstyle\", inner);\n node.setAttribute(\"style\", \"text-shadow: 0.02em 0.01em 0.04px\");\n return node;\n }\n\n});\n\nvar cdArrowFunctionName = {\n \">\": \"\\\\\\\\cdrightarrow\",\n \"<\": \"\\\\\\\\cdleftarrow\",\n \"=\": \"\\\\\\\\cdlongequal\",\n \"A\": \"\\\\uparrow\",\n \"V\": \"\\\\downarrow\",\n \"|\": \"\\\\Vert\",\n \".\": \"no arrow\"\n};\n\nvar newCell = () => {\n // Create an empty cell, to be filled below with parse nodes.\n // The parseTree from this module must be constructed like the\n // one created by parseArray(), so an empty CD cell must\n // be a ParseNode<\"styling\">. And CD is always displaystyle.\n // So these values are fixed and flow can do implicit typing.\n return {\n type: \"styling\",\n body: [],\n mode: \"math\",\n style: \"display\"\n };\n};\n\nvar isStartOfArrow = node => {\n return node.type === \"textord\" && node.text === \"@\";\n};\n\nvar isLabelEnd = (node, endChar) => {\n return (node.type === \"mathord\" || node.type === \"atom\") && node.text === endChar;\n};\n\nfunction cdArrow(arrowChar, labels, parser) {\n // Return a parse tree of an arrow and its labels.\n // This acts in a way similar to a macro expansion.\n var funcName = cdArrowFunctionName[arrowChar];\n\n switch (funcName) {\n case \"\\\\\\\\cdrightarrow\":\n case \"\\\\\\\\cdleftarrow\":\n return parser.callFunction(funcName, [labels[0]], [labels[1]]);\n\n case \"\\\\uparrow\":\n case \"\\\\downarrow\":\n {\n var leftLabel = parser.callFunction(\"\\\\\\\\cdleft\", [labels[0]], []);\n var bareArrow = {\n type: \"atom\",\n text: funcName,\n mode: \"math\",\n family: \"rel\"\n };\n var sizedArrow = parser.callFunction(\"\\\\Big\", [bareArrow], []);\n var rightLabel = parser.callFunction(\"\\\\\\\\cdright\", [labels[1]], []);\n var arrowGroup = {\n type: \"ordgroup\",\n mode: \"math\",\n body: [leftLabel, sizedArrow, rightLabel]\n };\n return parser.callFunction(\"\\\\\\\\cdparent\", [arrowGroup], []);\n }\n\n case \"\\\\\\\\cdlongequal\":\n return parser.callFunction(\"\\\\\\\\cdlongequal\", [], []);\n\n case \"\\\\Vert\":\n {\n var arrow = {\n type: \"textord\",\n text: \"\\\\Vert\",\n mode: \"math\"\n };\n return parser.callFunction(\"\\\\Big\", [arrow], []);\n }\n\n default:\n return {\n type: \"textord\",\n text: \" \",\n mode: \"math\"\n };\n }\n}\n\nfunction parseCD(parser) {\n // Get the array's parse nodes with \\\\ temporarily mapped to \\cr.\n var parsedRows = [];\n parser.gullet.beginGroup();\n parser.gullet.macros.set(\"\\\\cr\", \"\\\\\\\\\\\\relax\");\n parser.gullet.beginGroup();\n\n while (true) {\n // eslint-disable-line no-constant-condition\n // Get the parse nodes for the next row.\n parsedRows.push(parser.parseExpression(false, \"\\\\\\\\\"));\n parser.gullet.endGroup();\n parser.gullet.beginGroup();\n var next = parser.fetch().text;\n\n if (next === \"&\" || next === \"\\\\\\\\\") {\n parser.consume();\n } else if (next === \"\\\\end\") {\n if (parsedRows[parsedRows.length - 1].length === 0) {\n parsedRows.pop(); // final row ended in \\\\\n }\n\n break;\n } else {\n throw new ParseError(\"Expected \\\\\\\\ or \\\\cr or \\\\end\", parser.nextToken);\n }\n }\n\n var row = [];\n var body = [row]; // Loop thru the parse nodes. Collect them into cells and arrows.\n\n for (var i = 0; i < parsedRows.length; i++) {\n // Start a new row.\n var rowNodes = parsedRows[i]; // Create the first cell.\n\n var cell = newCell();\n\n for (var j = 0; j < rowNodes.length; j++) {\n if (!isStartOfArrow(rowNodes[j])) {\n // If a parseNode is not an arrow, it goes into a cell.\n cell.body.push(rowNodes[j]);\n } else {\n // Parse node j is an \"@\", the start of an arrow.\n // Before starting on the arrow, push the cell into `row`.\n row.push(cell); // Now collect parseNodes into an arrow.\n // The character after \"@\" defines the arrow type.\n\n j += 1;\n var arrowChar = assertSymbolNodeType(rowNodes[j]).text; // Create two empty label nodes. We may or may not use them.\n\n var labels = new Array(2);\n labels[0] = {\n type: \"ordgroup\",\n mode: \"math\",\n body: []\n };\n labels[1] = {\n type: \"ordgroup\",\n mode: \"math\",\n body: []\n }; // Process the arrow.\n\n if (\"=|.\".indexOf(arrowChar) > -1) ; else if (\"<>AV\".indexOf(arrowChar) > -1) {\n // Four arrows, `@>>>`, `@<<<`, `@AAA`, and `@VVV`, each take\n // two optional labels. E.g. the right-point arrow syntax is\n // really: @>{optional label}>{optional label}>\n // Collect parseNodes into labels.\n for (var labelNum = 0; labelNum < 2; labelNum++) {\n var inLabel = true;\n\n for (var k = j + 1; k < rowNodes.length; k++) {\n if (isLabelEnd(rowNodes[k], arrowChar)) {\n inLabel = false;\n j = k;\n break;\n }\n\n if (isStartOfArrow(rowNodes[k])) {\n throw new ParseError(\"Missing a \" + arrowChar + \" character to complete a CD arrow.\", rowNodes[k]);\n }\n\n labels[labelNum].body.push(rowNodes[k]);\n }\n\n if (inLabel) {\n // isLabelEnd never returned a true.\n throw new ParseError(\"Missing a \" + arrowChar + \" character to complete a CD arrow.\", rowNodes[j]);\n }\n }\n } else {\n throw new ParseError(\"Expected one of \\\"<>AV=|.\\\" after @\", rowNodes[j]);\n } // Now join the arrow to its labels.\n\n\n var arrow = cdArrow(arrowChar, labels, parser); // Wrap the arrow in ParseNode<\"styling\">.\n // This is done to match parseArray() behavior.\n\n var wrappedArrow = {\n type: \"styling\",\n body: [arrow],\n mode: \"math\",\n style: \"display\" // CD is always displaystyle.\n\n };\n row.push(wrappedArrow); // In CD's syntax, cells are implicit. That is, everything that\n // is not an arrow gets collected into a cell. So create an empty\n // cell now. It will collect upcoming parseNodes.\n\n cell = newCell();\n }\n }\n\n if (i % 2 === 0) {\n // Even-numbered rows consist of: cell, arrow, cell, arrow, ... cell\n // The last cell is not yet pushed into `row`, so:\n row.push(cell);\n } else {\n // Odd-numbered rows consist of: vert arrow, empty cell, ... vert arrow\n // Remove the empty cell that was placed at the beginning of `row`.\n row.shift();\n }\n\n row = [];\n body.push(row);\n } // End row group\n\n\n parser.gullet.endGroup(); // End array group defining \\\\\n\n parser.gullet.endGroup(); // define column separation.\n\n var cols = new Array(body[0].length).fill({\n type: \"align\",\n align: \"c\",\n pregap: 0.25,\n // CD package sets \\enskip between columns.\n postgap: 0.25 // So pre and post each get half an \\enskip, i.e. 0.25em.\n\n });\n return {\n type: \"array\",\n mode: \"math\",\n body,\n arraystretch: 1,\n addJot: true,\n rowGaps: [null],\n cols,\n colSeparationType: \"CD\",\n hLinesBeforeRow: new Array(body.length + 1).fill([])\n };\n} // The functions below are not available for general use.\n// They are here only for internal use by the {CD} environment in placing labels\n// next to vertical arrows.\n// We don't need any such functions for horizontal arrows because we can reuse\n// the functionality that already exists for extensible arrows.\n\ndefineFunction({\n type: \"cdlabel\",\n names: [\"\\\\\\\\cdleft\", \"\\\\\\\\cdright\"],\n props: {\n numArgs: 1\n },\n\n handler(_ref, args) {\n var {\n parser,\n funcName\n } = _ref;\n return {\n type: \"cdlabel\",\n mode: parser.mode,\n side: funcName.slice(4),\n label: args[0]\n };\n },\n\n htmlBuilder(group, options) {\n var newOptions = options.havingStyle(options.style.sup());\n var label = buildCommon.wrapFragment(buildGroup$1(group.label, newOptions, options), options);\n label.classes.push(\"cd-label-\" + group.side);\n label.style.bottom = makeEm(0.8 - label.depth); // Zero out label height & depth, so vertical align of arrow is set\n // by the arrow height, not by the label.\n\n label.height = 0;\n label.depth = 0;\n return label;\n },\n\n mathmlBuilder(group, options) {\n var label = new mathMLTree.MathNode(\"mrow\", [buildGroup(group.label, options)]);\n label = new mathMLTree.MathNode(\"mpadded\", [label]);\n label.setAttribute(\"width\", \"0\");\n\n if (group.side === \"left\") {\n label.setAttribute(\"lspace\", \"-1width\");\n } // We have to guess at vertical alignment. We know the arrow is 1.8em tall,\n // But we don't know the height or depth of the label.\n\n\n label.setAttribute(\"voffset\", \"0.7em\");\n label = new mathMLTree.MathNode(\"mstyle\", [label]);\n label.setAttribute(\"displaystyle\", \"false\");\n label.setAttribute(\"scriptlevel\", \"1\");\n return label;\n }\n\n});\ndefineFunction({\n type: \"cdlabelparent\",\n names: [\"\\\\\\\\cdparent\"],\n props: {\n numArgs: 1\n },\n\n handler(_ref2, args) {\n var {\n parser\n } = _ref2;\n return {\n type: \"cdlabelparent\",\n mode: parser.mode,\n fragment: args[0]\n };\n },\n\n htmlBuilder(group, options) {\n // Wrap the vertical arrow and its labels.\n // The parent gets position: relative. The child gets position: absolute.\n // So CSS can locate the label correctly.\n var parent = buildCommon.wrapFragment(buildGroup$1(group.fragment, options), options);\n parent.classes.push(\"cd-vert-arrow\");\n return parent;\n },\n\n mathmlBuilder(group, options) {\n return new mathMLTree.MathNode(\"mrow\", [buildGroup(group.fragment, options)]);\n }\n\n});\n\n// {123} and converts into symbol with code 123. It is used by the *macro*\n// \\char defined in macros.js.\n\ndefineFunction({\n type: \"textord\",\n names: [\"\\\\@char\"],\n props: {\n numArgs: 1,\n allowedInText: true\n },\n\n handler(_ref, args) {\n var {\n parser\n } = _ref;\n var arg = assertNodeType(args[0], \"ordgroup\");\n var group = arg.body;\n var number = \"\";\n\n for (var i = 0; i < group.length; i++) {\n var node = assertNodeType(group[i], \"textord\");\n number += node.text;\n }\n\n var code = parseInt(number);\n var text;\n\n if (isNaN(code)) {\n throw new ParseError(\"\\\\@char has non-numeric argument \" + number); // If we drop IE support, the following code could be replaced with\n // text = String.fromCodePoint(code)\n } else if (code < 0 || code >= 0x10ffff) {\n throw new ParseError(\"\\\\@char with invalid code point \" + number);\n } else if (code <= 0xffff) {\n text = String.fromCharCode(code);\n } else {\n // Astral code point; split into surrogate halves\n code -= 0x10000;\n text = String.fromCharCode((code >> 10) + 0xd800, (code & 0x3ff) + 0xdc00);\n }\n\n return {\n type: \"textord\",\n mode: parser.mode,\n text: text\n };\n }\n\n});\n\nvar htmlBuilder$8 = (group, options) => {\n var elements = buildExpression$1(group.body, options.withColor(group.color), false); // \\color isn't supposed to affect the type of the elements it contains.\n // To accomplish this, we wrap the results in a fragment, so the inner\n // elements will be able to directly interact with their neighbors. For\n // example, `\\color{red}{2 +} 3` has the same spacing as `2 + 3`\n\n return buildCommon.makeFragment(elements);\n};\n\nvar mathmlBuilder$7 = (group, options) => {\n var inner = buildExpression(group.body, options.withColor(group.color));\n var node = new mathMLTree.MathNode(\"mstyle\", inner);\n node.setAttribute(\"mathcolor\", group.color);\n return node;\n};\n\ndefineFunction({\n type: \"color\",\n names: [\"\\\\textcolor\"],\n props: {\n numArgs: 2,\n allowedInText: true,\n argTypes: [\"color\", \"original\"]\n },\n\n handler(_ref, args) {\n var {\n parser\n } = _ref;\n var color = assertNodeType(args[0], \"color-token\").color;\n var body = args[1];\n return {\n type: \"color\",\n mode: parser.mode,\n color,\n body: ordargument(body)\n };\n },\n\n htmlBuilder: htmlBuilder$8,\n mathmlBuilder: mathmlBuilder$7\n});\ndefineFunction({\n type: \"color\",\n names: [\"\\\\color\"],\n props: {\n numArgs: 1,\n allowedInText: true,\n argTypes: [\"color\"]\n },\n\n handler(_ref2, args) {\n var {\n parser,\n breakOnTokenText\n } = _ref2;\n var color = assertNodeType(args[0], \"color-token\").color; // Set macro \\current@color in current namespace to store the current\n // color, mimicking the behavior of color.sty.\n // This is currently used just to correctly color a \\right\n // that follows a \\color command.\n\n parser.gullet.macros.set(\"\\\\current@color\", color); // Parse out the implicit body that should be colored.\n\n var body = parser.parseExpression(true, breakOnTokenText);\n return {\n type: \"color\",\n mode: parser.mode,\n color,\n body\n };\n },\n\n htmlBuilder: htmlBuilder$8,\n mathmlBuilder: mathmlBuilder$7\n});\n\n// Row breaks within tabular environments, and line breaks at top level\n\ndefineFunction({\n type: \"cr\",\n names: [\"\\\\\\\\\"],\n props: {\n numArgs: 0,\n numOptionalArgs: 0,\n allowedInText: true\n },\n\n handler(_ref, args, optArgs) {\n var {\n parser\n } = _ref;\n var size = parser.gullet.future().text === \"[\" ? parser.parseSizeGroup(true) : null;\n var newLine = !parser.settings.displayMode || !parser.settings.useStrictBehavior(\"newLineInDisplayMode\", \"In LaTeX, \\\\\\\\ or \\\\newline \" + \"does nothing in display mode\");\n return {\n type: \"cr\",\n mode: parser.mode,\n newLine,\n size: size && assertNodeType(size, \"size\").value\n };\n },\n\n // The following builders are called only at the top level,\n // not within tabular/array environments.\n htmlBuilder(group, options) {\n var span = buildCommon.makeSpan([\"mspace\"], [], options);\n\n if (group.newLine) {\n span.classes.push(\"newline\");\n\n if (group.size) {\n span.style.marginTop = makeEm(calculateSize(group.size, options));\n }\n }\n\n return span;\n },\n\n mathmlBuilder(group, options) {\n var node = new mathMLTree.MathNode(\"mspace\");\n\n if (group.newLine) {\n node.setAttribute(\"linebreak\", \"newline\");\n\n if (group.size) {\n node.setAttribute(\"height\", makeEm(calculateSize(group.size, options)));\n }\n }\n\n return node;\n }\n\n});\n\nvar globalMap = {\n \"\\\\global\": \"\\\\global\",\n \"\\\\long\": \"\\\\\\\\globallong\",\n \"\\\\\\\\globallong\": \"\\\\\\\\globallong\",\n \"\\\\def\": \"\\\\gdef\",\n \"\\\\gdef\": \"\\\\gdef\",\n \"\\\\edef\": \"\\\\xdef\",\n \"\\\\xdef\": \"\\\\xdef\",\n \"\\\\let\": \"\\\\\\\\globallet\",\n \"\\\\futurelet\": \"\\\\\\\\globalfuture\"\n};\n\nvar checkControlSequence = tok => {\n var name = tok.text;\n\n if (/^(?:[\\\\{}$&#^_]|EOF)$/.test(name)) {\n throw new ParseError(\"Expected a control sequence\", tok);\n }\n\n return name;\n};\n\nvar getRHS = parser => {\n var tok = parser.gullet.popToken();\n\n if (tok.text === \"=\") {\n // consume optional equals\n tok = parser.gullet.popToken();\n\n if (tok.text === \" \") {\n // consume one optional space\n tok = parser.gullet.popToken();\n }\n }\n\n return tok;\n};\n\nvar letCommand = (parser, name, tok, global) => {\n var macro = parser.gullet.macros.get(tok.text);\n\n if (macro == null) {\n // don't expand it later even if a macro with the same name is defined\n // e.g., \\let\\foo=\\frac \\def\\frac{\\relax} \\frac12\n tok.noexpand = true;\n macro = {\n tokens: [tok],\n numArgs: 0,\n // reproduce the same behavior in expansion\n unexpandable: !parser.gullet.isExpandable(tok.text)\n };\n }\n\n parser.gullet.macros.set(name, macro, global);\n}; // -> |\n// -> |\\global\n// -> |\n// -> \\global|\\long|\\outer\n\n\ndefineFunction({\n type: \"internal\",\n names: [\"\\\\global\", \"\\\\long\", \"\\\\\\\\globallong\" // can’t be entered directly\n ],\n props: {\n numArgs: 0,\n allowedInText: true\n },\n\n handler(_ref) {\n var {\n parser,\n funcName\n } = _ref;\n parser.consumeSpaces();\n var token = parser.fetch();\n\n if (globalMap[token.text]) {\n // KaTeX doesn't have \\par, so ignore \\long\n if (funcName === \"\\\\global\" || funcName === \"\\\\\\\\globallong\") {\n token.text = globalMap[token.text];\n }\n\n return assertNodeType(parser.parseFunction(), \"internal\");\n }\n\n throw new ParseError(\"Invalid token after macro prefix\", token);\n }\n\n}); // Basic support for macro definitions: \\def, \\gdef, \\edef, \\xdef\n// -> \n// -> \\def|\\gdef|\\edef|\\xdef\n// -> \n\ndefineFunction({\n type: \"internal\",\n names: [\"\\\\def\", \"\\\\gdef\", \"\\\\edef\", \"\\\\xdef\"],\n props: {\n numArgs: 0,\n allowedInText: true,\n primitive: true\n },\n\n handler(_ref2) {\n var {\n parser,\n funcName\n } = _ref2;\n var tok = parser.gullet.popToken();\n var name = tok.text;\n\n if (/^(?:[\\\\{}$&#^_]|EOF)$/.test(name)) {\n throw new ParseError(\"Expected a control sequence\", tok);\n }\n\n var numArgs = 0;\n var insert;\n var delimiters = [[]]; // contains no braces\n\n while (parser.gullet.future().text !== \"{\") {\n tok = parser.gullet.popToken();\n\n if (tok.text === \"#\") {\n // If the very last character of the is #, so that\n // this # is immediately followed by {, TeX will behave as if the {\n // had been inserted at the right end of both the parameter text\n // and the replacement text.\n if (parser.gullet.future().text === \"{\") {\n insert = parser.gullet.future();\n delimiters[numArgs].push(\"{\");\n break;\n } // A parameter, the first appearance of # must be followed by 1,\n // the next by 2, and so on; up to nine #’s are allowed\n\n\n tok = parser.gullet.popToken();\n\n if (!/^[1-9]$/.test(tok.text)) {\n throw new ParseError(\"Invalid argument number \\\"\" + tok.text + \"\\\"\");\n }\n\n if (parseInt(tok.text) !== numArgs + 1) {\n throw new ParseError(\"Argument number \\\"\" + tok.text + \"\\\" out of order\");\n }\n\n numArgs++;\n delimiters.push([]);\n } else if (tok.text === \"EOF\") {\n throw new ParseError(\"Expected a macro definition\");\n } else {\n delimiters[numArgs].push(tok.text);\n }\n } // replacement text, enclosed in '{' and '}' and properly nested\n\n\n var {\n tokens\n } = parser.gullet.consumeArg();\n\n if (insert) {\n tokens.unshift(insert);\n }\n\n if (funcName === \"\\\\edef\" || funcName === \"\\\\xdef\") {\n tokens = parser.gullet.expandTokens(tokens);\n tokens.reverse(); // to fit in with stack order\n } // Final arg is the expansion of the macro\n\n\n parser.gullet.macros.set(name, {\n tokens,\n numArgs,\n delimiters\n }, funcName === globalMap[funcName]);\n return {\n type: \"internal\",\n mode: parser.mode\n };\n }\n\n}); // -> \n// -> \\futurelet\n// | \\let\n// -> |=\n\ndefineFunction({\n type: \"internal\",\n names: [\"\\\\let\", \"\\\\\\\\globallet\" // can’t be entered directly\n ],\n props: {\n numArgs: 0,\n allowedInText: true,\n primitive: true\n },\n\n handler(_ref3) {\n var {\n parser,\n funcName\n } = _ref3;\n var name = checkControlSequence(parser.gullet.popToken());\n parser.gullet.consumeSpaces();\n var tok = getRHS(parser);\n letCommand(parser, name, tok, funcName === \"\\\\\\\\globallet\");\n return {\n type: \"internal\",\n mode: parser.mode\n };\n }\n\n}); // ref: https://www.tug.org/TUGboat/tb09-3/tb22bechtolsheim.pdf\n\ndefineFunction({\n type: \"internal\",\n names: [\"\\\\futurelet\", \"\\\\\\\\globalfuture\" // can’t be entered directly\n ],\n props: {\n numArgs: 0,\n allowedInText: true,\n primitive: true\n },\n\n handler(_ref4) {\n var {\n parser,\n funcName\n } = _ref4;\n var name = checkControlSequence(parser.gullet.popToken());\n var middle = parser.gullet.popToken();\n var tok = parser.gullet.popToken();\n letCommand(parser, name, tok, funcName === \"\\\\\\\\globalfuture\");\n parser.gullet.pushToken(tok);\n parser.gullet.pushToken(middle);\n return {\n type: \"internal\",\n mode: parser.mode\n };\n }\n\n});\n\n/**\n * This file deals with creating delimiters of various sizes. The TeXbook\n * discusses these routines on page 441-442, in the \"Another subroutine sets box\n * x to a specified variable delimiter\" paragraph.\n *\n * There are three main routines here. `makeSmallDelim` makes a delimiter in the\n * normal font, but in either text, script, or scriptscript style.\n * `makeLargeDelim` makes a delimiter in textstyle, but in one of the Size1,\n * Size2, Size3, or Size4 fonts. `makeStackedDelim` makes a delimiter out of\n * smaller pieces that are stacked on top of one another.\n *\n * The functions take a parameter `center`, which determines if the delimiter\n * should be centered around the axis.\n *\n * Then, there are three exposed functions. `sizedDelim` makes a delimiter in\n * one of the given sizes. This is used for things like `\\bigl`.\n * `customSizedDelim` makes a delimiter with a given total height+depth. It is\n * called in places like `\\sqrt`. `leftRightDelim` makes an appropriate\n * delimiter which surrounds an expression of a given height an depth. It is\n * used in `\\left` and `\\right`.\n */\n\n/**\n * Get the metrics for a given symbol and font, after transformation (i.e.\n * after following replacement from symbols.js)\n */\nvar getMetrics = function getMetrics(symbol, font, mode) {\n var replace = symbols.math[symbol] && symbols.math[symbol].replace;\n var metrics = getCharacterMetrics(replace || symbol, font, mode);\n\n if (!metrics) {\n throw new Error(\"Unsupported symbol \" + symbol + \" and font size \" + font + \".\");\n }\n\n return metrics;\n};\n/**\n * Puts a delimiter span in a given style, and adds appropriate height, depth,\n * and maxFontSizes.\n */\n\n\nvar styleWrap = function styleWrap(delim, toStyle, options, classes) {\n var newOptions = options.havingBaseStyle(toStyle);\n var span = buildCommon.makeSpan(classes.concat(newOptions.sizingClasses(options)), [delim], options);\n var delimSizeMultiplier = newOptions.sizeMultiplier / options.sizeMultiplier;\n span.height *= delimSizeMultiplier;\n span.depth *= delimSizeMultiplier;\n span.maxFontSize = newOptions.sizeMultiplier;\n return span;\n};\n\nvar centerSpan = function centerSpan(span, options, style) {\n var newOptions = options.havingBaseStyle(style);\n var shift = (1 - options.sizeMultiplier / newOptions.sizeMultiplier) * options.fontMetrics().axisHeight;\n span.classes.push(\"delimcenter\");\n span.style.top = makeEm(shift);\n span.height -= shift;\n span.depth += shift;\n};\n/**\n * Makes a small delimiter. This is a delimiter that comes in the Main-Regular\n * font, but is restyled to either be in textstyle, scriptstyle, or\n * scriptscriptstyle.\n */\n\n\nvar makeSmallDelim = function makeSmallDelim(delim, style, center, options, mode, classes) {\n var text = buildCommon.makeSymbol(delim, \"Main-Regular\", mode, options);\n var span = styleWrap(text, style, options, classes);\n\n if (center) {\n centerSpan(span, options, style);\n }\n\n return span;\n};\n/**\n * Builds a symbol in the given font size (note size is an integer)\n */\n\n\nvar mathrmSize = function mathrmSize(value, size, mode, options) {\n return buildCommon.makeSymbol(value, \"Size\" + size + \"-Regular\", mode, options);\n};\n/**\n * Makes a large delimiter. This is a delimiter that comes in the Size1, Size2,\n * Size3, or Size4 fonts. It is always rendered in textstyle.\n */\n\n\nvar makeLargeDelim = function makeLargeDelim(delim, size, center, options, mode, classes) {\n var inner = mathrmSize(delim, size, mode, options);\n var span = styleWrap(buildCommon.makeSpan([\"delimsizing\", \"size\" + size], [inner], options), Style$1.TEXT, options, classes);\n\n if (center) {\n centerSpan(span, options, Style$1.TEXT);\n }\n\n return span;\n};\n/**\n * Make a span from a font glyph with the given offset and in the given font.\n * This is used in makeStackedDelim to make the stacking pieces for the delimiter.\n */\n\n\nvar makeGlyphSpan = function makeGlyphSpan(symbol, font, mode) {\n var sizeClass; // Apply the correct CSS class to choose the right font.\n\n if (font === \"Size1-Regular\") {\n sizeClass = \"delim-size1\";\n } else\n /* if (font === \"Size4-Regular\") */\n {\n sizeClass = \"delim-size4\";\n }\n\n var corner = buildCommon.makeSpan([\"delimsizinginner\", sizeClass], [buildCommon.makeSpan([], [buildCommon.makeSymbol(symbol, font, mode)])]); // Since this will be passed into `makeVList` in the end, wrap the element\n // in the appropriate tag that VList uses.\n\n return {\n type: \"elem\",\n elem: corner\n };\n};\n\nvar makeInner = function makeInner(ch, height, options) {\n // Create a span with inline SVG for the inner part of a tall stacked delimiter.\n var width = fontMetricsData['Size4-Regular'][ch.charCodeAt(0)] ? fontMetricsData['Size4-Regular'][ch.charCodeAt(0)][4] : fontMetricsData['Size1-Regular'][ch.charCodeAt(0)][4];\n var path = new PathNode(\"inner\", innerPath(ch, Math.round(1000 * height)));\n var svgNode = new SvgNode([path], {\n \"width\": makeEm(width),\n \"height\": makeEm(height),\n // Override CSS rule `.katex svg { width: 100% }`\n \"style\": \"width:\" + makeEm(width),\n \"viewBox\": \"0 0 \" + 1000 * width + \" \" + Math.round(1000 * height),\n \"preserveAspectRatio\": \"xMinYMin\"\n });\n var span = buildCommon.makeSvgSpan([], [svgNode], options);\n span.height = height;\n span.style.height = makeEm(height);\n span.style.width = makeEm(width);\n return {\n type: \"elem\",\n elem: span\n };\n}; // Helpers for makeStackedDelim\n\n\nvar lapInEms = 0.008;\nvar lap = {\n type: \"kern\",\n size: -1 * lapInEms\n};\nvar verts = [\"|\", \"\\\\lvert\", \"\\\\rvert\", \"\\\\vert\"];\nvar doubleVerts = [\"\\\\|\", \"\\\\lVert\", \"\\\\rVert\", \"\\\\Vert\"];\n/**\n * Make a stacked delimiter out of a given delimiter, with the total height at\n * least `heightTotal`. This routine is mentioned on page 442 of the TeXbook.\n */\n\nvar makeStackedDelim = function makeStackedDelim(delim, heightTotal, center, options, mode, classes) {\n // There are four parts, the top, an optional middle, a repeated part, and a\n // bottom.\n var top;\n var middle;\n var repeat;\n var bottom;\n var svgLabel = \"\";\n var viewBoxWidth = 0;\n top = repeat = bottom = delim;\n middle = null; // Also keep track of what font the delimiters are in\n\n var font = \"Size1-Regular\"; // We set the parts and font based on the symbol. Note that we use\n // '\\u23d0' instead of '|' and '\\u2016' instead of '\\\\|' for the\n // repeats of the arrows\n\n if (delim === \"\\\\uparrow\") {\n repeat = bottom = \"\\u23d0\";\n } else if (delim === \"\\\\Uparrow\") {\n repeat = bottom = \"\\u2016\";\n } else if (delim === \"\\\\downarrow\") {\n top = repeat = \"\\u23d0\";\n } else if (delim === \"\\\\Downarrow\") {\n top = repeat = \"\\u2016\";\n } else if (delim === \"\\\\updownarrow\") {\n top = \"\\\\uparrow\";\n repeat = \"\\u23d0\";\n bottom = \"\\\\downarrow\";\n } else if (delim === \"\\\\Updownarrow\") {\n top = \"\\\\Uparrow\";\n repeat = \"\\u2016\";\n bottom = \"\\\\Downarrow\";\n } else if (utils.contains(verts, delim)) {\n repeat = \"\\u2223\";\n svgLabel = \"vert\";\n viewBoxWidth = 333;\n } else if (utils.contains(doubleVerts, delim)) {\n repeat = \"\\u2225\";\n svgLabel = \"doublevert\";\n viewBoxWidth = 556;\n } else if (delim === \"[\" || delim === \"\\\\lbrack\") {\n top = \"\\u23a1\";\n repeat = \"\\u23a2\";\n bottom = \"\\u23a3\";\n font = \"Size4-Regular\";\n svgLabel = \"lbrack\";\n viewBoxWidth = 667;\n } else if (delim === \"]\" || delim === \"\\\\rbrack\") {\n top = \"\\u23a4\";\n repeat = \"\\u23a5\";\n bottom = \"\\u23a6\";\n font = \"Size4-Regular\";\n svgLabel = \"rbrack\";\n viewBoxWidth = 667;\n } else if (delim === \"\\\\lfloor\" || delim === \"\\u230a\") {\n repeat = top = \"\\u23a2\";\n bottom = \"\\u23a3\";\n font = \"Size4-Regular\";\n svgLabel = \"lfloor\";\n viewBoxWidth = 667;\n } else if (delim === \"\\\\lceil\" || delim === \"\\u2308\") {\n top = \"\\u23a1\";\n repeat = bottom = \"\\u23a2\";\n font = \"Size4-Regular\";\n svgLabel = \"lceil\";\n viewBoxWidth = 667;\n } else if (delim === \"\\\\rfloor\" || delim === \"\\u230b\") {\n repeat = top = \"\\u23a5\";\n bottom = \"\\u23a6\";\n font = \"Size4-Regular\";\n svgLabel = \"rfloor\";\n viewBoxWidth = 667;\n } else if (delim === \"\\\\rceil\" || delim === \"\\u2309\") {\n top = \"\\u23a4\";\n repeat = bottom = \"\\u23a5\";\n font = \"Size4-Regular\";\n svgLabel = \"rceil\";\n viewBoxWidth = 667;\n } else if (delim === \"(\" || delim === \"\\\\lparen\") {\n top = \"\\u239b\";\n repeat = \"\\u239c\";\n bottom = \"\\u239d\";\n font = \"Size4-Regular\";\n svgLabel = \"lparen\";\n viewBoxWidth = 875;\n } else if (delim === \")\" || delim === \"\\\\rparen\") {\n top = \"\\u239e\";\n repeat = \"\\u239f\";\n bottom = \"\\u23a0\";\n font = \"Size4-Regular\";\n svgLabel = \"rparen\";\n viewBoxWidth = 875;\n } else if (delim === \"\\\\{\" || delim === \"\\\\lbrace\") {\n top = \"\\u23a7\";\n middle = \"\\u23a8\";\n bottom = \"\\u23a9\";\n repeat = \"\\u23aa\";\n font = \"Size4-Regular\";\n } else if (delim === \"\\\\}\" || delim === \"\\\\rbrace\") {\n top = \"\\u23ab\";\n middle = \"\\u23ac\";\n bottom = \"\\u23ad\";\n repeat = \"\\u23aa\";\n font = \"Size4-Regular\";\n } else if (delim === \"\\\\lgroup\" || delim === \"\\u27ee\") {\n top = \"\\u23a7\";\n bottom = \"\\u23a9\";\n repeat = \"\\u23aa\";\n font = \"Size4-Regular\";\n } else if (delim === \"\\\\rgroup\" || delim === \"\\u27ef\") {\n top = \"\\u23ab\";\n bottom = \"\\u23ad\";\n repeat = \"\\u23aa\";\n font = \"Size4-Regular\";\n } else if (delim === \"\\\\lmoustache\" || delim === \"\\u23b0\") {\n top = \"\\u23a7\";\n bottom = \"\\u23ad\";\n repeat = \"\\u23aa\";\n font = \"Size4-Regular\";\n } else if (delim === \"\\\\rmoustache\" || delim === \"\\u23b1\") {\n top = \"\\u23ab\";\n bottom = \"\\u23a9\";\n repeat = \"\\u23aa\";\n font = \"Size4-Regular\";\n } // Get the metrics of the four sections\n\n\n var topMetrics = getMetrics(top, font, mode);\n var topHeightTotal = topMetrics.height + topMetrics.depth;\n var repeatMetrics = getMetrics(repeat, font, mode);\n var repeatHeightTotal = repeatMetrics.height + repeatMetrics.depth;\n var bottomMetrics = getMetrics(bottom, font, mode);\n var bottomHeightTotal = bottomMetrics.height + bottomMetrics.depth;\n var middleHeightTotal = 0;\n var middleFactor = 1;\n\n if (middle !== null) {\n var middleMetrics = getMetrics(middle, font, mode);\n middleHeightTotal = middleMetrics.height + middleMetrics.depth;\n middleFactor = 2; // repeat symmetrically above and below middle\n } // Calculate the minimal height that the delimiter can have.\n // It is at least the size of the top, bottom, and optional middle combined.\n\n\n var minHeight = topHeightTotal + bottomHeightTotal + middleHeightTotal; // Compute the number of copies of the repeat symbol we will need\n\n var repeatCount = Math.max(0, Math.ceil((heightTotal - minHeight) / (middleFactor * repeatHeightTotal))); // Compute the total height of the delimiter including all the symbols\n\n var realHeightTotal = minHeight + repeatCount * middleFactor * repeatHeightTotal; // The center of the delimiter is placed at the center of the axis. Note\n // that in this context, \"center\" means that the delimiter should be\n // centered around the axis in the current style, while normally it is\n // centered around the axis in textstyle.\n\n var axisHeight = options.fontMetrics().axisHeight;\n\n if (center) {\n axisHeight *= options.sizeMultiplier;\n } // Calculate the depth\n\n\n var depth = realHeightTotal / 2 - axisHeight; // Now, we start building the pieces that will go into the vlist\n // Keep a list of the pieces of the stacked delimiter\n\n var stack = [];\n\n if (svgLabel.length > 0) {\n // Instead of stacking glyphs, create a single SVG.\n // This evades browser problems with imprecise positioning of spans.\n var midHeight = realHeightTotal - topHeightTotal - bottomHeightTotal;\n var viewBoxHeight = Math.round(realHeightTotal * 1000);\n var pathStr = tallDelim(svgLabel, Math.round(midHeight * 1000));\n var path = new PathNode(svgLabel, pathStr);\n var width = (viewBoxWidth / 1000).toFixed(3) + \"em\";\n var height = (viewBoxHeight / 1000).toFixed(3) + \"em\";\n var svg = new SvgNode([path], {\n \"width\": width,\n \"height\": height,\n \"viewBox\": \"0 0 \" + viewBoxWidth + \" \" + viewBoxHeight\n });\n var wrapper = buildCommon.makeSvgSpan([], [svg], options);\n wrapper.height = viewBoxHeight / 1000;\n wrapper.style.width = width;\n wrapper.style.height = height;\n stack.push({\n type: \"elem\",\n elem: wrapper\n });\n } else {\n // Stack glyphs\n // Start by adding the bottom symbol\n stack.push(makeGlyphSpan(bottom, font, mode));\n stack.push(lap); // overlap\n\n if (middle === null) {\n // The middle section will be an SVG. Make it an extra 0.016em tall.\n // We'll overlap by 0.008em at top and bottom.\n var innerHeight = realHeightTotal - topHeightTotal - bottomHeightTotal + 2 * lapInEms;\n stack.push(makeInner(repeat, innerHeight, options));\n } else {\n // When there is a middle bit, we need the middle part and two repeated\n // sections\n var _innerHeight = (realHeightTotal - topHeightTotal - bottomHeightTotal - middleHeightTotal) / 2 + 2 * lapInEms;\n\n stack.push(makeInner(repeat, _innerHeight, options)); // Now insert the middle of the brace.\n\n stack.push(lap);\n stack.push(makeGlyphSpan(middle, font, mode));\n stack.push(lap);\n stack.push(makeInner(repeat, _innerHeight, options));\n } // Add the top symbol\n\n\n stack.push(lap);\n stack.push(makeGlyphSpan(top, font, mode));\n } // Finally, build the vlist\n\n\n var newOptions = options.havingBaseStyle(Style$1.TEXT);\n var inner = buildCommon.makeVList({\n positionType: \"bottom\",\n positionData: depth,\n children: stack\n }, newOptions);\n return styleWrap(buildCommon.makeSpan([\"delimsizing\", \"mult\"], [inner], newOptions), Style$1.TEXT, options, classes);\n}; // All surds have 0.08em padding above the vinculum inside the SVG.\n// That keeps browser span height rounding error from pinching the line.\n\n\nvar vbPad = 80; // padding above the surd, measured inside the viewBox.\n\nvar emPad = 0.08; // padding, in ems, measured in the document.\n\nvar sqrtSvg = function sqrtSvg(sqrtName, height, viewBoxHeight, extraVinculum, options) {\n var path = sqrtPath(sqrtName, extraVinculum, viewBoxHeight);\n var pathNode = new PathNode(sqrtName, path);\n var svg = new SvgNode([pathNode], {\n // Note: 1000:1 ratio of viewBox to document em width.\n \"width\": \"400em\",\n \"height\": makeEm(height),\n \"viewBox\": \"0 0 400000 \" + viewBoxHeight,\n \"preserveAspectRatio\": \"xMinYMin slice\"\n });\n return buildCommon.makeSvgSpan([\"hide-tail\"], [svg], options);\n};\n/**\n * Make a sqrt image of the given height,\n */\n\n\nvar makeSqrtImage = function makeSqrtImage(height, options) {\n // Define a newOptions that removes the effect of size changes such as \\Huge.\n // We don't pick different a height surd for \\Huge. For it, we scale up.\n var newOptions = options.havingBaseSizing(); // Pick the desired surd glyph from a sequence of surds.\n\n var delim = traverseSequence(\"\\\\surd\", height * newOptions.sizeMultiplier, stackLargeDelimiterSequence, newOptions);\n var sizeMultiplier = newOptions.sizeMultiplier; // default\n // The standard sqrt SVGs each have a 0.04em thick vinculum.\n // If Settings.minRuleThickness is larger than that, we add extraVinculum.\n\n var extraVinculum = Math.max(0, options.minRuleThickness - options.fontMetrics().sqrtRuleThickness); // Create a span containing an SVG image of a sqrt symbol.\n\n var span;\n var spanHeight = 0;\n var texHeight = 0;\n var viewBoxHeight = 0;\n var advanceWidth; // We create viewBoxes with 80 units of \"padding\" above each surd.\n // Then browser rounding error on the parent span height will not\n // encroach on the ink of the vinculum. But that padding is not\n // included in the TeX-like `height` used for calculation of\n // vertical alignment. So texHeight = span.height < span.style.height.\n\n if (delim.type === \"small\") {\n // Get an SVG that is derived from glyph U+221A in font KaTeX-Main.\n // 1000 unit normal glyph height.\n viewBoxHeight = 1000 + 1000 * extraVinculum + vbPad;\n\n if (height < 1.0) {\n sizeMultiplier = 1.0; // mimic a \\textfont radical\n } else if (height < 1.4) {\n sizeMultiplier = 0.7; // mimic a \\scriptfont radical\n }\n\n spanHeight = (1.0 + extraVinculum + emPad) / sizeMultiplier;\n texHeight = (1.00 + extraVinculum) / sizeMultiplier;\n span = sqrtSvg(\"sqrtMain\", spanHeight, viewBoxHeight, extraVinculum, options);\n span.style.minWidth = \"0.853em\";\n advanceWidth = 0.833 / sizeMultiplier; // from the font.\n } else if (delim.type === \"large\") {\n // These SVGs come from fonts: KaTeX_Size1, _Size2, etc.\n viewBoxHeight = (1000 + vbPad) * sizeToMaxHeight[delim.size];\n texHeight = (sizeToMaxHeight[delim.size] + extraVinculum) / sizeMultiplier;\n spanHeight = (sizeToMaxHeight[delim.size] + extraVinculum + emPad) / sizeMultiplier;\n span = sqrtSvg(\"sqrtSize\" + delim.size, spanHeight, viewBoxHeight, extraVinculum, options);\n span.style.minWidth = \"1.02em\";\n advanceWidth = 1.0 / sizeMultiplier; // 1.0 from the font.\n } else {\n // Tall sqrt. In TeX, this would be stacked using multiple glyphs.\n // We'll use a single SVG to accomplish the same thing.\n spanHeight = height + extraVinculum + emPad;\n texHeight = height + extraVinculum;\n viewBoxHeight = Math.floor(1000 * height + extraVinculum) + vbPad;\n span = sqrtSvg(\"sqrtTall\", spanHeight, viewBoxHeight, extraVinculum, options);\n span.style.minWidth = \"0.742em\";\n advanceWidth = 1.056;\n }\n\n span.height = texHeight;\n span.style.height = makeEm(spanHeight);\n return {\n span,\n advanceWidth,\n // Calculate the actual line width.\n // This actually should depend on the chosen font -- e.g. \\boldmath\n // should use the thicker surd symbols from e.g. KaTeX_Main-Bold, and\n // have thicker rules.\n ruleWidth: (options.fontMetrics().sqrtRuleThickness + extraVinculum) * sizeMultiplier\n };\n}; // There are three kinds of delimiters, delimiters that stack when they become\n// too large\n\n\nvar stackLargeDelimiters = [\"(\", \"\\\\lparen\", \")\", \"\\\\rparen\", \"[\", \"\\\\lbrack\", \"]\", \"\\\\rbrack\", \"\\\\{\", \"\\\\lbrace\", \"\\\\}\", \"\\\\rbrace\", \"\\\\lfloor\", \"\\\\rfloor\", \"\\u230a\", \"\\u230b\", \"\\\\lceil\", \"\\\\rceil\", \"\\u2308\", \"\\u2309\", \"\\\\surd\"]; // delimiters that always stack\n\nvar stackAlwaysDelimiters = [\"\\\\uparrow\", \"\\\\downarrow\", \"\\\\updownarrow\", \"\\\\Uparrow\", \"\\\\Downarrow\", \"\\\\Updownarrow\", \"|\", \"\\\\|\", \"\\\\vert\", \"\\\\Vert\", \"\\\\lvert\", \"\\\\rvert\", \"\\\\lVert\", \"\\\\rVert\", \"\\\\lgroup\", \"\\\\rgroup\", \"\\u27ee\", \"\\u27ef\", \"\\\\lmoustache\", \"\\\\rmoustache\", \"\\u23b0\", \"\\u23b1\"]; // and delimiters that never stack\n\nvar stackNeverDelimiters = [\"<\", \">\", \"\\\\langle\", \"\\\\rangle\", \"/\", \"\\\\backslash\", \"\\\\lt\", \"\\\\gt\"]; // Metrics of the different sizes. Found by looking at TeX's output of\n// $\\bigl| // \\Bigl| \\biggl| \\Biggl| \\showlists$\n// Used to create stacked delimiters of appropriate sizes in makeSizedDelim.\n\nvar sizeToMaxHeight = [0, 1.2, 1.8, 2.4, 3.0];\n/**\n * Used to create a delimiter of a specific size, where `size` is 1, 2, 3, or 4.\n */\n\nvar makeSizedDelim = function makeSizedDelim(delim, size, options, mode, classes) {\n // < and > turn into \\langle and \\rangle in delimiters\n if (delim === \"<\" || delim === \"\\\\lt\" || delim === \"\\u27e8\") {\n delim = \"\\\\langle\";\n } else if (delim === \">\" || delim === \"\\\\gt\" || delim === \"\\u27e9\") {\n delim = \"\\\\rangle\";\n } // Sized delimiters are never centered.\n\n\n if (utils.contains(stackLargeDelimiters, delim) || utils.contains(stackNeverDelimiters, delim)) {\n return makeLargeDelim(delim, size, false, options, mode, classes);\n } else if (utils.contains(stackAlwaysDelimiters, delim)) {\n return makeStackedDelim(delim, sizeToMaxHeight[size], false, options, mode, classes);\n } else {\n throw new ParseError(\"Illegal delimiter: '\" + delim + \"'\");\n }\n};\n/**\n * There are three different sequences of delimiter sizes that the delimiters\n * follow depending on the kind of delimiter. This is used when creating custom\n * sized delimiters to decide whether to create a small, large, or stacked\n * delimiter.\n *\n * In real TeX, these sequences aren't explicitly defined, but are instead\n * defined inside the font metrics. Since there are only three sequences that\n * are possible for the delimiters that TeX defines, it is easier to just encode\n * them explicitly here.\n */\n\n\n// Delimiters that never stack try small delimiters and large delimiters only\nvar stackNeverDelimiterSequence = [{\n type: \"small\",\n style: Style$1.SCRIPTSCRIPT\n}, {\n type: \"small\",\n style: Style$1.SCRIPT\n}, {\n type: \"small\",\n style: Style$1.TEXT\n}, {\n type: \"large\",\n size: 1\n}, {\n type: \"large\",\n size: 2\n}, {\n type: \"large\",\n size: 3\n}, {\n type: \"large\",\n size: 4\n}]; // Delimiters that always stack try the small delimiters first, then stack\n\nvar stackAlwaysDelimiterSequence = [{\n type: \"small\",\n style: Style$1.SCRIPTSCRIPT\n}, {\n type: \"small\",\n style: Style$1.SCRIPT\n}, {\n type: \"small\",\n style: Style$1.TEXT\n}, {\n type: \"stack\"\n}]; // Delimiters that stack when large try the small and then large delimiters, and\n// stack afterwards\n\nvar stackLargeDelimiterSequence = [{\n type: \"small\",\n style: Style$1.SCRIPTSCRIPT\n}, {\n type: \"small\",\n style: Style$1.SCRIPT\n}, {\n type: \"small\",\n style: Style$1.TEXT\n}, {\n type: \"large\",\n size: 1\n}, {\n type: \"large\",\n size: 2\n}, {\n type: \"large\",\n size: 3\n}, {\n type: \"large\",\n size: 4\n}, {\n type: \"stack\"\n}];\n/**\n * Get the font used in a delimiter based on what kind of delimiter it is.\n * TODO(#963) Use more specific font family return type once that is introduced.\n */\n\nvar delimTypeToFont = function delimTypeToFont(type) {\n if (type.type === \"small\") {\n return \"Main-Regular\";\n } else if (type.type === \"large\") {\n return \"Size\" + type.size + \"-Regular\";\n } else if (type.type === \"stack\") {\n return \"Size4-Regular\";\n } else {\n throw new Error(\"Add support for delim type '\" + type.type + \"' here.\");\n }\n};\n/**\n * Traverse a sequence of types of delimiters to decide what kind of delimiter\n * should be used to create a delimiter of the given height+depth.\n */\n\n\nvar traverseSequence = function traverseSequence(delim, height, sequence, options) {\n // Here, we choose the index we should start at in the sequences. In smaller\n // sizes (which correspond to larger numbers in style.size) we start earlier\n // in the sequence. Thus, scriptscript starts at index 3-3=0, script starts\n // at index 3-2=1, text starts at 3-1=2, and display starts at min(2,3-0)=2\n var start = Math.min(2, 3 - options.style.size);\n\n for (var i = start; i < sequence.length; i++) {\n if (sequence[i].type === \"stack\") {\n // This is always the last delimiter, so we just break the loop now.\n break;\n }\n\n var metrics = getMetrics(delim, delimTypeToFont(sequence[i]), \"math\");\n var heightDepth = metrics.height + metrics.depth; // Small delimiters are scaled down versions of the same font, so we\n // account for the style change size.\n\n if (sequence[i].type === \"small\") {\n var newOptions = options.havingBaseStyle(sequence[i].style);\n heightDepth *= newOptions.sizeMultiplier;\n } // Check if the delimiter at this size works for the given height.\n\n\n if (heightDepth > height) {\n return sequence[i];\n }\n } // If we reached the end of the sequence, return the last sequence element.\n\n\n return sequence[sequence.length - 1];\n};\n/**\n * Make a delimiter of a given height+depth, with optional centering. Here, we\n * traverse the sequences, and create a delimiter that the sequence tells us to.\n */\n\n\nvar makeCustomSizedDelim = function makeCustomSizedDelim(delim, height, center, options, mode, classes) {\n if (delim === \"<\" || delim === \"\\\\lt\" || delim === \"\\u27e8\") {\n delim = \"\\\\langle\";\n } else if (delim === \">\" || delim === \"\\\\gt\" || delim === \"\\u27e9\") {\n delim = \"\\\\rangle\";\n } // Decide what sequence to use\n\n\n var sequence;\n\n if (utils.contains(stackNeverDelimiters, delim)) {\n sequence = stackNeverDelimiterSequence;\n } else if (utils.contains(stackLargeDelimiters, delim)) {\n sequence = stackLargeDelimiterSequence;\n } else {\n sequence = stackAlwaysDelimiterSequence;\n } // Look through the sequence\n\n\n var delimType = traverseSequence(delim, height, sequence, options); // Get the delimiter from font glyphs.\n // Depending on the sequence element we decided on, call the\n // appropriate function.\n\n if (delimType.type === \"small\") {\n return makeSmallDelim(delim, delimType.style, center, options, mode, classes);\n } else if (delimType.type === \"large\") {\n return makeLargeDelim(delim, delimType.size, center, options, mode, classes);\n } else\n /* if (delimType.type === \"stack\") */\n {\n return makeStackedDelim(delim, height, center, options, mode, classes);\n }\n};\n/**\n * Make a delimiter for use with `\\left` and `\\right`, given a height and depth\n * of an expression that the delimiters surround.\n */\n\n\nvar makeLeftRightDelim = function makeLeftRightDelim(delim, height, depth, options, mode, classes) {\n // We always center \\left/\\right delimiters, so the axis is always shifted\n var axisHeight = options.fontMetrics().axisHeight * options.sizeMultiplier; // Taken from TeX source, tex.web, function make_left_right\n\n var delimiterFactor = 901;\n var delimiterExtend = 5.0 / options.fontMetrics().ptPerEm;\n var maxDistFromAxis = Math.max(height - axisHeight, depth + axisHeight);\n var totalHeight = Math.max( // In real TeX, calculations are done using integral values which are\n // 65536 per pt, or 655360 per em. So, the division here truncates in\n // TeX but doesn't here, producing different results. If we wanted to\n // exactly match TeX's calculation, we could do\n // Math.floor(655360 * maxDistFromAxis / 500) *\n // delimiterFactor / 655360\n // (To see the difference, compare\n // x^{x^{\\left(\\rule{0.1em}{0.68em}\\right)}}\n // in TeX and KaTeX)\n maxDistFromAxis / 500 * delimiterFactor, 2 * maxDistFromAxis - delimiterExtend); // Finally, we defer to `makeCustomSizedDelim` with our calculated total\n // height\n\n return makeCustomSizedDelim(delim, totalHeight, true, options, mode, classes);\n};\n\nvar delimiter = {\n sqrtImage: makeSqrtImage,\n sizedDelim: makeSizedDelim,\n sizeToMaxHeight: sizeToMaxHeight,\n customSizedDelim: makeCustomSizedDelim,\n leftRightDelim: makeLeftRightDelim\n};\n\n// Extra data needed for the delimiter handler down below\nvar delimiterSizes = {\n \"\\\\bigl\": {\n mclass: \"mopen\",\n size: 1\n },\n \"\\\\Bigl\": {\n mclass: \"mopen\",\n size: 2\n },\n \"\\\\biggl\": {\n mclass: \"mopen\",\n size: 3\n },\n \"\\\\Biggl\": {\n mclass: \"mopen\",\n size: 4\n },\n \"\\\\bigr\": {\n mclass: \"mclose\",\n size: 1\n },\n \"\\\\Bigr\": {\n mclass: \"mclose\",\n size: 2\n },\n \"\\\\biggr\": {\n mclass: \"mclose\",\n size: 3\n },\n \"\\\\Biggr\": {\n mclass: \"mclose\",\n size: 4\n },\n \"\\\\bigm\": {\n mclass: \"mrel\",\n size: 1\n },\n \"\\\\Bigm\": {\n mclass: \"mrel\",\n size: 2\n },\n \"\\\\biggm\": {\n mclass: \"mrel\",\n size: 3\n },\n \"\\\\Biggm\": {\n mclass: \"mrel\",\n size: 4\n },\n \"\\\\big\": {\n mclass: \"mord\",\n size: 1\n },\n \"\\\\Big\": {\n mclass: \"mord\",\n size: 2\n },\n \"\\\\bigg\": {\n mclass: \"mord\",\n size: 3\n },\n \"\\\\Bigg\": {\n mclass: \"mord\",\n size: 4\n }\n};\nvar delimiters = [\"(\", \"\\\\lparen\", \")\", \"\\\\rparen\", \"[\", \"\\\\lbrack\", \"]\", \"\\\\rbrack\", \"\\\\{\", \"\\\\lbrace\", \"\\\\}\", \"\\\\rbrace\", \"\\\\lfloor\", \"\\\\rfloor\", \"\\u230a\", \"\\u230b\", \"\\\\lceil\", \"\\\\rceil\", \"\\u2308\", \"\\u2309\", \"<\", \">\", \"\\\\langle\", \"\\u27e8\", \"\\\\rangle\", \"\\u27e9\", \"\\\\lt\", \"\\\\gt\", \"\\\\lvert\", \"\\\\rvert\", \"\\\\lVert\", \"\\\\rVert\", \"\\\\lgroup\", \"\\\\rgroup\", \"\\u27ee\", \"\\u27ef\", \"\\\\lmoustache\", \"\\\\rmoustache\", \"\\u23b0\", \"\\u23b1\", \"/\", \"\\\\backslash\", \"|\", \"\\\\vert\", \"\\\\|\", \"\\\\Vert\", \"\\\\uparrow\", \"\\\\Uparrow\", \"\\\\downarrow\", \"\\\\Downarrow\", \"\\\\updownarrow\", \"\\\\Updownarrow\", \".\"];\n\n// Delimiter functions\nfunction checkDelimiter(delim, context) {\n var symDelim = checkSymbolNodeType(delim);\n\n if (symDelim && utils.contains(delimiters, symDelim.text)) {\n return symDelim;\n } else if (symDelim) {\n throw new ParseError(\"Invalid delimiter '\" + symDelim.text + \"' after '\" + context.funcName + \"'\", delim);\n } else {\n throw new ParseError(\"Invalid delimiter type '\" + delim.type + \"'\", delim);\n }\n}\n\ndefineFunction({\n type: \"delimsizing\",\n names: [\"\\\\bigl\", \"\\\\Bigl\", \"\\\\biggl\", \"\\\\Biggl\", \"\\\\bigr\", \"\\\\Bigr\", \"\\\\biggr\", \"\\\\Biggr\", \"\\\\bigm\", \"\\\\Bigm\", \"\\\\biggm\", \"\\\\Biggm\", \"\\\\big\", \"\\\\Big\", \"\\\\bigg\", \"\\\\Bigg\"],\n props: {\n numArgs: 1,\n argTypes: [\"primitive\"]\n },\n handler: (context, args) => {\n var delim = checkDelimiter(args[0], context);\n return {\n type: \"delimsizing\",\n mode: context.parser.mode,\n size: delimiterSizes[context.funcName].size,\n mclass: delimiterSizes[context.funcName].mclass,\n delim: delim.text\n };\n },\n htmlBuilder: (group, options) => {\n if (group.delim === \".\") {\n // Empty delimiters still count as elements, even though they don't\n // show anything.\n return buildCommon.makeSpan([group.mclass]);\n } // Use delimiter.sizedDelim to generate the delimiter.\n\n\n return delimiter.sizedDelim(group.delim, group.size, options, group.mode, [group.mclass]);\n },\n mathmlBuilder: group => {\n var children = [];\n\n if (group.delim !== \".\") {\n children.push(makeText(group.delim, group.mode));\n }\n\n var node = new mathMLTree.MathNode(\"mo\", children);\n\n if (group.mclass === \"mopen\" || group.mclass === \"mclose\") {\n // Only some of the delimsizing functions act as fences, and they\n // return \"mopen\" or \"mclose\" mclass.\n node.setAttribute(\"fence\", \"true\");\n } else {\n // Explicitly disable fencing if it's not a fence, to override the\n // defaults.\n node.setAttribute(\"fence\", \"false\");\n }\n\n node.setAttribute(\"stretchy\", \"true\");\n var size = makeEm(delimiter.sizeToMaxHeight[group.size]);\n node.setAttribute(\"minsize\", size);\n node.setAttribute(\"maxsize\", size);\n return node;\n }\n});\n\nfunction assertParsed(group) {\n if (!group.body) {\n throw new Error(\"Bug: The leftright ParseNode wasn't fully parsed.\");\n }\n}\n\ndefineFunction({\n type: \"leftright-right\",\n names: [\"\\\\right\"],\n props: {\n numArgs: 1,\n primitive: true\n },\n handler: (context, args) => {\n // \\left case below triggers parsing of \\right in\n // `const right = parser.parseFunction();`\n // uses this return value.\n var color = context.parser.gullet.macros.get(\"\\\\current@color\");\n\n if (color && typeof color !== \"string\") {\n throw new ParseError(\"\\\\current@color set to non-string in \\\\right\");\n }\n\n return {\n type: \"leftright-right\",\n mode: context.parser.mode,\n delim: checkDelimiter(args[0], context).text,\n color // undefined if not set via \\color\n\n };\n }\n});\ndefineFunction({\n type: \"leftright\",\n names: [\"\\\\left\"],\n props: {\n numArgs: 1,\n primitive: true\n },\n handler: (context, args) => {\n var delim = checkDelimiter(args[0], context);\n var parser = context.parser; // Parse out the implicit body\n\n ++parser.leftrightDepth; // parseExpression stops before '\\\\right'\n\n var body = parser.parseExpression(false);\n --parser.leftrightDepth; // Check the next token\n\n parser.expect(\"\\\\right\", false);\n var right = assertNodeType(parser.parseFunction(), \"leftright-right\");\n return {\n type: \"leftright\",\n mode: parser.mode,\n body,\n left: delim.text,\n right: right.delim,\n rightColor: right.color\n };\n },\n htmlBuilder: (group, options) => {\n assertParsed(group); // Build the inner expression\n\n var inner = buildExpression$1(group.body, options, true, [\"mopen\", \"mclose\"]);\n var innerHeight = 0;\n var innerDepth = 0;\n var hadMiddle = false; // Calculate its height and depth\n\n for (var i = 0; i < inner.length; i++) {\n // Property `isMiddle` not defined on `span`. See comment in\n // \"middle\"'s htmlBuilder.\n // $FlowFixMe\n if (inner[i].isMiddle) {\n hadMiddle = true;\n } else {\n innerHeight = Math.max(inner[i].height, innerHeight);\n innerDepth = Math.max(inner[i].depth, innerDepth);\n }\n } // The size of delimiters is the same, regardless of what style we are\n // in. Thus, to correctly calculate the size of delimiter we need around\n // a group, we scale down the inner size based on the size.\n\n\n innerHeight *= options.sizeMultiplier;\n innerDepth *= options.sizeMultiplier;\n var leftDelim;\n\n if (group.left === \".\") {\n // Empty delimiters in \\left and \\right make null delimiter spaces.\n leftDelim = makeNullDelimiter(options, [\"mopen\"]);\n } else {\n // Otherwise, use leftRightDelim to generate the correct sized\n // delimiter.\n leftDelim = delimiter.leftRightDelim(group.left, innerHeight, innerDepth, options, group.mode, [\"mopen\"]);\n } // Add it to the beginning of the expression\n\n\n inner.unshift(leftDelim); // Handle middle delimiters\n\n if (hadMiddle) {\n for (var _i = 1; _i < inner.length; _i++) {\n var middleDelim = inner[_i]; // Property `isMiddle` not defined on `span`. See comment in\n // \"middle\"'s htmlBuilder.\n // $FlowFixMe\n\n var isMiddle = middleDelim.isMiddle;\n\n if (isMiddle) {\n // Apply the options that were active when \\middle was called\n inner[_i] = delimiter.leftRightDelim(isMiddle.delim, innerHeight, innerDepth, isMiddle.options, group.mode, []);\n }\n }\n }\n\n var rightDelim; // Same for the right delimiter, but using color specified by \\color\n\n if (group.right === \".\") {\n rightDelim = makeNullDelimiter(options, [\"mclose\"]);\n } else {\n var colorOptions = group.rightColor ? options.withColor(group.rightColor) : options;\n rightDelim = delimiter.leftRightDelim(group.right, innerHeight, innerDepth, colorOptions, group.mode, [\"mclose\"]);\n } // Add it to the end of the expression.\n\n\n inner.push(rightDelim);\n return buildCommon.makeSpan([\"minner\"], inner, options);\n },\n mathmlBuilder: (group, options) => {\n assertParsed(group);\n var inner = buildExpression(group.body, options);\n\n if (group.left !== \".\") {\n var leftNode = new mathMLTree.MathNode(\"mo\", [makeText(group.left, group.mode)]);\n leftNode.setAttribute(\"fence\", \"true\");\n inner.unshift(leftNode);\n }\n\n if (group.right !== \".\") {\n var rightNode = new mathMLTree.MathNode(\"mo\", [makeText(group.right, group.mode)]);\n rightNode.setAttribute(\"fence\", \"true\");\n\n if (group.rightColor) {\n rightNode.setAttribute(\"mathcolor\", group.rightColor);\n }\n\n inner.push(rightNode);\n }\n\n return makeRow(inner);\n }\n});\ndefineFunction({\n type: \"middle\",\n names: [\"\\\\middle\"],\n props: {\n numArgs: 1,\n primitive: true\n },\n handler: (context, args) => {\n var delim = checkDelimiter(args[0], context);\n\n if (!context.parser.leftrightDepth) {\n throw new ParseError(\"\\\\middle without preceding \\\\left\", delim);\n }\n\n return {\n type: \"middle\",\n mode: context.parser.mode,\n delim: delim.text\n };\n },\n htmlBuilder: (group, options) => {\n var middleDelim;\n\n if (group.delim === \".\") {\n middleDelim = makeNullDelimiter(options, []);\n } else {\n middleDelim = delimiter.sizedDelim(group.delim, 1, options, group.mode, []);\n var isMiddle = {\n delim: group.delim,\n options\n }; // Property `isMiddle` not defined on `span`. It is only used in\n // this file above.\n // TODO: Fix this violation of the `span` type and possibly rename\n // things since `isMiddle` sounds like a boolean, but is a struct.\n // $FlowFixMe\n\n middleDelim.isMiddle = isMiddle;\n }\n\n return middleDelim;\n },\n mathmlBuilder: (group, options) => {\n // A Firefox \\middle will stretch a character vertically only if it\n // is in the fence part of the operator dictionary at:\n // https://www.w3.org/TR/MathML3/appendixc.html.\n // So we need to avoid U+2223 and use plain \"|\" instead.\n var textNode = group.delim === \"\\\\vert\" || group.delim === \"|\" ? makeText(\"|\", \"text\") : makeText(group.delim, group.mode);\n var middleNode = new mathMLTree.MathNode(\"mo\", [textNode]);\n middleNode.setAttribute(\"fence\", \"true\"); // MathML gives 5/18em spacing to each element.\n // \\middle should get delimiter spacing instead.\n\n middleNode.setAttribute(\"lspace\", \"0.05em\");\n middleNode.setAttribute(\"rspace\", \"0.05em\");\n return middleNode;\n }\n});\n\nvar htmlBuilder$7 = (group, options) => {\n // \\cancel, \\bcancel, \\xcancel, \\sout, \\fbox, \\colorbox, \\fcolorbox, \\phase\n // Some groups can return document fragments. Handle those by wrapping\n // them in a span.\n var inner = buildCommon.wrapFragment(buildGroup$1(group.body, options), options);\n var label = group.label.slice(1);\n var scale = options.sizeMultiplier;\n var img;\n var imgShift = 0; // In the LaTeX cancel package, line geometry is slightly different\n // depending on whether the subject is wider than it is tall, or vice versa.\n // We don't know the width of a group, so as a proxy, we test if\n // the subject is a single character. This captures most of the\n // subjects that should get the \"tall\" treatment.\n\n var isSingleChar = utils.isCharacterBox(group.body);\n\n if (label === \"sout\") {\n img = buildCommon.makeSpan([\"stretchy\", \"sout\"]);\n img.height = options.fontMetrics().defaultRuleThickness / scale;\n imgShift = -0.5 * options.fontMetrics().xHeight;\n } else if (label === \"phase\") {\n // Set a couple of dimensions from the steinmetz package.\n var lineWeight = calculateSize({\n number: 0.6,\n unit: \"pt\"\n }, options);\n var clearance = calculateSize({\n number: 0.35,\n unit: \"ex\"\n }, options); // Prevent size changes like \\Huge from affecting line thickness\n\n var newOptions = options.havingBaseSizing();\n scale = scale / newOptions.sizeMultiplier;\n var angleHeight = inner.height + inner.depth + lineWeight + clearance; // Reserve a left pad for the angle.\n\n inner.style.paddingLeft = makeEm(angleHeight / 2 + lineWeight); // Create an SVG\n\n var viewBoxHeight = Math.floor(1000 * angleHeight * scale);\n var path = phasePath(viewBoxHeight);\n var svgNode = new SvgNode([new PathNode(\"phase\", path)], {\n \"width\": \"400em\",\n \"height\": makeEm(viewBoxHeight / 1000),\n \"viewBox\": \"0 0 400000 \" + viewBoxHeight,\n \"preserveAspectRatio\": \"xMinYMin slice\"\n }); // Wrap it in a span with overflow: hidden.\n\n img = buildCommon.makeSvgSpan([\"hide-tail\"], [svgNode], options);\n img.style.height = makeEm(angleHeight);\n imgShift = inner.depth + lineWeight + clearance;\n } else {\n // Add horizontal padding\n if (/cancel/.test(label)) {\n if (!isSingleChar) {\n inner.classes.push(\"cancel-pad\");\n }\n } else if (label === \"angl\") {\n inner.classes.push(\"anglpad\");\n } else {\n inner.classes.push(\"boxpad\");\n } // Add vertical padding\n\n\n var topPad = 0;\n var bottomPad = 0;\n var ruleThickness = 0; // ref: cancel package: \\advance\\totalheight2\\p@ % \"+2\"\n\n if (/box/.test(label)) {\n ruleThickness = Math.max(options.fontMetrics().fboxrule, // default\n options.minRuleThickness // User override.\n );\n topPad = options.fontMetrics().fboxsep + (label === \"colorbox\" ? 0 : ruleThickness);\n bottomPad = topPad;\n } else if (label === \"angl\") {\n ruleThickness = Math.max(options.fontMetrics().defaultRuleThickness, options.minRuleThickness);\n topPad = 4 * ruleThickness; // gap = 3 × line, plus the line itself.\n\n bottomPad = Math.max(0, 0.25 - inner.depth);\n } else {\n topPad = isSingleChar ? 0.2 : 0;\n bottomPad = topPad;\n }\n\n img = stretchy.encloseSpan(inner, label, topPad, bottomPad, options);\n\n if (/fbox|boxed|fcolorbox/.test(label)) {\n img.style.borderStyle = \"solid\";\n img.style.borderWidth = makeEm(ruleThickness);\n } else if (label === \"angl\" && ruleThickness !== 0.049) {\n img.style.borderTopWidth = makeEm(ruleThickness);\n img.style.borderRightWidth = makeEm(ruleThickness);\n }\n\n imgShift = inner.depth + bottomPad;\n\n if (group.backgroundColor) {\n img.style.backgroundColor = group.backgroundColor;\n\n if (group.borderColor) {\n img.style.borderColor = group.borderColor;\n }\n }\n }\n\n var vlist;\n\n if (group.backgroundColor) {\n vlist = buildCommon.makeVList({\n positionType: \"individualShift\",\n children: [// Put the color background behind inner;\n {\n type: \"elem\",\n elem: img,\n shift: imgShift\n }, {\n type: \"elem\",\n elem: inner,\n shift: 0\n }]\n }, options);\n } else {\n var classes = /cancel|phase/.test(label) ? [\"svg-align\"] : [];\n vlist = buildCommon.makeVList({\n positionType: \"individualShift\",\n children: [// Write the \\cancel stroke on top of inner.\n {\n type: \"elem\",\n elem: inner,\n shift: 0\n }, {\n type: \"elem\",\n elem: img,\n shift: imgShift,\n wrapperClasses: classes\n }]\n }, options);\n }\n\n if (/cancel/.test(label)) {\n // The cancel package documentation says that cancel lines add their height\n // to the expression, but tests show that isn't how it actually works.\n vlist.height = inner.height;\n vlist.depth = inner.depth;\n }\n\n if (/cancel/.test(label) && !isSingleChar) {\n // cancel does not create horiz space for its line extension.\n return buildCommon.makeSpan([\"mord\", \"cancel-lap\"], [vlist], options);\n } else {\n return buildCommon.makeSpan([\"mord\"], [vlist], options);\n }\n};\n\nvar mathmlBuilder$6 = (group, options) => {\n var fboxsep = 0;\n var node = new mathMLTree.MathNode(group.label.indexOf(\"colorbox\") > -1 ? \"mpadded\" : \"menclose\", [buildGroup(group.body, options)]);\n\n switch (group.label) {\n case \"\\\\cancel\":\n node.setAttribute(\"notation\", \"updiagonalstrike\");\n break;\n\n case \"\\\\bcancel\":\n node.setAttribute(\"notation\", \"downdiagonalstrike\");\n break;\n\n case \"\\\\phase\":\n node.setAttribute(\"notation\", \"phasorangle\");\n break;\n\n case \"\\\\sout\":\n node.setAttribute(\"notation\", \"horizontalstrike\");\n break;\n\n case \"\\\\fbox\":\n node.setAttribute(\"notation\", \"box\");\n break;\n\n case \"\\\\angl\":\n node.setAttribute(\"notation\", \"actuarial\");\n break;\n\n case \"\\\\fcolorbox\":\n case \"\\\\colorbox\":\n // doesn't have a good notation option. So use \n // instead. Set some attributes that come included with .\n fboxsep = options.fontMetrics().fboxsep * options.fontMetrics().ptPerEm;\n node.setAttribute(\"width\", \"+\" + 2 * fboxsep + \"pt\");\n node.setAttribute(\"height\", \"+\" + 2 * fboxsep + \"pt\");\n node.setAttribute(\"lspace\", fboxsep + \"pt\"); //\n\n node.setAttribute(\"voffset\", fboxsep + \"pt\");\n\n if (group.label === \"\\\\fcolorbox\") {\n var thk = Math.max(options.fontMetrics().fboxrule, // default\n options.minRuleThickness // user override\n );\n node.setAttribute(\"style\", \"border: \" + thk + \"em solid \" + String(group.borderColor));\n }\n\n break;\n\n case \"\\\\xcancel\":\n node.setAttribute(\"notation\", \"updiagonalstrike downdiagonalstrike\");\n break;\n }\n\n if (group.backgroundColor) {\n node.setAttribute(\"mathbackground\", group.backgroundColor);\n }\n\n return node;\n};\n\ndefineFunction({\n type: \"enclose\",\n names: [\"\\\\colorbox\"],\n props: {\n numArgs: 2,\n allowedInText: true,\n argTypes: [\"color\", \"text\"]\n },\n\n handler(_ref, args, optArgs) {\n var {\n parser,\n funcName\n } = _ref;\n var color = assertNodeType(args[0], \"color-token\").color;\n var body = args[1];\n return {\n type: \"enclose\",\n mode: parser.mode,\n label: funcName,\n backgroundColor: color,\n body\n };\n },\n\n htmlBuilder: htmlBuilder$7,\n mathmlBuilder: mathmlBuilder$6\n});\ndefineFunction({\n type: \"enclose\",\n names: [\"\\\\fcolorbox\"],\n props: {\n numArgs: 3,\n allowedInText: true,\n argTypes: [\"color\", \"color\", \"text\"]\n },\n\n handler(_ref2, args, optArgs) {\n var {\n parser,\n funcName\n } = _ref2;\n var borderColor = assertNodeType(args[0], \"color-token\").color;\n var backgroundColor = assertNodeType(args[1], \"color-token\").color;\n var body = args[2];\n return {\n type: \"enclose\",\n mode: parser.mode,\n label: funcName,\n backgroundColor,\n borderColor,\n body\n };\n },\n\n htmlBuilder: htmlBuilder$7,\n mathmlBuilder: mathmlBuilder$6\n});\ndefineFunction({\n type: \"enclose\",\n names: [\"\\\\fbox\"],\n props: {\n numArgs: 1,\n argTypes: [\"hbox\"],\n allowedInText: true\n },\n\n handler(_ref3, args) {\n var {\n parser\n } = _ref3;\n return {\n type: \"enclose\",\n mode: parser.mode,\n label: \"\\\\fbox\",\n body: args[0]\n };\n }\n\n});\ndefineFunction({\n type: \"enclose\",\n names: [\"\\\\cancel\", \"\\\\bcancel\", \"\\\\xcancel\", \"\\\\sout\", \"\\\\phase\"],\n props: {\n numArgs: 1\n },\n\n handler(_ref4, args) {\n var {\n parser,\n funcName\n } = _ref4;\n var body = args[0];\n return {\n type: \"enclose\",\n mode: parser.mode,\n label: funcName,\n body\n };\n },\n\n htmlBuilder: htmlBuilder$7,\n mathmlBuilder: mathmlBuilder$6\n});\ndefineFunction({\n type: \"enclose\",\n names: [\"\\\\angl\"],\n props: {\n numArgs: 1,\n argTypes: [\"hbox\"],\n allowedInText: false\n },\n\n handler(_ref5, args) {\n var {\n parser\n } = _ref5;\n return {\n type: \"enclose\",\n mode: parser.mode,\n label: \"\\\\angl\",\n body: args[0]\n };\n }\n\n});\n\n/**\n * All registered environments.\n * `environments.js` exports this same dictionary again and makes it public.\n * `Parser.js` requires this dictionary via `environments.js`.\n */\nvar _environments = {};\nfunction defineEnvironment(_ref) {\n var {\n type,\n names,\n props,\n handler,\n htmlBuilder,\n mathmlBuilder\n } = _ref;\n // Set default values of environments.\n var data = {\n type,\n numArgs: props.numArgs || 0,\n allowedInText: false,\n numOptionalArgs: 0,\n handler\n };\n\n for (var i = 0; i < names.length; ++i) {\n // TODO: The value type of _environments should be a type union of all\n // possible `EnvSpec<>` possibilities instead of `EnvSpec<*>`, which is\n // an existential type.\n _environments[names[i]] = data;\n }\n\n if (htmlBuilder) {\n _htmlGroupBuilders[type] = htmlBuilder;\n }\n\n if (mathmlBuilder) {\n _mathmlGroupBuilders[type] = mathmlBuilder;\n }\n}\n\n/**\n * All registered global/built-in macros.\n * `macros.js` exports this same dictionary again and makes it public.\n * `Parser.js` requires this dictionary via `macros.js`.\n */\nvar _macros = {}; // This function might one day accept an additional argument and do more things.\n\nfunction defineMacro(name, body) {\n _macros[name] = body;\n}\n\n// Helper functions\nfunction getHLines(parser) {\n // Return an array. The array length = number of hlines.\n // Each element in the array tells if the line is dashed.\n var hlineInfo = [];\n parser.consumeSpaces();\n var nxt = parser.fetch().text;\n\n if (nxt === \"\\\\relax\") {\n // \\relax is an artifact of the \\cr macro below\n parser.consume();\n parser.consumeSpaces();\n nxt = parser.fetch().text;\n }\n\n while (nxt === \"\\\\hline\" || nxt === \"\\\\hdashline\") {\n parser.consume();\n hlineInfo.push(nxt === \"\\\\hdashline\");\n parser.consumeSpaces();\n nxt = parser.fetch().text;\n }\n\n return hlineInfo;\n}\n\nvar validateAmsEnvironmentContext = context => {\n var settings = context.parser.settings;\n\n if (!settings.displayMode) {\n throw new ParseError(\"{\" + context.envName + \"} can be used only in\" + \" display mode.\");\n }\n}; // autoTag (an argument to parseArray) can be one of three values:\n// * undefined: Regular (not-top-level) array; no tags on each row\n// * true: Automatic equation numbering, overridable by \\tag\n// * false: Tags allowed on each row, but no automatic numbering\n// This function *doesn't* work with the \"split\" environment name.\n\n\nfunction getAutoTag(name) {\n if (name.indexOf(\"ed\") === -1) {\n return name.indexOf(\"*\") === -1;\n } // return undefined;\n\n}\n/**\n * Parse the body of the environment, with rows delimited by \\\\ and\n * columns delimited by &, and create a nested list in row-major order\n * with one group per cell. If given an optional argument style\n * (\"text\", \"display\", etc.), then each cell is cast into that style.\n */\n\n\nfunction parseArray(parser, _ref, style) {\n var {\n hskipBeforeAndAfter,\n addJot,\n cols,\n arraystretch,\n colSeparationType,\n autoTag,\n singleRow,\n emptySingleRow,\n maxNumCols,\n leqno\n } = _ref;\n parser.gullet.beginGroup();\n\n if (!singleRow) {\n // \\cr is equivalent to \\\\ without the optional size argument (see below)\n // TODO: provide helpful error when \\cr is used outside array environment\n parser.gullet.macros.set(\"\\\\cr\", \"\\\\\\\\\\\\relax\");\n } // Get current arraystretch if it's not set by the environment\n\n\n if (!arraystretch) {\n var stretch = parser.gullet.expandMacroAsText(\"\\\\arraystretch\");\n\n if (stretch == null) {\n // Default \\arraystretch from lttab.dtx\n arraystretch = 1;\n } else {\n arraystretch = parseFloat(stretch);\n\n if (!arraystretch || arraystretch < 0) {\n throw new ParseError(\"Invalid \\\\arraystretch: \" + stretch);\n }\n }\n } // Start group for first cell\n\n\n parser.gullet.beginGroup();\n var row = [];\n var body = [row];\n var rowGaps = [];\n var hLinesBeforeRow = [];\n var tags = autoTag != null ? [] : undefined; // amsmath uses \\global\\@eqnswtrue and \\global\\@eqnswfalse to represent\n // whether this row should have an equation number. Simulate this with\n // a \\@eqnsw macro set to 1 or 0.\n\n function beginRow() {\n if (autoTag) {\n parser.gullet.macros.set(\"\\\\@eqnsw\", \"1\", true);\n }\n }\n\n function endRow() {\n if (tags) {\n if (parser.gullet.macros.get(\"\\\\df@tag\")) {\n tags.push(parser.subparse([new Token(\"\\\\df@tag\")]));\n parser.gullet.macros.set(\"\\\\df@tag\", undefined, true);\n } else {\n tags.push(Boolean(autoTag) && parser.gullet.macros.get(\"\\\\@eqnsw\") === \"1\");\n }\n }\n }\n\n beginRow(); // Test for \\hline at the top of the array.\n\n hLinesBeforeRow.push(getHLines(parser));\n\n while (true) {\n // eslint-disable-line no-constant-condition\n // Parse each cell in its own group (namespace)\n var cell = parser.parseExpression(false, singleRow ? \"\\\\end\" : \"\\\\\\\\\");\n parser.gullet.endGroup();\n parser.gullet.beginGroup();\n cell = {\n type: \"ordgroup\",\n mode: parser.mode,\n body: cell\n };\n\n if (style) {\n cell = {\n type: \"styling\",\n mode: parser.mode,\n style,\n body: [cell]\n };\n }\n\n row.push(cell);\n var next = parser.fetch().text;\n\n if (next === \"&\") {\n if (maxNumCols && row.length === maxNumCols) {\n if (singleRow || colSeparationType) {\n // {equation} or {split}\n throw new ParseError(\"Too many tab characters: &\", parser.nextToken);\n } else {\n // {array} environment\n parser.settings.reportNonstrict(\"textEnv\", \"Too few columns \" + \"specified in the {array} column argument.\");\n }\n }\n\n parser.consume();\n } else if (next === \"\\\\end\") {\n endRow(); // Arrays terminate newlines with `\\crcr` which consumes a `\\cr` if\n // the last line is empty. However, AMS environments keep the\n // empty row if it's the only one.\n // NOTE: Currently, `cell` is the last item added into `row`.\n\n if (row.length === 1 && cell.type === \"styling\" && cell.body[0].body.length === 0 && (body.length > 1 || !emptySingleRow)) {\n body.pop();\n }\n\n if (hLinesBeforeRow.length < body.length + 1) {\n hLinesBeforeRow.push([]);\n }\n\n break;\n } else if (next === \"\\\\\\\\\") {\n parser.consume();\n var size = void 0; // \\def\\Let@{\\let\\\\\\math@cr}\n // \\def\\math@cr{...\\math@cr@}\n // \\def\\math@cr@{\\new@ifnextchar[\\math@cr@@{\\math@cr@@[\\z@]}}\n // \\def\\math@cr@@[#1]{...\\math@cr@@@...}\n // \\def\\math@cr@@@{\\cr}\n\n if (parser.gullet.future().text !== \" \") {\n size = parser.parseSizeGroup(true);\n }\n\n rowGaps.push(size ? size.value : null);\n endRow(); // check for \\hline(s) following the row separator\n\n hLinesBeforeRow.push(getHLines(parser));\n row = [];\n body.push(row);\n beginRow();\n } else {\n throw new ParseError(\"Expected & or \\\\\\\\ or \\\\cr or \\\\end\", parser.nextToken);\n }\n } // End cell group\n\n\n parser.gullet.endGroup(); // End array group defining \\cr\n\n parser.gullet.endGroup();\n return {\n type: \"array\",\n mode: parser.mode,\n addJot,\n arraystretch,\n body,\n cols,\n rowGaps,\n hskipBeforeAndAfter,\n hLinesBeforeRow,\n colSeparationType,\n tags,\n leqno\n };\n} // Decides on a style for cells in an array according to whether the given\n// environment name starts with the letter 'd'.\n\n\nfunction dCellStyle(envName) {\n if (envName.slice(0, 1) === \"d\") {\n return \"display\";\n } else {\n return \"text\";\n }\n}\n\nvar htmlBuilder$6 = function htmlBuilder(group, options) {\n var r;\n var c;\n var nr = group.body.length;\n var hLinesBeforeRow = group.hLinesBeforeRow;\n var nc = 0;\n var body = new Array(nr);\n var hlines = [];\n var ruleThickness = Math.max( // From LaTeX \\showthe\\arrayrulewidth. Equals 0.04 em.\n options.fontMetrics().arrayRuleWidth, options.minRuleThickness // User override.\n ); // Horizontal spacing\n\n var pt = 1 / options.fontMetrics().ptPerEm;\n var arraycolsep = 5 * pt; // default value, i.e. \\arraycolsep in article.cls\n\n if (group.colSeparationType && group.colSeparationType === \"small\") {\n // We're in a {smallmatrix}. Default column space is \\thickspace,\n // i.e. 5/18em = 0.2778em, per amsmath.dtx for {smallmatrix}.\n // But that needs adjustment because LaTeX applies \\scriptstyle to the\n // entire array, including the colspace, but this function applies\n // \\scriptstyle only inside each element.\n var localMultiplier = options.havingStyle(Style$1.SCRIPT).sizeMultiplier;\n arraycolsep = 0.2778 * (localMultiplier / options.sizeMultiplier);\n } // Vertical spacing\n\n\n var baselineskip = group.colSeparationType === \"CD\" ? calculateSize({\n number: 3,\n unit: \"ex\"\n }, options) : 12 * pt; // see size10.clo\n // Default \\jot from ltmath.dtx\n // TODO(edemaine): allow overriding \\jot via \\setlength (#687)\n\n var jot = 3 * pt;\n var arrayskip = group.arraystretch * baselineskip;\n var arstrutHeight = 0.7 * arrayskip; // \\strutbox in ltfsstrc.dtx and\n\n var arstrutDepth = 0.3 * arrayskip; // \\@arstrutbox in lttab.dtx\n\n var totalHeight = 0; // Set a position for \\hline(s) at the top of the array, if any.\n\n function setHLinePos(hlinesInGap) {\n for (var i = 0; i < hlinesInGap.length; ++i) {\n if (i > 0) {\n totalHeight += 0.25;\n }\n\n hlines.push({\n pos: totalHeight,\n isDashed: hlinesInGap[i]\n });\n }\n }\n\n setHLinePos(hLinesBeforeRow[0]);\n\n for (r = 0; r < group.body.length; ++r) {\n var inrow = group.body[r];\n var height = arstrutHeight; // \\@array adds an \\@arstrut\n\n var depth = arstrutDepth; // to each tow (via the template)\n\n if (nc < inrow.length) {\n nc = inrow.length;\n }\n\n var outrow = new Array(inrow.length);\n\n for (c = 0; c < inrow.length; ++c) {\n var elt = buildGroup$1(inrow[c], options);\n\n if (depth < elt.depth) {\n depth = elt.depth;\n }\n\n if (height < elt.height) {\n height = elt.height;\n }\n\n outrow[c] = elt;\n }\n\n var rowGap = group.rowGaps[r];\n var gap = 0;\n\n if (rowGap) {\n gap = calculateSize(rowGap, options);\n\n if (gap > 0) {\n // \\@argarraycr\n gap += arstrutDepth;\n\n if (depth < gap) {\n depth = gap; // \\@xargarraycr\n }\n\n gap = 0;\n }\n } // In AMS multiline environments such as aligned and gathered, rows\n // correspond to lines that have additional \\jot added to the\n // \\baselineskip via \\openup.\n\n\n if (group.addJot) {\n depth += jot;\n }\n\n outrow.height = height;\n outrow.depth = depth;\n totalHeight += height;\n outrow.pos = totalHeight;\n totalHeight += depth + gap; // \\@yargarraycr\n\n body[r] = outrow; // Set a position for \\hline(s), if any.\n\n setHLinePos(hLinesBeforeRow[r + 1]);\n }\n\n var offset = totalHeight / 2 + options.fontMetrics().axisHeight;\n var colDescriptions = group.cols || [];\n var cols = [];\n var colSep;\n var colDescrNum;\n var tagSpans = [];\n\n if (group.tags && group.tags.some(tag => tag)) {\n // An environment with manual tags and/or automatic equation numbers.\n // Create node(s), the latter of which trigger CSS counter increment.\n for (r = 0; r < nr; ++r) {\n var rw = body[r];\n var shift = rw.pos - offset;\n var tag = group.tags[r];\n var tagSpan = void 0;\n\n if (tag === true) {\n // automatic numbering\n tagSpan = buildCommon.makeSpan([\"eqn-num\"], [], options);\n } else if (tag === false) {\n // \\nonumber/\\notag or starred environment\n tagSpan = buildCommon.makeSpan([], [], options);\n } else {\n // manual \\tag\n tagSpan = buildCommon.makeSpan([], buildExpression$1(tag, options, true), options);\n }\n\n tagSpan.depth = rw.depth;\n tagSpan.height = rw.height;\n tagSpans.push({\n type: \"elem\",\n elem: tagSpan,\n shift\n });\n }\n }\n\n for (c = 0, colDescrNum = 0; // Continue while either there are more columns or more column\n // descriptions, so trailing separators don't get lost.\n c < nc || colDescrNum < colDescriptions.length; ++c, ++colDescrNum) {\n var colDescr = colDescriptions[colDescrNum] || {};\n var firstSeparator = true;\n\n while (colDescr.type === \"separator\") {\n // If there is more than one separator in a row, add a space\n // between them.\n if (!firstSeparator) {\n colSep = buildCommon.makeSpan([\"arraycolsep\"], []);\n colSep.style.width = makeEm(options.fontMetrics().doubleRuleSep);\n cols.push(colSep);\n }\n\n if (colDescr.separator === \"|\" || colDescr.separator === \":\") {\n var lineType = colDescr.separator === \"|\" ? \"solid\" : \"dashed\";\n var separator = buildCommon.makeSpan([\"vertical-separator\"], [], options);\n separator.style.height = makeEm(totalHeight);\n separator.style.borderRightWidth = makeEm(ruleThickness);\n separator.style.borderRightStyle = lineType;\n separator.style.margin = \"0 \" + makeEm(-ruleThickness / 2);\n\n var _shift = totalHeight - offset;\n\n if (_shift) {\n separator.style.verticalAlign = makeEm(-_shift);\n }\n\n cols.push(separator);\n } else {\n throw new ParseError(\"Invalid separator type: \" + colDescr.separator);\n }\n\n colDescrNum++;\n colDescr = colDescriptions[colDescrNum] || {};\n firstSeparator = false;\n }\n\n if (c >= nc) {\n continue;\n }\n\n var sepwidth = void 0;\n\n if (c > 0 || group.hskipBeforeAndAfter) {\n sepwidth = utils.deflt(colDescr.pregap, arraycolsep);\n\n if (sepwidth !== 0) {\n colSep = buildCommon.makeSpan([\"arraycolsep\"], []);\n colSep.style.width = makeEm(sepwidth);\n cols.push(colSep);\n }\n }\n\n var col = [];\n\n for (r = 0; r < nr; ++r) {\n var row = body[r];\n var elem = row[c];\n\n if (!elem) {\n continue;\n }\n\n var _shift2 = row.pos - offset;\n\n elem.depth = row.depth;\n elem.height = row.height;\n col.push({\n type: \"elem\",\n elem: elem,\n shift: _shift2\n });\n }\n\n col = buildCommon.makeVList({\n positionType: \"individualShift\",\n children: col\n }, options);\n col = buildCommon.makeSpan([\"col-align-\" + (colDescr.align || \"c\")], [col]);\n cols.push(col);\n\n if (c < nc - 1 || group.hskipBeforeAndAfter) {\n sepwidth = utils.deflt(colDescr.postgap, arraycolsep);\n\n if (sepwidth !== 0) {\n colSep = buildCommon.makeSpan([\"arraycolsep\"], []);\n colSep.style.width = makeEm(sepwidth);\n cols.push(colSep);\n }\n }\n }\n\n body = buildCommon.makeSpan([\"mtable\"], cols); // Add \\hline(s), if any.\n\n if (hlines.length > 0) {\n var line = buildCommon.makeLineSpan(\"hline\", options, ruleThickness);\n var dashes = buildCommon.makeLineSpan(\"hdashline\", options, ruleThickness);\n var vListElems = [{\n type: \"elem\",\n elem: body,\n shift: 0\n }];\n\n while (hlines.length > 0) {\n var hline = hlines.pop();\n var lineShift = hline.pos - offset;\n\n if (hline.isDashed) {\n vListElems.push({\n type: \"elem\",\n elem: dashes,\n shift: lineShift\n });\n } else {\n vListElems.push({\n type: \"elem\",\n elem: line,\n shift: lineShift\n });\n }\n }\n\n body = buildCommon.makeVList({\n positionType: \"individualShift\",\n children: vListElems\n }, options);\n }\n\n if (tagSpans.length === 0) {\n return buildCommon.makeSpan([\"mord\"], [body], options);\n } else {\n var eqnNumCol = buildCommon.makeVList({\n positionType: \"individualShift\",\n children: tagSpans\n }, options);\n eqnNumCol = buildCommon.makeSpan([\"tag\"], [eqnNumCol], options);\n return buildCommon.makeFragment([body, eqnNumCol]);\n }\n};\n\nvar alignMap = {\n c: \"center \",\n l: \"left \",\n r: \"right \"\n};\n\nvar mathmlBuilder$5 = function mathmlBuilder(group, options) {\n var tbl = [];\n var glue = new mathMLTree.MathNode(\"mtd\", [], [\"mtr-glue\"]);\n var tag = new mathMLTree.MathNode(\"mtd\", [], [\"mml-eqn-num\"]);\n\n for (var i = 0; i < group.body.length; i++) {\n var rw = group.body[i];\n var row = [];\n\n for (var j = 0; j < rw.length; j++) {\n row.push(new mathMLTree.MathNode(\"mtd\", [buildGroup(rw[j], options)]));\n }\n\n if (group.tags && group.tags[i]) {\n row.unshift(glue);\n row.push(glue);\n\n if (group.leqno) {\n row.unshift(tag);\n } else {\n row.push(tag);\n }\n }\n\n tbl.push(new mathMLTree.MathNode(\"mtr\", row));\n }\n\n var table = new mathMLTree.MathNode(\"mtable\", tbl); // Set column alignment, row spacing, column spacing, and\n // array lines by setting attributes on the table element.\n // Set the row spacing. In MathML, we specify a gap distance.\n // We do not use rowGap[] because MathML automatically increases\n // cell height with the height/depth of the element content.\n // LaTeX \\arraystretch multiplies the row baseline-to-baseline distance.\n // We simulate this by adding (arraystretch - 1)em to the gap. This\n // does a reasonable job of adjusting arrays containing 1 em tall content.\n // The 0.16 and 0.09 values are found empirically. They produce an array\n // similar to LaTeX and in which content does not interfere with \\hlines.\n\n var gap = group.arraystretch === 0.5 ? 0.1 // {smallmatrix}, {subarray}\n : 0.16 + group.arraystretch - 1 + (group.addJot ? 0.09 : 0);\n table.setAttribute(\"rowspacing\", makeEm(gap)); // MathML table lines go only between cells.\n // To place a line on an edge we'll use , if necessary.\n\n var menclose = \"\";\n var align = \"\";\n\n if (group.cols && group.cols.length > 0) {\n // Find column alignment, column spacing, and vertical lines.\n var cols = group.cols;\n var columnLines = \"\";\n var prevTypeWasAlign = false;\n var iStart = 0;\n var iEnd = cols.length;\n\n if (cols[0].type === \"separator\") {\n menclose += \"top \";\n iStart = 1;\n }\n\n if (cols[cols.length - 1].type === \"separator\") {\n menclose += \"bottom \";\n iEnd -= 1;\n }\n\n for (var _i = iStart; _i < iEnd; _i++) {\n if (cols[_i].type === \"align\") {\n align += alignMap[cols[_i].align];\n\n if (prevTypeWasAlign) {\n columnLines += \"none \";\n }\n\n prevTypeWasAlign = true;\n } else if (cols[_i].type === \"separator\") {\n // MathML accepts only single lines between cells.\n // So we read only the first of consecutive separators.\n if (prevTypeWasAlign) {\n columnLines += cols[_i].separator === \"|\" ? \"solid \" : \"dashed \";\n prevTypeWasAlign = false;\n }\n }\n }\n\n table.setAttribute(\"columnalign\", align.trim());\n\n if (/[sd]/.test(columnLines)) {\n table.setAttribute(\"columnlines\", columnLines.trim());\n }\n } // Set column spacing.\n\n\n if (group.colSeparationType === \"align\") {\n var _cols = group.cols || [];\n\n var spacing = \"\";\n\n for (var _i2 = 1; _i2 < _cols.length; _i2++) {\n spacing += _i2 % 2 ? \"0em \" : \"1em \";\n }\n\n table.setAttribute(\"columnspacing\", spacing.trim());\n } else if (group.colSeparationType === \"alignat\" || group.colSeparationType === \"gather\") {\n table.setAttribute(\"columnspacing\", \"0em\");\n } else if (group.colSeparationType === \"small\") {\n table.setAttribute(\"columnspacing\", \"0.2778em\");\n } else if (group.colSeparationType === \"CD\") {\n table.setAttribute(\"columnspacing\", \"0.5em\");\n } else {\n table.setAttribute(\"columnspacing\", \"1em\");\n } // Address \\hline and \\hdashline\n\n\n var rowLines = \"\";\n var hlines = group.hLinesBeforeRow;\n menclose += hlines[0].length > 0 ? \"left \" : \"\";\n menclose += hlines[hlines.length - 1].length > 0 ? \"right \" : \"\";\n\n for (var _i3 = 1; _i3 < hlines.length - 1; _i3++) {\n rowLines += hlines[_i3].length === 0 ? \"none \" // MathML accepts only a single line between rows. Read one element.\n : hlines[_i3][0] ? \"dashed \" : \"solid \";\n }\n\n if (/[sd]/.test(rowLines)) {\n table.setAttribute(\"rowlines\", rowLines.trim());\n }\n\n if (menclose !== \"\") {\n table = new mathMLTree.MathNode(\"menclose\", [table]);\n table.setAttribute(\"notation\", menclose.trim());\n }\n\n if (group.arraystretch && group.arraystretch < 1) {\n // A small array. Wrap in scriptstyle so row gap is not too large.\n table = new mathMLTree.MathNode(\"mstyle\", [table]);\n table.setAttribute(\"scriptlevel\", \"1\");\n }\n\n return table;\n}; // Convenience function for align, align*, aligned, alignat, alignat*, alignedat.\n\n\nvar alignedHandler = function alignedHandler(context, args) {\n if (context.envName.indexOf(\"ed\") === -1) {\n validateAmsEnvironmentContext(context);\n }\n\n var cols = [];\n var separationType = context.envName.indexOf(\"at\") > -1 ? \"alignat\" : \"align\";\n var isSplit = context.envName === \"split\";\n var res = parseArray(context.parser, {\n cols,\n addJot: true,\n autoTag: isSplit ? undefined : getAutoTag(context.envName),\n emptySingleRow: true,\n colSeparationType: separationType,\n maxNumCols: isSplit ? 2 : undefined,\n leqno: context.parser.settings.leqno\n }, \"display\"); // Determining number of columns.\n // 1. If the first argument is given, we use it as a number of columns,\n // and makes sure that each row doesn't exceed that number.\n // 2. Otherwise, just count number of columns = maximum number\n // of cells in each row (\"aligned\" mode -- isAligned will be true).\n //\n // At the same time, prepend empty group {} at beginning of every second\n // cell in each row (starting with second cell) so that operators become\n // binary. This behavior is implemented in amsmath's \\start@aligned.\n\n var numMaths;\n var numCols = 0;\n var emptyGroup = {\n type: \"ordgroup\",\n mode: context.mode,\n body: []\n };\n\n if (args[0] && args[0].type === \"ordgroup\") {\n var arg0 = \"\";\n\n for (var i = 0; i < args[0].body.length; i++) {\n var textord = assertNodeType(args[0].body[i], \"textord\");\n arg0 += textord.text;\n }\n\n numMaths = Number(arg0);\n numCols = numMaths * 2;\n }\n\n var isAligned = !numCols;\n res.body.forEach(function (row) {\n for (var _i4 = 1; _i4 < row.length; _i4 += 2) {\n // Modify ordgroup node within styling node\n var styling = assertNodeType(row[_i4], \"styling\");\n var ordgroup = assertNodeType(styling.body[0], \"ordgroup\");\n ordgroup.body.unshift(emptyGroup);\n }\n\n if (!isAligned) {\n // Case 1\n var curMaths = row.length / 2;\n\n if (numMaths < curMaths) {\n throw new ParseError(\"Too many math in a row: \" + (\"expected \" + numMaths + \", but got \" + curMaths), row[0]);\n }\n } else if (numCols < row.length) {\n // Case 2\n numCols = row.length;\n }\n }); // Adjusting alignment.\n // In aligned mode, we add one \\qquad between columns;\n // otherwise we add nothing.\n\n for (var _i5 = 0; _i5 < numCols; ++_i5) {\n var align = \"r\";\n var pregap = 0;\n\n if (_i5 % 2 === 1) {\n align = \"l\";\n } else if (_i5 > 0 && isAligned) {\n // \"aligned\" mode.\n pregap = 1; // add one \\quad\n }\n\n cols[_i5] = {\n type: \"align\",\n align: align,\n pregap: pregap,\n postgap: 0\n };\n }\n\n res.colSeparationType = isAligned ? \"align\" : \"alignat\";\n return res;\n}; // Arrays are part of LaTeX, defined in lttab.dtx so its documentation\n// is part of the source2e.pdf file of LaTeX2e source documentation.\n// {darray} is an {array} environment where cells are set in \\displaystyle,\n// as defined in nccmath.sty.\n\n\ndefineEnvironment({\n type: \"array\",\n names: [\"array\", \"darray\"],\n props: {\n numArgs: 1\n },\n\n handler(context, args) {\n // Since no types are specified above, the two possibilities are\n // - The argument is wrapped in {} or [], in which case Parser's\n // parseGroup() returns an \"ordgroup\" wrapping some symbol node.\n // - The argument is a bare symbol node.\n var symNode = checkSymbolNodeType(args[0]);\n var colalign = symNode ? [args[0]] : assertNodeType(args[0], \"ordgroup\").body;\n var cols = colalign.map(function (nde) {\n var node = assertSymbolNodeType(nde);\n var ca = node.text;\n\n if (\"lcr\".indexOf(ca) !== -1) {\n return {\n type: \"align\",\n align: ca\n };\n } else if (ca === \"|\") {\n return {\n type: \"separator\",\n separator: \"|\"\n };\n } else if (ca === \":\") {\n return {\n type: \"separator\",\n separator: \":\"\n };\n }\n\n throw new ParseError(\"Unknown column alignment: \" + ca, nde);\n });\n var res = {\n cols,\n hskipBeforeAndAfter: true,\n // \\@preamble in lttab.dtx\n maxNumCols: cols.length\n };\n return parseArray(context.parser, res, dCellStyle(context.envName));\n },\n\n htmlBuilder: htmlBuilder$6,\n mathmlBuilder: mathmlBuilder$5\n}); // The matrix environments of amsmath builds on the array environment\n// of LaTeX, which is discussed above.\n// The mathtools package adds starred versions of the same environments.\n// These have an optional argument to choose left|center|right justification.\n\ndefineEnvironment({\n type: \"array\",\n names: [\"matrix\", \"pmatrix\", \"bmatrix\", \"Bmatrix\", \"vmatrix\", \"Vmatrix\", \"matrix*\", \"pmatrix*\", \"bmatrix*\", \"Bmatrix*\", \"vmatrix*\", \"Vmatrix*\"],\n props: {\n numArgs: 0\n },\n\n handler(context) {\n var delimiters = {\n \"matrix\": null,\n \"pmatrix\": [\"(\", \")\"],\n \"bmatrix\": [\"[\", \"]\"],\n \"Bmatrix\": [\"\\\\{\", \"\\\\}\"],\n \"vmatrix\": [\"|\", \"|\"],\n \"Vmatrix\": [\"\\\\Vert\", \"\\\\Vert\"]\n }[context.envName.replace(\"*\", \"\")]; // \\hskip -\\arraycolsep in amsmath\n\n var colAlign = \"c\";\n var payload = {\n hskipBeforeAndAfter: false,\n cols: [{\n type: \"align\",\n align: colAlign\n }]\n };\n\n if (context.envName.charAt(context.envName.length - 1) === \"*\") {\n // It's one of the mathtools starred functions.\n // Parse the optional alignment argument.\n var parser = context.parser;\n parser.consumeSpaces();\n\n if (parser.fetch().text === \"[\") {\n parser.consume();\n parser.consumeSpaces();\n colAlign = parser.fetch().text;\n\n if (\"lcr\".indexOf(colAlign) === -1) {\n throw new ParseError(\"Expected l or c or r\", parser.nextToken);\n }\n\n parser.consume();\n parser.consumeSpaces();\n parser.expect(\"]\");\n parser.consume();\n payload.cols = [{\n type: \"align\",\n align: colAlign\n }];\n }\n }\n\n var res = parseArray(context.parser, payload, dCellStyle(context.envName)); // Populate cols with the correct number of column alignment specs.\n\n var numCols = Math.max(0, ...res.body.map(row => row.length));\n res.cols = new Array(numCols).fill({\n type: \"align\",\n align: colAlign\n });\n return delimiters ? {\n type: \"leftright\",\n mode: context.mode,\n body: [res],\n left: delimiters[0],\n right: delimiters[1],\n rightColor: undefined // \\right uninfluenced by \\color in array\n\n } : res;\n },\n\n htmlBuilder: htmlBuilder$6,\n mathmlBuilder: mathmlBuilder$5\n});\ndefineEnvironment({\n type: \"array\",\n names: [\"smallmatrix\"],\n props: {\n numArgs: 0\n },\n\n handler(context) {\n var payload = {\n arraystretch: 0.5\n };\n var res = parseArray(context.parser, payload, \"script\");\n res.colSeparationType = \"small\";\n return res;\n },\n\n htmlBuilder: htmlBuilder$6,\n mathmlBuilder: mathmlBuilder$5\n});\ndefineEnvironment({\n type: \"array\",\n names: [\"subarray\"],\n props: {\n numArgs: 1\n },\n\n handler(context, args) {\n // Parsing of {subarray} is similar to {array}\n var symNode = checkSymbolNodeType(args[0]);\n var colalign = symNode ? [args[0]] : assertNodeType(args[0], \"ordgroup\").body;\n var cols = colalign.map(function (nde) {\n var node = assertSymbolNodeType(nde);\n var ca = node.text; // {subarray} only recognizes \"l\" & \"c\"\n\n if (\"lc\".indexOf(ca) !== -1) {\n return {\n type: \"align\",\n align: ca\n };\n }\n\n throw new ParseError(\"Unknown column alignment: \" + ca, nde);\n });\n\n if (cols.length > 1) {\n throw new ParseError(\"{subarray} can contain only one column\");\n }\n\n var res = {\n cols,\n hskipBeforeAndAfter: false,\n arraystretch: 0.5\n };\n res = parseArray(context.parser, res, \"script\");\n\n if (res.body.length > 0 && res.body[0].length > 1) {\n throw new ParseError(\"{subarray} can contain only one column\");\n }\n\n return res;\n },\n\n htmlBuilder: htmlBuilder$6,\n mathmlBuilder: mathmlBuilder$5\n}); // A cases environment (in amsmath.sty) is almost equivalent to\n// \\def\\arraystretch{1.2}%\n// \\left\\{\\begin{array}{@{}l@{\\quad}l@{}} … \\end{array}\\right.\n// {dcases} is a {cases} environment where cells are set in \\displaystyle,\n// as defined in mathtools.sty.\n// {rcases} is another mathtools environment. It's brace is on the right side.\n\ndefineEnvironment({\n type: \"array\",\n names: [\"cases\", \"dcases\", \"rcases\", \"drcases\"],\n props: {\n numArgs: 0\n },\n\n handler(context) {\n var payload = {\n arraystretch: 1.2,\n cols: [{\n type: \"align\",\n align: \"l\",\n pregap: 0,\n // TODO(kevinb) get the current style.\n // For now we use the metrics for TEXT style which is what we were\n // doing before. Before attempting to get the current style we\n // should look at TeX's behavior especially for \\over and matrices.\n postgap: 1.0\n /* 1em quad */\n\n }, {\n type: \"align\",\n align: \"l\",\n pregap: 0,\n postgap: 0\n }]\n };\n var res = parseArray(context.parser, payload, dCellStyle(context.envName));\n return {\n type: \"leftright\",\n mode: context.mode,\n body: [res],\n left: context.envName.indexOf(\"r\") > -1 ? \".\" : \"\\\\{\",\n right: context.envName.indexOf(\"r\") > -1 ? \"\\\\}\" : \".\",\n rightColor: undefined\n };\n },\n\n htmlBuilder: htmlBuilder$6,\n mathmlBuilder: mathmlBuilder$5\n}); // In the align environment, one uses ampersands, &, to specify number of\n// columns in each row, and to locate spacing between each column.\n// align gets automatic numbering. align* and aligned do not.\n// The alignedat environment can be used in math mode.\n// Note that we assume \\nomallineskiplimit to be zero,\n// so that \\strut@ is the same as \\strut.\n\ndefineEnvironment({\n type: \"array\",\n names: [\"align\", \"align*\", \"aligned\", \"split\"],\n props: {\n numArgs: 0\n },\n handler: alignedHandler,\n htmlBuilder: htmlBuilder$6,\n mathmlBuilder: mathmlBuilder$5\n}); // A gathered environment is like an array environment with one centered\n// column, but where rows are considered lines so get \\jot line spacing\n// and contents are set in \\displaystyle.\n\ndefineEnvironment({\n type: \"array\",\n names: [\"gathered\", \"gather\", \"gather*\"],\n props: {\n numArgs: 0\n },\n\n handler(context) {\n if (utils.contains([\"gather\", \"gather*\"], context.envName)) {\n validateAmsEnvironmentContext(context);\n }\n\n var res = {\n cols: [{\n type: \"align\",\n align: \"c\"\n }],\n addJot: true,\n colSeparationType: \"gather\",\n autoTag: getAutoTag(context.envName),\n emptySingleRow: true,\n leqno: context.parser.settings.leqno\n };\n return parseArray(context.parser, res, \"display\");\n },\n\n htmlBuilder: htmlBuilder$6,\n mathmlBuilder: mathmlBuilder$5\n}); // alignat environment is like an align environment, but one must explicitly\n// specify maximum number of columns in each row, and can adjust spacing between\n// each columns.\n\ndefineEnvironment({\n type: \"array\",\n names: [\"alignat\", \"alignat*\", \"alignedat\"],\n props: {\n numArgs: 1\n },\n handler: alignedHandler,\n htmlBuilder: htmlBuilder$6,\n mathmlBuilder: mathmlBuilder$5\n});\ndefineEnvironment({\n type: \"array\",\n names: [\"equation\", \"equation*\"],\n props: {\n numArgs: 0\n },\n\n handler(context) {\n validateAmsEnvironmentContext(context);\n var res = {\n autoTag: getAutoTag(context.envName),\n emptySingleRow: true,\n singleRow: true,\n maxNumCols: 1,\n leqno: context.parser.settings.leqno\n };\n return parseArray(context.parser, res, \"display\");\n },\n\n htmlBuilder: htmlBuilder$6,\n mathmlBuilder: mathmlBuilder$5\n});\ndefineEnvironment({\n type: \"array\",\n names: [\"CD\"],\n props: {\n numArgs: 0\n },\n\n handler(context) {\n validateAmsEnvironmentContext(context);\n return parseCD(context.parser);\n },\n\n htmlBuilder: htmlBuilder$6,\n mathmlBuilder: mathmlBuilder$5\n});\ndefineMacro(\"\\\\nonumber\", \"\\\\gdef\\\\@eqnsw{0}\");\ndefineMacro(\"\\\\notag\", \"\\\\nonumber\"); // Catch \\hline outside array environment\n\ndefineFunction({\n type: \"text\",\n // Doesn't matter what this is.\n names: [\"\\\\hline\", \"\\\\hdashline\"],\n props: {\n numArgs: 0,\n allowedInText: true,\n allowedInMath: true\n },\n\n handler(context, args) {\n throw new ParseError(context.funcName + \" valid only within array environment\");\n }\n\n});\n\nvar environments = _environments;\n\n// defineEnvironment definitions.\n\ndefineFunction({\n type: \"environment\",\n names: [\"\\\\begin\", \"\\\\end\"],\n props: {\n numArgs: 1,\n argTypes: [\"text\"]\n },\n\n handler(_ref, args) {\n var {\n parser,\n funcName\n } = _ref;\n var nameGroup = args[0];\n\n if (nameGroup.type !== \"ordgroup\") {\n throw new ParseError(\"Invalid environment name\", nameGroup);\n }\n\n var envName = \"\";\n\n for (var i = 0; i < nameGroup.body.length; ++i) {\n envName += assertNodeType(nameGroup.body[i], \"textord\").text;\n }\n\n if (funcName === \"\\\\begin\") {\n // begin...end is similar to left...right\n if (!environments.hasOwnProperty(envName)) {\n throw new ParseError(\"No such environment: \" + envName, nameGroup);\n } // Build the environment object. Arguments and other information will\n // be made available to the begin and end methods using properties.\n\n\n var env = environments[envName];\n var {\n args: _args,\n optArgs\n } = parser.parseArguments(\"\\\\begin{\" + envName + \"}\", env);\n var context = {\n mode: parser.mode,\n envName,\n parser\n };\n var result = env.handler(context, _args, optArgs);\n parser.expect(\"\\\\end\", false);\n var endNameToken = parser.nextToken;\n var end = assertNodeType(parser.parseFunction(), \"environment\");\n\n if (end.name !== envName) {\n throw new ParseError(\"Mismatch: \\\\begin{\" + envName + \"} matched by \\\\end{\" + end.name + \"}\", endNameToken);\n } // $FlowFixMe, \"environment\" handler returns an environment ParseNode\n\n\n return result;\n }\n\n return {\n type: \"environment\",\n mode: parser.mode,\n name: envName,\n nameGroup\n };\n }\n\n});\n\n// TODO(kevinb): implement \\\\sl and \\\\sc\n\nvar htmlBuilder$5 = (group, options) => {\n var font = group.font;\n var newOptions = options.withFont(font);\n return buildGroup$1(group.body, newOptions);\n};\n\nvar mathmlBuilder$4 = (group, options) => {\n var font = group.font;\n var newOptions = options.withFont(font);\n return buildGroup(group.body, newOptions);\n};\n\nvar fontAliases = {\n \"\\\\Bbb\": \"\\\\mathbb\",\n \"\\\\bold\": \"\\\\mathbf\",\n \"\\\\frak\": \"\\\\mathfrak\",\n \"\\\\bm\": \"\\\\boldsymbol\"\n};\ndefineFunction({\n type: \"font\",\n names: [// styles, except \\boldsymbol defined below\n \"\\\\mathrm\", \"\\\\mathit\", \"\\\\mathbf\", \"\\\\mathnormal\", \"\\\\mathsfit\", // families\n \"\\\\mathbb\", \"\\\\mathcal\", \"\\\\mathfrak\", \"\\\\mathscr\", \"\\\\mathsf\", \"\\\\mathtt\", // aliases, except \\bm defined below\n \"\\\\Bbb\", \"\\\\bold\", \"\\\\frak\"],\n props: {\n numArgs: 1,\n allowedInArgument: true\n },\n handler: (_ref, args) => {\n var {\n parser,\n funcName\n } = _ref;\n var body = normalizeArgument(args[0]);\n var func = funcName;\n\n if (func in fontAliases) {\n func = fontAliases[func];\n }\n\n return {\n type: \"font\",\n mode: parser.mode,\n font: func.slice(1),\n body\n };\n },\n htmlBuilder: htmlBuilder$5,\n mathmlBuilder: mathmlBuilder$4\n});\ndefineFunction({\n type: \"mclass\",\n names: [\"\\\\boldsymbol\", \"\\\\bm\"],\n props: {\n numArgs: 1\n },\n handler: (_ref2, args) => {\n var {\n parser\n } = _ref2;\n var body = args[0];\n var isCharacterBox = utils.isCharacterBox(body); // amsbsy.sty's \\boldsymbol uses \\binrel spacing to inherit the\n // argument's bin|rel|ord status\n\n return {\n type: \"mclass\",\n mode: parser.mode,\n mclass: binrelClass(body),\n body: [{\n type: \"font\",\n mode: parser.mode,\n font: \"boldsymbol\",\n body\n }],\n isCharacterBox: isCharacterBox\n };\n }\n}); // Old font changing functions\n\ndefineFunction({\n type: \"font\",\n names: [\"\\\\rm\", \"\\\\sf\", \"\\\\tt\", \"\\\\bf\", \"\\\\it\", \"\\\\cal\"],\n props: {\n numArgs: 0,\n allowedInText: true\n },\n handler: (_ref3, args) => {\n var {\n parser,\n funcName,\n breakOnTokenText\n } = _ref3;\n var {\n mode\n } = parser;\n var body = parser.parseExpression(true, breakOnTokenText);\n var style = \"math\" + funcName.slice(1);\n return {\n type: \"font\",\n mode: mode,\n font: style,\n body: {\n type: \"ordgroup\",\n mode: parser.mode,\n body\n }\n };\n },\n htmlBuilder: htmlBuilder$5,\n mathmlBuilder: mathmlBuilder$4\n});\n\nvar adjustStyle = (size, originalStyle) => {\n // Figure out what style this fraction should be in based on the\n // function used\n var style = originalStyle;\n\n if (size === \"display\") {\n // Get display style as a default.\n // If incoming style is sub/sup, use style.text() to get correct size.\n style = style.id >= Style$1.SCRIPT.id ? style.text() : Style$1.DISPLAY;\n } else if (size === \"text\" && style.size === Style$1.DISPLAY.size) {\n // We're in a \\tfrac but incoming style is displaystyle, so:\n style = Style$1.TEXT;\n } else if (size === \"script\") {\n style = Style$1.SCRIPT;\n } else if (size === \"scriptscript\") {\n style = Style$1.SCRIPTSCRIPT;\n }\n\n return style;\n};\n\nvar htmlBuilder$4 = (group, options) => {\n // Fractions are handled in the TeXbook on pages 444-445, rules 15(a-e).\n var style = adjustStyle(group.size, options.style);\n var nstyle = style.fracNum();\n var dstyle = style.fracDen();\n var newOptions;\n newOptions = options.havingStyle(nstyle);\n var numerm = buildGroup$1(group.numer, newOptions, options);\n\n if (group.continued) {\n // \\cfrac inserts a \\strut into the numerator.\n // Get \\strut dimensions from TeXbook page 353.\n var hStrut = 8.5 / options.fontMetrics().ptPerEm;\n var dStrut = 3.5 / options.fontMetrics().ptPerEm;\n numerm.height = numerm.height < hStrut ? hStrut : numerm.height;\n numerm.depth = numerm.depth < dStrut ? dStrut : numerm.depth;\n }\n\n newOptions = options.havingStyle(dstyle);\n var denomm = buildGroup$1(group.denom, newOptions, options);\n var rule;\n var ruleWidth;\n var ruleSpacing;\n\n if (group.hasBarLine) {\n if (group.barSize) {\n ruleWidth = calculateSize(group.barSize, options);\n rule = buildCommon.makeLineSpan(\"frac-line\", options, ruleWidth);\n } else {\n rule = buildCommon.makeLineSpan(\"frac-line\", options);\n }\n\n ruleWidth = rule.height;\n ruleSpacing = rule.height;\n } else {\n rule = null;\n ruleWidth = 0;\n ruleSpacing = options.fontMetrics().defaultRuleThickness;\n } // Rule 15b\n\n\n var numShift;\n var clearance;\n var denomShift;\n\n if (style.size === Style$1.DISPLAY.size || group.size === \"display\") {\n numShift = options.fontMetrics().num1;\n\n if (ruleWidth > 0) {\n clearance = 3 * ruleSpacing;\n } else {\n clearance = 7 * ruleSpacing;\n }\n\n denomShift = options.fontMetrics().denom1;\n } else {\n if (ruleWidth > 0) {\n numShift = options.fontMetrics().num2;\n clearance = ruleSpacing;\n } else {\n numShift = options.fontMetrics().num3;\n clearance = 3 * ruleSpacing;\n }\n\n denomShift = options.fontMetrics().denom2;\n }\n\n var frac;\n\n if (!rule) {\n // Rule 15c\n var candidateClearance = numShift - numerm.depth - (denomm.height - denomShift);\n\n if (candidateClearance < clearance) {\n numShift += 0.5 * (clearance - candidateClearance);\n denomShift += 0.5 * (clearance - candidateClearance);\n }\n\n frac = buildCommon.makeVList({\n positionType: \"individualShift\",\n children: [{\n type: \"elem\",\n elem: denomm,\n shift: denomShift\n }, {\n type: \"elem\",\n elem: numerm,\n shift: -numShift\n }]\n }, options);\n } else {\n // Rule 15d\n var axisHeight = options.fontMetrics().axisHeight;\n\n if (numShift - numerm.depth - (axisHeight + 0.5 * ruleWidth) < clearance) {\n numShift += clearance - (numShift - numerm.depth - (axisHeight + 0.5 * ruleWidth));\n }\n\n if (axisHeight - 0.5 * ruleWidth - (denomm.height - denomShift) < clearance) {\n denomShift += clearance - (axisHeight - 0.5 * ruleWidth - (denomm.height - denomShift));\n }\n\n var midShift = -(axisHeight - 0.5 * ruleWidth);\n frac = buildCommon.makeVList({\n positionType: \"individualShift\",\n children: [{\n type: \"elem\",\n elem: denomm,\n shift: denomShift\n }, {\n type: \"elem\",\n elem: rule,\n shift: midShift\n }, {\n type: \"elem\",\n elem: numerm,\n shift: -numShift\n }]\n }, options);\n } // Since we manually change the style sometimes (with \\dfrac or \\tfrac),\n // account for the possible size change here.\n\n\n newOptions = options.havingStyle(style);\n frac.height *= newOptions.sizeMultiplier / options.sizeMultiplier;\n frac.depth *= newOptions.sizeMultiplier / options.sizeMultiplier; // Rule 15e\n\n var delimSize;\n\n if (style.size === Style$1.DISPLAY.size) {\n delimSize = options.fontMetrics().delim1;\n } else if (style.size === Style$1.SCRIPTSCRIPT.size) {\n delimSize = options.havingStyle(Style$1.SCRIPT).fontMetrics().delim2;\n } else {\n delimSize = options.fontMetrics().delim2;\n }\n\n var leftDelim;\n var rightDelim;\n\n if (group.leftDelim == null) {\n leftDelim = makeNullDelimiter(options, [\"mopen\"]);\n } else {\n leftDelim = delimiter.customSizedDelim(group.leftDelim, delimSize, true, options.havingStyle(style), group.mode, [\"mopen\"]);\n }\n\n if (group.continued) {\n rightDelim = buildCommon.makeSpan([]); // zero width for \\cfrac\n } else if (group.rightDelim == null) {\n rightDelim = makeNullDelimiter(options, [\"mclose\"]);\n } else {\n rightDelim = delimiter.customSizedDelim(group.rightDelim, delimSize, true, options.havingStyle(style), group.mode, [\"mclose\"]);\n }\n\n return buildCommon.makeSpan([\"mord\"].concat(newOptions.sizingClasses(options)), [leftDelim, buildCommon.makeSpan([\"mfrac\"], [frac]), rightDelim], options);\n};\n\nvar mathmlBuilder$3 = (group, options) => {\n var node = new mathMLTree.MathNode(\"mfrac\", [buildGroup(group.numer, options), buildGroup(group.denom, options)]);\n\n if (!group.hasBarLine) {\n node.setAttribute(\"linethickness\", \"0px\");\n } else if (group.barSize) {\n var ruleWidth = calculateSize(group.barSize, options);\n node.setAttribute(\"linethickness\", makeEm(ruleWidth));\n }\n\n var style = adjustStyle(group.size, options.style);\n\n if (style.size !== options.style.size) {\n node = new mathMLTree.MathNode(\"mstyle\", [node]);\n var isDisplay = style.size === Style$1.DISPLAY.size ? \"true\" : \"false\";\n node.setAttribute(\"displaystyle\", isDisplay);\n node.setAttribute(\"scriptlevel\", \"0\");\n }\n\n if (group.leftDelim != null || group.rightDelim != null) {\n var withDelims = [];\n\n if (group.leftDelim != null) {\n var leftOp = new mathMLTree.MathNode(\"mo\", [new mathMLTree.TextNode(group.leftDelim.replace(\"\\\\\", \"\"))]);\n leftOp.setAttribute(\"fence\", \"true\");\n withDelims.push(leftOp);\n }\n\n withDelims.push(node);\n\n if (group.rightDelim != null) {\n var rightOp = new mathMLTree.MathNode(\"mo\", [new mathMLTree.TextNode(group.rightDelim.replace(\"\\\\\", \"\"))]);\n rightOp.setAttribute(\"fence\", \"true\");\n withDelims.push(rightOp);\n }\n\n return makeRow(withDelims);\n }\n\n return node;\n};\n\ndefineFunction({\n type: \"genfrac\",\n names: [\"\\\\dfrac\", \"\\\\frac\", \"\\\\tfrac\", \"\\\\dbinom\", \"\\\\binom\", \"\\\\tbinom\", \"\\\\\\\\atopfrac\", // can’t be entered directly\n \"\\\\\\\\bracefrac\", \"\\\\\\\\brackfrac\" // ditto\n ],\n props: {\n numArgs: 2,\n allowedInArgument: true\n },\n handler: (_ref, args) => {\n var {\n parser,\n funcName\n } = _ref;\n var numer = args[0];\n var denom = args[1];\n var hasBarLine;\n var leftDelim = null;\n var rightDelim = null;\n var size = \"auto\";\n\n switch (funcName) {\n case \"\\\\dfrac\":\n case \"\\\\frac\":\n case \"\\\\tfrac\":\n hasBarLine = true;\n break;\n\n case \"\\\\\\\\atopfrac\":\n hasBarLine = false;\n break;\n\n case \"\\\\dbinom\":\n case \"\\\\binom\":\n case \"\\\\tbinom\":\n hasBarLine = false;\n leftDelim = \"(\";\n rightDelim = \")\";\n break;\n\n case \"\\\\\\\\bracefrac\":\n hasBarLine = false;\n leftDelim = \"\\\\{\";\n rightDelim = \"\\\\}\";\n break;\n\n case \"\\\\\\\\brackfrac\":\n hasBarLine = false;\n leftDelim = \"[\";\n rightDelim = \"]\";\n break;\n\n default:\n throw new Error(\"Unrecognized genfrac command\");\n }\n\n switch (funcName) {\n case \"\\\\dfrac\":\n case \"\\\\dbinom\":\n size = \"display\";\n break;\n\n case \"\\\\tfrac\":\n case \"\\\\tbinom\":\n size = \"text\";\n break;\n }\n\n return {\n type: \"genfrac\",\n mode: parser.mode,\n continued: false,\n numer,\n denom,\n hasBarLine,\n leftDelim,\n rightDelim,\n size,\n barSize: null\n };\n },\n htmlBuilder: htmlBuilder$4,\n mathmlBuilder: mathmlBuilder$3\n});\ndefineFunction({\n type: \"genfrac\",\n names: [\"\\\\cfrac\"],\n props: {\n numArgs: 2\n },\n handler: (_ref2, args) => {\n var {\n parser,\n funcName\n } = _ref2;\n var numer = args[0];\n var denom = args[1];\n return {\n type: \"genfrac\",\n mode: parser.mode,\n continued: true,\n numer,\n denom,\n hasBarLine: true,\n leftDelim: null,\n rightDelim: null,\n size: \"display\",\n barSize: null\n };\n }\n}); // Infix generalized fractions -- these are not rendered directly, but replaced\n// immediately by one of the variants above.\n\ndefineFunction({\n type: \"infix\",\n names: [\"\\\\over\", \"\\\\choose\", \"\\\\atop\", \"\\\\brace\", \"\\\\brack\"],\n props: {\n numArgs: 0,\n infix: true\n },\n\n handler(_ref3) {\n var {\n parser,\n funcName,\n token\n } = _ref3;\n var replaceWith;\n\n switch (funcName) {\n case \"\\\\over\":\n replaceWith = \"\\\\frac\";\n break;\n\n case \"\\\\choose\":\n replaceWith = \"\\\\binom\";\n break;\n\n case \"\\\\atop\":\n replaceWith = \"\\\\\\\\atopfrac\";\n break;\n\n case \"\\\\brace\":\n replaceWith = \"\\\\\\\\bracefrac\";\n break;\n\n case \"\\\\brack\":\n replaceWith = \"\\\\\\\\brackfrac\";\n break;\n\n default:\n throw new Error(\"Unrecognized infix genfrac command\");\n }\n\n return {\n type: \"infix\",\n mode: parser.mode,\n replaceWith,\n token\n };\n }\n\n});\nvar stylArray = [\"display\", \"text\", \"script\", \"scriptscript\"];\n\nvar delimFromValue = function delimFromValue(delimString) {\n var delim = null;\n\n if (delimString.length > 0) {\n delim = delimString;\n delim = delim === \".\" ? null : delim;\n }\n\n return delim;\n};\n\ndefineFunction({\n type: \"genfrac\",\n names: [\"\\\\genfrac\"],\n props: {\n numArgs: 6,\n allowedInArgument: true,\n argTypes: [\"math\", \"math\", \"size\", \"text\", \"math\", \"math\"]\n },\n\n handler(_ref4, args) {\n var {\n parser\n } = _ref4;\n var numer = args[4];\n var denom = args[5]; // Look into the parse nodes to get the desired delimiters.\n\n var leftNode = normalizeArgument(args[0]);\n var leftDelim = leftNode.type === \"atom\" && leftNode.family === \"open\" ? delimFromValue(leftNode.text) : null;\n var rightNode = normalizeArgument(args[1]);\n var rightDelim = rightNode.type === \"atom\" && rightNode.family === \"close\" ? delimFromValue(rightNode.text) : null;\n var barNode = assertNodeType(args[2], \"size\");\n var hasBarLine;\n var barSize = null;\n\n if (barNode.isBlank) {\n // \\genfrac acts differently than \\above.\n // \\genfrac treats an empty size group as a signal to use a\n // standard bar size. \\above would see size = 0 and omit the bar.\n hasBarLine = true;\n } else {\n barSize = barNode.value;\n hasBarLine = barSize.number > 0;\n } // Find out if we want displaystyle, textstyle, etc.\n\n\n var size = \"auto\";\n var styl = args[3];\n\n if (styl.type === \"ordgroup\") {\n if (styl.body.length > 0) {\n var textOrd = assertNodeType(styl.body[0], \"textord\");\n size = stylArray[Number(textOrd.text)];\n }\n } else {\n styl = assertNodeType(styl, \"textord\");\n size = stylArray[Number(styl.text)];\n }\n\n return {\n type: \"genfrac\",\n mode: parser.mode,\n numer,\n denom,\n continued: false,\n hasBarLine,\n barSize,\n leftDelim,\n rightDelim,\n size\n };\n },\n\n htmlBuilder: htmlBuilder$4,\n mathmlBuilder: mathmlBuilder$3\n}); // \\above is an infix fraction that also defines a fraction bar size.\n\ndefineFunction({\n type: \"infix\",\n names: [\"\\\\above\"],\n props: {\n numArgs: 1,\n argTypes: [\"size\"],\n infix: true\n },\n\n handler(_ref5, args) {\n var {\n parser,\n funcName,\n token\n } = _ref5;\n return {\n type: \"infix\",\n mode: parser.mode,\n replaceWith: \"\\\\\\\\abovefrac\",\n size: assertNodeType(args[0], \"size\").value,\n token\n };\n }\n\n});\ndefineFunction({\n type: \"genfrac\",\n names: [\"\\\\\\\\abovefrac\"],\n props: {\n numArgs: 3,\n argTypes: [\"math\", \"size\", \"math\"]\n },\n handler: (_ref6, args) => {\n var {\n parser,\n funcName\n } = _ref6;\n var numer = args[0];\n var barSize = assert(assertNodeType(args[1], \"infix\").size);\n var denom = args[2];\n var hasBarLine = barSize.number > 0;\n return {\n type: \"genfrac\",\n mode: parser.mode,\n numer,\n denom,\n continued: false,\n hasBarLine,\n barSize,\n leftDelim: null,\n rightDelim: null,\n size: \"auto\"\n };\n },\n htmlBuilder: htmlBuilder$4,\n mathmlBuilder: mathmlBuilder$3\n});\n\n// NOTE: Unlike most `htmlBuilder`s, this one handles not only \"horizBrace\", but\n// also \"supsub\" since an over/underbrace can affect super/subscripting.\nvar htmlBuilder$3 = (grp, options) => {\n var style = options.style; // Pull out the `ParseNode<\"horizBrace\">` if `grp` is a \"supsub\" node.\n\n var supSubGroup;\n var group;\n\n if (grp.type === \"supsub\") {\n // Ref: LaTeX source2e: }}}}\\limits}\n // i.e. LaTeX treats the brace similar to an op and passes it\n // with \\limits, so we need to assign supsub style.\n supSubGroup = grp.sup ? buildGroup$1(grp.sup, options.havingStyle(style.sup()), options) : buildGroup$1(grp.sub, options.havingStyle(style.sub()), options);\n group = assertNodeType(grp.base, \"horizBrace\");\n } else {\n group = assertNodeType(grp, \"horizBrace\");\n } // Build the base group\n\n\n var body = buildGroup$1(group.base, options.havingBaseStyle(Style$1.DISPLAY)); // Create the stretchy element\n\n var braceBody = stretchy.svgSpan(group, options); // Generate the vlist, with the appropriate kerns ┏━━━━━━━━┓\n // This first vlist contains the content and the brace: equation\n\n var vlist;\n\n if (group.isOver) {\n vlist = buildCommon.makeVList({\n positionType: \"firstBaseline\",\n children: [{\n type: \"elem\",\n elem: body\n }, {\n type: \"kern\",\n size: 0.1\n }, {\n type: \"elem\",\n elem: braceBody\n }]\n }, options); // $FlowFixMe: Replace this with passing \"svg-align\" into makeVList.\n\n vlist.children[0].children[0].children[1].classes.push(\"svg-align\");\n } else {\n vlist = buildCommon.makeVList({\n positionType: \"bottom\",\n positionData: body.depth + 0.1 + braceBody.height,\n children: [{\n type: \"elem\",\n elem: braceBody\n }, {\n type: \"kern\",\n size: 0.1\n }, {\n type: \"elem\",\n elem: body\n }]\n }, options); // $FlowFixMe: Replace this with passing \"svg-align\" into makeVList.\n\n vlist.children[0].children[0].children[0].classes.push(\"svg-align\");\n }\n\n if (supSubGroup) {\n // To write the supsub, wrap the first vlist in another vlist:\n // They can't all go in the same vlist, because the note might be\n // wider than the equation. We want the equation to control the\n // brace width.\n // note long note long note\n // ┏━━━━━━━━┓ or ┏━━━┓ not ┏━━━━━━━━━┓\n // equation eqn eqn\n var vSpan = buildCommon.makeSpan([\"mord\", group.isOver ? \"mover\" : \"munder\"], [vlist], options);\n\n if (group.isOver) {\n vlist = buildCommon.makeVList({\n positionType: \"firstBaseline\",\n children: [{\n type: \"elem\",\n elem: vSpan\n }, {\n type: \"kern\",\n size: 0.2\n }, {\n type: \"elem\",\n elem: supSubGroup\n }]\n }, options);\n } else {\n vlist = buildCommon.makeVList({\n positionType: \"bottom\",\n positionData: vSpan.depth + 0.2 + supSubGroup.height + supSubGroup.depth,\n children: [{\n type: \"elem\",\n elem: supSubGroup\n }, {\n type: \"kern\",\n size: 0.2\n }, {\n type: \"elem\",\n elem: vSpan\n }]\n }, options);\n }\n }\n\n return buildCommon.makeSpan([\"mord\", group.isOver ? \"mover\" : \"munder\"], [vlist], options);\n};\n\nvar mathmlBuilder$2 = (group, options) => {\n var accentNode = stretchy.mathMLnode(group.label);\n return new mathMLTree.MathNode(group.isOver ? \"mover\" : \"munder\", [buildGroup(group.base, options), accentNode]);\n}; // Horizontal stretchy braces\n\n\ndefineFunction({\n type: \"horizBrace\",\n names: [\"\\\\overbrace\", \"\\\\underbrace\"],\n props: {\n numArgs: 1\n },\n\n handler(_ref, args) {\n var {\n parser,\n funcName\n } = _ref;\n return {\n type: \"horizBrace\",\n mode: parser.mode,\n label: funcName,\n isOver: /^\\\\over/.test(funcName),\n base: args[0]\n };\n },\n\n htmlBuilder: htmlBuilder$3,\n mathmlBuilder: mathmlBuilder$2\n});\n\ndefineFunction({\n type: \"href\",\n names: [\"\\\\href\"],\n props: {\n numArgs: 2,\n argTypes: [\"url\", \"original\"],\n allowedInText: true\n },\n handler: (_ref, args) => {\n var {\n parser\n } = _ref;\n var body = args[1];\n var href = assertNodeType(args[0], \"url\").url;\n\n if (!parser.settings.isTrusted({\n command: \"\\\\href\",\n url: href\n })) {\n return parser.formatUnsupportedCmd(\"\\\\href\");\n }\n\n return {\n type: \"href\",\n mode: parser.mode,\n href,\n body: ordargument(body)\n };\n },\n htmlBuilder: (group, options) => {\n var elements = buildExpression$1(group.body, options, false);\n return buildCommon.makeAnchor(group.href, [], elements, options);\n },\n mathmlBuilder: (group, options) => {\n var math = buildExpressionRow(group.body, options);\n\n if (!(math instanceof MathNode)) {\n math = new MathNode(\"mrow\", [math]);\n }\n\n math.setAttribute(\"href\", group.href);\n return math;\n }\n});\ndefineFunction({\n type: \"href\",\n names: [\"\\\\url\"],\n props: {\n numArgs: 1,\n argTypes: [\"url\"],\n allowedInText: true\n },\n handler: (_ref2, args) => {\n var {\n parser\n } = _ref2;\n var href = assertNodeType(args[0], \"url\").url;\n\n if (!parser.settings.isTrusted({\n command: \"\\\\url\",\n url: href\n })) {\n return parser.formatUnsupportedCmd(\"\\\\url\");\n }\n\n var chars = [];\n\n for (var i = 0; i < href.length; i++) {\n var c = href[i];\n\n if (c === \"~\") {\n c = \"\\\\textasciitilde\";\n }\n\n chars.push({\n type: \"textord\",\n mode: \"text\",\n text: c\n });\n }\n\n var body = {\n type: \"text\",\n mode: parser.mode,\n font: \"\\\\texttt\",\n body: chars\n };\n return {\n type: \"href\",\n mode: parser.mode,\n href,\n body: ordargument(body)\n };\n }\n});\n\n// In LaTeX, \\vcenter can act only on a box, as in\n// \\vcenter{\\hbox{$\\frac{a+b}{\\dfrac{c}{d}}$}}\n// This function by itself doesn't do anything but prevent a soft line break.\n\ndefineFunction({\n type: \"hbox\",\n names: [\"\\\\hbox\"],\n props: {\n numArgs: 1,\n argTypes: [\"text\"],\n allowedInText: true,\n primitive: true\n },\n\n handler(_ref, args) {\n var {\n parser\n } = _ref;\n return {\n type: \"hbox\",\n mode: parser.mode,\n body: ordargument(args[0])\n };\n },\n\n htmlBuilder(group, options) {\n var elements = buildExpression$1(group.body, options, false);\n return buildCommon.makeFragment(elements);\n },\n\n mathmlBuilder(group, options) {\n return new mathMLTree.MathNode(\"mrow\", buildExpression(group.body, options));\n }\n\n});\n\ndefineFunction({\n type: \"html\",\n names: [\"\\\\htmlClass\", \"\\\\htmlId\", \"\\\\htmlStyle\", \"\\\\htmlData\"],\n props: {\n numArgs: 2,\n argTypes: [\"raw\", \"original\"],\n allowedInText: true\n },\n handler: (_ref, args) => {\n var {\n parser,\n funcName,\n token\n } = _ref;\n var value = assertNodeType(args[0], \"raw\").string;\n var body = args[1];\n\n if (parser.settings.strict) {\n parser.settings.reportNonstrict(\"htmlExtension\", \"HTML extension is disabled on strict mode\");\n }\n\n var trustContext;\n var attributes = {};\n\n switch (funcName) {\n case \"\\\\htmlClass\":\n attributes.class = value;\n trustContext = {\n command: \"\\\\htmlClass\",\n class: value\n };\n break;\n\n case \"\\\\htmlId\":\n attributes.id = value;\n trustContext = {\n command: \"\\\\htmlId\",\n id: value\n };\n break;\n\n case \"\\\\htmlStyle\":\n attributes.style = value;\n trustContext = {\n command: \"\\\\htmlStyle\",\n style: value\n };\n break;\n\n case \"\\\\htmlData\":\n {\n var data = value.split(\",\");\n\n for (var i = 0; i < data.length; i++) {\n var keyVal = data[i].split(\"=\");\n\n if (keyVal.length !== 2) {\n throw new ParseError(\"Error parsing key-value for \\\\htmlData\");\n }\n\n attributes[\"data-\" + keyVal[0].trim()] = keyVal[1].trim();\n }\n\n trustContext = {\n command: \"\\\\htmlData\",\n attributes\n };\n break;\n }\n\n default:\n throw new Error(\"Unrecognized html command\");\n }\n\n if (!parser.settings.isTrusted(trustContext)) {\n return parser.formatUnsupportedCmd(funcName);\n }\n\n return {\n type: \"html\",\n mode: parser.mode,\n attributes,\n body: ordargument(body)\n };\n },\n htmlBuilder: (group, options) => {\n var elements = buildExpression$1(group.body, options, false);\n var classes = [\"enclosing\"];\n\n if (group.attributes.class) {\n classes.push(...group.attributes.class.trim().split(/\\s+/));\n }\n\n var span = buildCommon.makeSpan(classes, elements, options);\n\n for (var attr in group.attributes) {\n if (attr !== \"class\" && group.attributes.hasOwnProperty(attr)) {\n span.setAttribute(attr, group.attributes[attr]);\n }\n }\n\n return span;\n },\n mathmlBuilder: (group, options) => {\n return buildExpressionRow(group.body, options);\n }\n});\n\ndefineFunction({\n type: \"htmlmathml\",\n names: [\"\\\\html@mathml\"],\n props: {\n numArgs: 2,\n allowedInText: true\n },\n handler: (_ref, args) => {\n var {\n parser\n } = _ref;\n return {\n type: \"htmlmathml\",\n mode: parser.mode,\n html: ordargument(args[0]),\n mathml: ordargument(args[1])\n };\n },\n htmlBuilder: (group, options) => {\n var elements = buildExpression$1(group.html, options, false);\n return buildCommon.makeFragment(elements);\n },\n mathmlBuilder: (group, options) => {\n return buildExpressionRow(group.mathml, options);\n }\n});\n\nvar sizeData = function sizeData(str) {\n if (/^[-+]? *(\\d+(\\.\\d*)?|\\.\\d+)$/.test(str)) {\n // str is a number with no unit specified.\n // default unit is bp, per graphix package.\n return {\n number: +str,\n unit: \"bp\"\n };\n } else {\n var match = /([-+]?) *(\\d+(?:\\.\\d*)?|\\.\\d+) *([a-z]{2})/.exec(str);\n\n if (!match) {\n throw new ParseError(\"Invalid size: '\" + str + \"' in \\\\includegraphics\");\n }\n\n var data = {\n number: +(match[1] + match[2]),\n // sign + magnitude, cast to number\n unit: match[3]\n };\n\n if (!validUnit(data)) {\n throw new ParseError(\"Invalid unit: '\" + data.unit + \"' in \\\\includegraphics.\");\n }\n\n return data;\n }\n};\n\ndefineFunction({\n type: \"includegraphics\",\n names: [\"\\\\includegraphics\"],\n props: {\n numArgs: 1,\n numOptionalArgs: 1,\n argTypes: [\"raw\", \"url\"],\n allowedInText: false\n },\n handler: (_ref, args, optArgs) => {\n var {\n parser\n } = _ref;\n var width = {\n number: 0,\n unit: \"em\"\n };\n var height = {\n number: 0.9,\n unit: \"em\"\n }; // sorta character sized.\n\n var totalheight = {\n number: 0,\n unit: \"em\"\n };\n var alt = \"\";\n\n if (optArgs[0]) {\n var attributeStr = assertNodeType(optArgs[0], \"raw\").string; // Parser.js does not parse key/value pairs. We get a string.\n\n var attributes = attributeStr.split(\",\");\n\n for (var i = 0; i < attributes.length; i++) {\n var keyVal = attributes[i].split(\"=\");\n\n if (keyVal.length === 2) {\n var str = keyVal[1].trim();\n\n switch (keyVal[0].trim()) {\n case \"alt\":\n alt = str;\n break;\n\n case \"width\":\n width = sizeData(str);\n break;\n\n case \"height\":\n height = sizeData(str);\n break;\n\n case \"totalheight\":\n totalheight = sizeData(str);\n break;\n\n default:\n throw new ParseError(\"Invalid key: '\" + keyVal[0] + \"' in \\\\includegraphics.\");\n }\n }\n }\n }\n\n var src = assertNodeType(args[0], \"url\").url;\n\n if (alt === \"\") {\n // No alt given. Use the file name. Strip away the path.\n alt = src;\n alt = alt.replace(/^.*[\\\\/]/, '');\n alt = alt.substring(0, alt.lastIndexOf('.'));\n }\n\n if (!parser.settings.isTrusted({\n command: \"\\\\includegraphics\",\n url: src\n })) {\n return parser.formatUnsupportedCmd(\"\\\\includegraphics\");\n }\n\n return {\n type: \"includegraphics\",\n mode: parser.mode,\n alt: alt,\n width: width,\n height: height,\n totalheight: totalheight,\n src: src\n };\n },\n htmlBuilder: (group, options) => {\n var height = calculateSize(group.height, options);\n var depth = 0;\n\n if (group.totalheight.number > 0) {\n depth = calculateSize(group.totalheight, options) - height;\n }\n\n var width = 0;\n\n if (group.width.number > 0) {\n width = calculateSize(group.width, options);\n }\n\n var style = {\n height: makeEm(height + depth)\n };\n\n if (width > 0) {\n style.width = makeEm(width);\n }\n\n if (depth > 0) {\n style.verticalAlign = makeEm(-depth);\n }\n\n var node = new Img(group.src, group.alt, style);\n node.height = height;\n node.depth = depth;\n return node;\n },\n mathmlBuilder: (group, options) => {\n var node = new mathMLTree.MathNode(\"mglyph\", []);\n node.setAttribute(\"alt\", group.alt);\n var height = calculateSize(group.height, options);\n var depth = 0;\n\n if (group.totalheight.number > 0) {\n depth = calculateSize(group.totalheight, options) - height;\n node.setAttribute(\"valign\", makeEm(-depth));\n }\n\n node.setAttribute(\"height\", makeEm(height + depth));\n\n if (group.width.number > 0) {\n var width = calculateSize(group.width, options);\n node.setAttribute(\"width\", makeEm(width));\n }\n\n node.setAttribute(\"src\", group.src);\n return node;\n }\n});\n\n// Horizontal spacing commands\n\ndefineFunction({\n type: \"kern\",\n names: [\"\\\\kern\", \"\\\\mkern\", \"\\\\hskip\", \"\\\\mskip\"],\n props: {\n numArgs: 1,\n argTypes: [\"size\"],\n primitive: true,\n allowedInText: true\n },\n\n handler(_ref, args) {\n var {\n parser,\n funcName\n } = _ref;\n var size = assertNodeType(args[0], \"size\");\n\n if (parser.settings.strict) {\n var mathFunction = funcName[1] === 'm'; // \\mkern, \\mskip\n\n var muUnit = size.value.unit === 'mu';\n\n if (mathFunction) {\n if (!muUnit) {\n parser.settings.reportNonstrict(\"mathVsTextUnits\", \"LaTeX's \" + funcName + \" supports only mu units, \" + (\"not \" + size.value.unit + \" units\"));\n }\n\n if (parser.mode !== \"math\") {\n parser.settings.reportNonstrict(\"mathVsTextUnits\", \"LaTeX's \" + funcName + \" works only in math mode\");\n }\n } else {\n // !mathFunction\n if (muUnit) {\n parser.settings.reportNonstrict(\"mathVsTextUnits\", \"LaTeX's \" + funcName + \" doesn't support mu units\");\n }\n }\n }\n\n return {\n type: \"kern\",\n mode: parser.mode,\n dimension: size.value\n };\n },\n\n htmlBuilder(group, options) {\n return buildCommon.makeGlue(group.dimension, options);\n },\n\n mathmlBuilder(group, options) {\n var dimension = calculateSize(group.dimension, options);\n return new mathMLTree.SpaceNode(dimension);\n }\n\n});\n\n// Horizontal overlap functions\ndefineFunction({\n type: \"lap\",\n names: [\"\\\\mathllap\", \"\\\\mathrlap\", \"\\\\mathclap\"],\n props: {\n numArgs: 1,\n allowedInText: true\n },\n handler: (_ref, args) => {\n var {\n parser,\n funcName\n } = _ref;\n var body = args[0];\n return {\n type: \"lap\",\n mode: parser.mode,\n alignment: funcName.slice(5),\n body\n };\n },\n htmlBuilder: (group, options) => {\n // mathllap, mathrlap, mathclap\n var inner;\n\n if (group.alignment === \"clap\") {\n // ref: https://www.math.lsu.edu/~aperlis/publications/mathclap/\n inner = buildCommon.makeSpan([], [buildGroup$1(group.body, options)]); // wrap, since CSS will center a .clap > .inner > span\n\n inner = buildCommon.makeSpan([\"inner\"], [inner], options);\n } else {\n inner = buildCommon.makeSpan([\"inner\"], [buildGroup$1(group.body, options)]);\n }\n\n var fix = buildCommon.makeSpan([\"fix\"], []);\n var node = buildCommon.makeSpan([group.alignment], [inner, fix], options); // At this point, we have correctly set horizontal alignment of the\n // two items involved in the lap.\n // Next, use a strut to set the height of the HTML bounding box.\n // Otherwise, a tall argument may be misplaced.\n // This code resolved issue #1153\n\n var strut = buildCommon.makeSpan([\"strut\"]);\n strut.style.height = makeEm(node.height + node.depth);\n\n if (node.depth) {\n strut.style.verticalAlign = makeEm(-node.depth);\n }\n\n node.children.unshift(strut); // Next, prevent vertical misplacement when next to something tall.\n // This code resolves issue #1234\n\n node = buildCommon.makeSpan([\"thinbox\"], [node], options);\n return buildCommon.makeSpan([\"mord\", \"vbox\"], [node], options);\n },\n mathmlBuilder: (group, options) => {\n // mathllap, mathrlap, mathclap\n var node = new mathMLTree.MathNode(\"mpadded\", [buildGroup(group.body, options)]);\n\n if (group.alignment !== \"rlap\") {\n var offset = group.alignment === \"llap\" ? \"-1\" : \"-0.5\";\n node.setAttribute(\"lspace\", offset + \"width\");\n }\n\n node.setAttribute(\"width\", \"0px\");\n return node;\n }\n});\n\ndefineFunction({\n type: \"styling\",\n names: [\"\\\\(\", \"$\"],\n props: {\n numArgs: 0,\n allowedInText: true,\n allowedInMath: false\n },\n\n handler(_ref, args) {\n var {\n funcName,\n parser\n } = _ref;\n var outerMode = parser.mode;\n parser.switchMode(\"math\");\n var close = funcName === \"\\\\(\" ? \"\\\\)\" : \"$\";\n var body = parser.parseExpression(false, close);\n parser.expect(close);\n parser.switchMode(outerMode);\n return {\n type: \"styling\",\n mode: parser.mode,\n style: \"text\",\n body\n };\n }\n\n}); // Check for extra closing math delimiters\n\ndefineFunction({\n type: \"text\",\n // Doesn't matter what this is.\n names: [\"\\\\)\", \"\\\\]\"],\n props: {\n numArgs: 0,\n allowedInText: true,\n allowedInMath: false\n },\n\n handler(context, args) {\n throw new ParseError(\"Mismatched \" + context.funcName);\n }\n\n});\n\nvar chooseMathStyle = (group, options) => {\n switch (options.style.size) {\n case Style$1.DISPLAY.size:\n return group.display;\n\n case Style$1.TEXT.size:\n return group.text;\n\n case Style$1.SCRIPT.size:\n return group.script;\n\n case Style$1.SCRIPTSCRIPT.size:\n return group.scriptscript;\n\n default:\n return group.text;\n }\n};\n\ndefineFunction({\n type: \"mathchoice\",\n names: [\"\\\\mathchoice\"],\n props: {\n numArgs: 4,\n primitive: true\n },\n handler: (_ref, args) => {\n var {\n parser\n } = _ref;\n return {\n type: \"mathchoice\",\n mode: parser.mode,\n display: ordargument(args[0]),\n text: ordargument(args[1]),\n script: ordargument(args[2]),\n scriptscript: ordargument(args[3])\n };\n },\n htmlBuilder: (group, options) => {\n var body = chooseMathStyle(group, options);\n var elements = buildExpression$1(body, options, false);\n return buildCommon.makeFragment(elements);\n },\n mathmlBuilder: (group, options) => {\n var body = chooseMathStyle(group, options);\n return buildExpressionRow(body, options);\n }\n});\n\nvar assembleSupSub = (base, supGroup, subGroup, options, style, slant, baseShift) => {\n base = buildCommon.makeSpan([], [base]);\n var subIsSingleCharacter = subGroup && utils.isCharacterBox(subGroup);\n var sub;\n var sup; // We manually have to handle the superscripts and subscripts. This,\n // aside from the kern calculations, is copied from supsub.\n\n if (supGroup) {\n var elem = buildGroup$1(supGroup, options.havingStyle(style.sup()), options);\n sup = {\n elem,\n kern: Math.max(options.fontMetrics().bigOpSpacing1, options.fontMetrics().bigOpSpacing3 - elem.depth)\n };\n }\n\n if (subGroup) {\n var _elem = buildGroup$1(subGroup, options.havingStyle(style.sub()), options);\n\n sub = {\n elem: _elem,\n kern: Math.max(options.fontMetrics().bigOpSpacing2, options.fontMetrics().bigOpSpacing4 - _elem.height)\n };\n } // Build the final group as a vlist of the possible subscript, base,\n // and possible superscript.\n\n\n var finalGroup;\n\n if (sup && sub) {\n var bottom = options.fontMetrics().bigOpSpacing5 + sub.elem.height + sub.elem.depth + sub.kern + base.depth + baseShift;\n finalGroup = buildCommon.makeVList({\n positionType: \"bottom\",\n positionData: bottom,\n children: [{\n type: \"kern\",\n size: options.fontMetrics().bigOpSpacing5\n }, {\n type: \"elem\",\n elem: sub.elem,\n marginLeft: makeEm(-slant)\n }, {\n type: \"kern\",\n size: sub.kern\n }, {\n type: \"elem\",\n elem: base\n }, {\n type: \"kern\",\n size: sup.kern\n }, {\n type: \"elem\",\n elem: sup.elem,\n marginLeft: makeEm(slant)\n }, {\n type: \"kern\",\n size: options.fontMetrics().bigOpSpacing5\n }]\n }, options);\n } else if (sub) {\n var top = base.height - baseShift; // Shift the limits by the slant of the symbol. Note\n // that we are supposed to shift the limits by 1/2 of the slant,\n // but since we are centering the limits adding a full slant of\n // margin will shift by 1/2 that.\n\n finalGroup = buildCommon.makeVList({\n positionType: \"top\",\n positionData: top,\n children: [{\n type: \"kern\",\n size: options.fontMetrics().bigOpSpacing5\n }, {\n type: \"elem\",\n elem: sub.elem,\n marginLeft: makeEm(-slant)\n }, {\n type: \"kern\",\n size: sub.kern\n }, {\n type: \"elem\",\n elem: base\n }]\n }, options);\n } else if (sup) {\n var _bottom = base.depth + baseShift;\n\n finalGroup = buildCommon.makeVList({\n positionType: \"bottom\",\n positionData: _bottom,\n children: [{\n type: \"elem\",\n elem: base\n }, {\n type: \"kern\",\n size: sup.kern\n }, {\n type: \"elem\",\n elem: sup.elem,\n marginLeft: makeEm(slant)\n }, {\n type: \"kern\",\n size: options.fontMetrics().bigOpSpacing5\n }]\n }, options);\n } else {\n // This case probably shouldn't occur (this would mean the\n // supsub was sending us a group with no superscript or\n // subscript) but be safe.\n return base;\n }\n\n var parts = [finalGroup];\n\n if (sub && slant !== 0 && !subIsSingleCharacter) {\n // A negative margin-left was applied to the lower limit.\n // Avoid an overlap by placing a spacer on the left on the group.\n var spacer = buildCommon.makeSpan([\"mspace\"], [], options);\n spacer.style.marginRight = makeEm(slant);\n parts.unshift(spacer);\n }\n\n return buildCommon.makeSpan([\"mop\", \"op-limits\"], parts, options);\n};\n\n// Limits, symbols\n// Most operators have a large successor symbol, but these don't.\nvar noSuccessor = [\"\\\\smallint\"]; // NOTE: Unlike most `htmlBuilder`s, this one handles not only \"op\", but also\n// \"supsub\" since some of them (like \\int) can affect super/subscripting.\n\nvar htmlBuilder$2 = (grp, options) => {\n // Operators are handled in the TeXbook pg. 443-444, rule 13(a).\n var supGroup;\n var subGroup;\n var hasLimits = false;\n var group;\n\n if (grp.type === \"supsub\") {\n // If we have limits, supsub will pass us its group to handle. Pull\n // out the superscript and subscript and set the group to the op in\n // its base.\n supGroup = grp.sup;\n subGroup = grp.sub;\n group = assertNodeType(grp.base, \"op\");\n hasLimits = true;\n } else {\n group = assertNodeType(grp, \"op\");\n }\n\n var style = options.style;\n var large = false;\n\n if (style.size === Style$1.DISPLAY.size && group.symbol && !utils.contains(noSuccessor, group.name)) {\n // Most symbol operators get larger in displaystyle (rule 13)\n large = true;\n }\n\n var base;\n\n if (group.symbol) {\n // If this is a symbol, create the symbol.\n var fontName = large ? \"Size2-Regular\" : \"Size1-Regular\";\n var stash = \"\";\n\n if (group.name === \"\\\\oiint\" || group.name === \"\\\\oiiint\") {\n // No font glyphs yet, so use a glyph w/o the oval.\n // TODO: When font glyphs are available, delete this code.\n stash = group.name.slice(1);\n group.name = stash === \"oiint\" ? \"\\\\iint\" : \"\\\\iiint\";\n }\n\n base = buildCommon.makeSymbol(group.name, fontName, \"math\", options, [\"mop\", \"op-symbol\", large ? \"large-op\" : \"small-op\"]);\n\n if (stash.length > 0) {\n // We're in \\oiint or \\oiiint. Overlay the oval.\n // TODO: When font glyphs are available, delete this code.\n var italic = base.italic;\n var oval = buildCommon.staticSvg(stash + \"Size\" + (large ? \"2\" : \"1\"), options);\n base = buildCommon.makeVList({\n positionType: \"individualShift\",\n children: [{\n type: \"elem\",\n elem: base,\n shift: 0\n }, {\n type: \"elem\",\n elem: oval,\n shift: large ? 0.08 : 0\n }]\n }, options);\n group.name = \"\\\\\" + stash;\n base.classes.unshift(\"mop\"); // $FlowFixMe\n\n base.italic = italic;\n }\n } else if (group.body) {\n // If this is a list, compose that list.\n var inner = buildExpression$1(group.body, options, true);\n\n if (inner.length === 1 && inner[0] instanceof SymbolNode) {\n base = inner[0];\n base.classes[0] = \"mop\"; // replace old mclass\n } else {\n base = buildCommon.makeSpan([\"mop\"], inner, options);\n }\n } else {\n // Otherwise, this is a text operator. Build the text from the\n // operator's name.\n var output = [];\n\n for (var i = 1; i < group.name.length; i++) {\n output.push(buildCommon.mathsym(group.name[i], group.mode, options));\n }\n\n base = buildCommon.makeSpan([\"mop\"], output, options);\n } // If content of op is a single symbol, shift it vertically.\n\n\n var baseShift = 0;\n var slant = 0;\n\n if ((base instanceof SymbolNode || group.name === \"\\\\oiint\" || group.name === \"\\\\oiiint\") && !group.suppressBaseShift) {\n // We suppress the shift of the base of \\overset and \\underset. Otherwise,\n // shift the symbol so its center lies on the axis (rule 13). It\n // appears that our fonts have the centers of the symbols already\n // almost on the axis, so these numbers are very small. Note we\n // don't actually apply this here, but instead it is used either in\n // the vlist creation or separately when there are no limits.\n baseShift = (base.height - base.depth) / 2 - options.fontMetrics().axisHeight; // The slant of the symbol is just its italic correction.\n // $FlowFixMe\n\n slant = base.italic;\n }\n\n if (hasLimits) {\n return assembleSupSub(base, supGroup, subGroup, options, style, slant, baseShift);\n } else {\n if (baseShift) {\n base.style.position = \"relative\";\n base.style.top = makeEm(baseShift);\n }\n\n return base;\n }\n};\n\nvar mathmlBuilder$1 = (group, options) => {\n var node;\n\n if (group.symbol) {\n // This is a symbol. Just add the symbol.\n node = new MathNode(\"mo\", [makeText(group.name, group.mode)]);\n\n if (utils.contains(noSuccessor, group.name)) {\n node.setAttribute(\"largeop\", \"false\");\n }\n } else if (group.body) {\n // This is an operator with children. Add them.\n node = new MathNode(\"mo\", buildExpression(group.body, options));\n } else {\n // This is a text operator. Add all of the characters from the\n // operator's name.\n node = new MathNode(\"mi\", [new TextNode(group.name.slice(1))]); // Append an .\n // ref: https://www.w3.org/TR/REC-MathML/chap3_2.html#sec3.2.4\n\n var operator = new MathNode(\"mo\", [makeText(\"\\u2061\", \"text\")]);\n\n if (group.parentIsSupSub) {\n node = new MathNode(\"mrow\", [node, operator]);\n } else {\n node = newDocumentFragment([node, operator]);\n }\n }\n\n return node;\n};\n\nvar singleCharBigOps = {\n \"\\u220F\": \"\\\\prod\",\n \"\\u2210\": \"\\\\coprod\",\n \"\\u2211\": \"\\\\sum\",\n \"\\u22c0\": \"\\\\bigwedge\",\n \"\\u22c1\": \"\\\\bigvee\",\n \"\\u22c2\": \"\\\\bigcap\",\n \"\\u22c3\": \"\\\\bigcup\",\n \"\\u2a00\": \"\\\\bigodot\",\n \"\\u2a01\": \"\\\\bigoplus\",\n \"\\u2a02\": \"\\\\bigotimes\",\n \"\\u2a04\": \"\\\\biguplus\",\n \"\\u2a06\": \"\\\\bigsqcup\"\n};\ndefineFunction({\n type: \"op\",\n names: [\"\\\\coprod\", \"\\\\bigvee\", \"\\\\bigwedge\", \"\\\\biguplus\", \"\\\\bigcap\", \"\\\\bigcup\", \"\\\\intop\", \"\\\\prod\", \"\\\\sum\", \"\\\\bigotimes\", \"\\\\bigoplus\", \"\\\\bigodot\", \"\\\\bigsqcup\", \"\\\\smallint\", \"\\u220F\", \"\\u2210\", \"\\u2211\", \"\\u22c0\", \"\\u22c1\", \"\\u22c2\", \"\\u22c3\", \"\\u2a00\", \"\\u2a01\", \"\\u2a02\", \"\\u2a04\", \"\\u2a06\"],\n props: {\n numArgs: 0\n },\n handler: (_ref, args) => {\n var {\n parser,\n funcName\n } = _ref;\n var fName = funcName;\n\n if (fName.length === 1) {\n fName = singleCharBigOps[fName];\n }\n\n return {\n type: \"op\",\n mode: parser.mode,\n limits: true,\n parentIsSupSub: false,\n symbol: true,\n name: fName\n };\n },\n htmlBuilder: htmlBuilder$2,\n mathmlBuilder: mathmlBuilder$1\n}); // Note: calling defineFunction with a type that's already been defined only\n// works because the same htmlBuilder and mathmlBuilder are being used.\n\ndefineFunction({\n type: \"op\",\n names: [\"\\\\mathop\"],\n props: {\n numArgs: 1,\n primitive: true\n },\n handler: (_ref2, args) => {\n var {\n parser\n } = _ref2;\n var body = args[0];\n return {\n type: \"op\",\n mode: parser.mode,\n limits: false,\n parentIsSupSub: false,\n symbol: false,\n body: ordargument(body)\n };\n },\n htmlBuilder: htmlBuilder$2,\n mathmlBuilder: mathmlBuilder$1\n}); // There are 2 flags for operators; whether they produce limits in\n// displaystyle, and whether they are symbols and should grow in\n// displaystyle. These four groups cover the four possible choices.\n\nvar singleCharIntegrals = {\n \"\\u222b\": \"\\\\int\",\n \"\\u222c\": \"\\\\iint\",\n \"\\u222d\": \"\\\\iiint\",\n \"\\u222e\": \"\\\\oint\",\n \"\\u222f\": \"\\\\oiint\",\n \"\\u2230\": \"\\\\oiiint\"\n}; // No limits, not symbols\n\ndefineFunction({\n type: \"op\",\n names: [\"\\\\arcsin\", \"\\\\arccos\", \"\\\\arctan\", \"\\\\arctg\", \"\\\\arcctg\", \"\\\\arg\", \"\\\\ch\", \"\\\\cos\", \"\\\\cosec\", \"\\\\cosh\", \"\\\\cot\", \"\\\\cotg\", \"\\\\coth\", \"\\\\csc\", \"\\\\ctg\", \"\\\\cth\", \"\\\\deg\", \"\\\\dim\", \"\\\\exp\", \"\\\\hom\", \"\\\\ker\", \"\\\\lg\", \"\\\\ln\", \"\\\\log\", \"\\\\sec\", \"\\\\sin\", \"\\\\sinh\", \"\\\\sh\", \"\\\\tan\", \"\\\\tanh\", \"\\\\tg\", \"\\\\th\"],\n props: {\n numArgs: 0\n },\n\n handler(_ref3) {\n var {\n parser,\n funcName\n } = _ref3;\n return {\n type: \"op\",\n mode: parser.mode,\n limits: false,\n parentIsSupSub: false,\n symbol: false,\n name: funcName\n };\n },\n\n htmlBuilder: htmlBuilder$2,\n mathmlBuilder: mathmlBuilder$1\n}); // Limits, not symbols\n\ndefineFunction({\n type: \"op\",\n names: [\"\\\\det\", \"\\\\gcd\", \"\\\\inf\", \"\\\\lim\", \"\\\\max\", \"\\\\min\", \"\\\\Pr\", \"\\\\sup\"],\n props: {\n numArgs: 0\n },\n\n handler(_ref4) {\n var {\n parser,\n funcName\n } = _ref4;\n return {\n type: \"op\",\n mode: parser.mode,\n limits: true,\n parentIsSupSub: false,\n symbol: false,\n name: funcName\n };\n },\n\n htmlBuilder: htmlBuilder$2,\n mathmlBuilder: mathmlBuilder$1\n}); // No limits, symbols\n\ndefineFunction({\n type: \"op\",\n names: [\"\\\\int\", \"\\\\iint\", \"\\\\iiint\", \"\\\\oint\", \"\\\\oiint\", \"\\\\oiiint\", \"\\u222b\", \"\\u222c\", \"\\u222d\", \"\\u222e\", \"\\u222f\", \"\\u2230\"],\n props: {\n numArgs: 0\n },\n\n handler(_ref5) {\n var {\n parser,\n funcName\n } = _ref5;\n var fName = funcName;\n\n if (fName.length === 1) {\n fName = singleCharIntegrals[fName];\n }\n\n return {\n type: \"op\",\n mode: parser.mode,\n limits: false,\n parentIsSupSub: false,\n symbol: true,\n name: fName\n };\n },\n\n htmlBuilder: htmlBuilder$2,\n mathmlBuilder: mathmlBuilder$1\n});\n\n// NOTE: Unlike most `htmlBuilder`s, this one handles not only\n// \"operatorname\", but also \"supsub\" since \\operatorname* can\n// affect super/subscripting.\nvar htmlBuilder$1 = (grp, options) => {\n // Operators are handled in the TeXbook pg. 443-444, rule 13(a).\n var supGroup;\n var subGroup;\n var hasLimits = false;\n var group;\n\n if (grp.type === \"supsub\") {\n // If we have limits, supsub will pass us its group to handle. Pull\n // out the superscript and subscript and set the group to the op in\n // its base.\n supGroup = grp.sup;\n subGroup = grp.sub;\n group = assertNodeType(grp.base, \"operatorname\");\n hasLimits = true;\n } else {\n group = assertNodeType(grp, \"operatorname\");\n }\n\n var base;\n\n if (group.body.length > 0) {\n var body = group.body.map(child => {\n // $FlowFixMe: Check if the node has a string `text` property.\n var childText = child.text;\n\n if (typeof childText === \"string\") {\n return {\n type: \"textord\",\n mode: child.mode,\n text: childText\n };\n } else {\n return child;\n }\n }); // Consolidate function names into symbol characters.\n\n var expression = buildExpression$1(body, options.withFont(\"mathrm\"), true);\n\n for (var i = 0; i < expression.length; i++) {\n var child = expression[i];\n\n if (child instanceof SymbolNode) {\n // Per amsopn package,\n // change minus to hyphen and \\ast to asterisk\n child.text = child.text.replace(/\\u2212/, \"-\").replace(/\\u2217/, \"*\");\n }\n }\n\n base = buildCommon.makeSpan([\"mop\"], expression, options);\n } else {\n base = buildCommon.makeSpan([\"mop\"], [], options);\n }\n\n if (hasLimits) {\n return assembleSupSub(base, supGroup, subGroup, options, options.style, 0, 0);\n } else {\n return base;\n }\n};\n\nvar mathmlBuilder = (group, options) => {\n // The steps taken here are similar to the html version.\n var expression = buildExpression(group.body, options.withFont(\"mathrm\")); // Is expression a string or has it something like a fraction?\n\n var isAllString = true; // default\n\n for (var i = 0; i < expression.length; i++) {\n var node = expression[i];\n\n if (node instanceof mathMLTree.SpaceNode) ; else if (node instanceof mathMLTree.MathNode) {\n switch (node.type) {\n case \"mi\":\n case \"mn\":\n case \"ms\":\n case \"mspace\":\n case \"mtext\":\n break;\n // Do nothing yet.\n\n case \"mo\":\n {\n var child = node.children[0];\n\n if (node.children.length === 1 && child instanceof mathMLTree.TextNode) {\n child.text = child.text.replace(/\\u2212/, \"-\").replace(/\\u2217/, \"*\");\n } else {\n isAllString = false;\n }\n\n break;\n }\n\n default:\n isAllString = false;\n }\n } else {\n isAllString = false;\n }\n }\n\n if (isAllString) {\n // Write a single TextNode instead of multiple nested tags.\n var word = expression.map(node => node.toText()).join(\"\");\n expression = [new mathMLTree.TextNode(word)];\n }\n\n var identifier = new mathMLTree.MathNode(\"mi\", expression);\n identifier.setAttribute(\"mathvariant\", \"normal\"); // \\u2061 is the same as ⁡\n // ref: https://www.w3schools.com/charsets/ref_html_entities_a.asp\n\n var operator = new mathMLTree.MathNode(\"mo\", [makeText(\"\\u2061\", \"text\")]);\n\n if (group.parentIsSupSub) {\n return new mathMLTree.MathNode(\"mrow\", [identifier, operator]);\n } else {\n return mathMLTree.newDocumentFragment([identifier, operator]);\n }\n}; // \\operatorname\n// amsopn.dtx: \\mathop{#1\\kern\\z@\\operator@font#3}\\newmcodes@\n\n\ndefineFunction({\n type: \"operatorname\",\n names: [\"\\\\operatorname@\", \"\\\\operatornamewithlimits\"],\n props: {\n numArgs: 1\n },\n handler: (_ref, args) => {\n var {\n parser,\n funcName\n } = _ref;\n var body = args[0];\n return {\n type: \"operatorname\",\n mode: parser.mode,\n body: ordargument(body),\n alwaysHandleSupSub: funcName === \"\\\\operatornamewithlimits\",\n limits: false,\n parentIsSupSub: false\n };\n },\n htmlBuilder: htmlBuilder$1,\n mathmlBuilder\n});\ndefineMacro(\"\\\\operatorname\", \"\\\\@ifstar\\\\operatornamewithlimits\\\\operatorname@\");\n\ndefineFunctionBuilders({\n type: \"ordgroup\",\n\n htmlBuilder(group, options) {\n if (group.semisimple) {\n return buildCommon.makeFragment(buildExpression$1(group.body, options, false));\n }\n\n return buildCommon.makeSpan([\"mord\"], buildExpression$1(group.body, options, true), options);\n },\n\n mathmlBuilder(group, options) {\n return buildExpressionRow(group.body, options, true);\n }\n\n});\n\ndefineFunction({\n type: \"overline\",\n names: [\"\\\\overline\"],\n props: {\n numArgs: 1\n },\n\n handler(_ref, args) {\n var {\n parser\n } = _ref;\n var body = args[0];\n return {\n type: \"overline\",\n mode: parser.mode,\n body\n };\n },\n\n htmlBuilder(group, options) {\n // Overlines are handled in the TeXbook pg 443, Rule 9.\n // Build the inner group in the cramped style.\n var innerGroup = buildGroup$1(group.body, options.havingCrampedStyle()); // Create the line above the body\n\n var line = buildCommon.makeLineSpan(\"overline-line\", options); // Generate the vlist, with the appropriate kerns\n\n var defaultRuleThickness = options.fontMetrics().defaultRuleThickness;\n var vlist = buildCommon.makeVList({\n positionType: \"firstBaseline\",\n children: [{\n type: \"elem\",\n elem: innerGroup\n }, {\n type: \"kern\",\n size: 3 * defaultRuleThickness\n }, {\n type: \"elem\",\n elem: line\n }, {\n type: \"kern\",\n size: defaultRuleThickness\n }]\n }, options);\n return buildCommon.makeSpan([\"mord\", \"overline\"], [vlist], options);\n },\n\n mathmlBuilder(group, options) {\n var operator = new mathMLTree.MathNode(\"mo\", [new mathMLTree.TextNode(\"\\u203e\")]);\n operator.setAttribute(\"stretchy\", \"true\");\n var node = new mathMLTree.MathNode(\"mover\", [buildGroup(group.body, options), operator]);\n node.setAttribute(\"accent\", \"true\");\n return node;\n }\n\n});\n\ndefineFunction({\n type: \"phantom\",\n names: [\"\\\\phantom\"],\n props: {\n numArgs: 1,\n allowedInText: true\n },\n handler: (_ref, args) => {\n var {\n parser\n } = _ref;\n var body = args[0];\n return {\n type: \"phantom\",\n mode: parser.mode,\n body: ordargument(body)\n };\n },\n htmlBuilder: (group, options) => {\n var elements = buildExpression$1(group.body, options.withPhantom(), false); // \\phantom isn't supposed to affect the elements it contains.\n // See \"color\" for more details.\n\n return buildCommon.makeFragment(elements);\n },\n mathmlBuilder: (group, options) => {\n var inner = buildExpression(group.body, options);\n return new mathMLTree.MathNode(\"mphantom\", inner);\n }\n});\ndefineFunction({\n type: \"hphantom\",\n names: [\"\\\\hphantom\"],\n props: {\n numArgs: 1,\n allowedInText: true\n },\n handler: (_ref2, args) => {\n var {\n parser\n } = _ref2;\n var body = args[0];\n return {\n type: \"hphantom\",\n mode: parser.mode,\n body\n };\n },\n htmlBuilder: (group, options) => {\n var node = buildCommon.makeSpan([], [buildGroup$1(group.body, options.withPhantom())]);\n node.height = 0;\n node.depth = 0;\n\n if (node.children) {\n for (var i = 0; i < node.children.length; i++) {\n node.children[i].height = 0;\n node.children[i].depth = 0;\n }\n } // See smash for comment re: use of makeVList\n\n\n node = buildCommon.makeVList({\n positionType: \"firstBaseline\",\n children: [{\n type: \"elem\",\n elem: node\n }]\n }, options); // For spacing, TeX treats \\smash as a math group (same spacing as ord).\n\n return buildCommon.makeSpan([\"mord\"], [node], options);\n },\n mathmlBuilder: (group, options) => {\n var inner = buildExpression(ordargument(group.body), options);\n var phantom = new mathMLTree.MathNode(\"mphantom\", inner);\n var node = new mathMLTree.MathNode(\"mpadded\", [phantom]);\n node.setAttribute(\"height\", \"0px\");\n node.setAttribute(\"depth\", \"0px\");\n return node;\n }\n});\ndefineFunction({\n type: \"vphantom\",\n names: [\"\\\\vphantom\"],\n props: {\n numArgs: 1,\n allowedInText: true\n },\n handler: (_ref3, args) => {\n var {\n parser\n } = _ref3;\n var body = args[0];\n return {\n type: \"vphantom\",\n mode: parser.mode,\n body\n };\n },\n htmlBuilder: (group, options) => {\n var inner = buildCommon.makeSpan([\"inner\"], [buildGroup$1(group.body, options.withPhantom())]);\n var fix = buildCommon.makeSpan([\"fix\"], []);\n return buildCommon.makeSpan([\"mord\", \"rlap\"], [inner, fix], options);\n },\n mathmlBuilder: (group, options) => {\n var inner = buildExpression(ordargument(group.body), options);\n var phantom = new mathMLTree.MathNode(\"mphantom\", inner);\n var node = new mathMLTree.MathNode(\"mpadded\", [phantom]);\n node.setAttribute(\"width\", \"0px\");\n return node;\n }\n});\n\ndefineFunction({\n type: \"raisebox\",\n names: [\"\\\\raisebox\"],\n props: {\n numArgs: 2,\n argTypes: [\"size\", \"hbox\"],\n allowedInText: true\n },\n\n handler(_ref, args) {\n var {\n parser\n } = _ref;\n var amount = assertNodeType(args[0], \"size\").value;\n var body = args[1];\n return {\n type: \"raisebox\",\n mode: parser.mode,\n dy: amount,\n body\n };\n },\n\n htmlBuilder(group, options) {\n var body = buildGroup$1(group.body, options);\n var dy = calculateSize(group.dy, options);\n return buildCommon.makeVList({\n positionType: \"shift\",\n positionData: -dy,\n children: [{\n type: \"elem\",\n elem: body\n }]\n }, options);\n },\n\n mathmlBuilder(group, options) {\n var node = new mathMLTree.MathNode(\"mpadded\", [buildGroup(group.body, options)]);\n var dy = group.dy.number + group.dy.unit;\n node.setAttribute(\"voffset\", dy);\n return node;\n }\n\n});\n\ndefineFunction({\n type: \"internal\",\n names: [\"\\\\relax\"],\n props: {\n numArgs: 0,\n allowedInText: true\n },\n\n handler(_ref) {\n var {\n parser\n } = _ref;\n return {\n type: \"internal\",\n mode: parser.mode\n };\n }\n\n});\n\ndefineFunction({\n type: \"rule\",\n names: [\"\\\\rule\"],\n props: {\n numArgs: 2,\n numOptionalArgs: 1,\n allowedInText: true,\n allowedInMath: true,\n argTypes: [\"size\", \"size\", \"size\"]\n },\n\n handler(_ref, args, optArgs) {\n var {\n parser\n } = _ref;\n var shift = optArgs[0];\n var width = assertNodeType(args[0], \"size\");\n var height = assertNodeType(args[1], \"size\");\n return {\n type: \"rule\",\n mode: parser.mode,\n shift: shift && assertNodeType(shift, \"size\").value,\n width: width.value,\n height: height.value\n };\n },\n\n htmlBuilder(group, options) {\n // Make an empty span for the rule\n var rule = buildCommon.makeSpan([\"mord\", \"rule\"], [], options); // Calculate the shift, width, and height of the rule, and account for units\n\n var width = calculateSize(group.width, options);\n var height = calculateSize(group.height, options);\n var shift = group.shift ? calculateSize(group.shift, options) : 0; // Style the rule to the right size\n\n rule.style.borderRightWidth = makeEm(width);\n rule.style.borderTopWidth = makeEm(height);\n rule.style.bottom = makeEm(shift); // Record the height and width\n\n rule.width = width;\n rule.height = height + shift;\n rule.depth = -shift; // Font size is the number large enough that the browser will\n // reserve at least `absHeight` space above the baseline.\n // The 1.125 factor was empirically determined\n\n rule.maxFontSize = height * 1.125 * options.sizeMultiplier;\n return rule;\n },\n\n mathmlBuilder(group, options) {\n var width = calculateSize(group.width, options);\n var height = calculateSize(group.height, options);\n var shift = group.shift ? calculateSize(group.shift, options) : 0;\n var color = options.color && options.getColor() || \"black\";\n var rule = new mathMLTree.MathNode(\"mspace\");\n rule.setAttribute(\"mathbackground\", color);\n rule.setAttribute(\"width\", makeEm(width));\n rule.setAttribute(\"height\", makeEm(height));\n var wrapper = new mathMLTree.MathNode(\"mpadded\", [rule]);\n\n if (shift >= 0) {\n wrapper.setAttribute(\"height\", makeEm(shift));\n } else {\n wrapper.setAttribute(\"height\", makeEm(shift));\n wrapper.setAttribute(\"depth\", makeEm(-shift));\n }\n\n wrapper.setAttribute(\"voffset\", makeEm(shift));\n return wrapper;\n }\n\n});\n\nfunction sizingGroup(value, options, baseOptions) {\n var inner = buildExpression$1(value, options, false);\n var multiplier = options.sizeMultiplier / baseOptions.sizeMultiplier; // Add size-resetting classes to the inner list and set maxFontSize\n // manually. Handle nested size changes.\n\n for (var i = 0; i < inner.length; i++) {\n var pos = inner[i].classes.indexOf(\"sizing\");\n\n if (pos < 0) {\n Array.prototype.push.apply(inner[i].classes, options.sizingClasses(baseOptions));\n } else if (inner[i].classes[pos + 1] === \"reset-size\" + options.size) {\n // This is a nested size change: e.g., inner[i] is the \"b\" in\n // `\\Huge a \\small b`. Override the old size (the `reset-` class)\n // but not the new size.\n inner[i].classes[pos + 1] = \"reset-size\" + baseOptions.size;\n }\n\n inner[i].height *= multiplier;\n inner[i].depth *= multiplier;\n }\n\n return buildCommon.makeFragment(inner);\n}\nvar sizeFuncs = [\"\\\\tiny\", \"\\\\sixptsize\", \"\\\\scriptsize\", \"\\\\footnotesize\", \"\\\\small\", \"\\\\normalsize\", \"\\\\large\", \"\\\\Large\", \"\\\\LARGE\", \"\\\\huge\", \"\\\\Huge\"];\nvar htmlBuilder = (group, options) => {\n // Handle sizing operators like \\Huge. Real TeX doesn't actually allow\n // these functions inside of math expressions, so we do some special\n // handling.\n var newOptions = options.havingSize(group.size);\n return sizingGroup(group.body, newOptions, options);\n};\ndefineFunction({\n type: \"sizing\",\n names: sizeFuncs,\n props: {\n numArgs: 0,\n allowedInText: true\n },\n handler: (_ref, args) => {\n var {\n breakOnTokenText,\n funcName,\n parser\n } = _ref;\n var body = parser.parseExpression(false, breakOnTokenText);\n return {\n type: \"sizing\",\n mode: parser.mode,\n // Figure out what size to use based on the list of functions above\n size: sizeFuncs.indexOf(funcName) + 1,\n body\n };\n },\n htmlBuilder,\n mathmlBuilder: (group, options) => {\n var newOptions = options.havingSize(group.size);\n var inner = buildExpression(group.body, newOptions);\n var node = new mathMLTree.MathNode(\"mstyle\", inner); // TODO(emily): This doesn't produce the correct size for nested size\n // changes, because we don't keep state of what style we're currently\n // in, so we can't reset the size to normal before changing it. Now\n // that we're passing an options parameter we should be able to fix\n // this.\n\n node.setAttribute(\"mathsize\", makeEm(newOptions.sizeMultiplier));\n return node;\n }\n});\n\n// smash, with optional [tb], as in AMS\ndefineFunction({\n type: \"smash\",\n names: [\"\\\\smash\"],\n props: {\n numArgs: 1,\n numOptionalArgs: 1,\n allowedInText: true\n },\n handler: (_ref, args, optArgs) => {\n var {\n parser\n } = _ref;\n var smashHeight = false;\n var smashDepth = false;\n var tbArg = optArgs[0] && assertNodeType(optArgs[0], \"ordgroup\");\n\n if (tbArg) {\n // Optional [tb] argument is engaged.\n // ref: amsmath: \\renewcommand{\\smash}[1][tb]{%\n // def\\mb@t{\\ht}\\def\\mb@b{\\dp}\\def\\mb@tb{\\ht\\z@\\z@\\dp}%\n var letter = \"\";\n\n for (var i = 0; i < tbArg.body.length; ++i) {\n var node = tbArg.body[i]; // $FlowFixMe: Not every node type has a `text` property.\n\n letter = node.text;\n\n if (letter === \"t\") {\n smashHeight = true;\n } else if (letter === \"b\") {\n smashDepth = true;\n } else {\n smashHeight = false;\n smashDepth = false;\n break;\n }\n }\n } else {\n smashHeight = true;\n smashDepth = true;\n }\n\n var body = args[0];\n return {\n type: \"smash\",\n mode: parser.mode,\n body,\n smashHeight,\n smashDepth\n };\n },\n htmlBuilder: (group, options) => {\n var node = buildCommon.makeSpan([], [buildGroup$1(group.body, options)]);\n\n if (!group.smashHeight && !group.smashDepth) {\n return node;\n }\n\n if (group.smashHeight) {\n node.height = 0; // In order to influence makeVList, we have to reset the children.\n\n if (node.children) {\n for (var i = 0; i < node.children.length; i++) {\n node.children[i].height = 0;\n }\n }\n }\n\n if (group.smashDepth) {\n node.depth = 0;\n\n if (node.children) {\n for (var _i = 0; _i < node.children.length; _i++) {\n node.children[_i].depth = 0;\n }\n }\n } // At this point, we've reset the TeX-like height and depth values.\n // But the span still has an HTML line height.\n // makeVList applies \"display: table-cell\", which prevents the browser\n // from acting on that line height. So we'll call makeVList now.\n\n\n var smashedNode = buildCommon.makeVList({\n positionType: \"firstBaseline\",\n children: [{\n type: \"elem\",\n elem: node\n }]\n }, options); // For spacing, TeX treats \\hphantom as a math group (same spacing as ord).\n\n return buildCommon.makeSpan([\"mord\"], [smashedNode], options);\n },\n mathmlBuilder: (group, options) => {\n var node = new mathMLTree.MathNode(\"mpadded\", [buildGroup(group.body, options)]);\n\n if (group.smashHeight) {\n node.setAttribute(\"height\", \"0px\");\n }\n\n if (group.smashDepth) {\n node.setAttribute(\"depth\", \"0px\");\n }\n\n return node;\n }\n});\n\ndefineFunction({\n type: \"sqrt\",\n names: [\"\\\\sqrt\"],\n props: {\n numArgs: 1,\n numOptionalArgs: 1\n },\n\n handler(_ref, args, optArgs) {\n var {\n parser\n } = _ref;\n var index = optArgs[0];\n var body = args[0];\n return {\n type: \"sqrt\",\n mode: parser.mode,\n body,\n index\n };\n },\n\n htmlBuilder(group, options) {\n // Square roots are handled in the TeXbook pg. 443, Rule 11.\n // First, we do the same steps as in overline to build the inner group\n // and line\n var inner = buildGroup$1(group.body, options.havingCrampedStyle());\n\n if (inner.height === 0) {\n // Render a small surd.\n inner.height = options.fontMetrics().xHeight;\n } // Some groups can return document fragments. Handle those by wrapping\n // them in a span.\n\n\n inner = buildCommon.wrapFragment(inner, options); // Calculate the minimum size for the \\surd delimiter\n\n var metrics = options.fontMetrics();\n var theta = metrics.defaultRuleThickness;\n var phi = theta;\n\n if (options.style.id < Style$1.TEXT.id) {\n phi = options.fontMetrics().xHeight;\n } // Calculate the clearance between the body and line\n\n\n var lineClearance = theta + phi / 4;\n var minDelimiterHeight = inner.height + inner.depth + lineClearance + theta; // Create a sqrt SVG of the required minimum size\n\n var {\n span: img,\n ruleWidth,\n advanceWidth\n } = delimiter.sqrtImage(minDelimiterHeight, options);\n var delimDepth = img.height - ruleWidth; // Adjust the clearance based on the delimiter size\n\n if (delimDepth > inner.height + inner.depth + lineClearance) {\n lineClearance = (lineClearance + delimDepth - inner.height - inner.depth) / 2;\n } // Shift the sqrt image\n\n\n var imgShift = img.height - inner.height - lineClearance - ruleWidth;\n inner.style.paddingLeft = makeEm(advanceWidth); // Overlay the image and the argument.\n\n var body = buildCommon.makeVList({\n positionType: \"firstBaseline\",\n children: [{\n type: \"elem\",\n elem: inner,\n wrapperClasses: [\"svg-align\"]\n }, {\n type: \"kern\",\n size: -(inner.height + imgShift)\n }, {\n type: \"elem\",\n elem: img\n }, {\n type: \"kern\",\n size: ruleWidth\n }]\n }, options);\n\n if (!group.index) {\n return buildCommon.makeSpan([\"mord\", \"sqrt\"], [body], options);\n } else {\n // Handle the optional root index\n // The index is always in scriptscript style\n var newOptions = options.havingStyle(Style$1.SCRIPTSCRIPT);\n var rootm = buildGroup$1(group.index, newOptions, options); // The amount the index is shifted by. This is taken from the TeX\n // source, in the definition of `\\r@@t`.\n\n var toShift = 0.6 * (body.height - body.depth); // Build a VList with the superscript shifted up correctly\n\n var rootVList = buildCommon.makeVList({\n positionType: \"shift\",\n positionData: -toShift,\n children: [{\n type: \"elem\",\n elem: rootm\n }]\n }, options); // Add a class surrounding it so we can add on the appropriate\n // kerning\n\n var rootVListWrap = buildCommon.makeSpan([\"root\"], [rootVList]);\n return buildCommon.makeSpan([\"mord\", \"sqrt\"], [rootVListWrap, body], options);\n }\n },\n\n mathmlBuilder(group, options) {\n var {\n body,\n index\n } = group;\n return index ? new mathMLTree.MathNode(\"mroot\", [buildGroup(body, options), buildGroup(index, options)]) : new mathMLTree.MathNode(\"msqrt\", [buildGroup(body, options)]);\n }\n\n});\n\nvar styleMap = {\n \"display\": Style$1.DISPLAY,\n \"text\": Style$1.TEXT,\n \"script\": Style$1.SCRIPT,\n \"scriptscript\": Style$1.SCRIPTSCRIPT\n};\ndefineFunction({\n type: \"styling\",\n names: [\"\\\\displaystyle\", \"\\\\textstyle\", \"\\\\scriptstyle\", \"\\\\scriptscriptstyle\"],\n props: {\n numArgs: 0,\n allowedInText: true,\n primitive: true\n },\n\n handler(_ref, args) {\n var {\n breakOnTokenText,\n funcName,\n parser\n } = _ref;\n // parse out the implicit body\n var body = parser.parseExpression(true, breakOnTokenText); // TODO: Refactor to avoid duplicating styleMap in multiple places (e.g.\n // here and in buildHTML and de-dupe the enumeration of all the styles).\n // $FlowFixMe: The names above exactly match the styles.\n\n var style = funcName.slice(1, funcName.length - 5);\n return {\n type: \"styling\",\n mode: parser.mode,\n // Figure out what style to use by pulling out the style from\n // the function name\n style,\n body\n };\n },\n\n htmlBuilder(group, options) {\n // Style changes are handled in the TeXbook on pg. 442, Rule 3.\n var newStyle = styleMap[group.style];\n var newOptions = options.havingStyle(newStyle).withFont('');\n return sizingGroup(group.body, newOptions, options);\n },\n\n mathmlBuilder(group, options) {\n // Figure out what style we're changing to.\n var newStyle = styleMap[group.style];\n var newOptions = options.havingStyle(newStyle);\n var inner = buildExpression(group.body, newOptions);\n var node = new mathMLTree.MathNode(\"mstyle\", inner);\n var styleAttributes = {\n \"display\": [\"0\", \"true\"],\n \"text\": [\"0\", \"false\"],\n \"script\": [\"1\", \"false\"],\n \"scriptscript\": [\"2\", \"false\"]\n };\n var attr = styleAttributes[group.style];\n node.setAttribute(\"scriptlevel\", attr[0]);\n node.setAttribute(\"displaystyle\", attr[1]);\n return node;\n }\n\n});\n\n/**\n * Sometimes, groups perform special rules when they have superscripts or\n * subscripts attached to them. This function lets the `supsub` group know that\n * Sometimes, groups perform special rules when they have superscripts or\n * its inner element should handle the superscripts and subscripts instead of\n * handling them itself.\n */\nvar htmlBuilderDelegate = function htmlBuilderDelegate(group, options) {\n var base = group.base;\n\n if (!base) {\n return null;\n } else if (base.type === \"op\") {\n // Operators handle supsubs differently when they have limits\n // (e.g. `\\displaystyle\\sum_2^3`)\n var delegate = base.limits && (options.style.size === Style$1.DISPLAY.size || base.alwaysHandleSupSub);\n return delegate ? htmlBuilder$2 : null;\n } else if (base.type === \"operatorname\") {\n var _delegate = base.alwaysHandleSupSub && (options.style.size === Style$1.DISPLAY.size || base.limits);\n\n return _delegate ? htmlBuilder$1 : null;\n } else if (base.type === \"accent\") {\n return utils.isCharacterBox(base.base) ? htmlBuilder$a : null;\n } else if (base.type === \"horizBrace\") {\n var isSup = !group.sub;\n return isSup === base.isOver ? htmlBuilder$3 : null;\n } else {\n return null;\n }\n}; // Super scripts and subscripts, whose precise placement can depend on other\n// functions that precede them.\n\n\ndefineFunctionBuilders({\n type: \"supsub\",\n\n htmlBuilder(group, options) {\n // Superscript and subscripts are handled in the TeXbook on page\n // 445-446, rules 18(a-f).\n // Here is where we defer to the inner group if it should handle\n // superscripts and subscripts itself.\n var builderDelegate = htmlBuilderDelegate(group, options);\n\n if (builderDelegate) {\n return builderDelegate(group, options);\n }\n\n var {\n base: valueBase,\n sup: valueSup,\n sub: valueSub\n } = group;\n var base = buildGroup$1(valueBase, options);\n var supm;\n var subm;\n var metrics = options.fontMetrics(); // Rule 18a\n\n var supShift = 0;\n var subShift = 0;\n var isCharacterBox = valueBase && utils.isCharacterBox(valueBase);\n\n if (valueSup) {\n var newOptions = options.havingStyle(options.style.sup());\n supm = buildGroup$1(valueSup, newOptions, options);\n\n if (!isCharacterBox) {\n supShift = base.height - newOptions.fontMetrics().supDrop * newOptions.sizeMultiplier / options.sizeMultiplier;\n }\n }\n\n if (valueSub) {\n var _newOptions = options.havingStyle(options.style.sub());\n\n subm = buildGroup$1(valueSub, _newOptions, options);\n\n if (!isCharacterBox) {\n subShift = base.depth + _newOptions.fontMetrics().subDrop * _newOptions.sizeMultiplier / options.sizeMultiplier;\n }\n } // Rule 18c\n\n\n var minSupShift;\n\n if (options.style === Style$1.DISPLAY) {\n minSupShift = metrics.sup1;\n } else if (options.style.cramped) {\n minSupShift = metrics.sup3;\n } else {\n minSupShift = metrics.sup2;\n } // scriptspace is a font-size-independent size, so scale it\n // appropriately for use as the marginRight.\n\n\n var multiplier = options.sizeMultiplier;\n var marginRight = makeEm(0.5 / metrics.ptPerEm / multiplier);\n var marginLeft = null;\n\n if (subm) {\n // Subscripts shouldn't be shifted by the base's italic correction.\n // Account for that by shifting the subscript back the appropriate\n // amount. Note we only do this when the base is a single symbol.\n var isOiint = group.base && group.base.type === \"op\" && group.base.name && (group.base.name === \"\\\\oiint\" || group.base.name === \"\\\\oiiint\");\n\n if (base instanceof SymbolNode || isOiint) {\n // $FlowFixMe\n marginLeft = makeEm(-base.italic);\n }\n }\n\n var supsub;\n\n if (supm && subm) {\n supShift = Math.max(supShift, minSupShift, supm.depth + 0.25 * metrics.xHeight);\n subShift = Math.max(subShift, metrics.sub2);\n var ruleWidth = metrics.defaultRuleThickness; // Rule 18e\n\n var maxWidth = 4 * ruleWidth;\n\n if (supShift - supm.depth - (subm.height - subShift) < maxWidth) {\n subShift = maxWidth - (supShift - supm.depth) + subm.height;\n var psi = 0.8 * metrics.xHeight - (supShift - supm.depth);\n\n if (psi > 0) {\n supShift += psi;\n subShift -= psi;\n }\n }\n\n var vlistElem = [{\n type: \"elem\",\n elem: subm,\n shift: subShift,\n marginRight,\n marginLeft\n }, {\n type: \"elem\",\n elem: supm,\n shift: -supShift,\n marginRight\n }];\n supsub = buildCommon.makeVList({\n positionType: \"individualShift\",\n children: vlistElem\n }, options);\n } else if (subm) {\n // Rule 18b\n subShift = Math.max(subShift, metrics.sub1, subm.height - 0.8 * metrics.xHeight);\n var _vlistElem = [{\n type: \"elem\",\n elem: subm,\n marginLeft,\n marginRight\n }];\n supsub = buildCommon.makeVList({\n positionType: \"shift\",\n positionData: subShift,\n children: _vlistElem\n }, options);\n } else if (supm) {\n // Rule 18c, d\n supShift = Math.max(supShift, minSupShift, supm.depth + 0.25 * metrics.xHeight);\n supsub = buildCommon.makeVList({\n positionType: \"shift\",\n positionData: -supShift,\n children: [{\n type: \"elem\",\n elem: supm,\n marginRight\n }]\n }, options);\n } else {\n throw new Error(\"supsub must have either sup or sub.\");\n } // Wrap the supsub vlist in a span.msupsub to reset text-align.\n\n\n var mclass = getTypeOfDomTree(base, \"right\") || \"mord\";\n return buildCommon.makeSpan([mclass], [base, buildCommon.makeSpan([\"msupsub\"], [supsub])], options);\n },\n\n mathmlBuilder(group, options) {\n // Is the inner group a relevant horizonal brace?\n var isBrace = false;\n var isOver;\n var isSup;\n\n if (group.base && group.base.type === \"horizBrace\") {\n isSup = !!group.sup;\n\n if (isSup === group.base.isOver) {\n isBrace = true;\n isOver = group.base.isOver;\n }\n }\n\n if (group.base && (group.base.type === \"op\" || group.base.type === \"operatorname\")) {\n group.base.parentIsSupSub = true;\n }\n\n var children = [buildGroup(group.base, options)];\n\n if (group.sub) {\n children.push(buildGroup(group.sub, options));\n }\n\n if (group.sup) {\n children.push(buildGroup(group.sup, options));\n }\n\n var nodeType;\n\n if (isBrace) {\n nodeType = isOver ? \"mover\" : \"munder\";\n } else if (!group.sub) {\n var base = group.base;\n\n if (base && base.type === \"op\" && base.limits && (options.style === Style$1.DISPLAY || base.alwaysHandleSupSub)) {\n nodeType = \"mover\";\n } else if (base && base.type === \"operatorname\" && base.alwaysHandleSupSub && (base.limits || options.style === Style$1.DISPLAY)) {\n nodeType = \"mover\";\n } else {\n nodeType = \"msup\";\n }\n } else if (!group.sup) {\n var _base = group.base;\n\n if (_base && _base.type === \"op\" && _base.limits && (options.style === Style$1.DISPLAY || _base.alwaysHandleSupSub)) {\n nodeType = \"munder\";\n } else if (_base && _base.type === \"operatorname\" && _base.alwaysHandleSupSub && (_base.limits || options.style === Style$1.DISPLAY)) {\n nodeType = \"munder\";\n } else {\n nodeType = \"msub\";\n }\n } else {\n var _base2 = group.base;\n\n if (_base2 && _base2.type === \"op\" && _base2.limits && options.style === Style$1.DISPLAY) {\n nodeType = \"munderover\";\n } else if (_base2 && _base2.type === \"operatorname\" && _base2.alwaysHandleSupSub && (options.style === Style$1.DISPLAY || _base2.limits)) {\n nodeType = \"munderover\";\n } else {\n nodeType = \"msubsup\";\n }\n }\n\n return new mathMLTree.MathNode(nodeType, children);\n }\n\n});\n\ndefineFunctionBuilders({\n type: \"atom\",\n\n htmlBuilder(group, options) {\n return buildCommon.mathsym(group.text, group.mode, options, [\"m\" + group.family]);\n },\n\n mathmlBuilder(group, options) {\n var node = new mathMLTree.MathNode(\"mo\", [makeText(group.text, group.mode)]);\n\n if (group.family === \"bin\") {\n var variant = getVariant(group, options);\n\n if (variant === \"bold-italic\") {\n node.setAttribute(\"mathvariant\", variant);\n }\n } else if (group.family === \"punct\") {\n node.setAttribute(\"separator\", \"true\");\n } else if (group.family === \"open\" || group.family === \"close\") {\n // Delims built here should not stretch vertically.\n // See delimsizing.js for stretchy delims.\n node.setAttribute(\"stretchy\", \"false\");\n }\n\n return node;\n }\n\n});\n\n// \"mathord\" and \"textord\" ParseNodes created in Parser.js from symbol Groups in\n// src/symbols.js.\nvar defaultVariant = {\n \"mi\": \"italic\",\n \"mn\": \"normal\",\n \"mtext\": \"normal\"\n};\ndefineFunctionBuilders({\n type: \"mathord\",\n\n htmlBuilder(group, options) {\n return buildCommon.makeOrd(group, options, \"mathord\");\n },\n\n mathmlBuilder(group, options) {\n var node = new mathMLTree.MathNode(\"mi\", [makeText(group.text, group.mode, options)]);\n var variant = getVariant(group, options) || \"italic\";\n\n if (variant !== defaultVariant[node.type]) {\n node.setAttribute(\"mathvariant\", variant);\n }\n\n return node;\n }\n\n});\ndefineFunctionBuilders({\n type: \"textord\",\n\n htmlBuilder(group, options) {\n return buildCommon.makeOrd(group, options, \"textord\");\n },\n\n mathmlBuilder(group, options) {\n var text = makeText(group.text, group.mode, options);\n var variant = getVariant(group, options) || \"normal\";\n var node;\n\n if (group.mode === 'text') {\n node = new mathMLTree.MathNode(\"mtext\", [text]);\n } else if (/[0-9]/.test(group.text)) {\n node = new mathMLTree.MathNode(\"mn\", [text]);\n } else if (group.text === \"\\\\prime\") {\n node = new mathMLTree.MathNode(\"mo\", [text]);\n } else {\n node = new mathMLTree.MathNode(\"mi\", [text]);\n }\n\n if (variant !== defaultVariant[node.type]) {\n node.setAttribute(\"mathvariant\", variant);\n }\n\n return node;\n }\n\n});\n\nvar cssSpace = {\n \"\\\\nobreak\": \"nobreak\",\n \"\\\\allowbreak\": \"allowbreak\"\n}; // A lookup table to determine whether a spacing function/symbol should be\n// treated like a regular space character. If a symbol or command is a key\n// in this table, then it should be a regular space character. Furthermore,\n// the associated value may have a `className` specifying an extra CSS class\n// to add to the created `span`.\n\nvar regularSpace = {\n \" \": {},\n \"\\\\ \": {},\n \"~\": {\n className: \"nobreak\"\n },\n \"\\\\space\": {},\n \"\\\\nobreakspace\": {\n className: \"nobreak\"\n }\n}; // ParseNode<\"spacing\"> created in Parser.js from the \"spacing\" symbol Groups in\n// src/symbols.js.\n\ndefineFunctionBuilders({\n type: \"spacing\",\n\n htmlBuilder(group, options) {\n if (regularSpace.hasOwnProperty(group.text)) {\n var className = regularSpace[group.text].className || \"\"; // Spaces are generated by adding an actual space. Each of these\n // things has an entry in the symbols table, so these will be turned\n // into appropriate outputs.\n\n if (group.mode === \"text\") {\n var ord = buildCommon.makeOrd(group, options, \"textord\");\n ord.classes.push(className);\n return ord;\n } else {\n return buildCommon.makeSpan([\"mspace\", className], [buildCommon.mathsym(group.text, group.mode, options)], options);\n }\n } else if (cssSpace.hasOwnProperty(group.text)) {\n // Spaces based on just a CSS class.\n return buildCommon.makeSpan([\"mspace\", cssSpace[group.text]], [], options);\n } else {\n throw new ParseError(\"Unknown type of space \\\"\" + group.text + \"\\\"\");\n }\n },\n\n mathmlBuilder(group, options) {\n var node;\n\n if (regularSpace.hasOwnProperty(group.text)) {\n node = new mathMLTree.MathNode(\"mtext\", [new mathMLTree.TextNode(\"\\u00a0\")]);\n } else if (cssSpace.hasOwnProperty(group.text)) {\n // CSS-based MathML spaces (\\nobreak, \\allowbreak) are ignored\n return new mathMLTree.MathNode(\"mspace\");\n } else {\n throw new ParseError(\"Unknown type of space \\\"\" + group.text + \"\\\"\");\n }\n\n return node;\n }\n\n});\n\nvar pad = () => {\n var padNode = new mathMLTree.MathNode(\"mtd\", []);\n padNode.setAttribute(\"width\", \"50%\");\n return padNode;\n};\n\ndefineFunctionBuilders({\n type: \"tag\",\n\n mathmlBuilder(group, options) {\n var table = new mathMLTree.MathNode(\"mtable\", [new mathMLTree.MathNode(\"mtr\", [pad(), new mathMLTree.MathNode(\"mtd\", [buildExpressionRow(group.body, options)]), pad(), new mathMLTree.MathNode(\"mtd\", [buildExpressionRow(group.tag, options)])])]);\n table.setAttribute(\"width\", \"100%\");\n return table; // TODO: Left-aligned tags.\n // Currently, the group and options passed here do not contain\n // enough info to set tag alignment. `leqno` is in Settings but it is\n // not passed to Options. On the HTML side, leqno is\n // set by a CSS class applied in buildTree.js. That would have worked\n // in MathML if browsers supported . Since they don't, we\n // need to rewrite the way this function is called.\n }\n\n});\n\nvar textFontFamilies = {\n \"\\\\text\": undefined,\n \"\\\\textrm\": \"textrm\",\n \"\\\\textsf\": \"textsf\",\n \"\\\\texttt\": \"texttt\",\n \"\\\\textnormal\": \"textrm\"\n};\nvar textFontWeights = {\n \"\\\\textbf\": \"textbf\",\n \"\\\\textmd\": \"textmd\"\n};\nvar textFontShapes = {\n \"\\\\textit\": \"textit\",\n \"\\\\textup\": \"textup\"\n};\n\nvar optionsWithFont = (group, options) => {\n var font = group.font; // Checks if the argument is a font family or a font style.\n\n if (!font) {\n return options;\n } else if (textFontFamilies[font]) {\n return options.withTextFontFamily(textFontFamilies[font]);\n } else if (textFontWeights[font]) {\n return options.withTextFontWeight(textFontWeights[font]);\n } else if (font === \"\\\\emph\") {\n return options.fontShape === \"textit\" ? options.withTextFontShape(\"textup\") : options.withTextFontShape(\"textit\");\n }\n\n return options.withTextFontShape(textFontShapes[font]);\n};\n\ndefineFunction({\n type: \"text\",\n names: [// Font families\n \"\\\\text\", \"\\\\textrm\", \"\\\\textsf\", \"\\\\texttt\", \"\\\\textnormal\", // Font weights\n \"\\\\textbf\", \"\\\\textmd\", // Font Shapes\n \"\\\\textit\", \"\\\\textup\", \"\\\\emph\"],\n props: {\n numArgs: 1,\n argTypes: [\"text\"],\n allowedInArgument: true,\n allowedInText: true\n },\n\n handler(_ref, args) {\n var {\n parser,\n funcName\n } = _ref;\n var body = args[0];\n return {\n type: \"text\",\n mode: parser.mode,\n body: ordargument(body),\n font: funcName\n };\n },\n\n htmlBuilder(group, options) {\n var newOptions = optionsWithFont(group, options);\n var inner = buildExpression$1(group.body, newOptions, true);\n return buildCommon.makeSpan([\"mord\", \"text\"], inner, newOptions);\n },\n\n mathmlBuilder(group, options) {\n var newOptions = optionsWithFont(group, options);\n return buildExpressionRow(group.body, newOptions);\n }\n\n});\n\ndefineFunction({\n type: \"underline\",\n names: [\"\\\\underline\"],\n props: {\n numArgs: 1,\n allowedInText: true\n },\n\n handler(_ref, args) {\n var {\n parser\n } = _ref;\n return {\n type: \"underline\",\n mode: parser.mode,\n body: args[0]\n };\n },\n\n htmlBuilder(group, options) {\n // Underlines are handled in the TeXbook pg 443, Rule 10.\n // Build the inner group.\n var innerGroup = buildGroup$1(group.body, options); // Create the line to go below the body\n\n var line = buildCommon.makeLineSpan(\"underline-line\", options); // Generate the vlist, with the appropriate kerns\n\n var defaultRuleThickness = options.fontMetrics().defaultRuleThickness;\n var vlist = buildCommon.makeVList({\n positionType: \"top\",\n positionData: innerGroup.height,\n children: [{\n type: \"kern\",\n size: defaultRuleThickness\n }, {\n type: \"elem\",\n elem: line\n }, {\n type: \"kern\",\n size: 3 * defaultRuleThickness\n }, {\n type: \"elem\",\n elem: innerGroup\n }]\n }, options);\n return buildCommon.makeSpan([\"mord\", \"underline\"], [vlist], options);\n },\n\n mathmlBuilder(group, options) {\n var operator = new mathMLTree.MathNode(\"mo\", [new mathMLTree.TextNode(\"\\u203e\")]);\n operator.setAttribute(\"stretchy\", \"true\");\n var node = new mathMLTree.MathNode(\"munder\", [buildGroup(group.body, options), operator]);\n node.setAttribute(\"accentunder\", \"true\");\n return node;\n }\n\n});\n\ndefineFunction({\n type: \"vcenter\",\n names: [\"\\\\vcenter\"],\n props: {\n numArgs: 1,\n argTypes: [\"original\"],\n // In LaTeX, \\vcenter can act only on a box.\n allowedInText: false\n },\n\n handler(_ref, args) {\n var {\n parser\n } = _ref;\n return {\n type: \"vcenter\",\n mode: parser.mode,\n body: args[0]\n };\n },\n\n htmlBuilder(group, options) {\n var body = buildGroup$1(group.body, options);\n var axisHeight = options.fontMetrics().axisHeight;\n var dy = 0.5 * (body.height - axisHeight - (body.depth + axisHeight));\n return buildCommon.makeVList({\n positionType: \"shift\",\n positionData: dy,\n children: [{\n type: \"elem\",\n elem: body\n }]\n }, options);\n },\n\n mathmlBuilder(group, options) {\n // There is no way to do this in MathML.\n // Write a class as a breadcrumb in case some post-processor wants\n // to perform a vcenter adjustment.\n return new mathMLTree.MathNode(\"mpadded\", [buildGroup(group.body, options)], [\"vcenter\"]);\n }\n\n});\n\ndefineFunction({\n type: \"verb\",\n names: [\"\\\\verb\"],\n props: {\n numArgs: 0,\n allowedInText: true\n },\n\n handler(context, args, optArgs) {\n // \\verb and \\verb* are dealt with directly in Parser.js.\n // If we end up here, it's because of a failure to match the two delimiters\n // in the regex in Lexer.js. LaTeX raises the following error when \\verb is\n // terminated by end of line (or file).\n throw new ParseError(\"\\\\verb ended by end of line instead of matching delimiter\");\n },\n\n htmlBuilder(group, options) {\n var text = makeVerb(group);\n var body = []; // \\verb enters text mode and therefore is sized like \\textstyle\n\n var newOptions = options.havingStyle(options.style.text());\n\n for (var i = 0; i < text.length; i++) {\n var c = text[i];\n\n if (c === '~') {\n c = '\\\\textasciitilde';\n }\n\n body.push(buildCommon.makeSymbol(c, \"Typewriter-Regular\", group.mode, newOptions, [\"mord\", \"texttt\"]));\n }\n\n return buildCommon.makeSpan([\"mord\", \"text\"].concat(newOptions.sizingClasses(options)), buildCommon.tryCombineChars(body), newOptions);\n },\n\n mathmlBuilder(group, options) {\n var text = new mathMLTree.TextNode(makeVerb(group));\n var node = new mathMLTree.MathNode(\"mtext\", [text]);\n node.setAttribute(\"mathvariant\", \"monospace\");\n return node;\n }\n\n});\n/**\n * Converts verb group into body string.\n *\n * \\verb* replaces each space with an open box \\u2423\n * \\verb replaces each space with a no-break space \\xA0\n */\n\nvar makeVerb = group => group.body.replace(/ /g, group.star ? '\\u2423' : '\\xA0');\n\n/** Include this to ensure that all functions are defined. */\nvar functions = _functions;\n\n/**\n * The Lexer class handles tokenizing the input in various ways. Since our\n * parser expects us to be able to backtrack, the lexer allows lexing from any\n * given starting point.\n *\n * Its main exposed function is the `lex` function, which takes a position to\n * lex from and a type of token to lex. It defers to the appropriate `_innerLex`\n * function.\n *\n * The various `_innerLex` functions perform the actual lexing of different\n * kinds.\n */\n\n/* The following tokenRegex\n * - matches typical whitespace (but not NBSP etc.) using its first group\n * - does not match any control character \\x00-\\x1f except whitespace\n * - does not match a bare backslash\n * - matches any ASCII character except those just mentioned\n * - does not match the BMP private use area \\uE000-\\uF8FF\n * - does not match bare surrogate code units\n * - matches any BMP character except for those just described\n * - matches any valid Unicode surrogate pair\n * - matches a backslash followed by one or more whitespace characters\n * - matches a backslash followed by one or more letters then whitespace\n * - matches a backslash followed by any BMP character\n * Capturing groups:\n * [1] regular whitespace\n * [2] backslash followed by whitespace\n * [3] anything else, which may include:\n * [4] left character of \\verb*\n * [5] left character of \\verb\n * [6] backslash followed by word, excluding any trailing whitespace\n * Just because the Lexer matches something doesn't mean it's valid input:\n * If there is no matching function or symbol definition, the Parser will\n * still reject the input.\n */\nvar spaceRegexString = \"[ \\r\\n\\t]\";\nvar controlWordRegexString = \"\\\\\\\\[a-zA-Z@]+\";\nvar controlSymbolRegexString = \"\\\\\\\\[^\\uD800-\\uDFFF]\";\nvar controlWordWhitespaceRegexString = \"(\" + controlWordRegexString + \")\" + spaceRegexString + \"*\";\nvar controlSpaceRegexString = \"\\\\\\\\(\\n|[ \\r\\t]+\\n?)[ \\r\\t]*\";\nvar combiningDiacriticalMarkString = \"[\\u0300-\\u036f]\";\nvar combiningDiacriticalMarksEndRegex = new RegExp(combiningDiacriticalMarkString + \"+$\");\nvar tokenRegexString = \"(\" + spaceRegexString + \"+)|\" + ( // whitespace\ncontrolSpaceRegexString + \"|\") + // \\whitespace\n\"([!-\\\\[\\\\]-\\u2027\\u202A-\\uD7FF\\uF900-\\uFFFF]\" + ( // single codepoint\ncombiningDiacriticalMarkString + \"*\") + // ...plus accents\n\"|[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]\" + ( // surrogate pair\ncombiningDiacriticalMarkString + \"*\") + // ...plus accents\n\"|\\\\\\\\verb\\\\*([^]).*?\\\\4\" + // \\verb*\n\"|\\\\\\\\verb([^*a-zA-Z]).*?\\\\5\" + ( // \\verb unstarred\n\"|\" + controlWordWhitespaceRegexString) + ( // \\macroName + spaces\n\"|\" + controlSymbolRegexString + \")\"); // \\\\, \\', etc.\n\n/** Main Lexer class */\n\nclass Lexer {\n // Category codes. The lexer only supports comment characters (14) for now.\n // MacroExpander additionally distinguishes active (13).\n constructor(input, settings) {\n this.input = void 0;\n this.settings = void 0;\n this.tokenRegex = void 0;\n this.catcodes = void 0;\n // Separate accents from characters\n this.input = input;\n this.settings = settings;\n this.tokenRegex = new RegExp(tokenRegexString, 'g');\n this.catcodes = {\n \"%\": 14,\n // comment character\n \"~\": 13 // active character\n\n };\n }\n\n setCatcode(char, code) {\n this.catcodes[char] = code;\n }\n /**\n * This function lexes a single token.\n */\n\n\n lex() {\n var input = this.input;\n var pos = this.tokenRegex.lastIndex;\n\n if (pos === input.length) {\n return new Token(\"EOF\", new SourceLocation(this, pos, pos));\n }\n\n var match = this.tokenRegex.exec(input);\n\n if (match === null || match.index !== pos) {\n throw new ParseError(\"Unexpected character: '\" + input[pos] + \"'\", new Token(input[pos], new SourceLocation(this, pos, pos + 1)));\n }\n\n var text = match[6] || match[3] || (match[2] ? \"\\\\ \" : \" \");\n\n if (this.catcodes[text] === 14) {\n // comment character\n var nlIndex = input.indexOf('\\n', this.tokenRegex.lastIndex);\n\n if (nlIndex === -1) {\n this.tokenRegex.lastIndex = input.length; // EOF\n\n this.settings.reportNonstrict(\"commentAtEnd\", \"% comment has no terminating newline; LaTeX would \" + \"fail because of commenting the end of math mode (e.g. $)\");\n } else {\n this.tokenRegex.lastIndex = nlIndex + 1;\n }\n\n return this.lex();\n }\n\n return new Token(text, new SourceLocation(this, pos, this.tokenRegex.lastIndex));\n }\n\n}\n\n/**\n * A `Namespace` refers to a space of nameable things like macros or lengths,\n * which can be `set` either globally or local to a nested group, using an\n * undo stack similar to how TeX implements this functionality.\n * Performance-wise, `get` and local `set` take constant time, while global\n * `set` takes time proportional to the depth of group nesting.\n */\nclass Namespace {\n /**\n * Both arguments are optional. The first argument is an object of\n * built-in mappings which never change. The second argument is an object\n * of initial (global-level) mappings, which will constantly change\n * according to any global/top-level `set`s done.\n */\n constructor(builtins, globalMacros) {\n if (builtins === void 0) {\n builtins = {};\n }\n\n if (globalMacros === void 0) {\n globalMacros = {};\n }\n\n this.current = void 0;\n this.builtins = void 0;\n this.undefStack = void 0;\n this.current = globalMacros;\n this.builtins = builtins;\n this.undefStack = [];\n }\n /**\n * Start a new nested group, affecting future local `set`s.\n */\n\n\n beginGroup() {\n this.undefStack.push({});\n }\n /**\n * End current nested group, restoring values before the group began.\n */\n\n\n endGroup() {\n if (this.undefStack.length === 0) {\n throw new ParseError(\"Unbalanced namespace destruction: attempt \" + \"to pop global namespace; please report this as a bug\");\n }\n\n var undefs = this.undefStack.pop();\n\n for (var undef in undefs) {\n if (undefs.hasOwnProperty(undef)) {\n if (undefs[undef] == null) {\n delete this.current[undef];\n } else {\n this.current[undef] = undefs[undef];\n }\n }\n }\n }\n /**\n * Ends all currently nested groups (if any), restoring values before the\n * groups began. Useful in case of an error in the middle of parsing.\n */\n\n\n endGroups() {\n while (this.undefStack.length > 0) {\n this.endGroup();\n }\n }\n /**\n * Detect whether `name` has a definition. Equivalent to\n * `get(name) != null`.\n */\n\n\n has(name) {\n return this.current.hasOwnProperty(name) || this.builtins.hasOwnProperty(name);\n }\n /**\n * Get the current value of a name, or `undefined` if there is no value.\n *\n * Note: Do not use `if (namespace.get(...))` to detect whether a macro\n * is defined, as the definition may be the empty string which evaluates\n * to `false` in JavaScript. Use `if (namespace.get(...) != null)` or\n * `if (namespace.has(...))`.\n */\n\n\n get(name) {\n if (this.current.hasOwnProperty(name)) {\n return this.current[name];\n } else {\n return this.builtins[name];\n }\n }\n /**\n * Set the current value of a name, and optionally set it globally too.\n * Local set() sets the current value and (when appropriate) adds an undo\n * operation to the undo stack. Global set() may change the undo\n * operation at every level, so takes time linear in their number.\n * A value of undefined means to delete existing definitions.\n */\n\n\n set(name, value, global) {\n if (global === void 0) {\n global = false;\n }\n\n if (global) {\n // Global set is equivalent to setting in all groups. Simulate this\n // by destroying any undos currently scheduled for this name,\n // and adding an undo with the *new* value (in case it later gets\n // locally reset within this environment).\n for (var i = 0; i < this.undefStack.length; i++) {\n delete this.undefStack[i][name];\n }\n\n if (this.undefStack.length > 0) {\n this.undefStack[this.undefStack.length - 1][name] = value;\n }\n } else {\n // Undo this set at end of this group (possibly to `undefined`),\n // unless an undo is already in place, in which case that older\n // value is the correct one.\n var top = this.undefStack[this.undefStack.length - 1];\n\n if (top && !top.hasOwnProperty(name)) {\n top[name] = this.current[name];\n }\n }\n\n if (value == null) {\n delete this.current[name];\n } else {\n this.current[name] = value;\n }\n }\n\n}\n\n/**\n * Predefined macros for KaTeX.\n * This can be used to define some commands in terms of others.\n */\nvar macros = _macros;\n// macro tools\n\ndefineMacro(\"\\\\noexpand\", function (context) {\n // The expansion is the token itself; but that token is interpreted\n // as if its meaning were ‘\\relax’ if it is a control sequence that\n // would ordinarily be expanded by TeX’s expansion rules.\n var t = context.popToken();\n\n if (context.isExpandable(t.text)) {\n t.noexpand = true;\n t.treatAsRelax = true;\n }\n\n return {\n tokens: [t],\n numArgs: 0\n };\n});\ndefineMacro(\"\\\\expandafter\", function (context) {\n // TeX first reads the token that comes immediately after \\expandafter,\n // without expanding it; let’s call this token t. Then TeX reads the\n // token that comes after t (and possibly more tokens, if that token\n // has an argument), replacing it by its expansion. Finally TeX puts\n // t back in front of that expansion.\n var t = context.popToken();\n context.expandOnce(true); // expand only an expandable token\n\n return {\n tokens: [t],\n numArgs: 0\n };\n}); // LaTeX's \\@firstoftwo{#1}{#2} expands to #1, skipping #2\n// TeX source: \\long\\def\\@firstoftwo#1#2{#1}\n\ndefineMacro(\"\\\\@firstoftwo\", function (context) {\n var args = context.consumeArgs(2);\n return {\n tokens: args[0],\n numArgs: 0\n };\n}); // LaTeX's \\@secondoftwo{#1}{#2} expands to #2, skipping #1\n// TeX source: \\long\\def\\@secondoftwo#1#2{#2}\n\ndefineMacro(\"\\\\@secondoftwo\", function (context) {\n var args = context.consumeArgs(2);\n return {\n tokens: args[1],\n numArgs: 0\n };\n}); // LaTeX's \\@ifnextchar{#1}{#2}{#3} looks ahead to the next (unexpanded)\n// symbol that isn't a space, consuming any spaces but not consuming the\n// first nonspace character. If that nonspace character matches #1, then\n// the macro expands to #2; otherwise, it expands to #3.\n\ndefineMacro(\"\\\\@ifnextchar\", function (context) {\n var args = context.consumeArgs(3); // symbol, if, else\n\n context.consumeSpaces();\n var nextToken = context.future();\n\n if (args[0].length === 1 && args[0][0].text === nextToken.text) {\n return {\n tokens: args[1],\n numArgs: 0\n };\n } else {\n return {\n tokens: args[2],\n numArgs: 0\n };\n }\n}); // LaTeX's \\@ifstar{#1}{#2} looks ahead to the next (unexpanded) symbol.\n// If it is `*`, then it consumes the symbol, and the macro expands to #1;\n// otherwise, the macro expands to #2 (without consuming the symbol).\n// TeX source: \\def\\@ifstar#1{\\@ifnextchar *{\\@firstoftwo{#1}}}\n\ndefineMacro(\"\\\\@ifstar\", \"\\\\@ifnextchar *{\\\\@firstoftwo{#1}}\"); // LaTeX's \\TextOrMath{#1}{#2} expands to #1 in text mode, #2 in math mode\n\ndefineMacro(\"\\\\TextOrMath\", function (context) {\n var args = context.consumeArgs(2);\n\n if (context.mode === 'text') {\n return {\n tokens: args[0],\n numArgs: 0\n };\n } else {\n return {\n tokens: args[1],\n numArgs: 0\n };\n }\n}); // Lookup table for parsing numbers in base 8 through 16\n\nvar digitToNumber = {\n \"0\": 0,\n \"1\": 1,\n \"2\": 2,\n \"3\": 3,\n \"4\": 4,\n \"5\": 5,\n \"6\": 6,\n \"7\": 7,\n \"8\": 8,\n \"9\": 9,\n \"a\": 10,\n \"A\": 10,\n \"b\": 11,\n \"B\": 11,\n \"c\": 12,\n \"C\": 12,\n \"d\": 13,\n \"D\": 13,\n \"e\": 14,\n \"E\": 14,\n \"f\": 15,\n \"F\": 15\n}; // TeX \\char makes a literal character (catcode 12) using the following forms:\n// (see The TeXBook, p. 43)\n// \\char123 -- decimal\n// \\char'123 -- octal\n// \\char\"123 -- hex\n// \\char`x -- character that can be written (i.e. isn't active)\n// \\char`\\x -- character that cannot be written (e.g. %)\n// These all refer to characters from the font, so we turn them into special\n// calls to a function \\@char dealt with in the Parser.\n\ndefineMacro(\"\\\\char\", function (context) {\n var token = context.popToken();\n var base;\n var number = '';\n\n if (token.text === \"'\") {\n base = 8;\n token = context.popToken();\n } else if (token.text === '\"') {\n base = 16;\n token = context.popToken();\n } else if (token.text === \"`\") {\n token = context.popToken();\n\n if (token.text[0] === \"\\\\\") {\n number = token.text.charCodeAt(1);\n } else if (token.text === \"EOF\") {\n throw new ParseError(\"\\\\char` missing argument\");\n } else {\n number = token.text.charCodeAt(0);\n }\n } else {\n base = 10;\n }\n\n if (base) {\n // Parse a number in the given base, starting with first `token`.\n number = digitToNumber[token.text];\n\n if (number == null || number >= base) {\n throw new ParseError(\"Invalid base-\" + base + \" digit \" + token.text);\n }\n\n var digit;\n\n while ((digit = digitToNumber[context.future().text]) != null && digit < base) {\n number *= base;\n number += digit;\n context.popToken();\n }\n }\n\n return \"\\\\@char{\" + number + \"}\";\n}); // \\newcommand{\\macro}[args]{definition}\n// \\renewcommand{\\macro}[args]{definition}\n// TODO: Optional arguments: \\newcommand{\\macro}[args][default]{definition}\n\nvar newcommand = (context, existsOK, nonexistsOK, skipIfExists) => {\n var arg = context.consumeArg().tokens;\n\n if (arg.length !== 1) {\n throw new ParseError(\"\\\\newcommand's first argument must be a macro name\");\n }\n\n var name = arg[0].text;\n var exists = context.isDefined(name);\n\n if (exists && !existsOK) {\n throw new ParseError(\"\\\\newcommand{\" + name + \"} attempting to redefine \" + (name + \"; use \\\\renewcommand\"));\n }\n\n if (!exists && !nonexistsOK) {\n throw new ParseError(\"\\\\renewcommand{\" + name + \"} when command \" + name + \" \" + \"does not yet exist; use \\\\newcommand\");\n }\n\n var numArgs = 0;\n arg = context.consumeArg().tokens;\n\n if (arg.length === 1 && arg[0].text === \"[\") {\n var argText = '';\n var token = context.expandNextToken();\n\n while (token.text !== \"]\" && token.text !== \"EOF\") {\n // TODO: Should properly expand arg, e.g., ignore {}s\n argText += token.text;\n token = context.expandNextToken();\n }\n\n if (!argText.match(/^\\s*[0-9]+\\s*$/)) {\n throw new ParseError(\"Invalid number of arguments: \" + argText);\n }\n\n numArgs = parseInt(argText);\n arg = context.consumeArg().tokens;\n }\n\n if (!(exists && skipIfExists)) {\n // Final arg is the expansion of the macro\n context.macros.set(name, {\n tokens: arg,\n numArgs\n });\n }\n\n return '';\n};\n\ndefineMacro(\"\\\\newcommand\", context => newcommand(context, false, true, false));\ndefineMacro(\"\\\\renewcommand\", context => newcommand(context, true, false, false));\ndefineMacro(\"\\\\providecommand\", context => newcommand(context, true, true, true)); // terminal (console) tools\n\ndefineMacro(\"\\\\message\", context => {\n var arg = context.consumeArgs(1)[0]; // eslint-disable-next-line no-console\n\n console.log(arg.reverse().map(token => token.text).join(\"\"));\n return '';\n});\ndefineMacro(\"\\\\errmessage\", context => {\n var arg = context.consumeArgs(1)[0]; // eslint-disable-next-line no-console\n\n console.error(arg.reverse().map(token => token.text).join(\"\"));\n return '';\n});\ndefineMacro(\"\\\\show\", context => {\n var tok = context.popToken();\n var name = tok.text; // eslint-disable-next-line no-console\n\n console.log(tok, context.macros.get(name), functions[name], symbols.math[name], symbols.text[name]);\n return '';\n}); //////////////////////////////////////////////////////////////////////\n// Grouping\n// \\let\\bgroup={ \\let\\egroup=}\n\ndefineMacro(\"\\\\bgroup\", \"{\");\ndefineMacro(\"\\\\egroup\", \"}\"); // Symbols from latex.ltx:\n// \\def~{\\nobreakspace{}}\n// \\def\\lq{`}\n// \\def\\rq{'}\n// \\def \\aa {\\r a}\n// \\def \\AA {\\r A}\n\ndefineMacro(\"~\", \"\\\\nobreakspace\");\ndefineMacro(\"\\\\lq\", \"`\");\ndefineMacro(\"\\\\rq\", \"'\");\ndefineMacro(\"\\\\aa\", \"\\\\r a\");\ndefineMacro(\"\\\\AA\", \"\\\\r A\"); // Copyright (C) and registered (R) symbols. Use raw symbol in MathML.\n// \\DeclareTextCommandDefault{\\textcopyright}{\\textcircled{c}}\n// \\DeclareTextCommandDefault{\\textregistered}{\\textcircled{%\n// \\check@mathfonts\\fontsize\\sf@size\\z@\\math@fontsfalse\\selectfont R}}\n// \\DeclareRobustCommand{\\copyright}{%\n// \\ifmmode{\\nfss@text{\\textcopyright}}\\else\\textcopyright\\fi}\n\ndefineMacro(\"\\\\textcopyright\", \"\\\\html@mathml{\\\\textcircled{c}}{\\\\char`©}\");\ndefineMacro(\"\\\\copyright\", \"\\\\TextOrMath{\\\\textcopyright}{\\\\text{\\\\textcopyright}}\");\ndefineMacro(\"\\\\textregistered\", \"\\\\html@mathml{\\\\textcircled{\\\\scriptsize R}}{\\\\char`®}\"); // Characters omitted from Unicode range 1D400–1D7FF\n\ndefineMacro(\"\\u212C\", \"\\\\mathscr{B}\"); // script\n\ndefineMacro(\"\\u2130\", \"\\\\mathscr{E}\");\ndefineMacro(\"\\u2131\", \"\\\\mathscr{F}\");\ndefineMacro(\"\\u210B\", \"\\\\mathscr{H}\");\ndefineMacro(\"\\u2110\", \"\\\\mathscr{I}\");\ndefineMacro(\"\\u2112\", \"\\\\mathscr{L}\");\ndefineMacro(\"\\u2133\", \"\\\\mathscr{M}\");\ndefineMacro(\"\\u211B\", \"\\\\mathscr{R}\");\ndefineMacro(\"\\u212D\", \"\\\\mathfrak{C}\"); // Fraktur\n\ndefineMacro(\"\\u210C\", \"\\\\mathfrak{H}\");\ndefineMacro(\"\\u2128\", \"\\\\mathfrak{Z}\"); // Define \\Bbbk with a macro that works in both HTML and MathML.\n\ndefineMacro(\"\\\\Bbbk\", \"\\\\Bbb{k}\"); // Unicode middle dot\n// The KaTeX fonts do not contain U+00B7. Instead, \\cdotp displays\n// the dot at U+22C5 and gives it punct spacing.\n\ndefineMacro(\"\\u00b7\", \"\\\\cdotp\"); // \\llap and \\rlap render their contents in text mode\n\ndefineMacro(\"\\\\llap\", \"\\\\mathllap{\\\\textrm{#1}}\");\ndefineMacro(\"\\\\rlap\", \"\\\\mathrlap{\\\\textrm{#1}}\");\ndefineMacro(\"\\\\clap\", \"\\\\mathclap{\\\\textrm{#1}}\"); // \\mathstrut from the TeXbook, p 360\n\ndefineMacro(\"\\\\mathstrut\", \"\\\\vphantom{(}\"); // \\underbar from TeXbook p 353\n\ndefineMacro(\"\\\\underbar\", \"\\\\underline{\\\\text{#1}}\"); // \\not is defined by base/fontmath.ltx via\n// \\DeclareMathSymbol{\\not}{\\mathrel}{symbols}{\"36}\n// It's thus treated like a \\mathrel, but defined by a symbol that has zero\n// width but extends to the right. We use \\rlap to get that spacing.\n// For MathML we write U+0338 here. buildMathML.js will then do the overlay.\n\ndefineMacro(\"\\\\not\", '\\\\html@mathml{\\\\mathrel{\\\\mathrlap\\\\@not}}{\\\\char\"338}'); // Negated symbols from base/fontmath.ltx:\n// \\def\\neq{\\not=} \\let\\ne=\\neq\n// \\DeclareRobustCommand\n// \\notin{\\mathrel{\\m@th\\mathpalette\\c@ncel\\in}}\n// \\def\\c@ncel#1#2{\\m@th\\ooalign{$\\hfil#1\\mkern1mu/\\hfil$\\crcr$#1#2$}}\n\ndefineMacro(\"\\\\neq\", \"\\\\html@mathml{\\\\mathrel{\\\\not=}}{\\\\mathrel{\\\\char`≠}}\");\ndefineMacro(\"\\\\ne\", \"\\\\neq\");\ndefineMacro(\"\\u2260\", \"\\\\neq\");\ndefineMacro(\"\\\\notin\", \"\\\\html@mathml{\\\\mathrel{{\\\\in}\\\\mathllap{/\\\\mskip1mu}}}\" + \"{\\\\mathrel{\\\\char`∉}}\");\ndefineMacro(\"\\u2209\", \"\\\\notin\"); // Unicode stacked relations\n\ndefineMacro(\"\\u2258\", \"\\\\html@mathml{\" + \"\\\\mathrel{=\\\\kern{-1em}\\\\raisebox{0.4em}{$\\\\scriptsize\\\\frown$}}\" + \"}{\\\\mathrel{\\\\char`\\u2258}}\");\ndefineMacro(\"\\u2259\", \"\\\\html@mathml{\\\\stackrel{\\\\tiny\\\\wedge}{=}}{\\\\mathrel{\\\\char`\\u2258}}\");\ndefineMacro(\"\\u225A\", \"\\\\html@mathml{\\\\stackrel{\\\\tiny\\\\vee}{=}}{\\\\mathrel{\\\\char`\\u225A}}\");\ndefineMacro(\"\\u225B\", \"\\\\html@mathml{\\\\stackrel{\\\\scriptsize\\\\star}{=}}\" + \"{\\\\mathrel{\\\\char`\\u225B}}\");\ndefineMacro(\"\\u225D\", \"\\\\html@mathml{\\\\stackrel{\\\\tiny\\\\mathrm{def}}{=}}\" + \"{\\\\mathrel{\\\\char`\\u225D}}\");\ndefineMacro(\"\\u225E\", \"\\\\html@mathml{\\\\stackrel{\\\\tiny\\\\mathrm{m}}{=}}\" + \"{\\\\mathrel{\\\\char`\\u225E}}\");\ndefineMacro(\"\\u225F\", \"\\\\html@mathml{\\\\stackrel{\\\\tiny?}{=}}{\\\\mathrel{\\\\char`\\u225F}}\"); // Misc Unicode\n\ndefineMacro(\"\\u27C2\", \"\\\\perp\");\ndefineMacro(\"\\u203C\", \"\\\\mathclose{!\\\\mkern-0.8mu!}\");\ndefineMacro(\"\\u220C\", \"\\\\notni\");\ndefineMacro(\"\\u231C\", \"\\\\ulcorner\");\ndefineMacro(\"\\u231D\", \"\\\\urcorner\");\ndefineMacro(\"\\u231E\", \"\\\\llcorner\");\ndefineMacro(\"\\u231F\", \"\\\\lrcorner\");\ndefineMacro(\"\\u00A9\", \"\\\\copyright\");\ndefineMacro(\"\\u00AE\", \"\\\\textregistered\");\ndefineMacro(\"\\uFE0F\", \"\\\\textregistered\"); // The KaTeX fonts have corners at codepoints that don't match Unicode.\n// For MathML purposes, use the Unicode code point.\n\ndefineMacro(\"\\\\ulcorner\", \"\\\\html@mathml{\\\\@ulcorner}{\\\\mathop{\\\\char\\\"231c}}\");\ndefineMacro(\"\\\\urcorner\", \"\\\\html@mathml{\\\\@urcorner}{\\\\mathop{\\\\char\\\"231d}}\");\ndefineMacro(\"\\\\llcorner\", \"\\\\html@mathml{\\\\@llcorner}{\\\\mathop{\\\\char\\\"231e}}\");\ndefineMacro(\"\\\\lrcorner\", \"\\\\html@mathml{\\\\@lrcorner}{\\\\mathop{\\\\char\\\"231f}}\"); //////////////////////////////////////////////////////////////////////\n// LaTeX_2ε\n// \\vdots{\\vbox{\\baselineskip4\\p@ \\lineskiplimit\\z@\n// \\kern6\\p@\\hbox{.}\\hbox{.}\\hbox{.}}}\n// We'll call \\varvdots, which gets a glyph from symbols.js.\n// The zero-width rule gets us an equivalent to the vertical 6pt kern.\n\ndefineMacro(\"\\\\vdots\", \"{\\\\varvdots\\\\rule{0pt}{15pt}}\");\ndefineMacro(\"\\u22ee\", \"\\\\vdots\"); //////////////////////////////////////////////////////////////////////\n// amsmath.sty\n// http://mirrors.concertpass.com/tex-archive/macros/latex/required/amsmath/amsmath.pdf\n// Italic Greek capital letters. AMS defines these with \\DeclareMathSymbol,\n// but they are equivalent to \\mathit{\\Letter}.\n\ndefineMacro(\"\\\\varGamma\", \"\\\\mathit{\\\\Gamma}\");\ndefineMacro(\"\\\\varDelta\", \"\\\\mathit{\\\\Delta}\");\ndefineMacro(\"\\\\varTheta\", \"\\\\mathit{\\\\Theta}\");\ndefineMacro(\"\\\\varLambda\", \"\\\\mathit{\\\\Lambda}\");\ndefineMacro(\"\\\\varXi\", \"\\\\mathit{\\\\Xi}\");\ndefineMacro(\"\\\\varPi\", \"\\\\mathit{\\\\Pi}\");\ndefineMacro(\"\\\\varSigma\", \"\\\\mathit{\\\\Sigma}\");\ndefineMacro(\"\\\\varUpsilon\", \"\\\\mathit{\\\\Upsilon}\");\ndefineMacro(\"\\\\varPhi\", \"\\\\mathit{\\\\Phi}\");\ndefineMacro(\"\\\\varPsi\", \"\\\\mathit{\\\\Psi}\");\ndefineMacro(\"\\\\varOmega\", \"\\\\mathit{\\\\Omega}\"); //\\newcommand{\\substack}[1]{\\subarray{c}#1\\endsubarray}\n\ndefineMacro(\"\\\\substack\", \"\\\\begin{subarray}{c}#1\\\\end{subarray}\"); // \\renewcommand{\\colon}{\\nobreak\\mskip2mu\\mathpunct{}\\nonscript\n// \\mkern-\\thinmuskip{:}\\mskip6muplus1mu\\relax}\n\ndefineMacro(\"\\\\colon\", \"\\\\nobreak\\\\mskip2mu\\\\mathpunct{}\" + \"\\\\mathchoice{\\\\mkern-3mu}{\\\\mkern-3mu}{}{}{:}\\\\mskip6mu\\\\relax\"); // \\newcommand{\\boxed}[1]{\\fbox{\\m@th$\\displaystyle#1$}}\n\ndefineMacro(\"\\\\boxed\", \"\\\\fbox{$\\\\displaystyle{#1}$}\"); // \\def\\iff{\\DOTSB\\;\\Longleftrightarrow\\;}\n// \\def\\implies{\\DOTSB\\;\\Longrightarrow\\;}\n// \\def\\impliedby{\\DOTSB\\;\\Longleftarrow\\;}\n\ndefineMacro(\"\\\\iff\", \"\\\\DOTSB\\\\;\\\\Longleftrightarrow\\\\;\");\ndefineMacro(\"\\\\implies\", \"\\\\DOTSB\\\\;\\\\Longrightarrow\\\\;\");\ndefineMacro(\"\\\\impliedby\", \"\\\\DOTSB\\\\;\\\\Longleftarrow\\\\;\"); // \\def\\dddot#1{{\\mathop{#1}\\limits^{\\vbox to-1.4\\ex@{\\kern-\\tw@\\ex@\n// \\hbox{\\normalfont ...}\\vss}}}}\n// We use \\overset which avoids the vertical shift of \\mathop.\n\ndefineMacro(\"\\\\dddot\", \"{\\\\overset{\\\\raisebox{-0.1ex}{\\\\normalsize ...}}{#1}}\");\ndefineMacro(\"\\\\ddddot\", \"{\\\\overset{\\\\raisebox{-0.1ex}{\\\\normalsize ....}}{#1}}\"); // AMSMath's automatic \\dots, based on \\mdots@@ macro.\n\nvar dotsByToken = {\n ',': '\\\\dotsc',\n '\\\\not': '\\\\dotsb',\n // \\keybin@ checks for the following:\n '+': '\\\\dotsb',\n '=': '\\\\dotsb',\n '<': '\\\\dotsb',\n '>': '\\\\dotsb',\n '-': '\\\\dotsb',\n '*': '\\\\dotsb',\n ':': '\\\\dotsb',\n // Symbols whose definition starts with \\DOTSB:\n '\\\\DOTSB': '\\\\dotsb',\n '\\\\coprod': '\\\\dotsb',\n '\\\\bigvee': '\\\\dotsb',\n '\\\\bigwedge': '\\\\dotsb',\n '\\\\biguplus': '\\\\dotsb',\n '\\\\bigcap': '\\\\dotsb',\n '\\\\bigcup': '\\\\dotsb',\n '\\\\prod': '\\\\dotsb',\n '\\\\sum': '\\\\dotsb',\n '\\\\bigotimes': '\\\\dotsb',\n '\\\\bigoplus': '\\\\dotsb',\n '\\\\bigodot': '\\\\dotsb',\n '\\\\bigsqcup': '\\\\dotsb',\n '\\\\And': '\\\\dotsb',\n '\\\\longrightarrow': '\\\\dotsb',\n '\\\\Longrightarrow': '\\\\dotsb',\n '\\\\longleftarrow': '\\\\dotsb',\n '\\\\Longleftarrow': '\\\\dotsb',\n '\\\\longleftrightarrow': '\\\\dotsb',\n '\\\\Longleftrightarrow': '\\\\dotsb',\n '\\\\mapsto': '\\\\dotsb',\n '\\\\longmapsto': '\\\\dotsb',\n '\\\\hookrightarrow': '\\\\dotsb',\n '\\\\doteq': '\\\\dotsb',\n // Symbols whose definition starts with \\mathbin:\n '\\\\mathbin': '\\\\dotsb',\n // Symbols whose definition starts with \\mathrel:\n '\\\\mathrel': '\\\\dotsb',\n '\\\\relbar': '\\\\dotsb',\n '\\\\Relbar': '\\\\dotsb',\n '\\\\xrightarrow': '\\\\dotsb',\n '\\\\xleftarrow': '\\\\dotsb',\n // Symbols whose definition starts with \\DOTSI:\n '\\\\DOTSI': '\\\\dotsi',\n '\\\\int': '\\\\dotsi',\n '\\\\oint': '\\\\dotsi',\n '\\\\iint': '\\\\dotsi',\n '\\\\iiint': '\\\\dotsi',\n '\\\\iiiint': '\\\\dotsi',\n '\\\\idotsint': '\\\\dotsi',\n // Symbols whose definition starts with \\DOTSX:\n '\\\\DOTSX': '\\\\dotsx'\n};\ndefineMacro(\"\\\\dots\", function (context) {\n // TODO: If used in text mode, should expand to \\textellipsis.\n // However, in KaTeX, \\textellipsis and \\ldots behave the same\n // (in text mode), and it's unlikely we'd see any of the math commands\n // that affect the behavior of \\dots when in text mode. So fine for now\n // (until we support \\ifmmode ... \\else ... \\fi).\n var thedots = '\\\\dotso';\n var next = context.expandAfterFuture().text;\n\n if (next in dotsByToken) {\n thedots = dotsByToken[next];\n } else if (next.slice(0, 4) === '\\\\not') {\n thedots = '\\\\dotsb';\n } else if (next in symbols.math) {\n if (utils.contains(['bin', 'rel'], symbols.math[next].group)) {\n thedots = '\\\\dotsb';\n }\n }\n\n return thedots;\n});\nvar spaceAfterDots = {\n // \\rightdelim@ checks for the following:\n ')': true,\n ']': true,\n '\\\\rbrack': true,\n '\\\\}': true,\n '\\\\rbrace': true,\n '\\\\rangle': true,\n '\\\\rceil': true,\n '\\\\rfloor': true,\n '\\\\rgroup': true,\n '\\\\rmoustache': true,\n '\\\\right': true,\n '\\\\bigr': true,\n '\\\\biggr': true,\n '\\\\Bigr': true,\n '\\\\Biggr': true,\n // \\extra@ also tests for the following:\n '$': true,\n // \\extrap@ checks for the following:\n ';': true,\n '.': true,\n ',': true\n};\ndefineMacro(\"\\\\dotso\", function (context) {\n var next = context.future().text;\n\n if (next in spaceAfterDots) {\n return \"\\\\ldots\\\\,\";\n } else {\n return \"\\\\ldots\";\n }\n});\ndefineMacro(\"\\\\dotsc\", function (context) {\n var next = context.future().text; // \\dotsc uses \\extra@ but not \\extrap@, instead specially checking for\n // ';' and '.', but doesn't check for ','.\n\n if (next in spaceAfterDots && next !== ',') {\n return \"\\\\ldots\\\\,\";\n } else {\n return \"\\\\ldots\";\n }\n});\ndefineMacro(\"\\\\cdots\", function (context) {\n var next = context.future().text;\n\n if (next in spaceAfterDots) {\n return \"\\\\@cdots\\\\,\";\n } else {\n return \"\\\\@cdots\";\n }\n});\ndefineMacro(\"\\\\dotsb\", \"\\\\cdots\");\ndefineMacro(\"\\\\dotsm\", \"\\\\cdots\");\ndefineMacro(\"\\\\dotsi\", \"\\\\!\\\\cdots\"); // amsmath doesn't actually define \\dotsx, but \\dots followed by a macro\n// starting with \\DOTSX implies \\dotso, and then \\extra@ detects this case\n// and forces the added `\\,`.\n\ndefineMacro(\"\\\\dotsx\", \"\\\\ldots\\\\,\"); // \\let\\DOTSI\\relax\n// \\let\\DOTSB\\relax\n// \\let\\DOTSX\\relax\n\ndefineMacro(\"\\\\DOTSI\", \"\\\\relax\");\ndefineMacro(\"\\\\DOTSB\", \"\\\\relax\");\ndefineMacro(\"\\\\DOTSX\", \"\\\\relax\"); // Spacing, based on amsmath.sty's override of LaTeX defaults\n// \\DeclareRobustCommand{\\tmspace}[3]{%\n// \\ifmmode\\mskip#1#2\\else\\kern#1#3\\fi\\relax}\n\ndefineMacro(\"\\\\tmspace\", \"\\\\TextOrMath{\\\\kern#1#3}{\\\\mskip#1#2}\\\\relax\"); // \\renewcommand{\\,}{\\tmspace+\\thinmuskip{.1667em}}\n// TODO: math mode should use \\thinmuskip\n\ndefineMacro(\"\\\\,\", \"\\\\tmspace+{3mu}{.1667em}\"); // \\let\\thinspace\\,\n\ndefineMacro(\"\\\\thinspace\", \"\\\\,\"); // \\def\\>{\\mskip\\medmuskip}\n// \\renewcommand{\\:}{\\tmspace+\\medmuskip{.2222em}}\n// TODO: \\> and math mode of \\: should use \\medmuskip = 4mu plus 2mu minus 4mu\n\ndefineMacro(\"\\\\>\", \"\\\\mskip{4mu}\");\ndefineMacro(\"\\\\:\", \"\\\\tmspace+{4mu}{.2222em}\"); // \\let\\medspace\\:\n\ndefineMacro(\"\\\\medspace\", \"\\\\:\"); // \\renewcommand{\\;}{\\tmspace+\\thickmuskip{.2777em}}\n// TODO: math mode should use \\thickmuskip = 5mu plus 5mu\n\ndefineMacro(\"\\\\;\", \"\\\\tmspace+{5mu}{.2777em}\"); // \\let\\thickspace\\;\n\ndefineMacro(\"\\\\thickspace\", \"\\\\;\"); // \\renewcommand{\\!}{\\tmspace-\\thinmuskip{.1667em}}\n// TODO: math mode should use \\thinmuskip\n\ndefineMacro(\"\\\\!\", \"\\\\tmspace-{3mu}{.1667em}\"); // \\let\\negthinspace\\!\n\ndefineMacro(\"\\\\negthinspace\", \"\\\\!\"); // \\newcommand{\\negmedspace}{\\tmspace-\\medmuskip{.2222em}}\n// TODO: math mode should use \\medmuskip\n\ndefineMacro(\"\\\\negmedspace\", \"\\\\tmspace-{4mu}{.2222em}\"); // \\newcommand{\\negthickspace}{\\tmspace-\\thickmuskip{.2777em}}\n// TODO: math mode should use \\thickmuskip\n\ndefineMacro(\"\\\\negthickspace\", \"\\\\tmspace-{5mu}{.277em}\"); // \\def\\enspace{\\kern.5em }\n\ndefineMacro(\"\\\\enspace\", \"\\\\kern.5em \"); // \\def\\enskip{\\hskip.5em\\relax}\n\ndefineMacro(\"\\\\enskip\", \"\\\\hskip.5em\\\\relax\"); // \\def\\quad{\\hskip1em\\relax}\n\ndefineMacro(\"\\\\quad\", \"\\\\hskip1em\\\\relax\"); // \\def\\qquad{\\hskip2em\\relax}\n\ndefineMacro(\"\\\\qquad\", \"\\\\hskip2em\\\\relax\"); // \\tag@in@display form of \\tag\n\ndefineMacro(\"\\\\tag\", \"\\\\@ifstar\\\\tag@literal\\\\tag@paren\");\ndefineMacro(\"\\\\tag@paren\", \"\\\\tag@literal{({#1})}\");\ndefineMacro(\"\\\\tag@literal\", context => {\n if (context.macros.get(\"\\\\df@tag\")) {\n throw new ParseError(\"Multiple \\\\tag\");\n }\n\n return \"\\\\gdef\\\\df@tag{\\\\text{#1}}\";\n}); // \\renewcommand{\\bmod}{\\nonscript\\mskip-\\medmuskip\\mkern5mu\\mathbin\n// {\\operator@font mod}\\penalty900\n// \\mkern5mu\\nonscript\\mskip-\\medmuskip}\n// \\newcommand{\\pod}[1]{\\allowbreak\n// \\if@display\\mkern18mu\\else\\mkern8mu\\fi(#1)}\n// \\renewcommand{\\pmod}[1]{\\pod{{\\operator@font mod}\\mkern6mu#1}}\n// \\newcommand{\\mod}[1]{\\allowbreak\\if@display\\mkern18mu\n// \\else\\mkern12mu\\fi{\\operator@font mod}\\,\\,#1}\n// TODO: math mode should use \\medmuskip = 4mu plus 2mu minus 4mu\n\ndefineMacro(\"\\\\bmod\", \"\\\\mathchoice{\\\\mskip1mu}{\\\\mskip1mu}{\\\\mskip5mu}{\\\\mskip5mu}\" + \"\\\\mathbin{\\\\rm mod}\" + \"\\\\mathchoice{\\\\mskip1mu}{\\\\mskip1mu}{\\\\mskip5mu}{\\\\mskip5mu}\");\ndefineMacro(\"\\\\pod\", \"\\\\allowbreak\" + \"\\\\mathchoice{\\\\mkern18mu}{\\\\mkern8mu}{\\\\mkern8mu}{\\\\mkern8mu}(#1)\");\ndefineMacro(\"\\\\pmod\", \"\\\\pod{{\\\\rm mod}\\\\mkern6mu#1}\");\ndefineMacro(\"\\\\mod\", \"\\\\allowbreak\" + \"\\\\mathchoice{\\\\mkern18mu}{\\\\mkern12mu}{\\\\mkern12mu}{\\\\mkern12mu}\" + \"{\\\\rm mod}\\\\,\\\\,#1\"); //////////////////////////////////////////////////////////////////////\n// LaTeX source2e\n// \\expandafter\\let\\expandafter\\@normalcr\n// \\csname\\expandafter\\@gobble\\string\\\\ \\endcsname\n// \\DeclareRobustCommand\\newline{\\@normalcr\\relax}\n\ndefineMacro(\"\\\\newline\", \"\\\\\\\\\\\\relax\"); // \\def\\TeX{T\\kern-.1667em\\lower.5ex\\hbox{E}\\kern-.125emX\\@}\n// TODO: Doesn't normally work in math mode because \\@ fails. KaTeX doesn't\n// support \\@ yet, so that's omitted, and we add \\text so that the result\n// doesn't look funny in math mode.\n\ndefineMacro(\"\\\\TeX\", \"\\\\textrm{\\\\html@mathml{\" + \"T\\\\kern-.1667em\\\\raisebox{-.5ex}{E}\\\\kern-.125emX\" + \"}{TeX}}\"); // \\DeclareRobustCommand{\\LaTeX}{L\\kern-.36em%\n// {\\sbox\\z@ T%\n// \\vbox to\\ht\\z@{\\hbox{\\check@mathfonts\n// \\fontsize\\sf@size\\z@\n// \\math@fontsfalse\\selectfont\n// A}%\n// \\vss}%\n// }%\n// \\kern-.15em%\n// \\TeX}\n// This code aligns the top of the A with the T (from the perspective of TeX's\n// boxes, though visually the A appears to extend above slightly).\n// We compute the corresponding \\raisebox when A is rendered in \\normalsize\n// \\scriptstyle, which has a scale factor of 0.7 (see Options.js).\n\nvar latexRaiseA = makeEm(fontMetricsData['Main-Regular'][\"T\".charCodeAt(0)][1] - 0.7 * fontMetricsData['Main-Regular'][\"A\".charCodeAt(0)][1]);\ndefineMacro(\"\\\\LaTeX\", \"\\\\textrm{\\\\html@mathml{\" + (\"L\\\\kern-.36em\\\\raisebox{\" + latexRaiseA + \"}{\\\\scriptstyle A}\") + \"\\\\kern-.15em\\\\TeX}{LaTeX}}\"); // New KaTeX logo based on tweaking LaTeX logo\n\ndefineMacro(\"\\\\KaTeX\", \"\\\\textrm{\\\\html@mathml{\" + (\"K\\\\kern-.17em\\\\raisebox{\" + latexRaiseA + \"}{\\\\scriptstyle A}\") + \"\\\\kern-.15em\\\\TeX}{KaTeX}}\"); // \\DeclareRobustCommand\\hspace{\\@ifstar\\@hspacer\\@hspace}\n// \\def\\@hspace#1{\\hskip #1\\relax}\n// \\def\\@hspacer#1{\\vrule \\@width\\z@\\nobreak\n// \\hskip #1\\hskip \\z@skip}\n\ndefineMacro(\"\\\\hspace\", \"\\\\@ifstar\\\\@hspacer\\\\@hspace\");\ndefineMacro(\"\\\\@hspace\", \"\\\\hskip #1\\\\relax\");\ndefineMacro(\"\\\\@hspacer\", \"\\\\rule{0pt}{0pt}\\\\hskip #1\\\\relax\"); //////////////////////////////////////////////////////////////////////\n// mathtools.sty\n//\\providecommand\\ordinarycolon{:}\n\ndefineMacro(\"\\\\ordinarycolon\", \":\"); //\\def\\vcentcolon{\\mathrel{\\mathop\\ordinarycolon}}\n//TODO(edemaine): Not yet centered. Fix via \\raisebox or #726\n\ndefineMacro(\"\\\\vcentcolon\", \"\\\\mathrel{\\\\mathop\\\\ordinarycolon}\"); // \\providecommand*\\dblcolon{\\vcentcolon\\mathrel{\\mkern-.9mu}\\vcentcolon}\n\ndefineMacro(\"\\\\dblcolon\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\vcentcolon\\\\mathrel{\\\\mkern-.9mu}\\\\vcentcolon}}\" + \"{\\\\mathop{\\\\char\\\"2237}}\"); // \\providecommand*\\coloneqq{\\vcentcolon\\mathrel{\\mkern-1.2mu}=}\n\ndefineMacro(\"\\\\coloneqq\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\vcentcolon\\\\mathrel{\\\\mkern-1.2mu}=}}\" + \"{\\\\mathop{\\\\char\\\"2254}}\"); // ≔\n// \\providecommand*\\Coloneqq{\\dblcolon\\mathrel{\\mkern-1.2mu}=}\n\ndefineMacro(\"\\\\Coloneqq\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\dblcolon\\\\mathrel{\\\\mkern-1.2mu}=}}\" + \"{\\\\mathop{\\\\char\\\"2237\\\\char\\\"3d}}\"); // \\providecommand*\\coloneq{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}\n\ndefineMacro(\"\\\\coloneq\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\vcentcolon\\\\mathrel{\\\\mkern-1.2mu}\\\\mathrel{-}}}\" + \"{\\\\mathop{\\\\char\\\"3a\\\\char\\\"2212}}\"); // \\providecommand*\\Coloneq{\\dblcolon\\mathrel{\\mkern-1.2mu}\\mathrel{-}}\n\ndefineMacro(\"\\\\Coloneq\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\dblcolon\\\\mathrel{\\\\mkern-1.2mu}\\\\mathrel{-}}}\" + \"{\\\\mathop{\\\\char\\\"2237\\\\char\\\"2212}}\"); // \\providecommand*\\eqqcolon{=\\mathrel{\\mkern-1.2mu}\\vcentcolon}\n\ndefineMacro(\"\\\\eqqcolon\", \"\\\\html@mathml{\" + \"\\\\mathrel{=\\\\mathrel{\\\\mkern-1.2mu}\\\\vcentcolon}}\" + \"{\\\\mathop{\\\\char\\\"2255}}\"); // ≕\n// \\providecommand*\\Eqqcolon{=\\mathrel{\\mkern-1.2mu}\\dblcolon}\n\ndefineMacro(\"\\\\Eqqcolon\", \"\\\\html@mathml{\" + \"\\\\mathrel{=\\\\mathrel{\\\\mkern-1.2mu}\\\\dblcolon}}\" + \"{\\\\mathop{\\\\char\\\"3d\\\\char\\\"2237}}\"); // \\providecommand*\\eqcolon{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\vcentcolon}\n\ndefineMacro(\"\\\\eqcolon\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\mathrel{-}\\\\mathrel{\\\\mkern-1.2mu}\\\\vcentcolon}}\" + \"{\\\\mathop{\\\\char\\\"2239}}\"); // \\providecommand*\\Eqcolon{\\mathrel{-}\\mathrel{\\mkern-1.2mu}\\dblcolon}\n\ndefineMacro(\"\\\\Eqcolon\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\mathrel{-}\\\\mathrel{\\\\mkern-1.2mu}\\\\dblcolon}}\" + \"{\\\\mathop{\\\\char\\\"2212\\\\char\\\"2237}}\"); // \\providecommand*\\colonapprox{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\approx}\n\ndefineMacro(\"\\\\colonapprox\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\vcentcolon\\\\mathrel{\\\\mkern-1.2mu}\\\\approx}}\" + \"{\\\\mathop{\\\\char\\\"3a\\\\char\\\"2248}}\"); // \\providecommand*\\Colonapprox{\\dblcolon\\mathrel{\\mkern-1.2mu}\\approx}\n\ndefineMacro(\"\\\\Colonapprox\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\dblcolon\\\\mathrel{\\\\mkern-1.2mu}\\\\approx}}\" + \"{\\\\mathop{\\\\char\\\"2237\\\\char\\\"2248}}\"); // \\providecommand*\\colonsim{\\vcentcolon\\mathrel{\\mkern-1.2mu}\\sim}\n\ndefineMacro(\"\\\\colonsim\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\vcentcolon\\\\mathrel{\\\\mkern-1.2mu}\\\\sim}}\" + \"{\\\\mathop{\\\\char\\\"3a\\\\char\\\"223c}}\"); // \\providecommand*\\Colonsim{\\dblcolon\\mathrel{\\mkern-1.2mu}\\sim}\n\ndefineMacro(\"\\\\Colonsim\", \"\\\\html@mathml{\" + \"\\\\mathrel{\\\\dblcolon\\\\mathrel{\\\\mkern-1.2mu}\\\\sim}}\" + \"{\\\\mathop{\\\\char\\\"2237\\\\char\\\"223c}}\"); // Some Unicode characters are implemented with macros to mathtools functions.\n\ndefineMacro(\"\\u2237\", \"\\\\dblcolon\"); // ::\n\ndefineMacro(\"\\u2239\", \"\\\\eqcolon\"); // -:\n\ndefineMacro(\"\\u2254\", \"\\\\coloneqq\"); // :=\n\ndefineMacro(\"\\u2255\", \"\\\\eqqcolon\"); // =:\n\ndefineMacro(\"\\u2A74\", \"\\\\Coloneqq\"); // ::=\n//////////////////////////////////////////////////////////////////////\n// colonequals.sty\n// Alternate names for mathtools's macros:\n\ndefineMacro(\"\\\\ratio\", \"\\\\vcentcolon\");\ndefineMacro(\"\\\\coloncolon\", \"\\\\dblcolon\");\ndefineMacro(\"\\\\colonequals\", \"\\\\coloneqq\");\ndefineMacro(\"\\\\coloncolonequals\", \"\\\\Coloneqq\");\ndefineMacro(\"\\\\equalscolon\", \"\\\\eqqcolon\");\ndefineMacro(\"\\\\equalscoloncolon\", \"\\\\Eqqcolon\");\ndefineMacro(\"\\\\colonminus\", \"\\\\coloneq\");\ndefineMacro(\"\\\\coloncolonminus\", \"\\\\Coloneq\");\ndefineMacro(\"\\\\minuscolon\", \"\\\\eqcolon\");\ndefineMacro(\"\\\\minuscoloncolon\", \"\\\\Eqcolon\"); // \\colonapprox name is same in mathtools and colonequals.\n\ndefineMacro(\"\\\\coloncolonapprox\", \"\\\\Colonapprox\"); // \\colonsim name is same in mathtools and colonequals.\n\ndefineMacro(\"\\\\coloncolonsim\", \"\\\\Colonsim\"); // Additional macros, implemented by analogy with mathtools definitions:\n\ndefineMacro(\"\\\\simcolon\", \"\\\\mathrel{\\\\sim\\\\mathrel{\\\\mkern-1.2mu}\\\\vcentcolon}\");\ndefineMacro(\"\\\\simcoloncolon\", \"\\\\mathrel{\\\\sim\\\\mathrel{\\\\mkern-1.2mu}\\\\dblcolon}\");\ndefineMacro(\"\\\\approxcolon\", \"\\\\mathrel{\\\\approx\\\\mathrel{\\\\mkern-1.2mu}\\\\vcentcolon}\");\ndefineMacro(\"\\\\approxcoloncolon\", \"\\\\mathrel{\\\\approx\\\\mathrel{\\\\mkern-1.2mu}\\\\dblcolon}\"); // Present in newtxmath, pxfonts and txfonts\n\ndefineMacro(\"\\\\notni\", \"\\\\html@mathml{\\\\not\\\\ni}{\\\\mathrel{\\\\char`\\u220C}}\");\ndefineMacro(\"\\\\limsup\", \"\\\\DOTSB\\\\operatorname*{lim\\\\,sup}\");\ndefineMacro(\"\\\\liminf\", \"\\\\DOTSB\\\\operatorname*{lim\\\\,inf}\"); //////////////////////////////////////////////////////////////////////\n// From amsopn.sty\n\ndefineMacro(\"\\\\injlim\", \"\\\\DOTSB\\\\operatorname*{inj\\\\,lim}\");\ndefineMacro(\"\\\\projlim\", \"\\\\DOTSB\\\\operatorname*{proj\\\\,lim}\");\ndefineMacro(\"\\\\varlimsup\", \"\\\\DOTSB\\\\operatorname*{\\\\overline{lim}}\");\ndefineMacro(\"\\\\varliminf\", \"\\\\DOTSB\\\\operatorname*{\\\\underline{lim}}\");\ndefineMacro(\"\\\\varinjlim\", \"\\\\DOTSB\\\\operatorname*{\\\\underrightarrow{lim}}\");\ndefineMacro(\"\\\\varprojlim\", \"\\\\DOTSB\\\\operatorname*{\\\\underleftarrow{lim}}\"); //////////////////////////////////////////////////////////////////////\n// MathML alternates for KaTeX glyphs in the Unicode private area\n\ndefineMacro(\"\\\\gvertneqq\", \"\\\\html@mathml{\\\\@gvertneqq}{\\u2269}\");\ndefineMacro(\"\\\\lvertneqq\", \"\\\\html@mathml{\\\\@lvertneqq}{\\u2268}\");\ndefineMacro(\"\\\\ngeqq\", \"\\\\html@mathml{\\\\@ngeqq}{\\u2271}\");\ndefineMacro(\"\\\\ngeqslant\", \"\\\\html@mathml{\\\\@ngeqslant}{\\u2271}\");\ndefineMacro(\"\\\\nleqq\", \"\\\\html@mathml{\\\\@nleqq}{\\u2270}\");\ndefineMacro(\"\\\\nleqslant\", \"\\\\html@mathml{\\\\@nleqslant}{\\u2270}\");\ndefineMacro(\"\\\\nshortmid\", \"\\\\html@mathml{\\\\@nshortmid}{∤}\");\ndefineMacro(\"\\\\nshortparallel\", \"\\\\html@mathml{\\\\@nshortparallel}{∦}\");\ndefineMacro(\"\\\\nsubseteqq\", \"\\\\html@mathml{\\\\@nsubseteqq}{\\u2288}\");\ndefineMacro(\"\\\\nsupseteqq\", \"\\\\html@mathml{\\\\@nsupseteqq}{\\u2289}\");\ndefineMacro(\"\\\\varsubsetneq\", \"\\\\html@mathml{\\\\@varsubsetneq}{⊊}\");\ndefineMacro(\"\\\\varsubsetneqq\", \"\\\\html@mathml{\\\\@varsubsetneqq}{⫋}\");\ndefineMacro(\"\\\\varsupsetneq\", \"\\\\html@mathml{\\\\@varsupsetneq}{⊋}\");\ndefineMacro(\"\\\\varsupsetneqq\", \"\\\\html@mathml{\\\\@varsupsetneqq}{⫌}\");\ndefineMacro(\"\\\\imath\", \"\\\\html@mathml{\\\\@imath}{\\u0131}\");\ndefineMacro(\"\\\\jmath\", \"\\\\html@mathml{\\\\@jmath}{\\u0237}\"); //////////////////////////////////////////////////////////////////////\n// stmaryrd and semantic\n// The stmaryrd and semantic packages render the next four items by calling a\n// glyph. Those glyphs do not exist in the KaTeX fonts. Hence the macros.\n\ndefineMacro(\"\\\\llbracket\", \"\\\\html@mathml{\" + \"\\\\mathopen{[\\\\mkern-3.2mu[}}\" + \"{\\\\mathopen{\\\\char`\\u27e6}}\");\ndefineMacro(\"\\\\rrbracket\", \"\\\\html@mathml{\" + \"\\\\mathclose{]\\\\mkern-3.2mu]}}\" + \"{\\\\mathclose{\\\\char`\\u27e7}}\");\ndefineMacro(\"\\u27e6\", \"\\\\llbracket\"); // blackboard bold [\n\ndefineMacro(\"\\u27e7\", \"\\\\rrbracket\"); // blackboard bold ]\n\ndefineMacro(\"\\\\lBrace\", \"\\\\html@mathml{\" + \"\\\\mathopen{\\\\{\\\\mkern-3.2mu[}}\" + \"{\\\\mathopen{\\\\char`\\u2983}}\");\ndefineMacro(\"\\\\rBrace\", \"\\\\html@mathml{\" + \"\\\\mathclose{]\\\\mkern-3.2mu\\\\}}}\" + \"{\\\\mathclose{\\\\char`\\u2984}}\");\ndefineMacro(\"\\u2983\", \"\\\\lBrace\"); // blackboard bold {\n\ndefineMacro(\"\\u2984\", \"\\\\rBrace\"); // blackboard bold }\n// TODO: Create variable sized versions of the last two items. I believe that\n// will require new font glyphs.\n// The stmaryrd function `\\minuso` provides a \"Plimsoll\" symbol that\n// superimposes the characters \\circ and \\mathminus. Used in chemistry.\n\ndefineMacro(\"\\\\minuso\", \"\\\\mathbin{\\\\html@mathml{\" + \"{\\\\mathrlap{\\\\mathchoice{\\\\kern{0.145em}}{\\\\kern{0.145em}}\" + \"{\\\\kern{0.1015em}}{\\\\kern{0.0725em}}\\\\circ}{-}}}\" + \"{\\\\char`⦵}}\");\ndefineMacro(\"⦵\", \"\\\\minuso\"); //////////////////////////////////////////////////////////////////////\n// texvc.sty\n// The texvc package contains macros available in mediawiki pages.\n// We omit the functions deprecated at\n// https://en.wikipedia.org/wiki/Help:Displaying_a_formula#Deprecated_syntax\n// We also omit texvc's \\O, which conflicts with \\text{\\O}\n\ndefineMacro(\"\\\\darr\", \"\\\\downarrow\");\ndefineMacro(\"\\\\dArr\", \"\\\\Downarrow\");\ndefineMacro(\"\\\\Darr\", \"\\\\Downarrow\");\ndefineMacro(\"\\\\lang\", \"\\\\langle\");\ndefineMacro(\"\\\\rang\", \"\\\\rangle\");\ndefineMacro(\"\\\\uarr\", \"\\\\uparrow\");\ndefineMacro(\"\\\\uArr\", \"\\\\Uparrow\");\ndefineMacro(\"\\\\Uarr\", \"\\\\Uparrow\");\ndefineMacro(\"\\\\N\", \"\\\\mathbb{N}\");\ndefineMacro(\"\\\\R\", \"\\\\mathbb{R}\");\ndefineMacro(\"\\\\Z\", \"\\\\mathbb{Z}\");\ndefineMacro(\"\\\\alef\", \"\\\\aleph\");\ndefineMacro(\"\\\\alefsym\", \"\\\\aleph\");\ndefineMacro(\"\\\\Alpha\", \"\\\\mathrm{A}\");\ndefineMacro(\"\\\\Beta\", \"\\\\mathrm{B}\");\ndefineMacro(\"\\\\bull\", \"\\\\bullet\");\ndefineMacro(\"\\\\Chi\", \"\\\\mathrm{X}\");\ndefineMacro(\"\\\\clubs\", \"\\\\clubsuit\");\ndefineMacro(\"\\\\cnums\", \"\\\\mathbb{C}\");\ndefineMacro(\"\\\\Complex\", \"\\\\mathbb{C}\");\ndefineMacro(\"\\\\Dagger\", \"\\\\ddagger\");\ndefineMacro(\"\\\\diamonds\", \"\\\\diamondsuit\");\ndefineMacro(\"\\\\empty\", \"\\\\emptyset\");\ndefineMacro(\"\\\\Epsilon\", \"\\\\mathrm{E}\");\ndefineMacro(\"\\\\Eta\", \"\\\\mathrm{H}\");\ndefineMacro(\"\\\\exist\", \"\\\\exists\");\ndefineMacro(\"\\\\harr\", \"\\\\leftrightarrow\");\ndefineMacro(\"\\\\hArr\", \"\\\\Leftrightarrow\");\ndefineMacro(\"\\\\Harr\", \"\\\\Leftrightarrow\");\ndefineMacro(\"\\\\hearts\", \"\\\\heartsuit\");\ndefineMacro(\"\\\\image\", \"\\\\Im\");\ndefineMacro(\"\\\\infin\", \"\\\\infty\");\ndefineMacro(\"\\\\Iota\", \"\\\\mathrm{I}\");\ndefineMacro(\"\\\\isin\", \"\\\\in\");\ndefineMacro(\"\\\\Kappa\", \"\\\\mathrm{K}\");\ndefineMacro(\"\\\\larr\", \"\\\\leftarrow\");\ndefineMacro(\"\\\\lArr\", \"\\\\Leftarrow\");\ndefineMacro(\"\\\\Larr\", \"\\\\Leftarrow\");\ndefineMacro(\"\\\\lrarr\", \"\\\\leftrightarrow\");\ndefineMacro(\"\\\\lrArr\", \"\\\\Leftrightarrow\");\ndefineMacro(\"\\\\Lrarr\", \"\\\\Leftrightarrow\");\ndefineMacro(\"\\\\Mu\", \"\\\\mathrm{M}\");\ndefineMacro(\"\\\\natnums\", \"\\\\mathbb{N}\");\ndefineMacro(\"\\\\Nu\", \"\\\\mathrm{N}\");\ndefineMacro(\"\\\\Omicron\", \"\\\\mathrm{O}\");\ndefineMacro(\"\\\\plusmn\", \"\\\\pm\");\ndefineMacro(\"\\\\rarr\", \"\\\\rightarrow\");\ndefineMacro(\"\\\\rArr\", \"\\\\Rightarrow\");\ndefineMacro(\"\\\\Rarr\", \"\\\\Rightarrow\");\ndefineMacro(\"\\\\real\", \"\\\\Re\");\ndefineMacro(\"\\\\reals\", \"\\\\mathbb{R}\");\ndefineMacro(\"\\\\Reals\", \"\\\\mathbb{R}\");\ndefineMacro(\"\\\\Rho\", \"\\\\mathrm{P}\");\ndefineMacro(\"\\\\sdot\", \"\\\\cdot\");\ndefineMacro(\"\\\\sect\", \"\\\\S\");\ndefineMacro(\"\\\\spades\", \"\\\\spadesuit\");\ndefineMacro(\"\\\\sub\", \"\\\\subset\");\ndefineMacro(\"\\\\sube\", \"\\\\subseteq\");\ndefineMacro(\"\\\\supe\", \"\\\\supseteq\");\ndefineMacro(\"\\\\Tau\", \"\\\\mathrm{T}\");\ndefineMacro(\"\\\\thetasym\", \"\\\\vartheta\"); // TODO: defineMacro(\"\\\\varcoppa\", \"\\\\\\mbox{\\\\coppa}\");\n\ndefineMacro(\"\\\\weierp\", \"\\\\wp\");\ndefineMacro(\"\\\\Zeta\", \"\\\\mathrm{Z}\"); //////////////////////////////////////////////////////////////////////\n// statmath.sty\n// https://ctan.math.illinois.edu/macros/latex/contrib/statmath/statmath.pdf\n\ndefineMacro(\"\\\\argmin\", \"\\\\DOTSB\\\\operatorname*{arg\\\\,min}\");\ndefineMacro(\"\\\\argmax\", \"\\\\DOTSB\\\\operatorname*{arg\\\\,max}\");\ndefineMacro(\"\\\\plim\", \"\\\\DOTSB\\\\mathop{\\\\operatorname{plim}}\\\\limits\"); //////////////////////////////////////////////////////////////////////\n// braket.sty\n// http://ctan.math.washington.edu/tex-archive/macros/latex/contrib/braket/braket.pdf\n\ndefineMacro(\"\\\\bra\", \"\\\\mathinner{\\\\langle{#1}|}\");\ndefineMacro(\"\\\\ket\", \"\\\\mathinner{|{#1}\\\\rangle}\");\ndefineMacro(\"\\\\braket\", \"\\\\mathinner{\\\\langle{#1}\\\\rangle}\");\ndefineMacro(\"\\\\Bra\", \"\\\\left\\\\langle#1\\\\right|\");\ndefineMacro(\"\\\\Ket\", \"\\\\left|#1\\\\right\\\\rangle\");\n\nvar braketHelper = one => context => {\n var left = context.consumeArg().tokens;\n var middle = context.consumeArg().tokens;\n var middleDouble = context.consumeArg().tokens;\n var right = context.consumeArg().tokens;\n var oldMiddle = context.macros.get(\"|\");\n var oldMiddleDouble = context.macros.get(\"\\\\|\");\n context.macros.beginGroup();\n\n var midMacro = double => context => {\n if (one) {\n // Only modify the first instance of | or \\|\n context.macros.set(\"|\", oldMiddle);\n\n if (middleDouble.length) {\n context.macros.set(\"\\\\|\", oldMiddleDouble);\n }\n }\n\n var doubled = double;\n\n if (!double && middleDouble.length) {\n // Mimic \\@ifnextchar\n var nextToken = context.future();\n\n if (nextToken.text === \"|\") {\n context.popToken();\n doubled = true;\n }\n }\n\n return {\n tokens: doubled ? middleDouble : middle,\n numArgs: 0\n };\n };\n\n context.macros.set(\"|\", midMacro(false));\n\n if (middleDouble.length) {\n context.macros.set(\"\\\\|\", midMacro(true));\n }\n\n var arg = context.consumeArg().tokens;\n var expanded = context.expandTokens([...right, ...arg, ...left // reversed\n ]);\n context.macros.endGroup();\n return {\n tokens: expanded.reverse(),\n numArgs: 0\n };\n};\n\ndefineMacro(\"\\\\bra@ket\", braketHelper(false));\ndefineMacro(\"\\\\bra@set\", braketHelper(true));\ndefineMacro(\"\\\\Braket\", \"\\\\bra@ket{\\\\left\\\\langle}\" + \"{\\\\,\\\\middle\\\\vert\\\\,}{\\\\,\\\\middle\\\\vert\\\\,}{\\\\right\\\\rangle}\");\ndefineMacro(\"\\\\Set\", \"\\\\bra@set{\\\\left\\\\{\\\\:}\" + \"{\\\\;\\\\middle\\\\vert\\\\;}{\\\\;\\\\middle\\\\Vert\\\\;}{\\\\:\\\\right\\\\}}\");\ndefineMacro(\"\\\\set\", \"\\\\bra@set{\\\\{\\\\,}{\\\\mid}{}{\\\\,\\\\}}\"); // has no support for special || or \\|\n//////////////////////////////////////////////////////////////////////\n// actuarialangle.dtx\n\ndefineMacro(\"\\\\angln\", \"{\\\\angl n}\"); // Custom Khan Academy colors, should be moved to an optional package\n\ndefineMacro(\"\\\\blue\", \"\\\\textcolor{##6495ed}{#1}\");\ndefineMacro(\"\\\\orange\", \"\\\\textcolor{##ffa500}{#1}\");\ndefineMacro(\"\\\\pink\", \"\\\\textcolor{##ff00af}{#1}\");\ndefineMacro(\"\\\\red\", \"\\\\textcolor{##df0030}{#1}\");\ndefineMacro(\"\\\\green\", \"\\\\textcolor{##28ae7b}{#1}\");\ndefineMacro(\"\\\\gray\", \"\\\\textcolor{gray}{#1}\");\ndefineMacro(\"\\\\purple\", \"\\\\textcolor{##9d38bd}{#1}\");\ndefineMacro(\"\\\\blueA\", \"\\\\textcolor{##ccfaff}{#1}\");\ndefineMacro(\"\\\\blueB\", \"\\\\textcolor{##80f6ff}{#1}\");\ndefineMacro(\"\\\\blueC\", \"\\\\textcolor{##63d9ea}{#1}\");\ndefineMacro(\"\\\\blueD\", \"\\\\textcolor{##11accd}{#1}\");\ndefineMacro(\"\\\\blueE\", \"\\\\textcolor{##0c7f99}{#1}\");\ndefineMacro(\"\\\\tealA\", \"\\\\textcolor{##94fff5}{#1}\");\ndefineMacro(\"\\\\tealB\", \"\\\\textcolor{##26edd5}{#1}\");\ndefineMacro(\"\\\\tealC\", \"\\\\textcolor{##01d1c1}{#1}\");\ndefineMacro(\"\\\\tealD\", \"\\\\textcolor{##01a995}{#1}\");\ndefineMacro(\"\\\\tealE\", \"\\\\textcolor{##208170}{#1}\");\ndefineMacro(\"\\\\greenA\", \"\\\\textcolor{##b6ffb0}{#1}\");\ndefineMacro(\"\\\\greenB\", \"\\\\textcolor{##8af281}{#1}\");\ndefineMacro(\"\\\\greenC\", \"\\\\textcolor{##74cf70}{#1}\");\ndefineMacro(\"\\\\greenD\", \"\\\\textcolor{##1fab54}{#1}\");\ndefineMacro(\"\\\\greenE\", \"\\\\textcolor{##0d923f}{#1}\");\ndefineMacro(\"\\\\goldA\", \"\\\\textcolor{##ffd0a9}{#1}\");\ndefineMacro(\"\\\\goldB\", \"\\\\textcolor{##ffbb71}{#1}\");\ndefineMacro(\"\\\\goldC\", \"\\\\textcolor{##ff9c39}{#1}\");\ndefineMacro(\"\\\\goldD\", \"\\\\textcolor{##e07d10}{#1}\");\ndefineMacro(\"\\\\goldE\", \"\\\\textcolor{##a75a05}{#1}\");\ndefineMacro(\"\\\\redA\", \"\\\\textcolor{##fca9a9}{#1}\");\ndefineMacro(\"\\\\redB\", \"\\\\textcolor{##ff8482}{#1}\");\ndefineMacro(\"\\\\redC\", \"\\\\textcolor{##f9685d}{#1}\");\ndefineMacro(\"\\\\redD\", \"\\\\textcolor{##e84d39}{#1}\");\ndefineMacro(\"\\\\redE\", \"\\\\textcolor{##bc2612}{#1}\");\ndefineMacro(\"\\\\maroonA\", \"\\\\textcolor{##ffbde0}{#1}\");\ndefineMacro(\"\\\\maroonB\", \"\\\\textcolor{##ff92c6}{#1}\");\ndefineMacro(\"\\\\maroonC\", \"\\\\textcolor{##ed5fa6}{#1}\");\ndefineMacro(\"\\\\maroonD\", \"\\\\textcolor{##ca337c}{#1}\");\ndefineMacro(\"\\\\maroonE\", \"\\\\textcolor{##9e034e}{#1}\");\ndefineMacro(\"\\\\purpleA\", \"\\\\textcolor{##ddd7ff}{#1}\");\ndefineMacro(\"\\\\purpleB\", \"\\\\textcolor{##c6b9fc}{#1}\");\ndefineMacro(\"\\\\purpleC\", \"\\\\textcolor{##aa87ff}{#1}\");\ndefineMacro(\"\\\\purpleD\", \"\\\\textcolor{##7854ab}{#1}\");\ndefineMacro(\"\\\\purpleE\", \"\\\\textcolor{##543b78}{#1}\");\ndefineMacro(\"\\\\mintA\", \"\\\\textcolor{##f5f9e8}{#1}\");\ndefineMacro(\"\\\\mintB\", \"\\\\textcolor{##edf2df}{#1}\");\ndefineMacro(\"\\\\mintC\", \"\\\\textcolor{##e0e5cc}{#1}\");\ndefineMacro(\"\\\\grayA\", \"\\\\textcolor{##f6f7f7}{#1}\");\ndefineMacro(\"\\\\grayB\", \"\\\\textcolor{##f0f1f2}{#1}\");\ndefineMacro(\"\\\\grayC\", \"\\\\textcolor{##e3e5e6}{#1}\");\ndefineMacro(\"\\\\grayD\", \"\\\\textcolor{##d6d8da}{#1}\");\ndefineMacro(\"\\\\grayE\", \"\\\\textcolor{##babec2}{#1}\");\ndefineMacro(\"\\\\grayF\", \"\\\\textcolor{##888d93}{#1}\");\ndefineMacro(\"\\\\grayG\", \"\\\\textcolor{##626569}{#1}\");\ndefineMacro(\"\\\\grayH\", \"\\\\textcolor{##3b3e40}{#1}\");\ndefineMacro(\"\\\\grayI\", \"\\\\textcolor{##21242c}{#1}\");\ndefineMacro(\"\\\\kaBlue\", \"\\\\textcolor{##314453}{#1}\");\ndefineMacro(\"\\\\kaGreen\", \"\\\\textcolor{##71B307}{#1}\");\n\n/**\n * This file contains the “gullet” where macros are expanded\n * until only non-macro tokens remain.\n */\n// List of commands that act like macros but aren't defined as a macro,\n// function, or symbol. Used in `isDefined`.\nvar implicitCommands = {\n \"^\": true,\n // Parser.js\n \"_\": true,\n // Parser.js\n \"\\\\limits\": true,\n // Parser.js\n \"\\\\nolimits\": true // Parser.js\n\n};\nclass MacroExpander {\n constructor(input, settings, mode) {\n this.settings = void 0;\n this.expansionCount = void 0;\n this.lexer = void 0;\n this.macros = void 0;\n this.stack = void 0;\n this.mode = void 0;\n this.settings = settings;\n this.expansionCount = 0;\n this.feed(input); // Make new global namespace\n\n this.macros = new Namespace(macros, settings.macros);\n this.mode = mode;\n this.stack = []; // contains tokens in REVERSE order\n }\n /**\n * Feed a new input string to the same MacroExpander\n * (with existing macros etc.).\n */\n\n\n feed(input) {\n this.lexer = new Lexer(input, this.settings);\n }\n /**\n * Switches between \"text\" and \"math\" modes.\n */\n\n\n switchMode(newMode) {\n this.mode = newMode;\n }\n /**\n * Start a new group nesting within all namespaces.\n */\n\n\n beginGroup() {\n this.macros.beginGroup();\n }\n /**\n * End current group nesting within all namespaces.\n */\n\n\n endGroup() {\n this.macros.endGroup();\n }\n /**\n * Ends all currently nested groups (if any), restoring values before the\n * groups began. Useful in case of an error in the middle of parsing.\n */\n\n\n endGroups() {\n this.macros.endGroups();\n }\n /**\n * Returns the topmost token on the stack, without expanding it.\n * Similar in behavior to TeX's `\\futurelet`.\n */\n\n\n future() {\n if (this.stack.length === 0) {\n this.pushToken(this.lexer.lex());\n }\n\n return this.stack[this.stack.length - 1];\n }\n /**\n * Remove and return the next unexpanded token.\n */\n\n\n popToken() {\n this.future(); // ensure non-empty stack\n\n return this.stack.pop();\n }\n /**\n * Add a given token to the token stack. In particular, this get be used\n * to put back a token returned from one of the other methods.\n */\n\n\n pushToken(token) {\n this.stack.push(token);\n }\n /**\n * Append an array of tokens to the token stack.\n */\n\n\n pushTokens(tokens) {\n this.stack.push(...tokens);\n }\n /**\n * Find an macro argument without expanding tokens and append the array of\n * tokens to the token stack. Uses Token as a container for the result.\n */\n\n\n scanArgument(isOptional) {\n var start;\n var end;\n var tokens;\n\n if (isOptional) {\n this.consumeSpaces(); // \\@ifnextchar gobbles any space following it\n\n if (this.future().text !== \"[\") {\n return null;\n }\n\n start = this.popToken(); // don't include [ in tokens\n\n ({\n tokens,\n end\n } = this.consumeArg([\"]\"]));\n } else {\n ({\n tokens,\n start,\n end\n } = this.consumeArg());\n } // indicate the end of an argument\n\n\n this.pushToken(new Token(\"EOF\", end.loc));\n this.pushTokens(tokens);\n return start.range(end, \"\");\n }\n /**\n * Consume all following space tokens, without expansion.\n */\n\n\n consumeSpaces() {\n for (;;) {\n var token = this.future();\n\n if (token.text === \" \") {\n this.stack.pop();\n } else {\n break;\n }\n }\n }\n /**\n * Consume an argument from the token stream, and return the resulting array\n * of tokens and start/end token.\n */\n\n\n consumeArg(delims) {\n // The argument for a delimited parameter is the shortest (possibly\n // empty) sequence of tokens with properly nested {...} groups that is\n // followed ... by this particular list of non-parameter tokens.\n // The argument for an undelimited parameter is the next nonblank\n // token, unless that token is ‘{’, when the argument will be the\n // entire {...} group that follows.\n var tokens = [];\n var isDelimited = delims && delims.length > 0;\n\n if (!isDelimited) {\n // Ignore spaces between arguments. As the TeXbook says:\n // \"After you have said ‘\\def\\row#1#2{...}’, you are allowed to\n // put spaces between the arguments (e.g., ‘\\row x n’), because\n // TeX doesn’t use single spaces as undelimited arguments.\"\n this.consumeSpaces();\n }\n\n var start = this.future();\n var tok;\n var depth = 0;\n var match = 0;\n\n do {\n tok = this.popToken();\n tokens.push(tok);\n\n if (tok.text === \"{\") {\n ++depth;\n } else if (tok.text === \"}\") {\n --depth;\n\n if (depth === -1) {\n throw new ParseError(\"Extra }\", tok);\n }\n } else if (tok.text === \"EOF\") {\n throw new ParseError(\"Unexpected end of input in a macro argument\" + \", expected '\" + (delims && isDelimited ? delims[match] : \"}\") + \"'\", tok);\n }\n\n if (delims && isDelimited) {\n if ((depth === 0 || depth === 1 && delims[match] === \"{\") && tok.text === delims[match]) {\n ++match;\n\n if (match === delims.length) {\n // don't include delims in tokens\n tokens.splice(-match, match);\n break;\n }\n } else {\n match = 0;\n }\n }\n } while (depth !== 0 || isDelimited); // If the argument found ... has the form ‘{}’,\n // ... the outermost braces enclosing the argument are removed\n\n\n if (start.text === \"{\" && tokens[tokens.length - 1].text === \"}\") {\n tokens.pop();\n tokens.shift();\n }\n\n tokens.reverse(); // to fit in with stack order\n\n return {\n tokens,\n start,\n end: tok\n };\n }\n /**\n * Consume the specified number of (delimited) arguments from the token\n * stream and return the resulting array of arguments.\n */\n\n\n consumeArgs(numArgs, delimiters) {\n if (delimiters) {\n if (delimiters.length !== numArgs + 1) {\n throw new ParseError(\"The length of delimiters doesn't match the number of args!\");\n }\n\n var delims = delimiters[0];\n\n for (var i = 0; i < delims.length; i++) {\n var tok = this.popToken();\n\n if (delims[i] !== tok.text) {\n throw new ParseError(\"Use of the macro doesn't match its definition\", tok);\n }\n }\n }\n\n var args = [];\n\n for (var _i = 0; _i < numArgs; _i++) {\n args.push(this.consumeArg(delimiters && delimiters[_i + 1]).tokens);\n }\n\n return args;\n }\n /**\n * Increment `expansionCount` by the specified amount.\n * Throw an error if it exceeds `maxExpand`.\n */\n\n\n countExpansion(amount) {\n this.expansionCount += amount;\n\n if (this.expansionCount > this.settings.maxExpand) {\n throw new ParseError(\"Too many expansions: infinite loop or \" + \"need to increase maxExpand setting\");\n }\n }\n /**\n * Expand the next token only once if possible.\n *\n * If the token is expanded, the resulting tokens will be pushed onto\n * the stack in reverse order, and the number of such tokens will be\n * returned. This number might be zero or positive.\n *\n * If not, the return value is `false`, and the next token remains at the\n * top of the stack.\n *\n * In either case, the next token will be on the top of the stack,\n * or the stack will be empty (in case of empty expansion\n * and no other tokens).\n *\n * Used to implement `expandAfterFuture` and `expandNextToken`.\n *\n * If expandableOnly, only expandable tokens are expanded and\n * an undefined control sequence results in an error.\n */\n\n\n expandOnce(expandableOnly) {\n var topToken = this.popToken();\n var name = topToken.text;\n var expansion = !topToken.noexpand ? this._getExpansion(name) : null;\n\n if (expansion == null || expandableOnly && expansion.unexpandable) {\n if (expandableOnly && expansion == null && name[0] === \"\\\\\" && !this.isDefined(name)) {\n throw new ParseError(\"Undefined control sequence: \" + name);\n }\n\n this.pushToken(topToken);\n return false;\n }\n\n this.countExpansion(1);\n var tokens = expansion.tokens;\n var args = this.consumeArgs(expansion.numArgs, expansion.delimiters);\n\n if (expansion.numArgs) {\n // paste arguments in place of the placeholders\n tokens = tokens.slice(); // make a shallow copy\n\n for (var i = tokens.length - 1; i >= 0; --i) {\n var tok = tokens[i];\n\n if (tok.text === \"#\") {\n if (i === 0) {\n throw new ParseError(\"Incomplete placeholder at end of macro body\", tok);\n }\n\n tok = tokens[--i]; // next token on stack\n\n if (tok.text === \"#\") {\n // ## → #\n tokens.splice(i + 1, 1); // drop first #\n } else if (/^[1-9]$/.test(tok.text)) {\n // replace the placeholder with the indicated argument\n tokens.splice(i, 2, ...args[+tok.text - 1]);\n } else {\n throw new ParseError(\"Not a valid argument number\", tok);\n }\n }\n }\n } // Concatenate expansion onto top of stack.\n\n\n this.pushTokens(tokens);\n return tokens.length;\n }\n /**\n * Expand the next token only once (if possible), and return the resulting\n * top token on the stack (without removing anything from the stack).\n * Similar in behavior to TeX's `\\expandafter\\futurelet`.\n * Equivalent to expandOnce() followed by future().\n */\n\n\n expandAfterFuture() {\n this.expandOnce();\n return this.future();\n }\n /**\n * Recursively expand first token, then return first non-expandable token.\n */\n\n\n expandNextToken() {\n for (;;) {\n if (this.expandOnce() === false) {\n // fully expanded\n var token = this.stack.pop(); // the token after \\noexpand is interpreted as if its meaning\n // were ‘\\relax’\n\n if (token.treatAsRelax) {\n token.text = \"\\\\relax\";\n }\n\n return token;\n }\n } // Flow unable to figure out that this pathway is impossible.\n // https://github.com/facebook/flow/issues/4808\n\n\n throw new Error(); // eslint-disable-line no-unreachable\n }\n /**\n * Fully expand the given macro name and return the resulting list of\n * tokens, or return `undefined` if no such macro is defined.\n */\n\n\n expandMacro(name) {\n return this.macros.has(name) ? this.expandTokens([new Token(name)]) : undefined;\n }\n /**\n * Fully expand the given token stream and return the resulting list of\n * tokens. Note that the input tokens are in reverse order, but the\n * output tokens are in forward order.\n */\n\n\n expandTokens(tokens) {\n var output = [];\n var oldStackLength = this.stack.length;\n this.pushTokens(tokens);\n\n while (this.stack.length > oldStackLength) {\n // Expand only expandable tokens\n if (this.expandOnce(true) === false) {\n // fully expanded\n var token = this.stack.pop();\n\n if (token.treatAsRelax) {\n // the expansion of \\noexpand is the token itself\n token.noexpand = false;\n token.treatAsRelax = false;\n }\n\n output.push(token);\n }\n } // Count all of these tokens as additional expansions, to prevent\n // exponential blowup from linearly many \\edef's.\n\n\n this.countExpansion(output.length);\n return output;\n }\n /**\n * Fully expand the given macro name and return the result as a string,\n * or return `undefined` if no such macro is defined.\n */\n\n\n expandMacroAsText(name) {\n var tokens = this.expandMacro(name);\n\n if (tokens) {\n return tokens.map(token => token.text).join(\"\");\n } else {\n return tokens;\n }\n }\n /**\n * Returns the expanded macro as a reversed array of tokens and a macro\n * argument count. Or returns `null` if no such macro.\n */\n\n\n _getExpansion(name) {\n var definition = this.macros.get(name);\n\n if (definition == null) {\n // mainly checking for undefined here\n return definition;\n } // If a single character has an associated catcode other than 13\n // (active character), then don't expand it.\n\n\n if (name.length === 1) {\n var catcode = this.lexer.catcodes[name];\n\n if (catcode != null && catcode !== 13) {\n return;\n }\n }\n\n var expansion = typeof definition === \"function\" ? definition(this) : definition;\n\n if (typeof expansion === \"string\") {\n var numArgs = 0;\n\n if (expansion.indexOf(\"#\") !== -1) {\n var stripped = expansion.replace(/##/g, \"\");\n\n while (stripped.indexOf(\"#\" + (numArgs + 1)) !== -1) {\n ++numArgs;\n }\n }\n\n var bodyLexer = new Lexer(expansion, this.settings);\n var tokens = [];\n var tok = bodyLexer.lex();\n\n while (tok.text !== \"EOF\") {\n tokens.push(tok);\n tok = bodyLexer.lex();\n }\n\n tokens.reverse(); // to fit in with stack using push and pop\n\n var expanded = {\n tokens,\n numArgs\n };\n return expanded;\n }\n\n return expansion;\n }\n /**\n * Determine whether a command is currently \"defined\" (has some\n * functionality), meaning that it's a macro (in the current group),\n * a function, a symbol, or one of the special commands listed in\n * `implicitCommands`.\n */\n\n\n isDefined(name) {\n return this.macros.has(name) || functions.hasOwnProperty(name) || symbols.math.hasOwnProperty(name) || symbols.text.hasOwnProperty(name) || implicitCommands.hasOwnProperty(name);\n }\n /**\n * Determine whether a command is expandable.\n */\n\n\n isExpandable(name) {\n var macro = this.macros.get(name);\n return macro != null ? typeof macro === \"string\" || typeof macro === \"function\" || !macro.unexpandable : functions.hasOwnProperty(name) && !functions[name].primitive;\n }\n\n}\n\n// Helpers for Parser.js handling of Unicode (sub|super)script characters.\nvar unicodeSubRegEx = /^[₊₋₌₍₎₀₁₂₃₄₅₆₇₈₉ₐₑₕᵢⱼₖₗₘₙₒₚᵣₛₜᵤᵥₓᵦᵧᵨᵩᵪ]/;\nvar uSubsAndSups = Object.freeze({\n '₊': '+',\n '₋': '-',\n '₌': '=',\n '₍': '(',\n '₎': ')',\n '₀': '0',\n '₁': '1',\n '₂': '2',\n '₃': '3',\n '₄': '4',\n '₅': '5',\n '₆': '6',\n '₇': '7',\n '₈': '8',\n '₉': '9',\n '\\u2090': 'a',\n '\\u2091': 'e',\n '\\u2095': 'h',\n '\\u1D62': 'i',\n '\\u2C7C': 'j',\n '\\u2096': 'k',\n '\\u2097': 'l',\n '\\u2098': 'm',\n '\\u2099': 'n',\n '\\u2092': 'o',\n '\\u209A': 'p',\n '\\u1D63': 'r',\n '\\u209B': 's',\n '\\u209C': 't',\n '\\u1D64': 'u',\n '\\u1D65': 'v',\n '\\u2093': 'x',\n '\\u1D66': 'β',\n '\\u1D67': 'γ',\n '\\u1D68': 'ρ',\n '\\u1D69': '\\u03d5',\n '\\u1D6A': 'χ',\n '⁺': '+',\n '⁻': '-',\n '⁼': '=',\n '⁽': '(',\n '⁾': ')',\n '⁰': '0',\n '¹': '1',\n '²': '2',\n '³': '3',\n '⁴': '4',\n '⁵': '5',\n '⁶': '6',\n '⁷': '7',\n '⁸': '8',\n '⁹': '9',\n '\\u1D2C': 'A',\n '\\u1D2E': 'B',\n '\\u1D30': 'D',\n '\\u1D31': 'E',\n '\\u1D33': 'G',\n '\\u1D34': 'H',\n '\\u1D35': 'I',\n '\\u1D36': 'J',\n '\\u1D37': 'K',\n '\\u1D38': 'L',\n '\\u1D39': 'M',\n '\\u1D3A': 'N',\n '\\u1D3C': 'O',\n '\\u1D3E': 'P',\n '\\u1D3F': 'R',\n '\\u1D40': 'T',\n '\\u1D41': 'U',\n '\\u2C7D': 'V',\n '\\u1D42': 'W',\n '\\u1D43': 'a',\n '\\u1D47': 'b',\n '\\u1D9C': 'c',\n '\\u1D48': 'd',\n '\\u1D49': 'e',\n '\\u1DA0': 'f',\n '\\u1D4D': 'g',\n '\\u02B0': 'h',\n '\\u2071': 'i',\n '\\u02B2': 'j',\n '\\u1D4F': 'k',\n '\\u02E1': 'l',\n '\\u1D50': 'm',\n '\\u207F': 'n',\n '\\u1D52': 'o',\n '\\u1D56': 'p',\n '\\u02B3': 'r',\n '\\u02E2': 's',\n '\\u1D57': 't',\n '\\u1D58': 'u',\n '\\u1D5B': 'v',\n '\\u02B7': 'w',\n '\\u02E3': 'x',\n '\\u02B8': 'y',\n '\\u1DBB': 'z',\n '\\u1D5D': 'β',\n '\\u1D5E': 'γ',\n '\\u1D5F': 'δ',\n '\\u1D60': '\\u03d5',\n '\\u1D61': 'χ',\n '\\u1DBF': 'θ'\n});\n\n/* eslint no-constant-condition:0 */\n\nvar unicodeAccents = {\n \"́\": {\n \"text\": \"\\\\'\",\n \"math\": \"\\\\acute\"\n },\n \"̀\": {\n \"text\": \"\\\\`\",\n \"math\": \"\\\\grave\"\n },\n \"̈\": {\n \"text\": \"\\\\\\\"\",\n \"math\": \"\\\\ddot\"\n },\n \"̃\": {\n \"text\": \"\\\\~\",\n \"math\": \"\\\\tilde\"\n },\n \"̄\": {\n \"text\": \"\\\\=\",\n \"math\": \"\\\\bar\"\n },\n \"̆\": {\n \"text\": \"\\\\u\",\n \"math\": \"\\\\breve\"\n },\n \"̌\": {\n \"text\": \"\\\\v\",\n \"math\": \"\\\\check\"\n },\n \"̂\": {\n \"text\": \"\\\\^\",\n \"math\": \"\\\\hat\"\n },\n \"̇\": {\n \"text\": \"\\\\.\",\n \"math\": \"\\\\dot\"\n },\n \"̊\": {\n \"text\": \"\\\\r\",\n \"math\": \"\\\\mathring\"\n },\n \"̋\": {\n \"text\": \"\\\\H\"\n },\n \"̧\": {\n \"text\": \"\\\\c\"\n }\n};\nvar unicodeSymbols = {\n \"á\": \"á\",\n \"à\": \"à\",\n \"ä\": \"ä\",\n \"ǟ\": \"ǟ\",\n \"ã\": \"ã\",\n \"ā\": \"ā\",\n \"ă\": \"ă\",\n \"ắ\": \"ắ\",\n \"ằ\": \"ằ\",\n \"ẵ\": \"ẵ\",\n \"ǎ\": \"ǎ\",\n \"â\": \"â\",\n \"ấ\": \"ấ\",\n \"ầ\": \"ầ\",\n \"ẫ\": \"ẫ\",\n \"ȧ\": \"ȧ\",\n \"ǡ\": \"ǡ\",\n \"å\": \"å\",\n \"ǻ\": \"ǻ\",\n \"ḃ\": \"ḃ\",\n \"ć\": \"ć\",\n \"ḉ\": \"ḉ\",\n \"č\": \"č\",\n \"ĉ\": \"ĉ\",\n \"ċ\": \"ċ\",\n \"ç\": \"ç\",\n \"ď\": \"ď\",\n \"ḋ\": \"ḋ\",\n \"ḑ\": \"ḑ\",\n \"é\": \"é\",\n \"è\": \"è\",\n \"ë\": \"ë\",\n \"ẽ\": \"ẽ\",\n \"ē\": \"ē\",\n \"ḗ\": \"ḗ\",\n \"ḕ\": \"ḕ\",\n \"ĕ\": \"ĕ\",\n \"ḝ\": \"ḝ\",\n \"ě\": \"ě\",\n \"ê\": \"ê\",\n \"ế\": \"ế\",\n \"ề\": \"ề\",\n \"ễ\": \"ễ\",\n \"ė\": \"ė\",\n \"ȩ\": \"ȩ\",\n \"ḟ\": \"ḟ\",\n \"ǵ\": \"ǵ\",\n \"ḡ\": \"ḡ\",\n \"ğ\": \"ğ\",\n \"ǧ\": \"ǧ\",\n \"ĝ\": \"ĝ\",\n \"ġ\": \"ġ\",\n \"ģ\": \"ģ\",\n \"ḧ\": \"ḧ\",\n \"ȟ\": \"ȟ\",\n \"ĥ\": \"ĥ\",\n \"ḣ\": \"ḣ\",\n \"ḩ\": \"ḩ\",\n \"í\": \"í\",\n \"ì\": \"ì\",\n \"ï\": \"ï\",\n \"ḯ\": \"ḯ\",\n \"ĩ\": \"ĩ\",\n \"ī\": \"ī\",\n \"ĭ\": \"ĭ\",\n \"ǐ\": \"ǐ\",\n \"î\": \"î\",\n \"ǰ\": \"ǰ\",\n \"ĵ\": \"ĵ\",\n \"ḱ\": \"ḱ\",\n \"ǩ\": \"ǩ\",\n \"ķ\": \"ķ\",\n \"ĺ\": \"ĺ\",\n \"ľ\": \"ľ\",\n \"ļ\": \"ļ\",\n \"ḿ\": \"ḿ\",\n \"ṁ\": \"ṁ\",\n \"ń\": \"ń\",\n \"ǹ\": \"ǹ\",\n \"ñ\": \"ñ\",\n \"ň\": \"ň\",\n \"ṅ\": \"ṅ\",\n \"ņ\": \"ņ\",\n \"ó\": \"ó\",\n \"ò\": \"ò\",\n \"ö\": \"ö\",\n \"ȫ\": \"ȫ\",\n \"õ\": \"õ\",\n \"ṍ\": \"ṍ\",\n \"ṏ\": \"ṏ\",\n \"ȭ\": \"ȭ\",\n \"ō\": \"ō\",\n \"ṓ\": \"ṓ\",\n \"ṑ\": \"ṑ\",\n \"ŏ\": \"ŏ\",\n \"ǒ\": \"ǒ\",\n \"ô\": \"ô\",\n \"ố\": \"ố\",\n \"ồ\": \"ồ\",\n \"ỗ\": \"ỗ\",\n \"ȯ\": \"ȯ\",\n \"ȱ\": \"ȱ\",\n \"ő\": \"ő\",\n \"ṕ\": \"ṕ\",\n \"ṗ\": \"ṗ\",\n \"ŕ\": \"ŕ\",\n \"ř\": \"ř\",\n \"ṙ\": \"ṙ\",\n \"ŗ\": \"ŗ\",\n \"ś\": \"ś\",\n \"ṥ\": \"ṥ\",\n \"š\": \"š\",\n \"ṧ\": \"ṧ\",\n \"ŝ\": \"ŝ\",\n \"ṡ\": \"ṡ\",\n \"ş\": \"ş\",\n \"ẗ\": \"ẗ\",\n \"ť\": \"ť\",\n \"ṫ\": \"ṫ\",\n \"ţ\": \"ţ\",\n \"ú\": \"ú\",\n \"ù\": \"ù\",\n \"ü\": \"ü\",\n \"ǘ\": \"ǘ\",\n \"ǜ\": \"ǜ\",\n \"ǖ\": \"ǖ\",\n \"ǚ\": \"ǚ\",\n \"ũ\": \"ũ\",\n \"ṹ\": \"ṹ\",\n \"ū\": \"ū\",\n \"ṻ\": \"ṻ\",\n \"ŭ\": \"ŭ\",\n \"ǔ\": \"ǔ\",\n \"û\": \"û\",\n \"ů\": \"ů\",\n \"ű\": \"ű\",\n \"ṽ\": \"ṽ\",\n \"ẃ\": \"ẃ\",\n \"ẁ\": \"ẁ\",\n \"ẅ\": \"ẅ\",\n \"ŵ\": \"ŵ\",\n \"ẇ\": \"ẇ\",\n \"ẘ\": \"ẘ\",\n \"ẍ\": \"ẍ\",\n \"ẋ\": \"ẋ\",\n \"ý\": \"ý\",\n \"ỳ\": \"ỳ\",\n \"ÿ\": \"ÿ\",\n \"ỹ\": \"ỹ\",\n \"ȳ\": \"ȳ\",\n \"ŷ\": \"ŷ\",\n \"ẏ\": \"ẏ\",\n \"ẙ\": \"ẙ\",\n \"ź\": \"ź\",\n \"ž\": \"ž\",\n \"ẑ\": \"ẑ\",\n \"ż\": \"ż\",\n \"Á\": \"Á\",\n \"À\": \"À\",\n \"Ä\": \"Ä\",\n \"Ǟ\": \"Ǟ\",\n \"Ã\": \"Ã\",\n \"Ā\": \"Ā\",\n \"Ă\": \"Ă\",\n \"Ắ\": \"Ắ\",\n \"Ằ\": \"Ằ\",\n \"Ẵ\": \"Ẵ\",\n \"Ǎ\": \"Ǎ\",\n \"Â\": \"Â\",\n \"Ấ\": \"Ấ\",\n \"Ầ\": \"Ầ\",\n \"Ẫ\": \"Ẫ\",\n \"Ȧ\": \"Ȧ\",\n \"Ǡ\": \"Ǡ\",\n \"Å\": \"Å\",\n \"Ǻ\": \"Ǻ\",\n \"Ḃ\": \"Ḃ\",\n \"Ć\": \"Ć\",\n \"Ḉ\": \"Ḉ\",\n \"Č\": \"Č\",\n \"Ĉ\": \"Ĉ\",\n \"Ċ\": \"Ċ\",\n \"Ç\": \"Ç\",\n \"Ď\": \"Ď\",\n \"Ḋ\": \"Ḋ\",\n \"Ḑ\": \"Ḑ\",\n \"É\": \"É\",\n \"È\": \"È\",\n \"Ë\": \"Ë\",\n \"Ẽ\": \"Ẽ\",\n \"Ē\": \"Ē\",\n \"Ḗ\": \"Ḗ\",\n \"Ḕ\": \"Ḕ\",\n \"Ĕ\": \"Ĕ\",\n \"Ḝ\": \"Ḝ\",\n \"Ě\": \"Ě\",\n \"Ê\": \"Ê\",\n \"Ế\": \"Ế\",\n \"Ề\": \"Ề\",\n \"Ễ\": \"Ễ\",\n \"Ė\": \"Ė\",\n \"Ȩ\": \"Ȩ\",\n \"Ḟ\": \"Ḟ\",\n \"Ǵ\": \"Ǵ\",\n \"Ḡ\": \"Ḡ\",\n \"Ğ\": \"Ğ\",\n \"Ǧ\": \"Ǧ\",\n \"Ĝ\": \"Ĝ\",\n \"Ġ\": \"Ġ\",\n \"Ģ\": \"Ģ\",\n \"Ḧ\": \"Ḧ\",\n \"Ȟ\": \"Ȟ\",\n \"Ĥ\": \"Ĥ\",\n \"Ḣ\": \"Ḣ\",\n \"Ḩ\": \"Ḩ\",\n \"Í\": \"Í\",\n \"Ì\": \"Ì\",\n \"Ï\": \"Ï\",\n \"Ḯ\": \"Ḯ\",\n \"Ĩ\": \"Ĩ\",\n \"Ī\": \"Ī\",\n \"Ĭ\": \"Ĭ\",\n \"Ǐ\": \"Ǐ\",\n \"Î\": \"Î\",\n \"İ\": \"İ\",\n \"Ĵ\": \"Ĵ\",\n \"Ḱ\": \"Ḱ\",\n \"Ǩ\": \"Ǩ\",\n \"Ķ\": \"Ķ\",\n \"Ĺ\": \"Ĺ\",\n \"Ľ\": \"Ľ\",\n \"Ļ\": \"Ļ\",\n \"Ḿ\": \"Ḿ\",\n \"Ṁ\": \"Ṁ\",\n \"Ń\": \"Ń\",\n \"Ǹ\": \"Ǹ\",\n \"Ñ\": \"Ñ\",\n \"Ň\": \"Ň\",\n \"Ṅ\": \"Ṅ\",\n \"Ņ\": \"Ņ\",\n \"Ó\": \"Ó\",\n \"Ò\": \"Ò\",\n \"Ö\": \"Ö\",\n \"Ȫ\": \"Ȫ\",\n \"Õ\": \"Õ\",\n \"Ṍ\": \"Ṍ\",\n \"Ṏ\": \"Ṏ\",\n \"Ȭ\": \"Ȭ\",\n \"Ō\": \"Ō\",\n \"Ṓ\": \"Ṓ\",\n \"Ṑ\": \"Ṑ\",\n \"Ŏ\": \"Ŏ\",\n \"Ǒ\": \"Ǒ\",\n \"Ô\": \"Ô\",\n \"Ố\": \"Ố\",\n \"Ồ\": \"Ồ\",\n \"Ỗ\": \"Ỗ\",\n \"Ȯ\": \"Ȯ\",\n \"Ȱ\": \"Ȱ\",\n \"Ő\": \"Ő\",\n \"Ṕ\": \"Ṕ\",\n \"Ṗ\": \"Ṗ\",\n \"Ŕ\": \"Ŕ\",\n \"Ř\": \"Ř\",\n \"Ṙ\": \"Ṙ\",\n \"Ŗ\": \"Ŗ\",\n \"Ś\": \"Ś\",\n \"Ṥ\": \"Ṥ\",\n \"Š\": \"Š\",\n \"Ṧ\": \"Ṧ\",\n \"Ŝ\": \"Ŝ\",\n \"Ṡ\": \"Ṡ\",\n \"Ş\": \"Ş\",\n \"Ť\": \"Ť\",\n \"Ṫ\": \"Ṫ\",\n \"Ţ\": \"Ţ\",\n \"Ú\": \"Ú\",\n \"Ù\": \"Ù\",\n \"Ü\": \"Ü\",\n \"Ǘ\": \"Ǘ\",\n \"Ǜ\": \"Ǜ\",\n \"Ǖ\": \"Ǖ\",\n \"Ǚ\": \"Ǚ\",\n \"Ũ\": \"Ũ\",\n \"Ṹ\": \"Ṹ\",\n \"Ū\": \"Ū\",\n \"Ṻ\": \"Ṻ\",\n \"Ŭ\": \"Ŭ\",\n \"Ǔ\": \"Ǔ\",\n \"Û\": \"Û\",\n \"Ů\": \"Ů\",\n \"Ű\": \"Ű\",\n \"Ṽ\": \"Ṽ\",\n \"Ẃ\": \"Ẃ\",\n \"Ẁ\": \"Ẁ\",\n \"Ẅ\": \"Ẅ\",\n \"Ŵ\": \"Ŵ\",\n \"Ẇ\": \"Ẇ\",\n \"Ẍ\": \"Ẍ\",\n \"Ẋ\": \"Ẋ\",\n \"Ý\": \"Ý\",\n \"Ỳ\": \"Ỳ\",\n \"Ÿ\": \"Ÿ\",\n \"Ỹ\": \"Ỹ\",\n \"Ȳ\": \"Ȳ\",\n \"Ŷ\": \"Ŷ\",\n \"Ẏ\": \"Ẏ\",\n \"Ź\": \"Ź\",\n \"Ž\": \"Ž\",\n \"Ẑ\": \"Ẑ\",\n \"Ż\": \"Ż\",\n \"ά\": \"ά\",\n \"ὰ\": \"ὰ\",\n \"ᾱ\": \"ᾱ\",\n \"ᾰ\": \"ᾰ\",\n \"έ\": \"έ\",\n \"ὲ\": \"ὲ\",\n \"ή\": \"ή\",\n \"ὴ\": \"ὴ\",\n \"ί\": \"ί\",\n \"ὶ\": \"ὶ\",\n \"ϊ\": \"ϊ\",\n \"ΐ\": \"ΐ\",\n \"ῒ\": \"ῒ\",\n \"ῑ\": \"ῑ\",\n \"ῐ\": \"ῐ\",\n \"ό\": \"ό\",\n \"ὸ\": \"ὸ\",\n \"ύ\": \"ύ\",\n \"ὺ\": \"ὺ\",\n \"ϋ\": \"ϋ\",\n \"ΰ\": \"ΰ\",\n \"ῢ\": \"ῢ\",\n \"ῡ\": \"ῡ\",\n \"ῠ\": \"ῠ\",\n \"ώ\": \"ώ\",\n \"ὼ\": \"ὼ\",\n \"Ύ\": \"Ύ\",\n \"Ὺ\": \"Ὺ\",\n \"Ϋ\": \"Ϋ\",\n \"Ῡ\": \"Ῡ\",\n \"Ῠ\": \"Ῠ\",\n \"Ώ\": \"Ώ\",\n \"Ὼ\": \"Ὼ\"\n};\n\n/**\n * This file contains the parser used to parse out a TeX expression from the\n * input. Since TeX isn't context-free, standard parsers don't work particularly\n * well.\n *\n * The strategy of this parser is as such:\n *\n * The main functions (the `.parse...` ones) take a position in the current\n * parse string to parse tokens from. The lexer (found in Lexer.js, stored at\n * this.gullet.lexer) also supports pulling out tokens at arbitrary places. When\n * individual tokens are needed at a position, the lexer is called to pull out a\n * token, which is then used.\n *\n * The parser has a property called \"mode\" indicating the mode that\n * the parser is currently in. Currently it has to be one of \"math\" or\n * \"text\", which denotes whether the current environment is a math-y\n * one or a text-y one (e.g. inside \\text). Currently, this serves to\n * limit the functions which can be used in text mode.\n *\n * The main functions then return an object which contains the useful data that\n * was parsed at its given point, and a new position at the end of the parsed\n * data. The main functions can call each other and continue the parsing by\n * using the returned position as a new starting point.\n *\n * There are also extra `.handle...` functions, which pull out some reused\n * functionality into self-contained functions.\n *\n * The functions return ParseNodes.\n */\nclass Parser {\n constructor(input, settings) {\n this.mode = void 0;\n this.gullet = void 0;\n this.settings = void 0;\n this.leftrightDepth = void 0;\n this.nextToken = void 0;\n // Start in math mode\n this.mode = \"math\"; // Create a new macro expander (gullet) and (indirectly via that) also a\n // new lexer (mouth) for this parser (stomach, in the language of TeX)\n\n this.gullet = new MacroExpander(input, settings, this.mode); // Store the settings for use in parsing\n\n this.settings = settings; // Count leftright depth (for \\middle errors)\n\n this.leftrightDepth = 0;\n }\n /**\n * Checks a result to make sure it has the right type, and throws an\n * appropriate error otherwise.\n */\n\n\n expect(text, consume) {\n if (consume === void 0) {\n consume = true;\n }\n\n if (this.fetch().text !== text) {\n throw new ParseError(\"Expected '\" + text + \"', got '\" + this.fetch().text + \"'\", this.fetch());\n }\n\n if (consume) {\n this.consume();\n }\n }\n /**\n * Discards the current lookahead token, considering it consumed.\n */\n\n\n consume() {\n this.nextToken = null;\n }\n /**\n * Return the current lookahead token, or if there isn't one (at the\n * beginning, or if the previous lookahead token was consume()d),\n * fetch the next token as the new lookahead token and return it.\n */\n\n\n fetch() {\n if (this.nextToken == null) {\n this.nextToken = this.gullet.expandNextToken();\n }\n\n return this.nextToken;\n }\n /**\n * Switches between \"text\" and \"math\" modes.\n */\n\n\n switchMode(newMode) {\n this.mode = newMode;\n this.gullet.switchMode(newMode);\n }\n /**\n * Main parsing function, which parses an entire input.\n */\n\n\n parse() {\n if (!this.settings.globalGroup) {\n // Create a group namespace for the math expression.\n // (LaTeX creates a new group for every $...$, $$...$$, \\[...\\].)\n this.gullet.beginGroup();\n } // Use old \\color behavior (same as LaTeX's \\textcolor) if requested.\n // We do this within the group for the math expression, so it doesn't\n // pollute settings.macros.\n\n\n if (this.settings.colorIsTextColor) {\n this.gullet.macros.set(\"\\\\color\", \"\\\\textcolor\");\n }\n\n try {\n // Try to parse the input\n var parse = this.parseExpression(false); // If we succeeded, make sure there's an EOF at the end\n\n this.expect(\"EOF\"); // End the group namespace for the expression\n\n if (!this.settings.globalGroup) {\n this.gullet.endGroup();\n }\n\n return parse; // Close any leftover groups in case of a parse error.\n } finally {\n this.gullet.endGroups();\n }\n }\n /**\n * Fully parse a separate sequence of tokens as a separate job.\n * Tokens should be specified in reverse order, as in a MacroDefinition.\n */\n\n\n subparse(tokens) {\n // Save the next token from the current job.\n var oldToken = this.nextToken;\n this.consume(); // Run the new job, terminating it with an excess '}'\n\n this.gullet.pushToken(new Token(\"}\"));\n this.gullet.pushTokens(tokens);\n var parse = this.parseExpression(false);\n this.expect(\"}\"); // Restore the next token from the current job.\n\n this.nextToken = oldToken;\n return parse;\n }\n\n /**\n * Parses an \"expression\", which is a list of atoms.\n *\n * `breakOnInfix`: Should the parsing stop when we hit infix nodes? This\n * happens when functions have higher precedence han infix\n * nodes in implicit parses.\n *\n * `breakOnTokenText`: The text of the token that the expression should end\n * with, or `null` if something else should end the\n * expression.\n */\n parseExpression(breakOnInfix, breakOnTokenText) {\n var body = []; // Keep adding atoms to the body until we can't parse any more atoms (either\n // we reached the end, a }, or a \\right)\n\n while (true) {\n // Ignore spaces in math mode\n if (this.mode === \"math\") {\n this.consumeSpaces();\n }\n\n var lex = this.fetch();\n\n if (Parser.endOfExpression.indexOf(lex.text) !== -1) {\n break;\n }\n\n if (breakOnTokenText && lex.text === breakOnTokenText) {\n break;\n }\n\n if (breakOnInfix && functions[lex.text] && functions[lex.text].infix) {\n break;\n }\n\n var atom = this.parseAtom(breakOnTokenText);\n\n if (!atom) {\n break;\n } else if (atom.type === \"internal\") {\n continue;\n }\n\n body.push(atom);\n }\n\n if (this.mode === \"text\") {\n this.formLigatures(body);\n }\n\n return this.handleInfixNodes(body);\n }\n /**\n * Rewrites infix operators such as \\over with corresponding commands such\n * as \\frac.\n *\n * There can only be one infix operator per group. If there's more than one\n * then the expression is ambiguous. This can be resolved by adding {}.\n */\n\n\n handleInfixNodes(body) {\n var overIndex = -1;\n var funcName;\n\n for (var i = 0; i < body.length; i++) {\n if (body[i].type === \"infix\") {\n if (overIndex !== -1) {\n throw new ParseError(\"only one infix operator per group\", body[i].token);\n }\n\n overIndex = i;\n funcName = body[i].replaceWith;\n }\n }\n\n if (overIndex !== -1 && funcName) {\n var numerNode;\n var denomNode;\n var numerBody = body.slice(0, overIndex);\n var denomBody = body.slice(overIndex + 1);\n\n if (numerBody.length === 1 && numerBody[0].type === \"ordgroup\") {\n numerNode = numerBody[0];\n } else {\n numerNode = {\n type: \"ordgroup\",\n mode: this.mode,\n body: numerBody\n };\n }\n\n if (denomBody.length === 1 && denomBody[0].type === \"ordgroup\") {\n denomNode = denomBody[0];\n } else {\n denomNode = {\n type: \"ordgroup\",\n mode: this.mode,\n body: denomBody\n };\n }\n\n var node;\n\n if (funcName === \"\\\\\\\\abovefrac\") {\n node = this.callFunction(funcName, [numerNode, body[overIndex], denomNode], []);\n } else {\n node = this.callFunction(funcName, [numerNode, denomNode], []);\n }\n\n return [node];\n } else {\n return body;\n }\n }\n /**\n * Handle a subscript or superscript with nice errors.\n */\n\n\n handleSupSubscript(name // For error reporting.\n ) {\n var symbolToken = this.fetch();\n var symbol = symbolToken.text;\n this.consume();\n this.consumeSpaces(); // ignore spaces before sup/subscript argument\n\n var group = this.parseGroup(name);\n\n if (!group) {\n throw new ParseError(\"Expected group after '\" + symbol + \"'\", symbolToken);\n }\n\n return group;\n }\n /**\n * Converts the textual input of an unsupported command into a text node\n * contained within a color node whose color is determined by errorColor\n */\n\n\n formatUnsupportedCmd(text) {\n var textordArray = [];\n\n for (var i = 0; i < text.length; i++) {\n textordArray.push({\n type: \"textord\",\n mode: \"text\",\n text: text[i]\n });\n }\n\n var textNode = {\n type: \"text\",\n mode: this.mode,\n body: textordArray\n };\n var colorNode = {\n type: \"color\",\n mode: this.mode,\n color: this.settings.errorColor,\n body: [textNode]\n };\n return colorNode;\n }\n /**\n * Parses a group with optional super/subscripts.\n */\n\n\n parseAtom(breakOnTokenText) {\n // The body of an atom is an implicit group, so that things like\n // \\left(x\\right)^2 work correctly.\n var base = this.parseGroup(\"atom\", breakOnTokenText); // In text mode, we don't have superscripts or subscripts\n\n if (this.mode === \"text\") {\n return base;\n } // Note that base may be empty (i.e. null) at this point.\n\n\n var superscript;\n var subscript;\n\n while (true) {\n // Guaranteed in math mode, so eat any spaces first.\n this.consumeSpaces(); // Lex the first token\n\n var lex = this.fetch();\n\n if (lex.text === \"\\\\limits\" || lex.text === \"\\\\nolimits\") {\n // We got a limit control\n if (base && base.type === \"op\") {\n var limits = lex.text === \"\\\\limits\";\n base.limits = limits;\n base.alwaysHandleSupSub = true;\n } else if (base && base.type === \"operatorname\") {\n if (base.alwaysHandleSupSub) {\n base.limits = lex.text === \"\\\\limits\";\n }\n } else {\n throw new ParseError(\"Limit controls must follow a math operator\", lex);\n }\n\n this.consume();\n } else if (lex.text === \"^\") {\n // We got a superscript start\n if (superscript) {\n throw new ParseError(\"Double superscript\", lex);\n }\n\n superscript = this.handleSupSubscript(\"superscript\");\n } else if (lex.text === \"_\") {\n // We got a subscript start\n if (subscript) {\n throw new ParseError(\"Double subscript\", lex);\n }\n\n subscript = this.handleSupSubscript(\"subscript\");\n } else if (lex.text === \"'\") {\n // We got a prime\n if (superscript) {\n throw new ParseError(\"Double superscript\", lex);\n }\n\n var prime = {\n type: \"textord\",\n mode: this.mode,\n text: \"\\\\prime\"\n }; // Many primes can be grouped together, so we handle this here\n\n var primes = [prime];\n this.consume(); // Keep lexing tokens until we get something that's not a prime\n\n while (this.fetch().text === \"'\") {\n // For each one, add another prime to the list\n primes.push(prime);\n this.consume();\n } // If there's a superscript following the primes, combine that\n // superscript in with the primes.\n\n\n if (this.fetch().text === \"^\") {\n primes.push(this.handleSupSubscript(\"superscript\"));\n } // Put everything into an ordgroup as the superscript\n\n\n superscript = {\n type: \"ordgroup\",\n mode: this.mode,\n body: primes\n };\n } else if (uSubsAndSups[lex.text]) {\n // A Unicode subscript or superscript character.\n // We treat these similarly to the unicode-math package.\n // So we render a string of Unicode (sub|super)scripts the\n // same as a (sub|super)script of regular characters.\n var isSub = unicodeSubRegEx.test(lex.text);\n var subsupTokens = [];\n subsupTokens.push(new Token(uSubsAndSups[lex.text]));\n this.consume(); // Continue fetching tokens to fill out the string.\n\n while (true) {\n var token = this.fetch().text;\n\n if (!uSubsAndSups[token]) {\n break;\n }\n\n if (unicodeSubRegEx.test(token) !== isSub) {\n break;\n }\n\n subsupTokens.unshift(new Token(uSubsAndSups[token]));\n this.consume();\n } // Now create a (sub|super)script.\n\n\n var body = this.subparse(subsupTokens);\n\n if (isSub) {\n subscript = {\n type: \"ordgroup\",\n mode: \"math\",\n body\n };\n } else {\n superscript = {\n type: \"ordgroup\",\n mode: \"math\",\n body\n };\n }\n } else {\n // If it wasn't ^, _, or ', stop parsing super/subscripts\n break;\n }\n } // Base must be set if superscript or subscript are set per logic above,\n // but need to check here for type check to pass.\n\n\n if (superscript || subscript) {\n // If we got either a superscript or subscript, create a supsub\n return {\n type: \"supsub\",\n mode: this.mode,\n base: base,\n sup: superscript,\n sub: subscript\n };\n } else {\n // Otherwise return the original body\n return base;\n }\n }\n /**\n * Parses an entire function, including its base and all of its arguments.\n */\n\n\n parseFunction(breakOnTokenText, name // For determining its context\n ) {\n var token = this.fetch();\n var func = token.text;\n var funcData = functions[func];\n\n if (!funcData) {\n return null;\n }\n\n this.consume(); // consume command token\n\n if (name && name !== \"atom\" && !funcData.allowedInArgument) {\n throw new ParseError(\"Got function '\" + func + \"' with no arguments\" + (name ? \" as \" + name : \"\"), token);\n } else if (this.mode === \"text\" && !funcData.allowedInText) {\n throw new ParseError(\"Can't use function '\" + func + \"' in text mode\", token);\n } else if (this.mode === \"math\" && funcData.allowedInMath === false) {\n throw new ParseError(\"Can't use function '\" + func + \"' in math mode\", token);\n }\n\n var {\n args,\n optArgs\n } = this.parseArguments(func, funcData);\n return this.callFunction(func, args, optArgs, token, breakOnTokenText);\n }\n /**\n * Call a function handler with a suitable context and arguments.\n */\n\n\n callFunction(name, args, optArgs, token, breakOnTokenText) {\n var context = {\n funcName: name,\n parser: this,\n token,\n breakOnTokenText\n };\n var func = functions[name];\n\n if (func && func.handler) {\n return func.handler(context, args, optArgs);\n } else {\n throw new ParseError(\"No function handler for \" + name);\n }\n }\n /**\n * Parses the arguments of a function or environment\n */\n\n\n parseArguments(func, // Should look like \"\\name\" or \"\\begin{name}\".\n funcData) {\n var totalArgs = funcData.numArgs + funcData.numOptionalArgs;\n\n if (totalArgs === 0) {\n return {\n args: [],\n optArgs: []\n };\n }\n\n var args = [];\n var optArgs = [];\n\n for (var i = 0; i < totalArgs; i++) {\n var argType = funcData.argTypes && funcData.argTypes[i];\n var isOptional = i < funcData.numOptionalArgs;\n\n if (funcData.primitive && argType == null || // \\sqrt expands into primitive if optional argument doesn't exist\n funcData.type === \"sqrt\" && i === 1 && optArgs[0] == null) {\n argType = \"primitive\";\n }\n\n var arg = this.parseGroupOfType(\"argument to '\" + func + \"'\", argType, isOptional);\n\n if (isOptional) {\n optArgs.push(arg);\n } else if (arg != null) {\n args.push(arg);\n } else {\n // should be unreachable\n throw new ParseError(\"Null argument, please report this as a bug\");\n }\n }\n\n return {\n args,\n optArgs\n };\n }\n /**\n * Parses a group when the mode is changing.\n */\n\n\n parseGroupOfType(name, type, optional) {\n switch (type) {\n case \"color\":\n return this.parseColorGroup(optional);\n\n case \"size\":\n return this.parseSizeGroup(optional);\n\n case \"url\":\n return this.parseUrlGroup(optional);\n\n case \"math\":\n case \"text\":\n return this.parseArgumentGroup(optional, type);\n\n case \"hbox\":\n {\n // hbox argument type wraps the argument in the equivalent of\n // \\hbox, which is like \\text but switching to \\textstyle size.\n var group = this.parseArgumentGroup(optional, \"text\");\n return group != null ? {\n type: \"styling\",\n mode: group.mode,\n body: [group],\n style: \"text\" // simulate \\textstyle\n\n } : null;\n }\n\n case \"raw\":\n {\n var token = this.parseStringGroup(\"raw\", optional);\n return token != null ? {\n type: \"raw\",\n mode: \"text\",\n string: token.text\n } : null;\n }\n\n case \"primitive\":\n {\n if (optional) {\n throw new ParseError(\"A primitive argument cannot be optional\");\n }\n\n var _group = this.parseGroup(name);\n\n if (_group == null) {\n throw new ParseError(\"Expected group as \" + name, this.fetch());\n }\n\n return _group;\n }\n\n case \"original\":\n case null:\n case undefined:\n return this.parseArgumentGroup(optional);\n\n default:\n throw new ParseError(\"Unknown group type as \" + name, this.fetch());\n }\n }\n /**\n * Discard any space tokens, fetching the next non-space token.\n */\n\n\n consumeSpaces() {\n while (this.fetch().text === \" \") {\n this.consume();\n }\n }\n /**\n * Parses a group, essentially returning the string formed by the\n * brace-enclosed tokens plus some position information.\n */\n\n\n parseStringGroup(modeName, // Used to describe the mode in error messages.\n optional) {\n var argToken = this.gullet.scanArgument(optional);\n\n if (argToken == null) {\n return null;\n }\n\n var str = \"\";\n var nextToken;\n\n while ((nextToken = this.fetch()).text !== \"EOF\") {\n str += nextToken.text;\n this.consume();\n }\n\n this.consume(); // consume the end of the argument\n\n argToken.text = str;\n return argToken;\n }\n /**\n * Parses a regex-delimited group: the largest sequence of tokens\n * whose concatenated strings match `regex`. Returns the string\n * formed by the tokens plus some position information.\n */\n\n\n parseRegexGroup(regex, modeName // Used to describe the mode in error messages.\n ) {\n var firstToken = this.fetch();\n var lastToken = firstToken;\n var str = \"\";\n var nextToken;\n\n while ((nextToken = this.fetch()).text !== \"EOF\" && regex.test(str + nextToken.text)) {\n lastToken = nextToken;\n str += lastToken.text;\n this.consume();\n }\n\n if (str === \"\") {\n throw new ParseError(\"Invalid \" + modeName + \": '\" + firstToken.text + \"'\", firstToken);\n }\n\n return firstToken.range(lastToken, str);\n }\n /**\n * Parses a color description.\n */\n\n\n parseColorGroup(optional) {\n var res = this.parseStringGroup(\"color\", optional);\n\n if (res == null) {\n return null;\n }\n\n var match = /^(#[a-f0-9]{3}|#?[a-f0-9]{6}|[a-z]+)$/i.exec(res.text);\n\n if (!match) {\n throw new ParseError(\"Invalid color: '\" + res.text + \"'\", res);\n }\n\n var color = match[0];\n\n if (/^[0-9a-f]{6}$/i.test(color)) {\n // We allow a 6-digit HTML color spec without a leading \"#\".\n // This follows the xcolor package's HTML color model.\n // Predefined color names are all missed by this RegEx pattern.\n color = \"#\" + color;\n }\n\n return {\n type: \"color-token\",\n mode: this.mode,\n color\n };\n }\n /**\n * Parses a size specification, consisting of magnitude and unit.\n */\n\n\n parseSizeGroup(optional) {\n var res;\n var isBlank = false; // don't expand before parseStringGroup\n\n this.gullet.consumeSpaces();\n\n if (!optional && this.gullet.future().text !== \"{\") {\n res = this.parseRegexGroup(/^[-+]? *(?:$|\\d+|\\d+\\.\\d*|\\.\\d*) *[a-z]{0,2} *$/, \"size\");\n } else {\n res = this.parseStringGroup(\"size\", optional);\n }\n\n if (!res) {\n return null;\n }\n\n if (!optional && res.text.length === 0) {\n // Because we've tested for what is !optional, this block won't\n // affect \\kern, \\hspace, etc. It will capture the mandatory arguments\n // to \\genfrac and \\above.\n res.text = \"0pt\"; // Enable \\above{}\n\n isBlank = true; // This is here specifically for \\genfrac\n }\n\n var match = /([-+]?) *(\\d+(?:\\.\\d*)?|\\.\\d+) *([a-z]{2})/.exec(res.text);\n\n if (!match) {\n throw new ParseError(\"Invalid size: '\" + res.text + \"'\", res);\n }\n\n var data = {\n number: +(match[1] + match[2]),\n // sign + magnitude, cast to number\n unit: match[3]\n };\n\n if (!validUnit(data)) {\n throw new ParseError(\"Invalid unit: '\" + data.unit + \"'\", res);\n }\n\n return {\n type: \"size\",\n mode: this.mode,\n value: data,\n isBlank\n };\n }\n /**\n * Parses an URL, checking escaped letters and allowed protocols,\n * and setting the catcode of % as an active character (as in \\hyperref).\n */\n\n\n parseUrlGroup(optional) {\n this.gullet.lexer.setCatcode(\"%\", 13); // active character\n\n this.gullet.lexer.setCatcode(\"~\", 12); // other character\n\n var res = this.parseStringGroup(\"url\", optional);\n this.gullet.lexer.setCatcode(\"%\", 14); // comment character\n\n this.gullet.lexer.setCatcode(\"~\", 13); // active character\n\n if (res == null) {\n return null;\n } // hyperref package allows backslashes alone in href, but doesn't\n // generate valid links in such cases; we interpret this as\n // \"undefined\" behaviour, and keep them as-is. Some browser will\n // replace backslashes with forward slashes.\n\n\n var url = res.text.replace(/\\\\([#$%&~_^{}])/g, '$1');\n return {\n type: \"url\",\n mode: this.mode,\n url\n };\n }\n /**\n * Parses an argument with the mode specified.\n */\n\n\n parseArgumentGroup(optional, mode) {\n var argToken = this.gullet.scanArgument(optional);\n\n if (argToken == null) {\n return null;\n }\n\n var outerMode = this.mode;\n\n if (mode) {\n // Switch to specified mode\n this.switchMode(mode);\n }\n\n this.gullet.beginGroup();\n var expression = this.parseExpression(false, \"EOF\"); // TODO: find an alternative way to denote the end\n\n this.expect(\"EOF\"); // expect the end of the argument\n\n this.gullet.endGroup();\n var result = {\n type: \"ordgroup\",\n mode: this.mode,\n loc: argToken.loc,\n body: expression\n };\n\n if (mode) {\n // Switch mode back\n this.switchMode(outerMode);\n }\n\n return result;\n }\n /**\n * Parses an ordinary group, which is either a single nucleus (like \"x\")\n * or an expression in braces (like \"{x+y}\") or an implicit group, a group\n * that starts at the current position, and ends right before a higher explicit\n * group ends, or at EOF.\n */\n\n\n parseGroup(name, // For error reporting.\n breakOnTokenText) {\n var firstToken = this.fetch();\n var text = firstToken.text;\n var result; // Try to parse an open brace or \\begingroup\n\n if (text === \"{\" || text === \"\\\\begingroup\") {\n this.consume();\n var groupEnd = text === \"{\" ? \"}\" : \"\\\\endgroup\";\n this.gullet.beginGroup(); // If we get a brace, parse an expression\n\n var expression = this.parseExpression(false, groupEnd);\n var lastToken = this.fetch();\n this.expect(groupEnd); // Check that we got a matching closing brace\n\n this.gullet.endGroup();\n result = {\n type: \"ordgroup\",\n mode: this.mode,\n loc: SourceLocation.range(firstToken, lastToken),\n body: expression,\n // A group formed by \\begingroup...\\endgroup is a semi-simple group\n // which doesn't affect spacing in math mode, i.e., is transparent.\n // https://tex.stackexchange.com/questions/1930/when-should-one-\n // use-begingroup-instead-of-bgroup\n semisimple: text === \"\\\\begingroup\" || undefined\n };\n } else {\n // If there exists a function with this name, parse the function.\n // Otherwise, just return a nucleus\n result = this.parseFunction(breakOnTokenText, name) || this.parseSymbol();\n\n if (result == null && text[0] === \"\\\\\" && !implicitCommands.hasOwnProperty(text)) {\n if (this.settings.throwOnError) {\n throw new ParseError(\"Undefined control sequence: \" + text, firstToken);\n }\n\n result = this.formatUnsupportedCmd(text);\n this.consume();\n }\n }\n\n return result;\n }\n /**\n * Form ligature-like combinations of characters for text mode.\n * This includes inputs like \"--\", \"---\", \"``\" and \"''\".\n * The result will simply replace multiple textord nodes with a single\n * character in each value by a single textord node having multiple\n * characters in its value. The representation is still ASCII source.\n * The group will be modified in place.\n */\n\n\n formLigatures(group) {\n var n = group.length - 1;\n\n for (var i = 0; i < n; ++i) {\n var a = group[i]; // $FlowFixMe: Not every node type has a `text` property.\n\n var v = a.text;\n\n if (v === \"-\" && group[i + 1].text === \"-\") {\n if (i + 1 < n && group[i + 2].text === \"-\") {\n group.splice(i, 3, {\n type: \"textord\",\n mode: \"text\",\n loc: SourceLocation.range(a, group[i + 2]),\n text: \"---\"\n });\n n -= 2;\n } else {\n group.splice(i, 2, {\n type: \"textord\",\n mode: \"text\",\n loc: SourceLocation.range(a, group[i + 1]),\n text: \"--\"\n });\n n -= 1;\n }\n }\n\n if ((v === \"'\" || v === \"`\") && group[i + 1].text === v) {\n group.splice(i, 2, {\n type: \"textord\",\n mode: \"text\",\n loc: SourceLocation.range(a, group[i + 1]),\n text: v + v\n });\n n -= 1;\n }\n }\n }\n /**\n * Parse a single symbol out of the string. Here, we handle single character\n * symbols and special functions like \\verb.\n */\n\n\n parseSymbol() {\n var nucleus = this.fetch();\n var text = nucleus.text;\n\n if (/^\\\\verb[^a-zA-Z]/.test(text)) {\n this.consume();\n var arg = text.slice(5);\n var star = arg.charAt(0) === \"*\";\n\n if (star) {\n arg = arg.slice(1);\n } // Lexer's tokenRegex is constructed to always have matching\n // first/last characters.\n\n\n if (arg.length < 2 || arg.charAt(0) !== arg.slice(-1)) {\n throw new ParseError(\"\\\\verb assertion failed --\\n please report what input caused this bug\");\n }\n\n arg = arg.slice(1, -1); // remove first and last char\n\n return {\n type: \"verb\",\n mode: \"text\",\n body: arg,\n star\n };\n } // At this point, we should have a symbol, possibly with accents.\n // First expand any accented base symbol according to unicodeSymbols.\n\n\n if (unicodeSymbols.hasOwnProperty(text[0]) && !symbols[this.mode][text[0]]) {\n // This behavior is not strict (XeTeX-compatible) in math mode.\n if (this.settings.strict && this.mode === \"math\") {\n this.settings.reportNonstrict(\"unicodeTextInMathMode\", \"Accented Unicode text character \\\"\" + text[0] + \"\\\" used in \" + \"math mode\", nucleus);\n }\n\n text = unicodeSymbols[text[0]] + text.slice(1);\n } // Strip off any combining characters\n\n\n var match = combiningDiacriticalMarksEndRegex.exec(text);\n\n if (match) {\n text = text.substring(0, match.index);\n\n if (text === 'i') {\n text = '\\u0131'; // dotless i, in math and text mode\n } else if (text === 'j') {\n text = '\\u0237'; // dotless j, in math and text mode\n }\n } // Recognize base symbol\n\n\n var symbol;\n\n if (symbols[this.mode][text]) {\n if (this.settings.strict && this.mode === 'math' && extraLatin.indexOf(text) >= 0) {\n this.settings.reportNonstrict(\"unicodeTextInMathMode\", \"Latin-1/Unicode text character \\\"\" + text[0] + \"\\\" used in \" + \"math mode\", nucleus);\n }\n\n var group = symbols[this.mode][text].group;\n var loc = SourceLocation.range(nucleus);\n var s;\n\n if (ATOMS.hasOwnProperty(group)) {\n // $FlowFixMe\n var family = group;\n s = {\n type: \"atom\",\n mode: this.mode,\n family,\n loc,\n text\n };\n } else {\n // $FlowFixMe\n s = {\n type: group,\n mode: this.mode,\n loc,\n text\n };\n } // $FlowFixMe\n\n\n symbol = s;\n } else if (text.charCodeAt(0) >= 0x80) {\n // no symbol for e.g. ^\n if (this.settings.strict) {\n if (!supportedCodepoint(text.charCodeAt(0))) {\n this.settings.reportNonstrict(\"unknownSymbol\", \"Unrecognized Unicode character \\\"\" + text[0] + \"\\\"\" + (\" (\" + text.charCodeAt(0) + \")\"), nucleus);\n } else if (this.mode === \"math\") {\n this.settings.reportNonstrict(\"unicodeTextInMathMode\", \"Unicode text character \\\"\" + text[0] + \"\\\" used in math mode\", nucleus);\n }\n } // All nonmathematical Unicode characters are rendered as if they\n // are in text mode (wrapped in \\text) because that's what it\n // takes to render them in LaTeX. Setting `mode: this.mode` is\n // another natural choice (the user requested math mode), but\n // this makes it more difficult for getCharacterMetrics() to\n // distinguish Unicode characters without metrics and those for\n // which we want to simulate the letter M.\n\n\n symbol = {\n type: \"textord\",\n mode: \"text\",\n loc: SourceLocation.range(nucleus),\n text\n };\n } else {\n return null; // EOF, ^, _, {, }, etc.\n }\n\n this.consume(); // Transform combining characters into accents\n\n if (match) {\n for (var i = 0; i < match[0].length; i++) {\n var accent = match[0][i];\n\n if (!unicodeAccents[accent]) {\n throw new ParseError(\"Unknown accent ' \" + accent + \"'\", nucleus);\n }\n\n var command = unicodeAccents[accent][this.mode] || unicodeAccents[accent].text;\n\n if (!command) {\n throw new ParseError(\"Accent \" + accent + \" unsupported in \" + this.mode + \" mode\", nucleus);\n }\n\n symbol = {\n type: \"accent\",\n mode: this.mode,\n loc: SourceLocation.range(nucleus),\n label: command,\n isStretchy: false,\n isShifty: true,\n // $FlowFixMe\n base: symbol\n };\n }\n } // $FlowFixMe\n\n\n return symbol;\n }\n\n}\nParser.endOfExpression = [\"}\", \"\\\\endgroup\", \"\\\\end\", \"\\\\right\", \"&\"];\n\n/**\n * Provides a single function for parsing an expression using a Parser\n * TODO(emily): Remove this\n */\n\n/**\n * Parses an expression using a Parser, then returns the parsed result.\n */\nvar parseTree = function parseTree(toParse, settings) {\n if (!(typeof toParse === 'string' || toParse instanceof String)) {\n throw new TypeError('KaTeX can only parse string typed expression');\n }\n\n var parser = new Parser(toParse, settings); // Blank out any \\df@tag to avoid spurious \"Duplicate \\tag\" errors\n\n delete parser.gullet.macros.current[\"\\\\df@tag\"];\n var tree = parser.parse(); // Prevent a color definition from persisting between calls to katex.render().\n\n delete parser.gullet.macros.current[\"\\\\current@color\"];\n delete parser.gullet.macros.current[\"\\\\color\"]; // If the input used \\tag, it will set the \\df@tag macro to the tag.\n // In this case, we separately parse the tag and wrap the tree.\n\n if (parser.gullet.macros.get(\"\\\\df@tag\")) {\n if (!settings.displayMode) {\n throw new ParseError(\"\\\\tag works only in display equations\");\n }\n\n tree = [{\n type: \"tag\",\n mode: \"text\",\n body: tree,\n tag: parser.subparse([new Token(\"\\\\df@tag\")])\n }];\n }\n\n return tree;\n};\n\n/* eslint no-console:0 */\n\n/**\n * Parse and build an expression, and place that expression in the DOM node\n * given.\n */\nvar render = function render(expression, baseNode, options) {\n baseNode.textContent = \"\";\n var node = renderToDomTree(expression, options).toNode();\n baseNode.appendChild(node);\n}; // KaTeX's styles don't work properly in quirks mode. Print out an error, and\n// disable rendering.\n\n\nif (typeof document !== \"undefined\") {\n if (document.compatMode !== \"CSS1Compat\") {\n typeof console !== \"undefined\" && console.warn(\"Warning: KaTeX doesn't work in quirks mode. Make sure your \" + \"website has a suitable doctype.\");\n\n render = function render() {\n throw new ParseError(\"KaTeX doesn't work in quirks mode.\");\n };\n }\n}\n/**\n * Parse and build an expression, and return the markup for that.\n */\n\n\nvar renderToString = function renderToString(expression, options) {\n var markup = renderToDomTree(expression, options).toMarkup();\n return markup;\n};\n/**\n * Parse an expression and return the parse tree.\n */\n\n\nvar generateParseTree = function generateParseTree(expression, options) {\n var settings = new Settings(options);\n return parseTree(expression, settings);\n};\n/**\n * If the given error is a KaTeX ParseError and options.throwOnError is false,\n * renders the invalid LaTeX as a span with hover title giving the KaTeX\n * error message. Otherwise, simply throws the error.\n */\n\n\nvar renderError = function renderError(error, expression, options) {\n if (options.throwOnError || !(error instanceof ParseError)) {\n throw error;\n }\n\n var node = buildCommon.makeSpan([\"katex-error\"], [new SymbolNode(expression)]);\n node.setAttribute(\"title\", error.toString());\n node.setAttribute(\"style\", \"color:\" + options.errorColor);\n return node;\n};\n/**\n * Generates and returns the katex build tree. This is used for advanced\n * use cases (like rendering to custom output).\n */\n\n\nvar renderToDomTree = function renderToDomTree(expression, options) {\n var settings = new Settings(options);\n\n try {\n var tree = parseTree(expression, settings);\n return buildTree(tree, expression, settings);\n } catch (error) {\n return renderError(error, expression, settings);\n }\n};\n/**\n * Generates and returns the katex build tree, with just HTML (no MathML).\n * This is used for advanced use cases (like rendering to custom output).\n */\n\n\nvar renderToHTMLTree = function renderToHTMLTree(expression, options) {\n var settings = new Settings(options);\n\n try {\n var tree = parseTree(expression, settings);\n return buildHTMLTree(tree, expression, settings);\n } catch (error) {\n return renderError(error, expression, settings);\n }\n};\n\nvar version = \"0.16.21\";\nvar __domTree = {\n Span,\n Anchor,\n SymbolNode,\n SvgNode,\n PathNode,\n LineNode\n}; // ESM exports\n\nvar katex = {\n /**\n * Current KaTeX version\n */\n version,\n\n /**\n * Renders the given LaTeX into an HTML+MathML combination, and adds\n * it as a child to the specified DOM node.\n */\n render,\n\n /**\n * Renders the given LaTeX into an HTML+MathML combination string,\n * for sending to the client.\n */\n renderToString,\n\n /**\n * KaTeX error, usually during parsing.\n */\n ParseError,\n\n /**\n * The schema of Settings\n */\n SETTINGS_SCHEMA,\n\n /**\n * Parses the given LaTeX into KaTeX's internal parse tree structure,\n * without rendering to HTML or MathML.\n *\n * NOTE: This method is not currently recommended for public use.\n * The internal tree representation is unstable and is very likely\n * to change. Use at your own risk.\n */\n __parse: generateParseTree,\n\n /**\n * Renders the given LaTeX into an HTML+MathML internal DOM tree\n * representation, without flattening that representation to a string.\n *\n * NOTE: This method is not currently recommended for public use.\n * The internal tree representation is unstable and is very likely\n * to change. Use at your own risk.\n */\n __renderToDomTree: renderToDomTree,\n\n /**\n * Renders the given LaTeX into an HTML internal DOM tree representation,\n * without MathML and without flattening that representation to a string.\n *\n * NOTE: This method is not currently recommended for public use.\n * The internal tree representation is unstable and is very likely\n * to change. Use at your own risk.\n */\n __renderToHTMLTree: renderToHTMLTree,\n\n /**\n * extends internal font metrics object with a new object\n * each key in the new object represents a font name\n */\n __setFontMetrics: setFontMetrics,\n\n /**\n * adds a new symbol to builtin symbols table\n */\n __defineSymbol: defineSymbol,\n\n /**\n * adds a new function to builtin function list,\n * which directly produce parse tree elements\n * and have their own html/mathml builders\n */\n __defineFunction: defineFunction,\n\n /**\n * adds a new macro to builtin macro list\n */\n __defineMacro: defineMacro,\n\n /**\n * Expose the dom tree node types, which can be useful for type checking nodes.\n *\n * NOTE: These methods are not currently recommended for public use.\n * The internal tree representation is unstable and is very likely\n * to change. Use at your own risk.\n */\n __domTree\n};\n\nexport { ParseError, SETTINGS_SCHEMA, defineFunction as __defineFunction, defineMacro as __defineMacro, defineSymbol as __defineSymbol, __domTree, generateParseTree as __parse, renderToDomTree as __renderToDomTree, renderToHTMLTree as __renderToHTMLTree, setFontMetrics as __setFontMetrics, katex as default, render, renderToString, version };\n"],"names":["SourceLocation","constructor","lexer","start","end","this","range","first","second","loc","Token","text","noexpand","treatAsRelax","endToken","ParseError","message","token","name","position","length","rawMessage","error","input","underlined","slice","replace","self","Error","__proto__","prototype","uppercase","ESCAPE_LOOKUP","ESCAPE_REGEX","getBaseElem","group","type","body","utils","contains","list","elem","indexOf","deflt","setting","defaultIfUndefined","undefined","escape","String","match","hyphenate","str","toLowerCase","isCharacterBox","baseElem","protocolFromUrl","url","protocol","exec","test","SETTINGS_SCHEMA","displayMode","description","cli","output","enum","leqno","fleqn","throwOnError","default","cliDescription","errorColor","cliProcessor","color","macros","cliDefault","def","defs","push","minRuleThickness","processor","t","Math","max","parseFloat","colorIsTextColor","strict","trust","maxSize","Infinity","s","parseInt","maxExpand","n","globalGroup","getDefaultValue","schema","defaultType","Array","isArray","Settings","options","prop","hasOwnProperty","reportNonstrict","errorCode","errorMsg","console","warn","useStrictBehavior","isTrusted","context","Boolean","Style","id","size","cramped","sup","styles","sub","fracNum","fracDen","cramp","text$1","isTight","Style$1","DISPLAY","TEXT","SCRIPT","SCRIPTSCRIPT","scriptData","blocks","allBlocks","supportedCodepoint","codepoint","i","forEach","b","hLinePad","path","doubleleftarrow","doublerightarrow","leftarrow","leftbrace","leftbraceunder","leftgroup","leftgroupunder","leftharpoon","leftharpoonplus","leftharpoondown","leftharpoondownplus","lefthook","leftlinesegment","leftmapsto","leftToFrom","longequal","midbrace","midbraceunder","oiintSize1","oiintSize2","oiiintSize1","oiiintSize2","rightarrow","rightbrace","rightbraceunder","rightgroup","rightgroupunder","rightharpoon","rightharpoonplus","rightharpoondown","rightharpoondownplus","righthook","rightlinesegment","rightToFrom","twoheadleftarrow","twoheadrightarrow","tilde1","tilde2","tilde3","tilde4","vec","widehat1","widehat2","widehat3","widehat4","widecheck1","widecheck2","widecheck3","widecheck4","baraboveleftarrow","rightarrowabovebar","baraboveshortleftharpoon","rightharpoonaboveshortbar","shortbaraboveleftharpoon","shortrightharpoonabovebar","DocumentFragment","children","classes","height","depth","maxFontSize","style","hasClass","className","toNode","frag","document","createDocumentFragment","appendChild","toMarkup","markup","toText","map","child","join","fontMetricsData","sigmasAndXis","slant","space","stretch","shrink","xHeight","quad","extraSpace","num1","num2","num3","denom1","denom2","sup1","sup2","sup3","sub1","sub2","supDrop","subDrop","delim1","delim2","axisHeight","defaultRuleThickness","bigOpSpacing1","bigOpSpacing2","bigOpSpacing3","bigOpSpacing4","bigOpSpacing5","sqrtRuleThickness","ptPerEm","doubleRuleSep","arrayRuleWidth","fboxsep","fboxrule","extraCharacterMap","getCharacterMetrics","character","font","mode","ch","charCodeAt","metrics","italic","skew","width","fontMetricsBySizeIndex","sizeStyleMap","sizeMultipliers","sizeAtStyle","Options","data","textSize","phantom","fontFamily","fontWeight","fontShape","sizeMultiplier","_fontMetrics","BASESIZE","extend","extension","key","havingStyle","havingCrampedStyle","havingSize","havingBaseStyle","wantSize","havingBaseSizing","withColor","withPhantom","withFont","withTextFontFamily","withTextFontWeight","withTextFontShape","sizingClasses","oldOptions","baseSizingClasses","fontMetrics","sizeIndex","cssEmPerMu","getGlobalMetrics","getColor","ptPerUnit","relativeUnit","validUnit","unit","calculateSize","sizeValue","scale","unitOptions","min","number","makeEm","toFixed","createClass","filter","cls","initNode","attributes","tagName","node","createElement","attr","setAttribute","invalidAttributeNameRegex","Span","call","attribute","value","Anchor","href","Img","src","alt","iCombinations","SymbolNode","script","_i","block","scriptFromCodepoint","createTextNode","span","marginRight","needsSpan","escaped","SvgNode","createElementNS","Object","PathNode","pathName","alternate","LineNode","assertSymbolDomNode","ATOMS","NON_ATOMS","symbols","defineSymbol","acceptUnicodeChar","math","main","ams","accent","bin","close","inner","mathord","op","open","punct","rel","spacing","textord","ligatures","mathTextSymbols","charAt","textSymbols","_ch","letters","_i2","_ch2","wideChar","_i3","_ch3","fromCharCode","_i4","_ch4","toString","extraLatin","_i5","_ch5","wideLatinLetterData","wideNumeralData","lookupSymbol","fontName","makeSymbol","symbolNode","lookup","canCombine","prev","next","_style","sizeElementFromChildren","makeSpan$2","makeSvgSpan","makeFragment","fragment","retrieveTextFontName","baseFontName","fontMap","variant","svgData","buildCommon","mathsym","concat","makeSpan","makeLineSpan","thickness","line","borderBottomWidth","makeAnchor","anchor","wrapFragment","makeVList","params","positionType","oldChildren","_depth","shift","currPos","diff","bottom","positionData","firstChild","getVListChildrenAndDepth","pstrutSize","pstrut","realChildren","minPos","maxPos","_child","_elem","wrapperClasses","wrapperStyle","childWrap","top","marginLeft","rows","vlist","emptySpan","depthStrut","topStrut","vtable","makeOrd","isFont","fontOrFamily","wideFontName","wideFontClass","codePoint","j","floor","wideCharacterFont","fontClasses","fontData","fontClass","boldsymbol","parts","_fontName","_fontName3","_fontName2","makeGlue","measurement","rule","staticSvg","svgNode","tryCombineChars","chars","splice","thinspace","mediumspace","thickspace","spacings","mord","mop","mbin","mrel","minner","mopen","mclose","mpunct","tightSpacings","_functions","_htmlGroupBuilders","_mathmlGroupBuilders","defineFunction","_ref","names","props","handler","htmlBuilder","mathmlBuilder","numArgs","argTypes","allowedInArgument","allowedInText","allowedInMath","numOptionalArgs","infix","primitive","defineFunctionBuilders","_ref2","normalizeArgument","arg","ordargument","makeSpan$1","binLeftCanceller","binRightCanceller","styleMap$1","DomEnum","buildExpression$1","expression","isRealGroup","surrounding","groups","buildGroup$1","glueOptions","dummyPrev","dummyNext","isRoot","traverseNonSpaceNodes","prevType","getTypeOfDomTree","nodes","callback","partialGroup","checkPartialGroup","nonspace","result","insertAfter","unshift","index","pop","getOutermostNode","side","makeNullDelimiter","moreClasses","baseOptions","groupNode","multiplier","buildHTMLUnbreakable","strut","verticalAlign","buildHTML","tree","tag","eqnNum","tagChild","nobreak","htmlNode","newDocumentFragment","MathNode","getAttribute","TextNode","mathMLTree","SpaceNode","makeText","makeRow","getVariant","isNumberPunctuation","buildExpression","isOrdgroup","buildGroup","lastGroup","_group","base","lastChild","buildExpressionRow","buildMathML","texExpression","isDisplayMode","forMathmlOnly","wrapper","annotation","semantics","wrapperClass","optionsFromSettings","settings","displayWrap","stretchyCodePoint","widehat","widecheck","widetilde","utilde","overleftarrow","underleftarrow","xleftarrow","overrightarrow","underrightarrow","xrightarrow","underbrace","overbrace","overgroup","undergroup","overleftrightarrow","underleftrightarrow","xleftrightarrow","Overrightarrow","xRightarrow","overleftharpoon","xleftharpoonup","overrightharpoon","xrightharpoonup","xLeftarrow","xLeftrightarrow","xhookleftarrow","xhookrightarrow","xmapsto","xrightharpoondown","xleftharpoondown","xrightleftharpoons","xleftrightharpoons","xtwoheadleftarrow","xtwoheadrightarrow","xlongequal","xtofrom","xrightleftarrows","xrightequilibrium","xleftequilibrium","katexImagesData","overlinesegment","underlinesegment","stretchy","label","topPad","bottomPad","img","totalHeight","borderColor","lines","minWidth","viewBoxWidth","viewBoxHeight","_height","numChars","imgIndex","widthClasses","aligns","spans","paths","_minWidth","_viewBoxHeight","_height2","numSvgChildren","_path","_svgNode","_span","buildSvgSpan_","assertNodeType","assertSymbolNodeType","typedNode","checkSymbolNodeType","htmlBuilder$a","grp","supSubGroup","assertSpan","isShifty","baseChar","accentBody","accentBelow","clearance","isStretchy","accentFull","left","accentWrap","mathmlBuilder$9","accentNode","NON_STRETCHY_ACCENT_REGEX","RegExp","args","funcName","parser","innerGroup","kern","paddedNode","optArgs","below","lowerGroup","newOptions","upperGroup","arrowPrefix","arrowBody","arrowShift","upperShift","lowerShift","arrowNode","upperNode","lowerNode","_lowerNode","htmlBuilder$9","elements","mclass","mathmlBuilder$8","lspace","rspace","binrelClass","atom","family","_ref3","baseArg","shiftedArg","baseOp","limits","alwaysHandleSupSub","parentIsSupSub","symbol","suppressBaseShift","supsub","textShadow","cdArrowFunctionName","isStartOfArrow","cdArrow","arrowChar","labels","callFunction","bareArrow","arrowGroup","parent","code","isNaN","htmlBuilder$8","mathmlBuilder$7","breakOnTokenText","gullet","set","parseExpression","future","parseSizeGroup","newLine","marginTop","globalMap","checkControlSequence","tok","letCommand","global","macro","get","tokens","unexpandable","isExpandable","consumeSpaces","fetch","parseFunction","popToken","insert","delimiters","consumeArg","expandTokens","reverse","getRHS","_ref4","middle","pushToken","getMetrics","styleWrap","delim","toStyle","delimSizeMultiplier","centerSpan","makeLargeDelim","center","mathrmSize","makeGlyphSpan","sizeClass","makeInner","innerPath","round","lap","verts","doubleVerts","makeStackedDelim","heightTotal","repeat","svgLabel","topMetrics","topHeightTotal","repeatMetrics","repeatHeightTotal","bottomMetrics","bottomHeightTotal","middleHeightTotal","middleFactor","middleMetrics","minHeight","realHeightTotal","ceil","stack","midHeight","pathStr","tallDelim","svg","innerHeight","_innerHeight","emPad","sqrtSvg","sqrtName","extraVinculum","sqrtMain","sqrtSize1","sqrtSize2","sqrtSize3","sqrtSize4","sqrtTall","sqrtPath","pathNode","stackLargeDelimiters","stackAlwaysDelimiters","stackNeverDelimiters","sizeToMaxHeight","stackNeverDelimiterSequence","stackAlwaysDelimiterSequence","stackLargeDelimiterSequence","delimTypeToFont","traverseSequence","sequence","heightDepth","makeCustomSizedDelim","delimType","makeSmallDelim","delimiter","sqrtImage","advanceWidth","spanHeight","texHeight","ruleWidth","sizedDelim","customSizedDelim","leftRightDelim","delimiterExtend","maxDistFromAxis","delimiterSizes","checkDelimiter","symDelim","assertParsed","leftrightDepth","expect","right","rightColor","leftDelim","rightDelim","innerDepth","hadMiddle","isMiddle","colorOptions","leftNode","rightNode","middleDelim","textNode","middleNode","htmlBuilder$7","y","imgShift","isSingleChar","lineWeight","angleHeight","paddingLeft","ruleThickness","borderStyle","borderWidth","borderTopWidth","borderRightWidth","backgroundColor","mathmlBuilder$6","thk","_ref5","_environments","defineEnvironment","_macros","defineMacro","getHLines","hlineInfo","nxt","consume","validateAmsEnvironmentContext","envName","getAutoTag","parseArray","hskipBeforeAndAfter","addJot","cols","arraystretch","colSeparationType","autoTag","singleRow","emptySingleRow","maxNumCols","beginGroup","expandMacroAsText","row","rowGaps","hLinesBeforeRow","tags","beginRow","endRow","subparse","cell","endGroup","nextToken","dCellStyle","htmlBuilder$6","r","c","nr","nc","hlines","pt","arraycolsep","baselineskip","jot","arrayskip","arstrutHeight","arstrutDepth","setHLinePos","hlinesInGap","pos","isDashed","inrow","outrow","elt","rowGap","gap","colSep","colDescrNum","offset","colDescriptions","tagSpans","some","rw","tagSpan","colDescr","firstSeparator","separator","lineType","borderRightStyle","margin","_shift","sepwidth","pregap","col","_shift2","align","postgap","dashes","vListElems","hline","lineShift","eqnNumCol","alignMap","l","mathmlBuilder$5","tbl","glue","table","menclose","columnLines","prevTypeWasAlign","iStart","iEnd","trim","_cols","rowLines","alignedHandler","numMaths","separationType","isSplit","res","numCols","emptyGroup","arg0","Number","isAligned","styling","curMaths","nde","ca","colAlign","payload","fill","parsedRows","endChar","rowNodes","labelNum","inLabel","k","wrappedArrow","parseCD","environments","nameGroup","env","_args","parseArguments","endNameToken","htmlBuilder$5","mathmlBuilder$4","fontAliases","func","adjustStyle","originalStyle","htmlBuilder$4","nstyle","dstyle","numerm","numer","continued","hStrut","dStrut","ruleSpacing","numShift","denomShift","frac","delimSize","denomm","denom","hasBarLine","barSize","midShift","candidateClearance","mathmlBuilder$3","isDisplay","withDelims","leftOp","rightOp","replaceWith","stylArray","delimFromValue","delimString","barNode","isBlank","styl","textOrd","_ref6","assert","htmlBuilder$3","braceBody","isOver","vSpan","mathmlBuilder$2","command","formatUnsupportedCmd","trustContext","string","class","split","keyVal","html","mathml","sizeData","totalheight","substring","lastIndexOf","mathFunction","muUnit","dimension","alignment","fix","outerMode","switchMode","chooseMathStyle","display","scriptscript","assembleSupSub","supGroup","subGroup","baseShift","finalGroup","subIsSingleCharacter","_bottom","spacer","noSuccessor","htmlBuilder$2","hasLimits","large","stash","oval","mathmlBuilder$1","operator","singleCharBigOps","fName","singleCharIntegrals","htmlBuilder$1","childText","sizingGroup","apply","isAllString","word","identifier","semisimple","amount","dy","sizeFuncs","smashHeight","smashDepth","tbArg","letter","smashedNode","theta","phi","lineClearance","minDelimiterHeight","delimDepth","rootm","toShift","rootVList","rootVListWrap","styleMap","newStyle","builderDelegate","htmlBuilderDelegate","supm","subm","minSupShift","valueBase","valueSup","valueSub","supShift","subShift","_newOptions","isOiint","maxWidth","psi","vlistElem","_vlistElem","isBrace","nodeType","_base2","_base","defaultVariant","cssSpace","regularSpace","ord","pad","padNode","textFontFamilies","textFontWeights","textFontShapes","optionsWithFont","makeVerb","star","functions","spaceRegexString","controlWordWhitespaceRegexString","combiningDiacriticalMarkString","combiningDiacriticalMarksEndRegex","tokenRegexString","Lexer","tokenRegex","catcodes","setCatcode","char","lex","lastIndex","nlIndex","Namespace","builtins","globalMacros","current","undefStack","undefs","undef","endGroups","has","expandOnce","consumeArgs","digitToNumber","digit","newcommand","existsOK","nonexistsOK","skipIfExists","exists","isDefined","argText","expandNextToken","log","dotsByToken","thedots","expandAfterFuture","spaceAfterDots","latexRaiseA","braketHelper","one","middleDouble","oldMiddle","oldMiddleDouble","midMacro","double","doubled","expanded","implicitCommands","MacroExpander","expansionCount","feed","newMode","pushTokens","scanArgument","isOptional","delims","isDelimited","countExpansion","expandableOnly","topToken","expansion","_getExpansion","expandMacro","oldStackLength","definition","catcode","stripped","bodyLexer","unicodeSubRegEx","uSubsAndSups","freeze","unicodeAccents","unicodeSymbols","Parser","parse","oldToken","breakOnInfix","endOfExpression","parseAtom","formLigatures","handleInfixNodes","overIndex","numerNode","denomNode","numerBody","denomBody","handleSupSubscript","symbolToken","parseGroup","textordArray","superscript","subscript","prime","primes","isSub","subsupTokens","funcData","totalArgs","argType","parseGroupOfType","optional","parseColorGroup","parseUrlGroup","parseArgumentGroup","parseStringGroup","modeName","argToken","parseRegexGroup","regex","firstToken","lastToken","groupEnd","parseSymbol","a","v","nucleus","parseTree","toParse","TypeError","render","baseNode","textContent","renderToDomTree","compatMode","renderError","katexNode","mathMLNode","_htmlNode","buildTree","katex","version","renderToString","__parse","__renderToDomTree","__renderToHTMLTree","buildHTMLTree","__setFontMetrics","__defineSymbol","__defineFunction","__defineMacro","__domTree"],"sourceRoot":""} \ No newline at end of file diff --git a/frontend/deployed/static/js/35.b34bde96.chunk.js b/frontend/deployed/static/js/35.b34bde96.chunk.js deleted file mode 100644 index afbe722..0000000 --- a/frontend/deployed/static/js/35.b34bde96.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunkbackstory=self.webpackChunkbackstory||[]).push([[35],{6327:(t,e,s)=>{s.d(e,{A:()=>a,P:()=>r});var i=s(3759),n=s(700),a=(0,i.K2)(((t,e)=>{let s;"sandbox"===e&&(s=(0,n.Ltv)("#i"+t));return("sandbox"===e?(0,n.Ltv)(s.nodes()[0].contentDocument.body):(0,n.Ltv)("body")).select(`[id="${t}"]`)}),"getDiagramElement"),r=(0,i.K2)(((t,e,s,n)=>{t.attr("class",s);const{width:a,height:r,x:o,y:c}=u(t,e);(0,i.a$)(t,r,a,n);const h=l(o,c,a,r,e);t.attr("viewBox",h),i.Rm.debug(`viewBox configured: ${h} with padding: ${e}`)}),"setupViewPortForSVG"),u=(0,i.K2)(((t,e)=>{const s=t.node()?.getBBox()||{width:0,height:0,x:0,y:0};return{width:s.width+2*e,height:s.height+2*e,x:s.x,y:s.y}}),"calculateDimensionsWithPadding"),l=(0,i.K2)(((t,e,s,i,n)=>`${t-n} ${e-n} ${s} ${i}`),"createViewBox")},8035:(t,e,s)=>{s.d(e,{Lh:()=>m,NM:()=>y,_$:()=>o,tM:()=>C});var i=s(6327),n=s(53),a=s(634),r=s(3759),u=s(700),l=function(){var t=(0,r.K2)((function(t,e,s,i){for(s=s||{},i=t.length;i--;s[t[i]]=e);return s}),"o"),e=[1,18],s=[1,19],i=[1,20],n=[1,41],a=[1,42],u=[1,26],l=[1,24],o=[1,25],c=[1,32],h=[1,33],d=[1,34],p=[1,45],A=[1,35],y=[1,36],C=[1,37],g=[1,38],m=[1,27],b=[1,28],E=[1,29],f=[1,30],T=[1,31],k=[1,44],D=[1,46],F=[1,43],B=[1,47],_=[1,9],S=[1,8,9],N=[1,58],L=[1,59],$=[1,60],x=[1,61],O=[1,62],I=[1,63],v=[1,64],w=[1,8,9,41],R=[1,76],P=[1,8,9,12,13,22,39,41,44,66,67,68,69,70,71,72,77,79],K=[1,8,9,12,13,17,20,22,39,41,44,48,58,66,67,68,69,70,71,72,77,79,84,99,101,102],M=[13,58,84,99,101,102],G=[13,58,71,72,84,99,101,102],U=[13,58,66,67,68,69,70,84,99,101,102],Y=[1,98],z=[1,115],Q=[1,107],W=[1,113],X=[1,108],j=[1,109],V=[1,110],q=[1,111],H=[1,112],J=[1,114],Z=[22,58,59,80,84,85,86,87,88,89],tt=[1,8,9,39,41,44],et=[1,8,9,22],st=[1,143],it=[1,8,9,59],nt=[1,8,9,22,58,59,80,84,85,86,87,88,89],at={trace:(0,r.K2)((function(){}),"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,DOT:17,className:18,classLiteralName: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,ANNOTATION_START:47,ANNOTATION_END:48,MEMBER:49,SEPARATOR:50,relation:51,NOTE_FOR:52,noteText:53,NOTE:54,CLASSDEF:55,classList:56,stylesOpt:57,ALPHA:58,COMMA:59,direction_tb:60,direction_bt:61,direction_rl:62,direction_lr:63,relationType:64,lineType:65,AGGREGATION:66,EXTENSION:67,COMPOSITION:68,DEPENDENCY:69,LOLLIPOP:70,LINE:71,DOTTED_LINE:72,CALLBACK:73,LINK:74,LINK_TARGET:75,CLICK:76,CALLBACK_NAME:77,CALLBACK_ARGS:78,HREF:79,STYLE:80,CSSCLASS:81,style:82,styleComponent:83,NUM:84,COLON:85,UNIT:86,SPACE:87,BRKT:88,PCT:89,commentToken:90,textToken:91,graphCodeTokens:92,textNoTagsToken:93,TAGSTART:94,TAGEND:95,"==":96,"--":97,DEFAULT:98,MINUS:99,keywords:100,UNICODE_TEXT:101,BQUOTE_STR:102,$accept:0,$end:1},terminals_:{2:"error",7:"CLASS_DIAGRAM",8:"NEWLINE",9:"EOF",12:"SQS",13:"STR",14:"SQE",17:"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",47:"ANNOTATION_START",48:"ANNOTATION_END",49:"MEMBER",50:"SEPARATOR",52:"NOTE_FOR",54:"NOTE",55:"CLASSDEF",58:"ALPHA",59:"COMMA",60:"direction_tb",61:"direction_bt",62:"direction_rl",63:"direction_lr",66:"AGGREGATION",67:"EXTENSION",68:"COMPOSITION",69:"DEPENDENCY",70:"LOLLIPOP",71:"LINE",72:"DOTTED_LINE",73:"CALLBACK",74:"LINK",75:"LINK_TARGET",76:"CLICK",77:"CALLBACK_NAME",78:"CALLBACK_ARGS",79:"HREF",80:"STYLE",81:"CSSCLASS",84:"NUM",85:"COLON",86:"UNIT",87:"SPACE",88:"BRKT",89:"PCT",92:"graphCodeTokens",94:"TAGSTART",95:"TAGEND",96:"==",97:"--",98:"DEFAULT",99:"MINUS",100:"keywords",101:"UNICODE_TEXT",102:"BQUOTE_STR"},productions_:[0,[3,1],[3,1],[4,1],[6,4],[5,1],[5,2],[5,3],[11,3],[15,1],[15,3],[15,2],[18,1],[18,3],[18,1],[18,2],[18,2],[18,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,6],[43,2],[43,3],[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],[56,1],[56,3],[32,1],[32,1],[32,1],[32,1],[51,3],[51,2],[51,2],[51,1],[64,1],[64,1],[64,1],[64,1],[64,1],[65,1],[65,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],[57,1],[57,3],[82,1],[82,2],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[83,1],[90,1],[90,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[91,1],[93,1],[93,1],[93,1],[93,1],[16,1],[16,1],[16,1],[16,1],[19,1],[53,1]],performAction:(0,r.K2)((function(t,e,s,i,n,a,r){var u=a.length-1;switch(n){case 8:this.$=a[u-1];break;case 9:case 12:case 14:this.$=a[u];break;case 10:case 13:this.$=a[u-2]+"."+a[u];break;case 11:case 15:case 95:this.$=a[u-1]+a[u];break;case 16:case 17:this.$=a[u-1]+"~"+a[u]+"~";break;case 18:i.addRelation(a[u]);break;case 19:a[u-1].title=i.cleanupLabel(a[u]),i.addRelation(a[u-1]);break;case 30:this.$=a[u].trim(),i.setAccTitle(this.$);break;case 31:case 32:this.$=a[u].trim(),i.setAccDescription(this.$);break;case 33:i.addClassesToNamespace(a[u-3],a[u-1]);break;case 34:i.addClassesToNamespace(a[u-4],a[u-1]);break;case 35:this.$=a[u],i.addNamespace(a[u]);break;case 36:case 46:case 59:case 92:this.$=[a[u]];break;case 37:this.$=[a[u-1]];break;case 38:a[u].unshift(a[u-2]),this.$=a[u];break;case 40:i.setCssClass(a[u-2],a[u]);break;case 41:i.addMembers(a[u-3],a[u-1]);break;case 42:i.setCssClass(a[u-5],a[u-3]),i.addMembers(a[u-5],a[u-1]);break;case 43:this.$=a[u],i.addClass(a[u]);break;case 44:this.$=a[u-1],i.addClass(a[u-1]),i.setClassLabel(a[u-1],a[u]);break;case 45:i.addAnnotation(a[u],a[u-2]);break;case 47:a[u].push(a[u-1]),this.$=a[u];break;case 48:case 50:case 51:break;case 49:i.addMember(a[u-1],i.cleanupLabel(a[u]));break;case 52:this.$={id1:a[u-2],id2:a[u],relation:a[u-1],relationTitle1:"none",relationTitle2:"none"};break;case 53:this.$={id1:a[u-3],id2:a[u],relation:a[u-1],relationTitle1:a[u-2],relationTitle2:"none"};break;case 54:this.$={id1:a[u-3],id2:a[u],relation:a[u-2],relationTitle1:"none",relationTitle2:a[u-1]};break;case 55:this.$={id1:a[u-4],id2:a[u],relation:a[u-2],relationTitle1:a[u-3],relationTitle2:a[u-1]};break;case 56:i.addNote(a[u],a[u-1]);break;case 57:i.addNote(a[u]);break;case 58:this.$=a[u-2],i.defineClass(a[u-1],a[u]);break;case 60:this.$=a[u-2].concat([a[u]]);break;case 61:i.setDirection("TB");break;case 62:i.setDirection("BT");break;case 63:i.setDirection("RL");break;case 64:i.setDirection("LR");break;case 65:this.$={type1:a[u-2],type2:a[u],lineType:a[u-1]};break;case 66:this.$={type1:"none",type2:a[u],lineType:a[u-1]};break;case 67:this.$={type1:a[u-1],type2:"none",lineType:a[u]};break;case 68:this.$={type1:"none",type2:"none",lineType:a[u]};break;case 69:this.$=i.relationType.AGGREGATION;break;case 70:this.$=i.relationType.EXTENSION;break;case 71:this.$=i.relationType.COMPOSITION;break;case 72:this.$=i.relationType.DEPENDENCY;break;case 73:this.$=i.relationType.LOLLIPOP;break;case 74:this.$=i.lineType.LINE;break;case 75:this.$=i.lineType.DOTTED_LINE;break;case 76:case 82:this.$=a[u-2],i.setClickEvent(a[u-1],a[u]);break;case 77:case 83:this.$=a[u-3],i.setClickEvent(a[u-2],a[u-1]),i.setTooltip(a[u-2],a[u]);break;case 78:this.$=a[u-2],i.setLink(a[u-1],a[u]);break;case 79:this.$=a[u-3],i.setLink(a[u-2],a[u-1],a[u]);break;case 80:this.$=a[u-3],i.setLink(a[u-2],a[u-1]),i.setTooltip(a[u-2],a[u]);break;case 81:this.$=a[u-4],i.setLink(a[u-3],a[u-2],a[u]),i.setTooltip(a[u-3],a[u-1]);break;case 84:this.$=a[u-3],i.setClickEvent(a[u-2],a[u-1],a[u]);break;case 85:this.$=a[u-4],i.setClickEvent(a[u-3],a[u-2],a[u-1]),i.setTooltip(a[u-3],a[u]);break;case 86:this.$=a[u-3],i.setLink(a[u-2],a[u]);break;case 87:this.$=a[u-4],i.setLink(a[u-3],a[u-1],a[u]);break;case 88:this.$=a[u-4],i.setLink(a[u-3],a[u-1]),i.setTooltip(a[u-3],a[u]);break;case 89:this.$=a[u-5],i.setLink(a[u-4],a[u-2],a[u]),i.setTooltip(a[u-4],a[u-1]);break;case 90:this.$=a[u-2],i.setCssStyle(a[u-1],a[u]);break;case 91:i.setCssClass(a[u-1],a[u]);break;case 93:a[u-2].push(a[u]),this.$=a[u-2]}}),"anonymous"),table:[{3:1,4:2,5:3,6:4,7:[1,6],10:5,16:39,18:21,19:40,21:7,23:8,24:9,25:10,26:11,27:12,28:13,29:14,30:15,31:16,32:17,33:e,35:s,37:i,38:22,42:n,43:23,46:a,47:u,49:l,50:o,52:c,54:h,55:d,58:p,60:A,61:y,62:C,63:g,73:m,74:b,76:E,80:f,81:T,84:k,99:D,101:F,102:B},{1:[3]},{1:[2,1]},{1:[2,2]},{1:[2,3]},t(_,[2,5],{8:[1,48]}),{8:[1,49]},t(S,[2,18],{22:[1,50]}),t(S,[2,20]),t(S,[2,21]),t(S,[2,22]),t(S,[2,23]),t(S,[2,24]),t(S,[2,25]),t(S,[2,26]),t(S,[2,27]),t(S,[2,28]),t(S,[2,29]),{34:[1,51]},{36:[1,52]},t(S,[2,32]),t(S,[2,48],{51:53,64:56,65:57,13:[1,54],22:[1,55],66:N,67:L,68:$,69:x,70:O,71:I,72:v}),{39:[1,65]},t(w,[2,39],{39:[1,67],44:[1,66]}),t(S,[2,50]),t(S,[2,51]),{16:68,58:p,84:k,99:D,101:F},{16:39,18:69,19:40,58:p,84:k,99:D,101:F,102:B},{16:39,18:70,19:40,58:p,84:k,99:D,101:F,102:B},{16:39,18:71,19:40,58:p,84:k,99:D,101:F,102:B},{58:[1,72]},{13:[1,73]},{16:39,18:74,19:40,58:p,84:k,99:D,101:F,102:B},{13:R,53:75},{56:77,58:[1,78]},t(S,[2,61]),t(S,[2,62]),t(S,[2,63]),t(S,[2,64]),t(P,[2,12],{16:39,19:40,18:80,17:[1,79],20:[1,81],58:p,84:k,99:D,101:F,102:B}),t(P,[2,14],{20:[1,82]}),{15:83,16:84,58:p,84:k,99:D,101:F},{16:39,18:85,19:40,58:p,84:k,99:D,101:F,102:B},t(K,[2,118]),t(K,[2,119]),t(K,[2,120]),t(K,[2,121]),t([1,8,9,12,13,20,22,39,41,44,66,67,68,69,70,71,72,77,79],[2,122]),t(_,[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,18:21,38:22,43:23,16:39,19:40,5:86,33:e,35:s,37:i,42:n,46:a,47:u,49:l,50:o,52:c,54:h,55:d,58:p,60:A,61:y,62:C,63:g,73:m,74:b,76:E,80:f,81:T,84:k,99:D,101:F,102:B}),{5:87,10:5,16:39,18:21,19:40,21:7,23:8,24:9,25:10,26:11,27:12,28:13,29:14,30:15,31:16,32:17,33:e,35:s,37:i,38:22,42:n,43:23,46:a,47:u,49:l,50:o,52:c,54:h,55:d,58:p,60:A,61:y,62:C,63:g,73:m,74:b,76:E,80:f,81:T,84:k,99:D,101:F,102:B},t(S,[2,19]),t(S,[2,30]),t(S,[2,31]),{13:[1,89],16:39,18:88,19:40,58:p,84:k,99:D,101:F,102:B},{51:90,64:56,65:57,66:N,67:L,68:$,69:x,70:O,71:I,72:v},t(S,[2,49]),{65:91,71:I,72:v},t(M,[2,68],{64:92,66:N,67:L,68:$,69:x,70:O}),t(G,[2,69]),t(G,[2,70]),t(G,[2,71]),t(G,[2,72]),t(G,[2,73]),t(U,[2,74]),t(U,[2,75]),{8:[1,94],24:95,40:93,43:23,46:a},{16:96,58:p,84:k,99:D,101:F},{45:97,49:Y},{48:[1,99]},{13:[1,100]},{13:[1,101]},{77:[1,102],79:[1,103]},{22:z,57:104,58:Q,80:W,82:105,83:106,84:X,85:j,86:V,87:q,88:H,89:J},{58:[1,116]},{13:R,53:117},t(S,[2,57]),t(S,[2,123]),{22:z,57:118,58:Q,59:[1,119],80:W,82:105,83:106,84:X,85:j,86:V,87:q,88:H,89:J},t(Z,[2,59]),{16:39,18:120,19:40,58:p,84:k,99:D,101:F,102:B},t(P,[2,15]),t(P,[2,16]),t(P,[2,17]),{39:[2,35]},{15:122,16:84,17:[1,121],39:[2,9],58:p,84:k,99:D,101:F},t(tt,[2,43],{11:123,12:[1,124]}),t(_,[2,7]),{9:[1,125]},t(et,[2,52]),{16:39,18:126,19:40,58:p,84:k,99:D,101:F,102:B},{13:[1,128],16:39,18:127,19:40,58:p,84:k,99:D,101:F,102:B},t(M,[2,67],{64:129,66:N,67:L,68:$,69:x,70:O}),t(M,[2,66]),{41:[1,130]},{24:95,40:131,43:23,46:a},{8:[1,132],41:[2,36]},t(w,[2,40],{39:[1,133]}),{41:[1,134]},{41:[2,46],45:135,49:Y},{16:39,18:136,19:40,58:p,84:k,99:D,101:F,102:B},t(S,[2,76],{13:[1,137]}),t(S,[2,78],{13:[1,139],75:[1,138]}),t(S,[2,82],{13:[1,140],78:[1,141]}),{13:[1,142]},t(S,[2,90],{59:st}),t(it,[2,92],{83:144,22:z,58:Q,80:W,84:X,85:j,86:V,87:q,88:H,89:J}),t(nt,[2,94]),t(nt,[2,96]),t(nt,[2,97]),t(nt,[2,98]),t(nt,[2,99]),t(nt,[2,100]),t(nt,[2,101]),t(nt,[2,102]),t(nt,[2,103]),t(nt,[2,104]),t(S,[2,91]),t(S,[2,56]),t(S,[2,58],{59:st}),{58:[1,145]},t(P,[2,13]),{15:146,16:84,58:p,84:k,99:D,101:F},{39:[2,11]},t(tt,[2,44]),{13:[1,147]},{1:[2,4]},t(et,[2,54]),t(et,[2,53]),{16:39,18:148,19:40,58:p,84:k,99:D,101:F,102:B},t(M,[2,65]),t(S,[2,33]),{41:[1,149]},{24:95,40:150,41:[2,37],43:23,46:a},{45:151,49:Y},t(w,[2,41]),{41:[2,47]},t(S,[2,45]),t(S,[2,77]),t(S,[2,79]),t(S,[2,80],{75:[1,152]}),t(S,[2,83]),t(S,[2,84],{13:[1,153]}),t(S,[2,86],{13:[1,155],75:[1,154]}),{22:z,58:Q,80:W,82:156,83:106,84:X,85:j,86:V,87:q,88:H,89:J},t(nt,[2,95]),t(Z,[2,60]),{39:[2,10]},{14:[1,157]},t(et,[2,55]),t(S,[2,34]),{41:[2,38]},{41:[1,158]},t(S,[2,81]),t(S,[2,85]),t(S,[2,87]),t(S,[2,88],{75:[1,159]}),t(it,[2,93],{83:144,22:z,58:Q,80:W,84:X,85:j,86:V,87:q,88:H,89:J}),t(tt,[2,8]),t(w,[2,42]),t(S,[2,89])],defaultActions:{2:[2,1],3:[2,2],4:[2,3],83:[2,35],122:[2,11],125:[2,4],135:[2,47],146:[2,10],150:[2,38]},parseError:(0,r.K2)((function(t,e){if(!e.recoverable){var s=new Error(t);throw s.hash=e,s}this.trace(t)}),"parseError"),parse:(0,r.K2)((function(t){var e=this,s=[0],i=[],n=[null],a=[],u=this.table,l="",o=0,c=0,h=0,d=a.slice.call(arguments,1),p=Object.create(this.lexer),A={yy:{}};for(var y in this.yy)Object.prototype.hasOwnProperty.call(this.yy,y)&&(A.yy[y]=this.yy[y]);p.setInput(t,A.yy),A.yy.lexer=p,A.yy.parser=this,"undefined"==typeof p.yylloc&&(p.yylloc={});var C=p.yylloc;a.push(C);var g=p.options&&p.options.ranges;function m(){var t;return"number"!==typeof(t=i.pop()||p.lex()||1)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"===typeof A.yy.parseError?this.parseError=A.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError,(0,r.K2)((function(t){s.length=s.length-2*t,n.length=n.length-t,a.length=a.length-t}),"popStack"),(0,r.K2)(m,"lex");for(var b,E,f,T,k,D,F,B,_,S={};;){if(f=s[s.length-1],this.defaultActions[f]?T=this.defaultActions[f]:(null!==b&&"undefined"!=typeof b||(b=m()),T=u[f]&&u[f][b]),"undefined"===typeof T||!T.length||!T[0]){var N="";for(D in _=[],u[f])this.terminals_[D]&&D>2&&_.push("'"+this.terminals_[D]+"'");N=p.showPosition?"Parse error on line "+(o+1)+":\n"+p.showPosition()+"\nExpecting "+_.join(", ")+", got '"+(this.terminals_[b]||b)+"'":"Parse error on line "+(o+1)+": Unexpected "+(1==b?"end of input":"'"+(this.terminals_[b]||b)+"'"),this.parseError(N,{text:p.match,token:this.terminals_[b]||b,line:p.yylineno,loc:C,expected:_})}if(T[0]instanceof Array&&T.length>1)throw new Error("Parse Error: multiple actions possible at state: "+f+", token: "+b);switch(T[0]){case 1:s.push(b),n.push(p.yytext),a.push(p.yylloc),s.push(T[1]),b=null,E?(b=E,E=null):(c=p.yyleng,l=p.yytext,o=p.yylineno,C=p.yylloc,h>0&&h--);break;case 2:if(F=this.productions_[T[1]][1],S.$=n[n.length-F],S._$={first_line:a[a.length-(F||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(F||1)].first_column,last_column:a[a.length-1].last_column},g&&(S._$.range=[a[a.length-(F||1)].range[0],a[a.length-1].range[1]]),"undefined"!==typeof(k=this.performAction.apply(S,[l,c,o,A.yy,T[1],n,a].concat(d))))return k;F&&(s=s.slice(0,-1*F*2),n=n.slice(0,-1*F),a=a.slice(0,-1*F)),s.push(this.productions_[T[1]][0]),n.push(S.$),a.push(S._$),B=u[s[s.length-2]][s[s.length-1]],s.push(B);break;case 3:return!0}}return!0}),"parse")},rt=function(){return{EOF:1,parseError:(0,r.K2)((function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)}),"parseError"),setInput:(0,r.K2)((function(t,e){return this.yy=e||this.yy||{},this._input=t,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:(0,r.K2)((function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t}),"input"),unput:(0,r.K2)((function(t){var e=t.length,s=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=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),s.length-1&&(this.yylineno-=s.length-1);var n=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:s?(s.length===i.length?this.yylloc.first_column:0)+i[i.length-s.length].length-s[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[n[0],n[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this}),"unput"),more:(0,r.K2)((function(){return this._more=!0,this}),"more"),reject:(0,r.K2)((function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):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})}),"reject"),less:(0,r.K2)((function(t){this.unput(this.match.slice(t))}),"less"),pastInput:(0,r.K2)((function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")}),"pastInput"),upcomingInput:(0,r.K2)((function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")}),"upcomingInput"),showPosition:(0,r.K2)((function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"}),"showPosition"),test_match:(0,r.K2)((function(t,e){var s,i,n;if(this.options.backtrack_lexer&&(n={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&&(n.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,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(t[0].length),this.matched+=t[0],s=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),s)return s;if(this._backtrack){for(var a in n)this[a]=n[a];return!1}return!1}),"test_match"),next:(0,r.K2)((function(){if(this.done)return this.EOF;var t,e,s,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var n=this._currentRules(),a=0;ae[0].length)){if(e=s,i=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(s,n[a])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,n[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})}),"next"),lex:(0,r.K2)((function(){var t=this.next();return t||this.lex()}),"lex"),begin:(0,r.K2)((function(t){this.conditionStack.push(t)}),"begin"),popState:(0,r.K2)((function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]}),"popState"),_currentRules:(0,r.K2)((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:(0,r.K2)((function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"}),"topState"),pushState:(0,r.K2)((function(t){this.begin(t)}),"pushState"),stateStackSize:(0,r.K2)((function(){return this.conditionStack.length}),"stateStackSize"),options:{},performAction:(0,r.K2)((function(t,e,s,i){switch(s){case 0:return 60;case 1:return 61;case 2:return 62;case 3:return 63;case 4:case 5:case 14:case 31:case 36:case 40:case 47:break;case 6:return this.begin("acc_title"),33;case 7:return this.popState(),"acc_title_value";case 8:return this.begin("acc_descr"),35;case 9:return this.popState(),"acc_descr_value";case 10:this.begin("acc_descr_multiline");break;case 11:case 19:case 22:case 24:case 58:case 61:this.popState();break;case 12:return"acc_descr_multiline_value";case 13:case 35:return 8;case 15:case 16:return 7;case 17:case 37:case 45:return"EDGE_STATE";case 18:this.begin("callback_name");break;case 20:this.popState(),this.begin("callback_args");break;case 21:return 77;case 23:return 78;case 25:return"STR";case 26:this.begin("string");break;case 27:return 80;case 28:return 55;case 29:return this.begin("namespace"),42;case 30:case 39:return this.popState(),8;case 32:return this.begin("namespace-body"),39;case 33:case 43:return this.popState(),41;case 34:case 44:return"EOF_IN_STRUCT";case 38:return this.begin("class"),46;case 41:return this.popState(),this.popState(),41;case 42:return this.begin("class-body"),39;case 46:return"OPEN_IN_STRUCT";case 48:return"MEMBER";case 49:return 81;case 50:return 73;case 51:return 74;case 52:return 76;case 53:return 52;case 54:return 54;case 55:return 47;case 56:return 48;case 57:return 79;case 59:return"GENERICTYPE";case 60:this.begin("generic");break;case 62:return"BQUOTE_STR";case 63:this.begin("bqstring");break;case 64:case 65:case 66:case 67:return 75;case 68:case 69:return 67;case 70:case 71:return 69;case 72:return 68;case 73:return 66;case 74:return 70;case 75:return 71;case 76:return 72;case 77:return 22;case 78:return 44;case 79:return 99;case 80:return 17;case 81:return"PLUS";case 82:return 85;case 83:return 59;case 84:case 85:return 88;case 86:return 89;case 87:case 88:return"EQUALS";case 89:return 58;case 90:return 12;case 91:return 14;case 92:return"PUNCTUATION";case 93:return 84;case 94:return 101;case 95:case 96:return 87;case 97:return 9}}),"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:!1},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:!1},"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:!1},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:!1},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:!1},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:!1},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:!1},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:!1},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:!1},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:!1},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:!1},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:!1},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:!1},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:!1},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:!0}}}}();function ut(){this.yy={}}return at.lexer=rt,(0,r.K2)(ut,"Parser"),ut.prototype=at,at.Parser=ut,new ut}();l.parser=l;var o=l,c=["#","+","~","-",""],h=class{static#t=(()=>(0,r.K2)(this,"ClassMember"))();constructor(t,e){this.memberType=e,this.visibility="",this.classifier="",this.text="";const s=(0,r.jZ)(t,(0,r.D7)());this.parseMember(s)}getDisplayDetails(){let t=this.visibility+(0,r.QO)(this.id);"method"===this.memberType&&(t+=`(${(0,r.QO)(this.parameters.trim())})`,this.returnType&&(t+=" : "+(0,r.QO)(this.returnType))),t=t.trim();return{displayText:t,cssStyle:this.parseClassifier()}}parseMember(t){let e="";if("method"===this.memberType){const s=/([#+~-])?(.+)\((.*)\)([\s$*])?(.*)([$*])?/.exec(t);if(s){const t=s[1]?s[1].trim():"";if(c.includes(t)&&(this.visibility=t),this.id=s[2],this.parameters=s[3]?s[3].trim():"",e=s[4]?s[4].trim():"",this.returnType=s[5]?s[5].trim():"",""===e){const t=this.returnType.substring(this.returnType.length-1);/[$*]/.exec(t)&&(e=t,this.returnType=this.returnType.substring(0,this.returnType.length-1))}}}else{const s=t.length,i=t.substring(0,1),n=t.substring(s-1);c.includes(i)&&(this.visibility=i),/[$*]/.exec(n)&&(e=n),this.id=t.substring(""===this.visibility?0:1,""===e?s:s-1)}this.classifier=e,this.id=this.id.startsWith(" ")?" "+this.id.trim():this.id.trim();const s=`${this.visibility?"\\"+this.visibility:""}${(0,r.QO)(this.id)}${"method"===this.memberType?`(${(0,r.QO)(this.parameters)})${this.returnType?" : "+(0,r.QO)(this.returnType):""}`:""}`;this.text=s.replaceAll("<","<").replaceAll(">",">"),this.text.startsWith("\\<")&&(this.text=this.text.replace("\\<","~"))}parseClassifier(){switch(this.classifier){case"*":return"font-style:italic;";case"$":return"text-decoration:underline;";default:return""}}},d="classId-",p=0,A=(0,r.K2)((t=>r.Y2.sanitizeText(t,(0,r.D7)())),"sanitizeText"),y=class{constructor(){this.relations=[],this.classes=new Map,this.styleClasses=new Map,this.notes=[],this.interfaces=[],this.namespaces=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=(0,r.K2)((t=>{let e=(0,u.Ltv)(".mermaidTooltip");null===(e._groups||e)[0][0]&&(e=(0,u.Ltv)("body").append("div").attr("class","mermaidTooltip").style("opacity",0));(0,u.Ltv)(t).select("svg").selectAll("g.node").on("mouseover",(t=>{const s=(0,u.Ltv)(t.currentTarget);if(null===s.attr("title"))return;const i=this.getBoundingClientRect();e.transition().duration(200).style("opacity",".9"),e.text(s.attr("title")).style("left",window.scrollX+i.left+(i.right-i.left)/2+"px").style("top",window.scrollY+i.top-14+document.body.scrollTop+"px"),e.html(e.html().replace(/<br\/>/g,"
")),s.classed("hover",!0)})).on("mouseout",(t=>{e.transition().duration(500).style("opacity",0);(0,u.Ltv)(t.currentTarget).classed("hover",!1)}))}),"setupToolTips"),this.direction="TB",this.setAccTitle=r.SV,this.getAccTitle=r.iN,this.setAccDescription=r.EI,this.getAccDescription=r.m7,this.setDiagramTitle=r.ke,this.getDiagramTitle=r.ab,this.getConfig=(0,r.K2)((()=>(0,r.D7)().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#t=(()=>(0,r.K2)(this,"ClassDB"))();splitClassNameAndType(t){const e=r.Y2.sanitizeText(t,(0,r.D7)());let s="",i=e;if(e.indexOf("~")>0){const t=e.split("~");i=A(t[0]),s=A(t[1])}return{className:i,type:s}}setClassLabel(t,e){const s=r.Y2.sanitizeText(t,(0,r.D7)());e&&(e=A(e));const{className:i}=this.splitClassNameAndType(s);this.classes.get(i).label=e,this.classes.get(i).text=`${e}${this.classes.get(i).type?`<${this.classes.get(i).type}>`:""}`}addClass(t){const e=r.Y2.sanitizeText(t,(0,r.D7)()),{className:s,type:i}=this.splitClassNameAndType(e);if(this.classes.has(s))return;const n=r.Y2.sanitizeText(s,(0,r.D7)());this.classes.set(n,{id:n,type:i,label:n,text:`${n}${i?`<${i}>`:""}`,shape:"classBox",cssClasses:"default",methods:[],members:[],annotations:[],styles:[],domId:d+n+"-"+p}),p++}addInterface(t,e){const s={id:`interface${this.interfaces.length}`,label:t,classId:e};this.interfaces.push(s)}lookUpDomId(t){const e=r.Y2.sanitizeText(t,(0,r.D7)());if(this.classes.has(e))return this.classes.get(e).domId;throw new Error("Class not found: "+e)}clear(){this.relations=[],this.classes=new Map,this.notes=[],this.interfaces=[],this.functions=[],this.functions.push(this.setupToolTips.bind(this)),this.namespaces=new Map,this.namespaceCounter=0,this.direction="TB",(0,r.IU)()}getClass(t){return this.classes.get(t)}getClasses(){return this.classes}getRelations(){return this.relations}getNotes(){return this.notes}addRelation(t){r.Rm.debug("Adding relation: "+JSON.stringify(t));const e=[this.relationType.LOLLIPOP,this.relationType.AGGREGATION,this.relationType.COMPOSITION,this.relationType.DEPENDENCY,this.relationType.EXTENSION];t.relation.type1!==this.relationType.LOLLIPOP||e.includes(t.relation.type2)?t.relation.type2!==this.relationType.LOLLIPOP||e.includes(t.relation.type1)?(this.addClass(t.id1),this.addClass(t.id2)):(this.addClass(t.id1),this.addInterface(t.id2,t.id1),t.id2="interface"+(this.interfaces.length-1)):(this.addClass(t.id2),this.addInterface(t.id1,t.id2),t.id1="interface"+(this.interfaces.length-1)),t.id1=this.splitClassNameAndType(t.id1).className,t.id2=this.splitClassNameAndType(t.id2).className,t.relationTitle1=r.Y2.sanitizeText(t.relationTitle1.trim(),(0,r.D7)()),t.relationTitle2=r.Y2.sanitizeText(t.relationTitle2.trim(),(0,r.D7)()),this.relations.push(t)}addAnnotation(t,e){const s=this.splitClassNameAndType(t).className;this.classes.get(s).annotations.push(e)}addMember(t,e){this.addClass(t);const s=this.splitClassNameAndType(t).className,i=this.classes.get(s);if("string"===typeof e){const t=e.trim();t.startsWith("<<")&&t.endsWith(">>")?i.annotations.push(A(t.substring(2,t.length-2))):t.indexOf(")")>0?i.methods.push(new h(t,"method")):t&&i.members.push(new h(t,"attribute"))}}addMembers(t,e){Array.isArray(e)&&(e.reverse(),e.forEach((e=>this.addMember(t,e))))}addNote(t,e){const s={id:`note${this.notes.length}`,class:e,text:t};this.notes.push(s)}cleanupLabel(t){return t.startsWith(":")&&(t=t.substring(1)),A(t.trim())}setCssClass(t,e){t.split(",").forEach((t=>{let s=t;/\d/.exec(t[0])&&(s=d+s);const i=this.classes.get(s);i&&(i.cssClasses+=" "+e)}))}defineClass(t,e){for(const s of t){let t=this.styleClasses.get(s);void 0===t&&(t={id:s,styles:[],textStyles:[]},this.styleClasses.set(s,t)),e&&e.forEach((e=>{if(/color/.exec(e)){const s=e.replace("fill","bgFill");t.textStyles.push(s)}t.styles.push(e)})),this.classes.forEach((t=>{t.cssClasses.includes(s)&&t.styles.push(...e.flatMap((t=>t.split(","))))}))}}setTooltip(t,e){t.split(",").forEach((t=>{void 0!==e&&(this.classes.get(t).tooltip=A(e))}))}getTooltip(t,e){return e&&this.namespaces.has(e)?this.namespaces.get(e).classes.get(t).tooltip:this.classes.get(t).tooltip}setLink(t,e,s){const i=(0,r.D7)();t.split(",").forEach((t=>{let n=t;/\d/.exec(t[0])&&(n=d+n);const r=this.classes.get(n);r&&(r.link=a._K.formatUrl(e,i),"sandbox"===i.securityLevel?r.linkTarget="_top":r.linkTarget="string"===typeof s?A(s):"_blank")})),this.setCssClass(t,"clickable")}setClickEvent(t,e,s){t.split(",").forEach((t=>{this.setClickFunc(t,e,s),this.classes.get(t).haveCallback=!0})),this.setCssClass(t,"clickable")}setClickFunc(t,e,s){const i=r.Y2.sanitizeText(t,(0,r.D7)());if("loose"!==(0,r.D7)().securityLevel)return;if(void 0===e)return;const n=i;if(this.classes.has(n)){const t=this.lookUpDomId(n);let i=[];if("string"===typeof s){i=s.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let t=0;t{const s=document.querySelector(`[id="${t}"]`);null!==s&&s.addEventListener("click",(()=>{a._K.runFunc(e,...i)}),!1)}))}}bindFunctions(t){this.functions.forEach((e=>{e(t)}))}getDirection(){return this.direction}setDirection(t){this.direction=t}addNamespace(t){this.namespaces.has(t)||(this.namespaces.set(t,{id:t,classes:new Map,children:{},domId:d+t+"-"+this.namespaceCounter}),this.namespaceCounter++)}getNamespace(t){return this.namespaces.get(t)}getNamespaces(){return this.namespaces}addClassesToNamespace(t,e){if(this.namespaces.has(t))for(const s of e){const{className:e}=this.splitClassNameAndType(s);this.classes.get(e).parent=t,this.namespaces.get(t).classes.set(e,this.classes.get(e))}}setCssStyle(t,e){const s=this.classes.get(t);if(e&&s)for(const i of e)i.includes(",")?s.styles.push(...i.split(",")):s.styles.push(i)}getArrowMarker(t){let e;switch(t){case 0:e="aggregation";break;case 1:e="extension";break;case 2:e="composition";break;case 3:e="dependency";break;case 4:e="lollipop";break;default:e="none"}return e}getData(){const t=[],e=[],s=(0,r.D7)();for(const n of this.namespaces.keys()){const e=this.namespaces.get(n);if(e){const i={id:e.id,label:e.id,isGroup:!0,padding:s.class.padding??16,shape:"rect",cssStyles:["fill: none","stroke: black"],look:s.look};t.push(i)}}for(const n of this.classes.keys()){const e=this.classes.get(n);if(e){const i=e;i.parentId=e.parent,i.look=s.look,t.push(i)}}let i=0;for(const n of this.notes){i++;const a={id:n.id,label:n.text,isGroup:!1,shape:"note",padding:s.class.padding??6,cssStyles:["text-align: left","white-space: nowrap",`fill: ${s.themeVariables.noteBkgColor}`,`stroke: ${s.themeVariables.noteBorderColor}`],look:s.look};t.push(a);const r=this.classes.get(n.class)?.id??"";if(r){const t={id:`edgeNote${i}`,start:n.id,end:r,type:"normal",thickness:"normal",classes:"relation",arrowTypeStart:"none",arrowTypeEnd:"none",arrowheadStyle:"",labelStyle:[""],style:["fill: none"],pattern:"dotted",look:s.look};e.push(t)}}for(const n of this.interfaces){const e={id:n.id,label:n.label,isGroup:!1,shape:"rect",cssStyles:["opacity: 0;"],look:s.look};t.push(e)}i=0;for(const n of this.relations){i++;const t={id:(0,a.rY)(n.id1,n.id2,{prefix:"id",counter:i}),start:n.id1,end:n.id2,type:"normal",label:n.title,labelpos:"c",thickness:"normal",classes:"relation",arrowTypeStart:this.getArrowMarker(n.relation.type1),arrowTypeEnd:this.getArrowMarker(n.relation.type2),startLabelRight:"none"===n.relationTitle1?"":n.relationTitle1,endLabelLeft:"none"===n.relationTitle2?"":n.relationTitle2,arrowheadStyle:"",labelStyle:["display: inline-block"],style:n.style||"",pattern:1==n.relation.lineType?"dashed":"solid",look:s.look};e.push(t)}return{nodes:t,edges:e,other:{},config:s,direction:this.getDirection()}}},C=(0,r.K2)((t=>`g.classGroup text {\n fill: ${t.nodeBorder||t.classText};\n stroke: none;\n font-family: ${t.fontFamily};\n font-size: 10px;\n\n .title {\n font-weight: bolder;\n }\n\n}\n\n.nodeLabel, .edgeLabel {\n color: ${t.classText};\n}\n.edgeLabel .label rect {\n fill: ${t.mainBkg};\n}\n.label text {\n fill: ${t.classText};\n}\n\n.labelBkg {\n background: ${t.mainBkg};\n}\n.edgeLabel .label span {\n background: ${t.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: ${t.mainBkg};\n stroke: ${t.nodeBorder};\n stroke-width: 1px;\n }\n\n\n.divider {\n stroke: ${t.nodeBorder};\n stroke-width: 1;\n}\n\ng.clickable {\n cursor: pointer;\n}\n\ng.classGroup rect {\n fill: ${t.mainBkg};\n stroke: ${t.nodeBorder};\n}\n\ng.classGroup line {\n stroke: ${t.nodeBorder};\n stroke-width: 1;\n}\n\n.classLabel .box {\n stroke: none;\n stroke-width: 0;\n fill: ${t.mainBkg};\n opacity: 0.5;\n}\n\n.classLabel .label {\n fill: ${t.nodeBorder};\n font-size: 10px;\n}\n\n.relation {\n stroke: ${t.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: ${t.lineColor} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#compositionEnd, .composition {\n fill: ${t.lineColor} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#dependencyStart, .dependency {\n fill: ${t.lineColor} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#dependencyStart, .dependency {\n fill: ${t.lineColor} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#extensionStart, .extension {\n fill: transparent !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#extensionEnd, .extension {\n fill: transparent !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#aggregationStart, .aggregation {\n fill: transparent !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#aggregationEnd, .aggregation {\n fill: transparent !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#lollipopStart, .lollipop {\n fill: ${t.mainBkg} !important;\n stroke: ${t.lineColor} !important;\n stroke-width: 1;\n}\n\n#lollipopEnd, .lollipop {\n fill: ${t.mainBkg} !important;\n stroke: ${t.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: ${t.textColor};\n}\n`),"getStyles"),g=(0,r.K2)((function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"TB";if(!t.doc)return e;let s=e;for(const i of t.doc)"dir"===i.stmt&&(s=i.value);return s}),"getDir"),m={getClasses:(0,r.K2)((function(t,e){return e.db.getClasses()}),"getClasses"),draw:(0,r.K2)((async function(t,e,s,u){r.Rm.info("REF0:"),r.Rm.info("Drawing class diagram (v3)",e);const{securityLevel:l,state:o,layout:c}=(0,r.D7)(),h=u.db.getData(),d=(0,i.A)(e,l);h.type=u.type,h.layoutAlgorithm=(0,n.q7)(c),h.nodeSpacing=o?.nodeSpacing||50,h.rankSpacing=o?.rankSpacing||50,h.markers=["aggregation","extension","composition","dependency","lollipop"],h.diagramId=e,await(0,n.XX)(h,d);a._K.insertTitle(d,"classDiagramTitleText",o?.titleTopMargin??25,u.db.getDiagramTitle()),(0,i.P)(d,8,"classDiagram",o?.useMaxWidth??!0)}),"draw"),getDir:g}}}]); -//# sourceMappingURL=35.b34bde96.chunk.js.map \ No newline at end of file diff --git a/frontend/deployed/static/js/35.b34bde96.chunk.js.map b/frontend/deployed/static/js/35.b34bde96.chunk.js.map deleted file mode 100644 index 629de48..0000000 --- a/frontend/deployed/static/js/35.b34bde96.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"static/js/35.b34bde96.chunk.js","mappings":"oJAQIA,GAAoCC,EAAAA,EAAAA,KAAO,CAACC,EAAIC,KAClD,IAAIC,EACkB,YAAlBD,IACFC,GAAiBC,EAAAA,EAAAA,KAAO,KAAOH,IAIjC,OAF+B,YAAlBC,GAA8BE,EAAAA,EAAAA,KAAOD,EAAeE,QAAQ,GAAGC,gBAAgBC,OAAQH,EAAAA,EAAAA,KAAO,SAC1FA,OAAO,QAAQH,MACtB,GACT,qBAGCO,GAAsCR,EAAAA,EAAAA,KAAO,CAACS,EAAKC,EAASC,EAAYC,KAC1EH,EAAII,KAAK,QAASF,GAClB,MAAM,MAAEG,EAAK,OAAEC,EAAM,EAAEC,EAAC,EAAEC,GAAMC,EAA+BT,EAAKC,IACpES,EAAAA,EAAAA,IAAiBV,EAAKM,EAAQD,EAAOF,GACrC,MAAMQ,EAAUC,EAAcL,EAAGC,EAAGH,EAAOC,EAAQL,GACnDD,EAAII,KAAK,UAAWO,GACpBE,EAAAA,GAAIC,MAAM,uBAAuBH,mBAAyBV,IAAU,GACnE,uBACCQ,GAAiDlB,EAAAA,EAAAA,KAAO,CAACS,EAAKC,KAChE,MAAMc,EAASf,EAAIgB,QAAQC,WAAa,CAAEZ,MAAO,EAAGC,OAAQ,EAAGC,EAAG,EAAGC,EAAG,GACxE,MAAO,CACLH,MAAOU,EAAOV,MAAkB,EAAVJ,EACtBK,OAAQS,EAAOT,OAAmB,EAAVL,EACxBM,EAAGQ,EAAOR,EACVC,EAAGO,EAAOP,EACX,GACA,kCACCI,GAAgCrB,EAAAA,EAAAA,KAAO,CAACgB,EAAGC,EAAGH,EAAOC,EAAQL,IACxD,GAAGM,EAAIN,KAAWO,EAAIP,KAAWI,KAASC,KAChD,gB,gHCTCY,EAAS,WACX,IAAIC,GAAoB5B,EAAAA,EAAAA,KAAO,SAAS6B,EAAGC,EAAGC,EAAIC,GAChD,IAAKD,EAAKA,GAAM,CAAC,EAAGC,EAAIH,EAAEI,OAAQD,IAAKD,EAAGF,EAAEG,IAAMF,GAClD,OAAOC,CACT,GAAG,KAAMG,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,GAAIC,EAAM,CAAC,EAAG,EAAG,GAAIC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,EAAG,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAKC,EAAM,CAAC,EAAG,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,KAAMC,EAAM,CAAC,GAAI,GAAI,GAAI,GAAI,IAAK,KAAMC,EAAM,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,KAAMC,EAAM,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,KAAMC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,KAAMC,EAAM,CAAC,EAAG,KAAMC,EAAM,CAAC,EAAG,KAAMC,EAAM,CAAC,EAAG,KAAMC,EAAM,CAAC,EAAG,KAAMC,EAAM,CAAC,EAAG,KAAMC,EAAM,CAA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AC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CA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","sources":["../node_modules/mermaid/dist/chunks/mermaid.core/chunk-RZ5BOZE2.mjs","../node_modules/mermaid/dist/chunks/mermaid.core/chunk-A2AXSNBT.mjs"],"sourcesContent":["import {\n __name,\n configureSvgSize,\n log\n} from \"./chunk-YTJNT7DU.mjs\";\n\n// src/rendering-util/insertElementsForSize.js\nimport { select } from \"d3\";\nvar getDiagramElement = /* @__PURE__ */ __name((id, securityLevel) => {\n let sandboxElement;\n if (securityLevel === \"sandbox\") {\n sandboxElement = select(\"#i\" + id);\n }\n const root = securityLevel === \"sandbox\" ? select(sandboxElement.nodes()[0].contentDocument.body) : select(\"body\");\n const svg = root.select(`[id=\"${id}\"]`);\n return svg;\n}, \"getDiagramElement\");\n\n// src/rendering-util/setupViewPortForSVG.ts\nvar setupViewPortForSVG = /* @__PURE__ */ __name((svg, padding, cssDiagram, useMaxWidth) => {\n svg.attr(\"class\", cssDiagram);\n const { width, height, x, y } = calculateDimensionsWithPadding(svg, padding);\n configureSvgSize(svg, height, width, useMaxWidth);\n const viewBox = createViewBox(x, y, width, height, padding);\n svg.attr(\"viewBox\", viewBox);\n log.debug(`viewBox configured: ${viewBox} with padding: ${padding}`);\n}, \"setupViewPortForSVG\");\nvar calculateDimensionsWithPadding = /* @__PURE__ */ __name((svg, padding) => {\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}, \"calculateDimensionsWithPadding\");\nvar createViewBox = /* @__PURE__ */ __name((x, y, width, height, padding) => {\n return `${x - padding} ${y - padding} ${width} ${height}`;\n}, \"createViewBox\");\n\nexport {\n getDiagramElement,\n setupViewPortForSVG\n};\n","import {\n getDiagramElement,\n setupViewPortForSVG\n} from \"./chunk-RZ5BOZE2.mjs\";\nimport {\n getRegisteredLayoutAlgorithm,\n render\n} from \"./chunk-TYCBKAJE.mjs\";\nimport {\n getEdgeId,\n utils_default\n} from \"./chunk-O4NI6UNU.mjs\";\nimport {\n __name,\n clear,\n common_default,\n getAccDescription,\n getAccTitle,\n getConfig2 as getConfig,\n getDiagramTitle,\n log,\n parseGenericTypes,\n sanitizeText,\n setAccDescription,\n setAccTitle,\n setDiagramTitle\n} from \"./chunk-YTJNT7DU.mjs\";\n\n// src/diagrams/class/parser/classDiagram.jison\nvar parser = function() {\n var o = /* @__PURE__ */ __name(function(k, v, o2, l) {\n for (o2 = o2 || {}, l = k.length; l--; o2[k[l]] = v) ;\n return o2;\n }, \"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, 66, 67, 68, 69, 70, 71, 72, 77, 79], $VB = [1, 8, 9, 12, 13, 17, 20, 22, 39, 41, 44, 48, 58, 66, 67, 68, 69, 70, 71, 72, 77, 79, 84, 99, 101, 102], $VC = [13, 58, 84, 99, 101, 102], $VD = [13, 58, 71, 72, 84, 99, 101, 102], $VE = [13, 58, 66, 67, 68, 69, 70, 84, 99, 101, 102], $VF = [1, 98], $VG = [1, 115], $VH = [1, 107], $VI = [1, 113], $VJ = [1, 108], $VK = [1, 109], $VL = [1, 110], $VM = [1, 111], $VN = [1, 112], $VO = [1, 114], $VP = [22, 58, 59, 80, 84, 85, 86, 87, 88, 89], $VQ = [1, 8, 9, 39, 41, 44], $VR = [1, 8, 9, 22], $VS = [1, 143], $VT = [1, 8, 9, 59], $VU = [1, 8, 9, 22, 58, 59, 80, 84, 85, 86, 87, 88, 89];\n var parser2 = {\n trace: /* @__PURE__ */ __name(function trace() {\n }, \"trace\"),\n yy: {},\n 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, \"DOT\": 17, \"className\": 18, \"classLiteralName\": 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, \"ANNOTATION_START\": 47, \"ANNOTATION_END\": 48, \"MEMBER\": 49, \"SEPARATOR\": 50, \"relation\": 51, \"NOTE_FOR\": 52, \"noteText\": 53, \"NOTE\": 54, \"CLASSDEF\": 55, \"classList\": 56, \"stylesOpt\": 57, \"ALPHA\": 58, \"COMMA\": 59, \"direction_tb\": 60, \"direction_bt\": 61, \"direction_rl\": 62, \"direction_lr\": 63, \"relationType\": 64, \"lineType\": 65, \"AGGREGATION\": 66, \"EXTENSION\": 67, \"COMPOSITION\": 68, \"DEPENDENCY\": 69, \"LOLLIPOP\": 70, \"LINE\": 71, \"DOTTED_LINE\": 72, \"CALLBACK\": 73, \"LINK\": 74, \"LINK_TARGET\": 75, \"CLICK\": 76, \"CALLBACK_NAME\": 77, \"CALLBACK_ARGS\": 78, \"HREF\": 79, \"STYLE\": 80, \"CSSCLASS\": 81, \"style\": 82, \"styleComponent\": 83, \"NUM\": 84, \"COLON\": 85, \"UNIT\": 86, \"SPACE\": 87, \"BRKT\": 88, \"PCT\": 89, \"commentToken\": 90, \"textToken\": 91, \"graphCodeTokens\": 92, \"textNoTagsToken\": 93, \"TAGSTART\": 94, \"TAGEND\": 95, \"==\": 96, \"--\": 97, \"DEFAULT\": 98, \"MINUS\": 99, \"keywords\": 100, \"UNICODE_TEXT\": 101, \"BQUOTE_STR\": 102, \"$accept\": 0, \"$end\": 1 },\n terminals_: { 2: \"error\", 7: \"CLASS_DIAGRAM\", 8: \"NEWLINE\", 9: \"EOF\", 12: \"SQS\", 13: \"STR\", 14: \"SQE\", 17: \"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\", 47: \"ANNOTATION_START\", 48: \"ANNOTATION_END\", 49: \"MEMBER\", 50: \"SEPARATOR\", 52: \"NOTE_FOR\", 54: \"NOTE\", 55: \"CLASSDEF\", 58: \"ALPHA\", 59: \"COMMA\", 60: \"direction_tb\", 61: \"direction_bt\", 62: \"direction_rl\", 63: \"direction_lr\", 66: \"AGGREGATION\", 67: \"EXTENSION\", 68: \"COMPOSITION\", 69: \"DEPENDENCY\", 70: \"LOLLIPOP\", 71: \"LINE\", 72: \"DOTTED_LINE\", 73: \"CALLBACK\", 74: \"LINK\", 75: \"LINK_TARGET\", 76: \"CLICK\", 77: \"CALLBACK_NAME\", 78: \"CALLBACK_ARGS\", 79: \"HREF\", 80: \"STYLE\", 81: \"CSSCLASS\", 84: \"NUM\", 85: \"COLON\", 86: \"UNIT\", 87: \"SPACE\", 88: \"BRKT\", 89: \"PCT\", 92: \"graphCodeTokens\", 94: \"TAGSTART\", 95: \"TAGEND\", 96: \"==\", 97: \"--\", 98: \"DEFAULT\", 99: \"MINUS\", 100: \"keywords\", 101: \"UNICODE_TEXT\", 102: \"BQUOTE_STR\" },\n productions_: [0, [3, 1], [3, 1], [4, 1], [6, 4], [5, 1], [5, 2], [5, 3], [11, 3], [15, 1], [15, 3], [15, 2], [18, 1], [18, 3], [18, 1], [18, 2], [18, 2], [18, 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, 6], [43, 2], [43, 3], [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], [56, 1], [56, 3], [32, 1], [32, 1], [32, 1], [32, 1], [51, 3], [51, 2], [51, 2], [51, 1], [64, 1], [64, 1], [64, 1], [64, 1], [64, 1], [65, 1], [65, 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], [57, 1], [57, 3], [82, 1], [82, 2], [83, 1], [83, 1], [83, 1], [83, 1], [83, 1], [83, 1], [83, 1], [83, 1], [83, 1], [90, 1], [90, 1], [91, 1], [91, 1], [91, 1], [91, 1], [91, 1], [91, 1], [91, 1], [93, 1], [93, 1], [93, 1], [93, 1], [16, 1], [16, 1], [16, 1], [16, 1], [19, 1], [53, 1]],\n performAction: /* @__PURE__ */ __name(function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) {\n var $0 = $$.length - 1;\n switch (yystate) {\n case 8:\n this.$ = $$[$0 - 1];\n break;\n case 9:\n case 12:\n case 14:\n this.$ = $$[$0];\n break;\n case 10:\n case 13:\n this.$ = $$[$0 - 2] + \".\" + $$[$0];\n break;\n case 11:\n case 15:\n this.$ = $$[$0 - 1] + $$[$0];\n break;\n case 16:\n case 17:\n this.$ = $$[$0 - 1] + \"~\" + $$[$0] + \"~\";\n break;\n case 18:\n yy.addRelation($$[$0]);\n break;\n case 19:\n $$[$0 - 1].title = yy.cleanupLabel($$[$0]);\n yy.addRelation($$[$0 - 1]);\n break;\n case 30:\n this.$ = $$[$0].trim();\n yy.setAccTitle(this.$);\n break;\n case 31:\n case 32:\n this.$ = $$[$0].trim();\n yy.setAccDescription(this.$);\n break;\n case 33:\n yy.addClassesToNamespace($$[$0 - 3], $$[$0 - 1]);\n break;\n case 34:\n yy.addClassesToNamespace($$[$0 - 4], $$[$0 - 1]);\n break;\n case 35:\n this.$ = $$[$0];\n yy.addNamespace($$[$0]);\n break;\n case 36:\n this.$ = [$$[$0]];\n break;\n case 37:\n this.$ = [$$[$0 - 1]];\n break;\n case 38:\n $$[$0].unshift($$[$0 - 2]);\n this.$ = $$[$0];\n break;\n case 40:\n yy.setCssClass($$[$0 - 2], $$[$0]);\n break;\n case 41:\n yy.addMembers($$[$0 - 3], $$[$0 - 1]);\n break;\n case 42:\n yy.setCssClass($$[$0 - 5], $$[$0 - 3]);\n yy.addMembers($$[$0 - 5], $$[$0 - 1]);\n break;\n case 43:\n this.$ = $$[$0];\n yy.addClass($$[$0]);\n break;\n case 44:\n this.$ = $$[$0 - 1];\n yy.addClass($$[$0 - 1]);\n yy.setClassLabel($$[$0 - 1], $$[$0]);\n break;\n case 45:\n yy.addAnnotation($$[$0], $$[$0 - 2]);\n break;\n case 46:\n case 59:\n this.$ = [$$[$0]];\n break;\n case 47:\n $$[$0].push($$[$0 - 1]);\n this.$ = $$[$0];\n break;\n case 48:\n break;\n case 49:\n yy.addMember($$[$0 - 1], yy.cleanupLabel($$[$0]));\n break;\n case 50:\n break;\n case 51:\n break;\n case 52:\n this.$ = { \"id1\": $$[$0 - 2], \"id2\": $$[$0], relation: $$[$0 - 1], relationTitle1: \"none\", relationTitle2: \"none\" };\n break;\n case 53:\n this.$ = { id1: $$[$0 - 3], id2: $$[$0], relation: $$[$0 - 1], relationTitle1: $$[$0 - 2], relationTitle2: \"none\" };\n break;\n case 54:\n this.$ = { id1: $$[$0 - 3], id2: $$[$0], relation: $$[$0 - 2], relationTitle1: \"none\", relationTitle2: $$[$0 - 1] };\n break;\n case 55:\n this.$ = { id1: $$[$0 - 4], id2: $$[$0], relation: $$[$0 - 2], relationTitle1: $$[$0 - 3], relationTitle2: $$[$0 - 1] };\n break;\n case 56:\n yy.addNote($$[$0], $$[$0 - 1]);\n break;\n case 57:\n yy.addNote($$[$0]);\n break;\n case 58:\n this.$ = $$[$0 - 2];\n yy.defineClass($$[$0 - 1], $$[$0]);\n break;\n case 60:\n this.$ = $$[$0 - 2].concat([$$[$0]]);\n break;\n case 61:\n yy.setDirection(\"TB\");\n break;\n case 62:\n yy.setDirection(\"BT\");\n break;\n case 63:\n yy.setDirection(\"RL\");\n break;\n case 64:\n yy.setDirection(\"LR\");\n break;\n case 65:\n this.$ = { type1: $$[$0 - 2], type2: $$[$0], lineType: $$[$0 - 1] };\n break;\n case 66:\n this.$ = { type1: \"none\", type2: $$[$0], lineType: $$[$0 - 1] };\n break;\n case 67:\n this.$ = { type1: $$[$0 - 1], type2: \"none\", lineType: $$[$0] };\n break;\n case 68:\n this.$ = { type1: \"none\", type2: \"none\", lineType: $$[$0] };\n break;\n case 69:\n this.$ = yy.relationType.AGGREGATION;\n break;\n case 70:\n this.$ = yy.relationType.EXTENSION;\n break;\n case 71:\n this.$ = yy.relationType.COMPOSITION;\n break;\n case 72:\n this.$ = yy.relationType.DEPENDENCY;\n break;\n case 73:\n this.$ = yy.relationType.LOLLIPOP;\n break;\n case 74:\n this.$ = yy.lineType.LINE;\n break;\n case 75:\n this.$ = yy.lineType.DOTTED_LINE;\n break;\n case 76:\n case 82:\n this.$ = $$[$0 - 2];\n yy.setClickEvent($$[$0 - 1], $$[$0]);\n break;\n case 77:\n case 83:\n this.$ = $$[$0 - 3];\n yy.setClickEvent($$[$0 - 2], $$[$0 - 1]);\n yy.setTooltip($$[$0 - 2], $$[$0]);\n break;\n case 78:\n this.$ = $$[$0 - 2];\n yy.setLink($$[$0 - 1], $$[$0]);\n break;\n case 79:\n this.$ = $$[$0 - 3];\n yy.setLink($$[$0 - 2], $$[$0 - 1], $$[$0]);\n break;\n case 80:\n this.$ = $$[$0 - 3];\n yy.setLink($$[$0 - 2], $$[$0 - 1]);\n yy.setTooltip($$[$0 - 2], $$[$0]);\n break;\n case 81:\n this.$ = $$[$0 - 4];\n yy.setLink($$[$0 - 3], $$[$0 - 2], $$[$0]);\n yy.setTooltip($$[$0 - 3], $$[$0 - 1]);\n break;\n case 84:\n this.$ = $$[$0 - 3];\n yy.setClickEvent($$[$0 - 2], $$[$0 - 1], $$[$0]);\n break;\n case 85:\n this.$ = $$[$0 - 4];\n yy.setClickEvent($$[$0 - 3], $$[$0 - 2], $$[$0 - 1]);\n yy.setTooltip($$[$0 - 3], $$[$0]);\n break;\n case 86:\n this.$ = $$[$0 - 3];\n yy.setLink($$[$0 - 2], $$[$0]);\n break;\n case 87:\n this.$ = $$[$0 - 4];\n yy.setLink($$[$0 - 3], $$[$0 - 1], $$[$0]);\n break;\n case 88:\n this.$ = $$[$0 - 4];\n yy.setLink($$[$0 - 3], $$[$0 - 1]);\n yy.setTooltip($$[$0 - 3], $$[$0]);\n break;\n case 89:\n this.$ = $$[$0 - 5];\n yy.setLink($$[$0 - 4], $$[$0 - 2], $$[$0]);\n yy.setTooltip($$[$0 - 4], $$[$0 - 1]);\n break;\n case 90:\n this.$ = $$[$0 - 2];\n yy.setCssStyle($$[$0 - 1], $$[$0]);\n break;\n case 91:\n yy.setCssClass($$[$0 - 1], $$[$0]);\n break;\n case 92:\n this.$ = [$$[$0]];\n break;\n case 93:\n $$[$0 - 2].push($$[$0]);\n this.$ = $$[$0 - 2];\n break;\n case 95:\n this.$ = $$[$0 - 1] + $$[$0];\n break;\n }\n }, \"anonymous\"),\n table: [{ 3: 1, 4: 2, 5: 3, 6: 4, 7: [1, 6], 10: 5, 16: 39, 18: 21, 19: 40, 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, 47: $V5, 49: $V6, 50: $V7, 52: $V8, 54: $V9, 55: $Va, 58: $Vb, 60: $Vc, 61: $Vd, 62: $Ve, 63: $Vf, 73: $Vg, 74: $Vh, 76: $Vi, 80: $Vj, 81: $Vk, 84: $Vl, 99: $Vm, 101: $Vn, 102: $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, 18], { 22: [1, 50] }), o($Vq, [2, 20]), 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]), { 34: [1, 51] }, { 36: [1, 52] }, o($Vq, [2, 32]), o($Vq, [2, 48], { 51: 53, 64: 56, 65: 57, 13: [1, 54], 22: [1, 55], 66: $Vr, 67: $Vs, 68: $Vt, 69: $Vu, 70: $Vv, 71: $Vw, 72: $Vx }), { 39: [1, 65] }, o($Vy, [2, 39], { 39: [1, 67], 44: [1, 66] }), o($Vq, [2, 50]), o($Vq, [2, 51]), { 16: 68, 58: $Vb, 84: $Vl, 99: $Vm, 101: $Vn }, { 16: 39, 18: 69, 19: 40, 58: $Vb, 84: $Vl, 99: $Vm, 101: $Vn, 102: $Vo }, { 16: 39, 18: 70, 19: 40, 58: $Vb, 84: $Vl, 99: $Vm, 101: $Vn, 102: $Vo }, { 16: 39, 18: 71, 19: 40, 58: $Vb, 84: $Vl, 99: $Vm, 101: $Vn, 102: $Vo }, { 58: [1, 72] }, { 13: [1, 73] }, { 16: 39, 18: 74, 19: 40, 58: $Vb, 84: $Vl, 99: $Vm, 101: $Vn, 102: $Vo }, { 13: $Vz, 53: 75 }, { 56: 77, 58: [1, 78] }, o($Vq, [2, 61]), o($Vq, [2, 62]), o($Vq, [2, 63]), o($Vq, [2, 64]), o($VA, [2, 12], { 16: 39, 19: 40, 18: 80, 17: [1, 79], 20: [1, 81], 58: $Vb, 84: $Vl, 99: $Vm, 101: $Vn, 102: $Vo }), o($VA, [2, 14], { 20: [1, 82] }), { 15: 83, 16: 84, 58: $Vb, 84: $Vl, 99: $Vm, 101: $Vn }, { 16: 39, 18: 85, 19: 40, 58: $Vb, 84: $Vl, 99: $Vm, 101: $Vn, 102: $Vo }, o($VB, [2, 118]), o($VB, [2, 119]), o($VB, [2, 120]), o($VB, [2, 121]), o([1, 8, 9, 12, 13, 20, 22, 39, 41, 44, 66, 67, 68, 69, 70, 71, 72, 77, 79], [2, 122]), 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, 18: 21, 38: 22, 43: 23, 16: 39, 19: 40, 5: 86, 33: $V0, 35: $V1, 37: $V2, 42: $V3, 46: $V4, 47: $V5, 49: $V6, 50: $V7, 52: $V8, 54: $V9, 55: $Va, 58: $Vb, 60: $Vc, 61: $Vd, 62: $Ve, 63: $Vf, 73: $Vg, 74: $Vh, 76: $Vi, 80: $Vj, 81: $Vk, 84: $Vl, 99: $Vm, 101: $Vn, 102: $Vo }), { 5: 87, 10: 5, 16: 39, 18: 21, 19: 40, 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, 47: $V5, 49: $V6, 50: $V7, 52: $V8, 54: $V9, 55: $Va, 58: $Vb, 60: $Vc, 61: $Vd, 62: $Ve, 63: $Vf, 73: $Vg, 74: $Vh, 76: $Vi, 80: $Vj, 81: $Vk, 84: $Vl, 99: $Vm, 101: $Vn, 102: $Vo }, o($Vq, [2, 19]), o($Vq, [2, 30]), o($Vq, [2, 31]), { 13: [1, 89], 16: 39, 18: 88, 19: 40, 58: $Vb, 84: $Vl, 99: $Vm, 101: $Vn, 102: $Vo }, { 51: 90, 64: 56, 65: 57, 66: $Vr, 67: $Vs, 68: $Vt, 69: $Vu, 70: $Vv, 71: $Vw, 72: $Vx }, o($Vq, [2, 49]), { 65: 91, 71: $Vw, 72: $Vx }, o($VC, [2, 68], { 64: 92, 66: $Vr, 67: $Vs, 68: $Vt, 69: $Vu, 70: $Vv }), o($VD, [2, 69]), o($VD, [2, 70]), o($VD, [2, 71]), o($VD, [2, 72]), o($VD, [2, 73]), o($VE, [2, 74]), o($VE, [2, 75]), { 8: [1, 94], 24: 95, 40: 93, 43: 23, 46: $V4 }, { 16: 96, 58: $Vb, 84: $Vl, 99: $Vm, 101: $Vn }, { 45: 97, 49: $VF }, { 48: [1, 99] }, { 13: [1, 100] }, { 13: [1, 101] }, { 77: [1, 102], 79: [1, 103] }, { 22: $VG, 57: 104, 58: $VH, 80: $VI, 82: 105, 83: 106, 84: $VJ, 85: $VK, 86: $VL, 87: $VM, 88: $VN, 89: $VO }, { 58: [1, 116] }, { 13: $Vz, 53: 117 }, o($Vq, [2, 57]), o($Vq, [2, 123]), { 22: $VG, 57: 118, 58: $VH, 59: [1, 119], 80: $VI, 82: 105, 83: 106, 84: $VJ, 85: $VK, 86: $VL, 87: $VM, 88: $VN, 89: $VO }, o($VP, [2, 59]), { 16: 39, 18: 120, 19: 40, 58: $Vb, 84: $Vl, 99: $Vm, 101: $Vn, 102: $Vo }, o($VA, [2, 15]), o($VA, [2, 16]), o($VA, [2, 17]), { 39: [2, 35] }, { 15: 122, 16: 84, 17: [1, 121], 39: [2, 9], 58: $Vb, 84: $Vl, 99: $Vm, 101: $Vn }, o($VQ, [2, 43], { 11: 123, 12: [1, 124] }), o($Vp, [2, 7]), { 9: [1, 125] }, o($VR, [2, 52]), { 16: 39, 18: 126, 19: 40, 58: $Vb, 84: $Vl, 99: $Vm, 101: $Vn, 102: $Vo }, { 13: [1, 128], 16: 39, 18: 127, 19: 40, 58: $Vb, 84: $Vl, 99: $Vm, 101: $Vn, 102: $Vo }, o($VC, [2, 67], { 64: 129, 66: $Vr, 67: $Vs, 68: $Vt, 69: $Vu, 70: $Vv }), o($VC, [2, 66]), { 41: [1, 130] }, { 24: 95, 40: 131, 43: 23, 46: $V4 }, { 8: [1, 132], 41: [2, 36] }, o($Vy, [2, 40], { 39: [1, 133] }), { 41: [1, 134] }, { 41: [2, 46], 45: 135, 49: $VF }, { 16: 39, 18: 136, 19: 40, 58: $Vb, 84: $Vl, 99: $Vm, 101: $Vn, 102: $Vo }, o($Vq, [2, 76], { 13: [1, 137] }), o($Vq, [2, 78], { 13: [1, 139], 75: [1, 138] }), o($Vq, [2, 82], { 13: [1, 140], 78: [1, 141] }), { 13: [1, 142] }, o($Vq, [2, 90], { 59: $VS }), o($VT, [2, 92], { 83: 144, 22: $VG, 58: $VH, 80: $VI, 84: $VJ, 85: $VK, 86: $VL, 87: $VM, 88: $VN, 89: $VO }), o($VU, [2, 94]), o($VU, [2, 96]), o($VU, [2, 97]), o($VU, [2, 98]), o($VU, [2, 99]), o($VU, [2, 100]), o($VU, [2, 101]), o($VU, [2, 102]), o($VU, [2, 103]), o($VU, [2, 104]), o($Vq, [2, 91]), o($Vq, [2, 56]), o($Vq, [2, 58], { 59: $VS }), { 58: [1, 145] }, o($VA, [2, 13]), { 15: 146, 16: 84, 58: $Vb, 84: $Vl, 99: $Vm, 101: $Vn }, { 39: [2, 11] }, o($VQ, [2, 44]), { 13: [1, 147] }, { 1: [2, 4] }, o($VR, [2, 54]), o($VR, [2, 53]), { 16: 39, 18: 148, 19: 40, 58: $Vb, 84: $Vl, 99: $Vm, 101: $Vn, 102: $Vo }, o($VC, [2, 65]), o($Vq, [2, 33]), { 41: [1, 149] }, { 24: 95, 40: 150, 41: [2, 37], 43: 23, 46: $V4 }, { 45: 151, 49: $VF }, o($Vy, [2, 41]), { 41: [2, 47] }, o($Vq, [2, 45]), o($Vq, [2, 77]), o($Vq, [2, 79]), o($Vq, [2, 80], { 75: [1, 152] }), o($Vq, [2, 83]), o($Vq, [2, 84], { 13: [1, 153] }), o($Vq, [2, 86], { 13: [1, 155], 75: [1, 154] }), { 22: $VG, 58: $VH, 80: $VI, 82: 156, 83: 106, 84: $VJ, 85: $VK, 86: $VL, 87: $VM, 88: $VN, 89: $VO }, o($VU, [2, 95]), o($VP, [2, 60]), { 39: [2, 10] }, { 14: [1, 157] }, o($VR, [2, 55]), o($Vq, [2, 34]), { 41: [2, 38] }, { 41: [1, 158] }, o($Vq, [2, 81]), o($Vq, [2, 85]), o($Vq, [2, 87]), o($Vq, [2, 88], { 75: [1, 159] }), o($VT, [2, 93], { 83: 144, 22: $VG, 58: $VH, 80: $VI, 84: $VJ, 85: $VK, 86: $VL, 87: $VM, 88: $VN, 89: $VO }), o($VQ, [2, 8]), o($Vy, [2, 42]), o($Vq, [2, 89])],\n defaultActions: { 2: [2, 1], 3: [2, 2], 4: [2, 3], 83: [2, 35], 122: [2, 11], 125: [2, 4], 135: [2, 47], 146: [2, 10], 150: [2, 38] },\n parseError: /* @__PURE__ */ __name(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 }, \"parseError\"),\n parse: /* @__PURE__ */ __name(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 lexer2 = 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 lexer2.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer2;\n sharedState.yy.parser = this;\n if (typeof lexer2.yylloc == \"undefined\") {\n lexer2.yylloc = {};\n }\n var yyloc = lexer2.yylloc;\n lstack.push(yyloc);\n var ranges = lexer2.options && lexer2.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 __name(popStack, \"popStack\");\n function lex() {\n var token;\n token = tstack.pop() || lexer2.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 __name(lex, \"lex\");\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 (lexer2.showPosition) {\n errStr = \"Parse error on line \" + (yylineno + 1) + \":\\n\" + lexer2.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: lexer2.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer2.yylineno,\n loc: yyloc,\n 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(lexer2.yytext);\n lstack.push(lexer2.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = lexer2.yyleng;\n yytext = lexer2.yytext;\n yylineno = lexer2.yylineno;\n yyloc = lexer2.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 }, \"parse\")\n };\n var lexer = /* @__PURE__ */ function() {\n var lexer2 = {\n EOF: 1,\n parseError: /* @__PURE__ */ __name(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 }, \"parseError\"),\n // resets the lexer, sets new input\n setInput: /* @__PURE__ */ __name(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 }, \"setInput\"),\n // consumes and returns one char from the input\n input: /* @__PURE__ */ __name(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 this._input = this._input.slice(1);\n return ch;\n }, \"input\"),\n // unshifts one char (or a string) into the input\n unput: /* @__PURE__ */ __name(function(ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - 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 if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\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 ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len\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 }, \"unput\"),\n // When called from action, caches matched text and appends it on next action\n more: /* @__PURE__ */ __name(function() {\n this._more = true;\n return this;\n }, \"more\"),\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.\n reject: /* @__PURE__ */ __name(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 return this;\n }, \"reject\"),\n // retain first n characters of the match\n less: /* @__PURE__ */ __name(function(n) {\n this.unput(this.match.slice(n));\n }, \"less\"),\n // displays already matched input, i.e. for error messages\n pastInput: /* @__PURE__ */ __name(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 }, \"pastInput\"),\n // displays upcoming input, i.e. for error messages\n upcomingInput: /* @__PURE__ */ __name(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 }, \"upcomingInput\"),\n // displays the character position where the lexing error occurred, i.e. for error messages\n showPosition: /* @__PURE__ */ __name(function() {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n }, \"showPosition\"),\n // test the lexed token: return FALSE when not a match, otherwise return token\n test_match: /* @__PURE__ */ __name(function(match, indexed_rule) {\n var token, lines, backup;\n if (this.options.backtrack_lexer) {\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 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 ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length : 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 for (var k in backup) {\n this[k] = backup[k];\n }\n return false;\n }\n return false;\n }, \"test_match\"),\n // return next match in input\n next: /* @__PURE__ */ __name(function() {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n var token, match, tempMatch, 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;\n } else {\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 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 }, \"next\"),\n // return next match that has a token\n lex: /* @__PURE__ */ __name(function lex() {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n }, \"lex\"),\n // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\n begin: /* @__PURE__ */ __name(function begin(condition) {\n this.conditionStack.push(condition);\n }, \"begin\"),\n // pop the previously active lexer condition state off the condition stack\n popState: /* @__PURE__ */ __name(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 }, \"popState\"),\n // produce the lexer rule set which is active for the currently active lexer condition state\n _currentRules: /* @__PURE__ */ __name(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 }, \"_currentRules\"),\n // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\n topState: /* @__PURE__ */ __name(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 }, \"topState\"),\n // alias for begin(condition)\n pushState: /* @__PURE__ */ __name(function pushState(condition) {\n this.begin(condition);\n }, \"pushState\"),\n // return the number of states currently on the stack\n stateStackSize: /* @__PURE__ */ __name(function stateStackSize() {\n return this.conditionStack.length;\n }, \"stateStackSize\"),\n options: {},\n performAction: /* @__PURE__ */ __name(function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) {\n var YYSTATE = YY_START;\n switch ($avoiding_name_collisions) {\n case 0:\n return 60;\n break;\n case 1:\n return 61;\n break;\n case 2:\n return 62;\n break;\n case 3:\n return 63;\n break;\n case 4:\n break;\n case 5:\n break;\n case 6:\n this.begin(\"acc_title\");\n return 33;\n break;\n case 7:\n this.popState();\n return \"acc_title_value\";\n break;\n case 8:\n this.begin(\"acc_descr\");\n return 35;\n break;\n case 9:\n this.popState();\n return \"acc_descr_value\";\n break;\n case 10:\n this.begin(\"acc_descr_multiline\");\n break;\n case 11:\n this.popState();\n break;\n case 12:\n return \"acc_descr_multiline_value\";\n break;\n case 13:\n return 8;\n break;\n case 14:\n break;\n case 15:\n return 7;\n break;\n case 16:\n return 7;\n break;\n case 17:\n return \"EDGE_STATE\";\n break;\n case 18:\n this.begin(\"callback_name\");\n break;\n case 19:\n this.popState();\n break;\n case 20:\n this.popState();\n this.begin(\"callback_args\");\n break;\n case 21:\n return 77;\n break;\n case 22:\n this.popState();\n break;\n case 23:\n return 78;\n break;\n case 24:\n this.popState();\n break;\n case 25:\n return \"STR\";\n break;\n case 26:\n this.begin(\"string\");\n break;\n case 27:\n return 80;\n break;\n case 28:\n return 55;\n break;\n case 29:\n this.begin(\"namespace\");\n return 42;\n break;\n case 30:\n this.popState();\n return 8;\n break;\n case 31:\n break;\n case 32:\n this.begin(\"namespace-body\");\n return 39;\n break;\n case 33:\n this.popState();\n return 41;\n break;\n case 34:\n return \"EOF_IN_STRUCT\";\n break;\n case 35:\n return 8;\n break;\n case 36:\n break;\n case 37:\n return \"EDGE_STATE\";\n break;\n case 38:\n this.begin(\"class\");\n return 46;\n break;\n case 39:\n this.popState();\n return 8;\n break;\n case 40:\n break;\n case 41:\n this.popState();\n this.popState();\n return 41;\n break;\n case 42:\n this.begin(\"class-body\");\n return 39;\n break;\n case 43:\n this.popState();\n return 41;\n break;\n case 44:\n return \"EOF_IN_STRUCT\";\n break;\n case 45:\n return \"EDGE_STATE\";\n break;\n case 46:\n return \"OPEN_IN_STRUCT\";\n break;\n case 47:\n break;\n case 48:\n return \"MEMBER\";\n break;\n case 49:\n return 81;\n break;\n case 50:\n return 73;\n break;\n case 51:\n return 74;\n break;\n case 52:\n return 76;\n break;\n case 53:\n return 52;\n break;\n case 54:\n return 54;\n break;\n case 55:\n return 47;\n break;\n case 56:\n return 48;\n break;\n case 57:\n return 79;\n break;\n case 58:\n this.popState();\n break;\n case 59:\n return \"GENERICTYPE\";\n break;\n case 60:\n this.begin(\"generic\");\n break;\n case 61:\n this.popState();\n break;\n case 62:\n return \"BQUOTE_STR\";\n break;\n case 63:\n this.begin(\"bqstring\");\n break;\n case 64:\n return 75;\n break;\n case 65:\n return 75;\n break;\n case 66:\n return 75;\n break;\n case 67:\n return 75;\n break;\n case 68:\n return 67;\n break;\n case 69:\n return 67;\n break;\n case 70:\n return 69;\n break;\n case 71:\n return 69;\n break;\n case 72:\n return 68;\n break;\n case 73:\n return 66;\n break;\n case 74:\n return 70;\n break;\n case 75:\n return 71;\n break;\n case 76:\n return 72;\n break;\n case 77:\n return 22;\n break;\n case 78:\n return 44;\n break;\n case 79:\n return 99;\n break;\n case 80:\n return 17;\n break;\n case 81:\n return \"PLUS\";\n break;\n case 82:\n return 85;\n break;\n case 83:\n return 59;\n break;\n case 84:\n return 88;\n break;\n case 85:\n return 88;\n break;\n case 86:\n return 89;\n break;\n case 87:\n return \"EQUALS\";\n break;\n case 88:\n return \"EQUALS\";\n break;\n case 89:\n return 58;\n break;\n case 90:\n return 12;\n break;\n case 91:\n return 14;\n break;\n case 92:\n return \"PUNCTUATION\";\n break;\n case 93:\n return 84;\n break;\n case 94:\n return 101;\n break;\n case 95:\n return 87;\n break;\n case 96:\n return 87;\n break;\n case 97:\n return 9;\n break;\n }\n }, \"anonymous\"),\n 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)/, /^(?:$)/],\n 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 } }\n };\n return lexer2;\n }();\n parser2.lexer = lexer;\n function Parser() {\n this.yy = {};\n }\n __name(Parser, \"Parser\");\n Parser.prototype = parser2;\n parser2.Parser = Parser;\n return new Parser();\n}();\nparser.parser = parser;\nvar classDiagram_default = parser;\n\n// src/diagrams/class/classDb.ts\nimport { select } from \"d3\";\n\n// src/diagrams/class/classTypes.ts\nvar visibilityValues = [\"#\", \"+\", \"~\", \"-\", \"\"];\nvar ClassMember = class {\n static {\n __name(this, \"ClassMember\");\n }\n constructor(input, memberType) {\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 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 displayText = displayText.trim();\n const cssStyle = this.parseClassifier();\n return {\n displayText,\n cssStyle\n };\n }\n parseMember(input) {\n let potentialClassifier = \"\";\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 if (visibilityValues.includes(detectedVisibility)) {\n this.visibility = detectedVisibility;\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 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 if (visibilityValues.includes(firstChar)) {\n this.visibility = firstChar;\n }\n if (/[$*]/.exec(lastChar)) {\n potentialClassifier = lastChar;\n }\n this.id = input.substring(\n this.visibility === \"\" ? 0 : 1,\n potentialClassifier === \"\" ? length : length - 1\n );\n }\n this.classifier = potentialClassifier;\n this.id = this.id.startsWith(\" \") ? \" \" + this.id.trim() : this.id.trim();\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 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\n// src/diagrams/class/classDb.ts\nvar MERMAID_DOM_ID_PREFIX = \"classId-\";\nvar classCounter = 0;\nvar sanitizeText2 = /* @__PURE__ */ __name((txt) => common_default.sanitizeText(txt, getConfig()), \"sanitizeText\");\nvar ClassDB = class {\n constructor() {\n this.relations = [];\n this.classes = /* @__PURE__ */ new Map();\n this.styleClasses = /* @__PURE__ */ new Map();\n this.notes = [];\n this.interfaces = [];\n // private static classCounter = 0;\n this.namespaces = /* @__PURE__ */ new Map();\n this.namespaceCounter = 0;\n this.functions = [];\n this.lineType = {\n LINE: 0,\n DOTTED_LINE: 1\n };\n this.relationType = {\n AGGREGATION: 0,\n EXTENSION: 1,\n COMPOSITION: 2,\n DEPENDENCY: 3,\n LOLLIPOP: 4\n };\n this.setupToolTips = /* @__PURE__ */ __name((element) => {\n let tooltipElem = select(\".mermaidTooltip\");\n if ((tooltipElem._groups || tooltipElem)[0][0] === null) {\n tooltipElem = select(\"body\").append(\"div\").attr(\"class\", \"mermaidTooltip\").style(\"opacity\", 0);\n }\n const svg = select(element).select(\"svg\");\n const nodes = svg.selectAll(\"g.node\");\n nodes.on(\"mouseover\", (event) => {\n const el = select(event.currentTarget);\n const title = el.attr(\"title\");\n if (title === null) {\n return;\n }\n const rect = this.getBoundingClientRect();\n tooltipElem.transition().duration(200).style(\"opacity\", \".9\");\n 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\");\n tooltipElem.html(tooltipElem.html().replace(/<br\\/>/g, \"
\"));\n el.classed(\"hover\", true);\n }).on(\"mouseout\", (event) => {\n tooltipElem.transition().duration(500).style(\"opacity\", 0);\n const el = select(event.currentTarget);\n el.classed(\"hover\", false);\n });\n }, \"setupToolTips\");\n this.direction = \"TB\";\n this.setAccTitle = setAccTitle;\n this.getAccTitle = getAccTitle;\n this.setAccDescription = setAccDescription;\n this.getAccDescription = getAccDescription;\n this.setDiagramTitle = setDiagramTitle;\n this.getDiagramTitle = getDiagramTitle;\n this.getConfig = /* @__PURE__ */ __name(() => getConfig().class, \"getConfig\");\n this.functions.push(this.setupToolTips.bind(this));\n this.clear();\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 this.setTooltip = this.setTooltip.bind(this);\n this.setClickEvent = this.setClickEvent.bind(this);\n this.setCssStyle = this.setCssStyle.bind(this);\n }\n static {\n __name(this, \"ClassDB\");\n }\n splitClassNameAndType(_id) {\n const id = common_default.sanitizeText(_id, getConfig());\n let genericType = \"\";\n let className = id;\n if (id.indexOf(\"~\") > 0) {\n const split = id.split(\"~\");\n className = sanitizeText2(split[0]);\n genericType = sanitizeText2(split[1]);\n }\n return { className, type: genericType };\n }\n setClassLabel(_id, label) {\n const id = common_default.sanitizeText(_id, getConfig());\n if (label) {\n label = sanitizeText2(label);\n }\n const { className } = this.splitClassNameAndType(id);\n this.classes.get(className).label = label;\n this.classes.get(className).text = `${label}${this.classes.get(className).type ? `<${this.classes.get(className).type}>` : \"\"}`;\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 addClass(_id) {\n const id = common_default.sanitizeText(_id, getConfig());\n const { className, type } = this.splitClassNameAndType(id);\n if (this.classes.has(className)) {\n return;\n }\n const name = common_default.sanitizeText(className, getConfig());\n this.classes.set(name, {\n id: name,\n 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 });\n classCounter++;\n }\n addInterface(label, classId) {\n const classInterface = {\n id: `interface${this.interfaces.length}`,\n label,\n classId\n };\n this.interfaces.push(classInterface);\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 lookUpDomId(_id) {\n const id = common_default.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 clear() {\n this.relations = [];\n this.classes = /* @__PURE__ */ new Map();\n this.notes = [];\n this.interfaces = [];\n this.functions = [];\n this.functions.push(this.setupToolTips.bind(this));\n this.namespaces = /* @__PURE__ */ new Map();\n this.namespaceCounter = 0;\n this.direction = \"TB\";\n clear();\n }\n getClass(id) {\n return this.classes.get(id);\n }\n getClasses() {\n return this.classes;\n }\n getRelations() {\n return this.relations;\n }\n getNotes() {\n return this.notes;\n }\n addRelation(classRelation) {\n log.debug(\"Adding relation: \" + JSON.stringify(classRelation));\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 if (classRelation.relation.type1 === this.relationType.LOLLIPOP && !invalidTypes.includes(classRelation.relation.type2)) {\n this.addClass(classRelation.id2);\n this.addInterface(classRelation.id1, classRelation.id2);\n classRelation.id1 = `interface${this.interfaces.length - 1}`;\n } else if (classRelation.relation.type2 === this.relationType.LOLLIPOP && !invalidTypes.includes(classRelation.relation.type1)) {\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 classRelation.id1 = this.splitClassNameAndType(classRelation.id1).className;\n classRelation.id2 = this.splitClassNameAndType(classRelation.id2).className;\n classRelation.relationTitle1 = common_default.sanitizeText(\n classRelation.relationTitle1.trim(),\n getConfig()\n );\n classRelation.relationTitle2 = common_default.sanitizeText(\n classRelation.relationTitle2.trim(),\n getConfig()\n );\n this.relations.push(classRelation);\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 addAnnotation(className, annotation) {\n const validatedClassName = this.splitClassNameAndType(className).className;\n this.classes.get(validatedClassName).annotations.push(annotation);\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 addMember(className, member) {\n this.addClass(className);\n const validatedClassName = this.splitClassNameAndType(className).className;\n const theClass = this.classes.get(validatedClassName);\n if (typeof member === \"string\") {\n const memberString = member.trim();\n if (memberString.startsWith(\"<<\") && memberString.endsWith(\">>\")) {\n theClass.annotations.push(sanitizeText2(memberString.substring(2, memberString.length - 2)));\n } else if (memberString.indexOf(\")\") > 0) {\n theClass.methods.push(new ClassMember(memberString, \"method\"));\n } else if (memberString) {\n theClass.members.push(new ClassMember(memberString, \"attribute\"));\n }\n }\n }\n addMembers(className, members) {\n if (Array.isArray(members)) {\n members.reverse();\n members.forEach((member) => this.addMember(className, member));\n }\n }\n addNote(text, className) {\n const note = {\n id: `note${this.notes.length}`,\n class: className,\n text\n };\n this.notes.push(note);\n }\n cleanupLabel(label) {\n if (label.startsWith(\":\")) {\n label = label.substring(1);\n }\n return sanitizeText2(label.trim());\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 setCssClass(ids, className) {\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 defineClass(ids, style) {\n for (const id of ids) {\n let styleClass = this.styleClasses.get(id);\n if (styleClass === void 0) {\n styleClass = { id, styles: [], textStyles: [] };\n this.styleClasses.set(id, styleClass);\n }\n if (style) {\n style.forEach((s) => {\n if (/color/.exec(s)) {\n const newStyle = s.replace(\"fill\", \"bgFill\");\n styleClass.textStyles.push(newStyle);\n }\n styleClass.styles.push(s);\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 * 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 setTooltip(ids, tooltip) {\n ids.split(\",\").forEach((id) => {\n if (tooltip !== void 0) {\n this.classes.get(id).tooltip = sanitizeText2(tooltip);\n }\n });\n }\n getTooltip(id, namespace) {\n if (namespace && this.namespaces.has(namespace)) {\n return this.namespaces.get(namespace).classes.get(id).tooltip;\n }\n return this.classes.get(id).tooltip;\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 setLink(ids, linkStr, target) {\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_default.formatUrl(linkStr, config);\n if (config.securityLevel === \"sandbox\") {\n theClass.linkTarget = \"_top\";\n } else if (typeof target === \"string\") {\n theClass.linkTarget = sanitizeText2(target);\n } else {\n theClass.linkTarget = \"_blank\";\n }\n }\n });\n this.setCssClass(ids, \"clickable\");\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 setClickEvent(ids, functionName, functionArgs) {\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 setClickFunc(_domId, functionName, functionArgs) {\n const domId = common_default.sanitizeText(_domId, getConfig());\n const config = getConfig();\n if (config.securityLevel !== \"loose\") {\n return;\n }\n if (functionName === void 0) {\n return;\n }\n const id = domId;\n if (this.classes.has(id)) {\n const elemId = this.lookUpDomId(id);\n let argList = [];\n if (typeof functionArgs === \"string\") {\n argList = functionArgs.split(/,(?=(?:(?:[^\"]*\"){2})*[^\"]*$)/);\n for (let i = 0; i < argList.length; i++) {\n let item = argList[i].trim();\n if (item.startsWith('\"') && item.endsWith('\"')) {\n item = item.substr(1, item.length - 2);\n }\n argList[i] = item;\n }\n }\n if (argList.length === 0) {\n argList.push(elemId);\n }\n this.functions.push(() => {\n const elem = document.querySelector(`[id=\"${elemId}\"]`);\n if (elem !== null) {\n elem.addEventListener(\n \"click\",\n () => {\n utils_default.runFunc(functionName, ...argList);\n },\n false\n );\n }\n });\n }\n }\n bindFunctions(element) {\n this.functions.forEach((fun) => {\n fun(element);\n });\n }\n getDirection() {\n return this.direction;\n }\n setDirection(dir) {\n this.direction = dir;\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 addNamespace(id) {\n if (this.namespaces.has(id)) {\n return;\n }\n this.namespaces.set(id, {\n id,\n classes: /* @__PURE__ */ new Map(),\n children: {},\n domId: MERMAID_DOM_ID_PREFIX + id + \"-\" + this.namespaceCounter\n });\n this.namespaceCounter++;\n }\n getNamespace(name) {\n return this.namespaces.get(name);\n }\n getNamespaces() {\n return this.namespaces;\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 addClassesToNamespace(id, classNames) {\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 setCssStyle(id, styles) {\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 * Gets the arrow marker for a type index\n *\n * @param type - The type to look for\n * @returns The arrow marker\n */\n getArrowMarker(type) {\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 getData() {\n const nodes = [];\n const edges = [];\n const config = getConfig();\n for (const namespaceKey of this.namespaces.keys()) {\n const namespace = this.namespaces.get(namespaceKey);\n if (namespace) {\n const 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 for (const classKey of this.classes.keys()) {\n const classNode = this.classes.get(classKey);\n if (classNode) {\n const node = classNode;\n node.parentId = classNode.parent;\n node.look = config.look;\n nodes.push(node);\n }\n }\n let cnt = 0;\n for (const note of this.notes) {\n cnt++;\n const noteNode = {\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 const noteClassId = this.classes.get(note.class)?.id ?? \"\";\n if (noteClassId) {\n const 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 for (const _interface of this.interfaces) {\n const interfaceNode = {\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 cnt = 0;\n for (const classRelation of this.relations) {\n cnt++;\n const 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: 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 return { nodes, edges, other: {}, config, direction: this.getDirection() };\n }\n};\n\n// src/diagrams/class/styles.js\nvar getStyles = /* @__PURE__ */ __name((options) => `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`, \"getStyles\");\nvar styles_default = getStyles;\n\n// src/diagrams/class/classRenderer-v3-unified.ts\nvar getDir = /* @__PURE__ */ __name((parsedItem, defaultDir = \"TB\") => {\n if (!parsedItem.doc) {\n return defaultDir;\n }\n let dir = defaultDir;\n for (const parsedItemDoc of parsedItem.doc) {\n if (parsedItemDoc.stmt === \"dir\") {\n dir = parsedItemDoc.value;\n }\n }\n return dir;\n}, \"getDir\");\nvar getClasses = /* @__PURE__ */ __name(function(text, diagramObj) {\n return diagramObj.db.getClasses();\n}, \"getClasses\");\nvar draw = /* @__PURE__ */ __name(async function(text, id, _version, diag) {\n log.info(\"REF0:\");\n log.info(\"Drawing class diagram (v3)\", id);\n const { securityLevel, state: conf, layout } = getConfig();\n const data4Layout = diag.db.getData();\n const svg = getDiagramElement(id, securityLevel);\n data4Layout.type = diag.type;\n data4Layout.layoutAlgorithm = getRegisteredLayoutAlgorithm(layout);\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_default.insertTitle(\n svg,\n \"classDiagramTitleText\",\n conf?.titleTopMargin ?? 25,\n diag.db.getDiagramTitle()\n );\n setupViewPortForSVG(svg, padding, \"classDiagram\", conf?.useMaxWidth ?? true);\n}, \"draw\");\nvar classRenderer_v3_unified_default = {\n getClasses,\n draw,\n getDir\n};\n\nexport {\n classDiagram_default,\n ClassDB,\n styles_default,\n classRenderer_v3_unified_default\n};\n"],"names":["getDiagramElement","__name","id","securityLevel","sandboxElement","select","nodes","contentDocument","body","setupViewPortForSVG","svg","padding","cssDiagram","useMaxWidth","attr","width","height","x","y","calculateDimensionsWithPadding","configureSvgSize","viewBox","createViewBox","log","debug","bounds","node","getBBox","parser","o","k","v","o2","l","length","$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","$VT","$VU","parser2","trace","yy","symbols_","terminals_","productions_","performAction","yytext","yyleng","yylineno","yystate","$$","_$","$0","this","$","addRelation","title","cleanupLabel","trim","setAccTitle","setAccDescription","addClassesToNamespace","addNamespace","unshift","setCssClass","addMembers","addClass","setClassLabel","addAnnotation","push","addMember","relation","relationTitle1","relationTitle2","id1","id2","addNote","defineClass","concat","setDirection","type1","type2","lineType","relationType","AGGREGATION","EXTENSION","COMPOSITION","DEPENDENCY","LOLLIPOP","LINE","DOTTED_LINE","setClickEvent","setTooltip","setLink","setCssStyle","table","defaultActions","parseError","str","hash","recoverable","error","Error","parse","input","self","stack","tstack","vstack","lstack","recovering","args","slice","call","arguments","lexer2","Object","create","lexer","sharedState","prototype","hasOwnProperty","setInput","yylloc","yyloc","ranges","options","lex","token","pop","Array","getPrototypeOf","n","symbol","preErrorSymbol","state","action","r","p","len","newState","expected","yyval","errStr","showPosition","join","text","match","line","loc","first_line","last_line","first_column","last_column","range","apply","EOF","_input","_more","_backtrack","done","matched","conditionStack","offset","ch","unput","lines","split","substr","oldLines","more","reject","backtrack_lexer","less","pastInput","past","replace","upcomingInput","next","pre","c","test_match","indexed_rule","backup","matches","tempMatch","index","rules","_currentRules","i","flex","begin","condition","popState","conditions","topState","Math","abs","pushState","stateStackSize","yy_","$avoiding_name_collisions","YY_START","Parser","classDiagram_default","visibilityValues","ClassMember","constructor","memberType","visibility","classifier","sanitizedInput","sanitizeText","getConfig","parseMember","getDisplayDetails","displayText","parseGenericTypes","parameters","returnType","cssStyle","parseClassifier","potentialClassifier","exec","detectedVisibility","includes","lastChar","substring","firstChar","startsWith","combinedText","replaceAll","MERMAID_DOM_ID_PREFIX","classCounter","sanitizeText2","txt","common_default","ClassDB","relations","classes","Map","styleClasses","notes","interfaces","namespaces","namespaceCounter","functions","setupToolTips","element","tooltipElem","_groups","append","style","selectAll","on","event","el","currentTarget","rect","getBoundingClientRect","transition","duration","window","scrollX","left","right","scrollY","top","document","scrollTop","html","classed","direction","getAccTitle","getAccDescription","setDiagramTitle","getDiagramTitle","class","bind","clear","bindFunctions","splitClassNameAndType","_id","genericType","className","indexOf","type","label","get","has","name","set","shape","cssClasses","methods","members","annotations","styles","domId","addInterface","classId","classInterface","lookUpDomId","getClass","getClasses","getRelations","getNotes","classRelation","JSON","stringify","invalidTypes","annotation","validatedClassName","member","theClass","memberString","endsWith","isArray","reverse","forEach","note","ids","classNode","styleClass","textStyles","s","newStyle","value","flatMap","tooltip","getTooltip","namespace","linkStr","target","config","link","utils_default","formatUrl","linkTarget","functionName","functionArgs","setClickFunc","haveCallback","_domId","elemId","argList","item","elem","querySelector","addEventListener","runFunc","fun","getDirection","dir","children","getNamespace","getNamespaces","classNames","parent","thisClass","getArrowMarker","marker","getData","edges","namespaceKey","keys","isGroup","cssStyles","look","classKey","parentId","cnt","noteNode","themeVariables","noteBkgColor","noteBorderColor","noteClassId","edge","start","end","thickness","arrowTypeStart","arrowTypeEnd","arrowheadStyle","labelStyle","pattern","_interface","interfaceNode","getEdgeId","prefix","counter","labelpos","startLabelRight","endLabelLeft","other","styles_default","nodeBorder","classText","fontFamily","mainBkg","lineColor","textColor","getDir","parsedItem","defaultDir","undefined","doc","parsedItemDoc","stmt","classRenderer_v3_unified_default","diagramObj","db","draw","async","_version","diag","info","conf","layout","data4Layout","layoutAlgorithm","getRegisteredLayoutAlgorithm","nodeSpacing","rankSpacing","markers","diagramId","render","insertTitle","titleTopMargin"],"sourceRoot":""} \ No newline at end of file diff --git a/frontend/deployed/static/js/355.143eaed8.chunk.js b/frontend/deployed/static/js/355.143eaed8.chunk.js deleted file mode 100644 index 63a54d6..0000000 --- a/frontend/deployed/static/js/355.143eaed8.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunkbackstory=self.webpackChunkbackstory||[]).push([[355],{3355:(t,e,s)=>{s.d(e,{Zk:()=>c,q7:()=>O,tM:()=>tt,u4:()=>Q});var i=s(6327),n=s(53),r=s(634),o=s(3759),a=function(){var t=(0,o.K2)((function(t,e,s,i){for(s=s||{},i=t.length;i--;s[t[i]]=e);return s}),"o"),e=[1,2],s=[1,3],i=[1,4],n=[2,4],r=[1,9],a=[1,11],c=[1,16],l=[1,17],h=[1,18],d=[1,19],u=[1,32],p=[1,20],y=[1,21],g=[1,22],m=[1,23],f=[1,24],S=[1,26],_=[1,27],b=[1,28],T=[1,29],k=[1,30],E=[1,31],D=[1,34],x=[1,35],v=[1,36],C=[1,37],$=[1,33],I=[1,4,5,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,42,45,48,49,50,51,54],L=[1,4,5,14,15,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,42,45,48,49,50,51,54],A=[4,5,16,17,19,21,22,24,25,26,27,28,29,33,35,37,38,42,45,48,49,50,51,54],R={trace:(0,o.K2)((function(){}),"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,"--\x3e":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,classDef:38,CLASSDEF_ID:39,CLASSDEF_STYLEOPTS:40,DEFAULT:41,style:42,STYLE_IDS:43,STYLEDEF_STYLEOPTS:44,class:45,CLASSENTITY_IDS:46,STYLECLASS:47,direction_tb:48,direction_bt:49,direction_rl:50,direction_lr:51,eol:52,";":53,EDGE_STATE:54,STYLE_SEPARATOR:55,left_of:56,right_of:57,$accept:0,$end:1},terminals_:{2:"error",4:"SPACE",5:"NL",6:"SD",14:"DESCR",15:"--\x3e",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:"classDef",39:"CLASSDEF_ID",40:"CLASSDEF_STYLEOPTS",41:"DEFAULT",42:"style",43:"STYLE_IDS",44:"STYLEDEF_STYLEOPTS",45:"class",46:"CLASSENTITY_IDS",47:"STYLECLASS",48:"direction_tb",49:"direction_bt",50:"direction_rl",51:"direction_lr",53:";",54:"EDGE_STATE",55:"STYLE_SEPARATOR",56:"left_of",57:"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],[10,3],[10,3],[11,3],[12,3],[32,1],[32,1],[32,1],[32,1],[52,1],[52,1],[13,1],[13,1],[13,3],[13,3],[30,1],[30,1]],performAction:(0,o.K2)((function(t,e,s,i,n,r,o){var a=r.length-1;switch(n){case 3:return i.setRootDoc(r[a]),r[a];case 4:this.$=[];break;case 5:"nl"!=r[a]&&(r[a-1].push(r[a]),this.$=r[a-1]);break;case 6:case 7:case 12:this.$=r[a];break;case 8:this.$="nl";break;case 13:const t=r[a-1];t.description=i.trimColon(r[a]),this.$=t;break;case 14:this.$={stmt:"relation",state1:r[a-2],state2:r[a]};break;case 15:const e=i.trimColon(r[a]);this.$={stmt:"relation",state1:r[a-3],state2:r[a-1],description:e};break;case 19:this.$={stmt:"state",id:r[a-3],type:"default",description:"",doc:r[a-1]};break;case 20:var c=r[a],l=r[a-2].trim();if(r[a].match(":")){var h=r[a].split(":");c=h[0],l=[l,h[1]]}this.$={stmt:"state",id:c,type:"default",description:l};break;case 21:this.$={stmt:"state",id:r[a-3],type:"default",description:r[a-5],doc:r[a-1]};break;case 22:this.$={stmt:"state",id:r[a],type:"fork"};break;case 23:this.$={stmt:"state",id:r[a],type:"join"};break;case 24:this.$={stmt:"state",id:r[a],type:"choice"};break;case 25:this.$={stmt:"state",id:i.getDividerId(),type:"divider"};break;case 26:this.$={stmt:"state",id:r[a-1].trim(),note:{position:r[a-2].trim(),text:r[a].trim()}};break;case 29:this.$=r[a].trim(),i.setAccTitle(this.$);break;case 30:case 31:this.$=r[a].trim(),i.setAccDescription(this.$);break;case 32:case 33:this.$={stmt:"classDef",id:r[a-1].trim(),classes:r[a].trim()};break;case 34:this.$={stmt:"style",id:r[a-1].trim(),styleClass:r[a].trim()};break;case 35:this.$={stmt:"applyClass",id:r[a-1].trim(),styleClass:r[a].trim()};break;case 36:i.setDirection("TB"),this.$={stmt:"dir",value:"TB"};break;case 37:i.setDirection("BT"),this.$={stmt:"dir",value:"BT"};break;case 38:i.setDirection("RL"),this.$={stmt:"dir",value:"RL"};break;case 39:i.setDirection("LR"),this.$={stmt:"dir",value:"LR"};break;case 42:case 43:this.$={stmt:"state",id:r[a].trim(),type:"default",description:""};break;case 44:case 45:this.$={stmt:"state",id:r[a-2].trim(),classes:[r[a].trim()],type:"default",description:""}}}),"anonymous"),table:[{3:1,4:e,5:s,6:i},{1:[3]},{3:5,4:e,5:s,6:i},{3:6,4:e,5:s,6:i},t([1,4,5,16,17,19,22,24,25,26,27,28,29,33,35,37,38,42,45,48,49,50,51,54],n,{7:7}),{1:[2,1]},{1:[2,2]},{1:[2,3],4:r,5:a,8:8,9:10,10:12,11:13,12:14,13:15,16:c,17:l,19:h,22:d,24:u,25:p,26:y,27:g,28:m,29:f,32:25,33:S,35:_,37:b,38:T,42:k,45:E,48:D,49:x,50:v,51:C,54:$},t(I,[2,5]),{9:38,10:12,11:13,12:14,13:15,16:c,17:l,19:h,22:d,24:u,25:p,26:y,27:g,28:m,29:f,32:25,33:S,35:_,37:b,38:T,42:k,45:E,48:D,49:x,50:v,51:C,54:$},t(I,[2,7]),t(I,[2,8]),t(I,[2,9]),t(I,[2,10]),t(I,[2,11]),t(I,[2,12],{14:[1,39],15:[1,40]}),t(I,[2,16]),{18:[1,41]},t(I,[2,18],{20:[1,42]}),{23:[1,43]},t(I,[2,22]),t(I,[2,23]),t(I,[2,24]),t(I,[2,25]),{30:44,31:[1,45],56:[1,46],57:[1,47]},t(I,[2,28]),{34:[1,48]},{36:[1,49]},t(I,[2,31]),{39:[1,50],41:[1,51]},{43:[1,52]},{46:[1,53]},t(L,[2,42],{55:[1,54]}),t(L,[2,43],{55:[1,55]}),t(I,[2,36]),t(I,[2,37]),t(I,[2,38]),t(I,[2,39]),t(I,[2,6]),t(I,[2,13]),{13:56,24:u,54:$},t(I,[2,17]),t(A,n,{7:57}),{24:[1,58]},{24:[1,59]},{23:[1,60]},{24:[2,46]},{24:[2,47]},t(I,[2,29]),t(I,[2,30]),{40:[1,61]},{40:[1,62]},{44:[1,63]},{47:[1,64]},{24:[1,65]},{24:[1,66]},t(I,[2,14],{14:[1,67]}),{4:r,5:a,8:8,9:10,10:12,11:13,12:14,13:15,16:c,17:l,19:h,21:[1,68],22:d,24:u,25:p,26:y,27:g,28:m,29:f,32:25,33:S,35:_,37:b,38:T,42:k,45:E,48:D,49:x,50:v,51:C,54:$},t(I,[2,20],{20:[1,69]}),{31:[1,70]},{24:[1,71]},t(I,[2,32]),t(I,[2,33]),t(I,[2,34]),t(I,[2,35]),t(L,[2,44]),t(L,[2,45]),t(I,[2,15]),t(I,[2,19]),t(A,n,{7:72}),t(I,[2,26]),t(I,[2,27]),{4:r,5:a,8:8,9:10,10:12,11:13,12:14,13:15,16:c,17:l,19:h,21:[1,73],22:d,24:u,25:p,26:y,27:g,28:m,29:f,32:25,33:S,35:_,37:b,38:T,42:k,45:E,48:D,49:x,50:v,51:C,54:$},t(I,[2,21])],defaultActions:{5:[2,1],6:[2,2],46:[2,46],47:[2,47]},parseError:(0,o.K2)((function(t,e){if(!e.recoverable){var s=new Error(t);throw s.hash=e,s}this.trace(t)}),"parseError"),parse:(0,o.K2)((function(t){var e=this,s=[0],i=[],n=[null],r=[],a=this.table,c="",l=0,h=0,d=0,u=r.slice.call(arguments,1),p=Object.create(this.lexer),y={yy:{}};for(var g in this.yy)Object.prototype.hasOwnProperty.call(this.yy,g)&&(y.yy[g]=this.yy[g]);p.setInput(t,y.yy),y.yy.lexer=p,y.yy.parser=this,"undefined"==typeof p.yylloc&&(p.yylloc={});var m=p.yylloc;r.push(m);var f=p.options&&p.options.ranges;function S(){var t;return"number"!==typeof(t=i.pop()||p.lex()||1)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"===typeof y.yy.parseError?this.parseError=y.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError,(0,o.K2)((function(t){s.length=s.length-2*t,n.length=n.length-t,r.length=r.length-t}),"popStack"),(0,o.K2)(S,"lex");for(var _,b,T,k,E,D,x,v,C,$={};;){if(T=s[s.length-1],this.defaultActions[T]?k=this.defaultActions[T]:(null!==_&&"undefined"!=typeof _||(_=S()),k=a[T]&&a[T][_]),"undefined"===typeof k||!k.length||!k[0]){var I="";for(D in C=[],a[T])this.terminals_[D]&&D>2&&C.push("'"+this.terminals_[D]+"'");I=p.showPosition?"Parse error on line "+(l+1)+":\n"+p.showPosition()+"\nExpecting "+C.join(", ")+", got '"+(this.terminals_[_]||_)+"'":"Parse error on line "+(l+1)+": Unexpected "+(1==_?"end of input":"'"+(this.terminals_[_]||_)+"'"),this.parseError(I,{text:p.match,token:this.terminals_[_]||_,line:p.yylineno,loc:m,expected:C})}if(k[0]instanceof Array&&k.length>1)throw new Error("Parse Error: multiple actions possible at state: "+T+", token: "+_);switch(k[0]){case 1:s.push(_),n.push(p.yytext),r.push(p.yylloc),s.push(k[1]),_=null,b?(_=b,b=null):(h=p.yyleng,c=p.yytext,l=p.yylineno,m=p.yylloc,d>0&&d--);break;case 2:if(x=this.productions_[k[1]][1],$.$=n[n.length-x],$._$={first_line:r[r.length-(x||1)].first_line,last_line:r[r.length-1].last_line,first_column:r[r.length-(x||1)].first_column,last_column:r[r.length-1].last_column},f&&($._$.range=[r[r.length-(x||1)].range[0],r[r.length-1].range[1]]),"undefined"!==typeof(E=this.performAction.apply($,[c,h,l,y.yy,k[1],n,r].concat(u))))return E;x&&(s=s.slice(0,-1*x*2),n=n.slice(0,-1*x),r=r.slice(0,-1*x)),s.push(this.productions_[k[1]][0]),n.push($.$),r.push($._$),v=a[s[s.length-2]][s[s.length-1]],s.push(v);break;case 3:return!0}}return!0}),"parse")},w=function(){return{EOF:1,parseError:(0,o.K2)((function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)}),"parseError"),setInput:(0,o.K2)((function(t,e){return this.yy=e||this.yy||{},this._input=t,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:(0,o.K2)((function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t}),"input"),unput:(0,o.K2)((function(t){var e=t.length,s=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=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),s.length-1&&(this.yylineno-=s.length-1);var n=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:s?(s.length===i.length?this.yylloc.first_column:0)+i[i.length-s.length].length-s[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[n[0],n[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this}),"unput"),more:(0,o.K2)((function(){return this._more=!0,this}),"more"),reject:(0,o.K2)((function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):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})}),"reject"),less:(0,o.K2)((function(t){this.unput(this.match.slice(t))}),"less"),pastInput:(0,o.K2)((function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")}),"pastInput"),upcomingInput:(0,o.K2)((function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")}),"upcomingInput"),showPosition:(0,o.K2)((function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"}),"showPosition"),test_match:(0,o.K2)((function(t,e){var s,i,n;if(this.options.backtrack_lexer&&(n={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&&(n.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,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(t[0].length),this.matched+=t[0],s=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),s)return s;if(this._backtrack){for(var r in n)this[r]=n[r];return!1}return!1}),"test_match"),next:(0,o.K2)((function(){if(this.done)return this.EOF;var t,e,s,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var n=this._currentRules(),r=0;re[0].length)){if(e=s,i=r,this.options.backtrack_lexer){if(!1!==(t=this.test_match(s,n[r])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,n[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})}),"next"),lex:(0,o.K2)((function(){var t=this.next();return t||this.lex()}),"lex"),begin:(0,o.K2)((function(t){this.conditionStack.push(t)}),"begin"),popState:(0,o.K2)((function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]}),"popState"),_currentRules:(0,o.K2)((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:(0,o.K2)((function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"}),"topState"),pushState:(0,o.K2)((function(t){this.begin(t)}),"pushState"),stateStackSize:(0,o.K2)((function(){return this.conditionStack.length}),"stateStackSize"),options:{"case-insensitive":!0},performAction:(0,o.K2)((function(t,e,s,i){switch(s){case 0:return 41;case 1:case 42:return 48;case 2:case 43:return 49;case 3:case 44:return 50;case 4:case 45:return 51;case 5:case 6:case 8:case 9:case 10:case 11:case 54:case 56:case 62:break;case 7:case 77:return 5;case 12:case 32:return this.pushState("SCALE"),17;case 13:case 33:return 18;case 14:case 20:case 34:case 49:case 52:this.popState();break;case 15:return this.begin("acc_title"),33;case 16:return this.popState(),"acc_title_value";case 17:return this.begin("acc_descr"),35;case 18:return this.popState(),"acc_descr_value";case 19:this.begin("acc_descr_multiline");break;case 21:return"acc_descr_multiline_value";case 22:return this.pushState("CLASSDEF"),38;case 23:return this.popState(),this.pushState("CLASSDEFID"),"DEFAULT_CLASSDEF_ID";case 24:return this.popState(),this.pushState("CLASSDEFID"),39;case 25:return this.popState(),40;case 26:return this.pushState("CLASS"),45;case 27:return this.popState(),this.pushState("CLASS_STYLE"),46;case 28:return this.popState(),47;case 29:return this.pushState("STYLE"),42;case 30:return this.popState(),this.pushState("STYLEDEF_STYLES"),43;case 31:return this.popState(),44;case 35:this.pushState("STATE");break;case 36:case 39:return this.popState(),e.yytext=e.yytext.slice(0,-8).trim(),25;case 37:case 40:return this.popState(),e.yytext=e.yytext.slice(0,-8).trim(),26;case 38:case 41:return this.popState(),e.yytext=e.yytext.slice(0,-10).trim(),27;case 46:this.pushState("STATE_STRING");break;case 47:return this.pushState("STATE_ID"),"AS";case 48:case 64:return this.popState(),"ID";case 50:return"STATE_DESCR";case 51:return 19;case 53:return this.popState(),this.pushState("struct"),20;case 55:return this.popState(),21;case 57:return this.begin("NOTE"),29;case 58:return this.popState(),this.pushState("NOTE_ID"),56;case 59:return this.popState(),this.pushState("NOTE_ID"),57;case 60:this.popState(),this.pushState("FLOATING_NOTE");break;case 61:return this.popState(),this.pushState("FLOATING_NOTE_ID"),"AS";case 63:return"NOTE_TEXT";case 65:return this.popState(),this.pushState("NOTE_TEXT"),24;case 66:return this.popState(),e.yytext=e.yytext.substr(2).trim(),31;case 67:return this.popState(),e.yytext=e.yytext.slice(0,-8).trim(),31;case 68:case 69:return 6;case 70:return 16;case 71:return 54;case 72:return 24;case 73:return e.yytext=e.yytext.trim(),14;case 74:return 15;case 75:return 28;case 76:return 55;case 78:return"INVALID"}}),"anonymous"),rules:[/^(?: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:[9,10],inclusive:!1},struct:{rules:[9,10,22,26,29,35,42,43,44,45,54,55,56,57,71,72,73,74,75],inclusive:!1},FLOATING_NOTE_ID:{rules:[64],inclusive:!1},FLOATING_NOTE:{rules:[61,62,63],inclusive:!1},NOTE_TEXT:{rules:[66,67],inclusive:!1},NOTE_ID:{rules:[65],inclusive:!1},NOTE:{rules:[58,59,60],inclusive:!1},STYLEDEF_STYLEOPTS:{rules:[],inclusive:!1},STYLEDEF_STYLES:{rules:[31],inclusive:!1},STYLE_IDS:{rules:[],inclusive:!1},STYLE:{rules:[30],inclusive:!1},CLASS_STYLE:{rules:[28],inclusive:!1},CLASS:{rules:[27],inclusive:!1},CLASSDEFID:{rules:[25],inclusive:!1},CLASSDEF:{rules:[23,24],inclusive:!1},acc_descr_multiline:{rules:[20,21],inclusive:!1},acc_descr:{rules:[18],inclusive:!1},acc_title:{rules:[16],inclusive:!1},SCALE:{rules:[13,14,33,34],inclusive:!1},ALIAS:{rules:[],inclusive:!1},STATE_ID:{rules:[48],inclusive:!1},STATE_STRING:{rules:[49,50],inclusive:!1},FORK_STATE:{rules:[],inclusive:!1},STATE:{rules:[9,10,36,37,38,39,40,41,46,47,51,52,53],inclusive:!1},ID:{rules:[9,10],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7,8,10,11,12,15,17,19,22,26,29,32,35,53,57,68,69,70,71,72,73,74,76,77,78],inclusive:!0}}}}();function O(){this.yy={}}return R.lexer=w,(0,o.K2)(O,"Parser"),O.prototype=R,R.Parser=O,new O}();a.parser=a;var c=a,l="state",h="relation",d="default",u="divider",p="fill:none",y="fill: #333",g="text",m="normal",f="rect",S="rectWithTitle",_="divider",b="roundedWithTitle",T="statediagram",k=`${T}-state`,E="transition",D=`${E} note-edge`,x=`${T}-note`,v=`${T}-cluster`,C=`${T}-cluster-alt`,$="parent",I="note",L="----",A=`${L}${I}`,R=`${L}${$}`,w=(0,o.K2)((function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"TB";if(!t.doc)return e;let s=e;for(const i of t.doc)"dir"===i.stmt&&(s=i.value);return s}),"getDir"),O={getClasses:(0,o.K2)((function(t,e){return e.db.getClasses()}),"getClasses"),draw:(0,o.K2)((async function(t,e,s,a){o.Rm.info("REF0:"),o.Rm.info("Drawing state diagram (v2)",e);const{securityLevel:c,state:l,layout:h}=(0,o.D7)();a.db.extract(a.db.getRootDocV2());const d=a.db.getData(),u=(0,i.A)(e,c);d.type=a.type,d.layoutAlgorithm=h,d.nodeSpacing=l?.nodeSpacing||50,d.rankSpacing=l?.rankSpacing||50,d.markers=["barb"],d.diagramId=e,await(0,n.XX)(d,u);r._K.insertTitle(u,"statediagramTitleText",l?.titleTopMargin??25,a.db.getDiagramTitle()),(0,i.P)(u,8,T,l?.useMaxWidth??!0)}),"draw"),getDir:w},N=new Map,K=0;function B(){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"",s=arguments.length>3&&void 0!==arguments[3]?arguments[3]:L;return`state-${arguments.length>0&&void 0!==arguments[0]?arguments[0]:""}${null!==e&&e.length>0?`${s}${e}`:""}-${t}`}(0,o.K2)(B,"stateDomId");var F=(0,o.K2)(((t,e,s,i,n,r,a,c)=>{o.Rm.trace("items",e),e.forEach((e=>{switch(e.stmt){case l:case d:z(t,e,s,i,n,r,a,c);break;case h:{z(t,e.state1,s,i,n,r,a,c),z(t,e.state2,s,i,n,r,a,c);const l={id:"edge"+K,start:e.state1.id,end:e.state2.id,arrowhead:"normal",arrowTypeEnd:"arrow_barb",style:p,labelStyle:"",label:o.Y2.sanitizeText(e.description,(0,o.D7)()),arrowheadStyle:y,labelpos:"c",labelType:g,thickness:m,classes:E,look:a};n.push(l),K++}}}))}),"setupDoc"),Y=(0,o.K2)((function(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"TB";if(t.doc)for(const s of t.doc)"dir"===s.stmt&&(e=s.value);return e}),"getDir");function P(t,e,s){if(!e.id||""===e.id||""===e.id)return;e.cssClasses&&(Array.isArray(e.cssCompiledStyles)||(e.cssCompiledStyles=[]),e.cssClasses.split(" ").forEach((t=>{if(s.get(t)){const i=s.get(t);e.cssCompiledStyles=[...e.cssCompiledStyles,...i.styles]}})));const i=t.find((t=>t.id===e.id));i?Object.assign(i,e):t.push(e)}function G(t){return t?.classes?.join(" ")??""}function j(t){return t?.styles??[]}(0,o.K2)(P,"insertOrUpdateNode"),(0,o.K2)(G,"getClassesFromDbInfo"),(0,o.K2)(j,"getStylesFromDbInfo");var z=(0,o.K2)(((t,e,s,i,n,r,a,c)=>{const l=e.id,h=s.get(l),T=G(h),E=j(h);if(o.Rm.info("dataFetcher parsedItem",e,h,E),"root"!==l){let s=f;!0===e.start?s="stateStart":!1===e.start&&(s="stateEnd"),e.type!==d&&(s=e.type),N.get(l)||N.set(l,{id:l,shape:s,description:o.Y2.sanitizeText(l,(0,o.D7)()),cssClasses:`${T} ${k}`,cssStyles:E});const h=N.get(l);e.description&&(Array.isArray(h.description)?(h.shape=S,h.description.push(e.description)):h.description?.length>0?(h.shape=S,h.description===l?h.description=[e.description]:h.description=[h.description,e.description]):(h.shape=f,h.description=e.description),h.description=o.Y2.sanitizeTextOrArray(h.description,(0,o.D7)())),1===h.description?.length&&h.shape===S&&("group"===h.type?h.shape=b:h.shape=f),!h.type&&e.doc&&(o.Rm.info("Setting cluster for XCX",l,Y(e)),h.type="group",h.isGroup=!0,h.dir=Y(e),h.shape=e.type===u?_:b,h.cssClasses=`${h.cssClasses} ${v} ${r?C:""}`);const L={labelStyle:"",shape:h.shape,label:h.description,cssClasses:h.cssClasses,cssCompiledStyles:[],cssStyles:h.cssStyles,id:l,dir:h.dir,domId:B(l,K),type:h.type,isGroup:"group"===h.type,padding:8,rx:10,ry:10,look:a};if(L.shape===_&&(L.label=""),t&&"root"!==t.id&&(o.Rm.trace("Setting node ",l," to be child of its parent ",t.id),L.parentId=t.id),L.centerLabel=!0,e.note){const t={labelStyle:"",shape:"note",label:e.note.text,cssClasses:x,cssStyles:[],cssCompilesStyles:[],id:l+A+"-"+K,domId:B(l,K,I),type:h.type,isGroup:"group"===h.type,padding:(0,o.D7)().flowchart.padding,look:a,position:e.note.position},s=l+R,r={labelStyle:"",shape:"noteGroup",label:e.note.text,cssClasses:h.cssClasses,cssStyles:[],id:l+R,domId:B(l,K,$),type:"group",isGroup:!0,padding:16,look:a,position:e.note.position};K++,r.id=s,t.parentId=s,P(i,r,c),P(i,t,c),P(i,L,c);let d=l,u=t.id;"left of"===e.note.position&&(d=t.id,u=l),n.push({id:d+"-"+u,start:d,end:u,arrowhead:"none",arrowTypeEnd:"",style:p,labelStyle:"",classes:D,arrowheadStyle:y,labelpos:"c",labelType:g,thickness:m,look:a})}else P(i,L,c)}e.doc&&(o.Rm.trace("Adding nodes children "),F(e,e.doc,s,i,n,!r,a,c))}),"dataFetcher"),U=(0,o.K2)((()=>{N.clear(),K=0}),"reset"),M="[*]",V="start",X=M,W="color",H="fill";function J(){return new Map}(0,o.K2)(J,"newClassesList");var q=(0,o.K2)((()=>({relations:[],states:new Map,documents:{}})),"newDoc"),Z=(0,o.K2)((t=>JSON.parse(JSON.stringify(t))),"clone"),Q=class{static#t=(()=>(0,o.K2)(this,"StateDB"))();constructor(t){this.clear(),this.version=t,this.setRootDoc=this.setRootDoc.bind(this),this.getDividerId=this.getDividerId.bind(this),this.setDirection=this.setDirection.bind(this),this.trimColon=this.trimColon.bind(this)}version;nodes=[];edges=[];rootDoc=[];classes=(()=>J())();documents=(()=>({root:q()}))();currentDocument=this.documents.root;startEndCount=0;dividerCnt=0;static relationType={AGGREGATION:0,EXTENSION:1,COMPOSITION:2,DEPENDENCY:3};setRootDoc(t){o.Rm.info("Setting root doc",t),this.rootDoc=t,1===this.version?this.extract(t):this.extract(this.getRootDocV2())}getRootDoc(){return this.rootDoc}docTranslator(t,e,s){if(e.stmt===h)this.docTranslator(t,e.state1,!0),this.docTranslator(t,e.state2,!1);else if(e.stmt===l&&("[*]"===e.id?(e.id=s?t.id+"_start":t.id+"_end",e.start=s):e.id=e.id.trim()),e.doc){const t=[];let s,i=[];for(s=0;s0&&i.length>0){const s={stmt:l,id:(0,r.$C)(),type:"divider",doc:Z(i)};t.push(Z(s)),e.doc=t}e.doc.forEach((t=>this.docTranslator(e,t,!0)))}}getRootDocV2(){return this.docTranslator({id:"root"},{id:"root",doc:this.rootDoc},!0),{id:"root",doc:this.rootDoc}}extract(t){let e;e=t.doc?t.doc:t,o.Rm.info(e),this.clear(!0),o.Rm.info("Extract initial document:",e),e.forEach((t=>{switch(o.Rm.warn("Statement",t.stmt),t.stmt){case l:this.addState(t.id.trim(),t.type,t.doc,t.description,t.note,t.classes,t.styles,t.textStyles);break;case h:this.addRelation(t.state1,t.state2,t.description);break;case"classDef":this.addStyleClass(t.id.trim(),t.classes);break;case"style":{const e=t.id.trim().split(","),s=t.styleClass.split(",");e.forEach((t=>{let e=this.getState(t);if(void 0===e){const s=t.trim();this.addState(s),e=this.getState(s)}e.styles=s.map((t=>t.replace(/;/g,"")?.trim()))}))}break;case"applyClass":this.setCssClass(t.id.trim(),t.styleClass)}}));const s=this.getStates(),i=(0,o.D7)().look;U(),z(void 0,this.getRootDocV2(),s,this.nodes,this.edges,!0,i,this.classes),this.nodes.forEach((t=>{if(Array.isArray(t.label)){if(t.description=t.label.slice(1),t.isGroup&&t.description.length>0)throw new Error("Group nodes can only have label. Remove the additional description for node ["+t.id+"]");t.label=t.label[0]}}))}addState(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:d,s=arguments.length>2&&void 0!==arguments[2]?arguments[2]:null,i=arguments.length>3&&void 0!==arguments[3]?arguments[3]:null,n=arguments.length>4&&void 0!==arguments[4]?arguments[4]:null,r=arguments.length>5&&void 0!==arguments[5]?arguments[5]:null,a=arguments.length>6&&void 0!==arguments[6]?arguments[6]:null,c=arguments.length>7&&void 0!==arguments[7]?arguments[7]:null;const l=t?.trim();if(this.currentDocument.states.has(l)?(this.currentDocument.states.get(l).doc||(this.currentDocument.states.get(l).doc=s),this.currentDocument.states.get(l).type||(this.currentDocument.states.get(l).type=e)):(o.Rm.info("Adding state ",l,i),this.currentDocument.states.set(l,{id:l,descriptions:[],type:e,doc:s,note:n,classes:[],styles:[],textStyles:[]})),i&&(o.Rm.info("Setting state description",l,i),"string"===typeof i&&this.addDescription(l,i.trim()),"object"===typeof i&&i.forEach((t=>this.addDescription(l,t.trim())))),n){const t=this.currentDocument.states.get(l);t.note=n,t.note.text=o.Y2.sanitizeText(t.note.text,(0,o.D7)())}if(r){o.Rm.info("Setting state classes",l,r);("string"===typeof r?[r]:r).forEach((t=>this.setCssClass(l,t.trim())))}if(a){o.Rm.info("Setting state styles",l,a);("string"===typeof a?[a]:a).forEach((t=>this.setStyle(l,t.trim())))}if(c){o.Rm.info("Setting state styles",l,a);("string"===typeof c?[c]:c).forEach((t=>this.setTextStyle(l,t.trim())))}}clear(t){this.nodes=[],this.edges=[],this.documents={root:q()},this.currentDocument=this.documents.root,this.startEndCount=0,this.classes=J(),t||(0,o.IU)()}getState(t){return this.currentDocument.states.get(t)}getStates(){return this.currentDocument.states}logDocuments(){o.Rm.info("Documents = ",this.documents)}getRelations(){return this.currentDocument.relations}startIdIfNeeded(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",e=t;return t===M&&(this.startEndCount++,e=`${V}${this.startEndCount}`),e}startTypeIfNeeded(){return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"")===M?V:arguments.length>1&&void 0!==arguments[1]?arguments[1]:d}endIdIfNeeded(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"",e=t;return t===X&&(this.startEndCount++,e=`end${this.startEndCount}`),e}endTypeIfNeeded(){return(arguments.length>0&&void 0!==arguments[0]?arguments[0]:"")===X?"end":arguments.length>1&&void 0!==arguments[1]?arguments[1]:d}addRelationObjs(t,e,s){let i=this.startIdIfNeeded(t.id.trim()),n=this.startTypeIfNeeded(t.id.trim(),t.type),r=this.startIdIfNeeded(e.id.trim()),a=this.startTypeIfNeeded(e.id.trim(),e.type);this.addState(i,n,t.doc,t.description,t.note,t.classes,t.styles,t.textStyles),this.addState(r,a,e.doc,e.description,e.note,e.classes,e.styles,e.textStyles),this.currentDocument.relations.push({id1:i,id2:r,relationTitle:o.Y2.sanitizeText(s,(0,o.D7)())})}addRelation(t,e,s){if("object"===typeof t)this.addRelationObjs(t,e,s);else{const i=this.startIdIfNeeded(t.trim()),n=this.startTypeIfNeeded(t),r=this.endIdIfNeeded(e.trim()),a=this.endTypeIfNeeded(e);this.addState(i,n),this.addState(r,a),this.currentDocument.relations.push({id1:i,id2:r,title:o.Y2.sanitizeText(s,(0,o.D7)())})}}addDescription(t,e){const s=this.currentDocument.states.get(t),i=e.startsWith(":")?e.replace(":","").trim():e;s.descriptions.push(o.Y2.sanitizeText(i,(0,o.D7)()))}cleanupLabel(t){return":"===t.substring(0,1)?t.substr(2).trim():t.trim()}getDividerId(){return this.dividerCnt++,"divider-id-"+this.dividerCnt}addStyleClass(t){let e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"";this.classes.has(t)||this.classes.set(t,{id:t,styles:[],textStyles:[]});const s=this.classes.get(t);void 0!==e&&null!==e&&e.split(",").forEach((t=>{const e=t.replace(/([^;]*);/,"$1").trim();if(RegExp(W).exec(t)){const t=e.replace(H,"bgFill").replace(W,H);s.textStyles.push(t)}s.styles.push(e)}))}getClasses(){return this.classes}setCssClass(t,e){t.split(",").forEach((t=>{let s=this.getState(t);if(void 0===s){const e=t.trim();this.addState(e),s=this.getState(e)}s.classes.push(e)}))}setStyle(t,e){const s=this.getState(t);void 0!==s&&s.styles.push(e)}setTextStyle(t,e){const s=this.getState(t);void 0!==s&&s.textStyles.push(e)}getDirectionStatement(){return this.rootDoc.find((t=>"dir"===t.stmt))}getDirection(){return this.getDirectionStatement()?.value??"TB"}setDirection(t){const e=this.getDirectionStatement();e?e.value=t:this.rootDoc.unshift({stmt:"dir",value:t})}trimColon(t){return t&&":"===t[0]?t.substr(1).trim():t.trim()}getData(){const t=(0,o.D7)();return{nodes:this.nodes,edges:this.edges,other:{},config:t,direction:w(this.getRootDocV2())}}getConfig(){return(0,o.D7)().state}getAccTitle=(()=>o.iN)();setAccTitle=(()=>o.SV)();getAccDescription=(()=>o.m7)();setAccDescription=(()=>o.EI)();setDiagramTitle=(()=>o.ke)();getDiagramTitle=(()=>o.ab)()},tt=(0,o.K2)((t=>`\ndefs #statediagram-barbEnd {\n fill: ${t.transitionColor};\n stroke: ${t.transitionColor};\n }\ng.stateGroup text {\n fill: ${t.nodeBorder};\n stroke: none;\n font-size: 10px;\n}\ng.stateGroup text {\n fill: ${t.textColor};\n stroke: none;\n font-size: 10px;\n\n}\ng.stateGroup .state-title {\n font-weight: bolder;\n fill: ${t.stateLabelColor};\n}\n\ng.stateGroup rect {\n fill: ${t.mainBkg};\n stroke: ${t.nodeBorder};\n}\n\ng.stateGroup line {\n stroke: ${t.lineColor};\n stroke-width: 1;\n}\n\n.transition {\n stroke: ${t.transitionColor};\n stroke-width: 1;\n fill: none;\n}\n\n.stateGroup .composit {\n fill: ${t.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: ${t.noteBorderColor};\n fill: ${t.noteBkgColor};\n\n text {\n fill: ${t.noteTextColor};\n stroke: none;\n font-size: 10px;\n }\n}\n\n.stateLabel .box {\n stroke: none;\n stroke-width: 0;\n fill: ${t.mainBkg};\n opacity: 0.5;\n}\n\n.edgeLabel .label rect {\n fill: ${t.labelBackgroundColor};\n opacity: 0.5;\n}\n.edgeLabel {\n background-color: ${t.edgeLabelBackground};\n p {\n background-color: ${t.edgeLabelBackground};\n }\n rect {\n opacity: 0.5;\n background-color: ${t.edgeLabelBackground};\n fill: ${t.edgeLabelBackground};\n }\n text-align: center;\n}\n.edgeLabel .label text {\n fill: ${t.transitionLabelColor||t.tertiaryTextColor};\n}\n.label div .edgeLabel {\n color: ${t.transitionLabelColor||t.tertiaryTextColor};\n}\n\n.stateLabel text {\n fill: ${t.stateLabelColor};\n font-size: 10px;\n font-weight: bold;\n}\n\n.node circle.state-start {\n fill: ${t.specialStateColor};\n stroke: ${t.specialStateColor};\n}\n\n.node .fork-join {\n fill: ${t.specialStateColor};\n stroke: ${t.specialStateColor};\n}\n\n.node circle.state-end {\n fill: ${t.innerEndBackground};\n stroke: ${t.background};\n stroke-width: 1.5\n}\n.end-state-inner {\n fill: ${t.compositeBackground||t.background};\n // stroke: ${t.background};\n stroke-width: 1.5\n}\n\n.node rect {\n fill: ${t.stateBkg||t.mainBkg};\n stroke: ${t.stateBorder||t.nodeBorder};\n stroke-width: 1px;\n}\n.node polygon {\n fill: ${t.mainBkg};\n stroke: ${t.stateBorder||t.nodeBorder};;\n stroke-width: 1px;\n}\n#statediagram-barbEnd {\n fill: ${t.lineColor};\n}\n\n.statediagram-cluster rect {\n fill: ${t.compositeTitleBackground};\n stroke: ${t.stateBorder||t.nodeBorder};\n stroke-width: 1px;\n}\n\n.cluster-label, .nodeLabel {\n color: ${t.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: ${t.stateBorder||t.nodeBorder};\n}\n\n.statediagram-state .title-state {\n rx: 5px;\n ry: 5px;\n}\n.statediagram-cluster.statediagram-cluster .inner {\n fill: ${t.compositeBackground||t.background};\n}\n.statediagram-cluster.statediagram-cluster-alt .inner {\n fill: ${t.altBackground?t.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: ${t.altBackground?t.altBackground:"#efefef"};\n}\n\n.note-edge {\n stroke-dasharray: 5;\n}\n\n.statediagram-note rect {\n fill: ${t.noteBkgColor};\n stroke: ${t.noteBorderColor};\n stroke-width: 1px;\n rx: 0;\n ry: 0;\n}\n.statediagram-note rect {\n fill: ${t.noteBkgColor};\n stroke: ${t.noteBorderColor};\n stroke-width: 1px;\n rx: 0;\n ry: 0;\n}\n\n.statediagram-note text {\n fill: ${t.noteTextColor};\n}\n\n.statediagram-note .nodeLabel {\n color: ${t.noteTextColor};\n}\n.statediagram .edgeLabel {\n color: red; // ${t.noteTextColor};\n}\n\n#dependencyStart, #dependencyEnd {\n fill: ${t.lineColor};\n stroke: ${t.lineColor};\n stroke-width: 1;\n}\n\n.statediagramTitleText {\n text-anchor: middle;\n font-size: 18px;\n fill: ${t.textColor};\n}\n`),"getStyles")},6327:(t,e,s)=>{s.d(e,{A:()=>r,P:()=>o});var i=s(3759),n=s(700),r=(0,i.K2)(((t,e)=>{let s;"sandbox"===e&&(s=(0,n.Ltv)("#i"+t));return("sandbox"===e?(0,n.Ltv)(s.nodes()[0].contentDocument.body):(0,n.Ltv)("body")).select(`[id="${t}"]`)}),"getDiagramElement"),o=(0,i.K2)(((t,e,s,n)=>{t.attr("class",s);const{width:r,height:o,x:l,y:h}=a(t,e);(0,i.a$)(t,o,r,n);const d=c(l,h,r,o,e);t.attr("viewBox",d),i.Rm.debug(`viewBox configured: ${d} with padding: ${e}`)}),"setupViewPortForSVG"),a=(0,i.K2)(((t,e)=>{const s=t.node()?.getBBox()||{width:0,height:0,x:0,y:0};return{width:s.width+2*e,height:s.height+2*e,x:s.x,y:s.y}}),"calculateDimensionsWithPadding"),c=(0,i.K2)(((t,e,s,i,n)=>`${t-n} ${e-n} ${s} ${i}`),"createViewBox")}}]); -//# sourceMappingURL=355.143eaed8.chunk.js.map \ No newline at end of file diff --git a/frontend/deployed/static/js/355.143eaed8.chunk.js.map b/frontend/deployed/static/js/355.143eaed8.chunk.js.map deleted file mode 100644 index cc570e0..0000000 --- a/frontend/deployed/static/js/355.143eaed8.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"static/js/355.143eaed8.chunk.js","mappings":"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","sources":["../node_modules/mermaid/dist/chunks/mermaid.core/chunk-AEK57VVT.mjs","../node_modules/mermaid/dist/chunks/mermaid.core/chunk-RZ5BOZE2.mjs"],"sourcesContent":["import {\n getDiagramElement,\n setupViewPortForSVG\n} from \"./chunk-RZ5BOZE2.mjs\";\nimport {\n render\n} from \"./chunk-TYCBKAJE.mjs\";\nimport {\n generateId,\n utils_default\n} from \"./chunk-O4NI6UNU.mjs\";\nimport {\n __name,\n clear,\n common_default,\n getAccDescription,\n getAccTitle,\n getConfig2 as getConfig,\n getDiagramTitle,\n log,\n setAccDescription,\n setAccTitle,\n setDiagramTitle\n} from \"./chunk-YTJNT7DU.mjs\";\n\n// src/diagrams/state/parser/stateDiagram.jison\nvar parser = function() {\n var o = /* @__PURE__ */ __name(function(k, v, o2, l) {\n for (o2 = o2 || {}, l = k.length; l--; o2[k[l]] = v) ;\n return o2;\n }, \"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, 32], $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, 34], $Vn = [1, 35], $Vo = [1, 36], $Vp = [1, 37], $Vq = [1, 33], $Vr = [1, 4, 5, 16, 17, 19, 21, 22, 24, 25, 26, 27, 28, 29, 33, 35, 37, 38, 42, 45, 48, 49, 50, 51, 54], $Vs = [1, 4, 5, 14, 15, 16, 17, 19, 21, 22, 24, 25, 26, 27, 28, 29, 33, 35, 37, 38, 42, 45, 48, 49, 50, 51, 54], $Vt = [4, 5, 16, 17, 19, 21, 22, 24, 25, 26, 27, 28, 29, 33, 35, 37, 38, 42, 45, 48, 49, 50, 51, 54];\n var parser2 = {\n trace: /* @__PURE__ */ __name(function trace() {\n }, \"trace\"),\n yy: {},\n 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, \"classDef\": 38, \"CLASSDEF_ID\": 39, \"CLASSDEF_STYLEOPTS\": 40, \"DEFAULT\": 41, \"style\": 42, \"STYLE_IDS\": 43, \"STYLEDEF_STYLEOPTS\": 44, \"class\": 45, \"CLASSENTITY_IDS\": 46, \"STYLECLASS\": 47, \"direction_tb\": 48, \"direction_bt\": 49, \"direction_rl\": 50, \"direction_lr\": 51, \"eol\": 52, \";\": 53, \"EDGE_STATE\": 54, \"STYLE_SEPARATOR\": 55, \"left_of\": 56, \"right_of\": 57, \"$accept\": 0, \"$end\": 1 },\n 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: \"classDef\", 39: \"CLASSDEF_ID\", 40: \"CLASSDEF_STYLEOPTS\", 41: \"DEFAULT\", 42: \"style\", 43: \"STYLE_IDS\", 44: \"STYLEDEF_STYLEOPTS\", 45: \"class\", 46: \"CLASSENTITY_IDS\", 47: \"STYLECLASS\", 48: \"direction_tb\", 49: \"direction_bt\", 50: \"direction_rl\", 51: \"direction_lr\", 53: \";\", 54: \"EDGE_STATE\", 55: \"STYLE_SEPARATOR\", 56: \"left_of\", 57: \"right_of\" },\n 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], [10, 3], [10, 3], [11, 3], [12, 3], [32, 1], [32, 1], [32, 1], [32, 1], [52, 1], [52, 1], [13, 1], [13, 1], [13, 3], [13, 3], [30, 1], [30, 1]],\n performAction: /* @__PURE__ */ __name(function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) {\n var $0 = $$.length - 1;\n switch (yystate) {\n case 3:\n yy.setRootDoc($$[$0]);\n return $$[$0];\n break;\n case 4:\n this.$ = [];\n break;\n case 5:\n if ($$[$0] != \"nl\") {\n $$[$0 - 1].push($$[$0]);\n this.$ = $$[$0 - 1];\n }\n break;\n case 6:\n case 7:\n this.$ = $$[$0];\n break;\n case 8:\n this.$ = \"nl\";\n break;\n case 12:\n this.$ = $$[$0];\n break;\n case 13:\n const stateStmt = $$[$0 - 1];\n stateStmt.description = yy.trimColon($$[$0]);\n this.$ = stateStmt;\n break;\n case 14:\n this.$ = { stmt: \"relation\", state1: $$[$0 - 2], state2: $$[$0] };\n break;\n case 15:\n const relDescription = yy.trimColon($$[$0]);\n this.$ = { stmt: \"relation\", state1: $$[$0 - 3], state2: $$[$0 - 1], description: relDescription };\n break;\n case 19:\n this.$ = { stmt: \"state\", id: $$[$0 - 3], type: \"default\", description: \"\", doc: $$[$0 - 1] };\n break;\n case 20:\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, type: \"default\", description };\n break;\n case 21:\n this.$ = { stmt: \"state\", id: $$[$0 - 3], type: \"default\", description: $$[$0 - 5], doc: $$[$0 - 1] };\n break;\n case 22:\n this.$ = { stmt: \"state\", id: $$[$0], type: \"fork\" };\n break;\n case 23:\n this.$ = { stmt: \"state\", id: $$[$0], type: \"join\" };\n break;\n case 24:\n this.$ = { stmt: \"state\", id: $$[$0], type: \"choice\" };\n break;\n case 25:\n this.$ = { stmt: \"state\", id: yy.getDividerId(), type: \"divider\" };\n break;\n case 26:\n this.$ = { stmt: \"state\", id: $$[$0 - 1].trim(), note: { position: $$[$0 - 2].trim(), text: $$[$0].trim() } };\n break;\n case 29:\n this.$ = $$[$0].trim();\n yy.setAccTitle(this.$);\n break;\n case 30:\n case 31:\n this.$ = $$[$0].trim();\n yy.setAccDescription(this.$);\n break;\n case 32:\n case 33:\n this.$ = { stmt: \"classDef\", id: $$[$0 - 1].trim(), classes: $$[$0].trim() };\n break;\n case 34:\n this.$ = { stmt: \"style\", id: $$[$0 - 1].trim(), styleClass: $$[$0].trim() };\n break;\n case 35:\n this.$ = { stmt: \"applyClass\", id: $$[$0 - 1].trim(), styleClass: $$[$0].trim() };\n break;\n case 36:\n yy.setDirection(\"TB\");\n this.$ = { stmt: \"dir\", value: \"TB\" };\n break;\n case 37:\n yy.setDirection(\"BT\");\n this.$ = { stmt: \"dir\", value: \"BT\" };\n break;\n case 38:\n yy.setDirection(\"RL\");\n this.$ = { stmt: \"dir\", value: \"RL\" };\n break;\n case 39:\n yy.setDirection(\"LR\");\n this.$ = { stmt: \"dir\", value: \"LR\" };\n break;\n case 42:\n case 43:\n this.$ = { stmt: \"state\", id: $$[$0].trim(), type: \"default\", description: \"\" };\n break;\n case 44:\n this.$ = { stmt: \"state\", id: $$[$0 - 2].trim(), classes: [$$[$0].trim()], type: \"default\", description: \"\" };\n break;\n case 45:\n this.$ = { stmt: \"state\", id: $$[$0 - 2].trim(), classes: [$$[$0].trim()], type: \"default\", description: \"\" };\n break;\n }\n }, \"anonymous\"),\n 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, 42, 45, 48, 49, 50, 51, 54], $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, 42: $Vk, 45: $Vl, 48: $Vm, 49: $Vn, 50: $Vo, 51: $Vp, 54: $Vq }, o($Vr, [2, 5]), { 9: 38, 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, 42: $Vk, 45: $Vl, 48: $Vm, 49: $Vn, 50: $Vo, 51: $Vp, 54: $Vq }, o($Vr, [2, 7]), o($Vr, [2, 8]), o($Vr, [2, 9]), o($Vr, [2, 10]), o($Vr, [2, 11]), o($Vr, [2, 12], { 14: [1, 39], 15: [1, 40] }), o($Vr, [2, 16]), { 18: [1, 41] }, o($Vr, [2, 18], { 20: [1, 42] }), { 23: [1, 43] }, o($Vr, [2, 22]), o($Vr, [2, 23]), o($Vr, [2, 24]), o($Vr, [2, 25]), { 30: 44, 31: [1, 45], 56: [1, 46], 57: [1, 47] }, o($Vr, [2, 28]), { 34: [1, 48] }, { 36: [1, 49] }, o($Vr, [2, 31]), { 39: [1, 50], 41: [1, 51] }, { 43: [1, 52] }, { 46: [1, 53] }, o($Vs, [2, 42], { 55: [1, 54] }), o($Vs, [2, 43], { 55: [1, 55] }), o($Vr, [2, 36]), o($Vr, [2, 37]), o($Vr, [2, 38]), o($Vr, [2, 39]), o($Vr, [2, 6]), o($Vr, [2, 13]), { 13: 56, 24: $Va, 54: $Vq }, o($Vr, [2, 17]), o($Vt, $V3, { 7: 57 }), { 24: [1, 58] }, { 24: [1, 59] }, { 23: [1, 60] }, { 24: [2, 46] }, { 24: [2, 47] }, o($Vr, [2, 29]), o($Vr, [2, 30]), { 40: [1, 61] }, { 40: [1, 62] }, { 44: [1, 63] }, { 47: [1, 64] }, { 24: [1, 65] }, { 24: [1, 66] }, o($Vr, [2, 14], { 14: [1, 67] }), { 4: $V4, 5: $V5, 8: 8, 9: 10, 10: 12, 11: 13, 12: 14, 13: 15, 16: $V6, 17: $V7, 19: $V8, 21: [1, 68], 22: $V9, 24: $Va, 25: $Vb, 26: $Vc, 27: $Vd, 28: $Ve, 29: $Vf, 32: 25, 33: $Vg, 35: $Vh, 37: $Vi, 38: $Vj, 42: $Vk, 45: $Vl, 48: $Vm, 49: $Vn, 50: $Vo, 51: $Vp, 54: $Vq }, o($Vr, [2, 20], { 20: [1, 69] }), { 31: [1, 70] }, { 24: [1, 71] }, o($Vr, [2, 32]), o($Vr, [2, 33]), o($Vr, [2, 34]), o($Vr, [2, 35]), o($Vs, [2, 44]), o($Vs, [2, 45]), o($Vr, [2, 15]), o($Vr, [2, 19]), o($Vt, $V3, { 7: 72 }), o($Vr, [2, 26]), o($Vr, [2, 27]), { 4: $V4, 5: $V5, 8: 8, 9: 10, 10: 12, 11: 13, 12: 14, 13: 15, 16: $V6, 17: $V7, 19: $V8, 21: [1, 73], 22: $V9, 24: $Va, 25: $Vb, 26: $Vc, 27: $Vd, 28: $Ve, 29: $Vf, 32: 25, 33: $Vg, 35: $Vh, 37: $Vi, 38: $Vj, 42: $Vk, 45: $Vl, 48: $Vm, 49: $Vn, 50: $Vo, 51: $Vp, 54: $Vq }, o($Vr, [2, 21])],\n defaultActions: { 5: [2, 1], 6: [2, 2], 46: [2, 46], 47: [2, 47] },\n parseError: /* @__PURE__ */ __name(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 }, \"parseError\"),\n parse: /* @__PURE__ */ __name(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 lexer2 = 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 lexer2.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer2;\n sharedState.yy.parser = this;\n if (typeof lexer2.yylloc == \"undefined\") {\n lexer2.yylloc = {};\n }\n var yyloc = lexer2.yylloc;\n lstack.push(yyloc);\n var ranges = lexer2.options && lexer2.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 __name(popStack, \"popStack\");\n function lex() {\n var token;\n token = tstack.pop() || lexer2.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 __name(lex, \"lex\");\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 (lexer2.showPosition) {\n errStr = \"Parse error on line \" + (yylineno + 1) + \":\\n\" + lexer2.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: lexer2.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer2.yylineno,\n loc: yyloc,\n 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(lexer2.yytext);\n lstack.push(lexer2.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = lexer2.yyleng;\n yytext = lexer2.yytext;\n yylineno = lexer2.yylineno;\n yyloc = lexer2.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 }, \"parse\")\n };\n var lexer = /* @__PURE__ */ function() {\n var lexer2 = {\n EOF: 1,\n parseError: /* @__PURE__ */ __name(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 }, \"parseError\"),\n // resets the lexer, sets new input\n setInput: /* @__PURE__ */ __name(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 }, \"setInput\"),\n // consumes and returns one char from the input\n input: /* @__PURE__ */ __name(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 this._input = this._input.slice(1);\n return ch;\n }, \"input\"),\n // unshifts one char (or a string) into the input\n unput: /* @__PURE__ */ __name(function(ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - 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 if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\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 ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len\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 }, \"unput\"),\n // When called from action, caches matched text and appends it on next action\n more: /* @__PURE__ */ __name(function() {\n this._more = true;\n return this;\n }, \"more\"),\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.\n reject: /* @__PURE__ */ __name(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 return this;\n }, \"reject\"),\n // retain first n characters of the match\n less: /* @__PURE__ */ __name(function(n) {\n this.unput(this.match.slice(n));\n }, \"less\"),\n // displays already matched input, i.e. for error messages\n pastInput: /* @__PURE__ */ __name(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 }, \"pastInput\"),\n // displays upcoming input, i.e. for error messages\n upcomingInput: /* @__PURE__ */ __name(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 }, \"upcomingInput\"),\n // displays the character position where the lexing error occurred, i.e. for error messages\n showPosition: /* @__PURE__ */ __name(function() {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n }, \"showPosition\"),\n // test the lexed token: return FALSE when not a match, otherwise return token\n test_match: /* @__PURE__ */ __name(function(match, indexed_rule) {\n var token, lines, backup;\n if (this.options.backtrack_lexer) {\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 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 ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length : 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 for (var k in backup) {\n this[k] = backup[k];\n }\n return false;\n }\n return false;\n }, \"test_match\"),\n // return next match in input\n next: /* @__PURE__ */ __name(function() {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n var token, match, tempMatch, 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;\n } else {\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 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 }, \"next\"),\n // return next match that has a token\n lex: /* @__PURE__ */ __name(function lex() {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n }, \"lex\"),\n // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\n begin: /* @__PURE__ */ __name(function begin(condition) {\n this.conditionStack.push(condition);\n }, \"begin\"),\n // pop the previously active lexer condition state off the condition stack\n popState: /* @__PURE__ */ __name(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 }, \"popState\"),\n // produce the lexer rule set which is active for the currently active lexer condition state\n _currentRules: /* @__PURE__ */ __name(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 }, \"_currentRules\"),\n // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\n topState: /* @__PURE__ */ __name(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 }, \"topState\"),\n // alias for begin(condition)\n pushState: /* @__PURE__ */ __name(function pushState(condition) {\n this.begin(condition);\n }, \"pushState\"),\n // return the number of states currently on the stack\n stateStackSize: /* @__PURE__ */ __name(function stateStackSize() {\n return this.conditionStack.length;\n }, \"stateStackSize\"),\n options: { \"case-insensitive\": true },\n performAction: /* @__PURE__ */ __name(function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) {\n var YYSTATE = YY_START;\n switch ($avoiding_name_collisions) {\n case 0:\n return 41;\n break;\n case 1:\n return 48;\n break;\n case 2:\n return 49;\n break;\n case 3:\n return 50;\n break;\n case 4:\n return 51;\n break;\n case 5:\n break;\n case 6:\n {\n }\n break;\n case 7:\n return 5;\n break;\n case 8:\n break;\n case 9:\n break;\n case 10:\n break;\n case 11:\n break;\n case 12:\n this.pushState(\"SCALE\");\n return 17;\n break;\n case 13:\n return 18;\n break;\n case 14:\n this.popState();\n break;\n case 15:\n this.begin(\"acc_title\");\n return 33;\n break;\n case 16:\n this.popState();\n return \"acc_title_value\";\n break;\n case 17:\n this.begin(\"acc_descr\");\n return 35;\n break;\n case 18:\n this.popState();\n return \"acc_descr_value\";\n break;\n case 19:\n this.begin(\"acc_descr_multiline\");\n break;\n case 20:\n this.popState();\n break;\n case 21:\n return \"acc_descr_multiline_value\";\n break;\n case 22:\n this.pushState(\"CLASSDEF\");\n return 38;\n break;\n case 23:\n this.popState();\n this.pushState(\"CLASSDEFID\");\n return \"DEFAULT_CLASSDEF_ID\";\n break;\n case 24:\n this.popState();\n this.pushState(\"CLASSDEFID\");\n return 39;\n break;\n case 25:\n this.popState();\n return 40;\n break;\n case 26:\n this.pushState(\"CLASS\");\n return 45;\n break;\n case 27:\n this.popState();\n this.pushState(\"CLASS_STYLE\");\n return 46;\n break;\n case 28:\n this.popState();\n return 47;\n break;\n case 29:\n this.pushState(\"STYLE\");\n return 42;\n break;\n case 30:\n this.popState();\n this.pushState(\"STYLEDEF_STYLES\");\n return 43;\n break;\n case 31:\n this.popState();\n return 44;\n break;\n case 32:\n this.pushState(\"SCALE\");\n return 17;\n break;\n case 33:\n return 18;\n break;\n case 34:\n this.popState();\n break;\n case 35:\n this.pushState(\"STATE\");\n break;\n case 36:\n this.popState();\n yy_.yytext = yy_.yytext.slice(0, -8).trim();\n return 25;\n break;\n case 37:\n this.popState();\n yy_.yytext = yy_.yytext.slice(0, -8).trim();\n return 26;\n break;\n case 38:\n this.popState();\n yy_.yytext = yy_.yytext.slice(0, -10).trim();\n return 27;\n break;\n case 39:\n this.popState();\n yy_.yytext = yy_.yytext.slice(0, -8).trim();\n return 25;\n break;\n case 40:\n this.popState();\n yy_.yytext = yy_.yytext.slice(0, -8).trim();\n return 26;\n break;\n case 41:\n this.popState();\n yy_.yytext = yy_.yytext.slice(0, -10).trim();\n return 27;\n break;\n case 42:\n return 48;\n break;\n case 43:\n return 49;\n break;\n case 44:\n return 50;\n break;\n case 45:\n return 51;\n break;\n case 46:\n this.pushState(\"STATE_STRING\");\n break;\n case 47:\n this.pushState(\"STATE_ID\");\n return \"AS\";\n break;\n case 48:\n this.popState();\n return \"ID\";\n break;\n case 49:\n this.popState();\n break;\n case 50:\n return \"STATE_DESCR\";\n break;\n case 51:\n return 19;\n break;\n case 52:\n this.popState();\n break;\n case 53:\n this.popState();\n this.pushState(\"struct\");\n return 20;\n break;\n case 54:\n break;\n case 55:\n this.popState();\n return 21;\n break;\n case 56:\n break;\n case 57:\n this.begin(\"NOTE\");\n return 29;\n break;\n case 58:\n this.popState();\n this.pushState(\"NOTE_ID\");\n return 56;\n break;\n case 59:\n this.popState();\n this.pushState(\"NOTE_ID\");\n return 57;\n break;\n case 60:\n this.popState();\n this.pushState(\"FLOATING_NOTE\");\n break;\n case 61:\n this.popState();\n this.pushState(\"FLOATING_NOTE_ID\");\n return \"AS\";\n break;\n case 62:\n break;\n case 63:\n return \"NOTE_TEXT\";\n break;\n case 64:\n this.popState();\n return \"ID\";\n break;\n case 65:\n this.popState();\n this.pushState(\"NOTE_TEXT\");\n return 24;\n break;\n case 66:\n this.popState();\n yy_.yytext = yy_.yytext.substr(2).trim();\n return 31;\n break;\n case 67:\n this.popState();\n yy_.yytext = yy_.yytext.slice(0, -8).trim();\n return 31;\n break;\n case 68:\n return 6;\n break;\n case 69:\n return 6;\n break;\n case 70:\n return 16;\n break;\n case 71:\n return 54;\n break;\n case 72:\n return 24;\n break;\n case 73:\n yy_.yytext = yy_.yytext.trim();\n return 14;\n break;\n case 74:\n return 15;\n break;\n case 75:\n return 28;\n break;\n case 76:\n return 55;\n break;\n case 77:\n return 5;\n break;\n case 78:\n return \"INVALID\";\n break;\n }\n }, \"anonymous\"),\n rules: [/^(?: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],\n conditions: { \"LINE\": { \"rules\": [9, 10], \"inclusive\": false }, \"struct\": { \"rules\": [9, 10, 22, 26, 29, 35, 42, 43, 44, 45, 54, 55, 56, 57, 71, 72, 73, 74, 75], \"inclusive\": false }, \"FLOATING_NOTE_ID\": { \"rules\": [64], \"inclusive\": false }, \"FLOATING_NOTE\": { \"rules\": [61, 62, 63], \"inclusive\": false }, \"NOTE_TEXT\": { \"rules\": [66, 67], \"inclusive\": false }, \"NOTE_ID\": { \"rules\": [65], \"inclusive\": false }, \"NOTE\": { \"rules\": [58, 59, 60], \"inclusive\": false }, \"STYLEDEF_STYLEOPTS\": { \"rules\": [], \"inclusive\": false }, \"STYLEDEF_STYLES\": { \"rules\": [31], \"inclusive\": false }, \"STYLE_IDS\": { \"rules\": [], \"inclusive\": false }, \"STYLE\": { \"rules\": [30], \"inclusive\": false }, \"CLASS_STYLE\": { \"rules\": [28], \"inclusive\": false }, \"CLASS\": { \"rules\": [27], \"inclusive\": false }, \"CLASSDEFID\": { \"rules\": [25], \"inclusive\": false }, \"CLASSDEF\": { \"rules\": [23, 24], \"inclusive\": false }, \"acc_descr_multiline\": { \"rules\": [20, 21], \"inclusive\": false }, \"acc_descr\": { \"rules\": [18], \"inclusive\": false }, \"acc_title\": { \"rules\": [16], \"inclusive\": false }, \"SCALE\": { \"rules\": [13, 14, 33, 34], \"inclusive\": false }, \"ALIAS\": { \"rules\": [], \"inclusive\": false }, \"STATE_ID\": { \"rules\": [48], \"inclusive\": false }, \"STATE_STRING\": { \"rules\": [49, 50], \"inclusive\": false }, \"FORK_STATE\": { \"rules\": [], \"inclusive\": false }, \"STATE\": { \"rules\": [9, 10, 36, 37, 38, 39, 40, 41, 46, 47, 51, 52, 53], \"inclusive\": false }, \"ID\": { \"rules\": [9, 10], \"inclusive\": false }, \"INITIAL\": { \"rules\": [0, 1, 2, 3, 4, 5, 6, 7, 8, 10, 11, 12, 15, 17, 19, 22, 26, 29, 32, 35, 53, 57, 68, 69, 70, 71, 72, 73, 74, 76, 77, 78], \"inclusive\": true } }\n };\n return lexer2;\n }();\n parser2.lexer = lexer;\n function Parser() {\n this.yy = {};\n }\n __name(Parser, \"Parser\");\n Parser.prototype = parser2;\n parser2.Parser = Parser;\n return new Parser();\n}();\nparser.parser = parser;\nvar stateDiagram_default = parser;\n\n// src/diagrams/state/stateCommon.ts\nvar DEFAULT_DIAGRAM_DIRECTION = \"TB\";\nvar DEFAULT_NESTED_DOC_DIR = \"TB\";\nvar STMT_DIRECTION = \"dir\";\nvar STMT_STATE = \"state\";\nvar STMT_RELATION = \"relation\";\nvar STMT_CLASSDEF = \"classDef\";\nvar STMT_STYLEDEF = \"style\";\nvar STMT_APPLYCLASS = \"applyClass\";\nvar DEFAULT_STATE_TYPE = \"default\";\nvar DIVIDER_TYPE = \"divider\";\nvar G_EDGE_STYLE = \"fill:none\";\nvar G_EDGE_ARROWHEADSTYLE = \"fill: #333\";\nvar G_EDGE_LABELPOS = \"c\";\nvar G_EDGE_LABELTYPE = \"text\";\nvar G_EDGE_THICKNESS = \"normal\";\nvar SHAPE_STATE = \"rect\";\nvar SHAPE_STATE_WITH_DESC = \"rectWithTitle\";\nvar SHAPE_START = \"stateStart\";\nvar SHAPE_END = \"stateEnd\";\nvar SHAPE_DIVIDER = \"divider\";\nvar SHAPE_GROUP = \"roundedWithTitle\";\nvar SHAPE_NOTE = \"note\";\nvar SHAPE_NOTEGROUP = \"noteGroup\";\nvar CSS_DIAGRAM = \"statediagram\";\nvar CSS_STATE = \"state\";\nvar CSS_DIAGRAM_STATE = `${CSS_DIAGRAM}-${CSS_STATE}`;\nvar CSS_EDGE = \"transition\";\nvar CSS_NOTE = \"note\";\nvar CSS_NOTE_EDGE = \"note-edge\";\nvar CSS_EDGE_NOTE_EDGE = `${CSS_EDGE} ${CSS_NOTE_EDGE}`;\nvar CSS_DIAGRAM_NOTE = `${CSS_DIAGRAM}-${CSS_NOTE}`;\nvar CSS_CLUSTER = \"cluster\";\nvar CSS_DIAGRAM_CLUSTER = `${CSS_DIAGRAM}-${CSS_CLUSTER}`;\nvar CSS_CLUSTER_ALT = \"cluster-alt\";\nvar CSS_DIAGRAM_CLUSTER_ALT = `${CSS_DIAGRAM}-${CSS_CLUSTER_ALT}`;\nvar PARENT = \"parent\";\nvar NOTE = \"note\";\nvar DOMID_STATE = \"state\";\nvar DOMID_TYPE_SPACER = \"----\";\nvar NOTE_ID = `${DOMID_TYPE_SPACER}${NOTE}`;\nvar PARENT_ID = `${DOMID_TYPE_SPACER}${PARENT}`;\n\n// src/diagrams/state/stateRenderer-v3-unified.ts\nvar getDir = /* @__PURE__ */ __name((parsedItem, defaultDir = DEFAULT_NESTED_DOC_DIR) => {\n if (!parsedItem.doc) {\n return defaultDir;\n }\n let dir = defaultDir;\n for (const parsedItemDoc of parsedItem.doc) {\n if (parsedItemDoc.stmt === \"dir\") {\n dir = parsedItemDoc.value;\n }\n }\n return dir;\n}, \"getDir\");\nvar getClasses = /* @__PURE__ */ __name(function(text, diagramObj) {\n return diagramObj.db.getClasses();\n}, \"getClasses\");\nvar draw = /* @__PURE__ */ __name(async function(text, id, _version, diag) {\n log.info(\"REF0:\");\n log.info(\"Drawing state diagram (v2)\", id);\n const { securityLevel, state: conf, layout } = getConfig();\n diag.db.extract(diag.db.getRootDocV2());\n const data4Layout = diag.db.getData();\n const svg = getDiagramElement(id, securityLevel);\n data4Layout.type = diag.type;\n data4Layout.layoutAlgorithm = layout;\n data4Layout.nodeSpacing = conf?.nodeSpacing || 50;\n data4Layout.rankSpacing = conf?.rankSpacing || 50;\n data4Layout.markers = [\"barb\"];\n data4Layout.diagramId = id;\n await render(data4Layout, svg);\n const padding = 8;\n utils_default.insertTitle(\n svg,\n \"statediagramTitleText\",\n conf?.titleTopMargin ?? 25,\n diag.db.getDiagramTitle()\n );\n setupViewPortForSVG(svg, padding, CSS_DIAGRAM, conf?.useMaxWidth ?? true);\n}, \"draw\");\nvar stateRenderer_v3_unified_default = {\n getClasses,\n draw,\n getDir\n};\n\n// src/diagrams/state/dataFetcher.js\nvar nodeDb = /* @__PURE__ */ new Map();\nvar graphItemCount = 0;\nfunction stateDomId(itemId = \"\", counter = 0, type = \"\", typeSpacer = DOMID_TYPE_SPACER) {\n const typeStr = type !== null && type.length > 0 ? `${typeSpacer}${type}` : \"\";\n return `${DOMID_STATE}-${itemId}${typeStr}-${counter}`;\n}\n__name(stateDomId, \"stateDomId\");\nvar setupDoc = /* @__PURE__ */ __name((parentParsedItem, doc, diagramStates, nodes, edges, altFlag, look, classes) => {\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_default.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}, \"setupDoc\");\nvar getDir2 = /* @__PURE__ */ __name((parsedItem, 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}, \"getDir\");\nfunction insertOrUpdateNode(nodes, nodeData, classes) {\n if (!nodeData.id || nodeData.id === \"\" || nodeData.id === \"\") {\n return;\n }\n if (nodeData.cssClasses) {\n if (!Array.isArray(nodeData.cssCompiledStyles)) {\n nodeData.cssCompiledStyles = [];\n }\n nodeData.cssClasses.split(\" \").forEach((cssClass) => {\n if (classes.get(cssClass)) {\n const classDef = classes.get(cssClass);\n nodeData.cssCompiledStyles = [...nodeData.cssCompiledStyles, ...classDef.styles];\n }\n });\n }\n const existingNodeData = nodes.find((node) => node.id === nodeData.id);\n if (existingNodeData) {\n Object.assign(existingNodeData, nodeData);\n } else {\n nodes.push(nodeData);\n }\n}\n__name(insertOrUpdateNode, \"insertOrUpdateNode\");\nfunction getClassesFromDbInfo(dbInfoItem) {\n return dbInfoItem?.classes?.join(\" \") ?? \"\";\n}\n__name(getClassesFromDbInfo, \"getClassesFromDbInfo\");\nfunction getStylesFromDbInfo(dbInfoItem) {\n return dbInfoItem?.styles ?? [];\n}\n__name(getStylesFromDbInfo, \"getStylesFromDbInfo\");\nvar dataFetcher = /* @__PURE__ */ __name((parent, parsedItem, diagramStates, nodes, edges, altFlag, look, classes) => {\n const itemId = parsedItem.id;\n const dbState = diagramStates.get(itemId);\n const classStr = getClassesFromDbInfo(dbState);\n const style = getStylesFromDbInfo(dbState);\n log.info(\"dataFetcher parsedItem\", parsedItem, dbState, style);\n if (itemId !== \"root\") {\n let shape = SHAPE_STATE;\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 if (!nodeDb.get(itemId)) {\n nodeDb.set(itemId, {\n id: itemId,\n shape,\n description: common_default.sanitizeText(itemId, getConfig()),\n cssClasses: `${classStr} ${CSS_DIAGRAM_STATE}`,\n cssStyles: style\n });\n }\n const newNode = nodeDb.get(itemId);\n if (parsedItem.description) {\n if (Array.isArray(newNode.description)) {\n newNode.shape = SHAPE_STATE_WITH_DESC;\n newNode.description.push(parsedItem.description);\n } else {\n if (newNode.description?.length > 0) {\n newNode.shape = SHAPE_STATE_WITH_DESC;\n if (newNode.description === itemId) {\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_default.sanitizeTextOrArray(newNode.description, getConfig());\n }\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 if (!newNode.type && parsedItem.doc) {\n log.info(\"Setting cluster for XCX\", itemId, getDir2(parsedItem));\n newNode.type = \"group\";\n newNode.isGroup = true;\n newNode.dir = getDir2(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 const 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 if (nodeData.shape === SHAPE_DIVIDER) {\n nodeData.label = \"\";\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 nodeData.centerLabel = true;\n if (parsedItem.note) {\n const noteData = {\n labelStyle: \"\",\n shape: SHAPE_NOTE,\n label: parsedItem.note.text,\n cssClasses: CSS_DIAGRAM_NOTE,\n // useHtmlLabels: false,\n cssStyles: [],\n cssCompilesStyles: [],\n id: itemId + NOTE_ID + \"-\" + graphItemCount,\n domId: stateDomId(itemId, graphItemCount, NOTE),\n type: newNode.type,\n isGroup: newNode.type === \"group\",\n padding: getConfig().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,\n //getConfig().flowchart.padding\n look,\n position: parsedItem.note.position\n };\n graphItemCount++;\n groupData.id = parentNodeId;\n noteData.parentId = parentNodeId;\n insertOrUpdateNode(nodes, groupData, classes);\n insertOrUpdateNode(nodes, noteData, classes);\n insertOrUpdateNode(nodes, nodeData, classes);\n let from = itemId;\n let to = noteData.id;\n if (parsedItem.note.position === \"left of\") {\n from = noteData.id;\n to = itemId;\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}, \"dataFetcher\");\nvar reset = /* @__PURE__ */ __name(() => {\n nodeDb.clear();\n graphItemCount = 0;\n}, \"reset\");\n\n// src/diagrams/state/stateDb.js\nvar START_NODE = \"[*]\";\nvar START_TYPE = \"start\";\nvar END_NODE = START_NODE;\nvar END_TYPE = \"end\";\nvar COLOR_KEYWORD = \"color\";\nvar FILL_KEYWORD = \"fill\";\nvar BG_FILL = \"bgFill\";\nvar STYLECLASS_SEP = \",\";\nfunction newClassesList() {\n return /* @__PURE__ */ new Map();\n}\n__name(newClassesList, \"newClassesList\");\nvar newDoc = /* @__PURE__ */ __name(() => {\n return {\n /** @type {{ id1: string, id2: string, relationTitle: string }[]} */\n relations: [],\n states: /* @__PURE__ */ new Map(),\n documents: {}\n };\n}, \"newDoc\");\nvar clone = /* @__PURE__ */ __name((o) => JSON.parse(JSON.stringify(o)), \"clone\");\nvar StateDB = class {\n static {\n __name(this, \"StateDB\");\n }\n /**\n * @param {1 | 2} version - v1 renderer or v2 renderer.\n */\n constructor(version) {\n this.clear();\n this.version = version;\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 * @private\n * @type {1 | 2}\n */\n version;\n /**\n * @private\n * @type {Array}\n */\n nodes = [];\n /**\n * @private\n * @type {Array}\n */\n edges = [];\n /**\n * @private\n * @type {Array}\n */\n rootDoc = [];\n /**\n * @private\n * @type {Map}\n */\n classes = newClassesList();\n // style classes defined by a classDef\n /**\n * @private\n * @type {Object}\n */\n documents = {\n root: newDoc()\n };\n /**\n * @private\n * @type {Object}\n */\n currentDocument = this.documents.root;\n /**\n * @private\n * @type {number}\n */\n startEndCount = 0;\n /**\n * @private\n * @type {number}\n */\n dividerCnt = 0;\n static relationType = {\n AGGREGATION: 0,\n EXTENSION: 1,\n COMPOSITION: 2,\n DEPENDENCY: 3\n };\n setRootDoc(o) {\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 getRootDoc() {\n return this.rootDoc;\n }\n /**\n * @private\n * @param {Object} parent\n * @param {Object} node\n * @param {boolean} first\n */\n docTranslator(parent, node, first) {\n if (node.stmt === STMT_RELATION) {\n this.docTranslator(parent, node.state1, true);\n this.docTranslator(parent, node.state2, false);\n } else {\n if (node.stmt === STMT_STATE) {\n if (node.id === \"[*]\") {\n node.id = first ? parent.id + \"_start\" : parent.id + \"_end\";\n node.start = first;\n } else {\n node.id = node.id.trim();\n }\n }\n if (node.doc) {\n const doc = [];\n let currentDoc = [];\n let i;\n for (i = 0; i < node.doc.length; i++) {\n if (node.doc[i].type === DIVIDER_TYPE) {\n const newNode = clone(node.doc[i]);\n newNode.doc = clone(currentDoc);\n doc.push(newNode);\n currentDoc = [];\n } else {\n currentDoc.push(node.doc[i]);\n }\n }\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 };\n doc.push(clone(newNode));\n node.doc = doc;\n }\n node.doc.forEach((docNode) => this.docTranslator(node, docNode, true));\n }\n }\n }\n /**\n * @private\n */\n getRootDocV2() {\n this.docTranslator({ id: \"root\" }, { id: \"root\", doc: this.rootDoc }, true);\n return { id: \"root\", doc: this.rootDoc };\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 * @private\n * @param _doc\n */\n extract(_doc) {\n let doc;\n if (_doc.doc) {\n doc = _doc.doc;\n } else {\n doc = _doc;\n }\n log.info(doc);\n this.clear(true);\n log.info(\"Extract initial document:\", doc);\n doc.forEach((item) => {\n log.warn(\"Statement\", item.stmt);\n switch (item.stmt) {\n case STMT_STATE:\n this.addState(\n item.id.trim(),\n item.type,\n item.doc,\n item.description,\n item.note,\n item.classes,\n item.styles,\n item.textStyles\n );\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 {\n const ids = item.id.trim().split(\",\");\n const styles = item.styleClass.split(\",\");\n ids.forEach((id) => {\n let foundState = this.getState(id);\n if (foundState === void 0) {\n const trimmedId = id.trim();\n this.addState(trimmedId);\n foundState = this.getState(trimmedId);\n }\n foundState.styles = styles.map((s) => s.replace(/;/g, \"\")?.trim());\n });\n }\n break;\n case STMT_APPLYCLASS:\n this.setCssClass(item.id.trim(), item.styleClass);\n break;\n }\n });\n const diagramStates = this.getStates();\n const config = getConfig();\n const look = config.look;\n reset();\n dataFetcher(\n void 0,\n this.getRootDocV2(),\n diagramStates,\n this.nodes,\n this.edges,\n true,\n look,\n this.classes\n );\n this.nodes.forEach((node) => {\n if (Array.isArray(node.label)) {\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 /**\n * Function called by parser when a node definition has been found.\n *\n * @param {null | string} id\n * @param {null | string} type\n * @param {null | string} doc\n * @param {null | string | string[]} descr - description for the state. Can be a string or a list or strings\n * @param {null | string} note\n * @param {null | string | string[]} 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 {null | string | string[]} 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 {null | string | string[]} 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(id, type = DEFAULT_STATE_TYPE, doc = null, descr = null, note = null, classes = null, styles = null, textStyles = null) {\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 id: trimmedId,\n descriptions: [],\n type,\n doc,\n note,\n classes: [],\n styles: [],\n textStyles: []\n });\n } else {\n if (!this.currentDocument.states.get(trimmedId).doc) {\n this.currentDocument.states.get(trimmedId).doc = doc;\n }\n if (!this.currentDocument.states.get(trimmedId).type) {\n this.currentDocument.states.get(trimmedId).type = type;\n }\n }\n if (descr) {\n log.info(\"Setting state description\", trimmedId, descr);\n if (typeof descr === \"string\") {\n this.addDescription(trimmedId, descr.trim());\n }\n if (typeof descr === \"object\") {\n descr.forEach((des) => this.addDescription(trimmedId, des.trim()));\n }\n }\n if (note) {\n const doc2 = this.currentDocument.states.get(trimmedId);\n doc2.note = note;\n doc2.note.text = common_default.sanitizeText(doc2.note.text, getConfig());\n }\n if (classes) {\n log.info(\"Setting state classes\", trimmedId, classes);\n const classesList = typeof classes === \"string\" ? [classes] : classes;\n classesList.forEach((cssClass) => this.setCssClass(trimmedId, cssClass.trim()));\n }\n if (styles) {\n log.info(\"Setting state styles\", trimmedId, styles);\n const stylesList = typeof styles === \"string\" ? [styles] : styles;\n stylesList.forEach((style) => this.setStyle(trimmedId, style.trim()));\n }\n if (textStyles) {\n log.info(\"Setting state styles\", trimmedId, styles);\n const textStylesList = typeof textStyles === \"string\" ? [textStyles] : textStyles;\n textStylesList.forEach((textStyle) => this.setTextStyle(trimmedId, textStyle.trim()));\n }\n }\n clear(saveCommon) {\n this.nodes = [];\n this.edges = [];\n this.documents = {\n root: newDoc()\n };\n this.currentDocument = this.documents.root;\n this.startEndCount = 0;\n this.classes = newClassesList();\n if (!saveCommon) {\n clear();\n }\n }\n getState(id) {\n return this.currentDocument.states.get(id);\n }\n getStates() {\n return this.currentDocument.states;\n }\n logDocuments() {\n log.info(\"Documents = \", this.documents);\n }\n getRelations() {\n return this.currentDocument.relations;\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 * @param {string} id\n * @returns {string} - the id (original or constructed)\n * @private\n */\n startIdIfNeeded(id = \"\") {\n let fixedId = id;\n if (id === START_NODE) {\n this.startEndCount++;\n fixedId = `${START_TYPE}${this.startEndCount}`;\n }\n return fixedId;\n }\n /**\n * If the id is a start node ( [*] ), then return the start type ('start')\n * else return the given type\n *\n * @param {string} id\n * @param {string} type\n * @returns {string} - the type that should be used\n * @private\n */\n startTypeIfNeeded(id = \"\", type = DEFAULT_STATE_TYPE) {\n return id === START_NODE ? START_TYPE : type;\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 * @param {string} id\n * @returns {string} - the id (original or constructed)\n * @private\n */\n endIdIfNeeded(id = \"\") {\n let fixedId = id;\n if (id === END_NODE) {\n this.startEndCount++;\n fixedId = `${END_TYPE}${this.startEndCount}`;\n }\n return fixedId;\n }\n /**\n * If the id is an end node ( [*] ), then return the end type\n * else return the given type\n *\n * @param {string} id\n * @param {string} type\n * @returns {string} - the type that should be used\n * @private\n */\n endTypeIfNeeded(id = \"\", type = DEFAULT_STATE_TYPE) {\n return id === END_NODE ? END_TYPE : type;\n }\n /**\n *\n * @param item1\n * @param item2\n * @param relationTitle\n */\n addRelationObjs(item1, item2, relationTitle) {\n let id1 = this.startIdIfNeeded(item1.id.trim());\n let type1 = this.startTypeIfNeeded(item1.id.trim(), item1.type);\n let id2 = this.startIdIfNeeded(item2.id.trim());\n let 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_default.sanitizeText(relationTitle, getConfig())\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 * @param {string | object} item1\n * @param {string | object} item2\n * @param {string} title\n */\n addRelation(item1, item2, title) {\n if (typeof item1 === \"object\") {\n this.addRelationObjs(item1, item2, title);\n } else {\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 this.addState(id1, type1);\n this.addState(id2, type2);\n this.currentDocument.relations.push({\n id1,\n id2,\n title: common_default.sanitizeText(title, getConfig())\n });\n }\n }\n addDescription(id, descr) {\n const theState = this.currentDocument.states.get(id);\n const _descr = descr.startsWith(\":\") ? descr.replace(\":\", \"\").trim() : descr;\n theState.descriptions.push(common_default.sanitizeText(_descr, getConfig()));\n }\n cleanupLabel(label) {\n if (label.substring(0, 1) === \":\") {\n return label.substr(2).trim();\n } else {\n return label.trim();\n }\n }\n getDividerId() {\n this.dividerCnt++;\n return \"divider-id-\" + this.dividerCnt;\n }\n /**\n * Called when the parser comes across a (style) class definition\n * @example classDef my-style fill:#f96;\n *\n * @param {string} id - the id of this (style) class\n * @param {string | null} styleAttributes - the string with 1 or more style attributes (each separated by a comma)\n */\n addStyleClass(id, styleAttributes = \"\") {\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 !== void 0 && styleAttributes !== null) {\n styleAttributes.split(STYLECLASS_SEP).forEach((attrib) => {\n const fixedAttrib = attrib.replace(/([^;]*);/, \"$1\").trim();\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 * Return all of the style classes\n * @returns {{} | any | classes}\n */\n getClasses() {\n return this.classes;\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 {string | string[]} itemIds The id or a list of ids of the item(s) to apply the css class to\n * @param {string} cssClassName CSS class name\n */\n setCssClass(itemIds, cssClassName) {\n itemIds.split(\",\").forEach((id) => {\n let foundState = this.getState(id);\n if (foundState === void 0) {\n const trimmedId = id.trim();\n this.addState(trimmedId);\n foundState = this.getState(trimmedId);\n }\n foundState.classes.push(cssClassName);\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, styleText) {\n const item = this.getState(itemId);\n if (item !== void 0) {\n item.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, cssClassName) {\n const item = this.getState(itemId);\n if (item !== void 0) {\n item.textStyles.push(cssClassName);\n }\n }\n /**\n * Finds the direction statement in the root document.\n * @private\n * @returns {{ value: string } | undefined} - the direction statement if present\n */\n getDirectionStatement() {\n return this.rootDoc.find((doc) => doc.stmt === STMT_DIRECTION);\n }\n getDirection() {\n return this.getDirectionStatement()?.value ?? DEFAULT_DIAGRAM_DIRECTION;\n }\n setDirection(dir) {\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 trimColon(str) {\n return str && str[0] === \":\" ? str.substr(1).trim() : str.trim();\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 getConfig() {\n return getConfig().state;\n }\n getAccTitle = getAccTitle;\n setAccTitle = setAccTitle;\n getAccDescription = getAccDescription;\n setAccDescription = setAccDescription;\n setDiagramTitle = setDiagramTitle;\n getDiagramTitle = getDiagramTitle;\n};\n\n// src/diagrams/state/styles.js\nvar getStyles = /* @__PURE__ */ __name((options) => `\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`, \"getStyles\");\nvar styles_default = getStyles;\n\nexport {\n stateDiagram_default,\n stateRenderer_v3_unified_default,\n StateDB,\n styles_default\n};\n","import {\n __name,\n configureSvgSize,\n log\n} from \"./chunk-YTJNT7DU.mjs\";\n\n// src/rendering-util/insertElementsForSize.js\nimport { select } from \"d3\";\nvar getDiagramElement = /* @__PURE__ */ __name((id, securityLevel) => {\n let sandboxElement;\n if (securityLevel === \"sandbox\") {\n sandboxElement = select(\"#i\" + id);\n }\n const root = securityLevel === \"sandbox\" ? select(sandboxElement.nodes()[0].contentDocument.body) : select(\"body\");\n const svg = root.select(`[id=\"${id}\"]`);\n return svg;\n}, \"getDiagramElement\");\n\n// src/rendering-util/setupViewPortForSVG.ts\nvar setupViewPortForSVG = /* @__PURE__ */ __name((svg, padding, cssDiagram, useMaxWidth) => {\n svg.attr(\"class\", cssDiagram);\n const { width, height, x, y } = calculateDimensionsWithPadding(svg, padding);\n configureSvgSize(svg, height, width, useMaxWidth);\n const viewBox = createViewBox(x, y, width, height, padding);\n svg.attr(\"viewBox\", viewBox);\n log.debug(`viewBox configured: ${viewBox} with padding: ${padding}`);\n}, \"setupViewPortForSVG\");\nvar calculateDimensionsWithPadding = /* @__PURE__ */ __name((svg, padding) => {\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}, \"calculateDimensionsWithPadding\");\nvar createViewBox = /* @__PURE__ */ __name((x, y, width, height, padding) => {\n return `${x - padding} ${y - padding} ${width} ${height}`;\n}, \"createViewBox\");\n\nexport {\n getDiagramElement,\n setupViewPortForSVG\n};\n"],"names":["parser","o","__name","k","v","o2","l","length","$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","parser2","trace","yy","symbols_","terminals_","productions_","performAction","yytext","yyleng","yylineno","yystate","$$","_$","$0","setRootDoc","this","$","push","stateStmt","description","trimColon","stmt","state1","state2","relDescription","id","type","doc","trim","match","parts","split","getDividerId","note","position","text","setAccTitle","setAccDescription","classes","styleClass","setDirection","value","table","defaultActions","parseError","str","hash","recoverable","error","Error","parse","input","self","stack","tstack","vstack","lstack","recovering","args","slice","call","arguments","lexer2","Object","create","lexer","sharedState","prototype","hasOwnProperty","setInput","yylloc","yyloc","ranges","options","lex","token","pop","Array","getPrototypeOf","n","symbol","preErrorSymbol","state","action","r","p","len","newState","expected","yyval","errStr","showPosition","join","line","loc","first_line","last_line","first_column","last_column","range","apply","concat","EOF","_input","_more","_backtrack","done","matched","conditionStack","offset","ch","unput","lines","substr","oldLines","more","reject","backtrack_lexer","less","pastInput","past","replace","upcomingInput","next","pre","c","test_match","indexed_rule","backup","matches","tempMatch","index","rules","_currentRules","i","flex","begin","condition","popState","conditions","topState","Math","abs","pushState","stateStackSize","yy_","$avoiding_name_collisions","YY_START","Parser","stateDiagram_default","STMT_STATE","STMT_RELATION","DEFAULT_STATE_TYPE","DIVIDER_TYPE","G_EDGE_STYLE","G_EDGE_ARROWHEADSTYLE","G_EDGE_LABELTYPE","G_EDGE_THICKNESS","SHAPE_STATE","SHAPE_STATE_WITH_DESC","SHAPE_DIVIDER","SHAPE_GROUP","CSS_DIAGRAM","CSS_DIAGRAM_STATE","CSS_EDGE","CSS_EDGE_NOTE_EDGE","CSS_DIAGRAM_NOTE","CSS_DIAGRAM_CLUSTER","CSS_DIAGRAM_CLUSTER_ALT","PARENT","NOTE","DOMID_TYPE_SPACER","NOTE_ID","PARENT_ID","getDir","parsedItem","defaultDir","undefined","dir","parsedItemDoc","stateRenderer_v3_unified_default","getClasses","diagramObj","db","draw","async","_version","diag","log","info","securityLevel","conf","layout","getConfig","extract","getRootDocV2","data4Layout","getData","svg","getDiagramElement","layoutAlgorithm","nodeSpacing","rankSpacing","markers","diagramId","render","utils_default","insertTitle","titleTopMargin","getDiagramTitle","setupViewPortForSVG","useMaxWidth","nodeDb","Map","graphItemCount","stateDomId","counter","typeSpacer","setupDoc","parentParsedItem","diagramStates","nodes","edges","altFlag","look","forEach","item","dataFetcher","edgeData","start","end","arrowhead","arrowTypeEnd","style","labelStyle","label","common_default","sanitizeText","arrowheadStyle","labelpos","labelType","thickness","getDir2","insertOrUpdateNode","nodeData","cssClasses","isArray","cssCompiledStyles","cssClass","get","classDef","styles","existingNodeData","find","node","assign","getClassesFromDbInfo","dbInfoItem","getStylesFromDbInfo","parent","itemId","dbState","classStr","shape","set","cssStyles","newNode","sanitizeTextOrArray","isGroup","domId","padding","rx","ry","parentId","centerLabel","noteData","cssCompilesStyles","flowchart","parentNodeId","groupData","from","to","reset","clear","START_NODE","START_TYPE","END_NODE","COLOR_KEYWORD","FILL_KEYWORD","newClassesList","newDoc","relations","states","documents","clone","JSON","stringify","StateDB","constructor","version","bind","rootDoc","root","currentDocument","startEndCount","dividerCnt","static","AGGREGATION","EXTENSION","COMPOSITION","DEPENDENCY","getRootDoc","docTranslator","first","currentDoc","generateId","docNode","_doc","warn","addState","textStyles","addRelation","addStyleClass","ids","foundState","getState","trimmedId","map","s","setCssClass","getStates","descr","has","descriptions","addDescription","des","doc2","setStyle","textStyle","setTextStyle","saveCommon","logDocuments","getRelations","startIdIfNeeded","fixedId","startTypeIfNeeded","endIdIfNeeded","endTypeIfNeeded","addRelationObjs","item1","item2","relationTitle","id1","type1","id2","type2","title","theState","_descr","startsWith","cleanupLabel","substring","styleAttributes","foundClass","attrib","fixedAttrib","RegExp","exec","newStyle2","itemIds","cssClassName","styleText","getDirectionStatement","getDirection","unshift","config","other","direction","getAccTitle","getAccDescription","setDiagramTitle","styles_default","transitionColor","nodeBorder","textColor","stateLabelColor","mainBkg","lineColor","background","noteBorderColor","noteBkgColor","noteTextColor","labelBackgroundColor","edgeLabelBackground","transitionLabelColor","tertiaryTextColor","specialStateColor","innerEndBackground","compositeBackground","stateBkg","stateBorder","compositeTitleBackground","altBackground","sandboxElement","select","contentDocument","body","cssDiagram","attr","width","height","x","y","calculateDimensionsWithPadding","configureSvgSize","viewBox","createViewBox","debug","bounds","getBBox"],"sourceRoot":""} \ No newline at end of file diff --git a/frontend/deployed/static/js/358.7641aa7d.chunk.js b/frontend/deployed/static/js/358.7641aa7d.chunk.js deleted file mode 100644 index c559c95..0000000 --- a/frontend/deployed/static/js/358.7641aa7d.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunkbackstory=self.webpackChunkbackstory||[]).push([[358],{5358:(t,r,e)=>{e.d(r,{diagram:()=>ft});var n=e(7799),o=e(9837),a=e(634),c=e(3759),s=e(5502),i=e(700),h={NORMAL:0,REVERSE:1,HIGHLIGHT:2,MERGE:3,CHERRY_PICK:4},d=c.UI.gitGraph,m=(0,c.K2)((()=>(0,a.$t)({...d,...(0,c.zj)().gitGraph})),"getConfig"),$=new o.m((()=>{const t=m(),r=t.mainBranchName,e=t.mainBranchOrder;return{mainBranchName:r,commits:new Map,head:null,branchConfig:new Map([[r,{name:r,order:e}]]),branches:new Map([[r,null]]),currBranch:r,direction:"LR",seq:0,options:{}}}));function l(){return(0,a.yT)({length:7})}function y(t,r){const e=Object.create(null);return t.reduce(((t,n)=>{const o=r(n);return e[o]||(e[o]=!0,t.push(n)),t}),[])}(0,c.K2)(l,"getID"),(0,c.K2)(y,"uniqBy");var g=(0,c.K2)((function(t){$.records.direction=t}),"setDirection"),p=(0,c.K2)((function(t){c.Rm.debug("options str",t),t=t?.trim(),t=t||"{}";try{$.records.options=JSON.parse(t)}catch(r){c.Rm.error("error while parsing gitGraph options",r.message)}}),"setOptions"),x=(0,c.K2)((function(){return $.records.options}),"getOptions"),f=(0,c.K2)((function(t){let r=t.msg,e=t.id;const n=t.type;let o=t.tags;c.Rm.info("commit",r,e,n,o),c.Rm.debug("Entering commit:",r,e,n,o);const a=m();e=c.Y2.sanitizeText(e,a),r=c.Y2.sanitizeText(r,a),o=o?.map((t=>c.Y2.sanitizeText(t,a)));const s={id:e||$.records.seq+"-"+l(),message:r,seq:$.records.seq++,type:n??h.NORMAL,tags:o??[],parents:null==$.records.head?[]:[$.records.head.id],branch:$.records.currBranch};$.records.head=s,c.Rm.info("main branch",a.mainBranchName),$.records.commits.set(s.id,s),$.records.branches.set($.records.currBranch,s.id),c.Rm.debug("in pushCommit "+s.id)}),"commit"),u=(0,c.K2)((function(t){let r=t.name;const e=t.order;if(r=c.Y2.sanitizeText(r,m()),$.records.branches.has(r))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 ${r}")`);$.records.branches.set(r,null!=$.records.head?$.records.head.id:null),$.records.branchConfig.set(r,{name:r,order:e}),B(r),c.Rm.debug("in createBranch")}),"branch"),b=(0,c.K2)((t=>{let r=t.branch,e=t.id;const n=t.type,o=t.tags,a=m();r=c.Y2.sanitizeText(r,a),e&&(e=c.Y2.sanitizeText(e,a));const s=$.records.branches.get($.records.currBranch),i=$.records.branches.get(r),d=s?$.records.commits.get(s):void 0,y=i?$.records.commits.get(i):void 0;if(d&&y&&d.branch===r)throw new Error(`Cannot merge branch '${r}' into itself.`);if($.records.currBranch===r){const t=new Error('Incorrect usage of "merge". Cannot merge a branch to itself');throw t.hash={text:`merge ${r}`,token:`merge ${r}`,expected:["branch abc"]},t}if(void 0===d||!d){const t=new Error(`Incorrect usage of "merge". Current branch (${$.records.currBranch})has no commits`);throw t.hash={text:`merge ${r}`,token:`merge ${r}`,expected:["commit"]},t}if(!$.records.branches.has(r)){const t=new Error('Incorrect usage of "merge". Branch to be merged ('+r+") does not exist");throw t.hash={text:`merge ${r}`,token:`merge ${r}`,expected:[`branch ${r}`]},t}if(void 0===y||!y){const t=new Error('Incorrect usage of "merge". Branch to be merged ('+r+") has no commits");throw t.hash={text:`merge ${r}`,token:`merge ${r}`,expected:['"commit"']},t}if(d===y){const t=new Error('Incorrect usage of "merge". Both branches have same head');throw t.hash={text:`merge ${r}`,token:`merge ${r}`,expected:["branch abc"]},t}if(e&&$.records.commits.has(e)){const t=new Error('Incorrect usage of "merge". Commit with id:'+e+" already exists, use different custom Id");throw t.hash={text:`merge ${r} ${e} ${n} ${o?.join(" ")}`,token:`merge ${r} ${e} ${n} ${o?.join(" ")}`,expected:[`merge ${r} ${e}_UNIQUE ${n} ${o?.join(" ")}`]},t}const g=i||"",p={id:e||`${$.records.seq}-${l()}`,message:`merged branch ${r} into ${$.records.currBranch}`,seq:$.records.seq++,parents:null==$.records.head?[]:[$.records.head.id,g],branch:$.records.currBranch,type:h.MERGE,customType:n,customId:!!e,tags:o??[]};$.records.head=p,$.records.commits.set(p.id,p),$.records.branches.set($.records.currBranch,p.id),c.Rm.debug($.records.branches),c.Rm.debug("in mergeBranch")}),"merge"),w=(0,c.K2)((function(t){let r=t.id,e=t.targetId,n=t.tags,o=t.parent;c.Rm.debug("Entering cherryPick:",r,e,n);const a=m();if(r=c.Y2.sanitizeText(r,a),e=c.Y2.sanitizeText(e,a),n=n?.map((t=>c.Y2.sanitizeText(t,a))),o=c.Y2.sanitizeText(o,a),!r||!$.records.commits.has(r)){const t=new Error('Incorrect usage of "cherryPick". Source commit id should exist and provided');throw t.hash={text:`cherryPick ${r} ${e}`,token:`cherryPick ${r} ${e}`,expected:["cherry-pick abc"]},t}const s=$.records.commits.get(r);if(void 0===s||!s)throw new Error('Incorrect usage of "cherryPick". Source commit id should exist and provided');if(o&&(!Array.isArray(s.parents)||!s.parents.includes(o))){throw new Error("Invalid operation: The specified parent commit is not an immediate parent of the cherry-picked commit.")}const i=s.branch;if(s.type===h.MERGE&&!o){throw new Error("Incorrect usage of cherry-pick: If the source commit is a merge commit, an immediate parent commit must be specified.")}if(!e||!$.records.commits.has(e)){if(i===$.records.currBranch){const t=new Error('Incorrect usage of "cherryPick". Source commit is already on current branch');throw t.hash={text:`cherryPick ${r} ${e}`,token:`cherryPick ${r} ${e}`,expected:["cherry-pick abc"]},t}const t=$.records.branches.get($.records.currBranch);if(void 0===t||!t){const t=new Error(`Incorrect usage of "cherry-pick". Current branch (${$.records.currBranch})has no commits`);throw t.hash={text:`cherryPick ${r} ${e}`,token:`cherryPick ${r} ${e}`,expected:["cherry-pick abc"]},t}const a=$.records.commits.get(t);if(void 0===a||!a){const t=new Error(`Incorrect usage of "cherry-pick". Current branch (${$.records.currBranch})has no commits`);throw t.hash={text:`cherryPick ${r} ${e}`,token:`cherryPick ${r} ${e}`,expected:["cherry-pick abc"]},t}const d={id:$.records.seq+"-"+l(),message:`cherry-picked ${s?.message} into ${$.records.currBranch}`,seq:$.records.seq++,parents:null==$.records.head?[]:[$.records.head.id,s.id],branch:$.records.currBranch,type:h.CHERRY_PICK,tags:n?n.filter(Boolean):[`cherry-pick:${s.id}${s.type===h.MERGE?`|parent:${o}`:""}`]};$.records.head=d,$.records.commits.set(d.id,d),$.records.branches.set($.records.currBranch,d.id),c.Rm.debug($.records.branches),c.Rm.debug("in cherryPick")}}),"cherryPick"),B=(0,c.K2)((function(t){if(t=c.Y2.sanitizeText(t,m()),!$.records.branches.has(t)){const r=new Error(`Trying to checkout branch which is not yet created. (Help try using "branch ${t}")`);throw r.hash={text:`checkout ${t}`,token:`checkout ${t}`,expected:[`branch ${t}`]},r}{$.records.currBranch=t;const r=$.records.branches.get($.records.currBranch);$.records.head=void 0!==r&&r?$.records.commits.get(r)??null:null}}),"checkout");function E(t,r,e){const n=t.indexOf(r);-1===n?t.push(e):t.splice(n,1,e)}function k(t){const r=t.reduce(((t,r)=>t.seq>r.seq?t:r),t[0]);let e="";t.forEach((function(t){e+=t===r?"\t*":"\t|"}));const n=[e,r.id,r.seq];for(const o in $.records.branches)$.records.branches.get(o)===r.id&&n.push(o);if(c.Rm.debug(n.join(" ")),r.parents&&2==r.parents.length&&r.parents[0]&&r.parents[1]){const e=$.records.commits.get(r.parents[0]);E(t,r,e),r.parents[1]&&t.push($.records.commits.get(r.parents[1]))}else{if(0==r.parents.length)return;if(r.parents[0]){const e=$.records.commits.get(r.parents[0]);E(t,r,e)}}k(t=y(t,(t=>t.id)))}(0,c.K2)(E,"upsert"),(0,c.K2)(k,"prettyPrintCommitHistory");var C=(0,c.K2)((function(){c.Rm.debug($.records.commits);k([v()[0]])}),"prettyPrint"),T=(0,c.K2)((function(){$.reset(),(0,c.IU)()}),"clear"),L=(0,c.K2)((function(){return[...$.records.branchConfig.values()].map(((t,r)=>null!==t.order&&void 0!==t.order?t:{...t,order:parseFloat(`0.${r}`)})).sort(((t,r)=>(t.order??0)-(r.order??0))).map((t=>{let{name:r}=t;return{name:r}}))}),"getBranchesAsObjArray"),K=(0,c.K2)((function(){return $.records.branches}),"getBranches"),M=(0,c.K2)((function(){return $.records.commits}),"getCommits"),v=(0,c.K2)((function(){const t=[...$.records.commits.values()];return t.forEach((function(t){c.Rm.debug(t.id)})),t.sort(((t,r)=>t.seq-r.seq)),t}),"getCommitsArray"),R={commitType:h,getConfig:m,setDirection:g,setOptions:p,getOptions:x,commit:f,branch:u,merge:b,cherryPick:w,checkout:B,prettyPrint:C,clear:T,getBranchesAsObjArray:L,getBranches:K,getCommits:M,getCommitsArray:v,getCurrentBranch:(0,c.K2)((function(){return $.records.currBranch}),"getCurrentBranch"),getDirection:(0,c.K2)((function(){return $.records.direction}),"getDirection"),getHead:(0,c.K2)((function(){return $.records.head}),"getHead"),setAccTitle:c.SV,getAccTitle:c.iN,getAccDescription:c.m7,setAccDescription:c.EI,setDiagramTitle:c.ke,getDiagramTitle:c.ab},P=(0,c.K2)(((t,r)=>{(0,n.S)(t,r),t.dir&&r.setDirection(t.dir);for(const e of t.statements)I(e,r)}),"populate"),I=(0,c.K2)(((t,r)=>{const e={Commit:(0,c.K2)((t=>r.commit(A(t))),"Commit"),Branch:(0,c.K2)((t=>r.branch(G(t))),"Branch"),Merge:(0,c.K2)((t=>r.merge(O(t))),"Merge"),Checkout:(0,c.K2)((t=>r.checkout(q(t))),"Checkout"),CherryPicking:(0,c.K2)((t=>r.cherryPick(z(t))),"CherryPicking")}[t.$type];e?e(t):c.Rm.error(`Unknown statement type: ${t.$type}`)}),"parseStatement"),A=(0,c.K2)((t=>({id:t.id,msg:t.message??"",type:void 0!==t.type?h[t.type]:h.NORMAL,tags:t.tags??void 0})),"parseCommit"),G=(0,c.K2)((t=>({name:t.name,order:t.order??0})),"parseBranch"),O=(0,c.K2)((t=>({branch:t.branch,id:t.id??"",type:void 0!==t.type?h[t.type]:void 0,tags:t.tags??void 0})),"parseMerge"),q=(0,c.K2)((t=>t.branch),"parseCheckout"),z=(0,c.K2)((t=>({id:t.id,targetId:"",tags:0===t.tags?.length?void 0:t.tags,parent:t.parent})),"parseCherryPicking"),H={parse:(0,c.K2)((async t=>{const r=await(0,s.qg)("gitGraph",t);c.Rm.debug(r),P(r,R)}),"parse")};var S=(0,c.D7)(),D=S?.gitGraph,Y=10,N=40,j=new Map,W=new Map,_=new Map,F=[],U=0,V="LR",J=(0,c.K2)((()=>{j.clear(),W.clear(),_.clear(),U=0,F=[],V="LR"}),"clear"),Q=(0,c.K2)((t=>{const r=document.createElementNS("http://www.w3.org/2000/svg","text");return("string"===typeof t?t.split(/\\n|\n|/gi):t).forEach((t=>{const e=document.createElementNS("http://www.w3.org/2000/svg","tspan");e.setAttributeNS("http://www.w3.org/XML/1998/namespace","xml:space","preserve"),e.setAttribute("dy","1em"),e.setAttribute("x","0"),e.setAttribute("class","row"),e.textContent=t.trim(),r.appendChild(e)})),r}),"drawText"),X=(0,c.K2)((t=>{let r,e,n;return"BT"===V?(e=(0,c.K2)(((t,r)=>t<=r),"comparisonFunc"),n=1/0):(e=(0,c.K2)(((t,r)=>t>=r),"comparisonFunc"),n=0),t.forEach((t=>{const o="TB"===V||"BT"==V?W.get(t)?.y:W.get(t)?.x;void 0!==o&&e(o,n)&&(r=t,n=o)})),r}),"findClosestParent"),Z=(0,c.K2)((t=>{let r="",e=1/0;return t.forEach((t=>{const n=W.get(t).y;n<=e&&(r=t,e=n)})),r||void 0}),"findClosestParentBT"),tt=(0,c.K2)(((t,r,e)=>{let n=e,o=e;const a=[];t.forEach((t=>{const e=r.get(t);if(!e)throw new Error(`Commit not found for key ${t}`);e.parents.length?(n=et(e),o=Math.max(n,o)):a.push(e),nt(e,n)})),n=o,a.forEach((t=>{ot(t,n,e)})),t.forEach((t=>{const e=r.get(t);if(e?.parents.length){const t=Z(e.parents);n=W.get(t).y-N,n<=o&&(o=n);const r=j.get(e.branch).pos,a=n-Y;W.set(e.id,{x:r,y:a})}}))}),"setParallelBTPos"),rt=(0,c.K2)((t=>{const r=X(t.parents.filter((t=>null!==t)));if(!r)throw new Error(`Closest parent not found for commit ${t.id}`);const e=W.get(r)?.y;if(void 0===e)throw new Error(`Closest parent position not found for commit ${t.id}`);return e}),"findClosestParentPos"),et=(0,c.K2)((t=>rt(t)+N),"calculateCommitPosition"),nt=(0,c.K2)(((t,r)=>{const e=j.get(t.branch);if(!e)throw new Error(`Branch not found for commit ${t.id}`);const n=e.pos,o=r+Y;return W.set(t.id,{x:n,y:o}),{x:n,y:o}}),"setCommitPosition"),ot=(0,c.K2)(((t,r,e)=>{const n=j.get(t.branch);if(!n)throw new Error(`Branch not found for commit ${t.id}`);const o=r+e,a=n.pos;W.set(t.id,{x:a,y:o})}),"setRootPosition"),at=(0,c.K2)(((t,r,e,n,o,a)=>{if(a===h.HIGHLIGHT)t.append("rect").attr("x",e.x-10).attr("y",e.y-10).attr("width",20).attr("height",20).attr("class",`commit ${r.id} commit-highlight${o%8} ${n}-outer`),t.append("rect").attr("x",e.x-6).attr("y",e.y-6).attr("width",12).attr("height",12).attr("class",`commit ${r.id} commit${o%8} ${n}-inner`);else if(a===h.CHERRY_PICK)t.append("circle").attr("cx",e.x).attr("cy",e.y).attr("r",10).attr("class",`commit ${r.id} ${n}`),t.append("circle").attr("cx",e.x-3).attr("cy",e.y+2).attr("r",2.75).attr("fill","#fff").attr("class",`commit ${r.id} ${n}`),t.append("circle").attr("cx",e.x+3).attr("cy",e.y+2).attr("r",2.75).attr("fill","#fff").attr("class",`commit ${r.id} ${n}`),t.append("line").attr("x1",e.x+3).attr("y1",e.y+1).attr("x2",e.x).attr("y2",e.y-5).attr("stroke","#fff").attr("class",`commit ${r.id} ${n}`),t.append("line").attr("x1",e.x-3).attr("y1",e.y+1).attr("x2",e.x).attr("y2",e.y-5).attr("stroke","#fff").attr("class",`commit ${r.id} ${n}`);else{const c=t.append("circle");if(c.attr("cx",e.x),c.attr("cy",e.y),c.attr("r",r.type===h.MERGE?9:10),c.attr("class",`commit ${r.id} commit${o%8}`),a===h.MERGE){const a=t.append("circle");a.attr("cx",e.x),a.attr("cy",e.y),a.attr("r",6),a.attr("class",`commit ${n} ${r.id} commit${o%8}`)}if(a===h.REVERSE){t.append("path").attr("d",`M ${e.x-5},${e.y-5}L${e.x+5},${e.y+5}M${e.x-5},${e.y+5}L${e.x+5},${e.y-5}`).attr("class",`commit ${n} ${r.id} commit${o%8}`)}}}),"drawCommitBullet"),ct=(0,c.K2)(((t,r,e,n)=>{if(r.type!==h.CHERRY_PICK&&(r.customId&&r.type===h.MERGE||r.type!==h.MERGE)&&D?.showCommitLabel){const o=t.append("g"),a=o.insert("rect").attr("class","commit-label-bkg"),c=o.append("text").attr("x",n).attr("y",e.y+25).attr("class","commit-label").text(r.id),s=c.node()?.getBBox();if(s&&(a.attr("x",e.posWithOffset-s.width/2-2).attr("y",e.y+13.5).attr("width",s.width+4).attr("height",s.height+4),"TB"===V||"BT"===V?(a.attr("x",e.x-(s.width+16+5)).attr("y",e.y-12),c.attr("x",e.x-(s.width+16)).attr("y",e.y+s.height-12)):c.attr("x",e.posWithOffset-s.width/2),D.rotateCommitLabel))if("TB"===V||"BT"===V)c.attr("transform","rotate(-45, "+e.x+", "+e.y+")"),a.attr("transform","rotate(-45, "+e.x+", "+e.y+")");else{const t=-7.5-(s.width+10)/25*9.5,r=10+s.width/25*8.5;o.attr("transform","translate("+t+", "+r+") rotate(-45, "+n+", "+e.y+")")}}}),"drawCommitLabel"),st=(0,c.K2)(((t,r,e,n)=>{if(r.tags.length>0){let o=0,a=0,c=0;const s=[];for(const n of r.tags.reverse()){const r=t.insert("polygon"),i=t.append("circle"),h=t.append("text").attr("y",e.y-16-o).attr("class","tag-label").text(n),d=h.node()?.getBBox();if(!d)throw new Error("Tag bbox not found");a=Math.max(a,d.width),c=Math.max(c,d.height),h.attr("x",e.posWithOffset-d.width/2),s.push({tag:h,hole:i,rect:r,yOffset:o}),o+=20}for(const{tag:t,hole:r,rect:i,yOffset:h}of s){const o=c/2,s=e.y-19.2-h;if(i.attr("class","tag-label-bkg").attr("points",`\n ${n-a/2-2},${s+2} \n ${n-a/2-2},${s-2}\n ${e.posWithOffset-a/2-4},${s-o-2}\n ${e.posWithOffset+a/2+4},${s-o-2}\n ${e.posWithOffset+a/2+4},${s+o+2}\n ${e.posWithOffset-a/2-4},${s+o+2}`),r.attr("cy",s).attr("cx",n-a/2+2).attr("r",1.5).attr("class","tag-hole"),"TB"===V||"BT"===V){const c=n+h;i.attr("class","tag-label-bkg").attr("points",`\n ${e.x},${c+2}\n ${e.x},${c-2}\n ${e.x+Y},${c-o-2}\n ${e.x+Y+a+4},${c-o-2}\n ${e.x+Y+a+4},${c+o+2}\n ${e.x+Y},${c+o+2}`).attr("transform","translate(12,12) rotate(45, "+e.x+","+n+")"),r.attr("cx",e.x+2).attr("cy",c).attr("transform","translate(12,12) rotate(45, "+e.x+","+n+")"),t.attr("x",e.x+5).attr("y",c+3).attr("transform","translate(14,14) rotate(45, "+e.x+","+n+")")}}}}),"drawCommitTags"),it=(0,c.K2)((t=>{switch(t.customType??t.type){case h.NORMAL:return"commit-normal";case h.REVERSE:return"commit-reverse";case h.HIGHLIGHT:return"commit-highlight";case h.MERGE:return"commit-merge";case h.CHERRY_PICK:return"commit-cherry-pick";default:return"commit-normal"}}),"getCommitClassType"),ht=(0,c.K2)(((t,r,e,n)=>{const o={x:0,y:0};if(!(t.parents.length>0)){if("TB"===r)return 30;if("BT"===r){return(n.get(t.id)??o).y-N}return 0}{const e=X(t.parents);if(e){const a=n.get(e)??o;if("TB"===r)return a.y+N;if("BT"===r){return(n.get(t.id)??o).y-N}return a.x+N}}return 0}),"calculatePosition"),dt=(0,c.K2)(((t,r,e)=>{const n="BT"===V&&e?r:r+Y,o="TB"===V||"BT"===V?n:j.get(t.branch)?.pos,a="TB"===V||"BT"===V?j.get(t.branch)?.pos:n;if(void 0===a||void 0===o)throw new Error(`Position were undefined for commit ${t.id}`);return{x:a,y:o,posWithOffset:n}}),"getCommitPosition"),mt=(0,c.K2)(((t,r,e)=>{if(!D)throw new Error("GitGraph config not found");const n=t.append("g").attr("class","commit-bullets"),o=t.append("g").attr("class","commit-labels");let a="TB"===V||"BT"===V?30:0;const s=[...r.keys()],i=D?.parallelCommits??!1,h=(0,c.K2)(((t,e)=>{const n=r.get(t)?.seq,o=r.get(e)?.seq;return void 0!==n&&void 0!==o?n-o:0}),"sortKeys");let d=s.sort(h);"BT"===V&&(i&&tt(d,r,a),d=d.reverse()),d.forEach((t=>{const c=r.get(t);if(!c)throw new Error(`Commit not found for key ${t}`);i&&(a=ht(c,V,a,W));const s=dt(c,a,i);if(e){const t=it(c),r=c.customType??c.type,e=j.get(c.branch)?.index??0;at(n,c,s,t,e,r),ct(o,c,s,a),st(o,c,s,a)}"TB"===V||"BT"===V?W.set(c.id,{x:s.x,y:s.posWithOffset}):W.set(c.id,{x:s.posWithOffset,y:s.y}),a="BT"===V&&i?a+N:a+N+Y,a>U&&(U=a)}))}),"drawCommits"),$t=(0,c.K2)(((t,r,e,n,o)=>{const a=("TB"===V||"BT"===V?e.xt.branch===a),"isOnBranchToGetCurve"),i=(0,c.K2)((e=>e.seq>t.seq&&e.seqi(t)&&s(t)))}),"shouldRerouteArrow"),lt=(0,c.K2)((function(t,r){let e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;const n=t+Math.abs(t-r)/2;if(e>5)return n;if(F.every((t=>Math.abs(t-n)>=10)))return F.push(n),n;const o=Math.abs(t-r);return lt(t,r-o/5,e+1)}),"findLane"),yt=(0,c.K2)(((t,r,e,n)=>{const o=W.get(r.id),a=W.get(e.id);if(void 0===o||void 0===a)throw new Error(`Commit positions not found for commits ${r.id} and ${e.id}`);const c=$t(r,e,o,a,n);let s,i="",d="",m=0,$=0,l=j.get(e.branch)?.index;if(e.type===h.MERGE&&r.id!==e.parents[0]&&(l=j.get(r.branch)?.index),c){i="A 10 10, 0, 0, 0,",d="A 10 10, 0, 0, 1,",m=10,$=10;const t=o.ya.x&&(i="A 20 20, 0, 0, 0,",d="A 20 20, 0, 0, 1,",m=20,$=20,s=e.type===h.MERGE&&r.id!==e.parents[0]?`M ${o.x} ${o.y} L ${o.x} ${a.y-m} ${d} ${o.x-$} ${a.y} L ${a.x} ${a.y}`:`M ${o.x} ${o.y} L ${a.x+m} ${o.y} ${i} ${a.x} ${o.y+$} L ${a.x} ${a.y}`),o.x===a.x&&(s=`M ${o.x} ${o.y} L ${a.x} ${a.y}`)):"BT"===V?(o.xa.x&&(i="A 20 20, 0, 0, 0,",d="A 20 20, 0, 0, 1,",m=20,$=20,s=e.type===h.MERGE&&r.id!==e.parents[0]?`M ${o.x} ${o.y} L ${o.x} ${a.y+m} ${i} ${o.x-$} ${a.y} L ${a.x} ${a.y}`:`M ${o.x} ${o.y} L ${a.x-m} ${o.y} ${i} ${a.x} ${o.y-$} L ${a.x} ${a.y}`),o.x===a.x&&(s=`M ${o.x} ${o.y} L ${a.x} ${a.y}`)):(o.ya.y&&(s=e.type===h.MERGE&&r.id!==e.parents[0]?`M ${o.x} ${o.y} L ${a.x-m} ${o.y} ${i} ${a.x} ${o.y-$} L ${a.x} ${a.y}`:`M ${o.x} ${o.y} L ${o.x} ${a.y+m} ${d} ${o.x+$} ${a.y} L ${a.x} ${a.y}`),o.y===a.y&&(s=`M ${o.x} ${o.y} L ${a.x} ${a.y}`));if(void 0===s)throw new Error("Line definition not found");t.append("path").attr("d",s).attr("class","arrow arrow"+l%8)}),"drawArrow"),gt=(0,c.K2)(((t,r)=>{const e=t.append("g").attr("class","commit-arrows");[...r.keys()].forEach((t=>{const n=r.get(t);n.parents&&n.parents.length>0&&n.parents.forEach((t=>{yt(e,r.get(t),n,r)}))}))}),"drawArrows"),pt=(0,c.K2)(((t,r)=>{const e=t.append("g");r.forEach(((t,r)=>{const n=r%8,o=j.get(t.name)?.pos;if(void 0===o)throw new Error(`Position not found for branch ${t.name}`);const a=e.append("line");a.attr("x1",0),a.attr("y1",o),a.attr("x2",U),a.attr("y2",o),a.attr("class","branch branch"+n),"TB"===V?(a.attr("y1",30),a.attr("x1",o),a.attr("y2",U),a.attr("x2",o)):"BT"===V&&(a.attr("y1",U),a.attr("x1",o),a.attr("y2",30),a.attr("x2",o)),F.push(o);const c=t.name,s=Q(c),i=e.insert("rect"),h=e.insert("g").attr("class","branchLabel").insert("g").attr("class","label branch-label"+n);h.node().appendChild(s);const d=s.getBBox();i.attr("class","branchLabelBkg label"+n).attr("rx",4).attr("ry",4).attr("x",-d.width-4-(!0===D?.rotateCommitLabel?30:0)).attr("y",-d.height/2+8).attr("width",d.width+18).attr("height",d.height+4),h.attr("transform","translate("+(-d.width-14-(!0===D?.rotateCommitLabel?30:0))+", "+(o-d.height/2-1)+")"),"TB"===V?(i.attr("x",o-d.width/2-10).attr("y",0),h.attr("transform","translate("+(o-d.width/2-5)+", 0)")):"BT"===V?(i.attr("x",o-d.width/2-10).attr("y",U),h.attr("transform","translate("+(o-d.width/2-5)+", "+U+")")):i.attr("transform","translate(-19, "+(o-d.height/2)+")")}))}),"drawBranches"),xt=(0,c.K2)((function(t,r,e,n,o){return j.set(t,{pos:r,index:e}),r+=50+(o?40:0)+("TB"===V||"BT"===V?n.width/2:0)}),"setBranchPosition");var ft={parser:H,db:R,renderer:{draw:(0,c.K2)((function(t,r,e,n){if(J(),c.Rm.debug("in gitgraph renderer",t+"\n","id:",r,e),!D)throw new Error("GitGraph config not found");const o=D.rotateCommitLabel??!1,s=n.db;_=s.getCommits();const h=s.getBranchesAsObjArray();V=s.getDirection();const d=(0,i.Ltv)(`[id="${r}"]`);let m=0;h.forEach(((t,r)=>{const e=Q(t.name),n=d.append("g"),a=n.insert("g").attr("class","branchLabel"),c=a.insert("g").attr("class","label branch-label");c.node()?.appendChild(e);const s=e.getBBox();m=xt(t.name,m,r,s,o),c.remove(),a.remove(),n.remove()})),mt(d,_,!1),D.showBranches&&pt(d,h),gt(d,_),mt(d,_,!0),a._K.insertTitle(d,"gitTitleText",D.titleTopMargin??0,s.getDiagramTitle()),(0,c.mj)(void 0,d,D.diagramPadding,D.useMaxWidth)}),"draw")},styles:(0,c.K2)((t=>`\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].map((r=>`\n .branch-label${r} { fill: ${t["gitBranchLabel"+r]}; }\n .commit${r} { stroke: ${t["git"+r]}; fill: ${t["git"+r]}; }\n .commit-highlight${r} { stroke: ${t["gitInv"+r]}; fill: ${t["gitInv"+r]}; }\n .label${r} { fill: ${t["git"+r]}; }\n .arrow${r} { stroke: ${t["git"+r]}; }\n `)).join("\n")}\n\n .branch {\n stroke-width: 1;\n stroke: ${t.lineColor};\n stroke-dasharray: 2;\n }\n .commit-label { font-size: ${t.commitLabelFontSize}; fill: ${t.commitLabelColor};}\n .commit-label-bkg { font-size: ${t.commitLabelFontSize}; fill: ${t.commitLabelBackground}; opacity: 0.5; }\n .tag-label { font-size: ${t.tagLabelFontSize}; fill: ${t.tagLabelColor};}\n .tag-label-bkg { fill: ${t.tagLabelBackground}; stroke: ${t.tagLabelBorder}; }\n .tag-hole { fill: ${t.textColor}; }\n\n .commit-merge {\n stroke: ${t.primaryColor};\n fill: ${t.primaryColor};\n }\n .commit-reverse {\n stroke: ${t.primaryColor};\n fill: ${t.primaryColor};\n stroke-width: 3;\n }\n .commit-highlight-outer {\n }\n .commit-highlight-inner {\n stroke: ${t.primaryColor};\n fill: ${t.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: ${t.textColor};\n }\n`),"getStyles")}},7799:(t,r,e)=>{function n(t,r){t.accDescr&&r.setAccDescription?.(t.accDescr),t.accTitle&&r.setAccTitle?.(t.accTitle),t.title&&r.setDiagramTitle?.(t.title)}e.d(r,{S:()=>n}),(0,e(3759).K2)(n,"populateCommonDb")},9837:(t,r,e)=>{e.d(r,{m:()=>o});var n=e(3759),o=class{constructor(t){this.init=t,this.records=this.init()}static#t=(()=>(0,n.K2)(this,"ImperativeState"))();reset(){this.records=this.init()}}}}]); -//# sourceMappingURL=358.7641aa7d.chunk.js.map \ No newline at end of file diff --git a/frontend/deployed/static/js/358.7641aa7d.chunk.js.map b/frontend/deployed/static/js/358.7641aa7d.chunk.js.map deleted file mode 100644 index 5859ee2..0000000 --- a/frontend/deployed/static/js/358.7641aa7d.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"static/js/358.7641aa7d.chunk.js","mappings":"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","sources":["../node_modules/mermaid/dist/chunks/mermaid.core/gitGraphDiagram-7IBYFJ6S.mjs","../node_modules/mermaid/dist/chunks/mermaid.core/chunk-4BMEZGHF.mjs","../node_modules/mermaid/dist/chunks/mermaid.core/chunk-XZIHB7SX.mjs"],"sourcesContent":["import {\n populateCommonDb\n} from \"./chunk-4BMEZGHF.mjs\";\nimport {\n ImperativeState\n} from \"./chunk-XZIHB7SX.mjs\";\nimport {\n cleanAndMerge,\n random,\n utils_default\n} from \"./chunk-O4NI6UNU.mjs\";\nimport {\n __name,\n clear,\n common_default,\n defaultConfig_default,\n getAccDescription,\n getAccTitle,\n getConfig,\n getConfig2,\n getDiagramTitle,\n log,\n setAccDescription,\n setAccTitle,\n setDiagramTitle,\n setupGraphViewbox2 as setupGraphViewbox\n} from \"./chunk-YTJNT7DU.mjs\";\n\n// src/diagrams/git/gitGraphParser.ts\nimport { parse } from \"@mermaid-js/parser\";\n\n// src/diagrams/git/gitGraphTypes.ts\nvar commitType = {\n NORMAL: 0,\n REVERSE: 1,\n HIGHLIGHT: 2,\n MERGE: 3,\n CHERRY_PICK: 4\n};\n\n// src/diagrams/git/gitGraphAst.ts\nvar DEFAULT_GITGRAPH_CONFIG = defaultConfig_default.gitGraph;\nvar getConfig3 = /* @__PURE__ */ __name(() => {\n const config = cleanAndMerge({\n ...DEFAULT_GITGRAPH_CONFIG,\n ...getConfig().gitGraph\n });\n return config;\n}, \"getConfig\");\nvar state = new ImperativeState(() => {\n const config = getConfig3();\n const mainBranchName = config.mainBranchName;\n const mainBranchOrder = config.mainBranchOrder;\n return {\n mainBranchName,\n commits: /* @__PURE__ */ new Map(),\n head: null,\n branchConfig: /* @__PURE__ */ new Map([[mainBranchName, { name: mainBranchName, order: mainBranchOrder }]]),\n branches: /* @__PURE__ */ new Map([[mainBranchName, null]]),\n currBranch: mainBranchName,\n direction: \"LR\",\n seq: 0,\n options: {}\n };\n});\nfunction getID() {\n return random({ length: 7 });\n}\n__name(getID, \"getID\");\nfunction uniqBy(list, fn) {\n const recordMap = /* @__PURE__ */ 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__name(uniqBy, \"uniqBy\");\nvar setDirection = /* @__PURE__ */ __name(function(dir2) {\n state.records.direction = dir2;\n}, \"setDirection\");\nvar setOptions = /* @__PURE__ */ __name(function(rawOptString) {\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) {\n log.error(\"error while parsing gitGraph options\", e.message);\n }\n}, \"setOptions\");\nvar getOptions = /* @__PURE__ */ __name(function() {\n return state.records.options;\n}, \"getOptions\");\nvar commit = /* @__PURE__ */ __name(function(commitDB) {\n let msg = commitDB.msg;\n let id = commitDB.id;\n const type = commitDB.type;\n let tags = commitDB.tags;\n log.info(\"commit\", msg, id, type, tags);\n log.debug(\"Entering commit:\", msg, id, type, tags);\n const config = getConfig3();\n id = common_default.sanitizeText(id, config);\n msg = common_default.sanitizeText(msg, config);\n tags = tags?.map((tag) => common_default.sanitizeText(tag, config));\n const newCommit = {\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 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}, \"commit\");\nvar branch = /* @__PURE__ */ __name(function(branchDB) {\n let name = branchDB.name;\n const order = branchDB.order;\n name = common_default.sanitizeText(name, getConfig3());\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 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}, \"branch\");\nvar merge = /* @__PURE__ */ __name((mergeDB) => {\n let otherBranch = mergeDB.branch;\n let customId = mergeDB.id;\n const overrideType = mergeDB.type;\n const customTags = mergeDB.tags;\n const config = getConfig3();\n otherBranch = common_default.sanitizeText(otherBranch, config);\n if (customId) {\n customId = common_default.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 ? state.records.commits.get(currentBranchCheck) : void 0;\n const otherCommit = otherBranchCheck ? state.records.commits.get(otherBranchCheck) : void 0;\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 = 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 === void 0 || !currentCommit) {\n const error = 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 = 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 === void 0 || !otherCommit) {\n const error = 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 = 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 = new Error(\n 'Incorrect usage of \"merge\". Commit with id:' + customId + \" 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 throw error;\n }\n const verifiedBranch = otherBranchCheck ? otherBranchCheck : \"\";\n const commit2 = {\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 };\n state.records.head = commit2;\n state.records.commits.set(commit2.id, commit2);\n state.records.branches.set(state.records.currBranch, commit2.id);\n log.debug(state.records.branches);\n log.debug(\"in mergeBranch\");\n}, \"merge\");\nvar cherryPick = /* @__PURE__ */ __name(function(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 = getConfig3();\n sourceId = common_default.sanitizeText(sourceId, config);\n targetId = common_default.sanitizeText(targetId, config);\n tags = tags?.map((tag) => common_default.sanitizeText(tag, config));\n parentCommitId = common_default.sanitizeText(parentCommitId, config);\n if (!sourceId || !state.records.commits.has(sourceId)) {\n const error = 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 const sourceCommit = state.records.commits.get(sourceId);\n if (sourceCommit === void 0 || !sourceCommit) {\n throw new Error('Incorrect usage of \"cherryPick\". Source commit id should exist and provided');\n }\n if (parentCommitId && !(Array.isArray(sourceCommit.parents) && sourceCommit.parents.includes(parentCommitId))) {\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 if (sourceCommitBranch === state.records.currBranch) {\n const error = 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 === void 0 || !currentCommitId) {\n const error = 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 currentCommit = state.records.commits.get(currentCommitId);\n if (currentCommit === void 0 || !currentCommit) {\n const error = 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 commit2 = {\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 ? tags.filter(Boolean) : [\n `cherry-pick:${sourceCommit.id}${sourceCommit.type === commitType.MERGE ? `|parent:${parentCommitId}` : \"\"}`\n ]\n };\n state.records.head = commit2;\n state.records.commits.set(commit2.id, commit2);\n state.records.branches.set(state.records.currBranch, commit2.id);\n log.debug(state.records.branches);\n log.debug(\"in cherryPick\");\n }\n}, \"cherryPick\");\nvar checkout = /* @__PURE__ */ __name(function(branch2) {\n branch2 = common_default.sanitizeText(branch2, getConfig3());\n if (!state.records.branches.has(branch2)) {\n const error = new Error(\n `Trying to checkout branch which is not yet created. (Help try using \"branch ${branch2}\")`\n );\n error.hash = {\n text: `checkout ${branch2}`,\n token: `checkout ${branch2}`,\n expected: [`branch ${branch2}`]\n };\n throw error;\n } else {\n state.records.currBranch = branch2;\n const id = state.records.branches.get(state.records.currBranch);\n if (id === void 0 || !id) {\n state.records.head = null;\n } else {\n state.records.head = state.records.commits.get(id) ?? null;\n }\n }\n}, \"checkout\");\nfunction upsert(arr, key, newVal) {\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__name(upsert, \"upsert\");\nfunction prettyPrintCommitHistory(commitArr) {\n const commit2 = commitArr.reduce((out, commit3) => {\n if (out.seq > commit3.seq) {\n return out;\n }\n return commit3;\n }, commitArr[0]);\n let line = \"\";\n commitArr.forEach(function(c) {\n if (c === commit2) {\n line += \"\t*\";\n } else {\n line += \"\t|\";\n }\n });\n const label = [line, commit2.id, commit2.seq];\n for (const branch2 in state.records.branches) {\n if (state.records.branches.get(branch2) === commit2.id) {\n label.push(branch2);\n }\n }\n log.debug(label.join(\" \"));\n if (commit2.parents && commit2.parents.length == 2 && commit2.parents[0] && commit2.parents[1]) {\n const newCommit = state.records.commits.get(commit2.parents[0]);\n upsert(commitArr, commit2, newCommit);\n if (commit2.parents[1]) {\n commitArr.push(state.records.commits.get(commit2.parents[1]));\n }\n } else if (commit2.parents.length == 0) {\n return;\n } else {\n if (commit2.parents[0]) {\n const newCommit = state.records.commits.get(commit2.parents[0]);\n upsert(commitArr, commit2, newCommit);\n }\n }\n commitArr = uniqBy(commitArr, (c) => c.id);\n prettyPrintCommitHistory(commitArr);\n}\n__name(prettyPrintCommitHistory, \"prettyPrintCommitHistory\");\nvar prettyPrint = /* @__PURE__ */ __name(function() {\n log.debug(state.records.commits);\n const node = getCommitsArray()[0];\n prettyPrintCommitHistory([node]);\n}, \"prettyPrint\");\nvar clear2 = /* @__PURE__ */ __name(function() {\n state.reset();\n clear();\n}, \"clear\");\nvar getBranchesAsObjArray = /* @__PURE__ */ __name(function() {\n const branchesArray = [...state.records.branchConfig.values()].map((branchConfig, i) => {\n if (branchConfig.order !== null && branchConfig.order !== void 0) {\n return branchConfig;\n }\n return {\n ...branchConfig,\n order: parseFloat(`0.${i}`)\n };\n }).sort((a, b) => (a.order ?? 0) - (b.order ?? 0)).map(({ name }) => ({ name }));\n return branchesArray;\n}, \"getBranchesAsObjArray\");\nvar getBranches = /* @__PURE__ */ __name(function() {\n return state.records.branches;\n}, \"getBranches\");\nvar getCommits = /* @__PURE__ */ __name(function() {\n return state.records.commits;\n}, \"getCommits\");\nvar getCommitsArray = /* @__PURE__ */ __name(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}, \"getCommitsArray\");\nvar getCurrentBranch = /* @__PURE__ */ __name(function() {\n return state.records.currBranch;\n}, \"getCurrentBranch\");\nvar getDirection = /* @__PURE__ */ __name(function() {\n return state.records.direction;\n}, \"getDirection\");\nvar getHead = /* @__PURE__ */ __name(function() {\n return state.records.head;\n}, \"getHead\");\nvar db = {\n commitType,\n getConfig: getConfig3,\n setDirection,\n setOptions,\n getOptions,\n commit,\n branch,\n merge,\n cherryPick,\n checkout,\n //reset,\n prettyPrint,\n clear: clear2,\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\n// src/diagrams/git/gitGraphParser.ts\nvar populate = /* @__PURE__ */ __name((ast, db2) => {\n populateCommonDb(ast, db2);\n if (ast.dir) {\n db2.setDirection(ast.dir);\n }\n for (const statement of ast.statements) {\n parseStatement(statement, db2);\n }\n}, \"populate\");\nvar parseStatement = /* @__PURE__ */ __name((statement, db2) => {\n const parsers = {\n Commit: /* @__PURE__ */ __name((stmt) => db2.commit(parseCommit(stmt)), \"Commit\"),\n Branch: /* @__PURE__ */ __name((stmt) => db2.branch(parseBranch(stmt)), \"Branch\"),\n Merge: /* @__PURE__ */ __name((stmt) => db2.merge(parseMerge(stmt)), \"Merge\"),\n Checkout: /* @__PURE__ */ __name((stmt) => db2.checkout(parseCheckout(stmt)), \"Checkout\"),\n CherryPicking: /* @__PURE__ */ __name((stmt) => db2.cherryPick(parseCherryPicking(stmt)), \"CherryPicking\")\n };\n const parser2 = parsers[statement.$type];\n if (parser2) {\n parser2(statement);\n } else {\n log.error(`Unknown statement type: ${statement.$type}`);\n }\n}, \"parseStatement\");\nvar parseCommit = /* @__PURE__ */ __name((commit2) => {\n const commitDB = {\n id: commit2.id,\n msg: commit2.message ?? \"\",\n type: commit2.type !== void 0 ? commitType[commit2.type] : commitType.NORMAL,\n tags: commit2.tags ?? void 0\n };\n return commitDB;\n}, \"parseCommit\");\nvar parseBranch = /* @__PURE__ */ __name((branch2) => {\n const branchDB = {\n name: branch2.name,\n order: branch2.order ?? 0\n };\n return branchDB;\n}, \"parseBranch\");\nvar parseMerge = /* @__PURE__ */ __name((merge2) => {\n const mergeDB = {\n branch: merge2.branch,\n id: merge2.id ?? \"\",\n type: merge2.type !== void 0 ? commitType[merge2.type] : void 0,\n tags: merge2.tags ?? void 0\n };\n return mergeDB;\n}, \"parseMerge\");\nvar parseCheckout = /* @__PURE__ */ __name((checkout2) => {\n const branch2 = checkout2.branch;\n return branch2;\n}, \"parseCheckout\");\nvar parseCherryPicking = /* @__PURE__ */ __name((cherryPicking) => {\n const cherryPickDB = {\n id: cherryPicking.id,\n targetId: \"\",\n tags: cherryPicking.tags?.length === 0 ? void 0 : cherryPicking.tags,\n parent: cherryPicking.parent\n };\n return cherryPickDB;\n}, \"parseCherryPicking\");\nvar parser = {\n parse: /* @__PURE__ */ __name(async (input) => {\n const ast = await parse(\"gitGraph\", input);\n log.debug(ast);\n populate(ast, db);\n }, \"parse\")\n};\nif (void 0) {\n const { it, expect, describe } = void 0;\n const mockDB = {\n 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 describe(\"GitGraph Parser\", () => {\n it(\"should parse a commit statement\", () => {\n const commit2 = {\n $type: \"Commit\",\n id: \"1\",\n message: \"test\",\n tags: [\"tag1\", \"tag2\"],\n type: \"NORMAL\"\n };\n parseStatement(commit2, 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 branch2 = {\n $type: \"Branch\",\n name: \"newBranch\",\n order: 1\n };\n parseStatement(branch2, mockDB);\n expect(mockDB.branch).toHaveBeenCalledWith({ name: \"newBranch\", order: 1 });\n });\n it(\"should parse a checkout statement\", () => {\n const checkout2 = {\n $type: \"Checkout\",\n branch: \"newBranch\"\n };\n parseStatement(checkout2, mockDB);\n expect(mockDB.checkout).toHaveBeenCalledWith(\"newBranch\");\n });\n it(\"should parse a merge statement\", () => {\n const merge2 = {\n $type: \"Merge\",\n branch: \"newBranch\",\n id: \"1\",\n tags: [\"tag1\", \"tag2\"],\n type: \"NORMAL\"\n };\n parseStatement(merge2, 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 cherryPick2 = {\n $type: \"CherryPicking\",\n id: \"1\",\n tags: [\"tag1\", \"tag2\"],\n parent: \"2\"\n };\n parseStatement(cherryPick2, mockDB);\n expect(mockDB.cherryPick).toHaveBeenCalledWith({\n id: \"1\",\n targetId: \"\",\n parent: \"2\",\n tags: [\"tag1\", \"tag2\"]\n });\n });\n it(\"should parse a langium generated gitGraph ast\", () => {\n const dummy = {\n $type: \"GitGraph\",\n statements: []\n };\n const gitGraphAst = {\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 populate(gitGraphAst, mockDB);\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\n// src/diagrams/git/gitGraphRenderer.ts\nimport { select } from \"d3\";\nvar DEFAULT_CONFIG = getConfig2();\nvar DEFAULT_GITGRAPH_CONFIG2 = DEFAULT_CONFIG?.gitGraph;\nvar LAYOUT_OFFSET = 10;\nvar COMMIT_STEP = 40;\nvar PX = 4;\nvar PY = 2;\nvar THEME_COLOR_LIMIT = 8;\nvar branchPos = /* @__PURE__ */ new Map();\nvar commitPos = /* @__PURE__ */ new Map();\nvar defaultPos = 30;\nvar allCommitsDict = /* @__PURE__ */ new Map();\nvar lanes = [];\nvar maxPos = 0;\nvar dir = \"LR\";\nvar clear3 = /* @__PURE__ */ __name(() => {\n branchPos.clear();\n commitPos.clear();\n allCommitsDict.clear();\n maxPos = 0;\n lanes = [];\n dir = \"LR\";\n}, \"clear\");\nvar drawText = /* @__PURE__ */ __name((txt) => {\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 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 return svgLabel;\n}, \"drawText\");\nvar findClosestParent = /* @__PURE__ */ __name((parents) => {\n let closestParent;\n let comparisonFunc;\n let targetPosition;\n if (dir === \"BT\") {\n comparisonFunc = /* @__PURE__ */ __name((a, b) => a <= b, \"comparisonFunc\");\n targetPosition = Infinity;\n } else {\n comparisonFunc = /* @__PURE__ */ __name((a, b) => a >= b, \"comparisonFunc\");\n targetPosition = 0;\n }\n parents.forEach((parent) => {\n const parentPosition = dir === \"TB\" || dir == \"BT\" ? commitPos.get(parent)?.y : commitPos.get(parent)?.x;\n if (parentPosition !== void 0 && comparisonFunc(parentPosition, targetPosition)) {\n closestParent = parent;\n targetPosition = parentPosition;\n }\n });\n return closestParent;\n}, \"findClosestParent\");\nvar findClosestParentBT = /* @__PURE__ */ __name((parents) => {\n let closestParent = \"\";\n let maxPosition = Infinity;\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 || void 0;\n}, \"findClosestParentBT\");\nvar setParallelBTPos = /* @__PURE__ */ __name((sortedKeys, commits, defaultPos2) => {\n let curPos = defaultPos2;\n let maxPosition = defaultPos2;\n const roots = [];\n sortedKeys.forEach((key) => {\n const commit2 = commits.get(key);\n if (!commit2) {\n throw new Error(`Commit not found for key ${key}`);\n }\n if (commit2.parents.length) {\n curPos = calculateCommitPosition(commit2);\n maxPosition = Math.max(curPos, maxPosition);\n } else {\n roots.push(commit2);\n }\n setCommitPosition(commit2, curPos);\n });\n curPos = maxPosition;\n roots.forEach((commit2) => {\n setRootPosition(commit2, curPos, defaultPos2);\n });\n sortedKeys.forEach((key) => {\n const commit2 = commits.get(key);\n if (commit2?.parents.length) {\n const closestParent = findClosestParentBT(commit2.parents);\n curPos = commitPos.get(closestParent).y - COMMIT_STEP;\n if (curPos <= maxPosition) {\n maxPosition = curPos;\n }\n const x = branchPos.get(commit2.branch).pos;\n const y = curPos - LAYOUT_OFFSET;\n commitPos.set(commit2.id, { x, y });\n }\n });\n}, \"setParallelBTPos\");\nvar findClosestParentPos = /* @__PURE__ */ __name((commit2) => {\n const closestParent = findClosestParent(commit2.parents.filter((p) => p !== null));\n if (!closestParent) {\n throw new Error(`Closest parent not found for commit ${commit2.id}`);\n }\n const closestParentPos = commitPos.get(closestParent)?.y;\n if (closestParentPos === void 0) {\n throw new Error(`Closest parent position not found for commit ${commit2.id}`);\n }\n return closestParentPos;\n}, \"findClosestParentPos\");\nvar calculateCommitPosition = /* @__PURE__ */ __name((commit2) => {\n const closestParentPos = findClosestParentPos(commit2);\n return closestParentPos + COMMIT_STEP;\n}, \"calculateCommitPosition\");\nvar setCommitPosition = /* @__PURE__ */ __name((commit2, curPos) => {\n const branch2 = branchPos.get(commit2.branch);\n if (!branch2) {\n throw new Error(`Branch not found for commit ${commit2.id}`);\n }\n const x = branch2.pos;\n const y = curPos + LAYOUT_OFFSET;\n commitPos.set(commit2.id, { x, y });\n return { x, y };\n}, \"setCommitPosition\");\nvar setRootPosition = /* @__PURE__ */ __name((commit2, curPos, defaultPos2) => {\n const branch2 = branchPos.get(commit2.branch);\n if (!branch2) {\n throw new Error(`Branch not found for commit ${commit2.id}`);\n }\n const y = curPos + defaultPos2;\n const x = branch2.pos;\n commitPos.set(commit2.id, { x, y });\n}, \"setRootPosition\");\nvar drawCommitBullet = /* @__PURE__ */ __name((gBullets, commit2, commitPosition, typeClass, branchIndex, commitSymbolType) => {\n if (commitSymbolType === commitType.HIGHLIGHT) {\n gBullets.append(\"rect\").attr(\"x\", commitPosition.x - 10).attr(\"y\", commitPosition.y - 10).attr(\"width\", 20).attr(\"height\", 20).attr(\n \"class\",\n `commit ${commit2.id} commit-highlight${branchIndex % THEME_COLOR_LIMIT} ${typeClass}-outer`\n );\n gBullets.append(\"rect\").attr(\"x\", commitPosition.x - 6).attr(\"y\", commitPosition.y - 6).attr(\"width\", 12).attr(\"height\", 12).attr(\n \"class\",\n `commit ${commit2.id} commit${branchIndex % THEME_COLOR_LIMIT} ${typeClass}-inner`\n );\n } else if (commitSymbolType === commitType.CHERRY_PICK) {\n gBullets.append(\"circle\").attr(\"cx\", commitPosition.x).attr(\"cy\", commitPosition.y).attr(\"r\", 10).attr(\"class\", `commit ${commit2.id} ${typeClass}`);\n 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}`);\n 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}`);\n 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}`);\n 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}`);\n } else {\n const circle = gBullets.append(\"circle\");\n circle.attr(\"cx\", commitPosition.x);\n circle.attr(\"cy\", commitPosition.y);\n circle.attr(\"r\", commit2.type === commitType.MERGE ? 9 : 10);\n circle.attr(\"class\", `commit ${commit2.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} ${commit2.id} commit${branchIndex % THEME_COLOR_LIMIT}`\n );\n }\n if (commitSymbolType === commitType.REVERSE) {\n const cross = gBullets.append(\"path\");\n cross.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 ).attr(\"class\", `commit ${typeClass} ${commit2.id} commit${branchIndex % THEME_COLOR_LIMIT}`);\n }\n }\n}, \"drawCommitBullet\");\nvar drawCommitLabel = /* @__PURE__ */ __name((gLabels, commit2, commitPosition, pos) => {\n if (commit2.type !== commitType.CHERRY_PICK && (commit2.customId && commit2.type === commitType.MERGE || commit2.type !== commitType.MERGE) && DEFAULT_GITGRAPH_CONFIG2?.showCommitLabel) {\n const wrapper = gLabels.append(\"g\");\n const labelBkg = wrapper.insert(\"rect\").attr(\"class\", \"commit-label-bkg\");\n const text = wrapper.append(\"text\").attr(\"x\", pos).attr(\"y\", commitPosition.y + 25).attr(\"class\", \"commit-label\").text(commit2.id);\n const bbox = text.node()?.getBBox();\n if (bbox) {\n 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);\n if (dir === \"TB\" || dir === \"BT\") {\n labelBkg.attr(\"x\", commitPosition.x - (bbox.width + 4 * PX + 5)).attr(\"y\", commitPosition.y - 12);\n text.attr(\"x\", commitPosition.x - (bbox.width + 4 * PX)).attr(\"y\", commitPosition.y + bbox.height - 12);\n } else {\n text.attr(\"x\", commitPosition.posWithOffset - bbox.width / 2);\n }\n if (DEFAULT_GITGRAPH_CONFIG2.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(\" + r_x + \", \" + r_y + \") rotate(-45, \" + pos + \", \" + commitPosition.y + \")\"\n );\n }\n }\n }\n }\n}, \"drawCommitLabel\");\nvar drawCommitTags = /* @__PURE__ */ __name((gLabels, commit2, commitPosition, pos) => {\n if (commit2.tags.length > 0) {\n let yOffset = 0;\n let maxTagBboxWidth = 0;\n let maxTagBboxHeight = 0;\n const tagElements = [];\n for (const tagValue of commit2.tags.reverse()) {\n const rect = gLabels.insert(\"polygon\");\n const hole = gLabels.append(\"circle\");\n const tag = gLabels.append(\"text\").attr(\"y\", commitPosition.y - 16 - yOffset).attr(\"class\", \"tag-label\").text(tagValue);\n const tagBbox = tag.node()?.getBBox();\n if (!tagBbox) {\n throw new Error(\"Tag bbox not found\");\n }\n maxTagBboxWidth = Math.max(maxTagBboxWidth, tagBbox.width);\n maxTagBboxHeight = Math.max(maxTagBboxHeight, tagBbox.height);\n tag.attr(\"x\", commitPosition.posWithOffset - tagBbox.width / 2);\n tagElements.push({\n tag,\n hole,\n rect,\n yOffset\n });\n yOffset += 20;\n }\n for (const { tag, hole, rect, yOffset: yOffset2 } of tagElements) {\n const h2 = maxTagBboxHeight / 2;\n const ly = commitPosition.y - 19.2 - yOffset2;\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 hole.attr(\"cy\", ly).attr(\"cx\", pos - maxTagBboxWidth / 2 + PX / 2).attr(\"r\", 1.5).attr(\"class\", \"tag-hole\");\n if (dir === \"TB\" || dir === \"BT\") {\n const yOrigin = pos + yOffset2;\n rect.attr(\"class\", \"tag-label-bkg\").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 ).attr(\"transform\", \"translate(12,12) rotate(45, \" + commitPosition.x + \",\" + pos + \")\");\n hole.attr(\"cx\", commitPosition.x + PX / 2).attr(\"cy\", yOrigin).attr(\"transform\", \"translate(12,12) rotate(45, \" + commitPosition.x + \",\" + pos + \")\");\n tag.attr(\"x\", commitPosition.x + 5).attr(\"y\", yOrigin + 3).attr(\"transform\", \"translate(14,14) rotate(45, \" + commitPosition.x + \",\" + pos + \")\");\n }\n }\n }\n}, \"drawCommitTags\");\nvar getCommitClassType = /* @__PURE__ */ __name((commit2) => {\n const commitSymbolType = commit2.customType ?? commit2.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}, \"getCommitClassType\");\nvar calculatePosition = /* @__PURE__ */ __name((commit2, dir2, pos, commitPos2) => {\n const defaultCommitPosition = { x: 0, y: 0 };\n if (commit2.parents.length > 0) {\n const closestParent = findClosestParent(commit2.parents);\n if (closestParent) {\n const parentPosition = commitPos2.get(closestParent) ?? defaultCommitPosition;\n if (dir2 === \"TB\") {\n return parentPosition.y + COMMIT_STEP;\n } else if (dir2 === \"BT\") {\n const currentPosition = commitPos2.get(commit2.id) ?? defaultCommitPosition;\n return currentPosition.y - COMMIT_STEP;\n } else {\n return parentPosition.x + COMMIT_STEP;\n }\n }\n } else {\n if (dir2 === \"TB\") {\n return defaultPos;\n } else if (dir2 === \"BT\") {\n const currentPosition = commitPos2.get(commit2.id) ?? defaultCommitPosition;\n return currentPosition.y - COMMIT_STEP;\n } else {\n return 0;\n }\n }\n return 0;\n}, \"calculatePosition\");\nvar getCommitPosition = /* @__PURE__ */ __name((commit2, pos, isParallelCommits) => {\n const posWithOffset = dir === \"BT\" && isParallelCommits ? pos : pos + LAYOUT_OFFSET;\n const y = dir === \"TB\" || dir === \"BT\" ? posWithOffset : branchPos.get(commit2.branch)?.pos;\n const x = dir === \"TB\" || dir === \"BT\" ? branchPos.get(commit2.branch)?.pos : posWithOffset;\n if (x === void 0 || y === void 0) {\n throw new Error(`Position were undefined for commit ${commit2.id}`);\n }\n return { x, y, posWithOffset };\n}, \"getCommitPosition\");\nvar drawCommits = /* @__PURE__ */ __name((svg, commits, modifyGraph) => {\n if (!DEFAULT_GITGRAPH_CONFIG2) {\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_CONFIG2?.parallelCommits ?? false;\n const sortKeys = /* @__PURE__ */ __name((a, b) => {\n const seqA = commits.get(a)?.seq;\n const seqB = commits.get(b)?.seq;\n return seqA !== void 0 && seqB !== void 0 ? seqA - seqB : 0;\n }, \"sortKeys\");\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 sortedKeys.forEach((key) => {\n const commit2 = commits.get(key);\n if (!commit2) {\n throw new Error(`Commit not found for key ${key}`);\n }\n if (isParallelCommits) {\n pos = calculatePosition(commit2, dir, pos, commitPos);\n }\n const commitPosition = getCommitPosition(commit2, pos, isParallelCommits);\n if (modifyGraph) {\n const typeClass = getCommitClassType(commit2);\n const commitSymbolType = commit2.customType ?? commit2.type;\n const branchIndex = branchPos.get(commit2.branch)?.index ?? 0;\n drawCommitBullet(gBullets, commit2, commitPosition, typeClass, branchIndex, commitSymbolType);\n drawCommitLabel(gLabels, commit2, commitPosition, pos);\n drawCommitTags(gLabels, commit2, commitPosition, pos);\n }\n if (dir === \"TB\" || dir === \"BT\") {\n commitPos.set(commit2.id, { x: commitPosition.x, y: commitPosition.posWithOffset });\n } else {\n commitPos.set(commit2.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}, \"drawCommits\");\nvar shouldRerouteArrow = /* @__PURE__ */ __name((commitA, commitB, p1, p2, allCommits) => {\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 = /* @__PURE__ */ __name((x) => x.branch === branchToGetCurve, \"isOnBranchToGetCurve\");\n const isBetweenCommits = /* @__PURE__ */ __name((x) => x.seq > commitA.seq && x.seq < commitB.seq, \"isBetweenCommits\");\n return [...allCommits.values()].some((commitX) => {\n return isBetweenCommits(commitX) && isOnBranchToGetCurve(commitX);\n });\n}, \"shouldRerouteArrow\");\nvar findLane = /* @__PURE__ */ __name((y1, y2, depth = 0) => {\n const candidate = y1 + Math.abs(y1 - y2) / 2;\n if (depth > 5) {\n return candidate;\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}, \"findLane\");\nvar drawArrow = /* @__PURE__ */ __name((svg, commitA, commitB, allCommits) => {\n const p1 = commitPos.get(commitA.id);\n const p2 = commitPos.get(commitB.id);\n if (p1 === void 0 || p2 === void 0) {\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 let arc = \"\";\n let arc2 = \"\";\n let radius = 0;\n let offset = 0;\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 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 const lineY = p1.y < p2.y ? findLane(p1.y, p2.y) : findLane(p2.y, p1.y);\n const lineX = p1.x < p2.x ? findLane(p1.x, p2.x) : findLane(p2.x, p1.x);\n if (dir === \"TB\") {\n if (p1.x < p2.x) {\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 } else {\n colorClassNum = branchPos.get(commitA.branch)?.index;\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 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 colorClassNum = branchPos.get(commitA.branch)?.index;\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 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}`;\n } else {\n colorClassNum = branchPos.get(commitA.branch)?.index;\n 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}`;\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 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} ${p2.y} L ${p2.x} ${p2.y}`;\n } else {\n lineDef = `M ${p1.x} ${p1.y} L ${p2.x - radius} ${p1.y} ${arc2} ${p2.x} ${p1.y + offset} 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 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} ${p2.y} L ${p2.x} ${p2.y}`;\n } else {\n lineDef = `M ${p1.x} ${p1.y} L ${p2.x + radius} ${p1.y} ${arc} ${p2.x} ${p1.y + offset} 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} ${p2.y} L ${p2.x} ${p2.y}`;\n } else {\n lineDef = `M ${p1.x} ${p1.y} L ${p2.x - radius} ${p1.y} ${arc} ${p2.x} ${p1.y - offset} 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 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} ${p2.y} L ${p2.x} ${p2.y}`;\n } else {\n lineDef = `M ${p1.x} ${p1.y} L ${p2.x - radius} ${p1.y} ${arc} ${p2.x} ${p1.y - offset} 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 {\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} ${p1.y + offset} L ${p2.x} ${p2.y}`;\n } else {\n lineDef = `M ${p1.x} ${p1.y} L ${p1.x} ${p2.y - radius} ${arc} ${p1.x + offset} ${p2.y} 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} ${p1.y - offset} L ${p2.x} ${p2.y}`;\n } else {\n lineDef = `M ${p1.x} ${p1.y} L ${p1.x} ${p2.y + radius} ${arc2} ${p1.x + offset} ${p2.y} L ${p2.x} ${p2.y}`;\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 === void 0) {\n throw new Error(\"Line definition not found\");\n }\n svg.append(\"path\").attr(\"d\", lineDef).attr(\"class\", \"arrow arrow\" + colorClassNum % THEME_COLOR_LIMIT);\n}, \"drawArrow\");\nvar drawArrows = /* @__PURE__ */ __name((svg, commits) => {\n const gArrows = svg.append(\"g\").attr(\"class\", \"commit-arrows\");\n [...commits.keys()].forEach((key) => {\n const commit2 = commits.get(key);\n if (commit2.parents && commit2.parents.length > 0) {\n commit2.parents.forEach((parent) => {\n drawArrow(gArrows, commits.get(parent), commit2, commits);\n });\n }\n });\n}, \"drawArrows\");\nvar drawBranches = /* @__PURE__ */ __name((svg, branches) => {\n const g = svg.append(\"g\");\n branches.forEach((branch2, index) => {\n const adjustIndexForTheme = index % THEME_COLOR_LIMIT;\n const pos = branchPos.get(branch2.name)?.pos;\n if (pos === void 0) {\n throw new Error(`Position not found for branch ${branch2.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 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 const name = branch2.name;\n const labelElement = drawText(name);\n const bkg = g.insert(\"rect\");\n const branchLabel = g.insert(\"g\").attr(\"class\", \"branchLabel\");\n const label = branchLabel.insert(\"g\").attr(\"class\", \"label branch-label\" + adjustIndexForTheme);\n label.node().appendChild(labelElement);\n const bbox = labelElement.getBBox();\n 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);\n label.attr(\n \"transform\",\n \"translate(\" + (-bbox.width - 14 - (DEFAULT_GITGRAPH_CONFIG2?.rotateCommitLabel === true ? 30 : 0)) + \", \" + (pos - bbox.height / 2 - 1) + \")\"\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}, \"drawBranches\");\nvar setBranchPosition = /* @__PURE__ */ __name(function(name, pos, index, bbox, rotateCommitLabel) {\n branchPos.set(name, { pos, index });\n pos += 50 + (rotateCommitLabel ? 40 : 0) + (dir === \"TB\" || dir === \"BT\" ? bbox.width / 2 : 0);\n return pos;\n}, \"setBranchPosition\");\nvar draw = /* @__PURE__ */ __name(function(txt, id, ver, diagObj) {\n clear3();\n log.debug(\"in gitgraph renderer\", txt + \"\\n\", \"id:\", id, ver);\n if (!DEFAULT_GITGRAPH_CONFIG2) {\n throw new Error(\"GitGraph config not found\");\n }\n const rotateCommitLabel = DEFAULT_GITGRAPH_CONFIG2.rotateCommitLabel ?? false;\n const db2 = diagObj.db;\n allCommitsDict = db2.getCommits();\n const branches = db2.getBranchesAsObjArray();\n dir = db2.getDirection();\n const diagram2 = select(`[id=\"${id}\"]`);\n let pos = 0;\n branches.forEach((branch2, index) => {\n const labelElement = drawText(branch2.name);\n const g = diagram2.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 pos = setBranchPosition(branch2.name, pos, index, bbox, rotateCommitLabel);\n label.remove();\n branchLabel.remove();\n g.remove();\n });\n drawCommits(diagram2, allCommitsDict, false);\n if (DEFAULT_GITGRAPH_CONFIG2.showBranches) {\n drawBranches(diagram2, branches);\n }\n drawArrows(diagram2, allCommitsDict);\n drawCommits(diagram2, allCommitsDict, true);\n utils_default.insertTitle(\n diagram2,\n \"gitTitleText\",\n DEFAULT_GITGRAPH_CONFIG2.titleTopMargin ?? 0,\n db2.getDiagramTitle()\n );\n setupGraphViewbox(\n void 0,\n diagram2,\n DEFAULT_GITGRAPH_CONFIG2.diagramPadding,\n DEFAULT_GITGRAPH_CONFIG2.useMaxWidth\n );\n}, \"draw\");\nvar gitGraphRenderer_default = {\n draw\n};\nif (void 0) {\n const { it, expect, describe } = void 0;\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 describe(\"branchPosition\", () => {\n const bbox = {\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: /* @__PURE__ */ __name(() => \"\", \"toJSON\")\n };\n it(\"should setBranchPositions LR with two branches\", () => {\n dir = \"LR\";\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, index: 1 });\n });\n it(\"should setBranchPositions TB with two branches\", () => {\n dir = \"TB\";\n bbox.width = 34.9921875;\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 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, index: 1 });\n });\n });\n describe(\"commitPosition\", () => {\n const commits = /* @__PURE__ */ 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 describe(\"TB\", () => {\n pos = 30;\n dir = \"TB\";\n const expectedCommitPositionTB = /* @__PURE__ */ 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((commit2, key) => {\n it(`should give the correct position for commit ${key}`, () => {\n const position = getCommitPosition(commit2, pos, false);\n expect(position).toEqual(expectedCommitPositionTB.get(key));\n pos += 50;\n });\n });\n });\n describe(\"LR\", () => {\n let pos2 = 30;\n dir = \"LR\";\n const expectedCommitPositionLR = /* @__PURE__ */ 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((commit2, key) => {\n it(`should give the correct position for commit ${key}`, () => {\n const position = getCommitPosition(commit2, pos2, false);\n expect(position).toEqual(expectedCommitPositionLR.get(key));\n pos2 += 50;\n });\n });\n });\n describe(\"getCommitClassType\", () => {\n const expectedCommitClassType = /* @__PURE__ */ 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((commit2, key) => {\n it(`should give the correct class type for commit ${key}`, () => {\n const classType = getCommitClassType(commit2);\n expect(classType).toBe(expectedCommitClassType.get(key));\n });\n });\n });\n });\n describe(\"building BT parallel commit diagram\", () => {\n const commits = /* @__PURE__ */ 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 = /* @__PURE__ */ 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 const expectedCommitPositionAfterParallel = /* @__PURE__ */ 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 const expectedCommitCurrentPosition = /* @__PURE__ */ 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_CONFIG2.parallelCommits = true;\n commits.forEach((commit2, key) => {\n if (commit2.parents.length > 0) {\n curPos = calculateCommitPosition(commit2);\n }\n const position = setCommitPosition(commit2, curPos);\n expect(position).toEqual(expectedCommitPosition.get(key));\n expect(curPos).toEqual(expectedCommitCurrentPosition.get(key));\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((commit2) => {\n const position = commitPos.get(commit2);\n expect(position).toEqual(expectedCommitPositionAfterParallel.get(commit2));\n });\n });\n });\n DEFAULT_GITGRAPH_CONFIG2.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 expect(closestParent).toBe(\"parent3\");\n commitPos.clear();\n });\n}\n\n// src/diagrams/git/styles.js\nvar getStyles = /* @__PURE__ */ __name((options) => `\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].map(\n (i) => `\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).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: ${options.commitLabelBackground}; 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`, \"getStyles\");\nvar styles_default = getStyles;\n\n// src/diagrams/git/gitGraphDiagram.ts\nvar diagram = {\n parser,\n db,\n renderer: gitGraphRenderer_default,\n styles: styles_default\n};\nexport {\n diagram\n};\n","import {\n __name\n} from \"./chunk-YTJNT7DU.mjs\";\n\n// src/diagrams/common/populateCommonDb.ts\nfunction populateCommonDb(ast, db) {\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__name(populateCommonDb, \"populateCommonDb\");\n\nexport {\n populateCommonDb\n};\n","import {\n __name\n} from \"./chunk-YTJNT7DU.mjs\";\n\n// src/utils/imperativeState.ts\nvar ImperativeState = class {\n /**\n * @param init - Function that creates the default state.\n */\n constructor(init) {\n this.init = init;\n this.records = this.init();\n }\n static {\n __name(this, \"ImperativeState\");\n }\n reset() {\n this.records = this.init();\n }\n};\n\nexport {\n ImperativeState\n};\n"],"names":["commitType","NORMAL","REVERSE","HIGHLIGHT","MERGE","CHERRY_PICK","DEFAULT_GITGRAPH_CONFIG","defaultConfig_default","gitGraph","getConfig3","__name","cleanAndMerge","getConfig","state","ImperativeState","config","mainBranchName","mainBranchOrder","commits","Map","head","branchConfig","name","order","branches","currBranch","direction","seq","options","getID","random","length","uniqBy","list","fn","recordMap","Object","create","reduce","out","item","key","push","setDirection","dir2","records","setOptions","rawOptString","log","debug","trim","JSON","parse","e","error","message","getOptions","commit","commitDB","msg","id","type","tags","info","common_default","sanitizeText","map","tag","newCommit","parents","branch","set","branchDB","has","Error","checkout","merge","mergeDB","otherBranch","customId","overrideType","customTags","currentBranchCheck","get","otherBranchCheck","currentCommit","otherCommit","hash","text","token","expected","join","verifiedBranch","commit2","customType","cherryPick","cherryPickDB","sourceId","targetId","parentCommitId","parent","sourceCommit","Array","isArray","includes","sourceCommitBranch","currentCommitId","filter","Boolean","branch2","upsert","arr","newVal","index","indexOf","splice","prettyPrintCommitHistory","commitArr","commit3","line","forEach","c","label","prettyPrint","getCommitsArray","clear2","reset","clear","getBranchesAsObjArray","values","i","parseFloat","sort","a","b","_ref","getBranches","getCommits","o","db","getCurrentBranch","getDirection","getHead","setAccTitle","getAccTitle","getAccDescription","setAccDescription","setDiagramTitle","getDiagramTitle","populate","ast","db2","populateCommonDb","dir","statement","statements","parseStatement","parser2","Commit","stmt","parseCommit","Branch","parseBranch","Merge","parseMerge","Checkout","parseCheckout","CherryPicking","parseCherryPicking","$type","merge2","checkout2","cherryPicking","parser","async","input","DEFAULT_CONFIG","getConfig2","DEFAULT_GITGRAPH_CONFIG2","LAYOUT_OFFSET","COMMIT_STEP","branchPos","commitPos","allCommitsDict","lanes","maxPos","clear3","drawText","txt","svgLabel","document","createElementNS","split","row","tspan","setAttributeNS","setAttribute","textContent","appendChild","findClosestParent","closestParent","comparisonFunc","targetPosition","Infinity","parentPosition","y","x","findClosestParentBT","maxPosition","setParallelBTPos","sortedKeys","defaultPos2","curPos","roots","calculateCommitPosition","Math","max","setCommitPosition","setRootPosition","pos","findClosestParentPos","p","closestParentPos","drawCommitBullet","gBullets","commitPosition","typeClass","branchIndex","commitSymbolType","append","attr","circle","circle2","drawCommitLabel","gLabels","showCommitLabel","wrapper","labelBkg","insert","bbox","node","getBBox","posWithOffset","width","height","rotateCommitLabel","r_x","r_y","drawCommitTags","yOffset","maxTagBboxWidth","maxTagBboxHeight","tagElements","tagValue","reverse","rect","hole","tagBbox","yOffset2","h2","ly","PX","yOrigin","getCommitClassType","calculatePosition","commitPos2","defaultCommitPosition","getCommitPosition","isParallelCommits","drawCommits","svg","modifyGraph","keys","parallelCommits","sortKeys","seqA","seqB","shouldRerouteArrow","commitA","commitB","p1","p2","allCommits","branchToGetCurve","isOnBranchToGetCurve","isBetweenCommits","some","commitX","findLane","y1","y2","depth","arguments","undefined","candidate","abs","every","lane","diff","drawArrow","arrowNeedsRerouting","lineDef","arc","arc2","radius","offset","colorClassNum","lineY","lineX","drawArrows","gArrows","drawBranches","g","adjustIndexForTheme","labelElement","bkg","setBranchPosition","diagram","renderer","draw","ver","diagObj","diagram2","select","branchLabel","remove","showBranches","utils_default","insertTitle","titleTopMargin","setupGraphViewbox","diagramPadding","useMaxWidth","styles","lineColor","commitLabelFontSize","commitLabelColor","commitLabelBackground","tagLabelFontSize","tagLabelColor","tagLabelBackground","tagLabelBorder","textColor","primaryColor","accDescr","accTitle","title","constructor","init","this"],"sourceRoot":""} \ No newline at end of file diff --git a/frontend/deployed/static/js/370.721ed12b.chunk.js b/frontend/deployed/static/js/370.721ed12b.chunk.js deleted file mode 100644 index bac1864..0000000 --- a/frontend/deployed/static/js/370.721ed12b.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunkbackstory=self.webpackChunkbackstory||[]).push([[370],{370:(t,n,e)=>{e.d(n,{diagram:()=>at});var i=e(3759),r=e(700);function s(t,n){return tn?1:t>=n?0:NaN}var o=function(t){var n;return 1===t.length&&(n=t,t=function(t,e){return s(n(t),e)}),{left:function(n,e,i,r){for(null==i&&(i=0),null==r&&(r=n.length);i>>1;t(n[s],e)<0?i=s+1:r=s}return i},right:function(n,e,i,r){for(null==i&&(i=0),null==r&&(r=n.length);i>>1;t(n[s],e)>0?r=s:i=s+1}return i}}}(s);o.right,o.left;var l=Array.prototype;l.slice,l.map,Math.sqrt(50),Math.sqrt(10),Math.sqrt(2);function c(t,n){var e,i,r=t.length,s=-1;if(null==n){for(;++s=e)for(i=e;++si&&(i=e)}else for(;++s=e)for(i=e;++si&&(i=e);return i}function a(t,n){var e,i,r=t.length,s=-1;if(null==n){for(;++s=e)for(i=e;++se&&(i=e)}else for(;++s=e)for(i=e;++se&&(i=e);return i}function h(t,n){var e,i=t.length,r=-1,s=0;if(null==n)for(;++r[w(t,e,n),t])));for(const[e,s]of i.entries()){s.index=e;let{source:t,target:n}=s;"object"!==typeof t&&(t=s.source=v(r,t)),"object"!==typeof n&&(n=s.target=v(r,n)),t.sourceLinks.push(s),n.targetLinks.push(s)}if(null!=e)for(const{sourceLinks:s,targetLinks:o}of n)s.sort(e),o.sort(e)}(f),function(t){let{nodes:n}=t;for(const e of n)e.value=void 0===e.fixedValue?Math.max(h(e.sourceLinks,_),h(e.targetLinks,_)):e.fixedValue}(f),function(t){let{nodes:n}=t;const e=n.length;let i=new Set(n),r=new Set,s=0;for(;i.size;){for(const t of i){t.depth=s;for(const{target:n}of t.sourceLinks)r.add(n)}if(++s>e)throw new Error("circular link");i=r,r=new Set}}(f),function(t){let{nodes:n}=t;const e=n.length;let i=new Set(n),r=new Set,s=0;for(;i.size;){for(const t of i){t.height=s;for(const{source:n}of t.targetLinks)r.add(n)}if(++s>e)throw new Error("circular link");i=r,r=new Set}}(f),function(e){const f=function(t){let{nodes:e}=t;const r=c(e,(t=>t.depth))+1,o=(s-i-l)/(r-1),a=new Array(r);for(const n of e){const t=Math.max(0,Math.min(r-1,Math.floor(L.call(null,n,r))));n.layer=t,n.x0=i+t*o,n.x1=n.x0+l,a[t]?a[t].push(n):a[t]=[n]}if(n)for(const i of a)i.sort(n);return a}(e);t=Math.min(u,(o-r)/(c(f,(t=>t.length))-1)),function(n){const e=a(n,(n=>(o-r-(n.length-1)*t)/h(n,_)));for(const i of n){let n=r;for(const r of i){r.y0=n,r.y1=n+r.value*e,n=r.y1+t;for(const t of r.sourceLinks)t.width=t.value*e}n=(o-n+t)/(i.length+1);for(let t=0;t0))continue;let r=(n/i-t.y0)*e;t.y0+=r,t.y1+=r,P(t)}void 0===n&&s.sort(d),T(s,i)}}function I(t,e,i){for(let r=t.length-2;r>=0;--r){const s=t[r];for(const t of s){let n=0,i=0;for(const{target:e,value:s}of t.sourceLinks){let r=s*(e.layer-t.layer);n+=$(t,e)*r,i+=r}if(!(i>0))continue;let r=(n/i-t.y0)*e;t.y0+=r,t.y1+=r,P(t)}void 0===n&&s.sort(d),T(s,i)}}function T(n,e){const i=n.length>>1,s=n[i];D(n,s.y0-t,i-1,e),N(n,s.y1+t,i+1,e),D(n,o,n.length-1,e),N(n,r,0,e)}function N(n,e,i,r){for(;i1e-6&&(s.y0+=o,s.y1+=o),e=s.y1+t}}function D(n,e,i,r){for(;i>=0;--i){const s=n[i],o=(s.y1-e)*r;o>1e-6&&(s.y0-=o,s.y1-=o),e=s.y0-t}}function P(t){let{sourceLinks:n,targetLinks:i}=t;if(void 0===e){for(const{source:{sourceLinks:t}}of i)t.sort(g);for(const{target:{targetLinks:t}}of n)t.sort(p)}}function C(t){if(void 0===e)for(const{sourceLinks:n,targetLinks:e}of t)n.sort(g),e.sort(p)}function O(n,e){let i=n.y0-(n.sourceLinks.length-1)*t/2;for(const{target:r,width:s}of n.sourceLinks){if(r===e)break;i+=s+t}for(const{source:t,width:r}of e.targetLinks){if(t===n)break;i-=r}return i}function $(n,e){let i=e.y0-(e.targetLinks.length-1)*t/2;for(const{source:r,width:s}of e.targetLinks){if(r===n)break;i+=s+t}for(const{target:t,width:r}of n.sourceLinks){if(t===e)break;i-=r}return i}return K.update=function(t){return b(t),t},K.nodeId=function(t){return arguments.length?(w="function"===typeof t?t:y(t),K):w},K.nodeAlign=function(t){return arguments.length?(L="function"===typeof t?t:y(t),K):L},K.nodeSort=function(t){return arguments.length?(n=t,K):n},K.nodeWidth=function(t){return arguments.length?(l=+t,K):l},K.nodePadding=function(n){return arguments.length?(u=t=+n,K):u},K.nodes=function(t){return arguments.length?(S="function"===typeof t?t:y(t),K):S},K.links=function(t){return arguments.length?(E="function"===typeof t?t:y(t),K):E},K.linkSort=function(t){return arguments.length?(e=t,K):e},K.size=function(t){return arguments.length?(i=r=0,s=+t[0],o=+t[1],K):[s-i,o-r]},K.extent=function(t){return arguments.length?(i=+t[0][0],s=+t[1][0],r=+t[0][1],o=+t[1][1],K):[[i,r],[s,o]]},K.iterations=function(t){return arguments.length?(A=+t,K):A},K}var L=Math.PI,S=2*L,E=1e-6,A=S-E;function K(){this._x0=this._y0=this._x1=this._y1=null,this._=""}function M(){return new K}K.prototype=M.prototype={constructor:K,moveTo:function(t,n){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+n)},closePath:function(){null!==this._x1&&(this._x1=this._x0,this._y1=this._y0,this._+="Z")},lineTo:function(t,n){this._+="L"+(this._x1=+t)+","+(this._y1=+n)},quadraticCurveTo:function(t,n,e,i){this._+="Q"+ +t+","+ +n+","+(this._x1=+e)+","+(this._y1=+i)},bezierCurveTo:function(t,n,e,i,r,s){this._+="C"+ +t+","+ +n+","+ +e+","+ +i+","+(this._x1=+r)+","+(this._y1=+s)},arcTo:function(t,n,e,i,r){t=+t,n=+n,e=+e,i=+i,r=+r;var s=this._x1,o=this._y1,l=e-t,c=i-n,a=s-t,h=o-n,u=a*a+h*h;if(r<0)throw new Error("negative radius: "+r);if(null===this._x1)this._+="M"+(this._x1=t)+","+(this._y1=n);else if(u>E)if(Math.abs(h*l-c*a)>E&&r){var f=e-s,y=i-o,p=l*l+c*c,g=f*f+y*y,d=Math.sqrt(p),_=Math.sqrt(u),k=r*Math.tan((L-Math.acos((p+u-g)/(2*d*_)))/2),x=k/_,m=k/d;Math.abs(x-1)>E&&(this._+="L"+(t+x*a)+","+(n+x*h)),this._+="A"+r+","+r+",0,0,"+ +(h*f>a*y)+","+(this._x1=t+m*l)+","+(this._y1=n+m*c)}else this._+="L"+(this._x1=t)+","+(this._y1=n);else;},arc:function(t,n,e,i,r,s){t=+t,n=+n,s=!!s;var o=(e=+e)*Math.cos(i),l=e*Math.sin(i),c=t+o,a=n+l,h=1^s,u=s?i-r:r-i;if(e<0)throw new Error("negative radius: "+e);null===this._x1?this._+="M"+c+","+a:(Math.abs(this._x1-c)>E||Math.abs(this._y1-a)>E)&&(this._+="L"+c+","+a),e&&(u<0&&(u=u%S+S),u>A?this._+="A"+e+","+e+",0,1,"+h+","+(t-o)+","+(n-l)+"A"+e+","+e+",0,1,"+h+","+(this._x1=c)+","+(this._y1=a):u>E&&(this._+="A"+e+","+e+",0,"+ +(u>=L)+","+h+","+(this._x1=t+e*Math.cos(r))+","+(this._y1=n+e*Math.sin(r))))},rect:function(t,n,e,i){this._+="M"+(this._x0=this._x1=+t)+","+(this._y0=this._y1=+n)+"h"+ +e+"v"+ +i+"h"+-e+"Z"},toString:function(){return this._}};const I=M;var T=Array.prototype.slice;function N(t){return function(){return t}}function D(t){return t[0]}function P(t){return t[1]}function C(t){return t.source}function O(t){return t.target}function $(t){var n=C,e=O,i=D,r=P,s=null;function o(){var o,l=T.call(arguments),c=n.apply(this,l),a=e.apply(this,l);if(s||(s=o=I()),t(s,+i.apply(this,(l[0]=c,l)),+r.apply(this,l),+i.apply(this,(l[0]=a,l)),+r.apply(this,l)),o)return s=null,o+""||null}return o.source=function(t){return arguments.length?(n=t,o):n},o.target=function(t){return arguments.length?(e=t,o):e},o.x=function(t){return arguments.length?(i="function"===typeof t?t:N(+t),o):i},o.y=function(t){return arguments.length?(r="function"===typeof t?t:N(+t),o):r},o.context=function(t){return arguments.length?(s=null==t?null:t,o):s},o}function j(t,n,e,i,r){t.moveTo(n,e),t.bezierCurveTo(n=(n+i)/2,e,n,r,i,r)}function z(t){return[t.source.x1,t.y0]}function U(t){return[t.target.x0,t.y1]}function F(){return $(j).source(z).target(U)}var q=function(){var t=(0,i.K2)((function(t,n,e,i){for(e=e||{},i=t.length;i--;e[t[i]]=n);return e}),"o"),n=[1,9],e=[1,10],r=[1,5,10,12],s={trace:(0,i.K2)((function(){}),"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:(0,i.K2)((function(t,n,e,i,r,s,o){var l=s.length-1;switch(r){case 7:const t=i.findOrCreateNode(s[l-4].trim().replaceAll('""','"')),n=i.findOrCreateNode(s[l-2].trim().replaceAll('""','"')),e=parseFloat(s[l].trim());i.addLink(t,n,e);break;case 8:case 9:case 11:this.$=s[l];break;case 10:this.$=s[l-1]}}),"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},{5:[1,3]},{6:4,8:5,15:6,16:7,17:8,18:n,20:e},{1:[2,6],7:11,10:[1,12]},t(e,[2,4],{9:13,5:[1,14]}),{12:[1,15]},t(r,[2,8]),t(r,[2,9]),{19:[1,16]},t(r,[2,11]),{1:[2,1]},{1:[2,5]},t(e,[2,2]),{6:17,8:5,15:6,16:7,17:8,18:n,20:e},{15:18,16:7,17:8,18:n,20:e},{18:[1,19]},t(e,[2,3]),{12:[1,20]},t(r,[2,10]),{15:21,16:7,17:8,18:n,20:e},t([1,5,10],[2,7])],defaultActions:{11:[2,1],12:[2,5]},parseError:(0,i.K2)((function(t,n){if(!n.recoverable){var e=new Error(t);throw e.hash=n,e}this.trace(t)}),"parseError"),parse:(0,i.K2)((function(t){var n=this,e=[0],r=[],s=[null],o=[],l=this.table,c="",a=0,h=0,u=0,f=o.slice.call(arguments,1),y=Object.create(this.lexer),p={yy:{}};for(var g in this.yy)Object.prototype.hasOwnProperty.call(this.yy,g)&&(p.yy[g]=this.yy[g]);y.setInput(t,p.yy),p.yy.lexer=y,p.yy.parser=this,"undefined"==typeof y.yylloc&&(y.yylloc={});var d=y.yylloc;o.push(d);var _=y.options&&y.options.ranges;function k(){var t;return"number"!==typeof(t=r.pop()||y.lex()||1)&&(t instanceof Array&&(t=(r=t).pop()),t=n.symbols_[t]||t),t}"function"===typeof p.yy.parseError?this.parseError=p.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError,(0,i.K2)((function(t){e.length=e.length-2*t,s.length=s.length-t,o.length=o.length-t}),"popStack"),(0,i.K2)(k,"lex");for(var x,m,v,b,w,L,S,E,A,K={};;){if(v=e[e.length-1],this.defaultActions[v]?b=this.defaultActions[v]:(null!==x&&"undefined"!=typeof x||(x=k()),b=l[v]&&l[v][x]),"undefined"===typeof b||!b.length||!b[0]){var M="";for(L in A=[],l[v])this.terminals_[L]&&L>2&&A.push("'"+this.terminals_[L]+"'");M=y.showPosition?"Parse error on line "+(a+1)+":\n"+y.showPosition()+"\nExpecting "+A.join(", ")+", got '"+(this.terminals_[x]||x)+"'":"Parse error on line "+(a+1)+": Unexpected "+(1==x?"end of input":"'"+(this.terminals_[x]||x)+"'"),this.parseError(M,{text:y.match,token:this.terminals_[x]||x,line:y.yylineno,loc:d,expected:A})}if(b[0]instanceof Array&&b.length>1)throw new Error("Parse Error: multiple actions possible at state: "+v+", token: "+x);switch(b[0]){case 1:e.push(x),s.push(y.yytext),o.push(y.yylloc),e.push(b[1]),x=null,m?(x=m,m=null):(h=y.yyleng,c=y.yytext,a=y.yylineno,d=y.yylloc,u>0&&u--);break;case 2:if(S=this.productions_[b[1]][1],K.$=s[s.length-S],K._$={first_line:o[o.length-(S||1)].first_line,last_line:o[o.length-1].last_line,first_column:o[o.length-(S||1)].first_column,last_column:o[o.length-1].last_column},_&&(K._$.range=[o[o.length-(S||1)].range[0],o[o.length-1].range[1]]),"undefined"!==typeof(w=this.performAction.apply(K,[c,h,a,p.yy,b[1],s,o].concat(f))))return w;S&&(e=e.slice(0,-1*S*2),s=s.slice(0,-1*S),o=o.slice(0,-1*S)),e.push(this.productions_[b[1]][0]),s.push(K.$),o.push(K._$),E=l[e[e.length-2]][e[e.length-1]],e.push(E);break;case 3:return!0}}return!0}),"parse")},o=function(){return{EOF:1,parseError:(0,i.K2)((function(t,n){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,n)}),"parseError"),setInput:(0,i.K2)((function(t,n){return this.yy=n||this.yy||{},this._input=t,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:(0,i.K2)((function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t}),"input"),unput:(0,i.K2)((function(t){var n=t.length,e=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-n),this.offset-=n;var i=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),e.length-1&&(this.yylineno-=e.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:e?(e.length===i.length?this.yylloc.first_column:0)+i[i.length-e.length].length-e[0].length:this.yylloc.first_column-n},this.options.ranges&&(this.yylloc.range=[r[0],r[0]+this.yyleng-n]),this.yyleng=this.yytext.length,this}),"unput"),more:(0,i.K2)((function(){return this._more=!0,this}),"more"),reject:(0,i.K2)((function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):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})}),"reject"),less:(0,i.K2)((function(t){this.unput(this.match.slice(t))}),"less"),pastInput:(0,i.K2)((function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")}),"pastInput"),upcomingInput:(0,i.K2)((function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")}),"upcomingInput"),showPosition:(0,i.K2)((function(){var t=this.pastInput(),n=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+n+"^"}),"showPosition"),test_match:(0,i.K2)((function(t,n){var e,i,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))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,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(t[0].length),this.matched+=t[0],e=this.performAction.call(this,this.yy,this,n,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),e)return e;if(this._backtrack){for(var s in r)this[s]=r[s];return!1}return!1}),"test_match"),next:(0,i.K2)((function(){if(this.done)return this.EOF;var t,n,e,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var r=this._currentRules(),s=0;sn[0].length)){if(n=e,i=s,this.options.backtrack_lexer){if(!1!==(t=this.test_match(e,r[s])))return t;if(this._backtrack){n=!1;continue}return!1}if(!this.options.flex)break}return n?!1!==(t=this.test_match(n,r[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})}),"next"),lex:(0,i.K2)((function(){var t=this.next();return t||this.lex()}),"lex"),begin:(0,i.K2)((function(t){this.conditionStack.push(t)}),"begin"),popState:(0,i.K2)((function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]}),"popState"),_currentRules:(0,i.K2)((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:(0,i.K2)((function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"}),"topState"),pushState:(0,i.K2)((function(t){this.begin(t)}),"pushState"),stateStackSize:(0,i.K2)((function(){return this.conditionStack.length}),"stateStackSize"),options:{"case-insensitive":!0},performAction:(0,i.K2)((function(t,n,e,i){switch(e){case 0:return this.pushState("csv"),4;case 1:return 10;case 2:return 5;case 3:return 12;case 4:return this.pushState("escaped_text"),18;case 5:return 20;case 6:return this.popState("escaped_text"),18;case 7:return 19}}),"anonymous"),rules:[/^(?:sankey-beta\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:[1,2,3,4,5,6,7],inclusive:!1},escaped_text:{rules:[6,7],inclusive:!1},INITIAL:{rules:[0,1,2,3,4,5,6,7],inclusive:!0}}}}();function l(){this.yy={}}return s.lexer=o,(0,i.K2)(l,"Parser"),l.prototype=s,s.Parser=l,new l}();q.parser=q;var W=q,G=[],V=[],X=new Map,Y=(0,i.K2)((()=>{G=[],V=[],X=new Map,(0,i.IU)()}),"clear"),Q=class{constructor(t,n){let e=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;this.source=t,this.target=n,this.value=e}static#t=(()=>(0,i.K2)(this,"SankeyLink"))()},R=(0,i.K2)(((t,n,e)=>{G.push(new Q(t,n,e))}),"addLink"),B=class{constructor(t){this.ID=t}static#t=(()=>(0,i.K2)(this,"SankeyNode"))()},Z=(0,i.K2)((t=>{t=i.Y2.sanitizeText(t,(0,i.D7)());let n=X.get(t);return void 0===n&&(n=new B(t),X.set(t,n),V.push(n)),n}),"findOrCreateNode"),H=(0,i.K2)((()=>V),"getNodes"),J=(0,i.K2)((()=>G),"getLinks"),tt=(0,i.K2)((()=>({nodes:V.map((t=>({id:t.ID}))),links:G.map((t=>({source:t.source.ID,target:t.target.ID,value:t.value})))})),"getGraph"),nt={nodesMap:X,getConfig:(0,i.K2)((()=>(0,i.D7)().sankey),"getConfig"),getNodes:H,getLinks:J,getGraph:tt,addLink:R,findOrCreateNode:Z,getAccTitle:i.iN,setAccTitle:i.SV,getAccDescription:i.m7,setAccDescription:i.EI,getDiagramTitle:i.ab,setDiagramTitle:i.ke,clear:Y},et=class t{static#t=(()=>(0,i.K2)(this,"Uid"))();static#n=(()=>this.count=0)();static next(n){return new t(n+ ++t.count)}constructor(t){this.id=t,this.href=`#${t}`}toString(){return"url("+this.href+")"}},it={left:function(t){return t.depth},right:function(t,n){return n-1-t.height},center:function(t){return t.targetLinks.length?t.depth:t.sourceLinks.length?a(t.sourceLinks,u)-1:0},justify:f},rt=(0,i.K2)((function(t,n,e,s){const{securityLevel:o,sankey:l}=(0,i.D7)(),c=i.ME.sankey;let a;"sandbox"===o&&(a=(0,r.Ltv)("#i"+n));const h="sandbox"===o?(0,r.Ltv)(a.nodes()[0].contentDocument.body):(0,r.Ltv)("body"),u="sandbox"===o?h.select(`[id="${n}"]`):(0,r.Ltv)(`[id="${n}"]`),f=l?.width??c.width,y=l?.height??c.width,p=l?.useMaxWidth??c.useMaxWidth,g=l?.nodeAlignment??c.nodeAlignment,d=l?.prefix??c.prefix,_=l?.suffix??c.suffix,k=l?.showValues??c.showValues,x=s.db.getGraph(),m=it[g];w().nodeId((t=>t.id)).nodeWidth(10).nodePadding(10+(k?15:0)).nodeAlign(m).extent([[0,0],[f,y]])(x);const v=(0,r.UMr)(r.zt);u.append("g").attr("class","nodes").selectAll(".node").data(x.nodes).join("g").attr("class","node").attr("id",(t=>(t.uid=et.next("node-")).id)).attr("transform",(function(t){return"translate("+t.x0+","+t.y0+")"})).attr("x",(t=>t.x0)).attr("y",(t=>t.y0)).append("rect").attr("height",(t=>t.y1-t.y0)).attr("width",(t=>t.x1-t.x0)).attr("fill",(t=>v(t.id)));const b=(0,i.K2)((t=>{let{id:n,value:e}=t;return k?`${n}\n${d}${Math.round(100*e)/100}${_}`:n}),"getText");u.append("g").attr("class","node-labels").attr("font-size",14).selectAll("text").data(x.nodes).join("text").attr("x",(t=>t.x0(t.y1+t.y0)/2)).attr("dy",(k?"0":"0.35")+"em").attr("text-anchor",(t=>t.x0(t.uid=et.next("linearGradient-")).id)).attr("gradientUnits","userSpaceOnUse").attr("x1",(t=>t.source.x1)).attr("x2",(t=>t.target.x0));t.append("stop").attr("offset","0%").attr("stop-color",(t=>v(t.source.id))),t.append("stop").attr("offset","100%").attr("stop-color",(t=>v(t.target.id)))}let E;switch(S){case"gradient":E=(0,i.K2)((t=>t.uid),"coloring");break;case"source":E=(0,i.K2)((t=>v(t.source.id)),"coloring");break;case"target":E=(0,i.K2)((t=>v(t.target.id)),"coloring");break;default:E=S}L.append("path").attr("d",F()).attr("stroke",E).attr("stroke-width",(t=>Math.max(1,t.width))),(0,i.ot)(void 0,u,0,p)}),"draw"),st={draw:rt},ot=(0,i.K2)((t=>t.replaceAll(/^[^\S\n\r]+|[^\S\n\r]+$/g,"").replaceAll(/([\n\r])+/g,"\n").trim()),"prepareTextForParsing"),lt=(0,i.K2)((t=>`.label {\n font-family: ${t.fontFamily};\n }`),"getStyles"),ct=W.parse.bind(W);W.parse=t=>ct(ot(t));var at={styles:lt,parser:W,db:nt,renderer:st}}}]); -//# sourceMappingURL=370.721ed12b.chunk.js.map \ No newline at end of file diff --git a/frontend/deployed/static/js/370.721ed12b.chunk.js.map b/frontend/deployed/static/js/370.721ed12b.chunk.js.map deleted file mode 100644 index eda155c..0000000 --- a/frontend/deployed/static/js/370.721ed12b.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"static/js/370.721ed12b.chunk.js","mappings":"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","sources":["../node_modules/d3-array/src/ascending.js","../node_modules/d3-array/src/bisect.js","../node_modules/d3-array/src/bisector.js","../node_modules/d3-array/src/array.js","../node_modules/d3-array/src/ticks.js","../node_modules/d3-array/src/max.js","../node_modules/d3-array/src/min.js","../node_modules/d3-array/src/sum.js","../node_modules/d3-sankey/src/align.js","../node_modules/d3-sankey/src/constant.js","../node_modules/d3-sankey/src/sankey.js","../node_modules/d3-path/src/path.js","../node_modules/d3-shape/src/array.js","../node_modules/d3-shape/src/constant.js","../node_modules/d3-shape/src/point.js","../node_modules/d3-shape/src/link/index.js","../node_modules/d3-sankey/src/sankeyLinkHorizontal.js","../node_modules/mermaid/dist/chunks/mermaid.core/sankeyDiagram-QLVOVGJD.mjs"],"sourcesContent":["export default function(a, b) {\n return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","import ascending from \"./ascending\";\nimport bisector from \"./bisector\";\n\nvar ascendingBisect = bisector(ascending);\nexport var bisectRight = ascendingBisect.right;\nexport var bisectLeft = ascendingBisect.left;\nexport default bisectRight;\n","import ascending from \"./ascending\";\n\nexport default function(compare) {\n if (compare.length === 1) compare = ascendingComparator(compare);\n return {\n left: function(a, x, lo, hi) {\n if (lo == null) lo = 0;\n if (hi == null) hi = a.length;\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (compare(a[mid], x) < 0) lo = mid + 1;\n else hi = mid;\n }\n return lo;\n },\n right: function(a, x, lo, hi) {\n if (lo == null) lo = 0;\n if (hi == null) hi = a.length;\n while (lo < hi) {\n var mid = lo + hi >>> 1;\n if (compare(a[mid], x) > 0) hi = mid;\n else lo = mid + 1;\n }\n return lo;\n }\n };\n}\n\nfunction ascendingComparator(f) {\n return function(d, x) {\n return ascending(f(d), x);\n };\n}\n","var array = Array.prototype;\n\nexport var slice = array.slice;\nexport var map = array.map;\n","var e10 = Math.sqrt(50),\n e5 = Math.sqrt(10),\n e2 = Math.sqrt(2);\n\nexport default function(start, stop, count) {\n var reverse,\n i = -1,\n n,\n ticks,\n step;\n\n stop = +stop, start = +start, count = +count;\n if (start === stop && count > 0) return [start];\n if (reverse = stop < start) n = start, start = stop, stop = n;\n if ((step = tickIncrement(start, stop, count)) === 0 || !isFinite(step)) return [];\n\n if (step > 0) {\n start = Math.ceil(start / step);\n stop = Math.floor(stop / step);\n ticks = new Array(n = Math.ceil(stop - start + 1));\n while (++i < n) ticks[i] = (start + i) * step;\n } else {\n start = Math.floor(start * step);\n stop = Math.ceil(stop * step);\n ticks = new Array(n = Math.ceil(start - stop + 1));\n while (++i < n) ticks[i] = (start - i) / step;\n }\n\n if (reverse) ticks.reverse();\n\n return ticks;\n}\n\nexport function tickIncrement(start, stop, count) {\n var step = (stop - start) / Math.max(0, count),\n power = Math.floor(Math.log(step) / Math.LN10),\n error = step / Math.pow(10, power);\n return power >= 0\n ? (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1) * Math.pow(10, power)\n : -Math.pow(10, -power) / (error >= e10 ? 10 : error >= e5 ? 5 : error >= e2 ? 2 : 1);\n}\n\nexport function tickStep(start, stop, count) {\n var step0 = Math.abs(stop - start) / Math.max(0, count),\n step1 = Math.pow(10, Math.floor(Math.log(step0) / Math.LN10)),\n error = step0 / step1;\n if (error >= e10) step1 *= 10;\n else if (error >= e5) step1 *= 5;\n else if (error >= e2) step1 *= 2;\n return stop < start ? -step1 : step1;\n}\n","export default function(values, valueof) {\n var n = values.length,\n i = -1,\n value,\n max;\n\n if (valueof == null) {\n while (++i < n) { // Find the first comparable value.\n if ((value = values[i]) != null && value >= value) {\n max = value;\n while (++i < n) { // Compare the remaining values.\n if ((value = values[i]) != null && value > max) {\n max = value;\n }\n }\n }\n }\n }\n\n else {\n while (++i < n) { // Find the first comparable value.\n if ((value = valueof(values[i], i, values)) != null && value >= value) {\n max = value;\n while (++i < n) { // Compare the remaining values.\n if ((value = valueof(values[i], i, values)) != null && value > max) {\n max = value;\n }\n }\n }\n }\n }\n\n return max;\n}\n","export default function(values, valueof) {\n var n = values.length,\n i = -1,\n value,\n min;\n\n if (valueof == null) {\n while (++i < n) { // Find the first comparable value.\n if ((value = values[i]) != null && value >= value) {\n min = value;\n while (++i < n) { // Compare the remaining values.\n if ((value = values[i]) != null && min > value) {\n min = value;\n }\n }\n }\n }\n }\n\n else {\n while (++i < n) { // Find the first comparable value.\n if ((value = valueof(values[i], i, values)) != null && value >= value) {\n min = value;\n while (++i < n) { // Compare the remaining values.\n if ((value = valueof(values[i], i, values)) != null && min > value) {\n min = value;\n }\n }\n }\n }\n }\n\n return min;\n}\n","export default function(values, valueof) {\n var n = values.length,\n i = -1,\n value,\n sum = 0;\n\n if (valueof == null) {\n while (++i < n) {\n if (value = +values[i]) sum += value; // Note: zero and null are equivalent.\n }\n }\n\n else {\n while (++i < n) {\n if (value = +valueof(values[i], i, values)) sum += value;\n }\n }\n\n return sum;\n}\n","import {min} from \"d3-array\";\n\nfunction targetDepth(d) {\n return d.target.depth;\n}\n\nexport function left(node) {\n return node.depth;\n}\n\nexport function right(node, n) {\n return n - 1 - node.height;\n}\n\nexport function justify(node, n) {\n return node.sourceLinks.length ? node.depth : n - 1;\n}\n\nexport function center(node) {\n return node.targetLinks.length ? node.depth\n : node.sourceLinks.length ? min(node.sourceLinks, targetDepth) - 1\n : 0;\n}\n","export default function constant(x) {\n return function() {\n return x;\n };\n}\n","import {max, min, sum} from \"d3-array\";\nimport {justify} from \"./align.js\";\nimport constant from \"./constant.js\";\n\nfunction ascendingSourceBreadth(a, b) {\n return ascendingBreadth(a.source, b.source) || a.index - b.index;\n}\n\nfunction ascendingTargetBreadth(a, b) {\n return ascendingBreadth(a.target, b.target) || a.index - b.index;\n}\n\nfunction ascendingBreadth(a, b) {\n return a.y0 - b.y0;\n}\n\nfunction value(d) {\n return d.value;\n}\n\nfunction defaultId(d) {\n return d.index;\n}\n\nfunction defaultNodes(graph) {\n return graph.nodes;\n}\n\nfunction defaultLinks(graph) {\n return graph.links;\n}\n\nfunction find(nodeById, id) {\n const node = nodeById.get(id);\n if (!node) throw new Error(\"missing: \" + id);\n return node;\n}\n\nfunction computeLinkBreadths({nodes}) {\n for (const node of nodes) {\n let y0 = node.y0;\n let y1 = y0;\n for (const link of node.sourceLinks) {\n link.y0 = y0 + link.width / 2;\n y0 += link.width;\n }\n for (const link of node.targetLinks) {\n link.y1 = y1 + link.width / 2;\n y1 += link.width;\n }\n }\n}\n\nexport default function Sankey() {\n let x0 = 0, y0 = 0, x1 = 1, y1 = 1; // extent\n let dx = 24; // nodeWidth\n let dy = 8, py; // nodePadding\n let id = defaultId;\n let align = justify;\n let sort;\n let linkSort;\n let nodes = defaultNodes;\n let links = defaultLinks;\n let iterations = 6;\n\n function sankey() {\n const graph = {nodes: nodes.apply(null, arguments), links: links.apply(null, arguments)};\n computeNodeLinks(graph);\n computeNodeValues(graph);\n computeNodeDepths(graph);\n computeNodeHeights(graph);\n computeNodeBreadths(graph);\n computeLinkBreadths(graph);\n return graph;\n }\n\n sankey.update = function(graph) {\n computeLinkBreadths(graph);\n return graph;\n };\n\n sankey.nodeId = function(_) {\n return arguments.length ? (id = typeof _ === \"function\" ? _ : constant(_), sankey) : id;\n };\n\n sankey.nodeAlign = function(_) {\n return arguments.length ? (align = typeof _ === \"function\" ? _ : constant(_), sankey) : align;\n };\n\n sankey.nodeSort = function(_) {\n return arguments.length ? (sort = _, sankey) : sort;\n };\n\n sankey.nodeWidth = function(_) {\n return arguments.length ? (dx = +_, sankey) : dx;\n };\n\n sankey.nodePadding = function(_) {\n return arguments.length ? (dy = py = +_, sankey) : dy;\n };\n\n sankey.nodes = function(_) {\n return arguments.length ? (nodes = typeof _ === \"function\" ? _ : constant(_), sankey) : nodes;\n };\n\n sankey.links = function(_) {\n return arguments.length ? (links = typeof _ === \"function\" ? _ : constant(_), sankey) : links;\n };\n\n sankey.linkSort = function(_) {\n return arguments.length ? (linkSort = _, sankey) : linkSort;\n };\n\n sankey.size = function(_) {\n return arguments.length ? (x0 = y0 = 0, x1 = +_[0], y1 = +_[1], sankey) : [x1 - x0, y1 - y0];\n };\n\n sankey.extent = function(_) {\n return arguments.length ? (x0 = +_[0][0], x1 = +_[1][0], y0 = +_[0][1], y1 = +_[1][1], sankey) : [[x0, y0], [x1, y1]];\n };\n\n sankey.iterations = function(_) {\n return arguments.length ? (iterations = +_, sankey) : iterations;\n };\n\n function computeNodeLinks({nodes, links}) {\n for (const [i, node] of nodes.entries()) {\n node.index = i;\n node.sourceLinks = [];\n node.targetLinks = [];\n }\n const nodeById = new Map(nodes.map((d, i) => [id(d, i, nodes), d]));\n for (const [i, link] of links.entries()) {\n link.index = i;\n let {source, target} = link;\n if (typeof source !== \"object\") source = link.source = find(nodeById, source);\n if (typeof target !== \"object\") target = link.target = find(nodeById, target);\n source.sourceLinks.push(link);\n target.targetLinks.push(link);\n }\n if (linkSort != null) {\n for (const {sourceLinks, targetLinks} of nodes) {\n sourceLinks.sort(linkSort);\n targetLinks.sort(linkSort);\n }\n }\n }\n\n function computeNodeValues({nodes}) {\n for (const node of nodes) {\n node.value = node.fixedValue === undefined\n ? Math.max(sum(node.sourceLinks, value), sum(node.targetLinks, value))\n : node.fixedValue;\n }\n }\n\n function computeNodeDepths({nodes}) {\n const n = nodes.length;\n let current = new Set(nodes);\n let next = new Set;\n let x = 0;\n while (current.size) {\n for (const node of current) {\n node.depth = x;\n for (const {target} of node.sourceLinks) {\n next.add(target);\n }\n }\n if (++x > n) throw new Error(\"circular link\");\n current = next;\n next = new Set;\n }\n }\n\n function computeNodeHeights({nodes}) {\n const n = nodes.length;\n let current = new Set(nodes);\n let next = new Set;\n let x = 0;\n while (current.size) {\n for (const node of current) {\n node.height = x;\n for (const {source} of node.targetLinks) {\n next.add(source);\n }\n }\n if (++x > n) throw new Error(\"circular link\");\n current = next;\n next = new Set;\n }\n }\n\n function computeNodeLayers({nodes}) {\n const x = max(nodes, d => d.depth) + 1;\n const kx = (x1 - x0 - dx) / (x - 1);\n const columns = new Array(x);\n for (const node of nodes) {\n const i = Math.max(0, Math.min(x - 1, Math.floor(align.call(null, node, x))));\n node.layer = i;\n node.x0 = x0 + i * kx;\n node.x1 = node.x0 + dx;\n if (columns[i]) columns[i].push(node);\n else columns[i] = [node];\n }\n if (sort) for (const column of columns) {\n column.sort(sort);\n }\n return columns;\n }\n\n function initializeNodeBreadths(columns) {\n const ky = min(columns, c => (y1 - y0 - (c.length - 1) * py) / sum(c, value));\n for (const nodes of columns) {\n let y = y0;\n for (const node of nodes) {\n node.y0 = y;\n node.y1 = y + node.value * ky;\n y = node.y1 + py;\n for (const link of node.sourceLinks) {\n link.width = link.value * ky;\n }\n }\n y = (y1 - y + py) / (nodes.length + 1);\n for (let i = 0; i < nodes.length; ++i) {\n const node = nodes[i];\n node.y0 += y * (i + 1);\n node.y1 += y * (i + 1);\n }\n reorderLinks(nodes);\n }\n }\n\n function computeNodeBreadths(graph) {\n const columns = computeNodeLayers(graph);\n py = Math.min(dy, (y1 - y0) / (max(columns, c => c.length) - 1));\n initializeNodeBreadths(columns);\n for (let i = 0; i < iterations; ++i) {\n const alpha = Math.pow(0.99, i);\n const beta = Math.max(1 - alpha, (i + 1) / iterations);\n relaxRightToLeft(columns, alpha, beta);\n relaxLeftToRight(columns, alpha, beta);\n }\n }\n\n // Reposition each node based on its incoming (target) links.\n function relaxLeftToRight(columns, alpha, beta) {\n for (let i = 1, n = columns.length; i < n; ++i) {\n const column = columns[i];\n for (const target of column) {\n let y = 0;\n let w = 0;\n for (const {source, value} of target.targetLinks) {\n let v = value * (target.layer - source.layer);\n y += targetTop(source, target) * v;\n w += v;\n }\n if (!(w > 0)) continue;\n let dy = (y / w - target.y0) * alpha;\n target.y0 += dy;\n target.y1 += dy;\n reorderNodeLinks(target);\n }\n if (sort === undefined) column.sort(ascendingBreadth);\n resolveCollisions(column, beta);\n }\n }\n\n // Reposition each node based on its outgoing (source) links.\n function relaxRightToLeft(columns, alpha, beta) {\n for (let n = columns.length, i = n - 2; i >= 0; --i) {\n const column = columns[i];\n for (const source of column) {\n let y = 0;\n let w = 0;\n for (const {target, value} of source.sourceLinks) {\n let v = value * (target.layer - source.layer);\n y += sourceTop(source, target) * v;\n w += v;\n }\n if (!(w > 0)) continue;\n let dy = (y / w - source.y0) * alpha;\n source.y0 += dy;\n source.y1 += dy;\n reorderNodeLinks(source);\n }\n if (sort === undefined) column.sort(ascendingBreadth);\n resolveCollisions(column, beta);\n }\n }\n\n function resolveCollisions(nodes, alpha) {\n const i = nodes.length >> 1;\n const subject = nodes[i];\n resolveCollisionsBottomToTop(nodes, subject.y0 - py, i - 1, alpha);\n resolveCollisionsTopToBottom(nodes, subject.y1 + py, i + 1, alpha);\n resolveCollisionsBottomToTop(nodes, y1, nodes.length - 1, alpha);\n resolveCollisionsTopToBottom(nodes, y0, 0, alpha);\n }\n\n // Push any overlapping nodes down.\n function resolveCollisionsTopToBottom(nodes, y, i, alpha) {\n for (; i < nodes.length; ++i) {\n const node = nodes[i];\n const dy = (y - node.y0) * alpha;\n if (dy > 1e-6) node.y0 += dy, node.y1 += dy;\n y = node.y1 + py;\n }\n }\n\n // Push any overlapping nodes up.\n function resolveCollisionsBottomToTop(nodes, y, i, alpha) {\n for (; i >= 0; --i) {\n const node = nodes[i];\n const dy = (node.y1 - y) * alpha;\n if (dy > 1e-6) node.y0 -= dy, node.y1 -= dy;\n y = node.y0 - py;\n }\n }\n\n function reorderNodeLinks({sourceLinks, targetLinks}) {\n if (linkSort === undefined) {\n for (const {source: {sourceLinks}} of targetLinks) {\n sourceLinks.sort(ascendingTargetBreadth);\n }\n for (const {target: {targetLinks}} of sourceLinks) {\n targetLinks.sort(ascendingSourceBreadth);\n }\n }\n }\n\n function reorderLinks(nodes) {\n if (linkSort === undefined) {\n for (const {sourceLinks, targetLinks} of nodes) {\n sourceLinks.sort(ascendingTargetBreadth);\n targetLinks.sort(ascendingSourceBreadth);\n }\n }\n }\n\n // Returns the target.y0 that would produce an ideal link from source to target.\n function targetTop(source, target) {\n let y = source.y0 - (source.sourceLinks.length - 1) * py / 2;\n for (const {target: node, width} of source.sourceLinks) {\n if (node === target) break;\n y += width + py;\n }\n for (const {source: node, width} of target.targetLinks) {\n if (node === source) break;\n y -= width;\n }\n return y;\n }\n\n // Returns the source.y0 that would produce an ideal link from source to target.\n function sourceTop(source, target) {\n let y = target.y0 - (target.targetLinks.length - 1) * py / 2;\n for (const {source: node, width} of target.targetLinks) {\n if (node === source) break;\n y += width + py;\n }\n for (const {target: node, width} of source.sourceLinks) {\n if (node === target) break;\n y -= width;\n }\n return y;\n }\n\n return sankey;\n}\n","var pi = Math.PI,\n tau = 2 * pi,\n epsilon = 1e-6,\n tauEpsilon = tau - epsilon;\n\nfunction Path() {\n this._x0 = this._y0 = // start of current subpath\n this._x1 = this._y1 = null; // end of current subpath\n this._ = \"\";\n}\n\nfunction path() {\n return new Path;\n}\n\nPath.prototype = path.prototype = {\n constructor: Path,\n moveTo: function(x, y) {\n this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y);\n },\n closePath: function() {\n if (this._x1 !== null) {\n this._x1 = this._x0, this._y1 = this._y0;\n this._ += \"Z\";\n }\n },\n lineTo: function(x, y) {\n this._ += \"L\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n quadraticCurveTo: function(x1, y1, x, y) {\n this._ += \"Q\" + (+x1) + \",\" + (+y1) + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n bezierCurveTo: function(x1, y1, x2, y2, x, y) {\n this._ += \"C\" + (+x1) + \",\" + (+y1) + \",\" + (+x2) + \",\" + (+y2) + \",\" + (this._x1 = +x) + \",\" + (this._y1 = +y);\n },\n arcTo: function(x1, y1, x2, y2, r) {\n x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;\n var 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 the radius negative? Error.\n if (r < 0) throw new Error(\"negative radius: \" + r);\n\n // Is this path empty? Move to (x1,y1).\n if (this._x1 === null) {\n this._ += \"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._ += \"L\" + (this._x1 = x1) + \",\" + (this._y1 = y1);\n }\n\n // Otherwise, draw an arc!\n else {\n var 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._ += \"L\" + (x1 + t01 * x01) + \",\" + (y1 + t01 * y01);\n }\n\n this._ += \"A\" + r + \",\" + r + \",0,0,\" + (+(y01 * x20 > x01 * y20)) + \",\" + (this._x1 = x1 + t21 * x21) + \",\" + (this._y1 = y1 + t21 * y21);\n }\n },\n arc: function(x, y, r, a0, a1, ccw) {\n x = +x, y = +y, r = +r, ccw = !!ccw;\n var 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 the radius negative? Error.\n if (r < 0) throw new Error(\"negative radius: \" + r);\n\n // Is this path empty? Move to (x0,y0).\n if (this._x1 === null) {\n this._ += \"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._ += \"L\" + x0 + \",\" + y0;\n }\n\n // Is this arc empty? We’re 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._ += \"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._ += \"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: function(x, y, w, h) {\n this._ += \"M\" + (this._x0 = this._x1 = +x) + \",\" + (this._y0 = this._y1 = +y) + \"h\" + (+w) + \"v\" + (+h) + \"h\" + (-w) + \"Z\";\n },\n toString: function() {\n return this._;\n }\n};\n\nexport default path;\n","export var slice = Array.prototype.slice;\n","export default function(x) {\n return function constant() {\n return x;\n };\n}\n","export function x(p) {\n return p[0];\n}\n\nexport function y(p) {\n return p[1];\n}\n","import {path} from \"d3-path\";\nimport {slice} from \"../array.js\";\nimport constant from \"../constant.js\";\nimport {x as pointX, y as pointY} from \"../point.js\";\nimport pointRadial from \"../pointRadial.js\";\n\nfunction linkSource(d) {\n return d.source;\n}\n\nfunction linkTarget(d) {\n return d.target;\n}\n\nfunction link(curve) {\n var source = linkSource,\n target = linkTarget,\n x = pointX,\n y = pointY,\n context = null;\n\n function link() {\n var buffer, argv = slice.call(arguments), s = source.apply(this, argv), t = target.apply(this, argv);\n if (!context) context = buffer = path();\n curve(context, +x.apply(this, (argv[0] = s, argv)), +y.apply(this, argv), +x.apply(this, (argv[0] = t, argv)), +y.apply(this, argv));\n if (buffer) return context = null, buffer + \"\" || null;\n }\n\n link.source = function(_) {\n return arguments.length ? (source = _, link) : source;\n };\n\n link.target = function(_) {\n return arguments.length ? (target = _, link) : target;\n };\n\n link.x = function(_) {\n return arguments.length ? (x = typeof _ === \"function\" ? _ : constant(+_), link) : x;\n };\n\n link.y = function(_) {\n return arguments.length ? (y = typeof _ === \"function\" ? _ : constant(+_), link) : y;\n };\n\n link.context = function(_) {\n return arguments.length ? ((context = _ == null ? null : _), link) : context;\n };\n\n return link;\n}\n\nfunction curveHorizontal(context, x0, y0, x1, y1) {\n context.moveTo(x0, y0);\n context.bezierCurveTo(x0 = (x0 + x1) / 2, y0, x0, y1, x1, y1);\n}\n\nfunction curveVertical(context, x0, y0, x1, y1) {\n context.moveTo(x0, y0);\n context.bezierCurveTo(x0, y0 = (y0 + y1) / 2, x1, y0, x1, y1);\n}\n\nfunction curveRadial(context, x0, y0, x1, y1) {\n var p0 = pointRadial(x0, y0),\n p1 = pointRadial(x0, y0 = (y0 + y1) / 2),\n p2 = pointRadial(x1, y0),\n p3 = pointRadial(x1, y1);\n context.moveTo(p0[0], p0[1]);\n context.bezierCurveTo(p1[0], p1[1], p2[0], p2[1], p3[0], p3[1]);\n}\n\nexport function linkHorizontal() {\n return link(curveHorizontal);\n}\n\nexport function linkVertical() {\n return link(curveVertical);\n}\n\nexport function linkRadial() {\n var l = link(curveRadial);\n l.angle = l.x, delete l.x;\n l.radius = l.y, delete l.y;\n return l;\n}\n","import {linkHorizontal} from \"d3-shape\";\n\nfunction horizontalSource(d) {\n return [d.source.x1, d.y0];\n}\n\nfunction horizontalTarget(d) {\n return [d.target.x0, d.y1];\n}\n\nexport default function() {\n return linkHorizontal()\n .source(horizontalSource)\n .target(horizontalTarget);\n}\n","import {\n __name,\n clear,\n common_default,\n defaultConfig2 as defaultConfig,\n getAccDescription,\n getAccTitle,\n getConfig2 as getConfig,\n getDiagramTitle,\n setAccDescription,\n setAccTitle,\n setDiagramTitle,\n setupGraphViewbox\n} from \"./chunk-YTJNT7DU.mjs\";\n\n// src/diagrams/sankey/parser/sankey.jison\nvar parser = function() {\n var o = /* @__PURE__ */ __name(function(k, v, o2, l) {\n for (o2 = o2 || {}, l = k.length; l--; o2[k[l]] = v) ;\n return o2;\n }, \"o\"), $V0 = [1, 9], $V1 = [1, 10], $V2 = [1, 5, 10, 12];\n var parser2 = {\n trace: /* @__PURE__ */ __name(function trace() {\n }, \"trace\"),\n yy: {},\n 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 },\n 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\" },\n productions_: [0, [3, 4], [6, 2], [9, 2], [9, 0], [7, 1], [7, 0], [8, 5], [15, 1], [15, 1], [16, 3], [17, 1]],\n performAction: /* @__PURE__ */ __name(function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) {\n var $0 = $$.length - 1;\n switch (yystate) {\n case 7:\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 break;\n case 8:\n case 9:\n case 11:\n this.$ = $$[$0];\n break;\n case 10:\n this.$ = $$[$0 - 1];\n break;\n }\n }, \"anonymous\"),\n 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])],\n defaultActions: { 11: [2, 1], 12: [2, 5] },\n parseError: /* @__PURE__ */ __name(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 }, \"parseError\"),\n parse: /* @__PURE__ */ __name(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 lexer2 = 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 lexer2.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer2;\n sharedState.yy.parser = this;\n if (typeof lexer2.yylloc == \"undefined\") {\n lexer2.yylloc = {};\n }\n var yyloc = lexer2.yylloc;\n lstack.push(yyloc);\n var ranges = lexer2.options && lexer2.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 __name(popStack, \"popStack\");\n function lex() {\n var token;\n token = tstack.pop() || lexer2.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 __name(lex, \"lex\");\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 (lexer2.showPosition) {\n errStr = \"Parse error on line \" + (yylineno + 1) + \":\\n\" + lexer2.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: lexer2.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer2.yylineno,\n loc: yyloc,\n 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(lexer2.yytext);\n lstack.push(lexer2.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = lexer2.yyleng;\n yytext = lexer2.yytext;\n yylineno = lexer2.yylineno;\n yyloc = lexer2.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 }, \"parse\")\n };\n var lexer = /* @__PURE__ */ function() {\n var lexer2 = {\n EOF: 1,\n parseError: /* @__PURE__ */ __name(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 }, \"parseError\"),\n // resets the lexer, sets new input\n setInput: /* @__PURE__ */ __name(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 }, \"setInput\"),\n // consumes and returns one char from the input\n input: /* @__PURE__ */ __name(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 this._input = this._input.slice(1);\n return ch;\n }, \"input\"),\n // unshifts one char (or a string) into the input\n unput: /* @__PURE__ */ __name(function(ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - 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 if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\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 ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len\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 }, \"unput\"),\n // When called from action, caches matched text and appends it on next action\n more: /* @__PURE__ */ __name(function() {\n this._more = true;\n return this;\n }, \"more\"),\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.\n reject: /* @__PURE__ */ __name(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 return this;\n }, \"reject\"),\n // retain first n characters of the match\n less: /* @__PURE__ */ __name(function(n) {\n this.unput(this.match.slice(n));\n }, \"less\"),\n // displays already matched input, i.e. for error messages\n pastInput: /* @__PURE__ */ __name(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 }, \"pastInput\"),\n // displays upcoming input, i.e. for error messages\n upcomingInput: /* @__PURE__ */ __name(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 }, \"upcomingInput\"),\n // displays the character position where the lexing error occurred, i.e. for error messages\n showPosition: /* @__PURE__ */ __name(function() {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n }, \"showPosition\"),\n // test the lexed token: return FALSE when not a match, otherwise return token\n test_match: /* @__PURE__ */ __name(function(match, indexed_rule) {\n var token, lines, backup;\n if (this.options.backtrack_lexer) {\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 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 ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length : 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 for (var k in backup) {\n this[k] = backup[k];\n }\n return false;\n }\n return false;\n }, \"test_match\"),\n // return next match in input\n next: /* @__PURE__ */ __name(function() {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n var token, match, tempMatch, 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;\n } else {\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 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 }, \"next\"),\n // return next match that has a token\n lex: /* @__PURE__ */ __name(function lex() {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n }, \"lex\"),\n // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\n begin: /* @__PURE__ */ __name(function begin(condition) {\n this.conditionStack.push(condition);\n }, \"begin\"),\n // pop the previously active lexer condition state off the condition stack\n popState: /* @__PURE__ */ __name(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 }, \"popState\"),\n // produce the lexer rule set which is active for the currently active lexer condition state\n _currentRules: /* @__PURE__ */ __name(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 }, \"_currentRules\"),\n // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\n topState: /* @__PURE__ */ __name(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 }, \"topState\"),\n // alias for begin(condition)\n pushState: /* @__PURE__ */ __name(function pushState(condition) {\n this.begin(condition);\n }, \"pushState\"),\n // return the number of states currently on the stack\n stateStackSize: /* @__PURE__ */ __name(function stateStackSize() {\n return this.conditionStack.length;\n }, \"stateStackSize\"),\n options: { \"case-insensitive\": true },\n performAction: /* @__PURE__ */ __name(function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) {\n var YYSTATE = YY_START;\n switch ($avoiding_name_collisions) {\n case 0:\n this.pushState(\"csv\");\n return 4;\n break;\n case 1:\n return 10;\n break;\n case 2:\n return 5;\n break;\n case 3:\n return 12;\n break;\n case 4:\n this.pushState(\"escaped_text\");\n return 18;\n break;\n case 5:\n return 20;\n break;\n case 6:\n this.popState(\"escaped_text\");\n return 18;\n break;\n case 7:\n return 19;\n break;\n }\n }, \"anonymous\"),\n rules: [/^(?:sankey-beta\\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],\n conditions: { \"csv\": { \"rules\": [1, 2, 3, 4, 5, 6, 7], \"inclusive\": false }, \"escaped_text\": { \"rules\": [6, 7], \"inclusive\": false }, \"INITIAL\": { \"rules\": [0, 1, 2, 3, 4, 5, 6, 7], \"inclusive\": true } }\n };\n return lexer2;\n }();\n parser2.lexer = lexer;\n function Parser() {\n this.yy = {};\n }\n __name(Parser, \"Parser\");\n Parser.prototype = parser2;\n parser2.Parser = Parser;\n return new Parser();\n}();\nparser.parser = parser;\nvar sankey_default = parser;\n\n// src/diagrams/sankey/sankeyDB.ts\nvar links = [];\nvar nodes = [];\nvar nodesMap = /* @__PURE__ */ new Map();\nvar clear2 = /* @__PURE__ */ __name(() => {\n links = [];\n nodes = [];\n nodesMap = /* @__PURE__ */ new Map();\n clear();\n}, \"clear\");\nvar SankeyLink = class {\n constructor(source, target, value = 0) {\n this.source = source;\n this.target = target;\n this.value = value;\n }\n static {\n __name(this, \"SankeyLink\");\n }\n};\nvar addLink = /* @__PURE__ */ __name((source, target, value) => {\n links.push(new SankeyLink(source, target, value));\n}, \"addLink\");\nvar SankeyNode = class {\n constructor(ID) {\n this.ID = ID;\n }\n static {\n __name(this, \"SankeyNode\");\n }\n};\nvar findOrCreateNode = /* @__PURE__ */ __name((ID) => {\n ID = common_default.sanitizeText(ID, getConfig());\n let node = nodesMap.get(ID);\n if (node === void 0) {\n node = new SankeyNode(ID);\n nodesMap.set(ID, node);\n nodes.push(node);\n }\n return node;\n}, \"findOrCreateNode\");\nvar getNodes = /* @__PURE__ */ __name(() => nodes, \"getNodes\");\nvar getLinks = /* @__PURE__ */ __name(() => links, \"getLinks\");\nvar getGraph = /* @__PURE__ */ __name(() => ({\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}), \"getGraph\");\nvar sankeyDB_default = {\n nodesMap,\n getConfig: /* @__PURE__ */ __name(() => getConfig().sankey, \"getConfig\"),\n getNodes,\n getLinks,\n getGraph,\n addLink,\n findOrCreateNode,\n getAccTitle,\n setAccTitle,\n getAccDescription,\n setAccDescription,\n getDiagramTitle,\n setDiagramTitle,\n clear: clear2\n};\n\n// src/diagrams/sankey/sankeyRenderer.ts\nimport {\n select as d3select,\n scaleOrdinal as d3scaleOrdinal,\n schemeTableau10 as d3schemeTableau10\n} from \"d3\";\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\";\n\n// src/rendering-util/uid.ts\nvar Uid = class _Uid {\n static {\n __name(this, \"Uid\");\n }\n static {\n this.count = 0;\n }\n static next(name) {\n return new _Uid(name + ++_Uid.count);\n }\n constructor(id) {\n this.id = id;\n this.href = `#${id}`;\n }\n toString() {\n return \"url(\" + this.href + \")\";\n }\n};\n\n// src/diagrams/sankey/sankeyRenderer.ts\nvar alignmentsMap = {\n left: d3SankeyLeft,\n right: d3SankeyRight,\n center: d3SankeyCenter,\n justify: d3SankeyJustify\n};\nvar draw = /* @__PURE__ */ __name(function(text, id, _version, diagObj) {\n const { securityLevel, sankey: conf } = getConfig();\n const defaultSankeyConfig = defaultConfig.sankey;\n let sandboxElement;\n if (securityLevel === \"sandbox\") {\n sandboxElement = d3select(\"#i\" + id);\n }\n const root = securityLevel === \"sandbox\" ? d3select(sandboxElement.nodes()[0].contentDocument.body) : d3select(\"body\");\n const svg = securityLevel === \"sandbox\" ? root.select(`[id=\"${id}\"]`) : d3select(`[id=\"${id}\"]`);\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 const graph = diagObj.db.getGraph();\n const nodeAlign = alignmentsMap[nodeAlignment];\n const nodeWidth = 10;\n const sankey = d3Sankey().nodeId((d) => d.id).nodeWidth(nodeWidth).nodePadding(10 + (showValues ? 15 : 0)).nodeAlign(nodeAlign).extent([\n [0, 0],\n [width, height]\n ]);\n sankey(graph);\n const colorScheme = d3scaleOrdinal(d3schemeTableau10);\n 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) {\n return \"translate(\" + d.x0 + \",\" + d.y0 + \")\";\n }).attr(\"x\", (d) => d.x0).attr(\"y\", (d) => d.y0).append(\"rect\").attr(\"height\", (d) => {\n return d.y1 - d.y0;\n }).attr(\"width\", (d) => d.x1 - d.x0).attr(\"fill\", (d) => colorScheme(d.id));\n const getText = /* @__PURE__ */ __name(({ id: id2, value }) => {\n if (!showValues) {\n return id2;\n }\n return `${id2}\n${prefix}${Math.round(value * 100) / 100}${suffix}`;\n }, \"getText\");\n 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);\n 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\");\n const linkColor = conf?.linkColor ?? \"gradient\";\n if (linkColor === \"gradient\") {\n 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);\n gradient.append(\"stop\").attr(\"offset\", \"0%\").attr(\"stop-color\", (d) => colorScheme(d.source.id));\n gradient.append(\"stop\").attr(\"offset\", \"100%\").attr(\"stop-color\", (d) => colorScheme(d.target.id));\n }\n let coloring;\n switch (linkColor) {\n case \"gradient\":\n coloring = /* @__PURE__ */ __name((d) => d.uid, \"coloring\");\n break;\n case \"source\":\n coloring = /* @__PURE__ */ __name((d) => colorScheme(d.source.id), \"coloring\");\n break;\n case \"target\":\n coloring = /* @__PURE__ */ __name((d) => colorScheme(d.target.id), \"coloring\");\n break;\n default:\n coloring = linkColor;\n }\n link.append(\"path\").attr(\"d\", d3SankeyLinkHorizontal()).attr(\"stroke\", coloring).attr(\"stroke-width\", (d) => Math.max(1, d.width));\n setupGraphViewbox(void 0, svg, 0, useMaxWidth);\n}, \"draw\");\nvar sankeyRenderer_default = {\n draw\n};\n\n// src/diagrams/sankey/sankeyUtils.ts\nvar prepareTextForParsing = /* @__PURE__ */ __name((text) => {\n const textToParse = text.replaceAll(/^[^\\S\\n\\r]+|[^\\S\\n\\r]+$/g, \"\").replaceAll(/([\\n\\r])+/g, \"\\n\").trim();\n return textToParse;\n}, \"prepareTextForParsing\");\n\n// src/diagrams/sankey/styles.js\nvar getStyles = /* @__PURE__ */ __name((options) => `.label {\n font-family: ${options.fontFamily};\n }`, \"getStyles\");\nvar styles_default = getStyles;\n\n// src/diagrams/sankey/sankeyDiagram.ts\nvar originalParse = sankey_default.parse.bind(sankey_default);\nsankey_default.parse = (text) => originalParse(prepareTextForParsing(text));\nvar diagram = {\n styles: styles_default,\n parser: sankey_default,\n db: sankeyDB_default,\n renderer: sankeyRenderer_default\n};\nexport {\n diagram\n};\n"],"names":["a","b","NaN","ascendingBisect","compare","f","length","d","x","ascending","left","lo","hi","mid","right","bisector","array","Array","prototype","slice","map","Math","sqrt","values","valueof","value","max","n","i","min","sum","targetDepth","target","depth","justify","node","sourceLinks","constant","ascendingSourceBreadth","ascendingBreadth","source","index","ascendingTargetBreadth","y0","defaultId","defaultNodes","graph","nodes","defaultLinks","links","find","nodeById","id","get","Error","computeLinkBreadths","_ref","y1","link","width","targetLinks","Sankey","py","sort","linkSort","x0","x1","dx","dy","align","iterations","sankey","apply","arguments","_ref2","entries","Map","push","computeNodeLinks","_ref3","undefined","fixedValue","computeNodeValues","_ref4","current","Set","next","size","add","computeNodeDepths","_ref5","height","computeNodeHeights","columns","_ref6","kx","floor","call","layer","column","computeNodeLayers","c","ky","y","reorderLinks","initializeNodeBreadths","alpha","pow","beta","relaxRightToLeft","relaxLeftToRight","computeNodeBreadths","w","v","targetTop","reorderNodeLinks","resolveCollisions","sourceTop","subject","resolveCollisionsBottomToTop","resolveCollisionsTopToBottom","_ref7","update","nodeId","_","nodeAlign","nodeSort","nodeWidth","nodePadding","extent","pi","PI","tau","epsilon","tauEpsilon","Path","this","_x0","_y0","_x1","_y1","path","constructor","moveTo","closePath","lineTo","quadraticCurveTo","bezierCurveTo","x2","y2","arcTo","r","x21","y21","x01","y01","l01_2","abs","x20","y20","l21_2","l20_2","l21","l01","l","tan","acos","t01","t21","arc","a0","a1","ccw","cos","sin","cw","da","rect","h","toString","p","linkSource","linkTarget","curve","pointX","pointY","context","buffer","argv","s","t","curveHorizontal","horizontalSource","horizontalTarget","parser","o","__name","k","o2","$V0","$V1","$V2","parser2","trace","yy","symbols_","terminals_","productions_","performAction","yytext","yyleng","yylineno","yystate","$$","_$","$0","findOrCreateNode","trim","replaceAll","parseFloat","addLink","$","table","defaultActions","parseError","str","hash","recoverable","error","parse","input","self","stack","tstack","vstack","lstack","recovering","args","lexer2","Object","create","lexer","sharedState","hasOwnProperty","setInput","yylloc","yyloc","ranges","options","lex","token","pop","getPrototypeOf","symbol","preErrorSymbol","state","action","len","newState","expected","yyval","errStr","showPosition","join","text","match","line","loc","first_line","last_line","first_column","last_column","range","concat","EOF","_input","_more","_backtrack","done","matched","conditionStack","offset","ch","unput","lines","split","substr","oldLines","more","reject","backtrack_lexer","less","pastInput","past","replace","upcomingInput","pre","test_match","indexed_rule","backup","matches","tempMatch","rules","_currentRules","flex","begin","condition","popState","conditions","topState","pushState","stateStackSize","yy_","$avoiding_name_collisions","YY_START","Parser","sankey_default","nodesMap","clear2","clear","SankeyLink","SankeyNode","ID","common_default","sanitizeText","getConfig","set","getNodes","getLinks","getGraph","sankeyDB_default","getAccTitle","setAccTitle","getAccDescription","setAccDescription","getDiagramTitle","setDiagramTitle","Uid","_Uid","count","name","href","alignmentsMap","center","d3SankeyJustify","draw","_version","diagObj","securityLevel","conf","defaultSankeyConfig","defaultConfig","sandboxElement","d3select","root","contentDocument","body","svg","select","useMaxWidth","nodeAlignment","prefix","suffix","showValues","db","d3Sankey","colorScheme","d3scaleOrdinal","d3schemeTableau10","append","attr","selectAll","data","uid","getText","id2","round","style","linkColor","gradient","coloring","d3SankeyLinkHorizontal","setupGraphViewbox","sankeyRenderer_default","prepareTextForParsing","styles_default","fontFamily","originalParse","bind","diagram","styles","renderer"],"sourceRoot":""} \ No newline at end of file diff --git a/frontend/deployed/static/js/372.1ba03aa4.chunk.js b/frontend/deployed/static/js/372.1ba03aa4.chunk.js deleted file mode 100644 index 614b389..0000000 --- a/frontend/deployed/static/js/372.1ba03aa4.chunk.js +++ /dev/null @@ -1 +0,0 @@ -"use strict";(self.webpackChunkbackstory=self.webpackChunkbackstory||[]).push([[372],{7372:(e,s,c)=>{c.d(s,{createInfoServices:()=>a.v});var a=c(9456);c(1584)}}]); \ No newline at end of file diff --git a/frontend/deployed/static/js/415.d031fb39.chunk.js b/frontend/deployed/static/js/415.d031fb39.chunk.js deleted file mode 100644 index 71a177f..0000000 --- a/frontend/deployed/static/js/415.d031fb39.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(self.webpackChunkbackstory=self.webpackChunkbackstory||[]).push([[415],{415:(t,e,i)=>{"use strict";i.d(e,{diagram:()=>gt});var r=i(9711),n=i(2596),o=i(7799),s=i(9837),a=(i(634),i(3957)),h=i(3759),l=i(5502),c=i(646),d=i(1940),g=i(700),u={L:"left",R:"right",T:"top",B:"bottom"},f={L:(0,h.K2)((t=>`${t},${t/2} 0,${t} 0,0`),"L"),R:(0,h.K2)((t=>`0,${t/2} ${t},0 ${t},${t}`),"R"),T:(0,h.K2)((t=>`0,0 ${t},0 ${t/2},${t}`),"T"),B:(0,h.K2)((t=>`${t/2},0 ${t},${t} 0,${t}`),"B")},p={L:(0,h.K2)(((t,e)=>t-e+2),"L"),R:(0,h.K2)(((t,e)=>t-2),"R"),T:(0,h.K2)(((t,e)=>t-e+2),"T"),B:(0,h.K2)(((t,e)=>t-2),"B")},v=(0,h.K2)((function(t){return m(t)?"L"===t?"R":"L":"T"===t?"B":"T"}),"getOppositeArchitectureDirection"),y=(0,h.K2)((function(t){return"L"===t||"R"===t||"T"===t||"B"===t}),"isArchitectureDirection"),m=(0,h.K2)((function(t){return"L"===t||"R"===t}),"isArchitectureDirectionX"),E=(0,h.K2)((function(t){return"T"===t||"B"===t}),"isArchitectureDirectionY"),N=(0,h.K2)((function(t,e){const i=m(t)&&E(e),r=E(t)&&m(e);return i||r}),"isArchitectureDirectionXY"),T=(0,h.K2)((function(t){const e=t[0],i=t[1],r=m(e)&&E(i),n=E(e)&&m(i);return r||n}),"isArchitecturePairXY"),A=(0,h.K2)((function(t){return"LL"!==t&&"RR"!==t&&"TT"!==t&&"BB"!==t}),"isValidArchitectureDirectionPair"),w=(0,h.K2)((function(t,e){const i=`${t}${e}`;return A(i)?i:void 0}),"getArchitectureDirectionPair"),L=(0,h.K2)((function(t,e){let[i,r]=t;const n=e[0],o=e[1];return m(n)?E(o)?[i+("L"===n?-1:1),r+("T"===o?1:-1)]:[i+("L"===n?-1:1),r]:m(o)?[i+("L"===o?1:-1),r+("T"===n?1:-1)]:[i,r+("T"===n?1:-1)]}),"shiftPositionByArchitectureDirectionPair"),I=(0,h.K2)((function(t){return"LT"===t||"TL"===t?[1,1]:"BL"===t||"LB"===t?[1,-1]:"BR"===t||"RB"===t?[-1,-1]:[-1,1]}),"getArchitectureDirectionXYFactors"),_=(0,h.K2)((function(t,e){return N(t,e)?"bend":m(t)?"horizontal":"vertical"}),"getArchitectureDirectionAlignment"),C=(0,h.K2)((function(t){return"service"===t.type}),"isArchitectureService"),M=(0,h.K2)((function(t){return"junction"===t.type}),"isArchitectureJunction"),x=(0,h.K2)((t=>t.data()),"edgeData"),O=(0,h.K2)((t=>t.data()),"nodeData"),D=h.UI.architecture,R=new s.m((()=>({nodes:{},groups:{},edges:[],registeredIds:{},config:D,dataStructures:void 0,elements:{}}))),b=(0,h.K2)((()=>{R.reset(),(0,h.IU)()}),"clear"),G=(0,h.K2)((function(t){let{id:e,icon:i,in:r,title:n,iconText:o}=t;if(void 0!==R.records.registeredIds[e])throw new Error(`The service id [${e}] is already in use by another ${R.records.registeredIds[e]}`);if(void 0!==r){if(e===r)throw new Error(`The service [${e}] cannot be placed within itself`);if(void 0===R.records.registeredIds[r])throw new Error(`The service [${e}]'s parent does not exist. Please make sure the parent is created before this service`);if("node"===R.records.registeredIds[r])throw new Error(`The service [${e}]'s parent is not a group`)}R.records.registeredIds[e]="node",R.records.nodes[e]={id:e,type:"service",icon:i,iconText:o,title:n,edges:[],in:r}}),"addService"),F=(0,h.K2)((()=>Object.values(R.records.nodes).filter(C)),"getServices"),S=(0,h.K2)((function(t){let{id:e,in:i}=t;R.records.registeredIds[e]="node",R.records.nodes[e]={id:e,type:"junction",edges:[],in:i}}),"addJunction"),P=(0,h.K2)((()=>Object.values(R.records.nodes).filter(M)),"getJunctions"),U=(0,h.K2)((()=>Object.values(R.records.nodes)),"getNodes"),Y=(0,h.K2)((t=>R.records.nodes[t]),"getNode"),k=(0,h.K2)((function(t){let{id:e,icon:i,in:r,title:n}=t;if(void 0!==R.records.registeredIds[e])throw new Error(`The group id [${e}] is already in use by another ${R.records.registeredIds[e]}`);if(void 0!==r){if(e===r)throw new Error(`The group [${e}] cannot be placed within itself`);if(void 0===R.records.registeredIds[r])throw new Error(`The group [${e}]'s parent does not exist. Please make sure the parent is created before this group`);if("node"===R.records.registeredIds[r])throw new Error(`The group [${e}]'s parent is not a group`)}R.records.registeredIds[e]="group",R.records.groups[e]={id:e,icon:i,title:n,in:r}}),"addGroup"),H=(0,h.K2)((()=>Object.values(R.records.groups)),"getGroups"),X=(0,h.K2)((function(t){let{lhsId:e,rhsId:i,lhsDir:r,rhsDir:n,lhsInto:o,rhsInto:s,lhsGroup:a,rhsGroup:h,title:l}=t;if(!y(r))throw new Error(`Invalid direction given for left hand side of edge ${e}--${i}. Expected (L,R,T,B) got ${r}`);if(!y(n))throw new Error(`Invalid direction given for right hand side of edge ${e}--${i}. Expected (L,R,T,B) got ${n}`);if(void 0===R.records.nodes[e]&&void 0===R.records.groups[e])throw new Error(`The left-hand id [${e}] does not yet exist. Please create the service/group before declaring an edge to it.`);if(void 0===R.records.nodes[i]&&void 0===R.records.groups[e])throw new Error(`The right-hand id [${i}] does not yet exist. Please create the service/group before declaring an edge to it.`);const c=R.records.nodes[e].in,d=R.records.nodes[i].in;if(a&&c&&d&&c==d)throw new Error(`The left-hand id [${e}] is modified to traverse the group boundary, but the edge does not pass through two groups.`);if(h&&c&&d&&c==d)throw new Error(`The right-hand id [${i}] is modified to traverse the group boundary, but the edge does not pass through two groups.`);const g={lhsId:e,lhsDir:r,lhsInto:o,lhsGroup:a,rhsId:i,rhsDir:n,rhsInto:s,rhsGroup:h,title:l};R.records.edges.push(g),R.records.nodes[e]&&R.records.nodes[i]&&(R.records.nodes[e].edges.push(R.records.edges[R.records.edges.length-1]),R.records.nodes[i].edges.push(R.records.edges[R.records.edges.length-1]))}),"addEdge"),z=(0,h.K2)((()=>R.records.edges),"getEdges"),V=(0,h.K2)((()=>{if(void 0===R.records.dataStructures){const t={},e=Object.entries(R.records.nodes).reduce(((e,i)=>{let[r,n]=i;return e[r]=n.edges.reduce(((e,i)=>{const n=Y(i.lhsId)?.in,o=Y(i.rhsId)?.in;if(n&&o&&n!==o){const e=_(i.lhsDir,i.rhsDir);"bend"!==e&&(t[n]??={},t[n][o]=e,t[o]??={},t[o][n]=e)}if(i.lhsId===r){const t=w(i.lhsDir,i.rhsDir);t&&(e[t]=i.rhsId)}else{const t=w(i.rhsDir,i.lhsDir);t&&(e[t]=i.lhsId)}return e}),{}),e}),{}),i=Object.keys(e)[0],r={[i]:1},n=Object.keys(e).reduce(((t,e)=>e===i?t:{...t,[e]:1}),{}),o=(0,h.K2)((t=>{const i={[t]:[0,0]},o=[t];for(;o.length>0;){const t=o.shift();if(t){r[t]=1,delete n[t];const s=e[t],[a,h]=i[t];Object.entries(s).forEach((t=>{let[e,n]=t;r[n]||(i[n]=L([a,h],e),o.push(n))}))}}return i}),"BFS"),s=[o(i)];for(;Object.keys(n).length>0;)s.push(o(Object.keys(n)[0]));R.records.dataStructures={adjList:e,spatialMaps:s,groupAlignments:t}}return R.records.dataStructures}),"getDataStructures"),B=(0,h.K2)(((t,e)=>{R.records.elements[t]=e}),"setElementForId"),W=(0,h.K2)((t=>R.records.elements[t]),"getElementById"),j={clear:b,setDiagramTitle:h.ke,getDiagramTitle:h.ab,setAccTitle:h.SV,getAccTitle:h.iN,setAccDescription:h.EI,getAccDescription:h.m7,addService:G,getServices:F,addJunction:S,getJunctions:P,getNodes:U,getNode:Y,addGroup:k,getGroups:H,addEdge:X,getEdges:z,setElementForId:B,getElementById:W,getDataStructures:V};function q(t){const e=(0,h.D7)().architecture;return e?.[t]?e[t]:D[t]}(0,h.K2)(q,"getConfigField");var $=(0,h.K2)(((t,e)=>{(0,o.S)(t,e),t.groups.map(e.addGroup),t.services.map((t=>e.addService({...t,type:"service"}))),t.junctions.map((t=>e.addJunction({...t,type:"junction"}))),t.edges.map(e.addEdge)}),"populateDb"),K={parse:(0,h.K2)((async t=>{const e=await(0,l.qg)("architecture",t);h.Rm.debug(e),$(e,j)}),"parse")},Z=(0,h.K2)((t=>`\n .edge {\n stroke-width: ${t.archEdgeWidth};\n stroke: ${t.archEdgeColor};\n fill: none;\n }\n\n .arrow {\n fill: ${t.archEdgeArrowColor};\n }\n\n .node-bkg {\n fill: none;\n stroke: ${t.archGroupBorderColor};\n stroke-width: ${t.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`),"getStyles"),Q=(0,h.K2)((t=>`${t}`),"wrapIcon"),J={prefix:"mermaid-architecture",height:80,width:80,icons:{database:{body:Q('')},server:{body:Q('')},disk:{body:Q('')},internet:{body:Q('')},cloud:{body:Q('')},unknown:r.Gc,blank:{body:Q("")}}},tt=(0,h.K2)((async function(t,e){const i=q("padding"),r=q("iconSize"),o=r/2,s=r/6,a=s/2;await Promise.all(e.edges().map((async e=>{const{source:r,sourceDir:l,sourceArrow:c,sourceGroup:d,target:g,targetDir:u,targetArrow:v,targetGroup:y,label:A}=x(e);let{x:L,y:_}=e[0].sourceEndpoint();const{x:C,y:M}=e[0].midpoint();let{x:O,y:D}=e[0].targetEndpoint();const R=i+4;if(d&&(m(l)?L+="L"===l?-R:R:_+="T"===l?-R:R+18),y&&(m(u)?O+="L"===u?-R:R:D+="T"===u?-R:R+18),d||"junction"!==j.getNode(r)?.type||(m(l)?L+="L"===l?o:-o:_+="T"===l?o:-o),y||"junction"!==j.getNode(g)?.type||(m(u)?O+="L"===u?o:-o:D+="T"===u?o:-o),e[0]._private.rscratch){const e=t.insert("g");if(e.insert("path").attr("d",`M ${L},${_} L ${C},${M} L${O},${D} `).attr("class","edge"),c){const t=m(l)?p[l](L,s):L-a,i=E(l)?p[l](_,s):_-a;e.insert("polygon").attr("points",f[l](s)).attr("transform",`translate(${t},${i})`).attr("class","arrow")}if(v){const t=m(u)?p[u](O,s):O-a,i=E(u)?p[u](D,s):D-a;e.insert("polygon").attr("points",f[u](s)).attr("transform",`translate(${t},${i})`).attr("class","arrow")}if(A){const t=N(l,u)?"XY":m(l)?"X":"Y";let i=0;i="X"===t?Math.abs(L-O):"Y"===t?Math.abs(_-D)/1.5:Math.abs(L-O)/2;const r=e.append("g");if(await(0,n.GZ)(r,A,{useHtmlLabels:!1,width:i,classes:"architecture-service-label"},(0,h.D7)()),r.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle"),"X"===t)r.attr("transform","translate("+C+", "+M+")");else if("Y"===t)r.attr("transform","translate("+C+", "+M+") rotate(-90)");else if("XY"===t){const t=w(l,u);if(t&&T(t)){const e=r.node().getBoundingClientRect(),[i,n]=I(t);r.attr("dominant-baseline","auto").attr("transform",`rotate(${-1*i*n*45})`);const o=r.node().getBoundingClientRect();r.attr("transform",`\n translate(${C}, ${M-e.height/2})\n translate(${i*o.width/2}, ${n*o.height/2})\n rotate(${-1*i*n*45}, 0, ${e.height/2})\n `)}}}}})))}),"drawEdges"),et=(0,h.K2)((async function(t,e){const i=.75*q("padding"),o=q("fontSize"),s=q("iconSize")/2;await Promise.all(e.nodes().map((async e=>{const a=O(e);if("group"===a.type){const{h:l,w:c,x1:d,y1:g}=e.boundingBox();t.append("rect").attr("x",d+s).attr("y",g+s).attr("width",c).attr("height",l).attr("class","node-bkg");const u=t.append("g");let f=d,p=g;if(a.icon){const t=u.append("g");t.html(`${await(0,r.WY)(a.icon,{height:i,width:i,fallbackPrefix:J.prefix})}`),t.attr("transform","translate("+(f+s+1)+", "+(p+s+1)+")"),f+=i,p+=o/2-1-2}if(a.label){const t=u.append("g");await(0,n.GZ)(t,a.label,{useHtmlLabels:!1,width:c,classes:"architecture-service-label"},(0,h.D7)()),t.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","start").attr("text-anchor","start"),t.attr("transform","translate("+(f+s+4)+", "+(p+s+2)+")")}}})))}),"drawGroups"),it=(0,h.K2)((async function(t,e,i){for(const o of i){const i=e.append("g"),s=q("iconSize");if(o.title){const t=i.append("g");await(0,n.GZ)(t,o.title,{useHtmlLabels:!1,width:1.5*s,classes:"architecture-service-label"},(0,h.D7)()),t.attr("dy","1em").attr("alignment-baseline","middle").attr("dominant-baseline","middle").attr("text-anchor","middle"),t.attr("transform","translate("+s/2+", "+s+")")}const a=i.append("g");if(o.icon)a.html(`${await(0,r.WY)(o.icon,{height:s,width:s,fallbackPrefix:J.prefix})}`);else if(o.iconText){a.html(`${await(0,r.WY)("blank",{height:s,width:s,fallbackPrefix:J.prefix})}`);const t=a.append("g").append("foreignObject").attr("width",s).attr("height",s).append("div").attr("class","node-icon-text").attr("style",`height: ${s}px;`).append("div").html(o.iconText),e=parseInt(window.getComputedStyle(t.node(),null).getPropertyValue("font-size").replace(/\D/g,""))??16;t.attr("style",`-webkit-line-clamp: ${Math.floor((s-2)/e)};`)}else a.append("path").attr("class","node-bkg").attr("id","node-"+o.id).attr("d",`M0 ${s} v${-s} q0,-5 5,-5 h${s} q5,0 5,5 v${s} H0 Z`);i.attr("class","architecture-service");const{width:l,height:c}=i._groups[0][0].getBBox();o.width=l,o.height=c,t.setElementForId(o.id,i)}return 0}),"drawServices"),rt=(0,h.K2)((function(t,e,i){i.forEach((i=>{const r=e.append("g"),n=q("iconSize");r.append("g").append("rect").attr("id","node-"+i.id).attr("fill-opacity","0").attr("width",n).attr("height",n),r.attr("class","architecture-junction");const{width:o,height:s}=r._groups[0][0].getBBox();r.width=o,r.height=s,t.setElementForId(i.id,r)}))}),"drawJunctions");function nt(t,e){t.forEach((t=>{e.add({group:"nodes",data:{type:"service",id:t.id,icon:t.icon,label:t.title,parent:t.in,width:q("iconSize"),height:q("iconSize")},classes:"node-service"})}))}function ot(t,e){t.forEach((t=>{e.add({group:"nodes",data:{type:"junction",id:t.id,parent:t.in,width:q("iconSize"),height:q("iconSize")},classes:"node-junction"})}))}function st(t,e){e.nodes().map((e=>{const i=O(e);if("group"===i.type)return;i.x=e.position().x,i.y=e.position().y;t.getElementById(i.id).attr("transform","translate("+(i.x||0)+","+(i.y||0)+")")}))}function at(t,e){t.forEach((t=>{e.add({group:"nodes",data:{type:"group",id:t.id,icon:t.icon,label:t.title,parent:t.in},classes:"node-group"})}))}function ht(t,e){t.forEach((t=>{const{lhsId:i,rhsId:r,lhsInto:n,lhsGroup:o,rhsInto:s,lhsDir:a,rhsDir:h,rhsGroup:l,title:c}=t,d=N(t.lhsDir,t.rhsDir)?"segments":"straight",g={id:`${i}-${r}`,label:c,source:i,sourceDir:a,sourceArrow:n,sourceGroup:o,sourceEndpoint:"L"===a?"0 50%":"R"===a?"100% 50%":"T"===a?"50% 0":"50% 100%",target:r,targetDir:h,targetArrow:s,targetGroup:l,targetEndpoint:"L"===h?"0 50%":"R"===h?"100% 50%":"T"===h?"50% 0":"50% 100%"};e.add({group:"edges",data:g,classes:d})}))}function lt(t,e,i){const r=(0,h.K2)(((t,e)=>Object.entries(t).reduce(((t,r)=>{let[n,o]=r,s=0;const a=Object.entries(o);if(1===a.length)return t[n]=a[0][1],t;for(let h=0;h{const i={},n={};return Object.entries(e).forEach((e=>{let[r,[o,s]]=e;const a=t.getNode(r)?.in??"default";i[s]??={},i[s][a]??=[],i[s][a].push(r),n[o]??={},n[o][a]??=[],n[o][a].push(r)})),{horiz:Object.values(r(i,"horizontal")).filter((t=>t.length>1)),vert:Object.values(r(n,"vertical")).filter((t=>t.length>1))}})),[o,s]=n.reduce(((t,e)=>{let[i,r]=t,{horiz:n,vert:o}=e;return[[...i,...n],[...r,...o]]}),[[],[]]);return{horizontal:o,vertical:s}}function ct(t){const e=[],i=(0,h.K2)((t=>`${t[0]},${t[1]}`),"posToStr"),r=(0,h.K2)((t=>t.split(",").map((t=>parseInt(t)))),"strToPos");return t.forEach((t=>{const n=Object.fromEntries(Object.entries(t).map((t=>{let[e,r]=t;return[i(r),e]}))),o=[i([0,0])],s={},a={L:[-1,0],R:[1,0],T:[0,1],B:[0,-1]};for(;o.length>0;){const t=o.shift();if(t){s[t]=1;const h=n[t];if(h){const l=r(t);Object.entries(a).forEach((t=>{let[r,a]=t;const c=i([l[0]+a[0],l[1]+a[1]]),d=n[c];d&&!s[c]&&(o.push(c),e.push({[u[r]]:d,[u[v(r)]]:h,gap:1.5*q("iconSize")}))}))}}}})),e}function dt(t,e,i,r,n,o){let{spatialMaps:s,groupAlignments:a}=o;return new Promise((o=>{const l=(0,g.Ltv)("body").append("div").attr("id","cy").attr("style","display:none"),d=(0,c.A)({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":`${q("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:`${q("padding")}px`}}]});l.remove(),at(i,d),nt(t,d),ot(e,d),ht(r,d);const u=lt(n,s,a),f=ct(s),p=d.layout({name:"fcose",quality:"proof",styleEnabled:!1,animate:!1,nodeDimensionsIncludeLabels:!1,idealEdgeLength(t){const[e,i]=t.connectedNodes(),{parent:r}=O(e),{parent:n}=O(i);return r===n?1.5*q("iconSize"):.5*q("iconSize")},edgeElasticity(t){const[e,i]=t.connectedNodes(),{parent:r}=O(e),{parent:n}=O(i);return r===n?.45:.001},alignmentConstraint:u,relativePlacementConstraint:f});p.one("layoutstop",(()=>{function t(t,e,i,r){let n,o;const{x:s,y:a}=t,{x:h,y:l}=e;o=(r-a+(s-i)*(a-l)/(s-h))/Math.sqrt(1+Math.pow((a-l)/(s-h),2)),n=Math.sqrt(Math.pow(r-a,2)+Math.pow(i-s,2)-Math.pow(o,2));n/=Math.sqrt(Math.pow(h-s,2)+Math.pow(l-a,2));let c=(h-s)*(r-a)-(l-a)*(i-s);switch(!0){case c>=0:c=1;break;case c<0:c=-1}let d=(h-s)*(i-s)+(l-a)*(r-a);switch(!0){case d>=0:d=1;break;case d<0:d=-1}return o=Math.abs(o)*c,n*=d,{distances:o,weights:n}}(0,h.K2)(t,"getSegmentWeights"),d.startBatch();for(const e of Object.values(d.edges()))if(e.data?.()){const{x:i,y:r}=e.source().position(),{x:n,y:o}=e.target().position();if(i!==n&&r!==o){const i=e.sourceEndpoint(),r=e.targetEndpoint(),{sourceDir:n}=x(e),[o,s]=E(n)?[i.x,r.y]:[r.x,i.y],{weights:a,distances:h}=t(i,r,o,s);e.style("segment-distances",h),e.style("segment-weights",a)}}d.endBatch(),p.run()})),p.run(),d.ready((t=>{h.Rm.info("Ready",t),o(d)}))}))}(0,r.pC)([{name:J.prefix,icons:J}]),c.A.use(d),(0,h.K2)(nt,"addServices"),(0,h.K2)(ot,"addJunctions"),(0,h.K2)(st,"positionNodes"),(0,h.K2)(at,"addGroups"),(0,h.K2)(ht,"addEdges"),(0,h.K2)(lt,"getAlignments"),(0,h.K2)(ct,"getRelativeConstraints"),(0,h.K2)(dt,"layoutArchitecture");var gt={parser:K,db:j,renderer:{draw:(0,h.K2)((async(t,e,i,r)=>{const n=r.db,o=n.getServices(),s=n.getJunctions(),l=n.getGroups(),c=n.getEdges(),d=n.getDataStructures(),g=(0,a.D)(e),u=g.append("g");u.attr("class","architecture-edges");const f=g.append("g");f.attr("class","architecture-services");const p=g.append("g");p.attr("class","architecture-groups"),await it(n,f,o),rt(n,f,s);const v=await dt(o,s,l,c,n,d);await tt(u,v),await et(p,v),st(n,v),(0,h.ot)(void 0,g,q("padding"),q("useMaxWidth"))}),"draw")},styles:Z}},628:function(t,e,i){var r;r=function(t){return(()=>{"use strict";var e={45:(t,e,i)=>{var r={};r.layoutBase=i(551),r.CoSEConstants=i(806),r.CoSEEdge=i(767),r.CoSEGraph=i(880),r.CoSEGraphManager=i(578),r.CoSELayout=i(765),r.CoSENode=i(991),r.ConstraintHandler=i(902),t.exports=r},806:(t,e,i)=>{var r=i(551).FDLayoutConstants;function n(){}for(var o in r)n[o]=r[o];n.DEFAULT_USE_MULTI_LEVEL_SCALING=!1,n.DEFAULT_RADIAL_SEPARATION=r.DEFAULT_EDGE_LENGTH,n.DEFAULT_COMPONENT_SEPERATION=60,n.TILE=!0,n.TILING_PADDING_VERTICAL=10,n.TILING_PADDING_HORIZONTAL=10,n.TRANSFORM_ON_CONSTRAINT_HANDLING=!0,n.ENFORCE_CONSTRAINTS=!0,n.APPLY_LAYOUT=!0,n.RELAX_MOVEMENT_ON_CONSTRAINTS=!0,n.TREE_REDUCTION_ON_INCREMENTAL=!0,n.PURE_INCREMENTAL=n.DEFAULT_INCREMENTAL,t.exports=n},767:(t,e,i)=>{var r=i(551).FDLayoutEdge;function n(t,e,i){r.call(this,t,e,i)}for(var o in n.prototype=Object.create(r.prototype),r)n[o]=r[o];t.exports=n},880:(t,e,i)=>{var r=i(551).LGraph;function n(t,e,i){r.call(this,t,e,i)}for(var o in n.prototype=Object.create(r.prototype),r)n[o]=r[o];t.exports=n},578:(t,e,i)=>{var r=i(551).LGraphManager;function n(t){r.call(this,t)}for(var o in n.prototype=Object.create(r.prototype),r)n[o]=r[o];t.exports=n},765:(t,e,i)=>{var r=i(551).FDLayout,n=i(578),o=i(880),s=i(991),a=i(767),h=i(806),l=i(902),c=i(551).FDLayoutConstants,d=i(551).LayoutConstants,g=i(551).Point,u=i(551).PointD,f=i(551).DimensionD,p=i(551).Layout,v=i(551).Integer,y=i(551).IGeometry,m=i(551).LGraph,E=i(551).Transform,N=i(551).LinkedList;function T(){r.call(this),this.toBeTiled={},this.constraints={}}for(var A in T.prototype=Object.create(r.prototype),r)T[A]=r[A];T.prototype.newGraphManager=function(){var t=new n(this);return this.graphManager=t,t},T.prototype.newGraph=function(t){return new o(null,this.graphManager,t)},T.prototype.newNode=function(t){return new s(this.graphManager,t)},T.prototype.newEdge=function(t){return new a(null,null,t)},T.prototype.initParameters=function(){r.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=c.DEFAULT_GRAVITY_STRENGTH,this.compoundGravityConstant=c.DEFAULT_COMPOUND_GRAVITY_STRENGTH,this.gravityRangeFactor=c.DEFAULT_GRAVITY_RANGE_FACTOR,this.compoundGravityRangeFactor=c.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR,this.prunedNodesAll=[],this.growTreeIterations=0,this.afterGrowthIterations=0,this.isTreeGrowing=!1,this.isGrowthFinished=!1)},T.prototype.initSpringEmbedder=function(){r.prototype.initSpringEmbedder.call(this),this.coolingCycle=0,this.maxCoolingCycle=this.maxIterations/c.CONVERGENCE_CHECK_PERIOD,this.finalTemperature=.04,this.coolingAdjuster=1},T.prototype.layout=function(){return d.DEFAULT_CREATE_BENDS_AS_NEEDED&&(this.createBendpoints(),this.graphManager.resetAllEdges()),this.level=0,this.classicLayout()},T.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)h.TREE_REDUCTION_ON_INCREMENTAL&&(this.reduceTrees(),this.graphManager.resetAllNodesToApplyGravitation(),e=new Set(this.getAllNodes()),i=this.nodesWithGravity.filter((function(t){return e.has(t)})),this.graphManager.setAllNodesToApplyGravitation(i));else{var t=this.getFlatForest();if(t.length>0)this.positionNodesRadially(t);else{this.reduceTrees(),this.graphManager.resetAllNodesToApplyGravitation();var e=new Set(this.getAllNodes()),i=this.nodesWithGravity.filter((function(t){return e.has(t)}));this.graphManager.setAllNodesToApplyGravitation(i),this.positionNodesRandomly()}}return Object.keys(this.constraints).length>0&&(l.handleConstraints(this),this.initConstraintVariables()),this.initSpringEmbedder(),h.APPLY_LAYOUT&&this.runSpringEmbedder(),!0},T.prototype.tick=function(){if(this.totalIterations++,this.totalIterations===this.maxIterations&&!this.isTreeGrowing&&!this.isGrowthFinished){if(!(this.prunedNodesAll.length>0))return!0;this.isTreeGrowing=!0}if(this.totalIterations%c.CONVERGENCE_CHECK_PERIOD==0&&!this.isTreeGrowing&&!this.isGrowthFinished){if(this.isConverged()){if(!(this.prunedNodesAll.length>0))return!0;this.isTreeGrowing=!0}this.coolingCycle++,0==this.layoutQuality?this.coolingAdjuster=this.coolingCycle:1==this.layoutQuality&&(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 t=new Set(this.getAllNodes()),e=this.nodesWithGravity.filter((function(e){return t.has(e)}));this.graphManager.setAllNodesToApplyGravitation(e),this.graphManager.updateBounds(),this.updateGrid(),h.PURE_INCREMENTAL?this.coolingFactor=c.DEFAULT_COOLING_FACTOR_INCREMENTAL/2:this.coolingFactor=c.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=c.DEFAULT_COOLING_FACTOR_INCREMENTAL/2*((100-this.afterGrowthIterations)/100):this.coolingFactor=c.DEFAULT_COOLING_FACTOR_INCREMENTAL*((100-this.afterGrowthIterations)/100),this.afterGrowthIterations++}var i=!this.isTreeGrowing&&!this.isGrowthFinished,r=this.growTreeIterations%10==1&&this.isTreeGrowing||this.afterGrowthIterations%10==1&&this.isGrowthFinished;return this.totalDisplacement=0,this.graphManager.updateBounds(),this.calcSpringForces(),this.calcRepulsionForces(i,r),this.calcGravitationalForces(),this.moveNodes(),this.animate(),!1},T.prototype.getPositionsData=function(){for(var t=this.graphManager.getAllNodes(),e={},i=0;i0&&this.updateDisplacements(),e=0;e0&&(r.fixedNodeWeight=o)}if(this.constraints.relativePlacementConstraint){var s=new Map,a=new Map;if(this.dummyToNodeForVerticalAlignment=new Map,this.dummyToNodeForHorizontalAlignment=new Map,this.fixedNodesOnHorizontal=new Set,this.fixedNodesOnVertical=new Set,this.fixedNodeSet.forEach((function(e){t.fixedNodesOnHorizontal.add(e),t.fixedNodesOnVertical.add(e)})),this.constraints.alignmentConstraint){if(this.constraints.alignmentConstraint.vertical){var l=this.constraints.alignmentConstraint.vertical;for(i=0;i=2*t.length/3;r--)e=Math.floor(Math.random()*(r+1)),i=t[r],t[r]=t[e],t[e]=i;return t},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(e){if(e.left){var i=s.has(e.left)?s.get(e.left):e.left,r=s.has(e.right)?s.get(e.right):e.right;t.nodesInRelativeHorizontal.includes(i)||(t.nodesInRelativeHorizontal.push(i),t.nodeToRelativeConstraintMapHorizontal.set(i,[]),t.dummyToNodeForVerticalAlignment.has(i)?t.nodeToTempPositionMapHorizontal.set(i,t.idToNodeMap.get(t.dummyToNodeForVerticalAlignment.get(i)[0]).getCenterX()):t.nodeToTempPositionMapHorizontal.set(i,t.idToNodeMap.get(i).getCenterX())),t.nodesInRelativeHorizontal.includes(r)||(t.nodesInRelativeHorizontal.push(r),t.nodeToRelativeConstraintMapHorizontal.set(r,[]),t.dummyToNodeForVerticalAlignment.has(r)?t.nodeToTempPositionMapHorizontal.set(r,t.idToNodeMap.get(t.dummyToNodeForVerticalAlignment.get(r)[0]).getCenterX()):t.nodeToTempPositionMapHorizontal.set(r,t.idToNodeMap.get(r).getCenterX())),t.nodeToRelativeConstraintMapHorizontal.get(i).push({right:r,gap:e.gap}),t.nodeToRelativeConstraintMapHorizontal.get(r).push({left:i,gap:e.gap})}else{var n=a.has(e.top)?a.get(e.top):e.top,o=a.has(e.bottom)?a.get(e.bottom):e.bottom;t.nodesInRelativeVertical.includes(n)||(t.nodesInRelativeVertical.push(n),t.nodeToRelativeConstraintMapVertical.set(n,[]),t.dummyToNodeForHorizontalAlignment.has(n)?t.nodeToTempPositionMapVertical.set(n,t.idToNodeMap.get(t.dummyToNodeForHorizontalAlignment.get(n)[0]).getCenterY()):t.nodeToTempPositionMapVertical.set(n,t.idToNodeMap.get(n).getCenterY())),t.nodesInRelativeVertical.includes(o)||(t.nodesInRelativeVertical.push(o),t.nodeToRelativeConstraintMapVertical.set(o,[]),t.dummyToNodeForHorizontalAlignment.has(o)?t.nodeToTempPositionMapVertical.set(o,t.idToNodeMap.get(t.dummyToNodeForHorizontalAlignment.get(o)[0]).getCenterY()):t.nodeToTempPositionMapVertical.set(o,t.idToNodeMap.get(o).getCenterY())),t.nodeToRelativeConstraintMapVertical.get(n).push({bottom:o,gap:e.gap}),t.nodeToRelativeConstraintMapVertical.get(o).push({top:n,gap:e.gap})}}));else{var d=new Map,g=new Map;this.constraints.relativePlacementConstraint.forEach((function(t){if(t.left){var e=s.has(t.left)?s.get(t.left):t.left,i=s.has(t.right)?s.get(t.right):t.right;d.has(e)?d.get(e).push(i):d.set(e,[i]),d.has(i)?d.get(i).push(e):d.set(i,[e])}else{var r=a.has(t.top)?a.get(t.top):t.top,n=a.has(t.bottom)?a.get(t.bottom):t.bottom;g.has(r)?g.get(r).push(n):g.set(r,[n]),g.has(n)?g.get(n).push(r):g.set(n,[r])}}));var u=function(t,e){var i=[],r=[],n=new N,o=new Set,s=0;return t.forEach((function(a,h){if(!o.has(h)){i[s]=[],r[s]=!1;var l=h;for(n.push(l),o.add(l),i[s].push(l);0!=n.length;)l=n.shift(),e.has(l)&&(r[s]=!0),t.get(l).forEach((function(t){o.has(t)||(n.push(t),o.add(t),i[s].push(t))}));s++}})),{components:i,isFixed:r}},f=u(d,t.fixedNodesOnHorizontal);this.componentsOnHorizontal=f.components,this.fixedComponentsOnHorizontal=f.isFixed;var p=u(g,t.fixedNodesOnVertical);this.componentsOnVertical=p.components,this.fixedComponentsOnVertical=p.isFixed}}},T.prototype.updateDisplacements=function(){var t=this;if(this.constraints.fixedNodeConstraint&&this.constraints.fixedNodeConstraint.forEach((function(e){var i=t.idToNodeMap.get(e.nodeId);i.displacementX=0,i.displacementY=0})),this.constraints.alignmentConstraint){if(this.constraints.alignmentConstraint.vertical)for(var e=this.constraints.alignmentConstraint.vertical,i=0;i1)for(a=0;ar&&(r=Math.floor(s.y)),o=Math.floor(s.x+h.DEFAULT_COMPONENT_SEPERATION)}this.transform(new u(d.WORLD_CENTER_X-s.x/2,d.WORLD_CENTER_Y-s.y/2))},T.radialLayout=function(t,e,i){var r=Math.max(this.maxDiagonalInTree(t),h.DEFAULT_RADIAL_SEPARATION);T.branchRadialLayout(e,null,0,359,0,r);var n=m.calculateBounds(t),o=new E;o.setDeviceOrgX(n.getMinX()),o.setDeviceOrgY(n.getMinY()),o.setWorldOrgX(i.x),o.setWorldOrgY(i.y);for(var s=0;s1;){var v=p[0];p.splice(0,1);var m=c.indexOf(v);m>=0&&c.splice(m,1),f--,d--}g=null!=e?(c.indexOf(p[0])+1)%f:0;for(var E=Math.abs(r-i)/d,N=g;u!=d;N=++N%f){var A=c[N].getOtherEnd(t);if(A!=e){var w=(i+u*E)%360,L=(w+E)%360;T.branchRadialLayout(A,t,w,L,n+o,o),u++}}},T.maxDiagonalInTree=function(t){for(var e=v.MIN_VALUE,i=0;ie&&(e=r)}return e},T.prototype.calcRepulsionRange=function(){return 2*(this.level+1)*this.idealEdgeLength},T.prototype.groupZeroDegreeMembers=function(){var t=this,e={};this.memberGroups={},this.idToDummyNode={};for(var i=[],r=this.graphManager.getAllNodes(),n=0;n1){var r="DummyCompound_"+i;t.memberGroups[r]=e[i];var n=e[i][0].getParent(),o=new s(t.graphManager);o.id=r,o.paddingLeft=n.paddingLeft||0,o.paddingRight=n.paddingRight||0,o.paddingBottom=n.paddingBottom||0,o.paddingTop=n.paddingTop||0,t.idToDummyNode[r]=o;var a=t.getGraphManager().add(t.newGraph(),o),h=n.getChild();h.add(o);for(var l=0;ln?(r.rect.x-=(r.labelWidth-n)/2,r.setWidth(r.labelWidth),r.labelMarginLeft=(r.labelWidth-n)/2):"right"==r.labelPosHorizontal&&r.setWidth(n+r.labelWidth)),r.labelHeight&&("top"==r.labelPosVertical?(r.rect.y-=r.labelHeight,r.setHeight(o+r.labelHeight),r.labelMarginTop=r.labelHeight):"center"==r.labelPosVertical&&r.labelHeight>o?(r.rect.y-=(r.labelHeight-o)/2,r.setHeight(r.labelHeight),r.labelMarginTop=(r.labelHeight-o)/2):"bottom"==r.labelPosVertical&&r.setHeight(o+r.labelHeight))}}))},T.prototype.repopulateCompounds=function(){for(var t=this.compoundOrder.length-1;t>=0;t--){var e=this.compoundOrder[t],i=e.id,r=e.paddingLeft,n=e.paddingTop,o=e.labelMarginLeft,s=e.labelMarginTop;this.adjustLocations(this.tiledMemberPack[i],e.rect.x,e.rect.y,r,n,o,s)}},T.prototype.repopulateZeroDegreeMembers=function(){var t=this,e=this.tiledZeroDegreePack;Object.keys(e).forEach((function(i){var r=t.idToDummyNode[i],n=r.paddingLeft,o=r.paddingTop,s=r.labelMarginLeft,a=r.labelMarginTop;t.adjustLocations(e[i],r.rect.x,r.rect.y,n,o,s,a)}))},T.prototype.getToBeTiled=function(t){var e=t.id;if(null!=this.toBeTiled[e])return this.toBeTiled[e];var i=t.getChild();if(null==i)return this.toBeTiled[e]=!1,!1;for(var r=i.getNodes(),n=0;n0)return this.toBeTiled[e]=!1,!1;if(null!=o.getChild()){if(!this.getToBeTiled(o))return this.toBeTiled[e]=!1,!1}else this.toBeTiled[o.id]=!1}return this.toBeTiled[e]=!0,!0},T.prototype.getNodeDegree=function(t){t.id;for(var e=t.getEdges(),i=0,r=0;rc&&(c=g.rect.height)}i+=c+t.verticalPadding}},T.prototype.tileCompoundMembers=function(t,e){var i=this;this.tiledMemberPack=[],Object.keys(t).forEach((function(r){var n=e[r];if(i.tiledMemberPack[r]=i.tileNodes(t[r],n.paddingLeft+n.paddingRight),n.rect.width=i.tiledMemberPack[r].width,n.rect.height=i.tiledMemberPack[r].height,n.setCenter(i.tiledMemberPack[r].centerX,i.tiledMemberPack[r].centerY),n.labelMarginLeft=0,n.labelMarginTop=0,h.NODE_DIMENSIONS_INCLUDE_LABELS){var o=n.rect.width,s=n.rect.height;n.labelWidth&&("left"==n.labelPosHorizontal?(n.rect.x-=n.labelWidth,n.setWidth(o+n.labelWidth),n.labelMarginLeft=n.labelWidth):"center"==n.labelPosHorizontal&&n.labelWidth>o?(n.rect.x-=(n.labelWidth-o)/2,n.setWidth(n.labelWidth),n.labelMarginLeft=(n.labelWidth-o)/2):"right"==n.labelPosHorizontal&&n.setWidth(o+n.labelWidth)),n.labelHeight&&("top"==n.labelPosVertical?(n.rect.y-=n.labelHeight,n.setHeight(s+n.labelHeight),n.labelMarginTop=n.labelHeight):"center"==n.labelPosVertical&&n.labelHeight>s?(n.rect.y-=(n.labelHeight-s)/2,n.setHeight(n.labelHeight),n.labelMarginTop=(n.labelHeight-s)/2):"bottom"==n.labelPosVertical&&n.setHeight(s+n.labelHeight))}}))},T.prototype.tileNodes=function(t,e){var i=this.tileNodesByFavoringDim(t,e,!0),r=this.tileNodesByFavoringDim(t,e,!1),n=this.getOrgRatio(i);return this.getOrgRatio(r)a&&(a=t.getWidth())}));var l,c=o/n,d=s/n,g=Math.pow(i-r,2)+4*(c+r)*(d+i)*n,u=(r-i+Math.sqrt(g))/(2*(c+r));e?(l=Math.ceil(u))==u&&l++:l=Math.floor(u);var f=l*(c+r)-r;return a>f&&(f=a),f+=2*r},T.prototype.tileNodesByFavoringDim=function(t,e,i){var r=h.TILING_PADDING_VERTICAL,n=h.TILING_PADDING_HORIZONTAL,o=h.TILING_COMPARE_BY,s={rows:[],rowWidth:[],rowHeight:[],width:0,height:e,verticalPadding:r,horizontalPadding:n,centerX:0,centerY:0};o&&(s.idealRowWidth=this.calcIdealRowWidth(t,i));var a=function(t){return t.rect.width*t.rect.height},l=function(t,e){return a(e)-a(t)};t.sort((function(t,e){var i=l;return s.idealRowWidth?(i=o)(t.id,e.id):i(t,e)}));for(var c=0,d=0,g=0;g0&&(o+=t.horizontalPadding),t.rowWidth[i]=o,t.width0&&(s+=t.verticalPadding);var a=0;s>t.rowHeight[i]&&(a=t.rowHeight[i],t.rowHeight[i]=s,a=t.rowHeight[i]-a),t.height+=a,t.rows[i].push(e)},T.prototype.getShortestRowIndex=function(t){for(var e=-1,i=Number.MAX_VALUE,r=0;ri&&(e=r,i=t.rowWidth[r]);return e},T.prototype.canAddHorizontal=function(t,e,i){if(t.idealRowWidth){var r=t.rows.length-1;return t.rowWidth[r]+e+t.horizontalPadding<=t.idealRowWidth}var n=this.getShortestRowIndex(t);if(n<0)return!0;var o=t.rowWidth[n];if(o+t.horizontalPadding+e<=t.width)return!0;var s,a,h=0;return t.rowHeight[n]0&&(h=i+t.verticalPadding-t.rowHeight[n]),s=t.width-o>=e+t.horizontalPadding?(t.height+h)/(o+e+t.horizontalPadding):(t.height+h)/t.width,h=i+t.verticalPadding,(a=t.widtho&&e!=i){r.splice(-1,1),t.rows[i].push(n),t.rowWidth[e]=t.rowWidth[e]-o,t.rowWidth[i]=t.rowWidth[i]+o,t.width=t.rowWidth[instance.getLongestRowIndex(t)];for(var s=Number.MIN_VALUE,a=0;as&&(s=r[a].height);e>0&&(s+=t.verticalPadding);var h=t.rowHeight[e]+t.rowHeight[i];t.rowHeight[e]=s,t.rowHeight[i]0)for(var d=n;d<=o;d++)l[0]+=this.grid[d][s-1].length+this.grid[d][s].length-1;if(o0)for(d=s;d<=a;d++)l[3]+=this.grid[n-1][d].length+this.grid[n][d].length-1;for(var g,u,f=v.MAX_VALUE,p=0;p{var r=i(551).FDLayoutNode,n=i(551).IMath;function o(t,e,i,n){r.call(this,t,e,i,n)}for(var s in o.prototype=Object.create(r.prototype),r)o[s]=r[s];o.prototype.calculateDisplacement=function(){var t=this.graphManager.getLayout();null!=this.getChild()&&this.fixedNodeWeight?(this.displacementX+=t.coolingFactor*(this.springForceX+this.repulsionForceX+this.gravitationForceX)/this.fixedNodeWeight,this.displacementY+=t.coolingFactor*(this.springForceY+this.repulsionForceY+this.gravitationForceY)/this.fixedNodeWeight):(this.displacementX+=t.coolingFactor*(this.springForceX+this.repulsionForceX+this.gravitationForceX)/this.noOfChildren,this.displacementY+=t.coolingFactor*(this.springForceY+this.repulsionForceY+this.gravitationForceY)/this.noOfChildren),Math.abs(this.displacementX)>t.coolingFactor*t.maxNodeDisplacement&&(this.displacementX=t.coolingFactor*t.maxNodeDisplacement*n.sign(this.displacementX)),Math.abs(this.displacementY)>t.coolingFactor*t.maxNodeDisplacement&&(this.displacementY=t.coolingFactor*t.maxNodeDisplacement*n.sign(this.displacementY)),this.child&&this.child.getNodes().length>0&&this.propogateDisplacementToChildren(this.displacementX,this.displacementY)},o.prototype.propogateDisplacementToChildren=function(t,e){for(var i,r=this.getChild().getNodes(),n=0;n{function r(t){if(Array.isArray(t)){for(var e=0,i=Array(t.length);e0){var o=0;r.forEach((function(t){"horizontal"==e?(d.set(t,h.has(t)?l[h.get(t)]:n.get(t)),o+=d.get(t)):(d.set(t,h.has(t)?c[h.get(t)]:n.get(t)),o+=d.get(t))})),o/=r.length,t.forEach((function(t){i.has(t)||d.set(t,o)}))}else{var s=0;t.forEach((function(t){s+="horizontal"==e?h.has(t)?l[h.get(t)]:n.get(t):h.has(t)?c[h.get(t)]:n.get(t)})),s/=t.length,t.forEach((function(t){d.set(t,s)}))}}));for(var f=function(){var r=u.shift();t.get(r).forEach((function(t){if(d.get(t.id)s&&(s=m),Ea&&(a=E)}}catch(C){u=!0,f=C}finally{try{!g&&v.return&&v.return()}finally{if(u)throw f}}var N=(r+s)/2-(o+a)/2,T=!0,A=!1,w=void 0;try{for(var L,I=t[Symbol.iterator]();!(T=(L=I.next()).done);T=!0){var _=L.value;d.set(_,d.get(_)+N)}}catch(C){A=!0,w=C}finally{try{!T&&I.return&&I.return()}finally{if(A)throw w}}}))}return d},y=function(t){var e=0,i=0,r=0,n=0;if(t.forEach((function(t){t.left?l[h.get(t.left)]-l[h.get(t.right)]>=0?e++:i++:c[h.get(t.top)]-c[h.get(t.bottom)]>=0?r++:n++})),e>i&&r>n)for(var o=0;oi)for(var s=0;sn)for(var a=0;a1)e.fixedNodeConstraint.forEach((function(t,e){T[e]=[t.position.x,t.position.y],A[e]=[l[h.get(t.nodeId)],c[h.get(t.nodeId)]]})),w=!0;else if(e.alignmentConstraint)!function(){var t=0;if(e.alignmentConstraint.vertical){for(var i=e.alignmentConstraint.vertical,n=function(e){var n=new Set;i[e].forEach((function(t){n.add(t)}));var o=new Set([].concat(r(n)).filter((function(t){return I.has(t)}))),s=void 0;s=o.size>0?l[h.get(o.values().next().value)]:p(n).x,i[e].forEach((function(e){T[t]=[s,c[h.get(e)]],A[t]=[l[h.get(e)],c[h.get(e)]],t++}))},o=0;o0?l[h.get(n.values().next().value)]:p(i).y,s[e].forEach((function(e){T[t]=[l[h.get(e)],o],A[t]=[l[h.get(e)],c[h.get(e)]],t++}))},d=0;dx&&(x=M[D].length,O=D);if(x0){var j={x:0,y:0};e.fixedNodeConstraint.forEach((function(t,e){var i,r,n={x:l[h.get(t.nodeId)],y:c[h.get(t.nodeId)]},o=t.position,s=(r=n,{x:(i=o).x-r.x,y:i.y-r.y});j.x+=s.x,j.y+=s.y})),j.x/=e.fixedNodeConstraint.length,j.y/=e.fixedNodeConstraint.length,l.forEach((function(t,e){l[e]+=j.x})),c.forEach((function(t,e){c[e]+=j.y})),e.fixedNodeConstraint.forEach((function(t){l[h.get(t.nodeId)]=t.position.x,c[h.get(t.nodeId)]=t.position.y}))}if(e.alignmentConstraint){if(e.alignmentConstraint.vertical)for(var q=e.alignmentConstraint.vertical,$=function(t){var e=new Set;q[t].forEach((function(t){e.add(t)}));var i=new Set([].concat(r(e)).filter((function(t){return I.has(t)}))),n=void 0;n=i.size>0?l[h.get(i.values().next().value)]:p(e).x,e.forEach((function(t){I.has(t)||(l[h.get(t)]=n)}))},K=0;K0?c[h.get(i.values().next().value)]:p(e).y,e.forEach((function(t){I.has(t)||(c[h.get(t)]=n)}))},J=0;J{e.exports=t}},i={},r=function t(r){var n=i[r];if(void 0!==n)return n.exports;var o=i[r]={exports:{}};return e[r](o,o.exports,t),o.exports}(45);return r})()},t.exports=r(i(7012))},1940:function(t,e,i){var r;r=function(t){return(()=>{"use strict";var e={658:t=>{t.exports=null!=Object.assign?Object.assign.bind(Object):function(t){for(var e=arguments.length,i=Array(e>1?e-1:0),r=1;r{var r=function(t,e){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return function(t,e){var i=[],r=!0,n=!1,o=void 0;try{for(var s,a=t[Symbol.iterator]();!(r=(s=a.next()).done)&&(i.push(s.value),!e||i.length!==e);r=!0);}catch(h){n=!0,o=h}finally{try{!r&&a.return&&a.return()}finally{if(n)throw o}}return i}(t,e);throw new TypeError("Invalid attempt to destructure non-iterable instance")},n=i(140).layoutBase.LinkedList,o={getTopMostNodes:function(t){for(var e={},i=0;i0&&l.merge(t)}));for(var c=0;c1){l=a[0],c=l.connectedEdges().length,a.forEach((function(t){t.connectedEdges().length0&&r.set("dummy"+(r.size+1),u),f},relocateComponent:function(t,e,i){if(!i.fixedNodeConstraint){var n=Number.POSITIVE_INFINITY,o=Number.NEGATIVE_INFINITY,s=Number.POSITIVE_INFINITY,a=Number.NEGATIVE_INFINITY;if("draft"==i.quality){var h=!0,l=!1,c=void 0;try{for(var d,g=e.nodeIndexes[Symbol.iterator]();!(h=(d=g.next()).done);h=!0){var u=d.value,f=r(u,2),p=f[0],v=f[1],y=i.cy.getElementById(p);if(y){var m=y.boundingBox(),E=e.xCoords[v]-m.w/2,N=e.xCoords[v]+m.w/2,T=e.yCoords[v]-m.h/2,A=e.yCoords[v]+m.h/2;Eo&&(o=N),Ta&&(a=A)}}}catch(C){l=!0,c=C}finally{try{!h&&g.return&&g.return()}finally{if(l)throw c}}var w=t.x-(o+n)/2,L=t.y-(a+s)/2;e.xCoords=e.xCoords.map((function(t){return t+w})),e.yCoords=e.yCoords.map((function(t){return t+L}))}else{Object.keys(e).forEach((function(t){var i=e[t],r=i.getRect().x,h=i.getRect().x+i.getRect().width,l=i.getRect().y,c=i.getRect().y+i.getRect().height;ro&&(o=h),la&&(a=c)}));var I=t.x-(o+n)/2,_=t.y-(a+s)/2;Object.keys(e).forEach((function(t){var i=e[t];i.setCenter(i.getCenterX()+I,i.getCenterY()+_)}))}}},calcBoundingBox:function(t,e,i,r){for(var n=Number.MAX_SAFE_INTEGER,o=Number.MIN_SAFE_INTEGER,s=Number.MAX_SAFE_INTEGER,a=Number.MIN_SAFE_INTEGER,h=void 0,l=void 0,c=void 0,d=void 0,g=t.descendants().not(":parent"),u=g.length,f=0;f(h=e[r.get(p.id())]-p.width()/2)&&(n=h),o<(l=e[r.get(p.id())]+p.width()/2)&&(o=l),s>(c=i[r.get(p.id())]-p.height()/2)&&(s=c),a<(d=i[r.get(p.id())]+p.height()/2)&&(a=d)}var v={};return v.topLeftX=n,v.topLeftY=s,v.width=o-n,v.height=a-s,v},calcParentsWithoutChildren:function(t,e){var i=t.collection();return e.nodes(":parent").forEach((function(t){var e=!1;t.children().forEach((function(t){"none"!=t.css("display")&&(e=!0)})),e||i.merge(t)})),i}};t.exports=o},816:(t,e,i)=>{var r=i(548),n=i(140).CoSELayout,o=i(140).CoSENode,s=i(140).layoutBase.PointD,a=i(140).layoutBase.DimensionD,h=i(140).layoutBase.LayoutConstants,l=i(140).layoutBase.FDLayoutConstants,c=i(140).CoSEConstants;t.exports={coseLayout:function(t,e){var i=t.cy,d=t.eles,g=d.nodes(),u=d.edges(),f=void 0,p=void 0,v=void 0,y={};t.randomize&&(f=e.nodeIndexes,p=e.xCoords,v=e.yCoords);var m=function(t){return"function"===typeof t},E=function(t,e){return m(t)?t(e):t},N=r.calcParentsWithoutChildren(i,d);null!=t.nestingFactor&&(c.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=l.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=t.nestingFactor),null!=t.gravity&&(c.DEFAULT_GRAVITY_STRENGTH=l.DEFAULT_GRAVITY_STRENGTH=t.gravity),null!=t.numIter&&(c.MAX_ITERATIONS=l.MAX_ITERATIONS=t.numIter),null!=t.gravityRange&&(c.DEFAULT_GRAVITY_RANGE_FACTOR=l.DEFAULT_GRAVITY_RANGE_FACTOR=t.gravityRange),null!=t.gravityCompound&&(c.DEFAULT_COMPOUND_GRAVITY_STRENGTH=l.DEFAULT_COMPOUND_GRAVITY_STRENGTH=t.gravityCompound),null!=t.gravityRangeCompound&&(c.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=l.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=t.gravityRangeCompound),null!=t.initialEnergyOnIncremental&&(c.DEFAULT_COOLING_FACTOR_INCREMENTAL=l.DEFAULT_COOLING_FACTOR_INCREMENTAL=t.initialEnergyOnIncremental),null!=t.tilingCompareBy&&(c.TILING_COMPARE_BY=t.tilingCompareBy),"proof"==t.quality?h.QUALITY=2:h.QUALITY=0,c.NODE_DIMENSIONS_INCLUDE_LABELS=l.NODE_DIMENSIONS_INCLUDE_LABELS=h.NODE_DIMENSIONS_INCLUDE_LABELS=t.nodeDimensionsIncludeLabels,c.DEFAULT_INCREMENTAL=l.DEFAULT_INCREMENTAL=h.DEFAULT_INCREMENTAL=!t.randomize,c.ANIMATE=l.ANIMATE=h.ANIMATE=t.animate,c.TILE=t.tile,c.TILING_PADDING_VERTICAL="function"===typeof t.tilingPaddingVertical?t.tilingPaddingVertical.call():t.tilingPaddingVertical,c.TILING_PADDING_HORIZONTAL="function"===typeof t.tilingPaddingHorizontal?t.tilingPaddingHorizontal.call():t.tilingPaddingHorizontal,c.DEFAULT_INCREMENTAL=l.DEFAULT_INCREMENTAL=h.DEFAULT_INCREMENTAL=!0,c.PURE_INCREMENTAL=!t.randomize,h.DEFAULT_UNIFORM_LEAF_NODE_SIZES=t.uniformNodeDimensions,"transformed"==t.step&&(c.TRANSFORM_ON_CONSTRAINT_HANDLING=!0,c.ENFORCE_CONSTRAINTS=!1,c.APPLY_LAYOUT=!1),"enforced"==t.step&&(c.TRANSFORM_ON_CONSTRAINT_HANDLING=!1,c.ENFORCE_CONSTRAINTS=!0,c.APPLY_LAYOUT=!1),"cose"==t.step&&(c.TRANSFORM_ON_CONSTRAINT_HANDLING=!1,c.ENFORCE_CONSTRAINTS=!1,c.APPLY_LAYOUT=!0),"all"==t.step&&(t.randomize?c.TRANSFORM_ON_CONSTRAINT_HANDLING=!0:c.TRANSFORM_ON_CONSTRAINT_HANDLING=!1,c.ENFORCE_CONSTRAINTS=!0,c.APPLY_LAYOUT=!0),t.fixedNodeConstraint||t.alignmentConstraint||t.relativePlacementConstraint?c.TREE_REDUCTION_ON_INCREMENTAL=!1:c.TREE_REDUCTION_ON_INCREMENTAL=!0;var T=new n,A=T.newGraphManager();return function t(e,i,n,h){for(var l=i.length,c=0;c0&&t(n.getGraphManager().add(n.newGraph(),u),g,n,h)}}(A.addRoot(),r.getTopMostNodes(g),T,t),function(e,i,r){for(var n=0,o=0,s=0;s0?c.DEFAULT_EDGE_LENGTH=l.DEFAULT_EDGE_LENGTH=n/o:m(t.idealEdgeLength)?c.DEFAULT_EDGE_LENGTH=l.DEFAULT_EDGE_LENGTH=50:c.DEFAULT_EDGE_LENGTH=l.DEFAULT_EDGE_LENGTH=t.idealEdgeLength,c.MIN_REPULSION_DIST=l.MIN_REPULSION_DIST=l.DEFAULT_EDGE_LENGTH/10,c.DEFAULT_RADIAL_SEPARATION=l.DEFAULT_EDGE_LENGTH)}(T,A,u),function(t,e){e.fixedNodeConstraint&&(t.constraints.fixedNodeConstraint=e.fixedNodeConstraint),e.alignmentConstraint&&(t.constraints.alignmentConstraint=e.alignmentConstraint),e.relativePlacementConstraint&&(t.constraints.relativePlacementConstraint=e.relativePlacementConstraint)}(T,t),T.runLayout(),y}}},212:(t,e,i)=>{var r=function(){function t(t,e){for(var i=0;i0)if(d){var g=o.getTopMostNodes(t.eles.nodes());if((h=o.connectComponents(e,t.eles,g)).forEach((function(t){var e=t.boundingBox();l.push({x:e.x1+e.w/2,y:e.y1+e.h/2})})),t.randomize&&h.forEach((function(e){t.eles=e,r.push(s(t))})),"default"==t.quality||"proof"==t.quality){var u=e.collection();if(t.tile){var f=new Map,p=0,v={nodeIndexes:f,xCoords:[],yCoords:[]},y=[];if(h.forEach((function(t,e){0==t.edges().length&&(t.nodes().forEach((function(e,i){u.merge(t.nodes()[i]),e.isParent()||(v.nodeIndexes.set(t.nodes()[i].id(),p++),v.xCoords.push(t.nodes()[0].position().x),v.yCoords.push(t.nodes()[0].position().y))})),y.push(e))})),u.length>1){var m=u.boundingBox();l.push({x:m.x1+m.w/2,y:m.y1+m.h/2}),h.push(u),r.push(v);for(var E=y.length-1;E>=0;E--)h.splice(y[E],1),r.splice(y[E],1),l.splice(y[E],1)}}h.forEach((function(e,i){t.eles=e,n.push(a(t,r[i])),o.relocateComponent(l[i],n[i],t)}))}else h.forEach((function(e,i){o.relocateComponent(l[i],r[i],t)}));var N=new Set;if(h.length>1){var T=[],A=i.filter((function(t){return"none"==t.css("display")}));h.forEach((function(e,i){var s=void 0;if("draft"==t.quality&&(s=r[i].nodeIndexes),e.nodes().not(A).length>0){var a={edges:[],nodes:[]},h=void 0;e.nodes().not(A).forEach((function(e){if("draft"==t.quality)if(e.isParent()){var l=o.calcBoundingBox(e,r[i].xCoords,r[i].yCoords,s);a.nodes.push({x:l.topLeftX,y:l.topLeftY,width:l.width,height:l.height})}else h=s.get(e.id()),a.nodes.push({x:r[i].xCoords[h]-e.boundingbox().w/2,y:r[i].yCoords[h]-e.boundingbox().h/2,width:e.boundingbox().w,height:e.boundingbox().h});else n[i][e.id()]&&a.nodes.push({x:n[i][e.id()].getLeft(),y:n[i][e.id()].getTop(),width:n[i][e.id()].getWidth(),height:n[i][e.id()].getHeight()})})),e.edges().forEach((function(e){var h=e.source(),l=e.target();if("none"!=h.css("display")&&"none"!=l.css("display"))if("draft"==t.quality){var c=s.get(h.id()),d=s.get(l.id()),g=[],u=[];if(h.isParent()){var f=o.calcBoundingBox(h,r[i].xCoords,r[i].yCoords,s);g.push(f.topLeftX+f.width/2),g.push(f.topLeftY+f.height/2)}else g.push(r[i].xCoords[c]),g.push(r[i].yCoords[c]);if(l.isParent()){var p=o.calcBoundingBox(l,r[i].xCoords,r[i].yCoords,s);u.push(p.topLeftX+p.width/2),u.push(p.topLeftY+p.height/2)}else u.push(r[i].xCoords[d]),u.push(r[i].yCoords[d]);a.edges.push({startX:g[0],startY:g[1],endX:u[0],endY:u[1]})}else n[i][h.id()]&&n[i][l.id()]&&a.edges.push({startX:n[i][h.id()].getCenterX(),startY:n[i][h.id()].getCenterY(),endX:n[i][l.id()].getCenterX(),endY:n[i][l.id()].getCenterY()})})),a.nodes.length>0&&(T.push(a),N.add(i))}}));var w=c.packComponents(T,t.randomize).shifts;if("draft"==t.quality)r.forEach((function(t,e){var i=t.xCoords.map((function(t){return t+w[e].dx})),r=t.yCoords.map((function(t){return t+w[e].dy}));t.xCoords=i,t.yCoords=r}));else{var L=0;N.forEach((function(t){Object.keys(n[t]).forEach((function(e){var i=n[t][e];i.setCenter(i.getCenterX()+w[L].dx,i.getCenterY()+w[L].dy)})),L++}))}}}else{var I=t.eles.boundingBox();if(l.push({x:I.x1+I.w/2,y:I.y1+I.h/2}),t.randomize){var _=s(t);r.push(_)}"default"==t.quality||"proof"==t.quality?(n.push(a(t,r[0])),o.relocateComponent(l[0],n[0],t)):o.relocateComponent(l[0],r[0],t)}var C=function(e,i){if("default"==t.quality||"proof"==t.quality){"number"===typeof e&&(e=i);var o=void 0,s=void 0,a=e.data("id");return n.forEach((function(t){a in t&&(o={x:t[a].getRect().getCenterX(),y:t[a].getRect().getCenterY()},s=t[a])})),t.nodeDimensionsIncludeLabels&&(s.labelWidth&&("left"==s.labelPosHorizontal?o.x+=s.labelWidth/2:"right"==s.labelPosHorizontal&&(o.x-=s.labelWidth/2)),s.labelHeight&&("top"==s.labelPosVertical?o.y+=s.labelHeight/2:"bottom"==s.labelPosVertical&&(o.y-=s.labelHeight/2))),void 0==o&&(o={x:e.position("x"),y:e.position("y")}),{x:o.x,y:o.y}}var h=void 0;return r.forEach((function(t){var i=t.nodeIndexes.get(e.id());void 0!=i&&(h={x:t.xCoords[i],y:t.yCoords[i]})})),void 0==h&&(h={x:e.position("x"),y:e.position("y")}),{x:h.x,y:h.y}};if("default"==t.quality||"proof"==t.quality||t.randomize){var M=o.calcParentsWithoutChildren(e,i),x=i.filter((function(t){return"none"==t.css("display")}));t.eles=i.not(x),i.nodes().not(":parent").not(x).layoutPositions(this,t,C),M.length>0&&M.forEach((function(t){t.position(C(t))}))}else console.log("If randomize option is set to false, then quality option must be 'default' or 'proof'.")}}]),t}();t.exports=l},657:(t,e,i)=>{var r=i(548),n=i(140).layoutBase.Matrix,o=i(140).layoutBase.SVD;t.exports={spectralLayout:function(t){var e=t.cy,i=t.eles,s=i.nodes(),a=i.nodes(":parent"),h=new Map,l=new Map,c=new Map,d=[],g=[],u=[],f=[],p=[],v=[],y=[],m=[],E=void 0,N=1e8,T=1e-9,A=t.piTol,w=t.samplingType,L=t.nodeSeparation,I=void 0,_=function(t,e,i){for(var r=[],n=0,o=0,s=0,a=void 0,h=[],c=0,g=1,u=0;u=n;){s=r[n++];for(var f=d[s],y=0;yc&&(c=p[T],g=T)}return g};r.connectComponents(e,i,r.getTopMostNodes(s),h),a.forEach((function(t){r.connectComponents(e,i,r.getTopMostNodes(t.descendants().intersection(i)),h)}));for(var C=0,M=0;M0&&(r.isParent()?d[e].push(c.get(r.id())):d[e].push(r.id()))}))}));var S=function(t){var i=l.get(t),r=void 0;h.get(t).forEach((function(n){r=e.getElementById(n).isParent()?c.get(n):n,d[i].push(r),d[l.get(r)].push(t)}))},P=!0,U=!1,Y=void 0;try{for(var k,H=h.keys()[Symbol.iterator]();!(P=(k=H.next()).done);P=!0)S(k.value)}catch(K){U=!0,Y=K}finally{try{!P&&H.return&&H.return()}finally{if(U)throw Y}}var X=void 0;if((E=l.size)>2){I=E=1)break;l=h}for(var f=0;f=1)break;l=h}for(var y=0;y{var r=i(212),n=function(t){t&&t("layout","fcose",r)};"undefined"!==typeof cytoscape&&n(cytoscape),t.exports=n},140:e=>{e.exports=t}},i={},r=function t(r){var n=i[r];if(void 0!==n)return n.exports;var o=i[r]={exports:{}};return e[r](o,o.exports,t),o.exports}(579);return r})()},t.exports=r(i(628))},7012:function(t){var e;e=function(){return function(t){var e={};function i(r){if(e[r])return e[r].exports;var n=e[r]={i:r,l:!1,exports:{}};return t[r].call(n.exports,n,n.exports,i),n.l=!0,n.exports}return i.m=t,i.c=e,i.i=function(t){return t},i.d=function(t,e,r){i.o(t,e)||Object.defineProperty(t,e,{configurable:!1,enumerable:!0,get:r})},i.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return i.d(e,"a",e),e},i.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},i.p="",i(i.s=28)}([function(t,e,i){"use strict";function r(){}r.QUALITY=1,r.DEFAULT_CREATE_BENDS_AS_NEEDED=!1,r.DEFAULT_INCREMENTAL=!1,r.DEFAULT_ANIMATION_ON_LAYOUT=!0,r.DEFAULT_ANIMATION_DURING_LAYOUT=!1,r.DEFAULT_ANIMATION_PERIOD=50,r.DEFAULT_UNIFORM_LEAF_NODE_SIZES=!1,r.DEFAULT_GRAPH_MARGIN=15,r.NODE_DIMENSIONS_INCLUDE_LABELS=!1,r.SIMPLE_NODE_SIZE=40,r.SIMPLE_NODE_HALF_SIZE=r.SIMPLE_NODE_SIZE/2,r.EMPTY_COMPOUND_NODE_SIZE=40,r.MIN_EDGE_LENGTH=1,r.WORLD_BOUNDARY=1e6,r.INITIAL_WORLD_BOUNDARY=r.WORLD_BOUNDARY/1e3,r.WORLD_CENTER_X=1200,r.WORLD_CENTER_Y=900,t.exports=r},function(t,e,i){"use strict";var r=i(2),n=i(8),o=i(9);function s(t,e,i){r.call(this,i),this.isOverlapingSourceAndTarget=!1,this.vGraphObject=i,this.bendpoints=[],this.source=t,this.target=e}for(var a in s.prototype=Object.create(r.prototype),r)s[a]=r[a];s.prototype.getSource=function(){return this.source},s.prototype.getTarget=function(){return this.target},s.prototype.isInterGraph=function(){return this.isInterGraph},s.prototype.getLength=function(){return this.length},s.prototype.isOverlapingSourceAndTarget=function(){return this.isOverlapingSourceAndTarget},s.prototype.getBendpoints=function(){return this.bendpoints},s.prototype.getLca=function(){return this.lca},s.prototype.getSourceInLca=function(){return this.sourceInLca},s.prototype.getTargetInLca=function(){return this.targetInLca},s.prototype.getOtherEnd=function(t){if(this.source===t)return this.target;if(this.target===t)return this.source;throw"Node is not incident with this edge"},s.prototype.getOtherEndInGraph=function(t,e){for(var i=this.getOtherEnd(t),r=e.getGraphManager().getRoot();;){if(i.getOwner()==e)return i;if(i.getOwner()==r)break;i=i.getOwner().getParent()}return null},s.prototype.updateLength=function(){var t=new Array(4);this.isOverlapingSourceAndTarget=n.getIntersection(this.target.getRect(),this.source.getRect(),t),this.isOverlapingSourceAndTarget||(this.lengthX=t[0]-t[2],this.lengthY=t[1]-t[3],Math.abs(this.lengthX)<1&&(this.lengthX=o.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=o.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY))},s.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=o.sign(this.lengthX)),Math.abs(this.lengthY)<1&&(this.lengthY=o.sign(this.lengthY)),this.length=Math.sqrt(this.lengthX*this.lengthX+this.lengthY*this.lengthY)},t.exports=s},function(t,e,i){"use strict";t.exports=function(t){this.vGraphObject=t}},function(t,e,i){"use strict";var r=i(2),n=i(10),o=i(13),s=i(0),a=i(16),h=i(5);function l(t,e,i,s){null==i&&null==s&&(s=e),r.call(this,s),null!=t.graphManager&&(t=t.graphManager),this.estimatedSize=n.MIN_VALUE,this.inclusionTreeDepth=n.MAX_VALUE,this.vGraphObject=s,this.edges=[],this.graphManager=t,this.rect=null!=i&&null!=e?new o(e.x,e.y,i.width,i.height):new o}for(var c in l.prototype=Object.create(r.prototype),r)l[c]=r[c];l.prototype.getEdges=function(){return this.edges},l.prototype.getChild=function(){return this.child},l.prototype.getOwner=function(){return this.owner},l.prototype.getWidth=function(){return this.rect.width},l.prototype.setWidth=function(t){this.rect.width=t},l.prototype.getHeight=function(){return this.rect.height},l.prototype.setHeight=function(t){this.rect.height=t},l.prototype.getCenterX=function(){return this.rect.x+this.rect.width/2},l.prototype.getCenterY=function(){return this.rect.y+this.rect.height/2},l.prototype.getCenter=function(){return new h(this.rect.x+this.rect.width/2,this.rect.y+this.rect.height/2)},l.prototype.getLocation=function(){return new h(this.rect.x,this.rect.y)},l.prototype.getRect=function(){return this.rect},l.prototype.getDiagonal=function(){return Math.sqrt(this.rect.width*this.rect.width+this.rect.height*this.rect.height)},l.prototype.getHalfTheDiagonal=function(){return Math.sqrt(this.rect.height*this.rect.height+this.rect.width*this.rect.width)/2},l.prototype.setRect=function(t,e){this.rect.x=t.x,this.rect.y=t.y,this.rect.width=e.width,this.rect.height=e.height},l.prototype.setCenter=function(t,e){this.rect.x=t-this.rect.width/2,this.rect.y=e-this.rect.height/2},l.prototype.setLocation=function(t,e){this.rect.x=t,this.rect.y=e},l.prototype.moveBy=function(t,e){this.rect.x+=t,this.rect.y+=e},l.prototype.getEdgeListToNode=function(t){var e=[],i=this;return i.edges.forEach((function(r){if(r.target==t){if(r.source!=i)throw"Incorrect edge source!";e.push(r)}})),e},l.prototype.getEdgesBetween=function(t){var e=[],i=this;return i.edges.forEach((function(r){if(r.source!=i&&r.target!=i)throw"Incorrect edge source and/or target";r.target!=t&&r.source!=t||e.push(r)})),e},l.prototype.getNeighborsList=function(){var t=new Set,e=this;return e.edges.forEach((function(i){if(i.source==e)t.add(i.target);else{if(i.target!=e)throw"Incorrect incidency!";t.add(i.source)}})),t},l.prototype.withChildren=function(){var t=new Set;if(t.add(this),null!=this.child)for(var e=this.child.getNodes(),i=0;ie?(this.rect.x-=(this.labelWidth-e)/2,this.setWidth(this.labelWidth)):"right"==this.labelPosHorizontal&&this.setWidth(e+this.labelWidth)),this.labelHeight&&("top"==this.labelPosVertical?(this.rect.y-=this.labelHeight,this.setHeight(i+this.labelHeight)):"center"==this.labelPosVertical&&this.labelHeight>i?(this.rect.y-=(this.labelHeight-i)/2,this.setHeight(this.labelHeight)):"bottom"==this.labelPosVertical&&this.setHeight(i+this.labelHeight))}}},l.prototype.getInclusionTreeDepth=function(){if(this.inclusionTreeDepth==n.MAX_VALUE)throw"assert failed";return this.inclusionTreeDepth},l.prototype.transform=function(t){var e=this.rect.x;e>s.WORLD_BOUNDARY?e=s.WORLD_BOUNDARY:e<-s.WORLD_BOUNDARY&&(e=-s.WORLD_BOUNDARY);var i=this.rect.y;i>s.WORLD_BOUNDARY?i=s.WORLD_BOUNDARY:i<-s.WORLD_BOUNDARY&&(i=-s.WORLD_BOUNDARY);var r=new h(e,i),n=t.inverseTransformPoint(r);this.setLocation(n.x,n.y)},l.prototype.getLeft=function(){return this.rect.x},l.prototype.getRight=function(){return this.rect.x+this.rect.width},l.prototype.getTop=function(){return this.rect.y},l.prototype.getBottom=function(){return this.rect.y+this.rect.height},l.prototype.getParent=function(){return null==this.owner?null:this.owner.getParent()},t.exports=l},function(t,e,i){"use strict";var r=i(0);function n(){}for(var o in r)n[o]=r[o];n.MAX_ITERATIONS=2500,n.DEFAULT_EDGE_LENGTH=50,n.DEFAULT_SPRING_STRENGTH=.45,n.DEFAULT_REPULSION_STRENGTH=4500,n.DEFAULT_GRAVITY_STRENGTH=.4,n.DEFAULT_COMPOUND_GRAVITY_STRENGTH=1,n.DEFAULT_GRAVITY_RANGE_FACTOR=3.8,n.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR=1.5,n.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION=!0,n.DEFAULT_USE_SMART_REPULSION_RANGE_CALCULATION=!0,n.DEFAULT_COOLING_FACTOR_INCREMENTAL=.3,n.COOLING_ADAPTATION_FACTOR=.33,n.ADAPTATION_LOWER_NODE_LIMIT=1e3,n.ADAPTATION_UPPER_NODE_LIMIT=5e3,n.MAX_NODE_DISPLACEMENT_INCREMENTAL=100,n.MAX_NODE_DISPLACEMENT=3*n.MAX_NODE_DISPLACEMENT_INCREMENTAL,n.MIN_REPULSION_DIST=n.DEFAULT_EDGE_LENGTH/10,n.CONVERGENCE_CHECK_PERIOD=100,n.PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR=.1,n.MIN_EDGE_LENGTH=1,n.GRID_CALCULATION_CHECK_PERIOD=10,t.exports=n},function(t,e,i){"use strict";function r(t,e){null==t&&null==e?(this.x=0,this.y=0):(this.x=t,this.y=e)}r.prototype.getX=function(){return this.x},r.prototype.getY=function(){return this.y},r.prototype.setX=function(t){this.x=t},r.prototype.setY=function(t){this.y=t},r.prototype.getDifference=function(t){return new DimensionD(this.x-t.x,this.y-t.y)},r.prototype.getCopy=function(){return new r(this.x,this.y)},r.prototype.translate=function(t){return this.x+=t.width,this.y+=t.height,this},t.exports=r},function(t,e,i){"use strict";var r=i(2),n=i(10),o=i(0),s=i(7),a=i(3),h=i(1),l=i(13),c=i(12),d=i(11);function g(t,e,i){r.call(this,i),this.estimatedSize=n.MIN_VALUE,this.margin=o.DEFAULT_GRAPH_MARGIN,this.edges=[],this.nodes=[],this.isConnected=!1,this.parent=t,null!=e&&e instanceof s?this.graphManager=e:null!=e&&e instanceof Layout&&(this.graphManager=e.graphManager)}for(var u in g.prototype=Object.create(r.prototype),r)g[u]=r[u];g.prototype.getNodes=function(){return this.nodes},g.prototype.getEdges=function(){return this.edges},g.prototype.getGraphManager=function(){return this.graphManager},g.prototype.getParent=function(){return this.parent},g.prototype.getLeft=function(){return this.left},g.prototype.getRight=function(){return this.right},g.prototype.getTop=function(){return this.top},g.prototype.getBottom=function(){return this.bottom},g.prototype.isConnected=function(){return this.isConnected},g.prototype.add=function(t,e,i){if(null==e&&null==i){var r=t;if(null==this.graphManager)throw"Graph has no graph mgr!";if(this.getNodes().indexOf(r)>-1)throw"Node already in graph!";return r.owner=this,this.getNodes().push(r),r}var n=t;if(!(this.getNodes().indexOf(e)>-1&&this.getNodes().indexOf(i)>-1))throw"Source or target not in graph!";if(e.owner!=i.owner||e.owner!=this)throw"Both owners must be this graph!";return e.owner!=i.owner?null:(n.source=e,n.target=i,n.isInterGraph=!1,this.getEdges().push(n),e.edges.push(n),i!=e&&i.edges.push(n),n)},g.prototype.remove=function(t){var e=t;if(t instanceof a){if(null==e)throw"Node is null!";if(null==e.owner||e.owner!=this)throw"Owner graph is invalid!";if(null==this.graphManager)throw"Owner graph manager is invalid!";for(var i=e.edges.slice(),r=i.length,n=0;n-1&&c>-1))throw"Source and/or target doesn't know this edge!";if(o.source.edges.splice(l,1),o.target!=o.source&&o.target.edges.splice(c,1),-1==(s=o.source.owner.getEdges().indexOf(o)))throw"Not in owner's edge list!";o.source.owner.getEdges().splice(s,1)}},g.prototype.updateLeftTop=function(){for(var t,e,i,r=n.MAX_VALUE,o=n.MAX_VALUE,s=this.getNodes(),a=s.length,h=0;h(t=l.getTop())&&(r=t),o>(e=l.getLeft())&&(o=e)}return r==n.MAX_VALUE?null:(i=void 0!=s[0].getParent().paddingLeft?s[0].getParent().paddingLeft:this.margin,this.left=o-i,this.top=r-i,new c(this.left,this.top))},g.prototype.updateBounds=function(t){for(var e,i,r,o,s,a=n.MAX_VALUE,h=-n.MAX_VALUE,c=n.MAX_VALUE,d=-n.MAX_VALUE,g=this.nodes,u=g.length,f=0;f(e=p.getLeft())&&(a=e),h<(i=p.getRight())&&(h=i),c>(r=p.getTop())&&(c=r),d<(o=p.getBottom())&&(d=o)}var v=new l(a,c,h-a,d-c);a==n.MAX_VALUE&&(this.left=this.parent.getLeft(),this.right=this.parent.getRight(),this.top=this.parent.getTop(),this.bottom=this.parent.getBottom()),s=void 0!=g[0].getParent().paddingLeft?g[0].getParent().paddingLeft:this.margin,this.left=v.x-s,this.right=v.x+v.width+s,this.top=v.y-s,this.bottom=v.y+v.height+s},g.calculateBounds=function(t){for(var e,i,r,o,s=n.MAX_VALUE,a=-n.MAX_VALUE,h=n.MAX_VALUE,c=-n.MAX_VALUE,d=t.length,g=0;g(e=u.getLeft())&&(s=e),a<(i=u.getRight())&&(a=i),h>(r=u.getTop())&&(h=r),c<(o=u.getBottom())&&(c=o)}return new l(s,h,a-s,c-h)},g.prototype.getInclusionTreeDepth=function(){return this==this.graphManager.getRoot()?1:this.parent.getInclusionTreeDepth()},g.prototype.getEstimatedSize=function(){if(this.estimatedSize==n.MIN_VALUE)throw"assert failed";return this.estimatedSize},g.prototype.calcEstimatedSize=function(){for(var t=0,e=this.nodes,i=e.length,r=0;r=this.nodes.length){var h=0;n.forEach((function(e){e.owner==t&&h++})),h==this.nodes.length&&(this.isConnected=!0)}}else this.isConnected=!0},t.exports=g},function(t,e,i){"use strict";var r,n=i(1);function o(t){r=i(6),this.layout=t,this.graphs=[],this.edges=[]}o.prototype.addRoot=function(){var t=this.layout.newGraph(),e=this.layout.newNode(null),i=this.add(t,e);return this.setRootGraph(i),this.rootGraph},o.prototype.add=function(t,e,i,r,n){if(null==i&&null==r&&null==n){if(null==t)throw"Graph is null!";if(null==e)throw"Parent node is null!";if(this.graphs.indexOf(t)>-1)throw"Graph already in this graph mgr!";if(this.graphs.push(t),null!=t.parent)throw"Already has a parent!";if(null!=e.child)throw"Already has a child!";return t.parent=e,e.child=t,t}n=i,i=t;var o=(r=e).getOwner(),s=n.getOwner();if(null==o||o.getGraphManager()!=this)throw"Source not in this graph mgr!";if(null==s||s.getGraphManager()!=this)throw"Target not in this graph mgr!";if(o==s)return i.isInterGraph=!1,o.add(i,r,n);if(i.isInterGraph=!0,i.source=r,i.target=n,this.edges.indexOf(i)>-1)throw"Edge already in inter-graph edge list!";if(this.edges.push(i),null==i.source||null==i.target)throw"Edge source and/or target is null!";if(-1!=i.source.edges.indexOf(i)||-1!=i.target.edges.indexOf(i))throw"Edge already in source and/or target incidency list!";return i.source.edges.push(i),i.target.edges.push(i),i},o.prototype.remove=function(t){if(t instanceof r){var e=t;if(e.getGraphManager()!=this)throw"Graph not in this graph mgr";if(e!=this.rootGraph&&(null==e.parent||e.parent.graphManager!=this))throw"Invalid parent node!";for(var i,o=[],s=(o=o.concat(e.getEdges())).length,a=0;a=e.getRight()?i[0]+=Math.min(e.getX()-t.getX(),t.getRight()-e.getRight()):e.getX()<=t.getX()&&e.getRight()>=t.getRight()&&(i[0]+=Math.min(t.getX()-e.getX(),e.getRight()-t.getRight())),t.getY()<=e.getY()&&t.getBottom()>=e.getBottom()?i[1]+=Math.min(e.getY()-t.getY(),t.getBottom()-e.getBottom()):e.getY()<=t.getY()&&e.getBottom()>=t.getBottom()&&(i[1]+=Math.min(t.getY()-e.getY(),e.getBottom()-t.getBottom()));var o=Math.abs((e.getCenterY()-t.getCenterY())/(e.getCenterX()-t.getCenterX()));e.getCenterY()===t.getCenterY()&&e.getCenterX()===t.getCenterX()&&(o=1);var s=o*i[0],a=i[1]/o;i[0]s)return i[0]=r,i[1]=h,i[2]=o,i[3]=E,!1;if(no)return i[0]=a,i[1]=n,i[2]=y,i[3]=s,!1;if(ro?(i[0]=c,i[1]=d,w=!0):(i[0]=l,i[1]=h,w=!0):I===C&&(r>o?(i[0]=a,i[1]=h,w=!0):(i[0]=g,i[1]=d,w=!0)),-_===C?o>r?(i[2]=m,i[3]=E,L=!0):(i[2]=y,i[3]=v,L=!0):_===C&&(o>r?(i[2]=p,i[3]=v,L=!0):(i[2]=N,i[3]=E,L=!0)),w&&L)return!1;if(r>o?n>s?(M=this.getCardinalDirection(I,C,4),x=this.getCardinalDirection(_,C,2)):(M=this.getCardinalDirection(-I,C,3),x=this.getCardinalDirection(-_,C,1)):n>s?(M=this.getCardinalDirection(-I,C,1),x=this.getCardinalDirection(-_,C,3)):(M=this.getCardinalDirection(I,C,2),x=this.getCardinalDirection(_,C,4)),!w)switch(M){case 1:D=h,O=r+-f/C,i[0]=O,i[1]=D;break;case 2:O=g,D=n+u*C,i[0]=O,i[1]=D;break;case 3:D=d,O=r+f/C,i[0]=O,i[1]=D;break;case 4:O=c,D=n+-u*C,i[0]=O,i[1]=D}if(!L)switch(x){case 1:b=v,R=o+-A/C,i[2]=R,i[3]=b;break;case 2:R=N,b=s+T*C,i[2]=R,i[3]=b;break;case 3:b=E,R=o+A/C,i[2]=R,i[3]=b;break;case 4:R=m,b=s+-T*C,i[2]=R,i[3]=b}}return!1},n.getCardinalDirection=function(t,e,i){return t>e?i:1+i%4},n.getIntersection=function(t,e,i,n){if(null==n)return this.getIntersection2(t,e,i);var o,s,a,h,l,c,d,g=t.x,u=t.y,f=e.x,p=e.y,v=i.x,y=i.y,m=n.x,E=n.y;return 0===(d=(o=p-u)*(h=v-m)-(s=E-y)*(a=g-f))?null:new r((a*(c=m*y-v*E)-h*(l=f*u-g*p))/d,(s*l-o*c)/d)},n.angleOfVector=function(t,e,i,r){var n=void 0;return t!==i?(n=Math.atan((r-e)/(i-t)),i=0){var c=(-h+Math.sqrt(h*h-4*a*l))/(2*a),d=(-h-Math.sqrt(h*h-4*a*l))/(2*a);return c>=0&&c<=1?[c]:d>=0&&d<=1?[d]:null}return null},n.HALF_PI=.5*Math.PI,n.ONE_AND_HALF_PI=1.5*Math.PI,n.TWO_PI=2*Math.PI,n.THREE_PI=3*Math.PI,t.exports=n},function(t,e,i){"use strict";function r(){}r.sign=function(t){return t>0?1:t<0?-1:0},r.floor=function(t){return t<0?Math.ceil(t):Math.floor(t)},r.ceil=function(t){return t<0?Math.floor(t):Math.ceil(t)},t.exports=r},function(t,e,i){"use strict";function r(){}r.MAX_VALUE=2147483647,r.MIN_VALUE=-2147483648,t.exports=r},function(t,e,i){"use strict";var r=function(){function t(t,e){for(var i=0;i0&&e;){for(a.push(l[0]);a.length>0&&e;){var c=a[0];a.splice(0,1),s.add(c);var d=c.getEdges();for(o=0;o-1&&l.splice(p,1)}s=new Set,h=new Map}else t=[]}return t},g.prototype.createDummyNodesForBendpoints=function(t){for(var e=[],i=t.source,r=this.graphManager.calcLowestCommonAncestor(t.source,t.target),n=0;n0){for(var n=this.edgeToDummyNodes.get(i),o=0;o=0&&e.splice(d,1),c.getNeighborsList().forEach((function(t){if(i.indexOf(t)<0){var e=r.get(t)-1;1==e&&h.push(t),r.set(t,e)}}))}i=i.concat(h),1!=e.length&&2!=e.length||(n=!0,o=e[0])}return o},g.prototype.setGraphManager=function(t){this.graphManager=t},t.exports=g},function(t,e,i){"use strict";function r(){}r.seed=1,r.x=0,r.nextDouble=function(){return r.x=1e4*Math.sin(r.seed++),r.x-Math.floor(r.x)},t.exports=r},function(t,e,i){"use strict";var r=i(5);function n(t,e){this.lworldOrgX=0,this.lworldOrgY=0,this.ldeviceOrgX=0,this.ldeviceOrgY=0,this.lworldExtX=1,this.lworldExtY=1,this.ldeviceExtX=1,this.ldeviceExtY=1}n.prototype.getWorldOrgX=function(){return this.lworldOrgX},n.prototype.setWorldOrgX=function(t){this.lworldOrgX=t},n.prototype.getWorldOrgY=function(){return this.lworldOrgY},n.prototype.setWorldOrgY=function(t){this.lworldOrgY=t},n.prototype.getWorldExtX=function(){return this.lworldExtX},n.prototype.setWorldExtX=function(t){this.lworldExtX=t},n.prototype.getWorldExtY=function(){return this.lworldExtY},n.prototype.setWorldExtY=function(t){this.lworldExtY=t},n.prototype.getDeviceOrgX=function(){return this.ldeviceOrgX},n.prototype.setDeviceOrgX=function(t){this.ldeviceOrgX=t},n.prototype.getDeviceOrgY=function(){return this.ldeviceOrgY},n.prototype.setDeviceOrgY=function(t){this.ldeviceOrgY=t},n.prototype.getDeviceExtX=function(){return this.ldeviceExtX},n.prototype.setDeviceExtX=function(t){this.ldeviceExtX=t},n.prototype.getDeviceExtY=function(){return this.ldeviceExtY},n.prototype.setDeviceExtY=function(t){this.ldeviceExtY=t},n.prototype.transformX=function(t){var e=0,i=this.lworldExtX;return 0!=i&&(e=this.ldeviceOrgX+(t-this.lworldOrgX)*this.ldeviceExtX/i),e},n.prototype.transformY=function(t){var e=0,i=this.lworldExtY;return 0!=i&&(e=this.ldeviceOrgY+(t-this.lworldOrgY)*this.ldeviceExtY/i),e},n.prototype.inverseTransformX=function(t){var e=0,i=this.ldeviceExtX;return 0!=i&&(e=this.lworldOrgX+(t-this.ldeviceOrgX)*this.lworldExtX/i),e},n.prototype.inverseTransformY=function(t){var e=0,i=this.ldeviceExtY;return 0!=i&&(e=this.lworldOrgY+(t-this.ldeviceOrgY)*this.lworldExtY/i),e},n.prototype.inverseTransformPoint=function(t){return new r(this.inverseTransformX(t.x),this.inverseTransformY(t.y))},t.exports=n},function(t,e,i){"use strict";var r=i(15),n=i(4),o=i(0),s=i(8),a=i(9);function h(){r.call(this),this.useSmartIdealEdgeLengthCalculation=n.DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION,this.gravityConstant=n.DEFAULT_GRAVITY_STRENGTH,this.compoundGravityConstant=n.DEFAULT_COMPOUND_GRAVITY_STRENGTH,this.gravityRangeFactor=n.DEFAULT_GRAVITY_RANGE_FACTOR,this.compoundGravityRangeFactor=n.DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR,this.displacementThresholdPerNode=3*n.DEFAULT_EDGE_LENGTH/100,this.coolingFactor=n.DEFAULT_COOLING_FACTOR_INCREMENTAL,this.initialCoolingFactor=n.DEFAULT_COOLING_FACTOR_INCREMENTAL,this.totalDisplacement=0,this.oldTotalDisplacement=0,this.maxIterations=n.MAX_ITERATIONS}for(var l in h.prototype=Object.create(r.prototype),r)h[l]=r[l];h.prototype.initParameters=function(){r.prototype.initParameters.call(this,arguments),this.totalIterations=0,this.notAnimatedIterations=0,this.useFRGridVariant=n.DEFAULT_USE_SMART_REPULSION_RANGE_CALCULATION,this.grid=[]},h.prototype.calcIdealEdgeLengths=function(){for(var t,e,i,r,s,a,h,l=this.getGraphManager().getAllEdges(),c=0;cn.ADAPTATION_LOWER_NODE_LIMIT&&(this.coolingFactor=Math.max(this.coolingFactor*n.COOLING_ADAPTATION_FACTOR,this.coolingFactor-(t-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):(t>n.ADAPTATION_LOWER_NODE_LIMIT?this.coolingFactor=Math.max(n.COOLING_ADAPTATION_FACTOR,1-(t-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(5*this.getAllNodes().length,this.maxIterations),this.displacementThresholdPerNode=3*n.DEFAULT_EDGE_LENGTH/100,this.totalDisplacementThreshold=this.displacementThresholdPerNode*this.getAllNodes().length,this.repulsionRange=this.calcRepulsionRange()},h.prototype.calcSpringForces=function(){for(var t,e=this.getAllEdges(),i=0;i0&&void 0!==arguments[0])||arguments[0],a=arguments.length>1&&void 0!==arguments[1]&&arguments[1],h=this.getAllNodes();if(this.useFRGridVariant)for(this.totalIterations%n.GRID_CALCULATION_CHECK_PERIOD==1&&s&&this.updateGrid(),o=new Set,t=0;t(h=e.getEstimatedSize()*this.gravityRangeFactor)||a>h)&&(t.gravitationForceX=-this.gravityConstant*n,t.gravitationForceY=-this.gravityConstant*o):(s>(h=e.getEstimatedSize()*this.compoundGravityRangeFactor)||a>h)&&(t.gravitationForceX=-this.gravityConstant*n*this.compoundGravityConstant,t.gravitationForceY=-this.gravityConstant*o*this.compoundGravityConstant)},h.prototype.isConverged=function(){var t,e=!1;return this.totalIterations>this.maxIterations/3&&(e=Math.abs(this.totalDisplacement-this.oldTotalDisplacement)<2),t=this.totalDisplacement=a.length||l>=a[0].length))for(var c=0;ct}}]),t}();t.exports=o},function(t,e,i){"use strict";function r(){}r.svd=function(t){this.U=null,this.V=null,this.s=null,this.m=0,this.n=0,this.m=t.length,this.n=t[0].length;var e=Math.min(this.m,this.n);this.s=function(t){for(var e=[];t-- >0;)e.push(0);return e}(Math.min(this.m+1,this.n)),this.U=function t(e){if(0==e.length)return 0;for(var i=[],r=0;r0;)e.push(0);return e}(this.n),s=function(t){for(var e=[];t-- >0;)e.push(0);return e}(this.m),a=Math.min(this.m-1,this.n),h=Math.max(0,Math.min(this.n-2,this.m)),l=0;l=0;x--)if(0!==this.s[x]){for(var O=x+1;O=0;P--){if(function(t,e){return t&&e}(P0;){var W=void 0,j=void 0;for(W=_-2;W>=-1&&-1!==W;W--)if(Math.abs(o[W])<=B+V*(Math.abs(this.s[W])+Math.abs(this.s[W+1]))){o[W]=0;break}if(W===_-2)j=4;else{var q=void 0;for(q=_-1;q>=W&&q!==W;q--){var $=(q!==_?Math.abs(o[q]):0)+(q!==W+1?Math.abs(o[q-1]):0);if(Math.abs(this.s[q])<=B+V*$){this.s[q]=0;break}}q===W?j=3:q===_-1?j=1:(j=2,W=q)}switch(W++,j){case 1:var K=o[_-2];o[_-2]=0;for(var Z=_-2;Z>=W;Z--){var Q=r.hypot(this.s[Z],K),J=this.s[Z]/Q,tt=K/Q;this.s[Z]=Q,Z!==W&&(K=-tt*o[Z-1],o[Z-1]=J*o[Z-1]);for(var et=0;et=this.s[W+1]);){var _t=this.s[W];if(this.s[W]=this.s[W+1],this.s[W+1]=_t,WMath.abs(e)?(i=e/t,i=Math.abs(t)*Math.sqrt(1+i*i)):0!=e?(i=t/e,i=Math.abs(e)*Math.sqrt(1+i*i)):i=0,i},t.exports=r},function(t,e,i){"use strict";var r=function(){function t(t,e){for(var i=0;i2&&void 0!==arguments[2]?arguments[2]:1,n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:-1,o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:-1;!function(t,e){if(!(t instanceof e))throw new TypeError("Cannot call a class as a function")}(this,t),this.sequence1=e,this.sequence2=i,this.match_score=r,this.mismatch_penalty=n,this.gap_penalty=o,this.iMax=e.length+1,this.jMax=i.length+1,this.grid=new Array(this.iMax);for(var s=0;s=0;i--){var r=this.listeners[i];r.event===t&&r.callback===e&&this.listeners.splice(i,1)}},n.emit=function(t,e){for(var i=0;i{"use strict";function r(t,e){t.accDescr&&e.setAccDescription?.(t.accDescr),t.accTitle&&e.setAccTitle?.(t.accTitle),t.title&&e.setDiagramTitle?.(t.title)}i.d(e,{S:()=>r}),(0,i(3759).K2)(r,"populateCommonDb")},9837:(t,e,i)=>{"use strict";i.d(e,{m:()=>n});var r=i(3759),n=class{constructor(t){this.init=t,this.records=this.init()}static#t=(()=>(0,r.K2)(this,"ImperativeState"))();reset(){this.records=this.init()}}}}]); -//# sourceMappingURL=415.d031fb39.chunk.js.map \ No newline at end of file diff --git a/frontend/deployed/static/js/415.d031fb39.chunk.js.map b/frontend/deployed/static/js/415.d031fb39.chunk.js.map deleted file mode 100644 index f1e7085..0000000 --- a/frontend/deployed/static/js/415.d031fb39.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"static/js/415.d031fb39.chunk.js","mappings":"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","sources":["../node_modules/mermaid/dist/chunks/mermaid.core/architectureDiagram-IEHRJDOE.mjs","../node_modules/cytoscape-fcose/node_modules/cose-base/cose-base.js","../node_modules/cytoscape-fcose/cytoscape-fcose.js","../node_modules/cytoscape-fcose/node_modules/layout-base/layout-base.js","../node_modules/mermaid/dist/chunks/mermaid.core/chunk-4BMEZGHF.mjs","../node_modules/mermaid/dist/chunks/mermaid.core/chunk-XZIHB7SX.mjs"],"sourcesContent":["import {\n getIconSVG,\n registerIconPacks,\n unknownIcon\n} from \"./chunk-H2D2JQ3I.mjs\";\nimport {\n createText\n} from \"./chunk-C3MQ5ANM.mjs\";\nimport {\n populateCommonDb\n} from \"./chunk-4BMEZGHF.mjs\";\nimport {\n ImperativeState\n} from \"./chunk-XZIHB7SX.mjs\";\nimport \"./chunk-O4NI6UNU.mjs\";\nimport {\n selectSvgElement\n} from \"./chunk-7B677QYD.mjs\";\nimport {\n __name,\n clear,\n defaultConfig_default,\n getAccDescription,\n getAccTitle,\n getConfig2 as getConfig,\n getDiagramTitle,\n log,\n setAccDescription,\n setAccTitle,\n setDiagramTitle,\n setupGraphViewbox\n} from \"./chunk-YTJNT7DU.mjs\";\n\n// src/diagrams/architecture/architectureParser.ts\nimport { parse } from \"@mermaid-js/parser\";\n\n// src/diagrams/architecture/architectureTypes.ts\nvar ArchitectureDirectionName = {\n L: \"left\",\n R: \"right\",\n T: \"top\",\n B: \"bottom\"\n};\nvar ArchitectureDirectionArrow = {\n L: /* @__PURE__ */ __name((scale) => `${scale},${scale / 2} 0,${scale} 0,0`, \"L\"),\n R: /* @__PURE__ */ __name((scale) => `0,${scale / 2} ${scale},0 ${scale},${scale}`, \"R\"),\n T: /* @__PURE__ */ __name((scale) => `0,0 ${scale},0 ${scale / 2},${scale}`, \"T\"),\n B: /* @__PURE__ */ __name((scale) => `${scale / 2},0 ${scale},${scale} 0,${scale}`, \"B\")\n};\nvar ArchitectureDirectionArrowShift = {\n L: /* @__PURE__ */ __name((orig, arrowSize) => orig - arrowSize + 2, \"L\"),\n R: /* @__PURE__ */ __name((orig, _arrowSize) => orig - 2, \"R\"),\n T: /* @__PURE__ */ __name((orig, arrowSize) => orig - arrowSize + 2, \"T\"),\n B: /* @__PURE__ */ __name((orig, _arrowSize) => orig - 2, \"B\")\n};\nvar getOppositeArchitectureDirection = /* @__PURE__ */ __name(function(x) {\n if (isArchitectureDirectionX(x)) {\n return x === \"L\" ? \"R\" : \"L\";\n } else {\n return x === \"T\" ? \"B\" : \"T\";\n }\n}, \"getOppositeArchitectureDirection\");\nvar isArchitectureDirection = /* @__PURE__ */ __name(function(x) {\n const temp = x;\n return temp === \"L\" || temp === \"R\" || temp === \"T\" || temp === \"B\";\n}, \"isArchitectureDirection\");\nvar isArchitectureDirectionX = /* @__PURE__ */ __name(function(x) {\n const temp = x;\n return temp === \"L\" || temp === \"R\";\n}, \"isArchitectureDirectionX\");\nvar isArchitectureDirectionY = /* @__PURE__ */ __name(function(x) {\n const temp = x;\n return temp === \"T\" || temp === \"B\";\n}, \"isArchitectureDirectionY\");\nvar isArchitectureDirectionXY = /* @__PURE__ */ __name(function(a, b) {\n const aX_bY = isArchitectureDirectionX(a) && isArchitectureDirectionY(b);\n const aY_bX = isArchitectureDirectionY(a) && isArchitectureDirectionX(b);\n return aX_bY || aY_bX;\n}, \"isArchitectureDirectionXY\");\nvar isArchitecturePairXY = /* @__PURE__ */ __name(function(pair) {\n const lhs = pair[0];\n const rhs = pair[1];\n const aX_bY = isArchitectureDirectionX(lhs) && isArchitectureDirectionY(rhs);\n const aY_bX = isArchitectureDirectionY(lhs) && isArchitectureDirectionX(rhs);\n return aX_bY || aY_bX;\n}, \"isArchitecturePairXY\");\nvar isValidArchitectureDirectionPair = /* @__PURE__ */ __name(function(x) {\n return x !== \"LL\" && x !== \"RR\" && x !== \"TT\" && x !== \"BB\";\n}, \"isValidArchitectureDirectionPair\");\nvar getArchitectureDirectionPair = /* @__PURE__ */ __name(function(sourceDir, targetDir) {\n const pair = `${sourceDir}${targetDir}`;\n return isValidArchitectureDirectionPair(pair) ? pair : void 0;\n}, \"getArchitectureDirectionPair\");\nvar shiftPositionByArchitectureDirectionPair = /* @__PURE__ */ __name(function([x, y], pair) {\n const lhs = pair[0];\n const rhs = pair[1];\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}, \"shiftPositionByArchitectureDirectionPair\");\nvar getArchitectureDirectionXYFactors = /* @__PURE__ */ __name(function(pair) {\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}, \"getArchitectureDirectionXYFactors\");\nvar getArchitectureDirectionAlignment = /* @__PURE__ */ __name(function(a, b) {\n if (isArchitectureDirectionXY(a, b)) {\n return \"bend\";\n } else if (isArchitectureDirectionX(a)) {\n return \"horizontal\";\n }\n return \"vertical\";\n}, \"getArchitectureDirectionAlignment\");\nvar isArchitectureService = /* @__PURE__ */ __name(function(x) {\n const temp = x;\n return temp.type === \"service\";\n}, \"isArchitectureService\");\nvar isArchitectureJunction = /* @__PURE__ */ __name(function(x) {\n const temp = x;\n return temp.type === \"junction\";\n}, \"isArchitectureJunction\");\nvar edgeData = /* @__PURE__ */ __name((edge) => {\n return edge.data();\n}, \"edgeData\");\nvar nodeData = /* @__PURE__ */ __name((node) => {\n return node.data();\n}, \"nodeData\");\n\n// src/diagrams/architecture/architectureDb.ts\nvar DEFAULT_ARCHITECTURE_CONFIG = defaultConfig_default.architecture;\nvar state = new ImperativeState(() => ({\n nodes: {},\n groups: {},\n edges: [],\n registeredIds: {},\n config: DEFAULT_ARCHITECTURE_CONFIG,\n dataStructures: void 0,\n elements: {}\n}));\nvar clear2 = /* @__PURE__ */ __name(() => {\n state.reset();\n clear();\n}, \"clear\");\nvar addService = /* @__PURE__ */ __name(function({\n id,\n icon,\n in: parent,\n title,\n iconText\n}) {\n if (state.records.registeredIds[id] !== void 0) {\n throw new Error(\n `The service id [${id}] is already in use by another ${state.records.registeredIds[id]}`\n );\n }\n if (parent !== void 0) {\n if (id === parent) {\n throw new Error(`The service [${id}] cannot be placed within itself`);\n }\n if (state.records.registeredIds[parent] === void 0) {\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 (state.records.registeredIds[parent] === \"node\") {\n throw new Error(`The service [${id}]'s parent is not a group`);\n }\n }\n state.records.registeredIds[id] = \"node\";\n state.records.nodes[id] = {\n id,\n type: \"service\",\n icon,\n iconText,\n title,\n edges: [],\n in: parent\n };\n}, \"addService\");\nvar getServices = /* @__PURE__ */ __name(() => Object.values(state.records.nodes).filter(isArchitectureService), \"getServices\");\nvar addJunction = /* @__PURE__ */ __name(function({ id, in: parent }) {\n state.records.registeredIds[id] = \"node\";\n state.records.nodes[id] = {\n id,\n type: \"junction\",\n edges: [],\n in: parent\n };\n}, \"addJunction\");\nvar getJunctions = /* @__PURE__ */ __name(() => Object.values(state.records.nodes).filter(isArchitectureJunction), \"getJunctions\");\nvar getNodes = /* @__PURE__ */ __name(() => Object.values(state.records.nodes), \"getNodes\");\nvar getNode = /* @__PURE__ */ __name((id) => state.records.nodes[id], \"getNode\");\nvar addGroup = /* @__PURE__ */ __name(function({ id, icon, in: parent, title }) {\n if (state.records.registeredIds[id] !== void 0) {\n throw new Error(\n `The group id [${id}] is already in use by another ${state.records.registeredIds[id]}`\n );\n }\n if (parent !== void 0) {\n if (id === parent) {\n throw new Error(`The group [${id}] cannot be placed within itself`);\n }\n if (state.records.registeredIds[parent] === void 0) {\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 (state.records.registeredIds[parent] === \"node\") {\n throw new Error(`The group [${id}]'s parent is not a group`);\n }\n }\n state.records.registeredIds[id] = \"group\";\n state.records.groups[id] = {\n id,\n icon,\n title,\n in: parent\n };\n}, \"addGroup\");\nvar getGroups = /* @__PURE__ */ __name(() => {\n return Object.values(state.records.groups);\n}, \"getGroups\");\nvar addEdge = /* @__PURE__ */ __name(function({\n lhsId,\n rhsId,\n lhsDir,\n rhsDir,\n lhsInto,\n rhsInto,\n lhsGroup,\n rhsGroup,\n title\n}) {\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 ${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 ${rhsDir}`\n );\n }\n if (state.records.nodes[lhsId] === void 0 && state.records.groups[lhsId] === void 0) {\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 (state.records.nodes[rhsId] === void 0 && state.records.groups[lhsId] === void 0) {\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 const lhsGroupId = state.records.nodes[lhsId].in;\n const rhsGroupId = state.records.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 const edge = {\n lhsId,\n lhsDir,\n lhsInto,\n lhsGroup,\n rhsId,\n rhsDir,\n rhsInto,\n rhsGroup,\n title\n };\n state.records.edges.push(edge);\n if (state.records.nodes[lhsId] && state.records.nodes[rhsId]) {\n state.records.nodes[lhsId].edges.push(state.records.edges[state.records.edges.length - 1]);\n state.records.nodes[rhsId].edges.push(state.records.edges[state.records.edges.length - 1]);\n }\n}, \"addEdge\");\nvar getEdges = /* @__PURE__ */ __name(() => state.records.edges, \"getEdges\");\nvar getDataStructures = /* @__PURE__ */ __name(() => {\n if (state.records.dataStructures === void 0) {\n const groupAlignments = {};\n const adjList = Object.entries(state.records.nodes).reduce((prevOuter, [id, service]) => {\n prevOuter[id] = service.edges.reduce((prevInner, edge) => {\n const lhsGroupId = getNode(edge.lhsId)?.in;\n const rhsGroupId = 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 if (edge.lhsId === id) {\n const pair = getArchitectureDirectionPair(edge.lhsDir, edge.rhsDir);\n if (pair) {\n prevInner[pair] = edge.rhsId;\n }\n } else {\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 const firstId = Object.keys(adjList)[0];\n const visited = { [firstId]: 1 };\n const notVisited = Object.keys(adjList).reduce(\n (prev, id) => id === firstId ? prev : { ...prev, [id]: 1 },\n {}\n );\n const BFS = /* @__PURE__ */ __name((startingId) => {\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\n );\n queue.push(rhsId);\n }\n });\n }\n }\n return spatialMap;\n }, \"BFS\");\n const spatialMaps = [BFS(firstId)];\n while (Object.keys(notVisited).length > 0) {\n spatialMaps.push(BFS(Object.keys(notVisited)[0]));\n }\n state.records.dataStructures = {\n adjList,\n spatialMaps,\n groupAlignments\n };\n }\n return state.records.dataStructures;\n}, \"getDataStructures\");\nvar setElementForId = /* @__PURE__ */ __name((id, element) => {\n state.records.elements[id] = element;\n}, \"setElementForId\");\nvar getElementById = /* @__PURE__ */ __name((id) => state.records.elements[id], \"getElementById\");\nvar db = {\n clear: clear2,\n setDiagramTitle,\n getDiagramTitle,\n setAccTitle,\n getAccTitle,\n setAccDescription,\n getAccDescription,\n addService,\n getServices,\n addJunction,\n getJunctions,\n getNodes,\n getNode,\n addGroup,\n getGroups,\n addEdge,\n getEdges,\n setElementForId,\n getElementById,\n getDataStructures\n};\nfunction getConfigField(field) {\n const arch = getConfig().architecture;\n if (arch?.[field]) {\n return arch[field];\n }\n return DEFAULT_ARCHITECTURE_CONFIG[field];\n}\n__name(getConfigField, \"getConfigField\");\n\n// src/diagrams/architecture/architectureParser.ts\nvar populateDb = /* @__PURE__ */ __name((ast, db2) => {\n populateCommonDb(ast, db2);\n ast.groups.map(db2.addGroup);\n ast.services.map((service) => db2.addService({ ...service, type: \"service\" }));\n ast.junctions.map((service) => db2.addJunction({ ...service, type: \"junction\" }));\n ast.edges.map(db2.addEdge);\n}, \"populateDb\");\nvar parser = {\n parse: /* @__PURE__ */ __name(async (input) => {\n const ast = await parse(\"architecture\", input);\n log.debug(ast);\n populateDb(ast, db);\n }, \"parse\")\n};\n\n// src/diagrams/architecture/architectureStyles.ts\nvar getStyles = /* @__PURE__ */ __name((options) => `\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`, \"getStyles\");\nvar architectureStyles_default = getStyles;\n\n// src/diagrams/architecture/architectureRenderer.ts\nimport cytoscape from \"cytoscape\";\nimport fcose from \"cytoscape-fcose\";\nimport { select } from \"d3\";\n\n// src/diagrams/architecture/architectureIcons.ts\nvar wrapIcon = /* @__PURE__ */ __name((icon) => {\n return `${icon}`;\n}, \"wrapIcon\");\nvar architectureIcons = {\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\n// src/diagrams/architecture/svgDraw.ts\nvar drawEdges = /* @__PURE__ */ __name(async function(edgesEl, cy) {\n const padding = getConfigField(\"padding\");\n const iconSize = getConfigField(\"iconSize\");\n const halfIconSize = iconSize / 2;\n const arrowSize = iconSize / 6;\n const halfArrowSize = arrowSize / 2;\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 const groupEdgeShift = padding + 4;\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 if (targetGroup) {\n if (isArchitectureDirectionX(targetDir)) {\n endX += targetDir === \"L\" ? -groupEdgeShift : groupEdgeShift;\n } else {\n endY += targetDir === \"T\" ? -groupEdgeShift : groupEdgeShift + 18;\n }\n }\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 if (edge[0]._private.rscratch) {\n const g = edgesEl.insert(\"g\");\n g.insert(\"path\").attr(\"d\", `M ${startX},${startY} L ${midX},${midY} L${endX},${endY} `).attr(\"class\", \"edge\");\n if (sourceArrow) {\n const xShift = isArchitectureDirectionX(sourceDir) ? ArchitectureDirectionArrowShift[sourceDir](startX, arrowSize) : startX - halfArrowSize;\n const yShift = isArchitectureDirectionY(sourceDir) ? ArchitectureDirectionArrowShift[sourceDir](startY, arrowSize) : startY - halfArrowSize;\n g.insert(\"polygon\").attr(\"points\", ArchitectureDirectionArrow[sourceDir](arrowSize)).attr(\"transform\", `translate(${xShift},${yShift})`).attr(\"class\", \"arrow\");\n }\n if (targetArrow) {\n const xShift = isArchitectureDirectionX(targetDir) ? ArchitectureDirectionArrowShift[targetDir](endX, arrowSize) : endX - halfArrowSize;\n const yShift = isArchitectureDirectionY(targetDir) ? ArchitectureDirectionArrowShift[targetDir](endY, arrowSize) : endY - halfArrowSize;\n g.insert(\"polygon\").attr(\"points\", ArchitectureDirectionArrow[targetDir](arrowSize)).attr(\"transform\", `translate(${xShift},${yShift})`).attr(\"class\", \"arrow\");\n }\n if (label) {\n const axis = !isArchitectureDirectionXY(sourceDir, targetDir) ? isArchitectureDirectionX(sourceDir) ? \"X\" : \"Y\" : \"XY\";\n let width = 0;\n if (axis === \"X\") {\n width = Math.abs(startX - endX);\n } else if (axis === \"Y\") {\n width = Math.abs(startY - endY) / 1.5;\n } else {\n width = Math.abs(startX - endX) / 2;\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 textElem.attr(\"dy\", \"1em\").attr(\"alignment-baseline\", \"middle\").attr(\"dominant-baseline\", \"middle\").attr(\"text-anchor\", \"middle\");\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 textElem.attr(\"dominant-baseline\", \"auto\").attr(\"transform\", `rotate(${-1 * x * y * 45})`);\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}, \"drawEdges\");\nvar drawGroups = /* @__PURE__ */ __name(async function(groupsEl, cy) {\n const padding = getConfigField(\"padding\");\n const groupIconSize = padding * 0.75;\n const fontSize = getConfigField(\"fontSize\");\n const iconSize = getConfigField(\"iconSize\");\n const halfIconSize = iconSize / 2;\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 groupsEl.append(\"rect\").attr(\"x\", x1 + halfIconSize).attr(\"y\", y1 + halfIconSize).attr(\"width\", w).attr(\"height\", h).attr(\"class\", \"node-bkg\");\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(\" + (shiftedX1 + halfIconSize + 1) + \", \" + (shiftedY1 + halfIconSize + 1) + \")\"\n );\n shiftedX1 += groupIconSize;\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.attr(\"dy\", \"1em\").attr(\"alignment-baseline\", \"middle\").attr(\"dominant-baseline\", \"start\").attr(\"text-anchor\", \"start\");\n textElem.attr(\n \"transform\",\n \"translate(\" + (shiftedX1 + halfIconSize + 4) + \", \" + (shiftedY1 + halfIconSize + 2) + \")\"\n );\n }\n }\n })\n );\n}, \"drawGroups\");\nvar drawServices = /* @__PURE__ */ __name(async function(db2, elem, services) {\n for (const service of services) {\n const serviceElem = elem.append(\"g\");\n const iconSize = getConfigField(\"iconSize\");\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 getConfig()\n );\n textElem.attr(\"dy\", \"1em\").attr(\"alignment-baseline\", \"middle\").attr(\"dominant-baseline\", \"middle\").attr(\"text-anchor\", \"middle\");\n textElem.attr(\"transform\", \"translate(\" + iconSize / 2 + \", \" + iconSize + \")\");\n }\n const bkgElem = serviceElem.append(\"g\");\n if (service.icon) {\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.append(\"foreignObject\").attr(\"width\", iconSize).attr(\"height\", iconSize);\n const divElem = fo.append(\"div\").attr(\"class\", \"node-icon-text\").attr(\"style\", `height: ${iconSize}px;`).append(\"div\").html(service.iconText);\n const fontSize = parseInt(\n window.getComputedStyle(divElem.node(), null).getPropertyValue(\"font-size\").replace(/\\D/g, \"\")\n ) ?? 16;\n divElem.attr(\"style\", `-webkit-line-clamp: ${Math.floor((iconSize - 2) / fontSize)};`);\n } else {\n bkgElem.append(\"path\").attr(\"class\", \"node-bkg\").attr(\"id\", \"node-\" + service.id).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 serviceElem.attr(\"class\", \"architecture-service\");\n const { width, height } = serviceElem._groups[0][0].getBBox();\n service.width = width;\n service.height = height;\n db2.setElementForId(service.id, serviceElem);\n }\n return 0;\n}, \"drawServices\");\nvar drawJunctions = /* @__PURE__ */ __name(function(db2, elem, junctions) {\n junctions.forEach((junction) => {\n const junctionElem = elem.append(\"g\");\n const iconSize = getConfigField(\"iconSize\");\n const bkgElem = junctionElem.append(\"g\");\n bkgElem.append(\"rect\").attr(\"id\", \"node-\" + junction.id).attr(\"fill-opacity\", \"0\").attr(\"width\", iconSize).attr(\"height\", iconSize);\n junctionElem.attr(\"class\", \"architecture-junction\");\n const { width, height } = junctionElem._groups[0][0].getBBox();\n junctionElem.width = width;\n junctionElem.height = height;\n db2.setElementForId(junction.id, junctionElem);\n });\n}, \"drawJunctions\");\n\n// src/diagrams/architecture/architectureRenderer.ts\nregisterIconPacks([\n {\n name: architectureIcons.prefix,\n icons: architectureIcons\n }\n]);\ncytoscape.use(fcose);\nfunction addServices(services, cy) {\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: getConfigField(\"iconSize\"),\n height: getConfigField(\"iconSize\")\n },\n classes: \"node-service\"\n });\n });\n}\n__name(addServices, \"addServices\");\nfunction addJunctions(junctions, cy) {\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: getConfigField(\"iconSize\"),\n height: getConfigField(\"iconSize\")\n },\n classes: \"node-junction\"\n });\n });\n}\n__name(addJunctions, \"addJunctions\");\nfunction positionNodes(db2, cy) {\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 const nodeElem = db2.getElementById(data.id);\n nodeElem.attr(\"transform\", \"translate(\" + (data.x || 0) + \",\" + (data.y || 0) + \")\");\n });\n}\n__name(positionNodes, \"positionNodes\");\nfunction addGroups(groups, cy) {\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 },\n classes: \"node-group\"\n });\n });\n}\n__name(addGroups, \"addGroups\");\nfunction addEdges(edges, cy) {\n edges.forEach((parsedEdge) => {\n const { lhsId, rhsId, lhsInto, lhsGroup, rhsInto, lhsDir, rhsDir, rhsGroup, title } = parsedEdge;\n const edgeType = isArchitectureDirectionXY(parsedEdge.lhsDir, parsedEdge.rhsDir) ? \"segments\" : \"straight\";\n const edge = {\n id: `${lhsId}-${rhsId}`,\n label: title,\n source: lhsId,\n sourceDir: lhsDir,\n sourceArrow: lhsInto,\n sourceGroup: lhsGroup,\n sourceEndpoint: lhsDir === \"L\" ? \"0 50%\" : lhsDir === \"R\" ? \"100% 50%\" : lhsDir === \"T\" ? \"50% 0\" : \"50% 100%\",\n target: rhsId,\n targetDir: rhsDir,\n targetArrow: rhsInto,\n targetGroup: rhsGroup,\n targetEndpoint: rhsDir === \"L\" ? \"0 50%\" : rhsDir === \"R\" ? \"100% 50%\" : rhsDir === \"T\" ? \"50% 0\" : \"50% 100%\"\n };\n cy.add({\n group: \"edges\",\n data: edge,\n classes: edgeType\n });\n });\n}\n__name(addEdges, \"addEdges\");\nfunction getAlignments(db2, spatialMaps, groupAlignments) {\n const flattenAlignments = /* @__PURE__ */ __name((alignmentObj, alignmentDir) => {\n return Object.entries(alignmentObj).reduce(\n (prev, [dir, alignments2]) => {\n let cnt = 0;\n const arr = Object.entries(alignments2);\n if (arr.length === 1) {\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];\n if (alignment === alignmentDir) {\n prev[dir] ??= [];\n prev[dir] = [...prev[dir], ...aNodeIds, ...bNodeIds];\n } else if (aGroupId === \"default\" || bGroupId === \"default\") {\n prev[dir] ??= [];\n prev[dir] = [...prev[dir], ...aNodeIds, ...bNodeIds];\n } else {\n const keyA = `${dir}-${cnt++}`;\n prev[keyA] = aNodeIds;\n const keyB = `${dir}-${cnt++}`;\n prev[keyB] = bNodeIds;\n }\n }\n }\n return prev;\n },\n {}\n );\n }, \"flattenAlignments\");\n const alignments = spatialMaps.map((spatialMap) => {\n const horizontalAlignments = {};\n const verticalAlignments = {};\n Object.entries(spatialMap).forEach(([id, [x, y]]) => {\n const nodeGroup = db2.getNode(id)?.in ?? \"default\";\n horizontalAlignments[y] ??= {};\n horizontalAlignments[y][nodeGroup] ??= [];\n horizontalAlignments[y][nodeGroup].push(id);\n verticalAlignments[x] ??= {};\n verticalAlignments[x][nodeGroup] ??= [];\n verticalAlignments[x][nodeGroup].push(id);\n });\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 const [horizontal, vertical] = alignments.reduce(\n ([prevHoriz, prevVert], { horiz, vert }) => {\n return [\n [...prevHoriz, ...horiz],\n [...prevVert, ...vert]\n ];\n },\n [[], []]\n );\n return {\n horizontal,\n vertical\n };\n}\n__name(getAlignments, \"getAlignments\");\nfunction getRelativeConstraints(spatialMaps) {\n const relativeConstraints = [];\n const posToStr = /* @__PURE__ */ __name((pos) => `${pos[0]},${pos[1]}`, \"posToStr\");\n const strToPos = /* @__PURE__ */ __name((pos) => pos.split(\",\").map((p) => parseInt(p)), \"strToPos\");\n spatialMaps.forEach((spatialMap) => {\n const invSpatialMap = Object.fromEntries(\n Object.entries(spatialMap).map(([id, pos]) => [posToStr(pos), id])\n );\n const queue = [posToStr([0, 0])];\n const visited = {};\n const directions = {\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 (newId && !visited[newPos]) {\n queue.push(newPos);\n relativeConstraints.push({\n [ArchitectureDirectionName[dir]]: newId,\n [ArchitectureDirectionName[getOppositeArchitectureDirection(dir)]]: currId,\n gap: 1.5 * getConfigField(\"iconSize\")\n });\n }\n });\n }\n }\n }\n });\n return relativeConstraints;\n}\n__name(getRelativeConstraints, \"getRelativeConstraints\");\nfunction layoutArchitecture(services, junctions, groups, edges, db2, { spatialMaps, groupAlignments }) {\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\": `${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: `${getConfigField(\"padding\")}px`\n }\n }\n ]\n });\n renderEl.remove();\n addGroups(groups, cy);\n addServices(services, cy);\n addJunctions(junctions, cy);\n addEdges(edges, cy);\n const alignmentConstraint = getAlignments(db2, spatialMaps, groupAlignments);\n const relativePlacementConstraint = getRelativeConstraints(spatialMaps);\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) {\n const [nodeA, nodeB] = edge.connectedNodes();\n const { parent: parentA } = nodeData(nodeA);\n const { parent: parentB } = nodeData(nodeB);\n const elasticity = parentA === parentB ? 1.5 * getConfigField(\"iconSize\") : 0.5 * getConfigField(\"iconSize\");\n return elasticity;\n },\n edgeElasticity(edge) {\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 : 1e-3;\n return elasticity;\n },\n alignmentConstraint,\n relativePlacementConstraint\n });\n layout.one(\"layoutstop\", () => {\n function getSegmentWeights(source, target, pointX, pointY) {\n let W, D;\n const { x: sX, y: sY } = source;\n const { x: tX, y: tY } = target;\n D = (pointY - sY + (sX - pointX) * (sY - tY) / (sX - tX)) / 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 const distAB = Math.sqrt(Math.pow(tX - sX, 2) + Math.pow(tY - sY, 2));\n W = W / distAB;\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 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 D = Math.abs(D) * delta1;\n W = W * delta2;\n return {\n distances: D,\n weights: W\n };\n }\n __name(getSegmentWeights, \"getSegmentWeights\");\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) ? [sEP.x, tEP.y] : [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 cy.ready((e) => {\n log.info(\"Ready\", e);\n resolve(cy);\n });\n });\n}\n__name(layoutArchitecture, \"layoutArchitecture\");\nvar draw = /* @__PURE__ */ __name(async (text, id, _version, diagObj) => {\n const db2 = diagObj.db;\n const services = db2.getServices();\n const junctions = db2.getJunctions();\n const groups = db2.getGroups();\n const edges = db2.getEdges();\n const ds = db2.getDataStructures();\n const svg = selectSvgElement(id);\n const edgesElem = svg.append(\"g\");\n edgesElem.attr(\"class\", \"architecture-edges\");\n const servicesElem = svg.append(\"g\");\n servicesElem.attr(\"class\", \"architecture-services\");\n const groupElem = svg.append(\"g\");\n groupElem.attr(\"class\", \"architecture-groups\");\n await drawServices(db2, servicesElem, services);\n drawJunctions(db2, servicesElem, junctions);\n const cy = await layoutArchitecture(services, junctions, groups, edges, db2, ds);\n await drawEdges(edgesElem, cy);\n await drawGroups(groupElem, cy);\n positionNodes(db2, cy);\n setupGraphViewbox(void 0, svg, getConfigField(\"padding\"), getConfigField(\"useMaxWidth\"));\n}, \"draw\");\nvar renderer = { draw };\n\n// src/diagrams/architecture/architectureDiagram.ts\nvar diagram = {\n parser,\n db,\n renderer,\n styles: architectureStyles_default\n};\nexport {\n diagram\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});","(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});","import {\n __name\n} from \"./chunk-YTJNT7DU.mjs\";\n\n// src/diagrams/common/populateCommonDb.ts\nfunction populateCommonDb(ast, db) {\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__name(populateCommonDb, \"populateCommonDb\");\n\nexport {\n populateCommonDb\n};\n","import {\n __name\n} from \"./chunk-YTJNT7DU.mjs\";\n\n// src/utils/imperativeState.ts\nvar ImperativeState = class {\n /**\n * @param init - Function that creates the default state.\n */\n constructor(init) {\n this.init = init;\n this.records = this.init();\n }\n static {\n __name(this, \"ImperativeState\");\n }\n reset() {\n this.records = this.init();\n }\n};\n\nexport {\n ImperativeState\n};\n"],"names":["ArchitectureDirectionName","L","R","T","B","ArchitectureDirectionArrow","__name","scale","ArchitectureDirectionArrowShift","orig","arrowSize","_arrowSize","getOppositeArchitectureDirection","x","isArchitectureDirectionX","isArchitectureDirection","isArchitectureDirectionY","isArchitectureDirectionXY","a","b","aX_bY","aY_bX","isArchitecturePairXY","pair","lhs","rhs","isValidArchitectureDirectionPair","getArchitectureDirectionPair","sourceDir","targetDir","shiftPositionByArchitectureDirectionPair","_ref","y","getArchitectureDirectionXYFactors","getArchitectureDirectionAlignment","isArchitectureService","type","isArchitectureJunction","edgeData","edge","data","nodeData","node","DEFAULT_ARCHITECTURE_CONFIG","defaultConfig_default","architecture","state","ImperativeState","nodes","groups","edges","registeredIds","config","dataStructures","elements","clear2","reset","clear","addService","_ref2","id","icon","in","parent","title","iconText","records","Error","getServices","Object","values","filter","addJunction","_ref3","getJunctions","getNodes","getNode","addGroup","_ref4","getGroups","addEdge","_ref5","lhsId","rhsId","lhsDir","rhsDir","lhsInto","rhsInto","lhsGroup","rhsGroup","lhsGroupId","rhsGroupId","push","length","getEdges","getDataStructures","groupAlignments","adjList","entries","reduce","prevOuter","_ref6","service","prevInner","alignment","firstId","keys","visited","notVisited","prev","BFS","startingId","spatialMap","queue","shift","adj","posX","posY","forEach","_ref7","dir","spatialMaps","setElementForId","element","getElementById","db","setDiagramTitle","getDiagramTitle","setAccTitle","getAccTitle","setAccDescription","getAccDescription","getConfigField","field","arch","getConfig","populateDb","ast","db2","populateCommonDb","map","services","junctions","parser","parse","async","input","log","debug","architectureStyles_default","options","archEdgeWidth","archEdgeColor","archEdgeArrowColor","archGroupBorderColor","archGroupBorderWidth","wrapIcon","architectureIcons","prefix","height","width","icons","database","body","server","disk","internet","cloud","unknown","unknownIcon","blank","drawEdges","edgesEl","cy","padding","iconSize","halfIconSize","halfArrowSize","Promise","all","source","sourceArrow","sourceGroup","target","targetArrow","targetGroup","label","startX","startY","sourceEndpoint","midX","midY","midpoint","endX","endY","targetEndpoint","groupEdgeShift","_private","rscratch","g","insert","attr","xShift","yShift","axis","Math","abs","textElem","append","createText","useHtmlLabels","classes","bboxOrig","getBoundingClientRect","bboxNew","drawGroups","groupsEl","groupIconSize","fontSize","h","w","x1","y1","boundingBox","groupLabelContainer","shiftedX1","shiftedY1","bkgElem","html","getIconSVG","fallbackPrefix","drawServices","elem","serviceElem","divElem","parseInt","window","getComputedStyle","getPropertyValue","replace","floor","_groups","getBBox","drawJunctions","junction","junctionElem","addServices","add","group","addJunctions","positionNodes","position","addGroups","addEdges","parsedEdge","edgeType","getAlignments","flattenAlignments","alignmentObj","alignmentDir","_ref8","alignments2","cnt","arr","i","j","aGroupId","aNodeIds","bGroupId","bNodeIds","alignments","horizontalAlignments","verticalAlignments","_ref9","nodeGroup","horiz","vert","horizontal","vertical","_ref10","_ref11","prevHoriz","prevVert","getRelativeConstraints","relativeConstraints","posToStr","pos","strToPos","split","p","invSpatialMap","fromEntries","_ref12","directions","curr","currId","currPos","_ref13","newPos","newId","gap","layoutArchitecture","_ref14","resolve","renderEl","select","cytoscape","container","document","style","selector","remove","alignmentConstraint","relativePlacementConstraint","layout","name","quality","styleEnabled","animate","nodeDimensionsIncludeLabels","idealEdgeLength","nodeA","nodeB","connectedNodes","parentA","parentB","edgeElasticity","one","getSegmentWeights","pointX","pointY","W","D","sX","sY","tX","tY","sqrt","pow","delta1","delta2","distances","weights","startBatch","sEP","tEP","endBatch","run","ready","e","info","registerIconPacks","use","fcose","diagram","renderer","draw","text","_version","diagObj","ds","svg","selectSvgElement","edgesElem","servicesElem","groupElem","setupGraphViewbox","styles","factory","__WEBPACK_EXTERNAL_MODULE__551__","__webpack_modules__","module","__unused_webpack_exports","__webpack_require__","coseBase","layoutBase","CoSEConstants","CoSEEdge","CoSEGraph","CoSEGraphManager","CoSELayout","CoSENode","ConstraintHandler","exports","FDLayoutConstants","prop","DEFAULT_USE_MULTI_LEVEL_SCALING","DEFAULT_RADIAL_SEPARATION","DEFAULT_EDGE_LENGTH","DEFAULT_COMPONENT_SEPERATION","TILE","TILING_PADDING_VERTICAL","TILING_PADDING_HORIZONTAL","TRANSFORM_ON_CONSTRAINT_HANDLING","ENFORCE_CONSTRAINTS","APPLY_LAYOUT","RELAX_MOVEMENT_ON_CONSTRAINTS","TREE_REDUCTION_ON_INCREMENTAL","PURE_INCREMENTAL","DEFAULT_INCREMENTAL","FDLayoutEdge","vEdge","call","this","prototype","create","LGraph","graphMgr","vGraph","LGraphManager","FDLayout","LayoutConstants","Point","PointD","DimensionD","Layout","Integer","IGeometry","Transform","LinkedList","toBeTiled","constraints","newGraphManager","gm","graphManager","newGraph","newNode","vNode","newEdge","initParameters","arguments","isSubLayout","useSmartIdealEdgeLengthCalculation","DEFAULT_USE_SMART_IDEAL_EDGE_LENGTH_CALCULATION","gravityConstant","DEFAULT_GRAVITY_STRENGTH","compoundGravityConstant","DEFAULT_COMPOUND_GRAVITY_STRENGTH","gravityRangeFactor","DEFAULT_GRAVITY_RANGE_FACTOR","compoundGravityRangeFactor","DEFAULT_COMPOUND_GRAVITY_RANGE_FACTOR","prunedNodesAll","growTreeIterations","afterGrowthIterations","isTreeGrowing","isGrowthFinished","initSpringEmbedder","coolingCycle","maxCoolingCycle","maxIterations","CONVERGENCE_CHECK_PERIOD","finalTemperature","coolingAdjuster","DEFAULT_CREATE_BENDS_AS_NEEDED","createBendpoints","resetAllEdges","level","classicLayout","nodesWithGravity","calculateNodesToApplyGravitationTo","setAllNodesToApplyGravitation","calcNoOfChildrenForAllNodes","calcLowestCommonAncestors","calcInclusionTreeDepths","getRoot","calcEstimatedSize","calcIdealEdgeLengths","incremental","reduceTrees","resetAllNodesToApplyGravitation","allNodes","Set","getAllNodes","intersection","has","forest","getFlatForest","positionNodesRadially","positionNodesRandomly","handleConstraints","initConstraintVariables","runSpringEmbedder","tick","totalIterations","isConverged","layoutQuality","coolingFactor","max","initialCoolingFactor","animationPeriod","ceil","initialAnimationPeriod","updateBounds","updateGrid","growTree","DEFAULT_COOLING_FACTOR_INCREMENTAL","gridUpdateAllowed","forceToNodeSurroundingUpdate","totalDisplacement","calcSpringForces","calcRepulsionForces","calcGravitationalForces","moveNodes","getPositionsData","pData","rect","getCenterX","getCenterY","layoutEnded","ANIMATE","emit","lNodes","calculateDisplacement","updateDisplacements","move","self","idToNodeMap","Map","fixedNodeSet","set","calculateCompoundWeight","compoundNode","getChild","fixedNodeWeight","fixedNodeConstraint","nodeId","nodeToDummyForVerticalAlignment","nodeToDummyForHorizontalAlignment","dummyToNodeForVerticalAlignment","dummyToNodeForHorizontalAlignment","fixedNodesOnHorizontal","fixedNodesOnVertical","verticalAlignment","get","horizontalAlignment","shuffle","array","random","nodesInRelativeHorizontal","nodesInRelativeVertical","nodeToRelativeConstraintMapHorizontal","nodeToRelativeConstraintMapVertical","nodeToTempPositionMapHorizontal","nodeToTempPositionMapVertical","constraint","left","nodeIdLeft","nodeIdRight","right","includes","nodeIdTop","top","nodeIdBottom","bottom","subGraphOnHorizontal","subGraphOnVertical","constructComponents","graph","fixedNodes","components","isFixed","count","value","key","currentNode","neighbor","resultOnHorizontal","componentsOnHorizontal","fixedComponentsOnHorizontal","resultOnVertical","componentsOnVertical","fixedComponentsOnVertical","fixedNode","displacementX","displacementY","allVerticalAlignments","totalDisplacementX","averageDisplacementX","allHorizontalAlignments","totalDisplacementY","averageDisplacementY","displacement","diff","component","sum","actualNodes","averageDisplacement","nodeList","graphs","getGraphs","size","updateConnected","isConnected","concat","getAllEdges","getSource","getTarget","getBendpoints","createDummyNodesForBendpoints","edgeList","getEdgeListToNode","k","multiEdge","currentStartingPoint","numberOfColumns","currentY","currentX","point","tree","centerNode","findCenterOfTree","radialLayout","transform","WORLD_CENTER_X","WORLD_CENTER_Y","startingPoint","radialSep","maxDiagonalInTree","branchRadialLayout","bounds","calculateBounds","setDeviceOrgX","getMinX","setDeviceOrgY","getMinY","setWorldOrgX","setWorldOrgY","bottomRight","getMaxX","getMaxY","inverseTransformPoint","parentOfNode","startAngle","endAngle","distance","radialSeparation","halfInterval","teta","TWO_PI","x_","cos","y_","sin","setCenter","neighborEdges","childCount","startIndex","branchCount","incEdgesCount","getEdgesBetween","temp","splice","index","indexOf","stepAngle","currentNeighbor","getOtherEnd","childStartAngle","childEndAngle","maxDiagonal","MIN_VALUE","diagonal","getDiagonal","calcRepulsionRange","groupZeroDegreeMembers","tempMemberGroups","memberGroups","idToDummyNode","zeroDegree","getParent","getNodeDegreeWithChildren","undefined","getToBeTiled","p_id","dummyCompoundId","dummyCompound","paddingLeft","paddingRight","paddingBottom","paddingTop","dummyParentGraph","getGraphManager","parentGraph","clearCompounds","childGraphMap","idToNode","performDFSOnCompounds","compoundOrder","child","resetAllNodes","tileCompoundMembers","clearZeroDegreeMembers","tiledZeroDegreePack","tileNodes","centerX","centerY","labelMarginLeft","labelMarginTop","NODE_DIMENSIONS_INCLUDE_LABELS","labelWidth","labelPosHorizontal","setWidth","labelHeight","labelPosVertical","setHeight","repopulateCompounds","lCompoundNode","horizontalMargin","verticalMargin","adjustLocations","tiledMemberPack","repopulateZeroDegreeMembers","tiledPack","childGraph","children","theChild","getNodeDegree","degree","fillCompexOrderByDFS","organization","compoundHorizontalMargin","compoundVerticalMargin","compoundLabelMarginLeft","compoundLabelMarginTop","rows","row","maxHeight","lnode","horizontalPadding","verticalPadding","minWidth","horizontalOrg","tileNodesByFavoringDim","verticalOrg","horizontalRatio","getOrgRatio","ratio","calcIdealRowWidth","members","favorHorizontalDim","membersSize","totalWidth","totalHeight","maxWidth","getWidth","getHeight","horizontalCount","averageWidth","averageHeight","delta","horizontalCountDouble","idealWidth","tilingCompareBy","TILING_COMPARE_BY","rowWidth","rowHeight","idealRowWidth","getNodeArea","n","areaCompareFcn","n1","n2","sort","cmpBy","sumCenterX","sumCenterY","lNode","insertNodeToRow","canAddHorizontal","rowIndex","getShortestRowIndex","shiftToLastRow","minCompoundSize","extraHeight","r","min","Number","MAX_VALUE","getLongestRowIndex","extraWidth","lastRowIndex","sri","add_to_row_ratio","add_new_row_ratio","hDiff","longest","last","instance","prevTotal","finalTotal","tilingPreLayout","tilingPostLayout","containsLeaf","prunedNodesInStepTemp","isInterGraph","otherEnd","relativePosition","getOwner","prunedNodesInStep","findPlaceforPrunedNode","gridForPrunedNode","nodeToConnect","prunedNode","startGridX","finishGridX","finishX","startGridY","finishGridY","finishY","controlRegions","grid","minCount","minIndex","FDLayoutNode","IMath","loc","getLayout","springForceX","repulsionForceX","gravitationForceX","springForceY","repulsionForceY","gravitationForceY","noOfChildren","maxNodeDisplacement","sign","propogateDisplacementToChildren","dX","dY","moveBy","setPred1","pred1","getPred1","getPred2","pred2","setNext","next","getNext","setProcessed","processed","isProcessed","_toConsumableArray","Array","isArray","arr2","from","Matrix","SVD","nodeIndexes","xCoords","yCoords","calculateAvgPosition","nodeIdSet","xPosSum","yPosSum","findAppropriatePositionForRelativePlacement","direction","dummyPositions","componentSources","inDegrees","adjacent","positionMap","pastMap","NEGATIVE_INFINITY","fixedIds","fixedId","_position","_loop","fixedPosition","setA","setB","union","_iteratorNormalCompletion","_didIteratorError","_iteratorError","_step","_iterator","Symbol","iterator","done","err","return","setUnion","sinkNodes","_components","isFixedComponent","_iteratorNormalCompletion2","_didIteratorError2","_iteratorError2","_step2","_iterator2","isExist","existAt","ele","minBefore","POSITIVE_INFINITY","minAfter","maxBefore","maxAfter","_iteratorNormalCompletion3","_didIteratorError3","_iteratorError3","_step3","_iterator3","posBefore","posAfter","_iteratorNormalCompletion4","_didIteratorError4","_iteratorError4","_step4","_iterator4","_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","transpose","sourceMatrixTranspose","_i7","multGamma","tempMatrix","multMat","SVDResult","svd","V","U","_i8","temp1","temp2","temp3","dotProduct","translationAmount","pos1","pos2","posInTheory","posDesired","posDiff","xAlign","_loop4","_i9","yAlign","_loop5","_i10","dummyPositionsForVerticalAlignment","dummyPositionsForHorizontalAlignment","_loop6","_i11","_loop7","_i12","dagOnHorizontal","dagOnVertical","_loop8","sourceId","targetNode","_iteratorNormalCompletion5","_didIteratorError5","_iteratorError5","_step5","_iterator5","undirectedOnHorizontal","undirectedOnVertical","reversedDagOnHorizontal","reversedDagOnVertical","componentSourcesOnHorizontal","componentSourcesOnVertical","_loop9","_iteratorNormalCompletion6","_didIteratorError6","_iteratorError6","_step6","_iterator6","_loop10","_iteratorNormalCompletion7","_didIteratorError7","_iteratorError7","_step7","_iterator7","_i13","_node","__webpack_module_cache__","__webpack_exports__","moduleId","cachedModule","require","__WEBPACK_EXTERNAL_MODULE__140__","assign","bind","tgt","_len","srcs","_key","src","_slicedToArray","_arr","_n","_d","_e","_s","sliceIterator","TypeError","auxiliary","nodesMap","roots","eles","topMostNodes","dummyNodes","visitedTopMostNodes","minDegreeNode","minDegree","nodesConnectedToDummy","cmpt","collection","childrenOfCurrentNode","merge","descendants","neighborNodes","neighborhood","edgesWith","neighborNode","ancestors","connectedEdges","difference","originalCenter","componentResult","minXCoord","maxXCoord","minYCoord","maxYCoord","cyNode","nodeBB","leftX","rightX","topY","bottomY","diffOnX","diffOnY","item","getRect","_diffOnX","_diffOnY","parentNode","MAX_SAFE_INTEGER","MIN_SAFE_INTEGER","nodeLeft","nodeRight","nodeTop","nodeBottom","not","s","topLeftX","topLeftY","parentsWithoutChildren","check","css","aux","coseLayout","spectralResult","idToLNode","randomize","isFn","fn","optFn","opt","calcParentsWithoutChildren","nestingFactor","PER_LEVEL_IDEAL_EDGE_LENGTH_FACTOR","gravity","numIter","MAX_ITERATIONS","gravityRange","gravityCompound","gravityRangeCompound","initialEnergyOnIncremental","QUALITY","tile","tilingPaddingVertical","tilingPaddingHorizontal","DEFAULT_UNIFORM_LEAF_NODE_SIZES","uniformNodeDimensions","step","processChildrenList","children_of_children","theNode","dimensions","layoutDimensions","outerWidth","outerHeight","isParent","parentInfo","calcBoundingBox","parseFloat","nodeRepulsion","includeLabels","includeNodes","includeOverlays","isNaN","addRoot","getTopMostNodes","idealLengthTotal","edgeCount","sourceNode","e1","idealLength","MIN_REPULSION_DIST","processEdges","processConstraints","runLayout","_createClass","defineProperties","props","descriptor","enumerable","configurable","writable","defineProperty","Constructor","protoProps","staticProps","spectralLayout","defaults","freeze","animationDuration","animationEasing","fit","packComponents","samplingType","sampleSize","nodeSeparation","piTol","stop","_classCallCheck","coseResult","componentCenters","layUtil","packingEnabled","layoutUtilities","connectComponents","toBeTiledNodes","tempSpectralResult","indexesToBeDeleted","_boundingBox","relocateComponent","componentsEvaluated","subgraphs","hiddenEles","subgraph","nodeIndex","boundingbox","getLeft","getTop","sourceNodeIndex","targetNodeIndex","sourceCenter","targetCenter","_parentInfo","shiftResult","shifts","result","newXCoords","dx","newYCoords","dy","_count","nodeRectangle","getPositions","theId","_pos","_hiddenEles","layoutPositions","console","parentNodes","parentChildMap","allNodesNeighborhood","samplesColumn","minDistancesColumn","C","PHI","INV","nodeSize","infinity","small","pivot","samplingMethod","path","front","back","current","max_dist","max_ind","neighbors","ele2","eleIndex","disconnectedId","_i14","_i15","sample","flag","randomSampleCR","_j","allBFS","a_q","S","a_u","a_v","max_s","a_Sig","theta1","theta2","Y1","Y2","V1","V2","normalize","previous","multL","minusOp","multCons","powerIteration","firstNode","firstNodePos","firstNodeWidth","secondNodeWidth","impl","register","modules","installedModules","l","m","c","d","getter","o","__esModule","object","property","hasOwnProperty","DEFAULT_ANIMATION_ON_LAYOUT","DEFAULT_ANIMATION_DURING_LAYOUT","DEFAULT_ANIMATION_PERIOD","DEFAULT_GRAPH_MARGIN","SIMPLE_NODE_SIZE","SIMPLE_NODE_HALF_SIZE","EMPTY_COMPOUND_NODE_SIZE","MIN_EDGE_LENGTH","WORLD_BOUNDARY","INITIAL_WORLD_BOUNDARY","LGraphObject","LEdge","isOverlapingSourceAndTarget","vGraphObject","bendpoints","getLength","getLca","lca","getSourceInLca","sourceInLca","getTargetInLca","targetInLca","getOtherEndInGraph","root","updateLength","clipPointCoordinates","getIntersection","lengthX","lengthY","updateLengthSimple","RectangleD","RandomSeed","LNode","estimatedSize","inclusionTreeDepth","owner","getCenter","getLocation","getHalfTheDiagonal","setRect","upperLeft","dimension","cx","setLocation","to","other","getNeighborsList","withChildren","withNeighborsList","getNoOfChildren","getEstimatedSize","scatter","randomCenterX","randomCenterY","minX","maxX","nextDouble","minY","maxY","getRight","getBottom","getInclusionTreeDepth","trans","leftTop","vLeftTop","DEFAULT_SPRING_STRENGTH","DEFAULT_REPULSION_STRENGTH","DEFAULT_USE_SMART_REPULSION_RANGE_CALCULATION","COOLING_ADAPTATION_FACTOR","ADAPTATION_LOWER_NODE_LIMIT","ADAPTATION_UPPER_NODE_LIMIT","MAX_NODE_DISPLACEMENT_INCREMENTAL","MAX_NODE_DISPLACEMENT","GRID_CALCULATION_CHECK_PERIOD","getX","getY","setX","setY","getDifference","pt","getCopy","translate","dim","obj2","margin","obj1","obj","edgesToBeRemoved","slice","sourceIndex","targetIndex","updateLeftTop","recursive","boundingRect","noOfVisitedInThisGraph","visitedNode","ngraph","nnode","setRootGraph","rootGraph","sourceGraph","targetGraph","lObj","nodesToBeRemoved","allEdges","allNodesToApplyGravitation","getAllNodesToApplyGravitation","isOneAncestorOfOther","secondNode","ownerGraph","sourceAncestorGraph","targetAncestorGraph","calcLowestCommonAncestor","firstOwnerGraph","secondOwnerGraph","depth","includesInvalidEdge","edgesToRemove","calcSeparationAmount","rectA","rectB","overlapAmount","separationBuffer","intersects","decideDirectionsForOverlappingNodes","slope","moveByY","moveByX","getIntersection2","p1x","p1y","p2x","p2y","topLeftAx","topLeftAy","topRightAx","bottomLeftAx","bottomLeftAy","bottomRightAx","halfWidthA","getWidthHalf","halfHeightA","getHeightHalf","topLeftBx","topLeftBy","topRightBx","bottomLeftBx","bottomLeftBy","bottomRightBx","halfWidthB","halfHeightB","clipPointAFound","clipPointBFound","slopeA","slopeB","slopePrime","cardinalDirectionA","cardinalDirectionB","tempPointAx","tempPointAy","tempPointBx","tempPointBy","getCardinalDirection","line","s1","s2","f1","f2","a1","a2","b1","b2","c1","c2","denom","x2","y2","x3","y3","x4","y4","angleOfVector","Cx","Cy","Nx","Ny","C_angle","atan","PI","ONE_AND_HALF_PI","HALF_PI","doIntersect","p1","p2","p3","p4","q","det","lambda","gamma","findCircleLineIntersections","Ex","Ey","Lx","Ly","t1","t2","THREE_PI","nodeFrom","list","head","tail","_remove","vals","_this","v","val","otherNode","constructor","equals","toString","_typeof","UniqueIDGeneretor","lastID","createID","isPrimitive","uniqueID","getString","arg","Emitter","isRemoteUse","createBendsAsNeeded","animationOnLayout","animationDuringLayout","uniformLeafNodeSizes","edgeToDummyNodes","isLayoutFinished","RANDOM_SEED","checkLayoutSuccess","isLayoutSuccessfull","doPostLayout","update","update2","createBendpointsFromDummyNodes","newLeftTop","flatForest","isForest","isFlat","toBeVisited","parents","unProcessedNodes","dummyNode","Dimension","dummyEdge","lEdge","ebp","sliderValue","defaultValue","minDiv","maxMul","removedNodes","remainingDegrees","foundCenter","tempList","tempList2","neighbour","newDegree","setGraphManager","seed","lworldOrgX","lworldOrgY","ldeviceOrgX","ldeviceOrgY","lworldExtX","lworldExtY","ldeviceExtX","ldeviceExtY","getWorldOrgX","wox","getWorldOrgY","woy","getWorldExtX","setWorldExtX","wex","getWorldExtY","setWorldExtY","wey","getDeviceOrgX","dox","getDeviceOrgY","doy","getDeviceExtX","setDeviceExtX","dex","getDeviceExtY","setDeviceExtY","dey","transformX","xDevice","worldExtX","transformY","yDevice","worldExtY","inverseTransformX","xWorld","deviceExtX","inverseTransformY","yWorld","deviceExtY","inPoint","displacementThresholdPerNode","oldTotalDisplacement","notAnimatedIterations","useFRGridVariant","originalIdealLength","lcaDepth","sizeOfSourceInLca","sizeOfTargetInLca","totalDisplacementThreshold","repulsionRange","lEdges","calcSpringForce","processedNodeSet","calculateRepulsionForceOfANode","calcRepulsionForce","calcGravitationalForce","springForce","distanceX","distanceY","distanceSquared","repulsionForce","clipPoints","childrenConstant","ownerCenterX","ownerCenterY","absDistanceX","absDistanceY","converged","oscilating","calcGrid","sizeX","sizeY","addNodeToGrid","setGridCoordinates","surrounding","_startX","_finishX","_startY","_finishY","HashMap","put","contains","keySet","HashSet","isEmpty","addAllTo","addAll","array1","array2","constant","product","mag","magnitude","_sum","_sum2","_j2","Quicksort","A","compareFunction","_defaultCompareFunction","_quicksort","_partition","_get","_swap","get_object_at","set_object_at","_set","nu","allocate","dims","work","nct","nrt","hypot","t","wantu","_t","_j3","_k","_j4","_t2","_i16","_k2","_j5","_t3","_i17","_i18","_i19","pp","eps","tiny","_k3","kase","ks","_t4","f","_j6","_t5","cs","sn","_i20","_f","_j7","_t6","_cs","_sn","_i21","sp","spm1","epm1","sk","ek","_f2","_j8","_t7","_cs2","_sn2","_i22","_i23","_i24","_t8","_i25","_i26","NeedlemanWunsch","sequence1","sequence2","match_score","mismatch_penalty","gap_penalty","iMax","jMax","tracebackGrid","score","computeGrids","maxOf","indices","arrayAllMaxIndexes","inProcessAlignments","seq1","seq2","indexes","getAllIndexes","apply","listeners","addListener","event","callback","removeListener","accDescr","accTitle","init"],"sourceRoot":""} \ No newline at end of file diff --git a/frontend/deployed/static/js/448.0ebff170.chunk.js b/frontend/deployed/static/js/448.0ebff170.chunk.js deleted file mode 100644 index c87dd75..0000000 --- a/frontend/deployed/static/js/448.0ebff170.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(self.webpackChunkbackstory=self.webpackChunkbackstory||[]).push([[448],{3448:(t,e,n)=>{"use strict";n.d(e,{diagram:()=>Yt});var i=n(634),s=n(3759),r=n(3755),a=n(446),o=n(7140),c=n(8988),l=n(7076),d=n(700),u=function(){var t=(0,s.K2)((function(t,e,n,i){for(n=n||{},i=t.length;i--;n[t[i]]=e);return n}),"o"),e=[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],n=[1,26],i=[1,27],r=[1,28],a=[1,29],o=[1,30],c=[1,31],l=[1,32],d=[1,33],u=[1,34],h=[1,9],f=[1,10],y=[1,11],k=[1,12],m=[1,13],p=[1,14],g=[1,15],b=[1,16],T=[1,19],x=[1,20],v=[1,21],w=[1,22],_=[1,23],D=[1,25],$=[1,35],C={trace:(0,s.K2)((function(){}),"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:(0,s.K2)((function(t,e,n,i,s,r,a){var o=r.length-1;switch(s){case 1:return r[o-1];case 2:case 6:case 7:this.$=[];break;case 3:r[o-1].push(r[o]),this.$=r[o-1];break;case 4:case 5:this.$=r[o];break;case 8:i.setWeekday("monday");break;case 9:i.setWeekday("tuesday");break;case 10:i.setWeekday("wednesday");break;case 11:i.setWeekday("thursday");break;case 12:i.setWeekday("friday");break;case 13:i.setWeekday("saturday");break;case 14:i.setWeekday("sunday");break;case 15:i.setWeekend("friday");break;case 16:i.setWeekend("saturday");break;case 17:i.setDateFormat(r[o].substr(11)),this.$=r[o].substr(11);break;case 18:i.enableInclusiveEndDates(),this.$=r[o].substr(18);break;case 19:i.TopAxis(),this.$=r[o].substr(8);break;case 20:i.setAxisFormat(r[o].substr(11)),this.$=r[o].substr(11);break;case 21:i.setTickInterval(r[o].substr(13)),this.$=r[o].substr(13);break;case 22:i.setExcludes(r[o].substr(9)),this.$=r[o].substr(9);break;case 23:i.setIncludes(r[o].substr(9)),this.$=r[o].substr(9);break;case 24:i.setTodayMarker(r[o].substr(12)),this.$=r[o].substr(12);break;case 27:i.setDiagramTitle(r[o].substr(6)),this.$=r[o].substr(6);break;case 28:this.$=r[o].trim(),i.setAccTitle(this.$);break;case 29:case 30:this.$=r[o].trim(),i.setAccDescription(this.$);break;case 31:i.addSection(r[o].substr(8)),this.$=r[o].substr(8);break;case 33:i.addTask(r[o-1],r[o]),this.$="task";break;case 34:this.$=r[o-1],i.setClickEvent(r[o-1],r[o],null);break;case 35:this.$=r[o-2],i.setClickEvent(r[o-2],r[o-1],r[o]);break;case 36:this.$=r[o-2],i.setClickEvent(r[o-2],r[o-1],null),i.setLink(r[o-2],r[o]);break;case 37:this.$=r[o-3],i.setClickEvent(r[o-3],r[o-2],r[o-1]),i.setLink(r[o-3],r[o]);break;case 38:this.$=r[o-2],i.setClickEvent(r[o-2],r[o],null),i.setLink(r[o-2],r[o-1]);break;case 39:this.$=r[o-3],i.setClickEvent(r[o-3],r[o-1],r[o]),i.setLink(r[o-3],r[o-2]);break;case 40:this.$=r[o-1],i.setLink(r[o-1],r[o]);break;case 41:case 47:this.$=r[o-1]+" "+r[o];break;case 42:case 43:case 45:this.$=r[o-2]+" "+r[o-1]+" "+r[o];break;case 44:case 46:this.$=r[o-3]+" "+r[o-2]+" "+r[o-1]+" "+r[o]}}),"anonymous"),table:[{3:1,4:[1,2]},{1:[3]},t(e,[2,2],{5:3}),{6:[1,4],7:5,8:[1,6],9:7,10:[1,8],11:17,12:n,13:i,14:r,15:a,16:o,17:c,18:l,19:18,20:d,21:u,22:h,23:f,24:y,25:k,26:m,27:p,28:g,29:b,30:T,31:x,33:v,35:w,36:_,37:24,38:D,40:$},t(e,[2,7],{1:[2,1]}),t(e,[2,3]),{9:36,11:17,12:n,13:i,14:r,15:a,16:o,17:c,18:l,19:18,20:d,21:u,22:h,23:f,24:y,25:k,26:m,27:p,28:g,29:b,30:T,31:x,33:v,35:w,36:_,37:24,38:D,40:$},t(e,[2,5]),t(e,[2,6]),t(e,[2,17]),t(e,[2,18]),t(e,[2,19]),t(e,[2,20]),t(e,[2,21]),t(e,[2,22]),t(e,[2,23]),t(e,[2,24]),t(e,[2,25]),t(e,[2,26]),t(e,[2,27]),{32:[1,37]},{34:[1,38]},t(e,[2,30]),t(e,[2,31]),t(e,[2,32]),{39:[1,39]},t(e,[2,8]),t(e,[2,9]),t(e,[2,10]),t(e,[2,11]),t(e,[2,12]),t(e,[2,13]),t(e,[2,14]),t(e,[2,15]),t(e,[2,16]),{41:[1,40],43:[1,41]},t(e,[2,4]),t(e,[2,28]),t(e,[2,29]),t(e,[2,33]),t(e,[2,34],{42:[1,42],43:[1,43]}),t(e,[2,40],{41:[1,44]}),t(e,[2,35],{43:[1,45]}),t(e,[2,36]),t(e,[2,38],{42:[1,46]}),t(e,[2,37]),t(e,[2,39])],defaultActions:{},parseError:(0,s.K2)((function(t,e){if(!e.recoverable){var n=new Error(t);throw n.hash=e,n}this.trace(t)}),"parseError"),parse:(0,s.K2)((function(t){var e=this,n=[0],i=[],r=[null],a=[],o=this.table,c="",l=0,d=0,u=0,h=a.slice.call(arguments,1),f=Object.create(this.lexer),y={yy:{}};for(var k in this.yy)Object.prototype.hasOwnProperty.call(this.yy,k)&&(y.yy[k]=this.yy[k]);f.setInput(t,y.yy),y.yy.lexer=f,y.yy.parser=this,"undefined"==typeof f.yylloc&&(f.yylloc={});var m=f.yylloc;a.push(m);var p=f.options&&f.options.ranges;function g(){var t;return"number"!==typeof(t=i.pop()||f.lex()||1)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"===typeof y.yy.parseError?this.parseError=y.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError,(0,s.K2)((function(t){n.length=n.length-2*t,r.length=r.length-t,a.length=a.length-t}),"popStack"),(0,s.K2)(g,"lex");for(var b,T,x,v,w,_,D,$,C,S={};;){if(x=n[n.length-1],this.defaultActions[x]?v=this.defaultActions[x]:(null!==b&&"undefined"!=typeof b||(b=g()),v=o[x]&&o[x][b]),"undefined"===typeof v||!v.length||!v[0]){var K="";for(_ in C=[],o[x])this.terminals_[_]&&_>2&&C.push("'"+this.terminals_[_]+"'");K=f.showPosition?"Parse error on line "+(l+1)+":\n"+f.showPosition()+"\nExpecting "+C.join(", ")+", got '"+(this.terminals_[b]||b)+"'":"Parse error on line "+(l+1)+": Unexpected "+(1==b?"end of input":"'"+(this.terminals_[b]||b)+"'"),this.parseError(K,{text:f.match,token:this.terminals_[b]||b,line:f.yylineno,loc:m,expected:C})}if(v[0]instanceof Array&&v.length>1)throw new Error("Parse Error: multiple actions possible at state: "+x+", token: "+b);switch(v[0]){case 1:n.push(b),r.push(f.yytext),a.push(f.yylloc),n.push(v[1]),b=null,T?(b=T,T=null):(d=f.yyleng,c=f.yytext,l=f.yylineno,m=f.yylloc,u>0&&u--);break;case 2:if(D=this.productions_[v[1]][1],S.$=r[r.length-D],S._$={first_line:a[a.length-(D||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(D||1)].first_column,last_column:a[a.length-1].last_column},p&&(S._$.range=[a[a.length-(D||1)].range[0],a[a.length-1].range[1]]),"undefined"!==typeof(w=this.performAction.apply(S,[c,d,l,y.yy,v[1],r,a].concat(h))))return w;D&&(n=n.slice(0,-1*D*2),r=r.slice(0,-1*D),a=a.slice(0,-1*D)),n.push(this.productions_[v[1]][0]),r.push(S.$),a.push(S._$),$=o[n[n.length-2]][n[n.length-1]],n.push($);break;case 3:return!0}}return!0}),"parse")},S=function(){return{EOF:1,parseError:(0,s.K2)((function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)}),"parseError"),setInput:(0,s.K2)((function(t,e){return this.yy=e||this.yy||{},this._input=t,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:(0,s.K2)((function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t}),"input"),unput:(0,s.K2)((function(t){var e=t.length,n=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=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),n.length-1&&(this.yylineno-=n.length-1);var s=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:n?(n.length===i.length?this.yylloc.first_column:0)+i[i.length-n.length].length-n[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[s[0],s[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this}),"unput"),more:(0,s.K2)((function(){return this._more=!0,this}),"more"),reject:(0,s.K2)((function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):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})}),"reject"),less:(0,s.K2)((function(t){this.unput(this.match.slice(t))}),"less"),pastInput:(0,s.K2)((function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")}),"pastInput"),upcomingInput:(0,s.K2)((function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")}),"upcomingInput"),showPosition:(0,s.K2)((function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"}),"showPosition"),test_match:(0,s.K2)((function(t,e){var n,i,s;if(this.options.backtrack_lexer&&(s={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&&(s.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,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(t[0].length),this.matched+=t[0],n=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),n)return n;if(this._backtrack){for(var r in s)this[r]=s[r];return!1}return!1}),"test_match"),next:(0,s.K2)((function(){if(this.done)return this.EOF;var t,e,n,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var s=this._currentRules(),r=0;re[0].length)){if(e=n,i=r,this.options.backtrack_lexer){if(!1!==(t=this.test_match(n,s[r])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,s[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})}),"next"),lex:(0,s.K2)((function(){var t=this.next();return t||this.lex()}),"lex"),begin:(0,s.K2)((function(t){this.conditionStack.push(t)}),"begin"),popState:(0,s.K2)((function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]}),"popState"),_currentRules:(0,s.K2)((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:(0,s.K2)((function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"}),"topState"),pushState:(0,s.K2)((function(t){this.begin(t)}),"pushState"),stateStackSize:(0,s.K2)((function(){return this.conditionStack.length}),"stateStackSize"),options:{"case-insensitive":!0},performAction:(0,s.K2)((function(t,e,n,i){switch(n){case 0:return this.begin("open_directive"),"open_directive";case 1:return this.begin("acc_title"),31;case 2:return this.popState(),"acc_title_value";case 3:return this.begin("acc_descr"),33;case 4:return this.popState(),"acc_descr_value";case 5:this.begin("acc_descr_multiline");break;case 6:case 15:case 18:case 21:case 24:this.popState();break;case 7:return"acc_descr_multiline_value";case 8:case 9:case 10:case 12:case 13:break;case 11:return 10;case 14:this.begin("href");break;case 16:return 43;case 17:this.begin("callbackname");break;case 19:this.popState(),this.begin("callbackargs");break;case 20:return 41;case 22:return 42;case 23:this.begin("click");break;case 25:return 40;case 26:return 4;case 27:return 22;case 28:return 23;case 29:return 24;case 30:return 25;case 31:return 26;case 32:return 28;case 33:return 27;case 34:return 29;case 35:return 12;case 36:return 13;case 37:return 14;case 38:return 15;case 39:return 16;case 40:return 17;case 41:return 18;case 42:return 20;case 43:return 21;case 44:return"date";case 45:return 30;case 46:return"accDescription";case 47:return 36;case 48:return 38;case 49:return 39;case 50:return":";case 51:return 6;case 52:return"INVALID"}}),"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:!1},acc_descr:{rules:[4],inclusive:!1},acc_title:{rules:[2],inclusive:!1},callbackargs:{rules:[21,22],inclusive:!1},callbackname:{rules:[18,19,20],inclusive:!1},href:{rules:[15,16],inclusive:!1},click:{rules:[24,25],inclusive:!1},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:!0}}}}();function K(){this.yy={}}return C.lexer=S,(0,s.K2)(K,"Parser"),K.prototype=C,C.Parser=K,new K}();u.parser=u;var h=u;a.extend(o),a.extend(c),a.extend(l);var f,y,k={friday:5,saturday:6},m="",p="",g=void 0,b="",T=[],x=[],v=new Map,w=[],_=[],D="",$="",C=["active","done","crit","milestone"],S=[],K=!1,E=!1,M="sunday",A="saturday",L=0,Y=(0,s.K2)((function(){w=[],_=[],D="",S=[],ht=0,f=void 0,y=void 0,mt=[],m="",p="",$="",g=void 0,b="",T=[],x=[],K=!1,E=!1,L=0,v=new Map,(0,s.IU)(),M="sunday",A="saturday"}),"clear"),I=(0,s.K2)((function(t){p=t}),"setAxisFormat"),F=(0,s.K2)((function(){return p}),"getAxisFormat"),W=(0,s.K2)((function(t){g=t}),"setTickInterval"),O=(0,s.K2)((function(){return g}),"getTickInterval"),P=(0,s.K2)((function(t){b=t}),"setTodayMarker"),B=(0,s.K2)((function(){return b}),"getTodayMarker"),z=(0,s.K2)((function(t){m=t}),"setDateFormat"),N=(0,s.K2)((function(){K=!0}),"enableInclusiveEndDates"),G=(0,s.K2)((function(){return K}),"endDatesAreInclusive"),H=(0,s.K2)((function(){E=!0}),"enableTopAxis"),R=(0,s.K2)((function(){return E}),"topAxisEnabled"),j=(0,s.K2)((function(t){$=t}),"setDisplayMode"),U=(0,s.K2)((function(){return $}),"getDisplayMode"),V=(0,s.K2)((function(){return m}),"getDateFormat"),Z=(0,s.K2)((function(t){T=t.toLowerCase().split(/[\s,]+/)}),"setIncludes"),X=(0,s.K2)((function(){return T}),"getIncludes"),q=(0,s.K2)((function(t){x=t.toLowerCase().split(/[\s,]+/)}),"setExcludes"),Q=(0,s.K2)((function(){return x}),"getExcludes"),J=(0,s.K2)((function(){return v}),"getLinks"),tt=(0,s.K2)((function(t){D=t,w.push(t)}),"addSection"),et=(0,s.K2)((function(){return w}),"getSections"),nt=(0,s.K2)((function(){let t=xt();let e=0;for(;!t&&e<10;)t=xt(),e++;return _=mt}),"getTasks"),it=(0,s.K2)((function(t,e,n,i){return!i.includes(t.format(e.trim()))&&(!(!n.includes("weekends")||t.isoWeekday()!==k[A]&&t.isoWeekday()!==k[A]+1)||(!!n.includes(t.format("dddd").toLowerCase())||n.includes(t.format(e.trim()))))}),"isInvalidDate"),st=(0,s.K2)((function(t){M=t}),"setWeekday"),rt=(0,s.K2)((function(){return M}),"getWeekday"),at=(0,s.K2)((function(t){A=t}),"setWeekend"),ot=(0,s.K2)((function(t,e,n,i){if(!n.length||t.manualEndTime)return;let s,r;s=t.startTime instanceof Date?a(t.startTime):a(t.startTime,e,!0),s=s.add(1,"d"),r=t.endTime instanceof Date?a(t.endTime):a(t.endTime,e,!0);const[o,c]=ct(s,r,e,n,i);t.endTime=o.toDate(),t.renderEndTime=c}),"checkTaskDates"),ct=(0,s.K2)((function(t,e,n,i,s){let r=!1,a=null;for(;t<=e;)r||(a=e.toDate()),r=it(t,n,i,s),r&&(e=e.add(1,"d")),t=t.add(1,"d");return[e,a]}),"fixTaskDates"),lt=(0,s.K2)((function(t,e,n){n=n.trim();const i=/^after\s+(?[\d\w- ]+)/.exec(n);if(null!==i){let t=null;for(const n of i.groups.ids.split(" ")){let e=bt(n);void 0!==e&&(!t||e.endTime>t.endTime)&&(t=e)}if(t)return t.endTime;const e=new Date;return e.setHours(0,0,0,0),e}let r=a(n,e.trim(),!0);if(r.isValid())return r.toDate();{s.Rm.debug("Invalid date:"+n),s.Rm.debug("With date format:"+e.trim());const t=new Date(n);if(void 0===t||isNaN(t.getTime())||t.getFullYear()<-1e4||t.getFullYear()>1e4)throw new Error("Invalid date:"+n);return t}}),"getStartDate"),dt=(0,s.K2)((function(t){const e=/^(\d+(?:\.\d+)?)([Mdhmswy]|ms)$/.exec(t.trim());return null!==e?[Number.parseFloat(e[1]),e[2]]:[NaN,"ms"]}),"parseDuration"),ut=(0,s.K2)((function(t,e,n){let i=arguments.length>3&&void 0!==arguments[3]&&arguments[3];n=n.trim();const s=/^until\s+(?[\d\w- ]+)/.exec(n);if(null!==s){let t=null;for(const n of s.groups.ids.split(" ")){let e=bt(n);void 0!==e&&(!t||e.startTime{window.open(n,"_self")})),v.set(t,n))})),wt(t,"clickable")}),"setLink"),wt=(0,s.K2)((function(t,e){t.split(",").forEach((function(t){let n=bt(t);void 0!==n&&n.classes.push(e)}))}),"setClass"),_t=(0,s.K2)((function(t,e,n){if("loose"!==(0,s.D7)().securityLevel)return;if(void 0===e)return;let r=[];if("string"===typeof n){r=n.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let t=0;t{i._K.runFunc(e,...r)}))}),"setClickFun"),Dt=(0,s.K2)((function(t,e){S.push((function(){const n=document.querySelector(`[id="${t}"]`);null!==n&&n.addEventListener("click",(function(){e()}))}),(function(){const n=document.querySelector(`[id="${t}-text"]`);null!==n&&n.addEventListener("click",(function(){e()}))}))}),"pushFun"),$t=(0,s.K2)((function(t,e,n){t.split(",").forEach((function(t){_t(t,e,n)})),wt(t,"clickable")}),"setClickEvent"),Ct=(0,s.K2)((function(t){S.forEach((function(e){e(t)}))}),"bindFunctions"),St={getConfig:(0,s.K2)((()=>(0,s.D7)().gantt),"getConfig"),clear:Y,setDateFormat:z,getDateFormat:V,enableInclusiveEndDates:N,endDatesAreInclusive:G,enableTopAxis:H,topAxisEnabled:R,setAxisFormat:I,getAxisFormat:F,setTickInterval:W,getTickInterval:O,setTodayMarker:P,getTodayMarker:B,setAccTitle:s.SV,getAccTitle:s.iN,setDiagramTitle:s.ke,getDiagramTitle:s.ab,setDisplayMode:j,getDisplayMode:U,setAccDescription:s.EI,getAccDescription:s.m7,addSection:tt,getSections:et,getTasks:nt,addTask:gt,findTaskById:bt,addTaskOrg:Tt,setIncludes:Z,getIncludes:X,setExcludes:q,getExcludes:Q,setClickEvent:$t,setLink:vt,getLinks:J,bindFunctions:Ct,parseDuration:dt,isInvalidDate:it,setWeekday:st,getWeekday:rt,setWeekend:at};function Kt(t,e,n){let i=!0;for(;i;)i=!1,n.forEach((function(n){const s=new RegExp("^\\s*"+n+"\\s*$");t[0].match(s)&&(e[n]=!0,t.shift(1),i=!0)}))}(0,s.K2)(Kt,"getTaskTags");var Et,Mt=(0,s.K2)((function(){s.Rm.debug("Something is calling, setConf, remove the call")}),"setConf"),At={monday:d.ABi,tuesday:d.PGu,wednesday:d.GuW,thursday:d.Mol,friday:d.TUC,saturday:d.rGn,sunday:d.YPH},Lt=(0,s.K2)(((t,e)=>{let n=[...t].map((()=>-1/0)),i=[...t].sort(((t,e)=>t.startTime-e.startTime||t.order-e.order)),s=0;for(const r of i)for(let t=0;t=n[t]){n[t]=r.endTime,r.order=t+e,t>s&&(s=t);break}return s}),"getMaxIntersections"),Yt={parser:h,db:St,renderer:{setConf:Mt,draw:(0,s.K2)((function(t,e,n,i){const r=(0,s.D7)().gantt,o=(0,s.D7)().securityLevel;let c;"sandbox"===o&&(c=(0,d.Ltv)("#i"+e));const l="sandbox"===o?(0,d.Ltv)(c.nodes()[0].contentDocument.body):(0,d.Ltv)("body"),u="sandbox"===o?c.nodes()[0].contentDocument:document,h=u.getElementById(e);void 0===(Et=h.parentElement.offsetWidth)&&(Et=1200),void 0!==r.useWidth&&(Et=r.useWidth);const f=i.db.getTasks();let y=[];for(const s of f)y.push(s.type);y=$(y);const k={};let m=2*r.topPadding;if("compact"===i.db.getDisplayMode()||"compact"===r.displayMode){const t={};for(const n of f)void 0===t[n.section]?t[n.section]=[n]:t[n.section].push(n);let e=0;for(const n of Object.keys(t)){const i=Lt(t[n],e)+1;e+=i,m+=i*(r.barHeight+r.barGap),k[n]=i}}else{m+=f.length*(r.barHeight+r.barGap);for(const t of y)k[t]=f.filter((e=>e.type===t)).length}h.setAttribute("viewBox","0 0 "+Et+" "+m);const p=l.select(`[id="${e}"]`),g=(0,d.w7C)().domain([(0,d.jkA)(f,(function(t){return t.startTime})),(0,d.T9B)(f,(function(t){return t.endTime}))]).rangeRound([0,Et-r.leftPadding-r.rightPadding]);function b(t,e){const n=t.startTime,i=e.startTime;let s=0;return n>i?s=1:nt.order)))].map((e=>t.find((t=>t.order===e))));p.append("g").selectAll("rect").data(h).enter().append("rect").attr("x",0).attr("y",(function(t,e){return t.order*n+a-2})).attr("width",(function(){return u-r.rightPadding/2})).attr("height",n).attr("class",(function(t){for(const[e,n]of y.entries())if(t.type===n)return"section section"+e%r.numberSectionStyles;return"section section0"}));const f=p.append("g").selectAll("rect").data(t).enter(),k=i.db.getLinks();f.append("rect").attr("id",(function(t){return t.id})).attr("rx",3).attr("ry",3).attr("x",(function(t){return t.milestone?g(t.startTime)+o+.5*(g(t.endTime)-g(t.startTime))-.5*c:g(t.startTime)+o})).attr("y",(function(t,e){return t.order*n+a})).attr("width",(function(t){return t.milestone?c:g(t.renderEndTime||t.endTime)-g(t.startTime)})).attr("height",c).attr("transform-origin",(function(t,e){return e=t.order,(g(t.startTime)+o+.5*(g(t.endTime)-g(t.startTime))).toString()+"px "+(e*n+a+.5*c).toString()+"px"})).attr("class",(function(t){let e="";t.classes.length>0&&(e=t.classes.join(" "));let n=0;for(const[s,a]of y.entries())t.type===a&&(n=s%r.numberSectionStyles);let i="";return t.active?t.crit?i+=" activeCrit":i=" active":t.done?i=t.crit?" doneCrit":" done":t.crit&&(i+=" crit"),0===i.length&&(i=" task"),t.milestone&&(i=" milestone "+i),i+=n,i+=" "+e,"task"+i})),f.append("text").attr("id",(function(t){return t.id+"-text"})).text((function(t){return t.task})).attr("font-size",r.fontSize).attr("x",(function(t){let e=g(t.startTime),n=g(t.renderEndTime||t.endTime);t.milestone&&(e+=.5*(g(t.endTime)-g(t.startTime))-.5*c),t.milestone&&(n=e+c);const i=this.getBBox().width;return i>n-e?n+i+1.5*r.leftPadding>u?e+o-5:n+o+5:(n-e)/2+e+o})).attr("y",(function(t,e){return t.order*n+r.barHeight/2+(r.fontSize/2-2)+a})).attr("text-height",c).attr("class",(function(t){const e=g(t.startTime);let n=g(t.endTime);t.milestone&&(n=e+c);const i=this.getBBox().width;let s="";t.classes.length>0&&(s=t.classes.join(" "));let a=0;for(const[c,l]of y.entries())t.type===l&&(a=c%r.numberSectionStyles);let o="";return t.active&&(o=t.crit?"activeCritText"+a:"activeText"+a),t.done?o=t.crit?o+" doneCritText"+a:o+" doneText"+a:t.crit&&(o=o+" critText"+a),t.milestone&&(o+=" milestoneText"),i>n-e?n+i+1.5*r.leftPadding>u?s+" taskTextOutsideLeft taskTextOutside"+a+" "+o:s+" taskTextOutsideRight taskTextOutside"+a+" "+o+" width-"+i:s+" taskText taskText"+a+" "+o+" width-"+i}));if("sandbox"===(0,s.D7)().securityLevel){let t;t=(0,d.Ltv)("#i"+e);const n=t.nodes()[0].contentDocument;f.filter((function(t){return k.has(t.id)})).each((function(t){var e=n.querySelector("#"+t.id),i=n.querySelector("#"+t.id+"-text");const s=e.parentNode;var r=n.createElement("a");r.setAttribute("xlink:href",k.get(t.id)),r.setAttribute("target","_top"),s.appendChild(r),r.appendChild(e),r.appendChild(i)}))}}function v(t,e,n,o,c,l,d,u){if(0===d.length&&0===u.length)return;let h,f;for(const{startTime:i,endTime:s}of l)(void 0===h||if)&&(f=s);if(!h||!f)return;if(a(f).diff(a(h),"year")>5)return void s.Rm.warn("The difference between the min and max time is more than 5 years. This will cause performance issues. Skipping drawing exclude days.");const y=i.db.getDateFormat(),k=[];let m=null,b=a(h);for(;b.valueOf()<=f;)i.db.isInvalidDate(b,y,d,u)?m?m.end=b:m={start:b,end:b}:m&&(k.push(m),m=null),b=b.add(1,"d");p.append("g").selectAll("rect").data(k).enter().append("rect").attr("id",(function(t){return"exclude-"+t.start.format("YYYY-MM-DD")})).attr("x",(function(t){return g(t.start)+n})).attr("y",r.gridLineStartPadding).attr("width",(function(t){const e=t.end.add(1,"day");return g(e)-g(t.start)})).attr("height",c-e-r.gridLineStartPadding).attr("transform-origin",(function(e,i){return(g(e.start)+n+.5*(g(e.end)-g(e.start))).toString()+"px "+(i*t+.5*c).toString()+"px"})).attr("class","exclude-range")}function w(t,e,n,s){let a=(0,d.l78)(g).tickSize(-s+e+r.gridLineStartPadding).tickFormat((0,d.DCK)(i.db.getAxisFormat()||r.axisFormat||"%Y-%m-%d"));const o=/^([1-9]\d*)(millisecond|second|minute|hour|day|week|month)$/.exec(i.db.getTickInterval()||r.tickInterval);if(null!==o){const t=o[1],e=o[2],n=i.db.getWeekday()||r.weekday;switch(e){case"millisecond":a.ticks(d.t6C.every(t));break;case"second":a.ticks(d.ucG.every(t));break;case"minute":a.ticks(d.wXd.every(t));break;case"hour":a.ticks(d.Agd.every(t));break;case"day":a.ticks(d.UAC.every(t));break;case"week":a.ticks(At[n].every(t));break;case"month":a.ticks(d.Ui6.every(t))}}if(p.append("g").attr("class","grid").attr("transform","translate("+t+", "+(s-50)+")").call(a).selectAll("text").style("text-anchor","middle").attr("fill","#000").attr("stroke","none").attr("font-size",10).attr("dy","1em"),i.db.topAxisEnabled()||r.topAxis){let n=(0,d.tlR)(g).tickSize(-s+e+r.gridLineStartPadding).tickFormat((0,d.DCK)(i.db.getAxisFormat()||r.axisFormat||"%Y-%m-%d"));if(null!==o){const t=o[1],e=o[2],s=i.db.getWeekday()||r.weekday;switch(e){case"millisecond":n.ticks(d.t6C.every(t));break;case"second":n.ticks(d.ucG.every(t));break;case"minute":n.ticks(d.wXd.every(t));break;case"hour":n.ticks(d.Agd.every(t));break;case"day":n.ticks(d.UAC.every(t));break;case"week":n.ticks(At[s].every(t));break;case"month":n.ticks(d.Ui6.every(t))}}p.append("g").attr("class","grid").attr("transform","translate("+t+", "+e+")").call(n).selectAll("text").style("text-anchor","middle").attr("fill","#000").attr("stroke","none").attr("font-size",10)}}function _(t,e){let n=0;const i=Object.keys(k).map((t=>[t,k[t]]));p.append("g").selectAll("text").data(i).enter().append((function(t){const e=t[0].split(s.Y2.lineBreakRegex),n=-(e.length-1)/2,i=u.createElementNS("http://www.w3.org/2000/svg","text");i.setAttribute("dy",n+"em");for(const[s,r]of e.entries()){const t=u.createElementNS("http://www.w3.org/2000/svg","tspan");t.setAttribute("alignment-baseline","central"),t.setAttribute("x","10"),s>0&&t.setAttribute("dy","1em"),t.textContent=r,i.appendChild(t)}return i})).attr("x",10).attr("y",(function(s,r){if(!(r>0))return s[1]*t/2+e;for(let a=0;a`\n .mermaid-main-font {\n font-family: ${t.fontFamily};\n }\n\n .exclude-range {\n fill: ${t.excludeBkgColor};\n }\n\n .section {\n stroke: none;\n opacity: 0.2;\n }\n\n .section0 {\n fill: ${t.sectionBkgColor};\n }\n\n .section2 {\n fill: ${t.sectionBkgColor2};\n }\n\n .section1,\n .section3 {\n fill: ${t.altSectionBkgColor};\n opacity: 0.2;\n }\n\n .sectionTitle0 {\n fill: ${t.titleColor};\n }\n\n .sectionTitle1 {\n fill: ${t.titleColor};\n }\n\n .sectionTitle2 {\n fill: ${t.titleColor};\n }\n\n .sectionTitle3 {\n fill: ${t.titleColor};\n }\n\n .sectionTitle {\n text-anchor: start;\n font-family: ${t.fontFamily};\n }\n\n\n /* Grid and axis */\n\n .grid .tick {\n stroke: ${t.gridColor};\n opacity: 0.8;\n shape-rendering: crispEdges;\n }\n\n .grid .tick text {\n font-family: ${t.fontFamily};\n fill: ${t.textColor};\n }\n\n .grid path {\n stroke-width: 0;\n }\n\n\n /* Today line */\n\n .today {\n fill: none;\n stroke: ${t.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: ${t.fontFamily};\n }\n\n .taskTextOutsideRight {\n fill: ${t.taskTextDarkColor};\n text-anchor: start;\n font-family: ${t.fontFamily};\n }\n\n .taskTextOutsideLeft {\n fill: ${t.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: ${t.taskTextClickableColor} !important;\n font-weight: bold;\n }\n\n .taskTextOutsideLeft.clickable {\n cursor: pointer;\n fill: ${t.taskTextClickableColor} !important;\n font-weight: bold;\n }\n\n .taskTextOutsideRight.clickable {\n cursor: pointer;\n fill: ${t.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: ${t.taskTextColor};\n }\n\n .task0,\n .task1,\n .task2,\n .task3 {\n fill: ${t.taskBkgColor};\n stroke: ${t.taskBorderColor};\n }\n\n .taskTextOutside0,\n .taskTextOutside2\n {\n fill: ${t.taskTextOutsideColor};\n }\n\n .taskTextOutside1,\n .taskTextOutside3 {\n fill: ${t.taskTextOutsideColor};\n }\n\n\n /* Active task */\n\n .active0,\n .active1,\n .active2,\n .active3 {\n fill: ${t.activeTaskBkgColor};\n stroke: ${t.activeTaskBorderColor};\n }\n\n .activeText0,\n .activeText1,\n .activeText2,\n .activeText3 {\n fill: ${t.taskTextDarkColor} !important;\n }\n\n\n /* Completed task */\n\n .done0,\n .done1,\n .done2,\n .done3 {\n stroke: ${t.doneTaskBorderColor};\n fill: ${t.doneTaskBkgColor};\n stroke-width: 2;\n }\n\n .doneText0,\n .doneText1,\n .doneText2,\n .doneText3 {\n fill: ${t.taskTextDarkColor} !important;\n }\n\n\n /* Tasks on the critical line */\n\n .crit0,\n .crit1,\n .crit2,\n .crit3 {\n stroke: ${t.critBorderColor};\n fill: ${t.critBkgColor};\n stroke-width: 2;\n }\n\n .activeCrit0,\n .activeCrit1,\n .activeCrit2,\n .activeCrit3 {\n stroke: ${t.critBorderColor};\n fill: ${t.activeTaskBkgColor};\n stroke-width: 2;\n }\n\n .doneCrit0,\n .doneCrit1,\n .doneCrit2,\n .doneCrit3 {\n stroke: ${t.critBorderColor};\n fill: ${t.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: ${t.taskTextDarkColor} !important;\n }\n\n .activeCritText0,\n .activeCritText1,\n .activeCritText2,\n .activeCritText3 {\n fill: ${t.taskTextDarkColor} !important;\n }\n\n .titleText {\n text-anchor: middle;\n font-size: 18px;\n fill: ${t.titleColor||t.textColor};\n font-family: ${t.fontFamily};\n }\n`),"getStyles")}},7076:function(t){t.exports=function(){"use strict";return function(t,e){var n=e.prototype,i=n.format;n.format=function(t){var e=this,n=this.$locale();if(!this.isValid())return i.bind(this)(t);var s=this.$utils(),r=(t||"YYYY-MM-DDTHH:mm:ssZ").replace(/\[([^\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|Do|X|x|k{1,2}|S/g,(function(t){switch(t){case"Q":return Math.ceil((e.$M+1)/3);case"Do":return n.ordinal(e.$D);case"gggg":return e.weekYear();case"GGGG":return e.isoWeekYear();case"wo":return n.ordinal(e.week(),"W");case"w":case"ww":return s.s(e.week(),"w"===t?1:2,"0");case"W":case"WW":return s.s(e.isoWeek(),"W"===t?1:2,"0");case"k":case"kk":return s.s(String(0===e.$H?24:e.$H),"k"===t?1:2,"0");case"X":return Math.floor(e.$d.getTime()/1e3);case"x":return e.$d.getTime();case"z":return"["+e.offsetName()+"]";case"zzz":return"["+e.offsetName("long")+"]";default:return t}}));return i.bind(this)(r)}}}()},7140:function(t){t.exports=function(){"use strict";var t="day";return function(e,n,i){var s=function(e){return e.add(4-e.isoWeekday(),t)},r=n.prototype;r.isoWeekYear=function(){return s(this).year()},r.isoWeek=function(e){if(!this.$utils().u(e))return this.add(7*(e-this.isoWeek()),t);var n,r,a,o=s(this),c=(n=this.isoWeekYear(),a=4-(r=(this.$u?i.utc:i)().year(n).startOf("year")).isoWeekday(),r.isoWeekday()>4&&(a+=7),r.add(a,t));return o.diff(c,"week")+1},r.isoWeekday=function(t){return this.$utils().u(t)?this.day()||7:this.day(this.day()%7?t:t-7)};var a=r.startOf;r.startOf=function(t,e){var n=this.$utils(),i=!!n.u(e)||e;return"isoweek"===n.p(t)?i?this.date(this.date()-(this.isoWeekday()-1)).startOf("day"):this.date(this.date()-1-(this.isoWeekday()-1)+7).endOf("day"):a.bind(this)(t,e)}}}()},8988:function(t){t.exports=function(){"use strict";var t={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},e=/(\[[^[]*\])|([-_:/.,()\s]+)|(A|a|Q|YYYY|YY?|ww?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g,n=/\d/,i=/\d\d/,s=/\d\d?/,r=/\d*[^-_:/,()\s\d]+/,a={},o=function(t){return(t=+t)+(t>68?1900:2e3)},c=function(t){return function(e){this[t]=+e}},l=[/[+-]\d\d:?(\d\d)?|Z/,function(t){(this.zone||(this.zone={})).offset=function(t){if(!t)return 0;if("Z"===t)return 0;var e=t.match(/([+-]|\d\d)/g),n=60*e[1]+(+e[2]||0);return 0===n?0:"+"===e[0]?-n:n}(t)}],d=function(t){var e=a[t];return e&&(e.indexOf?e:e.s.concat(e.f))},u=function(t,e){var n,i=a.meridiem;if(i){for(var s=1;s<=24;s+=1)if(t.indexOf(i(s,0,e))>-1){n=s>12;break}}else n=t===(e?"pm":"PM");return n},h={A:[r,function(t){this.afternoon=u(t,!1)}],a:[r,function(t){this.afternoon=u(t,!0)}],Q:[n,function(t){this.month=3*(t-1)+1}],S:[n,function(t){this.milliseconds=100*+t}],SS:[i,function(t){this.milliseconds=10*+t}],SSS:[/\d{3}/,function(t){this.milliseconds=+t}],s:[s,c("seconds")],ss:[s,c("seconds")],m:[s,c("minutes")],mm:[s,c("minutes")],H:[s,c("hours")],h:[s,c("hours")],HH:[s,c("hours")],hh:[s,c("hours")],D:[s,c("day")],DD:[i,c("day")],Do:[r,function(t){var e=a.ordinal,n=t.match(/\d+/);if(this.day=n[0],e)for(var i=1;i<=31;i+=1)e(i).replace(/\[|\]/g,"")===t&&(this.day=i)}],w:[s,c("week")],ww:[i,c("week")],M:[s,c("month")],MM:[i,c("month")],MMM:[r,function(t){var e=d("months"),n=(d("monthsShort")||e.map((function(t){return t.slice(0,3)}))).indexOf(t)+1;if(n<1)throw new Error;this.month=n%12||n}],MMMM:[r,function(t){var e=d("months").indexOf(t)+1;if(e<1)throw new Error;this.month=e%12||e}],Y:[/[+-]?\d+/,c("year")],YY:[i,function(t){this.year=o(t)}],YYYY:[/\d{4}/,c("year")],Z:l,ZZ:l};function f(n){var i,s;i=n,s=a&&a.formats;for(var r=(n=i.replace(/(\[[^\]]+])|(LTS?|l{1,4}|L{1,4})/g,(function(e,n,i){var r=i&&i.toUpperCase();return n||s[i]||t[i]||s[r].replace(/(\[[^\]]+])|(MMMM|MM|DD|dddd)/g,(function(t,e,n){return e||n.slice(1)}))}))).match(e),o=r.length,c=0;c-1)return new Date(("X"===e?1e3:1)*t);var s=f(e)(t),r=s.year,a=s.month,o=s.day,c=s.hours,l=s.minutes,d=s.seconds,u=s.milliseconds,h=s.zone,y=s.week,k=new Date,m=o||(r||a?1:k.getDate()),p=r||k.getFullYear(),g=0;r&&!a||(g=a>0?a-1:k.getMonth());var b,T=c||0,x=l||0,v=d||0,w=u||0;return h?new Date(Date.UTC(p,g,m,T,x,v,w+60*h.offset*1e3)):n?new Date(Date.UTC(p,g,m,T,x,v,w)):(b=new Date(p,g,m,T,x,v,w),y&&(b=i(b).week(y).toDate()),b)}catch(t){return new Date("")}}(e,o,i,n),this.init(),u&&!0!==u&&(this.$L=this.locale(u).$L),d&&e!=this.format(o)&&(this.$d=new Date("")),a={}}else if(o instanceof Array)for(var h=o.length,y=1;y<=h;y+=1){r[1]=o[y-1];var k=n.apply(this,r);if(k.isValid()){this.$d=k.$d,this.$L=k.$L,this.init();break}y===h&&(this.$d=new Date(""))}else s.call(this,t)}}}()}}]); -//# sourceMappingURL=448.0ebff170.chunk.js.map \ No newline at end of file diff --git a/frontend/deployed/static/js/448.0ebff170.chunk.js.map b/frontend/deployed/static/js/448.0ebff170.chunk.js.map deleted file mode 100644 index 69e9514..0000000 --- a/frontend/deployed/static/js/448.0ebff170.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"static/js/448.0ebff170.chunk.js","mappings":"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","sources":["../node_modules/mermaid/dist/chunks/mermaid.core/ganttDiagram-APWFNJXF.mjs","../node_modules/dayjs/plugin/advancedFormat.js","../node_modules/dayjs/plugin/isoWeek.js","../node_modules/dayjs/plugin/customParseFormat.js"],"sourcesContent":["import {\n utils_default\n} from \"./chunk-O4NI6UNU.mjs\";\nimport {\n __name,\n clear,\n common_default,\n configureSvgSize,\n getAccDescription,\n getAccTitle,\n getConfig2 as getConfig,\n getDiagramTitle,\n log,\n setAccDescription,\n setAccTitle,\n setDiagramTitle\n} from \"./chunk-YTJNT7DU.mjs\";\n\n// src/diagrams/gantt/parser/gantt.jison\nvar parser = function() {\n var o = /* @__PURE__ */ __name(function(k, v, o2, l) {\n for (o2 = o2 || {}, l = k.length; l--; o2[k[l]] = v) ;\n return o2;\n }, \"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];\n var parser2 = {\n trace: /* @__PURE__ */ __name(function trace() {\n }, \"trace\"),\n yy: {},\n 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 },\n 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\" },\n 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]],\n performAction: /* @__PURE__ */ __name(function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) {\n var $0 = $$.length - 1;\n switch (yystate) {\n case 1:\n return $$[$0 - 1];\n break;\n case 2:\n this.$ = [];\n break;\n case 3:\n $$[$0 - 1].push($$[$0]);\n this.$ = $$[$0 - 1];\n break;\n case 4:\n case 5:\n this.$ = $$[$0];\n break;\n case 6:\n case 7:\n this.$ = [];\n break;\n case 8:\n yy.setWeekday(\"monday\");\n break;\n case 9:\n yy.setWeekday(\"tuesday\");\n break;\n case 10:\n yy.setWeekday(\"wednesday\");\n break;\n case 11:\n yy.setWeekday(\"thursday\");\n break;\n case 12:\n yy.setWeekday(\"friday\");\n break;\n case 13:\n yy.setWeekday(\"saturday\");\n break;\n case 14:\n yy.setWeekday(\"sunday\");\n break;\n case 15:\n yy.setWeekend(\"friday\");\n break;\n case 16:\n yy.setWeekend(\"saturday\");\n break;\n case 17:\n yy.setDateFormat($$[$0].substr(11));\n this.$ = $$[$0].substr(11);\n break;\n case 18:\n yy.enableInclusiveEndDates();\n this.$ = $$[$0].substr(18);\n break;\n case 19:\n yy.TopAxis();\n this.$ = $$[$0].substr(8);\n break;\n case 20:\n yy.setAxisFormat($$[$0].substr(11));\n this.$ = $$[$0].substr(11);\n break;\n case 21:\n yy.setTickInterval($$[$0].substr(13));\n this.$ = $$[$0].substr(13);\n break;\n case 22:\n yy.setExcludes($$[$0].substr(9));\n this.$ = $$[$0].substr(9);\n break;\n case 23:\n yy.setIncludes($$[$0].substr(9));\n this.$ = $$[$0].substr(9);\n break;\n case 24:\n yy.setTodayMarker($$[$0].substr(12));\n this.$ = $$[$0].substr(12);\n break;\n case 27:\n yy.setDiagramTitle($$[$0].substr(6));\n this.$ = $$[$0].substr(6);\n break;\n case 28:\n this.$ = $$[$0].trim();\n yy.setAccTitle(this.$);\n break;\n case 29:\n case 30:\n this.$ = $$[$0].trim();\n yy.setAccDescription(this.$);\n break;\n case 31:\n yy.addSection($$[$0].substr(8));\n this.$ = $$[$0].substr(8);\n break;\n case 33:\n yy.addTask($$[$0 - 1], $$[$0]);\n this.$ = \"task\";\n break;\n case 34:\n this.$ = $$[$0 - 1];\n yy.setClickEvent($$[$0 - 1], $$[$0], null);\n break;\n case 35:\n this.$ = $$[$0 - 2];\n yy.setClickEvent($$[$0 - 2], $$[$0 - 1], $$[$0]);\n break;\n case 36:\n this.$ = $$[$0 - 2];\n yy.setClickEvent($$[$0 - 2], $$[$0 - 1], null);\n yy.setLink($$[$0 - 2], $$[$0]);\n break;\n case 37:\n this.$ = $$[$0 - 3];\n yy.setClickEvent($$[$0 - 3], $$[$0 - 2], $$[$0 - 1]);\n yy.setLink($$[$0 - 3], $$[$0]);\n break;\n case 38:\n this.$ = $$[$0 - 2];\n yy.setClickEvent($$[$0 - 2], $$[$0], null);\n yy.setLink($$[$0 - 2], $$[$0 - 1]);\n break;\n case 39:\n this.$ = $$[$0 - 3];\n yy.setClickEvent($$[$0 - 3], $$[$0 - 1], $$[$0]);\n yy.setLink($$[$0 - 3], $$[$0 - 2]);\n break;\n case 40:\n this.$ = $$[$0 - 1];\n yy.setLink($$[$0 - 1], $$[$0]);\n break;\n case 41:\n case 47:\n this.$ = $$[$0 - 1] + \" \" + $$[$0];\n break;\n case 42:\n case 43:\n case 45:\n this.$ = $$[$0 - 2] + \" \" + $$[$0 - 1] + \" \" + $$[$0];\n break;\n case 44:\n case 46:\n this.$ = $$[$0 - 3] + \" \" + $$[$0 - 2] + \" \" + $$[$0 - 1] + \" \" + $$[$0];\n break;\n }\n }, \"anonymous\"),\n 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])],\n defaultActions: {},\n parseError: /* @__PURE__ */ __name(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 }, \"parseError\"),\n parse: /* @__PURE__ */ __name(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 lexer2 = 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 lexer2.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer2;\n sharedState.yy.parser = this;\n if (typeof lexer2.yylloc == \"undefined\") {\n lexer2.yylloc = {};\n }\n var yyloc = lexer2.yylloc;\n lstack.push(yyloc);\n var ranges = lexer2.options && lexer2.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 __name(popStack, \"popStack\");\n function lex() {\n var token;\n token = tstack.pop() || lexer2.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 __name(lex, \"lex\");\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 (lexer2.showPosition) {\n errStr = \"Parse error on line \" + (yylineno + 1) + \":\\n\" + lexer2.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: lexer2.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer2.yylineno,\n loc: yyloc,\n 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(lexer2.yytext);\n lstack.push(lexer2.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = lexer2.yyleng;\n yytext = lexer2.yytext;\n yylineno = lexer2.yylineno;\n yyloc = lexer2.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 }, \"parse\")\n };\n var lexer = /* @__PURE__ */ function() {\n var lexer2 = {\n EOF: 1,\n parseError: /* @__PURE__ */ __name(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 }, \"parseError\"),\n // resets the lexer, sets new input\n setInput: /* @__PURE__ */ __name(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 }, \"setInput\"),\n // consumes and returns one char from the input\n input: /* @__PURE__ */ __name(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 this._input = this._input.slice(1);\n return ch;\n }, \"input\"),\n // unshifts one char (or a string) into the input\n unput: /* @__PURE__ */ __name(function(ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - 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 if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\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 ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len\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 }, \"unput\"),\n // When called from action, caches matched text and appends it on next action\n more: /* @__PURE__ */ __name(function() {\n this._more = true;\n return this;\n }, \"more\"),\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.\n reject: /* @__PURE__ */ __name(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 return this;\n }, \"reject\"),\n // retain first n characters of the match\n less: /* @__PURE__ */ __name(function(n) {\n this.unput(this.match.slice(n));\n }, \"less\"),\n // displays already matched input, i.e. for error messages\n pastInput: /* @__PURE__ */ __name(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 }, \"pastInput\"),\n // displays upcoming input, i.e. for error messages\n upcomingInput: /* @__PURE__ */ __name(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 }, \"upcomingInput\"),\n // displays the character position where the lexing error occurred, i.e. for error messages\n showPosition: /* @__PURE__ */ __name(function() {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n }, \"showPosition\"),\n // test the lexed token: return FALSE when not a match, otherwise return token\n test_match: /* @__PURE__ */ __name(function(match, indexed_rule) {\n var token, lines, backup;\n if (this.options.backtrack_lexer) {\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 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 ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length : 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 for (var k in backup) {\n this[k] = backup[k];\n }\n return false;\n }\n return false;\n }, \"test_match\"),\n // return next match in input\n next: /* @__PURE__ */ __name(function() {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n var token, match, tempMatch, 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;\n } else {\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 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 }, \"next\"),\n // return next match that has a token\n lex: /* @__PURE__ */ __name(function lex() {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n }, \"lex\"),\n // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\n begin: /* @__PURE__ */ __name(function begin(condition) {\n this.conditionStack.push(condition);\n }, \"begin\"),\n // pop the previously active lexer condition state off the condition stack\n popState: /* @__PURE__ */ __name(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 }, \"popState\"),\n // produce the lexer rule set which is active for the currently active lexer condition state\n _currentRules: /* @__PURE__ */ __name(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 }, \"_currentRules\"),\n // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\n topState: /* @__PURE__ */ __name(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 }, \"topState\"),\n // alias for begin(condition)\n pushState: /* @__PURE__ */ __name(function pushState(condition) {\n this.begin(condition);\n }, \"pushState\"),\n // return the number of states currently on the stack\n stateStackSize: /* @__PURE__ */ __name(function stateStackSize() {\n return this.conditionStack.length;\n }, \"stateStackSize\"),\n options: { \"case-insensitive\": true },\n performAction: /* @__PURE__ */ __name(function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) {\n var YYSTATE = YY_START;\n switch ($avoiding_name_collisions) {\n case 0:\n this.begin(\"open_directive\");\n return \"open_directive\";\n break;\n case 1:\n this.begin(\"acc_title\");\n return 31;\n break;\n case 2:\n this.popState();\n return \"acc_title_value\";\n break;\n case 3:\n this.begin(\"acc_descr\");\n return 33;\n break;\n case 4:\n this.popState();\n return \"acc_descr_value\";\n break;\n case 5:\n this.begin(\"acc_descr_multiline\");\n break;\n case 6:\n this.popState();\n break;\n case 7:\n return \"acc_descr_multiline_value\";\n break;\n case 8:\n break;\n case 9:\n break;\n case 10:\n break;\n case 11:\n return 10;\n break;\n case 12:\n break;\n case 13:\n break;\n case 14:\n this.begin(\"href\");\n break;\n case 15:\n this.popState();\n break;\n case 16:\n return 43;\n break;\n case 17:\n this.begin(\"callbackname\");\n break;\n case 18:\n this.popState();\n break;\n case 19:\n this.popState();\n this.begin(\"callbackargs\");\n break;\n case 20:\n return 41;\n break;\n case 21:\n this.popState();\n break;\n case 22:\n return 42;\n break;\n case 23:\n this.begin(\"click\");\n break;\n case 24:\n this.popState();\n break;\n case 25:\n return 40;\n break;\n case 26:\n return 4;\n break;\n case 27:\n return 22;\n break;\n case 28:\n return 23;\n break;\n case 29:\n return 24;\n break;\n case 30:\n return 25;\n break;\n case 31:\n return 26;\n break;\n case 32:\n return 28;\n break;\n case 33:\n return 27;\n break;\n case 34:\n return 29;\n break;\n case 35:\n return 12;\n break;\n case 36:\n return 13;\n break;\n case 37:\n return 14;\n break;\n case 38:\n return 15;\n break;\n case 39:\n return 16;\n break;\n case 40:\n return 17;\n break;\n case 41:\n return 18;\n break;\n case 42:\n return 20;\n break;\n case 43:\n return 21;\n break;\n case 44:\n return \"date\";\n break;\n case 45:\n return 30;\n break;\n case 46:\n return \"accDescription\";\n break;\n case 47:\n return 36;\n break;\n case 48:\n return 38;\n break;\n case 49:\n return 39;\n break;\n case 50:\n return \":\";\n break;\n case 51:\n return 6;\n break;\n case 52:\n return \"INVALID\";\n break;\n }\n }, \"anonymous\"),\n 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],\n 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 } }\n };\n return lexer2;\n }();\n parser2.lexer = lexer;\n function Parser() {\n this.yy = {};\n }\n __name(Parser, \"Parser\");\n Parser.prototype = parser2;\n parser2.Parser = Parser;\n return new Parser();\n}();\nparser.parser = parser;\nvar gantt_default = parser;\n\n// src/diagrams/gantt/ganttDb.js\nimport { 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\";\ndayjs.extend(dayjsIsoWeek);\ndayjs.extend(dayjsCustomParseFormat);\ndayjs.extend(dayjsAdvancedFormat);\nvar WEEKEND_START_DAY = { friday: 5, saturday: 6 };\nvar dateFormat = \"\";\nvar axisFormat = \"\";\nvar tickInterval = void 0;\nvar todayMarker = \"\";\nvar includes = [];\nvar excludes = [];\nvar links = /* @__PURE__ */ new Map();\nvar sections = [];\nvar tasks = [];\nvar currentSection = \"\";\nvar displayMode = \"\";\nvar tags = [\"active\", \"done\", \"crit\", \"milestone\"];\nvar funs = [];\nvar inclusiveEndDates = false;\nvar topAxis = false;\nvar weekday = \"sunday\";\nvar weekend = \"saturday\";\nvar lastOrder = 0;\nvar clear2 = /* @__PURE__ */ __name(function() {\n sections = [];\n tasks = [];\n currentSection = \"\";\n funs = [];\n taskCnt = 0;\n lastTask = void 0;\n lastTaskID = void 0;\n rawTasks = [];\n dateFormat = \"\";\n axisFormat = \"\";\n displayMode = \"\";\n tickInterval = void 0;\n todayMarker = \"\";\n includes = [];\n excludes = [];\n inclusiveEndDates = false;\n topAxis = false;\n lastOrder = 0;\n links = /* @__PURE__ */ new Map();\n clear();\n weekday = \"sunday\";\n weekend = \"saturday\";\n}, \"clear\");\nvar setAxisFormat = /* @__PURE__ */ __name(function(txt) {\n axisFormat = txt;\n}, \"setAxisFormat\");\nvar getAxisFormat = /* @__PURE__ */ __name(function() {\n return axisFormat;\n}, \"getAxisFormat\");\nvar setTickInterval = /* @__PURE__ */ __name(function(txt) {\n tickInterval = txt;\n}, \"setTickInterval\");\nvar getTickInterval = /* @__PURE__ */ __name(function() {\n return tickInterval;\n}, \"getTickInterval\");\nvar setTodayMarker = /* @__PURE__ */ __name(function(txt) {\n todayMarker = txt;\n}, \"setTodayMarker\");\nvar getTodayMarker = /* @__PURE__ */ __name(function() {\n return todayMarker;\n}, \"getTodayMarker\");\nvar setDateFormat = /* @__PURE__ */ __name(function(txt) {\n dateFormat = txt;\n}, \"setDateFormat\");\nvar enableInclusiveEndDates = /* @__PURE__ */ __name(function() {\n inclusiveEndDates = true;\n}, \"enableInclusiveEndDates\");\nvar endDatesAreInclusive = /* @__PURE__ */ __name(function() {\n return inclusiveEndDates;\n}, \"endDatesAreInclusive\");\nvar enableTopAxis = /* @__PURE__ */ __name(function() {\n topAxis = true;\n}, \"enableTopAxis\");\nvar topAxisEnabled = /* @__PURE__ */ __name(function() {\n return topAxis;\n}, \"topAxisEnabled\");\nvar setDisplayMode = /* @__PURE__ */ __name(function(txt) {\n displayMode = txt;\n}, \"setDisplayMode\");\nvar getDisplayMode = /* @__PURE__ */ __name(function() {\n return displayMode;\n}, \"getDisplayMode\");\nvar getDateFormat = /* @__PURE__ */ __name(function() {\n return dateFormat;\n}, \"getDateFormat\");\nvar setIncludes = /* @__PURE__ */ __name(function(txt) {\n includes = txt.toLowerCase().split(/[\\s,]+/);\n}, \"setIncludes\");\nvar getIncludes = /* @__PURE__ */ __name(function() {\n return includes;\n}, \"getIncludes\");\nvar setExcludes = /* @__PURE__ */ __name(function(txt) {\n excludes = txt.toLowerCase().split(/[\\s,]+/);\n}, \"setExcludes\");\nvar getExcludes = /* @__PURE__ */ __name(function() {\n return excludes;\n}, \"getExcludes\");\nvar getLinks = /* @__PURE__ */ __name(function() {\n return links;\n}, \"getLinks\");\nvar addSection = /* @__PURE__ */ __name(function(txt) {\n currentSection = txt;\n sections.push(txt);\n}, \"addSection\");\nvar getSections = /* @__PURE__ */ __name(function() {\n return sections;\n}, \"getSections\");\nvar getTasks = /* @__PURE__ */ __name(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 tasks = rawTasks;\n return tasks;\n}, \"getTasks\");\nvar isInvalidDate = /* @__PURE__ */ __name(function(date, dateFormat2, excludes2, includes2) {\n if (includes2.includes(date.format(dateFormat2.trim()))) {\n return false;\n }\n if (excludes2.includes(\"weekends\") && (date.isoWeekday() === WEEKEND_START_DAY[weekend] || date.isoWeekday() === WEEKEND_START_DAY[weekend] + 1)) {\n return true;\n }\n if (excludes2.includes(date.format(\"dddd\").toLowerCase())) {\n return true;\n }\n return excludes2.includes(date.format(dateFormat2.trim()));\n}, \"isInvalidDate\");\nvar setWeekday = /* @__PURE__ */ __name(function(txt) {\n weekday = txt;\n}, \"setWeekday\");\nvar getWeekday = /* @__PURE__ */ __name(function() {\n return weekday;\n}, \"getWeekday\");\nvar setWeekend = /* @__PURE__ */ __name(function(startDay) {\n weekend = startDay;\n}, \"setWeekend\");\nvar checkTaskDates = /* @__PURE__ */ __name(function(task, dateFormat2, excludes2, includes2) {\n if (!excludes2.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, dateFormat2, true);\n }\n startTime = startTime.add(1, \"d\");\n let originalEndTime;\n if (task.endTime instanceof Date) {\n originalEndTime = dayjs(task.endTime);\n } else {\n originalEndTime = dayjs(task.endTime, dateFormat2, true);\n }\n const [fixedEndTime, renderEndTime] = fixTaskDates(\n startTime,\n originalEndTime,\n dateFormat2,\n excludes2,\n includes2\n );\n task.endTime = fixedEndTime.toDate();\n task.renderEndTime = renderEndTime;\n}, \"checkTaskDates\");\nvar fixTaskDates = /* @__PURE__ */ __name(function(startTime, endTime, dateFormat2, excludes2, includes2) {\n let invalid = false;\n let renderEndTime = null;\n while (startTime <= endTime) {\n if (!invalid) {\n renderEndTime = endTime.toDate();\n }\n invalid = isInvalidDate(startTime, dateFormat2, excludes2, includes2);\n if (invalid) {\n endTime = endTime.add(1, \"d\");\n }\n startTime = startTime.add(1, \"d\");\n }\n return [endTime, renderEndTime];\n}, \"fixTaskDates\");\nvar getStartDate = /* @__PURE__ */ __name(function(prevTime, dateFormat2, str) {\n str = str.trim();\n const afterRePattern = /^after\\s+(?[\\d\\w- ]+)/;\n const afterStatement = afterRePattern.exec(str);\n if (afterStatement !== null) {\n let latestTask = null;\n for (const id of afterStatement.groups.ids.split(\" \")) {\n let task = findTaskById(id);\n if (task !== void 0 && (!latestTask || task.endTime > latestTask.endTime)) {\n latestTask = task;\n }\n }\n if (latestTask) {\n return latestTask.endTime;\n }\n const today = /* @__PURE__ */ new Date();\n today.setHours(0, 0, 0, 0);\n return today;\n }\n let mDate = dayjs(str, dateFormat2.trim(), true);\n if (mDate.isValid()) {\n return mDate.toDate();\n } else {\n log.debug(\"Invalid date:\" + str);\n log.debug(\"With date format:\" + dateFormat2.trim());\n const d = new Date(str);\n if (d === void 0 || isNaN(d.getTime()) || // 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() < -1e4 || d.getFullYear() > 1e4) {\n throw new Error(\"Invalid date:\" + str);\n }\n return d;\n }\n}, \"getStartDate\");\nvar parseDuration = /* @__PURE__ */ __name(function(str) {\n const statement = /^(\\d+(?:\\.\\d+)?)([Mdhmswy]|ms)$/.exec(str.trim());\n if (statement !== null) {\n return [Number.parseFloat(statement[1]), statement[2]];\n }\n return [NaN, \"ms\"];\n}, \"parseDuration\");\nvar getEndDate = /* @__PURE__ */ __name(function(prevTime, dateFormat2, str, inclusive = false) {\n str = str.trim();\n const untilRePattern = /^until\\s+(?[\\d\\w- ]+)/;\n const untilStatement = untilRePattern.exec(str);\n if (untilStatement !== null) {\n let earliestTask = null;\n for (const id of untilStatement.groups.ids.split(\" \")) {\n let task = findTaskById(id);\n if (task !== void 0 && (!earliestTask || task.startTime < earliestTask.startTime)) {\n earliestTask = task;\n }\n }\n if (earliestTask) {\n return earliestTask.startTime;\n }\n const today = /* @__PURE__ */ new Date();\n today.setHours(0, 0, 0, 0);\n return today;\n }\n let parsedDate = dayjs(str, dateFormat2.trim(), true);\n if (parsedDate.isValid()) {\n if (inclusive) {\n parsedDate = parsedDate.add(1, \"d\");\n }\n return parsedDate.toDate();\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}, \"getEndDate\");\nvar taskCnt = 0;\nvar parseId = /* @__PURE__ */ __name(function(idStr) {\n if (idStr === void 0) {\n taskCnt = taskCnt + 1;\n return \"task\" + taskCnt;\n }\n return idStr;\n}, \"parseId\");\nvar compileData = /* @__PURE__ */ __name(function(prevTask, dataStr) {\n let ds;\n if (dataStr.substr(0, 1) === \":\") {\n ds = dataStr.substr(1, dataStr.length);\n } else {\n ds = dataStr;\n }\n const data = ds.split(\",\");\n const task = {};\n getTaskTags(data, task, tags);\n for (let i = 0; i < data.length; i++) {\n data[i] = data[i].trim();\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(void 0, dateFormat, data[0]);\n endTimeData = data[1];\n break;\n case 3:\n task.id = parseId(data[0]);\n task.startTime = getStartDate(void 0, dateFormat, data[1]);\n endTimeData = data[2];\n break;\n default:\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 return task;\n}, \"compileData\");\nvar parseData = /* @__PURE__ */ __name(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 const data = ds.split(\",\");\n const task = {};\n getTaskTags(data, task, tags);\n for (let i = 0; i < data.length; i++) {\n data[i] = data[i].trim();\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 return task;\n}, \"parseData\");\nvar lastTask;\nvar lastTaskID;\nvar rawTasks = [];\nvar taskDb = {};\nvar addTask = /* @__PURE__ */ __name(function(descr, data) {\n const rawTask = {\n section: currentSection,\n type: currentSection,\n processed: false,\n manualEndTime: false,\n renderEndTime: null,\n raw: { 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.order = lastOrder;\n lastOrder++;\n const pos = rawTasks.push(rawTask);\n lastTaskID = rawTask.id;\n taskDb[rawTask.id] = pos - 1;\n}, \"addTask\");\nvar findTaskById = /* @__PURE__ */ __name(function(id) {\n const pos = taskDb[id];\n return rawTasks[pos];\n}, \"findTaskById\");\nvar addTaskOrg = /* @__PURE__ */ __name(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 lastTask = newTask;\n tasks.push(newTask);\n}, \"addTaskOrg\");\nvar compileTasks = /* @__PURE__ */ __name(function() {\n const compileTask = /* @__PURE__ */ __name(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(void 0, dateFormat, rawTasks[pos].raw.startTime.startData);\n if (startTime) {\n rawTasks[pos].startTime = startTime;\n }\n break;\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 return rawTasks[pos].processed;\n }, \"compileTask\");\n let allProcessed = true;\n for (const [i, rawTask] of rawTasks.entries()) {\n compileTask(i);\n allProcessed = allProcessed && rawTask.processed;\n }\n return allProcessed;\n}, \"compileTasks\");\nvar setLink = /* @__PURE__ */ __name(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 !== void 0) {\n pushFun(id, () => {\n window.open(linkStr, \"_self\");\n });\n links.set(id, linkStr);\n }\n });\n setClass(ids, \"clickable\");\n}, \"setLink\");\nvar setClass = /* @__PURE__ */ __name(function(ids, className) {\n ids.split(\",\").forEach(function(id) {\n let rawTask = findTaskById(id);\n if (rawTask !== void 0) {\n rawTask.classes.push(className);\n }\n });\n}, \"setClass\");\nvar setClickFun = /* @__PURE__ */ __name(function(id, functionName, functionArgs) {\n if (getConfig().securityLevel !== \"loose\") {\n return;\n }\n if (functionName === void 0) {\n return;\n }\n let argList = [];\n if (typeof functionArgs === \"string\") {\n argList = functionArgs.split(/,(?=(?:(?:[^\"]*\"){2})*[^\"]*$)/);\n for (let i = 0; i < argList.length; i++) {\n let item = argList[i].trim();\n if (item.startsWith('\"') && item.endsWith('\"')) {\n item = item.substr(1, item.length - 2);\n }\n argList[i] = item;\n }\n }\n if (argList.length === 0) {\n argList.push(id);\n }\n let rawTask = findTaskById(id);\n if (rawTask !== void 0) {\n pushFun(id, () => {\n utils_default.runFunc(functionName, ...argList);\n });\n }\n}, \"setClickFun\");\nvar pushFun = /* @__PURE__ */ __name(function(id, callbackFunction) {\n funs.push(\n function() {\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 = document.querySelector(`[id=\"${id}-text\"]`);\n if (elem !== null) {\n elem.addEventListener(\"click\", function() {\n callbackFunction();\n });\n }\n }\n );\n}, \"pushFun\");\nvar setClickEvent = /* @__PURE__ */ __name(function(ids, functionName, functionArgs) {\n ids.split(\",\").forEach(function(id) {\n setClickFun(id, functionName, functionArgs);\n });\n setClass(ids, \"clickable\");\n}, \"setClickEvent\");\nvar bindFunctions = /* @__PURE__ */ __name(function(element) {\n funs.forEach(function(fun) {\n fun(element);\n });\n}, \"bindFunctions\");\nvar ganttDb_default = {\n getConfig: /* @__PURE__ */ __name(() => getConfig().gantt, \"getConfig\"),\n clear: clear2,\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};\nfunction getTaskTags(data, task, tags2) {\n let matchFound = true;\n while (matchFound) {\n matchFound = false;\n tags2.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__name(getTaskTags, \"getTaskTags\");\n\n// src/diagrams/gantt/ganttRenderer.js\nimport dayjs2 from \"dayjs\";\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\";\nvar setConf = /* @__PURE__ */ __name(function() {\n log.debug(\"Something is calling, setConf, remove the call\");\n}, \"setConf\");\nvar mapWeekdayToTimeFunction = {\n monday: timeMonday,\n tuesday: timeTuesday,\n wednesday: timeWednesday,\n thursday: timeThursday,\n friday: timeFriday,\n saturday: timeSaturday,\n sunday: timeSunday\n};\nvar getMaxIntersections = /* @__PURE__ */ __name((tasks2, orderOffset) => {\n let timeline = [...tasks2].map(() => -Infinity);\n let sorted = [...tasks2].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 return maxIntersections;\n}, \"getMaxIntersections\");\nvar w;\nvar draw = /* @__PURE__ */ __name(function(text, id, version, diagObj) {\n const conf = getConfig().gantt;\n const securityLevel = getConfig().securityLevel;\n let sandboxElement;\n if (securityLevel === \"sandbox\") {\n sandboxElement = select(\"#i\" + id);\n }\n const root = securityLevel === \"sandbox\" ? select(sandboxElement.nodes()[0].contentDocument.body) : select(\"body\");\n const doc = securityLevel === \"sandbox\" ? sandboxElement.nodes()[0].contentDocument : document;\n const elem = doc.getElementById(id);\n w = elem.parentElement.offsetWidth;\n if (w === void 0) {\n w = 1200;\n }\n if (conf.useWidth !== void 0) {\n w = conf.useWidth;\n }\n const taskArray = diagObj.db.getTasks();\n let categories = [];\n for (const element of taskArray) {\n categories.push(element.type);\n }\n categories = checkUnique(categories);\n const categoryHeights = {};\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] === void 0) {\n categoryElements[element.section] = [element];\n } else {\n categoryElements[element.section].push(element);\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 elem.setAttribute(\"viewBox\", \"0 0 \" + w + \" \" + h);\n const svg = root.select(`[id=\"${id}\"]`);\n const timeScale = scaleTime().domain([\n min(taskArray, function(d) {\n return d.startTime;\n }),\n max(taskArray, function(d) {\n return d.endTime;\n })\n ]).rangeRound([0, w - conf.leftPadding - conf.rightPadding]);\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 __name(taskCompare, \"taskCompare\");\n taskArray.sort(taskCompare);\n makeGantt(taskArray, w, h);\n configureSvgSize(svg, h, w, conf.useMaxWidth);\n svg.append(\"text\").text(diagObj.db.getDiagramTitle()).attr(\"x\", w / 2).attr(\"y\", conf.titleTopMargin).attr(\"class\", \"titleText\");\n function makeGantt(tasks2, pageWidth, pageHeight) {\n const barHeight = conf.barHeight;\n const gap = barHeight + conf.barGap;\n const topPadding = conf.topPadding;\n const leftPadding = conf.leftPadding;\n const colorScale = scaleLinear().domain([0, categories.length]).range([\"#00B9FA\", \"#F95002\"]).interpolate(interpolateHcl);\n drawExcludeDays(\n gap,\n topPadding,\n leftPadding,\n pageWidth,\n pageHeight,\n tasks2,\n diagObj.db.getExcludes(),\n diagObj.db.getIncludes()\n );\n makeGrid(leftPadding, topPadding, pageWidth, pageHeight);\n drawRects(tasks2, gap, topPadding, leftPadding, barHeight, colorScale, pageWidth, pageHeight);\n vertLabels(gap, topPadding, leftPadding, barHeight, colorScale);\n drawToday(leftPadding, topPadding, pageWidth, pageHeight);\n }\n __name(makeGantt, \"makeGantt\");\n function drawRects(theArray, theGap, theTopPad, theSidePad, theBarHeight, theColorScale, w2) {\n const uniqueTaskOrderIds = [...new Set(theArray.map((item) => item.order))];\n const uniqueTasks = uniqueTaskOrderIds.map((id2) => theArray.find((item) => item.order === id2));\n svg.append(\"g\").selectAll(\"rect\").data(uniqueTasks).enter().append(\"rect\").attr(\"x\", 0).attr(\"y\", function(d, i) {\n i = d.order;\n return i * theGap + theTopPad - 2;\n }).attr(\"width\", function() {\n return w2 - conf.rightPadding / 2;\n }).attr(\"height\", theGap).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 const rectangles = svg.append(\"g\").selectAll(\"rect\").data(theArray).enter();\n const links2 = diagObj.db.getLinks();\n rectangles.append(\"rect\").attr(\"id\", function(d) {\n return d.id;\n }).attr(\"rx\", 3).attr(\"ry\", 3).attr(\"x\", function(d) {\n if (d.milestone) {\n return timeScale(d.startTime) + theSidePad + 0.5 * (timeScale(d.endTime) - timeScale(d.startTime)) - 0.5 * theBarHeight;\n }\n return timeScale(d.startTime) + theSidePad;\n }).attr(\"y\", function(d, i) {\n i = d.order;\n return i * theGap + theTopPad;\n }).attr(\"width\", function(d) {\n if (d.milestone) {\n return theBarHeight;\n }\n return timeScale(d.renderEndTime || d.endTime) - timeScale(d.startTime);\n }).attr(\"height\", theBarHeight).attr(\"transform-origin\", function(d, i) {\n i = d.order;\n return (timeScale(d.startTime) + theSidePad + 0.5 * (timeScale(d.endTime) - timeScale(d.startTime))).toString() + \"px \" + (i * theGap + theTopPad + 0.5 * theBarHeight).toString() + \"px\";\n }).attr(\"class\", function(d) {\n const res = \"task\";\n let classStr = \"\";\n if (d.classes.length > 0) {\n classStr = d.classes.join(\" \");\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 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 if (taskClass.length === 0) {\n taskClass = \" task\";\n }\n if (d.milestone) {\n taskClass = \" milestone \" + taskClass;\n }\n taskClass += secNum;\n taskClass += \" \" + classStr;\n return res + taskClass;\n });\n rectangles.append(\"text\").attr(\"id\", function(d) {\n return d.id + \"-text\";\n }).text(function(d) {\n return d.task;\n }).attr(\"font-size\", conf.fontSize).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 }\n if (d.milestone) {\n endX = startX + theBarHeight;\n }\n const textWidth = this.getBBox().width;\n if (textWidth > endX - startX) {\n if (endX + textWidth + 1.5 * conf.leftPadding > w2) {\n return startX + theSidePad - 5;\n } else {\n return endX + theSidePad + 5;\n }\n } else {\n return (endX - startX) / 2 + startX + theSidePad;\n }\n }).attr(\"y\", function(d, i) {\n i = d.order;\n return i * theGap + conf.barHeight / 2 + (conf.fontSize / 2 - 2) + theTopPad;\n }).attr(\"text-height\", theBarHeight).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 const textWidth = this.getBBox().width;\n let classStr = \"\";\n if (d.classes.length > 0) {\n classStr = d.classes.join(\" \");\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 let taskType = \"\";\n if (d.active) {\n if (d.crit) {\n taskType = \"activeCritText\" + secNum;\n } else {\n taskType = \"activeText\" + secNum;\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 if (d.milestone) {\n taskType += \" milestoneText\";\n }\n if (textWidth > endX - startX) {\n if (endX + textWidth + 1.5 * conf.leftPadding > w2) {\n return classStr + \" taskTextOutsideLeft taskTextOutside\" + secNum + \" \" + taskType;\n } else {\n return classStr + \" taskTextOutsideRight taskTextOutside\" + secNum + \" \" + taskType + \" width-\" + textWidth;\n }\n } else {\n return classStr + \" taskText taskText\" + secNum + \" \" + taskType + \" width-\" + textWidth;\n }\n });\n const securityLevel2 = getConfig().securityLevel;\n if (securityLevel2 === \"sandbox\") {\n let sandboxElement2;\n sandboxElement2 = select(\"#i\" + id);\n const doc2 = sandboxElement2.nodes()[0].contentDocument;\n rectangles.filter(function(d) {\n return links2.has(d.id);\n }).each(function(o) {\n var taskRect = doc2.querySelector(\"#\" + o.id);\n var taskText = doc2.querySelector(\"#\" + o.id + \"-text\");\n const oldParent = taskRect.parentNode;\n var Link = doc2.createElement(\"a\");\n Link.setAttribute(\"xlink:href\", links2.get(o.id));\n Link.setAttribute(\"target\", \"_top\");\n oldParent.appendChild(Link);\n Link.appendChild(taskRect);\n Link.appendChild(taskText);\n });\n }\n }\n __name(drawRects, \"drawRects\");\n function drawExcludeDays(theGap, theTopPad, theSidePad, w2, h2, tasks2, excludes2, includes2) {\n if (excludes2.length === 0 && includes2.length === 0) {\n return;\n }\n let minTime;\n let maxTime;\n for (const { startTime, endTime } of tasks2) {\n if (minTime === void 0 || startTime < minTime) {\n minTime = startTime;\n }\n if (maxTime === void 0 || endTime > maxTime) {\n maxTime = endTime;\n }\n }\n if (!minTime || !maxTime) {\n return;\n }\n if (dayjs2(maxTime).diff(dayjs2(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 const dateFormat2 = diagObj.db.getDateFormat();\n const excludeRanges = [];\n let range = null;\n let d = dayjs2(minTime);\n while (d.valueOf() <= maxTime) {\n if (diagObj.db.isInvalidDate(d, dateFormat2, excludes2, includes2)) {\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 const rectangles = svg.append(\"g\").selectAll(\"rect\").data(excludeRanges).enter();\n rectangles.append(\"rect\").attr(\"id\", function(d2) {\n return \"exclude-\" + d2.start.format(\"YYYY-MM-DD\");\n }).attr(\"x\", function(d2) {\n return timeScale(d2.start) + theSidePad;\n }).attr(\"y\", conf.gridLineStartPadding).attr(\"width\", function(d2) {\n const renderEnd = d2.end.add(1, \"day\");\n return timeScale(renderEnd) - timeScale(d2.start);\n }).attr(\"height\", h2 - theTopPad - conf.gridLineStartPadding).attr(\"transform-origin\", function(d2, i) {\n return (timeScale(d2.start) + theSidePad + 0.5 * (timeScale(d2.end) - timeScale(d2.start))).toString() + \"px \" + (i * theGap + 0.5 * h2).toString() + \"px\";\n }).attr(\"class\", \"exclude-range\");\n }\n __name(drawExcludeDays, \"drawExcludeDays\");\n function makeGrid(theSidePad, theTopPad, w2, h2) {\n let bottomXAxis = axisBottom(timeScale).tickSize(-h2 + theTopPad + conf.gridLineStartPadding).tickFormat(timeFormat(diagObj.db.getAxisFormat() || conf.axisFormat || \"%Y-%m-%d\"));\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 if (resultTickInterval !== null) {\n const every = resultTickInterval[1];\n const interval = resultTickInterval[2];\n const weekday2 = diagObj.db.getWeekday() || conf.weekday;\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[weekday2].every(every));\n break;\n case \"month\":\n bottomXAxis.ticks(timeMonth.every(every));\n break;\n }\n }\n 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\");\n if (diagObj.db.topAxisEnabled() || conf.topAxis) {\n let topXAxis = axisTop(timeScale).tickSize(-h2 + theTopPad + conf.gridLineStartPadding).tickFormat(timeFormat(diagObj.db.getAxisFormat() || conf.axisFormat || \"%Y-%m-%d\"));\n if (resultTickInterval !== null) {\n const every = resultTickInterval[1];\n const interval = resultTickInterval[2];\n const weekday2 = diagObj.db.getWeekday() || conf.weekday;\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[weekday2].every(every));\n break;\n case \"month\":\n topXAxis.ticks(timeMonth.every(every));\n break;\n }\n }\n 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);\n }\n }\n __name(makeGrid, \"makeGrid\");\n function vertLabels(theGap, theTopPad) {\n let prevGap = 0;\n const numOccurrences = Object.keys(categoryHeights).map((d) => [d, categoryHeights[d]]);\n svg.append(\"g\").selectAll(\"text\").data(numOccurrences).enter().append(function(d) {\n const rows = d[0].split(common_default.lineBreakRegex);\n const dy = -(rows.length - 1) / 2;\n const svgLabel = doc.createElementNS(\"http://www.w3.org/2000/svg\", \"text\");\n svgLabel.setAttribute(\"dy\", dy + \"em\");\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 }).attr(\"x\", 10).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 }).attr(\"font-size\", conf.sectionFontSize).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 __name(vertLabels, \"vertLabels\");\n function drawToday(theSidePad, theTopPad, w2, h2) {\n const todayMarker2 = diagObj.db.getTodayMarker();\n if (todayMarker2 === \"off\") {\n return;\n }\n const todayG = svg.append(\"g\").attr(\"class\", \"today\");\n const today = /* @__PURE__ */ new Date();\n const todayLine = todayG.append(\"line\");\n todayLine.attr(\"x1\", timeScale(today) + theSidePad).attr(\"x2\", timeScale(today) + theSidePad).attr(\"y1\", conf.titleTopMargin).attr(\"y2\", h2 - conf.titleTopMargin).attr(\"class\", \"today\");\n if (todayMarker2 !== \"\") {\n todayLine.attr(\"style\", todayMarker2.replace(/,/g, \";\"));\n }\n }\n __name(drawToday, \"drawToday\");\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 hash[arr[i]] = true;\n result.push(arr[i]);\n }\n }\n return result;\n }\n __name(checkUnique, \"checkUnique\");\n}, \"draw\");\nvar ganttRenderer_default = {\n setConf,\n draw\n};\n\n// src/diagrams/gantt/styles.js\nvar getStyles = /* @__PURE__ */ __name((options) => `\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 .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`, \"getStyles\");\nvar styles_default = getStyles;\n\n// src/diagrams/gantt/ganttDiagram.ts\nvar diagram = {\n parser: gantt_default,\n db: ganttDb_default,\n renderer: ganttRenderer_default,\n styles: styles_default\n};\nexport {\n diagram\n};\n","!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).dayjs_plugin_advancedFormat=t()}(this,(function(){\"use strict\";return function(e,t){var r=t.prototype,n=r.format;r.format=function(e){var t=this,r=this.$locale();if(!this.isValid())return n.bind(this)(e);var s=this.$utils(),a=(e||\"YYYY-MM-DDTHH:mm:ssZ\").replace(/\\[([^\\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|Do|X|x|k{1,2}|S/g,(function(e){switch(e){case\"Q\":return Math.ceil((t.$M+1)/3);case\"Do\":return r.ordinal(t.$D);case\"gggg\":return t.weekYear();case\"GGGG\":return t.isoWeekYear();case\"wo\":return r.ordinal(t.week(),\"W\");case\"w\":case\"ww\":return s.s(t.week(),\"w\"===e?1:2,\"0\");case\"W\":case\"WW\":return s.s(t.isoWeek(),\"W\"===e?1:2,\"0\");case\"k\":case\"kk\":return s.s(String(0===t.$H?24:t.$H),\"k\"===e?1:2,\"0\");case\"X\":return Math.floor(t.$d.getTime()/1e3);case\"x\":return t.$d.getTime();case\"z\":return\"[\"+t.offsetName()+\"]\";case\"zzz\":return\"[\"+t.offsetName(\"long\")+\"]\";default:return e}}));return n.bind(this)(a)}}}));","!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).dayjs_plugin_isoWeek=t()}(this,(function(){\"use strict\";var e=\"day\";return function(t,i,s){var a=function(t){return t.add(4-t.isoWeekday(),e)},d=i.prototype;d.isoWeekYear=function(){return a(this).year()},d.isoWeek=function(t){if(!this.$utils().u(t))return this.add(7*(t-this.isoWeek()),e);var i,d,n,o,r=a(this),u=(i=this.isoWeekYear(),d=this.$u,n=(d?s.utc:s)().year(i).startOf(\"year\"),o=4-n.isoWeekday(),n.isoWeekday()>4&&(o+=7),n.add(o,e));return r.diff(u,\"week\")+1},d.isoWeekday=function(e){return this.$utils().u(e)?this.day()||7:this.day(this.day()%7?e:e-7)};var n=d.startOf;d.startOf=function(e,t){var i=this.$utils(),s=!!i.u(t)||t;return\"isoweek\"===i.p(e)?s?this.date(this.date()-(this.isoWeekday()-1)).startOf(\"day\"):this.date(this.date()-1-(this.isoWeekday()-1)+7).endOf(\"day\"):n.bind(this)(e,t)}}}));","!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):(e=\"undefined\"!=typeof globalThis?globalThis:e||self).dayjs_plugin_customParseFormat=t()}(this,(function(){\"use strict\";var e={LTS:\"h:mm:ss A\",LT:\"h:mm A\",L:\"MM/DD/YYYY\",LL:\"MMMM D, YYYY\",LLL:\"MMMM D, YYYY h:mm A\",LLLL:\"dddd, MMMM D, YYYY h:mm A\"},t=/(\\[[^[]*\\])|([-_:/.,()\\s]+)|(A|a|Q|YYYY|YY?|ww?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g,n=/\\d/,r=/\\d\\d/,i=/\\d\\d?/,o=/\\d*[^-_:/,()\\s\\d]+/,s={},a=function(e){return(e=+e)+(e>68?1900:2e3)};var f=function(e){return function(t){this[e]=+t}},h=[/[+-]\\d\\d:?(\\d\\d)?|Z/,function(e){(this.zone||(this.zone={})).offset=function(e){if(!e)return 0;if(\"Z\"===e)return 0;var t=e.match(/([+-]|\\d\\d)/g),n=60*t[1]+(+t[2]||0);return 0===n?0:\"+\"===t[0]?-n:n}(e)}],u=function(e){var t=s[e];return t&&(t.indexOf?t:t.s.concat(t.f))},d=function(e,t){var n,r=s.meridiem;if(r){for(var i=1;i<=24;i+=1)if(e.indexOf(r(i,0,t))>-1){n=i>12;break}}else n=e===(t?\"pm\":\"PM\");return n},c={A:[o,function(e){this.afternoon=d(e,!1)}],a:[o,function(e){this.afternoon=d(e,!0)}],Q:[n,function(e){this.month=3*(e-1)+1}],S:[n,function(e){this.milliseconds=100*+e}],SS:[r,function(e){this.milliseconds=10*+e}],SSS:[/\\d{3}/,function(e){this.milliseconds=+e}],s:[i,f(\"seconds\")],ss:[i,f(\"seconds\")],m:[i,f(\"minutes\")],mm:[i,f(\"minutes\")],H:[i,f(\"hours\")],h:[i,f(\"hours\")],HH:[i,f(\"hours\")],hh:[i,f(\"hours\")],D:[i,f(\"day\")],DD:[r,f(\"day\")],Do:[o,function(e){var t=s.ordinal,n=e.match(/\\d+/);if(this.day=n[0],t)for(var r=1;r<=31;r+=1)t(r).replace(/\\[|\\]/g,\"\")===e&&(this.day=r)}],w:[i,f(\"week\")],ww:[r,f(\"week\")],M:[i,f(\"month\")],MM:[r,f(\"month\")],MMM:[o,function(e){var t=u(\"months\"),n=(u(\"monthsShort\")||t.map((function(e){return e.slice(0,3)}))).indexOf(e)+1;if(n<1)throw new Error;this.month=n%12||n}],MMMM:[o,function(e){var t=u(\"months\").indexOf(e)+1;if(t<1)throw new Error;this.month=t%12||t}],Y:[/[+-]?\\d+/,f(\"year\")],YY:[r,function(e){this.year=a(e)}],YYYY:[/\\d{4}/,f(\"year\")],Z:h,ZZ:h};function l(n){var r,i;r=n,i=s&&s.formats;for(var o=(n=r.replace(/(\\[[^\\]]+])|(LTS?|l{1,4}|L{1,4})/g,(function(t,n,r){var o=r&&r.toUpperCase();return n||i[r]||e[r]||i[o].replace(/(\\[[^\\]]+])|(MMMM|MM|DD|dddd)/g,(function(e,t,n){return t||n.slice(1)}))}))).match(t),a=o.length,f=0;f-1)return new Date((\"X\"===t?1e3:1)*e);var i=l(t)(e),o=i.year,s=i.month,a=i.day,f=i.hours,h=i.minutes,u=i.seconds,d=i.milliseconds,c=i.zone,m=i.week,M=new Date,Y=a||(o||s?1:M.getDate()),p=o||M.getFullYear(),v=0;o&&!s||(v=s>0?s-1:M.getMonth());var D,w=f||0,g=h||0,y=u||0,L=d||0;return c?new Date(Date.UTC(p,v,Y,w,g,y,L+60*c.offset*1e3)):n?new Date(Date.UTC(p,v,Y,w,g,y,L)):(D=new Date(p,v,Y,w,g,y,L),m&&(D=r(D).week(m).toDate()),D)}catch(e){return new Date(\"\")}}(t,a,r,n),this.init(),d&&!0!==d&&(this.$L=this.locale(d).$L),u&&t!=this.format(a)&&(this.$d=new Date(\"\")),s={}}else if(a instanceof Array)for(var c=a.length,m=1;m<=c;m+=1){o[1]=a[m-1];var M=n.apply(this,o);if(M.isValid()){this.$d=M.$d,this.$L=M.$L,this.init();break}m===c&&(this.$d=new Date(\"\"))}else i.call(this,e)}}}));"],"names":["parser","o","__name","k","v","o2","l","length","$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","parser2","trace","yy","symbols_","terminals_","productions_","performAction","yytext","yyleng","yylineno","yystate","$$","_$","$0","this","$","push","setWeekday","setWeekend","setDateFormat","substr","enableInclusiveEndDates","TopAxis","setAxisFormat","setTickInterval","setExcludes","setIncludes","setTodayMarker","setDiagramTitle","trim","setAccTitle","setAccDescription","addSection","addTask","setClickEvent","setLink","table","defaultActions","parseError","str","hash","recoverable","error","Error","parse","input","self","stack","tstack","vstack","lstack","recovering","args","slice","call","arguments","lexer2","Object","create","lexer","sharedState","prototype","hasOwnProperty","setInput","yylloc","yyloc","ranges","options","lex","token","pop","Array","getPrototypeOf","n","symbol","preErrorSymbol","state","action","r","p","len","newState","expected","yyval","errStr","showPosition","join","text","match","line","loc","first_line","last_line","first_column","last_column","range","apply","concat","EOF","_input","_more","_backtrack","done","matched","conditionStack","offset","ch","unput","lines","split","oldLines","more","reject","backtrack_lexer","less","pastInput","past","replace","upcomingInput","next","pre","c","test_match","indexed_rule","backup","matches","tempMatch","index","rules","_currentRules","i","flex","begin","condition","popState","conditions","topState","Math","abs","pushState","stateStackSize","yy_","$avoiding_name_collisions","YY_START","Parser","gantt_default","dayjs","dayjsIsoWeek","dayjsCustomParseFormat","dayjsAdvancedFormat","lastTask","lastTaskID","WEEKEND_START_DAY","friday","saturday","dateFormat","axisFormat","tickInterval","todayMarker","includes","excludes","links","Map","sections","tasks","currentSection","displayMode","tags","funs","inclusiveEndDates","topAxis","weekday","weekend","lastOrder","clear2","taskCnt","rawTasks","clear","txt","getAxisFormat","getTickInterval","getTodayMarker","endDatesAreInclusive","enableTopAxis","topAxisEnabled","setDisplayMode","getDisplayMode","getDateFormat","toLowerCase","getIncludes","getExcludes","getLinks","getSections","getTasks","allItemsProcessed","compileTasks","iterationCount","isInvalidDate","date","dateFormat2","excludes2","includes2","format","isoWeekday","getWeekday","startDay","checkTaskDates","task","manualEndTime","startTime","originalEndTime","Date","add","endTime","fixedEndTime","renderEndTime","fixTaskDates","toDate","invalid","getStartDate","prevTime","afterStatement","exec","latestTask","id","groups","ids","findTaskById","today","setHours","mDate","isValid","log","debug","d","isNaN","getTime","getFullYear","parseDuration","statement","Number","parseFloat","NaN","getEndDate","inclusive","undefined","untilStatement","earliestTask","parsedDate","durationValue","durationUnit","newEndTime","parseId","idStr","compileData","prevTask","dataStr","ds","data","getTaskTags","endTimeData","parseData","prevTaskId","type","startData","taskDb","descr","rawTask","section","processed","raw","classes","taskInfo","active","crit","milestone","order","pos","addTaskOrg","newTask","description","compileTask","allProcessed","entries","_linkStr","linkStr","getConfig","securityLevel","sanitizeUrl","forEach","pushFun","window","open","set","setClass","className","setClickFun","functionName","functionArgs","argList","item","startsWith","endsWith","utils_default","runFunc","callbackFunction","elem","document","querySelector","addEventListener","bindFunctions","element","fun","ganttDb_default","gantt","getAccTitle","getDiagramTitle","getAccDescription","tags2","matchFound","t","regex","RegExp","shift","w","setConf","mapWeekdayToTimeFunction","monday","timeMonday","tuesday","timeTuesday","wednesday","timeWednesday","thursday","timeThursday","timeFriday","timeSaturday","sunday","timeSunday","getMaxIntersections","tasks2","orderOffset","timeline","map","Infinity","sorted","sort","a","b","maxIntersections","j","diagram","db","renderer","draw","version","diagObj","conf","sandboxElement","select","root","nodes","contentDocument","body","doc","getElementById","parentElement","offsetWidth","useWidth","taskArray","categories","checkUnique","categoryHeights","h","topPadding","categoryElements","intersections","category","keys","categoryHeight","barHeight","barGap","filter","setAttribute","svg","timeScale","scaleTime","domain","min","max","rangeRound","leftPadding","rightPadding","taskCompare","taskA","taskB","result","makeGantt","pageWidth","pageHeight","gap","colorScale","scaleLinear","interpolate","interpolateHcl","drawExcludeDays","makeGrid","drawRects","vertLabels","drawToday","theArray","theGap","theTopPad","theSidePad","theBarHeight","theColorScale","w2","uniqueTasks","Set","id2","find","append","selectAll","enter","attr","numberSectionStyles","rectangles","links2","toString","classStr","secNum","taskClass","fontSize","startX","endX","textWidth","getBBox","width","taskType","sandboxElement2","doc2","has","each","taskRect","taskText","oldParent","parentNode","Link","createElement","get","appendChild","h2","minTime","maxTime","dayjs2","diff","warn","excludeRanges","valueOf","end","start","d2","gridLineStartPadding","renderEnd","bottomXAxis","axisBottom","tickSize","tickFormat","timeFormat","resultTickInterval","every","interval","weekday2","ticks","timeMillisecond","timeSecond","timeMinute","timeHour","timeDay","timeMonth","style","topXAxis","axisTop","prevGap","numOccurrences","rows","common_default","lineBreakRegex","dy","svgLabel","createElementNS","row","tspan","textContent","sectionFontSize","todayMarker2","todayG","todayLine","titleTopMargin","arr","configureSvgSize","useMaxWidth","styles","fontFamily","excludeBkgColor","sectionBkgColor","sectionBkgColor2","altSectionBkgColor","titleColor","gridColor","textColor","todayLineColor","taskTextDarkColor","taskTextClickableColor","taskTextColor","taskBkgColor","taskBorderColor","taskTextOutsideColor","activeTaskBkgColor","activeTaskBorderColor","doneTaskBorderColor","doneTaskBkgColor","critBorderColor","critBkgColor","module","exports","e","$locale","bind","s","$utils","ceil","$M","ordinal","$D","weekYear","isoWeekYear","week","isoWeek","String","$H","floor","$d","offsetName","year","u","$u","utc","startOf","day","endOf","LTS","LT","L","LL","LLL","LLLL","f","zone","indexOf","meridiem","A","afternoon","Q","month","S","milliseconds","SS","SSS","ss","m","mm","H","HH","hh","D","DD","Do","ww","M","MM","MMM","MMMM","Y","YY","YYYY","Z","ZZ","formats","toUpperCase","hours","customParseFormat","parseTwoDigitYear","Ls","minutes","seconds","getDate","getMonth","g","y","UTC","init","$L","locale"],"sourceRoot":""} \ No newline at end of file diff --git a/frontend/deployed/static/js/453.6fae039d.chunk.js b/frontend/deployed/static/js/453.6fae039d.chunk.js deleted file mode 100644 index d1f320e..0000000 --- a/frontend/deployed/static/js/453.6fae039d.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunkbackstory=self.webpackChunkbackstory||[]).push([[453],{8834:(e,t,n)=>{n.r(t),n.d(t,{getCLS:()=>y,getFCP:()=>g,getFID:()=>F,getLCP:()=>P,getTTFB:()=>D});var i,r,a,o,u=function(e,t){return{name:e,value:void 0===t?-1:t,delta:0,entries:[],id:"v2-".concat(Date.now(),"-").concat(Math.floor(8999999999999*Math.random())+1e12)}},c=function(e,t){try{if(PerformanceObserver.supportedEntryTypes.includes(e)){if("first-input"===e&&!("PerformanceEventTiming"in self))return;var n=new PerformanceObserver((function(e){return e.getEntries().map(t)}));return n.observe({type:e,buffered:!0}),n}}catch(e){}},s=function(e,t){var n=function n(i){"pagehide"!==i.type&&"hidden"!==document.visibilityState||(e(i),t&&(removeEventListener("visibilitychange",n,!0),removeEventListener("pagehide",n,!0)))};addEventListener("visibilitychange",n,!0),addEventListener("pagehide",n,!0)},f=function(e){addEventListener("pageshow",(function(t){t.persisted&&e(t)}),!0)},m=function(e,t,n){var i;return function(r){t.value>=0&&(r||n)&&(t.delta=t.value-(i||0),(t.delta||void 0===i)&&(i=t.value,e(t)))}},v=-1,p=function(){return"hidden"===document.visibilityState?0:1/0},d=function(){s((function(e){var t=e.timeStamp;v=t}),!0)},l=function(){return v<0&&(v=p(),d(),f((function(){setTimeout((function(){v=p(),d()}),0)}))),{get firstHiddenTime(){return v}}},g=function(e,t){var n,i=l(),r=u("FCP"),a=function(e){"first-contentful-paint"===e.name&&(s&&s.disconnect(),e.startTime-1&&e(t)},r=u("CLS",0),a=0,o=[],v=function(e){if(!e.hadRecentInput){var t=o[0],i=o[o.length-1];a&&e.startTime-i.startTime<1e3&&e.startTime-t.startTime<5e3?(a+=e.value,o.push(e)):(a=e.value,o=[e]),a>r.value&&(r.value=a,r.entries=o,n())}},p=c("layout-shift",v);p&&(n=m(i,r,t),s((function(){p.takeRecords().map(v),n(!0)})),f((function(){a=0,T=-1,r=u("CLS",0),n=m(i,r,t)})))},E={passive:!0,capture:!0},w=new Date,L=function(e,t){i||(i=t,r=e,a=new Date,k(removeEventListener),S())},S=function(){if(r>=0&&r1e12?new Date:performance.now())-e.timeStamp;"pointerdown"==e.type?function(e,t){var n=function(){L(e,t),r()},i=function(){r()},r=function(){removeEventListener("pointerup",n,E),removeEventListener("pointercancel",i,E)};addEventListener("pointerup",n,E),addEventListener("pointercancel",i,E)}(t,e):L(t,e)}},k=function(e){["mousedown","keydown","touchstart","pointerdown"].forEach((function(t){return e(t,b,E)}))},F=function(e,t){var n,a=l(),v=u("FID"),p=function(e){e.startTimeperformance.now())return;n.entries=[t],e(n)}catch(e){}},"complete"===document.readyState?setTimeout(t,0):addEventListener("load",(function(){return setTimeout(t,0)}))}}}]); -//# sourceMappingURL=453.6fae039d.chunk.js.map \ No newline at end of file diff --git a/frontend/deployed/static/js/453.6fae039d.chunk.js.map b/frontend/deployed/static/js/453.6fae039d.chunk.js.map deleted file mode 100644 index b2d4c91..0000000 --- a/frontend/deployed/static/js/453.6fae039d.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"static/js/453.6fae039d.chunk.js","mappings":"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","sources":["../node_modules/web-vitals/dist/web-vitals.js"],"sourcesContent":["var e,t,n,i,r=function(e,t){return{name:e,value:void 0===t?-1:t,delta:0,entries:[],id:\"v2-\".concat(Date.now(),\"-\").concat(Math.floor(8999999999999*Math.random())+1e12)}},a=function(e,t){try{if(PerformanceObserver.supportedEntryTypes.includes(e)){if(\"first-input\"===e&&!(\"PerformanceEventTiming\"in self))return;var n=new PerformanceObserver((function(e){return e.getEntries().map(t)}));return n.observe({type:e,buffered:!0}),n}}catch(e){}},o=function(e,t){var n=function n(i){\"pagehide\"!==i.type&&\"hidden\"!==document.visibilityState||(e(i),t&&(removeEventListener(\"visibilitychange\",n,!0),removeEventListener(\"pagehide\",n,!0)))};addEventListener(\"visibilitychange\",n,!0),addEventListener(\"pagehide\",n,!0)},u=function(e){addEventListener(\"pageshow\",(function(t){t.persisted&&e(t)}),!0)},c=function(e,t,n){var i;return function(r){t.value>=0&&(r||n)&&(t.delta=t.value-(i||0),(t.delta||void 0===i)&&(i=t.value,e(t)))}},f=-1,s=function(){return\"hidden\"===document.visibilityState?0:1/0},m=function(){o((function(e){var t=e.timeStamp;f=t}),!0)},v=function(){return f<0&&(f=s(),m(),u((function(){setTimeout((function(){f=s(),m()}),0)}))),{get firstHiddenTime(){return f}}},d=function(e,t){var n,i=v(),o=r(\"FCP\"),f=function(e){\"first-contentful-paint\"===e.name&&(m&&m.disconnect(),e.startTime-1&&e(t)},f=r(\"CLS\",0),s=0,m=[],v=function(e){if(!e.hadRecentInput){var t=m[0],i=m[m.length-1];s&&e.startTime-i.startTime<1e3&&e.startTime-t.startTime<5e3?(s+=e.value,m.push(e)):(s=e.value,m=[e]),s>f.value&&(f.value=s,f.entries=m,n())}},h=a(\"layout-shift\",v);h&&(n=c(i,f,t),o((function(){h.takeRecords().map(v),n(!0)})),u((function(){s=0,l=-1,f=r(\"CLS\",0),n=c(i,f,t)})))},T={passive:!0,capture:!0},y=new Date,g=function(i,r){e||(e=r,t=i,n=new Date,w(removeEventListener),E())},E=function(){if(t>=0&&t1e12?new Date:performance.now())-e.timeStamp;\"pointerdown\"==e.type?function(e,t){var n=function(){g(e,t),r()},i=function(){r()},r=function(){removeEventListener(\"pointerup\",n,T),removeEventListener(\"pointercancel\",i,T)};addEventListener(\"pointerup\",n,T),addEventListener(\"pointercancel\",i,T)}(t,e):g(t,e)}},w=function(e){[\"mousedown\",\"keydown\",\"touchstart\",\"pointerdown\"].forEach((function(t){return e(t,S,T)}))},L=function(n,f){var s,m=v(),d=r(\"FID\"),p=function(e){e.startTimeperformance.now())return;n.entries=[t],e(n)}catch(e){}},\"complete\"===document.readyState?setTimeout(t,0):addEventListener(\"load\",(function(){return setTimeout(t,0)}))};export{h as getCLS,d as getFCP,L as getFID,F as getLCP,P as getTTFB};\n"],"names":["e","t","n","i","r","name","value","delta","entries","id","concat","Date","now","Math","floor","random","a","PerformanceObserver","supportedEntryTypes","includes","self","getEntries","map","observe","type","buffered","o","document","visibilityState","removeEventListener","addEventListener","u","persisted","c","f","s","m","timeStamp","v","setTimeout","firstHiddenTime","d","disconnect","startTime","push","window","performance","getEntriesByName","requestAnimationFrame","p","l","h","hadRecentInput","length","takeRecords","T","passive","capture","y","g","w","E","entryType","target","cancelable","processingStart","forEach","S","L","b","F","once","P","getEntriesByType","timing","max","navigationStart","responseStart","readyState"],"sourceRoot":""} \ No newline at end of file diff --git a/frontend/deployed/static/js/461.dcde3ae6.chunk.js b/frontend/deployed/static/js/461.dcde3ae6.chunk.js deleted file mode 100644 index e0b2b7e..0000000 --- a/frontend/deployed/static/js/461.dcde3ae6.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunkbackstory=self.webpackChunkbackstory||[]).push([[461],{5461:(e,r,a)=>{a.d(r,{diagram:()=>c});var t=a(9945),s=a(3957),n=a(3759),i=a(5502),d={parse:(0,n.K2)((async e=>{const r=await(0,i.qg)("info",e);n.Rm.debug(r)}),"parse")},o={version:t.n.version},c={parser:d,db:{getVersion:(0,n.K2)((()=>o.version),"getVersion")},renderer:{draw:(0,n.K2)(((e,r,a)=>{n.Rm.debug("rendering info diagram\n"+e);const t=(0,s.D)(r);(0,n.a$)(t,100,400,!0);t.append("g").append("text").attr("x",100).attr("y",40).attr("class","version").attr("font-size",32).style("text-anchor","middle").text(`v${a}`)}),"draw")}}}}]); -//# sourceMappingURL=461.dcde3ae6.chunk.js.map \ No newline at end of file diff --git a/frontend/deployed/static/js/461.dcde3ae6.chunk.js.map b/frontend/deployed/static/js/461.dcde3ae6.chunk.js.map deleted file mode 100644 index c860ee5..0000000 --- a/frontend/deployed/static/js/461.dcde3ae6.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"static/js/461.dcde3ae6.chunk.js","mappings":"wKAcIA,EAAS,CACXC,OAAuBC,EAAAA,EAAAA,KAAOC,UAC5B,MAAMC,QAAYH,EAAAA,EAAAA,IAAM,OAAQI,GAChCC,EAAAA,GAAIC,MAAMH,EAAI,GACb,UAIDI,EAAkB,CAAEC,QAASC,EAAAA,EAAgBD,SAiB7CE,EAAU,CACZX,SACAY,GAjBO,CACPC,YAF+BX,EAAAA,EAAAA,KAAO,IAAMM,EAAgBC,SAAS,eAmBrEK,SANa,CAAEC,MAPUb,EAAAA,EAAAA,KAAO,CAACc,EAAMC,EAAIR,KAC3CH,EAAAA,GAAIC,MAAM,2BAA6BS,GACvC,MAAME,GAAMC,EAAAA,EAAAA,GAAiBF,IAC7BG,EAAAA,EAAAA,IAAiBF,EAAK,IAAK,KAAK,GAClBA,EAAIG,OAAO,KACnBA,OAAO,QAAQC,KAAK,IAAK,KAAKA,KAAK,IAAK,IAAIA,KAAK,QAAS,WAAWA,KAAK,YAAa,IAAIC,MAAM,cAAe,UAAUP,KAAK,IAAIP,IAAU,GAClJ,S","sources":["../node_modules/mermaid/dist/chunks/mermaid.core/infoDiagram-PH2N3AL5.mjs"],"sourcesContent":["import {\n package_default\n} from \"./chunk-5NNNAHNI.mjs\";\nimport {\n selectSvgElement\n} from \"./chunk-7B677QYD.mjs\";\nimport {\n __name,\n configureSvgSize,\n log\n} from \"./chunk-YTJNT7DU.mjs\";\n\n// src/diagrams/info/infoParser.ts\nimport { parse } from \"@mermaid-js/parser\";\nvar parser = {\n parse: /* @__PURE__ */ __name(async (input) => {\n const ast = await parse(\"info\", input);\n log.debug(ast);\n }, \"parse\")\n};\n\n// src/diagrams/info/infoDb.ts\nvar DEFAULT_INFO_DB = { version: package_default.version };\nvar getVersion = /* @__PURE__ */ __name(() => DEFAULT_INFO_DB.version, \"getVersion\");\nvar db = {\n getVersion\n};\n\n// src/diagrams/info/infoRenderer.ts\nvar draw = /* @__PURE__ */ __name((text, id, version) => {\n log.debug(\"rendering info diagram\\n\" + text);\n const svg = selectSvgElement(id);\n configureSvgSize(svg, 100, 400, true);\n const group = svg.append(\"g\");\n group.append(\"text\").attr(\"x\", 100).attr(\"y\", 40).attr(\"class\", \"version\").attr(\"font-size\", 32).style(\"text-anchor\", \"middle\").text(`v${version}`);\n}, \"draw\");\nvar renderer = { draw };\n\n// src/diagrams/info/infoDiagram.ts\nvar diagram = {\n parser,\n db,\n renderer\n};\nexport {\n diagram\n};\n"],"names":["parser","parse","__name","async","ast","input","log","debug","DEFAULT_INFO_DB","version","package_default","diagram","db","getVersion","renderer","draw","text","id","svg","selectSvgElement","configureSvgSize","append","attr","style"],"sourceRoot":""} \ No newline at end of file diff --git a/frontend/deployed/static/js/467.ed8fe19b.chunk.js b/frontend/deployed/static/js/467.ed8fe19b.chunk.js deleted file mode 100644 index 6a84f61..0000000 --- a/frontend/deployed/static/js/467.ed8fe19b.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunkbackstory=self.webpackChunkbackstory||[]).push([[467],{4467:(t,e,s)=>{s.d(e,{diagram:()=>m});var i=s(522),n=s(6327),r=s(53),a=(s(1580),s(2598),s(958)),u=(s(8434),s(9711),s(2596),s(634)),o=s(3759),c=s(700),l=s(9322),h=s(6471),d=class{constructor(){this.vertexCounter=0,this.config=(0,o.D7)(),this.vertices=new Map,this.edges=[],this.classes=new Map,this.subGraphs=[],this.subGraphLookup=new Map,this.tooltips=new Map,this.subCount=0,this.firstGraphFlag=!0,this.secCount=-1,this.posCrossRef=[],this.funs=[],this.setAccTitle=o.SV,this.setAccDescription=o.EI,this.setDiagramTitle=o.ke,this.getAccTitle=o.iN,this.getAccDescription=o.m7,this.getDiagramTitle=o.ab,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#t=(()=>(0,o.K2)(this,"FlowDB"))();sanitizeText(t){return o.Y2.sanitizeText(t,this.config)}lookUpDomId(t){for(const e of this.vertices.values())if(e.id===t)return e.domId;return t}addVertex(t,e,s,n,r,u){let c,l=arguments.length>6&&void 0!==arguments[6]?arguments[6]:{},h=arguments.length>7?arguments[7]:void 0;if(!t||0===t.trim().length)return;if(void 0!==h){let t;t=h.includes("\n")?h+"\n":"{\n"+h+"\n}",c=(0,i.H)(t,{schema:i.r})}const d=this.edges.find((e=>e.id===t));if(d){const t=c;return void 0!==t?.animate&&(d.animate=t.animate),void(void 0!==t?.animation&&(d.animation=t.animation))}let p,g=this.vertices.get(t);if(void 0===g&&(g={id:t,labelType:"text",domId:"flowchart-"+t+"-"+this.vertexCounter,styles:[],classes:[]},this.vertices.set(t,g)),this.vertexCounter++,void 0!==e?(this.config=(0,o.D7)(),p=this.sanitizeText(e.text.trim()),g.labelType=e.type,p.startsWith('"')&&p.endsWith('"')&&(p=p.substring(1,p.length-1)),g.text=p):void 0===g.text&&(g.text=t),void 0!==s&&(g.type=s),void 0!==n&&null!==n&&n.forEach((t=>{g.styles.push(t)})),void 0!==r&&null!==r&&r.forEach((t=>{g.classes.push(t)})),void 0!==u&&(g.dir=u),void 0===g.props?g.props=l:void 0!==l&&Object.assign(g.props,l),void 0!==c){if(c.shape){if(c.shape!==c.shape.toLowerCase()||c.shape.includes("_"))throw new Error(`No such shape: ${c.shape}. Shape names should be lowercase.`);if(!(0,a.aP)(c.shape))throw new Error(`No such shape: ${c.shape}.`);g.type=c?.shape}c?.label&&(g.text=c?.label),c?.icon&&(g.icon=c?.icon,c.label?.trim()||g.text!==t||(g.text="")),c?.form&&(g.form=c?.form),c?.pos&&(g.pos=c?.pos),c?.img&&(g.img=c?.img,c.label?.trim()||g.text!==t||(g.text="")),c?.constraint&&(g.constraint=c.constraint),c.w&&(g.assetWidth=Number(c.w)),c.h&&(g.assetHeight=Number(c.h))}}addSingleLink(t,e,s,i){const n={start:t,end:e,type:void 0,text:"",labelType:"text",classes:[],isUserDefinedId:!1,interpolate:this.edges.defaultInterpolate};o.Rm.info("abc78 Got edge...",n);const r=s.text;if(void 0!==r&&(n.text=this.sanitizeText(r.text.trim()),n.text.startsWith('"')&&n.text.endsWith('"')&&(n.text=n.text.substring(1,n.text.length-1)),n.labelType=r.type),void 0!==s&&(n.type=s.type,n.stroke=s.stroke,n.length=s.length>10?10:s.length),i&&!this.edges.some((t=>t.id===i)))n.id=i,n.isUserDefinedId=!0;else{const t=this.edges.filter((t=>t.start===n.start&&t.end===n.end));0===t.length?n.id=(0,u.rY)(n.start,n.end,{counter:0,prefix:"L"}):n.id=(0,u.rY)(n.start,n.end,{counter:t.length+1,prefix:"L"})}if(!(this.edges.length<(this.config.maxEdges??500)))throw new Error(`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.`);o.Rm.info("Pushing edge..."),this.edges.push(n)}isLinkData(t){return null!==t&&"object"===typeof t&&"id"in t&&"string"===typeof t.id}addLink(t,e,s){const i=this.isLinkData(s)?s.id.replace("@",""):void 0;o.Rm.info("addLink",t,e,i);for(const n of t)for(const r of e){const a=n===t[t.length-1],u=r===e[0];a&&u?this.addSingleLink(n,r,s,i):this.addSingleLink(n,r,s,void 0)}}updateLinkInterpolate(t,e){t.forEach((t=>{"default"===t?this.edges.defaultInterpolate=e:this.edges[t].interpolate=e}))}updateLink(t,e){t.forEach((t=>{if("number"===typeof t&&t>=this.edges.length)throw new Error(`The index ${t} 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.)`);"default"===t?this.edges.defaultStyle=e:(this.edges[t].style=e,(this.edges[t]?.style?.length??0)>0&&!this.edges[t]?.style?.some((t=>t?.startsWith("fill")))&&this.edges[t]?.style?.push("fill:none"))}))}addClass(t,e){const s=e.join().replace(/\\,/g,"\xa7\xa7\xa7").replace(/,/g,";").replace(/\xa7\xa7\xa7/g,",").split(";");t.split(",").forEach((t=>{let e=this.classes.get(t);void 0===e&&(e={id:t,styles:[],textStyles:[]},this.classes.set(t,e)),void 0!==s&&null!==s&&s.forEach((t=>{if(/color/.exec(t)){const s=t.replace("fill","bgFill");e.textStyles.push(s)}e.styles.push(t)}))}))}setDirection(t){this.direction=t,/.*/.exec(this.direction)&&(this.direction="LR"),/.*v/.exec(this.direction)&&(this.direction="TB"),"TD"===this.direction&&(this.direction="TB")}setClass(t,e){for(const s of t.split(",")){const t=this.vertices.get(s);t&&t.classes.push(e);const i=this.edges.find((t=>t.id===s));i&&i.classes.push(e);const n=this.subGraphLookup.get(s);n&&n.classes.push(e)}}setTooltip(t,e){if(void 0!==e){e=this.sanitizeText(e);for(const s of t.split(","))this.tooltips.set("gen-1"===this.version?this.lookUpDomId(s):s,e)}}setClickFun(t,e,s){const i=this.lookUpDomId(t);if("loose"!==(0,o.D7)().securityLevel)return;if(void 0===e)return;let n=[];if("string"===typeof s){n=s.split(/,(?=(?:(?:[^"]*"){2})*[^"]*$)/);for(let t=0;t{const t=document.querySelector(`[id="${i}"]`);null!==t&&t.addEventListener("click",(()=>{u._K.runFunc(e,...n)}),!1)})))}setLink(t,e,s){t.split(",").forEach((t=>{const i=this.vertices.get(t);void 0!==i&&(i.link=u._K.formatUrl(e,this.config),i.linkTarget=s)})),this.setClass(t,"clickable")}getTooltip(t){return this.tooltips.get(t)}setClickEvent(t,e,s){t.split(",").forEach((t=>{this.setClickFun(t,e,s)})),this.setClass(t,"clickable")}bindFunctions(t){this.funs.forEach((e=>{e(t)}))}getDirection(){return this.direction?.trim()}getVertices(){return this.vertices}getEdges(){return this.edges}getClasses(){return this.classes}setupToolTips(t){let e=(0,c.Ltv)(".mermaidTooltip");null===(e._groups||e)[0][0]&&(e=(0,c.Ltv)("body").append("div").attr("class","mermaidTooltip").style("opacity",0));(0,c.Ltv)(t).select("svg").selectAll("g.node").on("mouseover",(t=>{const s=(0,c.Ltv)(t.currentTarget);if(null===s.attr("title"))return;const i=t.currentTarget?.getBoundingClientRect();e.transition().duration(200).style("opacity",".9"),e.text(s.attr("title")).style("left",window.scrollX+i.left+(i.right-i.left)/2+"px").style("top",window.scrollY+i.bottom+"px"),e.html(e.html().replace(/<br\/>/g,"
")),s.classed("hover",!0)})).on("mouseout",(t=>{e.transition().duration(500).style("opacity",0);(0,c.Ltv)(t.currentTarget).classed("hover",!1)}))}clear(){let t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:"gen-2";this.vertices=new Map,this.classes=new Map,this.edges=[],this.funs=[this.setupToolTips.bind(this)],this.subGraphs=[],this.subGraphLookup=new Map,this.subCount=0,this.tooltips=new Map,this.firstGraphFlag=!0,this.version=t,this.config=(0,o.D7)(),(0,o.IU)()}setGen(t){this.version=t||"gen-2"}defaultStyle(){return"fill:#ffa;stroke: #f66; stroke-width: 3px; stroke-dasharray: 5, 5;fill:#ffa;stroke: #666;"}addSubGraph(t,e,s){let i=t.text.trim(),n=s.text;t===s&&/\s/.exec(s.text)&&(i=void 0);const r=(0,o.K2)((t=>{const e={boolean:{},number:{},string:{}},s=[];let i;return{nodeList:t.filter((function(t){const n=typeof t;return t.stmt&&"dir"===t.stmt?(i=t.value,!1):""!==t.trim()&&(n in e?!e[n].hasOwnProperty(t)&&(e[n][t]=!0):!s.includes(t)&&s.push(t))})),dir:i}}),"uniq"),{nodeList:a,dir:u}=r(e.flat());if("gen-1"===this.version)for(let o=0;o2e3)return{result:!1,count:0};if(this.posCrossRef[this.secCount]=e,this.subGraphs[e].id===t)return{result:!0,count:0};let i=0,n=1;for(;i=0){const s=this.indexNodes2(t,e);if(s.result)return{result:!0,count:n+s.count};n+=s.count}i+=1}return{result:!1,count:n}}getDepthFirstPos(t){return this.posCrossRef[t]}indexNodes(){this.secCount=-1,this.subGraphs.length>0&&this.indexNodes2("none",this.subGraphs.length-1)}getSubGraphs(){return this.subGraphs}firstGraph(){return!!this.firstGraphFlag&&(this.firstGraphFlag=!1,!0)}destructStartLink(t){let e=t.trim(),s="arrow_open";switch(e[0]){case"<":s="arrow_point",e=e.slice(1);break;case"x":s="arrow_cross",e=e.slice(1);break;case"o":s="arrow_circle",e=e.slice(1)}let i="normal";return e.includes("=")&&(i="thick"),e.includes(".")&&(i="dotted"),{type:s,stroke:i}}countChar(t,e){const s=e.length;let i=0;for(let n=0;n":i="arrow_point",e.startsWith("<")&&(i="double_"+i,s=s.slice(1));break;case"o":i="arrow_circle",e.startsWith("o")&&(i="double_"+i,s=s.slice(1))}let n="normal",r=s.length-1;s.startsWith("=")&&(n="thick"),s.startsWith("~")&&(n="invisible");const a=this.countChar(".",s);return a&&(n="dotted",r=a),{type:i,stroke:n,length:r}}destructLink(t,e){const s=this.destructEndLink(t);let i;if(e){if(i=this.destructStartLink(e),i.stroke!==s.stroke)return{type:"INVALID",stroke:"INVALID"};if("arrow_open"===i.type)i.type=s.type;else{if(i.type!==s.type)return{type:"INVALID",stroke:"INVALID"};i.type="double_"+i.type}return"double_arrow"===i.type&&(i.type="double_arrow_point"),i.length=s.length,i}return s}exists(t,e){for(const s of t)if(s.nodes.includes(e))return!0;return!1}makeUniq(t,e){const s=[];return t.nodes.forEach(((i,n)=>{this.exists(e,i)||s.push(t.nodes[n])})),{nodes:s}}getTypeFromVertex(t){if(t.img)return"imageSquare";if(t.icon)return"circle"===t.form?"iconCircle":"square"===t.form?"iconSquare":"rounded"===t.form?"iconRounded":"icon";switch(t.type){case"square":case void 0:return"squareRect";case"round":return"roundedRect";case"ellipse":return"ellipse";default:return t.type}}findNode(t,e){return t.find((t=>t.id===e))}destructEdgeType(t){let e="none",s="arrow_point";switch(t){case"arrow_point":case"arrow_circle":case"arrow_cross":s=t;break;case"double_arrow_point":case"double_arrow_circle":case"double_arrow_cross":e=t.replace("double_",""),s=e}return{arrowTypeStart:e,arrowTypeEnd:s}}addNodeFromVertex(t,e,s,i,n,r){const a=s.get(t.id),u=i.get(t.id)??!1,o=this.findNode(e,t.id);if(o)o.cssStyles=t.styles,o.cssCompiledStyles=this.getCompiledStyles(t.classes),o.cssClasses=t.classes.join(" ");else{const s={id:t.id,label:t.text,labelStyle:"",parentId:a,padding:n.flowchart?.padding||8,cssStyles:t.styles,cssCompiledStyles:this.getCompiledStyles(["default","node",...t.classes]),cssClasses:"default "+t.classes.join(" "),dir:t.dir,domId:t.domId,look:r,link:t.link,linkTarget:t.linkTarget,tooltip:this.getTooltip(t.id),icon:t.icon,pos:t.pos,img:t.img,assetWidth:t.assetWidth,assetHeight:t.assetHeight,constraint:t.constraint};u?e.push({...s,isGroup:!0,shape:"rect"}):e.push({...s,isGroup:!1,shape:this.getTypeFromVertex(t)})}}getCompiledStyles(t){let e=[];for(const s of t){const t=this.classes.get(s);t?.styles&&(e=[...e,...t.styles??[]].map((t=>t.trim()))),t?.textStyles&&(e=[...e,...t.textStyles??[]].map((t=>t.trim())))}return e}getData(){const t=(0,o.D7)(),e=[],s=[],i=this.getSubGraphs(),n=new Map,r=new Map;for(let u=i.length-1;u>=0;u--){const t=i[u];t.nodes.length>0&&r.set(t.id,!0);for(const e of t.nodes)n.set(e,t.id)}for(let u=i.length-1;u>=0;u--){const s=i[u];e.push({id:s.id,label:s.title,labelStyle:"",parentId:n.get(s.id),padding:8,cssCompiledStyles:this.getCompiledStyles(s.classes),cssClasses:s.classes.join(" "),shape:"rect",dir:s.dir,isGroup:!0,look:t.look})}this.getVertices().forEach((s=>{this.addNodeFromVertex(s,e,n,r,t,t.look||"classic")}));const a=this.getEdges();return a.forEach(((e,i)=>{const{arrowTypeStart:n,arrowTypeEnd:r}=this.destructEdgeType(e.type),o=[...a.defaultStyle??[]];e.style&&o.push(...e.style);const c={id:(0,u.rY)(e.start,e.end,{counter:i,prefix:"L"},e.id),isUserDefinedId:e.isUserDefinedId,start:e.start,end:e.end,type:e.type??"normal",label:e.text,labelpos:"c",thickness:e.stroke,minlen:e.length,classes:"invisible"===e?.stroke?"":"edge-thickness-normal edge-pattern-solid flowchart-link",arrowTypeStart:"invisible"===e?.stroke||"arrow_open"===e?.type?"none":n,arrowTypeEnd:"invisible"===e?.stroke||"arrow_open"===e?.type?"none":r,arrowheadStyle:"fill: #333",cssCompiledStyles:this.getCompiledStyles(e.classes),labelStyle:o,style:o,pattern:e.stroke,look:t.look,animate:e.animate,animation:e.animation,curve:e.interpolate||this.edges.defaultInterpolate||t.flowchart?.curve};s.push(c)})),{nodes:e,edges:s,other:{},config:t}}defaultConfig(){return o.ME.flowchart}},p={getClasses:(0,o.K2)((function(t,e){return e.db.getClasses()}),"getClasses"),draw:(0,o.K2)((async function(t,e,s,i){o.Rm.info("REF0:"),o.Rm.info("Drawing state diagram (v2)",e);const{securityLevel:a,flowchart:l,layout:h}=(0,o.D7)();let d;"sandbox"===a&&(d=(0,c.Ltv)("#i"+e));const p="sandbox"===a?d.nodes()[0].contentDocument:document;o.Rm.debug("Before getData: ");const g=i.db.getData();o.Rm.debug("Data: ",g);const A=(0,n.A)(e,a),b=i.db.getDirection();g.type=i.type,g.layoutAlgorithm=(0,r.q7)(h),"dagre"===g.layoutAlgorithm&&"elk"===h&&o.Rm.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."),g.direction=b,g.nodeSpacing=l?.nodeSpacing||50,g.rankSpacing=l?.rankSpacing||50,g.markers=["point","circle","cross"],g.diagramId=e,o.Rm.debug("REF1:",g),await(0,r.XX)(g,A);const y=g.config.flowchart?.diagramPadding??8;u._K.insertTitle(A,"flowchartTitleText",l?.titleTopMargin||0,i.db.getDiagramTitle()),(0,n.P)(A,y,"flowchart",l?.useMaxWidth||!1);for(const n of g.nodes){const t=(0,c.Ltv)(`#${e} [id="${n.id}"]`);if(!t||!n.link)continue;const s=p.createElementNS("http://www.w3.org/2000/svg","a");s.setAttributeNS("http://www.w3.org/2000/svg","class",n.cssClasses),s.setAttributeNS("http://www.w3.org/2000/svg","rel","noopener"),"sandbox"===a?s.setAttributeNS("http://www.w3.org/2000/svg","target","_top"):n.linkTarget&&s.setAttributeNS("http://www.w3.org/2000/svg","target",n.linkTarget);const i=t.insert((function(){return s}),":first-child"),r=t.select(".label-container");r&&i.append((function(){return r.node()}));const u=t.select(".label");u&&i.append((function(){return u.node()}))}}),"draw")},g=function(){var t=(0,o.K2)((function(t,e,s,i){for(s=s||{},i=t.length;i--;s[t[i]]=e);return s}),"o"),e=[1,4],s=[1,3],i=[1,5],n=[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],r=[2,2],a=[1,13],u=[1,14],c=[1,15],l=[1,16],h=[1,23],d=[1,25],p=[1,26],g=[1,27],A=[1,49],b=[1,48],y=[1,29],k=[1,30],f=[1,31],m=[1,32],E=[1,33],C=[1,44],D=[1,46],x=[1,42],T=[1,47],S=[1,43],F=[1,50],_=[1,45],B=[1,51],v=[1,52],w=[1,34],L=[1,35],$=[1,36],I=[1,37],R=[1,57],N=[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],P=[1,61],K=[1,60],G=[1,62],O=[8,9,11,75,77,78],V=[1,78],M=[1,91],U=[1,96],W=[1,95],Y=[1,92],j=[1,88],z=[1,94],X=[1,90],H=[1,97],q=[1,93],Q=[1,98],Z=[1,89],J=[8,9,10,11,40,75,77,78],tt=[8,9,10,11,40,46,75,77,78],et=[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],st=[8,9,11,44,60,75,77,78,89,102,105,106,109,111,114,115,116],it=[44,60,89,102,105,106,109,111,114,115,116],nt=[1,121],rt=[1,122],at=[1,124],ut=[1,123],ot=[44,60,62,74,89,102,105,106,109,111,114,115,116],ct=[1,133],lt=[1,147],ht=[1,148],dt=[1,149],pt=[1,150],gt=[1,135],At=[1,137],bt=[1,141],yt=[1,142],kt=[1,143],ft=[1,144],mt=[1,145],Et=[1,146],Ct=[1,151],Dt=[1,152],xt=[1,131],Tt=[1,132],St=[1,139],Ft=[1,134],_t=[1,138],Bt=[1,136],vt=[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],wt=[1,154],Lt=[1,156],$t=[8,9,11],It=[8,9,10,11,14,44,60,89,105,106,109,111,114,115,116],Rt=[1,176],Nt=[1,172],Pt=[1,173],Kt=[1,177],Gt=[1,174],Ot=[1,175],Vt=[77,116,119],Mt=[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],Ut=[10,106],Wt=[31,49,51,53,55,57,62,64,66,67,69,71,116,117,118],Yt=[1,247],jt=[1,245],zt=[1,249],Xt=[1,243],Ht=[1,244],qt=[1,246],Qt=[1,248],Zt=[1,250],Jt=[1,268],te=[8,9,11,106],ee=[8,9,10,11,60,84,105,106,109,110,111,112],se={trace:(0,o.K2)((function(){}),"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:(0,o.K2)((function(t,e,s,i,n,r,a){var u=r.length-1;switch(n){case 2:case 28:case 29:case 30:case 31:case 32:this.$=[];break;case 3:(!Array.isArray(r[u])||r[u].length>0)&&r[u-1].push(r[u]),this.$=r[u-1];break;case 4:case 183:case 44:case 54:case 76:case 181:this.$=r[u];break;case 11:i.setDirection("TB"),this.$="TB";break;case 12:i.setDirection(r[u-1]),this.$=r[u-1];break;case 27:this.$=r[u-1].nodes;break;case 33:this.$=i.addSubGraph(r[u-6],r[u-1],r[u-4]);break;case 34:this.$=i.addSubGraph(r[u-3],r[u-1],r[u-3]);break;case 35:this.$=i.addSubGraph(void 0,r[u-1],void 0);break;case 37:this.$=r[u].trim(),i.setAccTitle(this.$);break;case 38:case 39:this.$=r[u].trim(),i.setAccDescription(this.$);break;case 43:case 133:this.$=r[u-1]+r[u];break;case 45:i.addVertex(r[u-1][r[u-1].length-1],void 0,void 0,void 0,void 0,void 0,void 0,r[u]),i.addLink(r[u-3].stmt,r[u-1],r[u-2]),this.$={stmt:r[u-1],nodes:r[u-1].concat(r[u-3].nodes)};break;case 46:i.addLink(r[u-2].stmt,r[u],r[u-1]),this.$={stmt:r[u],nodes:r[u].concat(r[u-2].nodes)};break;case 47:i.addLink(r[u-3].stmt,r[u-1],r[u-2]),this.$={stmt:r[u-1],nodes:r[u-1].concat(r[u-3].nodes)};break;case 48:this.$={stmt:r[u-1],nodes:r[u-1]};break;case 49:i.addVertex(r[u-1][r[u-1].length-1],void 0,void 0,void 0,void 0,void 0,void 0,r[u]),this.$={stmt:r[u-1],nodes:r[u-1],shapeData:r[u]};break;case 50:this.$={stmt:r[u],nodes:r[u]};break;case 51:case 128:case 130:this.$=[r[u]];break;case 52:i.addVertex(r[u-5][r[u-5].length-1],void 0,void 0,void 0,void 0,void 0,void 0,r[u-4]),this.$=r[u-5].concat(r[u]);break;case 53:this.$=r[u-4].concat(r[u]);break;case 55:this.$=r[u-2],i.setClass(r[u-2],r[u]);break;case 56:this.$=r[u-3],i.addVertex(r[u-3],r[u-1],"square");break;case 57:this.$=r[u-3],i.addVertex(r[u-3],r[u-1],"doublecircle");break;case 58:this.$=r[u-5],i.addVertex(r[u-5],r[u-2],"circle");break;case 59:this.$=r[u-3],i.addVertex(r[u-3],r[u-1],"ellipse");break;case 60:this.$=r[u-3],i.addVertex(r[u-3],r[u-1],"stadium");break;case 61:this.$=r[u-3],i.addVertex(r[u-3],r[u-1],"subroutine");break;case 62:this.$=r[u-7],i.addVertex(r[u-7],r[u-1],"rect",void 0,void 0,void 0,Object.fromEntries([[r[u-5],r[u-3]]]));break;case 63:this.$=r[u-3],i.addVertex(r[u-3],r[u-1],"cylinder");break;case 64:this.$=r[u-3],i.addVertex(r[u-3],r[u-1],"round");break;case 65:this.$=r[u-3],i.addVertex(r[u-3],r[u-1],"diamond");break;case 66:this.$=r[u-5],i.addVertex(r[u-5],r[u-2],"hexagon");break;case 67:this.$=r[u-3],i.addVertex(r[u-3],r[u-1],"odd");break;case 68:this.$=r[u-3],i.addVertex(r[u-3],r[u-1],"trapezoid");break;case 69:this.$=r[u-3],i.addVertex(r[u-3],r[u-1],"inv_trapezoid");break;case 70:this.$=r[u-3],i.addVertex(r[u-3],r[u-1],"lean_right");break;case 71:this.$=r[u-3],i.addVertex(r[u-3],r[u-1],"lean_left");break;case 72:this.$=r[u],i.addVertex(r[u]);break;case 73:r[u-1].text=r[u],this.$=r[u-1];break;case 74:case 75:r[u-2].text=r[u-1],this.$=r[u-2];break;case 77:var o=i.destructLink(r[u],r[u-2]);this.$={type:o.type,stroke:o.stroke,length:o.length,text:r[u-1]};break;case 78:o=i.destructLink(r[u],r[u-2]);this.$={type:o.type,stroke:o.stroke,length:o.length,text:r[u-1],id:r[u-3]};break;case 79:case 86:case 101:case 103:this.$={text:r[u],type:"text"};break;case 80:case 87:case 102:this.$={text:r[u-1].text+""+r[u],type:r[u-1].type};break;case 81:case 88:this.$={text:r[u],type:"string"};break;case 82:case 89:case 104:this.$={text:r[u],type:"markdown"};break;case 83:o=i.destructLink(r[u]);this.$={type:o.type,stroke:o.stroke,length:o.length};break;case 84:o=i.destructLink(r[u]);this.$={type:o.type,stroke:o.stroke,length:o.length,id:r[u-1]};break;case 85:this.$=r[u-1];break;case 105:this.$=r[u-4],i.addClass(r[u-2],r[u]);break;case 106:this.$=r[u-4],i.setClass(r[u-2],r[u]);break;case 107:case 115:this.$=r[u-1],i.setClickEvent(r[u-1],r[u]);break;case 108:case 116:this.$=r[u-3],i.setClickEvent(r[u-3],r[u-2]),i.setTooltip(r[u-3],r[u]);break;case 109:this.$=r[u-2],i.setClickEvent(r[u-2],r[u-1],r[u]);break;case 110:this.$=r[u-4],i.setClickEvent(r[u-4],r[u-3],r[u-2]),i.setTooltip(r[u-4],r[u]);break;case 111:this.$=r[u-2],i.setLink(r[u-2],r[u]);break;case 112:this.$=r[u-4],i.setLink(r[u-4],r[u-2]),i.setTooltip(r[u-4],r[u]);break;case 113:this.$=r[u-4],i.setLink(r[u-4],r[u-2],r[u]);break;case 114:this.$=r[u-6],i.setLink(r[u-6],r[u-4],r[u]),i.setTooltip(r[u-6],r[u-2]);break;case 117:this.$=r[u-1],i.setLink(r[u-1],r[u]);break;case 118:this.$=r[u-3],i.setLink(r[u-3],r[u-2]),i.setTooltip(r[u-3],r[u]);break;case 119:this.$=r[u-3],i.setLink(r[u-3],r[u-2],r[u]);break;case 120:this.$=r[u-5],i.setLink(r[u-5],r[u-4],r[u]),i.setTooltip(r[u-5],r[u-2]);break;case 121:this.$=r[u-4],i.addVertex(r[u-2],void 0,void 0,r[u]);break;case 122:this.$=r[u-4],i.updateLink([r[u-2]],r[u]);break;case 123:this.$=r[u-4],i.updateLink(r[u-2],r[u]);break;case 124:this.$=r[u-8],i.updateLinkInterpolate([r[u-6]],r[u-2]),i.updateLink([r[u-6]],r[u]);break;case 125:this.$=r[u-8],i.updateLinkInterpolate(r[u-6],r[u-2]),i.updateLink(r[u-6],r[u]);break;case 126:this.$=r[u-6],i.updateLinkInterpolate([r[u-4]],r[u]);break;case 127:this.$=r[u-6],i.updateLinkInterpolate(r[u-4],r[u]);break;case 129:case 131:r[u-2].push(r[u]),this.$=r[u-2];break;case 182:case 184:this.$=r[u-1]+""+r[u];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"}}}),"anonymous"),table:[{3:1,4:2,9:e,10:s,12:i},{1:[3]},t(n,r,{5:6}),{4:7,9:e,10:s,12:i},{4:8,9:e,10:s,12:i},{13:[1,9],14:[1,10]},{1:[2,1],6:11,7:12,8:a,9:u,10:c,11:l,20:17,22:18,23:19,24:20,25:21,26:22,27:h,33:24,34:d,36:p,38:g,42:28,43:38,44:A,45:39,47:40,60:b,84:y,85:k,86:f,87:m,88:E,89:C,102:D,105:x,106:T,109:S,111:F,113:41,114:_,115:B,116:v,121:w,122:L,123:$,124:I},t(n,[2,9]),t(n,[2,10]),t(n,[2,11]),{8:[1,54],9:[1,55],10:R,15:53,18:56},t(N,[2,3]),t(N,[2,4]),t(N,[2,5]),t(N,[2,6]),t(N,[2,7]),t(N,[2,8]),{8:P,9:K,11:G,21:58,41:59,72:63,75:[1,64],77:[1,66],78:[1,65]},{8:P,9:K,11:G,21:67},{8:P,9:K,11:G,21:68},{8:P,9:K,11:G,21:69},{8:P,9:K,11:G,21:70},{8:P,9:K,11:G,21:71},{8:P,9:K,10:[1,72],11:G,21:73},t(N,[2,36]),{35:[1,74]},{37:[1,75]},t(N,[2,39]),t(O,[2,50],{18:76,39:77,10:R,40:V}),{10:[1,79]},{10:[1,80]},{10:[1,81]},{10:[1,82]},{14:M,44:U,60:W,80:[1,86],89:Y,95:[1,83],97:[1,84],101:85,105:j,106:z,109:X,111:H,114:q,115:Q,116:Z,120:87},t(N,[2,185]),t(N,[2,186]),t(N,[2,187]),t(N,[2,188]),t(J,[2,51]),t(J,[2,54],{46:[1,99]}),t(tt,[2,72],{113:112,29:[1,100],44:A,48:[1,101],50:[1,102],52:[1,103],54:[1,104],56:[1,105],58:[1,106],60:b,63:[1,107],65:[1,108],67:[1,109],68:[1,110],70:[1,111],89:C,102:D,105:x,106:T,109:S,111:F,114:_,115:B,116:v}),t(et,[2,181]),t(et,[2,142]),t(et,[2,143]),t(et,[2,144]),t(et,[2,145]),t(et,[2,146]),t(et,[2,147]),t(et,[2,148]),t(et,[2,149]),t(et,[2,150]),t(et,[2,151]),t(et,[2,152]),t(n,[2,12]),t(n,[2,18]),t(n,[2,19]),{9:[1,113]},t(st,[2,26],{18:114,10:R}),t(N,[2,27]),{42:115,43:38,44:A,45:39,47:40,60:b,89:C,102:D,105:x,106:T,109:S,111:F,113:41,114:_,115:B,116:v},t(N,[2,40]),t(N,[2,41]),t(N,[2,42]),t(it,[2,76],{73:116,62:[1,118],74:[1,117]}),{76:119,79:120,80:nt,81:rt,116:at,119:ut},{75:[1,125],77:[1,126]},t(ot,[2,83]),t(N,[2,28]),t(N,[2,29]),t(N,[2,30]),t(N,[2,31]),t(N,[2,32]),{10:ct,12:lt,14:ht,27:dt,28:127,32:pt,44:gt,60:At,75:bt,80:[1,129],81:[1,130],83:140,84:yt,85:kt,86:ft,87:mt,88:Et,89:Ct,90:Dt,91:128,105:xt,109:Tt,111:St,114:Ft,115:_t,116:Bt},t(vt,r,{5:153}),t(N,[2,37]),t(N,[2,38]),t(O,[2,48],{44:wt}),t(O,[2,49],{18:155,10:R,40:Lt}),t(J,[2,44]),{44:A,47:157,60:b,89:C,102:D,105:x,106:T,109:S,111:F,113:41,114:_,115:B,116:v},{102:[1,158],103:159,105:[1,160]},{44:A,47:161,60:b,89:C,102:D,105:x,106:T,109:S,111:F,113:41,114:_,115:B,116:v},{44:A,47:162,60:b,89:C,102:D,105:x,106:T,109:S,111:F,113:41,114:_,115:B,116:v},t($t,[2,107],{10:[1,163],96:[1,164]}),{80:[1,165]},t($t,[2,115],{120:167,10:[1,166],14:M,44:U,60:W,89:Y,105:j,106:z,109:X,111:H,114:q,115:Q,116:Z}),t($t,[2,117],{10:[1,168]}),t(It,[2,183]),t(It,[2,170]),t(It,[2,171]),t(It,[2,172]),t(It,[2,173]),t(It,[2,174]),t(It,[2,175]),t(It,[2,176]),t(It,[2,177]),t(It,[2,178]),t(It,[2,179]),t(It,[2,180]),{44:A,47:169,60:b,89:C,102:D,105:x,106:T,109:S,111:F,113:41,114:_,115:B,116:v},{30:170,67:Rt,80:Nt,81:Pt,82:171,116:Kt,117:Gt,118:Ot},{30:178,67:Rt,80:Nt,81:Pt,82:171,116:Kt,117:Gt,118:Ot},{30:180,50:[1,179],67:Rt,80:Nt,81:Pt,82:171,116:Kt,117:Gt,118:Ot},{30:181,67:Rt,80:Nt,81:Pt,82:171,116:Kt,117:Gt,118:Ot},{30:182,67:Rt,80:Nt,81:Pt,82:171,116:Kt,117:Gt,118:Ot},{30:183,67:Rt,80:Nt,81:Pt,82:171,116:Kt,117:Gt,118:Ot},{109:[1,184]},{30:185,67:Rt,80:Nt,81:Pt,82:171,116:Kt,117:Gt,118:Ot},{30:186,65:[1,187],67:Rt,80:Nt,81:Pt,82:171,116:Kt,117:Gt,118:Ot},{30:188,67:Rt,80:Nt,81:Pt,82:171,116:Kt,117:Gt,118:Ot},{30:189,67:Rt,80:Nt,81:Pt,82:171,116:Kt,117:Gt,118:Ot},{30:190,67:Rt,80:Nt,81:Pt,82:171,116:Kt,117:Gt,118:Ot},t(et,[2,182]),t(n,[2,20]),t(st,[2,25]),t(O,[2,46],{39:191,18:192,10:R,40:V}),t(it,[2,73],{10:[1,193]}),{10:[1,194]},{30:195,67:Rt,80:Nt,81:Pt,82:171,116:Kt,117:Gt,118:Ot},{77:[1,196],79:197,116:at,119:ut},t(Vt,[2,79]),t(Vt,[2,81]),t(Vt,[2,82]),t(Vt,[2,168]),t(Vt,[2,169]),{76:198,79:120,80:nt,81:rt,116:at,119:ut},t(ot,[2,84]),{8:P,9:K,10:ct,11:G,12:lt,14:ht,21:200,27:dt,29:[1,199],32:pt,44:gt,60:At,75:bt,83:140,84:yt,85:kt,86:ft,87:mt,88:Et,89:Ct,90:Dt,91:201,105:xt,109:Tt,111:St,114:Ft,115:_t,116:Bt},t(Mt,[2,101]),t(Mt,[2,103]),t(Mt,[2,104]),t(Mt,[2,157]),t(Mt,[2,158]),t(Mt,[2,159]),t(Mt,[2,160]),t(Mt,[2,161]),t(Mt,[2,162]),t(Mt,[2,163]),t(Mt,[2,164]),t(Mt,[2,165]),t(Mt,[2,166]),t(Mt,[2,167]),t(Mt,[2,90]),t(Mt,[2,91]),t(Mt,[2,92]),t(Mt,[2,93]),t(Mt,[2,94]),t(Mt,[2,95]),t(Mt,[2,96]),t(Mt,[2,97]),t(Mt,[2,98]),t(Mt,[2,99]),t(Mt,[2,100]),{6:11,7:12,8:a,9:u,10:c,11:l,20:17,22:18,23:19,24:20,25:21,26:22,27:h,32:[1,202],33:24,34:d,36:p,38:g,42:28,43:38,44:A,45:39,47:40,60:b,84:y,85:k,86:f,87:m,88:E,89:C,102:D,105:x,106:T,109:S,111:F,113:41,114:_,115:B,116:v,121:w,122:L,123:$,124:I},{10:R,18:203},{44:[1,204]},t(J,[2,43]),{10:[1,205],44:A,60:b,89:C,102:D,105:x,106:T,109:S,111:F,113:112,114:_,115:B,116:v},{10:[1,206]},{10:[1,207],106:[1,208]},t(Ut,[2,128]),{10:[1,209],44:A,60:b,89:C,102:D,105:x,106:T,109:S,111:F,113:112,114:_,115:B,116:v},{10:[1,210],44:A,60:b,89:C,102:D,105:x,106:T,109:S,111:F,113:112,114:_,115:B,116:v},{80:[1,211]},t($t,[2,109],{10:[1,212]}),t($t,[2,111],{10:[1,213]}),{80:[1,214]},t(It,[2,184]),{80:[1,215],98:[1,216]},t(J,[2,55],{113:112,44:A,60:b,89:C,102:D,105:x,106:T,109:S,111:F,114:_,115:B,116:v}),{31:[1,217],67:Rt,82:218,116:Kt,117:Gt,118:Ot},t(Wt,[2,86]),t(Wt,[2,88]),t(Wt,[2,89]),t(Wt,[2,153]),t(Wt,[2,154]),t(Wt,[2,155]),t(Wt,[2,156]),{49:[1,219],67:Rt,82:218,116:Kt,117:Gt,118:Ot},{30:220,67:Rt,80:Nt,81:Pt,82:171,116:Kt,117:Gt,118:Ot},{51:[1,221],67:Rt,82:218,116:Kt,117:Gt,118:Ot},{53:[1,222],67:Rt,82:218,116:Kt,117:Gt,118:Ot},{55:[1,223],67:Rt,82:218,116:Kt,117:Gt,118:Ot},{57:[1,224],67:Rt,82:218,116:Kt,117:Gt,118:Ot},{60:[1,225]},{64:[1,226],67:Rt,82:218,116:Kt,117:Gt,118:Ot},{66:[1,227],67:Rt,82:218,116:Kt,117:Gt,118:Ot},{30:228,67:Rt,80:Nt,81:Pt,82:171,116:Kt,117:Gt,118:Ot},{31:[1,229],67:Rt,82:218,116:Kt,117:Gt,118:Ot},{67:Rt,69:[1,230],71:[1,231],82:218,116:Kt,117:Gt,118:Ot},{67:Rt,69:[1,233],71:[1,232],82:218,116:Kt,117:Gt,118:Ot},t(O,[2,45],{18:155,10:R,40:Lt}),t(O,[2,47],{44:wt}),t(it,[2,75]),t(it,[2,74]),{62:[1,234],67:Rt,82:218,116:Kt,117:Gt,118:Ot},t(it,[2,77]),t(Vt,[2,80]),{77:[1,235],79:197,116:at,119:ut},{30:236,67:Rt,80:Nt,81:Pt,82:171,116:Kt,117:Gt,118:Ot},t(vt,r,{5:237}),t(Mt,[2,102]),t(N,[2,35]),{43:238,44:A,45:39,47:40,60:b,89:C,102:D,105:x,106:T,109:S,111:F,113:41,114:_,115:B,116:v},{10:R,18:239},{10:Yt,60:jt,84:zt,92:240,105:Xt,107:241,108:242,109:Ht,110:qt,111:Qt,112:Zt},{10:Yt,60:jt,84:zt,92:251,104:[1,252],105:Xt,107:241,108:242,109:Ht,110:qt,111:Qt,112:Zt},{10:Yt,60:jt,84:zt,92:253,104:[1,254],105:Xt,107:241,108:242,109:Ht,110:qt,111:Qt,112:Zt},{105:[1,255]},{10:Yt,60:jt,84:zt,92:256,105:Xt,107:241,108:242,109:Ht,110:qt,111:Qt,112:Zt},{44:A,47:257,60:b,89:C,102:D,105:x,106:T,109:S,111:F,113:41,114:_,115:B,116:v},t($t,[2,108]),{80:[1,258]},{80:[1,259],98:[1,260]},t($t,[2,116]),t($t,[2,118],{10:[1,261]}),t($t,[2,119]),t(tt,[2,56]),t(Wt,[2,87]),t(tt,[2,57]),{51:[1,262],67:Rt,82:218,116:Kt,117:Gt,118:Ot},t(tt,[2,64]),t(tt,[2,59]),t(tt,[2,60]),t(tt,[2,61]),{109:[1,263]},t(tt,[2,63]),t(tt,[2,65]),{66:[1,264],67:Rt,82:218,116:Kt,117:Gt,118:Ot},t(tt,[2,67]),t(tt,[2,68]),t(tt,[2,70]),t(tt,[2,69]),t(tt,[2,71]),t([10,44,60,89,102,105,106,109,111,114,115,116],[2,85]),t(it,[2,78]),{31:[1,265],67:Rt,82:218,116:Kt,117:Gt,118:Ot},{6:11,7:12,8:a,9:u,10:c,11:l,20:17,22:18,23:19,24:20,25:21,26:22,27:h,32:[1,266],33:24,34:d,36:p,38:g,42:28,43:38,44:A,45:39,47:40,60:b,84:y,85:k,86:f,87:m,88:E,89:C,102:D,105:x,106:T,109:S,111:F,113:41,114:_,115:B,116:v,121:w,122:L,123:$,124:I},t(J,[2,53]),{43:267,44:A,45:39,47:40,60:b,89:C,102:D,105:x,106:T,109:S,111:F,113:41,114:_,115:B,116:v},t($t,[2,121],{106:Jt}),t(te,[2,130],{108:269,10:Yt,60:jt,84:zt,105:Xt,109:Ht,110:qt,111:Qt,112:Zt}),t(ee,[2,132]),t(ee,[2,134]),t(ee,[2,135]),t(ee,[2,136]),t(ee,[2,137]),t(ee,[2,138]),t(ee,[2,139]),t(ee,[2,140]),t(ee,[2,141]),t($t,[2,122],{106:Jt}),{10:[1,270]},t($t,[2,123],{106:Jt}),{10:[1,271]},t(Ut,[2,129]),t($t,[2,105],{106:Jt}),t($t,[2,106],{113:112,44:A,60:b,89:C,102:D,105:x,106:T,109:S,111:F,114:_,115:B,116:v}),t($t,[2,110]),t($t,[2,112],{10:[1,272]}),t($t,[2,113]),{98:[1,273]},{51:[1,274]},{62:[1,275]},{66:[1,276]},{8:P,9:K,11:G,21:277},t(N,[2,34]),t(J,[2,52]),{10:Yt,60:jt,84:zt,105:Xt,107:278,108:242,109:Ht,110:qt,111:Qt,112:Zt},t(ee,[2,133]),{14:M,44:U,60:W,89:Y,101:279,105:j,106:z,109:X,111:H,114:q,115:Q,116:Z,120:87},{14:M,44:U,60:W,89:Y,101:280,105:j,106:z,109:X,111:H,114:q,115:Q,116:Z,120:87},{98:[1,281]},t($t,[2,120]),t(tt,[2,58]),{30:282,67:Rt,80:Nt,81:Pt,82:171,116:Kt,117:Gt,118:Ot},t(tt,[2,66]),t(vt,r,{5:283}),t(te,[2,131],{108:269,10:Yt,60:jt,84:zt,105:Xt,109:Ht,110:qt,111:Qt,112:Zt}),t($t,[2,126],{120:167,10:[1,284],14:M,44:U,60:W,89:Y,105:j,106:z,109:X,111:H,114:q,115:Q,116:Z}),t($t,[2,127],{120:167,10:[1,285],14:M,44:U,60:W,89:Y,105:j,106:z,109:X,111:H,114:q,115:Q,116:Z}),t($t,[2,114]),{31:[1,286],67:Rt,82:218,116:Kt,117:Gt,118:Ot},{6:11,7:12,8:a,9:u,10:c,11:l,20:17,22:18,23:19,24:20,25:21,26:22,27:h,32:[1,287],33:24,34:d,36:p,38:g,42:28,43:38,44:A,45:39,47:40,60:b,84:y,85:k,86:f,87:m,88:E,89:C,102:D,105:x,106:T,109:S,111:F,113:41,114:_,115:B,116:v,121:w,122:L,123:$,124:I},{10:Yt,60:jt,84:zt,92:288,105:Xt,107:241,108:242,109:Ht,110:qt,111:Qt,112:Zt},{10:Yt,60:jt,84:zt,92:289,105:Xt,107:241,108:242,109:Ht,110:qt,111:Qt,112:Zt},t(tt,[2,62]),t(N,[2,33]),t($t,[2,124],{106:Jt}),t($t,[2,125],{106:Jt})],defaultActions:{},parseError:(0,o.K2)((function(t,e){if(!e.recoverable){var s=new Error(t);throw s.hash=e,s}this.trace(t)}),"parseError"),parse:(0,o.K2)((function(t){var e=this,s=[0],i=[],n=[null],r=[],a=this.table,u="",c=0,l=0,h=0,d=r.slice.call(arguments,1),p=Object.create(this.lexer),g={yy:{}};for(var A in this.yy)Object.prototype.hasOwnProperty.call(this.yy,A)&&(g.yy[A]=this.yy[A]);p.setInput(t,g.yy),g.yy.lexer=p,g.yy.parser=this,"undefined"==typeof p.yylloc&&(p.yylloc={});var b=p.yylloc;r.push(b);var y=p.options&&p.options.ranges;function k(){var t;return"number"!==typeof(t=i.pop()||p.lex()||1)&&(t instanceof Array&&(t=(i=t).pop()),t=e.symbols_[t]||t),t}"function"===typeof g.yy.parseError?this.parseError=g.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError,(0,o.K2)((function(t){s.length=s.length-2*t,n.length=n.length-t,r.length=r.length-t}),"popStack"),(0,o.K2)(k,"lex");for(var f,m,E,C,D,x,T,S,F,_={};;){if(E=s[s.length-1],this.defaultActions[E]?C=this.defaultActions[E]:(null!==f&&"undefined"!=typeof f||(f=k()),C=a[E]&&a[E][f]),"undefined"===typeof C||!C.length||!C[0]){var B="";for(x in F=[],a[E])this.terminals_[x]&&x>2&&F.push("'"+this.terminals_[x]+"'");B=p.showPosition?"Parse error on line "+(c+1)+":\n"+p.showPosition()+"\nExpecting "+F.join(", ")+", got '"+(this.terminals_[f]||f)+"'":"Parse error on line "+(c+1)+": Unexpected "+(1==f?"end of input":"'"+(this.terminals_[f]||f)+"'"),this.parseError(B,{text:p.match,token:this.terminals_[f]||f,line:p.yylineno,loc:b,expected:F})}if(C[0]instanceof Array&&C.length>1)throw new Error("Parse Error: multiple actions possible at state: "+E+", token: "+f);switch(C[0]){case 1:s.push(f),n.push(p.yytext),r.push(p.yylloc),s.push(C[1]),f=null,m?(f=m,m=null):(l=p.yyleng,u=p.yytext,c=p.yylineno,b=p.yylloc,h>0&&h--);break;case 2:if(T=this.productions_[C[1]][1],_.$=n[n.length-T],_._$={first_line:r[r.length-(T||1)].first_line,last_line:r[r.length-1].last_line,first_column:r[r.length-(T||1)].first_column,last_column:r[r.length-1].last_column},y&&(_._$.range=[r[r.length-(T||1)].range[0],r[r.length-1].range[1]]),"undefined"!==typeof(D=this.performAction.apply(_,[u,l,c,g.yy,C[1],n,r].concat(d))))return D;T&&(s=s.slice(0,-1*T*2),n=n.slice(0,-1*T),r=r.slice(0,-1*T)),s.push(this.productions_[C[1]][0]),n.push(_.$),r.push(_._$),S=a[s[s.length-2]][s[s.length-1]],s.push(S);break;case 3:return!0}}return!0}),"parse")},ie=function(){return{EOF:1,parseError:(0,o.K2)((function(t,e){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,e)}),"parseError"),setInput:(0,o.K2)((function(t,e){return this.yy=e||this.yy||{},this._input=t,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:(0,o.K2)((function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t}),"input"),unput:(0,o.K2)((function(t){var e=t.length,s=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-e),this.offset-=e;var i=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),s.length-1&&(this.yylineno-=s.length-1);var n=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:s?(s.length===i.length?this.yylloc.first_column:0)+i[i.length-s.length].length-s[0].length:this.yylloc.first_column-e},this.options.ranges&&(this.yylloc.range=[n[0],n[0]+this.yyleng-e]),this.yyleng=this.yytext.length,this}),"unput"),more:(0,o.K2)((function(){return this._more=!0,this}),"more"),reject:(0,o.K2)((function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):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})}),"reject"),less:(0,o.K2)((function(t){this.unput(this.match.slice(t))}),"less"),pastInput:(0,o.K2)((function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")}),"pastInput"),upcomingInput:(0,o.K2)((function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")}),"upcomingInput"),showPosition:(0,o.K2)((function(){var t=this.pastInput(),e=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+e+"^"}),"showPosition"),test_match:(0,o.K2)((function(t,e){var s,i,n;if(this.options.backtrack_lexer&&(n={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&&(n.yylloc.range=this.yylloc.range.slice(0))),(i=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=i.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:i?i[i.length-1].length-i[i.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,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(t[0].length),this.matched+=t[0],s=this.performAction.call(this,this.yy,this,e,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),s)return s;if(this._backtrack){for(var r in n)this[r]=n[r];return!1}return!1}),"test_match"),next:(0,o.K2)((function(){if(this.done)return this.EOF;var t,e,s,i;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var n=this._currentRules(),r=0;re[0].length)){if(e=s,i=r,this.options.backtrack_lexer){if(!1!==(t=this.test_match(s,n[r])))return t;if(this._backtrack){e=!1;continue}return!1}if(!this.options.flex)break}return e?!1!==(t=this.test_match(e,n[i]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})}),"next"),lex:(0,o.K2)((function(){var t=this.next();return t||this.lex()}),"lex"),begin:(0,o.K2)((function(t){this.conditionStack.push(t)}),"begin"),popState:(0,o.K2)((function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]}),"popState"),_currentRules:(0,o.K2)((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:(0,o.K2)((function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"}),"topState"),pushState:(0,o.K2)((function(t){this.begin(t)}),"pushState"),stateStackSize:(0,o.K2)((function(){return this.conditionStack.length}),"stateStackSize"),options:{},performAction:(0,o.K2)((function(t,e,s,i){switch(s){case 0:return this.begin("acc_title"),34;case 1:return this.popState(),"acc_title_value";case 2:return this.begin("acc_descr"),36;case 3:return this.popState(),"acc_descr_value";case 4:this.begin("acc_descr_multiline");break;case 5:case 12:case 14:case 17:case 20:case 23:case 33:this.popState();break;case 6:return"acc_descr_multiline_value";case 7:return this.pushState("shapeData"),e.yytext="",40;case 8:return this.pushState("shapeDataStr"),40;case 9:return this.popState(),40;case 10:const s=/\n\s*/g;return e.yytext=e.yytext.replace(s,"
"),40;case 11:return 40;case 13:this.begin("callbackname");break;case 15:this.popState(),this.begin("callbackargs");break;case 16:return 95;case 18:return 96;case 19:return"MD_STR";case 21:this.begin("md_string");break;case 22:return"STR";case 24:this.pushState("string");break;case 25:return 84;case 26:return 102;case 27:return 85;case 28:return 104;case 29:return 86;case 30:return 87;case 31:return 97;case 32:this.begin("click");break;case 34:return 88;case 35:case 36:case 37:return t.lex.firstGraph()&&this.begin("dir"),12;case 38:return 27;case 39:return 32;case 40:case 41:case 42:case 43:return 98;case 44:return this.popState(),13;case 45:case 46:case 47:case 48:case 49:case 50:case 51:case 52:case 53:case 54:return this.popState(),14;case 55:return 121;case 56:return 122;case 57:return 123;case 58:return 124;case 59:return 78;case 60:return 105;case 61:case 102:return 111;case 62:return 46;case 63:return 60;case 64:case 103:return 44;case 65:return 8;case 66:return 106;case 67:case 101:return 115;case 68:case 71:case 74:return this.popState(),77;case 69:return this.pushState("edgeText"),75;case 70:case 73:case 76:return 119;case 72:return this.pushState("thickEdgeText"),75;case 75:return this.pushState("dottedEdgeText"),75;case 77:return 77;case 78:return this.popState(),53;case 79:case 115:return"TEXT";case 80:return this.pushState("ellipseText"),52;case 81:return this.popState(),55;case 82:return this.pushState("text"),54;case 83:return this.popState(),57;case 84:return this.pushState("text"),56;case 85:return 58;case 86:return this.pushState("text"),67;case 87:return this.popState(),64;case 88:return this.pushState("text"),63;case 89:return this.popState(),49;case 90:return this.pushState("text"),48;case 91:return this.popState(),69;case 92:return this.popState(),71;case 93:return 117;case 94:return this.pushState("trapText"),68;case 95:return this.pushState("trapText"),70;case 96:return 118;case 97:return 67;case 98:return 90;case 99:return"SEP";case 100:return 89;case 104:return 109;case 105:return 114;case 106:return 116;case 107:return this.popState(),62;case 108:return this.pushState("text"),62;case 109:return this.popState(),51;case 110:return this.pushState("text"),50;case 111:return this.popState(),31;case 112:return this.pushState("text"),29;case 113:return this.popState(),66;case 114:return this.pushState("text"),65;case 116:return"QUOTE";case 117:return 9;case 118:return 10;case 119:return 11}}),"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:!1},shapeDataStr:{rules:[9,10,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},shapeData:{rules:[8,11,12,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},callbackargs:{rules:[17,18,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},callbackname:{rules:[14,15,16,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},href:{rules:[21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},click:{rules:[21,24,33,34,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},dottedEdgeText:{rules:[21,24,74,76,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},thickEdgeText:{rules:[21,24,71,73,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},edgeText:{rules:[21,24,68,70,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},trapText:{rules:[21,24,77,80,82,84,88,90,91,92,93,94,95,108,110,112,114],inclusive:!1},ellipseText:{rules:[21,24,77,78,79,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},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:!1},vertex:{rules:[21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},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:!1},acc_descr_multiline:{rules:[5,6,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},acc_descr:{rules:[3,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},acc_title:{rules:[1,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},md_string:{rules:[19,20,21,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},string:{rules:[21,22,23,24,77,80,82,84,88,90,94,95,108,110,112,114],inclusive:!1},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:!0}}}}();function ne(){this.yy={}}return se.lexer=ie,(0,o.K2)(ne,"Parser"),ne.prototype=se,se.Parser=ne,new ne}();g.parser=g;var A=g,b=Object.assign({},A);b.parse=t=>{const e=t.replace(/}\s*\n/g,"}\n");return A.parse(e)};var y=b,k=(0,o.K2)(((t,e)=>{const s=l.A,i=s(t,"r"),n=s(t,"g"),r=s(t,"b");return h.A(i,n,r,e)}),"fade"),f=(0,o.K2)((t=>`.label {\n font-family: ${t.fontFamily};\n color: ${t.nodeTextColor||t.textColor};\n }\n .cluster-label text {\n fill: ${t.titleColor};\n }\n .cluster-label span {\n color: ${t.titleColor};\n }\n .cluster-label span p {\n background-color: transparent;\n }\n\n .label text,span {\n fill: ${t.nodeTextColor||t.textColor};\n color: ${t.nodeTextColor||t.textColor};\n }\n\n .node rect,\n .node circle,\n .node ellipse,\n .node polygon,\n .node path {\n fill: ${t.mainBkg};\n stroke: ${t.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: ${t.lineColor} !important;\n stroke-width: 0;\n stroke: ${t.lineColor};\n }\n\n .arrowheadPath {\n fill: ${t.arrowheadColor};\n }\n\n .edgePath .path {\n stroke: ${t.lineColor};\n stroke-width: 2.0px;\n }\n\n .flowchart-link {\n stroke: ${t.lineColor};\n fill: none;\n }\n\n .edgeLabel {\n background-color: ${t.edgeLabelBackground};\n p {\n background-color: ${t.edgeLabelBackground};\n }\n rect {\n opacity: 0.5;\n background-color: ${t.edgeLabelBackground};\n fill: ${t.edgeLabelBackground};\n }\n text-align: center;\n }\n\n /* For html labels only */\n .labelBkg {\n background-color: ${k(t.edgeLabelBackground,.5)};\n // background-color:\n }\n\n .cluster rect {\n fill: ${t.clusterBkg};\n stroke: ${t.clusterBorder};\n stroke-width: 1px;\n }\n\n .cluster text {\n fill: ${t.titleColor};\n }\n\n .cluster span {\n color: ${t.titleColor};\n }\n /* .cluster div {\n color: ${t.titleColor};\n } */\n\n div.mermaidTooltip {\n position: absolute;\n text-align: center;\n max-width: 200px;\n padding: 2px;\n font-family: ${t.fontFamily};\n font-size: 12px;\n background: ${t.tertiaryColor};\n border: 1px solid ${t.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: ${t.textColor};\n }\n\n rect.text {\n fill: none;\n stroke-width: 0;\n }\n\n .icon-shape, .image-shape {\n background-color: ${t.edgeLabelBackground};\n p {\n background-color: ${t.edgeLabelBackground};\n padding: 2px;\n }\n rect {\n opacity: 0.5;\n background-color: ${t.edgeLabelBackground};\n fill: ${t.edgeLabelBackground};\n }\n text-align: center;\n }\n`),"getStyles"),m={parser:y,get db(){return new d},renderer:p,styles:f,init:(0,o.K2)((t=>{t.flowchart||(t.flowchart={}),t.layout&&(0,o.XV)({layout:t.layout}),t.flowchart.arrowMarkerAbsolute=t.arrowMarkerAbsolute,(0,o.XV)({flowchart:{arrowMarkerAbsolute:t.arrowMarkerAbsolute}})}),"init")}},6327:(t,e,s)=>{s.d(e,{A:()=>r,P:()=>a});var i=s(3759),n=s(700),r=(0,i.K2)(((t,e)=>{let s;"sandbox"===e&&(s=(0,n.Ltv)("#i"+t));return("sandbox"===e?(0,n.Ltv)(s.nodes()[0].contentDocument.body):(0,n.Ltv)("body")).select(`[id="${t}"]`)}),"getDiagramElement"),a=(0,i.K2)(((t,e,s,n)=>{t.attr("class",s);const{width:r,height:a,x:c,y:l}=u(t,e);(0,i.a$)(t,a,r,n);const h=o(c,l,r,a,e);t.attr("viewBox",h),i.Rm.debug(`viewBox configured: ${h} with padding: ${e}`)}),"setupViewPortForSVG"),u=(0,i.K2)(((t,e)=>{const s=t.node()?.getBBox()||{width:0,height:0,x:0,y:0};return{width:s.width+2*e,height:s.height+2*e,x:s.x,y:s.y}}),"calculateDimensionsWithPadding"),o=(0,i.K2)(((t,e,s,i,n)=>`${t-n} ${e-n} ${s} ${i}`),"createViewBox")},9322:(t,e,s)=>{s.d(e,{A:()=>r});var i=s(7170),n=s(1458);const r=(t,e)=>i.A.lang.round(n.A.parse(t)[e])}}]); -//# sourceMappingURL=467.ed8fe19b.chunk.js.map \ No newline at end of file diff --git a/frontend/deployed/static/js/467.ed8fe19b.chunk.js.map b/frontend/deployed/static/js/467.ed8fe19b.chunk.js.map deleted file mode 100644 index b56c9d8..0000000 --- a/frontend/deployed/static/js/467.ed8fe19b.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"static/js/467.ed8fe19b.chunk.js","mappings":"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AAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAAMC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,EAAG,GAAI,GAAI,GAAI,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,IAAKC,EAAM,CAAC,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,IAAKC,GAAM,CAAC,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAKC,GAAM,CAAC,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAAMC,GAAM,CAAC,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAAMC,GAAM,CAAC,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAAMC,GAAM,CAAC,EAAG,KAAMC,GAAM,CAAC,EAAG,KAAMC,GAAM,CAAC,EAAG,KAAMC,GAAM,CAAC,EAAG,KAAMC,GAAM,CAAC,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAAMC,GAAM,CAAC,EAAG,KAAMC,GAAM,CAAC,EAAG,KAAMC,GAAM,CAAC,EAAG,KAAMC,GAAO,CAAC,EAAG,KAAMC,GAAO,CAAC,EAAG,KAAMC,GAAO,CAAC,EAAG,KAAMC,GAAO,CAAC,EAAG,KAAMC,GAAO,CAAC,EAAG,KAAMC,GAAO,CAAC,EAAG,KAAMC,GAAO,CAAC,EAAG,KAAMC,GAAO,CAAC,EAAG,KAAMC,GAAO,CAAC,EAAG,KAAMC,GAAO,CAAC,EAAG,KAAMC,GAAO,CAAC,EAAG,KAAMC,GAAO,CAAC,EAAG,KAAMC,GAAO,CAAC,EAAG,KAAMC,GAAO,CAAC,EAAG,KAAMC,GAAO,CAAC,EAAG,KAAMC,GAAO,CAAC,EAAG,KAAMC,GAAO,CAAC,EAAG,KAAMC,GAAO,CAAC,EAAG,KAAMC,GAAO,CAAC,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAAMC,GAAO,CAAC,EAAG,KAAMC,GAAO,CAAC,EAAG,KAAMC,GAAO,CAAC,EAAG,EAAG,IAAKC,GAAO,CAAC,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,IAAK,KAAMC,GAAO,CAAC,EAAG,KAAMC,GAAO,CAAC,EAAG,KAAMC,GAAO,CAAC,EAAG,KAAMC,GAAO,CAAC,EAAG,KAAMC,GAAO,CAAC,EAAG,KAAMC,GAAO,CAAC,EAAG,KAAMC,GAAO,CAAC,GAAI,IAAK,KAAMC,GAAO,CAAC,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,IAAK,IAAK,IAAK,IAAK,IAAK,KAAMC,GAAO,CAAC,GAAI,KAAMC,GAAO,CAAC,GAAI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,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,IAAK,GAAI,CAAC,IAAK,GAAI,CAAC,GAAI,GAAI,CAAC,GAAI,GAAI,CAAC,IAAK,GAAI,CAAC,IAAK,GAAI,CAAC,IAAK,GAAI,CAAC,IAAK,GAAI,CAAC,IAAK,GAAI,CAAC,IAAK,GAAI,CAAC,IAAK,GAAI,CAAC,IAAK,GAAI,CAAC,IAAK,GAAI,CAAC,IAAK,GAAI,CAAC,IAAK,GAAI,CAAC,IAAK,GAAI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","sources":["../node_modules/mermaid/dist/chunks/mermaid.core/flowDiagram-4HSFHLVR.mjs","../node_modules/mermaid/dist/chunks/mermaid.core/chunk-RZ5BOZE2.mjs","../node_modules/khroma/dist/methods/channel.js"],"sourcesContent":["import {\n JSON_SCHEMA,\n load\n} from \"./chunk-6JRP7KZX.mjs\";\nimport {\n getDiagramElement,\n setupViewPortForSVG\n} from \"./chunk-RZ5BOZE2.mjs\";\nimport {\n getRegisteredLayoutAlgorithm,\n render\n} from \"./chunk-TYCBKAJE.mjs\";\nimport \"./chunk-IIMUDSI4.mjs\";\nimport \"./chunk-VV3M67IP.mjs\";\nimport {\n isValidShape\n} from \"./chunk-HRU6DDCH.mjs\";\nimport \"./chunk-K557N5IZ.mjs\";\nimport \"./chunk-H2D2JQ3I.mjs\";\nimport \"./chunk-C3MQ5ANM.mjs\";\nimport {\n getEdgeId,\n utils_default\n} from \"./chunk-O4NI6UNU.mjs\";\nimport {\n __name,\n clear,\n common_default,\n defaultConfig2 as defaultConfig,\n getAccDescription,\n getAccTitle,\n getConfig2 as getConfig,\n getDiagramTitle,\n log,\n setAccDescription,\n setAccTitle,\n setConfig2 as setConfig,\n setDiagramTitle\n} from \"./chunk-YTJNT7DU.mjs\";\n\n// src/diagrams/flowchart/flowDb.ts\nimport { select } from \"d3\";\nvar MERMAID_DOM_ID_PREFIX = \"flowchart-\";\nvar FlowDB = class {\n // cspell:ignore funs\n constructor() {\n this.vertexCounter = 0;\n this.config = getConfig();\n this.vertices = /* @__PURE__ */ new Map();\n this.edges = [];\n this.classes = /* @__PURE__ */ new Map();\n this.subGraphs = [];\n this.subGraphLookup = /* @__PURE__ */ new Map();\n this.tooltips = /* @__PURE__ */ new Map();\n this.subCount = 0;\n this.firstGraphFlag = true;\n // As in graph\n this.secCount = -1;\n this.posCrossRef = [];\n // Functions to be run after graph rendering\n this.funs = [];\n this.setAccTitle = setAccTitle;\n this.setAccDescription = setAccDescription;\n this.setDiagramTitle = setDiagramTitle;\n this.getAccTitle = getAccTitle;\n this.getAccDescription = getAccDescription;\n this.getDiagramTitle = getDiagramTitle;\n this.funs.push(this.setupToolTips.bind(this));\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 this.lex = {\n firstGraph: this.firstGraph.bind(this)\n };\n this.clear();\n this.setGen(\"gen-2\");\n }\n static {\n __name(this, \"FlowDB\");\n }\n sanitizeText(txt) {\n return common_default.sanitizeText(txt, this.config);\n }\n /**\n * Function to lookup domId from id in the graph definition.\n *\n * @param id - id of the node\n */\n lookUpDomId(id) {\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 * Function called by parser when a node definition has been found\n */\n addVertex(id, textObj, type, style, classes, dir, props = {}, metadata) {\n if (!id || id.trim().length === 0) {\n return;\n }\n let doc;\n if (metadata !== void 0) {\n let yamlData;\n if (!metadata.includes(\"\\n\")) {\n yamlData = \"{\\n\" + metadata + \"\\n}\";\n } else {\n yamlData = metadata + \"\\n\";\n }\n doc = load(yamlData, { schema: JSON_SCHEMA });\n }\n const edge = this.edges.find((e) => e.id === id);\n if (edge) {\n const edgeDoc = doc;\n if (edgeDoc?.animate !== void 0) {\n edge.animate = edgeDoc.animate;\n }\n if (edgeDoc?.animation !== void 0) {\n edge.animation = edgeDoc.animation;\n }\n return;\n }\n let txt;\n let vertex = this.vertices.get(id);\n if (vertex === void 0) {\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 if (textObj !== void 0) {\n this.config = getConfig();\n txt = this.sanitizeText(textObj.text.trim());\n vertex.labelType = textObj.type;\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 === void 0) {\n vertex.text = id;\n }\n }\n if (type !== void 0) {\n vertex.type = type;\n }\n if (style !== void 0 && style !== null) {\n style.forEach((s) => {\n vertex.styles.push(s);\n });\n }\n if (classes !== void 0 && classes !== null) {\n classes.forEach((s) => {\n vertex.classes.push(s);\n });\n }\n if (dir !== void 0) {\n vertex.dir = dir;\n }\n if (vertex.props === void 0) {\n vertex.props = props;\n } else if (props !== void 0) {\n Object.assign(vertex.props, props);\n }\n if (doc !== void 0) {\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 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 * Function called by parser when a link/edge definition has been found\n *\n */\n addSingleLink(_start, _end, type, id) {\n const start = _start;\n const end = _end;\n const edge = {\n start,\n end,\n type: void 0,\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 if (linkTextObj !== void 0) {\n edge.text = this.sanitizeText(linkTextObj.text.trim());\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 if (type !== void 0) {\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 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 isLinkData(value) {\n return value !== null && typeof value === \"object\" && \"id\" in value && typeof value.id === \"string\";\n }\n addLink(_start, _end, linkData) {\n const id = this.isLinkData(linkData) ? linkData.id.replace(\"@\", \"\") : void 0;\n log.info(\"addLink\", _start, _end, id);\n for (const start of _start) {\n for (const end of _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, void 0);\n }\n }\n }\n }\n /**\n * Updates a link's line interpolation algorithm\n */\n updateLinkInterpolate(positions, interpolate) {\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 * Updates a link with a style\n *\n */\n updateLink(positions, style) {\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 ${this.edges.length - 1}. (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 ((this.edges[pos]?.style?.length ?? 0) > 0 && !this.edges[pos]?.style?.some((s) => s?.startsWith(\"fill\"))) {\n this.edges[pos]?.style?.push(\"fill:none\");\n }\n }\n });\n }\n addClass(ids, _style) {\n const style = _style.join().replace(/\\\\,/g, \"\\xA7\\xA7\\xA7\").replace(/,/g, \";\").replace(/§§§/g, \",\").split(\";\");\n ids.split(\",\").forEach((id) => {\n let classNode = this.classes.get(id);\n if (classNode === void 0) {\n classNode = { id, styles: [], textStyles: [] };\n this.classes.set(id, classNode);\n }\n if (style !== void 0 && style !== null) {\n style.forEach((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 * Called by parser when a graph definition is found, stores the direction of the chart.\n *\n */\n setDirection(dir) {\n this.direction = dir;\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 * 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 setClass(ids, className) {\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 setTooltip(ids, tooltip) {\n if (tooltip === void 0) {\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 setClickFun(id, functionName, functionArgs) {\n const domId = this.lookUpDomId(id);\n if (getConfig().securityLevel !== \"loose\") {\n return;\n }\n if (functionName === void 0) {\n return;\n }\n let argList = [];\n if (typeof functionArgs === \"string\") {\n argList = functionArgs.split(/,(?=(?:(?:[^\"]*\"){2})*[^\"]*$)/);\n for (let i = 0; i < argList.length; i++) {\n let item = argList[i].trim();\n if (item.startsWith('\"') && item.endsWith('\"')) {\n item = item.substr(1, item.length - 2);\n }\n argList[i] = item;\n }\n }\n if (argList.length === 0) {\n argList.push(id);\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_default.runFunc(functionName, ...argList);\n },\n false\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 setLink(ids, linkStr, target) {\n ids.split(\",\").forEach((id) => {\n const vertex = this.vertices.get(id);\n if (vertex !== void 0) {\n vertex.link = utils_default.formatUrl(linkStr, this.config);\n vertex.linkTarget = target;\n }\n });\n this.setClass(ids, \"clickable\");\n }\n getTooltip(id) {\n return this.tooltips.get(id);\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 setClickEvent(ids, functionName, functionArgs) {\n ids.split(\",\").forEach((id) => {\n this.setClickFun(id, functionName, functionArgs);\n });\n this.setClass(ids, \"clickable\");\n }\n bindFunctions(element) {\n this.funs.forEach((fun) => {\n fun(element);\n });\n }\n getDirection() {\n return this.direction?.trim();\n }\n /**\n * Retrieval function for fetching the found nodes after parsing has completed.\n *\n */\n getVertices() {\n return this.vertices;\n }\n /**\n * Retrieval function for fetching the found links after parsing has completed.\n *\n */\n getEdges() {\n return this.edges;\n }\n /**\n * Retrieval function for fetching the found class definitions after parsing has completed.\n *\n */\n getClasses() {\n return this.classes;\n }\n setupToolTips(element) {\n let tooltipElem = select(\".mermaidTooltip\");\n if ((tooltipElem._groups || tooltipElem)[0][0] === null) {\n tooltipElem = select(\"body\").append(\"div\").attr(\"class\", \"mermaidTooltip\").style(\"opacity\", 0);\n }\n const svg = select(element).select(\"svg\");\n const nodes = svg.selectAll(\"g.node\");\n nodes.on(\"mouseover\", (e) => {\n const el = select(e.currentTarget);\n const title = el.attr(\"title\");\n if (title === null) {\n return;\n }\n const rect = e.currentTarget?.getBoundingClientRect();\n tooltipElem.transition().duration(200).style(\"opacity\", \".9\");\n tooltipElem.text(el.attr(\"title\")).style(\"left\", window.scrollX + rect.left + (rect.right - rect.left) / 2 + \"px\").style(\"top\", window.scrollY + rect.bottom + \"px\");\n tooltipElem.html(tooltipElem.html().replace(/<br\\/>/g, \"
\"));\n el.classed(\"hover\", true);\n }).on(\"mouseout\", (e) => {\n tooltipElem.transition().duration(500).style(\"opacity\", 0);\n const el = select(e.currentTarget);\n el.classed(\"hover\", false);\n });\n }\n /**\n * Clears the internal graph db so that a new graph can be parsed.\n *\n */\n clear(ver = \"gen-2\") {\n this.vertices = /* @__PURE__ */ new Map();\n this.classes = /* @__PURE__ */ new Map();\n this.edges = [];\n this.funs = [this.setupToolTips.bind(this)];\n this.subGraphs = [];\n this.subGraphLookup = /* @__PURE__ */ new Map();\n this.subCount = 0;\n this.tooltips = /* @__PURE__ */ new Map();\n this.firstGraphFlag = true;\n this.version = ver;\n this.config = getConfig();\n clear();\n }\n setGen(ver) {\n this.version = ver || \"gen-2\";\n }\n defaultStyle() {\n return \"fill:#ffa;stroke: #f66; stroke-width: 3px; stroke-dasharray: 5, 5;fill:#ffa;stroke: #666;\";\n }\n addSubGraph(_id, list, _title) {\n let id = _id.text.trim();\n let title = _title.text;\n if (_id === _title && /\\s/.exec(_title.text)) {\n id = void 0;\n }\n const uniq = /* @__PURE__ */ __name((a) => {\n const prims = { boolean: {}, number: {}, string: {} };\n const objs = [];\n let dir2;\n const nodeList2 = a.filter(function(item) {\n const type = typeof item;\n if (item.stmt && item.stmt === \"dir\") {\n dir2 = 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: nodeList2, dir: dir2 };\n }, \"uniq\");\n const { nodeList, dir } = uniq(list.flat());\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 id = id ?? \"subGraph\" + this.subCount;\n title = title || \"\";\n title = this.sanitizeText(title);\n this.subCount = this.subCount + 1;\n const subGraph = {\n id,\n nodes: nodeList,\n title: title.trim(),\n classes: [],\n dir,\n labelType: _title.type\n };\n log.info(\"Adding\", subGraph.id, subGraph.nodes, subGraph.dir);\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 getPosForId(id) {\n for (const [i, subGraph] of this.subGraphs.entries()) {\n if (subGraph.id === id) {\n return i;\n }\n }\n return -1;\n }\n indexNodes2(id, pos) {\n const nodes = this.subGraphs[pos].nodes;\n this.secCount = this.secCount + 1;\n if (this.secCount > 2e3) {\n return {\n result: false,\n count: 0\n };\n }\n this.posCrossRef[this.secCount] = pos;\n if (this.subGraphs[pos].id === id) {\n return {\n result: true,\n count: 0\n };\n }\n let count = 0;\n let posCount = 1;\n while (count < nodes.length) {\n const childPos = this.getPosForId(nodes[count]);\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 return {\n result: false,\n count: posCount\n };\n }\n getDepthFirstPos(pos) {\n return this.posCrossRef[pos];\n }\n indexNodes() {\n this.secCount = -1;\n if (this.subGraphs.length > 0) {\n this.indexNodes2(\"none\", this.subGraphs.length - 1);\n }\n }\n getSubGraphs() {\n return this.subGraphs;\n }\n firstGraph() {\n if (this.firstGraphFlag) {\n this.firstGraphFlag = false;\n return true;\n }\n return false;\n }\n destructStartLink(_str) {\n let str = _str.trim();\n let type = \"arrow_open\";\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 let stroke = \"normal\";\n if (str.includes(\"=\")) {\n stroke = \"thick\";\n }\n if (str.includes(\".\")) {\n stroke = \"dotted\";\n }\n return { type, stroke };\n }\n countChar(char, str) {\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 destructEndLink(_str) {\n const str = _str.trim();\n let line = str.slice(0, -1);\n let type = \"arrow_open\";\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 let stroke = \"normal\";\n let length = line.length - 1;\n if (line.startsWith(\"=\")) {\n stroke = \"thick\";\n }\n if (line.startsWith(\"~\")) {\n stroke = \"invisible\";\n }\n const dots = this.countChar(\".\", line);\n if (dots) {\n stroke = \"dotted\";\n length = dots;\n }\n return { type, stroke, length };\n }\n destructLink(_str, _startStr) {\n const info = this.destructEndLink(_str);\n let startInfo;\n if (_startStr) {\n startInfo = this.destructStartLink(_startStr);\n if (startInfo.stroke !== info.stroke) {\n return { type: \"INVALID\", stroke: \"INVALID\" };\n }\n if (startInfo.type === \"arrow_open\") {\n startInfo.type = info.type;\n } else {\n if (startInfo.type !== info.type) {\n return { type: \"INVALID\", stroke: \"INVALID\" };\n }\n startInfo.type = \"double_\" + startInfo.type;\n }\n if (startInfo.type === \"double_arrow\") {\n startInfo.type = \"double_arrow_point\";\n }\n startInfo.length = info.length;\n return startInfo;\n }\n return info;\n }\n // Todo optimizer this by caching existing nodes\n exists(allSgs, _id) {\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 makeUniq(sg, allSubgraphs) {\n const res = [];\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 getTypeFromVertex(vertex) {\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 void 0:\n return \"squareRect\";\n case \"round\":\n return \"roundedRect\";\n case \"ellipse\":\n return \"ellipse\";\n default:\n return vertex.type;\n }\n }\n findNode(nodes, id) {\n return nodes.find((node) => node.id === id);\n }\n destructEdgeType(type) {\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 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 addNodeFromVertex(vertex, nodes, parentDB, subGraphDB, config, look) {\n const parentId = parentDB.get(vertex.id);\n const isGroup = subGraphDB.get(vertex.id) ?? false;\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 getCompiledStyles(classDefs) {\n let compiledStyles = [];\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 getData() {\n const config = getConfig();\n const nodes = [];\n const edges = [];\n const subGraphs = this.getSubGraphs();\n const parentDB = /* @__PURE__ */ new Map();\n const subGraphDB = /* @__PURE__ */ new Map();\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 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 const n = this.getVertices();\n n.forEach((vertex) => {\n this.addNodeFromVertex(vertex, nodes, parentDB, subGraphDB, config, config.look || \"classic\");\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 if (rawEdge.style) {\n styles.push(...rawEdge.style);\n }\n const 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: rawEdge?.stroke === \"invisible\" ? \"\" : \"edge-thickness-normal edge-pattern-solid flowchart-link\",\n arrowTypeStart: rawEdge?.stroke === \"invisible\" || rawEdge?.type === \"arrow_open\" ? \"none\" : arrowTypeStart,\n arrowTypeEnd: 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 edges.push(edge);\n });\n return { nodes, edges, other: {}, config };\n }\n defaultConfig() {\n return defaultConfig.flowchart;\n }\n};\n\n// src/diagrams/flowchart/flowRenderer-v3-unified.ts\nimport { select as select2 } from \"d3\";\nvar getClasses = /* @__PURE__ */ __name(function(text, diagramObj) {\n return diagramObj.db.getClasses();\n}, \"getClasses\");\nvar draw = /* @__PURE__ */ __name(async function(text, id, _version, diag) {\n log.info(\"REF0:\");\n log.info(\"Drawing state diagram (v2)\", id);\n const { securityLevel, flowchart: conf, layout } = getConfig();\n let sandboxElement;\n if (securityLevel === \"sandbox\") {\n sandboxElement = select2(\"#i\" + id);\n }\n const doc = securityLevel === \"sandbox\" ? sandboxElement.nodes()[0].contentDocument : document;\n log.debug(\"Before getData: \");\n const data4Layout = diag.db.getData();\n log.debug(\"Data: \", data4Layout);\n const svg = getDiagramElement(id, securityLevel);\n const direction = diag.db.getDirection();\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 data4Layout.diagramId = id;\n log.debug(\"REF1:\", data4Layout);\n await render(data4Layout, svg);\n const padding = data4Layout.config.flowchart?.diagramPadding ?? 8;\n utils_default.insertTitle(\n svg,\n \"flowchartTitleText\",\n conf?.titleTopMargin || 0,\n diag.db.getDiagramTitle()\n );\n setupViewPortForSVG(svg, padding, \"flowchart\", conf?.useMaxWidth || false);\n for (const vertex of data4Layout.nodes) {\n const node = select2(`#${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 const linkNode = node.insert(function() {\n return link;\n }, \":first-child\");\n const shape = node.select(\".label-container\");\n if (shape) {\n linkNode.append(function() {\n return shape.node();\n });\n }\n const label = node.select(\".label\");\n if (label) {\n linkNode.append(function() {\n return label.node();\n });\n }\n }\n}, \"draw\");\nvar flowRenderer_v3_unified_default = {\n getClasses,\n draw\n};\n\n// src/diagrams/flowchart/parser/flow.jison\nvar parser = function() {\n var o = /* @__PURE__ */ __name(function(k, v, o2, l) {\n for (o2 = o2 || {}, l = k.length; l--; o2[k[l]] = v) ;\n return o2;\n }, \"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];\n var parser2 = {\n trace: /* @__PURE__ */ __name(function trace() {\n }, \"trace\"),\n yy: {},\n 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 },\n 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\" },\n 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]],\n performAction: /* @__PURE__ */ __name(function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) {\n var $0 = $$.length - 1;\n switch (yystate) {\n case 2:\n this.$ = [];\n break;\n case 3:\n if (!Array.isArray($$[$0]) || $$[$0].length > 0) {\n $$[$0 - 1].push($$[$0]);\n }\n this.$ = $$[$0 - 1];\n break;\n case 4:\n case 183:\n this.$ = $$[$0];\n break;\n case 11:\n yy.setDirection(\"TB\");\n this.$ = \"TB\";\n break;\n case 12:\n yy.setDirection($$[$0 - 1]);\n this.$ = $$[$0 - 1];\n break;\n case 27:\n this.$ = $$[$0 - 1].nodes;\n break;\n case 28:\n case 29:\n case 30:\n case 31:\n case 32:\n this.$ = [];\n break;\n case 33:\n this.$ = yy.addSubGraph($$[$0 - 6], $$[$0 - 1], $$[$0 - 4]);\n break;\n case 34:\n this.$ = yy.addSubGraph($$[$0 - 3], $$[$0 - 1], $$[$0 - 3]);\n break;\n case 35:\n this.$ = yy.addSubGraph(void 0, $$[$0 - 1], void 0);\n break;\n case 37:\n this.$ = $$[$0].trim();\n yy.setAccTitle(this.$);\n break;\n case 38:\n case 39:\n this.$ = $$[$0].trim();\n yy.setAccDescription(this.$);\n break;\n case 43:\n this.$ = $$[$0 - 1] + $$[$0];\n break;\n case 44:\n this.$ = $$[$0];\n break;\n case 45:\n yy.addVertex($$[$0 - 1][$$[$0 - 1].length - 1], void 0, void 0, void 0, void 0, void 0, void 0, $$[$0]);\n yy.addLink($$[$0 - 3].stmt, $$[$0 - 1], $$[$0 - 2]);\n this.$ = { stmt: $$[$0 - 1], nodes: $$[$0 - 1].concat($$[$0 - 3].nodes) };\n break;\n case 46:\n yy.addLink($$[$0 - 2].stmt, $$[$0], $$[$0 - 1]);\n this.$ = { stmt: $$[$0], nodes: $$[$0].concat($$[$0 - 2].nodes) };\n break;\n case 47:\n yy.addLink($$[$0 - 3].stmt, $$[$0 - 1], $$[$0 - 2]);\n this.$ = { stmt: $$[$0 - 1], nodes: $$[$0 - 1].concat($$[$0 - 3].nodes) };\n break;\n case 48:\n this.$ = { stmt: $$[$0 - 1], nodes: $$[$0 - 1] };\n break;\n case 49:\n yy.addVertex($$[$0 - 1][$$[$0 - 1].length - 1], void 0, void 0, void 0, void 0, void 0, void 0, $$[$0]);\n this.$ = { stmt: $$[$0 - 1], nodes: $$[$0 - 1], shapeData: $$[$0] };\n break;\n case 50:\n this.$ = { stmt: $$[$0], nodes: $$[$0] };\n break;\n case 51:\n this.$ = [$$[$0]];\n break;\n case 52:\n yy.addVertex($$[$0 - 5][$$[$0 - 5].length - 1], void 0, void 0, void 0, void 0, void 0, void 0, $$[$0 - 4]);\n this.$ = $$[$0 - 5].concat($$[$0]);\n break;\n case 53:\n this.$ = $$[$0 - 4].concat($$[$0]);\n break;\n case 54:\n this.$ = $$[$0];\n break;\n case 55:\n this.$ = $$[$0 - 2];\n yy.setClass($$[$0 - 2], $$[$0]);\n break;\n case 56:\n this.$ = $$[$0 - 3];\n yy.addVertex($$[$0 - 3], $$[$0 - 1], \"square\");\n break;\n case 57:\n this.$ = $$[$0 - 3];\n yy.addVertex($$[$0 - 3], $$[$0 - 1], \"doublecircle\");\n break;\n case 58:\n this.$ = $$[$0 - 5];\n yy.addVertex($$[$0 - 5], $$[$0 - 2], \"circle\");\n break;\n case 59:\n this.$ = $$[$0 - 3];\n yy.addVertex($$[$0 - 3], $$[$0 - 1], \"ellipse\");\n break;\n case 60:\n this.$ = $$[$0 - 3];\n yy.addVertex($$[$0 - 3], $$[$0 - 1], \"stadium\");\n break;\n case 61:\n this.$ = $$[$0 - 3];\n yy.addVertex($$[$0 - 3], $$[$0 - 1], \"subroutine\");\n break;\n case 62:\n this.$ = $$[$0 - 7];\n yy.addVertex($$[$0 - 7], $$[$0 - 1], \"rect\", void 0, void 0, void 0, Object.fromEntries([[$$[$0 - 5], $$[$0 - 3]]]));\n break;\n case 63:\n this.$ = $$[$0 - 3];\n yy.addVertex($$[$0 - 3], $$[$0 - 1], \"cylinder\");\n break;\n case 64:\n this.$ = $$[$0 - 3];\n yy.addVertex($$[$0 - 3], $$[$0 - 1], \"round\");\n break;\n case 65:\n this.$ = $$[$0 - 3];\n yy.addVertex($$[$0 - 3], $$[$0 - 1], \"diamond\");\n break;\n case 66:\n this.$ = $$[$0 - 5];\n yy.addVertex($$[$0 - 5], $$[$0 - 2], \"hexagon\");\n break;\n case 67:\n this.$ = $$[$0 - 3];\n yy.addVertex($$[$0 - 3], $$[$0 - 1], \"odd\");\n break;\n case 68:\n this.$ = $$[$0 - 3];\n yy.addVertex($$[$0 - 3], $$[$0 - 1], \"trapezoid\");\n break;\n case 69:\n this.$ = $$[$0 - 3];\n yy.addVertex($$[$0 - 3], $$[$0 - 1], \"inv_trapezoid\");\n break;\n case 70:\n this.$ = $$[$0 - 3];\n yy.addVertex($$[$0 - 3], $$[$0 - 1], \"lean_right\");\n break;\n case 71:\n this.$ = $$[$0 - 3];\n yy.addVertex($$[$0 - 3], $$[$0 - 1], \"lean_left\");\n break;\n case 72:\n this.$ = $$[$0];\n yy.addVertex($$[$0]);\n break;\n case 73:\n $$[$0 - 1].text = $$[$0];\n this.$ = $$[$0 - 1];\n break;\n case 74:\n case 75:\n $$[$0 - 2].text = $$[$0 - 1];\n this.$ = $$[$0 - 2];\n break;\n case 76:\n this.$ = $$[$0];\n break;\n case 77:\n var inf = yy.destructLink($$[$0], $$[$0 - 2]);\n this.$ = { \"type\": inf.type, \"stroke\": inf.stroke, \"length\": inf.length, \"text\": $$[$0 - 1] };\n break;\n case 78:\n var inf = yy.destructLink($$[$0], $$[$0 - 2]);\n this.$ = { \"type\": inf.type, \"stroke\": inf.stroke, \"length\": inf.length, \"text\": $$[$0 - 1], \"id\": $$[$0 - 3] };\n break;\n case 79:\n this.$ = { text: $$[$0], type: \"text\" };\n break;\n case 80:\n this.$ = { text: $$[$0 - 1].text + \"\" + $$[$0], type: $$[$0 - 1].type };\n break;\n case 81:\n this.$ = { text: $$[$0], type: \"string\" };\n break;\n case 82:\n this.$ = { text: $$[$0], type: \"markdown\" };\n break;\n case 83:\n var inf = yy.destructLink($$[$0]);\n this.$ = { \"type\": inf.type, \"stroke\": inf.stroke, \"length\": inf.length };\n break;\n case 84:\n var inf = yy.destructLink($$[$0]);\n this.$ = { \"type\": inf.type, \"stroke\": inf.stroke, \"length\": inf.length, \"id\": $$[$0 - 1] };\n break;\n case 85:\n this.$ = $$[$0 - 1];\n break;\n case 86:\n this.$ = { text: $$[$0], type: \"text\" };\n break;\n case 87:\n this.$ = { text: $$[$0 - 1].text + \"\" + $$[$0], type: $$[$0 - 1].type };\n break;\n case 88:\n this.$ = { text: $$[$0], type: \"string\" };\n break;\n case 89:\n case 104:\n this.$ = { text: $$[$0], type: \"markdown\" };\n break;\n case 101:\n this.$ = { text: $$[$0], type: \"text\" };\n break;\n case 102:\n this.$ = { text: $$[$0 - 1].text + \"\" + $$[$0], type: $$[$0 - 1].type };\n break;\n case 103:\n this.$ = { text: $$[$0], type: \"text\" };\n break;\n case 105:\n this.$ = $$[$0 - 4];\n yy.addClass($$[$0 - 2], $$[$0]);\n break;\n case 106:\n this.$ = $$[$0 - 4];\n yy.setClass($$[$0 - 2], $$[$0]);\n break;\n case 107:\n case 115:\n this.$ = $$[$0 - 1];\n yy.setClickEvent($$[$0 - 1], $$[$0]);\n break;\n case 108:\n case 116:\n this.$ = $$[$0 - 3];\n yy.setClickEvent($$[$0 - 3], $$[$0 - 2]);\n yy.setTooltip($$[$0 - 3], $$[$0]);\n break;\n case 109:\n this.$ = $$[$0 - 2];\n yy.setClickEvent($$[$0 - 2], $$[$0 - 1], $$[$0]);\n break;\n case 110:\n this.$ = $$[$0 - 4];\n yy.setClickEvent($$[$0 - 4], $$[$0 - 3], $$[$0 - 2]);\n yy.setTooltip($$[$0 - 4], $$[$0]);\n break;\n case 111:\n this.$ = $$[$0 - 2];\n yy.setLink($$[$0 - 2], $$[$0]);\n break;\n case 112:\n this.$ = $$[$0 - 4];\n yy.setLink($$[$0 - 4], $$[$0 - 2]);\n yy.setTooltip($$[$0 - 4], $$[$0]);\n break;\n case 113:\n this.$ = $$[$0 - 4];\n yy.setLink($$[$0 - 4], $$[$0 - 2], $$[$0]);\n break;\n case 114:\n this.$ = $$[$0 - 6];\n yy.setLink($$[$0 - 6], $$[$0 - 4], $$[$0]);\n yy.setTooltip($$[$0 - 6], $$[$0 - 2]);\n break;\n case 117:\n this.$ = $$[$0 - 1];\n yy.setLink($$[$0 - 1], $$[$0]);\n break;\n case 118:\n this.$ = $$[$0 - 3];\n yy.setLink($$[$0 - 3], $$[$0 - 2]);\n yy.setTooltip($$[$0 - 3], $$[$0]);\n break;\n case 119:\n this.$ = $$[$0 - 3];\n yy.setLink($$[$0 - 3], $$[$0 - 2], $$[$0]);\n break;\n case 120:\n this.$ = $$[$0 - 5];\n yy.setLink($$[$0 - 5], $$[$0 - 4], $$[$0]);\n yy.setTooltip($$[$0 - 5], $$[$0 - 2]);\n break;\n case 121:\n this.$ = $$[$0 - 4];\n yy.addVertex($$[$0 - 2], void 0, void 0, $$[$0]);\n break;\n case 122:\n this.$ = $$[$0 - 4];\n yy.updateLink([$$[$0 - 2]], $$[$0]);\n break;\n case 123:\n this.$ = $$[$0 - 4];\n yy.updateLink($$[$0 - 2], $$[$0]);\n break;\n case 124:\n this.$ = $$[$0 - 8];\n yy.updateLinkInterpolate([$$[$0 - 6]], $$[$0 - 2]);\n yy.updateLink([$$[$0 - 6]], $$[$0]);\n break;\n case 125:\n this.$ = $$[$0 - 8];\n yy.updateLinkInterpolate($$[$0 - 6], $$[$0 - 2]);\n yy.updateLink($$[$0 - 6], $$[$0]);\n break;\n case 126:\n this.$ = $$[$0 - 6];\n yy.updateLinkInterpolate([$$[$0 - 4]], $$[$0]);\n break;\n case 127:\n this.$ = $$[$0 - 6];\n yy.updateLinkInterpolate($$[$0 - 4], $$[$0]);\n break;\n case 128:\n case 130:\n this.$ = [$$[$0]];\n break;\n case 129:\n case 131:\n $$[$0 - 2].push($$[$0]);\n this.$ = $$[$0 - 2];\n break;\n case 133:\n this.$ = $$[$0 - 1] + $$[$0];\n break;\n case 181:\n this.$ = $$[$0];\n break;\n case 182:\n this.$ = $$[$0 - 1] + \"\" + $$[$0];\n break;\n case 184:\n this.$ = $$[$0 - 1] + \"\" + $$[$0];\n break;\n case 185:\n this.$ = { stmt: \"dir\", value: \"TB\" };\n break;\n case 186:\n this.$ = { stmt: \"dir\", value: \"BT\" };\n break;\n case 187:\n this.$ = { stmt: \"dir\", value: \"RL\" };\n break;\n case 188:\n this.$ = { stmt: \"dir\", value: \"LR\" };\n break;\n }\n }, \"anonymous\"),\n 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 })],\n defaultActions: {},\n parseError: /* @__PURE__ */ __name(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 }, \"parseError\"),\n parse: /* @__PURE__ */ __name(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 lexer2 = 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 lexer2.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer2;\n sharedState.yy.parser = this;\n if (typeof lexer2.yylloc == \"undefined\") {\n lexer2.yylloc = {};\n }\n var yyloc = lexer2.yylloc;\n lstack.push(yyloc);\n var ranges = lexer2.options && lexer2.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 __name(popStack, \"popStack\");\n function lex() {\n var token;\n token = tstack.pop() || lexer2.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 __name(lex, \"lex\");\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 (lexer2.showPosition) {\n errStr = \"Parse error on line \" + (yylineno + 1) + \":\\n\" + lexer2.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: lexer2.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer2.yylineno,\n loc: yyloc,\n 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(lexer2.yytext);\n lstack.push(lexer2.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = lexer2.yyleng;\n yytext = lexer2.yytext;\n yylineno = lexer2.yylineno;\n yyloc = lexer2.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 }, \"parse\")\n };\n var lexer = /* @__PURE__ */ function() {\n var lexer2 = {\n EOF: 1,\n parseError: /* @__PURE__ */ __name(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 }, \"parseError\"),\n // resets the lexer, sets new input\n setInput: /* @__PURE__ */ __name(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 }, \"setInput\"),\n // consumes and returns one char from the input\n input: /* @__PURE__ */ __name(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 this._input = this._input.slice(1);\n return ch;\n }, \"input\"),\n // unshifts one char (or a string) into the input\n unput: /* @__PURE__ */ __name(function(ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - 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 if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\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 ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len\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 }, \"unput\"),\n // When called from action, caches matched text and appends it on next action\n more: /* @__PURE__ */ __name(function() {\n this._more = true;\n return this;\n }, \"more\"),\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.\n reject: /* @__PURE__ */ __name(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 return this;\n }, \"reject\"),\n // retain first n characters of the match\n less: /* @__PURE__ */ __name(function(n) {\n this.unput(this.match.slice(n));\n }, \"less\"),\n // displays already matched input, i.e. for error messages\n pastInput: /* @__PURE__ */ __name(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 }, \"pastInput\"),\n // displays upcoming input, i.e. for error messages\n upcomingInput: /* @__PURE__ */ __name(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 }, \"upcomingInput\"),\n // displays the character position where the lexing error occurred, i.e. for error messages\n showPosition: /* @__PURE__ */ __name(function() {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n }, \"showPosition\"),\n // test the lexed token: return FALSE when not a match, otherwise return token\n test_match: /* @__PURE__ */ __name(function(match, indexed_rule) {\n var token, lines, backup;\n if (this.options.backtrack_lexer) {\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 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 ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length : 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 for (var k in backup) {\n this[k] = backup[k];\n }\n return false;\n }\n return false;\n }, \"test_match\"),\n // return next match in input\n next: /* @__PURE__ */ __name(function() {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n var token, match, tempMatch, 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;\n } else {\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 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 }, \"next\"),\n // return next match that has a token\n lex: /* @__PURE__ */ __name(function lex() {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n }, \"lex\"),\n // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\n begin: /* @__PURE__ */ __name(function begin(condition) {\n this.conditionStack.push(condition);\n }, \"begin\"),\n // pop the previously active lexer condition state off the condition stack\n popState: /* @__PURE__ */ __name(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 }, \"popState\"),\n // produce the lexer rule set which is active for the currently active lexer condition state\n _currentRules: /* @__PURE__ */ __name(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 }, \"_currentRules\"),\n // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\n topState: /* @__PURE__ */ __name(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 }, \"topState\"),\n // alias for begin(condition)\n pushState: /* @__PURE__ */ __name(function pushState(condition) {\n this.begin(condition);\n }, \"pushState\"),\n // return the number of states currently on the stack\n stateStackSize: /* @__PURE__ */ __name(function stateStackSize() {\n return this.conditionStack.length;\n }, \"stateStackSize\"),\n options: {},\n performAction: /* @__PURE__ */ __name(function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) {\n var YYSTATE = YY_START;\n switch ($avoiding_name_collisions) {\n case 0:\n this.begin(\"acc_title\");\n return 34;\n break;\n case 1:\n this.popState();\n return \"acc_title_value\";\n break;\n case 2:\n this.begin(\"acc_descr\");\n return 36;\n break;\n case 3:\n this.popState();\n return \"acc_descr_value\";\n break;\n case 4:\n this.begin(\"acc_descr_multiline\");\n break;\n case 5:\n this.popState();\n break;\n case 6:\n return \"acc_descr_multiline_value\";\n break;\n case 7:\n this.pushState(\"shapeData\");\n yy_.yytext = \"\";\n return 40;\n break;\n case 8:\n this.pushState(\"shapeDataStr\");\n return 40;\n break;\n case 9:\n this.popState();\n return 40;\n break;\n case 10:\n const re = /\\n\\s*/g;\n yy_.yytext = yy_.yytext.replace(re, \"
\");\n return 40;\n break;\n case 11:\n return 40;\n break;\n case 12:\n this.popState();\n break;\n case 13:\n this.begin(\"callbackname\");\n break;\n case 14:\n this.popState();\n break;\n case 15:\n this.popState();\n this.begin(\"callbackargs\");\n break;\n case 16:\n return 95;\n break;\n case 17:\n this.popState();\n break;\n case 18:\n return 96;\n break;\n case 19:\n return \"MD_STR\";\n break;\n case 20:\n this.popState();\n break;\n case 21:\n this.begin(\"md_string\");\n break;\n case 22:\n return \"STR\";\n break;\n case 23:\n this.popState();\n break;\n case 24:\n this.pushState(\"string\");\n break;\n case 25:\n return 84;\n break;\n case 26:\n return 102;\n break;\n case 27:\n return 85;\n break;\n case 28:\n return 104;\n break;\n case 29:\n return 86;\n break;\n case 30:\n return 87;\n break;\n case 31:\n return 97;\n break;\n case 32:\n this.begin(\"click\");\n break;\n case 33:\n this.popState();\n break;\n case 34:\n return 88;\n break;\n case 35:\n if (yy.lex.firstGraph()) {\n this.begin(\"dir\");\n }\n return 12;\n break;\n case 36:\n if (yy.lex.firstGraph()) {\n this.begin(\"dir\");\n }\n return 12;\n break;\n case 37:\n if (yy.lex.firstGraph()) {\n this.begin(\"dir\");\n }\n return 12;\n break;\n case 38:\n return 27;\n break;\n case 39:\n return 32;\n break;\n case 40:\n return 98;\n break;\n case 41:\n return 98;\n break;\n case 42:\n return 98;\n break;\n case 43:\n return 98;\n break;\n case 44:\n this.popState();\n return 13;\n break;\n case 45:\n this.popState();\n return 14;\n break;\n case 46:\n this.popState();\n return 14;\n break;\n case 47:\n this.popState();\n return 14;\n break;\n case 48:\n this.popState();\n return 14;\n break;\n case 49:\n this.popState();\n return 14;\n break;\n case 50:\n this.popState();\n return 14;\n break;\n case 51:\n this.popState();\n return 14;\n break;\n case 52:\n this.popState();\n return 14;\n break;\n case 53:\n this.popState();\n return 14;\n break;\n case 54:\n this.popState();\n return 14;\n break;\n case 55:\n return 121;\n break;\n case 56:\n return 122;\n break;\n case 57:\n return 123;\n break;\n case 58:\n return 124;\n break;\n case 59:\n return 78;\n break;\n case 60:\n return 105;\n break;\n case 61:\n return 111;\n break;\n case 62:\n return 46;\n break;\n case 63:\n return 60;\n break;\n case 64:\n return 44;\n break;\n case 65:\n return 8;\n break;\n case 66:\n return 106;\n break;\n case 67:\n return 115;\n break;\n case 68:\n this.popState();\n return 77;\n break;\n case 69:\n this.pushState(\"edgeText\");\n return 75;\n break;\n case 70:\n return 119;\n break;\n case 71:\n this.popState();\n return 77;\n break;\n case 72:\n this.pushState(\"thickEdgeText\");\n return 75;\n break;\n case 73:\n return 119;\n break;\n case 74:\n this.popState();\n return 77;\n break;\n case 75:\n this.pushState(\"dottedEdgeText\");\n return 75;\n break;\n case 76:\n return 119;\n break;\n case 77:\n return 77;\n break;\n case 78:\n this.popState();\n return 53;\n break;\n case 79:\n return \"TEXT\";\n break;\n case 80:\n this.pushState(\"ellipseText\");\n return 52;\n break;\n case 81:\n this.popState();\n return 55;\n break;\n case 82:\n this.pushState(\"text\");\n return 54;\n break;\n case 83:\n this.popState();\n return 57;\n break;\n case 84:\n this.pushState(\"text\");\n return 56;\n break;\n case 85:\n return 58;\n break;\n case 86:\n this.pushState(\"text\");\n return 67;\n break;\n case 87:\n this.popState();\n return 64;\n break;\n case 88:\n this.pushState(\"text\");\n return 63;\n break;\n case 89:\n this.popState();\n return 49;\n break;\n case 90:\n this.pushState(\"text\");\n return 48;\n break;\n case 91:\n this.popState();\n return 69;\n break;\n case 92:\n this.popState();\n return 71;\n break;\n case 93:\n return 117;\n break;\n case 94:\n this.pushState(\"trapText\");\n return 68;\n break;\n case 95:\n this.pushState(\"trapText\");\n return 70;\n break;\n case 96:\n return 118;\n break;\n case 97:\n return 67;\n break;\n case 98:\n return 90;\n break;\n case 99:\n return \"SEP\";\n break;\n case 100:\n return 89;\n break;\n case 101:\n return 115;\n break;\n case 102:\n return 111;\n break;\n case 103:\n return 44;\n break;\n case 104:\n return 109;\n break;\n case 105:\n return 114;\n break;\n case 106:\n return 116;\n break;\n case 107:\n this.popState();\n return 62;\n break;\n case 108:\n this.pushState(\"text\");\n return 62;\n break;\n case 109:\n this.popState();\n return 51;\n break;\n case 110:\n this.pushState(\"text\");\n return 50;\n break;\n case 111:\n this.popState();\n return 31;\n break;\n case 112:\n this.pushState(\"text\");\n return 29;\n break;\n case 113:\n this.popState();\n return 66;\n break;\n case 114:\n this.pushState(\"text\");\n return 65;\n break;\n case 115:\n return \"TEXT\";\n break;\n case 116:\n return \"QUOTE\";\n break;\n case 117:\n return 9;\n break;\n case 118:\n return 10;\n break;\n case 119:\n return 11;\n break;\n }\n }, \"anonymous\"),\n 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)/, /^(?:$)/],\n 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 } }\n };\n return lexer2;\n }();\n parser2.lexer = lexer;\n function Parser() {\n this.yy = {};\n }\n __name(Parser, \"Parser\");\n Parser.prototype = parser2;\n parser2.Parser = Parser;\n return new Parser();\n}();\nparser.parser = parser;\nvar flow_default = parser;\n\n// src/diagrams/flowchart/parser/flowParser.ts\nvar newParser = Object.assign({}, flow_default);\nnewParser.parse = (src) => {\n const newSrc = src.replace(/}\\s*\\n/g, \"}\\n\");\n return flow_default.parse(newSrc);\n};\nvar flowParser_default = newParser;\n\n// src/diagrams/flowchart/styles.ts\nimport * as khroma from \"khroma\";\nvar fade = /* @__PURE__ */ __name((color, opacity) => {\n const channel2 = khroma.channel;\n const r = channel2(color, \"r\");\n const g = channel2(color, \"g\");\n const b = channel2(color, \"b\");\n return khroma.rgba(r, g, b, opacity);\n}, \"fade\");\nvar getStyles = /* @__PURE__ */ __name((options) => `.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`, \"getStyles\");\nvar styles_default = getStyles;\n\n// src/diagrams/flowchart/flowDiagram.ts\nvar diagram = {\n parser: flowParser_default,\n get db() {\n return new FlowDB();\n },\n renderer: flowRenderer_v3_unified_default,\n styles: styles_default,\n init: /* @__PURE__ */ __name((cnf) => {\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 }, \"init\")\n};\nexport {\n diagram\n};\n","import {\n __name,\n configureSvgSize,\n log\n} from \"./chunk-YTJNT7DU.mjs\";\n\n// src/rendering-util/insertElementsForSize.js\nimport { select } from \"d3\";\nvar getDiagramElement = /* @__PURE__ */ __name((id, securityLevel) => {\n let sandboxElement;\n if (securityLevel === \"sandbox\") {\n sandboxElement = select(\"#i\" + id);\n }\n const root = securityLevel === \"sandbox\" ? select(sandboxElement.nodes()[0].contentDocument.body) : select(\"body\");\n const svg = root.select(`[id=\"${id}\"]`);\n return svg;\n}, \"getDiagramElement\");\n\n// src/rendering-util/setupViewPortForSVG.ts\nvar setupViewPortForSVG = /* @__PURE__ */ __name((svg, padding, cssDiagram, useMaxWidth) => {\n svg.attr(\"class\", cssDiagram);\n const { width, height, x, y } = calculateDimensionsWithPadding(svg, padding);\n configureSvgSize(svg, height, width, useMaxWidth);\n const viewBox = createViewBox(x, y, width, height, padding);\n svg.attr(\"viewBox\", viewBox);\n log.debug(`viewBox configured: ${viewBox} with padding: ${padding}`);\n}, \"setupViewPortForSVG\");\nvar calculateDimensionsWithPadding = /* @__PURE__ */ __name((svg, padding) => {\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}, \"calculateDimensionsWithPadding\");\nvar createViewBox = /* @__PURE__ */ __name((x, y, width, height, padding) => {\n return `${x - padding} ${y - padding} ${width} ${height}`;\n}, \"createViewBox\");\n\nexport {\n getDiagramElement,\n setupViewPortForSVG\n};\n","/* IMPORT */\nimport _ from '../utils/index.js';\nimport Color from '../color/index.js';\n/* MAIN */\nconst channel = (color, channel) => {\n return _.lang.round(Color.parse(color)[channel]);\n};\n/* EXPORT */\nexport default channel;\n"],"names":["FlowDB","constructor","this","vertexCounter","config","getConfig","vertices","Map","edges","classes","subGraphs","subGraphLookup","tooltips","subCount","firstGraphFlag","secCount","posCrossRef","funs","setAccTitle","setAccDescription","setDiagramTitle","getAccTitle","getAccDescription","getDiagramTitle","push","setupToolTips","bind","addVertex","firstGraph","setDirection","addSubGraph","addLink","setLink","updateLink","addClass","setClass","destructLink","setClickEvent","setTooltip","updateLinkInterpolate","setClickFun","bindFunctions","lex","clear","setGen","__name","sanitizeText","txt","common_default","lookUpDomId","id","vertex","values","domId","textObj","type","style","dir","doc","props","arguments","length","undefined","metadata","trim","yamlData","includes","load","schema","JSON_SCHEMA","edge","find","e","edgeDoc","animate","animation","get","labelType","styles","set","text","startsWith","endsWith","substring","forEach","s","Object","assign","shape","toLowerCase","Error","isValidShape","label","icon","form","pos","img","constraint","w","assetWidth","Number","h","assetHeight","addSingleLink","_start","_end","start","end","isUserDefinedId","interpolate","defaultInterpolate","log","info","linkTextObj","stroke","some","existingLinks","filter","getEdgeId","counter","prefix","maxEdges","isLinkData","value","linkData","replace","isLastStart","isFirstEnd","positions","defaultStyle","ids","_style","join","split","classNode","textStyles","exec","newStyle","direction","className","subGraph","tooltip","version","functionName","functionArgs","securityLevel","argList","i","item","substr","haveCallback","elem","document","querySelector","addEventListener","utils_default","runFunc","linkStr","target","link","formatUrl","linkTarget","getTooltip","element","fun","getDirection","getVertices","getEdges","getClasses","tooltipElem","select","_groups","append","attr","selectAll","on","el","currentTarget","rect","getBoundingClientRect","transition","duration","window","scrollX","left","right","scrollY","bottom","html","classed","ver","_id","list","_title","title","uniq","a","prims","boolean","number","string","objs","dir2","nodeList","stmt","hasOwnProperty","flat","nodes","makeUniq","getPosForId","entries","indexNodes2","result","count","posCount","childPos","res","getDepthFirstPos","indexNodes","getSubGraphs","destructStartLink","_str","str","slice","countChar","char","destructEndLink","line","dots","_startStr","startInfo","exists","allSgs","sg","allSubgraphs","getTypeFromVertex","findNode","node","destructEdgeType","arrowTypeStart","arrowTypeEnd","addNodeFromVertex","parentDB","subGraphDB","look","parentId","isGroup","cssStyles","cssCompiledStyles","getCompiledStyles","cssClasses","baseNode","labelStyle","padding","flowchart","classDefs","compiledStyles","customClass","cssClass","map","getData","rawEdge","index","labelpos","thickness","minlen","arrowheadStyle","pattern","curve","other","defaultConfig","flowRenderer_v3_unified_default","diagramObj","db","draw","async","_version","diag","conf","layout","sandboxElement","select2","contentDocument","debug","data4Layout","svg","getDiagramElement","layoutAlgorithm","getRegisteredLayoutAlgorithm","warn","nodeSpacing","rankSpacing","markers","diagramId","render","diagramPadding","insertTitle","titleTopMargin","setupViewPortForSVG","useMaxWidth","createElementNS","setAttributeNS","linkNode","insert","parser","o","k","v","o2","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","$VT","$VU","$VV","$VW","$VX","$VY","$VZ","$V_","$V$","$V01","$V11","$V21","$V31","$V41","$V51","$V61","$V71","$V81","$V91","$Va1","$Vb1","$Vc1","$Vd1","$Ve1","$Vf1","$Vg1","$Vh1","$Vi1","$Vj1","$Vk1","$Vl1","$Vm1","$Vn1","$Vo1","$Vp1","$Vq1","$Vr1","$Vs1","$Vt1","$Vu1","$Vv1","$Vw1","$Vx1","$Vy1","$Vz1","$VA1","$VB1","$VC1","$VD1","$VE1","$VF1","$VG1","$VH1","parser2","trace","yy","symbols_","terminals_","productions_","performAction","yytext","yyleng","yylineno","yystate","$$","_$","$0","$","Array","isArray","concat","shapeData","fromEntries","inf","table","defaultActions","parseError","hash","recoverable","error","parse","input","self","stack","tstack","vstack","lstack","recovering","args","call","lexer2","create","lexer","sharedState","prototype","setInput","yylloc","yyloc","ranges","options","token","pop","getPrototypeOf","n","symbol","preErrorSymbol","state","action","r","p","len","newState","expected","yyval","errStr","showPosition","match","loc","first_line","last_line","first_column","last_column","range","apply","EOF","_input","_more","_backtrack","done","matched","conditionStack","offset","ch","unput","lines","oldLines","more","reject","backtrack_lexer","less","pastInput","past","upcomingInput","next","pre","c","test_match","indexed_rule","backup","matches","tempMatch","rules","_currentRules","flex","begin","condition","popState","conditions","topState","Math","abs","pushState","stateStackSize","yy_","$avoiding_name_collisions","YY_START","re","Parser","flow_default","newParser","src","newSrc","flowParser_default","fade","color","opacity","channel2","khroma","g","b","styles_default","fontFamily","nodeTextColor","textColor","titleColor","mainBkg","nodeBorder","lineColor","arrowheadColor","edgeLabelBackground","clusterBkg","clusterBorder","tertiaryColor","border2","diagram","renderer","init","cnf","setConfig","arrowMarkerAbsolute","body","cssDiagram","width","height","x","y","calculateDimensionsWithPadding","configureSvgSize","viewBox","createViewBox","bounds","getBBox","channel","_","lang","round","Color"],"sourceRoot":""} \ No newline at end of file diff --git a/frontend/deployed/static/js/502.89ac9055.chunk.js b/frontend/deployed/static/js/502.89ac9055.chunk.js deleted file mode 100644 index 618b49a..0000000 --- a/frontend/deployed/static/js/502.89ac9055.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunkbackstory=self.webpackChunkbackstory||[]).push([[502],{68:(e,t,n)=>{function r(e){return e.charCodeAt(0)}function i(e,t){Array.isArray(e)?e.forEach((function(e){t.push(e)})):t.push(e)}function s(e,t){if(!0===e[t])throw"duplicate flag "+t;e[t];e[t]=!0}function a(e){if(void 0===e)throw Error("Internal Error - Should never get here!");return!0}function o(){throw Error("Internal Error - Should never get here!")}function c(e){return"Character"===e.type}n.d(t,{z:()=>g,H:()=>m});const l=[];for(let y=r("0");y<=r("9");y++)l.push(y);const u=[r("_")].concat(l);for(let y=r("a");y<=r("z");y++)u.push(y);for(let y=r("A");y<=r("Z");y++)u.push(y);const d=[r(" "),r("\f"),r("\n"),r("\r"),r("\t"),r("\v"),r("\t"),r("\xa0"),r("\u1680"),r("\u2000"),r("\u2001"),r("\u2002"),r("\u2003"),r("\u2004"),r("\u2005"),r("\u2006"),r("\u2007"),r("\u2008"),r("\u2009"),r("\u200a"),r("\u2028"),r("\u2029"),r("\u202f"),r("\u205f"),r("\u3000"),r("\ufeff")],h=/[0-9a-fA-F]/,f=/[0-9]/,p=/[1-9]/;class m{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("/");const t=this.disjunction();this.consumeChar("/");const 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":s(n,"global");break;case"i":s(n,"ignoreCase");break;case"m":s(n,"multiLine");break;case"u":s(n,"unicode");break;case"y":s(n,"sticky")}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(){const 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(){const 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(){const 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"(":let t;switch(this.consumeChar("?"),this.popChar()){case"=":t="Lookahead";break;case"!":t="NegativeLookahead"}a(t);const n=this.disjunction();return this.consumeChar(")"),{type:t,value:n,loc:this.loc(e)}}return o()}quantifier(){let e,t=arguments.length>0&&void 0!==arguments[0]&&arguments[0];const n=this.idx;switch(this.popChar()){case"*":e={atLeast:0,atMost:1/0};break;case"+":e={atLeast:1,atMost:1/0};break;case"?":e={atLeast:0,atMost:1};break;case"{":const n=this.integerIncludingZero();switch(this.popChar()){case"}":e={atLeast:n,atMost:n};break;case",":let t;this.isDigit()?(t=this.integerIncludingZero(),e={atLeast:n,atMost:t}):e={atLeast:n,atMost:1/0},this.consumeChar("}")}if(!0===t&&void 0===e)return;a(e)}if(!0!==t||void 0!==e)return a(e)?("?"===this.peekChar(0)?(this.consumeChar("?"),e.greedy=!1):e.greedy=!0,e.type="Quantifier",e.loc=this.loc(n),e):void 0}atom(){let e;const 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()}return void 0===e&&this.isPatternCharacter()&&(e=this.patternCharacter()),a(e)?(e.loc=this.loc(t),this.isQuantifier()&&(e.quantifier=this.quantifier()),e):o()}dotAll(){return this.consumeChar("."),{type:"Set",complement:!0,value:[r("\n"),r("\r"),r("\u2028"),r("\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=l;break;case"D":e=l,t=!0;break;case"s":e=d;break;case"S":e=d,t=!0;break;case"w":e=u;break;case"W":e=u,t=!0}return a(e)?{type:"Set",value:e,complement:t}:o()}controlEscapeAtom(){let e;switch(this.popChar()){case"f":e=r("\f");break;case"n":e=r("\n");break;case"r":e=r("\r");break;case"t":e=r("\t");break;case"v":e=r("\v")}return a(e)?{type:"Character",value:e}:o()}controlLetterEscapeAtom(){this.consumeChar("c");const e=this.popChar();if(!1===/[a-zA-Z]/.test(e))throw Error("Invalid ");return{type:"Character",value:e.toUpperCase().charCodeAt(0)-64}}nulCharacterAtom(){return this.consumeChar("0"),{type:"Character",value:r("\0")}}hexEscapeSequenceAtom(){return this.consumeChar("x"),this.parseHexDigits(2)}regExpUnicodeEscapeSequenceAtom(){return this.consumeChar("u"),this.parseHexDigits(4)}identityEscapeAtom(){return{type:"Character",value:r(this.popChar())}}classPatternCharacterAtom(){switch(this.peekChar()){case"\n":case"\r":case"\u2028":case"\u2029":case"\\":case"]":throw Error("TBD");default:return{type:"Character",value:r(this.popChar())}}}characterClass(){const e=[];let t=!1;for(this.consumeChar("["),"^"===this.peekChar(0)&&(this.consumeChar("^"),t=!0);this.isClassAtom();){const t=this.classAtom();t.type;if(c(t)&&this.isRangeDash()){this.consumeChar("-");const n=this.classAtom();n.type;if(c(n)){if(n.value0&&void 0!==arguments[0]?arguments[0]:0;switch(this.peekChar(e)){case"]":case"\n":case"\r":case"\u2028":case"\u2029":return!1;default:return!0}}isTerm(){return this.isAtom()||this.isAssertion()}isAtom(){if(this.isPatternCharacter())return!0;switch(this.peekChar(0)){case".":case"\\":case"[":case"(":return!0;default:return!1}}isAssertion(){switch(this.peekChar(0)){case"^":case"$":return!0;case"\\":switch(this.peekChar(1)){case"b":case"B":return!0;default:return!1}case"(":return"?"===this.peekChar(1)&&("="===this.peekChar(2)||"!"===this.peekChar(2));default:return!1}}isQuantifier(){const e=this.saveState();try{return void 0!==this.quantifier(!0)}catch(t){return!1}finally{this.restoreState(e)}}isPatternCharacter(){switch(this.peekChar()){case"^":case"$":case"\\":case".":case"*":case"+":case"?":case"(":case")":case"[":case"|":case"/":case"\n":case"\r":case"\u2028":case"\u2029":return!1;default:return!0}}parseHexDigits(e){let t="";for(let n=0;n0&&void 0!==arguments[0]?arguments[0]:0;return this.input[this.idx+e]}popChar(){const e=this.peekChar(0);return this.consumeChar(void 0),e}consumeChar(e){if(void 0!==e&&this.input[this.idx]!==e)throw Error("Expected: '"+e+"' but found: '"+this.input[this.idx]+"' at offset: "+this.idx);if(this.idx>=this.input.length)throw Error("Unexpected end of input");this.idx++}loc(e){return{begin:e,end:this.idx}}}class g{visitChildren(e){for(const t in e){const n=e[t];e.hasOwnProperty(t)&&(void 0!==n.type?this.visit(n):Array.isArray(n)&&n.forEach((e=>{this.visit(e)}),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)}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){}}},313:(e,t,n)=>{n.d(t,{A:()=>a});var r=Object.prototype.hasOwnProperty;const i=function(e,t){return null!=e&&r.call(e,t)};var s=n(2263);const a=function(e,t){return null!=e&&(0,s.A)(e,t,i)}},595:(e,t,n)=>{n.d(t,{A:()=>u});var r=n(378),i=n(3493),s=n(4175);const a=function(e){return function(t,n,a){var o=Object(t);if(!(0,i.A)(t)){var c=(0,r.A)(n,3);t=(0,s.A)(t),n=function(e){return c(o[e],e,o)}}var l=e(t,n,a);return l>-1?o[c?t[l]:l]:void 0}};var o=n(2782),c=n(6230),l=Math.max;const u=a((function(e,t,n){var i=null==e?0:e.length;if(!i)return-1;var s=null==n?0:(0,c.A)(n);return s<0&&(s=l(i+s,0)),(0,o.A)(e,(0,r.A)(t,3),s)}))},1012:(e,t,n)=>{n.d(t,{A:()=>u});var r=n(3367),i=n(1954),s=n(225),a=n(5884),o=n(7664),c=n(6548);const l=function(e,t,n,r){if(!(0,o.A)(e))return e;for(var l=-1,u=(t=(0,s.A)(t,e)).length,d=u-1,h=e;null!=h&&++l{n.d(t,{$g:()=>fe,Bg:()=>J,Ct:()=>S,Cz:()=>p,D8:()=>U,FO:()=>re,Fy:()=>me,GL:()=>le,IZ:()=>se,Mz:()=>ke,O4:()=>ye,QX:()=>Ie,RP:()=>v,S2:()=>$,SP:()=>E,TF:()=>L,Tu:()=>g,Xj:()=>j,_c:()=>te,cY:()=>Re,fG:()=>M,jp:()=>X,lF:()=>Ae,r1:()=>u,rE:()=>K,s7:()=>O,vd:()=>de,ve:()=>z,wb:()=>oe,wh:()=>Q,z2:()=>xe});var r=n(5460);const i="AbstractRule";const s="AbstractType";const a="Condition";const o="TypeDefinition";const c="ValueLiteral";const l="AbstractElement";function u(e){return Se.isInstance(e,l)}const d="ArrayLiteral";const h="ArrayType";const f="BooleanLiteral";function p(e){return Se.isInstance(e,f)}const m="Conjunction";function g(e){return Se.isInstance(e,m)}const y="Disjunction";function v(e){return Se.isInstance(e,y)}const A="Grammar";const T="GrammarImport";const R="InferredType";function E(e){return Se.isInstance(e,R)}const k="Interface";function $(e){return Se.isInstance(e,k)}const x="NamedArgument";const I="Negation";function S(e){return Se.isInstance(e,I)}const N="NumberLiteral";const w="Parameter";const C="ParameterReference";function L(e){return Se.isInstance(e,C)}const b="ParserRule";function O(e){return Se.isInstance(e,b)}const _="ReferenceType";const P="ReturnType";function M(e){return Se.isInstance(e,P)}const D="SimpleType";function U(e){return Se.isInstance(e,D)}const F="StringLiteral";const G="TerminalRule";function K(e){return Se.isInstance(e,G)}const B="Type";function j(e){return Se.isInstance(e,B)}const V="TypeAttribute";const H="UnionType";const W="Action";function z(e){return Se.isInstance(e,W)}const Y="Alternatives";function X(e){return Se.isInstance(e,Y)}const q="Assignment";function Q(e){return Se.isInstance(e,q)}const Z="CharacterRange";function J(e){return Se.isInstance(e,Z)}const ee="CrossReference";function te(e){return Se.isInstance(e,ee)}const ne="EndOfFile";function re(e){return Se.isInstance(e,ne)}const ie="Group";function se(e){return Se.isInstance(e,ie)}const ae="Keyword";function oe(e){return Se.isInstance(e,ae)}const ce="NegatedToken";function le(e){return Se.isInstance(e,ce)}const ue="RegexToken";function de(e){return Se.isInstance(e,ue)}const he="RuleCall";function fe(e){return Se.isInstance(e,he)}const pe="TerminalAlternatives";function me(e){return Se.isInstance(e,pe)}const ge="TerminalGroup";function ye(e){return Se.isInstance(e,ge)}const ve="TerminalRuleCall";function Ae(e){return Se.isInstance(e,ve)}const Te="UnorderedGroup";function Re(e){return Se.isInstance(e,Te)}const Ee="UntilToken";function ke(e){return Se.isInstance(e,Ee)}const $e="Wildcard";function xe(e){return Se.isInstance(e,$e)}class Ie extends r.kD{getAllTypes(){return[l,i,s,W,Y,d,h,q,f,Z,a,m,ee,y,ne,A,T,ie,R,k,ae,x,ce,I,N,w,C,b,_,ue,P,he,D,F,pe,ge,G,ve,B,V,o,H,Te,Ee,c,$e]}computeIsSubtype(e,t){switch(e){case W:case Y:case q:case Z:case ee:case ne:case ie:case ae:case ce:case ue:case he:case pe:case ge:case ve:case Te:case Ee:case $e:return this.isSubtype(l,t);case d:case N:case F:return this.isSubtype(c,t);case h:case _:case D:case H:return this.isSubtype(o,t);case f:return this.isSubtype(a,t)||this.isSubtype(c,t);case m:case y:case I:case C:return this.isSubtype(a,t);case R:case k:case B:return this.isSubtype(s,t);case b:return this.isSubtype(i,t)||this.isSubtype(s,t);case G:return this.isSubtype(i,t);default:return!1}}getReferenceType(e){const t=`${e.container.$type}:${e.property}`;switch(t){case"Action:type":case"CrossReference:type":case"Interface:superTypes":case"ParserRule:returnType":case"SimpleType:typeRef":return s;case"Grammar:hiddenTokens":case"ParserRule:hiddenTokens":case"RuleCall:rule":return i;case"Grammar:usedGrammars":return A;case"NamedArgument:parameter":case"ParameterReference:parameter":return w;case"TerminalRuleCall:rule":return G;default:throw new Error(`${t} is not a valid reference id.`)}}getTypeMetaData(e){switch(e){case l:return{name:l,properties:[{name:"cardinality"},{name:"lookahead"}]};case d:return{name:d,properties:[{name:"elements",defaultValue:[]}]};case h:return{name:h,properties:[{name:"elementType"}]};case f:return{name:f,properties:[{name:"true",defaultValue:!1}]};case m:return{name:m,properties:[{name:"left"},{name:"right"}]};case y:return{name:y,properties:[{name:"left"},{name:"right"}]};case A:return{name:A,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 T:return{name:T,properties:[{name:"path"}]};case R:return{name:R,properties:[{name:"name"}]};case k:return{name:k,properties:[{name:"attributes",defaultValue:[]},{name:"name"},{name:"superTypes",defaultValue:[]}]};case x:return{name:x,properties:[{name:"calledByName",defaultValue:!1},{name:"parameter"},{name:"value"}]};case I:return{name:I,properties:[{name:"value"}]};case N:return{name:N,properties:[{name:"value"}]};case w:return{name:w,properties:[{name:"name"}]};case C:return{name:C,properties:[{name:"parameter"}]};case b:return{name:b,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 _:return{name:_,properties:[{name:"referenceType"}]};case P:return{name:P,properties:[{name:"name"}]};case D:return{name:D,properties:[{name:"primitiveType"},{name:"stringType"},{name:"typeRef"}]};case F:return{name:F,properties:[{name:"value"}]};case G:return{name:G,properties:[{name:"definition"},{name:"fragment",defaultValue:!1},{name:"hidden",defaultValue:!1},{name:"name"},{name:"type"}]};case B:return{name:B,properties:[{name:"name"},{name:"type"}]};case V:return{name:V,properties:[{name:"defaultValue"},{name:"isOptional",defaultValue:!1},{name:"name"},{name:"type"}]};case H:return{name:H,properties:[{name:"types",defaultValue:[]}]};case W:return{name:W,properties:[{name:"cardinality"},{name:"feature"},{name:"inferredType"},{name:"lookahead"},{name:"operator"},{name:"type"}]};case Y:return{name:Y,properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"lookahead"}]};case q:return{name:q,properties:[{name:"cardinality"},{name:"feature"},{name:"lookahead"},{name:"operator"},{name:"terminal"}]};case Z:return{name:Z,properties:[{name:"cardinality"},{name:"left"},{name:"lookahead"},{name:"right"}]};case ee:return{name:ee,properties:[{name:"cardinality"},{name:"deprecatedSyntax",defaultValue:!1},{name:"lookahead"},{name:"terminal"},{name:"type"}]};case ne:return{name:ne,properties:[{name:"cardinality"},{name:"lookahead"}]};case ie:return{name:ie,properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"guardCondition"},{name:"lookahead"}]};case ae:return{name:ae,properties:[{name:"cardinality"},{name:"lookahead"},{name:"value"}]};case ce:return{name:ce,properties:[{name:"cardinality"},{name:"lookahead"},{name:"terminal"}]};case ue:return{name:ue,properties:[{name:"cardinality"},{name:"lookahead"},{name:"regex"}]};case he:return{name:he,properties:[{name:"arguments",defaultValue:[]},{name:"cardinality"},{name:"lookahead"},{name:"rule"}]};case pe:return{name:pe,properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"lookahead"}]};case ge:return{name:ge,properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"lookahead"}]};case ve:return{name:ve,properties:[{name:"cardinality"},{name:"lookahead"},{name:"rule"}]};case Te:return{name:Te,properties:[{name:"cardinality"},{name:"elements",defaultValue:[]},{name:"lookahead"}]};case Ee:return{name:Ee,properties:[{name:"cardinality"},{name:"lookahead"},{name:"terminal"}]};case $e:return{name:$e,properties:[{name:"cardinality"},{name:"lookahead"}]};default:return{name:e,properties:[]}}}}const Se=new Ie},1261:(e,t,n)=>{n.d(t,{Bd:()=>f,P3:()=>x,PV:()=>k,Rp:()=>v,S:()=>I,SS:()=>g,U5:()=>A,Uz:()=>$,Xq:()=>R,YV:()=>l,eb:()=>h,g4:()=>d,qO:()=>p});var r=n(6617),i=n(1128),s=n(5460),a=n(7156),o=n(3121),c=n(2919);function l(e,t){const n=new Set,r=function(e){return e.rules.find((e=>i.s7(e)&&e.entry))}(e);if(!r)return new Set(e.rules);const s=[r].concat(function(e){return e.rules.filter((e=>i.rE(e)&&e.hidden))}(e));for(const i of s)u(i,n,t);const a=new Set;for(const o of e.rules)(n.has(o.name)||i.rE(o)&&o.hidden)&&a.add(o);return a}function u(e,t,n){t.add(e.name),(0,a.Uo)(e).forEach((e=>{if(i.$g(e)||n&&i.lF(e)){const r=e.rule.ref;r&&!t.has(r.name)&&u(r,t,n)}}))}function d(e){if(e.terminal)return e.terminal;if(e.type.ref){const t=A(e.type.ref);return null===t||void 0===t?void 0:t.terminal}}function h(e){return e.hidden&&!(0,c.Yv)(I(e))}function f(e,t){return e&&t?m(e,t,e.astNode,!0):[]}function p(e,t,n){if(!e||!t)return;const r=m(e,t,e.astNode,!0);return 0!==r.length?r[n=void 0!==n?Math.max(0,Math.min(n,r.length-1)):0]:void 0}function m(e,t,n,r){if(!r){const n=(0,a.XG)(e.grammarSource,i.wh);if(n&&n.feature===t)return[e]}return(0,s.mD)(e)&&e.astNode===n?e.content.flatMap((e=>m(e,t,n,!1))):[]}function g(e,t,n){if(!e)return;const r=y(e,t,null===e||void 0===e?void 0:e.astNode);return 0!==r.length?r[n=void 0!==n?Math.max(0,Math.min(n,r.length-1)):0]:void 0}function y(e,t,n){if(e.astNode!==n)return[];if(i.wb(e.grammarSource)&&e.grammarSource.value===t)return[e];const r=(0,o.NS)(e).iterator();let s;const a=[];do{if(s=r.next(),!s.done){const e=s.value;e.astNode===n?i.wb(e.grammarSource)&&e.grammarSource.value===t&&a.push(e):r.prune()}}while(!s.done);return a}function v(e){var t;const n=e.astNode;for(;n===(null===(t=e.container)||void 0===t?void 0:t.astNode);){const t=(0,a.XG)(e.grammarSource,i.wh);if(t)return t;e=e.container}}function A(e){let t=e;return i.SP(t)&&(i.ve(t.$container)?t=t.$container.$container:i.s7(t.$container)?t=t.$container:(0,r.d)(t.$container)),T(e,t,new Map)}function T(e,t,n){var r;function s(t,r){let s;return(0,a.XG)(t,i.wh)||(s=T(r,r,n)),n.set(e,s),s}if(n.has(e))return n.get(e);n.set(e,void 0);for(const o of(0,a.Uo)(t)){if(i.wh(o)&&"name"===o.feature.toLowerCase())return n.set(e,o),o;if(i.$g(o)&&i.s7(o.rule.ref))return s(o,o.rule.ref);if(i.D8(o)&&(null===(r=o.typeRef)||void 0===r?void 0:r.ref))return s(o,o.typeRef.ref)}}function R(e){return E(e,new Set)}function E(e,t){if(t.has(e))return!0;t.add(e);for(const n of(0,a.Uo)(e))if(i.$g(n)){if(!n.rule.ref)return!1;if(i.s7(n.rule.ref)&&!E(n.rule.ref,t))return!1}else{if(i.wh(n))return!1;if(i.ve(n))return!1}return Boolean(e.definition)}function k(e){if(e.inferredType)return e.inferredType.name;if(e.dataType)return e.dataType;if(e.returnType){const t=e.returnType.ref;if(t){if(i.s7(t))return t.name;if(i.S2(t)||i.Xj(t))return t.name}}}function $(e){var t;if(i.s7(e))return R(e)?e.name:null!==(t=k(e))&&void 0!==t?t:e.name;if(i.S2(e)||i.Xj(e)||i.fG(e))return e.name;if(i.ve(e)){const t=function(e){var t;if(e.inferredType)return e.inferredType.name;if(null===(t=e.type)||void 0===t?void 0:t.ref)return $(e.type.ref);return}(e);if(t)return t}else if(i.SP(e))return e.name;throw new Error("Cannot get name of Unknown Type")}function x(e){var t,n,r;return i.rE(e)?null!==(n=null===(t=e.type)||void 0===t?void 0:t.name)&&void 0!==n?n:"string":null!==(r=k(e))&&void 0!==r?r:e.name}function I(e){const t={s:!1,i:!1,u:!1},n=N(e.definition,t),r=Object.entries(t).filter((e=>{let[,t]=e;return t})).map((e=>{let[t]=e;return t})).join("");return new RegExp(n,r)}const S=/[\s\S]/.source;function N(e,t){if(i.Fy(e))return C((a=e).elements.map((e=>N(e))).join("|"),{cardinality:a.cardinality,lookahead:a.lookahead});if(i.O4(e))return C((s=e).elements.map((e=>N(e))).join(""),{cardinality:s.cardinality,lookahead:s.lookahead});if(i.Bg(e))return function(e){if(e.right)return C(`[${w(e.left)}-${w(e.right)}]`,{cardinality:e.cardinality,lookahead:e.lookahead,wrap:!1});return C(w(e.left),{cardinality:e.cardinality,lookahead:e.lookahead,wrap:!1})}(e);if(i.lF(e)){const t=e.rule.ref;if(!t)throw new Error("Missing rule reference.");return C(N(t.definition),{cardinality:e.cardinality,lookahead:e.lookahead})}if(i.GL(e))return C(`(?!${N((r=e).terminal)})${S}*?`,{cardinality:r.cardinality,lookahead:r.lookahead});if(i.Mz(e))return C(`${S}*?${N((n=e).terminal)}`,{cardinality:n.cardinality,lookahead:n.lookahead});if(i.vd(e)){const n=e.regex.lastIndexOf("/"),r=e.regex.substring(1,n),i=e.regex.substring(n+1);return t&&(t.i=i.includes("i"),t.s=i.includes("s"),t.u=i.includes("u")),C(r,{cardinality:e.cardinality,lookahead:e.lookahead,wrap:!1})}if(i.z2(e))return C(S,{cardinality:e.cardinality,lookahead:e.lookahead});throw new Error(`Invalid terminal element: ${null===e||void 0===e?void 0:e.$type}`);var n,r,s,a}function w(e){return(0,c.Nt)(e.value)}function C(e,t){var n;return(!1!==t.wrap||t.lookahead)&&(e=`(${null!==(n=t.lookahead)&&void 0!==n?n:""}${e})`),t.cardinality?`${e}${t.cardinality}`:e}},1438:(e,t,n)=>{n.d(t,{S:()=>u});var r=n(1584),i=n(4016),s=n(5813),a=n(1808),o=class extends r.mR{static#e=(()=>(0,r.K2)(this,"ArchitectureTokenBuilder"))();constructor(){super(["architecture"])}},c=class extends r.dg{static#e=(()=>(0,r.K2)(this,"ArchitectureValueConverter"))();runCustomConverter(e,t,n){return"ARCH_ICON"===e.name?t.replace(/[()]/g,"").trim():"ARCH_TEXT_ICON"===e.name?t.replace(/["()]/g,""):"ARCH_TITLE"===e.name?t.replace(/[[\]]/g,"").trim():void 0}},l={parser:{TokenBuilder:(0,r.K2)((()=>new o),"TokenBuilder"),ValueConverter:(0,r.K2)((()=>new c),"ValueConverter")}};function u(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:i.D;const t=(0,s.WQ)((0,a.u)(e),r.sr),n=(0,s.WQ)((0,a.t)({shared:t}),r.jE,l);return t.ServiceRegistry.register(n),{shared:t,Architecture:n}}(0,r.K2)(u,"createArchitectureServices")},1584:(e,t,n)=>{n.d(t,{mR:()=>ge,dg:()=>pe,jE:()=>ue,Tm:()=>me,eZ:()=>de,e5:()=>oe,sr:()=>ae,AM:()=>ce,KX:()=>le,YP:()=>he,K2:()=>m});var r=n(5460),i=n(1808),s=n(5813),a=n(1128),o=n(4016),c=n(6843);const l={Grammar:()=>{},LanguageMetaData:()=>({caseInsensitive:!1,fileExtensions:[".langium"],languageId:"langium"})},u={AstReflection:()=>new a.QX};function d(e){var t;const n=function(){const e=(0,s.WQ)((0,i.u)(o.D),u),t=(0,s.WQ)((0,i.t)({shared:e}),l);return e.ServiceRegistry.register(t),t}(),r=n.serializer.JsonSerializer.deserialize(e);return n.shared.workspace.LangiumDocumentFactory.fromModel(r,c.r.parse(`memory://${null!==(t=r.name)&&void 0!==t?t:"grammar"}.langium`)),r}var h=n(4644),f=n(9471),p=Object.defineProperty,m=(e,t)=>p(e,"name",{value:t,configurable:!0}),g="Statement",y="Architecture";m((function(e){return z.isInstance(e,y)}),"isArchitecture");var v="Axis",A="Branch";m((function(e){return z.isInstance(e,A)}),"isBranch");var T="Checkout",R="CherryPicking",E="Commit";m((function(e){return z.isInstance(e,E)}),"isCommit");var k="Common";m((function(e){return z.isInstance(e,k)}),"isCommon");var $="Curve",x="Edge",I="Entry",S="GitGraph";m((function(e){return z.isInstance(e,S)}),"isGitGraph");var N="Group",w="Info";m((function(e){return z.isInstance(e,w)}),"isInfo");var C="Junction",L="Merge";m((function(e){return z.isInstance(e,L)}),"isMerge");var b="Option",O="Packet";m((function(e){return z.isInstance(e,O)}),"isPacket");var _="PacketBlock";m((function(e){return z.isInstance(e,_)}),"isPacketBlock");var P="Pie";m((function(e){return z.isInstance(e,P)}),"isPie");var M="PieSection";m((function(e){return z.isInstance(e,M)}),"isPieSection");var D,U,F,G,K,B,j="Radar",V="Service",H="Direction",W=class extends r.kD{static#e=(()=>m(this,"MermaidAstReflection"))();getAllTypes(){return[y,v,A,T,R,E,k,$,H,x,I,S,N,w,C,L,b,O,_,P,M,j,V,g]}computeIsSubtype(e,t){switch(e){case A:case T:case R:case E:case L:return this.isSubtype(g,t);case H:return this.isSubtype(S,t);default:return!1}}getReferenceType(e){const t=`${e.container.$type}:${e.property}`;if("Entry:axis"===t)return v;throw new Error(`${t} is not a valid reference id.`)}getTypeMetaData(e){switch(e){case y:return{name:y,properties:[{name:"accDescr"},{name:"accTitle"},{name:"edges",defaultValue:[]},{name:"groups",defaultValue:[]},{name:"junctions",defaultValue:[]},{name:"services",defaultValue:[]},{name:"title"}]};case v:return{name:v,properties:[{name:"label"},{name:"name"}]};case A:return{name:A,properties:[{name:"name"},{name:"order"}]};case T:return{name:T,properties:[{name:"branch"}]};case R:return{name:R,properties:[{name:"id"},{name:"parent"},{name:"tags",defaultValue:[]}]};case E:return{name:E,properties:[{name:"id"},{name:"message"},{name:"tags",defaultValue:[]},{name:"type"}]};case k:return{name:k,properties:[{name:"accDescr"},{name:"accTitle"},{name:"title"}]};case $:return{name:$,properties:[{name:"entries",defaultValue:[]},{name:"label"},{name:"name"}]};case x:return{name:x,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 I:return{name:I,properties:[{name:"axis"},{name:"value"}]};case S:return{name:S,properties:[{name:"accDescr"},{name:"accTitle"},{name:"statements",defaultValue:[]},{name:"title"}]};case N:return{name:N,properties:[{name:"icon"},{name:"id"},{name:"in"},{name:"title"}]};case w:return{name:w,properties:[{name:"accDescr"},{name:"accTitle"},{name:"title"}]};case C:return{name:C,properties:[{name:"id"},{name:"in"}]};case L:return{name:L,properties:[{name:"branch"},{name:"id"},{name:"tags",defaultValue:[]},{name:"type"}]};case b:return{name:b,properties:[{name:"name"},{name:"value",defaultValue:!1}]};case O:return{name:O,properties:[{name:"accDescr"},{name:"accTitle"},{name:"blocks",defaultValue:[]},{name:"title"}]};case _:return{name:_,properties:[{name:"end"},{name:"label"},{name:"start"}]};case P:return{name:P,properties:[{name:"accDescr"},{name:"accTitle"},{name:"sections",defaultValue:[]},{name:"showData",defaultValue:!1},{name:"title"}]};case M:return{name:M,properties:[{name:"label"},{name:"value"}]};case j:return{name:j,properties:[{name:"accDescr"},{name:"accTitle"},{name:"axes",defaultValue:[]},{name:"curves",defaultValue:[]},{name:"options",defaultValue:[]},{name:"title"}]};case V:return{name:V,properties:[{name:"icon"},{name:"iconText"},{name:"id"},{name:"in"},{name:"title"}]};case H:return{name:H,properties:[{name:"accDescr"},{name:"accTitle"},{name:"dir"},{name:"statements",defaultValue:[]},{name:"title"}]};default:return{name:e,properties:[]}}}},z=new W,Y=m((()=>D??(D=d('{"$type":"Grammar","isDeclared":true,"name":"Info","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Info","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[],"cardinality":"*"},{"$type":"Keyword","value":"info"},{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[],"cardinality":"*"},{"$type":"Group","elements":[{"$type":"Keyword","value":"showInfo"},{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[],"cardinality":"*"}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[],"cardinality":"?"}]},"definesHiddenTokens":false,"fragment":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@2"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"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","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":[{"$type":"Interface","name":"Common","attributes":[{"$type":"TypeAttribute","name":"accDescr","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"accTitle","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}],"superTypes":[]}],"types":[],"usedGrammars":[]}'))),"InfoGrammar"),X=m((()=>U??(U=d('{"$type":"Grammar","isDeclared":true,"name":"Packet","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Packet","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[],"cardinality":"*"},{"$type":"Keyword","value":"packet-beta"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]},{"$type":"Assignment","feature":"blocks","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]},"cardinality":"*"}]},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[],"cardinality":"+"},{"$type":"Assignment","feature":"blocks","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]},"cardinality":"+"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[],"cardinality":"*"}]}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"PacketBlock","definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"start","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"-"},{"$type":"Assignment","feature":"end","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}}],"cardinality":"?"},{"$type":"Keyword","value":":"},{"$type":"Assignment","feature":"label","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":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":"STRING","definition":{"$type":"RegexToken","regex":"/\\"[^\\"]*\\"|\'[^\']*\'/"},"fragment":false,"hidden":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@7"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"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","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":[{"$type":"Interface","name":"Common","attributes":[{"$type":"TypeAttribute","name":"accDescr","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"accTitle","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}],"superTypes":[]}],"types":[],"usedGrammars":[]}'))),"PacketGrammar"),q=m((()=>F??(F=d('{"$type":"Grammar","isDeclared":true,"name":"Pie","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Pie","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[],"cardinality":"*"},{"$type":"Keyword","value":"pie"},{"$type":"Assignment","feature":"showData","operator":"?=","terminal":{"$type":"Keyword","value":"showData"},"cardinality":"?"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]},{"$type":"Assignment","feature":"sections","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]},"cardinality":"*"}]},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[],"cardinality":"+"},{"$type":"Assignment","feature":"sections","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]},"cardinality":"+"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"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@2"},"arguments":[]}},{"$type":"Keyword","value":":"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"PIE_SECTION_LABEL","definition":{"$type":"RegexToken","regex":"/\\"[^\\"]+\\"/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"PIE_SECTION_VALUE","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/(0|[1-9][0-9]*)(\\\\.[0-9]+)?/"},"fragment":false,"hidden":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@7"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@8"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@9"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@6"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"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","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":[{"$type":"Interface","name":"Common","attributes":[{"$type":"TypeAttribute","name":"accDescr","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"accTitle","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}],"superTypes":[]}],"types":[],"usedGrammars":[]}'))),"PieGrammar"),Q=m((()=>G??(G=d('{"$type":"Grammar","isDeclared":true,"name":"Architecture","imports":[],"rules":[{"$type":"ParserRule","entry":true,"name":"Architecture","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[],"cardinality":"*"},{"$type":"Keyword","value":"architecture-beta"},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]}]},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[],"cardinality":"*"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"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@15"},"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@13"},"arguments":[]}},{"$type":"Keyword","value":"-"}]}]},{"$type":"Assignment","feature":"rhsInto","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"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@10"},"arguments":[]}},{"$type":"Assignment","feature":"icon","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]},"cardinality":"?"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]},"cardinality":"?"},{"$type":"Group","elements":[{"$type":"Keyword","value":"in"},{"$type":"Assignment","feature":"in","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"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@10"},"arguments":[]}},{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"iconText","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}},{"$type":"Assignment","feature":"icon","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}}],"cardinality":"?"},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]},"cardinality":"?"},{"$type":"Group","elements":[{"$type":"Keyword","value":"in"},{"$type":"Assignment","feature":"in","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"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@10"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"in"},{"$type":"Assignment","feature":"in","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"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@10"},"arguments":[]}},{"$type":"Assignment","feature":"lhsGroup","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]},{"$type":"Assignment","feature":"rhsId","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@10"},"arguments":[]}},{"$type":"Assignment","feature":"rhsGroup","operator":"?=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"arguments":[]},"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"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":"ARCH_ID","definition":{"$type":"RegexToken","regex":"/[\\\\w]+/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"ARCH_TEXT_ICON","definition":{"$type":"RegexToken","regex":"/\\\\(\\"[^\\"]+\\"\\\\)/"},"fragment":false,"hidden":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},{"$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":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@19"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"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","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":[{"$type":"Interface","name":"Common","attributes":[{"$type":"TypeAttribute","name":"accDescr","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"accTitle","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}],"superTypes":[]}],"types":[],"usedGrammars":[]}'))),"ArchitectureGrammar"),Z=m((()=>K??(K=d('{"$type":"Grammar","isDeclared":true,"name":"GitGraph","interfaces":[{"$type":"Interface","name":"Common","attributes":[{"$type":"TypeAttribute","name":"accDescr","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"accTitle","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}],"superTypes":[]}],"rules":[{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"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","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":"ParserRule","entry":true,"name":"GitGraph","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"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@12"},"arguments":[]},{"$type":"Keyword","value":":"}]}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[],"cardinality":"*"},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[],"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@0"},"arguments":[]},{"$type":"Assignment","feature":"statements","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[]}],"cardinality":"*"}]}]},"definesHiddenTokens":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"Statement","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"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@20"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"msg:","cardinality":"?"},{"$type":"Assignment","feature":"message","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"tag:"},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"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@1"},"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@19"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}]}},{"$type":"Group","elements":[{"$type":"Keyword","value":"order:"},{"$type":"Assignment","feature":"order","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]}}],"cardinality":"?"},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"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@19"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}]}},{"$type":"Alternatives","elements":[{"$type":"Group","elements":[{"$type":"Keyword","value":"id:"},{"$type":"Assignment","feature":"id","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"tag:"},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"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@1"},"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@19"},"arguments":[]},{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"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@20"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"tag:"},{"$type":"Assignment","feature":"tags","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"parent:"},{"$type":"Assignment","feature":"parent","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@20"},"arguments":[]}}]}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"INT","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/[0-9]+(?=\\\\s)/"},"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":"STRING","definition":{"$type":"RegexToken","regex":"/\\"[^\\"]*\\"|\'[^\']*\'/"},"fragment":false,"hidden":false}],"definesHiddenTokens":false,"hiddenTokens":[],"imports":[],"types":[],"usedGrammars":[]}'))),"GitGraphGrammar"),J=m((()=>B??(B=d('{"$type":"Grammar","isDeclared":true,"name":"Radar","interfaces":[{"$type":"Interface","name":"Common","attributes":[{"$type":"TypeAttribute","name":"accDescr","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"accTitle","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}},{"$type":"TypeAttribute","name":"title","isOptional":true,"type":{"$type":"SimpleType","primitiveType":"string"}}],"superTypes":[]},{"$type":"Interface","name":"Entry","attributes":[{"$type":"TypeAttribute","name":"axis","isOptional":true,"type":{"$type":"ReferenceType","referenceType":{"$type":"SimpleType","typeRef":{"$ref":"#/rules@12"}}}},{"$type":"TypeAttribute","name":"value","type":{"$type":"SimpleType","primitiveType":"number"},"isOptional":false}],"superTypes":[]}],"rules":[{"$type":"ParserRule","fragment":true,"name":"TitleAndAccessibilities","definition":{"$type":"Group","elements":[{"$type":"Alternatives","elements":[{"$type":"Assignment","feature":"accDescr","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@3"},"arguments":[]}},{"$type":"Assignment","feature":"accTitle","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@4"},"arguments":[]}},{"$type":"Assignment","feature":"title","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@5"},"arguments":[]}}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@1"},"arguments":[]}],"cardinality":"+"},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","fragment":true,"name":"EOL","dataType":"string","definition":{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[],"cardinality":"+"},{"$type":"EndOfFile"}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"NEWLINE","definition":{"$type":"RegexToken","regex":"/\\\\r?\\\\n/"},"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","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":"ParserRule","entry":true,"name":"Radar","definition":{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"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@2"},"arguments":[],"cardinality":"*"},{"$type":"Alternatives","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@0"},"arguments":[]},{"$type":"Group","elements":[{"$type":"Keyword","value":"axis"},{"$type":"Assignment","feature":"axes","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"axes","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@12"},"arguments":[]}}],"cardinality":"*"}]},{"$type":"Group","elements":[{"$type":"Keyword","value":"curve"},{"$type":"Assignment","feature":"curves","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"curves","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@13"},"arguments":[]}}],"cardinality":"*"}]},{"$type":"Group","elements":[{"$type":"Assignment","feature":"options","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"Assignment","feature":"options","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@17"},"arguments":[]}}],"cardinality":"*"}]},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"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@22"},"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@21"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"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@21"},"arguments":[]}},{"$type":"RuleCall","rule":{"$ref":"#/rules@11"},"arguments":[],"cardinality":"?"},{"$type":"Keyword","value":"{"},{"$type":"RuleCall","rule":{"$ref":"#/rules@14"},"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@2"},"arguments":[],"cardinality":"*"},{"$type":"Assignment","feature":"entries","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[],"cardinality":"*"},{"$type":"Assignment","feature":"entries","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@16"},"arguments":[]}}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[],"cardinality":"*"}]},{"$type":"Group","elements":[{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[],"cardinality":"*"},{"$type":"Assignment","feature":"entries","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]}},{"$type":"Group","elements":[{"$type":"Keyword","value":","},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[],"cardinality":"*"},{"$type":"Assignment","feature":"entries","operator":"+=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@15"},"arguments":[]}}],"cardinality":"*"},{"$type":"RuleCall","rule":{"$ref":"#/rules@2"},"arguments":[],"cardinality":"*"}]}]},"definesHiddenTokens":false,"entry":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"DetailedEntry","returnType":{"$ref":"#/interfaces@1"},"definition":{"$type":"Group","elements":[{"$type":"Assignment","feature":"axis","operator":"=","terminal":{"$type":"CrossReference","type":{"$ref":"#/rules@12"},"terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@21"},"arguments":[]},"deprecatedSyntax":false}},{"$type":"Keyword","value":":","cardinality":"?"},{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"arguments":[]}}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"ParserRule","name":"NumberEntry","returnType":{"$ref":"#/interfaces@1"},"definition":{"$type":"Assignment","feature":"value","operator":"=","terminal":{"$type":"RuleCall","rule":{"$ref":"#/rules@18"},"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@19"},"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@18"},"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@18"},"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@18"},"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@20"},"arguments":[]}}]}]},"definesHiddenTokens":false,"entry":false,"fragment":false,"hiddenTokens":[],"parameters":[],"wildcard":false},{"$type":"TerminalRule","name":"NUMBER","type":{"$type":"ReturnType","name":"number"},"definition":{"$type":"RegexToken","regex":"/(0|[1-9][0-9]*)(\\\\.[0-9]+)?/"},"fragment":false,"hidden":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":"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":"TerminalRule","name":"ID","type":{"$type":"ReturnType","name":"string"},"definition":{"$type":"RegexToken","regex":"/[a-zA-Z_][a-zA-Z0-9\\\\-_]*/"},"fragment":false,"hidden":false},{"$type":"TerminalRule","name":"STRING","definition":{"$type":"RegexToken","regex":"/\\"[^\\"]*\\"|\'[^\']*\'/"},"fragment":false,"hidden":false}],"definesHiddenTokens":false,"hiddenTokens":[],"imports":[],"types":[],"usedGrammars":[]}'))),"RadarGrammar"),ee={languageId:"info",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},te={languageId:"packet",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},ne={languageId:"pie",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},re={languageId:"architecture",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},ie={languageId:"gitGraph",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},se={languageId:"radar",fileExtensions:[".mmd",".mermaid"],caseInsensitive:!1,mode:"production"},ae={AstReflection:m((()=>new W),"AstReflection")},oe={Grammar:m((()=>Y()),"Grammar"),LanguageMetaData:m((()=>ee),"LanguageMetaData"),parser:{}},ce={Grammar:m((()=>X()),"Grammar"),LanguageMetaData:m((()=>te),"LanguageMetaData"),parser:{}},le={Grammar:m((()=>q()),"Grammar"),LanguageMetaData:m((()=>ne),"LanguageMetaData"),parser:{}},ue={Grammar:m((()=>Q()),"Grammar"),LanguageMetaData:m((()=>re),"LanguageMetaData"),parser:{}},de={Grammar:m((()=>Z()),"Grammar"),LanguageMetaData:m((()=>ie),"LanguageMetaData"),parser:{}},he={Grammar:m((()=>J()),"Grammar"),LanguageMetaData:m((()=>se),"LanguageMetaData"),parser:{}},fe={ACC_DESCR:/accDescr(?:[\t ]*:([^\n\r]*)|\s*{([^}]*)})/,ACC_TITLE:/accTitle[\t ]*:([^\n\r]*)/,TITLE:/title([\t ][^\n\r]*|)/},pe=class extends h.d{static#e=(()=>m(this,"AbstractMermaidValueConverter"))();runConverter(e,t,n){let r=this.runCommonConverter(e,t,n);return void 0===r&&(r=this.runCustomConverter(e,t,n)),void 0===r?super.runConverter(e,t,n):r}runCommonConverter(e,t,n){const r=fe[e.name];if(void 0===r)return;const i=r.exec(t);return null!==i?void 0!==i[1]?i[1].trim().replace(/[\t ]{2,}/gm," "):void 0!==i[2]?i[2].replace(/^\s*/gm,"").replace(/\s+$/gm,"").replace(/[\t ]{2,}/gm," ").replace(/[\n\r]{2,}/gm,"\n"):void 0:void 0}},me=class extends pe{static#e=(()=>m(this,"CommonValueConverter"))();runCustomConverter(e,t,n){}},ge=class extends f.Q{static#e=(()=>m(this,"AbstractMermaidTokenBuilder"))();constructor(e){super(),this.keywords=new Set(e)}buildKeywordTokens(e,t,n){const r=super.buildKeywordTokens(e,t,n);return r.forEach((e=>{this.keywords.has(e.name)&&void 0!==e.PATTERN&&(e.PATTERN=new RegExp(e.PATTERN.toString()+"(?:(?=%%)|(?!\\S))"))})),r}};(class extends ge{static#e=(()=>m(this,"CommonTokenBuilder"))()})},1769:(e,t)=>{let n;function r(){if(void 0===n)throw new Error("No runtime abstraction layer installed");return n}Object.defineProperty(t,"__esModule",{value:!0}),function(e){e.install=function(e){if(void 0===e)throw new Error("No runtime abstraction layer provided");n=e}}(r||(r={})),t.default=r},1808:(e,t,n)=>{n.d(t,{t:()=>Dr,u:()=>Ur});var r=n(3121),i=n(1261),s=n(2919),a=n(1128);var o=n(6770),c=n(8293),l=n(2825);function u(e,t,n){return`${e.name}_${t}_${n}`}class d{constructor(e){this.target=e}isEpsilon(){return!1}}class h extends d{constructor(e,t){super(e),this.tokenType=t}}class f extends d{constructor(e){super(e)}isEpsilon(){return!0}}class p extends d{constructor(e,t,n){super(e),this.rule=t,this.followState=n}isEpsilon(){return!0}}function m(e){const t={decisionMap:{},decisionStates:[],ruleToStartState:new Map,ruleToStopState:new Map,states:[]};!function(e,t){const n=t.length;for(let r=0;rg(e,t,n))),s=R(e,t,r,n,...i);return s}(e,t,n):n instanceof o.c$?function(e,t,n){const r=x(e,t,n,{type:1});T(e,r);const i=R(e,t,r,n,y(e,t,n));return function(e,t,n,r){const i=r.left,s=r.right;return $(i,s),e.decisionMap[u(t,"Option",n.idx)]=i,r}(e,t,n,i)}(e,t,n):n instanceof o.Y2?function(e,t,n){const r=x(e,t,n,{type:5});T(e,r);const i=R(e,t,r,n,y(e,t,n));return A(e,t,n,i)}(e,t,n):n instanceof o.Pp?function(e,t,n){const r=x(e,t,n,{type:5});T(e,r);const i=R(e,t,r,n,y(e,t,n)),s=E(e,t,n.separator,n);return A(e,t,n,i,s)}(e,t,n):n instanceof o.$P?function(e,t,n){const r=x(e,t,n,{type:4});T(e,r);const i=R(e,t,r,n,y(e,t,n));return v(e,t,n,i)}(e,t,n):n instanceof o.Cy?function(e,t,n){const r=x(e,t,n,{type:4});T(e,r);const i=R(e,t,r,n,y(e,t,n)),s=E(e,t,n.separator,n);return v(e,t,n,i,s)}(e,t,n):y(e,t,n)}function y(e,t,n){const r=(0,l.A)((0,c.A)(n.definition,(n=>g(e,t,n))),(e=>void 0!==e));return 1===r.length?r[0]:0===r.length?void 0:function(e,t){const n=t.length;for(let s=0;s4?s-4:0),c=4;ce.alt))}get key(){let e="";for(const t in this.map)e+=t+":";return e}}function C(e){return`${!(arguments.length>1&&void 0!==arguments[1])||arguments[1]?`a${e.alt}`:""}s${e.state.stateNumber}:${e.stack.map((e=>e.stateNumber.toString())).join("_")}`}var L=n(9031),b=n(2080),O=n(378),_=n(1837);const P=function(e,t){return e&&e.length?(0,_.A)(e,(0,O.A)(t,2)):[]};var M=n(6165),D=n(1109),U=n(7590),F=n(3175);function G(e,t){const n={};return r=>{const i=r.toString();let s=n[i];return void 0!==s||(s={atnStartState:e,decision:t,states:{}},n[i]=s),s}}class K{constructor(){this.predicates=[]}is(e){return e>=this.predicates.length||this.predicates[e]}set(e,t){this.predicates[e]=t}toString(){let e="";const t=this.predicates.length;for(let n=0;nconsole.log(e)}initialize(e){this.atn=m(e.rules),this.dfas=function(e){const t=e.decisionStates.length,n=Array(t);for(let r=0;r(0,c.A)(e,(e=>e[0]))));if(V(h,!1)&&!i){const e=(0,F.A)(h,((e,t,n)=>((0,D.A)(t,(t=>{t&&(e[t.tokenTypeIdx]=n,(0,D.A)(t.categoryMatches,(t=>{e[t]=n})))})),e)),{});return r?function(t){var n;const r=this.LA(1),i=e[r.tokenTypeIdx];if(void 0!==t&&void 0!==i){const e=null===(n=t[i])||void 0===n?void 0:n.GATE;if(void 0!==e&&!1===e.call(this))return}return i}:function(){const t=this.LA(1);return e[t.tokenTypeIdx]}}return r?function(e){const t=new K,n=void 0===e?0:e.length;for(let i=0;i(0,c.A)(e,(e=>e[0]))));if(V(h)&&h[0][0]&&!i){const e=h[0],t=(0,M.A)(e);if(1===t.length&&(0,U.A)(t[0].categoryMatches)){const e=t[0].tokenTypeIdx;return function(){return this.LA(1).tokenTypeIdx===e}}{const e=(0,F.A)(t,((e,t)=>(void 0!==t&&(e[t.tokenTypeIdx]=!0,(0,D.A)(t.categoryMatches,(t=>{e[t]=!0}))),e)),{});return function(){const t=this.LA(1);return!0===e[t.tokenTypeIdx]}}}return function(){const e=H.call(this,s,d,B,a);return"object"!==typeof e&&0===e}}}function V(e){let t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];const n=new Set;for(const r of e){const e=new Set;for(const i of r){if(void 0===i){if(t)break;return!1}const r=[i.tokenTypeIdx].concat(i.categoryMatches);for(const t of r)if(n.has(t)){if(!e.has(t))return!1}else n.add(t),e.add(t)}}return!0}function H(e,t,n,r){const i=e[t](n);let s=i.start;if(void 0===s){s=J(i,Q(ee(i.atnStartState))),i.start=s}return W.apply(this,[i,s,n,r])}function W(e,t,n,r){let i=t,s=1;const a=[];let o=this.LA(s++);for(;;){let t=(c=o,i.edges[c.tokenTypeIdx]);if(void 0===t&&(t=z.apply(this,[e,i,o,s,n,r])),t===N)return X(a,i,o);if(!0===t.isAcceptState)return t.prediction;i=t,a.push(o),o=this.LA(s++)}var c}function z(e,t,n,r,i,s){const a=function(e,t,n){const r=new w,i=[];for(const a of e.elements){if(!1===n.is(a.alt))continue;if(7===a.state.type){i.push(a);continue}const e=a.state.transitions.length;for(let n=0;n0&&!function(e){for(const t of e.elements)if(7===t.state.type)return!0;return!1}(s))for(const a of i)s.add(a);return s}(t.configs,n,i);if(0===a.size)return Z(e,t,n,N),N;let o=Q(a);const c=function(e,t){let n;for(const r of e.elements)if(!0===t.is(r.alt))if(void 0===n)n=r.alt;else if(n!==r.alt)return;return n}(a,i);if(void 0!==c)o.isAcceptState=!0,o.prediction=c,o.configs.uniqueAlt=c;else if(function(e){if(function(e){for(const t of e.elements)if(7!==t.state.type)return!1;return!0}(e))return!0;const t=function(e){const t=new Map;for(const n of e){const e=C(n,!1);let r=t.get(e);void 0===r&&(r={},t.set(e,r)),r[n.alt]=!0}return t}(e.elements);return function(e){for(const t of Array.from(e.values()))if(Object.keys(t).length>1)return!0;return!1}(t)&&!function(e){for(const t of Array.from(e.values()))if(1===Object.keys(t).length)return!0;return!1}(t)}(a)){const t=(0,L.A)(a.alts);o.isAcceptState=!0,o.prediction=t,o.configs.uniqueAlt=t,Y.apply(this,[e,r,a.alts,s])}return o=Z(e,t,n,o),o}function Y(e,t,n,r){const i=[];for(let a=1;a<=t;a++)i.push(this.LA(a).tokenType);const s=e.atnStartState;r(function(e){const t=(0,c.A)(e.prefixPath,(e=>(0,o.Sk)(e))).join(", "),n=0===e.production.idx?"":e.production.idx;let r=`Ambiguous Alternatives Detected: <${e.ambiguityIndices.join(", ")}> in <${function(e){if(e instanceof o.wL)return"SUBRULE";if(e instanceof o.c$)return"OPTION";if(e instanceof o.ak)return"OR";if(e instanceof o.$P)return"AT_LEAST_ONE";if(e instanceof o.Cy)return"AT_LEAST_ONE_SEP";if(e instanceof o.Pp)return"MANY_SEP";if(e instanceof o.Y2)return"MANY";if(e instanceof o.BK)return"CONSUME";throw Error("non exhaustive match")}(e.production)}${n}> inside <${e.topLevelRule.name}> Rule,\n<${t}> may appears as a prefix path in all these alternatives.\n`;return r+="See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES\nFor Further details.",r}({topLevelRule:s.rule,ambiguityIndices:n,production:s.production,prefixPath:i}))}function X(e,t,n){const r=(0,b.A)(t.configs.elements,(e=>e.state.transitions));return{actualToken:n,possibleTokenTypes:P(r.filter((e=>e instanceof h)).map((e=>e.tokenType)),(e=>e.tokenTypeIdx)),tokenPath:e}}function q(e,t){if(e instanceof h&&(0,o.G)(t,e.tokenType))return e.target}function Q(e){return{configs:e,edges:{},isAcceptState:!1,prediction:-1}}function Z(e,t,n,r){return r=J(e,r),t.edges[n.tokenTypeIdx]=r,r}function J(e,t){if(t===N)return t;const n=t.configs.key,r=e.states[n];return void 0!==r?r:(t.configs.finalize(),e.states[n]=t,t)}function ee(e){const t=new w,n=e.transitions.length;for(let r=0;r0){const n=[...e.stack];te({state:n.pop(),alt:e.alt,stack:n},t)}else t.add(e);return}n.epsilonOnlyTransitions||t.add(e);const r=n.transitions.length;for(let i=0;i2?r-2:0),s=2;s0&&(n.arguments=i),n},e.is=function(e){let t=e;return wt.defined(t)&&wt.string(t.title)&&wt.string(t.command)}}(Re||(Re={})),function(e){e.replace=function(e,t){return{range:e,newText:t}},e.insert=function(e,t){return{range:{start:e,end:e},newText:t}},e.del=function(e){return{range:e,newText:""}},e.is=function(e){const t=e;return wt.objectLiteral(t)&&wt.string(t.newText)&&ce.is(t.range)}}(Ee||(Ee={})),function(e){e.create=function(e,t,n){const r={label:e};return void 0!==t&&(r.needsConfirmation=t),void 0!==n&&(r.description=n),r},e.is=function(e){const t=e;return wt.objectLiteral(t)&&wt.string(t.label)&&(wt.boolean(t.needsConfirmation)||void 0===t.needsConfirmation)&&(wt.string(t.description)||void 0===t.description)}}(ke||(ke={})),function(e){e.is=function(e){const t=e;return wt.string(t)}}($e||($e={})),function(e){e.replace=function(e,t,n){return{range:e,newText:t,annotationId:n}},e.insert=function(e,t,n){return{range:{start:e,end:e},newText:t,annotationId:n}},e.del=function(e,t){return{range:e,newText:"",annotationId:t}},e.is=function(e){const t=e;return Ee.is(t)&&(ke.is(t.annotationId)||$e.is(t.annotationId))}}(xe||(xe={})),function(e){e.create=function(e,t){return{textDocument:e,edits:t}},e.is=function(e){let t=e;return wt.defined(t)&&Oe.is(t.textDocument)&&Array.isArray(t.edits)}}(Ie||(Ie={})),function(e){e.create=function(e,t,n){let r={kind:"create",uri:e};return void 0===t||void 0===t.overwrite&&void 0===t.ignoreIfExists||(r.options=t),void 0!==n&&(r.annotationId=n),r},e.is=function(e){let t=e;return t&&"create"===t.kind&&wt.string(t.uri)&&(void 0===t.options||(void 0===t.options.overwrite||wt.boolean(t.options.overwrite))&&(void 0===t.options.ignoreIfExists||wt.boolean(t.options.ignoreIfExists)))&&(void 0===t.annotationId||$e.is(t.annotationId))}}(Se||(Se={})),function(e){e.create=function(e,t,n,r){let i={kind:"rename",oldUri:e,newUri:t};return void 0===n||void 0===n.overwrite&&void 0===n.ignoreIfExists||(i.options=n),void 0!==r&&(i.annotationId=r),i},e.is=function(e){let t=e;return t&&"rename"===t.kind&&wt.string(t.oldUri)&&wt.string(t.newUri)&&(void 0===t.options||(void 0===t.options.overwrite||wt.boolean(t.options.overwrite))&&(void 0===t.options.ignoreIfExists||wt.boolean(t.options.ignoreIfExists)))&&(void 0===t.annotationId||$e.is(t.annotationId))}}(Ne||(Ne={})),function(e){e.create=function(e,t,n){let r={kind:"delete",uri:e};return void 0===t||void 0===t.recursive&&void 0===t.ignoreIfNotExists||(r.options=t),void 0!==n&&(r.annotationId=n),r},e.is=function(e){let t=e;return t&&"delete"===t.kind&&wt.string(t.uri)&&(void 0===t.options||(void 0===t.options.recursive||wt.boolean(t.options.recursive))&&(void 0===t.options.ignoreIfNotExists||wt.boolean(t.options.ignoreIfNotExists)))&&(void 0===t.annotationId||$e.is(t.annotationId))}}(we||(we={})),function(e){e.is=function(e){let t=e;return t&&(void 0!==t.changes||void 0!==t.documentChanges)&&(void 0===t.documentChanges||t.documentChanges.every((e=>wt.string(e.kind)?Se.is(e)||Ne.is(e)||we.is(e):Ie.is(e))))}}(Ce||(Ce={}));!function(e){e.create=function(e){return{uri:e}},e.is=function(e){let t=e;return wt.defined(t)&&wt.string(t.uri)}}(Le||(Le={})),function(e){e.create=function(e,t){return{uri:e,version:t}},e.is=function(e){let t=e;return wt.defined(t)&&wt.string(t.uri)&&wt.integer(t.version)}}(be||(be={})),function(e){e.create=function(e,t){return{uri:e,version:t}},e.is=function(e){let t=e;return wt.defined(t)&&wt.string(t.uri)&&(null===t.version||wt.integer(t.version))}}(Oe||(Oe={})),function(e){e.create=function(e,t,n,r){return{uri:e,languageId:t,version:n,text:r}},e.is=function(e){let t=e;return wt.defined(t)&&wt.string(t.uri)&&wt.string(t.languageId)&&wt.integer(t.version)&&wt.string(t.text)}}(_e||(_e={})),function(e){e.PlainText="plaintext",e.Markdown="markdown",e.is=function(t){const n=t;return n===e.PlainText||n===e.Markdown}}(Pe||(Pe={})),function(e){e.is=function(e){const t=e;return wt.objectLiteral(e)&&Pe.is(t.kind)&&wt.string(t.value)}}(Me||(Me={})),function(e){e.Text=1,e.Method=2,e.Function=3,e.Constructor=4,e.Field=5,e.Variable=6,e.Class=7,e.Interface=8,e.Module=9,e.Property=10,e.Unit=11,e.Value=12,e.Enum=13,e.Keyword=14,e.Snippet=15,e.Color=16,e.File=17,e.Reference=18,e.Folder=19,e.EnumMember=20,e.Constant=21,e.Struct=22,e.Event=23,e.Operator=24,e.TypeParameter=25}(De||(De={})),function(e){e.PlainText=1,e.Snippet=2}(Ue||(Ue={})),function(e){e.Deprecated=1}(Fe||(Fe={})),function(e){e.create=function(e,t,n){return{newText:e,insert:t,replace:n}},e.is=function(e){const t=e;return t&&wt.string(t.newText)&&ce.is(t.insert)&&ce.is(t.replace)}}(Ge||(Ge={})),function(e){e.asIs=1,e.adjustIndentation=2}(Ke||(Ke={})),function(e){e.is=function(e){const t=e;return t&&(wt.string(t.detail)||void 0===t.detail)&&(wt.string(t.description)||void 0===t.description)}}(Be||(Be={})),function(e){e.create=function(e){return{label:e}}}(je||(je={})),function(e){e.create=function(e,t){return{items:e||[],isIncomplete:!!t}}}(Ve||(Ve={})),function(e){e.fromPlainText=function(e){return e.replace(/[\\`*_{}[\]()#+\-.!]/g,"\\$&")},e.is=function(e){const t=e;return wt.string(t)||wt.objectLiteral(t)&&wt.string(t.language)&&wt.string(t.value)}}(He||(He={})),function(e){e.is=function(e){let t=e;return!!t&&wt.objectLiteral(t)&&(Me.is(t.contents)||He.is(t.contents)||wt.typedArray(t.contents,He.is))&&(void 0===e.range||ce.is(e.range))}}(We||(We={})),function(e){e.create=function(e,t){return t?{label:e,documentation:t}:{label:e}}}(ze||(ze={})),function(e){e.create=function(e,t){let n={label:e};wt.defined(t)&&(n.documentation=t);for(var r=arguments.length,i=new Array(r>2?r-2:0),s=2;s{let n=e.range.start.line-t.range.start.line;return 0===n?e.range.start.character-t.range.start.character:n})),s=r.length;for(let t=i.length-1;t>=0;t--){let n=i[t],a=e.offsetAt(n.range.start),o=e.offsetAt(n.range.end);if(!(o<=s))throw new Error("Overlapping edit");r=r.substring(0,a)+n.newText+r.substring(o,r.length),s=a}return r}}(Nt||(Nt={}));class Ct{constructor(e,t,n,r){this._uri=e,this._languageId=t,this._version=n,this._content=r,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){this._content=e.text,this._version=t,this._lineOffsets=void 0}getLineOffsets(){if(void 0===this._lineOffsets){let e=[],t=this._content,n=!0;for(let r=0;r0&&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,r=t.length;if(0===r)return oe.create(0,e);for(;ne?r=i:n=i+1}let i=n-1;return oe.create(i,e-t[i])}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],r=e.line+1=0&&t.content.splice(n,1)}}addHiddenNodes(e){const t=[];for(const s of e){const e=new Ot(s.startOffset,s.image.length,(0,r.wf)(s),s.tokenType,!0);e.root=this.rootNode,t.push(e)}let n=this.current,i=!1;if(n.content.length>0)n.content.push(...t);else{for(;n.container;){const e=n.container.content.indexOf(n);if(e>0){n.container.content.splice(e,0,...t),i=!0;break}n=n.container}i||this.rootNode.content.unshift(...t)}}construct(e){const t=this.current;"string"===typeof e.$type&&(this.current.astNode=e),e.$cstNode=t;const n=this.nodeStack.pop();0===(null===n||void 0===n?void 0:n.content.length)&&this.removeNode(n)}}class bt{get parent(){return this.container}get feature(){return this.grammarSource}get hidden(){return!1}get astNode(){var e,t;const n="string"===typeof(null===(e=this._astNode)||void 0===e?void 0:e.$type)?this._astNode:null===(t=this.container)||void 0===t?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)}}class Ot extends bt{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,r){let i=arguments.length>4&&void 0!==arguments[4]&&arguments[4];super(),this._hidden=i,this._offset=e,this._tokenType=r,this._length=t,this._range=n}}class _t extends bt{constructor(){super(...arguments),this.content=new Pt(this)}get children(){return this.content}get offset(){var e,t;return null!==(t=null===(e=this.firstNonHiddenNode)||void 0===e?void 0:e.offset)&&void 0!==t?t:0}get length(){return this.end-this.offset}get end(){var e,t;return null!==(t=null===(e=this.lastNonHiddenNode)||void 0===e?void 0:e.end)&&void 0!==t?t:0}get range(){const e=this.firstNonHiddenNode,t=this.lastNonHiddenNode;if(e&&t){if(void 0===this._rangeCache){const{range:n}=e,{range:r}=t;this._rangeCache={start:n.start,end:r.end.line=0;e--){const t=this.content[e];if(!t.hidden)return t}return this.content[this.content.length-1]}}class Pt extends Array{constructor(e){super(),this.parent=e,Object.setPrototypeOf(this,Pt.prototype)}push(){for(var e=arguments.length,t=new Array(e),n=0;n2?n-2:0),i=2;ie.endsWith("\u200b")?e:e+"\u200b";class Gt{constructor(e){this._unorderedGroups=new Map,this.allRules=new Map,this.lexer=e.parser.Lexer;const t=this.lexer.definition,n="production"===e.LanguageMetaData.mode;this.wrapper=new Wt(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()}}class Kt extends Gt{get current(){return this.stack[this.stack.length-1]}constructor(e){super(e),this.nodeBuilder=new Lt,this.stack=[],this.assignmentMap=new Map,this.linker=e.references.Linker,this.converter=e.parser.ValueConverter,this.astReflection=e.shared.AstReflection}rule(e,t){const n=this.computeRuleType(e),r=this.wrapper.DEFINE_RULE(Ft(e.name),this.startImplementation(n,t).bind(this));return this.allRules.set(e.name,r),e.entry&&(this.mainRule=r),r}computeRuleType(e){if(!e.fragment){if((0,i.Xq)(e))return Dt;{const t=(0,i.PV)(e);return null!==t&&void 0!==t?t:e.name}}}parse(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};this.nodeBuilder.buildRootNode(e);const n=this.lexerResult=this.lexer.tokenize(e);this.wrapper.input=n.tokens;const r=t.rule?this.allRules.get(t.rule):this.mainRule;if(!r)throw new Error(t.rule?`No rule found with name '${t.rule}'`:"No main rule available.");const i=r.call(this.wrapper,{});return this.nodeBuilder.addHiddenNodes(n.hidden),this.unorderedGroups.clear(),this.lexerResult=void 0,{value:i,lexerErrors:n.errors,lexerReport:n.report,parserErrors:this.wrapper.errors}}startImplementation(e,t){return n=>{const r=!this.isRecording()&&void 0!==e;if(r){const t={$type:e};this.stack.push(t),e===Dt&&(t.value="")}let i;try{i=t(n)}catch(s){i=void 0}return void 0===i&&r&&(i=this.construct()),i}}extractHiddenTokens(e){const t=this.lexerResult.hidden;if(!t.length)return[];const n=e.startOffset;for(let r=0;rn)return t.splice(0,r)}return t.splice(0,t.length)}consume(e,t,n){const r=this.wrapper.wrapConsume(e,t);if(!this.isRecording()&&this.isValidToken(r)){const e=this.extractHiddenTokens(r);this.nodeBuilder.addHiddenNodes(e);const t=this.nodeBuilder.buildLeafNode(r,n),{assignment:i,isCrossRef:s}=this.getAssignment(n),o=this.current;if(i){const e=(0,a.wb)(n)?r.image:this.converter.convert(r.image,t);this.assign(i.operator,i.feature,e,t,s)}else if(Ut(o)){let e=r.image;(0,a.wb)(n)||(e=this.converter.convert(e,t).toString()),o.value+=e}}}isValidToken(e){return!e.isInsertedInRecovery&&!isNaN(e.startOffset)&&"number"===typeof e.endOffset&&!isNaN(e.endOffset)}subrule(e,t,n,r,i){let s;this.isRecording()||n||(s=this.nodeBuilder.buildCompositeNode(r));const a=this.wrapper.wrapSubrule(e,t,i);!this.isRecording()&&s&&s.length>0&&this.performSubruleAssignment(a,r,s)}performSubruleAssignment(e,t,n){const{assignment:r,isCrossRef:i}=this.getAssignment(t);if(r)this.assign(r.operator,r.feature,e,n,i);else if(!r){const t=this.current;if(Ut(t))t.value+=e.toString();else if("object"===typeof e&&e){const n=this.assignWithoutOverride(e,t);this.stack.pop(),this.stack.push(n)}}}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);const r={$type:e};this.stack.push(r),this.assign(t.operator,t.feature,n,n.$cstNode,!1)}else n.$type=e}}construct(){if(this.isRecording())return;const e=this.current;return(0,St.SD)(e),this.nodeBuilder.construct(e),this.stack.pop(),Ut(e)?this.converter.convert(e.value,e.$cstNode):((0,St.OP)(this.astReflection,e),e)}getAssignment(e){if(!this.assignmentMap.has(e)){const t=(0,St.XG)(e,a.wh);this.assignmentMap.set(e,{assignment:t,isCrossRef:!!t&&(0,a._c)(t.terminal)})}return this.assignmentMap.get(e)}assign(e,t,n,r,i){const s=this.current;let a;switch(a=i&&"string"===typeof n?this.linker.buildReference(s,t,r,n):n,e){case"=":s[t]=a;break;case"?=":s[t]=!0;break;case"+=":Array.isArray(s[t])||(s[t]=[]),s[t].push(a)}}assignWithoutOverride(e,t){for(const[r,i]of Object.entries(t)){const t=e[r];void 0===t?e[r]=i:Array.isArray(t)&&Array.isArray(i)&&(i.push(...t),e[r]=i)}const n=e.$cstNode;return n&&(n.astNode=void 0,e.$cstNode=void 0),e}get definitionErrors(){return this.wrapper.definitionErrors}}class Bt{buildMismatchTokenMessage(e){return o.my.buildMismatchTokenMessage(e)}buildNotAllInputParsedMessage(e){return o.my.buildNotAllInputParsedMessage(e)}buildNoViableAltMessage(e){return o.my.buildNoViableAltMessage(e)}buildEarlyExitMessage(e){return o.my.buildEarlyExitMessage(e)}}class jt extends Bt{buildMismatchTokenMessage(e){let{expected:t,actual:n}=e;return`Expecting ${t.LABEL?"`"+t.LABEL+"`":t.name.endsWith(":KW")?`keyword '${t.name.substring(0,t.name.length-3)}'`:`token of type '${t.name}'`} but found \`${n.image}\`.`}buildNotAllInputParsedMessage(e){let{firstRedundant:t}=e;return`Expecting end of file but found \`${t.image}\`.`}}class Vt extends Gt{constructor(){super(...arguments),this.tokens=[],this.elementStack=[],this.lastElementStack=[],this.nextTokenIndex=0,this.stackSize=0}action(){}construct(){}parse(e){this.resetState();const 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){const n=this.wrapper.DEFINE_RULE(Ft(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=>{const n=this.keepStackSize();try{e(t)}finally{this.resetStackSize(n)}}}removeUnexpectedElements(){this.elementStack.splice(this.stackSize)}keepStackSize(){const 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,r,i){this.before(r),this.wrapper.wrapSubrule(e,t,i),this.after(r)}before(e){this.isRecording()||this.elementStack.push(e)}after(e){if(!this.isRecording()){const t=this.elementStack.lastIndexOf(e);t>=0&&this.elementStack.splice(t)}}get currIdx(){return this.wrapper.currIdx}}const Ht={recoveryEnabled:!0,nodeLocationTracking:"full",skipValidations:!0,errorMessageProvider:new jt};class Wt extends o.jr{constructor(e,t){const n=t&&"maxLookahead"in t;super(e,Object.assign(Object.assign(Object.assign({},Ht),{lookaheadStrategy:n?new o.T6({maxLookahead:t.maxLookahead}):new j({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)}}var zt=n(6617),Yt=n(4230);function Xt(e,t,n){return function(e,t){const n=(0,i.YV)(t,!1),r=(0,Yt.Td)(t.rules).filter(a.s7).filter((e=>n.has(e)));for(const i of r){const t=Object.assign(Object.assign({},e),{consume:1,optional:1,subrule:1,many:1,or:1});e.parser.rule(i,qt(t,i.definition))}}({parser:t,tokens:n,ruleNames:new Map},e),t}function qt(e,t){let n,r=arguments.length>2&&void 0!==arguments[2]&&arguments[2];if((0,a.wb)(t))n=function(e,t){const n=e.consume++,r=e.tokens[t.value];if(!r)throw new Error("Could not find token for keyword: "+t.value);return()=>e.parser.consume(n,r,t)}(e,t);else if((0,a.ve)(t))n=function(e,t){const n=(0,i.Uz)(t);return()=>e.parser.action(n,t)}(e,t);else if((0,a.wh)(t))n=qt(e,t.terminal);else if((0,a._c)(t))n=Jt(e,t);else if((0,a.$g)(t))n=function(e,t){const n=t.rule.ref;if((0,a.s7)(n)){const r=e.subrule++,i=n.fragment,s=t.arguments.length>0?function(e,t){const n=t.map((e=>Qt(e.value)));return t=>{const r={};for(let i=0;i({});return a=>e.parser.subrule(r,tn(e,n),i,t,s(a))}if((0,a.rE)(n)){const r=e.consume++,i=nn(e,n.name);return()=>e.parser.consume(r,i,t)}if(!n)throw new zt.W(t.$cstNode,`Undefined rule: ${t.rule.$refText}`);(0,zt.d)(n)}(e,t);else if((0,a.jp)(t))n=function(e,t){if(1===t.elements.length)return qt(e,t.elements[0]);{const n=[];for(const i of t.elements){const t={ALT:qt(e,i,!0)},r=Zt(i);r&&(t.GATE=Qt(r)),n.push(t)}const r=e.or++;return t=>e.parser.alternatives(r,n.map((e=>{const n={ALT:()=>e.ALT(t)},r=e.GATE;return r&&(n.GATE=()=>r(t)),n})))}}(e,t);else if((0,a.cY)(t))n=function(e,t){if(1===t.elements.length)return qt(e,t.elements[0]);const n=[];for(const o of t.elements){const t={ALT:qt(e,o,!0)},r=Zt(o);r&&(t.GATE=Qt(r)),n.push(t)}const r=e.or++,i=(e,t)=>`uGroup_${e}_${t.getRuleStack().join("-")}`,s=t=>e.parser.alternatives(r,n.map(((n,s)=>{const a={ALT:()=>!0},o=e.parser;a.ALT=()=>{if(n.ALT(t),!o.isRecording()){const e=i(r,o);o.unorderedGroups.get(e)||o.unorderedGroups.set(e,[]);const t=o.unorderedGroups.get(e);"undefined"===typeof(null===t||void 0===t?void 0:t[s])&&(t[s]=!0)}};const c=n.GATE;return a.GATE=c?()=>c(t):()=>{const e=o.unorderedGroups.get(i(r,o));return!(null===e||void 0===e?void 0:e[s])},a}))),a=en(e,Zt(t),s,"*");return t=>{a(t),e.parser.isRecording()||e.parser.unorderedGroups.delete(i(r,e.parser))}}(e,t);else if((0,a.IZ)(t))n=function(e,t){const n=t.elements.map((t=>qt(e,t)));return e=>n.forEach((t=>t(e)))}(e,t);else{if(!(0,a.FO)(t))throw new zt.W(t.$cstNode,`Unexpected element type: ${t.$type}`);{const r=e.consume++;n=()=>e.parser.consume(r,o.LT,t)}}return en(e,r?void 0:Zt(t),n,t.cardinality)}function Qt(e){if((0,a.RP)(e)){const t=Qt(e.left),n=Qt(e.right);return e=>t(e)||n(e)}if((0,a.Tu)(e)){const t=Qt(e.left),n=Qt(e.right);return e=>t(e)&&n(e)}if((0,a.Ct)(e)){const t=Qt(e.value);return e=>!t(e)}if((0,a.TF)(e)){const t=e.parameter.ref.name;return e=>void 0!==e&&!0===e[t]}if((0,a.Cz)(e)){const t=Boolean(e.true);return()=>t}(0,zt.d)(e)}function Zt(e){if((0,a.IZ)(e))return e.guardCondition}function Jt(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:t.terminal;if(n){if((0,a.$g)(n)&&(0,a.s7)(n.rule.ref)){const r=n.rule.ref,i=e.subrule++;return n=>e.parser.subrule(i,tn(e,r),!1,t,n)}if((0,a.$g)(n)&&(0,a.rE)(n.rule.ref)){const r=e.consume++,i=nn(e,n.rule.ref.name);return()=>e.parser.consume(r,i,t)}if((0,a.wb)(n)){const r=e.consume++,i=nn(e,n.value);return()=>e.parser.consume(r,i,t)}throw new Error("Could not build cross reference parser")}{if(!t.type.ref)throw new Error("Could not resolve reference to type: "+t.type.$refText);const n=(0,i.U5)(t.type.ref),r=null===n||void 0===n?void 0:n.terminal;if(!r)throw new Error("Could not find name assignment for type: "+(0,i.Uz)(t.type.ref));return Jt(e,t,r)}}function en(e,t,n,r){const i=t&&Qt(t);if(!r){if(i){const t=e.or++;return r=>e.parser.alternatives(t,[{ALT:()=>n(r),GATE:()=>i(r)},{ALT:(0,o.mT)(),GATE:()=>!i(r)}])}return n}if("*"===r){const t=e.many++;return r=>e.parser.many(t,{DEF:()=>n(r),GATE:i?()=>i(r):void 0})}if("+"===r){const t=e.many++;if(i){const r=e.or++;return s=>e.parser.alternatives(r,[{ALT:()=>e.parser.atLeastOne(t,{DEF:()=>n(s)}),GATE:()=>i(s)},{ALT:(0,o.mT)(),GATE:()=>!i(s)}])}return r=>e.parser.atLeastOne(t,{DEF:()=>n(r)})}if("?"===r){const t=e.optional++;return r=>e.parser.optional(t,{DEF:()=>n(r),GATE:i?()=>i(r):void 0})}(0,zt.d)(r)}function tn(e,t){const n=function(e,t){if((0,a.s7)(t))return t.name;if(e.ruleNames.has(t))return e.ruleNames.get(t);{let n=t,r=n.$container,i=t.$type;for(;!(0,a.s7)(r);){if((0,a.IZ)(r)||(0,a.jp)(r)||(0,a.cY)(r)){i=r.elements.indexOf(n).toString()+":"+i}n=r,r=r.$container}return i=r.name+":"+i,e.ruleNames.set(t,i),i}}(e,t),r=e.parser.getRule(n);if(!r)throw new Error(`Rule "${n}" not found."`);return r}function nn(e,t){const n=e.tokens[t];if(!n)throw new Error(`Token "${t}" not found."`);return n}function rn(e){const t=function(e){const t=e.Grammar,n=e.parser.Lexer,r=new Kt(e);return Xt(t,r,n.definition)}(e);return t.finalize(),t}var sn=n(9471),an=n(4644),on=n(3975),cn=n(5460);let ln=0,un=10;const dn=Symbol("OperationCancelled");function hn(e){return e===dn}async function fn(e){if(e===on.XO.None)return;const t=performance.now();if(t-ln>=un&&(ln=t,await new Promise((e=>{"undefined"===typeof setImmediate?setTimeout(e,0):setImmediate(e)})),ln=performance.now()),e.isCancellationRequested)throw dn}class pn{constructor(){this.promise=new Promise(((e,t)=>{this.resolve=t=>(e(t),this),this.reject=e=>(t(e),this)}))}}class mn{constructor(e,t,n,r){this._uri=e,this._languageId=t,this._version=n,this._content=r,this._lineOffsets=void 0}get uri(){return this._uri}get languageId(){return this._languageId}get version(){return this._version}getText(e){if(e){const t=this.offsetAt(e.start),n=this.offsetAt(e.end);return this._content.substring(t,n)}return this._content}update(e,t){for(const n of e)if(mn.isIncremental(n)){const e=Tn(n.range),t=this.offsetAt(e.start),r=this.offsetAt(e.end);this._content=this._content.substring(0,t)+n.text+this._content.substring(r,this._content.length);const i=Math.max(e.start.line,0),s=Math.max(e.end.line,0);let a=this._lineOffsets;const o=vn(n.text,!1,t);if(s-i===o.length)for(let n=0,l=o.length;ne?r=i:n=i+1}const i=n-1;return{line:i,character:(e=this.ensureBeforeEOL(e,t[i]))-t[i]}}offsetAt(e){const t=this.getLineOffsets();if(e.line>=t.length)return this._content.length;if(e.line<0)return 0;const n=t[e.line];if(e.character<=0)return n;const r=e.line+1t&&An(this._content.charCodeAt(e-1));)e--;return e}get lineCount(){return this.getLineOffsets().length}static isIncremental(e){const t=e;return void 0!==t&&null!==t&&"string"===typeof t.text&&void 0!==t.range&&(void 0===t.rangeLength||"number"===typeof t.rangeLength)}static isFull(e){const t=e;return void 0!==t&&null!==t&&"string"===typeof t.text&&void 0===t.range&&void 0===t.rangeLength}}var gn;function yn(e,t){if(e.length<=1)return e;const n=e.length/2|0,r=e.slice(0,n),i=e.slice(n);yn(r,t),yn(i,t);let s=0,a=0,o=0;for(;s2&&void 0!==arguments[2]?arguments[2]:0;const r=t?[n]:[];for(let i=0;in.line||t.line===n.line&&t.character>n.character?{start:n,end:t}:e}function Rn(e){const t=Tn(e.range);return t!==e.range?{newText:e.newText,range:t}:e}!function(e){e.create=function(e,t,n,r){return new mn(e,t,n,r)},e.update=function(e,t,n){if(e instanceof mn)return e.update(t,n),e;throw new Error("TextDocument.update: document must be created by TextDocument.create")},e.applyEdits=function(e,t){const n=e.getText(),r=yn(t.map(Rn),((e,t)=>{const n=e.range.start.line-t.range.start.line;return 0===n?e.range.start.character-t.range.start.character:n}));let i=0;const s=[];for(const a of r){const t=e.offsetAt(a.range.start);if(ti&&s.push(n.substring(i,t)),a.newText.length&&s.push(a.newText),i=e.offsetAt(a.range.end)}return s.push(n.substr(i)),s.join("")}}(gn||(gn={}));var En,kn=n(6843);!function(e){e[e.Changed=0]="Changed",e[e.Parsed=1]="Parsed",e[e.IndexedContent=2]="IndexedContent",e[e.ComputedScopes=3]="ComputedScopes",e[e.Linked=4]="Linked",e[e.IndexedReferences=5]="IndexedReferences",e[e.Validated=6]="Validated"}(En||(En={}));class $n{constructor(e){this.serviceRegistry=e.ServiceRegistry,this.textDocuments=e.workspace.TextDocuments,this.fileSystemProvider=e.workspace.FileSystemProvider}async fromUri(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:on.XO.None;const n=await this.fileSystemProvider.readFile(e);return this.createAsync(e,n,t)}fromTextDocument(e,t,n){return t=null!==t&&void 0!==t?t:kn.r.parse(e.uri),on.XO.is(n)?this.createAsync(t,e,n):this.create(t,e,n)}fromString(e,t,n){return on.XO.is(n)?this.createAsync(t,e,n):this.create(t,e,n)}fromModel(e,t){return this.create(t,{$model:e})}create(e,t,n){if("string"===typeof t){const r=this.parse(e,t,n);return this.createLangiumDocument(r,e,void 0,t)}if("$model"in t){const n={value:t.$model,parserErrors:[],lexerErrors:[]};return this.createLangiumDocument(n,e)}{const r=this.parse(e,t.getText(),n);return this.createLangiumDocument(r,e,t)}}async createAsync(e,t,n){if("string"===typeof t){const r=await this.parseAsync(e,t,n);return this.createLangiumDocument(r,e,void 0,t)}{const r=await this.parseAsync(e,t.getText(),n);return this.createLangiumDocument(r,e,t)}}createLangiumDocument(e,t,n,r){let i;if(n)i={parseResult:e,uri:t,state:En.Parsed,references:[],textDocument:n};else{const n=this.createTextDocumentGetter(t,r);i={parseResult:e,uri:t,state:En.Parsed,references:[],get textDocument(){return n()}}}return e.value.$document=i,i}async update(e,t){var n,r;const i=null===(n=e.parseResult.value.$cstNode)||void 0===n?void 0:n.root.fullText,s=null===(r=this.textDocuments)||void 0===r?void 0:r.get(e.uri.toString()),a=s?s.getText():await this.fileSystemProvider.readFile(e.uri);if(s)Object.defineProperty(e,"textDocument",{value:s});else{const t=this.createTextDocumentGetter(e.uri,a);Object.defineProperty(e,"textDocument",{get:t})}return i!==a&&(e.parseResult=await this.parseAsync(e.uri,a,t),e.parseResult.value.$document=e),e.state=En.Parsed,e}parse(e,t,n){return this.serviceRegistry.getServices(e).parser.LangiumParser.parse(t,n)}parseAsync(e,t,n){return this.serviceRegistry.getServices(e).parser.AsyncParser.parse(t,n)}createTextDocumentGetter(e,t){const n=this.serviceRegistry;let r;return()=>null!==r&&void 0!==r?r:r=gn.create(e.toString(),n.getServices(e).LanguageMetaData.languageId,0,null!==t&&void 0!==t?t:"")}}class xn{constructor(e){this.documentMap=new Map,this.langiumDocumentFactory=e.workspace.LangiumDocumentFactory,this.serviceRegistry=e.ServiceRegistry}get all(){return(0,Yt.Td)(this.documentMap.values())}addDocument(e){const 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){const 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((e=>(this.addDocument(e),e)));{const n=this.langiumDocumentFactory.fromString(t,e);return this.addDocument(n),n}}hasDocument(e){return this.documentMap.has(e.toString())}invalidateDocument(e){const t=e.toString(),n=this.documentMap.get(t);if(n){this.serviceRegistry.getServices(e).references.Linker.unlink(n),n.state=En.Changed,n.precomputedScopes=void 0,n.diagnostics=void 0}return n}deleteDocument(e){const t=e.toString(),n=this.documentMap.get(t);return n&&(n.state=En.Changed,this.documentMap.delete(t)),n}}const In=Symbol("ref_resolving");class Sn{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){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:on.XO.None;for(const n of(0,St.jm)(e.parseResult.value))await fn(t),(0,St.DM)(n).forEach((t=>this.doLink(t,e)))}doLink(e,t){var n;const r=e.reference;if(void 0===r._ref){r._ref=In;try{const t=this.getCandidate(e);if((0,cn.Zl)(t))r._ref=t;else if(r._nodeDescription=t,this.langiumDocuments().hasDocument(t.documentUri)){const n=this.loadAstNode(t);r._ref=null!==n&&void 0!==n?n:this.createLinkingError(e,t)}else r._ref=void 0}catch(i){console.error(`An error occurred while resolving reference to '${r.$refText}':`,i);const t=null!==(n=i.message)&&void 0!==n?n:String(i);r._ref=Object.assign(Object.assign({},e),{message:`An error occurred while resolving reference to '${r.$refText}': ${t}`})}t.references.push(r)}}unlink(e){for(const t of e.references)delete t._ref,delete t._nodeDescription;e.references=[]}getCandidate(e){const t=this.scopeProvider.getScope(e).getElement(e.reference.$refText);return null!==t&&void 0!==t?t:this.createLinkingError(e)}buildReference(e,t,n,r){const i=this,s={$refNode:n,$refText:r,get ref(){var n;if((0,cn.ng)(this._ref))return this._ref;if((0,cn.Nr)(this._nodeDescription)){const n=i.loadAstNode(this._nodeDescription);this._ref=null!==n&&void 0!==n?n:i.createLinkingError({reference:s,container:e,property:t},this._nodeDescription)}else if(void 0===this._ref){this._ref=In;const r=(0,St.cQ)(e).$document,a=i.getLinkedNode({reference:s,container:e,property:t});if(a.error&&r&&r.statee.length>0)),s=r.split("/").filter((e=>e.length>0));let a=0;for(;a=e.end)return t.ref}if(n){const t=this.nameProvider.getNameNode(n);if(t&&(t===e||(0,r.pO)(e,t)))return n}}}findDeclarationNode(e){const t=this.findDeclaration(e);if(null===t||void 0===t?void 0:t.$cstNode){const e=this.nameProvider.getNameNode(t);return null!==e&&void 0!==e?e:t.$cstNode}}findReferences(e,t){const n=[];if(t.includeDeclaration){const t=this.getReferenceToSelf(e);t&&n.push(t)}let r=this.index.findAllReferences(e,this.nodeLocator.getAstNodePath(e));return t.documentUri&&(r=r.filter((e=>wn.equals(e.sourceUri,t.documentUri)))),n.push(...r),(0,Yt.Td)(n)}getReferenceToSelf(e){const t=this.nameProvider.getNameNode(e);if(t){const n=(0,St.YE)(e),i=this.nodeLocator.getAstNodePath(e);return{sourceUri:n.uri,sourcePath:i,targetUri:n.uri,targetPath:i,segment:(0,r.SX)(t),local:!0}}}}class Ln{constructor(e){if(this.map=new Map,e)for(const[t,n]of e)this.add(t,n)}get size(){return Yt.iD.sum((0,Yt.Td)(this.map.values()).map((e=>e.length)))}clear(){this.map.clear()}delete(e,t){if(void 0===t)return this.map.delete(e);{const n=this.map.get(e);if(n){const r=n.indexOf(t);if(r>=0)return 1===n.length?this.map.delete(e):n.splice(r,1),!0}return!1}}get(e){var t;return null!==(t=this.map.get(e))&&void 0!==t?t:[]}has(e,t){if(void 0===t)return this.map.has(e);{const n=this.map.get(e);return!!n&&n.indexOf(t)>=0}}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((t=>e(t,n,this)))))}[Symbol.iterator](){return this.entries().iterator()}entries(){return(0,Yt.Td)(this.map.entries()).flatMap((e=>{let[t,n]=e;return n.map((e=>[t,e]))}))}keys(){return(0,Yt.Td)(this.map.keys())}values(){return(0,Yt.Td)(this.map.values()).flat()}entriesGroupedByKey(){return(0,Yt.Td)(this.map.entries())}}class bn{get size(){return this.map.size}constructor(e){if(this.map=new Map,this.inverse=new Map,e)for(const[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){const t=this.map.get(e);return void 0!==t&&(this.map.delete(e),this.inverse.delete(t),!0)}}class On{constructor(e){this.nameProvider=e.references.NameProvider,this.descriptions=e.workspace.AstNodeDescriptionProvider}async computeExports(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:on.XO.None;return this.computeExportsForNode(e.parseResult.value,e,void 0,t)}async computeExportsForNode(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:St.VN,r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:on.XO.None;const i=[];this.exportNode(e,i,t);for(const s of n(e))await fn(r),this.exportNode(s,i,t);return i}exportNode(e,t,n){const r=this.nameProvider.getName(e);r&&t.push(this.descriptions.createDescription(e,r,n))}async computeLocalScopes(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:on.XO.None;const n=e.parseResult.value,r=new Ln;for(const i of(0,St.Uo)(n))await fn(t),this.processNode(i,e,r);return r}processNode(e,t,n){const r=e.$container;if(r){const i=this.nameProvider.getName(e);i&&n.add(r,this.descriptions.createDescription(e,i,t))}}}class _n{constructor(e,t,n){var r;this.elements=e,this.outerScope=t,this.caseInsensitive=null!==(r=null===n||void 0===n?void 0:n.caseInsensitive)&&void 0!==r&&r}getAllElements(){return this.outerScope?this.elements.concat(this.outerScope.getAllElements()):this.elements}getElement(e){const t=this.caseInsensitive?this.elements.find((t=>t.name.toLowerCase()===e.toLowerCase())):this.elements.find((t=>t.name===e));return t||(this.outerScope?this.outerScope.getElement(e):void 0)}}class Pn{constructor(e,t,n){var r;this.elements=new Map,this.caseInsensitive=null!==(r=null===n||void 0===n?void 0:n.caseInsensitive)&&void 0!==r&&r;for(const i of e){const e=this.caseInsensitive?i.name.toLowerCase():i.name;this.elements.set(e,i)}this.outerScope=t}getElement(e){const t=this.caseInsensitive?e.toLowerCase():e,n=this.elements.get(t);return n||(this.outerScope?this.outerScope.getElement(e):void 0)}getAllElements(){let e=(0,Yt.Td)(this.elements.values());return this.outerScope&&(e=e.concat(this.outerScope.getAllElements())),e}}class Mn{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")}}class Dn extends Mn{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){const n=t();return this.cache.set(e,n),n}}delete(e){return this.throwIfDisposed(),this.cache.delete(e)}clear(){this.throwIfDisposed(),this.cache.clear()}}class Un extends Mn{constructor(e){super(),this.cache=new Map,this.converter=null!==e&&void 0!==e?e:e=>e}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();const r=this.cacheForContext(e);if(r.has(t))return r.get(t);if(n){const e=n();return r.set(t,e),e}}delete(e,t){return this.throwIfDisposed(),this.cacheForContext(e).delete(t)}clear(e){if(this.throwIfDisposed(),e){const t=this.converter(e);this.cache.delete(t)}else this.cache.clear()}cacheForContext(e){const t=this.converter(e);let n=this.cache.get(t);return n||(n=new Map,this.cache.set(t,n)),n}}class Fn extends Dn{constructor(e,t){super(),t?(this.toDispose.push(e.workspace.DocumentBuilder.onBuildPhase(t,(()=>{this.clear()}))),this.toDispose.push(e.workspace.DocumentBuilder.onUpdate(((e,t)=>{t.length>0&&this.clear()})))):this.toDispose.push(e.workspace.DocumentBuilder.onUpdate((()=>{this.clear()})))}}class Gn{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 Fn(e.shared)}getScope(e){const t=[],n=this.reflection.getReferenceType(e),r=(0,St.YE)(e.container).precomputedScopes;if(r){let i=e.container;do{const e=r.get(i);e.length>0&&t.push((0,Yt.Td)(e).filter((e=>this.reflection.isSubtype(e.type,n)))),i=i.$container}while(i)}let i=this.getGlobalScope(n,e);for(let s=t.length-1;s>=0;s--)i=this.createScope(t[s],i);return i}createScope(e,t,n){return new _n((0,Yt.Td)(e),t,n)}createScopeForNodes(e,t,n){const r=(0,Yt.Td)(e).map((e=>{const t=this.nameProvider.getName(e);if(t)return this.descriptions.createDescription(e,t)})).nonNullable();return new _n(r,t,n)}getGlobalScope(e,t){return this.globalScopeCache.get(e,(()=>new Pn(this.indexManager.allElements(e))))}}function Kn(e){return"object"===typeof e&&!!e&&("$ref"in e||"$error"in e)}class Bn{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){const n=null!==t&&void 0!==t?t:{},r=null===t||void 0===t?void 0:t.replacer,i=(e,t)=>this.replacer(e,t,n),s=r?(e,t)=>r(e,t,i):i;try{return this.currentDocument=(0,St.YE)(e),JSON.stringify(e,s,null===t||void 0===t?void 0:t.space)}finally{this.currentDocument=void 0}}deserialize(e,t){const n=null!==t&&void 0!==t?t:{},r=JSON.parse(e);return this.linkNode(r,r,n),r}replacer(e,t,n){let{refText:r,sourceText:i,textRegions:s,comments:a,uriConverter:o}=n;var c,l,u,d;if(!this.ignoreProperties.has(e)){if((0,cn.A_)(t)){const e=t.ref,n=r?t.$refText:void 0;if(e){const r=(0,St.YE)(e);let i="";this.currentDocument&&this.currentDocument!==r&&(i=o?o(r.uri,t):r.uri.toString());return{$ref:`${i}#${this.astNodeLocator.getAstNodePath(e)}`,$refText:n}}return{$error:null!==(l=null===(c=t.error)||void 0===c?void 0:c.message)&&void 0!==l?l:"Could not resolve reference",$refText:n}}if((0,cn.ng)(t)){let n;if(s&&(n=this.addAstNodeRegionWithAssignmentsTo(Object.assign({},t)),e&&!t.$document||!(null===n||void 0===n?void 0:n.$textRegion)||(n.$textRegion.documentURI=null===(u=this.currentDocument)||void 0===u?void 0:u.uri.toString())),i&&!e&&(null!==n&&void 0!==n||(n=Object.assign({},t)),n.$sourceText=null===(d=t.$cstNode)||void 0===d?void 0:d.text),a){null!==n&&void 0!==n||(n=Object.assign({},t));const e=this.commentProvider.getComment(t);e&&(n.$comment=e.replace(/\r/g,""))}return null!==n&&void 0!==n?n:t}return t}}addAstNodeRegionWithAssignmentsTo(e){const t=e=>({offset:e.offset,end:e.end,length:e.length,range:e.range});if(e.$cstNode){const n=(e.$textRegion=t(e.$cstNode)).assignments={};return Object.keys(e).filter((e=>!e.startsWith("$"))).forEach((r=>{const s=(0,i.Bd)(e.$cstNode,r).map(t);0!==s.length&&(n[r]=s)})),e}}linkNode(e,t,n,r,i,s){for(const[o,c]of Object.entries(e))if(Array.isArray(c))for(let r=0;r1&&void 0!==arguments[1]?arguments[1]:this,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:"fast";if("built-in"===n)throw new Error("The 'built-in' category is reserved for lexer, parser, and linker errors.");for(const[r,i]of Object.entries(e)){const e=i;if(Array.isArray(e))for(const i of e){const e={check:this.wrapValidationException(i,t),category:n};this.addEntry(r,e)}else if("function"===typeof e){const i={check:this.wrapValidationException(e,t),category:n};this.addEntry(r,i)}else(0,zt.d)(e)}}wrapValidationException(e,t){return async(n,r,i)=>{await this.handleException((()=>e.call(t,n,r,i)),"An error occurred during validation",r,n)}}async handleException(e,t,n,r){try{await e()}catch(i){if(hn(i))throw i;console.error(`${t}:`,i),i instanceof Error&&i.stack&&console.error(i.stack);n("error",`${t}: ${i instanceof Error?i.message:String(i)}`,{node:r})}}addEntry(e,t){if("AstNode"!==e)for(const n of this.reflection.getAllSubTypes(e))this.entries.add(n,t);else this.entries.add("AstNode",t)}getChecks(e,t){let n=(0,Yt.Td)(this.entries.get(e)).concat(this.entries.get("AstNode"));return t&&(n=n.filter((e=>t.includes(e.category)))),n.map((e=>e.check))}registerBeforeDocument(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this;this.entriesBefore.push(this.wrapPreparationException(e,"An error occurred during set-up of the validation",t))}registerAfterDocument(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this;this.entriesAfter.push(this.wrapPreparationException(e,"An error occurred during tear-down of the validation",t))}wrapPreparationException(e,t,n){return async(r,i,s,a)=>{await this.handleException((()=>e.call(n,r,i,s,a)),t,i,r)}}get checksBefore(){return this.entriesBefore}get checksAfter(){return this.entriesAfter}}class Yn{constructor(e){this.validationRegistry=e.validation.ValidationRegistry,this.metadata=e.LanguageMetaData}async validateDocument(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:on.XO.None;const r=e.parseResult,i=[];if(await fn(n),!t.categories||t.categories.includes("built-in")){if(this.processLexingErrors(r,i,t),t.stopAfterLexingErrors&&i.some((e=>{var t;return(null===(t=e.data)||void 0===t?void 0:t.code)===Wn.LexingError})))return i;if(this.processParsingErrors(r,i,t),t.stopAfterParsingErrors&&i.some((e=>{var t;return(null===(t=e.data)||void 0===t?void 0:t.code)===Wn.ParsingError})))return i;if(this.processLinkingErrors(e,i,t),t.stopAfterLinkingErrors&&i.some((e=>{var t;return(null===(t=e.data)||void 0===t?void 0:t.code)===Wn.LinkingError})))return i}try{i.push(...await this.validateAst(r.value,t,n))}catch(s){if(hn(s))throw s;console.error("An error occurred during validation:",s)}return await fn(n),i}processLexingErrors(e,t,n){var r,i,s;const a=[...e.lexerErrors,...null!==(i=null===(r=e.lexerReport)||void 0===r?void 0:r.diagnostics)&&void 0!==i?i:[]];for(const o of a){const e=null!==(s=o.severity)&&void 0!==s?s:"error",n={severity:qn(e),range:{start:{line:o.line-1,character:o.column-1},end:{line:o.line-1,character:o.column+o.length-1}},message:o.message,data:Qn(e),source:this.getSource()};t.push(n)}}processParsingErrors(e,t,n){for(const i of e.parserErrors){let e;if(isNaN(i.token.startOffset)){if("previousToken"in i){const t=i.previousToken;if(isNaN(t.startOffset)){const t={line:0,character:0};e={start:t,end:t}}else{const n={line:t.endLine-1,character:t.endColumn};e={start:n,end:n}}}}else e=(0,r.wf)(i.token);if(e){const n={severity:qn("error"),range:e,message:i.message,data:Vn(Wn.ParsingError),source:this.getSource()};t.push(n)}}}processLinkingErrors(e,t,n){for(const r of e.references){const e=r.error;if(e){const n={node:e.container,property:e.property,index:e.index,data:{code:Wn.LinkingError,containerType:e.container.$type,property:e.property,refText:e.reference.$refText}};t.push(this.toDiagnostic("error",e.message,n))}}}async validateAst(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:on.XO.None;const r=[],i=(e,t,n)=>{r.push(this.toDiagnostic(e,t,n))};return await this.validateAstBefore(e,t,i,n),await this.validateAstNodes(e,t,i,n),await this.validateAstAfter(e,t,i,n),r}async validateAstBefore(e,t,n){let r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:on.XO.None;var i;const s=this.validationRegistry.checksBefore;for(const a of s)await fn(r),await a(e,n,null!==(i=t.categories)&&void 0!==i?i:[],r)}async validateAstNodes(e,t,n){let r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:on.XO.None;await Promise.all((0,St.jm)(e).map((async e=>{await fn(r);const i=this.validationRegistry.getChecks(e.$type,t.categories);for(const t of i)await t(e,n,r)})))}async validateAstAfter(e,t,n){let r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:on.XO.None;var i;const s=this.validationRegistry.checksAfter;for(const a of s)await fn(r),await a(e,n,null!==(i=t.categories)&&void 0!==i?i:[],r)}toDiagnostic(e,t,n){return{message:t,range:Xn(n),severity:qn(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 Xn(e){if(e.range)return e.range;let t;return"string"===typeof e.property?t=(0,i.qO)(e.node.$cstNode,e.property,e.index):"string"===typeof e.keyword&&(t=(0,i.SS)(e.node.$cstNode,e.keyword,e.index)),null!==t&&void 0!==t||(t=e.node.$cstNode),t?t.range:{start:{line:0,character:0},end:{line:0,character:0}}}function qn(e){switch(e){case"error":return 1;case"warning":return 2;case"info":return 3;case"hint":return 4;default:throw new Error("Invalid diagnostic severity: "+e)}}function Qn(e){switch(e){case"error":return Vn(Wn.LexingError);case"warning":return Vn(Wn.LexingWarning);case"info":return Vn(Wn.LexingInfo);case"hint":return Vn(Wn.LexingHint);default:throw new Error("Invalid diagnostic severity: "+e)}}!function(e){e.LexingError="lexing-error",e.LexingWarning="lexing-warning",e.LexingInfo="lexing-info",e.LexingHint="lexing-hint",e.ParsingError="parsing-error",e.LinkingError="linking-error"}(Wn||(Wn={}));class Zn{constructor(e){this.astNodeLocator=e.workspace.AstNodeLocator,this.nameProvider=e.references.NameProvider}createDescription(e,t,n){const i=null!==n&&void 0!==n?n:(0,St.YE)(e);null!==t&&void 0!==t||(t=this.nameProvider.getName(e));const s=this.astNodeLocator.getAstNodePath(e);if(!t)throw new Error(`Node at path ${s} has no name.`);let a;const o=()=>{var t;return null!==a&&void 0!==a?a:a=(0,r.SX)(null!==(t=this.nameProvider.getNameNode(e))&&void 0!==t?t:e.$cstNode)};return{node:e,name:t,get nameSegment(){return o()},selectionSegment:(0,r.SX)(e.$cstNode),type:e.$type,documentUri:i.uri,path:s}}}class Jn{constructor(e){this.nodeLocator=e.workspace.AstNodeLocator}async createDescriptions(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:on.XO.None;const n=[],r=e.parseResult.value;for(const i of(0,St.jm)(r))await fn(t),(0,St.DM)(i).filter((e=>!(0,cn.Zl)(e))).forEach((e=>{const t=this.createDescription(e);t&&n.push(t)}));return n}createDescription(e){const t=e.reference.$nodeDescription,n=e.reference.$refNode;if(!t||!n)return;const i=(0,St.YE)(e.container).uri;return{sourceUri:i,sourcePath:this.nodeLocator.getAstNodePath(e.container),targetUri:t.documentUri,targetPath:t.path,segment:(0,r.SX)(n),local:wn.equals(t.documentUri,i)}}}class er{constructor(){this.segmentSeparator="/",this.indexSeparator="@"}getAstNodePath(e){if(e.$container){const t=this.getAstNodePath(e.$container),n=this.getPathSegment(e);return t+this.segmentSeparator+n}return""}getPathSegment(e){let{$containerProperty:t,$containerIndex:n}=e;if(!t)throw new Error("Missing '$containerProperty' in AST node.");return void 0!==n?t+this.indexSeparator+n:t}getAstNode(e,t){return t.split(this.segmentSeparator).reduce(((e,t)=>{if(!e||0===t.length)return e;const n=t.indexOf(this.indexSeparator);if(n>0){const r=t.substring(0,n),i=parseInt(t.substring(n+1)),s=e[r];return null===s||void 0===s?void 0:s[i]}return e[t]}),e)}}var tr,nr=n(8377);class rr{constructor(e){this._ready=new pn,this.settings={},this.workspaceConfig=!1,this.onConfigurationSectionUpdateEmitter=new nr.Emitter,this.serviceRegistry=e.ServiceRegistry}get ready(){return this._ready.promise}initialize(e){var t,n;this.workspaceConfig=null!==(n=null===(t=e.capabilities.workspace)||void 0===t?void 0:t.configuration)&&void 0!==n&&n}async initialized(e){if(this.workspaceConfig){if(e.register){const t=this.serviceRegistry.all;e.register({section:t.map((e=>this.toSectionName(e.LanguageMetaData.languageId)))})}if(e.fetchConfiguration){const t=this.serviceRegistry.all.map((e=>({section:this.toSectionName(e.LanguageMetaData.languageId)}))),n=await e.fetchConfiguration(t);t.forEach(((e,t)=>{this.updateSectionConfiguration(e.section,n[t])}))}}this._ready.resolve()}updateConfiguration(e){e.settings&&Object.keys(e.settings).forEach((t=>{const 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;const n=this.toSectionName(e);if(this.settings[n])return this.settings[n][t]}toSectionName(e){return`${e}`}get onConfigurationSectionUpdate(){return this.onConfigurationSectionUpdateEmitter.event}}!function(e){e.create=function(e){return{dispose:async()=>await e()}}}(tr||(tr={}));class ir{constructor(e){this.updateBuildOptions={validation:{categories:["built-in","fast"]}},this.updateListeners=[],this.buildPhaseListeners=new Ln,this.documentPhaseListeners=new Ln,this.buildState=new Map,this.documentBuildWaiters=new Map,this.currentState=En.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){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:on.XO.None;var r,i;for(const s of e){const e=s.uri.toString();if(s.state===En.Validated){if("boolean"===typeof t.validation&&t.validation)s.state=En.IndexedReferences,s.diagnostics=void 0,this.buildState.delete(e);else if("object"===typeof t.validation){const n=this.buildState.get(e),a=null===(r=null===n||void 0===n?void 0:n.result)||void 0===r?void 0:r.validationChecks;if(a){const r=(null!==(i=t.validation.categories)&&void 0!==i?i:Hn.all).filter((e=>!a.includes(e)));r.length>0&&(this.buildState.set(e,{completed:!1,options:{validation:Object.assign(Object.assign({},t.validation),{categories:r})},result:n.result}),s.state=En.IndexedReferences)}}}else this.buildState.delete(e)}this.currentState=En.Changed,await this.emitUpdate(e.map((e=>e.uri)),[]),await this.buildDocuments(e,t,n)}async update(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:on.XO.None;this.currentState=En.Changed;for(const s of t)this.langiumDocuments.deleteDocument(s),this.buildState.delete(s.toString()),this.indexManager.remove(s);for(const s of e){if(!this.langiumDocuments.invalidateDocument(s)){const e=this.langiumDocumentFactory.fromModel({$type:"INVALID"},s);e.state=En.Changed,this.langiumDocuments.addDocument(e)}this.buildState.delete(s.toString())}const r=(0,Yt.Td)(e).concat(t).map((e=>e.toString())).toSet();this.langiumDocuments.all.filter((e=>!r.has(e.uri.toString())&&this.shouldRelink(e,r))).forEach((e=>{this.serviceRegistry.getServices(e.uri).references.Linker.unlink(e),e.state=Math.min(e.state,En.ComputedScopes),e.diagnostics=void 0})),await this.emitUpdate(e,t),await fn(n);const i=this.sortDocuments(this.langiumDocuments.all.filter((e=>{var t;return e.staten(e,t))))}sortDocuments(e){let t=0,n=e.length-1;for(;t=0&&!this.hasTextDocument(e[n]);)n--;tvoid 0!==e.error))||this.indexManager.isAffected(e,t)}onUpdate(e){return this.updateListeners.push(e),tr.create((()=>{const 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,En.Parsed,n,(e=>this.langiumDocumentFactory.update(e,n))),await this.runCancelable(e,En.IndexedContent,n,(e=>this.indexManager.updateContent(e,n))),await this.runCancelable(e,En.ComputedScopes,n,(async e=>{const t=this.serviceRegistry.getServices(e.uri).references.ScopeComputation;e.precomputedScopes=await t.computeLocalScopes(e,n)})),await this.runCancelable(e,En.Linked,n,(e=>this.serviceRegistry.getServices(e.uri).references.Linker.link(e,n))),await this.runCancelable(e,En.IndexedReferences,n,(e=>this.indexManager.updateReferences(e,n)));const r=e.filter((e=>this.shouldValidate(e)));await this.runCancelable(r,En.Validated,n,(e=>this.validate(e,n)));for(const i of e){const e=this.buildState.get(i.uri.toString());e&&(e.completed=!0)}}prepareBuild(e,t){for(const n of e){const e=n.uri.toString(),r=this.buildState.get(e);r&&!r.completed||this.buildState.set(e,{completed:!1,options:t,result:null===r||void 0===r?void 0:r.result})}}async runCancelable(e,t,n,r){const i=e.filter((e=>e.statee.state===t));await this.notifyBuildPhase(s,t,n),this.currentState=t}onBuildPhase(e,t){return this.buildPhaseListeners.add(e,t),tr.create((()=>{this.buildPhaseListeners.delete(e,t)}))}onDocumentPhase(e,t){return this.documentPhaseListeners.add(e,t),tr.create((()=>{this.documentPhaseListeners.delete(e,t)}))}waitUntil(e,t,n){let r;if(t&&"path"in t?r=t:n=t,null!==n&&void 0!==n||(n=on.XO.None),r){const t=this.langiumDocuments.getDocument(r);if(t&&t.state>e)return Promise.resolve(r)}return this.currentState>=e?Promise.resolve(void 0):n.isCancellationRequested?Promise.reject(dn):new Promise(((t,i)=>{const s=this.onBuildPhase(e,(()=>{if(s.dispose(),a.dispose(),r){const e=this.langiumDocuments.getDocument(r);t(null===e||void 0===e?void 0:e.uri)}else t(void 0)})),a=n.onCancellationRequested((()=>{s.dispose(),a.dispose(),i(dn)}))}))}async notifyDocumentPhase(e,t,n){const r=this.documentPhaseListeners.get(t).slice();for(const s of r)try{await s(e,n)}catch(i){if(!hn(i))throw i}}async notifyBuildPhase(e,t,n){if(0===e.length)return;const r=this.buildPhaseListeners.get(t).slice();for(const i of r)await fn(n),await i(e,n)}shouldValidate(e){return Boolean(this.getBuildOptions(e).validation)}async validate(e,t){var n,r;const i=this.serviceRegistry.getServices(e.uri).validation.DocumentValidator,s=this.getBuildOptions(e).validation,a="object"===typeof s?s:void 0,o=await i.validateDocument(e,a,t);e.diagnostics?e.diagnostics.push(...o):e.diagnostics=o;const c=this.buildState.get(e.uri.toString());if(c){null!==(n=c.result)&&void 0!==n||(c.result={});const e=null!==(r=null===a||void 0===a?void 0:a.categories)&&void 0!==r?r:Hn.all;c.result.validationChecks?c.result.validationChecks.push(...e):c.result.validationChecks=[...e]}}getBuildOptions(e){var t,n;return null!==(n=null===(t=this.buildState.get(e.uri.toString()))||void 0===t?void 0:t.options)&&void 0!==n?n:{}}}class sr{constructor(e){this.symbolIndex=new Map,this.symbolByTypeIndex=new Un,this.referenceIndex=new Map,this.documents=e.workspace.LangiumDocuments,this.serviceRegistry=e.ServiceRegistry,this.astReflection=e.AstReflection}findAllReferences(e,t){const n=(0,St.YE)(e).uri,r=[];return this.referenceIndex.forEach((e=>{e.forEach((e=>{wn.equals(e.targetUri,n)&&e.targetPath===t&&r.push(e)}))})),(0,Yt.Td)(r)}allElements(e,t){let n=(0,Yt.Td)(this.symbolIndex.keys());return t&&(n=n.filter((e=>!t||t.has(e)))),n.map((t=>this.getFileDescriptions(t,e))).flat()}getFileDescriptions(e,t){var n;if(!t)return null!==(n=this.symbolIndex.get(e))&&void 0!==n?n:[];const r=this.symbolByTypeIndex.get(e,t,(()=>{var n;return(null!==(n=this.symbolIndex.get(e))&&void 0!==n?n:[]).filter((e=>this.astReflection.isSubtype(e.type,t)))}));return r}remove(e){const t=e.toString();this.symbolIndex.delete(t),this.symbolByTypeIndex.clear(t),this.referenceIndex.delete(t)}async updateContent(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:on.XO.None;const n=this.serviceRegistry.getServices(e.uri),r=await n.references.ScopeComputation.computeExports(e,t),i=e.uri.toString();this.symbolIndex.set(i,r),this.symbolByTypeIndex.clear(i)}async updateReferences(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:on.XO.None;const n=this.serviceRegistry.getServices(e.uri),r=await n.workspace.ReferenceDescriptionProvider.createDescriptions(e,t);this.referenceIndex.set(e.uri.toString(),r)}isAffected(e,t){const n=this.referenceIndex.get(e.uri.toString());return!!n&&n.some((e=>!e.local&&t.has(e.targetUri.toString())))}}class ar{constructor(e){this.initialBuildOptions={},this._ready=new pn,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=null!==(t=e.workspaceFolders)&&void 0!==t?t:void 0}initialized(e){return this.mutex.write((e=>{var t;return this.initializeWorkspace(null!==(t=this.folders)&&void 0!==t?t:[],e)}))}async initializeWorkspace(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:on.XO.None;const n=await this.performStartup(e);await fn(t),await this.documentBuilder.build(n,this.initialBuildOptions,t)}async performStartup(e){const t=this.serviceRegistry.all.flatMap((e=>e.LanguageMetaData.fileExtensions)),n=[],r=e=>{n.push(e),this.langiumDocuments.hasDocument(e.uri)||this.langiumDocuments.addDocument(e)};return await this.loadAdditionalDocuments(e,r),await Promise.all(e.map((e=>[e,this.getRootFolder(e)])).map((async e=>this.traverseFolder(...e,t,r)))),this._ready.resolve(),n}loadAdditionalDocuments(e,t){return Promise.resolve()}getRootFolder(e){return kn.r.parse(e.uri)}async traverseFolder(e,t,n,r){const i=await this.fileSystemProvider.readDirectory(t);await Promise.all(i.map((async t=>{if(this.includeEntry(e,t,n))if(t.isDirectory)await this.traverseFolder(e,t.uri,n,r);else if(t.isFile){const e=await this.langiumDocuments.getOrCreateDocument(t.uri);r(e)}})))}includeEntry(e,t,n){const r=wn.basename(t.uri);if(r.startsWith("."))return!1;if(t.isDirectory)return"node_modules"!==r&&"out"!==r;if(t.isFile){const e=wn.extname(t.uri);return n.includes(e)}return!1}}class or{buildUnexpectedCharactersMessage(e,t,n,r,i){return o.PW.buildUnexpectedCharactersMessage(e,t,n,r,i)}buildUnableToPopLexerModeMessage(e){return o.PW.buildUnableToPopLexerModeMessage(e)}}class cr{constructor(e){this.errorMessageProvider=e.parser.LexerErrorMessageProvider,this.tokenBuilder=e.parser.TokenBuilder;const t=this.tokenBuilder.buildTokens(e.Grammar,{caseInsensitive:e.LanguageMetaData.caseInsensitive});this.tokenTypes=this.toTokenTypeDictionary(t);const n=ur(t)?Object.values(t):t,r="production"===e.LanguageMetaData.mode;this.chevrotainLexer=new o.JG(n,{positionTracking:"full",skipValidations:r,errorMessageProvider:this.errorMessageProvider})}get definition(){return this.tokenTypes}tokenize(e){var t,n,r;const i=this.chevrotainLexer.tokenize(e);return{tokens:i.tokens,errors:i.errors,hidden:null!==(t=i.groups.hidden)&&void 0!==t?t:[],report:null===(r=(n=this.tokenBuilder).flushLexingReport)||void 0===r?void 0:r.call(n,e)}}toTokenTypeDictionary(e){if(ur(e))return e;const t=lr(e)?Object.values(e.modes).flat():e,n={};return t.forEach((e=>n[e.name]=e)),n}}function lr(e){return e&&"modes"in e&&"defaultMode"in e}function ur(e){return!function(e){return Array.isArray(e)&&(0===e.length||"name"in e[0])}(e)&&!lr(e)}function dr(e,t,n){let r,i;"string"===typeof e?(i=t,r=n):(i=e.range.start,r=t),i||(i=oe.create(0,0));const s=function(e){var t,n,r;const i=[];let s=e.position.line,a=e.position.character;for(let o=0;o=u.length){if(i.length>0){const e=oe.create(s,a);i.push({type:"break",content:"",range:ce.create(e,e)})}}else{fr.lastIndex=d;const e=fr.exec(u);if(e){const t=e[0],n=e[1],r=oe.create(s,a+d),o=oe.create(s,a+d+t.length);i.push({type:"tag",content:n,range:ce.create(r,o)}),d+=t.length,d=vr(u,d)}if(d0&&"break"===i[i.length-1].type)return i.slice(0,-1);return i}({lines:hr(e),position:i,options:xr(r)});return function(e){var t,n,r,i;const s=oe.create(e.position.line,e.position.character);if(0===e.tokens.length)return new Sr([],ce.create(s,s));const a=[];for(;e.index0&&i.push({type:"text",content:t.substring(s,e),range:ce.create(oe.create(n,s+r),oe.create(n,e+r))});let c=a.length+1;const l=o[1];if(i.push({type:"inline-tag",content:l,range:ce.create(oe.create(n,s+c+r),oe.create(n,s+c+l.length+r))}),c+=l.length,4===o.length){c+=o[2].length;const e=o[3];i.push({type:"text",content:e,range:ce.create(oe.create(n,s+c+r),oe.create(n,s+c+e.length+r))})}else i.push({type:"text",content:"",range:ce.create(oe.create(n,s+c+r),oe.create(n,s+c+r))});s=e+o[0].length}const a=t.substring(s);a.length>0&&i.push({type:"text",content:a,range:ce.create(oe.create(n,s+r),oe.create(n,s+r+a.length))})}return i}const gr=/\S/,yr=/\s*$/;function vr(e,t){const n=e.substring(t).match(gr);return n?t+n.index:e.length}function Ar(e){const t=e.match(yr);if(t&&"number"===typeof t.index)return t.index}function Tr(e,t){const n=e.tokens[e.index];return"tag"===n.type?kr(e,!1):"text"===n.type||"inline-tag"===n.type?Rr(e):(function(e,t){if(t){const n=new Cr("",e.range);"inlines"in t?t.inlines.push(n):t.content.inlines.push(n)}}(n,t),void e.index++)}function Rr(e){let t=e.tokens[e.index];const n=t;let r=t;const i=[];for(;t&&"break"!==t.type&&"tag"!==t.type;)i.push(Er(e)),r=t,t=e.tokens[e.index];return new wr(i,ce.create(n.range.start,r.range.end))}function Er(e){return"inline-tag"===e.tokens[e.index].type?kr(e,!0):$r(e)}function kr(e,t){const n=e.tokens[e.index++],r=n.content.substring(1),i=e.tokens[e.index];if("text"===(null===i||void 0===i?void 0:i.type)){if(t){const i=$r(e);return new Nr(r,new wr([i],i.range),t,ce.create(n.range.start,i.range.end))}{const i=Rr(e);return new Nr(r,i,t,ce.create(n.range.start,i.range.end))}}{const e=n.range;return new Nr(r,new wr([],e),t,e)}}function $r(e){const t=e.tokens[e.index++];return new Cr(t.content,t.range)}function xr(e){if(!e)return xr({start:"/**",end:"*/",line:"*"});const{start:t,end:n,line:r}=e;return{start:Ir(t,!0),end:Ir(n,!1),line:Ir(r,!0)}}function Ir(e,t){if("string"===typeof e||"object"===typeof e){const n="string"===typeof e?(0,s.Nt)(e):e.source;return t?new RegExp(`^\\s*${n}`):new RegExp(`\\s*${n}\\s*$`)}return e}class Sr{constructor(e,t){this.elements=e,this.range=t}getTag(e){return this.getAllTags().find((t=>t.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(const t of this.elements)if(0===e.length)e=t.toString();else{const n=t.toString();e+=Lr(e)+n}return e.trim()}toMarkdown(e){let t="";for(const n of this.elements)if(0===t.length)t=n.toMarkdown(e);else{const r=n.toMarkdown(e);t+=Lr(t)+r}return t.trim()}}class Nr{constructor(e,t,n,r){this.name=e,this.content=t,this.inline=n,this.range=r}toString(){let e=`@${this.name}`;const t=this.content.toString();return 1===this.content.inlines.length?e=`${e} ${t}`:this.content.inlines.length>1&&(e=`${e}\n${t}`),this.inline?`{${e}}`:e}toMarkdown(e){var t,n;return null!==(n=null===(t=null===e||void 0===e?void 0:e.renderTag)||void 0===t?void 0:t.call(e,this))&&void 0!==n?n:this.toMarkdownDefault(e)}toMarkdownDefault(e){const t=this.content.toMarkdown(e);if(this.inline){const n=function(e,t,n){var r,i;if("linkplain"===e||"linkcode"===e||"link"===e){const s=t.indexOf(" ");let a=t;if(s>0){const e=vr(t,s);a=t.substring(e),t=t.substring(0,s)}("linkcode"===e||"link"===e&&"code"===n.link)&&(a=`\`${a}\``);const o=null!==(i=null===(r=n.renderLink)||void 0===r?void 0:r.call(n,t,a))&&void 0!==i?i:function(e,t){try{return kn.r.parse(e,!0),`[${t}](${e})`}catch(r){return e}}(t,a);return o}return}(this.name,t,null!==e&&void 0!==e?e:{});if("string"===typeof n)return n}let n="";"italic"===(null===e||void 0===e?void 0:e.tag)||void 0===(null===e||void 0===e?void 0:e.tag)?n="*":"bold"===(null===e||void 0===e?void 0:e.tag)?n="**":"bold-italic"===(null===e||void 0===e?void 0:e.tag)&&(n="***");let r=`${n}@${this.name}${n}`;return 1===this.content.inlines.length?r=`${r} \u2014 ${t}`:this.content.inlines.length>1&&(r=`${r}\n${t}`),this.inline?`{${r}}`:r}}class wr{constructor(e,t){this.inlines=e,this.range=t}toString(){let e="";for(let t=0;tn.range.start.line&&(e+="\n")}return e}toMarkdown(e){let t="";for(let n=0;nr.range.start.line&&(t+="\n")}return t}}class Cr{constructor(e,t){this.text=e,this.range=t}toString(){return this.text}toMarkdown(){return this.text}}function Lr(e){return e.endsWith("\n")?"\n":"\n\n"}class br{constructor(e){this.indexManager=e.shared.workspace.IndexManager,this.commentProvider=e.documentation.CommentProvider}getDocumentation(e){const t=this.commentProvider.getComment(e);if(t&&function(e,t){const n=xr(t),r=hr(e);if(0===r.length)return!1;const i=r[0],s=r[r.length-1],a=n.start,o=n.end;return Boolean(null===a||void 0===a?void 0:a.exec(i))&&Boolean(null===o||void 0===o?void 0:o.exec(s))}(t)){return dr(t).toMarkdown({renderLink:(t,n)=>this.documentationLinkRenderer(e,t,n),renderTag:t=>this.documentationTagRenderer(e,t)})}}documentationLinkRenderer(e,t,n){var r;const i=null!==(r=this.findNameInPrecomputedScopes(e,t))&&void 0!==r?r:this.findNameInGlobalScope(e,t);if(i&&i.nameSegment){const e=i.nameSegment.range.start.line+1,t=i.nameSegment.range.start.character+1;return`[${n}](${i.documentUri.with({fragment:`L${e},${t}`}).toString()})`}}documentationTagRenderer(e,t){}findNameInPrecomputedScopes(e,t){const n=(0,St.YE)(e).precomputedScopes;if(!n)return;let r=e;do{const e=n.get(r).find((e=>e.name===t));if(e)return e;r=r.$container}while(r)}findNameInGlobalScope(e,t){return this.indexManager.allElements().find((e=>e.name===t))}}class Or{constructor(e){this.grammarConfig=()=>e.parser.GrammarConfig}getComment(e){var t;return function(e){return"string"===typeof e.$comment}(e)?e.$comment:null===(t=(0,r.v)(e.$cstNode,this.grammarConfig().multilineCommentRules))||void 0===t?void 0:t.text}}class _r{constructor(e){this.syncParser=e.parser.LangiumParser}parse(e,t){return Promise.resolve(this.syncParser.parse(e))}}class Pr{constructor(){this.previousTokenSource=new on.Qi,this.writeQueue=[],this.readQueue=[],this.done=!0}write(e){this.cancelWrite();const t=(ln=performance.now(),new on.Qi);return this.previousTokenSource=t,this.enqueue(this.writeQueue,e,t.token)}read(e){return this.enqueue(this.readQueue,e)}enqueue(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:on.XO.None;const r=new pn,i={action:t,deferred:r,cancellationToken:n};return e.push(i),this.performNextOperation(),r.promise}async performNextOperation(){if(!this.done)return;const e=[];if(this.writeQueue.length>0)e.push(this.writeQueue.shift());else{if(!(this.readQueue.length>0))return;e.push(...this.readQueue.splice(0,this.readQueue.length))}this.done=!1,await Promise.all(e.map((async e=>{let{action:t,deferred:n,cancellationToken:r}=e;try{const e=await Promise.resolve().then((()=>t(r)));n.resolve(e)}catch(i){hn(i)?n.resolve(void 0):n.reject(i)}}))),this.done=!0,this.performNextOperation()}cancelWrite(){this.previousTokenSource.cancel()}}class Mr{constructor(e){this.grammarElementIdMap=new bn,this.tokenTypeIdMap=new bn,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((e=>Object.assign(Object.assign({},e),{message:e.message}))),value:this.dehydrateAstNode(e.value,this.createDehyrationContext(e.value))}}dehydrateLexerReport(e){return e}createDehyrationContext(e){const t=new Map,n=new Map;for(const r of(0,St.jm)(e))t.set(r,{});if(e.$cstNode)for(const i of(0,r.NS)(e.$cstNode))n.set(i,{});return{astNodes:t,cstNodes:n}}dehydrateAstNode(e,t){const n=t.astNodes.get(e);n.$type=e.$type,n.$containerIndex=e.$containerIndex,n.$containerProperty=e.$containerProperty,void 0!==e.$cstNode&&(n.$cstNode=this.dehydrateCstNode(e.$cstNode,t));for(const[r,i]of Object.entries(e))if(!r.startsWith("$"))if(Array.isArray(i)){const e=[];n[r]=e;for(const n of i)(0,cn.ng)(n)?e.push(this.dehydrateAstNode(n,t)):(0,cn.A_)(n)?e.push(this.dehydrateReference(n,t)):e.push(n)}else(0,cn.ng)(i)?n[r]=this.dehydrateAstNode(i,t):(0,cn.A_)(i)?n[r]=this.dehydrateReference(i,t):void 0!==i&&(n[r]=i);return n}dehydrateReference(e,t){const n={};return n.$refText=e.$refText,e.$refNode&&(n.$refNode=t.cstNodes.get(e.$refNode)),n}dehydrateCstNode(e,t){const n=t.cstNodes.get(e);return(0,cn.br)(e)?n.fullText=e.fullText:n.grammarSource=this.getGrammarElementId(e.grammarSource),n.hidden=e.hidden,n.astNode=t.astNodes.get(e.astNode),(0,cn.mD)(e)?n.content=e.content.map((e=>this.dehydrateCstNode(e,t))):(0,cn.FC)(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){const 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){const t=new Map,n=new Map;for(const r of(0,St.jm)(e))t.set(r,{});let i;if(e.$cstNode)for(const s of(0,r.NS)(e.$cstNode)){let e;"fullText"in s?(e=new Mt(s.fullText),i=e):"content"in s?e=new _t:"tokenType"in s&&(e=this.hydrateCstLeafNode(s)),e&&(n.set(s,e),e.root=i)}return{astNodes:t,cstNodes:n}}hydrateAstNode(e,t){const 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(const[r,i]of Object.entries(e))if(!r.startsWith("$"))if(Array.isArray(i)){const e=[];n[r]=e;for(const s of i)(0,cn.ng)(s)?e.push(this.setParent(this.hydrateAstNode(s,t),n)):(0,cn.A_)(s)?e.push(this.hydrateReference(s,n,r,t)):e.push(s)}else(0,cn.ng)(i)?n[r]=this.setParent(this.hydrateAstNode(i,t),n):(0,cn.A_)(i)?n[r]=this.hydrateReference(i,n,r,t):void 0!==i&&(n[r]=i);return n}setParent(e,t){return e.$container=t,e}hydrateReference(e,t,n,r){return this.linker.buildReference(t,n,r.cstNodes.get(e.$refNode),e.$refText)}hydrateCstNode(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;const r=t.cstNodes.get(e);if("number"===typeof e.grammarSource&&(r.grammarSource=this.getGrammarElement(e.grammarSource)),r.astNode=t.astNodes.get(e.astNode),(0,cn.mD)(r))for(const i of e.content){const e=this.hydrateCstNode(i,t,n++);r.content.push(e)}return r}hydrateCstLeafNode(e){const t=this.getTokenType(e.tokenType),n=e.offset,r=e.length,i=e.startLine,s=e.startColumn,a=e.endLine,o=e.endColumn,c=e.hidden;return new Ot(n,r,{start:{line:i,character:s},end:{line:a,character:o}},t,c)}getTokenType(e){return this.lexer.definition[e]}getGrammarElementId(e){if(e)return 0===this.grammarElementIdMap.size&&this.createGrammarElementIdMap(),this.grammarElementIdMap.get(e)}getGrammarElement(e){0===this.grammarElementIdMap.size&&this.createGrammarElementIdMap();return this.grammarElementIdMap.getKey(e)}createGrammarElementIdMap(){let e=0;for(const t of(0,St.jm)(this.grammar))(0,a.r1)(t)&&this.grammarElementIdMap.set(t,e++)}}function Dr(e){return{documentation:{CommentProvider:e=>new Or(e),DocumentationProvider:e=>new br(e)},parser:{AsyncParser:e=>new _r(e),GrammarConfig:e=>function(e){const t=[],n=e.Grammar;for(const r of n.rules)(0,a.rE)(r)&&(0,i.eb)(r)&&(0,s.lU)((0,i.S)(r))&&t.push(r.name);return{multilineCommentRules:t,nameRegexp:r.El}}(e),LangiumParser:e=>rn(e),CompletionParser:e=>function(e){const t=e.Grammar,n=e.parser.Lexer,r=new Vt(e);return Xt(t,r,n.definition),r.finalize(),r}(e),ValueConverter:()=>new an.d,TokenBuilder:()=>new sn.Q,Lexer:e=>new cr(e),ParserErrorMessageProvider:()=>new jt,LexerErrorMessageProvider:()=>new or},workspace:{AstNodeLocator:()=>new er,AstNodeDescriptionProvider:e=>new Zn(e),ReferenceDescriptionProvider:e=>new Jn(e)},references:{Linker:e=>new Sn(e),NameProvider:()=>new Nn,ScopeProvider:e=>new Gn(e),ScopeComputation:e=>new On(e),References:e=>new Cn(e)},serializer:{Hydrator:e=>new Mr(e),JsonSerializer:e=>new Bn(e)},validation:{DocumentValidator:e=>new Yn(e),ValidationRegistry:e=>new zn(e)},shared:()=>e.shared}}function Ur(e){return{ServiceRegistry:e=>new jn(e),workspace:{LangiumDocuments:e=>new xn(e),LangiumDocumentFactory:e=>new $n(e),DocumentBuilder:e=>new ir(e),IndexManager:e=>new sr(e),WorkspaceManager:e=>new ar(e),FileSystemProvider:t=>e.fileSystemProvider(t),WorkspaceLock:()=>new Pr,ConfigurationProvider:e=>new rr(e)}}}},2080:(e,t,n)=>{n.d(t,{A:()=>s});var r=n(7545),i=n(8293);const s=function(e,t){return(0,r.A)((0,i.A)(e,t),1)}},2502:(e,t,n)=>{n.d(t,{f:()=>l});var r=n(1584),i=n(4016),s=n(5813),a=n(1808),o=class extends r.mR{static#e=(()=>(0,r.K2)(this,"RadarTokenBuilder"))();constructor(){super(["radar-beta"])}},c={parser:{TokenBuilder:(0,r.K2)((()=>new o),"TokenBuilder"),ValueConverter:(0,r.K2)((()=>new r.Tm),"ValueConverter")}};function l(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:i.D;const t=(0,s.WQ)((0,a.u)(e),r.sr),n=(0,s.WQ)((0,a.t)({shared:t}),r.YP,c);return t.ServiceRegistry.register(n),{shared:t,Radar:n}}(0,r.K2)(l,"createRadarServices")},2544:(e,t,n)=>{n.d(t,{A:()=>i});var r=n(2791);const i=function(e,t,n){for(var i=-1,s=e.length;++i{n.d(t,{Ao:()=>h,Nt:()=>d,PC:()=>f,TH:()=>i,Yv:()=>u,lU:()=>c});var r=n(68);const i=/\r?\n/gm,s=new r.H;class a extends r.z{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){const t=String.fromCharCode(e.value);if(this.multiline||"\n"!==t||(this.multiline=!0),e.quantifier)this.isStarting=!1,this.endRegexpStack=[];else{const e=d(t);this.endRegexpStack.push(e),this.isStarting&&(this.startRegexp+=e)}}visitSet(e){if(!this.multiline){const t=this.regex.substring(e.loc.begin,e.loc.end),n=new RegExp(t);this.multiline=Boolean("\n".match(n))}if(e.quantifier)this.isStarting=!1,this.endRegexpStack=[];else{const t=this.regex.substring(e.loc.begin,e.loc.end);this.endRegexpStack.push(t),this.isStarting&&(this.startRegexp+=t)}}visitChildren(e){if("Group"===e.type){if(e.quantifier)return}super.visitChildren(e)}}const o=new a;function c(e){try{return"string"===typeof e&&(e=new RegExp(e)),e=e.toString(),o.reset(e),o.visit(s.pattern(e)),o.multiline}catch(t){return!1}}const l="\f\n\r\t\v \xa0\u1680\u2000\u2001\u2002\u2003\u2004\u2005\u2006\u2007\u2008\u2009\u200a\u2028\u2029\u202f\u205f\u3000\ufeff".split("");function u(e){const t="string"===typeof e?new RegExp(e):e;return l.some((e=>t.test(e)))}function d(e){return e.replace(/[.*+?^${}()|[\]\\]/g,"\\$&")}function h(e){return Array.prototype.map.call(e,(e=>/\w/.test(e)?`[${e.toLowerCase()}${e.toUpperCase()}]`:d(e))).join("")}function f(e,t){const n=function(e){"string"===typeof e&&(e=new RegExp(e));const t=e,n=e.source;let r=0;function i(){let e,s="";function a(e){s+=n.substr(r,e),r+=e}function o(e){s+="(?:"+n.substr(r,e)+"|$)",r+=e}for(;r",r)-r+1);break;default:o(2)}break;case"[":e=/\[(?:\\.|.)*?\]/g,e.lastIndex=r,e=e.exec(n)||[],o(e[0].length);break;case"|":case"^":case"$":case"*":case"+":case"?":a(1);break;case"{":e=/\{\d+,?\d*\}/g,e.lastIndex=r,e=e.exec(n),e?a(e[0].length):o(1);break;case"(":if("?"===n[r+1])switch(n[r+2]){case":":s+="(?:",r+=3,s+=i()+"|$)";break;case"=":s+="(?=",r+=3,s+=i()+")";break;case"!":e=r,r+=3,i(),s+=n.substr(e,r-e);break;case"<":switch(n[r+3]){case"=":case"!":e=r,r+=4,i(),s+=n.substr(e,r-e);break;default:a(n.indexOf(">",r)-r+1),s+=i()+"|$)"}}else a(1),s+=i()+"|$)";break;case")":return++r,s;default:o(1)}return s}return new RegExp(i(),e.flags)}(e),r=t.match(n);return!!r&&r[0].length>0}},3121:(e,t,n)=>{n.d(t,{El:()=>d,NS:()=>a,SX:()=>l,pO:()=>o,r4:()=>u,v:()=>h,wf:()=>c});var r,i=n(5460),s=n(4230);function a(e){return new s.Vj(e,(e=>(0,i.mD)(e)?e.content:[]),{includeRoot:!0})}function o(e,t){for(;e.container;)if((e=e.container)===t)return!0;return!1}function c(e){return{start:{character:e.startColumn-1,line:e.startLine-1},end:{character:e.endColumn,line:e.endLine-1}}}function l(e){if(!e)return;const{offset:t,end:n,range:r}=e;return{range:r,offset:t,end:n,length:n-t}}function u(e,t){const n=function(e,t){if(e.end.linet.end.line||e.start.line===t.end.line&&e.start.character>=t.end.character)return r.After;const n=e.start.line>t.start.line||e.start.line===t.start.line&&e.start.character>=t.start.character,i=e.end.liner.After}!function(e){e[e.Before=0]="Before",e[e.After=1]="After",e[e.OverlapFront=2]="OverlapFront",e[e.OverlapBack=3]="OverlapBack",e[e.Inside=4]="Inside",e[e.Outside=5]="Outside"}(r||(r={}));const d=/^[\w\p{L}]$/u;function h(e,t){if(e){const n=function(e){let t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1];for(;e.container;){const n=e.container;let r=n.content.indexOf(e);for(;r>0;){r--;const e=n.content[r];if(t||!e.hidden)return e}e=n}return}(e,!0);if(n&&f(n,t))return n;if((0,i.br)(e)){for(let n=e.content.findIndex((e=>!e.hidden))-1;n>=0;n--){const r=e.content[n];if(f(r,t))return r}}}}function f(e,t){return(0,i.FC)(e)&&t.includes(e.tokenType.name)}},3314:(e,t,n)=>{n.d(t,{A:()=>i});var r=n(1387);const i=function(e){return(0,r.A)(e,4)}},3484:(e,t,n)=>{n.d(t,{A:()=>m});var r=/\s/;const i=function(e){for(var t=e.length;t--&&r.test(e.charAt(t)););return t};var s=/^\s+/;const a=function(e){return e?e.slice(0,i(e)+1).replace(s,""):e};var o=n(7664),c=n(2791),l=/^[-+]0x[0-9a-f]+$/i,u=/^0b[01]+$/i,d=/^0o[0-7]+$/i,h=parseInt;const f=function(e){if("number"==typeof e)return e;if((0,c.A)(e))return NaN;if((0,o.A)(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=(0,o.A)(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=a(e);var n=u.test(e);return n||d.test(e)?h(e.slice(2),n?2:8):l.test(e)?NaN:+e};var p=1/0;const m=function(e){return e?(e=f(e))===p||e===-1/0?17976931348623157e292*(e<0?-1:1):e===e?e:0:0===e?e:0}},3670:(e,t,n)=>{n.d(t,{b:()=>l});var r=n(1584),i=n(4016),s=n(5813),a=n(1808),o=class extends r.mR{static#e=(()=>(0,r.K2)(this,"GitGraphTokenBuilder"))();constructor(){super(["gitGraph"])}},c={parser:{TokenBuilder:(0,r.K2)((()=>new o),"TokenBuilder"),ValueConverter:(0,r.K2)((()=>new r.Tm),"ValueConverter")}};function l(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:i.D;const t=(0,s.WQ)((0,a.u)(e),r.sr),n=(0,s.WQ)((0,a.t)({shared:t}),r.eZ,c);return t.ServiceRegistry.register(n),{shared:t,GitGraph:n}}(0,r.K2)(l,"createGitGraphServices")},3678:(e,t,n)=>{n.d(t,{A:()=>a});var r=n(4802),i=n(5386),s=n(3239);const a=function(e){return"string"==typeof e||!(0,i.A)(e)&&(0,s.A)(e)&&"[object String]"==(0,r.A)(e)}},3975:(e,t,n)=>{t.Qi=t.XO=void 0;const r=n(1769),i=n(8596),s=n(8377);var a;!function(e){e.None=Object.freeze({isCancellationRequested:!1,onCancellationRequested:s.Event.None}),e.Cancelled=Object.freeze({isCancellationRequested:!0,onCancellationRequested:s.Event.None}),e.is=function(t){const n=t;return n&&(n===e.None||n===e.Cancelled||i.boolean(n.isCancellationRequested)&&!!n.onCancellationRequested)}}(a||(t.XO=a={}));const o=Object.freeze((function(e,t){const n=(0,r.default)().timer.setTimeout(e.bind(t),0);return{dispose(){n.dispose()}}}));class c{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?o:(this._emitter||(this._emitter=new s.Emitter),this._emitter.event)}dispose(){this._emitter&&(this._emitter.dispose(),this._emitter=void 0)}}t.Qi=class{get token(){return this._token||(this._token=new c),this._token}cancel(){this._token?this._token.cancel():this._token=a.Cancelled}dispose(){this._token?this._token instanceof c&&this._token.dispose():this._token=a.None}}},4016:(e,t,n)=>{n.d(t,{D:()=>i});class r{readFile(){throw new Error("No file system is available.")}async readDirectory(){return[]}}const i={fileSystemProvider:()=>new r}},4211:(e,t,n)=>{n.d(t,{A:()=>r});const r=function(e){var t=null==e?0:e.length;return t?e[t-1]:void 0}},4230:(e,t,n)=>{n.d(t,{B5:()=>a,Rf:()=>o,Td:()=>c,Vj:()=>l,fq:()=>r,iD:()=>u});class r{constructor(e,t){this.startFn=e,this.nextFn=t}iterator(){const e={state:this.startFn(),next:()=>this.nextFn(e.state),[Symbol.iterator]:()=>e};return e}[Symbol.iterator](){return this.iterator()}isEmpty(){const e=this.iterator();return Boolean(e.next().done)}count(){const e=this.iterator();let t=0,n=e.next();for(;!n.done;)t++,n=e.next();return t}toArray(){const e=[],t=this.iterator();let n;do{n=t.next(),void 0!==n.value&&e.push(n.value)}while(!n.done);return e}toSet(){return new Set(this)}toMap(e,t){const n=this.map((n=>[e?e(n):n,t?t(n):n]));return new Map(n)}toString(){return this.join()}concat(e){return new r((()=>({first:this.startFn(),firstDone:!1,iterator:e[Symbol.iterator]()})),(e=>{let t;if(!e.firstDone){do{if(t=this.nextFn(e.first),!t.done)return t}while(!t.done);e.firstDone=!0}do{if(t=e.iterator.next(),!t.done)return t}while(!t.done);return o}))}join(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:",";const t=this.iterator();let n,r="",s=!1;do{n=t.next(),n.done||(s&&(r+=e),r+=i(n.value)),s=!0}while(!n.done);return r}indexOf(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;const n=this.iterator();let r=0,i=n.next();for(;!i.done;){if(r>=t&&i.value===e)return r;i=n.next(),r++}return-1}every(e){const t=this.iterator();let n=t.next();for(;!n.done;){if(!e(n.value))return!1;n=t.next()}return!0}some(e){const t=this.iterator();let n=t.next();for(;!n.done;){if(e(n.value))return!0;n=t.next()}return!1}forEach(e){const t=this.iterator();let n=0,r=t.next();for(;!r.done;)e(r.value,n),r=t.next(),n++}map(e){return new r(this.startFn,(t=>{const{done:n,value:r}=this.nextFn(t);return n?o:{done:!1,value:e(r)}}))}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 o}))}nonNullable(){return this.filter((e=>void 0!==e&&null!==e))}reduce(e,t){const n=this.iterator();let r=t,i=n.next();for(;!i.done;)r=void 0===r?i.value:e(r,i.value),i=n.next();return r}reduceRight(e,t){return this.recursiveReduce(this.iterator(),e,t)}recursiveReduce(e,t,n){const r=e.next();if(r.done)return n;const i=this.recursiveReduce(e,t,n);return void 0===i?r.value:t(i,r.value)}find(e){const t=this.iterator();let n=t.next();for(;!n.done;){if(e(n.value))return n.value;n=t.next()}}findIndex(e){const t=this.iterator();let n=0,r=t.next();for(;!r.done;){if(e(r.value))return n;r=t.next(),n++}return-1}includes(e){const t=this.iterator();let 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){const e=t.iterator.next();if(!e.done)return e;t.iterator=void 0}const{done:n,value:r}=this.nextFn(t.this);if(!n){const n=e(r);if(!s(n))return{done:!1,value:n};t.iterator=n[Symbol.iterator]()}}while(t.iterator);return o}))}flat(e){if(void 0===e&&(e=1),e<=0)return this;const t=e>1?this.flat(e-1):this;return new r((()=>({this:t.startFn()})),(e=>{do{if(e.iterator){const t=e.iterator.next();if(!t.done)return t;e.iterator=void 0}const{done:n,value:r}=t.nextFn(e.this);if(!n){if(!s(r))return{done:!1,value:r};e.iterator=r[Symbol.iterator]()}}while(e.iterator);return o}))}head(){const e=this.iterator().next();if(!e.done)return e.value}tail(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:1;return new r((()=>{const t=this.startFn();for(let n=0;n({size:0,state:this.startFn()})),(t=>(t.size++,t.size>e?o: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){const r=e?e(n.value):n.value;if(!t.set.has(r))return t.set.add(r),n}}while(!n.done);return o}))}exclude(e,t){const n=new Set;for(const r of e){const e=t?t(r):r;n.add(e)}return this.filter((e=>{const r=t?t(e):e;return!n.has(r)}))}}function i(e){return"string"===typeof e?e:"undefined"===typeof e?"undefined":"function"===typeof e.toString?e.toString():Object.prototype.toString.call(e)}function s(e){return!!e&&"function"===typeof e[Symbol.iterator]}const a=new r((()=>{}),(()=>o)),o=Object.freeze({done:!0,value:void 0});function c(){for(var e=arguments.length,t=new Array(e),n=0;ne[Symbol.iterator]()),(e=>e.next()));if("number"===typeof e.length)return new r((()=>({index:0})),(t=>t.index1?new r((()=>({collIndex:0,arrIndex:0})),(e=>{do{if(e.iterator){const t=e.iterator.next();if(!t.done)return t;e.iterator=void 0}if(e.array){if(e.arrIndex({iterators:(null===n||void 0===n?void 0:n.includeRoot)?[[e][Symbol.iterator]()]:[t(e)[Symbol.iterator]()],pruned:!1})),(e=>{for(e.pruned&&(e.iterators.pop(),e.pruned=!1);e.iterators.length>0;){const n=e.iterators[e.iterators.length-1].next();if(!n.done)return e.iterators.push(t(n.value)[Symbol.iterator]()),n;e.iterators.pop()}return o}))}iterator(){const e={state:this.startFn(),next:()=>this.nextFn(e.state),prune:()=>{e.state.pruned=!0},[Symbol.iterator]:()=>e};return e}}var u;!function(e){e.sum=function(e){return e.reduce(((e,t)=>e+t),0)},e.product=function(e){return e.reduce(((e,t)=>e*t),0)},e.min=function(e){return e.reduce(((e,t)=>Math.min(e,t)))},e.max=function(e){return e.reduce(((e,t)=>Math.max(e,t)))}}(u||(u={}))},4644:(e,t,n)=>{n.d(t,{d:()=>a});var r,i=n(1128),s=n(1261);class a{convert(e,t){let n=t.grammarSource;if((0,i._c)(n)&&(n=(0,s.g4)(n)),(0,i.$g)(n)){const r=n.rule.ref;if(!r)throw new Error("This cst node was not parsed by a rule.");return this.runConverter(r,e,t)}return e}runConverter(e,t,n){var i;switch(e.name.toUpperCase()){case"INT":return r.convertInt(t);case"STRING":return r.convertString(t);case"ID":return r.convertID(t)}switch(null===(i=(0,s.P3)(e))||void 0===i?void 0:i.toLowerCase()){case"number":return r.convertNumber(t);case"boolean":return r.convertBoolean(t);case"bigint":return r.convertBigint(t);case"date":return r.convertDate(t);default:return t}}}!function(e){function t(e){switch(e){case"b":return"\b";case"f":return"\f";case"n":return"\n";case"r":return"\r";case"t":return"\t";case"v":return"\v";case"0":return"\0";default:return e}}e.convertString=function(e){let n="";for(let r=1;r{n.d(t,{A:()=>s});var r=n(2578),i=n(3493);const s=function(e,t){var n=-1,s=(0,i.A)(e)?Array(e.length):[];return(0,r.A)(e,(function(e,r,i){s[++n]=t(e,r,i)})),s}},4833:(e,t,n)=>{n.d(t,{A:()=>l});var r=n(1869),i=n(5009),s=n(8635),a=n(9778),o=Object.prototype,c=o.hasOwnProperty;const l=(0,r.A)((function(e,t){e=Object(e);var n=-1,r=t.length,l=r>2?t[2]:void 0;for(l&&(0,s.A)(t[0],t[1],l)&&(r=1);++n{function r(e){return"object"===typeof e&&null!==e&&"string"===typeof e.$type}function i(e){return"object"===typeof e&&null!==e&&"string"===typeof e.$refText}function s(e){return"object"===typeof e&&null!==e&&"string"===typeof e.name&&"string"===typeof e.type&&"string"===typeof e.path}function a(e){return"object"===typeof e&&null!==e&&r(e.container)&&i(e.reference)&&"string"===typeof e.message}n.d(t,{A_:()=>i,FC:()=>l,Nr:()=>s,Zl:()=>a,br:()=>u,kD:()=>o,mD:()=>c,ng:()=>r});class o{constructor(){this.subtypes={},this.allSubtypes={}}isInstance(e,t){return r(e)&&this.isSubtype(e.$type,t)}isSubtype(e,t){if(e===t)return!0;let n=this.subtypes[e];n||(n=this.subtypes[e]={});const r=n[t];if(void 0!==r)return r;{const r=this.computeIsSubtype(e,t);return n[t]=r,r}}getAllSubTypes(e){const t=this.allSubtypes[e];if(t)return t;{const t=this.getAllTypes(),n=[];for(const r of t)this.isSubtype(r,e)&&n.push(r);return this.allSubtypes[e]=n,n}}}function c(e){return"object"===typeof e&&null!==e&&Array.isArray(e.content)}function l(e){return"object"===typeof e&&null!==e&&"object"===typeof e.tokenType}function u(e){return c(e)&&"string"===typeof e.fullText}},5502:(e,t,n)=>{n.d(t,{qg:()=>a});n(3670),n(9456),n(8062),n(7789),n(1438),n(2502);var r=n(1584),i={},s={info:(0,r.K2)((async()=>{const{createInfoServices:e}=await n.e(372).then(n.bind(n,7372)),t=e().Info.parser.LangiumParser;i.info=t}),"info"),packet:(0,r.K2)((async()=>{const{createPacketServices:e}=await n.e(974).then(n.bind(n,6974)),t=e().Packet.parser.LangiumParser;i.packet=t}),"packet"),pie:(0,r.K2)((async()=>{const{createPieServices:e}=await n.e(914).then(n.bind(n,914)),t=e().Pie.parser.LangiumParser;i.pie=t}),"pie"),architecture:(0,r.K2)((async()=>{const{createArchitectureServices:e}=await n.e(987).then(n.bind(n,987)),t=e().Architecture.parser.LangiumParser;i.architecture=t}),"architecture"),gitGraph:(0,r.K2)((async()=>{const{createGitGraphServices:e}=await n.e(318).then(n.bind(n,318)),t=e().GitGraph.parser.LangiumParser;i.gitGraph=t}),"gitGraph"),radar:(0,r.K2)((async()=>{const{createRadarServices:e}=await n.e(929).then(n.bind(n,4929)),t=e().Radar.parser.LangiumParser;i.radar=t}),"radar")};async function a(e,t){const n=s[e];if(!n)throw new Error(`Unknown diagram type: ${e}`);i[e]||await n();const r=i[e].parse(t);if(r.lexerErrors.length>0||r.parserErrors.length>0)throw new o(r);return r.value}(0,r.K2)(a,"parse");var o=class extends Error{constructor(e){super(`Parsing failed: ${e.lexerErrors.map((e=>e.message)).join("\n")} ${e.parserErrors.map((e=>e.message)).join("\n")}`),this.result=e}static#e=(()=>(0,r.K2)(this,"MermaidParseError"))()}},5731:(e,t,n)=>{n.d(t,{A:()=>r});const r=function(e,t){return e{var r;function i(e,t,n,r,i,s,o,c,u){return a([e,t,n,r,i,s,o,c,u].reduce(l,{}))}n.d(t,{WQ:()=>i}),function(e){e.merge=(e,t)=>l(l({},e),t)}(r||(r={}));const s=Symbol("isProxy");function a(e,t){const n=new Proxy({},{deleteProperty:()=>!1,set:()=>{throw new Error("Cannot set property on injected service container")},get:(r,i)=>i===s||c(r,i,e,t||n),getOwnPropertyDescriptor:(r,i)=>(c(r,i,e,t||n),Object.getOwnPropertyDescriptor(r,i)),has:(t,n)=>n in e,ownKeys:()=>[...Object.getOwnPropertyNames(e)]});return n}const o=Symbol();function c(e,t,n,r){if(t in e){if(e[t]instanceof Error)throw new Error("Construction failure. Please make sure that your dependencies are constructable.",{cause:e[t]});if(e[t]===o)throw new Error('Cycle detected. Please make "'+String(t)+'" lazy. Visit https://langium.org/docs/reference/configuration-services/#resolving-cyclic-dependencies');return e[t]}if(t in n){const s=n[t];e[t]=o;try{e[t]="function"===typeof s?s(r):a(s,r)}catch(i){throw e[t]=i instanceof Error?i:void 0,i}return e[t]}}function l(e,t){if(t)for(const[n,r]of Object.entries(t))if(void 0!==r){const t=e[n];e[n]=null!==t&&null!==r&&"object"===typeof t&&"object"===typeof r?l(t,r):r}return e}},6165:(e,t,n)=>{n.d(t,{A:()=>i});var r=n(7545);const i=function(e){return(null==e?0:e.length)?(0,r.A)(e,1):[]}},6230:(e,t,n)=>{n.d(t,{A:()=>i});var r=n(3484);const i=function(e){var t=(0,r.A)(e),n=t%1;return t===t?n?t-n:t:0}},6617:(e,t,n)=>{n.d(t,{W:()=>r,d:()=>i});class r extends Error{constructor(e,t){super(e?`${t} at ${e.range.start.line}:${e.range.start.character}`:t)}}function i(e){throw new Error("Error! The input value was not handled.")}},6770:(e,t,n)=>{n.d(t,{ak:()=>V,mT:()=>Pr,LT:()=>Xt,jr:()=>Dr,T6:()=>dr,JG:()=>Mt,wL:()=>M,c$:()=>F,Y2:()=>B,$P:()=>G,Cy:()=>K,Pp:()=>j,BK:()=>H,PW:()=>Ot,my:()=>Zt,jk:()=>kn,Sk:()=>Dt,G:()=>Qt});var r=n(1109),i=n(1432),s=n(7590),a=n(8293),o=n(313),c=n(3314);function l(e){function t(){}t.prototype=e;const n=new t;function r(){return typeof n.bar}return r(),r(),e}const u=function(e,t,n){var r=-1,i=e.length;t<0&&(t=-t>i?0:i+t),(n=n>i?i:n)<0&&(n+=i),i=t>n?0:n-t>>>0,t>>>=0;for(var s=Array(i);++r{t.accept(e)}))}}class M extends P{constructor(e){super([]),this.idx=1,R(this,I(e,(e=>void 0!==e)))}set definition(e){}get definition(){return void 0!==this.referencedRule?this.referencedRule.definition:[]}accept(e){e.visit(this)}}class D extends P{constructor(e){super(e.definition),this.orgText="",R(this,I(e,(e=>void 0!==e)))}}class U extends P{constructor(e){super(e.definition),this.ignoreAmbiguities=!1,R(this,I(e,(e=>void 0!==e)))}}class F extends P{constructor(e){super(e.definition),this.idx=1,R(this,I(e,(e=>void 0!==e)))}}class G extends P{constructor(e){super(e.definition),this.idx=1,R(this,I(e,(e=>void 0!==e)))}}class K extends P{constructor(e){super(e.definition),this.idx=1,R(this,I(e,(e=>void 0!==e)))}}class B extends P{constructor(e){super(e.definition),this.idx=1,R(this,I(e,(e=>void 0!==e)))}}class j extends P{constructor(e){super(e.definition),this.idx=1,R(this,I(e,(e=>void 0!==e)))}}class V extends P{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,R(this,I(e,(e=>void 0!==e)))}}class H{constructor(e){this.idx=1,R(this,I(e,(e=>void 0!==e)))}accept(e){e.visit(this)}}function W(e){function t(e){return(0,a.A)(e,W)}if(e instanceof M){const t={type:"NonTerminal",name:e.nonTerminalName,idx:e.idx};return(0,f.A)(e.label)&&(t.label=e.label),t}if(e instanceof U)return{type:"Alternative",definition:t(e.definition)};if(e instanceof F)return{type:"Option",idx:e.idx,definition:t(e.definition)};if(e instanceof G)return{type:"RepetitionMandatory",idx:e.idx,definition:t(e.definition)};if(e instanceof K)return{type:"RepetitionMandatoryWithSeparator",idx:e.idx,separator:W(new H({terminalType:e.separator})),definition:t(e.definition)};if(e instanceof j)return{type:"RepetitionWithSeparator",idx:e.idx,separator:W(new H({terminalType:e.separator})),definition:t(e.definition)};if(e instanceof B)return{type:"Repetition",idx:e.idx,definition:t(e.definition)};if(e instanceof V)return{type:"Alternation",idx:e.idx,definition:t(e.definition)};if(e instanceof H){const t={type:"Terminal",name:e.terminalType.name,label:_(e.terminalType),idx:e.idx};(0,f.A)(e.label)&&(t.terminalLabel=e.label);const n=e.terminalType.PATTERN;return e.terminalType.PATTERN&&(t.pattern=O(n)?n.source:n),t}if(e instanceof D)return{type:"Rule",name:e.name,orgText:e.orgText,definition:t(e.definition)};throw Error("non exhaustive match")}class z{visit(e){const t=e;switch(t.constructor){case M:return this.visitNonTerminal(t);case U:return this.visitAlternative(t);case F:return this.visitOption(t);case G:return this.visitRepetitionMandatory(t);case K:return this.visitRepetitionMandatoryWithSeparator(t);case j:return this.visitRepetitionWithSeparator(t);case B:return this.visitRepetition(t);case V:return this.visitAlternation(t);case H:return this.visitTerminal(t);case D: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){}}var Y=n(2605),X=n(2578);const q=function(e,t){var n;return(0,X.A)(e,(function(e,r,i){return!(n=t(e,r,i))})),!!n};var Q=n(5386),Z=n(8635);const J=function(e,t,n){var r=(0,Q.A)(e)?Y.A:q;return n&&(0,Z.A)(e,t,n)&&(t=void 0),r(e,(0,k.A)(t,3))};var ee=n(1510),te=Math.max;const ne=function(e,t,n,r){e=(0,y.A)(e)?e:(0,i.A)(e),n=n&&!r?(0,d.A)(n):0;var s=e.length;return n<0&&(n=te(s+n,0)),(0,f.A)(e)?n<=s&&e.indexOf(t,n)>-1:!!s&&(0,ee.A)(e,t,n)>-1};const re=function(e,t){for(var n=-1,r=null==e?0:e.length;++n1&&void 0!==arguments[1]?arguments[1]:[];return!!(e instanceof F||e instanceof B||e instanceof j)||(e instanceof V?J(e.definition,(e=>ae(e,t))):!(e instanceof M&&ne(t,e))&&(e instanceof P&&(e instanceof M&&t.push(e),se(e.definition,(e=>ae(e,t))))))}function oe(e){if(e instanceof M)return"SUBRULE";if(e instanceof F)return"OPTION";if(e instanceof V)return"OR";if(e instanceof G)return"AT_LEAST_ONE";if(e instanceof K)return"AT_LEAST_ONE_SEP";if(e instanceof j)return"MANY_SEP";if(e instanceof B)return"MANY";if(e instanceof H)return"CONSUME";throw Error("non exhaustive match")}class ce{walk(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[];(0,r.A)(e.definition,((n,r)=>{const i=h(e.definition,r+1);if(n instanceof M)this.walkProdRef(n,i,t);else if(n instanceof H)this.walkTerminal(n,i,t);else if(n instanceof U)this.walkFlat(n,i,t);else if(n instanceof F)this.walkOption(n,i,t);else if(n instanceof G)this.walkAtLeastOne(n,i,t);else if(n instanceof K)this.walkAtLeastOneSep(n,i,t);else if(n instanceof j)this.walkManySep(n,i,t);else if(n instanceof B)this.walkMany(n,i,t);else{if(!(n instanceof V))throw Error("non exhaustive match");this.walkOr(n,i,t)}}))}walkTerminal(e,t,n){}walkProdRef(e,t,n){}walkFlat(e,t,n){const r=t.concat(n);this.walk(e,r)}walkOption(e,t,n){const r=t.concat(n);this.walk(e,r)}walkAtLeastOne(e,t,n){const r=[new F({definition:e.definition})].concat(t,n);this.walk(e,r)}walkAtLeastOneSep(e,t,n){const r=le(e,t,n);this.walk(e,r)}walkMany(e,t,n){const r=[new F({definition:e.definition})].concat(t,n);this.walk(e,r)}walkManySep(e,t,n){const r=le(e,t,n);this.walk(e,r)}walkOr(e,t,n){const i=t.concat(n);(0,r.A)(e.definition,(e=>{const t=new U({definition:[e]});this.walk(t,i)}))}}function le(e,t,n){return[new F({definition:[new H({terminalType:e.separator})].concat(e.definition)})].concat(t,n)}var ue=n(1837);const de=function(e){return e&&e.length?(0,ue.A)(e):[]};var he=n(6165);function fe(e){if(e instanceof M)return fe(e.referencedRule);if(e instanceof H)return[e.terminalType];if(function(e){return e instanceof U||e instanceof F||e instanceof B||e instanceof G||e instanceof K||e instanceof j||e instanceof H||e instanceof D}(e))return function(e){let t=[];const n=e.definition;let r,i=0,s=n.length>i,a=!0;for(;s&&a;)r=n[i],a=ae(r),t=t.concat(fe(r)),i+=1,s=n.length>i;return de(t)}(e);if(function(e){return e instanceof V}(e))return function(e){const t=(0,a.A)(e.definition,(e=>fe(e)));return de((0,he.A)(t))}(e);throw Error("non exhaustive match")}const pe="_~IN~_";class me extends ce{constructor(e){super(),this.topProd=e,this.follows={}}startWalking(){return this.walk(this.topProd),this.follows}walkTerminal(e,t,n){}walkProdRef(e,t,n){const r=(i=e.referencedRule,s=e.idx,i.name+s+pe+this.topProd.name);var i,s;const a=t.concat(n),o=fe(new U({definition:a}));this.follows[r]=o}}var ge=n(6772),ye=n(68),ve=n(4833),Ae=n(8923),Te=n(7961);const Re=function(e){if("function"!=typeof e)throw new TypeError("Expected a function");return function(){var t=arguments;switch(t.length){case 0:return!e.call(this);case 1:return!e.call(this,t[0]);case 2:return!e.call(this,t[0],t[1]);case 3:return!e.call(this,t[0],t[1],t[2])}return!e.apply(this,t)}};const Ee=function(e,t){return((0,Q.A)(e)?Ae.A:Te.A)(e,Re((0,k.A)(t,3)))};var ke=n(4067),$e=Math.max;const xe=function(e,t,n){var r=null==e?0:e.length;if(!r)return-1;var i=null==n?0:(0,d.A)(n);return i<0&&(i=$e(r+i,0)),(0,ee.A)(e,t,i)};var Ie=n(3175),Se=n(2825),Ne=n(5347),we=n(1512),Ce=n(8784),Le=n(8948);const be=function(e,t,n,r){var i=-1,s=we.A,a=!0,o=e.length,c=[],l=t.length;if(!o)return c;n&&(t=(0,E.A)(t,(0,C.A)(n))),r?(s=Ce.A,a=!1):t.length>=200&&(s=Le.A,a=!1,t=new Ne.A(t));e:for(;++i1&&void 0!==arguments[1]&&arguments[1];try{const t=Ve(e);return Ye(t.value,{},t.flags.ignoreCase)}catch(n){if(n.message===He)t&&Ke(`${We}\tUnable to optimize: < ${e.toString()} >\n\tComplement Sets cannot be automatically optimized.\n\tThis will disable the lexer's first char optimizations.\n\tSee: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#COMPLEMENT for details.`);else{let n="";t&&(n="\n\tThis will disable the lexer's first char optimizations.\n\tSee: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#REGEXP_PARSING for details."),Ge(`${We}\n\tFailed parsing: < ${e.toString()} >\n\tUsing the @chevrotain/regexp-to-ast library\n\tPlease open an issue at: https://github.com/chevrotain/chevrotain/issues`+n)}}return[]}function Ye(e,t,n){switch(e.type){case"Disjunction":for(let r=0;r{if("number"===typeof e)Xe(e,t,n);else{const r=e;if(!0===n)for(let e=r.from;e<=r.to;e++)Xe(e,t,n);else{for(let e=r.from;e<=r.to&&e=yt){const e=r.from>=yt?r.from:yt,n=r.to,i=At(e),s=At(n);for(let r=i;r<=s;r++)t[r]=r}}}}));break;case"Group":Ye(a.value,t,n);break;default:throw Error("Non Exhaustive Match")}const o=void 0!==a.quantifier&&0===a.quantifier.atLeast;if("Group"===a.type&&!1===Qe(a)||"Group"!==a.type&&!1===o)break}break;default:throw Error("non exhaustive match!")}return(0,i.A)(t)}function Xe(e,t,n){const r=At(e);t[r]=r,!0===n&&function(e,t){const n=String.fromCharCode(e),r=n.toUpperCase();if(r!==n){const e=At(r.charCodeAt(0));t[e]=e}else{const e=n.toLowerCase();if(e!==n){const n=At(e.charCodeAt(0));t[n]=n}}}(e,t)}function qe(e,t){return(0,Fe.A)(e.value,(e=>{if("number"===typeof e)return ne(t,e);{const n=e;return void 0!==(0,Fe.A)(t,(e=>n.from<=e&&e<=n.to))}}))}function Qe(e){const t=e.quantifier;return!(!t||0!==t.atLeast)||!!e.value&&((0,Q.A)(e.value)?se(e.value,Qe):Qe(e.value))}class Ze extends ye.z{constructor(e){super(),this.targetCharCodes=e,this.found=!1}visitChildren(e){if(!0!==this.found){switch(e.type){case"Lookahead":return void this.visitLookahead(e);case"NegativeLookahead":return void this.visitNegativeLookahead(e)}super.visitChildren(e)}}visitCharacter(e){ne(this.targetCharCodes,e.value)&&(this.found=!0)}visitSet(e){e.complement?void 0===qe(e,this.targetCharCodes)&&(this.found=!0):void 0!==qe(e,this.targetCharCodes)&&(this.found=!0)}}function Je(e,t){if(t instanceof RegExp){const n=Ve(t),r=new Ze(e);return r.visit(n),r.found}return void 0!==(0,Fe.A)(t,(t=>ne(e,t.charCodeAt(0))))}const et="PATTERN",tt="defaultMode",nt="modes";let rt="boolean"===typeof new RegExp("(?:)").sticky;function it(e,t){const n=(t=(0,ve.A)(t,{useSticky:rt,debug:!1,safeMode:!1,positionTracking:"full",lineTerminatorCharacters:["\r","\n"],tracer:(e,t)=>t()})).tracer;let i;n("initCharCodeToOptimizedIndexMap",(()=>{!function(){if((0,s.A)(vt)){vt=new Array(65536);for(let e=0;e<65536;e++)vt[e]=e>255?255+~~(e/255):e}}()})),n("Reject Lexer.NA",(()=>{i=Ee(e,(e=>e[et]===Mt.NA))}));let c,l,u,d,h,p,m,g,y,v,A,T=!1;n("Transform Patterns",(()=>{T=!1,c=(0,a.A)(i,(e=>{const n=e[et];if(O(n)){const e=n.source;return 1!==e.length||"^"===e||"$"===e||"."===e||n.ignoreCase?2!==e.length||"\\"!==e[0]||ne(["d","D","s","S","t","r","n","t","0","c","b","B","f","v","w","W"],e[1])?t.useSticky?lt(n):ct(n):e[1]:e}if((0,ke.A)(n))return T=!0,{exec:n};if("object"===typeof n)return T=!0,n;if("string"===typeof n){if(1===n.length)return n;{const e=n.replace(/[\\^$.*+?()[\]{}|]/g,"\\$&"),r=new RegExp(e);return t.useSticky?lt(r):ct(r)}}throw Error("non exhaustive match")}))})),n("misc mapping",(()=>{l=(0,a.A)(i,(e=>e.tokenTypeIdx)),u=(0,a.A)(i,(e=>{const t=e.GROUP;if(t!==Mt.SKIPPED){if((0,f.A)(t))return t;if((0,ge.A)(t))return!1;throw Error("non exhaustive match")}})),d=(0,a.A)(i,(e=>{const t=e.LONGER_ALT;if(t){return(0,Q.A)(t)?(0,a.A)(t,(e=>xe(i,e))):[xe(i,t)]}})),h=(0,a.A)(i,(e=>e.PUSH_MODE)),p=(0,a.A)(i,(e=>(0,o.A)(e,"POP_MODE")))})),n("Line Terminator Handling",(()=>{const e=mt(t.lineTerminatorCharacters);m=(0,a.A)(i,(e=>!1)),"onlyOffset"!==t.positionTracking&&(m=(0,a.A)(i,(t=>(0,o.A)(t,"LINE_BREAKS")?!!t.LINE_BREAKS:!1===pt(t,e)&&Je(e,t.PATTERN))))})),n("Misc Mapping #2",(()=>{g=(0,a.A)(i,dt),y=(0,a.A)(c,ht),v=(0,Ie.A)(i,((e,t)=>{const n=t.GROUP;return(0,f.A)(n)&&n!==Mt.SKIPPED&&(e[n]=[]),e}),{}),A=(0,a.A)(c,((e,t)=>({pattern:c[t],longerAlt:d[t],canLineTerminator:m[t],isCustom:g[t],short:y[t],group:u[t],push:h[t],pop:p[t],tokenTypeIdx:l[t],tokenType:i[t]})))}));let R=!0,E=[];return t.safeMode||n("First Char Optimization",(()=>{E=(0,Ie.A)(i,((e,n,i)=>{if("string"===typeof n.PATTERN){const t=At(n.PATTERN.charCodeAt(0));gt(e,t,A[i])}else if((0,Q.A)(n.START_CHARS_HINT)){let t;(0,r.A)(n.START_CHARS_HINT,(n=>{const r=At("string"===typeof n?n.charCodeAt(0):n);t!==r&&(t=r,gt(e,r,A[i]))}))}else if(O(n.PATTERN))if(n.PATTERN.unicode)R=!1,t.ensureOptimizations&&Ge(`${We}\tUnable to analyze < ${n.PATTERN.toString()} > pattern.\n\tThe regexp unicode flag is not currently supported by the regexp-to-ast library.\n\tThis will disable the lexer's first char optimizations.\n\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNICODE_OPTIMIZE`);else{const a=ze(n.PATTERN,t.ensureOptimizations);(0,s.A)(a)&&(R=!1),(0,r.A)(a,(t=>{gt(e,t,A[i])}))}else t.ensureOptimizations&&Ge(`${We}\tTokenType: <${n.name}> is using a custom token pattern without providing parameter.\n\tThis will disable the lexer's first char optimizations.\n\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_OPTIMIZE`),R=!1;return e}),[])})),{emptyGroups:v,patternIdxToConfig:A,charCodeToPatternIdxToConfig:E,hasCustom:T,canBeOptimized:R}}function st(e,t){let n=[];const i=function(e){const t=(0,Se.A)(e,(e=>!(0,o.A)(e,et))),n=(0,a.A)(t,(e=>({message:"Token Type: ->"+e.name+"<- missing static 'PATTERN' property",type:_t.MISSING_PATTERN,tokenTypes:[e]}))),r=Me(e,t);return{errors:n,valid:r}}(e);n=n.concat(i.errors);const s=function(e){const t=(0,Se.A)(e,(e=>{const t=e[et];return!O(t)&&!(0,ke.A)(t)&&!(0,o.A)(t,"exec")&&!(0,f.A)(t)})),n=(0,a.A)(t,(e=>({message:"Token Type: ->"+e.name+"<- static 'PATTERN' can only be a RegExp, a Function matching the {CustomPatternMatcherFunc} type or an Object matching the {ICustomPattern} interface.",type:_t.INVALID_PATTERN,tokenTypes:[e]}))),r=Me(e,t);return{errors:n,valid:r}}(i.valid),c=s.valid;return n=n.concat(s.errors),n=n.concat(function(e){let t=[];const n=(0,Se.A)(e,(e=>O(e[et])));return t=t.concat(function(e){class t extends ye.z{constructor(){super(...arguments),this.found=!1}visitEndAnchor(e){this.found=!0}}const n=(0,Se.A)(e,(e=>{const n=e.PATTERN;try{const e=Ve(n),r=new t;return r.visit(e),r.found}catch(r){return at.test(n.source)}})),r=(0,a.A)(n,(e=>({message:"Unexpected RegExp Anchor Error:\n\tToken Type: ->"+e.name+"<- static 'PATTERN' cannot contain end of input anchor '$'\n\tSee chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS\tfor details.",type:_t.EOI_ANCHOR_FOUND,tokenTypes:[e]})));return r}(n)),t=t.concat(function(e){class t extends ye.z{constructor(){super(...arguments),this.found=!1}visitStartAnchor(e){this.found=!0}}const n=(0,Se.A)(e,(e=>{const n=e.PATTERN;try{const e=Ve(n),r=new t;return r.visit(e),r.found}catch(r){return ot.test(n.source)}})),r=(0,a.A)(n,(e=>({message:"Unexpected RegExp Anchor Error:\n\tToken Type: ->"+e.name+"<- static 'PATTERN' cannot contain start of input anchor '^'\n\tSee https://chevrotain.io/docs/guide/resolving_lexer_errors.html#ANCHORS\tfor details.",type:_t.SOI_ANCHOR_FOUND,tokenTypes:[e]})));return r}(n)),t=t.concat(function(e){const t=(0,Se.A)(e,(e=>{const t=e[et];return t instanceof RegExp&&(t.multiline||t.global)})),n=(0,a.A)(t,(e=>({message:"Token Type: ->"+e.name+"<- static 'PATTERN' may NOT contain global('g') or multiline('m')",type:_t.UNSUPPORTED_FLAGS_FOUND,tokenTypes:[e]})));return n}(n)),t=t.concat(function(e){const t=[];let n=(0,a.A)(e,(n=>(0,Ie.A)(e,((e,r)=>(n.PATTERN.source!==r.PATTERN.source||ne(t,r)||r.PATTERN===Mt.NA||(t.push(r),e.push(r)),e)),[])));n=De(n);const r=(0,Se.A)(n,(e=>e.length>1)),i=(0,a.A)(r,(e=>{const t=(0,a.A)(e,(e=>e.name));return{message:`The same RegExp pattern ->${Ue(e).PATTERN}<-has been used in all of the following Token Types: ${t.join(", ")} <-`,type:_t.DUPLICATE_PATTERNS_FOUND,tokenTypes:e}}));return i}(n)),t=t.concat(function(e){const t=(0,Se.A)(e,(e=>e.PATTERN.test(""))),n=(0,a.A)(t,(e=>({message:"Token Type: ->"+e.name+"<- static 'PATTERN' must not match an empty string",type:_t.EMPTY_MATCH_PATTERN,tokenTypes:[e]})));return n}(n)),t}(c)),n=n.concat(function(e){const t=(0,Se.A)(e,(e=>{if(!(0,o.A)(e,"GROUP"))return!1;const t=e.GROUP;return t!==Mt.SKIPPED&&t!==Mt.NA&&!(0,f.A)(t)})),n=(0,a.A)(t,(e=>({message:"Token Type: ->"+e.name+"<- static 'GROUP' can only be Lexer.SKIPPED/Lexer.NA/A String",type:_t.INVALID_GROUP_TYPE_FOUND,tokenTypes:[e]})));return n}(c)),n=n.concat(function(e,t){const n=(0,Se.A)(e,(e=>void 0!==e.PUSH_MODE&&!ne(t,e.PUSH_MODE))),r=(0,a.A)(n,(e=>({message:`Token Type: ->${e.name}<- static 'PUSH_MODE' value cannot refer to a Lexer Mode ->${e.PUSH_MODE}<-which does not exist`,type:_t.PUSH_MODE_DOES_NOT_EXIST,tokenTypes:[e]})));return r}(c,t)),n=n.concat(function(e){const t=[],n=(0,Ie.A)(e,((e,t,n)=>{const r=t.PATTERN;return r===Mt.NA||((0,f.A)(r)?e.push({str:r,idx:n,tokenType:t}):O(r)&&function(e){const t=[".","\\","[","]","|","^","$","(",")","?","*","+","{"];return void 0===(0,Fe.A)(t,(t=>-1!==e.source.indexOf(t)))}(r)&&e.push({str:r.source,idx:n,tokenType:t})),e}),[]);return(0,r.A)(e,((e,i)=>{(0,r.A)(n,(n=>{let{str:r,idx:s,tokenType:a}=n;if(i${a.name}<- can never be matched.\nBecause it appears AFTER the Token Type ->${e.name}<-in the lexer's definition.\nSee https://chevrotain.io/docs/guide/resolving_lexer_errors.html#UNREACHABLE`;t.push({message:n,type:_t.UNREACHABLE_PATTERN,tokenTypes:[e,a]})}}))})),t}(c)),n}const at=/[^\\][$]/;const ot=/[^\\[][\^]|^\^/;function ct(e){const t=e.ignoreCase?"i":"";return new RegExp(`^(?:${e.source})`,t)}function lt(e){const t=e.ignoreCase?"iy":"y";return new RegExp(`${e.source}`,t)}function ut(e,t,n){const s=[];let a=!1;const c=De((0,he.A)((0,i.A)(e.modes))),l=Ee(c,(e=>e[et]===Mt.NA)),u=mt(n);return t&&(0,r.A)(l,(e=>{const t=pt(e,u);if(!1!==t){const n=function(e,t){if(t.issue===_t.IDENTIFY_TERMINATOR)return`Warning: unable to identify line terminator usage in pattern.\n\tThe problem is in the <${e.name}> Token Type\n\t Root cause: ${t.errMsg}.\n\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#IDENTIFY_TERMINATOR`;if(t.issue===_t.CUSTOM_LINE_BREAK)return`Warning: A Custom Token Pattern should specify the option.\n\tThe problem is in the <${e.name}> Token Type\n\tFor details See: https://chevrotain.io/docs/guide/resolving_lexer_errors.html#CUSTOM_LINE_BREAK`;throw Error("non exhaustive match")}(e,t),r={message:n,type:t.issue,tokenType:e};s.push(r)}else(0,o.A)(e,"LINE_BREAKS")?!0===e.LINE_BREAKS&&(a=!0):Je(u,e.PATTERN)&&(a=!0)})),t&&!a&&s.push({message:"Warning: No LINE_BREAKS Found.\n\tThis Lexer has been defined to track line and column information,\n\tBut none of the Token Types can be identified as matching a line terminator.\n\tSee https://chevrotain.io/docs/guide/resolving_lexer_errors.html#LINE_BREAKS \n\tfor details.",type:_t.NO_LINE_BREAKS_FLAGS}),s}function dt(e){const t=e.PATTERN;if(O(t))return!1;if((0,ke.A)(t))return!0;if((0,o.A)(t,"exec"))return!0;if((0,f.A)(t))return!1;throw Error("non exhaustive match")}function ht(e){return!(!(0,f.A)(e)||1!==e.length)&&e.charCodeAt(0)}const ft={test:function(e){const t=e.length;for(let n=this.lastIndex;n(0,f.A)(e)?e.charCodeAt(0):e))}function gt(e,t,n){void 0===e[t]?e[t]=[n]:e[t].push(n)}const yt=256;let vt=[];function At(e){return ee.CATEGORIES))));const e=Me(n,t);t=t.concat(e),(0,s.A)(e)?r=!1:n=e}return t}(e);!function(e){(0,r.A)(e,(e=>{var t;Ct(e)||(St[It]=e,e.tokenTypeIdx=It++),Lt(e)&&!(0,Q.A)(e.CATEGORIES)&&(e.CATEGORIES=[e.CATEGORIES]),Lt(e)||(e.CATEGORIES=[]),t=e,(0,o.A)(t,"categoryMatches")||(e.categoryMatches=[]),function(e){return(0,o.A)(e,"categoryMatchesMap")}(e)||(e.categoryMatchesMap={})}))}(t),function(e){(0,r.A)(e,(e=>{wt([],e)}))}(t),function(e){(0,r.A)(e,(e=>{e.categoryMatches=[],(0,r.A)(e.categoryMatchesMap,((t,n)=>{e.categoryMatches.push(St[n].tokenTypeIdx)}))}))}(t),(0,r.A)(t,(e=>{e.isParent=e.categoryMatches.length>0}))}function wt(e,t){(0,r.A)(e,(e=>{t.categoryMatchesMap[e.tokenTypeIdx]=!0})),(0,r.A)(t.CATEGORIES,(n=>{const r=e.concat(t);ne(r,n)||wt(r,n)}))}function Ct(e){return(0,o.A)(e,"tokenTypeIdx")}function Lt(e){return(0,o.A)(e,"CATEGORIES")}function bt(e){return(0,o.A)(e,"tokenTypeIdx")}const Ot={buildUnableToPopLexerModeMessage:e=>`Unable to pop Lexer Mode after encountering Token ->${e.image}<- The Mode Stack is empty`,buildUnexpectedCharactersMessage:(e,t,n,r,i)=>`unexpected character: ->${e.charAt(t)}<- at offset: ${t}, skipped ${n} characters.`};var _t;!function(e){e[e.MISSING_PATTERN=0]="MISSING_PATTERN",e[e.INVALID_PATTERN=1]="INVALID_PATTERN",e[e.EOI_ANCHOR_FOUND=2]="EOI_ANCHOR_FOUND",e[e.UNSUPPORTED_FLAGS_FOUND=3]="UNSUPPORTED_FLAGS_FOUND",e[e.DUPLICATE_PATTERNS_FOUND=4]="DUPLICATE_PATTERNS_FOUND",e[e.INVALID_GROUP_TYPE_FOUND=5]="INVALID_GROUP_TYPE_FOUND",e[e.PUSH_MODE_DOES_NOT_EXIST=6]="PUSH_MODE_DOES_NOT_EXIST",e[e.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE=7]="MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE",e[e.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY=8]="MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY",e[e.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST=9]="MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST",e[e.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED=10]="LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED",e[e.SOI_ANCHOR_FOUND=11]="SOI_ANCHOR_FOUND",e[e.EMPTY_MATCH_PATTERN=12]="EMPTY_MATCH_PATTERN",e[e.NO_LINE_BREAKS_FLAGS=13]="NO_LINE_BREAKS_FLAGS",e[e.UNREACHABLE_PATTERN=14]="UNREACHABLE_PATTERN",e[e.IDENTIFY_TERMINATOR=15]="IDENTIFY_TERMINATOR",e[e.CUSTOM_LINE_BREAK=16]="CUSTOM_LINE_BREAK",e[e.MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE=17]="MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE"}(_t||(_t={}));const Pt={deferDefinitionErrorsHandling:!1,positionTracking:"full",lineTerminatorsPattern:/\n|\r\n?/g,lineTerminatorCharacters:["\n","\r"],ensureOptimizations:!1,safeMode:!1,errorMessageProvider:Ot,traceInitPerf:!1,skipValidations:!1,recoveryEnabled:!0};Object.freeze(Pt);class Mt{constructor(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Pt;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=(e,t)=>{if(!0===this.traceInitPerf){this.traceInitIndent++;const n=new Array(this.traceInitIndent+1).join("\t");this.traceInitIndent`);const{time:r,value:i}=kt(t),s=r>10?console.warn:console.log;return this.traceInitIndent time: ${r}ms`),this.traceInitIndent--,i}return t()},"boolean"===typeof t)throw Error("The second argument to the Lexer constructor is now an ILexerConfig Object.\na boolean 2nd argument is no longer supported");this.config=R({},Pt,t);const n=this.config.traceInitPerf;!0===n?(this.traceInitMaxIdent=1/0,this.traceInitPerf=!0):"number"===typeof n&&(this.traceInitMaxIdent=n,this.traceInitPerf=!0),this.traceInitIndent=-1,this.TRACE_INIT("Lexer Constructor",(()=>{let n,i=!0;this.TRACE_INIT("Lexer Config handling",(()=>{if(this.config.lineTerminatorsPattern===Pt.lineTerminatorsPattern)this.config.lineTerminatorsPattern=ft;else if(this.config.lineTerminatorCharacters===Pt.lineTerminatorCharacters)throw Error("Error: Missing property on the Lexer config.\n\tFor 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),(0,Q.A)(e)?n={modes:{defaultMode:(0,c.A)(e)},defaultMode:tt}:(i=!1,n=(0,c.A)(e))})),!1===this.config.skipValidations&&(this.TRACE_INIT("performRuntimeChecks",(()=>{this.lexerDefinitionErrors=this.lexerDefinitionErrors.concat(function(e){const t=[];return(0,o.A)(e,tt)||t.push({message:"A MultiMode Lexer cannot be initialized without a <"+tt+"> property in its definition\n",type:_t.MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE}),(0,o.A)(e,nt)||t.push({message:"A MultiMode Lexer cannot be initialized without a property in its definition\n",type:_t.MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY}),(0,o.A)(e,nt)&&(0,o.A)(e,tt)&&!(0,o.A)(e.modes,e.defaultMode)&&t.push({message:`A MultiMode Lexer cannot be initialized with a ${tt}: <${e.defaultMode}>which does not exist\n`,type:_t.MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST}),(0,o.A)(e,nt)&&(0,r.A)(e.modes,((e,n)=>{(0,r.A)(e,((i,s)=>{if((0,ge.A)(i))t.push({message:`A Lexer cannot be initialized using an undefined Token Type. Mode:<${n}> at index: <${s}>\n`,type:_t.LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED});else if((0,o.A)(i,"LONGER_ALT")){const s=(0,Q.A)(i.LONGER_ALT)?i.LONGER_ALT:[i.LONGER_ALT];(0,r.A)(s,(r=>{(0,ge.A)(r)||ne(e,r)||t.push({message:`A MultiMode Lexer cannot be initialized with a longer_alt <${r.name}> on token <${i.name}> outside of mode <${n}>\n`,type:_t.MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE})}))}}))})),t}(n,this.trackStartLines,this.config.lineTerminatorCharacters))})),this.TRACE_INIT("performWarningRuntimeChecks",(()=>{this.lexerDefinitionWarning=this.lexerDefinitionWarning.concat(ut(n,this.trackStartLines,this.config.lineTerminatorCharacters))}))),n.modes=n.modes?n.modes:{},(0,r.A)(n.modes,((e,t)=>{n.modes[t]=Ee(e,(e=>(0,ge.A)(e)))}));const u=(0,A.A)(n.modes);if((0,r.A)(n.modes,((e,n)=>{this.TRACE_INIT(`Mode: <${n}> processing`,(()=>{if(this.modes.push(n),!1===this.config.skipValidations&&this.TRACE_INIT("validatePatterns",(()=>{this.lexerDefinitionErrors=this.lexerDefinitionErrors.concat(st(e,u))})),(0,s.A)(this.lexerDefinitionErrors)){let r;Nt(e),this.TRACE_INIT("analyzeTokenTypes",(()=>{r=it(e,{lineTerminatorCharacters:this.config.lineTerminatorCharacters,positionTracking:t.positionTracking,ensureOptimizations:t.ensureOptimizations,safeMode:t.safeMode,tracer:this.TRACE_INIT})})),this.patternIdxToConfig[n]=r.patternIdxToConfig,this.charCodeToPatternIdxToConfig[n]=r.charCodeToPatternIdxToConfig,this.emptyGroups=R({},this.emptyGroups,r.emptyGroups),this.hasCustom=r.hasCustom||this.hasCustom,this.canModeBeOptimized[n]=r.canBeOptimized}}))})),this.defaultMode=n.defaultMode,!(0,s.A)(this.lexerDefinitionErrors)&&!this.config.deferDefinitionErrorsHandling){const e=(0,a.A)(this.lexerDefinitionErrors,(e=>e.message)).join("-----------------------\n");throw new Error("Errors detected in definition of Lexer:\n"+e)}(0,r.A)(this.lexerDefinitionWarning,(e=>{Ke(e.message)})),this.TRACE_INIT("Choosing sub-methods implementations",(()=>{if(rt?(this.chopInput=Tt.A,this.match=this.matchWithTest):(this.updateLastIndex=Rt.A,this.match=this.matchWithExec),i&&(this.handleModes=Rt.A),!1===this.trackStartLines&&(this.computeNewColumn=Tt.A),!1===this.trackEndLines&&(this.updateTokenEndLineColumnLocation=Rt.A),/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))throw Error(`Invalid config option: "${this.config.positionTracking}"`);this.createTokenInstance=this.createOffsetOnlyToken}this.hasCustom?(this.addToken=this.addTokenUsingPush,this.handlePayload=this.handlePayloadWithCustom):(this.addToken=this.addTokenUsingMemberAccess,this.handlePayload=this.handlePayloadNoCustom)})),this.TRACE_INIT("Failed Optimization Warnings",(()=>{const e=(0,Ie.A)(this.canModeBeOptimized,((e,t,n)=>(!1===t&&e.push(n),e)),[]);if(t.ensureOptimizations&&!(0,s.A)(e))throw Error(`Lexer Modes: < ${e.join(", ")} > cannot be optimized.\n\t Disable the "ensureOptimizations" lexer config flag to silently ignore this and run the lexer in an un-optimized mode.\n\t Or inspect the console log for details on how to resolve these issues.`)})),this.TRACE_INIT("clearRegExpParserCache",(()=>{Be={}})),this.TRACE_INIT("toFastProperties",(()=>{l(this)}))}))}tokenize(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:this.defaultMode;if(!(0,s.A)(this.lexerDefinitionErrors)){const e=(0,a.A)(this.lexerDefinitionErrors,(e=>e.message)).join("-----------------------\n");throw new Error("Unable to Tokenize because Errors detected in definition of Lexer:\n"+e)}return this.tokenizeInternal(e,t)}tokenizeInternal(e,t){let n,i,s,a,o,c,l,u,d,h,f,p,m,g,y;const v=e,T=v.length;let R=0,E=0;const k=this.hasCustom?0:Math.floor(e.length/10),$=new Array(k),x=[];let I=this.trackStartLines?1:void 0,S=this.trackStartLines?1:void 0;const N=function(e){const t={},n=(0,A.A)(e);return(0,r.A)(n,(n=>{const r=e[n];if(!(0,Q.A)(r))throw Error("non exhaustive match");t[n]=[]})),t}(this.emptyGroups),w=this.trackStartLines,C=this.config.lineTerminatorsPattern;let L=0,b=[],O=[];const _=[],P=[];let M;function D(){return b}function U(e){const t=At(e),n=O[t];return void 0===n?P:n}Object.freeze(P);const F=e=>{if(1===_.length&&void 0===e.tokenType.PUSH_MODE){const t=this.config.errorMessageProvider.buildUnableToPopLexerModeMessage(e);x.push({offset:e.startOffset,line:e.startLine,column:e.startColumn,length:e.image.length,message:t})}else{_.pop();const e=(0,Et.A)(_);b=this.patternIdxToConfig[e],O=this.charCodeToPatternIdxToConfig[e],L=b.length;const t=this.canModeBeOptimized[e]&&!1===this.config.safeMode;M=O&&t?U:D}};function G(e){_.push(e),O=this.charCodeToPatternIdxToConfig[e],b=this.patternIdxToConfig[e],L=b.length,L=b.length;const t=this.canModeBeOptimized[e]&&!1===this.config.safeMode;M=O&&t?U:D}let K;G.call(this,t);const B=this.config.recoveryEnabled;for(;Rc.length){c=a,l=u,K=t;break}}}break}}if(null!==c){if(d=c.length,h=K.group,void 0!==h&&(f=K.tokenTypeIdx,p=this.createTokenInstance(c,R,f,K.tokenType,I,S,d),this.handlePayload(p,l),!1===h?E=this.addToken($,E,p):N[h].push(p)),e=this.chopInput(e,d),R+=d,S=this.computeNewColumn(S,d),!0===w&&!0===K.canLineTerminator){let e,t,n=0;C.lastIndex=0;do{e=C.test(c),!0===e&&(t=C.lastIndex-1,n++)}while(!0===e);0!==n&&(I+=n,S=d-t,this.updateTokenEndLineColumnLocation(p,h,t,n,I,S,d))}this.handleModes(K,F,G,p)}else{const t=R,n=I,r=S;let s=!1===B;for(;!1===s&&Re.concat(t)),[]),n=(0,a.A)(e,(e=>`[${(0,a.A)(e,(e=>Dt(e))).join(", ")}]`));return o+`one of these possible Token sequences:\n${(0,a.A)(n,((e,t)=>` ${t+1}. ${e}`)).join("\n")}`+c}},buildEarlyExitMessage(e){let{expectedIterationPaths:t,actual:n,customUserDescription:r,ruleName:i}=e;const s="Expecting: ",o="\nbut found: '"+Ue(n).image+"'";if(r)return s+r+o;return s+`expecting at least one iteration which starts with one of these possible Token sequences::\n <${(0,a.A)(t,(e=>`[${(0,a.A)(e,(e=>Dt(e))).join(",")}]`)).join(" ,")}>`+o}};Object.freeze(Zt);const Jt={buildRuleNotFoundError:(e,t)=>"Invalid grammar, reference to a rule which is not defined: ->"+t.nonTerminalName+"<-\ninside top level rule: ->"+e.name+"<-"},en={buildDuplicateFoundError(e,t){const n=e.name,r=Ue(t),i=r.idx,s=oe(r),a=(o=r)instanceof H?o.terminalType.name:o instanceof M?o.nonTerminalName:"";var o;let c=`->${s}${i>0?i:""}<- ${a?`with argument: ->${a}<-`:""}\n appears more than once (${t.length} times) in the top level rule: ->${n}<-. \n For further details see: https://chevrotain.io/docs/FAQ.html#NUMERICAL_SUFFIXES \n `;return c=c.replace(/[ \t]+/g," "),c=c.replace(/\s\s+/g,"\n"),c},buildNamespaceConflictError:e=>`Namespace conflict found in grammar.\nThe grammar has both a Terminal(Token) and a Non-Terminal(Rule) named: <${e.name}>.\nTo resolve this make sure each Terminal and Non-Terminal names are unique\nThis is easy to accomplish by using the convention that Terminal names start with an uppercase letter\nand Non-Terminal names start with a lower case letter.`,buildAlternationPrefixAmbiguityError(e){const t=(0,a.A)(e.prefixPath,(e=>Dt(e))).join(", "),n=0===e.alternation.idx?"":e.alternation.idx;return`Ambiguous alternatives: <${e.ambiguityIndices.join(" ,")}> due to common lookahead prefix\nin inside <${e.topLevelRule.name}> Rule,\n<${t}> may appears as a prefix path in all these alternatives.\nSee: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#COMMON_PREFIX\nFor Further details.`},buildAlternationAmbiguityError(e){const t=(0,a.A)(e.prefixPath,(e=>Dt(e))).join(", "),n=0===e.alternation.idx?"":e.alternation.idx;let r=`Ambiguous Alternatives Detected: <${e.ambiguityIndices.join(" ,")}> in inside <${e.topLevelRule.name}> Rule,\n<${t}> may appears as a prefix path in all these alternatives.\n`;return r+="See: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#AMBIGUOUS_ALTERNATIVES\nFor Further details.",r},buildEmptyRepetitionError(e){let t=oe(e.repetition);0!==e.repetition.idx&&(t+=e.repetition.idx);return`The repetition <${t}> within Rule <${e.topLevelRule.name}> can never consume any tokens.\nThis could lead to an infinite loop.`},buildTokenNameError:e=>"deprecated",buildEmptyAlternationError:e=>`Ambiguous empty alternative: <${e.emptyChoiceIdx+1}> in inside <${e.topLevelRule.name}> Rule.\nOnly the last alternative may be an empty alternative.`,buildTooManyAlternativesError:e=>`An Alternation cannot have more than 256 alternatives:\n inside <${e.topLevelRule.name}> Rule.\n has ${e.alternation.definition.length+1} alternatives.`,buildLeftRecursionError(e){const t=e.topLevelRule.name;return`Left Recursion found in grammar.\nrule: <${t}> can be invoked from itself (directly or indirectly)\nwithout consuming any Tokens. The grammar path that causes this is: \n ${`${t} --\x3e ${(0,a.A)(e.leftRecursionPath,(e=>e.name)).concat([t]).join(" --\x3e ")}`}\n To fix this refactor your grammar to remove the left recursion.\nsee: https://en.wikipedia.org/wiki/LL_parser#Left_factoring.`},buildInvalidRuleNameError:e=>"deprecated",buildDuplicateRuleNameError(e){let t;t=e.topLevelRule instanceof D?e.topLevelRule.name:e.topLevelRule;return`Duplicate definition, rule: ->${t}<- is already defined in the grammar: ->${e.grammarName}<-`}};class tn extends z{constructor(e,t){super(),this.nameToTopRule=e,this.errMsgProvider=t,this.errors=[]}resolveRefs(){(0,r.A)((0,i.A)(this.nameToTopRule),(e=>{this.currTopLevel=e,e.accept(this)}))}visitNonTerminal(e){const t=this.nameToTopRule[e.nonTerminalName];if(t)e.referencedRule=t;else{const t=this.errMsgProvider.buildRuleNotFoundError(this.currTopLevel,e);this.errors.push({message:t,type:Or.UNRESOLVED_SUBRULE_REF,ruleName:this.currTopLevel.name,unresolvedRefName:e.nonTerminalName})}}}var nn=n(2080),rn=n(3101);const sn=function(e,t,n,r){for(var i=-1,s=null==e?0:e.length;++i1&&void 0!==arguments[1]?arguments[1]:[];this.found||super.walk(e,t)}walkProdRef(e,t,n){if(e.referencedRule.name===this.nextProductionName&&e.idx===this.nextProductionOccurrence){const r=t.concat(n);this.updateExpectedNext(),this.walk(e.referencedRule,r)}}updateExpectedNext(){(0,s.A)(this.ruleStack)?(this.nextProductionName="",this.nextProductionOccurrence=0,this.isAtEndOfPath=!0):(this.nextProductionName=this.ruleStack.pop(),this.nextProductionOccurrence=this.occurrenceStack.pop())}}class hn extends dn{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){const e=t.concat(n),r=new U({definition:e});this.possibleTokTypes=fe(r),this.found=!0}}}class fn extends ce{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}}class pn extends fn{walkMany(e,t,n){if(e.idx===this.occurrence){const e=Ue(t.concat(n));this.result.isEndOfRule=void 0===e,e instanceof H&&(this.result.token=e.terminalType,this.result.occurrence=e.idx)}else super.walkMany(e,t,n)}}class mn extends fn{walkManySep(e,t,n){if(e.idx===this.occurrence){const e=Ue(t.concat(n));this.result.isEndOfRule=void 0===e,e instanceof H&&(this.result.token=e.terminalType,this.result.occurrence=e.idx)}else super.walkManySep(e,t,n)}}class gn extends fn{walkAtLeastOne(e,t,n){if(e.idx===this.occurrence){const e=Ue(t.concat(n));this.result.isEndOfRule=void 0===e,e instanceof H&&(this.result.token=e.terminalType,this.result.occurrence=e.idx)}else super.walkAtLeastOne(e,t,n)}}class yn extends fn{walkAtLeastOneSep(e,t,n){if(e.idx===this.occurrence){const e=Ue(t.concat(n));this.result.isEndOfRule=void 0===e,e instanceof H&&(this.result.token=e.terminalType,this.result.occurrence=e.idx)}else super.walkAtLeastOneSep(e,t,n)}}function vn(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[];n=(0,c.A)(n);let i=[],a=0;function o(r){const s=vn(r.concat(h(e,a+1)),t,n);return i.concat(s)}for(;n.length{!1===(0,s.A)(e.definition)&&(i=o(e.definition))})),i;if(!(t instanceof H))throw Error("non exhaustive match");n.push(t.terminalType)}}a++}return i.push({partialPath:n,suffixDef:h(e,a)}),i}function An(e,t,n,r){const i="EXIT_NONE_TERMINAL",a=[i],o="EXIT_ALTERNATIVE";let l=!1;const u=t.length,d=u-r-1,f=[],p=[];for(p.push({idx:-1,def:e,ruleStack:[],occurrenceStack:[]});!(0,s.A)(p);){const e=p.pop();if(e===o){l&&(0,Et.A)(p).idx<=d&&p.pop();continue}const r=e.def,m=e.idx,g=e.ruleStack,y=e.occurrenceStack;if((0,s.A)(r))continue;const v=r[0];if(v===i){const e={idx:m,def:h(r),ruleStack:un(g),occurrenceStack:un(y)};p.push(e)}else if(v instanceof H)if(m=0;t--){const e={idx:m,def:v.definition[t].definition.concat(h(r)),ruleStack:g,occurrenceStack:y};p.push(e),p.push(o)}else if(v instanceof U)p.push({idx:m,def:v.definition.concat(h(r)),ruleStack:g,occurrenceStack:y});else{if(!(v instanceof D))throw Error("non exhaustive match");p.push(Tn(v,m,g,y))}}return f}function Tn(e,t,n,r){const i=(0,c.A)(n);i.push(e.name);const s=(0,c.A)(r);return s.push(1),{idx:t,def:e.definition,ruleStack:i,occurrenceStack:s}}var Rn;function En(e){if(e instanceof F||"Option"===e)return Rn.OPTION;if(e instanceof B||"Repetition"===e)return Rn.REPETITION;if(e instanceof G||"RepetitionMandatory"===e)return Rn.REPETITION_MANDATORY;if(e instanceof K||"RepetitionMandatoryWithSeparator"===e)return Rn.REPETITION_MANDATORY_WITH_SEPARATOR;if(e instanceof j||"RepetitionWithSeparator"===e)return Rn.REPETITION_WITH_SEPARATOR;if(e instanceof V||"Alternation"===e)return Rn.ALTERNATION;throw Error("non exhaustive match")}function kn(e){const{occurrence:t,rule:n,prodType:r,maxLookahead:i}=e,s=En(r);return s===Rn.ALTERNATION?bn(t,n,i):On(t,n,s,i)}function $n(e,t,n,i){const s=e.length,c=se(e,(e=>se(e,(e=>1===e.length))));if(t)return function(t){const r=(0,a.A)(t,(e=>e.GATE));for(let i=0;i(0,he.A)(e))),n=(0,Ie.A)(t,((e,t,n)=>((0,r.A)(t,(t=>{(0,o.A)(e,t.tokenTypeIdx)||(e[t.tokenTypeIdx]=n),(0,r.A)(t.categoryMatches,(t=>{(0,o.A)(e,t)||(e[t]=n)}))})),e)),{});return function(){const e=this.LA(1);return n[e.tokenTypeIdx]}}return function(){for(let t=0;t1===e.length)),a=e.length;if(i&&!n){const t=(0,he.A)(e);if(1===t.length&&(0,s.A)(t[0].categoryMatches)){const e=t[0].tokenTypeIdx;return function(){return this.LA(1).tokenTypeIdx===e}}{const e=(0,Ie.A)(t,((e,t,n)=>(e[t.tokenTypeIdx]=!0,(0,r.A)(t.categoryMatches,(t=>{e[t]=!0})),e)),[]);return function(){const t=this.LA(1);return!0===e[t.tokenTypeIdx]}}}return function(){e:for(let n=0;nvn([e],1))),i=Nn(n.length),o=(0,a.A)(n,(e=>{const t={};return(0,r.A)(e,(e=>{const n=wn(e.partialPath);(0,r.A)(n,(e=>{t[e]=!0}))})),t}));let c=n;for(let a=1;a<=t;a++){const e=c;c=Nn(e.length);for(let n=0;n{const t=wn(e.partialPath);(0,r.A)(t,(e=>{o[n][e]=!0}))}))}}}}return i}function bn(e,t,n,r){const i=new Sn(e,Rn.ALTERNATION,r);return t.accept(i),Ln(i.result,n)}function On(e,t,n,r){const i=new Sn(e,n);t.accept(i);const s=i.result,a=new In(t,e,n).startWalking();return Ln([new U({definition:s}),new U({definition:a})],r)}function _n(e,t){e:for(let n=0;nse(e,(e=>se(e,(e=>(0,s.A)(e.categoryMatches)))))))}function Mn(e,t,n,s){const o=(0,nn.A)(e,(e=>function(e,t){const n=new Fn;e.accept(n);const r=n.allProductions,s=ln(r,Dn),o=I(s,(e=>e.length>1)),c=(0,a.A)((0,i.A)(o),(n=>{const r=Ue(n),i=t.buildDuplicateFoundError(e,n),s=oe(r),a={message:i,type:Or.DUPLICATE_PRODUCTIONS,ruleName:e.name,dslName:s,occurrence:r.idx},o=Un(r);return o&&(a.parameter=o),a}));return c}(e,n))),c=function(e,t,n){const i=[],s=(0,a.A)(t,(e=>e.name));return(0,r.A)(e,(e=>{const t=e.name;if(ne(s,t)){const r=n.buildNamespaceConflictError(e);i.push({message:r,type:Or.CONFLICT_TOKENS_RULES_NAMESPACE,ruleName:t})}})),i}(e,t,n),l=(0,nn.A)(e,(e=>function(e,t){const n=new Bn;e.accept(n);const r=n.alternations,i=(0,nn.A)(r,(n=>n.definition.length>255?[{message:t.buildTooManyAlternativesError({topLevelRule:e,alternation:n}),type:Or.TOO_MANY_ALTS,ruleName:e.name,occurrence:n.idx}]:[]));return i}(e,n))),u=(0,nn.A)(e,(t=>function(e,t,n,r){const i=[],s=(0,Ie.A)(t,((t,n)=>n.name===e.name?t+1:t),0);if(s>1){const t=r.buildDuplicateRuleNameError({topLevelRule:e,grammarName:n});i.push({message:t,type:Or.DUPLICATE_RULE_NAME,ruleName:e.name})}return i}(t,e,s,n)));return o.concat(c,l,u)}function Dn(e){return`${oe(e)}_#_${e.idx}_#_${Un(e)}`}function Un(e){return e instanceof H?e.terminalType.name:e instanceof M?e.nonTerminalName:""}class Fn extends z{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 Gn(e,t,n){let r=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[];const i=[],a=Kn(t.definition);if((0,s.A)(a))return[];{const t=e.name;ne(a,e)&&i.push({message:n.buildLeftRecursionError({topLevelRule:e,leftRecursionPath:r}),type:Or.LEFT_RECURSION,ruleName:t});const s=Me(a,r.concat([e])),o=(0,nn.A)(s,(t=>{const i=(0,c.A)(r);return i.push(t),Gn(e,t,n,i)}));return i.concat(o)}}function Kn(e){let t=[];if((0,s.A)(e))return t;const n=Ue(e);if(n instanceof M)t.push(n.referencedRule);else if(n instanceof U||n instanceof F||n instanceof G||n instanceof K||n instanceof j||n instanceof B)t=t.concat(Kn(n.definition));else if(n instanceof V)t=(0,he.A)((0,a.A)(n.definition,(e=>Kn(e.definition))));else if(!(n instanceof H))throw Error("non exhaustive match");const r=ae(n),i=e.length>1;if(r&&i){const n=h(e);return t.concat(Kn(n))}return t}class Bn extends z{constructor(){super(...arguments),this.alternations=[]}visitAlternation(e){this.alternations.push(e)}}function jn(e,t,n){const i=new Bn;e.accept(i);let s=i.alternations;s=Ee(s,(e=>!0===e.ignoreAmbiguities));const o=(0,nn.A)(s,(i=>{const s=i.idx,o=i.maxLookahead||t,c=bn(s,e,o,i),l=function(e,t,n,i){const s=[],o=(0,Ie.A)(e,((n,i,a)=>(!0===t.definition[a].ignoreAmbiguities||(0,r.A)(i,(i=>{const o=[a];(0,r.A)(e,((e,n)=>{a!==n&&_n(e,i)&&!0!==t.definition[n].ignoreAmbiguities&&o.push(n)})),o.length>1&&!_n(s,i)&&(s.push(i),n.push({alts:o,path:i}))})),n)),[]),c=(0,a.A)(o,(e=>{const r=(0,a.A)(e.alts,(e=>e+1));return{message:i.buildAlternationAmbiguityError({topLevelRule:n,alternation:t,ambiguityIndices:r,prefixPath:e.path}),type:Or.AMBIGUOUS_ALTS,ruleName:n.name,occurrence:t.idx,alternatives:e.alts}}));return c}(c,i,e,n),u=function(e,t,n,r){const i=(0,Ie.A)(e,((e,t,n)=>{const r=(0,a.A)(t,(e=>({idx:n,path:e})));return e.concat(r)}),[]),s=De((0,nn.A)(i,(e=>{if(!0===t.definition[e.idx].ignoreAmbiguities)return[];const s=e.idx,o=e.path,c=(0,Se.A)(i,(e=>{return!0!==t.definition[e.idx].ignoreAmbiguities&&e.idx{const n=r[t];return e===n||n.categoryMatchesMap[e.tokenTypeIdx]})));var n,r}));return(0,a.A)(c,(e=>{const i=[e.idx+1,s+1],a=0===t.idx?"":t.idx;return{message:r.buildAlternationPrefixAmbiguityError({topLevelRule:n,alternation:t,ambiguityIndices:i,prefixPath:e.path}),type:Or.AMBIGUOUS_PREFIX_ALTS,ruleName:n.name,occurrence:a,alternatives:i}}))})));return s}(c,i,e,n);return l.concat(u)}));return o}class Vn extends z{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 Hn(e){const t=(0,ve.A)(e,{errMsgProvider:Jt}),n={};return(0,r.A)(e.rules,(e=>{n[e.name]=e})),function(e,t){const n=new tn(e,t);return n.resolveRefs(),n.errors}(n,t.errMsgProvider)}const Wn="MismatchedTokenException",zn="NoViableAltException",Yn="EarlyExitException",Xn="NotAllInputParsedException",qn=[Wn,zn,Yn,Xn];function Qn(e){return ne(qn,e.name)}Object.freeze(qn);class Zn extends Error{constructor(e,t){super(e),this.token=t,this.resyncedTokens=[],Object.setPrototypeOf(this,new.target.prototype),Error.captureStackTrace&&Error.captureStackTrace(this,this.constructor)}}class Jn extends Zn{constructor(e,t,n){super(e,t),this.previousToken=n,this.name=Wn}}class er extends Zn{constructor(e,t,n){super(e,t),this.previousToken=n,this.name=zn}}class tr extends Zn{constructor(e,t){super(e,t),this.name=Xn}}class nr extends Zn{constructor(e,t,n){super(e,t),this.previousToken=n,this.name=Yn}}const rr={},ir="InRuleRecoveryException";class sr extends Error{constructor(e){super(e),this.name=ir}}function ar(e,t,n,r,i,s,a){const o=this.getKeyForAutomaticLookahead(r,i);let c=this.firstAfterRepMap[o];if(void 0===c){const e=this.getCurrRuleFullName();c=new s(this.getGAstProductions()[e],i).startWalking(),this.firstAfterRepMap[o]=c}let l=c.token,u=c.occurrence;const d=c.isEndOfRule;1===this.RULE_STACK.length&&d&&void 0===l&&(l=Xt,u=1),void 0!==l&&void 0!==u&&this.shouldInRepetitionRecoveryBeTried(l,u,a)&&this.tryInRepetitionRecovery(e,t,n,l)}const or=1024,cr=1280,lr=1536;function ur(e,t,n){return n|t|e}class dr{constructor(e){var t;this.maxLookahead=null!==(t=null===e||void 0===e?void 0:e.maxLookahead)&&void 0!==t?t:Lr.maxLookahead}validate(e){const t=this.validateNoLeftRecursion(e.rules);if((0,s.A)(t)){const n=this.validateEmptyOrAlternatives(e.rules),r=this.validateAmbiguousAlternationAlternatives(e.rules,this.maxLookahead),i=this.validateSomeNonEmptyLookaheadPath(e.rules,this.maxLookahead);return[...t,...n,...r,...i]}return t}validateNoLeftRecursion(e){return(0,nn.A)(e,(e=>Gn(e,e,en)))}validateEmptyOrAlternatives(e){return(0,nn.A)(e,(e=>function(e,t){const n=new Bn;e.accept(n);const r=n.alternations;return(0,nn.A)(r,(n=>{const r=un(n.definition);return(0,nn.A)(r,((r,i)=>{const a=An([r],[],$t,1);return(0,s.A)(a)?[{message:t.buildEmptyAlternationError({topLevelRule:e,alternation:n,emptyChoiceIdx:i}),type:Or.NONE_LAST_EMPTY_ALT,ruleName:e.name,occurrence:n.idx,alternative:i+1}]:[]}))}))}(e,en)))}validateAmbiguousAlternationAlternatives(e,t){return(0,nn.A)(e,(e=>jn(e,t,en)))}validateSomeNonEmptyLookaheadPath(e,t){return function(e,t,n){const i=[];return(0,r.A)(e,(e=>{const a=new Vn;e.accept(a);const o=a.allProductions;(0,r.A)(o,(r=>{const a=En(r),o=r.maxLookahead||t,c=On(r.idx,e,a,o)[0];if((0,s.A)((0,he.A)(c))){const t=n.buildEmptyRepetitionError({topLevelRule:e,repetition:r});i.push({message:t,type:Or.NO_NON_EMPTY_LOOKAHEAD,ruleName:e.name})}}))})),i}(e,t,en)}buildLookaheadForAlternation(e){return function(e,t,n,r,i,s){const a=bn(e,t,n);return s(a,r,Pn(a)?xt:$t,i)}(e.prodOccurrence,e.rule,e.maxLookahead,e.hasPredicates,e.dynamicTokensEnabled,$n)}buildLookaheadForOptional(e){return function(e,t,n,r,i,s){const a=On(e,t,i,n),o=Pn(a)?xt:$t;return s(a[0],o,r)}(e.prodOccurrence,e.rule,e.maxLookahead,e.dynamicTokensEnabled,En(e.prodType),xn)}}const hr=new class extends z{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)}};function fr(e,t){!0===isNaN(e.startOffset)?(e.startOffset=t.startOffset,e.endOffset=t.endOffset):e.endOffset!1===(0,ke.A)(e[t]))),r=(0,a.A)(n,(t=>({msg:`Missing visitor method: <${t}> on ${e.constructor.name} CST Visitor.`,type:vr.MISSING_METHOD,methodName:t})));return De(r)}(e,t);return n}(this,t);if(!(0,s.A)(e)){const t=(0,a.A)(e,(e=>e.msg));throw Error(`Errors Detected in CST Visitor <${this.constructor.name}>:\n\t${t.join("\n\n").replace(/\n/g,"\n\t")}`)}}};return(n.prototype=r).constructor=n,n._RULE_NAMES=t,n}var vr;!function(e){e[e.REDUNDANT_METHOD=0]="REDUNDANT_METHOD",e[e.MISSING_METHOD=1]="MISSING_METHOD"}(vr||(vr={}));var Ar=n(7664);const Tr={description:"This Object indicates the Parser is during Recording Phase"};Object.freeze(Tr);const Rr=!0,Er=Math.pow(2,8)-1,kr=Yt({name:"RECORDING_PHASE_TOKEN",pattern:Mt.NA});Nt([kr]);const $r=qt(kr,"This IToken indicates the Parser is in Recording Phase\n\tSee: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details",-1,-1,-1,-1,-1,-1);Object.freeze($r);const xr={name:"This CSTNode indicates the Parser is in Recording Phase\n\tSee: https://chevrotain.io/docs/guide/internals.html#grammar-recording for details",children:{}};function Ir(e,t,n){let r=arguments.length>3&&void 0!==arguments[3]&&arguments[3];wr(n);const i=(0,Et.A)(this.recordingProdStack),s=(0,ke.A)(t)?t:t.DEF,a=new e({definition:[],idx:n});return r&&(a.separator=t.SEP),(0,o.A)(t,"MAX_LOOKAHEAD")&&(a.maxLookahead=t.MAX_LOOKAHEAD),this.recordingProdStack.push(a),s.call(this),i.definition.push(a),this.recordingProdStack.pop(),Tr}function Sr(e,t){wr(t);const n=(0,Et.A)(this.recordingProdStack),i=!1===(0,Q.A)(e),s=!1===i?e:e.DEF,a=new V({definition:[],idx:t,ignoreAmbiguities:i&&!0===e.IGNORE_AMBIGUITIES});(0,o.A)(e,"MAX_LOOKAHEAD")&&(a.maxLookahead=e.MAX_LOOKAHEAD);const c=J(s,(e=>(0,ke.A)(e.GATE)));return a.hasPredicates=c,n.definition.push(a),(0,r.A)(s,(e=>{const t=new U({definition:[]});a.definition.push(t),(0,o.A)(e,"IGNORE_AMBIGUITIES")?t.ignoreAmbiguities=e.IGNORE_AMBIGUITIES:(0,o.A)(e,"GATE")&&(t.ignoreAmbiguities=!0),this.recordingProdStack.push(t),e.ALT.call(this),this.recordingProdStack.pop()})),Tr}function Nr(e){return 0===e?"":`${e}`}function wr(e){if(e<0||e>Er){const t=new Error(`Invalid DSL Method idx value: <${e}>\n\tIdx value must be a none negative value smaller than ${Er+1}`);throw t.KNOWN_RECORDER_ERROR=!0,t}}const Cr=qt(Xt,"",NaN,NaN,NaN,NaN,NaN,NaN);Object.freeze(Cr);const Lr=Object.freeze({recoveryEnabled:!1,maxLookahead:3,dynamicTokensEnabled:!1,outputCst:!0,errorMessageProvider:Zt,nodeLocationTracking:"none",traceInitPerf:!1,skipValidations:!1}),br=Object.freeze({recoveryValueFunc:()=>{},resyncEnabled:!0});var Or,_r;function Pr(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:void 0;return function(){return e}}!function(e){e[e.INVALID_RULE_NAME=0]="INVALID_RULE_NAME",e[e.DUPLICATE_RULE_NAME=1]="DUPLICATE_RULE_NAME",e[e.INVALID_RULE_OVERRIDE=2]="INVALID_RULE_OVERRIDE",e[e.DUPLICATE_PRODUCTIONS=3]="DUPLICATE_PRODUCTIONS",e[e.UNRESOLVED_SUBRULE_REF=4]="UNRESOLVED_SUBRULE_REF",e[e.LEFT_RECURSION=5]="LEFT_RECURSION",e[e.NONE_LAST_EMPTY_ALT=6]="NONE_LAST_EMPTY_ALT",e[e.AMBIGUOUS_ALTS=7]="AMBIGUOUS_ALTS",e[e.CONFLICT_TOKENS_RULES_NAMESPACE=8]="CONFLICT_TOKENS_RULES_NAMESPACE",e[e.INVALID_TOKEN_NAME=9]="INVALID_TOKEN_NAME",e[e.NO_NON_EMPTY_LOOKAHEAD=10]="NO_NON_EMPTY_LOOKAHEAD",e[e.AMBIGUOUS_PREFIX_ALTS=11]="AMBIGUOUS_PREFIX_ALTS",e[e.TOO_MANY_ALTS=12]="TOO_MANY_ALTS",e[e.CUSTOM_LOOKAHEAD_VALIDATION=13]="CUSTOM_LOOKAHEAD_VALIDATION"}(Or||(Or={}));class Mr{static performSelfAnalysis(e){throw Error("The **static** `performSelfAnalysis` method has been deprecated.\t\nUse the **instance** method with the same name instead.")}performSelfAnalysis(){this.TRACE_INIT("performSelfAnalysis",(()=>{let e;this.selfAnalysisDone=!0;const t=this.className;this.TRACE_INIT("toFastProps",(()=>{l(this)})),this.TRACE_INIT("Grammar Recording",(()=>{try{this.enableRecording(),(0,r.A)(this.definedRulesNames,(e=>{const t=this[e].originalGrammarAction;let n;this.TRACE_INIT(`${e} Rule`,(()=>{n=this.topLevelRuleRecord(e,t)})),this.gastProductionsCache[e]=n}))}finally{this.disableRecording()}}));let n=[];if(this.TRACE_INIT("Grammar Resolving",(()=>{n=Hn({rules:(0,i.A)(this.gastProductionsCache)}),this.definitionErrors=this.definitionErrors.concat(n)})),this.TRACE_INIT("Grammar Validations",(()=>{if((0,s.A)(n)&&!1===this.skipValidations){const n=(e={rules:(0,i.A)(this.gastProductionsCache),tokenTypes:(0,i.A)(this.tokensMap),errMsgProvider:en,grammarName:t},Mn((e=(0,ve.A)(e,{errMsgProvider:en})).rules,e.tokenTypes,e.errMsgProvider,e.grammarName)),r=function(e){const t=e.lookaheadStrategy.validate({rules:e.rules,tokenTypes:e.tokenTypes,grammarName:e.grammarName});return(0,a.A)(t,(e=>Object.assign({type:Or.CUSTOM_LOOKAHEAD_VALIDATION},e)))}({lookaheadStrategy:this.lookaheadStrategy,rules:(0,i.A)(this.gastProductionsCache),tokenTypes:(0,i.A)(this.tokensMap),grammarName:t});this.definitionErrors=this.definitionErrors.concat(n,r)}var e})),(0,s.A)(this.definitionErrors)&&(this.recoveryEnabled&&this.TRACE_INIT("computeAllProdsFollows",(()=>{const e=function(e){const t={};return(0,r.A)(e,(e=>{const n=new me(e).startWalking();R(t,n)})),t}((0,i.A)(this.gastProductionsCache));this.resyncFollows=e})),this.TRACE_INIT("ComputeLookaheadFunctions",(()=>{var e,t;null===(t=(e=this.lookaheadStrategy).initialize)||void 0===t||t.call(e,{rules:(0,i.A)(this.gastProductionsCache)}),this.preComputeLookaheadFunctions((0,i.A)(this.gastProductionsCache))}))),!Mr.DEFER_DEFINITION_ERRORS_HANDLING&&!(0,s.A)(this.definitionErrors))throw e=(0,a.A)(this.definitionErrors,(e=>e.message)),new Error(`Parser Definition Errors detected:\n ${e.join("\n-------------------------------\n")}`)}))}constructor(e,t){this.definitionErrors=[],this.selfAnalysisDone=!1;const 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),(0,o.A)(t,"ignoredIssues"))throw new Error("The IParserConfig property has been deprecated.\n\tPlease use the flag on the relevant DSL method instead.\n\tSee: https://chevrotain.io/docs/guide/resolving_grammar_errors.html#IGNORING_AMBIGUITIES\n\tFor further details.");this.skipValidations=(0,o.A)(t,"skipValidations")?t.skipValidations:Lr.skipValidations}}Mr.DEFER_DEFINITION_ERRORS_HANDLING=!1,_r=Mr,[class{initRecoverable(e){this.firstAfterRepMap={},this.resyncFollows={},this.recoveryEnabled=(0,o.A)(e,"recoveryEnabled")?e.recoveryEnabled:Lr.recoveryEnabled,this.recoveryEnabled&&(this.attemptInRepetitionRecovery=ar)}getTokenToInsert(e){const t=qt(e,"",NaN,NaN,NaN,NaN,NaN,NaN);return t.isInsertedInRecovery=!0,t}canTokenTypeBeInsertedInRecovery(e){return!0}canTokenTypeBeDeletedInRecovery(e){return!0}tryInRepetitionRecovery(e,t,n,r){const i=this.findReSyncTokenType(),s=this.exportLexerState(),a=[];let o=!1;const c=this.LA(1);let l=this.LA(1);const u=()=>{const e=this.LA(0),t=this.errorMessageProvider.buildMismatchTokenMessage({expected:r,actual:c,previous:e,ruleName:this.getCurrRuleFullName()}),n=new Jn(t,c,this.LA(0));n.resyncedTokens=un(a),this.SAVE_ERROR(n)};for(;!o;){if(this.tokenMatcher(l,r))return void u();if(n.call(this))return u(),void e.apply(this,t);this.tokenMatcher(l,i)?o=!0:(l=this.SKIP_TOKEN(),this.addToResyncTokens(l,a))}this.importLexerState(s)}shouldInRepetitionRecoveryBeTried(e,t,n){return!1!==n&&!this.tokenMatcher(this.LA(1),e)&&!this.isBackTracking()&&!this.canPerformInRuleRecovery(e,this.getFollowsForInRuleRecovery(e,t))}getFollowsForInRuleRecovery(e,t){const 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)){const e=this.SKIP_TOKEN();return this.consumeToken(),e}throw new sr("sad sad panda")}canPerformInRuleRecovery(e,t){return this.canRecoverWithSingleTokenInsertion(e,t)||this.canRecoverWithSingleTokenDeletion(e)}canRecoverWithSingleTokenInsertion(e,t){if(!this.canTokenTypeBeInsertedInRecovery(e))return!1;if((0,s.A)(t))return!1;const n=this.LA(1);return void 0!==(0,Fe.A)(t,(e=>this.tokenMatcher(n,e)))}canRecoverWithSingleTokenDeletion(e){return!!this.canTokenTypeBeDeletedInRecovery(e)&&this.tokenMatcher(this.LA(2),e)}isInCurrentRuleReSyncSet(e){const t=this.getCurrFollowKey(),n=this.getFollowSetFromFollowKey(t);return ne(n,e)}findReSyncTokenType(){const e=this.flattenFollowSet();let t=this.LA(1),n=2;for(;;){const r=(0,Fe.A)(e,(e=>Qt(t,e)));if(void 0!==r)return r;t=this.LA(n),n++}}getCurrFollowKey(){if(1===this.RULE_STACK.length)return rr;const e=this.getLastExplicitRuleShortName(),t=this.getLastExplicitRuleOccurrenceIndex(),n=this.getPreviousExplicitRuleShortName();return{ruleName:this.shortRuleNameToFullName(e),idxInCallingRule:t,inRule:this.shortRuleNameToFullName(n)}}buildFullFollowKeyStack(){const e=this.RULE_STACK,t=this.RULE_OCCURRENCE_STACK;return(0,a.A)(e,((n,r)=>0===r?rr:{ruleName:this.shortRuleNameToFullName(n),idxInCallingRule:t[r],inRule:this.shortRuleNameToFullName(e[r-1])}))}flattenFollowSet(){const e=(0,a.A)(this.buildFullFollowKeyStack(),(e=>this.getFollowSetFromFollowKey(e)));return(0,he.A)(e)}getFollowSetFromFollowKey(e){if(e===rr)return[Xt];const t=e.ruleName+e.idxInCallingRule+pe+e.inRule;return this.resyncFollows[t]}addToResyncTokens(e,t){return this.tokenMatcher(e,Xt)||t.push(e),t}reSyncTo(e){const t=[];let n=this.LA(1);for(;!1===this.tokenMatcher(n,e);)n=this.SKIP_TOKEN(),this.addToResyncTokens(n,t);return un(t)}attemptInRepetitionRecovery(e,t,n,r,i,s,a){}getCurrentGrammarPath(e,t){return{ruleStack:this.getHumanReadableRuleStack(),occurrenceStack:(0,c.A)(this.RULE_OCCURRENCE_STACK),lastTok:e,lastTokOccurrence:t}}getHumanReadableRuleStack(){return(0,a.A)(this.RULE_STACK,(e=>this.shortRuleNameToFullName(e)))}},class{initLooksAhead(e){this.dynamicTokensEnabled=(0,o.A)(e,"dynamicTokensEnabled")?e.dynamicTokensEnabled:Lr.dynamicTokensEnabled,this.maxLookahead=(0,o.A)(e,"maxLookahead")?e.maxLookahead:Lr.maxLookahead,this.lookaheadStrategy=(0,o.A)(e,"lookaheadStrategy")?e.lookaheadStrategy:new dr({maxLookahead:this.maxLookahead}),this.lookAheadFuncsCache=new Map}preComputeLookaheadFunctions(e){(0,r.A)(e,(e=>{this.TRACE_INIT(`${e.name} Rule Lookahead`,(()=>{const{alternation:t,repetition:n,option:i,repetitionMandatory:s,repetitionMandatoryWithSeparator:a,repetitionWithSeparator:o}=function(e){hr.reset(),e.accept(hr);const t=hr.dslMethods;return hr.reset(),t}(e);(0,r.A)(t,(t=>{const n=0===t.idx?"":t.idx;this.TRACE_INIT(`${oe(t)}${n}`,(()=>{const n=this.lookaheadStrategy.buildLookaheadForAlternation({prodOccurrence:t.idx,rule:e,maxLookahead:t.maxLookahead||this.maxLookahead,hasPredicates:t.hasPredicates,dynamicTokensEnabled:this.dynamicTokensEnabled}),r=ur(this.fullRuleNameToShort[e.name],256,t.idx);this.setLaFuncCache(r,n)}))})),(0,r.A)(n,(t=>{this.computeLookaheadFunc(e,t.idx,768,"Repetition",t.maxLookahead,oe(t))})),(0,r.A)(i,(t=>{this.computeLookaheadFunc(e,t.idx,512,"Option",t.maxLookahead,oe(t))})),(0,r.A)(s,(t=>{this.computeLookaheadFunc(e,t.idx,or,"RepetitionMandatory",t.maxLookahead,oe(t))})),(0,r.A)(a,(t=>{this.computeLookaheadFunc(e,t.idx,lr,"RepetitionMandatoryWithSeparator",t.maxLookahead,oe(t))})),(0,r.A)(o,(t=>{this.computeLookaheadFunc(e,t.idx,cr,"RepetitionWithSeparator",t.maxLookahead,oe(t))}))}))}))}computeLookaheadFunc(e,t,n,r,i,s){this.TRACE_INIT(`${s}${0===t?"":t}`,(()=>{const s=this.lookaheadStrategy.buildLookaheadForOptional({prodOccurrence:t,rule:e,maxLookahead:i||this.maxLookahead,dynamicTokensEnabled:this.dynamicTokensEnabled,prodType:r}),a=ur(this.fullRuleNameToShort[e.name],n,t);this.setLaFuncCache(a,s)}))}getKeyForAutomaticLookahead(e,t){return ur(this.getLastExplicitRuleShortName(),e,t)}getLaFuncFromCache(e){return this.lookAheadFuncsCache.get(e)}setLaFuncCache(e,t){this.lookAheadFuncsCache.set(e,t)}},class{initTreeBuilder(e){if(this.CST_STACK=[],this.outputCst=e.outputCst,this.nodeLocationTracking=(0,o.A)(e,"nodeLocationTracking")?e.nodeLocationTracking:Lr.nodeLocationTracking,this.outputCst)if(/full/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=pr,this.setNodeLocationFromNode=pr,this.cstPostRule=Rt.A,this.setInitialNodeLocation=this.setInitialNodeLocationFullRecovery):(this.setNodeLocationFromToken=Rt.A,this.setNodeLocationFromNode=Rt.A,this.cstPostRule=this.cstPostRuleFull,this.setInitialNodeLocation=this.setInitialNodeLocationFullRegular);else if(/onlyOffset/i.test(this.nodeLocationTracking))this.recoveryEnabled?(this.setNodeLocationFromToken=fr,this.setNodeLocationFromNode=fr,this.cstPostRule=Rt.A,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRecovery):(this.setNodeLocationFromToken=Rt.A,this.setNodeLocationFromNode=Rt.A,this.cstPostRule=this.cstPostRuleOnlyOffset,this.setInitialNodeLocation=this.setInitialNodeLocationOnlyOffsetRegular);else{if(!/none/i.test(this.nodeLocationTracking))throw Error(`Invalid config option: "${e.nodeLocationTracking}"`);this.setNodeLocationFromToken=Rt.A,this.setNodeLocationFromNode=Rt.A,this.cstPostRule=Rt.A,this.setInitialNodeLocation=Rt.A}else this.cstInvocationStateUpdate=Rt.A,this.cstFinallyStateUpdate=Rt.A,this.cstPostTerminal=Rt.A,this.cstPostNonTerminal=Rt.A,this.cstPostRule=Rt.A}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){const t=this.LA(1);e.location={startOffset:t.startOffset,startLine:t.startLine,startColumn:t.startColumn,endOffset:NaN,endLine:NaN,endColumn:NaN}}cstInvocationStateUpdate(e){const t={name:e,children:Object.create(null)};this.setInitialNodeLocation(t),this.CST_STACK.push(t)}cstFinallyStateUpdate(){this.CST_STACK.pop()}cstPostRuleFull(e){const t=this.LA(0),n=e.location;n.startOffset<=t.startOffset===!0?(n.endOffset=t.endOffset,n.endLine=t.endLine,n.endColumn=t.endColumn):(n.startOffset=NaN,n.startLine=NaN,n.startColumn=NaN)}cstPostRuleOnlyOffset(e){const t=this.LA(0),n=e.location;n.startOffset<=t.startOffset===!0?n.endOffset=t.endOffset:n.startOffset=NaN}cstPostTerminal(e,t){const n=this.CST_STACK[this.CST_STACK.length-1];var r,i,s;i=t,s=e,void 0===(r=n).children[s]?r.children[s]=[i]:r.children[s].push(i),this.setNodeLocationFromToken(n.location,t)}cstPostNonTerminal(e,t){const n=this.CST_STACK[this.CST_STACK.length-1];!function(e,t,n){void 0===e.children[t]?e.children[t]=[n]:e.children[t].push(n)}(n,t,e),this.setNodeLocationFromNode(n.location,e.location)}getBaseCstVisitorConstructor(){if((0,ge.A)(this.baseCstVisitorConstructor)){const e=yr(this.className,(0,A.A)(this.gastProductionsCache));return this.baseCstVisitorConstructor=e,e}return this.baseCstVisitorConstructor}getBaseCstVisitorConstructorWithDefaults(){if((0,ge.A)(this.baseCstVisitorWithDefaultsConstructor)){const e=function(e,t,n){const i=function(){};mr(i,e+"BaseSemanticsWithDefaults");const s=Object.create(n.prototype);return(0,r.A)(t,(e=>{s[e]=gr})),(i.prototype=s).constructor=i,i}(this.className,(0,A.A)(this.gastProductionsCache),this.getBaseCstVisitorConstructor());return this.baseCstVisitorWithDefaultsConstructor=e,e}return this.baseCstVisitorWithDefaultsConstructor}getLastExplicitRuleShortName(){const e=this.RULE_STACK;return e[e.length-1]}getPreviousExplicitRuleShortName(){const e=this.RULE_STACK;return e[e.length-2]}getLastExplicitRuleOccurrenceIndex(){const e=this.RULE_OCCURRENCE_STACK;return e[e.length-1]}},class{initLexerAdapter(){this.tokVector=[],this.tokVectorLength=0,this.currIdx=-1}set input(e){if(!0!==this.selfAnalysisDone)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)):Cr}LA(e){const t=this.currIdx+e;return t<0||this.tokVectorLength<=t?Cr: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()}},class{initRecognizerEngine(e,t){if(this.className=this.constructor.name,this.shortRuleNameToFull={},this.fullRuleNameToShort={},this.ruleShortNameIdx=256,this.tokenMatcher=xt,this.subruleIdx=0,this.definedRulesNames=[],this.tokensMap={},this.isBackTrackingStack=[],this.RULE_STACK=[],this.RULE_OCCURRENCE_STACK=[],this.gastProductionsCache={},(0,o.A)(t,"serializedGrammar"))throw Error("The Parser's configuration can no longer contain a property.\n\tSee: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_6-0-0\n\tFor Further details.");if((0,Q.A)(e)){if((0,s.A)(e))throw Error("A Token Vocabulary cannot be empty.\n\tNote that the first argument for the parser constructor\n\tis no longer a Token vector (since v4.0).");if("number"===typeof e[0].startOffset)throw Error("The Parser constructor no longer accepts a token vector as the first argument.\n\tSee: https://chevrotain.io/docs/changes/BREAKING_CHANGES.html#_4-0-0\n\tFor Further details.")}if((0,Q.A)(e))this.tokensMap=(0,Ie.A)(e,((e,t)=>(e[t.name]=t,e)),{});else if((0,o.A)(e,"modes")&&se((0,he.A)((0,i.A)(e.modes)),bt)){const t=(0,he.A)((0,i.A)(e.modes)),n=de(t);this.tokensMap=(0,Ie.A)(n,((e,t)=>(e[t.name]=t,e)),{})}else{if(!(0,Ar.A)(e))throw new Error(" argument must be An Array of Token constructors, A dictionary of Token constructors or an IMultiModeLexerDefinition");this.tokensMap=(0,c.A)(e)}this.tokensMap.EOF=Xt;const n=(0,o.A)(e,"modes")?(0,he.A)((0,i.A)(e.modes)):(0,i.A)(e),r=se(n,(e=>(0,s.A)(e.categoryMatches)));this.tokenMatcher=r?xt:$t,Nt((0,i.A)(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'\nMake sure that all grammar rule definitions are done before 'performSelfAnalysis' is called.`);const r=(0,o.A)(n,"resyncEnabled")?n.resyncEnabled:br.resyncEnabled,i=(0,o.A)(n,"recoveryValueFunc")?n.recoveryValueFunc:br.recoveryValueFunc,s=this.ruleShortNameIdx<<12;let a;return this.ruleShortNameIdx++,this.shortRuleNameToFull[s]=e,this.fullRuleNameToShort[e]=s,a=!0===this.outputCst?function(){try{this.ruleInvocationStateUpdate(s,e,this.subruleIdx);for(var n=arguments.length,a=new Array(n),o=0;ot.call(this)&&e.call(this)}}else r=e;if(!0===i.call(this))return r.call(this)}atLeastOneInternal(e,t){const n=this.getKeyForAutomaticLookahead(or,e);return this.atLeastOneInternalLogic(e,t,n)}atLeastOneInternalLogic(e,t,n){let r,i=this.getLaFuncFromCache(n);if("function"!==typeof t){r=t.DEF;const e=t.GATE;if(void 0!==e){const t=i;i=()=>e.call(this)&&t.call(this)}}else r=t;if(!0!==i.call(this))throw this.raiseEarlyExitException(e,Rn.REPETITION_MANDATORY,t.ERR_MSG);{let e=this.doSingleRepetition(r);for(;!0===i.call(this)&&!0===e;)e=this.doSingleRepetition(r)}this.attemptInRepetitionRecovery(this.atLeastOneInternal,[e,t],i,or,e,gn)}atLeastOneSepFirstInternal(e,t){const n=this.getKeyForAutomaticLookahead(lr,e);this.atLeastOneSepFirstInternalLogic(e,t,n)}atLeastOneSepFirstInternalLogic(e,t,n){const r=t.DEF,i=t.SEP;if(!0!==this.getLaFuncFromCache(n).call(this))throw this.raiseEarlyExitException(e,Rn.REPETITION_MANDATORY_WITH_SEPARATOR,t.ERR_MSG);{r.call(this);const t=()=>this.tokenMatcher(this.LA(1),i);for(;!0===this.tokenMatcher(this.LA(1),i);)this.CONSUME(i),r.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,i,t,r,yn],t,lr,e,yn)}}manyInternal(e,t){const n=this.getKeyForAutomaticLookahead(768,e);return this.manyInternalLogic(e,t,n)}manyInternalLogic(e,t,n){let r,i=this.getLaFuncFromCache(n);if("function"!==typeof t){r=t.DEF;const e=t.GATE;if(void 0!==e){const t=i;i=()=>e.call(this)&&t.call(this)}}else r=t;let s=!0;for(;!0===i.call(this)&&!0===s;)s=this.doSingleRepetition(r);this.attemptInRepetitionRecovery(this.manyInternal,[e,t],i,768,e,pn,s)}manySepFirstInternal(e,t){const n=this.getKeyForAutomaticLookahead(cr,e);this.manySepFirstInternalLogic(e,t,n)}manySepFirstInternalLogic(e,t,n){const r=t.DEF,i=t.SEP;if(!0===this.getLaFuncFromCache(n).call(this)){r.call(this);const t=()=>this.tokenMatcher(this.LA(1),i);for(;!0===this.tokenMatcher(this.LA(1),i);)this.CONSUME(i),r.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,i,t,r,mn],t,cr,e,mn)}}repetitionSepSecondInternal(e,t,n,r,i){for(;n();)this.CONSUME(t),r.call(this);this.attemptInRepetitionRecovery(this.repetitionSepSecondInternal,[e,t,n,r,i],n,lr,e,i)}doSingleRepetition(e){const t=this.getLexerPosition();return e.call(this),this.getLexerPosition()>t}orInternal(e,t){const n=this.getKeyForAutomaticLookahead(256,t),r=(0,Q.A)(e)?e:e.DEF,i=this.getLaFuncFromCache(n).call(this,r);if(void 0!==i)return r[i].ALT.call(this);this.raiseNoAltException(t,e.ERR_MSG)}ruleFinallyStateUpdate(){if(this.RULE_STACK.pop(),this.RULE_OCCURRENCE_STACK.pop(),this.cstFinallyStateUpdate(),0===this.RULE_STACK.length&&!1===this.isAtEndOfInput()){const e=this.LA(1),t=this.errorMessageProvider.buildNotAllInputParsedMessage({firstRedundant:e,ruleName:this.getCurrRuleFullName()});this.SAVE_ERROR(new tr(t,e))}}subruleInternal(e,t,n){let r;try{const i=void 0!==n?n.ARGS:void 0;return this.subruleIdx=t,r=e.apply(this,i),this.cstPostNonTerminal(r,void 0!==n&&void 0!==n.LABEL?n.LABEL:e.ruleName),r}catch(i){throw this.subruleInternalError(i,n,e.ruleName)}}subruleInternalError(e,t,n){throw Qn(e)&&void 0!==e.partialCstResult&&(this.cstPostNonTerminal(e.partialCstResult,void 0!==t&&void 0!==t.LABEL?t.LABEL:n),delete e.partialCstResult),e}consumeInternal(e,t,n){let r;try{const t=this.LA(1);!0===this.tokenMatcher(t,e)?(this.consumeToken(),r=t):this.consumeInternalError(e,t,n)}catch(i){r=this.consumeInternalRecovery(e,t,i)}return this.cstPostTerminal(void 0!==n&&void 0!==n.LABEL?n.LABEL:e.name,r),r}consumeInternalError(e,t,n){let r;const i=this.LA(0);throw r=void 0!==n&&n.ERR_MSG?n.ERR_MSG:this.errorMessageProvider.buildMismatchTokenMessage({expected:e,actual:t,previous:i,ruleName:this.getCurrRuleFullName()}),this.SAVE_ERROR(new Jn(r,t,i))}consumeInternalRecovery(e,t,n){if(!this.recoveryEnabled||"MismatchedTokenException"!==n.name||this.isBackTracking())throw n;{const i=this.getFollowsForInRuleRecovery(e,t);try{return this.tryInRuleRecovery(e,i)}catch(r){throw r.name===ir?n:r}}}saveRecogState(){const e=this.errors,t=(0,c.A)(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 0!==this.isBackTrackingStack.length}getCurrRuleFullName(){const e=this.getLastExplicitRuleShortName();return this.shortRuleNameToFull[e]}shortRuleNameToFullName(e){return this.shortRuleNameToFull[e]}isAtEndOfInput(){return this.tokenMatcher(this.LA(1),Xt)}reset(){this.resetLexerState(),this.subruleIdx=0,this.isBackTrackingStack=[],this.errors=[],this.RULE_STACK=[],this.CST_STACK=[],this.RULE_OCCURRENCE_STACK=[]}},class{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){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:br;if(ne(this.definedRulesNames,e)){const t={message:en.buildDuplicateRuleNameError({topLevelRule:e,grammarName:this.className}),type:Or.DUPLICATE_RULE_NAME,ruleName:e};this.definitionErrors.push(t)}this.definedRulesNames.push(e);const r=this.defineRule(e,t,n);return this[e]=r,r}OVERRIDE_RULE(e,t){let n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:br;const r=function(e,t,n){const r=[];let i;return ne(t,e)||(i=`Invalid rule override, rule: ->${e}<- cannot be overridden in the grammar: ->${n}<-as it is not defined in any of the super grammars `,r.push({message:i,type:Or.INVALID_RULE_OVERRIDE,ruleName:e})),r}(e,this.definedRulesNames,this.className);this.definitionErrors=this.definitionErrors.concat(r);const i=this.defineRule(e,t,n);return this[e]=i,i}BACKTRACK(e,t){return function(){this.isBackTrackingStack.push(1);const n=this.saveRecogState();try{return e.apply(this,t),!0}catch(r){if(Qn(r))return!1;throw r}finally{this.reloadRecogState(n),this.isBackTrackingStack.pop()}}}getGAstProductions(){return this.gastProductionsCache}getSerializedGastProductions(){return e=(0,i.A)(this.gastProductionsCache),(0,a.A)(e,W);var e}},class{initErrorHandler(e){this._errors=[],this.errorMessageProvider=(0,o.A)(e,"errorMessageProvider")?e.errorMessageProvider:Lr.errorMessageProvider}SAVE_ERROR(e){if(Qn(e))return e.context={ruleStack:this.getHumanReadableRuleStack(),ruleOccurrenceStack:(0,c.A)(this.RULE_OCCURRENCE_STACK)},this._errors.push(e),e;throw Error("Trying to save an Error which is not a RecognitionException")}get errors(){return(0,c.A)(this._errors)}set errors(e){this._errors=e}raiseEarlyExitException(e,t,n){const r=this.getCurrRuleFullName(),i=On(e,this.getGAstProductions()[r],t,this.maxLookahead)[0],s=[];for(let o=1;o<=this.maxLookahead;o++)s.push(this.LA(o));const a=this.errorMessageProvider.buildEarlyExitMessage({expectedIterationPaths:i,actual:s,previous:this.LA(0),customUserDescription:n,ruleName:r});throw this.SAVE_ERROR(new nr(a,this.LA(1),this.LA(0)))}raiseNoAltException(e,t){const n=this.getCurrRuleFullName(),r=bn(e,this.getGAstProductions()[n],this.maxLookahead),i=[];for(let o=1;o<=this.maxLookahead;o++)i.push(this.LA(o));const s=this.LA(0),a=this.errorMessageProvider.buildNoViableAltMessage({expectedPathsPerAlt:r,actual:i,previous:s,customUserDescription:t,ruleName:this.getCurrRuleFullName()});throw this.SAVE_ERROR(new er(a,this.LA(1),s))}},class{initContentAssist(){}computeContentAssist(e,t){const n=this.gastProductionsCache[e];if((0,ge.A)(n))throw Error(`Rule ->${e}<- does not exist in this grammar.`);return An([n],t,this.tokenMatcher,this.maxLookahead)}getNextPossibleTokenTypes(e){const t=Ue(e.ruleStack),n=this.getGAstProductions()[t];return new hn(n,e).startWalking()}},class{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++){const t=e>0?e:"";this[`CONSUME${t}`]=function(t,n){return this.consumeInternalRecord(t,e,n)},this[`SUBRULE${t}`]=function(t,n){return this.subruleInternalRecord(t,e,n)},this[`OPTION${t}`]=function(t){return this.optionInternalRecord(t,e)},this[`OR${t}`]=function(t){return this.orInternalRecord(t,e)},this[`MANY${t}`]=function(t){this.manyInternalRecord(e,t)},this[`MANY_SEP${t}`]=function(t){this.manySepFirstInternalRecord(e,t)},this[`AT_LEAST_ONE${t}`]=function(t){this.atLeastOneInternalRecord(e,t)},this[`AT_LEAST_ONE_SEP${t}`]=function(t){this.atLeastOneSepFirstInternalRecord(e,t)}}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",(()=>{const e=this;for(let t=0;t<10;t++){const 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 Cr}topLevelRuleRecord(e,t){try{const n=new D({definition:[],name:e});return n.name=e,this.recordingProdStack.push(n),t.call(this),this.recordingProdStack.pop(),n}catch(n){if(!0!==n.KNOWN_RECORDER_ERROR)try{n.message=n.message+'\n\t This error was thrown during the "grammar recording phase" For more info see:\n\thttps://chevrotain.io/docs/guide/internals.html#grammar-recording'}catch(r){throw n}throw n}}optionInternalRecord(e,t){return Ir.call(this,F,e,t)}atLeastOneInternalRecord(e,t){Ir.call(this,G,t,e)}atLeastOneSepFirstInternalRecord(e,t){Ir.call(this,K,t,e,Rr)}manyInternalRecord(e,t){Ir.call(this,B,t,e)}manySepFirstInternalRecord(e,t){Ir.call(this,j,t,e,Rr)}orInternalRecord(e,t){return Sr.call(this,e,t)}subruleInternalRecord(e,t,n){if(wr(t),!e||!1===(0,o.A)(e,"ruleName")){const n=new Error(` argument is invalid expecting a Parser method reference but got: <${JSON.stringify(e)}>\n inside top level rule: <${this.recordingProdStack[0].name}>`);throw n.KNOWN_RECORDER_ERROR=!0,n}const r=(0,Et.A)(this.recordingProdStack),i=e.ruleName,s=new M({idx:t,nonTerminalName:i,label:null===n||void 0===n?void 0:n.LABEL,referencedRule:void 0});return r.definition.push(s),this.outputCst?xr:Tr}consumeInternalRecord(e,t,n){if(wr(t),!Ct(e)){const n=new Error(` argument is invalid expecting a TokenType reference but got: <${JSON.stringify(e)}>\n inside top level rule: <${this.recordingProdStack[0].name}>`);throw n.KNOWN_RECORDER_ERROR=!0,n}const r=(0,Et.A)(this.recordingProdStack),i=new H({idx:t,terminalType:e,label:null===n||void 0===n?void 0:n.LABEL});return r.definition.push(i),$r}},class{initPerformanceTracer(e){if((0,o.A)(e,"traceInitPerf")){const t=e.traceInitPerf,n="number"===typeof t;this.traceInitMaxIdent=n?t:1/0,this.traceInitPerf=n?t>0:t}else this.traceInitMaxIdent=0,this.traceInitPerf=Lr.traceInitPerf;this.traceInitIndent=-1}TRACE_INIT(e,t){if(!0===this.traceInitPerf){this.traceInitIndent++;const n=new Array(this.traceInitIndent+1).join("\t");this.traceInitIndent`);const{time:r,value:i}=kt(t),s=r>10?console.warn:console.log;return this.traceInitIndent time: ${r}ms`),this.traceInitIndent--,i}return t()}}].forEach((e=>{const t=e.prototype;Object.getOwnPropertyNames(t).forEach((n=>{if("constructor"===n)return;const r=Object.getOwnPropertyDescriptor(t,n);r&&(r.get||r.set)?Object.defineProperty(_r.prototype,n,r):_r.prototype[n]=e.prototype[n]}))}));class Dr extends Mr{constructor(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Lr;const n=(0,c.A)(t);n.outputCst=!1,super(e,n)}}},6843:(e,t,n)=>{var r;n.d(t,{A:()=>s,r:()=>i}),(()=>{var e={470:e=>{function t(e){if("string"!=typeof e)throw new TypeError("Path must be a string. Received "+JSON.stringify(e))}function n(e,t){for(var n,r="",i=0,s=-1,a=0,o=0;o<=e.length;++o){if(o2){var c=r.lastIndexOf("/");if(c!==r.length-1){-1===c?(r="",i=0):i=(r=r.slice(0,c)).length-1-r.lastIndexOf("/"),s=o,a=0;continue}}else if(2===r.length||1===r.length){r="",i=0,s=o,a=0;continue}t&&(r.length>0?r+="/..":r="..",i=2)}else r.length>0?r+="/"+e.slice(s+1,o):r=e.slice(s+1,o),i=o-s-1;s=o,a=0}else 46===n&&-1!==a?++a:a=-1}return r}var r={resolve:function(){for(var e,r="",i=!1,s=arguments.length-1;s>=-1&&!i;s--){var a;s>=0?a=arguments[s]:(void 0===e&&(e=process.cwd()),a=e),t(a),0!==a.length&&(r=a+"/"+r,i=47===a.charCodeAt(0))}return r=n(r,!i),i?r.length>0?"/"+r:"/":r.length>0?r:"."},normalize:function(e){if(t(e),0===e.length)return".";var r=47===e.charCodeAt(0),i=47===e.charCodeAt(e.length-1);return 0!==(e=n(e,!r)).length||r||(e="."),e.length>0&&i&&(e+="/"),r?"/"+e:e},isAbsolute:function(e){return t(e),e.length>0&&47===e.charCodeAt(0)},join:function(){if(0===arguments.length)return".";for(var e,n=0;n0&&(void 0===e?e=i:e+="/"+i)}return void 0===e?".":r.normalize(e)},relative:function(e,n){if(t(e),t(n),e===n)return"";if((e=r.resolve(e))===(n=r.resolve(n)))return"";for(var i=1;il){if(47===n.charCodeAt(o+d))return n.slice(o+d+1);if(0===d)return n.slice(o+d)}else a>l&&(47===e.charCodeAt(i+d)?u=d:0===d&&(u=0));break}var h=e.charCodeAt(i+d);if(h!==n.charCodeAt(o+d))break;47===h&&(u=d)}var f="";for(d=i+u+1;d<=s;++d)d!==s&&47!==e.charCodeAt(d)||(0===f.length?f+="..":f+="/..");return f.length>0?f+n.slice(o+u):(o+=u,47===n.charCodeAt(o)&&++o,n.slice(o))},_makeLong:function(e){return e},dirname:function(e){if(t(e),0===e.length)return".";for(var n=e.charCodeAt(0),r=47===n,i=-1,s=!0,a=e.length-1;a>=1;--a)if(47===(n=e.charCodeAt(a))){if(!s){i=a;break}}else s=!1;return-1===i?r?"/":".":r&&1===i?"//":e.slice(0,i)},basename:function(e,n){if(void 0!==n&&"string"!=typeof n)throw new TypeError('"ext" argument must be a string');t(e);var r,i=0,s=-1,a=!0;if(void 0!==n&&n.length>0&&n.length<=e.length){if(n.length===e.length&&n===e)return"";var o=n.length-1,c=-1;for(r=e.length-1;r>=0;--r){var l=e.charCodeAt(r);if(47===l){if(!a){i=r+1;break}}else-1===c&&(a=!1,c=r+1),o>=0&&(l===n.charCodeAt(o)?-1==--o&&(s=r):(o=-1,s=c))}return i===s?s=c:-1===s&&(s=e.length),e.slice(i,s)}for(r=e.length-1;r>=0;--r)if(47===e.charCodeAt(r)){if(!a){i=r+1;break}}else-1===s&&(a=!1,s=r+1);return-1===s?"":e.slice(i,s)},extname:function(e){t(e);for(var n=-1,r=0,i=-1,s=!0,a=0,o=e.length-1;o>=0;--o){var c=e.charCodeAt(o);if(47!==c)-1===i&&(s=!1,i=o+1),46===c?-1===n?n=o:1!==a&&(a=1):-1!==n&&(a=-1);else if(!s){r=o+1;break}}return-1===n||-1===i||0===a||1===a&&n===i-1&&n===r+1?"":e.slice(n,i)},format:function(e){if(null===e||"object"!=typeof e)throw new TypeError('The "pathObject" argument must be of type Object. Received type '+typeof e);return function(e,t){var n=t.dir||t.root,r=t.base||(t.name||"")+(t.ext||"");return n?n===t.root?n+r:n+"/"+r:r}(0,e)},parse:function(e){t(e);var n={root:"",dir:"",base:"",ext:"",name:""};if(0===e.length)return n;var r,i=e.charCodeAt(0),s=47===i;s?(n.root="/",r=1):r=0;for(var a=-1,o=0,c=-1,l=!0,u=e.length-1,d=0;u>=r;--u)if(47!==(i=e.charCodeAt(u)))-1===c&&(l=!1,c=u+1),46===i?-1===a?a=u:1!==d&&(d=1):-1!==a&&(d=-1);else if(!l){o=u+1;break}return-1===a||-1===c||0===d||1===d&&a===c-1&&a===o+1?-1!==c&&(n.base=n.name=0===o&&s?e.slice(1,c):e.slice(o,c)):(0===o&&s?(n.name=e.slice(1,a),n.base=e.slice(1,c)):(n.name=e.slice(o,a),n.base=e.slice(o,c)),n.ext=e.slice(a,c)),o>0?n.dir=e.slice(0,o-1):s&&(n.dir="/"),n},sep:"/",delimiter:":",win32:null,posix:null};r.posix=r,e.exports=r}},t={};function n(r){var i=t[r];if(void 0!==i)return i.exports;var s=t[r]={exports:{}};return e[r](s,s.exports,n),s.exports}n.d=(e,t)=>{for(var r in t)n.o(t,r)&&!n.o(e,r)&&Object.defineProperty(e,r,{enumerable:!0,get:t[r]})},n.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),n.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var i={};(()=>{let e;if(n.r(i),n.d(i,{URI:()=>u,Utils:()=>$}),"object"==typeof process)e="win32"===process.platform;else if("object"==typeof navigator){let t=navigator.userAgent;e=t.indexOf("Windows")>=0}const t=/^\w[\w\d+.-]*$/,r=/^\//,s=/^\/\//;function a(e,n){if(!e.scheme&&n)throw new Error(`[UriError]: Scheme is missing: {scheme: "", authority: "${e.authority}", path: "${e.path}", query: "${e.query}", fragment: "${e.fragment}"}`);if(e.scheme&&!t.test(e.scheme))throw new Error("[UriError]: Scheme contains illegal characters.");if(e.path)if(e.authority){if(!r.test(e.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(s.test(e.path))throw new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters ("//")')}const o="",c="/",l=/^(([^:/?#]+?):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/;class u{static isUri(e){return e instanceof u||!!e&&"string"==typeof e.authority&&"string"==typeof e.fragment&&"string"==typeof e.path&&"string"==typeof e.query&&"string"==typeof e.scheme&&"string"==typeof e.fsPath&&"function"==typeof e.with&&"function"==typeof e.toString}scheme;authority;path;query;fragment;constructor(e,t,n,r,i){let s=arguments.length>5&&void 0!==arguments[5]&&arguments[5];"object"==typeof e?(this.scheme=e.scheme||o,this.authority=e.authority||o,this.path=e.path||o,this.query=e.query||o,this.fragment=e.fragment||o):(this.scheme=function(e,t){return e||t?e:"file"}(e,s),this.authority=t||o,this.path=function(e,t){switch(e){case"https":case"http":case"file":t?t[0]!==c&&(t=c+t):t=c}return t}(this.scheme,n||o),this.query=r||o,this.fragment=i||o,a(this,s))}get fsPath(){return g(this,!1)}with(e){if(!e)return this;let{scheme:t,authority:n,path:r,query:i,fragment:s}=e;return void 0===t?t=this.scheme:null===t&&(t=o),void 0===n?n=this.authority:null===n&&(n=o),void 0===r?r=this.path:null===r&&(r=o),void 0===i?i=this.query:null===i&&(i=o),void 0===s?s=this.fragment:null===s&&(s=o),t===this.scheme&&n===this.authority&&r===this.path&&i===this.query&&s===this.fragment?this:new h(t,n,r,i,s)}static parse(e){let t=arguments.length>1&&void 0!==arguments[1]&&arguments[1];const n=l.exec(e);return n?new h(n[2]||o,T(n[4]||o),T(n[5]||o),T(n[7]||o),T(n[9]||o),t):new h(o,o,o,o,o)}static file(t){let n=o;if(e&&(t=t.replace(/\\/g,c)),t[0]===c&&t[1]===c){const e=t.indexOf(c,2);-1===e?(n=t.substring(2),t=c):(n=t.substring(2,e),t=t.substring(e)||c)}return new h("file",n,t,o,o)}static from(e){const t=new h(e.scheme,e.authority,e.path,e.query,e.fragment);return a(t,!0),t}toString(){return y(this,arguments.length>0&&void 0!==arguments[0]&&arguments[0])}toJSON(){return this}static revive(e){if(e){if(e instanceof u)return e;{const t=new h(e);return t._formatted=e.external,t._fsPath=e._sep===d?e.fsPath:null,t}}return e}}const d=e?1:void 0;class h extends u{_formatted=null;_fsPath=null;get fsPath(){return this._fsPath||(this._fsPath=g(this,!1)),this._fsPath}toString(){return arguments.length>0&&void 0!==arguments[0]&&arguments[0]?y(this,!0):(this._formatted||(this._formatted=y(this,!1)),this._formatted)}toJSON(){const e={$mid:1};return this._fsPath&&(e.fsPath=this._fsPath,e._sep=d),this._formatted&&(e.external=this._formatted),this.path&&(e.path=this.path),this.scheme&&(e.scheme=this.scheme),this.authority&&(e.authority=this.authority),this.query&&(e.query=this.query),this.fragment&&(e.fragment=this.fragment),e}}const f={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 p(e,t,n){let r,i=-1;for(let s=0;s=97&&a<=122||a>=65&&a<=90||a>=48&&a<=57||45===a||46===a||95===a||126===a||t&&47===a||n&&91===a||n&&93===a||n&&58===a)-1!==i&&(r+=encodeURIComponent(e.substring(i,s)),i=-1),void 0!==r&&(r+=e.charAt(s));else{void 0===r&&(r=e.substr(0,s));const t=f[a];void 0!==t?(-1!==i&&(r+=encodeURIComponent(e.substring(i,s)),i=-1),r+=t):-1===i&&(i=s)}}return-1!==i&&(r+=encodeURIComponent(e.substring(i))),void 0!==r?r:e}function m(e){let t;for(let n=0;n1&&"file"===t.scheme?`//${t.authority}${t.path}`:47===t.path.charCodeAt(0)&&(t.path.charCodeAt(1)>=65&&t.path.charCodeAt(1)<=90||t.path.charCodeAt(1)>=97&&t.path.charCodeAt(1)<=122)&&58===t.path.charCodeAt(2)?n?t.path.substr(1):t.path[1].toLowerCase()+t.path.substr(2):t.path,e&&(r=r.replace(/\//g,"\\")),r}function y(e,t){const n=t?m:p;let r="",{scheme:i,authority:s,path:a,query:o,fragment:l}=e;if(i&&(r+=i,r+=":"),(s||"file"===i)&&(r+=c,r+=c),s){let e=s.indexOf("@");if(-1!==e){const t=s.substr(0,e);s=s.substr(e+1),e=t.lastIndexOf(":"),-1===e?r+=n(t,!1,!1):(r+=n(t.substr(0,e),!1,!1),r+=":",r+=n(t.substr(e+1),!1,!0)),r+="@"}s=s.toLowerCase(),e=s.lastIndexOf(":"),-1===e?r+=n(s,!1,!0):(r+=n(s.substr(0,e),!1,!0),r+=s.substr(e))}if(a){if(a.length>=3&&47===a.charCodeAt(0)&&58===a.charCodeAt(2)){const e=a.charCodeAt(1);e>=65&&e<=90&&(a=`/${String.fromCharCode(e+32)}:${a.substr(3)}`)}else if(a.length>=2&&58===a.charCodeAt(1)){const e=a.charCodeAt(0);e>=65&&e<=90&&(a=`${String.fromCharCode(e+32)}:${a.substr(2)}`)}r+=n(a,!0,!1)}return o&&(r+="?",r+=n(o,!1,!1)),l&&(r+="#",r+=t?l:p(l,!1,!1)),r}function v(e){try{return decodeURIComponent(e)}catch{return e.length>3?e.substr(0,3)+v(e.substr(3)):e}}const A=/(%[0-9A-Za-z][0-9A-Za-z])+/g;function T(e){return e.match(A)?e.replace(A,(e=>v(e))):e}var R=n(470);const E=R.posix||R,k="/";var $;!function(e){e.joinPath=function(e){for(var t=arguments.length,n=new Array(t>1?t-1:0),r=1;r1?r-1:0),s=1;s{n.d(t,{DM:()=>p,OP:()=>m,SD:()=>a,Uo:()=>d,VN:()=>u,XG:()=>o,YE:()=>c,cQ:()=>l,jm:()=>h});var r=n(5460),i=n(4230),s=n(3121);function a(e){for(const[t,n]of Object.entries(e))t.startsWith("$")||(Array.isArray(n)?n.forEach(((n,i)=>{(0,r.ng)(n)&&(n.$container=e,n.$containerProperty=t,n.$containerIndex=i)})):(0,r.ng)(n)&&(n.$container=e,n.$containerProperty=t))}function o(e,t){let n=e;for(;n;){if(t(n))return n;n=n.$container}}function c(e){const t=l(e).$document;if(!t)throw new Error("AST node has no document.");return t}function l(e){for(;e.$container;)e=e.$container;return e}function u(e,t){if(!e)throw new Error("Node must be an AstNode.");const n=null===t||void 0===t?void 0:t.range;return new i.fq((()=>({keys:Object.keys(e),keyIndex:0,arrayIndex:0})),(t=>{for(;t.keyIndexu(e,t)))}function h(e,t){if(!e)throw new Error("Root node must be an AstNode.");return(null===t||void 0===t?void 0:t.range)&&!f(e,t.range)?new i.Vj(e,(()=>[])):new i.Vj(e,(e=>u(e,t)),{includeRoot:!0})}function f(e,t){var n;if(!t)return!0;const r=null===(n=e.$cstNode)||void 0===n?void 0:n.range;return!!r&&(0,s.r4)(r,t)}function p(e){return new i.fq((()=>({keys:Object.keys(e),keyIndex:0,arrayIndex:0})),(t=>{for(;t.keyIndex{n.d(t,{f:()=>u});var r=n(1584),i=n(4016),s=n(5813),a=n(1808),o=class extends r.mR{static#e=(()=>(0,r.K2)(this,"PieTokenBuilder"))();constructor(){super(["pie","showData"])}},c=class extends r.dg{static#e=(()=>(0,r.K2)(this,"PieValueConverter"))();runCustomConverter(e,t,n){if("PIE_SECTION_LABEL"===e.name)return t.replace(/"/g,"").trim()}},l={parser:{TokenBuilder:(0,r.K2)((()=>new o),"TokenBuilder"),ValueConverter:(0,r.K2)((()=>new c),"ValueConverter")}};function u(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:i.D;const t=(0,s.WQ)((0,a.u)(e),r.sr),n=(0,s.WQ)((0,a.t)({shared:t}),r.KX,l);return t.ServiceRegistry.register(n),{shared:t,Pie:n}}(0,r.K2)(u,"createPieServices")},8062:(e,t,n)=>{n.d(t,{$:()=>l});var r=n(1584),i=n(4016),s=n(5813),a=n(1808),o=class extends r.mR{static#e=(()=>(0,r.K2)(this,"PacketTokenBuilder"))();constructor(){super(["packet-beta"])}},c={parser:{TokenBuilder:(0,r.K2)((()=>new o),"TokenBuilder"),ValueConverter:(0,r.K2)((()=>new r.Tm),"ValueConverter")}};function l(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:i.D;const t=(0,s.WQ)((0,a.u)(e),r.sr),n=(0,s.WQ)((0,a.t)({shared:t}),r.AM,c);return t.ServiceRegistry.register(n),{shared:t,Packet:n}}(0,r.K2)(l,"createPacketServices")},8293:(e,t,n)=>{n.d(t,{A:()=>o});var r=n(779),i=n(378),s=n(4645),a=n(5386);const o=function(e,t){return((0,a.A)(e)?r.A:s.A)(e,(0,i.A)(t,3))}},8377:(e,t,n)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.Emitter=t.Event=void 0;const r=n(1769);var i;!function(e){const t={dispose(){}};e.None=function(){return t}}(i||(t.Event=i={}));class s{add(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null,n=arguments.length>2?arguments[2]:void 0;this._callbacks||(this._callbacks=[],this._contexts=[]),this._callbacks.push(e),this._contexts.push(t),Array.isArray(n)&&n.push({dispose:()=>this.remove(e,t)})}remove(e){let t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:null;if(!this._callbacks)return;let n=!1;for(let r=0,i=this._callbacks.length;r{this._callbacks||(this._callbacks=new s),this._options&&this._options.onFirstListenerAdd&&this._callbacks.isEmpty()&&this._options.onFirstListenerAdd(this),this._callbacks.add(e,t);const r={dispose:()=>{this._callbacks&&(this._callbacks.remove(e,t),r.dispose=a._noop,this._options&&this._options.onLastListenerRemove&&this._callbacks.isEmpty()&&this._options.onLastListenerRemove(this))}};return Array.isArray(n)&&n.push(r),r}),this._event}fire(e){this._callbacks&&this._callbacks.invoke.call(this._callbacks,e)}dispose(){this._callbacks&&(this._callbacks.dispose(),this._callbacks=void 0)}}t.Emitter=a,a._noop=function(){}},8596:(e,t)=>{function n(e){return"string"===typeof e||e instanceof String}function r(e){return Array.isArray(e)}Object.defineProperty(t,"__esModule",{value:!0}),t.stringArray=t.array=t.func=t.error=t.number=t.string=t.boolean=void 0,t.boolean=function(e){return!0===e||!1===e},t.string=n,t.number=function(e){return"number"===typeof e||e instanceof Number},t.error=function(e){return e instanceof Error},t.func=function(e){return"function"===typeof e},t.array=r,t.stringArray=function(e){return r(e)&&e.every((e=>n(e)))}},9031:(e,t,n)=>{n.d(t,{A:()=>a});var r=n(2544),i=n(5731),s=n(2041);const a=function(e){return e&&e.length?(0,r.A)(e,s.A,i.A):void 0}},9456:(e,t,n)=>{n.d(t,{v:()=>l});var r=n(1584),i=n(4016),s=n(5813),a=n(1808),o=class extends r.mR{static#e=(()=>(0,r.K2)(this,"InfoTokenBuilder"))();constructor(){super(["info","showInfo"])}},c={parser:{TokenBuilder:(0,r.K2)((()=>new o),"TokenBuilder"),ValueConverter:(0,r.K2)((()=>new r.Tm),"ValueConverter")}};function l(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:i.D;const t=(0,s.WQ)((0,a.u)(e),r.sr),n=(0,s.WQ)((0,a.t)({shared:t}),r.e5,c);return t.ServiceRegistry.register(n),{shared:t,Info:n}}(0,r.K2)(l,"createInfoServices")},9471:(e,t,n)=>{n.d(t,{Q:()=>l});var r=n(6770),i=n(1128),s=n(7156),a=n(1261),o=n(2919),c=n(4230);class l{constructor(){this.diagnostics=[]}buildTokens(e,t){const n=(0,c.Td)((0,a.YV)(e,!1)),r=this.buildTerminalTokens(n),i=this.buildKeywordTokens(n,r,t);return r.forEach((e=>{const t=e.PATTERN;"object"===typeof t&&t&&"test"in t&&(0,o.Yv)(t)?i.unshift(e):i.push(e)})),i}flushLexingReport(e){return{diagnostics:this.popDiagnostics()}}popDiagnostics(){const e=[...this.diagnostics];return this.diagnostics=[],e}buildTerminalTokens(e){return e.filter(i.rE).filter((e=>!e.fragment)).map((e=>this.buildTerminalToken(e))).toArray()}buildTerminalToken(e){const t=(0,a.S)(e),n=this.requiresCustomPattern(t)?this.regexPatternFunction(t):t,i={name:e.name,PATTERN:n};return"function"===typeof n&&(i.LINE_BREAKS=!0),e.hidden&&(i.GROUP=(0,o.Yv)(t)?r.JG.SKIPPED:"hidden"),i}requiresCustomPattern(e){return!(!e.flags.includes("u")&&!e.flags.includes("s"))||!(!e.source.includes("?<=")&&!e.source.includes("?{t.lastIndex=n;return t.exec(e)}}buildKeywordTokens(e,t,n){return e.filter(i.s7).flatMap((e=>(0,s.Uo)(e).filter(i.wb))).distinct((e=>e.value)).toArray().sort(((e,t)=>t.value.length-e.value.length)).map((e=>this.buildKeywordToken(e,t,Boolean(null===n||void 0===n?void 0:n.caseInsensitive))))}buildKeywordToken(e,t,n){const r=this.buildKeywordPattern(e,n),i={name:e.value,PATTERN:r,LONGER_ALT:this.findLongerAlt(e,t)};return"function"===typeof r&&(i.LINE_BREAKS=!0),i}buildKeywordPattern(e,t){return t?new RegExp((0,o.Ao)(e.value)):e.value}findLongerAlt(e,t){return t.reduce(((t,n)=>{const r=null===n||void 0===n?void 0:n.PATTERN;return(null===r||void 0===r?void 0:r.source)&&(0,o.PC)("^"+r.source+"$",e.value)&&t.push(n),t}),[])}}}}]); -//# sourceMappingURL=502.89ac9055.chunk.js.map \ No newline at end of file diff --git a/frontend/deployed/static/js/502.89ac9055.chunk.js.map b/frontend/deployed/static/js/502.89ac9055.chunk.js.map deleted file mode 100644 index 02e7be6..0000000 --- a/frontend/deployed/static/js/502.89ac9055.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"static/js/502.89ac9055.chunk.js","mappings":"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","sources":["../node_modules/@chevrotain/regexp-to-ast/src/utils.ts","../node_modules/@chevrotain/regexp-to-ast/src/character-classes.ts","../node_modules/@chevrotain/regexp-to-ast/src/regexp-parser.ts","../node_modules/@chevrotain/regexp-to-ast/src/base-regexp-visitor.ts","../node_modules/lodash-es/_baseHas.js","../node_modules/lodash-es/has.js","../node_modules/lodash-es/_createFind.js","../node_modules/lodash-es/findIndex.js","../node_modules/lodash-es/find.js","../node_modules/lodash-es/_baseSet.js","../node_modules/lodash-es/_basePickBy.js","../node_modules/langium/src/languages/generated/ast.ts","../node_modules/langium/src/utils/grammar-utils.ts","../node_modules/@mermaid-js/parser/dist/chunks/mermaid-parser.core/chunk-C4OEIS7N.mjs","../node_modules/langium/src/utils/grammar-loader.ts","../node_modules/@mermaid-js/parser/dist/chunks/mermaid-parser.core/chunk-7PKI6E2E.mjs","../node_modules/vscode-jsonrpc/lib/common/ral.js","../node_modules/chevrotain-allstar/src/atn.ts","../node_modules/chevrotain-allstar/src/dfa.ts","../node_modules/lodash-es/uniqBy.js","../node_modules/chevrotain-allstar/src/all-star-lookahead.ts","../node_modules/vscode-languageserver-types/lib/esm/main.js","../node_modules/langium/src/parser/cst-node-builder.ts","../node_modules/langium/src/parser/langium-parser.ts","../node_modules/langium/src/parser/parser-builder-base.ts","../node_modules/langium/src/parser/langium-parser-builder.ts","../node_modules/langium/src/utils/promise-utils.ts","../node_modules/vscode-languageserver-textdocument/lib/esm/main.js","../node_modules/langium/src/workspace/documents.ts","../node_modules/langium/src/references/linker.ts","../node_modules/langium/src/references/name-provider.ts","../node_modules/langium/src/utils/uri-utils.ts","../node_modules/langium/src/references/references.ts","../node_modules/langium/src/utils/collections.ts","../node_modules/langium/src/references/scope-computation.ts","../node_modules/langium/src/references/scope.ts","../node_modules/langium/src/utils/caching.ts","../node_modules/langium/src/references/scope-provider.ts","../node_modules/langium/src/serializer/json-serializer.ts","../node_modules/langium/src/service-registry.ts","../node_modules/langium/src/validation/validation-registry.ts","../node_modules/langium/src/validation/document-validator.ts","../node_modules/langium/src/workspace/ast-descriptions.ts","../node_modules/langium/src/workspace/ast-node-locator.ts","../node_modules/langium/src/utils/disposable.ts","../node_modules/langium/src/workspace/configuration.ts","../node_modules/langium/src/workspace/document-builder.ts","../node_modules/langium/src/workspace/index-manager.ts","../node_modules/langium/src/workspace/workspace-manager.ts","../node_modules/langium/src/parser/lexer.ts","../node_modules/langium/src/documentation/jsdoc.ts","../node_modules/langium/src/documentation/documentation-provider.ts","../node_modules/langium/src/documentation/comment-provider.ts","../node_modules/langium/src/parser/async-parser.ts","../node_modules/langium/src/workspace/workspace-lock.ts","../node_modules/langium/src/serializer/hydrator.ts","../node_modules/langium/src/default-module.ts","../node_modules/langium/src/languages/grammar-config.ts","../node_modules/langium/src/parser/completion-parser-builder.ts","../node_modules/lodash-es/flatMap.js","../node_modules/@mermaid-js/parser/dist/chunks/mermaid-parser.core/chunk-2O5ZK7RR.mjs","../node_modules/lodash-es/_baseExtremum.js","../node_modules/langium/src/utils/regexp-utils.ts","../node_modules/langium/src/utils/cst-utils.ts","../node_modules/lodash-es/clone.js","../node_modules/lodash-es/_trimmedEndIndex.js","../node_modules/lodash-es/_baseTrim.js","../node_modules/lodash-es/toNumber.js","../node_modules/lodash-es/toFinite.js","../node_modules/@mermaid-js/parser/dist/chunks/mermaid-parser.core/chunk-2NYFTIL2.mjs","../node_modules/lodash-es/isString.js","../node_modules/vscode-jsonrpc/lib/common/cancellation.js","../node_modules/langium/src/workspace/file-system-provider.ts","../node_modules/lodash-es/last.js","../node_modules/langium/src/utils/stream.ts","../node_modules/langium/src/parser/value-converter.ts","../node_modules/lodash-es/_baseMap.js","../node_modules/lodash-es/defaults.js","../node_modules/langium/src/syntax-tree.ts","../node_modules/@mermaid-js/parser/dist/mermaid-parser.core.mjs","../node_modules/lodash-es/_baseLt.js","../node_modules/langium/src/dependency-injection.ts","../node_modules/lodash-es/flatten.js","../node_modules/lodash-es/toInteger.js","../node_modules/langium/src/utils/errors.ts","../node_modules/@chevrotain/utils/src/to-fast-properties.ts","../node_modules/lodash-es/_baseSlice.js","../node_modules/lodash-es/drop.js","../node_modules/lodash-es/assign.js","../node_modules/lodash-es/pickBy.js","../node_modules/lodash-es/_baseIsRegExp.js","../node_modules/lodash-es/isRegExp.js","../node_modules/@chevrotain/gast/src/model.ts","../node_modules/@chevrotain/gast/src/visitor.ts","../node_modules/lodash-es/_baseSome.js","../node_modules/lodash-es/some.js","../node_modules/lodash-es/includes.js","../node_modules/lodash-es/_arrayEvery.js","../node_modules/lodash-es/_baseEvery.js","../node_modules/lodash-es/every.js","../node_modules/@chevrotain/gast/src/helpers.ts","../node_modules/chevrotain/src/parse/grammar/rest.ts","../node_modules/lodash-es/uniq.js","../node_modules/chevrotain/src/parse/grammar/first.ts","../node_modules/chevrotain/src/parse/constants.ts","../node_modules/chevrotain/src/parse/grammar/follow.ts","../node_modules/lodash-es/negate.js","../node_modules/lodash-es/reject.js","../node_modules/lodash-es/indexOf.js","../node_modules/lodash-es/_baseDifference.js","../node_modules/lodash-es/difference.js","../node_modules/lodash-es/compact.js","../node_modules/lodash-es/head.js","../node_modules/@chevrotain/utils/src/print.ts","../node_modules/chevrotain/src/scan/reg_exp_parser.ts","../node_modules/chevrotain/src/scan/reg_exp.ts","../node_modules/chevrotain/src/scan/lexer.ts","../node_modules/@chevrotain/utils/src/timer.ts","../node_modules/chevrotain/src/scan/tokens.ts","../node_modules/chevrotain/src/scan/lexer_errors_public.ts","../node_modules/chevrotain/src/scan/lexer_public.ts","../node_modules/chevrotain/src/scan/tokens_public.ts","../node_modules/chevrotain/src/parse/errors_public.ts","../node_modules/chevrotain/src/parse/grammar/resolver.ts","../node_modules/lodash-es/_arrayAggregator.js","../node_modules/lodash-es/_baseAggregator.js","../node_modules/lodash-es/_createAggregator.js","../node_modules/lodash-es/groupBy.js","../node_modules/lodash-es/dropRight.js","../node_modules/chevrotain/src/parse/grammar/interpreter.ts","../node_modules/chevrotain/src/parse/grammar/lookahead.ts","../node_modules/chevrotain/src/parse/grammar/checks.ts","../node_modules/chevrotain/src/parse/grammar/gast/gast_resolver_public.ts","../node_modules/chevrotain/src/parse/exceptions_public.ts","../node_modules/chevrotain/src/parse/parser/traits/recoverable.ts","../node_modules/chevrotain/src/parse/grammar/keys.ts","../node_modules/chevrotain/src/parse/grammar/llk_lookahead.ts","../node_modules/chevrotain/src/parse/parser/traits/looksahead.ts","../node_modules/chevrotain/src/parse/cst/cst.ts","../node_modules/chevrotain/src/lang/lang_extensions.ts","../node_modules/chevrotain/src/parse/cst/cst_visitor.ts","../node_modules/chevrotain/src/parse/parser/traits/gast_recorder.ts","../node_modules/chevrotain/src/parse/parser/parser.ts","../node_modules/chevrotain/src/parse/parser/utils/apply_mixins.ts","../node_modules/chevrotain/src/parse/parser/traits/tree_builder.ts","../node_modules/chevrotain/src/parse/parser/traits/lexer_adapter.ts","../node_modules/chevrotain/src/parse/parser/traits/recognizer_engine.ts","../node_modules/chevrotain/src/parse/parser/traits/recognizer_api.ts","../node_modules/chevrotain/src/parse/parser/traits/error_handler.ts","../node_modules/chevrotain/src/parse/parser/traits/context_assist.ts","../node_modules/chevrotain/src/parse/parser/traits/perf_tracer.ts","../LIB/node_modules/path-browserify/index.js","../LIB/webpack/bootstrap","../LIB/webpack/runtime/define property getters","../LIB/webpack/runtime/hasOwnProperty shorthand","../LIB/webpack/runtime/make namespace object","../LIB/src/platform.ts","../LIB/src/uri.ts","../LIB/src/utils.ts","../node_modules/langium/src/utils/ast-utils.ts","../node_modules/@mermaid-js/parser/dist/chunks/mermaid-parser.core/chunk-ROXG7S4E.mjs","../node_modules/@mermaid-js/parser/dist/chunks/mermaid-parser.core/chunk-V4Q32G6S.mjs","../node_modules/lodash-es/map.js","../node_modules/vscode-jsonrpc/lib/common/events.js","../node_modules/vscode-jsonrpc/lib/common/is.js","../node_modules/lodash-es/min.js","../node_modules/@mermaid-js/parser/dist/chunks/mermaid-parser.core/chunk-EXZZNE6F.mjs","../node_modules/langium/src/parser/token-builder.ts"],"sourcesContent":["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 ∉ 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","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.has` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHas(object, key) {\n return object != null && hasOwnProperty.call(object, key);\n}\n\nexport default baseHas;\n","import baseHas from './_baseHas.js';\nimport hasPath from './_hasPath.js';\n\n/**\n * Checks if `path` is a direct property of `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = { 'a': { 'b': 2 } };\n * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.has(object, 'a');\n * // => true\n *\n * _.has(object, 'a.b');\n * // => true\n *\n * _.has(object, ['a', 'b']);\n * // => true\n *\n * _.has(other, 'a');\n * // => false\n */\nfunction has(object, path) {\n return object != null && hasPath(object, path, baseHas);\n}\n\nexport default has;\n","import baseIteratee from './_baseIteratee.js';\nimport isArrayLike from './isArrayLike.js';\nimport keys from './keys.js';\n\n/**\n * Creates a `_.find` or `_.findLast` function.\n *\n * @private\n * @param {Function} findIndexFunc The function to find the collection index.\n * @returns {Function} Returns the new find function.\n */\nfunction createFind(findIndexFunc) {\n return function(collection, predicate, fromIndex) {\n var iterable = Object(collection);\n if (!isArrayLike(collection)) {\n var iteratee = baseIteratee(predicate, 3);\n collection = keys(collection);\n predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n }\n var index = findIndexFunc(collection, predicate, fromIndex);\n return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n };\n}\n\nexport default createFind;\n","import baseFindIndex from './_baseFindIndex.js';\nimport baseIteratee from './_baseIteratee.js';\nimport toInteger from './toInteger.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * This method is like `_.find` except that it returns the index of the first\n * element `predicate` returns truthy for instead of the element itself.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {number} Returns the index of the found element, else `-1`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.findIndex(users, function(o) { return o.user == 'barney'; });\n * // => 0\n *\n * // The `_.matches` iteratee shorthand.\n * _.findIndex(users, { 'user': 'fred', 'active': false });\n * // => 1\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findIndex(users, ['active', false]);\n * // => 0\n *\n * // The `_.property` iteratee shorthand.\n * _.findIndex(users, 'active');\n * // => 2\n */\nfunction findIndex(array, predicate, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\n if (index < 0) {\n index = nativeMax(length + index, 0);\n }\n return baseFindIndex(array, baseIteratee(predicate, 3), index);\n}\n\nexport default findIndex;\n","import createFind from './_createFind.js';\nimport findIndex from './findIndex.js';\n\n/**\n * Iterates over elements of `collection`, returning the first element\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false },\n * { 'user': 'pebbles', 'age': 1, 'active': true }\n * ];\n *\n * _.find(users, function(o) { return o.age < 40; });\n * // => object for 'barney'\n *\n * // The `_.matches` iteratee shorthand.\n * _.find(users, { 'age': 1, 'active': true });\n * // => object for 'pebbles'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.find(users, ['active', false]);\n * // => object for 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.find(users, 'active');\n * // => object for 'barney'\n */\nvar find = createFind(findIndex);\n\nexport default find;\n","import assignValue from './_assignValue.js';\nimport castPath from './_castPath.js';\nimport isIndex from './_isIndex.js';\nimport isObject from './isObject.js';\nimport toKey from './_toKey.js';\n\n/**\n * The base implementation of `_.set`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */\nfunction baseSet(object, path, value, customizer) {\n if (!isObject(object)) {\n return object;\n }\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n lastIndex = length - 1,\n nested = object;\n\n while (nested != null && ++index < length) {\n var key = toKey(path[index]),\n newValue = value;\n\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n return object;\n }\n\n if (index != lastIndex) {\n var objValue = nested[key];\n newValue = customizer ? customizer(objValue, key, nested) : undefined;\n if (newValue === undefined) {\n newValue = isObject(objValue)\n ? objValue\n : (isIndex(path[index + 1]) ? [] : {});\n }\n }\n assignValue(nested, key, newValue);\n nested = nested[key];\n }\n return object;\n}\n\nexport default baseSet;\n","import baseGet from './_baseGet.js';\nimport baseSet from './_baseSet.js';\nimport castPath from './_castPath.js';\n\n/**\n * The base implementation of `_.pickBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @param {Function} predicate The function invoked per property.\n * @returns {Object} Returns the new object.\n */\nfunction basePickBy(object, paths, predicate) {\n var index = -1,\n length = paths.length,\n result = {};\n\n while (++index < length) {\n var path = paths[index],\n value = baseGet(object, path);\n\n if (predicate(value, path)) {\n baseSet(result, castPath(path, object), value);\n }\n }\n return result;\n}\n\nexport default basePickBy;\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-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","import {\n AbstractMermaidTokenBuilder,\n AbstractMermaidValueConverter,\n ArchitectureGeneratedModule,\n MermaidGeneratedSharedModule,\n __name\n} from \"./chunk-7PKI6E2E.mjs\";\n\n// src/language/architecture/module.ts\nimport {\n EmptyFileSystem,\n createDefaultCoreModule,\n createDefaultSharedCoreModule,\n inject\n} from \"langium\";\n\n// src/language/architecture/tokenBuilder.ts\nvar ArchitectureTokenBuilder = class extends AbstractMermaidTokenBuilder {\n static {\n __name(this, \"ArchitectureTokenBuilder\");\n }\n constructor() {\n super([\"architecture\"]);\n }\n};\n\n// src/language/architecture/valueConverter.ts\nvar ArchitectureValueConverter = class extends AbstractMermaidValueConverter {\n static {\n __name(this, \"ArchitectureValueConverter\");\n }\n runCustomConverter(rule, input, _cstNode) {\n if (rule.name === \"ARCH_ICON\") {\n return input.replace(/[()]/g, \"\").trim();\n } else if (rule.name === \"ARCH_TEXT_ICON\") {\n return input.replace(/[\"()]/g, \"\");\n } else if (rule.name === \"ARCH_TITLE\") {\n return input.replace(/[[\\]]/g, \"\").trim();\n }\n return void 0;\n }\n};\n\n// src/language/architecture/module.ts\nvar ArchitectureModule = {\n parser: {\n TokenBuilder: /* @__PURE__ */ __name(() => new ArchitectureTokenBuilder(), \"TokenBuilder\"),\n ValueConverter: /* @__PURE__ */ __name(() => new ArchitectureValueConverter(), \"ValueConverter\")\n }\n};\nfunction createArchitectureServices(context = EmptyFileSystem) {\n const shared = inject(\n createDefaultSharedCoreModule(context),\n MermaidGeneratedSharedModule\n );\n const Architecture = inject(\n createDefaultCoreModule({ shared }),\n ArchitectureGeneratedModule,\n ArchitectureModule\n );\n shared.ServiceRegistry.register(Architecture);\n return { shared, Architecture };\n}\n__name(createArchitectureServices, \"createArchitectureServices\");\n\nexport {\n ArchitectureModule,\n createArchitectureServices\n};\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 Commit = \"Commit\";\nfunction isCommit(item) {\n return reflection.isInstance(item, Commit);\n}\n__name(isCommit, \"isCommit\");\nvar Common = \"Common\";\nfunction isCommon(item) {\n return reflection.isInstance(item, Common);\n}\n__name(isCommon, \"isCommon\");\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 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 Direction = \"Direction\";\nvar MermaidAstReflection = class extends AbstractAstReflection {\n static {\n __name(this, \"MermaidAstReflection\");\n }\n getAllTypes() {\n return [Architecture, Axis, Branch, Checkout, CherryPicking, Commit, Common, Curve, Direction, Edge, Entry, GitGraph, Group, Info, Junction, Merge, Option, Packet, PacketBlock, Pie, PieSection, Radar, Service, Statement];\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 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 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 Common: {\n return {\n name: Common,\n properties: [\n { name: \"accDescr\" },\n { name: \"accTitle\" },\n { name: \"title\" }\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 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: \"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 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 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@3\"},\"arguments\":[],\"cardinality\":\"*\"},{\"$type\":\"Keyword\",\"value\":\"info\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@3\"},\"arguments\":[],\"cardinality\":\"*\"},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"showInfo\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@3\"},\"arguments\":[],\"cardinality\":\"*\"}],\"cardinality\":\"?\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@1\"},\"arguments\":[],\"cardinality\":\"?\"}]},\"definesHiddenTokens\":false,\"fragment\":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@2\"},\"arguments\":[]}],\"cardinality\":\"+\"},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"EOL\",\"dataType\":\"string\",\"definition\":{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@3\"},\"arguments\":[],\"cardinality\":\"+\"},{\"$type\":\"EndOfFile\"}]},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"TerminalRule\",\"name\":\"NEWLINE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\\\\r?\\\\\\\\n/\"},\"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\",\"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\":[{\"$type\":\"Interface\",\"name\":\"Common\",\"attributes\":[{\"$type\":\"TypeAttribute\",\"name\":\"accDescr\",\"isOptional\":true,\"type\":{\"$type\":\"SimpleType\",\"primitiveType\":\"string\"}},{\"$type\":\"TypeAttribute\",\"name\":\"accTitle\",\"isOptional\":true,\"type\":{\"$type\":\"SimpleType\",\"primitiveType\":\"string\"}},{\"$type\":\"TypeAttribute\",\"name\":\"title\",\"isOptional\":true,\"type\":{\"$type\":\"SimpleType\",\"primitiveType\":\"string\"}}],\"superTypes\":[]}],\"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@6\"},\"arguments\":[],\"cardinality\":\"*\"},{\"$type\":\"Keyword\",\"value\":\"packet-beta\"},{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Group\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@6\"},\"arguments\":[],\"cardinality\":\"*\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@4\"},\"arguments\":[]},{\"$type\":\"Assignment\",\"feature\":\"blocks\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@1\"},\"arguments\":[]},\"cardinality\":\"*\"}]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@6\"},\"arguments\":[],\"cardinality\":\"+\"},{\"$type\":\"Assignment\",\"feature\":\"blocks\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@1\"},\"arguments\":[]},\"cardinality\":\"+\"}]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@6\"},\"arguments\":[],\"cardinality\":\"*\"}]}]},\"definesHiddenTokens\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"PacketBlock\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"start\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@2\"},\"arguments\":[]}},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"-\"},{\"$type\":\"Assignment\",\"feature\":\"end\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@2\"},\"arguments\":[]}}],\"cardinality\":\"?\"},{\"$type\":\"Keyword\",\"value\":\":\"},{\"$type\":\"Assignment\",\"feature\":\"label\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@3\"},\"arguments\":[]}},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@5\"},\"arguments\":[]}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":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\":\"STRING\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\"[^\\\\\"]*\\\\\"|'[^']*'/\"},\"fragment\":false,\"hidden\":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@7\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"accTitle\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@8\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"title\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@9\"},\"arguments\":[]}}]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@5\"},\"arguments\":[]}],\"cardinality\":\"+\"},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"EOL\",\"dataType\":\"string\",\"definition\":{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@6\"},\"arguments\":[],\"cardinality\":\"+\"},{\"$type\":\"EndOfFile\"}]},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"TerminalRule\",\"name\":\"NEWLINE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\\\\r?\\\\\\\\n/\"},\"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\",\"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\":[{\"$type\":\"Interface\",\"name\":\"Common\",\"attributes\":[{\"$type\":\"TypeAttribute\",\"name\":\"accDescr\",\"isOptional\":true,\"type\":{\"$type\":\"SimpleType\",\"primitiveType\":\"string\"}},{\"$type\":\"TypeAttribute\",\"name\":\"accTitle\",\"isOptional\":true,\"type\":{\"$type\":\"SimpleType\",\"primitiveType\":\"string\"}},{\"$type\":\"TypeAttribute\",\"name\":\"title\",\"isOptional\":true,\"type\":{\"$type\":\"SimpleType\",\"primitiveType\":\"string\"}}],\"superTypes\":[]}],\"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@6\"},\"arguments\":[],\"cardinality\":\"*\"},{\"$type\":\"Keyword\",\"value\":\"pie\"},{\"$type\":\"Assignment\",\"feature\":\"showData\",\"operator\":\"?=\",\"terminal\":{\"$type\":\"Keyword\",\"value\":\"showData\"},\"cardinality\":\"?\"},{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Group\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@6\"},\"arguments\":[],\"cardinality\":\"*\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@4\"},\"arguments\":[]},{\"$type\":\"Assignment\",\"feature\":\"sections\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@1\"},\"arguments\":[]},\"cardinality\":\"*\"}]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@6\"},\"arguments\":[],\"cardinality\":\"+\"},{\"$type\":\"Assignment\",\"feature\":\"sections\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@1\"},\"arguments\":[]},\"cardinality\":\"+\"}]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@6\"},\"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@2\"},\"arguments\":[]}},{\"$type\":\"Keyword\",\"value\":\":\"},{\"$type\":\"Assignment\",\"feature\":\"value\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@3\"},\"arguments\":[]}},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@5\"},\"arguments\":[]}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"TerminalRule\",\"name\":\"PIE_SECTION_LABEL\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\"[^\\\\\"]+\\\\\"/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"PIE_SECTION_VALUE\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"number\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/(0|[1-9][0-9]*)(\\\\\\\\.[0-9]+)?/\"},\"fragment\":false,\"hidden\":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@7\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"accTitle\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@8\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"title\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@9\"},\"arguments\":[]}}]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@5\"},\"arguments\":[]}],\"cardinality\":\"+\"},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"EOL\",\"dataType\":\"string\",\"definition\":{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@6\"},\"arguments\":[],\"cardinality\":\"+\"},{\"$type\":\"EndOfFile\"}]},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"TerminalRule\",\"name\":\"NEWLINE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\\\\r?\\\\\\\\n/\"},\"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\",\"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\":[{\"$type\":\"Interface\",\"name\":\"Common\",\"attributes\":[{\"$type\":\"TypeAttribute\",\"name\":\"accDescr\",\"isOptional\":true,\"type\":{\"$type\":\"SimpleType\",\"primitiveType\":\"string\"}},{\"$type\":\"TypeAttribute\",\"name\":\"accTitle\",\"isOptional\":true,\"type\":{\"$type\":\"SimpleType\",\"primitiveType\":\"string\"}},{\"$type\":\"TypeAttribute\",\"name\":\"title\",\"isOptional\":true,\"type\":{\"$type\":\"SimpleType\",\"primitiveType\":\"string\"}}],\"superTypes\":[]}],\"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@18\"},\"arguments\":[],\"cardinality\":\"*\"},{\"$type\":\"Keyword\",\"value\":\"architecture-beta\"},{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Group\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@18\"},\"arguments\":[],\"cardinality\":\"*\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@16\"},\"arguments\":[]}]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@18\"},\"arguments\":[],\"cardinality\":\"*\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@1\"},\"arguments\":[],\"cardinality\":\"*\"}]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@18\"},\"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@15\"},\"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@13\"},\"arguments\":[]}},{\"$type\":\"Keyword\",\"value\":\"-\"}]}]},{\"$type\":\"Assignment\",\"feature\":\"rhsInto\",\"operator\":\"?=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@15\"},\"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@10\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"icon\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@12\"},\"arguments\":[]},\"cardinality\":\"?\"},{\"$type\":\"Assignment\",\"feature\":\"title\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@13\"},\"arguments\":[]},\"cardinality\":\"?\"},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"in\"},{\"$type\":\"Assignment\",\"feature\":\"in\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@10\"},\"arguments\":[]}}],\"cardinality\":\"?\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"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@10\"},\"arguments\":[]}},{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"iconText\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@11\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"icon\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@12\"},\"arguments\":[]}}],\"cardinality\":\"?\"},{\"$type\":\"Assignment\",\"feature\":\"title\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@13\"},\"arguments\":[]},\"cardinality\":\"?\"},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"in\"},{\"$type\":\"Assignment\",\"feature\":\"in\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@10\"},\"arguments\":[]}}],\"cardinality\":\"?\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"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@10\"},\"arguments\":[]}},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"in\"},{\"$type\":\"Assignment\",\"feature\":\"in\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@10\"},\"arguments\":[]}}],\"cardinality\":\"?\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"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@10\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"lhsGroup\",\"operator\":\"?=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@14\"},\"arguments\":[]},\"cardinality\":\"?\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@4\"},\"arguments\":[]},{\"$type\":\"Assignment\",\"feature\":\"rhsId\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@10\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"rhsGroup\",\"operator\":\"?=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@14\"},\"arguments\":[]},\"cardinality\":\"?\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"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\":\"ARCH_ID\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[\\\\\\\\w]+/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"ARCH_TEXT_ICON\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\\\\(\\\\\"[^\\\\\"]+\\\\\"\\\\\\\\)/\"},\"fragment\":false,\"hidden\":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},{\"$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\":\"TitleAndAccessibilities\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"accDescr\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@19\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"accTitle\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@20\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"title\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@21\"},\"arguments\":[]}}]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"arguments\":[]}],\"cardinality\":\"+\"},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"EOL\",\"dataType\":\"string\",\"definition\":{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@18\"},\"arguments\":[],\"cardinality\":\"+\"},{\"$type\":\"EndOfFile\"}]},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"TerminalRule\",\"name\":\"NEWLINE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\\\\r?\\\\\\\\n/\"},\"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\",\"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\":[{\"$type\":\"Interface\",\"name\":\"Common\",\"attributes\":[{\"$type\":\"TypeAttribute\",\"name\":\"accDescr\",\"isOptional\":true,\"type\":{\"$type\":\"SimpleType\",\"primitiveType\":\"string\"}},{\"$type\":\"TypeAttribute\",\"name\":\"accTitle\",\"isOptional\":true,\"type\":{\"$type\":\"SimpleType\",\"primitiveType\":\"string\"}},{\"$type\":\"TypeAttribute\",\"name\":\"title\",\"isOptional\":true,\"type\":{\"$type\":\"SimpleType\",\"primitiveType\":\"string\"}}],\"superTypes\":[]}],\"types\":[],\"usedGrammars\":[]}')), \"ArchitectureGrammar\");\nvar loadedGitGraphGrammar;\nvar GitGraphGrammar = /* @__PURE__ */ __name(() => loadedGitGraphGrammar ?? (loadedGitGraphGrammar = loadGrammarFromJson(`{\"$type\":\"Grammar\",\"isDeclared\":true,\"name\":\"GitGraph\",\"interfaces\":[{\"$type\":\"Interface\",\"name\":\"Common\",\"attributes\":[{\"$type\":\"TypeAttribute\",\"name\":\"accDescr\",\"isOptional\":true,\"type\":{\"$type\":\"SimpleType\",\"primitiveType\":\"string\"}},{\"$type\":\"TypeAttribute\",\"name\":\"accTitle\",\"isOptional\":true,\"type\":{\"$type\":\"SimpleType\",\"primitiveType\":\"string\"}},{\"$type\":\"TypeAttribute\",\"name\":\"title\",\"isOptional\":true,\"type\":{\"$type\":\"SimpleType\",\"primitiveType\":\"string\"}}],\"superTypes\":[]}],\"rules\":[{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"TitleAndAccessibilities\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"accDescr\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@3\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"accTitle\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@4\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"title\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@5\"},\"arguments\":[]}}]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@1\"},\"arguments\":[]}],\"cardinality\":\"+\"},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"EOL\",\"dataType\":\"string\",\"definition\":{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@2\"},\"arguments\":[],\"cardinality\":\"+\"},{\"$type\":\"EndOfFile\"}]},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"TerminalRule\",\"name\":\"NEWLINE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\\\\r?\\\\\\\\n/\"},\"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\",\"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\":\"ParserRule\",\"entry\":true,\"name\":\"GitGraph\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@2\"},\"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@12\"},\"arguments\":[]},{\"$type\":\"Keyword\",\"value\":\":\"}]}]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@2\"},\"arguments\":[],\"cardinality\":\"*\"},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@2\"},\"arguments\":[],\"cardinality\":\"*\"},{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@0\"},\"arguments\":[]},{\"$type\":\"Assignment\",\"feature\":\"statements\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@11\"},\"arguments\":[]}},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@2\"},\"arguments\":[]}],\"cardinality\":\"*\"}]}]},\"definesHiddenTokens\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"Statement\",\"definition\":{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@13\"},\"arguments\":[]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@14\"},\"arguments\":[]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@15\"},\"arguments\":[]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@16\"},\"arguments\":[]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"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@20\"},\"arguments\":[]}}]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"msg:\",\"cardinality\":\"?\"},{\"$type\":\"Assignment\",\"feature\":\"message\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@20\"},\"arguments\":[]}}]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"tag:\"},{\"$type\":\"Assignment\",\"feature\":\"tags\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@20\"},\"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@1\"},\"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@19\"},\"arguments\":[]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@20\"},\"arguments\":[]}]}},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"order:\"},{\"$type\":\"Assignment\",\"feature\":\"order\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@18\"},\"arguments\":[]}}],\"cardinality\":\"?\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@1\"},\"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@19\"},\"arguments\":[]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@20\"},\"arguments\":[]}]}},{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"id:\"},{\"$type\":\"Assignment\",\"feature\":\"id\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@20\"},\"arguments\":[]}}]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"tag:\"},{\"$type\":\"Assignment\",\"feature\":\"tags\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@20\"},\"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@1\"},\"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@19\"},\"arguments\":[]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@20\"},\"arguments\":[]}]}},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@1\"},\"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@20\"},\"arguments\":[]}}]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"tag:\"},{\"$type\":\"Assignment\",\"feature\":\"tags\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@20\"},\"arguments\":[]}}]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"parent:\"},{\"$type\":\"Assignment\",\"feature\":\"parent\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@20\"},\"arguments\":[]}}]}],\"cardinality\":\"*\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@1\"},\"arguments\":[]}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"TerminalRule\",\"name\":\"INT\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"number\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[0-9]+(?=\\\\\\\\s)/\"},\"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\":\"STRING\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\"[^\\\\\"]*\\\\\"|'[^']*'/\"},\"fragment\":false,\"hidden\":false}],\"definesHiddenTokens\":false,\"hiddenTokens\":[],\"imports\":[],\"types\":[],\"usedGrammars\":[]}`)), \"GitGraphGrammar\");\nvar loadedRadarGrammar;\nvar RadarGrammar = /* @__PURE__ */ __name(() => loadedRadarGrammar ?? (loadedRadarGrammar = loadGrammarFromJson(`{\"$type\":\"Grammar\",\"isDeclared\":true,\"name\":\"Radar\",\"interfaces\":[{\"$type\":\"Interface\",\"name\":\"Common\",\"attributes\":[{\"$type\":\"TypeAttribute\",\"name\":\"accDescr\",\"isOptional\":true,\"type\":{\"$type\":\"SimpleType\",\"primitiveType\":\"string\"}},{\"$type\":\"TypeAttribute\",\"name\":\"accTitle\",\"isOptional\":true,\"type\":{\"$type\":\"SimpleType\",\"primitiveType\":\"string\"}},{\"$type\":\"TypeAttribute\",\"name\":\"title\",\"isOptional\":true,\"type\":{\"$type\":\"SimpleType\",\"primitiveType\":\"string\"}}],\"superTypes\":[]},{\"$type\":\"Interface\",\"name\":\"Entry\",\"attributes\":[{\"$type\":\"TypeAttribute\",\"name\":\"axis\",\"isOptional\":true,\"type\":{\"$type\":\"ReferenceType\",\"referenceType\":{\"$type\":\"SimpleType\",\"typeRef\":{\"$ref\":\"#/rules@12\"}}}},{\"$type\":\"TypeAttribute\",\"name\":\"value\",\"type\":{\"$type\":\"SimpleType\",\"primitiveType\":\"number\"},\"isOptional\":false}],\"superTypes\":[]}],\"rules\":[{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"TitleAndAccessibilities\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"accDescr\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@3\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"accTitle\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@4\"},\"arguments\":[]}},{\"$type\":\"Assignment\",\"feature\":\"title\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@5\"},\"arguments\":[]}}]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@1\"},\"arguments\":[]}],\"cardinality\":\"+\"},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"fragment\":true,\"name\":\"EOL\",\"dataType\":\"string\",\"definition\":{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@2\"},\"arguments\":[],\"cardinality\":\"+\"},{\"$type\":\"EndOfFile\"}]},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"TerminalRule\",\"name\":\"NEWLINE\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\\\\r?\\\\\\\\n/\"},\"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\",\"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\":\"ParserRule\",\"entry\":true,\"name\":\"Radar\",\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@2\"},\"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@2\"},\"arguments\":[],\"cardinality\":\"*\"},{\"$type\":\"Alternatives\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@0\"},\"arguments\":[]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"axis\"},{\"$type\":\"Assignment\",\"feature\":\"axes\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@12\"},\"arguments\":[]}},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\",\"},{\"$type\":\"Assignment\",\"feature\":\"axes\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@12\"},\"arguments\":[]}}],\"cardinality\":\"*\"}]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\"curve\"},{\"$type\":\"Assignment\",\"feature\":\"curves\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@13\"},\"arguments\":[]}},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\",\"},{\"$type\":\"Assignment\",\"feature\":\"curves\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@13\"},\"arguments\":[]}}],\"cardinality\":\"*\"}]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"options\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"arguments\":[]}},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\",\"},{\"$type\":\"Assignment\",\"feature\":\"options\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@17\"},\"arguments\":[]}}],\"cardinality\":\"*\"}]},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@2\"},\"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@22\"},\"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@21\"},\"arguments\":[]}},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@11\"},\"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@21\"},\"arguments\":[]}},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@11\"},\"arguments\":[],\"cardinality\":\"?\"},{\"$type\":\"Keyword\",\"value\":\"{\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@14\"},\"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@2\"},\"arguments\":[],\"cardinality\":\"*\"},{\"$type\":\"Assignment\",\"feature\":\"entries\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@16\"},\"arguments\":[]}},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\",\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@2\"},\"arguments\":[],\"cardinality\":\"*\"},{\"$type\":\"Assignment\",\"feature\":\"entries\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@16\"},\"arguments\":[]}}],\"cardinality\":\"*\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@2\"},\"arguments\":[],\"cardinality\":\"*\"}]},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@2\"},\"arguments\":[],\"cardinality\":\"*\"},{\"$type\":\"Assignment\",\"feature\":\"entries\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@15\"},\"arguments\":[]}},{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Keyword\",\"value\":\",\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@2\"},\"arguments\":[],\"cardinality\":\"*\"},{\"$type\":\"Assignment\",\"feature\":\"entries\",\"operator\":\"+=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@15\"},\"arguments\":[]}}],\"cardinality\":\"*\"},{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@2\"},\"arguments\":[],\"cardinality\":\"*\"}]}]},\"definesHiddenTokens\":false,\"entry\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"DetailedEntry\",\"returnType\":{\"$ref\":\"#/interfaces@1\"},\"definition\":{\"$type\":\"Group\",\"elements\":[{\"$type\":\"Assignment\",\"feature\":\"axis\",\"operator\":\"=\",\"terminal\":{\"$type\":\"CrossReference\",\"type\":{\"$ref\":\"#/rules@12\"},\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@21\"},\"arguments\":[]},\"deprecatedSyntax\":false}},{\"$type\":\"Keyword\",\"value\":\":\",\"cardinality\":\"?\"},{\"$type\":\"Assignment\",\"feature\":\"value\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@18\"},\"arguments\":[]}}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"ParserRule\",\"name\":\"NumberEntry\",\"returnType\":{\"$ref\":\"#/interfaces@1\"},\"definition\":{\"$type\":\"Assignment\",\"feature\":\"value\",\"operator\":\"=\",\"terminal\":{\"$type\":\"RuleCall\",\"rule\":{\"$ref\":\"#/rules@18\"},\"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@19\"},\"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@18\"},\"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@18\"},\"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@18\"},\"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@20\"},\"arguments\":[]}}]}]},\"definesHiddenTokens\":false,\"entry\":false,\"fragment\":false,\"hiddenTokens\":[],\"parameters\":[],\"wildcard\":false},{\"$type\":\"TerminalRule\",\"name\":\"NUMBER\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"number\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/(0|[1-9][0-9]*)(\\\\\\\\.[0-9]+)?/\"},\"fragment\":false,\"hidden\":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\":\"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\":\"TerminalRule\",\"name\":\"ID\",\"type\":{\"$type\":\"ReturnType\",\"name\":\"string\"},\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/[a-zA-Z_][a-zA-Z0-9\\\\\\\\-_]*/\"},\"fragment\":false,\"hidden\":false},{\"$type\":\"TerminalRule\",\"name\":\"STRING\",\"definition\":{\"$type\":\"RegexToken\",\"regex\":\"/\\\\\"[^\\\\\"]*\\\\\"|'[^']*'/\"},\"fragment\":false,\"hidden\":false}],\"definesHiddenTokens\":false,\"hiddenTokens\":[],\"imports\":[],\"types\":[],\"usedGrammars\":[]}`)), \"RadarGrammar\");\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 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};\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 isCommon,\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 MermaidGeneratedSharedModule,\n InfoGeneratedModule,\n PacketGeneratedModule,\n PieGeneratedModule,\n ArchitectureGeneratedModule,\n GitGraphGeneratedModule,\n RadarGeneratedModule,\n AbstractMermaidValueConverter,\n CommonValueConverter,\n AbstractMermaidTokenBuilder,\n CommonTokenBuilder\n};\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 });\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","/******************************************************************************\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","import baseIteratee from './_baseIteratee.js';\nimport baseUniq from './_baseUniq.js';\n\n/**\n * This method is like `_.uniq` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the criterion by which\n * uniqueness is computed. The order of result values is determined by the\n * order they occur in the array. The iteratee is invoked with one argument:\n * (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniqBy([2.1, 1.2, 2.3], Math.floor);\n * // => [2.1, 1.2]\n *\n * // The `_.property` iteratee shorthand.\n * _.uniqBy([{ 'x': 1 }, { 'x': 2 }, { 'x': 1 }], 'x');\n * // => [{ 'x': 1 }, { 'x': 2 }]\n */\nfunction uniqBy(array, iteratee) {\n return (array && array.length) ? baseUniq(array, baseIteratee(iteratee, 2)) : [];\n}\n\nexport default uniqBy;\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 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 { 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","/******************************************************************************\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 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\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 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 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\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} — ${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\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","/******************************************************************************\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","import baseFlatten from './_baseFlatten.js';\nimport map from './map.js';\n\n/**\n * Creates a flattened array of values by running each element in `collection`\n * thru `iteratee` and flattening the mapped results. The iteratee is invoked\n * with three arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * function duplicate(n) {\n * return [n, n];\n * }\n *\n * _.flatMap([1, 2], duplicate);\n * // => [1, 1, 2, 2]\n */\nfunction flatMap(collection, iteratee) {\n return baseFlatten(map(collection, iteratee), 1);\n}\n\nexport default flatMap;\n","import {\n AbstractMermaidTokenBuilder,\n CommonValueConverter,\n MermaidGeneratedSharedModule,\n RadarGeneratedModule,\n __name\n} from \"./chunk-7PKI6E2E.mjs\";\n\n// src/language/radar/module.ts\nimport {\n EmptyFileSystem,\n createDefaultCoreModule,\n createDefaultSharedCoreModule,\n inject\n} from \"langium\";\n\n// src/language/radar/tokenBuilder.ts\nvar RadarTokenBuilder = class extends AbstractMermaidTokenBuilder {\n static {\n __name(this, \"RadarTokenBuilder\");\n }\n constructor() {\n super([\"radar-beta\"]);\n }\n};\n\n// src/language/radar/module.ts\nvar RadarModule = {\n parser: {\n TokenBuilder: /* @__PURE__ */ __name(() => new RadarTokenBuilder(), \"TokenBuilder\"),\n ValueConverter: /* @__PURE__ */ __name(() => new CommonValueConverter(), \"ValueConverter\")\n }\n};\nfunction createRadarServices(context = EmptyFileSystem) {\n const shared = inject(\n createDefaultSharedCoreModule(context),\n MermaidGeneratedSharedModule\n );\n const Radar = inject(\n createDefaultCoreModule({ shared }),\n RadarGeneratedModule,\n RadarModule\n );\n shared.ServiceRegistry.register(Radar);\n return { shared, Radar };\n}\n__name(createRadarServices, \"createRadarServices\");\n\nexport {\n RadarModule,\n createRadarServices\n};\n","import isSymbol from './isSymbol.js';\n\n/**\n * The base implementation of methods like `_.max` and `_.min` which accepts a\n * `comparator` to determine the extremum value.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The iteratee invoked per iteration.\n * @param {Function} comparator The comparator used to compare values.\n * @returns {*} Returns the extremum value.\n */\nfunction baseExtremum(array, iteratee, comparator) {\n var index = -1,\n length = array.length;\n\n while (++index < length) {\n var value = array[index],\n current = iteratee(value);\n\n if (current != null && (computed === undefined\n ? (current === current && !isSymbol(current))\n : comparator(current, computed)\n )) {\n var computed = current,\n result = value;\n }\n }\n return result;\n}\n\nexport default baseExtremum;\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","/******************************************************************************\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","import baseClone from './_baseClone.js';\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_SYMBOLS_FLAG = 4;\n\n/**\n * Creates a shallow clone of `value`.\n *\n * **Note:** This method is loosely based on the\n * [structured clone algorithm](https://mdn.io/Structured_clone_algorithm)\n * and supports cloning arrays, array buffers, booleans, date objects, maps,\n * numbers, `Object` objects, regexes, sets, strings, symbols, and typed\n * arrays. The own enumerable properties of `arguments` objects are cloned\n * as plain objects. An empty object is returned for uncloneable values such\n * as error objects, functions, DOM nodes, and WeakMaps.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to clone.\n * @returns {*} Returns the cloned value.\n * @see _.cloneDeep\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var shallow = _.clone(objects);\n * console.log(shallow[0] === objects[0]);\n * // => true\n */\nfunction clone(value) {\n return baseClone(value, CLONE_SYMBOLS_FLAG);\n}\n\nexport default clone;\n","/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nexport default trimmedEndIndex;\n","import trimmedEndIndex from './_trimmedEndIndex.js';\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nexport default baseTrim;\n","import baseTrim from './_baseTrim.js';\nimport isObject from './isObject.js';\nimport isSymbol from './isSymbol.js';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nexport default toNumber;\n","import toNumber from './toNumber.js';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n MAX_INTEGER = 1.7976931348623157e+308;\n\n/**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\nfunction toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n return value === value ? value : 0;\n}\n\nexport default toFinite;\n","import {\n AbstractMermaidTokenBuilder,\n CommonValueConverter,\n GitGraphGeneratedModule,\n MermaidGeneratedSharedModule,\n __name\n} from \"./chunk-7PKI6E2E.mjs\";\n\n// src/language/gitGraph/module.ts\nimport {\n inject,\n createDefaultCoreModule,\n createDefaultSharedCoreModule,\n EmptyFileSystem\n} from \"langium\";\n\n// src/language/gitGraph/tokenBuilder.ts\nvar GitGraphTokenBuilder = class extends AbstractMermaidTokenBuilder {\n static {\n __name(this, \"GitGraphTokenBuilder\");\n }\n constructor() {\n super([\"gitGraph\"]);\n }\n};\n\n// src/language/gitGraph/module.ts\nvar GitGraphModule = {\n parser: {\n TokenBuilder: /* @__PURE__ */ __name(() => new GitGraphTokenBuilder(), \"TokenBuilder\"),\n ValueConverter: /* @__PURE__ */ __name(() => new CommonValueConverter(), \"ValueConverter\")\n }\n};\nfunction createGitGraphServices(context = EmptyFileSystem) {\n const shared = inject(\n createDefaultSharedCoreModule(context),\n MermaidGeneratedSharedModule\n );\n const GitGraph = inject(\n createDefaultCoreModule({ shared }),\n GitGraphGeneratedModule,\n GitGraphModule\n );\n shared.ServiceRegistry.register(GitGraph);\n return { shared, GitGraph };\n}\n__name(createGitGraphServices, \"createGitGraphServices\");\n\nexport {\n GitGraphModule,\n createGitGraphServices\n};\n","import baseGetTag from './_baseGetTag.js';\nimport isArray from './isArray.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar stringTag = '[object String]';\n\n/**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\nfunction isString(value) {\n return typeof value == 'string' ||\n (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n}\n\nexport default isString;\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 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","/**\n * Gets the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the last element of `array`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n */\nfunction last(array) {\n var length = array == null ? 0 : array.length;\n return length ? array[length - 1] : undefined;\n}\n\nexport default last;\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 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","import baseEach from './_baseEach.js';\nimport isArrayLike from './isArrayLike.js';\n\n/**\n * The base implementation of `_.map` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction baseMap(collection, iteratee) {\n var index = -1,\n result = isArrayLike(collection) ? Array(collection.length) : [];\n\n baseEach(collection, function(value, key, collection) {\n result[++index] = iteratee(value, key, collection);\n });\n return result;\n}\n\nexport default baseMap;\n","import baseRest from './_baseRest.js';\nimport eq from './eq.js';\nimport isIterateeCall from './_isIterateeCall.js';\nimport keysIn from './keysIn.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns own and inherited enumerable string keyed properties of source\n * objects to the destination object for all destination properties that\n * resolve to `undefined`. Source objects are applied from left to right.\n * Once a property is set, additional values of the same property are ignored.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaultsDeep\n * @example\n *\n * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\nvar defaults = baseRest(function(object, sources) {\n object = Object(object);\n\n var index = -1;\n var length = sources.length;\n var guard = length > 2 ? sources[2] : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n length = 1;\n }\n\n while (++index < length) {\n var source = sources[index];\n var props = keysIn(source);\n var propsIndex = -1;\n var propsLength = props.length;\n\n while (++propsIndex < propsLength) {\n var key = props[propsIndex];\n var value = object[key];\n\n if (value === undefined ||\n (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n object[key] = source[key];\n }\n }\n }\n\n return object;\n});\n\nexport default defaults;\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","import {\n GitGraphModule,\n createGitGraphServices\n} from \"./chunks/mermaid-parser.core/chunk-2NYFTIL2.mjs\";\nimport {\n InfoModule,\n createInfoServices\n} from \"./chunks/mermaid-parser.core/chunk-EXZZNE6F.mjs\";\nimport {\n PacketModule,\n createPacketServices\n} from \"./chunks/mermaid-parser.core/chunk-V4Q32G6S.mjs\";\nimport {\n PieModule,\n createPieServices\n} from \"./chunks/mermaid-parser.core/chunk-ROXG7S4E.mjs\";\nimport {\n ArchitectureModule,\n createArchitectureServices\n} from \"./chunks/mermaid-parser.core/chunk-C4OEIS7N.mjs\";\nimport {\n RadarModule,\n createRadarServices\n} from \"./chunks/mermaid-parser.core/chunk-2O5ZK7RR.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 __name,\n isArchitecture,\n isBranch,\n isCommit,\n isCommon,\n isGitGraph,\n isInfo,\n isMerge,\n isPacket,\n isPacketBlock,\n isPie,\n isPieSection\n} from \"./chunks/mermaid-parser.core/chunk-7PKI6E2E.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-4N47QTOZ.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-KVYON367.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-R6RNRRYF.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-4AB2E3PP.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-O2Q2CXLX.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-MK3ICKWK.mjs\");\n const parser = createRadarServices2().Radar.parser.LangiumParser;\n parsers.radar = parser;\n }, \"radar\")\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 createArchitectureServices,\n createGitGraphServices,\n createInfoServices,\n createPacketServices,\n createPieServices,\n createRadarServices,\n isArchitecture,\n isBranch,\n isCommit,\n isCommon,\n isGitGraph,\n isInfo,\n isMerge,\n isPacket,\n isPacketBlock,\n isPie,\n isPieSection,\n parse\n};\n","/**\n * The base implementation of `_.lt` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than `other`,\n * else `false`.\n */\nfunction baseLt(value, other) {\n return value < other;\n}\n\nexport default baseLt;\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","import baseFlatten from './_baseFlatten.js';\n\n/**\n * Flattens `array` a single level deep.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flatten([1, [2, [3, [4]], 5]]);\n * // => [1, 2, [3, [4]], 5]\n */\nfunction flatten(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseFlatten(array, 1) : [];\n}\n\nexport default flatten;\n","import toFinite from './toFinite.js';\n\n/**\n * Converts `value` to an integer.\n *\n * **Note:** This method is loosely based on\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */\nfunction toInteger(value) {\n var result = toFinite(value),\n remainder = result % 1;\n\n return result === result ? (remainder ? result - remainder : result) : 0;\n}\n\nexport default toInteger;\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","// 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","/**\n * The base implementation of `_.slice` without an iteratee call guard.\n *\n * @private\n * @param {Array} array The array to slice.\n * @param {number} [start=0] The start position.\n * @param {number} [end=array.length] The end position.\n * @returns {Array} Returns the slice of `array`.\n */\nfunction baseSlice(array, start, end) {\n var index = -1,\n length = array.length;\n\n if (start < 0) {\n start = -start > length ? 0 : (length + start);\n }\n end = end > length ? length : end;\n if (end < 0) {\n end += length;\n }\n length = start > end ? 0 : ((end - start) >>> 0);\n start >>>= 0;\n\n var result = Array(length);\n while (++index < length) {\n result[index] = array[index + start];\n }\n return result;\n}\n\nexport default baseSlice;\n","import baseSlice from './_baseSlice.js';\nimport toInteger from './toInteger.js';\n\n/**\n * Creates a slice of `array` with `n` elements dropped from the beginning.\n *\n * @static\n * @memberOf _\n * @since 0.5.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to drop.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.drop([1, 2, 3]);\n * // => [2, 3]\n *\n * _.drop([1, 2, 3], 2);\n * // => [3]\n *\n * _.drop([1, 2, 3], 5);\n * // => []\n *\n * _.drop([1, 2, 3], 0);\n * // => [1, 2, 3]\n */\nfunction drop(array, n, guard) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n n = (guard || n === undefined) ? 1 : toInteger(n);\n return baseSlice(array, n < 0 ? 0 : n, length);\n}\n\nexport default drop;\n","import assignValue from './_assignValue.js';\nimport copyObject from './_copyObject.js';\nimport createAssigner from './_createAssigner.js';\nimport isArrayLike from './isArrayLike.js';\nimport isPrototype from './_isPrototype.js';\nimport keys from './keys.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns own enumerable string keyed properties of source objects to the\n * destination object. Source objects are applied from left to right.\n * Subsequent sources overwrite property assignments of previous sources.\n *\n * **Note:** This method mutates `object` and is loosely based on\n * [`Object.assign`](https://mdn.io/Object/assign).\n *\n * @static\n * @memberOf _\n * @since 0.10.0\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.assignIn\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * }\n *\n * function Bar() {\n * this.c = 3;\n * }\n *\n * Foo.prototype.b = 2;\n * Bar.prototype.d = 4;\n *\n * _.assign({ 'a': 0 }, new Foo, new Bar);\n * // => { 'a': 1, 'c': 3 }\n */\nvar assign = createAssigner(function(object, source) {\n if (isPrototype(source) || isArrayLike(source)) {\n copyObject(source, keys(source), object);\n return;\n }\n for (var key in source) {\n if (hasOwnProperty.call(source, key)) {\n assignValue(object, key, source[key]);\n }\n }\n});\n\nexport default assign;\n","import arrayMap from './_arrayMap.js';\nimport baseIteratee from './_baseIteratee.js';\nimport basePickBy from './_basePickBy.js';\nimport getAllKeysIn from './_getAllKeysIn.js';\n\n/**\n * Creates an object composed of the `object` properties `predicate` returns\n * truthy for. The predicate is invoked with two arguments: (value, key).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Object\n * @param {Object} object The source object.\n * @param {Function} [predicate=_.identity] The function invoked per property.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.pickBy(object, _.isNumber);\n * // => { 'a': 1, 'c': 3 }\n */\nfunction pickBy(object, predicate) {\n if (object == null) {\n return {};\n }\n var props = arrayMap(getAllKeysIn(object), function(prop) {\n return [prop];\n });\n predicate = baseIteratee(predicate);\n return basePickBy(object, props, function(value, path) {\n return predicate(value, path[0]);\n });\n}\n\nexport default pickBy;\n","import baseGetTag from './_baseGetTag.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar regexpTag = '[object RegExp]';\n\n/**\n * The base implementation of `_.isRegExp` without Node.js optimizations.\n *\n * @private\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a regexp, else `false`.\n */\nfunction baseIsRegExp(value) {\n return isObjectLike(value) && baseGetTag(value) == regexpTag;\n}\n\nexport default baseIsRegExp;\n","import baseIsRegExp from './_baseIsRegExp.js';\nimport baseUnary from './_baseUnary.js';\nimport nodeUtil from './_nodeUtil.js';\n\n/* Node.js helper references. */\nvar nodeIsRegExp = nodeUtil && nodeUtil.isRegExp;\n\n/**\n * Checks if `value` is classified as a `RegExp` 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 a regexp, else `false`.\n * @example\n *\n * _.isRegExp(/abc/);\n * // => true\n *\n * _.isRegExp('/abc/');\n * // => false\n */\nvar isRegExp = nodeIsRegExp ? baseUnary(nodeIsRegExp) : baseIsRegExp;\n\nexport default isRegExp;\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 baseEach from './_baseEach.js';\n\n/**\n * The base implementation of `_.some` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n */\nfunction baseSome(collection, predicate) {\n var result;\n\n baseEach(collection, function(value, index, collection) {\n result = predicate(value, index, collection);\n return !result;\n });\n return !!result;\n}\n\nexport default baseSome;\n","import arraySome from './_arraySome.js';\nimport baseIteratee from './_baseIteratee.js';\nimport baseSome from './_baseSome.js';\nimport isArray from './isArray.js';\nimport isIterateeCall from './_isIterateeCall.js';\n\n/**\n * Checks if `predicate` returns truthy for **any** element of `collection`.\n * Iteration is stopped once `predicate` returns truthy. The predicate is\n * invoked with three arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {boolean} Returns `true` if any element passes the predicate check,\n * else `false`.\n * @example\n *\n * _.some([null, 0, 'yes', false], Boolean);\n * // => true\n *\n * var users = [\n * { 'user': 'barney', 'active': true },\n * { 'user': 'fred', 'active': false }\n * ];\n *\n * // The `_.matches` iteratee shorthand.\n * _.some(users, { 'user': 'barney', 'active': false });\n * // => false\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.some(users, ['active', false]);\n * // => true\n *\n * // The `_.property` iteratee shorthand.\n * _.some(users, 'active');\n * // => true\n */\nfunction some(collection, predicate, guard) {\n var func = isArray(collection) ? arraySome : baseSome;\n if (guard && isIterateeCall(collection, predicate, guard)) {\n predicate = undefined;\n }\n return func(collection, baseIteratee(predicate, 3));\n}\n\nexport default some;\n","import baseIndexOf from './_baseIndexOf.js';\nimport isArrayLike from './isArrayLike.js';\nimport isString from './isString.js';\nimport toInteger from './toInteger.js';\nimport values from './values.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Checks if `value` is in `collection`. If `collection` is a string, it's\n * checked for a substring of `value`, otherwise\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * is used for equality comparisons. If `fromIndex` is negative, it's used as\n * the offset from the end of `collection`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object|string} collection The collection to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=0] The index to search from.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.reduce`.\n * @returns {boolean} Returns `true` if `value` is found, else `false`.\n * @example\n *\n * _.includes([1, 2, 3], 1);\n * // => true\n *\n * _.includes([1, 2, 3], 1, 2);\n * // => false\n *\n * _.includes({ 'a': 1, 'b': 2 }, 1);\n * // => true\n *\n * _.includes('abcd', 'bc');\n * // => true\n */\nfunction includes(collection, value, fromIndex, guard) {\n collection = isArrayLike(collection) ? collection : values(collection);\n fromIndex = (fromIndex && !guard) ? toInteger(fromIndex) : 0;\n\n var length = collection.length;\n if (fromIndex < 0) {\n fromIndex = nativeMax(length + fromIndex, 0);\n }\n return isString(collection)\n ? (fromIndex <= length && collection.indexOf(value, fromIndex) > -1)\n : (!!length && baseIndexOf(collection, value, fromIndex) > -1);\n}\n\nexport default includes;\n","/**\n * A specialized version of `_.every` for arrays without support for\n * iteratee shorthands.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`.\n */\nfunction arrayEvery(array, predicate) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n if (!predicate(array[index], index, array)) {\n return false;\n }\n }\n return true;\n}\n\nexport default arrayEvery;\n","import baseEach from './_baseEach.js';\n\n/**\n * The base implementation of `_.every` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} predicate The function invoked per iteration.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`\n */\nfunction baseEvery(collection, predicate) {\n var result = true;\n baseEach(collection, function(value, index, collection) {\n result = !!predicate(value, index, collection);\n return result;\n });\n return result;\n}\n\nexport default baseEvery;\n","import arrayEvery from './_arrayEvery.js';\nimport baseEvery from './_baseEvery.js';\nimport baseIteratee from './_baseIteratee.js';\nimport isArray from './isArray.js';\nimport isIterateeCall from './_isIterateeCall.js';\n\n/**\n * Checks if `predicate` returns truthy for **all** elements of `collection`.\n * Iteration is stopped once `predicate` returns falsey. The predicate is\n * invoked with three arguments: (value, index|key, collection).\n *\n * **Note:** This method returns `true` for\n * [empty collections](https://en.wikipedia.org/wiki/Empty_set) because\n * [everything is true](https://en.wikipedia.org/wiki/Vacuous_truth) of\n * elements of empty collections.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {boolean} Returns `true` if all elements pass the predicate check,\n * else `false`.\n * @example\n *\n * _.every([true, 1, null, 'yes'], Boolean);\n * // => false\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': false }\n * ];\n *\n * // The `_.matches` iteratee shorthand.\n * _.every(users, { 'user': 'barney', 'active': false });\n * // => false\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.every(users, ['active', false]);\n * // => true\n *\n * // The `_.property` iteratee shorthand.\n * _.every(users, 'active');\n * // => false\n */\nfunction every(collection, predicate, guard) {\n var func = isArray(collection) ? arrayEvery : baseEvery;\n if (guard && isIterateeCall(collection, predicate, guard)) {\n predicate = undefined;\n }\n return func(collection, baseIteratee(predicate, 3));\n}\n\nexport default every;\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 baseUniq from './_baseUniq.js';\n\n/**\n * Creates a duplicate-free version of an array, using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons, in which only the first occurrence of each element\n * is kept. The order of result values is determined by the order they occur\n * in the array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @returns {Array} Returns the new duplicate free array.\n * @example\n *\n * _.uniq([2, 1, 2]);\n * // => [2, 1]\n */\nfunction uniq(array) {\n return (array && array.length) ? baseUniq(array) : [];\n}\n\nexport default uniq;\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","/** Error message constants. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/**\n * Creates a function that negates the result of the predicate `func`. The\n * `func` predicate is invoked with the `this` binding and arguments of the\n * created function.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Function\n * @param {Function} predicate The predicate to negate.\n * @returns {Function} Returns the new negated function.\n * @example\n *\n * function isEven(n) {\n * return n % 2 == 0;\n * }\n *\n * _.filter([1, 2, 3, 4, 5, 6], _.negate(isEven));\n * // => [1, 3, 5]\n */\nfunction negate(predicate) {\n if (typeof predicate != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n return function() {\n var args = arguments;\n switch (args.length) {\n case 0: return !predicate.call(this);\n case 1: return !predicate.call(this, args[0]);\n case 2: return !predicate.call(this, args[0], args[1]);\n case 3: return !predicate.call(this, args[0], args[1], args[2]);\n }\n return !predicate.apply(this, args);\n };\n}\n\nexport default negate;\n","import arrayFilter from './_arrayFilter.js';\nimport baseFilter from './_baseFilter.js';\nimport baseIteratee from './_baseIteratee.js';\nimport isArray from './isArray.js';\nimport negate from './negate.js';\n\n/**\n * The opposite of `_.filter`; this method returns the elements of `collection`\n * that `predicate` does **not** return truthy for.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new filtered array.\n * @see _.filter\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': false },\n * { 'user': 'fred', 'age': 40, 'active': true }\n * ];\n *\n * _.reject(users, function(o) { return !o.active; });\n * // => objects for ['fred']\n *\n * // The `_.matches` iteratee shorthand.\n * _.reject(users, { 'age': 40, 'active': true });\n * // => objects for ['barney']\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.reject(users, ['active', false]);\n * // => objects for ['fred']\n *\n * // The `_.property` iteratee shorthand.\n * _.reject(users, 'active');\n * // => objects for ['barney']\n */\nfunction reject(collection, predicate) {\n var func = isArray(collection) ? arrayFilter : baseFilter;\n return func(collection, negate(baseIteratee(predicate, 3)));\n}\n\nexport default reject;\n","import baseIndexOf from './_baseIndexOf.js';\nimport toInteger from './toInteger.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * Gets the index at which the first occurrence of `value` is found in `array`\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. If `fromIndex` is negative, it's used as the\n * offset from the end of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {*} value The value to search for.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {number} Returns the index of the matched value, else `-1`.\n * @example\n *\n * _.indexOf([1, 2, 1, 2], 2);\n * // => 1\n *\n * // Search from the `fromIndex`.\n * _.indexOf([1, 2, 1, 2], 2, 2);\n * // => 3\n */\nfunction indexOf(array, value, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\n if (index < 0) {\n index = nativeMax(length + index, 0);\n }\n return baseIndexOf(array, value, index);\n}\n\nexport default indexOf;\n","import SetCache from './_SetCache.js';\nimport arrayIncludes from './_arrayIncludes.js';\nimport arrayIncludesWith from './_arrayIncludesWith.js';\nimport arrayMap from './_arrayMap.js';\nimport baseUnary from './_baseUnary.js';\nimport cacheHas from './_cacheHas.js';\n\n/** Used as the size to enable large array optimizations. */\nvar LARGE_ARRAY_SIZE = 200;\n\n/**\n * The base implementation of methods like `_.difference` without support\n * for excluding multiple arrays or iteratee shorthands.\n *\n * @private\n * @param {Array} array The array to inspect.\n * @param {Array} values The values to exclude.\n * @param {Function} [iteratee] The iteratee invoked per element.\n * @param {Function} [comparator] The comparator invoked per element.\n * @returns {Array} Returns the new array of filtered values.\n */\nfunction baseDifference(array, values, iteratee, comparator) {\n var index = -1,\n includes = arrayIncludes,\n isCommon = true,\n length = array.length,\n result = [],\n valuesLength = values.length;\n\n if (!length) {\n return result;\n }\n if (iteratee) {\n values = arrayMap(values, baseUnary(iteratee));\n }\n if (comparator) {\n includes = arrayIncludesWith;\n isCommon = false;\n }\n else if (values.length >= LARGE_ARRAY_SIZE) {\n includes = cacheHas;\n isCommon = false;\n values = new SetCache(values);\n }\n outer:\n while (++index < length) {\n var value = array[index],\n computed = iteratee == null ? value : iteratee(value);\n\n value = (comparator || value !== 0) ? value : 0;\n if (isCommon && computed === computed) {\n var valuesIndex = valuesLength;\n while (valuesIndex--) {\n if (values[valuesIndex] === computed) {\n continue outer;\n }\n }\n result.push(value);\n }\n else if (!includes(values, computed, comparator)) {\n result.push(value);\n }\n }\n return result;\n}\n\nexport default baseDifference;\n","import baseDifference from './_baseDifference.js';\nimport baseFlatten from './_baseFlatten.js';\nimport baseRest from './_baseRest.js';\nimport isArrayLikeObject from './isArrayLikeObject.js';\n\n/**\n * Creates an array of `array` values not included in the other given arrays\n * using [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons. The order and references of result values are\n * determined by the first array.\n *\n * **Note:** Unlike `_.pullAll`, this method returns a new array.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {...Array} [values] The values to exclude.\n * @returns {Array} Returns the new array of filtered values.\n * @see _.without, _.xor\n * @example\n *\n * _.difference([2, 1], [2, 3]);\n * // => [1]\n */\nvar difference = baseRest(function(array, values) {\n return isArrayLikeObject(array)\n ? baseDifference(array, baseFlatten(values, 1, isArrayLikeObject, true))\n : [];\n});\n\nexport default difference;\n","/**\n * Creates an array with all falsey values removed. The values `false`, `null`,\n * `0`, `\"\"`, `undefined`, and `NaN` are falsey.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to compact.\n * @returns {Array} Returns the new array of filtered values.\n * @example\n *\n * _.compact([0, 1, false, 2, '', 3]);\n * // => [1, 2, 3]\n */\nfunction compact(array) {\n var index = -1,\n length = array == null ? 0 : array.length,\n resIndex = 0,\n result = [];\n\n while (++index < length) {\n var value = array[index];\n if (value) {\n result[resIndex++] = value;\n }\n }\n return result;\n}\n\nexport default compact;\n","/**\n * Gets the first element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @alias first\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the first element of `array`.\n * @example\n *\n * _.head([1, 2, 3]);\n * // => 1\n *\n * _.head([]);\n * // => undefined\n */\nfunction head(array) {\n return (array && array.length) ? array[0] : undefined;\n}\n\nexport default head;\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","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","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","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","/**\n * A specialized version of `baseAggregator` for arrays.\n *\n * @private\n * @param {Array} [array] The array to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\nfunction arrayAggregator(array, setter, iteratee, accumulator) {\n var index = -1,\n length = array == null ? 0 : array.length;\n\n while (++index < length) {\n var value = array[index];\n setter(accumulator, value, iteratee(value), array);\n }\n return accumulator;\n}\n\nexport default arrayAggregator;\n","import baseEach from './_baseEach.js';\n\n/**\n * Aggregates elements of `collection` on `accumulator` with keys transformed\n * by `iteratee` and values set by `setter`.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} setter The function to set `accumulator` values.\n * @param {Function} iteratee The iteratee to transform keys.\n * @param {Object} accumulator The initial aggregated object.\n * @returns {Function} Returns `accumulator`.\n */\nfunction baseAggregator(collection, setter, iteratee, accumulator) {\n baseEach(collection, function(value, key, collection) {\n setter(accumulator, value, iteratee(value), collection);\n });\n return accumulator;\n}\n\nexport default baseAggregator;\n","import arrayAggregator from './_arrayAggregator.js';\nimport baseAggregator from './_baseAggregator.js';\nimport baseIteratee from './_baseIteratee.js';\nimport isArray from './isArray.js';\n\n/**\n * Creates a function like `_.groupBy`.\n *\n * @private\n * @param {Function} setter The function to set accumulator values.\n * @param {Function} [initializer] The accumulator object initializer.\n * @returns {Function} Returns the new aggregator function.\n */\nfunction createAggregator(setter, initializer) {\n return function(collection, iteratee) {\n var func = isArray(collection) ? arrayAggregator : baseAggregator,\n accumulator = initializer ? initializer() : {};\n\n return func(collection, setter, baseIteratee(iteratee, 2), accumulator);\n };\n}\n\nexport default createAggregator;\n","import baseAssignValue from './_baseAssignValue.js';\nimport createAggregator from './_createAggregator.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Creates an object composed of keys generated from the results of running\n * each element of `collection` thru `iteratee`. The order of grouped values\n * is determined by the order they occur in `collection`. The corresponding\n * value of each key is an array of elements responsible for generating the\n * key. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee to transform keys.\n * @returns {Object} Returns the composed aggregate object.\n * @example\n *\n * _.groupBy([6.1, 4.2, 6.3], Math.floor);\n * // => { '4': [4.2], '6': [6.1, 6.3] }\n *\n * // The `_.property` iteratee shorthand.\n * _.groupBy(['one', 'two', 'three'], 'length');\n * // => { '3': ['one', 'two'], '5': ['three'] }\n */\nvar groupBy = createAggregator(function(result, value, key) {\n if (hasOwnProperty.call(result, key)) {\n result[key].push(value);\n } else {\n baseAssignValue(result, key, [value]);\n }\n});\n\nexport default groupBy;\n","import baseSlice from './_baseSlice.js';\nimport toInteger from './toInteger.js';\n\n/**\n * Creates a slice of `array` with `n` elements dropped from the end.\n *\n * @static\n * @memberOf _\n * @since 3.0.0\n * @category Array\n * @param {Array} array The array to query.\n * @param {number} [n=1] The number of elements to drop.\n * @param- {Object} [guard] Enables use as an iteratee for methods like `_.map`.\n * @returns {Array} Returns the slice of `array`.\n * @example\n *\n * _.dropRight([1, 2, 3]);\n * // => [1, 2]\n *\n * _.dropRight([1, 2, 3], 2);\n * // => [1]\n *\n * _.dropRight([1, 2, 3], 5);\n * // => []\n *\n * _.dropRight([1, 2, 3], 0);\n * // => [1, 2, 3]\n */\nfunction dropRight(array, n, guard) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return [];\n }\n n = (guard || n === undefined) ? 1 : toInteger(n);\n n = length - n;\n return baseSlice(array, 0, n < 0 ? 0 : n);\n}\n\nexport default dropRight;\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 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 { 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","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 {\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 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 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 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 { 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","// '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 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","import {\n AbstractMermaidTokenBuilder,\n AbstractMermaidValueConverter,\n MermaidGeneratedSharedModule,\n PieGeneratedModule,\n __name\n} from \"./chunk-7PKI6E2E.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","import {\n AbstractMermaidTokenBuilder,\n CommonValueConverter,\n MermaidGeneratedSharedModule,\n PacketGeneratedModule,\n __name\n} from \"./chunk-7PKI6E2E.mjs\";\n\n// src/language/packet/module.ts\nimport {\n EmptyFileSystem,\n createDefaultCoreModule,\n createDefaultSharedCoreModule,\n inject\n} from \"langium\";\n\n// src/language/packet/tokenBuilder.ts\nvar PacketTokenBuilder = class extends AbstractMermaidTokenBuilder {\n static {\n __name(this, \"PacketTokenBuilder\");\n }\n constructor() {\n super([\"packet-beta\"]);\n }\n};\n\n// src/language/packet/module.ts\nvar PacketModule = {\n parser: {\n TokenBuilder: /* @__PURE__ */ __name(() => new PacketTokenBuilder(), \"TokenBuilder\"),\n ValueConverter: /* @__PURE__ */ __name(() => new CommonValueConverter(), \"ValueConverter\")\n }\n};\nfunction createPacketServices(context = EmptyFileSystem) {\n const shared = inject(\n createDefaultSharedCoreModule(context),\n MermaidGeneratedSharedModule\n );\n const Packet = inject(\n createDefaultCoreModule({ shared }),\n PacketGeneratedModule,\n PacketModule\n );\n shared.ServiceRegistry.register(Packet);\n return { shared, Packet };\n}\n__name(createPacketServices, \"createPacketServices\");\n\nexport {\n PacketModule,\n createPacketServices\n};\n","import arrayMap from './_arrayMap.js';\nimport baseIteratee from './_baseIteratee.js';\nimport baseMap from './_baseMap.js';\nimport isArray from './isArray.js';\n\n/**\n * Creates an array of values by running each element in `collection` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n *\n * The guarded methods are:\n * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * _.map([4, 8], square);\n * // => [16, 64]\n *\n * _.map({ 'a': 4, 'b': 8 }, square);\n * // => [16, 64] (iteration order is not guaranteed)\n *\n * var users = [\n * { 'user': 'barney' },\n * { 'user': 'fred' }\n * ];\n *\n * // The `_.property` iteratee shorthand.\n * _.map(users, 'user');\n * // => ['barney', 'fred']\n */\nfunction map(collection, iteratee) {\n var func = isArray(collection) ? arrayMap : baseMap;\n return func(collection, baseIteratee(iteratee, 3));\n}\n\nexport default map;\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.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","import baseExtremum from './_baseExtremum.js';\nimport baseLt from './_baseLt.js';\nimport identity from './identity.js';\n\n/**\n * Computes the minimum value of `array`. If `array` is empty or falsey,\n * `undefined` is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {*} Returns the minimum value.\n * @example\n *\n * _.min([4, 2, 8, 6]);\n * // => 2\n *\n * _.min([]);\n * // => undefined\n */\nfunction min(array) {\n return (array && array.length)\n ? baseExtremum(array, identity, baseLt)\n : undefined;\n}\n\nexport default min;\n","import {\n AbstractMermaidTokenBuilder,\n CommonValueConverter,\n InfoGeneratedModule,\n MermaidGeneratedSharedModule,\n __name\n} from \"./chunk-7PKI6E2E.mjs\";\n\n// src/language/info/module.ts\nimport {\n EmptyFileSystem,\n createDefaultCoreModule,\n createDefaultSharedCoreModule,\n inject\n} from \"langium\";\n\n// src/language/info/tokenBuilder.ts\nvar InfoTokenBuilder = class extends AbstractMermaidTokenBuilder {\n static {\n __name(this, \"InfoTokenBuilder\");\n }\n constructor() {\n super([\"info\", \"showInfo\"]);\n }\n};\n\n// src/language/info/module.ts\nvar InfoModule = {\n parser: {\n TokenBuilder: /* @__PURE__ */ __name(() => new InfoTokenBuilder(), \"TokenBuilder\"),\n ValueConverter: /* @__PURE__ */ __name(() => new CommonValueConverter(), \"ValueConverter\")\n }\n};\nfunction createInfoServices(context = EmptyFileSystem) {\n const shared = inject(\n createDefaultSharedCoreModule(context),\n MermaidGeneratedSharedModule\n );\n const Info = inject(\n createDefaultCoreModule({ shared }),\n InfoGeneratedModule,\n InfoModule\n );\n shared.ServiceRegistry.register(Info);\n return { shared, Info };\n}\n__name(createInfoServices, \"createInfoServices\");\n\nexport {\n InfoModule,\n createInfoServices\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 { 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"],"names":["cc","char","charCodeAt","insertToSet","item","set","Array","isArray","forEach","subItem","push","addFlag","flagObj","flagKey","ASSERT_EXISTS","obj","undefined","Error","ASSERT_NEVER_REACH_HERE","isCharacter","digitsCharCodes","i","wordCharCodes","concat","whitespaceCodes","hexDigitPattern","decimalPattern","decimalPatternNoZero","RegExpParser","constructor","idx","input","groupIdx","saveState","this","restoreState","newState","pattern","consumeChar","value","disjunction","flags","type","loc","begin","end","length","global","ignoreCase","multiLine","unicode","sticky","isRegExpFlag","popChar","substring","alts","alternative","peekChar","terms","isTerm","term","isAssertion","assertion","atom","quantifier","range","isBacktracking","arguments","atLeast","atMost","Infinity","integerIncludingZero","isDigit","greedy","dotAll","atomEscape","characterClass","group","isPatternCharacter","patternCharacter","isQuantifier","complement","decimalEscapeAtom","characterClassEscape","controlEscapeAtom","controlLetterEscapeAtom","nulCharacterAtom","hexEscapeSequenceAtom","regExpUnicodeEscapeSequenceAtom","identityEscapeAtom","positiveInteger","escapeCode","letter","test","toUpperCase","parseHexDigits","classPatternCharacterAtom","isClassAtom","from","classAtom","isRangeDash","to","classEscape","capturing","groupAst","number","parseInt","nextChar","howMuch","isAtom","prevState","e","howMany","hexString","hexChar","BaseRegExpVisitor","visitChildren","node","key","child","hasOwnProperty","visit","subChild","visitPattern","visitFlags","visitDisjunction","visitAlternative","visitStartAnchor","visitEndAnchor","visitWordBoundary","visitNonWordBoundary","visitLookahead","visitNegativeLookahead","visitCharacter","visitSet","visitGroup","visitGroupBackReference","visitQuantifier","Object","prototype","object","call","path","hasPath","baseHas","findIndexFunc","collection","predicate","fromIndex","iterable","isArrayLike","iteratee","baseIteratee","keys","index","nativeMax","Math","max","createFind","array","toInteger","baseFindIndex","customizer","isObject","castPath","lastIndex","nested","toKey","newValue","objValue","isIndex","assignValue","paths","result","baseGet","baseSet","AbstractRule","AbstractType","Condition","TypeDefinition","ValueLiteral","AbstractElement","isAbstractElement","reflection","isInstance","ArrayLiteral","ArrayType","BooleanLiteral","isBooleanLiteral","Conjunction","isConjunction","Disjunction","isDisjunction","Grammar","GrammarImport","InferredType","isInferredType","Interface","isInterface","NamedArgument","Negation","isNegation","NumberLiteral","Parameter","ParameterReference","isParameterReference","ParserRule","isParserRule","ReferenceType","ReturnType","isReturnType","SimpleType","isSimpleType","StringLiteral","TerminalRule","isTerminalRule","Type","isType","TypeAttribute","UnionType","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","getAllTypes","computeIsSubtype","subtype","supertype","isSubtype","getReferenceType","refInfo","referenceId","container","$type","property","getTypeMetaData","name","properties","defaultValue","getAllReachableRules","grammar","allTerminals","ruleNames","Set","entryRule","rules","find","ast","entry","getEntryRule","topMostRules","filter","hidden","getHiddenRules","rule","ruleDfs","has","add","visitedSet","streamAllContents","refRule","ref","getCrossReferenceTerminal","crossRef","terminal","nameAssigment","findNameAssignment","isCommentTerminal","terminalRule","isWhitespace","terminalRegex","findNodesForProperty","findNodesForPropertyInternal","astNode","findNodeForProperty","nodes","min","element","first","nodeFeature","getContainerOfType","grammarSource","feature","isCompositeCstNode","content","flatMap","findNodeForKeyword","keyword","findNodesForKeywordInternal","treeIterator","streamCst","iterator","keywordNodes","next","done","childNode","prune","findAssignment","cstNode","_a","assignment","startNode","$container","assertUnreachable","findNameAssignmentInternal","Map","cache","go","refType","childAssignment","get","toLowerCase","typeRef","isDataTypeRule","isDataTypeRuleInternal","visited","Boolean","definition","getExplicitRuleType","inferredType","dataType","returnType","getTypeName","actionType","action","getActionType","getRuleType","_b","_c","s","u","source","abstractElementToRegex","flagText","entries","_ref","map","_ref2","join","RegExp","WILDCARD","withCardinality","alternatives","elements","cardinality","lookahead","right","keywordToRegex","left","wrap","characterRangeToRegex","negate","until","lastSlash","regex","lastIndexOf","regexFlags","includes","escapeRegExp","options","ArchitectureTokenBuilder","AbstractMermaidTokenBuilder","__name","super","ArchitectureValueConverter","AbstractMermaidValueConverter","runCustomConverter","_cstNode","replace","trim","ArchitectureModule","parser","TokenBuilder","ValueConverter","createArchitectureServices","context","EmptyFileSystem","shared","inject","createDefaultSharedCoreModule","MermaidGeneratedSharedModule","Architecture","createDefaultCoreModule","ArchitectureGeneratedModule","ServiceRegistry","register","minimalGrammarModule","LanguageMetaData","caseInsensitive","fileExtensions","languageId","minimalSharedGrammarModule","AstReflection","loadGrammarFromJson","json","services","createMinimalGrammarServices","serializer","JsonSerializer","deserialize","workspace","LangiumDocumentFactory","fromModel","URI","parse","__defProp","defineProperty","target","configurable","Statement","Axis","Branch","Checkout","CherryPicking","Commit","Common","Curve","Edge","Entry","GitGraph","Info","Junction","Merge","Option","Packet","PacketBlock","Pie","PieSection","loadedInfoGrammar","loadedPacketGrammar","loadedPieGrammar","loadedArchitectureGrammar","loadedGitGraphGrammar","loadedRadarGrammar","Radar","Service","Direction","MermaidAstReflection","InfoGrammar","PacketGrammar","PieGrammar","ArchitectureGrammar","GitGraphGrammar","RadarGrammar","InfoLanguageMetaData","mode","PacketLanguageMetaData","PieLanguageMetaData","ArchitectureLanguageMetaData","GitGraphLanguageMetaData","RadarLanguageMetaData","InfoGeneratedModule","PacketGeneratedModule","PieGeneratedModule","GitGraphGeneratedModule","RadarGeneratedModule","rulesRegexes","ACC_DESCR","ACC_TITLE","TITLE","DefaultValueConverter","runConverter","runCommonConverter","match","exec","CommonValueConverter","_rule","_input","DefaultTokenBuilder","keywords","buildKeywordTokens","terminalTokens","tokenTypes","tokenType","PATTERN","toString","_ral","RAL","exports","install","ral","buildATNKey","occurrence","AbstractTransition","isEpsilon","AtomTransition","EpsilonTransition","RuleTransition","ruleStart","followState","createATN","atn","decisionMap","decisionStates","ruleToStartState","ruleToStopState","states","ruleLength","start","stop","createRuleStartAndStopATNStates","ruleBlock","block","buildRuleHandle","production","Terminal","tokenRef","terminalType","NonTerminal","currentRule","nonTerminal","referencedRule","addTransition","ruleRef","Alternation","alternation","defineDecisionState","handle","makeAlts","option","optional","epsilon","Repetition","repetition","starState","star","RepetitionWithSeparator","sep","separator","repetitionSep","RepetitionMandatory","plusState","plus","repetitionMandatory","RepetitionMandatoryWithSeparator","repetitionMandatorySep","handles","altsLength","transition","transitions","isRuleTransition","ruleTransition","removeState","last","makeBlock","blkStart","blkEnd","loop","loopback","loopEnd","state","decision","_len","_key","alt","getProdType","a","b","partial","t","assign","epsilonOnlyTransitions","nextTokenWithinRule","stateNumber","splice","indexOf","DFA_ERROR","ATNConfigSet","configs","size","finalize","config","getATNConfigKey","k","stack","baseUniq","createDFACache","startState","predicateSet","existing","atnStartState","PredicateSet","predicates","is","EMPTY_PREDICATES","LLStarLookaheadStrategy","LLkLookaheadStrategy","logging","message","console","log","initialize","dfas","decisionLength","decisionToDFA","initATNSimulator","validateAmbiguousAlternationAlternatives","validateEmptyOrAlternatives","buildLookaheadForAlternation","prodOccurrence","hasPredicates","dynamicTokensEnabled","decisionIndex","partialAlts","getLookaheadPaths","maxLookahead","prodType","currAlt","isLL1Sequence","choiceToAlt","reduce","currTokType","tokenTypeIdx","categoryMatches","currExtendingType","orAlts","nextToken","LA","prediction","gate","GATE","adaptivePredict","buildLookaheadForOptional","g","singleTokensTypes","flatten","isEmpty","expectedTokenUniqueKey","sequences","allowEmpty","fullSet","altSet","tokType","indices","dfaCaches","dfa","addDFAState","newDFAState","computeStartState","performLookahead","apply","s0","previousD","d","token","edges","computeLookaheadTarget","buildAdaptivePredictError","isAcceptState","reach","intermediate","skippedStopStates","c","transitionLength","getReachableTarget","closure","hasConfigInRuleStopState","computeReachSet","addDFAEdge","predictedAlt","getUniqueAlt","uniqueAlt","allConfigsInRuleStopStates","altSets","configToAlts","getConflictingAltSets","values","hasConflictingAltSet","hasStateAssociatedWithOneAlt","hasConflictTerminatingPrediction","reportLookaheadAmbiguity","ambiguityIndices","prefixPath","atnState","pathMsg","currtok","tokenLabel","currMessage","prod","getProductionDslName","topLevelRule","buildAmbiguityError","previous","current","nextTransitions","actualToken","possibleTokenTypes","uniqBy","tokenPath","tokenMatcher","mapKey","numberOfTransitions","p","atnStack","pop","getEpsilonTarget","DocumentUri","integer","uinteger","Position","Range","Location","LocationLink","Color","ColorInformation","ColorPresentation","FoldingRangeKind","FoldingRange","DiagnosticRelatedInformation","DiagnosticSeverity","DiagnosticTag","CodeDescription","Diagnostic","Command","TextEdit","ChangeAnnotation","ChangeAnnotationIdentifier","AnnotatedTextEdit","TextDocumentEdit","CreateFile","RenameFile","DeleteFile","WorkspaceEdit","TextDocumentIdentifier","VersionedTextDocumentIdentifier","OptionalVersionedTextDocumentIdentifier","TextDocumentItem","MarkupKind","MarkupContent","CompletionItemKind","InsertTextFormat","CompletionItemTag","InsertReplaceEdit","InsertTextMode","CompletionItemLabelDetails","CompletionItem","CompletionList","MarkedString","Hover","ParameterInformation","SignatureInformation","DocumentHighlightKind","DocumentHighlight","SymbolKind","SymbolTag","SymbolInformation","WorkspaceSymbol","DocumentSymbol","CodeActionKind","CodeActionTriggerKind","CodeActionContext","CodeAction","CodeLens","FormattingOptions","DocumentLink","SelectionRange","SemanticTokenTypes","SemanticTokenModifiers","SemanticTokens","InlineValueText","InlineValueVariableLookup","InlineValueEvaluatableExpression","InlineValueContext","InlayHintKind","InlayHintLabelPart","InlayHint","StringValue","InlineCompletionItem","InlineCompletionList","InlineCompletionTriggerKind","SelectedCompletionInfo","InlineCompletionContext","WorkspaceFolder","MIN_VALUE","MAX_VALUE","create","line","character","Number","candidate","Is","objectLiteral","one","two","three","four","uri","string","targetUri","targetRange","targetSelectionRange","originSelectionRange","red","green","blue","alpha","numberRange","color","label","textEdit","additionalTextEdits","typedArray","Comment","Imports","Region","startLine","endLine","startCharacter","endCharacter","kind","collapsedText","defined","location","Warning","Information","Hint","Unnecessary","Deprecated","href","severity","code","relatedInformation","codeDescription","title","command","args","newText","insert","position","del","needsConfirmation","description","boolean","annotation","annotationId","textDocument","edits","overwrite","ignoreIfExists","oldUri","newUri","recursive","ignoreIfNotExists","changes","documentChanges","every","change","version","text","PlainText","Markdown","Text","Method","Function","Constructor","Field","Variable","Class","Module","Property","Unit","Value","Enum","Snippet","File","Reference","Folder","EnumMember","Constant","Struct","Event","Operator","TypeParameter","asIs","adjustIndentation","detail","items","isIncomplete","fromPlainText","plainText","language","contents","documentation","_len2","parameters","_key2","Read","Write","Namespace","Package","String","Key","Null","containerName","selectionRange","children","deprecated","tags","Empty","QuickFix","Refactor","RefactorExtract","RefactorInline","RefactorRewrite","Source","SourceOrganizeImports","SourceFixAll","Invoked","Automatic","diagnostics","only","triggerKind","kindOrCommandOrEdit","checkKind","edit","isPreferred","data","tabSize","insertSpaces","parent","resultId","variableName","caseSensitiveLookup","expression","frameId","stoppedLocation","tooltip","textEdits","paddingLeft","paddingRight","createSnippet","insertText","filterText","selectedCompletionInfo","TextDocument","mergeSort","compare","slice","leftIdx","rightIdx","ret","FullTextDocument","lineCount","func","getText","positionAt","offsetAt","applyEdits","document","sortedEdits","diff","lastModifiedOffset","startOffset","endOffset","_uri","_languageId","_version","_content","_lineOffsets","update","event","getLineOffsets","lineOffsets","isLineStart","ch","charAt","offset","low","high","mid","floor","lineOffset","nextLineOffset","check","CstNodeBuilder","nodeStack","rootNode","buildRootNode","RootCstNodeImpl","root","buildCompositeNode","compositeNode","CompositeCstNodeImpl","buildLeafNode","leafNode","LeafCstNodeImpl","image","tokenToRange","removeNode","addHiddenNodes","tokens","added","unshift","construct","$cstNode","AbstractCstNode","_astNode","fullText","_offset","_length","_hidden","_tokenType","_range","CstNodeContainer","firstNonHiddenNode","lastNonHiddenNode","firstNode","lastNode","_rangeCache","firstRange","lastRange","setPrototypeOf","addParents","count","_len3","_key3","_text","DatatypeSymbol","Symbol","isDataTypeNode","withRuleSuffix","endsWith","AbstractLangiumParser","_unorderedGroups","allRules","lexer","Lexer","wrapper","ChevrotainWrapper","ParserConfig","skipValidations","errorMessageProvider","ParserErrorMessageProvider","choices","wrapOr","callback","wrapOption","many","wrapMany","atLeastOne","wrapAtLeastOne","getRule","isRecording","IS_RECORDING","unorderedGroups","getRuleStack","RULE_STACK","wrapSelfAnalysis","LangiumParser","nodeBuilder","assignmentMap","linker","references","Linker","converter","astReflection","impl","computeRuleType","ruleMethod","DEFINE_RULE","startImplementation","bind","mainRule","fragment","explicit","lexerResult","tokenize","clear","lexerErrors","errors","lexerReport","report","parserErrors","implementation","createNode","err","extractHiddenTokens","hiddenTokens","consume","wrapConsume","isValidToken","isCrossRef","getAssignment","convertedValue","convert","operator","isInsertedInRecovery","isNaN","subrule","subruleResult","wrapSubrule","performSubruleAssignment","newItem","assignWithoutOverride","linkContentToContainer","assignMandatoryProperties","buildReference","existingValue","targetCstNode","definitionErrors","AbstractParserErrorMessageProvider","buildMismatchTokenMessage","defaultParserErrorProvider","buildNotAllInputParsedMessage","buildNoViableAltMessage","buildEarlyExitMessage","LangiumParserErrorMessageProvider","expected","actual","LABEL","firstRedundant","LangiumCompletionParser","elementStack","lastElementStack","nextTokenIndex","stackSize","resetState","tokenIndex","keepStackSize","resetStackSize","removeUnexpectedElements","currIdx","before","after","defaultConfig","recoveryEnabled","nodeLocationTracking","EmbeddedActionsParser","useDefaultLookahead","lookaheadStrategy","RECORDING_PHASE","RULE","performSelfAnalysis","ARGS","or","createParser","parserContext","reachable","parserRules","stream","ctx","buildElement","buildRules","method","ignoreGuard","buildKeyword","buildAction","buildCrossReference","ruleCall","namedArgs","buildPredicate","ruleArgs","ruleTarget","buildRuleCallPredicate","getToken","ErrorWithLocation","$refText","buildRuleCall","methods","predicatedMethod","ALT","guard","getGuardCondition","buildAlternatives","orIdx","idFunc","lParser","groupState","trackedAlternatives","wrapped","delete","buildUnorderedGroup","buildGroup","EOF","condition","parameter","true","guardCondition","assignTerminal","EMPTY_ALT","DEF","ruleName","getRuleName","createLangiumParser","prepareLangiumParser","lastTick","globalInterruptionPeriod","OperationCancelled","isOperationCancelled","async","interruptAndCheck","CancellationToken","None","performance","now","Promise","resolve","setImmediate","setTimeout","isCancellationRequested","Deferred","promise","reject","arg","isIncremental","getWellformedRange","addedLineOffsets","computeLineOffsets","len","isFull","ensureBeforeEOL","isEOL","rangeLength","isAtLineStart","textOffset","getWellformedEdit","spans","substr","DocumentState","DefaultLangiumDocumentFactory","serviceRegistry","textDocuments","TextDocuments","fileSystemProvider","FileSystemProvider","fromUri","cancellationToken","readFile","createAsync","fromTextDocument","fromString","model","$model","parseResult","createLangiumDocument","cancelToken","parseAsync","Parsed","textDocumentGetter","createTextDocumentGetter","$document","oldText","getServices","AsyncParser","textDoc","DefaultLangiumDocuments","documentMap","langiumDocumentFactory","all","addDocument","uriString","getDocument","getOrCreateDocument","createDocument","then","hasDocument","invalidateDocument","langiumDoc","unlink","Changed","precomputedScopes","deleteDocument","ref_resolving","DefaultLinker","langiumDocuments","LangiumDocuments","scopeProvider","ScopeProvider","astNodeLocator","AstNodeLocator","link","streamAst","streamReferences","doLink","reference","getCandidate","isLinkingError","_nodeDescription","documentUri","linkedNode","loadAstNode","createLinkingError","error","errorMessage","getScope","getElement","refNode","refText","$refNode","isAstNode","isAstNodeDescription","findRootNode","refData","getLinkedNode","ComputedScopes","descr","getAstNodePath","$nodeDescription","nodeDescription","doc","getAstNode","targetDescription","warn","referenceType","DefaultNameProvider","getName","isNamed","getNameNode","UriUtils","basename","Utils","dirname","extname","joinPath","resolvePath","equals","relative","fromPath","toPath","fromParts","split","toParts","repeat","normalize","DefaultReferences","nameProvider","NameProvider","IndexManager","nodeLocator","findDeclaration","sourceCstNode","nodeElem","isReference","nameNode","isChildNode","findDeclarationNode","targetNode","findReferences","refs","includeDeclaration","getReferenceToSelf","indexReferences","findAllReferences","sourceUri","sourcePath","targetPath","segment","toDocumentSegment","local","MultiMap","Reduction","sum","addAll","callbackfn","flat","entriesGroupedByKey","BiMap","inverse","getKey","DefaultScopeComputation","descriptions","AstNodeDescriptionProvider","computeExports","computeExportsForNode","parentNode","streamContents","exportNode","createDescription","computeLocalScopes","scopes","processNode","StreamScope","outerScope","getAllElements","MapScope","localName","elementStream","DisposableCache","toDispose","isDisposed","onDispose","disposable","dispose","throwIfDisposed","SimpleCache","provider","ContextCache","contextKey","cacheForContext","contextCache","documentCache","WorkspaceCache","sharedServices","DocumentBuilder","onBuildPhase","onUpdate","_changed","deleted","DefaultScopeProvider","indexManager","globalScopeCache","precomputed","currentNode","allDescriptions","desc","getGlobalScope","createScope","createScopeForNodes","nonNullable","_context","allElements","isIntermediateReference","DefaultJsonSerializer","ignoreProperties","commentProvider","CommentProvider","serialize","serializeOptions","specificReplacer","replacer","defaultReplacer","currentDocument","JSON","stringify","space","deserializeOptions","linkNode","sourceText","textRegions","comments","uriConverter","refValue","targetDocument","$ref","$error","addAstNodeRegionWithAssignmentsTo","$textRegion","documentURI","$sourceText","_d","comment","getComment","$comment","createDocumentSegment","assignments","startsWith","propertyAssignments","containerProperty","containerIndex","propertyName","reviveReference","mutable","$containerProperty","$containerIndex","getRefNode","fragmentIndex","DefaultServiceRegistry","fileExtensionMap","languageIdMap","ext","singleton","hasServices","diagnosticData","ValidationCategory","DocumentValidator","ValidationRegistry","entriesBefore","entriesAfter","checksRecord","thisObj","category","callbacks","wrapValidationException","addEntry","accept","handleException","functionality","messageContext","getAllSubTypes","getChecks","categories","checks","registerBeforeDocument","checkBefore","wrapPreparationException","registerAfterDocument","checkAfter","checksBefore","checksAfter","DefaultDocumentValidator","validationRegistry","validation","metadata","validateDocument","processLexingErrors","stopAfterLexingErrors","some","LexingError","processParsingErrors","stopAfterParsingErrors","ParsingError","processLinkingErrors","stopAfterLinkingErrors","LinkingError","validateAst","_options","lexerDiagnostics","lexerDiagnostic","diagnostic","toDiagnosticSeverity","column","toDiagnosticData","getSource","parserError","previousToken","endColumn","linkingError","info","containerType","toDiagnostic","validationItems","acceptor","validateAstBefore","validateAstNodes","validateAstAfter","getDiagnosticRange","LexingWarning","LexingInfo","LexingHint","DefaultAstNodeDescriptionProvider","nameNodeSegment","nameSegmentGetter","nameSegment","selectionSegment","DefaultReferenceDescriptionProvider","createDescriptions","targetNodeDescr","refCstNode","docUri","DefaultAstNodeLocator","segmentSeparator","indexSeparator","containerPath","newSegment","getPathSegment","previousValue","currentValue","propertyIndex","arrayIndex","Disposable","DefaultConfigurationProvider","_ready","settings","workspaceConfig","onConfigurationSectionUpdateEmitter","Emitter","ready","params","capabilities","configuration","initialized","languages","section","lang","toSectionName","fetchConfiguration","configToUpdate","conf","updateSectionConfiguration","updateConfiguration","fire","getConfiguration","sectionName","onConfigurationSectionUpdate","DefaultDocumentBuilder","updateBuildOptions","updateListeners","buildPhaseListeners","documentPhaseListeners","buildState","documentBuildWaiters","currentState","build","documents","Validated","IndexedReferences","previousCategories","validationChecks","completed","emitUpdate","buildDocuments","changed","deletedUri","remove","changedUri","newDocument","allChangedUris","toSet","shouldRelink","rebuildDocuments","sortDocuments","Linked","toArray","listener","hasTextDocument","changedUris","isAffected","prepareBuild","runCancelable","IndexedContent","updateContent","scopeComputation","ScopeComputation","updateReferences","toBeValidated","shouldValidate","validate","targetState","filtered","notifyDocumentPhase","targetStateDocs","notifyBuildPhase","onDocumentPhase","waitUntil","uriOrToken","buildDisposable","cancelDisposable","onCancellationRequested","listenersCopy","getBuildOptions","validator","validationSetting","newCategories","DefaultIndexManager","symbolIndex","symbolByTypeIndex","referenceIndex","astNodePath","targetDocUri","docRefs","refDescr","nodeType","uris","documentUris","getFileDescriptions","indexData","ReferenceDescriptionProvider","DefaultWorkspaceManager","initialBuildOptions","documentBuilder","mutex","WorkspaceLock","workspaceFolders","folders","_params","write","initializeWorkspace","performStartup","collector","loadAdditionalDocuments","wf","getRootFolder","traverseFolder","_folders","_collector","workspaceFolder","folderPath","readDirectory","includeEntry","isDirectory","isFile","_workspaceFolder","DefaultLexerErrorMessageProvider","buildUnexpectedCharactersMessage","defaultLexerErrorProvider","buildUnableToPopLexerModeMessage","DefaultLexer","LexerErrorMessageProvider","tokenBuilder","buildTokens","toTokenTypeDictionary","lexerTokens","isTokenTypeDictionary","chevrotainLexer","ChevrotainLexer","positionTracking","chevrotainResult","groups","flushLexingReport","isIMultiModeLexerDefinition","modes","res","tokenVocabulary","isTokenTypeArray","parseJSDoc","opts","currentLine","currentCharacter","lines","lastCharacter","skipWhitespace","tagRegex","tagMatch","fullMatch","rest","inlineTagMatches","matchAll","inlineTagRegex","buildInlineTokens","getLines","normalizeOptions","startPosition","JSDocCommentImpl","parseJSDocElement","parseJSDocComment","NEWLINE_REGEXP","lineIndex","characterIndex","matchIndex","startContent","tagName","endContent","nonWhitespaceRegex","whitespaceEndRegex","parseJSDocTag","parseJSDocText","JSDocLineImpl","inlines","appendEmptyLine","firstToken","lastToken","parseJSDocInline","JSDocTextImpl","parseJSDocLine","inline","tagToken","docLine","JSDocTagImpl","normalizeOption","escaped","getTag","getAllTags","getTags","fillNewlines","toMarkdown","renderTag","toMarkdownDefault","rendered","tag","display","displayStart","renderedLink","renderLink","renderLinkDefault","renderInlineTag","marker","JSDocDocumentationProvider","getDocumentation","normalizedOptions","firstRegex","lastRegex","isJSDoc","documentationLinkRenderer","documentationTagRenderer","findNameInPrecomputedScopes","findNameInGlobalScope","with","_node","_tag","DefaultCommentProvider","grammarConfig","GrammarConfig","isAstNodeWithComment","findCommentNode","multilineCommentRules","DefaultAsyncParser","syncParser","_cancelToken","DefaultWorkspaceLock","previousTokenSource","CancellationTokenSource","writeQueue","readQueue","cancelWrite","tokenSource","enqueue","read","queue","deferred","performNextOperation","shift","cancel","DefaultHydrator","grammarElementIdMap","tokenTypeIdMap","dehydrate","dehydrateLexerReport","dehydrateAstNode","createDehyrationContext","astNodes","cstNodes","dehydrateCstNode","arr","dehydrateReference","isRootCstNode","getGrammarElementId","isLeafCstNode","startColumn","hydrate","createHydrationContext","hydrateCstNode","hydrateAstNode","cst","hydrateCstLeafNode","setParent","hydrateReference","num","cstNodeObj","getGrammarElement","hydrated","getTokenType","createGrammarElementIdMap","id","DocumentationProvider","isMultilineComment","nameRegexp","DefaultNameRegexp","createGrammarConfig","CompletionParser","createCompletionParser","References","Hydrator","WorkspaceManager","ConfigurationProvider","baseFlatten","RadarTokenBuilder","RadarModule","createRadarServices","comparator","computed","isSymbol","regexpParser","TerminalRegExpVisitor","isStarting","endRegexpStack","multiline","endRegex","reset","startRegexp","fromCharCode","escapedChar","visitor","regexp","whitespaceCharacters","ws","getCaseInsensitivePattern","partialMatches","re","process","tmp","appendRaw","nbChars","appendOptional","partialRegExp","RangeComparison","TreeStreamImpl","includeRoot","inRange","comparison","Before","After","startInside","endInside","Inside","OverlapBack","OverlapFront","Outside","compareRange","commentNames","getPreviousNode","isCommentNode","findIndex","baseClone","reWhitespace","reTrimStart","trimmedEndIndex","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","other","valueOf","baseTrim","isBinary","INFINITY","toNumber","GitGraphTokenBuilder","GitGraphModule","createGitGraphServices","isObjectLike","baseGetTag","ral_1","require","events_1","freeze","Cancelled","shortcutEvent","default","timer","MutableToken","_isCancelled","_emitter","_token","EmptyFileSystemProvider","StreamImpl","startFn","nextFn","toMap","keyFn","valueFn","entryStream","firstDone","DONE_RESULT","addSeparator","searchElement","initialValue","reduceRight","recursiveReduce","mapped","isIterable","depth","head","tail","skipCount","limit","maxSize","distinct","by","internalState","exclude","otherKeySet","ownKey","EMPTY_STREAM","collections","collIndex","arrIndex","iterators","pruned","product","convertInt","convertString","convertID","convertNumber","convertBoolean","convertBigint","convertDate","convertEscapeCharacter","BigInt","Date","baseEach","objectProto","baseRest","sources","isIterateeCall","props","keysIn","propsIndex","propsLength","eq","subtypes","allSubtypes","allTypes","types","possibleSubType","parsers","initializers","createInfoServices","createInfoServices2","packet","createPacketServices","createPacketServices2","pie","createPieServices","createPieServices2","architecture","createArchitectureServices2","gitGraph","createGitGraphServices2","radar","createRadarServices2","diagramType","initializer","MermaidParseError","module1","module2","module3","module4","module5","module6","module7","module8","module9","_inject","_merge","merge","m1","m2","isProxy","module","injector","proxy","Proxy","deleteProperty","prop","_resolve","getOwnPropertyDescriptor","_","ownKeys","getOwnPropertyNames","__requested__","cause","value2","value1","toFinite","remainder","toFastProperties","toBecomeFast","FakeConstructor","fakeInstance","fakeAccess","bar","n","baseSlice","createAssigner","isPrototype","copyObject","arrayMap","getAllKeysIn","basePickBy","nodeIsRegExp","nodeUtil","isRegExp","baseUnary","baseIsRegExp","isString","AbstractProduction","_definition","pickBy","v","Rule","orgText","Alternative","ignoreAmbiguities","serializeProduction","convertDefinition","serializedNonTerminal","nonTerminalName","serializedTerminal","terminalLabel","GAstVisitor","nodeAny","visitNonTerminal","visitOption","visitRepetitionMandatory","visitRepetitionMandatoryWithSeparator","visitRepetitionWithSeparator","visitRepetition","visitAlternation","visitTerminal","visitRule","arraySome","baseSome","baseIndexOf","arrayEvery","baseEvery","isOptionalProd","alreadyVisited","subProd","RestWalker","walk","prevRest","currRest","drop","walkProdRef","walkTerminal","walkFlat","walkOption","walkAtLeastOne","walkAtLeastOneSep","walkManySep","walkMany","walkOr","refProd","flatProd","fullOrRest","optionProd","atLeastOneProd","fullAtLeastOneRest","atLeastOneSepProd","fullAtLeastOneSepRest","restForRepetitionWithSeparator","manyProd","fullManyRest","manySepProd","fullManySepRest","orProd","prodWrapper","repSepProd","isSequenceProd","firstSet","seq","currSubProd","nextSubProdIdx","hasInnerProdsRemaining","isLastInnerProdOptional","uniq","firstForSequence","isBranchingProd","allAlternativesFirsts","innerProd","firstForBranching","IN","ResyncFollowsWalker","topProd","follows","startWalking","followName","inner","occurenceInParent","fullRest","t_in_topProd_follows","TypeError","arrayFilter","baseFilter","arrayIncludes","isCommon","valuesLength","arrayIncludesWith","cacheHas","SetCache","outer","valuesIndex","isArrayLikeObject","baseDifference","resIndex","PRINT_ERROR","msg","PRINT_WARNING","regExpAstCache","regExpParser","getRegExpAst","regExp","regExpStr","regExpAst","complementErrorMessage","failedOptimizationPrefixMsg","getOptimizedStartCodesIndices","ensureOptimizations","firstCharOptimizedIndices","msgSuffix","addOptimizedIdxToResult","rangeCode","minOptimizationVal","minUnOptVal","maxUnOptVal","minOptIdx","charCodeToOptimizedIndex","maxOptIdx","currOptIdx","isOptionalQuantifier","isWholeOptional","optimizedCharIdx","upperChar","lowerChar","handleIgnoreCase","findCode","setNode","targetCharCodes","codeOrRange","targetCode","CharCodeFinder","found","canMatchCharCode","charCodes","charCodeFinder","DEFAULT_MODE","MODES","SUPPORT_STICKY","analyzeTokenTypes","tracer","defaults","useSticky","debug","safeMode","lineTerminatorCharacters","onlyRelevantTypes","charCodeToOptimizedIdxMap","initCharCodeToOptimizedIndexMap","currType","NA","allTransformedPatterns","patternIdxToType","patternIdxToGroup","patternIdxToLongerAltIdxArr","patternIdxToPushMode","patternIdxToPopMode","patternIdxToCanLineTerminator","patternIdxToIsCustom","patternIdxToShort","emptyGroups","patternIdxToConfig","hasCustom","currPattern","regExpSource","addStickyFlag","addStartOfInput","isFunction","escapedRegExpString","wrappedRegExp","clazz","groupName","GROUP","SKIPPED","isUndefined","longerAltType","LONGER_ALT","PUSH_MODE","lineTerminatorCharCodes","getCharCodes","LINE_BREAKS","checkLineBreaksIssues","isCustomPattern","isShortPattern","acc","x","longerAlt","canLineTerminator","isCustom","short","canBeOptimized","charCodeToPatternIdxToConfig","optimizedIdx","addToMapOfArrays","START_CHARS_HINT","lastOptimizedIdx","charOrInt","currOptimizedIdx","optimizedCodes","validatePatterns","validModesNames","missingResult","tokenTypesWithMissingPattern","LexerDefinitionErrorType","MISSING_PATTERN","valid","difference","findMissingPatterns","invalidResult","tokenTypesWithInvalidPattern","INVALID_PATTERN","findInvalidPatterns","validTokenTypes","withRegExpPatterns","EndAnchorFinder","invalidRegex","regexpAst","endAnchorVisitor","end_of_input","EOI_ANCHOR_FOUND","findEndOfInputAnchor","StartAnchorFinder","startAnchorVisitor","start_of_input","SOI_ANCHOR_FOUND","findStartOfInputAnchor","invalidFlags","UNSUPPORTED_FLAGS_FOUND","findUnsupportedFlags","identicalPatterns","outerType","innerType","compact","duplicatePatterns","currIdenticalSet","setOfIdentical","tokenTypeNames","DUPLICATE_PATTERNS_FOUND","findDuplicatePatterns","matchesEmptyString","EMPTY_MATCH_PATTERN","findEmptyMatchRegExps","validateRegExpPattern","invalidTypes","INVALID_GROUP_TYPE_FOUND","findInvalidGroupType","validModes","invalidModes","PUSH_MODE_DOES_NOT_EXIST","findModesThatDoNotExist","canBeTested","str","metaChars","noMetaChar","testIdx","regExpArray","testTokenType","UNREACHABLE_PATTERN","findUnreachablePatterns","performWarningRuntimeChecks","lexerDefinition","trackLines","warnings","hasAnyLineBreak","allTokenTypes","concreteTokenTypes","terminatorCharCodes","currIssue","details","issue","IDENTIFY_TERMINATOR","errMsg","CUSTOM_LINE_BREAK","buildLineBreakIssueMessage","warningDescriptor","NO_LINE_BREAKS_FLAGS","LineTerminatorOptimizedTester","charsOrCodes","numOrString","charCode","getTime","val","time","tokenStructuredMatcher","tokInstance","tokConstructor","instanceType","isParent","categoryMatchesMap","tokenStructuredMatcherNoCategories","tokenShortNameIdx","tokenIdxToClass","augmentTokenTypes","tokenTypesAndParents","clone","searching","CATEGORIES","expandCategories","hasShortKeyProperty","hasCategoriesProperty","hasExtendingTokensTypesMapProperty","assignTokenDefaultProps","singleAssignCategoriesToksMap","assignCategoriesMapProp","assignCategoriesTokensProp","nextNode","pathNode","nextCategory","newPath","isTokenType","DEFAULT_LEXER_CONFIG","deferDefinitionErrorsHandling","lineTerminatorsPattern","traceInitPerf","lexerDefinitionErrors","lexerDefinitionWarning","trackStartLines","trackEndLines","canModeBeOptimized","TRACE_INIT","phaseDesc","phaseImpl","traceInitIndent","indent","traceInitMaxIdent","traceMethod","traceInitVal","actualDefinition","hasOnlySingleMode","defaultMode","MULTI_MODE_LEXER_WITHOUT_DEFAULT_MODE","MULTI_MODE_LEXER_WITHOUT_MODES_PROPERTY","MULTI_MODE_LEXER_DEFAULT_MODE_VALUE_DOES_NOT_EXIST","currModeValue","currModeName","LEXER_DEFINITION_CANNOT_CONTAIN_UNDEFINED","currLongerAlt","MULTI_MODE_LEXER_LONGER_ALT_NOT_IN_CURRENT_MODE","performRuntimeChecks","allModeNames","currModDef","currModName","currAnalyzeResult","allErrMessagesString","chopInput","identity","matchWithTest","updateLastIndex","noop","matchWithExec","handleModes","computeNewColumn","updateTokenEndLineColumnLocation","createTokenInstance","createFullToken","createStartOnlyToken","createOffsetOnlyToken","addToken","addTokenUsingPush","handlePayload","handlePayloadWithCustom","addTokenUsingMemberAccess","handlePayloadNoCustom","unOptimizedModes","cannotBeOptimized","modeName","initialMode","tokenizeInternal","j","matchAltImage","matchedImage","payload","altPayload","imageLength","newToken","errLength","orgLength","matchedTokensIndex","guessedNumberOfTokens","matchedTokens","clonedResult","groupKeys","currKey","currGroupValue","cloneEmptyGroups","lineTerminatorPattern","currModePatternsLength","currCharCodeToPatternIdxToConfig","modeStack","emptyArray","getPossiblePatterns","getPossiblePatternsSlow","getPossiblePatternsOptimized","possiblePatterns","pop_mode","popToken","newMode","modeCanBeOptimized","push_mode","currConfig","nextCharCode","chosenPatternIdxToConfig","chosenPatternsLength","singleCharCode","longerAltLength","longerAltConfig","longerAltPattern","foundTerminator","lastLTEndOffset","numOfLTsInMatch","errorStartOffset","errorLine","errorColumn","foundResyncPoint","pushMode","newLastIndex","lastLTIdx","lastCharIsLT","fixForEndingInLT","oldColumn","tokenVector","tokenToAdd","hasTokenLabel","PARENT","POP_MODE","createToken","createTokenInternal","_ref3","expectedPathsPerAlt","customUserDescription","errPrefix","errSuffix","allLookAheadPaths","currAltPaths","nextValidTokenSequences","currPath","currTokenType","itemMsg","_ref4","expectedIterationPaths","defaultGrammarResolverErrorProvider","buildRuleNotFoundError","undefinedRule","defaultGrammarValidatorErrorProvider","buildDuplicateFoundError","duplicateProds","topLevelName","duplicateProd","dslName","extraArgument","buildNamespaceConflictError","buildAlternationPrefixAmbiguityError","currTok","buildAlternationAmbiguityError","buildEmptyRepetitionError","buildTokenNameError","buildEmptyAlternationError","emptyChoiceIdx","buildTooManyAlternativesError","buildLeftRecursionError","leftRecursionPath","currRule","buildInvalidRuleNameError","buildDuplicateRuleNameError","grammarName","GastRefResolverVisitor","nameToTopRule","errMsgProvider","resolveRefs","currTopLevel","ParserDefinitionErrorType","UNRESOLVED_SUBRULE_REF","unresolvedRefName","setter","accumulator","arrayAggregator","baseAggregator","createAggregator","baseAssignValue","AbstractNextPossibleTokensWalker","possibleTokTypes","nextProductionName","nextProductionOccurrence","isAtEndOfPath","ruleStack","reverse","occurrenceStack","updateExpectedNext","NextAfterTokenWalker","nextTerminalName","nextTerminalOccurrence","lastTok","lastTokOccurrence","restProd","AbstractNextTerminalAfterProductionWalker","topRule","isEndOfRule","NextTerminalAfterManyWalker","firstAfterMany","_first","NextTerminalAfterManySepWalker","firstAfterManySep","NextTerminalAfterAtLeastOneWalker","firstAfterAtLeastOne","NextTerminalAfterAtLeastOneSepWalker","atleastOneSepProd","firstAfterfirstAfterAtLeastOneSep","possiblePathsFrom","targetDef","maxLength","getAlternativesForProd","newDef","partialPath","suffixDef","nextPossibleTokensAfter","initialDef","tokMatcher","maxLookAhead","EXIT_NON_TERMINAL","EXIT_NON_TERMINAL_ARR","EXIT_ALTERNATIVE","foundCompletePath","tokenVectorLength","minimalAlternativesIndex","possiblePaths","def","currDef","currRuleStack","currOccurrenceStack","nextPath","dropRight","nextIdx","nextTokenType","nextTokenOccurrence","newRuleStack","newOccurrenceStack","nextPathWithout","nextPathWith","secondIteration","separatorGast","nthRepetition","currAltPath","expandTopLevelRule","newCurrOccurrenceStack","PROD_TYPE","OPTION","REPETITION","REPETITION_MANDATORY","REPETITION_MANDATORY_WITH_SEPARATOR","REPETITION_WITH_SEPARATOR","ALTERNATION","getLookaheadPathsForOr","getLookaheadPathsForOptionalProd","buildAlternativesLookAheadFunc","numOfAlts","areAllOneTokenLookahead","currNumOfPaths","currPredicate","currPathLength","singleTokenAlts","buildSingleAlternativeLookaheadFunction","numOfPaths","RestDefinitionFinderWalker","targetOccurrence","targetProdType","restDef","checkIsTarget","expectedProdType","InsideDefinitionFinderVisitor","targetRef","expectedProdName","initializeArrayOfArrays","pathToHashKeys","longerKeys","currShorterKey","categoriesKeySuffix","isUniquePrefixHash","altKnownPathsKeys","searchPathKeys","currAltIdx","otherAltKnownPathsKeys","searchIdx","lookAheadSequenceFromAlternatives","altsDefs","finalResult","altsHashes","dict","newData","pathLength","currDataset","altIdx","currAltPathsAndSuffixes","currPathIdx","currPathPrefix","prefixKeys","currAltResult","containsPath","newPartialPathsAndSuffixes","ruleGrammar","insideDefVisitor","insideDef","afterDef","AlternativeGAST","searchPath","compareOtherPath","otherPath","searchTok","otherTok","areTokenCategoriesNotUsed","lookAheadPaths","singleAltPaths","singlePath","validateGrammar","topLevels","duplicateErrors","collectorVisitor","OccurrenceValidationCollector","allRuleProductions","allProductions","productionGroups","groupBy","identifyProductionForDuplicates","duplicates","currGroup","currDuplicates","firstProd","defError","DUPLICATE_PRODUCTIONS","param","getExtraProductionArgument","validateDuplicateProductions","termsNamespaceConflictErrors","tokenNames","currToken","currRuleName","CONFLICT_TOKENS_RULES_NAMESPACE","checkTerminalAndNoneTerminalsNameSpace","tooManyAltsErrors","curRule","orCollector","OrCollector","ors","alternations","currOr","TOO_MANY_ALTS","validateTooManyAlts","duplicateRulesError","className","occurrences","DUPLICATE_RULE_NAME","validateRuleDoesNotAlreadyExist","manySep","atLeastOneSep","validateNoLeftRecursion","nextNonTerminals","getFirstNoneTerminal","LEFT_RECURSION","validNextSteps","errorsFromNextSteps","currRefRule","currSubDef","isFirstOptional","hasMore","globalMaxLookahead","currOccurrence","actualMaxLookahead","altsAmbiguityErrors","foundAmbiguousPaths","identicalAmbiguities","altsCurrPathAppearsIn","currOtherAlt","currOtherAltIdx","currErrors","currAmbDescriptor","ambgIndices","AMBIGUOUS_ALTS","checkAlternativesAmbiguities","altsPrefixAmbiguityErrors","pathsAndIndices","currPathsAndIdx","currPathAndIdx","targetIdx","prefixAmbiguitiesPathsAndIndices","searchPathAndIdx","prefix","otherTokType","currAmbPathAndIdx","AMBIGUOUS_PREFIX_ALTS","checkPrefixAlternativesAmbiguities","RepetitionCollector","resolveGrammar","actualOptions","topRulesTable","refResolver","orgResolveGrammar","MISMATCHED_TOKEN_EXCEPTION","NO_VIABLE_ALT_EXCEPTION","EARLY_EXIT_EXCEPTION","NOT_ALL_INPUT_PARSED_EXCEPTION","RECOGNITION_EXCEPTION_NAMES","isRecognitionException","RecognitionException","resyncedTokens","captureStackTrace","MismatchedTokenException","NoViableAltException","NotAllInputParsedException","EarlyExitException","EOF_FOLLOW_KEY","IN_RULE_RECOVERY_EXCEPTION","InRuleRecoveryException","attemptInRepetitionRecovery","prodFunc","lookaheadFunc","dslMethodIdx","nextToksWalker","notStuck","getKeyForAutomaticLookahead","firstAfterRepInfo","firstAfterRepMap","getCurrRuleFullName","getGAstProductions","expectTokAfterLastMatch","nextTokIdx","shouldInRepetitionRecoveryBeTried","tryInRepetitionRecovery","AT_LEAST_ONE_IDX","MANY_SEP_IDX","AT_LEAST_ONE_SEP_IDX","ruleIdx","DEFAULT_PARSER_CONFIG","leftRecursionErrors","emptyAltErrors","ambiguousAltsErrors","emptyRepetitionErrors","validateSomeNonEmptyLookaheadPath","currTopRule","exceptLast","currAlternative","possibleFirstInAlt","NONE_LAST_EMPTY_ALT","validateEmptyOrAlternative","topLevelRules","currProd","pathsInsideProduction","NO_NON_EMPTY_LOOKAHEAD","laFuncBuilder","buildLookaheadFuncForOr","lookaheadBuilder","buildLookaheadFuncForOptionalProd","dslMethods","repetitionWithSeparator","repetitionMandatoryWithSeparator","setNodeLocationOnlyOffset","currNodeLocation","newLocationInfo","setNodeLocationFull","defineNameProp","nameValue","enumerable","writable","defaultVisit","childrenNames","childrenNamesLength","currChildArray","currChildArrayLength","currChild","createBaseSemanticVisitorConstructor","derivedConstructor","semanticProto","validateVisitor","semanticDefinitionErrors","visitorInstance","missingErrors","missingRuleNames","CstVisitorDefinitionError","MISSING_METHOD","methodName","validateMissingCstMethods","errorMessages","currDefError","_RULE_NAMES","RECORDING_NULL_OBJECT","HANDLE_SEPARATOR","MAX_METHOD_IDX","pow","RFT","RECORDING_PHASE_TOKEN","RECORDING_PHASE_CSTNODE","recordProd","prodConstructor","mainProdArg","handleSep","assertMethodIdxIsValid","prevProd","peek","recordingProdStack","grammarAction","newProd","SEP","MAX_LOOKAHEAD","recordOrProd","hasOptions","newOrProd","IGNORE_AMBIGUITIES","currAltFlat","getIdxSuffix","KNOWN_RECORDER_ERROR","END_OF_FILE","NaN","outputCst","DEFAULT_RULE_CONFIG","recoveryValueFunc","resyncEnabled","derivedCtor","Parser","parserInstance","defErrorsMsgs","selfAnalysisDone","enableRecording","definedRulesNames","originalGrammarAction","recordedRuleGast","topLevelRuleRecord","gastProductionsCache","disableRecording","resolverErrors","validationErrors","tokensMap","orgValidateGrammar","lookaheadValidationErrors","lookaheadValidationErrorMessages","CUSTOM_LOOKAHEAD_VALIDATION","validateLookahead","allFollows","topProductions","reSyncFollows","currRefsFollow","computeAllProdsFollows","resyncFollows","preComputeLookaheadFunctions","DEFER_DEFINITION_ERRORS_HANDLING","that","initErrorHandler","initLexerAdapter","initLooksAhead","initRecognizerEngine","initRecoverable","initTreeBuilder","initContentAssist","initGastRecorder","initPerformanceTracer","getTokenToInsert","tokToInsert","canTokenTypeBeInsertedInRecovery","canTokenTypeBeDeletedInRecovery","grammarRule","grammarRuleArgs","lookAheadFunc","expectedTokType","reSyncTokType","findReSyncTokenType","savedLexerState","exportLexerState","passedResyncPoint","nextTokenWithoutResync","generateErrorMessage","SAVE_ERROR","SKIP_TOKEN","addToResyncTokens","importLexerState","isBackTracking","canPerformInRuleRecovery","getFollowsForInRuleRecovery","tokIdxInRule","grammarPath","getCurrentGrammarPath","getNextPossibleTokenTypes","tryInRuleRecovery","canRecoverWithSingleTokenInsertion","canRecoverWithSingleTokenDeletion","nextTok","consumeToken","expectedToken","mismatchedTok","possibleFollowsTokType","isInCurrentRuleReSyncSet","followKey","getCurrFollowKey","currentRuleReSyncSet","getFollowSetFromFollowKey","allPossibleReSyncTokTypes","flattenFollowSet","foundMatch","resyncTokType","currRuleShortName","getLastExplicitRuleShortName","currRuleIdx","getLastExplicitRuleOccurrenceIndex","prevRuleShortName","getPreviousExplicitRuleShortName","shortRuleNameToFullName","idxInCallingRule","inRule","buildFullFollowKeyStack","explicitRuleStack","explicitOccurrenceStack","RULE_OCCURRENCE_STACK","followStack","resyncTokens","reSyncTo","getHumanReadableRuleStack","currShortName","lookAheadFuncsCache","collectMethods","prodIdx","laFunc","fullRuleNameToShort","setLaFuncCache","computeLookaheadFunc","prodKey","prodMaxLookahead","dslMethodName","getLaFuncFromCache","CST_STACK","setNodeLocationFromToken","setNodeLocationFromNode","cstPostRule","setInitialNodeLocation","setInitialNodeLocationFullRecovery","cstPostRuleFull","setInitialNodeLocationFullRegular","setInitialNodeLocationOnlyOffsetRecovery","cstPostRuleOnlyOffset","setInitialNodeLocationOnlyOffsetRegular","cstInvocationStateUpdate","cstFinallyStateUpdate","cstPostTerminal","cstPostNonTerminal","fullRuleName","ruleCstNode","prevToken","consumedToken","rootCst","tokenTypeName","ruleCstResult","preCstNode","ruleResult","addNoneTerminalToCst","getBaseCstVisitorConstructor","baseCstVisitorConstructor","newBaseCstVisitorConstructor","getBaseCstVisitorConstructorWithDefaults","baseCstVisitorWithDefaultsConstructor","newConstructor","baseConstructor","withDefaultsProto","createBaseVisitorConstructorWithDefaults","tokVector","tokVectorLength","newInput","soughtIdx","resetLexerState","moveToTerminatedState","getLexerPosition","shortRuleNameToFull","ruleShortNameIdx","subruleIdx","isBackTrackingStack","uniqueTokens","noTokenCategoriesUsed","tokenConstructor","defineRule","shortName","BITS_FOR_METHOD_TYPE","invokeRuleWithTry","ruleInvocationStateUpdate","invokeRuleCatch","ruleFinallyStateUpdate","resyncEnabledConfig","isFirstInvokedRule","reSyncEnabled","recogError","partialCstResult","recoveredNode","optionInternal","actionORMethodDef","optionInternalLogic","orgLookaheadFunction","atLeastOneInternal","laKey","atLeastOneInternalLogic","raiseEarlyExitException","ERR_MSG","doSingleRepetition","atLeastOneSepFirstInternal","atLeastOneSepFirstInternalLogic","separatorLookAheadFunc","CONSUME","repetitionSepSecondInternal","manyInternal","manyInternalLogic","lookaheadFunction","manySepFirstInternal","manySepFirstInternalLogic","nextTerminalAfterWalker","beforeIteration","orInternal","altsOrOpts","altIdxToTake","raiseNoAltException","isAtEndOfInput","firstRedundantTok","subruleInternal","ruleToCall","subruleInternalError","consumeInternal","consumeInternalError","eFromConsumption","consumeInternalRecovery","eFromInRuleRecovery","saveRecogState","savedErrors","savedRuleStack","lexerState","reloadRecogState","fullName","ACTION","CONSUME1","CONSUME2","CONSUME3","CONSUME4","CONSUME5","CONSUME6","CONSUME7","CONSUME8","CONSUME9","SUBRULE","SUBRULE1","SUBRULE2","SUBRULE3","SUBRULE4","SUBRULE5","SUBRULE6","SUBRULE7","SUBRULE8","SUBRULE9","OPTION1","OPTION2","OPTION3","OPTION4","OPTION5","OPTION6","OPTION7","OPTION8","OPTION9","OR","OR1","OR2","OR3","OR4","OR5","OR6","OR7","OR8","OR9","MANY","MANY1","MANY2","MANY3","MANY4","MANY5","MANY6","MANY7","MANY8","MANY9","MANY_SEP","MANY_SEP1","MANY_SEP2","MANY_SEP3","MANY_SEP4","MANY_SEP5","MANY_SEP6","MANY_SEP7","MANY_SEP8","MANY_SEP9","AT_LEAST_ONE","AT_LEAST_ONE1","AT_LEAST_ONE2","AT_LEAST_ONE3","AT_LEAST_ONE4","AT_LEAST_ONE5","AT_LEAST_ONE6","AT_LEAST_ONE7","AT_LEAST_ONE8","AT_LEAST_ONE9","AT_LEAST_ONE_SEP","AT_LEAST_ONE_SEP1","AT_LEAST_ONE_SEP2","AT_LEAST_ONE_SEP3","AT_LEAST_ONE_SEP4","AT_LEAST_ONE_SEP5","AT_LEAST_ONE_SEP6","AT_LEAST_ONE_SEP7","AT_LEAST_ONE_SEP8","AT_LEAST_ONE_SEP9","ruleImplementation","OVERRIDE_RULE","ruleErrors","INVALID_RULE_OVERRIDE","validateRuleIsOverridden","BACKTRACK","orgState","getSerializedGastProductions","topRules","_errors","ruleOccurrenceStack","newErrors","userDefinedErrMsg","insideProdPaths","actualTokens","errMsgTypes","lookAheadPathsPerAlternative","computeContentAssist","startRuleName","precedingInput","startRuleGast","topRuleName","topProduction","arg1","arg2","consumeInternalRecord","subruleInternalRecord","optionInternalRecord","orInternalRecord","manyInternalRecord","manySepFirstInternalRecord","atLeastOneInternalRecord","atLeastOneSepFirstInternalRecord","ACTION_RECORD","BACKTRACK_RECORD","LA_RECORD","newTopLevelRule","originalError","mutabilityError","newNoneTerminal","userTraceInitPerf","traceIsNumber","baseCtor","baseProto","propName","basePropDescriptor","configClone","r","o","h","cwd","isAbsolute","f","l","_makeLong","format","dir","base","delimiter","win32","posix","toStringTag","platform","navigator","userAgent","scheme","authority","query","isUri","fsPath","m","C","file","y","toJSON","revive","_formatted","external","_fsPath","_sep","$mid","encodeURIComponent","decodeURIComponent","w","A","P","typePredicate","keyIndex","isAstNodeInRange","nodeRange","typeMetaData","genericNode","copyDefaultValue","propertyType","PieTokenBuilder","PieValueConverter","PieModule","PacketTokenBuilder","PacketModule","baseMap","_disposable","CallbackList","bucket","_callbacks","_contexts","foundCallbackWithDifferentContext","invoke","contexts","_event","thisArgs","disposables","onFirstListenerAdd","_noop","onLastListenerRemove","stringArray","elem","baseExtremum","baseLt","InfoTokenBuilder","InfoModule","reachableRules","buildTerminalTokens","terminalToken","popDiagnostics","buildTerminalToken","requiresCustomPattern","regexPatternFunction","stickyRegex","sort","buildKeywordToken","keywordPattern","buildKeywordPattern","findLongerAlt","longerAlts"],"sourceRoot":""} \ No newline at end of file diff --git a/frontend/deployed/static/js/62.785a92ce.chunk.js b/frontend/deployed/static/js/62.785a92ce.chunk.js deleted file mode 100644 index 9e099b9..0000000 --- a/frontend/deployed/static/js/62.785a92ce.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunkbackstory=self.webpackChunkbackstory||[]).push([[62],{62:(e,n,t)=>{t.d(n,{Zp:()=>Rn});var r=t(1109),o=t(3434),i=0;const u=function(e){var n=++i;return(0,o.A)(e)+n};var a=t(4431),s=t(6165),d=t(8293),c=Math.ceil,h=Math.max;const f=function(e,n,t,r){for(var o=-1,i=h(c((n-e)/(t||1)),0),u=Array(i);i--;)u[r?i:++o]=e,e+=t;return u};var v=t(8635),l=t(3484);const g=function(e){return function(n,t,r){return r&&"number"!=typeof r&&(0,v.A)(n,t,r)&&(t=r=void 0),n=(0,l.A)(n),void 0===t?(t=n,n=0):t=(0,l.A)(t),r=void 0===r?n0;--a)if(r=n[a].dequeue()){o=o.concat(_(e,n,t,r,!0));break}}return o}(t.graph,t.buckets,t.zeroIdx);return s.A(d.A(o,(function(n){return e.outEdges(n.v,n.w)})))}function _(e,n,t,o,i){var u=i?[]:void 0;return r.A(e.inEdges(o.v),(function(r){var o=e.edge(r),a=e.node(r.v);i&&u.push({v:r.v,w:r.w}),a.out-=o,E(n,t,a)})),r.A(e.outEdges(o.v),(function(r){var o=e.edge(r),i=r.w,u=e.node(i);u.in-=o,E(n,t,u)})),e.removeNode(o.v),u}function E(e,n,t){t.out?t.in?e[t.out-t.in+n].enqueue(t):e[e.length-1].enqueue(t):e[0].enqueue(t)}function x(e){var n="greedy"===e.graph().acyclicer?y(e,function(e){return function(n){return e.edge(n).weight}}(e)):function(e){var n=[],t={},o={};function i(u){Object.prototype.hasOwnProperty.call(o,u)||(o[u]=!0,t[u]=!0,r.A(e.outEdges(u),(function(e){Object.prototype.hasOwnProperty.call(t,e.w)?n.push(e):i(e.w)})),delete t[u])}return r.A(e.nodes(),i),n}(e);r.A(n,(function(n){var t=e.edge(n);e.removeEdge(n),t.forwardName=n.name,t.reversed=!0,e.setEdge(n.w,n.v,t,u("rev"))}))}var k=t(7697),O=t(1012),N=t(9689);const P=function(e,n){return(0,O.A)(e,n,(function(n,t){return(0,N.A)(e,t)}))};var j=t(7858),C=t(7515);const I=function(e){return(0,C.A)((0,j.A)(e,void 0,s.A),e+"")}((function(e,n){return null==e?{}:P(e,n)}));var L=t(4833),T=t(2544);const M=function(e,n){return e>n};var R=t(2041);const F=function(e){return e&&e.length?(0,T.A)(e,R.A,M):void 0};var D=t(4211),S=t(3101),G=t(6990),V=t(378);const B=function(e,n){var t={};return n=(0,V.A)(n,3),(0,G.A)(e,(function(e,r,o){(0,S.A)(t,r,n(e,r,o))})),t};var q=t(6772),Y=t(9031),z=t(313),$=t(4306);const J=function(){return $.A.Date.now()};function Z(e,n,t,r){var o;do{o=u(r)}while(e.hasNode(o));return t.dummy=n,e.setNode(o,t),o}function H(e){var n=new p.T({multigraph:e.isMultigraph()}).setGraph(e.graph());return r.A(e.nodes(),(function(t){e.children(t).length||n.setNode(t,e.node(t))})),r.A(e.edges(),(function(t){n.setEdge(t,e.edge(t))})),n}function K(e,n){var t,r,o=e.x,i=e.y,u=n.x-o,a=n.y-i,s=e.width/2,d=e.height/2;if(!u&&!a)throw new Error("Not possible to find intersection inside of the rectangle");return Math.abs(a)*s>Math.abs(u)*d?(a<0&&(d=-d),t=d*u/a,r=d):(u<0&&(s=-s),t=s,r=s*a/u),{x:o+t,y:i+r}}function Q(e){var n=d.A(g(W(e)+1),(function(){return[]}));return r.A(e.nodes(),(function(t){var r=e.node(t),o=r.rank;q.A(o)||(n[o][r.order]=t)})),n}function U(e,n,t,r){var o={width:0,height:0};return arguments.length>=4&&(o.rank=t,o.order=r),Z(e,"border",o,n)}function W(e){return F(d.A(e.nodes(),(function(n){var t=e.node(n).rank;if(!q.A(t))return t})))}function X(e,n){var t=J();try{return n()}finally{console.log(e+" time: "+(J()-t)+"ms")}}function ee(e,n){return n()}function ne(e,n,t,r,o,i){var u={width:0,height:0,rank:i,borderType:n},a=o[n][i-1],s=Z(e,"border",u,t);o[n][i]=s,e.setParent(s,r),a&&e.setEdge(a,s,{weight:1})}function te(e){var n=e.graph().rankdir.toLowerCase();"bt"!==n&&"rl"!==n||function(e){r.A(e.nodes(),(function(n){ie(e.node(n))})),r.A(e.edges(),(function(n){var t=e.edge(n);r.A(t.points,ie),Object.prototype.hasOwnProperty.call(t,"y")&&ie(t)}))}(e),"lr"!==n&&"rl"!==n||(!function(e){r.A(e.nodes(),(function(n){ue(e.node(n))})),r.A(e.edges(),(function(n){var t=e.edge(n);r.A(t.points,ue),Object.prototype.hasOwnProperty.call(t,"x")&&ue(t)}))}(e),re(e))}function re(e){r.A(e.nodes(),(function(n){oe(e.node(n))})),r.A(e.edges(),(function(n){oe(e.edge(n))}))}function oe(e){var n=e.width;e.width=e.height,e.height=n}function ie(e){e.y=-e.y}function ue(e){var n=e.x;e.x=e.y,e.y=n}function ae(e){e.graph().dummyChains=[],r.A(e.edges(),(function(n){!function(e,n){var t=n.v,r=e.node(t).rank,o=n.w,i=e.node(o).rank,u=n.name,a=e.edge(n),s=a.labelRank;if(i===r+1)return;e.removeEdge(n);var d,c,h=void 0;for(c=0,++r;ru.lim&&(a=u,s=!0);var d=Ae.A(n.edges(),(function(n){return s===Be(e,e.node(n.v),a)&&s!==Be(e,e.node(n.w),a)}));return de(d,(function(e){return he(n,e)}))}function Ve(e,n,t,o){var i=t.v,u=t.w;e.removeEdge(i,u),e.setEdge(o.v,o.w,{}),Fe(e),Me(e,n),function(e,n){var t=pe.A(e.nodes(),(function(e){return!n.node(e).parent})),o=function(e,n){return Ie(e,n,"pre")}(e,t);o=o.slice(1),r.A(o,(function(t){var r=e.node(t).parent,o=n.edge(t,r),i=!1;o||(o=n.edge(r,t),i=!0),n.node(t).rank=n.node(r).rank+(i?o.minlen:-o.minlen)}))}(e,n)}function Be(e,n,t){return t.low<=n.lim&&n.lim<=t.lim}function qe(e){switch(e.graph().ranker){case"network-simplex":default:ze(e);break;case"tight-tree":!function(e){ce(e),fe(e)}(e);break;case"longest-path":Ye(e)}}Te.initLowLimValues=Fe,Te.initCutValues=Me,Te.calcCutValue=Re,Te.leaveEdge=Se,Te.enterEdge=Ge,Te.exchangeEdges=Ve;var Ye=ce;function ze(e){Te(e)}var $e=t(1432),Je=t(3175);function Ze(e){var n=Z(e,"root",{},"_root"),t=function(e){var n={};function t(o,i){var u=e.children(o);u&&u.length&&r.A(u,(function(e){t(e,i+1)})),n[o]=i}return r.A(e.children(),(function(e){t(e,1)})),n}(e),o=F($e.A(t))-1,i=2*o+1;e.graph().nestingRoot=n,r.A(e.edges(),(function(n){e.edge(n).minlen*=i}));var u=function(e){return Je.A(e.edges(),(function(n,t){return n+e.edge(t).weight}),0)}(e)+1;r.A(e.children(),(function(r){He(e,n,i,u,o,t,r)})),e.graph().nodeRankFactor=i}function He(e,n,t,o,i,u,a){var s=e.children(a);if(s.length){var d=U(e,"_bt"),c=U(e,"_bb"),h=e.node(a);e.setParent(d,a),h.borderTop=d,e.setParent(c,a),h.borderBottom=c,r.A(s,(function(r){He(e,n,t,o,i,u,r);var s=e.node(r),h=s.borderTop?s.borderTop:r,f=s.borderBottom?s.borderBottom:r,v=s.borderTop?o:2*o,l=h!==f?1:i-u[a]+1;e.setEdge(d,h,{weight:v,minlen:l,nestingEdge:!0}),e.setEdge(f,c,{weight:v,minlen:l,nestingEdge:!0})})),e.parent(a)||e.setEdge(n,d,{weight:0,minlen:i+u[a]})}else a!==n&&e.setEdge(n,a,{weight:0,minlen:t})}var Ke=t(1387);const Qe=function(e){return(0,Ke.A)(e,5)};function Ue(e,n,t){var o=function(e){var n;for(;e.hasNode(n=u("_root")););return n}(e),i=new p.T({compound:!0}).setGraph({root:o}).setDefaultNodeLabel((function(n){return e.node(n)}));return r.A(e.nodes(),(function(u){var a=e.node(u),s=e.parent(u);(a.rank===n||a.minRank<=n&&n<=a.maxRank)&&(i.setNode(u),i.setParent(u,s||o),r.A(e[t](u),(function(n){var t=n.v===u?n.w:n.v,r=i.edge(t,u),o=q.A(r)?0:r.weight;i.setEdge(t,u,{weight:e.edge(n).weight+o})})),Object.prototype.hasOwnProperty.call(a,"minRank")&&i.setNode(u,{borderLeft:a.borderLeft[n],borderRight:a.borderRight[n]}))})),i}var We=t(1954);const Xe=function(e,n,t){for(var r=-1,o=e.length,i=n.length,u={};++rn||i&&u&&s&&!a&&!d||r&&u&&s||!t&&s||!o)return 1;if(!r&&!i&&!d&&e=a?s:s*("desc"==t[r]?-1:1)}return e.index-n.index};const hn=function(e,n,t){n=n.length?(0,tn.A)(n,(function(e){return(0,Ce.A)(e)?function(n){return(0,rn.A)(n,1===e.length?e[0]:e)}:e})):[R.A];var r=-1;n=(0,tn.A)(n,(0,an.A)(V.A));var o=(0,on.A)(e,(function(e,t,o){return{criteria:(0,tn.A)(n,(function(n){return n(e)})),index:++r,value:e}}));return un(o,(function(e,n){return cn(e,n,t)}))};const fn=(0,t(1869).A)((function(e,n){if(null==e)return[];var t=n.length;return t>1&&(0,v.A)(e,n[0],n[1])?n=[]:t>2&&(0,v.A)(n[0],n[1],n[2])&&(n=[n[0]]),hn(e,(0,nn.A)(n,1),[])}));function vn(e,n){for(var t=0,r=1;r0;)n%2&&(t+=c[n+1]),c[n=n-1>>1]+=e.weight;h+=e.weight*t}))),h}function gn(e,n){var t={};return r.A(e,(function(e,n){var r=t[e.v]={indegree:0,in:[],out:[],vs:[e.v],i:n};q.A(e.barycenter)||(r.barycenter=e.barycenter,r.weight=e.weight)})),r.A(n.edges(),(function(e){var n=t[e.v],r=t[e.w];q.A(n)||q.A(r)||(r.indegree++,n.out.push(t[e.w]))})),function(e){var n=[];function t(e){return function(n){n.merged||(q.A(n.barycenter)||q.A(e.barycenter)||n.barycenter>=e.barycenter)&&function(e,n){var t=0,r=0;e.weight&&(t+=e.barycenter*e.weight,r+=e.weight);n.weight&&(t+=n.barycenter*n.weight,r+=n.weight);e.vs=n.vs.concat(e.vs),e.barycenter=t/r,e.weight=r,e.i=Math.min(n.i,e.i),n.merged=!0}(e,n)}}function o(n){return function(t){t.in.push(n),0===--t.indegree&&e.push(t)}}for(;e.length;){var i=e.pop();n.push(i),r.A(i.in.reverse(),t(i)),r.A(i.out,o(i))}return d.A(Ae.A(n,(function(e){return!e.merged})),(function(e){return I(e,["vs","i","barycenter","weight"])}))}(Ae.A(t,(function(e){return!e.indegree})))}function pn(e,n){var t,o=function(e,n){var t={lhs:[],rhs:[]};return r.A(e,(function(e){n(e)?t.lhs.push(e):t.rhs.push(e)})),t}(e,(function(e){return Object.prototype.hasOwnProperty.call(e,"barycenter")})),i=o.lhs,u=fn(o.rhs,(function(e){return-e.i})),a=[],d=0,c=0,h=0;i.sort((t=!!n,function(e,n){return e.barycentern.barycenter?1:t?n.i-e.i:e.i-n.i})),h=An(a,u,h),r.A(i,(function(e){h+=e.vs.length,a.push(e.vs),d+=e.barycenter*e.weight,c+=e.weight,h=An(a,u,h)}));var f={vs:s.A(a)};return c&&(f.barycenter=d/c,f.weight=c),f}function An(e,n,t){for(var r;n.length&&(r=D.A(n)).i<=t;)n.pop(),e.push(r.vs),t++;return t}function wn(e,n,t,o){var i=e.children(n),u=e.node(n),a=u?u.borderLeft:void 0,c=u?u.borderRight:void 0,h={};a&&(i=Ae.A(i,(function(e){return e!==a&&e!==c})));var f=function(e,n){return d.A(n,(function(n){var t=e.inEdges(n);if(t.length){var r=Je.A(t,(function(n,t){var r=e.edge(t),o=e.node(t.v);return{sum:n.sum+r.weight*o.order,weight:n.weight+r.weight}}),{sum:0,weight:0});return{v:n,barycenter:r.sum/r.weight,weight:r.weight}}return{v:n}}))}(e,i);r.A(f,(function(n){if(e.children(n.v).length){var r=wn(e,n.v,t,o);h[n.v]=r,Object.prototype.hasOwnProperty.call(r,"barycenter")&&(i=n,u=r,q.A(i.barycenter)?(i.barycenter=u.barycenter,i.weight=u.weight):(i.barycenter=(i.barycenter*i.weight+u.barycenter*u.weight)/(i.weight+u.weight),i.weight+=u.weight))}var i,u}));var v=gn(f,t);!function(e,n){r.A(e,(function(e){e.vs=s.A(e.vs.map((function(e){return n[e]?n[e].vs:e})))}))}(v,h);var l=pn(v,o);if(a&&(l.vs=s.A([a,l.vs,c]),e.predecessors(a).length)){var g=e.node(e.predecessors(a)[0]),p=e.node(e.predecessors(c)[0]);Object.prototype.hasOwnProperty.call(l,"barycenter")||(l.barycenter=0,l.weight=0),l.barycenter=(l.barycenter*l.weight+g.order+p.order)/(l.weight+2),l.weight+=2}return l}function bn(e){var n=W(e),t=mn(e,g(1,n+1),"inEdges"),o=mn(e,g(n-1,-1,-1),"outEdges"),i=function(e){var n={},t=Ae.A(e.nodes(),(function(n){return!e.children(n).length})),o=F(d.A(t,(function(n){return e.node(n).rank}))),i=d.A(g(o+1),(function(){return[]})),u=fn(t,(function(n){return e.node(n).rank}));return r.A(u,(function t(o){if(!z.A(n,o)){n[o]=!0;var u=e.node(o);i[u.rank].push(o),r.A(e.successors(o),t)}})),i}(e);_n(e,i);for(var u,a=Number.POSITIVE_INFINITY,s=0,c=0;c<4;++s,++c){yn(s%2?t:o,s%4>=2);var h=vn(e,i=Q(e));hs||d>n[o].lim));i=o,o=r;for(;(o=e.parent(o))!==i;)a.push(o);return{path:u.concat(a.reverse()),lca:i}}(e,n,o.v,o.w),u=i.path,a=i.lca,s=0,d=u[s],c=!0;t!==o.w;){if(r=e.node(t),c){for(;(d=u[s])!==a&&e.node(d).maxRankt){var r=n;n=t,t=r}var o=e[n];o||(e[n]=o={}),o[t]=!0}function In(e,n,t){if(n>t){var r=n;n=t,t=r}return!!e[n]&&Object.prototype.hasOwnProperty.call(e[n],t)}function Ln(e,n,t,o,i){var u={},a=function(e,n,t,o){var i=new p.T,u=e.graph(),a=function(e,n,t){return function(r,o,i){var u,a=r.node(o),s=r.node(i),d=0;if(d+=a.width/2,Object.prototype.hasOwnProperty.call(a,"labelpos"))switch(a.labelpos.toLowerCase()){case"l":u=-a.width/2;break;case"r":u=a.width/2}if(u&&(d+=t?u:-u),u=0,d+=(a.dummy?n:e)/2,d+=(s.dummy?n:e)/2,d+=s.width/2,Object.prototype.hasOwnProperty.call(s,"labelpos"))switch(s.labelpos.toLowerCase()){case"l":u=s.width/2;break;case"r":u=-s.width/2}return u&&(d+=t?u:-u),u=0,d}}(u.nodesep,u.edgesep,o);return r.A(n,(function(n){var o;r.A(n,(function(n){var r=t[n];if(i.setNode(r),o){var u=t[o],s=i.edge(u,r);i.setEdge(u,r,Math.max(a(e,n,o),s||0))}o=n}))})),i}(e,n,t,i),s=i?"borderLeft":"borderRight";function d(e,n){for(var t=a.nodes(),r=t.pop(),o={};r;)o[r]?e(r):(o[r]=!0,t.push(r),t=t.concat(n(r))),r=t.pop()}return d((function(e){u[e]=a.inEdges(e).reduce((function(e,n){return Math.max(e,u[n.v]+a.edge(n))}),0)}),a.predecessors.bind(a)),d((function(n){var t=a.outEdges(n).reduce((function(e,n){return Math.min(e,u[n.w]-a.edge(n))}),Number.POSITIVE_INFINITY),r=e.node(n);t!==Number.POSITIVE_INFINITY&&r.borderType!==s&&(u[n]=Math.max(u[n],t))}),a.successors.bind(a)),r.A(o,(function(e){u[e]=u[t[e]]})),u}function Tn(e){var n,t=Q(e),o=k.A(jn(e,t),function(e,n){var t={};function o(n,o,i,u,a){var s;r.A(g(o,i),(function(o){s=n[o],e.node(s).dummy&&r.A(e.predecessors(s),(function(n){var r=e.node(n);r.dummy&&(r.ordera)&&Cn(t,n,s)}))}))}return Je.A(n,(function(n,t){var i,u=-1,a=0;return r.A(t,(function(r,s){if("border"===e.node(r).dummy){var d=e.predecessors(r);d.length&&(i=e.node(d[0]).order,o(t,a,s,u,i),a=s,u=i)}o(t,a,t.length,i,n.length)})),t})),t}(e,t)),i={};r.A(["u","d"],(function(u){n="u"===u?t:$e.A(t).reverse(),r.A(["l","r"],(function(t){"r"===t&&(n=d.A(n,(function(e){return $e.A(e).reverse()})));var a=("u"===u?e.predecessors:e.successors).bind(e),s=function(e,n,t,o){var i={},u={},a={};return r.A(n,(function(e){r.A(e,(function(e,n){i[e]=e,u[e]=e,a[e]=n}))})),r.A(n,(function(e){var n=-1;r.A(e,(function(e){var r=o(e);if(r.length){r=fn(r,(function(e){return a[e]}));for(var s=(r.length-1)/2,d=Math.floor(s),c=Math.ceil(s);d<=c;++d){var h=r[d];u[e]===e&&n{var n=t(" buildLayoutGraph",(()=>function(e){var n=new p.T({multigraph:!0,compound:!0}),t=$n(e.graph());return n.setGraph(k.A({},Dn,zn(t,Fn),I(t,Sn))),r.A(e.nodes(),(function(t){var r=$n(e.node(t));n.setNode(t,L.A(zn(r,Gn),Vn)),n.setParent(t,e.parent(t))})),r.A(e.edges(),(function(t){var r=$n(e.edge(t));n.setEdge(t,k.A({},qn,zn(r,Bn),I(r,Yn)))})),n}(e)));t(" runLayout",(()=>function(e,n){n(" makeSpaceForEdgeLabels",(()=>function(e){var n=e.graph();n.ranksep/=2,r.A(e.edges(),(function(t){var r=e.edge(t);r.minlen*=2,"c"!==r.labelpos.toLowerCase()&&("TB"===n.rankdir||"BT"===n.rankdir?r.width+=r.labeloffset:r.height+=r.labeloffset)}))}(e))),n(" removeSelfEdges",(()=>function(e){r.A(e.edges(),(function(n){if(n.v===n.w){var t=e.node(n.v);t.selfEdges||(t.selfEdges=[]),t.selfEdges.push({e:n,label:e.edge(n)}),e.removeEdge(n)}}))}(e))),n(" acyclic",(()=>x(e))),n(" nestingGraph.run",(()=>Ze(e))),n(" rank",(()=>qe(H(e)))),n(" injectEdgeLabelProxies",(()=>function(e){r.A(e.edges(),(function(n){var t=e.edge(n);if(t.width&&t.height){var r=e.node(n.v),o={rank:(e.node(n.w).rank-r.rank)/2+r.rank,e:n};Z(e,"edge-proxy",o,"_ep")}}))}(e))),n(" removeEmptyRanks",(()=>function(e){var n=Y.A(d.A(e.nodes(),(function(n){return e.node(n).rank}))),t=[];r.A(e.nodes(),(function(r){var o=e.node(r).rank-n;t[o]||(t[o]=[]),t[o].push(r)}));var o=0,i=e.graph().nodeRankFactor;r.A(t,(function(n,t){q.A(n)&&t%i!==0?--o:o&&r.A(n,(function(n){e.node(n).rank+=o}))}))}(e))),n(" nestingGraph.cleanup",(()=>function(e){var n=e.graph();e.removeNode(n.nestingRoot),delete n.nestingRoot,r.A(e.edges(),(function(n){e.edge(n).nestingEdge&&e.removeEdge(n)}))}(e))),n(" normalizeRanks",(()=>function(e){var n=Y.A(d.A(e.nodes(),(function(n){return e.node(n).rank})));r.A(e.nodes(),(function(t){var r=e.node(t);z.A(r,"rank")&&(r.rank-=n)}))}(e))),n(" assignRankMinMax",(()=>function(e){var n=0;r.A(e.nodes(),(function(t){var r=e.node(t);r.borderTop&&(r.minRank=e.node(r.borderTop).rank,r.maxRank=e.node(r.borderBottom).rank,n=F(n,r.maxRank))})),e.graph().maxRank=n}(e))),n(" removeEdgeLabelProxies",(()=>function(e){r.A(e.nodes(),(function(n){var t=e.node(n);"edge-proxy"===t.dummy&&(e.edge(t.e).labelRank=t.rank,e.removeNode(n))}))}(e))),n(" normalize.run",(()=>ae(e))),n(" parentDummyChains",(()=>En(e))),n(" addBorderSegments",(()=>function(e){r.A(e.children(),(function n(t){var o=e.children(t),i=e.node(t);if(o.length&&r.A(o,n),Object.prototype.hasOwnProperty.call(i,"minRank")){i.borderLeft=[],i.borderRight=[];for(var u=i.minRank,a=i.maxRank+1;ubn(e))),n(" insertSelfEdges",(()=>function(e){var n=Q(e);r.A(n,(function(n){var t=0;r.A(n,(function(n,o){var i=e.node(n);i.order=o+t,r.A(i.selfEdges,(function(n){Z(e,"selfedge",{width:n.label.width,height:n.label.height,rank:i.rank,order:o+ ++t,e:n.e,label:n.label},"_se")})),delete i.selfEdges}))}))}(e))),n(" adjustCoordinateSystem",(()=>function(e){var n=e.graph().rankdir.toLowerCase();"lr"!==n&&"rl"!==n||re(e)}(e))),n(" position",(()=>Mn(e))),n(" positionSelfEdges",(()=>function(e){r.A(e.nodes(),(function(n){var t=e.node(n);if("selfedge"===t.dummy){var r=e.node(t.e.v),o=r.x+r.width/2,i=r.y,u=t.x-o,a=r.height/2;e.setEdge(t.e,t.label),e.removeNode(n),t.label.points=[{x:o+2*u/3,y:i-a},{x:o+5*u/6,y:i-a},{x:o+u,y:i},{x:o+5*u/6,y:i+a},{x:o+2*u/3,y:i+a}],t.label.x=t.x,t.label.y=t.y}}))}(e))),n(" removeBorderNodes",(()=>function(e){r.A(e.nodes(),(function(n){if(e.children(n).length){var t=e.node(n),r=e.node(t.borderTop),o=e.node(t.borderBottom),i=e.node(D.A(t.borderLeft)),u=e.node(D.A(t.borderRight));t.width=Math.abs(u.x-i.x),t.height=Math.abs(o.y-r.y),t.x=i.x+t.width/2,t.y=r.y+t.height/2}})),r.A(e.nodes(),(function(n){"border"===e.node(n).dummy&&e.removeNode(n)}))}(e))),n(" normalize.undo",(()=>function(e){r.A(e.graph().dummyChains,(function(n){var t,r=e.node(n),o=r.edgeLabel;for(e.setEdge(r.edgeObj,o);r.dummy;)t=e.successors(n)[0],e.removeNode(n),o.points.push({x:r.x,y:r.y}),"edge-label"===r.dummy&&(o.x=r.x,o.y=r.y,o.width=r.width,o.height=r.height),n=t,r=e.node(n)}))}(e))),n(" fixupEdgeLabelCoords",(()=>function(e){r.A(e.edges(),(function(n){var t=e.edge(n);if(Object.prototype.hasOwnProperty.call(t,"x"))switch("l"!==t.labelpos&&"r"!==t.labelpos||(t.width-=t.labeloffset),t.labelpos){case"l":t.x-=t.width/2+t.labeloffset;break;case"r":t.x+=t.width/2+t.labeloffset}}))}(e))),n(" undoCoordinateSystem",(()=>te(e))),n(" translateGraph",(()=>function(e){var n=Number.POSITIVE_INFINITY,t=0,o=Number.POSITIVE_INFINITY,i=0,u=e.graph(),a=u.marginx||0,s=u.marginy||0;function d(e){var r=e.x,u=e.y,a=e.width,s=e.height;n=Math.min(n,r-a/2),t=Math.max(t,r+a/2),o=Math.min(o,u-s/2),i=Math.max(i,u+s/2)}r.A(e.nodes(),(function(n){d(e.node(n))})),r.A(e.edges(),(function(n){var t=e.edge(n);Object.prototype.hasOwnProperty.call(t,"x")&&d(t)})),n-=a,o-=s,r.A(e.nodes(),(function(t){var r=e.node(t);r.x-=n,r.y-=o})),r.A(e.edges(),(function(t){var i=e.edge(t);r.A(i.points,(function(e){e.x-=n,e.y-=o})),Object.prototype.hasOwnProperty.call(i,"x")&&(i.x-=n),Object.prototype.hasOwnProperty.call(i,"y")&&(i.y-=o)})),u.width=t-n+a,u.height=i-o+s}(e))),n(" assignNodeIntersects",(()=>function(e){r.A(e.edges(),(function(n){var t,r,o=e.edge(n),i=e.node(n.v),u=e.node(n.w);o.points?(t=o.points[0],r=o.points[o.points.length-1]):(o.points=[],t=u,r=i),o.points.unshift(K(i,t)),o.points.push(K(u,r))}))}(e))),n(" reversePoints",(()=>function(e){r.A(e.edges(),(function(n){var t=e.edge(n);t.reversed&&t.points.reverse()}))}(e))),n(" acyclic.undo",(()=>function(e){r.A(e.edges(),(function(n){var t=e.edge(n);if(t.reversed){e.removeEdge(n);var r=t.forwardName;delete t.reversed,delete t.forwardName,e.setEdge(n.w,n.v,t,r)}}))}(e)))}(n,t))),t(" updateInputGraph",(()=>function(e,n){r.A(e.nodes(),(function(t){var r=e.node(t),o=n.node(t);r&&(r.x=o.x,r.y=o.y,n.children(t).length&&(r.width=o.width,r.height=o.height))})),r.A(e.edges(),(function(t){var r=e.edge(t),o=n.edge(t);r.points=o.points,Object.prototype.hasOwnProperty.call(o,"x")&&(r.x=o.x,r.y=o.y)})),e.graph().width=n.graph().width,e.graph().height=n.graph().height}(e,n)))}))}var Fn=["nodesep","edgesep","ranksep","marginx","marginy"],Dn={ranksep:50,edgesep:20,nodesep:50,rankdir:"tb"},Sn=["acyclicer","ranker","rankdir","align"],Gn=["width","height"],Vn={width:0,height:0},Bn=["minlen","weight","width","height","labeloffset"],qn={minlen:1,weight:1,width:0,height:0,labeloffset:10,labelpos:"r"},Yn=["labelpos"];function zn(e,n){return B(I(e,n),Number)}function $n(e){var n={};return r.A(e,(function(e,t){n[t.toLowerCase()]=e})),n}},313:(e,n,t)=>{t.d(n,{A:()=>u});var r=Object.prototype.hasOwnProperty;const o=function(e,n){return null!=e&&r.call(e,n)};var i=t(2263);const u=function(e,n){return null!=e&&(0,i.A)(e,n,o)}},595:(e,n,t)=>{t.d(n,{A:()=>c});var r=t(378),o=t(3493),i=t(4175);const u=function(e){return function(n,t,u){var a=Object(n);if(!(0,o.A)(n)){var s=(0,r.A)(t,3);n=(0,i.A)(n),t=function(e){return s(a[e],e,a)}}var d=e(n,t,u);return d>-1?a[s?n[d]:d]:void 0}};var a=t(2782),s=t(6230),d=Math.max;const c=u((function(e,n,t){var o=null==e?0:e.length;if(!o)return-1;var i=null==t?0:(0,s.A)(t);return i<0&&(i=d(o+i,0)),(0,a.A)(e,(0,r.A)(n,3),i)}))},772:(e,n,t)=>{t.d(n,{T:()=>r.T});var r=t(9330)},1012:(e,n,t)=>{t.d(n,{A:()=>c});var r=t(3367),o=t(1954),i=t(225),u=t(5884),a=t(7664),s=t(6548);const d=function(e,n,t,r){if(!(0,a.A)(e))return e;for(var d=-1,c=(n=(0,i.A)(n,e)).length,h=c-1,f=e;null!=f&&++d{t.d(n,{A:()=>o});var r=t(2791);const o=function(e,n,t){for(var o=-1,i=e.length;++o{t.d(n,{A:()=>g});var r=/\s/;const o=function(e){for(var n=e.length;n--&&r.test(e.charAt(n)););return n};var i=/^\s+/;const u=function(e){return e?e.slice(0,o(e)+1).replace(i,""):e};var a=t(7664),s=t(2791),d=/^[-+]0x[0-9a-f]+$/i,c=/^0b[01]+$/i,h=/^0o[0-7]+$/i,f=parseInt;const v=function(e){if("number"==typeof e)return e;if((0,s.A)(e))return NaN;if((0,a.A)(e)){var n="function"==typeof e.valueOf?e.valueOf():e;e=(0,a.A)(n)?n+"":n}if("string"!=typeof e)return 0===e?e:+e;e=u(e);var t=c.test(e);return t||h.test(e)?f(e.slice(2),t?2:8):d.test(e)?NaN:+e};var l=1/0;const g=function(e){return e?(e=v(e))===l||e===-1/0?17976931348623157e292*(e<0?-1:1):e===e?e:0:0===e?e:0}},3678:(e,n,t)=>{t.d(n,{A:()=>u});var r=t(4802),o=t(5386),i=t(3239);const u=function(e){return"string"==typeof e||!(0,o.A)(e)&&(0,i.A)(e)&&"[object String]"==(0,r.A)(e)}},4211:(e,n,t)=>{t.d(n,{A:()=>r});const r=function(e){var n=null==e?0:e.length;return n?e[n-1]:void 0}},4645:(e,n,t)=>{t.d(n,{A:()=>i});var r=t(2578),o=t(3493);const i=function(e,n){var t=-1,i=(0,o.A)(e)?Array(e.length):[];return(0,r.A)(e,(function(e,r,o){i[++t]=n(e,r,o)})),i}},4833:(e,n,t)=>{t.d(n,{A:()=>d});var r=t(1869),o=t(5009),i=t(8635),u=t(9778),a=Object.prototype,s=a.hasOwnProperty;const d=(0,r.A)((function(e,n){e=Object(e);var t=-1,r=n.length,d=r>2?n[2]:void 0;for(d&&(0,i.A)(n[0],n[1],d)&&(r=1);++t{t.d(n,{A:()=>r});const r=function(e,n){return e{t.d(n,{A:()=>o});var r=t(7545);const o=function(e){return(null==e?0:e.length)?(0,r.A)(e,1):[]}},6230:(e,n,t)=>{t.d(n,{A:()=>o});var r=t(3484);const o=function(e){var n=(0,r.A)(e),t=n%1;return n===n?t?n-t:n:0}},8293:(e,n,t)=>{t.d(n,{A:()=>a});var r=t(779),o=t(378),i=t(4645),u=t(5386);const a=function(e,n){return((0,u.A)(e)?r.A:i.A)(e,(0,o.A)(n,3))}},9031:(e,n,t)=>{t.d(n,{A:()=>u});var r=t(2544),o=t(5731),i=t(2041);const u=function(e){return e&&e.length?(0,r.A)(e,i.A,o.A):void 0}},9330:(e,n,t)=>{t.d(n,{T:()=>w});var r=t(4431),o=t(4067),i=t(4175),u=t(2825),a=t(7590),s=t(1109),d=t(6772),c=t(7545),h=t(1869),f=t(1837),v=t(4586);const l=(0,h.A)((function(e){return(0,f.A)((0,c.A)(e,1,v.A,!0))}));var g=t(1432),p=t(3175),A="\0";class w{constructor(){let e=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};this._isDirected=!Object.prototype.hasOwnProperty.call(e,"directed")||e.directed,this._isMultigraph=!!Object.prototype.hasOwnProperty.call(e,"multigraph")&&e.multigraph,this._isCompound=!!Object.prototype.hasOwnProperty.call(e,"compound")&&e.compound,this._label=void 0,this._defaultNodeLabelFn=r.A(void 0),this._defaultEdgeLabelFn=r.A(void 0),this._nodes={},this._isCompound&&(this._parent={},this._children={},this._children[A]={}),this._in={},this._preds={},this._out={},this._sucs={},this._edgeObjs={},this._edgeLabels={}}isDirected(){return this._isDirected}isMultigraph(){return this._isMultigraph}isCompound(){return this._isCompound}setGraph(e){return this._label=e,this}graph(){return this._label}setDefaultNodeLabel(e){return o.A(e)||(e=r.A(e)),this._defaultNodeLabelFn=e,this}nodeCount(){return this._nodeCount}nodes(){return i.A(this._nodes)}sources(){var e=this;return u.A(this.nodes(),(function(n){return a.A(e._in[n])}))}sinks(){var e=this;return u.A(this.nodes(),(function(n){return a.A(e._out[n])}))}setNodes(e,n){var t=arguments,r=this;return s.A(e,(function(e){t.length>1?r.setNode(e,n):r.setNode(e)})),this}setNode(e,n){return Object.prototype.hasOwnProperty.call(this._nodes,e)?(arguments.length>1&&(this._nodes[e]=n),this):(this._nodes[e]=arguments.length>1?n:this._defaultNodeLabelFn(e),this._isCompound&&(this._parent[e]=A,this._children[e]={},this._children[A][e]=!0),this._in[e]={},this._preds[e]={},this._out[e]={},this._sucs[e]={},++this._nodeCount,this)}node(e){return this._nodes[e]}hasNode(e){return Object.prototype.hasOwnProperty.call(this._nodes,e)}removeNode(e){if(Object.prototype.hasOwnProperty.call(this._nodes,e)){var n=e=>this.removeEdge(this._edgeObjs[e]);delete this._nodes[e],this._isCompound&&(this._removeFromParentsChildList(e),delete this._parent[e],s.A(this.children(e),(e=>{this.setParent(e)})),delete this._children[e]),s.A(i.A(this._in[e]),n),delete this._in[e],delete this._preds[e],s.A(i.A(this._out[e]),n),delete this._out[e],delete this._sucs[e],--this._nodeCount}return this}setParent(e,n){if(!this._isCompound)throw new Error("Cannot set parent in a non-compound graph");if(d.A(n))n=A;else{for(var t=n+="";!d.A(t);t=this.parent(t))if(t===e)throw new Error("Setting "+n+" as parent of "+e+" would create a cycle");this.setNode(n)}return this.setNode(e),this._removeFromParentsChildList(e),this._parent[e]=n,this._children[n][e]=!0,this}_removeFromParentsChildList(e){delete this._children[this._parent[e]][e]}parent(e){if(this._isCompound){var n=this._parent[e];if(n!==A)return n}}children(e){if(d.A(e)&&(e=A),this._isCompound){var n=this._children[e];if(n)return i.A(n)}else{if(e===A)return this.nodes();if(this.hasNode(e))return[]}}predecessors(e){var n=this._preds[e];if(n)return i.A(n)}successors(e){var n=this._sucs[e];if(n)return i.A(n)}neighbors(e){var n=this.predecessors(e);if(n)return l(n,this.successors(e))}isLeaf(e){return 0===(this.isDirected()?this.successors(e):this.neighbors(e)).length}filterNodes(e){var n=new this.constructor({directed:this._isDirected,multigraph:this._isMultigraph,compound:this._isCompound});n.setGraph(this.graph());var t=this;s.A(this._nodes,(function(t,r){e(r)&&n.setNode(r,t)})),s.A(this._edgeObjs,(function(e){n.hasNode(e.v)&&n.hasNode(e.w)&&n.setEdge(e,t.edge(e))}));var r={};function o(e){var i=t.parent(e);return void 0===i||n.hasNode(i)?(r[e]=i,i):i in r?r[i]:o(i)}return this._isCompound&&s.A(n.nodes(),(function(e){n.setParent(e,o(e))})),n}setDefaultEdgeLabel(e){return o.A(e)||(e=r.A(e)),this._defaultEdgeLabelFn=e,this}edgeCount(){return this._edgeCount}edges(){return g.A(this._edgeObjs)}setPath(e,n){var t=this,r=arguments;return p.A(e,(function(e,o){return r.length>1?t.setEdge(e,o,n):t.setEdge(e,o),o})),this}setEdge(){var e,n,t,r,o=!1,i=arguments[0];"object"===typeof i&&null!==i&&"v"in i?(e=i.v,n=i.w,t=i.name,2===arguments.length&&(r=arguments[1],o=!0)):(e=i,n=arguments[1],t=arguments[3],arguments.length>2&&(r=arguments[2],o=!0)),e=""+e,n=""+n,d.A(t)||(t=""+t);var u=y(this._isDirected,e,n,t);if(Object.prototype.hasOwnProperty.call(this._edgeLabels,u))return o&&(this._edgeLabels[u]=r),this;if(!d.A(t)&&!this._isMultigraph)throw new Error("Cannot set a named edge when isMultigraph = false");this.setNode(e),this.setNode(n),this._edgeLabels[u]=o?r:this._defaultEdgeLabelFn(e,n,t);var a=function(e,n,t,r){var o=""+n,i=""+t;if(!e&&o>i){var u=o;o=i,i=u}var a={v:o,w:i};r&&(a.name=r);return a}(this._isDirected,e,n,t);return e=a.v,n=a.w,Object.freeze(a),this._edgeObjs[u]=a,b(this._preds[n],e),b(this._sucs[e],n),this._in[n][u]=a,this._out[e][u]=a,this._edgeCount++,this}edge(e,n,t){var r=1===arguments.length?_(this._isDirected,arguments[0]):y(this._isDirected,e,n,t);return this._edgeLabels[r]}hasEdge(e,n,t){var r=1===arguments.length?_(this._isDirected,arguments[0]):y(this._isDirected,e,n,t);return Object.prototype.hasOwnProperty.call(this._edgeLabels,r)}removeEdge(e,n,t){var r=1===arguments.length?_(this._isDirected,arguments[0]):y(this._isDirected,e,n,t),o=this._edgeObjs[r];return o&&(e=o.v,n=o.w,delete this._edgeLabels[r],delete this._edgeObjs[r],m(this._preds[n],e),m(this._sucs[e],n),delete this._in[n][r],delete this._out[e][r],this._edgeCount--),this}inEdges(e,n){var t=this._in[e];if(t){var r=g.A(t);return n?u.A(r,(function(e){return e.v===n})):r}}outEdges(e,n){var t=this._out[e];if(t){var r=g.A(t);return n?u.A(r,(function(e){return e.w===n})):r}}nodeEdges(e,n){var t=this.inEdges(e,n);if(t)return t.concat(this.outEdges(e,n))}}function b(e,n){e[n]?e[n]++:e[n]=1}function m(e,n){--e[n]||delete e[n]}function y(e,n,t,r){var o=""+n,i=""+t;if(!e&&o>i){var u=o;o=i,i=u}return o+"\x01"+i+"\x01"+(d.A(r)?"\0":r)}function _(e,n){return y(e,n.v,n.w,n.name)}w.prototype._nodeCount=0,w.prototype._edgeCount=0}}]); -//# sourceMappingURL=62.785a92ce.chunk.js.map \ No newline at end of file diff --git a/frontend/deployed/static/js/62.785a92ce.chunk.js.map b/frontend/deployed/static/js/62.785a92ce.chunk.js.map deleted file mode 100644 index 4f0661f..0000000 --- a/frontend/deployed/static/js/62.785a92ce.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"static/js/62.785a92ce.chunk.js","mappings":"6IAGIA,EAAY,EAwBhB,QALA,SAAkBC,GAChB,IAAIC,IAAOF,EACX,OAAOG,EAAAA,EAAAA,GAASF,GAAUC,CAC5B,E,kCCxBIE,EAAaC,KAAKC,KAClBC,EAAYF,KAAKG,IAyBrB,QAZA,SAAmBC,EAAOC,EAAKC,EAAMC,GAKnC,IAJA,IAAIC,GAAS,EACTC,EAASP,EAAUH,GAAYM,EAAMD,IAAUE,GAAQ,IAAK,GAC5DI,EAASC,MAAMF,GAEZA,KACLC,EAAOH,EAAYE,IAAWD,GAASJ,EACvCA,GAASE,EAEX,OAAOI,CACT,E,wBCoBA,QClCA,SAAqBH,GACnB,OAAO,SAASH,EAAOC,EAAKC,GAa1B,OAZIA,GAAuB,iBAARA,IAAoBM,EAAAA,EAAAA,GAAeR,EAAOC,EAAKC,KAChED,EAAMC,OAAOO,GAGfT,GAAQU,EAAAA,EAAAA,GAASV,QACLS,IAARR,GACFA,EAAMD,EACNA,EAAQ,GAERC,GAAMS,EAAAA,EAAAA,GAAST,GAEjBC,OAAgBO,IAATP,EAAsBF,EAAQC,EAAM,GAAK,GAAKS,EAAAA,EAAAA,GAASR,GACvDS,EAAUX,EAAOC,EAAKC,EAAMC,EACrC,CACF,CDgBYS,G,aEpCZ,MAAMC,EACJC,WAAAA,GACE,IAAIC,EAAW,CAAC,EAChBA,EAASC,MAAQD,EAASE,MAAQF,EAClCG,KAAKC,UAAYJ,CACnB,CACAK,OAAAA,GACE,IAAIL,EAAWG,KAAKC,UAChBE,EAAQN,EAASE,MACrB,GAAII,IAAUN,EAEZ,OADAO,EAAOD,GACAA,CAEX,CACAE,OAAAA,CAAQF,GACN,IAAIN,EAAWG,KAAKC,UAChBE,EAAMJ,OAASI,EAAML,OACvBM,EAAOD,GAETA,EAAML,MAAQD,EAASC,MACvBD,EAASC,MAAMC,MAAQI,EACvBN,EAASC,MAAQK,EACjBA,EAAMJ,MAAQF,CAChB,CACArB,QAAAA,GAIE,IAHA,IAAI8B,EAAO,GACPT,EAAWG,KAAKC,UAChBM,EAAOV,EAASE,MACbQ,IAASV,GACdS,EAAKE,KAAKC,KAAKC,UAAUH,EAAMI,IAC/BJ,EAAOA,EAAKR,MAEd,MAAO,IAAMO,EAAKM,KAAK,MAAQ,GACjC,EAGF,SAASR,EAAOD,GACdA,EAAMJ,MAAMD,MAAQK,EAAML,MAC1BK,EAAML,MAAMC,MAAQI,EAAMJ,aACnBI,EAAML,aACNK,EAAMJ,KACf,CAEA,SAASY,EAAeE,EAAGC,GACzB,GAAU,UAAND,GAAuB,UAANA,EACnB,OAAOC,CAEX,CCzCA,IAAIC,EAAoBC,EAAAA,EAAW,GAEnC,SAASC,EAAUC,EAAGC,GACpB,GAAID,EAAEE,aAAe,EACnB,MAAO,GAET,IAAIC,EAkEN,SAAoBH,EAAGC,GACrB,IAAIG,EAAW,IAAIC,EAAAA,EACfC,EAAQ,EACRC,EAAS,EAEbT,EAAAA,EAAUE,EAAEQ,SAAS,SAAUZ,GAC7BQ,EAASK,QAAQb,EAAG,CAAEA,EAAGA,EAAGc,GAAI,EAAGC,IAAK,GAC1C,IAIAb,EAAAA,EAAUE,EAAEY,SAAS,SAAUC,GAC7B,IAAIC,EAAaV,EAASW,KAAKF,EAAEjB,EAAGiB,EAAEG,IAAM,EACxCC,EAAShB,EAASY,GAClBK,EAAaJ,EAAaG,EAC9Bb,EAASe,QAAQN,EAAEjB,EAAGiB,EAAEG,EAAGE,GAC3BX,EAAS/C,KAAKG,IAAI4C,EAASH,EAASgB,KAAKP,EAAEjB,GAAGe,KAAOM,GACrDX,EAAQ9C,KAAKG,IAAI2C,EAAQF,EAASgB,KAAKP,EAAEG,GAAO,IAAKC,EACvD,IAEA,IAAII,EAAUvB,EAAQS,EAASD,EAAQ,GAAGgB,KAAI,WAC5C,OAAO,IAAI7C,CACb,IACI8C,EAAUjB,EAAQ,EAMtB,OAJAR,EAAAA,EAAUM,EAASI,SAAS,SAAUZ,GACpC4B,EAAaH,EAASE,EAASnB,EAASgB,KAAKxB,GAC/C,IAEO,CAAE6B,MAAOrB,EAAUiB,QAASA,EAASE,QAASA,EACvD,CAhGcG,CAAW1B,EAAGC,GAAYJ,GAClC8B,EAUN,SAAqB3B,EAAGqB,EAASE,GAC/B,IAIItC,EAJA0C,EAAU,GACVC,EAAUP,EAAQA,EAAQpD,OAAS,GACnC4D,EAAQR,EAAQ,GAGpB,KAAOrB,EAAEE,aAAa,CACpB,KAAQjB,EAAQ4C,EAAM7C,WACpB8C,EAAW9B,EAAGqB,EAASE,EAAStC,GAElC,KAAQA,EAAQ2C,EAAQ5C,WACtB8C,EAAW9B,EAAGqB,EAASE,EAAStC,GAElC,GAAIe,EAAEE,YACJ,IAAK,IAAI6B,EAAIV,EAAQpD,OAAS,EAAG8D,EAAI,IAAKA,EAExC,GADA9C,EAAQoC,EAAQU,GAAG/C,UACR,CACT2C,EAAUA,EAAQK,OAAOF,EAAW9B,EAAGqB,EAASE,EAAStC,GAAO,IAChE,KACF,CAGN,CAEA,OAAO0C,CACT,CAnCgBM,CAAY9B,EAAMsB,MAAOtB,EAAMkB,QAASlB,EAAMoB,SAG5D,OAAOzB,EAAAA,EACLA,EAAAA,EAAM6B,GAAS,SAAUd,GACvB,OAAOb,EAAEkC,SAASrB,EAAEjB,EAAGiB,EAAEG,EAC3B,IAEJ,CA6BA,SAASc,EAAW9B,EAAGqB,EAASE,EAAStC,EAAOkD,GAC9C,IAAIR,EAAUQ,EAAsB,QAAK9D,EAwBzC,OAtBAyB,EAAAA,EAAUE,EAAEoC,QAAQnD,EAAMW,IAAI,SAAUmB,GACtC,IAAIE,EAASjB,EAAEe,KAAKA,GAChBsB,EAASrC,EAAEoB,KAAKL,EAAKnB,GAErBuC,GACFR,EAAQrC,KAAK,CAAEM,EAAGmB,EAAKnB,EAAGoB,EAAGD,EAAKC,IAGpCqB,EAAO1B,KAAOM,EACdO,EAAaH,EAASE,EAASc,EACjC,IAEAvC,EAAAA,EAAUE,EAAEkC,SAASjD,EAAMW,IAAI,SAAUmB,GACvC,IAAIE,EAASjB,EAAEe,KAAKA,GAChBC,EAAID,EAAKC,EACTsB,EAAStC,EAAEoB,KAAKJ,GACpBsB,EAAW,IAAKrB,EAChBO,EAAaH,EAASE,EAASe,EACjC,IAEAtC,EAAE8B,WAAW7C,EAAMW,GAEZ+B,CACT,CAkCA,SAASH,EAAaH,EAASE,EAAStC,GACjCA,EAAM0B,IAEC1B,EAAU,GAGpBoC,EAAQpC,EAAM0B,IAAM1B,EAAU,GAAIsC,GAASpC,QAAQF,GAFnDoC,EAAQA,EAAQpD,OAAS,GAAGkB,QAAQF,GAFpCoC,EAAQ,GAAGlC,QAAQF,EAMvB,CCxHA,SAASsD,EAAIvC,GACX,IAAIwC,EAA8B,WAAxBxC,EAAEyB,QAAQgB,UAAyB1C,EAAUC,EASvD,SAAkBA,GAChB,OAAO,SAAUa,GACf,OAAOb,EAAEe,KAAKF,GAAGI,MACnB,CACF,CAb0DhB,CAASD,IAgBrE,SAAgBA,GACd,IAAIwC,EAAM,GACNE,EAAQ,CAAC,EACTC,EAAU,CAAC,EAEf,SAASC,EAAIhD,GACPiD,OAAOC,UAAUC,eAAeC,KAAKL,EAAS/C,KAGlD+C,EAAQ/C,IAAK,EACb8C,EAAM9C,IAAK,EACXE,EAAAA,EAAUE,EAAEkC,SAAStC,IAAI,SAAUiB,GAC7BgC,OAAOC,UAAUC,eAAeC,KAAKN,EAAO7B,EAAEG,GAChDwB,EAAIlD,KAAKuB,GAET+B,EAAI/B,EAAEG,EAEV,WACO0B,EAAM9C,GACf,CAGA,OADAE,EAAAA,EAAUE,EAAEQ,QAASoC,GACdJ,CACT,CAvC2ES,CAAOjD,GAChFF,EAAAA,EAAU0C,GAAK,SAAU3B,GACvB,IAAIqC,EAAQlD,EAAEe,KAAKF,GACnBb,EAAEmD,WAAWtC,GACbqC,EAAME,YAAcvC,EAAEwC,KACtBH,EAAMI,UAAW,EACjBtD,EAAEmB,QAAQN,EAAEG,EAAGH,EAAEjB,EAAGsD,EAAOpD,EAAW,OACxC,GAOF,C,kCCFA,QANA,SAAkByD,EAAQC,GACxB,OAAOC,EAAAA,EAAAA,GAAWF,EAAQC,GAAO,SAASE,EAAOC,GAC/C,OAAOC,EAAAA,EAAAA,GAAML,EAAQI,EACvB,GACF,E,wBCQA,QCbA,SAAkBE,GAChB,OAAOC,EAAAA,EAAAA,IAAYC,EAAAA,EAAAA,GAASF,OAAMxF,EAAW2F,EAAAA,GAAUH,EAAO,GAChE,CDOWI,EAAS,SAASV,EAAQC,GACnC,OAAiB,MAAVD,EAAiB,CAAC,EAAIW,EAASX,EAAQC,EAChD,I,wBETA,QAJA,SAAgBE,EAAOS,GACrB,OAAOT,EAAQS,CACjB,E,cCiBA,QANA,SAAaC,GACX,OAAQA,GAASA,EAAMnG,QACnBoG,EAAAA,EAAAA,GAAaD,EAAOE,EAAAA,EAAUC,QAC9BlG,CACN,E,2CCgBA,QAVA,SAAmBkF,EAAQiB,GACzB,IAAItG,EAAS,CAAC,EAMd,OALAsG,GAAWC,EAAAA,EAAAA,GAAaD,EAAU,IAElCE,EAAAA,EAAAA,GAAWnB,GAAQ,SAASG,EAAOiB,EAAKpB,IACtCqB,EAAAA,EAAAA,GAAgB1G,EAAQyG,EAAKH,EAASd,EAAOiB,EAAKpB,GACpD,IACOrF,CACT,E,2CClBA,QAJU,WACR,OAAO2G,EAAAA,EAAKC,KAAKC,KACnB,ECGA,SAASC,EAAahF,EAAGiF,EAAMC,EAAO7B,GACpC,IAAIzD,EACJ,GACEA,EAAIE,EAAWuD,SACRrD,EAAEmF,QAAQvF,IAInB,OAFAsF,EAAME,MAAQH,EACdjF,EAAES,QAAQb,EAAGsF,GACNtF,CACT,CAsBA,SAASyF,EAAmBrF,GAC1B,IAAIsF,EAAa,IAAIjF,EAAAA,EAAM,CAAEkF,WAAYvF,EAAEwF,iBAAkBC,SAASzF,EAAEyB,SASxE,OARA3B,EAAAA,EAAUE,EAAEQ,SAAS,SAAUZ,GACxBI,EAAE0F,SAAS9F,GAAG3B,QACjBqH,EAAW7E,QAAQb,EAAGI,EAAEoB,KAAKxB,GAEjC,IACAE,EAAAA,EAAUE,EAAEY,SAAS,SAAUC,GAC7ByE,EAAWnE,QAAQN,EAAGb,EAAEe,KAAKF,GAC/B,IACOyE,CACT,CA4BA,SAASK,EAAcC,EAAMC,GAC3B,IAcIC,EAAIC,EAdJC,EAAIJ,EAAKI,EACTC,EAAIL,EAAKK,EAITC,EAAKL,EAAMG,EAAIA,EACfG,EAAKN,EAAMI,EAAIA,EACfjF,EAAI4E,EAAKQ,MAAQ,EACjBC,EAAIT,EAAKU,OAAS,EAEtB,IAAKJ,IAAOC,EACV,MAAM,IAAII,MAAM,6DAoBlB,OAhBI/I,KAAKgJ,IAAIL,GAAMnF,EAAIxD,KAAKgJ,IAAIN,GAAMG,GAEhCF,EAAK,IACPE,GAAKA,GAEPP,EAAMO,EAAIH,EAAMC,EAChBJ,EAAKM,IAGDH,EAAK,IACPlF,GAAKA,GAEP8E,EAAK9E,EACL+E,EAAM/E,EAAImF,EAAMD,GAGX,CAAEF,EAAGA,EAAIF,EAAIG,EAAGA,EAAIF,EAC7B,CAMA,SAASU,EAAiBzG,GACxB,IAAI0G,EAAW5G,EAAAA,EAAMA,EAAQ6G,EAAQ3G,GAAK,IAAI,WAC5C,MAAO,EACT,IAQA,OAPAF,EAAAA,EAAUE,EAAEQ,SAAS,SAAUZ,GAC7B,IAAIwB,EAAOpB,EAAEoB,KAAKxB,GACdgH,EAAOxF,EAAKwF,KACX9G,EAAAA,EAAc8G,KACjBF,EAASE,GAAMxF,EAAKyF,OAASjH,EAEjC,IACO8G,CACT,CAkDA,SAASI,EAAc9G,EAAG5C,EAAQwJ,EAAMC,GACtC,IAAIzF,EAAO,CACTgF,MAAO,EACPE,OAAQ,GAMV,OAJIS,UAAU9I,QAAU,IACtBmD,EAAKwF,KAAOA,EACZxF,EAAKyF,MAAQA,GAER7B,EAAahF,EAAG,SAAUoB,EAAMhE,EACzC,CAEA,SAASuJ,EAAQ3G,GACf,OAAOF,EACLA,EAAAA,EAAME,EAAEQ,SAAS,SAAUZ,GACzB,IAAIgH,EAAO5G,EAAEoB,KAAKxB,GAAGgH,KACrB,IAAK9G,EAAAA,EAAc8G,GACjB,OAAOA,CAEX,IAEJ,CAuBA,SAASI,EAAK3D,EAAM4D,GAClB,IAAIrJ,EAAQkC,IACZ,IACE,OAAOmH,GACT,CAAE,QACAC,QAAQC,IAAI9D,EAAO,WAAavD,IAAUlC,GAAS,KACrD,CACF,CAEA,SAASwJ,GAAO/D,EAAM4D,GACpB,OAAOA,GACT,CC/NA,SAASH,GAAc9G,EAAGqH,EAAMjK,EAAQkK,EAAIC,EAAQX,GAClD,IAAI1D,EAAQ,CAAEkD,MAAO,EAAGE,OAAQ,EAAGM,KAAMA,EAAMY,WAAYH,GACvDI,EAAOF,EAAOF,GAAMT,EAAO,GAC3BvH,EAAOqI,EAAkB1H,EAAG,SAAUkD,EAAO9F,GACjDmK,EAAOF,GAAMT,GAAQvH,EACrBW,EAAE2H,UAAUtI,EAAMiI,GACdG,GACFzH,EAAEmB,QAAQsG,EAAMpI,EAAM,CAAE4B,OAAQ,GAEpC,CCxBA,SAAS2G,GAAK5H,GACZ,IAAI6H,EAAU7H,EAAEyB,QAAQqG,QAAQC,cAChB,OAAZF,GAAgC,OAAZA,GAyB1B,SAAkB7H,GAChBF,EAAAA,EAAUE,EAAEQ,SAAS,SAAUZ,GAC7BoI,GAAYhI,EAAEoB,KAAKxB,GACrB,IAEAE,EAAAA,EAAUE,EAAEY,SAAS,SAAUC,GAC7B,IAAIE,EAAOf,EAAEe,KAAKF,GAClBf,EAAAA,EAAUiB,EAAKkH,OAAQD,IACnBnF,OAAOC,UAAUC,eAAeC,KAAKjC,EAAM,MAC7CiH,GAAYjH,EAEhB,GACF,CApCImH,CAASlI,GAGK,OAAZ6H,GAAgC,OAAZA,KAuC1B,SAAgB7H,GACdF,EAAAA,EAAUE,EAAEQ,SAAS,SAAUZ,GAC7BuI,GAAUnI,EAAEoB,KAAKxB,GACnB,IAEAE,EAAAA,EAAUE,EAAEY,SAAS,SAAUC,GAC7B,IAAIE,EAAOf,EAAEe,KAAKF,GAClBf,EAAAA,EAAUiB,EAAKkH,OAAQE,IACnBtF,OAAOC,UAAUC,eAAeC,KAAKjC,EAAM,MAC7CoH,GAAUpH,EAEd,GACF,CAlDIqH,CAAOpI,GACPqI,GAAgBrI,GAEpB,CAEA,SAASqI,GAAgBrI,GACvBF,EAAAA,EAAUE,EAAEQ,SAAS,SAAUZ,GAC7B0I,GAAmBtI,EAAEoB,KAAKxB,GAC5B,IACAE,EAAAA,EAAUE,EAAEY,SAAS,SAAUC,GAC7ByH,GAAmBtI,EAAEe,KAAKF,GAC5B,GACF,CAEA,SAASyH,GAAmBpD,GAC1B,IAAIlE,EAAIkE,EAAMkB,MACdlB,EAAMkB,MAAQlB,EAAMoB,OACpBpB,EAAMoB,OAAStF,CACjB,CAgBA,SAASgH,GAAY9C,GACnBA,EAAMe,GAAKf,EAAMe,CACnB,CAgBA,SAASkC,GAAUjD,GACjB,IAAIc,EAAId,EAAMc,EACdd,EAAMc,EAAId,EAAMe,EAChBf,EAAMe,EAAID,CACZ,CChDA,SAASzD,GAAIvC,GACXA,EAAEyB,QAAQ8G,YAAc,GACxBzI,EAAAA,EAAUE,EAAEY,SAAS,SAAUG,IAQjC,SAAuBf,EAAGa,GACxB,IAAIjB,EAAIiB,EAAEjB,EACN4I,EAAQxI,EAAEoB,KAAKxB,GAAGgH,KAClB5F,EAAIH,EAAEG,EACNyH,EAAQzI,EAAEoB,KAAKJ,GAAG4F,KAClBvD,EAAOxC,EAAEwC,KACTqF,EAAY1I,EAAEe,KAAKF,GACnB8H,EAAYD,EAAUC,UAE1B,GAAIF,IAAUD,EAAQ,EAAG,OAEzBxI,EAAEmD,WAAWtC,GAcb,IACIuE,EAAOrD,EADPmD,OAAQ7G,EAEZ,IAAK0D,EAAI,IAAKyG,EAAOA,EAAQC,IAAS1G,IAAKyG,EACzCE,EAAUT,OAAS,GAQnB7C,EAAQsC,EAAkB1H,EAAG,OAP7BkF,EAAQ,CACNkB,MAAO,EACPE,OAAQ,EACRoC,UAAWA,EACXE,QAAS/H,EACT+F,KAAM4B,GAEoC,MACxCA,IAAUG,IACZzD,EAAMkB,MAAQsC,EAAUtC,MACxBlB,EAAMoB,OAASoC,EAAUpC,OACzBpB,EAAME,MAAQ,aACdF,EAAM2D,SAAWH,EAAUG,UAE7B7I,EAAEmB,QAAQvB,EAAGwF,EAAO,CAAEnE,OAAQyH,EAAUzH,QAAUoC,GACxC,IAANtB,GACF/B,EAAEyB,QAAQ8G,YAAYjJ,KAAK8F,GAE7BxF,EAAIwF,EAGNpF,EAAEmB,QAAQvB,EAAGoB,EAAG,CAAEC,OAAQyH,EAAUzH,QAAUoC,EAChD,CA1DIyF,CAAc9I,EAAGe,EACnB,GACF,C,eCEA,SANA,SAAeqD,EAAOI,GACpB,OAAQJ,GAASA,EAAMnG,QACnBoG,EAAAA,EAAAA,GAAaD,GAAOK,EAAAA,EAAAA,GAAaD,EAAU,GAAIuE,GAAAA,QAC/C1K,CACN,ECNA,SAAS2K,GAAYhJ,GACnB,IAAI2C,EAAU,CAAC,EA2Bf7C,EAAAA,EAAUE,EAAE4B,WAzBZ,SAASgB,EAAIhD,GACX,IAAIsD,EAAQlD,EAAEoB,KAAKxB,GACnB,GAAIiD,OAAOC,UAAUC,eAAeC,KAAKL,EAAS/C,GAChD,OAAOsD,EAAM0D,KAEfjE,EAAQ/C,IAAK,EAEb,IAAIgH,EAAO9G,EAAAA,EACTA,EAAAA,EAAME,EAAEkC,SAAStC,IAAI,SAAUiB,GAC7B,OAAO+B,EAAI/B,EAAEG,GAAKhB,EAAEe,KAAKF,GAAGoI,MAC9B,KAYF,OARErC,IAASsC,OAAOC,wBACP9K,IAATuI,GACS,OAATA,IAGAA,EAAO,GAGD1D,EAAM0D,KAAOA,CACvB,GAGF,CAMA,SAASwC,GAAMpJ,EAAGa,GAChB,OAAOb,EAAEoB,KAAKP,EAAEG,GAAG4F,KAAO5G,EAAEoB,KAAKP,EAAEjB,GAAGgH,KAAO5G,EAAEe,KAAKF,GAAGoI,MACzD,CC/BA,SAASI,GAAarJ,GACpB,IAOIe,EAAMuI,EAPNC,EAAI,IAAIlJ,EAAAA,EAAM,CAAEmJ,UAAU,IAG1B5L,EAAQoC,EAAEQ,QAAQ,GAClBiJ,EAAOzJ,EAAEE,YAIb,IAHAqJ,EAAE9I,QAAQ7C,EAAO,CAAC,GAGX8L,GAAUH,EAAGvJ,GAAKyJ,GACvB1I,EAAO4I,GAAiBJ,EAAGvJ,GAC3BsJ,EAAQC,EAAEpE,QAAQpE,EAAKnB,GAAKwJ,GAAMpJ,EAAGe,IAASqI,GAAMpJ,EAAGe,GACvD6I,GAAWL,EAAGvJ,EAAGsJ,GAGnB,OAAOC,CACT,CAMA,SAASG,GAAUH,EAAGvJ,GAcpB,OADAF,EAAAA,EAAUyJ,EAAE/I,SAZZ,SAASoC,EAAIhD,GACXE,EAAAA,EAAUE,EAAE6J,UAAUjK,IAAI,SAAUiB,GAClC,IAAIiJ,EAAQjJ,EAAEjB,EACZoB,EAAIpB,IAAMkK,EAAQjJ,EAAEG,EAAI8I,EACrBP,EAAEpE,QAAQnE,IAAOoI,GAAMpJ,EAAGa,KAC7B0I,EAAE9I,QAAQO,EAAG,CAAC,GACduI,EAAEpI,QAAQvB,EAAGoB,EAAG,CAAC,GACjB4B,EAAI5B,GAER,GACF,IAGOuI,EAAErJ,WACX,CAMA,SAASyJ,GAAiBJ,EAAGvJ,GAC3B,OAAOF,GAAQE,EAAEY,SAAS,SAAUC,GAClC,GAAI0I,EAAEpE,QAAQtE,EAAEjB,KAAO2J,EAAEpE,QAAQtE,EAAEG,GACjC,OAAOoI,GAAMpJ,EAAGa,EAEpB,GACF,CAEA,SAAS+I,GAAWL,EAAGvJ,EAAGsJ,GACxBxJ,EAAAA,EAAUyJ,EAAE/I,SAAS,SAAUZ,GAC7BI,EAAEoB,KAAKxB,GAAGgH,MAAQ0C,CACpB,GACF,C,yBCjF0BxJ,EAAAA,EAAW,GCDXA,EAAAA,EAAW,G,iCCKrBiK,E,QAAAA,GAAa,UCGVC,OAAO,uFCX1B,IAAIC,GAAgB,kBAQhBC,GAAW,IAAMD,GAAgB,IACjCE,GAAU,kDACVC,GAAS,2BAETC,GAAc,KAAOJ,GAAgB,IACrCK,GAAa,kCACbC,GAAa,qCAIbC,GAPa,MAAQL,GAAU,IAAMC,GAAS,IAOtB,IACxBK,GAAW,oBAEXC,GAAQD,GAAWD,IADP,gBAAwB,CAACH,GAAaC,GAAYC,IAAY7K,KAAK,KAAO,IAAM+K,GAAWD,GAAW,MAElHG,GAAW,MAAQ,CAACN,GAAcF,GAAU,IAAKA,GAASG,GAAYC,GAAYL,IAAUxK,KAAK,KAAO,IAG5FsK,OAAOI,GAAS,MAAQA,GAAS,KAAOO,GAAWD,GAAO,KCQ1E,SAASE,KAAkB,CAC3BA,GAAe9H,UAAY,IAAIyD,M,eCvB/B,SAAS3D,GAAI5C,EAAG6K,EAAIhE,GACb/G,GAAAA,EAAU+K,KACbA,EAAK,CAACA,IAGR,IAAIC,GAAc9K,EAAE+K,aAAe/K,EAAEgL,WAAahL,EAAEiL,WAAWC,KAAKlL,GAEhEmL,EAAM,GACNxI,EAAU,CAAC,EAQf,OAPA7C,EAAAA,EAAO+K,GAAI,SAAUjL,GACnB,IAAKI,EAAEmF,QAAQvF,GACb,MAAM,IAAI2G,MAAM,6BAA+B3G,GAGjDwL,GAAMpL,EAAGJ,EAAa,SAAViH,EAAkBlE,EAASmI,EAAYK,EACrD,IACOA,CACT,CAEA,SAASC,GAAMpL,EAAGJ,EAAGyL,EAAW1I,EAASmI,EAAYK,GAC9CtI,OAAOC,UAAUC,eAAeC,KAAKL,EAAS/C,KACjD+C,EAAQ/C,IAAK,EAERyL,GACHF,EAAI7L,KAAKM,GAEXE,EAAAA,EAAOgL,EAAWlL,IAAI,SAAUoB,GAC9BoK,GAAMpL,EAAGgB,EAAGqK,EAAW1I,EAASmI,EAAYK,EAC9C,IACIE,GACFF,EAAI7L,KAAKM,GAGf,C,QCIA,SAAS0L,GAAetL,GACtBA,EdZF,SAAkBA,GAChB,IAAIsF,GAAa,IAAIjF,EAAAA,GAAQoF,SAASzF,EAAEyB,SAYxC,OAXA3B,EAAAA,EAAUE,EAAEQ,SAAS,SAAUZ,GAC7B0F,EAAW7E,QAAQb,EAAGI,EAAEoB,KAAKxB,GAC/B,IACAE,EAAAA,EAAUE,EAAEY,SAAS,SAAUC,GAC7B,IAAI0K,EAAcjG,EAAWvE,KAAKF,EAAEjB,EAAGiB,EAAEG,IAAM,CAAEC,OAAQ,EAAGgI,OAAQ,GAChE/F,EAAQlD,EAAEe,KAAKF,GACnByE,EAAWnE,QAAQN,EAAEjB,EAAGiB,EAAEG,EAAG,CAC3BC,OAAQsK,EAAYtK,OAASiC,EAAMjC,OACnCgI,OAAQzL,KAAKG,IAAI4N,EAAYtC,OAAQ/F,EAAM+F,SAE/C,IACO3D,CACT,CcFMkG,CAASxL,GACbgJ,GAAYhJ,GACZ,IAIIa,EAJA0I,EAAIF,GAAarJ,GAKrB,IAJAyL,GAAiBlC,GACjBmC,GAAcnC,EAAGvJ,GAGTa,EAAI8K,GAAUpC,IAEpBqC,GAAcrC,EAAGvJ,EAAGa,EADhBgL,GAAUtC,EAAGvJ,EAAGa,GAGxB,CAKA,SAAS6K,GAAcnC,EAAGvJ,GACxB,IAAI6K,EC/DN,SAAmB7K,EAAG6K,GACpB,OAAOjI,GAAI5C,EAAG6K,EAAI,OACpB,CD6DWiB,CAAcvC,EAAGA,EAAE/I,SAC5BqK,EAAKA,EAAGkB,MAAM,EAAGlB,EAAG5M,OAAS,GAC7B6B,EAAAA,EAAU+K,GAAI,SAAUjL,IAK1B,SAAwB2J,EAAGvJ,EAAGgM,GAC5B,IAAIC,EAAW1C,EAAEnI,KAAK4K,GAClBE,EAASD,EAASC,OACtB3C,EAAExI,KAAKiL,EAAOE,GAAQC,SAAWC,GAAa7C,EAAGvJ,EAAGgM,EACtD,CARIK,CAAe9C,EAAGvJ,EAAGJ,EACvB,GACF,CAYA,SAASwM,GAAa7C,EAAGvJ,EAAGgM,GAC1B,IACIE,EADW3C,EAAEnI,KAAK4K,GACAE,OAElBI,GAAc,EAEdC,EAAYvM,EAAEe,KAAKiL,EAAOE,GAE1BM,EAAW,EAyBf,OAvBKD,IACHD,GAAc,EACdC,EAAYvM,EAAEe,KAAKmL,EAAQF,IAG7BQ,EAAWD,EAAUtL,OAErBnB,EAAAA,EAAUE,EAAE6J,UAAUmC,IAAQ,SAAUnL,GACtC,IA2HsB4L,EAAG7M,EA3HrB8M,EAAY7L,EAAEjB,IAAMoM,EACtB7H,EAAQuI,EAAY7L,EAAEG,EAAIH,EAAEjB,EAE9B,GAAIuE,IAAU+H,EAAQ,CACpB,IAAIS,EAAeD,IAAcJ,EAC/BM,EAAc5M,EAAEe,KAAKF,GAAGI,OAG1B,GADAuL,GAAYG,EAAeC,GAAeA,EAoHtBH,EAnHFT,EAmHKpM,EAnHEuE,EAAVoF,EAoHPsD,QAAQJ,EAAG7M,GApHc,CAC/B,IAAIkN,EAAgBvD,EAAExI,KAAKiL,EAAO7H,GAAOgI,SACzCK,GAAYG,GAAgBG,EAAgBA,CAC9C,CACF,CACF,IAEON,CACT,CAEA,SAASf,GAAiBsB,EAAMlI,GAC1BkC,UAAU9I,OAAS,IACrB4G,EAAOkI,EAAKvM,QAAQ,IAEtBwM,GAAgBD,EAAM,CAAC,EAAG,EAAGlI,EAC/B,CAEA,SAASmI,GAAgBD,EAAMpK,EAASsK,EAASrN,EAAGsM,GAClD,IAAIgB,EAAMD,EACN/J,EAAQ6J,EAAK3L,KAAKxB,GAkBtB,OAhBA+C,EAAQ/C,IAAK,EACbE,EAAAA,EAAUiN,EAAK9B,UAAUrL,IAAI,SAAUoB,GAChC6B,OAAOC,UAAUC,eAAeC,KAAKL,EAAS3B,KACjDiM,EAAUD,GAAgBD,EAAMpK,EAASsK,EAASjM,EAAGpB,GAEzD,IAEAsD,EAAMgK,IAAMA,EACZhK,EAAMiK,IAAMF,IACRf,EACFhJ,EAAMgJ,OAASA,SAGRhJ,EAAMgJ,OAGRe,CACT,CAEA,SAAStB,GAAUoB,GACjB,OAAOjN,GAAAA,EAAOiN,EAAKnM,SAAS,SAAUC,GACpC,OAAOkM,EAAKhM,KAAKF,GAAGsL,SAAW,CACjC,GACF,CAEA,SAASN,GAAUtC,EAAGvJ,EAAGe,GACvB,IAAInB,EAAImB,EAAKnB,EACToB,EAAID,EAAKC,EAKRhB,EAAE6M,QAAQjN,EAAGoB,KAChBpB,EAAImB,EAAKC,EACTA,EAAID,EAAKnB,GAGX,IAAIwN,EAAS7D,EAAEnI,KAAKxB,GAChByN,EAAS9D,EAAEnI,KAAKJ,GAChBsM,EAAYF,EACZG,GAAO,EAIPH,EAAOD,IAAME,EAAOF,MACtBG,EAAYD,EACZE,GAAO,GAGT,IAAIC,EAAa1N,GAAAA,EAASE,EAAEY,SAAS,SAAUG,GAC7C,OACEwM,IAASE,GAAalE,EAAGA,EAAEnI,KAAKL,EAAKnB,GAAI0N,IACzCC,IAASE,GAAalE,EAAGA,EAAEnI,KAAKL,EAAKC,GAAIsM,EAE7C,IAEA,OAAOxN,GAAQ0N,GAAY,SAAUzM,GACnC,OAAOqI,GAAMpJ,EAAGe,EAClB,GACF,CAEA,SAAS6K,GAAcrC,EAAGvJ,EAAGa,EAAG6M,GAC9B,IAAI9N,EAAIiB,EAAEjB,EACNoB,EAAIH,EAAEG,EACVuI,EAAEpG,WAAWvD,EAAGoB,GAChBuI,EAAEpI,QAAQuM,EAAE9N,EAAG8N,EAAE1M,EAAG,CAAC,GACrByK,GAAiBlC,GACjBmC,GAAcnC,EAAGvJ,GAInB,SAAqBuJ,EAAGvJ,GACtB,IAAI6E,EAAO/E,GAAAA,EAAOyJ,EAAE/I,SAAS,SAAUZ,GACrC,OAAQI,EAAEoB,KAAKxB,GAAGsM,MACpB,IACIrB,EE1MN,SAAkB7K,EAAG6K,GACnB,OAAOjI,GAAI5C,EAAG6K,EAAI,MACpB,CFwMWiB,CAAavC,EAAG1E,GACzBgG,EAAKA,EAAGkB,MAAM,GACdjM,EAAAA,EAAU+K,GAAI,SAAUjL,GACtB,IAAIsM,EAAS3C,EAAEnI,KAAKxB,GAAGsM,OACrBnL,EAAOf,EAAEe,KAAKnB,EAAGsM,GACjByB,GAAU,EAEP5M,IACHA,EAAOf,EAAEe,KAAKmL,EAAQtM,GACtB+N,GAAU,GAGZ3N,EAAEoB,KAAKxB,GAAGgH,KAAO5G,EAAEoB,KAAK8K,GAAQtF,MAAQ+G,EAAU5M,EAAKkI,QAAUlI,EAAKkI,OACxE,GACF,CArBE2E,CAAYrE,EAAGvJ,EACjB,CAiCA,SAASyN,GAAaV,EAAMK,EAAQS,GAClC,OAAOA,EAAUX,KAAOE,EAAOD,KAAOC,EAAOD,KAAOU,EAAUV,GAChE,CGlNA,SAASvG,GAAK5G,GACZ,OAAQA,EAAEyB,QAAQqM,QAChB,IAAK,kBASL,QACEC,GAAqB/N,SAPvB,IAAK,cAcT,SAAyBA,GACvBgJ,GAAYhJ,GACZqJ,GAAarJ,EACf,CAhBMgO,CAAgBhO,GAChB,MACF,IAAK,eACHiO,GAAkBjO,GAKxB,CH9BAsL,GAAeG,iBAAmBA,GAClCH,GAAeI,cAAgBA,GAC/BJ,GAAec,aAAeA,GAC9Bd,GAAeK,UAAYA,GAC3BL,GAAeO,UAAYA,GAC3BP,GAAeM,cAAgBA,GG4B/B,IAAIqC,GAAoBjF,GAOxB,SAAS+E,GAAqB/N,GAC5BsL,GAAetL,EACjB,C,0BCvBA,SAASuC,GAAIvC,GACX,IAAI6E,EAAO6C,EAAkB1H,EAAG,OAAQ,CAAC,EAAG,SACxCkO,EAqEN,SAAoBlO,GAClB,IAAIkO,EAAS,CAAC,EACd,SAAStL,EAAIhD,EAAGuO,GACd,IAAIzI,EAAW1F,EAAE0F,SAAS9F,GACtB8F,GAAYA,EAASzH,QACvB6B,EAAAA,EAAU4F,GAAU,SAAUsG,GAC5BpJ,EAAIoJ,EAAOmC,EAAQ,EACrB,IAEFD,EAAOtO,GAAKuO,CACd,CAIA,OAHArO,EAAAA,EAAUE,EAAE0F,YAAY,SAAU9F,GAChCgD,EAAIhD,EAAG,EACT,IACOsO,CACT,CApFeE,CAAWpO,GACpBsG,EAASxG,EAAMA,GAAAA,EAASoO,IAAW,EACnCG,EAAU,EAAI/H,EAAS,EAE3BtG,EAAEyB,QAAQ6M,YAAczJ,EAGxB/E,EAAAA,EAAUE,EAAEY,SAAS,SAAUC,GAC7Bb,EAAEe,KAAKF,GAAGoI,QAAUoF,CACtB,IAGA,IAAIpN,EA0EN,SAAoBjB,GAClB,OAAOF,GAAAA,EACLE,EAAEY,SACF,SAAUuK,EAAKtK,GACb,OAAOsK,EAAMnL,EAAEe,KAAKF,GAAGI,MACzB,GACA,EAEJ,CAlFesN,CAAWvO,GAAK,EAG7BF,EAAAA,EAAUE,EAAE0F,YAAY,SAAUsG,GAChCpJ,GAAI5C,EAAG6E,EAAMwJ,EAASpN,EAAQqF,EAAQ4H,EAAQlC,EAChD,IAIAhM,EAAEyB,QAAQ+M,eAAiBH,CAC7B,CAEA,SAASzL,GAAI5C,EAAG6E,EAAMwJ,EAASpN,EAAQqF,EAAQ4H,EAAQtO,GACrD,IAAI8F,EAAW1F,EAAE0F,SAAS9F,GAC1B,GAAK8F,EAASzH,OAAd,CAOA,IAAIwQ,EAAM/G,EAAmB1H,EAAG,OAC5B0O,EAAShH,EAAmB1H,EAAG,OAC/BkD,EAAQlD,EAAEoB,KAAKxB,GAEnBI,EAAE2H,UAAU8G,EAAK7O,GACjBsD,EAAMyL,UAAYF,EAClBzO,EAAE2H,UAAU+G,EAAQ9O,GACpBsD,EAAM0L,aAAeF,EAErB5O,EAAAA,EAAU4F,GAAU,SAAUsG,GAC5BpJ,GAAI5C,EAAG6E,EAAMwJ,EAASpN,EAAQqF,EAAQ4H,EAAQlC,GAE9C,IAAI6C,EAAY7O,EAAEoB,KAAK4K,GACnB8C,EAAWD,EAAUF,UAAYE,EAAUF,UAAY3C,EACvD+C,EAAcF,EAAUD,aAAeC,EAAUD,aAAe5C,EAChEgD,EAAaH,EAAUF,UAAY1N,EAAS,EAAIA,EAChDgI,EAAS6F,IAAaC,EAAc,EAAIzI,EAAS4H,EAAOtO,GAAK,EAEjEI,EAAEmB,QAAQsN,EAAKK,EAAU,CACvB7N,OAAQ+N,EACR/F,OAAQA,EACRgG,aAAa,IAGfjP,EAAEmB,QAAQ4N,EAAaL,EAAQ,CAC7BzN,OAAQ+N,EACR/F,OAAQA,EACRgG,aAAa,GAEjB,IAEKjP,EAAEkM,OAAOtM,IACZI,EAAEmB,QAAQ0D,EAAM4J,EAAK,CAAExN,OAAQ,EAAGgI,OAAQ3C,EAAS4H,EAAOtO,IAlC5D,MAJMA,IAAMiF,GACR7E,EAAEmB,QAAQ0D,EAAMjF,EAAG,CAAEqB,OAAQ,EAAGgI,OAAQoF,GAuC9C,C,eCrEA,SAJA,SAAmB3K,GACjB,OAAOwL,EAAAA,GAAAA,GAAUxL,EAAOyL,EAC1B,ECSA,SAASC,GAAgBpP,EAAG4G,EAAMyI,GAChC,IAAIxK,EAmCN,SAAwB7E,GACtB,IAAIJ,EACJ,KAAOI,EAAEmF,QAASvF,EAAIE,EAAW,YACjC,OAAOF,CACT,CAvCa0P,CAAetP,GACxB9B,EAAS,IAAImC,EAAAA,EAAM,CAAEkP,UAAU,IAC5B9J,SAAS,CAAEZ,KAAMA,IACjB2K,qBAAoB,SAAU5P,GAC7B,OAAOI,EAAEoB,KAAKxB,EAChB,IA2BJ,OAzBAE,EAAAA,EAAUE,EAAEQ,SAAS,SAAUZ,GAC7B,IAAIwB,EAAOpB,EAAEoB,KAAKxB,GAChBsM,EAASlM,EAAEkM,OAAOtM,IAEhBwB,EAAKwF,OAASA,GAASxF,EAAKqO,SAAW7I,GAAQA,GAAQxF,EAAKuF,WAC9DzI,EAAOuC,QAAQb,GACf1B,EAAOyJ,UAAU/H,EAAGsM,GAAUrH,GAG9B/E,EAAAA,EAAUE,EAAEqP,GAAczP,IAAI,SAAUiB,GACtC,IAAI4L,EAAI5L,EAAEjB,IAAMA,EAAIiB,EAAEG,EAAIH,EAAEjB,EAC1BmB,EAAO7C,EAAO6C,KAAK0L,EAAG7M,GACtBqB,EAAUnB,EAAAA,EAAciB,GAAsB,EAAdA,EAAKE,OACvC/C,EAAOiD,QAAQsL,EAAG7M,EAAG,CAAEqB,OAAQjB,EAAEe,KAAKF,GAAGI,OAASA,GACpD,IAEI4B,OAAOC,UAAUC,eAAeC,KAAK5B,EAAM,YAC7ClD,EAAOuC,QAAQb,EAAG,CAChB8P,WAAYtO,EAAKsO,WAAW9I,GAC5B+I,YAAavO,EAAKuO,YAAY/I,KAItC,IAEO1I,CACT,C,eC/CA,SAbA,SAAuB0R,EAAOC,EAAQC,GAMpC,IALA,IAAI9R,GAAS,EACTC,EAAS2R,EAAM3R,OACf8R,EAAaF,EAAO5R,OACpBC,EAAS,CAAC,IAELF,EAAQC,GAAQ,CACvB,IAAIyF,EAAQ1F,EAAQ+R,EAAaF,EAAO7R,QAASK,EACjDyR,EAAW5R,EAAQ0R,EAAM5R,GAAQ0F,EACnC,CACA,OAAOxF,CACT,ECGA,SAJA,SAAmB0R,EAAOC,GACxB,OAAOG,GAAcJ,GAAS,GAAIC,GAAU,GAAII,GAAAA,EAClD,E,+CCDA,SAVA,SAAoB7L,EAAO8L,GACzB,IAAIjS,EAASmG,EAAMnG,OAGnB,IADAmG,EAAM+L,KAAKD,GACJjS,KACLmG,EAAMnG,GAAUmG,EAAMnG,GAAQyF,MAEhC,OAAOU,CACT,E,0BCsBA,SA9BA,SAA0BV,EAAOS,GAC/B,GAAIT,IAAUS,EAAO,CACnB,IAAIiM,OAAyB/R,IAAVqF,EACf2M,EAAsB,OAAV3M,EACZ4M,EAAiB5M,IAAUA,EAC3B6M,GAAcC,EAAAA,GAAAA,GAAS9M,GAEvB+M,OAAyBpS,IAAV8F,EACfuM,EAAsB,OAAVvM,EACZwM,EAAiBxM,IAAUA,EAC3ByM,GAAcJ,EAAAA,GAAAA,GAASrM,GAE3B,IAAMuM,IAAcE,IAAgBL,GAAe7M,EAAQS,GACtDoM,GAAeE,GAAgBE,IAAmBD,IAAcE,GAChEP,GAAaI,GAAgBE,IAC5BP,GAAgBO,IACjBL,EACH,OAAO,EAET,IAAMD,IAAcE,IAAgBK,GAAelN,EAAQS,GACtDyM,GAAeR,GAAgBE,IAAmBD,IAAcE,GAChEG,GAAaN,GAAgBE,IAC5BG,GAAgBH,IACjBK,EACH,OAAQ,CAEZ,CACA,OAAO,CACT,ECKA,SA3BA,SAAyBpN,EAAQY,EAAO0M,GAOtC,IANA,IAAI7S,GAAS,EACT8S,EAAcvN,EAAOwN,SACrBC,EAAc7M,EAAM4M,SACpB9S,EAAS6S,EAAY7S,OACrBgT,EAAeJ,EAAO5S,SAEjBD,EAAQC,GAAQ,CACvB,IAAIC,EAASgT,GAAiBJ,EAAY9S,GAAQgT,EAAYhT,IAC9D,GAAIE,EACF,OAAIF,GAASiT,EACJ/S,EAGFA,GAAmB,QADd2S,EAAO7S,IACiB,EAAI,EAE5C,CAQA,OAAOuF,EAAOvF,MAAQmG,EAAMnG,KAC9B,ECOA,SA7BA,SAAqBmT,EAAYC,EAAWP,GAExCO,EADEA,EAAUnT,QACAoT,EAAAA,GAAAA,GAASD,GAAW,SAAS5M,GACvC,OAAI8M,EAAAA,GAAAA,GAAQ9M,GACH,SAASd,GACd,OAAO6N,EAAAA,GAAAA,GAAQ7N,EAA2B,IAApBc,EAASvG,OAAeuG,EAAS,GAAKA,EAC9D,EAEKA,CACT,IAEY,CAACF,EAAAA,GAGf,IAAItG,GAAS,EACboT,GAAYC,EAAAA,GAAAA,GAASD,GAAWI,EAAAA,GAAAA,GAAU/M,EAAAA,IAE1C,IAAIvG,GAASuT,EAAAA,GAAAA,GAAQN,GAAY,SAASzN,EAAOiB,EAAKwM,GAIpD,MAAO,CAAE,UAHME,EAAAA,GAAAA,GAASD,GAAW,SAAS5M,GAC1C,OAAOA,EAASd,EAClB,IAC+B,QAAW1F,EAAO,MAAS0F,EAC5D,IAEA,OAAOgO,GAAWxT,GAAQ,SAASqF,EAAQY,GACzC,OAAOwN,GAAgBpO,EAAQY,EAAO0M,EACxC,GACF,ECCA,UAbae,E,QAAAA,IAAS,SAAST,EAAYC,GACzC,GAAkB,MAAdD,EACF,MAAO,GAET,IAAIlT,EAASmT,EAAUnT,OAMvB,OALIA,EAAS,IAAKG,EAAAA,EAAAA,GAAe+S,EAAYC,EAAU,GAAIA,EAAU,IACnEA,EAAY,GACHnT,EAAS,IAAKG,EAAAA,EAAAA,GAAegT,EAAU,GAAIA,EAAU,GAAIA,EAAU,MAC5EA,EAAY,CAACA,EAAU,KAElBS,GAAYV,GAAYW,EAAAA,GAAAA,GAAYV,EAAW,GAAI,GAC5D,ICzBA,SAASW,GAAW/R,EAAG0G,GAErB,IADA,IAAIsL,EAAK,EACAjQ,EAAI,EAAGA,EAAI2E,EAASzI,SAAU8D,EACrCiQ,GAAMC,GAAmBjS,EAAG0G,EAAS3E,EAAI,GAAI2E,EAAS3E,IAExD,OAAOiQ,CACT,CAEA,SAASC,GAAmBjS,EAAGkS,EAAYC,GAuBzC,IAnBA,IAAIC,EAAWtS,GACbqS,EACArS,EAAAA,EAAMqS,GAAY,SAAUvS,EAAGmC,GAC7B,OAAOA,CACT,KAEEsQ,EAAevS,EAAAA,EACjBA,EAAAA,EAAMoS,GAAY,SAAUtS,GAC1B,OAAOE,GACLA,EAAAA,EAAME,EAAEkC,SAAStC,IAAI,SAAUiB,GAC7B,MAAO,CAAEyR,IAAKF,EAASvR,EAAEG,GAAIC,OAAQjB,EAAEe,KAAKF,GAAGI,OACjD,IACA,MAEJ,KAIEsR,EAAa,EACVA,EAAaJ,EAAWlU,QAAQsU,IAAe,EACtD,IAAIC,EAAW,EAAID,EAAa,EAChCA,GAAc,EACd,IAAIxF,EAAOjN,EAAAA,EAAM,IAAI3B,MAAMqU,IAAW,WACpC,OAAO,CACT,IAGIR,EAAK,EAqBT,OApBAlS,EAAAA,EAEEuS,EAAaI,SAAQ,SAAUxT,GAC7B,IAAIjB,EAAQiB,EAAMqT,IAAMC,EACxBxF,EAAK/O,IAAUiB,EAAMgC,OAGrB,IAFA,IAAIyR,EAAY,EAET1U,EAAQ,GAETA,EAAQ,IACV0U,GAAa3F,EAAK/O,EAAQ,IAI5B+O,EADA/O,EAASA,EAAQ,GAAM,IACRiB,EAAMgC,OAEvB+Q,GAAM/S,EAAMgC,OAASyR,CACvB,KAGKV,CACT,CCpDA,SAASW,GAAiBC,EAASC,GACjC,IAAIC,EAAgB,CAAC,EA+BrB,OA9BAhT,EAAAA,EAAU8S,GAAS,SAAU3T,EAAO8C,GAClC,IAAIgR,EAAOD,EAAc7T,EAAMW,GAAK,CAClCoT,SAAU,EACVtS,GAAI,GACJC,IAAK,GACLkK,GAAI,CAAC5L,EAAMW,GACXmC,EAAGA,GAEAjC,EAAAA,EAAcb,EAAMgU,cAEvBF,EAAIE,WAAahU,EAAMgU,WAEvBF,EAAI9R,OAAShC,EAAMgC,OAEvB,IAEAnB,EAAAA,EAAU+S,EAAGjS,SAAS,SAAUC,GAC9B,IAAIqS,EAASJ,EAAcjS,EAAEjB,GACzBuT,EAASL,EAAcjS,EAAEG,GACxBlB,EAAAA,EAAcoT,IAAYpT,EAAAA,EAAcqT,KAC3CA,EAAOH,WACPE,EAAOvS,IAAIrB,KAAKwT,EAAcjS,EAAEG,IAEpC,IAUF,SAA4BoS,GAC1B,IAAIR,EAAU,GAEd,SAASS,EAASC,GAChB,OAAO,SAAUjR,GACXA,EAAOkR,SAITzT,EAAAA,EAAcuC,EAAO4Q,aACrBnT,EAAAA,EAAcwT,EAAOL,aACrB5Q,EAAO4Q,YAAcK,EAAOL,aAiCpC,SAAsBO,EAAQC,GAC5B,IAAIC,EAAM,EACNzS,EAAS,EAETuS,EAAOvS,SACTyS,GAAOF,EAAOP,WAAaO,EAAOvS,OAClCA,GAAUuS,EAAOvS,QAGfwS,EAAOxS,SACTyS,GAAOD,EAAOR,WAAaQ,EAAOxS,OAClCA,GAAUwS,EAAOxS,QAGnBuS,EAAO3I,GAAK4I,EAAO5I,GAAG7I,OAAOwR,EAAO3I,IACpC2I,EAAOP,WAAaS,EAAMzS,EAC1BuS,EAAOvS,OAASA,EAChBuS,EAAOzR,EAAIvE,KAAKmW,IAAIF,EAAO1R,EAAGyR,EAAOzR,GACrC0R,EAAOF,QAAS,CAClB,CAlDQK,CAAaN,EAAQjR,EAEzB,CACF,CAEA,SAASwR,EAAUP,GACjB,OAAO,SAAUhR,GACfA,EAAW,GAAEhD,KAAKgU,GACQ,MAApBhR,EAAO0Q,UACXI,EAAU9T,KAAKgD,EAEnB,CACF,CAEA,KAAO8Q,EAAUnV,QAAQ,CACvB,IAAIgB,EAAQmU,EAAUU,MACtBlB,EAAQtT,KAAKL,GACba,EAAAA,EAAUb,EAAU,GAAE8U,UAAWV,EAASpU,IAC1Ca,EAAAA,EAAUb,EAAM0B,IAAKkT,EAAU5U,GACjC,CAEA,OAAOa,EAAAA,EACLA,GAAAA,EAAS8S,GAAS,SAAU3T,GAC1B,OAAQA,EAAMsU,MAChB,KACA,SAAUtU,GACR,OAAOa,EAAOb,EAAO,CAAC,KAAM,IAAK,aAAc,UACjD,GAEJ,CA7CS+U,CALSlU,GAAAA,EAASgT,GAAe,SAAU7T,GAEhD,OAAQA,EAAM+T,QAChB,IAGF,CCzDA,SAAS7C,GAAKyC,EAASqB,GACrB,IA0CuBC,EA1CnBC,E9BwNN,SAAmBhD,EAAYlK,GAC7B,IAAI/I,EAAS,CAAEkW,IAAK,GAAIC,IAAK,IAQ7B,OAPAvU,EAAAA,EAAUqR,GAAY,SAAUzN,GAC1BuD,EAAGvD,GACLxF,EAAOkW,IAAI9U,KAAKoE,GAEhBxF,EAAOmW,IAAI/U,KAAKoE,EAEpB,IACOxF,CACT,C8BlOcwJ,CAAekL,GAAS,SAAU3T,GAC5C,OAAO4D,OAAOC,UAAUC,eAAeC,KAAK/D,EAAO,aACrD,IACIqV,EAAWH,EAAMC,IACnBG,EAAazU,GAASqU,EAAME,KAAK,SAAUpV,GACzC,OAAQA,EAAM8C,CAChB,IACA8I,EAAK,GACL6I,EAAM,EACNzS,EAAS,EACTuT,EAAU,EAEZF,EAASnE,MA8Bc+D,IA9BSD,EA+BzB,SAAUf,EAAQC,GACvB,OAAID,EAAOD,WAAaE,EAAOF,YACrB,EACCC,EAAOD,WAAaE,EAAOF,WAC7B,EAGDiB,EAA6Bf,EAAOpR,EAAImR,EAAOnR,EAAxCmR,EAAOnR,EAAIoR,EAAOpR,CACnC,IArCAyS,EAAUC,GAAkB5J,EAAI0J,EAAYC,GAE5C1U,EAAAA,EAAUwU,GAAU,SAAUrV,GAC5BuV,GAAWvV,EAAM4L,GAAG5M,OACpB4M,EAAGvL,KAAKL,EAAM4L,IACd6I,GAAOzU,EAAMgU,WAAahU,EAAMgC,OAChCA,GAAUhC,EAAMgC,OAChBuT,EAAUC,GAAkB5J,EAAI0J,EAAYC,EAC9C,IAEA,IAAItW,EAAS,CAAE2M,GAAI/K,EAAAA,EAAU+K,IAK7B,OAJI5J,IACF/C,EAAO+U,WAAaS,EAAMzS,EAC1B/C,EAAO+C,OAASA,GAEX/C,CACT,CAEA,SAASuW,GAAkB5J,EAAI0J,EAAYvW,GAEzC,IADA,IAAI0W,EACGH,EAAWtW,SAAWyW,EAAO5U,EAAAA,EAAOyU,IAAaxS,GAAK/D,GAC3DuW,EAAWT,MACXjJ,EAAGvL,KAAKoV,EAAK7J,IACb7M,IAEF,OAAOA,CACT,CCvCA,SAAS2W,GAAa3U,EAAGJ,EAAGiT,EAAIoB,GAC9B,IAAIW,EAAU5U,EAAE0F,SAAS9F,GACrBwB,EAAOpB,EAAEoB,KAAKxB,GACdiV,EAAKzT,EAAOA,EAAKsO,gBAAarR,EAC9ByW,EAAK1T,EAAOA,EAAKuO,iBAActR,EAC/B0W,EAAY,CAAC,EAEbF,IACFD,EAAU9U,GAAAA,EAAS8U,GAAS,SAAU5T,GACpC,OAAOA,IAAM6T,GAAM7T,IAAM8T,CAC3B,KAGF,IAAIE,EChBN,SAAoBhV,EAAG4U,GACrB,OAAO9U,EAAAA,EAAM8U,GAAS,SAAUhV,GAC9B,IAAIqV,EAAMjV,EAAEoC,QAAQxC,GACpB,GAAKqV,EAAIhX,OAEF,CACL,IAAIC,EAAS4B,GAAAA,EACXmV,GACA,SAAU9J,EAAKtK,GACb,IAAIE,EAAOf,EAAEe,KAAKF,GAChBqU,EAAQlV,EAAEoB,KAAKP,EAAEjB,GACnB,MAAO,CACL8T,IAAKvI,EAAIuI,IAAM3S,EAAKE,OAASiU,EAAMrO,MACnC5F,OAAQkK,EAAIlK,OAASF,EAAKE,OAE9B,GACA,CAAEyS,IAAK,EAAGzS,OAAQ,IAGpB,MAAO,CACLrB,EAAGA,EACHqT,WAAY/U,EAAOwV,IAAMxV,EAAO+C,OAChCA,OAAQ/C,EAAO+C,OAEnB,CApBE,MAAO,CAAErB,EAAGA,EAqBhB,GACF,CDVoBqT,CAAWjT,EAAG4U,GAChC9U,EAAAA,EAAUkV,GAAa,SAAU/V,GAC/B,GAAIe,EAAE0F,SAASzG,EAAMW,GAAG3B,OAAQ,CAC9B,IAAIkX,EAAiBR,GAAa3U,EAAGf,EAAMW,EAAGiT,EAAIoB,GAClDc,EAAU9V,EAAMW,GAAKuV,EACjBtS,OAAOC,UAAUC,eAAeC,KAAKmS,EAAgB,gBA0CrC3B,EAzCDvU,EAyCSkF,EAzCFgR,EA0CzBrV,EAAAA,EAAc0T,EAAOP,aAMxBO,EAAOP,WAAa9O,EAAM8O,WAC1BO,EAAOvS,OAASkD,EAAMlD,SANtBuS,EAAOP,YACJO,EAAOP,WAAaO,EAAOvS,OAASkD,EAAM8O,WAAa9O,EAAMlD,SAC7DuS,EAAOvS,OAASkD,EAAMlD,QACzBuS,EAAOvS,QAAUkD,EAAMlD,QA5CvB,CAuCJ,IAA0BuS,EAAQrP,CAtChC,IAEA,IAAIyO,EAAUD,GAAiBqC,EAAanC,IAuB9C,SAAyBD,EAASmC,GAChCjV,EAAAA,EAAU8S,GAAS,SAAU3T,GAC3BA,EAAM4L,GAAK/K,EAAAA,EACTb,EAAM4L,GAAGvJ,KAAI,SAAU1B,GACrB,OAAImV,EAAUnV,GACLmV,EAAUnV,GAAGiL,GAEfjL,CACT,IAEJ,GACF,CAjCEwV,CAAgBxC,EAASmC,GAEzB,IAAI7W,EAASiS,GAAKyC,EAASqB,GAE3B,GAAIY,IACF3W,EAAO2M,GAAK/K,EAAAA,EAAU,CAAC+U,EAAI3W,EAAO2M,GAAIiK,IAClC9U,EAAEqV,aAAaR,GAAI5W,QAAQ,CAC7B,IAAIqX,EAAStV,EAAEoB,KAAKpB,EAAEqV,aAAaR,GAAI,IACrCU,EAASvV,EAAEoB,KAAKpB,EAAEqV,aAAaP,GAAI,IAChCjS,OAAOC,UAAUC,eAAeC,KAAK9E,EAAQ,gBAChDA,EAAO+U,WAAa,EACpB/U,EAAO+C,OAAS,GAElB/C,EAAO+U,YACJ/U,EAAO+U,WAAa/U,EAAO+C,OAASqU,EAAOzO,MAAQ0O,EAAO1O,QAAU3I,EAAO+C,OAAS,GACvF/C,EAAO+C,QAAU,CACnB,CAGF,OAAO/C,CACT,CE1BA,SAAS2I,GAAM7G,GACb,IAAI2G,EAAUe,EAAa1H,GACzBwV,EAAkBC,GAAiBzV,EAAGF,EAAQ,EAAG6G,EAAU,GAAI,WAC/D+O,EAAgBD,GAAiBzV,EAAGF,EAAQ6G,EAAU,GAAI,GAAI,GAAI,YAEhED,EClBC,SAAmB1G,GACxB,IAAI2C,EAAU,CAAC,EACXgT,EAAc7V,GAAAA,EAASE,EAAEQ,SAAS,SAAUZ,GAC9C,OAAQI,EAAE0F,SAAS9F,GAAG3B,MACxB,IACI0I,EAAU7G,EACZA,EAAAA,EAAM6V,GAAa,SAAU/V,GAC3B,OAAOI,EAAEoB,KAAKxB,GAAGgH,IACnB,KAEEgP,EAAS9V,EAAAA,EAAMA,EAAQ6G,EAAU,IAAI,WACvC,MAAO,EACT,IAUIkP,EAAY/V,GAAS6V,GAAa,SAAU/V,GAC9C,OAAOI,EAAEoB,KAAKxB,GAAGgH,IACnB,IAGA,OAFA9G,EAAAA,EAAU+V,GAXV,SAASjT,EAAIhD,GACX,IAAIE,EAAAA,EAAM6C,EAAS/C,GAAnB,CACA+C,EAAQ/C,IAAK,EACb,IAAIwB,EAAOpB,EAAEoB,KAAKxB,GAClBgW,EAAOxU,EAAKwF,MAAMtH,KAAKM,GACvBE,EAAAA,EAAUE,EAAEgL,WAAWpL,GAAIgD,EAJE,CAK/B,IAOOgT,CACT,CDViBE,CAAU9V,GACzB+V,GAAY/V,EAAG0G,GAKf,IAHA,IACEsP,EADEC,EAAS/M,OAAOC,kBAGXpH,EAAI,EAAGmU,EAAW,EAAGA,EAAW,IAAKnU,IAAKmU,EAAU,CAC3DC,GAAiBpU,EAAI,EAAIyT,EAAkBE,EAAe3T,EAAI,GAAK,GAGnE,IAAIiQ,EAAKD,GAAW/R,EADpB0G,EAAWgB,EAAsB1H,IAE7BgS,EAAKiE,IACPC,EAAW,EACXF,EAAOlW,GAAY4G,GACnBuP,EAASjE,EAEb,CAEA+D,GAAY/V,EAAGgW,EACjB,CAEA,SAASP,GAAiBzV,EAAGoW,EAAO/G,GAClC,OAAOvP,EAAAA,EAAMsW,GAAO,SAAUxP,GAC5B,OAAOwI,GAAgBpP,EAAG4G,EAAMyI,EAClC,GACF,CAEA,SAAS8G,GAAiBE,EAAapC,GACrC,IAAIpB,EAAK,IAAIxS,EAAAA,EACbP,EAAAA,EAAUuW,GAAa,SAAUC,GAC/B,IAAIzR,EAAOyR,EAAG7U,QAAQoD,KAClB0R,EAAS5B,GAAa2B,EAAIzR,EAAMgO,EAAIoB,GACxCnU,EAAAA,EAAUyW,EAAO1L,IAAI,SAAUjL,EAAGmC,GAChCuU,EAAGlV,KAAKxB,GAAGiH,MAAQ9E,CACrB,IE7DJ,SAAgC/B,EAAG6S,EAAIhI,GACrC,IACE2L,EADE/O,EAAO,CAAC,EAGZ3H,EAAAA,EAAU+K,GAAI,SAAUjL,GAItB,IAHA,IACEsM,EACAuK,EAFEzK,EAAQhM,EAAEkM,OAAOtM,GAGdoM,GAAO,CASZ,IARAE,EAASlM,EAAEkM,OAAOF,KAEhByK,EAAYhP,EAAKyE,GACjBzE,EAAKyE,GAAUF,IAEfyK,EAAYD,EACZA,EAAWxK,GAETyK,GAAaA,IAAczK,EAE7B,YADA6G,EAAG1R,QAAQsV,EAAWzK,GAGxBA,EAAQE,CACV,CACF,GAyBF,CFcIwK,CAAuBJ,EAAIzD,EAAI0D,EAAO1L,GACxC,GACF,CAEA,SAASkL,GAAY/V,EAAG0G,GACtB5G,EAAAA,EAAU4G,GAAU,SAAUiQ,GAC5B7W,EAAAA,EAAU6W,GAAO,SAAU/W,EAAGmC,GAC5B/B,EAAEoB,KAAKxB,GAAGiH,MAAQ9E,CACpB,GACF,GACF,CGxEA,SAAS6U,GAAkB5W,GACzB,IAAI6W,EAoEN,SAAmB7W,GACjB,IAAI9B,EAAS,CAAC,EACViP,EAAM,EAEV,SAASvK,EAAIhD,GACX,IAAIsN,EAAMC,EACVrN,EAAAA,EAAUE,EAAE0F,SAAS9F,GAAIgD,GACzB1E,EAAO0B,GAAK,CAAEsN,IAAKA,EAAKC,IAAKA,IAC/B,CAGA,OAFArN,EAAAA,EAAUE,EAAE0F,WAAY9C,GAEjB1E,CACT,CAhFsBmN,CAAUrL,GAE9BF,EAAAA,EAAUE,EAAEyB,QAAQ8G,aAAa,SAAU3I,GAUzC,IATA,IAAIwB,EAAOpB,EAAEoB,KAAKxB,GACdgJ,EAAUxH,EAAKwH,QACfkO,EAsCR,SAAkB9W,EAAG6W,EAAejX,EAAGoB,GACrC,IAIIkL,EACA6K,EALAC,EAAQ,GACRC,EAAQ,GACR/J,EAAM1P,KAAKmW,IAAIkD,EAAcjX,GAAGsN,IAAK2J,EAAc7V,GAAGkM,KACtDC,EAAM3P,KAAKG,IAAIkZ,EAAcjX,GAAGuN,IAAK0J,EAAc7V,GAAGmM,KAK1DjB,EAAStM,EACT,GACEsM,EAASlM,EAAEkM,OAAOA,GAClB8K,EAAM1X,KAAK4M,SACJA,IAAW2K,EAAc3K,GAAQgB,IAAMA,GAAOC,EAAM0J,EAAc3K,GAAQiB,MACnF4J,EAAM7K,EAGNA,EAASlL,EACT,MAAQkL,EAASlM,EAAEkM,OAAOA,MAAa6K,GACrCE,EAAM3X,KAAK4M,GAGb,MAAO,CAAEvI,KAAMqT,EAAMhV,OAAOiV,EAAMlD,WAAYgD,IAAKA,EACrD,CA7DmBG,CAASlX,EAAG6W,EAAejO,EAAQhJ,EAAGgJ,EAAQ5H,GACzD2C,EAAOmT,EAASnT,KAChBoT,EAAMD,EAASC,IACfI,EAAU,EACVC,EAAQzT,EAAKwT,GACbE,GAAY,EAETzX,IAAMgJ,EAAQ5H,GAAG,CAGtB,GAFAI,EAAOpB,EAAEoB,KAAKxB,GAEVyX,EAAW,CACb,MAAQD,EAAQzT,EAAKwT,MAAcJ,GAAO/W,EAAEoB,KAAKgW,GAAOzQ,QAAUvF,EAAKwF,MACrEuQ,IAGEC,IAAUL,IACZM,GAAY,EAEhB,CAEA,IAAKA,EAAW,CACd,KACEF,EAAUxT,EAAK1F,OAAS,GACxB+B,EAAEoB,KAAMgW,EAAQzT,EAAKwT,EAAU,IAAK1H,SAAWrO,EAAKwF,MAEpDuQ,IAEFC,EAAQzT,EAAKwT,EACf,CAEAnX,EAAE2H,UAAU/H,EAAGwX,GACfxX,EAAII,EAAEgL,WAAWpL,GAAG,EACtB,CACF,GACF,C,eCTA,SAJA,SAAgB2D,EAAQiB,GACtB,OAAOjB,IAAUmB,EAAAA,EAAAA,GAAWnB,GAAQ+T,EAAAA,GAAAA,GAAa9S,GACnD,E,0BCKA,SANA,SAAejB,EAAQiB,GACrB,OAAiB,MAAVjB,EACHA,GACAgU,EAAAA,GAAAA,GAAQhU,GAAQ+T,EAAAA,GAAAA,GAAa9S,GAAWgT,GAAAA,EAC9C,ECGA,SAASC,GAAmBzX,EAAG0G,GAC7B,IAAIgR,EAAY,CAAC,EAoCjB,OADA5X,GAAAA,EAAS4G,GAjCT,SAAoBiR,EAAWhB,GAC7B,IAEEiB,EAAK,EAGLC,EAAU,EACVC,EAAkBH,EAAU1Z,OAC5B8Z,EAAWjY,EAAAA,EAAO6W,GAsBpB,OApBA7W,EAAAA,EAAU6W,GAAO,SAAU/W,EAAGmC,GAC5B,IAAIf,EAsEV,SAAmChB,EAAGJ,GACpC,GAAII,EAAEoB,KAAKxB,GAAGwF,MACZ,OAAOtF,GAAAA,EAAOE,EAAEqV,aAAazV,IAAI,SAAU6M,GACzC,OAAOzM,EAAEoB,KAAKqL,GAAGrH,KACnB,GAEJ,CA5Ec4S,CAA0BhY,EAAGJ,GACnCqY,EAAKjX,EAAIhB,EAAEoB,KAAKJ,GAAG6F,MAAQiR,GAEzB9W,GAAKpB,IAAMmY,KACbjY,EAAAA,EAAU6W,EAAM5K,MAAM8L,EAAS9V,EAAI,IAAI,SAAUmW,GAC/CpY,EAAAA,EAAUE,EAAEqV,aAAa6C,IAAW,SAAUzL,GAC5C,IAAI0L,EAASnY,EAAEoB,KAAKqL,GAClB2L,EAAOD,EAAOtR,QACXuR,EAAOR,GAAMK,EAAKG,IAAWD,EAAO/S,OAASpF,EAAEoB,KAAK8W,GAAU9S,OACjEiT,GAAYX,EAAWjL,EAAGyL,EAE9B,GACF,IAEAL,EAAU9V,EAAI,EACd6V,EAAKK,EAET,IAEOtB,CACT,IAGOe,CACT,CAsDA,SAASW,GAAYX,EAAW9X,EAAGoB,GACjC,GAAIpB,EAAIoB,EAAG,CACT,IAAI+R,EAAMnT,EACVA,EAAIoB,EACJA,EAAI+R,CACN,CAEA,IAAIuF,EAAaZ,EAAU9X,GACtB0Y,IACHZ,EAAU9X,GAAK0Y,EAAa,CAAC,GAE/BA,EAAWtX,IAAK,CAClB,CAEA,SAASuX,GAAYb,EAAW9X,EAAGoB,GACjC,GAAIpB,EAAIoB,EAAG,CACT,IAAI+R,EAAMnT,EACVA,EAAIoB,EACJA,EAAI+R,CACN,CACA,QAAS2E,EAAU9X,IAAMiD,OAAOC,UAAUC,eAAeC,KAAK0U,EAAU9X,GAAIoB,EAC9E,CAkDA,SAASwX,GAAqBxY,EAAG0G,EAAU7B,EAAM4T,EAAOC,GAMtD,IAAIC,EAAK,CAAC,EACRC,EAkDJ,SAAyB5Y,EAAG0G,EAAU7B,EAAM6T,GAC1C,IAAIG,EAAa,IAAIxY,EAAAA,EACnByY,EAAa9Y,EAAEyB,QACfsX,EAgHJ,SAAa1K,EAAS2K,EAASN,GAC7B,OAAO,SAAU1Y,EAAGJ,EAAGoB,GACrB,IAGIsI,EAHA8D,EAASpN,EAAEoB,KAAKxB,GAChByN,EAASrN,EAAEoB,KAAKJ,GAChB0S,EAAM,EAIV,GADAA,GAAOtG,EAAOhH,MAAQ,EAClBvD,OAAOC,UAAUC,eAAeC,KAAKoK,EAAQ,YAC/C,OAAQA,EAAOvE,SAASd,eACtB,IAAK,IACHuB,GAAS8D,EAAOhH,MAAQ,EACxB,MACF,IAAK,IACHkD,EAAQ8D,EAAOhH,MAAQ,EAa7B,GATIkD,IACFoK,GAAOgF,EAAapP,GAASA,GAE/BA,EAAQ,EAERoK,IAAQtG,EAAOhI,MAAQ4T,EAAU3K,GAAW,EAC5CqF,IAAQrG,EAAOjI,MAAQ4T,EAAU3K,GAAW,EAE5CqF,GAAOrG,EAAOjH,MAAQ,EAClBvD,OAAOC,UAAUC,eAAeC,KAAKqK,EAAQ,YAC/C,OAAQA,EAAOxE,SAASd,eACtB,IAAK,IACHuB,EAAQ+D,EAAOjH,MAAQ,EACvB,MACF,IAAK,IACHkD,GAAS+D,EAAOjH,MAAQ,EAS9B,OALIkD,IACFoK,GAAOgF,EAAapP,GAASA,GAE/BA,EAAQ,EAEDoK,CACT,CACF,CA5JYuF,CAAIH,EAAWI,QAASJ,EAAWK,QAAST,GAgBtD,OAdA5Y,EAAAA,EAAU4G,GAAU,SAAUiQ,GAC5B,IAAIlK,EACJ3M,EAAAA,EAAU6W,GAAO,SAAU/W,GACzB,IAAIwZ,EAAQvU,EAAKjF,GAEjB,GADAiZ,EAAWpY,QAAQ2Y,GACf3M,EAAG,CACL,IAAI4M,EAAQxU,EAAK4H,GACf6M,EAAUT,EAAW9X,KAAKsY,EAAOD,GACnCP,EAAW1X,QAAQkY,EAAOD,EAAO5b,KAAKG,IAAIob,EAAM/Y,EAAGJ,EAAG6M,GAAI6M,GAAW,GACvE,CACA7M,EAAI7M,CACN,GACF,IAEOiZ,CACT,CAtEaU,CAAgBvZ,EAAG0G,EAAU7B,EAAM6T,GAC5ClR,EAAakR,EAAa,aAAe,cAE3C,SAASc,EAAQC,EAAWC,GAI1B,IAHA,IAAIhX,EAAQkW,EAAOpY,QACfmZ,EAAOjX,EAAMoR,MACbnR,EAAU,CAAC,EACRgX,GACDhX,EAAQgX,GACVF,EAAUE,IAEVhX,EAAQgX,IAAQ,EAChBjX,EAAMpD,KAAKqa,GACXjX,EAAQA,EAAMV,OAAO0X,EAAcC,KAGrCA,EAAOjX,EAAMoR,KAEjB,CA6BA,OARA0F,GAlBA,SAAeG,GACbhB,EAAGgB,GAAQf,EAAOxW,QAAQuX,GAAMC,QAAO,SAAUzO,EAAKtK,GACpD,OAAOrD,KAAKG,IAAIwN,EAAKwN,EAAG9X,EAAEjB,GAAKgZ,EAAO7X,KAAKF,GAC7C,GAAG,EACL,GAce+X,EAAOvD,aAAanK,KAAK0N,IACxCY,GAZA,SAAeG,GACb,IAAIhG,EAAMiF,EAAO1W,SAASyX,GAAMC,QAAO,SAAUzO,EAAKtK,GACpD,OAAOrD,KAAKmW,IAAIxI,EAAKwN,EAAG9X,EAAEG,GAAK4X,EAAO7X,KAAKF,GAC7C,GAAGqI,OAAOC,mBAEN/H,EAAOpB,EAAEoB,KAAKuY,GACdhG,IAAQzK,OAAOC,mBAAqB/H,EAAKoG,aAAeA,IAC1DmR,EAAGgB,GAAQnc,KAAKG,IAAIgb,EAAGgB,GAAOhG,GAElC,GAGeiF,EAAO5N,WAAWE,KAAK0N,IAGtC9Y,EAAAA,EAAU2Y,GAAO,SAAU7Y,GACzB+Y,EAAG/Y,GAAK+Y,EAAG9T,EAAKjF,GAClB,IAEO+Y,CACT,CAqFA,SAASkB,GAAU7Z,GACjB,IAII8Z,EAJApT,EAAWgB,EAAsB1H,GACjC0X,EAAY5X,EAAAA,EAAQ2X,GAAmBzX,EAAG0G,GAzQhD,SAA4B1G,EAAG0G,GAC7B,IAAIgR,EAAY,CAAC,EAEjB,SAASqC,EAAKC,EAAO5H,EAAU6H,EAAUC,EAAiBC,GACxD,IAAIva,EACJE,EAAAA,EAAUA,EAAQsS,EAAU6H,IAAW,SAAUlY,GAC/CnC,EAAIoa,EAAMjY,GACN/B,EAAEoB,KAAKxB,GAAGwF,OACZtF,EAAAA,EAAUE,EAAEqV,aAAazV,IAAI,SAAU6M,GACrC,IAAI2N,EAAQpa,EAAEoB,KAAKqL,GACf2N,EAAMhV,QAAUgV,EAAMvT,MAAQqT,GAAmBE,EAAMvT,MAAQsT,IACjE9B,GAAYX,EAAWjL,EAAG7M,EAE9B,GAEJ,GACF,CAyBA,OADAE,GAAAA,EAAS4G,GAtBT,SAAoB2T,EAAOL,GACzB,IACEM,EADEC,GAAgB,EAElBnI,EAAW,EAgBb,OAdAtS,EAAAA,EAAUka,GAAO,SAAUpa,EAAG4a,GAC5B,GAAwB,WAApBxa,EAAEoB,KAAKxB,GAAGwF,MAAoB,CAChC,IAAIiQ,EAAerV,EAAEqV,aAAazV,GAC9ByV,EAAapX,SACfqc,EAAeta,EAAEoB,KAAKiU,EAAa,IAAIxO,MACvCkT,EAAKC,EAAO5H,EAAUoI,EAAgBD,EAAcD,GAEpDlI,EAAWoI,EACXD,EAAeD,EAEnB,CACAP,EAAKC,EAAO5H,EAAU4H,EAAM/b,OAAQqc,EAAcD,EAAMpc,OAC1D,IAEO+b,CACT,IAGOtC,CACT,CA+N2D+C,CAAmBza,EAAG0G,IAE3EgU,EAAM,CAAC,EAEX5a,EAAAA,EAAU,CAAC,IAAK,MAAM,SAAU6a,GAC9Bb,EAA4B,MAATa,EAAejU,EAAW5G,GAAAA,EAAS4G,GAAUqN,UAChEjU,EAAAA,EAAU,CAAC,IAAK,MAAM,SAAU8a,GAChB,MAAVA,IACFd,EAAmBha,EAAAA,EAAMga,GAAkB,SAAUe,GACnD,OAAO/a,GAAAA,EAAS+a,GAAO9G,SACzB,KAGF,IAAI+G,GAAuB,MAATH,EAAe3a,EAAEqV,aAAerV,EAAEgL,YAAYE,KAAKlL,GACjEyY,EApMV,SAA2BzY,EAAG0G,EAAUgR,EAAWoD,GACjD,IAAIjW,EAAO,CAAC,EACV4T,EAAQ,CAAC,EACTnG,EAAM,CAAC,EAkCT,OA7BAxS,EAAAA,EAAU4G,GAAU,SAAUiQ,GAC5B7W,EAAAA,EAAU6W,GAAO,SAAU/W,EAAGiH,GAC5BhC,EAAKjF,GAAKA,EACV6Y,EAAM7Y,GAAKA,EACX0S,EAAI1S,GAAKiH,CACX,GACF,IAEA/G,EAAAA,EAAU4G,GAAU,SAAUiQ,GAC5B,IAAIoE,GAAW,EACfjb,EAAAA,EAAU6W,GAAO,SAAU/W,GACzB,IAAIob,EAAKF,EAAWlb,GACpB,GAAIob,EAAG/c,OAAQ,CACb+c,EAAKlb,GAASkb,GAAI,SAAUha,GAC1B,OAAOsR,EAAItR,EACb,IAEA,IADA,IAAIia,GAAMD,EAAG/c,OAAS,GAAK,EAClB8D,EAAIvE,KAAK0d,MAAMD,GAAKE,EAAK3d,KAAKC,KAAKwd,GAAKlZ,GAAKoZ,IAAMpZ,EAAG,CAC7D,IAAIf,EAAIga,EAAGjZ,GACP0W,EAAM7Y,KAAOA,GAAKmb,EAAUzI,EAAItR,KAAOuX,GAAYb,EAAW9X,EAAGoB,KACnEyX,EAAMzX,GAAKpB,EACX6Y,EAAM7Y,GAAKiF,EAAKjF,GAAKiF,EAAK7D,GAC1B+Z,EAAUzI,EAAItR,GAElB,CACF,CACF,GACF,IAEO,CAAE6D,KAAMA,EAAM4T,MAAOA,EAC9B,CA8JkB2C,CAAkBpb,EAAG8Z,EAAkBpC,EAAWoD,GAC1DnC,EAAKH,GAAqBxY,EAAG8Z,EAAkBrB,EAAM5T,KAAM4T,EAAMA,MAAiB,MAAVmC,GAC9D,MAAVA,IACFjC,EAAK7Y,EAAY6Y,GAAI,SAAU3S,GAC7B,OAAQA,CACV,KAEF0U,EAAIC,EAAOC,GAASjC,CACtB,GACF,IAEA,IAAI0C,EArFN,SAAoCrb,EAAG0a,GACrC,OAAO5a,GAAQA,GAAAA,EAAS4a,IAAM,SAAU/B,GACtC,IAAIhb,EAAMuL,OAAOoS,kBACb3H,EAAMzK,OAAOC,kBASjB,OAPArJ,GAAQ6Y,GAAI,SAAU3S,EAAGpG,GACvB,IAAI2b,EAkIV,SAAevb,EAAGJ,GAChB,OAAOI,EAAEoB,KAAKxB,GAAGwG,KACnB,CApIsBA,CAAMpG,EAAGJ,GAAK,EAE9BjC,EAAMH,KAAKG,IAAIqI,EAAIuV,EAAW5d,GAC9BgW,EAAMnW,KAAKmW,IAAI3N,EAAIuV,EAAW5H,EAChC,IAEOhW,EAAMgW,CACf,GACF,CAuEsB6H,CAA2Bxb,EAAG0a,GAElD,OAhEF,SAA0BA,EAAKe,GAC7B,IAAIC,EAAc5b,GAAAA,EAAS2b,GACzBE,EAAa7b,EAAAA,EAAM4b,GACnBE,EAAa9b,EAAM4b,GAErB5b,EAAAA,EAAU,CAAC,IAAK,MAAM,SAAU6a,GAC9B7a,EAAAA,EAAU,CAAC,IAAK,MAAM,SAAU8a,GAC9B,IAEEtR,EAFEuS,EAAYlB,EAAOC,EACrBjC,EAAK+B,EAAImB,GAEX,GAAIlD,IAAO8C,EAAX,CAEA,IAAIK,EAAShc,GAAAA,EAAS6Y,IACtBrP,EAAkB,MAAVsR,EAAgBe,EAAa7b,EAAAA,EAAMgc,GAAUF,EAAa9b,EAAMgc,MAGtEpB,EAAImB,GAAa/b,EAAY6Y,GAAI,SAAU3S,GACzC,OAAOA,EAAIsD,CACb,IARwB,CAU5B,GACF,GACF,CAyCEyS,CAAiBrB,EAAKW,GAvCxB,SAAiBX,EAAKjC,GACpB,OAAO3Y,EAAY4a,EAAIsB,IAAI,SAAUC,EAAQrc,GAC3C,GAAI6Y,EACF,OAAOiC,EAAIjC,EAAM1Q,eAAenI,GAEhC,IAAI+Y,EAAK7Y,GAASA,EAAAA,EAAM4a,EAAK9a,IAC7B,OAAQ+Y,EAAG,GAAKA,EAAG,IAAM,CAE7B,GACF,CA+BSuD,CAAQxB,EAAK1a,EAAEyB,QAAQgX,MAChC,CC9WA,SAAS0D,GAASnc,IASlB,SAAmBA,GACjB,IAAI0G,EAAWgB,EAAsB1H,GACjCoc,EAAUpc,EAAEyB,QAAQ4a,QACpBC,EAAQ,EACZxc,EAAAA,EAAU4G,GAAU,SAAUiQ,GAC5B,IAAI4F,EAAYzc,EACdA,EAAAA,EAAM6W,GAAO,SAAU/W,GACrB,OAAOI,EAAEoB,KAAKxB,GAAG0G,MACnB,KAEFxG,EAAAA,EAAU6W,GAAO,SAAU/W,GACzBI,EAAEoB,KAAKxB,GAAGqG,EAAIqW,EAAQC,EAAY,CACpC,IACAD,GAASC,EAAYH,CACvB,GACF,EArBEI,CAFAxc,EAAI0H,EAAwB1H,IAG5BF,GAAS+Z,GAAU7Z,IAAI,SAAUgG,EAAGpG,GAClCI,EAAEoB,KAAKxB,GAAGoG,EAAIA,CAChB,GACF,CCEA,SAASyW,GAAOzc,EAAG0c,GACjB,IAAI1V,EAAO0V,GAAQA,EAAKC,YAAcjV,EAAYA,GAClDV,EAAK,UAAU,KACb,IAAI4V,EAAc5V,EAAK,sBAAsB,IA+FjD,SAA0B6V,GACxB,IAAI7c,EAAI,IAAIK,EAAAA,EAAM,CAAEkF,YAAY,EAAMgK,UAAU,IAC5C9N,EAAQqb,GAAaD,EAAWpb,SAoBpC,OAlBAzB,EAAEyF,SACA3F,EAAAA,EAAQ,CAAC,EAAGid,GAAeC,GAAkBvb,EAAOwb,IAAgBnd,EAAO2B,EAAOyb,MAGpFpd,EAAAA,EAAU+c,EAAWrc,SAAS,SAAUZ,GACtC,IAAIwB,EAAO0b,GAAaD,EAAWzb,KAAKxB,IACxCI,EAAES,QAAQb,EAAGE,EAAAA,EAAWkd,GAAkB5b,EAAM+b,IAAeC,KAC/Dpd,EAAE2H,UAAU/H,EAAGid,EAAW3Q,OAAOtM,GACnC,IAEAE,EAAAA,EAAU+c,EAAWjc,SAAS,SAAUC,GACtC,IAAIE,EAAO+b,GAAaD,EAAW9b,KAAKF,IACxCb,EAAEmB,QACAN,EACAf,EAAAA,EAAQ,CAAC,EAAGud,GAAcL,GAAkBjc,EAAMuc,IAAexd,EAAOiB,EAAMwc,KAElF,IAEOvd,CACT,CAtHuDwd,CAAiBxd,KACpEgH,EAAK,eAAe,IAKxB,SAAmBhH,EAAGgH,GACpBA,EAAK,8BAA8B,IAyHrC,SAAgChH,GAC9B,IAAIyB,EAAQzB,EAAEyB,QACdA,EAAM4a,SAAW,EACjBvc,EAAAA,EAAUE,EAAEY,SAAS,SAAUC,GAC7B,IAAIE,EAAOf,EAAEe,KAAKF,GAClBE,EAAKkI,QAAU,EACqB,MAAhClI,EAAK8H,SAASd,gBACM,OAAlBtG,EAAMqG,SAAsC,OAAlBrG,EAAMqG,QAClC/G,EAAKqF,OAASrF,EAAK0c,YAEnB1c,EAAKuF,QAAUvF,EAAK0c,YAG1B,GACF,CAvI2CC,CAAuB1d,KAChEgH,EAAK,uBAAuB,IAiT9B,SAAyBhH,GACvBF,EAAAA,EAAUE,EAAEY,SAAS,SAAUC,GAC7B,GAAIA,EAAEjB,IAAMiB,EAAEG,EAAG,CACf,IAAII,EAAOpB,EAAEoB,KAAKP,EAAEjB,GACfwB,EAAKuc,YACRvc,EAAKuc,UAAY,IAEnBvc,EAAKuc,UAAUre,KAAK,CAAEuB,EAAGA,EAAGqC,MAAOlD,EAAEe,KAAKF,KAC1Cb,EAAEmD,WAAWtC,EACf,CACF,GACF,CA5ToC+c,CAAgB5d,KAClDgH,EAAK,eAAe,IAAM6W,EAAY7d,KACtCgH,EAAK,wBAAwB,IAAM8W,GAAiB9d,KACpDgH,EAAK,YAAY,IAAMJ,GAAKc,EAAwB1H,MACpDgH,EAAK,8BAA8B,IA0IrC,SAAgChH,GAC9BF,EAAAA,EAAUE,EAAEY,SAAS,SAAUC,GAC7B,IAAIE,EAAOf,EAAEe,KAAKF,GAClB,GAAIE,EAAKqF,OAASrF,EAAKuF,OAAQ,CAC7B,IAAI1G,EAAII,EAAEoB,KAAKP,EAAEjB,GAEbsD,EAAQ,CAAE0D,MADN5G,EAAEoB,KAAKP,EAAEG,GACM4F,KAAOhH,EAAEgH,MAAQ,EAAIhH,EAAEgH,KAAM/F,EAAGA,GACvD6G,EAAkB1H,EAAG,aAAckD,EAAO,MAC5C,CACF,GACF,CApJ2C6a,CAAuB/d,KAChEgH,EAAK,wBAAwB,IzCqI/B,SAA0BhH,GAExB,IAAIge,EAASle,EAAAA,EACXA,EAAAA,EAAME,EAAEQ,SAAS,SAAUZ,GACzB,OAAOI,EAAEoB,KAAKxB,GAAGgH,IACnB,KAGEgP,EAAS,GACb9V,EAAAA,EAAUE,EAAEQ,SAAS,SAAUZ,GAC7B,IAAIgH,EAAO5G,EAAEoB,KAAKxB,GAAGgH,KAAOoX,EACvBpI,EAAOhP,KACVgP,EAAOhP,GAAQ,IAEjBgP,EAAOhP,GAAMtH,KAAKM,EACpB,IAEA,IAAI0J,EAAQ,EACRkF,EAAiBxO,EAAEyB,QAAQ+M,eAC/B1O,EAAAA,EAAU8V,GAAQ,SAAU/K,EAAI9I,GAC1BjC,EAAAA,EAAc+K,IAAO9I,EAAIyM,IAAmB,IAC5ClF,EACOA,GACTxJ,EAAAA,EAAU+K,GAAI,SAAUjL,GACtBI,EAAEoB,KAAKxB,GAAGgH,MAAQ0C,CACpB,GAEJ,GACF,CyCjKqC5B,CAAsB1H,KACzDgH,EAAK,4BAA4B,IvB8FnC,SAAiBhH,GACf,IAAI8Y,EAAa9Y,EAAEyB,QACnBzB,EAAE8B,WAAWgX,EAAWxK,oBACjBwK,EAAWxK,YAClBxO,EAAAA,EAAUE,EAAEY,SAAS,SAAUC,GAClBb,EAAEe,KAAKF,GACToO,aACPjP,EAAEmD,WAAWtC,EAEjB,GACF,CuBxGyCid,CAAqB9d,KAC5DgH,EAAK,sBAAsB,IzCqH7B,SAAwBhH,GACtB,IAAI2T,EAAM7T,EAAAA,EACRA,EAAAA,EAAME,EAAEQ,SAAS,SAAUZ,GACzB,OAAOI,EAAEoB,KAAKxB,GAAGgH,IACnB,KAEF9G,EAAAA,EAAUE,EAAEQ,SAAS,SAAUZ,GAC7B,IAAIwB,EAAOpB,EAAEoB,KAAKxB,GACdE,EAAAA,EAAMsB,EAAM,UACdA,EAAKwF,MAAQ+M,EAEjB,GACF,CyCjImCjM,CAAoB1H,KACrDgH,EAAK,wBAAwB,IAkJ/B,SAA0BhH,GACxB,IAAI2G,EAAU,EACd7G,EAAAA,EAAUE,EAAEQ,SAAS,SAAUZ,GAC7B,IAAIwB,EAAOpB,EAAEoB,KAAKxB,GACdwB,EAAKuN,YACPvN,EAAKqO,QAAUzP,EAAEoB,KAAKA,EAAKuN,WAAW/H,KACtCxF,EAAKuF,QAAU3G,EAAEoB,KAAKA,EAAKwN,cAAchI,KAEzCD,EAAU7G,EAAM6G,EAASvF,EAAKuF,SAElC,IACA3G,EAAEyB,QAAQkF,QAAUA,CACtB,CA9JqCsX,CAAiBje,KACpDgH,EAAK,8BAA8B,IA+JrC,SAAgChH,GAC9BF,EAAAA,EAAUE,EAAEQ,SAAS,SAAUZ,GAC7B,IAAIwB,EAAOpB,EAAEoB,KAAKxB,GACC,eAAfwB,EAAKgE,QACPpF,EAAEe,KAAKK,EAAKP,GAAG8H,UAAYvH,EAAKwF,KAChC5G,EAAE8B,WAAWlC,GAEjB,GACF,CAvK2Cse,CAAuBle,KAChEgH,EAAK,qBAAqB,IAAMmX,GAAcne,KAC9CgH,EAAK,yBAAyB,IAAM4P,GAAkB5W,KACtDgH,EAAK,yBAAyB,IxCjChC,SAA2BhH,GAkBzBF,EAAAA,EAAUE,EAAE0F,YAjBZ,SAAS9C,EAAIhD,GACX,IAAI8F,EAAW1F,EAAE0F,SAAS9F,GACtBwB,EAAOpB,EAAEoB,KAAKxB,GAKlB,GAJI8F,EAASzH,QACX6B,EAAAA,EAAU4F,EAAU9C,GAGlBC,OAAOC,UAAUC,eAAeC,KAAK5B,EAAM,WAAY,CACzDA,EAAKsO,WAAa,GAClBtO,EAAKuO,YAAc,GACnB,IAAK,IAAI/I,EAAOxF,EAAKqO,QAAS9I,EAAUvF,EAAKuF,QAAU,EAAGC,EAAOD,IAAWC,EAC1EE,GAAc9G,EAAG,aAAc,MAAOJ,EAAGwB,EAAMwF,GAC/CE,GAAc9G,EAAG,cAAe,MAAOJ,EAAGwB,EAAMwF,EAEpD,CACF,GAGF,CwCcsCwX,CAAkBpe,KACtDgH,EAAK,aAAa,IAAMH,GAAM7G,KAC9BgH,EAAK,uBAAuB,IAgT9B,SAAyBhH,GACvB,IAAI4V,EAASlO,EAAsB1H,GACnCF,EAAAA,EAAU8V,GAAQ,SAAUe,GAC1B,IAAI0H,EAAa,EACjBve,EAAAA,EAAU6W,GAAO,SAAU/W,EAAGmC,GAC5B,IAAIX,EAAOpB,EAAEoB,KAAKxB,GAClBwB,EAAKyF,MAAQ9E,EAAIsc,EACjBve,EAAAA,EAAUsB,EAAKuc,WAAW,SAAUW,GAClC5W,EACE1H,EACA,WACA,CACEoG,MAAOkY,EAASpb,MAAMkD,MACtBE,OAAQgY,EAASpb,MAAMoD,OACvBM,KAAMxF,EAAKwF,KACXC,MAAO9E,KAAMsc,EACbxd,EAAGyd,EAASzd,EACZqC,MAAOob,EAASpb,OAElB,MAEJ,WACO9B,EAAKuc,SACd,GACF,GACF,CAzUoCY,CAAgBve,KAClDgH,EAAK,8BAA8B,IvCrCrC,SAAgBhH,GACd,IAAI6H,EAAU7H,EAAEyB,QAAQqG,QAAQC,cAChB,OAAZF,GAAgC,OAAZA,GACtBQ,GAAgBrI,EAEpB,CuCgC2Cwe,CAAwBxe,KACjEgH,EAAK,gBAAgB,IAAMmV,GAASnc,KACpCgH,EAAK,yBAAyB,IAwUhC,SAA2BhH,GACzBF,EAAAA,EAAUE,EAAEQ,SAAS,SAAUZ,GAC7B,IAAIwB,EAAOpB,EAAEoB,KAAKxB,GAClB,GAAmB,aAAfwB,EAAKgE,MAAsB,CAC7B,IAAIqZ,EAAWze,EAAEoB,KAAKA,EAAKP,EAAEjB,GACzBoG,EAAIyY,EAASzY,EAAIyY,EAASrY,MAAQ,EAClCH,EAAIwY,EAASxY,EACbC,EAAK9E,EAAK4E,EAAIA,EACdG,EAAKsY,EAASnY,OAAS,EAC3BtG,EAAEmB,QAAQC,EAAKP,EAAGO,EAAK8B,OACvBlD,EAAE8B,WAAWlC,GACbwB,EAAK8B,MAAM+E,OAAS,CAClB,CAAEjC,EAAGA,EAAK,EAAIE,EAAM,EAAGD,EAAGA,EAAIE,GAC9B,CAAEH,EAAGA,EAAK,EAAIE,EAAM,EAAGD,EAAGA,EAAIE,GAC9B,CAAEH,EAAGA,EAAIE,EAAID,EAAGA,GAChB,CAAED,EAAGA,EAAK,EAAIE,EAAM,EAAGD,EAAGA,EAAIE,GAC9B,CAAEH,EAAGA,EAAK,EAAIE,EAAM,EAAGD,EAAGA,EAAIE,IAEhC/E,EAAK8B,MAAM8C,EAAI5E,EAAK4E,EACpB5E,EAAK8B,MAAM+C,EAAI7E,EAAK6E,CACtB,CACF,GACF,CA9VsCyY,CAAkB1e,KACtDgH,EAAK,yBAAyB,IAwQhC,SAA2BhH,GACzBF,EAAAA,EAAUE,EAAEQ,SAAS,SAAUZ,GAC7B,GAAII,EAAE0F,SAAS9F,GAAG3B,OAAQ,CACxB,IAAImD,EAAOpB,EAAEoB,KAAKxB,GACd2J,EAAIvJ,EAAEoB,KAAKA,EAAKuN,WAChBgQ,EAAI3e,EAAEoB,KAAKA,EAAKwN,cAChBgQ,EAAI5e,EAAEoB,KAAKtB,EAAAA,EAAOsB,EAAKsO,aACvBmP,EAAI7e,EAAEoB,KAAKtB,EAAAA,EAAOsB,EAAKuO,cAE3BvO,EAAKgF,MAAQ5I,KAAKgJ,IAAIqY,EAAE7Y,EAAI4Y,EAAE5Y,GAC9B5E,EAAKkF,OAAS9I,KAAKgJ,IAAImY,EAAE1Y,EAAIsD,EAAEtD,GAC/B7E,EAAK4E,EAAI4Y,EAAE5Y,EAAI5E,EAAKgF,MAAQ,EAC5BhF,EAAK6E,EAAIsD,EAAEtD,EAAI7E,EAAKkF,OAAS,CAC/B,CACF,IAEAxG,EAAAA,EAAUE,EAAEQ,SAAS,SAAUZ,GACL,WAApBI,EAAEoB,KAAKxB,GAAGwF,OACZpF,EAAE8B,WAAWlC,EAEjB,GACF,CA7RsCkf,CAAkB9e,KACtDgH,EAAK,sBAAsB,ItC4C7B,SAAchH,GACZF,EAAAA,EAAUE,EAAEyB,QAAQ8G,aAAa,SAAU3I,GACzC,IAEIoB,EAFAI,EAAOpB,EAAEoB,KAAKxB,GACdmf,EAAY3d,EAAKsH,UAGrB,IADA1I,EAAEmB,QAAQC,EAAKwH,QAASmW,GACjB3d,EAAKgE,OACVpE,EAAIhB,EAAEgL,WAAWpL,GAAG,GACpBI,EAAE8B,WAAWlC,GACbmf,EAAU9W,OAAO3I,KAAK,CAAE0G,EAAG5E,EAAK4E,EAAGC,EAAG7E,EAAK6E,IACxB,eAAf7E,EAAKgE,QACP2Z,EAAU/Y,EAAI5E,EAAK4E,EACnB+Y,EAAU9Y,EAAI7E,EAAK6E,EACnB8Y,EAAU3Y,MAAQhF,EAAKgF,MACvB2Y,EAAUzY,OAASlF,EAAKkF,QAE1B1G,EAAIoB,EACJI,EAAOpB,EAAEoB,KAAKxB,EAElB,GACF,CsChEmCue,CAAene,KAChDgH,EAAK,4BAA4B,IA0OnC,SAA8BhH,GAC5BF,EAAAA,EAAUE,EAAEY,SAAS,SAAUC,GAC7B,IAAIE,EAAOf,EAAEe,KAAKF,GAClB,GAAIgC,OAAOC,UAAUC,eAAeC,KAAKjC,EAAM,KAI7C,OAHsB,MAAlBA,EAAK8H,UAAsC,MAAlB9H,EAAK8H,WAChC9H,EAAKqF,OAASrF,EAAK0c,aAEb1c,EAAK8H,UACX,IAAK,IACH9H,EAAKiF,GAAKjF,EAAKqF,MAAQ,EAAIrF,EAAK0c,YAChC,MACF,IAAK,IACH1c,EAAKiF,GAAKjF,EAAKqF,MAAQ,EAAIrF,EAAK0c,YAIxC,GACF,CA3PyCuB,CAAqBhf,KAC5DgH,EAAK,4BAA4B,IAAMwX,GAAsBxe,KAC7DgH,EAAK,sBAAsB,IA4J7B,SAAwBhH,GACtB,IAAIif,EAAO/V,OAAOC,kBACd+V,EAAO,EACPC,EAAOjW,OAAOC,kBACdiW,EAAO,EACPtG,EAAa9Y,EAAEyB,QACf4d,EAAUvG,EAAWwG,SAAW,EAChCC,EAAUzG,EAAW0G,SAAW,EAEpC,SAASC,EAAYva,GACnB,IAAIc,EAAId,EAAMc,EACVC,EAAIf,EAAMe,EACVjF,EAAIkE,EAAMkB,MACVC,EAAInB,EAAMoB,OACd2Y,EAAOzhB,KAAKmW,IAAIsL,EAAMjZ,EAAIhF,EAAI,GAC9Bke,EAAO1hB,KAAKG,IAAIuhB,EAAMlZ,EAAIhF,EAAI,GAC9Bme,EAAO3hB,KAAKmW,IAAIwL,EAAMlZ,EAAII,EAAI,GAC9B+Y,EAAO5hB,KAAKG,IAAIyhB,EAAMnZ,EAAII,EAAI,EAChC,CAEAvG,EAAAA,EAAUE,EAAEQ,SAAS,SAAUZ,GAC7B6f,EAAYzf,EAAEoB,KAAKxB,GACrB,IACAE,EAAAA,EAAUE,EAAEY,SAAS,SAAUC,GAC7B,IAAIE,EAAOf,EAAEe,KAAKF,GACdgC,OAAOC,UAAUC,eAAeC,KAAKjC,EAAM,MAC7C0e,EAAY1e,EAEhB,IAEAke,GAAQI,EACRF,GAAQI,EAERzf,EAAAA,EAAUE,EAAEQ,SAAS,SAAUZ,GAC7B,IAAIwB,EAAOpB,EAAEoB,KAAKxB,GAClBwB,EAAK4E,GAAKiZ,EACV7d,EAAK6E,GAAKkZ,CACZ,IAEArf,EAAAA,EAAUE,EAAEY,SAAS,SAAUC,GAC7B,IAAIE,EAAOf,EAAEe,KAAKF,GAClBf,EAAAA,EAAUiB,EAAKkH,QAAQ,SAAUyX,GAC/BA,EAAE1Z,GAAKiZ,EACPS,EAAEzZ,GAAKkZ,CACT,IACItc,OAAOC,UAAUC,eAAeC,KAAKjC,EAAM,OAC7CA,EAAKiF,GAAKiZ,GAERpc,OAAOC,UAAUC,eAAeC,KAAKjC,EAAM,OAC7CA,EAAKkF,GAAKkZ,EAEd,IAEArG,EAAW1S,MAAQ8Y,EAAOD,EAAOI,EACjCvG,EAAWxS,OAAS8Y,EAAOD,EAAOI,CACpC,CAnNmCI,CAAe3f,KAChDgH,EAAK,4BAA4B,IAoNnC,SAA8BhH,GAC5BF,EAAAA,EAAUE,EAAEY,SAAS,SAAUC,GAC7B,IAGI+e,EAAIC,EAHJ9e,EAAOf,EAAEe,KAAKF,GACdif,EAAQ9f,EAAEoB,KAAKP,EAAEjB,GACjBmgB,EAAQ/f,EAAEoB,KAAKP,EAAEG,GAEhBD,EAAKkH,QAKR2X,EAAK7e,EAAKkH,OAAO,GACjB4X,EAAK9e,EAAKkH,OAAOlH,EAAKkH,OAAOhK,OAAS,KALtC8C,EAAKkH,OAAS,GACd2X,EAAKG,EACLF,EAAKC,GAKP/e,EAAKkH,OAAO+X,QAAQtY,EAAmBoY,EAAOF,IAC9C7e,EAAKkH,OAAO3I,KAAKoI,EAAmBqY,EAAOF,GAC7C,GACF,CArOyCI,CAAqBjgB,KAC5DgH,EAAK,qBAAqB,IAyP5B,SAAuChH,GACrCF,EAAAA,EAAUE,EAAEY,SAAS,SAAUC,GAC7B,IAAIE,EAAOf,EAAEe,KAAKF,GACdE,EAAKuC,UACPvC,EAAKkH,OAAO8L,SAEhB,GACF,CAhQkCmM,CAA8BlgB,KAC9DgH,EAAK,oBAAoB,IjDJ3B,SAAchH,GACZF,EAAAA,EAAUE,EAAEY,SAAS,SAAUC,GAC7B,IAAIqC,EAAQlD,EAAEe,KAAKF,GACnB,GAAIqC,EAAMI,SAAU,CAClBtD,EAAEmD,WAAWtC,GAEb,IAAIuC,EAAcF,EAAME,mBACjBF,EAAMI,gBACNJ,EAAME,YACbpD,EAAEmB,QAAQN,EAAEG,EAAGH,EAAEjB,EAAGsD,EAAOE,EAC7B,CACF,GACF,CiDRiCya,CAAa7d,IAC9C,CAjC8BmgB,CAAUvD,EAAa5V,KACjDA,EAAK,sBAAsB,IAwC/B,SAA0B6V,EAAYD,GACpC9c,EAAAA,EAAU+c,EAAWrc,SAAS,SAAUZ,GACtC,IAAIwgB,EAAavD,EAAWzb,KAAKxB,GAC7BygB,EAAczD,EAAYxb,KAAKxB,GAE/BwgB,IACFA,EAAWpa,EAAIqa,EAAYra,EAC3Boa,EAAWna,EAAIoa,EAAYpa,EAEvB2W,EAAYlX,SAAS9F,GAAG3B,SAC1BmiB,EAAWha,MAAQia,EAAYja,MAC/Bga,EAAW9Z,OAAS+Z,EAAY/Z,QAGtC,IAEAxG,EAAAA,EAAU+c,EAAWjc,SAAS,SAAUC,GACtC,IAAIuf,EAAavD,EAAW9b,KAAKF,GAC7Bwf,EAAczD,EAAY7b,KAAKF,GAEnCuf,EAAWnY,OAASoY,EAAYpY,OAC5BpF,OAAOC,UAAUC,eAAeC,KAAKqd,EAAa,OACpDD,EAAWpa,EAAIqa,EAAYra,EAC3Boa,EAAWna,EAAIoa,EAAYpa,EAE/B,IAEA4W,EAAWpb,QAAQ2E,MAAQwW,EAAYnb,QAAQ2E,MAC/CyW,EAAWpb,QAAQ6E,OAASsW,EAAYnb,QAAQ6E,MAClD,CArEqCga,CAAiBtgB,EAAG4c,IAAa,GAEtE,CAqEA,IAAIK,GAAgB,CAAC,UAAW,UAAW,UAAW,UAAW,WAC7DF,GAAgB,CAAEV,QAAS,GAAIlD,QAAS,GAAID,QAAS,GAAIpR,QAAS,MAClEoV,GAAa,CAAC,YAAa,SAAU,UAAW,SAChDC,GAAe,CAAC,QAAS,UACzBC,GAAe,CAAEhX,MAAO,EAAGE,OAAQ,GACnCgX,GAAe,CAAC,SAAU,SAAU,QAAS,SAAU,eACvDD,GAAe,CACjBpU,OAAQ,EACRhI,OAAQ,EACRmF,MAAO,EACPE,OAAQ,EACRmX,YAAa,GACb5U,SAAU,KAER0U,GAAY,CAAC,YAkSjB,SAASP,GAAkBuD,EAAKrb,GAC9B,OAAOpF,EAAYA,EAAOygB,EAAKrb,GAAQgE,OACzC,CAEA,SAAS4T,GAAa5X,GACpB,IAAIsb,EAAW,CAAC,EAIhB,OAHA1gB,EAAAA,EAAUoF,GAAO,SAAUtF,EAAGD,GAC5B6gB,EAAS7gB,EAAEoI,eAAiBnI,CAC9B,IACO4gB,CACT,C,iCCpZA,IAGIzd,EAHcF,OAAOC,UAGQC,eAcjC,QAJA,SAAiBQ,EAAQoB,GACvB,OAAiB,MAAVpB,GAAkBR,EAAeC,KAAKO,EAAQoB,EACvD,E,cCkBA,QAJA,SAAapB,EAAQI,GACnB,OAAiB,MAAVJ,IAAkBkd,EAAAA,EAAAA,GAAQld,EAAQI,EAAM+c,EACjD,C,kECRA,QAbA,SAAoBC,GAClB,OAAO,SAASxP,EAAYyP,EAAWC,GACrC,IAAIC,EAAWje,OAAOsO,GACtB,KAAK4P,EAAAA,EAAAA,GAAY5P,GAAa,CAC5B,IAAI3M,GAAWC,EAAAA,EAAAA,GAAamc,EAAW,GACvCzP,GAAa6P,EAAAA,EAAAA,GAAK7P,GAClByP,EAAY,SAASjc,GAAO,OAAOH,EAASsc,EAASnc,GAAMA,EAAKmc,EAAW,CAC7E,CACA,IAAI9iB,EAAQ2iB,EAAcxP,EAAYyP,EAAWC,GACjD,OAAO7iB,GAAS,EAAI8iB,EAAStc,EAAW2M,EAAWnT,GAASA,QAASK,CACvE,CACF,E,wBCjBIX,EAAYF,KAAKG,ICoCrB,QAFWsjB,GDGX,SAAmB7c,EAAOwc,EAAWC,GACnC,IAAI5iB,EAAkB,MAATmG,EAAgB,EAAIA,EAAMnG,OACvC,IAAKA,EACH,OAAQ,EAEV,IAAID,EAAqB,MAAb6iB,EAAoB,GAAIK,EAAAA,EAAAA,GAAUL,GAI9C,OAHI7iB,EAAQ,IACVA,EAAQN,EAAUO,EAASD,EAAO,KAE7BmjB,EAAAA,EAAAA,GAAc/c,GAAOK,EAAAA,EAAAA,GAAamc,EAAW,GAAI5iB,EAC1D,G,iJEFA,QAlCA,SAAiBuF,EAAQI,EAAMD,EAAO0d,GACpC,KAAKC,EAAAA,EAAAA,GAAS9d,GACZ,OAAOA,EAST,IALA,IAAIvF,GAAS,EACTC,GAHJ0F,GAAO2d,EAAAA,EAAAA,GAAS3d,EAAMJ,IAGJtF,OACdsjB,EAAYtjB,EAAS,EACrBujB,EAASje,EAEI,MAAVie,KAAoBxjB,EAAQC,GAAQ,CACzC,IAAI0G,GAAM8c,EAAAA,EAAAA,GAAM9d,EAAK3F,IACjB0jB,EAAWhe,EAEf,GAAY,cAARiB,GAA+B,gBAARA,GAAiC,cAARA,EAClD,OAAOpB,EAGT,GAAIvF,GAASujB,EAAW,CACtB,IAAII,EAAWH,EAAO7c,QAELtG,KADjBqjB,EAAWN,EAAaA,EAAWO,EAAUhd,EAAK6c,QAAUnjB,KAE1DqjB,GAAWL,EAAAA,EAAAA,GAASM,GAChBA,GACCC,EAAAA,EAAAA,GAAQje,EAAK3F,EAAQ,IAAM,GAAK,CAAC,EAE1C,EACAiS,EAAAA,EAAAA,GAAYuR,EAAQ7c,EAAK+c,GACzBF,EAASA,EAAO7c,EAClB,CACA,OAAOpB,CACT,ECnBA,QAhBA,SAAoBA,EAAQC,EAAOod,GAKjC,IAJA,IAAI5iB,GAAS,EACTC,EAASuF,EAAMvF,OACfC,EAAS,CAAC,IAELF,EAAQC,GAAQ,CACvB,IAAI0F,EAAOH,EAAMxF,GACb0F,GAAQ6N,EAAAA,EAAAA,GAAQhO,EAAQI,GAExBid,EAAUld,EAAOC,IACnBke,EAAQ3jB,GAAQojB,EAAAA,EAAAA,GAAS3d,EAAMJ,GAASG,EAE5C,CACA,OAAOxF,CACT,C,gDCIA,QAnBA,SAAsBkG,EAAOI,EAAUsd,GAIrC,IAHA,IAAI9jB,GAAS,EACTC,EAASmG,EAAMnG,SAEVD,EAAQC,GAAQ,CACvB,IAAIyF,EAAQU,EAAMpG,GACd+jB,EAAUvd,EAASd,GAEvB,GAAe,MAAXqe,SAAiC1jB,IAAb2jB,EACfD,IAAYA,KAAYvR,EAAAA,EAAAA,GAASuR,GAClCD,EAAWC,EAASC,IAE1B,IAAIA,EAAWD,EACX7jB,EAASwF,CAEjB,CACA,OAAOxF,CACT,C,kCC5BA,IAAI+jB,EAAe,KAiBnB,QAPA,SAAyBC,GAGvB,IAFA,IAAIlkB,EAAQkkB,EAAOjkB,OAEZD,KAAWikB,EAAaE,KAAKD,EAAOE,OAAOpkB,MAClD,OAAOA,CACT,ECbA,IAAIqkB,EAAc,OAelB,QANA,SAAkBH,GAChB,OAAOA,EACHA,EAAOnW,MAAM,EAAGuW,EAAgBJ,GAAU,GAAGK,QAAQF,EAAa,IAClEH,CACN,E,wBCRIM,EAAa,qBAGbC,EAAa,aAGbC,EAAY,cAGZC,EAAeC,SA8CnB,QArBA,SAAkBlf,GAChB,GAAoB,iBAATA,EACT,OAAOA,EAET,IAAI8M,EAAAA,EAAAA,GAAS9M,GACX,OA1CM,IA4CR,IAAI2d,EAAAA,EAAAA,GAAS3d,GAAQ,CACnB,IAAIS,EAAgC,mBAAjBT,EAAMmf,QAAwBnf,EAAMmf,UAAYnf,EACnEA,GAAQ2d,EAAAA,EAAAA,GAASld,GAAUA,EAAQ,GAAMA,CAC3C,CACA,GAAoB,iBAATT,EACT,OAAiB,IAAVA,EAAcA,GAASA,EAEhCA,EAAQof,EAASpf,GACjB,IAAIqf,EAAWN,EAAWN,KAAKze,GAC/B,OAAQqf,GAAYL,EAAUP,KAAKze,GAC/Bif,EAAajf,EAAMqI,MAAM,GAAIgX,EAAW,EAAI,GAC3CP,EAAWL,KAAKze,GAvDb,KAuD6BA,CACvC,EC1DA,IAAIsf,EAAW,IAsCf,QAZA,SAAkBtf,GAChB,OAAKA,GAGLA,EAAQuf,EAASvf,MACHsf,GAAYtf,KAAU,IA9BpB,uBA+BFA,EAAQ,GAAK,EAAI,GAGxBA,IAAUA,EAAQA,EAAQ,EAPd,IAAVA,EAAcA,EAAQ,CAQjC,C,oECVA,QALA,SAAkBA,GAChB,MAAuB,iBAATA,KACV4N,EAAAA,EAAAA,GAAQ5N,KAAUwf,EAAAA,EAAAA,GAAaxf,IArBrB,oBAqB+Byf,EAAAA,EAAAA,GAAWzf,EAC1D,C,kCCRA,QALA,SAAcU,GACZ,IAAInG,EAAkB,MAATmG,EAAgB,EAAIA,EAAMnG,OACvC,OAAOA,EAASmG,EAAMnG,EAAS,QAAKI,CACtC,C,0DCIA,QAVA,SAAiB8S,EAAY3M,GAC3B,IAAIxG,GAAS,EACTE,GAAS6iB,EAAAA,EAAAA,GAAY5P,GAAchT,MAAMgT,EAAWlT,QAAU,GAKlE,OAHAmlB,EAAAA,EAAAA,GAASjS,GAAY,SAASzN,EAAOiB,EAAKwM,GACxCjT,IAASF,GAASwG,EAASd,EAAOiB,EAAKwM,EACzC,IACOjT,CACT,C,8ECbImlB,EAAcxgB,OAAOC,UAGrBC,EAAiBsgB,EAAYtgB,eAsDjC,SA/Be6O,EAAAA,EAAAA,IAAS,SAASrO,EAAQ3B,GACvC2B,EAASV,OAAOU,GAEhB,IAAIvF,GAAS,EACTC,EAAS2D,EAAQ3D,OACjBqlB,EAAQrlB,EAAS,EAAI2D,EAAQ,QAAKvD,EAMtC,IAJIilB,IAASllB,EAAAA,EAAAA,GAAewD,EAAQ,GAAIA,EAAQ,GAAI0hB,KAClDrlB,EAAS,KAGFD,EAAQC,GAMf,IALA,IAAIwV,EAAS7R,EAAQ5D,GACjB4R,GAAQ4H,EAAAA,EAAAA,GAAO/D,GACf8P,GAAc,EACdC,EAAc5T,EAAM3R,SAEfslB,EAAaC,GAAa,CACjC,IAAI7e,EAAMiL,EAAM2T,GACZ7f,EAAQH,EAAOoB,SAELtG,IAAVqF,IACC+f,EAAAA,EAAAA,GAAG/f,EAAO2f,EAAY1e,MAAU5B,EAAeC,KAAKO,EAAQoB,MAC/DpB,EAAOoB,GAAO8O,EAAO9O,GAEzB,CAGF,OAAOpB,CACT,G,kCChDA,QAJA,SAAgBG,EAAOS,GACrB,OAAOT,EAAQS,CACjB,C,gDCUA,QALA,SAAiBC,GAEf,OADsB,MAATA,EAAgB,EAAIA,EAAMnG,SACvB6T,EAAAA,EAAAA,GAAY1N,EAAO,GAAK,EAC1C,C,gDCgBA,QAPA,SAAmBV,GACjB,IAAIxF,GAASI,EAAAA,EAAAA,GAASoF,GAClBggB,EAAYxlB,EAAS,EAEzB,OAAOA,IAAWA,EAAUwlB,EAAYxlB,EAASwlB,EAAYxlB,EAAU,CACzE,C,4ECmBA,QALA,SAAaiT,EAAY3M,GAEvB,QADW8M,EAAAA,EAAAA,GAAQH,GAAcE,EAAAA,EAAWI,EAAAA,GAChCN,GAAY1M,EAAAA,EAAAA,GAAaD,EAAU,GACjD,C,oECtBA,QANA,SAAaJ,GACX,OAAQA,GAASA,EAAMnG,QACnBoG,EAAAA,EAAAA,GAAaD,EAAOE,EAAAA,EAAUyE,EAAAA,QAC9B1K,CACN,C,oJCDA,SAJYuT,EAAAA,EAAAA,IAAS,SAAS+R,GAC5B,OAAOC,EAAAA,EAAAA,IAAS9R,EAAAA,EAAAA,GAAY6R,EAAQ,EAAGE,EAAAA,GAAmB,GAC5D,I,wBCpBIC,EAAa,KAsBV,MAAMzjB,EACX3B,WAAAA,GAAuB,IAAXge,EAAI3V,UAAA9I,OAAA,QAAAI,IAAA0I,UAAA,GAAAA,UAAA,GAAG,CAAC,EAClBjI,KAAKilB,aAAclhB,OAAOC,UAAUC,eAAeC,KAAK0Z,EAAM,aAC1DA,EAAKlT,SAET1K,KAAKklB,gBAAgBnhB,OAAOC,UAAUC,eAAeC,KAAK0Z,EAAM,eAC5DA,EAAKnX,WAETzG,KAAKmlB,cAAcphB,OAAOC,UAAUC,eAAeC,KAAK0Z,EAAM,aAC1DA,EAAKnN,SAITzQ,KAAKolB,YAAS7lB,EAGdS,KAAKqlB,oBAAsBrkB,EAAAA,OAAWzB,GAGtCS,KAAKslB,oBAAsBtkB,EAAAA,OAAWzB,GAGtCS,KAAKulB,OAAS,CAAC,EAEXvlB,KAAKmlB,cAEPnlB,KAAKwlB,QAAU,CAAC,EAGhBxlB,KAAKylB,UAAY,CAAC,EAClBzlB,KAAKylB,UAAUT,GAAc,CAAC,GAIhChlB,KAAK0lB,IAAM,CAAC,EAGZ1lB,KAAK2lB,OAAS,CAAC,EAGf3lB,KAAK4lB,KAAO,CAAC,EAGb5lB,KAAK6lB,MAAQ,CAAC,EAGd7lB,KAAK8lB,UAAY,CAAC,EAGlB9lB,KAAK+lB,YAAc,CAAC,CACtB,CAEA9Z,UAAAA,GACE,OAAOjM,KAAKilB,WACd,CACAve,YAAAA,GACE,OAAO1G,KAAKklB,aACd,CACAc,UAAAA,GACE,OAAOhmB,KAAKmlB,WACd,CACAxe,QAAAA,CAASvC,GAEP,OADApE,KAAKolB,OAAShhB,EACPpE,IACT,CACA2C,KAAAA,GACE,OAAO3C,KAAKolB,MACd,CAEA1U,mBAAAA,CAAoBuV,GAKlB,OAJKjlB,EAAAA,EAAailB,KAChBA,EAAajlB,EAAAA,EAAWilB,IAE1BjmB,KAAKqlB,oBAAsBY,EACpBjmB,IACT,CACAoB,SAAAA,GACE,OAAOpB,KAAKkmB,UACd,CACAxkB,KAAAA,GACE,OAAOV,EAAAA,EAAOhB,KAAKulB,OACrB,CACAziB,OAAAA,GACE,IAAIqjB,EAAOnmB,KACX,OAAOgB,EAAAA,EAAShB,KAAK0B,SAAS,SAAUZ,GACtC,OAAOE,EAAAA,EAAUmlB,EAAKT,IAAI5kB,GAC5B,GACF,CACAiC,KAAAA,GACE,IAAIojB,EAAOnmB,KACX,OAAOgB,EAAAA,EAAShB,KAAK0B,SAAS,SAAUZ,GACtC,OAAOE,EAAAA,EAAUmlB,EAAKP,KAAK9kB,GAC7B,GACF,CACAslB,QAAAA,CAASra,EAAInH,GACX,IAAIyhB,EAAOpe,UACPke,EAAOnmB,KAQX,OAPAgB,EAAAA,EAAO+K,GAAI,SAAUjL,GACfulB,EAAKlnB,OAAS,EAChBgnB,EAAKxkB,QAAQb,EAAG8D,GAEhBuhB,EAAKxkB,QAAQb,EAEjB,IACOd,IACT,CACA2B,OAAAA,CAAQb,EAAG8D,GACT,OAAIb,OAAOC,UAAUC,eAAeC,KAAKlE,KAAKulB,OAAQzkB,IAChDmH,UAAU9I,OAAS,IACrBa,KAAKulB,OAAOzkB,GAAK8D,GAEZ5E,OAITA,KAAKulB,OAAOzkB,GAAKmH,UAAU9I,OAAS,EAAIyF,EAAQ5E,KAAKqlB,oBAAoBvkB,GACrEd,KAAKmlB,cACPnlB,KAAKwlB,QAAQ1kB,GAAKkkB,EAClBhlB,KAAKylB,UAAU3kB,GAAK,CAAC,EACrBd,KAAKylB,UAAUT,GAAYlkB,IAAK,GAElCd,KAAK0lB,IAAI5kB,GAAK,CAAC,EACfd,KAAK2lB,OAAO7kB,GAAK,CAAC,EAClBd,KAAK4lB,KAAK9kB,GAAK,CAAC,EAChBd,KAAK6lB,MAAM/kB,GAAK,CAAC,IACfd,KAAKkmB,WACAlmB,KACT,CACAsC,IAAAA,CAAKxB,GACH,OAAOd,KAAKulB,OAAOzkB,EACrB,CACAuF,OAAAA,CAAQvF,GACN,OAAOiD,OAAOC,UAAUC,eAAeC,KAAKlE,KAAKulB,OAAQzkB,EAC3D,CACAkC,UAAAA,CAAWlC,GACT,GAAIiD,OAAOC,UAAUC,eAAeC,KAAKlE,KAAKulB,OAAQzkB,GAAI,CACxD,IAAIuD,EAActC,GAAM/B,KAAKqE,WAAWrE,KAAK8lB,UAAU/jB,WAChD/B,KAAKulB,OAAOzkB,GACfd,KAAKmlB,cACPnlB,KAAKsmB,4BAA4BxlB,UAC1Bd,KAAKwlB,QAAQ1kB,GACpBE,EAAAA,EAAOhB,KAAK4G,SAAS9F,IAAKoM,IACxBlN,KAAK6I,UAAUqE,EAAM,WAEhBlN,KAAKylB,UAAU3kB,IAExBE,EAAAA,EAAOA,EAAAA,EAAOhB,KAAK0lB,IAAI5kB,IAAKuD,UACrBrE,KAAK0lB,IAAI5kB,UACTd,KAAK2lB,OAAO7kB,GACnBE,EAAAA,EAAOA,EAAAA,EAAOhB,KAAK4lB,KAAK9kB,IAAKuD,UACtBrE,KAAK4lB,KAAK9kB,UACVd,KAAK6lB,MAAM/kB,KAChBd,KAAKkmB,UACT,CACA,OAAOlmB,IACT,CACA6I,SAAAA,CAAU/H,EAAGsM,GACX,IAAKpN,KAAKmlB,YACR,MAAM,IAAI1d,MAAM,6CAGlB,GAAIzG,EAAAA,EAAcoM,GAChBA,EAAS4X,MACJ,CAGL,IAAK,IAAIuB,EADTnZ,GAAU,IACmBpM,EAAAA,EAAculB,GAAWA,EAAWvmB,KAAKoN,OAAOmZ,GAC3E,GAAIA,IAAazlB,EACf,MAAM,IAAI2G,MAAM,WAAa2F,EAAS,iBAAmBtM,EAAI,yBAIjEd,KAAK2B,QAAQyL,EACf,CAMA,OAJApN,KAAK2B,QAAQb,GACbd,KAAKsmB,4BAA4BxlB,GACjCd,KAAKwlB,QAAQ1kB,GAAKsM,EAClBpN,KAAKylB,UAAUrY,GAAQtM,IAAK,EACrBd,IACT,CACAsmB,2BAAAA,CAA4BxlB,UACnBd,KAAKylB,UAAUzlB,KAAKwlB,QAAQ1kB,IAAIA,EACzC,CACAsM,MAAAA,CAAOtM,GACL,GAAId,KAAKmlB,YAAa,CACpB,IAAI/X,EAASpN,KAAKwlB,QAAQ1kB,GAC1B,GAAIsM,IAAW4X,EACb,OAAO5X,CAEX,CACF,CACAxG,QAAAA,CAAS9F,GAKP,GAJIE,EAAAA,EAAcF,KAChBA,EAAIkkB,GAGFhlB,KAAKmlB,YAAa,CACpB,IAAIve,EAAW5G,KAAKylB,UAAU3kB,GAC9B,GAAI8F,EACF,OAAO5F,EAAAA,EAAO4F,EAElB,KAAO,IAAI9F,IAAMkkB,EACf,OAAOhlB,KAAK0B,QACP,GAAI1B,KAAKqG,QAAQvF,GACtB,MAAO,EACT,CACF,CACAyV,YAAAA,CAAazV,GACX,IAAI0lB,EAASxmB,KAAK2lB,OAAO7kB,GACzB,GAAI0lB,EACF,OAAOxlB,EAAAA,EAAOwlB,EAElB,CACAta,UAAAA,CAAWpL,GACT,IAAI2lB,EAAQzmB,KAAK6lB,MAAM/kB,GACvB,GAAI2lB,EACF,OAAOzlB,EAAAA,EAAOylB,EAElB,CACAta,SAAAA,CAAUrL,GACR,IAAI4lB,EAAQ1mB,KAAKuW,aAAazV,GAC9B,GAAI4lB,EACF,OAAO1lB,EAAQ0lB,EAAO1mB,KAAKkM,WAAWpL,GAE1C,CACA6lB,MAAAA,CAAO7lB,GAOL,OAA4B,KALxBd,KAAKiM,aACKjM,KAAKkM,WAAWpL,GAEhBd,KAAKmM,UAAUrL,IAEZ3B,MACnB,CACAynB,WAAAA,CAAYC,GAEV,IAAIC,EAAO,IAAI9mB,KAAKJ,YAAY,CAC9B8K,SAAU1K,KAAKilB,YACfxe,WAAYzG,KAAKklB,cACjBzU,SAAUzQ,KAAKmlB,cAGjB2B,EAAKngB,SAAS3G,KAAK2C,SAEnB,IAAIwjB,EAAOnmB,KACXgB,EAAAA,EAAOhB,KAAKulB,QAAQ,SAAU3gB,EAAO9D,GAC/B+lB,EAAO/lB,IACTgmB,EAAKnlB,QAAQb,EAAG8D,EAEpB,IAEA5D,EAAAA,EAAOhB,KAAK8lB,WAAW,SAAU/jB,GAE3B+kB,EAAKzgB,QAAQtE,EAAEjB,IAAMgmB,EAAKzgB,QAAQtE,EAAEG,IACtC4kB,EAAKzkB,QAAQN,EAAGokB,EAAKlkB,KAAKF,GAE9B,IAEA,IAAIglB,EAAU,CAAC,EACf,SAASC,EAAWlmB,GAClB,IAAIsM,EAAS+Y,EAAK/Y,OAAOtM,GACzB,YAAevB,IAAX6N,GAAwB0Z,EAAKzgB,QAAQ+G,IACvC2Z,EAAQjmB,GAAKsM,EACNA,GACEA,KAAU2Z,EACZA,EAAQ3Z,GAER4Z,EAAW5Z,EAEtB,CAQA,OANIpN,KAAKmlB,aACPnkB,EAAAA,EAAO8lB,EAAKplB,SAAS,SAAUZ,GAC7BgmB,EAAKje,UAAU/H,EAAGkmB,EAAWlmB,GAC/B,IAGKgmB,CACT,CAEAG,mBAAAA,CAAoBhB,GAKlB,OAJKjlB,EAAAA,EAAailB,KAChBA,EAAajlB,EAAAA,EAAWilB,IAE1BjmB,KAAKslB,oBAAsBW,EACpBjmB,IACT,CACAknB,SAAAA,GACE,OAAOlnB,KAAKmnB,UACd,CACArlB,KAAAA,GACE,OAAOd,EAAAA,EAAShB,KAAK8lB,UACvB,CACAsB,OAAAA,CAAQrb,EAAInH,GACV,IAAIuhB,EAAOnmB,KACPqmB,EAAOpe,UASX,OARAjH,EAAAA,EAAS+K,GAAI,SAAUjL,EAAGoB,GAMxB,OALImkB,EAAKlnB,OAAS,EAChBgnB,EAAK9jB,QAAQvB,EAAGoB,EAAG0C,GAEnBuhB,EAAK9jB,QAAQvB,EAAGoB,GAEXA,CACT,IACOlC,IACT,CAKAqC,OAAAA,GACE,IAAIvB,EAAGoB,EAAGqC,EAAMK,EACZyiB,GAAiB,EACjBC,EAAOrf,UAAU,GAED,kBAATqf,GAA8B,OAATA,GAAiB,MAAOA,GACtDxmB,EAAIwmB,EAAKxmB,EACToB,EAAIolB,EAAKplB,EACTqC,EAAO+iB,EAAK/iB,KACa,IAArB0D,UAAU9I,SACZyF,EAAQqD,UAAU,GAClBof,GAAiB,KAGnBvmB,EAAIwmB,EACJplB,EAAI+F,UAAU,GACd1D,EAAO0D,UAAU,GACbA,UAAU9I,OAAS,IACrByF,EAAQqD,UAAU,GAClBof,GAAiB,IAIrBvmB,EAAI,GAAKA,EACToB,EAAI,GAAKA,EACJlB,EAAAA,EAAcuD,KACjBA,EAAO,GAAKA,GAGd,IAAIxC,EAAIwlB,EAAavnB,KAAKilB,YAAankB,EAAGoB,EAAGqC,GAC7C,GAAIR,OAAOC,UAAUC,eAAeC,KAAKlE,KAAK+lB,YAAahkB,GAIzD,OAHIslB,IACFrnB,KAAK+lB,YAAYhkB,GAAK6C,GAEjB5E,KAGT,IAAKgB,EAAAA,EAAcuD,KAAUvE,KAAKklB,cAChC,MAAM,IAAIzd,MAAM,qDAKlBzH,KAAK2B,QAAQb,GACbd,KAAK2B,QAAQO,GAGblC,KAAK+lB,YAAYhkB,GAAKslB,EAAiBziB,EAAQ5E,KAAKslB,oBAAoBxkB,EAAGoB,EAAGqC,GAE9E,IAAIuF,EA8GR,SAAuBmC,EAAYub,EAAIC,EAAIljB,GACzC,IAAIzD,EAAI,GAAK0mB,EACTtlB,EAAI,GAAKulB,EACb,IAAKxb,GAAcnL,EAAIoB,EAAG,CACxB,IAAI+R,EAAMnT,EACVA,EAAIoB,EACJA,EAAI+R,CACN,CACA,IAAInK,EAAU,CAAEhJ,EAAGA,EAAGoB,EAAGA,GACrBqC,IACFuF,EAAQvF,KAAOA,GAEjB,OAAOuF,CACT,CA3HkB4d,CAAc1nB,KAAKilB,YAAankB,EAAGoB,EAAGqC,GAYpD,OAVAzD,EAAIgJ,EAAQhJ,EACZoB,EAAI4H,EAAQ5H,EAEZ6B,OAAO4jB,OAAO7d,GACd9J,KAAK8lB,UAAU/jB,GAAK+H,EACpB8d,EAAqB5nB,KAAK2lB,OAAOzjB,GAAIpB,GACrC8mB,EAAqB5nB,KAAK6lB,MAAM/kB,GAAIoB,GACpClC,KAAK0lB,IAAIxjB,GAAGH,GAAK+H,EACjB9J,KAAK4lB,KAAK9kB,GAAGiB,GAAK+H,EAClB9J,KAAKmnB,aACEnnB,IACT,CACAiC,IAAAA,CAAKnB,EAAGoB,EAAGqC,GACT,IAAIxC,EACmB,IAArBkG,UAAU9I,OACN0oB,EAAY7nB,KAAKilB,YAAahd,UAAU,IACxCsf,EAAavnB,KAAKilB,YAAankB,EAAGoB,EAAGqC,GAC3C,OAAOvE,KAAK+lB,YAAYhkB,EAC1B,CACAgM,OAAAA,CAAQjN,EAAGoB,EAAGqC,GACZ,IAAIxC,EACmB,IAArBkG,UAAU9I,OACN0oB,EAAY7nB,KAAKilB,YAAahd,UAAU,IACxCsf,EAAavnB,KAAKilB,YAAankB,EAAGoB,EAAGqC,GAC3C,OAAOR,OAAOC,UAAUC,eAAeC,KAAKlE,KAAK+lB,YAAahkB,EAChE,CACAsC,UAAAA,CAAWvD,EAAGoB,EAAGqC,GACf,IAAIxC,EACmB,IAArBkG,UAAU9I,OACN0oB,EAAY7nB,KAAKilB,YAAahd,UAAU,IACxCsf,EAAavnB,KAAKilB,YAAankB,EAAGoB,EAAGqC,GACvCtC,EAAOjC,KAAK8lB,UAAU/jB,GAY1B,OAXIE,IACFnB,EAAImB,EAAKnB,EACToB,EAAID,EAAKC,SACFlC,KAAK+lB,YAAYhkB,UACjB/B,KAAK8lB,UAAU/jB,GACtB+lB,EAAuB9nB,KAAK2lB,OAAOzjB,GAAIpB,GACvCgnB,EAAuB9nB,KAAK6lB,MAAM/kB,GAAIoB,UAC/BlC,KAAK0lB,IAAIxjB,GAAGH,UACZ/B,KAAK4lB,KAAK9kB,GAAGiB,GACpB/B,KAAKmnB,cAEAnnB,IACT,CACAsD,OAAAA,CAAQxC,EAAG6M,GACT,IAAIwI,EAAMnW,KAAK0lB,IAAI5kB,GACnB,GAAIqV,EAAK,CACP,IAAIrU,EAAQd,EAAAA,EAASmV,GACrB,OAAKxI,EAGE3M,EAAAA,EAASc,GAAO,SAAUG,GAC/B,OAAOA,EAAKnB,IAAM6M,CACpB,IAJS7L,CAKX,CACF,CACAsB,QAAAA,CAAStC,EAAGoB,GACV,IAAI6lB,EAAO/nB,KAAK4lB,KAAK9kB,GACrB,GAAIinB,EAAM,CACR,IAAIjmB,EAAQd,EAAAA,EAAS+mB,GACrB,OAAK7lB,EAGElB,EAAAA,EAASc,GAAO,SAAUG,GAC/B,OAAOA,EAAKC,IAAMA,CACpB,IAJSJ,CAKX,CACF,CACAiJ,SAAAA,CAAUjK,EAAGoB,GACX,IAAIoB,EAAUtD,KAAKsD,QAAQxC,EAAGoB,GAC9B,GAAIoB,EACF,OAAOA,EAAQJ,OAAOlD,KAAKoD,SAAStC,EAAGoB,GAE3C,EASF,SAAS0lB,EAAqBplB,EAAK3B,GAC7B2B,EAAI3B,GACN2B,EAAI3B,KAEJ2B,EAAI3B,GAAK,CAEb,CAEA,SAASinB,EAAuBtlB,EAAK3B,KAC5B2B,EAAI3B,WACF2B,EAAI3B,EAEf,CAEA,SAAS0mB,EAAatb,EAAYub,EAAIC,EAAIljB,GACxC,IAAIzD,EAAI,GAAK0mB,EACTtlB,EAAI,GAAKulB,EACb,IAAKxb,GAAcnL,EAAIoB,EAAG,CACxB,IAAI+R,EAAMnT,EACVA,EAAIoB,EACJA,EAAI+R,CACN,CACA,OAAOnT,EAxeY,OAweSoB,EAxeT,QAwe+BlB,EAAAA,EAAcuD,GA1e1C,KA0esEA,EAC9F,CAiBA,SAASsjB,EAAY5b,EAAYnC,GAC/B,OAAOyd,EAAatb,EAAYnC,EAAQhJ,EAAGgJ,EAAQ5H,EAAG4H,EAAQvF,KAChE,CA/CAhD,EAAMyC,UAAUkiB,WAAa,EAG7B3kB,EAAMyC,UAAUmjB,WAAa,C","sources":["../node_modules/lodash-es/uniqueId.js","../node_modules/lodash-es/_baseRange.js","../node_modules/lodash-es/range.js","../node_modules/lodash-es/_createRange.js","../node_modules/dagre-d3-es/src/dagre/data/list.js","../node_modules/dagre-d3-es/src/dagre/greedy-fas.js","../node_modules/dagre-d3-es/src/dagre/acyclic.js","../node_modules/lodash-es/_basePick.js","../node_modules/lodash-es/pick.js","../node_modules/lodash-es/_flatRest.js","../node_modules/lodash-es/_baseGt.js","../node_modules/lodash-es/max.js","../node_modules/lodash-es/mapValues.js","../node_modules/lodash-es/now.js","../node_modules/dagre-d3-es/src/dagre/util.js","../node_modules/dagre-d3-es/src/dagre/add-border-segments.js","../node_modules/dagre-d3-es/src/dagre/coordinate-system.js","../node_modules/dagre-d3-es/src/dagre/normalize.js","../node_modules/lodash-es/minBy.js","../node_modules/dagre-d3-es/src/dagre/rank/util.js","../node_modules/dagre-d3-es/src/dagre/rank/feasible-tree.js","../node_modules/dagre-d3-es/src/graphlib/alg/dijkstra.js","../node_modules/dagre-d3-es/src/graphlib/alg/floyd-warshall.js","../node_modules/lodash-es/_asciiSize.js","../node_modules/lodash-es/_hasUnicode.js","../node_modules/lodash-es/_unicodeSize.js","../node_modules/dagre-d3-es/src/graphlib/alg/topsort.js","../node_modules/dagre-d3-es/src/graphlib/alg/dfs.js","../node_modules/dagre-d3-es/src/dagre/rank/network-simplex.js","../node_modules/dagre-d3-es/src/graphlib/alg/postorder.js","../node_modules/dagre-d3-es/src/graphlib/alg/preorder.js","../node_modules/dagre-d3-es/src/dagre/rank/index.js","../node_modules/dagre-d3-es/src/dagre/nesting-graph.js","../node_modules/lodash-es/cloneDeep.js","../node_modules/dagre-d3-es/src/dagre/order/build-layer-graph.js","../node_modules/lodash-es/_baseZipObject.js","../node_modules/lodash-es/zipObject.js","../node_modules/lodash-es/_baseSortBy.js","../node_modules/lodash-es/_compareAscending.js","../node_modules/lodash-es/_compareMultiple.js","../node_modules/lodash-es/_baseOrderBy.js","../node_modules/lodash-es/sortBy.js","../node_modules/dagre-d3-es/src/dagre/order/cross-count.js","../node_modules/dagre-d3-es/src/dagre/order/resolve-conflicts.js","../node_modules/dagre-d3-es/src/dagre/order/sort.js","../node_modules/dagre-d3-es/src/dagre/order/sort-subgraph.js","../node_modules/dagre-d3-es/src/dagre/order/barycenter.js","../node_modules/dagre-d3-es/src/dagre/order/index.js","../node_modules/dagre-d3-es/src/dagre/order/init-order.js","../node_modules/dagre-d3-es/src/dagre/order/add-subgraph-constraints.js","../node_modules/dagre-d3-es/src/dagre/parent-dummy-chains.js","../node_modules/lodash-es/forOwn.js","../node_modules/lodash-es/forIn.js","../node_modules/dagre-d3-es/src/dagre/position/bk.js","../node_modules/dagre-d3-es/src/dagre/position/index.js","../node_modules/dagre-d3-es/src/dagre/layout.js","../node_modules/lodash-es/_baseHas.js","../node_modules/lodash-es/has.js","../node_modules/lodash-es/_createFind.js","../node_modules/lodash-es/findIndex.js","../node_modules/lodash-es/find.js","../node_modules/lodash-es/_baseSet.js","../node_modules/lodash-es/_basePickBy.js","../node_modules/lodash-es/_baseExtremum.js","../node_modules/lodash-es/_trimmedEndIndex.js","../node_modules/lodash-es/_baseTrim.js","../node_modules/lodash-es/toNumber.js","../node_modules/lodash-es/toFinite.js","../node_modules/lodash-es/isString.js","../node_modules/lodash-es/last.js","../node_modules/lodash-es/_baseMap.js","../node_modules/lodash-es/defaults.js","../node_modules/lodash-es/_baseLt.js","../node_modules/lodash-es/flatten.js","../node_modules/lodash-es/toInteger.js","../node_modules/lodash-es/map.js","../node_modules/lodash-es/min.js","../node_modules/lodash-es/union.js","../node_modules/dagre-d3-es/src/graphlib/graph.js"],"sourcesContent":["import toString from './toString.js';\n\n/** Used to generate unique IDs. */\nvar idCounter = 0;\n\n/**\n * Generates a unique ID. If `prefix` is given, the ID is appended to it.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {string} [prefix=''] The value to prefix the ID with.\n * @returns {string} Returns the unique ID.\n * @example\n *\n * _.uniqueId('contact_');\n * // => 'contact_104'\n *\n * _.uniqueId();\n * // => '105'\n */\nfunction uniqueId(prefix) {\n var id = ++idCounter;\n return toString(prefix) + id;\n}\n\nexport default uniqueId;\n","/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeCeil = Math.ceil,\n nativeMax = Math.max;\n\n/**\n * The base implementation of `_.range` and `_.rangeRight` which doesn't\n * coerce arguments.\n *\n * @private\n * @param {number} start The start of the range.\n * @param {number} end The end of the range.\n * @param {number} step The value to increment or decrement by.\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Array} Returns the range of numbers.\n */\nfunction baseRange(start, end, step, fromRight) {\n var index = -1,\n length = nativeMax(nativeCeil((end - start) / (step || 1)), 0),\n result = Array(length);\n\n while (length--) {\n result[fromRight ? length : ++index] = start;\n start += step;\n }\n return result;\n}\n\nexport default baseRange;\n","import createRange from './_createRange.js';\n\n/**\n * Creates an array of numbers (positive and/or negative) progressing from\n * `start` up to, but not including, `end`. A step of `-1` is used if a negative\n * `start` is specified without an `end` or `step`. If `end` is not specified,\n * it's set to `start` with `start` then set to `0`.\n *\n * **Note:** JavaScript follows the IEEE-754 standard for resolving\n * floating-point values which can produce unexpected results.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Util\n * @param {number} [start=0] The start of the range.\n * @param {number} end The end of the range.\n * @param {number} [step=1] The value to increment or decrement by.\n * @returns {Array} Returns the range of numbers.\n * @see _.inRange, _.rangeRight\n * @example\n *\n * _.range(4);\n * // => [0, 1, 2, 3]\n *\n * _.range(-4);\n * // => [0, -1, -2, -3]\n *\n * _.range(1, 5);\n * // => [1, 2, 3, 4]\n *\n * _.range(0, 20, 5);\n * // => [0, 5, 10, 15]\n *\n * _.range(0, -4, -1);\n * // => [0, -1, -2, -3]\n *\n * _.range(1, 4, 0);\n * // => [1, 1, 1]\n *\n * _.range(0);\n * // => []\n */\nvar range = createRange();\n\nexport default range;\n","import baseRange from './_baseRange.js';\nimport isIterateeCall from './_isIterateeCall.js';\nimport toFinite from './toFinite.js';\n\n/**\n * Creates a `_.range` or `_.rangeRight` function.\n *\n * @private\n * @param {boolean} [fromRight] Specify iterating from right to left.\n * @returns {Function} Returns the new range function.\n */\nfunction createRange(fromRight) {\n return function(start, end, step) {\n if (step && typeof step != 'number' && isIterateeCall(start, end, step)) {\n end = step = undefined;\n }\n // Ensure the sign of `-0` is preserved.\n start = toFinite(start);\n if (end === undefined) {\n end = start;\n start = 0;\n } else {\n end = toFinite(end);\n }\n step = step === undefined ? (start < end ? 1 : -1) : toFinite(step);\n return baseRange(start, end, step, fromRight);\n };\n}\n\nexport default createRange;\n","/*\n * Simple doubly linked list implementation derived from Cormen, et al.,\n * \"Introduction to Algorithms\".\n */\n\nexport { List };\n\nclass List {\n constructor() {\n var sentinel = {};\n sentinel._next = sentinel._prev = sentinel;\n this._sentinel = sentinel;\n }\n dequeue() {\n var sentinel = this._sentinel;\n var entry = sentinel._prev;\n if (entry !== sentinel) {\n unlink(entry);\n return entry;\n }\n }\n enqueue(entry) {\n var sentinel = this._sentinel;\n if (entry._prev && entry._next) {\n unlink(entry);\n }\n entry._next = sentinel._next;\n sentinel._next._prev = entry;\n sentinel._next = entry;\n entry._prev = sentinel;\n }\n toString() {\n var strs = [];\n var sentinel = this._sentinel;\n var curr = sentinel._prev;\n while (curr !== sentinel) {\n strs.push(JSON.stringify(curr, filterOutLinks));\n curr = curr._prev;\n }\n return '[' + strs.join(', ') + ']';\n }\n}\n\nfunction unlink(entry) {\n entry._prev._next = entry._next;\n entry._next._prev = entry._prev;\n delete entry._next;\n delete entry._prev;\n}\n\nfunction filterOutLinks(k, v) {\n if (k !== '_next' && k !== '_prev') {\n return v;\n }\n}\n","import * as _ from 'lodash-es';\nimport { Graph } from '../graphlib/index.js';\nimport { List } from './data/list.js';\n\n/*\n * A greedy heuristic for finding a feedback arc set for a graph. A feedback\n * arc set is a set of edges that can be removed to make a graph acyclic.\n * The algorithm comes from: P. Eades, X. Lin, and W. F. Smyth, \"A fast and\n * effective heuristic for the feedback arc set problem.\" This implementation\n * adjusts that from the paper to allow for weighted edges.\n */\nexport { greedyFAS };\n\nvar DEFAULT_WEIGHT_FN = _.constant(1);\n\nfunction greedyFAS(g, weightFn) {\n if (g.nodeCount() <= 1) {\n return [];\n }\n var state = buildState(g, weightFn || DEFAULT_WEIGHT_FN);\n var results = doGreedyFAS(state.graph, state.buckets, state.zeroIdx);\n\n // Expand multi-edges\n return _.flatten(\n _.map(results, function (e) {\n return g.outEdges(e.v, e.w);\n }),\n );\n}\n\nfunction doGreedyFAS(g, buckets, zeroIdx) {\n var results = [];\n var sources = buckets[buckets.length - 1];\n var sinks = buckets[0];\n\n var entry;\n while (g.nodeCount()) {\n while ((entry = sinks.dequeue())) {\n removeNode(g, buckets, zeroIdx, entry);\n }\n while ((entry = sources.dequeue())) {\n removeNode(g, buckets, zeroIdx, entry);\n }\n if (g.nodeCount()) {\n for (var i = buckets.length - 2; i > 0; --i) {\n entry = buckets[i].dequeue();\n if (entry) {\n results = results.concat(removeNode(g, buckets, zeroIdx, entry, true));\n break;\n }\n }\n }\n }\n\n return results;\n}\n\nfunction removeNode(g, buckets, zeroIdx, entry, collectPredecessors) {\n var results = collectPredecessors ? [] : undefined;\n\n _.forEach(g.inEdges(entry.v), function (edge) {\n var weight = g.edge(edge);\n var uEntry = g.node(edge.v);\n\n if (collectPredecessors) {\n results.push({ v: edge.v, w: edge.w });\n }\n\n uEntry.out -= weight;\n assignBucket(buckets, zeroIdx, uEntry);\n });\n\n _.forEach(g.outEdges(entry.v), function (edge) {\n var weight = g.edge(edge);\n var w = edge.w;\n var wEntry = g.node(w);\n wEntry['in'] -= weight;\n assignBucket(buckets, zeroIdx, wEntry);\n });\n\n g.removeNode(entry.v);\n\n return results;\n}\n\nfunction buildState(g, weightFn) {\n var fasGraph = new Graph();\n var maxIn = 0;\n var maxOut = 0;\n\n _.forEach(g.nodes(), function (v) {\n fasGraph.setNode(v, { v: v, in: 0, out: 0 });\n });\n\n // Aggregate weights on nodes, but also sum the weights across multi-edges\n // into a single edge for the fasGraph.\n _.forEach(g.edges(), function (e) {\n var prevWeight = fasGraph.edge(e.v, e.w) || 0;\n var weight = weightFn(e);\n var edgeWeight = prevWeight + weight;\n fasGraph.setEdge(e.v, e.w, edgeWeight);\n maxOut = Math.max(maxOut, (fasGraph.node(e.v).out += weight));\n maxIn = Math.max(maxIn, (fasGraph.node(e.w)['in'] += weight));\n });\n\n var buckets = _.range(maxOut + maxIn + 3).map(function () {\n return new List();\n });\n var zeroIdx = maxIn + 1;\n\n _.forEach(fasGraph.nodes(), function (v) {\n assignBucket(buckets, zeroIdx, fasGraph.node(v));\n });\n\n return { graph: fasGraph, buckets: buckets, zeroIdx: zeroIdx };\n}\n\nfunction assignBucket(buckets, zeroIdx, entry) {\n if (!entry.out) {\n buckets[0].enqueue(entry);\n } else if (!entry['in']) {\n buckets[buckets.length - 1].enqueue(entry);\n } else {\n buckets[entry.out - entry['in'] + zeroIdx].enqueue(entry);\n }\n}\n","import * as _ from 'lodash-es';\nimport { greedyFAS } from './greedy-fas.js';\n\nexport { run, undo };\n\nfunction run(g) {\n var fas = g.graph().acyclicer === 'greedy' ? greedyFAS(g, weightFn(g)) : dfsFAS(g);\n _.forEach(fas, function (e) {\n var label = g.edge(e);\n g.removeEdge(e);\n label.forwardName = e.name;\n label.reversed = true;\n g.setEdge(e.w, e.v, label, _.uniqueId('rev'));\n });\n\n function weightFn(g) {\n return function (e) {\n return g.edge(e).weight;\n };\n }\n}\n\nfunction dfsFAS(g) {\n var fas = [];\n var stack = {};\n var visited = {};\n\n function dfs(v) {\n if (Object.prototype.hasOwnProperty.call(visited, v)) {\n return;\n }\n visited[v] = true;\n stack[v] = true;\n _.forEach(g.outEdges(v), function (e) {\n if (Object.prototype.hasOwnProperty.call(stack, e.w)) {\n fas.push(e);\n } else {\n dfs(e.w);\n }\n });\n delete stack[v];\n }\n\n _.forEach(g.nodes(), dfs);\n return fas;\n}\n\nfunction undo(g) {\n _.forEach(g.edges(), function (e) {\n var label = g.edge(e);\n if (label.reversed) {\n g.removeEdge(e);\n\n var forwardName = label.forwardName;\n delete label.reversed;\n delete label.forwardName;\n g.setEdge(e.w, e.v, label, forwardName);\n }\n });\n}\n","import basePickBy from './_basePickBy.js';\nimport hasIn from './hasIn.js';\n\n/**\n * The base implementation of `_.pick` without support for individual\n * property identifiers.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @returns {Object} Returns the new object.\n */\nfunction basePick(object, paths) {\n return basePickBy(object, paths, function(value, path) {\n return hasIn(object, path);\n });\n}\n\nexport default basePick;\n","import basePick from './_basePick.js';\nimport flatRest from './_flatRest.js';\n\n/**\n * Creates an object composed of the picked `object` properties.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The source object.\n * @param {...(string|string[])} [paths] The property paths to pick.\n * @returns {Object} Returns the new object.\n * @example\n *\n * var object = { 'a': 1, 'b': '2', 'c': 3 };\n *\n * _.pick(object, ['a', 'c']);\n * // => { 'a': 1, 'c': 3 }\n */\nvar pick = flatRest(function(object, paths) {\n return object == null ? {} : basePick(object, paths);\n});\n\nexport default pick;\n","import flatten from './flatten.js';\nimport overRest from './_overRest.js';\nimport setToString from './_setToString.js';\n\n/**\n * A specialized version of `baseRest` which flattens the rest array.\n *\n * @private\n * @param {Function} func The function to apply a rest parameter to.\n * @returns {Function} Returns the new function.\n */\nfunction flatRest(func) {\n return setToString(overRest(func, undefined, flatten), func + '');\n}\n\nexport default flatRest;\n","/**\n * The base implementation of `_.gt` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is greater than `other`,\n * else `false`.\n */\nfunction baseGt(value, other) {\n return value > other;\n}\n\nexport default baseGt;\n","import baseExtremum from './_baseExtremum.js';\nimport baseGt from './_baseGt.js';\nimport identity from './identity.js';\n\n/**\n * Computes the maximum value of `array`. If `array` is empty or falsey,\n * `undefined` is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {*} Returns the maximum value.\n * @example\n *\n * _.max([4, 2, 8, 6]);\n * // => 8\n *\n * _.max([]);\n * // => undefined\n */\nfunction max(array) {\n return (array && array.length)\n ? baseExtremum(array, identity, baseGt)\n : undefined;\n}\n\nexport default max;\n","import baseAssignValue from './_baseAssignValue.js';\nimport baseForOwn from './_baseForOwn.js';\nimport baseIteratee from './_baseIteratee.js';\n\n/**\n * Creates an object with the same keys as `object` and values generated\n * by running each own enumerable string keyed property of `object` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, key, object).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns the new mapped object.\n * @see _.mapKeys\n * @example\n *\n * var users = {\n * 'fred': { 'user': 'fred', 'age': 40 },\n * 'pebbles': { 'user': 'pebbles', 'age': 1 }\n * };\n *\n * _.mapValues(users, function(o) { return o.age; });\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n *\n * // The `_.property` iteratee shorthand.\n * _.mapValues(users, 'age');\n * // => { 'fred': 40, 'pebbles': 1 } (iteration order is not guaranteed)\n */\nfunction mapValues(object, iteratee) {\n var result = {};\n iteratee = baseIteratee(iteratee, 3);\n\n baseForOwn(object, function(value, key, object) {\n baseAssignValue(result, key, iteratee(value, key, object));\n });\n return result;\n}\n\nexport default mapValues;\n","import root from './_root.js';\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\nexport default now;\n","import * as _ from 'lodash-es';\nimport { Graph } from '../graphlib/index.js';\n\nexport {\n addDummyNode,\n simplify,\n asNonCompoundGraph,\n successorWeights,\n predecessorWeights,\n intersectRect,\n buildLayerMatrix,\n normalizeRanks,\n removeEmptyRanks,\n addBorderNode,\n maxRank,\n partition,\n time,\n notime,\n};\n\n/*\n * Adds a dummy node to the graph and return v.\n */\nfunction addDummyNode(g, type, attrs, name) {\n var v;\n do {\n v = _.uniqueId(name);\n } while (g.hasNode(v));\n\n attrs.dummy = type;\n g.setNode(v, attrs);\n return v;\n}\n\n/*\n * Returns a new graph with only simple edges. Handles aggregation of data\n * associated with multi-edges.\n */\nfunction simplify(g) {\n var simplified = new Graph().setGraph(g.graph());\n _.forEach(g.nodes(), function (v) {\n simplified.setNode(v, g.node(v));\n });\n _.forEach(g.edges(), function (e) {\n var simpleLabel = simplified.edge(e.v, e.w) || { weight: 0, minlen: 1 };\n var label = g.edge(e);\n simplified.setEdge(e.v, e.w, {\n weight: simpleLabel.weight + label.weight,\n minlen: Math.max(simpleLabel.minlen, label.minlen),\n });\n });\n return simplified;\n}\n\nfunction asNonCompoundGraph(g) {\n var simplified = new Graph({ multigraph: g.isMultigraph() }).setGraph(g.graph());\n _.forEach(g.nodes(), function (v) {\n if (!g.children(v).length) {\n simplified.setNode(v, g.node(v));\n }\n });\n _.forEach(g.edges(), function (e) {\n simplified.setEdge(e, g.edge(e));\n });\n return simplified;\n}\n\nfunction successorWeights(g) {\n var weightMap = _.map(g.nodes(), function (v) {\n var sucs = {};\n _.forEach(g.outEdges(v), function (e) {\n sucs[e.w] = (sucs[e.w] || 0) + g.edge(e).weight;\n });\n return sucs;\n });\n return _.zipObject(g.nodes(), weightMap);\n}\n\nfunction predecessorWeights(g) {\n var weightMap = _.map(g.nodes(), function (v) {\n var preds = {};\n _.forEach(g.inEdges(v), function (e) {\n preds[e.v] = (preds[e.v] || 0) + g.edge(e).weight;\n });\n return preds;\n });\n return _.zipObject(g.nodes(), weightMap);\n}\n\n/*\n * Finds where a line starting at point ({x, y}) would intersect a rectangle\n * ({x, y, width, height}) if it were pointing at the rectangle's center.\n */\nfunction intersectRect(rect, point) {\n var x = rect.x;\n var y = rect.y;\n\n // Rectangle intersection algorithm from:\n // http://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 = rect.width / 2;\n var h = rect.height / 2;\n\n if (!dx && !dy) {\n throw new Error('Not possible to find intersection inside of the rectangle');\n }\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 = (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 = (w * dy) / dx;\n }\n\n return { x: x + sx, y: y + sy };\n}\n\n/*\n * Given a DAG with each node assigned \"rank\" and \"order\" properties, this\n * function will produce a matrix with the ids of each node.\n */\nfunction buildLayerMatrix(g) {\n var layering = _.map(_.range(maxRank(g) + 1), function () {\n return [];\n });\n _.forEach(g.nodes(), function (v) {\n var node = g.node(v);\n var rank = node.rank;\n if (!_.isUndefined(rank)) {\n layering[rank][node.order] = v;\n }\n });\n return layering;\n}\n\n/*\n * Adjusts the ranks for all nodes in the graph such that all nodes v have\n * rank(v) >= 0 and at least one node w has rank(w) = 0.\n */\nfunction normalizeRanks(g) {\n var min = _.min(\n _.map(g.nodes(), function (v) {\n return g.node(v).rank;\n }),\n );\n _.forEach(g.nodes(), function (v) {\n var node = g.node(v);\n if (_.has(node, 'rank')) {\n node.rank -= min;\n }\n });\n}\n\nfunction removeEmptyRanks(g) {\n // Ranks may not start at 0, so we need to offset them\n var offset = _.min(\n _.map(g.nodes(), function (v) {\n return g.node(v).rank;\n }),\n );\n\n var layers = [];\n _.forEach(g.nodes(), function (v) {\n var rank = g.node(v).rank - offset;\n if (!layers[rank]) {\n layers[rank] = [];\n }\n layers[rank].push(v);\n });\n\n var delta = 0;\n var nodeRankFactor = g.graph().nodeRankFactor;\n _.forEach(layers, function (vs, i) {\n if (_.isUndefined(vs) && i % nodeRankFactor !== 0) {\n --delta;\n } else if (delta) {\n _.forEach(vs, function (v) {\n g.node(v).rank += delta;\n });\n }\n });\n}\n\nfunction addBorderNode(g, prefix, rank, order) {\n var node = {\n width: 0,\n height: 0,\n };\n if (arguments.length >= 4) {\n node.rank = rank;\n node.order = order;\n }\n return addDummyNode(g, 'border', node, prefix);\n}\n\nfunction maxRank(g) {\n return _.max(\n _.map(g.nodes(), function (v) {\n var rank = g.node(v).rank;\n if (!_.isUndefined(rank)) {\n return rank;\n }\n }),\n );\n}\n\n/*\n * Partition a collection into two groups: `lhs` and `rhs`. If the supplied\n * function returns true for an entry it goes into `lhs`. Otherwise it goes\n * into `rhs.\n */\nfunction partition(collection, fn) {\n var result = { lhs: [], rhs: [] };\n _.forEach(collection, function (value) {\n if (fn(value)) {\n result.lhs.push(value);\n } else {\n result.rhs.push(value);\n }\n });\n return result;\n}\n\n/*\n * Returns a new function that wraps `fn` with a timer. The wrapper logs the\n * time it takes to execute the function.\n */\nfunction time(name, fn) {\n var start = _.now();\n try {\n return fn();\n } finally {\n console.log(name + ' time: ' + (_.now() - start) + 'ms');\n }\n}\n\nfunction notime(name, fn) {\n return fn();\n}\n","import * as _ from 'lodash-es';\nimport * as util from './util.js';\n\nexport { addBorderSegments };\n\nfunction addBorderSegments(g) {\n function dfs(v) {\n var children = g.children(v);\n var node = g.node(v);\n if (children.length) {\n _.forEach(children, dfs);\n }\n\n if (Object.prototype.hasOwnProperty.call(node, 'minRank')) {\n node.borderLeft = [];\n node.borderRight = [];\n for (var rank = node.minRank, maxRank = node.maxRank + 1; rank < maxRank; ++rank) {\n addBorderNode(g, 'borderLeft', '_bl', v, node, rank);\n addBorderNode(g, 'borderRight', '_br', v, node, rank);\n }\n }\n }\n\n _.forEach(g.children(), dfs);\n}\n\nfunction addBorderNode(g, prop, prefix, sg, sgNode, rank) {\n var label = { width: 0, height: 0, rank: rank, borderType: prop };\n var prev = sgNode[prop][rank - 1];\n var curr = util.addDummyNode(g, 'border', label, prefix);\n sgNode[prop][rank] = curr;\n g.setParent(curr, sg);\n if (prev) {\n g.setEdge(prev, curr, { weight: 1 });\n }\n}\n","import * as _ from 'lodash-es';\n\nexport { adjust, undo };\n\nfunction adjust(g) {\n var rankDir = g.graph().rankdir.toLowerCase();\n if (rankDir === 'lr' || rankDir === 'rl') {\n swapWidthHeight(g);\n }\n}\n\nfunction undo(g) {\n var rankDir = g.graph().rankdir.toLowerCase();\n if (rankDir === 'bt' || rankDir === 'rl') {\n reverseY(g);\n }\n\n if (rankDir === 'lr' || rankDir === 'rl') {\n swapXY(g);\n swapWidthHeight(g);\n }\n}\n\nfunction swapWidthHeight(g) {\n _.forEach(g.nodes(), function (v) {\n swapWidthHeightOne(g.node(v));\n });\n _.forEach(g.edges(), function (e) {\n swapWidthHeightOne(g.edge(e));\n });\n}\n\nfunction swapWidthHeightOne(attrs) {\n var w = attrs.width;\n attrs.width = attrs.height;\n attrs.height = w;\n}\n\nfunction reverseY(g) {\n _.forEach(g.nodes(), function (v) {\n reverseYOne(g.node(v));\n });\n\n _.forEach(g.edges(), function (e) {\n var edge = g.edge(e);\n _.forEach(edge.points, reverseYOne);\n if (Object.prototype.hasOwnProperty.call(edge, 'y')) {\n reverseYOne(edge);\n }\n });\n}\n\nfunction reverseYOne(attrs) {\n attrs.y = -attrs.y;\n}\n\nfunction swapXY(g) {\n _.forEach(g.nodes(), function (v) {\n swapXYOne(g.node(v));\n });\n\n _.forEach(g.edges(), function (e) {\n var edge = g.edge(e);\n _.forEach(edge.points, swapXYOne);\n if (Object.prototype.hasOwnProperty.call(edge, 'x')) {\n swapXYOne(edge);\n }\n });\n}\n\nfunction swapXYOne(attrs) {\n var x = attrs.x;\n attrs.x = attrs.y;\n attrs.y = x;\n}\n","/**\n * TypeScript type imports:\n *\n * @import { Graph } from '../graphlib/graph.js';\n */\nimport * as _ from 'lodash-es';\nimport * as util from './util.js';\n\nexport { run, undo };\n\n/*\n * Breaks any long edges in the graph into short segments that span 1 layer\n * each. This operation is undoable with the denormalize function.\n *\n * Pre-conditions:\n *\n * 1. The input graph is a DAG.\n * 2. Each node in the graph has a \"rank\" property.\n *\n * Post-condition:\n *\n * 1. All edges in the graph have a length of 1.\n * 2. Dummy nodes are added where edges have been split into segments.\n * 3. The graph is augmented with a \"dummyChains\" attribute which contains\n * the first dummy in each chain of dummy nodes produced.\n */\nfunction run(g) {\n g.graph().dummyChains = [];\n _.forEach(g.edges(), function (edge) {\n normalizeEdge(g, edge);\n });\n}\n\n/**\n * @param {Graph} g\n */\nfunction normalizeEdge(g, e) {\n var v = e.v;\n var vRank = g.node(v).rank;\n var w = e.w;\n var wRank = g.node(w).rank;\n var name = e.name;\n var edgeLabel = g.edge(e);\n var labelRank = edgeLabel.labelRank;\n\n if (wRank === vRank + 1) return;\n\n g.removeEdge(e);\n\n /**\n * @typedef {Object} Attrs\n * @property {number} width\n * @property {number} height\n * @property {ReturnType} edgeLabel\n * @property {any} edgeObj\n * @property {ReturnType[\"rank\"]} rank\n * @property {string} [dummy]\n * @property {ReturnType[\"labelpos\"]} [labelpos]\n */\n\n /** @type {Attrs | undefined} */\n var attrs = undefined;\n var dummy, i;\n for (i = 0, ++vRank; vRank < wRank; ++i, ++vRank) {\n edgeLabel.points = [];\n attrs = {\n width: 0,\n height: 0,\n edgeLabel: edgeLabel,\n edgeObj: e,\n rank: vRank,\n };\n dummy = util.addDummyNode(g, 'edge', attrs, '_d');\n if (vRank === labelRank) {\n attrs.width = edgeLabel.width;\n attrs.height = edgeLabel.height;\n attrs.dummy = 'edge-label';\n attrs.labelpos = edgeLabel.labelpos;\n }\n g.setEdge(v, dummy, { weight: edgeLabel.weight }, name);\n if (i === 0) {\n g.graph().dummyChains.push(dummy);\n }\n v = dummy;\n }\n\n g.setEdge(v, w, { weight: edgeLabel.weight }, name);\n}\n\nfunction undo(g) {\n _.forEach(g.graph().dummyChains, function (v) {\n var node = g.node(v);\n var origLabel = node.edgeLabel;\n var w;\n g.setEdge(node.edgeObj, origLabel);\n while (node.dummy) {\n w = g.successors(v)[0];\n g.removeNode(v);\n origLabel.points.push({ x: node.x, y: node.y });\n if (node.dummy === 'edge-label') {\n origLabel.x = node.x;\n origLabel.y = node.y;\n origLabel.width = node.width;\n origLabel.height = node.height;\n }\n v = w;\n node = g.node(v);\n }\n });\n}\n","import baseExtremum from './_baseExtremum.js';\nimport baseIteratee from './_baseIteratee.js';\nimport baseLt from './_baseLt.js';\n\n/**\n * This method is like `_.min` except that it accepts `iteratee` which is\n * invoked for each element in `array` to generate the criterion by which\n * the value is ranked. The iteratee is invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Math\n * @param {Array} array The array to iterate over.\n * @param {Function} [iteratee=_.identity] The iteratee invoked per element.\n * @returns {*} Returns the minimum value.\n * @example\n *\n * var objects = [{ 'n': 1 }, { 'n': 2 }];\n *\n * _.minBy(objects, function(o) { return o.n; });\n * // => { 'n': 1 }\n *\n * // The `_.property` iteratee shorthand.\n * _.minBy(objects, 'n');\n * // => { 'n': 1 }\n */\nfunction minBy(array, iteratee) {\n return (array && array.length)\n ? baseExtremum(array, baseIteratee(iteratee, 2), baseLt)\n : undefined;\n}\n\nexport default minBy;\n","import * as _ from 'lodash-es';\n\nexport { longestPath, slack };\n\n/*\n * Initializes ranks for the input graph using the longest path algorithm. This\n * algorithm scales well and is fast in practice, it yields rather poor\n * solutions. Nodes are pushed to the lowest layer possible, leaving the bottom\n * ranks wide and leaving edges longer than necessary. However, due to its\n * speed, this algorithm is good for getting an initial ranking that can be fed\n * into other algorithms.\n *\n * This algorithm does not normalize layers because it will be used by other\n * algorithms in most cases. If using this algorithm directly, be sure to\n * run normalize at the end.\n *\n * Pre-conditions:\n *\n * 1. Input graph is a DAG.\n * 2. Input graph node labels can be assigned properties.\n *\n * Post-conditions:\n *\n * 1. Each node will be assign an (unnormalized) \"rank\" property.\n */\nfunction longestPath(g) {\n var visited = {};\n\n function dfs(v) {\n var label = g.node(v);\n if (Object.prototype.hasOwnProperty.call(visited, v)) {\n return label.rank;\n }\n visited[v] = true;\n\n var rank = _.min(\n _.map(g.outEdges(v), function (e) {\n return dfs(e.w) - g.edge(e).minlen;\n }),\n );\n\n if (\n rank === Number.POSITIVE_INFINITY || // return value of _.map([]) for Lodash 3\n rank === undefined || // return value of _.map([]) for Lodash 4\n rank === null\n ) {\n // return value of _.map([null])\n rank = 0;\n }\n\n return (label.rank = rank);\n }\n\n _.forEach(g.sources(), dfs);\n}\n\n/*\n * Returns the amount of slack for the given edge. The slack is defined as the\n * difference between the length of the edge and its minimum length.\n */\nfunction slack(g, e) {\n return g.node(e.w).rank - g.node(e.v).rank - g.edge(e).minlen;\n}\n","import * as _ from 'lodash-es';\nimport { Graph } from '../../graphlib/index.js';\nimport { slack } from './util.js';\n\nexport { feasibleTree };\n\n/*\n * Constructs a spanning tree with tight edges and adjusted the input node's\n * ranks to achieve this. A tight edge is one that is has a length that matches\n * its \"minlen\" attribute.\n *\n * The basic structure for this function is derived from Gansner, et al., \"A\n * Technique for Drawing Directed Graphs.\"\n *\n * Pre-conditions:\n *\n * 1. Graph must be a DAG.\n * 2. Graph must be connected.\n * 3. Graph must have at least one node.\n * 5. Graph nodes must have been previously assigned a \"rank\" property that\n * respects the \"minlen\" property of incident edges.\n * 6. Graph edges must have a \"minlen\" property.\n *\n * Post-conditions:\n *\n * - Graph nodes will have their rank adjusted to ensure that all edges are\n * tight.\n *\n * Returns a tree (undirected graph) that is constructed using only \"tight\"\n * edges.\n */\nfunction feasibleTree(g) {\n var t = new Graph({ directed: false });\n\n // Choose arbitrary node from which to start our tree\n var start = g.nodes()[0];\n var size = g.nodeCount();\n t.setNode(start, {});\n\n var edge, delta;\n while (tightTree(t, g) < size) {\n edge = findMinSlackEdge(t, g);\n delta = t.hasNode(edge.v) ? slack(g, edge) : -slack(g, edge);\n shiftRanks(t, g, delta);\n }\n\n return t;\n}\n\n/*\n * Finds a maximal tree of tight edges and returns the number of nodes in the\n * tree.\n */\nfunction tightTree(t, g) {\n function dfs(v) {\n _.forEach(g.nodeEdges(v), function (e) {\n var edgeV = e.v,\n w = v === edgeV ? e.w : edgeV;\n if (!t.hasNode(w) && !slack(g, e)) {\n t.setNode(w, {});\n t.setEdge(v, w, {});\n dfs(w);\n }\n });\n }\n\n _.forEach(t.nodes(), dfs);\n return t.nodeCount();\n}\n\n/*\n * Finds the edge with the smallest slack that is incident on tree and returns\n * it.\n */\nfunction findMinSlackEdge(t, g) {\n return _.minBy(g.edges(), function (e) {\n if (t.hasNode(e.v) !== t.hasNode(e.w)) {\n return slack(g, e);\n }\n });\n}\n\nfunction shiftRanks(t, g, delta) {\n _.forEach(t.nodes(), function (v) {\n g.node(v).rank += delta;\n });\n}\n","import * as _ from 'lodash-es';\nimport { PriorityQueue } from '../data/priority-queue.js';\n\nexport { dijkstra };\n\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\n\nfunction dijkstra(g, source, weightFn, edgeFn) {\n return runDijkstra(\n g,\n String(source),\n weightFn || DEFAULT_WEIGHT_FUNC,\n edgeFn ||\n function (v) {\n return g.outEdges(v);\n },\n );\n}\n\nfunction runDijkstra(g, source, weightFn, edgeFn) {\n var results = {};\n var pq = new PriorityQueue();\n var v, vEntry;\n\n var updateNeighbors = function (edge) {\n var w = edge.v !== v ? edge.v : edge.w;\n var wEntry = results[w];\n var weight = weightFn(edge);\n var distance = vEntry.distance + weight;\n\n if (weight < 0) {\n throw new Error(\n 'dijkstra does not allow negative edge weights. ' +\n 'Bad edge: ' +\n edge +\n ' Weight: ' +\n weight,\n );\n }\n\n if (distance < wEntry.distance) {\n wEntry.distance = distance;\n wEntry.predecessor = v;\n pq.decrease(w, distance);\n }\n };\n\n g.nodes().forEach(function (v) {\n var distance = v === source ? 0 : Number.POSITIVE_INFINITY;\n results[v] = { distance: distance };\n pq.add(v, distance);\n });\n\n while (pq.size() > 0) {\n v = pq.removeMin();\n vEntry = results[v];\n if (vEntry.distance === Number.POSITIVE_INFINITY) {\n break;\n }\n\n edgeFn(v).forEach(updateNeighbors);\n }\n\n return results;\n}\n","import * as _ from 'lodash-es';\n\nexport { floydWarshall };\n\nvar DEFAULT_WEIGHT_FUNC = _.constant(1);\n\nfunction floydWarshall(g, weightFn, edgeFn) {\n return runFloydWarshall(\n g,\n weightFn || DEFAULT_WEIGHT_FUNC,\n edgeFn ||\n function (v) {\n return g.outEdges(v);\n },\n );\n}\n\nfunction runFloydWarshall(g, weightFn, edgeFn) {\n var results = {};\n var nodes = g.nodes();\n\n nodes.forEach(function (v) {\n results[v] = {};\n results[v][v] = { distance: 0 };\n nodes.forEach(function (w) {\n if (v !== w) {\n results[v][w] = { distance: Number.POSITIVE_INFINITY };\n }\n });\n edgeFn(v).forEach(function (edge) {\n var w = edge.v === v ? edge.w : edge.v;\n var d = weightFn(edge);\n results[v][w] = { distance: d, predecessor: v };\n });\n });\n\n nodes.forEach(function (k) {\n var rowK = results[k];\n nodes.forEach(function (i) {\n var rowI = results[i];\n nodes.forEach(function (j) {\n var ik = rowI[k];\n var kj = rowK[j];\n var ij = rowI[j];\n var altDistance = ik.distance + kj.distance;\n if (altDistance < ij.distance) {\n ij.distance = altDistance;\n ij.predecessor = kj.predecessor;\n }\n });\n });\n });\n\n return results;\n}\n","import baseProperty from './_baseProperty.js';\n\n/**\n * Gets the size of an ASCII `string`.\n *\n * @private\n * @param {string} string The string inspect.\n * @returns {number} Returns the string size.\n */\nvar asciiSize = baseProperty('length');\n\nexport default asciiSize;\n","/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f',\n reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n rsVarRange = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsZWJ = '\\\\u200d';\n\n/** Used to detect strings with [zero-width joiners or code points from the astral planes](http://eev.ee/blog/2015/09/12/dark-corners-of-unicode/). */\nvar reHasUnicode = RegExp('[' + rsZWJ + rsAstralRange + rsComboRange + rsVarRange + ']');\n\n/**\n * Checks if `string` contains Unicode symbols.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {boolean} Returns `true` if a symbol is found, else `false`.\n */\nfunction hasUnicode(string) {\n return reHasUnicode.test(string);\n}\n\nexport default hasUnicode;\n","/** Used to compose unicode character classes. */\nvar rsAstralRange = '\\\\ud800-\\\\udfff',\n rsComboMarksRange = '\\\\u0300-\\\\u036f',\n reComboHalfMarksRange = '\\\\ufe20-\\\\ufe2f',\n rsComboSymbolsRange = '\\\\u20d0-\\\\u20ff',\n rsComboRange = rsComboMarksRange + reComboHalfMarksRange + rsComboSymbolsRange,\n rsVarRange = '\\\\ufe0e\\\\ufe0f';\n\n/** Used to compose unicode capture groups. */\nvar rsAstral = '[' + rsAstralRange + ']',\n rsCombo = '[' + rsComboRange + ']',\n rsFitz = '\\\\ud83c[\\\\udffb-\\\\udfff]',\n rsModifier = '(?:' + rsCombo + '|' + rsFitz + ')',\n rsNonAstral = '[^' + rsAstralRange + ']',\n rsRegional = '(?:\\\\ud83c[\\\\udde6-\\\\uddff]){2}',\n rsSurrPair = '[\\\\ud800-\\\\udbff][\\\\udc00-\\\\udfff]',\n rsZWJ = '\\\\u200d';\n\n/** Used to compose unicode regexes. */\nvar reOptMod = rsModifier + '?',\n rsOptVar = '[' + rsVarRange + ']?',\n rsOptJoin = '(?:' + rsZWJ + '(?:' + [rsNonAstral, rsRegional, rsSurrPair].join('|') + ')' + rsOptVar + reOptMod + ')*',\n rsSeq = rsOptVar + reOptMod + rsOptJoin,\n rsSymbol = '(?:' + [rsNonAstral + rsCombo + '?', rsCombo, rsRegional, rsSurrPair, rsAstral].join('|') + ')';\n\n/** Used to match [string symbols](https://mathiasbynens.be/notes/javascript-unicode). */\nvar reUnicode = RegExp(rsFitz + '(?=' + rsFitz + ')|' + rsSymbol + rsSeq, 'g');\n\n/**\n * Gets the size of a Unicode `string`.\n *\n * @private\n * @param {string} string The string inspect.\n * @returns {number} Returns the string size.\n */\nfunction unicodeSize(string) {\n var result = reUnicode.lastIndex = 0;\n while (reUnicode.test(string)) {\n ++result;\n }\n return result;\n}\n\nexport default unicodeSize;\n","import * as _ from 'lodash-es';\n\nexport { topsort, CycleException };\n\ntopsort.CycleException = CycleException;\n\nfunction topsort(g) {\n var visited = {};\n var stack = {};\n var results = [];\n\n function visit(node) {\n if (Object.prototype.hasOwnProperty.call(stack, node)) {\n throw new CycleException();\n }\n\n if (!Object.prototype.hasOwnProperty.call(visited, node)) {\n stack[node] = true;\n visited[node] = true;\n _.each(g.predecessors(node), visit);\n delete stack[node];\n results.push(node);\n }\n }\n\n _.each(g.sinks(), visit);\n\n if (_.size(visited) !== g.nodeCount()) {\n throw new CycleException();\n }\n\n return results;\n}\n\nfunction CycleException() {}\nCycleException.prototype = new Error(); // must be an instance of Error to pass testing\n","import * as _ from 'lodash-es';\n\nexport { dfs };\n\n/*\n * A helper that preforms a pre- or post-order traversal on the input graph\n * and returns the nodes in the order they were visited. If the graph is\n * undirected then this algorithm will navigate using neighbors. If the graph\n * is directed then this algorithm will navigate using successors.\n *\n * Order must be one of \"pre\" or \"post\".\n */\nfunction dfs(g, vs, order) {\n if (!_.isArray(vs)) {\n vs = [vs];\n }\n\n var navigation = (g.isDirected() ? g.successors : g.neighbors).bind(g);\n\n var acc = [];\n var visited = {};\n _.each(vs, function (v) {\n if (!g.hasNode(v)) {\n throw new Error('Graph does not have node: ' + v);\n }\n\n doDfs(g, v, order === 'post', visited, navigation, acc);\n });\n return acc;\n}\n\nfunction doDfs(g, v, postorder, visited, navigation, acc) {\n if (!Object.prototype.hasOwnProperty.call(visited, v)) {\n visited[v] = true;\n\n if (!postorder) {\n acc.push(v);\n }\n _.each(navigation(v), function (w) {\n doDfs(g, w, postorder, visited, navigation, acc);\n });\n if (postorder) {\n acc.push(v);\n }\n }\n}\n","import * as _ from 'lodash-es';\nimport * as alg from '../../graphlib/alg/index.js';\nimport { simplify } from '../util.js';\nimport { feasibleTree } from './feasible-tree.js';\nimport { longestPath, slack } from './util.js';\n\nexport { networkSimplex };\n\n// Expose some internals for testing purposes\nnetworkSimplex.initLowLimValues = initLowLimValues;\nnetworkSimplex.initCutValues = initCutValues;\nnetworkSimplex.calcCutValue = calcCutValue;\nnetworkSimplex.leaveEdge = leaveEdge;\nnetworkSimplex.enterEdge = enterEdge;\nnetworkSimplex.exchangeEdges = exchangeEdges;\n\n/*\n * The network simplex algorithm assigns ranks to each node in the input graph\n * and iteratively improves the ranking to reduce the length of edges.\n *\n * Preconditions:\n *\n * 1. The input graph must be a DAG.\n * 2. All nodes in the graph must have an object value.\n * 3. All edges in the graph must have \"minlen\" and \"weight\" attributes.\n *\n * Postconditions:\n *\n * 1. All nodes in the graph will have an assigned \"rank\" attribute that has\n * been optimized by the network simplex algorithm. Ranks start at 0.\n *\n *\n * A rough sketch of the algorithm is as follows:\n *\n * 1. Assign initial ranks to each node. We use the longest path algorithm,\n * which assigns ranks to the lowest position possible. In general this\n * leads to very wide bottom ranks and unnecessarily long edges.\n * 2. Construct a feasible tight tree. A tight tree is one such that all\n * edges in the tree have no slack (difference between length of edge\n * and minlen for the edge). This by itself greatly improves the assigned\n * rankings by shorting edges.\n * 3. Iteratively find edges that have negative cut values. Generally a\n * negative cut value indicates that the edge could be removed and a new\n * tree edge could be added to produce a more compact graph.\n *\n * Much of the algorithms here are derived from Gansner, et al., \"A Technique\n * for Drawing Directed Graphs.\" The structure of the file roughly follows the\n * structure of the overall algorithm.\n */\nfunction networkSimplex(g) {\n g = simplify(g);\n longestPath(g);\n var t = feasibleTree(g);\n initLowLimValues(t);\n initCutValues(t, g);\n\n var e, f;\n while ((e = leaveEdge(t))) {\n f = enterEdge(t, g, e);\n exchangeEdges(t, g, e, f);\n }\n}\n\n/*\n * Initializes cut values for all edges in the tree.\n */\nfunction initCutValues(t, g) {\n var vs = alg.postorder(t, t.nodes());\n vs = vs.slice(0, vs.length - 1);\n _.forEach(vs, function (v) {\n assignCutValue(t, g, v);\n });\n}\n\nfunction assignCutValue(t, g, child) {\n var childLab = t.node(child);\n var parent = childLab.parent;\n t.edge(child, parent).cutvalue = calcCutValue(t, g, child);\n}\n\n/*\n * Given the tight tree, its graph, and a child in the graph calculate and\n * return the cut value for the edge between the child and its parent.\n */\nfunction calcCutValue(t, g, child) {\n var childLab = t.node(child);\n var parent = childLab.parent;\n // True if the child is on the tail end of the edge in the directed graph\n var childIsTail = true;\n // The graph's view of the tree edge we're inspecting\n var graphEdge = g.edge(child, parent);\n // The accumulated cut value for the edge between this node and its parent\n var cutValue = 0;\n\n if (!graphEdge) {\n childIsTail = false;\n graphEdge = g.edge(parent, child);\n }\n\n cutValue = graphEdge.weight;\n\n _.forEach(g.nodeEdges(child), function (e) {\n var isOutEdge = e.v === child,\n other = isOutEdge ? e.w : e.v;\n\n if (other !== parent) {\n var pointsToHead = isOutEdge === childIsTail,\n otherWeight = g.edge(e).weight;\n\n cutValue += pointsToHead ? otherWeight : -otherWeight;\n if (isTreeEdge(t, child, other)) {\n var otherCutValue = t.edge(child, other).cutvalue;\n cutValue += pointsToHead ? -otherCutValue : otherCutValue;\n }\n }\n });\n\n return cutValue;\n}\n\nfunction initLowLimValues(tree, root) {\n if (arguments.length < 2) {\n root = tree.nodes()[0];\n }\n dfsAssignLowLim(tree, {}, 1, root);\n}\n\nfunction dfsAssignLowLim(tree, visited, nextLim, v, parent) {\n var low = nextLim;\n var label = tree.node(v);\n\n visited[v] = true;\n _.forEach(tree.neighbors(v), function (w) {\n if (!Object.prototype.hasOwnProperty.call(visited, w)) {\n nextLim = dfsAssignLowLim(tree, visited, nextLim, w, v);\n }\n });\n\n label.low = low;\n label.lim = nextLim++;\n if (parent) {\n label.parent = parent;\n } else {\n // TODO should be able to remove this when we incrementally update low lim\n delete label.parent;\n }\n\n return nextLim;\n}\n\nfunction leaveEdge(tree) {\n return _.find(tree.edges(), function (e) {\n return tree.edge(e).cutvalue < 0;\n });\n}\n\nfunction enterEdge(t, g, edge) {\n var v = edge.v;\n var w = edge.w;\n\n // For the rest of this function we assume that v is the tail and w is the\n // head, so if we don't have this edge in the graph we should flip it to\n // match the correct orientation.\n if (!g.hasEdge(v, w)) {\n v = edge.w;\n w = edge.v;\n }\n\n var vLabel = t.node(v);\n var wLabel = t.node(w);\n var tailLabel = vLabel;\n var flip = false;\n\n // If the root is in the tail of the edge then we need to flip the logic that\n // checks for the head and tail nodes in the candidates function below.\n if (vLabel.lim > wLabel.lim) {\n tailLabel = wLabel;\n flip = true;\n }\n\n var candidates = _.filter(g.edges(), function (edge) {\n return (\n flip === isDescendant(t, t.node(edge.v), tailLabel) &&\n flip !== isDescendant(t, t.node(edge.w), tailLabel)\n );\n });\n\n return _.minBy(candidates, function (edge) {\n return slack(g, edge);\n });\n}\n\nfunction exchangeEdges(t, g, e, f) {\n var v = e.v;\n var w = e.w;\n t.removeEdge(v, w);\n t.setEdge(f.v, f.w, {});\n initLowLimValues(t);\n initCutValues(t, g);\n updateRanks(t, g);\n}\n\nfunction updateRanks(t, g) {\n var root = _.find(t.nodes(), function (v) {\n return !g.node(v).parent;\n });\n var vs = alg.preorder(t, root);\n vs = vs.slice(1);\n _.forEach(vs, function (v) {\n var parent = t.node(v).parent,\n edge = g.edge(v, parent),\n flipped = false;\n\n if (!edge) {\n edge = g.edge(parent, v);\n flipped = true;\n }\n\n g.node(v).rank = g.node(parent).rank + (flipped ? edge.minlen : -edge.minlen);\n });\n}\n\n/*\n * Returns true if the edge is in the tree.\n */\nfunction isTreeEdge(tree, u, v) {\n return tree.hasEdge(u, v);\n}\n\n/*\n * Returns true if the specified node is descendant of the root node per the\n * assigned low and lim attributes in the tree.\n */\nfunction isDescendant(tree, vLabel, rootLabel) {\n return rootLabel.low <= vLabel.lim && vLabel.lim <= rootLabel.lim;\n}\n","import { dfs } from './dfs.js';\n\nexport { postorder };\n\nfunction postorder(g, vs) {\n return dfs(g, vs, 'post');\n}\n","import { dfs } from './dfs.js';\n\nexport { preorder };\n\nfunction preorder(g, vs) {\n return dfs(g, vs, 'pre');\n}\n","import { feasibleTree } from './feasible-tree.js';\nimport { networkSimplex } from './network-simplex.js';\nimport { longestPath } from './util.js';\n\nexport { rank };\n\n/*\n * Assigns a rank to each node in the input graph that respects the \"minlen\"\n * constraint specified on edges between nodes.\n *\n * This basic structure is derived from Gansner, et al., \"A Technique for\n * Drawing Directed Graphs.\"\n *\n * Pre-conditions:\n *\n * 1. Graph must be a connected DAG\n * 2. Graph nodes must be objects\n * 3. Graph edges must have \"weight\" and \"minlen\" attributes\n *\n * Post-conditions:\n *\n * 1. Graph nodes will have a \"rank\" attribute based on the results of the\n * algorithm. Ranks can start at any index (including negative), we'll\n * fix them up later.\n */\nfunction rank(g) {\n switch (g.graph().ranker) {\n case 'network-simplex':\n networkSimplexRanker(g);\n break;\n case 'tight-tree':\n tightTreeRanker(g);\n break;\n case 'longest-path':\n longestPathRanker(g);\n break;\n default:\n networkSimplexRanker(g);\n }\n}\n\n// A fast and simple ranker, but results are far from optimal.\nvar longestPathRanker = longestPath;\n\nfunction tightTreeRanker(g) {\n longestPath(g);\n feasibleTree(g);\n}\n\nfunction networkSimplexRanker(g) {\n networkSimplex(g);\n}\n","import * as _ from 'lodash-es';\nimport * as util from './util.js';\n\nexport { run, cleanup };\n\n/*\n * A nesting graph creates dummy nodes for the tops and bottoms of subgraphs,\n * adds appropriate edges to ensure that all cluster nodes are placed between\n * these boundries, and ensures that the graph is connected.\n *\n * In addition we ensure, through the use of the minlen property, that nodes\n * and subgraph border nodes to not end up on the same rank.\n *\n * Preconditions:\n *\n * 1. Input graph is a DAG\n * 2. Nodes in the input graph has a minlen attribute\n *\n * Postconditions:\n *\n * 1. Input graph is connected.\n * 2. Dummy nodes are added for the tops and bottoms of subgraphs.\n * 3. The minlen attribute for nodes is adjusted to ensure nodes do not\n * get placed on the same rank as subgraph border nodes.\n *\n * The nesting graph idea comes from Sander, \"Layout of Compound Directed\n * Graphs.\"\n */\nfunction run(g) {\n var root = util.addDummyNode(g, 'root', {}, '_root');\n var depths = treeDepths(g);\n var height = _.max(_.values(depths)) - 1; // Note: depths is an Object not an array\n var nodeSep = 2 * height + 1;\n\n g.graph().nestingRoot = root;\n\n // Multiply minlen by nodeSep to align nodes on non-border ranks.\n _.forEach(g.edges(), function (e) {\n g.edge(e).minlen *= nodeSep;\n });\n\n // Calculate a weight that is sufficient to keep subgraphs vertically compact\n var weight = sumWeights(g) + 1;\n\n // Create border nodes and link them up\n _.forEach(g.children(), function (child) {\n dfs(g, root, nodeSep, weight, height, depths, child);\n });\n\n // Save the multiplier for node layers for later removal of empty border\n // layers.\n g.graph().nodeRankFactor = nodeSep;\n}\n\nfunction dfs(g, root, nodeSep, weight, height, depths, v) {\n var children = g.children(v);\n if (!children.length) {\n if (v !== root) {\n g.setEdge(root, v, { weight: 0, minlen: nodeSep });\n }\n return;\n }\n\n var top = util.addBorderNode(g, '_bt');\n var bottom = util.addBorderNode(g, '_bb');\n var label = g.node(v);\n\n g.setParent(top, v);\n label.borderTop = top;\n g.setParent(bottom, v);\n label.borderBottom = bottom;\n\n _.forEach(children, function (child) {\n dfs(g, root, nodeSep, weight, height, depths, child);\n\n var childNode = g.node(child);\n var childTop = childNode.borderTop ? childNode.borderTop : child;\n var childBottom = childNode.borderBottom ? childNode.borderBottom : child;\n var thisWeight = childNode.borderTop ? weight : 2 * weight;\n var minlen = childTop !== childBottom ? 1 : height - depths[v] + 1;\n\n g.setEdge(top, childTop, {\n weight: thisWeight,\n minlen: minlen,\n nestingEdge: true,\n });\n\n g.setEdge(childBottom, bottom, {\n weight: thisWeight,\n minlen: minlen,\n nestingEdge: true,\n });\n });\n\n if (!g.parent(v)) {\n g.setEdge(root, top, { weight: 0, minlen: height + depths[v] });\n }\n}\n\nfunction treeDepths(g) {\n var depths = {};\n function dfs(v, depth) {\n var children = g.children(v);\n if (children && children.length) {\n _.forEach(children, function (child) {\n dfs(child, depth + 1);\n });\n }\n depths[v] = depth;\n }\n _.forEach(g.children(), function (v) {\n dfs(v, 1);\n });\n return depths;\n}\n\nfunction sumWeights(g) {\n return _.reduce(\n g.edges(),\n function (acc, e) {\n return acc + g.edge(e).weight;\n },\n 0,\n );\n}\n\nfunction cleanup(g) {\n var graphLabel = g.graph();\n g.removeNode(graphLabel.nestingRoot);\n delete graphLabel.nestingRoot;\n _.forEach(g.edges(), function (e) {\n var edge = g.edge(e);\n if (edge.nestingEdge) {\n g.removeEdge(e);\n }\n });\n}\n","import baseClone from './_baseClone.js';\n\n/** Used to compose bitmasks for cloning. */\nvar CLONE_DEEP_FLAG = 1,\n CLONE_SYMBOLS_FLAG = 4;\n\n/**\n * This method is like `_.clone` except that it recursively clones `value`.\n *\n * @static\n * @memberOf _\n * @since 1.0.0\n * @category Lang\n * @param {*} value The value to recursively clone.\n * @returns {*} Returns the deep cloned value.\n * @see _.clone\n * @example\n *\n * var objects = [{ 'a': 1 }, { 'b': 2 }];\n *\n * var deep = _.cloneDeep(objects);\n * console.log(deep[0] === objects[0]);\n * // => false\n */\nfunction cloneDeep(value) {\n return baseClone(value, CLONE_DEEP_FLAG | CLONE_SYMBOLS_FLAG);\n}\n\nexport default cloneDeep;\n","import * as _ from 'lodash-es';\nimport { Graph } from '../../graphlib/index.js';\n\nexport { buildLayerGraph };\n\n/*\n * Constructs a graph that can be used to sort a layer of nodes. The graph will\n * contain all base and subgraph nodes from the request layer in their original\n * hierarchy and any edges that are incident on these nodes and are of the type\n * requested by the \"relationship\" parameter.\n *\n * Nodes from the requested rank that do not have parents are assigned a root\n * node in the output graph, which is set in the root graph attribute. This\n * makes it easy to walk the hierarchy of movable nodes during ordering.\n *\n * Pre-conditions:\n *\n * 1. Input graph is a DAG\n * 2. Base nodes in the input graph have a rank attribute\n * 3. Subgraph nodes in the input graph has minRank and maxRank attributes\n * 4. Edges have an assigned weight\n *\n * Post-conditions:\n *\n * 1. Output graph has all nodes in the movable rank with preserved\n * hierarchy.\n * 2. Root nodes in the movable layer are made children of the node\n * indicated by the root attribute of the graph.\n * 3. Non-movable nodes incident on movable nodes, selected by the\n * relationship parameter, are included in the graph (without hierarchy).\n * 4. Edges incident on movable nodes, selected by the relationship\n * parameter, are added to the output graph.\n * 5. The weights for copied edges are aggregated as need, since the output\n * graph is not a multi-graph.\n */\nfunction buildLayerGraph(g, rank, relationship) {\n var root = createRootNode(g),\n result = new Graph({ compound: true })\n .setGraph({ root: root })\n .setDefaultNodeLabel(function (v) {\n return g.node(v);\n });\n\n _.forEach(g.nodes(), function (v) {\n var node = g.node(v),\n parent = g.parent(v);\n\n if (node.rank === rank || (node.minRank <= rank && rank <= node.maxRank)) {\n result.setNode(v);\n result.setParent(v, parent || root);\n\n // This assumes we have only short edges!\n _.forEach(g[relationship](v), function (e) {\n var u = e.v === v ? e.w : e.v,\n edge = result.edge(u, v),\n weight = !_.isUndefined(edge) ? edge.weight : 0;\n result.setEdge(u, v, { weight: g.edge(e).weight + weight });\n });\n\n if (Object.prototype.hasOwnProperty.call(node, 'minRank')) {\n result.setNode(v, {\n borderLeft: node.borderLeft[rank],\n borderRight: node.borderRight[rank],\n });\n }\n }\n });\n\n return result;\n}\n\nfunction createRootNode(g) {\n var v;\n while (g.hasNode((v = _.uniqueId('_root'))));\n return v;\n}\n","/**\n * This base implementation of `_.zipObject` which assigns values using `assignFunc`.\n *\n * @private\n * @param {Array} props The property identifiers.\n * @param {Array} values The property values.\n * @param {Function} assignFunc The function to assign values.\n * @returns {Object} Returns the new object.\n */\nfunction baseZipObject(props, values, assignFunc) {\n var index = -1,\n length = props.length,\n valsLength = values.length,\n result = {};\n\n while (++index < length) {\n var value = index < valsLength ? values[index] : undefined;\n assignFunc(result, props[index], value);\n }\n return result;\n}\n\nexport default baseZipObject;\n","import assignValue from './_assignValue.js';\nimport baseZipObject from './_baseZipObject.js';\n\n/**\n * This method is like `_.fromPairs` except that it accepts two arrays,\n * one of property identifiers and one of corresponding values.\n *\n * @static\n * @memberOf _\n * @since 0.4.0\n * @category Array\n * @param {Array} [props=[]] The property identifiers.\n * @param {Array} [values=[]] The property values.\n * @returns {Object} Returns the new object.\n * @example\n *\n * _.zipObject(['a', 'b'], [1, 2]);\n * // => { 'a': 1, 'b': 2 }\n */\nfunction zipObject(props, values) {\n return baseZipObject(props || [], values || [], assignValue);\n}\n\nexport default zipObject;\n","/**\n * The base implementation of `_.sortBy` which uses `comparer` to define the\n * sort order of `array` and replaces criteria objects with their corresponding\n * values.\n *\n * @private\n * @param {Array} array The array to sort.\n * @param {Function} comparer The function to define sort order.\n * @returns {Array} Returns `array`.\n */\nfunction baseSortBy(array, comparer) {\n var length = array.length;\n\n array.sort(comparer);\n while (length--) {\n array[length] = array[length].value;\n }\n return array;\n}\n\nexport default baseSortBy;\n","import isSymbol from './isSymbol.js';\n\n/**\n * Compares values to sort them in ascending order.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {number} Returns the sort order indicator for `value`.\n */\nfunction compareAscending(value, other) {\n if (value !== other) {\n var valIsDefined = value !== undefined,\n valIsNull = value === null,\n valIsReflexive = value === value,\n valIsSymbol = isSymbol(value);\n\n var othIsDefined = other !== undefined,\n othIsNull = other === null,\n othIsReflexive = other === other,\n othIsSymbol = isSymbol(other);\n\n if ((!othIsNull && !othIsSymbol && !valIsSymbol && value > other) ||\n (valIsSymbol && othIsDefined && othIsReflexive && !othIsNull && !othIsSymbol) ||\n (valIsNull && othIsDefined && othIsReflexive) ||\n (!valIsDefined && othIsReflexive) ||\n !valIsReflexive) {\n return 1;\n }\n if ((!valIsNull && !valIsSymbol && !othIsSymbol && value < other) ||\n (othIsSymbol && valIsDefined && valIsReflexive && !valIsNull && !valIsSymbol) ||\n (othIsNull && valIsDefined && valIsReflexive) ||\n (!othIsDefined && valIsReflexive) ||\n !othIsReflexive) {\n return -1;\n }\n }\n return 0;\n}\n\nexport default compareAscending;\n","import compareAscending from './_compareAscending.js';\n\n/**\n * Used by `_.orderBy` to compare multiple properties of a value to another\n * and stable sort them.\n *\n * If `orders` is unspecified, all values are sorted in ascending order. Otherwise,\n * specify an order of \"desc\" for descending or \"asc\" for ascending sort order\n * of corresponding values.\n *\n * @private\n * @param {Object} object The object to compare.\n * @param {Object} other The other object to compare.\n * @param {boolean[]|string[]} orders The order to sort by for each property.\n * @returns {number} Returns the sort order indicator for `object`.\n */\nfunction compareMultiple(object, other, orders) {\n var index = -1,\n objCriteria = object.criteria,\n othCriteria = other.criteria,\n length = objCriteria.length,\n ordersLength = orders.length;\n\n while (++index < length) {\n var result = compareAscending(objCriteria[index], othCriteria[index]);\n if (result) {\n if (index >= ordersLength) {\n return result;\n }\n var order = orders[index];\n return result * (order == 'desc' ? -1 : 1);\n }\n }\n // Fixes an `Array#sort` bug in the JS engine embedded in Adobe applications\n // that causes it, under certain circumstances, to provide the same value for\n // `object` and `other`. See https://github.com/jashkenas/underscore/pull/1247\n // for more details.\n //\n // This also ensures a stable sort in V8 and other engines.\n // See https://bugs.chromium.org/p/v8/issues/detail?id=90 for more details.\n return object.index - other.index;\n}\n\nexport default compareMultiple;\n","import arrayMap from './_arrayMap.js';\nimport baseGet from './_baseGet.js';\nimport baseIteratee from './_baseIteratee.js';\nimport baseMap from './_baseMap.js';\nimport baseSortBy from './_baseSortBy.js';\nimport baseUnary from './_baseUnary.js';\nimport compareMultiple from './_compareMultiple.js';\nimport identity from './identity.js';\nimport isArray from './isArray.js';\n\n/**\n * The base implementation of `_.orderBy` without param guards.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function[]|Object[]|string[]} iteratees The iteratees to sort by.\n * @param {string[]} orders The sort orders of `iteratees`.\n * @returns {Array} Returns the new sorted array.\n */\nfunction baseOrderBy(collection, iteratees, orders) {\n if (iteratees.length) {\n iteratees = arrayMap(iteratees, function(iteratee) {\n if (isArray(iteratee)) {\n return function(value) {\n return baseGet(value, iteratee.length === 1 ? iteratee[0] : iteratee);\n }\n }\n return iteratee;\n });\n } else {\n iteratees = [identity];\n }\n\n var index = -1;\n iteratees = arrayMap(iteratees, baseUnary(baseIteratee));\n\n var result = baseMap(collection, function(value, key, collection) {\n var criteria = arrayMap(iteratees, function(iteratee) {\n return iteratee(value);\n });\n return { 'criteria': criteria, 'index': ++index, 'value': value };\n });\n\n return baseSortBy(result, function(object, other) {\n return compareMultiple(object, other, orders);\n });\n}\n\nexport default baseOrderBy;\n","import baseFlatten from './_baseFlatten.js';\nimport baseOrderBy from './_baseOrderBy.js';\nimport baseRest from './_baseRest.js';\nimport isIterateeCall from './_isIterateeCall.js';\n\n/**\n * Creates an array of elements, sorted in ascending order by the results of\n * running each element in a collection thru each iteratee. This method\n * performs a stable sort, that is, it preserves the original sort order of\n * equal elements. The iteratees are invoked with one argument: (value).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {...(Function|Function[])} [iteratees=[_.identity]]\n * The iteratees to sort by.\n * @returns {Array} Returns the new sorted array.\n * @example\n *\n * var users = [\n * { 'user': 'fred', 'age': 48 },\n * { 'user': 'barney', 'age': 36 },\n * { 'user': 'fred', 'age': 30 },\n * { 'user': 'barney', 'age': 34 }\n * ];\n *\n * _.sortBy(users, [function(o) { return o.user; }]);\n * // => objects for [['barney', 36], ['barney', 34], ['fred', 48], ['fred', 30]]\n *\n * _.sortBy(users, ['user', 'age']);\n * // => objects for [['barney', 34], ['barney', 36], ['fred', 30], ['fred', 48]]\n */\nvar sortBy = baseRest(function(collection, iteratees) {\n if (collection == null) {\n return [];\n }\n var length = iteratees.length;\n if (length > 1 && isIterateeCall(collection, iteratees[0], iteratees[1])) {\n iteratees = [];\n } else if (length > 2 && isIterateeCall(iteratees[0], iteratees[1], iteratees[2])) {\n iteratees = [iteratees[0]];\n }\n return baseOrderBy(collection, baseFlatten(iteratees, 1), []);\n});\n\nexport default sortBy;\n","import * as _ from 'lodash-es';\n\nexport { crossCount };\n\n/*\n * A function that takes a layering (an array of layers, each with an array of\n * ordererd nodes) and a graph and returns a weighted crossing count.\n *\n * Pre-conditions:\n *\n * 1. Input graph must be simple (not a multigraph), directed, and include\n * only simple edges.\n * 2. Edges in the input graph must have assigned weights.\n *\n * Post-conditions:\n *\n * 1. The graph and layering matrix are left unchanged.\n *\n * This algorithm is derived from Barth, et al., \"Bilayer Cross Counting.\"\n */\nfunction crossCount(g, layering) {\n var cc = 0;\n for (var i = 1; i < layering.length; ++i) {\n cc += twoLayerCrossCount(g, layering[i - 1], layering[i]);\n }\n return cc;\n}\n\nfunction twoLayerCrossCount(g, northLayer, southLayer) {\n // Sort all of the edges between the north and south layers by their position\n // in the north layer and then the south. Map these edges to the position of\n // their head in the south layer.\n var southPos = _.zipObject(\n southLayer,\n _.map(southLayer, function (v, i) {\n return i;\n }),\n );\n var southEntries = _.flatten(\n _.map(northLayer, function (v) {\n return _.sortBy(\n _.map(g.outEdges(v), function (e) {\n return { pos: southPos[e.w], weight: g.edge(e).weight };\n }),\n 'pos',\n );\n }),\n );\n\n // Build the accumulator tree\n var firstIndex = 1;\n while (firstIndex < southLayer.length) firstIndex <<= 1;\n var treeSize = 2 * firstIndex - 1;\n firstIndex -= 1;\n var tree = _.map(new Array(treeSize), function () {\n return 0;\n });\n\n // Calculate the weighted crossings\n var cc = 0;\n _.forEach(\n // @ts-expect-error\n southEntries.forEach(function (entry) {\n var index = entry.pos + firstIndex;\n tree[index] += entry.weight;\n var weightSum = 0;\n // @ts-expect-error\n while (index > 0) {\n // @ts-expect-error\n if (index % 2) {\n weightSum += tree[index + 1];\n }\n // @ts-expect-error\n index = (index - 1) >> 1;\n tree[index] += entry.weight;\n }\n cc += entry.weight * weightSum;\n }),\n );\n\n return cc;\n}\n","import * as _ from 'lodash-es';\n\nexport { resolveConflicts };\n\n/*\n * Given a list of entries of the form {v, barycenter, weight} and a\n * constraint graph this function will resolve any conflicts between the\n * constraint graph and the barycenters for the entries. If the barycenters for\n * an entry would violate a constraint in the constraint graph then we coalesce\n * the nodes in the conflict into a new node that respects the contraint and\n * aggregates barycenter and weight information.\n *\n * This implementation is based on the description in Forster, \"A Fast and\n * Simple Hueristic for Constrained Two-Level Crossing Reduction,\" thought it\n * differs in some specific details.\n *\n * Pre-conditions:\n *\n * 1. Each entry has the form {v, barycenter, weight}, or if the node has\n * no barycenter, then {v}.\n *\n * Returns:\n *\n * A new list of entries of the form {vs, i, barycenter, weight}. The list\n * `vs` may either be a singleton or it may be an aggregation of nodes\n * ordered such that they do not violate constraints from the constraint\n * graph. The property `i` is the lowest original index of any of the\n * elements in `vs`.\n */\nfunction resolveConflicts(entries, cg) {\n var mappedEntries = {};\n _.forEach(entries, function (entry, i) {\n var tmp = (mappedEntries[entry.v] = {\n indegree: 0,\n in: [],\n out: [],\n vs: [entry.v],\n i: i,\n });\n if (!_.isUndefined(entry.barycenter)) {\n // @ts-expect-error\n tmp.barycenter = entry.barycenter;\n // @ts-expect-error\n tmp.weight = entry.weight;\n }\n });\n\n _.forEach(cg.edges(), function (e) {\n var entryV = mappedEntries[e.v];\n var entryW = mappedEntries[e.w];\n if (!_.isUndefined(entryV) && !_.isUndefined(entryW)) {\n entryW.indegree++;\n entryV.out.push(mappedEntries[e.w]);\n }\n });\n\n var sourceSet = _.filter(mappedEntries, function (entry) {\n // @ts-expect-error\n return !entry.indegree;\n });\n\n return doResolveConflicts(sourceSet);\n}\n\nfunction doResolveConflicts(sourceSet) {\n var entries = [];\n\n function handleIn(vEntry) {\n return function (uEntry) {\n if (uEntry.merged) {\n return;\n }\n if (\n _.isUndefined(uEntry.barycenter) ||\n _.isUndefined(vEntry.barycenter) ||\n uEntry.barycenter >= vEntry.barycenter\n ) {\n mergeEntries(vEntry, uEntry);\n }\n };\n }\n\n function handleOut(vEntry) {\n return function (wEntry) {\n wEntry['in'].push(vEntry);\n if (--wEntry.indegree === 0) {\n sourceSet.push(wEntry);\n }\n };\n }\n\n while (sourceSet.length) {\n var entry = sourceSet.pop();\n entries.push(entry);\n _.forEach(entry['in'].reverse(), handleIn(entry));\n _.forEach(entry.out, handleOut(entry));\n }\n\n return _.map(\n _.filter(entries, function (entry) {\n return !entry.merged;\n }),\n function (entry) {\n return _.pick(entry, ['vs', 'i', 'barycenter', 'weight']);\n },\n );\n}\n\nfunction mergeEntries(target, source) {\n var sum = 0;\n var weight = 0;\n\n if (target.weight) {\n sum += target.barycenter * target.weight;\n weight += target.weight;\n }\n\n if (source.weight) {\n sum += source.barycenter * source.weight;\n weight += source.weight;\n }\n\n target.vs = source.vs.concat(target.vs);\n target.barycenter = sum / weight;\n target.weight = weight;\n target.i = Math.min(source.i, target.i);\n source.merged = true;\n}\n","import * as _ from 'lodash-es';\nimport * as util from '../util.js';\n\nexport { sort };\n\nfunction sort(entries, biasRight) {\n var parts = util.partition(entries, function (entry) {\n return Object.prototype.hasOwnProperty.call(entry, 'barycenter');\n });\n var sortable = parts.lhs,\n unsortable = _.sortBy(parts.rhs, function (entry) {\n return -entry.i;\n }),\n vs = [],\n sum = 0,\n weight = 0,\n vsIndex = 0;\n\n sortable.sort(compareWithBias(!!biasRight));\n\n vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\n\n _.forEach(sortable, function (entry) {\n vsIndex += entry.vs.length;\n vs.push(entry.vs);\n sum += entry.barycenter * entry.weight;\n weight += entry.weight;\n vsIndex = consumeUnsortable(vs, unsortable, vsIndex);\n });\n\n var result = { vs: _.flatten(vs) };\n if (weight) {\n result.barycenter = sum / weight;\n result.weight = weight;\n }\n return result;\n}\n\nfunction consumeUnsortable(vs, unsortable, index) {\n var last;\n while (unsortable.length && (last = _.last(unsortable)).i <= index) {\n unsortable.pop();\n vs.push(last.vs);\n index++;\n }\n return index;\n}\n\nfunction compareWithBias(bias) {\n return function (entryV, entryW) {\n if (entryV.barycenter < entryW.barycenter) {\n return -1;\n } else if (entryV.barycenter > entryW.barycenter) {\n return 1;\n }\n\n return !bias ? entryV.i - entryW.i : entryW.i - entryV.i;\n };\n}\n","import * as _ from 'lodash-es';\nimport { barycenter } from './barycenter.js';\nimport { resolveConflicts } from './resolve-conflicts.js';\nimport { sort } from './sort.js';\n\nexport { sortSubgraph };\n\nfunction sortSubgraph(g, v, cg, biasRight) {\n var movable = g.children(v);\n var node = g.node(v);\n var bl = node ? node.borderLeft : undefined;\n var br = node ? node.borderRight : undefined;\n var subgraphs = {};\n\n if (bl) {\n movable = _.filter(movable, function (w) {\n return w !== bl && w !== br;\n });\n }\n\n var barycenters = barycenter(g, movable);\n _.forEach(barycenters, function (entry) {\n if (g.children(entry.v).length) {\n var subgraphResult = sortSubgraph(g, entry.v, cg, biasRight);\n subgraphs[entry.v] = subgraphResult;\n if (Object.prototype.hasOwnProperty.call(subgraphResult, 'barycenter')) {\n mergeBarycenters(entry, subgraphResult);\n }\n }\n });\n\n var entries = resolveConflicts(barycenters, cg);\n expandSubgraphs(entries, subgraphs);\n\n var result = sort(entries, biasRight);\n\n if (bl) {\n result.vs = _.flatten([bl, result.vs, br]);\n if (g.predecessors(bl).length) {\n var blPred = g.node(g.predecessors(bl)[0]),\n brPred = g.node(g.predecessors(br)[0]);\n if (!Object.prototype.hasOwnProperty.call(result, 'barycenter')) {\n result.barycenter = 0;\n result.weight = 0;\n }\n result.barycenter =\n (result.barycenter * result.weight + blPred.order + brPred.order) / (result.weight + 2);\n result.weight += 2;\n }\n }\n\n return result;\n}\n\nfunction expandSubgraphs(entries, subgraphs) {\n _.forEach(entries, function (entry) {\n entry.vs = _.flatten(\n entry.vs.map(function (v) {\n if (subgraphs[v]) {\n return subgraphs[v].vs;\n }\n return v;\n }),\n );\n });\n}\n\nfunction mergeBarycenters(target, other) {\n if (!_.isUndefined(target.barycenter)) {\n target.barycenter =\n (target.barycenter * target.weight + other.barycenter * other.weight) /\n (target.weight + other.weight);\n target.weight += other.weight;\n } else {\n target.barycenter = other.barycenter;\n target.weight = other.weight;\n }\n}\n","import * as _ from 'lodash-es';\n\nexport { barycenter };\n\nfunction barycenter(g, movable) {\n return _.map(movable, function (v) {\n var inV = g.inEdges(v);\n if (!inV.length) {\n return { v: v };\n } else {\n var result = _.reduce(\n inV,\n function (acc, e) {\n var edge = g.edge(e),\n nodeU = g.node(e.v);\n return {\n sum: acc.sum + edge.weight * nodeU.order,\n weight: acc.weight + edge.weight,\n };\n },\n { sum: 0, weight: 0 },\n );\n\n return {\n v: v,\n barycenter: result.sum / result.weight,\n weight: result.weight,\n };\n }\n });\n}\n","import * as _ from 'lodash-es';\nimport { Graph } from '../../graphlib/index.js';\nimport * as util from '../util.js';\nimport { addSubgraphConstraints } from './add-subgraph-constraints.js';\nimport { buildLayerGraph } from './build-layer-graph.js';\nimport { crossCount } from './cross-count.js';\nimport { initOrder } from './init-order.js';\nimport { sortSubgraph } from './sort-subgraph.js';\n\nexport { order };\n\n/*\n * Applies heuristics to minimize edge crossings in the graph and sets the best\n * order solution as an order attribute on each node.\n *\n * Pre-conditions:\n *\n * 1. Graph must be DAG\n * 2. Graph nodes must be objects with a \"rank\" attribute\n * 3. Graph edges must have the \"weight\" attribute\n *\n * Post-conditions:\n *\n * 1. Graph nodes will have an \"order\" attribute based on the results of the\n * algorithm.\n */\nfunction order(g) {\n var maxRank = util.maxRank(g),\n downLayerGraphs = buildLayerGraphs(g, _.range(1, maxRank + 1), 'inEdges'),\n upLayerGraphs = buildLayerGraphs(g, _.range(maxRank - 1, -1, -1), 'outEdges');\n\n var layering = initOrder(g);\n assignOrder(g, layering);\n\n var bestCC = Number.POSITIVE_INFINITY,\n best;\n\n for (var i = 0, lastBest = 0; lastBest < 4; ++i, ++lastBest) {\n sweepLayerGraphs(i % 2 ? downLayerGraphs : upLayerGraphs, i % 4 >= 2);\n\n layering = util.buildLayerMatrix(g);\n var cc = crossCount(g, layering);\n if (cc < bestCC) {\n lastBest = 0;\n best = _.cloneDeep(layering);\n bestCC = cc;\n }\n }\n\n assignOrder(g, best);\n}\n\nfunction buildLayerGraphs(g, ranks, relationship) {\n return _.map(ranks, function (rank) {\n return buildLayerGraph(g, rank, relationship);\n });\n}\n\nfunction sweepLayerGraphs(layerGraphs, biasRight) {\n var cg = new Graph();\n _.forEach(layerGraphs, function (lg) {\n var root = lg.graph().root;\n var sorted = sortSubgraph(lg, root, cg, biasRight);\n _.forEach(sorted.vs, function (v, i) {\n lg.node(v).order = i;\n });\n addSubgraphConstraints(lg, cg, sorted.vs);\n });\n}\n\nfunction assignOrder(g, layering) {\n _.forEach(layering, function (layer) {\n _.forEach(layer, function (v, i) {\n g.node(v).order = i;\n });\n });\n}\n","import * as _ from 'lodash-es';\n\n/*\n * Assigns an initial order value for each node by performing a DFS search\n * starting from nodes in the first rank. Nodes are assigned an order in their\n * rank as they are first visited.\n *\n * This approach comes from Gansner, et al., \"A Technique for Drawing Directed\n * Graphs.\"\n *\n * Returns a layering matrix with an array per layer and each layer sorted by\n * the order of its nodes.\n */\nexport function initOrder(g) {\n var visited = {};\n var simpleNodes = _.filter(g.nodes(), function (v) {\n return !g.children(v).length;\n });\n var maxRank = _.max(\n _.map(simpleNodes, function (v) {\n return g.node(v).rank;\n }),\n );\n var layers = _.map(_.range(maxRank + 1), function () {\n return [];\n });\n\n function dfs(v) {\n if (_.has(visited, v)) return;\n visited[v] = true;\n var node = g.node(v);\n layers[node.rank].push(v);\n _.forEach(g.successors(v), dfs);\n }\n\n var orderedVs = _.sortBy(simpleNodes, function (v) {\n return g.node(v).rank;\n });\n _.forEach(orderedVs, dfs);\n\n return layers;\n}\n","import * as _ from 'lodash-es';\n\nexport { addSubgraphConstraints };\n\nfunction addSubgraphConstraints(g, cg, vs) {\n var prev = {},\n rootPrev;\n\n _.forEach(vs, function (v) {\n var child = g.parent(v),\n parent,\n prevChild;\n while (child) {\n parent = g.parent(child);\n if (parent) {\n prevChild = prev[parent];\n prev[parent] = child;\n } else {\n prevChild = rootPrev;\n rootPrev = child;\n }\n if (prevChild && prevChild !== child) {\n cg.setEdge(prevChild, child);\n return;\n }\n child = parent;\n }\n });\n\n /*\n function dfs(v) {\n var children = v ? g.children(v) : g.children();\n if (children.length) {\n var min = Number.POSITIVE_INFINITY,\n subgraphs = [];\n _.each(children, function(child) {\n var childMin = dfs(child);\n if (g.children(child).length) {\n subgraphs.push({ v: child, order: childMin });\n }\n min = Math.min(min, childMin);\n });\n _.reduce(_.sortBy(subgraphs, \"order\"), function(prev, curr) {\n cg.setEdge(prev.v, curr.v);\n return curr;\n });\n return min;\n }\n return g.node(v).order;\n }\n dfs(undefined);\n */\n}\n","import * as _ from 'lodash-es';\n\nexport { parentDummyChains };\n\nfunction parentDummyChains(g) {\n var postorderNums = postorder(g);\n\n _.forEach(g.graph().dummyChains, function (v) {\n var node = g.node(v);\n var edgeObj = node.edgeObj;\n var pathData = findPath(g, postorderNums, edgeObj.v, edgeObj.w);\n var path = pathData.path;\n var lca = pathData.lca;\n var pathIdx = 0;\n var pathV = path[pathIdx];\n var ascending = true;\n\n while (v !== edgeObj.w) {\n node = g.node(v);\n\n if (ascending) {\n while ((pathV = path[pathIdx]) !== lca && g.node(pathV).maxRank < node.rank) {\n pathIdx++;\n }\n\n if (pathV === lca) {\n ascending = false;\n }\n }\n\n if (!ascending) {\n while (\n pathIdx < path.length - 1 &&\n g.node((pathV = path[pathIdx + 1])).minRank <= node.rank\n ) {\n pathIdx++;\n }\n pathV = path[pathIdx];\n }\n\n g.setParent(v, pathV);\n v = g.successors(v)[0];\n }\n });\n}\n\n// Find a path from v to w through the lowest common ancestor (LCA). Return the\n// full path and the LCA.\nfunction findPath(g, postorderNums, v, w) {\n var vPath = [];\n var wPath = [];\n var low = Math.min(postorderNums[v].low, postorderNums[w].low);\n var lim = Math.max(postorderNums[v].lim, postorderNums[w].lim);\n var parent;\n var lca;\n\n // Traverse up from v to find the LCA\n parent = v;\n do {\n parent = g.parent(parent);\n vPath.push(parent);\n } while (parent && (postorderNums[parent].low > low || lim > postorderNums[parent].lim));\n lca = parent;\n\n // Traverse from w to LCA\n parent = w;\n while ((parent = g.parent(parent)) !== lca) {\n wPath.push(parent);\n }\n\n return { path: vPath.concat(wPath.reverse()), lca: lca };\n}\n\nfunction postorder(g) {\n var result = {};\n var lim = 0;\n\n function dfs(v) {\n var low = lim;\n _.forEach(g.children(v), dfs);\n result[v] = { low: low, lim: lim++ };\n }\n _.forEach(g.children(), dfs);\n\n return result;\n}\n","import baseForOwn from './_baseForOwn.js';\nimport castFunction from './_castFunction.js';\n\n/**\n * Iterates over own enumerable string keyed properties of an object and\n * invokes `iteratee` for each property. The iteratee is invoked with three\n * arguments: (value, key, object). Iteratee functions may exit iteration\n * early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 0.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forOwnRight\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forOwn(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a' then 'b' (iteration order is not guaranteed).\n */\nfunction forOwn(object, iteratee) {\n return object && baseForOwn(object, castFunction(iteratee));\n}\n\nexport default forOwn;\n","import baseFor from './_baseFor.js';\nimport castFunction from './_castFunction.js';\nimport keysIn from './keysIn.js';\n\n/**\n * Iterates over own and inherited enumerable string keyed properties of an\n * object and invokes `iteratee` for each property. The iteratee is invoked\n * with three arguments: (value, key, object). Iteratee functions may exit\n * iteration early by explicitly returning `false`.\n *\n * @static\n * @memberOf _\n * @since 0.3.0\n * @category Object\n * @param {Object} object The object to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Object} Returns `object`.\n * @see _.forInRight\n * @example\n *\n * function Foo() {\n * this.a = 1;\n * this.b = 2;\n * }\n *\n * Foo.prototype.c = 3;\n *\n * _.forIn(new Foo, function(value, key) {\n * console.log(key);\n * });\n * // => Logs 'a', 'b', then 'c' (iteration order is not guaranteed).\n */\nfunction forIn(object, iteratee) {\n return object == null\n ? object\n : baseFor(object, castFunction(iteratee), keysIn);\n}\n\nexport default forIn;\n","import * as _ from 'lodash-es';\nimport { Graph } from '../../graphlib/index.js';\nimport * as util from '../util.js';\n\n/*\n * This module provides coordinate assignment based on Brandes and Köpf, \"Fast\n * and Simple Horizontal Coordinate Assignment.\"\n */\n\nexport {\n positionX,\n findType1Conflicts,\n findType2Conflicts,\n addConflict,\n hasConflict,\n verticalAlignment,\n horizontalCompaction,\n alignCoordinates,\n findSmallestWidthAlignment,\n balance,\n};\n\n/*\n * Marks all edges in the graph with a type-1 conflict with the \"type1Conflict\"\n * property. A type-1 conflict is one where a non-inner segment crosses an\n * inner segment. An inner segment is an edge with both incident nodes marked\n * with the \"dummy\" property.\n *\n * This algorithm scans layer by layer, starting with the second, for type-1\n * conflicts between the current layer and the previous layer. For each layer\n * it scans the nodes from left to right until it reaches one that is incident\n * on an inner segment. It then scans predecessors to determine if they have\n * edges that cross that inner segment. At the end a final scan is done for all\n * nodes on the current rank to see if they cross the last visited inner\n * segment.\n *\n * This algorithm (safely) assumes that a dummy node will only be incident on a\n * single node in the layers being scanned.\n */\nfunction findType1Conflicts(g, layering) {\n var conflicts = {};\n\n function visitLayer(prevLayer, layer) {\n var // last visited node in the previous layer that is incident on an inner\n // segment.\n k0 = 0,\n // Tracks the last node in this layer scanned for crossings with a type-1\n // segment.\n scanPos = 0,\n prevLayerLength = prevLayer.length,\n lastNode = _.last(layer);\n\n _.forEach(layer, function (v, i) {\n var w = findOtherInnerSegmentNode(g, v),\n k1 = w ? g.node(w).order : prevLayerLength;\n\n if (w || v === lastNode) {\n _.forEach(layer.slice(scanPos, i + 1), function (scanNode) {\n _.forEach(g.predecessors(scanNode), function (u) {\n var uLabel = g.node(u),\n uPos = uLabel.order;\n if ((uPos < k0 || k1 < uPos) && !(uLabel.dummy && g.node(scanNode).dummy)) {\n addConflict(conflicts, u, scanNode);\n }\n });\n });\n // @ts-expect-error\n scanPos = i + 1;\n k0 = k1;\n }\n });\n\n return layer;\n }\n\n _.reduce(layering, visitLayer);\n return conflicts;\n}\n\nfunction findType2Conflicts(g, layering) {\n var conflicts = {};\n\n function scan(south, southPos, southEnd, prevNorthBorder, nextNorthBorder) {\n var v;\n _.forEach(_.range(southPos, southEnd), function (i) {\n v = south[i];\n if (g.node(v).dummy) {\n _.forEach(g.predecessors(v), function (u) {\n var uNode = g.node(u);\n if (uNode.dummy && (uNode.order < prevNorthBorder || uNode.order > nextNorthBorder)) {\n addConflict(conflicts, u, v);\n }\n });\n }\n });\n }\n\n function visitLayer(north, south) {\n var prevNorthPos = -1,\n nextNorthPos,\n southPos = 0;\n\n _.forEach(south, function (v, southLookahead) {\n if (g.node(v).dummy === 'border') {\n var predecessors = g.predecessors(v);\n if (predecessors.length) {\n nextNorthPos = g.node(predecessors[0]).order;\n scan(south, southPos, southLookahead, prevNorthPos, nextNorthPos);\n // @ts-expect-error\n southPos = southLookahead;\n prevNorthPos = nextNorthPos;\n }\n }\n scan(south, southPos, south.length, nextNorthPos, north.length);\n });\n\n return south;\n }\n\n _.reduce(layering, visitLayer);\n return conflicts;\n}\n\nfunction findOtherInnerSegmentNode(g, v) {\n if (g.node(v).dummy) {\n return _.find(g.predecessors(v), function (u) {\n return g.node(u).dummy;\n });\n }\n}\n\nfunction addConflict(conflicts, v, w) {\n if (v > w) {\n var tmp = v;\n v = w;\n w = tmp;\n }\n\n var conflictsV = conflicts[v];\n if (!conflictsV) {\n conflicts[v] = conflictsV = {};\n }\n conflictsV[w] = true;\n}\n\nfunction hasConflict(conflicts, v, w) {\n if (v > w) {\n var tmp = v;\n v = w;\n w = tmp;\n }\n return !!conflicts[v] && Object.prototype.hasOwnProperty.call(conflicts[v], w);\n}\n\n/*\n * Try to align nodes into vertical \"blocks\" where possible. This algorithm\n * attempts to align a node with one of its median neighbors. If the edge\n * connecting a neighbor is a type-1 conflict then we ignore that possibility.\n * If a previous node has already formed a block with a node after the node\n * we're trying to form a block with, we also ignore that possibility - our\n * blocks would be split in that scenario.\n */\nfunction verticalAlignment(g, layering, conflicts, neighborFn) {\n var root = {},\n align = {},\n pos = {};\n\n // We cache the position here based on the layering because the graph and\n // layering may be out of sync. The layering matrix is manipulated to\n // generate different extreme alignments.\n _.forEach(layering, function (layer) {\n _.forEach(layer, function (v, order) {\n root[v] = v;\n align[v] = v;\n pos[v] = order;\n });\n });\n\n _.forEach(layering, function (layer) {\n var prevIdx = -1;\n _.forEach(layer, function (v) {\n var ws = neighborFn(v);\n if (ws.length) {\n ws = _.sortBy(ws, function (w) {\n return pos[w];\n });\n var mp = (ws.length - 1) / 2;\n for (var i = Math.floor(mp), il = Math.ceil(mp); i <= il; ++i) {\n var w = ws[i];\n if (align[v] === v && prevIdx < pos[w] && !hasConflict(conflicts, v, w)) {\n align[w] = v;\n align[v] = root[v] = root[w];\n prevIdx = pos[w];\n }\n }\n }\n });\n });\n\n return { root: root, align: align };\n}\n\nfunction horizontalCompaction(g, layering, root, align, reverseSep) {\n // This portion of the algorithm differs from BK due to a number of problems.\n // Instead of their algorithm we construct a new block graph and do two\n // sweeps. The first sweep places blocks with the smallest possible\n // coordinates. The second sweep removes unused space by moving blocks to the\n // greatest coordinates without violating separation.\n var xs = {},\n blockG = buildBlockGraph(g, layering, root, reverseSep),\n borderType = reverseSep ? 'borderLeft' : 'borderRight';\n\n function iterate(setXsFunc, nextNodesFunc) {\n var stack = blockG.nodes();\n var elem = stack.pop();\n var visited = {};\n while (elem) {\n if (visited[elem]) {\n setXsFunc(elem);\n } else {\n visited[elem] = true;\n stack.push(elem);\n stack = stack.concat(nextNodesFunc(elem));\n }\n\n elem = stack.pop();\n }\n }\n\n // First pass, assign smallest coordinates\n function pass1(elem) {\n xs[elem] = blockG.inEdges(elem).reduce(function (acc, e) {\n return Math.max(acc, xs[e.v] + blockG.edge(e));\n }, 0);\n }\n\n // Second pass, assign greatest coordinates\n function pass2(elem) {\n var min = blockG.outEdges(elem).reduce(function (acc, e) {\n return Math.min(acc, xs[e.w] - blockG.edge(e));\n }, Number.POSITIVE_INFINITY);\n\n var node = g.node(elem);\n if (min !== Number.POSITIVE_INFINITY && node.borderType !== borderType) {\n xs[elem] = Math.max(xs[elem], min);\n }\n }\n\n iterate(pass1, blockG.predecessors.bind(blockG));\n iterate(pass2, blockG.successors.bind(blockG));\n\n // Assign x coordinates to all nodes\n _.forEach(align, function (v) {\n xs[v] = xs[root[v]];\n });\n\n return xs;\n}\n\nfunction buildBlockGraph(g, layering, root, reverseSep) {\n var blockGraph = new Graph(),\n graphLabel = g.graph(),\n sepFn = sep(graphLabel.nodesep, graphLabel.edgesep, reverseSep);\n\n _.forEach(layering, function (layer) {\n var u;\n _.forEach(layer, function (v) {\n var vRoot = root[v];\n blockGraph.setNode(vRoot);\n if (u) {\n var uRoot = root[u],\n prevMax = blockGraph.edge(uRoot, vRoot);\n blockGraph.setEdge(uRoot, vRoot, Math.max(sepFn(g, v, u), prevMax || 0));\n }\n u = v;\n });\n });\n\n return blockGraph;\n}\n\n/*\n * Returns the alignment that has the smallest width of the given alignments.\n */\nfunction findSmallestWidthAlignment(g, xss) {\n return _.minBy(_.values(xss), function (xs) {\n var max = Number.NEGATIVE_INFINITY;\n var min = Number.POSITIVE_INFINITY;\n\n _.forIn(xs, function (x, v) {\n var halfWidth = width(g, v) / 2;\n\n max = Math.max(x + halfWidth, max);\n min = Math.min(x - halfWidth, min);\n });\n\n return max - min;\n });\n}\n\n/*\n * Align the coordinates of each of the layout alignments such that\n * left-biased alignments have their minimum coordinate at the same point as\n * the minimum coordinate of the smallest width alignment and right-biased\n * alignments have their maximum coordinate at the same point as the maximum\n * coordinate of the smallest width alignment.\n */\nfunction alignCoordinates(xss, alignTo) {\n var alignToVals = _.values(alignTo),\n alignToMin = _.min(alignToVals),\n alignToMax = _.max(alignToVals);\n\n _.forEach(['u', 'd'], function (vert) {\n _.forEach(['l', 'r'], function (horiz) {\n var alignment = vert + horiz,\n xs = xss[alignment],\n delta;\n if (xs === alignTo) return;\n\n var xsVals = _.values(xs);\n delta = horiz === 'l' ? alignToMin - _.min(xsVals) : alignToMax - _.max(xsVals);\n\n if (delta) {\n xss[alignment] = _.mapValues(xs, function (x) {\n return x + delta;\n });\n }\n });\n });\n}\n\nfunction balance(xss, align) {\n return _.mapValues(xss.ul, function (ignore, v) {\n if (align) {\n return xss[align.toLowerCase()][v];\n } else {\n var xs = _.sortBy(_.map(xss, v));\n return (xs[1] + xs[2]) / 2;\n }\n });\n}\n\nfunction positionX(g) {\n var layering = util.buildLayerMatrix(g);\n var conflicts = _.merge(findType1Conflicts(g, layering), findType2Conflicts(g, layering));\n\n var xss = {};\n var adjustedLayering;\n _.forEach(['u', 'd'], function (vert) {\n adjustedLayering = vert === 'u' ? layering : _.values(layering).reverse();\n _.forEach(['l', 'r'], function (horiz) {\n if (horiz === 'r') {\n adjustedLayering = _.map(adjustedLayering, function (inner) {\n return _.values(inner).reverse();\n });\n }\n\n var neighborFn = (vert === 'u' ? g.predecessors : g.successors).bind(g);\n var align = verticalAlignment(g, adjustedLayering, conflicts, neighborFn);\n var xs = horizontalCompaction(g, adjustedLayering, align.root, align.align, horiz === 'r');\n if (horiz === 'r') {\n xs = _.mapValues(xs, function (x) {\n return -x;\n });\n }\n xss[vert + horiz] = xs;\n });\n });\n\n var smallestWidth = findSmallestWidthAlignment(g, xss);\n alignCoordinates(xss, smallestWidth);\n return balance(xss, g.graph().align);\n}\n\nfunction sep(nodeSep, edgeSep, reverseSep) {\n return function (g, v, w) {\n var vLabel = g.node(v);\n var wLabel = g.node(w);\n var sum = 0;\n var delta;\n\n sum += vLabel.width / 2;\n if (Object.prototype.hasOwnProperty.call(vLabel, 'labelpos')) {\n switch (vLabel.labelpos.toLowerCase()) {\n case 'l':\n delta = -vLabel.width / 2;\n break;\n case 'r':\n delta = vLabel.width / 2;\n break;\n }\n }\n if (delta) {\n sum += reverseSep ? delta : -delta;\n }\n delta = 0;\n\n sum += (vLabel.dummy ? edgeSep : nodeSep) / 2;\n sum += (wLabel.dummy ? edgeSep : nodeSep) / 2;\n\n sum += wLabel.width / 2;\n if (Object.prototype.hasOwnProperty.call(wLabel, 'labelpos')) {\n switch (wLabel.labelpos.toLowerCase()) {\n case 'l':\n delta = wLabel.width / 2;\n break;\n case 'r':\n delta = -wLabel.width / 2;\n break;\n }\n }\n if (delta) {\n sum += reverseSep ? delta : -delta;\n }\n delta = 0;\n\n return sum;\n };\n}\n\nfunction width(g, v) {\n return g.node(v).width;\n}\n","import * as _ from 'lodash-es';\nimport * as util from '../util.js';\nimport { positionX } from './bk.js';\n\nexport { position };\n\nfunction position(g) {\n g = util.asNonCompoundGraph(g);\n\n positionY(g);\n _.forOwn(positionX(g), function (x, v) {\n g.node(v).x = x;\n });\n}\n\nfunction positionY(g) {\n var layering = util.buildLayerMatrix(g);\n var rankSep = g.graph().ranksep;\n var prevY = 0;\n _.forEach(layering, function (layer) {\n var maxHeight = _.max(\n _.map(layer, function (v) {\n return g.node(v).height;\n }),\n );\n _.forEach(layer, function (v) {\n g.node(v).y = prevY + maxHeight / 2;\n });\n prevY += maxHeight + rankSep;\n });\n}\n","import * as _ from 'lodash-es';\nimport { Graph } from '../graphlib/index.js';\nimport { addBorderSegments } from './add-border-segments.js';\nimport * as coordinateSystem from './coordinate-system.js';\nimport * as acyclic from './acyclic.js';\nimport * as normalize from './normalize.js';\nimport { rank } from './rank/index.js';\nimport * as nestingGraph from './nesting-graph.js';\nimport { order } from './order/index.js';\nimport { parentDummyChains } from './parent-dummy-chains.js';\nimport { position } from './position/index.js';\nimport * as util from './util.js';\n\nexport { layout };\n\nfunction layout(g, opts) {\n var time = opts && opts.debugTiming ? util.time : util.notime;\n time('layout', () => {\n var layoutGraph = time(' buildLayoutGraph', () => buildLayoutGraph(g));\n time(' runLayout', () => runLayout(layoutGraph, time));\n time(' updateInputGraph', () => updateInputGraph(g, layoutGraph));\n });\n}\n\nfunction runLayout(g, time) {\n time(' makeSpaceForEdgeLabels', () => makeSpaceForEdgeLabels(g));\n time(' removeSelfEdges', () => removeSelfEdges(g));\n time(' acyclic', () => acyclic.run(g));\n time(' nestingGraph.run', () => nestingGraph.run(g));\n time(' rank', () => rank(util.asNonCompoundGraph(g)));\n time(' injectEdgeLabelProxies', () => injectEdgeLabelProxies(g));\n time(' removeEmptyRanks', () => util.removeEmptyRanks(g));\n time(' nestingGraph.cleanup', () => nestingGraph.cleanup(g));\n time(' normalizeRanks', () => util.normalizeRanks(g));\n time(' assignRankMinMax', () => assignRankMinMax(g));\n time(' removeEdgeLabelProxies', () => removeEdgeLabelProxies(g));\n time(' normalize.run', () => normalize.run(g));\n time(' parentDummyChains', () => parentDummyChains(g));\n time(' addBorderSegments', () => addBorderSegments(g));\n time(' order', () => order(g));\n time(' insertSelfEdges', () => insertSelfEdges(g));\n time(' adjustCoordinateSystem', () => coordinateSystem.adjust(g));\n time(' position', () => position(g));\n time(' positionSelfEdges', () => positionSelfEdges(g));\n time(' removeBorderNodes', () => removeBorderNodes(g));\n time(' normalize.undo', () => normalize.undo(g));\n time(' fixupEdgeLabelCoords', () => fixupEdgeLabelCoords(g));\n time(' undoCoordinateSystem', () => coordinateSystem.undo(g));\n time(' translateGraph', () => translateGraph(g));\n time(' assignNodeIntersects', () => assignNodeIntersects(g));\n time(' reversePoints', () => reversePointsForReversedEdges(g));\n time(' acyclic.undo', () => acyclic.undo(g));\n}\n\n/*\n * Copies final layout information from the layout graph back to the input\n * graph. This process only copies whitelisted attributes from the layout graph\n * to the input graph, so it serves as a good place to determine what\n * attributes can influence layout.\n */\nfunction updateInputGraph(inputGraph, layoutGraph) {\n _.forEach(inputGraph.nodes(), function (v) {\n var inputLabel = inputGraph.node(v);\n var layoutLabel = layoutGraph.node(v);\n\n if (inputLabel) {\n inputLabel.x = layoutLabel.x;\n inputLabel.y = layoutLabel.y;\n\n if (layoutGraph.children(v).length) {\n inputLabel.width = layoutLabel.width;\n inputLabel.height = layoutLabel.height;\n }\n }\n });\n\n _.forEach(inputGraph.edges(), function (e) {\n var inputLabel = inputGraph.edge(e);\n var layoutLabel = layoutGraph.edge(e);\n\n inputLabel.points = layoutLabel.points;\n if (Object.prototype.hasOwnProperty.call(layoutLabel, 'x')) {\n inputLabel.x = layoutLabel.x;\n inputLabel.y = layoutLabel.y;\n }\n });\n\n inputGraph.graph().width = layoutGraph.graph().width;\n inputGraph.graph().height = layoutGraph.graph().height;\n}\n\nvar graphNumAttrs = ['nodesep', 'edgesep', 'ranksep', 'marginx', 'marginy'];\nvar graphDefaults = { ranksep: 50, edgesep: 20, nodesep: 50, rankdir: 'tb' };\nvar graphAttrs = ['acyclicer', 'ranker', 'rankdir', 'align'];\nvar nodeNumAttrs = ['width', 'height'];\nvar nodeDefaults = { width: 0, height: 0 };\nvar edgeNumAttrs = ['minlen', 'weight', 'width', 'height', 'labeloffset'];\nvar edgeDefaults = {\n minlen: 1,\n weight: 1,\n width: 0,\n height: 0,\n labeloffset: 10,\n labelpos: 'r',\n};\nvar edgeAttrs = ['labelpos'];\n\n/*\n * Constructs a new graph from the input graph, which can be used for layout.\n * This process copies only whitelisted attributes from the input graph to the\n * layout graph. Thus this function serves as a good place to determine what\n * attributes can influence layout.\n */\nfunction buildLayoutGraph(inputGraph) {\n var g = new Graph({ multigraph: true, compound: true });\n var graph = canonicalize(inputGraph.graph());\n\n g.setGraph(\n _.merge({}, graphDefaults, selectNumberAttrs(graph, graphNumAttrs), _.pick(graph, graphAttrs)),\n );\n\n _.forEach(inputGraph.nodes(), function (v) {\n var node = canonicalize(inputGraph.node(v));\n g.setNode(v, _.defaults(selectNumberAttrs(node, nodeNumAttrs), nodeDefaults));\n g.setParent(v, inputGraph.parent(v));\n });\n\n _.forEach(inputGraph.edges(), function (e) {\n var edge = canonicalize(inputGraph.edge(e));\n g.setEdge(\n e,\n _.merge({}, edgeDefaults, selectNumberAttrs(edge, edgeNumAttrs), _.pick(edge, edgeAttrs)),\n );\n });\n\n return g;\n}\n\n/*\n * This idea comes from the Gansner paper: to account for edge labels in our\n * layout we split each rank in half by doubling minlen and halving ranksep.\n * Then we can place labels at these mid-points between nodes.\n *\n * We also add some minimal padding to the width to push the label for the edge\n * away from the edge itself a bit.\n */\nfunction makeSpaceForEdgeLabels(g) {\n var graph = g.graph();\n graph.ranksep /= 2;\n _.forEach(g.edges(), function (e) {\n var edge = g.edge(e);\n edge.minlen *= 2;\n if (edge.labelpos.toLowerCase() !== 'c') {\n if (graph.rankdir === 'TB' || graph.rankdir === 'BT') {\n edge.width += edge.labeloffset;\n } else {\n edge.height += edge.labeloffset;\n }\n }\n });\n}\n\n/*\n * Creates temporary dummy nodes that capture the rank in which each edge's\n * label is going to, if it has one of non-zero width and height. We do this\n * so that we can safely remove empty ranks while preserving balance for the\n * label's position.\n */\nfunction injectEdgeLabelProxies(g) {\n _.forEach(g.edges(), function (e) {\n var edge = g.edge(e);\n if (edge.width && edge.height) {\n var v = g.node(e.v);\n var w = g.node(e.w);\n var label = { rank: (w.rank - v.rank) / 2 + v.rank, e: e };\n util.addDummyNode(g, 'edge-proxy', label, '_ep');\n }\n });\n}\n\nfunction assignRankMinMax(g) {\n var maxRank = 0;\n _.forEach(g.nodes(), function (v) {\n var node = g.node(v);\n if (node.borderTop) {\n node.minRank = g.node(node.borderTop).rank;\n node.maxRank = g.node(node.borderBottom).rank;\n // @ts-expect-error\n maxRank = _.max(maxRank, node.maxRank);\n }\n });\n g.graph().maxRank = maxRank;\n}\n\nfunction removeEdgeLabelProxies(g) {\n _.forEach(g.nodes(), function (v) {\n var node = g.node(v);\n if (node.dummy === 'edge-proxy') {\n g.edge(node.e).labelRank = node.rank;\n g.removeNode(v);\n }\n });\n}\n\nfunction translateGraph(g) {\n var minX = Number.POSITIVE_INFINITY;\n var maxX = 0;\n var minY = Number.POSITIVE_INFINITY;\n var maxY = 0;\n var graphLabel = g.graph();\n var marginX = graphLabel.marginx || 0;\n var marginY = graphLabel.marginy || 0;\n\n function getExtremes(attrs) {\n var x = attrs.x;\n var y = attrs.y;\n var w = attrs.width;\n var h = attrs.height;\n minX = Math.min(minX, x - w / 2);\n maxX = Math.max(maxX, x + w / 2);\n minY = Math.min(minY, y - h / 2);\n maxY = Math.max(maxY, y + h / 2);\n }\n\n _.forEach(g.nodes(), function (v) {\n getExtremes(g.node(v));\n });\n _.forEach(g.edges(), function (e) {\n var edge = g.edge(e);\n if (Object.prototype.hasOwnProperty.call(edge, 'x')) {\n getExtremes(edge);\n }\n });\n\n minX -= marginX;\n minY -= marginY;\n\n _.forEach(g.nodes(), function (v) {\n var node = g.node(v);\n node.x -= minX;\n node.y -= minY;\n });\n\n _.forEach(g.edges(), function (e) {\n var edge = g.edge(e);\n _.forEach(edge.points, function (p) {\n p.x -= minX;\n p.y -= minY;\n });\n if (Object.prototype.hasOwnProperty.call(edge, 'x')) {\n edge.x -= minX;\n }\n if (Object.prototype.hasOwnProperty.call(edge, 'y')) {\n edge.y -= minY;\n }\n });\n\n graphLabel.width = maxX - minX + marginX;\n graphLabel.height = maxY - minY + marginY;\n}\n\nfunction assignNodeIntersects(g) {\n _.forEach(g.edges(), function (e) {\n var edge = g.edge(e);\n var nodeV = g.node(e.v);\n var nodeW = g.node(e.w);\n var p1, p2;\n if (!edge.points) {\n edge.points = [];\n p1 = nodeW;\n p2 = nodeV;\n } else {\n p1 = edge.points[0];\n p2 = edge.points[edge.points.length - 1];\n }\n edge.points.unshift(util.intersectRect(nodeV, p1));\n edge.points.push(util.intersectRect(nodeW, p2));\n });\n}\n\nfunction fixupEdgeLabelCoords(g) {\n _.forEach(g.edges(), function (e) {\n var edge = g.edge(e);\n if (Object.prototype.hasOwnProperty.call(edge, 'x')) {\n if (edge.labelpos === 'l' || edge.labelpos === 'r') {\n edge.width -= edge.labeloffset;\n }\n switch (edge.labelpos) {\n case 'l':\n edge.x -= edge.width / 2 + edge.labeloffset;\n break;\n case 'r':\n edge.x += edge.width / 2 + edge.labeloffset;\n break;\n }\n }\n });\n}\n\nfunction reversePointsForReversedEdges(g) {\n _.forEach(g.edges(), function (e) {\n var edge = g.edge(e);\n if (edge.reversed) {\n edge.points.reverse();\n }\n });\n}\n\nfunction removeBorderNodes(g) {\n _.forEach(g.nodes(), function (v) {\n if (g.children(v).length) {\n var node = g.node(v);\n var t = g.node(node.borderTop);\n var b = g.node(node.borderBottom);\n var l = g.node(_.last(node.borderLeft));\n var r = g.node(_.last(node.borderRight));\n\n node.width = Math.abs(r.x - l.x);\n node.height = Math.abs(b.y - t.y);\n node.x = l.x + node.width / 2;\n node.y = t.y + node.height / 2;\n }\n });\n\n _.forEach(g.nodes(), function (v) {\n if (g.node(v).dummy === 'border') {\n g.removeNode(v);\n }\n });\n}\n\nfunction removeSelfEdges(g) {\n _.forEach(g.edges(), function (e) {\n if (e.v === e.w) {\n var node = g.node(e.v);\n if (!node.selfEdges) {\n node.selfEdges = [];\n }\n node.selfEdges.push({ e: e, label: g.edge(e) });\n g.removeEdge(e);\n }\n });\n}\n\nfunction insertSelfEdges(g) {\n var layers = util.buildLayerMatrix(g);\n _.forEach(layers, function (layer) {\n var orderShift = 0;\n _.forEach(layer, function (v, i) {\n var node = g.node(v);\n node.order = i + orderShift;\n _.forEach(node.selfEdges, function (selfEdge) {\n util.addDummyNode(\n g,\n 'selfedge',\n {\n width: selfEdge.label.width,\n height: selfEdge.label.height,\n rank: node.rank,\n order: i + ++orderShift,\n e: selfEdge.e,\n label: selfEdge.label,\n },\n '_se',\n );\n });\n delete node.selfEdges;\n });\n });\n}\n\nfunction positionSelfEdges(g) {\n _.forEach(g.nodes(), function (v) {\n var node = g.node(v);\n if (node.dummy === 'selfedge') {\n var selfNode = g.node(node.e.v);\n var x = selfNode.x + selfNode.width / 2;\n var y = selfNode.y;\n var dx = node.x - x;\n var dy = selfNode.height / 2;\n g.setEdge(node.e, node.label);\n g.removeNode(v);\n node.label.points = [\n { x: x + (2 * dx) / 3, y: y - dy },\n { x: x + (5 * dx) / 6, y: y - dy },\n { x: x + dx, y: y },\n { x: x + (5 * dx) / 6, y: y + dy },\n { x: x + (2 * dx) / 3, y: y + dy },\n ];\n node.label.x = node.x;\n node.label.y = node.y;\n }\n });\n}\n\nfunction selectNumberAttrs(obj, attrs) {\n return _.mapValues(_.pick(obj, attrs), Number);\n}\n\nfunction canonicalize(attrs) {\n var newAttrs = {};\n _.forEach(attrs, function (v, k) {\n newAttrs[k.toLowerCase()] = v;\n });\n return newAttrs;\n}\n","/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * The base implementation of `_.has` without support for deep paths.\n *\n * @private\n * @param {Object} [object] The object to query.\n * @param {Array|string} key The key to check.\n * @returns {boolean} Returns `true` if `key` exists, else `false`.\n */\nfunction baseHas(object, key) {\n return object != null && hasOwnProperty.call(object, key);\n}\n\nexport default baseHas;\n","import baseHas from './_baseHas.js';\nimport hasPath from './_hasPath.js';\n\n/**\n * Checks if `path` is a direct property of `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The object to query.\n * @param {Array|string} path The path to check.\n * @returns {boolean} Returns `true` if `path` exists, else `false`.\n * @example\n *\n * var object = { 'a': { 'b': 2 } };\n * var other = _.create({ 'a': _.create({ 'b': 2 }) });\n *\n * _.has(object, 'a');\n * // => true\n *\n * _.has(object, 'a.b');\n * // => true\n *\n * _.has(object, ['a', 'b']);\n * // => true\n *\n * _.has(other, 'a');\n * // => false\n */\nfunction has(object, path) {\n return object != null && hasPath(object, path, baseHas);\n}\n\nexport default has;\n","import baseIteratee from './_baseIteratee.js';\nimport isArrayLike from './isArrayLike.js';\nimport keys from './keys.js';\n\n/**\n * Creates a `_.find` or `_.findLast` function.\n *\n * @private\n * @param {Function} findIndexFunc The function to find the collection index.\n * @returns {Function} Returns the new find function.\n */\nfunction createFind(findIndexFunc) {\n return function(collection, predicate, fromIndex) {\n var iterable = Object(collection);\n if (!isArrayLike(collection)) {\n var iteratee = baseIteratee(predicate, 3);\n collection = keys(collection);\n predicate = function(key) { return iteratee(iterable[key], key, iterable); };\n }\n var index = findIndexFunc(collection, predicate, fromIndex);\n return index > -1 ? iterable[iteratee ? collection[index] : index] : undefined;\n };\n}\n\nexport default createFind;\n","import baseFindIndex from './_baseFindIndex.js';\nimport baseIteratee from './_baseIteratee.js';\nimport toInteger from './toInteger.js';\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max;\n\n/**\n * This method is like `_.find` except that it returns the index of the first\n * element `predicate` returns truthy for instead of the element itself.\n *\n * @static\n * @memberOf _\n * @since 1.1.0\n * @category Array\n * @param {Array} array The array to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {number} Returns the index of the found element, else `-1`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'active': false },\n * { 'user': 'fred', 'active': false },\n * { 'user': 'pebbles', 'active': true }\n * ];\n *\n * _.findIndex(users, function(o) { return o.user == 'barney'; });\n * // => 0\n *\n * // The `_.matches` iteratee shorthand.\n * _.findIndex(users, { 'user': 'fred', 'active': false });\n * // => 1\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.findIndex(users, ['active', false]);\n * // => 0\n *\n * // The `_.property` iteratee shorthand.\n * _.findIndex(users, 'active');\n * // => 2\n */\nfunction findIndex(array, predicate, fromIndex) {\n var length = array == null ? 0 : array.length;\n if (!length) {\n return -1;\n }\n var index = fromIndex == null ? 0 : toInteger(fromIndex);\n if (index < 0) {\n index = nativeMax(length + index, 0);\n }\n return baseFindIndex(array, baseIteratee(predicate, 3), index);\n}\n\nexport default findIndex;\n","import createFind from './_createFind.js';\nimport findIndex from './findIndex.js';\n\n/**\n * Iterates over elements of `collection`, returning the first element\n * `predicate` returns truthy for. The predicate is invoked with three\n * arguments: (value, index|key, collection).\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to inspect.\n * @param {Function} [predicate=_.identity] The function invoked per iteration.\n * @param {number} [fromIndex=0] The index to search from.\n * @returns {*} Returns the matched element, else `undefined`.\n * @example\n *\n * var users = [\n * { 'user': 'barney', 'age': 36, 'active': true },\n * { 'user': 'fred', 'age': 40, 'active': false },\n * { 'user': 'pebbles', 'age': 1, 'active': true }\n * ];\n *\n * _.find(users, function(o) { return o.age < 40; });\n * // => object for 'barney'\n *\n * // The `_.matches` iteratee shorthand.\n * _.find(users, { 'age': 1, 'active': true });\n * // => object for 'pebbles'\n *\n * // The `_.matchesProperty` iteratee shorthand.\n * _.find(users, ['active', false]);\n * // => object for 'fred'\n *\n * // The `_.property` iteratee shorthand.\n * _.find(users, 'active');\n * // => object for 'barney'\n */\nvar find = createFind(findIndex);\n\nexport default find;\n","import assignValue from './_assignValue.js';\nimport castPath from './_castPath.js';\nimport isIndex from './_isIndex.js';\nimport isObject from './isObject.js';\nimport toKey from './_toKey.js';\n\n/**\n * The base implementation of `_.set`.\n *\n * @private\n * @param {Object} object The object to modify.\n * @param {Array|string} path The path of the property to set.\n * @param {*} value The value to set.\n * @param {Function} [customizer] The function to customize path creation.\n * @returns {Object} Returns `object`.\n */\nfunction baseSet(object, path, value, customizer) {\n if (!isObject(object)) {\n return object;\n }\n path = castPath(path, object);\n\n var index = -1,\n length = path.length,\n lastIndex = length - 1,\n nested = object;\n\n while (nested != null && ++index < length) {\n var key = toKey(path[index]),\n newValue = value;\n\n if (key === '__proto__' || key === 'constructor' || key === 'prototype') {\n return object;\n }\n\n if (index != lastIndex) {\n var objValue = nested[key];\n newValue = customizer ? customizer(objValue, key, nested) : undefined;\n if (newValue === undefined) {\n newValue = isObject(objValue)\n ? objValue\n : (isIndex(path[index + 1]) ? [] : {});\n }\n }\n assignValue(nested, key, newValue);\n nested = nested[key];\n }\n return object;\n}\n\nexport default baseSet;\n","import baseGet from './_baseGet.js';\nimport baseSet from './_baseSet.js';\nimport castPath from './_castPath.js';\n\n/**\n * The base implementation of `_.pickBy` without support for iteratee shorthands.\n *\n * @private\n * @param {Object} object The source object.\n * @param {string[]} paths The property paths to pick.\n * @param {Function} predicate The function invoked per property.\n * @returns {Object} Returns the new object.\n */\nfunction basePickBy(object, paths, predicate) {\n var index = -1,\n length = paths.length,\n result = {};\n\n while (++index < length) {\n var path = paths[index],\n value = baseGet(object, path);\n\n if (predicate(value, path)) {\n baseSet(result, castPath(path, object), value);\n }\n }\n return result;\n}\n\nexport default basePickBy;\n","import isSymbol from './isSymbol.js';\n\n/**\n * The base implementation of methods like `_.max` and `_.min` which accepts a\n * `comparator` to determine the extremum value.\n *\n * @private\n * @param {Array} array The array to iterate over.\n * @param {Function} iteratee The iteratee invoked per iteration.\n * @param {Function} comparator The comparator used to compare values.\n * @returns {*} Returns the extremum value.\n */\nfunction baseExtremum(array, iteratee, comparator) {\n var index = -1,\n length = array.length;\n\n while (++index < length) {\n var value = array[index],\n current = iteratee(value);\n\n if (current != null && (computed === undefined\n ? (current === current && !isSymbol(current))\n : comparator(current, computed)\n )) {\n var computed = current,\n result = value;\n }\n }\n return result;\n}\n\nexport default baseExtremum;\n","/** Used to match a single whitespace character. */\nvar reWhitespace = /\\s/;\n\n/**\n * Used by `_.trim` and `_.trimEnd` to get the index of the last non-whitespace\n * character of `string`.\n *\n * @private\n * @param {string} string The string to inspect.\n * @returns {number} Returns the index of the last non-whitespace character.\n */\nfunction trimmedEndIndex(string) {\n var index = string.length;\n\n while (index-- && reWhitespace.test(string.charAt(index))) {}\n return index;\n}\n\nexport default trimmedEndIndex;\n","import trimmedEndIndex from './_trimmedEndIndex.js';\n\n/** Used to match leading whitespace. */\nvar reTrimStart = /^\\s+/;\n\n/**\n * The base implementation of `_.trim`.\n *\n * @private\n * @param {string} string The string to trim.\n * @returns {string} Returns the trimmed string.\n */\nfunction baseTrim(string) {\n return string\n ? string.slice(0, trimmedEndIndex(string) + 1).replace(reTrimStart, '')\n : string;\n}\n\nexport default baseTrim;\n","import baseTrim from './_baseTrim.js';\nimport isObject from './isObject.js';\nimport isSymbol from './isSymbol.js';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = baseTrim(value);\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nexport default toNumber;\n","import toNumber from './toNumber.js';\n\n/** Used as references for various `Number` constants. */\nvar INFINITY = 1 / 0,\n MAX_INTEGER = 1.7976931348623157e+308;\n\n/**\n * Converts `value` to a finite number.\n *\n * @static\n * @memberOf _\n * @since 4.12.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted number.\n * @example\n *\n * _.toFinite(3.2);\n * // => 3.2\n *\n * _.toFinite(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toFinite(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toFinite('3.2');\n * // => 3.2\n */\nfunction toFinite(value) {\n if (!value) {\n return value === 0 ? value : 0;\n }\n value = toNumber(value);\n if (value === INFINITY || value === -INFINITY) {\n var sign = (value < 0 ? -1 : 1);\n return sign * MAX_INTEGER;\n }\n return value === value ? value : 0;\n}\n\nexport default toFinite;\n","import baseGetTag from './_baseGetTag.js';\nimport isArray from './isArray.js';\nimport isObjectLike from './isObjectLike.js';\n\n/** `Object#toString` result references. */\nvar stringTag = '[object String]';\n\n/**\n * Checks if `value` is classified as a `String` primitive or object.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a string, else `false`.\n * @example\n *\n * _.isString('abc');\n * // => true\n *\n * _.isString(1);\n * // => false\n */\nfunction isString(value) {\n return typeof value == 'string' ||\n (!isArray(value) && isObjectLike(value) && baseGetTag(value) == stringTag);\n}\n\nexport default isString;\n","/**\n * Gets the last element of `array`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to query.\n * @returns {*} Returns the last element of `array`.\n * @example\n *\n * _.last([1, 2, 3]);\n * // => 3\n */\nfunction last(array) {\n var length = array == null ? 0 : array.length;\n return length ? array[length - 1] : undefined;\n}\n\nexport default last;\n","import baseEach from './_baseEach.js';\nimport isArrayLike from './isArrayLike.js';\n\n/**\n * The base implementation of `_.map` without support for iteratee shorthands.\n *\n * @private\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} iteratee The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n */\nfunction baseMap(collection, iteratee) {\n var index = -1,\n result = isArrayLike(collection) ? Array(collection.length) : [];\n\n baseEach(collection, function(value, key, collection) {\n result[++index] = iteratee(value, key, collection);\n });\n return result;\n}\n\nexport default baseMap;\n","import baseRest from './_baseRest.js';\nimport eq from './eq.js';\nimport isIterateeCall from './_isIterateeCall.js';\nimport keysIn from './keysIn.js';\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/** Used to check objects for own properties. */\nvar hasOwnProperty = objectProto.hasOwnProperty;\n\n/**\n * Assigns own and inherited enumerable string keyed properties of source\n * objects to the destination object for all destination properties that\n * resolve to `undefined`. Source objects are applied from left to right.\n * Once a property is set, additional values of the same property are ignored.\n *\n * **Note:** This method mutates `object`.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Object\n * @param {Object} object The destination object.\n * @param {...Object} [sources] The source objects.\n * @returns {Object} Returns `object`.\n * @see _.defaultsDeep\n * @example\n *\n * _.defaults({ 'a': 1 }, { 'b': 2 }, { 'a': 3 });\n * // => { 'a': 1, 'b': 2 }\n */\nvar defaults = baseRest(function(object, sources) {\n object = Object(object);\n\n var index = -1;\n var length = sources.length;\n var guard = length > 2 ? sources[2] : undefined;\n\n if (guard && isIterateeCall(sources[0], sources[1], guard)) {\n length = 1;\n }\n\n while (++index < length) {\n var source = sources[index];\n var props = keysIn(source);\n var propsIndex = -1;\n var propsLength = props.length;\n\n while (++propsIndex < propsLength) {\n var key = props[propsIndex];\n var value = object[key];\n\n if (value === undefined ||\n (eq(value, objectProto[key]) && !hasOwnProperty.call(object, key))) {\n object[key] = source[key];\n }\n }\n }\n\n return object;\n});\n\nexport default defaults;\n","/**\n * The base implementation of `_.lt` which doesn't coerce arguments.\n *\n * @private\n * @param {*} value The value to compare.\n * @param {*} other The other value to compare.\n * @returns {boolean} Returns `true` if `value` is less than `other`,\n * else `false`.\n */\nfunction baseLt(value, other) {\n return value < other;\n}\n\nexport default baseLt;\n","import baseFlatten from './_baseFlatten.js';\n\n/**\n * Flattens `array` a single level deep.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {Array} array The array to flatten.\n * @returns {Array} Returns the new flattened array.\n * @example\n *\n * _.flatten([1, [2, [3, [4]], 5]]);\n * // => [1, 2, [3, [4]], 5]\n */\nfunction flatten(array) {\n var length = array == null ? 0 : array.length;\n return length ? baseFlatten(array, 1) : [];\n}\n\nexport default flatten;\n","import toFinite from './toFinite.js';\n\n/**\n * Converts `value` to an integer.\n *\n * **Note:** This method is loosely based on\n * [`ToInteger`](http://www.ecma-international.org/ecma-262/7.0/#sec-tointeger).\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to convert.\n * @returns {number} Returns the converted integer.\n * @example\n *\n * _.toInteger(3.2);\n * // => 3\n *\n * _.toInteger(Number.MIN_VALUE);\n * // => 0\n *\n * _.toInteger(Infinity);\n * // => 1.7976931348623157e+308\n *\n * _.toInteger('3.2');\n * // => 3\n */\nfunction toInteger(value) {\n var result = toFinite(value),\n remainder = result % 1;\n\n return result === result ? (remainder ? result - remainder : result) : 0;\n}\n\nexport default toInteger;\n","import arrayMap from './_arrayMap.js';\nimport baseIteratee from './_baseIteratee.js';\nimport baseMap from './_baseMap.js';\nimport isArray from './isArray.js';\n\n/**\n * Creates an array of values by running each element in `collection` thru\n * `iteratee`. The iteratee is invoked with three arguments:\n * (value, index|key, collection).\n *\n * Many lodash methods are guarded to work as iteratees for methods like\n * `_.every`, `_.filter`, `_.map`, `_.mapValues`, `_.reject`, and `_.some`.\n *\n * The guarded methods are:\n * `ary`, `chunk`, `curry`, `curryRight`, `drop`, `dropRight`, `every`,\n * `fill`, `invert`, `parseInt`, `random`, `range`, `rangeRight`, `repeat`,\n * `sampleSize`, `slice`, `some`, `sortBy`, `split`, `take`, `takeRight`,\n * `template`, `trim`, `trimEnd`, `trimStart`, and `words`\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Collection\n * @param {Array|Object} collection The collection to iterate over.\n * @param {Function} [iteratee=_.identity] The function invoked per iteration.\n * @returns {Array} Returns the new mapped array.\n * @example\n *\n * function square(n) {\n * return n * n;\n * }\n *\n * _.map([4, 8], square);\n * // => [16, 64]\n *\n * _.map({ 'a': 4, 'b': 8 }, square);\n * // => [16, 64] (iteration order is not guaranteed)\n *\n * var users = [\n * { 'user': 'barney' },\n * { 'user': 'fred' }\n * ];\n *\n * // The `_.property` iteratee shorthand.\n * _.map(users, 'user');\n * // => ['barney', 'fred']\n */\nfunction map(collection, iteratee) {\n var func = isArray(collection) ? arrayMap : baseMap;\n return func(collection, baseIteratee(iteratee, 3));\n}\n\nexport default map;\n","import baseExtremum from './_baseExtremum.js';\nimport baseLt from './_baseLt.js';\nimport identity from './identity.js';\n\n/**\n * Computes the minimum value of `array`. If `array` is empty or falsey,\n * `undefined` is returned.\n *\n * @static\n * @since 0.1.0\n * @memberOf _\n * @category Math\n * @param {Array} array The array to iterate over.\n * @returns {*} Returns the minimum value.\n * @example\n *\n * _.min([4, 2, 8, 6]);\n * // => 2\n *\n * _.min([]);\n * // => undefined\n */\nfunction min(array) {\n return (array && array.length)\n ? baseExtremum(array, identity, baseLt)\n : undefined;\n}\n\nexport default min;\n","import baseFlatten from './_baseFlatten.js';\nimport baseRest from './_baseRest.js';\nimport baseUniq from './_baseUniq.js';\nimport isArrayLikeObject from './isArrayLikeObject.js';\n\n/**\n * Creates an array of unique values, in order, from all given arrays using\n * [`SameValueZero`](http://ecma-international.org/ecma-262/7.0/#sec-samevaluezero)\n * for equality comparisons.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Array\n * @param {...Array} [arrays] The arrays to inspect.\n * @returns {Array} Returns the new array of combined values.\n * @example\n *\n * _.union([2], [1, 2]);\n * // => [2, 1]\n */\nvar union = baseRest(function(arrays) {\n return baseUniq(baseFlatten(arrays, 1, isArrayLikeObject, true));\n});\n\nexport default union;\n","import * as _ from 'lodash-es';\n\nvar DEFAULT_EDGE_NAME = '\\x00';\nvar GRAPH_NODE = '\\x00';\nvar EDGE_KEY_DELIM = '\\x01';\n\n// Implementation notes:\n//\n// * Node id query functions should return string ids for the nodes\n// * Edge id query functions should return an \"edgeObj\", edge object, that is\n// composed of enough information to uniquely identify an edge: {v, w, name}.\n// * Internally we use an \"edgeId\", a stringified form of the edgeObj, to\n// reference edges. This is because we need a performant way to look these\n// edges up and, object properties, which have string keys, are the closest\n// we're going to get to a performant hashtable in JavaScript.\n\n// Implementation notes:\n//\n// * Node id query functions should return string ids for the nodes\n// * Edge id query functions should return an \"edgeObj\", edge object, that is\n// composed of enough information to uniquely identify an edge: {v, w, name}.\n// * Internally we use an \"edgeId\", a stringified form of the edgeObj, to\n// reference edges. This is because we need a performant way to look these\n// edges up and, object properties, which have string keys, are the closest\n// we're going to get to a performant hashtable in JavaScript.\nexport class Graph {\n constructor(opts = {}) {\n this._isDirected = Object.prototype.hasOwnProperty.call(opts, 'directed')\n ? opts.directed\n : true;\n this._isMultigraph = Object.prototype.hasOwnProperty.call(opts, 'multigraph')\n ? opts.multigraph\n : false;\n this._isCompound = Object.prototype.hasOwnProperty.call(opts, 'compound')\n ? opts.compound\n : false;\n\n // Label for the graph itself\n this._label = undefined;\n\n // Defaults to be set when creating a new node\n this._defaultNodeLabelFn = _.constant(undefined);\n\n // Defaults to be set when creating a new edge\n this._defaultEdgeLabelFn = _.constant(undefined);\n\n // v -> label\n this._nodes = {};\n\n if (this._isCompound) {\n // v -> parent\n this._parent = {};\n\n // v -> children\n this._children = {};\n this._children[GRAPH_NODE] = {};\n }\n\n // v -> edgeObj\n this._in = {};\n\n // u -> v -> Number\n this._preds = {};\n\n // v -> edgeObj\n this._out = {};\n\n // v -> w -> Number\n this._sucs = {};\n\n // e -> edgeObj\n this._edgeObjs = {};\n\n // e -> label\n this._edgeLabels = {};\n }\n /* === Graph functions ========= */\n isDirected() {\n return this._isDirected;\n }\n isMultigraph() {\n return this._isMultigraph;\n }\n isCompound() {\n return this._isCompound;\n }\n setGraph(label) {\n this._label = label;\n return this;\n }\n graph() {\n return this._label;\n }\n /* === Node functions ========== */\n setDefaultNodeLabel(newDefault) {\n if (!_.isFunction(newDefault)) {\n newDefault = _.constant(newDefault);\n }\n this._defaultNodeLabelFn = newDefault;\n return this;\n }\n nodeCount() {\n return this._nodeCount;\n }\n nodes() {\n return _.keys(this._nodes);\n }\n sources() {\n var self = this;\n return _.filter(this.nodes(), function (v) {\n return _.isEmpty(self._in[v]);\n });\n }\n sinks() {\n var self = this;\n return _.filter(this.nodes(), function (v) {\n return _.isEmpty(self._out[v]);\n });\n }\n setNodes(vs, value) {\n var args = arguments;\n var self = this;\n _.each(vs, function (v) {\n if (args.length > 1) {\n self.setNode(v, value);\n } else {\n self.setNode(v);\n }\n });\n return this;\n }\n setNode(v, value) {\n if (Object.prototype.hasOwnProperty.call(this._nodes, v)) {\n if (arguments.length > 1) {\n this._nodes[v] = value;\n }\n return this;\n }\n\n // @ts-expect-error\n this._nodes[v] = arguments.length > 1 ? value : this._defaultNodeLabelFn(v);\n if (this._isCompound) {\n this._parent[v] = GRAPH_NODE;\n this._children[v] = {};\n this._children[GRAPH_NODE][v] = true;\n }\n this._in[v] = {};\n this._preds[v] = {};\n this._out[v] = {};\n this._sucs[v] = {};\n ++this._nodeCount;\n return this;\n }\n node(v) {\n return this._nodes[v];\n }\n hasNode(v) {\n return Object.prototype.hasOwnProperty.call(this._nodes, v);\n }\n removeNode(v) {\n if (Object.prototype.hasOwnProperty.call(this._nodes, v)) {\n var removeEdge = (e) => this.removeEdge(this._edgeObjs[e]);\n delete this._nodes[v];\n if (this._isCompound) {\n this._removeFromParentsChildList(v);\n delete this._parent[v];\n _.each(this.children(v), (child) => {\n this.setParent(child);\n });\n delete this._children[v];\n }\n _.each(_.keys(this._in[v]), removeEdge);\n delete this._in[v];\n delete this._preds[v];\n _.each(_.keys(this._out[v]), removeEdge);\n delete this._out[v];\n delete this._sucs[v];\n --this._nodeCount;\n }\n return this;\n }\n setParent(v, parent) {\n if (!this._isCompound) {\n throw new Error('Cannot set parent in a non-compound graph');\n }\n\n if (_.isUndefined(parent)) {\n parent = GRAPH_NODE;\n } else {\n // Coerce parent to string\n parent += '';\n for (var ancestor = parent; !_.isUndefined(ancestor); ancestor = this.parent(ancestor)) {\n if (ancestor === v) {\n throw new Error('Setting ' + parent + ' as parent of ' + v + ' would create a cycle');\n }\n }\n\n this.setNode(parent);\n }\n\n this.setNode(v);\n this._removeFromParentsChildList(v);\n this._parent[v] = parent;\n this._children[parent][v] = true;\n return this;\n }\n _removeFromParentsChildList(v) {\n delete this._children[this._parent[v]][v];\n }\n parent(v) {\n if (this._isCompound) {\n var parent = this._parent[v];\n if (parent !== GRAPH_NODE) {\n return parent;\n }\n }\n }\n children(v) {\n if (_.isUndefined(v)) {\n v = GRAPH_NODE;\n }\n\n if (this._isCompound) {\n var children = this._children[v];\n if (children) {\n return _.keys(children);\n }\n } else if (v === GRAPH_NODE) {\n return this.nodes();\n } else if (this.hasNode(v)) {\n return [];\n }\n }\n predecessors(v) {\n var predsV = this._preds[v];\n if (predsV) {\n return _.keys(predsV);\n }\n }\n successors(v) {\n var sucsV = this._sucs[v];\n if (sucsV) {\n return _.keys(sucsV);\n }\n }\n neighbors(v) {\n var preds = this.predecessors(v);\n if (preds) {\n return _.union(preds, this.successors(v));\n }\n }\n isLeaf(v) {\n var neighbors;\n if (this.isDirected()) {\n neighbors = this.successors(v);\n } else {\n neighbors = this.neighbors(v);\n }\n return neighbors.length === 0;\n }\n filterNodes(filter) {\n // @ts-expect-error\n var copy = new this.constructor({\n directed: this._isDirected,\n multigraph: this._isMultigraph,\n compound: this._isCompound,\n });\n\n copy.setGraph(this.graph());\n\n var self = this;\n _.each(this._nodes, function (value, v) {\n if (filter(v)) {\n copy.setNode(v, value);\n }\n });\n\n _.each(this._edgeObjs, function (e) {\n // @ts-expect-error\n if (copy.hasNode(e.v) && copy.hasNode(e.w)) {\n copy.setEdge(e, self.edge(e));\n }\n });\n\n var parents = {};\n function findParent(v) {\n var parent = self.parent(v);\n if (parent === undefined || copy.hasNode(parent)) {\n parents[v] = parent;\n return parent;\n } else if (parent in parents) {\n return parents[parent];\n } else {\n return findParent(parent);\n }\n }\n\n if (this._isCompound) {\n _.each(copy.nodes(), function (v) {\n copy.setParent(v, findParent(v));\n });\n }\n\n return copy;\n }\n /* === Edge functions ========== */\n setDefaultEdgeLabel(newDefault) {\n if (!_.isFunction(newDefault)) {\n newDefault = _.constant(newDefault);\n }\n this._defaultEdgeLabelFn = newDefault;\n return this;\n }\n edgeCount() {\n return this._edgeCount;\n }\n edges() {\n return _.values(this._edgeObjs);\n }\n setPath(vs, value) {\n var self = this;\n var args = arguments;\n _.reduce(vs, function (v, w) {\n if (args.length > 1) {\n self.setEdge(v, w, value);\n } else {\n self.setEdge(v, w);\n }\n return w;\n });\n return this;\n }\n /*\n * setEdge(v, w, [value, [name]])\n * setEdge({ v, w, [name] }, [value])\n */\n setEdge() {\n var v, w, name, value;\n var valueSpecified = false;\n var arg0 = arguments[0];\n\n if (typeof arg0 === 'object' && arg0 !== null && 'v' in arg0) {\n v = arg0.v;\n w = arg0.w;\n name = arg0.name;\n if (arguments.length === 2) {\n value = arguments[1];\n valueSpecified = true;\n }\n } else {\n v = arg0;\n w = arguments[1];\n name = arguments[3];\n if (arguments.length > 2) {\n value = arguments[2];\n valueSpecified = true;\n }\n }\n\n v = '' + v;\n w = '' + w;\n if (!_.isUndefined(name)) {\n name = '' + name;\n }\n\n var e = edgeArgsToId(this._isDirected, v, w, name);\n if (Object.prototype.hasOwnProperty.call(this._edgeLabels, e)) {\n if (valueSpecified) {\n this._edgeLabels[e] = value;\n }\n return this;\n }\n\n if (!_.isUndefined(name) && !this._isMultigraph) {\n throw new Error('Cannot set a named edge when isMultigraph = false');\n }\n\n // It didn't exist, so we need to create it.\n // First ensure the nodes exist.\n this.setNode(v);\n this.setNode(w);\n\n // @ts-expect-error\n this._edgeLabels[e] = valueSpecified ? value : this._defaultEdgeLabelFn(v, w, name);\n\n var edgeObj = edgeArgsToObj(this._isDirected, v, w, name);\n // Ensure we add undirected edges in a consistent way.\n v = edgeObj.v;\n w = edgeObj.w;\n\n Object.freeze(edgeObj);\n this._edgeObjs[e] = edgeObj;\n incrementOrInitEntry(this._preds[w], v);\n incrementOrInitEntry(this._sucs[v], w);\n this._in[w][e] = edgeObj;\n this._out[v][e] = edgeObj;\n this._edgeCount++;\n return this;\n }\n edge(v, w, name) {\n var e =\n arguments.length === 1\n ? edgeObjToId(this._isDirected, arguments[0])\n : edgeArgsToId(this._isDirected, v, w, name);\n return this._edgeLabels[e];\n }\n hasEdge(v, w, name) {\n var e =\n arguments.length === 1\n ? edgeObjToId(this._isDirected, arguments[0])\n : edgeArgsToId(this._isDirected, v, w, name);\n return Object.prototype.hasOwnProperty.call(this._edgeLabels, e);\n }\n removeEdge(v, w, name) {\n var e =\n arguments.length === 1\n ? edgeObjToId(this._isDirected, arguments[0])\n : edgeArgsToId(this._isDirected, v, w, name);\n var edge = this._edgeObjs[e];\n if (edge) {\n v = edge.v;\n w = edge.w;\n delete this._edgeLabels[e];\n delete this._edgeObjs[e];\n decrementOrRemoveEntry(this._preds[w], v);\n decrementOrRemoveEntry(this._sucs[v], w);\n delete this._in[w][e];\n delete this._out[v][e];\n this._edgeCount--;\n }\n return this;\n }\n inEdges(v, u) {\n var inV = this._in[v];\n if (inV) {\n var edges = _.values(inV);\n if (!u) {\n return edges;\n }\n return _.filter(edges, function (edge) {\n return edge.v === u;\n });\n }\n }\n outEdges(v, w) {\n var outV = this._out[v];\n if (outV) {\n var edges = _.values(outV);\n if (!w) {\n return edges;\n }\n return _.filter(edges, function (edge) {\n return edge.w === w;\n });\n }\n }\n nodeEdges(v, w) {\n var inEdges = this.inEdges(v, w);\n if (inEdges) {\n return inEdges.concat(this.outEdges(v, w));\n }\n }\n}\n\n/* Number of nodes in the graph. Should only be changed by the implementation. */\nGraph.prototype._nodeCount = 0;\n\n/* Number of edges in the graph. Should only be changed by the implementation. */\nGraph.prototype._edgeCount = 0;\n\nfunction incrementOrInitEntry(map, k) {\n if (map[k]) {\n map[k]++;\n } else {\n map[k] = 1;\n }\n}\n\nfunction decrementOrRemoveEntry(map, k) {\n if (!--map[k]) {\n delete map[k];\n }\n}\n\nfunction edgeArgsToId(isDirected, v_, w_, name) {\n var v = '' + v_;\n var w = '' + w_;\n if (!isDirected && v > w) {\n var tmp = v;\n v = w;\n w = tmp;\n }\n return v + EDGE_KEY_DELIM + w + EDGE_KEY_DELIM + (_.isUndefined(name) ? DEFAULT_EDGE_NAME : name);\n}\n\nfunction edgeArgsToObj(isDirected, v_, w_, name) {\n var v = '' + v_;\n var w = '' + w_;\n if (!isDirected && v > w) {\n var tmp = v;\n v = w;\n w = tmp;\n }\n var edgeObj = { v: v, w: w };\n if (name) {\n edgeObj.name = name;\n }\n return edgeObj;\n}\n\nfunction edgeObjToId(isDirected, edgeObj) {\n return edgeArgsToId(isDirected, edgeObj.v, edgeObj.w, edgeObj.name);\n}\n"],"names":["idCounter","prefix","id","toString","nativeCeil","Math","ceil","nativeMax","max","start","end","step","fromRight","index","length","result","Array","isIterateeCall","undefined","toFinite","baseRange","createRange","List","constructor","sentinel","_next","_prev","this","_sentinel","dequeue","entry","unlink","enqueue","strs","curr","push","JSON","stringify","filterOutLinks","join","k","v","DEFAULT_WEIGHT_FN","_","greedyFAS","g","weightFn","nodeCount","state","fasGraph","Graph","maxIn","maxOut","nodes","setNode","in","out","edges","e","prevWeight","edge","w","weight","edgeWeight","setEdge","node","buckets","map","zeroIdx","assignBucket","graph","buildState","results","sources","sinks","removeNode","i","concat","doGreedyFAS","outEdges","collectPredecessors","inEdges","uEntry","wEntry","run","fas","acyclicer","stack","visited","dfs","Object","prototype","hasOwnProperty","call","dfsFAS","label","removeEdge","forwardName","name","reversed","object","paths","basePickBy","value","path","hasIn","func","setToString","overRest","flatten","flatRest","basePick","other","array","baseExtremum","identity","baseGt","iteratee","baseIteratee","baseForOwn","key","baseAssignValue","root","Date","now","addDummyNode","type","attrs","hasNode","dummy","asNonCompoundGraph","simplified","multigraph","isMultigraph","setGraph","children","intersectRect","rect","point","sx","sy","x","y","dx","dy","width","h","height","Error","abs","buildLayerMatrix","layering","maxRank","rank","order","addBorderNode","arguments","time","fn","console","log","notime","prop","sg","sgNode","borderType","prev","util","setParent","undo","rankDir","rankdir","toLowerCase","reverseYOne","points","reverseY","swapXYOne","swapXY","swapWidthHeight","swapWidthHeightOne","dummyChains","vRank","wRank","edgeLabel","labelRank","edgeObj","labelpos","normalizeEdge","baseLt","longestPath","minlen","Number","POSITIVE_INFINITY","slack","feasibleTree","delta","t","directed","size","tightTree","findMinSlackEdge","shiftRanks","nodeEdges","edgeV","baseProperty","RegExp","rsAstralRange","rsAstral","rsCombo","rsFitz","rsNonAstral","rsRegional","rsSurrPair","reOptMod","rsOptVar","rsSeq","rsSymbol","CycleException","vs","navigation","isDirected","successors","neighbors","bind","acc","doDfs","postorder","networkSimplex","simpleLabel","simplify","initLowLimValues","initCutValues","leaveEdge","exchangeEdges","enterEdge","alg","slice","child","childLab","parent","cutvalue","calcCutValue","assignCutValue","childIsTail","graphEdge","cutValue","u","isOutEdge","pointsToHead","otherWeight","hasEdge","otherCutValue","tree","dfsAssignLowLim","nextLim","low","lim","vLabel","wLabel","tailLabel","flip","candidates","isDescendant","f","flipped","updateRanks","rootLabel","ranker","networkSimplexRanker","tightTreeRanker","longestPathRanker","depths","depth","treeDepths","nodeSep","nestingRoot","sumWeights","nodeRankFactor","top","bottom","borderTop","borderBottom","childNode","childTop","childBottom","thisWeight","nestingEdge","baseClone","CLONE_DEEP_FLAG","buildLayerGraph","relationship","createRootNode","compound","setDefaultNodeLabel","minRank","borderLeft","borderRight","props","values","assignFunc","valsLength","baseZipObject","assignValue","comparer","sort","valIsDefined","valIsNull","valIsReflexive","valIsSymbol","isSymbol","othIsDefined","othIsNull","othIsReflexive","othIsSymbol","orders","objCriteria","criteria","othCriteria","ordersLength","compareAscending","collection","iteratees","arrayMap","isArray","baseGet","baseUnary","baseMap","baseSortBy","compareMultiple","baseRest","baseOrderBy","baseFlatten","crossCount","cc","twoLayerCrossCount","northLayer","southLayer","southPos","southEntries","pos","firstIndex","treeSize","forEach","weightSum","resolveConflicts","entries","cg","mappedEntries","tmp","indegree","barycenter","entryV","entryW","sourceSet","handleIn","vEntry","merged","target","source","sum","min","mergeEntries","handleOut","pop","reverse","doResolveConflicts","biasRight","bias","parts","lhs","rhs","sortable","unsortable","vsIndex","consumeUnsortable","last","sortSubgraph","movable","bl","br","subgraphs","barycenters","inV","nodeU","subgraphResult","expandSubgraphs","predecessors","blPred","brPred","downLayerGraphs","buildLayerGraphs","upLayerGraphs","simpleNodes","layers","orderedVs","initOrder","assignOrder","best","bestCC","lastBest","sweepLayerGraphs","ranks","layerGraphs","lg","sorted","rootPrev","prevChild","addSubgraphConstraints","layer","parentDummyChains","postorderNums","pathData","lca","vPath","wPath","findPath","pathIdx","pathV","ascending","castFunction","baseFor","keysIn","findType1Conflicts","conflicts","prevLayer","k0","scanPos","prevLayerLength","lastNode","findOtherInnerSegmentNode","k1","scanNode","uLabel","uPos","addConflict","conflictsV","hasConflict","horizontalCompaction","align","reverseSep","xs","blockG","blockGraph","graphLabel","sepFn","edgeSep","sep","nodesep","edgesep","vRoot","uRoot","prevMax","buildBlockGraph","iterate","setXsFunc","nextNodesFunc","elem","reduce","positionX","adjustedLayering","scan","south","southEnd","prevNorthBorder","nextNorthBorder","uNode","north","nextNorthPos","prevNorthPos","southLookahead","findType2Conflicts","xss","vert","horiz","inner","neighborFn","prevIdx","ws","mp","floor","il","verticalAlignment","smallestWidth","NEGATIVE_INFINITY","halfWidth","findSmallestWidthAlignment","alignTo","alignToVals","alignToMin","alignToMax","alignment","xsVals","alignCoordinates","ul","ignore","balance","position","rankSep","ranksep","prevY","maxHeight","positionY","layout","opts","debugTiming","layoutGraph","inputGraph","canonicalize","graphDefaults","selectNumberAttrs","graphNumAttrs","graphAttrs","nodeNumAttrs","nodeDefaults","edgeDefaults","edgeNumAttrs","edgeAttrs","buildLayoutGraph","labeloffset","makeSpaceForEdgeLabels","selfEdges","removeSelfEdges","acyclic","nestingGraph","injectEdgeLabelProxies","offset","assignRankMinMax","removeEdgeLabelProxies","normalize","addBorderSegments","orderShift","selfEdge","insertSelfEdges","coordinateSystem","selfNode","positionSelfEdges","b","l","r","removeBorderNodes","origLabel","fixupEdgeLabelCoords","minX","maxX","minY","maxY","marginX","marginx","marginY","marginy","getExtremes","p","translateGraph","p1","p2","nodeV","nodeW","unshift","assignNodeIntersects","reversePointsForReversedEdges","runLayout","inputLabel","layoutLabel","updateInputGraph","obj","newAttrs","hasPath","baseHas","findIndexFunc","predicate","fromIndex","iterable","isArrayLike","keys","createFind","toInteger","baseFindIndex","customizer","isObject","castPath","lastIndex","nested","toKey","newValue","objValue","isIndex","baseSet","comparator","current","computed","reWhitespace","string","test","charAt","reTrimStart","trimmedEndIndex","replace","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","parseInt","valueOf","baseTrim","isBinary","INFINITY","toNumber","isObjectLike","baseGetTag","baseEach","objectProto","guard","propsIndex","propsLength","eq","remainder","arrays","baseUniq","isArrayLikeObject","GRAPH_NODE","_isDirected","_isMultigraph","_isCompound","_label","_defaultNodeLabelFn","_defaultEdgeLabelFn","_nodes","_parent","_children","_in","_preds","_out","_sucs","_edgeObjs","_edgeLabels","isCompound","newDefault","_nodeCount","self","setNodes","args","_removeFromParentsChildList","ancestor","predsV","sucsV","preds","isLeaf","filterNodes","filter","copy","parents","findParent","setDefaultEdgeLabel","edgeCount","_edgeCount","setPath","valueSpecified","arg0","edgeArgsToId","v_","w_","edgeArgsToObj","freeze","incrementOrInitEntry","edgeObjToId","decrementOrRemoveEntry","outV"],"sourceRoot":""} \ No newline at end of file diff --git a/frontend/deployed/static/js/621.a72de2cb.chunk.js b/frontend/deployed/static/js/621.a72de2cb.chunk.js deleted file mode 100644 index 065985f..0000000 --- a/frontend/deployed/static/js/621.a72de2cb.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunkbackstory=self.webpackChunkbackstory||[]).push([[621],{8621:(t,i,e)=>{e.d(i,{diagram:()=>J});var s=e(2596),n=e(634),a=e(3957),h=e(3759),o=e(700),r=function(){var t=(0,h.K2)((function(t,i,e,s){for(e=e||{},s=t.length;s--;e[t[s]]=i);return e}),"o"),i=[1,10,12,14,16,18,19,21,23],e=[2,6],s=[1,3],n=[1,5],a=[1,6],o=[1,7],r=[1,5,10,12,14,16,18,19,21,23,34,35,36],l=[1,25],c=[1,26],g=[1,28],u=[1,29],x=[1,30],d=[1,31],p=[1,32],f=[1,33],y=[1,34],m=[1,35],b=[1,36],A=[1,37],S=[1,43],C=[1,42],w=[1,47],_=[1,50],k=[1,10,12,14,16,18,19,21,23,34,35,36],T=[1,10,12,14,16,18,19,21,23,24,26,27,28,34,35,36],R=[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],D=[1,64],L={trace:(0,h.K2)((function(){}),"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:(0,h.K2)((function(t,i,e,s,n,a,h){var o=a.length-1;switch(n){case 5:s.setOrientation(a[o]);break;case 9:s.setDiagramTitle(a[o].text.trim());break;case 12:s.setLineData({text:"",type:"text"},a[o]);break;case 13:s.setLineData(a[o-1],a[o]);break;case 14:s.setBarData({text:"",type:"text"},a[o]);break;case 15:s.setBarData(a[o-1],a[o]);break;case 16:this.$=a[o].trim(),s.setAccTitle(this.$);break;case 17:case 18:this.$=a[o].trim(),s.setAccDescription(this.$);break;case 19:case 27:this.$=a[o-1];break;case 20:this.$=[Number(a[o-2]),...a[o]];break;case 21:this.$=[Number(a[o])];break;case 22:s.setXAxisTitle(a[o]);break;case 23:s.setXAxisTitle(a[o-1]);break;case 24:s.setXAxisTitle({type:"text",text:""});break;case 25:s.setXAxisBand(a[o]);break;case 26:s.setXAxisRangeData(Number(a[o-2]),Number(a[o]));break;case 28:this.$=[a[o-2],...a[o]];break;case 29:this.$=[a[o]];break;case 30:s.setYAxisTitle(a[o]);break;case 31:s.setYAxisTitle(a[o-1]);break;case 32:s.setYAxisTitle({type:"text",text:""});break;case 33:s.setYAxisRangeData(Number(a[o-2]),Number(a[o]));break;case 37:case 38:this.$={text:a[o],type:"text"};break;case 39:this.$={text:a[o],type:"markdown"};break;case 40:this.$=a[o];break;case 41:this.$=a[o-1]+""+a[o]}}),"anonymous"),table:[t(i,e,{3:1,4:2,7:4,5:s,34:n,35:a,36:o}),{1:[3]},t(i,e,{4:2,7:4,3:8,5:s,34:n,35:a,36:o}),t(i,e,{4:2,7:4,6:9,3:10,5:s,8:[1,11],34:n,35:a,36:o}),{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]},t(r,[2,34]),t(r,[2,35]),t(r,[2,36]),{1:[2,1]},t(i,e,{4:2,7:4,3:21,5:s,34:n,35:a,36:o}),{1:[2,3]},t(r,[2,5]),t(i,[2,7],{4:22,34:n,35:a,36:o}),{11:23,37:24,38:l,39:c,40:27,41:g,42:u,43:x,44:d,45:p,46:f,47:y,48:m,49:b,50:A},{11:39,13:38,24:S,27:C,29:40,30:41,37:24,38:l,39:c,40:27,41:g,42:u,43:x,44:d,45:p,46:f,47:y,48:m,49:b,50:A},{11:45,15:44,27:w,33:46,37:24,38:l,39:c,40:27,41:g,42:u,43:x,44:d,45:p,46:f,47:y,48:m,49:b,50:A},{11:49,17:48,24:_,37:24,38:l,39:c,40:27,41:g,42:u,43:x,44:d,45:p,46:f,47:y,48:m,49:b,50:A},{11:52,17:51,24:_,37:24,38:l,39:c,40:27,41:g,42:u,43:x,44:d,45:p,46:f,47:y,48:m,49:b,50:A},{20:[1,53]},{22:[1,54]},t(k,[2,18]),{1:[2,2]},t(k,[2,8]),t(k,[2,9]),t(T,[2,37],{40:55,41:g,42:u,43:x,44:d,45:p,46:f,47:y,48:m,49:b,50:A}),t(T,[2,38]),t(T,[2,39]),t(R,[2,40]),t(R,[2,42]),t(R,[2,43]),t(R,[2,44]),t(R,[2,45]),t(R,[2,46]),t(R,[2,47]),t(R,[2,48]),t(R,[2,49]),t(R,[2,50]),t(R,[2,51]),t(k,[2,10]),t(k,[2,22],{30:41,29:56,24:S,27:C}),t(k,[2,24]),t(k,[2,25]),{31:[1,57]},{11:59,32:58,37:24,38:l,39:c,40:27,41:g,42:u,43:x,44:d,45:p,46:f,47:y,48:m,49:b,50:A},t(k,[2,11]),t(k,[2,30],{33:60,27:w}),t(k,[2,32]),{31:[1,61]},t(k,[2,12]),{17:62,24:_},{25:63,27:D},t(k,[2,14]),{17:65,24:_},t(k,[2,16]),t(k,[2,17]),t(R,[2,41]),t(k,[2,23]),{27:[1,66]},{26:[1,67]},{26:[2,29],28:[1,68]},t(k,[2,31]),{27:[1,69]},t(k,[2,13]),{26:[1,70]},{26:[2,21],28:[1,71]},t(k,[2,15]),t(k,[2,26]),t(k,[2,27]),{11:59,32:72,37:24,38:l,39:c,40:27,41:g,42:u,43:x,44:d,45:p,46:f,47:y,48:m,49:b,50:A},t(k,[2,33]),t(k,[2,19]),{25:73,27:D},{26:[2,28]},{26:[2,20]}],defaultActions:{8:[2,1],10:[2,3],21:[2,2],72:[2,28],73:[2,20]},parseError:(0,h.K2)((function(t,i){if(!i.recoverable){var e=new Error(t);throw e.hash=i,e}this.trace(t)}),"parseError"),parse:(0,h.K2)((function(t){var i=this,e=[0],s=[],n=[null],a=[],o=this.table,r="",l=0,c=0,g=0,u=a.slice.call(arguments,1),x=Object.create(this.lexer),d={yy:{}};for(var p in this.yy)Object.prototype.hasOwnProperty.call(this.yy,p)&&(d.yy[p]=this.yy[p]);x.setInput(t,d.yy),d.yy.lexer=x,d.yy.parser=this,"undefined"==typeof x.yylloc&&(x.yylloc={});var f=x.yylloc;a.push(f);var y=x.options&&x.options.ranges;function m(){var t;return"number"!==typeof(t=s.pop()||x.lex()||1)&&(t instanceof Array&&(t=(s=t).pop()),t=i.symbols_[t]||t),t}"function"===typeof d.yy.parseError?this.parseError=d.yy.parseError:this.parseError=Object.getPrototypeOf(this).parseError,(0,h.K2)((function(t){e.length=e.length-2*t,n.length=n.length-t,a.length=a.length-t}),"popStack"),(0,h.K2)(m,"lex");for(var b,A,S,C,w,_,k,T,R,D={};;){if(S=e[e.length-1],this.defaultActions[S]?C=this.defaultActions[S]:(null!==b&&"undefined"!=typeof b||(b=m()),C=o[S]&&o[S][b]),"undefined"===typeof C||!C.length||!C[0]){var L="";for(_ in R=[],o[S])this.terminals_[_]&&_>2&&R.push("'"+this.terminals_[_]+"'");L=x.showPosition?"Parse error on line "+(l+1)+":\n"+x.showPosition()+"\nExpecting "+R.join(", ")+", got '"+(this.terminals_[b]||b)+"'":"Parse error on line "+(l+1)+": Unexpected "+(1==b?"end of input":"'"+(this.terminals_[b]||b)+"'"),this.parseError(L,{text:x.match,token:this.terminals_[b]||b,line:x.yylineno,loc:f,expected:R})}if(C[0]instanceof Array&&C.length>1)throw new Error("Parse Error: multiple actions possible at state: "+S+", token: "+b);switch(C[0]){case 1:e.push(b),n.push(x.yytext),a.push(x.yylloc),e.push(C[1]),b=null,A?(b=A,A=null):(c=x.yyleng,r=x.yytext,l=x.yylineno,f=x.yylloc,g>0&&g--);break;case 2:if(k=this.productions_[C[1]][1],D.$=n[n.length-k],D._$={first_line:a[a.length-(k||1)].first_line,last_line:a[a.length-1].last_line,first_column:a[a.length-(k||1)].first_column,last_column:a[a.length-1].last_column},y&&(D._$.range=[a[a.length-(k||1)].range[0],a[a.length-1].range[1]]),"undefined"!==typeof(w=this.performAction.apply(D,[r,c,l,d.yy,C[1],n,a].concat(u))))return w;k&&(e=e.slice(0,-1*k*2),n=n.slice(0,-1*k),a=a.slice(0,-1*k)),e.push(this.productions_[C[1]][0]),n.push(D.$),a.push(D._$),T=o[e[e.length-2]][e[e.length-1]],e.push(T);break;case 3:return!0}}return!0}),"parse")},P=function(){return{EOF:1,parseError:(0,h.K2)((function(t,i){if(!this.yy.parser)throw new Error(t);this.yy.parser.parseError(t,i)}),"parseError"),setInput:(0,h.K2)((function(t,i){return this.yy=i||this.yy||{},this._input=t,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:(0,h.K2)((function(){var t=this._input[0];return this.yytext+=t,this.yyleng++,this.offset++,this.match+=t,this.matched+=t,t.match(/(?:\r\n?|\n).*/g)?(this.yylineno++,this.yylloc.last_line++):this.yylloc.last_column++,this.options.ranges&&this.yylloc.range[1]++,this._input=this._input.slice(1),t}),"input"),unput:(0,h.K2)((function(t){var i=t.length,e=t.split(/(?:\r\n?|\n)/g);this._input=t+this._input,this.yytext=this.yytext.substr(0,this.yytext.length-i),this.offset-=i;var s=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),e.length-1&&(this.yylineno-=e.length-1);var n=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:e?(e.length===s.length?this.yylloc.first_column:0)+s[s.length-e.length].length-e[0].length:this.yylloc.first_column-i},this.options.ranges&&(this.yylloc.range=[n[0],n[0]+this.yyleng-i]),this.yyleng=this.yytext.length,this}),"unput"),more:(0,h.K2)((function(){return this._more=!0,this}),"more"),reject:(0,h.K2)((function(){return this.options.backtrack_lexer?(this._backtrack=!0,this):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})}),"reject"),less:(0,h.K2)((function(t){this.unput(this.match.slice(t))}),"less"),pastInput:(0,h.K2)((function(){var t=this.matched.substr(0,this.matched.length-this.match.length);return(t.length>20?"...":"")+t.substr(-20).replace(/\n/g,"")}),"pastInput"),upcomingInput:(0,h.K2)((function(){var t=this.match;return t.length<20&&(t+=this._input.substr(0,20-t.length)),(t.substr(0,20)+(t.length>20?"...":"")).replace(/\n/g,"")}),"upcomingInput"),showPosition:(0,h.K2)((function(){var t=this.pastInput(),i=new Array(t.length+1).join("-");return t+this.upcomingInput()+"\n"+i+"^"}),"showPosition"),test_match:(0,h.K2)((function(t,i){var e,s,n;if(this.options.backtrack_lexer&&(n={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&&(n.yylloc.range=this.yylloc.range.slice(0))),(s=t[0].match(/(?:\r\n?|\n).*/g))&&(this.yylineno+=s.length),this.yylloc={first_line:this.yylloc.last_line,last_line:this.yylineno+1,first_column:this.yylloc.last_column,last_column:s?s[s.length-1].length-s[s.length-1].match(/\r?\n?/)[0].length:this.yylloc.last_column+t[0].length},this.yytext+=t[0],this.match+=t[0],this.matches=t,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(t[0].length),this.matched+=t[0],e=this.performAction.call(this,this.yy,this,i,this.conditionStack[this.conditionStack.length-1]),this.done&&this._input&&(this.done=!1),e)return e;if(this._backtrack){for(var a in n)this[a]=n[a];return!1}return!1}),"test_match"),next:(0,h.K2)((function(){if(this.done)return this.EOF;var t,i,e,s;this._input||(this.done=!0),this._more||(this.yytext="",this.match="");for(var n=this._currentRules(),a=0;ai[0].length)){if(i=e,s=a,this.options.backtrack_lexer){if(!1!==(t=this.test_match(e,n[a])))return t;if(this._backtrack){i=!1;continue}return!1}if(!this.options.flex)break}return i?!1!==(t=this.test_match(i,n[s]))&&t:""===this._input?this.EOF:this.parseError("Lexical error on line "+(this.yylineno+1)+". Unrecognized text.\n"+this.showPosition(),{text:"",token:null,line:this.yylineno})}),"next"),lex:(0,h.K2)((function(){var t=this.next();return t||this.lex()}),"lex"),begin:(0,h.K2)((function(t){this.conditionStack.push(t)}),"begin"),popState:(0,h.K2)((function(){return this.conditionStack.length-1>0?this.conditionStack.pop():this.conditionStack[0]}),"popState"),_currentRules:(0,h.K2)((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:(0,h.K2)((function(t){return(t=this.conditionStack.length-1-Math.abs(t||0))>=0?this.conditionStack[t]:"INITIAL"}),"topState"),pushState:(0,h.K2)((function(t){this.begin(t)}),"pushState"),stateStackSize:(0,h.K2)((function(){return this.conditionStack.length}),"stateStackSize"),options:{"case-insensitive":!0},performAction:(0,h.K2)((function(t,i,e,s){switch(e){case 0:case 1:case 5:case 43:break;case 2:case 3:return this.popState(),34;case 4:return 34;case 6:return 10;case 7:return this.pushState("acc_title"),19;case 8:return this.popState(),"acc_title_value";case 9:return this.pushState("acc_descr"),21;case 10:return this.popState(),"acc_descr_value";case 11:this.pushState("acc_descr_multiline");break;case 12:case 25:case 27:this.popState();break;case 13:return"acc_descr_multiline_value";case 14:return 5;case 15:return 8;case 16:return this.pushState("axis_data"),"X_AXIS";case 17:return this.pushState("axis_data"),"Y_AXIS";case 18:return this.pushState("axis_band_data"),24;case 19:return 31;case 20:return this.pushState("data"),16;case 21:return this.pushState("data"),18;case 22:return this.pushState("data_inner"),24;case 23:return 27;case 24:return this.popState(),26;case 26:this.pushState("string");break;case 28:return"STR";case 29:return 24;case 30:return 26;case 31:return 43;case 32:return"COLON";case 33:return 44;case 34:return 28;case 35:return 45;case 36:return 46;case 37:return 48;case 38:return 50;case 39:return 47;case 40:return 41;case 41:return 49;case 42:return 42;case 44:return 35;case 45:return 36}}),"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,/^(?:(?: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,20,21,23,24,25,26,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],inclusive:!0},data:{rules:[0,1,3,4,5,6,7,9,11,14,15,16,17,20,21,22,25,26,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],inclusive:!0},axis_band_data:{rules:[0,1,4,5,6,7,9,11,14,15,16,17,20,21,24,25,26,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],inclusive:!0},axis_data:{rules:[0,1,2,4,5,6,7,9,11,14,15,16,17,18,19,20,21,23,25,26,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],inclusive:!0},acc_descr_multiline:{rules:[12,13],inclusive:!1},acc_descr:{rules:[10],inclusive:!1},acc_title:{rules:[8],inclusive:!1},title:{rules:[],inclusive:!1},md_string:{rules:[],inclusive:!1},string:{rules:[27,28],inclusive:!1},INITIAL:{rules:[0,1,4,5,6,7,9,11,14,15,16,17,20,21,25,26,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],inclusive:!0}}}}();function E(){this.yy={}}return L.lexer=P,(0,h.K2)(E,"Parser"),E.prototype=L,L.Parser=E,new E}();r.parser=r;var l=r;function c(t){return"bar"===t.type}function g(t){return"band"===t.type}function u(t){return"linear"===t.type}(0,h.K2)(c,"isBarPlot"),(0,h.K2)(g,"isBandAxisData"),(0,h.K2)(u,"isLinearAxisData");var x=class{constructor(t){this.parentGroup=t}static#t=(()=>(0,h.K2)(this,"TextDimensionCalculatorWithFont"))();getMaxDimension(t,i){if(!this.parentGroup)return{width:t.reduce(((t,i)=>Math.max(i.length,t)),0)*i,height:i};const e={width:0,height:0},n=this.parentGroup.append("g").attr("visibility","hidden").attr("font-size",i);for(const a of t){const t=(0,s.W6)(n,1,a),h=t?t.width:a.length*i,o=t?t.height:i;e.width=Math.max(e.width,h),e.height=Math.max(e.height,o)}return n.remove(),e}},d=class{constructor(t,i,e,s){this.axisConfig=t,this.title=i,this.textDimensionCalculator=e,this.axisThemeConfig=s,this.boundingRect={x:0,y:0,width:0,height:0},this.axisPosition="left",this.showTitle=!1,this.showLabel=!1,this.showTick=!1,this.showAxisLine=!1,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#t=(()=>(0,h.K2)(this,"BaseAxis"))();setRange(t){this.range=t,"left"===this.axisPosition||"right"===this.axisPosition?this.boundingRect.height=t[1]-t[0]:this.boundingRect.width=t[1]-t[0],this.recalculateScale()}getRange(){return[this.range[0]+this.outerPadding,this.range[1]-this.outerPadding]}setAxisPosition(t){this.axisPosition=t,this.setRange(this.range)}getTickDistance(){const t=this.getRange();return Math.abs(t[0]-t[1])/this.getTickValues().length}getAxisOuterPadding(){return this.outerPadding}getLabelDimension(){return this.textDimensionCalculator.getMaxDimension(this.getTickValues().map((t=>t.toString())),this.axisConfig.labelFontSize)}recalculateOuterPaddingToDrawBar(){.7*this.getTickDistance()>2*this.outerPadding&&(this.outerPadding=Math.floor(.7*this.getTickDistance()/2)),this.recalculateScale()}calculateSpaceIfDrawnHorizontally(t){let i=t.height;if(this.axisConfig.showAxisLine&&i>this.axisConfig.axisLineWidth&&(i-=this.axisConfig.axisLineWidth,this.showAxisLine=!0),this.axisConfig.showLabel){const e=this.getLabelDimension(),s=.2*t.width;this.outerPadding=Math.min(e.width/2,s);const n=e.height+2*this.axisConfig.labelPadding;this.labelTextHeight=e.height,n<=i&&(i-=n,this.showLabel=!0)}if(this.axisConfig.showTick&&i>=this.axisConfig.tickLength&&(this.showTick=!0,i-=this.axisConfig.tickLength),this.axisConfig.showTitle&&this.title){const t=this.textDimensionCalculator.getMaxDimension([this.title],this.axisConfig.titleFontSize),e=t.height+2*this.axisConfig.titlePadding;this.titleTextHeight=t.height,e<=i&&(i-=e,this.showTitle=!0)}this.boundingRect.width=t.width,this.boundingRect.height=t.height-i}calculateSpaceIfDrawnVertical(t){let i=t.width;if(this.axisConfig.showAxisLine&&i>this.axisConfig.axisLineWidth&&(i-=this.axisConfig.axisLineWidth,this.showAxisLine=!0),this.axisConfig.showLabel){const e=this.getLabelDimension(),s=.2*t.height;this.outerPadding=Math.min(e.height/2,s);const n=e.width+2*this.axisConfig.labelPadding;n<=i&&(i-=n,this.showLabel=!0)}if(this.axisConfig.showTick&&i>=this.axisConfig.tickLength&&(this.showTick=!0,i-=this.axisConfig.tickLength),this.axisConfig.showTitle&&this.title){const t=this.textDimensionCalculator.getMaxDimension([this.title],this.axisConfig.titleFontSize),e=t.height+2*this.axisConfig.titlePadding;this.titleTextHeight=t.height,e<=i&&(i-=e,this.showTitle=!0)}this.boundingRect.width=t.width-i,this.boundingRect.height=t.height}calculateSpace(t){return"left"===this.axisPosition||"right"===this.axisPosition?this.calculateSpaceIfDrawnVertical(t):this.calculateSpaceIfDrawnHorizontally(t),this.recalculateScale(),{width:this.boundingRect.width,height:this.boundingRect.height}}setBoundingBoxXY(t){this.boundingRect.x=t.x,this.boundingRect.y=t.y}getDrawableElementsForLeftAxis(){const t=[];if(this.showAxisLine){const i=this.boundingRect.x+this.boundingRect.width-this.axisConfig.axisLineWidth/2;t.push({type:"path",groupTexts:["left-axis","axisl-line"],data:[{path:`M ${i},${this.boundingRect.y} L ${i},${this.boundingRect.y+this.boundingRect.height} `,strokeFill:this.axisThemeConfig.axisLineColor,strokeWidth:this.axisConfig.axisLineWidth}]})}if(this.showLabel&&t.push({type:"text",groupTexts:["left-axis","label"],data:this.getTickValues().map((t=>({text:t.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(t),fill:this.axisThemeConfig.labelColor,fontSize:this.axisConfig.labelFontSize,rotation:0,verticalPos:"middle",horizontalPos:"right"})))}),this.showTick){const i=this.boundingRect.x+this.boundingRect.width-(this.showAxisLine?this.axisConfig.axisLineWidth:0);t.push({type:"path",groupTexts:["left-axis","ticks"],data:this.getTickValues().map((t=>({path:`M ${i},${this.getScaleValue(t)} L ${i-this.axisConfig.tickLength},${this.getScaleValue(t)}`,strokeFill:this.axisThemeConfig.tickColor,strokeWidth:this.axisConfig.tickWidth})))})}return this.showTitle&&t.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"}]}),t}getDrawableElementsForBottomAxis(){const t=[];if(this.showAxisLine){const i=this.boundingRect.y+this.axisConfig.axisLineWidth/2;t.push({type:"path",groupTexts:["bottom-axis","axis-line"],data:[{path:`M ${this.boundingRect.x},${i} L ${this.boundingRect.x+this.boundingRect.width},${i}`,strokeFill:this.axisThemeConfig.axisLineColor,strokeWidth:this.axisConfig.axisLineWidth}]})}if(this.showLabel&&t.push({type:"text",groupTexts:["bottom-axis","label"],data:this.getTickValues().map((t=>({text:t.toString(),x:this.getScaleValue(t),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"})))}),this.showTick){const i=this.boundingRect.y+(this.showAxisLine?this.axisConfig.axisLineWidth:0);t.push({type:"path",groupTexts:["bottom-axis","ticks"],data:this.getTickValues().map((t=>({path:`M ${this.getScaleValue(t)},${i} L ${this.getScaleValue(t)},${i+this.axisConfig.tickLength}`,strokeFill:this.axisThemeConfig.tickColor,strokeWidth:this.axisConfig.tickWidth})))})}return this.showTitle&&t.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"}]}),t}getDrawableElementsForTopAxis(){const t=[];if(this.showAxisLine){const i=this.boundingRect.y+this.boundingRect.height-this.axisConfig.axisLineWidth/2;t.push({type:"path",groupTexts:["top-axis","axis-line"],data:[{path:`M ${this.boundingRect.x},${i} L ${this.boundingRect.x+this.boundingRect.width},${i}`,strokeFill:this.axisThemeConfig.axisLineColor,strokeWidth:this.axisConfig.axisLineWidth}]})}if(this.showLabel&&t.push({type:"text",groupTexts:["top-axis","label"],data:this.getTickValues().map((t=>({text:t.toString(),x:this.getScaleValue(t),y:this.boundingRect.y+(this.showTitle?this.titleTextHeight+2*this.axisConfig.titlePadding:0)+this.axisConfig.labelPadding,fill:this.axisThemeConfig.labelColor,fontSize:this.axisConfig.labelFontSize,rotation:0,verticalPos:"top",horizontalPos:"center"})))}),this.showTick){const i=this.boundingRect.y;t.push({type:"path",groupTexts:["top-axis","ticks"],data:this.getTickValues().map((t=>({path:`M ${this.getScaleValue(t)},${i+this.boundingRect.height-(this.showAxisLine?this.axisConfig.axisLineWidth:0)} L ${this.getScaleValue(t)},${i+this.boundingRect.height-this.axisConfig.tickLength-(this.showAxisLine?this.axisConfig.axisLineWidth:0)}`,strokeFill:this.axisThemeConfig.tickColor,strokeWidth:this.axisConfig.tickWidth})))})}return this.showTitle&&t.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"}]}),t}getDrawableElements(){if("left"===this.axisPosition)return this.getDrawableElementsForLeftAxis();if("right"===this.axisPosition)throw Error("Drawing of right axis is not implemented");return"bottom"===this.axisPosition?this.getDrawableElementsForBottomAxis():"top"===this.axisPosition?this.getDrawableElementsForTopAxis():[]}},p=class extends d{static#t=(()=>(0,h.K2)(this,"BandAxis"))();constructor(t,i,e,s,n){super(t,s,n,i),this.categories=e,this.scale=(0,o.WH)().domain(this.categories).range(this.getRange())}setRange(t){super.setRange(t)}recalculateScale(){this.scale=(0,o.WH)().domain(this.categories).range(this.getRange()).paddingInner(1).paddingOuter(0).align(.5),h.Rm.trace("BandAxis axis final categories, range: ",this.categories,this.getRange())}getTickValues(){return this.categories}getScaleValue(t){return this.scale(t)??this.getRange()[0]}},f=class extends d{static#t=(()=>(0,h.K2)(this,"LinearAxis"))();constructor(t,i,e,s,n){super(t,s,n,i),this.domain=e,this.scale=(0,o.m4Y)().domain(this.domain).range(this.getRange())}getTickValues(){return this.scale.ticks()}recalculateScale(){const t=[...this.domain];"left"===this.axisPosition&&t.reverse(),this.scale=(0,o.m4Y)().domain(t).range(this.getRange())}getScaleValue(t){return this.scale(t)}};function y(t,i,e,s){const n=new x(s);return g(t)?new p(i,e,t.categories,t.title,n):new f(i,e,[t.min,t.max],t.title,n)}(0,h.K2)(y,"getAxis");var m=class{constructor(t,i,e,s){this.textDimensionCalculator=t,this.chartConfig=i,this.chartData=e,this.chartThemeConfig=s,this.boundingRect={x:0,y:0,width:0,height:0},this.showChartTitle=!1}static#t=(()=>(0,h.K2)(this,"ChartTitle"))();setBoundingBoxXY(t){this.boundingRect.x=t.x,this.boundingRect.y=t.y}calculateSpace(t){const i=this.textDimensionCalculator.getMaxDimension([this.chartData.title],this.chartConfig.titleFontSize),e=Math.max(i.width,t.width),s=i.height+2*this.chartConfig.titlePadding;return i.width<=e&&i.height<=s&&this.chartConfig.showTitle&&this.chartData.title&&(this.boundingRect.width=e,this.boundingRect.height=s,this.showChartTitle=!0),{width:this.boundingRect.width,height:this.boundingRect.height}}getDrawableElements(){const t=[];return this.showChartTitle&&t.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}]}),t}};function b(t,i,e,s){const n=new x(s);return new m(n,t,i,e)}(0,h.K2)(b,"getChartTitleComponent");var A=class{constructor(t,i,e,s,n){this.plotData=t,this.xAxis=i,this.yAxis=e,this.orientation=s,this.plotIndex=n}static#t=(()=>(0,h.K2)(this,"LinePlot"))();getDrawableElement(){const t=this.plotData.data.map((t=>[this.xAxis.getScaleValue(t[0]),this.yAxis.getScaleValue(t[1])]));let i;return i="horizontal"===this.orientation?(0,o.n8j)().y((t=>t[0])).x((t=>t[1]))(t):(0,o.n8j)().x((t=>t[0])).y((t=>t[1]))(t),i?[{groupTexts:["plot",`line-plot-${this.plotIndex}`],type:"path",data:[{path:i,strokeFill:this.plotData.strokeFill,strokeWidth:this.plotData.strokeWidth}]}]:[]}},S=class{constructor(t,i,e,s,n,a){this.barData=t,this.boundingRect=i,this.xAxis=e,this.yAxis=s,this.orientation=n,this.plotIndex=a}static#t=(()=>(0,h.K2)(this,"BarPlot"))();getDrawableElement(){const t=this.barData.data.map((t=>[this.xAxis.getScaleValue(t[0]),this.yAxis.getScaleValue(t[1])])),i=.95*Math.min(2*this.xAxis.getAxisOuterPadding(),this.xAxis.getTickDistance()),e=i/2;return"horizontal"===this.orientation?[{groupTexts:["plot",`bar-plot-${this.plotIndex}`],type:"rect",data:t.map((t=>({x:this.boundingRect.x,y:t[0]-e,height:i,width:t[1]-this.boundingRect.x,fill:this.barData.fill,strokeWidth:0,strokeFill:this.barData.fill})))}]:[{groupTexts:["plot",`bar-plot-${this.plotIndex}`],type:"rect",data:t.map((t=>({x:t[0]-e,y:t[1],width:i,height:this.boundingRect.y+this.boundingRect.height-t[1],fill:this.barData.fill,strokeWidth:0,strokeFill:this.barData.fill})))}]}},C=class{constructor(t,i,e){this.chartConfig=t,this.chartData=i,this.chartThemeConfig=e,this.boundingRect={x:0,y:0,width:0,height:0}}static#t=(()=>(0,h.K2)(this,"BasePlot"))();setAxes(t,i){this.xAxis=t,this.yAxis=i}setBoundingBoxXY(t){this.boundingRect.x=t.x,this.boundingRect.y=t.y}calculateSpace(t){return this.boundingRect.width=t.width,this.boundingRect.height=t.height,{width:this.boundingRect.width,height:this.boundingRect.height}}getDrawableElements(){if(!this.xAxis||!this.yAxis)throw Error("Axes must be passed to render Plots");const t=[];for(const[i,e]of this.chartData.plots.entries())switch(e.type){case"line":{const s=new A(e,this.xAxis,this.yAxis,this.chartConfig.chartOrientation,i);t.push(...s.getDrawableElement())}break;case"bar":{const s=new S(e,this.boundingRect,this.xAxis,this.yAxis,this.chartConfig.chartOrientation,i);t.push(...s.getDrawableElement())}}return t}};function w(t,i,e){return new C(t,i,e)}(0,h.K2)(w,"getPlotComponent");var _,k=class{constructor(t,i,e,s){this.chartConfig=t,this.chartData=i,this.componentStore={title:b(t,i,e,s),plot:w(t,i,e),xAxis:y(i.xAxis,t.xAxis,{titleColor:e.xAxisTitleColor,labelColor:e.xAxisLabelColor,tickColor:e.xAxisTickColor,axisLineColor:e.xAxisLineColor},s),yAxis:y(i.yAxis,t.yAxis,{titleColor:e.yAxisTitleColor,labelColor:e.yAxisLabelColor,tickColor:e.yAxisTickColor,axisLineColor:e.yAxisLineColor},s)}}static#t=(()=>(0,h.K2)(this,"Orchestrator"))();calculateVerticalSpace(){let t=this.chartConfig.width,i=this.chartConfig.height,e=0,s=0,n=Math.floor(t*this.chartConfig.plotReservedSpacePercent/100),a=Math.floor(i*this.chartConfig.plotReservedSpacePercent/100),h=this.componentStore.plot.calculateSpace({width:n,height:a});t-=h.width,i-=h.height,h=this.componentStore.title.calculateSpace({width:this.chartConfig.width,height:i}),s=h.height,i-=h.height,this.componentStore.xAxis.setAxisPosition("bottom"),h=this.componentStore.xAxis.calculateSpace({width:t,height:i}),i-=h.height,this.componentStore.yAxis.setAxisPosition("left"),h=this.componentStore.yAxis.calculateSpace({width:t,height:i}),e=h.width,t-=h.width,t>0&&(n+=t,t=0),i>0&&(a+=i,i=0),this.componentStore.plot.calculateSpace({width:n,height:a}),this.componentStore.plot.setBoundingBoxXY({x:e,y:s}),this.componentStore.xAxis.setRange([e,e+n]),this.componentStore.xAxis.setBoundingBoxXY({x:e,y:s+a}),this.componentStore.yAxis.setRange([s,s+a]),this.componentStore.yAxis.setBoundingBoxXY({x:0,y:s}),this.chartData.plots.some((t=>c(t)))&&this.componentStore.xAxis.recalculateOuterPaddingToDrawBar()}calculateHorizontalSpace(){let t=this.chartConfig.width,i=this.chartConfig.height,e=0,s=0,n=0,a=Math.floor(t*this.chartConfig.plotReservedSpacePercent/100),h=Math.floor(i*this.chartConfig.plotReservedSpacePercent/100),o=this.componentStore.plot.calculateSpace({width:a,height:h});t-=o.width,i-=o.height,o=this.componentStore.title.calculateSpace({width:this.chartConfig.width,height:i}),e=o.height,i-=o.height,this.componentStore.xAxis.setAxisPosition("left"),o=this.componentStore.xAxis.calculateSpace({width:t,height:i}),t-=o.width,s=o.width,this.componentStore.yAxis.setAxisPosition("top"),o=this.componentStore.yAxis.calculateSpace({width:t,height:i}),i-=o.height,n=e+o.height,t>0&&(a+=t,t=0),i>0&&(h+=i,i=0),this.componentStore.plot.calculateSpace({width:a,height:h}),this.componentStore.plot.setBoundingBoxXY({x:s,y:n}),this.componentStore.yAxis.setRange([s,s+a]),this.componentStore.yAxis.setBoundingBoxXY({x:s,y:e}),this.componentStore.xAxis.setRange([n,n+h]),this.componentStore.xAxis.setBoundingBoxXY({x:0,y:n}),this.chartData.plots.some((t=>c(t)))&&this.componentStore.xAxis.recalculateOuterPaddingToDrawBar()}calculateSpace(){"horizontal"===this.chartConfig.chartOrientation?this.calculateHorizontalSpace():this.calculateVerticalSpace()}getDrawableElement(){this.calculateSpace();const t=[];this.componentStore.plot.setAxes(this.componentStore.xAxis,this.componentStore.yAxis);for(const i of Object.values(this.componentStore))t.push(...i.getDrawableElements());return t}},T=class{static#t=(()=>(0,h.K2)(this,"XYChartBuilder"))();static build(t,i,e,s){return new k(t,i,e,s).getDrawableElement()}},R=0,D=$(),L=I(),P=M(),E=L.plotColorPalette.split(",").map((t=>t.trim())),v=!1,K=!1;function I(){const t=(0,h.P$)(),i=(0,h.zj)();return(0,n.$t)(t.xyChart,i.themeVariables.xyChart)}function $(){const t=(0,h.zj)();return(0,n.$t)(h.UI.xyChart,t.xyChart)}function M(){return{yAxis:{type:"linear",title:"",min:1/0,max:-1/0},xAxis:{type:"band",title:"",categories:[]},title:"",plots:[]}}function B(t){const i=(0,h.zj)();return(0,h.jZ)(t.trim(),i)}function z(t){_=t}function W(t){D.chartOrientation="horizontal"===t?"horizontal":"vertical"}function O(t){P.xAxis.title=B(t.text)}function F(t,i){P.xAxis={type:"linear",title:P.xAxis.title,min:t,max:i},v=!0}function N(t){P.xAxis={type:"band",title:P.xAxis.title,categories:t.map((t=>B(t.text)))},v=!0}function V(t){P.yAxis.title=B(t.text)}function X(t,i){P.yAxis={type:"linear",title:P.yAxis.title,min:t,max:i},K=!0}function Y(t){const i=Math.min(...t),e=Math.max(...t),s=u(P.yAxis)?P.yAxis.min:1/0,n=u(P.yAxis)?P.yAxis.max:-1/0;P.yAxis={type:"linear",title:P.yAxis.title,min:Math.min(s,i),max:Math.max(n,e)}}function U(t){let i=[];if(0===t.length)return i;if(!v){const i=u(P.xAxis)?P.xAxis.min:1/0,e=u(P.xAxis)?P.xAxis.max:-1/0;F(Math.min(i,1),Math.max(e,t.length))}if(K||Y(t),g(P.xAxis)&&(i=P.xAxis.categories.map(((i,e)=>[i,t[e]]))),u(P.xAxis)){const e=P.xAxis.min,s=P.xAxis.max,n=(s-e)/(t.length-1),a=[];for(let t=e;t<=s;t+=n)a.push(`${t}`);i=a.map(((i,e)=>[i,t[e]]))}return i}function H(t){return E[0===t?0:t%E.length]}function j(t,i){const e=U(i);P.plots.push({type:"line",strokeFill:H(R),strokeWidth:2,data:e}),R++}function G(t,i){const e=U(i);P.plots.push({type:"bar",fill:H(R),data:e}),R++}function Q(){if(0===P.plots.length)throw Error("No Plot to render, please provide a plot with some data");return P.title=(0,h.ab)(),T.build(D,P,L,_)}function Z(){return L}function q(){return D}(0,h.K2)(I,"getChartDefaultThemeConfig"),(0,h.K2)($,"getChartDefaultConfig"),(0,h.K2)(M,"getChartDefaultData"),(0,h.K2)(B,"textSanitizer"),(0,h.K2)(z,"setTmpSVGG"),(0,h.K2)(W,"setOrientation"),(0,h.K2)(O,"setXAxisTitle"),(0,h.K2)(F,"setXAxisRangeData"),(0,h.K2)(N,"setXAxisBand"),(0,h.K2)(V,"setYAxisTitle"),(0,h.K2)(X,"setYAxisRangeData"),(0,h.K2)(Y,"setYAxisRangeFromPlotData"),(0,h.K2)(U,"transformDataWithoutCategory"),(0,h.K2)(H,"getPlotColorFromPalette"),(0,h.K2)(j,"setLineData"),(0,h.K2)(G,"setBarData"),(0,h.K2)(Q,"getDrawableElem"),(0,h.K2)(Z,"getChartThemeConfig"),(0,h.K2)(q,"getChartConfig");var J={parser:l,db:{getDrawableElem:Q,clear:(0,h.K2)((function(){(0,h.IU)(),R=0,D=$(),P={yAxis:{type:"linear",title:"",min:1/0,max:-1/0},xAxis:{type:"band",title:"",categories:[]},title:"",plots:[]},L=I(),E=L.plotColorPalette.split(",").map((t=>t.trim())),v=!1,K=!1}),"clear"),setAccTitle:h.SV,getAccTitle:h.iN,setDiagramTitle:h.ke,getDiagramTitle:h.ab,getAccDescription:h.m7,setAccDescription:h.EI,setOrientation:W,setXAxisTitle:O,setXAxisRangeData:F,setXAxisBand:N,setYAxisTitle:V,setYAxisRangeData:X,setLineData:j,setBarData:G,setTmpSVGG:z,getChartThemeConfig:Z,getChartConfig:q},renderer:{draw:(0,h.K2)(((t,i,e,s)=>{const n=s.db,o=n.getChartThemeConfig(),r=n.getChartConfig();function l(t){return"top"===t?"text-before-edge":"middle"}function c(t){return"left"===t?"start":"right"===t?"end":"middle"}function g(t){return`translate(${t.x}, ${t.y}) rotate(${t.rotation||0})`}(0,h.K2)(l,"getDominantBaseLine"),(0,h.K2)(c,"getTextAnchor"),(0,h.K2)(g,"getTextTransformation"),h.Rm.debug("Rendering xychart chart\n"+t);const u=(0,a.D)(i),x=u.append("g").attr("class","main"),d=x.append("rect").attr("width",r.width).attr("height",r.height).attr("class","background");(0,h.a$)(u,r.height,r.width,!0),u.attr("viewBox",`0 0 ${r.width} ${r.height}`),d.attr("fill",o.backgroundColor),n.setTmpSVGG(u.append("g").attr("class","mermaid-tmp-group"));const p=n.getDrawableElem(),f={};function y(t){let i=x,e="";for(const[s]of t.entries()){let n=x;s>0&&f[e]&&(n=f[e]),e+=t[s],i=f[e],i||(i=f[e]=n.append("g").attr("class",t[s]))}return i}(0,h.K2)(y,"getGroup");for(const a of p){if(0===a.data.length)continue;const t=y(a.groupTexts);switch(a.type){case"rect":t.selectAll("rect").data(a.data).enter().append("rect").attr("x",(t=>t.x)).attr("y",(t=>t.y)).attr("width",(t=>t.width)).attr("height",(t=>t.height)).attr("fill",(t=>t.fill)).attr("stroke",(t=>t.strokeFill)).attr("stroke-width",(t=>t.strokeWidth));break;case"text":t.selectAll("text").data(a.data).enter().append("text").attr("x",0).attr("y",0).attr("fill",(t=>t.fill)).attr("font-size",(t=>t.fontSize)).attr("dominant-baseline",(t=>l(t.verticalPos))).attr("text-anchor",(t=>c(t.horizontalPos))).attr("transform",(t=>g(t))).text((t=>t.text));break;case"path":t.selectAll("path").data(a.data).enter().append("path").attr("d",(t=>t.path)).attr("fill",(t=>t.fill?t.fill:"none")).attr("stroke",(t=>t.strokeFill)).attr("stroke-width",(t=>t.strokeWidth))}}}),"draw")}}}}]); -//# sourceMappingURL=621.a72de2cb.chunk.js.map \ No newline at end of file diff --git a/frontend/deployed/static/js/621.a72de2cb.chunk.js.map b/frontend/deployed/static/js/621.a72de2cb.chunk.js.map deleted file mode 100644 index 8ccdccd..0000000 --- a/frontend/deployed/static/js/621.a72de2cb.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"static/js/621.a72de2cb.chunk.js","mappings":"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","sources":["../node_modules/mermaid/dist/chunks/mermaid.core/xychartDiagram-VJFVF3MP.mjs"],"sourcesContent":["import {\n computeDimensionOfText\n} from \"./chunk-C3MQ5ANM.mjs\";\nimport {\n cleanAndMerge\n} from \"./chunk-O4NI6UNU.mjs\";\nimport {\n selectSvgElement\n} from \"./chunk-7B677QYD.mjs\";\nimport {\n __name,\n clear,\n configureSvgSize,\n defaultConfig_default,\n getAccDescription,\n getAccTitle,\n getConfig,\n getDiagramTitle,\n getThemeVariables,\n log,\n sanitizeText,\n setAccDescription,\n setAccTitle,\n setDiagramTitle\n} from \"./chunk-YTJNT7DU.mjs\";\n\n// src/diagrams/xychart/parser/xychart.jison\nvar parser = function() {\n var o = /* @__PURE__ */ __name(function(k, v, o2, l) {\n for (o2 = o2 || {}, l = k.length; l--; o2[k[l]] = v) ;\n return o2;\n }, \"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];\n var parser2 = {\n trace: /* @__PURE__ */ __name(function trace() {\n }, \"trace\"),\n yy: {},\n 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 },\n 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\" },\n 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]],\n performAction: /* @__PURE__ */ __name(function anonymous(yytext, yyleng, yylineno, yy, yystate, $$, _$) {\n var $0 = $$.length - 1;\n switch (yystate) {\n case 5:\n yy.setOrientation($$[$0]);\n break;\n case 9:\n yy.setDiagramTitle($$[$0].text.trim());\n break;\n case 12:\n yy.setLineData({ text: \"\", type: \"text\" }, $$[$0]);\n break;\n case 13:\n yy.setLineData($$[$0 - 1], $$[$0]);\n break;\n case 14:\n yy.setBarData({ text: \"\", type: \"text\" }, $$[$0]);\n break;\n case 15:\n yy.setBarData($$[$0 - 1], $$[$0]);\n break;\n case 16:\n this.$ = $$[$0].trim();\n yy.setAccTitle(this.$);\n break;\n case 17:\n case 18:\n this.$ = $$[$0].trim();\n yy.setAccDescription(this.$);\n break;\n case 19:\n this.$ = $$[$0 - 1];\n break;\n case 20:\n this.$ = [Number($$[$0 - 2]), ...$$[$0]];\n break;\n case 21:\n this.$ = [Number($$[$0])];\n break;\n case 22:\n yy.setXAxisTitle($$[$0]);\n break;\n case 23:\n yy.setXAxisTitle($$[$0 - 1]);\n break;\n case 24:\n yy.setXAxisTitle({ type: \"text\", text: \"\" });\n break;\n case 25:\n yy.setXAxisBand($$[$0]);\n break;\n case 26:\n yy.setXAxisRangeData(Number($$[$0 - 2]), Number($$[$0]));\n break;\n case 27:\n this.$ = $$[$0 - 1];\n break;\n case 28:\n this.$ = [$$[$0 - 2], ...$$[$0]];\n break;\n case 29:\n this.$ = [$$[$0]];\n break;\n case 30:\n yy.setYAxisTitle($$[$0]);\n break;\n case 31:\n yy.setYAxisTitle($$[$0 - 1]);\n break;\n case 32:\n yy.setYAxisTitle({ type: \"text\", text: \"\" });\n break;\n case 33:\n yy.setYAxisRangeData(Number($$[$0 - 2]), Number($$[$0]));\n break;\n case 37:\n this.$ = { text: $$[$0], type: \"text\" };\n break;\n case 38:\n this.$ = { text: $$[$0], type: \"text\" };\n break;\n case 39:\n this.$ = { text: $$[$0], type: \"markdown\" };\n break;\n case 40:\n this.$ = $$[$0];\n break;\n case 41:\n this.$ = $$[$0 - 1] + \"\" + $$[$0];\n break;\n }\n }, \"anonymous\"),\n 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] }],\n defaultActions: { 8: [2, 1], 10: [2, 3], 21: [2, 2], 72: [2, 28], 73: [2, 20] },\n parseError: /* @__PURE__ */ __name(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 }, \"parseError\"),\n parse: /* @__PURE__ */ __name(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 lexer2 = 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 lexer2.setInput(input, sharedState.yy);\n sharedState.yy.lexer = lexer2;\n sharedState.yy.parser = this;\n if (typeof lexer2.yylloc == \"undefined\") {\n lexer2.yylloc = {};\n }\n var yyloc = lexer2.yylloc;\n lstack.push(yyloc);\n var ranges = lexer2.options && lexer2.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 __name(popStack, \"popStack\");\n function lex() {\n var token;\n token = tstack.pop() || lexer2.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 __name(lex, \"lex\");\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 (lexer2.showPosition) {\n errStr = \"Parse error on line \" + (yylineno + 1) + \":\\n\" + lexer2.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: lexer2.match,\n token: this.terminals_[symbol] || symbol,\n line: lexer2.yylineno,\n loc: yyloc,\n 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(lexer2.yytext);\n lstack.push(lexer2.yylloc);\n stack.push(action[1]);\n symbol = null;\n if (!preErrorSymbol) {\n yyleng = lexer2.yyleng;\n yytext = lexer2.yytext;\n yylineno = lexer2.yylineno;\n yyloc = lexer2.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 }, \"parse\")\n };\n var lexer = /* @__PURE__ */ function() {\n var lexer2 = {\n EOF: 1,\n parseError: /* @__PURE__ */ __name(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 }, \"parseError\"),\n // resets the lexer, sets new input\n setInput: /* @__PURE__ */ __name(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 }, \"setInput\"),\n // consumes and returns one char from the input\n input: /* @__PURE__ */ __name(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 this._input = this._input.slice(1);\n return ch;\n }, \"input\"),\n // unshifts one char (or a string) into the input\n unput: /* @__PURE__ */ __name(function(ch) {\n var len = ch.length;\n var lines = ch.split(/(?:\\r\\n?|\\n)/g);\n this._input = ch + this._input;\n this.yytext = this.yytext.substr(0, this.yytext.length - 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 if (lines.length - 1) {\n this.yylineno -= lines.length - 1;\n }\n var r = this.yylloc.range;\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 ? (lines.length === oldLines.length ? this.yylloc.first_column : 0) + oldLines[oldLines.length - lines.length].length - lines[0].length : this.yylloc.first_column - len\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 }, \"unput\"),\n // When called from action, caches matched text and appends it on next action\n more: /* @__PURE__ */ __name(function() {\n this._more = true;\n return this;\n }, \"more\"),\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.\n reject: /* @__PURE__ */ __name(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 return this;\n }, \"reject\"),\n // retain first n characters of the match\n less: /* @__PURE__ */ __name(function(n) {\n this.unput(this.match.slice(n));\n }, \"less\"),\n // displays already matched input, i.e. for error messages\n pastInput: /* @__PURE__ */ __name(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 }, \"pastInput\"),\n // displays upcoming input, i.e. for error messages\n upcomingInput: /* @__PURE__ */ __name(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 }, \"upcomingInput\"),\n // displays the character position where the lexing error occurred, i.e. for error messages\n showPosition: /* @__PURE__ */ __name(function() {\n var pre = this.pastInput();\n var c = new Array(pre.length + 1).join(\"-\");\n return pre + this.upcomingInput() + \"\\n\" + c + \"^\";\n }, \"showPosition\"),\n // test the lexed token: return FALSE when not a match, otherwise return token\n test_match: /* @__PURE__ */ __name(function(match, indexed_rule) {\n var token, lines, backup;\n if (this.options.backtrack_lexer) {\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 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 ? lines[lines.length - 1].length - lines[lines.length - 1].match(/\\r?\\n?/)[0].length : 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 for (var k in backup) {\n this[k] = backup[k];\n }\n return false;\n }\n return false;\n }, \"test_match\"),\n // return next match in input\n next: /* @__PURE__ */ __name(function() {\n if (this.done) {\n return this.EOF;\n }\n if (!this._input) {\n this.done = true;\n }\n var token, match, tempMatch, 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;\n } else {\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 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 }, \"next\"),\n // return next match that has a token\n lex: /* @__PURE__ */ __name(function lex() {\n var r = this.next();\n if (r) {\n return r;\n } else {\n return this.lex();\n }\n }, \"lex\"),\n // activates a new lexer condition state (pushes the new lexer condition state onto the condition stack)\n begin: /* @__PURE__ */ __name(function begin(condition) {\n this.conditionStack.push(condition);\n }, \"begin\"),\n // pop the previously active lexer condition state off the condition stack\n popState: /* @__PURE__ */ __name(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 }, \"popState\"),\n // produce the lexer rule set which is active for the currently active lexer condition state\n _currentRules: /* @__PURE__ */ __name(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 }, \"_currentRules\"),\n // return the currently active lexer condition state; when an index argument is provided it produces the N-th previous condition state, if available\n topState: /* @__PURE__ */ __name(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 }, \"topState\"),\n // alias for begin(condition)\n pushState: /* @__PURE__ */ __name(function pushState(condition) {\n this.begin(condition);\n }, \"pushState\"),\n // return the number of states currently on the stack\n stateStackSize: /* @__PURE__ */ __name(function stateStackSize() {\n return this.conditionStack.length;\n }, \"stateStackSize\"),\n options: { \"case-insensitive\": true },\n performAction: /* @__PURE__ */ __name(function anonymous(yy, yy_, $avoiding_name_collisions, YY_START) {\n var YYSTATE = YY_START;\n switch ($avoiding_name_collisions) {\n case 0:\n break;\n case 1:\n break;\n case 2:\n this.popState();\n return 34;\n break;\n case 3:\n this.popState();\n return 34;\n break;\n case 4:\n return 34;\n break;\n case 5:\n break;\n case 6:\n return 10;\n break;\n case 7:\n this.pushState(\"acc_title\");\n return 19;\n break;\n case 8:\n this.popState();\n return \"acc_title_value\";\n break;\n case 9:\n this.pushState(\"acc_descr\");\n return 21;\n break;\n case 10:\n this.popState();\n return \"acc_descr_value\";\n break;\n case 11:\n this.pushState(\"acc_descr_multiline\");\n break;\n case 12:\n this.popState();\n break;\n case 13:\n return \"acc_descr_multiline_value\";\n break;\n case 14:\n return 5;\n break;\n case 15:\n return 8;\n break;\n case 16:\n this.pushState(\"axis_data\");\n return \"X_AXIS\";\n break;\n case 17:\n this.pushState(\"axis_data\");\n return \"Y_AXIS\";\n break;\n case 18:\n this.pushState(\"axis_band_data\");\n return 24;\n break;\n case 19:\n return 31;\n break;\n case 20:\n this.pushState(\"data\");\n return 16;\n break;\n case 21:\n this.pushState(\"data\");\n return 18;\n break;\n case 22:\n this.pushState(\"data_inner\");\n return 24;\n break;\n case 23:\n return 27;\n break;\n case 24:\n this.popState();\n return 26;\n break;\n case 25:\n this.popState();\n break;\n case 26:\n this.pushState(\"string\");\n break;\n case 27:\n this.popState();\n break;\n case 28:\n return \"STR\";\n break;\n case 29:\n return 24;\n break;\n case 30:\n return 26;\n break;\n case 31:\n return 43;\n break;\n case 32:\n return \"COLON\";\n break;\n case 33:\n return 44;\n break;\n case 34:\n return 28;\n break;\n case 35:\n return 45;\n break;\n case 36:\n return 46;\n break;\n case 37:\n return 48;\n break;\n case 38:\n return 50;\n break;\n case 39:\n return 47;\n break;\n case 40:\n return 41;\n break;\n case 41:\n return 49;\n break;\n case 42:\n return 42;\n break;\n case 43:\n break;\n case 44:\n return 35;\n break;\n case 45:\n return 36;\n break;\n }\n }, \"anonymous\"),\n 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, /^(?:(?: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],\n conditions: { \"data_inner\": { \"rules\": [0, 1, 4, 5, 6, 7, 9, 11, 14, 15, 16, 17, 20, 21, 23, 24, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45], \"inclusive\": true }, \"data\": { \"rules\": [0, 1, 3, 4, 5, 6, 7, 9, 11, 14, 15, 16, 17, 20, 21, 22, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45], \"inclusive\": true }, \"axis_band_data\": { \"rules\": [0, 1, 4, 5, 6, 7, 9, 11, 14, 15, 16, 17, 20, 21, 24, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45], \"inclusive\": true }, \"axis_data\": { \"rules\": [0, 1, 2, 4, 5, 6, 7, 9, 11, 14, 15, 16, 17, 18, 19, 20, 21, 23, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45], \"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\": [27, 28], \"inclusive\": false }, \"INITIAL\": { \"rules\": [0, 1, 4, 5, 6, 7, 9, 11, 14, 15, 16, 17, 20, 21, 25, 26, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45], \"inclusive\": true } }\n };\n return lexer2;\n }();\n parser2.lexer = lexer;\n function Parser() {\n this.yy = {};\n }\n __name(Parser, \"Parser\");\n Parser.prototype = parser2;\n parser2.Parser = Parser;\n return new Parser();\n}();\nparser.parser = parser;\nvar xychart_default = parser;\n\n// src/diagrams/xychart/chartBuilder/interfaces.ts\nfunction isBarPlot(data) {\n return data.type === \"bar\";\n}\n__name(isBarPlot, \"isBarPlot\");\nfunction isBandAxisData(data) {\n return data.type === \"band\";\n}\n__name(isBandAxisData, \"isBandAxisData\");\nfunction isLinearAxisData(data) {\n return data.type === \"linear\";\n}\n__name(isLinearAxisData, \"isLinearAxisData\");\n\n// src/diagrams/xychart/chartBuilder/textDimensionCalculator.ts\nvar TextDimensionCalculatorWithFont = class {\n constructor(parentGroup) {\n this.parentGroup = parentGroup;\n }\n static {\n __name(this, \"TextDimensionCalculatorWithFont\");\n }\n getMaxDimension(texts, fontSize) {\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 const dimension = {\n width: 0,\n height: 0\n };\n const elem = this.parentGroup.append(\"g\").attr(\"visibility\", \"hidden\").attr(\"font-size\", fontSize);\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\n// src/diagrams/xychart/chartBuilder/components/axis/bandAxis.ts\nimport { scaleBand } from \"d3\";\n\n// src/diagrams/xychart/chartBuilder/components/axis/baseAxis.ts\nvar BAR_WIDTH_TO_TICK_WIDTH_RATIO = 0.7;\nvar MAX_OUTER_PADDING_PERCENT_FOR_WRT_LABEL = 0.2;\nvar BaseAxis = class {\n constructor(axisConfig, title, textDimensionCalculator, axisThemeConfig) {\n this.axisConfig = axisConfig;\n this.title = title;\n this.textDimensionCalculator = textDimensionCalculator;\n this.axisThemeConfig = axisThemeConfig;\n this.boundingRect = { x: 0, y: 0, width: 0, height: 0 };\n this.axisPosition = \"left\";\n this.showTitle = false;\n this.showLabel = false;\n this.showTick = false;\n this.showAxisLine = false;\n this.outerPadding = 0;\n this.titleTextHeight = 0;\n this.labelTextHeight = 0;\n this.range = [0, 10];\n this.boundingRect = { x: 0, y: 0, width: 0, height: 0 };\n this.axisPosition = \"left\";\n }\n static {\n __name(this, \"BaseAxis\");\n }\n setRange(range) {\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 getRange() {\n return [this.range[0] + this.outerPadding, this.range[1] - this.outerPadding];\n }\n setAxisPosition(axisPosition) {\n this.axisPosition = axisPosition;\n this.setRange(this.range);\n }\n getTickDistance() {\n const range = this.getRange();\n return Math.abs(range[0] - range[1]) / this.getTickValues().length;\n }\n getAxisOuterPadding() {\n return this.outerPadding;\n }\n getLabelDimension() {\n return this.textDimensionCalculator.getMaxDimension(\n this.getTickValues().map((tick) => tick.toString()),\n this.axisConfig.labelFontSize\n );\n }\n recalculateOuterPaddingToDrawBar() {\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 calculateSpaceIfDrawnHorizontally(availableSpace) {\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 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 calculateSpaceIfDrawnVertical(availableSpace) {\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 calculateSpace(availableSpace) {\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 setBoundingBoxXY(point) {\n this.boundingRect.x = point.x;\n this.boundingRect.y = point.y;\n }\n getDrawableElementsForLeftAxis() {\n const drawableElement = [];\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},${this.boundingRect.y + this.boundingRect.height} `,\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: this.boundingRect.x + this.boundingRect.width - (this.showLabel ? this.axisConfig.labelPadding : 0) - (this.showTick ? this.axisConfig.tickLength : 0) - (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 = this.boundingRect.x + this.boundingRect.width - (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 ${x - this.axisConfig.tickLength},${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 getDrawableElementsForBottomAxis() {\n const drawableElement = [];\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 ${this.boundingRect.x + this.boundingRect.width},${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: this.boundingRect.y + this.axisConfig.labelPadding + (this.showTick ? this.axisConfig.tickLength : 0) + (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)},${y + this.axisConfig.tickLength}`,\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: this.boundingRect.y + this.boundingRect.height - this.axisConfig.titlePadding - 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 getDrawableElementsForTopAxis() {\n const drawableElement = [];\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 ${this.boundingRect.x + this.boundingRect.width},${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: this.boundingRect.y + (this.showTitle ? this.titleTextHeight + this.axisConfig.titlePadding * 2 : 0) + 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)},${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)}`,\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 getDrawableElements() {\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\n// src/diagrams/xychart/chartBuilder/components/axis/bandAxis.ts\nvar BandAxis = class extends BaseAxis {\n static {\n __name(this, \"BandAxis\");\n }\n constructor(axisConfig, axisThemeConfig, categories, title, textDimensionCalculator) {\n super(axisConfig, title, textDimensionCalculator, axisThemeConfig);\n this.categories = categories;\n this.scale = scaleBand().domain(this.categories).range(this.getRange());\n }\n setRange(range) {\n super.setRange(range);\n }\n recalculateScale() {\n this.scale = scaleBand().domain(this.categories).range(this.getRange()).paddingInner(1).paddingOuter(0).align(0.5);\n log.trace(\"BandAxis axis final categories, range: \", this.categories, this.getRange());\n }\n getTickValues() {\n return this.categories;\n }\n getScaleValue(value) {\n return this.scale(value) ?? this.getRange()[0];\n }\n};\n\n// src/diagrams/xychart/chartBuilder/components/axis/linearAxis.ts\nimport { scaleLinear } from \"d3\";\nvar LinearAxis = class extends BaseAxis {\n static {\n __name(this, \"LinearAxis\");\n }\n constructor(axisConfig, axisThemeConfig, domain, title, textDimensionCalculator) {\n super(axisConfig, title, textDimensionCalculator, axisThemeConfig);\n this.domain = domain;\n this.scale = scaleLinear().domain(this.domain).range(this.getRange());\n }\n getTickValues() {\n return this.scale.ticks();\n }\n recalculateScale() {\n const domain = [...this.domain];\n if (this.axisPosition === \"left\") {\n domain.reverse();\n }\n this.scale = scaleLinear().domain(domain).range(this.getRange());\n }\n getScaleValue(value) {\n return this.scale(value);\n }\n};\n\n// src/diagrams/xychart/chartBuilder/components/axis/index.ts\nfunction getAxis(data, axisConfig, axisThemeConfig, tmpSVGGroup2) {\n const textDimensionCalculator = new TextDimensionCalculatorWithFont(tmpSVGGroup2);\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__name(getAxis, \"getAxis\");\n\n// src/diagrams/xychart/chartBuilder/components/chartTitle.ts\nvar ChartTitle = class {\n constructor(textDimensionCalculator, chartConfig, chartData, chartThemeConfig) {\n this.textDimensionCalculator = textDimensionCalculator;\n this.chartConfig = chartConfig;\n this.chartData = chartData;\n this.chartThemeConfig = chartThemeConfig;\n this.boundingRect = {\n x: 0,\n y: 0,\n width: 0,\n height: 0\n };\n this.showChartTitle = false;\n }\n static {\n __name(this, \"ChartTitle\");\n }\n setBoundingBoxXY(point) {\n this.boundingRect.x = point.x;\n this.boundingRect.y = point.y;\n }\n calculateSpace(availableSpace) {\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 (titleDimension.width <= widthRequired && titleDimension.height <= heightRequired && this.chartConfig.showTitle && this.chartData.title) {\n this.boundingRect.width = widthRequired;\n this.boundingRect.height = heightRequired;\n this.showChartTitle = true;\n }\n return {\n width: this.boundingRect.width,\n height: this.boundingRect.height\n };\n }\n getDrawableElements() {\n const 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};\nfunction getChartTitleComponent(chartConfig, chartData, chartThemeConfig, tmpSVGGroup2) {\n const textDimensionCalculator = new TextDimensionCalculatorWithFont(tmpSVGGroup2);\n return new ChartTitle(textDimensionCalculator, chartConfig, chartData, chartThemeConfig);\n}\n__name(getChartTitleComponent, \"getChartTitleComponent\");\n\n// src/diagrams/xychart/chartBuilder/components/plot/linePlot.ts\nimport { line } from \"d3\";\nvar LinePlot = class {\n constructor(plotData, xAxis, yAxis, orientation, plotIndex2) {\n this.plotData = plotData;\n this.xAxis = xAxis;\n this.yAxis = yAxis;\n this.orientation = orientation;\n this.plotIndex = plotIndex2;\n }\n static {\n __name(this, \"LinePlot\");\n }\n getDrawableElement() {\n const finalData = this.plotData.data.map((d) => [\n this.xAxis.getScaleValue(d[0]),\n this.yAxis.getScaleValue(d[1])\n ]);\n let path;\n if (this.orientation === \"horizontal\") {\n path = line().y((d) => d[0]).x((d) => d[1])(finalData);\n } else {\n path = line().x((d) => d[0]).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\n// src/diagrams/xychart/chartBuilder/components/plot/barPlot.ts\nvar BarPlot = class {\n constructor(barData, boundingRect, xAxis, yAxis, orientation, plotIndex2) {\n this.barData = barData;\n this.boundingRect = boundingRect;\n this.xAxis = xAxis;\n this.yAxis = yAxis;\n this.orientation = orientation;\n this.plotIndex = plotIndex2;\n }\n static {\n __name(this, \"BarPlot\");\n }\n getDrawableElement() {\n const finalData = this.barData.data.map((d) => [\n this.xAxis.getScaleValue(d[0]),\n this.yAxis.getScaleValue(d[1])\n ]);\n const barPaddingPercent = 0.05;\n const barWidth = Math.min(this.xAxis.getAxisOuterPadding() * 2, this.xAxis.getTickDistance()) * (1 - barPaddingPercent);\n const barWidthHalf = barWidth / 2;\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\n// src/diagrams/xychart/chartBuilder/components/plot/index.ts\nvar BasePlot = class {\n constructor(chartConfig, chartData, chartThemeConfig) {\n this.chartConfig = chartConfig;\n this.chartData = chartData;\n this.chartThemeConfig = chartThemeConfig;\n this.boundingRect = {\n x: 0,\n y: 0,\n width: 0,\n height: 0\n };\n }\n static {\n __name(this, \"BasePlot\");\n }\n setAxes(xAxis, yAxis) {\n this.xAxis = xAxis;\n this.yAxis = yAxis;\n }\n setBoundingBoxXY(point) {\n this.boundingRect.x = point.x;\n this.boundingRect.y = point.y;\n }\n calculateSpace(availableSpace) {\n this.boundingRect.width = availableSpace.width;\n this.boundingRect.height = availableSpace.height;\n return {\n width: this.boundingRect.width,\n height: this.boundingRect.height\n };\n }\n getDrawableElements() {\n if (!(this.xAxis && this.yAxis)) {\n throw Error(\"Axes must be passed to render Plots\");\n }\n const 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};\nfunction getPlotComponent(chartConfig, chartData, chartThemeConfig) {\n return new BasePlot(chartConfig, chartData, chartThemeConfig);\n}\n__name(getPlotComponent, \"getPlotComponent\");\n\n// src/diagrams/xychart/chartBuilder/orchestrator.ts\nvar Orchestrator = class {\n constructor(chartConfig, chartData, chartThemeConfig, tmpSVGGroup2) {\n this.chartConfig = chartConfig;\n this.chartData = chartData;\n this.componentStore = {\n title: getChartTitleComponent(chartConfig, chartData, chartThemeConfig, tmpSVGGroup2),\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 tmpSVGGroup2\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 tmpSVGGroup2\n )\n };\n }\n static {\n __name(this, \"Orchestrator\");\n }\n 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 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 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 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 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 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 calculateSpace() {\n if (this.chartConfig.chartOrientation === \"horizontal\") {\n this.calculateHorizontalSpace();\n } else {\n this.calculateVerticalSpace();\n }\n }\n getDrawableElement() {\n this.calculateSpace();\n const 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\n// src/diagrams/xychart/chartBuilder/index.ts\nvar XYChartBuilder = class {\n static {\n __name(this, \"XYChartBuilder\");\n }\n static build(config, chartData, chartThemeConfig, tmpSVGGroup2) {\n const orchestrator = new Orchestrator(config, chartData, chartThemeConfig, tmpSVGGroup2);\n return orchestrator.getDrawableElement();\n }\n};\n\n// src/diagrams/xychart/xychartDb.ts\nvar plotIndex = 0;\nvar tmpSVGGroup;\nvar xyChartConfig = getChartDefaultConfig();\nvar xyChartThemeConfig = getChartDefaultThemeConfig();\nvar xyChartData = getChartDefaultData();\nvar plotColorPalette = xyChartThemeConfig.plotColorPalette.split(\",\").map((color) => color.trim());\nvar hasSetXAxis = false;\nvar hasSetYAxis = false;\nfunction getChartDefaultThemeConfig() {\n const defaultThemeVariables = getThemeVariables();\n const config = getConfig();\n return cleanAndMerge(defaultThemeVariables.xyChart, config.themeVariables.xyChart);\n}\n__name(getChartDefaultThemeConfig, \"getChartDefaultThemeConfig\");\nfunction getChartDefaultConfig() {\n const config = getConfig();\n return cleanAndMerge(\n defaultConfig_default.xyChart,\n config.xyChart\n );\n}\n__name(getChartDefaultConfig, \"getChartDefaultConfig\");\nfunction getChartDefaultData() {\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__name(getChartDefaultData, \"getChartDefaultData\");\nfunction textSanitizer(text) {\n const config = getConfig();\n return sanitizeText(text.trim(), config);\n}\n__name(textSanitizer, \"textSanitizer\");\nfunction setTmpSVGG(SVGG) {\n tmpSVGGroup = SVGG;\n}\n__name(setTmpSVGG, \"setTmpSVGG\");\nfunction setOrientation(orientation) {\n if (orientation === \"horizontal\") {\n xyChartConfig.chartOrientation = \"horizontal\";\n } else {\n xyChartConfig.chartOrientation = \"vertical\";\n }\n}\n__name(setOrientation, \"setOrientation\");\nfunction setXAxisTitle(title) {\n xyChartData.xAxis.title = textSanitizer(title.text);\n}\n__name(setXAxisTitle, \"setXAxisTitle\");\nfunction setXAxisRangeData(min, max) {\n xyChartData.xAxis = { type: \"linear\", title: xyChartData.xAxis.title, min, max };\n hasSetXAxis = true;\n}\n__name(setXAxisRangeData, \"setXAxisRangeData\");\nfunction setXAxisBand(categories) {\n xyChartData.xAxis = {\n type: \"band\",\n title: xyChartData.xAxis.title,\n categories: categories.map((c) => textSanitizer(c.text))\n };\n hasSetXAxis = true;\n}\n__name(setXAxisBand, \"setXAxisBand\");\nfunction setYAxisTitle(title) {\n xyChartData.yAxis.title = textSanitizer(title.text);\n}\n__name(setYAxisTitle, \"setYAxisTitle\");\nfunction setYAxisRangeData(min, max) {\n xyChartData.yAxis = { type: \"linear\", title: xyChartData.yAxis.title, min, max };\n hasSetYAxis = true;\n}\n__name(setYAxisRangeData, \"setYAxisRangeData\");\nfunction setYAxisRangeFromPlotData(data) {\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__name(setYAxisRangeFromPlotData, \"setYAxisRangeFromPlotData\");\nfunction transformDataWithoutCategory(data) {\n let retData = [];\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 if (isBandAxisData(xyChartData.xAxis)) {\n retData = xyChartData.xAxis.categories.map((c, i) => [c, data[i]]);\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 = [];\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 return retData;\n}\n__name(transformDataWithoutCategory, \"transformDataWithoutCategory\");\nfunction getPlotColorFromPalette(plotIndex2) {\n return plotColorPalette[plotIndex2 === 0 ? 0 : plotIndex2 % plotColorPalette.length];\n}\n__name(getPlotColorFromPalette, \"getPlotColorFromPalette\");\nfunction setLineData(title, data) {\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__name(setLineData, \"setLineData\");\nfunction setBarData(title, data) {\n const plotData = transformDataWithoutCategory(data);\n xyChartData.plots.push({\n type: \"bar\",\n fill: getPlotColorFromPalette(plotIndex),\n data: plotData\n });\n plotIndex++;\n}\n__name(setBarData, \"setBarData\");\nfunction getDrawableElem() {\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__name(getDrawableElem, \"getDrawableElem\");\nfunction getChartThemeConfig() {\n return xyChartThemeConfig;\n}\n__name(getChartThemeConfig, \"getChartThemeConfig\");\nfunction getChartConfig() {\n return xyChartConfig;\n}\n__name(getChartConfig, \"getChartConfig\");\nvar clear2 = /* @__PURE__ */ __name(function() {\n clear();\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}, \"clear\");\nvar xychartDb_default = {\n getDrawableElem,\n clear: clear2,\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};\n\n// src/diagrams/xychart/xychartRenderer.ts\nvar draw = /* @__PURE__ */ __name((txt, id, _version, diagObj) => {\n const db = diagObj.db;\n const themeConfig = db.getChartThemeConfig();\n const chartConfig = db.getChartConfig();\n function getDominantBaseLine(horizontalPos) {\n return horizontalPos === \"top\" ? \"text-before-edge\" : \"middle\";\n }\n __name(getDominantBaseLine, \"getDominantBaseLine\");\n function getTextAnchor(verticalPos) {\n return verticalPos === \"left\" ? \"start\" : verticalPos === \"right\" ? \"end\" : \"middle\";\n }\n __name(getTextAnchor, \"getTextAnchor\");\n function getTextTransformation(data) {\n return `translate(${data.x}, ${data.y}) rotate(${data.rotation || 0})`;\n }\n __name(getTextTransformation, \"getTextTransformation\");\n log.debug(\"Rendering xychart chart\\n\" + txt);\n const svg = selectSvgElement(id);\n const group = svg.append(\"g\").attr(\"class\", \"main\");\n const background = group.append(\"rect\").attr(\"width\", chartConfig.width).attr(\"height\", chartConfig.height).attr(\"class\", \"background\");\n configureSvgSize(svg, chartConfig.height, chartConfig.width, true);\n svg.attr(\"viewBox\", `0 0 ${chartConfig.width} ${chartConfig.height}`);\n background.attr(\"fill\", themeConfig.backgroundColor);\n db.setTmpSVGG(svg.append(\"g\").attr(\"class\", \"mermaid-tmp-group\"));\n const shapes = db.getDrawableElem();\n const groups = {};\n function getGroup(gList) {\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 __name(getGroup, \"getGroup\");\n for (const shape of shapes) {\n if (shape.data.length === 0) {\n continue;\n }\n const shapeGroup = getGroup(shape.groupTexts);\n switch (shape.type) {\n case \"rect\":\n 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);\n break;\n case \"text\":\n 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);\n break;\n case \"path\":\n 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);\n break;\n }\n }\n}, \"draw\");\nvar xychartRenderer_default = {\n draw\n};\n\n// src/diagrams/xychart/xychartDiagram.ts\nvar diagram = {\n parser: xychart_default,\n db: xychartDb_default,\n renderer: xychartRenderer_default\n};\nexport {\n diagram\n};\n"],"names":["parser","o","__name","k","v","o2","l","length","$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","parser2","trace","yy","symbols_","terminals_","productions_","performAction","yytext","yyleng","yylineno","yystate","$$","_$","$0","setOrientation","setDiagramTitle","text","trim","setLineData","type","setBarData","this","$","setAccTitle","setAccDescription","Number","setXAxisTitle","setXAxisBand","setXAxisRangeData","setYAxisTitle","setYAxisRangeData","table","defaultActions","parseError","str","hash","recoverable","error","Error","parse","input","self","stack","tstack","vstack","lstack","recovering","args","slice","call","arguments","lexer2","Object","create","lexer","sharedState","prototype","hasOwnProperty","setInput","yylloc","yyloc","push","ranges","options","lex","token","pop","Array","getPrototypeOf","n","symbol","preErrorSymbol","state","action","r","p","len","newState","expected","yyval","errStr","showPosition","join","match","line","loc","first_line","last_line","first_column","last_column","range","apply","concat","EOF","_input","_more","_backtrack","done","matched","conditionStack","offset","ch","unput","lines","split","substr","oldLines","more","reject","backtrack_lexer","less","pastInput","past","replace","upcomingInput","next","pre","c","test_match","indexed_rule","backup","matches","tempMatch","index","rules","_currentRules","i","flex","begin","condition","popState","conditions","topState","Math","abs","pushState","stateStackSize","yy_","$avoiding_name_collisions","YY_START","Parser","xychart_default","isBarPlot","data","isBandAxisData","isLinearAxisData","TextDimensionCalculatorWithFont","constructor","parentGroup","getMaxDimension","texts","fontSize","width","reduce","acc","cur","max","height","dimension","elem","append","attr","t","bbox","computeDimensionOfText","remove","BaseAxis","axisConfig","title","textDimensionCalculator","axisThemeConfig","boundingRect","x","y","axisPosition","showTitle","showLabel","showTick","showAxisLine","outerPadding","titleTextHeight","labelTextHeight","setRange","recalculateScale","getRange","setAxisPosition","getTickDistance","getTickValues","getAxisOuterPadding","getLabelDimension","map","tick","toString","labelFontSize","recalculateOuterPaddingToDrawBar","floor","calculateSpaceIfDrawnHorizontally","availableSpace","availableHeight","axisLineWidth","spaceRequired","maxPadding","min","heightRequired","labelPadding","tickLength","titleFontSize","titlePadding","calculateSpaceIfDrawnVertical","availableWidth","widthRequired","calculateSpace","setBoundingBoxXY","point","getDrawableElementsForLeftAxis","drawableElement","groupTexts","path","strokeFill","axisLineColor","strokeWidth","getScaleValue","fill","labelColor","rotation","verticalPos","horizontalPos","tickColor","tickWidth","titleColor","getDrawableElementsForBottomAxis","getDrawableElementsForTopAxis","getDrawableElements","BandAxis","categories","super","scale","scaleBand","domain","paddingInner","paddingOuter","align","log","value","LinearAxis","scaleLinear","ticks","reverse","getAxis","tmpSVGGroup2","ChartTitle","chartConfig","chartData","chartThemeConfig","showChartTitle","titleDimension","drawableElem","getChartTitleComponent","LinePlot","plotData","xAxis","yAxis","orientation","plotIndex2","plotIndex","getDrawableElement","finalData","d","BarPlot","barData","barWidth","barWidthHalf","BasePlot","setAxes","plot","plots","entries","linePlot","chartOrientation","barPlot","getPlotComponent","tmpSVGGroup","Orchestrator","componentStore","xAxisTitleColor","xAxisLabelColor","xAxisTickColor","xAxisLineColor","yAxisTitleColor","yAxisLabelColor","yAxisTickColor","yAxisLineColor","calculateVerticalSpace","plotX","plotY","chartWidth","plotReservedSpacePercent","chartHeight","spaceUsed","some","calculateHorizontalSpace","titleYEnd","component","values","XYChartBuilder","build","config","xyChartConfig","getChartDefaultConfig","xyChartThemeConfig","getChartDefaultThemeConfig","xyChartData","getChartDefaultData","plotColorPalette","color","hasSetXAxis","hasSetYAxis","defaultThemeVariables","getThemeVariables","getConfig","cleanAndMerge","xyChart","themeVariables","defaultConfig_default","Infinity","textSanitizer","sanitizeText","setTmpSVGG","SVGG","setYAxisRangeFromPlotData","minValue","maxValue","prevMinValue","prevMaxValue","transformDataWithoutCategory","retData","step","getPlotColorFromPalette","getDrawableElem","getDiagramTitle","getChartThemeConfig","getChartConfig","diagram","db","clear","getAccTitle","getAccDescription","renderer","draw","txt","id","_version","diagObj","themeConfig","getDominantBaseLine","getTextAnchor","getTextTransformation","debug","svg","selectSvgElement","group","background","configureSvgSize","backgroundColor","shapes","groups","getGroup","gList","prefix","parent","shape","shapeGroup","selectAll","enter"],"sourceRoot":""} \ No newline at end of file diff --git a/frontend/deployed/static/js/622.95b51007.chunk.js b/frontend/deployed/static/js/622.95b51007.chunk.js deleted file mode 100644 index 127d9b9..0000000 --- a/frontend/deployed/static/js/622.95b51007.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunkbackstory=self.webpackChunkbackstory||[]).push([[622],{6622:(t,e,a)=>{a.d(e,{diagram:()=>D});var r=a(7799),n=a(634),i=a(3957),s=a(3759),o=a(5502),l={showLegend:!0,ticks:5,max:null,min:0,graticule:"circle"},c={axes:[],curves:[],options:l},d=structuredClone(c),g=s.UI.radar,u=(0,s.K2)((()=>(0,n.$t)({...g,...(0,s.zj)().radar})),"getConfig"),h=(0,s.K2)((()=>d.axes),"getAxes"),p=(0,s.K2)((()=>d.curves),"getCurves"),x=(0,s.K2)((()=>d.options),"getOptions"),m=(0,s.K2)((t=>{d.axes=t.map((t=>({name:t.name,label:t.label??t.name})))}),"setAxes"),$=(0,s.K2)((t=>{d.curves=t.map((t=>({name:t.name,label:t.label??t.name,entries:f(t.entries)})))}),"setCurves"),f=(0,s.K2)((t=>{if(void 0==t[0].axis)return t.map((t=>t.value));const e=h();if(0===e.length)throw new Error("Axes must be populated before curves for reference entries");return e.map((e=>{const a=t.find((t=>t.axis?.$refText===e.name));if(void 0===a)throw new Error("Missing entry for axis "+e.label);return a.value}))}),"computeCurveEntries"),y={getAxes:h,getCurves:p,getOptions:x,setAxes:m,setCurves:$,setOptions:(0,s.K2)((t=>{const e=t.reduce(((t,e)=>(t[e.name]=e,t)),{});d.options={showLegend:e.showLegend?.value??l.showLegend,ticks:e.ticks?.value??l.ticks,max:e.max?.value??l.max,min:e.min?.value??l.min,graticule:e.graticule?.value??l.graticule}}),"setOptions"),getConfig:u,clear:(0,s.K2)((()=>{(0,s.IU)(),d=structuredClone(c)}),"clear"),setAccTitle:s.SV,getAccTitle:s.iN,setDiagramTitle:s.ke,getDiagramTitle:s.ab,getAccDescription:s.m7,setAccDescription:s.EI},v=(0,s.K2)((t=>{(0,r.S)(t,y);const{axes:e,curves:a,options:n}=t;y.setAxes(e),y.setCurves(a),y.setOptions(n)}),"populate"),b={parse:(0,s.K2)((async t=>{const e=await(0,o.qg)("radar",t);s.Rm.debug(e),v(e)}),"parse")},w=(0,s.K2)(((t,e,a,r)=>{const n=r.db,s=n.getAxes(),o=n.getCurves(),l=n.getOptions(),c=n.getConfig(),d=n.getDiagramTitle(),g=(0,i.D)(e),u=C(g,c),h=l.max??Math.max(...o.map((t=>Math.max(...t.entries)))),p=l.min,x=Math.min(c.width,c.height)/2;M(u,s,x,l.ticks,l.graticule),K(u,s,x,c),k(u,s,o,p,h,l.graticule,c),A(u,o,l.showLegend,c),u.append("text").attr("class","radarTitle").text(d).attr("x",0).attr("y",-c.height/2-c.marginTop)}),"draw"),C=(0,s.K2)(((t,e)=>{const a=e.width+e.marginLeft+e.marginRight,r=e.height+e.marginTop+e.marginBottom,n=e.marginLeft+e.width/2,i=e.marginTop+e.height/2;return t.attr("viewbox",`0 0 ${a} ${r}`).attr("width",a).attr("height",r),t.append("g").attr("transform",`translate(${n}, ${i})`)}),"drawFrame"),M=(0,s.K2)(((t,e,a,r,n)=>{if("circle"===n)for(let i=0;i{const a=2*e*Math.PI/n-Math.PI/2;return`${s*Math.cos(a)},${s*Math.sin(a)}`})).join(" ");t.append("polygon").attr("points",o).attr("class","radarGraticule")}}}),"drawGraticule"),K=(0,s.K2)(((t,e,a,r)=>{const n=e.length;for(let i=0;i{if(e.entries.length!==o)return;const c=e.entries.map(((t,e)=>{const a=2*Math.PI*e/o-Math.PI/2,i=L(t,r,n,l);return{x:i*Math.cos(a),y:i*Math.sin(a)}}));"circle"===i?t.append("path").attr("d",T(c,s.curveTension)).attr("class",`radarCurve-${a}`):"polygon"===i&&t.append("polygon").attr("points",c.map((t=>`${t.x},${t.y}`)).join(" ")).attr("class",`radarCurve-${a}`)}))}function L(t,e,a,r){return r*(Math.min(Math.max(t,e),a)-e)/(a-e)}function T(t,e){const a=t.length;let r=`M${t[0].x},${t[0].y}`;for(let n=0;n{const r=t.append("g").attr("transform",`translate(${n}, ${i+20*a})`);r.append("rect").attr("width",12).attr("height",12).attr("class",`radarLegendBox-${a}`),r.append("text").attr("x",16).attr("y",0).attr("class","radarLegendText").text(e.label)}))}(0,s.K2)(k,"drawCurves"),(0,s.K2)(L,"relativeRadius"),(0,s.K2)(T,"closedRoundCurve"),(0,s.K2)(A,"drawLegend");var O={draw:w},S=(0,s.K2)(((t,e)=>{let a="";for(let r=0;r{const e=(0,s.P$)(),a=(0,s.zj)(),r=(0,n.$t)(e,a.themeVariables);return{themeVariables:r,radarOptions:(0,n.$t)(r.radar,t)}}),"buildRadarStyleOptions"),D={parser:b,db:y,renderer:O,styles:(0,s.K2)((function(){let{radar:t}=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{};const{themeVariables:e,radarOptions:a}=I(t);return`\n\t.radarTitle {\n\t\tfont-size: ${e.fontSize};\n\t\tcolor: ${e.titleColor};\n\t\tdominant-baseline: hanging;\n\t\ttext-anchor: middle;\n\t}\n\t.radarAxisLine {\n\t\tstroke: ${a.axisColor};\n\t\tstroke-width: ${a.axisStrokeWidth};\n\t}\n\t.radarAxisLabel {\n\t\tdominant-baseline: middle;\n\t\ttext-anchor: middle;\n\t\tfont-size: ${a.axisLabelFontSize}px;\n\t\tcolor: ${a.axisColor};\n\t}\n\t.radarGraticule {\n\t\tfill: ${a.graticuleColor};\n\t\tfill-opacity: ${a.graticuleOpacity};\n\t\tstroke: ${a.graticuleColor};\n\t\tstroke-width: ${a.graticuleStrokeWidth};\n\t}\n\t.radarLegendText {\n\t\ttext-anchor: start;\n\t\tfont-size: ${a.legendFontSize}px;\n\t\tdominant-baseline: hanging;\n\t}\n\t${S(e,a)}\n\t`}),"styles")}},7799:(t,e,a)=>{function r(t,e){t.accDescr&&e.setAccDescription?.(t.accDescr),t.accTitle&&e.setAccTitle?.(t.accTitle),t.title&&e.setDiagramTitle?.(t.title)}a.d(e,{S:()=>r}),(0,a(3759).K2)(r,"populateCommonDb")}}]); -//# sourceMappingURL=622.95b51007.chunk.js.map \ No newline at end of file diff --git a/frontend/deployed/static/js/622.95b51007.chunk.js.map b/frontend/deployed/static/js/622.95b51007.chunk.js.map deleted file mode 100644 index dc68392..0000000 --- a/frontend/deployed/static/js/622.95b51007.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"static/js/622.95b51007.chunk.js","mappings":"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","sources":["../node_modules/mermaid/dist/chunks/mermaid.core/diagram-SSKATNLV.mjs","../node_modules/mermaid/dist/chunks/mermaid.core/chunk-4BMEZGHF.mjs"],"sourcesContent":["import {\n populateCommonDb\n} from \"./chunk-4BMEZGHF.mjs\";\nimport {\n cleanAndMerge\n} from \"./chunk-O4NI6UNU.mjs\";\nimport {\n selectSvgElement\n} from \"./chunk-7B677QYD.mjs\";\nimport {\n __name,\n clear,\n defaultConfig_default,\n getAccDescription,\n getAccTitle,\n getConfig,\n getDiagramTitle,\n getThemeVariables,\n log,\n setAccDescription,\n setAccTitle,\n setDiagramTitle\n} from \"./chunk-YTJNT7DU.mjs\";\n\n// src/diagrams/radar/db.ts\nvar defaultOptions = {\n showLegend: true,\n ticks: 5,\n max: null,\n min: 0,\n graticule: \"circle\"\n};\nvar defaultRadarData = {\n axes: [],\n curves: [],\n options: defaultOptions\n};\nvar data = structuredClone(defaultRadarData);\nvar DEFAULT_RADAR_CONFIG = defaultConfig_default.radar;\nvar getConfig2 = /* @__PURE__ */ __name(() => {\n const config = cleanAndMerge({\n ...DEFAULT_RADAR_CONFIG,\n ...getConfig().radar\n });\n return config;\n}, \"getConfig\");\nvar getAxes = /* @__PURE__ */ __name(() => data.axes, \"getAxes\");\nvar getCurves = /* @__PURE__ */ __name(() => data.curves, \"getCurves\");\nvar getOptions = /* @__PURE__ */ __name(() => data.options, \"getOptions\");\nvar setAxes = /* @__PURE__ */ __name((axes) => {\n data.axes = axes.map((axis) => {\n return {\n name: axis.name,\n label: axis.label ?? axis.name\n };\n });\n}, \"setAxes\");\nvar setCurves = /* @__PURE__ */ __name((curves) => {\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}, \"setCurves\");\nvar computeCurveEntries = /* @__PURE__ */ __name((entries) => {\n if (entries[0].axis == void 0) {\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((entry2) => entry2.axis?.$refText === axis.name);\n if (entry === void 0) {\n throw new Error(\"Missing entry for axis \" + axis.label);\n }\n return entry.value;\n });\n}, \"computeCurveEntries\");\nvar setOptions = /* @__PURE__ */ __name((options) => {\n const optionMap = options.reduce(\n (acc, option) => {\n acc[option.name] = option;\n return acc;\n },\n {}\n );\n data.options = {\n showLegend: optionMap.showLegend?.value ?? defaultOptions.showLegend,\n ticks: optionMap.ticks?.value ?? defaultOptions.ticks,\n max: optionMap.max?.value ?? defaultOptions.max,\n min: optionMap.min?.value ?? defaultOptions.min,\n graticule: optionMap.graticule?.value ?? defaultOptions.graticule\n };\n}, \"setOptions\");\nvar clear2 = /* @__PURE__ */ __name(() => {\n clear();\n data = structuredClone(defaultRadarData);\n}, \"clear\");\nvar db = {\n getAxes,\n getCurves,\n getOptions,\n setAxes,\n setCurves,\n setOptions,\n getConfig: getConfig2,\n clear: clear2,\n setAccTitle,\n getAccTitle,\n setDiagramTitle,\n getDiagramTitle,\n getAccDescription,\n setAccDescription\n};\n\n// src/diagrams/radar/parser.ts\nimport { parse } from \"@mermaid-js/parser\";\nvar populate = /* @__PURE__ */ __name((ast) => {\n populateCommonDb(ast, db);\n const { axes, curves, options } = ast;\n db.setAxes(axes);\n db.setCurves(curves);\n db.setOptions(options);\n}, \"populate\");\nvar parser = {\n parse: /* @__PURE__ */ __name(async (input) => {\n const ast = await parse(\"radar\", input);\n log.debug(ast);\n populate(ast);\n }, \"parse\")\n};\n\n// src/diagrams/radar/renderer.ts\nvar draw = /* @__PURE__ */ __name((_text, id, _version, diagram2) => {\n const db2 = diagram2.db;\n const axes = db2.getAxes();\n const curves = db2.getCurves();\n const options = db2.getOptions();\n const config = db2.getConfig();\n const title = db2.getDiagramTitle();\n const svg = selectSvgElement(id);\n const g = drawFrame(svg, config);\n const maxValue = options.max ?? Math.max(...curves.map((curve) => Math.max(...curve.entries)));\n const minValue = options.min;\n const radius = Math.min(config.width, config.height) / 2;\n drawGraticule(g, axes, radius, options.ticks, options.graticule);\n drawAxes(g, axes, radius, config);\n drawCurves(g, axes, curves, minValue, maxValue, options.graticule, config);\n drawLegend(g, curves, options.showLegend, config);\n g.append(\"text\").attr(\"class\", \"radarTitle\").text(title).attr(\"x\", 0).attr(\"y\", -config.height / 2 - config.marginTop);\n}, \"draw\");\nvar drawFrame = /* @__PURE__ */ __name((svg, config) => {\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 svg.attr(\"viewbox\", `0 0 ${totalWidth} ${totalHeight}`).attr(\"width\", totalWidth).attr(\"height\", totalHeight);\n return svg.append(\"g\").attr(\"transform\", `translate(${center.x}, ${center.y})`);\n}, \"drawFrame\");\nvar drawGraticule = /* @__PURE__ */ __name((g, axes, radius, ticks, graticule) => {\n if (graticule === \"circle\") {\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 const numAxes = axes.length;\n for (let i = 0; i < ticks; i++) {\n const r = radius * (i + 1) / ticks;\n const points = axes.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 }).join(\" \");\n g.append(\"polygon\").attr(\"points\", points).attr(\"class\", \"radarGraticule\");\n }\n }\n}, \"drawGraticule\");\nvar drawAxes = /* @__PURE__ */ __name((g, axes, radius, config) => {\n const numAxes = axes.length;\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\").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\");\n g.append(\"text\").text(label).attr(\"x\", radius * config.axisLabelFactor * Math.cos(angle)).attr(\"y\", radius * config.axisLabelFactor * Math.sin(angle)).attr(\"class\", \"radarAxisLabel\");\n }\n}, \"drawAxes\");\nfunction drawCurves(g, axes, curves, minValue, maxValue, graticule, config) {\n const numAxes = axes.length;\n const radius = Math.min(config.width, config.height) / 2;\n curves.forEach((curve, index) => {\n if (curve.entries.length !== numAxes) {\n return;\n }\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 if (graticule === \"circle\") {\n g.append(\"path\").attr(\"d\", closedRoundCurve(points, config.curveTension)).attr(\"class\", `radarCurve-${index}`);\n } else if (graticule === \"polygon\") {\n g.append(\"polygon\").attr(\"points\", points.map((p) => `${p.x},${p.y}`).join(\" \")).attr(\"class\", `radarCurve-${index}`);\n }\n });\n}\n__name(drawCurves, \"drawCurves\");\nfunction relativeRadius(value, minValue, maxValue, radius) {\n const clippedValue = Math.min(Math.max(value, minValue), maxValue);\n return radius * (clippedValue - minValue) / (maxValue - minValue);\n}\n__name(relativeRadius, \"relativeRadius\");\nfunction closedRoundCurve(points, tension) {\n const numPoints = points.length;\n let d = `M${points[0].x},${points[0].y}`;\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 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__name(closedRoundCurve, \"closedRoundCurve\");\nfunction drawLegend(g, curves, showLegend, config) {\n if (!showLegend) {\n return;\n }\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 curves.forEach((curve, index) => {\n const itemGroup = g.append(\"g\").attr(\"transform\", `translate(${legendX}, ${legendY + index * lineHeight})`);\n itemGroup.append(\"rect\").attr(\"width\", 12).attr(\"height\", 12).attr(\"class\", `radarLegendBox-${index}`);\n itemGroup.append(\"text\").attr(\"x\", 16).attr(\"y\", 0).attr(\"class\", \"radarLegendText\").text(curve.label);\n });\n}\n__name(drawLegend, \"drawLegend\");\nvar renderer = { draw };\n\n// src/diagrams/radar/styles.ts\nvar genIndexStyles = /* @__PURE__ */ __name((themeVariables, radarOptions) => {\n let sections = \"\";\n for (let i = 0; i < themeVariables.THEME_COLOR_LIMIT; i++) {\n const indexColor = themeVariables[`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}, \"genIndexStyles\");\nvar buildRadarStyleOptions = /* @__PURE__ */ __name((radar) => {\n const defaultThemeVariables = getThemeVariables();\n const currentConfig = getConfig();\n const themeVariables = cleanAndMerge(defaultThemeVariables, currentConfig.themeVariables);\n const radarOptions = cleanAndMerge(themeVariables.radar, radar);\n return { themeVariables, radarOptions };\n}, \"buildRadarStyleOptions\");\nvar styles = /* @__PURE__ */ __name(({ radar } = {}) => {\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}, \"styles\");\n\n// src/diagrams/radar/diagram.ts\nvar diagram = {\n parser,\n db,\n renderer,\n styles\n};\nexport {\n diagram\n};\n","import {\n __name\n} from \"./chunk-YTJNT7DU.mjs\";\n\n// src/diagrams/common/populateCommonDb.ts\nfunction populateCommonDb(ast, db) {\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__name(populateCommonDb, \"populateCommonDb\");\n\nexport {\n populateCommonDb\n};\n"],"names":["defaultOptions","showLegend","ticks","max","min","graticule","defaultRadarData","axes","curves","options","data","structuredClone","DEFAULT_RADAR_CONFIG","defaultConfig_default","radar","getConfig2","__name","cleanAndMerge","getConfig","getAxes","getCurves","getOptions","setAxes","map","axis","name","label","setCurves","curve","entries","computeCurveEntries","entry","value","length","Error","find","entry2","$refText","db","setOptions","optionMap","reduce","acc","option","clear","setAccTitle","getAccTitle","setDiagramTitle","getDiagramTitle","getAccDescription","setAccDescription","populate","ast","populateCommonDb","parser","parse","async","input","log","debug","draw","_text","id","_version","diagram2","db2","config","title","svg","selectSvgElement","g","drawFrame","maxValue","Math","minValue","radius","width","height","drawGraticule","drawAxes","drawCurves","drawLegend","append","attr","text","marginTop","totalWidth","marginLeft","marginRight","totalHeight","marginBottom","center","i","r","numAxes","points","_","j","angle","PI","cos","sin","join","axisScaleFactor","axisLabelFactor","forEach","index","relativeRadius","x","y","closedRoundCurve","curveTension","p","tension","numPoints","d","p0","p1","p2","p3","cp1","cp2","legendX","legendY","itemGroup","renderer","genIndexStyles","themeVariables","radarOptions","sections","THEME_COLOR_LIMIT","indexColor","curveOpacity","curveStrokeWidth","buildRadarStyleOptions","defaultThemeVariables","getThemeVariables","currentConfig","diagram","styles","arguments","undefined","fontSize","titleColor","axisColor","axisStrokeWidth","axisLabelFontSize","graticuleColor","graticuleOpacity","graticuleStrokeWidth","legendFontSize","accDescr","accTitle"],"sourceRoot":""} \ No newline at end of file diff --git a/frontend/deployed/static/js/626.6df36496.chunk.js b/frontend/deployed/static/js/626.6df36496.chunk.js deleted file mode 100644 index d910c8d..0000000 --- a/frontend/deployed/static/js/626.6df36496.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -"use strict";(self.webpackChunkbackstory=self.webpackChunkbackstory||[]).push([[626],{3314:(e,n,t)=>{t.d(n,{A:()=>i});var r=t(1387);const i=function(e){return(0,r.A)(e,4)}},5626:(e,n,t)=>{t.r(n),t.d(n,{render:()=>k});var r=t(1580),i=(t(2598),t(958)),a=t(8434),o=(t(9711),t(2596),t(634),t(3759)),d=t(62),s=t(6772),c=t(3314),g=t(8293);t(9330);function l(e){var n={options:{directed:e.isDirected(),multigraph:e.isMultigraph(),compound:e.isCompound()},nodes:f(e),edges:h(e)};return s.A(e.graph())||(n.value=c.A(e.graph())),n}function f(e){return g.A(e.nodes(),(function(n){var t=e.node(n),r=e.parent(n),i={v:n};return s.A(t)||(i.value=t),s.A(r)||(i.parent=r),i}))}function h(e){return g.A(e.edges(),(function(n){var t=e.edge(n),r={v:n.v,w:n.w};return s.A(n.name)||(r.name=n.name),s.A(t)||(r.value=t),r}))}var p=t(772),u=new Map,m=new Map,w=new Map,R=(0,o.K2)((()=>{m.clear(),w.clear(),u.clear()}),"clear"),v=(0,o.K2)(((e,n)=>{const t=m.get(n)||[];return o.Rm.trace("In isDescendant",n," ",e," = ",t.includes(e)),t.includes(e)}),"isDescendant"),y=(0,o.K2)(((e,n)=>{const t=m.get(n)||[];return o.Rm.info("Descendants of ",n," is ",t),o.Rm.info("Edge is ",e),e.v!==n&&e.w!==n&&(t?t.includes(e.v)||v(e.v,n)||v(e.w,n)||t.includes(e.w):(o.Rm.debug("Tilt, ",n,",not in descendants"),!1))}),"edgeInCluster"),X=(0,o.K2)(((e,n,t,r)=>{o.Rm.warn("Copying children of ",e,"root",r,"data",n.node(e),r);const i=n.children(e)||[];e!==r&&i.push(e),o.Rm.warn("Copying (nodes) clusterId",e,"nodes",i),i.forEach((i=>{if(n.children(i).length>0)X(i,n,t,r);else{const a=n.node(i);o.Rm.info("cp ",i," to ",r," with parent ",e),t.setNode(i,a),r!==n.parent(i)&&(o.Rm.warn("Setting parent",i,n.parent(i)),t.setParent(i,n.parent(i))),e!==r&&i!==e?(o.Rm.debug("Setting parent",i,e),t.setParent(i,e)):(o.Rm.info("In copy ",e,"root",r,"data",n.node(e),r),o.Rm.debug("Not Setting parent for node=",i,"cluster!==rootId",e!==r,"node!==clusterId",i!==e));const d=n.edges(i);o.Rm.debug("Copying Edges",d),d.forEach((i=>{o.Rm.info("Edge",i);const a=n.edge(i.v,i.w,i.name);o.Rm.info("Edge data",a,r);try{y(i,r)?(o.Rm.info("Copying as ",i.v,i.w,a,i.name),t.setEdge(i.v,i.w,a,i.name),o.Rm.info("newGraph edges ",t.edges(),t.edge(t.edges()[0]))):o.Rm.info("Skipping copy of edge ",i.v,"--\x3e",i.w," rootId: ",r," clusterId:",e)}catch(d){o.Rm.error(d)}}))}o.Rm.debug("Removing node",i),n.removeNode(i)}))}),"copy"),b=(0,o.K2)(((e,n)=>{const t=n.children(e);let r=[...t];for(const i of t)w.set(i,e),r=[...r,...b(i,n)];return r}),"extractDescendants"),E=(0,o.K2)(((e,n,t)=>{const r=e.edges().filter((e=>e.v===n||e.w===n)),i=e.edges().filter((e=>e.v===t||e.w===t)),a=r.map((e=>({v:e.v===n?t:e.v,w:e.w===n?n:e.w}))),o=i.map((e=>({v:e.v,w:e.w})));return a.filter((e=>o.some((n=>e.v===n.v&&e.w===n.w))))}),"findCommonEdges"),N=(0,o.K2)(((e,n,t)=>{const r=n.children(e);if(o.Rm.trace("Searching children of id ",e,r),r.length<1)return e;let i;for(const a of r){const e=N(a,n,t),r=E(n,t,e);if(e){if(!(r.length>0))return e;i=e}}return i}),"findNonClusterChild"),C=(0,o.K2)((e=>u.has(e)&&u.get(e).externalConnections&&u.has(e)?u.get(e).id:e),"getAnchorId"),S=(0,o.K2)(((e,n)=>{if(!e||n>10)o.Rm.debug("Opting out, no graph ");else{o.Rm.debug("Opting in, graph "),e.nodes().forEach((function(n){e.children(n).length>0&&(o.Rm.warn("Cluster identified",n," Replacement id in edges: ",N(n,e,n)),m.set(n,b(n,e)),u.set(n,{id:N(n,e,n),clusterData:e.node(n)}))})),e.nodes().forEach((function(n){const t=e.children(n),r=e.edges();t.length>0?(o.Rm.debug("Cluster identified",n,m),r.forEach((e=>{v(e.v,n)^v(e.w,n)&&(o.Rm.warn("Edge: ",e," leaves cluster ",n),o.Rm.warn("Descendants of XXX ",n,": ",m.get(n)),u.get(n).externalConnections=!0)}))):o.Rm.debug("Not a cluster ",n,m)}));for(let n of u.keys()){const t=u.get(n).id,r=e.parent(t);r!==n&&u.has(r)&&!u.get(r).externalConnections&&(u.get(n).id=r)}e.edges().forEach((function(n){const t=e.edge(n);o.Rm.warn("Edge "+n.v+" -> "+n.w+": "+JSON.stringify(n)),o.Rm.warn("Edge "+n.v+" -> "+n.w+": "+JSON.stringify(e.edge(n)));let r=n.v,i=n.w;if(o.Rm.warn("Fix XXX",u,"ids:",n.v,n.w,"Translating: ",u.get(n.v)," --- ",u.get(n.w)),u.get(n.v)||u.get(n.w)){if(o.Rm.warn("Fixing and trying - removing XXX",n.v,n.w,n.name),r=C(n.v),i=C(n.w),e.removeEdge(n.v,n.w,n.name),r!==n.v){const i=e.parent(r);u.get(i).externalConnections=!0,t.fromCluster=n.v}if(i!==n.w){const r=e.parent(i);u.get(r).externalConnections=!0,t.toCluster=n.w}o.Rm.warn("Fix Replacing with XXX",r,i,n.name),e.setEdge(r,i,t,n.name)}})),o.Rm.warn("Adjusted Graph",l(e)),x(e,0),o.Rm.trace(u)}}),"adjustClustersAndEdges"),x=(0,o.K2)(((e,n)=>{if(o.Rm.warn("extractor - ",n,l(e),e.children("D")),n>10)return void o.Rm.error("Bailing out");let t=e.nodes(),r=!1;for(const i of t){const n=e.children(i);r=r||n.length>0}if(r){o.Rm.debug("Nodes = ",t,n);for(const r of t)if(o.Rm.debug("Extracting node",r,u,u.has(r)&&!u.get(r).externalConnections,!e.parent(r),e.node(r),e.children("D")," Depth ",n),u.has(r))if(!u.get(r).externalConnections&&e.children(r)&&e.children(r).length>0){o.Rm.warn("Cluster without external connections, without a parent and with children",r,n);let t="TB"===e.graph().rankdir?"LR":"TB";u.get(r)?.clusterData?.dir&&(t=u.get(r).clusterData.dir,o.Rm.warn("Fixing dir",u.get(r).clusterData.dir,t));const i=new p.T({multigraph:!0,compound:!0}).setGraph({rankdir:t,nodesep:50,ranksep:50,marginx:8,marginy:8}).setDefaultEdgeLabel((function(){return{}}));o.Rm.warn("Old graph before copy",l(e)),X(r,e,i,r),e.setNode(r,{clusterNode:!0,id:r,clusterData:u.get(r).clusterData,label:u.get(r).label,graph:i}),o.Rm.warn("New graph after copy node: (",r,")",l(i)),o.Rm.debug("Old graph after copy",l(e))}else o.Rm.warn("Cluster ** ",r," **not meeting the criteria !externalConnections:",!u.get(r).externalConnections," no parent: ",!e.parent(r)," children ",e.children(r)&&e.children(r).length>0,e.children("D"),n),o.Rm.debug(u);else o.Rm.debug("Not a cluster",r,n);t=e.nodes(),o.Rm.warn("New list of nodes",t);for(const r of t){const t=e.node(r);o.Rm.warn(" Now next level",r,t),t?.clusterNode&&x(t.graph,n+1)}}else o.Rm.debug("Done, no node has children",e.nodes())}),"extractor"),I=(0,o.K2)(((e,n)=>{if(0===n.length)return[];let t=Object.assign([],n);return n.forEach((n=>{const r=e.children(n),i=I(e,r);t=[...t,...i]})),t}),"sorter"),D=(0,o.K2)((e=>I(e,e.children())),"sortNodesByHierarchy"),A=(0,o.K2)((async(e,n,t,s,c,g)=>{o.Rm.warn("Graph in recursive render:XAX",l(n),c);const f=n.graph().rankdir;o.Rm.trace("Dir in recursive render - dir:",f);const h=e.insert("g").attr("class","root");n.nodes()?o.Rm.info("Recursive render XXX",n.nodes()):o.Rm.info("No nodes found for",n),n.edges().length>0&&o.Rm.info("Recursive edges",n.edge(n.edges()[0]));const p=h.insert("g").attr("class","clusters"),m=h.insert("g").attr("class","edgePaths"),w=h.insert("g").attr("class","edgeLabels"),R=h.insert("g").attr("class","nodes");await Promise.all(n.nodes().map((async function(e){const r=n.node(e);if(void 0!==c){const t=JSON.parse(JSON.stringify(c.clusterData));o.Rm.trace("Setting data for parent cluster XXX\n Node.id = ",e,"\n data=",t.height,"\nParent cluster",c.height),n.setNode(c.id,t),n.parent(e)||(o.Rm.trace("Setting parent",e,c.id),n.setParent(e,c.id,t))}if(o.Rm.info("(Insert) Node XXX"+e+": "+JSON.stringify(n.node(e))),r?.clusterNode){o.Rm.info("Cluster identified XBX",e,r.width,n.node(e));const{ranksep:a,nodesep:d}=n.graph();r.graph.setGraph({...r.graph.graph(),ranksep:a+25,nodesep:d});const c=await A(R,r.graph,t,s,n.node(e),g),l=c.elem;(0,i.lC)(r,l),r.diff=c.diff||0,o.Rm.info("New compound node after recursive render XAX",e,"width",r.width,"height",r.height),(0,i.U7)(l,r)}else n.children(e).length>0?(o.Rm.trace("Cluster - the non recursive path XBX",e,r.id,r,r.width,"Graph:",n),o.Rm.trace(N(r.id,n)),u.set(r.id,{id:N(r.id,n),node:r})):(o.Rm.trace("Node - the non recursive path XAX",e,R,n.node(e),f),await(0,i.on)(R,n.node(e),{config:g,dir:f}))})));const v=(0,o.K2)((async()=>{const e=n.edges().map((async function(e){const t=n.edge(e.v,e.w,e.name);o.Rm.info("Edge "+e.v+" -> "+e.w+": "+JSON.stringify(e)),o.Rm.info("Edge "+e.v+" -> "+e.w+": ",e," ",JSON.stringify(n.edge(e))),o.Rm.info("Fix",u,"ids:",e.v,e.w,"Translating: ",u.get(e.v),u.get(e.w)),await(0,r.jP)(w,t)}));await Promise.all(e)}),"processEdges");await v(),o.Rm.info("Graph before layout:",JSON.stringify(l(n))),o.Rm.info("############################################# XXX"),o.Rm.info("### Layout ### XXX"),o.Rm.info("############################################# XXX"),(0,d.Zp)(n),o.Rm.info("Graph after layout:",JSON.stringify(l(n)));let y=0,{subGraphTitleTotalMargin:X}=(0,a.O)(g);return await Promise.all(D(n).map((async function(e){const t=n.node(e);if(o.Rm.info("Position XBX => "+e+": ("+t.x,","+t.y,") width: ",t.width," height: ",t.height),t?.clusterNode)t.y+=X,o.Rm.info("A tainted cluster node XBX1",e,t.id,t.width,t.height,t.x,t.y,n.parent(e)),u.get(t.id).node=t,(0,i.U_)(t);else if(n.children(e).length>0){o.Rm.info("A pure cluster node XBX1",e,t.id,t.x,t.y,t.width,t.height,n.parent(e)),t.height+=X,n.node(t.parentId);const r=t?.padding/2||0,a=t?.labelBBox?.height||0,d=a-r||0;o.Rm.debug("OffsetY",d,"labelHeight",a,"halfPadding",r),await(0,i.U)(p,t),u.get(t.id).node=t}else{const e=n.node(t.parentId);t.y+=X/2,o.Rm.info("A regular node XBX1 - using the padding",t.id,"parent",t.parentId,t.width,t.height,t.x,t.y,"offsetY",t.offsetY,"parent",e,e?.offsetY,t),(0,i.U_)(t)}}))),n.edges().forEach((function(e){const i=n.edge(e);o.Rm.info("Edge "+e.v+" -> "+e.w+": "+JSON.stringify(i),i),i.points.forEach((e=>e.y+=X/2));const a=n.node(e.v);var d=n.node(e.w);const c=(0,r.Jo)(m,i,u,t,a,d,s);(0,r.T_)(i,c)})),n.nodes().forEach((function(e){const t=n.node(e);o.Rm.info(e,t.type,t.diff),t.isGroup&&(y=t.diff)})),o.Rm.warn("Returning from recursive render XAX",h,y),{elem:h,diff:y}}),"recursiveRender"),k=(0,o.K2)((async(e,n)=>{const t=new p.T({multigraph:!0,compound:!0}).setGraph({rankdir:e.direction,nodesep:e.config?.nodeSpacing||e.config?.flowchart?.nodeSpacing||e.nodeSpacing,ranksep:e.config?.rankSpacing||e.config?.flowchart?.rankSpacing||e.rankSpacing,marginx:8,marginy:8}).setDefaultEdgeLabel((function(){return{}})),a=n.select("g");(0,r.g0)(a,e.markers,e.type,e.diagramId),(0,i.gh)(),(0,r.IU)(),(0,i.IU)(),R(),e.nodes.forEach((e=>{t.setNode(e.id,{...e}),e.parentId&&t.setParent(e.id,e.parentId)})),o.Rm.debug("Edges:",e.edges),e.edges.forEach((e=>{if(e.start===e.end){const n=e.start,r=n+"---"+n+"---1",i=n+"---"+n+"---2",a=t.node(n);t.setNode(r,{domId:r,id:r,parentId:a.parentId,labelStyle:"",label:"",padding:0,shape:"labelRect",style:"",width:10,height:10}),t.setParent(r,a.parentId),t.setNode(i,{domId:i,id:i,parentId:a.parentId,labelStyle:"",padding:0,shape:"labelRect",label:"",style:"",width:10,height:10}),t.setParent(i,a.parentId);const o=structuredClone(e),d=structuredClone(e),s=structuredClone(e);o.label="",o.arrowTypeEnd="none",o.id=n+"-cyclic-special-1",d.arrowTypeStart="none",d.arrowTypeEnd="none",d.id=n+"-cyclic-special-mid",s.label="",a.isGroup&&(o.fromCluster=n,s.toCluster=n),s.id=n+"-cyclic-special-2",s.arrowTypeStart="none",t.setEdge(n,r,o,n+"-cyclic-special-0"),t.setEdge(r,i,d,n+"-cyclic-special-1"),t.setEdge(i,n,s,n+"-cyc true\n */\nfunction clone(value) {\n return baseClone(value, CLONE_SYMBOLS_FLAG);\n}\n\nexport default clone;\n","import * as _ from 'lodash-es';\nimport { Graph } from './graph.js';\n\nexport { write, read };\n\nfunction write(g) {\n var json = {\n options: {\n directed: g.isDirected(),\n multigraph: g.isMultigraph(),\n compound: g.isCompound(),\n },\n nodes: writeNodes(g),\n edges: writeEdges(g),\n };\n if (!_.isUndefined(g.graph())) {\n json.value = _.clone(g.graph());\n }\n return json;\n}\n\nfunction writeNodes(g) {\n return _.map(g.nodes(), function (v) {\n var nodeValue = g.node(v);\n var parent = g.parent(v);\n var node = { v: v };\n if (!_.isUndefined(nodeValue)) {\n node.value = nodeValue;\n }\n if (!_.isUndefined(parent)) {\n node.parent = parent;\n }\n return node;\n });\n}\n\nfunction writeEdges(g) {\n return _.map(g.edges(), function (e) {\n var edgeValue = g.edge(e);\n var edge = { v: e.v, w: e.w };\n if (!_.isUndefined(e.name)) {\n edge.name = e.name;\n }\n if (!_.isUndefined(edgeValue)) {\n edge.value = edgeValue;\n }\n return edge;\n });\n}\n\nfunction read(json) {\n var g = new Graph(json.options).setGraph(json.value);\n _.each(json.nodes, function (entry) {\n g.setNode(entry.v, entry.value);\n if (entry.parent) {\n g.setParent(entry.v, entry.parent);\n }\n });\n _.each(json.edges, function (entry) {\n g.setEdge({ v: entry.v, w: entry.w, name: entry.name }, entry.value);\n });\n return g;\n}\n","import {\n clear as clear2,\n insertEdge,\n insertEdgeLabel,\n markers_default,\n positionEdgeLabel\n} from \"./chunk-IIMUDSI4.mjs\";\nimport \"./chunk-VV3M67IP.mjs\";\nimport {\n clear,\n clear2 as clear3,\n insertCluster,\n insertNode,\n positionNode,\n setNodeElem,\n updateNodeBounds\n} from \"./chunk-HRU6DDCH.mjs\";\nimport {\n getSubGraphTitleMargins\n} from \"./chunk-K557N5IZ.mjs\";\nimport \"./chunk-H2D2JQ3I.mjs\";\nimport \"./chunk-C3MQ5ANM.mjs\";\nimport \"./chunk-O4NI6UNU.mjs\";\nimport {\n __name,\n getConfig2 as getConfig,\n log\n} from \"./chunk-YTJNT7DU.mjs\";\n\n// src/rendering-util/layout-algorithms/dagre/index.js\nimport { layout as dagreLayout } from \"dagre-d3-es/src/dagre/index.js\";\nimport * as graphlibJson2 from \"dagre-d3-es/src/graphlib/json.js\";\nimport * as graphlib2 from \"dagre-d3-es/src/graphlib/index.js\";\n\n// src/rendering-util/layout-algorithms/dagre/mermaid-graphlib.js\nimport * as graphlib from \"dagre-d3-es/src/graphlib/index.js\";\nimport * as graphlibJson from \"dagre-d3-es/src/graphlib/json.js\";\nvar clusterDb = /* @__PURE__ */ new Map();\nvar descendants = /* @__PURE__ */ new Map();\nvar parents = /* @__PURE__ */ new Map();\nvar clear4 = /* @__PURE__ */ __name(() => {\n descendants.clear();\n parents.clear();\n clusterDb.clear();\n}, \"clear\");\nvar isDescendant = /* @__PURE__ */ __name((id, ancestorId) => {\n const ancestorDescendants = descendants.get(ancestorId) || [];\n log.trace(\"In isDescendant\", ancestorId, \" \", id, \" = \", ancestorDescendants.includes(id));\n return ancestorDescendants.includes(id);\n}, \"isDescendant\");\nvar edgeInCluster = /* @__PURE__ */ __name((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 if (!clusterDescendants) {\n log.debug(\"Tilt, \", clusterId, \",not in descendants\");\n return false;\n }\n return clusterDescendants.includes(edge.v) || isDescendant(edge.v, clusterId) || isDescendant(edge.w, clusterId) || clusterDescendants.includes(edge.w);\n}, \"edgeInCluster\");\nvar copy = /* @__PURE__ */ __name((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 if (clusterId !== rootId) {\n nodes.push(clusterId);\n }\n log.warn(\"Copying (nodes) clusterId\", clusterId, \"nodes\", nodes);\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 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 data2 = graph.edge(edge.v, edge.w, edge.name);\n log.info(\"Edge data\", data2, rootId);\n try {\n if (edgeInCluster(edge, rootId)) {\n log.info(\"Copying as \", edge.v, edge.w, data2, edge.name);\n newGraph.setEdge(edge.v, edge.w, data2, 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}, \"copy\");\nvar extractDescendants = /* @__PURE__ */ __name((id, graph) => {\n const children = graph.children(id);\n let res = [...children];\n for (const child of children) {\n parents.set(child, id);\n res = [...res, ...extractDescendants(child, graph)];\n }\n return res;\n}, \"extractDescendants\");\nvar findCommonEdges = /* @__PURE__ */ __name((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 return result;\n}, \"findCommonEdges\");\nvar findNonClusterChild = /* @__PURE__ */ __name((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 const commonEdges = findCommonEdges(graph, clusterId, _id);\n if (_id) {\n if (commonEdges.length > 0) {\n reserve = _id;\n } else {\n return _id;\n }\n }\n }\n return reserve;\n}, \"findNonClusterChild\");\nvar getAnchorId = /* @__PURE__ */ __name((id) => {\n if (!clusterDb.has(id)) {\n return id;\n }\n if (!clusterDb.get(id).externalConnections) {\n return id;\n }\n if (clusterDb.has(id)) {\n return clusterDb.get(id).id;\n }\n return id;\n}, \"getAnchorId\");\nvar adjustClustersAndEdges = /* @__PURE__ */ __name((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 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 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 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 for (let id of clusterDb.keys()) {\n const nonClusterChild = clusterDb.get(id).id;\n const parent = graph.parent(nonClusterChild);\n if (parent !== id && clusterDb.has(parent) && !clusterDb.get(parent).externalConnections) {\n clusterDb.get(id).id = parent;\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 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 log.trace(clusterDb);\n}, \"adjustClustersAndEdges\");\nvar extractor = /* @__PURE__ */ __name((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 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 (!clusterDb.get(node).externalConnections && graph.children(node) && graph.children(node).length > 0) {\n log.warn(\n \"Cluster without external connections, without a parent and with children\",\n node,\n depth\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 const clusterGraph = new graphlib.Graph({\n multigraph: true,\n compound: true\n }).setGraph({\n rankdir: dir,\n nodesep: 50,\n ranksep: 50,\n marginx: 8,\n marginy: 8\n }).setDefaultEdgeLabel(function() {\n return {};\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 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}, \"extractor\");\nvar sorter = /* @__PURE__ */ __name((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 return result;\n}, \"sorter\");\nvar sortNodesByHierarchy = /* @__PURE__ */ __name((graph) => sorter(graph, graph.children()), \"sortNodesByHierarchy\");\n\n// src/rendering-util/layout-algorithms/dagre/index.js\nvar recursiveRender = /* @__PURE__ */ __name(async (_elem, graph, diagramType, id, parentCluster, siteConfig) => {\n log.warn(\"Graph in recursive render:XAX\", graphlibJson2.write(graph), parentCluster);\n const dir = graph.graph().rankdir;\n log.trace(\"Dir in recursive render - dir:\", dir);\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 await Promise.all(\n graph.nodes().map(async function(v) {\n const node = graph.node(v);\n if (parentCluster !== void 0) {\n const data = JSON.parse(JSON.stringify(parentCluster.clusterData));\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 log.info(\"Cluster identified XBX\", v, node.width, graph.node(v));\n const { ranksep, nodesep } = graph.graph();\n node.graph.setGraph({\n ...node.graph.graph(),\n ranksep: ranksep + 25,\n nodesep\n });\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.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 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 } 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 const processEdges = /* @__PURE__ */ __name(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 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 await Promise.all(edgePromises);\n }, \"processEdges\");\n await processEdges();\n log.info(\"Graph before layout:\", JSON.stringify(graphlibJson2.write(graph)));\n log.info(\"############################################# XXX\");\n log.info(\"### Layout ### XXX\");\n log.info(\"############################################# XXX\");\n dagreLayout(graph);\n log.info(\"Graph after layout:\", JSON.stringify(graphlibJson2.write(graph)));\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 node.y += subGraphTitleTotalMargin;\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 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 clusterDb.get(node.id).node = node;\n } else {\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 positionNode(node);\n }\n }\n })\n );\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 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 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}, \"recursiveRender\");\nvar render = /* @__PURE__ */ __name(async (data4Layout, svg) => {\n const graph = new graphlib2.Graph({\n multigraph: true,\n compound: true\n }).setGraph({\n rankdir: data4Layout.direction,\n nodesep: data4Layout.config?.nodeSpacing || data4Layout.config?.flowchart?.nodeSpacing || data4Layout.nodeSpacing,\n ranksep: data4Layout.config?.rankSpacing || data4Layout.config?.flowchart?.rankSpacing || data4Layout.rankSpacing,\n marginx: 8,\n marginy: 8\n }).setDefaultEdgeLabel(function() {\n return {};\n });\n const element = svg.select(\"g\");\n markers_default(element, data4Layout.markers, data4Layout.type, data4Layout.diagramId);\n clear3();\n clear2();\n clear();\n clear4();\n data4Layout.nodes.forEach((node) => {\n graph.setNode(node.id, { ...node });\n if (node.parentId) {\n graph.setParent(node.id, node.parentId);\n }\n });\n log.debug(\"Edges:\", data4Layout.edges);\n data4Layout.edges.forEach((edge) => {\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 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{function r(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,o=!0,s=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return o=e.done,e},e:function(e){s=!0,i=e},f:function(){try{o||null==n.return||n.return()}finally{if(s)throw i}}}}function s(e,t,n){return(t=c(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function l(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,i,o,s=[],l=!0,u=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(r=i.call(n)).done)&&(s.push(r.value),s.length!==t);l=!0);}catch(e){u=!0,a=e}finally{try{if(!l&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(u)throw a}}return s}}(e,t)||h(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function u(e){return function(e){if(Array.isArray(e))return r(e)}(e)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(e)||h(e)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function c(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t);if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e,"string");return"symbol"==typeof t?t:t+""}function d(e){return d="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},d(e)}function h(e,t){if(e){if("string"==typeof e)return r(e,t);var n={}.toString.call(e).slice(8,-1);return"Object"===n&&e.constructor&&(n=e.constructor.name),"Map"===n||"Set"===n?Array.from(e):"Arguments"===n||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)?r(e,t):void 0}}n.d(t,{A:()=>zh});var f="undefined"===typeof window?null:window,p=f?f.navigator:null;f&&f.document;var g,v,y,m,b,x,w,E,k,T,C,P,S,B,D,_,A,M,R,I,N,L,z,O,V,F,j,X,q=d(""),Y=d({}),W=d((function(){})),U="undefined"===typeof HTMLElement?"undefined":d(HTMLElement),H=function(e){return e&&e.instanceString&&G(e.instanceString)?e.instanceString():null},K=function(e){return null!=e&&d(e)==q},G=function(e){return null!=e&&d(e)===W},Z=function(e){return!ee(e)&&(Array.isArray?Array.isArray(e):null!=e&&e instanceof Array)},$=function(e){return null!=e&&d(e)===Y&&!Z(e)&&e.constructor===Object},Q=function(e){return null!=e&&d(e)===d(1)&&!isNaN(e)},J=function(e){return"undefined"===U?void 0:null!=e&&e instanceof HTMLElement},ee=function(e){return te(e)||ne(e)},te=function(e){return"collection"===H(e)&&e._private.single},ne=function(e){return"collection"===H(e)&&!e._private.single},re=function(e){return"core"===H(e)},ae=function(e){return"stylesheet"===H(e)},ie=function(e){return void 0===e||null===e||!(""!==e&&!e.match(/^\s+$/))},oe=function(e){return function(e){return null!=e&&d(e)===Y}(e)&&G(e.then)},se=function(e,t){t||(t=function(){if(1===arguments.length)return arguments[0];if(0===arguments.length)return"undefined";for(var e=[],t=0;tt?1:0},me=null!=Object.assign?Object.assign.bind(Object):function(e){for(var t=arguments,n=1;n255)return;t.push(Math.floor(i))}var o=r[1]||r[2]||r[3],s=r[1]&&r[2]&&r[3];if(o&&!s)return;var l=n[4];if(void 0!==l){if((l=parseFloat(l))<0||l>1)return;t.push(l)}}return t}(e)||function(e){var t,n,r,a,i,o,s,l;function u(e,t,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?e+6*(t-e)*n:n<.5?t:n<2/3?e+(t-e)*(2/3-n)*6:e}var c=new RegExp("^"+ge+"$").exec(e);if(c){if((n=parseInt(c[1]))<0?n=(360- -1*n%360)%360:n>360&&(n%=360),n/=360,(r=parseFloat(c[2]))<0||r>100)return;if(r/=100,(a=parseFloat(c[3]))<0||a>100)return;if(a/=100,void 0!==(i=c[4])&&((i=parseFloat(i))<0||i>1))return;if(0===r)o=s=l=Math.round(255*a);else{var d=a<.5?a*(1+r):a+r-a*r,h=2*a-d;o=Math.round(255*u(h,d,n+1/3)),s=Math.round(255*u(h,d,n)),l=Math.round(255*u(h,d,n-1/3))}t=[o,s,l,i]}return t}(e)},xe={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]},we=function(e){for(var t=e.map,n=e.keys,r=n.length,a=0;a=o||t<0||v&&e-p>=c}function x(){var e=t();if(b(e))return w(e);h=setTimeout(x,function(e){var t=o-(e-f);return v?a(t,c-(e-p)):t}(e))}function w(e){return h=void 0,y&&l?m(e):(l=u=void 0,d)}function E(){var e=t(),n=b(e);if(l=arguments,u=this,f=e,n){if(void 0===h)return function(e){return p=e,h=setTimeout(x,o),g?m(e):d}(f);if(v)return clearTimeout(h),h=setTimeout(x,o),m(f)}return void 0===h&&(h=setTimeout(x,o)),d}return o=n(o)||0,e(s)&&(g=!!s.leading,c=(v="maxWait"in s)?r(n(s.maxWait)||0,o):c,y="trailing"in s?!!s.trailing:y),E.cancel=function(){void 0!==h&&clearTimeout(h),p=0,l=f=u=h=void 0},E.flush=function(){return void 0===h?d:w(t())},E}}()),Me=f?f.performance:null,Re=Me&&Me.now?function(){return Me.now()}:function(){return Date.now()},Ie=function(){if(f){if(f.requestAnimationFrame)return function(e){f.requestAnimationFrame(e)};if(f.mozRequestAnimationFrame)return function(e){f.mozRequestAnimationFrame(e)};if(f.webkitRequestAnimationFrame)return function(e){f.webkitRequestAnimationFrame(e)};if(f.msRequestAnimationFrame)return function(e){f.msRequestAnimationFrame(e)}}return function(e){e&&setTimeout((function(){e(Re())}),1e3/60)}}(),Ne=function(e){return Ie(e)},Le=Re,ze=9261,Oe=5381,Ve=function(e){for(var t,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:ze;!(t=e.next()).done;)n=65599*n+t.value|0;return n},Fe=function(e){return 65599*(arguments.length>1&&void 0!==arguments[1]?arguments[1]:ze)+e|0},je=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Oe;return(t<<5)+t+e|0},Xe=function(e){return 2097152*e[0]+e[1]},qe=function(e,t){return[Fe(e[0],t[0]),je(e[1],t[1])]},Ye=function(e,t){var n={value:0,done:!1},r=0,a=e.length;return Ve({next:function(){return r=0;r--)e[r]===t&&e.splice(r,1)},dt=function(e){e.splice(0,e.length)},ht=function(e,t,n){return n&&(t=ce(n,t)),e[t]},ft=function(e,t,n,r){n&&(t=ce(n,t)),e[t]=r},pt="undefined"!==typeof Map?Map:function(){return i((function e(){a(this,e),this._obj={}}),[{key:"set",value:function(e,t){return this._obj[e]=t,this}},{key:"delete",value:function(e){return this._obj[e]=void 0,this}},{key:"clear",value:function(){this._obj={}}},{key:"has",value:function(e){return void 0!==this._obj[e]}},{key:"get",value:function(e){return this._obj[e]}}])}(),gt=function(){return i((function e(t){if(a(this,e),this._obj=Object.create(null),this.size=0,null!=t){var n;n=null!=t.instanceString&&t.instanceString()===this.instanceString()?t.toArray():t;for(var r=0;r2&&void 0!==arguments[2])||arguments[2];if(void 0!==e&&void 0!==t&&re(e)){var r=t.group;if(null==r&&(r=t.data&&null!=t.data.source&&null!=t.data.target?"edges":"nodes"),"nodes"===r||"edges"===r){this.length=1,this[0]=this;var a=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:r,style:{},rstyle:{},styleCxts:[],styleKeys:{},removed:!0,selected:!!t.selected,selectable:void 0===t.selectable||!!t.selectable,locked:!!t.locked,grabbed:!1,grabbable:void 0===t.grabbable||!!t.grabbable,pannable:void 0===t.pannable?"edges"===r:!!t.pannable,active:!1,classes:new vt,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(null==a.position.x&&(a.position.x=0),null==a.position.y&&(a.position.y=0),t.renderedPosition){var i=t.renderedPosition,o=e.pan(),s=e.zoom();a.position={x:(i.x-o.x)/s,y:(i.y-o.y)/s}}var l=[];Z(t.classes)?l=t.classes:K(t.classes)&&(l=t.classes.split(/\s+/));for(var u=0,c=l.length;ut?1:0},u=function(e,t,a,i,o){var s;if(null==a&&(a=0),null==o&&(o=n),a<0)throw new Error("lo must be non-negative");for(null==i&&(i=e.length);an;0<=n?t++:t--)u.push(t);return u}.apply(this).reverse()).length;ig;0<=g?++h:--h)v.push(i(e,r));return v},p=function(e,t,r,a){var i,o,s;for(null==a&&(a=n),i=e[r];r>t&&a(i,o=e[s=r-1>>1])<0;)e[r]=o,r=s;return e[r]=i},g=function(e,t,r){var a,i,o,s,l;for(null==r&&(r=n),i=e.length,l=t,o=e[t],a=2*t+1;a0;){var w=y.pop(),E=g(w),k=w.id();if(d[k]=E,E!==1/0)for(var T=w.neighborhood().intersect(f),C=0;C0)for(n.unshift(t);c[a];){var i=c[a];n.unshift(i.edge),n.unshift(i.node),a=(r=i.node).id()}return o.spawn(n)}}}},Dt={kruskal:function(e){e=e||function(e){return 1};for(var t=this.byGroup(),n=t.nodes,r=t.edges,a=n.length,i=new Array(a),o=n,s=function(e){for(var t=0;t0;){if(l=g.pop(),u=l.id(),v.delete(u),w++,u===d){for(var E=[],k=a,T=d,C=m[T];E.unshift(k),null!=C&&E.unshift(C),null!=(k=y[T]);)C=m[T=k.id()];return{found:!0,distance:h[u],path:this.spawn(E),steps:w}}p[u]=!0;for(var P=l._private.edges,S=0;SP&&(f[C]=P,y[C]=T,m[C]=x),!a){var S=T*u+k;!a&&f[S]>P&&(f[S]=P,y[S]=k,m[S]=x)}}}for(var B=0;B1&&void 0!==arguments[1]?arguments[1]:i,r=[],a=m(e);;){if(null==a)return t.spawn();var o=y(a),l=o.edge,u=o.pred;if(r.unshift(a[0]),a.same(n)&&r.length>0)break;null!=l&&r.unshift(l),a=u}return s.spawn(r)},hasNegativeWeightCycle:p,negativeWeightCycles:g}}},Lt=Math.sqrt(2),zt=function(e,t,n){0===n.length&&nt("Karger-Stein must be run on a connected (sub)graph");for(var r=n[e],a=r[1],i=r[2],o=t[a],s=t[i],l=n,u=l.length-1;u>=0;u--){var c=l[u],d=c[1],h=c[2];(t[d]===o&&t[h]===s||t[d]===s&&t[h]===o)&&l.splice(u,1)}for(var f=0;fr;){var a=Math.floor(Math.random()*t.length);t=zt(a,e,t),n--}return t},Vt={kargerStein:function(){var e=this,t=this.byGroup(),n=t.nodes,r=t.edges;r.unmergeBy((function(e){return e.isLoop()}));var a=n.length,i=r.length,o=Math.ceil(Math.pow(Math.log(a)/Math.LN2,2)),s=Math.floor(a/Lt);if(!(a<2)){for(var l=[],u=0;u0?1:e<0?-1:0},Ut=function(e,t){return Math.sqrt(Ht(e,t))},Ht=function(e,t){var n=t.x-e.x,r=t.y-e.y;return n*n+r*r},Kt=function(e){for(var t=e.length,n=0,r=0;r=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(null!=e.w&&null!=e.h&&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}}},Jt=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},en=function(e,t,n){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,n),e.y2=Math.max(e.y2,n),e.h=e.y2-e.y1},tn=function(e){var t=arguments.length>1&&void 0!==arguments[1]?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},nn=function(e){var t,n,r,a,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[0];if(1===i.length)t=n=r=a=i[0];else if(2===i.length)t=r=i[0],a=n=i[1];else if(4===i.length){var o=l(i,4);t=o[0],n=o[1],r=o[2],a=o[3]}return e.x1-=a,e.x2+=n,e.y1-=t,e.y2+=r,e.w=e.x2-e.x1,e.h=e.y2-e.y1,e},rn=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},an=function(e,t){return!(e.x1>t.x2)&&(!(t.x1>e.x2)&&(!(e.x2t.y2)&&!(t.y1>e.y2)))))))},on=function(e,t,n){return e.x1<=t&&t<=e.x2&&e.y1<=n&&n<=e.y2},sn=function(e,t,n,r,a,i,o){var s,l,u=arguments.length>7&&void 0!==arguments[7]?arguments[7]:"auto",c="auto"===u?Cn(a,i):u,d=a/2,h=i/2,f=(c=Math.min(c,d,h))!==d,p=c!==h;if(f){var g=r-h-o;if((s=bn(e,t,n,r,n-d+c-o,g,n+d-c+o,g,!1)).length>0)return s}if(p){var v=n+d+o;if((s=bn(e,t,n,r,v,r-h+c-o,v,r+h-c+o,!1)).length>0)return s}if(f){var y=r+h+o;if((s=bn(e,t,n,r,n-d+c-o,y,n+d-c+o,y,!1)).length>0)return s}if(p){var m=n-d-o;if((s=bn(e,t,n,r,m,r-h+c-o,m,r+h-c+o,!1)).length>0)return s}var b=n-d+c,x=r-h+c;if((l=yn(e,t,n,r,b,x,c+o)).length>0&&l[0]<=b&&l[1]<=x)return[l[0],l[1]];var w=n+d-c,E=r-h+c;if((l=yn(e,t,n,r,w,E,c+o)).length>0&&l[0]>=w&&l[1]<=E)return[l[0],l[1]];var k=n+d-c,T=r+h-c;if((l=yn(e,t,n,r,k,T,c+o)).length>0&&l[0]>=k&&l[1]>=T)return[l[0],l[1]];var C=n-d+c,P=r+h-c;return(l=yn(e,t,n,r,C,P,c+o)).length>0&&l[0]<=C&&l[1]>=P?[l[0],l[1]]:[]},ln=function(e,t,n,r,a,i,o){var s=o,l=Math.min(n,a),u=Math.max(n,a),c=Math.min(r,i),d=Math.max(r,i);return l-s<=e&&e<=u+s&&c-s<=t&&t<=d+s},un=function(e,t,n,r,a,i,o,s,l){var u=Math.min(n,o,a)-l,c=Math.max(n,o,a)+l,d=Math.min(r,s,i)-l,h=Math.max(r,s,i)+l;return!(ec||th)},cn=function(e,t,n,r,a,i,o,s){var l=[];!function(e,t,n,r,a){var i,o,s,l,u,c,d,h;0===e&&(e=1e-5),s=-27*(r/=e)+(t/=e)*(9*(n/=e)-t*t*2),i=(o=(3*n-t*t)/9)*o*o+(s/=54)*s,a[1]=0,d=t/3,i>0?(u=(u=s+Math.sqrt(i))<0?-Math.pow(-u,1/3):Math.pow(u,1/3),c=(c=s-Math.sqrt(i))<0?-Math.pow(-c,1/3):Math.pow(c,1/3),a[0]=-d+u+c,d+=(u+c)/2,a[4]=a[2]=-d,d=Math.sqrt(3)*(-c+u)/2,a[3]=d,a[5]=-d):(a[5]=a[3]=0,0===i?(h=s<0?-Math.pow(-s,1/3):Math.pow(s,1/3),a[0]=2*h-d,a[4]=a[2]=-(h+d)):(l=(o=-o)*o*o,l=Math.acos(s/Math.sqrt(l)),h=2*Math.sqrt(o),a[0]=-d+h*Math.cos(l/3),a[2]=-d+h*Math.cos((l+2*Math.PI)/3),a[4]=-d+h*Math.cos((l+4*Math.PI)/3)))}(1*n*n-4*n*a+2*n*o+4*a*a-4*a*o+o*o+r*r-4*r*i+2*r*s+4*i*i-4*i*s+s*s,9*n*a-3*n*n-3*n*o-6*a*a+3*a*o+9*r*i-3*r*r-3*r*s-6*i*i+3*i*s,3*n*n-6*n*a+n*o-n*e+2*a*a+2*a*e-o*e+3*r*r-6*r*i+r*s-r*t+2*i*i+2*i*t-s*t,1*n*a-n*n+n*e-a*e+r*i-r*r+r*t-i*t,l);for(var u=[],c=0;c<6;c+=2)Math.abs(l[c+1])<1e-7&&l[c]>=0&&l[c]<=1&&u.push(l[c]);u.push(1),u.push(0);for(var d,h,f,p=-1,g=0;g=0?fl?(e-a)*(e-a)+(t-i)*(t-i):u-d},hn=function(e,t,n){for(var r,a,i,o,s=0,l=0;l=e&&e>=i||r<=e&&e<=i))continue;(e-r)/(i-r)*(o-a)+a>t&&s++}return s%2!==0},fn=function(e,t,n,r,a,i,o,s,l){var u,c=new Array(n.length);null!=s[0]?(u=Math.atan(s[1]/s[0]),s[0]<0?u+=Math.PI/2:u=-u-Math.PI/2):u=s;for(var d,h=Math.cos(-u),f=Math.sin(-u),p=0;p0){var g=gn(c,-l);d=pn(g)}else d=c;return hn(e,t,d)},pn=function(e){for(var t,n,r,a,i,o,s,l,u=new Array(e.length/2),c=0;c=0&&p<=1&&v.push(p),g>=0&&g<=1&&v.push(g),0===v.length)return[];var y=v[0]*s[0]+e,m=v[0]*s[1]+t;return v.length>1?v[0]==v[1]?[y,m]:[y,m,v[1]*s[0]+e,v[1]*s[1]+t]:[y,m]},mn=function(e,t,n){return t<=e&&e<=n||n<=e&&e<=t?e:e<=t&&t<=n||n<=t&&t<=e?t:n},bn=function(e,t,n,r,a,i,o,s,l){var u=e-a,c=n-e,d=o-a,h=t-i,f=r-t,p=s-i,g=d*h-p*u,v=c*h-f*u,y=p*c-d*f;if(0!==y){var m=g/y,b=v/y,x=-.001;return x<=m&&m<=1.001&&x<=b&&b<=1.001||l?[e+m*c,t+m*f]:[]}return 0===g||0===v?mn(e,n,o)===o?[o,s]:mn(e,n,a)===a?[a,i]:mn(a,o,n)===n?[n,r]:[]:[]},xn=function(e,t,n,r,a,i,o,s){var l,u,c,d,h,f,p=[],g=new Array(n.length),v=!0;if(null==i&&(v=!1),v){for(var y=0;y0){var m=gn(g,-s);u=pn(m)}else u=g}else u=n;for(var b=0;bu&&(u=t)},d=function(e){return l[e]},h=0;h0?b.edgesTo(m)[0]:m.edgesTo(b)[0];var w=r(x);m=m.id(),u[m]>u[g]+w&&(u[m]=u[g]+w,h.nodes.indexOf(m)<0?h.push(m):h.updateItem(m),l[m]=0,n[m]=[]),u[m]==u[g]+w&&(l[m]=l[m]+l[g],n[m].push(g))}else for(var E=0;E0;){for(var P=t.pop(),S=0;S0&&o.push(n[s]);0!==o.length&&a.push(r.collection(o))}return a}(c,l,t,r);return b=function(e){for(var t=0;t5&&void 0!==arguments[5]?arguments[5]:Hn,o=r,s=0;s=2?Jn(e,t,n,0,Zn,$n):Jn(e,t,n,0,Gn)},squaredEuclidean:function(e,t,n){return Jn(e,t,n,0,Zn)},manhattan:function(e,t,n){return Jn(e,t,n,0,Gn)},max:function(e,t,n){return Jn(e,t,n,-1/0,Qn)}};function tr(e,t,n,r,a,i){var o;return o=G(e)?e:er[e]||er.euclidean,0===t&&G(e)?o(a,i):o(t,n,r,a,i)}er["squared-euclidean"]=er.squaredEuclidean,er.squaredeuclidean=er.squaredEuclidean;var nr=ut({k:2,m:2,sensitivityThreshold:1e-4,distance:"euclidean",maxIterations:10,attributes:[],testMode:!1,testCentroids:null}),rr=function(e){return nr(e)},ar=function(e,t,n,r,a){var i="kMedoids"!==a?function(e){return n[e]}:function(e){return r[e](n)},o=n,s=t;return tr(e,r.length,i,(function(e){return r[e](t)}),o,s)},ir=function(e,t,n){for(var r=n.length,a=new Array(r),i=new Array(r),o=new Array(t),s=null,l=0;ln)return!1}return!0},cr=function(e,t,n){for(var r=0;ra&&(a=t[l][u],i=u);o[i].push(e[l])}for(var c=0;c=a.threshold||"dendrogram"===a.mode&&1===e.length)return!1;var f,p=t[o],g=t[r[o]];f="dendrogram"===a.mode?{left:p,right:g,key:p.key}:{value:p.value.concat(g.value),key:p.key},e[p.index]=f,e.splice(g.index,1),t[p.key]=f;for(var v=0;vn[g.key][y.key]&&(i=n[g.key][y.key])):"max"===a.linkage?(i=n[p.key][y.key],n[p.key][y.key]1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length,r=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],a=!(arguments.length>5&&void 0!==arguments[5])||arguments[5];arguments.length>3&&void 0!==arguments[3]&&!arguments[3]?(n0&&e.splice(0,t)):e=e.slice(t,n);for(var i=0,o=e.length-1;o>=0;o--){var s=e[o];a?isFinite(s)||(e[o]=-1/0,i++):e.splice(o,1)}r&&e.sort((function(e,t){return e-t}));var l=e.length,u=Math.floor(l/2);return l%2!==0?e[u+1+i]:(e[u-1+i]+e[u+i])/2}(e):"mean"===t?function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length,r=0,a=0,i=t;i1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length,r=1/0,a=t;a1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length,r=-1/0,a=t;ao&&(i=l,o=t[a*e+l])}i>0&&r.push(i)}for(var u=0;u=P?(S=P,P=D,B=_):D>S&&(S=D);for(var A=0;A0?1:0;k[E%u.minIterations*t+z]=O,L+=O}if(L>0&&(E>=u.minIterations-1||E==u.maxIterations-1)){for(var V=0,F=0;F0&&r.push(a);return r}(t,i,o),q=function(e,t,n){for(var r=Br(e,t,n),a=0;al&&(s=u,l=c)}n[a]=i[s]}return Br(e,t,n)}(t,r,X),Y={},W=0;W1)}}));var l=Object.keys(t).filter((function(e){return t[e].cutVertex})).map((function(t){return e.getElementById(t)}));return{cut:e.spawn(l),components:a}},Rr=function(){var e=this,t={},n=0,r=[],a=[],i=e.spawn(e),o=function(s){if(a.push(s),t[s]={index:n,low:n++,explored:!1},e.getElementById(s).connectedEdges().intersection(e).forEach((function(e){var n=e.target().id();n!==s&&(n in t||o(n),t[n].explored||(t[s].low=Math.min(t[s].low,t[n].low)))})),t[s].index===t[s].low){for(var l=e.spawn();;){var u=a.pop();if(l.merge(e.getElementById(u)),t[u].low=t[s].index,t[u].explored=!0,u===s)break}var c=l.edgesWith(l),d=l.merge(c);r.push(d),i=i.difference(d)}};return e.forEach((function(e){if(e.isNode()){var n=e.id();n in t||o(n)}})),{cut:i,components:r}},Ir={};[bt,Bt,Dt,At,Rt,Nt,Vt,_n,Mn,In,Ln,Un,vr,Tr,_r,{hierholzer:function(e){if(!$(e)){var t=arguments;e={root:t[0],directed:t[1]}}var n,r,a,i=Ar(e),o=i.root,s=i.directed,l=this,u=!1;o&&(a=K(o)?this.filter(o)[0].id():o[0].id());var c={},d={};s?l.forEach((function(e){var t=e.id();if(e.isNode()){var a=e.indegree(!0),i=e.outdegree(!0),o=a-i,s=i-a;1==o?n?u=!0:n=t:1==s?r?u=!0:r=t:(s>1||o>1)&&(u=!0),c[t]=[],e.outgoers().forEach((function(e){e.isEdge()&&c[t].push(e.id())}))}else d[t]=[void 0,e.target().id()]})):l.forEach((function(e){var t=e.id();e.isNode()?(e.degree(!0)%2&&(n?r?u=!0:r=t:n=t),c[t]=[],e.connectedEdges().forEach((function(e){return c[t].push(e.id())}))):d[t]=[e.source().id(),e.target().id()]}));var h={found:!1,trail:void 0};if(u)return h;if(r&&n)if(s){if(a&&r!=a)return h;a=r}else{if(a&&r!=a&&n!=a)return h;a||(a=r)}else a||(a=l[0].id());var f=function(e){for(var t,n,r,a=e,i=[e];c[a].length;)t=c[a].shift(),n=d[t][0],a!=(r=d[t][1])?(c[r]=c[r].filter((function(e){return e!=t})),a=r):s||a==n||(c[n]=c[n].filter((function(e){return e!=t})),a=n),i.unshift(t),i.unshift(a);return i},p=[],g=[];for(g=f(a);1!=g.length;)0==c[g[0]].length?(p.unshift(l.getElementById(g.shift())),p.unshift(l.getElementById(g.shift()))):g=f(g.shift()).concat(g);for(var v in p.unshift(l.getElementById(g.shift())),c)if(c[v].length)return h;return h.found=!0,h.trail=this.spawn(p,!0),h}},{hopcroftTarjanBiconnected:Mr,htbc:Mr,htb:Mr,hopcroftTarjanBiconnectedComponents:Mr},{tarjanStronglyConnected:Rr,tsc:Rr,tscc:Rr,tarjanStronglyConnectedComponents:Rr}].forEach((function(e){me(Ir,e)}));var Nr=function(e){if(!(this instanceof Nr))return new Nr(e);this.id="Thenable/1.0.7",this.state=0,this.fulfillValue=void 0,this.rejectReason=void 0,this.onFulfilled=[],this.onRejected=[],this.proxy={then:this.then.bind(this)},"function"===typeof e&&e.call(this,this.fulfill.bind(this),this.reject.bind(this))};Nr.prototype={fulfill:function(e){return Lr(this,1,"fulfillValue",e)},reject:function(e){return Lr(this,2,"rejectReason",e)},then:function(e,t){var n=this,r=new Nr;return n.onFulfilled.push(Vr(e,r,"fulfill")),n.onRejected.push(Vr(t,r,"reject")),zr(n),r.proxy}};var Lr=function(e,t,n,r){return 0===e.state&&(e.state=t,e[n]=r,zr(e)),e},zr=function(e){1===e.state?Or(e,"onFulfilled",e.fulfillValue):2===e.state&&Or(e,"onRejected",e.rejectReason)},Or=function(e,t,n){if(0!==e[t].length){var r=e[t];e[t]=[];var a=function(){for(var e=0;e0:void 0}},clearQueue:function(){return function(){var e=this,t=void 0!==e.length?e:[e];if(!(this._private.cy||this).styleEnabled())return this;for(var n=0;n-1}}(),a=function(){if(Na)return Ia;Na=1;var e=_i();return Ia=function(t,n){var r=this.__data__,a=e(r,t);return a<0?(++this.size,r.push([t,n])):r[a][1]=n,this},Ia}();function i(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t-1&&t%1==0&&t0&&this.spawn(r).updateStyle().emit("class"),t},addClass:function(e){return this.toggleClass(e,!0)},hasClass:function(e){var t=this[0];return null!=t&&t._private.classes.has(e)},toggleClass:function(e,t){Z(e)||(e=e.match(/\S+/g)||[]);for(var n=this,r=void 0===t,a=[],i=0,o=n.length;i0&&this.spawn(a).updateStyle().emit("class"),n},removeClass:function(e){return this.toggleClass(e,!1)},flashClass:function(e,t){var n=this;if(null==t)t=250;else if(0===t)return n;return n.addClass(e),setTimeout((function(){n.removeClass(e)}),t),n}};vo.className=vo.classNames=vo.classes;var yo={metaChar:"[\\!\\\"\\#\\$\\%\\&\\'\\(\\)\\*\\+\\,\\.\\/\\:\\;\\<\\=\\>\\?\\@\\[\\]\\^\\`\\{\\|\\}\\~]",comparatorOp:"=|\\!=|>|>=|<|<=|\\$=|\\^=|\\*=",boolOp:"\\?|\\!|\\^",string:"\"(?:\\\\\"|[^\"])*\"|'(?:\\\\'|[^'])*'",number:he,meta:"degree|indegree|outdegree",separator:"\\s*,\\s*",descendant:"\\s+",child:"\\s+>\\s+",subject:"\\$",group:"node|edge|\\*",directedEdge:"\\s+->\\s+",undirectedEdge:"\\s+<->\\s+"};yo.variable="(?:[\\w-.]|(?:\\\\"+yo.metaChar+"))+",yo.className="(?:[\\w-]|(?:\\\\"+yo.metaChar+"))+",yo.value=yo.string+"|"+yo.number,yo.id=yo.variable,function(){var e,t,n;for(e=yo.comparatorOp.split("|"),n=0;n=0||"="!==t&&(yo.comparatorOp+="|\\!"+t)}();var mo=0,bo=1,xo=2,wo=3,Eo=4,ko=5,To=6,Co=7,Po=8,So=9,Bo=10,Do=11,_o=12,Ao=13,Mo=14,Ro=15,Io=16,No=17,Lo=18,zo=19,Oo=20,Vo=[{selector:":selected",matches:function(e){return e.selected()}},{selector:":unselected",matches:function(e){return!e.selected()}},{selector:":selectable",matches:function(e){return e.selectable()}},{selector:":unselectable",matches:function(e){return!e.selectable()}},{selector:":locked",matches:function(e){return e.locked()}},{selector:":unlocked",matches:function(e){return!e.locked()}},{selector:":visible",matches:function(e){return e.visible()}},{selector:":hidden",matches:function(e){return!e.visible()}},{selector:":transparent",matches:function(e){return e.transparent()}},{selector:":grabbed",matches:function(e){return e.grabbed()}},{selector:":free",matches:function(e){return!e.grabbed()}},{selector:":removed",matches:function(e){return e.removed()}},{selector:":inside",matches:function(e){return!e.removed()}},{selector:":grabbable",matches:function(e){return e.grabbable()}},{selector:":ungrabbable",matches:function(e){return!e.grabbable()}},{selector:":animated",matches:function(e){return e.animated()}},{selector:":unanimated",matches:function(e){return!e.animated()}},{selector:":parent",matches:function(e){return e.isParent()}},{selector:":childless",matches:function(e){return e.isChildless()}},{selector:":child",matches:function(e){return e.isChild()}},{selector:":orphan",matches:function(e){return e.isOrphan()}},{selector:":nonorphan",matches:function(e){return e.isChild()}},{selector:":compound",matches:function(e){return e.isNode()?e.isParent():e.source().isParent()||e.target().isParent()}},{selector:":loop",matches:function(e){return e.isLoop()}},{selector:":simple",matches:function(e){return e.isSimple()}},{selector:":active",matches:function(e){return e.active()}},{selector:":inactive",matches:function(e){return!e.active()}},{selector:":backgrounding",matches:function(e){return e.backgrounding()}},{selector:":nonbackgrounding",matches:function(e){return!e.backgrounding()}}].sort((function(e,t){return function(e,t){return-1*ye(e,t)}(e.selector,t.selector)})),Fo=function(){for(var e,t={},n=0;n0&&u.edgeCount>0)return at("The selector `"+e+"` is invalid because it uses both a compound selector and an edge selector"),!1;if(u.edgeCount>1)return at("The selector `"+e+"` is invalid because it uses multiple edge selectors"),!1;1===u.edgeCount&&at("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},toString:function(){if(null!=this.toStringCache)return this.toStringCache;for(var e=function(e){return null==e?"":e},t=function(t){return K(t)?'"'+t+'"':e(t)},n=function(e){return" "+e+" "},r=function(r,i){var o=r.type,s=r.value;switch(o){case mo:var l=e(s);return l.substring(0,l.length-1);case wo:var u=r.field,c=r.operator;return"["+u+n(e(c))+t(s)+"]";case ko:var d=r.operator,h=r.field;return"["+e(d)+h+"]";case Eo:return"["+r.field+"]";case To:var f=r.operator;return"[["+r.field+n(e(f))+t(s)+"]]";case Co:return s;case Po:return"#"+s;case So:return"."+s;case No:case Ro:return a(r.parent,i)+n(">")+a(r.child,i);case Lo:case Io:return a(r.ancestor,i)+" "+a(r.descendant,i);case zo:var p=a(r.left,i),g=a(r.subject,i),v=a(r.right,i);return p+(p.length>0?" ":"")+g+v;case Oo:return""}},a=function(e,t){return e.checks.reduce((function(n,a,i){return n+(t===e&&0===i?"$":"")+r(a,t)}),"")},i="",o=0;o1&&o=0&&(t=t.replace("!",""),c=!0),t.indexOf("@")>=0&&(t=t.replace("@",""),u=!0),(o||l||u)&&(a=o||s?""+e:"",i=""+n),u&&(e=a=a.toLowerCase(),n=i=i.toLowerCase()),t){case"*=":r=a.indexOf(i)>=0;break;case"$=":r=a.indexOf(i,a.length-i.length)>=0;break;case"^=":r=0===a.indexOf(i);break;case"=":r=e===n;break;case">":d=!0,r=e>n;break;case">=":d=!0,r=e>=n;break;case"<":d=!0,r=e0;){var u=a.shift();t(u),i.add(u.id()),o&&r(a,i,u)}return e}function os(e,t,n){if(n.isParent())for(var r=n._private.children,a=0;a1&&void 0!==arguments[1])||arguments[1],os)},as.forEachUp=function(e){return is(this,e,!(arguments.length>1&&void 0!==arguments[1])||arguments[1],ss)},as.forEachUpAndDown=function(e){return is(this,e,!(arguments.length>1&&void 0!==arguments[1])||arguments[1],ls)},as.ancestors=as.parents,(ts=ns={data:po.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:po.removeData({field:"data",event:"data",triggerFnName:"trigger",triggerEvent:!0,immutableKeys:{id:!0,source:!0,target:!0,parent:!0},updateStyle:!0}),scratch:po.data({field:"scratch",bindingEvent:"scratch",allowBinding:!0,allowSetting:!0,settingEvent:"scratch",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeScratch:po.removeData({field:"scratch",event:"scratch",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0}),rscratch:po.data({field:"rscratch",allowBinding:!1,allowSetting:!0,settingTriggersEvent:!1,allowGetting:!0}),removeRscratch:po.removeData({field:"rscratch",triggerEvent:!1}),id:function(){var e=this[0];if(e)return e._private.data.id}}).attr=ts.data,ts.removeAttr=ts.removeData;var us,cs,ds=ns,hs={};function fs(e){return function(t){var n=this;if(void 0===t&&(t=!0),0!==n.length&&n.isNode()&&!n.removed()){for(var r=0,a=n[0],i=a._private.edges,o=0;ot})),minIndegree:ps("indegree",(function(e,t){return et})),minOutdegree:ps("outdegree",(function(e,t){return et}))}),me(hs,{totalDegree:function(e){for(var t=0,n=this.nodes(),r=0;r0,c=u;u&&(l=l[0]);var d=c?l.position():{x:0,y:0};return a={x:s.x-d.x,y:s.y-d.y},void 0===e?a:a[e]}for(var h=0;h0,v=g;g&&(p=p[0]);var y=v?p.position():{x:0,y:0};void 0!==t?f.position(e,t+y[e]):void 0!==a&&f.position({x:a.x+y.x,y:a.y+y.y})}}else if(!i)return;return this}},us.modelPosition=us.point=us.position,us.modelPositions=us.points=us.positions,us.renderedPoint=us.renderedPosition,us.relativePoint=us.relativePosition;var ys,ms,bs=cs;ys=ms={},ms.renderedBoundingBox=function(e){var t=this.boundingBox(e),n=this.cy(),r=n.zoom(),a=n.pan(),i=t.x1*r+a.x,o=t.x2*r+a.x,s=t.y1*r+a.y,l=t.y2*r+a.y;return{x1:i,x2:o,y1:s,y2:l,w:o-i,h:l-s}},ms.dirtyCompoundBoundsCache=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=this.cy();return t.styleEnabled()&&t.hasCompoundNodes()?(this.forEachUp((function(t){if(t.isParent()){var n=t._private;n.compoundBoundsClean=!1,n.bbCache=null,e||t.emitAndNotify("bounds")}})),this):this},ms.updateCompoundBounds=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=this.cy();if(!t.styleEnabled()||!t.hasCompoundNodes())return this;if(!e&&t.batching())return this;function n(e){if(e.isParent()){var t=e._private,n=e.children(),r="include"===e.pstyle("compound-sizing-wrt-labels").value,a={width:{val:e.pstyle("min-width").pfValue,left:e.pstyle("min-width-bias-left"),right:e.pstyle("min-width-bias-right")},height:{val:e.pstyle("min-height").pfValue,top:e.pstyle("min-height-bias-top"),bottom:e.pstyle("min-height-bias-bottom")}},i=n.boundingBox({includeLabels:r,includeOverlays:!1,useCache:!1}),o=t.position;0!==i.w&&0!==i.h||((i={w:e.pstyle("width").pfValue,h:e.pstyle("height").pfValue}).x1=o.x-i.w/2,i.x2=o.x+i.w/2,i.y1=o.y-i.h/2,i.y2=o.y+i.h/2);var s=a.width.left.value;"px"===a.width.left.units&&a.width.val>0&&(s=100*s/a.width.val);var l=a.width.right.value;"px"===a.width.right.units&&a.width.val>0&&(l=100*l/a.width.val);var u=a.height.top.value;"px"===a.height.top.units&&a.height.val>0&&(u=100*u/a.height.val);var c=a.height.bottom.value;"px"===a.height.bottom.units&&a.height.val>0&&(c=100*c/a.height.val);var d=y(a.width.val-i.w,s,l),h=d.biasDiff,f=d.biasComplementDiff,p=y(a.height.val-i.h,u,c),g=p.biasDiff,v=p.biasComplementDiff;t.autoPadding=function(e,t,n,r){if("%"!==n.units)return"px"===n.units?n.pfValue:0;switch(r){case"width":return e>0?n.pfValue*e:0;case"height":return t>0?n.pfValue*t:0;case"average":return e>0&&t>0?n.pfValue*(e+t)/2:0;case"min":return e>0&&t>0?e>t?n.pfValue*t:n.pfValue*e:0;case"max":return e>0&&t>0?e>t?n.pfValue*e:n.pfValue*t:0;default:return 0}}(i.w,i.h,e.pstyle("padding"),e.pstyle("padding-relative-to").value),t.autoWidth=Math.max(i.w,a.width.val),o.x=(-h+i.x1+i.x2+f)/2,t.autoHeight=Math.max(i.h,a.height.val),o.y=(-g+i.y1+i.y2+v)/2}function y(e,t,n){var r=0,a=0,i=t+n;return e>0&&i>0&&(r=t/i*e,a=n/i*e),{biasDiff:r,biasComplementDiff:a}}}for(var r=0;re.x2?r:e.x2,e.y1=ne.y2?a:e.y2,e.w=e.x2-e.x1,e.h=e.y2-e.y1)},Es=function(e,t){return null==t?e:ws(e,t.x1,t.y1,t.x2,t.y2)},ks=function(e,t,n){return ht(e,t,n)},Ts=function(e,t,n){if(!t.cy().headless()){var r,a,i=t._private,o=i.rstyle,s=o.arrowWidth/2;if("none"!==t.pstyle(n+"-arrow-shape").value){"source"===n?(r=o.srcX,a=o.srcY):"target"===n?(r=o.tgtX,a=o.tgtY):(r=o.midX,a=o.midY);var l=i.arrowBounds=i.arrowBounds||{},u=l[n]=l[n]||{};u.x1=r-s,u.y1=a-s,u.x2=r+s,u.y2=a+s,u.w=u.x2-u.x1,u.h=u.y2-u.y1,tn(u,1),ws(e,u.x1,u.y1,u.x2,u.y2)}}},Cs=function(e,t,n){if(!t.cy().headless()){var r;r=n?n+"-":"";var a=t._private,i=a.rstyle;if(t.pstyle(r+"label").strValue){var o,s,l,u,c=t.pstyle("text-halign"),d=t.pstyle("text-valign"),h=ks(i,"labelWidth",n),f=ks(i,"labelHeight",n),p=ks(i,"labelX",n),g=ks(i,"labelY",n),v=t.pstyle(r+"text-margin-x").pfValue,y=t.pstyle(r+"text-margin-y").pfValue,m=t.isEdge(),b=t.pstyle(r+"text-rotation"),x=t.pstyle("text-outline-width").pfValue,w=t.pstyle("text-border-width").pfValue/2,E=t.pstyle("text-background-padding").pfValue,k=f,T=h,C=T/2,P=k/2;if(m)o=p-C,s=p+C,l=g-P,u=g+P;else{switch(c.value){case"left":o=p-T,s=p;break;case"center":o=p-C,s=p+C;break;case"right":o=p,s=p+T}switch(d.value){case"top":l=g-k,u=g;break;case"center":l=g-P,u=g+P;break;case"bottom":l=g,u=g+k}}var S=v-Math.max(x,w)-E-2,B=v+Math.max(x,w)+E+2,D=y-Math.max(x,w)-E-2,_=y+Math.max(x,w)+E+2;o+=S,s+=B,l+=D,u+=_;var A=n||"main",M=a.labelBounds,R=M[A]=M[A]||{};R.x1=o,R.y1=l,R.x2=s,R.y2=u,R.w=s-o,R.h=u-l,R.leftPad=S,R.rightPad=B,R.topPad=D,R.botPad=_;var I=m&&"autorotate"===b.strValue,N=null!=b.pfValue&&0!==b.pfValue;if(I||N){var L=I?ks(a.rstyle,"labelAngle",n):b.pfValue,z=Math.cos(L),O=Math.sin(L),V=(o+s)/2,F=(l+u)/2;if(!m){switch(c.value){case"left":V=s;break;case"right":V=o}switch(d.value){case"top":F=u;break;case"bottom":F=l}}var j=function(e,t){return{x:(e-=V)*z-(t-=F)*O+V,y:e*O+t*z+F}},X=j(o,l),q=j(o,u),Y=j(s,l),W=j(s,u);o=Math.min(X.x,q.x,Y.x,W.x),s=Math.max(X.x,q.x,Y.x,W.x),l=Math.min(X.y,q.y,Y.y,W.y),u=Math.max(X.y,q.y,Y.y,W.y)}var U=A+"Rot",H=M[U]=M[U]||{};H.x1=o,H.y1=l,H.x2=s,H.y2=u,H.w=s-o,H.h=u-l,ws(e,o,l,s,u),ws(a.labelBounds.all,o,l,s,u)}return e}},Ps=function(e,t){var n,r,a,i,o,s,l,u=e._private.cy,c=u.styleEnabled(),d=u.headless(),h=Qt(),f=e._private,p=e.isNode(),g=e.isEdge(),v=f.rstyle,y=p&&c?e.pstyle("bounds-expansion").pfValue:[0],m=function(e){return"none"!==e.pstyle("display").value},b=!c||m(e)&&(!g||m(e.source())&&m(e.target()));if(b){var x=0;c&&t.includeOverlays&&0!==e.pstyle("overlay-opacity").value&&(x=e.pstyle("overlay-padding").value);var w=0;c&&t.includeUnderlays&&0!==e.pstyle("underlay-opacity").value&&(w=e.pstyle("underlay-padding").value);var E=Math.max(x,w),k=0;if(c&&(k=e.pstyle("width").pfValue/2),p&&t.includeNodes){var T=e.position();o=T.x,s=T.y;var C=e.outerWidth()/2,P=e.outerHeight()/2;ws(h,n=o-C,a=s-P,r=o+C,i=s+P),c&&t.includeOutlines&&function(e,t){if(!t.cy().headless()){var n,r,a,i=t.pstyle("outline-opacity").value,o=t.pstyle("outline-width").value;if(i>0&&o>0){var s=t.pstyle("outline-offset").value,l=t.pstyle("shape").value,u=o+s,c=(e.w+2*u)/e.w,d=(e.h+2*u)/e.h,h=0;["diamond","pentagon","round-triangle"].includes(l)?(c=(e.w+2.4*u)/e.w,h=-u/3.6):["concave-hexagon","rhomboid","right-rhomboid"].includes(l)?c=(e.w+2.4*u)/e.w:"star"===l?(c=(e.w+2.8*u)/e.w,d=(e.h+2.6*u)/e.h,h=-u/3.8):"triangle"===l?(c=(e.w+2.8*u)/e.w,d=(e.h+2.4*u)/e.h,h=-u/1.4):"vee"===l&&(c=(e.w+4.4*u)/e.w,d=(e.h+3.8*u)/e.h,h=.5*-u);var f=e.h*d-e.h,p=e.w*c-e.w;if(nn(e,[Math.ceil(f/2),Math.ceil(p/2)]),0!==h){var g=(r=0,a=h,{x1:(n=e).x1+r,x2:n.x2+r,y1:n.y1+a,y2:n.y2+a,w:n.w,h:n.h});Jt(e,g)}}}}(h,e)}else if(g&&t.includeEdges)if(c&&!d){var S=e.pstyle("curve-style").strValue;if(n=Math.min(v.srcX,v.midX,v.tgtX),r=Math.max(v.srcX,v.midX,v.tgtX),a=Math.min(v.srcY,v.midY,v.tgtY),i=Math.max(v.srcY,v.midY,v.tgtY),ws(h,n-=k,a-=k,r+=k,i+=k),"haystack"===S){var B=v.haystackPts;if(B&&2===B.length){if(n=B[0].x,a=B[0].y,n>(r=B[1].x)){var D=n;n=r,r=D}if(a>(i=B[1].y)){var _=a;a=i,i=_}ws(h,n-k,a-k,r+k,i+k)}}else if("bezier"===S||"unbundled-bezier"===S||S.endsWith("segments")||S.endsWith("taxi")){var A;switch(S){case"bezier":case"unbundled-bezier":A=v.bezierPts;break;case"segments":case"taxi":case"round-segments":case"round-taxi":A=v.linePts}if(null!=A)for(var M=0;M(r=N.x)){var L=n;n=r,r=L}if((a=I.y)>(i=N.y)){var z=a;a=i,i=z}ws(h,n-=k,a-=k,r+=k,i+=k)}if(c&&t.includeEdges&&g&&(Ts(h,e,"mid-source"),Ts(h,e,"mid-target"),Ts(h,e,"source"),Ts(h,e,"target")),c)if("yes"===e.pstyle("ghost").value){var O=e.pstyle("ghost-offset-x").pfValue,V=e.pstyle("ghost-offset-y").pfValue;ws(h,h.x1+O,h.y1+V,h.x2+O,h.y2+V)}var F=f.bodyBounds=f.bodyBounds||{};rn(F,h),nn(F,y),tn(F,1),c&&(n=h.x1,r=h.x2,a=h.y1,i=h.y2,ws(h,n-E,a-E,r+E,i+E));var j=f.overlayBounds=f.overlayBounds||{};rn(j,h),nn(j,y),tn(j,1);var X=f.labelBounds=f.labelBounds||{};null!=X.all?((l=X.all).x1=1/0,l.y1=1/0,l.x2=-1/0,l.y2=-1/0,l.w=0,l.h=0):X.all=Qt(),c&&t.includeLabels&&(t.includeMainLabels&&Cs(h,e,null),g&&(t.includeSourceLabels&&Cs(h,e,"source"),t.includeTargetLabels&&Cs(h,e,"target")))}return h.x1=xs(h.x1),h.y1=xs(h.y1),h.x2=xs(h.x2),h.y2=xs(h.y2),h.w=xs(h.x2-h.x1),h.h=xs(h.y2-h.y1),h.w>0&&h.h>0&&b&&(nn(h,y),tn(h,1)),h},Ss=function(e){var t=0,n=function(e){return(e?1:0)<0&&void 0!==arguments[0]?arguments[0]:Hs,t=arguments.length>1?arguments[1]:void 0,n=0;n=0;s--)o(s);return this},Gs.removeAllListeners=function(){return this.removeListener("*")},Gs.emit=Gs.trigger=function(e,t,n){var r=this.listeners,a=r.length;return this.emitting++,Z(t)||(t=[t]),Qs(this,(function(e,i){null!=n&&(r=[{event:i.event,type:i.type,namespace:i.namespace,callback:n}],a=r.length);for(var o=function(){var n=r[s];if(n.type===i.type&&(!n.namespace||n.namespace===i.namespace||".*"===n.namespace)&&e.eventMatches(e.context,n,i)){var a=[i];null!=t&&function(e,t){for(var n=0;n1&&!r){var a=this.length-1,i=this[a],o=i._private.data.id;this[a]=void 0,this[e]=i,n.set(o,{ele:i,index:e})}return this.length--,this},unmergeOne:function(e){e=e[0];var t=this._private,n=e._private.data.id,r=t.map.get(n);if(!r)return this;var a=r.index;return this.unmergeAt(a),this},unmerge:function(e){var t=this._private.cy;if(!e)return this;if(e&&K(e)){var n=e;e=t.mutableElements().filter(n)}for(var r=0;r=0;t--){e(this[t])&&this.unmergeAt(t)}return this},map:function(e,t){for(var n=[],r=this,a=0;ar&&(r=s,n=o)}return{value:r,ele:n}},min:function(e,t){for(var n,r=1/0,a=this,i=0;i=0&&a1&&void 0!==arguments[1])||arguments[1],n=this[0],r=n.cy();if(r.styleEnabled()&&n){n._private.styleDirty&&(n._private.styleDirty=!1,r.style().apply(n));var a=n._private.style[e];return null!=a?a:t?r.style().getDefaultProperty(e):null}},numericStyle:function(e){var t=this[0];if(t.cy().styleEnabled()&&t){var n=t.pstyle(e);return void 0!==n.pfValue?n.pfValue:n.value}},numericStyleUnits:function(e){var t=this[0];if(t.cy().styleEnabled())return t?t.pstyle(e).units:void 0},renderedStyle:function(e){var t=this.cy();if(!t.styleEnabled())return this;var n=this[0];return n?t.style().getRenderedStyle(n,e):void 0},style:function(e,t){var n=this.cy();if(!n.styleEnabled())return this;var r=!1,a=n.style();if($(e)){var i=e;a.applyBypass(this,i,r),this.emitAndNotify("style")}else if(K(e)){if(void 0===t){var o=this[0];return o?a.getStylePropertyValue(o,e):void 0}a.applyBypass(this,e,t,r),this.emitAndNotify("style")}else if(void 0===e){var s=this[0];return s?a.getRawStyle(s):void 0}return this},removeStyle:function(e){var t=this.cy();if(!t.styleEnabled())return this;var n=!1,r=t.style(),a=this;if(void 0===e)for(var i=0;i0&&t.push(c[0]),t.push(s[0])}return this.spawn(t,!0).filter(e)}),"neighborhood"),closedNeighborhood:function(e){return this.neighborhood().add(this).filter(e)},openNeighborhood:function(e){return this.neighborhood(e)}}),El.neighbourhood=El.neighborhood,El.closedNeighbourhood=El.closedNeighborhood,El.openNeighbourhood=El.openNeighborhood,me(El,{source:rs((function(e){var t,n=this[0];return n&&(t=n._private.source||n.cy().collection()),t&&e?t.filter(e):t}),"source"),target:rs((function(e){var t,n=this[0];return n&&(t=n._private.target||n.cy().collection()),t&&e?t.filter(e):t}),"target"),sources:Pl({attr:"source"}),targets:Pl({attr:"target"})}),me(El,{edgesWith:rs(Sl(),"edgesWith"),edgesTo:rs(Sl({thisIsSrc:!0}),"edgesTo")}),me(El,{connectedEdges:rs((function(e){for(var t=[],n=0;n0);return i},component:function(){var e=this[0];return e.cy().mutableElements().components(e)[0]}}),El.componentsOf=El.components;var Dl=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],r=arguments.length>3&&void 0!==arguments[3]&&arguments[3];if(void 0!==e){var a=new pt,i=!1;if(t){if(t.length>0&&$(t[0])&&!te(t[0])){i=!0;for(var o=[],s=new vt,l=0,u=t.length;l0&&void 0!==arguments[0])||arguments[0],r=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],a=this,i=a.cy(),o=i._private,s=[],l=[],u=0,c=a.length;u0){for(var I=e.length===a.length?a:new Dl(i,e),N=0;N0&&void 0!==arguments[0])||arguments[0],t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=this,r=[],a={},i=n._private.cy;function o(e){var n=a[e.id()];t&&e.removed()||n||(a[e.id()]=!0,e.isNode()?(r.push(e),function(e){for(var t=e._private.edges,n=0;n0&&(e?k.emitAndNotify("remove"):t&&k.emit("remove"));for(var T=0;T=.001?function(t,r){for(var a=0;a<4;++a){var i=h(r,e,n);if(0===i)return r;r-=(d(r,e,n)-t)/i}return r}(t,o):0===l?o:function(t,r,a){var i,o,s=0;do{(i=d(o=r+(a-r)/2,e,n)-t)>0?a=o:r=o}while(Math.abs(i)>1e-7&&++s<10);return o}(t,r,r+a)}var p=!1;function g(){p=!0,e===t&&n===r||function(){for(var t=0;t<11;++t)s[t]=d(t*a,e,n)}()}var v=function(a){return p||g(),e===t&&n===r?a:0===a?0:1===a?1:d(f(a),t,r)};v.getControlPoints=function(){return[{x:e,y:t},{x:n,y:r}]};var y="generateBezier("+[e,t,n,r]+")";return v.toString=function(){return y},v}var Rl=function(){function e(e){return-e.tension*e.x-e.friction*e.v}function t(t,n,r){var a={x:t.x+r.dx*n,v:t.v+r.dv*n,tension:t.tension,friction:t.friction};return{dx:a.v,dv:e(a)}}function n(n,r){var a={dx:n.v,dv:e(n)},i=t(n,.5*r,a),o=t(n,.5*r,i),s=t(n,r,o),l=1/6*(a.dx+2*(i.dx+o.dx)+s.dx),u=1/6*(a.dv+2*(i.dv+o.dv)+s.dv);return n.x=n.x+l*r,n.v=n.v+u*r,n}return function e(t,r,a){var i,o,s,l={x:-1,v:0,tension:null,friction:null},u=[0],c=0,d=1e-4;for(t=parseFloat(t)||500,r=parseFloat(r)||20,a=a||null,l.tension=t,l.friction=r,o=(i=null!==a)?(c=e(t,r))/a*.016:.016;s=n(s||l,o),u.push(1+s.x),c+=16,Math.abs(s.x)>d&&Math.abs(s.v)>d;);return i?function(e){return u[e*(u.length-1)|0]}:c}}(),Il=function(e,t,n,r){var a=Ml(e,t,n,r);return function(e,t,n){return e+(t-e)*a(n)}},Nl={linear:function(e,t,n){return e+(t-e)*n},ease:Il(.25,.1,.25,1),"ease-in":Il(.42,0,1,1),"ease-out":Il(0,0,.58,1),"ease-in-out":Il(.42,0,.58,1),"ease-in-sine":Il(.47,0,.745,.715),"ease-out-sine":Il(.39,.575,.565,1),"ease-in-out-sine":Il(.445,.05,.55,.95),"ease-in-quad":Il(.55,.085,.68,.53),"ease-out-quad":Il(.25,.46,.45,.94),"ease-in-out-quad":Il(.455,.03,.515,.955),"ease-in-cubic":Il(.55,.055,.675,.19),"ease-out-cubic":Il(.215,.61,.355,1),"ease-in-out-cubic":Il(.645,.045,.355,1),"ease-in-quart":Il(.895,.03,.685,.22),"ease-out-quart":Il(.165,.84,.44,1),"ease-in-out-quart":Il(.77,0,.175,1),"ease-in-quint":Il(.755,.05,.855,.06),"ease-out-quint":Il(.23,1,.32,1),"ease-in-out-quint":Il(.86,0,.07,1),"ease-in-expo":Il(.95,.05,.795,.035),"ease-out-expo":Il(.19,1,.22,1),"ease-in-out-expo":Il(1,0,0,1),"ease-in-circ":Il(.6,.04,.98,.335),"ease-out-circ":Il(.075,.82,.165,1),"ease-in-out-circ":Il(.785,.135,.15,.86),spring:function(e,t,n){if(0===n)return Nl.linear;var r=Rl(e,t,n);return function(e,t,n){return e+(t-e)*r(n)}},"cubic-bezier":Il};function Ll(e,t,n,r,a){if(1===r)return n;if(t===n)return n;var i=a(t,n,r);return null==e||((e.roundValue||e.color)&&(i=Math.round(i)),void 0!==e.min&&(i=Math.max(i,e.min)),void 0!==e.max&&(i=Math.min(i,e.max))),i}function zl(e,t){return null!=e.pfValue||null!=e.value?null==e.pfValue||null!=t&&"%"===t.type.units?e.value:e.pfValue:e}function Ol(e,t,n,r,a){var i=null!=a?a.type:null;n<0?n=0:n>1&&(n=1);var o=zl(e,a),s=zl(t,a);if(Q(o)&&Q(s))return Ll(i,o,s,n,r);if(Z(o)&&Z(s)){for(var l=[],u=0;u0?("spring"===d&&h.push(o.duration),o.easingImpl=Nl[d].apply(null,h)):o.easingImpl=Nl[d]}var f,p=o.easingImpl;if(f=0===o.duration?1:(n-l)/o.duration,o.applying&&(f=o.progress),f<0?f=0:f>1&&(f=1),null==o.delay){var g=o.startPosition,v=o.position;if(v&&a&&!e.locked()){var y={};Fl(g.x,v.x)&&(y.x=Ol(g.x,v.x,f,p)),Fl(g.y,v.y)&&(y.y=Ol(g.y,v.y,f,p)),e.position(y)}var m=o.startPan,b=o.pan,x=i.pan,w=null!=b&&r;w&&(Fl(m.x,b.x)&&(x.x=Ol(m.x,b.x,f,p)),Fl(m.y,b.y)&&(x.y=Ol(m.y,b.y,f,p)),e.emit("pan"));var E=o.startZoom,k=o.zoom,T=null!=k&&r;T&&(Fl(E,k)&&(i.zoom=$t(i.minZoom,Ol(E,k,f,p),i.maxZoom)),e.emit("zoom")),(w||T)&&e.emit("viewport");var C=o.style;if(C&&C.length>0&&a){for(var P=0;P=0;t--){(0,e[t])()}e.splice(0,e.length)},c=i.length-1;c>=0;c--){var d=i[c],h=d._private;h.stopped?(i.splice(c,1),h.hooked=!1,h.playing=!1,h.started=!1,u(h.frames)):(h.playing||h.applying)&&(h.playing&&h.applying&&(h.applying=!1),h.started||jl(0,d,e),Vl(t,d,e,n),h.applying&&(h.applying=!1),u(h.frames),null!=h.step&&h.step(e),d.completed()&&(i.splice(c,1),h.hooked=!1,h.playing=!1,h.started=!1,u(h.completes)),s=!0)}return n||0!==i.length||0!==o.length||r.push(t),s}for(var i=!1,o=0;o0?t.notify("draw",n):t.notify("draw")),n.unmerge(r),t.emit("step")}var ql={animate:po.animate(),animation:po.animation(),animated:po.animated(),clearQueue:po.clearQueue(),delay:po.delay(),delayAnimation:po.delayAnimation(),stop:po.stop(),addToAnimationPool:function(e){this.styleEnabled()&&this._private.aniEles.merge(e)},stopAnimationLoop:function(){this._private.animationsRunning=!1},startAnimationLoop:function(){var e=this;if(e._private.animationsRunning=!0,e.styleEnabled()){var t=e.renderer();t&&t.beforeRender?t.beforeRender((function(t,n){Xl(n,e)}),t.beforeRenderPriorities.animations):function t(){e._private.animationsRunning&&Ne((function(n){Xl(n,e),t()}))}()}}},Yl={qualifierCompare:function(e,t){return null==e||null==t?null==e&&null==t:e.sameText(t)},eventMatches:function(e,t,n){var r=t.qualifier;return null==r||e!==n.target&&te(n.target)&&r.matches(n.target)},addEventFields:function(e,t){t.cy=e,t.target=e},callbackContext:function(e,t,n){return null!=t.qualifier?n.target:e}},Wl=function(e){return K(e)?new Qo(e):e},Ul={createEmitter:function(){var e=this._private;return e.emitter||(e.emitter=new Ks(Yl,this)),this},emitter:function(){return this._private.emitter},on:function(e,t,n){return this.emitter().on(e,Wl(t),n),this},removeListener:function(e,t,n){return this.emitter().removeListener(e,Wl(t),n),this},removeAllListeners:function(){return this.emitter().removeAllListeners(),this},one:function(e,t,n){return this.emitter().one(e,Wl(t),n),this},once:function(e,t,n){return this.emitter().one(e,Wl(t),n),this},emit:function(e,t){return this.emitter().emit(e,t),this},emitAndNotify:function(e,t){return this.emit(e),this.notify(e,t),this}};po.eventAliasesOn(Ul);var Hl={png:function(e){return e=e||{},this._private.renderer.png(e)},jpg:function(e){var t=this._private.renderer;return(e=e||{}).bg=e.bg||"#fff",t.jpg(e)}};Hl.jpeg=Hl.jpg;var Kl={layout:function(e){var t=this;if(null!=e)if(null!=e.name){var n=e.name,r=t.extension("layout",n);if(null!=r){var a;a=K(e.eles)?t.$(e.eles):null!=e.eles?e.eles:t.$();var i=new r(me({},e,{cy:t,eles:a}));return i}nt("No such layout `"+n+"` found. Did you forget to import it and `cytoscape.use()` it?")}else nt("A `name` must be specified to make a layout");else nt("Layout options must be specified to make a layout")}};Kl.createLayout=Kl.makeLayout=Kl.layout;var Gl={notify:function(e,t){var n=this._private;if(this.batching()){n.batchNotifications=n.batchNotifications||{};var r=n.batchNotifications[e]=n.batchNotifications[e]||this.collection();null!=t&&r.merge(t)}else if(n.notificationsEnabled){var a=this.renderer();!this.destroyed()&&a&&a.notify(e,t)}},notifications:function(e){var t=this._private;return void 0===e?t.notificationsEnabled:(t.notificationsEnabled=!!e,this)},noNotifications:function(e){this.notifications(!1),e(),this.notifications(!0)},batching:function(){return this._private.batchCount>0},startBatch:function(){var e=this._private;return null==e.batchCount&&(e.batchCount=0),0===e.batchCount&&(e.batchStyleEles=this.collection(),e.batchNotifications={}),e.batchCount++,this},endBatch:function(){var e=this._private;if(0===e.batchCount)return this;if(e.batchCount--,0===e.batchCount){e.batchStyleEles.updateStyle();var t=this.renderer();Object.keys(e.batchNotifications).forEach((function(n){var r=e.batchNotifications[n];r.empty()?t.notify(n):t.notify(n,r)}))}return this},batch:function(e){return this.startBatch(),e(),this.endBatch(),this},batchData:function(e){var t=this;return this.batch((function(){for(var n=Object.keys(e),r=0;r0;)t.removeChild(t.childNodes[0]);e._private.renderer=null,e.mutableElements().forEach((function(e){var t=e._private;t.rscratch={},t.rstyle={},t.animation.current=[],t.animation.queue=[]}))},onRender:function(e){return this.on("render",e)},offRender:function(e){return this.off("render",e)}};$l.invalidateDimensions=$l.resize;var Ql={collection:function(e,t){return K(e)?this.$(e):ee(e)?e.collection():Z(e)?(t||(t={}),new Dl(this,e,t.unique,t.removed)):new Dl(this)},nodes:function(e){var t=this.$((function(e){return e.isNode()}));return e?t.filter(e):t},edges:function(e){var t=this.$((function(e){return e.isEdge()}));return e?t.filter(e):t},$:function(e){var t=this._private.elements;return e?t.filter(e):t.spawnSelf()},mutableElements:function(){return this._private.elements}};Ql.elements=Ql.filter=Ql.$;var Jl={},eu="t";Jl.apply=function(e){for(var t=this,n=t._private.cy.collection(),r=0;r0;if(h||d&&f){var p=void 0;h&&f||h?p=u.properties:f&&(p=u.mappedProperties);for(var g=0;g1&&(v=1),s.color){var w=a.valueMin[0],E=a.valueMax[0],k=a.valueMin[1],T=a.valueMax[1],C=a.valueMin[2],P=a.valueMax[2],S=null==a.valueMin[3]?1:a.valueMin[3],B=null==a.valueMax[3]?1:a.valueMax[3],D=[Math.round(w+(E-w)*v),Math.round(k+(T-k)*v),Math.round(C+(P-C)*v),Math.round(S+(B-S)*v)];n={bypass:a.bypass,name:a.name,value:D,strValue:"rgb("+D[0]+", "+D[1]+", "+D[2]+")"}}else{if(!s.number)return!1;var _=a.valueMin+(a.valueMax-a.valueMin)*v;n=this.parse(a.name,_,a.bypass,h)}if(!n)return g(),!1;n.mapping=a,a=n;break;case o.data:for(var A=a.field.split("."),M=d.data,R=0;R0&&i>0){for(var s={},l=!1,u=0;u0?e.delayAnimation(o).play().promise().then(t):t()})).then((function(){return e.animation({style:s,duration:i,easing:e.pstyle("transition-timing-function").value,queue:!1}).play().promise()})).then((function(){n.removeBypasses(e,a),e.emitAndNotify("style"),r.transitioning=!1}))}else r.transitioning&&(this.removeBypasses(e,a),e.emitAndNotify("style"),r.transitioning=!1)},Jl.checkTrigger=function(e,t,n,r,a,i){var o=this.properties[t],s=a(o);e.removed()||null!=s&&s(n,r,e)&&i(o)},Jl.checkZOrderTrigger=function(e,t,n,r){var a=this;this.checkTrigger(e,t,n,r,(function(e){return e.triggersZOrder}),(function(){a._private.cy.notify("zorder",e)}))},Jl.checkBoundsTrigger=function(e,t,n,r){this.checkTrigger(e,t,n,r,(function(e){return e.triggersBounds}),(function(t){e.dirtyCompoundBoundsCache(),e.dirtyBoundingBoxCache()}))},Jl.checkConnectedEdgesBoundsTrigger=function(e,t,n,r){this.checkTrigger(e,t,n,r,(function(e){return e.triggersBoundsOfConnectedEdges}),(function(t){e.connectedEdges().forEach((function(e){e.dirtyBoundingBoxCache()}))}))},Jl.checkParallelEdgesBoundsTrigger=function(e,t,n,r){this.checkTrigger(e,t,n,r,(function(e){return e.triggersBoundsOfParallelEdges}),(function(t){e.parallelEdges().forEach((function(e){e.dirtyBoundingBoxCache()}))}))},Jl.checkTriggers=function(e,t,n,r){e.dirtyStyleCache(),this.checkZOrderTrigger(e,t,n,r),this.checkBoundsTrigger(e,t,n,r),this.checkConnectedEdgesBoundsTrigger(e,t,n,r),this.checkParallelEdgesBoundsTrigger(e,t,n,r)};var tu={applyBypass:function(e,t,n,r){var a=[];if("*"===t||"**"===t){if(void 0!==n)for(var i=0;it.length?i.substr(t.length):""}function s(){n=n.length>r.length?n.substr(r.length):""}for(i=i.replace(/[/][*](\s|.)+?[*][/]/g,"");;){if(i.match(/^\s*$/))break;var l=i.match(/^\s*((?:.|\s)+?)\s*\{((?:.|\s)+?)\}/);if(!l){at("Halting stylesheet parsing: String stylesheet contains more to parse but no selector and block found in: "+i);break}t=l[0];var u=l[1];if("core"!==u)if(new Qo(u).invalid){at("Skipping parsing of block: Invalid selector found in string stylesheet: "+u),o();continue}var c=l[2],d=!1;n=c;for(var h=[];;){if(n.match(/^\s*$/))break;var f=n.match(/^\s*(.+?)\s*:\s*(.+?)(?:\s*;|\s*$)/);if(!f){at("Skipping parsing of block: Invalid formatting of style property and value definitions found in:"+c),d=!0;break}r=f[0];var p=f[1],g=f[2];if(this.properties[p])a.parse(p,g)?(h.push({name:p,val:g}),s()):(at("Skipping property: Invalid property definition in: "+r),s());else at("Skipping property: Invalid property name in: "+r),s()}if(d){o();break}a.selector(u);for(var v=0;v=7&&"d"===t[0]&&(u=new RegExp(s.data.regex).exec(t))){if(n)return!1;var h=s.data;return{name:e,value:u,strValue:""+t,mapped:h,field:u[1],bypass:n}}if(t.length>=10&&"m"===t[0]&&(c=new RegExp(s.mapData.regex).exec(t))){if(n)return!1;if(d.multiple)return!1;var f=s.mapData;if(!d.color&&!d.number)return!1;var p=this.parse(e,c[4]);if(!p||p.mapped)return!1;var g=this.parse(e,c[5]);if(!g||g.mapped)return!1;if(p.pfValue===g.pfValue||p.strValue===g.strValue)return at("`"+e+": "+t+"` is not a valid mapper because the output range is zero; converting to `"+e+": "+p.strValue+"`"),this.parse(e,p.strValue);if(d.color){var v=p.value,y=g.value;if(v[0]===y[0]&&v[1]===y[1]&&v[2]===y[2]&&(v[3]===y[3]||(null==v[3]||1===v[3])&&(null==y[3]||1===y[3])))return!1}return{name:e,value:c,strValue:""+t,mapped:f,field:c[1],fieldMin:parseFloat(c[2]),fieldMax:parseFloat(c[3]),valueMin:p.value,valueMax:g.value,bypass:n}}}if(d.multiple&&"multiple"!==r){var m;if(m=l?t.split(/\s+/):Z(t)?t:[t],d.evenMultiple&&m.length%2!==0)return null;for(var b=[],x=[],w=[],E="",k=!1,T=0;T0?" ":"")+C.strValue}return d.validate&&!d.validate(b,x)?null:d.singleEnum&&k?1===b.length&&K(b[0])?{name:e,value:b[0],strValue:b[0],bypass:n}:null:{name:e,value:b,pfValue:w,strValue:E,bypass:n,units:x}}var P,S,B=function(){for(var r=0;rd.max||d.strictMax&&t===d.max))return null;var R={name:e,value:t,strValue:""+t+(D||""),units:D,bypass:n};return d.unitless||"px"!==D&&"em"!==D?R.pfValue=t:R.pfValue="px"!==D&&D?this.getEmSizeInPixels()*t:t,"ms"!==D&&"s"!==D||(R.pfValue="ms"===D?t:1e3*t),"deg"!==D&&"rad"!==D||(R.pfValue="rad"===D?t:(P=t,Math.PI*P/180)),"%"===D&&(R.pfValue=t/100),R}if(d.propList){var I=[],N=""+t;if("none"===N);else{for(var L=N.split(/\s*,\s*|\s+/),z=0;z0&&l>0&&!isNaN(n.w)&&!isNaN(n.h)&&n.w>0&&n.h>0)return{zoom:o=(o=(o=Math.min((s-2*t)/n.w,(l-2*t)/n.h))>this._private.maxZoom?this._private.maxZoom:o)=n.minZoom&&(n.maxZoom=t),this},minZoom:function(e){return void 0===e?this._private.minZoom:this.zoomRange({min:e})},maxZoom:function(e){return void 0===e?this._private.maxZoom:this.zoomRange({max:e})},getZoomedViewport:function(e){var t,n,r=this._private,a=r.pan,i=r.zoom,o=!1;if(r.zoomingEnabled||(o=!0),Q(e)?n=e:$(e)&&(n=e.level,null!=e.position?t=Ft(e.position,i,a):null!=e.renderedPosition&&(t=e.renderedPosition),null==t||r.panningEnabled||(o=!0)),n=(n=n>r.maxZoom?r.maxZoom:n)t.maxZoom||!t.zoomingEnabled?i=!0:(t.zoom=s,a.push("zoom"))}if(r&&(!i||!e.cancelOnFailedZoom)&&t.panningEnabled){var l=e.pan;Q(l.x)&&(t.pan.x=l.x,o=!1),Q(l.y)&&(t.pan.y=l.y,o=!1),o||a.push("pan")}return a.length>0&&(a.push("viewport"),this.emit(a.join(" ")),this.notify("viewport")),this},center:function(e){var t=this.getCenterPan(e);return t&&(this._private.pan=t,this.emit("pan viewport"),this.notify("viewport")),this},getCenterPan:function(e,t){if(this._private.panningEnabled){if(K(e)){var n=e;e=this.mutableElements().filter(n)}else ee(e)||(e=this.mutableElements());if(0!==e.length){var r=e.boundingBox(),a=this.width(),i=this.height();return{x:(a-(t=void 0===t?this._private.zoom:t)*(r.x1+r.x2))/2,y:(i-t*(r.y1+r.y2))/2}}}},reset:function(){return this._private.panningEnabled&&this._private.zoomingEnabled?(this.viewport({pan:{x:0,y:0},zoom:1}),this):this},invalidateSize:function(){this._private.sizeCache=null},size:function(){var e=this._private,t=e.container,n=this;return e.sizeCache=e.sizeCache||(t?function(){var e=n.window().getComputedStyle(t),r=function(t){return parseFloat(e.getPropertyValue(t))};return{width:t.clientWidth-r("padding-left")-r("padding-right"),height:t.clientHeight-r("padding-top")-r("padding-bottom")}}():{width:1,height:1})},width:function(){return this.size().width},height:function(){return this.size().height},extent:function(){var e=this._private.pan,t=this._private.zoom,n=this.renderedExtent(),r={x1:(n.x1-e.x)/t,x2:(n.x2-e.x)/t,y1:(n.y1-e.y)/t,y2:(n.y2-e.y)/t};return r.w=r.x2-r.x1,r.h=r.y2-r.y1,r},renderedExtent:function(){var e=this.width(),t=this.height();return{x1:0,y1:0,x2:e,y2:t,w:e,h:t}},multiClickDebounceTime:function(e){return e?(this._private.multiClickDebounceTime=e,this):this._private.multiClickDebounceTime}};du.centre=du.center,du.autolockNodes=du.autolock,du.autoungrabifyNodes=du.autoungrabify;var hu={data:po.data({field:"data",bindingEvent:"data",allowBinding:!0,allowSetting:!0,settingEvent:"data",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeData:po.removeData({field:"data",event:"data",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0}),scratch:po.data({field:"scratch",bindingEvent:"scratch",allowBinding:!0,allowSetting:!0,settingEvent:"scratch",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeScratch:po.removeData({field:"scratch",event:"scratch",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0})};hu.attr=hu.data,hu.removeAttr=hu.removeData;var fu=function(e){var t=this,n=(e=me({},e)).container;n&&!J(n)&&J(n[0])&&(n=n[0]);var r=n?n._cyreg:null;(r=r||{})&&r.cy&&(r.cy.destroy(),r={});var a=r.readies=r.readies||[];n&&(n._cyreg=r),r.cy=t;var i=void 0!==f&&void 0!==n&&!e.headless,o=e;o.layout=me({name:i?"grid":"null"},o.layout),o.renderer=me({name:i?"canvas":"null"},o.renderer);var s=function(e,t,n){return void 0!==t?t:void 0!==n?n:e},l=this._private={container:n,ready:!1,options:o,elements:new Dl(this),listeners:[],aniEles:new Dl(this),data:o.data||{},scratch:{},layout:null,renderer:null,destroyed:!1,notificationsEnabled:!0,minZoom:1e-50,maxZoom:1e50,zoomingEnabled:s(!0,o.zoomingEnabled),userZoomingEnabled:s(!0,o.userZoomingEnabled),panningEnabled:s(!0,o.panningEnabled),userPanningEnabled:s(!0,o.userPanningEnabled),boxSelectionEnabled:s(!0,o.boxSelectionEnabled),autolock:s(!1,o.autolock,o.autolockNodes),autoungrabify:s(!1,o.autoungrabify,o.autoungrabifyNodes),autounselectify:s(!1,o.autounselectify),styleEnabled:void 0===o.styleEnabled?i:o.styleEnabled,zoom:Q(o.zoom)?o.zoom:1,pan:{x:$(o.pan)&&Q(o.pan.x)?o.pan.x:0,y:$(o.pan)&&Q(o.pan.y)?o.pan.y:0},animation:{current:[],queue:[]},hasCompoundNodes:!1,multiClickDebounceTime:s(250,o.multiClickDebounceTime)};this.createEmitter(),this.selectionType(o.selectionType),this.zoomRange({min:o.minZoom,max:o.maxZoom});l.styleEnabled&&t.setStyle([]);var u=me({},o,o.renderer);t.initRenderer(u);!function(e,t){if(e.some(oe))return jr.all(e).then(t);t(e)}([o.style,o.elements],(function(e){var n=e[0],i=e[1];l.styleEnabled&&t.style().append(n),function(e,n,r){t.notifications(!1);var a=t.mutableElements();a.length>0&&a.remove(),null!=e&&($(e)||Z(e))&&t.add(e),t.one("layoutready",(function(e){t.notifications(!0),t.emit(e),t.one("load",n),t.emitAndNotify("load")})).one("layoutstop",(function(){t.one("done",r),t.emit("done")}));var i=me({},t._private.options.layout);i.eles=t.elements(),t.layout(i).run()}(i,(function(){t.startAnimationLoop(),l.ready=!0,G(o.ready)&&t.on("ready",o.ready);for(var e=0;e0,l=!!t.boundingBox,u=n.extent(),c=Qt(l?t.boundingBox:{x1:u.x1,y1:u.y1,w:u.w,h:u.h});if(ee(t.roots))e=t.roots;else if(Z(t.roots)){for(var d=[],h=0;h0;){var D=P.shift(),_=C(D,S);if(_)D.outgoers().filter((function(e){return e.isNode()&&r.has(e)})).forEach(B);else if(null===_){at("Detected double maximal shift for node `"+D.id()+"`. Bailing maximal adjustment due to cycle. Use `options.maximal: true` only on DAGs.");break}}}var A=0;if(t.avoidOverlap)for(var M=0;M0&&m[0].length<=3?i/2:0),s=2*Math.PI/m[r].length*a;return 0===r&&1===m[0].length&&(o=1),{x:W+o*Math.cos(s),y:U+o*Math.sin(s)}}var u=m[r].length,d=Math.max(1===u?0:l?(c.w-2*t.padding-H.w)/((t.grid?$:u)-1):(c.w-2*t.padding-H.w)/((t.grid?$:u)+1),A);return{x:W+(a+1-(u+1)/2)*d,y:U+(r+1-(V+1)/2)*G}})),this};var xu={fit:!0,padding:30,boundingBox:void 0,avoidOverlap:!0,nodeDimensionsIncludeLabels:!1,spacingFactor:void 0,radius:void 0,startAngle:1.5*Math.PI,sweep:void 0,clockwise:!0,sort:void 0,animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:function(e,t){return!0},ready:void 0,stop:void 0,transform:function(e,t){return t}};function wu(e){this.options=me({},xu,e)}wu.prototype.run=function(){var e=this.options,t=e,n=e.cy,r=t.eles,a=void 0!==t.counterclockwise?!t.counterclockwise:t.clockwise,i=r.nodes().not(":parent");t.sort&&(i=i.sort(t.sort));for(var o,s=Qt(t.boundingBox?t.boundingBox:{x1:0,y1:0,w:n.width(),h:n.height()}),l=s.x1+s.w/2,u=s.y1+s.h/2,c=(void 0===t.sweep?2*Math.PI-2*Math.PI/i.length:t.sweep)/Math.max(1,i.length-1),d=0,h=0;h1&&t.avoidOverlap){d*=1.75;var v=Math.cos(c)-Math.cos(0),y=Math.sin(c)-Math.sin(0),m=Math.sqrt(d*d/(v*v+y*y));o=Math.max(m,o)}return r.nodes().layoutPositions(this,t,(function(e,n){var r=t.startAngle+n*c*(a?1:-1),i=o*Math.cos(r),s=o*Math.sin(r);return{x:l+i,y:u+s}})),this};var Eu,ku={fit:!0,padding:30,startAngle:1.5*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:function(e){return e.degree()},levelWidth:function(e){return e.maxDegree()/4},animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:function(e,t){return!0},ready:void 0,stop:void 0,transform:function(e,t){return t}};function Tu(e){this.options=me({},ku,e)}Tu.prototype.run=function(){for(var e=this.options,t=e,n=void 0!==t.counterclockwise?!t.counterclockwise:t.clockwise,r=e.cy,a=t.eles,i=a.nodes().not(":parent"),o=Qt(t.boundingBox?t.boundingBox:{x1:0,y1:0,w:r.width(),h:r.height()}),s=o.x1+o.w/2,l=o.y1+o.h/2,u=[],c=0,d=0;d0)Math.abs(m[0].value-x.value)>=v&&(m=[],y.push(m));m.push(x)}var w=c+t.minNodeSpacing;if(!t.avoidOverlap){var E=y.length>0&&y[0].length>1,k=(Math.min(o.w,o.h)/2-w)/(y.length+E?1:0);w=Math.min(w,k)}for(var T=0,C=0;C1&&t.avoidOverlap){var D=Math.cos(B)-Math.cos(0),_=Math.sin(B)-Math.sin(0),A=Math.sqrt(w*w/(D*D+_*_));T=Math.max(A,T)}P.r=T,T+=w}if(t.equidistant){for(var M=0,R=0,I=0;I=e.numIter)&&(Ru(r,e),r.temperature=r.temperature*e.coolingFactor,!(r.temperature=e.animationThreshold&&i(),Ne(c)):(Wu(r,e),s())};c()}else{for(;u;)u=o(l),l++;Wu(r,e),s()}return this},Pu.prototype.stop=function(){return this.stopped=!0,this.thread&&this.thread.stop(),this.emit("layoutstop"),this},Pu.prototype.destroy=function(){return this.thread&&this.thread.stop(),this};var Su=function(e,t,n){for(var r=n.eles.edges(),a=n.eles.nodes(),i=Qt(n.boundingBox?n.boundingBox:{x1:0,y1:0,w:e.width(),h:e.height()}),o={isCompound:e.hasCompoundNodes(),layoutNodes:[],idToIndex:{},nodeSize:a.size(),graphSet:[],indexToGraph:[],layoutEdges:[],edgeSize:r.size(),temperature:n.initialTemp,clientWidth:i.w,clientHeight:i.h,boundingBox:i},s=n.eles.components(),l={},u=0;u0){o.graphSet.push(w);for(u=0;ur.count?0:r.graph},Du=function(e,t,n,r){var a=r.graphSet[n];if(-10)var s=(u=r.nodeOverlap*o)*a/(g=Math.sqrt(a*a+i*i)),l=u*i/g;else{var u,c=Ou(e,a,i),d=Ou(t,-1*a,-1*i),h=d.x-c.x,f=d.y-c.y,p=h*h+f*f,g=Math.sqrt(p);s=(u=(e.nodeRepulsion+t.nodeRepulsion)/p)*h/g,l=u*f/g}e.isLocked||(e.offsetX-=s,e.offsetY-=l),t.isLocked||(t.offsetX+=s,t.offsetY+=l)}},zu=function(e,t,n,r){if(n>0)var a=e.maxX-t.minX;else a=t.maxX-e.minX;if(r>0)var i=e.maxY-t.minY;else i=t.maxY-e.minY;return a>=0&&i>=0?Math.sqrt(a*a+i*i):0},Ou=function(e,t,n){var r=e.positionX,a=e.positionY,i=e.height||1,o=e.width||1,s=n/t,l=i/o,u={};return 0===t&&0n?(u.x=r,u.y=a+i/2,u):0t&&-1*l<=s&&s<=l?(u.x=r-o/2,u.y=a-o*n/2/t,u):0=l)?(u.x=r+i*t/2/n,u.y=a+i/2,u):0>n&&(s<=-1*l||s>=l)?(u.x=r-i*t/2/n,u.y=a-i/2,u):u},Vu=function(e,t){for(var n=0;n1){var p=t.gravity*d/f,g=t.gravity*h/f;c.offsetX+=p,c.offsetY+=g}}}}},ju=function(e,t){var n=[],r=0,a=-1;for(n.push.apply(n,e.graphSet[0]),a+=e.graphSet[0].length;r<=a;){var i=n[r++],o=e.idToIndex[i],s=e.layoutNodes[o],l=s.children;if(0n)var a={x:n*e/r,y:n*t/r};else a={x:e,y:t};return a},Yu=function(e,t){var n=e.parentId;if(null!=n){var r=t.layoutNodes[t.idToIndex[n]],a=!1;return(null==r.maxX||e.maxX+r.padRight>r.maxX)&&(r.maxX=e.maxX+r.padRight,a=!0),(null==r.minX||e.minX-r.padLeftr.maxY)&&(r.maxY=e.maxY+r.padBottom,a=!0),(null==r.minY||e.minY-r.padTopp&&(d+=f+t.componentSpacing,c=0,h=0,f=0)}}},Uu={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:function(e){},sort:void 0,animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:function(e,t){return!0},ready:void 0,stop:void 0,transform:function(e,t){return t}};function Hu(e){this.options=me({},Uu,e)}Hu.prototype.run=function(){var e=this.options,t=e,n=e.cy,r=t.eles,a=r.nodes().not(":parent");t.sort&&(a=a.sort(t.sort));var i=Qt(t.boundingBox?t.boundingBox:{x1:0,y1:0,w:n.width(),h:n.height()});if(0===i.h||0===i.w)r.nodes().layoutPositions(this,t,(function(e){return{x:i.x1,y:i.y1}}));else{var o=a.size(),s=Math.sqrt(o*i.h/i.w),l=Math.round(s),u=Math.round(i.w/i.h*s),c=function(e){if(null==e)return Math.min(l,u);Math.min(l,u)==l?l=e:u=e},d=function(e){if(null==e)return Math.max(l,u);Math.max(l,u)==l?l=e:u=e},h=t.rows,f=null!=t.cols?t.cols:t.columns;if(null!=h&&null!=f)l=h,u=f;else if(null!=h&&null==f)l=h,u=Math.ceil(o/l);else if(null==h&&null!=f)u=f,l=Math.ceil(o/u);else if(u*l>o){var p=c(),g=d();(p-1)*g>=o?c(p-1):(g-1)*p>=o&&d(g-1)}else for(;u*l=o?d(y+1):c(v+1)}var m=i.w/u,b=i.h/l;if(t.condense&&(m=0,b=0),t.avoidOverlap)for(var x=0;x=u&&(A=0,_++)},R={},I=0;I(r=dn(e,t,x[w],x[w+1],x[w+2],x[w+3])))return v(n,r),!0}else if("bezier"===i.edgeType||"multibezier"===i.edgeType||"self"===i.edgeType||"compound"===i.edgeType)for(x=i.allpts,w=0;w+5(r=cn(e,t,x[w],x[w+1],x[w+2],x[w+3],x[w+4],x[w+5])))return v(n,r),!0;m=m||a.source,b=b||a.target;var E=o.getArrowWidth(l,c),k=[{name:"source",x:i.arrowStartX,y:i.arrowStartY,angle:i.srcArrowAngle},{name:"target",x:i.arrowEndX,y:i.arrowEndY,angle:i.tgtArrowAngle},{name:"mid-source",x:i.midX,y:i.midY,angle:i.midsrcArrowAngle},{name:"mid-target",x:i.midX,y:i.midY,angle:i.midtgtArrowAngle}];for(w=0;w0&&(y(m),y(b))}function b(e,t,n){return ht(e,t,n)}function x(n,r){var a,i=n._private,o=p;a=r?r+"-":"",n.boundingBox();var s=i.labelBounds[r||"main"],l=n.pstyle(a+"label").value;if("yes"===n.pstyle("text-events").strValue&&l){var u=b(i.rscratch,"labelX",r),c=b(i.rscratch,"labelY",r),d=b(i.rscratch,"labelAngle",r),h=n.pstyle(a+"text-margin-x").pfValue,f=n.pstyle(a+"text-margin-y").pfValue,g=s.x1-o-h,y=s.x2+o-h,m=s.y1-o-f,x=s.y2+o-f;if(d){var w=Math.cos(d),E=Math.sin(d),k=function(e,t){return{x:(e-=u)*w-(t-=c)*E+u,y:e*E+t*w+c}},T=k(g,m),C=k(g,x),P=k(y,m),S=k(y,x),B=[T.x+h,T.y+f,P.x+h,P.y+f,S.x+h,S.y+f,C.x+h,C.y+f];if(hn(e,t,B))return v(n),!0}else if(on(s,e,t))return v(n),!0}}n&&(l=l.interactive);for(var w=l.length-1;w>=0;w--){var E=l[w];E.isNode()?y(E)||x(E):m(E)||x(E)||x(E,"source")||x(E,"target")}return u},getAllInBox:function(e,t,n,r){var a,i,o=this.getCachedZSortedEles().interactive,s=2/this.cy.zoom(),l=[],u=Math.min(e,n),c=Math.max(e,n),d=Math.min(t,r),h=Math.max(t,r),f=Qt({x1:e=u,y1:t=d,x2:n=c,y2:r=h});function p(e,t,n){return ht(e,t,n)}function g(e,t){var n=e._private,r=s;e.boundingBox();var a=n.labelBounds.main,i=p(n.rscratch,"labelX",t),o=p(n.rscratch,"labelY",t),l=p(n.rscratch,"labelAngle",t),u=e.pstyle("text-margin-x").pfValue,c=e.pstyle("text-margin-y").pfValue,d=a.x1-r-u,h=a.x2+r-u,f=a.y1-r-c,g=a.y2+r-c;if(l){var v=Math.cos(l),y=Math.sin(l),m=function(e,t){return{x:(e-=i)*v-(t-=o)*y+i,y:e*y+t*v+o}};return[m(d,f),m(h,f),m(h,g),m(d,g)]}return[{x:d,y:f},{x:h,y:f},{x:h,y:g},{x:d,y:g}]}for(var v=0;v0?-(Math.PI-i.ang):Math.PI+i.ang),Pc(t,n,Cc),uc=Tc.nx*Cc.ny-Tc.ny*Cc.nx,cc=Tc.nx*Cc.nx-Tc.ny*-Cc.ny,fc=Math.asin(Math.max(-1,Math.min(1,uc))),Math.abs(fc)<1e-6)return sc=t.x,lc=t.y,void(gc=yc=0);dc=1,hc=!1,cc<0?fc<0?fc=Math.PI+fc:(fc=Math.PI-fc,dc=-1,hc=!0):fc>0&&(dc=-1,hc=!0),yc=void 0!==t.radius?t.radius:r,pc=fc/2,mc=Math.min(Tc.len/2,Cc.len/2),a?(vc=Math.abs(Math.cos(pc)*yc/Math.sin(pc)))>mc?(vc=mc,gc=Math.abs(vc*Math.sin(pc)/Math.cos(pc))):gc=yc:(vc=Math.min(mc,yc),gc=Math.abs(vc*Math.sin(pc)/Math.cos(pc))),wc=t.x+Cc.nx*vc,Ec=t.y+Cc.ny*vc,sc=wc-Cc.ny*gc*dc,lc=Ec+Cc.nx*gc*dc,bc=t.x+Tc.nx*vc,xc=t.y+Tc.ny*vc,kc=t};function Bc(e,t){0===t.radius?e.lineTo(t.cx,t.cy):e.arc(t.cx,t.cy,t.radius,t.startAngle,t.endAngle,t.counterClockwise)}function Dc(e,t,n,r){var a=!(arguments.length>4&&void 0!==arguments[4])||arguments[4];return 0===r||0===t.radius?{cx:t.x,cy:t.y,radius:0,startX:t.x,startY:t.y,stopX:t.x,stopY:t.y,startAngle:void 0,endAngle:void 0,counterClockwise:void 0}:(Sc(e,t,n,r,a),{cx:sc,cy:lc,radius:gc,startX:bc,startY:xc,stopX:wc,stopY:Ec,startAngle:Tc.ang+Math.PI/2*dc,endAngle:Cc.ang-Math.PI/2*dc,counterClockwise:hc})}var _c=.01,Ac=Math.sqrt(.02),Mc={};function Rc(e){var t=[];if(null!=e){for(var n=0;n0?Math.max(e-t,0):Math.min(e+t,0)},S=P(T,E),B=P(C,k),D=!1;"auto"===v?g=Math.abs(S)>Math.abs(B)?a:r:v===l||v===s?(g=r,D=!0):v!==i&&v!==o||(g=a,D=!0);var _,A=g===r,M=A?B:S,R=A?C:T,I=Wt(R),N=!1;(D&&(m||x)||!(v===s&&R<0||v===l&&R>0||v===i&&R>0||v===o&&R<0)||(M=(I*=-1)*Math.abs(M),N=!0),m)?_=(b<0?1+b:b)*M:_=(b<0?M:0)+b*I;var L=function(e){return Math.abs(e)=Math.abs(M)},z=L(_),O=L(Math.abs(M)-Math.abs(_));if((z||O)&&!N)if(A){var V=Math.abs(R)<=d/2,F=Math.abs(T)<=h/2;if(V){var j=(u.x1+u.x2)/2,X=u.y1,q=u.y2;n.segpts=[j,X,j,q]}else if(F){var Y=(u.y1+u.y2)/2,W=u.x1,U=u.x2;n.segpts=[W,Y,U,Y]}else n.segpts=[u.x1,u.y2]}else{var H=Math.abs(R)<=c/2,K=Math.abs(C)<=f/2;if(H){var G=(u.y1+u.y2)/2,Z=u.x1,$=u.x2;n.segpts=[Z,G,$,G]}else if(K){var Q=(u.x1+u.x2)/2,J=u.y1,ee=u.y2;n.segpts=[Q,J,Q,ee]}else n.segpts=[u.x2,u.y1]}else if(A){var te=u.y1+_+(p?d/2*I:0),ne=u.x1,re=u.x2;n.segpts=[ne,te,re,te]}else{var ae=u.x1+_+(p?c/2*I:0),ie=u.y1,oe=u.y2;n.segpts=[ae,ie,ae,oe]}if(n.isRound){var se=e.pstyle("taxi-radius").value,le="arc-radius"===e.pstyle("radius-type").value[0];n.radii=new Array(n.segpts.length/2).fill(se),n.isArcRadius=new Array(n.segpts.length/2).fill(le)}},Mc.tryToCorrectInvalidPoints=function(e,t){var n=e._private.rscratch;if("bezier"===n.edgeType){var r=t.srcPos,a=t.tgtPos,i=t.srcW,o=t.srcH,s=t.tgtW,l=t.tgtH,u=t.srcShape,c=t.tgtShape,d=t.srcCornerRadius,h=t.tgtCornerRadius,f=t.srcRs,p=t.tgtRs,g=!Q(n.startX)||!Q(n.startY),v=!Q(n.arrowStartX)||!Q(n.arrowStartY),y=!Q(n.endX)||!Q(n.endY),m=!Q(n.arrowEndX)||!Q(n.arrowEndY),b=3*(this.getArrowWidth(e.pstyle("width").pfValue,e.pstyle("arrow-scale").value)*this.arrowShapeWidth),x=Ut({x:n.ctrlpts[0],y:n.ctrlpts[1]},{x:n.startX,y:n.startY}),w=xg.poolIndex()){var v=p;p=g,g=v}var y=d.srcPos=p.position(),m=d.tgtPos=g.position(),b=d.srcW=p.outerWidth(),x=d.srcH=p.outerHeight(),E=d.tgtW=g.outerWidth(),k=d.tgtH=g.outerHeight(),T=d.srcShape=n.nodeShapes[t.getNodeShape(p)],C=d.tgtShape=n.nodeShapes[t.getNodeShape(g)],P=d.srcCornerRadius="auto"===p.pstyle("corner-radius").value?"auto":p.pstyle("corner-radius").pfValue,S=d.tgtCornerRadius="auto"===g.pstyle("corner-radius").value?"auto":g.pstyle("corner-radius").pfValue,B=d.tgtRs=g._private.rscratch,D=d.srcRs=p._private.rscratch;d.dirCounts={north:0,west:0,south:0,east:0,northwest:0,southwest:0,northeast:0,southeast:0};for(var _=0;_=Ac||(Y=Math.sqrt(Math.max(q*q,_c)+Math.max(X*X,_c)));var W=d.vector={x:q,y:X},U=d.vectorNorm={x:W.x/Y,y:W.y/Y},H={x:-U.y,y:U.x};d.nodesOverlap=!Q(Y)||C.checkPoint(L[0],L[1],0,E,k,m.x,m.y,S,B)||T.checkPoint(O[0],O[1],0,b,x,y.x,y.y,P,D),d.vectorNormInverse=H,e={nodesOverlap:d.nodesOverlap,dirCounts:d.dirCounts,calculatedIntersection:!0,hasBezier:d.hasBezier,hasUnbundled:d.hasUnbundled,eles:d.eles,srcPos:m,srcRs:B,tgtPos:y,tgtRs:D,srcW:E,srcH:k,tgtW:b,tgtH:x,srcIntn:V,tgtIntn:z,srcShape:C,tgtShape:T,posPts:{x1:j.x2,y1:j.y2,x2:j.x1,y2:j.y1},intersectionPts:{x1:F.x2,y1:F.y2,x2:F.x1,y2:F.y1},vector:{x:-W.x,y:-W.y},vectorNorm:{x:-U.x,y:-U.y},vectorNormInverse:{x:-H.x,y:-H.y}}}var K=N?e:d;M.nodesOverlap=K.nodesOverlap,M.srcIntn=K.srcIntn,M.tgtIntn=K.tgtIntn,M.isRound=R.startsWith("round"),r&&(p.isParent()||p.isChild()||g.isParent()||g.isChild())&&(p.parents().anySame(g)||g.parents().anySame(p)||p.same(g)&&p.isParent())?t.findCompoundLoopPoints(A,K,_,I):p===g?t.findLoopPoints(A,K,_,I):R.endsWith("segments")?t.findSegmentsPoints(A,K):R.endsWith("taxi")?t.findTaxiPoints(A,K):"straight"===R||!I&&d.eles.length%2===1&&_===Math.floor(d.eles.length/2)?t.findStraightEdgePoints(A):t.findBezierPoints(A,K,_,I,N),t.findEndpoints(A),t.tryToCorrectInvalidPoints(A,K),t.checkForInvalidEdgeWarning(A),t.storeAllpts(A),t.storeEdgeProjections(A),t.calculateArrowAngles(A),t.recalculateEdgeLabelProjections(A),t.calculateLabelAngles(A)}},w=0;w0){var W=u,U=Ht(W,Xt(t)),H=Ht(W,Xt(Y)),K=U;if(H2)Ht(W,{x:Y[2],y:Y[3]})0){var le=c,ue=Ht(le,Xt(t)),ce=Ht(le,Xt(se)),de=ue;if(ce2)Ht(le,{x:se[2],y:se[3]})=u||m){c={cp:g,segment:y};break}}if(c)break}var b=c.cp,x=c.segment,w=(u-h)/x.length,E=x.t1-x.t0,k=s?x.t0+E*w:x.t1-E*w;k=$t(0,k,1),t=Zt(b.p0,b.p1,b.p2,k),a=function(e,t,n,r){var a=$t(0,r-.001,1),i=$t(0,r+.001,1),o=Zt(e,t,n,a),s=Zt(e,t,n,i);return Vc(o,s)}(b.p0,b.p1,b.p2,k);break;case"straight":case"segments":case"haystack":for(var T,C,P,S,B=0,D=r.allpts.length,_=0;_+3=u));_+=2);var A=(u-C)/T;A=$t(0,A,1),t=function(e,t,n,r){var a=t.x-e.x,i=t.y-e.y,o=Ut(e,t),s=a/o,l=i/o;return n=null==n?0:n,r=null!=r?r:n*o,{x:e.x+s*r,y:e.y+l*r}}(P,S,A),a=Vc(P,S)}o("labelX",n,t.x),o("labelY",n,t.y),o("labelAutoAngle",n,a)}};u("source"),u("target"),this.applyLabelDimensions(e)}},zc.applyLabelDimensions=function(e){this.applyPrefixedLabelDimensions(e),e.isEdge()&&(this.applyPrefixedLabelDimensions(e,"source"),this.applyPrefixedLabelDimensions(e,"target"))},zc.applyPrefixedLabelDimensions=function(e,t){var n=e._private,r=this.getLabelText(e,t),a=We(r,e._private.labelDimsKey);if(ht(n.rscratch,"prefixedLabelDimsKey",t)!==a){ft(n.rscratch,"prefixedLabelDimsKey",t,a);var i=this.calculateLabelDimensions(e,r),o=e.pstyle("line-height").pfValue,s=e.pstyle("text-wrap").strValue,l=ht(n.rscratch,"labelWrapCachedLines",t)||[],u="wrap"!==s?1:Math.max(l.length,1),c=i.height/u,d=c*o,h=i.width,f=i.height+(u-1)*(o-1)*c;ft(n.rstyle,"labelWidth",t,h),ft(n.rscratch,"labelWidth",t,h),ft(n.rstyle,"labelHeight",t,f),ft(n.rscratch,"labelHeight",t,f),ft(n.rscratch,"labelLineHeight",t,d)}},zc.getLabelText=function(e,t){var n=e._private,r=t?t+"-":"",a=e.pstyle(r+"label").strValue,i=e.pstyle("text-transform").value,s=function(e,r){return r?(ft(n.rscratch,e,t,r),r):ht(n.rscratch,e,t)};if(!a)return"";"none"==i||("uppercase"==i?a=a.toUpperCase():"lowercase"==i&&(a=a.toLowerCase()));var l=e.pstyle("text-wrap").value;if("wrap"===l){var u=s("labelKey");if(null!=u&&s("labelWrapKey")===u)return s("labelWrapCachedText");for(var c=a.split("\n"),d=e.pstyle("text-max-width").pfValue,h="anywhere"===e.pstyle("text-overflow-wrap").value,f=[],p=/[\s\u200b]+|$/g,g=0;gd){var b,x="",w=0,E=o(v.matchAll(p));try{for(E.s();!(b=E.n()).done;){var k=b.value,T=k[0],C=v.substring(w,k.index);w=k.index+T.length;var P=0===x.length?C:x+C+T;this.calculateLabelDimensions(e,P).width<=d?x+=C+T:(x&&f.push(x),x=C+T)}}catch(A){E.e(A)}finally{E.f()}x.match(/^[\s\u200b]+$/)||f.push(x)}else f.push(v)}s("labelWrapCachedLines",f),a=s("labelWrapCachedText",f.join("\n")),s("labelWrapKey",u)}else if("ellipsis"===l){var S=e.pstyle("text-max-width").pfValue,B="",D=!1;if(this.calculateLabelDimensions(e,a).widthS)break;B+=a[_],_===a.length-1&&(D=!0)}return D||(B+="\u2026"),B}return a},zc.getLabelJustification=function(e){var t=e.pstyle("text-justification").strValue,n=e.pstyle("text-halign").strValue;if("auto"!==t)return t;if(!e.isNode())return"center";switch(n){case"left":return"right";case"right":return"left";default:return"center"}},zc.calculateLabelDimensions=function(e,t){var n=this.cy.window().document,r=e.pstyle("font-style").strValue,a=e.pstyle("font-size").pfValue,i=e.pstyle("font-family").strValue,o=e.pstyle("font-weight").strValue,s=this.labelCalcCanvas,l=this.labelCalcCanvasContext;if(!s){s=this.labelCalcCanvas=n.createElement("canvas"),l=this.labelCalcCanvasContext=s.getContext("2d");var u=s.style;u.position="absolute",u.left="-9999px",u.top="-9999px",u.zIndex="-1",u.visibility="hidden",u.pointerEvents="none"}l.font="".concat(r," ").concat(o," ").concat(a,"px ").concat(i);for(var c=0,d=0,h=t.split("\n"),f=0;f1&&void 0!==arguments[1])||arguments[1];if(t.merge(e),n)for(var r=0;r=e.desktopTapThreshold2}var P=a(t);v&&(e.hoverData.tapholdCancelled=!0);n=!0,r(g,["mousemove","vmousemove","tapdrag"],t,{x:c[0],y:c[1]});var S=function(){e.data.bgActivePosistion=void 0,e.hoverData.selecting||o.emit({originalEvent:t,type:"boxstart",position:{x:c[0],y:c[1]}}),p[4]=1,e.hoverData.selecting=!0,e.redrawHint("select",!0),e.redraw()};if(3===e.hoverData.which){if(v){var B={originalEvent:t,type:"cxtdrag",position:{x:c[0],y:c[1]}};b?b.emit(B):o.emit(B),e.hoverData.cxtDragged=!0,e.hoverData.cxtOver&&g===e.hoverData.cxtOver||(e.hoverData.cxtOver&&e.hoverData.cxtOver.emit({originalEvent:t,type:"cxtdragout",position:{x:c[0],y:c[1]}}),e.hoverData.cxtOver=g,g&&g.emit({originalEvent:t,type:"cxtdragover",position:{x:c[0],y:c[1]}}))}}else if(e.hoverData.dragging){if(n=!0,o.panningEnabled()&&o.userPanningEnabled()){var D;if(e.hoverData.justStartedPan){var _=e.hoverData.mdownPos;D={x:(c[0]-_[0])*s,y:(c[1]-_[1])*s},e.hoverData.justStartedPan=!1}else D={x:x[0]*s,y:x[1]*s};o.panBy(D),o.emit("dragpan"),e.hoverData.dragged=!0}c=e.projectIntoViewport(t.clientX,t.clientY)}else if(1!=p[4]||null!=b&&!b.pannable()){if(b&&b.pannable()&&b.active()&&b.unactivate(),b&&b.grabbed()||g==y||(y&&r(y,["mouseout","tapdragout"],t,{x:c[0],y:c[1]}),g&&r(g,["mouseover","tapdragover"],t,{x:c[0],y:c[1]}),e.hoverData.last=g),b)if(v){if(o.boxSelectionEnabled()&&P)b&&b.grabbed()&&(d(w),b.emit("freeon"),w.emit("free"),e.dragData.didDrag&&(b.emit("dragfreeon"),w.emit("dragfree"))),S();else if(b&&b.grabbed()&&e.nodeIsDraggable(b)){var A=!e.dragData.didDrag;A&&e.redrawHint("eles",!0),e.dragData.didDrag=!0,e.hoverData.draggingEles||u(w,{inDragLayer:!0});var M={x:0,y:0};if(Q(x[0])&&Q(x[1])&&(M.x+=x[0],M.y+=x[1],A)){var R=e.hoverData.dragDelta;R&&Q(R[0])&&Q(R[1])&&(M.x+=R[0],M.y+=R[1])}e.hoverData.draggingEles=!0,w.silentShift(M).emit("position drag"),e.redrawHint("drag",!0),e.redraw()}}else!function(){var t=e.hoverData.dragDelta=e.hoverData.dragDelta||[];0===t.length?(t.push(x[0]),t.push(x[1])):(t[0]+=x[0],t[1]+=x[1])}();n=!0}else if(v){if(e.hoverData.dragging||!o.boxSelectionEnabled()||!P&&o.panningEnabled()&&o.userPanningEnabled()){if(!e.hoverData.selecting&&o.panningEnabled()&&o.userPanningEnabled()){i(b,e.hoverData.downs)&&(e.hoverData.dragging=!0,e.hoverData.justStartedPan=!0,p[4]=0,e.data.bgActivePosistion=Xt(h),e.redrawHint("select",!0),e.redraw())}}else S();b&&b.pannable()&&b.active()&&b.unactivate()}return p[2]=c[0],p[3]=c[1],n?(t.stopPropagation&&t.stopPropagation(),t.preventDefault&&t.preventDefault(),!1):void 0}}),!1),e.registerBinding(t,"mouseup",(function(t){if((1!==e.hoverData.which||1===t.which||!e.hoverData.capture)&&e.hoverData.capture){e.hoverData.capture=!1;var i=e.cy,o=e.projectIntoViewport(t.clientX,t.clientY),s=e.selection,l=e.findNearestElement(o[0],o[1],!0,!1),u=e.dragData.possibleDragElements,c=e.hoverData.down,h=a(t);if(e.data.bgActivePosistion&&(e.redrawHint("select",!0),e.redraw()),e.hoverData.tapholdCancelled=!0,e.data.bgActivePosistion=void 0,c&&c.unactivate(),3===e.hoverData.which){var f={originalEvent:t,type:"cxttapend",position:{x:o[0],y:o[1]}};if(c?c.emit(f):i.emit(f),!e.hoverData.cxtDragged){var p={originalEvent:t,type:"cxttap",position:{x:o[0],y:o[1]}};c?c.emit(p):i.emit(p)}e.hoverData.cxtDragged=!1,e.hoverData.which=null}else if(1===e.hoverData.which){if(r(l,["mouseup","tapend","vmouseup"],t,{x:o[0],y:o[1]}),e.dragData.didDrag||e.hoverData.dragged||e.hoverData.selecting||e.hoverData.isOverThresholdDrag||(r(c,["click","tap","vclick"],t,{x:o[0],y:o[1]}),x=!1,t.timeStamp-w<=i.multiClickDebounceTime()?(b&&clearTimeout(b),x=!0,w=null,r(c,["dblclick","dbltap","vdblclick"],t,{x:o[0],y:o[1]})):(b=setTimeout((function(){x||r(c,["oneclick","onetap","voneclick"],t,{x:o[0],y:o[1]})}),i.multiClickDebounceTime()),w=t.timeStamp)),null!=c||e.dragData.didDrag||e.hoverData.selecting||e.hoverData.dragged||a(t)||(i.$(n).unselect(["tapunselect"]),u.length>0&&e.redrawHint("eles",!0),e.dragData.possibleDragElements=u=i.collection()),l!=c||e.dragData.didDrag||e.hoverData.selecting||null!=l&&l._private.selectable&&(e.hoverData.dragging||("additive"===i.selectionType()||h?l.selected()?l.unselect(["tapunselect"]):l.select(["tapselect"]):h||(i.$(n).unmerge(l).unselect(["tapunselect"]),l.select(["tapselect"]))),e.redrawHint("eles",!0)),e.hoverData.selecting){var g=i.collection(e.getAllInBox(s[0],s[1],s[2],s[3]));e.redrawHint("select",!0),g.length>0&&e.redrawHint("eles",!0),i.emit({type:"boxend",originalEvent:t,position:{x:o[0],y:o[1]}});var v=function(e){return e.selectable()&&!e.selected()};"additive"===i.selectionType()||h||i.$(n).unmerge(g).unselect(),g.emit("box").stdFilter(v).select().emit("boxselect"),e.redraw()}if(e.hoverData.dragging&&(e.hoverData.dragging=!1,e.redrawHint("select",!0),e.redrawHint("eles",!0),e.redraw()),!s[4]){e.redrawHint("drag",!0),e.redrawHint("eles",!0);var y=c&&c.grabbed();d(u),y&&(c.emit("freeon"),u.emit("free"),e.dragData.didDrag&&(c.emit("dragfreeon"),u.emit("dragfree")))}}s[4]=0,e.hoverData.down=null,e.hoverData.cxtStarted=!1,e.hoverData.draggingEles=!1,e.hoverData.selecting=!1,e.hoverData.isOverThresholdDrag=!1,e.dragData.didDrag=!1,e.hoverData.dragged=!1,e.hoverData.dragDelta=[],e.hoverData.mdownPos=null,e.hoverData.mdownGPos=null,e.hoverData.which=null}}),!1);var k,T,C,P,S,B,D,_,A,M,R,I,N,L,z=[],O=1e5,V=function(t){var n=!1,r=t.deltaY;if(null==r&&(null!=t.wheelDeltaY?r=t.wheelDeltaY/4:null!=t.wheelDelta&&(r=t.wheelDelta/4)),null==k)if(z.length>=4){var a=z;if(k=function(e,t){for(var n=0;n5}if(k)for(var o=0;o5&&(r=5*Wt(r)),h=r/-250,k&&(h/=O,h*=3),h*=e.wheelSensitivity,1===t.deltaMode&&(h*=33);var f=s.zoom()*Math.pow(10,h);"gesturechange"===t.type&&(f=e.gestureStartZoom*t.scale),s.zoom({level:f,renderedPosition:{x:d[0],y:d[1]}}),s.emit("gesturechange"===t.type?"pinchzoom":"scrollzoom")}}};e.registerBinding(e.container,"wheel",V,!0),e.registerBinding(t,"scroll",(function(t){e.scrollingPage=!0,clearTimeout(e.scrollingPageTimeout),e.scrollingPageTimeout=setTimeout((function(){e.scrollingPage=!1}),250)}),!0),e.registerBinding(e.container,"gesturestart",(function(t){e.gestureStartZoom=e.cy.zoom(),e.hasTouchStarted||t.preventDefault()}),!0),e.registerBinding(e.container,"gesturechange",(function(t){e.hasTouchStarted||V(t)}),!0),e.registerBinding(e.container,"mouseout",(function(t){var n=e.projectIntoViewport(t.clientX,t.clientY);e.cy.emit({originalEvent:t,type:"mouseout",position:{x:n[0],y:n[1]}})}),!1),e.registerBinding(e.container,"mouseover",(function(t){var n=e.projectIntoViewport(t.clientX,t.clientY);e.cy.emit({originalEvent:t,type:"mouseover",position:{x:n[0],y:n[1]}})}),!1);var F,j,X,q,Y,W,U,H=function(e,t,n,r){return Math.sqrt((n-e)*(n-e)+(r-t)*(r-t))},K=function(e,t,n,r){return(n-e)*(n-e)+(r-t)*(r-t)};if(e.registerBinding(e.container,"touchstart",F=function(t){if(e.hasTouchStarted=!0,m(t)){f(),e.touchData.capture=!0,e.data.bgActivePosistion=void 0;var n=e.cy,a=e.touchData.now,i=e.touchData.earlier;if(t.touches[0]){var o=e.projectIntoViewport(t.touches[0].clientX,t.touches[0].clientY);a[0]=o[0],a[1]=o[1]}if(t.touches[1]){o=e.projectIntoViewport(t.touches[1].clientX,t.touches[1].clientY);a[2]=o[0],a[3]=o[1]}if(t.touches[2]){o=e.projectIntoViewport(t.touches[2].clientX,t.touches[2].clientY);a[4]=o[0],a[5]=o[1]}if(t.touches[1]){e.touchData.singleTouchMoved=!0,d(e.dragData.touchDragEles);var l=e.findContainerClientCoords();M=l[0],R=l[1],I=l[2],N=l[3],T=t.touches[0].clientX-M,C=t.touches[0].clientY-R,P=t.touches[1].clientX-M,S=t.touches[1].clientY-R,L=0<=T&&T<=I&&0<=P&&P<=I&&0<=C&&C<=N&&0<=S&&S<=N;var h=n.pan(),p=n.zoom();B=H(T,C,P,S),D=K(T,C,P,S),A=[((_=[(T+P)/2,(C+S)/2])[0]-h.x)/p,(_[1]-h.y)/p];if(D<4e4&&!t.touches[2]){var g=e.findNearestElement(a[0],a[1],!0,!0),v=e.findNearestElement(a[2],a[3],!0,!0);return g&&g.isNode()?(g.activate().emit({originalEvent:t,type:"cxttapstart",position:{x:a[0],y:a[1]}}),e.touchData.start=g):v&&v.isNode()?(v.activate().emit({originalEvent:t,type:"cxttapstart",position:{x:a[0],y:a[1]}}),e.touchData.start=v):n.emit({originalEvent:t,type:"cxttapstart",position:{x:a[0],y:a[1]}}),e.touchData.start&&(e.touchData.start._private.grabbed=!1),e.touchData.cxt=!0,e.touchData.cxtDragged=!1,e.data.bgActivePosistion=void 0,void e.redraw()}}if(t.touches[2])n.boxSelectionEnabled()&&t.preventDefault();else if(t.touches[1]);else if(t.touches[0]){var y=e.findNearestElements(a[0],a[1],!0,!0),b=y[0];if(null!=b&&(b.activate(),e.touchData.start=b,e.touchData.starts=y,e.nodeIsGrabbable(b))){var x=e.dragData.touchDragEles=n.collection(),w=null;e.redrawHint("eles",!0),e.redrawHint("drag",!0),b.selected()?(w=n.$((function(t){return t.selected()&&e.nodeIsGrabbable(t)})),u(w,{addToList:x})):c(b,{addToList:x}),s(b);var E=function(e){return{originalEvent:t,type:e,position:{x:a[0],y:a[1]}}};b.emit(E("grabon")),w?w.forEach((function(e){e.emit(E("grab"))})):b.emit(E("grab"))}r(b,["touchstart","tapstart","vmousedown"],t,{x:a[0],y:a[1]}),null==b&&(e.data.bgActivePosistion={x:o[0],y:o[1]},e.redrawHint("select",!0),e.redraw()),e.touchData.singleTouchMoved=!1,e.touchData.singleTouchStartTime=+new Date,clearTimeout(e.touchData.tapholdTimeout),e.touchData.tapholdTimeout=setTimeout((function(){!1!==e.touchData.singleTouchMoved||e.pinching||e.touchData.selecting||r(e.touchData.start,["taphold"],t,{x:a[0],y:a[1]})}),e.tapholdDuration)}if(t.touches.length>=1){for(var k=e.touchData.startPosition=[null,null,null,null,null,null],z=0;z=e.touchTapThreshold2}if(n&&e.touchData.cxt){t.preventDefault();var w=t.touches[0].clientX-M,E=t.touches[0].clientY-R,k=t.touches[1].clientX-M,_=t.touches[1].clientY-R,I=K(w,E,k,_);if(I/D>=2.25||I>=22500){e.touchData.cxt=!1,e.data.bgActivePosistion=void 0,e.redrawHint("select",!0);var N={originalEvent:t,type:"cxttapend",position:{x:s[0],y:s[1]}};e.touchData.start?(e.touchData.start.unactivate().emit(N),e.touchData.start=null):o.emit(N)}}if(n&&e.touchData.cxt){N={originalEvent:t,type:"cxtdrag",position:{x:s[0],y:s[1]}};e.data.bgActivePosistion=void 0,e.redrawHint("select",!0),e.touchData.start?e.touchData.start.emit(N):o.emit(N),e.touchData.start&&(e.touchData.start._private.grabbed=!1),e.touchData.cxtDragged=!0;var z=e.findNearestElement(s[0],s[1],!0,!0);e.touchData.cxtOver&&z===e.touchData.cxtOver||(e.touchData.cxtOver&&e.touchData.cxtOver.emit({originalEvent:t,type:"cxtdragout",position:{x:s[0],y:s[1]}}),e.touchData.cxtOver=z,z&&z.emit({originalEvent:t,type:"cxtdragover",position:{x:s[0],y:s[1]}}))}else if(n&&t.touches[2]&&o.boxSelectionEnabled())t.preventDefault(),e.data.bgActivePosistion=void 0,this.lastThreeTouch=+new Date,e.touchData.selecting||o.emit({originalEvent:t,type:"boxstart",position:{x:s[0],y:s[1]}}),e.touchData.selecting=!0,e.touchData.didSelect=!0,a[4]=1,a&&0!==a.length&&void 0!==a[0]?(a[2]=(s[0]+s[2]+s[4])/3,a[3]=(s[1]+s[3]+s[5])/3):(a[0]=(s[0]+s[2]+s[4])/3,a[1]=(s[1]+s[3]+s[5])/3,a[2]=(s[0]+s[2]+s[4])/3+1,a[3]=(s[1]+s[3]+s[5])/3+1),e.redrawHint("select",!0),e.redraw();else if(n&&t.touches[1]&&!e.touchData.didSelect&&o.zoomingEnabled()&&o.panningEnabled()&&o.userZoomingEnabled()&&o.userPanningEnabled()){if(t.preventDefault(),e.data.bgActivePosistion=void 0,e.redrawHint("select",!0),ee=e.dragData.touchDragEles){e.redrawHint("drag",!0);for(var O=0;O0&&!e.hoverData.draggingEles&&!e.swipePanning&&null!=e.data.bgActivePosistion&&(e.data.bgActivePosistion=void 0,e.redrawHint("select",!0),e.redraw())}},!1),e.registerBinding(t,"touchcancel",X=function(t){var n=e.touchData.start;e.touchData.capture=!1,n&&n.unactivate()}),e.registerBinding(t,"touchend",q=function(t){var a=e.touchData.start;if(e.touchData.capture){0===t.touches.length&&(e.touchData.capture=!1),t.preventDefault();var i=e.selection;e.swipePanning=!1,e.hoverData.draggingEles=!1;var o,s=e.cy,l=s.zoom(),u=e.touchData.now,c=e.touchData.earlier;if(t.touches[0]){var h=e.projectIntoViewport(t.touches[0].clientX,t.touches[0].clientY);u[0]=h[0],u[1]=h[1]}if(t.touches[1]){h=e.projectIntoViewport(t.touches[1].clientX,t.touches[1].clientY);u[2]=h[0],u[3]=h[1]}if(t.touches[2]){h=e.projectIntoViewport(t.touches[2].clientX,t.touches[2].clientY);u[4]=h[0],u[5]=h[1]}if(a&&a.unactivate(),e.touchData.cxt){if(o={originalEvent:t,type:"cxttapend",position:{x:u[0],y:u[1]}},a?a.emit(o):s.emit(o),!e.touchData.cxtDragged){var f={originalEvent:t,type:"cxttap",position:{x:u[0],y:u[1]}};a?a.emit(f):s.emit(f)}return e.touchData.start&&(e.touchData.start._private.grabbed=!1),e.touchData.cxt=!1,e.touchData.start=null,void e.redraw()}if(!t.touches[2]&&s.boxSelectionEnabled()&&e.touchData.selecting){e.touchData.selecting=!1;var p=s.collection(e.getAllInBox(i[0],i[1],i[2],i[3]));i[0]=void 0,i[1]=void 0,i[2]=void 0,i[3]=void 0,i[4]=0,e.redrawHint("select",!0),s.emit({type:"boxend",originalEvent:t,position:{x:u[0],y:u[1]}});p.emit("box").stdFilter((function(e){return e.selectable()&&!e.selected()})).select().emit("boxselect"),p.nonempty()&&e.redrawHint("eles",!0),e.redraw()}if(null!=a&&a.unactivate(),t.touches[2])e.data.bgActivePosistion=void 0,e.redrawHint("select",!0);else if(t.touches[1]);else if(t.touches[0]);else if(!t.touches[0]){e.data.bgActivePosistion=void 0,e.redrawHint("select",!0);var g=e.dragData.touchDragEles;if(null!=a){var v=a._private.grabbed;d(g),e.redrawHint("drag",!0),e.redrawHint("eles",!0),v&&(a.emit("freeon"),g.emit("free"),e.dragData.didDrag&&(a.emit("dragfreeon"),g.emit("dragfree"))),r(a,["touchend","tapend","vmouseup","tapdragout"],t,{x:u[0],y:u[1]}),a.unactivate(),e.touchData.start=null}else{var y=e.findNearestElement(u[0],u[1],!0,!0);r(y,["touchend","tapend","vmouseup","tapdragout"],t,{x:u[0],y:u[1]})}var m=e.touchData.startPosition[0]-u[0],b=m*m,x=e.touchData.startPosition[1]-u[1],w=(b+x*x)*l*l;e.touchData.singleTouchMoved||(a||s.$(":selected").unselect(["tapunselect"]),r(a,["tap","vclick"],t,{x:u[0],y:u[1]}),Y=!1,t.timeStamp-U<=s.multiClickDebounceTime()?(W&&clearTimeout(W),Y=!0,U=null,r(a,["dbltap","vdblclick"],t,{x:u[0],y:u[1]})):(W=setTimeout((function(){Y||r(a,["onetap","voneclick"],t,{x:u[0],y:u[1]})}),s.multiClickDebounceTime()),U=t.timeStamp)),null!=a&&!e.dragData.didDrag&&a._private.selectable&&w2){for(var f=[c[0],c[1]],p=Math.pow(f[0]-e,2)+Math.pow(f[1]-t,2),g=1;g0)return g[0]}return null},f=Object.keys(d),p=0;p0?u:sn(a,i,e,t,n,r,o,s)},checkPoint:function(e,t,n,r,a,i,o,s){var l=2*(s="auto"===s?Cn(r,a):s);if(fn(e,t,this.points,i,o,r,a-l,[0,-1],n))return!0;if(fn(e,t,this.points,i,o,r-l,a,[0,-1],n))return!0;var u=r/2+2*n,c=a/2+2*n;return!!hn(e,t,[i-u,o-c,i-u,o,i+u,o,i+u,o-c])||(!!vn(e,t,l,l,i+r/2-s,o+a/2-s,n)||!!vn(e,t,l,l,i-r/2+s,o+a/2-s,n))}}},Hc.registerNodeShapes=function(){var e=this.nodeShapes={},t=this;this.generateEllipse(),this.generatePolygon("triangle",En(3,0)),this.generateRoundPolygon("round-triangle",En(3,0)),this.generatePolygon("rectangle",En(4,0)),e.square=e.rectangle,this.generateRoundRectangle(),this.generateCutRectangle(),this.generateBarrel(),this.generateBottomRoundrectangle();var n=[0,1,1,0,0,-1,-1,0];this.generatePolygon("diamond",n),this.generateRoundPolygon("round-diamond",n),this.generatePolygon("pentagon",En(5,0)),this.generateRoundPolygon("round-pentagon",En(5,0)),this.generatePolygon("hexagon",En(6,0)),this.generateRoundPolygon("round-hexagon",En(6,0)),this.generatePolygon("heptagon",En(7,0)),this.generateRoundPolygon("round-heptagon",En(7,0)),this.generatePolygon("octagon",En(8,0)),this.generateRoundPolygon("round-octagon",En(8,0));var r=new Array(20),a=Tn(5,0),i=Tn(5,Math.PI/5),o=.5*(3-Math.sqrt(5));o*=1.57;for(var s=0;s=e.deqFastCost*g)break}else if(a){if(f>=e.deqCost*l||f>=e.deqAvgCost*s)break}else if(p>=e.deqNoDrawCost*Qc)break;var v=e.deq(t,d,c);if(!(v.length>0))break;for(var y=0;y0&&(e.onDeqd(t,u),!a&&e.shouldRedraw(t,u,d,c)&&r())}),a(t))}}},ed=function(){return i((function e(t){var n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Je;a(this,e),this.idsByKey=new pt,this.keyForId=new pt,this.cachesByLvl=new pt,this.lvls=[],this.getKey=t,this.doesEleInvalidateKey=n}),[{key:"getIdsFor",value:function(e){null==e&&nt("Can not get id list for null key");var t=this.idsByKey,n=this.idsByKey.get(e);return n||(n=new vt,t.set(e,n)),n}},{key:"addIdForKey",value:function(e,t){null!=e&&this.getIdsFor(e).add(t)}},{key:"deleteIdForKey",value:function(e,t){null!=e&&this.getIdsFor(e).delete(t)}},{key:"getNumberOfIdsForKey",value:function(e){return null==e?0:this.getIdsFor(e).size}},{key:"updateKeyMappingFor",value:function(e){var t=e.id(),n=this.keyForId.get(t),r=this.getKey(e);this.deleteIdForKey(n,t),this.addIdForKey(r,t),this.keyForId.set(t,r)}},{key:"deleteKeyMappingFor",value:function(e){var t=e.id(),n=this.keyForId.get(t);this.deleteIdForKey(n,t),this.keyForId.delete(t)}},{key:"keyHasChangedFor",value:function(e){var t=e.id();return this.keyForId.get(t)!==this.getKey(e)}},{key:"isInvalid",value:function(e){return this.keyHasChangedFor(e)||this.doesEleInvalidateKey(e)}},{key:"getCachesAt",value:function(e){var t=this.cachesByLvl,n=this.lvls,r=t.get(e);return r||(r=new pt,t.set(e,r),n.push(e)),r}},{key:"getCache",value:function(e,t){return this.getCachesAt(t).get(e)}},{key:"get",value:function(e,t){var n=this.getKey(e),r=this.getCache(n,t);return null!=r&&this.updateKeyMappingFor(e),r}},{key:"getForCachedKey",value:function(e,t){var n=this.keyForId.get(e.id());return this.getCache(n,t)}},{key:"hasCache",value:function(e,t){return this.getCachesAt(t).has(e)}},{key:"has",value:function(e,t){var n=this.getKey(e);return this.hasCache(n,t)}},{key:"setCache",value:function(e,t,n){n.key=e,this.getCachesAt(t).set(e,n)}},{key:"set",value:function(e,t,n){var r=this.getKey(e);this.setCache(r,t,n),this.updateKeyMappingFor(e)}},{key:"deleteCache",value:function(e,t){this.getCachesAt(t).delete(e)}},{key:"delete",value:function(e,t){var n=this.getKey(e);this.deleteCache(n,t)}},{key:"invalidateKey",value:function(e){var t=this;this.lvls.forEach((function(n){return t.deleteCache(e,n)}))}},{key:"invalidate",value:function(e){var t=e.id(),n=this.keyForId.get(t);this.deleteKeyMappingFor(e);var r=this.doesEleInvalidateKey(e);return r&&this.invalidateKey(n),r||0===this.getNumberOfIdsForKey(n)}}])}(),td=7.99,nd={dequeue:"dequeue",downscale:"downscale",highQuality:"highQuality"},rd=ut({getKey:null,doesEleInvalidateKey:Je,drawElement:null,getBoundingBox:null,getRotationPoint:null,getRotationOffset:null,isVisible:Qe,allowEdgeTxrCaching:!0,allowParentTxrCaching:!0}),ad=function(e,t){var n=this;n.renderer=e,n.onDequeues=[];var r=rd(t);me(n,r),n.lookup=new ed(r.getKey,r.doesEleInvalidateKey),n.setupDequeueing()},id=ad.prototype;id.reasons=nd,id.getTextureQueue=function(e){var t=this;return t.eleImgCaches=t.eleImgCaches||{},t.eleImgCaches[e]=t.eleImgCaches[e]||[]},id.getRetiredTextureQueue=function(e){var t=this.eleImgCaches.retired=this.eleImgCaches.retired||{};return t[e]=t[e]||[]},id.getElementQueue=function(){return this.eleCacheQueue=this.eleCacheQueue||new Pt((function(e,t){return t.reqs-e.reqs}))},id.getElementKeyToQueue=function(){return this.eleKeyToCacheQueue=this.eleKeyToCacheQueue||{}},id.getElement=function(e,t,n,r,a){var i=this,o=this.renderer,s=o.cy.zoom(),l=this.lookup;if(!t||0===t.w||0===t.h||isNaN(t.w)||isNaN(t.h)||!e.visible()||e.removed())return null;if(!i.allowEdgeTxrCaching&&e.isEdge()||!i.allowParentTxrCaching&&e.isParent())return null;if(null==r&&(r=Math.ceil(Yt(s*n))),r<-4)r=-4;else if(s>=7.99||r>3)return null;var u=Math.pow(2,r),c=t.h*u,d=t.w*u,h=o.eleTextBiggerThanMin(e,u);if(!this.isVisible(e,h))return null;var f,p=l.get(e,r);if(p&&p.invalidated&&(p.invalidated=!1,p.texture.invalidatedWidth-=p.width),p)return p;if(f=c<=25?25:c<=50?50:50*Math.ceil(c/50),c>1024||d>1024)return null;var g=i.getTextureQueue(f),v=g[g.length-2],y=function(){return i.recycleTexture(f,d)||i.addTexture(f,d)};v||(v=g[g.length-1]),v||(v=y()),v.width-v.usedWidthr;S--)C=i.getElement(e,t,n,S,nd.downscale);P()}else{var B;if(!x&&!w&&!E)for(var D=r-1;D>=-4;D--){var _=l.get(e,D);if(_){B=_;break}}if(b(B))return i.queueElement(e,r),B;v.context.translate(v.usedWidth,0),v.context.scale(u,u),this.drawElement(v.context,e,t,h,!1),v.context.scale(1/u,1/u),v.context.translate(-v.usedWidth,0)}return p={x:v.usedWidth,texture:v,level:r,scale:u,width:d,height:c,scaledLabelShown:h},v.usedWidth+=Math.ceil(d+8),v.eleCaches.push(p),l.set(e,r,p),i.checkTextureFullness(v),p},id.invalidateElements=function(e){for(var t=0;t=.2*e.width&&this.retireTexture(e)},id.checkTextureFullness=function(e){var t=this.getTextureQueue(e.height);e.usedWidth/e.width>.8&&e.fullnessChecks>=10?ct(t,e):e.fullnessChecks++},id.retireTexture=function(e){var t=e.height,n=this.getTextureQueue(t),r=this.lookup;ct(n,e),e.retired=!0;for(var a=e.eleCaches,i=0;i=t)return i.retired=!1,i.usedWidth=0,i.invalidatedWidth=0,i.fullnessChecks=0,dt(i.eleCaches),i.context.setTransform(1,0,0,1,0,0),i.context.clearRect(0,0,i.width,i.height),ct(r,i),n.push(i),i}},id.queueElement=function(e,t){var n=this.getElementQueue(),r=this.getElementKeyToQueue(),a=this.getKey(e),i=r[a];if(i)i.level=Math.max(i.level,t),i.eles.merge(e),i.reqs++,n.updateItem(i);else{var o={eles:e.spawn().merge(e),level:t,reqs:1,key:a};n.push(o),r[a]=o}},id.dequeue=function(e){for(var t=this,n=t.getElementQueue(),r=t.getElementKeyToQueue(),a=[],i=t.lookup,o=0;o<1&&n.size()>0;o++){var s=n.pop(),l=s.key,u=s.eles[0],c=i.hasCache(u,s.level);if(r[l]=null,!c){a.push(s);var d=t.getBoundingBox(u);t.getElement(u,d,e,s.level,nd.dequeue)}}return a},id.removeFromQueue=function(e){var t=this.getElementQueue(),n=this.getElementKeyToQueue(),r=this.getKey(e),a=n[r];null!=a&&(1===a.eles.length?(a.reqs=$e,t.updateItem(a),t.pop(),n[r]=null):a.eles.unmerge(e))},id.onDequeue=function(e){this.onDequeues.push(e)},id.offDequeue=function(e){ct(this.onDequeues,e)},id.setupDequeueing=Jc({deqRedrawThreshold:100,deqCost:.15,deqAvgCost:.1,deqNoDrawCost:.9,deqFastCost:.9,deq:function(e,t,n){return e.dequeue(t,n)},onDeqd:function(e,t){for(var n=0;n=3.99||n>2)return null;r.validateLayersElesOrdering(n,e);var o,s,l=r.layersByLevel,u=Math.pow(2,n),c=l[n]=l[n]||[];if(r.levelIsComplete(n,e))return c;!function(){var t=function(t){if(r.validateLayersElesOrdering(t,e),r.levelIsComplete(t,e))return s=l[t],!0},a=function(e){if(!s)for(var r=n+e;-4<=r&&r<=2&&!t(r);r+=e);};a(1),a(-1);for(var i=c.length-1;i>=0;i--){var o=c[i];o.invalid&&ct(c,o)}}();var d=function(t){var a=(t=t||{}).after;!function(){if(!o){o=Qt();for(var t=0;t32767||s>32767)return null;if(i*s>16e6)return null;var l=r.makeLayer(o,n);if(null!=a){var d=c.indexOf(a)+1;c.splice(d,0,l)}else(void 0===t.insert||t.insert)&&c.unshift(l);return l};if(r.skipping&&!i)return null;for(var h,f,p=null,g=e.length/1,v=!i,y=0;y=g||(h=p.bb,f=m.boundingBox(),!on(h,f.x1,f.y1)||!on(h,f.x2,f.y2)))&&!(p=d({insert:!0,after:p})))return null;s||v?r.queueLayer(p,m):r.drawEleInLayer(p,m,n,t),p.eles.push(m),x[n]=p}}return s||(v?null:c)},sd.getEleLevelForLayerLevel=function(e,t){return e},sd.drawEleInLayer=function(e,t,n,r){var a=this.renderer,i=e.context,o=t.boundingBox();0!==o.w&&0!==o.h&&t.visible()&&(n=this.getEleLevelForLayerLevel(n,r),a.setImgSmoothing(i,!1),a.drawCachedElement(i,t,null,null,n,true),a.setImgSmoothing(i,!0))},sd.levelIsComplete=function(e,t){var n=this.layersByLevel[e];if(!n||0===n.length)return!1;for(var r=0,a=0;a0)return!1;if(i.invalid)return!1;r+=i.eles.length}return r===t.length},sd.validateLayersElesOrdering=function(e,t){var n=this.layersByLevel[e];if(n)for(var r=0;r0){e=!0;break}}return e},sd.invalidateElements=function(e){var t=this;0!==e.length&&(t.lastInvalidationTime=Le(),0!==e.length&&t.haveLayers()&&t.updateElementsInLayers(e,(function(e,n,r){t.invalidateLayer(e)})))},sd.invalidateLayer=function(e){if(this.lastInvalidationTime=Le(),!e.invalid){var t=e.level,n=e.eles,r=this.layersByLevel[t];ct(r,e),e.elesQueue=[],e.invalid=!0,e.replacement&&(e.replacement.invalid=!0);for(var a=0;a3&&void 0!==arguments[3])||arguments[3],a=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],i=!(arguments.length>5&&void 0!==arguments[5])||arguments[5],o=this,s=t._private.rscratch;if((!i||t.visible())&&!s.badLine&&null!=s.allpts&&!isNaN(s.allpts[0])){var l;n&&(l=n,e.translate(-l.x1,-l.y1));var u=i?t.pstyle("opacity").value:1,c=i?t.pstyle("line-opacity").value:1,d=t.pstyle("curve-style").value,h=t.pstyle("line-style").value,f=t.pstyle("width").pfValue,p=t.pstyle("line-cap").value,g=t.pstyle("line-outline-width").value,v=t.pstyle("line-outline-color").value,y=u*c,m=u*c,b=function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:y;"straight-triangle"===d?(o.eleStrokeStyle(e,t,n),o.drawEdgeTrianglePath(t,e,s.allpts)):(e.lineWidth=f,e.lineCap=p,o.eleStrokeStyle(e,t,n),o.drawEdgePath(t,e,s.allpts,h),e.lineCap="butt")},x=function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:m;o.drawArrowheads(e,t,n)};if(e.lineJoin="round","yes"===t.pstyle("ghost").value){var w=t.pstyle("ghost-offset-x").pfValue,E=t.pstyle("ghost-offset-y").pfValue,k=t.pstyle("ghost-opacity").value,T=y*k;e.translate(w,E),b(T),x(T),e.translate(-w,-E)}else!function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:y;e.lineWidth=f+g,e.lineCap=p,g>0?(o.colorStrokeStyle(e,v[0],v[1],v[2],n),"straight-triangle"===d?o.drawEdgeTrianglePath(t,e,s.allpts):(o.drawEdgePath(t,e,s.allpts,h),e.lineCap="butt")):e.lineCap="butt"}();a&&o.drawEdgeUnderlay(e,t),b(),x(),a&&o.drawEdgeOverlay(e,t),o.drawElementText(e,t,null,r),n&&e.translate(l.x1,l.y1)}}},Cd=function(e){if(!["overlay","underlay"].includes(e))throw new Error("Invalid state");return function(t,n){if(n.visible()){var r=n.pstyle("".concat(e,"-opacity")).value;if(0!==r){var a=this,i=a.usePaths(),o=n._private.rscratch,s=2*n.pstyle("".concat(e,"-padding")).pfValue,l=n.pstyle("".concat(e,"-color")).value;t.lineWidth=s,"self"!==o.edgeType||i?t.lineCap="round":t.lineCap="butt",a.colorStrokeStyle(t,l[0],l[1],l[2],r),a.drawEdgePath(n,t,o.allpts,"solid")}}}};Td.drawEdgeOverlay=Cd("overlay"),Td.drawEdgeUnderlay=Cd("underlay"),Td.drawEdgePath=function(e,t,n,r){var a,i=e._private.rscratch,s=t,l=!1,u=this.usePaths(),c=e.pstyle("line-dash-pattern").pfValue,d=e.pstyle("line-dash-offset").pfValue;if(u){var h=n.join("$");i.pathCacheKey&&i.pathCacheKey===h?(a=t=i.pathCache,l=!0):(a=t=new Path2D,i.pathCacheKey=h,i.pathCache=a)}if(s.setLineDash)switch(r){case"dotted":s.setLineDash([1,1]);break;case"dashed":s.setLineDash(c),s.lineDashOffset=d;break;case"solid":s.setLineDash([])}if(!l&&!i.badLine)switch(t.beginPath&&t.beginPath(),t.moveTo(n[0],n[1]),i.edgeType){case"bezier":case"self":case"compound":case"multibezier":for(var f=2;f+35&&void 0!==arguments[5]?arguments[5]:5,o=arguments.length>6?arguments[6]:void 0;e.beginPath(),e.moveTo(t+i,n),e.lineTo(t+r-i,n),e.quadraticCurveTo(t+r,n,t+r,n+i),e.lineTo(t+r,n+a-i),e.quadraticCurveTo(t+r,n+a,t+r-i,n+a),e.lineTo(t+i,n+a),e.quadraticCurveTo(t,n+a,t,n+a-i),e.lineTo(t,n+i),e.quadraticCurveTo(t,n,t+i,n),e.closePath(),o?e.stroke():e.fill()}Sd.eleTextBiggerThanMin=function(e,t){if(!t){var n=e.cy().zoom(),r=this.getPixelRatio(),a=Math.ceil(Yt(n*r));t=Math.pow(2,a)}return!(e.pstyle("font-size").pfValue*t5&&void 0!==arguments[5])||arguments[5],o=this;if(null==r){if(i&&!o.eleTextBiggerThanMin(t))return}else if(!1===r)return;if(t.isNode()){var s=t.pstyle("label");if(!s||!s.value)return;var l=o.getLabelJustification(t);e.textAlign=l,e.textBaseline="bottom"}else{var u=t.element()._private.rscratch.badLine,c=t.pstyle("label"),d=t.pstyle("source-label"),h=t.pstyle("target-label");if(u||(!c||!c.value)&&(!d||!d.value)&&(!h||!h.value))return;e.textAlign="center",e.textBaseline="bottom"}var f,p=!n;n&&(f=n,e.translate(-f.x1,-f.y1)),null==a?(o.drawText(e,t,null,p,i),t.isEdge()&&(o.drawText(e,t,"source",p,i),o.drawText(e,t,"target",p,i))):o.drawText(e,t,a,p,i),n&&e.translate(f.x1,f.y1)},Sd.getFontCache=function(e){var t;this.fontCaches=this.fontCaches||[];for(var n=0;n2&&void 0!==arguments[2])||arguments[2],r=t.pstyle("font-style").strValue,a=t.pstyle("font-size").pfValue+"px",i=t.pstyle("font-family").strValue,o=t.pstyle("font-weight").strValue,s=n?t.effectiveOpacity()*t.pstyle("text-opacity").value:1,l=t.pstyle("text-outline-opacity").value*s,u=t.pstyle("color").value,c=t.pstyle("text-outline-color").value;e.font=r+" "+o+" "+a+" "+i,e.lineJoin="round",this.colorFillStyle(e,u[0],u[1],u[2],s),this.colorStrokeStyle(e,c[0],c[1],c[2],l)},Sd.getTextAngle=function(e,t){var n,r=e._private.rscratch,a=t?t+"-":"",i=e.pstyle(a+"text-rotation");if("autorotate"===i.strValue){var o=ht(r,"labelAngle",t);n=e.isEdge()?o:0}else n="none"===i.strValue?0:i.pfValue;return n},Sd.drawText=function(e,t,n){var r=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],a=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],i=t._private.rscratch,o=a?t.effectiveOpacity():1;if(!a||0!==o&&0!==t.pstyle("text-opacity").value){"main"===n&&(n=null);var s,l,u=ht(i,"labelX",n),c=ht(i,"labelY",n),d=this.getLabelText(t,n);if(null!=d&&""!==d&&!isNaN(u)&&!isNaN(c)){this.setupTextStyle(e,t,a);var h,f=n?n+"-":"",p=ht(i,"labelWidth",n),g=ht(i,"labelHeight",n),v=t.pstyle(f+"text-margin-x").pfValue,y=t.pstyle(f+"text-margin-y").pfValue,m=t.isEdge(),b=t.pstyle("text-halign").value,x=t.pstyle("text-valign").value;switch(m&&(b="center",x="center"),u+=v,c+=y,0!==(h=r?this.getTextAngle(t,n):0)&&(s=u,l=c,e.translate(s,l),e.rotate(h),u=0,c=0),x){case"top":break;case"center":c+=g/2;break;case"bottom":c+=g}var w=t.pstyle("text-background-opacity").value,E=t.pstyle("text-border-opacity").value,k=t.pstyle("text-border-width").pfValue,T=t.pstyle("text-background-padding").pfValue,C=0===t.pstyle("text-background-shape").strValue.indexOf("round");if(w>0||k>0&&E>0){var P=u-T;switch(b){case"left":P-=p;break;case"center":P-=p/2}var S=c-g-T,B=p+2*T,D=g+2*T;if(w>0){var _=e.fillStyle,A=t.pstyle("text-background-color").value;e.fillStyle="rgba("+A[0]+","+A[1]+","+A[2]+","+w*o+")",C?Bd(e,P,S,B,D,2):e.fillRect(P,S,B,D),e.fillStyle=_}if(k>0&&E>0){var M=e.strokeStyle,R=e.lineWidth,I=t.pstyle("text-border-color").value,N=t.pstyle("text-border-style").value;if(e.strokeStyle="rgba("+I[0]+","+I[1]+","+I[2]+","+E*o+")",e.lineWidth=k,e.setLineDash)switch(N){case"dotted":e.setLineDash([1,1]);break;case"dashed":e.setLineDash([4,2]);break;case"double":e.lineWidth=k/4,e.setLineDash([]);break;case"solid":e.setLineDash([])}if(C?Bd(e,P,S,B,D,2,"stroke"):e.strokeRect(P,S,B,D),"double"===N){var L=k/2;C?Bd(e,P+L,S+L,B-2*L,D-2*L,2,"stroke"):e.strokeRect(P+L,S+L,B-2*L,D-2*L)}e.setLineDash&&e.setLineDash([]),e.lineWidth=R,e.strokeStyle=M}}var z=2*t.pstyle("text-outline-width").pfValue;if(z>0&&(e.lineWidth=z),"wrap"===t.pstyle("text-wrap").value){var O=ht(i,"labelWrapCachedLines",n),V=ht(i,"labelLineHeight",n),F=p/2,j=this.getLabelJustification(t);switch("auto"===j||("left"===b?"left"===j?u+=-p:"center"===j&&(u+=-F):"center"===b?"left"===j?u+=-F:"right"===j&&(u+=F):"right"===b&&("center"===j?u+=F:"right"===j&&(u+=p))),x){case"top":case"center":case"bottom":c-=(O.length-1)*V}for(var X=0;X0&&e.strokeText(O[X],u,c),e.fillText(O[X],u,c),c+=V}else z>0&&e.strokeText(d,u,c),e.fillText(d,u,c);0!==h&&(e.rotate(-h),e.translate(-s,-l))}}};var Dd={drawNode:function(e,t,n){var r,a,i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],s=!(arguments.length>5&&void 0!==arguments[5])||arguments[5],l=this,u=t._private,c=u.rscratch,d=t.position();if(Q(d.x)&&Q(d.y)&&(!s||t.visible())){var h,f,p=s?t.effectiveOpacity():1,g=l.usePaths(),v=!1,y=t.padding();r=t.width()+2*y,a=t.height()+2*y,n&&(f=n,e.translate(-f.x1,-f.y1));for(var m=t.pstyle("background-image").value,b=new Array(m.length),x=new Array(m.length),w=0,E=0;E0&&void 0!==arguments[0]?arguments[0]:S;l.eleFillStyle(e,t,n)},q=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:N;l.colorStrokeStyle(e,B[0],B[1],B[2],t)},Y=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:V;l.colorStrokeStyle(e,z[0],z[1],z[2],t)},W=function(e,t,n,r){var a,i=l.nodePathCache=l.nodePathCache||[],o=Ue("polygon"===n?n+","+r.join(","):n,""+t,""+e,""+j),s=i[o],u=!1;return null!=s?(a=s,u=!0,c.pathCache=a):(a=new Path2D,i[o]=c.pathCache=a),{path:a,cacheHit:u}},U=t.pstyle("shape").strValue,H=t.pstyle("shape-polygon-points").pfValue;if(g){e.translate(d.x,d.y);var K=W(r,a,U,H);h=K.path,v=K.cacheHit}var G=function(){if(!v){var n=d;g&&(n={x:0,y:0}),l.nodeShapes[l.getNodeShape(t)].draw(h||e,n.x,n.y,r,a,j,c)}g?e.fill(h):e.fill()},Z=function(){for(var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:p,r=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],a=u.backgrounding,i=0,o=0;o0&&void 0!==arguments[0]&&arguments[0],i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:p;l.hasPie(t)&&(l.drawPie(e,t,i),n&&(g||l.nodeShapes[l.getNodeShape(t)].draw(e,d.x,d.y,r,a,j,c)))},J=function(){var n=arguments.length>0&&void 0!==arguments[0]&&arguments[0],i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:p;l.hasStripe(t)&&(e.save(),g?e.clip(c.pathCache):(l.nodeShapes[l.getNodeShape(t)].draw(e,d.x,d.y,r,a,j,c),e.clip()),l.drawStripe(e,t,i),e.restore(),n&&(g||l.nodeShapes[l.getNodeShape(t)].draw(e,d.x,d.y,r,a,j,c)))},ee=function(){var t=(C>0?C:-C)*(arguments.length>0&&void 0!==arguments[0]?arguments[0]:p),n=C>0?0:255;0!==C&&(l.colorFillStyle(e,n,n,n,t),g?e.fill(h):e.fill())},te=function(){if(P>0){if(e.lineWidth=P,e.lineCap=A,e.lineJoin=_,e.setLineDash)switch(D){case"dotted":e.setLineDash([1,1]);break;case"dashed":e.setLineDash(R),e.lineDashOffset=I;break;case"solid":case"double":e.setLineDash([])}if("center"!==M){if(e.save(),e.lineWidth*=2,"inside"===M)g?e.clip(h):e.clip();else{var t=new Path2D;t.rect(-r/2-P,-a/2-P,r+2*P,a+2*P),t.addPath(h),e.clip(t,"evenodd")}g?e.stroke(h):e.stroke(),e.restore()}else g?e.stroke(h):e.stroke();if("double"===D){e.lineWidth=P/3;var n=e.globalCompositeOperation;e.globalCompositeOperation="destination-out",g?e.stroke(h):e.stroke(),e.globalCompositeOperation=n}e.setLineDash&&e.setLineDash([])}},ne=function(){if(L>0){if(e.lineWidth=L,e.lineCap="butt",e.setLineDash)switch(O){case"dotted":e.setLineDash([1,1]);break;case"dashed":e.setLineDash([4,2]);break;case"solid":case"double":e.setLineDash([])}var n=d;g&&(n={x:0,y:0});var i=l.getNodeShape(t),o=P;"inside"===M&&(o=0),"outside"===M&&(o*=2);var s,u=(r+o+(L+F))/r,c=(a+o+(L+F))/a,h=r*u,f=a*c,p=l.nodeShapes[i].points;if(g)s=W(h,f,i,p).path;if("ellipse"===i)l.drawEllipsePath(s||e,n.x,n.y,h,f);else if(["round-diamond","round-heptagon","round-hexagon","round-octagon","round-pentagon","round-polygon","round-triangle","round-tag"].includes(i)){var v=0,y=0,m=0;"round-diamond"===i?v=1.4*(o+F+L):"round-heptagon"===i?(v=1.075*(o+F+L),m=-(o/2+F+L)/35):"round-hexagon"===i?v=1.12*(o+F+L):"round-pentagon"===i?(v=1.13*(o+F+L),m=-(o/2+F+L)/15):"round-tag"===i?(v=1.12*(o+F+L),y=.07*(o/2+L+F)):"round-triangle"===i&&(v=(o+F+L)*(Math.PI/2),m=-(o+F/2+L)/Math.PI),0!==v&&(h=r*(u=(r+v)/r),["round-hexagon","round-tag"].includes(i)||(f=a*(c=(a+v)/a)));for(var b=h/2,x=f/2,w=(j="auto"===j?Pn(h,f):j)+(o+L+F)/2,E=new Array(p.length/2),k=new Array(p.length/2),T=0;T0){if(r=r||n.position(),null==a||null==i){var d=n.padding();a=n.width()+2*d,i=n.height()+2*d}this.colorFillStyle(t,l[0],l[1],l[2],s),this.nodeShapes[u].draw(t,r.x,r.y,a+2*o,i+2*o,c),t.fill()}}}};Dd.drawNodeOverlay=_d("overlay"),Dd.drawNodeUnderlay=_d("underlay"),Dd.hasPie=function(e){return(e=e[0])._private.hasPie},Dd.hasStripe=function(e){return(e=e[0])._private.hasStripe},Dd.drawPie=function(e,t,n,r){t=t[0],r=r||t.position();var a,i=t.cy().style(),o=t.pstyle("pie-size"),s=t.pstyle("pie-hole"),l=t.pstyle("pie-start-angle").pfValue,u=r.x,c=r.y,d=t.width(),h=t.height(),f=Math.min(d,h)/2,p=0;if(this.usePaths()&&(u=0,c=0),"%"===o.units?f*=o.pfValue:void 0!==o.pfValue&&(f=o.pfValue/2),"%"===s.units?a=f*s.pfValue:void 0!==s.pfValue&&(a=s.pfValue/2),!(a>=f))for(var g=1;g<=i.pieBackgroundN;g++){var v=t.pstyle("pie-"+g+"-background-size").value,y=t.pstyle("pie-"+g+"-background-color").value,m=t.pstyle("pie-"+g+"-background-opacity").value*n,b=v/100;b+p>1&&(b=1-p);var x=1.5*Math.PI+2*Math.PI*p,w=(x+=l)+2*Math.PI*b;0===v||p>=1||p+b>1||(0===a?(e.beginPath(),e.moveTo(u,c),e.arc(u,c,f,x,w),e.closePath()):(e.beginPath(),e.arc(u,c,f,x,w),e.arc(u,c,a,w,x,!0),e.closePath()),this.colorFillStyle(e,y[0],y[1],y[2],m),e.fill(),p+=b)}},Dd.drawStripe=function(e,t,n,r){t=t[0],r=r||t.position();var a=t.cy().style(),i=r.x,o=r.y,s=t.width(),l=t.height(),u=0,c=this.usePaths();e.save();var d=t.pstyle("stripe-direction").value,h=t.pstyle("stripe-size");switch(d){case"vertical":break;case"righward":e.rotate(-Math.PI/2)}var f=s,p=l;"%"===h.units?(f*=h.pfValue,p*=h.pfValue):void 0!==h.pfValue&&(f=h.pfValue,p=h.pfValue),c&&(i=0,o=0),o-=f/2,i-=p/2;for(var g=1;g<=a.stripeBackgroundN;g++){var v=t.pstyle("stripe-"+g+"-background-size").value,y=t.pstyle("stripe-"+g+"-background-color").value,m=t.pstyle("stripe-"+g+"-background-opacity").value*n,b=v/100;b+u>1&&(b=1-u),0===v||u>=1||u+b>1||(e.beginPath(),e.rect(i,o+p*u,f,p*b),e.closePath(),this.colorFillStyle(e,y[0],y[1],y[2],m),e.fill(),u+=b)}e.restore()};var Ad,Md={};function Rd(e,t,n){var r=e.createShader(t);if(e.shaderSource(r,n),e.compileShader(r),!e.getShaderParameter(r,e.COMPILE_STATUS))throw new Error(e.getShaderInfoLog(r));return r}function Id(e,t,n){void 0===n&&(n=t);var r=e.makeOffscreenCanvas(t,n),a=r.context=r.getContext("2d");return r.clear=function(){return a.clearRect(0,0,r.width,r.height)},r.clear(),r}function Nd(e){var t=e.pixelRatio,n=e.cy.zoom(),r=e.cy.pan();return{zoom:n*t,pan:{x:r.x*t,y:r.y*t}}}function Ld(e){return"solid"===e.pstyle("background-fill").value&&("none"===e.pstyle("background-image").strValue&&(0===e.pstyle("border-width").value||(0===e.pstyle("border-opacity").value||"solid"===e.pstyle("border-style").value)))}function zd(e,t){if(e.length!==t.length)return!1;for(var n=0;n>8&255)/255,n[2]=(e>>16&255)/255,n[3]=(e>>24&255)/255,n}function Fd(e){return e[0]+(e[1]<<8)+(e[2]<<16)+(e[3]<<24)}function jd(e,t){switch(t){case"float":return[1,e.FLOAT,4];case"vec2":return[2,e.FLOAT,4];case"vec3":return[3,e.FLOAT,4];case"vec4":return[4,e.FLOAT,4];case"int":return[1,e.INT,4];case"ivec2":return[2,e.INT,4]}}function Xd(e,t,n){switch(t){case e.FLOAT:return new Float32Array(n);case e.INT:return new Int32Array(n)}}function qd(e,t,n,r,a,i){switch(t){case e.FLOAT:return new Float32Array(n.buffer,i*r,a);case e.INT:return new Int32Array(n.buffer,i*r,a)}}function Yd(e,t,n,r){var a=l(jd(e,n),3),i=a[0],o=a[1],s=a[2],u=Xd(e,o,t*i),c=i*s,d=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,d),e.bufferData(e.ARRAY_BUFFER,t*c,e.DYNAMIC_DRAW),e.enableVertexAttribArray(r),o===e.FLOAT?e.vertexAttribPointer(r,i,o,!1,c,0):o===e.INT&&e.vertexAttribIPointer(r,i,o,c,0),e.vertexAttribDivisor(r,1),e.bindBuffer(e.ARRAY_BUFFER,null);for(var h=new Array(t),f=0;ft.minMbLowQualFrames&&(t.motionBlurPxRatio=t.mbPxRBlurry)),t.clearingMotionBlur&&(t.motionBlurPxRatio=1),t.textureDrawLastFrame&&!d&&(c[t.NODE]=!0,c[t.SELECT_BOX]=!0);var m=n.style(),b=n.zoom(),x=void 0!==o?o:b,w=n.pan(),E={x:w.x,y:w.y},k={zoom:b,pan:{x:w.x,y:w.y}},T=t.prevViewport;void 0===T||k.zoom!==T.zoom||k.pan.x!==T.pan.x||k.pan.y!==T.pan.y||g&&!p||(t.motionBlurPxRatio=1),s&&(E=s),x*=l,E.x*=l,E.y*=l;var C=t.getCachedZSortedEles();function P(e,n,r,a,i){var o=e.globalCompositeOperation;e.globalCompositeOperation="destination-out",t.colorFillStyle(e,255,255,255,t.motionBlurTransparency),e.fillRect(n,r,a,i),e.globalCompositeOperation=o}function S(e,n){var i,l,c,d;t.clearingMotionBlur||e!==u.bufferContexts[t.MOTIONBLUR_BUFFER_NODE]&&e!==u.bufferContexts[t.MOTIONBLUR_BUFFER_DRAG]?(i=E,l=x,c=t.canvasWidth,d=t.canvasHeight):(i={x:w.x*f,y:w.y*f},l=b*f,c=t.canvasWidth*f,d=t.canvasHeight*f),e.setTransform(1,0,0,1,0,0),"motionBlur"===n?P(e,0,0,c,d):r||void 0!==n&&!n||e.clearRect(0,0,c,d),a||(e.translate(i.x,i.y),e.scale(l,l)),s&&e.translate(s.x,s.y),o&&e.scale(o,o)}if(d||(t.textureDrawLastFrame=!1),d){if(t.textureDrawLastFrame=!0,!t.textureCache){t.textureCache={},t.textureCache.bb=n.mutableElements().boundingBox(),t.textureCache.texture=t.data.bufferCanvases[t.TEXTURE_BUFFER];var B=t.data.bufferContexts[t.TEXTURE_BUFFER];B.setTransform(1,0,0,1,0,0),B.clearRect(0,0,t.canvasWidth*t.textureMult,t.canvasHeight*t.textureMult),t.render({forcedContext:B,drawOnlyNodeLayer:!0,forcedPxRatio:l*t.textureMult}),(k=t.textureCache.viewport={zoom:n.zoom(),pan:n.pan(),width:t.canvasWidth,height:t.canvasHeight}).mpan={x:(0-k.pan.x)/k.zoom,y:(0-k.pan.y)/k.zoom}}c[t.DRAG]=!1,c[t.NODE]=!1;var D=u.contexts[t.NODE],_=t.textureCache.texture;k=t.textureCache.viewport;D.setTransform(1,0,0,1,0,0),h?P(D,0,0,k.width,k.height):D.clearRect(0,0,k.width,k.height);var A=m.core("outside-texture-bg-color").value,M=m.core("outside-texture-bg-opacity").value;t.colorFillStyle(D,A[0],A[1],A[2],M),D.fillRect(0,0,k.width,k.height);b=n.zoom();S(D,!1),D.clearRect(k.mpan.x,k.mpan.y,k.width/k.zoom/l,k.height/k.zoom/l),D.drawImage(_,k.mpan.x,k.mpan.y,k.width/k.zoom/l,k.height/k.zoom/l)}else t.textureOnViewport&&!r&&(t.textureCache=null);var R=n.extent(),I=t.pinching||t.hoverData.dragging||t.swipePanning||t.data.wheelZooming||t.hoverData.draggingEles||t.cy.animated(),N=t.hideEdgesOnViewport&&I,L=[];if(L[t.NODE]=!c[t.NODE]&&h&&!t.clearedForMotionBlur[t.NODE]||t.clearingMotionBlur,L[t.NODE]&&(t.clearedForMotionBlur[t.NODE]=!0),L[t.DRAG]=!c[t.DRAG]&&h&&!t.clearedForMotionBlur[t.DRAG]||t.clearingMotionBlur,L[t.DRAG]&&(t.clearedForMotionBlur[t.DRAG]=!0),c[t.NODE]||a||i||L[t.NODE]){var z=h&&!L[t.NODE]&&1!==f;S(D=r||(z?t.data.bufferContexts[t.MOTIONBLUR_BUFFER_NODE]:u.contexts[t.NODE]),h&&!z?"motionBlur":void 0),N?t.drawCachedNodes(D,C.nondrag,l,R):t.drawLayeredElements(D,C.nondrag,l,R),t.debug&&t.drawDebugPoints(D,C.nondrag),a||h||(c[t.NODE]=!1)}if(!i&&(c[t.DRAG]||a||L[t.DRAG])){z=h&&!L[t.DRAG]&&1!==f;S(D=r||(z?t.data.bufferContexts[t.MOTIONBLUR_BUFFER_DRAG]:u.contexts[t.DRAG]),h&&!z?"motionBlur":void 0),N?t.drawCachedNodes(D,C.drag,l,R):t.drawCachedElements(D,C.drag,l,R),t.debug&&t.drawDebugPoints(D,C.drag),a||h||(c[t.DRAG]=!1)}if(this.drawSelectionRectangle(e,S),h&&1!==f){var O=u.contexts[t.NODE],V=t.data.bufferCanvases[t.MOTIONBLUR_BUFFER_NODE],F=u.contexts[t.DRAG],j=t.data.bufferCanvases[t.MOTIONBLUR_BUFFER_DRAG],X=function(e,n,r){e.setTransform(1,0,0,1,0,0),r||!y?e.clearRect(0,0,t.canvasWidth,t.canvasHeight):P(e,0,0,t.canvasWidth,t.canvasHeight);var a=f;e.drawImage(n,0,0,t.canvasWidth*a,t.canvasHeight*a,0,0,t.canvasWidth,t.canvasHeight)};(c[t.NODE]||L[t.NODE])&&(X(O,V,L[t.NODE]),c[t.NODE]=!1),(c[t.DRAG]||L[t.DRAG])&&(X(F,j,L[t.DRAG]),c[t.DRAG]=!1)}t.prevViewport=k,t.clearingMotionBlur&&(t.clearingMotionBlur=!1,t.motionBlurCleared=!0,t.motionBlur=!0),h&&(t.motionBlurTimeout=setTimeout((function(){t.motionBlurTimeout=null,t.clearedForMotionBlur[t.NODE]=!1,t.clearedForMotionBlur[t.DRAG]=!1,t.motionBlur=!1,t.clearingMotionBlur=!d,t.mbFrames=0,c[t.NODE]=!0,c[t.DRAG]=!0,t.redraw()}),100)),r||n.emit("render")},Md.drawSelectionRectangle=function(e,t){var n=this,r=n.cy,a=n.data,i=r.style(),o=e.drawOnlyNodeLayer,s=e.drawAllLayers,l=a.canvasNeedsRedraw,u=e.forcedContext;if(n.showFps||!o&&l[n.SELECT_BOX]&&!s){var c=u||a.contexts[n.SELECT_BOX];if(t(c),1==n.selection[4]&&(n.hoverData.selecting||n.touchData.selecting)){var d=n.cy.zoom(),h=i.core("selection-box-border-width").value/d;c.lineWidth=h,c.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+")",c.fillRect(n.selection[0],n.selection[1],n.selection[2]-n.selection[0],n.selection[3]-n.selection[1]),h>0&&(c.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+")",c.strokeRect(n.selection[0],n.selection[1],n.selection[2]-n.selection[0],n.selection[3]-n.selection[1]))}if(a.bgActivePosistion&&!n.hoverData.selecting){d=n.cy.zoom();var f=a.bgActivePosistion;c.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+")",c.beginPath(),c.arc(f.x,f.y,i.core("active-bg-size").pfValue/d,0,2*Math.PI),c.fill()}var p=n.lastRedrawTime;if(n.showFps&&p){p=Math.round(p);var g=Math.round(1e3/p),v="1 frame = "+p+" ms = "+g+" fps";if(c.setTransform(1,0,0,1,0,0),c.fillStyle="rgba(255, 0, 0, 0.75)",c.strokeStyle="rgba(255, 0, 0, 0.75)",c.font="30px Arial",!Ad){var y=c.measureText(v);Ad=y.actualBoundingBoxAscent}c.fillText(v,0,Ad);c.strokeRect(0,Ad+10,250,20),c.fillRect(0,Ad+10,250*Math.min(g/60,1),20)}s||(l[n.SELECT_BOX]=!1)}};var Wd="undefined"!==typeof Float32Array?Float32Array:Array;function Ud(){var e=new Wd(9);return Wd!=Float32Array&&(e[1]=0,e[2]=0,e[3]=0,e[5]=0,e[6]=0,e[7]=0),e[0]=1,e[4]=1,e[8]=1,e}function Hd(e){return e[0]=1,e[1]=0,e[2]=0,e[3]=0,e[4]=1,e[5]=0,e[6]=0,e[7]=0,e[8]=1,e}function Kd(e,t,n){var r=t[0],a=t[1],i=t[2],o=t[3],s=t[4],l=t[5],u=t[6],c=t[7],d=t[8],h=n[0],f=n[1];return e[0]=r,e[1]=a,e[2]=i,e[3]=o,e[4]=s,e[5]=l,e[6]=h*r+f*o+u,e[7]=h*a+f*s+c,e[8]=h*i+f*l+d,e}function Gd(e,t,n){var r=t[0],a=t[1],i=t[2],o=t[3],s=t[4],l=t[5],u=t[6],c=t[7],d=t[8],h=Math.sin(n),f=Math.cos(n);return e[0]=f*r+h*o,e[1]=f*a+h*s,e[2]=f*i+h*l,e[3]=f*o-h*r,e[4]=f*s-h*a,e[5]=f*l-h*i,e[6]=u,e[7]=c,e[8]=d,e}function Zd(e,t,n){var r=n[0],a=n[1];return e[0]=r*t[0],e[1]=r*t[1],e[2]=r*t[2],e[3]=a*t[3],e[4]=a*t[4],e[5]=a*t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e}Math.hypot||(Math.hypot=function(){for(var e=0,t=arguments.length;t--;)e+=arguments[t]*arguments[t];return Math.sqrt(e)});var $d=function(){return i((function e(t,n,r,i){a(this,e),this.debugID=Math.floor(1e4*Math.random()),this.r=t,this.texSize=n,this.texRows=r,this.texHeight=Math.floor(n/r),this.enableWrapping=!0,this.locked=!1,this.texture=null,this.needsBuffer=!0,this.freePointer={x:0,row:0},this.keyToLocation=new Map,this.canvas=i(t,n,n),this.scratch=i(t,n,this.texHeight,"scratch")}),[{key:"lock",value:function(){this.locked=!0}},{key:"getKeys",value:function(){return new Set(this.keyToLocation.keys())}},{key:"getScale",value:function(e){var t=e.w,n=e.h,r=this.texHeight,a=this.texSize,i=r/n,o=t*i,s=n*i;return o>a&&(o=t*(i=a/t),s=n*i),{scale:i,texW:o,texH:s}}},{key:"draw",value:function(e,t,n){var r=this;if(this.locked)throw new Error("can't draw, atlas is locked");var a=this.texSize,i=this.texRows,o=this.texHeight,s=this.getScale(t),l=s.scale,u=s.texW,c=s.texH,d=function(e,r){if(n&&r){var a=r.context,i=e.x,s=e.row,u=i,c=o*s;a.save(),a.translate(u,c),a.scale(l,l),n(a,t),a.restore()}},h=[null,null],f=function(){d(r.freePointer,r.canvas),h[0]={x:r.freePointer.x,y:r.freePointer.row*o,w:u,h:c},h[1]={x:r.freePointer.x+u,y:r.freePointer.row*o,w:0,h:c},r.freePointer.x+=u,r.freePointer.x==a&&(r.freePointer.x=0,r.freePointer.row++)},p=function(){r.freePointer.x=0,r.freePointer.row++};if(this.freePointer.x+u<=a)f();else{if(this.freePointer.row>=i-1)return!1;this.freePointer.x===a?(p(),f()):this.enableWrapping?function(){var e=r.scratch,t=r.canvas;e.clear(),d({x:0,row:0},e);var n=a-r.freePointer.x,i=u-n,s=o,l=r.freePointer.x,f=r.freePointer.row*o,p=n;t.context.drawImage(e,0,0,p,s,l,f,p,s),h[0]={x:l,y:f,w:p,h:c};var g=n,v=(r.freePointer.row+1)*o,y=i;t&&t.context.drawImage(e,g,0,y,s,0,v,y,s),h[1]={x:0,y:v,w:y,h:c},r.freePointer.x=i,r.freePointer.row++}():(p(),f())}return this.keyToLocation.set(e,h),this.needsBuffer=!0,h}},{key:"getOffsets",value:function(e){return this.keyToLocation.get(e)}},{key:"isEmpty",value:function(){return 0===this.freePointer.x&&0===this.freePointer.row}},{key:"canFit",value:function(e){if(this.locked)return!1;var t=this.texSize,n=this.texRows,r=this.getScale(e).texW;return!(this.freePointer.x+r>t)||this.freePointer.row1&&void 0!==arguments[1]?arguments[1]:{},a=r.forceRedraw,i=void 0!==a&&a,s=r.filterEle,l=void 0===s?function(){return!0}:s,u=r.filterType,c=void 0===u?function(){return!0}:u,d=!1,h=!1,f=o(e);try{for(f.s();!(t=f.n()).done;){var p=t.value;if(l(p)){var g,v=o(this.renderTypes.values());try{var y=function(){var e=g.value,t=e.type;if(c(t)){var r=n.collections.get(e.collection),a=e.getKey(p),o=Array.isArray(a)?a:[a];if(i)o.forEach((function(e){return r.markKeyForGC(e)})),h=!0;else{var s=e.getID?e.getID(p):p.id(),l=n._key(t,s),u=n.typeAndIdToKey.get(l);void 0===u||zd(o,u)||(d=!0,n.typeAndIdToKey.delete(l),u.forEach((function(e){return r.markKeyForGC(e)})))}}};for(v.s();!(g=v.n()).done;)y()}catch(m){v.e(m)}finally{v.f()}}}}catch(m){f.e(m)}finally{f.f()}return h&&(this.gc(),d=!1),d}},{key:"gc",value:function(){var e,t=o(this.collections.values());try{for(t.s();!(e=t.n()).done;){e.value.gc()}}catch(n){t.e(n)}finally{t.f()}}},{key:"getOrCreateAtlas",value:function(e,t,n,r){var a=this.renderTypes.get(t),i=this.collections.get(a.collection),o=!1,s=i.draw(r,n,(function(t){a.drawClipped?(t.save(),t.beginPath(),t.rect(0,0,n.w,n.h),t.clip(),a.drawElement(t,e,n,!0,!0),t.restore()):a.drawElement(t,e,n,!0,!0),o=!0}));if(o){var l=a.getID?a.getID(e):e.id(),u=this._key(t,l);this.typeAndIdToKey.has(u)?this.typeAndIdToKey.get(u).push(r):this.typeAndIdToKey.set(u,[r])}return s}},{key:"getAtlasInfo",value:function(e,t){var n=this,r=this.renderTypes.get(t),a=r.getKey(e);return(Array.isArray(a)?a:[a]).map((function(a){var i=r.getBoundingBox(e,a),o=n.getOrCreateAtlas(e,t,i,a),s=l(o.getOffsets(a),2),u=s[0];return{atlas:o,tex:u,tex1:u,tex2:s[1],bb:i}}))}},{key:"getDebugInfo",value:function(){var e,t=[],n=o(this.collections);try{for(n.s();!(e=n.n()).done;){var r=l(e.value,2),a=r[0],i=r[1].getCounts(),s=i.keyCount,u=i.atlasCount;t.push({type:a,keyCount:s,atlasCount:u})}}catch(c){n.e(c)}finally{n.f()}return t}}])}(),eh=function(){return i((function e(t){a(this,e),this.globalOptions=t,this.atlasSize=t.webglTexSize,this.maxAtlasesPerBatch=t.webglTexPerBatch,this.batchAtlases=[]}),[{key:"getMaxAtlasesPerBatch",value:function(){return this.maxAtlasesPerBatch}},{key:"getAtlasSize",value:function(){return this.atlasSize}},{key:"getIndexArray",value:function(){return Array.from({length:this.maxAtlasesPerBatch},(function(e,t){return t}))}},{key:"startBatch",value:function(){this.batchAtlases=[]}},{key:"getAtlasCount",value:function(){return this.batchAtlases.length}},{key:"getAtlases",value:function(){return this.batchAtlases}},{key:"canAddToCurrentBatch",value:function(e){return this.batchAtlases.length!==this.maxAtlasesPerBatch||this.batchAtlases.includes(e)}},{key:"getAtlasIndexForBatch",value:function(e){var t=this.batchAtlases.indexOf(e);if(t<0){if(this.batchAtlases.length===this.maxAtlasesPerBatch)throw new Error("cannot add more atlases to batch");this.batchAtlases.push(e),t=this.batchAtlases.length-1}return t}}])}(),th={SCREEN:{name:"screen",screen:!0},PICKING:{name:"picking",picking:!0}},nh=1,rh=2,ah=function(){return i((function e(t,n,r){a(this,e),this.r=t,this.gl=n,this.maxInstances=r.webglBatchSize,this.atlasSize=r.webglTexSize,this.bgColor=r.bgColor,this.debug=r.webglDebug,this.batchDebugInfo=[],r.enableWrapping=!0,r.createTextureCanvas=Id,this.atlasManager=new Jd(t,r),this.batchManager=new eh(r),this.simpleShapeOptions=new Map,this.program=this._createShaderProgram(th.SCREEN),this.pickingProgram=this._createShaderProgram(th.PICKING),this.vao=this._createVAO()}),[{key:"addAtlasCollection",value:function(e,t){this.atlasManager.addAtlasCollection(e,t)}},{key:"addTextureAtlasRenderType",value:function(e,t){this.atlasManager.addRenderType(e,t)}},{key:"addSimpleShapeRenderType",value:function(e,t){this.simpleShapeOptions.set(e,t)}},{key:"invalidate",value:function(e){var t=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}).type,n=this.atlasManager;return t?n.invalidate(e,{filterType:function(e){return e===t},forceRedraw:!0}):n.invalidate(e)}},{key:"gc",value:function(){this.atlasManager.gc()}},{key:"_createShaderProgram",value:function(e){var t=this.gl,n="#version 300 es\n precision highp float;\n\n uniform mat3 uPanZoomMatrix;\n uniform int uAtlasSize;\n \n // instanced\n in vec2 aPosition; // a vertex from the unit square\n \n in mat3 aTransform; // used to transform verticies, eg into a bounding box\n in int aVertType; // the type of thing we are rendering\n\n // the z-index that is output when using picking mode\n in vec4 aIndex;\n \n // For textures\n in int aAtlasId; // which shader unit/atlas to use\n in vec4 aTex; // x/y/w/h of texture in atlas\n\n // for edges\n in vec4 aPointAPointB;\n in vec4 aPointCPointD;\n in vec2 aLineWidth; // also used for node border width\n\n // simple shapes\n in vec4 aCornerRadius; // for round-rectangle [top-right, bottom-right, top-left, bottom-left]\n in vec4 aColor; // also used for edges\n in vec4 aBorderColor; // aLineWidth is used for border width\n\n // output values passed to the fragment shader\n out vec2 vTexCoord;\n out vec4 vColor;\n out vec2 vPosition;\n // flat values are not interpolated\n flat out int vAtlasId; \n flat out int vVertType;\n flat out vec2 vTopRight;\n flat out vec2 vBotLeft;\n flat out vec4 vCornerRadius;\n flat out vec4 vBorderColor;\n flat out vec2 vBorderWidth;\n flat out vec4 vIndex;\n \n void main(void) {\n int vid = gl_VertexID;\n vec2 position = aPosition; // TODO make this a vec3, simplifies some code below\n\n if(aVertType == ".concat(0,") {\n float texX = aTex.x; // texture coordinates\n float texY = aTex.y;\n float texW = aTex.z;\n float texH = aTex.w;\n\n if(vid == 1 || vid == 2 || vid == 4) {\n texX += texW;\n }\n if(vid == 2 || vid == 4 || vid == 5) {\n texY += texH;\n }\n\n float d = float(uAtlasSize);\n vTexCoord = vec2(texX / d, texY / d); // tex coords must be between 0 and 1\n\n gl_Position = vec4(uPanZoomMatrix * aTransform * vec3(position, 1.0), 1.0);\n }\n else if(aVertType == ").concat(4," || aVertType == ").concat(7," \n || aVertType == ").concat(5," || aVertType == ").concat(6,") { // simple shapes\n\n // the bounding box is needed by the fragment shader\n vBotLeft = (aTransform * vec3(0, 0, 1)).xy; // flat\n vTopRight = (aTransform * vec3(1, 1, 1)).xy; // flat\n vPosition = (aTransform * vec3(position, 1)).xy; // will be interpolated\n\n // calculations are done in the fragment shader, just pass these along\n vColor = aColor;\n vCornerRadius = aCornerRadius;\n vBorderColor = aBorderColor;\n vBorderWidth = aLineWidth;\n\n gl_Position = vec4(uPanZoomMatrix * aTransform * vec3(position, 1.0), 1.0);\n }\n else if(aVertType == ").concat(1,") {\n vec2 source = aPointAPointB.xy;\n vec2 target = aPointAPointB.zw;\n\n // adjust the geometry so that the line is centered on the edge\n position.y = position.y - 0.5;\n\n // stretch the unit square into a long skinny rectangle\n vec2 xBasis = target - source;\n vec2 yBasis = normalize(vec2(-xBasis.y, xBasis.x));\n vec2 point = source + xBasis * position.x + yBasis * aLineWidth[0] * position.y;\n\n gl_Position = vec4(uPanZoomMatrix * vec3(point, 1.0), 1.0);\n vColor = aColor;\n } \n else if(aVertType == ").concat(2,") {\n vec2 pointA = aPointAPointB.xy;\n vec2 pointB = aPointAPointB.zw;\n vec2 pointC = aPointCPointD.xy;\n vec2 pointD = aPointCPointD.zw;\n\n // adjust the geometry so that the line is centered on the edge\n position.y = position.y - 0.5;\n\n vec2 p0, p1, p2, pos;\n if(position.x == 0.0) { // The left side of the unit square\n p0 = pointA;\n p1 = pointB;\n p2 = pointC;\n pos = position;\n } else { // The right side of the unit square, use same approach but flip the geometry upside down\n p0 = pointD;\n p1 = pointC;\n p2 = pointB;\n pos = vec2(0.0, -position.y);\n }\n\n vec2 p01 = p1 - p0;\n vec2 p12 = p2 - p1;\n vec2 p21 = p1 - p2;\n\n // Find the normal vector.\n vec2 tangent = normalize(normalize(p12) + normalize(p01));\n vec2 normal = vec2(-tangent.y, tangent.x);\n\n // Find the vector perpendicular to p0 -> p1.\n vec2 p01Norm = normalize(vec2(-p01.y, p01.x));\n\n // Determine the bend direction.\n float sigma = sign(dot(p01 + p21, normal));\n float width = aLineWidth[0];\n\n if(sign(pos.y) == -sigma) {\n // This is an intersecting vertex. Adjust the position so that there's no overlap.\n vec2 point = 0.5 * width * normal * -sigma / dot(normal, p01Norm);\n gl_Position = vec4(uPanZoomMatrix * vec3(p1 + point, 1.0), 1.0);\n } else {\n // This is a non-intersecting vertex. Treat it like a mitre join.\n vec2 point = 0.5 * width * normal * sigma * dot(normal, p01Norm);\n gl_Position = vec4(uPanZoomMatrix * vec3(p1 + point, 1.0), 1.0);\n }\n\n vColor = aColor;\n } \n else if(aVertType == ").concat(3," && vid < 3) {\n // massage the first triangle into an edge arrow\n if(vid == 0)\n position = vec2(-0.15, -0.3);\n if(vid == 1)\n position = vec2( 0.0, 0.0);\n if(vid == 2)\n position = vec2( 0.15, -0.3);\n\n gl_Position = vec4(uPanZoomMatrix * aTransform * vec3(position, 1.0), 1.0);\n vColor = aColor;\n }\n else {\n gl_Position = vec4(2.0, 0.0, 0.0, 1.0); // discard vertex by putting it outside webgl clip space\n }\n\n vAtlasId = aAtlasId;\n vVertType = aVertType;\n vIndex = aIndex;\n }\n "),r=this.batchManager.getIndexArray(),a="#version 300 es\n precision highp float;\n\n // declare texture unit for each texture atlas in the batch\n ".concat(r.map((function(e){return"uniform sampler2D uTexture".concat(e,";")})).join("\n\t"),"\n\n uniform vec4 uBGColor;\n uniform float uZoom;\n\n in vec2 vTexCoord;\n in vec4 vColor;\n in vec2 vPosition; // model coordinates\n\n flat in int vAtlasId;\n flat in vec4 vIndex;\n flat in int vVertType;\n flat in vec2 vTopRight;\n flat in vec2 vBotLeft;\n flat in vec4 vCornerRadius;\n flat in vec4 vBorderColor;\n flat in vec2 vBorderWidth;\n\n out vec4 outColor;\n\n ").concat("\n float circleSD(vec2 p, float r) {\n return distance(vec2(0), p) - r; // signed distance\n }\n","\n ").concat("\n float rectangleSD(vec2 p, vec2 b) {\n vec2 d = abs(p)-b;\n return distance(vec2(0),max(d,0.0)) + min(max(d.x,d.y),0.0);\n }\n","\n ").concat("\n float roundRectangleSD(vec2 p, vec2 b, vec4 cr) {\n cr.xy = (p.x > 0.0) ? cr.xy : cr.zw;\n cr.x = (p.y > 0.0) ? cr.x : cr.y;\n vec2 q = abs(p) - b + cr.x;\n return min(max(q.x, q.y), 0.0) + distance(vec2(0), max(q, 0.0)) - cr.x;\n }\n","\n ").concat("\n float ellipseSD(vec2 p, vec2 ab) {\n p = abs( p ); // symmetry\n\n // find root with Newton solver\n vec2 q = ab*(p-ab);\n float w = (q.x1.0) ? d : -d;\n }\n","\n\n vec4 blend(vec4 top, vec4 bot) { // blend colors with premultiplied alpha\n return vec4( \n top.rgb + (bot.rgb * (1.0 - top.a)),\n top.a + (bot.a * (1.0 - top.a)) \n );\n }\n\n vec4 distInterp(vec4 cA, vec4 cB, float d) { // interpolate color using Signed Distance\n // scale to the zoom level so that borders don't look blurry when zoomed in\n // note 1.5 is an aribitrary value chosen because it looks good\n return mix(cA, cB, 1.0 - smoothstep(0.0, 1.5 / uZoom, abs(d))); \n }\n\n void main(void) {\n if(vVertType == ").concat(0,") {\n // look up the texel from the texture unit\n ").concat(r.map((function(e){return"if(vAtlasId == ".concat(e,") outColor = texture(uTexture").concat(e,", vTexCoord);")})).join("\n\telse "),"\n } \n else if(vVertType == ").concat(3,") {\n // mimics how canvas renderer uses context.globalCompositeOperation = 'destination-out';\n outColor = blend(vColor, uBGColor);\n outColor.a = 1.0; // make opaque, masks out line under arrow\n }\n else if(vVertType == ").concat(4," && vBorderWidth == vec2(0.0)) { // simple rectangle with no border\n outColor = vColor; // unit square is already transformed to the rectangle, nothing else needs to be done\n }\n else if(vVertType == ").concat(4," || vVertType == ").concat(7," \n || vVertType == ").concat(5," || vVertType == ").concat(6,") { // use SDF\n\n float outerBorder = vBorderWidth[0];\n float innerBorder = vBorderWidth[1];\n float borderPadding = outerBorder * 2.0;\n float w = vTopRight.x - vBotLeft.x - borderPadding;\n float h = vTopRight.y - vBotLeft.y - borderPadding;\n vec2 b = vec2(w/2.0, h/2.0); // half width, half height\n vec2 p = vPosition - vec2(vTopRight.x - b[0] - outerBorder, vTopRight.y - b[1] - outerBorder); // translate to center\n\n float d; // signed distance\n if(vVertType == ").concat(4,") {\n d = rectangleSD(p, b);\n } else if(vVertType == ").concat(7," && w == h) {\n d = circleSD(p, b.x); // faster than ellipse\n } else if(vVertType == ").concat(7,") {\n d = ellipseSD(p, b);\n } else {\n d = roundRectangleSD(p, b, vCornerRadius.wzyx);\n }\n\n // use the distance to interpolate a color to smooth the edges of the shape, doesn't need multisampling\n // we must smooth colors inwards, because we can't change pixels outside the shape's bounding box\n if(d > 0.0) {\n if(d > outerBorder) {\n discard;\n } else {\n outColor = distInterp(vBorderColor, vec4(0), d - outerBorder);\n }\n } else {\n if(d > innerBorder) {\n vec4 outerColor = outerBorder == 0.0 ? vec4(0) : vBorderColor;\n vec4 innerBorderColor = blend(vBorderColor, vColor);\n outColor = distInterp(innerBorderColor, outerColor, d);\n } \n else {\n vec4 outerColor;\n if(innerBorder == 0.0 && outerBorder == 0.0) {\n outerColor = vec4(0);\n } else if(innerBorder == 0.0) {\n outerColor = vBorderColor;\n } else {\n outerColor = blend(vBorderColor, vColor);\n }\n outColor = distInterp(vColor, outerColor, d - innerBorder);\n }\n }\n }\n else {\n outColor = vColor;\n }\n\n ").concat(e.picking?"if(outColor.a == 0.0) discard;\n else outColor = vIndex;":"","\n }\n "),i=function(e,t,n){var r=Rd(e,e.VERTEX_SHADER,t),a=Rd(e,e.FRAGMENT_SHADER,n),i=e.createProgram();if(e.attachShader(i,r),e.attachShader(i,a),e.linkProgram(i),!e.getProgramParameter(i,e.LINK_STATUS))throw new Error("Could not initialize shaders");return i}(t,n,a);i.aPosition=t.getAttribLocation(i,"aPosition"),i.aIndex=t.getAttribLocation(i,"aIndex"),i.aVertType=t.getAttribLocation(i,"aVertType"),i.aTransform=t.getAttribLocation(i,"aTransform"),i.aAtlasId=t.getAttribLocation(i,"aAtlasId"),i.aTex=t.getAttribLocation(i,"aTex"),i.aPointAPointB=t.getAttribLocation(i,"aPointAPointB"),i.aPointCPointD=t.getAttribLocation(i,"aPointCPointD"),i.aLineWidth=t.getAttribLocation(i,"aLineWidth"),i.aColor=t.getAttribLocation(i,"aColor"),i.aCornerRadius=t.getAttribLocation(i,"aCornerRadius"),i.aBorderColor=t.getAttribLocation(i,"aBorderColor"),i.uPanZoomMatrix=t.getUniformLocation(i,"uPanZoomMatrix"),i.uAtlasSize=t.getUniformLocation(i,"uAtlasSize"),i.uBGColor=t.getUniformLocation(i,"uBGColor"),i.uZoom=t.getUniformLocation(i,"uZoom"),i.uTextures=[];for(var o=0;o1&&void 0!==arguments[1]?arguments[1]:th.SCREEN;this.panZoomMatrix=e,this.renderTarget=t,this.batchDebugInfo=[],this.wrappedCount=0,this.simpleCount=0,this.startBatch()}},{key:"startBatch",value:function(){this.instanceCount=0,this.batchManager.startBatch()}},{key:"endFrame",value:function(){this.endBatch()}},{key:"_isVisible",value:function(e,t){return!!e.visible()&&(!t||!t.isVisible||t.isVisible(e))}},{key:"drawTexture",value:function(e,t,n){var r=this.atlasManager,a=this.batchManager,i=r.getRenderTypeOpts(n);if(this._isVisible(e,i)){if(this.renderTarget.picking&&i.getTexPickingMode){var s=i.getTexPickingMode(e);if(s===nh)return;if(s==rh)return void this.drawPickingRectangle(e,t,n)}var u,c=o(r.getAtlasInfo(e,n));try{for(c.s();!(u=c.n()).done;){var d=u.value,h=d.atlas,f=d.tex1,p=d.tex2;a.canAddToCurrentBatch(h)||this.endBatch();for(var g=a.getAtlasIndexForBatch(h),v=0,y=[[f,!0],[p,!1]];v=this.maxInstances&&this.endBatch()}}}}catch(T){c.e(T)}finally{c.f()}}}},{key:"setTransformMatrix",value:function(e,t,n,r){var a=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],i=0;if(n.shapeProps&&n.shapeProps.padding&&(i=e.pstyle(n.shapeProps.padding).pfValue),r){var o=r.bb,s=r.tex1,l=r.tex2,u=s.w/(s.w+l.w);a||(u=1-u);var c=this._getAdjustedBB(o,i,a,u);this._applyTransformMatrix(t,c,n,e)}else{var d=n.getBoundingBox(e),h=this._getAdjustedBB(d,i,!0,1);this._applyTransformMatrix(t,h,n,e)}}},{key:"_applyTransformMatrix",value:function(e,t,n,r){var a,i;Hd(e);var o=n.getRotation?n.getRotation(r):0;if(0!==o){var s=n.getRotationPoint(r);Kd(e,e,[s.x,s.y]),Gd(e,e,o);var l=n.getRotationOffset(r);a=l.x+(t.xOffset||0),i=l.y+(t.yOffset||0)}else a=t.x1,i=t.y1;Kd(e,e,[a,i]),Zd(e,e,[t.w,t.h])}},{key:"_getAdjustedBB",value:function(e,t,n,r){var a=e.x1,i=e.y1,o=e.w,s=e.h;t&&(a-=t,i-=t,o+=2*t,s+=2*t);var l=0,u=o*r;return n&&r<1?o=u:!n&&r<1&&(a+=l=o-u,o=u),{x1:a,y1:i,w:o,h:s,xOffset:l,yOffset:e.yOffset}}},{key:"drawPickingRectangle",value:function(e,t,n){var r=this.atlasManager.getRenderTypeOpts(n),a=this.instanceCount;this.vertTypeBuffer.getView(a)[0]=4,Vd(t,this.indexBuffer.getView(a)),Od([0,0,0],1,this.colorBuffer.getView(a));var i=this.transformBuffer.getMatrixView(a);this.setTransformMatrix(e,i,r),this.simpleCount++,this.instanceCount++,this.instanceCount>=this.maxInstances&&this.endBatch()}},{key:"drawNode",value:function(e,t,n){var r=this.simpleShapeOptions.get(n);if(this._isVisible(e,r)){var a=r.shapeProps,i=this._getVertTypeForShape(e,a.shape);if(void 0===i||r.isSimple&&!r.isSimple(e))this.drawTexture(e,t,n);else{var o=this.instanceCount;if(this.vertTypeBuffer.getView(o)[0]=i,5===i||6===i){var s=r.getBoundingBox(e),l=this._getCornerRadius(e,a.radius,s),u=this.cornerRadiusBuffer.getView(o);u[0]=l,u[1]=l,u[2]=l,u[3]=l,6===i&&(u[0]=0,u[2]=0)}Vd(t,this.indexBuffer.getView(o)),Od(e.pstyle(a.color).value,e.pstyle(a.opacity).value,this.colorBuffer.getView(o));var c=this.lineWidthBuffer.getView(o);if(c[0]=0,c[1]=0,a.border){var d=e.pstyle("border-width").value;if(d>0){Od(e.pstyle("border-color").value,e.pstyle("border-opacity").value,this.borderColorBuffer.getView(o));var h=e.pstyle("border-position").value;if("inside"===h)c[0]=0,c[1]=-d;else if("outside"===h)c[0]=d,c[1]=0;else{var f=d/2;c[0]=f,c[1]=-f}}}var p=this.transformBuffer.getMatrixView(o);this.setTransformMatrix(e,p,r),this.simpleCount++,this.instanceCount++,this.instanceCount>=this.maxInstances&&this.endBatch()}}}},{key:"_getVertTypeForShape",value:function(e,t){switch(e.pstyle(t).value){case"rectangle":return 4;case"ellipse":return 7;case"roundrectangle":case"round-rectangle":return 5;case"bottom-round-rectangle":return 6;default:return}}},{key:"_getCornerRadius",value:function(e,t,n){var r=n.w,a=n.h;if("auto"===e.pstyle(t).value)return Cn(r,a);var i=e.pstyle(t).pfValue,o=r/2,s=a/2;return Math.min(i,s,o)}},{key:"drawEdgeArrow",value:function(e,t,n){if(e.visible()){var r,a,i,o=e._private.rscratch;if("source"===n?(r=o.arrowStartX,a=o.arrowStartY,i=o.srcArrowAngle):(r=o.arrowEndX,a=o.arrowEndY,i=o.tgtArrowAngle),!(isNaN(r)||null==r||isNaN(a)||null==a||isNaN(i)||null==i))if("none"!==e.pstyle(n+"-arrow-shape").value){var s=e.pstyle(n+"-arrow-color").value,l=e.pstyle("opacity").value*e.pstyle("line-opacity").value,u=e.pstyle("width").pfValue,c=e.pstyle("arrow-scale").value,d=this.r.getArrowWidth(u,c),h=this.instanceCount,f=this.transformBuffer.getMatrixView(h);Hd(f),Kd(f,f,[r,a]),Zd(f,f,[d,d]),Gd(f,f,i),this.vertTypeBuffer.getView(h)[0]=3,Vd(t,this.indexBuffer.getView(h)),Od(s,l,this.colorBuffer.getView(h)),this.instanceCount++,this.instanceCount>=this.maxInstances&&this.endBatch()}}}},{key:"drawEdgeLine",value:function(e,t){if(e.visible()){var n=this._getEdgePoints(e);if(n){var r=e.pstyle("opacity").value,a=e.pstyle("line-opacity").value,i=e.pstyle("width").pfValue,o=e.pstyle("line-color").value,s=r*a;if(n.length/2+this.instanceCount>this.maxInstances&&this.endBatch(),4==n.length){var l=this.instanceCount;this.vertTypeBuffer.getView(l)[0]=1,Vd(t,this.indexBuffer.getView(l)),Od(o,s,this.colorBuffer.getView(l)),this.lineWidthBuffer.getView(l)[0]=i;var u=this.pointAPointBBuffer.getView(l);u[0]=n[0],u[1]=n[1],u[2]=n[2],u[3]=n[3],this.instanceCount++,this.instanceCount>=this.maxInstances&&this.endBatch()}else for(var c=0;c=this.maxInstances&&this.endBatch()}}}}},{key:"_getEdgePoints",value:function(e){var t=e._private.rscratch;if(!t.badLine&&null!=t.allpts&&!isNaN(t.allpts[0])){var n=t.allpts;if(4==n.length)return n;var r=this._getNumSegments(e);return this._getCurveSegmentPoints(n,r)}}},{key:"_getNumSegments",value:function(e){return Math.min(Math.max(15,5),this.maxInstances)}},{key:"_getCurveSegmentPoints",value:function(e,t){if(4==e.length)return e;for(var n=Array(2*(t+1)),r=0;r<=t;r++)if(0==r)n[0]=e[0],n[1]=e[1];else if(r==t)n[2*r]=e[e.length-2],n[2*r+1]=e[e.length-1];else{var a=r/t;this._setCurvePoint(e,a,n,2*r)}return n}},{key:"_setCurvePoint",value:function(e,t,n,r){if(!(e.length<=2)){for(var a=Array(e.length-2),i=0;i0}},u=function(e){return"yes"===e.pstyle("text-events").strValue?rh:nh},c=function(e){var t=e.position(),n=t.x,r=t.y,a=e.outerWidth(),i=e.outerHeight();return{w:a,h:i,x1:n-a/2,y1:r-i/2}};n.drawing.addAtlasCollection("node",{texRows:e.webglTexRowsNodes}),n.drawing.addAtlasCollection("label",{texRows:e.webglTexRows}),n.drawing.addTextureAtlasRenderType("node-body",{collection:"node",getKey:t.getStyleKey,getBoundingBox:t.getElementBox,drawElement:t.drawElement}),n.drawing.addSimpleShapeRenderType("node-body",{getBoundingBox:c,isSimple:Ld,shapeProps:{shape:"shape",color:"background-color",opacity:"background-opacity",radius:"corner-radius",border:!0}}),n.drawing.addSimpleShapeRenderType("node-overlay",{getBoundingBox:c,isVisible:s("overlay"),shapeProps:{shape:"overlay-shape",color:"overlay-color",opacity:"overlay-opacity",padding:"overlay-padding",radius:"overlay-corner-radius"}}),n.drawing.addSimpleShapeRenderType("node-underlay",{getBoundingBox:c,isVisible:s("underlay"),shapeProps:{shape:"underlay-shape",color:"underlay-color",opacity:"underlay-opacity",padding:"underlay-padding",radius:"underlay-corner-radius"}}),n.drawing.addTextureAtlasRenderType("label",{collection:"label",getTexPickingMode:u,getKey:sh(t.getLabelKey,null),getBoundingBox:lh(t.getLabelBox,null),drawClipped:!0,drawElement:t.drawLabel,getRotation:a(null),getRotationPoint:t.getLabelRotationPoint,getRotationOffset:t.getLabelRotationOffset,isVisible:i("label")}),n.drawing.addTextureAtlasRenderType("edge-source-label",{collection:"label",getTexPickingMode:u,getKey:sh(t.getSourceLabelKey,"source"),getBoundingBox:lh(t.getSourceLabelBox,"source"),drawClipped:!0,drawElement:t.drawSourceLabel,getRotation:a("source"),getRotationPoint:t.getSourceLabelRotationPoint,getRotationOffset:t.getSourceLabelRotationOffset,isVisible:i("source-label")}),n.drawing.addTextureAtlasRenderType("edge-target-label",{collection:"label",getTexPickingMode:u,getKey:sh(t.getTargetLabelKey,"target"),getBoundingBox:lh(t.getTargetLabelBox,"target"),drawClipped:!0,drawElement:t.drawTargetLabel,getRotation:a("target"),getRotationPoint:t.getTargetLabelRotationPoint,getRotationOffset:t.getTargetLabelRotationOffset,isVisible:i("target-label")});var d=Ae((function(){console.log("garbage collect flag set"),n.data.gc=!0}),1e4);n.onUpdateEleCalcs((function(e,t){var r=!1;t&&t.length>0&&(r|=n.drawing.invalidate(t)),r&&d()})),function(e){var t=e.render;e.render=function(n){n=n||{};var r=e.cy;e.webgl&&(r.zoom()>td?(!function(e){var t=e.data.contexts[e.WEBGL];t.clear(t.COLOR_BUFFER_BIT|t.DEPTH_BUFFER_BIT)}(e),t.call(e,n)):(!function(e){var t=function(t){t.save(),t.setTransform(1,0,0,1,0,0),t.clearRect(0,0,e.canvasWidth,e.canvasHeight),t.restore()};t(e.data.contexts[e.NODE]),t(e.data.contexts[e.DRAG])}(e),dh(e,n,th.SCREEN)))};var n=e.matchCanvasSize;e.matchCanvasSize=function(t){n.call(e,t),e.pickingFrameBuffer.setFramebufferAttachmentSizes(e.canvasWidth,e.canvasHeight),e.pickingFrameBuffer.needsDraw=!0},e.findNearestElements=function(t,n,r,a){return function(e,t,n){var r,a,i,s=function(e,t,n){var r,a,i,o,s=Nd(e),u=s.pan,c=s.zoom,d=function(e,t,n,r,a){var i=r*n+t.x,o=a*n+t.y;return[i,o=Math.round(e.canvasHeight-o)]}(e,u,c,t,n),h=l(d,2),f=h[0],p=h[1],g=6;if(r=f-g/2,a=p-g/2,o=g,0===(i=g)||0===o)return[];var v=e.data.contexts[e.WEBGL];v.bindFramebuffer(v.FRAMEBUFFER,e.pickingFrameBuffer),e.pickingFrameBuffer.needsDraw&&(v.viewport(0,0,v.canvas.width,v.canvas.height),dh(e,null,th.PICKING),e.pickingFrameBuffer.needsDraw=!1);var y=i*o,m=new Uint8Array(4*y);v.readPixels(r,a,i,o,v.RGBA,v.UNSIGNED_BYTE,m),v.bindFramebuffer(v.FRAMEBUFFER,null);for(var b=new Set,x=0;x=0&&b.add(w)}return b}(e,t,n),u=e.getCachedZSortedEles(),c=o(s);try{for(c.s();!(i=c.n()).done;){var d=u[i.value];if(!r&&d.isNode()&&(r=d),!a&&d.isEdge()&&(a=d),r&&a)break}}catch(h){c.e(h)}finally{c.f()}return[r,a].filter(Boolean)}(e,t,n)};var r=e.invalidateCachedZSortedEles;e.invalidateCachedZSortedEles=function(){r.call(e),e.pickingFrameBuffer.needsDraw=!0};var a=e.notify;e.notify=function(t,n){a.call(e,t,n),"viewport"===t||"bounds"===t?e.pickingFrameBuffer.needsDraw=!0:"background"===t&&e.drawing.invalidate(n,{type:"node-body"})}}(n)};var sh=function(e,t){return function(n){var r=e(n),a=oh(n,t);return a.length>1?a.map((function(e,t){return"".concat(r,"_").concat(t)})):r}},lh=function(e,t){return function(n,r){var a=e(n);if("string"===typeof r){var i=r.indexOf("_");if(i>0){var o=Number(r.substring(i+1)),s=oh(n,t),l=a.h/s.length,u=l*o,c=a.y1+u;return{x1:a.x1,w:a.w,y1:c,h:l,yOffset:u}}}return a}};function uh(e,t){var n=e.canvasWidth,r=e.canvasHeight,a=Nd(e),i=a.pan,o=a.zoom;t.setTransform(1,0,0,1,0,0),t.clearRect(0,0,n,r),t.translate(i.x,i.y),t.scale(o,o)}function ch(e,t,n){var r=e.drawing;t+=1,n.isNode()?(r.drawNode(n,t,"node-underlay"),r.drawNode(n,t,"node-body"),r.drawTexture(n,t,"label"),r.drawNode(n,t,"node-overlay")):(r.drawEdgeLine(n,t),r.drawEdgeArrow(n,t,"source"),r.drawEdgeArrow(n,t,"target"),r.drawTexture(n,t,"label"),r.drawTexture(n,t,"edge-source-label"),r.drawTexture(n,t,"edge-target-label"))}function dh(e,t,n){var r;e.webglDebug&&(r=performance.now());var a=e.drawing,i=0;if(n.screen&&e.data.canvasNeedsRedraw[e.SELECT_BOX]&&function(e,t){e.drawSelectionRectangle(t,(function(t){return uh(e,t)}))}(e,t),e.data.canvasNeedsRedraw[e.NODE]||n.picking){var s=e.data.contexts[e.WEBGL];n.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 l=function(e){var t=e.canvasWidth,n=e.canvasHeight,r=Nd(e),a=r.pan,i=r.zoom,o=Ud();Kd(o,o,[a.x,a.y]),Zd(o,o,[i,i]);var s=Ud();!function(e,t,n){e[0]=2/t,e[1]=0,e[2]=0,e[3]=0,e[4]=-2/n,e[5]=0,e[6]=-1,e[7]=1,e[8]=1}(s,t,n);var l=Ud();return function(e,t,n){var r=t[0],a=t[1],i=t[2],o=t[3],s=t[4],l=t[5],u=t[6],c=t[7],d=t[8],h=n[0],f=n[1],p=n[2],g=n[3],v=n[4],y=n[5],m=n[6],b=n[7],x=n[8];e[0]=h*r+f*o+p*u,e[1]=h*a+f*s+p*c,e[2]=h*i+f*l+p*d,e[3]=g*r+v*o+y*u,e[4]=g*a+v*s+y*c,e[5]=g*i+v*l+y*d,e[6]=m*r+b*o+x*u,e[7]=m*a+b*s+x*c,e[8]=m*i+b*l+x*d}(l,s,o),l}(e),u=e.getCachedZSortedEles();if(i=u.length,a.startFrame(l,n),n.screen){for(var c=0;c0&&i>0){h.clearRect(0,0,a,i),h.globalCompositeOperation="source-over";var f=this.getCachedZSortedEles();if(e.full)h.translate(-n.x1*l,-n.y1*l),h.scale(l,l),this.drawElements(h,f),h.scale(1/l,1/l),h.translate(n.x1*l,n.y1*l);else{var p=t.pan(),g={x:p.x*l,y:p.y*l};l*=t.zoom(),h.translate(g.x,g.y),h.scale(l,l),this.drawElements(h,f),h.scale(1/l,1/l),h.translate(-g.x,-g.y)}e.bg&&(h.globalCompositeOperation="destination-over",h.fillStyle=e.bg,h.rect(0,0,a,i),h.fill())}return d},bh.png=function(e){return wh(e,this.bufferCanvasImage(e),"image/png")},bh.jpg=function(e){return wh(e,this.bufferCanvasImage(e),"image/jpeg")};var Eh={nodeShapeImpl:function(e,t,n,r,a,i,o,s){switch(e){case"ellipse":return this.drawEllipsePath(t,n,r,a,i);case"polygon":return this.drawPolygonPath(t,n,r,a,i,o);case"round-polygon":return this.drawRoundPolygonPath(t,n,r,a,i,o,s);case"roundrectangle":case"round-rectangle":return this.drawRoundRectanglePath(t,n,r,a,i,s);case"cutrectangle":case"cut-rectangle":return this.drawCutRectanglePath(t,n,r,a,i,o,s);case"bottomroundrectangle":case"bottom-round-rectangle":return this.drawBottomRoundRectanglePath(t,n,r,a,i,s);case"barrel":return this.drawBarrelPath(t,n,r,a,i)}}},kh=Ch,Th=Ch.prototype;function Ch(e){var t=this,n=t.cy.window().document;e.webgl&&(Th.CANVAS_LAYERS=t.CANVAS_LAYERS=4,console.log("webgl rendering enabled")),t.data={canvases:new Array(Th.CANVAS_LAYERS),contexts:new Array(Th.CANVAS_LAYERS),canvasNeedsRedraw:new Array(Th.CANVAS_LAYERS),bufferCanvases:new Array(Th.BUFFER_COUNT),bufferContexts:new Array(Th.CANVAS_LAYERS)};var r="-webkit-tap-highlight-color",a="rgba(0,0,0,0)";t.data.canvasContainer=n.createElement("div");var i=t.data.canvasContainer.style;t.data.canvasContainer.style[r]=a,i.position="relative",i.zIndex="0",i.overflow="hidden";var o=e.cy.container();o.appendChild(t.data.canvasContainer),o.style[r]=a;var s={"-webkit-user-select":"none","-moz-user-select":"-moz-none","user-select":"none","-webkit-tap-highlight-color":"rgba(0,0,0,0)","outline-style":"none"};p&&p.userAgent.match(/msie|trident|edge/i)&&(s["-ms-touch-action"]="none",s["touch-action"]="none");for(var 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};\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\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 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ézier_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 shiftBoundingBox = function shiftBoundingBox(bb, dx, dy) {\n return {\n x1: bb.x1 + dx,\n x2: bb.x2 + dx,\n y1: bb.y1 + dy,\n y2: bb.y2 + dy,\n w: bb.w,\n h: bb.h\n };\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 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};\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 _i2 = 0; _i2 < points.length / 2; _i2++) {\n currentX = points[_i2 * 2];\n currentY = points[_i2 * 2 + 1];\n if (_i2 < points.length / 2 - 1) {\n nextX = points[(_i2 + 1) * 2];\n nextY = points[(_i2 + 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 _i3 = 1; _i3 < intersections.length / 2; _i3++) {\n var squaredDistance = Math.pow(intersections[_i3 * 2] - x, 2) + Math.pow(intersections[_i3 * 2 + 1] - y, 2);\n if (squaredDistance <= lowestSquaredDistance) {\n lowestIntersection[0] = intersections[_i3 * 2];\n lowestIntersection[1] = intersections[_i3 * 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 _i4 = 0; _i4 < sides; _i4++) {\n x = points[2 * _i4] = points[2 * _i4] * sx;\n y = points[2 * _i4 + 1] = points[2 * _i4 + 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 _i5 = 0; _i5 < sides; _i5++) {\n y = points[2 * _i5 + 1] = points[2 * _i5 + 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 if (outlineOpacity > 0 && outlineWidth > 0) {\n var outlineOffset = ele.pstyle('outline-offset').value;\n var nodeShape = ele.pstyle('shape').value;\n var outlineSize = outlineWidth + outlineOffset;\n var scaleX = (bounds.w + outlineSize * 2) / bounds.w;\n var scaleY = (bounds.h + outlineSize * 2) / bounds.h;\n var xOffset = 0;\n var yOffset = 0;\n if ([\"diamond\", \"pentagon\", \"round-triangle\"].includes(nodeShape)) {\n scaleX = (bounds.w + outlineSize * 2.4) / bounds.w;\n yOffset = -outlineSize / 3.6;\n } else if ([\"concave-hexagon\", \"rhomboid\", \"right-rhomboid\"].includes(nodeShape)) {\n scaleX = (bounds.w + outlineSize * 2.4) / bounds.w;\n } else if (nodeShape === \"star\") {\n scaleX = (bounds.w + outlineSize * 2.8) / bounds.w;\n scaleY = (bounds.h + outlineSize * 2.6) / bounds.h;\n yOffset = -outlineSize / 3.8;\n } else if (nodeShape === \"triangle\") {\n scaleX = (bounds.w + outlineSize * 2.8) / bounds.w;\n scaleY = (bounds.h + outlineSize * 2.4) / bounds.h;\n yOffset = -outlineSize / 1.4;\n } else if (nodeShape === \"vee\") {\n scaleX = (bounds.w + outlineSize * 4.4) / bounds.w;\n scaleY = (bounds.h + outlineSize * 3.8) / bounds.h;\n yOffset = -outlineSize * .5;\n }\n var hDelta = bounds.h * scaleY - bounds.h;\n var wDelta = bounds.w * scaleX - bounds.w;\n expandBoundingBoxSides(bounds, [Math.ceil(hDelta / 2), Math.ceil(wDelta / 2)]);\n if (xOffset != 0 || yOffset !== 0) {\n var oBounds = shiftBoundingBox(bounds, xOffset, yOffset);\n updateBoundingBox(bounds, oBounds);\n }\n }\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 && options.includeOutlines) {\n updateBoundsFromOutline(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' || curveStyle.endsWith('segments') || curveStyle.endsWith('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 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']\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 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 '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 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 cyExtent = cy.extent();\n var bb = makeBoundingBox(hasBoundingBox ? options.boundingBox : {\n x1: cyExtent.x1,\n y1: cyExtent.y1,\n w: cyExtent.w,\n h: cyExtent.h\n });\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 getPosition = function getPosition(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 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 var pctX = (lnode.positionX - coseBB.x1) / coseBB.w;\n var pctY = (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 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 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 for (var e = 0; e < eles.length; e++) {\n var ele = eles[e];\n if (ele.isNode()) {\n var node = ele;\n var eventsEnabled = node.pstyle('text-events').strValue === 'yes';\n var boxSelectEnabled = node.pstyle('box-select-labels').strValue === 'yes';\n var nodeBb = node.boundingBox({\n includeNodes: true,\n includeEdges: false,\n includeLabels: boxSelectEnabled && eventsEnabled\n });\n if (boundingBoxesIntersect(boxBb, nodeBb)) {\n var rotatedLabelBox = getRotatedLabelBox(node);\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 if (satPolygonIntersection(rotatedLabelBox, selectionBox)) {\n box.push(node);\n }\n }\n } else {\n var edge = ele;\n var _p = edge._private;\n var rs = _p.rscratch;\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 === 'haystack' || rs.edgeType === 'straight') {\n box.push(edge);\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' || curveStyle.endsWith('segments') || curveStyle === 'straight' || curveStyle === 'straight-triangle' || curveStyle.endsWith('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' || _curveStyle.endsWith('segments') || _curveStyle.endsWith('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 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 = curveStyle === '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 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, tgtPos.y] : rs.segpts.slice(0, 2);\n var tgtArrowFromPt = !segments ? [srcPos.x, srcPos.y] : 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 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({\n originalEvent: e,\n type: 'taphold',\n position: {\n x: pos[0],\n y: pos[1]\n }\n });\n } else {\n cy.emit({\n originalEvent: e,\n type: 'taphold',\n position: {\n x: pos[0],\n y: pos[1]\n }\n });\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 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 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 goIntoBoxMode = function goIntoBoxMode() {\n r.data.bgActivePosistion = undefined;\n if (!r.hoverData.selecting) {\n cy.emit({\n originalEvent: e,\n type: 'boxstart',\n position: {\n x: pos[0],\n y: pos[1]\n }\n });\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 = {\n originalEvent: e,\n type: 'cxtdrag',\n position: {\n x: pos[0],\n y: pos[1]\n }\n };\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({\n originalEvent: e,\n type: 'cxtdragout',\n position: {\n x: pos[0],\n y: pos[1]\n }\n });\n }\n r.hoverData.cxtOver = near;\n if (near) {\n near.emit({\n originalEvent: e,\n type: 'cxtdragover',\n position: {\n x: pos[0],\n y: pos[1]\n }\n });\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('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('freeon');\n draggedElements.emit('free');\n if (r.dragData.didDrag) {\n down.emit('dragfreeon');\n draggedElements.emit('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('position 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 if (r.hoverData.which === 3) {\n var cxtEvt = {\n originalEvent: e,\n type: 'cxttapend',\n position: {\n x: pos[0],\n y: pos[1]\n }\n };\n if (down) {\n down.emit(cxtEvt);\n } else {\n cy.emit(cxtEvt);\n }\n if (!r.hoverData.cxtDragged) {\n var cxtTap = {\n originalEvent: e,\n type: 'cxttap',\n position: {\n x: pos[0],\n y: pos[1]\n }\n };\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({\n type: 'boxend',\n originalEvent: e,\n position: {\n x: pos[0],\n y: pos[1]\n }\n });\n var eleWouldBeSelected = function eleWouldBeSelected(ele) {\n return ele.selectable() && !ele.selected();\n };\n if (cy.selectionType() === 'additive') {\n box.emit('box').stdFilter(eleWouldBeSelected).select().emit('boxselect');\n } else {\n if (!multSelKeyDown) {\n cy.$(isSelected).unmerge(box).unselect();\n }\n box.emit('box').stdFilter(eleWouldBeSelected).select().emit('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('freeon');\n draggedElements.emit('free');\n if (r.dragData.didDrag) {\n down.emit('dragfreeon');\n draggedElements.emit('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 (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(e.type === 'gesturechange' ? 'pinchzoom' : 'scrollzoom');\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\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({\n originalEvent: e,\n type: 'cxttapstart',\n position: {\n x: now[0],\n y: now[1]\n }\n });\n r.touchData.start = near1;\n } else if (near2 && near2.isNode()) {\n near2.activate().emit({\n originalEvent: e,\n type: 'cxttapstart',\n position: {\n x: now[0],\n y: now[1]\n }\n });\n r.touchData.start = near2;\n } else {\n cy.emit({\n originalEvent: e,\n type: 'cxttapstart',\n position: {\n x: now[0],\n y: now[1]\n }\n });\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 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 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 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 = {\n originalEvent: e,\n type: 'cxttapend',\n position: {\n x: now[0],\n y: now[1]\n }\n };\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 = {\n originalEvent: e,\n type: 'cxtdrag',\n position: {\n x: now[0],\n y: now[1]\n }\n };\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({\n originalEvent: e,\n type: 'cxtdragout',\n position: {\n x: now[0],\n y: now[1]\n }\n });\n }\n r.touchData.cxtOver = near;\n if (near) {\n near.emit({\n originalEvent: e,\n type: 'cxtdragover',\n position: {\n x: now[0],\n y: now[1]\n }\n });\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({\n originalEvent: e,\n type: 'boxstart',\n position: {\n x: now[0],\n y: now[1]\n }\n });\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('freeon');\n draggedEles.emit('free');\n if (r.dragData.didDrag) {\n _start.emit('dragfreeon');\n draggedEles.emit('dragfree');\n }\n }\n cy.viewport({\n zoom: zoom2,\n pan: pan2,\n cancelOnFailedZoom: true\n });\n cy.emit('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('position 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({\n originalEvent: e,\n type: 'tapdragout',\n position: {\n x: now[0],\n y: now[1]\n }\n });\n }\n if (near) {\n near.emit({\n originalEvent: e,\n type: 'tapdragover',\n position: {\n x: now[0],\n y: now[1]\n }\n });\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('dragpan');\n } else if (isOverThresholdDrag) {\n r.swipePanning = true;\n cy.panBy({\n x: dx * zoom,\n y: dy * zoom\n });\n cy.emit('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 if (start) {\n start.unactivate();\n }\n var ctxTapend;\n if (r.touchData.cxt) {\n ctxTapend = {\n originalEvent: e,\n type: 'cxttapend',\n position: {\n x: now[0],\n y: now[1]\n }\n };\n if (start) {\n start.emit(ctxTapend);\n } else {\n cy.emit(ctxTapend);\n }\n if (!r.touchData.cxtDragged) {\n var ctxTap = {\n originalEvent: e,\n type: 'cxttap',\n position: {\n x: now[0],\n y: now[1]\n }\n };\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({\n type: 'boxend',\n originalEvent: e,\n position: {\n x: now[0],\n y: now[1]\n }\n });\n var eleWouldBeSelected = function eleWouldBeSelected(ele) {\n return ele.selectable() && !ele.selected();\n };\n box.emit('box').stdFilter(eleWouldBeSelected).select().emit('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('freeon');\n draggedEles.emit('free');\n if (r.dragData.didDrag) {\n start.emit('dragfreeon');\n draggedEles.emit('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 };\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(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\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};\n\n// TODO ensure re-used\nfunction roundRect(ctx, x, y, width, height) {\n var radius = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : 5;\n var stroke = arguments.length > 6 ? arguments[6] : undefined;\n ctx.beginPath();\n ctx.moveTo(x + radius, y);\n ctx.lineTo(x + width - radius, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + radius);\n ctx.lineTo(x + width, y + height - radius);\n ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);\n ctx.lineTo(x + radius, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - radius);\n ctx.lineTo(x, y + radius);\n ctx.quadraticCurveTo(x, y, x + radius, y);\n ctx.closePath();\n if (stroke) ctx.stroke();else ctx.fill();\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.indexOf('round') === 0;\n var roundRadius = 2;\n if (backgroundOpacity > 0 || 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 (backgroundOpacity > 0) {\n var textFill = context.fillStyle;\n var textBackgroundColor = ele.pstyle('text-background-color').value;\n context.fillStyle = 'rgba(' + textBackgroundColor[0] + ',' + textBackgroundColor[1] + ',' + textBackgroundColor[2] + ',' + backgroundOpacity * parentOpacity + ')';\n if (rounded) {\n roundRect(context, bgX, bgY, bgW, bgH, roundRadius);\n } else {\n context.fillRect(bgX, bgY, bgW, bgH);\n }\n context.fillStyle = textFill;\n }\n if (textBorderWidth > 0 && borderOpacity > 0) {\n var textStroke = context.strokeStyle;\n var textLineWidth = context.lineWidth;\n var textBorderColor = ele.pstyle('text-border-color').value;\n var textBorderStyle = ele.pstyle('text-border-style').value;\n context.strokeStyle = 'rgba(' + textBorderColor[0] + ',' + textBorderColor[1] + ',' + textBorderColor[2] + ',' + borderOpacity * parentOpacity + ')';\n context.lineWidth = textBorderWidth;\n if (context.setLineDash) {\n // for very outofdate browsers\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; // 50% reserved for white between the two borders\n context.setLineDash([]);\n break;\n case 'solid':\n context.setLineDash([]);\n break;\n }\n }\n if (rounded) {\n roundRect(context, bgX, bgY, bgW, bgH, roundRadius, 'stroke');\n } else {\n context.strokeRect(bgX, bgY, bgW, bgH);\n }\n if (textBorderStyle === 'double') {\n var whiteWidth = textBorderWidth / 2;\n if (rounded) {\n roundRect(context, bgX + whiteWidth, bgY + whiteWidth, bgW - whiteWidth * 2, bgH - whiteWidth * 2, roundRadius, 'stroke');\n } else {\n context.strokeRect(bgX + whiteWidth, bgY + whiteWidth, bgW - whiteWidth * 2, bgH - whiteWidth * 2);\n }\n }\n if (context.setLineDash) {\n // for very outofdate browsers\n context.setLineDash([]);\n }\n context.lineWidth = textLineWidth;\n context.strokeStyle = textStroke;\n }\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

5DCTfI)TSlxF}CA>i|&P z-USOYK0sZHUzl5`M+xENOhlV%N!#3e!z7>vnWB!La+{dv9X>M70Y z^lhaykeaP_dM0M|KVAR#zTvlwuLv+Z|4Mot$5_v^vz~yIj?+iBO(BFMu~U=>%`Hf0 z&XXqB#C5Bm!;x4Gw((dmU>f(ZOcpuNQ}7&&f)j+?>+MKSKmJI&h;2Ma4ZkLj;BG1p zFfuOY;A+^a;T0n;rrYSRPYeWE-czo1BXI-X#)>FQh@iMqNAF%R6(I|CbgV@zp{JgS zty-5cM@t%Z30m&S{Q9i4paW($3p8P9K+F+f*RUUE0Fb?yD}KslSq06lax}j$gTqI` zAa2rOzSe6(9c>#=?dGQ^b7JXnL0YkGZ6j-DZQnH!P8ZGosQ&hfwfh$+`h_Bb-%^o3 z8s;}HVK8;0piYsV*|f1U@O^&_OH_vor{j4E#=3e};K$_?aB<}l?LDYOEFs4qyifZwcOcL01 zvci_{5P%_w+%o%K3Y2N<#2O*d%=n(OYC=$px(P=Tx-$wboK)sg|ANZ?bAB&gmWX~A zZqLF{ppNJJV2P~c5}FJE?M3H{B8ec!Kh$a}aBLc!0V$gFETp*ETNtm`uk zc@U+H3AS8B(0cGQ%r#k)v5QW`oJPq1EZLr3?3&JI^`OjlqP<#=-NAAT!B1g9qX6CX zNAK2MSChf%OeU9=4@|&5R`x=~xjrLf^;F?WeDew&#k(mH?@)X36}-&c#;2v#NjAV( zdJ4&7a=wsfC8PkmBSef0LwBH5i0YFl9!T70Em)zfTTB0JTO&}__!M7XI-U3r7U@|>XXfYbqI^8yJiJ>^ z?Z)5l%h}wMwdd9;eTf~+m`J+d@YNrn3i^`n_)Ym(vHc{9+8Gs@8Ro~E9h)5Da*|i; zok2oX+>e7nC2BW^$AS8QTUm1>GGbB@&Yb07KhP-3pekdE0RX+3?G8eUJ%0$RaKS1= zt0JK88aEKpR(kiU$z3eb(s@fDu{)P^;Y;xI8?3v$eeVKHgWY|y*lX~;$jnBD!t&7` z+e+a>G3{it2?yAjs;cLY@jUYOYA`-TSbuO2i=`W`TH&eQ_eG($JoVBWf1N9#w1@Iv z$92SA$pm0I;K)iXprs{+Do%z2y8ltEcphc5RgZ1J+^@p|0RHbk|0E}o{*E0OXlF9R z%p+xtGB~%+*QOtDnonu`LyPTQ`o2G%!tRdqgOOdT`l5{%NR(koFI(bak7vm5!dyt* zvFF*Dg71__DghE9g@GM=V&x3FnsaJnWu{UF~{y=iOX#7A+vM<9L2-8e5@e-siig zp{hSlxe2lQTO%q1=$x>0YU8-x0FiJmQ3Kv_1&V{!KCPB*@^{KwMA}j1>Nb8l%}dJ+ck2ZKAX9CS$t<*C9Sqx z(puTNi9^si3G~7fG>RO`Gdg_Lj20d!W&ws7n9c9Hs+7cz6giNu!?L!!tde(UW7OE| z5MTeAYFXdWDtOPD8X!Y(RbsVxSIj8~4qN&~rwpnBnbJL*)7y8!YMYhISpY)fDs!Sz z4To4}9gZLCoz2At42xDtfZ$>(WNc`HuBztzOd8h;(Q8btx|oP98Qj#>(B7IPy6R`9 zzMWuQmm48h-XgH|@Kg_AqW#H6giGFuuKT`)7k9fQNRDhGYRO&?rf|^HqWKLyrW<9$ zigk8sT+5%D)(h0qFsf8t^yON-+e2bKL3h(%85|MV+7m|OFaSUsK*D!@(#JAC9aWLE z8F{wf$zd7`JWs=sh>fDhg9^+XJ}ZsV%h>g2#hxXEpxw5gVsnSmE1;{{q%gB?_?;RA z(mgfry^?A?%S~}0AQPH%5W0hA?61CZeT*R_Rt~nm729`OA&`+*17d!^j;=iX$!=N8-3eK-Z5f^ko z_Q(}jA3($+WHxbL$E)VCfn^~|9k^&3Xw5#sk&kbnz6S*37SG+~f0?})$*(@Cg;YGP?o2W?s^UuHE4>Gi{qusf| zQYdS-0+;1ppz7T>#?Z8nVxh_r=|`L=g-1GUaJ88UlDFltPHy3CgLTqdG)>Ck8O=%{ zDC9?0@%*(|5A?OVV8LXuK%{1lfZ)UeTfx*J;t^k1J|p?kOm5S4u7(sBz)q34Sb%S< zPypLzQ<5{vVe4SWr;#9W&uX(-%vvmXbgOU^SttiIe=?*6T2!~LYCFx_q5T-e5yBe+cjm=<_$Xjie4)(pl$ zDYcwK`|!R^KHbzxAgfLzIvl*1i2c-}&_0X?e90;xz(jH7nZvVl1OBi4Up_u%lS zW2XF0^J|bioWi1Fk~LBU-^GC8VSO1lg1yMD3{b^|(z3c*bIrH=Gx>+QcgpW*1y~n` z7%+nRO1}INFSERB7w!gFJggvsW4Q)$lUL;K&WxwDx>RBqsM>uOV7%_>E8J67($Mc1 z-ruF@ckWgvN4BCY<+pn6yG97-GuB$th4h}4GR9^*7ptjZqPmVE+qcYUyB~YqP9www zl-jQWn)o8yi-adkQRYGUJTp#C1E%!D)-3)p*55O&|ozW6JPBUsF! zt=v#(PqbcE&gkyd%Po}qD}Cj6cb4ZKA7Y%i#BJzZyYDpXP?gbs5q+q~TH3?j1>t!*R^DB* z-9Tx^oTL;oV;2QqlV5bIusm9Vo`Qp{zHHgUFVw}rod0O^EoJ9Pqo~+T%`!gV1}nd1o&H7*=RH@SqlhY zgR1UFeM+N0}yT!JdAUaM*JG5&HlD7eTTRj)tsU|+7WAL z4c3_H@VgBaYpeB7}2bLDmV(sR}o zDHP{jLl^!oP8AHT7XH=3Zg`OE#SuJic)Z2a8vCe{PQu~Z;{2WWE8Lej@lzS@Xi#%c zJ(A)ZtIskUckE5;@vc(JzfEKe+u0;lBr(pDw4cL>_yy9ymcumbAXWXOuFWPv(6GQ< zhz@lz4k;&%ny*XFJ;ePBXfPqQ^4|<?tUS_-G{MCL zSRP0;0&tNikY<60jl>ohm$nHe`gfMqpLuwMhejzWFp=?Moi=7V%UZ;Y5ut&CV(A8C z*S!p6-5rvG-LUweP~ARH&ryODC{T29?uWJO%7&7vS%lshl#t{$U)~0=S~CW0EQB(` zC0Phe_ip%SJuj#S43Z z@^mnFxdNpx_Qr4jbz7+gbQEo?>nY@iVs_YwaO8E2iYE6B3KHjH_h}_SwETyrRXwECGdFi#b;?Tpiu!j0H zW3BV5t>rit)UIB@Rk7|G2I~nK!!OWO9?(PT8D^+oIZ9qGvcI~HJjX4?& zG&P;quhkwuo4!26tPl8QAvCp-e?~d#I|zVndj}A49VbPtN98ass+~dA(+$v+g4{^W z1Yi0}%21=)wPbh|3=b?%!`O7E{OYH0!bQj9Bsfqra}x&v*3%H@eNCiSVd3c#vNp-^ z5Td~nfcISiR`+q;LCm)l#ce*9a=y%{0u(uald?W0DEcPh_3>vn@)C)Rp$faS`4chY zBBV{!dai6;v6Och=`wvYAwfE9sJf8}8eTHk*=k-aa;nR!))|DO5VSl}NlCdw*V1|r zHBO{JKZWovzKEJy&O6fDlkQ7yr5!x&IB_)iGs9z#qBQgQU`A_wp@8H&`}iR615KU^ zGIWS6@UoLHUN!}G;v!>@wy2LK4gd4+e?891oxH*EN=llyw9T^&LlHHvAA{GEQR@k6 z#gsd{^VIWd2p>UF9uXLUP_s=d3FiRuA3bBJF((9|ak;Om$N1;&V78uC@D&2Hneo}y z&(bplEFyCckU|Q^XGGP~5YEmd6M5J1mxfnyl~g&-F5d0(WC*MMoxWF>C-bn}Q=8M2 zJ~^HXCqHJNuA$GYg6Pn-jPfbe#~qsKg$zO~w70>Kd<1=gaJ(#VwAz_P&SX&?1&RRom#h%OT?&_)q~zQ+yCqpR?=2Pu8DQ zAa-R+nGq_O%yOaF>~H>`$7ThOagD~mXu8CPSzhgur*7bzZ@?;d|IH2$z^<5@h)0-s& zEje+PV$wFmz01tpF@lnko*j-Yb<)~Gk1_H3zMi@C=qMX4mwZqjq~+oXgC$Wg=%|$* zmIXc1(yA4MWz|XHOThbskXU%TJhM>zw{33@1Mie{mn3iHcMw2b>xxz3! zjqdp?GxdB-W);Y?V`m2ieDJA*Pmh}#!;fkMD%#KLyVQMy#RIntU6L-VW-Wq40c52M zIfyS1DM?R(aj$F;j7N$cICr&ggtf-dlB`z2>f|me&rZHdBs7JpuE*4I5kKz_VR4eH z_F4=EiQt2{VrNQ`SN@*iJ~sNe=}028!$>|>P?5%Qapm_NP}N2N$1RA&!5Bq(y7TtJ z#U)KbJ~0-0^&)^J!ZG+ko1+V!UUELQTf6E4P8NT#iLNVhPVw*2ZpNcP zK0%!|W(v)i8G!SB0x=_I;Q&`v(-Jdx=BEu-&RK%QfNjiP61J*!-W_X}W~`&}f8_(- zT@zONl?fDgL}!${XvigaeX}3ZZ$xP(YC%yY7kL!Qk?+yb<&9e1uCLv}?Y5I0YQx-L zD40#mpcX2)DB$-`a!@lk9_M|#%c#RhWzjNNM6=(SuR8}(=+)~|!Kqh(5hz(oiu-sQ zd3?#b25td6sAgANJil{so8UwK>{1Ip++{~=1afCAykNDLiPZtj-RROVXlWH@wyV2q z1#Lv$B(Vpo9N!m=1N#lkBRPvNW}-;``_I2FM|ihySH2ah8XT@duLR!sRAq(@%OpE< z9vxf)H%T!z<)rcXqIc{H|3&@+jTI`hAkB)pUZnXBm_U~`?Zy{d_>OFb+II!!tE;#J znlZq7dTj{6zzKUGZ+3%EG0Tz@7G=O-4eDdkU%HN|s&>kJKY(iW&e}Gf$xq!hhOzS| zLqr_Fl^nV6yCPb(m$qVXvRKD2g=28x3zM#~UpVGpklle`KUgfL(msD0m+(0&%al*+ za&&f;SkKPuQE6}sb_QmJW+l5r2*Vcs&mBhaozd>|r#~qr z$bCiR>EjNBm@8s8B9$IjJ19PB{M{e%jJ57UJ`DXo+h;ZIG_?e+Lo>>{w~d#o-20xn3|R6On2bfwKbR z^Kk*B-SX@t>=)sG9!J_YPlpOo$Xnny97^=G$&3^6`j0qUVP{rLop318#v{PzSpSg`C|{3weuTul7yMkH;4jJC563&rbDjkqOd#KoasM0x0_b>oAMohziV#*9y>ZSb^99A*apR-14Q$ z47YLPV_h>{sTcw5i84IVAhb7x)g>nQiSeUQ0`4Dv;a$vAZbcB`Lce|mDgg8fPt|^s zVr54l+@U{|R$y?#JR{YMvGl0AJt2}eD1)c6ar;cGZjoZhFVB!{=wbn&Wq39OQ}G90 zv8%oJUw*m5-%s`4pJ@uXIrK6P@DGl5XS&O^O82u`vm#VqA?>f1)-WK_u}FEYL71=e zS1klnsPNbJ`Qhq~>C$q_DjInPb&S!1crqT|Vc9hs;k54`vftS*F1Ce9|C*|enJi#( zfg?u|majTu7Bw?}y6cq2$4=(r#0ekv-PuK<*=S&{Foc(Ai_*B75Q|;CJMU}&Vc&Kj ziSBx5j{!SH)DHRhjxz>!ML7;jV^_WJ`}Hj=6A`|~^6caFd^|{TXExJSNzYt+>X9>5 zLi4&IKwt)?Dvny7r;v3?`M>}9m$F#DJ^YACcFK9MtDAHWCk0jk8OpHV2~Y9eeQagX z-Mj9WS@x{YjGQXvGm@npE%+4A7aKi+S6|*XchUVUUu+(|=UiMmdK;~r9YvqYuIRBm zQWq@ED+i8PCdHtm;az>6`c#qLU6OzPv^Mxr&^ews!|;M4oD86wY^_8G7;|P!)lx0+ z6m}#eQNePqx0tZx6cS-=m&lrswx2f3Qh_DBKljL`?_|iyQ)PwWd9=KetzH*d1+D;7 zK&-#V&z1NBO`vMtAK(AR@6)DNW5s3?@orcF^F22A2n_BE(FhW9S=pKSfb*+;dIqIH z#iZ&Dg5nG^s8GX!1?$msqZ;$dbu$4_&PJfeT#dVq5=XkX262;@TXj3sAMa`0^Kp!d zPm0i{%*-Z9E{VqCJRBObpZOJMGmx0%zbdkxjI>Gi0t0$bEc+;T_P0_>QDU$8YG>{u zjHBA~N(6$SdD}Q^g_?-pvqwkRrbmopqmol?1Ditp*`LuTJj%z-i zP7p`Pz64lp4D6s#mnb#+RuVj%Di~*9B-(pB7C|_x$mTnY%~Mkt!7 zpD~+F+c#%LD+!;6a8NO=y{!v$f`e9!RaKB#Uvp=j2(qq4KfWrtSoZ)T8yUP#A1tn0 z1(NGwc`nhWK&7^pfSMZjE%P^2wPB@)JFqfQI(>{g?@3y3pmK-ej0_W zV3l>c!H`ZDZ9=T7-C-VM6YznYea!*7P`g}a7-|DF9QAF@*8?%xr>`j*EFLm2BY4u)K?}_-gttjK= zF2PF9B>ko96999YPY#NTZqG{wusp)Zmk16PW66-KlFNI>*Cn#MVc)QC4UN29f^$_Q zPxysPxAgdIK)ClTF;l&l2C+)PW>&HZbre(v+H$Gl@EyN_TV%uP|#ZqT_HZ zeaiD`Z-1+~te-Y^OP&Jya3yZzK~bljB^VlHF&Ym|3da7=fBx%>cwP@nq%QY2EJngf zNXv{DX&p-Remq4S7r!77lY72k zDph$3x+=HCepO_bm30~oh6kgZKMGj!ae)(|m(95hbi%QRjF{Eay%sKI7etYf(*uWk zBPx@RHcyF9q~CS2eMAHbns@?!ConBk=&HKO^V|KbwTXsTH$qZBs|^`#8OZ%4TzCy5 z$rs&24I}zq?tY-XlUy9MmHuV+A2fhL{Km? zk;&vffE|zBg!pvL&J1`#GH}0cxECL$?R988gMzeMq&qe;PROW}uH|qIKC^x->!jbJ zK07i}*|-ol(B=>`gOppn=xV^^WY@|K;V-i@^=iWc7|@O2=*FuL_n|9Kda3?67Nj z2GTLig`WgdtGI8>=NlH^9iVcWm$W+*i+7WTp6Qb#wXowFW+xYX0c&aa%>(iJWMtk( z0erFeep}h#?J7lNWDjg;QnP30De7#d>;~yyosJ+;p30?wMOk@BmyRDM;rl`pY(=TO z+{&PRe0g_z+g{E@)W9GL)y;RU_q_T>;V?~P9PADOdPklYRSjruA%H8Y=Z?3~T)T=j z-C*?5gY~Bw#(mA0ILsPQ=Bvz<`S^3v-C2RkEACw~GQvAWl`A9;C>vo` zf7%QqbMWn=JhrUq<7EQA1f$o^P^G6!A{SNq85OTjKLFQ7nTyq3wbK=m%H;c`I-Z~t z3Bhai#Y(1{7BckUb2a)DEgXI5yEIF#4rTVO3}NTB{(;{wbYD6X)h&vr79sh*uU+g& z{yTg-S3>38VyFCbppLs2DluO^p+@UbFG>4_F(0mm2Hc*mBqySB=I0jk!KJ{eNTrt? z0)HNF_SF(Is7?W5X|<86ECzNpu%3kw@S3YB7V3~4f{T|bu%vOS|4LP5-!U>B1@|QH zI0rnUF}IA;uG??5t_xjnu()8S15d~KVYj;~Hj^o5R}xr6&AiM{;O1 z=(XMo{wMMC0{Tu(yqPzJ!5SMr&V;I@J`zSiAd{WpG;E4Po}(vBgmz%HSQq z?*IGwsj6>gD*>Nn#UNj~f3t}N86vDmBBM=^oPOnpV5p4zQ?*C2oX;hG*YYoNrV!%J zbs<4ORoHnaR^4Fr%o~;mNt0D&IB#!{T}>qiD(#Wa3#XB#XH(>@yniLPXK0fX{pI>3U}^M7b*kbflH2b=R#z^~1Sbv0s$TH$3yPNp|(SgVao+hb^LA zE$zrFR}w)o(zAK-h@(mS=gZo9x?NPaf3s8ox^ywREUt_Nt}9^4^)nR4fFZmY6wfJ6 z1gs?UA258bWY{@`zG`Tj2tHs+`J0OZt&RzfFXaomie@&gfdbu8tw^*V*{`K-b#1N0n za)^+lLV&=0Kosr)Pm~sJlXRi*G0jpD+;Wn1C_HOCs1UYmLkrF+bMaipF%=fk`_ZEH zxFY~Vjoj!Kd@ZF(T-oPsU6}a*ezcpT9|8$;OAU<2)Q3MTMA&0z01Q#Pwvi7M1v;~$ ziB4m6b78NFPa-Qg-Geusgy{poN2B`bqDNe7g$_)(9tji~sJ83z7E3ACh1EOjx{c&J zuK}F^KPZYtYz1ItcQ@x<9b;4Vj3&CG5#anPuwobpSdP5X$lN_wFMG`>Qs8M%E%29% z0x27*DB~v4p$d*~&H>^&%ezMsXqzQr_zhIa{tE379%d5Yz}%OY&FoM{+{)d%c06Ii zjONg6hkGf^x@ zx>;Cna+kYA=1cJK*POa}NGW)Am%4KSiVdc4)QNv(0W^~4F1iBo0$!-aDc3+gnbt5= zZsU-&cYz&Z$zRv}HzerR^7OYF5(W09;gg#879=0=cE$Z3-Ko~n3d%6Wr{sPTjW*OCPo zLAskJIB2czGIe7A+FbGI{Xth(?+P5Mb<##3uPk4o-uPbw;DvkB?n$B+>sVa4$8t!%L>E>d+7$!sv6D5 zu#65IO+(?13Jlw+(PJ+~K}?qs)C@Z%l}7(9E@ zfCbg$3~U%2i7s{-8-?%sz+0QMjD;D{V(E_=)w$(Kr46OqQcW%z&`FdTrA8WN0CMyc zD^`_am}}2SGiUwhd1j?V%NL7Qgv*JExVFS_FZsSdWX-A^R*~KrA36@>XX}P4^^y0B zA|IqQ?>n?mpkStDSIw#$6KEK=SFa00>TuXpW_PjY0JYu%gyyaOALj{G%-;Z~s?$aEphEd_OcQww67=n!e$LJ^;9*WcQxj_E`A!1X;hhybFM^*G-2vo?g&8 zHK*c!nB<*eCd&#~w&q9Cp}U%iWK~E3M@TWGZaO`q8qpJQH7i}6iE zmBxN#cr3RyZIZ-`wKuUJ2IbF1t=OVtK1n)%y}(#z>%{JnM)>;huX%?#b;l5g3xvnY z7*)W*V7K`o8INtaT99LWsvB~1XT1ENTjgsykyz`U?_;pC;=mc!)hM@FRr}{XZ-xM8 z03_+b4YHq||GSg<;Al5vaG4BOiYM3T3=Dv_G&_R>BJyma8$S{Wf8V-#_JEWfnxgzst zfFcEnN{TD2LL-tV!i6-6*jf#@=*i7TOJxE-+hIiaZBF8fvX zvR=?3FdYui&ljj#=pl16n>u@6nM=vdQ`R~PEM#DIkHPU}o;{0+|YfUWcfGV4k z1K8hS9Yowk-*Z9cZeN=$%7fxB&?g!tr;VKnZq`MRfz@I9Zo&}kU%XLsV|p}|QKx)E z%%|Eg7iR*o2JOQ?{6Wms&_oF(}ji9 zZ#dD#-zwg+lc`Kr^S(0$c!|?f_3o}FD4tW-yN#QlKSid{Q7ZQ;bW@jt&CCss*04X^ z!!=V-%!_N>*JF^YXje@>fDCjeR{#=DBO!tz`KG@ z8sRJ4NejDlc+QS-mVbbJ;L#` zRE7gFIMof`Cy^vrbGfkz*dm|bC(sDzjZOgFwR*4SRk~@;ygm}DFzgPW@gBzAjV5?R z7bXJ&GOXv6X<13(hw+u+*(}xwUf|0#79~ke;MA27IIsS!9h9Y<{;(OjbQwsiWt1eF zhy{OmvUWxeuJ|DqnpZ{_7(czvsFz!;II{(>qM&6MyK?82fp%A{jA8hI`y_b$RTrtk zLvGs0Xu2wln~IJza-EK0Ds9te{@{tbG+AIP?!NSL1VpQVYZGlHngwsyW15Id$2R;M zklFW9ldtwhEx*8QDhiIpK~>pI?AJ|jUZH)By!~*wlK{%>W@I~ zEP;NWn`14xa{#QWAIr;$ggu9zO)KQFmt>6uqfX$_tRHC_MuSbK&-GI_8<3ox%2@Ti z3pwR(xGfXO_gQ#H)OdASFv1xt02gz^_ic0a7m$gxP<+q}51WE8Ga`PT&h33HN>{z} z`gRxKG%Bq?Evg*(v#WmU1WuL^cRLus*v=*r$VDVjjJ_z&-Ni`7Ds=bvow{r~7J^6J zX9P7r>2+){vTNl2P@}s~tTuh$F(m)p;^At1A0%7tcy9X{kzOddofyZ zS6cN?Q;rP5X!UOYH1YyjjO5_Foi!YcNlM|jC(Fc?qMty|lT-v!=jrgS6TQ{X z2(?Qj#M{MNGkjW$lB!GT^g%^aR80fLE47CQ-%rsn(p|!-VB9(6Ud(ZHWLMO<;onwn zmMH8}jarN*xhD}G_{W~~IujZbgnBoNgu`5eOX=yKdH>fKv(0|&d&!lE$TFwlB^YlO z<>;6=)33#SN33ptvuW5=d>qOT5aY!Sb<%m|Lc|S_c@3c*69`JlL7f2p5C?QsZrfZ0 zK^jBiYnbN5r31!>UA5lbhpeX}+?U>W`tdP#=437mM6t$q$1Izz5YUD1z@{U2c$irh zo2@XX?Gb(^p*r={IDsAGkul{h@jt&LDI@mZFI;TAe?Dh2u%KHeP1TQ5 zN{y9K1JSa*_KLlN>1peQd|&vEv0L91_Gg%PGo!RHcA9(>zo(VF*lEj1n>OVzA^^>r zoulS4yKdu~^}eGlM9cSkQ~8Mx!&wEG?C_b2mVMDpEZ$ul@wdCx6{*k47-Uu>yA3wZ z)HaN|JXkG9LTChLVCHR>mx|bh4}Hal3z>gk3h37H{g+Lyu71~sV8I(YBvw7e5uim^ zBYO}f1LE1Zkm1LVA@?XP$){f~cT;p~UQWFO>0O~{R=R;V_)>YPWJx=oxumq1^yAe> zDM!4P==8Mdd6@&BpH}8dEO{5<(^XZX^m=R!!TOjF^kfX&O2M$grfj|G00DihM!lhXP$+Iulkx93uDNrx%Slg+!IGze;NY9s3=m_Zp;ooU}b zqRaK#b$G{`OEnhQ;xIeVjK^7LJy?w=y1LomWks}<@#%^h4qhW`;bejwf*pZ+p2r2( zSG41#abGT=Gj4x8i8s}(PRjPQ`%bOG7V?Z(xS8|d?J#g811QA~8yOgCF^gDzt~xVE z*h{yH#WbKBq%B`S?nYaNV%7FlvG0rlCDo0>u?n1Q8ibaN3yazC}Ju4nZY+ipU}qztPGc#fdawTkATz}=U70{rF)uxP5peXcux zFncfrCryGGG-w2mUqcLdl>M{vi@moLBIPz>_utx5sQqhxs7r7%IO<|vRk2E52lei@ zYkW8{5!u6=%CkOWuxQC2ck|cpyIvz;kIk;OS;@k}@}GbH6+Cp7K^Q-6i`K1uvs-9q zs>-bKIZXLmo~!+|YK^5COBi(lwLY|sWG}Psj=DL|Gb?9!I+T#U0*6*zS^7FndfZpHqQGxmAWuAon zOIGB|*!yL<_(*5%>ZzVUtwZ#s_I?p&fq*TdH)5ehKLn_AzKm;$-%n%KE3}#qBJ;@i z;qwXf+~w7*A$Tlc`3Gk4MbKw^Qg+o1XXgf3RYc{R2DcUH7WoVaGqD9xDt3~2)^@s{NCJn1@;!U`*}3$BRab-T)h-D?eszvAM) z(_Mbcsrn&>@76Otp zaxK^;LG3P2nTMc3Nv_eaGD=j{Pt6Q~$0Su!8NSyJuCNE!MY@GBX!nf^ww(Qr?6XlV zSG=V&%QWIZQLm(Vo=5Fm0JHQa5Zv3SvN4lEdjv0G{T{4#Sz+NThu^nX?@UDJ5w;~M zU)UxKoRm4bHYtW_L^e1O9o@>=7sB5>yvG;?xr8=#*yIu7(36CnDO<`2pX#Jm1jRot zCAz3XmlQcxIDuSUE>9`x0T_K8=<*&d0E&)*)+ka~5~&mwfIWXP>H>yjxClukCF*gl z{ML~J)R2@~2$|qNXZv6T2-@aj=hLkP z%}TD;v5=n9_Yg#hPj<+f`ksqzb{~*YSrGY@mgIl_^Dp8SW05mvNHKc3O!yj@2Fl{l z0v4;W8@P*>Rm}T(0sFgCLOoCDK}3fVL|CzNxmS)@I5u-AH?39Ea-ZOPV`=I(A>@Xu zv*ZF?$;-yOIzX?qfF)xh6QLu1TjG-g6NH`BTz8)Z>JjD&Ve~U;bZ^2@43SED?g)?5 z(F>gnv3JJzI7x9E^~S4EyW7P*yzRqY_>nro>}%B{t4mn!{Ml+&_r7LVfNyONLYKK| z*`0oVn%qgA&~JhRP^>>YnPag#V(p6kJnmLqhJCHT=}yX$X5_x+^&sT2vPt>9#R(;fgrVmR?B%Qf&Y268 z?4uuEx&b2aAi%Ns8@7uE z1hRFiiWtHBQ@dLTPh^rM`N{6R;Ef1%2)O6<^I5vjG2uz@xnzQ>S_m(7Zj(3emBuUy?Tca1k2BM!tG(zvP z=yu*cXgFY3>4lsYQGFp_{ud10OzUJ+wT#L_f3y{-@Rf2%cG5EjY;9@{$9+l1Ed$N6fJ)xQd#z78G+SNQQDo8 z-MG0+-%g&VO^P0A?Lt)5kFAXGiy-g{u1CYW^RDp*{P@t1rxpLh`PR zvVB~adID9_NKsu{EXL9l?_>m4uTbg3qnY%*<`=F$eAu!*}v0u3LK~|pem>#Y07(KKoT@Hm$ukH@g?(oyty0i7|6o4k7 zd{#I4r8sl*O3-xw*Vr2tIL(urmm^hp)GjPU#o}^&Y+yqrjLcP(tbW@2PZac~cE-60 z1q8wA-kpHyAQJQA0<(En`GiD=b6-l!rJm}gv||P!Q!#NV;I|BesM%LoD;|8rEWop? z(%0u?b%^cvMe?*Nn6Wejww6^j4()S~!p{Ykx?=>zmql15@6v?a`1n`bgcqDTk89GQ1E6JQ5e&n?uAq#h!p$uK`Fs<& zgC*VLT8Qka-AEW~A&m_Qo~60BBj(x*xFETuED+s_t=rlSeEPQjd5HbZs`YEFziX0}3vKOpf??bAYt)z)saIGotCftt zZkb=Okk214x1F_o@ip#JGxAauMAPQ~i37s!w51FL#ltthC-l%{*B95x6i#FgW!d-= z(%=9h9!{C0@N|JLz>eVY?oNDSZ3v5;FAx~}wCeWs8eKBz?1MW1#W-Tar+XnoJ+<~X z+ZE?Uo8L$ixY>-dEgt4&1|c8xR0|6;78xEPYdKCb8Jq7XNcH$qUOt#)>D8jxR|}&M zIB$P`XbB^i$T%IXi9rxDFL`1rs0saY!OUFLC_KS>oLQ0e*k-!REAIWAAuQwP?7&o9 zEZlH(4Zw-S(NVcX@*5liw94`bXtLg;62_p}>L->yR|D`Nob5c9>1iOZIyqe)a}E2| zZMR^CCBp<8g&j{3lpBIyE4FW&LS?om|a2ULAra&!+>qJjG8f}sF^bV{BzS89R6iZ;{ z`FSAD`=apC=?Q3Jdo7@uXrJIvlF*Tsh~m{aE>0O(Hlu>z&hoh!DFoE11Z7~u3nJ!V z>r0IUv9g27za&+m^)`1=fPiaTdEVO~eX00H@Ejdxt+UyR;urtPor&C)<-nS+oO&KP zab8?$R}AINJm4hPp`=%Et^nLGGq#6nC@k^#HQ-hA ze5K5&U~gynKJ8pZ5Nx$pup)rE;Q7VL7k2`VuD%s_;V>oNWM9l5>t6W;y|}D;zkRLN z$%gthG)DPpSX@%KukYC4{c49`t#h#M$6bH1V1|k)CHaPJO9F5n58l+AD|nMkM-q7Ff_Synt#|vUcFynUs!Tl9(LMu+7`I5T zVP9EF?nzV&3y?^7jci%x1&|s!ygp2zvtPPw=`g;KZ&}VxPI$-y+IO=J!bK?R(F{=s z5s7Y~+iivg0B%aE$+ZXZpnvmfnQ7DZAlA}*zOJFE^(JIjX9URSot!?#nh@sB3A_<_ zx_im+?DAz*?(Ss2gk)_o&P`$HHgJ$k|G4uyV_unEx+&_K6o(&WC6FYrF>^_y9{CX<#j8H@+V4GowS^Wr!aC4 zoQxh*(>RQS^y9}eFu>B|#0ICe46+TDGxoLpEaSe(0A0N4y(x5}Dq@W!&*pS)!h4}m z9wMsP)k={VR3p|Z8@9CAIsj=2$4-~WpO5d@W z70hqimTkmsp@z9N5~$i4LureBs++ao&U+>afl476cFUdoP8#hZVGjY^>o5(f#kd!YVB04 z4De36{q=(b;I&-7YtO)NFoocs=sr2z!;M(iM}NZ-XrnCsqi=EZ_fH+!Amn2CKS~B; zM46BeC%1kB%^F)M<8KDrc`^nSV_@?k80%fFDEHfl?8Ot{ZTS_d=kW}xm_=#2+aGi-Ig;98d#u$;W*)e&x}uvjxKMFMfpzKAG_c@9 z6r4^%T~y$1R)KXI6U#oRqw9m3_#dxA*3*X8r%4iz$p8HFKl<=3HFWOh0^75m*6;7_+!@4oJPNM2-Q^cP;Qphz?FJJXzBg3prL>+VGx z`io4k&qBD69Ah`vLi4BF@UoZB>oTB%3WV0Rt0FtrLbzBUbL2$l>lA69b){by>S^uP z18k4pSu`$cU{0&xt2|+lE!@Dw+(y!?>klnOG!TrP)h%A zX(xuPGB2`2ba-``m5ON&3=Q$D0;OU{fyc9pU3UZ zJo?#ySo{VvZ&i5$H{yHSh+K@I4cS?4H$C;`%(}%LIz%%v6%TSQR_ma5Cq0{rN4z4j z4bgX#&&$GYrqor0(Db2Qx17~x;QfzO69IiTNT)e07ZAHLRxxu{JAT1D>Oz%cgk5>1 z*F-_#)z=R&kl0E#nxZb;0e=q3c>CnO8*z{V3FEJeHICYyFzbmo?}=!s~L93xshy_-pfT zX0nD7p1y@cMzyWytf&!W<4sm@#9L|3%F1^OssPY2hH$U8qkf#4VRZjBN`pYk1;`W8 zA-Rryi(4d)b|tiXcY`|?fqG}2zNuvsX2C9-sdo&_UvJ7=rU3Kx1#j9WX?8xk!uz7U zWD}@k5u+^4>`G8Z5ND{kJO3uO`npLOJM|M}-%GH<@y%I;oa<}IS0pS?e9hos`h3 zj`NI`Bm4dI%EFrW^$#?FV2e(hn|G{U+l-QMnaY(CR z*^GrZB1>J5q%lNf*SA|kY#IJBGh-CroRJro(huv>SvT)4R@gvFz1fb>4UT z^D%$_FiUL>{{%5_x8~^0f9Z(m8@rjRo5_u?kz^f}gKPChyk}~_Cf)DI!I02=dRSmIK)LIhMNvh( zBloz5GbPtZL@mqZhT#LyZMyl!0TKvqow}3PR4XU$r9biql#oTI=PWegxww>hulxCF zKLbV9eC>ODumBLf-)f-;EzD@2E~%k6x0mZ9>1p5C7)i};q$KF7l_Cr2MtFnt2+^4p zJjI+B941l?c+KqBF<2T93EJ#Hx8$(8DtCUB+v6cPAe#fXY=nx$zNs3CM!5QNQFzC*7rt zzRN&h-R%S>361V@2w!rQBj-jjx@A}3l1|?C0%GNx0F52TE zOhF6Y+sr&O0HuACYX$@$xVyt2y~0&d(OuWhpiVe|us!pe|6#qZaV1BnE_&G;;`ubKy};#lEapSdJL0?hkXH)tcp7F#$cvOpDnm?3~P5oB?uhjE7_*!b?x z91t($-hMk<^0Jt1+ZZi}32`8r0RAd%ERGfTWXf$@{O}WVV&eXDIRCB4{1= z<6V<JkuJhSuCwnC9vvaxh?*&nnwsEf7{2TD#mOc<(o$PzgdduCh3RC7BS4%Tzk^$ARw;HrM zrqI!8c`Xqx>8=aW6`g4Tl+;bn2_shCK7`~-f8eS;UXxJWx-M9h2Sqb{B9o0}{`D!C zE4csfzBuSO^4+fBmQIW~Z+5(XoZvg#4|gD_Em{z=epTZ=Eq#K{D zm*JHj7L>hEyv$sq_ad%@>uOpoBeUDy9v84g{|7zVS*16suGMZ9R$qiys8MP+-{$zs zI$lnNtjzE^FsGHuNFR5YF|}z4>j}-5OY|7*W-{2wprUsX0fP|u%GWQ*vX(T=*>`w73! zNs$znf&8Ee9wwkTVBSdu#@iTjDGKzi&XJhz;_LXn!!l!(zAapsMBlz8#BLFks4g_{N zccH2d>}R6NbTh6n7_A!Rb*7tFwQwyg0WC(alWnZ;N>o*dP=F<<#E~C?QAPK`-UPci z6!ze4t;pHxMu#8p+!fl2>7A_!b#SEFle;i1F?CsVORgJnz%K#Qh!~J!Of=hH$~U&` zp}x1$$E?YXVMG9HZ|>XedTvP0Jm4eZ&ud+({kuNT_q^fJarOm3_BkyL*%a(bu3UST zd&HO_FcL{q`d005xfKcPA$cDunMVn84I#2NYOl}}J8pbj2mrqCi`%E}y5M);^4job zl@uu=k!LF}feK|{0l6{w_55UvgjTHStJj4OY|!fH%3wgqFylnd0_;2ly@iIwch=1` zf`#~>k3PX8B4a-a zF1UkEzmf|D!-YD0LD&&bYmUQryL2OaFp0dLh-J3O5qF0I9c`0`2u}{guVl!NIhv&F zn}HaKze$yd3nfG3A@P3NG9)eUM?rUCsIJwU-YLk}#ijd7^&{@GJ=Z!?A_}4+OxgLH z^NBC z63MP-=G~o7X}y=O;4OmhjEJr_?BP8r%p&1nwlD<|=*zE*lVPGwujs1`cV%4BRiT~P zQ?^hrwqvh;US%Lq_`S5ZjryC%wQ^F5=GqhrqpbqiF5KOfPL&Q9a=iC>r~s^<|N1W+ zb+>+1vgG3an#i6}i@~j^prir%aWtnWO|iP46}%_gVV}M|0~8hMFnA3@E!=He0BSKD zi|kHabvYyfXsLZC$d!jl0*2L3_FTQ45)g3DzEF%)MB+&O?zowUu$)( z{ARltDSE5n#2@TS(C0#iugZ03N2aZ)P}rNYJLKcYEX`Z>BPf2*(Bh%qKG19z*j4?y zK0F9nW;*z0WG5YoX@0%`)IB>zEVe(C^f168<0JkOPL$lh`n1xq)>y%K$3m%Lr>j`9 zA$TnafO|n4VCR?6k&&g9$7DCST_Hb!vJfrarA)f1^FHR(W~@%*BQqDoKk7MOOW+MqxjBmeWeFVN*!6clzSp)9y4VBV3mPd~KmJPLb%kXoJ1 zDPZQUd)69mu`7!Aw^v1wX-o@iBk|WdA>i~*d?{W-#uJecB;VJ2>+$aU^Zbyto2>2k z-QTw{EW~Zqb(4Hn{=*t7kQsrk%q@9$EMg5!5RRozKA?=OB%~p{Pi>tfjGN*%mMRfz zp*0&thXnGRT9?3{5==5Xq)8Tgy+<{}N{KjCu_IS#W6DZT+t?W%;KLFS!qo4@w6DI9 z1mZ=U1w7;xMDeF;9i@m9(30?eC&QR5H##9AeYwTv@5dHI+#_P%0BVjfYo-=^V?fZB z>*AAF;}B{?K<>hXkb4=2?oT9rBr)>L%@$XN*RJ}l{;2BUr~ca0%{yYK{7uKjbSSMk zWfJ!p)%`%)*_*>G z0OC^vtO;DmRueVF|NhTE^u>)e_FYjmDd=dr2F2l3?cO?&g5BRCQ!tYz#NU+l_vUe* z?!8a!UNmoze&ghU6F3s{Zr##`K-2CXR2k&&L%3BhwqK`ph+c%>j)x(e?NLyPZBepjyZY@tyY*uUCc&Lm)%3o(e7HYJKBpgllFbDnjYZ@v$4b zpFx4eUW{R;k9CuGS&N_Cy2$E!rJczc4nlvwr#pD8r_*=!7*oHtlm~kFQFL*Ec^BNq z!{!>3mpKv|vK7?b-mUlvL633suLVGz88%A+BOZ>oXn}gV-dSjgs;76RXfi&4_d!%h zYncTDSB?i&60S00Kj6w zTs#J0e5MFzkXhtc2TuEvs^ac@-G)U>wd++)ZpO*%fL4O0Ov@t4OY4k(SVYJ3n$_+L z2~Gk0{U2$Q{B1V;GzA0C(N9R>aL_UeWLh(mZdC;z!wLBiT~e&8^;GCSn^V6V`Q!rb zlu-2cOgu9?!VcGwNO*9G4sftDous^g+`w#HgJ71;8 zqM3Pd0PcArpCdwQYLv$t?}0(BLRrOCxAV8U#H_B5`iQ(zVA3gU+g{(VtaQJ%l=o7( z{RkO}R7Rv7;c>57mV?tToi-t>_^hl@#6USshD(uY+gbYY|rI&6VLfFGo-uj|) zNp|&=&`nmo?>LY(i@-AIua6dXeB`yvqTP>=JEcVWJyVpv*E>s{1bS+bOU{m=j70Kz z0xrcw=2lSOo#ja)Ce5KNMa)U` z7^Rx)Zf_VPgcfu3^Ky^7-(1eR!dnv5aEVud7Rqp_FK#RXStM%ScR+8R# zXCpOfFYoKF?ixw9TDo@S_1U0uTgxfucp^1BT_L=`@Mgj20|+5$XGR$r65Oxu?wemH z2ocCKfnabE)n0af1^b)u>KX*Ip9P?Fgfj4Ao7vgJI5~()R)Z(Wong6;ru43`f8MCY zd5S6F{w3AXhV#G&`=tDf26&g*1Yhy=fiW1F5~#fuKQ4;fWn?Kswzb0demZb7osGZh zs>ke`LVB(>fxdk6bZ=I_Q6K}V8Ifl5!3^Zr4*Pm%f?X7d7CH7#1$`Ct^KcT@Wh0yg zKY`z8-s7G8=ort#fwK(nsEdXRsStN#_f-OIm5?Kl{^aRN~MnCJX74}f)aRpy$nIBG*vAcNz*$z>8 zLCk*;a-j3tZ9i@o^3xbl5>;N5uW5TLcy^L&Yh#Hbu-# z7N3##0x8HQBkiMqPd2cJUz%kNI6`EnJ)*dl&)W$T{iByG(AF?BBKEg@qfy9m3fh_Q z0+j)4S6cEB9M!v3jUvXAFd~*9XBSv|Vbc`ln5e73-gk7sJIby~I zwyZC!&BX;~gAff-d8?`M{Q%DJq~v{?geHrhj#<;pyTngr3n4)|s``Rs-oU_!dy+vH zweR-PQB7yEsF2-M;6y(4j))5p7LD8c^SNueq0-2V^o1^Lg4) zeLB_XY;luHpcNAM_N`_k)4CmSYO|V zR6tKrZm5@;kF*~)of3ENVl++}SeYbGASpnJxxg=!;~6W&&iN*<`!Ia3F(Bm-ds;Nb z00W}l_f2Ge;5ruh?le0#LO0VLtDPeCCb}*Ed`mM?%o{>rCC!o8;}E)_me= zLu!EMyWirvqv9>PsiA(znHaa}q*@S5w&nXB`XnbYI+OCtZSNX0#LDja&SaMYyCTcW zF5DrL2{e<0v8^G*I|_Y!SZ&1e{(&8>-nPV(#Ta2yN|Vlj@F!gl=-Rg$R2SSD>f|DY z58mJ{$UF~BF;|^`VXP8fmKubN-5%yAHLjsab7m8{G&AkNKzy3`U4@2uV}eJLDfrIr zj)^1cE^K#MCZ9yF0A7R5X0Z%W7g5wC^#a5p^XBd9kklY!@9tx&%6pn+ARz6|df7>X zGM=PUvjmmM`3oL2MG`H|$l7+h_j79lEHEzB5O%Im$M!nP)?%ic0$91_0nICbe=OMRW)waV*&KezWR0S9{S=yV?ND+`ZlSEuQt36x$Hp%%;)R_^+OOMG< z4%JYPIr&+2HCDS*tf3gbD8C`JA&kBxQ!ShUm0mOCu>=8+KMaW*3_Od??so|q_SpN} zc_9iAT`6`PG?k4%kQQMWU4Yw2LfVHbxSz|eqa1MeU zRRxzxOZpC_ej2B@@o*9R-Q`-J^VQX<=;L&%K2PGAGZrj%B}v@i+3r03;J}73u|a-< z9Qeg{dYE@f)^|K^h)0)PELL8)&Z}&t2ak7$!E&=td$vK{?i9ESnz7u|30KA1 z%;|_Wq3~PK^HXnsUNMN3Uma^~{7VG+n$JieK<{|dg9SSWc|$g}CeGpYKMAUdj{AYljl~^z7RRzym(mL4M9g3y?e<0iHgJh4*cT^_R))^8XP3O{Xt|*s-EiHy@7{?YWxwv#>CuKE8cn0!+4;`(kis)( zn`W6?8j|G+7D1Xi@Hd*IZLZYaHknHM{IqS*JKp~DxDE!c$f#x9+Dbg`y!NbDWUtqE z+kXbs?YD!(suNy+w}~Z9wn%;kiri3M5$sEA?{NE>BV)P&qX>q&t(P{od*G6L+G15* zTwNtgczwZnXz;tdH=24in`p0gpsP&TOy>!R_8es=^!h)r%fs!iyLzl-x?=}?$}!`k zMYKaCxLkX70z&{OzB7S&lg|l|J1dD@eQi^2fD0xg;P(2vyfqe{?IEZUz>jkWR#Z}u zSnTSVMegw+7&aGeur#B7pGG)s*)9DTp}C8N9^7Dz>fS8Y4HYV>`^SyMF1+0^@1yU7 zvI}q>Xv1h9n#9ahcU5U$i1aSrFU3^w2;;x^ndcd5i^tDL zb}K0WPj++umOleNhh7+RS*fdMmlD0CooM#JSz6+lBsqpe@RglNGLpm&SXgbTMr%#! zH6b8 z3}@6bk%Gl<{Llfl#yjalgZ8Sq&&4YN&f*LS1H7SXs}^eR%zCqr302}qdXnF;ES}62 zxq>{ln?g#qT^hWKpHiEd0yi}nj4Hu%u4|NE_0Lr0X<=hGGY|j?Gk@Hh2cGr4jd+~I zbe{@T<><;UG1f?jE*=%-6*unFtO7@pX(~1TT-s53!WC=*&Q4og;nKGx3oUH5<9Zzu z?_(TT!BCJDvndEUVyUEVTMVpvi(mk0Ms0kFFwnyn(kEfC;f>K;aDy-AG2 z%$tv8ki=gi4N*zlY|$1DOtIsnnbs}enm<()@_J&J^%vvM<`A*j>8Fj-sDArQ&#_yR_h9)-&IJ*c>;_KS(%h^<(KzOq$q^Z9G5Z0Zv zf7`N@r;dj7Ffa=35Ly@dBFp&|p8aj3)75-{l}DHO&~~D0w@x56xv4jaSQ&M8W``Hp zL0%a2hqxAZmOypQsNfwwuzx*V_Ce#m5I|jen`k5BW!u$F@W21_ABj&l{N=k(U!fF^D%~1(QIBb=Fa>v8!Yp}?9R$HBv{NGL zDNv=RrKmu42{sr<=ci1oGB!K2UQcFp$`na^#l|WuB*-dxi&+uNSMR*jUEM!2wc615 zZ?epUx4hKwvfPR+aI3gz(VK-+?=7kJf)-_kTUZy#uIRdRpW1mgI?fKiF`A;Mu5bbi zv7dT(tTkg~40k0#JTqbuZk6>p^mtX+U1epg-JQUZch*Kh#j?4^oT-*H?~$F042*v$ zcxCYOd*vD(X;1L2Zd(9%7TtCTSUb#Monf?fAlfQH_>o1LtTq_4lIn8QU^O)Y2FKiKmC#a zx&q&M72w~JdO)nF8gLs{v7!WvfwAo(fYBGN6K*HR?>fUG#kak&i`Z+jR=8HLDwgd%BH%OLCNew;W<-- zGvL!c-;huVV$3%~H=W8C3lKFLP0)9ivn>$CVyfG)o+`fY1fp^4LN{rql8Az4S&nZ5 z^XnSSq(-}or1h0+__QOi_&W1@A$X>U1P(M$Q8E48JP070$BVQIL#Ukn>ANVM9 zJQggHX9v)3Dz}mhinS|fx_>~<`^S@ruua29_*O_6N)LSCG0a7h?l)|YgO6VZjP+WE zbRv7XF)93e=?eA53H<$~TN+$|23td%pcQ#fyqI<*JWsnno1yJ9!hVgxCPxm%PTINe z`Mq&B1lwMFjkt3I72J{Zj2X1U->u`tM7H6KlM@)F(4{|s;9}dcaMU{)^ISWM*-h$B z+JsH^Qbu1b;q(Ke{^`RAw!o^VfeGtBzY@nyq$9}7AjvC#W&0QkmNVtf`d_u9c&C z;5y}3QkF~8pf25&MMdb|f>oJO^B@kng7KQ$8_jg7JT~fhjKrkfq-$fa@`}Rm4NX!VdcT9_8r2w5QJ6EeRI_Yp#IGKOlv@t?Grxuw(^h#WM8t<3sCAu+O|I ztJ6-4gkt=~;fmCf6{wLq-L6a4uV!9y8XmPN1O_`Sa&RHg z8z#q-OC&IbeJ}VM*8tKf9sI33p}47C{`;SQRV~fVJl?q-1f~!}E&PT6NgHz0vO8LI zm#}0tIM9KY$*us7h5$@(G-_${pCkw`@pRMs(7Y%iA|#6(be&{VNtN?^xPlYzXr+bY zeX^?}FSb>0Hem-}f1V!z3+-%bpg_w6)91$Jzw>I0OY81?FGTjW@EWG|$R5!($z)~b zq!^hqU;u;-oE>CcB?UQ}V=pZ{rvoS|Ik;0Rhk0Zi)MQE zJvsjG*Rjs8^jI9SH8;y;%T%`8T5KD<-|+=_s>jphTDokIZbQ}j^f}5?%kqw*#F&QJ zjFtZQB775GJvQ%Kqd+zE4=^bzB zf|qOTjOYLH>Tb68ny<0#>wpV*^%gpkFkp7*^qUBq?5fRXMk_frunRNJlL|V0*|KRT z&03T_^vWfMqLM7&`^s%OcC$>Ki6HyHoGq`6fUv6P$LCm5;!PM3B?_h@Oz#=5u56WZ zUGn{LwP**l*H$7zbH0~fDJ$XWj8OTXPl@o=}SlJ zaNECp720)Pb{4G(QkV{3$_?+)sIAcnbz4vDX$|}8^O4Jh~j3K zI8rC&>jPg4&Re{;PoFLY`T%ermu9igAWIkcloanZ-An@Y5<=D;uHL10T5qHaPfau(2{ zs8GfDC*I(O`Qp?Fnlw4XC7D)V8x+&caQpch z6Fl@irdB_xph$VulhB%6$(!r_mm+&e%rN*fIFi9dCb zx+f)Mf0wn1Jk8oM2BAXkS8yk#W?AgygI*4Lh2Gb0FvKl(UD&$C5LkRz&e+%pdjY7r zF!swkYX?}q^Ab_Q+|ZF9WoWg+Y_5O;zZ6LR`|rOQOK68pZe-9z8D7f@Gjsx%bu;7P z6|;F^+-4N8i+9I@)O!}b3eK8$bXp7OQqtTYjo0)@i1t03DU!V9%VDsk?&9P+C&|%^ z0q=YE&EVv6|8`iq@2o5e0PisM^CJvSXPqI$IxXWzPEgYM%9}{Li%+ed7PM)2`8&Ks=IJJ9>-mw!ycJk_mnLWEmg)H3am-~q6w+A|9`|WNT>kbC zfQV>M)or5A6Z@|BkF6!AA7Ej2u8VI3OOJ1FBtR&^;I{rx=o*z57R$DZ+WliS*P&Bb zZ^e#BMgU^TFwq+HH|l~bl4-Q9R+3M&n2%Al^UA{VAT_$?8;9R2FbEwt0IZ&;)*6~? zoNwCF$80gq%B?B`=c_DDv%k`Q`&@$V39#^PP?xc4AFcP#E9!@B184sEJ)PXb-XY(6 zBD0rHcfiY#q-m&J{#KVlp^oz_XGnmD_V!v(rwVv*%GG56C7YqNSoxR+J*P(ooC4j4 zWrYQw^3Q=FF1?vsGz~FXnaA&4$cnxDPqiYwmdNFitMR71OyvH6MH?+-HVG=fd&Ruk zaC?EOA5c3ln_kKxRHr+%>T>%+cD&T0a$jBUySsIK$tS+)+~oOU^S$Du z?SeOxuQmNnxGTRzR*D3J_n(+CY+BwmEp9DmsZ_ zyCOX|1(XfJ&R=xn2HzXzFuSWqFK*$fE0w`PN6J+j1;dO99LR4$T*z9XtFZe9h(SN? z;S{TgW;`O!k{04B!6dorjcgM|8C$-q+0a$a8V>Jvj}^Qp>Jn0=`m^&iC-d1BZ9wwd zXD^jAb7_B~!_y7Sv6D>2zpnZZvpeJ8T0k2CP!ORxOg|2G{3dz zZtQ+mS<`VyQGqs9xPl-ofUy!yfT-0_II5ID7OFeEJK$5fHwKdF$9G4w7N3fl zRxaNUWqK29Ep$Ig(eYlXzxpwP3_31Vw@m^uN$|K0t=~XvE=P`kbrmp+_X2I)C*HZL zTB@>VK#Echr^#}y^fSGS!L)V!xQDyl(4dbdT2{FZO2S3b=eMdVW_7~u+SN>zhq-|J zigdE80KD(`W&2L6zW_R)4f()Y%i^{ouEN20WmY*i+^kA&(DwwdfR<92}g8$n*uQ_$<7E-)c>Z91%a>gm$F z3d2TnNAJJ-VB&Azo8b^wS#d2c;H?|hhAUs<| z0gIWD=ex@mM3JMH@LDVIM2+44CT<<0(TD(6^K?f$=ayZ|>e*>B9Ane3aaA&hc;Rn$ z9bw(s+M@$>VRY&4;(|{rIXx*Su~C(e;Zi5M#bHx8VXLP;m0=b$Bt~C~+{MnY+C`yQ zyR&1Rv!`Y;4#hAKG=OK>?z(Zk1|gn>b{Pmb%ruXgtiY|c%E)ou#^RdR7y4G$4IM!4 zMqVbp#a%>t!S%?PLefTkbw=~7H;PS1`soM6?yE5~07SNLK~#_ago9j^^YV+5+OsHu zH}VKgw3l^}SuCFNKm=|_i}Ac5Hpd1jeU;P(n0jKVc>4A+t@9eR9=IC?|C-9hnk;xHkS(eM1TSyGsY0r5C-_DOvV* zjkoyfO_+%rGZ|O|tHU5{CdgRf!@dznw$YP&R`|az&*V6sXE(1uyl-KJj4#9)3NX8Ef~IU`Rp<}iZ~3vM%BD>Quw_Y_+$_gvF{RA@tTU^>{NB5)*e3^ z_^vcp`cSW%*}jxgEs{N0kf1?5Q8Vt#di*r4lOcO2Ys*Qza&j9yU$Eyif&b zyzQi|$vk|}4Txd*JBQ^9YIV9YCmiG@&fhLrDou}H5sA~uLpYeFzNwgPgm7o-dD>D3 zWN7iAB`ewLXWtQ~4ny+O&;4OE1#-7}^T03Os*{Ji>jYE&;t7XkCcZp)IRu^)GU1NI z5B6ucRR6WXv&|PMU2e54?>w&;eyWhbzrS{a&mt#BX|eM1z;9DUEpwQlCq0Suf(XtR z=Htm9@IAeRhm4G|v8qa3e~hlaaZ53*dlCf|C?f%o%5)*qnxI89KGk223sb|D=b_t5Qd$}kbk_` zT58+|rT4C;M9pscOzqG*bDtfl*nGIN{LjDtQXGk=#!#v~0+i&w%?USr^!`R-yT`@) zh{r95_K@J|HP*vV5{#q6h4{4>C}h;M@ws-_dmrBU)2#b!KB3;?HY+~Qv+pd_9-!Rb zd3Loq!PUL1{r<0|^yfd;KDJ=zwfUWWE%FHf7;4)M@uqyba%%P*`j&n8FXC|}HU=^F z^4#_gEw>`*Ab}h=AA#x)$I__H6OJ>jQ9IhQa|ZX&@A*f`JBDfdyZblrH|SzV(?=9S|7V zk0iWnzQR4divbf;UZs6CVz-~Ai;ID}dA;f}6P%~N^rAA~Vzr8;Zz|S{557|5G>A{e zCo>&ESR?-^4fgR0WvHq`^zld;hu)B7BH`fVbbU^lEjG)>)-$m(*EnN@nc2&+^H-cz z%}7i!5+g=F-GlW8+O9KI%TwhU!~6qpgI4eWX>AP@O1WnAFX5i+=(2?5UwkEEE%o*M~i_be0h=(s@+r0MvIh-1=99Y zM9)pBAu}GYr@JKxSE6)14sr`FlWEH)r}8fzZd2j}g00w5n!qcrN6ZIA4{RR1g>CJjG?&g}u7e(o- z%vd~TQMF{*wF{96-Bl(aU1$6*pYpFHMJac!tv~Wc*q|hYt{`X8V9Ce&z_8ac5aL%H z&Krp|n{Hs-VHfbu+Js}tJ55G3OVm!>4QBf!YqS-mX)&OTC$C^Al`0b|`0*69$^R&F zD{I1inc-|B*d3=Dq>g=7eT&1D1#Zx0$3C13MeN74(jSDc}*d*uGeO z&nL?Pq`a=tH_kwKm1F@2dtgg^1xEQ9Ji!N@A1I0ME$&29*u-U_9LP^w%a58wQGc`; z7QwD{-lH`aZ0OxJ0G^37t*7rbAcLio&;I%6pV1Xx#8zmj-4U~`U7}RGYa_+oXSpo! zGk;_N096@DL_t(xY&dtwF8Huua-f1U#O?v-{As%%F^VUe$RcK@{hn(V+YXqMxqk2G z8gyZ{*lg@;XY69VwNSgoc1#R$)6@Zrl0{Qe^v>Slz|loj<$UpPwIH$L+V` zGZ%UrPP9frz^Zd(eWBf=I@$P2E32pQ1h?_h4ZiOi{()xCN*v=UhRX}3D)1K5DE?yt zzv#Ts>^0qzDW?5j^p&BId(7N6uQxu*mw&phF6@?w$}Un5jAXCm*5}nc^@PUJRx)8S zs4$r6C*<}^xaL~jRj>^zWSXz?9*npQ_l|rASJOn3oL=L0t8v>@pUcCFcz== z{SNySSKs`wIPLMtWj08xjmWF+^1h}SkwQ1;L=ZbGwq@DCUA7kF*l!X&0l$nHf-GeT zrt7@{zBHG1$8`Yg>s6`}XI@vq)qS#sly2oPH`N=NT4)1t0!uwBTTS)#{*BgS@PNOpCGk-I!#s1?0WFej;x|ytv0zp zGMuy5eaCk2R7HLbNwEEScDo;$=!JLA^8OB|8F}8axH|k8C%V*PnX?_P)hk?Q=^! ztle^c$?O~g>F>{D(K`ROLh5L@R&N!E_Hb!ZVb5EZ`@}DvB{9AUY~OK#$9f}G7h^_Y z?|o*Aw4*(9d&cuYa#y~8dNoj2`L-dzd0!vuBxDc}o~L)_eP6<-@KVHBP*$+`jt!8K z%e`cMW*Kcc6KY^ULQI1Dy(+fsf3trS*1e;psM3QuXY< z-ap_L<)ESPGD>qKWT&`{fjUmfZ)a8Qjwzxv$N?w=386wn8@n-vm`ib%3Q?w9>_%MEAQj?Zj(QWwO{@Jwm=) z5|_K$*t7L>tn*@prIYQZ=+e%<+vVa{iYzqatpP8CCi@|e*Y75b#5buVY;|eYDsgN5 zi{B{eEApc8GT)V3>4utV!BaOOT*krG`%e+$t6{aL zlrn~3S+&L9CVm`kGD@n=lXixrxZ2APpmUzRFy!nx!tF*fi7_+b{%s5maAj4IX*bK< zKPjOk@IU|gm$2v#Zj2V=9UPcNOyOZVjL{ryW<+zl+GZl}d<6NhmzY0)K(cygs_Um~ z2EyxC!zk~(FFW6;i5WUj1|+{X$hPR0DMH}scx}h2Iv1`AEwjl!WGgvz*`4D1&eJWf zUWi)}`5B7#z+VLZynjgN+&~EsaGShQW`gPCHk1(whrgjF6U~y$!^S%9`?2WNFmh zI^rdej-kpb*$#1E(j*241fQq>%v;2o(>lLmE_#JH^fm5lamGsmtH>%F<*E=;!_5?O(>re)Lqi2dD<&=hTl8z3~rP#C6a=rz!FZtlEFNj z#^e7aO7Zr-ui_Bxv(kD9=FLOK?d=RU8ALTomuXl@DNXSu;3!mA!-_s;lRP@!2Pp() zand}y_{+~ix3{1?QqGO2Kpqa<=(8^%YCEM%Q z`sG2eEhdoAbXKUX=edsrKrxdG4r*WQjb1^&e`hU!n}ogqHX_uP1sm=dq2y+aoU7=I zF1X577~tS=-xGC^qOrZIF52(DfY-~1W`i->JR`VRUik$EgDqb`wc(lFpnI`tDP49h zqy?YSt$6&E4Ft^gm#BD&MXCCSl*KSpz$-Ry4)L{i3Kbp`aUMZ;!dtYs&v@GY(yjJ1 zxs`&XHZtwDUTaNGKHtJ*%LZUzKP8zL@h|9xqfNY9NbHwF?})7G7~Rr59EF>TkFJAvQeTWBM{I2E#6G%xDZj)^yw2hR6J*`00r!(F?T*oi(Aw9vz5^UD$52(B8v4V=3Ezc%XG2(t&`R)NkDu%NfX=TTwe`nx1Ui6HStT=Jh*XO>g-$4RR<7{RbT&I}vIYfp^|!n-5Ee zdwCVkp)$1&sGUiw1?6CXNIwjRjewQ6n4wwrUf-ACvUH=_j%1k&t?0G0!oO7K>qMjo zER#+ja6UGxm_4xXz*1WB0hz78gu!w%=e`FDr;`y$RP%kYnxB3aAN^(dgf}{_HSNfM zhf+Zp%oh>pQ7nX5AX2l%xOO1DchpXqeWYr=UiaCnB~;xBF+nDoRB~Ik%_Z0|%Jt?g zID5buJnm=QE)pPDd~D}iU7VQ6=70bDKaJAvyYDB1zGeYuWeoaEp?-=>fr}Rgc6rt; z;k75yxmuJ-F<>9oh{XLGMHAURvi>_awtq{4z3;(aJ_VVDFw>O9e24kPRhuO&88R?YKk8)8=wMcXi=ODQWVQvzL`_j147+1bAFo5ca{ zPIoV)cdX&b!mN0Q-9>%d?-Fg|cM*)?YOEqdyaTaU*Vw z9YXeeJJktbQl)>Mo*lbsE&5-etE=(8%UiZ$MV|l0qbh>bdpt``aB`moOW2=ok+Ul+ z^7Fgh1Ww&5t(Yzjj|euu@9UekD=t`MfyqaS@= z1am&Y-g;()Vjx^F8$p~TqDcRf{?~zU7f5Ih5&I+Kw?%x7dy1Ob`EayEivo)6*hf*> zYJ85mRQ_~;o_JljO%Z(D6@^b^4@BqcmePqA?k5Kg4uhUndFt~I*@aDZzV;Up+k8$4 zJ9yXB0ilCc7;3weQN$>At9s_e$$h+d0Sbg0gxdYPXaO;Q?_qv@`8c(`Y9YQ- zqrCEYEm!!xrA%&m)LZ}>s~kyc;Mw1`6Vl{{QKk$YwkwzYkY3m8$Su7qraNe3KE7lU zy`#j0S~PEJuAYa1ycbmWgC>`=F9{nwvuHAUt|cDSmHvokH#knfTo+=MxWew*%n^5k z$U-$U>@bsrth8B)w$eCGmiB(-SW)!PS z7_Me-UZW*ge#clXe;F0u*)D-`h9AS%ySY2=2#3BeCZ(aE6UESg5anh&Ajn=P>2q_= zyxahGQ}~P_X|BOW4QbVWh9utxmNK$NJ6=Q(d8UiLfUSD$J;i6MrO$xTaRJ=b`pIR3{jXWGV(LEFZIKcH{|T5vYb}kn9lW!1~Cn1Z?NMabL4;i`B(XTtF^SUx;XC};>cSP zH)daXY)tM$UQ*pE-;g*u;=(0jjY3&GO?v&2WX3V~R^=x3n2HG3T3VyaPxr6xjCyCk z%zj+mk)VD1c?4=EL$@8Wh>4SVGjfZEL&UE1l6B6w#?IR6}#%S z?sN(5+Cm2aRyzV_>>-HNRn@bT-|Nty=ee)y(!@;)xfc+W+!Yq#y)Dw0qM6I~ZgaTz zqtkm1C_U$@JNC4j*{fxV15f?t4nk(3ER-!PW=)mtX~MmL&@D>XE}xqLu-l{x81_%? ztdkSwU9$orUFtlxB=ZEBX+S+}Gi3{DRZn>~@K;lHvPgyoj?0^&PeE4)gH-p{3*@uy| zDV-0lEw)bU;kjo|os?TDBaI>hEiS!R^&kxEFqkU>(Asc!u@3-&*W#!CX)DX`w!FWg zS(_=5)*-XVW~nS!!1T^(>J#_W_8O6TrifL`Vf3ft&_J{`q0M}xvfuK(IWh6$+wfZN!G^~59 z{O`^MUs#VJ<+>OqE}tMU3r8gxywK#F>~5VcQ+G=!t2A9q^MYo+&gflsx`({*;jD-; zH|obYR^jFzmmgf%$$#!Rep(T$M0Rv?0`m9zsafb(!4`|fc?UeC2tw3maWo#u`r(Ej zl3yhD9W+vkoK;W}X%x%Bzx=x8PcWMdJX)0ZR113N75Ripp)Ao<{;UH!zTgo94qkP% zoM@DVYb#?|Iq*jSj`!e^t9gQEprm3)62 zwZ&ozWr-1tCd}%~b5jfk?6UMK5jWV?w}%U)x7TGaoxYqs&$WHJb!8Sk;J^e0jySpB z0>6fg-1-^+(@uE|y(F}8z(iU?jej6cWTZ@i$VBJDHe+%DnfyQ+r}C~?Mtp)`R69DO zby5&=g^D|>M*GeujkwKh#FMeLP(b?yxn9sB&)pqOci$=Z?DV_R*v1xX)#tWBA>h`U zuz_S*qYj~<$nwppG>rOtn{vS6>!aZ4R~d|IZ-$02+I{N(tB3EOcQIWZH0=-;QTkFc zt^I7Db9a9}(YVY56q@!F#A$bSi)8S-iw@^M?^MyoPs_~B3O-e~2JXZa#RAd71dt6l zwhqsW3JccD87N?U2y*A6MPoM_lH{RZ;|F-6rx&*D2V?4sdA3T`qAa~@Y6pt3bjC!) zh21+#i3yAyZEsudU5<|nN@x25Ag}XsMW-dT1db>m|MSnkc3$jpnHyAk0VALJPl|?W z{faDM_mZ#v{Sa0#a5OD`2ZWsgb4CD^V-50320^u+AwonSVHl-IH=L{>TEmx<5qX-m zdNNVMTXT&7WDyRz?z{Z?dbE$@!|;;Sbpw|Ut2z!nquSoRYM$O^YTv7ysp9wuM`2#* zip4A+bp=MgdGA13>y8C#v!B_hsLzt%=zwc0(zzk{6M1)|wd0ms8&vv~Au~o$oTvz) zA5N0I8ZgeC_uQ50-uBS5F8^2+HR8_nQ$;H2Ac`;%Us<|{GJOgzBn%6&llsv9q83+2 zgW2bZFeM@)JYQ4+Ky988EGVP96~aX2C&l;}46de5s<0kPTs1=~VPEB*!QXIo3_5^_ z#MB`0GBu%BV{r#(*56W<-Gzx?M$}THV+((;G+R1 zolzt?`yz5z?2WOP|CZS<{Hh_*qb0kdX9iNFdDAjb+Kq^-Sa9aAp~m!oGSyjGBX_jM z9FURO5DKZKB)Oc2ctk#se-!7x_l4cBfn3 z9eJG}Gwt9yAGf1Rem|oE%K|`jsV*pP7%be2;H}C(>;s{_*4NUnp(>QRR)gij@;oS& z@!&rN_9tWBb`gS2NBS}%0Rg*fot^w&BP&{}YIgYh<+@)0s+o7mF#kpeBR5bE)AYJ= zpJJiE3q8`X@F62#qV5^8rWTMA$8R?v#n;!_-jOfcr^YcU+L zaXwV&I1jq+TQZ%3^(c8pszTSZ4iQ0Yk^$^}EqflecDCcAfS@*b4B(cKUWRq1hcHx? zZo9j}j-NLs?JYb`_(k!5{;OHYiofFVjF1bF-a$Y^0H)jTDF|jXk2le^CNU~loS{5# zWnQu*YqLT$5tjxdjR{pCAeTN_@MCd^*IOOO>&wAr)P1@)b?^?VbeymZ*Mep844CnB z<_n;q@vy9{FGn~mUv(yR421g4E|x~CdH(B%x@umzx|_9j1oALJ^QSmuo98?d5_e+= z>OcSdPwAI*TfKz_@MrdE5H%XQoi_X3Ong-&`vvjcp}r+;!*ZaJ-)nyDO=bkV%iPXYKd@#Qt~X2~%DcGsW({X>#Z`QolFD<&7I zj4_}U9+meMp(t-SH=t;(RMoztdu}3{WLK#Kj%E{_;w>}K`QqVOBvUdY;oU7Guo4Q- z^FZ0td{;HG(@#SUH!Q2lta@X`;gnXgRi#k~knR6Z&of1&22p_pmvDNKAVbp!qYKBq-a^QC*hu<}CFle@YTD$s-oz!Q<L*jBKk2Us5#5hw*yT8TELT&N&`cnCL%yODOa%Hy@<2!iW|Ev;2r|+_3+rs7)ih?Z=BR6hemwE zvWR}2Yh*9BpSg+J+yaS>`fLyUgcF5}GYB2>OJQXi(NjIEfg;91zBl9+ON|W^ zFUH9dcO|p;%~v96SZrr#n>?I1V5bWo)|f!{bZTh7+9QWK9}lc9?z`%K*3m?+l^zFz zID7Pp6f##@(s-=#yhSOo-7Kop75W?a-YLfW=Tk@l6>VEr+ols*KbYWUXlMQe5VGNr zD7R?vpQF+1j2fpKMC7c0sr(%#g57=J)njQS`@dpP4mr z>ZPOUHC+8{BYf%;GpP;Be00)&Xc&YRh{dvYkFzT^j*p%kgM;W%&a2QFeAf;;bbS z?VTIe-Z#kBEdTlEf8H4p|HT^5k}em~)(`31T1#NQOFugnDzU(FD1hlaFk}`Y*5-Fb z&AVn^os40*|HBr-gIV%^8?P-|_1$FfTNQ;|#OfL8OZytOP$n5Sg(()up5090=%;Yi z+BfVws--&`d4wM(m(BcT>htanN8Xt zeUVe7Bd9NK$RJj>Hu<)2&tb(o8$_+(6*G2Cq0UcPU*9_TW8%wTFMFoy;_k@6~b@wRFbo zgm*t1$f30Eh5yBPo5551GGo-?XI$NAU&X?=3m*m3S!wAJ$-z7(-|K6i8>u zMGVli?^pON{L0rD_!gbD$HfloVwwD|l6%^2SzIChMC>CM;LLo!Yr;68e|yl3I^ltj`{$=EAdMjk17n6H!0A&ZuZimC*5h^G5A zH?&my7aM{J^5W@{$W3LxC27K73IMyDFlHg2+p#!l6>t4U)L}@(fRVjoZpM{S3LoT} z%dQNe_;7``$>hWO{>iA?EYC+!4A@#9y2dYJL==8fB_4$9224lDI|O?50;PJ0b&!8O zE^5B9$%yNr+Z~)%sd;FaHrt7gatZl!fVV$TUQ)>yK8wC`BSx1+q?wydV-ke-Mkisy zX?@6uya%r!;}uZQ#Myt(t)gQnwk2$tA8`MR(}Wmtb*aIrdjPu_eDgaYCJd)vwQ@&> z+n+^viS9usH^?Ii_Xk4hwu$*g@XT8?V|uXCnMdz17cuh`tb&pBbapT9$oGYzI{5DM z0!IFmPh43!1svD}3N2Nr87k6D!RqI<8Rm_5~q zyGJ_DcIzExbT8I`jGq6w8iF31l7s$+d)Ft0xBU*#?7mwM&3fx| zHc{k0OhO~ zyTL;3X0D9^88+t09JH{)(?!u1C*Pa?`)LCL1Xh=WBgQ%M{@4`PN;gw#HWVN|;jS)2 z9r}_Aj+1d$YE&D>p;auStvk?D<*7#RYn4j6U_XSw+twn=mqTm>P_`%G!2ArRj>s|Sxv#81us?7ennPji7tyIp0dzN{cLuEIi3P(y z!j;W2baq4CopyU&2I=9T03-y_vXCM(wrL57F-NcUd;6|S6g*el7W3rgv{Eu`AIv^G zrB#8)`_Ku8rez<-qt1Z>Vn!_Xg($ zI081ze+U;9Vt$cvw4!!r^>mRuGD-R2#y}o$Eeql;a|r+Be|_gA=rpO(GQ6ENMJ{M$ zBanvUc&;<>;dS_oUuB%e71X{~2lGH*>~8hlx&kla#@Y_u>C5cHn)#C=Su|MI&Lvr& z`X#GS+rPn+U;HIQUFRy$JM{4?P<;Jrlic`J39vdSGLA>`%+xjWdOB6|`zu;|t1Uea zdWy@G7{v>sfYE6iK?wCgdn1AeW*9NC^y;ICa4MJdi2}00TnCQj`K_^o@|sf1VL0y^ z;oKD~mW6K}6XK(*#YFG^X^-6JD@e4ymfh+qWi<32Ny8s2_=a<<_3Z;T?&0L|V+HOK zhwk3X@4I1pBEX&bQ|QeHf`Fuq!STO*n(I$qvTQ*&p-c$NkqD* zi&>Stpfs%#>lcbZ87ooVwSC8kTDxW1Lk2u)yFv#fQ*~MCt_kE39{(6Qd}>z%DIO-x zji#ldm6fb`xO{W^#if=-y*u<|A|j2q?GvW>=b&2difZ;?TV@>ncmrmPruf_i?S8rr z!C8<<9C9vS_k>nN1;JoZ9PCr&i^en5#{2}yQwHfRylm;k7P06GjP^^5r-XF%`$-)P z(icBrjB&M}ZeutO|6Yl71KZym%>oqI$G2wSJ-5L%sE2cNB9C-N*p~aIT|-=8{M#i{ zMO4vBIN#VCs}JdywhHf`DYCjYJ9?m9CN}yWdqNqEr{5QGgKyCldXggs2nsS6OoBl^ z1F=(DTyN*Nbp6VQ{QLMmrvT>x8XkiV+l~5v54qbBDv}*9z zt12Tp#*B@CMoCQUp9!Q>rB`(HxREInAcDcFtN^tnz#~p3Qy-@M)pcS?!9aX)Vc_n8 z4gPlWe6VgruIjq9ki4KSskU?mCZ3rp79Z^(tD}#00K2)#d^RF)eLx@<3lA(*njMM` z12{);-7yHZWRxL}xr8hUH_qSq2M>u#8^X+*`hXsPy_=`x-z7~n!1lrM&DQPUJh%J# z`yGLTupdTnoHw7kk@c%2ELzqHZ|EkjTuWr6s;h{ZNn~Dy5L!^9M!LJrb({hk2g~MF z=8-{+>OjO_gbcVl`+jme(-OgHZSwPKwz zlbDr8^>~(ED&gC%OYTAD+g?X#^|X~0MFfjZQ@^=oZ4oKpbGu^9ErP>0=SG_{mI@rX$ zwA}vIjq&8Y={mu>ZeUDzs56OQg8^xX_H|!X>mJ{GGVKL5^1^xw@2nf~n<>*?hbqe} zuC!|2Qfj}SvL!GL0{~&hFpUOqE?%?U_$Lb4xY)k2%P*aP3$dS?F>$K?`6*)F^%f2z zBi{LifbM?hjy3Vz-lthEINC(NX@M^kPS1TUkymThb(#5iR%*!_%RC%QHr`#{?TkV^ zyHTtl>e~BqJU?3pp>reDSq}WRHal>JqkL?0@L|UGDWFuv)vIYAa_<(ol1i3=Cj(ZR zWqZFbcb)u;x{M(}Guv!_-IT||g(Xv7eh0glD zfk8ODBG}9xno}@G5E3r`!oP5ut>rdBRubdG+8N!8x~ZD)MBM8$VdT=~4IkO=bLiZC zD!5n9O^)c-7K24qJ@w~*|6g@I^~l7&5;IWVMtNn$ccyXSVjIl|4C`9AW|!R9y^?5Y zn;$-q_*=i?o>w*dMzcN{I|B*Ne3}oJhC-HM#uMkc6`WPy-<8uTIift0y>BY_Zvetk zOnu!e@XGsiD8f-Z8|7rKg2Q5uYxcd*FO|8d z*(nygvYf@89r+YDiXcGPwTibGm9XCn&VX%k{l?|3kYkF?=bA`eZROX9uKglGiJfT} zxLM3PIc*7hZRR+R!_iDbUl&AHa|uJFaXas z+sC^?z=qbzY;D44wZKz+1#f`My5bMUyQ$oH&7X$J?bPoP2mbfZ+r^klqiN14a*eV- zaKusWpe?8H)wCdVlsIXBH}nglTQI{*Y_X2p4fb~@rJS>pjjF@p1HxkG3Zm4_3m340 z2S>Ck^LnH$!us|L5@bc=0-0oU(C}T!tb*ii_iflF=q$sNyYVuvl=&Tn)~SN>vBMEM z?qnfmcp>P>saZZ2F`FJRvl(I8y_>17)sDfj9>xdWyHrmqYOcrMiM5^D`ieO430l+H zWRBfcFrd7Bq1J@TF7xhAFtW9t{zxo8acf#AdM?8nCOlGne4+13*iu ztzz{FAyM6)#+AId;T>9a;dD*T?vVoB(lvdSFCQtWtH;X z8>Mq{rsvF(Jq(4&-#3n5MpS;bS4+X1z9uh1ZHqqIa`~L>6k+F#SNVxS^ZM3u`^oIu zQ+DNqfaRGKVDw8~E=j!aki0A9g^5Ks&h8*#oVmQ~vsgJL=l=MnsVK}M@5J#$1Wm@G zN%7Fe;>;Q{qjsbwSU#OM;m970|JE9TMrb#9e$YC_M=?ttUcz4;%nsuhe zD{o^%8lX|TFX;KP9`5rF-o+Qt`>>yZ(mlwpEm2@sEj8~t z&G$M4boCPUZI<%@phk+L`_iZTP_z_fx}Qsf8HP%W*j|xr9sh}Oz(=sUM0**2@VoHg z`?$zot*YBfG@oHNPsY7=Kn=>kkMaZj49UNZ2VWQ^0Xhc;Ctyg!%*&zTM+FK(oUs|J zuANb!BB46+Il~bj`b5kuEmbm1;khN(k3TDe;ubu=>BcvZWzzjJRzlZOs{+S&t7W37 zE-V7vF@z)_<2bgq+_>nk+*PgVB^SOZzELyAz)Wq{x)hNdyK3g`n~{o_IcTtnr1jP` zKkuz4T1!d0H0$b>sl)x3zX$FtwJ*_Kfo^e?)4%J7xEr)t$Bw#3-+YI1>-ABg#RmoK z>jNMNpTgTe-bE@@k+q=r9h^r3#-0+fU93)-NN0b$Ytpize9>WxKM{>( zvT&akT3djPl~w&aHcP`TwKT_JWZ;>#m4e#9Tx;+(Y-gYgrRvd+@Jl0!SN$F4!5T~;Kj zE#pYG7qzdtJM*oMDQ9Bj|LQSSLELh?HXm>=2>(5YRu3R~E!F^YG6T(V*m)Ab6wpldA{`w7+keM}w zOxm@=;zyRsx!D%@-~aq$FP#BF8!(^lQFc*Q(JtSmcE;_#t#sBo>545Xv1I`4HjC-e z-l^M$KtvaAMj*;ue_heRkx!Bi?~7Eh8K2I)I*6>SZUb;;*YaKO3wqx{WwF@TANWz}ln?$7*O#$D4p zRzL49uvL%M*zvazSrTs8V25W2Ikc`6i?n<=%KTJwW@g2%=k^`84c{twdxa^i1Lw}s zM8E)Z4Y#k|5A5dBu1=pIWaw0B2bv) z5$~qCA%ynzo)ns6Z3ZIcy*vD%A{OUe>qz@~xI(S;2&)+ge9CON^B6@h@-TDfZI>}{ z!-67bSX_Z*5F5;_O=BZyx1P(>AhVH6dS}Z9=FLzG;hmQtt1I}@1qJM`R8I%fk{xL9 zvNoM&#j;8FBDOk!z^Q->P?F!Em1gTH6SA{e*mD375d4zg|24N>W=L5eW?(kj=;JP| zh&dmEA7K}EuCPaLn8scEjsmZy?s#Re_hVe=S`m{{)wRIRVzK*nw{Y)>rA`Rk=yo?G z3`%-G7f`wpH(8fpY@6O!VeYIS+7Bm4QcLGM`G*&OCrbvD%z?xKVRa_bP*WaAh12i1 z^WF~M7VE<${ZClvp~JphxpJ-B0yR{#O{hk4Z}hm2;Q_$Pmq=XDf4z>;1XXXy)ct$aS4+u0y3?$!+Le#5h0Ubm(wZZ>Kt z*jW7Nfjj+Fn^x&MU2m*y5AY2%L3nRRY~My}yM zyN#w1u_noR*RqgY0JDlLbM3#Euv@L8(ka{>IU&4 zVdz$#rS07^0)j*QGJE-UvkakoL(VFZJam&wVzsDtR0#+<81TT1;1mnVUbt%xyDoIT z%knCh8AM6{O`LA2BP2cY&{LLIeUvN_{uNyM{5|@&FL?E`egb z*q>?(#ki^}cU*Qb17w#GdCN~!@Y)kGa-i}etW^=OU+rZ4%2wt|@arXh5`IYynVI=> zw@;g;Fy!N28Nm)(+%Lg>_Qk57|AH^f|NifP9Xd|X!WtL;FgR>e0E-}}cWz*H$j+=p zlx>CMkzZ?6&v(BUTSLgAxLUUsb~qXdsbiF}ih>i@95Z09^^EmA z{6d}1$NJ86KmPEBpDsVxeUK62BY>);jW$u2_GB6!hlRw9FwOUkK10j6--7rwB-@W_RZWovanK$=%D&{{pOPvUXo6 zLp|!6;h^2^FVcASZQ~49VEg! zL;9EWsAR0&kfI-*o8AP%RK}z;HgA(-^fTxe8d!%aH8@BMA zu27)Jc4y`b#Pl1EVvLKfz;98)d{-n*RV&Uv%BnaOS)d3;2cFB7aZcmuwSlvoGotpuScjX@6 z5NeK~VOJ-rm_eN#6Lu$3;ZwFwi>iJVV6xNm`P&`hDKW>qk4nB)K%n6Ss{v# z;N6SA41%JI8lWtt0bm~EWY8W0X9JU)=@oKUyOVR#W^gQCM47O}8La_~&_TnQd1yHn z6UXo)!;c}h?f|8VMaD63H*jG`VppQAi5e*)EU(LQT5;dOt#}mhW7ygC60FG>RH|I>ZE+Z zMv|K)ccnp3(zu0qPfz07D52R|#_s9Q1z@+U*Gdbm%H;q>$7|=i#_3`_|E#m=Awzdb*$3-Nv&T>8l`sxd2`j9D&qaKkCTrMVNC zOK-j3c7YQA`S*WDOS!+iD(LUacq<{mVKZ*u+?$jIiM~wCswU_#p^X5R*mtWymg2r@ z1F?o`j0kHZ`!jB0k+Y$R0@JyWcTeZ zyKy*4myt;%BOD;uRdygb{-5>r9caHl*G*?b0-B5kc0XD)J&JC2(=8RhX~@{^EDEI- zCfRYP9-&ap*{u64aOc%gi?$Q$+zR@>Y-^{YV#k^`YR9l9*~$hqQC#Euh|IFL=G|^SF*Q@jng}Z7S-KTd;k@a*7JKnA4H!gSi zNBpr2trrZhba561&|7H~L5pjLcHcjL{1vBRmGiiz6nT-Tyu(FDXLpN#XKizu;UskML5kxLEqd$zIeI{L(yU8kGO&ZL_*ykI*w#OHd zf9r3L^Od0we@n*)Fn1ac$IF^qoio^pSHEVSg}Q${N4Zl-BLOFM`ism(?lQA0M)8sd z>b_NhfYQ}G-K%Wfi>%tv04O*A*5)>yjQmNU3C(OZiVr^;)<7`9ry=YNnGaCc2l(zF zs|xRHkpV7}G65Zjp&B`hQ81Joas!7M69PVvr;_;Ph*bndsyWBQN)I%5_-dLXX0Ty1|e1(4_~ck z)T3K`f;{sG^&}me{76FXPF3@vm%5vGFyLZ4rsW5FjB|@>mN%^*vFCz zpo^4%ULrj}vL}#{h727W(p*5zy#DjXWmouBfcnqw zI((c*{1}A^ff$j4$-u#0V7#q#e_m=`LcUAB-5d(l7NO}WKy_s0f!glQ0eycfOOSmg z{@pYysQL#5%Pn{cTte4dZq}qO6@g};8Czt1mZVct`lhj6u|$|^3iCc;y*^t@VYMylb zkrq{L+Mu{G(tTi3Hd{7Hk%5FBQaU$fx&cYv+^b0F4->?S-;ikGoiq{&h1&B&@QXgNvsai`<+ zZAmnxscP9)d)$w^25QM(2>y^DobQ(l%*ycc2cMm%=&5L(CmB+SvR1=-11z1Gr5nYc zI@R*S(!2xTpgtRQuOr(NR5y{;Y5`Z;TerHs{~Vz!3>QlB!ftwSNl-}|dGkuDt^~wf zQuZ;Nk-z)IK2O72LbX{9RJgl6y6B+4^x{LOcbqI~^;s=lqzp0o!rd{rt0Sgb*pk>k znX+s-2t&ou79Vy}CKc_6=WE|4w~@w8F#L^Je7O!ObIk4m>E6|vm$C|`&8wc#8zc-s z)vf^10}bx111AnqaCE4C8t!4!VWFO)@MpaK7F}AUXO`m_{az?Q_y)IgPhVAdCl$oK z;!IXCr6UbrcHnTnr2Awq@PNR+wg%}m)}gmpV728?LhQfxRFD{f_g@*4{{L5XZAq3~ zxeXw*yo8bM{qM4pgg*dg$%>eeM(XOmH}gD5ycoH99E|H4J>|^;->0dA^zV*6Ech^u zDot8?ELZznhXa7nyG}H!Yq`*xy9MWLZ1m9!EDLCT93c&O~*AK(v<~J#Nv@#PbbVv0qqEywM z0_czs!D0(X<9kTcSR>L+x&GQ^vr(gcXS&J3EfzyFJophV}TN1~vl|HYP_f0plFPGV>ZUq0e{tZKH^*j$Pug&G27>>XBdso}fXS`5YI1z=N~lLWf(Wr5tz7qy z9B|}^>Osk@u!zyMgkK^G^}AD%OX*U`|K`;sq|SSgVO+ZU4M*U=42^kz=frnvK!BIa zi?LA3F{iFC@(S|$hDW6+2Vkst1(Fqt!TOXnn(049zSf}Q;-z|ec1u9j%ED}i`&rl` z+P2CF0n#Lkk7xRNkwWjPs(jIP5vU{-TnTu~`0H~){KcVqh1#X*Dxxer_o`s?KmYtM zkdD@Z$ed@PM(U?IvqwW9>Vqc1oeg;R3e{aj-^e}?l?-EqW^yZfl%jW|!F4H%Lt^)i zr0J&%uJRomhH#r8*2i2fQL080oskJ4Ucig5$kjq^yD{?Z!|D6b`|@{n1rks$X*%&Z zj?v82Lg~1+t4_Z@AQym@>JG>KM1&=GcU{P_;v`cz3C9W_qDZ~(Amvt|DyeM7Q0mV{iR^fGb@e;1t#6SRXBW^P&!x6?c&m3_JwH!c zHu->ct7Tj1kWKWT1}7*p)K>`9Tc**2ZN@>)0aZnt~6XcYpoc zap%pdRv89Nf(PWwp(T6fApz4(Y}GH34&%FbZRf9x6{Jre#PMHQo=s2 zi>H8C56O+>V{fhD&x|*W|I+NF!En>Cj}pHmYf9;n@YzKH$;uyjmC{uRTY(j>5SZL zIS0=3bF$t&SQ4Mx&<`9JD9I$lz$agtoWSSq9o+0XsfhP2U8-2g#*a1Gyurwlu6yLS zw*=fgoQ5SveWaA(OB>?N`Yee{3Nq|hsNZ*gp30e&s?*e{;cy?DNSO*HQ6*2yu!T;p5e!_zLkecc$C4jJTnKtmMb&C>t)TLSkc!=H zF!NUwbfIBl+%Xr*j8YC6>_+^|7w%P}%5T{ecl;DbUL{4p|a z&0Lz#$Rde%(XI>tCtrgI`HsU{6?ZM6e;-UWWDd}hvS?TT@$xlshV5_|Z3LtIWRo94&M zXlHz{fyMv)^AC_e27>cXO2w|#`p)sDB2tNfg|l!w#^L9Aa)M#qZz=gAv?9E#SGILo z{!u2hrMLSBf~H}5fv)3m?$Z1s*>G+-`!f|>~=dJAPk@Ve#QEo@w;o593Yi! zpNeKHPT7hfroQ{lyLnINQj()lm_vEr6`uY9G4Ir|@*Z8CV`QhQ*N#3!Ze_%*n|XEO zXrHRx-GOf@Gcnb5N=!Z7hRTvQm}ANkja(nq9*VI*?fVPEjSTGtM_Z8B|AYYm<$OTs zge#}Cu41ugetl`os=XW23V0Tov|{%|3N+yF({OE5wa3<(G>*|k?ixcV8P#i@U*hw% zC$mW9yN}K_qm}!~=RBRX zlvdL|8P}r%b3ZEOvK=5RbU(0J+~N?A3-AT^5R-y>CqCUnR!!VW#7Pk~QOWw{@QS~* zL~um+%JaMgL~~ixjw6GksgvIKccuTTAGwwXtZeyqz2G=@$+PQBToXWbX|}Y#Zm7uG zSx-nRYwZPqGqZ4lTkY!X#qN=u?Ir*NJ=L(tIs-sn@L%R>w`iK6EXfKZq)M0gQH_nD)LBA8>mHL-3+2|9BHWl&`^Ri)8_+gLN zi$If>mc)J>wq%xO&AYiwgqQ#-7fCN!#zbi#=ik%}0 zm4GyZ!Q};s@{&#!5hwIfRWM@ZzL|!yan)48fo9in7;xPIs@jj<@7A2LM_&}Q?`~Ir zjSS&|JqNp&=qDHxk>v&yOq+XAJ3k0dKk%MKpsox~Cc|#Sp0Y3*RDBkKHit07s;Isl zW$ZdNm;#^YS*;R*f489T;Y<)RCI)=t;AJei0urAj&YpLPx+E1Ng z&nMJ+PF*^K5!kFZp;ZQ@ZhxKYCY_LvEE+>{=As*ft&a`~Xt~O#3r%2nJBX5dp0dS# zA)4mg83NTYw6y&cZX&A=1*y7{QW9mfyk$iO59~SQtnBotS$|4yC;QPL;df1~OX)i3l{TeB-4&EVT z#n-O2MVWLhyh2&Y2Lf<`zI%2D?do}&wpG1vWq3F|Si$=`DXLUue%AN`&aIgIz}>}D zrRD?7ekUPHz|$1io`+y^z_(tylEbv%n2zuAJ^ZGjctt+#Iz_lsT`^2U0h@^^u!w>(yj4P^N)Ds^hSmgNLB=>#$`3VH#E)EJe zYIsCI<1#|QQ+%#A8z5N$(N2W5EDw5BO3OG=ERv&bhI0BS!omAWh#;k9HxP3-RAE&e zR@w4;PYML>hOoxiwV=l{8>}M1x=ITTj3#O)oPyyC2=N0?Of?Rqkn2LO@Ufp}oX9&w zIx@4(l?n=YTJPX;A?^r6{(PW|?`|Zc)>pY!>GaHIp90W?Ah9et=Vw*nE~@l5zI0Su zTl!8M!*AR*$DIJ8y5s))VPB*{3!M5tz{&kh++eG;`A=_irwLG&Q2^80Y zKUqFuEdJ5H*SMgBjZxTCVHsPqkwTJI^-xnz2FbZpSXsHx>JFHi3%+EUrP-GxmN$ei zLx8q}2VU_sanR~DKj`4TM9Eu~#tZIbI#VYS&aB6hF@5tOtZ%WN#KN?&3TH86LX!|m zjYci%j^_IueR-q7xJNf%rP##&?ht(X5wP#;)Rd!W0`=**Ke=P!!A3VwH=5*HT8Sm5 z@$_20n7y;=ePX$=Q7FpIOksXEnRZ#v=<0<>i4rBTc=1aM{gV!u`IWE_=|U$4$|6J-dGinw5feLNg2Goj<8;5krlpxJG`n<(y}md!u1=U! z-v-Gdp*Qh7D7K;k!j8HEB$n;R|NO_3fUT$wf;$m`HR(||yajGDR9R{_-`G+KFBTuZ zu@1lDlZGr{iO=)9$PNcLq(L9 zrT@O}+n8!Lfo>9|w=%*Wv#-lk?WT-ySy82ZX9coBRLzbi8SQI9l*@Lpo|fK5c?1$c z_jlC>QBMc~i|wNob~W((`^zf2iUhntCB;W2v~#QvGw`O;U}><&qS)BG;v2H_HU0S-X2~ebeZmgdu@7vn&0uJ*_oRUCI;3c>4!SH!-^S+}y3P zFVZ#iRkIK*v+U#w`jgX5U7ZL=WbKZxZs~PbXxKor;%X3s!{e!8+#MF=Kv#eQi$gt2 zk&6kmUrxB%cLnGvDx`-9tWkv2yjQ$OS9Kn(tXafRwh;@}cl}5+1ENu9I|w|(X&L*BsvSTs8lvk{FsD-{M1;T(8a zjE{r?;a6-=N2YXr^SY#j*BePfjZPr3#wmq>#p z@bn{#Sts%#upx&Wv~!e^2Wbeo!`iw>`Vz2swSg}j1IIzsytUkou~;b0NRq|ywrSW4 z>*pWGC-u&Bbpfya<)%039Nw~x+pzk?KCab1Q75jve*w(e=leyto>$H%^R=XxMrt(C zyPIXN>WK`4xckMXZgv?nb`scWW)1Z2a_@Eyk_XEQ(oX{Vj0wQO0bZ}sTY~)hX}g{* zDaOsV1xob1B(M7NB3sNZpr>n>gDo?$bMqDtWcq|~DIrq%#qtA0jp3&hjzVe5{9t@? z3Znsua=-1-JWF9t812g$mIVNdE<0k2E#^8PJV;)LKOO%KBKb&3i*FwT7p#M9DvWN zqO{#j)ob3vy(OtT&)vp2?tBciyL}))>rw-90=N~&ajs#ix||VzGgWB_p!4+ zIYP9WF1PK9)vsP1I^LdoJ6}={_*5Kq6Z2l&G#Wzz$q*O=DOT+(P)qFH;SL=(?F(_l=eX%=^ z?%|gwzf$F)S)UJ7Y$>Uta2=vSA@ZMp{`(M@)5B&n5qFik(D%9FC7kL2I#+xsP#<49 zVkn=$Tfqgm&pL+o^>T)r7vJGAgjdQzGju+xL~(f26A}FXjz8lH$_0(M`_jsNrIH_( zoHb04m@yIKO&dr@J5{ZNb8_e*fUdH!5qS_))iO>dOk~ITCVu2k(FQyNY##7#w#duw zv}4FjX_rL}mjZhCF7(iR0Vl7swW15zkVfOmYq5N{fnrH-ek2+~oPNsh_9lh+E#Ahs z+nvs$IHM>T+f^`3;w!cUH-auUlG@|%1&`=l-wBIyo`w$^y0JeOdKL&*(Sg;SW}r0g z56iI2+5fW+cX0+J|AahTBbWF0G5rvAnK8Gjjtlkqlhzt3^(%fA+%SXO<|&m6eFX7I zByzLpkjKE=ah!?=z9h0~U~t`KSwf(MgFzBd_JLhidW*DY1-E=4$&;K5`HHTz;W!VN zF*{uMD`_Nk5b3OCe(=n9Bv6IV%){edfynW0q(EJr04vd1q1^mF)VIbMh5G z0}9@^ZM`=I?5u$v+e7eKW|fC*g_KP^NtOPWTk1HClgu7-ZkW_~wB=4YS_z)&E+P!Y zSq_h>yqfT`N|4x$`**I(0bdn%*4S3=uf*i(kf)3;)JD`3s>3P@eP6?`j8{|bOn0X( zhb|CW1d#D_*_t+z9z*Mw>V20DOe?|z9i;2k-I!~ml2I($j)D;19~kb}PY236G%>h| zBbe`_UDdU_QGU0}-%KIHwTnw|fX+39CKnc~n^8&>skb329vmH#=TDcHUB{OgKv-i# zY1Uk|R5HfzIx#$A>;J#%gHLD$2CD~nky-q+4d|{A!RelcxIE3zI-MZ>m%Zc|DmhOs zrv$X1lFEkI;r)ROUglR3RHGaKik+(GcyI4o0Y;*MOmo9>YnfOsK*wKs?FKE$K_^}x zp@aAGDtTC!rH84ia#_M4OHgXam`b2`r0!kt;ab~h#J4^w{K7e0rI>z-)G!;;*sUL> z`%w#+eWm;%pe_LY#hn#)&=u&*anq1SDEYUv-J&7M2PK_z!0n2$p9Q3TvRb^MldYT+ zr~p&F$b4^KrT=2Of~KX4DB2+I`*Gdq!F$h?v%a~@Ug!}uc%ATT%%%LM=>px{n$Aei z^7o&F>}@AOeXJP%G|A<>04v20#AB76mJ)7C>s{ZGk9hO(j&TgXHca2|Bck_A(mCNR z8E}d4_dXzi8)7lVs58gNvZl9F0@DtzRpAa%7zMrMoBT~&nf2A}Im^RSKwz!LF`(A^ zM$HjG{g9C1H*O1{3r!cL=~z-dhnn)ePF8$_;8te#x;8dvp!LkYBFqRnVdyxNwjtKD g*ZyvjX!@!D1EJGJ%9L>@D*ylh07*qoM6N<$f*)c|jQ{`u diff --git a/frontend/deployed/manifest.json b/frontend/deployed/manifest.json deleted file mode 100644 index ecc12ab..0000000 --- a/frontend/deployed/manifest.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "short_name": "ai.ketrenos.com", - "name": "Ketrenos AI Chat", - "icons": [ - { - "src": "favicon.ico", - "sizes": "64x64 32x32 24x24 16x16", - "type": "image/x-icon" - }, - { - "src": "logo192.png", - "type": "image/png", - "sizes": "192x192" - }, - { - "src": "logo512.png", - "type": "image/png", - "sizes": "512x512" - } - ], - "start_url": ".", - "display": "standalone", - "theme_color": "#000000", - "background_color": "#ffffff" -} diff --git a/frontend/deployed/partial-react-logo.png b/frontend/deployed/partial-react-logo.png deleted file mode 100755 index 66fd9570e4fac42bca15352def191c563100b2ed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 5075 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 diff --git a/frontend/deployed/react-logo.png b/frontend/deployed/react-logo.png deleted file mode 100755 index 9d72a9ffcbb39d89709073e1a7edd8ba414932c1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6341 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

LLfm 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 A-! zzI=-P(RcrRo>^r*Q&CN(!g4%dGMW$>3n}k-4263+f?#`;m^)w+$)qa9$zU6vjcAj? zSLk4xI08EJ=JNRZ{V#pv?f1U<-CzETH>U)6^Ww$2J@>VqE{}bA$XqK=sKz>F=ELKg z7q7nbU;GFEXbZQu?^IosbX#A{jkIIN%*dQ1!evE!hv{E44ixZAFGD zURWbeG6%*zG;I?Lj=tK2UR96_5#o3#a`&y5@Ii1coXF}(7d$~SduAjd3 z@=KG7S$*A)D$9Kj)vwhGbD)G!ZGFME$P$Q1r1JpBiAHt@rIIp&WXbXTIZK{jQQwot ztL&|vbg(N1=6nW%J!u%W7|@TyfsqJwwJ&?ew=%uMz}$)>%bHpUiCjQGi#bB@P@O9G z`;K;IM3xj_F-gao;xp9tJ(n z81FZ`wbt&=u2ZKvyBgbt(~#I{NNZa$3Br&_F-njEiD+_<1PBFz#083SLxdoL8zi_u zBq0)MZh|61oIvDsZsNpcyAoGp*Ew~XI_Kut7Q0QI5|%lgXwx6Fj?y6aGUf_8Tx!R)?MI?BDTLl4f8~87vz~)pc;&y zDS)Tvm!La9Td<8U*g{lQFc0%zBpMryRt6j`3#;ZlUXerS4GeawCM9f%OedtA^@sKb z05!ZRlolq~M-X-j0AN`eHNEMCKbXlS64ibX9B3{k)aqSkZb!36r`B4Y&6zvBdP4 z2Avri;TJq<)1Z)%&~5|bTmV!!>-7A^Ml7n8DV56kk={03@E~&@n$(j~FkyQS>W)lk zTfP#G!yU&cyyMah))D5Hd>G+0HoZ(`3Q)^w$_BtEEY)(W`6O&|16M@PrbWhNa)MS) zIj>Oa_BEN)Ct(=O#Rd_fEdjZ5ypbM&-MoEu(o5_;dxly*ok=p$g$5S0zXnsp72NLd zn;0+C>9@OFjGFH{qUx{DWtzOf3XDq@h z@5pou8_x%d#|n-4$zK9(xeifNc7|z@vD&J!(J|5V3PhftbwdS2r;}tc=^`3>ASp1` z1Y!C5_M_ZF+I1}rnTi;xp*$pmh-N#H{bU|zbuI5E)U>&Qjdrn0OX>nw5Sl<0n1nD^ zBVQgstT>SZd9H!bsL<&kVjAsOarj!6k6{Gh7+hI$4CiJ`xx#5em%Vd{s}pFLRhuIo zK=?x&FwLhtCZpC1gU$*J`D7bThjAtfc|sdPb0julgB#LdT)GZ)bjL2~5~~{YxipxR zUjau_XlQ{MI0!3fVU?r#r`fA5cC;~!a-DXNvR>=Fm_cT+t6Yvm#MbqQV_zQc??1i2 z|JLt({->MQOYIe`eLeCf?_c-zveD0%OCloI_4@Ss&4*t-|Mr(}zkC1YRpcsN%zUPi z5+Wm8C5)1_$CId1BVmuAul$$>G~Z%l4ReV?tDs`!WNBHJFHLGkgaNk4=l)xN>A(Jv zA3i<4RX^o%eR|~G-K%2-nfvkaip$;IeP$lF4^K~DzWLy1jvM~9U;BUDt_-q9%|b>@ zdJO=V+cShn*ke9Uy^_+5u-DY~EKg~EZs*sB?C|fIN>C6=ok}~e%xHSez_3ex^0zO_ zQ7(urUwv>&8(P8X=F)cCHb=zTDqNxCTDm@cPy3?lrH_XU+}zxu>gn+*)@2>X5jVVD z61uL>PtQ-6r;MW-z;5IzQ1bHWMgD6BxV!RrA#SIs-DgS>7$TN46Io-?{<0t-@@5@( zcMl)#etf=Mf&TF053iT!_mA&;$GSb(daC!`jRv{Y*TOTnGH)AK5GMxBZn=m%jB^N? zi#QqlHdv~vc2tGk^O&2J1|Al3E(kgED1yGf?M3xssPU=L!`RrkJm^9$02q}6A&AFX z-PJWv5y{NF_7yY9*%kfb2g4CdbXsNzW%OtgCMG)zl&UK-+)f|o=>@q!WJaf*5wV z;2aSEp>zv~fNr~$=fCCjb_Od*9;>QVVmKU!Tp_7;d3@#xZ#I}@6ZQq$LOWp7wC2!Q znL;<@ZnzG%Ya2hKEoAD9XwRi^3W?yk$Gj6tbHDe zp->invARO0Z_z3zGNUaHKiL_-+oy+QqB7RP`1=JQ(?sjo3c^wVPz;_*uQ>yKyk|Od z&WJxx?!UXOJoKj`Cj|Pla=fks)_vxb#CBqen|?h$5@26UivA{k7)cuVGQk?(NB|5fu~+f35N`WtP3w?&p2E-DC4e2xc9nMeq< zJ7%p(;b5aLc;Pv+p{C6!*D*@_F@pJYi8H(hlf5UY<(4>sQQgv%ykOk$F9#*N!pQHg z&Y+0sFlyghliVX9d=|8tYo+X-WKt|>=mnWQowLvmNAh^^1a#FLEVE$}MMXj8I*~3BVR3&t#;bZ#;m7O(nAc zZ$Oa0W5Rylh*6bo+0@lm!pz!(Gxv(!pvTL(+4?-qJ^7}$-tH}@So)ls4{sJIKQYKP zp(NXbtHgpvAa2Z(w0PTVWl43tO0hB`qNl&fjvg^$QY}QZMD@sgaB)}3ebeS04YzJYJtk|TU7IqN5C^myG6#Kguw)4y8@77>I$Hs zbRH1|)1sNi&P@`j$Id?rS&j6i&xJ3Y|KNdpte*3FkN;NQKWNeEtadK*nyJ9&SW|sf zEUxlYXDEnvnTrzxq2XHRm<2K14%4=Ge~%NBL=N`>gwF^_kni}FOA|cRn)x5yWt+pq zBMz%$B*j|N`I{)w>3$TN#Vepdjxlgl4~&(7Sk>+BXKRfFX2#OQ(#|G~QBY@lGJg$?k)yGnJeI& z!^vThMiS9;AZD=rn9gQnF~o}KR%71CI3h^3zx=d^1b$G2$WTd&qN1_&jKDX)_4mJh z_gUfk=Jh94{r>Uo`>#G{uG_qMc=dr7w5n%4_2c^=e)_Y&_}%aP2cQ4wN3Y*}u5!h-z@SOVNr+Qs|s{*WW2|a;WysN6;)UkXpjTMx?W1R3wj^L*2DSy4}e; z5uj!)NC98%P;ZjXG#iK}!fIJ>PHUcf5fdvHH@5)ZzW?fHZjZbB5ATmxg=a)lx0Ty_ z{Z`FfD6REo<<0%Wn^bfOF&l{NKa*>uJXV*3s(V;==_T-Uj@VhQJu_K%(NJP1Mob)e zdwqWU{PfjY_hjtLet!S>e7y!EkL<24#>)HqSLjFe-j}DoTnvf7{H>EJ%*g}qX}J=b zdE`K;?*Hf-MZ(#`(84JeX~<%iNnqmSN!Mt20h|tO$K}DQCLpPk`Wb(~se0&Xd#j$~ zj5*@Gy%}lWfnh}Sta*`fhGzg>T{ir}+i&lg#yos?jk^?RA$+!(|4&&kh)dCHSqiqN`CadW2p)SxoPNPQb3}jEI$#+9A-+DWVbnr7fsJ=aDfw z*$$@0dTFl2&sM9;Or&ubTj|m}_!1WyXoFZ3pemm- zR+JLZeH?ic=TEs+tIh@LVmge5Q`_dNj#SrSRS;xI%$*f+!JtPU?Y0Ea4;7k+c@2 z*`XxSY)S0k@=5Lbw=(T8Zwp~V*Ib#FRT|v&ls>8=G^W<1TeCuhZ`1}OGV8iqh&4&x zFTvIm2I>?F7w`D_@tM(U} zWD{>b{9TRr@816S{?%>dZTB@5xzZ_<5sb|4xYQNe8OPJR@6-k&&YEX`^XH;+ii6E( zz=&iyU5ay~5z&NDa@7hVCUmZ=LEEFk+k@YTv%f$AqB`Q{>H5RFoA}13zxM|}{tedi z&CT7@zP!pe!BEw;Hmj;Ph!uAV-Q0il(VL(8^Z(&LAHe;?n_b@iD;SXK^h0{q#5v0P zO~TBeF>;0$PADyaaZf@7Q zk^1?vZ*Ok9_KruOpm@B#t*Tgul<3PamA*B34pcPUl8_m}ZYhJ==oobuyAk0|KtzC{ zYS8M|P9)>3Ydkw3_O3a25ynA0D>z*^4E{#I6FXv_Oy3YD7WDh6uG9GUva*rE z+GW(u3|q5^VC0%85ewg2j3D~jw1_Q-B$A=Tfy=x++hk*LR+C;S%-QRK1M z>?$B)g@Nj?=?Z~h=4zXshg}@_cdR+S=Mf|`)&8slCW{lo8u^8T&*jU+1d-XGlRO!7 zm0sip7_x{i1)7f$z|_YIAa|8nK@h^Wph}u5GAp$vRf*_!cj_3{&71Z)NdOa9#1Ivy z)|jf^RuhHy?-`#ty$TVNqC@(9@HGt}n-*P4atC`@sc@pCJeSRpN8l7v%&*@KgjnM> z?`k)w!F4b0H5EB-^ne46916rUvUB47{loZ!BAJOXCVHT?=f#xW>?fT1sh*foyIM}M zjh9M`Xb0`}H=J`;OVKEl*(b!fYGUq8jdDn{lKF{q9{u3{FaPTJ3nmL}cdNiPdeQ=% zvG12yLiG-a5zDK_sGHN>QaoY_;uZ`SnbBj1GM1vcL(Y75fci;0Ch2e$Y4G9^3X<+{ zBczEo6#%THW{x`>s(|XUeb!HWMgRyi`Y|BC3txRv@{}X`Aoj%!(K%D(i>{Y}?2)Nq zo&mpSd{G~@i6W9cR&5LeJ>!?wa^BIn<()c*AbRhMG6M*wVZzb%=An!bc@45A%{Y*W z`xWWCwjFMqD!?xH)5$+3%Jb9nuwA?5KpVnqOmObKWOVnw7S`Ma)rjyL9wz%tU3u9Q zupA`sg{b80pS(#!Q8}%Qu$?(GWC2MPh|E=ewR%k&$;xb?!$5Qk9wQ9xK-LvcgRQ^0 z>$M`qwMHBR`OfeyVnE>ho}Ep}A>Eu(Nl^HWG&hIsK5%b1i zP*1~4wcFn*hT4;dA-hIo`@yM$HB|*`R~+_2W@L3qNyu@TXua4Dvbwkz-MUVrw(KYM9JvrM(04kgBbZeCE)K)5djZFbc&fw4NH zDWl~e+GnZtI3{zQ9MHt5%zc7IqFY+={`2QgKKS_N%`blSz5nFy;r8v@FVwYGZZa}c zv9C{HtQAyUu8(hC{nVwdzxkK`P25nt6W%AmaKiX>4xU8M9Nf%=?4gX6EbVT(3Ni^D z$KE^|#I>3?w>QuGs(nqY5EKc`ebOp2f~%{W*C~oP+0_!(sc#(xg95>8w>MZ0{x?~$ zKE|DDNEyKa#7gCM=zHmU-A|8!EGaXNWT`Gs6&Y2v)*X+y))VU5SXovO78&SW=h>T{ z?&raqe1Zr||IXFgAC#HL?zCA&jh59TKs2j_Ej+w=^XAnzzPw*mwNO~Onu~G07SO2u zbX6vBX$9`@Kf2;`F;=Gf$@wW~-=a|$D9H{)L5dY4Uf_(Lqe?zsK`=7W-6)8PaG)JK z=IHVzKRF7S!;8OMZ?uFYRl8d7KNztHaxynO;H8DCXfz!#LgpMZ5vcQ~OflG9RGyH9 zrRKv+NJ#f1!3j)bpQ`SdKi0ba@?>0k5r4XoUcC#$CF1a{)HCw*r~*}VEJRjsod#?9 zn&cU!>9I)dm^Gsulc1UzhRsxUrSnDw-*}EgBG_s5<9UyWnR499++LPg)wLpwl}eN4 zHi??mMT<5)y&HgQSJwb9765rr9(ZE*x#_X{q$h$<26pRQ%~>F*T^%k4 z;@CSf*oZ+G>xzhoY3igzq~Kf8T9g*U_pRV0{EZK@#ViR3Ux-gt!a zvvoqNekTlaBEenT^A_xe_g)UPP*vvZ++~_^7G7|S9sZ%I6-=KC-4`|9eDF)xr>BRT zSE;;Q-*xZE+lW}1K;Zh!SVv^WX1r3zkAL_p2Z$z@7Wiv4H!$i$-_X7H4rO}HhloQR zH+gw}{z7W#2pu;!cfh*pSlPaQ|MR^D8%@1L|8nc)4y zt5$PmU#e>5x_kHb^Xv2V=D1_*mP-iqlA;wXx2?ywC%J6BIH&( zVV7W(5(5}PGWBR5qyfqmS=Od2RC~bLuf+tkS{SF8*^g{>6PdHh0{~jx6@%$0Kqved zl0`-^yT49%@MzR>+*q{Q1GN*4rxDgd&~64ZLWYRKdzWV>bG$~JDQNzWSrHJH|H4%| z-kS{BTWTli#q9x~cim8LP_7>t*hm0*W->JprvHqoz~F=@id=KEO5KP&!|yaMVME}9 z9-WU>AZE8k+cY0C1j+8G)_zZezb>1jemle$W9i5)#8BJC&GD=3^>O2_Ua8G*eJuafFf6S`Rn)A?f*7H3+u$- zEK2yTtGXIW;b}JvhdiA2PyY#HuJm{kV6f|)0vnN0wIxKv%BU?>dn{t4YCC&oy!R~; z9@cBuXeY_pg`-`t_%+2Y-*Bez7^I`0YF|mao5M7ZpIu+des3sNZRe-^a5#xbSp`SK zU}{KPo0jvk<4i#C<39Y+6c#p+%odOg?;kPQWHCW?%{;QJyIyMB3o;S_Pc(klcF&#z zUL!JHdn~+UB-l~f&7d+4a4b6ZpTDFK$C2~)0Bs+qkrOC11g+^j1k&8K9Z~>e^~onA z&YF%>PSZVBHxM?ckV~prK#Vpb#PDjkY&zbz!%M?nl zy%<8Xv`;8Fav(!iNt1OV+L;%VB#cq!@a40fM2!|wS>jSX9}9PP-;{Q)SIm`t!^o9~ zla~Xr`&hRN*XPUivTi=ub-6x$=QvgaRXZZbdbUJQGO}CY%E(qFRLHm@@r|GU+cWdw?vt+C*XLc8D_0(CB_plqul@Y= z^uF17_v**L_7`;Nn~(1U7c-aMwYYNHKuo)A0g7}!$xJvmJhT?jT?pk4z5DXp*Ifx5 zHwRZgef3p0?q9!tc=)jPE_jYK@yJs9&{L?&hY-fXI;T~e59OfmCxX2T5OW#95a$xD zs$5oA`nu`{x}J08>xbWc+}*|PJ@VG8ZarNTt!r#ubKUlSvTG{xE(1@`U%EG`>I%fn zOp;|NB&tT*H4C#wVl2;BNOVm@py=XkTCNZj7ke8^zkT>t^`mrIe7*Oxz=scB3$d@y z*UR-2A(7}&hO9{w~tS2I${=M0#wP@1kw?9 z_VL&hX+IR=1(LV$bkNYTH26*y%p@D>;+e7DV{9~NF(?Azg|?>J-4GpPN%$N7#yVi*#@~RJM={v z14#?OnX}_RMV5w3)*WdS%UCNZG|`O{)%F*xNsqW*jab4i1{M@_Us%sYqZb7(VbUCv z-xNUCt{_ne`j0$6ct)!j3}wBfh>p=jNS+{rPGY~k-8qjN34x^2?P8F?w1i=JDgQ!f zb$SUOQ-*zmJQejgS5Ay1YSd2tumKd>0N)Zy#?jfQg#(cqq%{cf>sUB(oPvYaSe6%_ ztzc;vu)BhcTwT4pK=TXVf7?unT&ngJlA z)wM@^J{f*J1+5{k)lQ$3pN^_pk#b&8L_;Wpa#k)-QaJ#}~O7sdnff!5n2FuM&VX+8y96&`EixAF>CA=LYbxd%&U%GOCA~z??v{uscs@;EgsWB*BTW=M>W= zA&3Z;>t-@%{50+{9@h5B*6oPSlQ@_qik=SfHJJ|yXW};}9f*i^)D+H-r3W+c`neVw zyB*@`%o({w+aW;%l2u0nOjjve7#Cym_QyFhG+{5lE%J?a->8!D{QUl4yt@DN`T8zm zAE75`t=r>R&(DwV-o1x-cY7bAc$D&fz1r6=zk2`Uj>S?&MrO|w%WhcFSL&r?jvLx| zkIDvUWJU*#bSBpcr20EQBU2+sD`1?+DOw>1VeN?Pe(H_aAN<18ZK?P5 z`u^!s*XvqG=E@a}rTw__{);dFiwxwtX}hw#E1uM_u^vO&Ko|-$$HWt1QY&!#{Pfkk zryqa(!MA?-5B$>~ee$>6zxsu{TYmNBcYpm?|IferpZ+VC_fH>w<7b;2Ezk~{Z2MKc z7lClzAUYYnt0X3H+M)(g^Ej9}plp2w&%d=3&@j>aiuTRXIySq0} z&+izxTrb*M3n9ks-Cg6_@An14ygvVq1Qi46m&a15X1LwYh?LYPUo~f0&))!J$Zt}}0!Cm`guMULj(Ghh2|!{lo8Df~G<$@VQa;=>bYFh0e>+x;~#BTF(9 z$jKY6K+wmM{Tseix=W-9;`1QH2s04Dm;f7}TY0YGBQ^1wARsa$V|tMNOOL3 zJ&dOrQY4^ln^RkQUJjNpWTOdPw*>G!^PO@t2)1@NfbiYAEvFY5?QXIJJi=hGvv4L2 z(4ux}l)K}Z@UL!E&bhALHL*Lc4>dL>PI8l_;?_7B{gWd7sDybv-_DWioEkhD*_v*! zpTqXjdl&&E8@54$=B7PvP9RGF2yh8@3xUbMo&bb2(Fe;$NZ5PX!f6;4yAZLatg7v0sOn5It^RGJ@U|dWc?}P# zwrvR+u(3T*jm(VN8=+Jn^86ybUF@OR3+jdpSST3A%d6VVt{WFt7bg-y6Un6Uk)rHW zD6}g8X6f89{DT#SRIAXDOdYmh41VDuUqW{Tl*Bd&3SvuOSU@hvomJJ@+M@1?OjAc} zI4R-WdfTv&fq&0JoEYd?2YpvM^a|4Mj^MHe+Q1RI+z|pfgOnWb)W`01?*S&{Fcn3U znPioy?w~_4BY~d4l^LmFh_tIUC3B-Phv{-v8*M%3`4eviBE69s1-imp_d1E(83J1E zn;72cQO+41#ibt8M)Zq zH5UegtR|zWV-a<2JzqSzUoSR+2gS$iB&R(xrB9cbV$+ev-)sd+)h9=^rF| z6rogah{oWneZ{|=voBkTg`+%4ZO&gy(wKbdpb7!Hd$ zZ+WM}fP(;gIU3wdAbGP6Kz*kB8Srs#5TGD34#%A2x&C?I!1x~AZr~dn}e}heRK0F$lk575rh?_SL zm-j#H{dnYqk9@}XfsCG)8r4ZtOHgZ{cIOOwIVxk5FtRZt#Sp_UxRD<}(~8?ad;%p< z)hpI>?<4T>Py7wJ>+pm!O2>{ktDNUf=z#fAF9B+y4H4eyzLr?|;zX<>}qSo8R|` z|Jc9ybHC@G_!IxeKl;_@zxnXdPa6d-UR{(fG$*$@dJy&y0#V5zLY}x7z@BGTK=%lV zspxP#0NiP%4v3K{wrU+WPw(E}9Isxz`l-kFKe${kxt^b%9;@qvhYxR#TSi*|c#A3wm^4xByaB@(0Y1)%(Xsv^WpQ;Go(a5KmCZU6>BT!fP*F7+%0v7(;Q={ zID00Cee0w)d0XB>aV3+a?yzp%SDLCM5&DlhqGykbS@i$Xo&LBat z;pVdIwMYn+5d|l#oY6y@z5&H3RAZTNxf6#=Q*HkTJC9_*+`~`)s0ujrdEJN>GqmJ48CwwBT&lqdhwL6jWzO28FO7-y>aF(2f zDL#EOC6T9(&@PvG=Q-?*-3A(gQ8$EQrR5ns9~-o(@IBZub6~p(XEpjP3%bBcE$^%6 zLE37_Q9}m$EO1_h^wG#B} zrdD&$BQiBg?q;v9V4er8brTVW2OJ3S^!V9Y-{AH6?Ym!JNyGv!M;-_(xn?`J>(fSe zG;szhX4v<;3rAnyy?uQ5_x+K7=5PN)|J-l?)?ax480M z%O$<`wLbZYU%I>d#*aS#wO9|#+tdZ%V;aV)$;A+OV3n26m8W@Fp1zCUFi8VxG@< zohl|8wmIuzU}>1Vxuc!xf9T|*IEqXZ^ns~G?G=_pSy5KTw_#11s|37ZibGb@X<|lVdTLu^GPnGwN)d#)q4MVA1jzDh z8}nU^N@$!jRu`Ez2bj?fQ=wAR=R*m=im1|bFnGOG8UHzsG|a4-w*4-D{mm=_!F% zxN0DnhF5z#jDlOccIDJ@t)qo?N-ic&#|yAC(Z;)-8Ev$a9;V&WtgyZBu<|LQRg2SF zIqi}?yLd9D@>E@hJzo6!iF3!}z)-cVtTN^#uX<@m`suwYV%fd#r>`L@Pj*0nGEyNQ z_k9{qECQvf>BWFT&Zs^UdI!^*VLJk_98)iKkAkpSscbhO1hZ7<%Sy=S21Rh! zY$A^?JICFo6}Ol*eGv{`EUV~0>j+m%o3-p_Ua>SxjM?(Gk? zpKc#MxW9XIspnh-ckhaoE7mS_KVF`GtlnRJ{+qi%-gHLbV2Qq*As}IbtKmcumU6C zfAF9DmH+JjdUyX3giMJy3`YA2Dk+NIz%Z7?c}xFJp9QyS@u+v(c+!I_*&tyY-XB>`*|gwbb)Wq4k_QEG=?8Ypb% z=ySY(9J8KJw2{nK6--P;{oL^4xx*N6*8tV$UYP~Um=a@ti-~3FXteq=m#BMWMpfSw$v@yc-xuyLe zam*N$f!P?Ry>KQRu-ls>b8$r)%vaH`aL;T=$$Kesq*YF*Xjkw~=5vJb5(@3L&l8iC zZNB|23t|9W?a@*Qe_z&;89o@qO%~h_iZ?<6yL({+#w=;=!Yoi>uP-Z|Ntd4C$Kao&OVF%a<7q!MDT0lm|n}{{aBB$JVx9}Rqwr9nVA&5CidL(?OnPqNb z!~Ou>H0I~ru0RWLz59)C9mGibY8yKl&p>o&RQ~9K#iwPDz$D0sh>}te6K(dfo%HAP z0pZcqtGs_eFZP~$gX-Tq3vDY5-k^%X)WFrOpUv z?ITcC;gTcYqGgcNSfhn+>KU*?6xd^l&?z{X1 zH8G^Ghj2+KT1wqqqPN(rM1(r58 zR;E=C*7cfpUiO!(TZUnI;xnyt&E;sTyax?lwj%s2`Ihn2ZfMirt3hY;TXx4|{I!ry z??JH9nQ?tCdq(Yf@j>;1y_q<2dtnE2h&OV^f=f`2qi|kq(Ku1VT?*F`j-9{{J;kMLvaf}^hfl#?!AkAk zi(JQXz0?)8)^Qy7PtRYXQ!3^IxxRY$9m4o)O4U9^Ot|@CZL72yWUlPe962j3=O@YT zFs<(}2`~SChP=8P8b24gAsQ)HJ4Nn&=~wqZL+Wz*{BkK0m)#NT;nnLE2TZTw=)$_Y zz17|Q-G@K=(O-K1SRcN+*?l=_(HBpO*+dINFz3jWleEA{uJ!8O+uvHZul}~b>wo># zSHJr1tM7gC!7pd*M;u*uQdhktAD$k6{P}19*?;Np_#gfHfBvsMzW>49{Wl2^F%n&0 zg)Rdbj6{>>HG2Xj!v%ld z_WCT|n(MG*xH!X;y&^rlip+DPN5GX3=uK~MF{7ukf!QO7Kp6P+x)HvOY={~Qri0Xd z_(DKtVn!wtpfruH*|#VnP}OsqDt#2Qitn+`Y~ie|=;Kp>smVjS5S z6kElX%X?=F2*b2Eg)bW1*6N=Cfi07mz$l@@bW*C>gI&!mIV_7JxfIC>sl1M z%rRoAo~X5I7gpFL&_s4i(Ib52pm~sy?-RLpWsQeCrqBnoCwWw7V8dK=QhPS@IcATw zC+t!s0UM_=sf-E({Rsa@Mo%l8v%Z%f+uv+m(QL=CpkpB-sj>zIhV9|fYUl0FFY&_S zU<3o0)GJwj2uoQKgC6y%Y?zQzk`6TlW0IG+q<|ct8;+>-{<9%!`yHQA&;pl{$QXTo zQOC^tVy#{aiz#9alUK5P&k}{xrDMTVIb$cma&oN7Ap2OKh1%O#)yl9CtI4z67U5G7 zSefDxP(jhEnN6ALF{0)QKFjq*Gf-T0cD@-#HUvdLu_jotc<^PI;ANhFa+M zJs0ybOXy)kt2brC`-?sgZTp!=GV#nj*8G|=sS9+ELJ)D2QQh5@IcK*o$?E2KQ&nPxYpSoQ z*6GG5UtE4FcH@|FaM<@{(WJ>#)%e@3Wby}_3ulzwbzf(UZky53)zXfP!k{ZSy&P&S zF8BwmGT?yJn5Re43Xn3bjnLTRO*xCq-rcAKIo-+#W~=+!I0ZyLpBh>=sUbkruI@cY zWH8Q~SQ|kBi?b8b^MvMd(ku}H(q)8c?Ph>ShQzY)0gZ_U2yb7Nd2@r?yPwQ_X2wl? zV7Eqsd6V6l)YH?ufV32GbMVy)J%08Z8BnLimNQyGlP_i9E0{RkE*Ikq562YQ|29f! z%SZfW5ohYwq-j*!3^$;h1kD=kcuc(d^ye}nZyyd`j@#qD*X}wFRvdlZ`&zZ1sLZwA zKRy<2-@pAeG_Y>eRlPHpH(nWhH7(-!BnHDbE4`c`qKJ2IFMsgw{--|v^cR2aFaOC` zufEyA>b}j~$IbKeW5%J?cek$}zx<7#{kcE(3%~!r`Jey!|NFxOcEd~S^|~1g3yiS< z8ho_1Yc@CrQ_1Ypf-HGd;!LhnTTVufRTS#3T({5fK0A)vkACtGX@7YfNoAzEt1eHO zH$sb@>tJ3l*Ic;gUEIHU^V`4uS*X{sy1G#rp>eBNH~@@(#mL*Bm_AG#OFfKZhcil@ z-y6;|7jiA)0ejy+{QRqjZ@&A{cWxdYBJ+B=1dmq_ueY9c?e0<`mm|BLZti~Sa{2KW zUwr%a$m=tb3%0ZZ06kM!mLPdzG2~?#dc!q80Wi9n?%>B@x?a{v7gX zdK;fLUftH%5Kh7G(EuDrVymfSINN8A7BA$+h^%wAi<+Yd9*r_4%0@jLuMc{IP&4KO zL<&8}g2s0>Y?`kLXEiuXI6bI&jiG^zs)`jczaxCBT(OhU&0z5&+D5VyOGK{;z#15 zM)BIt6&+m+2eRtm5*r;{E)--8COP0-qe$x7kyLU_|4;)fLSkKOV*5t%S#8yJ3E@SO zQiJKeA($4S3GJ{u3xTXlng|{#nbtBeoj2FPU_0sEWQ+WyTl8(XBW@$K$6X@AP8>7&D;J=e^uf`h#fxAtP2ijpw2?Lt zitaf-`ZVSZ=Y$g6c*Ikd(A_2G}Pn*fI9?Md-@&S59~g*5PC(F)ZHtiOGny*5t?vJs*C1$ddwxGu*Gapy*Gp&zqQw- zGx)(QFB8H7I)F00Z3=p41%{1kPRPp-!+4H6J>G9>`Z!sf|+r6KHUX22> z_!}qn3aPrgAh*|A%?zO24Wahr)TgBxXUPtTP{_$j8oA!!8j%vMaR}k#4}SrucW*zx zy}gs7s}i_8x#cmsFF@waqVVwQ{N9~wXfS%I`8 z7W4?>mwx$w@b1gcxa#fWXE#UQ+`M)q-dY*!wxyelYdpMv`u;EezW?E0{PX{E?YAo) z)K#fC*saCz-QXOXZaK5hFr?otob3DXv8q02xHJ9TP-#jnXEPuluWx_uXa9kZKKgw> z{Ox~#*9Ot5%$t(3D>9CC^L%+P^v${_^{hw6tGA#3$92WQ2OY&`^$rn{vV-TZW8H_W z4p7(wS$Sn~NJvMdw8l z*y!F(-aI{i{{Gz;_YVizHrbqaZ+C-Np zb!miV_PoL45zVk+UM}h^JD>-g6S^9P04&J|xkVoRMI4pL!QZ1O+UvZNsAobZ2BkK+gT8k^U>g=!*%P zp)WX)IR_-b`1wcv6mVNrw0vQlIaOq6T3HApayA|(f4i^49AK_6oZJI=M`m<)EcWgV ztOz3N%%*f<+I$Zx6Ub_2hQ{IHGmf#GyaJ_N19QWS7{L34mAxzBvLG)V?x?bfJU|?g zmE*e@+#i7C=-OC`6Pr5$W}U4N&U+$j`W8{uqa*f{X87JZr=b!Y2MI*ZF69#|aIPty zB!eokHPBjnup+`%T3W`fFbm)T&*7$4ZbSscasU!N!gkV8gx!i2l)-#LQfZr1plh$3 zQOcZCU7es+-LrxO$*!{Ohk@vGWKSoMTPJ7Y&KavTECtE<3nDl{J(JhRk{kjE#7ZBD zy2*&Oy82pISB$NM6M6ilvw;*$Jq6IIXe9GQ4(5qhmw$gvSd7%J^2ps+Nofoatm|&a zwlTZP1NGwUI#zRZ*&7r=UdyJFY5fJDlDdHKvl6ikedf6QaRL=0bIkbjFWbJM*knfW%Nqv~$tn592U*bYZw}a>5=aeB0Z&yx7jsYnJi+ z6ccE7Z#fvEyA_A)uN!gW)#5z2f>p|JiKWn8)8uNhrMnqT#-LM-AZm_ZtItzDItJPF zZK_F1hHvMXbBEEYfeH-U31F)X;7S_ zgVfX0dsTI;Bl7w3h}PrdyW3aay4Dx(-u?FNit6h~)8TwA)A?ZF+HKDbTz6VhIK5zQ zM@tL`AC#czE?`)kgH~&8zqCzPenl$GVHqWtUo! zaU839-{cX+wQ|?z31r+{@{;!GQ6d-YlJrU0?5SyavAiRK8Sg)Td%N!6eE9Qk-~ZtC ztBLkn z-3URZr#jjg6FHry6sjX)lBUh`o#9h8ViO+E&tI|d3%}5tNTUF-NT`E7w$O)!6KsgzR zts2Jd`K#Xe@YBDsuNQUS+}s{=lBI@vcXbIwjwF2U`I$4vf3Cr`%pniT<_l;D56cZWy)=F_jAqbu zHhPrb5O()0!Ng)tnM0Fe!F(m=B|UFDDoo4UOW+}GZmE)lElk0I$q)aanq*U)|GY=zwKB+U@-<&QcjUJQR=h8Ro_4i0wqbds5mZPj z4mpwSh%`;*Y&t)BXkt?z#z7&gv`^woXNI6Xm`)oVyLUo80m3{U0cnPYvFtyF#)kSienK7a;(8RA7OCXbGi^`Bd$W{w5LhokSoSwrpHlr4HxZ! z4ee>DrOY^m0YkZaob_MKA=o(ou6o=i360UlRR+zbL;BVJw$DEe<8}9XQD(AyzYH(n zx5m_~QC-z;u8eeH4f?uGG2m226W(Nori?~pdeN`$fE(0ffrbIRH35!p6fA)2Du4rL zM6x}{g;f$}(^f(V&}F=X_>)YRgfH*OX3mfbWwuOwR%E7Cl0^7BZHOI%K1EBrhOmi< z=vnkQ(Ql_har9^=iT3CKv_MP0Oq^UPz-`nu%isYe2W;lLNHFOjv zuWj;0hpVt+m^=|KPije?T)vM&O0DY72!gen>5@8h%rY*J;J#kx$FU-2@E!$Ey4al{ zaK9D%e42OlA{BAno86Izy64lUff$iY;E1(H$~+5FNnW?RF=4%o>GDnc%tX2*|thH8A5R zPiu}gAKP}NAbon;Bw>&~Q!OC7@&57GiTh0^YG0rB6fw07-eOV($Puna+h+S_+}!HA3I{_6pk zQQM&e$Vs1s%F;s|xA(`&Bafou<~BPbDaMg~=?bha?S0*Gy}42M<>~Q9B`4vDaYOF5 z4QE--c*?iu4v82M4Fs*@Xgq)TjlcQ!?&HsY_^W+=pLyS`Brdf(N{`*_U`8-=U7kLR zSikUl|M;Kz_y2{erV||~R5UgiZt(M8XUavG10`M{NqFv!n1Fp}vDnTX>}zz00bC>Q z9-n^n!AC#w&7b{;p5OhZYG1FNN8a2VwF2FH?=1n(M?9?Kkg$&Hs}Fzv{TJW+?DPNp z?(Sa2stuntgJb!$Gtlp+-mnF8Ts_{Ky2)JWx5d1EOQnmI8#j48JwL65Z+z=-0iSMf z?&AQoFV~&I?cE(afXn-LUu_}CgSXN(iKn-}4ghhW%2}Y@tFU=?bc34Ka3@GINgqX} z7Xr;;lR?#(2db>w0T~E&H@Xp-RxBhv0Cq_lEp8xmb^-y&VWs+%r_dCH6MNQ)#0`6F zj~h#HO_am#a;m}YgU8oS))_@79(j%miRw{^Pk*7$4g=g0!m|93Bz4SU_H`N_KyPmt zZJ``-+!Iy|qYa+O(SG2dh%<|XFGf%e{5)e!yHji|zOp=FUh`^@r3q0j=cB@SIpoM> zIjvK5DblNh4~NNpb<&x?GGRRPnk9%vxXcP1D+wo`Myn(lwQ|u%)zukwk+MX`47j>O zA=;DHLDo1NhOQvZh4+AjGmoQd?tFm`w>bF%i&fg!i#w4>n@rC%5r-|!Hv}5I_PrBl z50u}2^~$hCy>~g@Z&rl7FGhl z3o%?eXQ<)a^s+!1#+dJa`QrR%y<~iQ8CYt#zsl3Q>yK(W zclw+OHE>)~jpAe7Z%fDYT^Y9chmX1KnG4zS^6_?A6*Fir=77);bTsRfGs!QElQ;9N^ zYYg0A$w)~plrnSHwFcL~5t@X7j>r&m&dFeSFo17Fy2(qD&jq*n0m+Q{_qhB|Sx`Ir zXtd9Lt{AM{uJswg7@R9OVswq<2n-nO<|Z@X?ggm2WH=*p89BDJ;-qr@KsMA}dsnFi zi%CGb4T%l&t?qR92$C>H?MikiGFF}#b32mQtHeAi)}5~m|K$l7^-jR4Pfoqo8Cqk9 zL$2KNIj=^j(P!_K{rh0sj$v$MNW8(vy$|rzlhKZuFy&`ik;LgU0cflYmIl_Db5hmr zx`Ba0GxDH4;sXE(yS9}{AS7JN5ucQ6C01spcw$ci&oplPyfRkiiQz%0$r>t6zJb5r zb}11^2699yfV#U{G2e>knV7tSYJ$gF*5O1jGach(wr4r*##ksK8JQM(v%0R^VVQ8G zF~cf}u1l%fiz7w^pmEuZnXFsvYNJM?v}LS%#-rhGf$N7UEd;W<;pYv3=&l6 zOf24BFK??hcHgYLf4Dnt?*egiclYYm>%05A`-i&^Kl$X<-J6X2b-eDmzn>xQy6TkI z_&XD@Vnyaq0Z><|tF(7r{V1;km;Kz=>+|*bvY%R2yYKHF?r-jI?(S9`m#62*b*<}{ zZ@>8J^KbwBFaP(C#P!`5AmMhZC^9Y7GJs`;!F8 zu!6i?@i+c0|Kqz?pVZTr!B<fz@8;o%LC6$##c|2u#7^g4@ciAMx{ ze1b$EgGRGjvVqHvaldOxFeCkTYnTC3(KDiJGytO>DV=veyvnC#Xr+=x&@Fo(?Tj6* zkaGgtr1v`VG;H+wFSpHm!2t6dp*l0dDK@m7)oc1-f^9L+{3LmXUpB~GnGxX_@c|pH zRCi~tf7{^z2R9bv(310-P`q2C(l#ntfb&V*@UYAq)1j8pM1m~IGUkE_c%cW8DB?GdB4`HAs6aMsK#x6Kr!^w#LD~wsY z!GrHzL2quU)GBW&ndmWR?v6C~Rp41*} zgZI~qIRMTn#cYp{jyyvY$6ft(4#_O)rjgDY8JwpPK_J(xAEH+K1@yd-biqWBUZrO@ z=xL+$i>x6F_q?r+gLNKIL$SHhE(!^QfF}abYIC+==HWD11hhvn;m4Z-(}r4+$ehrs zo}f&k+1ikxv<}Qml=U$a`(3gkCNpPh2i04acq1?g$~@Ke8XGInHpQZMxj{`7&-2D8 zEt6+r?Gz(PyCM@w_a~}Luvu*ABFn!m1Mxx;&b@=3z#MwF^Yosb@XxTz z=RMRgZ_pC}V1=NUPt17Q&g3(ikXw!s91ZKxeU>+Nk=T8{;JMN_Q#=t=4YDlWO?92PhC*S({ zyZfK|?zjKUUGC#<>6v?9p5DJ_M)%HGcXv08sNQ|W{r$%e53hgp{r?DJ=YjpCesV0V zKMgwqLok~ z1rp)wuQ`PVS}QvkO^wp0)uPuDI24SSOS?&`Bwf9G2e1v8oxUP(Ol&YudY?X(G>XWA z@7Q1%zEx?087OhV!85kJafCExPOR9pw|%B2>*7cWndeRFuIm9b&W&fD%8no!im+zI z=cn+3ii95kQ_f~5F_Z6%7A-Y85l!zQIW`U}IjzEV8~B8uN>Jo+9>{$HE?(y>JO!Zh z+~fJiv`_h6J&J4>MHsi)O=WD*k2Za)9XISybF(U7{%1#rd&TBmIi-Z;EY zzTwovc+O+6OC1#x>O=qt9yc?!n`E}qG9DA6O62VwJvLDcmc6UTkjOiSxI!YLSN zAuT(cie$I>&{8`AP>XrSOidn7AQbLC1xf9S2=62@O&JxDBlR=)gb`ekIO~j|J^o%9 zluw@6qrY*>*Czc*>X~I7?_YhU)_ZnN*zpNv1Z1z5CC0JVxN?16t>bXUg!|*yTyp0o zGe$|#9nXq+Ts+%lnwE$TrgP|x?s#CAzY8%|#BfB+!ghHN=SDj3p7RhHbV;(gD8j~R zr%ug*hDm^(bto7{{h0y1{B=#PhFH_A?oQ{&RU1g&auZyTqpnot$i z5$poGY&@PMSKDmMXRaJXK}@)`7-QK`NXY2wvch>KXK+8;fd+jN;N0-?yOt|QsaPi} zMSpsJSTU$Z?UF*^TD~2S^74tjF*D%AfgX|L}k9Uw-$++aLbmKRb?Z+}zw1 zs&;GdSQF{}6QBOQfALrUh2QzXcRu>~CmPQnA$K0}+yoJ)Z&IgsIhX>wDk5YOa8xP@cyeGS6{oLoAvZ)HQ{j^f$Zz` zxOx5X>dp1}ndtl5H`o34^8U+T{5}8Vx4-j0zptHf00k~vy_Jy;J%k(bm}$O;5lIaL zWznW1M2vP?5JE&Eq^)&xxxRf8{;U7s|3$dDeD&K*TzB2v#lEx}>rho&jk^2smalGa zKIr|H58u4*ufF{of8zeQxn57~Q4K`&ByMI57Skvv(fQ=GUSMY8;pw|simAGE;T-V#Yd-L%}*UNsqJatuo>c@j`9v^@BqaXbjcgGD? zSc`i>Ww4Zk;7g;(cL+tiRBxxdieRajx#oxr0o9vK)#kwA=xagj=!lGsf>;U;sDunl zpbOS3z7RK_OhJWzOZkRI1I!p5x^EtgdP*@u#DK${!;ooBGH3S)Z*Xd@+k^{(}flP?B8pTXTt&yQY+3G5y$ zN~65;lZj~5P&)Qbsd}RUa*@qOTS3(WI+`5vuiPMQw(ODQLVNoI*H}OtkP?jI2uoZU z2b+k>4zg28=f+82!DC8ny;S8?w>Q_Y_Qr|$V_U&VeNU`g*d&aTr#nAB$~dQu1^#nj zJt{OBgFy%9!3c{|Vobsqp>Ut|0hU7uO3QNu2M~3SV;ZvN zM#Lz2JOgRsIJ|^&5~#xdezoTJv13gla7GKtIvRqG>i4y~A^u7cW!APpoo(Df^QoAKi zVrIhIJ}_9T%K+p2`2cqB>gry>POUte{gP`;7=0J$;IM7Rb`P&G_Ax}T zoZV8eS-^;n&1j>vwS2y7Feo}9ntXBU>U^ivt=tPCbjtuF$|5P(RnigFGRH;J!h#Sg##>h(`3qW7g+N9MyPKY0Y7 zo}V7yy#q6_OHW_E`|i*FzW?rrfA0VA)#tzc(I-FCbyYOB>7DQ$=Sdk zQSJ=od7{bmm|B56Kz#n?7ysoy@Zb4ezwqDqt>5~0s+2eDCJvI!diCl}L!r2TxPN|p zLL8U6^z~WlpZ@fhe(N{>KhMwa-+c3%(Dt}SnWwd8q?$g?7>HN|h$<^J&Pt$p)E!zW zv9)2!%(VtizS>hU;7=3 z3=6%7e&$Q>F?)M9AIx^3tteI~*luPf!|BP6qQ-!)q76%iG2IU1GE*|Z?10_0GgWrW zoMR4as}?60#hYM|F0Y3hQkj!6?B75@)eaNqFI?hjw6qw|*H~tpaIptP!wyao<8rMe z{Y=U_wB8_@u_mGYl&r+CwCR&@Yy`to+7WdshsHwfB^*H74r2x8L$LdAA#5=Ut98c^(Pgc)}SOz9F3^HmE8$9M`^%Ikt#x2r0 zD?Gs%91Jr(wnxN1fBrs^B3P0cT_qwmNt50&a#dSnx}3K0qDwtF z?Cy({r^3Y~+Z=Q73y{F1Tw$(lzuOKw3HUw^j{x(e!V8XF{7l>ruAfi&^&CGa=ttf1w@94clP>=S&X@GE;lV1@wLL%6w2?<3 zd$Q`}#8}#Dd7M@EgpOFN;|LrGz*=h_3eSIC*D)U>k0fXvQ4b+;z|YNjB+>T!lsnfEt9e?E)G z`pm?sP^e}&H!B7!z8)EgE=_|2Budk4XYbUkMS8EM`$!9K0+9O)*V45|_sC^fo;$Y@la zO}mj+H&SL07+^Tf!dhRKMry0Va??PTwN=NFz`*;q&bNnn)#RF^yDcX3vnc=b=KDI_ z4HS*$9Px-X7>6JC;bG3h(WvApRvXaX`|MoKQ0>YUFUNd2@IFt=Av@t{?vB&;L9B)_*&?Uw!z~*Q!zgb;6VZ zq9+s>6eAaa#H4Clo#oL6RIURM5Sn3@^8#2ZbNr%H;#ovk2j)n2rcF?bbSf><*}U z-`#)s)t5i|;zxh^!;k)^Yh5pwue$cSxvvs>M?PQbT9M};x)wU^vM}a>HPi= zzWvQ_{`BAZhyFLe^P|7eb;;xA=I&MR>+|EIMO5p!sjlb8cbEN~E7!WK{#^M%UGvZV zNB=Aqs9T^W6hX~kS%DfkyfzWZ(FQxA-gelW==3u-CiNm~9SpJ8x_SKShdA)fpZAAburi7-Ktv8Xy*O>t8aeyJO3{Nh!q5iy94xt ztIz|_8U%r9M{BGolp{_340^yDe7f7!S*J#EHVbDx+P^$p0fh9;#Pe7ox<*=l;_Pk3 zEKSs9*aJy1=wxGq@+0_p8Q|te(4>`^g6LflbhbZE%D{zLk?@fH*ZFrX{TPzj?=;V* zO%p{BI{+(9XMjhw1q?iQpN7d*Zy*ucyJfKs4rDfSz!vPQh4@&M7!iu7bG*&V9kb0{fS>cml3OrsG*h9mWS zG(u!%)FhrmWJY!msJ^ZK#OdYmkfuIg3scHQpm09DeO0rYbS&X?S`6&s+s5O>i0#d~ z_^vNi2h+OTR=c@KBE>Nh)6HQ3vMmsr|LJ+20c7J zaNEKxR6PvxB-^1YGlJaJm@Cy})zrC|#geoA=0Y7QnTUy>aiWsuv9;Ou{P%t1msiT& z#h`Zq!9D4IvCfauF*-xX&ygVYmeONSg0{iR{pddYC7NJSTi#}EA_84Q2(HMIT}4TCpchZ46RgAA9j2ViRlBW?0+S?mN5ImNV;zu4gP zFp!*lxfx!Z$LUqKJ&Rdeq)Ni7nr^|-h@-%yS{9#y%C&;IYtQpt)HeUZ>zuJNS$?39dVX=!J|ITLYtF>Cu1GAUP#kW(pk#%G$v9G)PdUN}*j(mLoewS{KB|_D^_NSlx z!k3@_+VA}E&pq6|k#?}jRc8N%P(VAFSg}L^<@-3(KHuTuGz^%RhZ-4*GwFvSWv<7r zPrvcgAAb0|zx(Y!egFE?y7t{|Rvp);x3}vRgYO^TAEILKjjl>uA6|d-{qO$Us^{N-62wPahj?sWI>@2-nZbaS0oZDyJ%Di!8!P}1cSmOI;HW!7UjA9CXDN<|^o1l^aS zp%oEK)yCxOlF;6JcnvU_?h#Zq+<;^D-QO3^D;8n?F5xA%0c5O}Bc|MYg!4F$a9ouy z6v3miPtW1F&>5?%%UWftN8t0fxgv@^mVzOnBM~cg<|G9d97dOhE&{Cy5|L^Yt{zMy z7a8oTW*G-i0bz5V4|+{T;e>k+pan%lf|N^M0#(i!8E}|-k;l*}Moy2~D^O>~MT%#3 zU^zjbV2janMDm0~PEoH9nz_Jayo#!8Mt zK7px$UBRM~*`|$#p-XjRU5|y|`t^VH5B}Z%(}&v+-##nQbU!H6C z&F$)leYswrew6pOcdvfx&;F_ZNnLRF;eGAh5mJrO%+Mo<@v*pf%qGQwA>srfnK4&3 zb;Rnfm+{D^Rh8 z{ONVm!XPwN68Fkz(z=|?KtnB6<5 zgnZ(K4{0a28`&Wwe?soFqCD;!4YhT`cc^jbrc|Ao>UPs5gSB@7d15ZU_L}J4BhK`p zEr{;x>GtfN!7>w}QU?(P8r>Bf-;uK&&(HiMGgO1pKtuKqBP$3TPE!r6m_7z$eQ({n}RqOiUq-(@7VW@6Lp=3+%5L$h2bb7%;CeVuYaYE8aZI9pj&t6HGV z`2NMia)nbTMndXxVT4rVXg+#YyM-AD(yH0k7C2O+K%a0xlH)n*VJHd7HH$oXd4fbZ z!~~seva;D(AZ?Z#4tfp7^a3<>8r>gfd&Dn7K7!n8rS-M)g|RUq_iya-0s6 zWi>WV50LeLAgu%$O@`x4POS|Y%oJI55}Ot{Vg7=X_t6WkRafRj+<21b zDQk^jXp)T07CPP=z_6Vl5~wh?#fV&C-b6zuE#Ippqzn#?+TLGM4&2W6J1<2K-^vqR z@POi*9+>)}Hl+fw42lngfKf0HiENM}=kW5EQy^AEQ@db_(I_Q*M%0Yxfi65`n;|$2 z(&QKmV$c!47p+ZeZ>uOOZeD%#bGO&MFJD~i>FMzY$hCO$`jZcWH`Q0sZ3>4?Yy^Cl zWUjd{B2lkk#I%tQCNkmifGnVV*~Jfq_GO%AUxG3oeUHD=iH*KVQBAbgcX8 z=cjjDZSy5=?(VO3+57tVC`x%8m&>E}_5R_T5_TiOip7w6k52gn$0(7oaLLbOM#w2g zz21EA(dR$mBYs46H9MU)>xJ_xBH~jf}orcdx2v)$y*s zpKrhSNB{Vr{5Srkzv~B|eeat;@w2-ZDWurh(V-ODq$SBXZhGSO8iUjt{n#t+h_(Ci zhoAl6r$7C#=0>cVb>G87rPZWQarwSWDC*B_L^lAcU!L(bOK^k&af954p%0y12z0c4+|bqtm5cdc8Xc4y*x zd3#0w>@WR8Uw!tQ*Ima=uDjR4y6ny1-WAE4ysdS!FPF^QMcqGq`qhtr^~XQ_!K>T5 zs*4L`MXX$sLgb=kDjt(a=A^D5#obdUsS|xQ{S6;UBlri-(Z>(6M;Q*BVUFE#`JIsl zg_u*$X63P`RR^GIki$~bxe;Y&C&%|?A6~flRgheM;)TkP2u8lp6dRPMhOdV`3|t-U zH%_~*hTcsPH=27e)rhXLUZ4G_*D1c}AM& zp_v)2l|8~+Z)Ip~(<@_IXh>7hV_>d(n1tT#j8%t`FfzEXw{4y3U{xD9_3Yr=NthHR zn)q=#j^!?n0P6Ha4kc4_fGYCfu)p&8%xsfqCzqpiU8DAQ^e#gJ`M-}P*nn|J0L_>Z@F)G^eKe-D2_nmTvN}UlG={7hEzRyKQl>K z;YmP6bX%qn3?_}Orp0_+AnR&y(9%ZIw)K(Cl)-MPhE6iLI{MWlf{p4b%Y}W$CA>aW z*9%<{WI2`6LT|^N_K4lQ;4J#*9JONkKhP7A)#|P`)Jt$h9Jz+)lSDi8x~DwJqdCvj zkt-I>ae~WVTO0fIh$}QQ!b$L)(UJ3jf{|Q!KhXMD0%;z_YN=I_3|*`MJNn~ zL}unVYO3agjkzFVd8Q5wjoK5NL9Wcq z4F9|S83h0l%wy5LaNbIdD}}SAtSE5;0|tNK$vdNi5i5peGs|RWYWEAGL`;X4FZ>?m zgO8hOHzQz!x=(#lY({W}^DtO6M@Wf=0}XhsG#uERPy-`pHh5HZRh>@S*)e!p|J zwfbaFltD~p0LMe+r8hY?sjeaVW1W=9z&*WHRi{XDkmjo0<43m-*h_~rO5NFty;T@E zm%v7Mo6Mfc z7|Mk{J{Xx1>%4+a{@$i}-_}98q$81LuQQHVD_E!tak;ts@Xd$cdiDC}-rRk9fA=A< zn%Bta${;hGuD&K>Vvtu(#WbC=8eLVjPa_c^>}z#Zs3C!6ZY0jc1IN@f3}m(;D~&Xu zq49GMR*Kq1UEjaDdoTmA@_2Z-JC0*lU7w!o`Fg$R{rmS)cU_*JpPsH?y?OJqNj9F_ zE0+tLF?^h=yLQR1ks^_~a{1THBNo}~=9N@`avcz=j-))eXfnm zf23MJ`s_bBj*tJ5f9y}ZzJL9LAAY-ep_YdB<&m*6%Rofq zvM+tzrR%6&v{eN~#A`r5{`@;X{NWFN@fZH^KlG3O2jr_Ce*aI$x_!JpLf0;d>-N?C z{i|2WV`bdl->%~pjD6Yr`mB0<_3+JaeB&4Y(qH`F)f4Vsz3G}7Q4x+w$Ox`T0HYDK z{LMvE%&;}a8V72tOC?ox)mC*kZQ*JZ*4^X#&p-O$6AOG-s{~@7u^SZ^xbl?c6DtZ@^=_e97pfj1qH$4Op{-OP<`P4Tm z-ouHLkt+|5cQpnwAW*3C-mR4jGp|n9q+$6W(^Vjx77iB$_yW6J_5k1vv^SIuzrL7e zqD+$GrWm9E<{o0u7+A{UL3yqM%V~B!U-uQ78UgRw$@DDO7*N{M8%@vAko(h^3RgPU zF1L(y27}I<8m>|pldk#dwi3n1qBktZ8u@DU*+d3hFc6$35WPqi3=B-V)llU#dX6SE z^ArTZ&y>*%-w~Gl4n@sq$}?^^%8jp9X?1PYE|pQcn$V(U<&~w(ftAb6MNXf<1c2}q zpZM1bwRV+WhVM9s6cCEm#NeH^Fi@%Xb?<7hHNwI;GPpP+G69XetI(=amjg#NSevcC zFE=wS_h}~u`TtF6Nzz(R&QYOJpNp6pw3$mmsCG-;C#p6izqcP@)R`x02Q$^Qfj)=` z=3437%D^#z-dlqcc&6o`vy4I4W1OpNWn|8H@BhzL8-l7zXDa2(y$Do$m5`UqxuDN~ z*H4}SVs)##s=6DIk>QRFJC}AfrAz|VDBBb<{}r~*BcfYX)7ax055JQ=Nb1DD^q3f6 ztcV6@Acn%yeOX*KZc{4@OyLEwIBAf<2(fJS7{a^JA&xGmNx*Sl4960(iFCY?4O_t$ z5*ceYHqe}c-^mwb*C$>>9QToD__4T8PHe34CObPUoVx8}Z3?y+sGgvYG;!uUiy6WI zM)xK|wE2czwPvBj7)SuSyk}z#1XNH)_PJEiQJ0g;H(MihJ42Suo`xu*b@ z@(3t(2xKT*MWV%#$Gp4~YKU>O)@c!r2o9~=j0qO-LIO*^2LGf-QI@_pd;1iO+*N# zk|LAN!&a*uJwF6OCSI^?B5a%i2C?A)`~FFtj~Z32>8NhFxLMMu;SKuq=!i#E>(C@hJxa=dukya(fGRE*HSBH$_ z<;5-9+4c3!j@+N$A%e@DF-9J)d3H;y7Fjb>n>?hB==%ks!U_~J;g%W9$Xxd4w?6l) zf9DgAfA-#UU-RVAFS2eueCO5LpWnW9D>5EGdO-K{^NZX2+lRy9;{1hWw~wkPkFFlw z|H-Fb__p8u$A0X`{@x${{7XN7dA_@S@d7O(*X#Ahxv(<{SO}U8jsmj6?E*&5CyyS! zesh?&Z=HSHcm7Ae_SgTLZ@u<~t0%v>jJv4CEzOs89_46V=izvL&9R)FnHhIy7cxWt25N&|FF=KXRZi z?RJSnx(%qUyhR`!V;E&uBLsd4Fjo46fFG$&+`Pvub##GQrudD9c*KWU z!W!-bOW%jtKvpukXjjZfMs1(F)S9Loe-M>=KDDc*X^aMpoD~9hwPQ(wQ(3*c_8%^9 zNs(rQIYU>wXmqpFUDlkqDuRpN?gkWT?&8QIQgSLlVld-oknS8Vjn_2NB+)4mY_@^% z8R-K>`ENHj1`w^vX~Kju|Y(Rzqb z2LHRcw3}|R|7$4d8xYo}Ra;w-MnHFL>5^tMVgPjYw|oN0f(!<^y`|L>o-SC;{wT@~ z=7vD1pJ|lI^=Wc`U<%b>RWh{1 zA#*}MAK3n{tTLpzNAwbZj1~$W1q8u~XfVMQ{no>B-Nd&MA7N}{BY&)}Un1}e>mO7v!(*$YJTCj+sB4xeZ z_mypCt3nG_M1w|@f{$rsw)rvSmy%tKI@WY7Wt0sP90qQ>m0qfJUUITRccl$-!iqG=m1jNK4j3?&9>Y|d&THle8| zn$6I;MlwZk6=8*%33*7M>Dfwd$8D%U6%5tP+h!6otpXtE)o(}>_mZNJL}eJf3_zJ@ z1O$spifswFm}DSG5Z=3_^;4ZKg<$nL5lvv^CIB)i?|KJx0$X~cru@t@*F%f@Z+<@G zFqXYi1ZK>bb#pkn+1c6U&CLN8#Lmxl^X3ri;bMP}em3Lr;5|l)?9#Z zv)jxfZ*C56Jbva*0=noKlyc^_}`?Rzw)IYkK@(F{ykxdOazC~ce}%(j>px_ z&(6+{k&mw)Ek2T1Y*Z~5m(T3>m;dDZ{>@{=-P`vfR;{U3(|pJiq$j*d$*5z^s@VC! zZn!V&&12g?oALO|FaNNQAt=7e*6*o(i_;wydm2ChMY-a*w8dzDW9yNvUgtb-+BcU zt`tR-w4%y4k+z;yZQI)HzXhm@9%bf|Kqs_RqzpC6Nz_^0$F?p=dY{vk6;XupC}aT5 zQ?NFW#j?T924wS>NeOdM3MF&zV8Km)-a!DsjC8Z^HAF8aQd<>m6P0NOhq(DZm$KFH z8JgIP3mf+=(iKF-4&H7tPY+O$<-oQpnVZSsT`cqF=>;Qnb_o+G-*8_x@|ppol{r(I zliVP;+Q4EkGA%pZHL7e7u+$HqRYrHuD0cT{8ZAPBkiywZsm~gxqyw?iXt^0N^(3~C zRO2o-&onS|*(wTzb4X7r z{9ke!>H5n;XDE`ncD<+q^N1GONEs#ykbQ_)pMVS$GJ>WQ8lWjhIf<<4iJUUxM2CPj zuL(>m*NvCCrLbG-7KE@#(X7fYnng1VYwKOstko6rkgQ5WfnH3}ucy6~5|$TOR$dX| zLovVFLcEuj(vfK;9lBW$uT?~4hA*xmUnXO^b76(PKzT`J2QL+$=mJO=@6y1sp__?Q zs=@79s9roP(X#B)LkB`dQN@{?5KG9%2K$H`6`P8O0!tR(0#?QwCtI^2)Qu4bqK;cZS!+eZi(&0t<2tF^d?aD;c$g?XgTe> zs|s*uB#?@YpeiORlSLb~INo{d^Et29SO<%=X{F`^V+9|kBOTq1I%1^B&$Tjr!WWa+U8c8vdR`XZn6B?=kC4q`5%7$&Hw)1z2E%$ zEC0m#w3}tt{`_KZ7uQc7Wz?L)@R&!7AC-|`nf^s)cx z&;Rhh``OR_w{JZ8@>sCn@7)%22M6Xca*d36jHqs-ynX8#vs&jhCXSI6A&7n~3nC_R9;f-T8|OC0_2J<$_`=g)^DCeEFJAfbC-2?4 zJ7-m5@qHjlA`Pc@GDHB~O(ct5ZFr7(2b-y>fJRA3`UR=%osJk>-nn`G?o%&50AE0$ zzyJKluAaQU>@U}eWoNWl=M0t)Qz-iR*{uQ|Uq3z`9(?%4Z@mA`FFttm=QL{mU9X38GKuCs(2Bjl(aePI;D^J{i)b3l`}ux8>B z>b7jpqqMDQgqrS8@=uym?d=3g-TIgzN=~2QV@d zYVJfith|R=VoNjEl?}s*b4ezqh9hCCSsf~*iyRu{x&1RX92S}K18DO?b0cB!lxe$_ zEV7;}(@?mjWYv9DD^QL}Y*TKQD#kP*NxKq=UWM3OhG6<4VOl)(M@Ros-SGoBumVoR z49%sj2B1qugN&YPNunIoS=lSvhLg%gp@hwnxM>(qHR}3oI}soHzne2*6cAH2K>*&5 zUNc1@T$QJ58e0?uKw!|ySQ00vc$eW0Lq$eZA>am@R|3Pma+Rk%js4cpJadYX(jh^1 z^K6f$Y#UU1eMwKc%CE3;KSEHzH!%$@gWM;)obIT&EsZ%K} zdK^K4#*C~=H|Nl}r2f?O;j%SWiM1%24O=K5K*Qg9Mq(CWY35qewI=`tl-VGyqi{4! zZF7UQtjs{fI=6886Ll3bYC92gN;wjh9OdwJokWMO)Rq{)Hm{#(5me&_Y3`^k%e+7{ znOqDOna86%j=dcN$Y532Ak}f=Mr~aJ+okXxgjvo2%xIw!Y#F~L&4{SR^-$tSbC!S@ zbD1I4%C47A(8w?(j0_U`v4yg*P=Pj9*+!peGn~4T0Hm_UWQtI5*<5352x!!&CH3Ou z@YQ5gwSQZEb{gk_5?0SZ>q zurAqCC1sv5&xBFJol;r1n{Ov$Wd$Y*aN22Pl@3J4lC9E6z;k4p8B1pX0&c@RftW$3 z!*esc163?-Z&_+*YHr8ru1Zl^RjFbFGjU8&iJBXG%@iM; zlAcb>;ciu`c#=i8wsAly2@-!{i$xSXQAnD1{4!gDD`tlM(REp3!ko#ut{4klQ+u+6 zD9NT~8b?wkqg2MW$i9#$&DwA#|9fwh$vX93suH^;Q0h6}mUdnJ#y+3TNAtMS(kL|hp?f&m8ezHSva^SeU%JV|`T5;>c&lc@u;1TWhOIMa9Nd=6%Zqhg=bXFUSP!op z>%(_%eel(nKK0b*ur8oxB?HOKB)arGvWDyROn~yoPR%=W-HkgO_kZZ`{n>x{5B|(< zcklYq{kwNQ^yK>f^~1NEBP+*#i3nfz$HT$W#d+VK7PGavf!Z+Y?8eAnG){)O}Xvlsiz2lroj z{P1UqtHm7SJYv1Ny1qEOtTS-Vs!gOv=g2wd*t;1bkGZa>y!Xtnd-UMTKk<+Mm**Gz z-TBiqp3pEc#aKs5PbomBCFyK^%PEiwBq~y7aHPeOSGJ}jdYo|ct*auOlunAT85PKX7Qzfde-Q>xWpw@#-)D@4MwPJ%@Z{?(_l@ICz~ zl}3@)8nC9SxD^sZz~IubSE>&viWXBKmu5RkbtDx##j)y3t;!i?L`*Y}fT^ow+rn8S zooF+skTs3z+bq6qb%o6=giY(6vy190L$g?M&c=jHtyg*P{5+lEhf>(m?sY*wIu|ytdL&J=4pgjiA?A@ClSqC08I_TGE+r~sa_-IOt74-wTNoSH#6Vu$RVTB z^#rtQCfdlOr&huHo4`my1;JP17AumKNcixQL)8uNmb^im4ng?X`c{JhyaiC^|Ak|(zM86fp(CHD>w36n#Vwt2{mDcEi4x^^sb5?Sa<}fw! zMm4!9$r*YcfYNGdbb2Y>AI*;xQBXj2uQWBggp0k>qh;|TSah*d2qEC`i6n=+@_uy~ zOV>moDh)V^suf2UT3jUx7_6uWIb*@-i@h4pr*!XLibE;o!Ey`J2czMND3Ze+1G2XBeeXEDuF%SY^i@0UHGRU{K2CB+-R|hWd~1p@#aWS_ zGq>W~qS@@Jl-M%nHyyrI`hX8qki%%SoY3Q(G+5WZ3jAgwDh0M#N!5Uf z(%nW!wJ5yVPS{S9v_kO(+Y*M10)`JdJ3m171t}v#sDtV4&jOW;4{n(nLV6UNUdTai zoKjOC8iT5rJ=8YQ>q8^jL`NEjCLXW~8AZ&}6OskPu#pi>eXAh|bY~FD?&8UlCy(EL z>K`9Fa65*y?OuhixXI4OtT?$ z<8Zt(jNP(dqsUCwZaE(#A75SV_wn%l%a8H$?)EcZ_4R-1>%QsF*81ep&0Dcv2Wsq> zv)yg?%VpSc#?8Z5Zr=H&N9&WDn^=}xWB07HuGj1Jc8kh;-Rf)IHg zs=nfa)$dsDNVu!a@dR~bQq4p#A~y9bf`vKhg2K1+x%Aki(fitu5G7X#9~$&cQhBkr zqDM7mXRG}rYqcg(TQ37d+87d(_sgX-P^*X`W0sUR=47QN_@cW|Nmqs{Bom=kbZQ@T zY`0}EoCBt;A9EmBi71VRjU3A-*~T|0QAq%UCedx-GG-R(LnEF}^#(%S%&Zjt($Rd0 z1S(0Zj^L=CHnOSElERq^hL6u1e6ay8L*^6;Pq{E)w)l__-J@=GfbRQs)7#jHd*wg*M1b6={0 z0x0sRpDC+Nm7>!%2Bh6KTdZV}BlW#?+;v6^J^*tdYNAPWfPjL6byU+DO)i1ORZ3sc zDOIe@qzl)n{{5XOEc9el9%J3xF42la&_jW>)nU)p!DmIXqB7E*T@b1F%gU4L+Eqjk zsLJ8~k!3{4s4-Znbvnr!SjxN&>=mpmbAq$NtAvYA(49H6En$=-FDB{q&Q;8eiXv#- zimO|b)MK^${9D#*k4(Y~wy{ZP?IbNLOa!6zUu@QtO&6PmQhuViS3u(4!pjD}i;#o~h zXf+*IX^U~PlyRrY09y8Rn5GQ9Mw3uV5dNr&$SK_pSvr+7l7j{V>GrN-zKq^}+=@y9 zwe5_k_7hYm0J+vYEt?Vs8mS;UajNW)3!V&HR!&DC-R1L6>QgmV)r_fK+`F@)b4y!C z?I(z$kC4n$8b^T`^b#-Dq_t{Ov?v5vHfS{jns$kSn{mla8>pynnb-+EusWuVV$~|3 znB*#Sxq~gk^$tdD%r9KXfD92V%QE%3cHK*+sm>$;!uYf6+2%t>^LV;iMdmazv9^owQej@NIG{oUu^_f7xo2mb9>U-`v5&puyrnpGAuVNMT$6fEmX zT;YR|1;&6>*%c5uxpm)a-W@7T%On=*TeE7=pFFtv>W}}9yU%>pn_v179~T_8&SM-S zA`@xM-R>N;>#Ii@lfJK+w{E}pjhBDn^*26y>*97|Mx@iCQ(0tCX%4BM-zXqsrqEhd zb4gax_72jM!7h)GDIWT#(K|CgxbY6*-n zvdOdtpS?L#($b4!IjYKaE|LaQDt9&bHu_}M86{5F-O^^QfXO1-;06u3CH?DnL<((? zc3QXa7M@h>c`k(Eoxo=CyLB2CHOD9D$eA>okzkq0S1YljCUE_$%61o_x_Nb3S{xeG z?Ntet+!&V{-7wOUiprvLu(L?ST(|!kG#lyxYam0p<7Q$iN}#3mX3)Q=w9CHBG-70B z%`zRxvU1R~pqO-7IJ^pQy3W2q>n_v2Qnc4JrrT3brkQACR*66=v#f$rcVq!xbJC4+ zcdFt_?~R1t8{XX*B${oLjvnSvB2;w@q0x$*S)8F=ReMEk_p4@OwPhGtZkfq)YAP@F z8JCr%e3LzDHqm13Em7Q1M|75$CnL7NO4?=yL@9riZLny9%LxotdT)cRAS`m*WBcDt ziGGvez7(3Bk*KDZE9mL#6l9af~;2h zEzLY)igT!_HDi-_4`k9QgCxPA1||sGw$>I|A2C%4`XC$3NhV66cXBX`fYrmRFn?2? zQu_-zjIhioOp_p?WYCmCj~!ifBF{ADv>O8zGf>Vds?6LawPNQU0K)(vB`h-~m1(H} zkaML13PVl93Z+4jks-d^$+d@8$^vX_f)Sjnaz*srXwlLX%I(-KqxoRWECD<&C?q#}7AS-w z!6i_rcEP4eNZVF6A&@N+Ac{52s@jT8ZgLVtaHz~OwwsMm8Qy63&{1 z(q}5W1qPvz8xmlkB38$Mv#N3ykf1BgyAUesA92qu=W$k;mctr;e{B`s0T;a+`iV-~VPRp@jB0#liXu^DDZ9xuE7aXrGF;LULk!?0ywAz~J;Z{D!^1`un)YnhyG z%dI>2X3WFYHL}c>VS_LZJ<4^lKY#G>eq`)+=bEKbD)gFh#Lkv-9jQf%8o=U5KujXBrep+V{j$yMkdQL zQHTs?-5lP5<6~d{ryo6d^U34;yYpLl%(XiKZ5i&ni^Z4g$L}0t?svN??$6Ke-hJ_B zKlwLf&i&c#%t@I3>MT^jTc_Gitklfcfw-;RNLlY9%tuR3+t~vE<~ke*q}FC%ykHp< zK&G@cQX6MR`RLT3jF72D?-U}dYsVU}%#4N*2{j7?LW(zDw{z7u)##Z7AmY0>m0`E?M8ZM1V zSftv5K_D0c@5z%~482AGsb1eea@sIYMxiP)3l-*t8iH!kxCG&- zNzeRxB`>wsO@yv4=bqT*2NfFL zxwh59re@{^zDmwyB(ry^ETsox+&!>v3R7$WB;s?p+BZ5sv#EKR*qVK7NPfRjV`U4<>HEl~w= z@l<}D{yLHRT2NpdsxVAq3X#twHUlTpw^sB7$t0|@ zMhn|(&S~b!vO%WC`b0U@E+$b^!p+zvlx$fSdi#T=*OsR*st~zlTU1uMSw<+E?F3#W z(=im`A!%e3Saezl(5+T z9r7oZW2!B@*sf{F@r^4&erRjIVWi6XBRZ)tXOZrWm(3$Mqw<& zub$xUt@Al&=G+hZ90faGA0mRx<@~%Nt`67dyUYFVV$Q?O;ri<8YVrM@d-slqIp+cN z-L4PQ-B=EXadx%`7II zkksc?0J#-B2?3G$y|D@F)HEQe0Z6+6ouj&-L$&tmtYlN>7MTce(aWe|zb!)=i^I%I zKv!iUR3E!2FUoKL|o8l^Enk=5+YH`Bia@m3dfW2i4?Ac1S zsp*M>2yb~YbDPRp8dQ|S+`lH+OeIp!+z<&6S;NKhO01?l9hRi{ zA?O$xrb(fS+vcWEfG517Oim{jTc%tDI<%*d>@-kH(h}4;Z*svhrgUoZQz^)0AYlg}G+P990hR^fbSdBuEwm*H3OBEu z9bc(9HYINiM+k1IY5h|IIE6*)fwb%&*MKd1Tw4%9z%UAvy&!1IwBB_Az=l@_4QXR2 z+9Oj|4TX?q#_7!v^CX@{VSpquVVUIs1}X$6mk2qX06+^lg;0a?_-k0AK^5vg^3W&zsUWnE~>eHor+l@^$h$Nim&LUJd25BdCR60TU7$jnL&}$-H^$XTng_2ds7R*FwttOoV+c(Ur zVO@DjH&ojs3*Dcfb#K;mAE42+ZKI6JXhbG}F)S=wwUPpC1pLSsrQ;YaF=1~P1!lIN zPqtXMN+{(iQLMDgjLeBLh1V!$jK)$!B=V#sYu5{^3B!gWvdv-~q&7_yn))-yHqe!Q zW)&$dxYA0cF3Q=Pt%`3;$Z2h#jtxzh5lQ+oTziECJ=*s-e~+C`etkRUJ0oUfMwr>A z*OfoCh?xNy0X+$90XjHLi3Dw*I9YwD zS=vd$Jrf3|)tpnRcIGzST2(-D76ai!$ro)^(^JBxC^PiZYxOJ5A%e8b1bnfn5X~u> z!FDd1Ga`WEP+6~}nH^fYp;gRStN9)A5>g9{0_Jh{T1ld+Bij`{NZkNcsU*N$XZpZy zS>AZ#Q@*P^cVBq&@MY4L#mk7K(S|Q{BYbkkJRtqJK8%TveEbi5@ui;|F#_!aECgWP z#H+)o^qec;P;(d~6oQily>6Dt+fP0B`Op98_kZ7?`p)0;-8VOfCs!{UFNW>Y61WoM zIhL_ITZ|Iajw26igk`ydc3fvJxx0O_voSJ`yWK+D4GWO#^`R`xck5v_+HUM-MjoHU z8i&KIn!}fe44y&8%>%-w{k$NBB|-@pI!ufFlgdrvuP>?^fa@LO45wdJiksVM1}-`$aR((#CTLCtUI$wsWUVM8q|&2<$s&kmL@Iz zCQX%QUOe%Jg$ued3kfsHe#H7ZFM(^@iCx-OPziI+=rk6K1epOdhw>0*jNNYDo)1u2 zx~5%$+BM5+;mAeRp1}YIQ}$?$$Q!O@4kYO^L#aZ+4CpIk%R)Xi(9ja4q>L8g0NYWR z62GLbbZJ(Jlk^c_M!*QOA+lZB-zaN!s}6Ci24AAJ8h~V++;OA=R5sE04WN!ta{WmFOl1VXBTPVajmqjLCC>fG!RxZNf!St^Q11Sp!m zkaSvQR?cidtF(?4TMMuO?luTY529o|6owPPJEG=_Z0!{;`Jo^p9 znmHpSWN;f}Kytv+Pi<235elekRdJbBn0w0blF8~a0~6yQv;k)1Y;puA7UepPX} zi-ejP;$1;13%o)&J!0{NtMTlH(5s!F9*>QpXi21+2N4t!`H%G8DcaV+hbOVGzCS^O%&(E%xFRx;Y# zjZL|w-;t*xMyr|;IfFu3D4x+`uF-j z_zO?2Ut4ZH#|Ws|P~t8nb5v3SRdh4GpfaVpWERT1Q3mG2Z{5E8nVK!KwH4n$&*q@!P$HRlSzI1W>=?{GHw}18*zvqYk z!Jj$1?dNx2jN`#L4f6CP6_Tu5BpU~BAjZd(4MhN=_jASJ3b-C*00_ddz*;szUy!i< zTW@~p-m@=!^s9dVo3H*Xi#Gh~>cPeNZ6|FxV_vVvgYS3e=eIBq$5;bF*xh>{_>uqa zKd!_WXA!W?6{9`8)}WbLs#@uUqBkECi7Kbls&ox%gmKW4hL{@X zI>+2N;)GRc{)e81+VX;xuvvAI{Ix1Z*L1%@sMIFV-=sby8E-)}=uo7}7(=&7cc;-5 zSwaHr-W3qe0V1<(Liy&Pq+6OxI_RQ-A7F6wcPV_KZ#+r3MQ`h52H%yL6a_4n%ynwO zaW}@Mg;pt)B6Bo`5{iB^cW-=s! zz478+vf06@tTymt8{BlDqP&{65|b?S+Jq`}4HOFcOQGf?xrtqUW1<+0EJ{ML?I*y@ zWDB)gIF~SbWaO#5lV2&W5G)&kQ;L(=cOkQlqp2QS5+{Qd9SCp#OtrZP78&dtt}@ci zD+M}|t>&o$1`-^qMhn1%w4yz_C$tO_mZ7R=&pv=QjTM?N(!oGlxap_AiuM68(lE&HX{9h6{KZH9zkvaqYOP0(ic zx}y)O$CA>5upt#%M7LtYq78G!s?uaAmMlSxHT#7~>BJIS?!227Qq~$h zAB($i#>hFNhEc6mCSkmD>(t)vT}kD%av7o6CbnT6t>%(USTZ9?(uVlX?0XudEw;J- zz|Q@515g?C1)+(*#z6kL$@> zzw*p`zv0;ze(l?@{L=Yt&O%OY>uDt2NksN;6B*2e*@-OCQ=BE3*V2xLoHM=tHa9U z8jf{;ewnCwJSzWrEW5}!9*->Ss^C6}WZhgJ+}C05mwOg6*BR^0;g~a?e*V`z^Yk}- z=4bxW5B%m$;FOo0Q0&{RMet|F6#2tvh1$;P9n zbgGVuEW=!%ROB~(>%V_?dGY3JU*7w3YaATAg(Uv^wT8#h;v#kS4E^_{0a z@Z{?4Pyh0NHOzItmd>vY{4&$gB(GD0OA=Ni8=J|k+%Q>&GPe@`toL`j@=25rpv{f) zFwi*QMQsk#VUnn!A3W>UEGf-PeZ0&>)ie(2X&?~y@4uOO)#b&7nlD+_(D;kgU~6`z+`7s^qdX{P_Yq?FtNKnhE+BC zgoO0Su$Bp>%7rqLwxw&Q_KvJVz?_JdVp@L~6{)SBZk`$0(gBf@+2eavr=tpx5q|@n z^csFk0tgKv5|5NHG?c-jwi!b+rOI@qPm!cWNv~DNWELDyft@Jetg2a6ZbPV2&w<<~ zG6_wL1cO9`Ru?Kj&a8`Q*hZ|{WCf=2#b`ESPC6w)p+-uBRcQ_jD7!Z;O! z36LCPWKIpP&XMh`gVH;c=b1CbkWn+N`c0epqABsLl-XrMXceodZn8>P89|oGaEfkt z?P_>=8Z(KKD=gjUWAqR@($boLk6D1bw+5#agF_1R&vKA9N?2Tze44mTXmLP}a&eF4 z;tB$Slf^bcJzl6)?T-d4%$gOT$yF@U)=10KtEC<6>hP8}P8KBj zstq`q;RLLUVT>$yTC#-mH3HKIxHH5WXh}<1YFSZJ{*{DCBt_Ne39`t^BF%k>YsEO> zBHGaa2z^B&Gq&(zT5CFm6B3M^{WO}6%3>tQV@>w2N2!=gM6y0yB)Y~8_{u1bU{(wp z(s*l<-;zo-5GAutm*T;vu{jIP1(06_LOTToRQHs&C5f#d3)WMPk zh4p$z$4PvasLa?z#7wiLGS{l*{N7VM{?w2B2Um~3{2l+&e{%owsRwVrbo1mL$Jy@u z?8sTih)f^IX^ZcS?(nR6T#q$su5-_2znEbxXBQXew;w!sI}WQkv%)7hc9&=86R4bX zUDv}CNBM3Kb1;0^I$62SJRrxj@BPGn|Ll+a<3INEKmA|byK{ba`@Ol|tU4-s_beSI zN#iU^?+GuJP?GX#7&$YkXxUcD$>l}RjYY|2t;~nwB6e8bdidtqt=nJsi9h<R%X+-2I%EdYZ|2pDA9?>5KmE54hwIx%i${Ss4*F^xBmEG)U6iBVV6O`l(9c zfPiYVBvI>*mkp!iA*V!A+K02GnDWQCn(T z(|lQ#lWiz1^)3|Xg|;?m1TS$ix?*Ch!ZWKZL##(q?F}t6?rTD-qAF-+tYR0LsUW^R z!5aD-cijRcLP_nLv$p%sWgxn8j8w#1 z8H}3d9s*UW1AKK&HeZ&jxi^s|R>Jzh(d`)kaGUB6v8wVq(RNiJ7xPGDOv1ya^j*rLB8}}oCxD2O(%YN}R#iqrN@_Q& z1d--0XnDgV1(oXeM&p1J+kCmHhQflO>AJA^ zgLBbCYEnG0sDxgP$s#q-vtBerVh;5#H8-cgH$c{i1VH!dr~!6-Tvbyd91!|#@{4*e z51#$Dv{Xj5Q^?vlEAhPMs!9F4+(Ay40;_@?WFi#Rs>f2- z1DmBXLSuoMG+>dE>|@*Ut14!HEQOJ>l2y1Ctgtm#EB%G4V4Q}N&BBKgEOhRpf$;4*GO(Jszm2t0(*N?6buO({%&Mq#`&+ZkL;-F_C$zfFyQ`qU0&kl&xW+>UAHKS134DMIRmXak1 z7oEjeCHI#053>ww;}7=qoe^LD(%)YrY+rFWz?Z>!b2uChS8hI!$KC#XxE*e8%zfGI zj)$u^-uldkKmNym=!gH)I6U%kFV-vg&geumO1 zUzV|R)^0f6-Dbpmc>i^l@AhYF#TdisG@Elh9G(mtW4QD7*?u|B>th5lj@P-yy z=Y3B<`-%H+edZtje}C(nZ+!9I)Azd3vXtYAp6g&uPgYeThss}5ek2Tc zDg03;Xiwx%JHf1vz=~NB9Lr%|<#GO|-~AUS?BRo7HJq=@Tcn$fjP>&DY)%}H*M}zu zUv|Tmi_53h^~uHlgSU3~e)>oL_f@uEE)H=pTM9*}v`%$&kR66qieZt4T5yOPvqtTz z$*-P|r(}~G7mV5@DcgwIx-*)0=Xr-1A|fQu&|z)J2-1`*Eg~wb=!M+gpCV~3vXKqH zP_qIln2s%8>~P!H@h9MeN|bO6g8|U-EnB|lKlCi7U4uxcv?9bQCjH@ zY+z9d6Iv!_GxKe(l<-|QJOk>5*z7>fMr+tr29P-_#p9V5Dk@lt`}e|xISU)e*R%u^ zP)B5ASqarSiPTT25e;I0vzjX?ZL0m{=?pKEmR1{x;xl#r!$}3v)J8zix_UtPixoFO&{AVet6Qh#CVrB2*7MyoE^PF1Z(?J!e)%Vu>FVM6Uyy{{3PPYN8NjewirMD->c z)eM>r7RBv^Yy*WPhAD{8vP$h=+OEVx^oN9kAgbz=EM^w9I$$DM=Ejm`Pf)2i`o2d} zgcAV7lp{n>tEe#zU(GOd?vJ!K>L5}lF&LF23LRgYb@H`aZnfN*r6f89X#kLBz1m=h z02nE{p;Euu$<-_k1FA5mCMmK0QAYQLP;{R@E(Pt-mES3fustg&t44LeBR73FP#e2n z)oj015Di?stYW&u=NxQf0>`V zc(BxPr)jRJ1Fd0U4oC+By$LA85Ka%b%G@F@mHdoSSWNXOZLEZW;X3sMgut>Y0Bl3-=%hpy{L(iL+E;#(Jh2yN zmnu;VN?+_orYE~NvmqS)+1p$k8QSiPV8up{m}MWzGL07WC-vP~ zDI!Isq_sI801zP-xH_Gz^}8DzL93`>+9qPGQsxVY4vU7|dp?Y`oIxE43UScKQ!olX zGkGu?6JW~gn+c&fQXpy2w=MZuS|^s7WkbE4!NC+bjg4T}Le|eB#39QowEYt>BA`!; z-WW>5R+(iRDxr_HHBU3W!I=RvvbR4o+vKVy;TB{8r}lFwPy_A8CfxLHVyI*Wt%0T* zBnsvgsU^Q*wA$9RvMLmgMiz%Lk!OeN``1^GChFG3*+)P6Ezdst?GN7ih0pxzKd6X{ z+t1gG+OCa?Vn@U(-ioLiZZwy?HfKiVHi$?kYE_%~sW_um1=WiT9LoNN(*CF@y^4fi z?l0ed`=!SZUpha(`}+O2eA!pk)#1VJ>}t%O-@7dkUFa6Z_ z{y#tVTYl$vf9RwCgE!y)0s&o9nkGY;7KxH{Y*V=R8>?DkDwXCmfd&N&vdBJe13F8imSefrn!_ji8r=l_$R z{Gop@(w=$l`Le8;``yTp3O98vq~w4tcP@JStzG-7gtIM`Yae-=Q_bqcsaizIGHO|A zVU;f#%vkSvG9B$6eE)K_IVb*mJb8rbYCmhBlRre3C$#)}T5Ud6_-^s}K<6l3HX z6UD_%rKA}ZS#F$}K)I=YF$>+R&SFKFIf{{L2a>W`T}2=*yD`bl31iN%X0~UC33M`O zw9j56d7F|13y=fC&r_y zhS++oni&sw)=(dS#L6hES$6%-fIxZTPDHOiYA!Bkw2>jWtlbtzqljH6SZCwAD=tPysLW zQs^3cAT%J|dfY4eM!`stHrz_1id=o0z()_37sE(5i^?iHVZh45)+f@lb9V2J_LOp# zFgIEQgR+mPDna5v^kCOL++v%g+6B#X2CLRh)kJFoTK7)xADg5pDk_ua=9X0z4LVe| z_C)=-Gp7}zungCEB(X7385;qf8Nkr3Z_X;3kCc_&$Zfi-7Q<{wv=s$ssgo#xZE4e& z(?mEBt!vD+Q}E4|5G|RAc2|>O+o;l8F^iR&6gE7C(dr{5=$3pV?rQ35NfkK?Q32!N zPEPSCuL!ygAgdw*s(ND4h60>Z`YU4isH#YgK53JQSwYIf4|AX@Go4mY&3fwW&Z@<| z3g)I*c2n|e6Q9-7q|vG}GEqK;Mm$#&A*~`~h6Z@))LKz`QeSL>2%vz)ydm{okDFr4 zYMl;&jLK{@o|%a$!+D+H9n(nY9#earEnwE1Ger>VSKh{0S%E{7QIp?htvuhxCS%JB zDWM#zbY8Mxh0K`JTS^)mDEd+vQK^|6XhN7v0GCzF!2vNscUpodH!GL*{_Bb7f*qk7Bhgu69DC2^MI zLmOLS((xIY^pO#Izl;XW?G$jB#fpGg8b_AGAI*#zlYQ2d5Wo^Q-V--B&^@EHGKpF2 zcIGbg6V#{STw!o96y)C5#WE`^G2E6h5@juQG*q?j5pvDx(kMZIAw5cNxa9K;7c^37lKu|M_Pi@*Ky z{CSdYXYc*=cmMGB|7p8^V;Og=$gtpn7~<8pOz_SWiJVNOyO!CYPI4s>wcK1(r^Y2i zmx!{#ypl=ASe&)WDpPgb?Voyd_2f&x`gcF^8~)6UU)Wt-E;g3^VhRPJ-P}B$$HQ38 zU~b{VEN-rj^U*hb`=9$;-}6V-A@NK{KKYjS6#2%`9hYPJbxw48-etWZ>}wluWC!h5PI1Y8*_BY{HEaD2@NEF%mM&1gb)VrbJ(8QHLhN{=5@1=db|f zWzd@K5rwo(V?A7#i^-875DDNFjZL*m(8)O#Dml8-+Agvf38HCcRx(u%< zxPA$XcY|t_8z};eCoD=Ls+p5T>v)VR4lAj|Q7T5=)E#;r1abqFHLa{F0x8izN2JPX zqes23eR5coLRJ&hY3-6y_!tC=%$PDJlY*w(Sah-gw$cMdG(2<)gsqlEDPajdywha5 z?x+jL*h-hukI_?*LP$&}77@WM@-qX)X(Y;gVH+J}=0UcwJL9wlZNe8)F@}(k!y*GS z(tNl#I-&j|YaQ;p1XRk}R&vM?;PcPFmvnl?3NvW0nKK$vsxTX*g+e)iLJba;0CPZ$ zzZGO=RyJWBVXA;rE|_~%mbgE%!^9K}q64Tzcm_5di`Wa6)iyo!=T^OLB(qWt3p&?| zo55V84`5L-%t^~!3v^RCXqs6}$oH7wFsI3-t@#9z{f|-QK2TDDSw={N*TZ0oL`Wi~ z5~!e%h(7H4)KAC@p;4v_;E0&>v(Go(lRys=~YVYz6ZnQD;eD{~HBbeuWSF4dDs409&qbVe$rdZEdrz5# zVFt4l)1$|Mt)$Z3sc*EEW}A^myaUa8Kh%JV*4XLCuvVBQPS2KZFl^n1eQ`6fAv@Yk&k@szjk@~Rdap#U&;QKN{N=m1UZ7=$nZb=~_m$!pyZm3g&JhmMAiC8ztmJ+Hmt~%qq9_AxQ(5IzD*k zorn9g{kQ+lzx2Vc`or`1_`#D`=aW~Ehd{ZV-@bTijLXA%bvWLf?e{3ej2Uy*+?gkm zH3a7*L>GA$YCT@BkC&aD?e3Y!*{!cVzr6eUD?j!N|Li~f{1<*;Ag6|5!T@FnZY*m8&L3*tfL~6X0EzJEgPGM7JXjT7XR%T zu|2**>J%DOYMHUNyi``vFw8@+Vb>Md8dIs{q|9-G2s5A>htEvnvTXd7}{RtTE+A+JL$ijZzzb6sCk){zQ**s=dSu|lNcQb0KM zNomS*wxU?#c%?L(so=K18kbhKwo3(6ag+($&`K@dRO#J~U|D^0NYzDP)QXaAcaXX-xf5 zf@d>y{DO#?hO%Wy)M!v{yY&{L8yQ|XrJ$!N(nD}*PYW$#EmC|)=~vqxmi&$|FhDJ(jUt)OpEAHCf6HrR&Z0$uu?zO*UAeLGzWfl9N{+1na0gt?`d zXy_|;u&~+C>SU$SWrgg4plVZd8QJ$cTIbL$^1b>8s)n2~=){-?F9`Im-RPub`KGSr zf`&;FSsQYlEdt6EU1KJuQz1*}c}F9zKJzSzZj3ZVbD+{~DE&jTQiftf!RMcU5hiFO zx7=1SN_q#{@QiKW!YmGlLMf$w(l*c=d1nS>R?gX~1z3NPlx~|PVT?|PhPmD@+PLxsz z(Uhi6B6YZmQXuPijOw7&vavY1&QhP>8;Bh_?2x66jgYyUnUz^?{w~u?TZV|7BFfxa=TngSB62zmR3}^iR9UH?Td$gr zQ9#A)DZ3QwmbN{IkY?L8WM)K~mNsL*tAeY*lB9rA--%;nMyQGl6j%Wx(4?Cz&K4DY z1K%#LD}b*z#gb%9a%Y1G;dAVX=^pb^;je7>@zdjxmvbWY^J7G@0E`RhPJ8x z{*ZaPQN>s%x7~w=?%VZ-Q&V;j7nk?#}qZ_y4wU`nErJcJZx@Jj7cM z-ule(=F!E)tz~yNVm^8N`rYR~eCOUr{`Pt(w)tQo1=%y;Frr zg{7f75)DdchYcu}vF~j*`;1Puqjzmcw!WjnJeP6#=>Dr^@kjryU%Gzs)`K@cx7$56 z_G4Lmu9cV!+n;%*KY9GH5VN>oNxORStA5L;e)_L{|KIy}-uv{2Rvs%r4B9-2d-ax` zt}tB|0F2(Qo1%e<>|_gi0+v&kaON0@x8Hf?xZ?R2-}iN&_zyquRlo1-?AALEUwQb} zE66vGH;=K@@bg$}aKD_LuZJ5O=F1+*#Vx^kb6D#bdA%F^JR zVQ;+tlb`yTzxcUd{6TlzxqWBs?i8xHlC6+HWFbI@I(l7Z6S6y>#C@vaHD$b0ECv7_ z2ra5_`q-d{_p+Qe(tCK-|u<;g^q-v_*lxvD${PFtTH4tktNk^zzdlX ztpg;hWWtkWTTNTrsUd<`LJ?|~BY-Gr7&}=2KvX$8Gfc-_3oInMuh3?T1}a3A#>^b_ z+>#i#SF{|s!7jdLqWUJO6a+`yo#|h23piCe!8YQXH8Ybl)sTZwt>P}}v|7&`U zwjhZ#UMKRlso1tjv&9cUJ3>O{Yc+Ac<|eg`!S2`k)t&lewWP5#*5UUSBR- z9hKW$D`o6e)x<^YzmhCR$N+hR7ppD0;8;He+_bMY8g_E$}`Yk4LT*y zO7f#heg2K!_qs}XO9e2tGN6<(klDqr)-POv4FYK{(UX==)6bR2iX`DSvTthk&$dYm z#8{h#9DQF#rzs{~0*ORcDy>H9rCvgsG%_QwuB#09xklrXW~2iR;Oh0u87C0}pc7tb zw(u*oBxBnOsA{7AnL$`al|yt6`UM18eD8Z-tZD+VI*KY-OrzDiF8D&3dqr`yU#~LU zMpj9WMkQERwXJZoQxxGgQ0mL;?NZ=wpW2!Y(2Zhc9rd7Zf|4ky%g`X}n|HE-7OZ*~ zfI&lLVp*Ajd9_Kynx{d|hze(~Kn+Uj))Cjr4FC`)*d&^ay}~v$chSa{tXZccqi8M| zu6m8`XR?>(BrQV;z2#^hWf^Tos6_Vwp)w);mguB{gAs)M{YR4rJE=2y*VK+TK>#SKyFx6;kk0js^{p8i-DMFLAC0i^jN zwU=HYQ@K~$&eMlysAet`7(!hWX@soX3cy1@X^pN|b?J4%h6!)ZN;5iLVM`L+Mupn| zw0%HeAz&# z6e2A(hU_AZ%T#q{l*tiTE^^Dqz&aDD?)^;B+j}hT{b>aRuiCP%bT<_ z=laGQub}F=_dNfhkN&ZbeC$u&+P(Mc`qi83H;#wmMl?-Mx+w~!1(FrWlo>XNf`C$ce z&?J3wBgu;6n-AXj9lz)Q_-nrQPrmh~A0HRDGiJ`i;pS+=jU#K0-IAD0pa!!zj^`Ke zyZ!VF-~Cs9&GB$^@2U46506!r$;7m5|6x`c1{@~1RL0M?3KCG^rg1SaDvXk?o4fXH z(06&fe&^AHn(Nu^r@!WF|HO+Q{k_jV_wn8C&XXr^t~U?X}Li z%DYprsRlPl7SsdyZ>RGU|(rAj5gb@2J zPNPpcB@b8&HKj9=l{R}@?|U;anMPJ*xPoqaPBIdz6<>2zR$|kQ&1r9-W;FvY98IhS zm9?4(EgtBz0-0uBeOo8X6_N$A4>KKxrajwG)y7?cI|i$^J6H8F=WZKasSK7D>``Zk z?g>RRL$FSNN~}!z^s5v}C+WHzNy6jg{qKB()NG(5Oz>l!hL-FLu?&kl<}9hOH)|UJ zWRw{tFWHpL3QR473CmpAo$QDgv2-rkb+88*sJ@v6F!pm8yE|Ll{ z4?)UPyiMUf?Nxzb5au)jGlMX9^^hvzS(7QNlS|m^+!iV*2@_Ho`a0X$)Hix8)!-%W zSNOPwY<>RLA@uL!;;pG@1h$M_<=$&?w6z$ zefvx|O9EX#aAs%L+a#y&vo}H z2)M&!wPI9>jMzjxt(%6d6x)6!bh>{Z_DU^cV_2w~4Ju)&uTY_AKr5%~*pk{#|4)1) zwQRc~H%3CY27oQFnN?*j@SZK7=mSp6n11A}ECZrxeL*0#k&uZ*XH>9BxZ3DXxCv=) zuq~^~iR_X}(N+CNZrhE1IY2GWQQH<=@>ys5S?I%{v zo^0Dl3jj8xu&QMIRc*X8))3gx8@s~Ev`q-vkT_cw;O!)q?6!20G+3xtrlX&v_Za4> z^F%x&JCR#ohR(IDbcK|nXqGYWzx~?f?e~4lxBR*Hf8>8WeE;CVXRn`pIc~1GxX18Y zXZziqb-f`n;(9&C`NiGqt9NeQec$anANX5;<7?KNxO3;(S-~2GRSO${j44DmqJ}GR zN+@POx^j+33Gf@HyR^@G9ftiNw~g6YTMma2#c;cL^Uasu_x`W{U4QT&UcdF}b-h}T z)7|CC*zNXf9LumD=P|21Yud86tFc5|L}bu`1XsZ zzG~Uu9?RLFaoLZ$IUZ}x>soafac^g1*@4$-yNCB*yZ_cFAHMMuuYB>pfBntR#Co&8 zw6py)`}0d?uGd#-9Alq~WNE1vr7iA{SYxc~WWt?3{)aD!~#zcu46C9Qt@Q5v(^7`pCPrZu~w`2-Og z7Sn^V>1b%cz)h}Eu!HqFhF@c?pk?$iolrM9s>)$W^oF{L95y*|Hm}f^b{{29gS)^0 zAqN8N2xbb!XgReiZnwuIQ_9S_WuI&mq)x=sRU2|s^ktxgWTILM!8U+`3tj$0 zU7o#SRMLl4(k-KM`;}GjDN0TD?uyDvs>!l;~n@ z#s)-g>9fzj_l1*N!MrbusHv&2HqvZ+T~nl0AKE25pp+h)NJkG@PoLPb(E7OOZwqLR zSQU)f_Ge=kKqNYd6yR3KoJ9q5K{n2g0YG&kUQfc+cZuFcO_>#OT0jfi5Y$u@wB)n< zHMvOv>Xh7Kbkkm)+VYyH3LPA!BYU&&ZW;5Es{6Jj3oS=x$pzi6c+ogA^81Wwbg*Th zI`dNL`- zDeanhXGZmIK>!x-+C_wCgIml?Ot=eI5vPNQ4j$eXP4oZ_<(cX24QyZ@ZS*~)5DRW^ z!?wRxR5Hc0C?3ze~F>Yf33JN zRih|dRrZKkjal}(bQ1IfDyq|?G1s730|Fw^04pVLb-n@GxiR$2W|kZIZfUM$pW8Hm z8tw(goHRNaTOA0tDOPAnHO!-1-ZJINL*v^T17yC84F%BWS=&-t1k1Z(kh;i9cr#D+ zJyJ}k<})+f3POALS9)fw;kK85A?-N0ugcfoe);1c|5tv~cl>9;-CM8x^P2bP@n+Us zmW#^pv6IFqV(!My-HH~mu6c0o-}j+^>4*Q(AO6gz{^s3h-k~g<*;cxx5uem;6J@w2-Vm<_zW|o_I zMpDe&))Ww>$~MiWGKTa;nGv$hm?WWK>#PV^5pM7@%){aO@msTUhMk>V+t3av9-TV+ zmdV;e8MXcxF|)%qnoU=vki2`{^io^BLJ@6|H~}v-wpzXlW>IA)Sb3|=^&{?`n4@^Yp5=*tswQ}(eb;7lxeum*j*thq5Q`ik^5Zp)E=Z6me_^L{|V?&1|l zrDkrlyhMj-S9MglnVB~$0>n%q$b@d&gb>7~)RG(=&zgGgoJ)s}))oBOV%zhCh( z_o&<$63wf13d%-7r(X4;Rh^|G)ikXlv!;eI0dNAoky>QT$S95enlZNj$qjoHabXQ3 zXr|4Y01TF!M89ukE96%^W-e#D3|74!p@V%4>`y_BPNbK_FbaBX;6i+w_JDqI3713F zm8q&q)zk#J-7Ns6cN@4r>64~5>5>p_hcAv5F?;|h z1%SFk&#uO3l-%%Yv@^XrsH}1tJ9TtZtH}TJevH^85-m_VMslUaF zxGfUvTlDQuS>Y@=ZEIi$&Ad0JvWgiJU!bHfq(p^UPG+dp!mFC9jjBcHZ(+DcRlC?} z*cntLz?Re(isgEp%}NDHqF9W~%IrdKAB)7?j8I;bkz8Yr(;%;n7@Ms?&IS(1U}DXs z_Sc0L^~s^S_2__Rk!6yxHN6$2jls+erqkr>7f>&XfySavpObnT+1L|GILXFft6n@3 zW@V{SOJ`_f4AvaiyV6E&C_0v)G))LwmhhcGI<3kQQ7o@hmrE5eVBvxrLRtvOmMe9w ze!gbWxkV{3RyD>U^Ic&CV$+`H6w!QA&8<`MOtx7vu?3tVONHnSnDtfBg=Cv%Kda|s z2P&|*i3RC%#|gSI!JI2t&D|rRdlz6gk5_RrcO3rU(M$L4eDJsYi+}C$!@RLVdid}QpZUAL;a~iZ zt{(i-%%hF7K}5tdmP6D4Xg+r1^7fs1nCrY+5636h@4Wb-4}aZn{R=2#Yz3NtiFYJI{U?85vi{!=rcJ z`pi3Tep)B>7HFWsDoa--;0CkBZJb}eXIb`DM6Q)L$0>glwi>8{ycX4F$L7~%1duAC z0H*YYfQ*xER7%u_8)q_`(Gr&jbC=N4GNv<%j7ncFkB4_|uGa7PuK)O%_k8tBpZ#I; zyW)$#Fue~#K64{KE+kJHk|{`~CTkN%_o+4Yfko_a3ghUSWiM#(zl z#bTfuJ5}08mAH(`&Lq=w(!fLxjNS#rD-li-n4SKg*17|r`KBP%m> z;IV5d)H>N$As{lMs6)~ko7>10v2Kv4QX(XzL&J`!0Mm4Xjpo&`sByG%<6wG8=pCe3 zv>uOgMyb-tP{oL8-inJ}BS@t6q*b-0ceYnS6%dfR2`QICqtt^Cs!nVbR z?b$CwC(T&X1T3%$lpe11;YtCVVk!!qyw_^R)BK;%g4(bly2(kaoNfO{;H11jrEOXe zDQ{rLR6Dw$0-Y#qC`AY~q${FDg@m!tD2!mXCP`mG%Px^Dn2p}iPB>FDN9gsB2BpeS z8uyGSsawSYDT#<}wN#A}w(r&ofXetbU4_!#%DKi`+kCl^JZy?f;l0flc_ zl~vjtM%8qI1ci1|!wRb|evOq8Q$Q^ADgcuC6x2YR0q;8D*0>0=llUt8@NNvGavJrq=p=34bjyu=NCuyv;NTsw$v}k8|w<1Wkpf+Bz zJGiXxda!RE%Fu~c5;T@r8&l{+D$%auX*E@goYTW)nLw93Dsg(m8ACC z4ur7I88cVoLep_6>yI&_GE?)r5in$CfE$cd9gR|es4y70DHL7sgbTCJqCR^kiWSiq zi-Bp0%vsbiV|4AMl6Us2UO6YJIoY#dXaoMH5R*($Eew?n^U5bB>H}3elk~6YdFsG7 ziKVtvrUX?uUGN5G0-!N~t$sirIf><~skDx}X`laGr@%`ynzd-y$k3fpQrHlgn{K9N z=&MO#ByH<-+rlei8|#I^M~WMXv_i7C7w>VTq(Z3(v@q4pt<;@dqu~T7ds3%q*aOYiWyz0Yw95{6gc$f7=}siZ>2U( zvL!h>q<{i5(nQfHDkcK%Epv{lL?A6q3Z)2?`m(F-$Pwwo0MjoEgV%^mrDjAFFsoyL zB#D#8wF)Jw*GZ{pNNePYR9TUpX?ZJqxC)%AmXVy&_?0V6mJ~fkSW(J7*K5_s9Q5$_ zG(M__Vs>x@Sq0HKG%uvEimIpx+38`ZIeU$@T=Q^qsIU9_Ka$)(y#MKCxoyk6tYa{d zv#PkAWbTZ}IoBOWu7?B`EKZBK|J2hTV=RZ`;cPjdrQsvp48EvOmkpqIi>zQz;bpq~ ztE&>($+MbQ+$vcGx`{C~7U?M>W-}HP;kKOL8lU>)-}v}9{@FXXKJ?(p7Z=#^cy*k| zTjzIW4-C&ju^tY);b*?TdHA_ceBw`k`X~R-Z@uyQd*1Wnj3-HCrKQ$GbSf-5 z61P)85pDy$A+;UEeVCf(rET3D8B(RIt}+YES)7>#?9MKpUC!WixB)X)l%|bkRI;UzPzBYd1*ah* zE7NxdlTSa*_6FX6=k1Sw!*_kdZ~XIL{MCQ(_~C08mrsw~`Ps6p$D8xBa~}YP#qrUj z2g7ab&pD4#HrK27JoB+HfB8p$;gf&osk`@(2eh4$O|r4O;k3s`bP>CzIirqI6}@+z zQ(+t9HOYlCfE&mg@U$ukbyADHH{mYujMyOf9xBBWnzcu&Y`Y&dF-cFWyDkf`96F4f zcq_olX^0BbGjbA?P)bA;lit!1dDc!s{+tPIT3wk!(-g+Et?*V3O(?$s+WH#(HPaco z%`mxP?j6zIz0hpLfrT{FQLh&s=zvQ~cqn+G3dpq7hbKfH2@H+&3Q92@j!AKLnVW8- z`e~Lk5ZkMxjZU@*G)zenu*^hieOJAs64PW0m-4?#0->y6W)zFQIH+Jxz!`H2L!)ck zXp{*8wv^3MpeZp~@rT}0bXHqO1>^(N!w@sKkUt3k)XQ2O+VKy z#w_*2YryW}gx*tI9{}{77syO=(>gYs0B24_dzX4BtcDkD+e0#hDUK_lyInMe4 z&N`)=Nyeq}7D=!*0GYQb!sy`45YxuatV3p2rjLbrN~$6<=cbGx6wq4DQCC6P9vgvR zV5z7Ct%BYDlue}EJ0FTk8=X495;Ly~y+5v>WaCDph-ZiOK_mE}p(fGxySs=$51|2SZerJA0Tk&Z$HoY|DQGT7P~)uu5sW(Em5qoU@dlvvv} zntc$o~0w`cK`4D-NVuiw+QDv2t`OQ$L*IZ$_gHZ}}y3({Hu}9gZ%guyncvP*JCEY_peE6{54H5uq}ersk{vrHY7B{7Gdd z-4{seVjCF(Lh%l0qrF)Tlchfcl&I8!v8$TbbIsuw%mXv$JRGiW4mXc8XG9*4Pp%JF z5y8TGT!UfbERM%H56kZIc>R{yI{ZA0W>JMG&dN%O1v0BPKM>1VRS^PmHg#lSMnyD8 zwao_=F@cQ&LeEE;$kdhxoh1=Bw{Ji9_S;x_FynhXCCx9mSNdo^y@sn2+-?Im+zFTFYeZML1N@$D|o!|BQzvt0gKes-5>-_AQvx{4Ub~s!ej>oK{!Zu(qEt+={ch%N z&B{}8=0LlLH>1C4QKb8#xiV0Y%vd(9EJF(Ps8%?)x=4qK#x*lTVy?5Y`fsJ+KIKkV z>!3_~T|3OOLTx#cFlhqo%ojjbd^e{#3H5llNq37;Sd>JmBpxtPTsVBcB@g}$`JO?qFY8{6Eeg)BX#YRn_DZI zKy1&yVc`{2v51_Q&aHH<1ch+Tn)~pWN762z`v6V+k88LG=9W@BZ$yz47z>ryMW}v5L zT@o;z9hKcJ(`d6sU{%sp1Us=2E|9fX2UMBas3JSX&`)|8CO7ULaIg)aW^lr_Y?HdJ z+gL9!+T6x)6k}#a540qGm^<5wP9@iH8~J+qbyJK|WXwV$PbP|FZSg6U(9EoPUlfG` z(ooG%we_J+Nt~KR#mDId!uBMUdbP<$QK|qAGkwv786xMLIa5CXTC^;JyLv}hk)cXzlWNH5W4EBJb@-&a z70^ihaIwLTVaCdsq0Gss+SYr~AnHNO+}y0$HsMytFe)HDw!STNCyg#Cz18|`^{ch> zLD(xBqbXwaFWR1e*=fX0x-|r%ZGpoHLm{J5C$ieRGFOeECF($&CHlS_hQjHv%VN$D z_^L}&0}5sSu&PLr5DKi&BP^~K1tgtZ#vm9GIa?-DZDVMHl?fkGw3hqu?umdDOS-Bf zq5yXew`Dgr@~x*%ZD-Y_WM_o6oZ98@7A2Qms==(P8FOYh)h`z%Vv0;u#>~o-*v)a$ zXOXnXsz~qO78}^p%omyb2;~FQkR6ng4B~<;%OcxjNxHx_K6so$vOSW*iu2mv_%DF0+vN zhU5JpaP`Zr^#z z=^pdA9uM=d`2Ni|KKE(oh;;i`ynQ2r#?k)O6JFz{ zt3mP=*(tlDG$X3gX*8HCn5uNoO72&g!^M;IXDRAqMxekdC)~zju3M($`LFHQ*Xsr5 z=DQTTKN_} zTcUc)1+_^D-!EZlEwRk0+&^s)Ht0YNQnW#FoAyf>ts$zsoZ8%h?vPR;vYDFEVbCZh zJPJM0R!Kq2K0nR5NcN#AQvj4;L?Ci?y7_=yPwIEr@?IsP?1)CWgkze!x~%e8<~Dpp zZbDa`LRA|NNj)>7NF>=5O#nHkXc6J&@RMbPi4ziyRy`z?UQsnBqLhgVTyI1L(65emh!KQTA>=aJvFQGFQLzW1$k=46l2RbAQHRn{;8pxcI z-=Iaagu$a~iyml%w-5O(S|NL#G>)=jWJ>X-(J?cyO?8lRDJd!k=wM|nC>`~vMM%4+ zGeVDjKPh@NNv0Bb%qvsXEE}g@%CYVD1cY)y^fk~B5kw=Zm2L);e%%E!iB|xExRaIIHs?^D3=E@3-Dl%ovDpuz~>0D|y zxCB+nIW)YtCN<~@qp6LmGGMME`L?beg%X}5Cz~||%t(UaK;_mJq@c*&h!tAG!l}ey z3!e0TS7A zASS%h_71-N#*b$nFK<2b`1+m0vBk=}{RMYpjho7`AA?v>GviUrBkb(*;zQ5A=R4rX zAOC?r{>5MU{>$^HGA0W2krmu-aN%?4@}MH9(wNayt%5#Uu|=^;dizO@O?}rSifOL? z4u#dE8A~EKL(F-3`}V7^e(9Hg>3iS*q2GSEdHrS@S6h~{#ZXxjSJ#gd0b0z6EL$8{ zfSXsp{Bz&-JO9!rKlT54`^}f{KJ~)P0|7b)Ohbg5g`#Y|DmSMBp$vtb@+eB4*vT!K zFz7>v1|XwVDL!x}-BPQa(smgNH7d*E=-P@ZZGlR)sm3k~kgN|HU^I}SHWPAYknVcm z6;LZVi+1}mpGzT8n3a*LWb&G{7*QbOS$+RuwK!q}rw&#{I!pAg+I`TyhU z&!ctCv$HVldG>z4@0@d|8oR1`l0-{tA)&@-0AvYE0tt)3fEEfdSn;$B0WZfx>|{Av z%g$sRdzq|d#YyayMX(_OB89;wOMnp|BP3)j)Sv-PXlQk}daSOhuDW&aJ?DJy-cSB` z_V2qzy4RAbyQ|JU-}}A4{oDJQwv{VZsuNY108s#3mVO8A8QvR!NYz$(#Xzwugx-C3 zM!Ku<(%}{`D=epB;987itZaPb5!EUc=#@vKq7R#`< z=`7r(NDD*SXI*UVw1&)+SlIF@iAsOSZ8AQj9kqc1WrHuzJ3~RQfhAh z+4zhL3Lr9P7{b{(K(hdTH!)?#0~$rt?q_I72*Gdw7ESgo_)#sPlVLuH#1@WTmti+G zx}2xvpRV~8GHY*NLnaF}*UMa0mZ4gUA4HdBCjeDaZeisSC?fn8N2F(MhnUHKqSLo* zWVLje*sIZ%nI5Y$V|4$1molyB3kKO(8^^lal@WB5^t6MG)-HpX5l$e|P(@S1Ve2g% zjXA6rbSe#Hg_KDobu&WhK(rSe87SW}Np3z_jtI<1N5Su{E%T7E@6#|c%uTo~pj4Vj zgylT5<`?jrZR)VP8EhZ-Sx89h>w0%*95bG{?sczVpC09%!&6$V6XUSf^Nd`~EH=8l z1lzDjtK^k-h&)7{+QZ_^9Nv26l4YwM)YYBXn!7c!u~`}}jjRqpgS0YRC<%KZNhQ!# zT=}5jmPR3(^W-@EyFaNc`_Q@K`d^!MIUr09d0_{;5L{^mh-fv-`C%CZ*^SMOm!YAs z5QiBPWM;l-_qxgw!)6&zA_@|RG*%KEAIMnLJfn7JhR8ad7(N)9A3A*_7YyS6Ua@Wa zu0=>S$QF`m`*`HY=*&fiM?nuCdt=b34n}V54n`+7g?evH>46$$50-IgV(-p#^1!H~ z2Gbb5hJ8mi?`E{OntI0a?jfk_L|IA(xH|+6=}i1!G^}@C9TZ0g1gTm(97v*OFvIdv z7KR8iYSR!ysm(VL=1XiWv6c~Ls>6#u{J_~jdH)7*-Y~F!urufeE%gvTxi@Q~0J;dO zP+jVt6>MH*FFP6h&0{vTPkwNS%BEWk$O3O8vVMS`beV}@bTz1|l3-VWTHzh?{;g%6 zhah4;n{{;=R0_w7%ZCqNef!OSbnn?Ox!He|yw_ca4FVM4HBWq0B3O;<%$J^f_Cr?} z&pmwjv0wT}f9hv{^1EJt{bLWFc>&y7w;5X#fmy8Ro1ss!F|AZ8zviG5PTC9)6gj_n ztI=LQ&%?H9;y>C7PVMI~4TQ4Q==LkeO?U6!f9v7vKlvm7!3V$m_rHDj<+{G!6uWNF z8^P<-qsLF4Y}@wW*=GV*dkKy0qH}xK_2bvB`{m#B2mZqM{E6Ro{p7Xdy$4-Iq+)sl zbASUa(WA_Ajt%opMDVl&WiBY7UP~KBV@zUndB~hbmC;ntJ8S*DhUH|emgzd9y+dmu zxPT7Zn2frtCWeq0vw@YuUi*~cp0aA*%j|RS4x)CYn|slofQ4g-4p=~SJNb{NnR)OKeY+%RFA*d*6G$ z>aYE!e|dlO=5z0Usp>X56yuY@h#Yon)&YQpQZleMlZR7or-)-DeMWW#(IF*r0-dk( z@@~g@RG8?gutsJ&0j*)mT&%ciHI!#fU+dJn!4My)u>v+2p&EsUt8PZpO#r&eX)0lr z05vX1f|=38Cig|{GQVtOlQ-t7;(yL9j)Bgedw&3UL~g~>Zv1Jl4qxi9&Vgva}UQ{B#6j9N>&gJ7KDHCU)UG_eVy=4%xrW+BV8#A9gi2eUj00~t7nPa~Lg*U4!J@HD*x=hvqNXYbYUi-=@5ro7t| z;D3feR1v7oEqa+u{b4gVsP{TqVXh7dnN6l;1z{Y|hVY`Xs#3>FZnChG0Xw#>So59j ziCoqGrmGPvA9Qj%9rsiO;K3k*YOfiFfJ1o zA?sc>#L}B;jD~&h+K3%Y&&Td%I3_p@)-^0|dMFz}y1fxulOt3si?io6JAs24vwzb= zewEL7jDygAO9V&JIDeo4Mqt@T(J}Cv24rgqNcRw9w(+YBt*r<^nC~+5+6tDp_t?}G zVna$!2AA*kQO6x2DxV}HKeK< z5@cL9o}1il8(W*`hc3@GK{)V{3!j&uK9L(E!RnnrS64*jc9a3>Ajwk+Ra<)fmh9;D z?NKK!Kx{BiU;&@)?*;&Jb0+=VS*n7)MdY$+Nmj-ib`4Q6W{<&bS8iang@ss^%s6$( zPn>hsA$et>XK>-vd)V4-Jg3K!Kj<(SY9@LwF}C!hQp6}yU?5qIz(#rkbTR5`-}~lM z`y399h9bAH?9>~#V-X-O^a|{~2N~nvBjz{KO3q@BSqu=wa8i>P`(DF28;?;lR=Voi z1ZfGA!2%HD)nYKXmkk5iY?UZEQp*GJur-a$>3SVrx$kGAjA9@SH_btCcVpcxDr0M7 z;TF}FB@jF#y9B@}f7sq54<1*$O%P9}EfH*kV1j_0ip+rM-`JTS$c$>&jUwogAMx#Uz+cz)hMV$>gT4_G;l3c!%!r%$@BV8EzhiTMEnB7a^|}aC&la z=edWUd-Cz0|L$M=_5TTa?|8gz_qUBtp1gH^^Q5jHU){YMd3o>t7u~u41)x6hsUQ6L zpZrsw{>1lP-@bi$ad_cfFEx+*?TJh;TTntYDN@~Dv*0WVCBh5xx~AnN7)(J`jcTR? z;JUip?s$c(a{m2i0*UNYA?^5+C zv1Ljt$=M80*lIGThgK*;tN1obZ4`6T$?QFJP!$T~mWNUc72^kSKkD!^m)t!C%m$G{ zM_|lo2@SLzV=;4L{-7L_mtuj;@IA)7t*9VE?7bUAghu`7o_C4(EP!*&^r@X9aA2#t zKpeNjtDpVUulsfX%r}0^fA-0b{~h%0@$&BJ=5h7o1FyEjM(A|91_Fxx_V((|{lg(z zaeaOL@bM?#|ABw{mw)d2f9l8nUw5vqT6dtwh@d)Q4{x+BXYitNs##F@wuOM0Jtz`l zmO~p`@+<8(y`ki&w9D5M9CXaC%ERWSM%MNZ-OyafwL46smc2%ivXdUnWMryrwpyz? zj28}B5V=AE9R&|<#);PY7o%ggi!?Ry)-J-b-*R>>%yt#`^n|*d{>PGl4jwS~oMTpu zfWbJLOzV$vz^&InyVJG!*^Q8YFyF+cLCOsLnWONl2BrfbkQ+xS>dM9 zx(W37?5tv@zqg6hH@(IPI_t!{YLSr$o%S*zE|R+jS>%*TcyyH_r)3RiM@~B8Xn`q2 zM4?3_SXd#1em*W+UJVeKxWX!Ovu)m^fMbF)np{+yCo_2bon#|O+ZKZCwz2OxNTDrK zH^0?tgaToX3*3h^8?uHrk*%-P<5n5@jE;D?svbZmWgB3i`Fb(mD#*#BBpKPJXWWEJ3v5J7OncKvbfjaCJrYa_1}bCgvQKj{fAW#A62;A{hSj6F zGjU4|^D!g*qRf(HYq#daPe#D{Q;pFeT_A=EPXwG#zfxU9Fd|wFhIgGHyhUibn zwj|Me&sp{s2g~j_7*$nUTV=e)IYF{9e65|riqt%x$8Kdf#v{o2W;Ld~@tDqx6X=p7 zj0gRiXff>7CJ5jd&P6B>#5@UalEah6%Ruv{=Ghy-T3#z4$-Q@JNuL&-95hgrL#Sv` zHU><`@Wz@gB<5zd?-QZOr_OoNi+Oj&;TxZR^!i7)xWD5GqBmS!J$UzFd+FKd-gR?( z`_W(e?w|Ux|NQmWe-7xw#l@X_FLCDG)9@0p98;0idsj17BI^i9VHQ7@yQzgd*A_>K z+b)2V$^(zV*^UTn*mgxkStm&)!h0_exY&-be&%D(KL4e^?+^drr#|`h}{e7t7ZcC_SdK=;+@9O?{;RlNk{X3QtqvjwPfJIoQ2I|TFFJvXf# z5?FB{V!6tX_zpdw&$^cVk2|Bgg)NqleIh}pY${_?cE8D#Q1scyETcOfyHAElK>H%apm8zqP9 zjA(NN8*oye14%IGBh!rl9pi!CnA2CAyeQH05k`Ncr^HCl$bnfqgS9(+!ET&|1eiZg z4lOi9ilKw5)X(moCrRBqVr#3 z$q}(&Ga_1Yj^y4aG)9UyF(Q;OL4eB^5)7xq`??R~>qh(_irXg(tu3R z0Pkjz00;KL%ealcy8a+(O2?{S_1xFURhK9@7uUKM{|lKpNOv-tRzvpOb?vFI)tim% zqr~=iXY30;kJjeTmLK0VG8c{+g97LdrWHiKipUUJ)pQ*uDth|M|CZt$v`Rvv|(RRPu&HBpA+P)Oq|y*rpzT#6X6Y=%IUBS#pvLLYQ-`; zxRzOWxPH@aAQ6RH!YA{t11gB@wq-ybrah?7QE-Wh2sj+A+@uEKJ@VytkTEiJ&k!Cz z);8vODKH+~Sg)@;5Uv@b_R~c0xhFQdw?k=FfRE8+ak)aru)g%dyx1nGX4YamLZlTD zkt|8O6CN`B-7nhL!7%Hq@uTs7>2-i^4j5Z#S7~?Jg&fNn6bh5n1_m(`m~&Wvv|P)8<;88#7Y^RXgIwT9j%H;uBsCYg|j6p zVv7g|aY&N5r6)^P7s)uJyC`9Nl)cZwj-f{|9&QbqDK}i6m91|Lt|p$Cm2>j|?T8T> zE$<99J4S)syR97Pn)lQlYtREbhYvNPY*N}LHFOt{+zxNO_OWmNmhbxFul$3b`sKfQ zef{Re#k-z)?h6k2Y!^TO_-B6k=l;Ua{oJ2?^5`+QeD2Qu;-s_}3fnf#qUi)Oa zVUcJWNdSb%urn0{p1Bf`)rQ;r_xS0;qm{qSp}abr7wqXtM9YK%27~vv%i8t&YoGqs z-}T47>?{6-U-`u!JRXjBAH3AMy}7{;cd;*zcO1iD{1_6 zt{i%YV-vHkbU2#JZB-o`m5<6NQk+RSxI9Xv4y~3u+3HEPDbru*X zyas8FYgoSkY~d8(q*NJXnUggRTPZW;d0U{I4I02CrD$rGJ4)1Y=s7n*)iZ=G4xeYL zKY9$MBVLTD&@f)?u9os9pSf~FWf4KNDsl^p{Z-)H3;s^Jl|KIgU~)YN7a{{uD#BXF zD8TX|ply>Qg6a;MOY@CsfT~;E)`=Rsu4O^Z$my3MnJaKM;W>HS?VRRJl5{!?m!4q8 z1FB9t01sOB{`TB4MQ$AWXZvZgKpQ+$RTo9ST8oFmM58X>Lib(@I)BKw z_N>6pakWsP0Gfq_{2MuDW4zHlQ{dc= zBzwLe%{+952PDQuID?SUDlgA9Cii}fh zceAzLfq(-%)Q%9I3g_6dH8ZrIMy8XhYc(HK2+gs|*IwXeXDvF`DlUIi&MghASCc8T z91Vw#JD{fJw4WJyOj7FnIO7bs`eiYFK@JAyTh%z0MfOQ_sfn=RSl~t!m58S@GEA;5 zs8Ci{Y=IhdTQgzIcRBi|47SFu(5p2etXCOIB>ifQE-iE0YgaqQF(QMFeQr?3miwuJ zQpASwovx>_K)_+$Im6-n=Na6cI&FU;HTkwaU+aBY=y=b}gC#|63_WI)uS>zDv(E^y z_HOSU&Oq1L6$7WLIVYNwQ*SY1vT6^cB~t$JhPuyYsj7P%0N1arJZ|Xa(eKbWdt{{)UN)Kz@#8dv6HG7$f4eWK-YG> z_xRDTsQS15-XD17#Sh(F-zfIC-}u<8pZ@QD;TOOA)1UaUy>WGUyu5sHd2zK@R6PlQ zfQV+W$*!8cLjwkpbRvcQjSQ}#WoGJ_YxilzjKPpNDsX?I^(LrSJhqEtjK*V#kgm+! z)fpFWz4?jDi)a4Ozw;}vzWxh0pZVx*Zl~MZi^HAEt2@>E_03~dAM$u{b;&JmZ*ESv z*N42@y!@3#XbcbCiR5(1h zEiJc<6Vvml*Ia{D1`NhK1Kz-b;X_(ZvIOoJ6v5*HM=}9~t-d4UmIxcgbgm{o?!nM*^hlA%YQ6EfPrUd2zxwz5^WS%RT%UXO!*RTOz}?%^Ln*gR zY0ryGolg5+$=Io`PA2+Rl<@eAKJeRr@t6M6U;T6c!u>nX4IuswR8r7=VMjD)g_9oSLb-km2&=@M_46wcM+qIMdRB)V*^Q5sZAfuROdkHwr6O(&{fmN~O%~rx7 zbMwulRNiY*q zRk_d@ag(_BK8IpFwP*V?5W`w8GgCyy#5?-mtA=32QfF|N!;)g5SRUz|z+cF;#Jv$j zgsLDS4g9aRugRnn**WR33)CK-Bp}eM5+@?U!{H2wbHDp41Jr}m#u8_`2wyiaFef? zp^}{UE6WpRYVu1z=8kA$&{oS8kkl@)pmY+JT1ba2i0*r+vmT}m`%22%GqkrnD(u(5dGmg zbMp;sWqf4zURbD%TlQQbR>L1@;sqG$9-)NLfym5L?W^8Rpjc)KU8mYI#mSZOq#cp_ zej=@E97u3RVi%DdgYcM9MD>nQc|j@)kvRoyHVzsT!1OX;GOKq_95hS_)Glshu*(|4 zQ9Y@cR61ypyRc>gw-4YuAZYyz3vyq0z_k4FpJQb>v zL+FppX zjk8ZMB6^Wrqx^fA#0Nb?=A67Kc0( zwD(T8R{jzDZT0Em^1-@NtS_x}2ue(TTvXCKnx;@;gCrANgh&<@Yob+W?3 z`C}7)g*cZswY6kfMnx7-YJy{i$6!@))G1yLXbczY#1z{391F4X^dQS$u)+{D!64ok z6PvW#&FbwY;Sd@tasw)ztFC*)r&QtK%S;NH`>7^CU_tV$c=&3mHB7o8n^X=hPp37X zZZOu39Fp_Ouy(I{ES)PLg0nTX<<~OY{ToH;rR)r#hHM*gnVZ61Q;OxFF$N5tXHK8= znw6_0plDP5OL@E$Jaan87=8Jm_!OvdE}cQcCE5nL^ijK!5Od;~S<57mB#PGFtYM8x z2Wtd@QjNEJwrxwCY20s^ZEtJn@SWzwn3!aS6-Oo*a67|UD0o{T%|S1T#w;MMs?Apj z0k{oo?~!&-Q3k^dCI!`wC!C6nky9}k0IFK>{-_B!nX9l1Z2KMP7QYpC!)bgzZ1;HX z6nZXhDKe$b$mz+tmrQ96-(1$7d%Qnp0hCV1mu?5tJPp`0mcSU zJg-q7gdZRWbo2z^lH>zC^D0amxZlPo&c#e(zO{(C*!|K?J5gh|bkVRT1(*|)wjftJ z4Ok#GcK5kqm|hVc1*L_Nz~F&xQ|6TV9=^vQr5i~IvH2tN)&dCAmZCZWN-zyT_(=@_}10NDlk@bZx>F$28!&`%NPE0@ z_LI?FgBON|{Wth+r3d7V6j)vM(W{jkyXMn*=fuDuV{(|~tLFY3IB3Qo$-O$gb~k#| zP`1?!Fn%AYh z@!>A{w^(A*!Q;V@b_rWTc*RwnGrir8@cOd^61ZI`~!4FhsAkyJo?n?nk-Y(_HBP&6vU4ov*8 zYl@tmWqlj$s;7HpQgkANnE|J5N&vg|Q6t4DvIy zrI!bT*lTx36>)_6(WBRIPuEPSa5(1W@!od0OJ?=0#bx4dFzMaa=Bvbd|yEF7G~9g{qs9t}d?j{q*?pqr>5F*b)(k+-~cpcObStJ-N7g_B~(pYk%a2 z|KlI}D}VIfGtV6_?y7GIbSRKUrq92{?hyzMZf0veCOYO^6;Z?zV?yBcE5SCpB}b!+>Rt;+aT??*RdV0uI}u+YQMg^ zdVq-A>&N$>f7ji6U;e#+=Bq#Q(I0!^xi32PBZ$HV-4YR*LfPHxEZm5#eUh;#M2%mf zd-NFHl^K!IqH1T17Nx7bA9BI)`z+}@J7L6(5LLx3eHr1VtsYzc0)(u9ltJxi;su5<%G_`c;Cx<+z=g9^}0Wya%=>-j2M%xc*mft1V zE6ib|SBuJw0l%eWB3OGxge)a#!*w8R(o7?5!Sk&_Kn}SgmD^U*NS?Ha*KwjUh_W)o zngsVJDu7$26R13qXmK&&8D{+9$Z=-3z|9#PlOx2ZoH+og_ET(|W%?>7StkR%cZ+$5 zK^v{$>4q5&hOJEQLaTN#nCLo7It*BOn)F#Q(SGdgL)ZIq+P82}dVx!w%Vtt3}I zlm_09R>u}*Do18K$8CJBtD%JChTLa9p*p91S=nC{b^wYk=Ny{8bPnZ+s28!;u*rop zRj`-PDl%$sp(6sVQai2-fkd>$7#UcwoymuZCDi=H>KbdQOms~4>R#=9W(+OoriMj1 zBCpwMpI(<;ci>)WHi*iibOC!CMpNh)Xv!9c&QO>1v>JkrbDeb5g3C~bmIK88gsKkf zR=sI05OWm|vcvTO5V;`HA`@XKVq#{zNqO$}k>rKU(T5h#EU7 zff4B`cU@{A8OZJ;jkWsC@yGStuZ`JM@78K7A|P)Y)d1f@dJ!UHsn_Nb)MC-y!uyQ0 zb|9A6V}hydUFjW2Sz2b6z-bijdokS*=L@wyy45IwD{(Kzd52E-*|lg@02Cuty;p79 z#(=kGF$O(5iv^Qu&S}f=&MnAM6pSsZYeju@V5@4c(hNo<_iBJ!5R9r5IVuZg^zQ02 zVijL>K^Bw<61Ks+xMk*0a7$($3|nJEOGQTYL@H5Gs}teL^{ht`8WC)#U;$)1-wkTV zNC2Vrmf2M@<6o&S<4_w9d$s4wQW0$3wq(!-$vQP+imV4@A8D{H8m|S z@}xloBRZCm`jD1(>!xjq@H4ZVX5J=AGS=eoGG z@BdF;c<$ci#dG`VM%y;2eO2S=0$?QA4B#Y&ILN{fZvwDTbL2RH@A%Fy}NgYHXJ(o_V#u=90I(( zxkhk1ZhiX%apw!Z^qYR*zx`J~{3Czz#phm(JnUUWBKGJ_F?#eFr@+nWnFBt~K}>pW za_20>nB_zUo0bkSmPNv6*GXtak=us3G{@Z}2wf3dPebe?s%55pT9NHWFfl!h6t!i7 z?2?rwI*YSCC%s z9c}sOJOK}9rXJj_obi1lhi0k@nWocB_u_ns8_QkrHqJlLotK7aT~q9 z=N-+ClO+bQn3P zRYE$1m}D^7r=q9ho|oe3P}72xjEeTHU0sPlLcLhE8Q8{4>q+X|G}_@YW3`DyvZb!h zoE;I8Myp`RpCA<-##`YPaNxe53~Gnf(G!3KzWmC&J%<#OjHg5chj(j@Z`9|l)oKl! zFRgTmC@*O{6R%im$PvnMLIwqe8=WAjYVQ*Ez1^770IA?~S=q0)rI{3}%J?gVh_%K_ zXnEfXppFd9p9Z2M6BZ_7ZZ{eDT9tV$!%(#x?_Slx5iKm}a1`j_8T^^pK+%{5F>{Vb#Y_QNJl9oOz;5Bv_sGCj4 z1+HY}(MG6{o7+>r?mf{sL(RA6V?8Cm{LvMo?`o~cA&okajSBCM<(3Ql!P#o&9q3RqqibCJe&sSkHtlpZb2@8aeZ~GubD=}6 zo)a!7zZpabMLNlEhy*(=rf|&_3u@*zat107Ta~;7+c?l%)jYpQ6KF8}v;ArT099>0X?MkH zT?c+~K<2te7S%MHI05Z7k~XMo-x;H+VE-~8y$em{BG4tGws z*L$6ghs)!|;C;a z_wKw|`JV(*=2w+$d*LC$P@8u4xnA_S^- zO}oQ$J7he2LRCoAIevSQw^%4Ju$%%~A&VnypfvRDzy#^A66CLZ@l`8kKX#|c6q<9AD?Q!I2^a_^5*t&cU@jwRrU4FV?`X|KtS9NSNC;#bp7bf zFZzn#{!2giJ>UE1{?Ppg4~~aB4MkJfn+M9$K?9bN92?9o>s7-Ue}FGRMLI8zOPPu# zV#m-!EqEJc7wpr}T5HG&1F@@Nun$d&%Q)p$=!B*raDj4{Fxv$Th33X?HY$*wT__c` z#nx2{1>857I*uUCKiAaSW+awEW_iy%d@ZK6o50@fvh4)yfiRmW= z${hc|V@6flB(GE9`~0EZ<+go&YY!Ey#WEA)v+6MkEA3QrVTY+EEfUr8~9<0Mtg1v8MSPl7wxhQLgo9UE9h z(UO)}%aWJ+I3lYW-g`5Df}L9E*0}}Gh+vj#+7DXG>gHxRBd5v;I_-O4?LPKZ;zzvl zP7K5hG(X4`b34fRh4Y1dh~Ziu#N;KF#-H!kI^X9)4pwG*9V1!y|l| zc6bopnNMbhj`13(<`t!JuADS6oV9`@r>eatVhLecSl2EuVLY3Q;I^da=VG)R0mrMa zR?-1=SZSwVc=a2@A(}BV*iq5)RdA$NBDT!EQMG5Joj}o2I*>OYb(P?Lj-u4HVrEvCMW{@^z;@7hCxYB# z+==0zB(10vA>C7&8KG@e;nR1^_a zSc((O=12|fFlR=C63N1@B%#|=jYP#K&8d~`zOA8lmECK%er)N3f`NT6n_W3R2@NI$ zcJBa?MEe8A$lTTI^C=<}iE7RuKx?ruF^et;R=0vkdC}6u*^LHGZBMFwQiBG?q|JiK zU{<%Wrj;N7_{Fr})c}ZVPv(BwvCh%*_6R0G7cON>4Lm)eW^iqCn{{mNIOcJ8pGt>A z(rSaz3=cuqoN!~#Rz#Kr@3}N#W_(AZPS}{$Eyo<4`JPBL3dJ!HcN98mKpa6RL5-wf zJjw65Y6+}oS>uE`baync&9!baL|S5Ki+PCE6VGI>E>Mg^tPw?xbS@B7YfYh{o-MM` zwYLG!7ErzVMpy~zFO4Z^d-C|r+nXo<>>vEQ$GgwG@yUO5xVRJAn5e!zZpYhwKV)28 zJ$Q2c=+WbcTO1CD!@l3($gAVC*N@&hZkO-=!ms<$AO4U3=3o8y?>~Ea@7}v^PB%Q` zrVOw3&OErQ^KBaBd|NY0JM&Kq866h8TDd@6Se<~G42RM+T{ActGe^1YiWI=9MKZZH zdfwA?###rnQL6dMtj&ldH3E38^un=?a=&Ox|29wUiQAf{pjt(#YRS*ZV=lRhnw5S@B5N}^3iJ_{WJgN zuRrke?z7LSuF(fKkZwsvohC5g#JNIyqs;BL1$odDE>=*LWxXARPDVtOdfKGyE zTw+N|%4?p40CtUeuWNd80U30g>l=C!BP7OV5p(q}BL>D6{Gol3*BnR=T{!O*JWkJO zw47K&x23u`@hh_`#ToGK%dv6F+Hln1+j!cwV6`_3lr%o&?|sl!X*pbGyz-{Zfqep|9J)bHtYlG}wZ03z#3+;H zfM`vF1f0D|fPgNGY@M(qIg4fQl8%RMCZ*LkFOxWK1f>QM3Rz^OQs;<^ z{ROMk%t(dUz4yA}yU36;e_~ml+k6ogB&%6s4Y%Q=s_2!PSt@-M{Pxm^;vCZy8Wl|86a150*9*%W^ll6&WZ^<1Ir5 zOT}gxQ(zDwT8az_XkYi?P{uKWqJd#WMq~*v*ii2Xdu+H+RahM}n(Hok&tn1Gc32LX zv#$+7@|E|zSEiq=V*nRcKJKfS;R^8b5E!>JxxCn!)#i?wZ;SLcJI3jB8p%-uF-*JP z300Yrn77^!w`bi72(Ylk8A> z8ycEoOSuI+^M+?;V5x*13k`Q8Im>l8)rf0Wu~N}XkYSU9Y^Ijqz`#s&D^6xHSz7SD zJ6%I0e!JXF?eaNH4IDQCEoyBU1;Fw7Lr zJEE3Ysv-MTGfF(<;kDO3 z`o8ym=-a>Z@4oTy#~;7;dgRsR-HX1x*}HC@+>nRk#Ra+V6;&s7#df%N_wMPo_S$c6 z9x}EMeDJsa^iTe&zx@CCL)#UfyZ=6Iiv6~|H*>E(%;u2+;)KSM?-*WzKSwuW;{*rQ zUZu*+qzO;?#UG`m{c3LgyMqSi+3WB09f^fL`0@*{g+9Nh(*Uj~HS9@pxe5&3?1- za6BGb*p3m6>ziBQaC`ge%dh;J!_~8Y;=8_d-yc2y{QGX}I+-C`Vp01Z3}?s-?@+|d zjU*y0Sn8U|ilZ|z@154ZuZLhfz>R_Hp23TEBwCiZ7(*AFg&~+ei-C(Lg8a;&IBl?& zM8@X)UVXlav{9a{e`N3=j3n7@T&QXi3`SH?n$1lv{eztvYeBCJlLa|}SdozEbv)cT z_X4T{G0nW$duuZcW|MS03uN*Z!4_2BObh=k!?A>?uCpx%2Ev!^#-DM{b;fGos70br zQzJ#w+rEPizg}e$3(e@B4LNSBV`Bc15iYDj0n0)##=>4tCA2goEuqBO!G`Id)XapJ zAPx1eH82eG?dp-$v)LM_5Mo7Ku#ItJ@6no#*xGMx|`y=BY|@Nxor0F^{pry5*s zm*Mv1-hPS((mQdNCTCu0)6~A0dTtV|R2IW1gF5;DWu)*<21cVIRYT(DXcqLoOUj%K zao_tBcS92B0-YGLt`m~8UUN-2{zI*Inr?perjf%fcq-LQ?t=?^{Md4HV`j+H!6NJ# zuiQ!aVv*)eh_w;4*Ubp4wHruxru6MSqU&L2h{J z^a5NDkU7IY1WYawq;-C$rS#RnSPp4OLNWm`dOtPjx=?$^x?7r3d1ti`WP?bi`_5RA z?Sj-jUVC^|79w*PIP0FnUzI6tRw=27jcJ2p#roeYWN|KXMmFY&F90ln-7B2kOsi#{ zggF@)vWm+7Hn8@R1C`9(oUs=-w-~Hr@H%-~HK#A5C+?U>#Sj=bm>LcyHX;>^p6Yqc z1Z}y^3P{hx6Exu|1~U*0rM7^Zr*CYF^qL=^?xj)ldf~|;CZ;n>qaI+PH^i=*)K@`n z@HAJS)>$McVN`NL6DFwPoG41EYnA{uNUZf<^ahR5%ri318A_g!o=&tDJnZ`fqK7ll zhk7dmJ7-qGq@jDeA&luEeAYfh(2?%!0%ESJF^u`zqnVF#AWCGCxBH3GmYX$6;Z9#s zU2Qk#KnM^LYN^~oxQl}91JQyH%(qb85oatS(baPS&OcUF@KOQ{SurV4z^hZ8G7tM+r~S#D zd-r=U1_E*O%(OpwtM^Ot$UZxy!(s3?w5Y{d%yQD{DD%v@cjGLIQ30p15b_2 zxlVeKT?H_ib72~cUKf1N(Y74Sxv|sf4Q=mwYlnSIu^47G7I5wFU{c!VbsF{y^K`A* zotD%vP&&rCpW z5D-9DcgB_`;zmhO^QkN#_N-_bL7^$9aA4I<7bC7T4|ioPZ7!Vbv;EqVvt)vrK}2W_}1uYn(x6*?d>IDEJfkK@dQAt)m}J zYkABq)b{CJ@gT6y7O?ezn9O~v!z@IYvW@{a&acN@aUOm&J&T`?GA1Gq5IT^`+$faV z(s!+HcCgnB%7O$pNEl2Q>y@8x4(|Zyz+jhc!R|b!R7DVL->Cab_k2@O1{7KPiY*+> z?Lp7QBFSEcrKxx4_I{xf{witzQ24e%ji)jeRpTz{oSaI=#Bd{4l*zhnO~+c3)99G( zioOci0zB^-af_%Hs@pEt9DD|6=P@v(x8akXp?EPiM)aqiP&IRsp@Q?!3;?kAQh3@_ z!g)|yUnQ2tvMpum%!2^!duAe5s{*6TO>Q$S1EtOtpCQ;1p^^Le`yAN$yxMgPwpizc z^Y=E9i%kfq_v)dD;lB`(QZr%z;Wa5mP*Cq~kNmZo*dIbG8M5nnWSPEb?KXB9_H5{B zl-xohA@3BN_s#PSw2|U4(t(NfGwg1*zvbS_!{cHk%}3$<@Szc2gD=1G9v@3LeYPIE zj~~pY0jyoIF^q;8%?-)5(hM^RjF66mW8u7uUQbWpr0wk8nMAN_S0N%8loh60|50Wb zrUCi(>Qp@Dw#wpIjKs%5tB$U(Nm?0ZYrcz8BL=G3D zRw+1UUbB4NMhHe{?W(gyl+>*_6Gr9y-GNLTpxW)!Q6nWex6+~$M9Q(mGid?L(jGLZ z(E_&EK-7LRt2B2)SOW|!bR_&tr(>6vMr~Rsip{1{QIw#yGT4V5=KQ8-Y6wcw&$ZOs zjAUv}1PaZ>MX2_Oq)jH?Xmh$%(6H}XyvYR)wia=5GroLeY=xsaP(#R!T}|*1Az@#6dCLVJbow+V)l)M;P-Cj&?nKThJJSPM zO-Ry~1s7L2_F#mDvt%m}lQCy~SZIAySo1a?0&^{piu#Z@=;Ff8cxG z|H0q!sbBhm-ZKvu=-a&^Vc$=YaqsTEZq|M))m~4)i+gt;TpX{e`Q*{7jnn(SWXP!A6?m(wPI_s4PHH3YzC7nm7iE7L(W;cTdhh&ba|^Cv9tMR)@W8|8wpR$-^%aB4^P@wllDpMUk!kN5f~ zzWR55^Kbiqwob2o=BG)J31K@P_uK2*PZ0-2Z-uhTE0?URZp%iuDag3_rh1a z^zv8!mGAkspZ@Xhd*NO0>2R#ATET%NIk@4QCw64;4~BwfwMKQtdszK(zWtZ z!Zk0d8`YX5QcWTC<`CbJv9bq84KNdkk|@7;6QV8-9ytB!l#-@kU2?8wzag_ zricMOY2rc7hIE^;W#Vj77OGFJSi(6gl;V6ihA>>MOslnAF?tFs48=X)nMUyA*TF+& zm`j|wV1icsl^J#^?|*18oWtdB(+XWIIvQKLm+)j8je&GCXL>Q>Vinz;EIu)vw7 zf`6O;2&lTs`1HTV8HdxE+fpej6f+eU0)WjAI9TkUzlDk0w0RR9=L_t&) z-2(t~5fQTm3`V}Z%Y$LJIsk(xR-jlX&& z$V_XqXT6%bw0Z|mJ;YFuf-LnTAvALfIU$}ALaC3(L)S8kOY7RQ3%Iw#W|~O@9njuO zisl&@lK||7GcvR?uO?q*5C@OJ7G@D<3dB-nqOOQDbw|=B^@v zZA%cRl1wkq*TpE4JpJ6e?8V{gnde^s_tQ;BY{i`` z#VHu7p4A1@N`hF+QzOa=k|FKRR|%nf@o@Z(z2dOu>J}LYZ(uab+CBT`&xn?drIMqQ z0_=V7ND?p-z~6&xg@uX%iFgfz47L2_wHQ$=5PP6zT`{3Yz`I4T7ry;T~&{#5fGcs zW3&w>4ErPJA--vdj*CKN<4A zpiFNwoi^UprJ+Pxr|P^xl0i%x>uBKFsI#LtI2Og>VDKWX@D*IObk}s^U$0z>H4Pyc zRSmAe#-mWO&1A(~nNyuPRovk&PKQU^K1$U}b0_CaEO`)#s`gF~(eVWSUKi)#^4jHS zFIonvu{*ybSWBp(qWYYnD`-s8VH&|#7H5<9VuN4_F=i`eIflg!6VK{gl5o9)nRgX4 z)Vc;RjzWhozx-~7BbjWzV%0gWv0R^oQSbz!y9B0j4n$YmvgNS>zBScdhC`W2wK37G zmRAi;H{Fe3W&)-P+WT)sj0eEgOw(AIErLQ(Za#)XiY2C$O&dlF1`?7&F=4fy;r42d zk050^;o`5El#qy`&^3SJ-2X8yeG-`JZSKhT#D)Q7mkZNTMX2620w#=*mqR*F2m{QD6C8gSyvlLiJ*ITM zx)mD{Te@DE5{W<{_O5Pi86MJF8UdML*Z$gQ1*`m%)TB~_Zn`b3vn6Sg@w6uW`5l+i zbby#O*JB9o`G(hEWJ=i1N=D?iDv-K5jm6ND`;<|ONyeEl)H1^xm*H!S1AsF^Eb7SZ zGoSm|3(vpzpZ!BW_2}^@-hSibTU?RdrPz3Tx;@>TV8UP9<#A)?=ihqu`tg&?%e(g< zJP+mdlQ&z}@BYHCdghrg{_(&6$A93j{Hv#%e(>yb$IE;B?JZ)D*t*BqnB0W!+9S>> zx1gy|#tdCOnu^ZI+Di~4 zHm0D=*rC@y^XaBO_`z@emT&(r?;KzJ*`N7u^Yl0`-+g&uVMgBGJeGL4x`g(jz;nVPR6I7=6+ zsj@6#VP2X})|@~$!^l`WFV10m5KH^gI*dvaHrnP84J}z*HN>hRaJ3YMY3HpH#ulLk z+>GDHH>88-jNY#wvZ!SPM!{?f)ufQydHfAGvChepx+|FiZ8@Ey11}patmbRXE#~MJ zN{yi52KUmV_3|0AWHyxCOec=R%-(;-7!Pcn(p0%pQ`+*-kVB%U=dlLW5dfBswEHKk zk;e^yW}}kc)k_Cz+qi@FEULY<1_03-9_B*c820t9V4fb0j$%?c7K~_*|FR(9%zOqJ zOMWvG&9aDbVvyV)8cK4X$JlbE5kv#0pK z>4~+2<}GNjLX1fLqJp+tlL$n~HVjMb7dXpRzUCEx6bE za*X(LF>Wm|GP=*QPcNd&Zt=Xtuth5JAZsu@Zz&)*<^!{0)T@l(UUFb!#(A`5BrMml z*s&KDG9g~`1}z6FRj1uedAPh~q`0r^dd!G16QXLw`EI=iUc$nlM+O<~6nw36v0h%Y zt~@_!EScuu2BWBg5pS2kfU{o!b@#TV7W^?`d){Su#!N#t0I`eYV{3Xz>W^56btBsn71cE4k-2eopB?BB)f@mOTH5N}XvsU#^CsBqC zA$&?8TirP9$gtJEON~3)_pdVfI~{Dd!Yqt|Bn!YbWWi#b+N9+cU}o)wMQNEK;kpc0 z<+E&JffOEl-Sx{1>JXiV*+V!{huEtQpZm-wKlo+8@t^t5AN=fRfBf|Jr*3W=+$M%u z6l&X!r~USLyy#X4hr^|~i|E@vvF;onJh^%8;_~Xn_x#4UUi-uke&4_Lv0wWB!{Kmw z|Cxv*`UW~od097t8%rxOg!TRwK*ZSPpK?*IimRoU&ah05S_mZ8!JBssT23sjL3L(A z;|5ZVk{Co0*)$d*qWRWaubuXr`*$CF)3^PxU-f0*`TFNR^61eo?zeq)dG{hOZzc79 zd%D@X4-v=huzM+<+XzN?sl{yz#_4o@yy!3dlHc{=zx%)a8{hkXc;Ug_Yl^S` zkR+?6iSQVB(fPbabcW(VSe@#B&glo(VK=#Z%qsg>atTpA6Pow)=rV{#j~GB2`h8K` zOAQSgtu_U1Z4w1v*M!4$O4EUQL=e`M8}@Mt>b*HCP`|f1wNPzbYC4}$}T^=D~q08qAxrPm`L@o{( z;nveTNpX%n%o(A~eh=dbI3s)-^MzZDb&8NxFbMZEgRPD5WBjZ$De}^F*jiq5%fDkn&ee)A?dp&}q|uz)-DxwD=o*7`jQy^b?5+p{4ZFJPoNsxChZZt&IVl{ZYkPokg~FIDU(H-ZqLF)i7W&m2Lnl<9QP(26dT#0TDAw&5eKslm@8L zZZ(ms4WFz@2mBH6MDPAKBla$-53wn<@9hA}b%|mcVIeZ+uV-L$>)+PjGg!5AWm5t? z2RzmY!wmY189>eU;kj|j)I|PR4PkJD zw3>FH8--!vxqK)<`;N6pamJAajhPO%A3kJJ2uRCN?fEuRz^g*M9w|1INQfIrFbojL6(?AMMxIz2W(nzWljozvyQ^{9pah zfA?=cdieI`-OIc8UsCPRzLcTH3R!g;5CKmMa;tN8oVn-Wx@b)$mf4bE?6m__cWeht zmq1^<3wWHx(Z*2Gl^KH?S#D<%ss(oKI9%S_T92Q+`tZ@?!v((P>;K)a`MUpEm0tVo zFZA`B+r_h&7k5rKZ{O_KH#a+Ti&i(DdEvRtyng&PiVSO2}|pSyRsdJ*-wYu9$2cQIzDLph=dgk{B4@4J+-X{f~o$7?2*F+E^>1}<>!Q$T3XJWfVaP1W0E3dqVHpN=E6H_0F^s%(&TNB>HJ6aD4t7pU+%nrsHTZT{x18p7+Be$r153rq>4@97EI69X^4>lWx$ z4?Uan{mNnDy7 zpMx0n&rlIqtUM_&X&;Y?EW^}hb?0z9f-^R^IWt4LCpQV_{?D#fK`TqqS%W=rLsr*% z4>SM|NT=CUjaSDo1ScYOKp=mVg|ymb($!3)w<->ArDdp%8B`}TW0r-@Aljni;v%X$ z6g z+LEZr0PycM3cpkD`(B6K3|M$_w7iKEvaET59k=XEk`*btC7>`@fT6Nn?}j?0WX`zv zv&ROCg$2(~hKK|i(W*egouxr#U#RRvR-gRxT6sG^9g{;ch}M|qn>OV7RSF7qCZFwH zUvQw?sYS2QKv#BGH8~5sBQn$)5X*4}Rmf{jtw{{O7M9fAaFq zgWH?aVLKqB_dT{aY?~T4w>x^5v>kHquDZ=+#Mb+h%)6)Sw|TsJ_xu0J+sAMI=>PCX zf9mi3@l)&Gy{p6V#lwcZZ@M9;(m9)-kebX4c-u7Jfu**Bz5o$>?QUJq2_zODCb6`2 zKG1V{%>{E7*8nscWZa5Fr${;ki*fzv^AF#CoRMGi8~(+w`VIf{JI{RitDpVwyrYQF~6ReR%bJYHU2?x+3H!-se7-N6`#VqrH;Y!Kdh>(%=&y!fSG{LMe~{r}z% ze*b@T=kA^RcVE1|d6L2EU9rVjN#XW%NqmRDQ8(I(H4O&V+|i)MD$}jC=hY*VRT*oT zGMDIDfDmnZiipUZ?SVXxOSE{boHi&=z4JhwF<=}sbL*;^It=#OZnoVw5r^n8Z`#AGyKrm>QNz?bD=z*Yl4ZM1Ot$wX-vKs(T;Hk(>-f1T4Lv!j6Y zaz^&(7zkkX*kh~>hS7a$+~h_8d#!V@JV8QwQ#_V-z(kF;AsqF!v=R=WWe{9o$J9H^ z|2B1*X>G4!G>z7B|7n^ZEurXzi~u=70zn3&+Kohxf*a$y^+&CJy!DRW3U!TvWGTj0 z*ilSiy8D0cjI%<@lF;GLXQZU~(o3&s2rLjIOf+rZE?!L1lUWC|dS40vF78)DXGr## zubIy$WUYzwyQ~G)4QwVxWGte_c%azr{C-WHZ6Fk24{p40l-aB?7^*S6NZJZH6G+g7 z*a%(#E0Dnrh<`vklyeS>wJ0cd)Z{%G#quqo+_uwxf_rn$b?B-XlhG+URoUwXWqnkF z)IJ(yvb&4iY!LC96>B8sUYTykihIgBD``+(BNDJ3awsl$$%Br!jM2AcO*0tvsQ1QL z>}{2Z*xbp``Hg`F=ry5O0WanjYsK?>7+|;{4mxbm400>(kAK(>t*X<+SI0VMkvIq3 zj+h8h*kf9_#j7w{@)$b5ypiu7pS!ApL}st>AL|p>_~X&reXWFcb2IZO2apN7b@a4# z)3`=r4Xthqz2kO5d0pXKWjMd9z|7>n&ngYWHM!-q4ouU}6ZMDDl1?AIAZx!gjm}w@ z$aFq@a{4TT;P4(m zu@Kv}RtSw!F@g$512`$aNt++e_$j1;fu^Xrv(>hRYGDe2U{t%mvhWWDCn)pWQ8@y| zeml2(rIFZ?s6i7tcu>Ff*5@C7-8cVRU-ylF^fRyi{NvAmJaBk&`-qLm!_DoZtIG#O z#ui&9!0X44PN&<5JX~JhyLWHf4mZ~~*EbJ^zC1p7_N6blclUjt`Sj2Ky&wAbf8l5T zl2n(+`h|^)VoS&47P-}_B;DRTKJB+#ZirN$gt)po_G#bpn8&-1pS*E(`OHi2`?|mP zL;vpI`Wt`j+5694+)9N1zx+_=TM$k_L?vQVRJ%=sbi_>9h*JRT+zb4{PC@Y*6g z?U-pOaL{@!%!N6hW_kNoNsuOQeEAfK9F`kY@0<-Yw4pZ%Y43ujRU#8Z8+ZygmLds` zafa8%XyTL>TZX|&?J0$csLCEtr@E=0%vLVrXh04+FoZJ$*gl;(+W8? z+kM*lqRe_Opk?U?1+pA((*kx>d4{C3kn{M{mKv@ym&JD{aU8jF=9o zR8Y2?W{#1Zq}DQtR14~cCLWA0zw*ko6U*++CA|~X)yxQ^s+d1W7Sk_Y(-&SS1|*Os zQBp!GkZ_z7hEW`Vb@4yIJGMIvcQI9|T101N3$5~!0IaIvUiY1pD0BvL5NTSLfS4m! zozmvWX@gj?BIiL#K`CGV63}=qR>`rSq8LD=^YV^HQY~*XHAw zz~qJ$+KcuaVi5jKPWvgC+ZKDvaDB^Pj6C~jHVY-?2V_yJU6ck@3B;D z?>(#!L08unv%ST)V|WXJEK7wqV$-)2oot$dP8NmDNs5n5QBp{B8SU{E*H z3xPBhGK4_2LpKtEglgEu^^XNGDj&+XlZINZPc{C4*k+D)0^cWZqFr8B^$LTvSwX# zKKN#;7h4BnhFYBV6NqglI{~S=C*<-j4EaIAt8V6*FaTE9S@zqByj=t8@#QW~~?0YoQ_8wHwqP;Del8v2!arGm*Ka zVJ+5`FRzfFz)Tkf|I*`XG}brG_oCKawYh}(i_@RMKhmD;?wA+omLbKM0JTq&A7DHnwe{nvZJdst-|H2?wR%G;`D8}s3?mA?ZD)S^Cod2 zGpG3;$WLbg{p?+IEOYqJBF3%_v__ZHzREy)eRYOv!s6bsU@$Z*2Q{LErwyMZWv06| zoKaj1D7IqX0q<34d&kyj2ZYu)E}7>AT*g|mlC@#e!YPXyslCPz%3=d^vZj`)WAY$|2KD%98goC~V(Oiw~k`;T(+zy-Drcu{a zd%*ImX~pCy66c|4i-BqO-Z_$zA(MJ^-L$3<%hKwX#U(w~y)*(s%_2C1n`)(ZCu|HUogP}X5PP#*7M4};<3zBP4MpoCz z4QJ?g-Qg(0oCz|yA>K>ZWQ12-oOL?)(QWP79p!c9M+*^9wWo|~52<&?ki)z5&2}S~X(bib989g29fl^`E zd;0Qi9wdk=c^kJy zaTwiKTh5w@y-#2S)AOuvsS%Bv1c(?08RtLHA`4FEkBLAC4-)R$rxb)#h#cRB!FV`^ z088DCr7oVMZ?e_)C$$Z-GUhjl8qN8EoGTb+Pv%-)2v*C3mxA8T&@Dz&8!&`8DClr= z`?)8NZoc;G{>V4|j{o$HPyfS*uYc-z^+0jE<-N?@>va40@u_v(4!LFdU#HufIvuu) z%m}7>zqxs`<>7E~bvj++aJ>J_E3drt!8ad%>cfBcKmVzJ@W&rLd?SF%I~Vt^9%LRH z-BqM8ah`}~1l8%C2FqY4V0>AOP=ne{c)%2j|0B>{TW+mW?*fs>Kpn(7Zg;zHZudt| z9==&O%?;1K{Doinm4EnG|Jv_({`n7n`ZGWI`By)QZm|y+cWe;xbTp>b( zKquw>TS8OYOs8%=qpLDT_Tb~=YrAR>`+PC0-womU@^pVvPH*$i=_L+!7qWP7$zBIq zj6|wIbR!YULZ?QY4y$YYKQCv{aIJ8+?Ie3YHu+Kmk((oo+{Flp%-IIh)qvF=>05j6 zJ;NZHY%^6Lv7PborcAIz1{9ha?*^YMjRT}H$w>k$oUe=3;t`p_<-zArw$lzcNWh?; zJ=``+ri0+d}r{p0`*S+}!mPt=M9u;i!ey(yVUNC?#SR z8FcR*5!TtO&m-S#@go(;L6XtN`dvxgP)_4(a)XWvN6Wbj&Tm{`$A~s0XQLLFa<|o>(q2R>&&$EX1(U&4JTT+*QliWh*15WEkwRds7>&(PT zP+C$25ObN6BU9rvgqDAS2)0KK?%jO(<@Z{{;H-Z$Ew)FG&E(K6`X&zT+eb|l0j&YSUFcj zqwQcP)%5u4(MmFOGO<7e5ZU`F!lo;jM{^sUk<;6Bm#l1JMy9`avby1LN#@XiK$W=4 zr~6)dG*(CzOaYMu!EP^m@rXaAw%Za0nG6!8T98nXVXY+2aXPb~4FB^26jA^}2VvB?M@nCe9*VQx945Wu>%zW!n9%fXln?nP6qu%7-%>Z3qIXVCr zBZApP-P|^Gaoo&$uX~|mo<1bx7K~7-_p)qZG^1PcP}-Xm-k@Wky#nKGHa5(Z~n#8S|# zY#ooRCX+__-UYk5o3VwY+E0E*1?5JVEaXxf$#UL@h)^5O@@*&dd0_#-ZK$W+PY9E<4Ec|TF~EnPtIEo zjWF$y2lE-n`zhFAkON^#2SeS)Aj_(~NH7`7MGHXa$RrO>9=-MW(dWP7D}L{{eaD~v z-0MI8`Op097I%+_%RTmsi@Pe_+&szH_CD>mw^w)Wc4Oc7+@hr|wrztc$-Umbxw%bV z9516vcbq zLPdu2LZMw?=0UEsmSWC5=Rpjr0-M3ap$d6Cf_44);qBXR-IgNo%)8$8fnW7If7O@& z^RK-7Yh&Bq{QO7WdiV)kpSHvC`gXs#ygJ=HPG*tEZHvh2(-sGyPy1fG8mDc$Oh&5% z%EQJAM(yYfJ@?{=9-rR&zVH5yPk#0%pMB0_Xf)wA0>~7Eb0~pq zLIWTN$-|p{BcO7@^d>ka2S)_=!DX>dqKD9PY`MqLT#cd5Qc`(K!+^Pt4?||m5Dd&g zn$~2lfbo{XiPg*m${otG8%{gUNH5`|hF#ELV?$glK}9km_PyL@MH~S67x(4jzQ;V6 zaUuh7b7ggpG=%ViMYE4%10yL#hN1D%_JP46QAMh?Wh_mAd^`J%1i8{&ay*NZRDkul zfTcc<72#{q1ke2E8JLRcn0p26&D3)40<|{61yU>{o2HQ^Aj(+=4M&%PGMMGTinIA@ z)~ov~bj7fs$Jibsx_ga(?DYm}>7{4Cikh)O<(I0vs9=VRzQOO{=EZOry~_x`GQ6)2 z^H!~Q(xihhSs#$qX?_)1OS3Mh_Kpz-dur-w+gt)y_ZEzXP?OwHg^Zb!G%w9OXL2>w zJqUOBtJE+wP)|n-MTTV&F0v-XoLsBH{#UKW!s400v{`l#Skyp5L{)KVM%+S~jw7h< zUA5&lgiQ+ z$uU7YvEQJYrwX@0AiLT)-$4G$*Xm7s?HEy?<5=PJCKT8109lR%L~gLKZ<3X`fPNmf zt<{dEocC#k94@3>m|RX(RTzjM_nEXTA2t@vh5nng63EOA=yqTR>CwVtNYA^q7O=MM zq!|Zlet)Z<;TOfdR%Qrm@fS#7TvF!IcKXq$St_?7Ztr{!y0{{`Au=ZiqHu-+;G`l~ zu8DM>2o#^YXs*a~otwZ}&+EdJxq;5-n)f9$CQ*RFuIi4+Ca8kK`uE(@APS(T$9KIZWr!mj77pzV zsSn%1zo`3=nOh*#xgeTEWLJ%KmkMrJl)qC6O)KVR8$%1qNTMg0v{s^&zjc>uU*5A2 z&!uGKn#si4d@?u?!|Of_l6m?cc-(7KAd>rDO?R@McSZvaFVdbSWbuI>7mc_QrV~dR z?EL{HGQ`0`{407diKjxEKV@OPbef|%wb3NrKu;LQmOx@-Ky@+}sIc33O4vl>EmFjj zt#pnkj&R4hE&)z}4grc)lOPmhLhAt+tb?*isSB;$$ePQSM N(JCS2;qr9z`sZGM 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≶G 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�|XHCIv|KXNcGKh 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

)-lX6c#SR{o+l>YHgAr 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 diff --git a/frontend/deployed/logo512.png b/frontend/deployed/logo512.png deleted file mode 100644 index f59e129c714cbc69e5d324cfa4b6c740073814ec..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153023 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±9a{ZmT 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
*;r8|HedZ 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