jbrowse-plugin-graphgenomeviewer 7.1.0 → 7.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (233) hide show
  1. package/README.md +17 -8
  2. package/dist/chunks/AddTrackWorkflow-RPH4ZFSX.js +2 -0
  3. package/dist/chunks/{AddTrackWorkflow-Q6RY23LF.js.map → AddTrackWorkflow-RPH4ZFSX.js.map} +2 -2
  4. package/dist/chunks/{ChooseSamplesDialog-BNVYBGJQ.js → ChooseSamplesDialog-JRN4YLBY.js} +2 -2
  5. package/dist/chunks/{ChooseWalksDialog-EN3C6AQA.js → ChooseWalksDialog-UXLFZTZJ.js} +2 -2
  6. package/dist/chunks/GbzBaseSyntenyAdapter-LRECKL74.js +2 -0
  7. package/dist/chunks/GbzBaseSyntenyAdapter-LRECKL74.js.map +7 -0
  8. package/dist/chunks/{GraphGenomeView-Z2WZKEEO.js → GraphGenomeView-NJ5XCREB.js} +2 -2
  9. package/dist/chunks/GraphTrackSettingsDialog-47PQ6LM7.js +6 -0
  10. package/dist/chunks/GraphTrackSettingsDialog-47PQ6LM7.js.map +7 -0
  11. package/dist/chunks/{HighlightColorDialog-EYBKFSJU.js → HighlightColorDialog-UK5VDDV6.js} +2 -2
  12. package/dist/chunks/{LinearGraphDisplay-WIBVWRQE.js → LinearGraphDisplay-TXTKAACH.js} +2 -2
  13. package/dist/chunks/MinigraphBubbleAdapter-HW7XQMAI.js +2 -0
  14. package/dist/chunks/MinigraphBubbleAdapter-HW7XQMAI.js.map +7 -0
  15. package/dist/chunks/RgfaTabixAdapter-PSKYWD2X.js +3 -0
  16. package/dist/chunks/RgfaTabixAdapter-PSKYWD2X.js.map +7 -0
  17. package/dist/chunks/{TrackWarningsDialog-QT4YEXGD.js → TrackWarningsDialog-TRYBOIHX.js} +2 -2
  18. package/dist/chunks/WalkTabixSyntenyAdapter-U53JLYVU.js +2 -0
  19. package/dist/chunks/WalkTabixSyntenyAdapter-U53JLYVU.js.map +7 -0
  20. package/dist/chunks/chunk-2MCOY3YG.js +3 -0
  21. package/dist/chunks/chunk-2MCOY3YG.js.map +7 -0
  22. package/dist/chunks/{chunk-EWFJBQDV.js → chunk-5O6YRJHL.js} +2 -2
  23. package/dist/chunks/{chunk-EWFJBQDV.js.map → chunk-5O6YRJHL.js.map} +1 -1
  24. package/dist/chunks/chunk-BUY2PV7D.js +2 -0
  25. package/dist/chunks/chunk-BUY2PV7D.js.map +7 -0
  26. package/dist/chunks/chunk-DVCZ3BOC.js +2 -0
  27. package/dist/chunks/chunk-DVCZ3BOC.js.map +7 -0
  28. package/dist/chunks/{chunk-SAMJE6GH.js → chunk-EGDLEQ47.js} +3 -3
  29. package/dist/chunks/{chunk-SAMJE6GH.js.map → chunk-EGDLEQ47.js.map} +4 -4
  30. package/dist/chunks/chunk-FHZXW7IG.js +2 -0
  31. package/dist/chunks/chunk-FHZXW7IG.js.map +7 -0
  32. package/dist/chunks/{chunk-DZ4OUKQV.js → chunk-FITPB5X6.js} +2 -2
  33. package/dist/chunks/{chunk-DZ4OUKQV.js.map → chunk-FITPB5X6.js.map} +1 -1
  34. package/dist/chunks/chunk-FVK2THE4.js +2 -0
  35. package/dist/chunks/chunk-FVK2THE4.js.map +7 -0
  36. package/dist/chunks/{chunk-AHFQHYJI.js → chunk-IBWORBGY.js} +2 -2
  37. package/dist/chunks/chunk-MND7GAOG.js +2 -0
  38. package/dist/chunks/chunk-MND7GAOG.js.map +7 -0
  39. package/dist/chunks/chunk-MURN3JPK.js +2 -0
  40. package/dist/chunks/chunk-MURN3JPK.js.map +7 -0
  41. package/dist/chunks/{chunk-3Q4RBDCL.js → chunk-N6PQZSAX.js} +1 -1
  42. package/dist/chunks/{chunk-3Q4RBDCL.js.map → chunk-N6PQZSAX.js.map} +1 -1
  43. package/dist/chunks/chunk-NWJYLP6Z.js +4 -0
  44. package/dist/chunks/chunk-NWJYLP6Z.js.map +7 -0
  45. package/dist/chunks/{chunk-YJHYBDYF.js → chunk-S75W27NT.js} +2 -2
  46. package/dist/chunks/{chunk-YJHYBDYF.js.map → chunk-S75W27NT.js.map} +1 -1
  47. package/dist/chunks/{chunk-IXQK7JAW.js → chunk-T4HOC6O3.js} +1 -1
  48. package/dist/chunks/{chunk-IXQK7JAW.js.map → chunk-T4HOC6O3.js.map} +1 -1
  49. package/dist/chunks/{chunk-AU73K7LX.js → chunk-TUKJRVBS.js} +1 -1
  50. package/dist/chunks/{chunk-AU73K7LX.js.map → chunk-TUKJRVBS.js.map} +1 -1
  51. package/dist/chunks/chunk-UGCNPRKC.js +2 -0
  52. package/dist/chunks/{chunk-E3WYW7Z6.js.map → chunk-UGCNPRKC.js.map} +2 -2
  53. package/dist/chunks/{chunk-YSTMDXXX.js → chunk-VJ3SO4CH.js} +1 -1
  54. package/dist/chunks/{chunk-YSTMDXXX.js.map → chunk-VJ3SO4CH.js.map} +1 -1
  55. package/dist/chunks/{chunk-XT766CZ5.js → chunk-W6EQLQ6H.js} +1 -1
  56. package/dist/chunks/{chunk-XT766CZ5.js.map → chunk-W6EQLQ6H.js.map} +1 -1
  57. package/dist/chunks/chunk-WAMBI7OX.js +2 -0
  58. package/dist/chunks/chunk-WAMBI7OX.js.map +7 -0
  59. package/dist/chunks/chunk-WCGVUZWP.js +2 -0
  60. package/dist/chunks/chunk-WCGVUZWP.js.map +7 -0
  61. package/dist/chunks/chunk-WEGWTC52.js +2 -0
  62. package/dist/chunks/chunk-WEGWTC52.js.map +7 -0
  63. package/dist/chunks/chunk-YU7T5WOQ.js +2 -0
  64. package/dist/chunks/{chunk-6OPB7FOJ.js.map → chunk-YU7T5WOQ.js.map} +2 -2
  65. package/dist/chunks/{chunk-446RWIA3.js → chunk-ZMOMFU2B.js} +1 -1
  66. package/dist/chunks/{chunk-446RWIA3.js.map → chunk-ZMOMFU2B.js.map} +1 -1
  67. package/dist/chunks/renderSvg-KSQI5DH6.js +2 -0
  68. package/dist/chunks/renderSvg-KSQI5DH6.js.map +7 -0
  69. package/dist/jbrowse-plugin-graphgenomeviewer.esm.js +4 -4
  70. package/dist/jbrowse-plugin-graphgenomeviewer.esm.js.map +4 -4
  71. package/package.json +8 -9
  72. package/src/GbzBaseSyntenyAdapter/GbzBaseSyntenyAdapter.test.ts +12 -10
  73. package/src/GbzBaseSyntenyAdapter/GbzBaseSyntenyAdapter.ts +31 -39
  74. package/src/GbzBaseSyntenyAdapter/configSchema.ts +5 -29
  75. package/src/GetGraphHaplotypes.ts +6 -15
  76. package/src/GetGraphReads.ts +7 -14
  77. package/src/GetSubgraph.ts +11 -20
  78. package/src/GraphAddTrackWorkflow/AddTrackWorkflow.test.tsx +73 -0
  79. package/src/GraphAddTrackWorkflow/AddTrackWorkflow.tsx +1 -0
  80. package/src/GraphAddTrackWorkflow/buildTrackConfig.test.ts +3 -2
  81. package/src/GraphAddTrackWorkflow/buildTrackConfig.ts +2 -11
  82. package/src/GraphAddTrackWorkflow/graphManifest.ts +15 -3
  83. package/src/GraphGenomeView/components/BubbleHalos.tsx +5 -24
  84. package/src/GraphGenomeView/components/ElTree.tsx +6 -1
  85. package/src/GraphGenomeView/components/FacetPanels.test.tsx +65 -0
  86. package/src/GraphGenomeView/components/FacetPanels.tsx +17 -12
  87. package/src/GraphGenomeView/components/GenePins.tsx +5 -22
  88. package/src/GraphGenomeView/components/GraphCanvas.tsx +40 -234
  89. package/src/GraphGenomeView/components/GraphSettingsDialog.tsx +102 -108
  90. package/src/GraphGenomeView/components/GraphToolbar.tsx +5 -6
  91. package/src/GraphGenomeView/components/HoverLayer.tsx +3 -7
  92. package/src/GraphGenomeView/components/HoverTooltip.test.tsx +39 -0
  93. package/src/GraphGenomeView/components/HoverTooltip.tsx +122 -0
  94. package/src/GraphGenomeView/components/LabelChip.tsx +3 -5
  95. package/src/GraphGenomeView/components/LabelLayer.tsx +4 -17
  96. package/src/GraphGenomeView/components/LabelledSelect.tsx +1 -1
  97. package/src/GraphGenomeView/components/Legend.tsx +14 -23
  98. package/src/GraphGenomeView/components/PaneContextMenu.test.tsx +48 -0
  99. package/src/GraphGenomeView/components/PaneContextMenu.tsx +144 -0
  100. package/src/GraphGenomeView/components/PaneLayer.tsx +91 -0
  101. package/src/GraphGenomeView/components/PaneSvg.tsx +32 -50
  102. package/src/GraphGenomeView/components/ReferenceStripOverlay.test.tsx +48 -0
  103. package/src/GraphGenomeView/components/ReferenceStripOverlay.tsx +13 -42
  104. package/src/GraphGenomeView/components/SettingsMenu.test.tsx +29 -0
  105. package/src/GraphGenomeView/components/SettingsMenu.tsx +56 -65
  106. package/src/GraphGenomeView/components/TubeMapOverlay.tsx +15 -46
  107. package/src/GraphGenomeView/components/WalkRowsOverlay.tsx +58 -132
  108. package/src/GraphGenomeView/components/WalkStrip.tsx +17 -20
  109. package/src/GraphGenomeView/components/WalkStripLocator.tsx +8 -15
  110. package/src/GraphGenomeView/components/usePaneGestures.test.tsx +35 -0
  111. package/src/GraphGenomeView/components/usePaneGestures.ts +88 -91
  112. package/src/GraphGenomeView/genes/geneFeatures.ts +27 -45
  113. package/src/GraphGenomeView/graphLayers.ts +4 -4
  114. package/src/GraphGenomeView/host.ts +1 -1
  115. package/src/GraphGenomeView/legendSections.test.ts +23 -1
  116. package/src/GraphGenomeView/legendSections.ts +68 -74
  117. package/src/GraphGenomeView/model.test.ts +373 -39
  118. package/src/GraphGenomeView/model.ts +67 -11
  119. package/src/GraphGenomeView/pane/fitViews.ts +57 -514
  120. package/src/GraphGenomeView/pane/graphViews.ts +219 -160
  121. package/src/GraphGenomeView/pane/hostViews.ts +2 -10
  122. package/src/GraphGenomeView/pane/keepInView.ts +5 -4
  123. package/src/GraphGenomeView/pane/launchActions.ts +117 -139
  124. package/src/GraphGenomeView/pane/launchViews.ts +8 -27
  125. package/src/GraphGenomeView/pane/loadActions.ts +208 -187
  126. package/src/GraphGenomeView/pane/morph.ts +3 -9
  127. package/src/GraphGenomeView/pane/paneBase.ts +22 -11
  128. package/src/GraphGenomeView/pane/renderingActions.ts +65 -11
  129. package/src/GraphGenomeView/pane/settingActions.ts +17 -42
  130. package/src/GraphGenomeView/pane/tubeMapViews.ts +445 -0
  131. package/src/GraphGenomeView/pane/walkRowViews.ts +29 -37
  132. package/src/GraphGenomeView/renderPipeline.test.ts +1 -1
  133. package/src/GraphGenomeView/repeats/repeatFeatures.test.ts +23 -0
  134. package/src/GraphGenomeView/repeats/repeatFeatures.ts +16 -23
  135. package/src/GraphGenomeView/repeats/walkCalls.test.ts +18 -0
  136. package/src/GraphGenomeView/repeats/walkCalls.ts +46 -38
  137. package/src/GraphGenomeView/subgraphLoad.test.ts +67 -3
  138. package/src/GraphGenomeView/trackFeatures.ts +24 -0
  139. package/src/GraphGenomeView/tubeMapPanels.ts +28 -36
  140. package/src/GraphGenomeView/viewModel.ts +8 -56
  141. package/src/GraphGenomeView/walkRowGroups.ts +104 -30
  142. package/src/GraphGenomeView/walkRowSpans.test.ts +6 -0
  143. package/src/GraphGenomeView/walkRowSpans.ts +22 -31
  144. package/src/GraphGenomeView/walkRowsCut.ts +8 -17
  145. package/src/LinearGraphDisplay/LinearGraphDisplay.test.ts +173 -26
  146. package/src/LinearGraphDisplay/components/SubgraphContextSelect.test.tsx +1 -1
  147. package/src/LinearGraphDisplay/components/SubgraphContextSelect.tsx +3 -3
  148. package/src/LinearGraphDisplay/components/SubgraphHaplotypesField.test.tsx +3 -3
  149. package/src/LinearGraphDisplay/components/SubgraphHaplotypesField.tsx +7 -10
  150. package/src/LinearGraphDisplay/configSchema.ts +0 -3
  151. package/src/LinearGraphDisplay/denseWindow.ts +8 -11
  152. package/src/LinearGraphDisplay/model.ts +89 -82
  153. package/src/MinigraphBubbleAdapter/MinigraphBubbleAdapter.test.ts +21 -0
  154. package/src/MinigraphBubbleAdapter/MinigraphBubbleAdapter.ts +6 -14
  155. package/src/MinigraphBubbleAdapter/configSchema.ts +3 -9
  156. package/src/MinigraphBubbleAdapter/index.ts +1 -2
  157. package/src/RgfaTabixAdapter/RgfaTabixAdapter.test.ts +45 -1
  158. package/src/RgfaTabixAdapter/RgfaTabixAdapter.ts +111 -276
  159. package/src/RgfaTabixAdapter/configSchema.ts +15 -49
  160. package/src/RgfaTabixAdapter/index.ts +1 -2
  161. package/src/RgfaTabixAdapter/rgfaBed.ts +25 -15
  162. package/src/RgfaTabixAdapter/rgfaCut.ts +139 -0
  163. package/src/RgfaTabixAdapter/test_data/walks2_twopart.GRCh38.walks.bed.gz +0 -0
  164. package/src/RgfaTabixAdapter/test_data/walks2_twopart.GRCh38.walks.bed.gz.tbi +0 -0
  165. package/src/RgfaTabixAdapter/walkFiles.test.ts +33 -0
  166. package/src/RgfaTabixAdapter/walkReader.ts +103 -27
  167. package/src/RgfaTabixAdapter/walkRowRuns.test.ts +53 -0
  168. package/src/RgfaTabixAdapter/walkRowRuns.ts +42 -24
  169. package/src/WalkTabixSyntenyAdapter/WalkTabixSyntenyAdapter.test.ts +37 -6
  170. package/src/WalkTabixSyntenyAdapter/WalkTabixSyntenyAdapter.ts +23 -45
  171. package/src/WalkTabixSyntenyAdapter/configSchema.ts +11 -24
  172. package/src/WalkTabixSyntenyAdapter/index.ts +1 -2
  173. package/src/WalkTabixSyntenyAdapter/walkLanes.ts +35 -43
  174. package/src/adapterImplementing.ts +27 -0
  175. package/src/graphTrackDefaults/index.ts +14 -20
  176. package/src/hoverSync/lgvHover.ts +2 -4
  177. package/src/launchFromGraph/contributors.ts +1 -5
  178. package/src/launchFromGraph/graphMenuItems.ts +3 -4
  179. package/src/launchFromGraph/launchFromGraph.test.ts +0 -1
  180. package/src/launchFromGraph/launchFromGraph.ts +8 -13
  181. package/src/panSNTabix.test.ts +1 -26
  182. package/src/panSNTabix.ts +54 -51
  183. package/src/synteny/lanePairs.ts +8 -0
  184. package/src/synteny/matchFeature.ts +52 -0
  185. package/src/tabixRange.ts +13 -10
  186. package/src/version.ts +1 -1
  187. package/dist/chunks/AddTrackWorkflow-Q6RY23LF.js +0 -2
  188. package/dist/chunks/GbzBaseSyntenyAdapter-TIXR4Y3J.js +0 -2
  189. package/dist/chunks/GbzBaseSyntenyAdapter-TIXR4Y3J.js.map +0 -7
  190. package/dist/chunks/GraphTrackSettingsDialog-TAM6PMXD.js +0 -6
  191. package/dist/chunks/GraphTrackSettingsDialog-TAM6PMXD.js.map +0 -7
  192. package/dist/chunks/MinigraphBubbleAdapter-AGI2UYQR.js +0 -2
  193. package/dist/chunks/MinigraphBubbleAdapter-AGI2UYQR.js.map +0 -7
  194. package/dist/chunks/RgfaTabixAdapter-2OL5X3HF.js +0 -3
  195. package/dist/chunks/RgfaTabixAdapter-2OL5X3HF.js.map +0 -7
  196. package/dist/chunks/WalkTabixSyntenyAdapter-UKFHCFOF.js +0 -2
  197. package/dist/chunks/WalkTabixSyntenyAdapter-UKFHCFOF.js.map +0 -7
  198. package/dist/chunks/chunk-5SFGHDQA.js +0 -2
  199. package/dist/chunks/chunk-5SFGHDQA.js.map +0 -7
  200. package/dist/chunks/chunk-6OPB7FOJ.js +0 -2
  201. package/dist/chunks/chunk-AMFIBQVR.js +0 -2
  202. package/dist/chunks/chunk-AMFIBQVR.js.map +0 -7
  203. package/dist/chunks/chunk-BJMRBVG3.js +0 -2
  204. package/dist/chunks/chunk-BJMRBVG3.js.map +0 -7
  205. package/dist/chunks/chunk-E3WYW7Z6.js +0 -2
  206. package/dist/chunks/chunk-EHCF6AXH.js +0 -2
  207. package/dist/chunks/chunk-EHCF6AXH.js.map +0 -7
  208. package/dist/chunks/chunk-GOFS7BXK.js +0 -3
  209. package/dist/chunks/chunk-GOFS7BXK.js.map +0 -7
  210. package/dist/chunks/chunk-IJQTSJGT.js +0 -4
  211. package/dist/chunks/chunk-IJQTSJGT.js.map +0 -7
  212. package/dist/chunks/chunk-J6NZIAZF.js +0 -2
  213. package/dist/chunks/chunk-J6NZIAZF.js.map +0 -7
  214. package/dist/chunks/chunk-LUTMKRXY.js +0 -2
  215. package/dist/chunks/chunk-LUTMKRXY.js.map +0 -7
  216. package/dist/chunks/chunk-MHPJB22Z.js +0 -2
  217. package/dist/chunks/chunk-MHPJB22Z.js.map +0 -7
  218. package/dist/chunks/chunk-TXI43PEN.js +0 -2
  219. package/dist/chunks/chunk-TXI43PEN.js.map +0 -7
  220. package/dist/chunks/chunk-WRH2EJKX.js +0 -2
  221. package/dist/chunks/chunk-WRH2EJKX.js.map +0 -7
  222. package/dist/chunks/chunk-WX26KTZM.js +0 -2
  223. package/dist/chunks/chunk-WX26KTZM.js.map +0 -7
  224. package/dist/chunks/renderSvg-ST2GBBOC.js +0 -2
  225. package/dist/chunks/renderSvg-ST2GBBOC.js.map +0 -7
  226. package/src/GraphGenomeView/components/WalkRowContextMenu.tsx +0 -105
  227. /package/dist/chunks/{ChooseSamplesDialog-BNVYBGJQ.js.map → ChooseSamplesDialog-JRN4YLBY.js.map} +0 -0
  228. /package/dist/chunks/{ChooseWalksDialog-EN3C6AQA.js.map → ChooseWalksDialog-UXLFZTZJ.js.map} +0 -0
  229. /package/dist/chunks/{GraphGenomeView-Z2WZKEEO.js.map → GraphGenomeView-NJ5XCREB.js.map} +0 -0
  230. /package/dist/chunks/{HighlightColorDialog-EYBKFSJU.js.map → HighlightColorDialog-UK5VDDV6.js.map} +0 -0
  231. /package/dist/chunks/{LinearGraphDisplay-WIBVWRQE.js.map → LinearGraphDisplay-TXTKAACH.js.map} +0 -0
  232. /package/dist/chunks/{TrackWarningsDialog-QT4YEXGD.js.map → TrackWarningsDialog-TRYBOIHX.js.map} +0 -0
  233. /package/dist/chunks/{chunk-AHFQHYJI.js.map → chunk-IBWORBGY.js.map} +0 -0
