igv 2.13.3 → 2.13.5

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/igv.esm.js CHANGED
@@ -21237,6 +21237,8 @@ const FRAME_HEIGHT = 25;
21237
21237
  const FRAME_BORDER = 5;
21238
21238
  const BP_PER_PIXEL_THRESHOLD = 1 / 10;
21239
21239
 
21240
+ const bppFeatureFetchThreshold = 10;
21241
+
21240
21242
  class SequenceTrack {
21241
21243
 
21242
21244
  constructor(config, browser) {
@@ -21289,7 +21291,6 @@ class SequenceTrack {
21289
21291
  ]
21290
21292
  }
21291
21293
 
21292
-
21293
21294
  contextMenuItemList(clickState) {
21294
21295
  const viewport = clickState.viewport;
21295
21296
  if (viewport.referenceFrame.bpPerPixel <= 1) {
@@ -21340,7 +21341,6 @@ class SequenceTrack {
21340
21341
  }
21341
21342
  }
21342
21343
 
21343
-
21344
21344
  translateSequence(seq) {
21345
21345
 
21346
21346
  const threeFrame = [[], [], []];
@@ -21367,9 +21367,11 @@ class SequenceTrack {
21367
21367
  }
21368
21368
 
21369
21369
  async getFeatures(chr, start, end, bpPerPixel) {
21370
+
21370
21371
  start = Math.floor(start);
21371
21372
  end = Math.floor(end);
21372
- if (bpPerPixel && bpPerPixel > 1) {
21373
+
21374
+ if (bpPerPixel && bpPerPixel > bppFeatureFetchThreshold) {
21373
21375
  return null
21374
21376
  } else {
21375
21377
  const sequence = await this.browser.genome.sequence.getSequence(chr, start, end);
@@ -21388,7 +21390,6 @@ class SequenceTrack {
21388
21390
 
21389
21391
  let sequence = options.features.sequence;
21390
21392
  if(!sequence) {
21391
- console.error("No sequence");
21392
21393
  return
21393
21394
  }
21394
21395
 
@@ -21555,17 +21556,9 @@ class Viewport {
21555
21556
  this.alert = new AlertDialog(this.$viewport.get(0));
21556
21557
  }
21557
21558
 
21558
- this.$content = $$1("<div>", {class: 'igv-viewport-content'});
21559
- this.$viewport.append(this.$content);
21560
-
21561
- this.$content.height(this.$viewport.height());
21562
- this.contentDiv = this.$content.get(0);
21559
+ this.contentTop = 0;
21560
+ this.contentHeight = this.$viewport.height();
21563
21561
 
21564
- // this.$canvas = $('<canvas>')
21565
- // this.$content.append(this.$canvas)
21566
- //
21567
- // this.canvas = this.$canvas.get(0)
21568
- // this.ctx = this.canvas.getContext("2d")
21569
21562
 
21570
21563
  this.$viewport.width(width);
21571
21564
 
@@ -21581,7 +21574,8 @@ class Viewport {
21581
21574
  if (!this.messageDiv) {
21582
21575
  this.messageDiv = document.createElement('div');
21583
21576
  this.messageDiv.className = 'igv-viewport-message';
21584
- this.contentDiv.append(this.messageDiv);
21577
+ //this.contentDiv.append(this.messageDiv)
21578
+ this.$viewport.append($$1(this.messageDiv));
21585
21579
  }
21586
21580
  this.messageDiv.textContent = message;
21587
21581
  this.messageDiv.style.display = 'inline-block';
@@ -21610,15 +21604,15 @@ class Viewport {
21610
21604
 
21611
21605
  setTop(contentTop) {
21612
21606
 
21613
- const viewportHeight = this.$viewport.height();
21614
- const viewTop = -contentTop;
21615
- const viewBottom = viewTop + viewportHeight;
21616
-
21617
- this.$content.css('top', `${contentTop}px`);
21607
+ this.contentTop = contentTop;
21608
+ this.$viewport.height();
21618
21609
 
21619
- if (undefined === this.canvasVerticalRange || this.canvasVerticalRange.bottom < viewBottom || this.canvasVerticalRange.top > viewTop) {
21620
- this.repaint();
21621
- }
21610
+ //this.$content.css('top', `${contentTop}px`)
21611
+ //
21612
+ // if (undefined === this.canvasVerticalRange || this.canvasVerticalRange.bottom < viewBottom || this.canvasVerticalRange.top > viewTop) {
21613
+ // console.log("Repaint " + this.canvasVerticalRange)
21614
+ // this.repaint()
21615
+ // }
21622
21616
 
21623
21617
  }
21624
21618
 
@@ -21646,7 +21640,8 @@ class Viewport {
21646
21640
  } else if (typeof track.computePixelHeight === 'function') {
21647
21641
  if (features && features.length > 0) {
21648
21642
  let requiredContentHeight = track.computePixelHeight(features);
21649
- let currentContentHeight = this.$content.height();
21643
+ //let currentContentHeight = this.$content.height()
21644
+ let currentContentHeight = this.contentHeight;
21650
21645
  if (requiredContentHeight !== currentContentHeight) {
21651
21646
  this.setContentHeight(requiredContentHeight);
21652
21647
  }
@@ -21655,14 +21650,12 @@ class Viewport {
21655
21650
  }
21656
21651
 
21657
21652
  getContentHeight() {
21658
- return this.$content.height()
21653
+ //return this.$content.height()
21654
+ return this.contentHeight
21659
21655
  }
21660
21656
 
21661
21657
  setContentHeight(contentHeight) {
21662
-
21663
- // Maximum height of a canvas is ~32,000 pixels on Chrome, possibly smaller on other platforms
21664
- contentHeight = Math.min(contentHeight, 32000);
21665
- this.$content.height(contentHeight);
21658
+ this.contentHeight = contentHeight;
21666
21659
  }
21667
21660
 
21668
21661
  isLoading() {
@@ -21686,7 +21679,7 @@ class Viewport {
21686
21679
  }
21687
21680
 
21688
21681
  getContentTop() {
21689
- return this.contentDiv.offsetTop
21682
+ return this.contentTop
21690
21683
  }
21691
21684
 
21692
21685
  containsPosition(chr, position) {
@@ -23852,7 +23845,7 @@ const Cytoband = function (start, end, name, typestain) {
23852
23845
  }
23853
23846
  };
23854
23847
 
23855
- const _version = "2.13.3";
23848
+ const _version = "2.13.5";
23856
23849
  function version() {
23857
23850
  return _version
23858
23851
  }
@@ -24358,7 +24351,7 @@ class TrackViewport extends Viewport {
24358
24351
 
24359
24352
  const track = this.trackView.track;
24360
24353
  if ('sequence' !== track.type) {
24361
- this.$zoomInNotice = this.createZoomInNotice(this.$content);
24354
+ this.$zoomInNotice = this.createZoomInNotice(this.$viewport);
24362
24355
  }
24363
24356
 
24364
24357
  if (track.name && "sequence" !== track.id) {
@@ -24418,7 +24411,7 @@ class TrackViewport extends Viewport {
24418
24411
  }
24419
24412
  };
24420
24413
 
24421
- if (this.trackView.track && "sequence" === this.trackView.track.type && this.referenceFrame.bpPerPixel > 1) {
24414
+ if (this.trackView.track && "sequence" === this.trackView.track.type && this.referenceFrame.bpPerPixel > bppFeatureFetchThreshold) {
24422
24415
  $$1(this.canvas).remove();
24423
24416
  this.canvas = undefined;
24424
24417
  //this.featureCache = undefined
@@ -24469,6 +24462,34 @@ class TrackViewport extends Viewport {
24469
24462
  }
24470
24463
  }
24471
24464
 
24465
+ /**
24466
+ * Set the content top of the current view. This is triggered by scrolling. If the current canvas extent is not
24467
+ * sufficient to cover the new vertical range repaint.
24468
+ *
24469
+ * @param contentTop - the "top" property of the virtual content div, 0 unless track is scrolled vertically
24470
+ *
24471
+ *
24472
+ */
24473
+ setTop(contentTop) {
24474
+ super.setTop(contentTop);
24475
+
24476
+ if (!this.canvas) {
24477
+ this.repaint();
24478
+ } else {
24479
+ // See if currently painted canvas covers the vertical range of the viewport. If not repaint
24480
+ const h = this.$viewport.height();
24481
+ const vt = contentTop + this.canvas._data.canvasTop;
24482
+ const vb = contentTop + this.canvas._data.canvasBottom;
24483
+ if (vt > 0 || vb < h) {
24484
+ this.repaint();
24485
+ }
24486
+ }
24487
+
24488
+ // Now offset backing canvas to align with the contentTop visual offset.
24489
+ let offset = contentTop + this.canvas._data.canvasTop;
24490
+ this.canvas.style.top = `${offset}px`;
24491
+ }
24492
+
24472
24493
  async loadFeatures() {
24473
24494
 
24474
24495
  const referenceFrame = this.referenceFrame;
@@ -24476,7 +24497,7 @@ class TrackViewport extends Viewport {
24476
24497
 
24477
24498
  // Expand the requested range so we can pan a bit without reloading. But not beyond chromosome bounds
24478
24499
  const chrLength = this.browser.genome.getChromosome(chr).bpLength;
24479
- const pixelWidth = this.$content.width();// * 3;
24500
+ const pixelWidth = this.$viewport.width();// * 3;
24480
24501
  const bpWidth = pixelWidth * referenceFrame.bpPerPixel;
24481
24502
  const bpStart = Math.floor(Math.max(0, referenceFrame.start - bpWidth));
24482
24503
  const bpEnd = Math.ceil(Math.min(chrLength, referenceFrame.start + bpWidth + bpWidth)); // Add one screen width to end
@@ -24517,6 +24538,12 @@ class TrackViewport extends Viewport {
24517
24538
  }
24518
24539
  }
24519
24540
 
24541
+ /**
24542
+ * Compute the genomic extent and needed pixelWidth to repaint the canvas for the current genomic state.
24543
+ * Normally the canvas is size 3X the width of the viewport, however there is no left-right panning for WGV so
24544
+ * canvas width is viewport width.
24545
+ * @returns {{bpEnd: *, pixelWidth: (*|number), bpStart: number}}
24546
+ */
24520
24547
  repaintDimensions() {
24521
24548
  const isWGV = GenomeUtils.isWholeGenomeView(this.referenceFrame.chr);
24522
24549
  const pixelWidth = isWGV ? this.$viewport.width() : 3 * this.$viewport.width();
@@ -24539,12 +24566,8 @@ class TrackViewport extends Viewport {
24539
24566
  }
24540
24567
 
24541
24568
  const {features, roiFeatures} = this.featureCache;
24542
- //this.tile.bpPerPixel = this.referenceFrame.bpPerPixel
24543
-
24544
- // const isWGV = GenomeUtils.isWholeGenomeView(this.browser.referenceFrameList[0].chr)
24545
- GenomeUtils.isWholeGenomeView(this.referenceFrame.chr);
24546
24569
 
24547
- // Canvas dimensions. There is no left-right panning for WGV so canvas width is viewport width.
24570
+ // Canvas dimensions.
24548
24571
  // For deep tracks we paint a canvas == 3*viewportHeight centered on the current vertical scroll position
24549
24572
  const {bpStart, bpEnd, pixelWidth} = this.repaintDimensions();
24550
24573
  const viewportHeight = this.$viewport.height();
@@ -24557,14 +24580,15 @@ class TrackViewport extends Viewport {
24557
24580
  }
24558
24581
  return
24559
24582
  }
24560
- const canvasTop = Math.max(0, -(this.$content.position().top) - viewportHeight);
24583
+ const canvasTop = Math.max(0, -this.contentTop - viewportHeight);
24584
+
24561
24585
 
24562
24586
  const bpPerPixel = this.referenceFrame.bpPerPixel;
24563
- //const bpStart = this.referenceFrame.start - (isWGV ? 0 : pixelWidth / 3 * bpPerPixel)
24564
- //const bpEnd = this.referenceFrame.end + (isWGV ? 0 : pixelWidth / 3 * bpPerPixel)
24565
24587
  const pixelXOffset = Math.round((bpStart - this.referenceFrame.start) / bpPerPixel);
24566
24588
 
24567
- const newCanvas = $$1('<canvas class="igv-canvas">').get(0);
24589
+ const newCanvas = document.createElement('canvas');// $('<canvas class="igv-canvas">').get(0)
24590
+ newCanvas.style.position = 'relative';
24591
+ newCanvas.style.display = 'block';
24568
24592
  newCanvas.style.width = pixelWidth + "px";
24569
24593
  newCanvas.style.height = pixelHeight + "px";
24570
24594
  newCanvas.style.left = pixelXOffset + "px";
@@ -24590,6 +24614,8 @@ class TrackViewport extends Viewport {
24590
24614
  bpStart: bpStart,
24591
24615
  bpEnd: bpEnd,
24592
24616
  bpPerPixel,
24617
+ canvasTop,
24618
+ canvasBottom: canvasTop + pixelHeight,
24593
24619
  referenceFrame: this.referenceFrame,
24594
24620
  selection: this.selection,
24595
24621
  viewport: this,
@@ -24603,7 +24629,7 @@ class TrackViewport extends Viewport {
24603
24629
  }
24604
24630
  newCanvas._data = drawConfiguration;
24605
24631
  this.canvas = newCanvas;
24606
- this.$content.append($$1(newCanvas));
24632
+ this.$viewport.append($$1(newCanvas));
24607
24633
 
24608
24634
  }
24609
24635
 
@@ -24625,13 +24651,11 @@ class TrackViewport extends Viewport {
24625
24651
  */
24626
24652
  draw(drawConfiguration, features, roiFeatures) {
24627
24653
 
24628
- // console.log(`${ Date.now() } viewport draw(). track ${ this.trackView.track.type }. content-css-top ${ this.$content.css('top') }. canvas-top ${ drawConfiguration.pixelTop }.`)
24629
-
24630
24654
  if (features) {
24631
24655
  drawConfiguration.features = features;
24632
24656
  this.trackView.track.draw(drawConfiguration);
24633
24657
  }
24634
- if (roiFeatures) {
24658
+ if (roiFeatures && roiFeatures.length > 0) {
24635
24659
  for (let r of roiFeatures) {
24636
24660
  drawConfiguration.features = r.features;
24637
24661
  r.track.draw(drawConfiguration);
@@ -24655,13 +24679,13 @@ class TrackViewport extends Viewport {
24655
24679
 
24656
24680
  if (!this.canvas) return
24657
24681
 
24658
- const canvasMetadata = this.featureCache;
24682
+ const canvasMetadata = this.canvas._data;
24659
24683
  const canvasTop = canvasMetadata ? canvasMetadata.canvasTop : 0;
24660
24684
  const devicePixelRatio = window.devicePixelRatio;
24661
24685
  const w = this.$viewport.width() * devicePixelRatio;
24662
24686
  const h = this.$viewport.height() * devicePixelRatio;
24663
24687
  const x = -$$1(this.canvas).position().left * devicePixelRatio;
24664
- const y = (-this.$content.position().top - canvasTop) * devicePixelRatio;
24688
+ const y = (-this.contentTop - canvasTop) * devicePixelRatio;
24665
24689
 
24666
24690
  const ctx = this.canvas.getContext("2d");
24667
24691
  const imageData = ctx.getImageData(x, y, w, h);
@@ -24679,57 +24703,82 @@ class TrackViewport extends Viewport {
24679
24703
 
24680
24704
  saveSVG() {
24681
24705
 
24682
- const {width, height} = this.$viewport.get(0).getBoundingClientRect();
24706
+ const marginTop = 32;
24707
+ const marginLeft = 32;
24708
+
24709
+ let {width, height} = this.browser.columnContainer.getBoundingClientRect();
24710
+
24711
+ const h_render = 8000;
24683
24712
 
24684
24713
  const config =
24685
24714
  {
24715
+
24686
24716
  width,
24687
- height,
24717
+ height: h_render,
24718
+
24719
+ backdropColor: 'white',
24720
+
24721
+ multiLocusGap: 0,
24722
+
24688
24723
  viewbox:
24689
24724
  {
24690
24725
  x: 0,
24691
- y: -this.$content.position().top,
24726
+ y: 0,
24692
24727
  width,
24693
- height
24728
+ height: h_render
24694
24729
  }
24695
24730
 
24696
24731
  };
24697
24732
 
24698
24733
  const context = new ctx(config);
24699
24734
 
24700
- const str = (this.trackView.track.name || this.trackView.track.id).replace(/\W/g, '');
24735
+ const delta =
24736
+ {
24737
+ deltaX: marginLeft,
24738
+ deltaY: marginTop
24739
+ };
24701
24740
 
24702
- const index = this.browser.referenceFrameList.indexOf(this.referenceFrame);
24703
- const id = `${str}_referenceFrame_${index}_guid_${guid$2()}`;
24741
+ this.renderViewportToSVG(context, delta);
24704
24742
 
24705
- this.drawSVGWithContext(context, width, height, id, 0, 0, 0);
24743
+ // reset height to trim away unneeded svg canvas real estate. Yes, a bit of a hack.
24744
+ context.setHeight(height);
24745
+
24746
+ const str = (this.trackView.track.name || this.trackView.track.id).replace(/\W/g, '');
24747
+ const index = this.browser.referenceFrameList.indexOf(this.referenceFrame);
24706
24748
 
24707
24749
  const svg = context.getSerializedSvg(true);
24708
24750
  const data = URL.createObjectURL(new Blob([svg], {type: "application/octet-stream"}));
24709
24751
 
24752
+ const id = `${str}_referenceFrame_${index}_guid_${guid$2()}`;
24710
24753
  download(`${id}.svg`, data);
24754
+
24711
24755
  }
24712
24756
 
24713
24757
  // called by trackView.renderSVGContext() when rendering
24714
24758
  // entire browser as SVG
24715
24759
 
24716
- renderSVGContext(context, {deltaX, deltaY}) {
24760
+ renderViewportToSVG(context, {deltaX, deltaY}) {
24717
24761
 
24718
- // Nothing to do if zoomInNotice is active
24719
24762
  if (this.$zoomInNotice && this.$zoomInNotice.is(":visible")) {
24720
24763
  return
24721
24764
  }
24722
24765
 
24723
- const str = (this.trackView.track.name || this.trackView.track.id).replace(/\W/g, '');
24766
+ const {width, height} = this.$viewport.get(0).getBoundingClientRect();
24724
24767
 
24768
+ const str = (this.trackView.track.name || this.trackView.track.id).replace(/\W/g, '');
24725
24769
  const index = this.browser.referenceFrameList.indexOf(this.referenceFrame);
24726
24770
  const id = `${str}_referenceFrame_${index}_guid_${guid$2()}`;
24771
+ this.drawSVGWithContext(context, width, height, id, deltaX, deltaY + this.contentTop, -this.contentTop);
24727
24772
 
24728
- const {top: yScrollDelta} = this.$content.position();
24773
+ }
24729
24774
 
24730
- const {width, height} = this.$viewport.get(0).getBoundingClientRect();
24775
+ renderSVGContext(context, {deltaX, deltaY}) {
24731
24776
 
24732
- this.drawSVGWithContext(context, width, height, id, deltaX, deltaY + yScrollDelta, -yScrollDelta);
24777
+ this.renderViewportToSVG(context, {deltaX, deltaY});
24778
+
24779
+ if (this.$zoomInNotice && this.$zoomInNotice.is(":visible")) {
24780
+ return
24781
+ }
24733
24782
 
24734
24783
  if (this.$trackLabel && true === this.browser.trackLabelsVisible) {
24735
24784
  const {x, y, width, height} = relativeDOMBBox(this.$viewport.get(0), this.$trackLabel.get(0));
@@ -24787,7 +24836,7 @@ class TrackViewport extends Viewport {
24787
24836
  selection: this.selection
24788
24837
  };
24789
24838
 
24790
- const features = this.featureCache ? this.featureCache.features : [];
24839
+ const features = this.featureCache ? this.featureCache.features : undefined;
24791
24840
  const roiFeatures = this.featureCache ? this.featureCache.roiFeatures : undefined;
24792
24841
  this.draw(config, features, roiFeatures);
24793
24842
 
@@ -24805,7 +24854,6 @@ class TrackViewport extends Viewport {
24805
24854
  }
24806
24855
 
24807
24856
  async getFeatures(track, chr, start, end, bpPerPixel) {
24808
-
24809
24857
  if (this.featureCache && this.featureCache.containsRange(chr, start, end, bpPerPixel)) {
24810
24858
  return this.featureCache.features
24811
24859
  } else if (typeof track.getFeatures === "function") {
@@ -24887,22 +24935,21 @@ class TrackViewport extends Viewport {
24887
24935
  viewport.addEventListener('touchend', mu);
24888
24936
 
24889
24937
  // Mouse move
24890
- if (typeof this.trackView.track._hoverText === 'function') {
24938
+ if (typeof this.trackView.track.hoverText === 'function') {
24891
24939
  viewport.addEventListener('mousemove', (event => {
24892
- if (Date.now() - lastHoverUpdateTime > 100) {
24940
+ if (event.buttons === 0 && (Date.now() - lastHoverUpdateTime > 100)) {
24893
24941
  lastHoverUpdateTime = Date.now();
24894
- const clickState = createClickState(event, this);
24942
+ const clickState = this.createClickState(event);
24895
24943
  if (clickState) {
24896
- const hoverText = this.trackView.track._hoverText(clickState);
24897
- if (hoverText) {
24898
- this.$viewport[0].setAttribute("title", hoverText);
24944
+ const tooltip = this.trackView.track.hoverText(clickState);
24945
+ if (tooltip) {
24946
+ this.$viewport[0].setAttribute("title", tooltip);
24899
24947
  } else {
24900
24948
  this.$viewport[0].removeAttribute("title");
24901
24949
  }
24902
24950
  }
24903
24951
  }
24904
24952
  }));
24905
-
24906
24953
  }
24907
24954
 
24908
24955
  this.addViewportClickHandler(this.$viewport.get(0));
@@ -24922,7 +24969,7 @@ class TrackViewport extends Viewport {
24922
24969
  return false
24923
24970
  }
24924
24971
 
24925
- const clickState = createClickState(event, this);
24972
+ const clickState = this.createClickState(event);
24926
24973
 
24927
24974
  if (undefined === clickState) {
24928
24975
  return false
@@ -25024,7 +25071,7 @@ class TrackViewport extends Viewport {
25024
25071
 
25025
25072
  popupTimerID = setTimeout(() => {
25026
25073
 
25027
- const content = getPopupContent(event, this);
25074
+ const content = this.getPopupContent(event);
25028
25075
  if (content) {
25029
25076
  if (this.popover) this.popover.dispose();
25030
25077
  this.popover = new Popover(this.browser.columnContainer);
@@ -25068,57 +25115,58 @@ class TrackViewport extends Viewport {
25068
25115
  });
25069
25116
  }
25070
25117
 
25071
- }
25118
+ createClickState(event) {
25072
25119
 
25073
- function createClickState(event, viewport) {
25120
+ if (!this.canvas) return // Can happen during initialization
25074
25121
 
25075
- if (!viewport.contentDiv || !viewport.canvas) return // Can happen during initialization
25122
+ const referenceFrame = this.referenceFrame;
25123
+ const viewportCoords = translateMouseCoordinates$1(event, this.$viewport.get(0));
25124
+ const canvasCoords = translateMouseCoordinates$1(event, this.canvas);
25125
+ const genomicLocation = ((referenceFrame.start) + referenceFrame.toBP(viewportCoords.x));
25076
25126
 
25077
- const referenceFrame = viewport.referenceFrame;
25078
- const viewportCoords = translateMouseCoordinates$1(event, viewport.contentDiv);
25079
- const canvasCoords = translateMouseCoordinates$1(event, viewport.canvas);
25080
- const genomicLocation = ((referenceFrame.start) + referenceFrame.toBP(viewportCoords.x));
25127
+ return {
25128
+ event,
25129
+ viewport: this,
25130
+ referenceFrame,
25131
+ genomicLocation,
25132
+ y: viewportCoords.y - this.contentTop,
25133
+ canvasX: canvasCoords.x,
25134
+ canvasY: canvasCoords.y
25135
+ }
25081
25136
 
25082
- return {
25083
- event,
25084
- viewport,
25085
- referenceFrame,
25086
- genomicLocation,
25087
- x: viewportCoords.x,
25088
- y: viewportCoords.y,
25089
- canvasX: canvasCoords.x,
25090
- canvasY: canvasCoords.y
25091
25137
  }
25092
25138
 
25093
- }
25139
+ getPopupContent(event) {
25094
25140
 
25095
- function getPopupContent(event, viewport) {
25141
+ const clickState = this.createClickState(event);
25096
25142
 
25097
- const clickState = createClickState(event, viewport);
25143
+ if (undefined === clickState) {
25144
+ return
25145
+ }
25098
25146
 
25099
- if (undefined === clickState) {
25100
- return
25101
- }
25147
+ let track = this.trackView.track;
25148
+ const dataList = track.popupData(clickState);
25102
25149
 
25103
- let track = viewport.trackView.track;
25104
- const dataList = track.popupData(clickState);
25150
+ const popupClickHandlerResult = this.browser.fireEvent('trackclick', [track, dataList]);
25105
25151
 
25106
- const popupClickHandlerResult = viewport.browser.fireEvent('trackclick', [track, dataList]);
25152
+ let content;
25153
+ if (undefined === popupClickHandlerResult || true === popupClickHandlerResult) {
25154
+ // Indicates handler did not handle the result, or the handler wishes default behavior to occur
25155
+ if (dataList && dataList.length > 0) {
25156
+ content = formatPopoverText(dataList);
25157
+ }
25107
25158
 
25108
- let content;
25109
- if (undefined === popupClickHandlerResult || true === popupClickHandlerResult) {
25110
- // Indicates handler did not handle the result, or the handler wishes default behavior to occur
25111
- if (dataList && dataList.length > 0) {
25112
- content = formatPopoverText(dataList);
25159
+ } else if (typeof popupClickHandlerResult === 'string') {
25160
+ content = popupClickHandlerResult;
25113
25161
  }
25114
25162
 
25115
- } else if (typeof popupClickHandlerResult === 'string') {
25116
- content = popupClickHandlerResult;
25163
+ return content
25117
25164
  }
25118
25165
 
25119
- return content
25166
+
25120
25167
  }
25121
25168
 
25169
+
25122
25170
  function formatPopoverText(nameValues) {
25123
25171
 
25124
25172
  const rows = nameValues.map(nameValue => {
@@ -25698,6 +25746,9 @@ function decodeBed(tokens, header) {
25698
25746
  feature.attributes = {};
25699
25747
  for (let kv of attributeKVs) {
25700
25748
  feature.attributes[kv[0]] = kv[1];
25749
+ if (header.nameField != undefined && kv[0] === header.nameField) {
25750
+ feature.name = kv[1];
25751
+ }
25701
25752
  }
25702
25753
  }
25703
25754
  if (!feature.name) {
@@ -26717,6 +26768,7 @@ class TrackBase {
26717
26768
  * @param config
26718
26769
  */
26719
26770
  init(config) {
26771
+
26720
26772
  if (config.displayMode) {
26721
26773
  config.displayMode = config.displayMode.toUpperCase();
26722
26774
  }
@@ -26772,8 +26824,12 @@ class TrackBase {
26772
26824
  }
26773
26825
  }
26774
26826
 
26775
- if(config.hoverTextFields) {
26776
- this.hoverTextFields = config.hoverTextFields;
26827
+ // Support for mouse hover text. This can be expensive, off by default.
26828
+ // this.hoverText = function(clickState) => return tool tip text
26829
+ if (config.hoverTextFields) {
26830
+ this.hoverText = hoverText.bind(this);
26831
+ } else if (typeof this.config.hoverText === 'function') {
26832
+ this.hoverText = this.config.hoverText;
26777
26833
  }
26778
26834
  }
26779
26835
 
@@ -26888,7 +26944,7 @@ class TrackBase {
26888
26944
  */
26889
26945
  setTrackProperties(properties) {
26890
26946
 
26891
- if(this.disposed) return; // This track was removed during async load
26947
+ if (this.disposed) return // This track was removed during async load
26892
26948
 
26893
26949
  const tracklineConfg = {};
26894
26950
  let tokens;
@@ -26991,20 +27047,20 @@ class TrackBase {
26991
27047
  }
26992
27048
 
26993
27049
  /**
26994
- * Return the features clicked over. Default implementation assumes a single row of features and only considers
27050
+ * Return the features clicked over. Default implementation assumes an array of features and only considers
26995
27051
  * the genomic location. Overriden by most subclasses.
26996
27052
  *
26997
27053
  * @param clickState
26998
27054
  * @param features
26999
27055
  * @returns {[]|*[]}
27000
27056
  */
27001
- clickedFeatures(clickState, features) {
27057
+ clickedFeatures(clickState) {
27002
27058
 
27003
27059
  // We use the cached features rather than method to avoid async load. If the
27004
27060
  // feature is not already loaded this won't work, but the user wouldn't be mousing over it either.
27005
- if (!features) features = clickState.viewport.cachedFeatures;
27061
+ const features = clickState.viewport.cachedFeatures;
27006
27062
 
27007
- if (!features || features.length === 0) {
27063
+ if (!features || !Array.isArray(features) || features.length === 0) {
27008
27064
  return []
27009
27065
  }
27010
27066
 
@@ -27102,65 +27158,6 @@ class TrackBase {
27102
27158
 
27103
27159
  }
27104
27160
 
27105
- /**
27106
- * Return a plain string for descriptive text given the list of features. The string is used to set a "title"
27107
- * attribute and cannot contain any html.
27108
- *
27109
- * @returns {undefined}
27110
- */
27111
- _hoverText(clickState) {
27112
-
27113
- const features = this.clickedFeatures(clickState);
27114
-
27115
- if (features && features.length > 0) {
27116
- let str = "";
27117
- for (let i = 0; i < features.length; i++) {
27118
- if (i === 10) {
27119
- str += "; ...";
27120
- break
27121
- }
27122
- if (!features[i]) continue
27123
-
27124
- const f = features[i]._f || features[i];
27125
- if (str.length > 0) str += "\n";
27126
-
27127
- if(this.hoverTextFields) {
27128
- str = "";
27129
- for(let field of this.hoverTextFields) {
27130
- if(str.length > 0) str += "\n";
27131
- if(f.hasOwnProperty(field)) {
27132
- str += f[field];
27133
- } else if(typeof f.getAttribute === "function") {
27134
- str += f.getAttribute(field);
27135
- }
27136
- }
27137
- }
27138
- else if (typeof this.config.hoverText === 'function') {
27139
- str += this.config.hoverText(f);
27140
- } else if (typeof f.hoverText === 'function') {
27141
- str += f.hoverText();
27142
- } else {
27143
- str += this.hoverText(f);
27144
- }
27145
- }
27146
- return str
27147
- }
27148
- }
27149
-
27150
- /**
27151
- * Default hoverText function. Can be overridden in track configuration or subclasses
27152
- *
27153
- * @param f - feature hovered over
27154
- */
27155
- hoverText(f) {
27156
- let str = "";
27157
- if (f.name) {
27158
- str += f.name;
27159
- if (f.value) str += ": ";
27160
- }
27161
- if (f.value) str += f.value; // TODO format value if number
27162
- return str;
27163
- }
27164
27161
 
27165
27162
  /**
27166
27163
  * Default track description -- displayed on click of track label. This can be overriden in the track
@@ -27233,6 +27230,38 @@ class TrackBase {
27233
27230
  }
27234
27231
  }
27235
27232
 
27233
+ function hoverText(clickState) {
27234
+
27235
+ if (!this.hoverTextFields) return
27236
+
27237
+ const features = this.clickedFeatures(clickState);
27238
+
27239
+ if (features && features.length > 0) {
27240
+ let str = "";
27241
+ for (let i = 0; i < features.length; i++) {
27242
+ if (i === 10) {
27243
+ str += "; ...";
27244
+ break
27245
+ }
27246
+ if (!features[i]) continue
27247
+
27248
+ const f = features[i]._f || features[i];
27249
+ if (str.length > 0) str += "\n";
27250
+
27251
+ str = "";
27252
+ for (let field of this.hoverTextFields) {
27253
+ if (str.length > 0) str += "\n";
27254
+ if (f.hasOwnProperty(field)) {
27255
+ str += f[field];
27256
+ } else if (typeof f.getAttribute === "function") {
27257
+ str += f.getAttribute(field);
27258
+ }
27259
+ }
27260
+
27261
+ }
27262
+ return str
27263
+ }
27264
+ }
27236
27265
 
27237
27266
  /**
27238
27267
  * Map UCSC track line "type" setting to file format. In igv.js "type" refers to the track type, not the input file format
@@ -27431,12 +27460,6 @@ class SegFeature {
27431
27460
  return pd
27432
27461
  }
27433
27462
 
27434
- hoverText() {
27435
-
27436
- return `${this.sample}: ${this.value}`
27437
- }
27438
-
27439
-
27440
27463
  extractCravatLink(genomeId) {
27441
27464
 
27442
27465
  let ref, alt;
@@ -27720,10 +27743,6 @@ class Variant {
27720
27743
  return fields
27721
27744
  }
27722
27745
 
27723
- hoverText() {
27724
- return `${this.names} ${this.referenceBases}->${this.alternateBases}`
27725
- }
27726
-
27727
27746
  getInfo(tag) {
27728
27747
  return this.info ? this.info[tag] : undefined;
27729
27748
  }
@@ -28942,10 +28961,9 @@ class CSIIndex {
28942
28961
  for (let bin = binRange[0]; bin <= binRange[1]; bin++) {
28943
28962
  if (ba.binIndex[bin]) {
28944
28963
  const binChunks = ba.binIndex[bin];
28945
- const nchnk = binChunks.length;
28946
- for (let c = 0; c < nchnk; ++c) {
28947
- const cs = binChunks[c][0];
28948
- const ce = binChunks[c][1];
28964
+ for (let c of binChunks) {
28965
+ const cs = c[0];
28966
+ const ce = c[1];
28949
28967
  chunks.push({minv: cs, maxv: ce, bin: bin});
28950
28968
  }
28951
28969
  }
@@ -28963,7 +28981,7 @@ class CSIIndex {
28963
28981
  reg2bins(beg, end) {
28964
28982
  beg -= 1; // < convert to 1-based closed
28965
28983
  if (beg < 1) beg = 1;
28966
- if (end > 2 ** 50) end = 2 ** 34; // 17 GiB ought to be enough for anybody
28984
+ if (end > 2 ** 34) end = 2 ** 34; // 17 GiB ought to be enough for anybody
28967
28985
  end -= 1;
28968
28986
  let l = 0;
28969
28987
  let t = 0;
@@ -28972,25 +28990,18 @@ class CSIIndex {
28972
28990
  for (; l <= this.depth; s -= 3, t += (1 << l * 3), l += 1) {
28973
28991
  const b = t + (beg >> s);
28974
28992
  const e = t + (end >> s);
28975
- if (e - b + bins.length > this.maxBinNumber)
28976
- throw new Error(
28977
- `query ${beg}-${end} is too large for current binning scheme (shift ${this.minShift}, depth ${this.depth}), try a smaller query or a coarser index binning scheme`,
28978
- )
28979
- //for (let i = b; i <= e; i += 1) bins.push(i)
28993
+ //
28994
+ // ITS NOT CLEAR WHERE THIS TEST CAME FROM, but maxBinNumber is never set, and its not clear what it represents.
28995
+ // if (e - b + bins.length > this.maxBinNumber)
28996
+ // throw new Error(
28997
+ // `query ${beg}-${end} is too large for current binning scheme (shift ${this.minShift}, depth ${this.depth}), try a smaller query or a coarser index binning scheme`,
28998
+ // )
28999
+ //
28980
29000
  bins.push([b, e]);
28981
29001
  }
28982
29002
  return bins
28983
29003
  }
28984
29004
 
28985
- // function reg2bins(beg, end, min_shift, depth) {
28986
- // let l, t, n, s = min_shift + depth * 3;
28987
- // const bins = [];
28988
- // for (--end, l = n = t = 0; l <= depth; s -= 3, t += 1 << l * 3, ++l) {
28989
- // let b = t + (beg >> s), e = t + (end >> s), i;
28990
- // for (i = b; i <= e; ++i) bins[n++] = i;
28991
- // }
28992
- // return bins;
28993
- // }
28994
29005
 
28995
29006
  bin_limit() {
28996
29007
  return ((1 << (this.depth + 1) * 3) - 1) / 7
@@ -29193,11 +29204,10 @@ class BamIndex {
29193
29204
  for (let binRange of overlappingBins) {
29194
29205
  for (let bin = binRange[0]; bin <= binRange[1]; bin++) {
29195
29206
  if (ba.binIndex[bin]) {
29196
- const binChunks = ba.binIndex[bin],
29197
- nchnk = binChunks.length;
29198
- for (let c = 0; c < nchnk; ++c) {
29199
- const cs = binChunks[c][0];
29200
- const ce = binChunks[c][1];
29207
+ const binChunks = ba.binIndex[bin];
29208
+ for (let c of binChunks) {
29209
+ const cs = c[0];
29210
+ const ce = c[1];
29201
29211
  chunks.push({minv: cs, maxv: ce, bin: bin});
29202
29212
  }
29203
29213
  }
@@ -29209,7 +29219,7 @@ class BamIndex {
29209
29219
  let lowest = null;
29210
29220
  const minLin = Math.min(min >> 14, nintv - 1);
29211
29221
  const maxLin = Math.min(max >> 14, nintv - 1);
29212
- for (let i = minLin; i <= maxLin; ++i) {
29222
+ for (let i = minLin; i < maxLin; i++) {
29213
29223
  const vp = ba.linearIndex[i];
29214
29224
  if (vp) {
29215
29225
  // todo -- I think, but am not sure, that the values in the linear index have to be in increasing order. So the first non-null should be minimum
@@ -35129,10 +35139,6 @@ class BamAlignment {
35129
35139
  return (genomicLocation >= s && genomicLocation <= (s + l))
35130
35140
  }
35131
35141
 
35132
- hoverText() {
35133
- return this.readName;
35134
- }
35135
-
35136
35142
  popupData(genomicLocation) {
35137
35143
 
35138
35144
  // if the user clicks on a base next to an insertion, show just the
@@ -39984,6 +39990,14 @@ class BAMTrack extends TrackBase {
39984
39990
  return clickedObject ? [clickedObject] : undefined
39985
39991
  }
39986
39992
 
39993
+ hoverText(clickState) {
39994
+ if (true === this.showCoverage && clickState.y >= this.coverageTrack.top && clickState.y < this.coverageTrack.height) {
39995
+ const clickedObject = this.coverageTrack.getClickedObject(clickState);
39996
+ return clickedObject.hoverText()
39997
+ }
39998
+
39999
+ }
40000
+
39987
40001
  menuItemList() {
39988
40002
 
39989
40003
 
@@ -41401,6 +41415,10 @@ class RulerViewport extends TrackViewport {
41401
41415
  super(trackView, $viewportColumn, referenceFrame, width);
41402
41416
  }
41403
41417
 
41418
+ get contentDiv() {
41419
+ return this.$viewport.get(0)
41420
+ }
41421
+
41404
41422
  initializationHelper() {
41405
41423
 
41406
41424
  this.$multiLocusCloseButton = $$1('<div>', {class: 'igv-multi-locus-close-button'});
@@ -41628,7 +41646,8 @@ class IdeogramViewport extends TrackViewport {
41628
41646
 
41629
41647
  this.canvas = document.createElement('canvas');
41630
41648
  this.canvas.className = 'igv-ideogram-canvas';
41631
- this.$content.append($$1(this.canvas));
41649
+ //this.$content.append($(this.canvas))
41650
+ this.$viewport.append($$1(this.canvas));
41632
41651
  this.ideogram_ctx = this.canvas.getContext('2d');
41633
41652
 
41634
41653
  this.addMouseHandlers();
@@ -42202,7 +42221,7 @@ const hideAllMenuPopups = () => {
42202
42221
  * THE SOFTWARE.
42203
42222
  */
42204
42223
 
42205
- const scrollbarExclusionTypes = new Set(['ruler', 'sequence', 'ideogram']);
42224
+ const scrollbarExclusionTypes = new Set(['ruler', 'ideogram']);
42206
42225
  const colorPickerExclusionTypes = new Set(['ruler', 'sequence', 'ideogram']);
42207
42226
 
42208
42227
  class TrackView {
@@ -42582,17 +42601,18 @@ class TrackView {
42582
42601
  }
42583
42602
 
42584
42603
  if (this.track.autoscale) {
42585
- let allFeatures = [];
42604
+ let allFeatures;
42586
42605
  for (let visibleViewport of visibleViewports) {
42587
42606
  const referenceFrame = visibleViewport.referenceFrame;
42588
42607
  const start = referenceFrame.start;
42589
- const end = start + referenceFrame.toBP($$1(visibleViewport.contentDiv).width());
42608
+ const end = start + referenceFrame.toBP(visibleViewport.getWidth());
42590
42609
  if (visibleViewport.featureCache && visibleViewport.featureCache.features) {
42610
+ // If the "features" object has a getMax function use it. Currently only alignmentContainer implements this, for coverage.
42591
42611
  if (typeof visibleViewport.featureCache.features.getMax === 'function') {
42592
42612
  const max = visibleViewport.featureCache.features.getMax(start, end);
42593
- allFeatures.push({value: max});
42613
+ allFeatures = [{value: max}];
42594
42614
  } else {
42595
- allFeatures = allFeatures.concat(FeatureUtils.findOverlapping(visibleViewport.featureCache.features, start, end));
42615
+ allFeatures = FeatureUtils.findOverlapping(visibleViewport.featureCache.features, start, end);
42596
42616
  }
42597
42617
  }
42598
42618
  }
@@ -42657,7 +42677,7 @@ class TrackView {
42657
42677
 
42658
42678
  const referenceFrame = vp.referenceFrame;
42659
42679
  const {chr, start, bpPerPixel} = vp.referenceFrame;
42660
- const end = start + referenceFrame.toBP($$1(vp.contentDiv).width());
42680
+ const end = start + referenceFrame.toBP(vp.getWidth());
42661
42681
  const needsReload = !vp.featureCache || !vp.featureCache.containsRange(chr, start, end, bpPerPixel);
42662
42682
 
42663
42683
  if (needsReload) {
@@ -43549,7 +43569,7 @@ class FeatureTrack extends TrackBase {
43549
43569
 
43550
43570
  if (typeof this.featureSource.getHeader === "function") {
43551
43571
  this.header = await this.featureSource.getHeader();
43552
- if(this.disposed) return; // This track was removed during async load
43572
+ if (this.disposed) return // This track was removed during async load
43553
43573
  }
43554
43574
 
43555
43575
  // Set properties from track line
@@ -43642,7 +43662,7 @@ class FeatureTrack extends TrackBase {
43642
43662
  options.rowLastLabelX[row] = -Number.MAX_SAFE_INTEGER;
43643
43663
  }
43644
43664
  }
43645
- const maxFeatureCount = Math.max(1, Math.max(...rowFeatureCount));
43665
+ const maxFeatureCount = Math.max(1, Math.max(...rowFeatureCount));
43646
43666
  const pixelsPerFeature = pixelWidth / maxFeatureCount;
43647
43667
 
43648
43668
  let lastPxEnd = [];
@@ -43673,10 +43693,10 @@ class FeatureTrack extends TrackBase {
43673
43693
 
43674
43694
  };
43675
43695
 
43676
- clickedFeatures(clickState, features) {
43696
+ clickedFeatures(clickState) {
43677
43697
 
43678
43698
  const y = clickState.y - this.margin;
43679
- const allFeatures = super.clickedFeatures(clickState, features);
43699
+ const allFeatures = super.clickedFeatures(clickState);
43680
43700
 
43681
43701
  let row;
43682
43702
  switch (this.displayMode) {
@@ -43700,9 +43720,8 @@ class FeatureTrack extends TrackBase {
43700
43720
  */
43701
43721
  popupData(clickState, features) {
43702
43722
 
43703
- features = this.clickedFeatures(clickState, features);
43723
+ if (features === undefined) features = this.clickedFeatures(clickState);
43704
43724
  const genomicLocation = clickState.genomicLocation;
43705
-
43706
43725
  const data = [];
43707
43726
  for (let feature of features) {
43708
43727
 
@@ -43827,8 +43846,7 @@ class FeatureTrack extends TrackBase {
43827
43846
  let seq = await this.browser.genome.getSequence(f.chr, f.start, f.end);
43828
43847
  if (!seq) {
43829
43848
  seq = "Unknown sequence";
43830
- }
43831
- else if (f.strand === '-') {
43849
+ } else if (f.strand === '-') {
43832
43850
  seq = reverseComplementSequence(seq);
43833
43851
  }
43834
43852
  this.browser.alert.present(seq);
@@ -43844,8 +43862,7 @@ class FeatureTrack extends TrackBase {
43844
43862
  let seq = await this.browser.genome.getSequence(f.chr, f.start, f.end);
43845
43863
  if (!seq) {
43846
43864
  seq = "Unknown sequence";
43847
- }
43848
- else if (f.strand === '-') {
43865
+ } else if (f.strand === '-') {
43849
43866
  seq = reverseComplementSequence(seq);
43850
43867
  }
43851
43868
  try {
@@ -44162,10 +44179,7 @@ class WigTrack extends TrackBase {
44162
44179
 
44163
44180
  popupData(clickState, features) {
44164
44181
 
44165
- // We use the featureCache property rather than method to avoid async load. If the
44166
- // feature is not already loaded this won't work, but the user wouldn't be mousing over it either.
44167
-
44168
- features = this.clickedFeatures(clickState, features);
44182
+ if(features === undefined) features = this.clickedFeatures(clickState);
44169
44183
 
44170
44184
  if (features && features.length > 0) {
44171
44185
 
@@ -44483,7 +44497,7 @@ class SegTrack extends TrackBase {
44483
44497
 
44484
44498
  draw({context, renderSVG, pixelTop, pixelWidth, pixelHeight, features, bpPerPixel, bpStart}) {
44485
44499
 
44486
- IGVGraphics.fillRect(context, 0, 0, pixelWidth, pixelHeight, {'fillStyle': "rgb(255, 255, 255)"});
44500
+ IGVGraphics.fillRect(context, 0, pixelTop, pixelWidth, pixelHeight, {'fillStyle': "rgb(255, 255, 255)"});
44487
44501
 
44488
44502
  if (features && features.length > 0) {
44489
44503
 
@@ -44707,9 +44721,9 @@ class SegTrack extends TrackBase {
44707
44721
 
44708
44722
  }
44709
44723
 
44710
- clickedFeatures(clickState, features) {
44724
+ clickedFeatures(clickState) {
44711
44725
 
44712
- const allFeatures = super.clickedFeatures(clickState, features);
44726
+ const allFeatures = super.clickedFeatures(clickState);
44713
44727
  const y = clickState.y;
44714
44728
  return allFeatures.filter(function (feature) {
44715
44729
  const rect = feature.pixelRect;
@@ -44718,13 +44732,16 @@ class SegTrack extends TrackBase {
44718
44732
 
44719
44733
  }
44720
44734
 
44721
- hoverText(feature) {
44722
- return `${feature.sample}: ${feature.value}`
44735
+ hoverText(clickState) {
44736
+ const features = this.clickedFeatures(clickState);
44737
+ if(features && features.length > 0) {
44738
+ return `${features[0].sample}: ${features[0].value}`
44739
+ }
44723
44740
  }
44724
44741
 
44725
44742
  popupData(clickState, featureList) {
44726
44743
 
44727
- featureList = this.clickedFeatures(clickState);
44744
+ if(featureList === undefined) featureList = this.clickedFeatures(clickState);
44728
44745
 
44729
44746
  const items = [];
44730
44747
 
@@ -44880,6 +44897,7 @@ const MUT_COLORS = {
44880
44897
  * THE SOFTWARE.
44881
44898
  */
44882
44899
 
44900
+
44883
44901
  /**
44884
44902
  * Represents 2 or more wig tracks overlaid on a common viewport.
44885
44903
  */
@@ -44970,70 +44988,111 @@ class MergedTrack extends TrackBase {
44970
44988
  return items
44971
44989
  }
44972
44990
 
44991
+ /**
44992
+ * Returns a MergedFeatureCollection containing an array of features for the specified range, 1 for each track.
44993
+ */
44973
44994
  async getFeatures(chr, bpStart, bpEnd, bpPerPixel) {
44974
44995
 
44975
44996
  const promises = this.tracks.map((t) => t.getFeatures(chr, bpStart, bpEnd, bpPerPixel));
44976
- return Promise.all(promises)
44997
+ const featureArrays = await Promise.all(promises);
44998
+ return new MergedFeatureCollection(featureArrays)
44977
44999
  }
44978
45000
 
44979
45001
  draw(options) {
44980
45002
 
44981
- const mergedFeatures = options.features; // Array of feature arrays, 1 for each track
44982
-
44983
- if (this.autoscale) {
44984
- this.dataRange = autoscale(options.referenceFrame.chr, mergedFeatures);
44985
- }
45003
+ const mergedFeatures = options.features; // A MergedFeatureCollection
44986
45004
 
44987
45005
  for (let i = 0, len = this.tracks.length; i < len; i++) {
44988
45006
  const trackOptions = Object.assign({}, options);
44989
- trackOptions.features = mergedFeatures[i];
45007
+ trackOptions.features = mergedFeatures.featureArrays[i];
44990
45008
  this.tracks[i].dataRange = this.dataRange;
44991
45009
  this.tracks[i].flipAxis = this.flipAxis;
44992
45010
  this.tracks[i].logScale = this.logScale;
44993
- if(this.graphType){
45011
+ if (this.graphType) {
44994
45012
  this.tracks[i].graphType = this.graphType;
44995
45013
  }
44996
45014
  this.tracks[i].draw(trackOptions);
44997
45015
  }
44998
45016
  }
44999
45017
 
45000
- popupData(clickState, features) {
45018
+ popupData(clickState) {
45001
45019
 
45002
- const featuresArray = features || clickState.viewport.cachedFeatures;
45020
+ if(clickState.viewport && clickState.viewport.cachedFeatures) {
45003
45021
 
45004
- if (featuresArray && featuresArray.length === this.tracks.length) {
45005
- // Array of feature arrays, 1 for each track
45006
- const popupData = [];
45007
- for (let i = 0; i < this.tracks.length; i++) {
45008
- if (i > 0) popupData.push('<hr/>');
45009
- popupData.push(`<div style=background-color:rgb(245,245,245);border-bottom-style:dashed;border-bottom-width:1px;padding-bottom:5px;padding-top:10px;font-weight:bold;font-size:larger >${this.tracks[i].name}</div>`);
45010
- const trackPopupData = this.tracks[i].popupData(clickState, featuresArray[i]);
45011
- popupData.push(...trackPopupData);
45022
+ const featuresArray = clickState.viewport.cachedFeatures.featureArrays;
45023
+
45024
+ if (featuresArray && featuresArray.length === this.tracks.length) {
45025
+ // Array of feature arrays, 1 for each track
45026
+ const popupData = [];
45027
+ for (let i = 0; i < this.tracks.length; i++) {
45028
+ if (i > 0) popupData.push('<hr/>');
45029
+ popupData.push(`<div style=background-color:rgb(245,245,245);border-bottom-style:dashed;border-bottom-width:1px;padding-bottom:5px;padding-top:10px;font-weight:bold;font-size:larger >${this.tracks[i].name}</div>`);
45030
+ const trackPopupData = this.tracks[i].popupData(clickState, featuresArray[i]);
45031
+ popupData.push(...trackPopupData);
45012
45032
 
45033
+ }
45034
+ return popupData
45013
45035
  }
45014
- return popupData
45015
45036
  }
45016
45037
  }
45017
45038
 
45039
+ clickedFeatures(clickState) {
45040
+
45041
+
45042
+ // We use the cached features rather than method to avoid async load. If the
45043
+ // feature is not already loaded this won't work, but the user wouldn't be mousing over it either.
45044
+ const mergedFeaturesCollection = clickState.viewport.cachedFeatures;
45045
+
45046
+ if(!mergedFeaturesCollection) {
45047
+ return [];
45048
+ }
45049
+
45050
+ const genomicLocation = clickState.genomicLocation;
45051
+ const clickedFeatures = [];
45052
+ for(let features of mergedFeaturesCollection.featureArrays) {
45053
+ // When zoomed out we need some tolerance around genomicLocation
45054
+ const tolerance = (clickState.referenceFrame.bpPerPixel > 0.2) ? 3 * clickState.referenceFrame.bpPerPixel : 0.2;
45055
+ const ss = genomicLocation - tolerance;
45056
+ const ee = genomicLocation + tolerance;
45057
+ const tmp = (FeatureUtils.findOverlapping(features, ss, ee));
45058
+ for(let f of tmp) {
45059
+ clickedFeatures.push(f);
45060
+ }
45061
+ }
45062
+ return clickedFeatures;
45063
+ }
45064
+
45018
45065
 
45019
45066
  get supportsWholeGenome() {
45020
45067
  return this.tracks.every(track => track.supportsWholeGenome)
45021
45068
  }
45022
45069
  }
45023
45070
 
45024
- function autoscale(chr, featureArrays) {
45025
45071
 
45026
- let min = 0;
45027
- let max = -Number.MAX_VALUE;
45028
- for(let features of featureArrays) {
45029
- for(let f of features) {
45030
- if (typeof f.value !== 'undefined' && !Number.isNaN(f.value)) {
45031
- min = Math.min(min, f.value);
45032
- max = Math.max(max, f.value);
45072
+ class MergedFeatureCollection {
45073
+
45074
+ constructor(featureArrays) {
45075
+ this.featureArrays = featureArrays;
45076
+ }
45077
+
45078
+ getMax(start, end) {
45079
+ let max = -Number.MAX_VALUE;
45080
+ for (let a of this.featureArrays) {
45081
+ for (let f of a) {
45082
+ if (typeof f.value !== 'undefined' && !Number.isNaN(f.value)) {
45083
+ if (f.end < start) {
45084
+ continue
45085
+ }
45086
+ if (f.start > end) {
45087
+ break
45088
+ }
45089
+ max = Math.max(max, f.value);
45090
+ }
45033
45091
  }
45034
45092
  }
45093
+ return max
45035
45094
  }
45036
- return {min: min, max: max}
45095
+
45037
45096
  }
45038
45097
 
45039
45098
  /*
@@ -45616,7 +45675,7 @@ class InteractionTrack extends TrackBase {
45616
45675
 
45617
45676
  popupData(clickState, features) {
45618
45677
 
45619
- features = this.clickedFeatures(clickState);
45678
+ if(features === undefined) features = this.clickedFeatures(clickState);
45620
45679
 
45621
45680
  const data = [];
45622
45681
  for (let feature of features) {
@@ -45658,11 +45717,11 @@ class InteractionTrack extends TrackBase {
45658
45717
  return data
45659
45718
  }
45660
45719
 
45661
- clickedFeatures(clickState, features) {
45720
+ clickedFeatures(clickState) {
45662
45721
 
45663
45722
  // We use the cached features rather than method to avoid async load. If the
45664
45723
  // feature is not already loaded this won't work, but the user wouldn't be mousing over it either.
45665
- const featureList = features || clickState.viewport.cachedFeatures;
45724
+ const featureList = clickState.viewport.cachedFeatures;
45666
45725
  const candidates = [];
45667
45726
  if (featureList) {
45668
45727
  const proportional = (this.arcType === "proportional" || this.arcType === "inView" || this.arcType === "partialInView");
@@ -46252,9 +46311,9 @@ class VariantTrack extends TrackBase {
46252
46311
  }
46253
46312
  }
46254
46313
 
46255
- clickedFeatures(clickState, features) {
46314
+ clickedFeatures(clickState) {
46256
46315
 
46257
- let featureList = super.clickedFeatures(clickState, features);
46316
+ let featureList = super.clickedFeatures(clickState);
46258
46317
 
46259
46318
  const vGap = (this.displayMode === 'EXPANDED') ? this.expandedVGap : this.squishedVGap;
46260
46319
  const callHeight = vGap + ("SQUISHED" === this.displayMode ? this.squishedCallHeight : this.expandedCallHeight);
@@ -46290,9 +46349,9 @@ class VariantTrack extends TrackBase {
46290
46349
  /**
46291
46350
  * Return "popup data" for feature @ genomic location. Data is an array of key-value pairs
46292
46351
  */
46293
- popupData(clickState, features) {
46352
+ popupData(clickState, featureList) {
46294
46353
 
46295
- const featureList = this.clickedFeatures(clickState, features);
46354
+ if(featureList === undefined) featureList = this.clickedFeatures(clickState);
46296
46355
  const genomicLocation = clickState.genomicLocation;
46297
46356
  const genomeID = this.browser.genome.id;
46298
46357
  const sampleInformation = this.browser.sampleInformation;
@@ -46820,9 +46879,9 @@ class EqtlTrack extends TrackBase {
46820
46879
  /**
46821
46880
  * Return "popup data" for feature @ genomic location. Data is an array of key-value pairs
46822
46881
  */
46823
- popupData(clickState) {
46882
+ popupData(clickState, features) {
46824
46883
 
46825
- let features = clickState.viewport.cachedFeatures;
46884
+ if(features === undefined) features = clickState.viewport.cachedFeatures;
46826
46885
  if (!features || features.length === 0) return []
46827
46886
 
46828
46887
  const tolerance = 3;
@@ -47149,11 +47208,12 @@ class GWASTrack extends TrackBase {
47149
47208
  }
47150
47209
  }
47151
47210
 
47152
- popupData(clickState) {
47211
+ popupData(clickState, features) {
47212
+
47213
+ if(features === undefined) features = clickState.viewport.cachedFeatures;
47153
47214
 
47154
47215
  let data = [];
47155
47216
  const track = clickState.viewport.trackView.track;
47156
- const features = clickState.viewport.cachedFeatures;
47157
47217
 
47158
47218
  if (features) {
47159
47219
  let count = 0;
@@ -47541,12 +47601,12 @@ class GCNVTrack extends TrackBase {
47541
47601
  return []
47542
47602
  }
47543
47603
 
47544
- popupData(clickState, featureList) {
47604
+ popupData(clickState, features) {
47545
47605
 
47546
- featureList = this.clickedFeatures(clickState, featureList);
47606
+ if(features === undefined) features = this.clickedFeatures(clickState);
47547
47607
 
47548
47608
  const items = [];
47549
- featureList.forEach(function (f) {
47609
+ features.forEach(function (f) {
47550
47610
  for (let property of Object.keys(f)) {
47551
47611
  if (isSimpleType(f[property])) {
47552
47612
  items.push({name: property, value: f[property]});
@@ -47732,9 +47792,9 @@ class RnaStructTrack extends TrackBase {
47732
47792
  }
47733
47793
  }
47734
47794
 
47735
- clickedFeatures(clickState, features) {
47795
+ clickedFeatures(clickState) {
47736
47796
 
47737
- features = super.clickedFeatures(clickState, features);
47797
+ const features = super.clickedFeatures(clickState);
47738
47798
 
47739
47799
  const clicked = [];
47740
47800
 
@@ -47776,10 +47836,7 @@ class RnaStructTrack extends TrackBase {
47776
47836
 
47777
47837
  popupData(clickState, features) {
47778
47838
 
47779
- // We use the featureCache property rather than method to avoid async load. If the
47780
- // feature is not already loaded this won't work, but the user wouldn't be mousing over it either.
47781
-
47782
- features = this.clickedFeatures(clickState, features);
47839
+ if(features === undefined) features = this.clickedFeatures(clickState);
47783
47840
 
47784
47841
  if (features && features.length > 0) {
47785
47842
 
@@ -48207,7 +48264,7 @@ class SpliceJunctionTrack extends TrackBase {
48207
48264
 
48208
48265
  if (typeof this.featureSource.getHeader === "function") {
48209
48266
  this.header = await this.featureSource.getHeader();
48210
- if(this.disposed) return; // This track was removed during async load
48267
+ if (this.disposed) return // This track was removed during async load
48211
48268
  }
48212
48269
 
48213
48270
  // Set properties from track line
@@ -48264,7 +48321,8 @@ class SpliceJunctionTrack extends TrackBase {
48264
48321
 
48265
48322
  junctionRenderingContext.referenceFrame = options.viewport.referenceFrame;
48266
48323
  junctionRenderingContext.referenceFrameStart = junctionRenderingContext.referenceFrame.start;
48267
- junctionRenderingContext.referenceFrameEnd = junctionRenderingContext.referenceFrameStart + junctionRenderingContext.referenceFrame.toBP($$1(options.viewport.contentDiv).width());
48324
+ junctionRenderingContext.referenceFrameEnd = junctionRenderingContext.referenceFrameStart +
48325
+ junctionRenderingContext.referenceFrame.toBP(options.viewport.getWidth());
48268
48326
 
48269
48327
  // For a given viewport, records where features that are < 2px in width have been rendered already.
48270
48328
  // This prevents wasteful rendering of multiple such features onto the same pixels.
@@ -48512,9 +48570,9 @@ class SpliceJunctionTrack extends TrackBase {
48512
48570
  ctx.fillText(label, junctionMiddlePx - ctx.measureText(label).width / 2, (7 * topY + cy) / 8);
48513
48571
  }
48514
48572
 
48515
- clickedFeatures(clickState, features) {
48573
+ clickedFeatures(clickState) {
48516
48574
 
48517
- const allFeatures = super.clickedFeatures(clickState, features);
48575
+ const allFeatures = super.clickedFeatures(clickState);
48518
48576
 
48519
48577
  return allFeatures.filter(function (feature) {
48520
48578
  return (feature.isVisible && feature.attributes)
@@ -48526,7 +48584,7 @@ class SpliceJunctionTrack extends TrackBase {
48526
48584
  */
48527
48585
  popupData(clickState, features) {
48528
48586
 
48529
- features = this.clickedFeatures(clickState, features);
48587
+ if (features === undefined) features = this.clickedFeatures(clickState);
48530
48588
  const genomicLocation = clickState.genomicLocation;
48531
48589
 
48532
48590
  const data = [];
@@ -51970,11 +52028,11 @@ class Browser {
51970
52028
  */
51971
52029
  toSVG() {
51972
52030
 
51973
- let {x, y, width, height} = this.columnContainer.getBoundingClientRect();
52031
+ const {y, width, height} = this.columnContainer.getBoundingClientRect();
51974
52032
 
51975
52033
  const h_render = 8000;
51976
52034
 
51977
- let context = new ctx(
52035
+ const config =
51978
52036
  {
51979
52037
 
51980
52038
  width,
@@ -51992,13 +52050,14 @@ class Browser {
51992
52050
  height: h_render
51993
52051
  }
51994
52052
 
51995
- });
52053
+ };
52054
+
52055
+ const context = new ctx(config);
51996
52056
 
51997
52057
  // tracks -> SVG
51998
52058
  for (let trackView of this.trackViews) {
51999
52059
  trackView.renderSVGContext(context, {deltaX: 0, deltaY: -y});
52000
52060
  }
52001
-
52002
52061
  // reset height to trim away unneeded svg canvas real estate. Yes, a bit of a hack.
52003
52062
  context.setHeight(height);
52004
52063
 
@@ -53983,7 +54042,7 @@ async function createTrack(config, browser) {
53983
54042
 
53984
54043
  function embedCSS() {
53985
54044
 
53986
- var css = '.igv-navbar {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n box-sizing: border-box;\n width: 100%;\n color: #444;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n line-height: 32px;\n padding-left: 8px;\n padding-right: 8px;\n margin-top: 2px;\n margin-bottom: 6px;\n height: 32px;\n border-style: solid;\n border-radius: 3px;\n border-width: thin;\n border-color: #bfbfbf;\n background-color: #f3f3f3;\n}\n.igv-navbar .igv-navbar-left-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 32px;\n line-height: 32px;\n}\n.igv-navbar .igv-navbar-left-container .igv-logo {\n width: 34px;\n height: 32px;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-left-container .igv-current-genome {\n height: 32px;\n margin-left: 4px;\n margin-right: 4px;\n user-select: none;\n line-height: 32px;\n vertical-align: middle;\n text-align: center;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 100%;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-chromosome-select-widget-container {\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n height: 100%;\n width: 125px;\n margin-right: 4px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-chromosome-select-widget-container select {\n display: block;\n cursor: pointer;\n width: 100px;\n height: 75%;\n outline: none;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n margin-left: 8px;\n height: 22px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n width: 210px;\n height: 22px;\n line-height: 22px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container input.igv-search-input {\n cursor: text;\n width: 85%;\n height: 22px;\n line-height: 22px;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n text-align: left;\n padding-left: 8px;\n margin-right: 8px;\n outline: none;\n border-style: solid;\n border-radius: 3px;\n border-width: thin;\n border-color: #bfbfbf;\n background-color: white;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container .igv-search-icon-container {\n cursor: pointer;\n height: 16px;\n width: 16px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-windowsize-panel-container {\n margin-left: 4px;\n user-select: none;\n}\n.igv-navbar .igv-navbar-right-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 32px;\n line-height: 32px;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 100%;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container div {\n margin-left: 0;\n margin-right: 4px;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container div:last-child {\n margin-left: 0;\n margin-right: 0;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container-750 {\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget {\n color: #737373;\n font-size: 18px;\n height: 32px;\n line-height: 32px;\n margin-left: 8px;\n user-select: none;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div {\n cursor: pointer;\n margin-left: unset;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:first-child {\n height: 24px;\n width: 24px;\n margin-left: unset;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:last-child {\n height: 24px;\n width: 24px;\n margin-left: 8px;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:nth-child(even) {\n display: block;\n height: fit-content;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget input {\n display: block;\n width: 125px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget svg {\n display: block;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 {\n color: #737373;\n font-size: 18px;\n height: 32px;\n line-height: 32px;\n margin-left: 8px;\n user-select: none;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div {\n cursor: pointer;\n margin-left: unset;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:first-child {\n height: 24px;\n width: 24px;\n margin-left: unset;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:last-child {\n height: 24px;\n width: 24px;\n margin-left: 8px;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:nth-child(even) {\n width: 0;\n height: 0;\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 input {\n width: 0;\n height: 0;\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 svg {\n display: block;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-hidden {\n display: none;\n}\n\n.igv-navbar-button {\n display: block;\n box-sizing: unset;\n padding-left: 6px;\n padding-right: 6px;\n height: 18px;\n text-transform: capitalize;\n user-select: none;\n line-height: 18px;\n text-align: center;\n vertical-align: middle;\n font-family: \"Open Sans\", sans-serif;\n font-size: 11px;\n font-weight: 200;\n color: #737373;\n background-color: #f3f3f3;\n border-color: #737373;\n border-style: solid;\n border-width: thin;\n border-radius: 6px;\n}\n\n.igv-navbar-button-clicked {\n color: white;\n background-color: #737373;\n}\n\n.igv-navbar-button:hover {\n cursor: pointer;\n}\n\n.igv-zoom-in-notice-container {\n z-index: 1024;\n position: absolute;\n top: 8px;\n left: 50%;\n transform: translate(-50%, 0%);\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n background-color: white;\n}\n.igv-zoom-in-notice-container > div {\n padding-left: 4px;\n padding-right: 4px;\n padding-top: 2px;\n padding-bottom: 2px;\n width: 100%;\n height: 100%;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n color: #3f3f3f;\n}\n\n.igv-zoom-in-notice {\n position: absolute;\n top: 10px;\n left: 50%;\n}\n.igv-zoom-in-notice div {\n position: relative;\n left: -50%;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #3f3f3f;\n background-color: rgba(255, 255, 255, 0.51);\n z-index: 64;\n}\n\n.igv-container-spinner {\n position: absolute;\n top: 90%;\n left: 50%;\n transform: translate(-50%, -50%);\n z-index: 1024;\n width: 24px;\n height: 24px;\n pointer-events: none;\n color: #737373;\n}\n\n.igv-multi-locus-close-button {\n position: absolute;\n top: 2px;\n right: 0;\n padding-left: 2px;\n padding-right: 2px;\n width: 18px;\n height: 18px;\n color: #666666;\n background-color: white;\n z-index: 1000;\n}\n.igv-multi-locus-close-button > svg {\n vertical-align: top;\n}\n\n.igv-multi-locus-close-button:hover {\n cursor: pointer;\n color: #434343;\n}\n\n.igv-multi-locus-ruler-label {\n z-index: 64;\n position: absolute;\n top: 2px;\n left: 0;\n width: 100%;\n height: 14px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n}\n.igv-multi-locus-ruler-label div {\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n color: rgb(16, 16, 16);\n background-color: white;\n}\n\n.igv-multi-locus-ruler-label-square-dot {\n z-index: 64;\n position: absolute;\n left: 50%;\n top: 5%;\n transform: translate(-50%, 0%);\n background-color: white;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-multi-locus-ruler-label-square-dot > div:first-child {\n width: 14px;\n height: 14px;\n}\n.igv-multi-locus-ruler-label-square-dot > div:last-child {\n margin-left: 16px;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n color: rgb(16, 16, 16);\n}\n\n.igv-multi-locus-ruler-label:hover {\n cursor: pointer;\n}\n\n.igv-ruler-sweeper {\n display: none;\n pointer-events: none;\n position: absolute;\n top: 26px;\n bottom: 0;\n left: 0;\n width: 0;\n z-index: 99999;\n background-color: rgba(68, 134, 247, 0.25);\n}\n\n.igv-ruler-tooltip {\n pointer-events: none;\n z-index: 128;\n position: absolute;\n top: 0;\n left: 0;\n width: 1px;\n height: 32px;\n background-color: transparent;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-ruler-tooltip > div {\n pointer-events: none;\n width: 128px;\n height: auto;\n padding: 1px;\n color: #373737;\n font-size: 10px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n background-color: white;\n border-style: solid;\n border-width: thin;\n border-color: #373737;\n}\n\n.igv-track-label {\n position: absolute;\n left: 8px;\n top: 8px;\n width: auto;\n height: auto;\n max-width: 200px;\n padding-left: 4px;\n padding-right: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n text-align: center;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n border-color: #444;\n border-radius: 2px;\n border-style: solid;\n border-width: thin;\n background-color: white;\n z-index: 128;\n cursor: pointer;\n}\n\n.igv-track-label:hover,\n.igv-track-label:focus,\n.igv-track-label:active {\n background-color: #e8e8e8;\n}\n\n.igv-track-label-popup-shim {\n padding-left: 8px;\n padding-right: 8px;\n padding-top: 4px;\n}\n\n.igv-center-line {\n display: none;\n pointer-events: none;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 50%;\n transform: translateX(-50%);\n z-index: 8;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n border-left-style: dashed;\n border-left-width: thin;\n border-right-style: dashed;\n border-right-width: thin;\n}\n\n.igv-center-line-wide {\n background-color: rgba(0, 0, 0, 0);\n border-left-color: rgba(127, 127, 127, 0.51);\n border-right-color: rgba(127, 127, 127, 0.51);\n}\n\n.igv-center-line-thin {\n background-color: rgba(0, 0, 0, 0);\n border-left-color: rgba(127, 127, 127, 0.51);\n border-right-color: rgba(0, 0, 0, 0);\n}\n\n.igv-cursor-guide-horizontal {\n display: none;\n pointer-events: none;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n position: absolute;\n left: 0;\n right: 0;\n top: 50%;\n height: 1px;\n z-index: 1;\n margin-left: 50px;\n margin-right: 54px;\n border-top-style: dotted;\n border-top-width: thin;\n border-top-color: rgba(127, 127, 127, 0.76);\n}\n\n.igv-cursor-guide-vertical {\n pointer-events: none;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 50%;\n width: 1px;\n z-index: 1;\n border-left-style: dotted;\n border-left-width: thin;\n border-left-color: rgba(127, 127, 127, 0.76);\n display: none;\n}\n\n.igv-user-feedback {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 512px;\n height: 360px;\n z-index: 2048;\n background-color: white;\n border-color: #a2a2a2;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #444;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-user-feedback div:first-child {\n position: relative;\n height: 24px;\n width: 100%;\n background-color: white;\n border-bottom-color: #a2a2a2;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-user-feedback div:first-child div {\n position: absolute;\n top: 2px;\n width: 16px;\n height: 16px;\n background-color: transparent;\n}\n.igv-user-feedback div:first-child div:first-child {\n left: 8px;\n}\n.igv-user-feedback div:first-child div:last-child {\n cursor: pointer;\n right: 8px;\n}\n.igv-user-feedback div:last-child {\n width: 100%;\n height: calc(100% - 24px);\n border-width: 0;\n}\n.igv-user-feedback div:last-child div {\n width: auto;\n height: auto;\n margin: 8px;\n}\n\n.igv-generic-dialog-container {\n position: absolute;\n top: 0;\n left: 0;\n width: 300px;\n height: 200px;\n border-color: #7F7F7F;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n z-index: 2048;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n width: 100%;\n height: 24px;\n cursor: move;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header div {\n margin-right: 4px;\n margin-bottom: 2px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header div:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-generic-dialog-container .igv-generic-dialog-one-liner {\n color: #373737;\n width: 95%;\n height: 24px;\n line-height: 24px;\n text-align: left;\n margin-top: 8px;\n padding-left: 8px;\n overflow-wrap: break-word;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input {\n margin-top: 8px;\n width: 95%;\n height: 24px;\n color: #373737;\n line-height: 24px;\n padding-left: 8px;\n background-color: white;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input div {\n width: 30%;\n height: 100%;\n font-size: 16px;\n text-align: right;\n padding-right: 8px;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input input {\n display: block;\n height: 100%;\n width: 100%;\n padding-left: 4px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n color: #373737;\n text-align: left;\n outline: none;\n border-style: solid;\n border-width: thin;\n border-color: #7F7F7F;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input input {\n width: 50%;\n font-size: 16px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input {\n margin-top: 8px;\n width: calc(100% - 16px);\n height: 24px;\n color: #373737;\n line-height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input input {\n display: block;\n height: 100%;\n width: 100%;\n padding-left: 4px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n color: #373737;\n text-align: left;\n outline: none;\n border-style: solid;\n border-width: thin;\n border-color: #7F7F7F;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input input {\n font-size: 16px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel {\n width: 100%;\n height: 28px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div {\n margin-top: 32px;\n color: white;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n width: 75px;\n height: 28px;\n line-height: 28px;\n text-align: center;\n border-color: transparent;\n border-style: solid;\n border-width: thin;\n border-radius: 2px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:first-child {\n margin-left: 32px;\n margin-right: 0;\n background-color: #5ea4e0;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:last-child {\n margin-left: 0;\n margin-right: 32px;\n background-color: #c4c4c4;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:first-child:hover {\n cursor: pointer;\n background-color: #3b5c7f;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:last-child:hover {\n cursor: pointer;\n background-color: #7f7f7f;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok {\n width: 100%;\n height: 36px;\n margin-top: 32px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok div {\n width: 98px;\n height: 36px;\n line-height: 36px;\n text-align: center;\n color: white;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n border-color: white;\n border-style: solid;\n border-width: thin;\n border-radius: 4px;\n background-color: #2B81AF;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok div:hover {\n cursor: pointer;\n background-color: #25597f;\n}\n\n.igv-generic-container {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 2048;\n background-color: white;\n cursor: pointer;\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-container div:first-child {\n cursor: move;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n height: 24px;\n width: 100%;\n background-color: #dddddd;\n}\n.igv-generic-container div:first-child i {\n display: block;\n color: #5f5f5f;\n cursor: pointer;\n width: 14px;\n height: 14px;\n margin-right: 8px;\n margin-bottom: 4px;\n}\n\n.igv-menu-popup {\n position: absolute;\n top: 0;\n left: 0;\n width: max-content;\n z-index: 4096;\n cursor: pointer;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n color: #4b4b4b;\n background: white;\n border-radius: 4px;\n border-color: #7F7F7F;\n border-style: solid;\n border-width: thin;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-end;\n text-align: left;\n}\n.igv-menu-popup > div:not(:first-child) {\n width: 100%;\n}\n.igv-menu-popup > div:not(:first-child) > div {\n background: white;\n}\n.igv-menu-popup > div:not(:first-child) > div.context-menu {\n padding-left: 4px;\n padding-right: 4px;\n}\n.igv-menu-popup > div:not(:first-child) > div:last-child {\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-menu-popup > div:not(:first-child) > div:hover {\n background: #efefef;\n}\n\n.igv-menu-popup-shim {\n padding-left: 8px;\n padding-right: 8px;\n padding-bottom: 1px;\n padding-top: 1px;\n}\n\n.igv-menu-popup-header {\n position: relative;\n width: 100%;\n height: 24px;\n cursor: move;\n border-top-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-menu-popup-header div {\n margin-right: 4px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-menu-popup-header div:hover {\n cursor: pointer;\n color: #444;\n}\n\n.igv-menu-popup-check-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n width: 100%;\n height: 20px;\n margin-right: 4px;\n background-color: transparent;\n}\n.igv-menu-popup-check-container div {\n padding-top: 2px;\n padding-left: 8px;\n}\n.igv-menu-popup-check-container div:first-child {\n position: relative;\n width: 12px;\n height: 12px;\n}\n.igv-menu-popup-check-container div:first-child svg {\n position: absolute;\n width: 12px;\n height: 12px;\n}\n\n.igv-user-feedback {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 512px;\n height: 360px;\n z-index: 2048;\n background-color: white;\n border-color: #a2a2a2;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #444;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-user-feedback div:first-child {\n position: relative;\n height: 24px;\n width: 100%;\n background-color: white;\n border-bottom-color: #a2a2a2;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-user-feedback div:first-child div {\n position: absolute;\n top: 2px;\n width: 16px;\n height: 16px;\n background-color: transparent;\n}\n.igv-user-feedback div:first-child div:first-child {\n left: 8px;\n}\n.igv-user-feedback div:first-child div:last-child {\n cursor: pointer;\n right: 8px;\n}\n.igv-user-feedback div:last-child {\n width: 100%;\n height: calc(100% - 24px);\n border-width: 0;\n}\n.igv-user-feedback div:last-child div {\n width: auto;\n height: auto;\n margin: 8px;\n}\n\n.igv-loading-spinner-container {\n z-index: 1024;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 32px;\n height: 32px;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n}\n.igv-loading-spinner-container > div {\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n border-radius: 50%;\n border: 4px solid rgba(128, 128, 128, 0.5);\n border-top-color: rgb(255, 255, 255);\n animation: spin 1s ease-in-out infinite;\n -webkit-animation: spin 1s ease-in-out infinite;\n}\n\n@keyframes spin {\n to {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n@-webkit-keyframes spin {\n to {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n.igv-roi-menu-next-gen {\n position: absolute;\n z-index: 512;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n color: #4b4b4b;\n background-color: white;\n width: 192px;\n border-radius: 4px;\n border-color: #7F7F7F;\n border-style: solid;\n border-width: thin;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-menu-next-gen > div:first-child {\n height: 24px;\n border-top-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-roi-menu-next-gen > div:first-child > div {\n margin-right: 4px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-roi-menu-next-gen > div:first-child > div:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-roi-menu-next-gen > div:last-child {\n background-color: white;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: 0;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n text-align: start;\n vertical-align: middle;\n cursor: pointer;\n}\n.igv-roi-menu-next-gen > div:last-child > div {\n height: 24px;\n padding-left: 4px;\n border-bottom-style: solid;\n border-bottom-width: thin;\n border-bottom-color: #7f7f7f;\n}\n.igv-roi-menu-next-gen > div:last-child > div:not(:first-child):hover {\n background-color: rgba(127, 127, 127, 0.1);\n}\n.igv-roi-menu-next-gen > div:last-child div:first-child {\n cursor: default;\n font-style: italic;\n text-align: center;\n padding-right: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.igv-roi-menu-next-gen > div:last-child > div:last-child {\n border-bottom-width: 0;\n border-bottom-color: transparent;\n}\n\n.igv-roi-placeholder {\n font-style: normal;\n color: rgba(75, 75, 75, 0.6);\n}\n\n.igv-roi-table {\n position: absolute;\n z-index: 1024;\n width: fit-content;\n border-color: #7f7f7f;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: 12px;\n font-weight: 400;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-table > div {\n height: 24px;\n font-size: 14px;\n text-align: start;\n vertical-align: middle;\n line-height: 24px;\n}\n.igv-roi-table > div:first-child {\n border-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-top-width: 0;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n cursor: move;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n}\n.igv-roi-table > div:first-child > div:first-child {\n text-align: center;\n width: calc(100% - 4px - 12px);\n}\n.igv-roi-table > div:first-child > div:last-child {\n margin-right: 4px;\n margin-bottom: 2px;\n height: 12px;\n width: 12px;\n color: #7f7f7f;\n}\n.igv-roi-table > div:first-child > div:last-child > svg {\n display: block;\n}\n.igv-roi-table > div:first-child > div:last-child:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-roi-table > .igv-roi-table-column-titles {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n padding-right: 16px;\n background-color: white;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: center;\n margin-left: 4px;\n margin-right: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:nth-child(1) {\n width: 20%;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:nth-child(2) {\n width: 15%;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:nth-child(3) {\n width: 15%;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:nth-child(4) {\n width: 30%;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:nth-child(5) {\n width: 20%;\n}\n.igv-roi-table > .igv-roi-table-row-container {\n resize: both;\n overflow: scroll;\n min-width: 512px;\n min-height: 72px;\n height: 144px;\n max-height: 480px;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: center;\n margin-left: 4px;\n margin-right: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(1) {\n width: 20%;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(2) {\n width: 15%;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(3) {\n width: 15%;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(4) {\n width: 30%;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(5) {\n width: 20%;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row-hover {\n background-color: rgba(0, 0, 0, 0.04);\n}\n.igv-roi-table > div:last-child {\n height: 32px;\n line-height: 32px;\n border-top-color: #7f7f7f;\n border-top-style: solid;\n border-top-width: thin;\n border-bottom-color: transparent;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-width: 0;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n\n.igv-roi-table-four-column {\n position: absolute;\n z-index: 1024;\n width: fit-content;\n border-color: #7f7f7f;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: 12px;\n font-weight: 400;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-table-four-column > div {\n height: 24px;\n font-size: 14px;\n text-align: start;\n vertical-align: middle;\n line-height: 24px;\n}\n.igv-roi-table-four-column > div:first-child {\n border-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-top-width: 0;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n cursor: move;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n}\n.igv-roi-table-four-column > div:first-child > div:first-child {\n text-align: center;\n width: calc(100% - 4px - 12px);\n}\n.igv-roi-table-four-column > div:first-child > div:last-child {\n margin-right: 4px;\n margin-bottom: 2px;\n height: 12px;\n width: 12px;\n color: #7f7f7f;\n}\n.igv-roi-table-four-column > div:first-child > div:last-child > svg {\n display: block;\n}\n.igv-roi-table-four-column > div:first-child > div:last-child:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-roi-table-four-column > .igv-roi-table-column-titles {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n padding-right: 16px;\n background-color: white;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-roi-table-four-column > .igv-roi-table-column-titles > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: center;\n margin-left: 4px;\n margin-right: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.igv-roi-table-four-column > .igv-roi-table-column-titles > div:nth-child(1) {\n width: 25%;\n}\n.igv-roi-table-four-column > .igv-roi-table-column-titles > div:nth-child(2) {\n width: 20%;\n}\n.igv-roi-table-four-column > .igv-roi-table-column-titles > div:nth-child(3) {\n width: 20%;\n}\n.igv-roi-table-four-column > .igv-roi-table-column-titles > div:nth-child(4) {\n width: 35%;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container {\n resize: both;\n overflow: scroll;\n min-width: 512px;\n min-height: 72px;\n height: 144px;\n max-height: 480px;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container > .igv-roi-table-row {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container > .igv-roi-table-row > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: center;\n margin-left: 4px;\n margin-right: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(1) {\n width: 25%;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(2) {\n width: 20%;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(3) {\n width: 20%;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(4) {\n width: 35%;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container > .igv-roi-table-row-hover {\n background-color: rgba(0, 0, 0, 0.04);\n}\n.igv-roi-table-four-column > div:last-child {\n height: 32px;\n line-height: 32px;\n border-top-color: #7f7f7f;\n border-top-style: solid;\n border-top-width: thin;\n border-bottom-color: transparent;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-width: 0;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n\n.igv-roi-table-row-selected {\n background-color: rgba(0, 0, 0, 0.125);\n}\n\n.igv-roi-table-button {\n height: 20px;\n user-select: none;\n line-height: 20px;\n text-align: center;\n vertical-align: middle;\n font-family: \"Open Sans\", sans-serif;\n font-size: 13px;\n font-weight: 400;\n color: black;\n padding-left: 6px;\n padding-right: 6px;\n background-color: rgb(239, 239, 239);\n border-color: black;\n border-style: solid;\n border-width: thin;\n border-radius: 3px;\n}\n\n.igv-roi-table-button:hover {\n cursor: pointer;\n font-weight: 400;\n background-color: rgba(0, 0, 0, 0.13);\n}\n\n.igv-roi-region {\n z-index: 64;\n position: absolute;\n top: 0;\n bottom: 0;\n pointer-events: none;\n overflow: visible;\n margin-top: 44px;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-region > div {\n position: relative;\n width: 100%;\n height: 8px;\n cursor: pointer;\n pointer-events: auto;\n}\n\n.igv-roi-menu {\n position: absolute;\n z-index: 1024;\n width: 144px;\n border-color: #7f7f7f;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-menu > div:not(:last-child) {\n border-bottom-color: rgba(128, 128, 128, 0.5);\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-roi-menu > div:first-child {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-top-color: transparent;\n border-top-style: solid;\n border-top-width: 0;\n}\n.igv-roi-menu > div:last-child {\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: 0;\n}\n\n.igv-roi-menu-row {\n height: 24px;\n padding-left: 8px;\n font-size: small;\n text-align: start;\n vertical-align: middle;\n line-height: 24px;\n background-color: white;\n}\n\n.igv-roi-menu-row-edit-description {\n width: -webkit-fill-available;\n font-size: small;\n text-align: start;\n vertical-align: middle;\n background-color: white;\n padding-left: 4px;\n padding-right: 4px;\n padding-bottom: 4px;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n}\n.igv-roi-menu-row-edit-description > label {\n margin-left: 2px;\n margin-bottom: 0;\n display: block;\n width: -webkit-fill-available;\n}\n.igv-roi-menu-row-edit-description > input {\n display: block;\n margin-left: 2px;\n margin-right: 2px;\n margin-bottom: 1px;\n width: -webkit-fill-available;\n}\n\n.igv-container {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n padding-top: 4px;\n user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n}\n\n.igv-viewport {\n position: relative;\n margin-top: 5px;\n overflow-x: hidden;\n overflow-y: hidden;\n}\n\n.igv-viewport-content {\n position: relative;\n width: 100%;\n}\n.igv-viewport-content > canvas {\n position: relative;\n display: block;\n}\n\n.igv-column-container {\n position: relative;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n width: 100%;\n}\n\n.igv-column-shim {\n width: 1px;\n margin-left: 2px;\n margin-right: 2px;\n background-color: #545453;\n}\n\n.igv-column {\n position: relative;\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n}\n\n.igv-axis-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 50px;\n}\n.igv-axis-column > div {\n margin-top: 5px;\n width: 100%;\n}\n\n.igv-sample-name-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n}\n\n.igv-scrollbar-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 14px;\n}\n.igv-scrollbar-column > div {\n position: relative;\n margin-top: 5px;\n width: 14px;\n}\n.igv-scrollbar-column > div > div {\n cursor: pointer;\n position: absolute;\n top: 0;\n left: 2px;\n width: 8px;\n border-width: 1px;\n border-style: solid;\n border-color: #c4c4c4;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n}\n.igv-scrollbar-column > div > div:hover {\n background-color: #c4c4c4;\n}\n\n.igv-track-drag-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 12px;\n background-color: white;\n}\n.igv-track-drag-column > .igv-track-drag-handle {\n z-index: 512;\n position: relative;\n cursor: pointer;\n margin-top: 5px;\n width: 100%;\n border-style: solid;\n border-width: 0;\n border-top-right-radius: 6px;\n border-bottom-right-radius: 6px;\n background-color: #c4c4c4;\n}\n.igv-track-drag-column .igv-track-drag-handle-hover {\n background-color: #787878;\n}\n.igv-track-drag-column > .igv-track-drag-shim {\n position: relative;\n margin-top: 5px;\n width: 100%;\n border-style: solid;\n border-width: 0;\n}\n\n.igv-gear-menu-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 28px;\n}\n.igv-gear-menu-column > div {\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n margin-top: 5px;\n width: 100%;\n background: white;\n}\n.igv-gear-menu-column > div > div {\n position: relative;\n margin-top: 4px;\n width: 16px;\n height: 16px;\n color: #7F7F7F;\n}\n.igv-gear-menu-column > div > div:hover {\n cursor: pointer;\n color: #444;\n}\n\n/*# sourceMappingURL=dom.css.map */\n';
54045
+ var css = '.igv-navbar {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n box-sizing: border-box;\n width: 100%;\n color: #444;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n line-height: 32px;\n padding-left: 8px;\n padding-right: 8px;\n margin-top: 2px;\n margin-bottom: 6px;\n height: 32px;\n border-style: solid;\n border-radius: 3px;\n border-width: thin;\n border-color: #bfbfbf;\n background-color: #f3f3f3;\n}\n.igv-navbar .igv-navbar-left-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 32px;\n line-height: 32px;\n}\n.igv-navbar .igv-navbar-left-container .igv-logo {\n width: 34px;\n height: 32px;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-left-container .igv-current-genome {\n height: 32px;\n margin-left: 4px;\n margin-right: 4px;\n user-select: none;\n line-height: 32px;\n vertical-align: middle;\n text-align: center;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 100%;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-chromosome-select-widget-container {\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n height: 100%;\n width: 125px;\n margin-right: 4px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-chromosome-select-widget-container select {\n display: block;\n cursor: pointer;\n width: 100px;\n height: 75%;\n outline: none;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n margin-left: 8px;\n height: 22px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n width: 210px;\n height: 22px;\n line-height: 22px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container input.igv-search-input {\n cursor: text;\n width: 85%;\n height: 22px;\n line-height: 22px;\n font-size: 12px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n text-align: left;\n padding-left: 8px;\n margin-right: 8px;\n outline: none;\n border-style: solid;\n border-radius: 3px;\n border-width: thin;\n border-color: #bfbfbf;\n background-color: white;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-search-container .igv-search-icon-container {\n cursor: pointer;\n height: 16px;\n width: 16px;\n}\n.igv-navbar .igv-navbar-left-container .igv-navbar-genomic-location .igv-locus-size-group .igv-windowsize-panel-container {\n margin-left: 4px;\n user-select: none;\n}\n.igv-navbar .igv-navbar-right-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 32px;\n line-height: 32px;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n height: 100%;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container div {\n margin-left: 0;\n margin-right: 4px;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container div:last-child {\n margin-left: 0;\n margin-right: 0;\n}\n.igv-navbar .igv-navbar-right-container .igv-navbar-toggle-button-container-750 {\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget {\n color: #737373;\n font-size: 18px;\n height: 32px;\n line-height: 32px;\n margin-left: 8px;\n user-select: none;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div {\n cursor: pointer;\n margin-left: unset;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:first-child {\n height: 24px;\n width: 24px;\n margin-left: unset;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:last-child {\n height: 24px;\n width: 24px;\n margin-left: 8px;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget div:nth-child(even) {\n display: block;\n height: fit-content;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget input {\n display: block;\n width: 125px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget svg {\n display: block;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 {\n color: #737373;\n font-size: 18px;\n height: 32px;\n line-height: 32px;\n margin-left: 8px;\n user-select: none;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div {\n cursor: pointer;\n margin-left: unset;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:first-child {\n height: 24px;\n width: 24px;\n margin-left: unset;\n margin-right: 8px;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:last-child {\n height: 24px;\n width: 24px;\n margin-left: 8px;\n margin-right: unset;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 div:nth-child(even) {\n width: 0;\n height: 0;\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 input {\n width: 0;\n height: 0;\n display: none;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-900 svg {\n display: block;\n}\n.igv-navbar .igv-navbar-right-container .igv-zoom-widget-hidden {\n display: none;\n}\n\n.igv-navbar-button {\n display: block;\n box-sizing: unset;\n padding-left: 6px;\n padding-right: 6px;\n height: 18px;\n text-transform: capitalize;\n user-select: none;\n line-height: 18px;\n text-align: center;\n vertical-align: middle;\n font-family: \"Open Sans\", sans-serif;\n font-size: 11px;\n font-weight: 200;\n color: #737373;\n background-color: #f3f3f3;\n border-color: #737373;\n border-style: solid;\n border-width: thin;\n border-radius: 6px;\n}\n\n.igv-navbar-button-clicked {\n color: white;\n background-color: #737373;\n}\n\n.igv-navbar-button:hover {\n cursor: pointer;\n}\n\n.igv-zoom-in-notice-container {\n z-index: 1024;\n position: absolute;\n top: 8px;\n left: 50%;\n transform: translate(-50%, 0%);\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n background-color: white;\n}\n.igv-zoom-in-notice-container > div {\n padding-left: 4px;\n padding-right: 4px;\n padding-top: 2px;\n padding-bottom: 2px;\n width: 100%;\n height: 100%;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n color: #3f3f3f;\n}\n\n.igv-zoom-in-notice {\n position: absolute;\n top: 10px;\n left: 50%;\n}\n.igv-zoom-in-notice div {\n position: relative;\n left: -50%;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #3f3f3f;\n background-color: rgba(255, 255, 255, 0.51);\n z-index: 64;\n}\n\n.igv-container-spinner {\n position: absolute;\n top: 90%;\n left: 50%;\n transform: translate(-50%, -50%);\n z-index: 1024;\n width: 24px;\n height: 24px;\n pointer-events: none;\n color: #737373;\n}\n\n.igv-multi-locus-close-button {\n position: absolute;\n top: 2px;\n right: 0;\n padding-left: 2px;\n padding-right: 2px;\n width: 18px;\n height: 18px;\n color: #666666;\n background-color: white;\n z-index: 1000;\n}\n.igv-multi-locus-close-button > svg {\n vertical-align: top;\n}\n\n.igv-multi-locus-close-button:hover {\n cursor: pointer;\n color: #434343;\n}\n\n.igv-multi-locus-ruler-label {\n z-index: 64;\n position: absolute;\n top: 2px;\n left: 0;\n width: 100%;\n height: 14px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n}\n.igv-multi-locus-ruler-label div {\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n color: rgb(16, 16, 16);\n background-color: white;\n}\n\n.igv-multi-locus-ruler-label-square-dot {\n z-index: 64;\n position: absolute;\n left: 50%;\n top: 5%;\n transform: translate(-50%, 0%);\n background-color: white;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-multi-locus-ruler-label-square-dot > div:first-child {\n width: 14px;\n height: 14px;\n}\n.igv-multi-locus-ruler-label-square-dot > div:last-child {\n margin-left: 16px;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n color: rgb(16, 16, 16);\n}\n\n.igv-multi-locus-ruler-label:hover {\n cursor: pointer;\n}\n\n.igv-ruler-sweeper {\n display: none;\n pointer-events: none;\n position: absolute;\n top: 26px;\n bottom: 0;\n left: 0;\n width: 0;\n z-index: 99999;\n background-color: rgba(68, 134, 247, 0.25);\n}\n\n.igv-ruler-tooltip {\n pointer-events: none;\n z-index: 128;\n position: absolute;\n top: 0;\n left: 0;\n width: 1px;\n height: 32px;\n background-color: transparent;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-ruler-tooltip > div {\n pointer-events: none;\n width: 128px;\n height: auto;\n padding: 1px;\n color: #373737;\n font-size: 10px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n background-color: white;\n border-style: solid;\n border-width: thin;\n border-color: #373737;\n}\n\n.igv-track-label {\n position: absolute;\n left: 8px;\n top: 8px;\n width: auto;\n height: auto;\n max-width: 200px;\n padding-left: 4px;\n padding-right: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n text-align: center;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n border-color: #444;\n border-radius: 2px;\n border-style: solid;\n border-width: thin;\n background-color: white;\n z-index: 128;\n cursor: pointer;\n}\n\n.igv-track-label:hover,\n.igv-track-label:focus,\n.igv-track-label:active {\n background-color: #e8e8e8;\n}\n\n.igv-track-label-popup-shim {\n padding-left: 8px;\n padding-right: 8px;\n padding-top: 4px;\n}\n\n.igv-center-line {\n display: none;\n pointer-events: none;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 50%;\n transform: translateX(-50%);\n z-index: 8;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n border-left-style: dashed;\n border-left-width: thin;\n border-right-style: dashed;\n border-right-width: thin;\n}\n\n.igv-center-line-wide {\n background-color: rgba(0, 0, 0, 0);\n border-left-color: rgba(127, 127, 127, 0.51);\n border-right-color: rgba(127, 127, 127, 0.51);\n}\n\n.igv-center-line-thin {\n background-color: rgba(0, 0, 0, 0);\n border-left-color: rgba(127, 127, 127, 0.51);\n border-right-color: rgba(0, 0, 0, 0);\n}\n\n.igv-cursor-guide-horizontal {\n display: none;\n pointer-events: none;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n position: absolute;\n left: 0;\n right: 0;\n top: 50%;\n height: 1px;\n z-index: 1;\n margin-left: 50px;\n margin-right: 54px;\n border-top-style: dotted;\n border-top-width: thin;\n border-top-color: rgba(127, 127, 127, 0.76);\n}\n\n.igv-cursor-guide-vertical {\n pointer-events: none;\n user-select: none;\n -moz-user-select: none;\n -webkit-user-select: none;\n position: absolute;\n top: 0;\n bottom: 0;\n left: 50%;\n width: 1px;\n z-index: 1;\n border-left-style: dotted;\n border-left-width: thin;\n border-left-color: rgba(127, 127, 127, 0.76);\n display: none;\n}\n\n.igv-user-feedback {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 512px;\n height: 360px;\n z-index: 2048;\n background-color: white;\n border-color: #a2a2a2;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #444;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-user-feedback div:first-child {\n position: relative;\n height: 24px;\n width: 100%;\n background-color: white;\n border-bottom-color: #a2a2a2;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-user-feedback div:first-child div {\n position: absolute;\n top: 2px;\n width: 16px;\n height: 16px;\n background-color: transparent;\n}\n.igv-user-feedback div:first-child div:first-child {\n left: 8px;\n}\n.igv-user-feedback div:first-child div:last-child {\n cursor: pointer;\n right: 8px;\n}\n.igv-user-feedback div:last-child {\n width: 100%;\n height: calc(100% - 24px);\n border-width: 0;\n}\n.igv-user-feedback div:last-child div {\n width: auto;\n height: auto;\n margin: 8px;\n}\n\n.igv-generic-dialog-container {\n position: absolute;\n top: 0;\n left: 0;\n width: 300px;\n height: 200px;\n border-color: #7F7F7F;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n z-index: 2048;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n width: 100%;\n height: 24px;\n cursor: move;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header div {\n margin-right: 4px;\n margin-bottom: 2px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-generic-dialog-container .igv-generic-dialog-header div:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-generic-dialog-container .igv-generic-dialog-one-liner {\n color: #373737;\n width: 95%;\n height: 24px;\n line-height: 24px;\n text-align: left;\n margin-top: 8px;\n padding-left: 8px;\n overflow-wrap: break-word;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input {\n margin-top: 8px;\n width: 95%;\n height: 24px;\n color: #373737;\n line-height: 24px;\n padding-left: 8px;\n background-color: white;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input div {\n width: 30%;\n height: 100%;\n font-size: 16px;\n text-align: right;\n padding-right: 8px;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input input {\n display: block;\n height: 100%;\n width: 100%;\n padding-left: 4px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n color: #373737;\n text-align: left;\n outline: none;\n border-style: solid;\n border-width: thin;\n border-color: #7F7F7F;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-label-input input {\n width: 50%;\n font-size: 16px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input {\n margin-top: 8px;\n width: calc(100% - 16px);\n height: 24px;\n color: #373737;\n line-height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input input {\n display: block;\n height: 100%;\n width: 100%;\n padding-left: 4px;\n font-family: \"Open Sans\", sans-serif;\n font-weight: 400;\n color: #373737;\n text-align: left;\n outline: none;\n border-style: solid;\n border-width: thin;\n border-color: #7F7F7F;\n background-color: white;\n}\n.igv-generic-dialog-container .igv-generic-dialog-input input {\n font-size: 16px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel {\n width: 100%;\n height: 28px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div {\n margin-top: 32px;\n color: white;\n font-family: \"Open Sans\", sans-serif;\n font-size: 14px;\n font-weight: 400;\n width: 75px;\n height: 28px;\n line-height: 28px;\n text-align: center;\n border-color: transparent;\n border-style: solid;\n border-width: thin;\n border-radius: 2px;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:first-child {\n margin-left: 32px;\n margin-right: 0;\n background-color: #5ea4e0;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:last-child {\n margin-left: 0;\n margin-right: 32px;\n background-color: #c4c4c4;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:first-child:hover {\n cursor: pointer;\n background-color: #3b5c7f;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok-cancel div:last-child:hover {\n cursor: pointer;\n background-color: #7f7f7f;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok {\n width: 100%;\n height: 36px;\n margin-top: 32px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok div {\n width: 98px;\n height: 36px;\n line-height: 36px;\n text-align: center;\n color: white;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n border-color: white;\n border-style: solid;\n border-width: thin;\n border-radius: 4px;\n background-color: #2B81AF;\n}\n.igv-generic-dialog-container .igv-generic-dialog-ok div:hover {\n cursor: pointer;\n background-color: #25597f;\n}\n\n.igv-generic-container {\n position: absolute;\n top: 0;\n left: 0;\n z-index: 2048;\n background-color: white;\n cursor: pointer;\n display: flex;\n flex-direction: row;\n flex-wrap: wrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-generic-container div:first-child {\n cursor: move;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n height: 24px;\n width: 100%;\n background-color: #dddddd;\n}\n.igv-generic-container div:first-child i {\n display: block;\n color: #5f5f5f;\n cursor: pointer;\n width: 14px;\n height: 14px;\n margin-right: 8px;\n margin-bottom: 4px;\n}\n\n.igv-menu-popup {\n position: absolute;\n top: 0;\n left: 0;\n width: max-content;\n z-index: 4096;\n cursor: pointer;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n color: #4b4b4b;\n background: white;\n border-radius: 4px;\n border-color: #7F7F7F;\n border-style: solid;\n border-width: thin;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-end;\n text-align: left;\n}\n.igv-menu-popup > div:not(:first-child) {\n width: 100%;\n}\n.igv-menu-popup > div:not(:first-child) > div {\n background: white;\n}\n.igv-menu-popup > div:not(:first-child) > div.context-menu {\n padding-left: 4px;\n padding-right: 4px;\n}\n.igv-menu-popup > div:not(:first-child) > div:last-child {\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-menu-popup > div:not(:first-child) > div:hover {\n background: #efefef;\n}\n\n.igv-menu-popup-shim {\n padding-left: 8px;\n padding-right: 8px;\n padding-bottom: 1px;\n padding-top: 1px;\n}\n\n.igv-menu-popup-header {\n position: relative;\n width: 100%;\n height: 24px;\n cursor: move;\n border-top-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-menu-popup-header div {\n margin-right: 4px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-menu-popup-header div:hover {\n cursor: pointer;\n color: #444;\n}\n\n.igv-menu-popup-check-container {\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n width: 100%;\n height: 20px;\n margin-right: 4px;\n background-color: transparent;\n}\n.igv-menu-popup-check-container div {\n padding-top: 2px;\n padding-left: 8px;\n}\n.igv-menu-popup-check-container div:first-child {\n position: relative;\n width: 12px;\n height: 12px;\n}\n.igv-menu-popup-check-container div:first-child svg {\n position: absolute;\n width: 12px;\n height: 12px;\n}\n\n.igv-user-feedback {\n position: fixed;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 512px;\n height: 360px;\n z-index: 2048;\n background-color: white;\n border-color: #a2a2a2;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: medium;\n font-weight: 400;\n color: #444;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n}\n.igv-user-feedback div:first-child {\n position: relative;\n height: 24px;\n width: 100%;\n background-color: white;\n border-bottom-color: #a2a2a2;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-user-feedback div:first-child div {\n position: absolute;\n top: 2px;\n width: 16px;\n height: 16px;\n background-color: transparent;\n}\n.igv-user-feedback div:first-child div:first-child {\n left: 8px;\n}\n.igv-user-feedback div:first-child div:last-child {\n cursor: pointer;\n right: 8px;\n}\n.igv-user-feedback div:last-child {\n width: 100%;\n height: calc(100% - 24px);\n border-width: 0;\n}\n.igv-user-feedback div:last-child div {\n width: auto;\n height: auto;\n margin: 8px;\n}\n\n.igv-loading-spinner-container {\n z-index: 1024;\n position: absolute;\n top: 50%;\n left: 50%;\n transform: translate(-50%, -50%);\n width: 32px;\n height: 32px;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: center;\n align-items: center;\n}\n.igv-loading-spinner-container > div {\n box-sizing: border-box;\n width: 100%;\n height: 100%;\n border-radius: 50%;\n border: 4px solid rgba(128, 128, 128, 0.5);\n border-top-color: rgb(255, 255, 255);\n animation: spin 1s ease-in-out infinite;\n -webkit-animation: spin 1s ease-in-out infinite;\n}\n\n@keyframes spin {\n to {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n@-webkit-keyframes spin {\n to {\n -webkit-transform: rotate(360deg);\n transform: rotate(360deg);\n }\n}\n.igv-roi-menu-next-gen {\n position: absolute;\n z-index: 512;\n font-family: \"Open Sans\", sans-serif;\n font-size: small;\n font-weight: 400;\n color: #4b4b4b;\n background-color: white;\n width: 192px;\n border-radius: 4px;\n border-color: #7F7F7F;\n border-style: solid;\n border-width: thin;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-menu-next-gen > div:first-child {\n height: 24px;\n border-top-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-color: #7F7F7F;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: flex-end;\n align-items: center;\n}\n.igv-roi-menu-next-gen > div:first-child > div {\n margin-right: 4px;\n height: 12px;\n width: 12px;\n color: #7F7F7F;\n}\n.igv-roi-menu-next-gen > div:first-child > div:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-roi-menu-next-gen > div:last-child {\n background-color: white;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: 0;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n text-align: start;\n vertical-align: middle;\n cursor: pointer;\n}\n.igv-roi-menu-next-gen > div:last-child > div {\n height: 24px;\n padding-left: 4px;\n border-bottom-style: solid;\n border-bottom-width: thin;\n border-bottom-color: #7f7f7f;\n}\n.igv-roi-menu-next-gen > div:last-child > div:not(:first-child):hover {\n background-color: rgba(127, 127, 127, 0.1);\n}\n.igv-roi-menu-next-gen > div:last-child div:first-child {\n cursor: default;\n font-style: italic;\n text-align: center;\n padding-right: 4px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.igv-roi-menu-next-gen > div:last-child > div:last-child {\n border-bottom-width: 0;\n border-bottom-color: transparent;\n}\n\n.igv-roi-placeholder {\n font-style: normal;\n color: rgba(75, 75, 75, 0.6);\n}\n\n.igv-roi-table {\n position: absolute;\n z-index: 1024;\n width: fit-content;\n border-color: #7f7f7f;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: 12px;\n font-weight: 400;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-table > div {\n height: 24px;\n font-size: 14px;\n text-align: start;\n vertical-align: middle;\n line-height: 24px;\n}\n.igv-roi-table > div:first-child {\n border-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-top-width: 0;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n cursor: move;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n}\n.igv-roi-table > div:first-child > div:first-child {\n text-align: center;\n width: calc(100% - 4px - 12px);\n}\n.igv-roi-table > div:first-child > div:last-child {\n margin-right: 4px;\n margin-bottom: 2px;\n height: 12px;\n width: 12px;\n color: #7f7f7f;\n}\n.igv-roi-table > div:first-child > div:last-child > svg {\n display: block;\n}\n.igv-roi-table > div:first-child > div:last-child:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-roi-table > .igv-roi-table-column-titles {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n padding-right: 16px;\n background-color: white;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: center;\n margin-left: 4px;\n margin-right: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:nth-child(1) {\n width: 20%;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:nth-child(2) {\n width: 15%;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:nth-child(3) {\n width: 15%;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:nth-child(4) {\n width: 30%;\n}\n.igv-roi-table > .igv-roi-table-column-titles > div:nth-child(5) {\n width: 20%;\n}\n.igv-roi-table > .igv-roi-table-row-container {\n resize: both;\n overflow: scroll;\n min-width: 512px;\n min-height: 72px;\n height: 144px;\n max-height: 480px;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: center;\n margin-left: 4px;\n margin-right: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(1) {\n width: 20%;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(2) {\n width: 15%;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(3) {\n width: 15%;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(4) {\n width: 30%;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(5) {\n width: 20%;\n}\n.igv-roi-table > .igv-roi-table-row-container > .igv-roi-table-row-hover {\n background-color: rgba(0, 0, 0, 0.04);\n}\n.igv-roi-table > div:last-child {\n height: 32px;\n line-height: 32px;\n border-top-color: #7f7f7f;\n border-top-style: solid;\n border-top-width: thin;\n border-bottom-color: transparent;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-width: 0;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n\n.igv-roi-table-four-column {\n position: absolute;\n z-index: 1024;\n width: fit-content;\n border-color: #7f7f7f;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n font-size: 12px;\n font-weight: 400;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-table-four-column > div {\n height: 24px;\n font-size: 14px;\n text-align: start;\n vertical-align: middle;\n line-height: 24px;\n}\n.igv-roi-table-four-column > div:first-child {\n border-color: transparent;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-top-width: 0;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n background-color: #eee;\n cursor: move;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-between;\n align-items: center;\n}\n.igv-roi-table-four-column > div:first-child > div:first-child {\n text-align: center;\n width: calc(100% - 4px - 12px);\n}\n.igv-roi-table-four-column > div:first-child > div:last-child {\n margin-right: 4px;\n margin-bottom: 2px;\n height: 12px;\n width: 12px;\n color: #7f7f7f;\n}\n.igv-roi-table-four-column > div:first-child > div:last-child > svg {\n display: block;\n}\n.igv-roi-table-four-column > div:first-child > div:last-child:hover {\n cursor: pointer;\n color: #444;\n}\n.igv-roi-table-four-column > .igv-roi-table-column-titles {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n padding-right: 16px;\n background-color: white;\n border-bottom-color: #7f7f7f;\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-roi-table-four-column > .igv-roi-table-column-titles > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: center;\n margin-left: 4px;\n margin-right: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.igv-roi-table-four-column > .igv-roi-table-column-titles > div:nth-child(1) {\n width: 25%;\n}\n.igv-roi-table-four-column > .igv-roi-table-column-titles > div:nth-child(2) {\n width: 20%;\n}\n.igv-roi-table-four-column > .igv-roi-table-column-titles > div:nth-child(3) {\n width: 20%;\n}\n.igv-roi-table-four-column > .igv-roi-table-column-titles > div:nth-child(4) {\n width: 35%;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container {\n resize: both;\n overflow: scroll;\n min-width: 512px;\n min-height: 72px;\n height: 144px;\n max-height: 480px;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container > .igv-roi-table-row {\n height: 24px;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container > .igv-roi-table-row > div {\n font-size: 14px;\n vertical-align: middle;\n line-height: 24px;\n text-align: center;\n margin-left: 4px;\n margin-right: 4px;\n height: 24px;\n white-space: nowrap;\n overflow: hidden;\n text-overflow: ellipsis;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(1) {\n width: 25%;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(2) {\n width: 20%;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(3) {\n width: 20%;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container > .igv-roi-table-row > div:nth-child(4) {\n width: 35%;\n}\n.igv-roi-table-four-column > .igv-roi-table-row-container > .igv-roi-table-row-hover {\n background-color: rgba(0, 0, 0, 0.04);\n}\n.igv-roi-table-four-column > div:last-child {\n height: 32px;\n line-height: 32px;\n border-top-color: #7f7f7f;\n border-top-style: solid;\n border-top-width: thin;\n border-bottom-color: transparent;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-width: 0;\n display: flex;\n flex-flow: row;\n flex-wrap: nowrap;\n justify-content: space-around;\n align-items: center;\n}\n\n.igv-roi-table-row-selected {\n background-color: rgba(0, 0, 0, 0.125);\n}\n\n.igv-roi-table-button {\n height: 20px;\n user-select: none;\n line-height: 20px;\n text-align: center;\n vertical-align: middle;\n font-family: \"Open Sans\", sans-serif;\n font-size: 13px;\n font-weight: 400;\n color: black;\n padding-left: 6px;\n padding-right: 6px;\n background-color: rgb(239, 239, 239);\n border-color: black;\n border-style: solid;\n border-width: thin;\n border-radius: 3px;\n}\n\n.igv-roi-table-button:hover {\n cursor: pointer;\n font-weight: 400;\n background-color: rgba(0, 0, 0, 0.13);\n}\n\n.igv-roi-region {\n z-index: 64;\n position: absolute;\n top: 0;\n bottom: 0;\n pointer-events: none;\n overflow: visible;\n margin-top: 44px;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-region > div {\n position: relative;\n width: 100%;\n height: 8px;\n cursor: pointer;\n pointer-events: auto;\n}\n\n.igv-roi-menu {\n position: absolute;\n z-index: 1024;\n width: 144px;\n border-color: #7f7f7f;\n border-radius: 4px;\n border-style: solid;\n border-width: thin;\n font-family: \"Open Sans\", sans-serif;\n background-color: white;\n display: flex;\n flex-flow: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n}\n.igv-roi-menu > div:not(:last-child) {\n border-bottom-color: rgba(128, 128, 128, 0.5);\n border-bottom-style: solid;\n border-bottom-width: thin;\n}\n.igv-roi-menu > div:first-child {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-top-color: transparent;\n border-top-style: solid;\n border-top-width: 0;\n}\n.igv-roi-menu > div:last-child {\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n border-bottom-color: transparent;\n border-bottom-style: solid;\n border-bottom-width: 0;\n}\n\n.igv-roi-menu-row {\n height: 24px;\n padding-left: 8px;\n font-size: small;\n text-align: start;\n vertical-align: middle;\n line-height: 24px;\n background-color: white;\n}\n\n.igv-roi-menu-row-edit-description {\n width: -webkit-fill-available;\n font-size: small;\n text-align: start;\n vertical-align: middle;\n background-color: white;\n padding-left: 4px;\n padding-right: 4px;\n padding-bottom: 4px;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: stretch;\n align-items: stretch;\n}\n.igv-roi-menu-row-edit-description > label {\n margin-left: 2px;\n margin-bottom: 0;\n display: block;\n width: -webkit-fill-available;\n}\n.igv-roi-menu-row-edit-description > input {\n display: block;\n margin-left: 2px;\n margin-right: 2px;\n margin-bottom: 1px;\n width: -webkit-fill-available;\n}\n\n.igv-container {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n padding-top: 4px;\n user-select: none;\n -webkit-user-select: none;\n -ms-user-select: none;\n}\n\n.igv-viewport {\n position: relative;\n margin-top: 5px;\n line-height: 1;\n overflow-x: hidden;\n overflow-y: hidden;\n}\n\n.igv-viewport-content {\n position: relative;\n width: 100%;\n}\n.igv-viewport-content > canvas {\n position: relative;\n display: block;\n}\n\n.igv-column-container {\n position: relative;\n display: flex;\n flex-direction: row;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: stretch;\n width: 100%;\n}\n\n.igv-column-shim {\n width: 1px;\n margin-left: 2px;\n margin-right: 2px;\n background-color: #545453;\n}\n\n.igv-column {\n position: relative;\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n}\n\n.igv-axis-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 50px;\n}\n.igv-axis-column > div {\n margin-top: 5px;\n width: 100%;\n}\n\n.igv-sample-name-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n}\n\n.igv-scrollbar-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 14px;\n}\n.igv-scrollbar-column > div {\n position: relative;\n margin-top: 5px;\n width: 14px;\n}\n.igv-scrollbar-column > div > div {\n cursor: pointer;\n position: absolute;\n top: 0;\n left: 2px;\n width: 8px;\n border-width: 1px;\n border-style: solid;\n border-color: #c4c4c4;\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n}\n.igv-scrollbar-column > div > div:hover {\n background-color: #c4c4c4;\n}\n\n.igv-track-drag-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 12px;\n background-color: white;\n}\n.igv-track-drag-column > .igv-track-drag-handle {\n z-index: 512;\n position: relative;\n cursor: pointer;\n margin-top: 5px;\n width: 100%;\n border-style: solid;\n border-width: 0;\n border-top-right-radius: 6px;\n border-bottom-right-radius: 6px;\n background-color: #c4c4c4;\n}\n.igv-track-drag-column .igv-track-drag-handle-hover {\n background-color: #787878;\n}\n.igv-track-drag-column > .igv-track-drag-shim {\n position: relative;\n margin-top: 5px;\n width: 100%;\n border-style: solid;\n border-width: 0;\n}\n\n.igv-gear-menu-column {\n position: relative;\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: flex-start;\n box-sizing: border-box;\n height: 100%;\n width: 28px;\n}\n.igv-gear-menu-column > div {\n display: flex;\n flex-direction: column;\n flex-wrap: nowrap;\n justify-content: flex-start;\n align-items: center;\n margin-top: 5px;\n width: 100%;\n background: white;\n}\n.igv-gear-menu-column > div > div {\n position: relative;\n margin-top: 4px;\n width: 16px;\n height: 16px;\n color: #7F7F7F;\n}\n.igv-gear-menu-column > div > div:hover {\n cursor: pointer;\n color: #444;\n}\n\n/*# sourceMappingURL=dom.css.map */\n';
53987
54046
 
53988
54047
  var style = document.createElement('style');
53989
54048
  style.setAttribute('type', 'text/css');