jbrowse-plugin-graphgenomeviewer 8.8.2 → 9.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +6 -6
- package/dist/chunks/{AddTrackWorkflow-FANMD3WB.js → AddTrackWorkflow-3PX4I4DX.js} +2 -2
- package/dist/chunks/{AddTrackWorkflow-FANMD3WB.js.map → AddTrackWorkflow-3PX4I4DX.js.map} +2 -2
- package/dist/chunks/{GbzBaseSyntenyAdapter-NAXISJUH.js → GbzBaseSyntenyAdapter-YUT5RT7G.js} +2 -2
- package/dist/chunks/{GbzBaseSyntenyAdapter-NAXISJUH.js.map → GbzBaseSyntenyAdapter-YUT5RT7G.js.map} +2 -2
- package/dist/chunks/{GraphGenomeView-PPOVN5LA.js → GraphGenomeView-XFKLX3VQ.js} +2 -2
- package/dist/chunks/{GraphTrackSettingsDialog-BRTDTVOJ.js → GraphTrackSettingsDialog-KOYYI2XH.js} +2 -2
- package/dist/chunks/{HighlightColorDialog-CGW7J3SK.js → HighlightColorDialog-F4IARMEO.js} +2 -2
- package/dist/chunks/LinearGraphDisplay-BZ44C6S3.js +2 -0
- package/dist/chunks/MinigraphBubbleAdapter-2KIWDIY7.js +2 -0
- package/dist/chunks/MinigraphBubbleAdapter-2KIWDIY7.js.map +7 -0
- package/dist/chunks/RgfaTabixAdapter-7QKNUHKX.js +2 -0
- package/dist/chunks/RgfaTabixAdapter-7QKNUHKX.js.map +7 -0
- package/dist/chunks/{TrackWarningsDialog-23WL6FPV.js → TrackWarningsDialog-V5YSUFRO.js} +1 -1
- package/dist/chunks/{TrackWarningsDialog-23WL6FPV.js.map → TrackWarningsDialog-V5YSUFRO.js.map} +1 -1
- package/dist/chunks/WalkFormsAdapter-5NDOULY6.js +2 -0
- package/dist/chunks/WalkFormsAdapter-5NDOULY6.js.map +7 -0
- package/dist/chunks/WalkTabixSyntenyAdapter-KI7ESKKP.js +2 -0
- package/dist/chunks/WalkTabixSyntenyAdapter-KI7ESKKP.js.map +7 -0
- package/dist/chunks/{chunk-RS274NAD.js → chunk-3HSJ7SAT.js} +2 -2
- package/dist/chunks/{chunk-RS274NAD.js.map → chunk-3HSJ7SAT.js.map} +1 -1
- package/dist/chunks/chunk-42VF2CSA.js +4 -0
- package/dist/chunks/chunk-42VF2CSA.js.map +7 -0
- package/dist/chunks/{chunk-LFQFVYNY.js → chunk-47UWMS4O.js} +3 -3
- package/dist/chunks/chunk-47UWMS4O.js.map +7 -0
- package/dist/chunks/{chunk-MWQGJP3J.js → chunk-7PVPO366.js} +2 -2
- package/dist/chunks/{chunk-MWQGJP3J.js.map → chunk-7PVPO366.js.map} +1 -1
- package/dist/chunks/{chunk-SKB4GSET.js → chunk-AQSLN3RH.js} +2 -2
- package/dist/chunks/{chunk-SKB4GSET.js.map → chunk-AQSLN3RH.js.map} +1 -1
- package/dist/chunks/chunk-AXUXLPO3.js +6 -0
- package/dist/chunks/chunk-AXUXLPO3.js.map +7 -0
- package/dist/chunks/chunk-CJ4VON23.js +2 -0
- package/dist/chunks/chunk-CJ4VON23.js.map +7 -0
- package/dist/chunks/{chunk-AGUEPVOR.js → chunk-FQI75MV6.js} +1 -1
- package/dist/chunks/{chunk-AGUEPVOR.js.map → chunk-FQI75MV6.js.map} +1 -1
- package/dist/chunks/{chunk-FM4T47WH.js → chunk-HFBUC6GF.js} +2 -2
- package/dist/chunks/{chunk-FM4T47WH.js.map → chunk-HFBUC6GF.js.map} +1 -1
- package/dist/chunks/chunk-I2XBA4H7.js +9 -0
- package/dist/chunks/{chunk-EFXNCI7R.js.map → chunk-I2XBA4H7.js.map} +4 -4
- package/dist/chunks/chunk-KIURR66K.js +3 -0
- package/dist/chunks/chunk-KIURR66K.js.map +7 -0
- package/dist/chunks/{chunk-CHLLRNBQ.js → chunk-LQSOJR7D.js} +2 -2
- package/dist/chunks/{chunk-CHLLRNBQ.js.map → chunk-LQSOJR7D.js.map} +1 -1
- package/dist/chunks/chunk-M6YSANSW.js +2 -0
- package/dist/chunks/chunk-M6YSANSW.js.map +7 -0
- package/dist/chunks/{chunk-ZWHXVFZF.js → chunk-MPUAUZSJ.js} +1 -1
- package/dist/chunks/{chunk-ZWHXVFZF.js.map → chunk-MPUAUZSJ.js.map} +1 -1
- package/dist/chunks/{chunk-5HDIVUAZ.js → chunk-N4ZFGZDN.js} +2 -2
- package/dist/chunks/{chunk-5HDIVUAZ.js.map → chunk-N4ZFGZDN.js.map} +1 -1
- package/dist/chunks/{chunk-KBOVZ3GI.js → chunk-OSEQDKL3.js} +1 -1
- package/dist/chunks/{chunk-KBOVZ3GI.js.map → chunk-OSEQDKL3.js.map} +1 -1
- package/dist/chunks/{chunk-NSQ4VXKR.js → chunk-P76SUZFP.js} +3 -3
- package/dist/chunks/{chunk-NSQ4VXKR.js.map → chunk-P76SUZFP.js.map} +3 -3
- package/dist/chunks/{chunk-HKGTCZOL.js → chunk-R34FRICP.js} +4 -4
- package/dist/chunks/{chunk-HKGTCZOL.js.map → chunk-R34FRICP.js.map} +2 -2
- package/dist/chunks/chunk-SXMUGZXP.js +2 -0
- package/dist/chunks/chunk-SXMUGZXP.js.map +7 -0
- package/dist/chunks/chunk-T7NMFIRW.js +2 -0
- package/dist/chunks/chunk-T7NMFIRW.js.map +7 -0
- package/dist/chunks/chunk-TLUGH4VW.js +2 -0
- package/dist/chunks/{chunk-LKD5NRWR.js → chunk-VAWAASUT.js} +1 -1
- package/dist/chunks/{chunk-LKD5NRWR.js.map → chunk-VAWAASUT.js.map} +1 -1
- package/dist/chunks/chunk-Y4TLRGAC.js +2 -0
- package/dist/chunks/{chunk-EEWEXRY6.js.map → chunk-Y4TLRGAC.js.map} +3 -3
- package/dist/chunks/chunk-ZXJRZKWF.js +2 -0
- package/dist/chunks/chunk-ZXJRZKWF.js.map +7 -0
- package/dist/chunks/{executeDiagonalize-HZFFXMG4.js → executeDiagonalize-ZMW5BLEJ.js} +2 -2
- package/dist/chunks/{executeDiagonalize-HZFFXMG4.js.map → executeDiagonalize-ZMW5BLEJ.js.map} +1 -1
- package/dist/chunks/{renderSvg-UKXPWKKV.js → renderSvg-DLJTA2B3.js} +2 -2
- package/dist/jbrowse-plugin-graphgenomeviewer.esm.js +5 -5
- package/dist/jbrowse-plugin-graphgenomeviewer.esm.js.map +4 -4
- package/package.json +12 -12
- package/src/GraphAddTrackWorkflow/AddTrackWorkflow.test.tsx +4 -7
- package/src/GraphAddTrackWorkflow/AddTrackWorkflow.tsx +1 -1
- package/src/GraphAddTrackWorkflow/buildTrackConfig.ts +9 -6
- package/src/GraphGenomeView/model.test.ts +21 -8
- package/src/GraphGenomeView/pane/loadActions.ts +7 -2
- package/src/GraphGenomeView/pane/walkRowViews.ts +1 -1
- package/src/GraphGenomeView/walkRowGroups.test.ts +14 -3
- package/src/GraphGenomeView/walkRowGroups.ts +0 -22
- package/src/GraphGenomeView/walkRowsCut.ts +1 -0
- package/src/MinigraphBubbleAdapter/MinigraphBubbleAdapter.ts +5 -2
- package/src/RgfaTabixAdapter/RgfaTabixAdapter.test.ts +1 -1
- package/src/RgfaTabixAdapter/RgfaTabixAdapter.ts +16 -16
- package/src/RgfaTabixAdapter/configSchema.ts +16 -12
- package/src/RgfaTabixAdapter/test_data/walks7/build.sh +27 -0
- package/src/RgfaTabixAdapter/test_data/walks7/follow.GRCh38.gfa +35 -0
- package/src/RgfaTabixAdapter/test_data/walks7/follow.GRCh38.walks.gz +0 -0
- package/src/RgfaTabixAdapter/test_data/walks7/follow.GRCh38.walks.gz.idx +3 -0
- package/src/RgfaTabixAdapter/test_data/walks7/header.GRCh38.gfa +22 -0
- package/src/RgfaTabixAdapter/test_data/walks7/header.GRCh38.walks.gz +0 -0
- package/src/RgfaTabixAdapter/test_data/walks7/header.GRCh38.walks.gz.idx +3 -0
- package/src/RgfaTabixAdapter/test_data/walks7/inversion.GRCh38.gfa +15 -0
- package/src/RgfaTabixAdapter/test_data/walks7/inversion.GRCh38.walks.gz +0 -0
- package/src/RgfaTabixAdapter/test_data/walks7/inversion.GRCh38.walks.gz.idx +3 -0
- package/src/RgfaTabixAdapter/test_data/walks7/lanepairs.GRCh38.gfa +19 -0
- package/src/RgfaTabixAdapter/test_data/walks7/lanepairs.GRCh38.walks.gz +0 -0
- package/src/RgfaTabixAdapter/test_data/walks7/lanepairs.GRCh38.walks.gz.idx +3 -0
- package/src/RgfaTabixAdapter/test_data/walks7/maxnode.GRCh38.gfa +11 -0
- package/src/RgfaTabixAdapter/test_data/walks7/maxnode.GRCh38.walks.gz +0 -0
- package/src/RgfaTabixAdapter/test_data/walks7/maxnode.GRCh38.walks.gz.idx +3 -0
- package/src/RgfaTabixAdapter/test_data/walks7/rejoin.GRCh38.walks.gz +0 -0
- package/src/RgfaTabixAdapter/test_data/walks7/rejoin.GRCh38.walks.gz.idx +3 -0
- package/src/RgfaTabixAdapter/test_data/walks7/skip.GRCh38.gfa +23 -0
- package/src/RgfaTabixAdapter/test_data/walks7/skip.GRCh38.walks.gz +0 -0
- package/src/RgfaTabixAdapter/test_data/walks7/skip.GRCh38.walks.gz.idx +3 -0
- package/src/RgfaTabixAdapter/test_data/walks7/skipfollow.GRCh38.gfa +50 -0
- package/src/RgfaTabixAdapter/test_data/walks7/skipfollow.GRCh38.walks.gz +0 -0
- package/src/RgfaTabixAdapter/test_data/walks7/skipfollow.GRCh38.walks.gz.idx +3 -0
- package/src/RgfaTabixAdapter/test_data/walks7/skipinv.GRCh38.gfa +45 -0
- package/src/RgfaTabixAdapter/test_data/walks7/skipinv.GRCh38.walks.gz +0 -0
- package/src/RgfaTabixAdapter/test_data/walks7/skipinv.GRCh38.walks.gz.idx +3 -0
- package/src/RgfaTabixAdapter/test_data/walks7/twopart.GRCh38.gfa +22 -0
- package/src/RgfaTabixAdapter/test_data/walks7/twopart.GRCh38.walks.gz +0 -0
- package/src/RgfaTabixAdapter/test_data/walks7/twopart.GRCh38.walks.gz.idx +3 -0
- package/src/RgfaTabixAdapter/walkFiles.test.ts +131 -119
- package/src/RgfaTabixAdapter/walkReader.ts +36 -49
- package/src/WalkFormsAdapter/WalkFormsAdapter.test.ts +7 -28
- package/src/WalkFormsAdapter/WalkFormsAdapter.ts +4 -29
- package/src/WalkFormsAdapter/configSchema.ts +13 -13
- package/src/WalkFormsAdapter/formRows.test.ts +0 -7
- package/src/WalkFormsAdapter/formRows.ts +0 -12
- package/src/WalkFormsAdapter/formsMenu.test.ts +1 -1
- package/src/WalkTabixSyntenyAdapter/WalkTabixSyntenyAdapter.test.ts +54 -96
- package/src/WalkTabixSyntenyAdapter/WalkTabixSyntenyAdapter.ts +56 -152
- package/src/WalkTabixSyntenyAdapter/configSchema.ts +15 -16
- package/src/WalkTabixSyntenyAdapter/gbzParity.test.ts +5 -6
- package/src/WalkTabixSyntenyAdapter/walkLanes.ts +48 -142
- package/src/graphTrackConfig.test.ts +1 -1
- package/src/graphTrackDefaults/graphTrackDefaults.test.ts +7 -10
- package/src/launchFromGraph/syntenyTracks.test.ts +1 -1
- package/src/locationName.ts +2 -2
- package/src/panSNAliases/panSNAliases.test.ts +4 -6
- package/src/panSNTabix.test.ts +3 -23
- package/src/panSNTabix.ts +58 -34
- package/src/synteny/laneZoomNotice.test.ts +1 -0
- package/src/version.ts +1 -1
- package/dist/chunks/LinearGraphDisplay-2AZ7X7TK.js +0 -2
- package/dist/chunks/MinigraphBubbleAdapter-NR3MMUUG.js +0 -2
- package/dist/chunks/MinigraphBubbleAdapter-NR3MMUUG.js.map +0 -7
- package/dist/chunks/RgfaTabixAdapter-JDQLVQVP.js +0 -2
- package/dist/chunks/RgfaTabixAdapter-JDQLVQVP.js.map +0 -7
- package/dist/chunks/WalkFormsAdapter-YMQC3NLG.js +0 -2
- package/dist/chunks/WalkFormsAdapter-YMQC3NLG.js.map +0 -7
- package/dist/chunks/WalkTabixSyntenyAdapter-PBWN53PE.js +0 -2
- package/dist/chunks/WalkTabixSyntenyAdapter-PBWN53PE.js.map +0 -7
- package/dist/chunks/chunk-6VNDP3UB.js +0 -2
- package/dist/chunks/chunk-6VNDP3UB.js.map +0 -7
- package/dist/chunks/chunk-A27SW7X7.js +0 -2
- package/dist/chunks/chunk-A27SW7X7.js.map +0 -7
- package/dist/chunks/chunk-APSXG7SV.js +0 -2
- package/dist/chunks/chunk-DEWVJ57F.js +0 -4
- package/dist/chunks/chunk-DEWVJ57F.js.map +0 -7
- package/dist/chunks/chunk-EEWEXRY6.js +0 -2
- package/dist/chunks/chunk-EFXNCI7R.js +0 -9
- package/dist/chunks/chunk-EH5OCKSE.js +0 -3
- package/dist/chunks/chunk-EH5OCKSE.js.map +0 -7
- package/dist/chunks/chunk-GLSUAMGV.js +0 -3
- package/dist/chunks/chunk-GLSUAMGV.js.map +0 -7
- package/dist/chunks/chunk-LFQFVYNY.js.map +0 -7
- package/dist/chunks/chunk-QUDJ7AM3.js +0 -2
- package/dist/chunks/chunk-QUDJ7AM3.js.map +0 -7
- package/dist/chunks/chunk-T7LVVBTT.js +0 -2
- package/dist/chunks/chunk-T7LVVBTT.js.map +0 -7
- package/dist/chunks/chunk-ZBFIEBO6.js +0 -2
- package/dist/chunks/chunk-ZBFIEBO6.js.map +0 -7
- package/src/RgfaTabixAdapter/test_data/walks1_header.GRCh38.walks.bed.gz +0 -0
- package/src/RgfaTabixAdapter/test_data/walks1_header.GRCh38.walks.bed.gz.tbi +0 -0
- package/src/RgfaTabixAdapter/test_data/walks5_follow.GRCh38.walks.bed.gz +0 -0
- package/src/RgfaTabixAdapter/test_data/walks5_follow.GRCh38.walks.bed.gz.tbi +0 -0
- package/src/RgfaTabixAdapter/test_data/walks5_header.GRCh38.walks.bed.gz +0 -0
- package/src/RgfaTabixAdapter/test_data/walks5_header.GRCh38.walks.bed.gz.tbi +0 -0
- package/src/RgfaTabixAdapter/test_data/walks5_inversion.GRCh38.walks.bed.gz +0 -0
- package/src/RgfaTabixAdapter/test_data/walks5_inversion.GRCh38.walks.bed.gz.tbi +0 -0
- package/src/RgfaTabixAdapter/test_data/walks5_lanepairs.GRCh38.walks.bed.gz +0 -0
- package/src/RgfaTabixAdapter/test_data/walks5_lanepairs.GRCh38.walks.bed.gz.tbi +0 -0
- package/src/RgfaTabixAdapter/test_data/walks5_maxnode.GRCh38.walks.bed.gz +0 -0
- package/src/RgfaTabixAdapter/test_data/walks5_maxnode.GRCh38.walks.bed.gz.tbi +0 -0
- package/src/RgfaTabixAdapter/test_data/walks5_rejoin.GRCh38.walks.bed.gz +0 -0
- package/src/RgfaTabixAdapter/test_data/walks5_rejoin.GRCh38.walks.bed.gz.tbi +0 -0
- package/src/RgfaTabixAdapter/test_data/walks5_skip.GRCh38.walks.bed.gz +0 -0
- package/src/RgfaTabixAdapter/test_data/walks5_skip.GRCh38.walks.bed.gz.tbi +0 -0
- package/src/RgfaTabixAdapter/test_data/walks5_skipfollow.GRCh38.walks.bed.gz +0 -0
- package/src/RgfaTabixAdapter/test_data/walks5_skipfollow.GRCh38.walks.bed.gz.tbi +0 -0
- package/src/RgfaTabixAdapter/test_data/walks5_skipinv.GRCh38.walks.bed.gz +0 -0
- package/src/RgfaTabixAdapter/test_data/walks5_skipinv.GRCh38.walks.bed.gz.tbi +0 -0
- package/src/RgfaTabixAdapter/test_data/walks5_twopart.GRCh38.walks.bed.gz +0 -0
- package/src/RgfaTabixAdapter/test_data/walks5_twopart.GRCh38.walks.bed.gz.tbi +0 -0
- /package/dist/chunks/{GraphGenomeView-PPOVN5LA.js.map → GraphGenomeView-XFKLX3VQ.js.map} +0 -0
- /package/dist/chunks/{GraphTrackSettingsDialog-BRTDTVOJ.js.map → GraphTrackSettingsDialog-KOYYI2XH.js.map} +0 -0
- /package/dist/chunks/{HighlightColorDialog-CGW7J3SK.js.map → HighlightColorDialog-F4IARMEO.js.map} +0 -0
- /package/dist/chunks/{LinearGraphDisplay-2AZ7X7TK.js.map → LinearGraphDisplay-BZ44C6S3.js.map} +0 -0
- /package/dist/chunks/{chunk-APSXG7SV.js.map → chunk-TLUGH4VW.js.map} +0 -0
- /package/dist/chunks/{renderSvg-UKXPWKKV.js.map → renderSvg-DLJTA2B3.js.map} +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../node_modules/.pnpm/@jbrowse+bandage-core@
|
|
3
|
+
"sources": ["../../node_modules/.pnpm/@jbrowse+bandage-core@13.1.0/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-YUIKEUKY.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@13.1.0/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-G2FD7S3C.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@13.1.0/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-GQZVR5DW.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@13.1.0/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-ZXOELYF3.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@13.1.0/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-L4DBSRA2.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@13.1.0/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-UY7CLJNZ.js", "../../node_modules/.pnpm/@jbrowse+bandage-core@13.1.0/node_modules/@jbrowse/bandage-core/dist/chunks/chunk-OC5HU7M3.js"],
|
|
4
4
|
"sourcesContent": ["import {\n slideAt\n} from \"./chunk-JJV2GT2Z.js\";\n\n// src/renderer/walkLanes.ts\nvar THREAD_PX = 2;\nvar THREAD_GAP_PX = 1.5;\nvar SLOT_GAP_PX = 4;\nvar LANE_SMOOTHING_PX = 12;\nvar THREAD_REACH_PX = 64;\nvar THREAD_TAPER_PX = 24;\nvar MAX_BAND_PX = 48;\nvar PASSES_KEY = \"a thread per pass through a node\";\nvar threadsPasses = (walks) => walks.length > 1 && walks.some((w) => w.mostPasses > 1);\nvar threadsWidth = (threads) => threads * THREAD_PX + Math.max(0, threads - 1) * THREAD_GAP_PX;\nvar sum = (values) => values.reduce((a, b) => a + b, 0);\nfunction slotLayout(spans, mostPasses, laneWidth) {\n const widths = spans.map(\n (m, i) => mostPasses[i] > 1 ? threadsWidth(m) : laneWidth * Math.min(1, m)\n );\n let seen = 0;\n const gaps = spans.map((m) => {\n const share = Math.min(1, m);\n const gap = SLOT_GAP_PX * share * seen;\n seen = Math.max(seen, share);\n return gap;\n });\n return { widths, gaps, band: sum(widths) + sum(gaps) };\n}\nvar THREAD_PITCH_PX = THREAD_PX + THREAD_GAP_PX;\nfunction slotCentres(spans, mostPasses, held = spans) {\n const { widths, gaps, band } = slotLayout(spans, mostPasses, THREAD_PX);\n let at = -band / 2;\n return widths.map((width, i) => {\n at += gaps[i];\n const slack = mostPasses[i] > 1 ? Math.max(0, width - threadsWidth(held[i])) : 0;\n const centre = at + slack / 2 + THREAD_PX / 2;\n at += width;\n return centre;\n });\n}\nvar bandWidthPx = (mostPasses) => slotLayout(mostPasses, mostPasses, THREAD_PX).band;\nvar bandScale = (mostPasses) => Math.min(1, MAX_BAND_PX / (bandWidthPx(mostPasses) || 1));\nvar passesKey = (walks) => bandScale(walks.map((w) => w.mostPasses)) < 1 ? `${PASSES_KEY}, thinned to fit` : PASSES_KEY;\nfunction laneSlideAt(start, end, along) {\n const vector = ({ normal, offsetX: offsetX2 }) => ({\n dx: normal.nx * offsetX2,\n dy: normal.ny * offsetX2\n });\n const { dx, dy } = slideAt(vector(start), vector(end), along);\n const offsetX = Math.hypot(dx, dy);\n return offsetX > 0 ? { normal: { nx: dx / offsetX, ny: dy / offsetX }, offsetX } : { normal: { nx: 0, ny: 0 }, offsetX: 0 };\n}\nfunction pointIndex(run, p) {\n const i = run.stepOf[p];\n const k = p - run.starts[i];\n return run.forward[i] ? k : run.starts[i + 1] - run.starts[i] - 1 - k;\n}\nvar gapOf = (a, b) => {\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n return Math.sqrt(dx * dx + dy * dy);\n};\nfunction arcOf(run) {\n const s = new Float64Array(run.length);\n for (let i = 1; i < run.length; i++) {\n s[i] = s[i - 1] + gapOf(run[i - 1], run[i]);\n }\n return s;\n}\nfunction walkSteps(walkRoutes, nodePositions) {\n const seen = /* @__PURE__ */ new Set();\n return walkRoutes.map((routes) => {\n const visits = /* @__PURE__ */ new Map();\n return routes.map(\n (route) => route.map((id) => {\n const visit = visits.get(id) ?? 0;\n visits.set(id, visit + 1);\n const segments = nodePositions[id];\n const owned = !!segments?.length && !seen.has(id);\n if (owned) {\n seen.add(id);\n }\n return { id, visit, owned, segments };\n })\n );\n });\n}\nfunction laneRuns(steps, yToX, jump) {\n const runs = [];\n steps.forEach((pieces, walk) => {\n let total = 0;\n for (const piece of pieces) {\n for (const { segments } of piece) {\n total += segments?.length ?? 0;\n }\n }\n const xs = new Float64Array(total);\n const ys = new Float64Array(total);\n let at = 0;\n let from = 0;\n let run = fresh();\n function fresh() {\n return {\n walk,\n ids: [],\n visits: [],\n forward: [],\n owned: [],\n starts: [0]\n };\n }\n const breakRun = () => {\n if (run.ids.length) {\n const stepOf = new Int32Array(at - from);\n for (let i = 0; i < run.ids.length; i++) {\n stepOf.fill(i, run.starts[i], run.starts[i + 1]);\n }\n runs.push({\n ...run,\n xs: xs.subarray(from, at),\n ys: ys.subarray(from, at),\n stepOf\n });\n }\n run = fresh();\n from = at;\n };\n const gap = (x, y, p) => {\n const dx = p.x - x;\n const dy = p.y * yToX - y;\n return Math.sqrt(dx * dx + dy * dy);\n };\n for (const piece of pieces) {\n piece.forEach(({ id, visit, owned, segments }, k) => {\n if (!segments?.length) {\n breakRun();\n return;\n }\n const first = segments[0];\n const last = segments.at(-1);\n let forward;\n if (at > from) {\n const x = xs[at - 1];\n const y = ys[at - 1];\n const toFirst = gap(x, y, first);\n const toLast = gap(x, y, last);\n forward = toFirst <= toLast;\n if (Math.min(toFirst, toLast) > jump) {\n breakRun();\n }\n } else {\n const next = piece[k + 1]?.segments;\n const toNext = (p) => next?.length ? Math.min(\n gap(p.x, p.y * yToX, next[0]),\n gap(p.x, p.y * yToX, next.at(-1))\n ) : 0;\n forward = toNext(last) <= toNext(first);\n }\n run.ids.push(id);\n run.visits.push(visit);\n run.forward.push(forward);\n run.owned.push(owned);\n for (let j = 0; j < segments.length; j++) {\n const p = segments[forward ? j : segments.length - 1 - j];\n xs[at] = p.x;\n ys[at] = p.y * yToX;\n at++;\n }\n run.starts.push(at - from);\n });\n breakRun();\n }\n });\n return runs;\n}\nfunction ownedWindows(s, owned, margin) {\n const windows = [];\n for (let i = 0; i < owned.length; i++) {\n if (!owned[i]) {\n continue;\n }\n let j = i;\n while (j + 1 < owned.length && owned[j + 1]) {\n j++;\n }\n const last = windows.at(-1);\n const floor = last ? last[1] : 0;\n let lo = i;\n while (lo > floor && s[i] - s[lo - 1] <= margin) {\n lo--;\n }\n let hi = j;\n while (hi + 1 < s.length && s[hi + 1] - s[j] <= margin) {\n hi++;\n }\n if (last && lo <= last[1] + 1) {\n last[1] = hi;\n } else {\n windows.push([lo, hi]);\n }\n i = j;\n }\n return windows;\n}\nfunction smoothedNormals(run, reach) {\n const s = arcOf(run);\n const end = s.at(-1);\n const pointAt = (at, j) => {\n const a = run[j];\n const b = run[Math.min(j + 1, run.length - 1)];\n const span = s[Math.min(j + 1, run.length - 1)] - s[j];\n const f = span > 0 ? (at - s[j]) / span : 0;\n return { x: a.x + (b.x - a.x) * f, y: a.y + (b.y - a.y) * f };\n };\n let lo = 0;\n let hi = 0;\n return run.map((_, i) => {\n const back = Math.max(0, s[i] - reach / 2);\n const ahead = Math.min(end, s[i] + reach / 2);\n while (lo < run.length - 1 && s[lo + 1] <= back) {\n lo++;\n }\n while (hi < run.length - 1 && s[hi + 1] <= ahead) {\n hi++;\n }\n const a = pointAt(back, lo);\n const b = pointAt(ahead, hi);\n const len = gapOf(a, b);\n return len > 0 ? { nx: -(b.y - a.y) / len, ny: (b.x - a.x) / len } : void 0;\n });\n}\nfunction cutCurls(run, close, length) {\n const s = arcOf(run);\n const out = run.slice();\n const picks = [];\n s.forEach((at, k) => {\n const last = picks.at(-1);\n if (last === void 0 || at - s[last] >= close / 4) {\n picks.push(k);\n }\n });\n if (picks.at(-1) !== run.length - 1) {\n picks.push(run.length - 1);\n }\n let a = 0;\n while (a < picks.length) {\n const i = picks[a];\n let to = -1;\n for (let b = a + 1; b < picks.length && s[picks[b]] - s[i] <= length; b++) {\n const j2 = picks[b];\n if (s[j2] - s[i] > Math.PI * close && gapOf(run[i], run[j2]) <= close) {\n to = b;\n }\n }\n if (to < 0) {\n a++;\n continue;\n }\n const j = picks[to];\n const p = run[i];\n const q = run[j];\n for (let k = i + 1; k < j; k++) {\n const f = (s[k] - s[i]) / (s[j] - s[i]);\n out[k] = {\n ...run[k],\n x: p.x + (q.x - p.x) * f,\n y: p.y + (q.y - p.y) * f\n };\n }\n a = to;\n }\n return out;\n}\nfunction rounded(run, half) {\n const n = run.length;\n const s = arcOf(run);\n const end = s[n - 1];\n const sumW = new Float64Array(n + 1);\n const sumX = new Float64Array(n + 1);\n const sumY = new Float64Array(n + 1);\n for (let i = 0; i < n; i++) {\n const p = run[i];\n const w = (s[Math.min(i + 1, n - 1)] - s[Math.max(i - 1, 0)]) / 2;\n sumW[i + 1] = sumW[i] + w;\n sumX[i + 1] = sumX[i] + w * p.x;\n sumY[i + 1] = sumY[i] + w * p.y;\n }\n const out = new Array(n);\n let lo = 0;\n let hi = 0;\n for (let i = 0; i < n; i++) {\n const p = run[i];\n const reach = Math.min(half, s[i], end - s[i]);\n const from = s[i] - reach;\n const to = s[i] + reach + 1e-9 * (1 + end);\n while (lo < n && s[lo] < from) {\n lo++;\n }\n while (hi < n && s[hi] < to) {\n hi++;\n }\n const w = sumW[hi] - sumW[lo];\n out[i] = w > 0 ? { x: (sumX[hi] - sumX[lo]) / w, y: (sumY[hi] - sumY[lo]) / w } : { x: p.x, y: p.y };\n }\n return out;\n}\nfunction tightPoints(line, radius) {\n const n = line.length;\n const s = arcOf(line);\n const end = s[n - 1];\n const tight = new Uint8Array(n);\n const along = (j, at) => {\n const a = line[j];\n const b = line[j + 1];\n if (!b) {\n return a;\n }\n const span = s[j + 1] - s[j];\n const f = span > 0 ? (at - s[j]) / span : 0;\n return { x: a.x + (b.x - a.x) * f, y: a.y + (b.y - a.y) * f };\n };\n let lo = 0;\n let hi = 0;\n for (let i = 0; i < n; i++) {\n if (s[i] < radius || end - s[i] < radius) {\n continue;\n }\n while (lo + 1 < n && s[lo + 1] <= s[i] - radius) {\n lo++;\n }\n while (hi + 1 < n && s[hi + 1] <= s[i] + radius) {\n hi++;\n }\n const p = line[i];\n const a = along(lo, s[i] - radius);\n const b = along(hi, s[i] + radius);\n const twice = Math.abs(\n (b.x - a.x) * (p.y - a.y) - (b.y - a.y) * (p.x - a.x)\n );\n tight[i] = twice > 0 && gapOf(a, b) * gapOf(a, p) * gapOf(p, b) / (2 * twice) < radius ? 1 : 0;\n }\n return { tight, s };\n}\nfunction loosened(line, radius) {\n const out = line.slice();\n const { tight, s } = tightPoints(out, radius);\n let windows = ownedWindows(\n s,\n Array.from(tight, (t) => t > 0),\n 3 * radius\n );\n for (let pass = 0; pass < 8 && windows.length; pass++) {\n windows = windows.filter(([lo, hi]) => {\n const part = out.slice(lo, hi + 1);\n const local = tightPoints(part, radius);\n if (!local.tight.includes(1)) {\n return false;\n }\n const weight = windowMean(local.s, local.tight, radius);\n const smoother = rounded(part, radius);\n for (let k = 0; k < part.length; k++) {\n const w = Math.min(1, 3 * weight[k]);\n if (w > 0) {\n const p = part[k];\n const q = smoother[k];\n out[lo + k] = { x: p.x + (q.x - p.x) * w, y: p.y + (q.y - p.y) * w };\n }\n }\n return true;\n });\n }\n return out;\n}\nfunction runSigns(s, own, canonical, forward, settle, half) {\n const n = own.length;\n const agreement = new Float64Array(n);\n let hi = 0;\n let lo = 0;\n let sum2 = 0;\n let decided = 0;\n let pending = 0;\n for (let i = 0; i < n; i++) {\n while (hi < n && s[hi] - s[i] <= half) {\n const theirs = canonical(hi);\n const mine = own[hi];\n agreement[hi] = theirs && mine ? theirs.nx * mine.nx + theirs.ny * mine.ny : 0;\n sum2 += agreement[hi];\n hi++;\n }\n while (s[i] - s[lo] > half) {\n sum2 -= agreement[lo++];\n }\n if (Math.abs(sum2) > 1e-9) {\n decided = sum2 < 0 ? -1 : 1;\n }\n if (!decided) {\n continue;\n }\n for (; pending <= i; pending++) {\n settle(pending, decided);\n }\n }\n if (pending < n) {\n let along = 0;\n for (let k = 0; k < n; k++) {\n along += forward(k) ? 1 : -1;\n }\n for (; pending < n; pending++) {\n settle(pending, along < 0 ? -1 : 1);\n }\n }\n}\nfunction laneLines(runs, yToX, reach, band, smooth = true) {\n const turn = Math.max(reach, 2 * band);\n const curl = Math.PI * band;\n const context = smooth ? curl + 3 * band + turn / 2 : turn / 2;\n const frames = /* @__PURE__ */ new Map();\n const firsts = /* @__PURE__ */ new Map();\n const arcs = [];\n const stepFrames = [];\n const newFrame = (length) => ({\n normals: new Array(length),\n shifts: smooth ? new Array(length) : []\n });\n const place = (id, walk, visit, f) => {\n let byWalk = frames.get(id);\n if (!byWalk) {\n byWalk = [];\n frames.set(id, byWalk);\n }\n ;\n (byWalk[walk] ??= [])[visit] = f;\n };\n runs.forEach((run, r) => {\n const { walk, ids, visits, owned, starts, xs, ys, stepOf } = run;\n const steps = ids.length;\n const n = xs.length;\n const own = new Array(steps);\n for (let i = 0; i < steps; i++) {\n if (owned[i]) {\n own[i] = newFrame(starts[i + 1] - starts[i]);\n firsts.set(ids[i], { run: r, step: i, frame: own[i] });\n place(ids[i], walk, visits[i], own[i]);\n }\n }\n const raw = new Float64Array(n);\n for (let p = 1; p < n; p++) {\n const dx = xs[p] - xs[p - 1];\n const dy = ys[p] - ys[p - 1];\n raw[p] = raw[p - 1] + Math.sqrt(dx * dx + dy * dy);\n }\n const end = raw[n - 1];\n const firstRun = new Int32Array(steps).fill(-1);\n const firstStep = new Int32Array(steps);\n const firstFrame = new Array(steps);\n for (let i = 0; i < steps; i++) {\n const first = owned[i] ? void 0 : firsts.get(ids[i]);\n if (first) {\n firstRun[i] = first.run;\n firstStep[i] = first.step;\n firstFrame[i] = first.frame;\n }\n }\n const plus = new Int32Array(steps);\n const minus = new Int32Array(steps);\n for (let i = 0; i + 1 < steps; i++) {\n const same = firstRun[i] >= 0 && firstRun[i + 1] === firstRun[i];\n const d = same ? firstStep[i + 1] - firstStep[i] : 0;\n plus[i + 1] = plus[i] + (d === 1 ? 1 : 0);\n minus[i + 1] = minus[i] + (d === -1 ? 1 : 0);\n }\n const shared = new Array(steps);\n let reachFrom = 0;\n let reachTo = 0;\n for (let i = 0; i < steps; i++) {\n if (!smooth) {\n shared[i] = !owned[i];\n continue;\n }\n const from = raw[starts[i]] - context;\n const to = raw[starts[i + 1] - 1] + context;\n while (raw[reachFrom] < from) {\n reachFrom++;\n }\n while (reachTo + 1 < n && raw[reachTo + 1] <= to) {\n reachTo++;\n }\n const lo = stepOf[Math.max(0, reachFrom - 1)];\n const hi = stepOf[Math.min(n - 1, reachTo + 1)];\n const span = hi - lo;\n const forward = plus[hi] - plus[lo];\n const backward = minus[hi] - minus[lo];\n shared[i] = !owned[i] && from >= 0 && to <= end && span > 0 && (forward === span || backward === span);\n }\n for (let i = 0; i < steps; i++) {\n if (owned[i]) {\n continue;\n }\n const first = firstFrame[i];\n own[i] = !smooth && shared[i] ? first : shared[i] ? { normals: first.normals, shifts: first.shifts } : newFrame(first.normals.length);\n place(ids[i], walk, visits[i], own[i]);\n }\n stepFrames.push(own);\n const apart = new Array(n);\n for (let p = 0; p < n; p++) {\n apart[p] = !shared[stepOf[p]];\n }\n for (const [from, to] of ownedWindows(raw, apart, context)) {\n const points = [];\n for (let p = from; p <= to; p++) {\n points.push({ x: xs[p], y: ys[p] });\n }\n const line = smooth ? loosened(\n rounded(cutCurls(points, band / 2, curl), band / 2),\n band / 2\n ) : points;\n const normals = smoothedNormals(line, turn);\n runSigns(\n arcOf(line),\n normals,\n (k) => {\n const i = stepOf[from + k];\n return (owned[i] ? own[i] : firstFrame[i])?.normals[pointIndex(run, from + k)];\n },\n (k) => run.forward[stepOf[from + k]],\n (k, sign) => {\n const p = from + k;\n const i = stepOf[p];\n if (shared[i]) {\n return;\n }\n const index = pointIndex(run, p);\n const m = normals[k];\n own[i].normals[index] = m && (sign > 0 ? m : { nx: -m.nx, ny: -m.ny });\n if (smooth) {\n own[i].shifts[index] = {\n dx: line[k].x - points[k].x,\n dy: (line[k].y - points[k].y) / yToX\n };\n }\n },\n turn\n );\n }\n if (!smooth) {\n arcs.push(raw);\n return;\n }\n const s = new Float64Array(n);\n let px = 0;\n let py = 0;\n for (let p = 0; p < n; p++) {\n const shift = own[stepOf[p]].shifts[pointIndex(run, p)];\n const x = xs[p] + (shift?.dx ?? 0);\n const y = ys[p] + (shift?.dy ?? 0) * yToX;\n s[p] = p ? s[p - 1] + Math.sqrt((x - px) ** 2 + (y - py) ** 2) : 0;\n px = x;\n py = y;\n }\n arcs.push(s);\n });\n return { frames, arcs, stepFrames };\n}\nfunction windowed(s, v, half, sign) {\n const out = new Array(v.length);\n const deque = [];\n let head = 0;\n let next = 0;\n for (let i = 0; i < v.length; i++) {\n while (next < v.length && s[next] - s[i] <= half) {\n while (deque.length > head && sign * v[deque.at(-1)] <= sign * v[next]) {\n deque.pop();\n }\n deque.push(next++);\n }\n while (s[i] - s[deque[head]] > half) {\n head++;\n }\n out[i] = v[deque[head]];\n }\n return out;\n}\nfunction windowMean(s, v, half, counted = () => true) {\n const n = v.length;\n const sumW = new Float64Array(n + 1);\n const sumWV = new Float64Array(n + 1);\n for (let i = 0; i < n; i++) {\n const w = !counted(v[i]) ? 0 : n > 1 ? (s[Math.min(i + 1, n - 1)] - s[Math.max(i - 1, 0)]) / 2 : 1;\n sumW[i + 1] = sumW[i] + w;\n sumWV[i + 1] = sumWV[i] + w * v[i];\n }\n const out = new Float64Array(n);\n let lo = 0;\n let hi = 0;\n for (let i = 0; i < n; i++) {\n while (s[i] - s[lo] > half) {\n lo++;\n }\n while (hi < n && s[hi] - s[i] <= half) {\n hi++;\n }\n const w = sumW[hi] - sumW[lo];\n out[i] = w > 0 ? (sumWV[hi] - sumWV[lo]) / w : v[i];\n }\n return out;\n}\nvar ONE_THREAD = [0];\nfunction repeats(passes) {\n for (const p of passes.values()) {\n if (p > 1) {\n return true;\n }\n }\n return false;\n}\nfunction walkThreads(route, passes, nodePositions, yToX, reach) {\n if (!repeats(passes)) {\n return {\n span: passes,\n nodeThreads: /* @__PURE__ */ new Map(),\n threadPasses: /* @__PURE__ */ new Map(),\n threadAt: /* @__PURE__ */ new Map(),\n linkThreads: /* @__PURE__ */ new Map()\n };\n }\n const index = /* @__PURE__ */ new Map();\n const ids = [];\n const widths = [];\n const visits = [];\n const steps = [];\n const stepVisits = [];\n const stepWants = [];\n const stepGlides = [];\n for (const piece of route) {\n const points = [];\n const nodes = [];\n for (const id of piece) {\n let k = index.get(id);\n if (k === void 0) {\n k = ids.length;\n index.set(id, k);\n ids.push(id);\n widths.push(0);\n visits.push(0);\n }\n nodes.push(k);\n const segments = nodePositions[id];\n const mid = segments?.[Math.floor(segments.length / 2)];\n points.push(\n mid ? { x: mid.x, y: mid.y * yToX } : points.at(-1) ?? { x: 0, y: 0 }\n );\n }\n const s = arcOf(points);\n const p = piece.map((id) => passes.get(id) ?? 1);\n const most = windowed(s, p, reach / 2, 1);\n const copy = nodes.map((k) => ++visits[k]);\n const n = piece.length;\n const before = new Int32Array(n);\n let last = -1;\n for (let i = 0; i < n; i++) {\n last = p[i] === most[i] ? i : last;\n before[i] = last;\n }\n const after = new Int32Array(n);\n last = -1;\n for (let i = n - 1; i >= 0; i--) {\n last = p[i] === most[i] ? i : last;\n after[i] = last;\n }\n const wants = new Array(n);\n const glides = new Array(n).fill(NaN);\n for (let i = 0; i < n; i++) {\n const b = before[i];\n const a = after[i];\n const nearest = b < 0 ? a : a < 0 ? b : s[i] - s[b] <= s[a] - s[i] ? b : a;\n const want = (k) => Math.min(copy[k], most[i]) - 1;\n wants[i] = want(nearest);\n if (p[i] === 1 && b >= 0 && a >= 0 && want(a) !== want(b)) {\n const f = (s[i] - s[b]) / (s[a] - s[b] || 1);\n glides[i] = want(b) + (want(a) - want(b)) * f;\n }\n widths[nodes[i]] = Math.max(widths[nodes[i]], most[i]);\n }\n steps.push(nodes);\n stepVisits.push(copy);\n stepWants.push(wants);\n stepGlides.push(glides);\n }\n const taken = [];\n const threadOf = [];\n const free = (k, want) => {\n const width = widths[k];\n const own = taken[k] ??= /* @__PURE__ */ new Set();\n for (let d = 0; d < width; d++) {\n for (const c of [want - d, want + d]) {\n if (c >= 0 && c < width && !own.has(c)) {\n return c;\n }\n }\n }\n return want;\n };\n const glideOf = [];\n steps.forEach((nodes, piece) => {\n nodes.forEach((k, i) => {\n if (widths[k] > 1) {\n const glide = stepGlides[piece][i];\n const t = free(\n k,\n Number.isNaN(glide) ? stepWants[piece][i] : Math.round(glide)\n );\n taken[k].add(t);\n (threadOf[k] ??= [])[stepVisits[piece][i]] = t;\n if (!Number.isNaN(glide)) {\n ;\n (glideOf[k] ??= [])[t] = glide;\n }\n }\n });\n });\n const span = /* @__PURE__ */ new Map();\n const nodeThreads = /* @__PURE__ */ new Map();\n const threadPasses = /* @__PURE__ */ new Map();\n const threadAt = /* @__PURE__ */ new Map();\n ids.forEach((id, k) => {\n if (glideOf[k]) {\n threadAt.set(id, glideOf[k]);\n }\n span.set(id, widths[k]);\n nodeThreads.set(\n id,\n taken[k] ? [...taken[k]].sort((a, b) => a - b) : ONE_THREAD\n );\n const passOf = [];\n threadOf[k]?.forEach((thread, visit) => {\n passOf[thread] = visit - 1;\n });\n threadPasses.set(id, passOf);\n });\n const linkThreads = /* @__PURE__ */ new Map();\n steps.forEach((nodes, piece) => {\n const visit = stepVisits[piece];\n for (let i = 1; i < nodes.length; i++) {\n const from = nodes[i - 1];\n const to = nodes[i];\n const pair = [\n threadOf[from]?.[visit[i - 1]] ?? 0,\n threadOf[to]?.[visit[i]] ?? 0\n ];\n let ahead = linkThreads.get(ids[from]);\n if (!ahead) {\n ahead = /* @__PURE__ */ new Map();\n linkThreads.set(ids[from], ahead);\n }\n const list = ahead.get(ids[to]);\n if (!list) {\n ahead.set(ids[to], [pair]);\n } else if (!list.some(([a, b]) => a === pair[0] && b === pair[1])) {\n list.push(pair);\n }\n }\n });\n return { span, nodeThreads, threadPasses, threadAt, linkThreads };\n}\nfunction bandSpans(runs, arcs, spans, { reach, taper }) {\n const out = /* @__PURE__ */ new Map();\n runs.forEach((run, r) => {\n const s = arcs[r];\n const along = run.ids.map((_, i) => {\n const length = run.starts[i + 1] - run.starts[i];\n const middle = Math.floor(length / 2);\n return s[run.starts[i] + (run.forward[i] ? middle : length - 1 - middle)];\n });\n for (const [lo, hi] of ownedWindows(\n along,\n run.owned,\n reach / 2 + taper / 2\n )) {\n const at = along.slice(lo, hi + 1);\n const ids = run.ids.slice(lo, hi + 1);\n const eased = spans.map((own) => {\n const raw = ids.map((id) => own.get(id) ?? 0);\n return raw.every((v) => v === raw[0]) ? { slot: raw, held: raw } : {\n slot: windowMean(at, windowed(at, raw, reach / 2, 1), taper / 2),\n held: windowMean(at, raw, taper / 2, (v) => v > 0)\n };\n });\n ids.forEach((id, i) => {\n if (run.owned[lo + i]) {\n out.set(id, {\n slot: eased.map((e) => e.slot[i]),\n held: eased.map((e) => e.held[i])\n });\n }\n });\n }\n });\n return out;\n}\nfunction easeOffsets(runs, stepFrames, arcs, spans, passes, threads, half) {\n const plain = slotCentres(passes, passes);\n const byNode = /* @__PURE__ */ new Map();\n const centresAt = (id) => {\n let centres = byNode.get(id);\n if (!centres) {\n const own = spans.get(id);\n centres = own ? slotCentres(own.slot, passes, own.held) : plain;\n byNode.set(id, centres);\n }\n return centres;\n };\n runs.forEach((run, r) => {\n const { walk, ids, visits, starts } = run;\n const { threadPasses, threadAt } = threads[walk];\n const raw = new Float64Array(run.xs.length);\n ids.forEach((id, i) => {\n const thread = Math.max(0, threadPasses.get(id)?.indexOf(visits[i]) ?? 0);\n const place = threadAt.get(id)?.[thread] ?? thread;\n raw.fill(\n centresAt(id)[walk] + place * THREAD_PITCH_PX,\n starts[i],\n starts[i + 1]\n );\n });\n const eased = windowMean(arcs[r], raw, half);\n stepFrames[r].forEach((frame, i) => {\n const from = starts[i];\n const to = starts[i + 1];\n let constant = true;\n for (let p = from + 1; constant && p < to; p++) {\n constant = Math.abs(eased[p] - eased[from]) < 1e-9;\n }\n if (constant) {\n frame.offset = eased[from];\n return;\n }\n const offsets = new Array(to - from);\n for (let p = from; p < to; p++) {\n offsets[pointIndex(run, p)] = eased[p];\n }\n frame.offsets = offsets;\n });\n });\n}\nfunction liftLanes(walks, nodePositions, yToX, worldPerScreenPx, steps = walkSteps(\n walks.map((w) => w.route),\n nodePositions\n)) {\n const threaded = threadsPasses(walks);\n const passes = walks.map((w) => w.mostPasses);\n const reach = THREAD_REACH_PX * worldPerScreenPx;\n const runs = laneRuns(steps, yToX, LANE_SMOOTHING_PX * worldPerScreenPx);\n const band = bandWidthPx(passes) * (threaded ? bandScale(passes) : 1) * worldPerScreenPx;\n const lines = laneLines(\n runs,\n yToX,\n LANE_SMOOTHING_PX * worldPerScreenPx,\n band,\n threaded\n );\n const threads = threaded ? walks.map((w) => walkThreads(w.route, w.passes, nodePositions, yToX, reach)) : void 0;\n const spans = threads ? bandSpans(\n runs,\n lines.arcs,\n threads.map((t) => t.span),\n { reach, taper: THREAD_TAPER_PX * worldPerScreenPx }\n ) : void 0;\n if (spans && threads) {\n easeOffsets(\n runs,\n lines.stepFrames,\n lines.arcs,\n spans,\n passes,\n threads,\n THREAD_TAPER_PX / 2 * worldPerScreenPx\n );\n }\n const furthestShift = { dx: 0, dy: 0 };\n const seenShifts = /* @__PURE__ */ new Set();\n for (const byWalk of lines.frames.values()) {\n for (const { shifts } of byWalk.flat()) {\n if (seenShifts.has(shifts)) {\n continue;\n }\n seenShifts.add(shifts);\n for (const shift of shifts) {\n furthestShift.dx = Math.max(furthestShift.dx, Math.abs(shift?.dx ?? 0));\n furthestShift.dy = Math.max(furthestShift.dy, Math.abs(shift?.dy ?? 0));\n }\n }\n }\n return { lines, threads, spans, furthestShift };\n}\n\nexport {\n THREAD_PX,\n THREAD_GAP_PX,\n SLOT_GAP_PX,\n LANE_SMOOTHING_PX,\n THREAD_REACH_PX,\n THREAD_TAPER_PX,\n MAX_BAND_PX,\n PASSES_KEY,\n threadsPasses,\n THREAD_PITCH_PX,\n slotCentres,\n bandWidthPx,\n bandScale,\n passesKey,\n laneSlideAt,\n walkSteps,\n laneRuns,\n laneLines,\n walkThreads,\n bandSpans,\n liftLanes\n};\n", "// src/renderer/colorBits.ts\nfunction packAbgr(r, g, b, a) {\n return (a << 24 | b << 16 | g << 8 | r) >>> 0;\n}\nfunction abgrRed(c) {\n return c & 255;\n}\nfunction abgrGreen(c) {\n return c >>> 8 & 255;\n}\nfunction abgrBlue(c) {\n return c >>> 16 & 255;\n}\nfunction abgrAlpha(c) {\n return c >>> 24 & 255;\n}\nfunction abgrToCssRgba(c) {\n return `rgba(${abgrRed(c)},${abgrGreen(c)},${abgrBlue(c)},${abgrAlpha(c) / 255})`;\n}\nfunction normalizedRgbToCssRgba(c, alpha) {\n return `rgba(${Math.round(c[0] * 255)},${Math.round(c[1] * 255)},${Math.round(c[2] * 255)},${alpha})`;\n}\nfunction fadeAbgr(c, alpha) {\n return packAbgr(\n abgrRed(c),\n abgrGreen(c),\n abgrBlue(c),\n Math.round(abgrAlpha(c) * alpha)\n );\n}\nfunction brightenAbgr(c, factor) {\n const t = Math.max(0, 1 - 1 / factor);\n const lift = (v) => Math.round(v + (255 - v) * t);\n return packAbgr(\n lift(abgrRed(c)),\n lift(abgrGreen(c)),\n lift(abgrBlue(c)),\n abgrAlpha(c)\n );\n}\n\nexport {\n packAbgr,\n abgrRed,\n abgrGreen,\n abgrBlue,\n abgrAlpha,\n abgrToCssRgba,\n normalizedRgbToCssRgba,\n fadeAbgr,\n brightenAbgr\n};\n", "// src/referenceRampCss.ts\nvar REFERENCE_RAMP_MAX_HUE = 300;\nvar REFERENCE_RAMP_SATURATION = 0.7;\nvar REFERENCE_RAMP_LIGHTNESS = 0.5;\nfunction rampHueCss(hue) {\n return `hsl(${hue}, ${REFERENCE_RAMP_SATURATION * 100}%, ${REFERENCE_RAMP_LIGHTNESS * 100}%)`;\n}\nfunction rampHueAt(frac) {\n return Math.max(0, Math.min(1, frac)) * REFERENCE_RAMP_MAX_HUE;\n}\nfunction rampHue(bp, domain) {\n return rampHueAt((bp - domain.start) / (domain.end - domain.start));\n}\nvar HUE_STOP_DEG = 30;\nfunction rampStops({ start, bp, reversed }, domain) {\n const low = rampHue(start, domain);\n const high = rampHue(start + bp, domain);\n if (high - low < 1) {\n return [(low + high) / 2];\n }\n const n = Math.ceil((high - low) / HUE_STOP_DEG);\n return Array.from(\n { length: n + 1 },\n (_, i) => rampHue(start + bp * (reversed ? n - i : i) / n, domain)\n );\n}\nvar RAMP_GRADIENT_STOPS = Array.from({ length: 7 }, (_, i) => ({\n offset: i / 6,\n color: rampHueCss(i / 6 * REFERENCE_RAMP_MAX_HUE)\n}));\nvar RAMP_GRADIENT_CSS = `linear-gradient(to right, ${RAMP_GRADIENT_STOPS.map(\n (s) => `${s.color} ${s.offset * 100}%`\n).join(\", \")})`;\n\nexport {\n REFERENCE_RAMP_MAX_HUE,\n REFERENCE_RAMP_SATURATION,\n REFERENCE_RAMP_LIGHTNESS,\n rampHueCss,\n rampHueAt,\n rampHue,\n rampStops,\n RAMP_GRADIENT_STOPS,\n RAMP_GRADIENT_CSS\n};\n", "import {\n weakMemo\n} from \"./chunk-HMXCN6PG.js\";\nimport {\n edgeCurvesOf\n} from \"./chunk-TJLERGAI.js\";\n\n// src/util/edgeCurves.ts\nvar cache = weakMemo();\nfunction baseEdgeCurves(nodePositions, graph, axis, deletions, version, routes, stranded = false) {\n return cache(\n nodePositions,\n [graph, axis.scaleX, axis.scaleY, deletions, routes, stranded, version],\n () => {\n const curves = /* @__PURE__ */ new Map();\n for (let ei = 0; ei < graph.edges.length; ei++) {\n const bypassed = deletions?.get(ei);\n const edgeCurves = edgeCurvesOf(\n nodePositions,\n graph.edges[ei],\n axis,\n bypassed,\n bypassed && routes?.[ei],\n stranded\n );\n if (edgeCurves) {\n curves.set(ei, edgeCurves);\n }\n }\n return curves;\n }\n );\n}\n\nexport {\n baseEdgeCurves\n};\n", "import {\n pushTo\n} from \"./chunk-BSOZW3FC.js\";\nimport {\n isBackbone\n} from \"./chunk-RJWPJCIB.js\";\n\n// src/referenceSpan.ts\nvar MAX_BACKBONE_HOPS = 4;\nfunction buildNeighbors(graph) {\n const neighbors = /* @__PURE__ */ new Map();\n for (const edge of graph.edges) {\n pushTo(neighbors, edge.from, edge.to);\n pushTo(neighbors, edge.to, edge.from);\n }\n return neighbors;\n}\nfunction flankingSpan({\n nodeId,\n nodeById,\n neighbors\n}) {\n const seen = /* @__PURE__ */ new Set([nodeId]);\n let frontier = [nodeId];\n let minEnd = Infinity;\n let maxStart = -Infinity;\n for (let hop = 0; hop < MAX_BACKBONE_HOPS && frontier.length > 0; hop++) {\n const next = [];\n for (const id of frontier) {\n const adjacent = neighbors.get(id);\n if (adjacent) {\n for (const neighborId of adjacent) {\n if (!seen.has(neighborId)) {\n seen.add(neighborId);\n const neighbor = nodeById.get(neighborId);\n if (neighbor && isBackbone(neighbor)) {\n minEnd = Math.min(minEnd, neighbor.stable.start + neighbor.length);\n maxStart = Math.max(maxStart, neighbor.stable.start);\n } else {\n next.push(neighborId);\n }\n }\n }\n }\n }\n frontier = next;\n }\n return minEnd === Infinity ? void 0 : {\n start: Math.min(minEnd, maxStart),\n end: Math.max(minEnd, maxStart)\n };\n}\nfunction nodeReferenceSpan({\n nodeId,\n nodeById,\n neighbors\n}) {\n const node = nodeById.get(nodeId);\n return node === void 0 ? void 0 : isBackbone(node) ? { start: node.stable.start, end: node.stable.start + node.length } : flankingSpan({ nodeId, nodeById, neighbors });\n}\nfunction referenceMidpoints(graph) {\n const nodeById = new Map(graph.nodes.map((node) => [node.id, node]));\n const neighbors = buildNeighbors(graph);\n const midpoints = /* @__PURE__ */ new Map();\n for (const node of graph.nodes) {\n const span = nodeReferenceSpan({ nodeId: node.id, nodeById, neighbors });\n if (span) {\n midpoints.set(node.id, (span.start + span.end) / 2);\n }\n }\n return midpoints;\n}\nfunction referencePositions(graph) {\n const positions = referenceMidpoints(graph);\n const neighbors = buildNeighbors(graph);\n let frontier = [...positions.keys()];\n while (frontier.length > 0) {\n const next = [];\n for (const id of frontier) {\n for (const neighborId of neighbors.get(id) ?? []) {\n if (!positions.has(neighborId)) {\n positions.set(neighborId, positions.get(id));\n next.push(neighborId);\n }\n }\n }\n frontier = next;\n }\n return positions;\n}\n\nexport {\n buildNeighbors,\n nodeReferenceSpan,\n referenceMidpoints,\n referencePositions\n};\n", "import {\n THREAD_PITCH_PX,\n THREAD_PX,\n bandScale,\n bandWidthPx,\n liftLanes,\n slotCentres,\n threadsPasses,\n walkSteps\n} from \"./chunk-YUIKEUKY.js\";\nimport {\n abgrToCssRgba,\n fadeAbgr,\n packAbgr\n} from \"./chunk-G2FD7S3C.js\";\nimport {\n REFERENCE_RAMP_LIGHTNESS,\n REFERENCE_RAMP_SATURATION,\n rampHueAt\n} from \"./chunk-GQZVR5DW.js\";\nimport {\n nodeWidthPx,\n walkLaneWidthPx,\n widthNorm\n} from \"./chunk-XWH4LB56.js\";\nimport {\n PATH_LIGHTNESS,\n PATH_SATURATION,\n nameHue,\n pathHueAt\n} from \"./chunk-KKYPJITI.js\";\nimport {\n baseEdgeCurves\n} from \"./chunk-ZXOELYF3.js\";\nimport {\n referenceMidpoints\n} from \"./chunk-L4DBSRA2.js\";\nimport {\n weakMemo\n} from \"./chunk-HMXCN6PG.js\";\nimport {\n dashSpans,\n pathRibbonOffsets,\n polylinePx,\n slideCurves,\n strandSides,\n translateCurves,\n yToXOf\n} from \"./chunk-JJV2GT2Z.js\";\nimport {\n pushTo\n} from \"./chunk-BSOZW3FC.js\";\nimport {\n isBackbone\n} from \"./chunk-RJWPJCIB.js\";\nimport {\n busiestEdge,\n edgeWidthFactor\n} from \"./chunk-DAEEMZ74.js\";\n\n// src/renderer/GeometryBuilder.ts\nvar EDGE_DEFAULT_COLOR = packAbgr(119, 119, 119, 217);\nvar EDGE_PATH_FALLBACK_COLOR = packAbgr(136, 136, 136, 217);\nvar EDGE_DELETION_COLOR = packAbgr(24, 24, 28, 240);\nvar DELETION_THICKNESS_FACTOR = 2.2;\nvar LIFT_BACKDROP_COLOR = packAbgr(160, 160, 160, 255);\nvar FADED_ALPHA = 0.18;\nvar MOVED_ALPHA = 0.45;\nvar LIFT_BACKDROP_CSS = abgrToCssRgba(\n fadeAbgr(LIFT_BACKDROP_COLOR, FADED_ALPHA)\n);\nvar DELETION_DASH_PX = 11;\nvar MIN_PATH_STRIPE_PX = 1.2;\nvar MIN_SCALE_FOR_OFFSET = 1e-6;\nvar ARROW_LENGTH_BASE_PX = 7;\nvar ARROW_LENGTH_PER_EDGE_PX = 3;\nvar ARROW_HALF_WIDTH_BASE_PX = 3;\nvar ARROW_HALF_WIDTH_PER_EDGE_PX = 1.5;\nvar MIN_LINK_HEADS = 3;\nvar MIN_ARROW_FIT = 0.5;\nvar MIN_ARROW_SCALE = 0.45;\nvar ARROW_CURVE_STEPS = 12;\nvar ABUTTING_PX = 1e-6;\nvar walkX = new Float64Array(64);\nvar walkY = new Float64Array(64);\nvar walkPx = new Float64Array(64);\nfunction backFromEnd(curves, scale, yToX, untilPx) {\n const most = curves.length * ARROW_CURVE_STEPS + 1;\n if (walkX.length < most) {\n walkX = new Float64Array(most);\n walkY = new Float64Array(most);\n walkPx = new Float64Array(most);\n }\n const last = curves[curves.length - 1];\n walkX[0] = last.x1;\n walkY[0] = last.y1;\n walkPx[0] = 0;\n let n = 1;\n let px = 0;\n for (let ci = curves.length - 1; ci >= 0 && px < untilPx; ci--) {\n const c = curves[ci];\n for (let k = 1; k <= ARROW_CURVE_STEPS && px < untilPx; k++) {\n const t = 1 - (k / ARROW_CURVE_STEPS) ** 2;\n const u = 1 - t;\n const a = u * u * u;\n const b = 3 * u * u * t;\n const d = 3 * u * t * t;\n const e = t * t * t;\n const x = a * c.x0 + b * c.cx0 + d * c.cx1 + e * c.x1;\n const y = a * c.y0 + b * c.cy0 + d * c.cy1 + e * c.y1;\n px += Math.hypot(x - walkX[n - 1], (y - walkY[n - 1]) * yToX) * scale;\n walkX[n] = x;\n walkY[n] = y;\n walkPx[n] = px;\n n++;\n }\n }\n return n;\n}\nfunction walkPointAt(n, px) {\n let i = 1;\n while (i < n - 1 && walkPx[i] < px) {\n i++;\n }\n const from = walkPx[i - 1];\n const to = walkPx[i];\n const f = to > from ? Math.min(1, Math.max(0, (px - from) / (to - from))) : 0;\n return {\n x: walkX[i - 1] + (walkX[i] - walkX[i - 1]) * f,\n y: walkY[i - 1] + (walkY[i] - walkY[i - 1]) * f\n };\n}\nfunction arrowheadFor({\n curves,\n edgeHalfWidth,\n nodeHalfWidth,\n scale,\n yToX,\n color,\n fromSegments,\n toSegments\n}) {\n const length = ARROW_LENGTH_BASE_PX + ARROW_LENGTH_PER_EDGE_PX * edgeHalfWidth;\n const n = backFromEnd(\n curves,\n scale,\n yToX,\n nodeHalfWidth + MIN_LINK_HEADS * length\n );\n const lengthPx = walkPx[n - 1];\n const abutting = lengthPx < ABUTTING_PX;\n const inset = Math.min(nodeHalfWidth, lengthPx);\n const fit = abutting ? Math.min(1, polylinePx(fromSegments, scale, scale * yToX) / length) : 1;\n if (abutting ? fit < MIN_ARROW_FIT : lengthPx < MIN_LINK_HEADS * length) {\n return void 0;\n }\n const tip = walkPointAt(n, inset);\n const base = walkPointAt(n, inset + length * fit);\n const dx = tip.x - base.x;\n const dy = (tip.y - base.y) * yToX;\n const last = curves[curves.length - 1];\n return {\n x: tip.x,\n y: tip.y,\n angle: Math.hypot(dx, dy) > 0 ? Math.atan2(dy, dx) : endTangent(last, yToX, intoDirection(last, toSegments)),\n length: length * fit,\n halfWidth: (ARROW_HALF_WIDTH_BASE_PX + ARROW_HALF_WIDTH_PER_EDGE_PX * edgeHalfWidth) * fit,\n color\n };\n}\nvar FIRST_THREADS = [[0, 0]];\nvar ONE_PASS = [0];\nvar NO_SHIFT = { dx: 0, dy: 0 };\nfunction nearerStart(at, segments, yToX) {\n const gap = (p) => Math.hypot(p.x - at.x, (p.y - at.y) * yToX);\n return gap(segments[0]) < gap(segments.at(-1));\n}\nfunction leavesStart(edge, segments, first, stranded, yToX) {\n return stranded ? strandSides(edge).from === \"start\" : nearerStart({ x: first.x0, y: first.y0 }, segments, yToX);\n}\nfunction intoDirection(last, toSegments) {\n if (toSegments.length < 2) {\n return void 0;\n }\n const first = toSegments[0];\n const final = toSegments[toSegments.length - 1];\n const atStart = Math.hypot(last.x1 - first.x, last.y1 - first.y) <= Math.hypot(last.x1 - final.x, last.y1 - final.y);\n return atStart ? { from: first, to: toSegments[1] } : { from: final, to: toSegments[toSegments.length - 2] };\n}\nfunction normal(a, b) {\n if (!a || !b) {\n return void 0;\n }\n const dx = b.x - a.x;\n const dy = b.y - a.y;\n const len = Math.hypot(dx, dy);\n return len > 0 ? { nx: -dy / len, ny: dx / len } : void 0;\n}\nvar MITRE_LIMIT = 0.1;\nvar LONGEST_NORMAL = 1 / Math.sqrt(MITRE_LIMIT);\nfunction pointNormalsOf(rawPoints, yToX = 1) {\n const points = yToX === 1 ? rawPoints : rawPoints.map((p) => ({ x: p.x, y: p.y * yToX }));\n return points.map((p, i) => {\n const before = normal(points[i - 1], p);\n const after = normal(p, points[i + 1]);\n if (before && after) {\n const nx = (before.nx + after.nx) / 2;\n const ny = (before.ny + after.ny) / 2;\n const dot = before.nx * nx + before.ny * ny;\n return dot > MITRE_LIMIT ? { nx: nx / dot, ny: ny / dot } : { nx, ny };\n }\n return before ?? after ?? { nx: 0, ny: 0 };\n });\n}\nfunction offsetPolyline(points, normals, distance, yToX = 1) {\n const out = new Array(points.length);\n for (let i = 0; i < points.length; i++) {\n const d = typeof distance === \"number\" ? distance : distance[i];\n out[i] = {\n x: points[i].x + normals[i].nx * d,\n y: points[i].y + normals[i].ny * d / yToX\n };\n }\n return out;\n}\nfunction hslToRgb(h, s, l) {\n const c = (1 - Math.abs(2 * l - 1)) * s;\n const x = c * (1 - Math.abs(h / 60 % 2 - 1));\n const m = l - c / 2;\n let r = 0;\n let g = 0;\n let b = 0;\n if (h < 60) {\n r = c;\n g = x;\n } else if (h < 120) {\n r = x;\n g = c;\n } else if (h < 180) {\n g = c;\n b = x;\n } else if (h < 240) {\n g = x;\n b = c;\n } else if (h < 300) {\n r = x;\n b = c;\n } else {\n r = c;\n b = x;\n }\n return [r + m, g + m, b + m];\n}\nfunction packHsl(h, s, l, a = 1) {\n const [r, g, b] = hslToRgb(h, s, l);\n return packAbgr(\n Math.round(r * 255),\n Math.round(g * 255),\n Math.round(b * 255),\n Math.round(a * 255)\n );\n}\nvar DEPTH_GRADIENT = [\n [68, 1, 84],\n [59, 82, 139],\n [33, 145, 140],\n [94, 201, 98],\n [253, 231, 37]\n];\nvar STABLE_RANK_GRADIENT = [\n [237, 137, 44],\n [158, 42, 122]\n];\nvar NODE_LENGTH_GRADIENT = [\n [220, 50, 50],\n [50, 120, 220]\n];\nfunction sampleGradient(stops, t) {\n const pos = Math.max(0, Math.min(1, t)) * (stops.length - 1);\n const i = Math.min(stops.length - 2, Math.floor(pos));\n const f = pos - i;\n const a = stops[i];\n const b = stops[i + 1];\n return packAbgr(\n Math.round(a[0] + (b[0] - a[0]) * f),\n Math.round(a[1] + (b[1] - a[1]) * f),\n Math.round(a[2] + (b[2] - a[2]) * f),\n 255\n );\n}\nfunction hashColor(str, alpha) {\n return packHsl(nameHue(str), PATH_SATURATION, PATH_LIGHTNESS, alpha);\n}\nvar REFERENCE_RAMP_ALT_RGB = [60, 65, 72];\nvar REFERENCE_RAMP_ALT_COLOR = packAbgr(...REFERENCE_RAMP_ALT_RGB, 255);\nvar REFERENCE_RAMP_ALT_CSS = `rgb(${REFERENCE_RAMP_ALT_RGB.join(\", \")})`;\nfunction rampFraction(node, ramp) {\n const mid = ramp.midpoints.get(node.id);\n return isBackbone(node) && mid !== void 0 ? (mid - ramp.start) / ramp.span : void 0;\n}\nfunction computeReferenceRamp(graph, domain) {\n const midpoints = referenceMidpoints(graph);\n if (domain && domain.end > domain.start) {\n return {\n start: domain.start,\n span: domain.end - domain.start,\n midpoints\n };\n }\n let min = Infinity;\n let max = -Infinity;\n for (const mid of midpoints.values()) {\n min = Math.min(min, mid);\n max = Math.max(max, mid);\n }\n return {\n start: min === Infinity ? 0 : min,\n span: max > min ? max - min : 1,\n midpoints\n };\n}\nfunction computeColorSchemeRange(graph, referenceRamp) {\n let minDepth = Infinity;\n let maxDepth = -Infinity;\n let minLength = Infinity;\n let maxLength = -Infinity;\n let maxRank = 0;\n for (const n of graph.nodes) {\n if (n.stable !== void 0 && n.stable.rank > maxRank) {\n maxRank = n.stable.rank;\n }\n if (n.depth < minDepth) {\n minDepth = n.depth;\n }\n if (n.depth > maxDepth) {\n maxDepth = n.depth;\n }\n if (n.length < minLength) {\n minLength = n.length;\n }\n if (n.length > maxLength) {\n maxLength = n.length;\n }\n }\n return {\n minDepth,\n maxDepth,\n minLength,\n maxLength,\n maxRank,\n nodeCount: graph.nodes.length,\n referenceRamp\n };\n}\nfunction getNodeColor(node, nodeIndex, colorScheme, range) {\n switch (colorScheme) {\n case \"random\":\n return hashColor(node.id, 1);\n case \"depth\":\n return sampleGradient(\n DEPTH_GRADIENT,\n range.maxDepth > range.minDepth ? (node.depth - range.minDepth) / (range.maxDepth - range.minDepth) : 0.5\n );\n case \"node-length\":\n return sampleGradient(\n NODE_LENGTH_GRADIENT,\n range.maxLength > range.minLength ? (node.length - range.minLength) / (range.maxLength - range.minLength) : 0.5\n );\n // rGFA states the backbone rather than leaving it to be inferred: rank 0 is\n // the reference, higher ranks are the sequence that diverges from it. A\n // graph with no SR tags draws every node as unranked.\n case \"stable-rank\":\n return node.stable === void 0 ? packAbgr(160, 160, 160, 255) : node.stable.rank === 0 ? packAbgr(52, 152, 219, 255) : sampleGradient(\n STABLE_RANK_GRADIENT,\n range.maxRank > 1 ? (node.stable.rank - 1) / (range.maxRank - 1) : 0\n );\n // Position on the reference, the one quantity both panels of a\n // graph-over-linear figure can state, so only the backbone takes a hue\n case \"reference-position\": {\n const ramp = range.referenceRamp;\n if (ramp === void 0) {\n return packAbgr(160, 160, 160, 255);\n }\n const t = rampFraction(node, ramp);\n return t === void 0 ? REFERENCE_RAMP_ALT_COLOR : packHsl(\n rampHueAt(t),\n REFERENCE_RAMP_SATURATION,\n REFERENCE_RAMP_LIGHTNESS\n );\n }\n case \"grey\":\n return packAbgr(160, 160, 160, 255);\n case \"rainbow\": {\n const hue = range.nodeCount > 1 ? nodeIndex / range.nodeCount * 360 : 0;\n return packHsl(hue, 0.75, 0.5);\n }\n default:\n return packAbgr(52, 152, 219, 255);\n }\n}\nfunction endTangent(c, yToX = 1, into) {\n const candidates = [\n [c.cx1, c.cy1],\n [c.cx0, c.cy0],\n [c.x0, c.y0]\n ];\n for (const [x, y] of candidates) {\n const dx = c.x1 - x;\n const dy = (c.y1 - y) * yToX;\n if (Math.hypot(dx, dy) > 0) {\n return Math.atan2(dy, dx);\n }\n }\n return into ? Math.atan2((into.to.y - into.from.y) * yToX, into.to.x - into.from.x) : 0;\n}\nfunction isPolylineInBounds(segments, bounds) {\n let hit = false;\n for (let i = 0; i < segments.length - 1 && !hit; i++) {\n const a = segments[i];\n const b = segments[i + 1];\n hit = Math.max(a.x, b.x) >= bounds.minX && Math.min(a.x, b.x) <= bounds.maxX && Math.max(a.y, b.y) >= bounds.minY && Math.min(a.y, b.y) <= bounds.maxY;\n }\n return hit;\n}\nfunction isBezierInBounds(curves, bounds, growX = 0, growY = 0) {\n for (const c of curves) {\n const cMinX = Math.min(c.x0, c.cx0, c.cx1, c.x1);\n const cMaxX = Math.max(c.x0, c.cx0, c.cx1, c.x1);\n const cMinY = Math.min(c.y0, c.cy0, c.cy1, c.y1);\n const cMaxY = Math.max(c.y0, c.cy0, c.cy1, c.y1);\n if (cMaxX >= bounds.minX - growX && cMinX <= bounds.maxX + growX && cMaxY >= bounds.minY - growY && cMinY <= bounds.maxY + growY) {\n return true;\n }\n }\n return false;\n}\nvar paletteCache = /* @__PURE__ */ new WeakMap();\nfunction pathPaletteOf(graph) {\n let palette = paletteCache.get(graph);\n if (!palette) {\n const pathColorByIndex = [];\n const pathIndexByName = /* @__PURE__ */ new Map();\n const paths = graph.paths ?? [];\n for (let i = 0; i < paths.length; i++) {\n pathColorByIndex.push(\n packHsl(\n pathHueAt(i, paths.length),\n PATH_SATURATION,\n PATH_LIGHTNESS,\n 0.85\n )\n );\n if (!pathIndexByName.has(paths[i].name)) {\n pathIndexByName.set(paths[i].name, i);\n }\n }\n palette = { pathColorByIndex, pathIndexByName };\n paletteCache.set(graph, palette);\n }\n return palette;\n}\nvar slotsCache = /* @__PURE__ */ new WeakMap();\nvar NO_SLOTS = /* @__PURE__ */ new Map();\nfunction pathSlotsOf(graph) {\n let slots = slotsCache.get(graph);\n if (!slots) {\n slots = /* @__PURE__ */ new Map();\n for (const [pathIdx, path] of (graph.paths ?? []).entries()) {\n for (const nodeId of new Set(path.nodeIds)) {\n pushTo(slots, nodeId, pathIdx);\n }\n }\n slotsCache.set(graph, slots);\n }\n return slots;\n}\nvar lanesCache = weakMemo();\nvar stepsCache = weakMemo();\nvar linksCache = /* @__PURE__ */ new WeakMap();\nfunction linksOf(graph) {\n let links = linksCache.get(graph);\n if (!links) {\n links = /* @__PURE__ */ new Map();\n for (const { from, to } of graph.edges) {\n let out = links.get(from);\n if (!out) {\n out = /* @__PURE__ */ new Set();\n links.set(from, out);\n }\n out.add(to);\n }\n linksCache.set(graph, links);\n }\n return links;\n}\nfunction buildGeometry(options) {\n const {\n nodePositions,\n graph,\n nodeById,\n colorScheme,\n contigThickness,\n connectorThickness,\n drawPaths,\n nodeWidth = \"uniform\",\n edgeWidth = \"uniform\",\n highlight,\n axis,\n linearLayout,\n viewportBounds,\n referenceRamp,\n deletions,\n deletionRoutes,\n stranded,\n hiddenEdges,\n version = 0\n } = options;\n const widthScale = widthNorm(graph, nodeWidth);\n const busiest = edgeWidth === \"walks\" ? busiestEdge(graph) : 0;\n const scale = axis.scaleX;\n const worldPerScreenPx = 1 / Math.max(scale, MIN_SCALE_FOR_OFFSET);\n const yToX = yToXOf(axis);\n const sharedCurves = baseEdgeCurves(\n nodePositions,\n graph,\n axis,\n deletions,\n version,\n deletionRoutes,\n stranded\n );\n const nodeStrokes = [];\n const nodeStrokeRuns = /* @__PURE__ */ new Map();\n const arrows = [];\n const arrowRuns = /* @__PURE__ */ new Map();\n const edgeCurves = [];\n const edgeCurveRuns = /* @__PURE__ */ new Map();\n const colorRange = computeColorSchemeRange(graph, referenceRamp);\n const nodeIndexMap = /* @__PURE__ */ new Map();\n if (colorScheme === \"rainbow\") {\n for (let i = 0; i < graph.nodes.length; i++) {\n nodeIndexMap.set(graph.nodes[i].id, i);\n }\n }\n const pathCount = graph.paths?.length ?? 0;\n const { pathColorByIndex, pathIndexByName } = pathPaletteOf(graph);\n const pathColorByName = (name) => pathColorByIndex[pathIndexByName.get(name) ?? -1] ?? EDGE_PATH_FALLBACK_COLOR;\n const nodePathSlots = drawPaths && pathCount > 1 ? pathSlotsOf(graph) : NO_SLOTS;\n const liftedWalks = highlight?.walks ?? [];\n const threaded = threadsPasses(liftedWalks);\n const lanePasses = liftedWalks.map((w) => w.mostPasses);\n const thinned = threaded ? bandScale(lanePasses) : 1;\n const fields = highlight && liftedWalks.length > 1 ? lanesCache(\n highlight,\n [nodePositions, version, axis.scaleX, axis.scaleY],\n () => liftLanes(\n liftedWalks,\n nodePositions,\n yToX,\n worldPerScreenPx,\n stepsCache(\n highlight,\n [nodePositions, version],\n () => walkSteps(\n liftedWalks.map((w) => w.route),\n nodePositions\n )\n )\n )\n ) : void 0;\n const lines = fields?.lines;\n const threads = fields?.threads;\n const spanField = fields?.spans;\n const plainCentres = threaded ? slotCentres(lanePasses, lanePasses) : [];\n const centresByNode = /* @__PURE__ */ new Map();\n const centresOf = (nodeId) => {\n let centres = centresByNode.get(nodeId);\n if (!centres) {\n const spans = spanField?.get(nodeId);\n centres = spans ? slotCentres(spans.slot, lanePasses, spans.held) : plainCentres;\n centresByNode.set(nodeId, centres);\n }\n return centres;\n };\n const laneOffset = (nodeId, laneWidth, lane, pass) => threaded ? (centresOf(nodeId)[lane] + pass * THREAD_PITCH_PX) * thinned : (lane - (liftedWalks.length - 1) / 2) * laneWidth;\n const threadOffsetAt = (frame, at, fallback) => {\n const eased = frame?.offsets?.[at] ?? frame?.offset;\n return eased === void 0 ? fallback : eased * thinned;\n };\n const laneHalfWidth = (laneWidth) => threaded ? THREAD_PX / 2 * thinned : laneWidth / 2;\n const plainNormals = /* @__PURE__ */ new Map();\n const visitNormals = /* @__PURE__ */ new WeakMap();\n const visitOf = (lane, nodeId, thread) => threads?.[lane]?.threadPasses.get(nodeId)?.[thread] ?? 0;\n const plainNormalsOf = (nodeId, segments) => {\n let normals = plainNormals.get(nodeId);\n if (!normals) {\n normals = pointNormalsOf(segments, yToX);\n plainNormals.set(nodeId, normals);\n }\n return normals;\n };\n const laneNormalsOf = (nodeId, segments, frame) => {\n if (!frame) {\n return plainNormalsOf(nodeId, segments);\n }\n let normals = visitNormals.get(frame.normals);\n if (!normals) {\n normals = plainNormalsOf(nodeId, segments).map(\n (n, i) => frame.normals[i] ?? n\n );\n visitNormals.set(frame.normals, normals);\n }\n return normals;\n };\n const laneWidths = /* @__PURE__ */ new Map();\n const laneWidthOf = (id) => {\n let width = laneWidths.get(id);\n if (width === void 0) {\n const node = nodeById.get(id);\n width = walkLaneWidthPx(\n node ? nodeWidthPx(node, contigThickness, nodeWidth, widthScale) : contigThickness,\n liftedWalks.length\n );\n laneWidths.set(id, width);\n }\n return width;\n };\n const laneEndOf = (id, frames, segments, atStart, lane, thread) => {\n const at = atStart ? 0 : segments.length - 1;\n const frame = frames?.[lane]?.[visitOf(lane, id, thread)];\n const eased = frame?.offsets?.[at] ?? frame?.offset;\n return {\n normal: frame?.normals[at] ?? plainNormalsOf(id, segments)[at] ?? { nx: 0, ny: 0 },\n shift: frame?.shifts[at] ?? NO_SHIFT,\n offset: eased === void 0 ? laneOffset(id, laneWidthOf(id), lane, thread) : eased * thinned\n };\n };\n const lanesMayShow = (curves, fromId) => {\n if (!viewportBounds) {\n return true;\n }\n const offset = threaded ? bandWidthPx(lanePasses) * thinned : (liftedWalks.length - 1) / 2 * laneWidthOf(fromId);\n const reach = LONGEST_NORMAL * offset * worldPerScreenPx;\n return isBezierInBounds(\n curves,\n viewportBounds,\n reach + (fields?.furthestShift.dx ?? 0),\n reach / yToX + (fields?.furthestShift.dy ?? 0)\n );\n };\n const threadPairs = (lane, from, to) => {\n const own = threads?.[lane]?.linkThreads;\n if (!own?.size) {\n return FIRST_THREADS;\n }\n const ahead = own.get(from)?.get(to);\n const back = linksOf(graph).get(to)?.has(from) ? void 0 : own.get(to)?.get(from);\n if (!back) {\n return ahead ?? FIRST_THREADS;\n }\n const turned = back.map(([a, b]) => [b, a]);\n return ahead ? [...ahead, ...turned] : turned;\n };\n const threadColor = (lane, nodeId, thread) => liftedWalks[lane]?.passColors.get(nodeId)?.[threads?.[lane]?.threadPasses.get(nodeId)?.[thread] ?? 0];\n const visitPoints = /* @__PURE__ */ new WeakMap();\n const lanePointsOf = (segments, frame) => {\n if (!frame || !threaded) {\n return segments;\n }\n let points = visitPoints.get(frame.shifts);\n if (!points) {\n const { shifts } = frame;\n points = segments.map((p, i) => {\n const { dx, dy } = shifts[i] ?? NO_SHIFT;\n return { ...p, x: p.x + dx, y: p.y + dy };\n });\n visitPoints.set(frame.shifts, points);\n }\n return points;\n };\n const showArrows = scale > (linearLayout ? 1 : MIN_ARROW_SCALE);\n for (let ei = 0; ei < graph.edges.length; ei++) {\n const edge = graph.edges[ei];\n const fromSegments = nodePositions[edge.from];\n const toSegments = nodePositions[edge.to];\n const baseCurves = sharedCurves.get(ei);\n if (!fromSegments?.length || !toSegments?.length || !baseCurves || hiddenEdges?.has(ei)) {\n continue;\n }\n const numPaths = edge.pathIds?.length ?? 0;\n const bypassed = deletions?.get(ei);\n const isDeletion = bypassed !== void 0;\n const onWalk = highlight?.edgeIndexes.has(ei) ?? false;\n const ribbonThickness = connectorThickness / 2 * (isDeletion ? DELETION_THICKNESS_FACTOR : 1);\n const walkFactor = edgeWidthFactor(numPaths, busiest, edgeWidth);\n const edgeThickness = connectorThickness / 2 * (!isDeletion ? walkFactor : edgeWidth === \"walks\" && busiest > 0 ? Math.max(1, walkFactor) : DELETION_THICKNESS_FACTOR);\n const ribbons = drawPaths && numPaths > 0;\n const plainEdgeColor = isDeletion ? EDGE_DELETION_COLOR : EDGE_DEFAULT_COLOR;\n const edgeColor = !highlight || onWalk ? plainEdgeColor : fadeAbgr(plainEdgeColor, FADED_ALPHA);\n const toNode = nodeById.get(edge.to);\n const intoHalfWidth = (toNode ? nodeWidthPx(toNode, contigThickness, nodeWidth, widthScale) : contigThickness) / 2;\n const inView = (curves) => !viewportBounds || isBezierInBounds(curves, viewportBounds);\n const dashesOf = (curves) => dashSpans(curves, DELETION_DASH_PX / scale, yToX, viewportBounds);\n const stroke = (curves, thickness, color) => {\n if (!isDeletion) {\n edgeCurves.push({ curves, thickness, color });\n return;\n }\n for (const dash of dashesOf(curves)) {\n edgeCurves.push({ curves: dash.curves, thickness, color });\n }\n };\n const laneStroke = (curves, thickness, color, walk, pass, normal2, offsetX, endNormal, endOffsetX) => {\n edgeCurves.push({\n curves,\n thickness,\n color,\n walk,\n pass,\n normal: normal2,\n offsetX,\n endNormal,\n endOffsetX\n });\n };\n const arrowOn = (curves) => {\n const head = showArrows ? arrowheadFor({\n curves,\n edgeHalfWidth: isDeletion || ribbons ? connectorThickness / 2 : edgeThickness,\n nodeHalfWidth: intoHalfWidth,\n scale,\n yToX,\n color: edgeColor,\n fromSegments,\n toSegments\n }) : void 0;\n if (head) {\n arrows.push(head);\n }\n };\n const edgeCurveStart = edgeCurves.length;\n const arrowStart = arrows.length;\n const laneWalks = highlight?.walks.length && onWalk && !ribbons ? highlight.walks : void 0;\n if (laneWalks && !lanesMayShow(baseCurves, edge.from)) {\n continue;\n }\n if (laneWalks) {\n const fromAtStart = leavesStart(\n edge,\n fromSegments,\n baseCurves[0],\n stranded,\n yToX\n );\n const last = baseCurves.at(-1);\n const toAtStart = nearerStart(\n { x: last.x1, y: last.y1 },\n toSegments,\n yToX\n );\n const single = laneWalks.length === 1;\n const thickness = laneHalfWidth(laneWidthOf(edge.from));\n const fromFrames = lines?.frames.get(edge.from);\n const toFrames = lines?.frames.get(edge.to);\n for (let lane = 0; lane < laneWalks.length; lane++) {\n const walk = laneWalks[lane];\n if (!walk.edgeIndexes.has(ei)) {\n continue;\n }\n for (const [pass, toPass] of threadPairs(lane, edge.from, edge.to)) {\n const from = laneEndOf(\n edge.from,\n fromFrames,\n fromSegments,\n fromAtStart,\n lane,\n pass\n );\n const to = threaded ? laneEndOf(edge.to, toFrames, toSegments, toAtStart, lane, toPass) : from;\n const offsetX = single ? 0 : from.offset * worldPerScreenPx;\n const endOffsetX = threaded ? to.offset * worldPerScreenPx : offsetX;\n const curves = threaded ? slideCurves(\n baseCurves,\n from.shift.dx + from.normal.nx * offsetX,\n from.shift.dy + from.normal.ny * offsetX / yToX,\n to.shift.dx + to.normal.nx * endOffsetX,\n to.shift.dy + to.normal.ny * endOffsetX / yToX\n ) : offsetX === 0 ? baseCurves : translateCurves(\n baseCurves,\n from.normal.nx * offsetX,\n from.normal.ny * offsetX / yToX\n );\n if (inView(curves)) {\n laneStroke(\n curves,\n thickness,\n threadColor(lane, edge.from, pass) ?? threadColor(lane, edge.to, toPass) ?? plainEdgeColor,\n lane,\n pass,\n from.normal,\n offsetX,\n to.normal,\n endOffsetX\n );\n }\n }\n }\n if (edgeCurves.length > edgeCurveStart) {\n arrowOn(baseCurves);\n }\n } else if (!ribbons) {\n if (inView(baseCurves)) {\n stroke(baseCurves, edgeThickness, edgeColor);\n arrowOn(baseCurves);\n }\n } else {\n const offsets = pathRibbonOffsets(\n fromSegments,\n toSegments,\n numPaths,\n axis\n );\n const arrowRibbon = Math.floor((numPaths - 1) / 2);\n for (let pathIdx = 0; pathIdx < numPaths; pathIdx++) {\n const { x, y } = offsets[pathIdx];\n const curves = x === 0 && y === 0 ? baseCurves : translateCurves(baseCurves, x, y);\n if (!inView(curves)) {\n continue;\n }\n const ribbonColor = pathColorByName(edge.pathIds[pathIdx]);\n stroke(\n curves,\n ribbonThickness,\n highlight && (highlight.walks.length ? !highlight.names.has(edge.pathIds[pathIdx]) : !onWalk) ? fadeAbgr(ribbonColor, FADED_ALPHA) : ribbonColor\n );\n if (pathIdx === arrowRibbon) {\n arrowOn(curves);\n }\n }\n }\n const edgeCurveCount = edgeCurves.length - edgeCurveStart;\n if (edgeCurveCount > 0) {\n edgeCurveRuns.set(ei, { start: edgeCurveStart, count: edgeCurveCount });\n }\n const arrowCount = arrows.length - arrowStart;\n if (arrowCount > 0) {\n arrowRuns.set(ei, { start: arrowStart, count: arrowCount });\n }\n }\n for (const [nodeId, segments] of Object.entries(nodePositions)) {\n const node = nodeById.get(nodeId);\n if (!node) {\n continue;\n }\n if (viewportBounds && !isPolylineInBounds(segments, viewportBounds)) {\n continue;\n }\n const faded = highlight !== void 0 && !highlight.nodeIds.has(nodeId);\n const own = faded ? LIFT_BACKDROP_COLOR : getNodeColor(\n node,\n nodeIndexMap.get(nodeId) ?? 0,\n colorScheme,\n colorRange\n );\n const color = faded ? fadeAbgr(own, FADED_ALPHA) : node.moved ? fadeAbgr(own, MOVED_ALPHA) : own;\n const width = nodeWidthPx(node, contigThickness, nodeWidth, widthScale);\n const nodeThickness = width / 2;\n const start = nodeStrokes.length;\n const slots = nodePathSlots.get(nodeId);\n const slotWidth = width / pathCount;\n const drawable = segments.length >= 2;\n const lanes = highlight?.walks.length && !faded && !slots?.length ? highlight.walks : void 0;\n if (drawable && lanes) {\n const laneWidth = walkLaneWidthPx(width, lanes.length);\n const thickness = laneHalfWidth(laneWidth);\n const frames = lines?.frames.get(nodeId);\n for (let lane = 0; lane < lanes.length; lane++) {\n const laneColor = lanes[lane].colors.get(nodeId);\n if (laneColor === void 0) {\n continue;\n }\n const onThreads = threads?.[lane]?.nodeThreads.get(nodeId) ?? ONE_PASS;\n for (const pass of onThreads) {\n const color2 = threadColor(lane, nodeId, pass) ?? laneColor;\n if (lanes.length === 1) {\n nodeStrokes.push({\n points: segments,\n thickness,\n color: color2,\n walk: lane,\n pass\n });\n continue;\n }\n const frame = frames?.[lane]?.[visitOf(lane, nodeId, pass)];\n const normals = laneNormalsOf(nodeId, segments, frame);\n const points = lanePointsOf(segments, frame);\n const plain = laneOffset(nodeId, laneWidth, lane, pass);\n const offsets = frame?.offsets?.map(\n (o) => o * thinned * worldPerScreenPx\n );\n const offsetX = offsets ? offsets[Math.floor(offsets.length / 2)] : threadOffsetAt(frame, 0, plain) * worldPerScreenPx;\n nodeStrokes.push({\n points: offsetPolyline(points, normals, offsets ?? offsetX, yToX),\n thickness,\n color: color2,\n walk: lane,\n pass,\n normals,\n offsetX,\n ...offsets && { offsets }\n });\n }\n }\n } else if (drawable && slots?.length && slotWidth >= MIN_PATH_STRIPE_PX) {\n const normals = pointNormalsOf(segments, yToX);\n for (const slot of slots) {\n const offset = (slot - (pathCount - 1) / 2) * slotWidth * worldPerScreenPx;\n const stripe = pathColorByIndex[slot] ?? EDGE_PATH_FALLBACK_COLOR;\n nodeStrokes.push({\n points: offsetPolyline(segments, normals, offset, yToX),\n thickness: slotWidth / 2,\n // a node off the lifted walk fades whichever way it is painted\n color: faded ? fadeAbgr(stripe, FADED_ALPHA) : stripe\n });\n }\n } else if (drawable) {\n nodeStrokes.push({ points: segments, thickness: nodeThickness, color });\n }\n const count = nodeStrokes.length - start;\n if (count > 0) {\n nodeStrokeRuns.set(nodeId, { start, count });\n }\n }\n return {\n nodeStrokes,\n nodeStrokeRuns,\n arrows,\n arrowRuns,\n edgeCurves,\n edgeCurveRuns\n };\n}\n\nexport {\n LIFT_BACKDROP_COLOR,\n FADED_ALPHA,\n LIFT_BACKDROP_CSS,\n hslToRgb,\n REFERENCE_RAMP_ALT_COLOR,\n REFERENCE_RAMP_ALT_CSS,\n rampFraction,\n computeReferenceRamp,\n computeColorSchemeRange,\n getNodeColor,\n endTangent,\n buildGeometry\n};\n", "import {\n REFERENCE_RAMP_ALT_COLOR,\n hslToRgb\n} from \"./chunk-UY7CLJNZ.js\";\nimport {\n packAbgr\n} from \"./chunk-G2FD7S3C.js\";\nimport {\n REFERENCE_RAMP_LIGHTNESS,\n REFERENCE_RAMP_SATURATION,\n rampHueAt\n} from \"./chunk-GQZVR5DW.js\";\n\n// src/walkEncoding.ts\nvar WALK_FIELDS = [\n { value: \"progress\", label: \"Progress along the walk\" },\n { value: \"walk\", label: \"One colour for the walk\" },\n { value: \"reference\", label: \"Reference position\" }\n];\nvar WALK_SCHEMES = [\n { value: \"grey\", label: \"Grey to black\", ends: [\"#a3a3a3\", \"#151515\"] },\n { value: \"blue\", label: \"Cyan to navy\", ends: [\"#6ee0f0\", \"#0b2c7a\"] },\n { value: \"red\", label: \"Yellow to red\", ends: [\"#ffd24a\", \"#b3121b\"] },\n { value: \"purple\", label: \"Pink to plum\", ends: [\"#f5a3d8\", \"#5e1a6e\"] },\n { value: \"green\", label: \"Lime to forest\", ends: [\"#b6e36c\", \"#0b5d3b\"] },\n { value: \"orange\", label: \"Peach to rust\", ends: [\"#ffc285\", \"#8f3a00\"] },\n { value: \"rainbow\", label: \"Rainbow\" }\n];\nvar FAMILIES = [\"blue\", \"red\", \"purple\", \"green\"];\nvar isField = (v) => WALK_FIELDS.some((f) => f.value === v);\nvar isScheme = (v) => WALK_SCHEMES.some((s) => s.value === v);\nfunction resolveEncoding(layer, reference, picked, alone = true) {\n const { field: askedField, scheme: askedScheme } = layer.color ?? {};\n const field = isField(askedField) ? askedField : alone ? \"progress\" : \"walk\";\n const family = reference ? \"grey\" : FAMILIES[picked % FAMILIES.length];\n const scheme = isScheme(askedScheme) ? askedScheme === \"rainbow\" && field !== \"reference\" ? family : askedScheme : family;\n const round = Math.floor(picked / FAMILIES.length) % SHADES.length;\n return field === \"walk\" && scheme === family && round > 0 ? { field, scheme, shade: SHADES[round] } : alone || field === \"walk\" ? { field, scheme } : { field, scheme, darkest: TOGETHER_DARKEST };\n}\nvar TOGETHER_DARKEST = 0.55;\nvar BASE_T = 0.5;\nvar SHADES = [BASE_T, 0.85, 0.2];\nvar STRETCH_GAP = 0.08;\nvar rampsOn = ({ field, scheme }) => field !== \"walk\" && scheme !== \"rainbow\";\nfunction splitFamilies(encodings) {\n const counts = /* @__PURE__ */ new Map();\n for (const e of encodings) {\n if (rampsOn(e)) {\n counts.set(e.scheme, (counts.get(e.scheme) ?? 0) + 1);\n }\n }\n const seen = /* @__PURE__ */ new Map();\n return encodings.map((e) => {\n const k = rampsOn(e) ? counts.get(e.scheme) : 1;\n if (k < 2) {\n return e;\n }\n const j = seen.get(e.scheme) ?? 0;\n seen.set(e.scheme, j + 1);\n const half = STRETCH_GAP / 2;\n return {\n ...e,\n stretch: [\n j / k + (j > 0 ? half : 0),\n (j + 1) / k - (j < k - 1 ? half : 0)\n ]\n };\n });\n}\nvar along = ({ stretch }, t) => stretch ? stretch[0] + (stretch[1] - stretch[0]) * t : t;\nvar toLinear = (c) => c <= 0.04045 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;\nvar toGamma = (c) => c <= 31308e-7 ? c * 12.92 : 1.055 * c ** (1 / 2.4) - 0.055;\nfunction oklab(hex) {\n const [r, g, b] = [1, 3, 5].map(\n (i) => toLinear(Number.parseInt(hex.slice(i, i + 2), 16) / 255)\n );\n const l = Math.cbrt(0.4122214708 * r + 0.5363325363 * g + 0.0514459929 * b);\n const m = Math.cbrt(0.2119034982 * r + 0.6806995451 * g + 0.1073969566 * b);\n const s = Math.cbrt(0.0883024619 * r + 0.2817188376 * g + 0.6299787005 * b);\n return [\n 0.2104542553 * l + 0.793617785 * m - 0.0040720468 * s,\n 1.9779984951 * l - 2.428592205 * m + 0.4505937099 * s,\n 0.0259040371 * l + 0.7827717662 * m - 0.808675766 * s\n ];\n}\nfunction oklabToRgb([L, a, b]) {\n const l = (L + 0.3963377774 * a + 0.2158037573 * b) ** 3;\n const m = (L - 0.1055613458 * a - 0.0638541728 * b) ** 3;\n const s = (L - 0.0894841775 * a - 1.291485548 * b) ** 3;\n return [\n 4.0767416621 * l - 3.3077115913 * m + 0.2309699292 * s,\n -1.2684380046 * l + 2.6097574011 * m - 0.3413193965 * s,\n -0.0041960863 * l - 0.7034186147 * m + 1.707614701 * s\n ].map((c) => toGamma(Math.max(0, Math.min(1, c))) * 255);\n}\nvar endsCache = /* @__PURE__ */ new Map();\nfunction oklabEnds(scheme) {\n if (!endsCache.has(scheme)) {\n const family = WALK_SCHEMES.find((s) => s.value === scheme);\n endsCache.set(\n scheme,\n family && \"ends\" in family ? family.ends.map(oklab) : void 0\n );\n }\n return endsCache.get(scheme);\n}\nfunction schemeRgb(scheme, t, darkest = 0) {\n const x = Math.max(0, Math.min(1, t));\n const ends = oklabEnds(scheme);\n if (!ends) {\n return hslToRgb(\n rampHueAt(x),\n REFERENCE_RAMP_SATURATION,\n REFERENCE_RAMP_LIGHTNESS\n ).map((c) => c * 255);\n }\n const [from, to] = ends;\n const light = from[0];\n const dark = to[0];\n const reach = dark < darkest && light > darkest ? (light - darkest) / (light - dark) : 1;\n return oklabToRgb(from.map((v, i) => v + (to[i] - v) * x * reach));\n}\nfunction schemeCss(scheme, t, darkest) {\n const [r, g, b] = schemeRgb(scheme, t, darkest).map(Math.round);\n return `rgb(${r}, ${g}, ${b})`;\n}\nfunction schemeColor(scheme, t, darkest) {\n const [r, g, b] = schemeRgb(scheme, t, darkest).map(Math.round);\n return packAbgr(r, g, b, 255);\n}\nfunction encodedColor(encoding, t) {\n const { field, scheme, darkest, shade = BASE_T } = encoding;\n return field === \"walk\" ? schemeColor(scheme, shade) : t === void 0 ? NO_VALUE_COLOR : schemeColor(scheme, along(encoding, t), darkest);\n}\nvar NO_VALUE_COLOR = REFERENCE_RAMP_ALT_COLOR;\nfunction encodingStops(encoding) {\n const { field, scheme, darkest, shade = BASE_T } = encoding;\n const stop = (offset, t) => ({\n offset,\n color: schemeCss(scheme, t, darkest),\n abgr: schemeColor(scheme, t, darkest)\n });\n return field === \"walk\" ? [stop(0, shade)] : Array.from({ length: 7 }, (_, i) => stop(i / 6, along(encoding, i / 6)));\n}\nfunction encodingSwatchCss(encoding) {\n const stops = encodingStops(encoding);\n return stops.length === 1 ? stops[0].color : `linear-gradient(to right, ${stops.map((s) => `${s.color} ${s.offset * 100}%`).join(\", \")})`;\n}\n\nexport {\n WALK_FIELDS,\n WALK_SCHEMES,\n resolveEncoding,\n splitFamilies,\n schemeRgb,\n schemeCss,\n schemeColor,\n encodedColor,\n NO_VALUE_COLOR,\n encodingStops,\n encodingSwatchCss\n};\n"],
|
|
5
5
|
"mappings": "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",
|
|
6
6
|
"names": ["THREAD_PX", "THREAD_GAP_PX", "SLOT_GAP_PX", "LANE_SMOOTHING_PX", "THREAD_REACH_PX", "THREAD_TAPER_PX", "MAX_BAND_PX", "PASSES_KEY", "threadsPasses", "walks", "w", "threadsWidth", "threads", "sum", "values", "a", "b", "slotLayout", "spans", "mostPasses", "laneWidth", "widths", "m", "i", "seen", "gaps", "share", "gap", "THREAD_PITCH_PX", "slotCentres", "held", "band", "at", "width", "slack", "centre", "bandWidthPx", "bandScale", "passesKey", "pointIndex", "run", "p", "i", "k", "gapOf", "a", "b", "dx", "dy", "arcOf", "s", "walkSteps", "walkRoutes", "nodePositions", "seen", "routes", "visits", "route", "id", "visit", "segments", "owned", "laneRuns", "steps", "yToX", "jump", "runs", "pieces", "walk", "total", "piece", "xs", "ys", "at", "from", "fresh", "breakRun", "stepOf", "gap", "x", "y", "first", "last", "forward", "toFirst", "toLast", "next", "toNext", "j", "ownedWindows", "margin", "windows", "floor", "lo", "hi", "smoothedNormals", "reach", "end", "pointAt", "span", "f", "_", "back", "ahead", "len", "cutCurls", "close", "length", "out", "picks", "to", "j2", "q", "rounded", "half", "n", "sumW", "sumX", "sumY", "w", "tightPoints", "line", "radius", "tight", "along", "twice", "loosened", "t", "pass", "part", "local", "weight", "windowMean", "smoother", "runSigns", "own", "canonical", "settle", "agreement", "sum2", "decided", "pending", "theirs", "mine", "laneLines", "band", "smooth", "turn", "curl", "context", "frames", "firsts", "arcs", "stepFrames", "newFrame", "place", "byWalk", "r", "ids", "starts", "raw", "firstRun", "firstStep", "firstFrame", "plus", "minus", "d", "shared", "reachFrom", "reachTo", "backward", "apart", "points", "normals", "sign", "index", "m", "px", "py", "shift", "windowed", "v", "deque", "head", "counted", "sumWV", "ONE_THREAD", "repeats", "passes", "walkThreads", "widths", "stepVisits", "stepWants", "stepGlides", "nodes", "mid", "most", "copy", "before", "after", "wants", "glides", "nearest", "want", "taken", "threadOf", "free", "width", "c", "glideOf", "glide", "nodeThreads", "threadPasses", "threadAt", "passOf", "thread", "linkThreads", "pair", "list", "bandSpans", "spans", "taper", "middle", "eased", "e", "easeOffsets", "threads", "plain", "slotCentres", "byNode", "centresAt", "centres", "THREAD_PITCH_PX", "frame", "constant", "offsets", "liftLanes", "walks", "worldPerScreenPx", "threaded", "threadsPasses", "THREAD_REACH_PX", "LANE_SMOOTHING_PX", "bandWidthPx", "bandScale", "lines", "THREAD_TAPER_PX", "furthestShift", "seenShifts", "shifts", "packAbgr", "r", "g", "b", "a", "abgrRed", "c", "abgrGreen", "abgrBlue", "abgrAlpha", "abgrToCssRgba", "normalizedRgbToCssRgba", "alpha", "fadeAbgr", "brightenAbgr", "factor", "t", "lift", "v", "REFERENCE_RAMP_MAX_HUE", "REFERENCE_RAMP_SATURATION", "REFERENCE_RAMP_LIGHTNESS", "rampHueCss", "hue", "rampHueAt", "frac", "rampHue", "bp", "domain", "HUE_STOP_DEG", "rampStops", "start", "reversed", "low", "high", "n", "_", "RAMP_GRADIENT_STOPS", "i", "RAMP_GRADIENT_CSS", "s", "cache", "weakMemo", "baseEdgeCurves", "nodePositions", "graph", "axis", "deletions", "version", "routes", "stranded", "curves", "ei", "bypassed", "edgeCurves", "edgeCurvesOf", "MAX_BACKBONE_HOPS", "buildNeighbors", "graph", "neighbors", "edge", "pushTo", "flankingSpan", "nodeId", "nodeById", "seen", "frontier", "minEnd", "maxStart", "hop", "next", "id", "adjacent", "neighborId", "neighbor", "isBackbone", "nodeReferenceSpan", "node", "referenceMidpoints", "midpoints", "span", "EDGE_DEFAULT_COLOR", "packAbgr", "EDGE_PATH_FALLBACK_COLOR", "EDGE_DELETION_COLOR", "DELETION_THICKNESS_FACTOR", "LIFT_BACKDROP_COLOR", "FADED_ALPHA", "MOVED_ALPHA", "LIFT_BACKDROP_CSS", "abgrToCssRgba", "fadeAbgr", "DELETION_DASH_PX", "MIN_PATH_STRIPE_PX", "MIN_SCALE_FOR_OFFSET", "ARROW_LENGTH_BASE_PX", "ARROW_LENGTH_PER_EDGE_PX", "ARROW_HALF_WIDTH_BASE_PX", "ARROW_HALF_WIDTH_PER_EDGE_PX", "MIN_LINK_HEADS", "MIN_ARROW_FIT", "MIN_ARROW_SCALE", "ARROW_CURVE_STEPS", "ABUTTING_PX", "walkX", "walkY", "walkPx", "backFromEnd", "curves", "scale", "yToX", "untilPx", "most", "last", "n", "px", "ci", "c", "k", "t", "a", "b", "d", "e", "x", "y", "walkPointAt", "i", "from", "to", "f", "arrowheadFor", "edgeHalfWidth", "nodeHalfWidth", "color", "fromSegments", "toSegments", "length", "lengthPx", "abutting", "inset", "fit", "polylinePx", "tip", "base", "dx", "dy", "endTangent", "intoDirection", "FIRST_THREADS", "ONE_PASS", "NO_SHIFT", "nearerStart", "at", "segments", "gap", "p", "leavesStart", "edge", "first", "stranded", "strandSides", "final", "normal", "len", "MITRE_LIMIT", "LONGEST_NORMAL", "pointNormalsOf", "rawPoints", "points", "before", "after", "nx", "ny", "dot", "offsetPolyline", "normals", "distance", "out", "hslToRgb", "h", "s", "l", "m", "r", "g", "packHsl", "DEPTH_GRADIENT", "STABLE_RANK_GRADIENT", "NODE_LENGTH_GRADIENT", "sampleGradient", "stops", "pos", "hashColor", "str", "alpha", "nameHue", "PATH_SATURATION", "PATH_LIGHTNESS", "REFERENCE_RAMP_ALT_RGB", "REFERENCE_RAMP_ALT_COLOR", "REFERENCE_RAMP_ALT_CSS", "rampFraction", "node", "ramp", "mid", "isBackbone", "computeReferenceRamp", "graph", "domain", "midpoints", "referenceMidpoints", "min", "max", "computeColorSchemeRange", "referenceRamp", "minDepth", "maxDepth", "minLength", "maxLength", "maxRank", "getNodeColor", "nodeIndex", "colorScheme", "range", "rampHueAt", "REFERENCE_RAMP_SATURATION", "REFERENCE_RAMP_LIGHTNESS", "hue", "into", "candidates", "isPolylineInBounds", "bounds", "hit", "isBezierInBounds", "growX", "growY", "cMinX", "cMaxX", "cMinY", "cMaxY", "paletteCache", "pathPaletteOf", "palette", "pathColorByIndex", "pathIndexByName", "paths", "pathHueAt", "slotsCache", "NO_SLOTS", "pathSlotsOf", "slots", "pathIdx", "path", "nodeId", "pushTo", "lanesCache", "weakMemo", "stepsCache", "linksCache", "linksOf", "links", "buildGeometry", "options", "nodePositions", "nodeById", "contigThickness", "connectorThickness", "drawPaths", "nodeWidth", "edgeWidth", "highlight", "axis", "linearLayout", "viewportBounds", "deletions", "deletionRoutes", "hiddenEdges", "version", "widthScale", "widthNorm", "busiest", "busiestEdge", "worldPerScreenPx", "yToXOf", "sharedCurves", "baseEdgeCurves", "nodeStrokes", "nodeStrokeRuns", "arrows", "arrowRuns", "edgeCurves", "edgeCurveRuns", "colorRange", "nodeIndexMap", "pathCount", "pathColorByName", "name", "nodePathSlots", "liftedWalks", "threaded", "threadsPasses", "lanePasses", "w", "thinned", "bandScale", "fields", "liftLanes", "walkSteps", "lines", "threads", "spanField", "plainCentres", "slotCentres", "centresByNode", "centresOf", "centres", "spans", "laneOffset", "laneWidth", "lane", "pass", "THREAD_PITCH_PX", "threadOffsetAt", "frame", "fallback", "eased", "laneHalfWidth", "THREAD_PX", "plainNormals", "visitNormals", "visitOf", "thread", "plainNormalsOf", "laneNormalsOf", "laneWidths", "laneWidthOf", "id", "width", "walkLaneWidthPx", "nodeWidthPx", "laneEndOf", "frames", "atStart", "lanesMayShow", "fromId", "offset", "bandWidthPx", "reach", "threadPairs", "own", "ahead", "back", "turned", "threadColor", "visitPoints", "lanePointsOf", "shifts", "showArrows", "ei", "baseCurves", "numPaths", "isDeletion", "onWalk", "ribbonThickness", "walkFactor", "edgeWidthFactor", "edgeThickness", "ribbons", "plainEdgeColor", "edgeColor", "toNode", "intoHalfWidth", "inView", "dashesOf", "dashSpans", "stroke", "thickness", "dash", "laneStroke", "walk", "normal2", "offsetX", "endNormal", "endOffsetX", "arrowOn", "head", "edgeCurveStart", "arrowStart", "laneWalks", "fromAtStart", "toAtStart", "single", "fromFrames", "toFrames", "toPass", "slideCurves", "translateCurves", "offsets", "pathRibbonOffsets", "arrowRibbon", "ribbonColor", "edgeCurveCount", "arrowCount", "faded", "nodeThickness", "start", "slotWidth", "drawable", "lanes", "laneColor", "onThreads", "color2", "plain", "o", "slot", "stripe", "count", "WALK_FIELDS", "WALK_SCHEMES", "FAMILIES", "isField", "v", "f", "isScheme", "s", "resolveEncoding", "layer", "reference", "picked", "alone", "askedField", "askedScheme", "field", "family", "scheme", "round", "SHADES", "TOGETHER_DARKEST", "BASE_T", "STRETCH_GAP", "rampsOn", "splitFamilies", "encodings", "counts", "seen", "k", "j", "half", "along", "stretch", "t", "toLinear", "c", "toGamma", "oklab", "hex", "r", "g", "b", "i", "l", "m", "oklabToRgb", "L", "a", "endsCache", "oklabEnds", "schemeRgb", "darkest", "x", "ends", "hslToRgb", "rampHueAt", "REFERENCE_RAMP_SATURATION", "REFERENCE_RAMP_LIGHTNESS", "from", "to", "light", "dark", "reach", "schemeCss", "schemeColor", "packAbgr", "encodedColor", "encoding", "shade", "NO_VALUE_COLOR", "REFERENCE_RAMP_ALT_COLOR", "encodingStops", "stop", "offset", "_"]
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import{a as ce,b as N,c as Ee,d as Q,e as ee,f as qt,g as Ue,h as We,i as zt,j as Dt,k as He,l as Oe,m as Pe,n as jt,o as Ut,p as Wt,q as Vt,r as Gt}from"./chunk-M2D7NUOY.js";import{a as Tt,g as Ft}from"./chunk-42VF2CSA.js";import{b as _t}from"./chunk-CJ4VON23.js";import{c as Ot}from"./chunk-AQSLN3RH.js";import{a as Ct,g as Bt}from"./chunk-OSEQDKL3.js";var Hn=4096;function pt(a){let e=[];for(let t of a){let n=e[e.length-1];n&&t-n[1]<=Hn?n[1]=t:e.push([t,t])}return e}var On=32768,Qt={mostChosenPaths:32},lt=class{byNode=new Map;get(e){return this.byNode.get(e.node)?.get(e.offset)}set(e,t){let n=this.byNode.get(e.node);n||(n=new Map,this.byNode.set(e.node,n)),n.set(e.offset,t)}},re=class extends Error{};function Ve(a,e,t,n){return a==="forward"?e+t:e-n}function Kt(a,e,t,n){return a==="forward"?e-n:e+t}function Zt(a){return Pe(ee(a.handles[a.handles.length-1]),ee(a.handles[0]))}function Ce(a){return`${a.pathHandle}:${a.hapStart}:${a.hapEnd}`}async function Xt(a){let{db:e,records:t,signal:n}=a,s=performance.now(),o=()=>{let w=performance.now(),S=w-s;return s=w,S},r={spacing:await e.haplotypeAnchorSpacing(),anchors:void 0,anchorsRead:0,chosenPaths:0,scans:[],scanRows:0,strays:void 0,pieces:0,sources:{reference:0,section:0,stray:0,chain:0,twin:0},walks:{},twins:{tried:0,found:0},graphFetches:0,fallback:void 0,ms:{scan:0,walks:0,check:0,twins:0}},i=(w,S)=>{let A=`${w}: ${S}`;r.walks[A]=(r.walks[A]??0)+1},h=await e.haplotypeSampleInterval()??4096,c=new Map,d=async w=>{let S=t.get(w)??c.get(w);if(S)return S;let A=await e.getRecord(w);if(r.graphFetches+=1,!A)throw new Error(`Node record ${w} is missing from the database`);return c.set(w,A),A},f=w=>t.get(w).sequenceLen,p=await e.pathsByHandle(),y=w=>{let S=p.get(w);return S!==void 0&&a.keep(S.name)},g=[],l=new lt,b=new Map,x=new Set,P=new Set,E=async w=>{let S=(await d(w.node)).gbwt().lf(w.offset);return S===void 0||S.node===0?void 0:S},R=async(w,S)=>{let A=(await d(ee(w.node))).gbwt().predecessorAt(w.offset);if(A===void 0||S!==void 0&&!S.has(A))return;let M=(await d(A)).gbwt().offsetTo(w);if(M===void 0)throw new Error(`No offset in ${A} leads to ${w.node}:${w.offset}`);return{node:A,offset:M}},m=(w,S,A,M)=>{let B=A.map(W=>W.pos.node),U=A.map(W=>W.pos.offset),J=0;for(let W of B)J+=f(W);let O=S==="forward"?A[0].left:A[A.length-1].left,L=g.length;g.push({pathHandle:w,orientation:S,handles:B,offsets:U,len:J,hapStart:O,hapEnd:O+J,canonical:Pe(B[0],B[B.length-1]),source:M});for(let W of A)l.set(W.pos,L);let G=b.get(w);return G?G.push(L):b.set(w,[L]),L},I=async(w,S,A,M)=>{let B=[],U=w;for(;;){n?.throwIfAborted();let O=await R(U.pos,t);if(!O)break;U={pos:O,left:Kt(A,U.left,f(U.pos.node),f(O.node))},B.push(U)}B.reverse();let J=[w];for(U=w;;){n?.throwIfAborted();let O=await E(U.pos);if(!O||!t.has(O.node))break;U={pos:O,left:Ve(A,U.left,f(U.pos.node),f(O.node))},J.push(U)}return m(S,A,[...B,...J],M)},$=async(w,S,A,M)=>g[l.get(w.pos)??await I(w,S,A,M)],F=w=>{let S=w.handles[w.handles.length-1];return{pos:{node:S,offset:w.offsets[w.offsets.length-1]},left:w.orientation==="forward"?w.hapEnd-f(S):w.hapStart}},T=w=>{let S=w.handles[0];return{pos:{node:S,offset:w.offsets[0]},left:w.orientation==="forward"?w.hapStart:w.hapEnd-f(S)}},D=await I({pos:a.referencePos,left:a.referenceLeft},a.referenceHandle,"forward","reference"),C=g[D],H=()=>{if(r.fallback!==void 0)return{reference:C,pieces:[],stats:r};let w=new Map;g.forEach((A,M)=>{M!==D&&w.set(Ce(A),[...w.get(Ce(A))??[],A])});let S=[];for(let A of w.values()){let M=new Set;for(let B of A)B.canonical&&!M.has(B.orientation)&&(M.add(B.orientation),S.push(B),r.sources[B.source]+=1)}return r.sources.reference=1,r.pieces=S.length+1,{reference:C,pieces:S,stats:r}},k=async(w,S)=>{let A=S?x:P,M=S?P:x,B=w;for(;;){if(A.has(B))return;A.add(B);let U=g[B],J=S?F(U):T(U),O=0,L;for(;L===void 0;){n?.throwIfAborted();let G=S?await E(J.pos):await R(J.pos);if(!G){L="endmarker";break}let W=(await d(J.pos.node)).sequenceLen,ue=(await d(G.node)).sequenceLen,se=S?Ve(U.orientation,J.left,W,ue):Kt(U.orientation,J.left,W,ue);if(t.has(G.node)){let Y=l.get(G);Y===void 0?(B=await I({pos:G,left:se},U.pathHandle,U.orientation,"chain"),M.add(B),L="landed"):(M.add(Y),L="merge")}else O>On?L="bound":(O+=ue,J={pos:G,left:se})}if(i("chain",L),L!=="landed")return}},j=async w=>{if(a.context>w.context)throw new re(`the context of ${a.context} bp exceeds the ${w.context} bp the haplotype index's stray rows cover`);let S=r.spacing;if(S===void 0)throw new re("the haplotype index has no anchors");let{bin:A,bound:M}=w,{fills:B,inserted:U}=a.snarls;if(a.snarls.mode==="overlapping"&&B.length>0)throw new re("the haplotype index's stray rows cover contained snarls only");for(let u of B){if(u.inserted>0&&u.low===u.high)throw new re(`the haplotype index's stray rows leave out the snarl bounded by node ${u.low} at both ends`);if(u.inserted>0&&(w.snarlNodes===void 0||u.nodes>w.snarlNodes))throw new re(w.snarlNodes===void 0?"the haplotype index's stray rows leave snarls out":`a snarl of ${u.nodes} nodes exceeds the ${w.snarlNodes} the haplotype index's stray rows cover`)}let J=Math.floor(a.window.start/A),O=Math.floor((a.window.end-1)/A),L=J*A,G=(O+1)*A,W=new Map,ue=async(u,v)=>{let z=await e.haplotypeAnchorsBetween(a.referenceHandle,u*S,v*S);for(let _ of z)W.set(_.anchorOffset/S,_)},se=Math.max(0,Math.floor((L-M)/S)-1),Y=Math.ceil((G+M)/S)+1,[{listed:De,strays:ae}]=await Promise.all([e.haplotypeBinData(a.referenceHandle,J,O),ue(se,Y)]);for(let u of t.keys()){let v=N(u);if(!Q(u)&&!De(v)&&!U.has(v))throw new re(`the haplotype index lists node ${v} of the subgraph in no bin that the window touches`)}r.scans=pt([...t.keys()].sort((u,v)=>u-v));let ie=Promise.all(r.scans.map(([u,v])=>e.haplotypeSamplesInRange(u,v)));for(ie.catch(()=>{});se>0&&(W.get(se)?.pathOffset??Number.POSITIVE_INFINITY)>=L-M;)se-=1,await ue(se,se);for(;W.has(Y)&&W.get(Y).pathOffset<=G+M;)Y+=1,await ue(Y,Y);let pe=[...W.keys()].sort((u,v)=>u-v),ye=W.get(pe[0]??-1);if(!ye)throw new re("the haplotype index has no anchors on this path");let he=u=>W.get(u).pathOffset,Ne=new Map;for(let u of pe){let v=N(W.get(u).node);Ne.set(v,[...Ne.get(v)??[],u])}let ct=[...Ne.keys()],Et=ct.map(u=>W.get(Ne.get(u)[0]).visits);if(!Et[ct.indexOf(N(ye.node))].some(u=>u.pathHandle===a.referenceHandle&&u.orientation==="forward"&&u.pathOffset===ye.pathOffset))throw new Error(`The haplotype index has no anchor row for the reference path ${a.referenceHandle} at offset ${ye.pathOffset} (node ${N(ye.node)}); it does not match this graph`);let kt=pe.filter(u=>he(u)<=a.window.start),Rn=pe.filter(u=>he(u)>=a.window.end);r.anchors=[he(kt[kt.length-1]??pe[0]),he(Rn[0]??pe[pe.length-1])],r.anchorsRead=pe.length;let dt=new Map,vt=new Set;if(ct.forEach((u,v)=>{let z=Ne.get(u),_=z.length===1?z[0]:void 0;for(let q of Et[v])vt.add(q.pathHandle),q.orientation==="forward"&&y(q.pathHandle)&&dt.set(q.pathHandle,[...dt.get(q.pathHandle)??[],{k:_,row:q}])}),r.chosenPaths=[...vt].filter(y).length,r.chosenPaths>Qt.mostChosenPaths)throw new re(`${r.chosenPaths} chosen paths pass the anchors, more than ${Qt.mostChosenPaths}`);let je=[],Ie=Number.POSITIVE_INFINITY,be=0;for(let[u,v]of dt){v.sort((z,_)=>z.row.pathOffset-_.row.pathOffset);for(let z=0;z+1<v.length;z++){let _=v[z],q=v[z+1];if(_.k===void 0||q.k===void 0||Math.abs(_.k-q.k)!==1)continue;let[Z,te]=he(_.k)<=he(q.k)?[_,q]:[q,_],ne=he(Z.k),oe=he(te.k);ne<G&&oe>=L?(je.push({pathHandle:u,from:_.row,to:q.row}),Ie=Math.min(Ie,ne-M),be=Math.max(be,oe+M)):ne>=G&&ne-G<=M?(je.push({pathHandle:u,from:Z.row,to:void 0}),Ie=Math.min(Ie,ne-M),be=Math.max(be,ne+M)):oe<L&&L-oe<=M&&(je.push({pathHandle:u,from:te.row,to:void 0}),Ie=Math.min(Ie,oe-M),be=Math.max(be,oe+M))}}let Nn=new Set(B.map(u=>`${u.low}:${u.high}`)),Mn=ae.filter(u=>y(u.pathHandle)&&(u.snarl===void 0||Nn.has(`${u.snarl[0]}:${u.snarl[1]}`))).sort((u,v)=>u.pathHandle-v.pathHandle||u.pathStart-v.pathStart);r.strays={bins:O-J+1,rows:ae.length,walked:0,outsideBp:0},be>0&&await a.prefetchReferenceRange(a.referenceHandle,Math.max(0,Ie),be+1),r.ms.scan=o();let Pt=8*S+2*(a.window.end-a.window.start),At=r.strays,Me=0,$t=u=>{if(At.outsideBp+=u,Me+=u,Me>Pt)throw new re(`a walk of a chosen path near the window went past its cap of ${Pt} bp`)},ft=new Map,Rt=(u,v,z)=>(ft.get(u)??[]).some(([_,q])=>_<=v&&z<q),Nt=(u,v,z)=>{ft.set(u,[...ft.get(u)??[],[v,z]])},Mt=async(u,v,z,_,q)=>{let Z=v,te=z,ne=te;for(;Z&&te<=_;){n?.throwIfAborted();let oe;if(t.has(Z.node)){let Le=await $({pos:Z,left:te},u,"forward",q),Ht=F(Le);Z=Ht.pos,te=Ht.left,oe=f(Z.node),ne=Math.max(ne,Le.hapEnd)}else oe=(await d(Z.node)).sequenceLen,$t(oe),ne=Math.max(ne,te+oe);Z=await E(Z),te+=oe}return ne},Ln=async(u,v,z,_)=>{let q={pos:v,left:z},Z=z;for(;q.left>_;){n?.throwIfAborted();let te=await R(q.pos);if(!te)break;let ne=(await d(te.node)).sequenceLen,oe=q.left-ne;if(t.has(te.node)){let Le=await $({pos:te,left:oe},u,"forward","section");q=T(Le),Z=Math.min(Z,Le.hapStart)}else $t(ne),q={pos:te,left:oe},Z=Math.min(Z,oe)}return Z};for(let{pathHandle:u,from:v,to:z}of je){let _=v.pathOffset,q=(z??v).pathOffset+M;if(Rt(u,_-M,q))continue;let Z={node:v.node,offset:v.offset};Me=0;let te=await Mt(u,Z,_,q,"section");Me=0;let ne=await Ln(u,Z,_,_-M);Nt(u,Math.min(ne,_-M),Math.max(te,q+1)),i(z?"section":"visit",z?"past the far anchor":"bound")}for(let u of Mn){if(Rt(u.pathHandle,u.pathStart,u.pathEnd))continue;Me=0;let v=await Mt(u.pathHandle,{node:u.node,offset:u.offset},u.pathStart,u.pathEnd,"stray");Nt(u.pathHandle,u.pathStart,Math.max(v,u.pathEnd+1)),At.walked+=1}r.ms.walks=o();let Lt=[];for(let u of await ie)for(let v of u)if(r.scanRows+=1,t.has(v.node)&&y(v.pathHandle)){if(!(b.get(v.pathHandle)??[]).some(z=>{let _=g[z];return _.hapStart<=v.pathOffset&&v.pathOffset<_.hapEnd}))throw new re(`chosen path ${v.pathHandle} has a sample at ${v.pathOffset} on the window's nodes that no walk reached`);v.orientation==="reverse"&&Lt.push(v)}for(let u of Lt)await $({pos:{node:u.node,offset:u.offset},left:u.pathOffset},u.pathHandle,"reverse","twin");r.ms.check=o()},X=async()=>{let w=new Map,S=O=>{let L=Ce(O),G=w.get(L);G?G.add(O.orientation):w.set(L,new Set([O.orientation]))},A=0,M=()=>{for(;A<g.length;A++)S(g[A])};M();let B=O=>(w.get(Ce(O))?.size??0)>1,U=2*h,J=(O,L)=>L===D?y(a.referenceHandle)&&Zt(O):!O.canonical||Zt(O);for(let O=0;O<g.length;O++){let L=g[O];if(B(L)||!J(L,O))continue;r.twins.tried+=1;let G=L.orientation==="forward"?"reverse":"forward",W=F(L),ue=0,se;for(;!se&&ue<=U;){n?.throwIfAborted();let ae=await E(W.pos);if(!ae)break;let ie=(await d(ae.node)).sequenceLen,pe=Ve(L.orientation,W.left,(await d(W.pos.node)).sequenceLen,ie),ye=ee(ae.node);se=(await e.haplotypeSamplesInRange(ye,ye)).find(he=>he.pathHandle===L.pathHandle&&he.orientation===G&&he.pathOffset===pe),ue+=ie,W={pos:ae,left:pe}}let Y=se&&{pos:{node:se.node,offset:se.offset},left:se.pathOffset},De=0;for(;Y&&!B(L)&&De<=U+L.len;){if(n?.throwIfAborted(),t.has(Y.pos.node)){let ae=await $(Y,L.pathHandle,G,"twin"),ie=g.indexOf(ae);await k(ie,!0),await k(ie,!1),M(),Y=F(ae)}if(!B(L)){let ae=(await d(Y.pos.node)).sequenceLen;De+=ae;let ie=await E(Y.pos);Y=ie?{pos:ie,left:Ve(G,Y.left,ae,(await d(ie.node)).sequenceLen)}:void 0}}if(M(),!B(L))throw new re(`piece ${Ce(L)} was found in one orientation where extractPaths keeps the other`);r.twins.found+=1}r.ms.twins=o()};try{let w=await e.haplotypeStrayOptions();if(w===void 0)throw new re("the haplotype index has no stray rows; gbz-haplotype-index 0.2.0 writes them");await j(w),await X()}catch(w){if(!(w instanceof re))throw w;r.fallback=w.message}return H()}function Jt(a,e){return a.handles[0]-e.handles[0]||a.offsets[0]-e.offsets[0]}var Cn=Uint32Array.from([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),we=(a,e)=>a>>>e|a<<32-e;function Yt(a){let e=Math.ceil((a.length+9)/64),t=new Uint8Array(e*64);t.set(a),t[a.length]=128;let n=new DataView(t.buffer),s=a.length*8;n.setUint32(t.length-8,Math.floor(s/2**32)),n.setUint32(t.length-4,s>>>0);let o=Uint32Array.from([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),r=new Uint32Array(64);for(let c=0;c<e;c++){for(let P=0;P<16;P++)r[P]=n.getUint32(c*64+P*4);for(let P=16;P<64;P++){let E=r[P-15],R=r[P-2],m=we(E,7)^we(E,18)^E>>>3,I=we(R,17)^we(R,19)^R>>>10;r[P]=r[P-16]+m+r[P-7]+I}let d=o[0],f=o[1],p=o[2],y=o[3],g=o[4],l=o[5],b=o[6],x=o[7];for(let P=0;P<64;P++){let E=we(g,6)^we(g,11)^we(g,25),R=g&l^~g&b,m=x+E+R+Cn[P]+r[P]|0,I=we(d,2)^we(d,13)^we(d,22),$=d&f^d&p^f&p;x=b,b=l,l=g,g=y+m|0,y=p,p=f,f=d,d=m+I+$|0}[d,f,p,y,g,l,b,x].forEach((P,E)=>{o[E]=o[E]+P})}let i=new Uint8Array(32),h=new DataView(i.buffer);for(let c=0;c<8;c++)h.setUint32(c*4,o[c]);return i}function en(a,e){let t=new Map;if(a!==void 0)for(let n of a.split(";")){let s=n.split(","),[o,r]=s;if(s.length!==2||!o||!r)throw new Error(`Invalid ${e} relationship: ${n}`);let i=t.get(o);i||(i=new Set,t.set(o,i)),i.add(r)}return t}function sn(a){return{name:a.get("pggname"),subgraph:en(a.get("subgraph"),"subgraph"),translation:en(a.get("translation"),"translation")}}function tn(a,e){for(let[t,n]of e){let s=a.get(t);s||(s=new Set,a.set(t,s));for(let o of n)s.add(o)}}function on(a,e){let t={name:a,subgraph:new Map,translation:new Map};return e.name!==void 0&&(t.subgraph.set(a,new Set([e.name])),tn(t.subgraph,e.subgraph),tn(t.translation,e.translation)),t}function nn(a){return[...a.entries()].sort(([e],[t])=>e<t?-1:e>t?1:0).flatMap(([e,t])=>[...t].sort().map(n=>[e,n]))}function rn(a){let e=[];a.name!==void 0&&e.push(`H NM:Z:${a.name}`);for(let[t,n]of nn(a.subgraph))e.push(`H SG:Z:${t},${n}`);for(let[t,n]of nn(a.translation))e.push(`H TL:Z:${t},${n}`);return e}async function an(a){let e=a.reduce((r,i)=>r+i.length,0),t=new Uint8Array(e),n=0;for(let r of a)t.set(r,n),n+=r.length;let s=globalThis.crypto?.subtle;return[...s?new Uint8Array(await s.digest("SHA-256",t)):Yt(t)].map(r=>r.toString(16).padStart(2,"0")).join("")}var Bn="_gbwt_ref";function fe(a){let e=`${a.sample}#${a.haplotype}#${a.contig}`;return a.end===void 0?e:`${e}[${a.fragment}-${a.end}]`}var Tn=/^([^#]+)#(\d+)#([^#]+?)(?:\[\d+-\d+\])?$/,_n=/^([^#]+?)(?:\[\d+-\d+\])?$/;function Fn(a){let e=Tn.exec(a);if(e)return{sample:e[1],haplotype:Number(e[2]),contig:e[3]};let t=_n.exec(a);if(t)return{contig:t[1]};throw new Error(`"${a}" is not a path name; expected "sample#haplotype#contig" or a bare contig`)}function Ae(a){return typeof a=="string"?Fn(a):a}function $e(a,e){return{sample:a.sample??Bn,contig:a.contig,haplotype:a.haplotype??0,fragment:e}}var le=class extends Error{name="SubgraphLimitError";limit;windowBp;walkedBp;constructor(e,t){super(t===void 0?`Subgraph size limit of ${e} nodes exceeded`:`Subgraph size limit of ${e} nodes exceeded ${t.walkedBp} bp into a ${t.windowBp} bp window`),this.limit=e,this.windowBp=t?.windowBp,this.walkedBp=t?.walkedBp}};function ut(a,e){return a[0]<e[0]||a[0]===e[0]&&(a[1]<e[1]||a[1]===e[1]&&a[2]<e[2])}var Te=class{heap=[];push(e,t,n){let s=this.heap;s.push([e,t,n]);let o=s.length-1;for(;o>0;){let r=o-1>>1;if(ut(s[o],s[r]))[s[o],s[r]]=[s[r],s[o]],o=r;else break}}pop(){let e=this.heap,t=e[0],n=e.pop();if(e.length>0&&n!==void 0){e[0]=n;let s=0;for(;;){let o=2*s+1,r=o+1,i=s;if(o<e.length&&ut(e[o],e[i])&&(i=o),r<e.length&&ut(e[r],e[i])&&(i=r),i===s)break;[e[s],e[i]]=[e[i],e[s]],s=i}}return t}get size(){return this.heap.length}};function qn(a){let e=new Int32Array(a.length),t=new Int32Array(a.length);return a.forEach(([n,s],o)=>{e[o]=n,t[o]=s}),{pathAt:e,refAt:t,count:a.length}}function zn(a,e){let t=0,n=a.length;for(;t<n;){let s=t+n>>1;a[s]>e?n=s:t=s+1}return a[t]}function ke(a){return`${a.node}:${a.offset}`}function Be(a){return a.map(e=>ee(e)).reverse()}function Dn(a,e){let t=e.identity.hapStart-a.identity.hapEnd,n=a.strand==="+"?e.refStart-a.refEnd:a.refStart-e.refEnd;return a.strand===e.strand&&t>=0&&n>=0?{insertion:t,deletion:n}:void 0}function jn(a,e,t){let[n,s]=a.strand==="+"?[a,e]:[e,a],o=n.edits.map(([c,d])=>[c,d]);cn(o,t.insertion,t.deletion);for(let[c,d]of s.edits)K(o,c,d);let r=a.identity.walkForward,[i,h]=r?[a,e]:[e,a];return{strand:a.strand,refStart:n.refStart,refEnd:s.refEnd,edits:o,weight:void 0,path:[...i.path,...h.path],start:i.start,pieces:[...i.pieces,...h.pieces],soloAligned:[...i.soloAligned,...h.soloAligned],identity:{pathHandle:a.identity.pathHandle,name:a.identity.name,hapStart:a.identity.hapStart,hapEnd:e.identity.hapEnd,walkForward:r}}}function Un(a,e,t){if(a.some(r=>r.weight!==void 0))return a;let n=new Map;a.forEach((r,i)=>{if(r.identity){let h=n.get(r.identity.pathHandle);h?h.push(i):n.set(r.identity.pathHandle,[i])}});let s=new Map,o=new Set;for(let r of n.values()){r.sort((d,f)=>a[d].identity.hapStart-a[f].identity.hapStart);let i=r[0],h=a[i],c=[];for(let d of r.slice(1)){let f=a[d],p=c.length===0?Dn(h,f):void 0;if(p){h=jn(h,f,p),o.add(d);continue}if(!e(f)){c.push(d);continue}let y=e(h)?t([h,...c.map(g=>a[g]),f]):void 0;if(y){h=y;for(let g of[...c,d])o.add(g)}else s.set(i,h),i=d,h=f;c=[]}s.set(i,h)}return a.flatMap((r,i)=>o.has(i)?[]:[s.get(i)??r])}function Ge(a,e){return{node:a.path[e],offset:a.offsets[e]}}var Wn=32768;function Vn(a){let e=[...a].sort((n,s)=>n-s),t=[];for(let n of e){let s=t[t.length-1];s&&n-s[1]<=Wn?s[1]=n:t.push([n,n])}return t}var _e=class a{records=new Map;paths=[];twinStarts=new Set;twinDeferred=!1;unsettled;refId;refPath;refHandle;refInterval;refIndexCache;refPrefixCache;walkedBp;snarlMode="none";snarlFills=[];snarlNodes=new Set;stats={orderedAlignments:0,lcsAlignments:0,snarls:{fills:0,inserted:0},identificationSteps:0,identificationFetches:0,identification:{interval:0,scans:[],windowSamples:0,fragmentLengths:[],companionSeeks:0,companionMisses:0,graphLookups:0,graphFetches:0,chains:[]},keep:void 0};db;limit;signal;constructor(e,t){this.db=e,this.limit=t.limit,this.signal=t.signal}static create(e,t={}){return new a(e,t)}get nodeCount(){return this.records.size/2}get pathCount(){return this.settleDeferred(),this.paths.length}get referenceInterval(){return this.refInterval&&this.refPath?{name:this.refPath,start:this.refPath.fragment+this.refInterval[0],end:this.refPath.fragment+this.refInterval[1]}:void 0}hasNode(e){return this.records.has(ce(e,"forward"))}hasHandle(e){return this.records.has(e)}record(e){let t=this.records.get(e);if(!t)throw new Error(`Subgraph has no record for handle ${e}`);return t}sortedHandles(){return[...this.records.keys()].sort((e,t)=>e-t)}async addNode(e){if(this.signal?.throwIfAborted(),this.limit!==void 0&&this.nodeCount>=this.limit)throw new le(this.limit);let t=await this.db.getRecord(ce(e,"forward")),n=await this.db.getRecord(ce(e,"reverse"));if(!t||!n)throw new Error(`Node ${e} does not exist in the graph`);this.records.set(t.handle,t),this.records.set(n.handle,n)}async ensureNode(e){this.hasNode(e)||await this.addNode(e)}clearPaths(){this.paths=[],this.twinStarts.clear(),this.twinDeferred=!1,this.unsettled=void 0,this.refId=void 0,this.refPath=void 0,this.refHandle=void 0,this.refInterval=void 0,this.refIndexCache=void 0,this.refPrefixCache=void 0}async pathPosition(e){let t=await this.db.findPath(e);if(!t)throw new Error(`Cannot find a path covering offset ${e.fragment} of ${fe(e)}`);if(!t.isIndexed)throw new Error(`The fragment of ${fe(t.name)} at ${t.name.fragment} has not been indexed for random access`);let n=e.fragment-t.name.fragment,s=await this.db.indexedPosition(t.handle,n);if(!s)throw new Error(`The fragment of ${fe(t.name)} at ${t.name.fragment} has not been indexed for random access`);return this.findPathPosition(t,n,s.pathOffset,s.pos)}async findPathPosition(e,t,n,s){let o=n,r=s;for(;;){await this.ensureNode(N(r.node));let i=this.record(r.node);if(o+i.sequenceLen>t)return{position:{seqOffset:t,handle:r.node,nodeOffset:t-o,gbwtOffset:r.offset},name:e.name,handle:e.handle};o+=i.sequenceLen;let h=i.gbwt().lf(r.offset);if(!h)throw new Error(`The fragment of ${fe(e.name)} at ${e.name.fragment} does not contain offset ${t}`);r=h}}async aroundPosition(e,t,n){let s=N(e);await this.ensureNode(s);let o=this.record(e),r=Ee(e),i=new Te;return i.push(t,s,Ue(r)),i.push(o.sequenceLen-t-1,s,We(r)),this.insertContext(i,n)}prefetchReferenceWalk(e,t){return this.prefetchReferenceRange(e.handle,e.position.seqOffset,e.position.seqOffset+t)}async prefetchReferenceRange(e,t,n){let[s,o]=await Promise.all([this.db.indexedPosition(e,t),this.db.indexedPosition(e,n)]);if(s&&o){let r=s.pos.node,i=o.pos.node;if(!await this.db.prefetchRecords([[Math.min(r,i),Math.max(r,i)+1]])){let c=await this.db.indexedPositionsBetween(e,t,n);await this.db.prefetchRecords(Vn(c.map(d=>d.pos.node)).map(([d,f])=>[d,f+2]),!0)}}return s}async aroundInterval(e,t,n){if(!(t>0))throw new Error("Interval length must be greater than 0");this.walkedBp=0;try{return await this.walkInterval(e,t,n)}catch(s){throw s instanceof le&&s.windowBp===void 0?new le(s.limit,{windowBp:t,walkedBp:this.walkedBp}):s}}get referenceWalkedBp(){return this.walkedBp}async walkInterval(e,t,n){let s={node:e.handle,offset:e.gbwtOffset},o=e.nodeOffset,r=t,i=new Te;for(;;){let h=N(s.node),c=Ee(s.node);this.walkedBp=t-r,await this.ensureNode(h);let d=this.record(s.node);if(o>=d.sequenceLen)throw new Error(`Offset ${o} in node ${h} of length ${d.sequenceLen}`);i.push(o,h,Ue(c));let f=d.sequenceLen-o;if(r<=f){i.push(r===f?0:f-r-1,h,We(c));break}i.push(0,h,We(c));let p=d.gbwt().lf(s.offset);if(!p)throw new Error(`No successor for GBWT position (${s.node}, ${s.offset})`);s=p,o=0,r-=f}return this.walkedBp=t,this.insertContext(i,n)}async aroundNodes(e,t){let n=new Te;for(let s of e)await this.ensureNode(s),n.push(0,s,"left"),n.push(0,s,"right");return this.insertContext(n,t)}async insertContext(e,t){this.clearPaths(),this.snarlMode="none",this.snarlFills=[],this.snarlNodes.clear(),this.stats.snarls={fills:0,inserted:0};let n=new Set,s=new Set;for(let r of this.records.keys())s.add(N(r));let o=0;for(;e.size>0;){let[r,i,h]=e.pop(),c=`${i}:${h}`;if(n.has(c))continue;n.add(c),s.delete(i),this.hasNode(i)||(await this.addNode(i),o+=1);let d=qt(h);if(!n.has(`${i}:${d}`)){let y=this.record(ce(i,zt(h))),g=r+y.sequenceLen-1;g<=t&&e.push(g,i,d)}let f=this.record(ce(i,Dt(h))),p=r+1;if(p<=t)for(let y of f.successors()){let g=N(y),l=Ue(Ee(y));n.has(`${g}:${l}`)||e.push(p,g,l)}}for(let r of s)this.records.delete(ce(r,"forward")),this.records.delete(ce(r,"reverse"));return{inserted:o,removed:s.size}}async betweenNodes(e,t){return(await this.fillBetween(e,t)).inserted.length}async fillBetween(e,t){this.clearPaths();let n=[e,ee(t)],s=new Set([N(e),N(t)]),o=[];for(;n.length>0;){let r=n.pop(),i=N(r);this.hasNode(i)||(await this.addNode(i),o.push(i));for(let h of this.record(r).successors()){let c=N(h);s.has(c)||(n.push(h,ee(h)),s.add(c))}}return{inserted:o,nodes:s.size-2}}async extractSnarls(e){let t=0;this.snarlMode=e;for(let[n,s]of await this.overlappingSnarls(e)){let{inserted:o,nodes:r}=await this.fillBetween(n,s),i=N(n),h=N(s);this.snarlFills.push({low:Math.min(i,h),high:Math.max(i,h),nodes:r,inserted:o.length});for(let c of o)this.snarlNodes.add(c);t+=o.length}return this.stats.snarls={fills:this.snarlFills.length,inserted:this.snarlNodes.size},t}async overlappingSnarls(e){let t=[];if(e!=="none"){let n=!1;for(let s of this.sortedHandles()){let o=this.record(s),r=o.next;r!==void 0&&(n=!0,this.hasHandle(r)?He(s,r)&&t.push([s,r]):e==="overlapping"&&this.isSnarlEntryInSubgraph(o)&&t.push([s,r]))}if(!n&&e==="overlapping"&&await this.db.hasChainLinks()){let s=await this.findCoveringSnarl();s&&t.push(s)}}return t}isSnarlEntryInSubgraph(e){let t=e.successors(),n=t.find(s=>this.hasHandle(s));return n===void 0?!1:t.length>1||this.record(ee(n)).successors().length>1}recordReader(e){let t=new Map;return async n=>{let s=this.records.get(n);if(s)return s;let o=t.get(n);if(!o){if(o=await this.db.getRecord(n),e?.(),!o)throw new Error(`Node record ${n} is missing from the database`);t.set(n,o)}return o}}async findCoveringSnarl(){let e=this.recordReader(),t=async h=>{let c=h.successors(),d=c[0];return d===void 0?!1:c.length>1||(await e(ee(d))).successors().length>1},n=async h=>{let c=await e(ee(h));return c.next!==void 0?await t(c)?{kind:"snarl-exit",snarl:[ee(h),c.next]}:{kind:"chain"}:(await e(h)).next!==void 0?{kind:"chain"}:{kind:"regular"}},s=new Set,o=this.sortedHandles().flatMap(h=>this.record(h).successors()),r,i=!1;for(;!i&&o.length>0;){let h=o.shift(),c=N(h);if(!this.hasHandle(h)&&!s.has(c)){s.add(c);let d=await n(h);if(d.kind==="snarl-exit")r=d.snarl,i=!0;else if(d.kind==="chain")i=!0;else for(let f of["forward","reverse"])o.push(...(await e(ce(c,f))).successors())}}return r}extractPaths(e,t){if(this.clearPaths(),t==="none")return;let n=e?.position;this.refPath=e?.name,this.refHandle=e?.handle;let s=this.sortedHandles(),o=s.length,r=new Map;s.forEach((m,I)=>r.set(m,I));let i=new Int32Array(o+1),h=new Int32Array(o),c=[];for(let m=0;m<o;m++){let I=this.record(s[m]),$=I.gbwt().decompressArrays();h[m]=I.sequenceLen,c.push($),i[m+1]=i[m]+$.nodes.length}let d=i[o],f=new Int32Array(d),p=new Int32Array(d),y=new Uint8Array(d);for(let m=0;m<o;m++){let I=c[m];f.set(I.nodes,i[m]),p.set(I.offsets,i[m])}c.length=0;for(let m=0;m<d;m++){let I=r.get(f[m]);I===void 0?f[m]=-1:(f[m]=I,y[i[I]+p[m]]=1)}let g=n===void 0?void 0:r.get(n.handle),l=n?.gbwtOffset,b,x=(m,I,$)=>{let F=[],T=0,D=0,C=-1,H=m,k=I;for(;;){H===g&&k===l&&(C=T),$&&($.push(s[H]),F.push(k)),T+=1,D+=h[H];let j=i[H]+k,X=f[j];if(X<0)break;k=p[j],H=X}return{offsets:F,len:D,refAt:C,last:H}},P=(m,I,$,F)=>{F>=0&&(this.refId=this.paths.length,b=F),this.paths.push({path:m,offsets:I,len:$,weight:void 0,identity:void 0})},E=new Int32Array(o);for(let m=0;m<o;m++){let I=s[m];if(!Q(I)){let $=i[m],F=i[m+1]-$;for(let T=0;T<F;T++)if(y[$+T]===0){let D=[],{offsets:C,len:H,refAt:k,last:j}=x(m,T,D),X=s[j];if(k>=0||Pe(I,X)){if(P(D,C,H,k),!Q(X)){let w=r.get(ee(X));E[w]=E[w]+1}}else this.twinStarts.add(ke({node:I,offset:T}))}}}for(let m=0;m<o;m++){let I=s[m];if(Q(I)){let $=i[m],F=i[m+1]-$,T=0;for(let C=0;C<F;C++)y[$+C]===0&&(T+=1);let D=(g===void 0||b!==void 0)&&T===E[m];for(let C=0;C<F;C++)if(y[$+C]===0){let H=D?void 0:x(m,C,void 0);if(H&&(H.refAt>=0||Pe(I,s[H.last]))){let k=[],{offsets:j,len:X,refAt:w}=x(m,C,k);P(k,j,X,w)}else this.twinStarts.add(ke({node:I,offset:C}))}}}let R=this.refId===void 0?void 0:this.paths[this.refId];if(this.paths.sort((m,I)=>m.path[0]-I.path[0]||m.offsets[0]-I.offsets[0]),R&&(this.refId=this.paths.indexOf(R)),n){if(b===void 0||this.refId===void 0)throw this.clearPaths(),new Error("Could not find the reference path");let m=this.paths[this.refId],I=n.nodeOffset;for(let F of m.path.slice(0,b))I+=this.record(F).sequenceLen;let $=n.seqOffset-I;this.refInterval=[$,$+m.len],m.identity={pathHandle:e.handle,name:e.name,orientation:"forward",hapStart:$,hapEnd:$+m.len}}if(t==="distinct")this.distinctPaths(!0);else if(t==="reference-only"){if(this.refId===void 0)throw new Error("Reference path is required for reference-only output");this.paths=[this.paths[this.refId]],this.refId=0}}distinctPaths(e){let t=this.refId===void 0?void 0:this.paths[this.refId],n=t?.path,s=n&&!Oe(n)?Be(n):void 0,o=c=>s!==void 0&&wt(c,s)===0||Oe(Be(c)),r=e&&this.db.hasHaplotypeIndex;this.twinDeferred=!1,this.paths.sort((c,d)=>wt(c.path,d.path)||c.len-d.len||(c===t?-1:d===t?1:0));let i=[],h;for(let c of this.paths){let d=i[i.length-1],f=r&&c!==t&&o(c.path);this.twinDeferred||=f,d&&wt(d.path,c.path)===0&&!f?d.weight=(d.weight??1)+(c.weight??1):(c===t&&(h=i.length),i.push({...c,weight:c.weight??1}))}this.paths=i,this.refId=h}mergeDistinct(){this.twinDeferred?this.settleDeferred():this.distinctPaths(!1)}settleDeferred(){this.twinDeferred&&(this.unsettled={paths:[...this.paths],refId:this.refId},this.distinctPaths(!1))}dropTwins(){let e=this.refId===void 0?void 0:this.paths[this.refId],t=this.refInterval,n=r=>`${r.pathHandle}:${r.hapStart}-${r.hapEnd}`,s=new Set;e?.identity&&t&&s.add(n({...e.identity,hapStart:t[0],hapEnd:t[1]}));for(let r of this.paths)r!==e&&r.identity?.orientation==="forward"&&s.add(n(r.identity));let o=this.paths.filter(r=>r===e||r.identity?.orientation!=="reverse"||!s.has(n(r.identity)));o.length<this.paths.length&&(this.paths=o,this.refId=e===void 0?void 0:o.indexOf(e)),this.twinDeferred&&this.distinctPaths(!1)}keepHaplotypes(e){if(this.paths.some(r=>r.weight!==void 0))throw new Error("keepHaplotypes needs one walk per haplotype: extract with haplotypes 'all', then call mergeDistinct()");let t=this.paths.filter((r,i)=>i!==this.refId&&r.identity===void 0).length;if(t>0)throw new Error(`${t} of the window's ${this.paths.length} walks have no name, so the haplotypes to keep cannot be told from the rest; call identifyPaths() first, and check that the haplotype index was built for this graph`);let n=this.refId===void 0?void 0:this.paths[this.refId],s=this.paths.filter((r,i)=>i===this.refId||r.identity!==void 0&&e(r.identity.name)),o=new Set;for(let r of s)for(let i of r.path)o.add(N(i));for(let r of[...this.records.keys()])o.has(N(r))||this.records.delete(r);this.paths=s,this.refId=n===void 0?void 0:s.indexOf(n)}async extractChosenPaths(e,t,n,s){this.clearPaths();let o=e.position.seqOffset,r=await Xt({db:this.db,records:this.records,referenceHandle:e.handle,referencePos:{node:e.position.handle,offset:e.position.gbwtOffset},referenceLeft:o-e.position.nodeOffset,window:{start:o,end:o+t},context:s,snarls:{mode:this.snarlMode,fills:this.snarlFills,inserted:this.snarlNodes},keep:n,signal:this.signal,prefetchReferenceRange:(d,f,p)=>this.prefetchReferenceRange(d,f,p)});if(this.stats.keep=r.stats,r.stats.fallback!==void 0)return!1;let i=await this.db.pathsByHandle(),h=d=>({path:d.handles,offsets:d.offsets,len:d.len,weight:void 0,identity:{pathHandle:d.pathHandle,name:d===r.reference?e.name:i.get(d.pathHandle).name,orientation:d.orientation,hapStart:d.hapStart,hapEnd:d.hapEnd}}),c=[r.reference,...r.pieces].sort(Jt);return this.paths=c.map(h),this.refId=c.indexOf(r.reference),this.refPath=e.name,this.refHandle=e.handle,this.refInterval=[r.reference.hapStart,r.reference.hapEnd],this.dropTwins(),!0}async identifyPaths(){if(!this.db.hasHaplotypeIndex)throw new Error("The database has no HaplotypeSamples table; run gbz-haplotype-index on it");this.unsettled&&({paths:this.paths,refId:this.refId}=this.unsettled,this.unsettled=void 0,this.twinDeferred=!0);let e=await this.db.haplotypeSampleGap()??4096,t=pt(this.sortedHandles());if(t.length===0)return;let n=new Map,s=await Promise.all(t.map(([l,b])=>this.db.haplotypeSamplesInRange(l,b)));for(let l of s.flat())n.set(ke(l),l);let o=l=>{let b=0,x=t.length-1;for(;b<x;){let E=b+x+1>>1;t[E][0]<=l?b=E:x=E-1}let P=t[b];return P[0]<=l&&l<=P[1]},r=new Map;this.paths.forEach((l,b)=>{l.path.length>0&&b!==this.refId&&r.set(ke(Ge(l,0)),b)});let i=this.stats.identification;i.interval=e,i.scans=t,i.windowSamples=n.size,this.paths.forEach((l,b)=>{b!==this.refId&&i.fragmentLengths.push(l.len)});let h=this.recordReader(()=>{this.stats.identificationFetches+=1,i.graphFetches+=1}),c=l=>(i.graphLookups+=1,h(l)),d=async(l,b)=>{if(o(l.node))return n.get(ke(l));this.stats.identificationFetches+=1,i.companionSeeks+=1,b.seeks+=1;let x=await this.db.haplotypeSampleAt(l.node,l.offset);return x||(i.companionMisses+=1),x},f=new Map,p=async l=>{let b=f.get(l);if(!b){let x=await this.db.getPath(l);if(!x)throw new Error(`Path ${l} is missing from the database`);b=x.name,f.set(l,b)}return b},y=(l,b,x)=>l.orientation==="forward"?{pathHandle:l.pathHandle,orientation:"forward",base:l.pathOffset-b}:{pathHandle:l.pathHandle,orientation:"reverse",base:l.pathOffset+b+x},g=(l,b)=>l.orientation==="forward"?{pathHandle:l.pathHandle,orientation:"forward",base:l.hapStart-b}:{pathHandle:l.pathHandle,orientation:"reverse",base:l.hapEnd+b};for(let l=0;l<this.paths.length;l++){let b=this.paths[l];if(l===this.refId||b.identity)continue;let x=[],P=new Set,E={fragments:0,steps:0,seeks:0,reentries:0,twinLandings:0,end:"endmarker",pathHandle:void 0};i.chains.push(E);let R,m=0,I=l,$;for(;R===void 0;){if(this.signal?.throwIfAborted(),I!==void 0){if(P.has(I)){E.end="cycle";break}P.add(I);let H=this.paths[I];x.push({index:I,startBp:m}),E.fragments+=1;let k=m;for(let X=0;X<H.path.length;X++){let w=Ge(H,X),S=n.get(ke(w)),A=this.record(w.node).sequenceLen;if(S){R=y(S,k,A);break}k+=A}if(m+=H.len,R){E.end="in-fragment sample";break}let j=Ge(H,H.path.length-1);$=this.record(j.node).gbwt().lf(j.offset),I=void 0}if($===void 0||$.node===0){E.end="endmarker";break}let F=ke($),T=r.get(F);if(T!==void 0){let H=this.paths[T].identity;if(H){R=g(H,m),E.end="identified sibling";break}I=T;continue}this.records.has($.node)&&(E.reentries+=1),this.twinStarts.has(F)&&(E.twinLandings+=1);let D=await d($,E),C=await c($.node);if(D){R=y(D,m,C.sequenceLen),E.end="out-of-window sample";break}if(this.stats.identificationSteps+=1,E.steps+=1,m-x[x.length-1].startBp>4*e+4*C.sequenceLen){E.end="bound";break}m+=C.sequenceLen,$=C.gbwt().lf($.offset)}if(R){E.pathHandle=R.pathHandle;let F=await p(R.pathHandle);for(let{index:T,startBp:D}of x){let C=this.paths[T];C.identity=R.orientation==="forward"?{pathHandle:R.pathHandle,name:F,orientation:"forward",hapStart:R.base+D,hapEnd:R.base+D+C.len}:{pathHandle:R.pathHandle,name:F,orientation:"reverse",hapStart:R.base-D-C.len,hapEnd:R.base-D}}}}this.dropTwins()}refIndex(e){if(this.refIndexCache===void 0){let t=new Map;e.forEach((n,s)=>{let o=t.get(n);o?o.push(s):t.set(n,[s])}),this.refIndexCache=t}return this.refIndexCache}refPrefix(e){if(this.refPrefixCache===void 0){let t=[0];e.forEach((n,s)=>{t.push(t[s]+this.record(n).sequenceLen)}),this.refPrefixCache=t}return this.refPrefixCache}orderedMatches(e,t){let n=this.refIndex(t),s=new Int32Array(e.length),o=new Int32Array(e.length),r=0,i=-1;for(let h=0;h<e.length;h++){let c=n.get(e[h]);if(c){let d=zn(c,i);if(d===void 0)return;s[r]=h,o[r]=d,r+=1,i=d}}return{pathAt:s,refAt:o,count:r}}pathLen(e){let t=0;for(let n of e)t+=this.record(n).sequenceLen;return t}prefixMatches(e,t){let n=0,s=0,o=0,r=0,i=0;for(;s<e.length&&o<t.length;){let h=this.record(e[s]).sequence,c=this.record(t[o]).sequence;for(;r<h.length&&i<c.length;){if(h[r]!==c[i])return n;r+=1,i+=1,n+=1}r===h.length&&(s+=1,r=0),i===c.length&&(o+=1,i=0)}return n}suffixMatches(e,t){let n=0,s=0,o=0,r=0,i=0;for(;s<e.length&&o<t.length;){let h=this.record(e[e.length-s-1]).sequence,c=this.record(t[t.length-o-1]).sequence;for(;r<h.length&&i<c.length;){if(h[h.length-r-1]!==c[c.length-i-1])return n;r+=1,i+=1,n+=1}r===h.length&&(s+=1,r=0),i===c.length&&(o+=1,i=0)}return n}align(e,t,n){let s=this.pathLen(e),o=this.pathLen(t),r=this.prefixMatches(e,t),i=this.suffixMatches(e,t);r+i>s&&(i=s-r),r+i>o&&(i=o-r),K(n,"M",r),cn(n,s-r-i,o-r-i),K(n,"M",i)}sharedWeight(e,t){let n=this.refIndex(t),s=0;for(let o of e)n.has(o)&&(s+=this.record(o).sequenceLen);return s}editsAgainst(e,t){let n=this.orderedMatches(e,t);n?this.stats.orderedAlignments+=1:this.stats.lcsAlignments+=1;let s=n??qn(Wt(e,t,f=>this.record(f).sequenceLen)[0]),o=[],r=this.refPrefix(t),i=(f,p,y,g)=>{f===p?K(o,"D",r[g]-r[y]):y===g?K(o,"I",this.pathLen(e.slice(f,p))):this.align(e.slice(f,p),t.slice(y,g),o)},h=0,c=0,d=0;for(let f=0;f<s.count;f++){let p=s.pathAt[f],y=s.refAt[f];(c!==p||d!==y)&&i(c,p,d,y);let g=this.record(e[p]).sequenceLen;K(o,"M",g),h+=g,c=p+1,d=y+1}return i(c,e.length,d,t.length),{edits:o,matched:h,matches:s}}alignment(e){let t=this.paths[e];if(this.refId===void 0||e===this.refId||!t)return;let n=this.paths[this.refId].path,s;if(Oe(n)&&(t.identity===void 0||!Oe(Be(t.path))))s={...this.editsAgainst(t.path,n),flipped:!1};else{let o=Be(t.path),r=this.sharedWeight(t.path,n);if(this.sharedWeight(o,n)===0)s={...this.editsAgainst(t.path,n),flipped:!1};else if(r===0)s={...this.editsAgainst(o,n),flipped:!0};else{let h=this.editsAgainst(t.path,n),c=this.editsAgainst(o,n);s=c.matched>h.matched?{...c,flipped:!0}:{...h,flipped:!1}}}return s}alignToRef(e){return this.settleDeferred(),this.alignment(e)?.edits.map(([t,n])=>`${n}${t}`).join("")}alignments(){this.settleDeferred();let e=this.referenceInterval;if(this.refId===void 0||!e)throw new Error("Alignments need a reference path");let t=this.paths[this.refId].path,n=this.refPrefix(t)[t.length],s=(d,f,p,y)=>{let g=Qn(d),l=this.paths[p[0]],b=this.paths[p[p.length-1]],x=l.identity,P=x?.orientation==="forward",[E,R]=P?[l,b]:[b,l];return{strand:f,refStart:e.start+g.leading,refEnd:e.start+n-g.trailing,edits:g.edits,weight:l.weight,path:p.flatMap(m=>this.paths[m].path),start:Ge(l,0),pieces:p,soloAligned:y,identity:x===void 0?void 0:{pathHandle:x.pathHandle,name:x.name,hapStart:x.name.fragment+E.identity.hapStart,hapEnd:x.name.fragment+R.identity.hapEnd,walkForward:P}}},o=d=>d.soloAligned.reduce((f,p)=>f+p,0),r=d=>d.pieces.reduce((f,p)=>f+this.paths[p].len,0),i=d=>2*o(d)>=r(d),h=d=>{let f=d[0],p=d[d.length-1],y=f.identity.walkForward;if(d.some((k,j)=>k.strand!==f.strand||k.identity.walkForward!==y||j>0&&k.identity.hapStart<d[j-1].identity.hapEnd))return;let g=y?d:[...d].reverse(),l=g.flatMap(k=>k.pieces),b=g.flatMap(k=>k.soloAligned),x=f.strand==="+"!==y,P=l.map(k=>this.paths[k]),E=P.slice(1).map((k,j)=>{let X=P[j].identity;return y?k.identity.hapStart-X.hapEnd:X.hapStart-k.identity.hapEnd}),R=x?[...P].reverse():P,m=x?[...E].reverse():E,I=R.flatMap(k=>x?Be(k.path):k.path),{edits:$}=this.editsAgainst(I,t),F=hn($,R.map(k=>k.len)),T=new Map((x?[...l].reverse():l).map((k,j)=>[k,F[j]])),D=k=>2*k.pieces.reduce((j,X)=>j+T.get(X),0)>=o(k);if(!D(f)||!D(p))return;let C=[],H=0;return R.slice(0,-1).forEach((k,j)=>{H+=k.len,C.push([H,m[j]])}),s(Kn($,C),f.strand,l,b)},c=[];return this.paths.forEach((d,f)=>{if(f===this.refId)return;let{edits:p,flipped:y}=this.alignment(f),g=d.identity,l=g?g.orientation==="forward"!==y:!y;c.push(s(p,l?"+":"-",[f],hn(p,[d.len])))}),Un(c,i,h).map(d=>{let{edits:f,identity:p,pieces:y,soloAligned:g,...l}=d,b={...l,cigar:Zn(f)};return p?{...b,resolved:!0,name:p.name,label:fe({...p.name,fragment:p.hapStart,end:p.hapEnd}),pathHandle:p.pathHandle,hapStart:p.hapStart,hapEnd:p.hapEnd}:{...b,resolved:!1}})}pairAlignments(e){let{target:t,query:n,...s}=e,o=this.paths.flatMap(d=>{let{identity:f}=d;return f?[{name:f.name,start:f.name.fragment+f.hapStart,steps:Ke(d,f)}]:[]}),r=d=>f=>f.sample===d.sample&&f.haplotype===d.haplotype,i=r(t),h=n?r(n):d=>!i(d),c=d=>this.record(ce(d,"forward")).sequence;return o.filter(d=>i(d.name)).flatMap(d=>o.filter(f=>h(f.name)).flatMap(f=>Vt({...s,query:f.steps,target:d.steps,sequenceOf:c}).map(p=>({query:f.name,queryStart:f.start+p.queryStart,queryEnd:f.start+p.queryEnd,strand:p.strand,target:d.name,targetStart:d.start+p.targetStart,targetEnd:d.start+p.targetEnd,cigar:Gt(p.edits),matches:p.edits.reduce((y,[g,l])=>y+(g==="="?l:0),0),columns:p.edits.reduce((y,[,g])=>y+g,0),sharedBases:p.sharedBases}))))}canonicalEdges(e){let t=[];for(let n of["forward","reverse"]){let s=ce(e,n);for(let o of this.record(s).successors())this.hasHandle(o)&&He(s,o)&&t.push([n==="reverse"?1:0,N(o),Q(o)?1:0])}return t.sort((n,s)=>n[0]-s[0]||n[1]-s[1]||n[2]-s[2]),t.filter((n,s)=>s===0||n[0]!==t[s-1][0]||n[1]!==t[s-1][1]||n[2]!==t[s-1][2])}async stableName(){let e=new TextEncoder,t=[];for(let n of this.sortedHandles())if(!Q(n)){let s=N(n),o=`S ${s} ${this.record(n).sequence}
|
|
2
|
+
`;for(let[r,i,h]of this.canonicalEdges(s))o+=`L ${s} ${r?"-":"+"} ${i} ${h?"-":"+"}
|
|
3
|
+
`;t.push(e.encode(o))}return an(t)}async toGFA(e={}){this.settleDeferred();let t=e.cigar??!1,n=[this.refPath?`H VN:Z:1.1 RS:Z:${this.refPath.sample}`:"H VN:Z:1.1",...rn(on(await this.stableName(),await this.db.graphName()))],s=this.sortedHandles();for(let c of s)Q(c)||n.push(`S ${N(c)} ${this.record(c).sequence}`);let o=c=>Q(c)?"-":"+";for(let c of s)for(let d of this.record(c).successors())this.hasHandle(d)&&He(c,d)&&n.push(`L ${N(c)} ${o(c)} ${N(d)} ${o(d)} 0M`);let r=(c,d,f,p,y)=>{let g=Ke(c,d).map(x=>`${Q(x)?"<":">"}${N(x)}`).join(""),l=c.weight===void 0?"":` WT:i:${c.weight}`,b=y===void 0?"":` CG:Z:${y}`;return`W ${f.sample} ${f.haplotype} ${f.contig} ${f.fragment} ${p} ${g}${l}${b}`},i=this.refPath?.contig??"unknown";this.refId!==void 0&&this.refPath&&this.refInterval&&n.push(r(this.paths[this.refId],void 0,{...this.refPath,fragment:this.refPath.fragment+this.refInterval[0]},this.refPath.fragment+this.refInterval[1],void 0));let h=1;return this.paths.forEach((c,d)=>{if(d!==this.refId){let f=e.names!=="anonymous"?c.identity:void 0,p=t?this.alignToRef(d):void 0;n.push(f?r(c,f,{...f.name,fragment:f.name.fragment+f.hapStart},f.name.fragment+f.hapEnd,p):r(c,void 0,{sample:"unknown",contig:i,haplotype:h,fragment:0},c.len,p)),h+=1}}),`${n.join(`
|
|
4
|
+
`)}
|
|
5
|
+
`}outputPaths(e){this.settleDeferred();let t=e.cigar??!1,n=[],s=this.refPath?.contig??"unknown";if(this.refId!==void 0&&this.refPath&&this.refInterval){let r={...this.refPath,fragment:this.refPath.fragment+this.refInterval[0]};n.push({info:this.paths[this.refId],identity:void 0,name:fe({...r,end:this.refPath.fragment+this.refInterval[1]}),cigar:void 0})}let o=1;return this.paths.forEach((r,i)=>{if(i===this.refId)return;let h=e.names!=="anonymous"?r.identity:void 0;n.push({info:r,identity:h,name:h?fe({...h.name,fragment:h.name.fragment+h.hapStart,end:h.name.fragment+h.hapEnd}):fe({sample:"unknown",contig:s,haplotype:o,fragment:0,end:r.len}),cigar:t?this.alignToRef(i):void 0}),o+=1}),n}*outputEdges(){for(let e of this.sortedHandles())for(let t of this.record(e).successors())this.hasHandle(t)&&He(e,t)&&(yield[e,t])}walkSpans(){return this.settleDeferred(),this.paths.flatMap((e,t)=>{let n=t===this.refId?void 0:e.identity;return n?[{name:n.name,start:n.name.fragment+n.hapStart,end:n.name.fragment+n.hapEnd}]:[]})}toSubgraphJson(e={}){let t=this.sortedHandles().filter(o=>!Q(o)).map(o=>({id:String(N(o)),sequence:this.record(o).sequence})),n=[];for(let[o,r]of this.outputEdges())n.push({from:String(N(o)),from_is_reverse:Q(o),to:String(N(r)),to_is_reverse:Q(r)});let s=this.outputPaths(e).map(o=>Gn(o.info,o.identity,o.name,o.cigar));return{nodes:t,edges:n,paths:s}}toCompactSubgraph(e={}){let t=this.sortedHandles().filter(r=>!Q(r)),n=new Int32Array(t.length),s=[];t.forEach((r,i)=>{n[i]=N(r),s.push(this.record(r).sequence)});let o=[];for(let[r,i]of this.outputEdges())o.push(r,i);return{nodeIds:n,nodeSequences:s,edges:Int32Array.from(o),paths:this.outputPaths(e).map(r=>({name:r.name,weight:r.info.weight,cigar:r.cigar,steps:Int32Array.from(Ke(r.info,r.identity))}))}}};function Ke(a,e){return e?.orientation==="reverse"?a.path.map(t=>ee(t)).reverse():a.path}function Gn(a,e,t,n){return{name:t,...a.weight===void 0?{}:{weight:a.weight},...n===void 0?{}:{cigar:n},path:Ke(a,e).map(s=>({id:String(N(s)),is_reverse:Q(s)}))}}function wt(a,e){let t=Math.min(a.length,e.length);for(let n=0;n<t;n++){let s=a[n],o=e[n];if(s!==o)return s<o?-1:1}return a.length-e.length}function K(a,e,t){if(t===0)return;let n=a[a.length-1];n?.[0]===e?n[1]+=t:a.push([e,t])}function Qe(a){return a===0?0:6+(a-1)}function cn(a,e,t){if(e===0)K(a,"D",t);else if(t===0)K(a,"I",e);else{let n=Math.min(e,t),s=4*n+Qe(e-n)+Qe(t-n),o=Qe(e)+Qe(t);s<=o?(K(a,"M",n),K(a,"I",e-n),K(a,"D",t-n)):(K(a,"I",e),K(a,"D",t))}}function Qn(a){let e=0;for(;e<a.length&&a[e][0]!=="M";)e+=1;if(e===a.length){let i=a.filter(([c])=>c==="I"),h=a.filter(([c])=>c==="D").reduce((c,[,d])=>c+d,0);return{edits:i.map(([c,d])=>[c,d]),leading:0,trailing:h}}let t=a.length;for(;a[t-1][0]!=="M";)t-=1;let n=i=>({inserted:i.reduce((h,[c,d])=>h+(c==="I"?d:0),0),deleted:i.reduce((h,[c,d])=>h+(c==="D"?d:0),0)}),s=n(a.slice(0,e)),o=n(a.slice(t)),r=[];K(r,"I",s.inserted);for(let[i,h]of a.slice(e,t))K(r,i,h);return K(r,"I",o.inserted),{edits:r,leading:s.deleted,trailing:o.deleted}}function hn(a,e){let t=e.map(()=>0),n=e.length-1,s=0,o=e[0],r=0;for(let[i,h]of a){if(i==="D")continue;let c=h;for(;c>0;){for(;s<n&&r>=o;)s+=1,o+=e[s];let d=s<n?Math.min(c,o-r):c;i==="M"&&(t[s]+=d),r+=d,c-=d}}return t}function Kn(a,e){let t=[],n=0,s=0;for(let[o,r]of a){if(o==="D"){K(t,o,r);continue}let i=n;for(;s<e.length&&e[s][0]<n+r;){let[h,c]=e[s];K(t,o,h-i),K(t,"I",c),i=h,s+=1}K(t,o,n+r-i),n+=r}for(;s<e.length;s++)K(t,"I",e[s][1]);return t}function Zn(a){return a.map(([e,t])=>`${t}${e}`).join("")}var Fe=class{offset=0;bytes;constructor(e){this.bytes=e}get done(){return this.offset>=this.bytes.length}byte(){let e=this.bytes[this.offset];if(e!==void 0)return this.offset+=1,e}int(){let e=1,t=0;for(;this.offset<this.bytes.length;){let n=this.bytes[this.offset];if(this.offset+=1,t+=(n&127)*e,e*=128,(n&128)===0)return t}}},dn=255,Xn=256,Ze=class{source;sigma;threshold;constructor(e,t){this.source=new Fe(e),this.sigma=t===0?Number.MAX_SAFE_INTEGER:t,this.threshold=this.sigma<dn?Math.floor(Xn/this.sigma):0}next(){if(this.sigma>=dn){let s=this.source.int(),o=this.source.int();return s===void 0||o===void 0?void 0:{value:s,len:o+1}}let e=this.source.byte();if(e===void 0)return;let t=e%this.sigma,n=Math.floor(e/this.sigma)+1;if(n===this.threshold){let s=this.source.int();if(s===void 0)return;n+=s}return{value:t,len:n}}*[Symbol.iterator](){for(let e=this.next();e!==void 0;e=this.next())yield e}};function fn(a){let e=new Fe(a),t=e.int();if(t===void 0||t===0)return[];let n=[],s=0;for(let o=0;o<t;o++){let r=e.int(),i=e.int();if(r===void 0||i===void 0)throw new Error("GBWT edge list ends early");s+=r,n.push({node:s,offset:i})}return n}var Xe=class{edges;bwt;constructor(e,t){this.edges=e,this.bwt=t}runs(){return new Ze(this.bwt,this.edges.length)}edge(e){let t=this.edges[e];if(t===void 0)throw new Error(`GBWT run refers to edge rank ${e} of ${this.edges.length}`);return t}lf(e){let t=this.edges.map(s=>s.offset),n=0;for(let s of this.runs()){let o=this.edge(s.value),r=t[s.value];if(n+s.len>e)return o.node===0?void 0:{node:o.node,offset:r+(e-n)};t[s.value]=r+s.len,n+=s.len}}edgeTo(e){let t=0,n=this.edges.length;for(;t<n;){let s=t+n>>1,o=this.edges[s];if(o.node===e)return s;o.node<e?t=s+1:n=s}}offsetTo(e){if(e.node===0)return;let t=this.edgeTo(e.node);if(t===void 0)return;let n=this.edges[t].offset;if(n>e.offset)return;let s=0;for(let o of this.runs())if(s+=o.len,o.value===t&&(n+=o.len,n>e.offset))return s-(n-e.offset)}predecessorAt(e){let t=this.edges.map(s=>({node:s.node===0?0:ee(s.node),count:0}));for(let s of this.runs()){let o=t[s.value];o&&(o.count+=s.len)}for(let s=1;s<t.length;s++){let o=t[s-1],r=t[s];N(o.node)===N(r.node)&&(t[s-1]=r,t[s]=o)}let n=0;for(let s of t)if(n+=s.count,n>e)return s.node===0?void 0:s.node}decompressArrays(){let e=this.edges.map(r=>r.offset),t=0;for(let r of this.runs())t+=r.len;let n=new Int32Array(t),s=new Int32Array(t),o=0;for(let r of this.runs()){let i=this.edge(r.value),h=e[r.value];for(let c=0;c<r.len;c++)n[o]=i.node,s[o]=h,h+=1,o+=1;e[r.value]=h}return{nodes:n,offsets:s}}decompress(){let e=this.edges.map(n=>n.offset),t=[];for(let n of this.runs()){let s=this.edge(n.value);for(let o=0;o<n.len;o++)t.push({node:s.node,offset:e[n.value]}),e[n.value]=e[n.value]+1}return t}};function xe(a,e,t=0){if(!Number.isSafeInteger(e)||e<t)throw new Error(`${a} must be a whole number${t>0?` of at least ${t}`:""}, not ${e}`);return e}function Je(a){return xe("context",a.context??100)}function Ye(a,e){return e.limit!==void 0&&xe("limit",e.limit),_e.create(a,e)}async function ln(a,e){let t=Je(e),n=Ye(a,e),s=await n.pathPosition($e(Ae(e.path),xe("offset",e.offset)));return await n.aroundPosition(s.position.handle,s.position.nodeOffset,t),await n.extractSnarls(e.snarls??"none"),n.extractPaths(s,e.haplotypes??"all"),n}async function Jn(a,e){let t=xe("start",e.start),n=xe("end",e.end),s=Je(e),o=Ye(a,e);try{let r=await o.pathPosition($e(Ae(e.path),t));return await o.prefetchReferenceWalk(r,n-t),await o.aroundInterval(r.position,n-t,s),await o.extractSnarls(e.snarls??"none"),{subgraph:o,reference:r}}catch(r){throw r instanceof le&&r.windowBp===void 0?new le(r.limit,{windowBp:n-t,walkedBp:o.referenceWalkedBp??0}):r}}async function gt(a,e){let{keep:t}=e,n=e.haplotypes??"all",s=n==="all"||n==="distinct";if(t!==void 0&&s&&!a.hasHaplotypeIndex)throw new Error("keep needs the haplotype index: this database cannot name its walks");let{subgraph:o,reference:r}=await Jn(a,e);return t===void 0||!s?(o.extractPaths(r,n),o):(await o.extractChosenPaths(r,e.end-e.start,t,Je(e))||(o.extractPaths(r,"all"),await o.identifyPaths()),o.keepHaplotypes(t),n==="distinct"&&o.mergeDistinct(),o)}async function pn(a,e){let t=e.haplotypes??"all",n=e.snarls??"none";if(t==="reference-only")throw new Error("Cannot output a reference path in a node-based query");if(n==="overlapping"&&new Set(e.nodeIds).size>1)throw new Error("Overlapping snarls cannot be extracted for a node-based query with multiple nodes");let s=Je(e);for(let r of e.nodeIds)xe("node id",r,1);let o=Ye(a,e);return await o.aroundNodes(e.nodeIds,s),await o.extractSnarls(n),o.extractPaths(void 0,t),o}async function un(a,e){let t=e.haplotypes??"all";if(t==="reference-only")throw new Error("Cannot output a reference path in a node-based query");let n=Ye(a,e);return await n.betweenNodes(xe("startHandle",e.startHandle,2),xe("endHandle",e.endHandle,2)),n.extractPaths(void 0,t),n}function ge(a,e){let t=0;for(let s=0;s<8;s++){let o=a[e+s];if(o===void 0)throw new Error("SQLite varint runs past the end of the buffer");if(t=t*128+(o&127),(o&128)===0){if(s===7&&!Number.isSafeInteger(t))throw new Error("SQLite varint exceeds the safe integer range");return[t,e+s+1]}}let n=a[e+8];if(n===void 0)throw new Error("SQLite varint runs past the end of the buffer");if(t=t*256+n,!Number.isSafeInteger(t))throw new Error("SQLite varint exceeds the safe integer range");return[t,e+9]}function Yn(a,e,t){switch(t){case 1:return a.getInt8(e);case 2:return a.getInt16(e);case 3:return a.getInt8(e)<<16|a.getUint16(e+1);case 4:return a.getInt32(e);case 6:return a.getInt16(e)*4294967296+a.getUint32(e+2);default:{let n=a.getBigInt64(e);if(n>BigInt(Number.MAX_SAFE_INTEGER)||n<BigInt(Number.MIN_SAFE_INTEGER))throw new Error(`SQLite integer ${n} exceeds the safe integer range`);return Number(n)}}}var es=new TextDecoder;function et(a){let[e,t]=ge(a,0),n=[],s=t;for(;s<e;){let[i,h]=ge(a,s);n.push(i),s=h}let o=new DataView(a.buffer,a.byteOffset,a.byteLength),r=e;return n.map(i=>{if(i===0)return null;if(i>=1&&i<=6){let h=i<=4?i:i===5?6:8,c=Yn(o,r,h);return r+=h,c}if(i===7){let h=o.getFloat64(r);return r+=8,h}if(i===8)return 0;if(i===9)return 1;if(i>=12){let h=i-12>>1,c=a.subarray(r,r+h);return r+=h,i%2===0?c:es.decode(c)}throw new Error(`SQLite serial type ${i} is reserved`)})}var nt=2,st=5,wn=10,tt=13;function gn(a,e){return a[e]*256+a[e+1]}function Se(a,e){return a[e]*16777216+a[e+1]*65536+a[e+2]*256+a[e+3]}function ts(a,e){let t=a[e];if(t!==nt&&t!==st&&t!==wn&&t!==tt)throw new Error(`SQLite page has unknown b-tree type ${t}`);let n=t===nt||t===st;return{type:t,cellCount:gn(a,e+3),rightChild:n?Se(a,e+8):0,cellPointers:e+(n?12:8)}}function me(a,e,t){return gn(a,e.cellPointers+2*t)}var ns=4096,ot=class{usable;pager;decodedIndexPages=new Map;tableDepths=new Map;constructor(e,t){this.pager=e,this.usable=e.pageSize-t}localPayloadSize(e,t){let n=this.usable,s=t?Math.floor((n-12)*64/255)-23:n-35;if(e<=s)return e;let o=Math.floor((n-12)*32/255)-23,r=o+(e-o)%(n-4);return r<=s?r:o}async payload(e,t,n,s){let o=this.localPayloadSize(n,s);if(o===n)return e.subarray(t,t+n);let r=new Uint8Array(n);r.set(e.subarray(t,t+o),0);let i=o,h=Se(e,t+o);for(;h!==0&&i<n;){let c=await this.pager.page(h),d=c.subarray(4,4+Math.min(this.usable-4,n-i));r.set(d,i),i+=d.length,h=Se(c,0)}if(i!==n)throw new Error("SQLite overflow chain ended before the payload was complete");return r}async pageAt(e){let t=await this.pager.page(e);return{page:t,header:ts(t,e===1?100:0)}}tableDepth(e,t){let n=this.tableDepths.get(e);return n||(n=(async()=>{let s=e;for(let o=0;;o++){let{page:r,header:i}=await this.pageAt(s);if(i.type===tt)return o;if(i.type!==st)throw new Error("SQLite table b-tree contains an index page");let h=this.childIndexFor(r,i,t);s=h===i.cellCount?i.rightChild:Se(r,me(r,i,h))}})(),this.tableDepths.set(e,n),n.catch(()=>this.tableDepths.delete(e))),n}childIndexFor(e,t,n){let s=0,o=t.cellCount;for(;s<o;){let r=s+o>>1,[i]=ge(e,me(e,t,r)+4);i<n?s=r+1:o=r}return s}async prefetchRowidRanges(e,t,n=!1){if(t.length===0)return!0;let s=await this.tableDepth(e,t[0][0]),o=t.map(()=>[e]);for(let r=0;r<s;r++){o=await Promise.all(o.map((h,c)=>this.childrenInRange(h,...t[c])));let i=o.flat();if(n)this.pager.prefetchLeading(i);else if(!this.pager.prefetch(i))return!1}return!0}async childrenInRange(e,t,n){let s=await Promise.all(e.map(r=>this.pageAt(r))),o=[];return s.forEach(({page:r,header:i},h)=>{let c=h===0?this.childIndexFor(r,i,t):0,d=h===s.length-1?this.childIndexFor(r,i,n):i.cellCount;for(let f=c;f<=d;f++)o.push(f===i.cellCount?i.rightChild:Se(r,me(r,i,f)))}),o}async tableRowid(e,t){let n=e;for(;;){let{page:s,header:o}=await this.pageAt(n);if(o.type===tt){let h=0,c=o.cellCount;for(;h<c;){let d=h+c>>1,f=me(s,o,d),[p,y]=ge(s,f),[g,l]=ge(s,y);if(g===t)return et(await this.payload(s,l,p,!1));g<t?h=d+1:c=d}return}if(o.type!==st)throw new Error("SQLite table b-tree contains an index page");let r=0,i=o.cellCount;for(;r<i;){let h=r+i>>1,c=me(s,o,h),[d]=ge(s,c+4);d<t?r=h+1:i=h}n=r===o.cellCount?o.rightChild:Se(s,me(s,o,r))}}async*tableScan(e){yield*this.scanPage(e,await this.tableDepth(e,0))}async*scanPage(e,t){let{page:n,header:s}=await this.pageAt(e);if(s.type===tt)for(let o=0;o<s.cellCount;o++){let r=me(n,s,o),[i,h]=ge(n,r),[c,d]=ge(n,h);yield{rowid:c,values:et(await this.payload(n,d,i,!1))}}else{let o=[];for(let r=0;r<s.cellCount;r++)o.push(Se(n,me(n,s,r)));o.push(s.rightChild),t===1&&this.pager.prefetchLeading(o);for(let r of o)yield*this.scanPage(r,t-1)}}decodedCells(e,t){let n=this.decodedIndexPages.get(e);if(n)this.decodedIndexPages.delete(e);else if(n=new Array(t.cellCount),this.decodedIndexPages.size>=ns){let s=this.decodedIndexPages.keys().next().value;s!==void 0&&this.decodedIndexPages.delete(s)}return this.decodedIndexPages.set(e,n),n}async indexCell(e,t,n,s){let o=this.decodedCells(e,n),r=o[s];if(!r){let i=me(t,n,s),h=n.type===nt,[c,d]=ge(t,h?i+4:i);r={values:et(await this.payload(t,d,c,!0)),leftChild:h?Se(t,i):0},o[s]=r}return r}async lowerBound(e,t,n,s,o,r){let i=o,h=n.cellCount;for(;i<h;){let c=i+h>>1,d=await this.indexCell(e,t,n,c),f=mt(d.values,s);f<0||r&&f===0?i=c+1:h=c}return i}async*indexScanFrom(e,t,n){let{page:s,header:o}=await this.pageAt(e),r=await this.lowerBound(e,s,o,t,0,!1),i=o.type===nt;if(i&&n){let h=await this.lowerBound(e,s,o,n,r,!0),c=[];for(let d=r;d<=h;d++)c.push(d===o.cellCount?o.rightChild:(await this.indexCell(e,s,o,d)).leftChild);this.pager.prefetchLeading(c)}for(let h=r;h<o.cellCount;h++){let c=await this.indexCell(e,s,o,h);if(i&&(yield*this.indexScanFrom(c.leftChild,t,n)),n&&mt(c.values,n)>0)return;yield c.values}i&&(yield*this.indexScanFrom(o.rightChild,t,n))}async indexSeekLE(e,t){let n,s=e;for(;;){let{page:o,header:r}=await this.pageAt(s),i=0,h=r.cellCount,c=0;for(;i<h;){let d=i+h>>1,f=await this.indexCell(s,o,r,d);mt(f.values,t)<=0?(n=f.values,i=d+1):(c=f.leftChild,h=d)}if(r.type===wn)return n;s=i===r.cellCount?r.rightChild:c}}};function mt(a,e){for(let t=0;t<e.length;t++){let n=a[t],s=e[t];if(typeof n!="number"||s===void 0)throw new Error("SQLite index key is not numeric");if(n!==s)return n<s?-1:1}return 0}function mn({blockSize:a,maxBlocks:e}){if(a!==void 0&&!(Number.isSafeInteger(a)&&a>0))throw new Error(`blockSize must be a positive integer, not ${a}`);if(e!==void 0&&!(Number.isSafeInteger(e)&&e>0))throw new Error(`maxBlocks must be a positive integer, not ${e}`)}var rt=class{blocks=new Map;blockSize;maxBlocks;plan;bytesFetched=0;fetches=0;source;pageSize;fileSize;constructor(e,t,n,s={}){this.source=e,this.pageSize=t,this.fileSize=n;let o=s.blockSize??65536;this.blockSize=Math.max(t,Math.ceil(o/t)*t),this.maxBlocks=s.maxBlocks??256}async read(e,t){let n=await this.readRetrying(e,t);if(this.bytesFetched+=n.length,n.length<e)throw new Error(`the file ends at byte ${t+n.length}, short of the ${this.fileSize} bytes its SQLite header gives`);return n}async readRetrying(e,t){let n=0;for(;;)try{return await this.source.read(e,t)}catch(s){if(n+=1,n>=3)throw s;await new Promise(o=>setTimeout(o,200*n))}}seed(e,t){t.length===Math.min(this.blockSize,this.fileSize-e*this.blockSize)&&this.blocks.set(e,Promise.resolve(t))}block(e){this.follow(e);let t=this.touch(e);if(t)return t;let n=e*this.blockSize,s=Math.min(this.blockSize,this.fileSize-n),o=this.read(s,n);return this.fetches+=1,this.store(e,o),this.evict(),o}touch(e){let t=this.blocks.get(e);return t&&(this.blocks.delete(e),this.blocks.set(e,t)),t}blockOf(e){return Math.floor((e-1)*this.pageSize/this.blockSize)}get prefetchBudget(){return Math.max(1,Math.floor(this.maxBlocks/2))}get chunk(){return Math.max(1,Math.floor(this.prefetchBudget/2))}prefetch(e){let t=new Set(e.map(n=>this.blockOf(n)));return t.size>this.prefetchBudget?!1:(this.fetchBlocks(t),!0)}prefetchLeading(e){let t=[],n=new Map;for(let s of e){let o=this.blockOf(s);n.has(o)||(n.set(o,t.length),t.push(o))}this.plan={blocks:t,position:n,next:0},this.advance(this.prefetchBudget)}advance(e){let t=this.plan;if(!t)return;let n=t.blocks.slice(t.next,t.next+e);t.next+=n.length,t.next>=t.blocks.length&&(this.plan=void 0),this.fetchBlocks(new Set(n))}follow(e){let t=this.plan,n=t?.position.get(e);t&&n!==void 0&&n>=t.next-Math.ceil(this.chunk/2)&&this.advance(this.chunk)}fetchBlocks(e){let t=[...e].filter(s=>!this.touch(s)).sort((s,o)=>s-o),n=0;for(;n<t.length;){let s=n+1;for(;s<t.length&&t[s]===t[s-1]+1;)s+=1;this.fetchRun(t[n],s-n),n=s}}fetchRun(e,t){let n=e*this.blockSize,s=Math.min(t*this.blockSize,this.fileSize-n),o=this.read(s,n);this.fetches+=1;for(let r=0;r<t;r++){let i=r*this.blockSize;this.store(e+r,o.then(h=>h.subarray(i,i+this.blockSize)))}this.evict()}store(e,t){this.blocks.set(e,t),t.catch(()=>{this.blocks.get(e)===t&&this.blocks.delete(e)})}evict(){for(;this.blocks.size>this.maxBlocks;){let e=this.blocks.keys().next().value;if(e===void 0)break;this.blocks.delete(e)}}async page(e){let t=(e-1)*this.pageSize;if(e<1||t+this.pageSize>this.fileSize)throw new Error(`SQLite page ${e} is outside the file`);let n=await this.block(Math.floor(t/this.blockSize)),s=t%this.blockSize;return n.subarray(s,s+this.pageSize)}};var qe=class a{pager;btree;objects;constructor(e,t,n){this.pager=e,this.btree=t,this.objects=n}static async open(e,t={}){mn(t);let n=await e.read(Math.max(512,t.blockSize??65536),0),s=n.subarray(0,100);if(new TextDecoder().decode(s.subarray(0,15))!=="SQLite format 3"||s.length<100)throw new Error("Not a SQLite database");let r=new DataView(s.buffer,s.byteOffset,s.byteLength),i=r.getUint16(16),h=i===1?65536:i,c=s[20]??0,d=r.getUint32(56);if(d!==1)throw new Error(`SQLite text encoding ${d} is not UTF-8`);let f=r.getUint32(28);if(f===0||r.getUint32(24)!==r.getUint32(92))throw new Error("SQLite header has no valid database size; the file was written by SQLite older than 3.7.0");let p=f*h,y=new rt(e,h,p,t);y.seed(0,n),y.fetches+=1,y.bytesFetched+=n.length;let g=new ot(y,c),l=new Map;for await(let{values:b}of g.tableScan(1)){let[x,P,E,R,m]=b;typeof x=="string"&&typeof P=="string"&&typeof E=="string"&&typeof R=="number"&&l.set(P,{type:x,name:P,tableName:E,rootPage:R,sql:typeof m=="string"?m:""})}return new a(y,g,l)}rootPage(e){let t=this.objects.get(e);if(!t)throw new Error(`SQLite database has no object named ${e}`);return t.rootPage}withoutRowid(e){let t=this.objects.get(e);return t?.type==="table"&&/without\s+rowid/i.test(t.sql)}indexOn(e){let t=[...this.objects.values()].find(n=>n.type==="index"&&n.tableName===e);if(t)return t.rootPage;if(this.withoutRowid(e))return this.rootPage(e);throw new Error(`SQLite table ${e} has no index`)}byRowid(e,t){return this.btree.tableRowid(this.rootPage(e),t)}prefetchRows(e,t,n=!1){return this.btree.prefetchRowidRanges(this.rootPage(e),t,n)}scan(e){return this.btree.tableScan(this.rootPage(e))}indexSeekLE(e,t){return this.btree.indexSeekLE(this.indexOn(e),t)}indexScanFrom(e,t,n){return this.btree.indexScanFrom(this.indexOn(e),t,n)}has(e){return this.objects.has(e)}};var It="GBZ-base version 4",at=class extends Error{name="UnknownPathError";path;constructor(e){super(`the graph has no path named ${fe(e)}`),this.path=e}},it=class extends Error{name="ForwardOnlyIndexError";constructor(){super("the haplotype index was written with --forward-only, which cannot name the walks stored against their reference (about half of them); rebuild it with gbz-haplotype-index without --forward-only")}},ht=class extends Error{name="SchemaVersionError";found;constructor(e){super(e===void 0?"not a gbz-base database: it has no version tag":`unsupported database schema "${e}"; this reader understands "${It}"`),this.found=e}};function ss(a){if(a.length===1)return a[0];let e=new Uint8Array(a.reduce((n,s)=>n+s.length,0)),t=0;for(let n of a)e.set(n,t),t+=n.length;return e}var yt=3,Re=class{at=0;bytes;constructor(e){this.bytes=e}get done(){return this.at>=this.bytes.length}next(){let e=0,t=1;for(;;){let n=this.bytes[this.at++];if(n===void 0)throw new Error("a haplotype index blob ends inside a number");if(e+=(n&127)*t,t*=128,(n&128)===0)return e}}};function os(a,e){let t=new Re(a),n=0;for(;!t.done;){let s=n+t.next();n=s+t.next(),e.push([s,n])}}function rs(a){a.sort((n,s)=>n[0]-s[0]);let e=[],t=[];for(let[n,s]of a){let o=t.length-1;o>=0&&n<=t[o]+1?t[o]=Math.max(t[o],s):(e.push(n),t.push(s))}return n=>{let s=0,o=e.length;for(;s<o;){let r=s+o>>1;e[r]<=n?s=r+1:o=r}return s>0&&n<=t[s-1]}}function as(a,e,t){let n=new Re(e);for(;!n.done;){let s=n.next(),o=n.next(),r=n.next(),i=n.next(),h=n.next();t.push({bin:a,pathHandle:s,pathStart:o,pathEnd:r,snarl:h>0?[i,h]:void 0,node:n.next(),offset:n.next()})}}function is(a,e,t){let n=N(a);for(let s of e){let o=new Re(s);for(;!o.done;){let r=o.next(),i=r%2;t.push({node:2*n+i,offset:o.next(),pathHandle:(r-i)/2,orientation:"forward",pathOffset:o.next()})}}}var xt=class{sequenceLen;handle;edges;bwt;encodedSequence;next;decoded;constructor(e,t,n,s,o){this.handle=e,this.edges=t,this.bwt=n,this.encodedSequence=s,this.next=o,this.sequenceLen=jt(s)}get id(){return N(this.handle)}get orientation(){return Ee(this.handle)}get sequence(){return this.decoded??=Ut(this.encodedSequence),this.decoded}successors(){return this.edges.filter(e=>e.node!==0).map(e=>e.node)}gbwt(){if(this.edges.length===0)throw new Error(`GBWT record for handle ${this.handle} is empty`);return new Xe(this.edges,this.bwt)}};function V(a,e){if(typeof a!="number")throw new Error(`${e} is not a number in the database`);return a}function ze(a,e){if(typeof a!="string")throw new Error(`${e} is not text in the database`);return a}function ve(a,e){if(!(a instanceof Uint8Array))throw new Error(`${e} is not a blob in the database`);return a}function yn(a,e){return{handle:a,fwStart:{node:V(e[1],"Paths.fw_node"),offset:V(e[2],"Paths.fw_offset")},revStart:{node:V(e[3],"Paths.rev_node"),offset:V(e[4],"Paths.rev_offset")},name:{sample:ze(e[5],"Paths.sample"),contig:ze(e[6],"Paths.contig"),haplotype:V(e[7],"Paths.haplotype"),fragment:V(e[8],"Paths.fragment")},isIndexed:V(e[9],"Paths.is_indexed")!==0}}function bt(a,e){return a.catch(e),a}async function bn(a){let e=new Map;for await(let{values:t}of a.scan("Tags"))e.set(ze(t[0],"Tags.key"),ze(t[1],"Tags.value"));return e}var St=class a{pathCache;pathMapCache;indexTags=new Map;overviewRowsCache;sqlite;index;tagMap;constructor(e,t,n){this.sqlite=e,this.index=t,this.tagMap=n}static async open(e){let{source:t,haplotypeIndex:n}=e,s={blockSize:e.blockSize,maxBlocks:e.maxBlocks},o=await qe.open(t,s),r=o.objects.has("Tags")?await bn(o):new Map,i=r.get("version");if(i!==It)throw new ht(i);for(let d of["Nodes","Paths","ReferenceIndex"])o.rootPage(d);let h=n?await qe.open(n,s):void 0,c=new a(o,h,r);if(h){for(let l of["Tags","HaplotypeSamples","HaplotypeLengths"])if(!h.objects.has(l))throw new Error(`haplotypeIndex is not a gbz-base haplotype index: it has no ${l} table`);c.indexTags=await bn(h);let d=c.indexTags.get("haplotype_index_paths"),f=await c.tag("paths");if(d!==f)throw new Error(`haplotype index was built for ${d??"an unknown number of"} paths but the graph has ${f}`);let p=c.indexTags.get("haplotype_index_nodes"),y=await c.tag("nodes");if(p!==void 0&&p!==y)throw new Error(`haplotype index was built for a graph with ${p} nodes but this one has ${y}`);if(c.indexTags.get("haplotype_index_orientations")==="forward")throw new it;let g=c.indexTags.get("haplotype_index_format");if(Number(g)!==yt)throw new Error(g===void 0?`the haplotype index predates format ${yt}; rebuild it with gbz-haplotype-index 0.3`:`the haplotype index has format ${g}; this version of @gmod/gbz-base reads format ${yt}`)}return c}async tags(){return this.tagMap}async tag(e){return this.tagMap.get(e)}prefetchRecords(e,t=!1){return this.sqlite.prefetchRows("Nodes",e,t)}async getRecord(e){let t=await this.sqlite.byRowid("Nodes",e);if(!t)return;let n=t[4];return new xt(e,fn(ve(t[1],"Nodes.edges")),ve(t[2],"Nodes.bwt"),ve(t[3],"Nodes.sequence"),typeof n=="number"?n:void 0)}paths(){return this.pathCache??=bt(this.scanPaths(),()=>{this.pathCache=void 0}),this.pathCache}async scanPaths(){let e=[];for await(let{rowid:t,values:n}of this.sqlite.scan("Paths"))e.push(yn(t,n));return e}async getPath(e){let t=await this.sqlite.byRowid("Paths",e);return t?yn(e,t):void 0}pathsByHandle(){return this.pathMapCache??=bt(this.paths().then(e=>new Map(e.map(t=>[t.handle,t]))),()=>{this.pathMapCache=void 0}),this.pathMapCache}async findPath(e){return(await this.paths()).filter(n=>n.name.sample===e.sample&&n.name.contig===e.contig&&n.name.haplotype===e.haplotype&&n.name.fragment<=e.fragment).sort((n,s)=>s.name.fragment-n.name.fragment)[0]}async pathsNamed(e){let t=$e(Ae(e),0);return(await this.paths()).filter(n=>n.name.sample===t.sample&&n.name.contig===t.contig&&n.name.haplotype===t.haplotype).sort((n,s)=>n.name.fragment-s.name.fragment)}async hasPath(e){return(await this.pathsNamed(e)).length>0}pathLengths=new Map;pathLength(e){let t=this.pathLengths.get(e);return t||(t=this.walkPathLength(e),this.pathLengths.set(e,t),t.catch(()=>this.pathLengths.delete(e))),t}async walkPathLength(e){let t=this.hasHaplotypeIndex?await this.haplotypeLength(e):void 0;if(t===void 0){let n=await this.indexedPosition(e,Number.MAX_SAFE_INTEGER);if(!n){let r=await this.getPath(e);throw new Error(`${r?`The fragment of ${fe(r.name)} at ${r.name.fragment}`:`Path ${e}`} has not been indexed for random access`)}let s=n.pathOffset,o=n.pos;for(;;){let r=await this.getRecord(o.node);if(!r)throw new Error(`Node ${o.node} does not exist in the graph`);s+=r.sequenceLen;let i=r.gbwt().lf(o.offset);if(!i||i.node===0)return s;o=i}}return t}async getPathFragments(e){let{start:t,end:n}=e;if(Number.isNaN(t)||Number.isNaN(n))throw new Error(`The window ${t}..${n} is not a number range`);let s=await this.pathsNamed(e.path);if(s.length===0)throw new at($e(Ae(e.path),0));if(n<=t)return[];let o=s.filter(h=>h.name.fragment<=t).slice(-1),r=s.filter(h=>h.name.fragment>t&&h.name.fragment<n);return(await Promise.all([...o,...r].map(async h=>({path:h,start:h.name.fragment,end:h.name.fragment+await this.pathLength(h.handle)})))).filter(h=>t<h.end)}async subgraphForFragment(e,t){let{sample:n,contig:s,haplotype:o}=e.path.name,r=Math.max(t.start,e.start),i=t.haplotypes??"all";try{let h=await gt(this,{...t,path:{sample:n,contig:s,haplotype:o},start:r,end:Math.min(t.end,e.end)});return t.keep===void 0&&this.hasHaplotypeIndex&&(i==="all"||i==="distinct")&&await h.identifyPaths(),h}catch(h){throw h instanceof le&&h.walkedBp!==void 0?new le(h.limit,{windowBp:t.end-t.start,walkedBp:r-t.start+h.walkedBp}):h}}async getSubgraphs(e){let t=await this.getPathFragments(e);return(await Promise.allSettled(t.map(s=>this.subgraphForFragment(s,e)))).map(s=>{if(s.status==="rejected")throw s.reason;return s.value})}async getAlignments(e){return(await this.getSubgraphs(e)).flatMap(t=>t.alignments())}subgraphInInterval(e){return gt(this,e)}subgraphAtOffset(e){return ln(this,e)}subgraphAroundNodes(e){return pn(this,e)}subgraphBetween(e){return un(this,e)}fetchStats(){let e=({pager:t})=>({fetches:t.fetches,bytesFetched:t.bytesFetched});return{graph:e(this.sqlite),haplotypeIndex:this.index?e(this.index):void 0}}async graphName(){let e=new Map;for(let[n,s]of await this.tags())n.startsWith("gbz_")&&e.set(n.slice(4),s);let t={name:void 0,subgraph:new Map,translation:new Map};try{t=sn(e)}catch{}return t}async hasChainLinks(){let e=await this.tag("chain_links");return e!==void 0&&Number(e)>0}get hasHaplotypeIndex(){return this.index!==void 0}get companion(){if(!this.index)throw new Error("no haplotype index was opened with this database");return this.index}async haplotypeSampleInterval(){let e=this.indexTags.get("haplotype_index_interval");return e===void 0?void 0:Number(e)}async haplotypeSampleGap(){let e=await this.haplotypeSampleInterval(),t=this.indexTags.get("haplotype_index_reference_interval");return e===void 0?void 0:Math.max(e,t===void 0?0:Number(t))}async haplotypeAnchorSpacing(){let e=this.index?.has("HaplotypeAnchors")?this.indexTags.get("haplotype_index_anchor_spacing"):void 0;return e===void 0?void 0:Number(e)}async haplotypeStrayOptions(){let e=n=>this.indexTags.get(`haplotype_index_stray_${n}`);if(!this.index?.has("HaplotypeBins")||e("format")!=="2")return;let t=e("snarls")==="modeled"&&e("chain_links")===(await this.tag("chain_links")??"0");return{context:Number(e("context")),bin:Number(e("bin")),bound:Number(e("bound")),snarlNodes:t?Number(e("snarl_nodes")):void 0}}async blobRows(e,t,n){let s=[],o=[];for await(let r of this.companion.indexScanFrom(e,t,n))o.push(V(r[r.length-1],`${e} rowid`));o.length>1&&await this.companion.prefetchRows(e,[[Math.min(...o),Math.max(...o)+1]],!0);for(let r of o){let i=await this.companion.byRowid(e,r);i&&s.push(i)}return s}async haplotypeBinData(e,t,n){let s=[],o=[];for(let r of await this.blobRows("HaplotypeBins",[e,t],[e,n])){let i=V(r[1],"HaplotypeBins.bin");os(ve(r[3],"HaplotypeBins.nodes"),s),as(i,ve(r[4],"HaplotypeBins.strays"),o)}return{listed:rs(s),strays:o}}async haplotypeAnchorsBetween(e,t,n){let s=[],o=[],r=()=>{let i=s[s.length-1];i&&is(i.node,o,i.visits),o=[]};for(let i of await this.blobRows("HaplotypeAnchors",[e,t],[e,n])){let h=V(i[1],"HaplotypeAnchors.anchor_offset");s[s.length-1]?.anchorOffset!==h&&(r(),s.push({anchorOffset:h,node:V(i[3],"HaplotypeAnchors.node_handle"),pathOffset:V(i[4],"HaplotypeAnchors.path_offset"),visits:[]})),o.push(ve(i[5],"HaplotypeAnchors.visits"))}return r(),s}async haplotypeAnchor(e,t){let[n]=await this.haplotypeAnchorsBetween(e,t,t);return n&&{node:n.node,pathOffset:n.pathOffset}}haplotypeSamplesAtNode(e){return this.haplotypeSamplesInRange(e,e)}sampleFromRow(e){return{node:V(e[0],"HaplotypeSamples.node_handle"),offset:V(e[1],"HaplotypeSamples.node_offset"),pathHandle:V(e[2],"HaplotypeSamples.path_handle"),orientation:V(e[3],"HaplotypeSamples.orientation")===0?"forward":"reverse",pathOffset:V(e[4],"HaplotypeSamples.path_offset")}}async haplotypeSamplesInRange(e,t){let n=[];for await(let s of this.companion.indexScanFrom("HaplotypeSamples",[e,0],[t,Number.MAX_SAFE_INTEGER]))n.push(this.sampleFromRow(s));return n}async haplotypeSampleAt(e,t){let n=await this.companion.indexSeekLE("HaplotypeSamples",[e,t]);return n?.[0]===e&&n[1]===t?this.sampleFromRow(n):void 0}overviewRows(){return this.overviewRowsCache??=bt((async()=>{let e=[];for await(let{rowid:t,values:n}of this.companion.scan("HaplotypeOverviewRows"))e[t]={sample:ze(n[1],"HaplotypeOverviewRows.sample"),haplotype:V(n[2],"HaplotypeOverviewRows.haplotype")};return e})(),()=>{this.overviewRowsCache=void 0}),this.overviewRowsCache}async overviewChunks(e,t,n,s,o){let r=new Map;for(let i of await this.blobRows(e,[t,n,s],[t,n,o])){let h=V(i[2],`${e}.chunk`),c=r.get(h)??[];c.push(ve(i[4],`${e} blob`)),r.set(h,c)}return new Map([...r].map(([i,h])=>[i,ss(h)]))}async haplotypeOverview(e){let{signal:t}=e;t?.throwIfAborted();let n=l=>this.indexTags.get(`haplotype_index_overview_${l}`);if(!this.index?.has("HaplotypeOverviewClasses")||n("format")!=="1")return;let s=Number(n("bin")),o=Number(n("chunk")),r=Number(n("levels")),i=Math.max(0,Math.min(Math.floor(e.level??0)||0,r-1));if(e.level===void 0&&e.bpPerPixel!==void 0)for(;i+1<r&&s*4**(i+1)<=e.bpPerPixel;)i+=1;let h=s*4**i,[c,d]=await Promise.all([this.getPathFragments(e),this.overviewRows()]);t?.throwIfAborted();let f=Math.ceil(d.length/2),p=[],y=[];for(let l of c){let b=l.end-l.start,x=Math.max(e.start,l.start)-l.start,P=Math.min(e.end,l.end)-l.start,E=Math.floor(x/h),R=Math.floor((P-1)/h),m=Math.floor(E/o),I=Math.floor(R/o),[$,F]=await Promise.all([this.overviewChunks("HaplotypeOverviewBins",l.path.handle,i,m,I),this.overviewChunks("HaplotypeOverviewClasses",l.path.handle,i,m,I)]);t?.throwIfAborted();for(let T=m;T<=I;T++){let D=new Re($.get(T)??new Uint8Array),C=F.get(T)??new Uint8Array;for(let H=T*o;!D.done;H++){let k=Array.from({length:7},()=>D.next());if(H<E||H>R)continue;p.push({start:l.start+H*h,end:l.start+Math.min((H+1)*h,b),classes:[k[0],k[1],k[2],k[3]],excursions:k[4],variants:k[5],longestExcursion:k[6]});let j=(H-T*o)*f;y.push(C.subarray(j,j+f))}}}if(p.length===0)return;let g=new Uint8Array(p.length*d.length);return y.forEach((l,b)=>{for(let x=0;x<d.length;x++)g[b*d.length+x]=(l[x>>1]??0)>>4*(x%2)&15}),{level:i,bin:h,haplotypes:d,bins:p,cells:g}}async haplotypeLength(e){let t=await this.companion.byRowid("HaplotypeLengths",e);return t?V(t[1],"HaplotypeLengths.length"):void 0}async indexedRow(e){let t=await this.sqlite.byRowid("ReferenceIndex",e);if(!t)throw new Error("ReferenceIndex row referenced by its index is missing");return{pathOffset:V(t[1],"ReferenceIndex.path_offset"),pos:{node:V(t[2],"ReferenceIndex.node_handle"),offset:V(t[3],"ReferenceIndex.node_offset")}}}async indexedRowid(e,t){let n=await this.sqlite.indexSeekLE("ReferenceIndex",[e,t]);return n?.[0]===e?V(n[2],"ReferenceIndex rowid"):void 0}async indexedPosition(e,t){let n=await this.indexedRowid(e,t);return n===void 0?void 0:this.indexedRow(n)}async indexedPositionsBetween(e,t,n){let[s,o]=await Promise.all([this.indexedRowid(e,t),this.indexedRowid(e,n)]),r=[];if(s!==void 0&&o!==void 0){await this.sqlite.prefetchRows("ReferenceIndex",[[s,o+1]]);for(let i=s;i<=o;i++)r.push(await this.indexedRow(i))}return r}};var hs="unknown";function cs(a){let e=a.split(" ");return{fields:e,name:e.slice(1,4).join(" "),start:+e[4],end:+e[5]}}var Sn=a=>a.fields[6].match(/[<>][^<>]+/g)??[];function ds(a){let e=new Map;for(let t of a)if(t.startsWith("S ")){let[,n,s,...o]=t.split(" "),r=o.find(i=>i.startsWith("LN:i:"));e.set(n,s!=="*"?s.length:r?+r.slice(5):0)}return e}function fs(a,e,t){if(e.end<=a.end)return a;let n=Sn(e),s=e.start;for(let[o,r]of n.entries()){if(s===a.end){let h=[...a.fields];return h[5]=String(e.end),h[6]=a.fields[6]+n.slice(o).join(""),{...a,fields:h,end:e.end}}let i=t.get(r.slice(1));if(s>a.end||i===void 0)return;s+=i}}function ls(a,e,t){let n=[];for(let s of a.sort((o,r)=>o.start-r.start)){let o=n.at(-1),[,r,i,h]=s.fields,d=o!==void 0&&(s.start<o.end||s.start===o.end&&!t(r,+i,h,s.start))?fs(o,s,e):void 0;d?n[n.length-1]=d:n.push(s)}return n}var xn=a=>a==="+"?"-":"+";function*ps(a){let e=Sn(a).map(t=>({id:t.slice(1),sign:t.startsWith(">")?"+":"-"}));for(let t=1;t<e.length;t++){let n=e[t-1],s=e[t];yield{forward:`L ${n.id} ${n.sign} ${s.id} ${s.sign} 0M`,reverse:`L ${s.id} ${xn(s.sign)} ${n.id} ${xn(n.sign)} 0M`}}}function In(a,e){if(a.length<=1)return a[0]??"";let t=a.map(f=>f.split(`
|
|
6
|
+
`).filter(p=>p!=="")),n=(f,p)=>f.filter(y=>y.startsWith(`${p} `)),s=ds(t.flat()),o=0,r=t.map(f=>{let p=n(f,"W").map(cs),y=o;for(let g of p.filter(l=>l.fields[1]===hs)){let l=+g.fields[2]+y;g.fields[2]=String(l),g.name=g.fields.slice(1,4).join(" "),o=Math.max(o,l)}return p}),h=[...Ot([...r.flatMap(f=>f.slice(0,1)),...r.flatMap(f=>f.slice(1))],f=>f.name).values()].flatMap(f=>ls(f,s,e)),c=new Set(t.flatMap(f=>n(f,"L")));for(let f of h)for(let p of ps(f))!c.has(p.forward)&&!c.has(p.reverse)&&c.add(p.forward);return`${[...new Set([...n(t[0],"H"),...t.flatMap(f=>n(f,"S")),...c,...h.map(f=>f.fields.join(" "))])].join(`
|
|
7
|
+
`)}
|
|
8
|
+
`}var En=class extends Error{constructor(a,e){super(e.length===0?`the graph names no reference sample (gbwt_reference_samples) and the anchor "${a}" maps to none; set referenceSample`:`the anchor "${a}" is none of the graph's reference samples (${e.join(", ")}); set referenceSample or map it through assemblyNameToPanSN`),this.name="NoReferenceSampleError"}},kn=class extends Error{constructor(a,e,t){super(`this ${e.toLocaleString()} bp window reads more than nodeLimit (${a.toLocaleString()}) graph nodes; zoom in to about ${t.toLocaleString()} bp or raise nodeLimit`),this.fitsBp=t,this.name="NodeLimitError",this.regionTooLarge=!0}};function vn(a){return`${a.sample}#${a.haplotype}`}function us(a,e){let t=vn(a);return e===void 0||e.some(n=>Bt(t,n))}async function ws(a){return(await a.tag("gbwt_reference_samples")??"").split(/\s+/).filter(e=>e!=="")}function Pn(a,e){let t=a.toLowerCase(),n=Tt(a)?.toLowerCase();return e.find(s=>s===a)??e.find(s=>s.toLowerCase()===t)??e.find(s=>s.toLowerCase()===n)}function gs({configured:a,anchorPrefix:e,referenceSamples:t}){if(a!=="")return a;let n=Pn(Ct(e),t)??(t.length===1?t[0]:void 0);if(n===void 0)throw new En(e,t);return n}async function ms(a,e,t){let n=(await a.paths()).find(s=>s.isIndexed&&s.name.sample===e&&s.name.contig===t);return n?{sample:n.name.sample,contig:t,haplotype:n.name.haplotype}:void 0}function An(a,e,t){if(a instanceof Error&&(a.name==="SubgraphLimitError"||/^Subgraph size limit of \d+ nodes exceeded/.test(a.message))){let s=a.walkedBp,o=typeof s=="number"&&s>0?Math.floor(s*.8):Math.floor(t/2);return new kn(e,t,Math.max(o,1))}else return}var ys={context:1e3,snarls:"contained",limit:1e5};async function bs(a,e,t,n,s){return a.getSubgraphs({...s,path:e,start:t,end:n,haplotypes:"all"}).catch(o=>{throw An(o,s.limit,n-t)??o})}async function xs(a,e){let t=await a.paths();return In(await Promise.all(e.map(n=>n.toGFA())),(n,s,o,r)=>t.some(({name:i})=>i.sample===n&&i.haplotype===s&&i.contig===o&&i.fragment===r))}async function Ss(a,e,t,n,s){if(!e)return"";let o=await bs(a,e,t,n,s);if(o.length===1)return $n(o[0].toCompactSubgraph());let r=await xs(a,o);return r&&Ft(r)||r}function Is(a,e){let t=1/0,n=-1/0;for(let i of a)t=Math.min(t,i),n=Math.max(n,i);let s=n-t+1,o=a.length>0&&s<=16*a.length?new Int32Array(s).fill(-1):void 0,r=new Map;return a.forEach((i,h)=>{o?o[i-t]=h:r.set(i,h)}),i=>{let h=N(i),c=o!==void 0&&h>=t&&h<=n,d=c?o[h-t]:r.get(h)??-1;return d>=0?d:(c?o[h-t]=e.length:r.set(h,e.length),e.push(String(h)),e.length-1)}}var Es=/^(.*)\[(\d+)-(\d+)\]$/;function $n(a){let e=Array.from(a.nodeIds,String),t=Is(a.nodeIds,e),n=a.nodeIds.length,s=a.edges.length/2,o=new Int32Array(s),r=new Int32Array(s),i=new Uint8Array(s);for(let l=0;l<s;l++){let b=a.edges[2*l],x=a.edges[2*l+1];o[l]=t(b),r[l]=t(x),i[l]=(Q(b)?1:0)|(Q(x)?2:0)}let h=a.paths.filter(l=>l.steps.length>0),c=new Int32Array(h.length+1);h.forEach((l,b)=>{c[b+1]=c[b]+l.steps.length});let d=new Int32Array(c[h.length]),f=new Uint8Array(d.length),p=new Float64Array(h.length),y=new Float64Array(h.length),g=h.map((l,b)=>{let x=Es.exec(l.name);p[b]=x?+x[2]:0,y[b]=x?+x[3]:-1;let P=c[b];for(let E of l.steps)d[P]=t(E),f[P++]=Q(E)?1:0;return x?x[1]:l.name});return{nodes:{names:e,lengths:Int32Array.from(a.nodeSequences,l=>l.length),refs:new Int32Array(n).fill(-1),starts:new Float64Array(n),ranks:new Int32Array(n),refNames:[]},links:{from:o,to:r,strands:i},walks:{names:g,starts:p,ends:y,offsets:c,steps:d,reversed:f},departures:_t()}}export{le as a,St as b,kn as c,vn as d,us as e,ws as f,gs as g,ms as h,An as i,ys as j,Ss as k};
|
|
9
|
+
//# sourceMappingURL=chunk-I2XBA4H7.js.map
|