plotly.js 2.8.3 → 2.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/.circleci/config.yml +39 -1
  2. package/.circleci/env_image.sh +1 -1
  3. package/.circleci/test.sh +14 -1
  4. package/CHANGELOG.md +29 -0
  5. package/CONTRIBUTING.md +1 -1
  6. package/README.md +12 -4
  7. package/dist/README.md +26 -26
  8. package/dist/plot-schema.json +413 -0
  9. package/dist/plotly-basic.js +248 -92
  10. package/dist/plotly-basic.min.js +5 -5
  11. package/dist/plotly-cartesian.js +258 -93
  12. package/dist/plotly-cartesian.min.js +5 -5
  13. package/dist/plotly-finance.js +249 -92
  14. package/dist/plotly-finance.min.js +4 -4
  15. package/dist/plotly-geo-assets.js +3 -3
  16. package/dist/plotly-geo.js +248 -92
  17. package/dist/plotly-geo.min.js +4 -4
  18. package/dist/plotly-gl2d.js +297 -100
  19. package/dist/plotly-gl2d.min.js +8 -8
  20. package/dist/plotly-gl3d.js +298 -100
  21. package/dist/plotly-gl3d.min.js +4 -4
  22. package/dist/plotly-locale-cs.js +1 -1
  23. package/dist/plotly-locale-cy.js +1 -1
  24. package/dist/plotly-locale-de.js +1 -1
  25. package/dist/plotly-locale-es.js +1 -1
  26. package/dist/plotly-locale-fi.js +1 -1
  27. package/dist/plotly-locale-fr.js +1 -1
  28. package/dist/plotly-locale-it.js +1 -1
  29. package/dist/plotly-locale-ja.js +1 -1
  30. package/dist/plotly-locale-ko.js +1 -1
  31. package/dist/plotly-locale-pt-br.js +1 -1
  32. package/dist/plotly-locale-pt-pt.js +1 -1
  33. package/dist/plotly-locale-ru.js +1 -1
  34. package/dist/plotly-locale-sv.js +1 -1
  35. package/dist/plotly-locale-sw.js +1 -1
  36. package/dist/plotly-locale-uk.js +1 -1
  37. package/dist/plotly-locale-zh-cn.js +1 -1
  38. package/dist/plotly-mapbox.js +248 -92
  39. package/dist/plotly-mapbox.min.js +3 -3
  40. package/dist/plotly-strict.js +311 -101
  41. package/dist/plotly-strict.min.js +8 -8
  42. package/dist/plotly-with-meta.js +324 -101
  43. package/dist/plotly.js +312 -101
  44. package/dist/plotly.min.js +11 -11
  45. package/dist/translation-keys.txt +1 -1
  46. package/lib/locales/cs.js +1 -1
  47. package/lib/locales/cy.js +1 -1
  48. package/lib/locales/de.js +1 -1
  49. package/lib/locales/es.js +1 -1
  50. package/lib/locales/fi.js +1 -1
  51. package/lib/locales/fr.js +1 -1
  52. package/lib/locales/it.js +1 -1
  53. package/lib/locales/ja.js +1 -1
  54. package/lib/locales/ko.js +1 -1
  55. package/lib/locales/pt-br.js +1 -1
  56. package/lib/locales/pt-pt.js +1 -1
  57. package/lib/locales/ru.js +1 -1
  58. package/lib/locales/sv.js +1 -1
  59. package/lib/locales/sw.js +1 -1
  60. package/lib/locales/uk.js +1 -1
  61. package/lib/locales/zh-cn.js +1 -1
  62. package/package.json +16 -13
  63. package/src/components/colorbar/attributes.js +1 -0
  64. package/src/components/colorbar/draw.js +1 -0
  65. package/src/components/drawing/index.js +28 -24
  66. package/src/components/legend/draw.js +2 -1
  67. package/src/components/legend/style.js +10 -6
  68. package/src/components/modebar/modebar.js +7 -1
  69. package/src/lib/svg_text_utils.js +106 -21
  70. package/src/plot_api/plot_config.js +9 -0
  71. package/src/plots/cartesian/axes.js +47 -5
  72. package/src/plots/cartesian/layout_attributes.js +14 -0
  73. package/src/plots/cartesian/tick_label_defaults.js +8 -0
  74. package/src/plots/gl3d/layout/axis_defaults.js +1 -0
  75. package/src/plots/polar/layout_attributes.js +1 -0
  76. package/src/plots/smith/layout_defaults.js +1 -0
  77. package/src/plots/ternary/layout_attributes.js +1 -0
  78. package/src/snapshot/tosvg.js +14 -25
  79. package/src/traces/carpet/ab_defaults.js +1 -0
  80. package/src/traces/indicator/attributes.js +1 -0
  81. package/src/traces/scatter/attributes.js +2 -0
  82. package/src/traces/scatter/defaults.js +2 -0
  83. package/src/traces/scatter/plot.js +4 -4
  84. package/src/traces/scatter/style.js +1 -1
  85. package/src/version.js +1 -1
  86. package/stackgl_modules/index.js +49 -8
  87. package/stackgl_modules/package-lock.json +10 -10
  88. package/stackgl_modules/package.json +2 -2
  89. package/tasks/noci_test.sh +1 -1
  90. package/.vscode/launch.json +0 -0
package/dist/plotly.js CHANGED
@@ -1,6 +1,6 @@
1
1
  /**
2
- * plotly.js v2.8.3
3
- * Copyright 2012-2021, Plotly, Inc.
2
+ * plotly.js v2.10.1
3
+ * Copyright 2012-2022, Plotly, Inc.
4
4
  * All rights reserved.
5
5
  * Licensed under the MIT license
6
6
  */