@@ -1,7 +0,0 @@
1
- {
2
- "version": 3,
3
- "sources": ["../../src/GraphGenomeView/components/BubbleHalos.tsx", "../../src/GraphGenomeView/legendSections.ts", "../../src/GraphGenomeView/components/ElTree.tsx", "../../src/GraphGenomeView/components/GenePins.tsx", "../../src/GraphGenomeView/components/LabelChip.tsx", "../../src/GraphGenomeView/components/LabelLayer.tsx", "../../src/GraphGenomeView/components/ReferenceStripOverlay.tsx", "../../src/GraphGenomeView/components/TubeMapOverlay.tsx", "host:@jbrowse/render-core/marks", "../../src/GraphGenomeView/walkRowSpans.ts", "../../src/GraphGenomeView/components/WalkRowsOverlay.tsx"],
4
- "sourcesContent": ["import { bubbleKey, sameBubble } from '@jbrowse/bandage-core/bubbles/bubbleLine'\nimport { BUBBLE_KIND_COLORS } from '@jbrowse/bandage-core/bubbles/classifyBubble'\nimport { HALO_FACTOR } from '@jbrowse/bandage-core/labelLayout'\nimport { observer } from 'mobx-react'\n\nimport type { GraphPaneModel } from '../model'\n\n// The bubbles over a node drawing: each a translucent halo along its nodes,\n// drawn once in layout units and moved with the canvas by one transform. The\n// halo takes no pointer events, so the nodes under it still hover and drag;\n// its name and its routes' chips are LabelLayer's. A small variant is\n// LabelLayer's tick, and shows its halo only while hovered.\n\nconst svgStyle = {\n position: 'absolute' as const,\n left: 0,\n top: 0,\n pointerEvents: 'none' as const,\n overflow: 'hidden' as const,\n zIndex: 2,\n}\n\nconst BubbleHalos = observer(function BubbleHalos({\n model,\n}: {\n model: GraphPaneModel\n}) {\n const { bubbleHalos, hoveredBubble } = model\n if (bubbleHalos.length === 0) {\n return null\n }\n const {\n scaleX,\n scaleY,\n translateX,\n translateY,\n paneWidth: width,\n canvasHeight,\n } = model\n const halo = model.contigThickness * HALO_FACTOR\n return (\n <svg\n style={svgStyle}\n width={width}\n height={canvasHeight}\n data-testid=\"graph-bubble-halos\"\n >\n <g\n transform={`translate(${translateX} ${translateY}) scale(${scaleX} ${scaleY})`}\n >\n {bubbleHalos\n .filter(\n h =>\n !h.whole &&\n (!h.tick ||\n (hoveredBubble && sameBubble(h.bubble, hoveredBubble))),\n )\n .map(h => (\n <path\n key={bubbleKey(h.bubble)}\n d={h.path}\n fill=\"none\"\n stroke={BUBBLE_KIND_COLORS[h.kind]}\n strokeOpacity={\n hoveredBubble && sameBubble(h.bubble, hoveredBubble)\n ? 0.45\n : model.bubbleFaded(h)\n ? 0.06\n : 0.22\n }\n strokeWidth={halo}\n strokeLinecap=\"round\"\n strokeLinejoin=\"round\"\n vectorEffect=\"non-scaling-stroke\"\n />\n ))}\n </g>\n </svg>\n )\n})\n\nexport default BubbleHalos\n", "import { sameBubble } from '@jbrowse/bandage-core/bubbles/bubbleLine'\nimport {\n BUBBLE_KIND_COLORS,\n BUBBLE_KIND_NAMES,\n} from '@jbrowse/bandage-core/bubbles/classifyBubble'\nimport { EXON_COLOR } from '@jbrowse/bandage-core/genes/exonOutline'\nimport { formatBp } from '@jbrowse/bandage-core/graphLabels'\nimport {\n BAR_PX as WALK_ROW_BAR_PX,\n CALL_TICK,\n DISAGREES,\n GAP_PX,\n GENE_INK,\n UNBACKED_TICK,\n walkRowsKey,\n} from '@jbrowse/bandage-core/layout/walkRowDraw'\nimport { RAMP_GRADIENT_STOPS } from '@jbrowse/bandage-core/referenceRampCss'\nimport {\n LIFT_BACKDROP_CSS,\n REFERENCE_RAMP_ALT_CSS,\n} from '@jbrowse/bandage-core/renderer/GeometryBuilder'\nimport { deviationInk } from '@jbrowse/bandage-core/tubeMap/deviations'\nimport {\n FORWARD_READ_COLORS,\n REVERSE_READ_COLORS,\n} from '@jbrowse/bandage-core/tubeMap/reads'\nimport { encodingStops } from '@jbrowse/bandage-core/walkEncoding'\nimport { walkKey } from '@jbrowse/bandage-core/walkKey'\n\nimport { CALL_TOLERANCE } from './repeats/walkCalls'\nimport { PANEL_REFERENCE_TUBE } from './tubeMapPanels'\n\nimport type { GraphPaneModel } from './model'\nimport type { KeySwatch } from '@jbrowse/bandage-core/layout/walkRowDraw'\nimport type { LiftedWalk } from '@jbrowse/bandage-core/walkHighlight'\n\n// The legend as data, so the screen's panel and the exported figure's key\n// draw the same rows from one place\n\nexport const SWATCH_PX = 18\nexport const BAR_PX = 48\n\n// getNodeColor's grey for a node the ramp cannot place\nexport const UNPLACED_SWATCH = 'rgb(160, 160, 160)'\n// LIFT_BACKDROP_CSS reads paler alone than faded strokes do where they\n// overlap, so the key samples it darker\nconst FADED_SWATCH = 'rgba(160, 160, 160, 0.45)'\n\nconst STRIP_SAMPLES = 6\nconst TUBE_SWATCH_PX = 7\nconst FOLD_TICK_BACKING = '#b8b8c0'\nconst WALK_ROW_SWATCH_PX = WALK_ROW_BAR_PX - 4\n\nexport interface Stop {\n offset: number\n color: string\n}\n\nexport type LegendSwatch =\n | {\n kind: 'fill'\n stops: Stop[]\n width?: number\n height?: number\n square?: boolean\n }\n // the reference strip, a band per lifted walk\n | { kind: 'bands'; bands: Stop[][] }\n | { kind: 'line'; color: string }\n | { kind: 'halo'; color: string }\n | {\n kind: 'outline'\n color: string\n stroke: number\n radius: number\n height: number\n }\n | { kind: 'overhang' }\n | { kind: 'glyph'; char: string }\n | { kind: 'tick'; color: string; height: number; backing?: string }\n | { kind: 'bracket' }\n | { kind: 'blank' }\n\n// A row with no swatch is a note on the drawing\nexport interface LegendRow {\n key: string\n label: string\n swatch?: LegendSwatch\n strong?: string\n under?: string\n title?: string\n walk?: LiftedWalk\n closesBubble?: true\n}\n\nexport interface LegendSection {\n testid: string\n rows: LegendRow[]\n}\n\nexport function swatchWidth(swatch: LegendSwatch) {\n return swatch.kind === 'fill' ? (swatch.width ?? SWATCH_PX) : SWATCH_PX\n}\n\nconst flat = (color: string): Stop[] => [{ offset: 0, color }]\n\nfunction fillRow(\n key: string,\n color: string,\n label: string,\n width = SWATCH_PX,\n): LegendRow {\n return { key, label, swatch: { kind: 'fill', stops: flat(color), width } }\n}\n\n// hard-edged bands, a read taking one shade of its strand's palette\nfunction bandStops(colors: readonly string[]) {\n return colors.flatMap((color, i) => [\n { offset: i / colors.length, color },\n { offset: (i + 1) / colors.length, color },\n ])\n}\n\n// One key entry per halo colour drawn, naming the kinds it stands for\nexport function haloKeyEntries(model: GraphPaneModel) {\n const kindsByColor = new Map<string, Set<string>>()\n for (const h of model.bubbleHalos) {\n if (!h.whole) {\n const color = BUBBLE_KIND_COLORS[h.kind]\n const kinds = kindsByColor.get(color) ?? new Set<string>()\n kinds.add(BUBBLE_KIND_NAMES[h.kind])\n kindsByColor.set(color, kinds)\n }\n }\n return [...kindsByColor].map(([color, kinds]) => {\n const names = [...kinds].join(' or ')\n return {\n color,\n label:\n names === BUBBLE_KIND_NAMES.superbubble ? names : `${names} bubble`,\n }\n })\n}\n\nfunction openBubbleRows(model: GraphPaneModel): LegendRow[] {\n const open = model.openBubble\n if (!open) {\n return []\n }\n const halo = model.bubbleHalos.find(h => sameBubble(h.bubble, open))\n return [\n {\n key: 'open',\n label: `open: ${halo?.label ?? 'bubble'}`,\n swatch: halo\n ? { kind: 'halo', color: BUBBLE_KIND_COLORS[halo.kind] }\n : { kind: 'blank' },\n closesBubble: true,\n },\n ]\n}\n\n// Under lifted walks each lane states its own scale, and the rest is grey\nfunction rampRows(model: GraphPaneModel): LegendRow[] {\n const domain = model.walkLift ? undefined : model.referenceRampDomain\n if (!domain) {\n return []\n }\n // a measured domain runs between node midpoints, which can fall on a half bp\n const start = Math.round(domain.start)\n const end = Math.round(domain.end)\n const { offReference, unplaced } = model.referenceRampOffKeys\n return [\n {\n key: 'ramp',\n label: `${start.toLocaleString()}-${end.toLocaleString()} (${formatBp(end - start)})`,\n swatch: { kind: 'fill', stops: RAMP_GRADIENT_STOPS, width: BAR_PX },\n },\n ...(offReference\n ? [fillRow('off', REFERENCE_RAMP_ALT_CSS, 'off the reference', BAR_PX)]\n : []),\n ...(unplaced\n ? [fillRow('unplaced', UNPLACED_SWATCH, 'no reference position', BAR_PX)]\n : []),\n ]\n}\n\n// The strip's own colours: a band per lifted walk in its lane's, else the\n// node scheme's, a few of its blocks in bp order rather than a rainbow it\n// does not draw\nfunction stripBands(model: GraphPaneModel): Stop[][] {\n const lift = model.walkLift\n if (lift) {\n return lift.walks.map(w => encodingStops(w.encoding))\n }\n if (model.effectiveColorScheme === 'reference-position') {\n return [RAMP_GRADIENT_STOPS]\n }\n const colors = model.referenceStripBlocks\n .map(b => b.colors[0]!)\n .filter((c, i, all) => c !== all[i - 1])\n const n = Math.min(STRIP_SAMPLES, colors.length)\n return [\n n === 0\n ? flat(LIFT_BACKDROP_CSS)\n : Array.from({ length: n }, (_, i) => ({\n offset: n > 1 ? i / (n - 1) : 0,\n color:\n colors[\n n > 1 ? Math.round((i * (colors.length - 1)) / (n - 1)) : 0\n ]!,\n })),\n ]\n}\n\nfunction stripRows(model: GraphPaneModel): LegendRow[] {\n if (!model.referenceStripShown) {\n return []\n }\n const rowPerWalk = (model.walkLift?.walks.length ?? 0) > 1\n return [\n {\n key: 'strip',\n label: `top strip: reference${rowPerWalk ? ', a row per walk' : ''}`,\n swatch: { kind: 'bands', bands: stripBands(model) },\n },\n ...(model.referenceStripFaded\n ? [\n fillRow(\n 'strip-faded',\n LIFT_BACKDROP_CSS,\n model.walkLift\n ? `reference not on ${rowPerWalk ? \"that row's walk\" : model.liftedWalksLabel}`\n : 'reference outside the open bubble',\n ),\n ]\n : []),\n ...(model.referenceStripOverhangs\n ? [\n {\n key: 'overhang',\n label: 'graph runs past this edge',\n swatch: { kind: 'overhang' } as const,\n },\n ]\n : []),\n ]\n}\n\nfunction haloRows(model: GraphPaneModel): LegendRow[] {\n return haloKeyEntries(model).map(({ color, label }) => ({\n key: `halo-${color}`,\n label,\n swatch: { kind: 'halo', color },\n }))\n}\n\nfunction geneRows(model: GraphPaneModel): LegendRow[] {\n return model.genePins.some(pin => pin.exonsByNode.length > 0)\n ? [\n {\n key: 'exon',\n label: 'exon',\n swatch: {\n kind: 'outline',\n color: EXON_COLOR,\n stroke: 2,\n radius: 5,\n height: 8,\n },\n },\n ]\n : []\n}\n\nfunction foldRows(model: GraphPaneModel): LegendRow[] {\n const note = model.foldNote\n return note ? [{ key: 'fold', label: note }] : []\n}\n\nfunction pathRows(model: GraphPaneModel): LegendRow[] {\n return model.pathLegend.map(({ name, label, color }) => ({\n key: `path-${name}`,\n label,\n swatch: { kind: 'line', color },\n }))\n}\n\nfunction tubeRow(key: string, color: string, label: string): LegendRow {\n return {\n key,\n label,\n swatch: {\n kind: 'fill',\n stops: flat(color),\n height: TUBE_SWATCH_PX,\n square: true,\n },\n }\n}\n\n// What a tube map draws that nothing else on screen explains, each listed\n// only while it applies\nexport function tubeMapRows(model: GraphPaneModel): LegendRow[] {\n const {\n roles,\n haplotypeTube,\n bundled,\n values,\n logWidths,\n foldBp,\n forwardReads,\n reverseReads,\n substitution,\n insertion,\n deletion,\n } = model.tubeMapKeys\n const reads = model.readsShown\n const rows: LegendRow[] = []\n if (values) {\n rows.push(\n tubeRow('value-reference', PANEL_REFERENCE_TUBE, 'reference'),\n ...values.map(({ value, color }) =>\n tubeRow(`value-${value}`, color, value),\n ),\n )\n }\n if (roles) {\n rows.push(\n tubeRow('ref', PANEL_REFERENCE_TUBE, 'reference'),\n tubeRow(\n 'hap',\n haplotypeTube,\n bundled ? 'shared route, \u00D7n haplotypes' : 'haplotype',\n ),\n )\n }\n const readRow = (key: string, colors: readonly string[], label: string) => ({\n key,\n label,\n swatch: {\n kind: 'fill',\n stops: bandStops(colors),\n height: TUBE_SWATCH_PX,\n square: true,\n } as const,\n })\n if (forwardReads) {\n rows.push(readRow('fwd', FORWARD_READ_COLORS, 'read on the forward strand'))\n }\n if (reverseReads) {\n rows.push(readRow('rev', REVERSE_READ_COLORS, 'read on the reverse strand'))\n }\n if (reads && reads.shown < reads.total) {\n rows.push({\n key: 'sampled',\n label: `${reads.shown.toLocaleString('en-US')} of ${reads.total.toLocaleString('en-US')} reads shown`,\n swatch: { kind: 'blank' },\n })\n }\n if (substitution) {\n rows.push({\n key: 'sub',\n label: 'read mismatch',\n swatch: { kind: 'glyph', char: 'A' },\n })\n }\n if (insertion) {\n rows.push({\n key: 'ins',\n label: 'read insertion',\n swatch: { kind: 'glyph', char: '*' },\n })\n }\n if (deletion) {\n rows.push(tubeRow('del', 'grey', 'read deletion'))\n }\n if (foldBp !== undefined) {\n rows.push({\n key: 'tube-fold',\n label: `haplotype variant < ${formatBp(foldBp)}`,\n swatch: {\n kind: 'tick',\n color: deviationInk(),\n height: TUBE_SWATCH_PX,\n backing: FOLD_TICK_BACKING,\n },\n })\n }\n if (logWidths) {\n rows.push({\n key: 'log',\n label: 'width grows with log of length',\n swatch: { kind: 'bracket' },\n })\n }\n return rows\n}\n\nexport function walkRowSwatch(swatch: KeySwatch): LegendSwatch {\n return swatch.kind === 'gene'\n ? {\n kind: 'outline',\n color: GENE_INK,\n stroke: 1.5,\n radius: 0,\n height: WALK_ROW_SWATCH_PX,\n }\n : {\n kind: 'fill',\n stops:\n swatch.kind === 'bar' && swatch.ramp\n ? RAMP_GRADIENT_STOPS\n : flat(swatch.fill),\n height: swatch.kind === 'gap' ? GAP_PX : WALK_ROW_SWATCH_PX,\n }\n}\n\n// The walk rows' bar colours, genes and ticks; each tick row appears once\n// the rows hold one, so a catalogue with no genotypes keeps the plain key\nfunction walkRowsRows(model: GraphPaneModel): LegendRow[] {\n const bars = model.walkRowBars\n if (!bars) {\n return []\n }\n const calls = [bars.reference, ...bars.rows].flatMap(row => row.call ?? [])\n const tick = (key: string, color: string, label: string): LegendRow => ({\n key,\n label,\n swatch: { kind: 'tick', color, height: WALK_ROW_SWATCH_PX },\n })\n return [\n ...walkRowsKey(bars, {\n ramp: model.referenceRampDomain,\n genes: model.walkRowGeneKey,\n }).map(entry => ({\n key: `rows-${entry.label}`,\n label: entry.label,\n swatch: entry.note ? undefined : walkRowSwatch(entry.swatch),\n })),\n ...(calls.some(call => call.spanningReads !== 0)\n ? [tick('call', CALL_TICK, 'allele length called for this walk')]\n : []),\n ...(calls.some(call => call.spanningReads === 0)\n ? [tick('unbacked', UNBACKED_TICK, 'called with no read spanning it')]\n : []),\n ...(calls.some(call => call.agrees === false)\n ? [\n tick(\n 'disagrees',\n DISAGREES,\n `walk and call over ${Math.round(CALL_TOLERANCE * 100)}% apart`,\n ),\n ]\n : []),\n ]\n}\n\n// One lifted walk's key: a swatch, or a short bar of the scale its lane\n// shades by, then its name, with the scale's stretch under it\nexport function walkKeyRow(model: GraphPaneModel, walk: LiftedWalk): LegendRow {\n const key = walkKey(walk, model.walkReference)\n return {\n key: `walk-${walk.name}`,\n strong: model.walkLabel(walk.name),\n label: key.delta + key.outside + key.reversed,\n swatch: {\n kind: 'fill',\n stops: encodingStops(walk.encoding),\n width: key.shades ? BAR_PX : SWATCH_PX,\n },\n under: key.scale,\n title: key.hover,\n walk,\n }\n}\n\n// Each lifted walk's key, then what the faded rest is; the colours under a\n// shaded walk's bar are bars of its width\nfunction walkReadoutRows(model: GraphPaneModel): LegendRow[] {\n const lift = model.walkLift\n if (!lift || model.facetPanels) {\n return []\n }\n const rows = lift.walks.map(w => walkKeyRow(model, w))\n const width = rows.some(r => swatchWidth(r.swatch!) === BAR_PX)\n ? BAR_PX\n : SWATCH_PX\n return [\n ...rows,\n // the ramp's own key, which names this, is off while walks are lifted\n ...(model.liftPaintsOffReference\n ? [\n fillRow(\n 'lift-off',\n REFERENCE_RAMP_ALT_CSS,\n 'off the reference',\n width,\n ),\n ]\n : []),\n fillRow('faded', FADED_SWATCH, `not on ${model.liftedWalksLabel}`, width),\n ]\n}\n\n// The faceted pane's one key line under its panels: each panel's title keys\n// its walk, so this keys only what every panel greys\nexport function facetKeyRows(model: GraphPaneModel): LegendRow[] {\n return model.facetPanels\n ? [\n ...(model.liftPaintsOffReference\n ? [fillRow('lift-off', REFERENCE_RAMP_ALT_CSS, 'off the reference')]\n : []),\n fillRow('faded', FADED_SWATCH, \"not on the panel's walk\"),\n ]\n : []\n}\n\n// The keys in the order the panel stacks them, top first\nexport function legendSections(model: GraphPaneModel): LegendSection[] {\n return [\n { testid: 'graph-open-bubble-legend', rows: openBubbleRows(model) },\n { testid: 'graph-ramp-legend', rows: rampRows(model) },\n { testid: 'graph-reference-strip-legend', rows: stripRows(model) },\n { testid: 'graph-halo-legend', rows: haloRows(model) },\n { testid: 'graph-gene-legend', rows: geneRows(model) },\n { testid: 'graph-fold-legend', rows: foldRows(model) },\n { testid: 'graph-path-legend', rows: pathRows(model) },\n { testid: 'graph-tube-map-legend', rows: tubeMapRows(model) },\n { testid: 'graph-walk-rows-legend', rows: walkRowsRows(model) },\n { testid: 'graph-walk-readout', rows: walkReadoutRows(model) },\n ].filter(section => section.rows.length > 0)\n}\n", "import { createElement } from 'react'\nimport type { ReactNode } from 'react'\n\nimport type { El } from '@jbrowse/bandage-core/el'\n\n// SVG's attribute names as React's props: `class` is className, `data-` and\n// `aria-` keep their dashes, the rest are camel-cased (`stroke-width` is\n// strokeWidth)\nfunction propName(name: string) {\n return name === 'class'\n ? 'className'\n : /^(data|aria)-/.test(name)\n ? name\n : name.replace(/-([a-z])/g, (_, c: string) => c.toUpperCase())\n}\n\nfunction toReact(node: El | string, key: number): ReactNode {\n if (typeof node === 'string') {\n return node\n }\n const props: Record<string, unknown> = { key }\n for (const [name, value] of Object.entries(node.attrs)) {\n if (value !== undefined) {\n props[propName(name)] = value\n }\n }\n return createElement(node.tag, props, ...node.children.map(toReact))\n}\n\n// A core element tree as React elements\nexport default function ElTree({ el }: { el: El }) {\n return toReact(el, 0)\n}\n", "import { useId } from 'react'\n\nimport {\n exonOutlineTree,\n exonStretches,\n} from '@jbrowse/bandage-core/genes/exonOutline'\nimport { observer } from 'mobx-react'\n\nimport ElTree from './ElTree'\n\nimport type { GraphPaneModel } from '../model'\n\n// The session's genes drawn onto the graph: each exon outlined round its\n// stretch of node, as core's exonOutlineTree draws it for every host, moved by\n// the same transform the halos use. Their names are LabelLayer's.\n\nconst svgStyle = {\n position: 'absolute' as const,\n left: 0,\n top: 0,\n pointerEvents: 'none' as const,\n overflow: 'hidden' as const,\n zIndex: 2,\n}\n\nexport { EXON_COLOR } from '@jbrowse/bandage-core/genes/exonOutline'\n\nconst GenePins = observer(function GenePins({\n model,\n}: {\n model: GraphPaneModel\n}) {\n const id = `exon-outline-${useId().replaceAll(/[^\\w-]/g, '')}`\n const { genePins, walkLift, nodeInk } = model\n const { scaleX, scaleY, translateX, translateY, paneWidth, canvasHeight } =\n model\n // an open bubble rings only its own exons\n const focus = walkLift ? undefined : model.openBubbleFocus\n const pins = focus\n ? genePins.map(pin => ({\n ...pin,\n exonsByNode: pin.exonsByNode.filter(e => focus.nodeIds.has(e.nodeId)),\n }))\n : genePins\n const tree = exonOutlineTree(\n exonStretches(pins, nodeInk.halfWidthPx, walkLift),\n {\n id,\n width: paneWidth,\n height: canvasHeight,\n transform: `translate(${translateX} ${translateY}) scale(${scaleX} ${scaleY})`,\n },\n )\n return tree ? (\n <svg\n style={svgStyle}\n width={paneWidth}\n height={canvasHeight}\n data-testid=\"graph-gene-pins\"\n >\n <ElTree el={tree} />\n </svg>\n ) : null\n})\n\nexport default GenePins\n", "import { LABEL_PAD, LABEL_PX } from '@jbrowse/bandage-core/overlayLabels'\n\n// A chip's box, its text's baseline at y and centred on x\nexport function chipBox(x: number, y: number, w: number) {\n return {\n x: x - w / 2,\n y: y - LABEL_PX - LABEL_PAD + 2,\n width: w,\n height: LABEL_PX + LABEL_PAD * 2 - 2,\n }\n}\n\nexport function inChip(\n chip: { x: number; y: number; w: number },\n px: number,\n py: number,\n) {\n const box = chipBox(chip.x, chip.y, chip.w)\n return (\n px >= box.x &&\n px <= box.x + box.width &&\n py >= box.y &&\n py <= box.y + box.height\n )\n}\n\n// One label on an overlay: a white chip with a coloured edge and text. A note\n// follows the text in plain type. A chip takes the pointer only with a\n// handler, so its title shows only then.\nexport default function LabelChip({\n x,\n y,\n w,\n text,\n note,\n color,\n edge = color,\n italic,\n small,\n dimmed,\n title,\n testId,\n onClick,\n onHover,\n}: {\n x: number\n y: number\n w: number\n text: string\n note?: string\n color: string\n edge?: string\n italic?: boolean\n small?: boolean\n dimmed?: boolean\n title?: string\n testId?: string\n onClick?: () => void\n onHover?: (hovered: boolean) => void\n}) {\n return (\n <g\n style={{\n pointerEvents: onClick || onHover ? 'auto' : 'none',\n cursor: onClick ? 'pointer' : undefined,\n opacity: dimmed ? 0.35 : 1,\n }}\n data-testid={testId}\n onClick={onClick}\n onMouseEnter={() => {\n onHover?.(true)\n }}\n onMouseLeave={() => {\n onHover?.(false)\n }}\n >\n {title ? <title>{title}</title> : null}\n <rect\n {...chipBox(x, y, w)}\n rx={3}\n fill=\"rgba(255,255,255,0.85)\"\n stroke={edge}\n strokeWidth={small ? 0.6 : 1}\n />\n <text\n x={x}\n y={y}\n fontSize={small ? LABEL_PX - 1 : LABEL_PX}\n fontFamily=\"sans-serif\"\n fontStyle={italic ? 'italic' : undefined}\n fontWeight={italic ? 600 : undefined}\n fill={color}\n textAnchor=\"middle\"\n >\n {text}\n {note ? (\n <tspan fontStyle=\"normal\" fontWeight=\"normal\">\n {note}\n </tspan>\n ) : null}\n </text>\n </g>\n )\n}\n", "import { bubbleKey, sameBubble } from '@jbrowse/bandage-core/bubbles/bubbleLine'\nimport { BUBBLE_KIND_COLORS } from '@jbrowse/bandage-core/bubbles/classifyBubble'\nimport { geneCoverageNote } from '@jbrowse/bandage-core/labelLayout'\nimport { LABEL_PX, labelWidth } from '@jbrowse/bandage-core/overlayLabels'\nimport { isAlive } from '@jbrowse/mobx-state-tree'\nimport { observer } from 'mobx-react'\n\nimport { EXON_COLOR } from './GenePins'\nimport LabelChip, { inChip } from './LabelChip'\n\nimport type { GraphPaneModel } from '../model'\nimport type { BubbleHalo } from '@jbrowse/bandage-core/bubbles/bubbleHalos'\nimport type { LabelLayout } from '@jbrowse/bandage-core/labelLayout'\n\n// Every chip drawn over the graph, above all of its ink: bubble names and gene\n// names on their pins. `overlayLabels` has placed\n// them against each other and against the row labels already.\n\nconst svgStyle = {\n position: 'absolute' as const,\n left: 0,\n top: 0,\n pointerEvents: 'none' as const,\n overflow: 'hidden' as const,\n zIndex: 3,\n}\n\nconst GENE_INK = '#1c1c22'\nconst TICK_PX = 9\nconst TICK_WIDTH = 3\n\n// What the gene chip under a point reads out, for the hover tooltip: those\n// chips leave the pointer to the canvas, so a drag can start on one\nexport function chipReadoutAt(\n { genes }: Pick<LabelLayout, 'genes'>,\n px: number,\n py: number,\n) {\n const pin = genes.find(chip => inChip(chip, px, py))?.item\n if (!pin) {\n return undefined\n }\n const { gene } = pin\n const note = geneCoverageNote(pin)\n return {\n label: gene.name,\n readout: `${gene.refName}:${gene.start.toLocaleString()}-${gene.end.toLocaleString()}${note ? `, ${note} in the cut` : ''}`,\n }\n}\n\nconst LabelLayer = observer(function LabelLayer({\n model,\n}: {\n model: GraphPaneModel\n}) {\n const { bubbles, genes, ticks } = model.overlayLabels\n if (bubbles.length + genes.length + ticks.length === 0) {\n return null\n }\n const { scaleY, translateY, contigThickness, hoveredBubble } = model\n const hoveredTick = hoveredBubble\n ? ticks.find(t => sameBubble(t.item.bubble, hoveredBubble))\n : undefined\n const tickAt = (target: EventTarget) =>\n ticks[Number((target as Element).getAttribute('data-tick'))]\n const dimmedBubble = (h: BubbleHalo) => model.bubbleFaded(h)\n const isOpen = (h: BubbleHalo) => model.bubbleIsOpen(h.bubble)\n\n return (\n <svg\n style={svgStyle}\n width={model.paneWidth}\n height={model.canvasHeight}\n data-testid=\"graph-label-layer\"\n >\n <g\n data-testid=\"graph-bubble-ticks\"\n onClick={e => {\n const tick = tickAt(e.target)\n if (tick) {\n model.toggleBubble(tick.item.bubble)\n }\n }}\n onMouseOver={e => {\n const tick = tickAt(e.target)\n if (tick) {\n model.setHoveredBubble(tick.item.bubble)\n }\n }}\n // a leave also fires as the view closing it unmounts the tick\n onMouseOut={() => {\n if (isAlive(model)) {\n model.setHoveredBubble(null)\n }\n }}\n >\n {ticks.map(({ item: h, x, y }, i) => (\n <rect\n key={bubbleKey(h.bubble)}\n data-tick={i}\n x={x - TICK_WIDTH / 2}\n y={y - TICK_PX}\n width={TICK_WIDTH}\n height={TICK_PX}\n rx={TICK_WIDTH / 2}\n fill={BUBBLE_KIND_COLORS[h.kind]}\n opacity={dimmedBubble(h) ? 0.35 : 1}\n style={{ pointerEvents: 'all', cursor: 'pointer' }}\n />\n ))}\n </g>\n {genes.map(({ item: pin, x, y, w, text }) => {\n const { gene } = pin\n return (\n <g key={`${gene.name}-${gene.start}`}>\n <line\n x1={x}\n x2={x}\n y1={y - LABEL_PX - 2}\n y2={pin.at.y * scaleY + translateY + contigThickness / 2}\n stroke={GENE_INK}\n strokeWidth={0.8}\n strokeOpacity={0.6}\n />\n <LabelChip\n x={x}\n y={y}\n w={w}\n text={gene.name}\n note={text.slice(gene.name.length) || undefined}\n color={GENE_INK}\n edge={EXON_COLOR}\n italic\n testId=\"graph-gene-pin-label\"\n />\n </g>\n )\n })}\n {bubbles.map(({ item: h, x, y, w, text }) => (\n <LabelChip\n key={bubbleKey(h.bubble)}\n x={x}\n y={y}\n w={w}\n text={text}\n color={BUBBLE_KIND_COLORS[h.kind]}\n dimmed={dimmedBubble(h)}\n title={`${h.label}\\n${h.bubble.segmentCount} segments${h.bubble.covering ? '' : isOpen(h) ? ' \u00B7 click to close' : ' \u00B7 click to open'}`}\n testId=\"graph-bubble-halo-label\"\n // the bubble the drawing is would open into this same drawing\n onClick={\n h.bubble.covering\n ? undefined\n : () => {\n model.toggleBubble(h.bubble)\n }\n }\n // a leave also fires as the view closing it unmounts the chip\n onHover={hovered => {\n if (isAlive(model)) {\n model.setHoveredBubble(hovered ? h.bubble : null)\n }\n }}\n />\n ))}\n {hoveredTick ? (\n <LabelChip\n x={hoveredTick.x}\n y={hoveredTick.y - TICK_PX - 4}\n w={labelWidth(hoveredTick.item.label)}\n text={hoveredTick.item.label}\n color={BUBBLE_KIND_COLORS[hoveredTick.item.kind]}\n testId=\"graph-bubble-tick-label\"\n />\n ) : null}\n </svg>\n )\n})\n\nexport default LabelLayer\n", "import { useEffect, useRef } from 'react'\n\nimport { drawReferenceStrip } from '@jbrowse/bandage-core/referenceStrip'\nimport { getDpr } from '@jbrowse/bandage-core/renderer/canvas'\nimport { autorun } from 'mobx'\nimport { observer } from 'mobx-react'\n\nimport type { GraphPaneModel } from '../model'\n\nconst canvasStyle = {\n position: 'absolute' as const,\n left: 0,\n top: 0,\n pointerEvents: 'none' as const,\n zIndex: 5,\n}\n\n// Each reference segment at its bp in the linear view, onto the pane's\n// canvas or the linear view's SVG export\nexport function paintReferenceStrip(\n ctx: CanvasRenderingContext2D,\n model: GraphPaneModel,\n {\n lit,\n dpr,\n }: { lit: GraphPaneModel['referenceStripLit'] | undefined; dpr: number },\n) {\n const frame = model.hostBpFrame\n if (frame) {\n drawReferenceStrip(ctx, model.referenceStripBlocks, frame, {\n width: model.paneWidth,\n lit,\n darkMode: model.darkMode,\n dpr,\n })\n }\n}\n\n// Each reference segment at its bp in the linear view, over a drawing that\n// has no bp axis of its own. Repainted by an autorun, so a pan in the linear\n// view moves the strip in the same frame as its other tracks.\nconst ReferenceStripOverlay = observer(function ReferenceStripOverlay({\n model,\n}: {\n model: GraphPaneModel\n}) {\n const ref = useRef<HTMLCanvasElement>(null)\n const { referenceStripShown, paneWidth, canvasHeight } = model\n useEffect(\n () =>\n autorun(() => {\n const canvas = ref.current\n const ctx = canvas?.getContext('2d')\n if (canvas && ctx && model.referenceStripShown) {\n const dpr = getDpr()\n const width = model.paneWidth\n const height = model.canvasHeight\n canvas.width = Math.round(width * dpr)\n canvas.height = Math.round(height * dpr)\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0)\n ctx.clearRect(0, 0, width, height)\n paintReferenceStrip(ctx, model, {\n lit: model.referenceStripLit,\n dpr,\n })\n }\n }),\n [model],\n )\n return (\n <canvas\n ref={ref}\n data-testid={referenceStripShown ? 'graph-reference-strip' : undefined}\n style={{\n ...canvasStyle,\n width: paneWidth,\n height: canvasHeight,\n display: referenceStripShown ? 'block' : 'none',\n }}\n />\n )\n})\n\nexport default ReferenceStripOverlay\n", "import { useEffect, useRef } from 'react'\n\nimport { getDpr } from '@jbrowse/bandage-core/renderer/canvas'\nimport { drawTubeMapRuler } from '@jbrowse/bandage-core/tubeMap/axis'\nimport { drawTubeMapConnectors } from '@jbrowse/bandage-core/tubeMap/connectors'\nimport { drawDeviationMarks } from '@jbrowse/bandage-core/tubeMap/deviations'\nimport { drawTubeMap } from '@jbrowse/bandage-core/tubeMap/draw'\nimport { drawTubeMapGenes } from '@jbrowse/bandage-core/tubeMap/genes'\nimport { autorun } from 'mobx'\nimport { observer } from 'mobx-react'\n\nimport {\n PANEL_TITLE_FONT,\n drawBundleCounts,\n drawSqueezedLengths,\n} from '../tubeMapPanels'\n\n// variants folded into a box mark texture under a panel's routes\nconst PANEL_TICK_ALPHA = 0.45\n\nimport type { GraphPaneModel } from '../model'\n\nconst canvasStyle = {\n position: 'absolute' as const,\n left: 0,\n top: 0,\n pointerEvents: 'none' as const,\n zIndex: 1,\n}\n\n// The tubes, their connectors, genes and ruler, onto a canvas sized to the\n// pane or onto the linear view's SVG export\nexport function paintTubeMap(\n ctx: CanvasRenderingContext2D,\n model: GraphPaneModel,\n { highlightNode }: { highlightNode: string | null },\n) {\n const picture = model.tubeMapPicture\n const frame = model.tubeMapFrame\n if (!picture || !frame) {\n return\n }\n const width = model.paneWidth\n const panels = model.tubeMapPanelViews\n if (panels) {\n paintPanels(ctx, model, panels, highlightNode)\n return\n }\n const tubeFrame = {\n ...frame,\n width,\n highlightNode,\n darkMode: model.darkMode,\n tubeColors: model.tubeMapTubeColors,\n nodeColors: model.tubeMapNodeColors,\n }\n drawTubeMap(ctx, picture, tubeFrame)\n const drawn = model.layoutResult?.tubeMap\n if (drawn) {\n drawBundleCounts(ctx, picture, drawn.graph, tubeFrame)\n drawSqueezedLengths(ctx, drawn, tubeFrame)\n }\n drawDeviationMarks(ctx, model.tubeMapDeviations, tubeFrame)\n drawTubeMapConnectors(\n ctx,\n model.tubeMapConnectors,\n model.connectorZoneBottom,\n tubeFrame,\n )\n const { bounds } = picture\n drawTubeMapGenes(ctx, model.tubeMapGenes, tubeFrame, frame.y(bounds.minY) - 2)\n const boxes = model.tubeMapRulerBoxes\n if (boxes) {\n drawTubeMapRuler(\n ctx,\n boxes,\n tubeFrame,\n frame.y(bounds.maxY) + 4,\n model.layoutResult?.referenceAxis,\n )\n }\n}\n\n// Each panel of a split tube map under a rule and its title, which the canvas\n// draws so a figure's SVG carries them\nfunction paintPanels(\n ctx: CanvasRenderingContext2D,\n model: GraphPaneModel,\n panels: NonNullable<GraphPaneModel['tubeMapPanelViews']>,\n highlightNode: string | null,\n) {\n const width = model.paneWidth\n const ink = model.darkMode ? '255,255,255' : '0,0,0'\n for (const p of panels) {\n if (p.bottom < 0 || p.titleTop > model.canvasHeight) {\n continue\n }\n const tubeFrame = {\n ...p.frame,\n width,\n highlightNode,\n darkMode: model.darkMode,\n tubeColors: p.tubeColors,\n nodeColors: p.nodeColors,\n }\n drawTubeMap(ctx, p.picture, tubeFrame)\n drawBundleCounts(ctx, p.picture, p.panel.result.tubeMap.graph, tubeFrame)\n drawSqueezedLengths(ctx, p.panel.result.tubeMap, tubeFrame)\n ctx.globalAlpha = PANEL_TICK_ALPHA\n drawDeviationMarks(ctx, p.deviations, tubeFrame)\n ctx.globalAlpha = 1\n ctx.strokeStyle = `rgba(${ink},0.15)`\n ctx.lineWidth = 1\n ctx.beginPath()\n ctx.moveTo(0, Math.round(p.titleTop) + 0.5)\n ctx.lineTo(width, Math.round(p.titleTop) + 0.5)\n ctx.stroke()\n ctx.font = PANEL_TITLE_FONT\n ctx.textAlign = 'left'\n ctx.textBaseline = 'top'\n ctx.fillStyle = `rgba(${ink},0.85)`\n ctx.fillText(p.label, 6, p.titleTop + 4)\n }\n const last = panels.at(-1)\n const boxes = model.tubeMapPanelRulerBoxes\n if (last && boxes) {\n drawTubeMapRuler(\n ctx,\n boxes,\n { ...last.frame, width, darkMode: model.darkMode },\n last.bottom + 4,\n true,\n )\n }\n}\n\n// The tube map's ink, over the canvas, which draws nothing under a tube map\n// layout. Above the tubes go the session's genes in a view of its own, or in\n// a linear view the bands tying each reference box to its bp there; under\n// them a reference ruler, unless the linear view's is already the axis.\n// Repainted by an autorun on every change of transform, so a pan in the linear\n// view above moves the tubes in the same frame as its other tracks.\nconst TubeMapOverlay = observer(function TubeMapOverlay({\n model,\n}: {\n model: GraphPaneModel\n}) {\n const ref = useRef<HTMLCanvasElement>(null)\n const { tubeMapPicture, paneWidth, canvasHeight } = model\n useEffect(\n () =>\n autorun(() => {\n const canvas = ref.current\n const ctx = canvas?.getContext('2d')\n if (canvas && ctx && model.tubeMapPicture && model.tubeMapFrame) {\n const dpr = getDpr()\n const width = model.paneWidth\n const height = model.canvasHeight\n canvas.width = Math.round(width * dpr)\n canvas.height = Math.round(height * dpr)\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0)\n ctx.clearRect(0, 0, width, height)\n paintTubeMap(ctx, model, { highlightNode: model.selectedNode })\n }\n }),\n [model],\n )\n // Mounted whether or not there is a tube map, so the autorun above has its\n // canvas the moment a layout brings one.\n return (\n <canvas\n ref={ref}\n data-testid={tubeMapPicture ? 'graph-tube-map' : undefined}\n style={{\n ...canvasStyle,\n width: paneWidth,\n height: canvasHeight,\n display: tubeMapPicture ? 'block' : 'none',\n }}\n />\n )\n})\n\nexport default TubeMapOverlay\n", "const host = JBrowseExports[\"@jbrowse/render-core/marks\"]\nconst read = name =>\n host != null && name in Object(host)\n ? host[name]\n : Object.assign(\n function () {\n throw new Error(\n \"This JBrowse does not provide '\" + name + \"' from '\" + \"@jbrowse/render-core/marks\" + \"' to plugins: GraphGenomeView was built for a different JBrowse version, so update the plugin or JBrowse\",\n )\n },\n { jbrowseHostMissing: name },\n )\nexport const HIDDEN_ROW = /* @__PURE__ */ read(\"HIDDEN_ROW\")\nexport const LINK_ELSEWHERE = /* @__PURE__ */ read(\"LINK_ELSEWHERE\")\nexport const LINK_NO_REGION = /* @__PURE__ */ read(\"LINK_NO_REGION\")\nexport const NO_ROW_COLOR = /* @__PURE__ */ read(\"NO_ROW_COLOR\")\nexport const RAMP_NOT_A_NUMBER_COLOR = /* @__PURE__ */ read(\"RAMP_NOT_A_NUMBER_COLOR\")\nexport const RAMP_NO_VALUE_BITS = /* @__PURE__ */ read(\"RAMP_NO_VALUE_BITS\")\nexport const RAMP_NO_VALUE_COLOR = /* @__PURE__ */ read(\"RAMP_NO_VALUE_COLOR\")\nexport const RowKeys = /* @__PURE__ */ read(\"RowKeys\")\nexport const abgrToCssRgba = /* @__PURE__ */ read(\"abgrToCssRgba\")\nexport const appendGlyph = /* @__PURE__ */ read(\"appendGlyph\")\nexport const backToFront = /* @__PURE__ */ read(\"backToFront\")\nexport const barMark = /* @__PURE__ */ read(\"barMark\")\nexport const buildRowTable = /* @__PURE__ */ read(\"buildRowTable\")\nexport const defineMark = /* @__PURE__ */ read(\"defineMark\")\nexport const ellipseDistance = /* @__PURE__ */ read(\"ellipseDistance\")\nexport const ellipseNearest = /* @__PURE__ */ read(\"ellipseNearest\")\nexport const inkOfInstances = /* @__PURE__ */ read(\"inkOfInstances\")\nexport const instanceColor = /* @__PURE__ */ read(\"instanceColor\")\nexport const isThreshold = /* @__PURE__ */ read(\"isThreshold\")\nexport const keepRampValues = /* @__PURE__ */ read(\"keepRampValues\")\nexport const keySlot = /* @__PURE__ */ read(\"keySlot\")\nexport const lineCenterMark = /* @__PURE__ */ read(\"lineCenterMark\")\nexport const lineMarkOf = /* @__PURE__ */ read(\"lineMarkOf\")\nexport const lineStepMark = /* @__PURE__ */ read(\"lineStepMark\")\nexport const linkFeet = /* @__PURE__ */ read(\"linkFeet\")\nexport const linkMark = /* @__PURE__ */ read(\"linkMark\")\nexport const makeAbgrFill = /* @__PURE__ */ read(\"makeAbgrFill\")\nexport const nearestMarkHit = /* @__PURE__ */ read(\"nearestMarkHit\")\nexport const paintColors = /* @__PURE__ */ read(\"paintColors\")\nexport const paintMarkBlocks = /* @__PURE__ */ read(\"paintMarkBlocks\")\nexport const planMarks = /* @__PURE__ */ read(\"planMarks\")\nexport const pointInsetPx = /* @__PURE__ */ read(\"pointInsetPx\")\nexport const pointMark = /* @__PURE__ */ read(\"pointMark\")\nexport const rampUniforms = /* @__PURE__ */ read(\"rampUniforms\")\nexport const rampValueBits = /* @__PURE__ */ read(\"rampValueBits\")\nexport const recordPath = /* @__PURE__ */ read(\"recordPath\")\nexport const rowColor = /* @__PURE__ */ read(\"rowColor\")\nexport const rowSlot = /* @__PURE__ */ read(\"rowSlot\")\nexport const rowSpanIndex = /* @__PURE__ */ read(\"rowSpanIndex\")\nexport const ruleMark = /* @__PURE__ */ read(\"ruleMark\")\nexport const shiftInk = /* @__PURE__ */ read(\"shiftInk\")\nexport const spanMark = /* @__PURE__ */ read(\"spanMark\")\nexport const spansInRow = /* @__PURE__ */ read(\"spansInRow\")\nexport const thresholdBandOf = /* @__PURE__ */ read(\"thresholdBandOf\")\nexport const valueWindow = /* @__PURE__ */ read(\"valueWindow\")\nexport const withPassId = /* @__PURE__ */ read(\"withPassId\")\nexport default host && host.__esModule ? host.default : host", "import {\n GAP_PX,\n coalesceRuns,\n runPaint,\n} from '@jbrowse/bandage-core/layout/walkRowDraw'\nimport { spanMark } from '@jbrowse/render-core/marks'\n\nimport type { WalkRow, WalkRun } from '@jbrowse/bandage-core/layout/walkRows'\nimport type { MarkContext2D, SpanChannels } from '@jbrowse/render-core/marks'\n\ntype Rgb = [number, number, number]\n\nfunction hslRgb(h: number, s: number, l: number): Rgb {\n const a = s * Math.min(l, 1 - l)\n const f = (n: number) => {\n const k = (n + h / 30) % 12\n return 255 * (l - a * Math.max(-1, Math.min(k - 3, 9 - k, 1)))\n }\n return [f(0), f(8), f(4)]\n}\n\n// The colours runPaint writes: `#rrggbb`, `rgb(r, g, b)` and\n// `hsl(h, s%, l%)`\nexport function cssRgb(css: string): Rgb {\n if (css.startsWith('#')) {\n const v = Number.parseInt(css.slice(1), 16)\n return [(v >> 16) & 0xff, (v >> 8) & 0xff, v & 0xff]\n }\n const [a = 0, b = 0, c = 0] = css.match(/[\\d.]+/g)!.map(Number)\n return css.startsWith('hsl') ? hslRgb(a, b / 100, c / 100) : [a, b, c]\n}\n\nconst abgr = ([r, g, b]: Rgb) =>\n ((0xff << 24) |\n (Math.round(b) << 16) |\n (Math.round(g) << 8) |\n Math.round(r)) >>>\n 0\n\nconst cssAbgr = new Map<string, number>()\nfunction packCss(css: string) {\n let v = cssAbgr.get(css)\n if (v === undefined) {\n v = abgr(cssRgb(css))\n cssAbgr.set(css, v)\n }\n return v\n}\n\n/**\n * A run as the pieces it paints in, each `[start, end, abgr]` in bp along\n * the row: one for a solid fill, and for a gradient one per pixel or per\n * degree of hue, whichever is fewer, coloured as the SVG gradient through\n * the same stops colours its middle\n */\nexport function runPieces(\n run: WalkRun,\n ramp: { start: number; end: number } | undefined,\n pxPerBp: number,\n): [number, number, number][] {\n const end = run.start + run.bp\n const paint = runPaint(run, ramp)\n if ('fill' in paint) {\n return [[run.start, end, packCss(paint.fill)]]\n }\n const stops = paint.stops.map(cssRgb)\n const hues = paint.stops.map(css => Number(/[\\d.]+/.exec(css)![0]))\n const hueSpan = Math.abs(hues.at(-1)! - hues[0]!)\n const n = Math.max(\n 1,\n Math.min(Math.ceil(run.bp * pxPerBp), Math.ceil(hueSpan), run.bp),\n )\n const pieces: [number, number, number][] = []\n for (let k = 0; k < n; k++) {\n const t = ((k + 0.5) / n) * (stops.length - 1)\n const i = Math.min(Math.floor(t), stops.length - 2)\n const a = stops[i]!\n const b = stops[i + 1]!\n const f = t - i\n pieces.push([\n Math.round(run.start + (run.bp * k) / n),\n Math.round(run.start + (run.bp * (k + 1)) / n),\n abgr([0, 1, 2].map(j => a[j]! + (b[j]! - a[j]!) * f) as Rgb),\n ])\n }\n return pieces\n}\n\nexport interface WalkRowSpans {\n bars: SpanChannels & { color: Uint32Array }\n gaps: SpanChannels & { color: Uint32Array }\n // where each drawn row's spans start in `bars` and `gaps`\n barRows: Uint32Array\n gapRows: Uint32Array\n}\n\nfunction channels(capacity: number) {\n return {\n x: new Uint32Array(capacity),\n x2: new Uint32Array(capacity),\n row: new Uint32Array(capacity),\n color: new Uint32Array(capacity),\n count: 0,\n }\n}\n\nfunction trim(c: ReturnType<typeof channels>) {\n const n = c.count\n return {\n x: c.x.subarray(0, n),\n x2: c.x2.subarray(0, n),\n row: c.row.subarray(0, n),\n color: c.color.subarray(0, n),\n count: n,\n }\n}\n\n/**\n * Each row's runs as `walkRowsTree` coalesces and colours them at\n * `pxPerBp`, as span channels: `x`/`x2` in bp along the row, `row` its index\n * among `rows`. Gaps go apart, since they draw thinner.\n */\nexport function walkRowSpans(\n rows: WalkRow[],\n pxPerBp: number,\n ramp?: { start: number; end: number },\n): WalkRowSpans {\n const pieces = rows.map(r =>\n coalesceRuns(r.runs, pxPerBp).map(run => ({\n gap: run.gap,\n pieces: runPieces(run, ramp, pxPerBp),\n })),\n )\n let total = 0\n for (const runs of pieces) {\n for (const run of runs) {\n total += run.pieces.length\n }\n }\n const bars = channels(total)\n const gaps = channels(total)\n const barRows = new Uint32Array(rows.length + 1)\n const gapRows = new Uint32Array(rows.length + 1)\n pieces.forEach((runs, row) => {\n for (const run of runs) {\n const c = run.gap ? gaps : bars\n for (const [x, x2, color] of run.pieces) {\n const i = c.count++\n c.x[i] = x\n c.x2[i] = x2\n c.row[i] = row\n c.color[i] = color\n }\n }\n barRows[row + 1] = bars.count\n gapRows[row + 1] = gaps.count\n })\n return { bars: trim(bars), gaps: trim(gaps), barRows, gapRows }\n}\n\nfunction slice<T extends SpanChannels & { color: Uint32Array }>(\n c: T,\n a: number,\n b: number,\n) {\n return {\n x: c.x.subarray(a, b),\n x2: c.x2.subarray(a, b),\n row: c.row.subarray(a, b),\n color: c.color.subarray(a, b),\n count: b - a,\n }\n}\n\nexport interface WalkRowSpanFrame {\n scaleX: number\n scaleY: number\n translateX: number\n translateY: number\n width: number\n height: number\n rowPx: number\n barPx: number\n origin: number\n // runs of rows whose y is `rowY(first)` plus a row pitch each, as the\n // reference row and each grouped section are\n blocks: { first: number; count: number; rowY: number }[]\n}\n\n/**\n * Paints the spans through render-core's span mark, a block of rows at a\n * time: row i's bar centred where `walkRowsTree` centres it, `barPx` tall,\n * its x at `origin + bp` through the pane's transform.\n */\nexport function paintWalkRowSpans(\n ctx: MarkContext2D,\n spans: WalkRowSpans,\n f: WalkRowSpanFrame,\n) {\n let longest = 1\n for (const c of [spans.bars, spans.gaps]) {\n for (const x2 of c.x2) {\n longest = Math.max(longest, x2)\n }\n }\n const block = {\n start: 0,\n end: longest,\n screenStartPx: f.origin * f.scaleX + f.translateX,\n screenEndPx: (f.origin + longest) * f.scaleX + f.translateX,\n reversed: false,\n displayedRegionIndex: 0,\n }\n const frame = { canvasWidth: f.width, canvasHeight: f.height }\n const rowHeight = f.rowPx * f.scaleY\n for (const { first, count, rowY } of f.blocks) {\n // slot `row` centres at (rowY + (row - first) * rowPx) * scaleY + translateY\n const scrollTop =\n rowHeight / 2 - f.translateY - (rowY - first * f.rowPx) * f.scaleY\n const top = (rowY - f.rowPx / 2) * f.scaleY + f.translateY\n if (top > f.height || top + count * rowHeight < 0) {\n continue\n }\n for (const [c, starts, barPx] of [\n [spans.bars, spans.barRows, f.barPx],\n [spans.gaps, spans.gapRows, Math.min(GAP_PX, f.barPx)],\n ] as const) {\n spanMark.paintBlock(\n ctx,\n slice(c, starts[first]!, starts[first + count]!),\n block,\n frame,\n {\n rowHeight,\n rowProportion: barPx / rowHeight,\n minWidthPx: 1,\n seamPx: 0,\n scrollTop,\n },\n )\n }\n }\n}\n", "import { useEffect, useId, useMemo, useRef } from 'react'\n\nimport { walkRowsTree } from '@jbrowse/bandage-core/layout/walkRowDraw'\nimport { getDpr } from '@jbrowse/bandage-core/renderer/canvas'\nimport { autorun, computed } from 'mobx'\nimport { observer } from 'mobx-react'\n\nimport ElTree from './ElTree'\nimport { SECTION_HEADER_PX } from '../walkRowGroups'\nimport { paintWalkRowSpans, walkRowSpans } from '../walkRowSpans'\n\nimport type { GraphPaneModel } from '../model'\nimport type { WalkRowSection } from '../walkRowGroups'\nimport type { El } from '@jbrowse/bandage-core/el'\nimport type {\n WalkRowsFrame,\n WalkRowsWithCalls,\n} from '@jbrowse/bandage-core/layout/walkRowDraw'\n\n// The walk-rows layout's bars: one per haplotype walk under the reference\n// row, each on its own bp axis from the window's left edge. The runs paint as\n// spans on a canvas, coloured by whether they are on the reference walk's\n// path, and core's walkRowsTree draws the rest: unit separators, each row's\n// genes from its own assembly's annotation, the allele a repeat genotype\n// called and a readout. Under the\n// reference-position ramp an aligned run takes the hue of the reference it is\n// threaded through. In a tandem array that is the aligner's pick among\n// near-identical copies, so the hue says which reference copy the graph used,\n// not which one a copy resembles.\n//\n// The walk rows pair a repeat record's allele with each walk \u2014 see\n// repeats/walkCalls.ts, which also holds the threshold a red readout is read\n// off. Colouring each copy by its unit is jbrowse-plugin-tandem-repeat's.\n\nconst svgStyle = {\n position: 'absolute' as const,\n left: 0,\n top: 0,\n pointerEvents: 'none' as const,\n overflow: 'visible' as const,\n zIndex: 3,\n}\n\n// The rows' trees, a section at a time while grouped. walkRowsTree puts its\n// i-th row at i * rowPx below its reference row and draws that row too, so\n// each section is drawn shifted down to its place with its reference row\n// dropped.\nexport function walkRowTrees(\n bars: WalkRowsWithCalls,\n sections: WalkRowSection[],\n rowY: (i: number) => number,\n frame: WalkRowsFrame & { rowPx: number },\n o: Parameters<typeof walkRowsTree>[2] & { idPrefix: string },\n): El[] {\n if (sections.length === 0) {\n return [walkRowsTree(bars, frame, o)]\n }\n return [\n walkRowsTree({ ...bars, rows: [] }, frame, o),\n ...sections.flatMap((section, k) => {\n const tree = walkRowsTree(\n {\n ...bars,\n rows: bars.rows.slice(\n section.first - 1,\n section.first - 1 + section.count,\n ),\n },\n {\n ...frame,\n translateY:\n frame.translateY +\n (rowY(section.first) - frame.rowPx) * frame.scaleY,\n },\n { ...o, idPrefix: `${o.idPrefix}-s${k}` },\n )\n return tree.children.filter(\n (c): c is El =>\n typeof c !== 'string' &&\n c.attrs['data-testid'] !== 'graph-walk-reference',\n )\n }),\n ]\n}\n\nconst canvasStyle = { ...svgStyle, overflow: undefined }\n\n// Repainted by an autorun, as the other overlay canvases are, so a pan moves\n// the bars in the same frame as the drawing. The spans are recut only when\n// the rows, the zoom or the ramp change.\nconst WalkRowSpansCanvas = observer(function WalkRowSpansCanvas({\n model,\n}: {\n model: GraphPaneModel\n}) {\n const ref = useRef<HTMLCanvasElement>(null)\n useEffect(() => {\n const spans = computed(() => {\n const bars = model.walkRowBars\n return bars\n ? walkRowSpans(\n [bars.reference, ...bars.rows],\n model.scaleX,\n model.referenceRampDomain,\n )\n : undefined\n })\n return autorun(() => {\n const canvas = ref.current\n const ctx = canvas?.getContext('2d')\n const bars = model.walkRowBars\n const place = model.walkRowPlacement\n const pitch = model.walkRowPitch\n const painted = spans.get()\n if (!canvas || !ctx || !bars || !place || !pitch || !painted) {\n return\n }\n const width = model.paneWidth\n const height = model.canvasHeight\n const dpr = getDpr()\n canvas.width = Math.round(width * dpr)\n canvas.height = Math.round(height * dpr)\n ctx.setTransform(dpr, 0, 0, dpr, 0, 0)\n ctx.clearRect(0, 0, width, height)\n const sections = model.walkRowGroups?.sections\n const blocks = sections?.length\n ? [\n { first: 0, count: 1, rowY: place.rowY(0) },\n ...sections.map(s => ({\n first: s.first,\n count: s.count,\n rowY: place.rowY(s.first),\n })),\n ]\n : [{ first: 0, count: bars.rows.length + 1, rowY: place.rowY(0) }]\n paintWalkRowSpans(ctx, painted, {\n scaleX: model.scaleX,\n scaleY: model.scaleY,\n translateX: model.translateX,\n translateY: model.translateY,\n width,\n height,\n rowPx: pitch.rowPx,\n barPx: pitch.barPx,\n origin: bars.origin,\n blocks,\n })\n })\n }, [model])\n return (\n <canvas\n ref={ref}\n data-testid=\"graph-walk-rows-spans\"\n style={{\n ...canvasStyle,\n width: model.paneWidth,\n height: model.canvasHeight,\n }}\n />\n )\n})\n\n// `vector` for an SVG export, which draws the bars as walkRowsTree's rects\nconst WalkRowsOverlay = observer(function WalkRowsOverlay({\n model,\n vector = false,\n}: {\n model: GraphPaneModel\n vector?: boolean\n}) {\n const idPrefix = useId().replace(/[^\\w-]/g, '')\n const bars = model.walkRowBars\n const place = model.walkRowPlacement\n const pitch = model.walkRowPitch\n const bare = useMemo(\n () =>\n bars && {\n ...bars,\n reference: { ...bars.reference, runs: [] },\n rows: bars.rows.map(r => ({ ...r, runs: [] })),\n },\n [bars],\n )\n if (!bars || !bare || !place || !pitch) {\n return null\n }\n const { paneWidth: width, canvasHeight } = model\n const Y = (y: number) => y * model.scaleY + model.translateY\n const hovered = model.hoveredWalkRowText\n ? [bars.reference, ...bars.rows].findIndex(\n r => r.name === model.hoveredWalkRow,\n )\n : -1\n const row =\n hovered >= 0 ? [bars.reference, ...bars.rows][hovered]! : undefined\n const frame = {\n scaleX: model.scaleX,\n scaleY: model.scaleY,\n translateX: model.translateX,\n translateY: model.translateY,\n width,\n height: canvasHeight,\n ...pitch,\n }\n return (\n <>\n {vector ? null : <WalkRowSpansCanvas model={model} />}\n <svg\n style={svgStyle}\n width={width}\n height={canvasHeight}\n data-testid=\"graph-walk-rows\"\n >\n {walkRowTrees(\n vector ? bars : bare,\n model.walkRowGroups?.sections ?? [],\n place.rowY,\n frame,\n {\n ramp: model.referenceRampDomain,\n rowGenes: model.walkRowGenes,\n idPrefix,\n },\n ).map((tree, i) => (\n <ElTree key={i} el={tree} />\n ))}\n {place.headers.map(header => (\n <text\n key={header.key}\n x={10}\n y={Y(header.top) + SECTION_HEADER_PX - 4}\n fontFamily=\"sans-serif\"\n fontSize={11}\n fontWeight=\"bold\"\n fill=\"#333\"\n data-testid=\"graph-walk-section\"\n >\n {header.title}\n </text>\n ))}\n {row ? (\n <rect\n data-testid=\"graph-walk-row-hovered\"\n x={bars.origin * model.scaleX + model.translateX - 2}\n y={Y(place.rowY(hovered)) - pitch.rowPx / 2 - 1}\n width={row.bp * model.scaleX + 4}\n height={pitch.rowPx + 2}\n fill=\"none\"\n stroke=\"#111\"\n strokeWidth={1}\n />\n ) : null}\n </svg>\n </>\n )\n})\n\nexport default WalkRowsOverlay\n"],
5
- "mappings": "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",
6
- "names": ["svgStyle", "BubbleHalos", "observer", "model", "bubbleHalos", "hoveredBubble", "scaleX", "scaleY", "translateX", "translateY", "width", "canvasHeight", "halo", "HALO_FACTOR", "jsx", "h", "sameBubble", "BUBBLE_KIND_COLORS", "bubbleKey", "BubbleHalos_default", "SWATCH_PX", "BAR_PX", "UNPLACED_SWATCH", "FADED_SWATCH", "STRIP_SAMPLES", "TUBE_SWATCH_PX", "FOLD_TICK_BACKING", "WALK_ROW_SWATCH_PX", "swatchWidth", "swatch", "flat", "color", "fillRow", "key", "label", "width", "bandStops", "colors", "i", "haloKeyEntries", "model", "kindsByColor", "h", "BUBBLE_KIND_COLORS", "kinds", "BUBBLE_KIND_NAMES", "names", "openBubbleRows", "open", "halo", "sameBubble", "rampRows", "domain", "start", "end", "offReference", "unplaced", "formatBp", "RAMP_GRADIENT_STOPS", "REFERENCE_RAMP_ALT_CSS", "stripBands", "lift", "w", "encodingStops", "b", "c", "all", "n", "LIFT_BACKDROP_CSS", "_", "stripRows", "rowPerWalk", "haloRows", "geneRows", "pin", "EXON_COLOR", "foldRows", "note", "pathRows", "name", "tubeRow", "tubeMapRows", "roles", "haplotypeTube", "bundled", "values", "logWidths", "foldBp", "forwardReads", "reverseReads", "substitution", "insertion", "deletion", "reads", "rows", "PANEL_REFERENCE_TUBE", "value", "readRow", "FORWARD_READ_COLORS", "REVERSE_READ_COLORS", "deviationInk", "walkRowSwatch", "GENE_INK", "GAP_PX", "walkRowsRows", "bars", "calls", "row", "tick", "walkRowsKey", "entry", "call", "CALL_TICK", "UNBACKED_TICK", "DISAGREES", "walkKeyRow", "walk", "walkKey", "walkReadoutRows", "facetKeyRows", "legendSections", "section", "propName", "name", "_", "c", "toReact", "node", "key", "props", "value", "createElement", "ElTree", "el", "svgStyle", "GenePins", "observer", "model", "id", "useId", "genePins", "walkLift", "nodeInk", "scaleX", "scaleY", "translateX", "translateY", "paneWidth", "canvasHeight", "focus", "pins", "pin", "e", "tree", "exonOutlineTree", "exonStretches", "jsx", "ElTree", "GenePins_default", "chipBox", "x", "y", "w", "LABEL_PX", "LABEL_PAD", "inChip", "chip", "px", "py", "box", "LabelChip", "text", "note", "color", "edge", "italic", "small", "dimmed", "title", "testId", "onClick", "onHover", "jsxs", "jsx", "svgStyle", "GENE_INK", "TICK_PX", "TICK_WIDTH", "chipReadoutAt", "genes", "px", "py", "pin", "chip", "inChip", "gene", "note", "geneCoverageNote", "LabelLayer", "observer", "model", "bubbles", "ticks", "scaleY", "translateY", "contigThickness", "hoveredBubble", "hoveredTick", "t", "sameBubble", "tickAt", "target", "dimmedBubble", "h", "isOpen", "jsxs", "jsx", "e", "tick", "isAlive", "x", "y", "i", "BUBBLE_KIND_COLORS", "bubbleKey", "text", "LABEL_PX", "LabelChip", "EXON_COLOR", "hovered", "labelWidth", "LabelLayer_default", "canvasStyle", "paintReferenceStrip", "ctx", "model", "lit", "dpr", "frame", "drawReferenceStrip", "ReferenceStripOverlay", "observer", "ref", "useRef", "referenceStripShown", "paneWidth", "canvasHeight", "useEffect", "autorun", "canvas", "getDpr", "width", "height", "jsx", "ReferenceStripOverlay_default", "PANEL_TICK_ALPHA", "canvasStyle", "paintTubeMap", "ctx", "model", "highlightNode", "picture", "frame", "width", "panels", "paintPanels", "tubeFrame", "drawTubeMap", "drawn", "drawBundleCounts", "drawSqueezedLengths", "drawDeviationMarks", "drawTubeMapConnectors", "bounds", "drawTubeMapGenes", "boxes", "drawTubeMapRuler", "ink", "p", "PANEL_TITLE_FONT", "last", "TubeMapOverlay", "observer", "ref", "useRef", "tubeMapPicture", "paneWidth", "canvasHeight", "useEffect", "autorun", "canvas", "dpr", "getDpr", "height", "jsx", "TubeMapOverlay_default", "host", "read", "name", "spanMark", "read", "marks_default", "host", "hslRgb", "h", "s", "l", "a", "f", "n", "k", "cssRgb", "css", "v", "b", "c", "abgr", "r", "g", "cssAbgr", "packCss", "runPieces", "run", "ramp", "pxPerBp", "end", "paint", "runPaint", "stops", "hues", "hueSpan", "pieces", "t", "i", "j", "channels", "capacity", "trim", "walkRowSpans", "rows", "coalesceRuns", "total", "runs", "bars", "gaps", "barRows", "gapRows", "row", "x", "x2", "color", "slice", "paintWalkRowSpans", "ctx", "spans", "longest", "block", "frame", "rowHeight", "first", "count", "rowY", "scrollTop", "top", "starts", "barPx", "GAP_PX", "spanMark", "svgStyle", "walkRowTrees", "bars", "sections", "rowY", "frame", "o", "walkRowsTree", "section", "k", "c", "canvasStyle", "WalkRowSpansCanvas", "observer", "model", "ref", "useRef", "useEffect", "spans", "computed", "walkRowSpans", "autorun", "canvas", "ctx", "place", "pitch", "painted", "width", "height", "dpr", "getDpr", "blocks", "s", "paintWalkRowSpans", "jsx", "WalkRowsOverlay", "vector", "idPrefix", "useId", "bare", "useMemo", "r", "canvasHeight", "Y", "y", "hovered", "row", "jsxs", "Fragment", "tree", "i", "ElTree", "header", "SECTION_HEADER_PX", "WalkRowsOverlay_default"]
7
- }
@@ -1,4 +0,0 @@
1
- import{a as Io,c as Bo,e as It,f as An,g as tr,i as nr,j as or}from"./chunk-YSTMDXXX.js";import{A as Nt,Aa as vr,B as qo,Ba as Rr,C as Jo,Ca as Lr,D as Zo,Da as Nr,E as Qo,Ea as Pr,Fa as Ar,Ga as Tr,H as er,I as Pn,Ia as Cn,J as qe,K as Je,Ka as Er,L as Pt,La as $t,M as oe,N as At,Oa as Ze,P as Tt,Pa as Ir,Q as Et,Qa as Br,R as ir,Ra as Ft,Sa as Or,U as we,Ua as Cr,V as cr,Va as Gr,W as In,Wa as _r,X as dr,Y as Bn,Z as ur,Za as $r,_ as pr,aa as lr,ab as Fr,b as wt,cb as Dr,d as yn,da as ue,db as Hr,eb as Wr,fa as mr,fb as Xr,g as Ke,ga as fr,gb as Vr,h as de,ha as hr,hb as jr,i as be,ia as gr,ib as Yr,ja as br,jb as Ur,ka as Ct,kb as Dt,la as On,m as Uo,mb as zr,o as zo,oa as wr,p as vn,pa as yr,q as Ko,r as Rt,ra as kr,s as Rn,sa as Gt,va as xr,w as Ln,wa as Mr,x as Lt,xa as _t,z as Nn,za as Sr}from"./chunk-5SFGHDQA.js";import{a as kn,c as xn,f as ce,g as St,h as Te,k as Ee,l as jo,m as Yo,n as vt,q as Tn,r as rr,s as sr,t as En}from"./chunk-DZ4OUKQV.js";import{A as Do,B as Ho,C as Sn,D as Wo,F as Ue,O as Ae,P as Xo,Q as Vo,R as ze,S as xt,W as Mt,a as te,b as je,f as kt,g as fe,k as he,l as ge,m as Oo,o as W,p as Co,s as Go,t as _o,u as Ye,v as Pe,w as Mn,y as $o,z as Fo}from"./chunk-MHPJB22Z.js";import{b as Bt,c as Ot,e as ar}from"./chunk-XT766CZ5.js";import{b as mn,c as fn,d as hn,f as gn,g as Po}from"./chunk-EWFJBQDV.js";import{b as Ne,c as E,d as Xe,e as ie,f as un,g as me,h as pn,i as ln,j as Ve}from"./chunk-AU73K7LX.js";import{b as Eo,c as wn}from"./chunk-TXI43PEN.js";import{c as Ao,e as H}from"./chunk-MVVXRZXV.js";import{a as Re,c as No,d as Le}from"./chunk-446RWIA3.js";import{a as bn,b as To}from"./chunk-5OI6LO4I.js";import{g as L}from"./chunk-NDRLCGPC.js";import{f as Ro,g as We,h as Lo,j as J}from"./chunk-TENPGIPX.js";import{b as yt}from"./chunk-6OPB7FOJ.js";import{b as Z}from"./chunk-JMBDTNUR.js";var ye=JBrowseExports["@mui/material/SvgIcon"],Fa=e=>ye!=null&&e in Object(ye)?ye[e]:Object.assign(function(){throw new Error("This JBrowse does not provide '"+e+"' from '@mui/material/SvgIcon' to plugins: GraphGenomeView was built for a different JBrowse version, so update the plugin or JBrowse")},{jbrowseHostMissing:e}),K=Fa("createSvgIcon"),Jc=ye&&ye.__esModule?ye.default:ye;var Da=/^[^#]+#\d+$/;function Ha(e,t){let n=e.assemblyNameToPanSN??{},o=new Set(Object.values(n)),s={};for(let{name:r,aliases:a}of t){let i=a.find(c=>Da.test(c));i!==void 0&&!o.has(i)&&(s[r]=i)}return Object.keys(s).length===0?e:{...e,assemblyNameToPanSN:{...s,...n}}}var Wa=new Set(["GbzBaseSyntenyAdapter","WalkTabixSyntenyAdapter"]);function Kr(e,t){let n=H(t,"adapter");return Wa.has(n.type)?Ha(n,J(e).assemblyManager.assemblyList.map(o=>({name:H(o,"name"),aliases:H(o,"aliases")??[]}))):n}function qr(e){return Ne(e)?Jr(e):void 0}function Jr(e){return{sample:Re(e.stable.refName),haplotype:No(e.stable.refName),refName:Le(e.stable.refName),start:e.stable.start,end:e.stable.start+e.length}}function Xa(e,t){let n=[...e].sort((r,a)=>r.start-a.start),o,s;for(let r of n)s=s&&r.start-s.end<=t?{start:s.start,end:Math.max(s.end,r.end)}:{start:r.start,end:r.end},(!o||s.end-s.start>o.end-o.start)&&(o=s);return o}function Va(e){return`${e.haplotype??e.sample}\0${e.refName}`}function Zr(e,{maxGap:t=1/0}={}){let n=new Map;for(let s of e.nodes)if(Ne(s)){let r=Jr(s),a=Va(r),i=n.get(a);i?(i.spans.push({start:r.start,end:r.end}),i.rank=Math.min(i.rank,s.stable.rank)):n.set(a,{sample:r.sample,haplotype:r.haplotype,refName:r.refName,rank:s.stable.rank,spans:[{start:r.start,end:r.end}]})}let o=new Map;for(let s of n.values()){let r=Xa(s.spans,t);if(r){let a={sample:s.sample,haplotype:s.haplotype,refName:s.refName,start:r.start,end:r.end,rank:s.rank,nodeCount:s.spans.length},i=s.haplotype??s.sample,c=o.get(i);(!c||a.nodeCount>c.nodeCount)&&o.set(i,a)}}return[...o.values()].sort((s,r)=>+(s.rank!==0)-+(r.rank!==0)||s.sample.localeCompare(r.sample)||(s.haplotype??"").localeCompare(r.haplotype??""))}function Ie(e,t){return(t.haplotype===void 0?void 0:e(t.haplotype))??e(t.sample)}function Qr(e,t){return e.flatMap(n=>{let o=Ie(t,n);return o===void 0?[]:[{...n,sample:o}]})}function Ht(e){return`${e.refName}:${e.start+1}-${e.end}`}function Be(e){return`${e.refName}:${(e.start+1).toLocaleString()}-${e.end.toLocaleString()}`}function es(e){return e.sample??Re(e.name)}function ja(e){return e.haplotype!==void 0&&e.sample!==void 0?`${e.sample}#${e.haplotype}`:es(e)}var Ya=class{constructor(e){this.index=new Map,this.lengths=[],this.onReference=new Uint8Array(0),this.referenceStart=new Float64Array(0),this.referenceEnd=new Float64Array(0);for(let t of e.nodes)this.lengths[this.indexOf(t.id)]=t.length}indexOf(e){let t=this.index.get(e);return t===void 0&&(t=this.lengths.length,this.index.set(e,t),this.lengths.push(0)),t}nodesOf(e){let t=new Int32Array(e.nodeIds.length);return e.nodeIds.forEach((n,o)=>{t[o]=this.indexOf(n)}),t}spanAt(e,t){let n=t>=0&&t<e.length?e[t]:-1;return n>=0&&this.onReference[n]?{start:this.referenceStart[n],end:this.referenceEnd[n]}:void 0}};function Ua(e,t){let n=[],o;for(let s of e){o!==void 0&&s.start!==void 0&&s.start>o&&n.push(o-s.start);let r=0;for(let a of s.nodes)n.push(a),r+=t.lengths[a];o=s.start===void 0?void 0:s.start+r}return Float64Array.from(n)}function za(e,t,n){let o,s=0,r;for(let a of e){if(a.start===void 0||o!==void 0&&a.start<o)return;o!==void 0&&a.start>o&&s++===n&&(r={start:o,end:a.start});let i=a.start;for(let c of a.nodes){let d=t.lengths[c];s++===n&&(r={start:i,end:i+d}),i+=d}o=i}return r}function Ka(e,t,n,o=!0){if(!n||!o)return{ids:e,complete:!0,from:-1,to:-1};let{onReference:s,referenceStart:r,referenceEnd:a}=t,i=-1,c=-1,d=-1/0,l=1/0;for(let b=0;b<e.length;b++){let x=e[b];if(x>=0&&s[x]){let S=a[x],P=r[x];S<=n.start&&S>d&&(d=S,i=b),P>=n.end&&P<l&&(l=P,c=b)}}if(i>=0&&c>=0){let b=e.slice(Math.min(i,c)+1,Math.max(i,c));return{ids:i<c?b:b.reverse(),complete:!0,from:i,to:c}}let p=b=>t.spanAt(e,b),u=i>=0?i:c,f=-1;for(let b=1;u>=0&&f<0&&b<e.length;b++)f=[u-b,u+b].find(x=>p(x)!==void 0)??-1;if(f<0)return{ids:e,complete:!1,from:-1,to:-1};let w=f>u==p(f).start>p(u).start===(u===i),h=w?e.slice(u+1):e.slice(0,u).reverse(),m=h.length>0?h.length-1:-1,k=m<0?p(u):p(w?u+1+m:0),y={contigEnds:k!==void 0,shortBp:k?Math.max(0,n.start-k.end,k.start-n.end):0};return{ids:h,complete:!1,from:u,to:w?e.length:-1,stop:y}}function Oe(e,t){return t?e.filter(n=>t.includes(n.sample)).sort((n,o)=>t.indexOf(n.sample)-t.indexOf(o.sample)||n.label.localeCompare(o.label)):e}function Ce(e,t,n){let o=e.paths??[],s=y=>W(y.name).name===e.referencePath,r=o.some(s)?o.filter(s).sort((y,b)=>(y.start??0)-(b.start??0)):o.slice(0,1),a=r[0],i=o.filter(y=>!r.includes(y));if(!a||i.length===0)return;let c=new Map;for(let y of i){let b=c.get(y.name);b?b.push(y):c.set(y.name,[y])}let d=new Ya(e),l=a.start??0,p=t&&t.end>t.start?t:void 0,u=r.map(y=>d.nodesOf(y)),f=d.lengths.length;d.onReference=new Uint8Array(f),d.referenceStart=new Float64Array(f),d.referenceEnd=new Float64Array(f);let g=!1,w=!1;for(let[y,b]of r.entries()){let x=b.start??0;for(let S of u[y]){let P=d.lengths[S];d.onReference[S]||(d.onReference[S]=1,d.referenceStart[S]=x,d.referenceEnd[S]=x+P,g||=p!==void 0&&x+P<=p.start,w||=p!==void 0&&x>=p.end),x+=P}}let h=p===void 0||g&&w,m=(y,b)=>{let x=y[0],S=y.map((v,R)=>({start:v.start,nodes:b?.[R]??d.nodesOf(v)})).sort((v,R)=>(v.start??0)-(R.start??0)),{ids:P,complete:I,from:V,to:_,stop:B}=Ka(Ua(S,d),d,p,h),j=x.contig??Le(W(x.name).name),X=za(S,d,V<0?0:V),T=X?V<0?{contig:j,start:X.start,reversed:!1}:V<_?{contig:j,start:X.end,reversed:!1}:{contig:j,start:X.start,reversed:!0}:void 0,{lengths:N,onReference:C,referenceStart:$,referenceEnd:F}=d,Y=[],A,D=0,ae=0,U=0,M=0;for(let v of P){if(v<0){A={start:D,bp:-v,onReference:!1,gap:!0},Y.push(A),D-=v,U-=v,M=0;continue}let R=N[v],O=C[v]===1,z=A?.referenceStart,ne=O&&z!==void 0&&M>=0&&z+A.bp===$[v],ve=O&&z!==void 0&&M<=0&&F[v]===z;!O&&A&&!A.onReference&&!A.gap?A.bp+=R:ne||ve?(A.bp+=R,ne||(A.referenceStart=$[v],A.reversed=!0),M=ne?1:-1):(A={start:D,bp:R,onReference:O,referenceStart:O?$[v]:void 0},Y.push(A),M=0),D+=R,O||(ae+=R)}return{name:x.name,label:ja(x),sample:es(x),haplotype:x.haplotype,bp:D,offReferenceBp:ae,gapBp:U,complete:I,stop:B,runs:Y,axis:T}};return{origin:p?p.start:l,unit:n,reference:m(r,u),rows:[...c.values()].map(y=>m(y)).sort((y,b)=>Number(b.complete)-Number(y.complete)||b.bp-y.bp||y.label.localeCompare(b.label))}}var Wt=1.3;function Ge(e,t={rowPx:te,readouts:!0}){let n=e.reference.bp;for(let o of e.rows)n=Math.max(n,o.bp);return{maxX:e.origin+n*(t.readouts?Wt:1),maxY:e.rows.length*t.rowPx}}function _e(e,t,n){return e?n&&!n.labelled?[]:[e.reference,...e.rows].map((o,s)=>({label:o.label,y:s*(n?.rowPx??te)})):t?.rowLabels??[]}function Gn(e,t){let n=ie(e),o=Ce(e,t);if(n.length===0||!o)return;let s=t?n.filter(a=>un(a,t)):n;return{nodePositions:me(s.length>0?s:n),rowLabels:_e(o),referenceAxis:!0,pixelRows:!0,extent:Ge(o)}}function _n(e){return e.walkStrip&&e.mode.drawsNodes&&!e.drawsPicture&&!e.popped&&!e.host&&e.walks>1}function $n(e,t){return e.wholeWalks||t.walkStrip&&!t.host}var Qe=6,os=260,qa=11,Ja=3,Za="#111",ts=3;function Fn(e,t,n){let o=e.pathVisits?.get(n.name)??[],s=[];for(let r of t){let a=r.axis;if(!a)continue;let i=W(r.name).name;for(let c of o){if(c.path!==i)continue;let{start:d,end:l}=zo(a,c.start,c.start+n.length);l>0&&d<r.bp&&s.push({row:r.name,start:d,bp:l-d})}}return s}var ns=new WeakMap;function Qa(e,t){let n=ns.get(e);if(n||(n=new Map,ns.set(e,n)),n.has(t))return n.get(t);let o=new Map(e.nodes.map(i=>[i.id,i.length])),s=W(t).name,r=(e.paths??[]).filter(i=>s===e.referencePath?W(i.name).name===s:i.name===t),a;if(r.every(i=>i.start!==void 0)){a={ids:[],starts:[],ends:[]};for(let i of[...r].sort((c,d)=>c.start-d.start)){let c=i.start;for(let d of i.nodeIds){let l=o.get(d)??0;a.ids.push(d),a.starts.push(c),a.ends.push(c+l),c+=l}}}return n.set(t,a),a}function ei(e,t,n,o){let s=t.axis,r=s&&Qa(e,t.name);if(!s||!r||n<0||n>t.bp)return;let a=s.reversed?s.start-n:s.start+n,i=.5/o,c=s.reversed?{start:s.start-t.bp,end:s.start}:{start:s.start,end:s.start+t.bp},d=Math.max(a-i,c.start),l=Math.min(a+i,c.end),p=0,u=r.starts.length;for(;p<u;){let h=p+u>>1;r.ends[h]<=d?p=h+1:u=h}let f,g=-1,w=!1;for(let h=p;h<r.starts.length&&r.starts[h]<l;h++){let m=r.ends[h]-r.starts[h],k=r.starts[h]<=a&&a<r.ends[h];(m>g||m===g&&k&&!w)&&(g=m,f=r.ids[h],w=k)}return f}function et(e,t){let n=t.maxHeight??os,o=t.labelPx??Math.max(...[e.reference,...e.rows].map(f=>f.label.length))*Pe+16,s=e.rows.length+1,{rowPx:r,barPx:a,labelled:i,readouts:c}=Lt(s,n-2*Qe,Ja),d=Math.max(e.reference.bp,...e.rows.map(f=>f.bp),1),l=i?o:Qe,u=Math.max(1,t.width-l-Qe)/(d*(c?Wt:1));return{scaleX:u,scaleY:1,translateX:l-e.origin*u,translateY:Qe+r/2,width:t.width,height:s*r+2*Qe,rowPx:r,barPx:a,readouts:c,labelled:i,boxesGenes:Rt(r,a)}}function ti(e,t,n,o){let s=Math.round((o-t.translateY)/t.rowPx),r=[e.reference,...e.rows][s],a=(n-t.translateX)/t.scaleX-e.origin;return r&&s>=0&&a>=0&&a<=r.bp?{index:s,row:r,offset:a}:void 0}function ni(e,t,n){let o=new Map([e.reference,...e.rows].map((r,a)=>[r.name,a])),s=r=>(e.origin+r)*t.scaleX+t.translateX;return Ke("g",{"data-testid":"graph-walk-marks"},...n.flatMap(r=>{let a=o.get(r.row);if(a===void 0)return[];let i=a*t.rowPx+t.translateY,c=s(r.start),d=Math.max(2,r.bp*t.scaleX),l=p=>Ke("rect",{x:c,y:p,width:d,height:ts,fill:Za});return[l(i-t.barPx/2-ts-1),l(i+t.barPx/2+1)]}))}function Dn(e,t,n=new Set){return Ke("g",{"font-family":"sans-serif","font-size":qa,fill:"#333"},...(t.labelled?[e.reference,...e.rows]:[]).map((o,s)=>Ke("text",{x:6,y:s*t.rowPx+t.translateY+4,"font-weight":n.has(o.name)?600:void 0},o.label)))}function Hn(e,t,n){if(t?.size)return e.boxesGenes?n:{untracked:0,unread:0,...n,crowded:!0}}function tt(e,t,n){let o=new Map;for(let r of e.nodes)if(Ne(r)){let{refName:a}=r.stable;if(n[r.id]?.length){let i=o.get(a)??o.set(a,{nodes:[],reach:0}).get(a);i.nodes.push(r),i.reach=Math.max(i.reach,r.length)}}for(let{nodes:r}of o.values())r.sort((a,i)=>a.stable.start-i.stable.start);let s=[];for(let r of t){let a=o.get(r.refName);if(!a)continue;let i=[],c=[],d=new Set,l,p=1/0,u=0,f=(r.start+r.end)/2,{nodes:g,reach:w}=a;for(let h=pn(g,r.start-w);h<g.length&&g[h].stable.start<r.end;h++){let m=g[h],k=m.stable.start,y=k+m.length;if(y<=r.start)continue;let b=n[m.id];d.add(m.id),u+=Math.min(y,r.end)-Math.max(k,r.start);let x=[];for(let I of r.exons){let V=Math.max(I.start,k),_=Math.min(I.end,y);if(_<=V)continue;let B=Sn(b,(V-k)/m.length,(_-k)/m.length);B.length===1&&B.push({...B[0]}),x.push(je(B))}x.length>0&&(i.push(...x),c.push({nodeId:m.id,d:x.join("")}));let S=Math.min(Math.max(f,k),y),P=Math.abs(S-f);if(P<p){p=P;let I=m.length?(S-k)/m.length:0;l=Sn(b,I,I)[0]}}l&&s.push({gene:r,exons:i.join(""),exonsByNode:c,nodeIds:d,at:l,covered:u/(r.end-r.start)})}return s}var rs="10.2.4";function ss(e,t){let n=e.nodes.filter(h=>E(h)&&(t[h.id]?.length??0)>0);if(n.length<2)return t;let o=n.map(h=>{let m=t[h.id],k=m[Math.floor(m.length/2)];return{x:k.x,y:k.y,r:h.stable.start+h.length/2,w:h.length}}),s=o.reduce((h,m)=>h+m.w,0),r=o.reduce((h,m)=>h+m.x*m.w,0)/s,a=o.reduce((h,m)=>h+m.y*m.w,0)/s,i=o.reduce((h,m)=>h+m.r*m.w,0)/s,c=0,d=0;for(let h of o)c+=h.w*(h.x-r)*(h.r-i),d+=h.w*(h.y-a)*(h.r-i);let l=-Math.atan2(d,c),p=Math.cos(l),u=Math.sin(l),f={};for(let[h,m]of Object.entries(t))f[h]=m.map(k=>{let y=k.x-r,b=k.y-a;return{x:r+p*y-u*b,y:a+u*y+p*b}});let g=0,w=0;for(let h of e.nodes)if(!E(h))for(let m of f[h.id]??[])m.y>a?g++:w++;if(w>g)for(let h of Object.values(f))for(let m of h)m.y=2*a-m.y;return f}var as=30;function oi(e,t){let{opts:n}=t,o=new Map(t.nodes.map(u=>[u.id,It(n,u.length)])),s=u=>o.get(u)??n.minimumNodeLength,r=e.nodes.filter(E).sort((u,f)=>u.stable.start-f.stable.start),a=new Map,i=0;for(let u of r)a.set(u.id,{x:i,y:0}),i+=s(u.id)+n.edgeLength;let c=ce(e),d=new Map(r.map(u=>[u.id,0])),l=r.map(u=>u.id);for(let u of l){let f=a.get(u),g=d.get(u)+1;for(let w of c.get(u)??[])d.has(w)||(d.set(w,g),a.set(w,{x:f.x+s(u)/2,y:as*g}),l.push(w))}let p=0;for(let u of e.nodes)a.has(u.id)||a.set(u.id,{x:p++*i/e.nodes.length,y:as*3});return a}function is(e,t){let n=oi(e,t);return t.nodes.map(o=>({...o,...n.get(o.id)}))}var ri=Math.PI/24;function cs(e,t){let n=e[t-1],o=e[t],s=e[t+1];if(!n||!s)return 0;let r=Math.abs(Math.atan2(s.y-o.y,s.x-o.x)-Math.atan2(o.y-n.y,o.x-n.x));return r>Math.PI?2*Math.PI-r:r}function si(e,t,n,o,s){let r=(g,w)=>Math.max(Math.hypot(w.x-g.x,w.y-g.y)**.5,1e-9),a=r(e,t),i=a+r(t,n),c=i+r(n,o),d=a+s*(i-a),l=(g,w,h,m)=>{let k=(d-h)/(m-h);return{x:g.x+(w.x-g.x)*k,y:g.y+(w.y-g.y)*k}},p=l(e,t,0,a),u=l(t,n,a,i),f=l(n,o,i,c);return l(l(p,u,0,i),l(u,f,a,c),a,i)}var ds=(e,t)=>({x:2*t.x-e.x,y:2*t.y-e.y});function us(e){if(e.length<3)return e;let t=[e[0]];for(let n=0;n+1<e.length;n++){let o=e[n],s=e[n+1],r=Math.ceil(Math.max(cs(e,n),cs(e,n+1))/ri),a=e[n-1]??ds(s,o),i=e[n+2]??ds(o,s);for(let c=1;c<r;c++)t.push(si(a,o,s,i,c/r));t.push(s)}return t}var ai=.5;function ps(e,t,n=new Set){let o=new Map(t.map(r=>[r.edgeIndex,`${Io}${r.edgeIndex}`])),s=[];return e.edges.forEach((r,a)=>{let i=o.get(a);if(!n.has(a))if(i===void 0)s.push(r);else{let{fromStrand:c,toStrand:d}=r;s.push({from:r.from,to:i,...c?{fromStrand:c}:{}},{from:i,to:r.to,...d?{toStrand:d}:{}})}}),{graph:{...e,nodes:[...e.nodes,...[...o.values()].map(r=>({id:r,name:r,length:0,depth:0}))],edges:s},routes:o,ids:new Set(o.values())}}function ls(e,t,n,o,s){let r=new Map(e.nodes.map(a=>[a.id,a.length]));return t.map(a=>{let i=a.bypassed.reduce((l,p)=>l+(r.get(p)??0),0),c=Math.max(s.minimumNodeLength,o(i)*ai),d=n.get(a.edgeIndex);return{id:d,name:d,length:Math.round(c*1e6/s.nodeLengthPerMegabase),depth:0}})}function ms(e,t){let n={...e},o={};for(let[s,r]of t){let a=n[r];delete n[r],a?.length&&(o[s]=a)}return{nodePositions:n,deletionRoutes:o}}function ii(e,t){let n=e.indexOf(":"),o=e.indexOf(":",n+1);if(n!==-1&&o!==-1){let s=e.slice(0,n),r=e.slice(n+1,o),a=e.slice(o+1);r==="i"||r==="f"?t[s]=+a:r==="Z"&&(t[s]=a)}}function nt(e){let t={};for(let n of e)ii(n,t);return t}function hs(e){let{SN:t,SO:n,SR:o}=e.tags;return typeof t=="string"&&typeof n=="number"&&typeof o=="number"?{refName:t,start:n,rank:o}:void 0}var fs=62,ci=60;function di(e){let t=[],n="+",o=0;function s(r){r>o&&t.push({id:e.slice(o,r),strand:n})}for(let r=0;r<e.length;r++){let a=e.charCodeAt(r);(a===fs||a===ci)&&(s(r),n=a===fs?"+":"-",o=r+1)}return s(e.length),t}function gs(e){let t={nodes:[],links:[],paths:[],walks:[],header:[],id:""};for(let n of e.split(`
2
- `)){let o=n.endsWith("\r")?n.slice(0,-1):n,s=o.split(" ",1)[0];if(s==="H"){let[,...r]=o.split(" ");t.header.push(nt(r))}else if(s==="S"){let[,r,...a]=o.split(" "),i,c,d,l=!1,p=a[0]??"*";/^\d+$/.test(p)?(i=+p,c=a[1]??"*",d=a.slice(2)):(l=!0,c=p,i=c==="*"?0:c.length,d=a.slice(1));let u=nt(d);l&&"LN"in u&&(i=+u.LN),t.nodes.push({id:r,length:i,sequence:c,tags:u})}else if(s==="E"){let[,,r,a,,,,,i,...c]=o.split(" ");r&&a&&t.links.push({source:r.slice(0,-1),target:a.slice(0,-1),strand1:r.at(-1),strand2:a.at(-1),cigar:i??"*",tags:nt(c)})}else if(s==="L"){let[,r,a,i,c,d,...l]=o.split(" ");r&&i&&c&&t.links.push({source:r,target:i,strand1:a,strand2:c,cigar:d??"*",tags:nt(l)})}else if(s==="W"){let[,r,a,i,c,d,l,...p]=o.split(" ");r&&a&&i&&c&&d&&l&&t.walks.push({sample:r,haplotype:+a,contig:i,start:c==="*"?-1:+c,end:d==="*"?-1:+d,segments:di(l),tags:nt(p)})}else if(s==="P"){let[,r,a,...i]=o.split(" ");r&&a&&t.paths.push({name:r,path:a,rest:i})}}return t}function ui(e){let t=new Map,n=new Map;function o(r,a){t.has(r)||t.set(r,a)}function s(r,a){let i=n.get(r);i===void 0&&o(r,a),n.set(r,(i??0)+1)}for(let r of e.links)o(r.source,r.strand1==="-"?"-":"+"),o(r.target,r.strand2==="-"?"-":"+");for(let r of e.paths)for(let a of r.path.split(","))s(a.slice(0,-1),a.endsWith("-")?"-":"+");for(let r of e.walks)for(let a of r.segments)s(a.id,a.strand==="-"?"-":"+");return{canonical:t,traversals:n}}var bs=e=>e.start===-1?0:e.start,pi=e=>e.strand==="+"||e.strand==="-";function li(e){return[...e.paths.map(t=>({...W(t.name),steps:t.path.split(",").map(n=>({id:n.slice(0,-1),strand:n.endsWith("-")?"-":"+"}))})),...e.walks.map(t=>({name:`${t.sample}#${t.haplotype}#${t.contig}`,start:bs(t),steps:t.segments.every(pi)?t.segments:t.segments.map(n=>({id:n.id,strand:n.strand==="-"?"-":"+"}))}))]}function mi(e){let t=e.tags.SM;if(typeof t!="string")return;let n=t.split(",").map(o=>o.trim()).filter(Boolean);return n.length>0?n:void 0}var ot=e=>typeof e=="number"&&e>0?e:void 0;function fi({tags:e,length:t}){let n=ot(e.RC)??ot(e.FC)??ot(e.KC);return ot(e.dp)??ot(e.DP)??(n!==void 0&&t>0?n/t:void 0)}function hi(e,t,n){return{id:`${e.id}${t}`,name:e.id,length:e.length,depth:n,stable:hs(e),samples:mi(e)}}function ws(e,t="Imported GFA"){let n=[],o=[],{canonical:s,traversals:r}=ui(e),a=new Map,i=m=>{let k=a.get(m);return k===void 0&&(k=`${m}${s.get(m)??"+"}`,a.set(m,k)),k},c=new Set;for(let m of e.nodes){if(c.has(m.id))continue;c.add(m.id);let k=fi(m)??Math.max(r.get(m.id)??1,1);n.push(hi(m,s.get(m.id)??"+",k))}for(let m of e.links)o.push({from:i(m.source),to:i(m.target),fromStrand:m.strand1==="-"?"-":"+",toStrand:m.strand2==="-"?"-":"+"});let d=[],l=new Map,p=(m,k)=>l.get(m)?.get(k);function u(m,k,y){let b=l.get(m);b||(b=new Map,l.set(m,b)),b.set(k,y)}let f=o.map(m=>{let k=p(m.from,m.to);return k||(k=new Set,u(m.from,m.to,k),u(m.to,m.from,k)),k});function g(m,k){for(let y=0;y<m.length-1;y++)p(m[y],m[y+1])?.add(k)}for(let m of e.paths){let k=m.path.split(",").map(y=>i(y.slice(0,-1)));d.push({name:m.name,nodeIds:k,start:W(m.name).start}),g(k,m.name)}for(let m of e.walks){let k=m.segments.map(b=>i(b.id)),y=`${m.sample}#${m.haplotype}#${m.contig}`;d.push({name:y,nodeIds:k,start:bs(m),sample:m.sample,haplotype:m.haplotype,contig:m.contig}),g(k,y)}o.forEach((m,k)=>{let y=f[k];y.size>0&&(m.pathIds=[...y])});let w=new Map(e.nodes.map(m=>[m.id,m.length])),h=e.paths.length>0||e.walks.length>0?Co(li(e),m=>w.get(m)??0):void 0;return{name:t,nodes:n,edges:o,paths:d.length>0?d:void 0,anchorPaths:h?.anchorPaths,pathVisits:h?.pathVisits,anchoredBy:n.some(m=>m.stable)?"tags":void 0}}function gi(e){let[t="",n="",...o]=e.split("#");return{sample:t,haplotype:n,contig:o.join("#")}}function bi(e,t,n,o){let s=new Int32Array(n+1);for(let c of e)s[c+1]++;for(let c=0;c<n;c++)s[c+1]+=s[c];let r=s.slice(0,n),a=new Int32Array(e.length);e.forEach((c,d)=>{a[r[c]++]=t[d]});let i=new Int32Array(o.length).fill(-1);return Array.from({length:n},(c,d)=>{let l=[];for(let p=s[d];p<s[d+1];p++){let u=a[p];i[u]!==d&&(i[u]=d,l.push(o[u]))}return l})}function Wn({nodes:e,links:t,walks:n},o="Imported GFA"){let s=e.names.length,r=e.lengths.length,a=new Uint8Array(s),i=(M,v)=>{a[M]===0&&(a[M]=v?2:1)};for(let M=0;M<t.from.length;M++)i(t.from[M],t.strands[M]&1),i(t.to[M],t.strands[M]&2);let c=[];for(let M=0;M<n.names.length;M++)n.offsets[M+1]>n.offsets[M]&&c.push(M);let d=new Int32Array(s);for(let M of c)for(let v=n.offsets[M];v<n.offsets[M+1];v++){let R=n.steps[v];d[R]===0&&i(R,n.reversed[v]),d[R]++}let l=e.names.map((M,v)=>`${M}${a[v]===2?"-":"+"}`),p=[];for(let M=0;M<r;M++){let v=e.refs[M];p.push({id:l[M],name:e.names[M],length:e.lengths[M],depth:Math.max(d[M],1),stable:v<0?void 0:{refName:e.refNames[v],start:e.starts[M],rank:e.ranks[M]},samples:void 0})}let u=[],f=new Array(s),g=(M,v)=>{let R=f[M];if(R){for(let O=0;O<R.length;O+=2)if(R[O]===v)return R[O+1]}},w=(M,v,R)=>{let O=f[M];O?O.push(v,R):f[M]=[v,R]},h=[],m=0;for(let M=0;M<t.from.length;M++){let v=t.from[M],R=t.to[M];u.push({from:l[v],to:l[R],fromStrand:t.strands[M]&1?"-":"+",toStrand:t.strands[M]&2?"-":"+"});let O=g(v,R);O===void 0&&(O=m++,w(v,R,O),w(R,v,O)),h.push(O)}let k=new Int32Array(s+1);for(let M=0;M<s;M++)k[M+1]=k[M]+(f[M]?.length??0)/2;let y=new Int32Array(k[s]),b=new Int32Array(k[s]);f.forEach((M,v)=>{for(let R=0;R<M.length;R+=2)y[k[v]+R/2]=M[R],b[k[v]+R/2]=M[R+1]});let x=(M,v)=>{for(let R=k[M];R<k[M+1];R++)if(y[R]===v)return b[R];return-1},S=new Map,P=[],I=new Int32Array(n.offsets[n.names.length]??0),V=new Int32Array(I.length),_=0,B=new Int32Array(m).fill(-1),j=[],X=[],T=n.offsets[n.names.length]??0,N=new Int32Array(T),C=new Float64Array(T),$=new Uint8Array(T),F=new Int32Array(s).fill(-1),Y=[],A=[0],D=[];for(let M of c){let{sample:v,haplotype:R,contig:O}=gi(n.names[M]),z=`${v}#${+R}#${O}`,ne=S.get(z);ne===void 0&&(ne=P.length,S.set(z,ne),P.push(z),D.push(Re(z)));let ve=n.starts[M],$a=D[ne],sn=n.offsets[M],vo=new Array(n.offsets[M+1]-sn),an=ve,cn=-1;for(let He=sn;He<n.offsets[M+1];He++){let ee=n.steps[He];vo[He-sn]=l[ee],F[ee]===-1&&(F[ee]=A.at(-1),A.push(F[ee]+d[ee]),Y.push(ee));let dn=F[ee]++;if(N[dn]=ne,C[dn]=an,$[dn]=n.reversed[He],an+=ee<r?e.lengths[ee]:0,cn>=0){let bt=x(cn,ee);bt>=0&&B[bt]!==M&&(B[bt]=M,I[_]=bt,V[_++]=ne)}cn=ee}j.push({name:z,nodeIds:vo,start:ve,sample:v,haplotype:+R,contig:O}),X.push({name:z,sample:$a,start:ve,length:an-ve})}let ae=bi(I.subarray(0,_),V,m,P);u.forEach((M,v)=>{let R=ae[h[v]];R.length>0&&(M.pathIds=R)});let U=c.length>0;return{name:o,nodes:p,edges:u,paths:U?j:void 0,anchorPaths:U?X:void 0,pathVisits:U?new Oo({segments:Y.map(M=>e.names[M]),offsets:Int32Array.from(A),path:N.subarray(0,A.at(-1)),start:C.subarray(0,A.at(-1)),reversed:$.subarray(0,A.at(-1)),paths:P,samples:D}):void 0,anchoredBy:p.some(M=>M.stable)?"tags":void 0}}function wi(e,t){if(typeof e!="string")return Wn(e,t);let n=Po(e);return n?Wn(n,t):ws(gs(e),t)}function yi(e,t,n={}){let o=Go(wi(e,t),n.referencePath);if(o.nodes.length===0)throw new Error(`No graph segments in ${t}`);if(n.maxNodes!==void 0&&o.nodes.length>n.maxNodes)throw new Error(`Graph too large to draw: ${o.nodes.length.toLocaleString()} nodes (limit ${n.maxNodes.toLocaleString()}). Zoom in to a smaller region, or raise maxGraphNodes on this view.`);return o}var re={engine:"fmmm",quality:2,linearLayout:!1,bubbleSpread:"auto",spacing:1,componentSeparation:1,showDeletionEdges:!0};function ki(e={}){return{engine:e.engine??re.engine,quality:e.quality??re.quality,linearLayout:e.linearLayout??re.linearLayout,bubbleSpread:e.bubbleSpread??re.bubbleSpread,spacing:e.spacing??re.spacing,componentSeparation:e.componentSeparation??re.componentSeparation,showDeletionEdges:e.showDeletionEdges??re.showDeletionEdges}}var xi=15;function ys(e,t,n){let o=e.nodes.some(E),s={...t,opts:{...t.opts,edgeLength:t.opts.edgeLength*(n.spacing??1)}};return{graph:{nodes:o?is(e,s):s.nodes,edges:e.edges},options:{quality:n.quality,linearLayout:n.linearLayout,...s.opts,componentSeparation:xi*(n.componentSeparation??1),...o?{rotateComponents:!1}:{},engine:n.engine??"fmmm"}}}function Xt(e,t){let n=e.nodes.some(E);return`${t.engine??"fmmm"}|${t.quality}|${t.linearLayout}|${t.bubbleSpread}|${t.spacing??1}|${t.componentSeparation??1}|${t.showDeletionEdges!==!1}|${n}|${e.referencePath??""}`}async function Xn(e,t,n){let o=or(t.bubbleSpread),{shown:s,hidden:r}=ge(e,he(e),t.showDeletionEdges!==!1),a=ps(e,s,r),i=Do(a.graph,a.ids),c={...i.graph,nodes:i.graph.nodes.filter(k=>!a.ids.has(k.id))},d=An(c,o),{result:l,duration:p}=await n(ys(i.graph,{...d,nodes:[...d.nodes,...ls(e,s,a.routes,tr(c,o),d.opts)]},t)),u=An(e,o),f=new Map(u.nodes.map(k=>[k.id,It(u.opts,k.length)])),g=Object.fromEntries(Object.entries(l.nodePositions).map(([k,y])=>[k,us(y)])),w=Ho(g,i.runs,k=>f.get(k)??0),{nodePositions:h,deletionRoutes:m}=ms(e.nodes.some(E)?ss(e,w):w,a.routes);return{result:{...l,nodePositions:h,stranded:!0,...s.length?{deletionRoutes:m,extent:Vn(m)}:{}},duration:p}}function Vn(e){let t=1/0,n=1/0,o=-1/0,s=-1/0;for(let r of Object.values(e))for(let a of r)t=Math.min(t,a.x),n=Math.min(n,a.y),o=Math.max(o,a.x),s=Math.max(s,a.y);return{minX:t,minY:n,maxX:o,maxY:s}}var G=40,Mi=1e-6,Si=100;function Vt(e){return Math.max(Mi,Math.min(Si,e))}function ks(e,t,n,o=G){let s=t-e.h*n;return o-e.minY*n+Math.max(0,s)/2}function $e(e,t,n,o,{minScale:s=0,padLeft:r=G,padTop:a=G,padRight:i=G,padBottom:c=G}={}){let d=t-r-i,l=n-a-c;if(d<=0||l<=0||!(e.w>0||!o&&e.h>0))return;let p=e.w>0?d/e.w:1/0,u=e.h>0?l/e.h:1/0,f=Vt(Math.max(s,o?p:Math.min(p,u))),g=d-e.w*f;return{scale:f,translateX:r-e.minX*f+Math.max(0,g)/2,translateY:ks(e,l,o?1:f,a)}}function rt(e,t={}){let{minX:n,minY:o,maxX:s,maxY:r}=Vn(e.nodePositions),{region:a}=t;e.referenceAxis&&a&&a.end>a.start&&(n=a.start,s=a.end);let i=t.extent??e.extent;return i&&(n=Math.min(n,i.minX??n),o=Math.min(o,i.minY??o),s=Math.max(s,i.maxX??s),r=Math.max(r,i.maxY??r)),{minX:n,minY:o,w:s-n,h:r-o}}function ke(e,t){return{scaleX:e,scaleY:t?1:e,pixelRows:t}}function jn(e,t,n,o){return{minX:-e.translateX/t.scaleX,minY:-e.translateY/t.scaleY,maxX:(n-e.translateX)/t.scaleX,maxY:(o-e.translateY)/t.scaleY}}function Yn(e,t){let n=(e.maxX-e.minX)*t,o=(e.maxY-e.minY)*t;return{minX:e.minX-n,minY:e.minY-o,maxX:e.maxX+n,maxY:e.maxY+o}}function vi(e,t){return t.minX>=e.minX&&t.maxX<=e.maxX&&t.minY>=e.minY&&t.maxY<=e.maxY}function Ri(e,t,n,o,s){let r=Vt(e.scale*t),a=r/e.scale;return{scale:r,translateX:n-(n-e.translateX)*a,translateY:s?e.translateY:o-(o-e.translateY)*a}}function st(e,t,n={}){return{nodePositions:n.drawsRows?{}:e.nodePositions,deletions:t.bypassed,deletionRoutes:e.deletionRoutes,stranded:e.stranded,hiddenEdges:t.hidden}}var xs=(e,t)=>!!e.referencePath&&W(t).name===e.referencePath;function Li(e,t){return(e.paths??[]).filter(n=>n.name===t).sort((n,o)=>(n.start??0)-(o.start??0))}function Ms(e,t){let n=Li(e,t),o=n[0];if(!o)return;let s=new Map(e.nodes.map(y=>[y.id,y])),r=new Map;e.edges.forEach((y,b)=>{r.set(`${y.from}>${y.to}`,b)});let a=y=>s.get(y)?.length??0,i=y=>y.nodeIds.reduce((b,x)=>b+a(x),0),c=n.reduce((y,b)=>y+i(b),0),d=y=>{let b=Math.min(...y.map(x=>x.start??1/0));return Number.isFinite(b)?{start:b,end:Math.max(...y.map(x=>(x.start??0)+i(x)))}:void 0},l=d(n),p=l&&{contig:o.contig??Le(W(t).name),...l},u=p?p.end-p.start:c,f=new Set,g=new Set,w=new Map,h=0;for(let y of n)p&&(h=Math.max(h,(y.start??0)-p.start)),y.nodeIds.forEach((b,x)=>{if(f.add(b),x>0){let P=y.nodeIds[x-1],I=r.get(`${P}>${b}`)??r.get(`${b}>${P}`);I!==void 0&&g.add(I)}let S=a(b);w.has(b)||w.set(b,u>0?(h+S/2)/u:0),h+=S});let m=xs(e,t),k=()=>{let y=m?[]:(e.paths??[]).filter(x=>xs(e,x.name));if(y.length===0)return;let b=d(y);return b?b.end-b.start:y.reduce((x,S)=>x+i(S),0)};return{name:t,reference:m,range:p,nodeIds:f,edgeIndexes:g,progress:w,steps:n.reduce((y,b)=>y+b.nodeIds.length,0),bp:c,referenceBp:k()}}function Ss(e,t,n,o){let s=new Map(e.nodes.map(a=>[a.id,a])),r=new Map;for(let[a,i]of t.progress){let c=s.get(a),d=o?.midpoints.get(a),l=n.field==="progress"?i:o&&d!==void 0&&!(c?.stable&&c.stable.rank>0)?(d-o.start)/o.span:void 0;r.set(a,rr(n,l))}return r}function Ni(e,t){let n=new Set,o=0,s=e.referencePath;if(!s||t.reference)return{reversed:n,bp:o};let r=e.pathVisits;if(!r)return{reversed:n,bp:o};let a=r.pathIndex(W(t.name).name),i=r.pathIndex(s),c=new Map(e.nodes.map(d=>[d.id,d]));for(let d of t.progress.keys()){let l=c.get(d),p=l?r.slot(l.name):-1,u=p<0?-1:r.firstBy(p,a),f=p<0?-1:r.firstBy(p,i);u>=0&&f>=0&&r.reversed[u]!==r.reversed[f]&&(n.add(d),o+=l.length)}return{reversed:n,bp:o}}function at(e,t,n){let o=new Set,s=t.filter(i=>!o.has(i.walk)&&o.add(i.walk)).flatMap(i=>{let c=Ms(e,i.walk);return c?[{walk:c,layer:i}]:[]}).sort((i,c)=>Number(c.walk.reference)-Number(i.walk.reference));if(s.length===0)return;let r=0,a=s.map(({walk:i,layer:c})=>{let d=Tn(c,i.reference,i.reference?0:r++,s.length===1),{reversed:l,bp:p}=Ni(e,i);return{...i,encoding:d,colors:Ss(e,i,d,n),reversed:l,reversedBp:p}});return vs(a,n)}var Pi={field:"progress",scheme:"red"};function it(e,t,n,o){return t.walks.map(s=>{let r=n.find(i=>i.walk===s.name)?.color,a=Tn({walk:s.name,color:{...Pi,...r}},s.reference,0);return vs([{...s,encoding:a,colors:Ss(e,s,a,o)}],o)})}function vs(e,t){return{walks:e,referenceDomain:t?{start:t.start,end:t.start+t.span}:void 0,nodeIds:new Set(e.flatMap(n=>[...n.nodeIds])),edgeIndexes:new Set(e.flatMap(n=>[...n.edgeIndexes])),names:new Set(e.map(n=>n.name))}}var xe={...re,colorScheme:"auto",nodeWidth:"depth",contigThickness:6,connectorThickness:2};function Un(e){let t=xe,n={};for(let[o,s]of Object.entries(e))s!==void 0&&s!==t[o]&&(n[o]=s);return n}var Rs=[{value:"auto",label:"Auto"},{value:"uniform",label:"Uniform"},{value:"random",label:"Random"},{value:"rainbow",label:"Rainbow"},{value:"depth",label:"Depth"},{value:"node-length",label:"Node length"},{value:"stable-rank",label:"Stable rank"},{value:"reference-position",label:"Reference position"},{value:"grey",label:"Grey"}],Ai=Rs.map(e=>e.value);function ct(e,t){return e!=="auto"?e:t?.anchoredBy?"reference-position":"uniform"}function Ls(e,t,n){let o=n.region,s=n.colorDomain??o,r=n.walkRows,a=rt(t,{region:n.fitToDrawing?void 0:o,extent:r&&t.extent?Ge(r,n.walkRowPitch):void 0}),i=new Map(e.nodes.map(b=>[b.id,b])),c=ct(n.colorScheme??xe.colorScheme,e),d=c==="reference-position"&&!t.tubeMap?Ee(e,s):void 0,l=ge(e,t.tubeMap?[]:he(e),n.showDeletionEdges),p=n.walks??[],u=p.some(b=>b.color?.field==="reference")?d??Ee(e,s):void 0,f=p.length>0&&!t.tubeMap?at(e,p,u):void 0,g=Tt(n.facet),w=g.field&&f&&f.walks.length>1?it(e,f,p,u):void 0,h=xt(e.paths?.length?ze(e.paths):[]),m=n.referenceName??fn(e,o),k=n.contigThickness??xe.contigThickness,y=n.nodeWidth??xe.nodeWidth;return{bounds:a,nodeById:i,colorScheme:c,referenceRamp:d,drawnDeletions:l,layers:p,lift:f,facet:g,panels:w,labelOf:b=>h.get(b)??b,referenceName:m,reference:f?.referenceDomain&&{...f.referenceDomain,name:m},contigThickness:k,nodeWidth:y,geometry:(b,x)=>vt({...st(t,l,{drawsRows:!!r}),graph:e,nodeById:i,colorScheme:c,contigThickness:k,connectorThickness:n.connectorThickness??xe.connectorThickness,drawPaths:!1,nodeWidth:y,linearLayout:n.linearLayout,highlight:b,axis:x,referenceRamp:d})}}var Kn='font-family="Helvetica, Arial, sans-serif" font-size="11"',Ti=48,jt=18,Ei=16,Ii=22,Bi="rgb(160,160,160)",Ps="#1c1c22";function zn(e,t,n,o,s,r,a,i=1){let c=o.length>1?Ti:jt,d=o.length>1?`fill="url(#${e})"`:`fill="${o[0].color}"${i<1?` fill-opacity="${i}"`:""}`,l=o.length>1?`<linearGradient id="${e}">${o.map(u=>`<stop offset="${u.offset}" stop-color="${u.color}"/>`).join("")}</linearGradient>`:"";return{width:Math.max(c+5+(s.length+r.length)*Pe,(a?.length??0)*Pe),markup:`${l}<g transform="translate(${t} ${n})" ${Kn}><rect y="5" width="${c}" height="8" rx="2" ${d}/><text x="${c+5}" y="13"><tspan font-weight="bold">${de(s)}</tspan>${de(r)}</text>${a?`<text y="28">${de(a)}</text>`:""}</g>`}}function Oi(e,t){return{width:jt+5+4*Pe,markup:`<g transform="translate(${e} ${t})" ${Kn}><rect x="1" y="4" width="${jt-2}" height="10" rx="4" fill="none" stroke="${Bn}" stroke-width="2"/><text x="${jt+5}" y="13">exon</text></g>`}}function Ns(e,t,n,o,s,r){let a=gr(o,r);return zn(e,t,n,En(o.encoding),s,a.delta+a.outside+a.reversed,a.scale)}function Ci(e,t){return e.replaceAll(/([ML])(-?[\d.e-]+),(-?[\d.e-]+)/g,(n,o,s,r)=>`${o}${+(Number(s)*t.scaleX+t.translateX).toFixed(1)},${+(Number(r)*t.scaleY+t.translateY).toFixed(1)}`)}function Gi(e,t,n,o,s){return`<rect x="${e-n/2}" y="${t-Ye-Mn+2}" width="${n}" height="${Ye+Mn*2-2}" rx="3" fill="#fff" fill-opacity="0.85" stroke="${Bn}"/><text x="${e}" y="${t}" font-family="Helvetica, Arial, sans-serif" font-size="${Ye}" fill="${Ps}" text-anchor="middle"><tspan font-style="italic" font-weight="600">${de(o)}</tspan>${s?de(s):""}</text>`}function qn(e,t,n={}){let o=n.width??1200,s=n.height??800,r=n.walkRows,{bounds:a,nodeById:i,referenceRamp:c,layers:d,lift:l,facet:p,panels:u,labelOf:f,referenceName:g,reference:w,contigThickness:h,nodeWidth:m,geometry:k}=Ls(e,t,n),y=t.pixelRows??!1,b=c&&{start:c.start,end:c.start+c.span},x=n.genes?.length&&!t.tubeMap&&!r?tt(e,n.genes,t.nodePositions):[],S=Mt(e,i,h,m),P=0;function I(T,N,C,$){let F=[],Y=pr(ur(x,S.halfWidthPx,T,U=>Ci(U,N)),{id:`exons${P++}`,width:C,height:$});Y&&F.push(be(Y));let A=U=>({x:U.x*N.scaleX+N.translateX,y:U.y*N.scaleY+N.translateY}),D={width:C,height:$};for(let{item:U,x:M,y:v,w:R,text:O}of Fo(mr(x,A,h,lr(t.nodePositions,N)),D,$o(D))){let z=A(U.at).y+h/2;F.push(`<line x1="${M}" x2="${M}" y1="${v-Ye-2}" y2="${z}" stroke="${Ps}" stroke-width="0.8" stroke-opacity="0.6"/>`,Gi(M,v,R,U.gene.name,O.slice(U.gene.name.length)))}r&&F.push(be(Nn(r,{...N,width:C,height:$,...n.walkRowPitch},{ramp:b,rowGenes:n.rowGenes})));let ae=_e(r,t,n.walkRowPitch);for(let{label:U,y:M}of ae){let v=M*N.scaleY+N.translateY;v>=0&&v<=$&&F.push(`<text x="6" y="${v+4}" ${Kn} stroke="#fff" stroke-width="3" paint-order="stroke">${de(U)}</text>`)}return F.join("")}function V(T,N,C){let $=$e(a,N,C,y,u?{padLeft:oe,padTop:oe,padRight:oe,padBottom:oe}:{});if(!$)return"";let F=ke($.scale,y),{canvas:Y,markup:A}=cr(N,C),D=new dr(Y);D.uploadGeometry(k(T,F));let ae={scaleX:F.scaleX,scaleY:F.scaleY,translateX:$.translateX,translateY:$.translateY};return D.updateTransform({...ae,dpr:1}),D.render([1,1,1,1]),A()+I(T,ae,N,C)}let _=[],B;if(u){let T=Et(u.map(C=>C.walks[0].name),p.field||"walk",p.domain),N=At({count:T.count,bounds:a,pixelRows:y,width:o,room:s,columns:T.columns??p.columns});u.forEach((C,$)=>{let F=T.cells[$],Y=F%N.columns*(N.width+Je),A=Math.floor(F/N.columns)*(N.height+Pt+Je),D=C.walks[0];_.push(Ns(`key${$}`,Y+6,A+2,D,f(D.name),w).markup,`<svg x="${Y}" y="${A+Pt}" width="${N.width}" height="${N.height}">${V(C,N.width,N.height)}</svg>`)}),B=N.total}else{let T=6,N=A=>{_.push(A.markup),T+=A.width+Ei};if(l&&(l.walks.forEach((A,D)=>{N(Ns(`key${D}`,T,2,A,f(A.name),w))}),N(zn("faded",T,2,[{offset:0,color:Bi}],"",`not on ${l.walks.length===1?f(l.walks[0].name):"these walks"}`,void 0,.3))),r){let A=Ln(Rn(r,{ramp:b,genes:n.rowGenes?.size?n.rowGeneGaps:void 0}),T,2,"rows-key");N({width:A.width,markup:be(A.tree)})}else!l&&c&&N(zn("ramp",T,2,En({field:"reference",scheme:"rainbow"}),g?`${g} position`:"Reference position","",hr(g,c.start,c.start+c.span)));x.some(A=>A.exonsByNode.length>0)&&N(Oi(T,2));let C=_.length>0?Pt:0,$=o-2*G,F=y||!(a.w>0)?a.h:a.h*$/a.w,Y=Math.max(160,Math.min(s-C,Math.ceil(F+2*G)));_.push(`<svg y="${C}" width="${o}" height="${Y}">${V(l,o,Y)}</svg>`),B=C+Y}let j=n.walkStrip;if(j&&!r&&!t.tubeMap){let T=et(j.rows,{width:o}),N=Ln(Rn(j.rows,{ramp:b,genes:Hn(T,j.rowGenes,j.rowGeneGaps)}),6,B+T.height,"strip-key");_.push(`<line x1="0" x2="${o}" y1="${B+.5}" y2="${B+.5}" stroke="#ddd"/>`,`<svg y="${B}" width="${o}" height="${T.height}">${be(Nn(j.rows,T,{ramp:b,rowGenes:j.rowGenes,idPrefix:"strip"}))}${be(Dn(j.rows,T,new Set(d.map(C=>C.walk))))}</svg>`,be(N.tree)),B+=T.height+Ii}let X=JSON.stringify({generator:`@jbrowse/bandage-core@${rs}`,...n.spec===void 0?{}:{spec:n.spec}});return`<svg xmlns="http://www.w3.org/2000/svg" width="${o}" height="${B}" viewBox="0 0 ${o} ${B}"><metadata>${de(X)}</metadata><rect width="${o}" height="${B}" fill="#fff"/>${_.join("")}</svg>
3
- `}var _i=1,$i=.015;function Yt({graph:e,span:t,rowY:n,positions:o}){let s=t*$i,r=qo(e),a=new Map(e.nodes.map(l=>[l.id,l])),i=[];for(let l of r){let p=l.refSpan-l.pathLength;p>=_i&&i.push({nodeIds:l.nodeIds,bp:p});let u=Math.max(l.refSpan,s),f=l.pathLength>0?u/l.pathLength:0;l.nodeIds.forEach((g,w)=>{let h=a.get(g);if(h){let m=l.nodeOffsets[w],k=u/l.nodeIds.length,y=x=>l.start+x*f,b=n(h);o[g]=f?[{x:y(m),y:b},{x:y(m+h.length),y:b}]:[{x:l.start+w*k,y:b},{x:l.start+(w+1)*k,y:b}]}})}let c=ce(e),d=Object.keys(o);for(let l of d){let p=o[l].at(-1).x;for(let u of c.get(l)??[]){let f=a.get(u);if(f&&!(u in o)){let g=n(f);o[u]=[{x:p,y:g},{x:p+s,y:g}],d.push(u)}}}return i}function Fi(e,t){let n=new Map;for(let s of e.nodes)if(Xe(s)){let{sample:r}=Nt(s.stable.refName);n.set(r,(n.get(r)??0)+s.length)}let o=new Map(t.map((s,r)=>[s,r]));return[...n.keys()].sort((s,r)=>(o.get(s)??1/0)-(o.get(r)??1/0)||n.get(r)-n.get(s)||s.localeCompare(r))}function As(e,t,n=[]){let o=ie(e),s=Fi(e,n);if(o.length===0||s.length===0)return;let r=Ve(o,t),a=new Map(s.map((u,f)=>[u,f+1])),i=me(o),c=s.length+1,d=Yt({graph:e,span:r,rowY:u=>{let f=u.stable;return((f?a.get(Nt(f.refName).sample):void 0)??c)*te},positions:i}),p=[{label:Nt(o[0].stable.refName).sample,y:0},...s.map(u=>({label:u,y:a.get(u)*te}))];return{nodePositions:i,rowLabels:p,sampleRows:s,referenceAxis:!0,pixelRows:!0,alleleDeletions:d}}function Di(e){let t=new Map(e.nodes.map(s=>[s.id,s])),n=e.pathVisits,o=n?.replay();return(e.paths??[]).map(s=>{let r=n?.pathIndex(W(s.name).name)??-1;return s.nodeIds.flatMap(a=>{let i=t.get(a);if(!i)return[];let c=n&&o?o(n.slot(i.name),r):-1;return[{node:i,strand:c>=0?n.strand(c):Jo(i)}]})})}function Hi(e){let t=Di(e),n=(e.paths??[]).flatMap((s,r)=>{let a=t[r].map(i=>Zo(i.node,i.strand));return a.length>0?[{id:r,name:s.name,sequence:a,sourceTrackID:0,type:"haplotype",...s.members?{freq:s.members.length}:{}}]:[]}),o=n.findIndex(s=>W(s.name).name===e.referencePath);return o>0&&n.unshift(...n.splice(o,1)),n}function Wi(e){return e.nodes.map(t=>({name:t.id,seq:"",sequenceLength:Math.max(1,t.length)}))}function dt(e){return(e.paths?.length??0)>0}var Xi=600,Vi=3,ji=15;function Yi(e){return Math.max(Vi,Math.min(ji,Math.floor(Xi/Math.max(1,e))))}function Ui(e){let t=new Set,n=new Set;for(let o of e?.sequence??[])Pn(o)?n.has(qe(o))||t.add(qe(o)):n.add(o);return t}function zi(e,t,n){let o=Ui(n[0]),s=new Map;for(let{sequence:c,is_secondary:d}of n)d||c.forEach((l,p)=>{let u=qe(l),g=Pn(l)!==o.has(u)?c[p+1]:c[p-1];!t.nodeMap.has(u)&&g!==void 0&&s.set(u,qe(g))});let r=new Map(e.nodes.map(c=>[c.id,Math.max(1,c.length)])),a=new Map([...s].map(([c,d])=>[d,c])),i=new Map;for(let c of a.keys()){let d=t.nodeMap.get(c);if(d!==void 0){let l=[c];for(let u=a.get(c);u!==void 0;u=a.get(u))l.push(u);l.reduce((u,f)=>u+(r.get(f)??0),0)===t.nodes[d].sequenceLength&&i.set(c,l)}}return{members:i,flipped:o}}var Ki={start:"end",end:"start"},Ts={"+":"-","-":"+"};function qi(e,{members:t,flipped:n}){if(t.size===0)return e;let o=new Map(e.nodes.map(u=>[u.id,u])),s=new Map,r=new Set,a=(u,f)=>n.has(u)?Ki[f]:f;for(let[u,f]of t)f.forEach((g,w)=>{s.set(g,u);let h=f[w+1];h!==void 0&&r.add(`${g}:${a(g,"end")} ${h}:${a(h,"start")}`)});let i=new Set([...s].filter(([u,f])=>u!==f).map(([u])=>u)),c=e.nodes.flatMap(u=>{let f=t.get(u.id);if(!f)return i.has(u.id)?[]:[u];let g=f.map(h=>o.get(h)),w=g.flatMap(h=>h.stable?[h.stable.start]:[]);return[{...u,length:g.reduce((h,m)=>h+m.length,0),stable:u.stable&&{...u.stable,start:Math.min(...w)}}]}),d=(u,f,g)=>a(f,a(u,g))==="end"?kt(f):Ts[kt(f)],l=e.edges.flatMap(u=>{let f=fe(u),g=`${u.from}:${f.from}`,w=`${u.to}:${f.to}`;if(r.has(`${g} ${w}`)||r.has(`${w} ${g}`))return[];let h=s.get(u.from),m=s.get(u.to);return[{...u,...h===void 0?{}:{from:h,fromStrand:d(u.from,h,f.from)},...m===void 0?{}:{to:m,toStrand:Ts[d(u.to,m,f.to)]}}]}),p=new Set([...i].map(u=>o.get(u)?.name??u));return{...e,nodes:c,edges:l,paths:e.paths?.map(u=>({...u,nodeIds:u.nodeIds.filter(f=>!i.has(f))})),pathVisits:e.pathVisits?.filter(()=>!0,u=>!p.has(u))}}function Es(e){let t=e.paths??[],n=Hi(e),o=e.reads?Qo(e,e.reads,t.length):[],s=o.length>0?Vo:Xo,r=t.map((l,p)=>s(p,t.length)),a=t.some(l=>l.members),i=t.reduce((l,p)=>l+(p.members?.length??1),0),c=er(Wi(e),n,o,{nodeWidthOption:"compressed",trackWidth:Yi(a?i:n.length),...a?{freqWidth:"linear"}:{}});if(!c)return;let d=zi(e,c,[...n,...o]);return{layout:c,pathColors:r,members:d.members,graph:qi(e,d)}}function Jn(e){let t=[];return e.nodes.forEach(n=>{n.order>=0&&t.push(n)}),t}function Is(e,t,n,o){let s=e.y+e.contentHeight/2-t;return[{x:n,y:s},{x:o,y:s}]}function Bs(e,t){return{minY:e.bounds.minY-t,maxY:e.bounds.maxY-t}}function Os(e){let t=dt(e)?Es(e):void 0;if(!t)return;let{layout:n,...o}=t,s=n.bounds.minY,r={};for(let c of Jn(n))r[c.name]=Is(c,s,c.x,c.x+c.pixelWidth);let{minY:a,maxY:i}=Bs(n,s);return{nodePositions:r,tubeMap:{layout:n,yOffset:s,...o},extent:{minX:n.bounds.minX,maxX:n.bounds.maxX,minY:a,maxY:i}}}function Ji(e,t){let n=new Map(e.nodes.map(i=>[i.id,i])),o=new Map;for(let i of Jn(t)){let c=o.get(i.order);c?c.push(i):o.set(i.order,[i])}let s=[],r=-1/0;for(let i of[...o.keys()].sort((c,d)=>c-d)){let c=o.get(i),d=1/0,l=-1/0;for(let p of c){let u=n.get(p.name);u&&E(u)&&(d=Math.min(d,u.stable.start),l=Math.max(l,u.stable.start+u.length))}d===1/0&&(d=l=r),d<r&&(d=r,l=Math.max(r,l)),r=Math.max(r,l),s.push({order:i,x0:Math.min(...c.map(p=>p.x)),x1:Math.max(...c.map(p=>p.x+p.pixelWidth)),bp0:d,bp1:l})}let a=s.find(i=>i.bp0!==-1/0);for(let i of s)i.bp0===-1/0&&(i.bp0=i.bp1=a?.bp0??0);return s}function Ut(e){return dt(e)&&e.nodes.some(E)}function Cs(e){let t=Ut(e)?Es(e):void 0;if(!t)return;let{layout:n,...o}=t,s=Ji(o.graph,n),r=new Map(s.map(c=>[c.order,c])),a=n.bounds.minY,i={};for(let c of Jn(n)){let d=r.get(c.order);i[c.name]=Is(c,a,d.bp0,d.bp1)}return{nodePositions:i,tubeMap:{layout:n,yOffset:a,columns:s,...o},referenceAxis:!0,pixelRows:!0,extent:Bs(n,a)}}function Zi(e){let t=new Set;for(let n of e.nodes)n.stable&&t.add(n.stable.rank);return new Map([...t].sort((n,o)=>n-o).map((n,o)=>[n,o]))}function Gs(e,t){let n=ie(e);if(n.length===0)return;let o=Ve(n,t),s=Zi(e),r=me(n),a=Yt({graph:e,span:o,rowY:c=>(c.stable?s.get(c.stable.rank)??s.size:s.size)*te,positions:r}),i=[...s].map(([c,d])=>({label:c===0?"Reference (rank 0)":`Rank ${c}`,y:d*te}));return{nodePositions:r,rowLabels:i,referenceAxis:!0,pixelRows:!0,alleleDeletions:a}}var Qi=12,Zn=te;function _s(e){return 10+8*Math.log2(1+e.length)}function pe(e,t){return e<t?-1:e>t?1:0}function Fs(e,t){return pe(e.at,t.at)||pe(e.side,t.side)||pe(e.hops,t.hops)}var $s={at:1/0,side:0,hops:0};function Qn(e){let t=new Map(e.nodes.map(o=>[o.id,o])),n=nc(e);return e.nodes.map(o=>o.id).sort((o,s)=>Fs(n.get(o)??$s,n.get(s)??$s)||pe(t.get(o).name,t.get(s).name)||pe(o,s))}function ec(e,t){let n=new Set(e.nodes.map(l=>l.id)),o=new Map(t.map(l=>[l.id,l.stable.start])),s=new Map,r=new Map;t.forEach((l,p)=>{r.set(l.id,t[p-1]?.id),s.set(l.id,t[p+1]?.id)});let a=t[0]?.id,i=(l,p)=>{let u=s.get(l);s.set(l,p),r.set(p,l),s.set(p,u),u!==void 0&&r.set(u,p)},c=(l,p)=>{let u=r.get(l);u===void 0?(a=p,r.set(p,void 0),s.set(p,l),r.set(l,p)):i(u,p)};for(let l of e.paths??[]){let p=0,u=0,f;for(let m of l.nodeIds){let k=o.get(m);k!==void 0&&(f!==void 0&&k!==f&&(k>f?p++:u++),f=k)}let g=u>p?[...l.nodeIds].reverse():l.nodeIds,w,h=new Set;for(let m of g)if(s.has(m)){if(w===void 0)for(let k of h)c(m,k);w=m}else n.has(m)&&(w===void 0?h.add(m):(i(w,m),w=m))}let d=[];for(let l=a;l!==void 0;l=s.get(l))d.push(l);return d}function tc(e,t){let n=[...t.entries()].sort(([a,i],[c,d])=>Fs(i,d)||pe(a,c)).map(([a])=>a),o=n.length;for(let a of n){let i=t.get(a);for(let c of e.get(a)??[])t.has(c)||(t.set(c,{at:i.at,side:1,hops:i.hops+1}),n.push(c))}let s=new Set(n.slice(o)),r=new Set;for(let a of s){if(r.has(a))continue;let{at:i}=t.get(a),c=[a];r.add(a);let d=!0;for(let l of c){let{hops:p}=t.get(l),u=!0,f=!1;for(let g of e.get(l)??[]){let w=t.get(g);w.at===i&&s.has(g)?(u&&=w.hops<=p,r.has(g)||(r.add(g),c.push(g))):w.at!==i&&(f||=w.at<i,d&&=w.at<i)}d&&=!u||f}if(d)for(let l of c){let p=t.get(l);t.set(l,{...p,side:-1,hops:-p.hops})}}}function nc(e){let t=new Set(e.nodes.map(r=>r.id)),n=new Map;for(let r of e.edges)!t.has(r.from)||!t.has(r.to)||((n.get(r.from)??n.set(r.from,[]).get(r.from)).push(r.to),(n.get(r.to)??n.set(r.to,[]).get(r.to)).push(r.from));let o=e.nodes.filter(E).sort((r,a)=>pe(r.stable.start,a.stable.start)||pe(r.name,a.name)),s=new Map;return ec(e,o).forEach((r,a)=>{s.set(r,{at:a,side:0,hops:0})}),tc(n,s),s}function oc(e){let t=new Map(e.nodes.map(p=>[p.id,p])),n=Qn(e),o=new Map(n.map((p,u)=>[p,u])),s=p=>E(t.get(p)),r=new Map(n.map(p=>[p,[]])),a=new Map(n.map(p=>[p,[]])),i=(p,u)=>{r.get(u).push(p),a.get(p).push(u)};for(let p of e.edges)p.from===p.to||!o.has(p.from)||!o.has(p.to)||(o.get(p.from)<o.get(p.to)?i(p.from,p.to):i(p.to,p.from));let c=n.filter(s);for(let p=1;p<c.length;p++)i(c[p-1],c[p]);let d=new Map;for(let p of n){let u=0;for(let f of r.get(p))u=Math.max(u,d.get(f)+1);d.set(p,u)}for(let p=n.length-1;p>=0;p--){let u=n[p],f=a.get(u);if(s(u)||f.length===0)continue;let g=1/0;for(let m of f)g=Math.min(g,d.get(m));let w=d.get(u),h=Math.max(w,g-1);d.set(u,Math.floor((w+h)/2))}let l=[];for(let p of n)(l[d.get(p)]??=[]).push(p);return{layers:l,layerOf:d,preds:r}}function Ds(e){if(!e.nodes.some(E))return;let t=new Map(e.nodes.map(p=>[p.id,p])),n=p=>E(t.get(p)),{layers:o,layerOf:s,preds:r}=oc(e),a=o.map(p=>{let u=0;for(let f of p)u=Math.max(u,_s(t.get(f)));return u}),i=[],c=0;for(let p=0;p<o.length;p++)i[p]=c,c+=a[p]+Qi;let d=new Map;for(let p of o){let u=[];for(let g of p){if(n(g)){d.set(g,0);continue}let w=r.get(g).filter(m=>d.has(m)),h=0;for(let m of w)h+=d.get(m)/w.length;u.push({id:g,ideal:h===0?Zn:h})}u.sort((g,w)=>g.ideal-w.ideal);let f=new Set([0]);for(let{id:g,ideal:w}of u){let h=Math.round(w/Zn);h===0&&(h=w>=0?1:-1);for(let m=1;f.has(h);m++)f.has(h+m)?f.has(h-m)||(h-=m):h+=m;f.add(h),d.set(g,h*Zn)}}let l={};for(let p of e.nodes){let u=s.get(p.id),f=_s(p),g=i[u]+a[u]/2,w=d.get(p.id);l[p.id]=[{x:g-f/2,y:w},{x:g+f/2,y:w}]}return{nodePositions:l,referenceAxis:!1,pixelRows:!0}}var Xs="Force-directed layout",Fe=e=>e.nodes.some(E),Hs=e=>Fe(e)&&(e.paths?.length??0)>1,Ws=e=>Fe(e)&&e.nodes.some(Xe),zt=[{value:"auto",label:"Anchored",description:"x is reference bp, one row per stable rank. Needs rGFA tags or a reference path.",run:Gs,cutMargins:!0,wholeWalks:!1,available:Fe,drawsLocally:Fe,drawsNodes:!0},{value:"samplerows",label:"Sample rows",description:"x is reference bp, one row per contributing assembly. Needs rGFA tags or a reference path.",run:As,cutMargins:!0,wholeWalks:!1,available:Ws,drawsLocally:Ws,drawsNodes:!0},{value:"walkrows",label:"Walk rows",description:"x is each walk's own bp: one bar per haplotype, blue on the reference's path and purple off it, so a repeat expansion reads as bar length, and each bar boxes its haplotype's own genes where the session has them. Needs W or P lines.",run:Gn,cutMargins:!1,wholeWalks:!0,available:Hs,drawsLocally:Hs,drawsNodes:!1},{value:"ordered",label:"Ordered",description:"x is reference order, not bp: every node gets room, bubbles read as lenses. Needs rGFA tags or a reference path.",run:Ds,cutMargins:!1,wholeWalks:!1,available:Fe,drawsLocally:Fe,drawsNodes:!0},{value:"tubemap",label:"Tube map",description:"sequenceTubeMap: every path a coloured tube through boxed nodes, columns in node order and node widths log-scaled. Needs P or W lines.",run:Os,cutMargins:!1,wholeWalks:!1,available:dt,drawsLocally:dt,drawsNodes:!1},{value:"tubemapref",label:"Tube map on reference",description:"The tube map with each column at the reference bp it covers, so the tubes line up with the tracks around them. Needs P or W lines and a reference path.",run:Cs,cutMargins:!0,wholeWalks:!1,available:Ut,drawsLocally:Ut,drawsNodes:!1},{value:"force",label:Xs,description:"OGDF FMMM, via the external Bandage engine.",run:()=>{},cutMargins:!1,wholeWalks:!1,available:()=>!0,drawsLocally:()=>!1,drawsNodes:!0}],rc=zt.map(e=>e.value);function eo(e,t){return!Q(e).drawsLocally(t)}function Q(e){return zt.find(t=>t.value===e)??zt[0]}var sc=.05,Kt=9;function ac(e,t){let{minY:n,maxY:o}=e.layout.bounds,s=o-n;return e.columns&&s>0?Math.max(sc,Math.min(1,t/s)):1}function qt(e,t){let{scaleX:n,translateX:o,translateY:s}=t,r=t.scaleY*ac(e,t.usableHeight),a=c=>(c-e.yOffset)*r+s,{columns:i}=e;if(i){let c=xr(i,d=>d*n+o);return{x:d=>Mr(c,d),y:a,yScale:r}}return{x:c=>c*n+o,y:a,yScale:r}}function to(e,{x:t,y:n},o,s){let r=null;return e.layout.nodes.forEach(a=>{a.order>=0&&t(a.x-Kt)<=o&&o<=t(a.x+a.pixelWidth+Kt)&&n(a.y-Kt)<=s&&s<=n(a.y+a.contentHeight+Kt)&&(r=a.name)}),r}function ut(e,t,n){if(t==="uniform"||t==="grey")return;let o={...jo(e),referenceRamp:n};return new Map(e.nodes.map((s,r)=>[s.id,kn(Yo(s,r,t,o))]))}function Vs(e){if(typeof e!="object"||e===null)return!1;let t=e;return typeof t.horizontalScroll=="function"&&typeof t.zoomTo=="function"&&"coarseDynamicBlocks"in t&&"dynamicBlocks"in t}function js(e){return e.reduce((t,n)=>t&&t.end-t.start>=n.end-n.start?t:n,void 0)}function Ys(e,t){let n=js(e.dynamicBlocks.contentBlocks.filter(r=>r.refName===t.refName&&r.assemblyName===t.assemblyName)),{bpPerPx:o}=e;if(!n||!(o>0))return;let s=n.offsetPx-e.offsetPx;return n.reversed?{scale:-1/o,translateX:s+n.end/o}:{scale:1/o,translateX:s-n.start/o}}function Wf(e){let t=js(e.dynamicBlocks.contentBlocks),n=t?.displayedRegionIndex===void 0?void 0:e.displayedRegions[t.displayedRegionIndex];return t&&e.bpPerPx>0?{refName:t.refName,assemblyName:t.assemblyName,start:t.start,end:t.end,bpPerPx:e.bpPerPx,span:e.bpPerPx*e.width,regionStart:n?.start??t.start,regionEnd:n?.end??t.end}:void 0}function ic(e,t,n=!0){let o=e.end-e.start,s=n?Math.max(0,Math.min(e.span,(t-o)/2)):0,r=Math.max(e.regionStart,Math.floor(e.start-s)),a=Math.min(e.regionEnd,Math.ceil(e.end+s)),i=a-r-t;return i>0&&(r+=Math.floor(i/2),a-=Math.ceil(i/2)),{refName:e.refName,assemblyName:e.assemblyName,start:r,end:a}}function Xf(e,t,n=!0){if(e?.refName!==t.refName||e.assemblyName!==t.assemblyName)return!1;if(n)return e.start<=t.start+1&&t.end<=e.end+1;let o=ic(t,1/0,!1);return Math.abs(e.start-o.start)<1&&Math.abs(e.end-o.end)<1}var cc=4;function no(e=cc){let t=new WeakMap,n=o=>{let s=t.get(o);return s||(s=new Map,t.set(o,s)),s};return{layout(o,s,r){let a=n(o),i=Xt(o,s),c=a.get(i);if(c)return c.run;a.size>=e&&a.delete(a.keys().next().value);let d=performance.now(),l={run:Xn(o,s,r).then(p=>(l.done=p.result,{...p,duration:p.duration||performance.now()-d}))};return l.run.catch(()=>{a.get(i)===l&&a.delete(i)}),a.set(i,l),l.run},ready(o,s){return t.get(o)?.get(Xt(o,s))?.done},inherit(o,s){let r=t.get(o);r&&o!==s&&t.set(s,r)}}}var Me=JBrowseExports["@jbrowse/render-core/RenderLifecycleMixin"],dc=e=>Me!=null&&e in Object(Me)?Me[e]:Object.assign(function(){throw new Error("This JBrowse does not provide '"+e+"' from '@jbrowse/render-core/RenderLifecycleMixin' to plugins: GraphGenomeView was built for a different JBrowse version, so update the plugin or JBrowse")},{jbrowseHostMissing:e}),Us=dc("RenderLifecycleMixin"),hh=Me&&Me.__esModule?Me.default:Me;function zs(e){return t=>e.includes(t)?t:void 0}function wh(e){return L.snapshotProcessor(L.maybe(L.enumeration(e)),{preProcessor:zs(e)})}function Jt(e,t){return L.snapshotProcessor(L.optional(L.enumeration(e),t),{preProcessor:zs(e)})}var Ks=600,Zt=160,Qt=[1,1,1,1],en=[.12,.12,.12,1],qs=([e,t,n])=>`rgb(${[e,t,n].map(o=>Math.round(o*255)).join(", ")})`,Js=5,Zs=new Set(["tubemap","tubemapref"]),Ah=yt(()=>import("./ChooseSamplesDialog-BNVYBGJQ.js")),Th=yt(()=>import("./ChooseWalksDialog-EN3C6AQA.js")),Eh=yt(()=>import("./HighlightColorDialog-EYBKFSJU.js")),Ih=12,Bh=[{bp:0,label:"None"},{bp:3,label:"Under 3 bp"},{bp:10,label:"Under 10 bp"},{bp:50,label:"Under 50 bp, leaving structural variants"},{bp:1e3,label:"Under 1 kb"}];function Oh(e){if(typeof e.uri=="string")return e.uri;let n=e.segmentsLocation?.uri;return typeof n=="string"&&n.endsWith(bn)?n.slice(0,-bn.length):void 0}var oo=1.15,Qs=1.6,Ch=150,ea=1,ro=40,Gh=[{value:"each",label:"A tube per haplotype"},{value:"grouped",label:"A tube per haplotype, grouped by route"},{value:"bundled",label:"A tube per route"}],uc={nodeStrokes:[],nodeStrokeRuns:new Map,arrows:[],arrowRuns:new Map,edgeCurves:[],edgeCurveRuns:new Map};function pt(...e){}var _h=5e6;function $h(e){return e>=1e6?`${+(e/1e6).toFixed(1)} Mb`:`${Math.round(e/1e3)} kb`}var pc=2e4;function Fh(e){return("uri"in e?e.uri.split(/[?#]/)[0]:"localPath"in e?e.localPath:"name"in e?e.name:"").split(/[\\/]/).at(-1)??""}function De(e){return e&&"uri"in e&&e.uri?new URL(e.uri,e.baseUri??window.location.href).href:void 0}function ta(e){return e.builtViewport!==void 0&&e.paintedViewport===e.builtViewport&&e.builtViewport.viewportDirty===e.viewportDirty&&!e.viewportRebuildPending}function na(e){let{width:t,height:n}=e.viewBox;return jn(e,e.axisScale,t,n)}var Dh=no(),oa=L.compose("GraphPane",Us(),L.model({layoutQuality:L.optional(L.number,2),layoutEngine:Jt(Bo,"fmmm"),linearLayout:L.optional(L.boolean,!1),bubbleSpread:Jt(nr,"auto"),tubeMapFold:L.optional(L.number,0),tubeMapRoutes:Jt(["each","grouped","bundled"],"each"),tubeMapColorBy:L.optional(L.string,""),geneTrackId:L.optional(L.string,""),repeatTrackId:L.optional(L.string,""),repeatKey:L.optional(L.string,""),walkLayers:L.optional(L.frozen(),[]),referencePath:L.optional(L.string,""),showPerf:L.optional(L.boolean,!1),connectorThickness:L.optional(L.number,2),scale:L.optional(L.number,1),translateX:L.optional(L.number,0),translateY:L.optional(L.number,0),paneHeight:L.maybe(L.number),maxGraphNodes:L.optional(L.number,pc),connectedViewId:L.maybe(L.string)})).volatile(()=>({graph:void 0,walkCut:void 0,graphRegion:void 0,loadedReferencePath:void 0,layoutResult:void 0,drawnLayoutMode:void 0,legendSize:{width:0,height:0},indexBubbles:void 0,foldedBelowBp:void 0,geneTrackFeatures:void 0,walkGeneFeatures:void 0,walkRowSampleTable:void 0,repeatArrays:void 0,handledLayoutMode:void 0,openBubbles:[],error:void 0,isLoading:!1,loadCanceled:!1,statusMessage:"",hoveredNode:null,hoveredAt:null,hoveredTube:null,hoveredPanel:null,hoveredRowWalks:[],hoveredBubble:null,pointerInPane:!1,stripHover:null,hoveredWalkRow:null,hoveredEdge:null,selectedNode:null,viewportDirty:0,positionsVersion:0,morphEntering:void 0,drawnBatch:uc,builtViewport:void 0,paintedViewport:void 0,draggingNode:null,isPanning:!1,viewportOwner:"fit",viewportDirtyTimer:void 0,positionsDirtyFrame:0,lastFetchMs:void 0,readsShown:void 0,lastLayoutMs:void 0,lastGeometryMs:void 0,lastGeometryStrokeCount:void 0,viewportRebuildPending:!1}));var ra=.9;function lt(e,t){return e+2>=t||e>=ra*t}var sa=50;function so(e,t,n,o=[]){let s=new Map(e.nodes.map(a=>[a.name,a])),r=[];for(let a of t){let i=[],c=1/0,d=-1/0,l=1/0,p=[],u=we(a);for(let[w,h]of u.entries()){let m=s.get(h),k=m&&n[m.id];if(!(!m||!k?.length)&&!(a.key?w===0||w===u.length-1:E(m)&&(m.stable.start<a.start||m.stable.start>=a.end))){p.push(m.id),i.push(je(k.length===1?[k[0],k[0]]:k));for(let y of k)c=Math.min(c,y.x),d=Math.max(d,y.x),l=Math.min(l,y.y)}}if(p.length===0)continue;let f={x:(c+d)/2,y:l},g=a.covering===!0||lt(p.length,e.nodes.length);r.push({bubble:a,...ir(a,o),path:i.join(""),labelAt:f,members:p.length,nodeIds:p,whole:g,tick:!g&&!a.partial&&a.longestAlleleLength<sa})}return r}function mt(e,t){let n=new Set(t),o=e.nodes.filter(c=>n.has(c.name)),s=new Set(o.map(c=>c.id)),r=new Map(e.nodes.map(c=>[c.id,c.length])),a=new Map,i=e.paths?.flatMap(c=>{let d=c.nodeIds.findIndex(u=>s.has(u));if(d<0)return[];let l=c.nodeIds.filter(u=>s.has(u));a.set(c.name,{first:d,nodeIds:l});let p=c.nodeIds.slice(0,d).reduce((u,f)=>u+(r.get(f)??0),0);return[{...c,nodeIds:l,...c.start===void 0?{}:{start:c.start+p}}]});return{name:e.name,nodes:o,edges:e.edges.filter(c=>s.has(c.from)&&s.has(c.to)),...i?.length?{paths:i}:{},anchorPaths:_o(e,a),pathVisits:e.pathVisits,anchoredBy:e.anchoredBy,referencePath:e.referencePath}}function ao(e,t,n,o){let s=e.get(t);e.set(t,{min:Math.min(s?.min??1/0,n.min+o),max:Math.max(s?.max??-1/0,n.max+o),n:Math.min(ar,n.n+(s?.n??0))})}function aa(e){if(!e.nodes.some(E))return[];let t=new Map(e.nodes.map(u=>[u.id,u])),n=Qn(e),o=new Map(n.map((u,f)=>[u,f])),s=new Int32Array(n.length+1),r=new Map,a=new Set;for(let u of e.edges){let f=o.get(u.from),g=o.get(u.to);if(f===void 0||g===void 0||f===g)continue;a.add(`${u.from}>${u.to}`).add(`${u.to}>${u.from}`);let[w,h]=f<g?[f,g]:[g,f];s[w+1]++,s[h]--;let[m,k]=f<g?[u.from,u.to]:[u.to,u.from];(r.get(m)??r.set(m,new Set).get(m)).add(k)}for(let u=1;u<s.length;u++)s[u]+=s[u-1];let i=e.nodes.filter(E).sort((u,f)=>u.stable.start-f.stable.start),c=new Set([i[0].id,i.at(-1).id]),d=i.map(u=>[u,o.get(u.id)]).filter(([u,f])=>c.has(u.id)||s[f]===0).sort(([u,f],[g,w])=>f-w||u.stable.start-g.stable.start),l=io(e,d.map(([u])=>u.id)),p=[];for(let u=0;u+1<d.length;u++){let[f,g]=d[u],[w,h]=d[u+1],m=n.slice(g+1,h);if(m.length===0)continue;let k=new Map([[f.id,{min:0,max:0,n:1}]]);for(let X of[f.id,...m]){let T=k.get(X);if(T)for(let N of r.get(X)??[])o.get(N)>h||ao(k,N,T,N===w.id?0:t.get(N).length)}let y=l&&co(e,t,l,f.id,w.id),b=y?.n?y:void 0,x=b??k.get(w.id)??{min:0,max:0,n:0},S=y!==void 0&&y.left>0,P=f.stable.start+f.length,I=w.stable.start,V=[f.id,...m.filter(X=>E(t.get(X))),w.id],_=V.some((X,T)=>T>0&&!a.has(`${V[T-1]}>${X}`)),B=_||S,j=_&&!b;p.push({refName:f.stable.refName,start:P,end:I,segmentCount:m.length+2,pathCount:x.n,inversion:!1,shortestAlleleLength:j?I-P:x.min,longestAlleleLength:j?I-P:x.max,segments:[f,...m.map(X=>t.get(X)),w].map(X=>X.name).join(","),shortestAllele:void 0,longestAllele:void 0,partial:B,routes:b?.routes})}return p}function io(e,t){let n=e.paths;if(!n)return;let o=new Map;for(let s of t)o.set(s,new Int32Array(n.length).fill(-1));return n.forEach((s,r)=>{let a=s.nodeIds;for(let i=0;i<a.length;i++){let c=o.get(a[i]);c?.[r]===-1&&(c[r]=i)}}),o}function co(e,t,n,o,s){let r=[],a=1/0,i=-1/0,c=0,d=n.get(o),l=n.get(s);return e.paths.forEach((p,u)=>{let f=d[u],g=l[u];if(f<0||g<0){(f>=0||g>=0)&&c++;return}let w=p.nodeIds,h=Math.min(f,g)+1,m=Math.max(f,g),k=g<f?b=>w[m-1-b]:b=>w[h+b],y=r.find(b=>b.steps.length===m-h&&b.steps.every((x,S)=>x===k(S)));if(!y){let b=Array.from({length:m-h},(S,P)=>k(P)),x=0;for(let S of b)x+=t.get(S)?.length??0;y={steps:b,bp:x,walks:[]},r.push(y)}y.walks.push(p.name),a=Math.min(a,y.bp),i=Math.max(i,y.bp)}),r.length||c?{min:a,max:i,n:r.length,left:c,routes:r}:void 0}function lc(e,t){let n=e.nodes.length*2,o=new Set,s=[],r=new Int32Array(n);for(let d of e.edges){let l=t.get(d.from),p=t.get(d.to);if(l===void 0||p===void 0)continue;let u=fe(d),f=l*2+(u.from==="end"?1:0),g=p*2+(u.to==="end"?1:0),w=Math.min(f,g)*n+Math.max(f,g);o.has(w)||(o.add(w),s.push(f,g),r[f]++,f!==g&&r[g]++)}let a=new Int32Array(n+1);for(let d=0;d<n;d++)a[d+1]=a[d]+r[d];let i=new Int32Array(a[n]),c=a.slice(0,n);for(let d=0;d<s.length;d+=2){let l=s[d],p=s[d+1];i[c[l]++]=p,l!==p&&(i[c[p]++]=l)}return{offset:a,next:i}}function mc(e,t,n){let o=new Int32Array(e),s=new Uint8Array(e*2),r=new Int32Array(e*2),a=new Int32Array(e),i=[],c=0;return d=>{let l=d>>1;c++,i.length=0;let p=0,u=0,f=0,g,w=h=>{s[h]||(s[h]=1,p++,i.push(h))};w(d),r[u++]=d;e:for(;u>0;){let h=r[--u],m=h>>1;if(o[m]=c,m!==l&&(a[f++]=h),s[h]&&(s[h]=0,p--),t[h]===t[h+1])break;for(let k=t[h];k<t[h+1];k++){let y=n[k],b=y>>1;if(b===l)break e;if(w(y^1),o[b]===c)continue;let x=!0;for(let S=t[y];S<t[y+1];S++)if(o[n[S]>>1]!==c){x=!1;break}x&&(r[u++]=y^1)}if(u===1&&p===1){f>0&&(g={source:d,sink:r[0],inside:a.slice(0,f)});break}}for(let h of i)s[h]=0;return g}}function fc(e){return{source:e.sink^1,sink:e.source^1,inside:e.inside.map(t=>t^1).reverse()}}var da=new Intl.Collator(void 0,{numeric:!0});function uo(e,t){return E(e)&&E(t)&&e.stable.refName===t.stable.refName}function ia(e,t){let n=t[e.source>>1],o=t[e.sink>>1],s=uo(n,o)?n.stable.start-o.stable.start:0,r=((e.sink^1)&1)-(e.source&1);return(s||r||da.compare(n.name,o.name))<0}function ca(e){return[e.source>>1,...Array.from(e.inside,t=>t>>1),e.sink>>1]}function hc(e){let{nodes:t}=e,n=new Map(t.map((c,d)=>[c.id,d])),{offset:o,next:s}=lc(e,n),r=mc(t.length,o,s),a=new Map;for(let c=0;c<t.length*2;c++){let d=r(c);if(!d)continue;let l=d.source>>1,p=d.sink>>1,u=Math.min(l,p)*t.length+Math.max(l,p);(ia(d,t)||!a.has(u))&&a.set(u,d)}return{found:[...a.values()].map(c=>ia(c,t)?c:fc(c)),offset:o,next:s}}function gc(e,t,n,o){let s=o.sink>>1,r=new Map([[o.source>>1,{min:0,max:0,n:1}]]);for(let a of[o.source,...o.inside]){let i=r.get(a>>1);if(i)for(let c=t[a];c<t[a+1];c++){let d=n[c]>>1;ao(r,d,i,d===s?0:e[d].length)}}return r.get(s)??{min:0,max:0,n:0}}function po(e,t){let{nodes:n}=e,{found:o,offset:s,next:r}=hc(e),a=o.map(g=>lt(g.inside.length,n.length)),i=o.map(ca),c=new Map;i.forEach((g,w)=>{for(let h of g)(c.get(h)??c.set(h,[]).get(h)).push(w)});let d=(g,w)=>c.get(g.inside[0]>>1).some(h=>h!==w&&!a[h]&&i[h].length>i[w].length&&i[w].every(m=>c.get(m).includes(h))),l=g=>t!==void 0||uo(n[g.source>>1],n[g.sink>>1]),p=o.filter((g,w)=>!a[w]&&l(g)&&!d(g,w)),u=new Map(n.map(g=>[g.id,g])),f=io(e,p.flatMap(g=>[n[g.source>>1].id,n[g.sink>>1].id]));return p.map(g=>{let w=n[g.source>>1],h=n[g.sink>>1],m=f&&co(e,u,f,w.id,h.id),k=m?.n?m:void 0,y=k??gc(n,s,r,g),b=uo(w,h);return{refName:b?w.stable.refName:t.refName,start:b?w.stable.start+w.length:t.start,end:b?h.stable.start:t.end,segmentCount:g.inside.length+2,pathCount:y.n,inversion:!1,shortestAlleleLength:y.min,longestAlleleLength:y.max,segments:ca(g).map(x=>n[x].name).join(","),shortestAllele:void 0,longestAllele:void 0,partial:m!==void 0&&m.left>0,routes:k?.routes,key:`${w.name}>${h.name}`,...b?{}:{offReference:!0}}}).sort((g,w)=>g.start-w.start||g.end-w.end||da.compare(g.key,w.key))}function tn(e,t){let n=e.nodes.length,o=aa(e);if(o.length===0){let s=po(e,t);return t?[...s,{...t,covering:!0}]:s}return o.flatMap(s=>lt(s.segmentCount-2,n)?[...po(s.segmentCount===n?e:mt(e,we(s)),s),{...s,covering:!0}]:[s])}var nn=JBrowseExports["@jbrowse/core/pluggableElementTypes/renderers/util/serializableFilterChain"];var ua=nn&&nn.__esModule?nn.default:nn;function lo(e){let t=[];for(let n of[...e].sort((o,s)=>o.start-s.start)){let o=t.at(-1);o&&n.start<=o.end?o.end=Math.max(o.end,n.end):t.push({...n})}return t}function mo(e){let t=[],n=new Map;for(let o of[...e].sort((s,r)=>s.start-r.start)){let s=`${o.refName} ${o.strand} ${o.name}`,r=n.get(s);if(r&&o.start<r.end)r.end=Math.max(r.end,o.end),r.exons=lo([...r.exons,...o.exons]);else{let a={...o,exons:lo(o.exons)};t.push(a),n.set(s,a)}}return t}var go=new Set(["BedAdapter","BedTabixAdapter","BigBedAdapter","VcfAdapter","VcfTabixAdapter"]),bo=/repeat|tandem|\bstr\b|vntr|trf|trgt|vamos|expansion|microsat/i;function pa(e,t){return t?e.find(o=>o.trackId===t):e.filter(o=>go.has(o.adapterType)).find(o=>bo.test(`${o.trackId} ${o.name??""}`))}function ft(e,t){return typeof e.get=="function"?e.get(t):e[t]}var la=/^\w+=[^;]*(;\w+=[^;]*)*$/;function bc(e){let t=ft(e,"name");if(!(typeof t!="string"||!la.test(t)))return Object.fromEntries(t.split(";").map(n=>{let o=n.indexOf("=");return[n.slice(0,o),n.slice(o+1)]}))}function se(e,t){let n=ft(e,t);return n!==void 0?n:ft(e,"INFO")?.[t]??bc(e)?.[t]}var ma=["RUS","MOTIFS","RU","motifs","motif","sequence","consensus"],wc=["RUL","period","PERIOD","consensusSize","unit","unitLength"],yc=["TRID","REPID","VARID","ID","name","id"];function on(e,t){for(let n of t){let o=se(e,n),s=String((Array.isArray(o)?o[0]:o)??"").split(",")[0].trim();if(s!==""&&s!==".")return s}}var fa=/^[ACGTURYSWKMBDHVN]+$/i;function kc(e){let t=Number(on(e,wc));if(Number.isFinite(t)&&t>0)return Math.round(t);let n=on(e,ma);return n&&fa.test(n)?n.length:void 0}function Se(e){return(Array.isArray(e)?e:String(e??"").split(",")).map(n=>{let o=n===""||n===null||n===void 0?NaN:Number(n);return Number.isFinite(o)?o:void 0})}function ho(e){return(Array.isArray(e)?e:String(e??"").split(",")).map(n=>{let o=String(n??"").trim();return o===""||o==="."?void 0:o})}var fo="<CNV:TR>";function xc(e){let t=ho(ft(e,"ALT"));if(!t.includes(fo))return;let n=Se(se(e,"RN")),o=ho(se(e,"RUS")),s=Se(se(e,"RUL")),r=Se(se(e,"RUC")),a=Se(se(e,"RB")),i=0;return t.map((c,d)=>{let l=n[d]??(c===fo?1:0),p=0,u=0;for(let f=0;f<l;f++,i++){let g=o[i],w=s[i]??(g&&fa.test(g)?g.length:void 0),h=r[i],m=a[i]??(w&&h!==void 0?Math.round(w*h):void 0);m!==void 0&&(p+=m,u++)}return c===fo&&l>0&&u===l?p:void 0})}function Mc(e,t,n){let o=e?.includes("|");return(e??"").split(/[/|]/).flatMap((s,r)=>{let a=Number(s),i=a>0?t[a-1]:n;return!Number.isInteger(a)||i===void 0?[]:[{bp:i,...o?{haplotype:r+1}:{}}]})}function Sc(e,t,n){let o=ft(e,"samples"),s={};for(let[r,a]of Object.entries(o??{})){let i=Se(a.SD),c=Se(a.AL).flatMap((l,p)=>l!==void 0&&l>0?[i[p]===void 0?{bp:l}:{bp:l,spanningReads:i[p]}]:[]),d=c.length>0||!t?c:Mc(ho(a.GT)[0],t,n);d.length>0&&(s[r]=d)}return Object.keys(s).length>0?s:void 0}function vc(e,t){let n=se(e,"start"),o=se(e,"end"),s=Se(se(e,"SVLEN"))[0];return t&&s!==void 0?{start:n+1,end:n+1+s}:{start:n,end:o}}function ww(e){let t=[];for(let n of e){let o=xc(n),{start:s,end:r}=vc(n,o!==void 0),a=kc(n);if(!(r>s)||a===void 0)continue;let i=se(n,"refName"),c=on(n,ma),d=on(n,yc);t.push({key:`${i}:${s}-${r}`,name:(d&&!la.test(d)?d:void 0)??(c&&c.length<=12?`(${c})n`:`${i}:${(s+1).toLocaleString()}-${r.toLocaleString()}`),refName:i,start:s,end:r,unit:a,motif:c,calls:Sc(n,o,r-s)})}return t.sort((n,o)=>n.start-o.start)}var ht=new Set(["Gff3TabixAdapter","Gff3Adapter","BedTabixAdapter","BedAdapter","GtfTabixAdapter","GtfAdapter","BigBedAdapter","NCListAdapter"]),Rc=/gene|refseq|gencode|ensembl|annotation/i,Lc=new Set(["BedTabixAdapter","BedAdapter"]);function rn(e,t){if(t)return e.find(s=>s.trackId===t);let n=s=>`${s.trackId} ${s.name??""}`,o=e.filter(s=>ht.has(s.adapterType)&&!bo.test(n(s)));return o.find(s=>Rc.test(n(s)))??o.find(s=>!Lc.has(s.adapterType))}function ha(e,t){let n=e.tracks?.find(o=>H(o.configuration,"trackId")===t)?.displays[0];return n?H(n.configuration,"filter")??[]:[]}var Nc=new Set(["chromosome","region","contig","supercontig","scaffold"]);function q(e,t){return typeof e.get=="function"?e.get(t):e[t]}var Pc=new Set(["exon","CDS","five_prime_UTR","three_prime_UTR","UTR"]);function ga(e,t){let n=q(e,"type");typeof n=="string"&&Pc.has(n)&&t.push({start:q(e,"start"),end:q(e,"end")});let o=q(e,"subfeatures");for(let s of o??[])ga(s,t)}function Ac(e){let t=[...e].sort((o,s)=>o.start-s.start),n=[];for(let o of t){let s=n.at(-1);s&&o.start<=s.end?s.end=Math.max(s.end,o.end):n.push({...o})}return n}function ba(e){let t=[];for(let n of e){let o=q(n,"gene_name")??q(n,"name")??q(n,"gene")??q(n,"gene_id"),s=q(n,"start"),r=q(n,"end");if(!o||!(r>s)||Nc.has(q(n,"type")))continue;let a=[];ga(n,a),t.push({name:o,refName:q(n,"refName"),start:s,end:r,strand:q(n,"strand")??0,exons:a.length?Ac(a):[{start:s,end:r}]})}return mo(t)}var wo={paths:!1,bubbles:!1,deletions:!0,genes:!0,referenceStrip:!0,walkStrip:!1};function wa(e){let t=typeof e=="object"&&e!==null?e:{};return new Set(Object.keys(wo).filter(n=>t[n]??wo[n]))}function vw(e,t,n){let{[t]:o,...s}=typeof e=="object"&&e!==null?e:{};return n===wo[t]?s:{...s,[t]:n}}function le(e){return typeof e=="object"&&e!==null}var yo={depth:"depth",length:"node-length",rank:"stable-rank",position:"reference-position"},ya=Object.fromEntries(Object.entries(yo).map(([e,t])=>[t,e]));function ka(e){if(e==="grey"||e==="uniform")return e;if(le(e)){let{field:t,scheme:n}=e;if(t==="id")return n==="rainbow"?"rainbow":"random";if(typeof t=="string"&&t in yo)return yo[t]}return"auto"}function xa(e){return le(e)&&typeof e.domainMin=="number"&&typeof e.domainMax=="number"?{start:e.domainMin,end:e.domainMax}:void 0}function Pw(e,t){return e==="grey"||e==="uniform"?e:e==="random"?{field:"id",scale:"categorical"}:e==="rainbow"?{field:"id",scheme:"rainbow"}:e==="reference-position"&&t?{field:"position",domainMin:t.start,domainMax:t.end}:ya[e]?{field:ya[e]}:{}}var Ma=6;function ko(e){return typeof e=="number"?{width:"uniform",px:e}:le(e)?{width:e.field==="depth"?"depth":"uniform",px:typeof e.value=="number"?e.value:Ma}:{width:"depth",px:Ma}}function Ew(e,t){return e==="depth"?{field:"depth",value:t}:t}function Tc(e,t,n){let o=Eo(e,t);return o?wn(o,n):void 0}var Sa=oa.views(e=>({get grammar(){return{}},get darkMode(){return!1},get hasPendingSource(){return!1},get canRetryLoad(){return!1},get sourceTrack(){try{return Ro(e).configuration}catch{return}}})).views(e=>{let t=r=>wt(r,{equals:(a,i)=>JSON.stringify(a)===JSON.stringify(i)}),n=t(()=>xa(e.grammar.color)),o=t(()=>Tt(e.grammar.facet)),s=t(()=>{let r=Hr(e.grammar.facet);return r&&r.field!=="walk"&&r.field!=="sample"?r:void 0});return{get chosenLayoutMode(){return e.grammar.layoutMode??"force"},get chosenColorScheme(){return ka(e.grammar.color)},get statedColorDomain(){return n.get()},get chosenHover(){return e.grammar.hover??"nodes"},get nodeWidth(){return ko(e.grammar.size).width},get contigThickness(){return ko(e.grammar.size).px},get layerSet(){return wa(e.grammar.layers)},get drawPaths(){return this.layerSet.has("paths")},get showBubbles(){return this.layerSet.has("bubbles")},get showDeletionEdges(){return this.layerSet.has("deletions")},get showGenes(){return this.layerSet.has("genes")},get showReferenceStrip(){return this.layerSet.has("referenceStrip")},get walkStrip(){return this.layerSet.has("walkStrip")},get facetSetting(){return o.get()},get walkRowGroupBy(){return s.get()},get walkRowSamples(){let r=e.grammar.rows?.kept;return Array.isArray(r)?r:void 0},get hoverLightsEverything(){return this.chosenHover==="everything"},get litNode(){return this.chosenHover==="off"?null:e.hoveredNode}}}).views(e=>({get paneWidth(){return We(e).width},get paneMeasured(){return!0},get drawnGraph(){return e.layoutResult?.tubeMap?.graph??e.graph}})).views(e=>({get nodeById(){if(e.drawnGraph){let t=new Map;for(let n of e.drawnGraph.nodes)t.set(n.id,n);return t}},get nodeLengths(){let t=new Map;for(let n of e.drawnGraph?.nodes??[])t.set(n.id,n.length);return t},get nodeCount(){return e.graph?.nodes.length??0},get edgeCount(){return e.graph?.edges.length??0},get pathCount(){return e.graph?.paths?.length??0},get hasGraph(){return e.graph!==void 0},get geometryPainted(){return ta(e)},get showLoading(){return e.error===void 0&&(e.isLoading||e.hasPendingSource||e.graph!==void 0&&!this.geometryPainted)},get canCancelLoad(){return e.isLoading&&!e.layoutResult},get usesLayoutEngine(){return e.graph?eo(e.chosenLayoutMode,e.graph):!1},get anchorPaths(){return e.graph?.anchorPaths??[]},get walkChoices(){let t=e.graph?.paths;return t?.length?ze(t):[]},get effectiveDrawPaths(){return e.drawPaths&&Ae(e.graph?.paths?.length??0)},get activeReferencePath(){return e.graph?.referencePath},get rampDomain(){let t=e.openBubbles.at(-1);return t&&!t.offReference&&t.end>t.start?{start:t.start,end:t.end}:e.statedColorDomain??e.graphRegion},get walkRamp(){let{graph:t}=e;return t&&e.walkLayers.some(n=>n.color?.field==="reference")?Ee(t,this.rampDomain):void 0},get modeDrawsNodes(){return Q(e.chosenLayoutMode).drawsNodes},get liftedWalkLayers(){return e.walkLayers.length>0||!this.modeDrawsNodes?e.walkLayers:e.hoveredRowWalks.map(t=>({walk:t}))},get walkLift(){let{graph:t}=e,n=this.liftedWalkLayers;return t&&!e.walkCut&&n.length>0&&!e.layoutResult?.tubeMap?at(t,n,this.walkRamp):void 0},get facetPanels(){let{graph:t}=e,n=this.walkLift;return e.facetSetting.field!==""&&this.modeDrawsNodes&&t&&n&&e.walkLayers.length>1&&n.walks.length>1?it(t,n,e.walkLayers,this.walkRamp):void 0},get drawnWalks(){return this.facetPanels?.map(t=>t.walks[0])??this.walkLift?.walks??[]},get liftsWalks(){return!Zs.has(e.chosenLayoutMode)},get walkReference(){let t=this.walkLift?.referenceDomain;return t&&{...t,name:e.graphRegion?.refName}},get walkLabels(){return xt(this.walkChoices)},walkLabel(t){return this.walkLabels.get(t)??t},get liftPaintsOffReference(){for(let t of this.walkLift?.walks??[])if(t.encoding.field!=="walk"){for(let n of t.colors.values())if(n===sr)return!0}return!1},get liftedWalksLabel(){let t=this.walkLift?.walks??[];return t.length===1?this.walkLabel(t[0].name):"these walks"},get effectiveColorScheme(){return e.layoutResult?.tubeMap&&(this.tubeMapReads||e.chosenColorScheme==="auto")?"uniform":ct(e.chosenColorScheme,e.graph)},get tubeMapReads(){return(e.layoutResult?.tubeMap?.layout.reads.length??0)>0},get colorSchemeLock(){return this.walkLift?{value:"By walk",why:"Each highlighted haplotype colours its own lane: set it under Haplotypes, Color highlighted..."}:this.tubeMapReads?{value:"By strand",why:"Reads take the reds and blues, so the tube map leaves its nodes clear"}:void 0},get nodePositions(){return e.layoutResult?.nodePositions},get labelsNodeSizes(){return!e.layoutResult?.tubeMap&&!this.walkLift},get rowLabels(){return e.layoutResult?.rowLabels??[]},get alleleDeletions(){return e.layoutResult?.alleleDeletions??[]},get deletionRoutes(){return e.layoutResult?.deletionRoutes},get stranded(){return e.layoutResult?.stranded},get pixelRows(){return e.layoutResult?.pixelRows??!1},get zoomPercent(){return`${(e.scale*100).toFixed(1)}%`},get isDefaultViewport(){return e.scale===1&&e.translateX===0&&e.translateY===0}})).views(e=>({get derivedBubbles(){return e.graph?tn(e.graph):[]},get openBubbleInsides(){let{graph:t}=e;return t?e.openBubbles.map(n=>tn(mt(t,we(n)),n).filter(o=>!o.covering)):[]},get openBubble(){return e.openBubbles.at(-1)},get openBubbleFocus(){let t=this.openBubble,{graph:n}=e;if(!t||!n)return;let o=new Set(we(t)),s=new Set(n.nodes.filter(a=>o.has(a.name)).map(a=>a.id)),r=new Set;return n.edges.forEach((a,i)=>{s.has(a.from)&&s.has(a.to)&&r.add(i)}),{walks:[],nodeIds:s,edgeIndexes:r,names:new Set}},bubbleIsOpen(t){return e.openBubbles.some(n=>Bt(n,t))},bubbleFaded({bubble:t,nodeIds:n}){let o=e.walkLift,s=this.openBubbleFocus;return o?!n.some(r=>o.nodeIds.has(r)):!!s&&!this.bubbleIsOpen(t)&&!n.every(r=>s.nodeIds.has(r))}})).views(e=>({get bubbles(){let t=e.indexBubbles?.length?e.indexBubbles:e.derivedBubbles,n=new Set(t.map(Ot));return[...t,...e.openBubbleInsides.flat().filter(o=>!n.has(Ot(o))&&n.add(Ot(o)))]},get foldNote(){let t=e.foldedBelowBp;return t===void 0?void 0:`variants under ${Ue(t)} folded into the reference`}})).views(e=>({get cutHaplotypes(){},get sourceGfaLocation(){},get sourceAdapter(){let t=e.sourceTrack;return t?Kr(e,t):void 0},get sourceTrackId(){let t=e.sourceTrack;return t?H(t,"trackId"):void 0},get assemblyTrackChoices(){let t=e.graphRegion;return t?J(e).tracks.filter(n=>H(n,"assemblyNames").includes(t.assemblyName)).map(n=>({trackId:n.trackId,name:H(n,"name"),adapterType:H(n,"adapter").type})):[]}})).views(e=>({get geneTrackChoices(){return e.assemblyTrackChoices.filter(t=>ht.has(t.adapterType))},get repeatTrackChoices(){return e.assemblyTrackChoices.filter(t=>go.has(t.adapterType))},get repeatChoices(){return e.repeatArrays??[]}})).views(e=>({get repeatTrack(){return pa(e.repeatTrackChoices,e.repeatTrackId)},get geneTrack(){return rn(e.geneTrackChoices,e.geneTrackId)},get selectedRepeat(){return e.repeatChoices.find(t=>t.key===e.repeatKey)},get backbone(){return e.graph?mn(e.graph):void 0},get cutWalkRows(){let t=e.walkCut?.walkRowRuns;return t?wn(t):e.graph?Ce(e.graph,e.graphRegion):void 0},assemblySpellings(t){let{assemblyManager:n}=J(e),o=n.has(t)?n.get(t):void 0,s=e.sourceAdapter?.assemblyNameToPanSN??{},r=[t,...o?[o.name,...o.aliases]:[]];return{name:t,aliases:[...r,...r.flatMap(a=>s[a]??[])]}},get drawsLoadedReference(){let t=e.graph;return t?.anchoredBy==="tags"||t?.referencePath!==void 0&&t.referencePath===e.loadedReferencePath}})).views(e=>({get geneAssembly(){let t=e.graphRegion;return t?e.assemblySpellings(t.assemblyName):void 0},get geneLaneFilter(){let t;try{t=We(e)}catch{return}let n=ha(t,e.geneTrack?.trackId);return n.length?new ua({filters:n,jexl:Lo(e).pluginManager.jexl}):void 0},get geneFeatures(){let t=e.geneTrackFeatures,n=this.geneLaneFilter;return t?ba(n?t.filter(o=>n.passes(o)):t):void 0}})).views(e=>({get backboneGenes(){let{backbone:t,geneAssembly:n,geneFeatures:o}=e,s=e.drawsLoadedReference||n!==void 0&&hn(t,[n])!==void 0;return t&&o&&s?gn(o,t):void 0}})).views(e=>({get nodeNeighbors(){return e.drawnGraph?ce(e.drawnGraph):void 0},get nodeInk(){return Mt(e.drawnGraph,e.nodeById,e.contigThickness,e.nodeWidth)},get allDeletions(){return e.graph&&this.drawsNodes?he(e.graph):[]},get cohortWalkRows(){if(e.chosenLayoutMode!=="walkrows"||!e.graph)return;let t=e.selectedRepeat,n=e.walkCut,o=t?n?Tc(n,t,t.unit):Ce(e.graph,t,t.unit):e.cutWalkRows;if(!o)return;let[s,...r]=zr([o.reference,...o.rows],t?.calls);return{...o,reference:s,rows:r}},get walkRowSampleChoices(){let t=this.cohortWalkRows?.rows??[];return{samples:[...new Set(t.map(n=>n.sample))].sort(),disagreeing:[...new Set(t.filter(n=>n.call?.agrees===!1).map(n=>n.sample))]}},get walkRowSamplesTsv(){let t=e.sourceAdapter?.samplesTsvLocation;return t&&To(t)?t:void 0},get walkRowGroupFields(){return Dr(e.walkRowSampleTable)},get tubeMapColoring(){let t=e.tubeMapColorBy,n=e.walkRowSampleTable;if(!t||!n||!this.walkRowGroupFields.includes(t))return;let o=Or(t,n),s=(e.graph?.paths??[]).map(r=>W(r.name).name).filter(r=>r!==e.graph?.referencePath);return{field:t,valueOf:o,palette:Br(s.map(o)),unvalued:s.some(r=>o(r)==="")}},get tubeMapPanelSplit(){let{field:t,domain:n}=e.facetSetting,o=e.walkRowGroupBy,s=e.walkRowSampleTable;return t!==""?{by:t,domain:n}:o&&s&&this.walkRowGroupFields.includes(o.field)?{by:"column",...o,table:s}:void 0},get walkRowGroups(){let t=this.cohortWalkRows,n=e.walkRowSampleTable,o=e.walkRowGroupBy;return t&&n&&o&&this.walkRowGroupFields.includes(o.field)?Wr(Oe(t.rows,e.walkRowSamples),n,o):void 0},get walkRowBars(){let t=this.cohortWalkRows;return t?{...t,rows:this.walkRowGroups?.rows??Oe(t.rows,e.walkRowSamples)}:void 0},get drawsNodes(){return Q(e.drawnLayoutMode??e.chosenLayoutMode).drawsNodes},get genePins(){pt(e.positionsVersion);let t=e.layoutResult?.nodePositions;return e.showGenes&&this.drawsNodes&&e.graph&&e.backboneGenes&&t?tt(e.graph,e.backboneGenes,t):[]},get bubbleHalos(){pt(e.positionsVersion);let t=e.layoutResult?.nodePositions;return!e.showBubbles||!this.drawsNodes||!e.graph||!t?[]:so(e.graph,e.bubbles,t,e.repeatArrays)},get referenceRamp(){return e.effectiveColorScheme==="reference-position"&&e.drawnGraph?Ee(e.drawnGraph,e.rampDomain):void 0},get assemblyNames(){let t=e.graphRegion;return t?[t.assemblyName]:[]},get scaleX(){return ke(e.scale,e.pixelRows).scaleX},get scaleY(){return ke(e.scale,e.pixelRows).scaleY},get axisScale(){return ke(e.scale,e.pixelRows)}})).views(e=>({get deletionDrawing(){return e.graph?ge(e.graph,e.allDeletions,e.showDeletionEdges):void 0},get deletions(){return this.deletionDrawing?.shown??[]},get deletionEdgeIndexes(){return this.deletionDrawing?.bypassed},get hiddenEdgeIndexes(){return this.deletionDrawing?.hidden},get referenceRampDomain(){let t=e.referenceRamp;return t?{start:t.start,end:t.start+t.span}:void 0},get referenceRampOffKeys(){let t=e.referenceRamp,n=e.layoutResult,o=n?.tubeMap?n.nodePositions:void 0,s=!1,r=!1;if(t&&e.drawnGraph)for(let a of e.drawnGraph.nodes)o&&!o[a.id]||(t.midpoints.has(a.id)?a.stable&&a.stable.rank>0&&(s=!0):r=!0);return{offReference:s,unplaced:r}},get tubeMapNodeColors(){let t=e.drawnGraph;return e.layoutResult?.tubeMap&&t?ut(t,e.effectiveColorScheme,e.referenceRamp):void 0},get tubeMapTubeColors(){let t=e.layoutResult?.tubeMap,n=t?.pathColors,o=e.drawnGraph?.paths,s=e.tubeMapColoring,r=n&&o&&s&&t.layout.reads.length===0?Ft(o,e.drawnGraph.referencePath,s.valueOf,s.palette):n&&o&&this.tubeMapNodeColors?Ze(o,e.drawnGraph.referencePath,$t):n&&o&&t.layout.reads.length===0&&(!Ae(o.length)||o.some(i=>i.members))?Ze(o,e.drawnGraph.referencePath):n,a=new Set(e.hoveredRowWalks);return r&&o&&a.size>0?r.map((i,c)=>a.has(o[c]?.name??"")?i:Te):r},nodeSpan(t){let{nodeById:n,nodeNeighbors:o}=e;return n&&o?St({nodeId:t,nodeById:n,neighbors:o}):void 0},get hoverDrawing(){let t=e.hoveredPanel;return(t===null?void 0:e.layoutResult?.tubeMapPanels?.[t]?.result.tubeMap)??e.layoutResult?.tubeMap}})).views(e=>({get hoverGraph(){return e.hoverDrawing?.graph??e.drawnGraph}})).views(e=>({get hoverNodeById(){let t=e.hoverGraph;return t===e.drawnGraph?e.nodeById:t&&new Map(t.nodes.map(n=>[n.id,n]))},get hoverNeighbors(){let t=e.hoverGraph;return t===e.drawnGraph?e.nodeNeighbors:t&&ce(t)}})).views(e=>({get pathLegend(){let t=e.drawnGraph?.paths,n=e.layoutResult?.tubeMap;return(e.drawPaths||n)&&t&&Ae(t.length)&&!e.layoutResult?.tubeMapPanels&&!e.tubeMapNodeColors&&!t.some(s=>s.members)&&!e.tubeMapColoring?ze(t,e.tubeMapTubeColors):[]},get hoveredSpan(){let t=e.hoveredNode,n=e.hoveredBubble,o=e.hoverNodeById,s=e.hoverNeighbors;return t!==null?o&&s?St({nodeId:t,nodeById:o,neighbors:s}):void 0:n&&!n.offReference?{start:n.start,end:n.end}:void 0}})).views(e=>({get hoverHighlight(){let t=e.graphRegion,n=e.hoveredSpan;return t&&n&&e.chosenHover!=="off"?{refName:t.refName,assemblyName:t.assemblyName,...n}:void 0}}));function Ec(e){return le(e)&&e.type==="LinearGenomeView"&&typeof e.id=="string"&&typeof e.navToLocString=="function"&&Array.isArray(e.assemblyNames)}function Ic(e){return e.flatMap(t=>le(t)&&Array.isArray(t.views)?[t,...t.views]:[t])}function gt({views:e,connectedViewId:t,assemblyName:n}){let o=Ic(e).filter(r=>Ec(r)).filter(r=>r.assemblyNames.includes(n));return o.find(r=>r.id===t)??(o.length===1?o[0]:void 0)}function xo(e,t){let n=e.assemblyManager;return n?.has(t)?n.get(t)?.name??t:t}function Bc(e,t){let n=H(t,"assemblyNames");return Array.isArray(n)?n.filter(o=>typeof o=="string").map(o=>xo(e,o)):[]}function Ra(e,t,n){n.catch(o=>{console.error(`[GraphGenomeView] ${t}`,o),e.notifyError?.(`${t}: ${o}`,o)})}var Oc=1e3;function Mo(e,t=Oc){let n=Math.max(0,Math.ceil((t-(e.end-e.start))/2));return{...e,start:Math.max(0,e.start-n),end:e.end+n}}function La(e,t){return t?e.map(n=>n.rank===0?{...n,sample:t.assemblyName,haplotype:void 0,refName:t.refName,start:t.start,end:t.end}:n):e}function Sy({session:e,location:t,assembly:n,connectedViewId:o,tracks:s=[]}){let r=gt({views:e.views,connectedViewId:o,assemblyName:n}),a;return r?(Ra(e,`Could not show ${n} ${Be(t)}`,Promise.resolve(r.navToLocString(Ht(t),n))),a=r.id):a=e.addView("LinearGenomeView",{displayName:`${n} \u2014 ${Be(t)}`,init:{assembly:n,loc:Ht(t),tracks:s}}).id,a}function vy({session:e,location:t,assembly:n,connectedViewId:o}){let s=gt({views:e.views,connectedViewId:o,assemblyName:n});return s&&e.addHighlight?.({refName:t.refName,start:t.start,end:t.end,assemblyName:n}),s!==void 0}function va(e,t){let n=t===void 0?void 0:e.tracks.find(o=>H(o,"trackId")===t);return n?Bc(e,n):[]}function Ry({session:e,contributors:t,trackId:n,graphTrackId:o}){let s=va(e,o),r=va(e,n),a=t.filter(d=>r.includes(d.sample)),i=a.length>=2?a:t,c={init:{views:i.map(d=>({assembly:d.sample,loc:Ht(d),...o!==void 0&&s.includes(d.sample)?{tracks:[o]}:{}})),tracks:n?i.slice(1).map(()=>[n]):[],collapseEmptyRows:!0}};e.launchView?Ra(e,"Could not open the synteny view",e.launchView("LinearSyntenyView",c)):e.addView("LinearSyntenyView",c)}var Na=Sa.views(e=>({get host(){let t;try{t=We(e)}catch{return}return Vs(t)?t:void 0}})).views(e=>({get pairedViewId(){return e.host?.id??e.connectedViewId}})).views(e=>({get contributingAssemblies(){let t=e.graph,n=t?ie(t):[];return t?Zr(t,{maxGap:n.length>0?ln(n):1/0}):[]}})).views(e=>({get assemblyResolver(){let{assemblyManager:t}=J(e),n=e.sourceAdapter?.assemblyNameToPanSN,o=new Map(Object.entries(n??{}).map(([r,a])=>[a,r])),s=r=>r!==void 0&&t.has(r)?t.get(r)?.name??r:void 0;return r=>s(o.get(r))??s(r)},get geneTracksByAssembly(){let t=new Map;for(let n of J(e).tracks){let o=H(n,"adapter").type;if(!ht.has(o))continue;let s={trackId:n.trackId,name:H(n,"name"),adapterType:o};for(let r of H(n,"assemblyNames")){let a=xo(J(e),r);t.set(a,[...t.get(a)??[],s])}}return new Map([...t].flatMap(([n,o])=>{let s=rn(o,"");return s?[[n,s]]:[]}))}})).views(e=>({get launchableAssemblies(){return Qr(La(e.contributingAssemblies,e.graphRegion),e.assemblyResolver)},get canHighlightInLinearView(){let t=e.graphRegion;return t!==void 0&&gt({views:[...J(e).views],connectedViewId:e.pairedViewId,assemblyName:t.assemblyName})!==void 0},nodeLaunchTargets(t){let n=e.nodeById?.get(t),o=n?qr(n):void 0,s=o?Ie(e.assemblyResolver,o):void 0,r=e.graphRegion,a=r?e.nodeSpan(t):void 0,i=r&&a?{sample:r.assemblyName,haplotype:void 0,refName:r.refName,...a}:void 0;return{own:o&&s?{location:Mo(o),assembly:s}:void 0,reference:r&&i?{location:Mo(i),assembly:r.assemblyName}:void 0,highlight:r&&i?{location:i,assembly:r.assemblyName}:void 0}}}));var Pa=Na.views(e=>({get walkStripShown(){return _n({walkStrip:e.walkStrip,mode:{drawsNodes:e.modeDrawsNodes},drawsPicture:!!e.layoutResult?.tubeMap||!!e.walkRowBars,walks:e.graph?.paths?.length??0,host:!!e.host})},get walkStripRows(){let t=this.walkStripShown?e.cutWalkRows:void 0;return t?{...t,rows:Oe(t.rows,e.walkRowSamples)}:void 0},get walkStripFrame(){let t=this.walkStripRows;if(t)return et(t,{width:e.paneWidth})},get cutsWholeWalks(){return $n(Q(e.chosenLayoutMode),{walkStrip:e.walkStrip,host:!!e.host})},get walkStripMarks(){let t=this.walkStripRows,n=e.hoveredNode??e.selectedNode,o=n===null?void 0:e.nodeById?.get(n);return t&&o&&e.graph?Fn(e.graph,[t.reference,...t.rows],o):[]},get walkStripLocator(){let t=e.stripHover?e.hoveredNode:null;return t===null?void 0:Dt(e.nodePositions?.[t],n=>({x:n.x*e.scaleX+e.translateX,y:n.y*e.scaleY+e.translateY}))}})).views(e=>({get walkGeneReads(){let t=e.walkRowBars??e.walkStripRows;if(!t||!e.showGenes)return;let n=[],o=0,s=0;for(let r of t.rows){if(!r.axis){s++;continue}let a=Ie(e.assemblyResolver,{sample:r.sample,haplotype:r.haplotype===void 0?void 0:`${r.sample}#${r.haplotype}`}),i=a?e.geneTracksByAssembly.get(a):void 0;if(!a||!i){o++;continue}n.push({row:r.name,trackId:i.trackId,region:{assemblyName:a,refName:r.axis.contig,...vn(r.axis,r.bp)}})}return{reads:n.slice(0,ro),gaps:{untracked:o,unplaced:s,unread:Math.max(0,n.length-ro)}}},get walkRowGeneGaps(){return this.walkGeneReads?.gaps},walkRowLaunchTarget(t,n=e.walkRowBars){let o=n?[n.reference,...n.rows][t]:void 0;if(!o?.axis)return;let s=o.haplotype===void 0?void 0:`${o.sample}#${o.haplotype}`,r=t===0?e.graphRegion?.assemblyName:Ie(e.assemblyResolver,{sample:o.sample,haplotype:s});return{label:o.label,assembly:r,location:{sample:o.sample,haplotype:s,refName:o.axis.contig,...vn(o.axis,o.bp)}}},get walkRowGenes(){let t=e.walkRowBars??e.walkStripRows;if(!t||!e.showGenes)return;let n=new Map(e.walkGeneFeatures??[]);return e.geneFeatures&&n.set(t.reference.name,e.geneFeatures),n.size?Ko([t.reference,...t.rows],n):void 0}}));var Aa=Pa.views(e=>({get xIsReferenceBp(){return e.layoutResult?.referenceAxis===!0&&Q(e.drawnLayoutMode??e.chosenLayoutMode).cutMargins}})).views(e=>({get hostPlacesX(){let{host:t,graphRegion:n}=e;return t!==void 0&&t.initialized&&n!==void 0&&e.xIsReferenceBp&&!t.dynamicBlocks.contentBlocks.some(o=>o.refName===n.refName&&o.reversed)}})).views(e=>({get hostBpFrame(){let{host:t,graphRegion:n}=e;return t?.initialized&&n?Ys(t,n):void 0}})).views(e=>({get hostFrame(){return e.hostPlacesX?e.hostBpFrame:void 0},get tubeMapPicture(){let t=e.layoutResult?.tubeMap;return t?_t(t):void 0},get tubeMapReference(){let t=e.layoutResult?.tubeMap;return t?Ct(t):void 0},get tubeMapDeviations(){let t=e.layoutResult?.tubeMap;return t?.coarse?Gt(t,t.coarse.deviations):[]},get tubeMapConnectedBoxes(){let t=this.tubeMapReference,{layoutResult:n}=e;return t&&!n?.referenceAxis&&!n?.tubeMapPanels?[...t.values()].flat():void 0}})).views(e=>({get tubeMapGenes(){let t=e.tubeMapReference;return e.showGenes&&!e.host&&t&&e.backboneGenes&&!e.layoutResult?.tubeMapPanels?Pr(t,e.backboneGenes):[]},get referenceStripApplies(){return!!e.host?.initialized&&!!e.layoutResult&&e.drawsNodes&&!e.hostPlacesX&&!e.facetPanels}})).views(e=>({get referenceStripBlocks(){let{graph:t}=e;if(!e.showReferenceStrip||!e.referenceStripApplies||!t)return[];let n=jr(t,{colorScheme:e.effectiveColorScheme,referenceRamp:e.referenceRamp,walks:e.walkLift?.walks}),o=e.walkLift?void 0:e.openBubbleFocus;return o?n.map(s=>o.nodeIds.has(s.node)?s:{...s,colors:[Te],faded:!0}):n}})).views(e=>({get referenceStripShown(){return e.referenceStripBlocks.length>0&&e.hostBpFrame!==void 0},get referenceStripOverhangs(){let t=e.hostBpFrame;if(!t||e.referenceStripBlocks.length===0)return!1;let{left:n,right:o}=Yr(e.referenceStripBlocks,t,e.paneWidth);return n>0||o>0},get referenceStripFaded(){return e.referenceStripBlocks.some(t=>t.faded)}})).views(e=>({get referenceStripLit(){if(!e.referenceStripShown)return;let t=r=>({x:r.x*e.scaleX+e.translateX,y:r.y*e.scaleY+e.translateY}),n=e.hoveredNode===null?e.hoveredBubble:null;if(n&&!n.offReference){let r=e.bubbleHalos.find(a=>Bt(a.bubble,n));return{start:n.start,end:n.end,anchor:r?t(r.labelAt):void 0}}let o=e.hoveredNode??e.selectedNode,s=o===null?void 0:e.nodeSpan(o);return s&&o!==null?{...s,anchor:Dt(e.nodePositions?.[o],t)}:void 0},referenceStripNodeAt(t,n){let o=e.hostBpFrame;return e.referenceStripShown&&o?Ur(e.referenceStripBlocks,o,t,n):void 0},get paperCss(){return qs(e.darkMode?en:Qt)},get referenceStripZonePx(){return e.referenceStripShown?Vr:0}}));var I0=3e3,B0=350,O0=34;function Cc(e){let t=[0];for(let n=1;n<e.length;n++)t.push(t[n-1]+Math.hypot(e[n].x-e[n-1].x,e[n].y-e[n-1].y));return t}function Gc(e,t){if(e.length===1||t===1)return Array.from({length:t},()=>({...e[0]}));let n=Cc(e),o=n.at(-1),s=[],r=1;for(let a=0;a<t;a++){let i=o*a/(t-1);for(;r<e.length-1&&n[r]<i;)r++;let c=n[r]-n[r-1],d=c>0?(i-n[r-1])/c:0,l=e[r-1],p=e[r];s.push({x:l.x+(p.x-l.x)*d,y:l.y+(p.y-l.y)*d})}return s}var _c=400,Ta=1.8,$c=.1;function C0(e,t,n,o,s){let r=b=>({x:(b.x*t.scaleX+t.translateX-o.translateX)/o.scaleX,y:(b.y*t.scaleY+t.translateY-o.translateY)/o.scaleY}),a={};for(let[b,x]of Object.entries(n)){let S=e[b];S?.length&&x.length&&(a[b]=Gc(S.map(r),x.length))}let i=new Map,c=(b,x)=>{let S=i.get(b);S?S.push(x):i.set(b,[x])};for(let b of s){let{from:x,to:S}=b;if(x!==S&&n[x]?.length&&n[S]?.length){let P=fe(b);c(x,{id:S,side:P.to}),c(S,{id:x,side:P.from})}}let d=new Map,l=b=>d.get(b.id)??(b.side==="start"?a[b.id][0]:a[b.id].at(-1)),p=Object.keys(a),u=[];for(let b of p)for(let x of i.get(b)??[]){if(a[x.id]||d.has(x.id))continue;let S=i.get(x.id).find(P=>P.id===b);d.set(x.id,{...l(S)}),p.push(x.id),u.push(x.id)}let f=new Map(u.map((b,x)=>[b,x])),g=new Float64Array(u.map(b=>d.get(b).x)),w=new Float64Array(u.map(b=>d.get(b).y)),h=new Float64Array(u.length),m=new Float64Array(u.length),k=u.map((b,x)=>i.get(b).flatMap(S=>{let P=f.get(S.id);if(P===void 0){let I=l(S);return h[x]+=I.x,m[x]+=I.y,[]}return[P]})),y=u.map(b=>i.get(b).length);for(let b=0;b<_c;b++){let x=0;for(let S=0;S<u.length;S++){let P=h[S],I=m[S];for(let B of k[S])P+=g[B],I+=w[B];let V=Ta*(P/y[S]-g[S]),_=Ta*(I/y[S]-w[S]);x=Math.max(x,Math.abs(V*o.scaleX)+Math.abs(_*o.scaleY)),g[S]+=V,w[S]+=_}if(x<$c)break}u.forEach((b,x)=>{a[b]=n[b].map(()=>({x:g[x],y:w[x]}))});for(let[b,x]of Object.entries(n))a[b]??=x.map(S=>({...S}));return a}function Fc(e,t){let n=0,o=1/0;return e.forEach((s,r)=>{let a=(s.x-t.x)**2+(s.y-t.y)**2;a<o&&(o=a,n=r)}),n}function G0(e,t,n,o){let s=(r,a)=>{let i=n[r],c=o[r];if(!i||!c||c.length===0)return{x:0,y:0};let d=Fc(c,a);return{x:i[d].x-c[d].x,y:i[d].y-c[d].y}};return Object.fromEntries(Object.entries(e).map(([r,a])=>{let i=t[Number(r)],c=s(i?.from??"",a[0]),d=s(i?.to??"",a.at(-1));return[r,a.map((l,p)=>{let u=a.length>1?p/(a.length-1):0;return{x:l.x+c.x+(d.x-c.x)*u,y:l.y+c.y+(d.y-c.y)*u}})]}))}function Ea(e,t,{ids:n,alpha:o}){let s=(r,a)=>{for(let i=0;a&&i<a.count;i++){let c=r[a.start+i];c.color=xn(c.color,o)}};for(let r of n)s(e.nodeStrokes,e.nodeStrokeRuns.get(r));t.forEach(({from:r,to:a},i)=>{(n.has(r)||n.has(a))&&(s(e.edgeCurves,e.edgeCurveRuns.get(i)),s(e.arrows,e.arrowRuns.get(i)))})}function _0(e){return e<.5?4*e*e*e:1-(-2*e+2)**3/2}function $0(e,t,n,o){for(let[s,r]of Object.entries(e)){let a=t[s],i=n[s];!a||!i||r.forEach((c,d)=>{c.x=o===1?i[d].x:a[d].x+(i[d].x-a[d].x)*o,c.y=o===1?i[d].y:a[d].y+(i[d].y-a[d].y)*o})}}var Ia=20,Dc=8,Hc=19,Ba=Je+Hc,Wc=48,Xc=.05,Oa=6;function Vc(e){let t=e.length-Oa;return t>0?`${e.slice(0,Oa).join(", ")} and ${t} more`:e.join(", ")}function jc(e){if(e.kind==="deletion")return`deletion of ${Ue(e.length)}`;if(e.kind==="substitution")return`substitution ${e.seq}`;let t=e.seq??"",n=t.length>Ia?`${t.slice(0,Ia)}\u2026`:t;return`insertion of ${Ue(t.length)} ${n}`.trim()}function Yc(e,t,n){let o={substitution:!1,insertion:!1,deletion:!1};if(e&&t&&vr(t.yScale)){let s=3;for(let r of e.mismatches)if(!o[r.kind]&&Rr(r,{x:t.x,width:n})&&(o[r.kind]=!0,--s===0))break}return o}function Uc(e,t,n){if(!(!e||!t))return Rt(e.rowPx,e.barPx)?n:{untracked:0,unread:0,...n,crowded:!0}}var bk=Aa.views(e=>({get paneCeiling(){return Math.max(Zt,e.paneHeight??Ks)},get fitRoom(){return e.host?this.canvasHeight:this.paneCeiling},get walkRowPitch(){let t=e.walkRowBars;if(!t)return;let n=this.fitRoom,o=(e.walkRowGroups?.sections.length??0)*Fr;return Lt(t.rows.length+1,n-this.fitPadTopBase-G-o)},get walkRowPlacement(){let t=this.walkRowPitch;return t?Xr(e.walkRowGroups?.sections??[],t.rowPx):void 0},get walkRowGeneKey(){return Uc(this.walkRowPitch,!!e.walkRowGenes?.size,e.walkRowGeneGaps)},get drawnRowLabels(){let t=this.walkRowPlacement,n=_e(e.walkRowBars,e.layoutResult,this.walkRowPitch);return e.walkRowBars&&t?n.map((o,s)=>({...o,y:t.rowY(s)})):n},get fitPadLeft(){return Math.max(G,...this.drawnRowLabels.map(t=>Wo(t.label,0).x1+6))},get layoutBounds(){let t=e.layoutResult,n=e.walkRowBars,o=n&&t?.extent?Ge(n,this.walkRowPitch):void 0;return t?rt(t,{region:e.graphRegion,extent:o&&{...o,maxY:o.maxY+(this.walkRowPlacement?.headersPx??0)}}):void 0},get hoveredWalkRowText(){let t=e.walkRowBars,n=e.hoveredWalkRow;if(!t||n===null||this.walkRowPitch?.readouts!==!1)return;let o=t.reference.name===n,s=o?t.reference:t.rows.find(r=>r.name===n);return s?{label:s.label,readout:Uo(s,o?void 0:t.reference,t.unit,s.call)}:void 0},walkRowAt(t,n){let o=e.walkRowBars,s=this.walkRowPitch,r=this.walkRowPlacement;if(!o||!s||!r)return;let a=r.rowAt((n-e.translateY)/e.scaleY,o.rows.length+1),i=[o.reference,...o.rows][a],c=r.rowY(a)*e.scaleY+e.translateY,d=(t-e.translateX)/e.scaleX-o.origin;return i&&Math.abs(n-c)<=s.barPx/2+2&&d>=0&&d<=i.bp?a:void 0},get fitPadTopBase(){let t=Tr(e.tubeMapGenes);return G+Math.max(0,t-1)*Ar+e.referenceStripZonePx},get legendRoom(){let t=this.layoutBounds,{width:n,height:o}=e.legendSize;if(!t||t.w<=0||n===0||e.facetPanels||e.tubeMapReads)return;if(e.hostPlacesX)return"top";let s=this.fitPadTopBase,r=this.fitRoom,a=l=>(e.paneWidth-this.fitPadLeft-l)/t.w,i=l=>e.pixelRows?t.h+l+G<=r?1/0:0:(r-l-G)/t.h,c=Math.min(a(n+2*ue),i(s));return Math.min(a(G),i(s+o+ue))>=c?"top":"right"},get fitPadTop(){return this.fitPadTopBase+(this.legendRoom==="top"?e.legendSize.height+ue:0)},get fitPadRight(){return this.legendRoom==="right"?Math.max(G,e.legendSize.width+2*ue):G},get minFitScale(){let t=this.layoutBounds,n=e.layoutResult,o=n?.tubeMap?.layout.tracks[0]?.width;return t&&t.h>0&&o&&!n.referenceAxis?Math.min(Js/o,(this.paneCeiling-this.fitPadTop-G)/t.h):0},get facetSpec(){let{field:t,domain:n,columns:o}=e.facetSetting;return t===""?void 0:n.length===0&&o===void 0?t:{field:t,domain:[...n],...o===void 0?{}:{columns:o}}},get facetPlacement(){let t=e.facetPanels,{field:n,domain:o}=e.facetSetting;return t?Et(t.map(s=>s.walks[0].name),e.hostPlacesX||n===""?"walk":n,o):void 0},facetGridIn(t){let n=this.facetPlacement,o=this.layoutBounds;return n&&o&&o.w>0?At({count:n.count,bounds:o,pixelRows:e.pixelRows,width:e.paneWidth,room:t,columns:e.hostPlacesX?1:n.columns??e.facetSetting.columns}):void 0},get facetGrid(){return this.facetGridIn(this.fitRoom-Ba)},get tooltipRightPx(){let{width:t,height:n}=e.legendSize,o=ue+e.referenceStripZonePx+n;return!e.facetPanels&&t>0&&o>this.canvasHeight-Wc?t+2*ue:Dc},get canvasHeight(){let t=this.layoutBounds,n=e.paneWidth-G-this.fitPadRight,o=this.paneCeiling;if(!t)return o;let s=this.facetGrid;if(s)return Math.max(Zt,s.total+Ba);let r=Math.max(Zt,e.legendSize.height+2*ue+e.referenceStripZonePx);return e.pixelRows?Math.min(o,Math.max(r,t.h+this.fitPadTop+G)):t.w>0&&n>0?Math.min(o,Math.max(r,t.h*Math.max(n/t.w,this.minFitScale)+this.fitPadTop+G)):o},get viewBox(){let t=this.facetGrid;return t?{width:t.width,height:t.height}:{width:e.paneWidth,height:this.canvasHeight}},get fittedTransform(){let t=this.layoutBounds,n=this.facetGrid;return t?n?$e(t,n.width,n.height,e.pixelRows,{padLeft:oe,padTop:oe,padRight:oe,padBottom:oe}):$e(t,e.paneWidth,this.canvasHeight,e.pixelRows,{minScale:this.minFitScale,padLeft:this.fitPadLeft,padTop:this.fitPadTop,padRight:this.fitPadRight}):void 0}})).views(e=>({viewportToBuild(){return Yn(na(e),ea)},applySelection(t){let n=e.selectedNode;t.setNodeHighlights(n===null?new Map:new Map([[n,Qs]]))},get hoverLayerNode(){let{litNode:t,selectedNode:n}=e;return t===n?null:t},get paintTransform(){let t=In();return{scaleX:e.scaleX*t,scaleY:e.scaleY*t,translateX:e.translateX*t,translateY:e.translateY*t,dpr:t}}})).views(e=>({paint(t){t.updateTransform(e.paintTransform),t.render(e.referenceStripShown?[0,0,0,0]:e.darkMode?en:Qt)}})).views(e=>({buildDrawing(t,n){let{graph:o,nodeById:s,layoutResult:r,deletionDrawing:a}=e;if(!o||!s||!r||!a)return;pt(e.viewportDirty,e.positionsVersion);let i=yn(()=>e.viewportToBuild()),c=vt({...st(r,a,{drawsRows:!!e.walkRowBars}),graph:o,nodeById:s,colorScheme:e.effectiveColorScheme,contigThickness:e.contigThickness,connectorThickness:e.connectorThickness,drawPaths:n,nodeWidth:e.nodeWidth,highlight:t,axis:yn(()=>e.axisScale),linearLayout:e.linearLayout,viewportBounds:i,referenceRamp:e.referenceRamp,version:e.positionsVersion}),d=e.morphEntering;return d?.layout===r&&Ea(c,o.edges,d),{batch:c,viewportBounds:i}},get overlayLabels(){return fr(e)},hoveredOn(t){let n=e.hoveredNode,o=n?e.nodeById?.get(n):void 0;return o?br(t,o.id,o.length)??"not on this walk":void 0},figureSpec(){let t=e.graphRegion,n=e.sourceAdapter,o=n?.assemblyNameToPanSN,s=t&&`${t.refName}:${t.start}-${t.end}`,r=De(e.sourceGfaLocation),a=n?.type==="GbzBaseSyntenyAdapter"?De(n.gbzDbLocation):void 0,i=r?{gfa:r,region:s}:a&&t&&s?{gbz:{db:a,index:De(n.haplotypeIndexLocation),region:s,haplotypes:e.cutHaplotypes?.map(u=>o?.[u]??u),referenceSample:n.referenceSample||o?.[t.assemblyName]||t.assemblyName,context:n.context,snarls:e.cutsWholeWalks?"overlapping":n.subgraphSnarls}}:void 0;if(!i)return;let c=e.showGenes?e.geneTrack:void 0,d=c?J(e).tracks.find(u=>u.trackId===c.trackId):void 0,l=d?Ao(H(d,"adapter"),"gffGzLocation"):void 0,p=l?.type==="Gff3TabixAdapter"?{file:De(l.gffGzLocation),index:De(l.index?.location),format:"gff3"}:void 0;return JSON.parse(JSON.stringify({...i,genes:p?.file&&p.index?p:void 0,referencePath:e.referencePath||void 0,layout:e.chosenLayoutMode,...Un({engine:e.layoutEngine,quality:e.layoutQuality,linearLayout:e.linearLayout,bubbleSpread:e.bubbleSpread,showDeletionEdges:e.showDeletionEdges,colorScheme:e.chosenColorScheme,nodeWidth:e.nodeWidth,contigThickness:e.contigThickness,connectorThickness:e.connectorThickness,colorDomain:e.statedColorDomain}),walks:e.walkLayers.length?e.walkLayers.map(u=>u.color?u:u.walk):void 0,facet:e.walkLayers.length>1?e.facetSpec:void 0,walkStrip:e.walkStripShown||void 0,walkRowSamples:e.walkStripShown?e.walkRowSamples:void 0,width:e.paneWidth,height:e.paneCeiling}))},get figureUnavailable(){return e.layoutResult?e.walkRowGroups?"The SVG export cannot group walk rows yet: set Group by... to None first":e.drawsNodes||e.walkRowBars?void 0:`${Q(e.chosenLayoutMode).label} draws a picture of its own, which the SVG export does not`:"Nothing is drawn yet"},get figureSpecUnavailable(){return e.drawsNodes?this.figureSpec()?void 0:"bandage-figure reads a graph cut from a gbz-base track or a GFA url":`bandage-figure draws no ${Q(e.chosenLayoutMode).label} layout`},figure(){let{graph:t,layoutResult:n}=e;return t&&n&&!this.figureUnavailable?qn(t,n,{width:e.paneWidth,height:e.paneCeiling,walks:e.walkLayers,facet:e.facetSpec,colorScheme:e.effectiveColorScheme,nodeWidth:e.nodeWidth,showDeletionEdges:e.showDeletionEdges,linearLayout:e.linearLayout,contigThickness:e.contigThickness,connectorThickness:e.connectorThickness,region:e.graphRegion,colorDomain:e.statedColorDomain,genes:e.showGenes?e.backboneGenes:void 0,walkRows:e.walkRowBars,walkRowPitch:e.walkRowPitch,rowGenes:e.walkRowGenes,rowGeneGaps:e.walkRowGeneGaps,walkStrip:e.walkStripRows&&{rows:e.walkStripRows,rowGenes:e.walkRowGenes,rowGeneGaps:e.walkRowGeneGaps},spec:this.figureSpecUnavailable?void 0:this.figureSpec()}):void 0},get tubeMapFrame(){let t=e.layoutResult?.tubeMap;return t?qt(t,{scaleX:e.scaleX,translateX:e.translateX,scaleY:e.scaleY,translateY:e.translateY,usableHeight:e.canvasHeight-e.fitPadTop-G}):void 0}})).views(e=>({get tubeMapRulerBoxes(){let t=e.tubeMapReference;return t&&!e.hostPlacesX&&!e.layoutResult?.tubeMapPanels?On(t):void 0},get tubeMapPanelRulerBoxes(){let{layoutResult:t}=e,n=t?.tubeMapPanels?.at(-1);return n&&t?.referenceAxis&&!e.hostPlacesX?On(Ct(n.result.tubeMap)):void 0},get connectorZoneBottom(){let t=e.tubeMapPicture,n=e.tubeMapFrame;return t&&n?n.y(t.bounds.minY)-2:0},get tubeMapConnectors(){let t=e.tubeMapConnectedBoxes,n=e.tubeMapFrame,o=t&&n?e.hostBpFrame:void 0;return t&&n&&o?wr(t,s=>s*o.scale+o.translateX,n.x,e.paneWidth):[]},get tubeMapPanelPictures(){let t=e.layoutResult?.tubeMapPanels;if(!t)return;let n=new Set(e.hoveredRowWalks),o=e.tubeMapColoring,s=a=>{let i=a.paths??[];return(o?Ft(i,a.referencePath,o.valueOf,o.palette):Ze(i,a.referencePath)).map((d,l)=>{let p=i[l].name;return n.size>0&&!n.has(p)&&W(p).name!==a.referencePath?Te:d})},{field:r}=e.facetSetting;return t.map(a=>{let i=a.result.tubeMap,{graph:c,coarse:d}=i;return{panel:a,label:a.label??(r==="walk"?e.walkLabel(a.paths[0]):a.key),picture:_t(i),tubeColors:s(c),nodeColors:e.tubeMapNodeColors?ut(c,e.effectiveColorScheme,e.referenceRamp):void 0,deviations:d?Gt(i,d.deviations):[]}})}})).views(e=>({get hoveredMember(){let t=e.hoveredNode,n=t===null?void 0:e.hoverDrawing?.members.get(t);if(!n)return t;let o=e.hoveredAt,s=e.hoveredPanel,r=s===null?void 0:this.tubeMapPanelViews?.[s],a;return r?.panel.result.tubeMap.layout.nodes.forEach(c=>{c.name===t&&(a=c)}),(o&&r&&a?Gr(n,c=>e.nodeSpan(c),r.frame.x(a.x),r.frame.x(a.x+a.pixelWidth),o.x):void 0)??n[0]},get tubeMapPanelHover(){let t=e.hoveredNode,n=e.tubeMapPanelPictures;if(t===null||!n)return;let o=this.hoveredMember??t;return n.map(({panel:s})=>{let r=s.result.tubeMap,a=Cr(r,o);return a?{box:a,..._r(r.graph,a)}:void 0})},get tubeMapPanelViews(){let t=e.tubeMapPanelPictures,n=e.layoutResult;if(!t||!n)return;let o=t.length*Cn,s=t.reduce((c,d)=>c+d.panel.height,0),r=e.canvasHeight-e.fitPadTop-G-o,a=e.scaleY*(n.referenceAxis&&s>0?Math.max(Xc,Math.min(1,r/s)):1),i=e.translateY;return t.map(c=>{let{panel:d}=c,l=d.result.extent?.minY??0,p=i,u=p+Cn;return i=u+d.height*a,{...c,frame:qt(d.result.tubeMap,{scaleX:e.scaleX,translateX:e.translateX,scaleY:a,translateY:u-l*a,usableHeight:1/0}),titleTop:p,top:u,bottom:i}})}})).views(e=>({tubeMapPanelAt(t){let n=e.tubeMapPanelViews?.findIndex(o=>o.titleTop<=t&&t<=o.bottom)??-1;return n<0?null:n}})).views(e=>({paintHover(t,n){let o=e.tubeMapPicture,s=e.tubeMapFrame,r=e.hoverLayerNode;if(o&&s){let{ctx:a,canvas:i}=t,c=In();a.setTransform(1,0,0,1,0,0),a.clearRect(0,0,i.width,i.height),a.setTransform(c,0,0,c,0,0);let d=e.tubeMapPanelViews;d?$r(a,d,e.tubeMapPanelHover,{width:e.paneWidth,lit:r!==null}):Sr(a,o,{...s,width:e.paneWidth,highlightNode:r}),kr(a,e.tubeMapConnectors,e.connectorZoneBottom,r),a.setTransform(1,0,0,1,0,0)}else t.uploadGeometry(n),t.setNodeHighlights(r===null?new Map:new Map([[r,oo]])),t.setEdgeHighlight(e.hoveredEdge,oo),t.updateTransform(e.paintTransform),t.renderHighlights()}})).views(e=>{let t=wt(()=>{let n=e.layoutResult,o=n?.tubeMapPanels!==void 0,s=o?[]:n?.tubeMap?.layout.reads??[],r=e.drawnGraph?.paths??[],a=e.tubeMapColoring;return{bundled:r.some(i=>i.members),values:a&&s.length===0?[...[...a.palette].map(([i,c])=>({value:i,color:c})),...a.unvalued?[{value:`${a.field}: none`,color:Ir}]:[]]:void 0,roles:!(a&&s.length===0)&&(o||n?.tubeMap!==void 0&&(!!e.tubeMapNodeColors||s.length===0&&(!Ae(r.length)||r.some(i=>i.members)))),haplotypeTube:!o&&e.tubeMapNodeColors?$t[0]:Er,logWidths:n?.tubeMap!==void 0&&!n.referenceAxis,foldBp:e.tubeMapDeviations.length>0?e.tubeMapFold:void 0,forwardReads:s.some(i=>!i.is_reverse),reverseReads:s.some(i=>i.is_reverse),...Yc(o?void 0:e.tubeMapPicture,e.tubeMapFrame,e.paneWidth)}},{equals:(n,o)=>JSON.stringify(n)===JSON.stringify(o)});return{get tubeMapKeys(){return t.get()}}}).views(e=>({tubeMapUnder(t){let n=e.tubeMapPanelViews;if(n){let a=e.tubeMapPanelAt(t),i=a===null?void 0:n[a];return i&&{drawing:i.panel.result.tubeMap,...i}}let o=e.layoutResult?.tubeMap,s=e.tubeMapPicture,r=e.tubeMapFrame;return o&&s&&r?{drawing:o,picture:s,frame:r}:void 0}})).views(e=>({tubeMapNodeAt(t,n){let o=e.tubeMapUnder(n);return(o?to(o.drawing,o.frame,t,n):null)??yr(e.tubeMapConnectors,e.connectorZoneBottom,t,n)??null},tubeAt(t,n){let o=e.tubeMapUnder(n);if(!o)return null;let{picture:s,frame:r}=o,a=Nr(s,r,t,n),i=a?.readId??Lr(s,r,t,n);return i===void 0?null:{track:i,mismatch:a}},get hoveredTubeText(){let t=e.hoveredTube,n=e.layoutResult?.tubeMap?.layout,o=t&&n?.reads.find(a=>a.id===t.track);if(t&&o){let a=o.mapping_quality;return{label:o.name??"read",readout:[`MAPQ ${a??"unknown"}`,`${o.is_reverse?"reverse":"forward"} strand`,...t.mismatch?[jc(t.mismatch)]:[]].join(", ")}}let s=t?e.hoverGraph?.paths?.[t.track]:void 0,r=s?.members;return r?{label:`${r.length} haplotypes`,readout:`one route: ${Vc(r.map(a=>e.walkLabel(a)))}`}:s?{label:e.walkLabel(s.name),readout:"haplotype"}:void 0}}));var Ca=K(Z("path",{d:"M9.01 14H2v2h7.01v3L13 15l-3.99-4zm5.98-1v-3H22V8h-7.01V5L11 9z"}),"CompareArrows");var Ga=K(Z("path",{d:"M17 5h-2V3h2zm-2 16h2v-2.59L19.59 21 21 19.59 18.41 17H21v-2h-6zm4-12h2V7h-2zm0 4h2v-2h-2zm-8 8h2v-2h-2zM7 5h2V3H7zM3 17h2v-2H3zm2 4v-2H3c0 1.1.9 2 2 2M19 3v2h2c0-1.1-.9-2-2-2m-8 2h2V3h-2zM3 9h2V7H3zm4 12h2v-2H7zm-4-8h2v-2H3zm0-8h2V3c-1.1 0-2 .9-2 2"}),"HighlightAlt");var So=K(Z("path",{d:"M3 16h5v-2H3zm6.5 0h5v-2h-5zm6.5 0h5v-2h-5zM3 20h2v-2H3zm4 0h2v-2H7zm4 0h2v-2h-2zm4 0h2v-2h-2zm4 0h2v-2h-2zM3 12h8v-2H3zm10 0h8v-2h-8zM3 4v4h18V4z"}),"LineStyle");var zc="Linear genome view",Kc="Linear synteny view",qc="No synteny track in this session aligns these assemblies";function _a({label:e,icon:t,entries:n,entryLabel:o,onSelect:s,disabledHelpText:r,nameTheOnlyEntry:a=!0}){let[i]=n,c=r?[{label:e,icon:t,disabled:!0,disabledHelpText:r,onClick:()=>{}}]:[];return n.length===0?c:n.length===1&&i?[{label:a?`${e} \u2014 ${o(i)}`:e,icon:t,onClick:s(i)}]:[{label:e,icon:t,type:"subMenu",subMenu:n.map(d=>({label:o(d),onClick:s(d)}))}]}function Ik({contributors:e,syntenyTracks:t,onShowLinear:n,onShowSynteny:o}){let s=t[0]?.coverage??e.length;return[..._a({label:zc,icon:So,entries:e,entryLabel:r=>`${r.sample} ${Be(r)}`,onSelect:r=>()=>{n({location:r,assembly:r.sample})}}),...e.length>=2?_a({label:`${Kc} (${s} assemblies)`,icon:Ca,entries:t,entryLabel:r=>r.coverage<s?`${r.name} (${r.coverage} of ${s})`:r.name,nameTheOnlyEntry:!1,disabledHelpText:qc,onSelect:r=>()=>{o(r.trackId)}}):[]]}function Bk({own:e,reference:t,highlight:n,onShowLinear:o,onHighlight:s}){let r=[e?{label:`Open in ${e.assembly} \u2014 ${Be(e.location)}`,target:e}:void 0,t&&t.assembly!==e?.assembly?{label:`Open in ${t.assembly} \u2014 around this node`,target:t}:void 0].filter(a=>a!==void 0);return[...s&&n?[{label:`Highlight in ${n.assembly}`,icon:Ga,onClick:()=>{s(n)}}]:[],...r.map(({label:a,target:i})=>({label:a,icon:So,onClick:()=>{o(i)}}))]}var _k=K(Z("path",{d:"M19 15.18V7c0-2.21-1.79-4-4-4s-4 1.79-4 4v10c0 1.1-.9 2-2 2s-2-.9-2-2V8.82C8.16 8.4 9 7.3 9 6c0-1.66-1.34-3-3-3S3 4.34 3 6c0 1.3.84 2.4 2 2.82V17c0 2.21 1.79 4 4 4s4-1.79 4-4V7c0-1.1.9-2 2-2s2 .9 2 2v8.18c-1.16.41-2 1.51-2 2.82 0 1.66 1.34 3 3 3s3-1.34 3-3c0-1.3-.84-2.4-2-2.82"}),"Route");var Hk=K(Z("path",{d:"M19.14 12.94c.04-.3.06-.61.06-.94 0-.32-.02-.64-.07-.94l2.03-1.58c.18-.14.23-.41.12-.61l-1.92-3.32c-.12-.22-.37-.29-.59-.22l-2.39.96c-.5-.38-1.03-.7-1.62-.94l-.36-2.54c-.04-.24-.24-.41-.48-.41h-3.84c-.24 0-.43.17-.47.41l-.36 2.54c-.59.24-1.13.57-1.62.94l-2.39-.96c-.22-.08-.47 0-.59.22L2.74 8.87c-.12.21-.08.47.12.61l2.03 1.58c-.05.3-.09.63-.09.94s.02.64.07.94l-2.03 1.58c-.18.14-.23.41-.12.61l1.92 3.32c.12.22.37.29.59.22l2.39-.96c.5.38 1.03.7 1.62.94l.36 2.54c.05.24.24.41.48.41h3.84c.24 0 .44-.17.47-.41l.36-2.54c.59-.24 1.13-.56 1.62-.94l2.39.96c.22.08.47 0 .59-.22l1.92-3.32c.12-.22.07-.47-.12-.61zM12 15.6c-1.98 0-3.6-1.62-3.6-3.6s1.62-3.6 3.6-3.6 3.6 1.62 3.6 3.6-1.62 3.6-3.6 3.6"}),"Settings");var jk=K(Z("path",{d:"M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5M12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5m0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3"}),"Visibility");export{K as a,Ge as b,$n as c,ei as d,ti as e,ni as f,Dn as g,Hn as h,Di as i,zt as j,rc as k,Q as l,Rs as m,jk as n,yi as o,ki as p,G as q,Vt as r,ks as s,vi as t,Ri as u,wh as v,Jt as w,Zs as x,Ah as y,Th as z,Eh as A,Ih as B,Bh as C,Oh as D,Ch as E,Gh as F,uc as G,pt as H,_h as I,$h as J,Fh as K,na as L,Dh as M,Wf as N,ic as O,Xf as P,Kr as Q,ww as R,ba as S,vw as T,le as U,Pw as V,Ew as W,qr as X,Be as Y,Ic as Z,xo as _,Bc as $,Sy as aa,vy as ba,Ry as ca,I0 as da,B0 as ea,O0 as fa,C0 as ga,G0 as ha,_0 as ia,$0 as ja,Dc as ka,Hc as la,Ba as ma,bk as na,So as oa,Ik as pa,Bk as qa,_k as ra,Hk as sa};
4
- //# sourceMappingURL=chunk-IJQTSJGT.js.map