@@ -86336,7 +86336,15 @@ exports.readUInt32BE = function (data, offset) {
86336
86336
 
86337
86337
  function ProbeError(message, code, statusCode) {
86338
86338
  Error.call(this);
86339
- Error.captureStackTrace(this, this.constructor);
86339
+
86340
+ // Include stack trace in error object
86341
+ if (Error.captureStackTrace) {
86342
+ // Chrome and NodeJS
86343
+ Error.captureStackTrace(this, this.constructor);
86344
+ } else {
86345
+ // FF, IE 10+ and Safari 6+. Fallback for others
86346
+ this.stack = (new Error()).stack || '';
86347
+ }
86340
86348
 
86341
86349
  this.name = this.constructor.name;
86342
86350
 
@@ -106110,6 +106118,7 @@ module.exports = overrideAll({
106110
106118
  ticklen: axesAttrs.ticklen,
106111
106119
  tickwidth: axesAttrs.tickwidth,
106112
106120
  tickcolor: axesAttrs.tickcolor,
106121
+ ticklabelstep: axesAttrs.ticklabelstep,
106113
106122
  showticklabels: axesAttrs.showticklabels,
106114
106123
  tickfont: fontAttrs({
106115
106124
  }),
@@ -107200,6 +107209,7 @@ function mockColorBarAxis(gd, opts, zrange) {
107200
107209
  showticklabels: opts.showticklabels,
107201
107210
  ticklabelposition: opts.ticklabelposition,
107202
107211
  ticklabeloverflow: opts.ticklabeloverflow,
107212
+ ticklabelstep: opts.ticklabelstep,
107203
107213
  tickfont: opts.tickfont,
107204
107214
  tickangle: opts.tickangle,
107205
107215
  tickformat: opts.tickformat,
@@ -108938,24 +108948,42 @@ drawing.dashStyle = function(dash, lineWidth) {
108938
108948
  return dash;
108939
108949
  };
108940
108950
 
108951
+ function setFillStyle(sel, trace, gd) {
108952
+ var markerPattern = trace.fillpattern;
108953
+ var patternShape = markerPattern && drawing.getPatternAttr(markerPattern.shape, 0, '');
108954
+ if(patternShape) {
108955
+ var patternBGColor = drawing.getPatternAttr(markerPattern.bgcolor, 0, null);
108956
+ var patternFGColor = drawing.getPatternAttr(markerPattern.fgcolor, 0, null);
108957
+ var patternFGOpacity = markerPattern.fgopacity;
108958
+ var patternSize = drawing.getPatternAttr(markerPattern.size, 0, 8);
108959
+ var patternSolidity = drawing.getPatternAttr(markerPattern.solidity, 0, 0.3);
108960
+ var patternID = trace.uid;
108961
+ drawing.pattern(sel, 'point', gd, patternID,
108962
+ patternShape, patternSize, patternSolidity,
108963
+ undefined, markerPattern.fillmode,
108964
+ patternBGColor, patternFGColor, patternFGOpacity
108965
+ );
108966
+ } else if(trace.fillcolor) {
108967
+ sel.call(Color.fill, trace.fillcolor);
108968
+ }
108969
+ }
108970
+
108941
108971
  // Same as fillGroupStyle, except in this case the selection may be a transition
108942
- drawing.singleFillStyle = function(sel) {
108972
+ drawing.singleFillStyle = function(sel, gd) {
108943
108973
  var node = d3.select(sel.node());
108944
108974
  var data = node.data();
108945
- var fillcolor = (((data[0] || [])[0] || {}).trace || {}).fillcolor;
108946
- if(fillcolor) {
108947
- sel.call(Color.fill, fillcolor);
108948
- }
108975
+ var trace = ((data[0] || [])[0] || {}).trace || {};
108976
+ setFillStyle(sel, trace, gd);
108949
108977
  };
108950
108978
 
108951
- drawing.fillGroupStyle = function(s) {
108979
+ drawing.fillGroupStyle = function(s, gd) {
108952
108980
  s.style('stroke-width', 0)
108953
108981
  .each(function(d) {
108954
108982
  var shape = d3.select(this);
108955
108983
  // N.B. 'd' won't be a calcdata item when
108956
108984
  // fill !== 'none' on a segment-less and marker-less trace
108957
108985
  if(d[0].trace) {
108958
- shape.call(Color.fill, d[0].trace.fillcolor);
108986
+ setFillStyle(shape, d[0].trace, gd);
108959
108987
  }
108960
108988
  });
108961
108989
  };
@@ -109108,12 +109136,7 @@ drawing.gradient = function(sel, gd, gradientID, type, colorscale, prop) {
109108
109136
  sel.style(prop, getFullUrl(fullID, gd))
109109
109137
  .style(prop + '-opacity', null);
109110
109138
 
109111
- var className2query = function(s) {
109112
- return '.' + s.attr('class').replace(/\s/g, '.');
109113
- };
109114
- var k = className2query(d3.select(sel.node().parentNode)) +
109115
- '>' + className2query(sel);
109116
- fullLayout._gradientUrlQueryParts[k] = 1;
109139
+ sel.classed('gradient_filled', true);
109117
109140
  };
109118
109141
 
109119
109142
  /**
@@ -109320,11 +109343,6 @@ drawing.pattern = function(sel, calledBy, gd, patternID, shape, size, solidity,
109320
109343
  .style('fill-opacity', null);
109321
109344
 
109322
109345
  sel.classed('pattern_filled', true);
109323
- var className2query = function(s) {
109324
- return '.' + s.attr('class').replace(/\s/g, '.');
109325
- };
109326
- var k = className2query(d3.select(sel.node().parentNode)) + '>.pattern_filled';
109327
- fullLayout._patternUrlQueryParts[k] = 1;
109328
109346
  };
109329
109347
 
109330
109348
  /*
@@ -109340,9 +109358,7 @@ drawing.initGradients = function(gd) {
109340
109358
  var gradientsGroup = Lib.ensureSingle(fullLayout._defs, 'g', 'gradients');
109341
109359
  gradientsGroup.selectAll('linearGradient,radialGradient').remove();
109342
109360
 
109343
- // initialize stash of query parts filled in Drawing.gradient,
109344
- // used to fix URL strings during image exports
109345
- fullLayout._gradientUrlQueryParts = {};
109361
+ d3.select(gd).selectAll('.gradient_filled').classed('gradient_filled', false);
109346
109362
  };
109347
109363
 
109348
109364
  drawing.initPatterns = function(gd) {
@@ -109351,9 +109367,7 @@ drawing.initPatterns = function(gd) {
109351
109367
  var patternsGroup = Lib.ensureSingle(fullLayout._defs, 'g', 'patterns');
109352
109368
  patternsGroup.selectAll('pattern').remove();
109353
109369
 
109354
- // initialize stash of query parts filled in Drawing.pattern,
109355
- // used to fix URL strings during image exports
109356
- fullLayout._patternUrlQueryParts = {};
109370
+ d3.select(gd).selectAll('.pattern_filled').classed('pattern_filled', false);
109357
109371
  };
109358
109372
 
109359
109373
  drawing.getPatternAttr = function(mp, i, dflt) {
@@ -116006,7 +116020,6 @@ function computeLegendDimensions(gd, groups, traces, legendObj) {
116006
116020
  offsetY += h;
116007
116021
  maxWidthInGroup = Math.max(maxWidthInGroup, textGap + w);
116008
116022
  });
116009
- maxGroupHeightInRow = Math.max(maxGroupHeightInRow, offsetY);
116010
116023
 
116011
116024
  var next = maxWidthInGroup + itemGap;
116012
116025
 
@@ -116022,6 +116035,8 @@ function computeLegendDimensions(gd, groups, traces, legendObj) {
116022
116035
  groupOffsetX = 0;
116023
116036
  groupOffsetY += maxGroupHeightInRow + traceGroupGap;
116024
116037
  maxGroupHeightInRow = offsetY;
116038
+ } else {
116039
+ maxGroupHeightInRow = Math.max(maxGroupHeightInRow, offsetY);
116025
116040
  }
116026
116041
 
116027
116042
  Drawing.setTranslate(this, groupOffsetX, groupOffsetY);
@@ -116689,12 +116704,16 @@ module.exports = function style(s, gd, legend) {
116689
116704
  var colorscale = cOpts.colorscale;
116690
116705
  var reversescale = cOpts.reversescale;
116691
116706
 
116692
- var fillGradient = function(s) {
116707
+ var fillStyle = function(s) {
116693
116708
  if(s.size()) {
116694
- var gradientID = 'legendfill-' + trace.uid;
116695
- Drawing.gradient(s, gd, gradientID,
116696
- getGradientDirection(reversescale),
116697
- colorscale, 'fill');
116709
+ if(showFill) {
116710
+ Drawing.fillGroupStyle(s, gd);
116711
+ } else {
116712
+ var gradientID = 'legendfill-' + trace.uid;
116713
+ Drawing.gradient(s, gd, gradientID,
116714
+ getGradientDirection(reversescale),
116715
+ colorscale, 'fill');
116716
+ }
116698
116717
  }
116699
116718
  };
116700
116719
 
@@ -116723,7 +116742,7 @@ module.exports = function style(s, gd, legend) {
116723
116742
  fill.enter().append('path').classed('js-fill', true);
116724
116743
  fill.exit().remove();
116725
116744
  fill.attr('d', pathStart + 'h' + itemWidth + 'v6h-' + itemWidth + 'z')
116726
- .call(showFill ? Drawing.fillGroupStyle : fillGradient);
116745
+ .call(fillStyle);
116727
116746
 
116728
116747
  if(showLine || showGradientLine) {
116729
116748
  var lw = boundLineWidth(undefined, trace.line, MAX_LINE_WIDTH, CST_LINE_WIDTH);
@@ -118504,6 +118523,8 @@ var isNumeric = _dereq_('fast-isnumeric');
118504
118523
 
118505
118524
  var Lib = _dereq_('../../lib');
118506
118525
  var Icons = _dereq_('../../fonts/ploticon');
118526
+ var version = _dereq_('../../version').version;
118527
+
118507
118528
  var Parser = new DOMParser();
118508
118529
 
118509
118530
  /**
@@ -118782,6 +118803,10 @@ proto.hasButtons = function(buttons) {
118782
118803
  return true;
118783
118804
  };
118784
118805
 
118806
+ function jsVersion(str) {
118807
+ return str + ' (v' + version + ')';
118808
+ }
118809
+
118785
118810
  /**
118786
118811
  * @return {HTMLDivElement} The logo image wrapped in a group
118787
118812
  */
@@ -118791,7 +118816,7 @@ proto.getLogo = function() {
118791
118816
 
118792
118817
  a.href = 'https://plotly.com/';
118793
118818
  a.target = '_blank';
118794
- a.setAttribute('data-title', Lib._(this.graphInfo, 'Produced with Plotly'));
118819
+ a.setAttribute('data-title', jsVersion(Lib._(this.graphInfo, 'Produced with Plotly.js')));
118795
118820
  a.className = 'modebar-btn plotlyjsicon modebar-btn--logo';
118796
118821
 
118797
118822
  a.appendChild(this.createIcon(Icons.newplotlylogo));
@@ -118833,7 +118858,7 @@ function createModeBar(gd, buttons) {
118833
118858
 
118834
118859
  module.exports = createModeBar;
118835
118860
 
118836
- },{"../../fonts/ploticon":482,"../../lib":503,"@plotly/d3":58,"fast-isnumeric":190}],432:[function(_dereq_,module,exports){
118861
+ },{"../../fonts/ploticon":482,"../../lib":503,"../../version":1119,"@plotly/d3":58,"fast-isnumeric":190}],432:[function(_dereq_,module,exports){
118837
118862
  'use strict';
118838
118863
 
118839
118864
  var fontAttrs = _dereq_('../../plots/font_attributes');
@@ -132123,6 +132148,7 @@ exports.convertToTspans = function(_context, gd, _callback) {
132123
132148
  // Until we get tex integrated more fully (so it can be used along with non-tex)
132124
132149
  // allow some elements to prohibit it by attaching 'data-notex' to the original
132125
132150
  var tex = (!_context.attr('data-notex')) &&
132151
+ gd && gd._context.typesetMath &&
132126
132152
  (typeof MathJax !== 'undefined') &&
132127
132153
  str.match(FIND_TEX);
132128
132154
 
@@ -132277,70 +132303,154 @@ function cleanEscapesForTex(s) {
132277
132303
  .replace(GT_MATCH, '\\gt ');
132278
132304
  }
132279
132305
 
132306
+ var inlineMath = [['$', '$'], ['\\(', '\\)']];
132307
+
132280
132308
  function texToSVG(_texString, _config, _callback) {
132309
+ var MathJaxVersion = parseInt(
132310
+ (MathJax.version || '').split('.')[0]
132311
+ );
132312
+
132313
+ if(
132314
+ MathJaxVersion !== 2 &&
132315
+ MathJaxVersion !== 3
132316
+ ) {
132317
+ Lib.warn('No MathJax version:', MathJax.version);
132318
+ return;
132319
+ }
132320
+
132281
132321
  var originalRenderer,
132282
132322
  originalConfig,
132283
132323
  originalProcessSectionDelay,
132284
132324
  tmpDiv;
132285
132325
 
132286
- MathJax.Hub.Queue(
132287
- function() {
132326
+ var setConfig2 = function() {
132288
132327
  originalConfig = Lib.extendDeepAll({}, MathJax.Hub.config);
132289
132328
 
132290
132329
  originalProcessSectionDelay = MathJax.Hub.processSectionDelay;
132291
132330
  if(MathJax.Hub.processSectionDelay !== undefined) {
132292
- // MathJax 2.5+
132331
+ // MathJax 2.5+ but not 3+
132293
132332
  MathJax.Hub.processSectionDelay = 0;
132294
132333
  }
132295
132334
 
132296
132335
  return MathJax.Hub.Config({
132297
132336
  messageStyle: 'none',
132298
132337
  tex2jax: {
132299
- inlineMath: [['$', '$'], ['\\(', '\\)']]
132338
+ inlineMath: inlineMath
132300
132339
  },
132301
132340
  displayAlign: 'left',
132302
132341
  });
132303
- },
132304
- function() {
132305
- // Get original renderer
132342
+ };
132343
+
132344
+ var setConfig3 = function() {
132345
+ originalConfig = Lib.extendDeepAll({}, MathJax.config);
132346
+
132347
+ if(!MathJax.config.tex) {
132348
+ MathJax.config.tex = {};
132349
+ }
132350
+
132351
+ MathJax.config.tex.inlineMath = inlineMath;
132352
+ };
132353
+
132354
+ var setRenderer2 = function() {
132306
132355
  originalRenderer = MathJax.Hub.config.menuSettings.renderer;
132307
132356
  if(originalRenderer !== 'SVG') {
132308
132357
  return MathJax.Hub.setRenderer('SVG');
132309
132358
  }
132310
- },
132311
- function() {
132359
+ };
132360
+
132361
+ var setRenderer3 = function() {
132362
+ originalRenderer = MathJax.config.startup.output;
132363
+ if(originalRenderer !== 'svg') {
132364
+ MathJax.config.startup.output = 'svg';
132365
+ }
132366
+ };
132367
+
132368
+ var initiateMathJax = function() {
132312
132369
  var randomID = 'math-output-' + Lib.randstr({}, 64);
132313
132370
  tmpDiv = d3.select('body').append('div')
132314
132371
  .attr({id: randomID})
132315
- .style({visibility: 'hidden', position: 'absolute'})
132316
- .style({'font-size': _config.fontSize + 'px'})
132372
+ .style({
132373
+ visibility: 'hidden',
132374
+ position: 'absolute',
132375
+ 'font-size': _config.fontSize + 'px'
132376
+ })
132317
132377
  .text(cleanEscapesForTex(_texString));
132318
132378
 
132319
- return MathJax.Hub.Typeset(tmpDiv.node());
132320
- },
132321
- function() {
132322
- var glyphDefs = d3.select('body').select('#MathJax_SVG_glyphs');
132379
+ var tmpNode = tmpDiv.node();
132323
132380
 
132324
- if(tmpDiv.select('.MathJax_SVG').empty() || !tmpDiv.select('svg').node()) {
132381
+ return MathJaxVersion === 2 ?
132382
+ MathJax.Hub.Typeset(tmpNode) :
132383
+ MathJax.typeset([tmpNode]);
132384
+ };
132385
+
132386
+ var finalizeMathJax = function() {
132387
+ var sel = tmpDiv.select(
132388
+ MathJaxVersion === 2 ? '.MathJax_SVG' : '.MathJax'
132389
+ );
132390
+
132391
+ var node = !sel.empty() && tmpDiv.select('svg').node();
132392
+ if(!node) {
132325
132393
  Lib.log('There was an error in the tex syntax.', _texString);
132326
132394
  _callback();
132327
132395
  } else {
132328
- var svgBBox = tmpDiv.select('svg').node().getBoundingClientRect();
132329
- _callback(tmpDiv.select('.MathJax_SVG'), glyphDefs, svgBBox);
132396
+ var nodeBBox = node.getBoundingClientRect();
132397
+ var glyphDefs;
132398
+ if(MathJaxVersion === 2) {
132399
+ glyphDefs = d3.select('body').select('#MathJax_SVG_glyphs');
132400
+ } else {
132401
+ glyphDefs = sel.select('defs');
132402
+ }
132403
+ _callback(sel, glyphDefs, nodeBBox);
132330
132404
  }
132331
132405
 
132332
132406
  tmpDiv.remove();
132407
+ };
132333
132408
 
132409
+ var resetRenderer2 = function() {
132334
132410
  if(originalRenderer !== 'SVG') {
132335
132411
  return MathJax.Hub.setRenderer(originalRenderer);
132336
132412
  }
132337
- },
132338
- function() {
132413
+ };
132414
+
132415
+ var resetRenderer3 = function() {
132416
+ if(originalRenderer !== 'svg') {
132417
+ MathJax.config.startup.output = originalRenderer;
132418
+ }
132419
+ };
132420
+
132421
+ var resetConfig2 = function() {
132339
132422
  if(originalProcessSectionDelay !== undefined) {
132340
132423
  MathJax.Hub.processSectionDelay = originalProcessSectionDelay;
132341
132424
  }
132342
132425
  return MathJax.Hub.Config(originalConfig);
132343
- });
132426
+ };
132427
+
132428
+ var resetConfig3 = function() {
132429
+ MathJax.config = originalConfig;
132430
+ };
132431
+
132432
+ if(MathJaxVersion === 2) {
132433
+ MathJax.Hub.Queue(
132434
+ setConfig2,
132435
+ setRenderer2,
132436
+ initiateMathJax,
132437
+ finalizeMathJax,
132438
+ resetRenderer2,
132439
+ resetConfig2
132440
+ );
132441
+ } else if(MathJaxVersion === 3) {
132442
+ setConfig3();
132443
+ setRenderer3();
132444
+ MathJax.startup.defaultReady();
132445
+
132446
+ MathJax.startup.promise.then(function() {
132447
+ initiateMathJax();
132448
+ finalizeMathJax();
132449
+
132450
+ resetRenderer3();
132451
+ resetConfig3();
132452
+ });
132453
+ }
132344
132454
  }
132345
132455
 
132346
132456
  var TAG_STYLES = {
@@ -138186,6 +138296,11 @@ var configAttributes = {
138186
138296
  dflt: false,
138187
138297
  },
138188
138298
 
138299
+ typesetMath: {
138300
+ valType: 'boolean',
138301
+ dflt: true,
138302
+ },
138303
+
138189
138304
  plotlyServerURL: {
138190
138305
  valType: 'string',
138191
138306
  dflt: '',
@@ -143031,7 +143146,8 @@ axes.calcTicks = function calcTicks(ax, opts) {
143031
143146
  var minRange = Math.min(rng[0], rng[1]);
143032
143147
  var maxRange = Math.max(rng[0], rng[1]);
143033
143148
 
143034
- var isDLog = (ax.type === 'log') && !(isNumeric(ax.dtick) || ax.dtick.charAt(0) === 'L');
143149
+ var numDtick = isNumeric(ax.dtick);
143150
+ var isDLog = (ax.type === 'log') && !(numDtick || ax.dtick.charAt(0) === 'L');
143035
143151
  var isPeriod = ax.ticklabelmode === 'period';
143036
143152
 
143037
143153
  // find the first tick
@@ -143062,13 +143178,36 @@ axes.calcTicks = function calcTicks(ax, opts) {
143062
143178
  x = axes.tickIncrement(x, ax.dtick, !axrev, ax.calendar);
143063
143179
  }
143064
143180
 
143181
+ var ticklabelstep = ax.ticklabelstep;
143182
+
143065
143183
  var maxTicks = Math.max(1000, ax._length || 0);
143066
143184
  var tickVals = [];
143067
143185
  var xPrevious = null;
143186
+
143187
+ var dTick;
143188
+ if(numDtick) {
143189
+ dTick = ax.dtick;
143190
+ } else {
143191
+ if(ax.type === 'date') {
143192
+ if(typeof ax.dtick === 'string' && ax.dtick.charAt(0) === 'M') {
143193
+ dTick = ONEAVGMONTH * ax.dtick.substring(1);
143194
+ }
143195
+ } else {
143196
+ dTick = ax._roughDTick;
143197
+ }
143198
+ }
143199
+
143200
+ var id = Math.round((
143201
+ ax.r2l(x) -
143202
+ ax.r2l(ax.tick0)
143203
+ ) / dTick) - 1;
143204
+
143068
143205
  for(;
143069
143206
  (axrev) ? (x >= endTick) : (x <= endTick);
143070
143207
  x = axes.tickIncrement(x, ax.dtick, axrev, ax.calendar)
143071
143208
  ) {
143209
+ id++;
143210
+
143072
143211
  if(ax.rangebreaks) {
143073
143212
  if(!axrev) {
143074
143213
  if(x < startTick) continue;
@@ -143086,10 +143225,16 @@ axes.calcTicks = function calcTicks(ax, opts) {
143086
143225
  minor = true;
143087
143226
  }
143088
143227
 
143089
- tickVals.push({
143228
+ var obj = {
143090
143229
  minor: minor,
143091
143230
  value: x
143092
- });
143231
+ };
143232
+
143233
+ if(ticklabelstep > 1 && id % ticklabelstep) {
143234
+ obj.skipLabel = true;
143235
+ }
143236
+
143237
+ tickVals.push(obj);
143093
143238
  }
143094
143239
 
143095
143240
  if(isPeriod) positionPeriodTicks(tickVals, ax, ax._definedDelta);
@@ -143142,12 +143287,20 @@ axes.calcTicks = function calcTicks(ax, opts) {
143142
143287
  ax._prevDateHead = '';
143143
143288
  ax._inCalcTicks = true;
143144
143289
 
143290
+ var lastVisibleHead;
143291
+ var hideLabel = function(tick) {
143292
+ tick.text = ' '; // don't use an empty string here which can confuse automargin (issue 5132)
143293
+ ax._prevDateHead = lastVisibleHead;
143294
+ };
143295
+
143145
143296
  var ticksOut = [];
143146
143297
  var t, p;
143147
143298
  for(i = 0; i < tickVals.length; i++) {
143148
143299
  var _minor = tickVals[i].minor;
143149
143300
  var _value = tickVals[i].value;
143150
143301
 
143302
+ lastVisibleHead = ax._prevDateHead;
143303
+
143151
143304
  t = axes.tickText(
143152
143305
  ax,
143153
143306
  _value,
@@ -143162,11 +143315,14 @@ axes.calcTicks = function calcTicks(ax, opts) {
143162
143315
  if(p > maxRange) t.periodX = maxRange;
143163
143316
  if(p < minRange) t.periodX = minRange;
143164
143317
 
143165
- t.text = ' '; // don't use an empty string here which can confuse automargin (issue 5132)
143166
- ax._prevDateHead = '';
143318
+ hideLabel(t);
143167
143319
  }
143168
143320
  }
143169
143321
 
143322
+ if(tickVals[i].skipLabel) {
143323
+ hideLabel(t);
143324
+ }
143325
+
143170
143326
  ticksOut.push(t);
143171
143327
  }
143172
143328
 
@@ -145194,6 +145350,7 @@ axes.drawLabels = function(gd, ax, opts) {
145194
145350
  var axId = ax._id;
145195
145351
  var axLetter = axId.charAt(0);
145196
145352
  var cls = opts.cls || axId + 'tick';
145353
+
145197
145354
  var vals = opts.vals;
145198
145355
 
145199
145356
  var labelFns = opts.labelFns;
@@ -150050,6 +150207,12 @@ module.exports = {
150050
150207
  editType: 'ticks',
150051
150208
  impliedEdits: {tickmode: 'linear'},
150052
150209
  },
150210
+ ticklabelstep: {
150211
+ valType: 'integer',
150212
+ min: 1,
150213
+ dflt: 1,
150214
+ editType: 'ticks',
150215
+ },
150053
150216
  tickvals: {
150054
150217
  valType: 'data_array',
150055
150218
  editType: 'ticks',
@@ -152914,6 +153077,14 @@ module.exports = function handleTickLabelDefaults(containerIn, containerOut, coe
152914
153077
  color: dfltFontColor
152915
153078
  });
152916
153079
 
153080
+ if(
153081
+ !options.noTicklabelstep &&
153082
+ axType !== 'multicategory' &&
153083
+ axType !== 'log'
153084
+ ) {
153085
+ coerce('ticklabelstep');
153086
+ }
153087
+
152917
153088
  if(!options.noAng) coerce('tickangle');
152918
153089
 
152919
153090
  if(axType !== 'category') {
@@ -157822,6 +157993,7 @@ module.exports = function supplyLayoutDefaults(layoutIn, layoutOut, options) {
157822
157993
  showGrid: true,
157823
157994
  noTickson: true,
157824
157995
  noTicklabelmode: true,
157996
+ noTicklabelstep: true,
157825
157997
  noTicklabelposition: true,
157826
157998
  noTicklabeloverflow: true,
157827
157999
  bgColor: options.bgColor,
@@ -165664,6 +165836,7 @@ var axisTickAttrs = overrideAll({
165664
165836
  ticklen: axesAttrs.ticklen,
165665
165837
  tickwidth: axesAttrs.tickwidth,
165666
165838
  tickcolor: axesAttrs.tickcolor,
165839
+ ticklabelstep: axesAttrs.ticklabelstep,
165667
165840
  showticklabels: axesAttrs.showticklabels,
165668
165841
  showtickprefix: axesAttrs.showtickprefix,
165669
165842
  tickprefix: axesAttrs.tickprefix,
@@ -168222,6 +168395,7 @@ function handleDefaults(contIn, contOut, coerce, opts) {
168222
168395
  }
168223
168396
 
168224
168397
  handleTickLabelDefaults(axIn, axOut, coerceAxis, axOut.type, {
168398
+ noTicklabelstep: true,
168225
168399
  noAng: !isRealAxis,
168226
168400
  noExp: true,
168227
168401
  font: {
@@ -168543,6 +168717,7 @@ var ternaryAxesAttrs = {
168543
168717
  ticklen: axesAttrs.ticklen,
168544
168718
  tickwidth: axesAttrs.tickwidth,
168545
168719
  tickcolor: axesAttrs.tickcolor,
168720
+ ticklabelstep: axesAttrs.ticklabelstep,
168546
168721
  showticklabels: axesAttrs.showticklabels,
168547
168722
  showtickprefix: axesAttrs.showtickprefix,
168548
168723
  tickprefix: axesAttrs.tickprefix,
@@ -170563,7 +170738,7 @@ module.exports = function toSVG(gd, format, scale) {
170563
170738
  var toppaper = fullLayout._toppaper;
170564
170739
  var width = fullLayout.width;
170565
170740
  var height = fullLayout.height;
170566
- var i, k;
170741
+ var i;
170567
170742
 
170568
170743
  // make background color a rect in the svg, then revert after scraping
170569
170744
  // all other alterations have been dealt with by properly preparing the svg
@@ -170636,32 +170811,21 @@ module.exports = function toSVG(gd, format, scale) {
170636
170811
  }
170637
170812
  });
170638
170813
 
170639
- var queryParts = [];
170640
- if(fullLayout._gradientUrlQueryParts) {
170641
- for(k in fullLayout._gradientUrlQueryParts) queryParts.push(k);
170642
- }
170643
-
170644
- if(fullLayout._patternUrlQueryParts) {
170645
- for(k in fullLayout._patternUrlQueryParts) queryParts.push(k);
170646
- }
170814
+ svg.selectAll('.gradient_filled,.pattern_filled').each(function() {
170815
+ var pt = d3.select(this);
170647
170816
 
170648
- if(queryParts.length) {
170649
- svg.selectAll(queryParts.join(',')).each(function() {
170650
- var pt = d3.select(this);
170651
-
170652
- // similar to font family styles above,
170653
- // we must remove " after the SVG DOM has been serialized
170654
- var fill = this.style.fill;
170655
- if(fill && fill.indexOf('url(') !== -1) {
170656
- pt.style('fill', fill.replace(DOUBLEQUOTE_REGEX, DUMMY_SUB));
170657
- }
170817
+ // similar to font family styles above,
170818
+ // we must remove " after the SVG DOM has been serialized
170819
+ var fill = this.style.fill;
170820
+ if(fill && fill.indexOf('url(') !== -1) {
170821
+ pt.style('fill', fill.replace(DOUBLEQUOTE_REGEX, DUMMY_SUB));
170822
+ }
170658
170823
 
170659
- var stroke = this.style.stroke;
170660
- if(stroke && stroke.indexOf('url(') !== -1) {
170661
- pt.style('stroke', stroke.replace(DOUBLEQUOTE_REGEX, DUMMY_SUB));
170662
- }
170663
- });
170664
- }
170824
+ var stroke = this.style.stroke;
170825
+ if(stroke && stroke.indexOf('url(') !== -1) {
170826
+ pt.style('stroke', stroke.replace(DOUBLEQUOTE_REGEX, DUMMY_SUB));
170827
+ }
170828
+ });
170665
170829
 
170666
170830
  if(format === 'pdf' || format === 'eps') {
170667
170831
  // these formats make the extra line MathJax adds around symbols look super thick in some cases
@@ -176324,6 +176488,7 @@ function mimickAxisDefaults(traceIn, traceOut, fullLayout, dfltColor) {
176324
176488
  var axOut = Template.newContainer(traceOut, axName);
176325
176489
 
176326
176490
  var defaultOptions = {
176491
+ noTicklabelstep: true,
176327
176492
  tickfont: 'x',
176328
176493
  id: axLetter + 'axis',
176329
176494
  letter: axLetter,
@@ -190844,6 +191009,7 @@ module.exports = {
190844
191009
  ticklen: axesAttrs.ticklen,
190845
191010
  tickwidth: axesAttrs.tickwidth,
190846
191011
  tickcolor: axesAttrs.tickcolor,
191012
+ ticklabelstep: axesAttrs.ticklabelstep,
190847
191013
  showticklabels: axesAttrs.showticklabels,
190848
191014
  tickfont: fontAttrs({
190849
191015
  }),
@@ -204300,6 +204466,7 @@ var hovertemplateAttrs = _dereq_('../../plots/template_attributes').hovertemplat
204300
204466
  var colorScaleAttrs = _dereq_('../../components/colorscale/attributes');
204301
204467
  var fontAttrs = _dereq_('../../plots/font_attributes');
204302
204468
  var dash = _dereq_('../../components/drawing/attributes').dash;
204469
+ var pattern = _dereq_('../../components/drawing/attributes').pattern;
204303
204470
 
204304
204471
  var Drawing = _dereq_('../../components/drawing');
204305
204472
  var constants = _dereq_('./constants');
@@ -204487,6 +204654,7 @@ module.exports = {
204487
204654
  editType: 'style',
204488
204655
  anim: true,
204489
204656
  },
204657
+ fillpattern: pattern,
204490
204658
  marker: extendFlat({
204491
204659
  symbol: {
204492
204660
  valType: 'enumerated',
@@ -205223,6 +205391,7 @@ var handleLineDefaults = _dereq_('./line_defaults');
205223
205391
  var handleLineShapeDefaults = _dereq_('./line_shape_defaults');
205224
205392
  var handleTextDefaults = _dereq_('./text_defaults');
205225
205393
  var handleFillColorDefaults = _dereq_('./fillcolor_defaults');
205394
+ var coercePattern = _dereq_('../../lib').coercePattern;
205226
205395
 
205227
205396
  module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout) {
205228
205397
  function coerce(attr, dflt) {
@@ -205276,6 +205445,7 @@ module.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout
205276
205445
  if(traceOut.fill !== 'none') {
205277
205446
  handleFillColorDefaults(traceIn, traceOut, defaultColor, coerce);
205278
205447
  if(!subTypes.hasLines(traceOut)) handleLineShapeDefaults(traceIn, traceOut, coerce);
205448
+ coercePattern(coerce, 'fillpattern', traceOut.fillcolor, false);
205279
205449
  }
205280
205450
 
205281
205451
  var lineColor = (traceOut.line || {}).color;
@@ -206658,11 +206828,11 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition
206658
206828
  // the points on the axes are the first two points. Otherwise
206659
206829
  // animations get a little crazy if the number of points changes.
206660
206830
  transition(ownFillEl3).attr('d', 'M' + pt1 + 'L' + pt0 + 'L' + fullpath.substr(1))
206661
- .call(Drawing.singleFillStyle);
206831
+ .call(Drawing.singleFillStyle, gd);
206662
206832
  } else {
206663
206833
  // fill to self: just join the path to itself
206664
206834
  transition(ownFillEl3).attr('d', fullpath + 'Z')
206665
- .call(Drawing.singleFillStyle);
206835
+ .call(Drawing.singleFillStyle, gd);
206666
206836
  }
206667
206837
  }
206668
206838
  } else if(tonext) {
@@ -206674,7 +206844,7 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition
206674
206844
  // This makes strange results if one path is *not* entirely
206675
206845
  // inside the other, but then that is a strange usage.
206676
206846
  transition(tonext).attr('d', fullpath + 'Z' + prevRevpath + 'Z')
206677
- .call(Drawing.singleFillStyle);
206847
+ .call(Drawing.singleFillStyle, gd);
206678
206848
  } else {
206679
206849
  // tonextx/y: for now just connect endpoints with lines. This is
206680
206850
  // the correct behavior if the endpoints are at the same value of
@@ -206682,7 +206852,7 @@ function plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transition
206682
206852
  // things depending on whether the new endpoint projects onto the
206683
206853
  // existing curve or off the end of it
206684
206854
  transition(tonext).attr('d', fullpath + 'L' + prevRevpath.substr(1) + 'Z')
206685
- .call(Drawing.singleFillStyle);
206855
+ .call(Drawing.singleFillStyle, gd);
206686
206856
  }
206687
206857
  trace._polygons = trace._polygons.concat(prevPolygons);
206688
206858
  } else {
@@ -207075,7 +207245,7 @@ function style(gd) {
207075
207245
  .call(Drawing.lineGroupStyle);
207076
207246
 
207077
207247
  s.selectAll('g.trace path.js-fill')
207078
- .call(Drawing.fillGroupStyle);
207248
+ .call(Drawing.fillGroupStyle, gd);
207079
207249
 
207080
207250
  Registry.getComponentMethod('errorbars', 'style')(s);
207081
207251
  }
@@ -224091,7 +224261,7 @@ function getSortFunc(opts, d2c) {
224091
224261
  'use strict';
224092
224262
 
224093
224263
  // package version injected by `npm run preprocess`
224094
- exports.version = '2.8.3';
224264
+ exports.version = '2.10.1';
224095
224265
 
224096
224266
  },{}],1120:[function(_dereq_,module,exports){
224097
224267
  (function (global){(function (){
@@ -259271,7 +259441,7 @@ var robustSum = _glvis_("robust-sum")
259271
259441
  var robustScale = _glvis_("robust-scale")
259272
259442
  var compress = _glvis_("robust-compress")
259273
259443
 
259274
- var NUM_EXPANDED = 4
259444
+ var NUM_EXPANDED = 6
259275
259445
 
259276
259446
  function determinant_2(sum, scale, prod, compress) {
259277
259447
  return function robustDeterminant2(m) {
@@ -259285,10 +259455,24 @@ function determinant_3(sum, scale, prod, compress) {
259285
259455
  }
259286
259456
  }
259287
259457
 
259458
+ function determinant_4(sum, scale, prod, compress) {
259459
+ return function robustDeterminant4(m) {
259460
+ return compress(sum(sum(scale(sum(scale(sum(prod(m[2][2], m[3][3]), prod(-m[2][3], m[3][2])), m[1][1]), sum(scale(sum(prod(m[2][1], m[3][3]), prod(-m[2][3], m[3][1])), -m[1][2]), scale(sum(prod(m[2][1], m[3][2]), prod(-m[2][2], m[3][1])), m[1][3]))), m[0][0]), scale(sum(scale(sum(prod(m[2][2], m[3][3]), prod(-m[2][3], m[3][2])), m[1][0]), sum(scale(sum(prod(m[2][0], m[3][3]), prod(-m[2][3], m[3][0])), -m[1][2]), scale(sum(prod(m[2][0], m[3][2]), prod(-m[2][2], m[3][0])), m[1][3]))), -m[0][1])), sum(scale(sum(scale(sum(prod(m[2][1], m[3][3]), prod(-m[2][3], m[3][1])), m[1][0]), sum(scale(sum(prod(m[2][0], m[3][3]), prod(-m[2][3], m[3][0])), -m[1][1]), scale(sum(prod(m[2][0], m[3][1]), prod(-m[2][1], m[3][0])), m[1][3]))), m[0][2]), scale(sum(scale(sum(prod(m[2][1], m[3][2]), prod(-m[2][2], m[3][1])), m[1][0]), sum(scale(sum(prod(m[2][0], m[3][2]), prod(-m[2][2], m[3][0])), -m[1][1]), scale(sum(prod(m[2][0], m[3][1]), prod(-m[2][1], m[3][0])), m[1][2]))), -m[0][3]))))
259461
+ }
259462
+ }
259463
+
259464
+ function determinant_5(sum, scale, prod, compress) {
259465
+ return function robustDeterminant5(m) {
259466
+ return compress(sum(sum(scale(sum(sum(scale(sum(scale(sum(prod(m[3][3], m[4][4]), prod(-m[3][4], m[4][3])), m[2][2]), sum(scale(sum(prod(m[3][2], m[4][4]), prod(-m[3][4], m[4][2])), -m[2][3]), scale(sum(prod(m[3][2], m[4][3]), prod(-m[3][3], m[4][2])), m[2][4]))), m[1][1]), scale(sum(scale(sum(prod(m[3][3], m[4][4]), prod(-m[3][4], m[4][3])), m[2][1]), sum(scale(sum(prod(m[3][1], m[4][4]), prod(-m[3][4], m[4][1])), -m[2][3]), scale(sum(prod(m[3][1], m[4][3]), prod(-m[3][3], m[4][1])), m[2][4]))), -m[1][2])), sum(scale(sum(scale(sum(prod(m[3][2], m[4][4]), prod(-m[3][4], m[4][2])), m[2][1]), sum(scale(sum(prod(m[3][1], m[4][4]), prod(-m[3][4], m[4][1])), -m[2][2]), scale(sum(prod(m[3][1], m[4][2]), prod(-m[3][2], m[4][1])), m[2][4]))), m[1][3]), scale(sum(scale(sum(prod(m[3][2], m[4][3]), prod(-m[3][3], m[4][2])), m[2][1]), sum(scale(sum(prod(m[3][1], m[4][3]), prod(-m[3][3], m[4][1])), -m[2][2]), scale(sum(prod(m[3][1], m[4][2]), prod(-m[3][2], m[4][1])), m[2][3]))), -m[1][4]))), m[0][0]), scale(sum(sum(scale(sum(scale(sum(prod(m[3][3], m[4][4]), prod(-m[3][4], m[4][3])), m[2][2]), sum(scale(sum(prod(m[3][2], m[4][4]), prod(-m[3][4], m[4][2])), -m[2][3]), scale(sum(prod(m[3][2], m[4][3]), prod(-m[3][3], m[4][2])), m[2][4]))), m[1][0]), scale(sum(scale(sum(prod(m[3][3], m[4][4]), prod(-m[3][4], m[4][3])), m[2][0]), sum(scale(sum(prod(m[3][0], m[4][4]), prod(-m[3][4], m[4][0])), -m[2][3]), scale(sum(prod(m[3][0], m[4][3]), prod(-m[3][3], m[4][0])), m[2][4]))), -m[1][2])), sum(scale(sum(scale(sum(prod(m[3][2], m[4][4]), prod(-m[3][4], m[4][2])), m[2][0]), sum(scale(sum(prod(m[3][0], m[4][4]), prod(-m[3][4], m[4][0])), -m[2][2]), scale(sum(prod(m[3][0], m[4][2]), prod(-m[3][2], m[4][0])), m[2][4]))), m[1][3]), scale(sum(scale(sum(prod(m[3][2], m[4][3]), prod(-m[3][3], m[4][2])), m[2][0]), sum(scale(sum(prod(m[3][0], m[4][3]), prod(-m[3][3], m[4][0])), -m[2][2]), scale(sum(prod(m[3][0], m[4][2]), prod(-m[3][2], m[4][0])), m[2][3]))), -m[1][4]))), -m[0][1])), sum(scale(sum(sum(scale(sum(scale(sum(prod(m[3][3], m[4][4]), prod(-m[3][4], m[4][3])), m[2][1]), sum(scale(sum(prod(m[3][1], m[4][4]), prod(-m[3][4], m[4][1])), -m[2][3]), scale(sum(prod(m[3][1], m[4][3]), prod(-m[3][3], m[4][1])), m[2][4]))), m[1][0]), scale(sum(scale(sum(prod(m[3][3], m[4][4]), prod(-m[3][4], m[4][3])), m[2][0]), sum(scale(sum(prod(m[3][0], m[4][4]), prod(-m[3][4], m[4][0])), -m[2][3]), scale(sum(prod(m[3][0], m[4][3]), prod(-m[3][3], m[4][0])), m[2][4]))), -m[1][1])), sum(scale(sum(scale(sum(prod(m[3][1], m[4][4]), prod(-m[3][4], m[4][1])), m[2][0]), sum(scale(sum(prod(m[3][0], m[4][4]), prod(-m[3][4], m[4][0])), -m[2][1]), scale(sum(prod(m[3][0], m[4][1]), prod(-m[3][1], m[4][0])), m[2][4]))), m[1][3]), scale(sum(scale(sum(prod(m[3][1], m[4][3]), prod(-m[3][3], m[4][1])), m[2][0]), sum(scale(sum(prod(m[3][0], m[4][3]), prod(-m[3][3], m[4][0])), -m[2][1]), scale(sum(prod(m[3][0], m[4][1]), prod(-m[3][1], m[4][0])), m[2][3]))), -m[1][4]))), m[0][2]), sum(scale(sum(sum(scale(sum(scale(sum(prod(m[3][2], m[4][4]), prod(-m[3][4], m[4][2])), m[2][1]), sum(scale(sum(prod(m[3][1], m[4][4]), prod(-m[3][4], m[4][1])), -m[2][2]), scale(sum(prod(m[3][1], m[4][2]), prod(-m[3][2], m[4][1])), m[2][4]))), m[1][0]), scale(sum(scale(sum(prod(m[3][2], m[4][4]), prod(-m[3][4], m[4][2])), m[2][0]), sum(scale(sum(prod(m[3][0], m[4][4]), prod(-m[3][4], m[4][0])), -m[2][2]), scale(sum(prod(m[3][0], m[4][2]), prod(-m[3][2], m[4][0])), m[2][4]))), -m[1][1])), sum(scale(sum(scale(sum(prod(m[3][1], m[4][4]), prod(-m[3][4], m[4][1])), m[2][0]), sum(scale(sum(prod(m[3][0], m[4][4]), prod(-m[3][4], m[4][0])), -m[2][1]), scale(sum(prod(m[3][0], m[4][1]), prod(-m[3][1], m[4][0])), m[2][4]))), m[1][2]), scale(sum(scale(sum(prod(m[3][1], m[4][2]), prod(-m[3][2], m[4][1])), m[2][0]), sum(scale(sum(prod(m[3][0], m[4][2]), prod(-m[3][2], m[4][0])), -m[2][1]), scale(sum(prod(m[3][0], m[4][1]), prod(-m[3][1], m[4][0])), m[2][2]))), -m[1][4]))), -m[0][3]), scale(sum(sum(scale(sum(scale(sum(prod(m[3][2], m[4][3]), prod(-m[3][3], m[4][2])), m[2][1]), sum(scale(sum(prod(m[3][1], m[4][3]), prod(-m[3][3], m[4][1])), -m[2][2]), scale(sum(prod(m[3][1], m[4][2]), prod(-m[3][2], m[4][1])), m[2][3]))), m[1][0]), scale(sum(scale(sum(prod(m[3][2], m[4][3]), prod(-m[3][3], m[4][2])), m[2][0]), sum(scale(sum(prod(m[3][0], m[4][3]), prod(-m[3][3], m[4][0])), -m[2][2]), scale(sum(prod(m[3][0], m[4][2]), prod(-m[3][2], m[4][0])), m[2][3]))), -m[1][1])), sum(scale(sum(scale(sum(prod(m[3][1], m[4][3]), prod(-m[3][3], m[4][1])), m[2][0]), sum(scale(sum(prod(m[3][0], m[4][3]), prod(-m[3][3], m[4][0])), -m[2][1]), scale(sum(prod(m[3][0], m[4][1]), prod(-m[3][1], m[4][0])), m[2][3]))), m[1][2]), scale(sum(scale(sum(prod(m[3][1], m[4][2]), prod(-m[3][2], m[4][1])), m[2][0]), sum(scale(sum(prod(m[3][0], m[4][2]), prod(-m[3][2], m[4][0])), -m[2][1]), scale(sum(prod(m[3][0], m[4][1]), prod(-m[3][1], m[4][0])), m[2][2]))), -m[1][3]))), m[0][4])))))
259467
+ }
259468
+ }
259469
+
259288
259470
  function compileDeterminant(n) {
259289
259471
  var fn =
259290
259472
  n === 2 ? determinant_2 :
259291
- n === 3 ? determinant_3 : undefined
259473
+ n === 3 ? determinant_3 :
259474
+ n === 4 ? determinant_4 :
259475
+ n === 5 ? determinant_5 : undefined
259292
259476
  return fn(robustSum, robustScale, twoProduct, compress)
259293
259477
  }
259294
259478
 
@@ -259297,7 +259481,7 @@ var CACHE = [
259297
259481
  function robustDeterminant1(m) { return [m[0][0]] }
259298
259482
  ]
259299
259483
 
259300
- function proc(det0, det1, det2, det3, CACHE, gen) {
259484
+ function proc(det0, det1, det2, det3, det4, det5, CACHE, gen) {
259301
259485
  return function robustDeterminant(m) {
259302
259486
  switch (m.length) {
259303
259487
  case 0:
@@ -259308,6 +259492,10 @@ function proc(det0, det1, det2, det3, CACHE, gen) {
259308
259492
  return det2(m)
259309
259493
  case 3:
259310
259494
  return det3(m)
259495
+ case 4:
259496
+ return det4(m)
259497
+ case 5:
259498
+ return det5(m)
259311
259499
  }
259312
259500
  var det = CACHE[m.length]
259313
259501
  if (!det) det = CACHE[m.length] = gen(m.length)
@@ -259551,13 +259739,16 @@ generateInSphereTest()
259551
259739
 
259552
259740
  var determinant = _glvis_("robust-determinant")
259553
259741
 
259554
- var NUM_EXPAND = 3
259742
+ var NUM_EXPAND = 6
259555
259743
 
259556
259744
  function generateSolver(n) {
259557
259745
  var fn =
259558
- n === 2 ? solve2d : solve3d
259746
+ n === 2 ? solve2d :
259747
+ n === 3 ? solve3d :
259748
+ n === 4 ? solve4d :
259749
+ n === 5 ? solve5d : solve6d
259559
259750
 
259560
- if(n < NUM_EXPAND) {
259751
+ if(n < 6) {
259561
259752
  return fn(determinant[n])
259562
259753
  }
259563
259754
  return fn(determinant)
@@ -259583,18 +259774,38 @@ function solve3d(det) {
259583
259774
  }
259584
259775
  }
259585
259776
 
259777
+ function solve4d(det) {
259778
+ return function robustLinearSolve4d(A, b) {
259779
+ return [det([[+b[0], +A[0][1], +A[0][2], +A[0][3]], [+b[1], +A[1][1], +A[1][2], +A[1][3]], [+b[2], +A[2][1], +A[2][2], +A[2][3]], [+b[3], +A[3][1], +A[3][2], +A[3][3]]]), det([[+A[0][0], +b[0], +A[0][2], +A[0][3]], [+A[1][0], +b[1], +A[1][2], +A[1][3]], [+A[2][0], +b[2], +A[2][2], +A[2][3]], [+A[3][0], +b[3], +A[3][2], +A[3][3]]]), det([[+A[0][0], +A[0][1], +b[0], +A[0][3]], [+A[1][0], +A[1][1], +b[1], +A[1][3]], [+A[2][0], +A[2][1], +b[2], +A[2][3]], [+A[3][0], +A[3][1], +b[3], +A[3][3]]]), det([[+A[0][0], +A[0][1], +A[0][2], +b[0]], [+A[1][0], +A[1][1], +A[1][2], +b[1]], [+A[2][0], +A[2][1], +A[2][2], +b[2]], [+A[3][0], +A[3][1], +A[3][2], +b[3]]]), det(A)]
259780
+ }
259781
+ }
259782
+
259783
+ function solve5d(det) {
259784
+ return function robustLinearSolve5d(A, b) {
259785
+ return [det([[+b[0], +A[0][1], +A[0][2], +A[0][3], +A[0][4]], [+b[1], +A[1][1], +A[1][2], +A[1][3], +A[1][4]], [+b[2], +A[2][1], +A[2][2], +A[2][3], +A[2][4]], [+b[3], +A[3][1], +A[3][2], +A[3][3], +A[3][4]], [+b[4], +A[4][1], +A[4][2], +A[4][3], +A[4][4]]]), det([[+A[0][0], +b[0], +A[0][2], +A[0][3], +A[0][4]], [+A[1][0], +b[1], +A[1][2], +A[1][3], +A[1][4]], [+A[2][0], +b[2], +A[2][2], +A[2][3], +A[2][4]], [+A[3][0], +b[3], +A[3][2], +A[3][3], +A[3][4]], [+A[4][0], +b[4], +A[4][2], +A[4][3], +A[4][4]]]), det([[+A[0][0], +A[0][1], +b[0], +A[0][3], +A[0][4]], [+A[1][0], +A[1][1], +b[1], +A[1][3], +A[1][4]], [+A[2][0], +A[2][1], +b[2], +A[2][3], +A[2][4]], [+A[3][0], +A[3][1], +b[3], +A[3][3], +A[3][4]], [+A[4][0], +A[4][1], +b[4], +A[4][3], +A[4][4]]]), det([[+A[0][0], +A[0][1], +A[0][2], +b[0], +A[0][4]], [+A[1][0], +A[1][1], +A[1][2], +b[1], +A[1][4]], [+A[2][0], +A[2][1], +A[2][2], +b[2], +A[2][4]], [+A[3][0], +A[3][1], +A[3][2], +b[3], +A[3][4]], [+A[4][0], +A[4][1], +A[4][2], +b[4], +A[4][4]]]), det([[+A[0][0], +A[0][1], +A[0][2], +A[0][3], +b[0]], [+A[1][0], +A[1][1], +A[1][2], +A[1][3], +b[1]], [+A[2][0], +A[2][1], +A[2][2], +A[2][3], +b[2]], [+A[3][0], +A[3][1], +A[3][2], +A[3][3], +b[3]], [+A[4][0], +A[4][1], +A[4][2], +A[4][3], +b[4]]]), det(A)]
259786
+ }
259787
+ }
259788
+
259789
+ function solve6d(det) {
259790
+ return function robustLinearSolve6d(A, b) {
259791
+ return [det([[+b[0], +A[0][1], +A[0][2], +A[0][3], +A[0][4], +A[0][5]], [+b[1], +A[1][1], +A[1][2], +A[1][3], +A[1][4], +A[1][5]], [+b[2], +A[2][1], +A[2][2], +A[2][3], +A[2][4], +A[2][5]], [+b[3], +A[3][1], +A[3][2], +A[3][3], +A[3][4], +A[3][5]], [+b[4], +A[4][1], +A[4][2], +A[4][3], +A[4][4], +A[4][5]], [+b[5], +A[5][1], +A[5][2], +A[5][3], +A[5][4], +A[5][5]]]), det([[+A[0][0], +b[0], +A[0][2], +A[0][3], +A[0][4], +A[0][5]], [+A[1][0], +b[1], +A[1][2], +A[1][3], +A[1][4], +A[1][5]], [+A[2][0], +b[2], +A[2][2], +A[2][3], +A[2][4], +A[2][5]], [+A[3][0], +b[3], +A[3][2], +A[3][3], +A[3][4], +A[3][5]], [+A[4][0], +b[4], +A[4][2], +A[4][3], +A[4][4], +A[4][5]], [+A[5][0], +b[5], +A[5][2], +A[5][3], +A[5][4], +A[5][5]]]), det([[+A[0][0], +A[0][1], +b[0], +A[0][3], +A[0][4], +A[0][5]], [+A[1][0], +A[1][1], +b[1], +A[1][3], +A[1][4], +A[1][5]], [+A[2][0], +A[2][1], +b[2], +A[2][3], +A[2][4], +A[2][5]], [+A[3][0], +A[3][1], +b[3], +A[3][3], +A[3][4], +A[3][5]], [+A[4][0], +A[4][1], +b[4], +A[4][3], +A[4][4], +A[4][5]], [+A[5][0], +A[5][1], +b[5], +A[5][3], +A[5][4], +A[5][5]]]), det([[+A[0][0], +A[0][1], +A[0][2], +b[0], +A[0][4], +A[0][5]], [+A[1][0], +A[1][1], +A[1][2], +b[1], +A[1][4], +A[1][5]], [+A[2][0], +A[2][1], +A[2][2], +b[2], +A[2][4], +A[2][5]], [+A[3][0], +A[3][1], +A[3][2], +b[3], +A[3][4], +A[3][5]], [+A[4][0], +A[4][1], +A[4][2], +b[4], +A[4][4], +A[4][5]], [+A[5][0], +A[5][1], +A[5][2], +b[5], +A[5][4], +A[5][5]]]), det([[+A[0][0], +A[0][1], +A[0][2], +A[0][3], +b[0], +A[0][5]], [+A[1][0], +A[1][1], +A[1][2], +A[1][3], +b[1], +A[1][5]], [+A[2][0], +A[2][1], +A[2][2], +A[2][3], +b[2], +A[2][5]], [+A[3][0], +A[3][1], +A[3][2], +A[3][3], +b[3], +A[3][5]], [+A[4][0], +A[4][1], +A[4][2], +A[4][3], +b[4], +A[4][5]], [+A[5][0], +A[5][1], +A[5][2], +A[5][3], +b[5], +A[5][5]]]), det([[+A[0][0], +A[0][1], +A[0][2], +A[0][3], +A[0][4], +b[0]], [+A[1][0], +A[1][1], +A[1][2], +A[1][3], +A[1][4], +b[1]], [+A[2][0], +A[2][1], +A[2][2], +A[2][3], +A[2][4], +b[2]], [+A[3][0], +A[3][1], +A[3][2], +A[3][3], +A[3][4], +b[3]], [+A[4][0], +A[4][1], +A[4][2], +A[4][3], +A[4][4], +b[4]], [+A[5][0], +A[5][1], +A[5][2], +A[5][3], +A[5][4], +b[5]]]), det(A)]
259792
+ }
259793
+ }
259794
+
259586
259795
  var CACHE = [
259587
259796
  robustLinearSolve0d,
259588
259797
  robustLinearSolve1d
259589
259798
  ]
259590
259799
 
259591
- function proc(s0, s1, s2, s3, CACHE, g) {
259800
+ function proc(s0, s1, s2, s3, s4, s5, CACHE, g) {
259592
259801
  return function dispatchLinearSolve(A, b) {
259593
259802
  switch (A.length) {
259594
259803
  case 0: return s0(A, b);
259595
259804
  case 1: return s1(A, b);
259596
259805
  case 2: return s2(A, b);
259597
259806
  case 3: return s3(A, b);
259807
+ case 4: return s4(A, b);
259808
+ case 5: return s5(A, b);
259598
259809
  }
259599
259810
  var s = CACHE[A.length];
259600
259811
  if (!s) s = CACHE[A.length] = g(A.length);
@@ -259603,7 +259814,7 @@ function proc(s0, s1, s2, s3, CACHE, g) {
259603
259814
  }
259604
259815
 
259605
259816
  function generateDispatch() {
259606
- while(CACHE.length <= NUM_EXPAND) {
259817
+ while(CACHE.length < NUM_EXPAND) {
259607
259818
  CACHE.push(generateSolver(CACHE.length))
259608
259819
  }
259609
259820
  module.exports = proc.apply(undefined, CACHE.concat([CACHE, generateSolver]))