{"version":3,"file":"static/js/7699.4203d028.js","mappings":"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","sources":["../node_modules/plotly.js/src/traces/pie/index.js","../node_modules/plotly.js/src/traces/scatter/line_defaults.js","../node_modules/plotly.js/src/traces/scatter/defaults.js","../node_modules/plotly.js/src/traces/pie/base_plot.js","../node_modules/plotly.js/src/traces/bar/style_defaults.js","../node_modules/plotly.js/src/traces/scatter/cross_trace_calc.js","../node_modules/plotly.js/src/snapshot/helpers.js","../node_modules/plotly.js/src/snapshot/filesaver.js","../node_modules/plotly.js/src/traces/scatter/fillcolor_defaults.js","../node_modules/plotly.js/src/traces/scatter/stack_defaults.js","../node_modules/plotly.js/src/traces/heatmap/colorbar.js","../node_modules/plotly.js/src/traces/box/cross_trace_calc.js","../node_modules/plotly.js/src/traces/bar/select.js","../node_modules/plotly.js/src/traces/box/style.js","../node_modules/plotly.js/src/traces/heatmap/style.js","../node_modules/plotly.js/src/traces/scatter/make_bubble_size_func.js","../node_modules/plotly.js/src/traces/heatmap/clean_2d_array.js","../node_modules/plotly.js/src/traces/bar/arrays_to_calcdata.js","../node_modules/plotly.js/src/traces/pie/fill_one.js","../node_modules/plotly.js/src/version.js","../node_modules/plotly.js/src/traces/scatter/marker_colorbar.js","../node_modules/plotly.js/src/traces/histogram/bin_label_vals.js","../node_modules/plotly.js/src/traces/scatter/calc.js","../node_modules/plotly.js/src/traces/heatmap/plot.js","../node_modules/plotly.js/src/traces/scatter/attributes.js","../node_modules/plotly.js/src/traces/box/event_data.js","../node_modules/plotly.js/src/traces/box/layout_attributes.js","../node_modules/plotly.js/src/traces/bar/layout_attributes.js","../node_modules/plotly.js/src/traces/scatter/arrays_to_calcdata.js","../node_modules/plotly.js/src/snapshot/cloneplot.js","../node_modules/plotly.js/src/traces/scatter/period_defaults.js","../node_modules/plotly.js/src/traces/heatmap/calc.js","../node_modules/plotly.js/src/traces/heatmap/label_defaults.js","../node_modules/plotly.js/src/traces/box/defaults.js","../node_modules/plotly.js/src/traces/heatmap/style_defaults.js","../node_modules/plotly.js/src/traces/bar/attributes.js","../node_modules/plotly.js/src/traces/bar/helpers.js","../node_modules/plotly.js/src/traces/scatter/subtypes.js","../node_modules/plotly.js/src/traces/heatmap/convert_column_xyz.js","../node_modules/plotly.js/src/traces/bar/plot.js","../node_modules/plotly.js/src/traces/pie/style_one.js","../node_modules/plotly.js/src/traces/scatter/hover.js","../node_modules/plotly.js/src/traces/box/select.js","../node_modules/plotly.js/src/traces/scatter/line_shape_defaults.js","../node_modules/plotly.js/src/traces/scatter/plot.js","../node_modules/plotly.js/src/traces/bar/uniform_text.js","../node_modules/plotly.js/src/traces/histogram/bin_functions.js","../node_modules/plotly.js/src/registry.js","../node_modules/plotly.js/src/snapshot/index.js","../node_modules/plotly.js/src/traces/scatter/calc_selection.js","../node_modules/plotly.js/src/traces/scatter/format_labels.js","../node_modules/plotly.js/src/traces/bar/constants.js","../node_modules/plotly.js/src/traces/bar/index.js","../node_modules/plotly.js/src/traces/scatter/line_points.js","../node_modules/plotly.js/src/traces/heatmap/xyz_defaults.js","../node_modules/plotly.js/src/traces/box/attributes.js","../node_modules/plotly.js/src/traces/heatmap/hover.js","../node_modules/plotly.js/src/traces/scatter/style.js","../node_modules/plotly.js/src/traces/scatter/link_traces.js","../node_modules/plotly.js/src/traces/pie/plot.js","../node_modules/plotly.js/src/traces/bar/cross_trace_calc.js","../node_modules/plotly.js/src/traces/histogram/calc.js","../node_modules/plotly.js/src/traces/bar/style.js","../node_modules/plotly.js/src/snapshot/download.js","../node_modules/plotly.js/src/traces/scatter/layout_defaults.js","../node_modules/plotly.js/src/traces/scatter/xy_defaults.js","../node_modules/plotly.js/src/traces/scatter/grouping_defaults.js","../node_modules/plotly.js/src/traces/heatmap/find_empties.js","../node_modules/plotly.js/src/traces/scatter/constants.js","../node_modules/point-in-polygon/nested.js","../node_modules/plotly.js/src/traces/scatter/select.js","../node_modules/plotly.js/src/traces/bar/layout_defaults.js","../node_modules/plotly.js/src/snapshot/toimage.js","../node_modules/plotly.js/src/traces/scatter/get_trace_color.js","../node_modules/plotly.js/src/traces/pie/calc.js","../node_modules/plotly.js/src/traces/pie/layout_defaults.js","../node_modules/plotly.js/src/traces/pie/attributes.js","../node_modules/plotly.js/src/traces/box/plot.js","../node_modules/plotly.js/src/traces/bar/event_data.js","../node_modules/plotly.js/src/traces/bar/calc.js","../node_modules/plotly.js/src/traces/pie/layout_attributes.js","../node_modules/plotly.js/src/traces/box/calc.js","../node_modules/plotly.js/src/traces/histogram/norm_functions.js","../node_modules/plotly.js/src/traces/pie/style.js","../node_modules/plotly.js/src/traces/pie/defaults.js","../node_modules/plotly.js/src/traces/scatter/index.js","../node_modules/plotly.js/src/snapshot/svgtoimg.js","../node_modules/plotly.js/src/traces/scatter/cross_trace_defaults.js","../node_modules/plotly.js/src/traces/bar/sieve.js","../node_modules/plotly.js/src/traces/heatmap/interp2d.js","../node_modules/plotly.js/src/traces/pie/event_data.js","../node_modules/plotly.js/src/traces/heatmap/defaults.js","../node_modules/plotly.js/src/traces/scatter/text_defaults.js","../node_modules/plotly.js/src/traces/bar/hover.js","../node_modules/plotly.js/src/traces/bar/defaults.js","../node_modules/plotly.js/src/traces/heatmap/make_bound_array.js","../node_modules/plotly.js/src/traces/box/layout_defaults.js","../node_modules/plotly.js/src/traces/scatter/colorscale_calc.js","../node_modules/plotly.js/src/snapshot/tosvg.js","../node_modules/plotly.js/src/traces/heatmap/attributes.js","../node_modules/plotly.js/src/traces/histogram2d/calc.js","../node_modules/plotly.js/src/traces/box/hover.js","../node_modules/plotly.js/src/traces/heatmap/index.js","../node_modules/plotly.js/src/traces/scatter/layout_attributes.js","../node_modules/plotly.js/src/traces/scatter/marker_defaults.js","../node_modules/plotly.js/src/traces/pie/helpers.js","../node_modules/plotly.js/src/traces/histogram/average.js","../node_modules/plotly.js/src/traces/box/index.js"],"sourcesContent":["'use strict';\n\nmodule.exports = {\n attributes: require('./attributes'),\n supplyDefaults: require('./defaults').supplyDefaults,\n supplyLayoutDefaults: require('./layout_defaults'),\n layoutAttributes: require('./layout_attributes'),\n\n calc: require('./calc').calc,\n crossTraceCalc: require('./calc').crossTraceCalc,\n\n plot: require('./plot').plot,\n style: require('./style'),\n styleOne: require('./style_one'),\n\n moduleType: 'trace',\n name: 'pie',\n basePlotModule: require('./base_plot'),\n categories: ['pie-like', 'pie', 'showLegend'],\n meta: {\n description: [\n 'A data visualized by the sectors of the pie is set in `values`.',\n 'The sector labels are set in `labels`.',\n 'The sector colors are set in `marker.colors`'\n ].join(' ')\n }\n};\n","'use strict';\n\nvar isArrayOrTypedArray = require('../../lib').isArrayOrTypedArray;\nvar hasColorscale = require('../../components/colorscale/helpers').hasColorscale;\nvar colorscaleDefaults = require('../../components/colorscale/defaults');\n\nmodule.exports = function lineDefaults(traceIn, traceOut, defaultColor, layout, coerce, opts) {\n if(!opts) opts = {};\n\n var markerColor = (traceIn.marker || {}).color;\n if(markerColor && markerColor._inputArray) markerColor = markerColor._inputArray;\n\n coerce('line.color', defaultColor);\n\n if(hasColorscale(traceIn, 'line')) {\n colorscaleDefaults(traceIn, traceOut, layout, coerce, {prefix: 'line.', cLetter: 'c'});\n } else {\n var lineColorDflt = (isArrayOrTypedArray(markerColor) ? false : markerColor) || defaultColor;\n coerce('line.color', lineColorDflt);\n }\n\n coerce('line.width');\n\n if(!opts.noDash) coerce('line.dash');\n if(opts.backoff) coerce('line.backoff');\n};\n","'use strict';\n\nvar Lib = require('../../lib');\nvar Registry = require('../../registry');\n\nvar attributes = require('./attributes');\nvar constants = require('./constants');\nvar subTypes = require('./subtypes');\nvar handleXYDefaults = require('./xy_defaults');\nvar handlePeriodDefaults = require('./period_defaults');\nvar handleStackDefaults = require('./stack_defaults');\nvar handleMarkerDefaults = require('./marker_defaults');\nvar handleLineDefaults = require('./line_defaults');\nvar handleLineShapeDefaults = require('./line_shape_defaults');\nvar handleTextDefaults = require('./text_defaults');\nvar handleFillColorDefaults = require('./fillcolor_defaults');\nvar coercePattern = require('../../lib').coercePattern;\n\nmodule.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout) {\n function coerce(attr, dflt) {\n return Lib.coerce(traceIn, traceOut, attributes, attr, dflt);\n }\n\n var len = handleXYDefaults(traceIn, traceOut, layout, coerce);\n if(!len) traceOut.visible = false;\n\n if(!traceOut.visible) return;\n\n handlePeriodDefaults(traceIn, traceOut, layout, coerce);\n coerce('xhoverformat');\n coerce('yhoverformat');\n\n var stackGroupOpts = handleStackDefaults(traceIn, traceOut, layout, coerce);\n if(\n layout.scattermode === 'group' &&\n traceOut.orientation === undefined\n ) {\n coerce('orientation', 'v');\n }\n\n var defaultMode = !stackGroupOpts && (len < constants.PTS_LINESONLY) ?\n 'lines+markers' : 'lines';\n coerce('text');\n coerce('hovertext');\n coerce('mode', defaultMode);\n\n if(subTypes.hasMarkers(traceOut)) {\n handleMarkerDefaults(traceIn, traceOut, defaultColor, layout, coerce, {gradient: true});\n }\n\n if(subTypes.hasLines(traceOut)) {\n handleLineDefaults(traceIn, traceOut, defaultColor, layout, coerce, {backoff: true});\n handleLineShapeDefaults(traceIn, traceOut, coerce);\n coerce('connectgaps');\n coerce('line.simplify');\n }\n\n if(subTypes.hasText(traceOut)) {\n coerce('texttemplate');\n handleTextDefaults(traceIn, traceOut, layout, coerce);\n }\n\n var dfltHoverOn = [];\n\n if(subTypes.hasMarkers(traceOut) || subTypes.hasText(traceOut)) {\n coerce('cliponaxis');\n coerce('marker.maxdisplayed');\n dfltHoverOn.push('points');\n }\n\n // It's possible for this default to be changed by a later trace.\n // We handle that case in some hacky code inside handleStackDefaults.\n coerce('fill', stackGroupOpts ? stackGroupOpts.fillDflt : 'none');\n if(traceOut.fill !== 'none') {\n handleFillColorDefaults(traceIn, traceOut, defaultColor, coerce);\n if(!subTypes.hasLines(traceOut)) handleLineShapeDefaults(traceIn, traceOut, coerce);\n coercePattern(coerce, 'fillpattern', traceOut.fillcolor, false);\n }\n\n var lineColor = (traceOut.line || {}).color;\n var markerColor = (traceOut.marker || {}).color;\n\n if(traceOut.fill === 'tonext' || traceOut.fill === 'toself') {\n dfltHoverOn.push('fills');\n }\n coerce('hoveron', dfltHoverOn.join('+') || 'points');\n if(traceOut.hoveron !== 'fills') coerce('hovertemplate');\n var errorBarsSupplyDefaults = Registry.getComponentMethod('errorbars', 'supplyDefaults');\n errorBarsSupplyDefaults(traceIn, traceOut, lineColor || markerColor || defaultColor, {axis: 'y'});\n errorBarsSupplyDefaults(traceIn, traceOut, lineColor || markerColor || defaultColor, {axis: 'x', inherit: 'y'});\n\n Lib.coerceSelectionMarkerOpacity(traceOut, coerce);\n};\n","'use strict';\n\nvar plots = require('../../plots/plots');\n\nexports.name = 'pie';\n\nexports.plot = function(gd, traces, transitionOpts, makeOnCompleteCallback) {\n plots.plotBasePlot(exports.name, gd, traces, transitionOpts, makeOnCompleteCallback);\n};\n\nexports.clean = function(newFullData, newFullLayout, oldFullData, oldFullLayout) {\n plots.cleanBasePlot(exports.name, newFullData, newFullLayout, oldFullData, oldFullLayout);\n};\n","'use strict';\n\nvar Color = require('../../components/color');\nvar hasColorscale = require('../../components/colorscale/helpers').hasColorscale;\nvar colorscaleDefaults = require('../../components/colorscale/defaults');\nvar coercePattern = require('../../lib').coercePattern;\n\nmodule.exports = function handleStyleDefaults(traceIn, traceOut, coerce, defaultColor, layout) {\n var markerColor = coerce('marker.color', defaultColor);\n var hasMarkerColorscale = hasColorscale(traceIn, 'marker');\n if(hasMarkerColorscale) {\n colorscaleDefaults(\n traceIn, traceOut, layout, coerce, {prefix: 'marker.', cLetter: 'c'}\n );\n }\n\n coerce('marker.line.color', Color.defaultLine);\n\n if(hasColorscale(traceIn, 'marker.line')) {\n colorscaleDefaults(\n traceIn, traceOut, layout, coerce, {prefix: 'marker.line.', cLetter: 'c'}\n );\n }\n\n coerce('marker.line.width');\n coerce('marker.opacity');\n coercePattern(coerce, 'marker.pattern', markerColor, hasMarkerColorscale);\n coerce('selected.marker.color');\n coerce('unselected.marker.color');\n};\n","'use strict';\n\nvar calc = require('./calc');\nvar setGroupPositions = require('../bar/cross_trace_calc').setGroupPositions;\n\nfunction groupCrossTraceCalc(gd, plotinfo) {\n var xa = plotinfo.xaxis;\n var ya = plotinfo.yaxis;\n\n var fullLayout = gd._fullLayout;\n var fullTraces = gd._fullData;\n var calcTraces = gd.calcdata;\n var calcTracesHorz = [];\n var calcTracesVert = [];\n\n for(var i = 0; i < fullTraces.length; i++) {\n var fullTrace = fullTraces[i];\n if(\n fullTrace.visible === true &&\n fullTrace.type === 'scatter' &&\n fullTrace.xaxis === xa._id &&\n fullTrace.yaxis === ya._id\n ) {\n if(fullTrace.orientation === 'h') {\n calcTracesHorz.push(calcTraces[i]);\n } else if(fullTrace.orientation === 'v') { // check for v since certain scatter traces may not have an orientation\n calcTracesVert.push(calcTraces[i]);\n }\n }\n }\n\n var opts = {\n mode: fullLayout.scattermode,\n gap: fullLayout.scattergap\n };\n\n setGroupPositions(gd, xa, ya, calcTracesVert, opts);\n setGroupPositions(gd, ya, xa, calcTracesHorz, opts);\n}\n\n/*\n * Scatter stacking & normalization calculations\n * runs per subplot, and can handle multiple stacking groups\n */\n\nmodule.exports = function crossTraceCalc(gd, plotinfo) {\n if(gd._fullLayout.scattermode === 'group') {\n groupCrossTraceCalc(gd, plotinfo);\n }\n\n var xa = plotinfo.xaxis;\n var ya = plotinfo.yaxis;\n var subplot = xa._id + ya._id;\n\n var subplotStackOpts = gd._fullLayout._scatterStackOpts[subplot];\n if(!subplotStackOpts) return;\n\n var calcTraces = gd.calcdata;\n\n var i, j, k, i2, cd, cd0, posj, sumj, norm;\n var groupOpts, interpolate, groupnorm, posAttr, valAttr;\n var hasAnyBlanks;\n\n for(var stackGroup in subplotStackOpts) {\n groupOpts = subplotStackOpts[stackGroup];\n var indices = groupOpts.traceIndices;\n\n // can get here with no indices if the stack axis is non-numeric\n if(!indices.length) continue;\n\n interpolate = groupOpts.stackgaps === 'interpolate';\n groupnorm = groupOpts.groupnorm;\n if(groupOpts.orientation === 'v') {\n posAttr = 'x';\n valAttr = 'y';\n } else {\n posAttr = 'y';\n valAttr = 'x';\n }\n hasAnyBlanks = new Array(indices.length);\n for(i = 0; i < hasAnyBlanks.length; i++) {\n hasAnyBlanks[i] = false;\n }\n\n // Collect the complete set of all positions across ALL traces.\n // Start with the first trace, then interleave items from later traces\n // as needed.\n // Fill in mising items as we go.\n cd0 = calcTraces[indices[0]];\n var allPositions = new Array(cd0.length);\n for(i = 0; i < cd0.length; i++) {\n allPositions[i] = cd0[i][posAttr];\n }\n\n for(i = 1; i < indices.length; i++) {\n cd = calcTraces[indices[i]];\n\n for(j = k = 0; j < cd.length; j++) {\n posj = cd[j][posAttr];\n for(; posj > allPositions[k] && k < allPositions.length; k++) {\n // the current trace is missing a position from some previous trace(s)\n insertBlank(cd, j, allPositions[k], i, hasAnyBlanks, interpolate, posAttr);\n j++;\n }\n if(posj !== allPositions[k]) {\n // previous trace(s) are missing a position from the current trace\n for(i2 = 0; i2 < i; i2++) {\n insertBlank(calcTraces[indices[i2]], k, posj, i2, hasAnyBlanks, interpolate, posAttr);\n }\n allPositions.splice(k, 0, posj);\n }\n k++;\n }\n for(; k < allPositions.length; k++) {\n insertBlank(cd, j, allPositions[k], i, hasAnyBlanks, interpolate, posAttr);\n j++;\n }\n }\n\n var serieslen = allPositions.length;\n\n // stack (and normalize)!\n for(j = 0; j < cd0.length; j++) {\n sumj = cd0[j][valAttr] = cd0[j].s;\n for(i = 1; i < indices.length; i++) {\n cd = calcTraces[indices[i]];\n cd[0].trace._rawLength = cd[0].trace._length;\n cd[0].trace._length = serieslen;\n sumj += cd[j].s;\n cd[j][valAttr] = sumj;\n }\n\n if(groupnorm) {\n norm = ((groupnorm === 'fraction') ? sumj : (sumj / 100)) || 1;\n for(i = 0; i < indices.length; i++) {\n var cdj = calcTraces[indices[i]][j];\n cdj[valAttr] /= norm;\n cdj.sNorm = cdj.s / norm;\n }\n }\n }\n\n // autorange\n for(i = 0; i < indices.length; i++) {\n cd = calcTraces[indices[i]];\n var trace = cd[0].trace;\n var ppad = calc.calcMarkerSize(trace, trace._rawLength);\n var arrayPad = Array.isArray(ppad);\n if((ppad && hasAnyBlanks[i]) || arrayPad) {\n var ppadRaw = ppad;\n ppad = new Array(serieslen);\n for(j = 0; j < serieslen; j++) {\n ppad[j] = cd[j].gap ? 0 : (arrayPad ? ppadRaw[cd[j].i] : ppadRaw);\n }\n }\n var x = new Array(serieslen);\n var y = new Array(serieslen);\n for(j = 0; j < serieslen; j++) {\n x[j] = cd[j].x;\n y[j] = cd[j].y;\n }\n calc.calcAxisExpansion(gd, trace, xa, ya, x, y, ppad);\n\n // while we're here (in a loop over all traces in the stack)\n // record the orientation, so hover can find it easily\n cd[0].t.orientation = groupOpts.orientation;\n }\n }\n};\n\nfunction insertBlank(calcTrace, index, position, traceIndex, hasAnyBlanks, interpolate, posAttr) {\n hasAnyBlanks[traceIndex] = true;\n var newEntry = {\n i: null,\n gap: true,\n s: 0\n };\n newEntry[posAttr] = position;\n calcTrace.splice(index, 0, newEntry);\n // Even if we're not interpolating, if one trace has multiple\n // values at the same position and this trace only has one value there,\n // we just duplicate that one value rather than insert a zero.\n // We also make it look like a real point - because it's ambiguous which\n // one really is the real one!\n if(index && position === calcTrace[index - 1][posAttr]) {\n var prevEntry = calcTrace[index - 1];\n newEntry.s = prevEntry.s;\n // TODO is it going to cause any problems to have multiple\n // calcdata points with the same index?\n newEntry.i = prevEntry.i;\n newEntry.gap = prevEntry.gap;\n } else if(interpolate) {\n newEntry.s = getInterp(calcTrace, index, position, posAttr);\n }\n if(!index) {\n // t and trace need to stay on the first cd entry\n calcTrace[0].t = calcTrace[1].t;\n calcTrace[0].trace = calcTrace[1].trace;\n delete calcTrace[1].t;\n delete calcTrace[1].trace;\n }\n}\n\nfunction getInterp(calcTrace, index, position, posAttr) {\n var pt0 = calcTrace[index - 1];\n var pt1 = calcTrace[index + 1];\n if(!pt1) return pt0.s;\n if(!pt0) return pt1.s;\n return pt0.s + (pt1.s - pt0.s) * (position - pt0[posAttr]) / (pt1[posAttr] - pt0[posAttr]);\n}\n","'use strict';\n\nvar Registry = require('../registry');\n\nexports.getDelay = function(fullLayout) {\n if(!fullLayout._has) return 0;\n\n return (\n fullLayout._has('gl3d') ||\n fullLayout._has('gl2d') ||\n fullLayout._has('mapbox')\n ) ? 500 : 0;\n};\n\nexports.getRedrawFunc = function(gd) {\n return function() {\n Registry.getComponentMethod('colorbar', 'draw')(gd);\n };\n};\n\nexports.encodeSVG = function(svg) {\n return 'data:image/svg+xml,' + encodeURIComponent(svg);\n};\n\nexports.encodeJSON = function(json) {\n return 'data:application/json,' + encodeURIComponent(json);\n};\n\nvar DOM_URL = window.URL || window.webkitURL;\n\nexports.createObjectURL = function(blob) {\n return DOM_URL.createObjectURL(blob);\n};\n\nexports.revokeObjectURL = function(url) {\n return DOM_URL.revokeObjectURL(url);\n};\n\nexports.createBlob = function(url, format) {\n if(format === 'svg') {\n return new window.Blob([url], {type: 'image/svg+xml;charset=utf-8'});\n } else if(format === 'full-json') {\n return new window.Blob([url], {type: 'application/json;charset=utf-8'});\n } else {\n var binary = fixBinary(window.atob(url));\n return new window.Blob([binary], {type: 'image/' + format});\n }\n};\n\nexports.octetStream = function(s) {\n document.location.href = 'data:application/octet-stream' + s;\n};\n\n// Taken from https://bl.ocks.org/nolanlawson/0eac306e4dac2114c752\nfunction fixBinary(b) {\n var len = b.length;\n var buf = new ArrayBuffer(len);\n var arr = new Uint8Array(buf);\n for(var i = 0; i < len; i++) {\n arr[i] = b.charCodeAt(i);\n }\n return buf;\n}\n\nexports.IMAGE_URL_PREFIX = /^data:image\\/\\w+;base64,/;\n\nexports.MSG_IE_BAD_FORMAT = 'Sorry IE does not support downloading from canvas. Try {format:\\'svg\\'} instead.';\n","'use strict';\n\nvar Lib = require('../lib');\nvar helpers = require('./helpers');\n\n/*\n* substantial portions of this code from FileSaver.js\n* https://github.com/eligrey/FileSaver.js\n* License: https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md\n* FileSaver.js\n* A saveAs() FileSaver implementation.\n* 1.1.20160328\n*\n* By Eli Grey, http://eligrey.com\n* License: MIT\n* See https://github.com/eligrey/FileSaver.js/blob/master/LICENSE.md\n*/\nfunction fileSaver(url, name, format) {\n var saveLink = document.createElement('a');\n var canUseSaveLink = 'download' in saveLink;\n\n var promise = new Promise(function(resolve, reject) {\n var blob;\n var objectUrl;\n\n // IE 10+ (native saveAs)\n if(Lib.isIE()) {\n // At this point we are only dealing with a decoded SVG as\n // a data URL (since IE only supports SVG)\n blob = helpers.createBlob(url, 'svg');\n window.navigator.msSaveBlob(blob, name);\n blob = null;\n return resolve(name);\n }\n\n if(canUseSaveLink) {\n blob = helpers.createBlob(url, format);\n objectUrl = helpers.createObjectURL(blob);\n\n saveLink.href = objectUrl;\n saveLink.download = name;\n document.body.appendChild(saveLink);\n saveLink.click();\n\n document.body.removeChild(saveLink);\n helpers.revokeObjectURL(objectUrl);\n blob = null;\n\n return resolve(name);\n }\n\n // Older versions of Safari did not allow downloading of blob urls\n if(Lib.isSafari()) {\n var prefix = format === 'svg' ? ',' : ';base64,';\n helpers.octetStream(prefix + encodeURIComponent(url));\n return resolve(name);\n }\n\n reject(new Error('download error'));\n });\n\n return promise;\n}\n\n\nmodule.exports = fileSaver;\n","'use strict';\n\nvar Color = require('../../components/color');\nvar isArrayOrTypedArray = require('../../lib').isArrayOrTypedArray;\n\nmodule.exports = function fillColorDefaults(traceIn, traceOut, defaultColor, coerce) {\n var inheritColorFromMarker = false;\n\n if(traceOut.marker) {\n // don't try to inherit a color array\n var markerColor = traceOut.marker.color;\n var markerLineColor = (traceOut.marker.line || {}).color;\n\n if(markerColor && !isArrayOrTypedArray(markerColor)) {\n inheritColorFromMarker = markerColor;\n } else if(markerLineColor && !isArrayOrTypedArray(markerLineColor)) {\n inheritColorFromMarker = markerLineColor;\n }\n }\n\n coerce('fillcolor', Color.addOpacity(\n (traceOut.line || {}).color ||\n inheritColorFromMarker ||\n defaultColor, 0.5\n ));\n};\n","'use strict';\n\nvar perStackAttrs = ['orientation', 'groupnorm', 'stackgaps'];\n\nmodule.exports = function handleStackDefaults(traceIn, traceOut, layout, coerce) {\n var stackOpts = layout._scatterStackOpts;\n\n var stackGroup = coerce('stackgroup');\n if(stackGroup) {\n // use independent stacking options per subplot\n var subplot = traceOut.xaxis + traceOut.yaxis;\n var subplotStackOpts = stackOpts[subplot];\n if(!subplotStackOpts) subplotStackOpts = stackOpts[subplot] = {};\n\n var groupOpts = subplotStackOpts[stackGroup];\n var firstTrace = false;\n if(groupOpts) {\n groupOpts.traces.push(traceOut);\n } else {\n groupOpts = subplotStackOpts[stackGroup] = {\n // keep track of trace indices for use during stacking calculations\n // this will be filled in during `calc` and used during `crossTraceCalc`\n // so it's OK if we don't recreate it during a non-calc edit\n traceIndices: [],\n // Hold on to the whole set of prior traces\n // First one is most important, so we can clear defaults\n // there if we find explicit values only in later traces.\n // We're only going to *use* the values stored in groupOpts,\n // but for the editor and validate we want things self-consistent\n // The full set of traces is used only to fix `fill` default if\n // we find `orientation: 'h'` beyond the first trace\n traces: [traceOut]\n };\n firstTrace = true;\n }\n // TODO: how is this going to work with groupby transforms?\n // in principle it should be OK I guess, as long as explicit group styles\n // don't override explicit base-trace styles?\n\n var dflts = {\n orientation: (traceOut.x && !traceOut.y) ? 'h' : 'v'\n };\n\n for(var i = 0; i < perStackAttrs.length; i++) {\n var attr = perStackAttrs[i];\n var attrFound = attr + 'Found';\n if(!groupOpts[attrFound]) {\n var traceHasAttr = traceIn[attr] !== undefined;\n var isOrientation = attr === 'orientation';\n if(traceHasAttr || firstTrace) {\n groupOpts[attr] = coerce(attr, dflts[attr]);\n\n if(isOrientation) {\n groupOpts.fillDflt = groupOpts[attr] === 'h' ?\n 'tonextx' : 'tonexty';\n }\n\n if(traceHasAttr) {\n // Note: this will show a value here even if it's invalid\n // in which case it will revert to default.\n groupOpts[attrFound] = true;\n\n // Note: only one trace in the stack will get a _fullData\n // entry for a given stack-wide attribute. If no traces\n // (or the first trace) specify that attribute, the\n // first trace will get it. If the first trace does NOT\n // specify it but some later trace does, then it gets\n // removed from the first trace and only included in the\n // one that specified it. This is mostly important for\n // editors (that want to see the full values to know\n // what settings are available) and Plotly.react diffing.\n // Editors may want to use fullLayout._scatterStackOpts\n // directly and make these settings available from all\n // traces in the stack... then set the new value into\n // the first trace, and clear all later traces.\n if(!firstTrace) {\n delete groupOpts.traces[0][attr];\n\n // orientation can affect default fill of previous traces\n if(isOrientation) {\n for(var j = 0; j < groupOpts.traces.length - 1; j++) {\n var trace2 = groupOpts.traces[j];\n if(trace2._input.fill !== trace2.fill) {\n trace2.fill = groupOpts.fillDflt;\n }\n }\n }\n }\n }\n }\n }\n }\n return groupOpts;\n }\n};\n","'use strict';\n\nmodule.exports = {\n min: 'zmin',\n max: 'zmax'\n};\n","'use strict';\n\nvar Axes = require('../../plots/cartesian/axes');\nvar Lib = require('../../lib');\nvar getAxisGroup = require('../../plots/cartesian/constraints').getAxisGroup;\n\nvar orientations = ['v', 'h'];\n\nfunction crossTraceCalc(gd, plotinfo) {\n var calcdata = gd.calcdata;\n var xa = plotinfo.xaxis;\n var ya = plotinfo.yaxis;\n\n for(var i = 0; i < orientations.length; i++) {\n var orientation = orientations[i];\n var posAxis = orientation === 'h' ? ya : xa;\n var boxList = [];\n\n // make list of boxes / candlesticks\n // For backward compatibility, candlesticks are treated as if they *are* box traces here\n for(var j = 0; j < calcdata.length; j++) {\n var cd = calcdata[j];\n var t = cd[0].t;\n var trace = cd[0].trace;\n\n if(trace.visible === true &&\n (trace.type === 'box' || trace.type === 'candlestick') &&\n !t.empty &&\n (trace.orientation || 'v') === orientation &&\n trace.xaxis === xa._id &&\n trace.yaxis === ya._id\n ) {\n boxList.push(j);\n }\n }\n\n setPositionOffset('box', gd, boxList, posAxis);\n }\n}\n\nfunction setPositionOffset(traceType, gd, boxList, posAxis) {\n var calcdata = gd.calcdata;\n var fullLayout = gd._fullLayout;\n var axId = posAxis._id;\n var axLetter = axId.charAt(0);\n\n var i, j, calcTrace;\n var pointList = [];\n var shownPts = 0;\n\n // make list of box points\n for(i = 0; i < boxList.length; i++) {\n calcTrace = calcdata[boxList[i]];\n for(j = 0; j < calcTrace.length; j++) {\n pointList.push(posAxis.c2l(calcTrace[j].pos, true));\n shownPts += (calcTrace[j].pts2 || []).length;\n }\n }\n\n if(!pointList.length) return;\n\n // box plots - update dPos based on multiple traces\n var boxdv = Lib.distinctVals(pointList);\n if(posAxis.type === 'category' || posAxis.type === 'multicategory') {\n boxdv.minDiff = 1;\n }\n\n var dPos0 = boxdv.minDiff / 2;\n\n // check for forced minimum dtick\n Axes.minDtick(posAxis, boxdv.minDiff, boxdv.vals[0], true);\n\n var numKey = traceType === 'violin' ? '_numViolins' : '_numBoxes';\n var numTotal = fullLayout[numKey];\n var group = fullLayout[traceType + 'mode'] === 'group' && numTotal > 1;\n var groupFraction = 1 - fullLayout[traceType + 'gap'];\n var groupGapFraction = 1 - fullLayout[traceType + 'groupgap'];\n\n for(i = 0; i < boxList.length; i++) {\n calcTrace = calcdata[boxList[i]];\n\n var trace = calcTrace[0].trace;\n var t = calcTrace[0].t;\n var width = trace.width;\n var side = trace.side;\n\n // position coordinate delta\n var dPos;\n // box half width;\n var bdPos;\n // box center offset\n var bPos;\n // half-width within which to accept hover for this box/violin\n // always split the distance to the closest box/violin\n var wHover;\n\n if(width) {\n dPos = bdPos = wHover = width / 2;\n bPos = 0;\n } else {\n dPos = dPos0;\n\n if(group) {\n var groupId = getAxisGroup(fullLayout, posAxis._id) + trace.orientation;\n var alignmentGroups = fullLayout._alignmentOpts[groupId] || {};\n var alignmentGroupOpts = alignmentGroups[trace.alignmentgroup] || {};\n var nOffsetGroups = Object.keys(alignmentGroupOpts.offsetGroups || {}).length;\n var num = nOffsetGroups || numTotal;\n var shift = nOffsetGroups ? trace._offsetIndex : t.num;\n\n bdPos = dPos * groupFraction * groupGapFraction / num;\n bPos = 2 * dPos * (-0.5 + (shift + 0.5) / num) * groupFraction;\n wHover = dPos * groupFraction / num;\n } else {\n bdPos = dPos * groupFraction * groupGapFraction;\n bPos = 0;\n wHover = dPos;\n }\n }\n t.dPos = dPos;\n t.bPos = bPos;\n t.bdPos = bdPos;\n t.wHover = wHover;\n\n // box/violin-only value-space push value\n var pushplus;\n var pushminus;\n // edge of box/violin\n var edge = bPos + bdPos;\n var edgeplus;\n var edgeminus;\n // value-space padding\n var vpadplus;\n var vpadminus;\n // pixel-space padding\n var ppadplus;\n var ppadminus;\n // do we add 5% of both sides (more logic for points beyond box/violin below)\n var padded = Boolean(width);\n // does this trace show points?\n var hasPts = (trace.boxpoints || trace.points) && (shownPts > 0);\n\n if(side === 'positive') {\n pushplus = dPos * (width ? 1 : 0.5);\n edgeplus = edge;\n pushminus = edgeplus = bPos;\n } else if(side === 'negative') {\n pushplus = edgeplus = bPos;\n pushminus = dPos * (width ? 1 : 0.5);\n edgeminus = edge;\n } else {\n pushplus = pushminus = dPos;\n edgeplus = edgeminus = edge;\n }\n\n if(hasPts) {\n var pointpos = trace.pointpos;\n var jitter = trace.jitter;\n var ms = trace.marker.size / 2;\n\n var pp = 0;\n if((pointpos + jitter) >= 0) {\n pp = edge * (pointpos + jitter);\n if(pp > pushplus) {\n // (++) beyond plus-value, use pp\n padded = true;\n ppadplus = ms;\n vpadplus = pp;\n } else if(pp > edgeplus) {\n // (+), use push-value (it's bigger), but add px-pad\n ppadplus = ms;\n vpadplus = pushplus;\n }\n }\n if(pp <= pushplus) {\n // (->) fallback to push value\n vpadplus = pushplus;\n }\n\n var pm = 0;\n if((pointpos - jitter) <= 0) {\n pm = -edge * (pointpos - jitter);\n if(pm > pushminus) {\n // (--) beyond plus-value, use pp\n padded = true;\n ppadminus = ms;\n vpadminus = pm;\n } else if(pm > edgeminus) {\n // (-), use push-value (it's bigger), but add px-pad\n ppadminus = ms;\n vpadminus = pushminus;\n }\n }\n if(pm <= pushminus) {\n // (<-) fallback to push value\n vpadminus = pushminus;\n }\n } else {\n vpadplus = pushplus;\n vpadminus = pushminus;\n }\n\n var pos = new Array(calcTrace.length);\n for(j = 0; j < calcTrace.length; j++) {\n pos[j] = calcTrace[j].pos;\n }\n\n trace._extremes[axId] = Axes.findExtremes(posAxis, pos, {\n padded: padded,\n vpadminus: vpadminus,\n vpadplus: vpadplus,\n vpadLinearized: true,\n // N.B. SVG px-space positive/negative\n ppadminus: {x: ppadminus, y: ppadplus}[axLetter],\n ppadplus: {x: ppadplus, y: ppadminus}[axLetter],\n });\n }\n}\n\nmodule.exports = {\n crossTraceCalc: crossTraceCalc,\n setPositionOffset: setPositionOffset\n};\n","'use strict';\n\nmodule.exports = function selectPoints(searchInfo, selectionTester) {\n var cd = searchInfo.cd;\n var xa = searchInfo.xaxis;\n var ya = searchInfo.yaxis;\n var trace = cd[0].trace;\n var isFunnel = (trace.type === 'funnel');\n var isHorizontal = (trace.orientation === 'h');\n var selection = [];\n var i;\n\n if(selectionTester === false) {\n // clear selection\n for(i = 0; i < cd.length; i++) {\n cd[i].selected = 0;\n }\n } else {\n for(i = 0; i < cd.length; i++) {\n var di = cd[i];\n var ct = 'ct' in di ? di.ct : getCentroid(di, xa, ya, isHorizontal, isFunnel);\n\n if(selectionTester.contains(ct, false, i, searchInfo)) {\n selection.push({\n pointNumber: i,\n x: xa.c2d(di.x),\n y: ya.c2d(di.y)\n });\n di.selected = 1;\n } else {\n di.selected = 0;\n }\n }\n }\n\n return selection;\n};\n\nfunction getCentroid(d, xa, ya, isHorizontal, isFunnel) {\n var x0 = xa.c2p(isHorizontal ? d.s0 : d.p0, true);\n var x1 = xa.c2p(isHorizontal ? d.s1 : d.p1, true);\n var y0 = ya.c2p(isHorizontal ? d.p0 : d.s0, true);\n var y1 = ya.c2p(isHorizontal ? d.p1 : d.s1, true);\n\n if(isFunnel) {\n return [(x0 + x1) / 2, (y0 + y1) / 2];\n } else {\n if(isHorizontal) {\n return [x1, (y0 + y1) / 2];\n } else {\n return [(x0 + x1) / 2, y1];\n }\n }\n}\n","'use strict';\n\nvar d3 = require('@plotly/d3');\nvar Color = require('../../components/color');\nvar Drawing = require('../../components/drawing');\n\nfunction style(gd, cd, sel) {\n var s = sel ? sel : d3.select(gd).selectAll('g.trace.boxes');\n\n s.style('opacity', function(d) { return d[0].trace.opacity; });\n\n s.each(function(d) {\n var el = d3.select(this);\n var trace = d[0].trace;\n var lineWidth = trace.line.width;\n\n function styleBox(boxSel, lineWidth, lineColor, fillColor) {\n boxSel.style('stroke-width', lineWidth + 'px')\n .call(Color.stroke, lineColor)\n .call(Color.fill, fillColor);\n }\n\n var allBoxes = el.selectAll('path.box');\n\n if(trace.type === 'candlestick') {\n allBoxes.each(function(boxData) {\n if(boxData.empty) return;\n\n var thisBox = d3.select(this);\n var container = trace[boxData.dir]; // dir = 'increasing' or 'decreasing'\n styleBox(thisBox, container.line.width, container.line.color, container.fillcolor);\n // TODO: custom selection style for candlesticks\n thisBox.style('opacity', trace.selectedpoints && !boxData.selected ? 0.3 : 1);\n });\n } else {\n styleBox(allBoxes, lineWidth, trace.line.color, trace.fillcolor);\n el.selectAll('path.mean')\n .style({\n 'stroke-width': lineWidth,\n 'stroke-dasharray': (2 * lineWidth) + 'px,' + lineWidth + 'px'\n })\n .call(Color.stroke, trace.line.color);\n\n var pts = el.selectAll('path.point');\n Drawing.pointStyle(pts, trace, gd);\n }\n });\n}\n\nfunction styleOnSelect(gd, cd, sel) {\n var trace = cd[0].trace;\n var pts = sel.selectAll('path.point');\n\n if(trace.selectedpoints) {\n Drawing.selectedPointStyle(pts, trace);\n } else {\n Drawing.pointStyle(pts, trace, gd);\n }\n}\n\nmodule.exports = {\n style: style,\n styleOnSelect: styleOnSelect\n};\n","'use strict';\n\nvar d3 = require('@plotly/d3');\n\nmodule.exports = function style(gd) {\n d3.select(gd).selectAll('.hm image')\n .style('opacity', function(d) {\n return d.trace.opacity;\n });\n};\n","'use strict';\n\nvar isNumeric = require('fast-isnumeric');\n\n\n// used in the drawing step for 'scatter' and 'scattegeo' and\n// in the convert step for 'scatter3d'\nmodule.exports = function makeBubbleSizeFn(trace, factor) {\n if(!factor) {\n factor = 2;\n }\n var marker = trace.marker;\n var sizeRef = marker.sizeref || 1;\n var sizeMin = marker.sizemin || 0;\n\n // for bubble charts, allow scaling the provided value linearly\n // and by area or diameter.\n // Note this only applies to the array-value sizes\n\n var baseFn = (marker.sizemode === 'area') ?\n function(v) { return Math.sqrt(v / sizeRef); } :\n function(v) { return v / sizeRef; };\n\n // TODO add support for position/negative bubbles?\n // TODO add 'sizeoffset' attribute?\n return function(v) {\n var baseSize = baseFn(v / factor);\n\n // don't show non-numeric and negative sizes\n return (isNumeric(baseSize) && (baseSize > 0)) ?\n Math.max(baseSize, sizeMin) :\n 0;\n };\n};\n","'use strict';\n\nvar isNumeric = require('fast-isnumeric');\nvar Lib = require('../../lib');\nvar BADNUM = require('../../constants/numerical').BADNUM;\n\nmodule.exports = function clean2dArray(zOld, trace, xa, ya) {\n var rowlen, collen, getCollen, old2new, i, j;\n\n function cleanZvalue(v) {\n if(!isNumeric(v)) return undefined;\n return +v;\n }\n\n if(trace && trace.transpose) {\n rowlen = 0;\n for(i = 0; i < zOld.length; i++) rowlen = Math.max(rowlen, zOld[i].length);\n if(rowlen === 0) return false;\n getCollen = function(zOld) { return zOld.length; };\n old2new = function(zOld, i, j) { return (zOld[j] || [])[i]; };\n } else {\n rowlen = zOld.length;\n getCollen = function(zOld, i) { return zOld[i].length; };\n old2new = function(zOld, i, j) { return (zOld[i] || [])[j]; };\n }\n\n var padOld2new = function(zOld, i, j) {\n if(i === BADNUM || j === BADNUM) return BADNUM;\n return old2new(zOld, i, j);\n };\n\n function axisMapping(ax) {\n if(trace && trace.type !== 'carpet' && trace.type !== 'contourcarpet' &&\n ax && ax.type === 'category' && trace['_' + ax._id.charAt(0)].length) {\n var axLetter = ax._id.charAt(0);\n var axMapping = {};\n var traceCategories = trace['_' + axLetter + 'CategoryMap'] || trace[axLetter];\n for(i = 0; i < traceCategories.length; i++) {\n axMapping[traceCategories[i]] = i;\n }\n return function(i) {\n var ind = axMapping[ax._categories[i]];\n return ind + 1 ? ind : BADNUM;\n };\n } else {\n return Lib.identity;\n }\n }\n\n var xMap = axisMapping(xa);\n var yMap = axisMapping(ya);\n\n if(ya && ya.type === 'category') rowlen = ya._categories.length;\n var zNew = new Array(rowlen);\n\n for(i = 0; i < rowlen; i++) {\n if(xa && xa.type === 'category') {\n collen = xa._categories.length;\n } else {\n collen = getCollen(zOld, i);\n }\n zNew[i] = new Array(collen);\n for(j = 0; j < collen; j++) zNew[i][j] = cleanZvalue(padOld2new(zOld, yMap(i), xMap(j)));\n }\n\n return zNew;\n};\n","'use strict';\n\nvar Lib = require('../../lib');\n\n// arrayOk attributes, merge them into calcdata array\nmodule.exports = function arraysToCalcdata(cd, trace) {\n for(var i = 0; i < cd.length; i++) cd[i].i = i;\n\n Lib.mergeArray(trace.text, cd, 'tx');\n Lib.mergeArray(trace.hovertext, cd, 'htx');\n\n var marker = trace.marker;\n if(marker) {\n Lib.mergeArray(marker.opacity, cd, 'mo', true);\n Lib.mergeArray(marker.color, cd, 'mc');\n\n var markerLine = marker.line;\n if(markerLine) {\n Lib.mergeArray(markerLine.color, cd, 'mlc');\n Lib.mergeArrayCastPositive(markerLine.width, cd, 'mlw');\n }\n }\n};\n","'use strict';\n\nvar Drawing = require('../../components/drawing');\nvar Color = require('../../components/color');\n\nmodule.exports = function fillOne(s, pt, trace, gd) {\n var pattern = trace.marker.pattern;\n if(pattern && pattern.shape) {\n Drawing.pointStyle(s, trace, gd, pt);\n } else {\n Color.fill(s, pt.color);\n }\n};\n","'use strict';\n\n// package version injected by `npm run preprocess`\nexports.version = '2.29.1';\n","'use strict';\n\nmodule.exports = {\n container: 'marker',\n min: 'cmin',\n max: 'cmax'\n};\n","'use strict';\n\nvar numConstants = require('../../constants/numerical');\nvar oneYear = numConstants.ONEAVGYEAR;\nvar oneMonth = numConstants.ONEAVGMONTH;\nvar oneDay = numConstants.ONEDAY;\nvar oneHour = numConstants.ONEHOUR;\nvar oneMin = numConstants.ONEMIN;\nvar oneSec = numConstants.ONESEC;\nvar tickIncrement = require('../../plots/cartesian/axes').tickIncrement;\n\n\n/*\n * make a function that will find rounded bin edges\n * @param {number} leftGap: how far from the left edge of any bin is the closest data value?\n * @param {number} rightGap: how far from the right edge of any bin is the closest data value?\n * @param {Array[number]} binEdges: the actual edge values used in binning\n * @param {object} pa: the position axis\n * @param {string} calendar: the data calendar\n *\n * @return {function(v, isRightEdge)}:\n * find the start (isRightEdge is falsy) or end (truthy) label value for a bin edge `v`\n */\nmodule.exports = function getBinSpanLabelRound(leftGap, rightGap, binEdges, pa, calendar) {\n // the rounding digit is the largest digit that changes in *all* of 4 regions:\n // - inside the rightGap before binEdges[0] (shifted 10% to the left)\n // - inside the leftGap after binEdges[0] (expanded by 10% of rightGap on each end)\n // - same for binEdges[1]\n var dv0 = -1.1 * rightGap;\n var dv1 = -0.1 * rightGap;\n var dv2 = leftGap - dv1;\n var edge0 = binEdges[0];\n var edge1 = binEdges[1];\n var leftDigit = Math.min(\n biggestDigitChanged(edge0 + dv1, edge0 + dv2, pa, calendar),\n biggestDigitChanged(edge1 + dv1, edge1 + dv2, pa, calendar)\n );\n var rightDigit = Math.min(\n biggestDigitChanged(edge0 + dv0, edge0 + dv1, pa, calendar),\n biggestDigitChanged(edge1 + dv0, edge1 + dv1, pa, calendar)\n );\n\n // normally we try to make the label for the right edge different from\n // the left edge label, so it's unambiguous which bin gets data on the edge.\n // but if this results in more than 3 extra digits (or for dates, more than\n // 2 fields ie hr&min or min&sec, which is 3600x), it'll be more clutter than\n // useful so keep the label cleaner instead\n var digit, disambiguateEdges;\n if(leftDigit > rightDigit && rightDigit < Math.abs(edge1 - edge0) / 4000) {\n digit = leftDigit;\n disambiguateEdges = false;\n } else {\n digit = Math.min(leftDigit, rightDigit);\n disambiguateEdges = true;\n }\n\n if(pa.type === 'date' && digit > oneDay) {\n var dashExclude = (digit === oneYear) ? 1 : 6;\n var increment = (digit === oneYear) ? 'M12' : 'M1';\n\n return function(v, isRightEdge) {\n var dateStr = pa.c2d(v, oneYear, calendar);\n var dashPos = dateStr.indexOf('-', dashExclude);\n if(dashPos > 0) dateStr = dateStr.substr(0, dashPos);\n var roundedV = pa.d2c(dateStr, 0, calendar);\n\n if(roundedV < v) {\n var nextV = tickIncrement(roundedV, increment, false, calendar);\n if((roundedV + nextV) / 2 < v + leftGap) roundedV = nextV;\n }\n\n if(isRightEdge && disambiguateEdges) {\n return tickIncrement(roundedV, increment, true, calendar);\n }\n\n return roundedV;\n };\n }\n\n return function(v, isRightEdge) {\n var roundedV = digit * Math.round(v / digit);\n // if we rounded down and we could round up and still be < leftGap\n // (or what leftGap values round to), do that\n if(roundedV + (digit / 10) < v && roundedV + (digit * 0.9) < v + leftGap) {\n roundedV += digit;\n }\n // finally for the right edge back off one digit - but only if we can do that\n // and not clip off any data that's potentially in the bin\n if(isRightEdge && disambiguateEdges) {\n roundedV -= digit;\n }\n return roundedV;\n };\n};\n\n/*\n * Find the largest digit that changes within a (calcdata) region [v1, v2]\n * if dates, \"digit\" means date/time part when it's bigger than a second\n * returns the unit value to round to this digit, eg 0.01 to round to hundredths, or\n * 100 to round to hundreds. returns oneMonth or oneYear for month or year rounding,\n * so that Math.min will work, rather than 'M1' and 'M12'\n */\nfunction biggestDigitChanged(v1, v2, pa, calendar) {\n // are we crossing zero? can't say anything.\n // in principle this doesn't apply to dates but turns out this doesn't matter.\n if(v1 * v2 <= 0) return Infinity;\n\n var dv = Math.abs(v2 - v1);\n var isDate = pa.type === 'date';\n var digit = biggestGuaranteedDigitChanged(dv, isDate);\n // see if a larger digit also changed\n for(var i = 0; i < 10; i++) {\n // numbers: next digit needs to be >10x but <100x then gets rounded down.\n // dates: next digit can be as much as 60x (then rounded down)\n var nextDigit = biggestGuaranteedDigitChanged(digit * 80, isDate);\n // if we get to years, the chain stops\n if(digit === nextDigit) break;\n if(didDigitChange(nextDigit, v1, v2, isDate, pa, calendar)) digit = nextDigit;\n else break;\n }\n return digit;\n}\n\n/*\n * Find the largest digit that *definitely* changes in a region [v, v + dv] for any v\n * for nonuniform date regions (months/years) pick the largest\n */\nfunction biggestGuaranteedDigitChanged(dv, isDate) {\n if(isDate && dv > oneSec) {\n // this is supposed to be the biggest *guaranteed* change\n // so compare to the longest month and year across any calendar,\n // and we'll iterate back up later\n // note: does not support rounding larger than one year. We could add\n // that if anyone wants it, but seems unusual and not strictly necessary.\n if(dv > oneDay) {\n if(dv > oneYear * 1.1) return oneYear;\n if(dv > oneMonth * 1.1) return oneMonth;\n return oneDay;\n }\n\n if(dv > oneHour) return oneHour;\n if(dv > oneMin) return oneMin;\n return oneSec;\n }\n return Math.pow(10, Math.floor(Math.log(dv) / Math.LN10));\n}\n\nfunction didDigitChange(digit, v1, v2, isDate, pa, calendar) {\n if(isDate && digit > oneDay) {\n var dateParts1 = dateParts(v1, pa, calendar);\n var dateParts2 = dateParts(v2, pa, calendar);\n var parti = (digit === oneYear) ? 0 : 1;\n return dateParts1[parti] !== dateParts2[parti];\n }\n return Math.floor(v2 / digit) - Math.floor(v1 / digit) > 0.1;\n}\n\nfunction dateParts(v, pa, calendar) {\n var parts = pa.c2d(v, oneYear, calendar).split('-');\n if(parts[0] === '') {\n parts.unshift();\n parts[0] = '-' + parts[0];\n }\n return parts;\n}\n","'use strict';\n\nvar isNumeric = require('fast-isnumeric');\nvar Lib = require('../../lib');\n\nvar Axes = require('../../plots/cartesian/axes');\nvar alignPeriod = require('../../plots/cartesian/align_period');\nvar BADNUM = require('../../constants/numerical').BADNUM;\n\nvar subTypes = require('./subtypes');\nvar calcColorscale = require('./colorscale_calc');\nvar arraysToCalcdata = require('./arrays_to_calcdata');\nvar calcSelection = require('./calc_selection');\n\nfunction calc(gd, trace) {\n var fullLayout = gd._fullLayout;\n var xa = trace._xA = Axes.getFromId(gd, trace.xaxis || 'x', 'x');\n var ya = trace._yA = Axes.getFromId(gd, trace.yaxis || 'y', 'y');\n var origX = xa.makeCalcdata(trace, 'x');\n var origY = ya.makeCalcdata(trace, 'y');\n var xObj = alignPeriod(trace, xa, 'x', origX);\n var yObj = alignPeriod(trace, ya, 'y', origY);\n var x = xObj.vals;\n var y = yObj.vals;\n\n var serieslen = trace._length;\n var cd = new Array(serieslen);\n var ids = trace.ids;\n var stackGroupOpts = getStackOpts(trace, fullLayout, xa, ya);\n var interpolateGaps = false;\n var isV, i, j, k, interpolate, vali;\n\n setFirstScatter(fullLayout, trace);\n\n var xAttr = 'x';\n var yAttr = 'y';\n var posAttr;\n if(stackGroupOpts) {\n Lib.pushUnique(stackGroupOpts.traceIndices, trace._expandedIndex);\n isV = stackGroupOpts.orientation === 'v';\n\n // size, like we use for bar\n if(isV) {\n yAttr = 's';\n posAttr = 'x';\n } else {\n xAttr = 's';\n posAttr = 'y';\n }\n interpolate = stackGroupOpts.stackgaps === 'interpolate';\n } else {\n var ppad = calcMarkerSize(trace, serieslen);\n calcAxisExpansion(gd, trace, xa, ya, x, y, ppad);\n }\n\n var hasPeriodX = !!trace.xperiodalignment;\n var hasPeriodY = !!trace.yperiodalignment;\n\n for(i = 0; i < serieslen; i++) {\n var cdi = cd[i] = {};\n var xValid = isNumeric(x[i]);\n var yValid = isNumeric(y[i]);\n if(xValid && yValid) {\n cdi[xAttr] = x[i];\n cdi[yAttr] = y[i];\n\n if(hasPeriodX) {\n cdi.orig_x = origX[i]; // used by hover\n cdi.xEnd = xObj.ends[i];\n cdi.xStart = xObj.starts[i];\n }\n if(hasPeriodY) {\n cdi.orig_y = origY[i]; // used by hover\n cdi.yEnd = yObj.ends[i];\n cdi.yStart = yObj.starts[i];\n }\n } else if(stackGroupOpts && (isV ? xValid : yValid)) {\n // if we're stacking we need to hold on to all valid positions\n // even with invalid sizes\n\n cdi[posAttr] = isV ? x[i] : y[i];\n cdi.gap = true;\n if(interpolate) {\n cdi.s = BADNUM;\n interpolateGaps = true;\n } else {\n cdi.s = 0;\n }\n } else {\n cdi[xAttr] = cdi[yAttr] = BADNUM;\n }\n\n if(ids) {\n cdi.id = String(ids[i]);\n }\n }\n\n arraysToCalcdata(cd, trace);\n calcColorscale(gd, trace);\n calcSelection(cd, trace);\n\n if(stackGroupOpts) {\n // remove bad positions and sort\n // note that original indices get added to cd in arraysToCalcdata\n i = 0;\n while(i < cd.length) {\n if(cd[i][posAttr] === BADNUM) {\n cd.splice(i, 1);\n } else i++;\n }\n\n Lib.sort(cd, function(a, b) {\n return (a[posAttr] - b[posAttr]) || (a.i - b.i);\n });\n\n if(interpolateGaps) {\n // first fill the beginning with constant from the first point\n i = 0;\n while(i < cd.length - 1 && cd[i].gap) {\n i++;\n }\n vali = cd[i].s;\n if(!vali) vali = cd[i].s = 0; // in case of no data AT ALL in this trace - use 0\n for(j = 0; j < i; j++) {\n cd[j].s = vali;\n }\n // then fill the end with constant from the last point\n k = cd.length - 1;\n while(k > i && cd[k].gap) {\n k--;\n }\n vali = cd[k].s;\n for(j = cd.length - 1; j > k; j--) {\n cd[j].s = vali;\n }\n // now interpolate internal gaps linearly\n while(i < k) {\n i++;\n if(cd[i].gap) {\n j = i + 1;\n while(cd[j].gap) {\n j++;\n }\n var pos0 = cd[i - 1][posAttr];\n var size0 = cd[i - 1].s;\n var m = (cd[j].s - size0) / (cd[j][posAttr] - pos0);\n while(i < j) {\n cd[i].s = size0 + (cd[i][posAttr] - pos0) * m;\n i++;\n }\n }\n }\n }\n }\n\n return cd;\n}\n\nfunction calcAxisExpansion(gd, trace, xa, ya, x, y, ppad) {\n var serieslen = trace._length;\n var fullLayout = gd._fullLayout;\n var xId = xa._id;\n var yId = ya._id;\n var firstScatter = fullLayout._firstScatter[firstScatterGroup(trace)] === trace.uid;\n var stackOrientation = (getStackOpts(trace, fullLayout, xa, ya) || {}).orientation;\n var fill = trace.fill;\n\n // cancel minimum tick spacings (only applies to bars and boxes)\n xa._minDtick = 0;\n ya._minDtick = 0;\n\n // check whether bounds should be tight, padded, extended to zero...\n // most cases both should be padded on both ends, so start with that.\n var xOptions = {padded: true};\n var yOptions = {padded: true};\n\n if(ppad) {\n xOptions.ppad = yOptions.ppad = ppad;\n }\n\n // TODO: text size\n\n var openEnded = serieslen < 2 || (x[0] !== x[serieslen - 1]) || (y[0] !== y[serieslen - 1]);\n\n if(openEnded && (\n (fill === 'tozerox') ||\n ((fill === 'tonextx') && (firstScatter || stackOrientation === 'h'))\n )) {\n // include zero (tight) and extremes (padded) if fill to zero\n // (unless the shape is closed, then it's just filling the shape regardless)\n\n xOptions.tozero = true;\n } else if(!(trace.error_y || {}).visible && (\n // if no error bars, markers or text, or fill to y=0 remove x padding\n\n (fill === 'tonexty' || fill === 'tozeroy') ||\n (!subTypes.hasMarkers(trace) && !subTypes.hasText(trace))\n )) {\n xOptions.padded = false;\n xOptions.ppad = 0;\n }\n\n if(openEnded && (\n (fill === 'tozeroy') ||\n ((fill === 'tonexty') && (firstScatter || stackOrientation === 'v'))\n )) {\n // now check for y - rather different logic, though still mostly padded both ends\n // include zero (tight) and extremes (padded) if fill to zero\n // (unless the shape is closed, then it's just filling the shape regardless)\n\n yOptions.tozero = true;\n } else if(fill === 'tonextx' || fill === 'tozerox') {\n // tight y: any x fill\n\n yOptions.padded = false;\n }\n\n // N.B. asymmetric splom traces call this with blank {} xa or ya\n if(xId) trace._extremes[xId] = Axes.findExtremes(xa, x, xOptions);\n if(yId) trace._extremes[yId] = Axes.findExtremes(ya, y, yOptions);\n}\n\nfunction calcMarkerSize(trace, serieslen) {\n if(!subTypes.hasMarkers(trace)) return;\n\n // Treat size like x or y arrays --- Run d2c\n // this needs to go before ppad computation\n var marker = trace.marker;\n var sizeref = 1.6 * (trace.marker.sizeref || 1);\n var markerTrans;\n\n if(trace.marker.sizemode === 'area') {\n markerTrans = function(v) {\n return Math.max(Math.sqrt((v || 0) / sizeref), 3);\n };\n } else {\n markerTrans = function(v) {\n return Math.max((v || 0) / sizeref, 3);\n };\n }\n\n if(Lib.isArrayOrTypedArray(marker.size)) {\n // I tried auto-type but category and dates dont make much sense.\n var ax = {type: 'linear'};\n Axes.setConvert(ax);\n\n var s = ax.makeCalcdata(trace.marker, 'size');\n\n var sizeOut = new Array(serieslen);\n for(var i = 0; i < serieslen; i++) {\n sizeOut[i] = markerTrans(s[i]);\n }\n return sizeOut;\n } else {\n return markerTrans(marker.size);\n }\n}\n\n/**\n * mark the first scatter trace for each subplot\n * note that scatter and scattergl each get their own first trace\n * note also that I'm doing this during calc rather than supplyDefaults\n * so I don't need to worry about transforms, but if we ever do\n * per-trace calc this will get confused.\n */\nfunction setFirstScatter(fullLayout, trace) {\n var group = firstScatterGroup(trace);\n var firstScatter = fullLayout._firstScatter;\n if(!firstScatter[group]) firstScatter[group] = trace.uid;\n}\n\nfunction firstScatterGroup(trace) {\n var stackGroup = trace.stackgroup;\n return trace.xaxis + trace.yaxis + trace.type +\n (stackGroup ? '-' + stackGroup : '');\n}\n\nfunction getStackOpts(trace, fullLayout, xa, ya) {\n var stackGroup = trace.stackgroup;\n if(!stackGroup) return;\n var stackOpts = fullLayout._scatterStackOpts[xa._id + ya._id][stackGroup];\n var stackAx = stackOpts.orientation === 'v' ? ya : xa;\n // Allow stacking only on numeric axes\n // calc is a little late to be figuring this out, but during supplyDefaults\n // we don't know the axis type yet\n if(stackAx.type === 'linear' || stackAx.type === 'log') return stackOpts;\n}\n\nmodule.exports = {\n calc: calc,\n calcMarkerSize: calcMarkerSize,\n calcAxisExpansion: calcAxisExpansion,\n setFirstScatter: setFirstScatter,\n getStackOpts: getStackOpts\n};\n","'use strict';\n\nvar d3 = require('@plotly/d3');\nvar tinycolor = require('tinycolor2');\n\nvar Registry = require('../../registry');\nvar Drawing = require('../../components/drawing');\nvar Axes = require('../../plots/cartesian/axes');\nvar Lib = require('../../lib');\nvar svgTextUtils = require('../../lib/svg_text_utils');\nvar formatLabels = require('../scatter/format_labels');\nvar Color = require('../../components/color');\nvar extractOpts = require('../../components/colorscale').extractOpts;\nvar makeColorScaleFuncFromTrace = require('../../components/colorscale').makeColorScaleFuncFromTrace;\nvar xmlnsNamespaces = require('../../constants/xmlns_namespaces');\nvar alignmentConstants = require('../../constants/alignment');\nvar LINE_SPACING = alignmentConstants.LINE_SPACING;\nvar supportsPixelatedImage = require('../../lib/supports_pixelated_image');\nvar PIXELATED_IMAGE_STYLE = require('../../constants/pixelated_image').STYLE;\n\nvar labelClass = 'heatmap-label';\n\nfunction selectLabels(plotGroup) {\n return plotGroup.selectAll('g.' + labelClass);\n}\n\nfunction removeLabels(plotGroup) {\n selectLabels(plotGroup).remove();\n}\n\nmodule.exports = function(gd, plotinfo, cdheatmaps, heatmapLayer) {\n var xa = plotinfo.xaxis;\n var ya = plotinfo.yaxis;\n\n Lib.makeTraceGroups(heatmapLayer, cdheatmaps, 'hm').each(function(cd) {\n var plotGroup = d3.select(this);\n var cd0 = cd[0];\n var trace = cd0.trace;\n var xGap = trace.xgap || 0;\n var yGap = trace.ygap || 0;\n\n var z = cd0.z;\n var x = cd0.x;\n var y = cd0.y;\n var xc = cd0.xCenter;\n var yc = cd0.yCenter;\n var isContour = Registry.traceIs(trace, 'contour');\n var zsmooth = isContour ? 'best' : trace.zsmooth;\n\n // get z dims\n var m = z.length;\n var n = Lib.maxRowLength(z);\n var xrev = false;\n var yrev = false;\n\n var left, right, temp, top, bottom, i, j, k;\n\n // TODO: if there are multiple overlapping categorical heatmaps,\n // or if we allow category sorting, then the categories may not be\n // sequential... may need to reorder and/or expand z\n\n // Get edges of png in pixels (xa.c2p() maps axes coordinates to pixel coordinates)\n // figure out if either axis is reversed (y is usually reversed, in pixel coords)\n // also clip the image to maximum 50% outside the visible plot area\n // bigger image lets you pan more naturally, but slows performance.\n // TODO: use low-resolution images outside the visible plot for panning\n // these while loops find the first and last brick bounds that are defined\n // (in case of log of a negative)\n i = 0;\n while(left === undefined && i < x.length - 1) {\n left = xa.c2p(x[i]);\n i++;\n }\n i = x.length - 1;\n while(right === undefined && i > 0) {\n right = xa.c2p(x[i]);\n i--;\n }\n\n if(right < left) {\n temp = right;\n right = left;\n left = temp;\n xrev = true;\n }\n\n i = 0;\n while(top === undefined && i < y.length - 1) {\n top = ya.c2p(y[i]);\n i++;\n }\n i = y.length - 1;\n while(bottom === undefined && i > 0) {\n bottom = ya.c2p(y[i]);\n i--;\n }\n\n if(bottom < top) {\n temp = top;\n top = bottom;\n bottom = temp;\n yrev = true;\n }\n\n // for contours with heatmap fill, we generate the boundaries based on\n // brick centers but then use the brick edges for drawing the bricks\n if(isContour) {\n xc = x;\n yc = y;\n x = cd0.xfill;\n y = cd0.yfill;\n }\n\n var drawingMethod = 'default';\n if(zsmooth) {\n drawingMethod = zsmooth === 'best' ? 'smooth' : 'fast';\n } else if(trace._islinear && xGap === 0 && yGap === 0 && supportsPixelatedImage()) {\n drawingMethod = 'fast';\n }\n\n // make an image that goes at most half a screen off either side, to keep\n // time reasonable when you zoom in. if drawingMethod is fast, don't worry\n // about this, because zooming doesn't increase number of pixels\n // if zsmooth is best, don't include anything off screen because it takes too long\n if(drawingMethod !== 'fast') {\n var extra = zsmooth === 'best' ? 0 : 0.5;\n left = Math.max(-extra * xa._length, left);\n right = Math.min((1 + extra) * xa._length, right);\n top = Math.max(-extra * ya._length, top);\n bottom = Math.min((1 + extra) * ya._length, bottom);\n }\n\n var imageWidth = Math.round(right - left);\n var imageHeight = Math.round(bottom - top);\n\n // setup image nodes\n\n // if image is entirely off-screen, don't even draw it\n var isOffScreen = (\n left >= xa._length || right <= 0 || top >= ya._length || bottom <= 0\n );\n\n if(isOffScreen) {\n var noImage = plotGroup.selectAll('image').data([]);\n noImage.exit().remove();\n\n removeLabels(plotGroup);\n return;\n }\n\n // generate image data\n\n var canvasW, canvasH;\n if(drawingMethod === 'fast') {\n canvasW = n;\n canvasH = m;\n } else {\n canvasW = imageWidth;\n canvasH = imageHeight;\n }\n\n var canvas = document.createElement('canvas');\n canvas.width = canvasW;\n canvas.height = canvasH;\n var context = canvas.getContext('2d', {willReadFrequently: true});\n\n var sclFunc = makeColorScaleFuncFromTrace(trace, {noNumericCheck: true, returnArray: true});\n\n // map brick boundaries to image pixels\n var xpx,\n ypx;\n if(drawingMethod === 'fast') {\n xpx = xrev ?\n function(index) { return n - 1 - index; } :\n Lib.identity;\n ypx = yrev ?\n function(index) { return m - 1 - index; } :\n Lib.identity;\n } else {\n xpx = function(index) {\n return Lib.constrain(Math.round(xa.c2p(x[index]) - left),\n 0, imageWidth);\n };\n ypx = function(index) {\n return Lib.constrain(Math.round(ya.c2p(y[index]) - top),\n 0, imageHeight);\n };\n }\n\n // build the pixel map brick-by-brick\n // cruise through z-matrix row-by-row\n // build a brick at each z-matrix value\n var yi = ypx(0);\n var yb = [yi, yi];\n var xbi = xrev ? 0 : 1;\n var ybi = yrev ? 0 : 1;\n // for collecting an average luminosity of the heatmap\n var pixcount = 0;\n var rcount = 0;\n var gcount = 0;\n var bcount = 0;\n\n var xb, xi, v, row, c;\n\n function setColor(v, pixsize) {\n if(v !== undefined) {\n var c = sclFunc(v);\n c[0] = Math.round(c[0]);\n c[1] = Math.round(c[1]);\n c[2] = Math.round(c[2]);\n\n pixcount += pixsize;\n rcount += c[0] * pixsize;\n gcount += c[1] * pixsize;\n bcount += c[2] * pixsize;\n return c;\n }\n return [0, 0, 0, 0];\n }\n\n function interpColor(r0, r1, xinterp, yinterp) {\n var z00 = r0[xinterp.bin0];\n if(z00 === undefined) return setColor(undefined, 1);\n\n var z01 = r0[xinterp.bin1];\n var z10 = r1[xinterp.bin0];\n var z11 = r1[xinterp.bin1];\n var dx = (z01 - z00) || 0;\n var dy = (z10 - z00) || 0;\n var dxy;\n\n // the bilinear interpolation term needs different calculations\n // for all the different permutations of missing data\n // among the neighbors of the main point, to ensure\n // continuity across brick boundaries.\n if(z01 === undefined) {\n if(z11 === undefined) dxy = 0;\n else if(z10 === undefined) dxy = 2 * (z11 - z00);\n else dxy = (2 * z11 - z10 - z00) * 2 / 3;\n } else if(z11 === undefined) {\n if(z10 === undefined) dxy = 0;\n else dxy = (2 * z00 - z01 - z10) * 2 / 3;\n } else if(z10 === undefined) dxy = (2 * z11 - z01 - z00) * 2 / 3;\n else dxy = (z11 + z00 - z01 - z10);\n\n return setColor(z00 + xinterp.frac * dx + yinterp.frac * (dy + xinterp.frac * dxy));\n }\n\n if(drawingMethod !== 'default') { // works fastest with imageData\n var pxIndex = 0;\n var pixels;\n\n try {\n pixels = new Uint8Array(canvasW * canvasH * 4);\n } catch(e) {\n pixels = new Array(canvasW * canvasH * 4);\n }\n\n if(drawingMethod === 'smooth') { // zsmooth=\"best\"\n var xForPx = xc || x;\n var yForPx = yc || y;\n var xPixArray = new Array(xForPx.length);\n var yPixArray = new Array(yForPx.length);\n var xinterpArray = new Array(imageWidth);\n var findInterpX = xc ? findInterpFromCenters : findInterp;\n var findInterpY = yc ? findInterpFromCenters : findInterp;\n var yinterp, r0, r1;\n\n // first make arrays of x and y pixel locations of brick boundaries\n for(i = 0; i < xForPx.length; i++) xPixArray[i] = Math.round(xa.c2p(xForPx[i]) - left);\n for(i = 0; i < yForPx.length; i++) yPixArray[i] = Math.round(ya.c2p(yForPx[i]) - top);\n\n // then make arrays of interpolations\n // (bin0=closest, bin1=next, frac=fractional dist.)\n for(i = 0; i < imageWidth; i++) xinterpArray[i] = findInterpX(i, xPixArray);\n\n // now do the interpolations and fill the png\n for(j = 0; j < imageHeight; j++) {\n yinterp = findInterpY(j, yPixArray);\n r0 = z[yinterp.bin0];\n r1 = z[yinterp.bin1];\n for(i = 0; i < imageWidth; i++, pxIndex += 4) {\n c = interpColor(r0, r1, xinterpArray[i], yinterp);\n putColor(pixels, pxIndex, c);\n }\n }\n } else { // drawingMethod = \"fast\" (zsmooth = \"fast\"|false)\n for(j = 0; j < m; j++) {\n row = z[j];\n yb = ypx(j);\n for(i = 0; i < n; i++) {\n c = setColor(row[i], 1);\n pxIndex = (yb * n + xpx(i)) * 4;\n putColor(pixels, pxIndex, c);\n }\n }\n }\n\n var imageData = context.createImageData(canvasW, canvasH);\n try {\n imageData.data.set(pixels);\n } catch(e) {\n var pxArray = imageData.data;\n var dlen = pxArray.length;\n for(j = 0; j < dlen; j ++) {\n pxArray[j] = pixels[j];\n }\n }\n\n context.putImageData(imageData, 0, 0);\n } else { // rawingMethod = \"default\" (zsmooth = false)\n // filling potentially large bricks works fastest with fillRect\n // gaps do not need to be exact integers, but if they *are* we will get\n // cleaner edges by rounding at least one edge\n var xGapLeft = Math.floor(xGap / 2);\n var yGapTop = Math.floor(yGap / 2);\n\n for(j = 0; j < m; j++) {\n row = z[j];\n yb.reverse();\n yb[ybi] = ypx(j + 1);\n if(yb[0] === yb[1] || yb[0] === undefined || yb[1] === undefined) {\n continue;\n }\n xi = xpx(0);\n xb = [xi, xi];\n for(i = 0; i < n; i++) {\n // build one color brick!\n xb.reverse();\n xb[xbi] = xpx(i + 1);\n if(xb[0] === xb[1] || xb[0] === undefined || xb[1] === undefined) {\n continue;\n }\n v = row[i];\n c = setColor(v, (xb[1] - xb[0]) * (yb[1] - yb[0]));\n context.fillStyle = 'rgba(' + c.join(',') + ')';\n\n context.fillRect(xb[0] + xGapLeft, yb[0] + yGapTop,\n xb[1] - xb[0] - xGap, yb[1] - yb[0] - yGap);\n }\n }\n }\n\n rcount = Math.round(rcount / pixcount);\n gcount = Math.round(gcount / pixcount);\n bcount = Math.round(bcount / pixcount);\n var avgColor = tinycolor('rgb(' + rcount + ',' + gcount + ',' + bcount + ')');\n\n gd._hmpixcount = (gd._hmpixcount||0) + pixcount;\n gd._hmlumcount = (gd._hmlumcount||0) + pixcount * avgColor.getLuminance();\n\n var image3 = plotGroup.selectAll('image')\n .data(cd);\n\n image3.enter().append('svg:image').attr({\n xmlns: xmlnsNamespaces.svg,\n preserveAspectRatio: 'none'\n });\n\n image3.attr({\n height: imageHeight,\n width: imageWidth,\n x: left,\n y: top,\n 'xlink:href': canvas.toDataURL('image/png')\n });\n\n if(drawingMethod === 'fast' && !zsmooth) {\n image3.attr('style', PIXELATED_IMAGE_STYLE);\n }\n\n removeLabels(plotGroup);\n\n var texttemplate = trace.texttemplate;\n if(texttemplate) {\n // dummy axis for formatting the z value\n var cOpts = extractOpts(trace);\n var dummyAx = {\n type: 'linear',\n range: [cOpts.min, cOpts.max],\n _separators: xa._separators,\n _numFormat: xa._numFormat\n };\n\n var aHistogram2dContour = trace.type === 'histogram2dcontour';\n var aContour = trace.type === 'contour';\n var iStart = aContour ? 1 : 0;\n var iStop = aContour ? m - 1 : m;\n var jStart = aContour ? 1 : 0;\n var jStop = aContour ? n - 1 : n;\n\n var textData = [];\n for(i = iStart; i < iStop; i++) {\n var yVal;\n if(aContour) {\n yVal = cd0.y[i];\n } else if(aHistogram2dContour) {\n if(i === 0 || i === m - 1) continue;\n yVal = cd0.y[i];\n } else if(cd0.yCenter) {\n yVal = cd0.yCenter[i];\n } else {\n if(i + 1 === m && cd0.y[i + 1] === undefined) continue;\n yVal = (cd0.y[i] + cd0.y[i + 1]) / 2;\n }\n\n var _y = Math.round(ya.c2p(yVal));\n if(0 > _y || _y > ya._length) continue;\n\n for(j = jStart; j < jStop; j++) {\n var xVal;\n if(aContour) {\n xVal = cd0.x[j];\n } else if(aHistogram2dContour) {\n if(j === 0 || j === n - 1) continue;\n xVal = cd0.x[j];\n } else if(cd0.xCenter) {\n xVal = cd0.xCenter[j];\n } else {\n if(j + 1 === n && cd0.x[j + 1] === undefined) continue;\n xVal = (cd0.x[j] + cd0.x[j + 1]) / 2;\n }\n\n var _x = Math.round(xa.c2p(xVal));\n if(0 > _x || _x > xa._length) continue;\n\n var obj = formatLabels({\n x: xVal,\n y: yVal\n }, trace, gd._fullLayout);\n\n obj.x = xVal;\n obj.y = yVal;\n\n var zVal = cd0.z[i][j];\n if(zVal === undefined) {\n obj.z = '';\n obj.zLabel = '';\n } else {\n obj.z = zVal;\n obj.zLabel = Axes.tickText(dummyAx, zVal, 'hover').text;\n }\n\n var theText = cd0.text && cd0.text[i] && cd0.text[i][j];\n if(theText === undefined || theText === false) theText = '';\n obj.text = theText;\n\n var _t = Lib.texttemplateString(texttemplate, obj, gd._fullLayout._d3locale, obj, trace._meta || {});\n if(!_t) continue;\n\n var lines = _t.split('
');\n var nL = lines.length;\n var nC = 0;\n for(k = 0; k < nL; k++) {\n nC = Math.max(nC, lines[k].length);\n }\n\n textData.push({\n l: nL, // number of lines\n c: nC, // maximum number of chars in a line\n t: _t, // text\n x: _x,\n y: _y,\n z: zVal\n });\n }\n }\n\n var font = trace.textfont;\n var fontFamily = font.family;\n var fontSize = font.size;\n var globalFontSize = gd._fullLayout.font.size;\n\n if(!fontSize || fontSize === 'auto') {\n var minW = Infinity;\n var minH = Infinity;\n var maxL = 0;\n var maxC = 0;\n\n for(k = 0; k < textData.length; k++) {\n var d = textData[k];\n maxL = Math.max(maxL, d.l);\n maxC = Math.max(maxC, d.c);\n\n if(k < textData.length - 1) {\n var nextD = textData[k + 1];\n var dx = Math.abs(nextD.x - d.x);\n var dy = Math.abs(nextD.y - d.y);\n\n if(dx) minW = Math.min(minW, dx);\n if(dy) minH = Math.min(minH, dy);\n }\n }\n\n if(\n !isFinite(minW) ||\n !isFinite(minH)\n ) {\n fontSize = globalFontSize;\n } else {\n minW -= xGap;\n minH -= yGap;\n\n minW /= maxC;\n minH /= maxL;\n\n minW /= LINE_SPACING / 2;\n minH /= LINE_SPACING;\n\n fontSize = Math.min(\n Math.floor(minW),\n Math.floor(minH),\n globalFontSize\n );\n }\n }\n if(fontSize <= 0 || !isFinite(fontSize)) return;\n\n var xFn = function(d) { return d.x; };\n var yFn = function(d) {\n return d.y - fontSize * ((d.l * LINE_SPACING) / 2 - 1);\n };\n\n var labels = selectLabels(plotGroup).data(textData);\n\n labels\n .enter()\n .append('g')\n .classed(labelClass, 1)\n .append('text')\n .attr('text-anchor', 'middle')\n .each(function(d) {\n var thisLabel = d3.select(this);\n\n var fontColor = font.color;\n if(!fontColor || fontColor === 'auto') {\n fontColor = Color.contrast(\n 'rgba(' +\n sclFunc(d.z).join() +\n ')'\n );\n }\n\n thisLabel\n .attr('data-notex', 1)\n .call(svgTextUtils.positionText, xFn(d), yFn(d))\n .call(Drawing.font, fontFamily, fontSize, fontColor)\n .text(d.t)\n .call(svgTextUtils.convertToTspans, gd);\n });\n }\n });\n};\n\n// get interpolated bin value. Returns {bin0:closest bin, frac:fractional dist to next, bin1:next bin}\nfunction findInterp(pixel, pixArray) {\n var maxBin = pixArray.length - 2;\n var bin = Lib.constrain(Lib.findBin(pixel, pixArray), 0, maxBin);\n var pix0 = pixArray[bin];\n var pix1 = pixArray[bin + 1];\n var interp = Lib.constrain(bin + (pixel - pix0) / (pix1 - pix0) - 0.5, 0, maxBin);\n var bin0 = Math.round(interp);\n var frac = Math.abs(interp - bin0);\n\n if(!interp || interp === maxBin || !frac) {\n return {\n bin0: bin0,\n bin1: bin0,\n frac: 0\n };\n }\n return {\n bin0: bin0,\n frac: frac,\n bin1: Math.round(bin0 + frac / (interp - bin0))\n };\n}\n\nfunction findInterpFromCenters(pixel, centerPixArray) {\n var maxBin = centerPixArray.length - 1;\n var bin = Lib.constrain(Lib.findBin(pixel, centerPixArray), 0, maxBin);\n var pix0 = centerPixArray[bin];\n var pix1 = centerPixArray[bin + 1];\n var frac = ((pixel - pix0) / (pix1 - pix0)) || 0;\n if(frac <= 0) {\n return {\n bin0: bin,\n bin1: bin,\n frac: 0\n };\n }\n if(frac < 0.5) {\n return {\n bin0: bin,\n bin1: bin + 1,\n frac: frac\n };\n }\n return {\n bin0: bin + 1,\n bin1: bin,\n frac: 1 - frac\n };\n}\n\nfunction putColor(pixels, pxIndex, c) {\n pixels[pxIndex] = c[0];\n pixels[pxIndex + 1] = c[1];\n pixels[pxIndex + 2] = c[2];\n pixels[pxIndex + 3] = Math.round(c[3] * 255);\n}\n","'use strict';\n\nvar axisHoverFormat = require('../../plots/cartesian/axis_format_attributes').axisHoverFormat;\nvar texttemplateAttrs = require('../../plots/template_attributes').texttemplateAttrs;\nvar hovertemplateAttrs = require('../../plots/template_attributes').hovertemplateAttrs;\nvar colorScaleAttrs = require('../../components/colorscale/attributes');\nvar fontAttrs = require('../../plots/font_attributes');\nvar dash = require('../../components/drawing/attributes').dash;\nvar pattern = require('../../components/drawing/attributes').pattern;\n\nvar Drawing = require('../../components/drawing');\nvar constants = require('./constants');\n\nvar extendFlat = require('../../lib/extend').extendFlat;\n\nfunction axisPeriod(axis) {\n return {\n valType: 'any',\n dflt: 0,\n editType: 'calc',\n description: [\n 'Only relevant when the axis `type` is *date*.',\n 'Sets the period positioning in milliseconds or *M* on the ' + axis + ' axis.',\n 'Special values in the form of *M* could be used to declare',\n 'the number of months. In this case `n` must be a positive integer.'\n ].join(' ')\n };\n}\n\nfunction axisPeriod0(axis) {\n return {\n valType: 'any',\n editType: 'calc',\n description: [\n 'Only relevant when the axis `type` is *date*.',\n 'Sets the base for period positioning in milliseconds or date string on the ' + axis + ' axis.',\n 'When `' + axis + 'period` is round number of weeks,',\n 'the `' + axis + 'period0` by default would be on a Sunday i.e. 2000-01-02,',\n 'otherwise it would be at 2000-01-01.'\n ].join(' ')\n };\n}\n\nfunction axisPeriodAlignment(axis) {\n return {\n valType: 'enumerated',\n values: [\n 'start', 'middle', 'end'\n ],\n dflt: 'middle',\n editType: 'calc',\n description: [\n 'Only relevant when the axis `type` is *date*.',\n 'Sets the alignment of data points on the ' + axis + ' axis.'\n ].join(' ')\n };\n}\n\nmodule.exports = {\n x: {\n valType: 'data_array',\n editType: 'calc+clearAxisTypes',\n anim: true,\n description: 'Sets the x coordinates.'\n },\n x0: {\n valType: 'any',\n dflt: 0,\n editType: 'calc+clearAxisTypes',\n anim: true,\n description: [\n 'Alternate to `x`.',\n 'Builds a linear space of x coordinates.',\n 'Use with `dx`',\n 'where `x0` is the starting coordinate and `dx` the step.'\n ].join(' ')\n },\n dx: {\n valType: 'number',\n dflt: 1,\n editType: 'calc',\n anim: true,\n description: [\n 'Sets the x coordinate step.',\n 'See `x0` for more info.'\n ].join(' ')\n },\n y: {\n valType: 'data_array',\n editType: 'calc+clearAxisTypes',\n anim: true,\n description: 'Sets the y coordinates.'\n },\n y0: {\n valType: 'any',\n dflt: 0,\n editType: 'calc+clearAxisTypes',\n anim: true,\n description: [\n 'Alternate to `y`.',\n 'Builds a linear space of y coordinates.',\n 'Use with `dy`',\n 'where `y0` is the starting coordinate and `dy` the step.'\n ].join(' ')\n },\n dy: {\n valType: 'number',\n dflt: 1,\n editType: 'calc',\n anim: true,\n description: [\n 'Sets the y coordinate step.',\n 'See `y0` for more info.'\n ].join(' ')\n },\n\n xperiod: axisPeriod('x'),\n yperiod: axisPeriod('y'),\n xperiod0: axisPeriod0('x0'),\n yperiod0: axisPeriod0('y0'),\n xperiodalignment: axisPeriodAlignment('x'),\n yperiodalignment: axisPeriodAlignment('y'),\n xhoverformat: axisHoverFormat('x'),\n yhoverformat: axisHoverFormat('y'),\n\n offsetgroup: {\n valType: 'string',\n dflt: '',\n editType: 'calc',\n description: [\n 'Set several traces linked to the same position axis',\n 'or matching axes to the same',\n 'offsetgroup where bars of the same position coordinate will line up.'\n ].join(' ')\n },\n\n alignmentgroup: {\n valType: 'string',\n dflt: '',\n editType: 'calc',\n description: [\n 'Set several traces linked to the same position axis',\n 'or matching axes to the same',\n 'alignmentgroup. This controls whether bars compute their positional',\n 'range dependently or independently.'\n ].join(' ')\n },\n\n stackgroup: {\n valType: 'string',\n dflt: '',\n editType: 'calc',\n description: [\n 'Set several scatter traces (on the same subplot) to the same',\n 'stackgroup in order to add their y values (or their x values if',\n '`orientation` is *h*). If blank or omitted this trace will not be',\n 'stacked. Stacking also turns `fill` on by default, using *tonexty*',\n '(*tonextx*) if `orientation` is *h* (*v*) and sets the default',\n '`mode` to *lines* irrespective of point count.',\n 'You can only stack on a numeric (linear or log) axis.',\n 'Traces in a `stackgroup` will only fill to (or be filled to) other',\n 'traces in the same group. With multiple `stackgroup`s or some',\n 'traces stacked and some not, if fill-linked traces are not already',\n 'consecutive, the later ones will be pushed down in the drawing order.'\n ].join(' ')\n },\n orientation: {\n valType: 'enumerated',\n values: ['v', 'h'],\n editType: 'calc',\n description: [\n 'Only relevant in the following cases:',\n '1. when `scattermode` is set to *group*.',\n '2. when `stackgroup` is used, and only the first',\n '`orientation` found in the `stackgroup` will be used - including',\n 'if `visible` is *legendonly* but not if it is `false`. Sets the',\n 'stacking direction. With *v* (*h*), the y (x) values of subsequent',\n 'traces are added. Also affects the default value of `fill`.'\n ].join(' ')\n },\n groupnorm: {\n valType: 'enumerated',\n values: ['', 'fraction', 'percent'],\n dflt: '',\n editType: 'calc',\n description: [\n 'Only relevant when `stackgroup` is used, and only the first',\n '`groupnorm` found in the `stackgroup` will be used - including',\n 'if `visible` is *legendonly* but not if it is `false`.',\n 'Sets the normalization for the sum of this `stackgroup`.',\n 'With *fraction*, the value of each trace at each location is',\n 'divided by the sum of all trace values at that location.',\n '*percent* is the same but multiplied by 100 to show percentages.',\n 'If there are multiple subplots, or multiple `stackgroup`s on one',\n 'subplot, each will be normalized within its own set.'\n ].join(' ')\n },\n stackgaps: {\n valType: 'enumerated',\n values: ['infer zero', 'interpolate'],\n dflt: 'infer zero',\n editType: 'calc',\n description: [\n 'Only relevant when `stackgroup` is used, and only the first',\n '`stackgaps` found in the `stackgroup` will be used - including',\n 'if `visible` is *legendonly* but not if it is `false`.',\n 'Determines how we handle locations at which other traces in this',\n 'group have data but this one does not.',\n 'With *infer zero* we insert a zero at these locations.',\n 'With *interpolate* we linearly interpolate between existing',\n 'values, and extrapolate a constant beyond the existing values.'\n // TODO - implement interrupt mode\n // '*interrupt* omits this trace from the stack at this location by',\n // 'dropping abruptly, midway between the existing and missing locations.'\n ].join(' ')\n },\n\n text: {\n valType: 'string',\n dflt: '',\n arrayOk: true,\n editType: 'calc',\n description: [\n 'Sets text elements associated with each (x,y) pair.',\n 'If a single string, the same string appears over',\n 'all the data points.',\n 'If an array of string, the items are mapped in order to the',\n 'this trace\\'s (x,y) coordinates.',\n 'If trace `hoverinfo` contains a *text* flag and *hovertext* is not set,',\n 'these elements will be seen in the hover labels.'\n ].join(' ')\n },\n\n texttemplate: texttemplateAttrs({}, {\n\n }),\n hovertext: {\n valType: 'string',\n dflt: '',\n arrayOk: true,\n editType: 'style',\n description: [\n 'Sets hover text elements associated with each (x,y) pair.',\n 'If a single string, the same string appears over',\n 'all the data points.',\n 'If an array of string, the items are mapped in order to the',\n 'this trace\\'s (x,y) coordinates.',\n 'To be seen, trace `hoverinfo` must contain a *text* flag.'\n ].join(' ')\n },\n mode: {\n valType: 'flaglist',\n flags: ['lines', 'markers', 'text'],\n extras: ['none'],\n editType: 'calc',\n description: [\n 'Determines the drawing mode for this scatter trace.',\n 'If the provided `mode` includes *text* then the `text` elements',\n 'appear at the coordinates. Otherwise, the `text` elements',\n 'appear on hover.',\n 'If there are less than ' + constants.PTS_LINESONLY + ' points',\n 'and the trace is not stacked',\n 'then the default is *lines+markers*. Otherwise, *lines*.'\n ].join(' ')\n },\n hoveron: {\n valType: 'flaglist',\n flags: ['points', 'fills'],\n editType: 'style',\n description: [\n 'Do the hover effects highlight individual points (markers or',\n 'line points) or do they highlight filled regions?',\n 'If the fill is *toself* or *tonext* and there are no markers',\n 'or text, then the default is *fills*, otherwise it is *points*.'\n ].join(' ')\n },\n hovertemplate: hovertemplateAttrs({}, {\n keys: constants.eventDataKeys\n }),\n\n line: {\n color: {\n valType: 'color',\n editType: 'style',\n anim: true,\n description: 'Sets the line color.'\n },\n width: {\n valType: 'number',\n min: 0,\n dflt: 2,\n editType: 'style',\n anim: true,\n description: 'Sets the line width (in px).'\n },\n shape: {\n valType: 'enumerated',\n values: ['linear', 'spline', 'hv', 'vh', 'hvh', 'vhv'],\n dflt: 'linear',\n editType: 'plot',\n description: [\n 'Determines the line shape.',\n 'With *spline* the lines are drawn using spline interpolation.',\n 'The other available values correspond to step-wise line shapes.'\n ].join(' ')\n },\n smoothing: {\n valType: 'number',\n min: 0,\n max: 1.3,\n dflt: 1,\n editType: 'plot',\n description: [\n 'Has an effect only if `shape` is set to *spline*',\n 'Sets the amount of smoothing.',\n '*0* corresponds to no smoothing (equivalent to a *linear* shape).'\n ].join(' ')\n },\n dash: extendFlat({}, dash, {editType: 'style'}),\n backoff: { // we want to have a similar option for the start of the line\n valType: 'number',\n min: 0,\n dflt: 'auto',\n arrayOk: true,\n editType: 'plot',\n description: [\n 'Sets the line back off from the end point of the nth line segment (in px).',\n 'This option is useful e.g. to avoid overlap with arrowhead markers.',\n 'With *auto* the lines would trim before markers if `marker.angleref` is set to *previous*.'\n ].join(' ')\n },\n simplify: {\n valType: 'boolean',\n dflt: true,\n editType: 'plot',\n description: [\n 'Simplifies lines by removing nearly-collinear points. When transitioning',\n 'lines, it may be desirable to disable this so that the number of points',\n 'along the resulting SVG path is unaffected.'\n ].join(' ')\n },\n editType: 'plot'\n },\n\n connectgaps: {\n valType: 'boolean',\n dflt: false,\n editType: 'calc',\n description: [\n 'Determines whether or not gaps',\n '(i.e. {nan} or missing values)',\n 'in the provided data arrays are connected.'\n ].join(' ')\n },\n cliponaxis: {\n valType: 'boolean',\n dflt: true,\n editType: 'plot',\n description: [\n 'Determines whether or not markers and text nodes',\n 'are clipped about the subplot axes.',\n 'To show markers and text nodes above axis lines and tick labels,',\n 'make sure to set `xaxis.layer` and `yaxis.layer` to *below traces*.'\n ].join(' ')\n },\n\n fill: {\n valType: 'enumerated',\n values: ['none', 'tozeroy', 'tozerox', 'tonexty', 'tonextx', 'toself', 'tonext'],\n editType: 'calc',\n description: [\n 'Sets the area to fill with a solid color.',\n 'Defaults to *none* unless this trace is stacked, then it gets',\n '*tonexty* (*tonextx*) if `orientation` is *v* (*h*)',\n 'Use with `fillcolor` if not *none*.',\n '*tozerox* and *tozeroy* fill to x=0 and y=0 respectively.',\n '*tonextx* and *tonexty* fill between the endpoints of this',\n 'trace and the endpoints of the trace before it, connecting those',\n 'endpoints with straight lines (to make a stacked area graph);',\n 'if there is no trace before it, they behave like *tozerox* and',\n '*tozeroy*.',\n '*toself* connects the endpoints of the trace (or each segment',\n 'of the trace if it has gaps) into a closed shape.',\n '*tonext* fills the space between two traces if one completely',\n 'encloses the other (eg consecutive contour lines), and behaves like',\n '*toself* if there is no trace before it. *tonext* should not be',\n 'used if one trace does not enclose the other.',\n 'Traces in a `stackgroup` will only fill to (or be filled to) other',\n 'traces in the same group. With multiple `stackgroup`s or some',\n 'traces stacked and some not, if fill-linked traces are not already',\n 'consecutive, the later ones will be pushed down in the drawing order.'\n ].join(' ')\n },\n fillcolor: {\n valType: 'color',\n editType: 'style',\n anim: true,\n description: [\n 'Sets the fill color.',\n 'Defaults to a half-transparent variant of the line color,',\n 'marker color, or marker line color, whichever is available.'\n ].join(' ')\n },\n fillpattern: pattern,\n marker: extendFlat({\n symbol: {\n valType: 'enumerated',\n values: Drawing.symbolList,\n dflt: 'circle',\n arrayOk: true,\n editType: 'style',\n description: [\n 'Sets the marker symbol type.',\n 'Adding 100 is equivalent to appending *-open* to a symbol name.',\n 'Adding 200 is equivalent to appending *-dot* to a symbol name.',\n 'Adding 300 is equivalent to appending *-open-dot*',\n 'or *dot-open* to a symbol name.'\n ].join(' ')\n },\n opacity: {\n valType: 'number',\n min: 0,\n max: 1,\n arrayOk: true,\n editType: 'style',\n anim: true,\n description: 'Sets the marker opacity.'\n },\n angle: {\n valType: 'angle',\n dflt: 0,\n arrayOk: true,\n editType: 'plot',\n anim: false, // TODO: possibly set to true in future\n description: [\n 'Sets the marker angle in respect to `angleref`.'\n ].join(' ')\n },\n angleref: {\n valType: 'enumerated',\n values: ['previous', 'up'],\n dflt: 'up',\n editType: 'plot',\n anim: false,\n description: [\n 'Sets the reference for marker angle.',\n 'With *previous*, angle 0 points along the line from the previous point to this one.',\n 'With *up*, angle 0 points toward the top of the screen.'\n ].join(' ')\n },\n standoff: {\n valType: 'number',\n min: 0,\n dflt: 0,\n arrayOk: true,\n editType: 'plot',\n anim: true,\n description: [\n 'Moves the marker away from the data point in the direction of `angle` (in px).',\n 'This can be useful for example if you have another marker at this',\n 'location and you want to point an arrowhead marker at it.'\n ].join(' ')\n },\n size: {\n valType: 'number',\n min: 0,\n dflt: 6,\n arrayOk: true,\n editType: 'calc',\n anim: true,\n description: 'Sets the marker size (in px).'\n },\n maxdisplayed: {\n valType: 'number',\n min: 0,\n dflt: 0,\n editType: 'plot',\n description: [\n 'Sets a maximum number of points to be drawn on the graph.',\n '*0* corresponds to no limit.'\n ].join(' ')\n },\n sizeref: {\n valType: 'number',\n dflt: 1,\n editType: 'calc',\n description: [\n 'Has an effect only if `marker.size` is set to a numerical array.',\n 'Sets the scale factor used to determine the rendered size of',\n 'marker points. Use with `sizemin` and `sizemode`.'\n ].join(' ')\n },\n sizemin: {\n valType: 'number',\n min: 0,\n dflt: 0,\n editType: 'calc',\n description: [\n 'Has an effect only if `marker.size` is set to a numerical array.',\n 'Sets the minimum size (in px) of the rendered marker points.'\n ].join(' ')\n },\n sizemode: {\n valType: 'enumerated',\n values: ['diameter', 'area'],\n dflt: 'diameter',\n editType: 'calc',\n description: [\n 'Has an effect only if `marker.size` is set to a numerical array.',\n 'Sets the rule for which the data in `size` is converted',\n 'to pixels.'\n ].join(' ')\n },\n\n line: extendFlat({\n width: {\n valType: 'number',\n min: 0,\n arrayOk: true,\n editType: 'style',\n anim: true,\n description: 'Sets the width (in px) of the lines bounding the marker points.'\n },\n editType: 'calc'\n },\n colorScaleAttrs('marker.line', {anim: true})\n ),\n gradient: {\n type: {\n valType: 'enumerated',\n values: ['radial', 'horizontal', 'vertical', 'none'],\n arrayOk: true,\n dflt: 'none',\n editType: 'calc',\n description: [\n 'Sets the type of gradient used to fill the markers'\n ].join(' ')\n },\n color: {\n valType: 'color',\n arrayOk: true,\n editType: 'calc',\n description: [\n 'Sets the final color of the gradient fill:',\n 'the center color for radial, the right for horizontal,',\n 'or the bottom for vertical.',\n ].join(' ')\n },\n editType: 'calc'\n },\n editType: 'calc'\n },\n colorScaleAttrs('marker', {anim: true})\n ),\n selected: {\n marker: {\n opacity: {\n valType: 'number',\n min: 0,\n max: 1,\n editType: 'style',\n description: 'Sets the marker opacity of selected points.'\n },\n color: {\n valType: 'color',\n editType: 'style',\n description: 'Sets the marker color of selected points.'\n },\n size: {\n valType: 'number',\n min: 0,\n editType: 'style',\n description: 'Sets the marker size of selected points.'\n },\n editType: 'style'\n },\n textfont: {\n color: {\n valType: 'color',\n editType: 'style',\n description: 'Sets the text font color of selected points.'\n },\n editType: 'style'\n },\n editType: 'style'\n },\n unselected: {\n marker: {\n opacity: {\n valType: 'number',\n min: 0,\n max: 1,\n editType: 'style',\n description: 'Sets the marker opacity of unselected points, applied only when a selection exists.'\n },\n color: {\n valType: 'color',\n editType: 'style',\n description: 'Sets the marker color of unselected points, applied only when a selection exists.'\n },\n size: {\n valType: 'number',\n min: 0,\n editType: 'style',\n description: 'Sets the marker size of unselected points, applied only when a selection exists.'\n },\n editType: 'style'\n },\n textfont: {\n color: {\n valType: 'color',\n editType: 'style',\n description: 'Sets the text font color of unselected points, applied only when a selection exists.'\n },\n editType: 'style'\n },\n editType: 'style'\n },\n\n textposition: {\n valType: 'enumerated',\n values: [\n 'top left', 'top center', 'top right',\n 'middle left', 'middle center', 'middle right',\n 'bottom left', 'bottom center', 'bottom right'\n ],\n dflt: 'middle center',\n arrayOk: true,\n editType: 'calc',\n description: [\n 'Sets the positions of the `text` elements',\n 'with respects to the (x,y) coordinates.'\n ].join(' ')\n },\n textfont: fontAttrs({\n editType: 'calc',\n colorEditType: 'style',\n arrayOk: true,\n description: 'Sets the text font.'\n }),\n};\n","'use strict';\n\nmodule.exports = function eventData(out, pt) {\n // Note: hoverOnBox property is needed for click-to-select\n // to ignore when a box was clicked. This is the reason box\n // implements this custom eventData function.\n if(pt.hoverOnBox) out.hoverOnBox = pt.hoverOnBox;\n\n if('xVal' in pt) out.x = pt.xVal;\n if('yVal' in pt) out.y = pt.yVal;\n if(pt.xa) out.xaxis = pt.xa;\n if(pt.ya) out.yaxis = pt.ya;\n\n return out;\n};\n","'use strict';\n\n\nmodule.exports = {\n boxmode: {\n valType: 'enumerated',\n values: ['group', 'overlay'],\n dflt: 'overlay',\n editType: 'calc',\n description: [\n 'Determines how boxes at the same location coordinate',\n 'are displayed on the graph.',\n 'If *group*, the boxes are plotted next to one another',\n 'centered around the shared location.',\n 'If *overlay*, the boxes are plotted over one another,',\n 'you might need to set *opacity* to see them multiple boxes.',\n 'Has no effect on traces that have *width* set.'\n ].join(' ')\n },\n boxgap: {\n valType: 'number',\n min: 0,\n max: 1,\n dflt: 0.3,\n editType: 'calc',\n description: [\n 'Sets the gap (in plot fraction) between boxes of',\n 'adjacent location coordinates.',\n 'Has no effect on traces that have *width* set.'\n ].join(' ')\n },\n boxgroupgap: {\n valType: 'number',\n min: 0,\n max: 1,\n dflt: 0.3,\n editType: 'calc',\n description: [\n 'Sets the gap (in plot fraction) between boxes of',\n 'the same location coordinate.',\n 'Has no effect on traces that have *width* set.'\n ].join(' ')\n }\n};\n","'use strict';\n\n\nmodule.exports = {\n barmode: {\n valType: 'enumerated',\n values: ['stack', 'group', 'overlay', 'relative'],\n dflt: 'group',\n editType: 'calc',\n description: [\n 'Determines how bars at the same location coordinate',\n 'are displayed on the graph.',\n 'With *stack*, the bars are stacked on top of one another',\n 'With *relative*, the bars are stacked on top of one another,',\n 'with negative values below the axis, positive values above',\n 'With *group*, the bars are plotted next to one another',\n 'centered around the shared location.',\n 'With *overlay*, the bars are plotted over one another,',\n 'you might need to reduce *opacity* to see multiple bars.'\n ].join(' ')\n },\n barnorm: {\n valType: 'enumerated',\n values: ['', 'fraction', 'percent'],\n dflt: '',\n editType: 'calc',\n description: [\n 'Sets the normalization for bar traces on the graph.',\n 'With *fraction*, the value of each bar is divided by the sum of all',\n 'values at that location coordinate.',\n '*percent* is the same but multiplied by 100 to show percentages.'\n ].join(' ')\n },\n bargap: {\n valType: 'number',\n min: 0,\n max: 1,\n editType: 'calc',\n description: [\n 'Sets the gap (in plot fraction) between bars of',\n 'adjacent location coordinates.'\n ].join(' ')\n },\n bargroupgap: {\n valType: 'number',\n min: 0,\n max: 1,\n dflt: 0,\n editType: 'calc',\n description: [\n 'Sets the gap (in plot fraction) between bars of',\n 'the same location coordinate.'\n ].join(' ')\n },\n barcornerradius: {\n valType: 'any',\n editType: 'calc',\n description: [\n 'Sets the rounding of bar corners. May be an integer number of pixels,',\n 'or a percentage of bar width (as a string ending in %).'\n ].join(' ')\n },\n};\n","'use strict';\n\nvar Lib = require('../../lib');\n\n\n// arrayOk attributes, merge them into calcdata array\nmodule.exports = function arraysToCalcdata(cd, trace) {\n // so each point knows which index it originally came from\n for(var i = 0; i < cd.length; i++) cd[i].i = i;\n\n Lib.mergeArray(trace.text, cd, 'tx');\n Lib.mergeArray(trace.texttemplate, cd, 'txt');\n Lib.mergeArray(trace.hovertext, cd, 'htx');\n Lib.mergeArray(trace.customdata, cd, 'data');\n Lib.mergeArray(trace.textposition, cd, 'tp');\n if(trace.textfont) {\n Lib.mergeArrayCastPositive(trace.textfont.size, cd, 'ts');\n Lib.mergeArray(trace.textfont.color, cd, 'tc');\n Lib.mergeArray(trace.textfont.family, cd, 'tf');\n }\n\n var marker = trace.marker;\n if(marker) {\n Lib.mergeArrayCastPositive(marker.size, cd, 'ms');\n Lib.mergeArrayCastPositive(marker.opacity, cd, 'mo');\n Lib.mergeArray(marker.symbol, cd, 'mx');\n Lib.mergeArray(marker.angle, cd, 'ma');\n Lib.mergeArray(marker.standoff, cd, 'mf');\n Lib.mergeArray(marker.color, cd, 'mc');\n\n var markerLine = marker.line;\n if(marker.line) {\n Lib.mergeArray(markerLine.color, cd, 'mlc');\n Lib.mergeArrayCastPositive(markerLine.width, cd, 'mlw');\n }\n\n var markerGradient = marker.gradient;\n if(markerGradient && markerGradient.type !== 'none') {\n Lib.mergeArray(markerGradient.type, cd, 'mgt');\n Lib.mergeArray(markerGradient.color, cd, 'mgc');\n }\n }\n};\n","'use strict';\n\nvar Registry = require('../registry');\nvar Lib = require('../lib');\n\nvar extendFlat = Lib.extendFlat;\nvar extendDeep = Lib.extendDeep;\n\n// Put default plotTile layouts here\nfunction cloneLayoutOverride(tileClass) {\n var override;\n\n switch(tileClass) {\n case 'themes__thumb':\n override = {\n autosize: true,\n width: 150,\n height: 150,\n title: {text: ''},\n showlegend: false,\n margin: {l: 5, r: 5, t: 5, b: 5, pad: 0},\n annotations: []\n };\n break;\n\n case 'thumbnail':\n override = {\n title: {text: ''},\n hidesources: true,\n showlegend: false,\n borderwidth: 0,\n bordercolor: '',\n margin: {l: 1, r: 1, t: 1, b: 1, pad: 0},\n annotations: []\n };\n break;\n\n default:\n override = {};\n }\n\n\n return override;\n}\n\nfunction keyIsAxis(keyName) {\n var types = ['xaxis', 'yaxis', 'zaxis'];\n return (types.indexOf(keyName.slice(0, 5)) > -1);\n}\n\n\nmodule.exports = function clonePlot(graphObj, options) {\n var i;\n var oldData = graphObj.data;\n var oldLayout = graphObj.layout;\n var newData = extendDeep([], oldData);\n var newLayout = extendDeep({}, oldLayout, cloneLayoutOverride(options.tileClass));\n var context = graphObj._context || {};\n\n if(options.width) newLayout.width = options.width;\n if(options.height) newLayout.height = options.height;\n\n if(options.tileClass === 'thumbnail' || options.tileClass === 'themes__thumb') {\n // kill annotations\n newLayout.annotations = [];\n var keys = Object.keys(newLayout);\n\n for(i = 0; i < keys.length; i++) {\n if(keyIsAxis(keys[i])) {\n newLayout[keys[i]].title = {text: ''};\n }\n }\n\n // kill colorbar and pie labels\n for(i = 0; i < newData.length; i++) {\n var trace = newData[i];\n trace.showscale = false;\n if(trace.marker) trace.marker.showscale = false;\n if(Registry.traceIs(trace, 'pie-like')) trace.textposition = 'none';\n }\n }\n\n if(Array.isArray(options.annotations)) {\n for(i = 0; i < options.annotations.length; i++) {\n newLayout.annotations.push(options.annotations[i]);\n }\n }\n\n // TODO: does this scene modification really belong here?\n // If we still need it, can it move into the gl3d module?\n var sceneIds = Object.keys(newLayout).filter(function(key) {\n return key.match(/^scene\\d*$/);\n });\n if(sceneIds.length) {\n var axesImageOverride = {};\n if(options.tileClass === 'thumbnail') {\n axesImageOverride = {\n title: {text: ''},\n showaxeslabels: false,\n showticklabels: false,\n linetickenable: false\n };\n }\n for(i = 0; i < sceneIds.length; i++) {\n var scene = newLayout[sceneIds[i]];\n\n if(!scene.xaxis) {\n scene.xaxis = {};\n }\n\n if(!scene.yaxis) {\n scene.yaxis = {};\n }\n\n if(!scene.zaxis) {\n scene.zaxis = {};\n }\n\n extendFlat(scene.xaxis, axesImageOverride);\n extendFlat(scene.yaxis, axesImageOverride);\n extendFlat(scene.zaxis, axesImageOverride);\n\n // TODO what does this do?\n scene._scene = null;\n }\n }\n\n var gd = document.createElement('div');\n if(options.tileClass) gd.className = options.tileClass;\n\n var plotTile = {\n gd: gd,\n td: gd, // for external (image server) compatibility\n layout: newLayout,\n data: newData,\n config: {\n staticPlot: (options.staticPlot === undefined) ?\n true :\n options.staticPlot,\n plotGlPixelRatio: (options.plotGlPixelRatio === undefined) ?\n 2 :\n options.plotGlPixelRatio,\n displaylogo: options.displaylogo || false,\n showLink: options.showLink || false,\n showTips: options.showTips || false,\n mapboxAccessToken: context.mapboxAccessToken\n }\n };\n\n if(options.setBackground !== 'transparent') {\n plotTile.config.setBackground = options.setBackground || 'opaque';\n }\n\n // attaching the default Layout the gd, so you can grab it later\n plotTile.gd.defaultLayout = cloneLayoutOverride(options.tileClass);\n\n return plotTile;\n};\n","'use strict';\n\nvar dateTick0 = require('../../lib').dateTick0;\nvar numConstants = require('../../constants/numerical');\nvar ONEWEEK = numConstants.ONEWEEK;\n\nfunction getPeriod0Dflt(period, calendar) {\n if(period % ONEWEEK === 0) {\n return dateTick0(calendar, 1); // Sunday\n }\n return dateTick0(calendar, 0);\n}\n\nmodule.exports = function handlePeriodDefaults(traceIn, traceOut, layout, coerce, opts) {\n if(!opts) {\n opts = {\n x: true,\n y: true\n };\n }\n\n if(opts.x) {\n var xperiod = coerce('xperiod');\n if(xperiod) {\n coerce('xperiod0', getPeriod0Dflt(xperiod, traceOut.xcalendar));\n coerce('xperiodalignment');\n }\n }\n\n if(opts.y) {\n var yperiod = coerce('yperiod');\n if(yperiod) {\n coerce('yperiod0', getPeriod0Dflt(yperiod, traceOut.ycalendar));\n coerce('yperiodalignment');\n }\n }\n};\n","'use strict';\n\nvar Registry = require('../../registry');\nvar Lib = require('../../lib');\nvar Axes = require('../../plots/cartesian/axes');\nvar alignPeriod = require('../../plots/cartesian/align_period');\n\nvar histogram2dCalc = require('../histogram2d/calc');\nvar colorscaleCalc = require('../../components/colorscale/calc');\nvar convertColumnData = require('./convert_column_xyz');\nvar clean2dArray = require('./clean_2d_array');\nvar interp2d = require('./interp2d');\nvar findEmpties = require('./find_empties');\nvar makeBoundArray = require('./make_bound_array');\nvar BADNUM = require('../../constants/numerical').BADNUM;\n\nmodule.exports = function calc(gd, trace) {\n // prepare the raw data\n // run makeCalcdata on x and y even for heatmaps, in case of category mappings\n var xa = Axes.getFromId(gd, trace.xaxis || 'x');\n var ya = Axes.getFromId(gd, trace.yaxis || 'y');\n var isContour = Registry.traceIs(trace, 'contour');\n var isHist = Registry.traceIs(trace, 'histogram');\n var isGL2D = Registry.traceIs(trace, 'gl2d');\n var zsmooth = isContour ? 'best' : trace.zsmooth;\n var x, x0, dx, origX;\n var y, y0, dy, origY;\n var z, i, binned;\n\n // cancel minimum tick spacings (only applies to bars and boxes)\n xa._minDtick = 0;\n ya._minDtick = 0;\n\n if(isHist) {\n binned = histogram2dCalc(gd, trace);\n origX = binned.orig_x;\n x = binned.x;\n x0 = binned.x0;\n dx = binned.dx;\n\n origY = binned.orig_y;\n y = binned.y;\n y0 = binned.y0;\n dy = binned.dy;\n\n z = binned.z;\n } else {\n var zIn = trace.z;\n if(Lib.isArray1D(zIn)) {\n convertColumnData(trace, xa, ya, 'x', 'y', ['z']);\n x = trace._x;\n y = trace._y;\n zIn = trace._z;\n } else {\n origX = trace.x ? xa.makeCalcdata(trace, 'x') : [];\n origY = trace.y ? ya.makeCalcdata(trace, 'y') : [];\n x = alignPeriod(trace, xa, 'x', origX).vals;\n y = alignPeriod(trace, ya, 'y', origY).vals;\n trace._x = x;\n trace._y = y;\n }\n\n x0 = trace.x0;\n dx = trace.dx;\n y0 = trace.y0;\n dy = trace.dy;\n\n z = clean2dArray(zIn, trace, xa, ya);\n }\n\n if(xa.rangebreaks || ya.rangebreaks) {\n z = dropZonBreaks(x, y, z);\n\n if(!isHist) {\n x = skipBreaks(x);\n y = skipBreaks(y);\n\n trace._x = x;\n trace._y = y;\n }\n }\n\n if(!isHist && (isContour || trace.connectgaps)) {\n trace._emptypoints = findEmpties(z);\n interp2d(z, trace._emptypoints);\n }\n\n function noZsmooth(msg) {\n zsmooth = trace._input.zsmooth = trace.zsmooth = false;\n Lib.warn('cannot use zsmooth: \"fast\": ' + msg);\n }\n\n function scaleIsLinear(s) {\n if(s.length > 1) {\n var avgdx = (s[s.length - 1] - s[0]) / (s.length - 1);\n var maxErrX = Math.abs(avgdx / 100);\n for(i = 0; i < s.length - 1; i++) {\n if(Math.abs(s[i + 1] - s[i] - avgdx) > maxErrX) {\n return false;\n }\n }\n }\n return true;\n }\n\n // Check whether all brick are uniform\n trace._islinear = false;\n if(xa.type === 'log' || ya.type === 'log') {\n if(zsmooth === 'fast') {\n noZsmooth('log axis found');\n }\n } else if(!scaleIsLinear(x)) {\n if(zsmooth === 'fast') noZsmooth('x scale is not linear');\n } else if(!scaleIsLinear(y)) {\n if(zsmooth === 'fast') noZsmooth('y scale is not linear');\n } else {\n trace._islinear = true;\n }\n\n // create arrays of brick boundaries, to be used by autorange and heatmap.plot\n var xlen = Lib.maxRowLength(z);\n var xIn = trace.xtype === 'scaled' ? '' : x;\n var xArray = makeBoundArray(trace, xIn, x0, dx, xlen, xa);\n var yIn = trace.ytype === 'scaled' ? '' : y;\n var yArray = makeBoundArray(trace, yIn, y0, dy, z.length, ya);\n\n // handled in gl2d convert step\n if(!isGL2D) {\n trace._extremes[xa._id] = Axes.findExtremes(xa, xArray);\n trace._extremes[ya._id] = Axes.findExtremes(ya, yArray);\n }\n\n var cd0 = {\n x: xArray,\n y: yArray,\n z: z,\n text: trace._text || trace.text,\n hovertext: trace._hovertext || trace.hovertext\n };\n\n if(trace.xperiodalignment && origX) {\n cd0.orig_x = origX;\n }\n if(trace.yperiodalignment && origY) {\n cd0.orig_y = origY;\n }\n\n if(xIn && xIn.length === xArray.length - 1) cd0.xCenter = xIn;\n if(yIn && yIn.length === yArray.length - 1) cd0.yCenter = yIn;\n\n if(isHist) {\n cd0.xRanges = binned.xRanges;\n cd0.yRanges = binned.yRanges;\n cd0.pts = binned.pts;\n }\n\n if(!isContour) {\n colorscaleCalc(gd, trace, {vals: z, cLetter: 'z'});\n }\n\n if(isContour && trace.contours && trace.contours.coloring === 'heatmap') {\n var dummyTrace = {\n type: trace.type === 'contour' ? 'heatmap' : 'histogram2d',\n xcalendar: trace.xcalendar,\n ycalendar: trace.ycalendar\n };\n cd0.xfill = makeBoundArray(dummyTrace, xIn, x0, dx, xlen, xa);\n cd0.yfill = makeBoundArray(dummyTrace, yIn, y0, dy, z.length, ya);\n }\n\n return [cd0];\n};\n\nfunction skipBreaks(a) {\n var b = [];\n var len = a.length;\n for(var i = 0; i < len; i++) {\n var v = a[i];\n if(v !== BADNUM) b.push(v);\n }\n return b;\n}\n\nfunction dropZonBreaks(x, y, z) {\n var newZ = [];\n var k = -1;\n for(var i = 0; i < z.length; i++) {\n if(y[i] === BADNUM) continue;\n k++;\n newZ[k] = [];\n for(var j = 0; j < z[i].length; j++) {\n if(x[j] === BADNUM) continue;\n\n newZ[k].push(z[i][j]);\n }\n }\n return newZ;\n}\n","'use strict';\n\nvar Lib = require('../../lib');\n\nmodule.exports = function handleHeatmapLabelDefaults(coerce, layout) {\n coerce('texttemplate');\n\n var fontDflt = Lib.extendFlat({}, layout.font, {\n color: 'auto',\n size: 'auto'\n });\n Lib.coerceFont(coerce, 'textfont', fontDflt);\n};\n","'use strict';\n\nvar Lib = require('../../lib');\nvar Registry = require('../../registry');\nvar Color = require('../../components/color');\nvar handlePeriodDefaults = require('../scatter/period_defaults');\nvar handleGroupingDefaults = require('../scatter/grouping_defaults');\nvar autoType = require('../../plots/cartesian/axis_autotype');\nvar attributes = require('./attributes');\n\nfunction supplyDefaults(traceIn, traceOut, defaultColor, layout) {\n function coerce(attr, dflt) {\n return Lib.coerce(traceIn, traceOut, attributes, attr, dflt);\n }\n\n handleSampleDefaults(traceIn, traceOut, coerce, layout);\n if(traceOut.visible === false) return;\n\n handlePeriodDefaults(traceIn, traceOut, layout, coerce);\n coerce('xhoverformat');\n coerce('yhoverformat');\n\n var hasPreCompStats = traceOut._hasPreCompStats;\n\n if(hasPreCompStats) {\n coerce('lowerfence');\n coerce('upperfence');\n }\n\n coerce('line.color', (traceIn.marker || {}).color || defaultColor);\n coerce('line.width');\n coerce('fillcolor', Color.addOpacity(traceOut.line.color, 0.5));\n\n var boxmeanDflt = false;\n if(hasPreCompStats) {\n var mean = coerce('mean');\n var sd = coerce('sd');\n if(mean && mean.length) {\n boxmeanDflt = true;\n if(sd && sd.length) boxmeanDflt = 'sd';\n }\n }\n\n coerce('whiskerwidth');\n var sizemode = coerce('sizemode');\n var boxmean;\n if(sizemode === 'quartiles') {\n boxmean = coerce('boxmean', boxmeanDflt);\n }\n coerce('showwhiskers', sizemode === 'quartiles');\n if((sizemode === 'sd') || (boxmean === 'sd')) {\n coerce('sdmultiple');\n }\n coerce('width');\n coerce('quartilemethod');\n\n var notchedDflt = false;\n if(hasPreCompStats) {\n var notchspan = coerce('notchspan');\n if(notchspan && notchspan.length) {\n notchedDflt = true;\n }\n } else if(Lib.validate(traceIn.notchwidth, attributes.notchwidth)) {\n notchedDflt = true;\n }\n var notched = coerce('notched', notchedDflt);\n if(notched) coerce('notchwidth');\n\n handlePointsDefaults(traceIn, traceOut, coerce, {prefix: 'box'});\n}\n\nfunction handleSampleDefaults(traceIn, traceOut, coerce, layout) {\n function getDims(arr) {\n var dims = 0;\n if(arr && arr.length) {\n dims += 1;\n if(Lib.isArrayOrTypedArray(arr[0]) && arr[0].length) {\n dims += 1;\n }\n }\n return dims;\n }\n\n function valid(astr) {\n return Lib.validate(traceIn[astr], attributes[astr]);\n }\n\n var y = coerce('y');\n var x = coerce('x');\n\n var sLen;\n if(traceOut.type === 'box') {\n var q1 = coerce('q1');\n var median = coerce('median');\n var q3 = coerce('q3');\n\n traceOut._hasPreCompStats = (\n q1 && q1.length &&\n median && median.length &&\n q3 && q3.length\n );\n sLen = Math.min(\n Lib.minRowLength(q1),\n Lib.minRowLength(median),\n Lib.minRowLength(q3)\n );\n }\n\n var yDims = getDims(y);\n var xDims = getDims(x);\n var yLen = yDims && Lib.minRowLength(y);\n var xLen = xDims && Lib.minRowLength(x);\n\n var calendar = layout.calendar;\n var opts = {\n autotypenumbers: layout.autotypenumbers\n };\n\n var defaultOrientation, len;\n if(traceOut._hasPreCompStats) {\n switch(String(xDims) + String(yDims)) {\n // no x / no y\n case '00':\n var setInX = valid('x0') || valid('dx');\n var setInY = valid('y0') || valid('dy');\n\n if(setInY && !setInX) {\n defaultOrientation = 'h';\n } else {\n defaultOrientation = 'v';\n }\n\n len = sLen;\n break;\n // just x\n case '10':\n defaultOrientation = 'v';\n len = Math.min(sLen, xLen);\n break;\n case '20':\n defaultOrientation = 'h';\n len = Math.min(sLen, x.length);\n break;\n // just y\n case '01':\n defaultOrientation = 'h';\n len = Math.min(sLen, yLen);\n break;\n case '02':\n defaultOrientation = 'v';\n len = Math.min(sLen, y.length);\n break;\n // both\n case '12':\n defaultOrientation = 'v';\n len = Math.min(sLen, xLen, y.length);\n break;\n case '21':\n defaultOrientation = 'h';\n len = Math.min(sLen, x.length, yLen);\n break;\n case '11':\n // this one is ill-defined\n len = 0;\n break;\n case '22':\n var hasCategories = false;\n var i;\n for(i = 0; i < x.length; i++) {\n if(autoType(x[i], calendar, opts) === 'category') {\n hasCategories = true;\n break;\n }\n }\n\n if(hasCategories) {\n defaultOrientation = 'v';\n len = Math.min(sLen, xLen, y.length);\n } else {\n for(i = 0; i < y.length; i++) {\n if(autoType(y[i], calendar, opts) === 'category') {\n hasCategories = true;\n break;\n }\n }\n\n if(hasCategories) {\n defaultOrientation = 'h';\n len = Math.min(sLen, x.length, yLen);\n } else {\n defaultOrientation = 'v';\n len = Math.min(sLen, xLen, y.length);\n }\n }\n break;\n }\n } else if(yDims > 0) {\n defaultOrientation = 'v';\n if(xDims > 0) {\n len = Math.min(xLen, yLen);\n } else {\n len = Math.min(yLen);\n }\n } else if(xDims > 0) {\n defaultOrientation = 'h';\n len = Math.min(xLen);\n } else {\n len = 0;\n }\n\n if(!len) {\n traceOut.visible = false;\n return;\n }\n traceOut._length = len;\n\n var orientation = coerce('orientation', defaultOrientation);\n\n // these are just used for positioning, they never define the sample\n if(traceOut._hasPreCompStats) {\n if(orientation === 'v' && xDims === 0) {\n coerce('x0', 0);\n coerce('dx', 1);\n } else if(orientation === 'h' && yDims === 0) {\n coerce('y0', 0);\n coerce('dy', 1);\n }\n } else {\n if(orientation === 'v' && xDims === 0) {\n coerce('x0');\n } else if(orientation === 'h' && yDims === 0) {\n coerce('y0');\n }\n }\n\n var handleCalendarDefaults = Registry.getComponentMethod('calendars', 'handleTraceDefaults');\n handleCalendarDefaults(traceIn, traceOut, ['x', 'y'], layout);\n}\n\nfunction handlePointsDefaults(traceIn, traceOut, coerce, opts) {\n var prefix = opts.prefix;\n\n var outlierColorDflt = Lib.coerce2(traceIn, traceOut, attributes, 'marker.outliercolor');\n var lineoutliercolor = coerce('marker.line.outliercolor');\n\n var modeDflt = 'outliers';\n if(traceOut._hasPreCompStats) {\n modeDflt = 'all';\n } else if(outlierColorDflt || lineoutliercolor) {\n modeDflt = 'suspectedoutliers';\n }\n\n var mode = coerce(prefix + 'points', modeDflt);\n\n if(mode) {\n coerce('jitter', mode === 'all' ? 0.3 : 0);\n coerce('pointpos', mode === 'all' ? -1.5 : 0);\n\n coerce('marker.symbol');\n coerce('marker.opacity');\n coerce('marker.size');\n coerce('marker.angle');\n\n coerce('marker.color', traceOut.line.color);\n coerce('marker.line.color');\n coerce('marker.line.width');\n\n if(mode === 'suspectedoutliers') {\n coerce('marker.line.outliercolor', traceOut.marker.color);\n coerce('marker.line.outlierwidth');\n }\n\n coerce('selected.marker.color');\n coerce('unselected.marker.color');\n coerce('selected.marker.size');\n coerce('unselected.marker.size');\n\n coerce('text');\n coerce('hovertext');\n } else {\n delete traceOut.marker;\n }\n\n var hoveron = coerce('hoveron');\n if(hoveron === 'all' || hoveron.indexOf('points') !== -1) {\n coerce('hovertemplate');\n }\n\n Lib.coerceSelectionMarkerOpacity(traceOut, coerce);\n}\n\nfunction crossTraceDefaults(fullData, fullLayout) {\n var traceIn, traceOut;\n\n function coerce(attr) {\n return Lib.coerce(traceOut._input, traceOut, attributes, attr);\n }\n\n for(var i = 0; i < fullData.length; i++) {\n traceOut = fullData[i];\n var traceType = traceOut.type;\n\n if(traceType === 'box' || traceType === 'violin') {\n traceIn = traceOut._input;\n if(fullLayout[traceType + 'mode'] === 'group') {\n handleGroupingDefaults(traceIn, traceOut, fullLayout, coerce);\n }\n }\n }\n}\n\nmodule.exports = {\n supplyDefaults: supplyDefaults,\n crossTraceDefaults: crossTraceDefaults,\n\n handleSampleDefaults: handleSampleDefaults,\n handlePointsDefaults: handlePointsDefaults\n};\n","'use strict';\n\nmodule.exports = function handleStyleDefaults(traceIn, traceOut, coerce) {\n var zsmooth = coerce('zsmooth');\n if(zsmooth === false) {\n // ensure that xgap and ygap are coerced only when zsmooth allows them to have an effect.\n coerce('xgap');\n coerce('ygap');\n }\n\n coerce('zhoverformat');\n};\n","'use strict';\n\nvar scatterAttrs = require('../scatter/attributes');\nvar axisHoverFormat = require('../../plots/cartesian/axis_format_attributes').axisHoverFormat;\nvar hovertemplateAttrs = require('../../plots/template_attributes').hovertemplateAttrs;\nvar texttemplateAttrs = require('../../plots/template_attributes').texttemplateAttrs;\nvar colorScaleAttrs = require('../../components/colorscale/attributes');\nvar fontAttrs = require('../../plots/font_attributes');\nvar constants = require('./constants');\nvar pattern = require('../../components/drawing/attributes').pattern;\n\nvar extendFlat = require('../../lib/extend').extendFlat;\n\nvar textFontAttrs = fontAttrs({\n editType: 'calc',\n arrayOk: true,\n colorEditType: 'style',\n description: ''\n});\n\nvar scatterMarkerAttrs = scatterAttrs.marker;\nvar scatterMarkerLineAttrs = scatterMarkerAttrs.line;\n\nvar markerLineWidth = extendFlat({},\n scatterMarkerLineAttrs.width, { dflt: 0 });\n\nvar markerLine = extendFlat({\n width: markerLineWidth,\n editType: 'calc'\n}, colorScaleAttrs('marker.line'));\n\nvar marker = extendFlat({\n line: markerLine,\n editType: 'calc'\n}, colorScaleAttrs('marker'), {\n opacity: {\n valType: 'number',\n arrayOk: true,\n dflt: 1,\n min: 0,\n max: 1,\n editType: 'style',\n description: 'Sets the opacity of the bars.'\n },\n pattern: pattern,\n cornerradius: {\n valType: 'any',\n editType: 'calc',\n description: [\n 'Sets the rounding of corners. May be an integer number of pixels,',\n 'or a percentage of bar width (as a string ending in %). Defaults to `layout.barcornerradius`.',\n 'In stack or relative barmode, the first trace to set cornerradius is used for the whole stack.'\n ].join(' ')\n },\n});\n\nmodule.exports = {\n x: scatterAttrs.x,\n x0: scatterAttrs.x0,\n dx: scatterAttrs.dx,\n y: scatterAttrs.y,\n y0: scatterAttrs.y0,\n dy: scatterAttrs.dy,\n\n xperiod: scatterAttrs.xperiod,\n yperiod: scatterAttrs.yperiod,\n xperiod0: scatterAttrs.xperiod0,\n yperiod0: scatterAttrs.yperiod0,\n xperiodalignment: scatterAttrs.xperiodalignment,\n yperiodalignment: scatterAttrs.yperiodalignment,\n xhoverformat: axisHoverFormat('x'),\n yhoverformat: axisHoverFormat('y'),\n\n text: scatterAttrs.text,\n texttemplate: texttemplateAttrs({editType: 'plot'}, {\n keys: constants.eventDataKeys\n }),\n hovertext: scatterAttrs.hovertext,\n hovertemplate: hovertemplateAttrs({}, {\n keys: constants.eventDataKeys\n }),\n\n textposition: {\n valType: 'enumerated',\n values: ['inside', 'outside', 'auto', 'none'],\n dflt: 'auto',\n arrayOk: true,\n editType: 'calc',\n description: [\n 'Specifies the location of the `text`.',\n '*inside* positions `text` inside, next to the bar end',\n '(rotated and scaled if needed).',\n '*outside* positions `text` outside, next to the bar end',\n '(scaled if needed), unless there is another bar stacked on',\n 'this one, then the text gets pushed inside.',\n '*auto* tries to position `text` inside the bar, but if',\n 'the bar is too small and no bar is stacked on this one',\n 'the text is moved outside.',\n 'If *none*, no text appears.'\n ].join(' ')\n },\n\n insidetextanchor: {\n valType: 'enumerated',\n values: ['end', 'middle', 'start'],\n dflt: 'end',\n editType: 'plot',\n description: [\n 'Determines if texts are kept at center or start/end points in `textposition` *inside* mode.'\n ].join(' ')\n },\n\n textangle: {\n valType: 'angle',\n dflt: 'auto',\n editType: 'plot',\n description: [\n 'Sets the angle of the tick labels with respect to the bar.',\n 'For example, a `tickangle` of -90 draws the tick labels',\n 'vertically. With *auto* the texts may automatically be',\n 'rotated to fit with the maximum size in bars.'\n ].join(' ')\n },\n\n textfont: extendFlat({}, textFontAttrs, {\n description: 'Sets the font used for `text`.'\n }),\n\n insidetextfont: extendFlat({}, textFontAttrs, {\n description: 'Sets the font used for `text` lying inside the bar.'\n }),\n\n outsidetextfont: extendFlat({}, textFontAttrs, {\n description: 'Sets the font used for `text` lying outside the bar.'\n }),\n\n constraintext: {\n valType: 'enumerated',\n values: ['inside', 'outside', 'both', 'none'],\n dflt: 'both',\n editType: 'calc',\n description: [\n 'Constrain the size of text inside or outside a bar to be no',\n 'larger than the bar itself.'\n ].join(' ')\n },\n\n cliponaxis: extendFlat({}, scatterAttrs.cliponaxis, {\n description: [\n 'Determines whether the text nodes',\n 'are clipped about the subplot axes.',\n 'To show the text nodes above axis lines and tick labels,',\n 'make sure to set `xaxis.layer` and `yaxis.layer` to *below traces*.'\n ].join(' ')\n }),\n\n orientation: {\n valType: 'enumerated',\n values: ['v', 'h'],\n editType: 'calc+clearAxisTypes',\n description: [\n 'Sets the orientation of the bars.',\n 'With *v* (*h*), the value of the each bar spans',\n 'along the vertical (horizontal).'\n ].join(' ')\n },\n\n base: {\n valType: 'any',\n dflt: null,\n arrayOk: true,\n editType: 'calc',\n description: [\n 'Sets where the bar base is drawn (in position axis units).',\n 'In *stack* or *relative* barmode,',\n 'traces that set *base* will be excluded',\n 'and drawn in *overlay* mode instead.'\n ].join(' ')\n },\n\n offset: {\n valType: 'number',\n dflt: null,\n arrayOk: true,\n editType: 'calc',\n description: [\n 'Shifts the position where the bar is drawn',\n '(in position axis units).',\n 'In *group* barmode,',\n 'traces that set *offset* will be excluded',\n 'and drawn in *overlay* mode instead.'\n ].join(' ')\n },\n\n width: {\n valType: 'number',\n dflt: null,\n min: 0,\n arrayOk: true,\n editType: 'calc',\n description: [\n 'Sets the bar width (in position axis units).'\n ].join(' ')\n },\n\n marker: marker,\n\n offsetgroup: scatterAttrs.offsetgroup,\n alignmentgroup: scatterAttrs.alignmentgroup,\n\n selected: {\n marker: {\n opacity: scatterAttrs.selected.marker.opacity,\n color: scatterAttrs.selected.marker.color,\n editType: 'style'\n },\n textfont: scatterAttrs.selected.textfont,\n editType: 'style'\n },\n unselected: {\n marker: {\n opacity: scatterAttrs.unselected.marker.opacity,\n color: scatterAttrs.unselected.marker.color,\n editType: 'style'\n },\n textfont: scatterAttrs.unselected.textfont,\n editType: 'style'\n },\n\n _deprecated: {\n bardir: {\n valType: 'enumerated',\n editType: 'calc',\n values: ['v', 'h'],\n description: 'Renamed to `orientation`.'\n }\n }\n};\n","'use strict';\n\nvar isNumeric = require('fast-isnumeric');\nvar tinycolor = require('tinycolor2');\nvar isArrayOrTypedArray = require('../../lib').isArrayOrTypedArray;\n\nexports.coerceString = function(attributeDefinition, value, defaultValue) {\n if(typeof value === 'string') {\n if(value || !attributeDefinition.noBlank) return value;\n } else if(typeof value === 'number' || value === true) {\n if(!attributeDefinition.strict) return String(value);\n }\n\n return (defaultValue !== undefined) ?\n defaultValue :\n attributeDefinition.dflt;\n};\n\nexports.coerceNumber = function(attributeDefinition, value, defaultValue) {\n if(isNumeric(value)) {\n value = +value;\n\n var min = attributeDefinition.min;\n var max = attributeDefinition.max;\n var isOutOfBounds = (min !== undefined && value < min) ||\n (max !== undefined && value > max);\n\n if(!isOutOfBounds) return value;\n }\n\n return (defaultValue !== undefined) ?\n defaultValue :\n attributeDefinition.dflt;\n};\n\nexports.coerceColor = function(attributeDefinition, value, defaultValue) {\n if(tinycolor(value).isValid()) return value;\n\n return (defaultValue !== undefined) ?\n defaultValue :\n attributeDefinition.dflt;\n};\n\nexports.coerceEnumerated = function(attributeDefinition, value, defaultValue) {\n if(attributeDefinition.coerceNumber) value = +value;\n\n if(attributeDefinition.values.indexOf(value) !== -1) return value;\n\n return (defaultValue !== undefined) ?\n defaultValue :\n attributeDefinition.dflt;\n};\n\nexports.getValue = function(arrayOrScalar, index) {\n var value;\n if(!isArrayOrTypedArray(arrayOrScalar)) value = arrayOrScalar;\n else if(index < arrayOrScalar.length) value = arrayOrScalar[index];\n return value;\n};\n\nexports.getLineWidth = function(trace, di) {\n var w =\n (0 < di.mlw) ? di.mlw :\n !isArrayOrTypedArray(trace.marker.line.width) ? trace.marker.line.width :\n 0;\n\n return w;\n};\n","'use strict';\n\nvar Lib = require('../../lib');\nvar isTypedArraySpec = require('../../lib/array').isTypedArraySpec;\n\nmodule.exports = {\n hasLines: function(trace) {\n return trace.visible && trace.mode &&\n trace.mode.indexOf('lines') !== -1;\n },\n\n hasMarkers: function(trace) {\n return trace.visible && (\n (trace.mode && trace.mode.indexOf('markers') !== -1) ||\n // until splom implements 'mode'\n trace.type === 'splom'\n );\n },\n\n hasText: function(trace) {\n return trace.visible && trace.mode &&\n trace.mode.indexOf('text') !== -1;\n },\n\n isBubble: function(trace) {\n var marker = trace.marker;\n return Lib.isPlainObject(marker) && (\n Lib.isArrayOrTypedArray(marker.size) ||\n isTypedArraySpec(marker.size)\n );\n }\n};\n","'use strict';\n\nvar Lib = require('../../lib');\nvar BADNUM = require('../../constants/numerical').BADNUM;\nvar alignPeriod = require('../../plots/cartesian/align_period');\n\nmodule.exports = function convertColumnData(trace, ax1, ax2, var1Name, var2Name, arrayVarNames) {\n var colLen = trace._length;\n var col1 = ax1.makeCalcdata(trace, var1Name);\n var col2 = ax2.makeCalcdata(trace, var2Name);\n col1 = alignPeriod(trace, ax1, var1Name, col1).vals;\n col2 = alignPeriod(trace, ax2, var2Name, col2).vals;\n\n var textCol = trace.text;\n var hasColumnText = (textCol !== undefined && Lib.isArray1D(textCol));\n var hoverTextCol = trace.hovertext;\n var hasColumnHoverText = (hoverTextCol !== undefined && Lib.isArray1D(hoverTextCol));\n var i, j;\n\n var col1dv = Lib.distinctVals(col1);\n var col1vals = col1dv.vals;\n var col2dv = Lib.distinctVals(col2);\n var col2vals = col2dv.vals;\n var newArrays = [];\n var text;\n var hovertext;\n\n var nI = col2vals.length;\n var nJ = col1vals.length;\n\n for(i = 0; i < arrayVarNames.length; i++) {\n newArrays[i] = Lib.init2dArray(nI, nJ);\n }\n\n if(hasColumnText) {\n text = Lib.init2dArray(nI, nJ);\n }\n if(hasColumnHoverText) {\n hovertext = Lib.init2dArray(nI, nJ);\n }\n\n var after2before = Lib.init2dArray(nI, nJ);\n\n for(i = 0; i < colLen; i++) {\n if(col1[i] !== BADNUM && col2[i] !== BADNUM) {\n var i1 = Lib.findBin(col1[i] + col1dv.minDiff / 2, col1vals);\n var i2 = Lib.findBin(col2[i] + col2dv.minDiff / 2, col2vals);\n\n for(j = 0; j < arrayVarNames.length; j++) {\n var arrayVarName = arrayVarNames[j];\n var arrayVar = trace[arrayVarName];\n var newArray = newArrays[j];\n newArray[i2][i1] = arrayVar[i];\n after2before[i2][i1] = i;\n }\n\n if(hasColumnText) text[i2][i1] = textCol[i];\n if(hasColumnHoverText) hovertext[i2][i1] = hoverTextCol[i];\n }\n }\n\n trace['_' + var1Name] = col1vals;\n trace['_' + var2Name] = col2vals;\n for(j = 0; j < arrayVarNames.length; j++) {\n trace['_' + arrayVarNames[j]] = newArrays[j];\n }\n if(hasColumnText) trace._text = text;\n if(hasColumnHoverText) trace._hovertext = hovertext;\n\n if(ax1 && ax1.type === 'category') {\n trace['_' + var1Name + 'CategoryMap'] = col1vals.map(function(v) { return ax1._categories[v];});\n }\n\n if(ax2 && ax2.type === 'category') {\n trace['_' + var2Name + 'CategoryMap'] = col2vals.map(function(v) { return ax2._categories[v];});\n }\n\n trace._after2before = after2before;\n};\n","'use strict';\n\nvar d3 = require('@plotly/d3');\nvar isNumeric = require('fast-isnumeric');\n\nvar Lib = require('../../lib');\nvar svgTextUtils = require('../../lib/svg_text_utils');\n\nvar Color = require('../../components/color');\nvar Drawing = require('../../components/drawing');\nvar Registry = require('../../registry');\nvar tickText = require('../../plots/cartesian/axes').tickText;\n\nvar uniformText = require('./uniform_text');\nvar recordMinTextSize = uniformText.recordMinTextSize;\nvar clearMinTextSize = uniformText.clearMinTextSize;\n\nvar style = require('./style');\nvar helpers = require('./helpers');\nvar constants = require('./constants');\nvar attributes = require('./attributes');\n\nvar attributeText = attributes.text;\nvar attributeTextPosition = attributes.textposition;\n\nvar appendArrayPointValue = require('../../components/fx/helpers').appendArrayPointValue;\n\nvar TEXTPAD = constants.TEXTPAD;\n\nfunction keyFunc(d) {return d.id;}\nfunction getKeyFunc(trace) {\n if(trace.ids) {\n return keyFunc;\n }\n}\n\n// Returns -1 if v < 0, 1 if v > 0, and 0 if v == 0\nfunction sign(v) {\n return (v > 0) - (v < 0);\n}\n\n// Returns 1 if a < b and -1 otherwise\n// (For the purposes of this module we don't care about the case where a == b)\nfunction dirSign(a, b) {\n return (a < b) ? 1 : -1;\n}\n\nfunction getXY(di, xa, ya, isHorizontal) {\n var s = [];\n var p = [];\n\n var sAxis = isHorizontal ? xa : ya;\n var pAxis = isHorizontal ? ya : xa;\n\n s[0] = sAxis.c2p(di.s0, true);\n p[0] = pAxis.c2p(di.p0, true);\n\n s[1] = sAxis.c2p(di.s1, true);\n p[1] = pAxis.c2p(di.p1, true);\n\n return isHorizontal ? [s, p] : [p, s];\n}\n\nfunction transition(selection, fullLayout, opts, makeOnCompleteCallback) {\n if(!fullLayout.uniformtext.mode && hasTransition(opts)) {\n var onComplete;\n if(makeOnCompleteCallback) {\n onComplete = makeOnCompleteCallback();\n }\n return selection\n .transition()\n .duration(opts.duration)\n .ease(opts.easing)\n .each('end', function() { onComplete && onComplete(); })\n .each('interrupt', function() { onComplete && onComplete(); });\n } else {\n return selection;\n }\n}\n\nfunction hasTransition(transitionOpts) {\n return transitionOpts && transitionOpts.duration > 0;\n}\n\nfunction plot(gd, plotinfo, cdModule, traceLayer, opts, makeOnCompleteCallback) {\n var xa = plotinfo.xaxis;\n var ya = plotinfo.yaxis;\n var fullLayout = gd._fullLayout;\n var isStatic = gd._context.staticPlot;\n\n if(!opts) {\n opts = {\n mode: fullLayout.barmode,\n norm: fullLayout.barmode,\n gap: fullLayout.bargap,\n groupgap: fullLayout.bargroupgap\n };\n\n // don't clear bar when this is called from waterfall or funnel\n clearMinTextSize('bar', fullLayout);\n }\n\n var bartraces = Lib.makeTraceGroups(traceLayer, cdModule, 'trace bars').each(function(cd) {\n var plotGroup = d3.select(this);\n var trace = cd[0].trace;\n var t = cd[0].t;\n var isWaterfall = (trace.type === 'waterfall');\n var isFunnel = (trace.type === 'funnel');\n var isHistogram = (trace.type === 'histogram');\n var isBar = (trace.type === 'bar');\n var shouldDisplayZeros = (isBar || isFunnel);\n var adjustPixel = 0;\n if(isWaterfall && trace.connector.visible && trace.connector.mode === 'between') {\n adjustPixel = trace.connector.line.width / 2;\n }\n\n var isHorizontal = (trace.orientation === 'h');\n var withTransition = hasTransition(opts);\n\n var pointGroup = Lib.ensureSingle(plotGroup, 'g', 'points');\n\n var keyFunc = getKeyFunc(trace);\n var bars = pointGroup.selectAll('g.point').data(Lib.identity, keyFunc);\n\n bars.enter().append('g')\n .classed('point', true);\n\n bars.exit().remove();\n\n bars.each(function(di, i) {\n var bar = d3.select(this);\n\n // now display the bar\n // clipped xf/yf (2nd arg true): non-positive\n // log values go off-screen by plotwidth\n // so you see them continue if you drag the plot\n var xy = getXY(di, xa, ya, isHorizontal);\n\n var x0 = xy[0][0];\n var x1 = xy[0][1];\n var y0 = xy[1][0];\n var y1 = xy[1][1];\n\n // empty bars\n var isBlank = (isHorizontal ? x1 - x0 : y1 - y0) === 0;\n\n // display zeros if line.width > 0\n if(isBlank && shouldDisplayZeros && helpers.getLineWidth(trace, di)) {\n isBlank = false;\n }\n\n // skip nulls\n if(!isBlank) {\n isBlank = (\n !isNumeric(x0) ||\n !isNumeric(x1) ||\n !isNumeric(y0) ||\n !isNumeric(y1)\n );\n }\n\n // record isBlank\n di.isBlank = isBlank;\n\n // for blank bars, ensure start and end positions are equal - important for smooth transitions\n if(isBlank) {\n if(isHorizontal) {\n x1 = x0;\n } else {\n y1 = y0;\n }\n }\n\n // in waterfall mode `between` we need to adjust bar end points to match the connector width\n if(adjustPixel && !isBlank) {\n if(isHorizontal) {\n x0 -= dirSign(x0, x1) * adjustPixel;\n x1 += dirSign(x0, x1) * adjustPixel;\n } else {\n y0 -= dirSign(y0, y1) * adjustPixel;\n y1 += dirSign(y0, y1) * adjustPixel;\n }\n }\n\n var lw;\n var mc;\n\n if(trace.type === 'waterfall') {\n if(!isBlank) {\n var cont = trace[di.dir].marker;\n lw = cont.line.width;\n mc = cont.color;\n }\n } else {\n lw = helpers.getLineWidth(trace, di);\n mc = di.mc || trace.marker.color;\n }\n\n function roundWithLine(v) {\n var offset = d3.round((lw / 2) % 1, 2);\n\n // if there are explicit gaps, don't round,\n // it can make the gaps look crappy\n return (opts.gap === 0 && opts.groupgap === 0) ?\n d3.round(Math.round(v) - offset, 2) : v;\n }\n\n function expandToVisible(v, vc, hideZeroSpan) {\n if(hideZeroSpan && v === vc) {\n // should not expand zero span bars\n // when start and end positions are identical\n // i.e. for vertical when y0 === y1\n // and for horizontal when x0 === x1\n return v;\n }\n\n // if it's not in danger of disappearing entirely,\n // round more precisely\n return Math.abs(v - vc) >= 2 ? roundWithLine(v) :\n // but if it's very thin, expand it so it's\n // necessarily visible, even if it might overlap\n // its neighbor\n (v > vc ? Math.ceil(v) : Math.floor(v));\n }\n\n var op = Color.opacity(mc);\n var fixpx = (op < 1 || lw > 0.01) ? roundWithLine : expandToVisible;\n if(!gd._context.staticPlot) {\n // if bars are not fully opaque or they have a line\n // around them, round to integer pixels, mainly for\n // safari so we prevent overlaps from its expansive\n // pixelation. if the bars ARE fully opaque and have\n // no line, expand to a full pixel to make sure we\n // can see them\n x0 = fixpx(x0, x1, isHorizontal);\n x1 = fixpx(x1, x0, isHorizontal);\n y0 = fixpx(y0, y1, !isHorizontal);\n y1 = fixpx(y1, y0, !isHorizontal);\n }\n\n // Function to convert from size axis values to pixels\n var c2p = isHorizontal ? xa.c2p : ya.c2p;\n\n // Decide whether to use upper or lower bound of current bar stack\n // as reference point for rounding\n var outerBound;\n if(di.s0 > 0) {\n outerBound = di._sMax;\n } else if(di.s0 < 0) {\n outerBound = di._sMin;\n } else {\n outerBound = di.s1 > 0 ? di._sMax : di._sMin;\n }\n\n // Calculate corner radius of bar in pixels\n function calcCornerRadius(crValue, crForm) {\n if(!crValue) return 0;\n\n var barWidth = isHorizontal ? Math.abs(y1 - y0) : Math.abs(x1 - x0);\n var barLength = isHorizontal ? Math.abs(x1 - x0) : Math.abs(y1 - y0);\n var stackedBarTotalLength = fixpx(Math.abs(c2p(outerBound, true) - c2p(0, true)));\n var maxRadius = di.hasB ? Math.min(barWidth / 2, barLength / 2) : Math.min(barWidth / 2, stackedBarTotalLength);\n var crPx;\n\n if(crForm === '%') {\n // If radius is given as a % string, convert to number of pixels\n var crPercent = Math.min(50, crValue);\n crPx = barWidth * (crPercent / 100);\n } else {\n // Otherwise, it's already a number of pixels, use the given value\n crPx = crValue;\n }\n return fixpx(Math.max(Math.min(crPx, maxRadius), 0));\n }\n // Exclude anything which is not explicitly a bar or histogram chart from rounding\n var r = (isBar || isHistogram) ? calcCornerRadius(t.cornerradiusvalue, t.cornerradiusform) : 0;\n // Construct path string for bar\n var path, h;\n // Default rectangular path (used if no rounding)\n var rectanglePath = 'M' + x0 + ',' + y0 + 'V' + y1 + 'H' + x1 + 'V' + y0 + 'Z';\n var overhead = 0;\n if(r && di.s) {\n // Bar has cornerradius, and nonzero size\n // Check amount of 'overhead' (bars stacked above this one)\n // to see whether we need to round or not\n var refPoint = sign(di.s0) === 0 || sign(di.s) === sign(di.s0) ? di.s1 : di.s0;\n overhead = fixpx(!di.hasB ? Math.abs(c2p(outerBound, true) - c2p(refPoint, true)) : 0);\n if(overhead < r) {\n // Calculate parameters for rounded corners\n var xdir = dirSign(x0, x1);\n var ydir = dirSign(y0, y1);\n // Sweep direction for rounded corner arcs\n var cornersweep = (xdir === -ydir) ? 1 : 0;\n if(isHorizontal) {\n // Horizontal bars\n if(di.hasB) {\n // Floating base: Round 1st & 2nd, and 3rd & 4th corners\n path = 'M' + (x0 + r * xdir) + ',' + y0 +\n 'A ' + r + ',' + r + ' 0 0 ' + cornersweep + ' ' + x0 + ',' + (y0 + r * ydir) +\n 'V' + (y1 - r * ydir) +\n 'A ' + r + ',' + r + ' 0 0 ' + cornersweep + ' ' + (x0 + r * xdir) + ',' + y1 +\n 'H' + (x1 - r * xdir) +\n 'A ' + r + ',' + r + ' 0 0 ' + cornersweep + ' ' + x1 + ',' + (y1 - r * ydir) +\n 'V' + (y0 + r * ydir) +\n 'A ' + r + ',' + r + ' 0 0 ' + cornersweep + ' ' + (x1 - r * xdir) + ',' + y0 +\n 'Z';\n } else {\n // Base on axis: Round 3rd and 4th corners\n\n // Helper variables to help with extending rounding down to lower bars\n h = Math.abs(x1 - x0) + overhead;\n var dy1 = (h < r) ? r - Math.sqrt(h * (2 * r - h)) : 0;\n var dy2 = (overhead > 0) ? Math.sqrt(overhead * (2 * r - overhead)) : 0;\n var xminfunc = xdir > 0 ? Math.max : Math.min;\n\n path = 'M' + x0 + ',' + y0 +\n 'V' + (y1 - dy1 * ydir) +\n 'H' + xminfunc(x1 - (r - overhead) * xdir, x0) +\n 'A ' + r + ',' + r + ' 0 0 ' + cornersweep + ' ' + x1 + ',' + (y1 - r * ydir - dy2) +\n 'V' + (y0 + r * ydir + dy2) +\n 'A ' + r + ',' + r + ' 0 0 ' + cornersweep + ' ' + xminfunc(x1 - (r - overhead) * xdir, x0) + ',' + (y0 + dy1 * ydir) +\n 'Z';\n }\n } else {\n // Vertical bars\n if(di.hasB) {\n // Floating base: Round 1st & 4th, and 2nd & 3rd corners\n path = 'M' + (x0 + r * xdir) + ',' + y0 +\n 'A ' + r + ',' + r + ' 0 0 ' + cornersweep + ' ' + x0 + ',' + (y0 + r * ydir) +\n 'V' + (y1 - r * ydir) +\n 'A ' + r + ',' + r + ' 0 0 ' + cornersweep + ' ' + (x0 + r * xdir) + ',' + y1 +\n 'H' + (x1 - r * xdir) +\n 'A ' + r + ',' + r + ' 0 0 ' + cornersweep + ' ' + x1 + ',' + (y1 - r * ydir) +\n 'V' + (y0 + r * ydir) +\n 'A ' + r + ',' + r + ' 0 0 ' + cornersweep + ' ' + (x1 - r * xdir) + ',' + y0 +\n 'Z';\n } else {\n // Base on axis: Round 2nd and 3rd corners\n\n // Helper variables to help with extending rounding down to lower bars\n h = Math.abs(y1 - y0) + overhead;\n var dx1 = (h < r) ? r - Math.sqrt(h * (2 * r - h)) : 0;\n var dx2 = (overhead > 0) ? Math.sqrt(overhead * (2 * r - overhead)) : 0;\n var yminfunc = ydir > 0 ? Math.max : Math.min;\n\n path = 'M' + (x0 + dx1 * xdir) + ',' + y0 +\n 'V' + yminfunc(y1 - (r - overhead) * ydir, y0) +\n 'A ' + r + ',' + r + ' 0 0 ' + cornersweep + ' ' + (x0 + r * xdir - dx2) + ',' + y1 +\n 'H' + (x1 - r * xdir + dx2) +\n 'A ' + r + ',' + r + ' 0 0 ' + cornersweep + ' ' + (x1 - dx1 * xdir) + ',' + yminfunc(y1 - (r - overhead) * ydir, y0) +\n 'V' + y0 + 'Z';\n }\n }\n } else {\n // There is a cornerradius, but bar is too far down the stack to be rounded; just draw a rectangle\n path = rectanglePath;\n }\n } else {\n // No cornerradius, just draw a rectangle\n path = rectanglePath;\n }\n\n var sel = transition(Lib.ensureSingle(bar, 'path'), fullLayout, opts, makeOnCompleteCallback);\n sel\n .style('vector-effect', isStatic ? 'none' : 'non-scaling-stroke')\n .attr('d', (isNaN((x1 - x0) * (y1 - y0)) || (isBlank && gd._context.staticPlot)) ? 'M0,0Z' : path)\n .call(Drawing.setClipUrl, plotinfo.layerClipId, gd);\n\n if(!fullLayout.uniformtext.mode && withTransition) {\n var styleFns = Drawing.makePointStyleFns(trace);\n Drawing.singlePointStyle(di, sel, trace, styleFns, gd);\n }\n\n appendBarText(gd, plotinfo, bar, cd, i, x0, x1, y0, y1, r, overhead, opts, makeOnCompleteCallback);\n\n if(plotinfo.layerClipId) {\n Drawing.hideOutsideRangePoint(di, bar.select('text'), xa, ya, trace.xcalendar, trace.ycalendar);\n }\n });\n\n // lastly, clip points groups of `cliponaxis !== false` traces\n // on `plotinfo._hasClipOnAxisFalse === true` subplots\n var hasClipOnAxisFalse = trace.cliponaxis === false;\n Drawing.setClipUrl(plotGroup, hasClipOnAxisFalse ? null : plotinfo.layerClipId, gd);\n });\n\n // error bars are on the top\n Registry.getComponentMethod('errorbars', 'plot')(gd, bartraces, plotinfo, opts);\n}\n\nfunction appendBarText(gd, plotinfo, bar, cd, i, x0, x1, y0, y1, r, overhead, opts, makeOnCompleteCallback) {\n var xa = plotinfo.xaxis;\n var ya = plotinfo.yaxis;\n\n var fullLayout = gd._fullLayout;\n var textPosition;\n\n function appendTextNode(bar, text, font) {\n var textSelection = Lib.ensureSingle(bar, 'text')\n .text(text)\n .attr({\n class: 'bartext bartext-' + textPosition,\n 'text-anchor': 'middle',\n // prohibit tex interpretation until we can handle\n // tex and regular text together\n 'data-notex': 1\n })\n .call(Drawing.font, font)\n .call(svgTextUtils.convertToTspans, gd);\n\n return textSelection;\n }\n\n // get trace attributes\n var trace = cd[0].trace;\n var isHorizontal = (trace.orientation === 'h');\n\n var text = getText(fullLayout, cd, i, xa, ya);\n\n textPosition = getTextPosition(trace, i);\n\n // compute text position\n var inStackOrRelativeMode =\n opts.mode === 'stack' ||\n opts.mode === 'relative';\n\n var calcBar = cd[i];\n var isOutmostBar = !inStackOrRelativeMode || calcBar._outmost;\n var hasB = calcBar.hasB;\n var barIsRounded = r && (r - overhead) > TEXTPAD;\n\n if(!text ||\n textPosition === 'none' ||\n ((calcBar.isBlank || x0 === x1 || y0 === y1) && (\n textPosition === 'auto' ||\n textPosition === 'inside'))) {\n bar.select('text').remove();\n return;\n }\n\n var layoutFont = fullLayout.font;\n var barColor = style.getBarColor(cd[i], trace);\n var insideTextFont = style.getInsideTextFont(trace, i, layoutFont, barColor);\n var outsideTextFont = style.getOutsideTextFont(trace, i, layoutFont);\n var insidetextanchor = trace.insidetextanchor || 'end';\n\n // Special case: don't use the c2p(v, true) value on log size axes,\n // so that we can get correctly inside text scaling\n var di = bar.datum();\n if(isHorizontal) {\n if(xa.type === 'log' && di.s0 <= 0) {\n if(xa.range[0] < xa.range[1]) {\n x0 = 0;\n } else {\n x0 = xa._length;\n }\n }\n } else {\n if(ya.type === 'log' && di.s0 <= 0) {\n if(ya.range[0] < ya.range[1]) {\n y0 = ya._length;\n } else {\n y0 = 0;\n }\n }\n }\n\n // Compute width and height of bar\n var lx = Math.abs(x1 - x0);\n var ly = Math.abs(y1 - y0);\n\n // padding excluded\n var barWidth = lx - 2 * TEXTPAD;\n var barHeight = ly - 2 * TEXTPAD;\n\n var textSelection;\n\n var textBB;\n var textWidth;\n var textHeight;\n var font;\n\n if(textPosition === 'outside') {\n if(!isOutmostBar && !calcBar.hasB) textPosition = 'inside';\n }\n\n if(textPosition === 'auto') {\n if(isOutmostBar) {\n // draw text using insideTextFont and check if it fits inside bar\n textPosition = 'inside';\n\n font = Lib.ensureUniformFontSize(gd, insideTextFont);\n\n textSelection = appendTextNode(bar, text, font);\n\n textBB = Drawing.bBox(textSelection.node());\n textWidth = textBB.width;\n textHeight = textBB.height;\n\n var textHasSize = (textWidth > 0 && textHeight > 0);\n\n var fitsInside;\n if(barIsRounded) {\n // If bar is rounded, check if text fits between rounded corners\n if(hasB) {\n fitsInside = (\n textfitsInsideBar(barWidth - 2 * r, barHeight, textWidth, textHeight, isHorizontal) ||\n textfitsInsideBar(barWidth, barHeight - 2 * r, textWidth, textHeight, isHorizontal)\n );\n } else if(isHorizontal) {\n fitsInside = (\n textfitsInsideBar(barWidth - (r - overhead), barHeight, textWidth, textHeight, isHorizontal) ||\n textfitsInsideBar(barWidth, barHeight - 2 * (r - overhead), textWidth, textHeight, isHorizontal)\n );\n } else {\n fitsInside = (\n textfitsInsideBar(barWidth, barHeight - (r - overhead), textWidth, textHeight, isHorizontal) ||\n textfitsInsideBar(barWidth - 2 * (r - overhead), barHeight, textWidth, textHeight, isHorizontal)\n );\n }\n } else {\n fitsInside = textfitsInsideBar(barWidth, barHeight, textWidth, textHeight, isHorizontal);\n }\n\n if(textHasSize && fitsInside) {\n textPosition = 'inside';\n } else {\n textPosition = 'outside';\n textSelection.remove();\n textSelection = null;\n }\n } else {\n textPosition = 'inside';\n }\n }\n\n if(!textSelection) {\n font = Lib.ensureUniformFontSize(gd, (textPosition === 'outside') ? outsideTextFont : insideTextFont);\n\n textSelection = appendTextNode(bar, text, font);\n\n var currentTransform = textSelection.attr('transform');\n textSelection.attr('transform', '');\n textBB = Drawing.bBox(textSelection.node()),\n textWidth = textBB.width,\n textHeight = textBB.height;\n textSelection.attr('transform', currentTransform);\n\n if(textWidth <= 0 || textHeight <= 0) {\n textSelection.remove();\n return;\n }\n }\n\n var angle = trace.textangle;\n\n // compute text transform\n var transform, constrained;\n if(textPosition === 'outside') {\n constrained =\n trace.constraintext === 'both' ||\n trace.constraintext === 'outside';\n\n transform = toMoveOutsideBar(x0, x1, y0, y1, textBB, {\n isHorizontal: isHorizontal,\n constrained: constrained,\n angle: angle\n });\n } else {\n constrained =\n trace.constraintext === 'both' ||\n trace.constraintext === 'inside';\n\n transform = toMoveInsideBar(x0, x1, y0, y1, textBB, {\n isHorizontal: isHorizontal,\n constrained: constrained,\n angle: angle,\n anchor: insidetextanchor,\n hasB: hasB,\n r: r,\n overhead: overhead,\n });\n }\n\n transform.fontSize = font.size;\n recordMinTextSize(trace.type === 'histogram' ? 'bar' : trace.type, transform, fullLayout);\n calcBar.transform = transform;\n\n var s = transition(textSelection, fullLayout, opts, makeOnCompleteCallback);\n Lib.setTransormAndDisplay(s, transform);\n}\n\nfunction textfitsInsideBar(barWidth, barHeight, textWidth, textHeight, isHorizontal) {\n if(barWidth < 0 || barHeight < 0) return false;\n var fitsInside = (textWidth <= barWidth && textHeight <= barHeight);\n var fitsInsideIfRotated = (textWidth <= barHeight && textHeight <= barWidth);\n var fitsInsideIfShrunk = (isHorizontal) ?\n (barWidth >= textWidth * (barHeight / textHeight)) :\n (barHeight >= textHeight * (barWidth / textWidth));\n return fitsInside || fitsInsideIfRotated || fitsInsideIfShrunk;\n}\n\nfunction getRotateFromAngle(angle) {\n return (angle === 'auto') ? 0 : angle;\n}\n\nfunction getRotatedTextSize(textBB, rotate) {\n var a = Math.PI / 180 * rotate;\n var absSin = Math.abs(Math.sin(a));\n var absCos = Math.abs(Math.cos(a));\n\n return {\n x: textBB.width * absCos + textBB.height * absSin,\n y: textBB.width * absSin + textBB.height * absCos\n };\n}\n\nfunction toMoveInsideBar(x0, x1, y0, y1, textBB, opts) {\n var isHorizontal = !!opts.isHorizontal;\n var constrained = !!opts.constrained;\n var angle = opts.angle || 0;\n var anchor = opts.anchor;\n var isEnd = anchor === 'end';\n var isStart = anchor === 'start';\n var leftToRight = opts.leftToRight || 0; // left: -1, center: 0, right: 1\n var toRight = (leftToRight + 1) / 2;\n var toLeft = 1 - toRight;\n var hasB = opts.hasB;\n var r = opts.r;\n var overhead = opts.overhead;\n\n var textWidth = textBB.width;\n var textHeight = textBB.height;\n\n var lx = Math.abs(x1 - x0);\n var ly = Math.abs(y1 - y0);\n\n // compute remaining space\n var textpad = (\n lx > (2 * TEXTPAD) &&\n ly > (2 * TEXTPAD)\n ) ? TEXTPAD : 0;\n\n lx -= 2 * textpad;\n ly -= 2 * textpad;\n\n var rotate = getRotateFromAngle(angle);\n if((angle === 'auto') &&\n !(textWidth <= lx && textHeight <= ly) &&\n (textWidth > lx || textHeight > ly) && (\n !(textWidth > ly || textHeight > lx) ||\n ((textWidth < textHeight) !== (lx < ly))\n )) {\n rotate += 90;\n }\n\n var t = getRotatedTextSize(textBB, rotate);\n\n var scale, padForRounding;\n // Scale text for rounded bars\n if(r && (r - overhead) > TEXTPAD) {\n var scaleAndPad = scaleTextForRoundedBar(x0, x1, y0, y1, t, r, overhead, isHorizontal, hasB);\n scale = scaleAndPad.scale;\n padForRounding = scaleAndPad.pad;\n // Scale text for non-rounded bars\n } else {\n scale = 1;\n if(constrained) {\n scale = Math.min(\n 1,\n lx / t.x,\n ly / t.y\n );\n }\n padForRounding = 0;\n }\n\n // compute text and target positions\n var textX = (\n textBB.left * toLeft +\n textBB.right * toRight\n );\n var textY = (textBB.top + textBB.bottom) / 2;\n var targetX = (\n (x0 + TEXTPAD) * toLeft +\n (x1 - TEXTPAD) * toRight\n );\n var targetY = (y0 + y1) / 2;\n var anchorX = 0;\n var anchorY = 0;\n if(isStart || isEnd) {\n var extrapad = (isHorizontal ? t.x : t.y) / 2;\n\n if(r && (isEnd || hasB)) {\n textpad += padForRounding;\n }\n\n var dir = isHorizontal ? dirSign(x0, x1) : dirSign(y0, y1);\n\n if(isHorizontal) {\n if(isStart) {\n targetX = x0 + dir * textpad;\n anchorX = -dir * extrapad;\n } else {\n targetX = x1 - dir * textpad;\n anchorX = dir * extrapad;\n }\n } else {\n if(isStart) {\n targetY = y0 + dir * textpad;\n anchorY = -dir * extrapad;\n } else {\n targetY = y1 - dir * textpad;\n anchorY = dir * extrapad;\n }\n }\n }\n\n return {\n textX: textX,\n textY: textY,\n targetX: targetX,\n targetY: targetY,\n anchorX: anchorX,\n anchorY: anchorY,\n scale: scale,\n rotate: rotate\n };\n}\n\nfunction scaleTextForRoundedBar(x0, x1, y0, y1, t, r, overhead, isHorizontal, hasB) {\n var barWidth = Math.max(0, Math.abs(x1 - x0) - 2 * TEXTPAD);\n var barHeight = Math.max(0, Math.abs(y1 - y0) - 2 * TEXTPAD);\n var R = r - TEXTPAD;\n var clippedR = overhead ? R - Math.sqrt(R * R - (R - overhead) * (R - overhead)) : R;\n var rX = hasB ? R * 2 : (isHorizontal ? R - overhead : 2 * clippedR);\n var rY = hasB ? R * 2 : (isHorizontal ? 2 * clippedR : R - overhead);\n var a, b, c;\n var scale, pad;\n\n\n if(t.y / t.x >= barHeight / (barWidth - rX)) {\n // Case 1 (Tall text)\n scale = barHeight / t.y;\n } else if(t.y / t.x <= (barHeight - rY) / barWidth) {\n // Case 2 (Wide text)\n scale = barWidth / t.x;\n } else if(!hasB && isHorizontal) {\n // Case 3a (Quadratic case, two side corners are rounded)\n a = t.x * t.x + t.y * t.y / 4;\n b = -2 * t.x * (barWidth - R) - t.y * (barHeight / 2 - R);\n c = (barWidth - R) * (barWidth - R) + (barHeight / 2 - R) * (barHeight / 2 - R) - R * R;\n\n scale = (-b + Math.sqrt(b * b - 4 * a * c)) / (2 * a);\n } else if(!hasB) {\n // Case 3b (Quadratic case, two top/bottom corners are rounded)\n a = t.x * t.x / 4 + t.y * t.y;\n b = -t.x * (barWidth / 2 - R) - 2 * t.y * (barHeight - R);\n c = (barWidth / 2 - R) * (barWidth / 2 - R) + (barHeight - R) * (barHeight - R) - R * R;\n\n scale = (-b + Math.sqrt(b * b - 4 * a * c)) / (2 * a);\n } else {\n // Case 4 (Quadratic case, all four corners are rounded)\n a = (t.x * t.x + t.y * t.y) / 4;\n b = -t.x * (barWidth / 2 - R) - t.y * (barHeight / 2 - R);\n c = (barWidth / 2 - R) * (barWidth / 2 - R) + (barHeight / 2 - R) * (barHeight / 2 - R) - R * R;\n scale = (-b + Math.sqrt(b * b - 4 * a * c)) / (2 * a);\n }\n\n // Scale should not be larger than 1\n scale = Math.min(1, scale);\n\n if(isHorizontal) {\n pad = Math.max(0, R - Math.sqrt(Math.max(0, R * R - (R - (barHeight - t.y * scale) / 2) * (R - (barHeight - t.y * scale) / 2))) - overhead);\n } else {\n pad = Math.max(0, R - Math.sqrt(Math.max(0, R * R - (R - (barWidth - t.x * scale) / 2) * (R - (barWidth - t.x * scale) / 2))) - overhead);\n }\n\n return { scale: scale, pad: pad };\n}\n\nfunction toMoveOutsideBar(x0, x1, y0, y1, textBB, opts) {\n var isHorizontal = !!opts.isHorizontal;\n var constrained = !!opts.constrained;\n var angle = opts.angle || 0;\n\n var textWidth = textBB.width;\n var textHeight = textBB.height;\n var lx = Math.abs(x1 - x0);\n var ly = Math.abs(y1 - y0);\n\n var textpad;\n // Keep the padding so the text doesn't sit right against\n // the bars, but don't factor it into barWidth\n if(isHorizontal) {\n textpad = (ly > 2 * TEXTPAD) ? TEXTPAD : 0;\n } else {\n textpad = (lx > 2 * TEXTPAD) ? TEXTPAD : 0;\n }\n\n // compute rotate and scale\n var scale = 1;\n if(constrained) {\n scale = (isHorizontal) ?\n Math.min(1, ly / textHeight) :\n Math.min(1, lx / textWidth);\n }\n\n var rotate = getRotateFromAngle(angle);\n var t = getRotatedTextSize(textBB, rotate);\n\n // compute text and target positions\n var extrapad = (isHorizontal ? t.x : t.y) / 2;\n var textX = (textBB.left + textBB.right) / 2;\n var textY = (textBB.top + textBB.bottom) / 2;\n var targetX = (x0 + x1) / 2;\n var targetY = (y0 + y1) / 2;\n var anchorX = 0;\n var anchorY = 0;\n\n var dir = isHorizontal ? dirSign(x1, x0) : dirSign(y0, y1);\n if(isHorizontal) {\n targetX = x1 - dir * textpad;\n anchorX = dir * extrapad;\n } else {\n targetY = y1 + dir * textpad;\n anchorY = -dir * extrapad;\n }\n\n return {\n textX: textX,\n textY: textY,\n targetX: targetX,\n targetY: targetY,\n anchorX: anchorX,\n anchorY: anchorY,\n scale: scale,\n rotate: rotate\n };\n}\n\nfunction getText(fullLayout, cd, index, xa, ya) {\n var trace = cd[0].trace;\n var texttemplate = trace.texttemplate;\n\n var value;\n if(texttemplate) {\n value = calcTexttemplate(fullLayout, cd, index, xa, ya);\n } else if(trace.textinfo) {\n value = calcTextinfo(cd, index, xa, ya);\n } else {\n value = helpers.getValue(trace.text, index);\n }\n\n return helpers.coerceString(attributeText, value);\n}\n\nfunction getTextPosition(trace, index) {\n var value = helpers.getValue(trace.textposition, index);\n return helpers.coerceEnumerated(attributeTextPosition, value);\n}\n\nfunction calcTexttemplate(fullLayout, cd, index, xa, ya) {\n var trace = cd[0].trace;\n var texttemplate = Lib.castOption(trace, index, 'texttemplate');\n if(!texttemplate) return '';\n var isHistogram = (trace.type === 'histogram');\n var isWaterfall = (trace.type === 'waterfall');\n var isFunnel = (trace.type === 'funnel');\n var isHorizontal = trace.orientation === 'h';\n\n var pLetter, pAxis;\n var vLetter, vAxis;\n if(isHorizontal) {\n pLetter = 'y';\n pAxis = ya;\n vLetter = 'x';\n vAxis = xa;\n } else {\n pLetter = 'x';\n pAxis = xa;\n vLetter = 'y';\n vAxis = ya;\n }\n\n function formatLabel(u) {\n return tickText(pAxis, pAxis.c2l(u), true).text;\n }\n\n function formatNumber(v) {\n return tickText(vAxis, vAxis.c2l(v), true).text;\n }\n\n var cdi = cd[index];\n var obj = {};\n\n obj.label = cdi.p;\n obj.labelLabel = obj[pLetter + 'Label'] = formatLabel(cdi.p);\n\n var tx = Lib.castOption(trace, cdi.i, 'text');\n if(tx === 0 || tx) obj.text = tx;\n\n obj.value = cdi.s;\n obj.valueLabel = obj[vLetter + 'Label'] = formatNumber(cdi.s);\n\n var pt = {};\n appendArrayPointValue(pt, trace, cdi.i);\n\n if(isHistogram || pt.x === undefined) pt.x = isHorizontal ? obj.value : obj.label;\n if(isHistogram || pt.y === undefined) pt.y = isHorizontal ? obj.label : obj.value;\n if(isHistogram || pt.xLabel === undefined) pt.xLabel = isHorizontal ? obj.valueLabel : obj.labelLabel;\n if(isHistogram || pt.yLabel === undefined) pt.yLabel = isHorizontal ? obj.labelLabel : obj.valueLabel;\n\n if(isWaterfall) {\n obj.delta = +cdi.rawS || cdi.s;\n obj.deltaLabel = formatNumber(obj.delta);\n obj.final = cdi.v;\n obj.finalLabel = formatNumber(obj.final);\n obj.initial = obj.final - obj.delta;\n obj.initialLabel = formatNumber(obj.initial);\n }\n\n if(isFunnel) {\n obj.value = cdi.s;\n obj.valueLabel = formatNumber(obj.value);\n\n obj.percentInitial = cdi.begR;\n obj.percentInitialLabel = Lib.formatPercent(cdi.begR);\n obj.percentPrevious = cdi.difR;\n obj.percentPreviousLabel = Lib.formatPercent(cdi.difR);\n obj.percentTotal = cdi.sumR;\n obj.percenTotalLabel = Lib.formatPercent(cdi.sumR);\n }\n\n var customdata = Lib.castOption(trace, cdi.i, 'customdata');\n if(customdata) obj.customdata = customdata;\n return Lib.texttemplateString(texttemplate, obj, fullLayout._d3locale, pt, obj, trace._meta || {});\n}\n\nfunction calcTextinfo(cd, index, xa, ya) {\n var trace = cd[0].trace;\n var isHorizontal = (trace.orientation === 'h');\n var isWaterfall = (trace.type === 'waterfall');\n var isFunnel = (trace.type === 'funnel');\n\n function formatLabel(u) {\n var pAxis = isHorizontal ? ya : xa;\n return tickText(pAxis, u, true).text;\n }\n\n function formatNumber(v) {\n var sAxis = isHorizontal ? xa : ya;\n return tickText(sAxis, +v, true).text;\n }\n\n var textinfo = trace.textinfo;\n var cdi = cd[index];\n\n var parts = textinfo.split('+');\n var text = [];\n var tx;\n\n var hasFlag = function(flag) { return parts.indexOf(flag) !== -1; };\n\n if(hasFlag('label')) {\n text.push(formatLabel(cd[index].p));\n }\n\n if(hasFlag('text')) {\n tx = Lib.castOption(trace, cdi.i, 'text');\n if(tx === 0 || tx) text.push(tx);\n }\n\n if(isWaterfall) {\n var delta = +cdi.rawS || cdi.s;\n var final = cdi.v;\n var initial = final - delta;\n\n if(hasFlag('initial')) text.push(formatNumber(initial));\n if(hasFlag('delta')) text.push(formatNumber(delta));\n if(hasFlag('final')) text.push(formatNumber(final));\n }\n\n if(isFunnel) {\n if(hasFlag('value')) text.push(formatNumber(cdi.s));\n\n var nPercent = 0;\n if(hasFlag('percent initial')) nPercent++;\n if(hasFlag('percent previous')) nPercent++;\n if(hasFlag('percent total')) nPercent++;\n\n var hasMultiplePercents = nPercent > 1;\n\n if(hasFlag('percent initial')) {\n tx = Lib.formatPercent(cdi.begR);\n if(hasMultiplePercents) tx += ' of initial';\n text.push(tx);\n }\n if(hasFlag('percent previous')) {\n tx = Lib.formatPercent(cdi.difR);\n if(hasMultiplePercents) tx += ' of previous';\n text.push(tx);\n }\n if(hasFlag('percent total')) {\n tx = Lib.formatPercent(cdi.sumR);\n if(hasMultiplePercents) tx += ' of total';\n text.push(tx);\n }\n }\n\n return text.join('
');\n}\n\nmodule.exports = {\n plot: plot,\n toMoveInsideBar: toMoveInsideBar\n};\n","'use strict';\n\nvar Color = require('../../components/color');\nvar castOption = require('./helpers').castOption;\nvar fillOne = require('./fill_one');\n\nmodule.exports = function styleOne(s, pt, trace, gd) {\n var line = trace.marker.line;\n var lineColor = castOption(line.color, pt.pts) || Color.defaultLine;\n var lineWidth = castOption(line.width, pt.pts) || 0;\n\n s.call(fillOne, pt, trace, gd)\n .style('stroke-width', lineWidth)\n .call(Color.stroke, lineColor);\n};\n","'use strict';\n\nvar Lib = require('../../lib');\nvar Fx = require('../../components/fx');\nvar Registry = require('../../registry');\nvar getTraceColor = require('./get_trace_color');\nvar Color = require('../../components/color');\nvar fillText = Lib.fillText;\n\nmodule.exports = function hoverPoints(pointData, xval, yval, hovermode) {\n var cd = pointData.cd;\n var trace = cd[0].trace;\n var xa = pointData.xa;\n var ya = pointData.ya;\n var xpx = xa.c2p(xval);\n var ypx = ya.c2p(yval);\n var pt = [xpx, ypx];\n var hoveron = trace.hoveron || '';\n var minRad = (trace.mode.indexOf('markers') !== -1) ? 3 : 0.5;\n\n var xPeriod = !!trace.xperiodalignment;\n var yPeriod = !!trace.yperiodalignment;\n\n // look for points to hover on first, then take fills only if we\n // didn't find a point\n\n if(hoveron.indexOf('points') !== -1) {\n // dx and dy are used in compare modes - here we want to always\n // prioritize the closest data point, at least as long as markers are\n // the same size or nonexistent, but still try to prioritize small markers too.\n var dx = function(di) {\n if(xPeriod) {\n var x0 = xa.c2p(di.xStart);\n var x1 = xa.c2p(di.xEnd);\n\n return (\n xpx >= Math.min(x0, x1) &&\n xpx <= Math.max(x0, x1)\n ) ? 0 : Infinity;\n }\n\n var rad = Math.max(3, di.mrc || 0);\n var kink = 1 - 1 / rad;\n var dxRaw = Math.abs(xa.c2p(di.x) - xpx);\n return (dxRaw < rad) ? (kink * dxRaw / rad) : (dxRaw - rad + kink);\n };\n var dy = function(di) {\n if(yPeriod) {\n var y0 = ya.c2p(di.yStart);\n var y1 = ya.c2p(di.yEnd);\n\n return (\n ypx >= Math.min(y0, y1) &&\n ypx <= Math.max(y0, y1)\n ) ? 0 : Infinity;\n }\n\n var rad = Math.max(3, di.mrc || 0);\n var kink = 1 - 1 / rad;\n var dyRaw = Math.abs(ya.c2p(di.y) - ypx);\n return (dyRaw < rad) ? (kink * dyRaw / rad) : (dyRaw - rad + kink);\n };\n\n // scatter points: d.mrc is the calculated marker radius\n // adjust the distance so if you're inside the marker it\n // always will show up regardless of point size, but\n // prioritize smaller points\n var dxy = function(di) {\n var rad = Math.max(minRad, di.mrc || 0);\n var dx = xa.c2p(di.x) - xpx;\n var dy = ya.c2p(di.y) - ypx;\n return Math.max(Math.sqrt(dx * dx + dy * dy) - rad, 1 - minRad / rad);\n };\n var distfn = Fx.getDistanceFunction(hovermode, dx, dy, dxy);\n\n Fx.getClosest(cd, distfn, pointData);\n\n // skip the rest (for this trace) if we didn't find a close point\n if(pointData.index !== false) {\n // the closest data point\n var di = cd[pointData.index];\n var xc = xa.c2p(di.x, true);\n var yc = ya.c2p(di.y, true);\n var rad = di.mrc || 1;\n\n // now we're done using the whole `calcdata` array, replace the\n // index with the original index (in case of inserted point from\n // stacked area)\n pointData.index = di.i;\n\n var orientation = cd[0].t.orientation;\n // TODO: for scatter and bar, option to show (sub)totals and\n // raw data? Currently stacked and/or normalized bars just show\n // the normalized individual sizes, so that's what I'm doing here\n // for now.\n var sizeVal = orientation && (di.sNorm || di.s);\n var xLabelVal = (orientation === 'h') ? sizeVal : di.orig_x !== undefined ? di.orig_x : di.x;\n var yLabelVal = (orientation === 'v') ? sizeVal : di.orig_y !== undefined ? di.orig_y : di.y;\n\n Lib.extendFlat(pointData, {\n color: getTraceColor(trace, di),\n\n x0: xc - rad,\n x1: xc + rad,\n xLabelVal: xLabelVal,\n\n y0: yc - rad,\n y1: yc + rad,\n yLabelVal: yLabelVal,\n\n spikeDistance: dxy(di),\n hovertemplate: trace.hovertemplate\n });\n\n fillText(di, trace, pointData);\n Registry.getComponentMethod('errorbars', 'hoverInfo')(di, trace, pointData);\n\n return [pointData];\n }\n }\n\n function isHoverPointInFillElement(el) {\n // Uses SVGElement.isPointInFill to accurately determine wether\n // the hover point / cursor is contained in the fill, taking\n // curved or jagged edges into account, which the Polygon-based\n // approach does not.\n if(!el) {\n return false;\n }\n var svgElement = el.node();\n try {\n var domPoint = new DOMPoint(pt[0], pt[1]);\n return svgElement.isPointInFill(domPoint);\n } catch(TypeError) {\n var svgPoint = svgElement.ownerSVGElement.createSVGPoint();\n svgPoint.x = pt[0];\n svgPoint.y = pt[1];\n return svgElement.isPointInFill(svgPoint);\n }\n }\n\n function getHoverLabelPosition(polygons) {\n // Uses Polygon s to determine the left- and right-most x-coordinates\n // of the subshape of the fill that contains the hover point / cursor.\n // Doing this with the SVGElement directly is quite tricky, so this falls\n // back to the existing relatively simple code, accepting some small inaccuracies\n // of label positioning for curved/jagged edges.\n var i;\n var polygonsIn = [];\n var xmin = Infinity;\n var xmax = -Infinity;\n var ymin = Infinity;\n var ymax = -Infinity;\n var yPos;\n\n for(i = 0; i < polygons.length; i++) {\n var polygon = polygons[i];\n // This is not going to work right for curved or jagged edges, it will\n // act as though they're straight.\n if(polygon.contains(pt)) {\n polygonsIn.push(polygon);\n ymin = Math.min(ymin, polygon.ymin);\n ymax = Math.max(ymax, polygon.ymax);\n }\n }\n\n // The above found no polygon that contains the cursor, but we know that\n // the cursor must be inside the fill as determined by the SVGElement\n // (so we are probably close to a curved/jagged edge...).\n if(polygonsIn.length === 0) {\n return null;\n }\n\n // constrain ymin/max to the visible plot, so the label goes\n // at the middle of the piece you can see\n ymin = Math.max(ymin, 0);\n ymax = Math.min(ymax, ya._length);\n\n yPos = (ymin + ymax) / 2;\n\n // find the overall left-most and right-most points of the\n // polygon(s) we're inside at their combined vertical midpoint.\n // This is where we will draw the hover label.\n // Note that this might not be the vertical midpoint of the\n // whole trace, if it's disjoint.\n var j, pts, xAtYPos, x0, x1, y0, y1;\n for(i = 0; i < polygonsIn.length; i++) {\n pts = polygonsIn[i].pts;\n for(j = 1; j < pts.length; j++) {\n y0 = pts[j - 1][1];\n y1 = pts[j][1];\n if((y0 > yPos) !== (y1 >= yPos)) {\n x0 = pts[j - 1][0];\n x1 = pts[j][0];\n if(y1 - y0) {\n xAtYPos = x0 + (x1 - x0) * (yPos - y0) / (y1 - y0);\n xmin = Math.min(xmin, xAtYPos);\n xmax = Math.max(xmax, xAtYPos);\n }\n }\n }\n }\n\n // constrain xmin/max to the visible plot now too\n xmin = Math.max(xmin, 0);\n xmax = Math.min(xmax, xa._length);\n\n return {\n x0: xmin,\n x1: xmax,\n y0: yPos,\n y1: yPos,\n };\n }\n\n // even if hoveron is 'fills', only use it if we have a fill element too\n if(hoveron.indexOf('fills') !== -1 && trace._fillElement) {\n var inside = isHoverPointInFillElement(trace._fillElement) && !isHoverPointInFillElement(trace._fillExclusionElement);\n\n if(inside) {\n var hoverLabelCoords = getHoverLabelPosition(trace._polygons);\n\n // getHoverLabelPosition may return null if the cursor / hover point is not contained\n // in any of the trace's polygons, which can happen close to curved edges. in that\n // case we fall back to displaying the hover label at the cursor position.\n if(hoverLabelCoords === null) {\n hoverLabelCoords = {\n x0: pt[0],\n x1: pt[0],\n y0: pt[1],\n y1: pt[1]\n };\n }\n\n // get only fill or line color for the hover color\n var color = Color.defaultLine;\n if(Color.opacity(trace.fillcolor)) color = trace.fillcolor;\n else if(Color.opacity((trace.line || {}).color)) {\n color = trace.line.color;\n }\n\n Lib.extendFlat(pointData, {\n // never let a 2D override 1D type as closest point\n // also: no spikeDistance, it's not allowed for fills\n distance: pointData.maxHoverDistance,\n x0: hoverLabelCoords.x0,\n x1: hoverLabelCoords.x1,\n y0: hoverLabelCoords.y0,\n y1: hoverLabelCoords.y1,\n color: color,\n hovertemplate: false\n });\n\n delete pointData.index;\n\n if(trace.text && !Lib.isArrayOrTypedArray(trace.text)) {\n pointData.text = String(trace.text);\n } else pointData.text = trace.name;\n\n return [pointData];\n }\n }\n};\n","'use strict';\n\nmodule.exports = function selectPoints(searchInfo, selectionTester) {\n var cd = searchInfo.cd;\n var xa = searchInfo.xaxis;\n var ya = searchInfo.yaxis;\n var selection = [];\n var i, j;\n\n if(selectionTester === false) {\n for(i = 0; i < cd.length; i++) {\n for(j = 0; j < (cd[i].pts || []).length; j++) {\n // clear selection\n cd[i].pts[j].selected = 0;\n }\n }\n } else {\n for(i = 0; i < cd.length; i++) {\n for(j = 0; j < (cd[i].pts || []).length; j++) {\n var pt = cd[i].pts[j];\n var x = xa.c2p(pt.x);\n var y = ya.c2p(pt.y);\n\n if(selectionTester.contains([x, y], null, pt.i, searchInfo)) {\n selection.push({\n pointNumber: pt.i,\n x: xa.c2d(pt.x),\n y: ya.c2d(pt.y)\n });\n pt.selected = 1;\n } else {\n pt.selected = 0;\n }\n }\n }\n }\n\n return selection;\n};\n","'use strict';\n\n\n// common to 'scatter' and 'scatterternary'\nmodule.exports = function handleLineShapeDefaults(traceIn, traceOut, coerce) {\n var shape = coerce('line.shape');\n if(shape === 'spline') coerce('line.smoothing');\n};\n","'use strict';\n\nvar d3 = require('@plotly/d3');\n\nvar Registry = require('../../registry');\nvar Lib = require('../../lib');\nvar ensureSingle = Lib.ensureSingle;\nvar identity = Lib.identity;\nvar Drawing = require('../../components/drawing');\n\nvar subTypes = require('./subtypes');\nvar linePoints = require('./line_points');\nvar linkTraces = require('./link_traces');\nvar polygonTester = require('../../lib/polygon').tester;\n\nmodule.exports = function plot(gd, plotinfo, cdscatter, scatterLayer, transitionOpts, makeOnCompleteCallback) {\n var join, onComplete;\n\n // If transition config is provided, then it is only a partial replot and traces not\n // updated are removed.\n var isFullReplot = !transitionOpts;\n var hasTransition = !!transitionOpts && transitionOpts.duration > 0;\n\n // Link traces so the z-order of fill layers is correct\n var cdscatterSorted = linkTraces(gd, plotinfo, cdscatter);\n\n join = scatterLayer.selectAll('g.trace')\n .data(cdscatterSorted, function(d) { return d[0].trace.uid; });\n\n // Append new traces:\n join.enter().append('g')\n .attr('class', function(d) {\n return 'trace scatter trace' + d[0].trace.uid;\n })\n .style('stroke-miterlimit', 2);\n join.order();\n\n createFills(gd, join, plotinfo);\n\n if(hasTransition) {\n if(makeOnCompleteCallback) {\n // If it was passed a callback to register completion, make a callback. If\n // this is created, then it must be executed on completion, otherwise the\n // pos-transition redraw will not execute:\n onComplete = makeOnCompleteCallback();\n }\n\n var transition = d3.transition()\n .duration(transitionOpts.duration)\n .ease(transitionOpts.easing)\n .each('end', function() {\n onComplete && onComplete();\n })\n .each('interrupt', function() {\n onComplete && onComplete();\n });\n\n transition.each(function() {\n // Must run the selection again since otherwise enters/updates get grouped together\n // and these get executed out of order. Except we need them in order!\n scatterLayer.selectAll('g.trace').each(function(d, i) {\n plotOne(gd, i, plotinfo, d, cdscatterSorted, this, transitionOpts);\n });\n });\n } else {\n join.each(function(d, i) {\n plotOne(gd, i, plotinfo, d, cdscatterSorted, this, transitionOpts);\n });\n }\n\n if(isFullReplot) {\n join.exit().remove();\n }\n\n // remove paths that didn't get used\n scatterLayer.selectAll('path:not([d])').remove();\n};\n\nfunction createFills(gd, traceJoin, plotinfo) {\n traceJoin.each(function(d) {\n var fills = ensureSingle(d3.select(this), 'g', 'fills');\n Drawing.setClipUrl(fills, plotinfo.layerClipId, gd);\n\n var trace = d[0].trace;\n\n var fillData = [];\n if(trace._ownfill) fillData.push('_ownFill');\n if(trace._nexttrace) fillData.push('_nextFill');\n\n var fillJoin = fills.selectAll('g').data(fillData, identity);\n\n fillJoin.enter().append('g');\n\n fillJoin.exit()\n .each(function(d) { trace[d] = null; })\n .remove();\n\n fillJoin.order().each(function(d) {\n // make a path element inside the fill group, just so\n // we can give it its own data later on and the group can\n // keep its simple '_*Fill' data\n trace[d] = ensureSingle(d3.select(this), 'path', 'js-fill');\n });\n });\n}\n\nfunction plotOne(gd, idx, plotinfo, cdscatter, cdscatterAll, element, transitionOpts) {\n var isStatic = gd._context.staticPlot;\n var i;\n\n // Since this has been reorganized and we're executing this on individual traces,\n // we need to pass it the full list of cdscatter as well as this trace's index (idx)\n // since it does an internal n^2 loop over comparisons with other traces:\n selectMarkers(gd, idx, plotinfo, cdscatter, cdscatterAll);\n\n var hasTransition = !!transitionOpts && transitionOpts.duration > 0;\n\n function transition(selection) {\n return hasTransition ? selection.transition() : selection;\n }\n\n var xa = plotinfo.xaxis;\n var ya = plotinfo.yaxis;\n\n var trace = cdscatter[0].trace;\n var line = trace.line;\n var tr = d3.select(element);\n\n var errorBarGroup = ensureSingle(tr, 'g', 'errorbars');\n var lines = ensureSingle(tr, 'g', 'lines');\n var points = ensureSingle(tr, 'g', 'points');\n var text = ensureSingle(tr, 'g', 'text');\n\n // error bars are at the bottom\n Registry.getComponentMethod('errorbars', 'plot')(gd, errorBarGroup, plotinfo, transitionOpts);\n\n if(trace.visible !== true) return;\n\n transition(tr).style('opacity', trace.opacity);\n\n // BUILD LINES AND FILLS\n var ownFillEl3, tonext;\n var ownFillDir = trace.fill.charAt(trace.fill.length - 1);\n if(ownFillDir !== 'x' && ownFillDir !== 'y') ownFillDir = '';\n\n var fillAxisIndex, fillAxisZero;\n if(ownFillDir === 'y') {\n fillAxisIndex = 1;\n fillAxisZero = ya.c2p(0, true);\n } else if(ownFillDir === 'x') {\n fillAxisIndex = 0;\n fillAxisZero = xa.c2p(0, true);\n }\n\n // store node for tweaking by selectPoints\n cdscatter[0][plotinfo.isRangePlot ? 'nodeRangePlot3' : 'node3'] = tr;\n\n var prevRevpath = '';\n var prevPolygons = [];\n var prevtrace = trace._prevtrace;\n var prevFillsegments = null;\n var prevFillElement = null;\n\n if(prevtrace) {\n prevRevpath = prevtrace._prevRevpath || '';\n tonext = prevtrace._nextFill;\n prevPolygons = prevtrace._ownPolygons;\n prevFillsegments = prevtrace._fillsegments;\n prevFillElement = prevtrace._fillElement;\n }\n\n var thispath;\n var thisrevpath;\n // fullpath is all paths for this curve, joined together straight\n // across gaps, for filling\n var fullpath = '';\n // revpath is fullpath reversed, for fill-to-next\n var revpath = '';\n // functions for converting a point array to a path\n var pathfn, revpathbase, revpathfn;\n // variables used before and after the data join\n var pt0, lastSegment, pt1;\n\n // thisPolygons always contains only the polygons of this trace only\n // whereas trace._polygons may be extended to include those of the previous\n // trace as well for exclusion during hover detection\n var thisPolygons = [];\n trace._polygons = [];\n\n var fillsegments = [];\n\n // initialize line join data / method\n var segments = [];\n var makeUpdate = Lib.noop;\n\n ownFillEl3 = trace._ownFill;\n\n if(subTypes.hasLines(trace) || trace.fill !== 'none') {\n if(tonext) {\n // This tells .style which trace to use for fill information:\n tonext.datum(cdscatter);\n }\n\n if(['hv', 'vh', 'hvh', 'vhv'].indexOf(line.shape) !== -1) {\n pathfn = Drawing.steps(line.shape);\n revpathbase = Drawing.steps(\n line.shape.split('').reverse().join('')\n );\n } else if(line.shape === 'spline') {\n pathfn = revpathbase = function(pts) {\n var pLast = pts[pts.length - 1];\n if(pts.length > 1 && pts[0][0] === pLast[0] && pts[0][1] === pLast[1]) {\n // identical start and end points: treat it as a\n // closed curve so we don't get a kink\n return Drawing.smoothclosed(pts.slice(1), line.smoothing);\n } else {\n return Drawing.smoothopen(pts, line.smoothing);\n }\n };\n } else {\n pathfn = revpathbase = function(pts) {\n return 'M' + pts.join('L');\n };\n }\n\n revpathfn = function(pts) {\n // note: this is destructive (reverses pts in place) so can't use pts after this\n return revpathbase(pts.reverse());\n };\n\n segments = linePoints(cdscatter, {\n xaxis: xa,\n yaxis: ya,\n trace: trace,\n connectGaps: trace.connectgaps,\n baseTolerance: Math.max(line.width || 1, 3) / 4,\n shape: line.shape,\n backoff: line.backoff,\n simplify: line.simplify,\n fill: trace.fill\n });\n\n // since we already have the pixel segments here, use them to make\n // polygons for hover on fill; we first merge segments where the fill\n // is connected into \"fillsegments\"; the actual polygon construction\n // is deferred to later to distinguish between self and tonext/tozero fills.\n // TODO: can we skip this if hoveron!=fills? That would mean we\n // need to redraw when you change hoveron...\n fillsegments = new Array(segments.length);\n var fillsegmentCount = 0;\n for(i = 0; i < segments.length; i++) {\n var curpoints;\n var pts = segments[i];\n if(!curpoints || !ownFillDir) {\n curpoints = pts.slice();\n fillsegments[fillsegmentCount] = curpoints;\n fillsegmentCount++;\n } else {\n curpoints.push.apply(curpoints, pts);\n }\n }\n\n trace._fillElement = null;\n trace._fillExclusionElement = prevFillElement;\n\n trace._fillsegments = fillsegments.slice(0, fillsegmentCount);\n fillsegments = trace._fillsegments;\n\n if(segments.length) {\n pt0 = segments[0][0].slice();\n lastSegment = segments[segments.length - 1];\n pt1 = lastSegment[lastSegment.length - 1].slice();\n }\n\n makeUpdate = function(isEnter) {\n return function(pts) {\n thispath = pathfn(pts);\n thisrevpath = revpathfn(pts); // side-effect: reverses input\n // calculate SVG path over all segments for fills\n if(!fullpath) {\n fullpath = thispath;\n revpath = thisrevpath;\n } else if(ownFillDir) {\n // for fills with fill direction: ignore gaps\n fullpath += 'L' + thispath.substr(1);\n revpath = thisrevpath + ('L' + revpath.substr(1));\n } else {\n fullpath += 'Z' + thispath;\n revpath = thisrevpath + 'Z' + revpath;\n }\n\n // actual lines get drawn here, with gaps between segments if requested\n if(subTypes.hasLines(trace)) {\n var el = d3.select(this);\n\n // This makes the coloring work correctly:\n el.datum(cdscatter);\n\n if(isEnter) {\n transition(el.style('opacity', 0)\n .attr('d', thispath)\n .call(Drawing.lineGroupStyle))\n .style('opacity', 1);\n } else {\n var sel = transition(el);\n sel.attr('d', thispath);\n Drawing.singleLineStyle(cdscatter, sel);\n }\n }\n };\n };\n }\n\n var lineJoin = lines.selectAll('.js-line').data(segments);\n\n transition(lineJoin.exit())\n .style('opacity', 0)\n .remove();\n\n lineJoin.each(makeUpdate(false));\n\n lineJoin.enter().append('path')\n .classed('js-line', true)\n .style('vector-effect', isStatic ? 'none' : 'non-scaling-stroke')\n .call(Drawing.lineGroupStyle)\n .each(makeUpdate(true));\n\n Drawing.setClipUrl(lineJoin, plotinfo.layerClipId, gd);\n\n function clearFill(selection) {\n transition(selection).attr('d', 'M0,0Z');\n }\n\n // helper functions to create polygons for hoveron fill detection\n var makeSelfPolygons = function() {\n var polygons = new Array(fillsegments.length);\n for(i = 0; i < fillsegments.length; i++) {\n polygons[i] = polygonTester(fillsegments[i]);\n }\n return polygons;\n };\n\n var makePolygonsToPrevious = function(prevFillsegments) {\n var polygons, i;\n if(!prevFillsegments || prevFillsegments.length === 0) {\n // if there are no fill segments of a previous trace, stretch the\n // polygon to the relevant axis\n polygons = new Array(fillsegments.length);\n for(i = 0; i < fillsegments.length; i++) {\n var pt0 = fillsegments[i][0].slice();\n var pt1 = fillsegments[i][fillsegments[i].length - 1].slice();\n\n pt0[fillAxisIndex] = pt1[fillAxisIndex] = fillAxisZero;\n\n var zeropoints = [pt1, pt0];\n var polypoints = zeropoints.concat(fillsegments[i]);\n polygons[i] = polygonTester(polypoints);\n }\n } else {\n // if there are more than one previous fill segment, the\n // way that fills work is to \"self\" fill all but the last segments\n // of the previous and then fill from the new trace to the last\n // segment of the previous.\n polygons = new Array(prevFillsegments.length - 1 + fillsegments.length);\n for(i = 0; i < prevFillsegments.length - 1; i++) {\n polygons[i] = polygonTester(prevFillsegments[i]);\n }\n\n var reversedPrevFillsegment = prevFillsegments[prevFillsegments.length - 1].slice();\n reversedPrevFillsegment.reverse();\n\n for(i = 0; i < fillsegments.length; i++) {\n polygons[prevFillsegments.length - 1 + i] = polygonTester(fillsegments[i].concat(reversedPrevFillsegment));\n }\n }\n return polygons;\n };\n\n // draw fills and create hover detection polygons\n if(segments.length) {\n if(ownFillEl3) {\n ownFillEl3.datum(cdscatter);\n if(pt0 && pt1) { // TODO(2023-12-10): this is always true if segments is not empty (?)\n if(ownFillDir) {\n pt0[fillAxisIndex] = pt1[fillAxisIndex] = fillAxisZero;\n\n // fill to zero: full trace path, plus extension of\n // the endpoints to the appropriate axis\n // For the sake of animations, wrap the points around so that\n // the points on the axes are the first two points. Otherwise\n // animations get a little crazy if the number of points changes.\n transition(ownFillEl3).attr('d', 'M' + pt1 + 'L' + pt0 + 'L' + fullpath.substr(1))\n .call(Drawing.singleFillStyle, gd);\n\n // create hover polygons that extend to the axis as well.\n thisPolygons = makePolygonsToPrevious(null); // polygon to axis\n } else {\n // fill to self: just join the path to itself\n transition(ownFillEl3).attr('d', fullpath + 'Z')\n .call(Drawing.singleFillStyle, gd);\n\n // and simply emit hover polygons for each segment\n thisPolygons = makeSelfPolygons();\n }\n }\n trace._polygons = thisPolygons;\n trace._fillElement = ownFillEl3;\n } else if(tonext) {\n if(trace.fill.substr(0, 6) === 'tonext' && fullpath && prevRevpath) {\n // fill to next: full trace path, plus the previous path reversed\n if(trace.fill === 'tonext') {\n // tonext: for use by concentric shapes, like manually constructed\n // contours, we just add the two paths closed on themselves.\n // This makes strange results if one path is *not* entirely\n // inside the other, but then that is a strange usage.\n transition(tonext).attr('d', fullpath + 'Z' + prevRevpath + 'Z')\n .call(Drawing.singleFillStyle, gd);\n\n // and simply emit hover polygons for each segment\n thisPolygons = makeSelfPolygons();\n\n // we add the polygons of the previous trace which causes hover\n // detection to ignore points contained in them.\n trace._polygons = thisPolygons.concat(prevPolygons); // this does not modify thisPolygons, on purpose\n } else {\n // tonextx/y: for now just connect endpoints with lines. This is\n // the correct behavior if the endpoints are at the same value of\n // y/x, but if they *aren't*, we should ideally do more complicated\n // things depending on whether the new endpoint projects onto the\n // existing curve or off the end of it\n transition(tonext).attr('d', fullpath + 'L' + prevRevpath.substr(1) + 'Z')\n .call(Drawing.singleFillStyle, gd);\n\n // create hover polygons that extend to the previous trace.\n thisPolygons = makePolygonsToPrevious(prevFillsegments);\n\n // in this case our polygons do not cover that of previous traces,\n // so must not include previous trace polygons for hover detection.\n trace._polygons = thisPolygons;\n }\n trace._fillElement = tonext;\n } else {\n clearFill(tonext);\n }\n }\n trace._prevRevpath = revpath;\n } else {\n if(ownFillEl3) clearFill(ownFillEl3);\n else if(tonext) clearFill(tonext);\n trace._prevRevpath = null;\n }\n trace._ownPolygons = thisPolygons;\n\n\n function visFilter(d) {\n return d.filter(function(v) { return !v.gap && v.vis; });\n }\n\n function visFilterWithGaps(d) {\n return d.filter(function(v) { return v.vis; });\n }\n\n function gapFilter(d) {\n return d.filter(function(v) { return !v.gap; });\n }\n\n function keyFunc(d) {\n return d.id;\n }\n\n // Returns a function if the trace is keyed, otherwise returns undefined\n function getKeyFunc(trace) {\n if(trace.ids) {\n return keyFunc;\n }\n }\n\n function hideFilter() {\n return false;\n }\n\n function makePoints(points, text, cdscatter) {\n var join, selection, hasNode;\n\n var trace = cdscatter[0].trace;\n var showMarkers = subTypes.hasMarkers(trace);\n var showText = subTypes.hasText(trace);\n\n var keyFunc = getKeyFunc(trace);\n var markerFilter = hideFilter;\n var textFilter = hideFilter;\n\n if(showMarkers || showText) {\n var showFilter = identity;\n // if we're stacking, \"infer zero\" gap mode gets markers in the\n // gap points - because we've inferred a zero there - but other\n // modes (currently \"interpolate\", later \"interrupt\" hopefully)\n // we don't draw generated markers\n var stackGroup = trace.stackgroup;\n var isInferZero = stackGroup && (\n gd._fullLayout._scatterStackOpts[xa._id + ya._id][stackGroup].stackgaps === 'infer zero');\n if(trace.marker.maxdisplayed || trace._needsCull) {\n showFilter = isInferZero ? visFilterWithGaps : visFilter;\n } else if(stackGroup && !isInferZero) {\n showFilter = gapFilter;\n }\n\n if(showMarkers) markerFilter = showFilter;\n if(showText) textFilter = showFilter;\n }\n\n // marker points\n\n selection = points.selectAll('path.point');\n\n join = selection.data(markerFilter, keyFunc);\n\n var enter = join.enter().append('path')\n .classed('point', true);\n\n if(hasTransition) {\n enter\n .call(Drawing.pointStyle, trace, gd)\n .call(Drawing.translatePoints, xa, ya)\n .style('opacity', 0)\n .transition()\n .style('opacity', 1);\n }\n\n join.order();\n\n var styleFns;\n if(showMarkers) {\n styleFns = Drawing.makePointStyleFns(trace);\n }\n\n join.each(function(d) {\n var el = d3.select(this);\n var sel = transition(el);\n hasNode = Drawing.translatePoint(d, sel, xa, ya);\n\n if(hasNode) {\n Drawing.singlePointStyle(d, sel, trace, styleFns, gd);\n\n if(plotinfo.layerClipId) {\n Drawing.hideOutsideRangePoint(d, sel, xa, ya, trace.xcalendar, trace.ycalendar);\n }\n\n if(trace.customdata) {\n el.classed('plotly-customdata', d.data !== null && d.data !== undefined);\n }\n } else {\n sel.remove();\n }\n });\n\n if(hasTransition) {\n join.exit().transition()\n .style('opacity', 0)\n .remove();\n } else {\n join.exit().remove();\n }\n\n // text points\n selection = text.selectAll('g');\n join = selection.data(textFilter, keyFunc);\n\n // each text needs to go in its own 'g' in case\n // it gets converted to mathjax\n join.enter().append('g').classed('textpoint', true).append('text');\n\n join.order();\n\n join.each(function(d) {\n var g = d3.select(this);\n var sel = transition(g.select('text'));\n hasNode = Drawing.translatePoint(d, sel, xa, ya);\n\n if(hasNode) {\n if(plotinfo.layerClipId) {\n Drawing.hideOutsideRangePoint(d, g, xa, ya, trace.xcalendar, trace.ycalendar);\n }\n } else {\n g.remove();\n }\n });\n\n join.selectAll('text')\n .call(Drawing.textPointStyle, trace, gd)\n .each(function(d) {\n // This just *has* to be totally custom because of SVG text positioning :(\n // It's obviously copied from translatePoint; we just can't use that\n var x = xa.c2p(d.x);\n var y = ya.c2p(d.y);\n\n d3.select(this).selectAll('tspan.line').each(function() {\n transition(d3.select(this)).attr({x: x, y: y});\n });\n });\n\n join.exit().remove();\n }\n\n points.datum(cdscatter);\n text.datum(cdscatter);\n makePoints(points, text, cdscatter);\n\n // lastly, clip points groups of `cliponaxis !== false` traces\n // on `plotinfo._hasClipOnAxisFalse === true` subplots\n var hasClipOnAxisFalse = trace.cliponaxis === false;\n var clipUrl = hasClipOnAxisFalse ? null : plotinfo.layerClipId;\n Drawing.setClipUrl(points, clipUrl, gd);\n Drawing.setClipUrl(text, clipUrl, gd);\n}\n\nfunction selectMarkers(gd, idx, plotinfo, cdscatter, cdscatterAll) {\n var xa = plotinfo.xaxis;\n var ya = plotinfo.yaxis;\n var xr = d3.extent(Lib.simpleMap(xa.range, xa.r2c));\n var yr = d3.extent(Lib.simpleMap(ya.range, ya.r2c));\n\n var trace = cdscatter[0].trace;\n if(!subTypes.hasMarkers(trace)) return;\n // if marker.maxdisplayed is used, select a maximum of\n // mnum markers to show, from the set that are in the viewport\n var mnum = trace.marker.maxdisplayed;\n\n // TODO: remove some as we get away from the viewport?\n if(mnum === 0) return;\n\n var cd = cdscatter.filter(function(v) {\n return v.x >= xr[0] && v.x <= xr[1] && v.y >= yr[0] && v.y <= yr[1];\n });\n var inc = Math.ceil(cd.length / mnum);\n var tnum = 0;\n cdscatterAll.forEach(function(cdj, j) {\n var tracei = cdj[0].trace;\n if(subTypes.hasMarkers(tracei) &&\n tracei.marker.maxdisplayed > 0 && j < idx) {\n tnum++;\n }\n });\n\n // if multiple traces use maxdisplayed, stagger which markers we\n // display this formula offsets successive traces by 1/3 of the\n // increment, adding an extra small amount after each triplet so\n // it's not quite periodic\n var i0 = Math.round(tnum * inc / 3 + Math.floor(tnum / 3) * inc / 7.1);\n\n // for error bars: save in cd which markers to show\n // so we don't have to repeat this\n cdscatter.forEach(function(v) { delete v.vis; });\n cd.forEach(function(v, i) {\n if(Math.round((i + i0) % inc) === 0) v.vis = true;\n });\n}\n","'use strict';\n\nvar d3 = require('@plotly/d3');\nvar Lib = require('../../lib');\n\nfunction resizeText(gd, gTrace, traceType) {\n var fullLayout = gd._fullLayout;\n var minSize = fullLayout['_' + traceType + 'Text_minsize'];\n if(minSize) {\n var shouldHide = fullLayout.uniformtext.mode === 'hide';\n\n var selector;\n switch(traceType) {\n case 'funnelarea' :\n case 'pie' :\n case 'sunburst' :\n selector = 'g.slice';\n break;\n case 'treemap' :\n case 'icicle' :\n selector = 'g.slice, g.pathbar';\n break;\n default :\n selector = 'g.points > g.point';\n }\n\n gTrace.selectAll(selector).each(function(d) {\n var transform = d.transform;\n if(transform) {\n transform.scale = (shouldHide && transform.hide) ? 0 : minSize / transform.fontSize;\n\n var el = d3.select(this).select('text');\n Lib.setTransormAndDisplay(el, transform);\n }\n });\n }\n}\n\nfunction recordMinTextSize(\n traceType, // in\n transform, // inout\n fullLayout // inout\n) {\n if(fullLayout.uniformtext.mode) {\n var minKey = getMinKey(traceType);\n var minSize = fullLayout.uniformtext.minsize;\n var size = transform.scale * transform.fontSize;\n\n transform.hide = size < minSize;\n\n fullLayout[minKey] = fullLayout[minKey] || Infinity;\n if(!transform.hide) {\n fullLayout[minKey] = Math.min(\n fullLayout[minKey],\n Math.max(size, minSize)\n );\n }\n }\n}\n\nfunction clearMinTextSize(\n traceType, // in\n fullLayout // inout\n) {\n var minKey = getMinKey(traceType);\n fullLayout[minKey] = undefined;\n}\n\nfunction getMinKey(traceType) {\n return '_' + traceType + 'Text_minsize';\n}\n\nmodule.exports = {\n recordMinTextSize: recordMinTextSize,\n clearMinTextSize: clearMinTextSize,\n resizeText: resizeText\n};\n","'use strict';\n\nvar isNumeric = require('fast-isnumeric');\n\n\nmodule.exports = {\n count: function(n, i, size) {\n size[n]++;\n return 1;\n },\n\n sum: function(n, i, size, counterData) {\n var v = counterData[i];\n if(isNumeric(v)) {\n v = Number(v);\n size[n] += v;\n return v;\n }\n return 0;\n },\n\n avg: function(n, i, size, counterData, counts) {\n var v = counterData[i];\n if(isNumeric(v)) {\n v = Number(v);\n size[n] += v;\n counts[n]++;\n }\n return 0;\n },\n\n min: function(n, i, size, counterData) {\n var v = counterData[i];\n if(isNumeric(v)) {\n v = Number(v);\n if(!isNumeric(size[n])) {\n size[n] = v;\n return v;\n } else if(size[n] > v) {\n var delta = v - size[n];\n size[n] = v;\n return delta;\n }\n }\n return 0;\n },\n\n max: function(n, i, size, counterData) {\n var v = counterData[i];\n if(isNumeric(v)) {\n v = Number(v);\n if(!isNumeric(size[n])) {\n size[n] = v;\n return v;\n } else if(size[n] < v) {\n var delta = v - size[n];\n size[n] = v;\n return delta;\n }\n }\n return 0;\n }\n};\n","'use strict';\n\nvar Loggers = require('./lib/loggers');\nvar noop = require('./lib/noop');\nvar pushUnique = require('./lib/push_unique');\nvar isPlainObject = require('./lib/is_plain_object');\nvar addStyleRule = require('./lib/dom').addStyleRule;\nvar ExtendModule = require('./lib/extend');\n\nvar basePlotAttributes = require('./plots/attributes');\nvar baseLayoutAttributes = require('./plots/layout_attributes');\n\nvar extendFlat = ExtendModule.extendFlat;\nvar extendDeepAll = ExtendModule.extendDeepAll;\n\nexports.modules = {};\nexports.allCategories = {};\nexports.allTypes = [];\nexports.subplotsRegistry = {};\nexports.transformsRegistry = {};\nexports.componentsRegistry = {};\nexports.layoutArrayContainers = [];\nexports.layoutArrayRegexes = [];\nexports.traceLayoutAttributes = {};\nexports.localeRegistry = {};\nexports.apiMethodRegistry = {};\nexports.collectableSubplotTypes = null;\n\n/**\n * Top-level register routine, exported as Plotly.register\n *\n * @param {object array or array of objects} _modules :\n * module object or list of module object to register.\n *\n * A valid `moduleType: 'trace'` module has fields:\n * - name {string} : the trace type\n * - categories {array} : categories associated with this trace type,\n * tested with Register.traceIs()\n * - meta {object} : meta info (mostly for plot-schema)\n *\n * A valid `moduleType: 'locale'` module has fields:\n * - name {string} : the locale name. Should be a 2-digit language string ('en', 'de')\n * optionally with a country/region code ('en-GB', 'de-CH'). If a country\n * code is used but the base language locale has not yet been supplied,\n * we will use this locale for the base as well.\n * - dictionary {object} : the dictionary mapping input strings to localized strings\n * generally the keys should be the literal input strings, but\n * if default translations are provided you can use any string as a key.\n * - format {object} : a `d3.locale` format specifier for this locale\n * any omitted keys we'll fall back on en-US.\n *\n * A valid `moduleType: 'transform'` module has fields:\n * - name {string} : transform name\n * - transform {function} : default-level transform function\n * - calcTransform {function} : calc-level transform function\n * - attributes {object} : transform attributes declarations\n * - supplyDefaults {function} : attributes default-supply function\n *\n * A valid `moduleType: 'component'` module has fields:\n * - name {string} : the component name, used it with Register.getComponentMethod()\n * to employ component method.\n *\n * A valid `moduleType: 'apiMethod'` module has fields:\n * - name {string} : the api method name.\n * - fn {function} : the api method called with Register.call();\n *\n */\nexports.register = function register(_modules) {\n exports.collectableSubplotTypes = null;\n\n if(!_modules) {\n throw new Error('No argument passed to Plotly.register.');\n } else if(_modules && !Array.isArray(_modules)) {\n _modules = [_modules];\n }\n\n for(var i = 0; i < _modules.length; i++) {\n var newModule = _modules[i];\n\n if(!newModule) {\n throw new Error('Invalid module was attempted to be registered!');\n }\n\n switch(newModule.moduleType) {\n case 'trace':\n registerTraceModule(newModule);\n break;\n case 'transform':\n registerTransformModule(newModule);\n break;\n case 'component':\n registerComponentModule(newModule);\n break;\n case 'locale':\n registerLocale(newModule);\n break;\n case 'apiMethod':\n var name = newModule.name;\n exports.apiMethodRegistry[name] = newModule.fn;\n break;\n default:\n throw new Error('Invalid module was attempted to be registered!');\n }\n }\n};\n\n/**\n * Get registered module using trace object or trace type\n *\n * @param {object||string} trace\n * trace object with prop 'type' or trace type as a string\n * @return {object}\n * module object corresponding to trace type\n */\nexports.getModule = function(trace) {\n var _module = exports.modules[getTraceType(trace)];\n if(!_module) return false;\n return _module._module;\n};\n\n/**\n * Determine if this trace type is in a given category\n *\n * @param {object||string} traceType\n * a trace (object) or trace type (string)\n * @param {string} category\n * category in question\n * @return {boolean}\n */\nexports.traceIs = function(traceType, category) {\n traceType = getTraceType(traceType);\n\n // old Chart Studio Cloud workspace hack, nothing to see here\n if(traceType === 'various') return false;\n\n var _module = exports.modules[traceType];\n\n if(!_module) {\n if(traceType) {\n Loggers.log('Unrecognized trace type ' + traceType + '.');\n }\n\n _module = exports.modules[basePlotAttributes.type.dflt];\n }\n\n return !!_module.categories[category];\n};\n\n/**\n * Determine if this trace has a transform of the given type and return\n * array of matching indices.\n *\n * @param {object} data\n * a trace object (member of data or fullData)\n * @param {string} type\n * type of trace to test\n * @return {array}\n * array of matching indices. If none found, returns []\n */\nexports.getTransformIndices = function(data, type) {\n var indices = [];\n var transforms = data.transforms || [];\n for(var i = 0; i < transforms.length; i++) {\n if(transforms[i].type === type) {\n indices.push(i);\n }\n }\n return indices;\n};\n\n/**\n * Determine if this trace has a transform of the given type\n *\n * @param {object} data\n * a trace object (member of data or fullData)\n * @param {string} type\n * type of trace to test\n * @return {boolean}\n */\nexports.hasTransform = function(data, type) {\n var transforms = data.transforms || [];\n for(var i = 0; i < transforms.length; i++) {\n if(transforms[i].type === type) {\n return true;\n }\n }\n return false;\n};\n\n/**\n * Retrieve component module method. Falls back on noop if either the\n * module or the method is missing, so the result can always be safely called\n *\n * @param {string} name\n * name of component (as declared in component module)\n * @param {string} method\n * name of component module method\n * @return {function}\n */\nexports.getComponentMethod = function(name, method) {\n var _module = exports.componentsRegistry[name];\n\n if(!_module) return noop;\n return _module[method] || noop;\n};\n\n/**\n * Call registered api method.\n *\n * @param {string} name : api method name\n * @param {...array} args : arguments passed to api method\n * @return {any} : returns api method output\n */\nexports.call = function() {\n var name = arguments[0];\n var args = [].slice.call(arguments, 1);\n return exports.apiMethodRegistry[name].apply(null, args);\n};\n\nfunction registerTraceModule(_module) {\n var thisType = _module.name;\n var categoriesIn = _module.categories;\n var meta = _module.meta;\n\n if(exports.modules[thisType]) {\n Loggers.log('Type ' + thisType + ' already registered');\n return;\n }\n\n if(!exports.subplotsRegistry[_module.basePlotModule.name]) {\n registerSubplot(_module.basePlotModule);\n }\n\n var categoryObj = {};\n for(var i = 0; i < categoriesIn.length; i++) {\n categoryObj[categoriesIn[i]] = true;\n exports.allCategories[categoriesIn[i]] = true;\n }\n\n exports.modules[thisType] = {\n _module: _module,\n categories: categoryObj\n };\n\n if(meta && Object.keys(meta).length) {\n exports.modules[thisType].meta = meta;\n }\n\n exports.allTypes.push(thisType);\n\n for(var componentName in exports.componentsRegistry) {\n mergeComponentAttrsToTrace(componentName, thisType);\n }\n\n /*\n * Collect all trace layout attributes in one place for easier lookup later\n * but don't merge them into the base schema as it would confuse the docs\n * (at least after https://github.com/plotly/documentation/issues/202 gets done!)\n */\n if(_module.layoutAttributes) {\n extendFlat(exports.traceLayoutAttributes, _module.layoutAttributes);\n }\n\n var basePlotModule = _module.basePlotModule;\n var bpmName = basePlotModule.name;\n\n // add mapbox-gl CSS here to avoid console warning on instantiation\n if(bpmName === 'mapbox') {\n var styleRules = basePlotModule.constants.styleRules;\n for(var k in styleRules) {\n addStyleRule('.js-plotly-plot .plotly .mapboxgl-' + k, styleRules[k]);\n }\n }\n\n // if `plotly-geo-assets.js` is not included,\n // add `PlotlyGeoAssets` global to stash references to all fetched\n // topojson / geojson data\n if((bpmName === 'geo' || bpmName === 'mapbox') &&\n (window.PlotlyGeoAssets === undefined)\n ) {\n window.PlotlyGeoAssets = {topojson: {}};\n }\n}\n\nfunction registerSubplot(_module) {\n var plotType = _module.name;\n\n if(exports.subplotsRegistry[plotType]) {\n Loggers.log('Plot type ' + plotType + ' already registered.');\n return;\n }\n\n // relayout array handling will look for component module methods with this\n // name and won't find them because this is a subplot module... but that\n // should be fine, it will just fall back on redrawing the plot.\n findArrayRegexps(_module);\n\n // not sure what's best for the 'cartesian' type at this point\n exports.subplotsRegistry[plotType] = _module;\n\n for(var componentName in exports.componentsRegistry) {\n mergeComponentAttrsToSubplot(componentName, _module.name);\n }\n}\n\nfunction registerComponentModule(_module) {\n if(typeof _module.name !== 'string') {\n throw new Error('Component module *name* must be a string.');\n }\n\n var name = _module.name;\n exports.componentsRegistry[name] = _module;\n\n if(_module.layoutAttributes) {\n if(_module.layoutAttributes._isLinkedToArray) {\n pushUnique(exports.layoutArrayContainers, name);\n }\n findArrayRegexps(_module);\n }\n\n for(var traceType in exports.modules) {\n mergeComponentAttrsToTrace(name, traceType);\n }\n\n for(var subplotName in exports.subplotsRegistry) {\n mergeComponentAttrsToSubplot(name, subplotName);\n }\n\n for(var transformType in exports.transformsRegistry) {\n mergeComponentAttrsToTransform(name, transformType);\n }\n\n if(_module.schema && _module.schema.layout) {\n extendDeepAll(baseLayoutAttributes, _module.schema.layout);\n }\n}\n\nfunction registerTransformModule(_module) {\n if(typeof _module.name !== 'string') {\n throw new Error('Transform module *name* must be a string.');\n }\n\n var prefix = 'Transform module ' + _module.name;\n var hasTransform = typeof _module.transform === 'function';\n var hasCalcTransform = typeof _module.calcTransform === 'function';\n\n if(!hasTransform && !hasCalcTransform) {\n throw new Error(prefix + ' is missing a *transform* or *calcTransform* method.');\n }\n if(hasTransform && hasCalcTransform) {\n Loggers.log([\n prefix + ' has both a *transform* and *calcTransform* methods.',\n 'Please note that all *transform* methods are executed',\n 'before all *calcTransform* methods.'\n ].join(' '));\n }\n if(!isPlainObject(_module.attributes)) {\n Loggers.log(prefix + ' registered without an *attributes* object.');\n }\n if(typeof _module.supplyDefaults !== 'function') {\n Loggers.log(prefix + ' registered without a *supplyDefaults* method.');\n }\n\n exports.transformsRegistry[_module.name] = _module;\n\n for(var componentName in exports.componentsRegistry) {\n mergeComponentAttrsToTransform(componentName, _module.name);\n }\n}\n\nfunction registerLocale(_module) {\n var locale = _module.name;\n var baseLocale = locale.split('-')[0];\n\n var newDict = _module.dictionary;\n var newFormat = _module.format;\n var hasDict = newDict && Object.keys(newDict).length;\n var hasFormat = newFormat && Object.keys(newFormat).length;\n\n var locales = exports.localeRegistry;\n\n var localeObj = locales[locale];\n if(!localeObj) locales[locale] = localeObj = {};\n\n // Should we use this dict for the base locale?\n // In case we're overwriting a previous dict for this locale, check\n // whether the base matches the full locale dict now. If we're not\n // overwriting, locales[locale] is undefined so this just checks if\n // baseLocale already had a dict or not.\n // Same logic for dateFormats\n if(baseLocale !== locale) {\n var baseLocaleObj = locales[baseLocale];\n if(!baseLocaleObj) locales[baseLocale] = baseLocaleObj = {};\n\n if(hasDict && baseLocaleObj.dictionary === localeObj.dictionary) {\n baseLocaleObj.dictionary = newDict;\n }\n if(hasFormat && baseLocaleObj.format === localeObj.format) {\n baseLocaleObj.format = newFormat;\n }\n }\n\n if(hasDict) localeObj.dictionary = newDict;\n if(hasFormat) localeObj.format = newFormat;\n}\n\nfunction findArrayRegexps(_module) {\n if(_module.layoutAttributes) {\n var arrayAttrRegexps = _module.layoutAttributes._arrayAttrRegexps;\n if(arrayAttrRegexps) {\n for(var i = 0; i < arrayAttrRegexps.length; i++) {\n pushUnique(exports.layoutArrayRegexes, arrayAttrRegexps[i]);\n }\n }\n }\n}\n\nfunction mergeComponentAttrsToTrace(componentName, traceType) {\n var componentSchema = exports.componentsRegistry[componentName].schema;\n if(!componentSchema || !componentSchema.traces) return;\n\n var traceAttrs = componentSchema.traces[traceType];\n if(traceAttrs) {\n extendDeepAll(exports.modules[traceType]._module.attributes, traceAttrs);\n }\n}\n\nfunction mergeComponentAttrsToTransform(componentName, transformType) {\n var componentSchema = exports.componentsRegistry[componentName].schema;\n if(!componentSchema || !componentSchema.transforms) return;\n\n var transformAttrs = componentSchema.transforms[transformType];\n if(transformAttrs) {\n extendDeepAll(exports.transformsRegistry[transformType].attributes, transformAttrs);\n }\n}\n\nfunction mergeComponentAttrsToSubplot(componentName, subplotName) {\n var componentSchema = exports.componentsRegistry[componentName].schema;\n if(!componentSchema || !componentSchema.subplots) return;\n\n var subplotModule = exports.subplotsRegistry[subplotName];\n var subplotAttrs = subplotModule.layoutAttributes;\n var subplotAttr = subplotModule.attr === 'subplot' ? subplotModule.name : subplotModule.attr;\n if(Array.isArray(subplotAttr)) subplotAttr = subplotAttr[0];\n\n var componentLayoutAttrs = componentSchema.subplots[subplotAttr];\n if(subplotAttrs && componentLayoutAttrs) {\n extendDeepAll(subplotAttrs, componentLayoutAttrs);\n }\n}\n\nfunction getTraceType(traceType) {\n if(typeof traceType === 'object') traceType = traceType.type;\n return traceType;\n}\n","'use strict';\n\nvar helpers = require('./helpers');\n\nvar Snapshot = {\n getDelay: helpers.getDelay,\n getRedrawFunc: helpers.getRedrawFunc,\n clone: require('./cloneplot'),\n toSVG: require('./tosvg'),\n svgToImg: require('./svgtoimg'),\n toImage: require('./toimage'),\n downloadImage: require('./download')\n};\n\nmodule.exports = Snapshot;\n","'use strict';\n\nvar Lib = require('../../lib');\n\nmodule.exports = function calcSelection(cd, trace) {\n if(Lib.isArrayOrTypedArray(trace.selectedpoints)) {\n Lib.tagSelected(cd, trace);\n }\n};\n","'use strict';\n\nvar Axes = require('../../plots/cartesian/axes');\n\nmodule.exports = function formatLabels(cdi, trace, fullLayout) {\n var labels = {};\n\n var mockGd = {_fullLayout: fullLayout};\n var xa = Axes.getFromTrace(mockGd, trace, 'x');\n var ya = Axes.getFromTrace(mockGd, trace, 'y');\n\n var x = cdi.orig_x;\n if(x === undefined) x = cdi.x;\n\n var y = cdi.orig_y;\n if(y === undefined) y = cdi.y;\n\n labels.xLabel = Axes.tickText(xa, xa.c2l(x), true).text;\n labels.yLabel = Axes.tickText(ya, ya.c2l(y), true).text;\n\n return labels;\n};\n","'use strict';\n\nmodule.exports = {\n // padding in pixels around text\n TEXTPAD: 3,\n // 'value' and 'label' are not really necessary for bar traces,\n // but they were made available to `texttemplate` (maybe by accident)\n // via tokens `%{value}` and `%{label}` starting in 1.50.0,\n // so let's include them in the event data also.\n eventDataKeys: ['value', 'label']\n};\n","'use strict';\n\nmodule.exports = {\n attributes: require('./attributes'),\n layoutAttributes: require('./layout_attributes'),\n supplyDefaults: require('./defaults').supplyDefaults,\n crossTraceDefaults: require('./defaults').crossTraceDefaults,\n supplyLayoutDefaults: require('./layout_defaults'),\n calc: require('./calc'),\n crossTraceCalc: require('./cross_trace_calc').crossTraceCalc,\n colorbar: require('../scatter/marker_colorbar'),\n arraysToCalcdata: require('./arrays_to_calcdata'),\n plot: require('./plot').plot,\n style: require('./style').style,\n styleOnSelect: require('./style').styleOnSelect,\n hoverPoints: require('./hover').hoverPoints,\n eventData: require('./event_data'),\n selectPoints: require('./select'),\n\n moduleType: 'trace',\n name: 'bar',\n basePlotModule: require('../../plots/cartesian'),\n categories: ['bar-like', 'cartesian', 'svg', 'bar', 'oriented', 'errorBarsOK', 'showLegend', 'zoomScale'],\n animatable: true,\n meta: {\n description: [\n 'The data visualized by the span of the bars is set in `y`',\n 'if `orientation` is set to *v* (the default)',\n 'and the labels are set in `x`.',\n 'By setting `orientation` to *h*, the roles are interchanged.'\n ].join(' ')\n }\n};\n","'use strict';\n\nvar Drawing = require('../../components/drawing');\nvar numConstants = require('../../constants/numerical');\nvar BADNUM = numConstants.BADNUM;\nvar LOG_CLIP = numConstants.LOG_CLIP;\nvar LOG_CLIP_PLUS = LOG_CLIP + 0.5;\nvar LOG_CLIP_MINUS = LOG_CLIP - 0.5;\nvar Lib = require('../../lib');\nvar segmentsIntersect = Lib.segmentsIntersect;\nvar constrain = Lib.constrain;\nvar constants = require('./constants');\n\n\nmodule.exports = function linePoints(d, opts) {\n var trace = opts.trace || {};\n var xa = opts.xaxis;\n var ya = opts.yaxis;\n var xLog = xa.type === 'log';\n var yLog = ya.type === 'log';\n var xLen = xa._length;\n var yLen = ya._length;\n var backoff = opts.backoff;\n var marker = trace.marker;\n var connectGaps = opts.connectGaps;\n var baseTolerance = opts.baseTolerance;\n var shape = opts.shape;\n var linear = shape === 'linear';\n var fill = trace.fill && trace.fill !== 'none';\n var segments = [];\n var minTolerance = constants.minTolerance;\n var len = d.length;\n var pts = new Array(len);\n var pti = 0;\n\n var i;\n\n // pt variables are pixel coordinates [x,y] of one point\n // these four are the outputs of clustering on a line\n var clusterStartPt, clusterEndPt, clusterHighPt, clusterLowPt;\n\n // \"this\" is the next point we're considering adding to the cluster\n var thisPt;\n\n // did we encounter the high point first, then a low point, or vice versa?\n var clusterHighFirst;\n\n // the first two points in the cluster determine its unit vector\n // so the second is always in the \"High\" direction\n var clusterUnitVector;\n\n // the pixel delta from clusterStartPt\n var thisVector;\n\n // val variables are (signed) pixel distances along the cluster vector\n var clusterRefDist, clusterHighVal, clusterLowVal, thisVal;\n\n // deviation variables are (signed) pixel distances normal to the cluster vector\n var clusterMinDeviation, clusterMaxDeviation, thisDeviation;\n\n // turn one calcdata point into pixel coordinates\n function getPt(index) {\n var di = d[index];\n if(!di) return false;\n var x = opts.linearized ? xa.l2p(di.x) : xa.c2p(di.x);\n var y = opts.linearized ? ya.l2p(di.y) : ya.c2p(di.y);\n\n // if non-positive log values, set them VERY far off-screen\n // so the line looks essentially straight from the previous point.\n if(x === BADNUM) {\n if(xLog) x = xa.c2p(di.x, true);\n if(x === BADNUM) return false;\n // If BOTH were bad log values, make the line follow a constant\n // exponent rather than a constant slope\n if(yLog && y === BADNUM) {\n x *= Math.abs(xa._m * yLen * (xa._m > 0 ? LOG_CLIP_PLUS : LOG_CLIP_MINUS) /\n (ya._m * xLen * (ya._m > 0 ? LOG_CLIP_PLUS : LOG_CLIP_MINUS)));\n }\n x *= 1000;\n }\n if(y === BADNUM) {\n if(yLog) y = ya.c2p(di.y, true);\n if(y === BADNUM) return false;\n y *= 1000;\n }\n return [x, y];\n }\n\n function crossesViewport(xFrac0, yFrac0, xFrac1, yFrac1) {\n var dx = xFrac1 - xFrac0;\n var dy = yFrac1 - yFrac0;\n var dx0 = 0.5 - xFrac0;\n var dy0 = 0.5 - yFrac0;\n var norm2 = dx * dx + dy * dy;\n var dot = dx * dx0 + dy * dy0;\n if(dot > 0 && dot < norm2) {\n var cross = dx0 * dy - dy0 * dx;\n if(cross * cross < norm2) return true;\n }\n }\n\n var latestXFrac, latestYFrac;\n // if we're off-screen, increase tolerance over baseTolerance\n function getTolerance(pt, nextPt) {\n var xFrac = pt[0] / xLen;\n var yFrac = pt[1] / yLen;\n var offScreenFraction = Math.max(0, -xFrac, xFrac - 1, -yFrac, yFrac - 1);\n if(offScreenFraction && (latestXFrac !== undefined) &&\n crossesViewport(xFrac, yFrac, latestXFrac, latestYFrac)\n ) {\n offScreenFraction = 0;\n }\n if(offScreenFraction && nextPt &&\n crossesViewport(xFrac, yFrac, nextPt[0] / xLen, nextPt[1] / yLen)\n ) {\n offScreenFraction = 0;\n }\n\n return (1 + constants.toleranceGrowth * offScreenFraction) * baseTolerance;\n }\n\n function ptDist(pt1, pt2) {\n var dx = pt1[0] - pt2[0];\n var dy = pt1[1] - pt2[1];\n return Math.sqrt(dx * dx + dy * dy);\n }\n\n // last bit of filtering: clip paths that are VERY far off-screen\n // so we don't get near the browser's hard limit (+/- 2^29 px in Chrome and FF)\n\n var maxScreensAway = constants.maxScreensAway;\n\n // find the intersections between the segment from pt1 to pt2\n // and the large rectangle maxScreensAway around the viewport\n // if one of pt1 and pt2 is inside and the other outside, there\n // will be only one intersection.\n // if both are outside there will be 0 or 2 intersections\n // (or 1 if it's right at a corner - we'll treat that like 0)\n // returns an array of intersection pts\n var xEdge0 = -xLen * maxScreensAway;\n var xEdge1 = xLen * (1 + maxScreensAway);\n var yEdge0 = -yLen * maxScreensAway;\n var yEdge1 = yLen * (1 + maxScreensAway);\n var edges = [\n [xEdge0, yEdge0, xEdge1, yEdge0],\n [xEdge1, yEdge0, xEdge1, yEdge1],\n [xEdge1, yEdge1, xEdge0, yEdge1],\n [xEdge0, yEdge1, xEdge0, yEdge0]\n ];\n var xEdge, yEdge, lastXEdge, lastYEdge, lastFarPt, edgePt;\n\n // for linear line shape, edge intersections should be linearly interpolated\n // spline uses this too, which isn't precisely correct but is actually pretty\n // good, because Catmull-Rom weights far-away points less in creating the curvature\n function getLinearEdgeIntersections(pt1, pt2) {\n var out = [];\n var ptCount = 0;\n for(var i = 0; i < 4; i++) {\n var edge = edges[i];\n var ptInt = segmentsIntersect(\n pt1[0], pt1[1], pt2[0], pt2[1],\n edge[0], edge[1], edge[2], edge[3]\n );\n if(ptInt && (!ptCount ||\n Math.abs(ptInt.x - out[0][0]) > 1 ||\n Math.abs(ptInt.y - out[0][1]) > 1\n )) {\n ptInt = [ptInt.x, ptInt.y];\n // if we have 2 intersections, make sure the closest one to pt1 comes first\n if(ptCount && ptDist(ptInt, pt1) < ptDist(out[0], pt1)) out.unshift(ptInt);\n else out.push(ptInt);\n ptCount++;\n }\n }\n return out;\n }\n\n function onlyConstrainedPoint(pt) {\n if(pt[0] < xEdge0 || pt[0] > xEdge1 || pt[1] < yEdge0 || pt[1] > yEdge1) {\n return [constrain(pt[0], xEdge0, xEdge1), constrain(pt[1], yEdge0, yEdge1)];\n }\n }\n\n function sameEdge(pt1, pt2) {\n if(pt1[0] === pt2[0] && (pt1[0] === xEdge0 || pt1[0] === xEdge1)) return true;\n if(pt1[1] === pt2[1] && (pt1[1] === yEdge0 || pt1[1] === yEdge1)) return true;\n }\n\n // for line shapes hv and vh, movement in the two dimensions is decoupled,\n // so all we need to do is constrain each dimension independently\n function getHVEdgeIntersections(pt1, pt2) {\n var out = [];\n var ptInt1 = onlyConstrainedPoint(pt1);\n var ptInt2 = onlyConstrainedPoint(pt2);\n if(ptInt1 && ptInt2 && sameEdge(ptInt1, ptInt2)) return out;\n\n if(ptInt1) out.push(ptInt1);\n if(ptInt2) out.push(ptInt2);\n return out;\n }\n\n // hvh and vhv we sometimes have to move one of the intersection points\n // out BEYOND the clipping rect, by a maximum of a factor of 2, so that\n // the midpoint line is drawn in the right place\n function getABAEdgeIntersections(dim, limit0, limit1) {\n return function(pt1, pt2) {\n var ptInt1 = onlyConstrainedPoint(pt1);\n var ptInt2 = onlyConstrainedPoint(pt2);\n\n var out = [];\n if(ptInt1 && ptInt2 && sameEdge(ptInt1, ptInt2)) return out;\n\n if(ptInt1) out.push(ptInt1);\n if(ptInt2) out.push(ptInt2);\n\n var midShift = 2 * Lib.constrain((pt1[dim] + pt2[dim]) / 2, limit0, limit1) -\n ((ptInt1 || pt1)[dim] + (ptInt2 || pt2)[dim]);\n if(midShift) {\n var ptToAlter;\n if(ptInt1 && ptInt2) {\n ptToAlter = (midShift > 0 === ptInt1[dim] > ptInt2[dim]) ? ptInt1 : ptInt2;\n } else ptToAlter = ptInt1 || ptInt2;\n\n ptToAlter[dim] += midShift;\n }\n\n return out;\n };\n }\n\n var getEdgeIntersections;\n if(shape === 'linear' || shape === 'spline') {\n getEdgeIntersections = getLinearEdgeIntersections;\n } else if(shape === 'hv' || shape === 'vh') {\n getEdgeIntersections = getHVEdgeIntersections;\n } else if(shape === 'hvh') getEdgeIntersections = getABAEdgeIntersections(0, xEdge0, xEdge1);\n else if(shape === 'vhv') getEdgeIntersections = getABAEdgeIntersections(1, yEdge0, yEdge1);\n\n // a segment pt1->pt2 entirely outside the nearby region:\n // find the corner it gets closest to touching\n function getClosestCorner(pt1, pt2) {\n var dx = pt2[0] - pt1[0];\n var m = (pt2[1] - pt1[1]) / dx;\n var b = (pt1[1] * pt2[0] - pt2[1] * pt1[0]) / dx;\n\n if(b > 0) return [m > 0 ? xEdge0 : xEdge1, yEdge1];\n else return [m > 0 ? xEdge1 : xEdge0, yEdge0];\n }\n\n function updateEdge(pt) {\n var x = pt[0];\n var y = pt[1];\n var xSame = x === pts[pti - 1][0];\n var ySame = y === pts[pti - 1][1];\n // duplicate point?\n if(xSame && ySame) return;\n if(pti > 1) {\n // backtracking along an edge?\n var xSame2 = x === pts[pti - 2][0];\n var ySame2 = y === pts[pti - 2][1];\n if(xSame && (x === xEdge0 || x === xEdge1) && xSame2) {\n if(ySame2) pti--; // backtracking exactly - drop prev pt and don't add\n else pts[pti - 1] = pt; // not exact: replace the prev pt\n } else if(ySame && (y === yEdge0 || y === yEdge1) && ySame2) {\n if(xSame2) pti--;\n else pts[pti - 1] = pt;\n } else pts[pti++] = pt;\n } else pts[pti++] = pt;\n }\n\n function updateEdgesForReentry(pt) {\n // if we're outside the nearby region and going back in,\n // we may need to loop around a corner point\n if(pts[pti - 1][0] !== pt[0] && pts[pti - 1][1] !== pt[1]) {\n updateEdge([lastXEdge, lastYEdge]);\n }\n updateEdge(pt);\n lastFarPt = null;\n lastXEdge = lastYEdge = 0;\n }\n\n var arrayMarker = Lib.isArrayOrTypedArray(marker);\n\n function addPt(pt) {\n if(pt && backoff) {\n pt.i = i;\n pt.d = d;\n pt.trace = trace;\n pt.marker = arrayMarker ? marker[pt.i] : marker;\n pt.backoff = backoff;\n }\n\n latestXFrac = pt[0] / xLen;\n latestYFrac = pt[1] / yLen;\n // Are we more than maxScreensAway off-screen any direction?\n // if so, clip to this box, but in such a way that on-screen\n // drawing is unchanged\n xEdge = (pt[0] < xEdge0) ? xEdge0 : (pt[0] > xEdge1) ? xEdge1 : 0;\n yEdge = (pt[1] < yEdge0) ? yEdge0 : (pt[1] > yEdge1) ? yEdge1 : 0;\n if(xEdge || yEdge) {\n if(!pti) {\n // to get fills right - if first point is far, push it toward the\n // screen in whichever direction(s) are far\n\n pts[pti++] = [xEdge || pt[0], yEdge || pt[1]];\n } else if(lastFarPt) {\n // both this point and the last are outside the nearby region\n // check if we're crossing the nearby region\n var intersections = getEdgeIntersections(lastFarPt, pt);\n if(intersections.length > 1) {\n updateEdgesForReentry(intersections[0]);\n pts[pti++] = intersections[1];\n }\n } else {\n // we're leaving the nearby region - add the point where we left it\n\n edgePt = getEdgeIntersections(pts[pti - 1], pt)[0];\n pts[pti++] = edgePt;\n }\n\n var lastPt = pts[pti - 1];\n if(xEdge && yEdge && (lastPt[0] !== xEdge || lastPt[1] !== yEdge)) {\n // we've gone out beyond a new corner: add the corner too\n // so that the next point will take the right winding\n if(lastFarPt) {\n if(lastXEdge !== xEdge && lastYEdge !== yEdge) {\n if(lastXEdge && lastYEdge) {\n // we've gone around to an opposite corner - we\n // need to add the correct extra corner\n // in order to get the right winding\n updateEdge(getClosestCorner(lastFarPt, pt));\n } else {\n // we're coming from a far edge - the extra corner\n // we need is determined uniquely by the sectors\n updateEdge([lastXEdge || xEdge, lastYEdge || yEdge]);\n }\n } else if(lastXEdge && lastYEdge) {\n updateEdge([lastXEdge, lastYEdge]);\n }\n }\n updateEdge([xEdge, yEdge]);\n } else if((lastXEdge - xEdge) && (lastYEdge - yEdge)) {\n // we're coming from an edge or far corner to an edge - again the\n // extra corner we need is uniquely determined by the sectors\n updateEdge([xEdge || lastXEdge, yEdge || lastYEdge]);\n }\n lastFarPt = pt;\n lastXEdge = xEdge;\n lastYEdge = yEdge;\n } else {\n if(lastFarPt) {\n // this point is in range but the previous wasn't: add its entry pt first\n updateEdgesForReentry(getEdgeIntersections(lastFarPt, pt)[0]);\n }\n\n pts[pti++] = pt;\n }\n }\n\n // loop over ALL points in this trace\n for(i = 0; i < len; i++) {\n clusterStartPt = getPt(i);\n if(!clusterStartPt) continue;\n\n pti = 0;\n lastFarPt = null;\n addPt(clusterStartPt);\n\n // loop over one segment of the trace\n for(i++; i < len; i++) {\n clusterHighPt = getPt(i);\n if(!clusterHighPt) {\n if(connectGaps) continue;\n else break;\n }\n\n // can't decimate if nonlinear line shape\n // TODO: we *could* decimate [hv]{2,3} shapes if we restricted clusters to horz or vert again\n // but spline would be verrry awkward to decimate\n if(!linear || !opts.simplify) {\n addPt(clusterHighPt);\n continue;\n }\n\n var nextPt = getPt(i + 1);\n\n clusterRefDist = ptDist(clusterHighPt, clusterStartPt);\n\n // #3147 - always include the very first and last points for fills\n if(!(fill && (pti === 0 || pti === len - 1)) &&\n clusterRefDist < getTolerance(clusterHighPt, nextPt) * minTolerance) continue;\n\n clusterUnitVector = [\n (clusterHighPt[0] - clusterStartPt[0]) / clusterRefDist,\n (clusterHighPt[1] - clusterStartPt[1]) / clusterRefDist\n ];\n\n clusterLowPt = clusterStartPt;\n clusterHighVal = clusterRefDist;\n clusterLowVal = clusterMinDeviation = clusterMaxDeviation = 0;\n clusterHighFirst = false;\n clusterEndPt = clusterHighPt;\n\n // loop over one cluster of points that collapse onto one line\n for(i++; i < d.length; i++) {\n thisPt = nextPt;\n nextPt = getPt(i + 1);\n if(!thisPt) {\n if(connectGaps) continue;\n else break;\n }\n thisVector = [\n thisPt[0] - clusterStartPt[0],\n thisPt[1] - clusterStartPt[1]\n ];\n // cross product (or dot with normal to the cluster vector)\n thisDeviation = thisVector[0] * clusterUnitVector[1] - thisVector[1] * clusterUnitVector[0];\n clusterMinDeviation = Math.min(clusterMinDeviation, thisDeviation);\n clusterMaxDeviation = Math.max(clusterMaxDeviation, thisDeviation);\n\n if(clusterMaxDeviation - clusterMinDeviation > getTolerance(thisPt, nextPt)) break;\n\n clusterEndPt = thisPt;\n thisVal = thisVector[0] * clusterUnitVector[0] + thisVector[1] * clusterUnitVector[1];\n\n if(thisVal > clusterHighVal) {\n clusterHighVal = thisVal;\n clusterHighPt = thisPt;\n clusterHighFirst = false;\n } else if(thisVal < clusterLowVal) {\n clusterLowVal = thisVal;\n clusterLowPt = thisPt;\n clusterHighFirst = true;\n }\n }\n\n // insert this cluster into pts\n // we've already inserted the start pt, now check if we have high and low pts\n if(clusterHighFirst) {\n addPt(clusterHighPt);\n if(clusterEndPt !== clusterLowPt) addPt(clusterLowPt);\n } else {\n if(clusterLowPt !== clusterStartPt) addPt(clusterLowPt);\n if(clusterEndPt !== clusterHighPt) addPt(clusterHighPt);\n }\n // and finally insert the end pt\n addPt(clusterEndPt);\n\n // have we reached the end of this segment?\n if(i >= d.length || !thisPt) break;\n\n // otherwise we have an out-of-cluster point to insert as next clusterStartPt\n addPt(thisPt);\n clusterStartPt = thisPt;\n }\n\n // to get fills right - repeat what we did at the start\n if(lastFarPt) updateEdge([lastXEdge || lastFarPt[0], lastYEdge || lastFarPt[1]]);\n\n segments.push(pts.slice(0, pti));\n }\n\n\n var lastShapeChar = shape.slice(shape.length - 1);\n if(backoff && lastShapeChar !== 'h' && lastShapeChar !== 'v') {\n var trimmed = false;\n var n = -1;\n var newSegments = [];\n\n for(var j = 0; j < segments.length; j++) {\n for(var k = 0; k < segments[j].length - 1; k++) {\n var start = segments[j][k];\n var end = segments[j][k + 1];\n\n var xy = Drawing.applyBackoff(end, start);\n if(\n xy[0] !== end[0] ||\n xy[1] !== end[1]\n ) {\n trimmed = true;\n }\n if(!newSegments[n + 1]) {\n n++;\n newSegments[n] = [\n start, [xy[0], xy[1]]\n ];\n }\n }\n }\n\n return trimmed ? newSegments : segments;\n }\n\n return segments;\n};\n","'use strict';\n\nvar isNumeric = require('fast-isnumeric');\nvar Lib = require('../../lib');\n\nvar Registry = require('../../registry');\n\nmodule.exports = function handleXYZDefaults(traceIn, traceOut, coerce, layout, xName, yName) {\n var z = coerce('z');\n xName = xName || 'x';\n yName = yName || 'y';\n var x, y;\n\n if(z === undefined || !z.length) return 0;\n\n if(Lib.isArray1D(z)) {\n x = coerce(xName);\n y = coerce(yName);\n\n var xlen = Lib.minRowLength(x);\n var ylen = Lib.minRowLength(y);\n\n // column z must be accompanied by xName and yName arrays\n if(xlen === 0 || ylen === 0) return 0;\n\n traceOut._length = Math.min(xlen, ylen, z.length);\n } else {\n x = coordDefaults(xName, coerce);\n y = coordDefaults(yName, coerce);\n\n // TODO put z validation elsewhere\n if(!isValidZ(z)) return 0;\n\n coerce('transpose');\n\n traceOut._length = null;\n }\n\n if(traceIn.type === 'heatmapgl') return true; // skip calendars until we handle them in those traces\n\n var handleCalendarDefaults = Registry.getComponentMethod('calendars', 'handleTraceDefaults');\n handleCalendarDefaults(traceIn, traceOut, [xName, yName], layout);\n\n return true;\n};\n\nfunction coordDefaults(coordStr, coerce) {\n var coord = coerce(coordStr);\n var coordType = coord ? coerce(coordStr + 'type', 'array') : 'scaled';\n\n if(coordType === 'scaled') {\n coerce(coordStr + '0');\n coerce('d' + coordStr);\n }\n\n return coord;\n}\n\nfunction isValidZ(z) {\n var allRowsAreArrays = true;\n var oneRowIsFilled = false;\n var hasOneNumber = false;\n var zi;\n\n /*\n * Without this step:\n *\n * hasOneNumber = false breaks contour but not heatmap\n * allRowsAreArrays = false breaks contour but not heatmap\n * oneRowIsFilled = false breaks both\n */\n\n for(var i = 0; i < z.length; i++) {\n zi = z[i];\n if(!Lib.isArrayOrTypedArray(zi)) {\n allRowsAreArrays = false;\n break;\n }\n if(zi.length > 0) oneRowIsFilled = true;\n for(var j = 0; j < zi.length; j++) {\n if(isNumeric(zi[j])) {\n hasOneNumber = true;\n break;\n }\n }\n }\n\n return (allRowsAreArrays && oneRowIsFilled && hasOneNumber);\n}\n","'use strict';\n\nvar scatterAttrs = require('../scatter/attributes');\nvar barAttrs = require('../bar/attributes');\nvar colorAttrs = require('../../components/color/attributes');\nvar axisHoverFormat = require('../../plots/cartesian/axis_format_attributes').axisHoverFormat;\nvar hovertemplateAttrs = require('../../plots/template_attributes').hovertemplateAttrs;\nvar extendFlat = require('../../lib/extend').extendFlat;\n\nvar scatterMarkerAttrs = scatterAttrs.marker;\nvar scatterMarkerLineAttrs = scatterMarkerAttrs.line;\n\nmodule.exports = {\n y: {\n valType: 'data_array',\n editType: 'calc+clearAxisTypes',\n description: [\n 'Sets the y sample data or coordinates.',\n 'See overview for more info.'\n ].join(' ')\n },\n x: {\n valType: 'data_array',\n editType: 'calc+clearAxisTypes',\n description: [\n 'Sets the x sample data or coordinates.',\n 'See overview for more info.'\n ].join(' ')\n },\n x0: {\n valType: 'any',\n editType: 'calc+clearAxisTypes',\n description: [\n 'Sets the x coordinate for single-box traces',\n 'or the starting coordinate for multi-box traces',\n 'set using q1/median/q3.',\n 'See overview for more info.'\n ].join(' ')\n },\n y0: {\n valType: 'any',\n editType: 'calc+clearAxisTypes',\n description: [\n 'Sets the y coordinate for single-box traces',\n 'or the starting coordinate for multi-box traces',\n 'set using q1/median/q3.',\n 'See overview for more info.'\n ].join(' ')\n },\n\n dx: {\n valType: 'number',\n editType: 'calc',\n description: [\n 'Sets the x coordinate step for multi-box traces',\n 'set using q1/median/q3.'\n ].join(' ')\n },\n dy: {\n valType: 'number',\n editType: 'calc',\n description: [\n 'Sets the y coordinate step for multi-box traces',\n 'set using q1/median/q3.'\n ].join(' ')\n },\n\n xperiod: scatterAttrs.xperiod,\n yperiod: scatterAttrs.yperiod,\n xperiod0: scatterAttrs.xperiod0,\n yperiod0: scatterAttrs.yperiod0,\n xperiodalignment: scatterAttrs.xperiodalignment,\n yperiodalignment: scatterAttrs.yperiodalignment,\n xhoverformat: axisHoverFormat('x'),\n yhoverformat: axisHoverFormat('y'),\n\n name: {\n valType: 'string',\n editType: 'calc+clearAxisTypes',\n description: [\n 'Sets the trace name.',\n 'The trace name appears as the legend item and on hover.',\n 'For box traces, the name will also be used for the position',\n 'coordinate, if `x` and `x0` (`y` and `y0` if horizontal) are',\n 'missing and the position axis is categorical'\n ].join(' ')\n },\n\n q1: {\n valType: 'data_array',\n editType: 'calc+clearAxisTypes',\n description: [\n 'Sets the Quartile 1 values.',\n 'There should be as many items as the number of boxes desired.',\n ].join(' ')\n },\n median: {\n valType: 'data_array',\n editType: 'calc+clearAxisTypes',\n description: [\n 'Sets the median values.',\n 'There should be as many items as the number of boxes desired.',\n ].join(' ')\n },\n q3: {\n valType: 'data_array',\n editType: 'calc+clearAxisTypes',\n description: [\n 'Sets the Quartile 3 values.',\n 'There should be as many items as the number of boxes desired.',\n ].join(' ')\n },\n lowerfence: {\n valType: 'data_array',\n editType: 'calc',\n description: [\n 'Sets the lower fence values.',\n 'There should be as many items as the number of boxes desired.',\n 'This attribute has effect only under the q1/median/q3 signature.',\n 'If `lowerfence` is not provided but a sample (in `y` or `x`) is set,',\n 'we compute the lower as the last sample point below 1.5 times the IQR.'\n ].join(' ')\n },\n upperfence: {\n valType: 'data_array',\n editType: 'calc',\n description: [\n 'Sets the upper fence values.',\n 'There should be as many items as the number of boxes desired.',\n 'This attribute has effect only under the q1/median/q3 signature.',\n 'If `upperfence` is not provided but a sample (in `y` or `x`) is set,',\n 'we compute the upper as the last sample point above 1.5 times the IQR.'\n ].join(' ')\n },\n\n notched: {\n valType: 'boolean',\n editType: 'calc',\n description: [\n 'Determines whether or not notches are drawn.',\n 'Notches displays a confidence interval around the median.',\n 'We compute the confidence interval as median +/- 1.57 * IQR / sqrt(N),',\n 'where IQR is the interquartile range and N is the sample size.',\n 'If two boxes\\' notches do not overlap there is 95% confidence their medians differ.',\n 'See https://sites.google.com/site/davidsstatistics/home/notched-box-plots for more info.',\n 'Defaults to *false* unless `notchwidth` or `notchspan` is set.'\n ].join(' ')\n },\n notchwidth: {\n valType: 'number',\n min: 0,\n max: 0.5,\n dflt: 0.25,\n editType: 'calc',\n description: [\n 'Sets the width of the notches relative to',\n 'the box\\' width.',\n 'For example, with 0, the notches are as wide as the box(es).'\n ].join(' ')\n },\n notchspan: {\n valType: 'data_array',\n editType: 'calc',\n description: [\n 'Sets the notch span from the boxes\\' `median` values.',\n 'There should be as many items as the number of boxes desired.',\n 'This attribute has effect only under the q1/median/q3 signature.',\n 'If `notchspan` is not provided but a sample (in `y` or `x`) is set,',\n 'we compute it as 1.57 * IQR / sqrt(N),',\n 'where N is the sample size.'\n ].join(' ')\n },\n\n // TODO\n // maybe add\n // - loweroutlierbound / upperoutlierbound\n // - lowersuspectedoutlierbound / uppersuspectedoutlierbound\n\n boxpoints: {\n valType: 'enumerated',\n values: ['all', 'outliers', 'suspectedoutliers', false],\n editType: 'calc',\n description: [\n 'If *outliers*, only the sample points lying outside the whiskers',\n 'are shown',\n 'If *suspectedoutliers*, the outlier points are shown and',\n 'points either less than 4*Q1-3*Q3 or greater than 4*Q3-3*Q1',\n 'are highlighted (see `outliercolor`)',\n 'If *all*, all sample points are shown',\n 'If *false*, only the box(es) are shown with no sample points',\n 'Defaults to *suspectedoutliers* when `marker.outliercolor` or',\n '`marker.line.outliercolor` is set.',\n 'Defaults to *all* under the q1/median/q3 signature.',\n 'Otherwise defaults to *outliers*.',\n ].join(' ')\n },\n jitter: {\n valType: 'number',\n min: 0,\n max: 1,\n editType: 'calc',\n description: [\n 'Sets the amount of jitter in the sample points drawn.',\n 'If *0*, the sample points align along the distribution axis.',\n 'If *1*, the sample points are drawn in a random jitter of width',\n 'equal to the width of the box(es).'\n ].join(' ')\n },\n pointpos: {\n valType: 'number',\n min: -2,\n max: 2,\n editType: 'calc',\n description: [\n 'Sets the position of the sample points in relation to the box(es).',\n 'If *0*, the sample points are places over the center of the box(es).',\n 'Positive (negative) values correspond to positions to the',\n 'right (left) for vertical boxes and above (below) for horizontal boxes'\n ].join(' ')\n },\n sdmultiple: {\n valType: 'number',\n min: 0,\n editType: 'calc',\n dflt: 1,\n description: [\n 'Scales the box size when sizemode=sd',\n 'Allowing boxes to be drawn across any stddev range',\n 'For example 1-stddev, 3-stddev, 5-stddev',\n ].join(' ')\n },\n sizemode: {\n valType: 'enumerated',\n values: ['quartiles', 'sd'],\n editType: 'calc',\n dflt: 'quartiles',\n description: [\n 'Sets the upper and lower bound for the boxes',\n 'quartiles means box is drawn between Q1 and Q3',\n 'SD means the box is drawn between Mean +- Standard Deviation',\n 'Argument sdmultiple (default 1) to scale the box size',\n 'So it could be drawn 1-stddev, 3-stddev etc',\n ].join(' ')\n },\n boxmean: {\n valType: 'enumerated',\n values: [true, 'sd', false],\n editType: 'calc',\n description: [\n 'If *true*, the mean of the box(es)\\' underlying distribution is',\n 'drawn as a dashed line inside the box(es).',\n 'If *sd* the standard deviation is also drawn.',\n 'Defaults to *true* when `mean` is set.',\n 'Defaults to *sd* when `sd` is set',\n 'Otherwise defaults to *false*.'\n ].join(' ')\n },\n mean: {\n valType: 'data_array',\n editType: 'calc',\n description: [\n 'Sets the mean values.',\n 'There should be as many items as the number of boxes desired.',\n 'This attribute has effect only under the q1/median/q3 signature.',\n 'If `mean` is not provided but a sample (in `y` or `x`) is set,',\n 'we compute the mean for each box using the sample values.'\n ].join(' ')\n },\n sd: {\n valType: 'data_array',\n editType: 'calc',\n description: [\n 'Sets the standard deviation values.',\n 'There should be as many items as the number of boxes desired.',\n 'This attribute has effect only under the q1/median/q3 signature.',\n 'If `sd` is not provided but a sample (in `y` or `x`) is set,',\n 'we compute the standard deviation for each box using the sample values.'\n ].join(' ')\n },\n\n orientation: {\n valType: 'enumerated',\n values: ['v', 'h'],\n editType: 'calc+clearAxisTypes',\n description: [\n 'Sets the orientation of the box(es).',\n 'If *v* (*h*), the distribution is visualized along',\n 'the vertical (horizontal).'\n ].join(' ')\n },\n\n quartilemethod: {\n valType: 'enumerated',\n values: ['linear', 'exclusive', 'inclusive'],\n dflt: 'linear',\n editType: 'calc',\n description: [\n 'Sets the method used to compute the sample\\'s Q1 and Q3 quartiles.',\n\n 'The *linear* method uses the 25th percentile for Q1 and 75th percentile for Q3',\n 'as computed using method #10 (listed on http://jse.amstat.org/v14n3/langford.html).',\n\n 'The *exclusive* method uses the median to divide the ordered dataset into two halves',\n 'if the sample is odd, it does not include the median in either half -',\n 'Q1 is then the median of the lower half and',\n 'Q3 the median of the upper half.',\n\n 'The *inclusive* method also uses the median to divide the ordered dataset into two halves',\n 'but if the sample is odd, it includes the median in both halves -',\n 'Q1 is then the median of the lower half and',\n 'Q3 the median of the upper half.'\n ].join(' ')\n },\n\n width: {\n valType: 'number',\n min: 0,\n dflt: 0,\n editType: 'calc',\n description: [\n 'Sets the width of the box in data coordinate',\n 'If *0* (default value) the width is automatically selected based on the positions',\n 'of other box traces in the same subplot.'\n ].join(' ')\n },\n\n marker: {\n outliercolor: {\n valType: 'color',\n dflt: 'rgba(0, 0, 0, 0)',\n editType: 'style',\n description: 'Sets the color of the outlier sample points.'\n },\n symbol: extendFlat({}, scatterMarkerAttrs.symbol,\n {arrayOk: false, editType: 'plot'}),\n opacity: extendFlat({}, scatterMarkerAttrs.opacity,\n {arrayOk: false, dflt: 1, editType: 'style'}),\n angle: extendFlat({}, scatterMarkerAttrs.angle,\n {arrayOk: false, editType: 'calc'}),\n size: extendFlat({}, scatterMarkerAttrs.size,\n {arrayOk: false, editType: 'calc'}),\n color: extendFlat({}, scatterMarkerAttrs.color,\n {arrayOk: false, editType: 'style'}),\n line: {\n color: extendFlat({}, scatterMarkerLineAttrs.color,\n {arrayOk: false, dflt: colorAttrs.defaultLine, editType: 'style'}\n ),\n width: extendFlat({}, scatterMarkerLineAttrs.width,\n {arrayOk: false, dflt: 0, editType: 'style'}\n ),\n outliercolor: {\n valType: 'color',\n editType: 'style',\n description: [\n 'Sets the border line color of the outlier sample points.',\n 'Defaults to marker.color'\n ].join(' ')\n },\n outlierwidth: {\n valType: 'number',\n min: 0,\n dflt: 1,\n editType: 'style',\n description: [\n 'Sets the border line width (in px) of the outlier sample points.'\n ].join(' ')\n },\n editType: 'style'\n },\n editType: 'plot'\n },\n\n line: {\n color: {\n valType: 'color',\n editType: 'style',\n description: 'Sets the color of line bounding the box(es).'\n },\n width: {\n valType: 'number',\n min: 0,\n dflt: 2,\n editType: 'style',\n description: 'Sets the width (in px) of line bounding the box(es).'\n },\n editType: 'plot'\n },\n\n fillcolor: scatterAttrs.fillcolor,\n\n whiskerwidth: {\n valType: 'number',\n min: 0,\n max: 1,\n dflt: 0.5,\n editType: 'calc',\n description: [\n 'Sets the width of the whiskers relative to',\n 'the box\\' width.',\n 'For example, with 1, the whiskers are as wide as the box(es).'\n ].join(' ')\n },\n\n showwhiskers: {\n valType: 'boolean',\n editType: 'calc',\n description: [\n 'Determines whether or not whiskers are visible.',\n 'Defaults to true for `sizemode` *quartiles*, false for *sd*.'\n ].join(' ')\n },\n\n offsetgroup: barAttrs.offsetgroup,\n alignmentgroup: barAttrs.alignmentgroup,\n\n selected: {\n marker: scatterAttrs.selected.marker,\n editType: 'style'\n },\n unselected: {\n marker: scatterAttrs.unselected.marker,\n editType: 'style'\n },\n\n text: extendFlat({}, scatterAttrs.text, {\n description: [\n 'Sets the text elements associated with each sample value.',\n 'If a single string, the same string appears over',\n 'all the data points.',\n 'If an array of string, the items are mapped in order to the',\n 'this trace\\'s (x,y) coordinates.',\n 'To be seen, trace `hoverinfo` must contain a *text* flag.'\n ].join(' ')\n }),\n hovertext: extendFlat({}, scatterAttrs.hovertext, {\n description: 'Same as `text`.'\n }),\n hovertemplate: hovertemplateAttrs({\n description: [\n 'N.B. This only has an effect when hovering on points.'\n ].join(' ')\n }),\n\n hoveron: {\n valType: 'flaglist',\n flags: ['boxes', 'points'],\n dflt: 'boxes+points',\n editType: 'style',\n description: [\n 'Do the hover effects highlight individual boxes ',\n 'or sample points or both?'\n ].join(' ')\n }\n};\n","'use strict';\n\nvar Fx = require('../../components/fx');\nvar Lib = require('../../lib');\nvar isArrayOrTypedArray = Lib.isArrayOrTypedArray;\nvar Axes = require('../../plots/cartesian/axes');\nvar extractOpts = require('../../components/colorscale').extractOpts;\n\nmodule.exports = function hoverPoints(pointData, xval, yval, hovermode, opts) {\n if(!opts) opts = {};\n var isContour = opts.isContour;\n\n var cd0 = pointData.cd[0];\n var trace = cd0.trace;\n var xa = pointData.xa;\n var ya = pointData.ya;\n var x = cd0.x;\n var y = cd0.y;\n var z = cd0.z;\n var xc = cd0.xCenter;\n var yc = cd0.yCenter;\n var zmask = cd0.zmask;\n var zhoverformat = trace.zhoverformat;\n var x2 = x;\n var y2 = y;\n\n var xl, yl, nx, ny;\n\n if(pointData.index !== false) {\n try {\n nx = Math.round(pointData.index[1]);\n ny = Math.round(pointData.index[0]);\n } catch(e) {\n Lib.error('Error hovering on heatmap, ' +\n 'pointNumber must be [row,col], found:', pointData.index);\n return;\n }\n if(nx < 0 || nx >= z[0].length || ny < 0 || ny > z.length) {\n return;\n }\n } else if(Fx.inbox(xval - x[0], xval - x[x.length - 1], 0) > 0 ||\n Fx.inbox(yval - y[0], yval - y[y.length - 1], 0) > 0) {\n return;\n } else {\n if(isContour) {\n var i2;\n x2 = [2 * x[0] - x[1]];\n\n for(i2 = 1; i2 < x.length; i2++) {\n x2.push((x[i2] + x[i2 - 1]) / 2);\n }\n x2.push([2 * x[x.length - 1] - x[x.length - 2]]);\n\n y2 = [2 * y[0] - y[1]];\n for(i2 = 1; i2 < y.length; i2++) {\n y2.push((y[i2] + y[i2 - 1]) / 2);\n }\n y2.push([2 * y[y.length - 1] - y[y.length - 2]]);\n }\n nx = Math.max(0, Math.min(x2.length - 2, Lib.findBin(xval, x2)));\n ny = Math.max(0, Math.min(y2.length - 2, Lib.findBin(yval, y2)));\n }\n\n var x0 = xa.c2p(x[nx]);\n var x1 = xa.c2p(x[nx + 1]);\n var y0 = ya.c2p(y[ny]);\n var y1 = ya.c2p(y[ny + 1]);\n\n var _x, _y;\n if(isContour) {\n _x = cd0.orig_x || x;\n _y = cd0.orig_y || y;\n\n x1 = x0;\n xl = _x[nx];\n y1 = y0;\n yl = _y[ny];\n } else {\n _x = cd0.orig_x || xc || x;\n _y = cd0.orig_y || yc || y;\n\n xl = xc ? _x[nx] : ((_x[nx] + _x[nx + 1]) / 2);\n yl = yc ? _y[ny] : ((_y[ny] + _y[ny + 1]) / 2);\n\n if(xa && xa.type === 'category') xl = x[nx];\n if(ya && ya.type === 'category') yl = y[ny];\n\n if(trace.zsmooth) {\n x0 = x1 = xa.c2p(xl);\n y0 = y1 = ya.c2p(yl);\n }\n }\n\n var zVal = z[ny][nx];\n if(zmask && !zmask[ny][nx]) zVal = undefined;\n\n if(zVal === undefined && !trace.hoverongaps) return;\n\n var text;\n if(isArrayOrTypedArray(cd0.hovertext) && isArrayOrTypedArray(cd0.hovertext[ny])) {\n text = cd0.hovertext[ny][nx];\n } else if(isArrayOrTypedArray(cd0.text) && isArrayOrTypedArray(cd0.text[ny])) {\n text = cd0.text[ny][nx];\n }\n\n // dummy axis for formatting the z value\n var cOpts = extractOpts(trace);\n var dummyAx = {\n type: 'linear',\n range: [cOpts.min, cOpts.max],\n hoverformat: zhoverformat,\n _separators: xa._separators,\n _numFormat: xa._numFormat\n };\n var zLabel = Axes.tickText(dummyAx, zVal, 'hover').text;\n\n return [Lib.extendFlat(pointData, {\n index: trace._after2before ? trace._after2before[ny][nx] : [ny, nx],\n // never let a 2D override 1D type as closest point\n distance: pointData.maxHoverDistance,\n spikeDistance: pointData.maxSpikeDistance,\n x0: x0,\n x1: x1,\n y0: y0,\n y1: y1,\n xLabelVal: xl,\n yLabelVal: yl,\n zLabelVal: zVal,\n zLabel: zLabel,\n text: text\n })];\n};\n","'use strict';\n\nvar d3 = require('@plotly/d3');\nvar Drawing = require('../../components/drawing');\nvar Registry = require('../../registry');\n\nfunction style(gd) {\n var s = d3.select(gd).selectAll('g.trace.scatter');\n\n s.style('opacity', function(d) {\n return d[0].trace.opacity;\n });\n\n s.selectAll('g.points').each(function(d) {\n var sel = d3.select(this);\n var trace = d.trace || d[0].trace;\n stylePoints(sel, trace, gd);\n });\n\n s.selectAll('g.text').each(function(d) {\n var sel = d3.select(this);\n var trace = d.trace || d[0].trace;\n styleText(sel, trace, gd);\n });\n\n s.selectAll('g.trace path.js-line')\n .call(Drawing.lineGroupStyle);\n\n s.selectAll('g.trace path.js-fill')\n .call(Drawing.fillGroupStyle, gd);\n\n Registry.getComponentMethod('errorbars', 'style')(s);\n}\n\nfunction stylePoints(sel, trace, gd) {\n Drawing.pointStyle(sel.selectAll('path.point'), trace, gd);\n}\n\nfunction styleText(sel, trace, gd) {\n Drawing.textPointStyle(sel.selectAll('text'), trace, gd);\n}\n\nfunction styleOnSelect(gd, cd, sel) {\n var trace = cd[0].trace;\n\n if(trace.selectedpoints) {\n Drawing.selectedPointStyle(sel.selectAll('path.point'), trace);\n Drawing.selectedTextStyle(sel.selectAll('text'), trace);\n } else {\n stylePoints(sel, trace, gd);\n styleText(sel, trace, gd);\n }\n}\n\nmodule.exports = {\n style: style,\n stylePoints: stylePoints,\n styleText: styleText,\n styleOnSelect: styleOnSelect\n};\n","'use strict';\n\nvar LINKEDFILLS = {tonextx: 1, tonexty: 1, tonext: 1};\n\nmodule.exports = function linkTraces(gd, plotinfo, cdscatter) {\n var trace, i, group, prevtrace, groupIndex;\n\n // first sort traces to keep stacks & filled-together groups together\n var groupIndices = {};\n var needsSort = false;\n var prevGroupIndex = -1;\n var nextGroupIndex = 0;\n var prevUnstackedGroupIndex = -1;\n for(i = 0; i < cdscatter.length; i++) {\n trace = cdscatter[i][0].trace;\n group = trace.stackgroup || '';\n if(group) {\n if(group in groupIndices) {\n groupIndex = groupIndices[group];\n } else {\n groupIndex = groupIndices[group] = nextGroupIndex;\n nextGroupIndex++;\n }\n } else if(trace.fill in LINKEDFILLS && prevUnstackedGroupIndex >= 0) {\n groupIndex = prevUnstackedGroupIndex;\n } else {\n groupIndex = prevUnstackedGroupIndex = nextGroupIndex;\n nextGroupIndex++;\n }\n\n if(groupIndex < prevGroupIndex) needsSort = true;\n trace._groupIndex = prevGroupIndex = groupIndex;\n }\n\n var cdscatterSorted = cdscatter.slice();\n if(needsSort) {\n cdscatterSorted.sort(function(a, b) {\n var traceA = a[0].trace;\n var traceB = b[0].trace;\n return (traceA._groupIndex - traceB._groupIndex) ||\n (traceA.index - traceB.index);\n });\n }\n\n // now link traces to each other\n var prevtraces = {};\n for(i = 0; i < cdscatterSorted.length; i++) {\n trace = cdscatterSorted[i][0].trace;\n group = trace.stackgroup || '';\n\n // Note: The check which ensures all cdscatter here are for the same axis and\n // are either cartesian or scatterternary has been removed. This code assumes\n // the passed scattertraces have been filtered to the proper plot types and\n // the proper subplots.\n if(trace.visible === true) {\n trace._nexttrace = null;\n\n if(trace.fill in LINKEDFILLS) {\n prevtrace = prevtraces[group];\n trace._prevtrace = prevtrace || null;\n\n if(prevtrace) {\n prevtrace._nexttrace = trace;\n }\n }\n\n trace._ownfill = (trace.fill && (\n trace.fill.substr(0, 6) === 'tozero' ||\n trace.fill === 'toself' ||\n (trace.fill.substr(0, 2) === 'to' && !trace._prevtrace)\n ));\n\n prevtraces[group] = trace;\n } else {\n trace._prevtrace = trace._nexttrace = trace._ownfill = null;\n }\n }\n\n return cdscatterSorted;\n};\n","'use strict';\n\nvar d3 = require('@plotly/d3');\n\nvar Plots = require('../../plots/plots');\nvar Fx = require('../../components/fx');\nvar Color = require('../../components/color');\nvar Drawing = require('../../components/drawing');\nvar Lib = require('../../lib');\nvar strScale = Lib.strScale;\nvar strTranslate = Lib.strTranslate;\nvar svgTextUtils = require('../../lib/svg_text_utils');\nvar uniformText = require('../bar/uniform_text');\nvar recordMinTextSize = uniformText.recordMinTextSize;\nvar clearMinTextSize = uniformText.clearMinTextSize;\nvar TEXTPAD = require('../bar/constants').TEXTPAD;\n\nvar helpers = require('./helpers');\nvar eventData = require('./event_data');\nvar isValidTextValue = require('../../lib').isValidTextValue;\n\nfunction plot(gd, cdModule) {\n var isStatic = gd._context.staticPlot;\n\n var fullLayout = gd._fullLayout;\n var gs = fullLayout._size;\n\n clearMinTextSize('pie', fullLayout);\n\n prerenderTitles(cdModule, gd);\n layoutAreas(cdModule, gs);\n\n var plotGroups = Lib.makeTraceGroups(fullLayout._pielayer, cdModule, 'trace').each(function(cd) {\n var plotGroup = d3.select(this);\n var cd0 = cd[0];\n var trace = cd0.trace;\n\n setCoords(cd);\n\n // TODO: miter might look better but can sometimes cause problems\n // maybe miter with a small-ish stroke-miterlimit?\n plotGroup.attr('stroke-linejoin', 'round');\n\n plotGroup.each(function() {\n var slices = d3.select(this).selectAll('g.slice').data(cd);\n\n slices.enter().append('g')\n .classed('slice', true);\n slices.exit().remove();\n\n var quadrants = [\n [[], []], // y<0: x<0, x>=0\n [[], []] // y>=0: x<0, x>=0\n ];\n var hasOutsideText = false;\n\n slices.each(function(pt, i) {\n if(pt.hidden) {\n d3.select(this).selectAll('path,g').remove();\n return;\n }\n\n // to have consistent event data compared to other traces\n pt.pointNumber = pt.i;\n pt.curveNumber = trace.index;\n\n quadrants[pt.pxmid[1] < 0 ? 0 : 1][pt.pxmid[0] < 0 ? 0 : 1].push(pt);\n\n var cx = cd0.cx;\n var cy = cd0.cy;\n var sliceTop = d3.select(this);\n var slicePath = sliceTop.selectAll('path.surface').data([pt]);\n\n slicePath.enter().append('path')\n .classed('surface', true)\n .style({'pointer-events': isStatic ? 'none' : 'all'});\n\n sliceTop.call(attachFxHandlers, gd, cd);\n\n if(trace.pull) {\n var pull = +helpers.castOption(trace.pull, pt.pts) || 0;\n if(pull > 0) {\n cx += pull * pt.pxmid[0];\n cy += pull * pt.pxmid[1];\n }\n }\n\n pt.cxFinal = cx;\n pt.cyFinal = cy;\n\n function arc(start, finish, cw, scale) {\n var dx = scale * (finish[0] - start[0]);\n var dy = scale * (finish[1] - start[1]);\n\n return 'a' +\n (scale * cd0.r) + ',' + (scale * cd0.r) + ' 0 ' +\n pt.largeArc + (cw ? ' 1 ' : ' 0 ') + dx + ',' + dy;\n }\n\n var hole = trace.hole;\n if(pt.v === cd0.vTotal) { // 100% fails bcs arc start and end are identical\n var outerCircle = 'M' + (cx + pt.px0[0]) + ',' + (cy + pt.px0[1]) +\n arc(pt.px0, pt.pxmid, true, 1) +\n arc(pt.pxmid, pt.px0, true, 1) + 'Z';\n if(hole) {\n slicePath.attr('d',\n 'M' + (cx + hole * pt.px0[0]) + ',' + (cy + hole * pt.px0[1]) +\n arc(pt.px0, pt.pxmid, false, hole) +\n arc(pt.pxmid, pt.px0, false, hole) +\n 'Z' + outerCircle);\n } else slicePath.attr('d', outerCircle);\n } else {\n var outerArc = arc(pt.px0, pt.px1, true, 1);\n\n if(hole) {\n var rim = 1 - hole;\n slicePath.attr('d',\n 'M' + (cx + hole * pt.px1[0]) + ',' + (cy + hole * pt.px1[1]) +\n arc(pt.px1, pt.px0, false, hole) +\n 'l' + (rim * pt.px0[0]) + ',' + (rim * pt.px0[1]) +\n outerArc +\n 'Z');\n } else {\n slicePath.attr('d',\n 'M' + cx + ',' + cy +\n 'l' + pt.px0[0] + ',' + pt.px0[1] +\n outerArc +\n 'Z');\n }\n }\n\n // add text\n formatSliceLabel(gd, pt, cd0);\n var textPosition = helpers.castOption(trace.textposition, pt.pts);\n var sliceTextGroup = sliceTop.selectAll('g.slicetext')\n .data(pt.text && (textPosition !== 'none') ? [0] : []);\n\n sliceTextGroup.enter().append('g')\n .classed('slicetext', true);\n sliceTextGroup.exit().remove();\n\n sliceTextGroup.each(function() {\n var sliceText = Lib.ensureSingle(d3.select(this), 'text', '', function(s) {\n // prohibit tex interpretation until we can handle\n // tex and regular text together\n s.attr('data-notex', 1);\n });\n\n var font = Lib.ensureUniformFontSize(gd, textPosition === 'outside' ?\n determineOutsideTextFont(trace, pt, fullLayout.font) :\n determineInsideTextFont(trace, pt, fullLayout.font)\n );\n\n sliceText.text(pt.text)\n .attr({\n class: 'slicetext',\n transform: '',\n 'text-anchor': 'middle'\n })\n .call(Drawing.font, font)\n .call(svgTextUtils.convertToTspans, gd);\n\n // position the text relative to the slice\n var textBB = Drawing.bBox(sliceText.node());\n var transform;\n\n if(textPosition === 'outside') {\n transform = transformOutsideText(textBB, pt);\n } else {\n transform = transformInsideText(textBB, pt, cd0);\n if(textPosition === 'auto' && transform.scale < 1) {\n var newFont = Lib.ensureUniformFontSize(gd, trace.outsidetextfont);\n\n sliceText.call(Drawing.font, newFont);\n textBB = Drawing.bBox(sliceText.node());\n\n transform = transformOutsideText(textBB, pt);\n }\n }\n\n var textPosAngle = transform.textPosAngle;\n var textXY = textPosAngle === undefined ? pt.pxmid : getCoords(cd0.r, textPosAngle);\n transform.targetX = cx + textXY[0] * transform.rCenter + (transform.x || 0);\n transform.targetY = cy + textXY[1] * transform.rCenter + (transform.y || 0);\n computeTransform(transform, textBB);\n\n // save some stuff to use later ensure no labels overlap\n if(transform.outside) {\n var targetY = transform.targetY;\n pt.yLabelMin = targetY - textBB.height / 2;\n pt.yLabelMid = targetY;\n pt.yLabelMax = targetY + textBB.height / 2;\n pt.labelExtraX = 0;\n pt.labelExtraY = 0;\n hasOutsideText = true;\n }\n\n transform.fontSize = font.size;\n recordMinTextSize(trace.type, transform, fullLayout);\n cd[i].transform = transform;\n\n Lib.setTransormAndDisplay(sliceText, transform);\n });\n });\n\n // add the title\n var titleTextGroup = d3.select(this).selectAll('g.titletext')\n .data(trace.title.text ? [0] : []);\n\n titleTextGroup.enter().append('g')\n .classed('titletext', true);\n titleTextGroup.exit().remove();\n\n titleTextGroup.each(function() {\n var titleText = Lib.ensureSingle(d3.select(this), 'text', '', function(s) {\n // prohibit tex interpretation as above\n s.attr('data-notex', 1);\n });\n\n var txt = trace.title.text;\n if(trace._meta) {\n txt = Lib.templateString(txt, trace._meta);\n }\n\n titleText.text(txt)\n .attr({\n class: 'titletext',\n transform: '',\n 'text-anchor': 'middle',\n })\n .call(Drawing.font, trace.title.font)\n .call(svgTextUtils.convertToTspans, gd);\n\n var transform;\n\n if(trace.title.position === 'middle center') {\n transform = positionTitleInside(cd0);\n } else {\n transform = positionTitleOutside(cd0, gs);\n }\n\n titleText.attr('transform',\n strTranslate(transform.x, transform.y) +\n strScale(Math.min(1, transform.scale)) +\n strTranslate(transform.tx, transform.ty));\n });\n\n // now make sure no labels overlap (at least within one pie)\n if(hasOutsideText) scootLabels(quadrants, trace);\n\n plotTextLines(slices, trace);\n\n if(hasOutsideText && trace.automargin) {\n // TODO if we ever want to improve perf,\n // we could reuse the textBB computed above together\n // with the sliceText transform info\n var traceBbox = Drawing.bBox(plotGroup.node());\n\n var domain = trace.domain;\n var vpw = gs.w * (domain.x[1] - domain.x[0]);\n var vph = gs.h * (domain.y[1] - domain.y[0]);\n var xgap = (0.5 * vpw - cd0.r) / gs.w;\n var ygap = (0.5 * vph - cd0.r) / gs.h;\n\n Plots.autoMargin(gd, 'pie.' + trace.uid + '.automargin', {\n xl: domain.x[0] - xgap,\n xr: domain.x[1] + xgap,\n yb: domain.y[0] - ygap,\n yt: domain.y[1] + ygap,\n l: Math.max(cd0.cx - cd0.r - traceBbox.left, 0),\n r: Math.max(traceBbox.right - (cd0.cx + cd0.r), 0),\n b: Math.max(traceBbox.bottom - (cd0.cy + cd0.r), 0),\n t: Math.max(cd0.cy - cd0.r - traceBbox.top, 0),\n pad: 5\n });\n }\n });\n });\n\n // This is for a bug in Chrome (as of 2015-07-22, and does not affect FF)\n // if insidetextfont and outsidetextfont are different sizes, sometimes the size\n // of an \"em\" gets taken from the wrong element at first so lines are\n // spaced wrong. You just have to tell it to try again later and it gets fixed.\n // I have no idea why we haven't seen this in other contexts. Also, sometimes\n // it gets the initial draw correct but on redraw it gets confused.\n setTimeout(function() {\n plotGroups.selectAll('tspan').each(function() {\n var s = d3.select(this);\n if(s.attr('dy')) s.attr('dy', s.attr('dy'));\n });\n }, 0);\n}\n\n// TODO add support for transition\nfunction plotTextLines(slices, trace) {\n slices.each(function(pt) {\n var sliceTop = d3.select(this);\n\n if(!pt.labelExtraX && !pt.labelExtraY) {\n sliceTop.select('path.textline').remove();\n return;\n }\n\n // first move the text to its new location\n var sliceText = sliceTop.select('g.slicetext text');\n\n pt.transform.targetX += pt.labelExtraX;\n pt.transform.targetY += pt.labelExtraY;\n\n Lib.setTransormAndDisplay(sliceText, pt.transform);\n\n // then add a line to the new location\n var lineStartX = pt.cxFinal + pt.pxmid[0];\n var lineStartY = pt.cyFinal + pt.pxmid[1];\n var textLinePath = 'M' + lineStartX + ',' + lineStartY;\n var finalX = (pt.yLabelMax - pt.yLabelMin) * (pt.pxmid[0] < 0 ? -1 : 1) / 4;\n\n if(pt.labelExtraX) {\n var yFromX = pt.labelExtraX * pt.pxmid[1] / pt.pxmid[0];\n var yNet = pt.yLabelMid + pt.labelExtraY - (pt.cyFinal + pt.pxmid[1]);\n\n if(Math.abs(yFromX) > Math.abs(yNet)) {\n textLinePath +=\n 'l' + (yNet * pt.pxmid[0] / pt.pxmid[1]) + ',' + yNet +\n 'H' + (lineStartX + pt.labelExtraX + finalX);\n } else {\n textLinePath += 'l' + pt.labelExtraX + ',' + yFromX +\n 'v' + (yNet - yFromX) +\n 'h' + finalX;\n }\n } else {\n textLinePath +=\n 'V' + (pt.yLabelMid + pt.labelExtraY) +\n 'h' + finalX;\n }\n\n Lib.ensureSingle(sliceTop, 'path', 'textline')\n .call(Color.stroke, trace.outsidetextfont.color)\n .attr({\n 'stroke-width': Math.min(2, trace.outsidetextfont.size / 8),\n d: textLinePath,\n fill: 'none'\n });\n });\n}\n\nfunction attachFxHandlers(sliceTop, gd, cd) {\n var cd0 = cd[0];\n var cx = cd0.cx;\n var cy = cd0.cy;\n var trace = cd0.trace;\n var isFunnelArea = trace.type === 'funnelarea';\n\n // hover state vars\n // have we drawn a hover label, so it should be cleared later\n if(!('_hasHoverLabel' in trace)) trace._hasHoverLabel = false;\n // have we emitted a hover event, so later an unhover event should be emitted\n // note that click events do not depend on this - you can still get them\n // with hovermode: false or if you were earlier dragging, then clicked\n // in the same slice that you moused up in\n if(!('_hasHoverEvent' in trace)) trace._hasHoverEvent = false;\n\n sliceTop.on('mouseover', function(pt) {\n // in case fullLayout or fullData has changed without a replot\n var fullLayout2 = gd._fullLayout;\n var trace2 = gd._fullData[trace.index];\n\n if(gd._dragging || fullLayout2.hovermode === false) return;\n\n var hoverinfo = trace2.hoverinfo;\n if(Array.isArray(hoverinfo)) {\n // super hacky: we need to pull out the *first* hoverinfo from\n // pt.pts, then put it back into an array in a dummy trace\n // and call castHoverinfo on that.\n // TODO: do we want to have Fx.castHoverinfo somehow handle this?\n // it already takes an array for index, for 2D, so this seems tricky.\n hoverinfo = Fx.castHoverinfo({\n hoverinfo: [helpers.castOption(hoverinfo, pt.pts)],\n _module: trace._module\n }, fullLayout2, 0);\n }\n\n if(hoverinfo === 'all') hoverinfo = 'label+text+value+percent+name';\n\n // in case we dragged over the pie from another subplot,\n // or if hover is turned off\n if(trace2.hovertemplate || (hoverinfo !== 'none' && hoverinfo !== 'skip' && hoverinfo)) {\n var rInscribed = pt.rInscribed || 0;\n var hoverCenterX = cx + pt.pxmid[0] * (1 - rInscribed);\n var hoverCenterY = cy + pt.pxmid[1] * (1 - rInscribed);\n var separators = fullLayout2.separators;\n var text = [];\n\n if(hoverinfo && hoverinfo.indexOf('label') !== -1) text.push(pt.label);\n pt.text = helpers.castOption(trace2.hovertext || trace2.text, pt.pts);\n if(hoverinfo && hoverinfo.indexOf('text') !== -1) {\n var tx = pt.text;\n if(Lib.isValidTextValue(tx)) text.push(tx);\n }\n pt.value = pt.v;\n pt.valueLabel = helpers.formatPieValue(pt.v, separators);\n if(hoverinfo && hoverinfo.indexOf('value') !== -1) text.push(pt.valueLabel);\n pt.percent = pt.v / cd0.vTotal;\n pt.percentLabel = helpers.formatPiePercent(pt.percent, separators);\n if(hoverinfo && hoverinfo.indexOf('percent') !== -1) text.push(pt.percentLabel);\n\n var hoverLabel = trace2.hoverlabel;\n var hoverFont = hoverLabel.font;\n\n var bbox = [];\n Fx.loneHover({\n trace: trace,\n x0: hoverCenterX - rInscribed * cd0.r,\n x1: hoverCenterX + rInscribed * cd0.r,\n y: hoverCenterY,\n _x0: isFunnelArea ? cx + pt.TL[0] : hoverCenterX - rInscribed * cd0.r,\n _x1: isFunnelArea ? cx + pt.TR[0] : hoverCenterX + rInscribed * cd0.r,\n _y0: isFunnelArea ? cy + pt.TL[1] : hoverCenterY - rInscribed * cd0.r,\n _y1: isFunnelArea ? cy + pt.BL[1] : hoverCenterY + rInscribed * cd0.r,\n text: text.join('
'),\n name: (trace2.hovertemplate || hoverinfo.indexOf('name') !== -1) ? trace2.name : undefined,\n idealAlign: pt.pxmid[0] < 0 ? 'left' : 'right',\n color: helpers.castOption(hoverLabel.bgcolor, pt.pts) || pt.color,\n borderColor: helpers.castOption(hoverLabel.bordercolor, pt.pts),\n fontFamily: helpers.castOption(hoverFont.family, pt.pts),\n fontSize: helpers.castOption(hoverFont.size, pt.pts),\n fontColor: helpers.castOption(hoverFont.color, pt.pts),\n nameLength: helpers.castOption(hoverLabel.namelength, pt.pts),\n textAlign: helpers.castOption(hoverLabel.align, pt.pts),\n hovertemplate: helpers.castOption(trace2.hovertemplate, pt.pts),\n hovertemplateLabels: pt,\n eventData: [eventData(pt, trace2)]\n }, {\n container: fullLayout2._hoverlayer.node(),\n outerContainer: fullLayout2._paper.node(),\n gd: gd,\n inOut_bbox: bbox\n });\n pt.bbox = bbox[0];\n\n trace._hasHoverLabel = true;\n }\n\n trace._hasHoverEvent = true;\n gd.emit('plotly_hover', {\n points: [eventData(pt, trace2)],\n event: d3.event\n });\n });\n\n sliceTop.on('mouseout', function(evt) {\n var fullLayout2 = gd._fullLayout;\n var trace2 = gd._fullData[trace.index];\n var pt = d3.select(this).datum();\n\n if(trace._hasHoverEvent) {\n evt.originalEvent = d3.event;\n gd.emit('plotly_unhover', {\n points: [eventData(pt, trace2)],\n event: d3.event\n });\n trace._hasHoverEvent = false;\n }\n\n if(trace._hasHoverLabel) {\n Fx.loneUnhover(fullLayout2._hoverlayer.node());\n trace._hasHoverLabel = false;\n }\n });\n\n sliceTop.on('click', function(pt) {\n // TODO: this does not support right-click. If we want to support it, we\n // would likely need to change pie to use dragElement instead of straight\n // mapbox event binding. Or perhaps better, make a simple wrapper with the\n // right mousedown, mousemove, and mouseup handlers just for a left/right click\n // mapbox would use this too.\n var fullLayout2 = gd._fullLayout;\n var trace2 = gd._fullData[trace.index];\n\n if(gd._dragging || fullLayout2.hovermode === false) return;\n\n gd._hoverdata = [eventData(pt, trace2)];\n Fx.click(gd, d3.event);\n });\n}\n\nfunction determineOutsideTextFont(trace, pt, layoutFont) {\n var color =\n helpers.castOption(trace.outsidetextfont.color, pt.pts) ||\n helpers.castOption(trace.textfont.color, pt.pts) ||\n layoutFont.color;\n\n var family =\n helpers.castOption(trace.outsidetextfont.family, pt.pts) ||\n helpers.castOption(trace.textfont.family, pt.pts) ||\n layoutFont.family;\n\n var size =\n helpers.castOption(trace.outsidetextfont.size, pt.pts) ||\n helpers.castOption(trace.textfont.size, pt.pts) ||\n layoutFont.size;\n\n return {\n color: color,\n family: family,\n size: size\n };\n}\n\nfunction determineInsideTextFont(trace, pt, layoutFont) {\n var customColor = helpers.castOption(trace.insidetextfont.color, pt.pts);\n if(!customColor && trace._input.textfont) {\n // Why not simply using trace.textfont? Because if not set, it\n // defaults to layout.font which has a default color. But if\n // textfont.color and insidetextfont.color don't supply a value,\n // a contrasting color shall be used.\n customColor = helpers.castOption(trace._input.textfont.color, pt.pts);\n }\n\n var family =\n helpers.castOption(trace.insidetextfont.family, pt.pts) ||\n helpers.castOption(trace.textfont.family, pt.pts) ||\n layoutFont.family;\n\n var size =\n helpers.castOption(trace.insidetextfont.size, pt.pts) ||\n helpers.castOption(trace.textfont.size, pt.pts) ||\n layoutFont.size;\n\n return {\n color: customColor || Color.contrast(pt.color),\n family: family,\n size: size\n };\n}\n\nfunction prerenderTitles(cdModule, gd) {\n var cd0, trace;\n\n // Determine the width and height of the title for each pie.\n for(var i = 0; i < cdModule.length; i++) {\n cd0 = cdModule[i][0];\n trace = cd0.trace;\n\n if(trace.title.text) {\n var txt = trace.title.text;\n if(trace._meta) {\n txt = Lib.templateString(txt, trace._meta);\n }\n\n var dummyTitle = Drawing.tester.append('text')\n .attr('data-notex', 1)\n .text(txt)\n .call(Drawing.font, trace.title.font)\n .call(svgTextUtils.convertToTspans, gd);\n var bBox = Drawing.bBox(dummyTitle.node(), true);\n cd0.titleBox = {\n width: bBox.width,\n height: bBox.height,\n };\n dummyTitle.remove();\n }\n }\n}\n\nfunction transformInsideText(textBB, pt, cd0) {\n var r = cd0.r || pt.rpx1;\n var rInscribed = pt.rInscribed;\n\n var isEmpty = pt.startangle === pt.stopangle;\n if(isEmpty) {\n return {\n rCenter: 1 - rInscribed,\n scale: 0,\n rotate: 0,\n textPosAngle: 0\n };\n }\n\n var ring = pt.ring;\n var isCircle = (ring === 1) && (Math.abs(pt.startangle - pt.stopangle) === Math.PI * 2);\n\n var halfAngle = pt.halfangle;\n var midAngle = pt.midangle;\n\n var orientation = cd0.trace.insidetextorientation;\n var isHorizontal = orientation === 'horizontal';\n var isTangential = orientation === 'tangential';\n var isRadial = orientation === 'radial';\n var isAuto = orientation === 'auto';\n\n var allTransforms = [];\n var newT;\n\n if(!isAuto) {\n // max size if text is placed (horizontally) at the top or bottom of the arc\n\n var considerCrossing = function(angle, key) {\n if(isCrossing(pt, angle)) {\n var dStart = Math.abs(angle - pt.startangle);\n var dStop = Math.abs(angle - pt.stopangle);\n\n var closestEdge = dStart < dStop ? dStart : dStop;\n\n if(key === 'tan') {\n newT = calcTanTransform(textBB, r, ring, closestEdge, 0);\n } else { // case of 'rad'\n newT = calcRadTransform(textBB, r, ring, closestEdge, Math.PI / 2);\n }\n newT.textPosAngle = angle;\n\n allTransforms.push(newT);\n }\n };\n\n // to cover all cases with trace.rotation added\n var i;\n if(isHorizontal || isTangential) {\n // top\n for(i = 4; i >= -4; i -= 2) considerCrossing(Math.PI * i, 'tan');\n // bottom\n for(i = 4; i >= -4; i -= 2) considerCrossing(Math.PI * (i + 1), 'tan');\n }\n if(isHorizontal || isRadial) {\n // left\n for(i = 4; i >= -4; i -= 2) considerCrossing(Math.PI * (i + 1.5), 'rad');\n // right\n for(i = 4; i >= -4; i -= 2) considerCrossing(Math.PI * (i + 0.5), 'rad');\n }\n }\n\n if(isCircle || isAuto || isHorizontal) {\n // max size text can be inserted inside without rotating it\n // this inscribes the text rectangle in a circle, which is then inscribed\n // in the slice, so it will be an underestimate, which some day we may want\n // to improve so this case can get more use\n var textDiameter = Math.sqrt(textBB.width * textBB.width + textBB.height * textBB.height);\n\n newT = {\n scale: rInscribed * r * 2 / textDiameter,\n\n // and the center position and rotation in this case\n rCenter: 1 - rInscribed,\n rotate: 0\n };\n\n newT.textPosAngle = (pt.startangle + pt.stopangle) / 2;\n if(newT.scale >= 1) return newT;\n\n allTransforms.push(newT);\n }\n\n if(isAuto || isRadial) {\n newT = calcRadTransform(textBB, r, ring, halfAngle, midAngle);\n newT.textPosAngle = (pt.startangle + pt.stopangle) / 2;\n allTransforms.push(newT);\n }\n\n if(isAuto || isTangential) {\n newT = calcTanTransform(textBB, r, ring, halfAngle, midAngle);\n newT.textPosAngle = (pt.startangle + pt.stopangle) / 2;\n allTransforms.push(newT);\n }\n\n var id = 0;\n var maxScale = 0;\n for(var k = 0; k < allTransforms.length; k++) {\n var s = allTransforms[k].scale;\n if(maxScale < s) {\n maxScale = s;\n id = k;\n }\n\n if(!isAuto && maxScale >= 1) {\n // respect test order for non-auto options\n break;\n }\n }\n return allTransforms[id];\n}\n\nfunction isCrossing(pt, angle) {\n var start = pt.startangle;\n var stop = pt.stopangle;\n return (\n (start > angle && angle > stop) ||\n (start < angle && angle < stop)\n );\n}\n\nfunction calcRadTransform(textBB, r, ring, halfAngle, midAngle) {\n r = Math.max(0, r - 2 * TEXTPAD);\n\n // max size if text is rotated radially\n var a = textBB.width / textBB.height;\n var s = calcMaxHalfSize(a, halfAngle, r, ring);\n return {\n scale: s * 2 / textBB.height,\n rCenter: calcRCenter(a, s / r),\n rotate: calcRotate(midAngle)\n };\n}\n\nfunction calcTanTransform(textBB, r, ring, halfAngle, midAngle) {\n r = Math.max(0, r - 2 * TEXTPAD);\n\n // max size if text is rotated tangentially\n var a = textBB.height / textBB.width;\n var s = calcMaxHalfSize(a, halfAngle, r, ring);\n return {\n scale: s * 2 / textBB.width,\n rCenter: calcRCenter(a, s / r),\n rotate: calcRotate(midAngle + Math.PI / 2)\n };\n}\n\nfunction calcRCenter(a, b) {\n return Math.cos(b) - a * b;\n}\n\nfunction calcRotate(t) {\n return (180 / Math.PI * t + 720) % 180 - 90;\n}\n\nfunction calcMaxHalfSize(a, halfAngle, r, ring) {\n var q = a + 1 / (2 * Math.tan(halfAngle));\n return r * Math.min(\n 1 / (Math.sqrt(q * q + 0.5) + q),\n ring / (Math.sqrt(a * a + ring / 2) + a)\n );\n}\n\nfunction getInscribedRadiusFraction(pt, cd0) {\n if(pt.v === cd0.vTotal && !cd0.trace.hole) return 1;// special case of 100% with no hole\n\n return Math.min(1 / (1 + 1 / Math.sin(pt.halfangle)), pt.ring / 2);\n}\n\nfunction transformOutsideText(textBB, pt) {\n var x = pt.pxmid[0];\n var y = pt.pxmid[1];\n var dx = textBB.width / 2;\n var dy = textBB.height / 2;\n\n if(x < 0) dx *= -1;\n if(y < 0) dy *= -1;\n\n return {\n scale: 1,\n rCenter: 1,\n rotate: 0,\n x: dx + Math.abs(dy) * (dx > 0 ? 1 : -1) / 2,\n y: dy / (1 + x * x / (y * y)),\n outside: true\n };\n}\n\nfunction positionTitleInside(cd0) {\n var textDiameter =\n Math.sqrt(cd0.titleBox.width * cd0.titleBox.width + cd0.titleBox.height * cd0.titleBox.height);\n return {\n x: cd0.cx,\n y: cd0.cy,\n scale: cd0.trace.hole * cd0.r * 2 / textDiameter,\n tx: 0,\n ty: - cd0.titleBox.height / 2 + cd0.trace.title.font.size\n };\n}\n\nfunction positionTitleOutside(cd0, plotSize) {\n var scaleX = 1;\n var scaleY = 1;\n var maxPull;\n\n var trace = cd0.trace;\n // position of the baseline point of the text box in the plot, before scaling.\n // we anchored the text in the middle, so the baseline is on the bottom middle\n // of the first line of text.\n var topMiddle = {\n x: cd0.cx,\n y: cd0.cy\n };\n // relative translation of the text box after scaling\n var translate = {\n tx: 0,\n ty: 0\n };\n\n // we reason below as if the baseline is the top middle point of the text box.\n // so we must add the font size to approximate the y-coord. of the top.\n // note that this correction must happen after scaling.\n translate.ty += trace.title.font.size;\n maxPull = getMaxPull(trace);\n\n if(trace.title.position.indexOf('top') !== -1) {\n topMiddle.y -= (1 + maxPull) * cd0.r;\n translate.ty -= cd0.titleBox.height;\n } else if(trace.title.position.indexOf('bottom') !== -1) {\n topMiddle.y += (1 + maxPull) * cd0.r;\n }\n\n var rx = applyAspectRatio(cd0.r, cd0.trace.aspectratio);\n\n var maxWidth = plotSize.w * (trace.domain.x[1] - trace.domain.x[0]) / 2;\n if(trace.title.position.indexOf('left') !== -1) {\n // we start the text at the left edge of the pie\n maxWidth = maxWidth + rx;\n topMiddle.x -= (1 + maxPull) * rx;\n translate.tx += cd0.titleBox.width / 2;\n } else if(trace.title.position.indexOf('center') !== -1) {\n maxWidth *= 2;\n } else if(trace.title.position.indexOf('right') !== -1) {\n maxWidth = maxWidth + rx;\n topMiddle.x += (1 + maxPull) * rx;\n translate.tx -= cd0.titleBox.width / 2;\n }\n scaleX = maxWidth / cd0.titleBox.width;\n scaleY = getTitleSpace(cd0, plotSize) / cd0.titleBox.height;\n return {\n x: topMiddle.x,\n y: topMiddle.y,\n scale: Math.min(scaleX, scaleY),\n tx: translate.tx,\n ty: translate.ty\n };\n}\n\nfunction applyAspectRatio(x, aspectratio) {\n return x / ((aspectratio === undefined) ? 1 : aspectratio);\n}\n\nfunction getTitleSpace(cd0, plotSize) {\n var trace = cd0.trace;\n var pieBoxHeight = plotSize.h * (trace.domain.y[1] - trace.domain.y[0]);\n // use at most half of the plot for the title\n return Math.min(cd0.titleBox.height, pieBoxHeight / 2);\n}\n\nfunction getMaxPull(trace) {\n var maxPull = trace.pull;\n if(!maxPull) return 0;\n\n var j;\n if(Lib.isArrayOrTypedArray(maxPull)) {\n maxPull = 0;\n for(j = 0; j < trace.pull.length; j++) {\n if(trace.pull[j] > maxPull) maxPull = trace.pull[j];\n }\n }\n return maxPull;\n}\n\nfunction scootLabels(quadrants, trace) {\n var xHalf, yHalf, equatorFirst, farthestX, farthestY,\n xDiffSign, yDiffSign, thisQuad, oppositeQuad,\n wholeSide, i, thisQuadOutside, firstOppositeOutsidePt;\n\n function topFirst(a, b) { return a.pxmid[1] - b.pxmid[1]; }\n function bottomFirst(a, b) { return b.pxmid[1] - a.pxmid[1]; }\n\n function scootOneLabel(thisPt, prevPt) {\n if(!prevPt) prevPt = {};\n\n var prevOuterY = prevPt.labelExtraY + (yHalf ? prevPt.yLabelMax : prevPt.yLabelMin);\n var thisInnerY = yHalf ? thisPt.yLabelMin : thisPt.yLabelMax;\n var thisOuterY = yHalf ? thisPt.yLabelMax : thisPt.yLabelMin;\n var thisSliceOuterY = thisPt.cyFinal + farthestY(thisPt.px0[1], thisPt.px1[1]);\n var newExtraY = prevOuterY - thisInnerY;\n\n var xBuffer, i, otherPt, otherOuterY, otherOuterX, newExtraX;\n\n // make sure this label doesn't overlap other labels\n // this *only* has us move these labels vertically\n if(newExtraY * yDiffSign > 0) thisPt.labelExtraY = newExtraY;\n\n // make sure this label doesn't overlap any slices\n if(!Lib.isArrayOrTypedArray(trace.pull)) return; // this can only happen with array pulls\n\n for(i = 0; i < wholeSide.length; i++) {\n otherPt = wholeSide[i];\n\n // overlap can only happen if the other point is pulled more than this one\n if(otherPt === thisPt || (\n (helpers.castOption(trace.pull, thisPt.pts) || 0) >=\n (helpers.castOption(trace.pull, otherPt.pts) || 0))\n ) {\n continue;\n }\n\n if((thisPt.pxmid[1] - otherPt.pxmid[1]) * yDiffSign > 0) {\n // closer to the equator - by construction all of these happen first\n // move the text vertically to get away from these slices\n otherOuterY = otherPt.cyFinal + farthestY(otherPt.px0[1], otherPt.px1[1]);\n newExtraY = otherOuterY - thisInnerY - thisPt.labelExtraY;\n\n if(newExtraY * yDiffSign > 0) thisPt.labelExtraY += newExtraY;\n } else if((thisOuterY + thisPt.labelExtraY - thisSliceOuterY) * yDiffSign > 0) {\n // farther from the equator - happens after we've done all the\n // vertical moving we're going to do\n // move horizontally to get away from these more polar slices\n\n // if we're moving horz. based on a slice that's several slices away from this one\n // then we need some extra space for the lines to labels between them\n xBuffer = 3 * xDiffSign * Math.abs(i - wholeSide.indexOf(thisPt));\n\n otherOuterX = otherPt.cxFinal + farthestX(otherPt.px0[0], otherPt.px1[0]);\n newExtraX = otherOuterX + xBuffer - (thisPt.cxFinal + thisPt.pxmid[0]) - thisPt.labelExtraX;\n\n if(newExtraX * xDiffSign > 0) thisPt.labelExtraX += newExtraX;\n }\n }\n }\n\n for(yHalf = 0; yHalf < 2; yHalf++) {\n equatorFirst = yHalf ? topFirst : bottomFirst;\n farthestY = yHalf ? Math.max : Math.min;\n yDiffSign = yHalf ? 1 : -1;\n\n for(xHalf = 0; xHalf < 2; xHalf++) {\n farthestX = xHalf ? Math.max : Math.min;\n xDiffSign = xHalf ? 1 : -1;\n\n // first sort the array\n // note this is a copy of cd, so cd itself doesn't get sorted\n // but we can still modify points in place.\n thisQuad = quadrants[yHalf][xHalf];\n thisQuad.sort(equatorFirst);\n\n oppositeQuad = quadrants[1 - yHalf][xHalf];\n wholeSide = oppositeQuad.concat(thisQuad);\n\n thisQuadOutside = [];\n for(i = 0; i < thisQuad.length; i++) {\n if(thisQuad[i].yLabelMid !== undefined) thisQuadOutside.push(thisQuad[i]);\n }\n\n firstOppositeOutsidePt = false;\n for(i = 0; yHalf && i < oppositeQuad.length; i++) {\n if(oppositeQuad[i].yLabelMid !== undefined) {\n firstOppositeOutsidePt = oppositeQuad[i];\n break;\n }\n }\n\n // each needs to avoid the previous\n for(i = 0; i < thisQuadOutside.length; i++) {\n var prevPt = i && thisQuadOutside[i - 1];\n // bottom half needs to avoid the first label of the top half\n // top half we still need to call scootOneLabel on the first slice\n // so we can avoid other slices, but we don't pass a prevPt\n if(firstOppositeOutsidePt && !i) prevPt = firstOppositeOutsidePt;\n scootOneLabel(thisQuadOutside[i], prevPt);\n }\n }\n }\n}\n\nfunction layoutAreas(cdModule, plotSize) {\n var scaleGroups = [];\n\n // figure out the center and maximum radius\n for(var i = 0; i < cdModule.length; i++) {\n var cd0 = cdModule[i][0];\n var trace = cd0.trace;\n\n var domain = trace.domain;\n var width = plotSize.w * (domain.x[1] - domain.x[0]);\n var height = plotSize.h * (domain.y[1] - domain.y[0]);\n // leave some space for the title, if it will be displayed outside\n if(trace.title.text && trace.title.position !== 'middle center') {\n height -= getTitleSpace(cd0, plotSize);\n }\n\n var rx = width / 2;\n var ry = height / 2;\n if(trace.type === 'funnelarea' && !trace.scalegroup) {\n ry /= trace.aspectratio;\n }\n\n cd0.r = Math.min(rx, ry) / (1 + getMaxPull(trace));\n\n cd0.cx = plotSize.l + plotSize.w * (trace.domain.x[1] + trace.domain.x[0]) / 2;\n cd0.cy = plotSize.t + plotSize.h * (1 - trace.domain.y[0]) - height / 2;\n if(trace.title.text && trace.title.position.indexOf('bottom') !== -1) {\n cd0.cy -= getTitleSpace(cd0, plotSize);\n }\n\n if(trace.scalegroup && scaleGroups.indexOf(trace.scalegroup) === -1) {\n scaleGroups.push(trace.scalegroup);\n }\n }\n\n groupScale(cdModule, scaleGroups);\n}\n\nfunction groupScale(cdModule, scaleGroups) {\n var cd0, i, trace;\n\n // scale those that are grouped\n for(var k = 0; k < scaleGroups.length; k++) {\n var min = Infinity;\n var g = scaleGroups[k];\n\n for(i = 0; i < cdModule.length; i++) {\n cd0 = cdModule[i][0];\n trace = cd0.trace;\n\n if(trace.scalegroup === g) {\n var area;\n if(trace.type === 'pie') {\n area = cd0.r * cd0.r;\n } else if(trace.type === 'funnelarea') {\n var rx, ry;\n\n if(trace.aspectratio > 1) {\n rx = cd0.r;\n ry = rx / trace.aspectratio;\n } else {\n ry = cd0.r;\n rx = ry * trace.aspectratio;\n }\n\n rx *= (1 + trace.baseratio) / 2;\n\n area = rx * ry;\n }\n\n min = Math.min(min, area / cd0.vTotal);\n }\n }\n\n for(i = 0; i < cdModule.length; i++) {\n cd0 = cdModule[i][0];\n trace = cd0.trace;\n if(trace.scalegroup === g) {\n var v = min * cd0.vTotal;\n if(trace.type === 'funnelarea') {\n v /= (1 + trace.baseratio) / 2;\n v /= trace.aspectratio;\n }\n\n cd0.r = Math.sqrt(v);\n }\n }\n }\n}\n\nfunction setCoords(cd) {\n var cd0 = cd[0];\n var r = cd0.r;\n var trace = cd0.trace;\n var currentAngle = helpers.getRotationAngle(trace.rotation);\n var angleFactor = 2 * Math.PI / cd0.vTotal;\n var firstPt = 'px0';\n var lastPt = 'px1';\n\n var i, cdi, currentCoords;\n\n if(trace.direction === 'counterclockwise') {\n for(i = 0; i < cd.length; i++) {\n if(!cd[i].hidden) break; // find the first non-hidden slice\n }\n if(i === cd.length) return; // all slices hidden\n\n currentAngle += angleFactor * cd[i].v;\n angleFactor *= -1;\n firstPt = 'px1';\n lastPt = 'px0';\n }\n\n currentCoords = getCoords(r, currentAngle);\n\n for(i = 0; i < cd.length; i++) {\n cdi = cd[i];\n if(cdi.hidden) continue;\n\n cdi[firstPt] = currentCoords;\n\n cdi.startangle = currentAngle;\n currentAngle += angleFactor * cdi.v / 2;\n cdi.pxmid = getCoords(r, currentAngle);\n cdi.midangle = currentAngle;\n currentAngle += angleFactor * cdi.v / 2;\n currentCoords = getCoords(r, currentAngle);\n cdi.stopangle = currentAngle;\n\n cdi[lastPt] = currentCoords;\n\n cdi.largeArc = (cdi.v > cd0.vTotal / 2) ? 1 : 0;\n\n cdi.halfangle = Math.PI * Math.min(cdi.v / cd0.vTotal, 0.5);\n cdi.ring = 1 - trace.hole;\n cdi.rInscribed = getInscribedRadiusFraction(cdi, cd0);\n }\n}\n\nfunction getCoords(r, angle) {\n return [r * Math.sin(angle), -r * Math.cos(angle)];\n}\n\nfunction formatSliceLabel(gd, pt, cd0) {\n var fullLayout = gd._fullLayout;\n var trace = cd0.trace;\n // look for textemplate\n var texttemplate = trace.texttemplate;\n\n // now insert text\n var textinfo = trace.textinfo;\n if(!texttemplate && textinfo && textinfo !== 'none') {\n var parts = textinfo.split('+');\n var hasFlag = function(flag) { return parts.indexOf(flag) !== -1; };\n var hasLabel = hasFlag('label');\n var hasText = hasFlag('text');\n var hasValue = hasFlag('value');\n var hasPercent = hasFlag('percent');\n\n var separators = fullLayout.separators;\n var text;\n\n text = hasLabel ? [pt.label] : [];\n if(hasText) {\n var tx = helpers.getFirstFilled(trace.text, pt.pts);\n if(isValidTextValue(tx)) text.push(tx);\n }\n if(hasValue) text.push(helpers.formatPieValue(pt.v, separators));\n if(hasPercent) text.push(helpers.formatPiePercent(pt.v / cd0.vTotal, separators));\n pt.text = text.join('
');\n }\n\n function makeTemplateVariables(pt) {\n return {\n label: pt.label,\n value: pt.v,\n valueLabel: helpers.formatPieValue(pt.v, fullLayout.separators),\n percent: pt.v / cd0.vTotal,\n percentLabel: helpers.formatPiePercent(pt.v / cd0.vTotal, fullLayout.separators),\n color: pt.color,\n text: pt.text,\n customdata: Lib.castOption(trace, pt.i, 'customdata')\n };\n }\n\n if(texttemplate) {\n var txt = Lib.castOption(trace, pt.i, 'texttemplate');\n if(!txt) {\n pt.text = '';\n } else {\n var obj = makeTemplateVariables(pt);\n var ptTx = helpers.getFirstFilled(trace.text, pt.pts);\n if(isValidTextValue(ptTx) || ptTx === '') obj.text = ptTx;\n pt.text = Lib.texttemplateString(txt, obj, gd._fullLayout._d3locale, obj, trace._meta || {});\n }\n }\n}\n\nfunction computeTransform(\n transform, // inout\n textBB // in\n) {\n var a = transform.rotate * Math.PI / 180;\n var cosA = Math.cos(a);\n var sinA = Math.sin(a);\n var midX = (textBB.left + textBB.right) / 2;\n var midY = (textBB.top + textBB.bottom) / 2;\n transform.textX = midX * cosA - midY * sinA;\n transform.textY = midX * sinA + midY * cosA;\n transform.noCenter = true;\n}\n\nmodule.exports = {\n plot: plot,\n formatSliceLabel: formatSliceLabel,\n transformInsideText: transformInsideText,\n determineInsideTextFont: determineInsideTextFont,\n positionTitleOutside: positionTitleOutside,\n prerenderTitles: prerenderTitles,\n layoutAreas: layoutAreas,\n attachFxHandlers: attachFxHandlers,\n computeTransform: computeTransform\n};\n","'use strict';\n\nvar isNumeric = require('fast-isnumeric');\nvar isArrayOrTypedArray = require('../../lib').isArrayOrTypedArray;\nvar BADNUM = require('../../constants/numerical').BADNUM;\n\nvar Registry = require('../../registry');\nvar Axes = require('../../plots/cartesian/axes');\nvar getAxisGroup = require('../../plots/cartesian/constraints').getAxisGroup;\nvar Sieve = require('./sieve.js');\n\n/*\n * Bar chart stacking/grouping positioning and autoscaling calculations\n * for each direction separately calculate the ranges and positions\n * note that this handles histograms too\n * now doing this one subplot at a time\n */\n\nfunction crossTraceCalc(gd, plotinfo) {\n var xa = plotinfo.xaxis;\n var ya = plotinfo.yaxis;\n\n var fullLayout = gd._fullLayout;\n var fullTraces = gd._fullData;\n var calcTraces = gd.calcdata;\n var calcTracesHorz = [];\n var calcTracesVert = [];\n\n for(var i = 0; i < fullTraces.length; i++) {\n var fullTrace = fullTraces[i];\n if(\n fullTrace.visible === true &&\n Registry.traceIs(fullTrace, 'bar') &&\n fullTrace.xaxis === xa._id &&\n fullTrace.yaxis === ya._id\n ) {\n if(fullTrace.orientation === 'h') {\n calcTracesHorz.push(calcTraces[i]);\n } else {\n calcTracesVert.push(calcTraces[i]);\n }\n\n if(fullTrace._computePh) {\n var cd = gd.calcdata[i];\n for(var j = 0; j < cd.length; j++) {\n if(typeof cd[j].ph0 === 'function') cd[j].ph0 = cd[j].ph0();\n if(typeof cd[j].ph1 === 'function') cd[j].ph1 = cd[j].ph1();\n }\n }\n }\n }\n\n var opts = {\n xCat: xa.type === 'category' || xa.type === 'multicategory',\n yCat: ya.type === 'category' || ya.type === 'multicategory',\n\n mode: fullLayout.barmode,\n norm: fullLayout.barnorm,\n gap: fullLayout.bargap,\n groupgap: fullLayout.bargroupgap\n };\n\n setGroupPositions(gd, xa, ya, calcTracesVert, opts);\n setGroupPositions(gd, ya, xa, calcTracesHorz, opts);\n}\n\nfunction setGroupPositions(gd, pa, sa, calcTraces, opts) {\n if(!calcTraces.length) return;\n\n var excluded;\n var included;\n var i, calcTrace, fullTrace;\n\n initBase(sa, calcTraces);\n\n switch(opts.mode) {\n case 'overlay':\n setGroupPositionsInOverlayMode(pa, sa, calcTraces, opts);\n break;\n\n case 'group':\n // exclude from the group those traces for which the user set an offset\n excluded = [];\n included = [];\n for(i = 0; i < calcTraces.length; i++) {\n calcTrace = calcTraces[i];\n fullTrace = calcTrace[0].trace;\n\n if(fullTrace.offset === undefined) included.push(calcTrace);\n else excluded.push(calcTrace);\n }\n\n if(included.length) {\n setGroupPositionsInGroupMode(gd, pa, sa, included, opts);\n }\n if(excluded.length) {\n setGroupPositionsInOverlayMode(pa, sa, excluded, opts);\n }\n break;\n\n case 'stack':\n case 'relative':\n // exclude from the stack those traces for which the user set a base\n excluded = [];\n included = [];\n for(i = 0; i < calcTraces.length; i++) {\n calcTrace = calcTraces[i];\n fullTrace = calcTrace[0].trace;\n\n if(fullTrace.base === undefined) included.push(calcTrace);\n else excluded.push(calcTrace);\n }\n\n // If any trace in `included` has a cornerradius, set cornerradius of all bars\n // in `included` to match the first trace which has a cornerradius\n standardizeCornerradius(included);\n\n if(included.length) {\n setGroupPositionsInStackOrRelativeMode(gd, pa, sa, included, opts);\n }\n if(excluded.length) {\n setGroupPositionsInOverlayMode(pa, sa, excluded, opts);\n }\n break;\n }\n setCornerradius(calcTraces);\n collectExtents(calcTraces, pa);\n}\n\n// Set cornerradiusvalue and cornerradiusform in calcTraces[0].t\nfunction setCornerradius(calcTraces) {\n var i, calcTrace, fullTrace, t, cr, crValue, crForm;\n\n for(i = 0; i < calcTraces.length; i++) {\n calcTrace = calcTraces[i];\n fullTrace = calcTrace[0].trace;\n t = calcTrace[0].t;\n\n if(t.cornerradiusvalue === undefined) {\n cr = fullTrace.marker ? fullTrace.marker.cornerradius : undefined;\n if(cr !== undefined) {\n crValue = isNumeric(cr) ? +cr : +cr.slice(0, -1);\n crForm = isNumeric(cr) ? 'px' : '%';\n t.cornerradiusvalue = crValue;\n t.cornerradiusform = crForm;\n }\n }\n }\n}\n\n// Make sure all traces in a stack use the same cornerradius\nfunction standardizeCornerradius(calcTraces) {\n if(calcTraces.length < 2) return;\n var i, calcTrace, fullTrace, t;\n var cr, crValue, crForm;\n for(i = 0; i < calcTraces.length; i++) {\n calcTrace = calcTraces[i];\n fullTrace = calcTrace[0].trace;\n cr = fullTrace.marker ? fullTrace.marker.cornerradius : undefined;\n if(cr !== undefined) break;\n }\n // If any trace has cornerradius, store first cornerradius\n // in calcTrace[0].t so that all traces in stack use same cornerradius\n if(cr !== undefined) {\n crValue = isNumeric(cr) ? +cr : +cr.slice(0, -1);\n crForm = isNumeric(cr) ? 'px' : '%';\n for(i = 0; i < calcTraces.length; i++) {\n calcTrace = calcTraces[i];\n t = calcTrace[0].t;\n\n t.cornerradiusvalue = crValue;\n t.cornerradiusform = crForm;\n }\n }\n}\n\nfunction initBase(sa, calcTraces) {\n var i, j;\n\n for(i = 0; i < calcTraces.length; i++) {\n var cd = calcTraces[i];\n var trace = cd[0].trace;\n var base = (trace.type === 'funnel') ? trace._base : trace.base;\n var b;\n\n // not sure if it really makes sense to have dates for bar size data...\n // ideally if we want to make gantt charts or something we'd treat\n // the actual size (trace.x or y) as time delta but base as absolute\n // time. But included here for completeness.\n var scalendar = trace.orientation === 'h' ? trace.xcalendar : trace.ycalendar;\n\n // 'base' on categorical axes makes no sense\n var d2c = sa.type === 'category' || sa.type === 'multicategory' ?\n function() { return null; } :\n sa.d2c;\n\n if(isArrayOrTypedArray(base)) {\n for(j = 0; j < Math.min(base.length, cd.length); j++) {\n b = d2c(base[j], 0, scalendar);\n if(isNumeric(b)) {\n cd[j].b = +b;\n cd[j].hasB = 1;\n } else cd[j].b = 0;\n }\n for(; j < cd.length; j++) {\n cd[j].b = 0;\n }\n } else {\n b = d2c(base, 0, scalendar);\n var hasBase = isNumeric(b);\n b = hasBase ? b : 0;\n for(j = 0; j < cd.length; j++) {\n cd[j].b = b;\n if(hasBase) cd[j].hasB = 1;\n }\n }\n }\n}\n\nfunction setGroupPositionsInOverlayMode(pa, sa, calcTraces, opts) {\n // update position axis and set bar offsets and widths\n for(var i = 0; i < calcTraces.length; i++) {\n var calcTrace = calcTraces[i];\n\n var sieve = new Sieve([calcTrace], {\n posAxis: pa,\n sepNegVal: false,\n overlapNoMerge: !opts.norm\n });\n\n // set bar offsets and widths, and update position axis\n setOffsetAndWidth(pa, sieve, opts);\n\n // set bar bases and sizes, and update size axis\n //\n // (note that `setGroupPositionsInOverlayMode` handles the case barnorm\n // is defined, because this function is also invoked for traces that\n // can't be grouped or stacked)\n if(opts.norm) {\n sieveBars(sieve);\n normalizeBars(sa, sieve, opts);\n } else {\n setBaseAndTop(sa, sieve);\n }\n }\n}\n\nfunction setGroupPositionsInGroupMode(gd, pa, sa, calcTraces, opts) {\n var sieve = new Sieve(calcTraces, {\n posAxis: pa,\n sepNegVal: false,\n overlapNoMerge: !opts.norm\n });\n\n // set bar offsets and widths, and update position axis\n setOffsetAndWidthInGroupMode(gd, pa, sieve, opts);\n\n // relative-stack bars within the same trace that would otherwise\n // be hidden\n unhideBarsWithinTrace(sieve, pa);\n\n // set bar bases and sizes, and update size axis\n if(opts.norm) {\n sieveBars(sieve);\n normalizeBars(sa, sieve, opts);\n } else {\n setBaseAndTop(sa, sieve);\n }\n}\n\nfunction setGroupPositionsInStackOrRelativeMode(gd, pa, sa, calcTraces, opts) {\n var sieve = new Sieve(calcTraces, {\n posAxis: pa,\n sepNegVal: opts.mode === 'relative',\n overlapNoMerge: !(opts.norm || opts.mode === 'stack' || opts.mode === 'relative')\n });\n\n // set bar offsets and widths, and update position axis\n setOffsetAndWidth(pa, sieve, opts);\n\n // set bar bases and sizes, and update size axis\n stackBars(sa, sieve, opts);\n\n // flag the outmost bar (for text display purposes)\n for(var i = 0; i < calcTraces.length; i++) {\n var calcTrace = calcTraces[i];\n\n for(var j = 0; j < calcTrace.length; j++) {\n var bar = calcTrace[j];\n\n if(bar.s !== BADNUM) {\n var isOutmostBar = ((bar.b + bar.s) === sieve.get(bar.p, bar.s));\n if(isOutmostBar) bar._outmost = true;\n }\n }\n }\n\n // Note that marking the outmost bars has to be done\n // before `normalizeBars` changes `bar.b` and `bar.s`.\n if(opts.norm) normalizeBars(sa, sieve, opts);\n}\n\nfunction setOffsetAndWidth(pa, sieve, opts) {\n var minDiff = sieve.minDiff;\n var calcTraces = sieve.traces;\n\n // set bar offsets and widths\n var barGroupWidth = minDiff * (1 - opts.gap);\n var barWidthPlusGap = barGroupWidth;\n var barWidth = barWidthPlusGap * (1 - (opts.groupgap || 0));\n\n // computer bar group center and bar offset\n var offsetFromCenter = -barWidth / 2;\n\n for(var i = 0; i < calcTraces.length; i++) {\n var calcTrace = calcTraces[i];\n var t = calcTrace[0].t;\n\n // store bar width and offset for this trace\n t.barwidth = barWidth;\n t.poffset = offsetFromCenter;\n t.bargroupwidth = barGroupWidth;\n t.bardelta = minDiff;\n }\n\n // stack bars that only differ by rounding\n sieve.binWidth = calcTraces[0][0].t.barwidth / 100;\n\n // if defined, apply trace offset and width\n applyAttributes(sieve);\n\n // store the bar center in each calcdata item\n setBarCenterAndWidth(pa, sieve);\n\n // update position axes\n updatePositionAxis(pa, sieve);\n}\n\nfunction setOffsetAndWidthInGroupMode(gd, pa, sieve, opts) {\n var fullLayout = gd._fullLayout;\n var positions = sieve.positions;\n var distinctPositions = sieve.distinctPositions;\n var minDiff = sieve.minDiff;\n var calcTraces = sieve.traces;\n var nTraces = calcTraces.length;\n\n // if there aren't any overlapping positions,\n // let them have full width even if mode is group\n var overlap = (positions.length !== distinctPositions.length);\n var barGroupWidth = minDiff * (1 - opts.gap);\n\n var groupId = getAxisGroup(fullLayout, pa._id) + calcTraces[0][0].trace.orientation;\n var alignmentGroups = fullLayout._alignmentOpts[groupId] || {};\n\n for(var i = 0; i < nTraces; i++) {\n var calcTrace = calcTraces[i];\n var trace = calcTrace[0].trace;\n\n var alignmentGroupOpts = alignmentGroups[trace.alignmentgroup] || {};\n var nOffsetGroups = Object.keys(alignmentGroupOpts.offsetGroups || {}).length;\n\n var barWidthPlusGap;\n if(nOffsetGroups) {\n barWidthPlusGap = barGroupWidth / nOffsetGroups;\n } else {\n barWidthPlusGap = overlap ? barGroupWidth / nTraces : barGroupWidth;\n }\n\n var barWidth = barWidthPlusGap * (1 - (opts.groupgap || 0));\n\n var offsetFromCenter;\n if(nOffsetGroups) {\n offsetFromCenter = ((2 * trace._offsetIndex + 1 - nOffsetGroups) * barWidthPlusGap - barWidth) / 2;\n } else {\n offsetFromCenter = overlap ?\n ((2 * i + 1 - nTraces) * barWidthPlusGap - barWidth) / 2 :\n -barWidth / 2;\n }\n\n var t = calcTrace[0].t;\n t.barwidth = barWidth;\n t.poffset = offsetFromCenter;\n t.bargroupwidth = barGroupWidth;\n t.bardelta = minDiff;\n }\n\n // stack bars that only differ by rounding\n sieve.binWidth = calcTraces[0][0].t.barwidth / 100;\n\n // if defined, apply trace width\n applyAttributes(sieve);\n\n // store the bar center in each calcdata item\n setBarCenterAndWidth(pa, sieve);\n\n // update position axes\n updatePositionAxis(pa, sieve, overlap);\n}\n\nfunction applyAttributes(sieve) {\n var calcTraces = sieve.traces;\n var i, j;\n\n for(i = 0; i < calcTraces.length; i++) {\n var calcTrace = calcTraces[i];\n var calcTrace0 = calcTrace[0];\n var fullTrace = calcTrace0.trace;\n var t = calcTrace0.t;\n var offset = fullTrace._offset || fullTrace.offset;\n var initialPoffset = t.poffset;\n var newPoffset;\n\n if(isArrayOrTypedArray(offset)) {\n // if offset is an array, then clone it into t.poffset.\n newPoffset = Array.prototype.slice.call(offset, 0, calcTrace.length);\n\n // guard against non-numeric items\n for(j = 0; j < newPoffset.length; j++) {\n if(!isNumeric(newPoffset[j])) {\n newPoffset[j] = initialPoffset;\n }\n }\n\n // if the length of the array is too short,\n // then extend it with the initial value of t.poffset\n for(j = newPoffset.length; j < calcTrace.length; j++) {\n newPoffset.push(initialPoffset);\n }\n\n t.poffset = newPoffset;\n } else if(offset !== undefined) {\n t.poffset = offset;\n }\n\n var width = fullTrace._width || fullTrace.width;\n var initialBarwidth = t.barwidth;\n\n if(isArrayOrTypedArray(width)) {\n // if width is an array, then clone it into t.barwidth.\n var newBarwidth = Array.prototype.slice.call(width, 0, calcTrace.length);\n\n // guard against non-numeric items\n for(j = 0; j < newBarwidth.length; j++) {\n if(!isNumeric(newBarwidth[j])) newBarwidth[j] = initialBarwidth;\n }\n\n // if the length of the array is too short,\n // then extend it with the initial value of t.barwidth\n for(j = newBarwidth.length; j < calcTrace.length; j++) {\n newBarwidth.push(initialBarwidth);\n }\n\n t.barwidth = newBarwidth;\n\n // if user didn't set offset,\n // then correct t.poffset to ensure bars remain centered\n if(offset === undefined) {\n newPoffset = [];\n for(j = 0; j < calcTrace.length; j++) {\n newPoffset.push(\n initialPoffset + (initialBarwidth - newBarwidth[j]) / 2\n );\n }\n t.poffset = newPoffset;\n }\n } else if(width !== undefined) {\n t.barwidth = width;\n\n // if user didn't set offset,\n // then correct t.poffset to ensure bars remain centered\n if(offset === undefined) {\n t.poffset = initialPoffset + (initialBarwidth - width) / 2;\n }\n }\n }\n}\n\nfunction setBarCenterAndWidth(pa, sieve) {\n var calcTraces = sieve.traces;\n var pLetter = getAxisLetter(pa);\n\n for(var i = 0; i < calcTraces.length; i++) {\n var calcTrace = calcTraces[i];\n var t = calcTrace[0].t;\n var poffset = t.poffset;\n var poffsetIsArray = isArrayOrTypedArray(poffset);\n var barwidth = t.barwidth;\n var barwidthIsArray = isArrayOrTypedArray(barwidth);\n\n for(var j = 0; j < calcTrace.length; j++) {\n var calcBar = calcTrace[j];\n\n // store the actual bar width and position, for use by hover\n var width = calcBar.w = barwidthIsArray ? barwidth[j] : barwidth;\n\n if(calcBar.p === undefined) {\n calcBar.p = calcBar[pLetter];\n calcBar['orig_' + pLetter] = calcBar[pLetter];\n }\n\n var delta = (poffsetIsArray ? poffset[j] : poffset) + width / 2;\n calcBar[pLetter] = calcBar.p + delta;\n }\n }\n}\n\nfunction updatePositionAxis(pa, sieve, allowMinDtick) {\n var calcTraces = sieve.traces;\n var minDiff = sieve.minDiff;\n var vpad = minDiff / 2;\n\n Axes.minDtick(pa, sieve.minDiff, sieve.distinctPositions[0], allowMinDtick);\n\n for(var i = 0; i < calcTraces.length; i++) {\n var calcTrace = calcTraces[i];\n var calcTrace0 = calcTrace[0];\n var fullTrace = calcTrace0.trace;\n var pts = [];\n var bar, l, r, j;\n\n for(j = 0; j < calcTrace.length; j++) {\n bar = calcTrace[j];\n l = bar.p - vpad;\n r = bar.p + vpad;\n pts.push(l, r);\n }\n\n if(fullTrace.width || fullTrace.offset) {\n var t = calcTrace0.t;\n var poffset = t.poffset;\n var barwidth = t.barwidth;\n var poffsetIsArray = isArrayOrTypedArray(poffset);\n var barwidthIsArray = isArrayOrTypedArray(barwidth);\n\n for(j = 0; j < calcTrace.length; j++) {\n bar = calcTrace[j];\n var calcBarOffset = poffsetIsArray ? poffset[j] : poffset;\n var calcBarWidth = barwidthIsArray ? barwidth[j] : barwidth;\n l = bar.p + calcBarOffset;\n r = l + calcBarWidth;\n pts.push(l, r);\n }\n }\n\n fullTrace._extremes[pa._id] = Axes.findExtremes(pa, pts, {padded: false});\n }\n}\n\n// store these bar bases and tops in calcdata\n// and make sure the size axis includes zero,\n// along with the bases and tops of each bar.\nfunction setBaseAndTop(sa, sieve) {\n var calcTraces = sieve.traces;\n var sLetter = getAxisLetter(sa);\n\n for(var i = 0; i < calcTraces.length; i++) {\n var calcTrace = calcTraces[i];\n var fullTrace = calcTrace[0].trace;\n var isScatter = fullTrace.type === 'scatter';\n var isVertical = fullTrace.orientation === 'v';\n var pts = [];\n var tozero = false;\n\n for(var j = 0; j < calcTrace.length; j++) {\n var bar = calcTrace[j];\n var base = isScatter ? 0 : bar.b;\n var top = isScatter ? (\n isVertical ? bar.y : bar.x\n ) : base + bar.s;\n\n bar[sLetter] = top;\n pts.push(top);\n if(bar.hasB) pts.push(base);\n\n if(!bar.hasB || !bar.b) {\n tozero = true;\n }\n }\n\n fullTrace._extremes[sa._id] = Axes.findExtremes(sa, pts, {\n tozero: tozero,\n padded: true\n });\n }\n}\n\nfunction stackBars(sa, sieve, opts) {\n var sLetter = getAxisLetter(sa);\n var calcTraces = sieve.traces;\n var calcTrace;\n var fullTrace;\n var isFunnel;\n var i, j;\n var bar;\n\n for(i = 0; i < calcTraces.length; i++) {\n calcTrace = calcTraces[i];\n fullTrace = calcTrace[0].trace;\n\n if(fullTrace.type === 'funnel') {\n for(j = 0; j < calcTrace.length; j++) {\n bar = calcTrace[j];\n\n if(bar.s !== BADNUM) {\n // create base of funnels\n sieve.put(bar.p, -0.5 * bar.s);\n }\n }\n }\n }\n\n for(i = 0; i < calcTraces.length; i++) {\n calcTrace = calcTraces[i];\n fullTrace = calcTrace[0].trace;\n\n isFunnel = (fullTrace.type === 'funnel');\n\n var pts = [];\n\n for(j = 0; j < calcTrace.length; j++) {\n bar = calcTrace[j];\n\n if(bar.s !== BADNUM) {\n // stack current bar and get previous sum\n var value;\n if(isFunnel) {\n value = bar.s;\n } else {\n value = bar.s + bar.b;\n }\n\n var base = sieve.put(bar.p, value);\n\n var top = base + value;\n\n // store the bar base and top in each calcdata item\n bar.b = base;\n bar[sLetter] = top;\n\n if(!opts.norm) {\n pts.push(top);\n if(bar.hasB) {\n pts.push(base);\n }\n }\n }\n }\n\n // if barnorm is set, let normalizeBars update the axis range\n if(!opts.norm) {\n fullTrace._extremes[sa._id] = Axes.findExtremes(sa, pts, {\n // N.B. we don't stack base with 'base',\n // so set tozero:true always!\n tozero: true,\n padded: true\n });\n }\n }\n}\n\nfunction sieveBars(sieve) {\n var calcTraces = sieve.traces;\n\n for(var i = 0; i < calcTraces.length; i++) {\n var calcTrace = calcTraces[i];\n\n for(var j = 0; j < calcTrace.length; j++) {\n var bar = calcTrace[j];\n\n if(bar.s !== BADNUM) {\n sieve.put(bar.p, bar.b + bar.s);\n }\n }\n }\n}\n\nfunction unhideBarsWithinTrace(sieve, pa) {\n var calcTraces = sieve.traces;\n\n for(var i = 0; i < calcTraces.length; i++) {\n var calcTrace = calcTraces[i];\n var fullTrace = calcTrace[0].trace;\n\n if(fullTrace.base === undefined) {\n var inTraceSieve = new Sieve([calcTrace], {\n posAxis: pa,\n sepNegVal: true,\n overlapNoMerge: true\n });\n\n for(var j = 0; j < calcTrace.length; j++) {\n var bar = calcTrace[j];\n\n if(bar.p !== BADNUM) {\n // stack current bar and get previous sum\n var base = inTraceSieve.put(bar.p, bar.b + bar.s);\n\n // if previous sum if non-zero, this means:\n // multiple bars have same starting point are potentially hidden,\n // shift them vertically so that all bars are visible by default\n if(base) bar.b = base;\n }\n }\n }\n }\n}\n\n// Note:\n//\n// normalizeBars requires that either sieveBars or stackBars has been\n// previously invoked.\nfunction normalizeBars(sa, sieve, opts) {\n var calcTraces = sieve.traces;\n var sLetter = getAxisLetter(sa);\n var sTop = opts.norm === 'fraction' ? 1 : 100;\n var sTiny = sTop / 1e9; // in case of rounding error in sum\n var sMin = sa.l2c(sa.c2l(0));\n var sMax = opts.mode === 'stack' ? sTop : sMin;\n\n function needsPadding(v) {\n return (\n isNumeric(sa.c2l(v)) &&\n ((v < sMin - sTiny) || (v > sMax + sTiny) || !isNumeric(sMin))\n );\n }\n\n for(var i = 0; i < calcTraces.length; i++) {\n var calcTrace = calcTraces[i];\n var fullTrace = calcTrace[0].trace;\n var pts = [];\n var tozero = false;\n var padded = false;\n\n for(var j = 0; j < calcTrace.length; j++) {\n var bar = calcTrace[j];\n\n if(bar.s !== BADNUM) {\n var scale = Math.abs(sTop / sieve.get(bar.p, bar.s));\n bar.b *= scale;\n bar.s *= scale;\n\n var base = bar.b;\n var top = base + bar.s;\n\n bar[sLetter] = top;\n pts.push(top);\n padded = padded || needsPadding(top);\n\n if(bar.hasB) {\n pts.push(base);\n padded = padded || needsPadding(base);\n }\n\n if(!bar.hasB || !bar.b) {\n tozero = true;\n }\n }\n }\n\n fullTrace._extremes[sa._id] = Axes.findExtremes(sa, pts, {\n tozero: tozero,\n padded: padded\n });\n }\n}\n\n// Add an `_sMin` and `_sMax` value for each bar representing the min and max size value\n// across all bars sharing the same position as that bar. These values are used for rounded\n// bar corners, to carry rounding down to lower bars in the stack as needed.\nfunction setHelperValuesForRoundedCorners(calcTraces, sMinByPos, sMaxByPos, pa) {\n var pLetter = getAxisLetter(pa);\n // Set `_sMin` and `_sMax` value for each bar\n for(var i = 0; i < calcTraces.length; i++) {\n var calcTrace = calcTraces[i];\n for(var j = 0; j < calcTrace.length; j++) {\n var bar = calcTrace[j];\n var pos = bar[pLetter];\n bar._sMin = sMinByPos[pos];\n bar._sMax = sMaxByPos[pos];\n }\n }\n}\n\n// find the full position span of bars at each position\n// for use by hover, to ensure labels move in if bars are\n// narrower than the space they're in.\n// run once per trace group (subplot & direction) and\n// the same mapping is attached to all calcdata traces\nfunction collectExtents(calcTraces, pa) {\n var pLetter = getAxisLetter(pa);\n var extents = {};\n var i, j, cd;\n\n var pMin = Infinity;\n var pMax = -Infinity;\n\n for(i = 0; i < calcTraces.length; i++) {\n cd = calcTraces[i];\n for(j = 0; j < cd.length; j++) {\n var p = cd[j].p;\n if(isNumeric(p)) {\n pMin = Math.min(pMin, p);\n pMax = Math.max(pMax, p);\n }\n }\n }\n\n // this is just for positioning of hover labels, and nobody will care if\n // the label is 1px too far out; so round positions to 1/10K in case\n // position values don't exactly match from trace to trace\n var roundFactor = 10000 / (pMax - pMin);\n var round = extents.round = function(p) {\n return String(Math.round(roundFactor * (p - pMin)));\n };\n\n // Find min and max size axis extent for each position\n // This is used for rounded bar corners, to carry rounding\n // down to lower bars in the case of stacked bars\n var sMinByPos = {};\n var sMaxByPos = {};\n\n // Check whether any trace has rounded corners\n var anyTraceHasCornerradius = calcTraces.some(function(x) {\n var trace = x[0].trace;\n return 'marker' in trace && trace.marker.cornerradius;\n });\n\n for(i = 0; i < calcTraces.length; i++) {\n cd = calcTraces[i];\n cd[0].t.extents = extents;\n\n var poffset = cd[0].t.poffset;\n var poffsetIsArray = isArrayOrTypedArray(poffset);\n\n for(j = 0; j < cd.length; j++) {\n var di = cd[j];\n var p0 = di[pLetter] - di.w / 2;\n\n if(isNumeric(p0)) {\n var p1 = di[pLetter] + di.w / 2;\n var pVal = round(di.p);\n if(extents[pVal]) {\n extents[pVal] = [Math.min(p0, extents[pVal][0]), Math.max(p1, extents[pVal][1])];\n } else {\n extents[pVal] = [p0, p1];\n }\n }\n\n di.p0 = di.p + (poffsetIsArray ? poffset[j] : poffset);\n di.p1 = di.p0 + di.w;\n di.s0 = di.b;\n di.s1 = di.s0 + di.s;\n\n if(anyTraceHasCornerradius) {\n var sMin = Math.min(di.s0, di.s1) || 0;\n var sMax = Math.max(di.s0, di.s1) || 0;\n var pos = di[pLetter];\n sMinByPos[pos] = (pos in sMinByPos) ? Math.min(sMinByPos[pos], sMin) : sMin;\n sMaxByPos[pos] = (pos in sMaxByPos) ? Math.max(sMaxByPos[pos], sMax) : sMax;\n }\n }\n }\n if(anyTraceHasCornerradius) {\n setHelperValuesForRoundedCorners(calcTraces, sMinByPos, sMaxByPos, pa);\n }\n}\n\nfunction getAxisLetter(ax) {\n return ax._id.charAt(0);\n}\n\nmodule.exports = {\n crossTraceCalc: crossTraceCalc,\n setGroupPositions: setGroupPositions\n};\n","'use strict';\n\nvar isNumeric = require('fast-isnumeric');\n\nvar Lib = require('../../lib');\nvar Registry = require('../../registry');\nvar Axes = require('../../plots/cartesian/axes');\n\nvar arraysToCalcdata = require('../bar/arrays_to_calcdata');\nvar binFunctions = require('./bin_functions');\nvar normFunctions = require('./norm_functions');\nvar doAvg = require('./average');\nvar getBinSpanLabelRound = require('./bin_label_vals');\n\nfunction calc(gd, trace) {\n var pos = [];\n var size = [];\n var isHorizontal = trace.orientation === 'h';\n var pa = Axes.getFromId(gd, isHorizontal ? trace.yaxis : trace.xaxis);\n var mainData = isHorizontal ? 'y' : 'x';\n var counterData = {x: 'y', y: 'x'}[mainData];\n var calendar = trace[mainData + 'calendar'];\n var cumulativeSpec = trace.cumulative;\n var i;\n\n var binsAndPos = calcAllAutoBins(gd, trace, pa, mainData);\n var binSpec = binsAndPos[0];\n var pos0 = binsAndPos[1];\n\n var nonuniformBins = typeof binSpec.size === 'string';\n var binEdges = [];\n var bins = nonuniformBins ? binEdges : binSpec;\n // make the empty bin array\n var inc = [];\n var counts = [];\n var inputPoints = [];\n var total = 0;\n var norm = trace.histnorm;\n var func = trace.histfunc;\n var densityNorm = norm.indexOf('density') !== -1;\n var i2, binEnd, n;\n\n if(cumulativeSpec.enabled && densityNorm) {\n // we treat \"cumulative\" like it means \"integral\" if you use a density norm,\n // which in the end means it's the same as without \"density\"\n norm = norm.replace(/ ?density$/, '');\n densityNorm = false;\n }\n\n var extremeFunc = func === 'max' || func === 'min';\n var sizeInit = extremeFunc ? null : 0;\n var binFunc = binFunctions.count;\n var normFunc = normFunctions[norm];\n var isAvg = false;\n var pr2c = function(v) { return pa.r2c(v, 0, calendar); };\n var rawCounterData;\n\n if(Lib.isArrayOrTypedArray(trace[counterData]) && func !== 'count') {\n rawCounterData = trace[counterData];\n isAvg = func === 'avg';\n binFunc = binFunctions[func];\n }\n\n // create the bins (and any extra arrays needed)\n // assume more than 1e6 bins is an error, so we don't crash the browser\n i = pr2c(binSpec.start);\n\n // decrease end a little in case of rounding errors\n binEnd = pr2c(binSpec.end) + (i - Axes.tickIncrement(i, binSpec.size, false, calendar)) / 1e6;\n\n while(i < binEnd && pos.length < 1e6) {\n i2 = Axes.tickIncrement(i, binSpec.size, false, calendar);\n pos.push((i + i2) / 2);\n size.push(sizeInit);\n inputPoints.push([]);\n // nonuniform bins (like months) we need to search,\n // rather than straight calculate the bin we're in\n binEdges.push(i);\n // nonuniform bins also need nonuniform normalization factors\n if(densityNorm) inc.push(1 / (i2 - i));\n if(isAvg) counts.push(0);\n // break to avoid infinite loops\n if(i2 <= i) break;\n i = i2;\n }\n binEdges.push(i);\n\n // for date axes we need bin bounds to be calcdata. For nonuniform bins\n // we already have this, but uniform with start/end/size they're still strings.\n if(!nonuniformBins && pa.type === 'date') {\n bins = {\n start: pr2c(bins.start),\n end: pr2c(bins.end),\n size: bins.size\n };\n }\n\n // stash left and right gaps by group\n if(!gd._fullLayout._roundFnOpts) gd._fullLayout._roundFnOpts = {};\n var groupName = trace['_' + mainData + 'bingroup'];\n var roundFnOpts = {leftGap: Infinity, rightGap: Infinity};\n if(groupName) {\n if(!gd._fullLayout._roundFnOpts[groupName]) gd._fullLayout._roundFnOpts[groupName] = roundFnOpts;\n roundFnOpts = gd._fullLayout._roundFnOpts[groupName];\n }\n\n // bin the data\n // and make histogram-specific pt-number-to-cd-index map object\n var nMax = size.length;\n var uniqueValsPerBin = true;\n var leftGap = roundFnOpts.leftGap;\n var rightGap = roundFnOpts.rightGap;\n var ptNumber2cdIndex = {};\n for(i = 0; i < pos0.length; i++) {\n var posi = pos0[i];\n n = Lib.findBin(posi, bins);\n if(n >= 0 && n < nMax) {\n total += binFunc(n, i, size, rawCounterData, counts);\n if(uniqueValsPerBin && inputPoints[n].length && posi !== pos0[inputPoints[n][0]]) {\n uniqueValsPerBin = false;\n }\n inputPoints[n].push(i);\n ptNumber2cdIndex[i] = n;\n\n leftGap = Math.min(leftGap, posi - binEdges[n]);\n rightGap = Math.min(rightGap, binEdges[n + 1] - posi);\n }\n }\n roundFnOpts.leftGap = leftGap;\n roundFnOpts.rightGap = rightGap;\n\n var roundFn;\n if(!uniqueValsPerBin) {\n roundFn = function(v, isRightEdge) {\n return function() {\n var roundFnOpts = gd._fullLayout._roundFnOpts[groupName];\n return getBinSpanLabelRound(\n roundFnOpts.leftGap,\n roundFnOpts.rightGap,\n binEdges, pa, calendar\n )(v, isRightEdge);\n };\n };\n }\n\n // average and/or normalize the data, if needed\n if(isAvg) total = doAvg(size, counts);\n if(normFunc) normFunc(size, total, inc);\n\n // after all normalization etc, now we can accumulate if desired\n if(cumulativeSpec.enabled) cdf(size, cumulativeSpec.direction, cumulativeSpec.currentbin);\n\n var seriesLen = Math.min(pos.length, size.length);\n var cd = [];\n var firstNonzero = 0;\n var lastNonzero = seriesLen - 1;\n\n // look for empty bins at the ends to remove, so autoscale omits them\n for(i = 0; i < seriesLen; i++) {\n if(size[i]) {\n firstNonzero = i;\n break;\n }\n }\n for(i = seriesLen - 1; i >= firstNonzero; i--) {\n if(size[i]) {\n lastNonzero = i;\n break;\n }\n }\n\n // create the \"calculated data\" to plot\n for(i = firstNonzero; i <= lastNonzero; i++) {\n if((isNumeric(pos[i]) && isNumeric(size[i]))) {\n var cdi = {\n p: pos[i],\n s: size[i],\n b: 0\n };\n\n // setup hover and event data fields,\n // N.B. pts and \"hover\" positions ph0/ph1 don't seem to make much sense\n // for cumulative distributions\n if(!cumulativeSpec.enabled) {\n cdi.pts = inputPoints[i];\n if(uniqueValsPerBin) {\n cdi.ph0 = cdi.ph1 = (inputPoints[i].length) ? pos0[inputPoints[i][0]] : pos[i];\n } else {\n // Defer evaluation of ph(0|1) in crossTraceCalc\n trace._computePh = true;\n cdi.ph0 = roundFn(binEdges[i]);\n cdi.ph1 = roundFn(binEdges[i + 1], true);\n }\n }\n cd.push(cdi);\n }\n }\n\n if(cd.length === 1) {\n // when we collapse to a single bin, calcdata no longer describes bin size\n // so we need to explicitly specify it\n cd[0].width1 = Axes.tickIncrement(cd[0].p, binSpec.size, false, calendar) - cd[0].p;\n }\n\n arraysToCalcdata(cd, trace);\n\n if(Lib.isArrayOrTypedArray(trace.selectedpoints)) {\n Lib.tagSelected(cd, trace, ptNumber2cdIndex);\n }\n\n return cd;\n}\n\n/*\n * calcAllAutoBins: we want all histograms inside the same bingroup\n * (see logic in Histogram.crossTraceDefaults) to share bin specs\n *\n * If the user has explicitly specified differing\n * bin specs, there's nothing we can do, but if possible we will try to use the\n * smallest bins of any of the auto values for all histograms inside the same\n * bingroup.\n */\nfunction calcAllAutoBins(gd, trace, pa, mainData, _overlayEdgeCase) {\n var binAttr = mainData + 'bins';\n var fullLayout = gd._fullLayout;\n var groupName = trace['_' + mainData + 'bingroup'];\n var binOpts = fullLayout._histogramBinOpts[groupName];\n var isOverlay = fullLayout.barmode === 'overlay';\n var i, traces, tracei, calendar, pos0, autoVals, cumulativeSpec;\n\n var r2c = function(v) { return pa.r2c(v, 0, calendar); };\n var c2r = function(v) { return pa.c2r(v, 0, calendar); };\n\n var cleanBound = pa.type === 'date' ?\n function(v) { return (v || v === 0) ? Lib.cleanDate(v, null, calendar) : null; } :\n function(v) { return isNumeric(v) ? Number(v) : null; };\n\n function setBound(attr, bins, newBins) {\n if(bins[attr + 'Found']) {\n bins[attr] = cleanBound(bins[attr]);\n if(bins[attr] === null) bins[attr] = newBins[attr];\n } else {\n autoVals[attr] = bins[attr] = newBins[attr];\n Lib.nestedProperty(traces[0], binAttr + '.' + attr).set(newBins[attr]);\n }\n }\n\n // all but the first trace in this group has already been marked finished\n // clear this flag, so next time we run calc we will run autobin again\n if(trace['_' + mainData + 'autoBinFinished']) {\n delete trace['_' + mainData + 'autoBinFinished'];\n } else {\n traces = binOpts.traces;\n var allPos = [];\n\n // Note: we're including `legendonly` traces here for autobin purposes,\n // so that showing & hiding from the legend won't affect bins.\n // But this complicates things a bit since those traces don't `calc`,\n // hence `isFirstVisible`.\n var isFirstVisible = true;\n var has2dMap = false;\n var hasHist2dContour = false;\n for(i = 0; i < traces.length; i++) {\n tracei = traces[i];\n\n if(tracei.visible) {\n var mainDatai = binOpts.dirs[i];\n pos0 = tracei['_' + mainDatai + 'pos0'] = pa.makeCalcdata(tracei, mainDatai);\n\n allPos = Lib.concat(allPos, pos0);\n delete tracei['_' + mainData + 'autoBinFinished'];\n\n if(trace.visible === true) {\n if(isFirstVisible) {\n isFirstVisible = false;\n } else {\n delete tracei._autoBin;\n tracei['_' + mainData + 'autoBinFinished'] = 1;\n }\n if(Registry.traceIs(tracei, '2dMap')) {\n has2dMap = true;\n }\n if(tracei.type === 'histogram2dcontour') {\n hasHist2dContour = true;\n }\n }\n }\n }\n\n calendar = traces[0][mainData + 'calendar'];\n var newBinSpec = Axes.autoBin(allPos, pa, binOpts.nbins, has2dMap, calendar, binOpts.sizeFound && binOpts.size);\n\n var autoBin = traces[0]._autoBin = {};\n autoVals = autoBin[binOpts.dirs[0]] = {};\n\n if(hasHist2dContour) {\n // the \"true\" 2nd argument reverses the tick direction (which we can't\n // just do with a minus sign because of month bins)\n if(!binOpts.size) {\n newBinSpec.start = c2r(Axes.tickIncrement(\n r2c(newBinSpec.start), newBinSpec.size, true, calendar));\n }\n if(binOpts.end === undefined) {\n newBinSpec.end = c2r(Axes.tickIncrement(\n r2c(newBinSpec.end), newBinSpec.size, false, calendar));\n }\n }\n\n // Edge case: single-valued histogram overlaying others\n // Use them all together to calculate the bin size for the single-valued one\n // Don't re-calculate bin width if user manually specified it (checing in bingroup=='' or xbins is defined)\n if(isOverlay && !Registry.traceIs(trace, '2dMap') && newBinSpec._dataSpan === 0 &&\n pa.type !== 'category' && pa.type !== 'multicategory' &&\n trace.bingroup === '' && (typeof trace.xbins === 'undefined')) {\n // Several single-valued histograms! Stop infinite recursion,\n // just return an extra flag that tells handleSingleValueOverlays\n // to sort out this trace too\n if(_overlayEdgeCase) return [newBinSpec, pos0, true];\n\n newBinSpec = handleSingleValueOverlays(gd, trace, pa, mainData, binAttr);\n }\n\n // adjust for CDF edge cases\n cumulativeSpec = tracei.cumulative || {};\n if(cumulativeSpec.enabled && (cumulativeSpec.currentbin !== 'include')) {\n if(cumulativeSpec.direction === 'decreasing') {\n newBinSpec.start = c2r(Axes.tickIncrement(\n r2c(newBinSpec.start), newBinSpec.size, true, calendar));\n } else {\n newBinSpec.end = c2r(Axes.tickIncrement(\n r2c(newBinSpec.end), newBinSpec.size, false, calendar));\n }\n }\n\n binOpts.size = newBinSpec.size;\n if(!binOpts.sizeFound) {\n autoVals.size = newBinSpec.size;\n Lib.nestedProperty(traces[0], binAttr + '.size').set(newBinSpec.size);\n }\n\n setBound('start', binOpts, newBinSpec);\n setBound('end', binOpts, newBinSpec);\n }\n\n pos0 = trace['_' + mainData + 'pos0'];\n delete trace['_' + mainData + 'pos0'];\n\n // Each trace can specify its own start/end, or if omitted\n // we ensure they're beyond the bounds of this trace's data,\n // and we need to make sure start is aligned with the main start\n var traceInputBins = trace._input[binAttr] || {};\n var traceBinOptsCalc = Lib.extendFlat({}, binOpts);\n var mainStart = binOpts.start;\n var startIn = pa.r2l(traceInputBins.start);\n var hasStart = startIn !== undefined;\n if((binOpts.startFound || hasStart) && startIn !== pa.r2l(mainStart)) {\n // We have an explicit start to reconcile across traces\n // if this trace has an explicit start, shift it down to a bin edge\n // if another trace had an explicit start, shift it down to a\n // bin edge past our data\n var traceStart = hasStart ?\n startIn :\n Lib.aggNums(Math.min, null, pos0);\n\n var dummyAx = {\n type: (pa.type === 'category' || pa.type === 'multicategory') ? 'linear' : pa.type,\n r2l: pa.r2l,\n dtick: binOpts.size,\n tick0: mainStart,\n calendar: calendar,\n range: ([traceStart, Axes.tickIncrement(traceStart, binOpts.size, false, calendar)]).map(pa.l2r)\n };\n var newStart = Axes.tickFirst(dummyAx);\n if(newStart > pa.r2l(traceStart)) {\n newStart = Axes.tickIncrement(newStart, binOpts.size, true, calendar);\n }\n traceBinOptsCalc.start = pa.l2r(newStart);\n if(!hasStart) Lib.nestedProperty(trace, binAttr + '.start').set(traceBinOptsCalc.start);\n }\n\n var mainEnd = binOpts.end;\n var endIn = pa.r2l(traceInputBins.end);\n var hasEnd = endIn !== undefined;\n if((binOpts.endFound || hasEnd) && endIn !== pa.r2l(mainEnd)) {\n // Reconciling an explicit end is easier, as it doesn't need to\n // match bin edges\n var traceEnd = hasEnd ?\n endIn :\n Lib.aggNums(Math.max, null, pos0);\n\n traceBinOptsCalc.end = pa.l2r(traceEnd);\n if(!hasEnd) Lib.nestedProperty(trace, binAttr + '.start').set(traceBinOptsCalc.end);\n }\n\n // Backward compatibility for one-time autobinning.\n // autobin: true is handled in cleanData, but autobin: false\n // needs to be here where we have determined the values.\n var autoBinAttr = 'autobin' + mainData;\n if(trace._input[autoBinAttr] === false) {\n trace._input[binAttr] = Lib.extendFlat({}, trace[binAttr] || {});\n delete trace._input[autoBinAttr];\n delete trace[autoBinAttr];\n }\n\n return [traceBinOptsCalc, pos0];\n}\n\n/*\n * Adjust single-value histograms in overlay mode to make as good a\n * guess as we can at autobin values the user would like.\n *\n * Returns the binSpec for the trace that sparked all this\n */\nfunction handleSingleValueOverlays(gd, trace, pa, mainData, binAttr) {\n var fullLayout = gd._fullLayout;\n var overlaidTraceGroup = getConnectedHistograms(gd, trace);\n var pastThisTrace = false;\n var minSize = Infinity;\n var singleValuedTraces = [trace];\n var i, tracei, binOpts;\n\n // first collect all the:\n // - min bin size from all multi-valued traces\n // - single-valued traces\n for(i = 0; i < overlaidTraceGroup.length; i++) {\n tracei = overlaidTraceGroup[i];\n\n if(tracei === trace) {\n pastThisTrace = true;\n } else if(!pastThisTrace) {\n // This trace has already had its autobins calculated, so either:\n // - it is part of a bingroup\n // - it is NOT a single-valued trace\n binOpts = fullLayout._histogramBinOpts[tracei['_' + mainData + 'bingroup']];\n minSize = Math.min(minSize, binOpts.size || tracei[binAttr].size);\n } else {\n var resulti = calcAllAutoBins(gd, tracei, pa, mainData, true);\n var binSpeci = resulti[0];\n var isSingleValued = resulti[2];\n\n // so we can use this result when we get to tracei in the normal\n // course of events, mark it as done and put _pos0 back\n tracei['_' + mainData + 'autoBinFinished'] = 1;\n tracei['_' + mainData + 'pos0'] = resulti[1];\n\n if(isSingleValued) {\n singleValuedTraces.push(tracei);\n } else {\n minSize = Math.min(minSize, binSpeci.size);\n }\n }\n }\n\n // find the real data values for each single-valued trace\n // hunt through pos0 for the first valid value\n var dataVals = new Array(singleValuedTraces.length);\n for(i = 0; i < singleValuedTraces.length; i++) {\n var pos0 = singleValuedTraces[i]['_' + mainData + 'pos0'];\n for(var j = 0; j < pos0.length; j++) {\n if(pos0[j] !== undefined) {\n dataVals[i] = pos0[j];\n break;\n }\n }\n }\n\n // are ALL traces are single-valued? use the min difference between\n // all of their values (which defaults to 1 if there's still only one)\n if(!isFinite(minSize)) {\n minSize = Lib.distinctVals(dataVals).minDiff;\n }\n\n // now apply the min size we found to all single-valued traces\n for(i = 0; i < singleValuedTraces.length; i++) {\n tracei = singleValuedTraces[i];\n var calendar = tracei[mainData + 'calendar'];\n\n var newBins = {\n start: pa.c2r(dataVals[i] - minSize / 2, 0, calendar),\n end: pa.c2r(dataVals[i] + minSize / 2, 0, calendar),\n size: minSize\n };\n\n tracei._input[binAttr] = tracei[binAttr] = newBins;\n\n binOpts = fullLayout._histogramBinOpts[tracei['_' + mainData + 'bingroup']];\n if(binOpts) Lib.extendFlat(binOpts, newBins);\n }\n\n return trace[binAttr];\n}\n\n/*\n * Return an array of histograms that share axes and orientation.\n *\n * Only considers histograms. In principle we could include bars in a\n * similar way to how we do manually binned histograms, though this\n * would have tons of edge cases and value judgments to make.\n */\nfunction getConnectedHistograms(gd, trace) {\n var xid = trace.xaxis;\n var yid = trace.yaxis;\n var orientation = trace.orientation;\n\n var out = [];\n var fullData = gd._fullData;\n for(var i = 0; i < fullData.length; i++) {\n var tracei = fullData[i];\n if(tracei.type === 'histogram' &&\n tracei.visible === true &&\n tracei.orientation === orientation &&\n tracei.xaxis === xid && tracei.yaxis === yid\n ) {\n out.push(tracei);\n }\n }\n\n return out;\n}\n\nfunction cdf(size, direction, currentBin) {\n var i, vi, prevSum;\n\n function firstHalfPoint(i) {\n prevSum = size[i];\n size[i] /= 2;\n }\n\n function nextHalfPoint(i) {\n vi = size[i];\n size[i] = prevSum + vi / 2;\n prevSum += vi;\n }\n\n if(currentBin === 'half') {\n if(direction === 'increasing') {\n firstHalfPoint(0);\n for(i = 1; i < size.length; i++) {\n nextHalfPoint(i);\n }\n } else {\n firstHalfPoint(size.length - 1);\n for(i = size.length - 2; i >= 0; i--) {\n nextHalfPoint(i);\n }\n }\n } else if(direction === 'increasing') {\n for(i = 1; i < size.length; i++) {\n size[i] += size[i - 1];\n }\n\n // 'exclude' is identical to 'include' just shifted one bin over\n if(currentBin === 'exclude') {\n size.unshift(0);\n size.pop();\n }\n } else {\n for(i = size.length - 2; i >= 0; i--) {\n size[i] += size[i + 1];\n }\n\n if(currentBin === 'exclude') {\n size.push(0);\n size.shift();\n }\n }\n}\n\nmodule.exports = {\n calc: calc,\n calcAllAutoBins: calcAllAutoBins\n};\n","'use strict';\n\nvar d3 = require('@plotly/d3');\nvar Color = require('../../components/color');\nvar Drawing = require('../../components/drawing');\nvar Lib = require('../../lib');\nvar Registry = require('../../registry');\n\nvar resizeText = require('./uniform_text').resizeText;\nvar attributes = require('./attributes');\nvar attributeTextFont = attributes.textfont;\nvar attributeInsideTextFont = attributes.insidetextfont;\nvar attributeOutsideTextFont = attributes.outsidetextfont;\nvar helpers = require('./helpers');\n\nfunction style(gd) {\n var s = d3.select(gd).selectAll('g.barlayer').selectAll('g.trace');\n resizeText(gd, s, 'bar');\n\n var barcount = s.size();\n var fullLayout = gd._fullLayout;\n\n // trace styling\n s.style('opacity', function(d) { return d[0].trace.opacity; })\n\n // for gapless (either stacked or neighboring grouped) bars use\n // crispEdges to turn off antialiasing so an artificial gap\n // isn't introduced.\n .each(function(d) {\n if((fullLayout.barmode === 'stack' && barcount > 1) ||\n (fullLayout.bargap === 0 &&\n fullLayout.bargroupgap === 0 &&\n !d[0].trace.marker.line.width)) {\n d3.select(this).attr('shape-rendering', 'crispEdges');\n }\n });\n\n s.selectAll('g.points').each(function(d) {\n var sel = d3.select(this);\n var trace = d[0].trace;\n stylePoints(sel, trace, gd);\n });\n\n Registry.getComponentMethod('errorbars', 'style')(s);\n}\n\nfunction stylePoints(sel, trace, gd) {\n Drawing.pointStyle(sel.selectAll('path'), trace, gd);\n styleTextPoints(sel, trace, gd);\n}\n\nfunction styleTextPoints(sel, trace, gd) {\n sel.selectAll('text').each(function(d) {\n var tx = d3.select(this);\n var font = Lib.ensureUniformFontSize(gd, determineFont(tx, d, trace, gd));\n\n Drawing.font(tx, font);\n });\n}\n\nfunction styleOnSelect(gd, cd, sel) {\n var trace = cd[0].trace;\n\n if(trace.selectedpoints) {\n stylePointsInSelectionMode(sel, trace, gd);\n } else {\n stylePoints(sel, trace, gd);\n Registry.getComponentMethod('errorbars', 'style')(sel);\n }\n}\n\nfunction stylePointsInSelectionMode(s, trace, gd) {\n Drawing.selectedPointStyle(s.selectAll('path'), trace);\n styleTextInSelectionMode(s.selectAll('text'), trace, gd);\n}\n\nfunction styleTextInSelectionMode(txs, trace, gd) {\n txs.each(function(d) {\n var tx = d3.select(this);\n var font;\n\n if(d.selected) {\n font = Lib.ensureUniformFontSize(gd, determineFont(tx, d, trace, gd));\n\n var selectedFontColor = trace.selected.textfont && trace.selected.textfont.color;\n if(selectedFontColor) {\n font.color = selectedFontColor;\n }\n\n Drawing.font(tx, font);\n } else {\n Drawing.selectedTextStyle(tx, trace);\n }\n });\n}\n\nfunction determineFont(tx, d, trace, gd) {\n var layoutFont = gd._fullLayout.font;\n var textFont = trace.textfont;\n\n if(tx.classed('bartext-inside')) {\n var barColor = getBarColor(d, trace);\n textFont = getInsideTextFont(trace, d.i, layoutFont, barColor);\n } else if(tx.classed('bartext-outside')) {\n textFont = getOutsideTextFont(trace, d.i, layoutFont);\n }\n\n return textFont;\n}\n\nfunction getTextFont(trace, index, defaultValue) {\n return getFontValue(\n attributeTextFont, trace.textfont, index, defaultValue);\n}\n\nfunction getInsideTextFont(trace, index, layoutFont, barColor) {\n var defaultFont = getTextFont(trace, index, layoutFont);\n\n var wouldFallBackToLayoutFont =\n (trace._input.textfont === undefined || trace._input.textfont.color === undefined) ||\n (Array.isArray(trace.textfont.color) && trace.textfont.color[index] === undefined);\n if(wouldFallBackToLayoutFont) {\n defaultFont = {\n color: Color.contrast(barColor),\n family: defaultFont.family,\n size: defaultFont.size\n };\n }\n\n return getFontValue(\n attributeInsideTextFont, trace.insidetextfont, index, defaultFont);\n}\n\nfunction getOutsideTextFont(trace, index, layoutFont) {\n var defaultFont = getTextFont(trace, index, layoutFont);\n return getFontValue(\n attributeOutsideTextFont, trace.outsidetextfont, index, defaultFont);\n}\n\nfunction getFontValue(attributeDefinition, attributeValue, index, defaultValue) {\n attributeValue = attributeValue || {};\n\n var familyValue = helpers.getValue(attributeValue.family, index);\n var sizeValue = helpers.getValue(attributeValue.size, index);\n var colorValue = helpers.getValue(attributeValue.color, index);\n\n return {\n family: helpers.coerceString(\n attributeDefinition.family, familyValue, defaultValue.family),\n size: helpers.coerceNumber(\n attributeDefinition.size, sizeValue, defaultValue.size),\n color: helpers.coerceColor(\n attributeDefinition.color, colorValue, defaultValue.color)\n };\n}\n\nfunction getBarColor(cd, trace) {\n if(trace.type === 'waterfall') {\n return trace[cd.dir].marker.color;\n }\n return cd.mcc || cd.mc || trace.marker.color;\n}\n\nmodule.exports = {\n style: style,\n styleTextPoints: styleTextPoints,\n styleOnSelect: styleOnSelect,\n getInsideTextFont: getInsideTextFont,\n getOutsideTextFont: getOutsideTextFont,\n getBarColor: getBarColor,\n resizeText: resizeText\n};\n","'use strict';\n\nvar Lib = require('../lib');\n\nvar toImage = require('../plot_api/to_image');\n\nvar fileSaver = require('./filesaver');\nvar helpers = require('./helpers');\n\n/**\n * Plotly.downloadImage\n *\n * @param {object | string | HTML div} gd\n * can either be a data/layout/config object\n * or an existing graph
\n * or an id to an existing graph
\n * @param {object} opts (see Plotly.toImage in ../plot_api/to_image)\n * @return {promise}\n */\nfunction downloadImage(gd, opts) {\n var _gd;\n if(!Lib.isPlainObject(gd)) _gd = Lib.getGraphDiv(gd);\n\n opts = opts || {};\n opts.format = opts.format || 'png';\n opts.width = opts.width || null;\n opts.height = opts.height || null;\n opts.imageDataOnly = true;\n\n return new Promise(function(resolve, reject) {\n if(_gd && _gd._snapshotInProgress) {\n reject(new Error('Snapshotting already in progress.'));\n }\n\n // see comments within svgtoimg for additional\n // discussion of problems with IE\n // can now draw to canvas, but CORS tainted canvas\n // does not allow toDataURL\n // svg format will work though\n if(Lib.isIE() && opts.format !== 'svg') {\n reject(new Error(helpers.MSG_IE_BAD_FORMAT));\n }\n\n if(_gd) _gd._snapshotInProgress = true;\n var promise = toImage(gd, opts);\n\n var filename = opts.filename || gd.fn || 'newplot';\n filename += '.' + opts.format.replace('-', '.');\n\n promise.then(function(result) {\n if(_gd) _gd._snapshotInProgress = false;\n return fileSaver(result, filename, opts.format);\n }).then(function(name) {\n resolve(name);\n }).catch(function(err) {\n if(_gd) _gd._snapshotInProgress = false;\n reject(err);\n });\n });\n}\n\nmodule.exports = downloadImage;\n","'use strict';\n\nvar Lib = require('../../lib');\n\nvar layoutAttributes = require('./layout_attributes');\n\nmodule.exports = function(layoutIn, layoutOut) {\n function coerce(attr, dflt) {\n return Lib.coerce(layoutIn, layoutOut, layoutAttributes, attr, dflt);\n }\n\n var groupBarmode = layoutOut.barmode === 'group';\n\n if(layoutOut.scattermode === 'group') {\n coerce('scattergap', groupBarmode ? layoutOut.bargap : 0.2);\n }\n};\n","'use strict';\n\nvar Lib = require('../../lib');\nvar Registry = require('../../registry');\n\nmodule.exports = function handleXYDefaults(traceIn, traceOut, layout, coerce) {\n var x = coerce('x');\n var y = coerce('y');\n var len;\n\n var handleCalendarDefaults = Registry.getComponentMethod('calendars', 'handleTraceDefaults');\n handleCalendarDefaults(traceIn, traceOut, ['x', 'y'], layout);\n\n if(x) {\n var xlen = Lib.minRowLength(x);\n if(y) {\n len = Math.min(xlen, Lib.minRowLength(y));\n } else {\n len = xlen;\n coerce('y0');\n coerce('dy');\n }\n } else {\n if(!y) return 0;\n\n len = Lib.minRowLength(y);\n coerce('x0');\n coerce('dx');\n }\n\n traceOut._length = len;\n\n return len;\n};\n","'use strict';\n\nvar getAxisGroup = require('../../plots/cartesian/constraints').getAxisGroup;\n\nmodule.exports = function handleGroupingDefaults(traceIn, traceOut, fullLayout, coerce) {\n var orientation = traceOut.orientation;\n // N.B. grouping is done across all trace types that support it\n var posAxId = traceOut[{v: 'x', h: 'y'}[orientation] + 'axis'];\n var groupId = getAxisGroup(fullLayout, posAxId) + orientation;\n\n var alignmentOpts = fullLayout._alignmentOpts || {};\n var alignmentgroup = coerce('alignmentgroup');\n\n var alignmentGroups = alignmentOpts[groupId];\n if(!alignmentGroups) alignmentGroups = alignmentOpts[groupId] = {};\n\n var alignmentGroupOpts = alignmentGroups[alignmentgroup];\n\n if(alignmentGroupOpts) {\n alignmentGroupOpts.traces.push(traceOut);\n } else {\n alignmentGroupOpts = alignmentGroups[alignmentgroup] = {\n traces: [traceOut],\n alignmentIndex: Object.keys(alignmentGroups).length,\n offsetGroups: {}\n };\n }\n\n var offsetgroup = coerce('offsetgroup');\n var offsetGroups = alignmentGroupOpts.offsetGroups;\n var offsetGroupOpts = offsetGroups[offsetgroup];\n\n if(offsetgroup) {\n if(!offsetGroupOpts) {\n offsetGroupOpts = offsetGroups[offsetgroup] = {\n offsetIndex: Object.keys(offsetGroups).length\n };\n }\n\n traceOut._offsetIndex = offsetGroupOpts.offsetIndex;\n }\n};\n","'use strict';\n\nvar maxRowLength = require('../../lib').maxRowLength;\n\n/* Return a list of empty points in 2D array z\n * each empty point z[i][j] gives an array [i, j, neighborCount]\n * neighborCount is the count of 4 nearest neighbors that DO exist\n * this is to give us an order of points to evaluate for interpolation.\n * if no neighbors exist, we iteratively look for neighbors that HAVE\n * neighbors, and add a fractional neighborCount\n */\nmodule.exports = function findEmpties(z) {\n var empties = [];\n var neighborHash = {};\n var noNeighborList = [];\n var nextRow = z[0];\n var row = [];\n var blank = [0, 0, 0];\n var rowLength = maxRowLength(z);\n var prevRow;\n var i;\n var j;\n var thisPt;\n var p;\n var neighborCount;\n var newNeighborHash;\n var foundNewNeighbors;\n\n for(i = 0; i < z.length; i++) {\n prevRow = row;\n row = nextRow;\n nextRow = z[i + 1] || [];\n for(j = 0; j < rowLength; j++) {\n if(row[j] === undefined) {\n neighborCount = (row[j - 1] !== undefined ? 1 : 0) +\n (row[j + 1] !== undefined ? 1 : 0) +\n (prevRow[j] !== undefined ? 1 : 0) +\n (nextRow[j] !== undefined ? 1 : 0);\n\n if(neighborCount) {\n // for this purpose, don't count off-the-edge points\n // as undefined neighbors\n if(i === 0) neighborCount++;\n if(j === 0) neighborCount++;\n if(i === z.length - 1) neighborCount++;\n if(j === row.length - 1) neighborCount++;\n\n // if all neighbors that could exist do, we don't\n // need this for finding farther neighbors\n if(neighborCount < 4) {\n neighborHash[[i, j]] = [i, j, neighborCount];\n }\n\n empties.push([i, j, neighborCount]);\n } else noNeighborList.push([i, j]);\n }\n }\n }\n\n while(noNeighborList.length) {\n newNeighborHash = {};\n foundNewNeighbors = false;\n\n // look for cells that now have neighbors but didn't before\n for(p = noNeighborList.length - 1; p >= 0; p--) {\n thisPt = noNeighborList[p];\n i = thisPt[0];\n j = thisPt[1];\n\n neighborCount = ((neighborHash[[i - 1, j]] || blank)[2] +\n (neighborHash[[i + 1, j]] || blank)[2] +\n (neighborHash[[i, j - 1]] || blank)[2] +\n (neighborHash[[i, j + 1]] || blank)[2]) / 20;\n\n if(neighborCount) {\n newNeighborHash[thisPt] = [i, j, neighborCount];\n noNeighborList.splice(p, 1);\n foundNewNeighbors = true;\n }\n }\n\n if(!foundNewNeighbors) {\n throw 'findEmpties iterated with no new neighbors';\n }\n\n // put these new cells into the main neighbor list\n for(thisPt in newNeighborHash) {\n neighborHash[thisPt] = newNeighborHash[thisPt];\n empties.push(newNeighborHash[thisPt]);\n }\n }\n\n // sort the full list in descending order of neighbor count\n return empties.sort(function(a, b) { return b[2] - a[2]; });\n};\n","'use strict';\n\nmodule.exports = {\n PTS_LINESONLY: 20,\n\n // fixed parameters of clustering and clipping algorithms\n\n // fraction of clustering tolerance \"so close we don't even consider it a new point\"\n minTolerance: 0.2,\n // how fast does clustering tolerance increase as you get away from the visible region\n toleranceGrowth: 10,\n\n // number of viewport sizes away from the visible region\n // at which we clip all lines to the perimeter\n maxScreensAway: 20,\n\n eventDataKeys: []\n};\n","// ray-casting algorithm based on\n// https://wrf.ecse.rpi.edu/Research/Short_Notes/pnpoly.html\n\nmodule.exports = function pointInPolygonNested (point, vs, start, end) {\n var x = point[0], y = point[1];\n var inside = false;\n if (start === undefined) start = 0;\n if (end === undefined) end = vs.length;\n var len = end - start;\n for (var i = 0, j = len - 1; i < len; j = i++) {\n var xi = vs[i+start][0], yi = vs[i+start][1];\n var xj = vs[j+start][0], yj = vs[j+start][1];\n var intersect = ((yi > y) !== (yj > y))\n && (x < (xj - xi) * (y - yi) / (yj - yi) + xi);\n if (intersect) inside = !inside;\n }\n return inside;\n};\n","'use strict';\n\nvar subtypes = require('./subtypes');\n\nmodule.exports = function selectPoints(searchInfo, selectionTester) {\n var cd = searchInfo.cd;\n var xa = searchInfo.xaxis;\n var ya = searchInfo.yaxis;\n var selection = [];\n var trace = cd[0].trace;\n var i;\n var di;\n var x;\n var y;\n\n var hasOnlyLines = (!subtypes.hasMarkers(trace) && !subtypes.hasText(trace));\n if(hasOnlyLines) return [];\n\n if(selectionTester === false) { // clear selection\n for(i = 0; i < cd.length; i++) {\n cd[i].selected = 0;\n }\n } else {\n for(i = 0; i < cd.length; i++) {\n di = cd[i];\n x = xa.c2p(di.x);\n y = ya.c2p(di.y);\n\n if((di.i !== null) && selectionTester.contains([x, y], false, i, searchInfo)) {\n selection.push({\n pointNumber: di.i,\n x: xa.c2d(di.x),\n y: ya.c2d(di.y)\n });\n di.selected = 1;\n } else {\n di.selected = 0;\n }\n }\n }\n\n return selection;\n};\n","'use strict';\n\nvar Registry = require('../../registry');\nvar Axes = require('../../plots/cartesian/axes');\nvar Lib = require('../../lib');\n\nvar layoutAttributes = require('./layout_attributes');\nvar validateCornerradius = require('./defaults').validateCornerradius;\n\n\nmodule.exports = function(layoutIn, layoutOut, fullData) {\n function coerce(attr, dflt) {\n return Lib.coerce(layoutIn, layoutOut, layoutAttributes, attr, dflt);\n }\n\n var hasBars = false;\n var shouldBeGapless = false;\n var gappedAnyway = false;\n var usedSubplots = {};\n\n var mode = coerce('barmode');\n\n for(var i = 0; i < fullData.length; i++) {\n var trace = fullData[i];\n if(Registry.traceIs(trace, 'bar') && trace.visible) hasBars = true;\n else continue;\n\n // if we have at least 2 grouped bar traces on the same subplot,\n // we should default to a gap anyway, even if the data is histograms\n if(mode === 'group') {\n var subploti = trace.xaxis + trace.yaxis;\n if(usedSubplots[subploti]) gappedAnyway = true;\n usedSubplots[subploti] = true;\n }\n\n if(trace.visible && trace.type === 'histogram') {\n var pa = Axes.getFromId({_fullLayout: layoutOut},\n trace[trace.orientation === 'v' ? 'xaxis' : 'yaxis']);\n if(pa.type !== 'category') shouldBeGapless = true;\n }\n }\n\n if(!hasBars) {\n delete layoutOut.barmode;\n return;\n }\n\n if(mode !== 'overlay') coerce('barnorm');\n\n coerce('bargap', (shouldBeGapless && !gappedAnyway) ? 0 : 0.2);\n coerce('bargroupgap');\n var r = coerce('barcornerradius');\n layoutOut.barcornerradius = validateCornerradius(r);\n};\n","'use strict';\n\nvar EventEmitter = require('events').EventEmitter;\n\nvar Registry = require('../registry');\nvar Lib = require('../lib');\n\nvar helpers = require('./helpers');\nvar clonePlot = require('./cloneplot');\nvar toSVG = require('./tosvg');\nvar svgToImg = require('./svgtoimg');\n\n/**\n * @param {object} gd figure Object\n * @param {object} opts option object\n * @param opts.format 'jpeg' | 'png' | 'webp' | 'svg'\n */\nfunction toImage(gd, opts) {\n // first clone the GD so we can operate in a clean environment\n var ev = new EventEmitter();\n\n var clone = clonePlot(gd, {format: 'png'});\n var clonedGd = clone.gd;\n\n // put the cloned div somewhere off screen before attaching to DOM\n clonedGd.style.position = 'absolute';\n clonedGd.style.left = '-5000px';\n document.body.appendChild(clonedGd);\n\n function wait() {\n var delay = helpers.getDelay(clonedGd._fullLayout);\n\n setTimeout(function() {\n var svg = toSVG(clonedGd);\n\n var canvas = document.createElement('canvas');\n canvas.id = Lib.randstr();\n\n ev = svgToImg({\n format: opts.format,\n width: clonedGd._fullLayout.width,\n height: clonedGd._fullLayout.height,\n canvas: canvas,\n emitter: ev,\n svg: svg\n });\n\n ev.clean = function() {\n if(clonedGd) document.body.removeChild(clonedGd);\n };\n }, delay);\n }\n\n var redrawFunc = helpers.getRedrawFunc(clonedGd);\n\n Registry.call('_doPlot', clonedGd, clone.data, clone.layout, clone.config)\n .then(redrawFunc)\n .then(wait)\n .catch(function(err) {\n ev.emit('error', err);\n });\n\n\n return ev;\n}\n\nmodule.exports = toImage;\n","'use strict';\n\nvar Color = require('../../components/color');\nvar subtypes = require('./subtypes');\n\n\nmodule.exports = function getTraceColor(trace, di) {\n var lc, tc;\n\n // TODO: text modes\n\n if(trace.mode === 'lines') {\n lc = trace.line.color;\n return (lc && Color.opacity(lc)) ?\n lc : trace.fillcolor;\n } else if(trace.mode === 'none') {\n return trace.fill ? trace.fillcolor : '';\n } else {\n var mc = di.mcc || (trace.marker || {}).color;\n var mlc = di.mlcc || ((trace.marker || {}).line || {}).color;\n\n tc = (mc && Color.opacity(mc)) ? mc :\n (mlc && Color.opacity(mlc) &&\n (di.mlw || ((trace.marker || {}).line || {}).width)) ? mlc : '';\n\n if(tc) {\n // make sure the points aren't TOO transparent\n if(Color.opacity(tc) < 0.3) {\n return Color.addOpacity(tc, 0.3);\n } else return tc;\n } else {\n lc = (trace.line || {}).color;\n return (lc && Color.opacity(lc) &&\n subtypes.hasLines(trace) && trace.line.width) ?\n lc : trace.fillcolor;\n }\n }\n};\n","'use strict';\n\nvar isNumeric = require('fast-isnumeric');\nvar tinycolor = require('tinycolor2');\n\nvar Color = require('../../components/color');\n\nvar extendedColorWayList = {};\n\nfunction calc(gd, trace) {\n var cd = [];\n\n var fullLayout = gd._fullLayout;\n var hiddenLabels = fullLayout.hiddenlabels || [];\n\n var labels = trace.labels;\n var colors = trace.marker.colors || [];\n var vals = trace.values;\n var len = trace._length;\n var hasValues = trace._hasValues && len;\n\n var i, pt;\n\n if(trace.dlabel) {\n labels = new Array(len);\n for(i = 0; i < len; i++) {\n labels[i] = String(trace.label0 + i * trace.dlabel);\n }\n }\n\n var allThisTraceLabels = {};\n var pullColor = makePullColorFn(fullLayout['_' + trace.type + 'colormap']);\n var vTotal = 0;\n var isAggregated = false;\n\n for(i = 0; i < len; i++) {\n var v, label, hidden;\n if(hasValues) {\n v = vals[i];\n if(!isNumeric(v)) continue;\n v = +v;\n } else v = 1;\n\n label = labels[i];\n if(label === undefined || label === '') label = i;\n label = String(label);\n\n var thisLabelIndex = allThisTraceLabels[label];\n if(thisLabelIndex === undefined) {\n allThisTraceLabels[label] = cd.length;\n\n hidden = hiddenLabels.indexOf(label) !== -1;\n\n if(!hidden) vTotal += v;\n\n cd.push({\n v: v,\n label: label,\n color: pullColor(colors[i], label),\n i: i,\n pts: [i],\n hidden: hidden\n });\n } else {\n isAggregated = true;\n\n pt = cd[thisLabelIndex];\n pt.v += v;\n pt.pts.push(i);\n if(!pt.hidden) vTotal += v;\n\n if(pt.color === false && colors[i]) {\n pt.color = pullColor(colors[i], label);\n }\n }\n }\n\n // Drop aggregate sums of value 0 or less\n cd = cd.filter(function(elem) { return elem.v >= 0; });\n\n var shouldSort = (trace.type === 'funnelarea') ? isAggregated : trace.sort;\n if(shouldSort) cd.sort(function(a, b) { return b.v - a.v; });\n\n // include the sum of all values in the first point\n if(cd[0]) cd[0].vTotal = vTotal;\n\n return cd;\n}\n\nfunction makePullColorFn(colorMap) {\n return function pullColor(color, id) {\n if(!color) return false;\n\n color = tinycolor(color);\n if(!color.isValid()) return false;\n\n color = Color.addOpacity(color, color.getAlpha());\n if(!colorMap[id]) colorMap[id] = color;\n\n return color;\n };\n}\n\n/*\n * `calc` filled in (and collated) explicit colors.\n * Now we need to propagate these explicit colors to other traces,\n * and fill in default colors.\n * This is done after sorting, so we pick defaults\n * in the order slices will be displayed\n */\nfunction crossTraceCalc(gd, plotinfo) { // TODO: should we name the second argument opts?\n var desiredType = (plotinfo || {}).type;\n if(!desiredType) desiredType = 'pie';\n\n var fullLayout = gd._fullLayout;\n var calcdata = gd.calcdata;\n var colorWay = fullLayout[desiredType + 'colorway'];\n var colorMap = fullLayout['_' + desiredType + 'colormap'];\n\n if(fullLayout['extend' + desiredType + 'colors']) {\n colorWay = generateExtendedColors(colorWay, extendedColorWayList);\n }\n var dfltColorCount = 0;\n\n for(var i = 0; i < calcdata.length; i++) {\n var cd = calcdata[i];\n var traceType = cd[0].trace.type;\n if(traceType !== desiredType) continue;\n\n for(var j = 0; j < cd.length; j++) {\n var pt = cd[j];\n if(pt.color === false) {\n // have we seen this label and assigned a color to it in a previous trace?\n if(colorMap[pt.label]) {\n pt.color = colorMap[pt.label];\n } else {\n colorMap[pt.label] = pt.color = colorWay[dfltColorCount % colorWay.length];\n dfltColorCount++;\n }\n }\n }\n }\n}\n\n/**\n * pick a default color from the main default set, augmented by\n * itself lighter then darker before repeating\n */\nfunction generateExtendedColors(colorList, extendedColorWays) {\n var i;\n var colorString = JSON.stringify(colorList);\n var colors = extendedColorWays[colorString];\n if(!colors) {\n colors = colorList.slice();\n\n for(i = 0; i < colorList.length; i++) {\n colors.push(tinycolor(colorList[i]).lighten(20).toHexString());\n }\n\n for(i = 0; i < colorList.length; i++) {\n colors.push(tinycolor(colorList[i]).darken(20).toHexString());\n }\n extendedColorWays[colorString] = colors;\n }\n\n return colors;\n}\n\nmodule.exports = {\n calc: calc,\n crossTraceCalc: crossTraceCalc,\n\n makePullColorFn: makePullColorFn,\n generateExtendedColors: generateExtendedColors\n};\n","'use strict';\n\nvar Lib = require('../../lib');\n\nvar layoutAttributes = require('./layout_attributes');\n\nmodule.exports = function supplyLayoutDefaults(layoutIn, layoutOut) {\n function coerce(attr, dflt) {\n return Lib.coerce(layoutIn, layoutOut, layoutAttributes, attr, dflt);\n }\n\n coerce('hiddenlabels');\n coerce('piecolorway', layoutOut.colorway);\n coerce('extendpiecolors');\n};\n","'use strict';\n\nvar baseAttrs = require('../../plots/attributes');\nvar domainAttrs = require('../../plots/domain').attributes;\nvar fontAttrs = require('../../plots/font_attributes');\nvar colorAttrs = require('../../components/color/attributes');\nvar hovertemplateAttrs = require('../../plots/template_attributes').hovertemplateAttrs;\nvar texttemplateAttrs = require('../../plots/template_attributes').texttemplateAttrs;\n\nvar extendFlat = require('../../lib/extend').extendFlat;\nvar pattern = require('../../components/drawing/attributes').pattern;\n\nvar textFontAttrs = fontAttrs({\n editType: 'plot',\n arrayOk: true,\n colorEditType: 'plot',\n description: 'Sets the font used for `textinfo`.'\n});\n\nmodule.exports = {\n labels: {\n valType: 'data_array',\n editType: 'calc',\n description: [\n 'Sets the sector labels.',\n 'If `labels` entries are duplicated, we sum associated `values`',\n 'or simply count occurrences if `values` is not provided.',\n 'For other array attributes (including color) we use the first',\n 'non-empty entry among all occurrences of the label.'\n ].join(' ')\n },\n // equivalent of x0 and dx, if label is missing\n label0: {\n valType: 'number',\n dflt: 0,\n editType: 'calc',\n description: [\n 'Alternate to `labels`.',\n 'Builds a numeric set of labels.',\n 'Use with `dlabel`',\n 'where `label0` is the starting label and `dlabel` the step.'\n ].join(' ')\n },\n dlabel: {\n valType: 'number',\n dflt: 1,\n editType: 'calc',\n description: 'Sets the label step. See `label0` for more info.'\n },\n\n values: {\n valType: 'data_array',\n editType: 'calc',\n description: [\n 'Sets the values of the sectors.',\n 'If omitted, we count occurrences of each label.'\n ].join(' ')\n },\n\n marker: {\n colors: {\n valType: 'data_array', // TODO 'color_array' ?\n editType: 'calc',\n description: [\n 'Sets the color of each sector.',\n 'If not specified, the default trace color set is used',\n 'to pick the sector colors.'\n ].join(' ')\n },\n\n line: {\n color: {\n valType: 'color',\n dflt: colorAttrs.defaultLine,\n arrayOk: true,\n editType: 'style',\n description: [\n 'Sets the color of the line enclosing each sector.'\n ].join(' ')\n },\n width: {\n valType: 'number',\n min: 0,\n dflt: 0,\n arrayOk: true,\n editType: 'style',\n description: [\n 'Sets the width (in px) of the line enclosing each sector.'\n ].join(' ')\n },\n editType: 'calc'\n },\n pattern: pattern,\n editType: 'calc'\n },\n\n text: {\n valType: 'data_array',\n editType: 'plot',\n description: [\n 'Sets text elements associated with each sector.',\n 'If trace `textinfo` contains a *text* flag, these elements will be seen',\n 'on the chart.',\n 'If trace `hoverinfo` contains a *text* flag and *hovertext* is not set,',\n 'these elements will be seen in the hover labels.'\n ].join(' ')\n },\n hovertext: {\n valType: 'string',\n dflt: '',\n arrayOk: true,\n editType: 'style',\n description: [\n 'Sets hover text elements associated with each sector.',\n 'If a single string, the same string appears for',\n 'all data points.',\n 'If an array of string, the items are mapped in order of',\n 'this trace\\'s sectors.',\n 'To be seen, trace `hoverinfo` must contain a *text* flag.'\n ].join(' ')\n },\n\n// 'see eg:'\n// 'https://www.e-education.psu.edu/natureofgeoinfo/sites/www.e-education.psu.edu.natureofgeoinfo/files/image/hisp_pies.gif',\n// '(this example involves a map too - may someday be a whole trace type',\n// 'of its own. but the point is the size of the whole pie is important.)'\n scalegroup: {\n valType: 'string',\n dflt: '',\n editType: 'calc',\n description: [\n 'If there are multiple pie charts that should be sized according to',\n 'their totals, link them by providing a non-empty group id here',\n 'shared by every trace in the same group.'\n ].join(' ')\n },\n\n // labels (legend is handled by plots.attributes.showlegend and layout.hiddenlabels)\n textinfo: {\n valType: 'flaglist',\n flags: ['label', 'text', 'value', 'percent'],\n extras: ['none'],\n editType: 'calc',\n description: [\n 'Determines which trace information appear on the graph.'\n ].join(' ')\n },\n hoverinfo: extendFlat({}, baseAttrs.hoverinfo, {\n flags: ['label', 'text', 'value', 'percent', 'name']\n }),\n hovertemplate: hovertemplateAttrs({}, {\n keys: ['label', 'color', 'value', 'percent', 'text']\n }),\n texttemplate: texttemplateAttrs({editType: 'plot'}, {\n keys: ['label', 'color', 'value', 'percent', 'text']\n }),\n textposition: {\n valType: 'enumerated',\n values: ['inside', 'outside', 'auto', 'none'],\n dflt: 'auto',\n arrayOk: true,\n editType: 'plot',\n description: [\n 'Specifies the location of the `textinfo`.'\n ].join(' ')\n },\n textfont: extendFlat({}, textFontAttrs, {\n description: 'Sets the font used for `textinfo`.'\n }),\n insidetextorientation: {\n valType: 'enumerated',\n values: ['horizontal', 'radial', 'tangential', 'auto'],\n dflt: 'auto',\n editType: 'plot',\n description: [\n 'Controls the orientation of the text inside chart sectors.',\n 'When set to *auto*, text may be oriented in any direction in order',\n 'to be as big as possible in the middle of a sector.',\n 'The *horizontal* option orients text to be parallel with the bottom',\n 'of the chart, and may make text smaller in order to achieve that goal.',\n 'The *radial* option orients text along the radius of the sector.',\n 'The *tangential* option orients text perpendicular to the radius of the sector.'\n ].join(' ')\n },\n insidetextfont: extendFlat({}, textFontAttrs, {\n description: 'Sets the font used for `textinfo` lying inside the sector.'\n }),\n outsidetextfont: extendFlat({}, textFontAttrs, {\n description: 'Sets the font used for `textinfo` lying outside the sector.'\n }),\n automargin: {\n valType: 'boolean',\n dflt: false,\n editType: 'plot',\n description: [\n 'Determines whether outside text labels can push the margins.'\n ].join(' ')\n },\n\n title: {\n text: {\n valType: 'string',\n dflt: '',\n editType: 'plot',\n description: [\n 'Sets the title of the chart.',\n 'If it is empty, no title is displayed.',\n 'Note that before the existence of `title.text`, the title\\'s',\n 'contents used to be defined as the `title` attribute itself.',\n 'This behavior has been deprecated.'\n ].join(' ')\n },\n font: extendFlat({}, textFontAttrs, {\n description: [\n 'Sets the font used for `title`.',\n 'Note that the title\\'s font used to be set',\n 'by the now deprecated `titlefont` attribute.'\n ].join(' ')\n }),\n position: {\n valType: 'enumerated',\n values: [\n 'top left', 'top center', 'top right',\n 'middle center',\n 'bottom left', 'bottom center', 'bottom right'\n ],\n editType: 'plot',\n description: [\n 'Specifies the location of the `title`.',\n 'Note that the title\\'s position used to be set',\n 'by the now deprecated `titleposition` attribute.'\n ].join(' ')\n },\n\n editType: 'plot'\n },\n\n // position and shape\n domain: domainAttrs({name: 'pie', trace: true, editType: 'calc'}),\n\n hole: {\n valType: 'number',\n min: 0,\n max: 1,\n dflt: 0,\n editType: 'calc',\n description: [\n 'Sets the fraction of the radius to cut out of the pie.',\n 'Use this to make a donut chart.'\n ].join(' ')\n },\n\n // ordering and direction\n sort: {\n valType: 'boolean',\n dflt: true,\n editType: 'calc',\n description: [\n 'Determines whether or not the sectors are reordered',\n 'from largest to smallest.'\n ].join(' ')\n },\n direction: {\n /**\n * there are two common conventions, both of which place the first\n * (largest, if sorted) slice with its left edge at 12 o'clock but\n * succeeding slices follow either cw or ccw from there.\n *\n * see http://visage.co/data-visualization-101-pie-charts/\n */\n valType: 'enumerated',\n values: ['clockwise', 'counterclockwise'],\n dflt: 'counterclockwise',\n editType: 'calc',\n description: [\n 'Specifies the direction at which succeeding sectors follow',\n 'one another.'\n ].join(' ')\n },\n rotation: {\n valType: 'angle',\n dflt: 0,\n editType: 'calc',\n description: [\n 'Instead of the first slice starting at 12 o\\'clock,',\n 'rotate to some other angle.'\n ].join(' ')\n },\n\n pull: {\n valType: 'number',\n min: 0,\n max: 1,\n dflt: 0,\n arrayOk: true,\n editType: 'calc',\n description: [\n 'Sets the fraction of larger radius to pull the sectors',\n 'out from the center. This can be a constant',\n 'to pull all slices apart from each other equally',\n 'or an array to highlight one or more slices.'\n ].join(' ')\n },\n\n _deprecated: {\n title: {\n valType: 'string',\n dflt: '',\n editType: 'calc',\n description: [\n 'Deprecated in favor of `title.text`.',\n 'Note that value of `title` is no longer a simple',\n '*string* but a set of sub-attributes.'\n ].join(' ')\n },\n titlefont: extendFlat({}, textFontAttrs, {\n description: 'Deprecated in favor of `title.font`.'\n }),\n titleposition: {\n valType: 'enumerated',\n values: [\n 'top left', 'top center', 'top right',\n 'middle center',\n 'bottom left', 'bottom center', 'bottom right'\n ],\n editType: 'calc',\n description: 'Deprecated in favor of `title.position`.'\n }\n }\n};\n","'use strict';\n\nvar d3 = require('@plotly/d3');\n\nvar Lib = require('../../lib');\nvar Drawing = require('../../components/drawing');\n\n// constants for dynamic jitter (ie less jitter for sparser points)\nvar JITTERCOUNT = 5; // points either side of this to include\nvar JITTERSPREAD = 0.01; // fraction of IQR to count as \"dense\"\n\nfunction plot(gd, plotinfo, cdbox, boxLayer) {\n var isStatic = gd._context.staticPlot;\n var xa = plotinfo.xaxis;\n var ya = plotinfo.yaxis;\n\n Lib.makeTraceGroups(boxLayer, cdbox, 'trace boxes').each(function(cd) {\n var plotGroup = d3.select(this);\n var cd0 = cd[0];\n var t = cd0.t;\n var trace = cd0.trace;\n\n // whisker width\n t.wdPos = t.bdPos * trace.whiskerwidth;\n\n if(trace.visible !== true || t.empty) {\n plotGroup.remove();\n return;\n }\n\n var posAxis, valAxis;\n\n if(trace.orientation === 'h') {\n posAxis = ya;\n valAxis = xa;\n } else {\n posAxis = xa;\n valAxis = ya;\n }\n\n plotBoxAndWhiskers(plotGroup, {pos: posAxis, val: valAxis}, trace, t, isStatic);\n plotPoints(plotGroup, {x: xa, y: ya}, trace, t);\n plotBoxMean(plotGroup, {pos: posAxis, val: valAxis}, trace, t);\n });\n}\n\nfunction plotBoxAndWhiskers(sel, axes, trace, t, isStatic) {\n var isHorizontal = trace.orientation === 'h';\n var valAxis = axes.val;\n var posAxis = axes.pos;\n var posHasRangeBreaks = !!posAxis.rangebreaks;\n\n var bPos = t.bPos;\n var wdPos = t.wdPos || 0;\n var bPosPxOffset = t.bPosPxOffset || 0;\n var whiskerWidth = trace.whiskerwidth || 0;\n var showWhiskers = (trace.showwhiskers !== false);\n var notched = trace.notched || false;\n var nw = notched ? 1 - 2 * trace.notchwidth : 1;\n\n // to support for one-sided box\n var bdPos0;\n var bdPos1;\n if(Array.isArray(t.bdPos)) {\n bdPos0 = t.bdPos[0];\n bdPos1 = t.bdPos[1];\n } else {\n bdPos0 = t.bdPos;\n bdPos1 = t.bdPos;\n }\n\n var paths = sel.selectAll('path.box').data((\n trace.type !== 'violin' ||\n trace.box.visible\n ) ? Lib.identity : []);\n\n paths.enter().append('path')\n .style('vector-effect', isStatic ? 'none' : 'non-scaling-stroke')\n .attr('class', 'box');\n\n paths.exit().remove();\n\n paths.each(function(d) {\n if(d.empty) return d3.select(this).attr('d', 'M0,0Z');\n\n var lcenter = posAxis.c2l(d.pos + bPos, true);\n\n var pos0 = posAxis.l2p(lcenter - bdPos0) + bPosPxOffset;\n var pos1 = posAxis.l2p(lcenter + bdPos1) + bPosPxOffset;\n var posc = posHasRangeBreaks ? (pos0 + pos1) / 2 : posAxis.l2p(lcenter) + bPosPxOffset;\n\n var r = trace.whiskerwidth;\n var posw0 = posHasRangeBreaks ? pos0 * r + (1 - r) * posc : posAxis.l2p(lcenter - wdPos) + bPosPxOffset;\n var posw1 = posHasRangeBreaks ? pos1 * r + (1 - r) * posc : posAxis.l2p(lcenter + wdPos) + bPosPxOffset;\n\n var posm0 = posAxis.l2p(lcenter - bdPos0 * nw) + bPosPxOffset;\n var posm1 = posAxis.l2p(lcenter + bdPos1 * nw) + bPosPxOffset;\n var sdmode = trace.sizemode === 'sd';\n var q1 = valAxis.c2p(sdmode ? d.mean - d.sd : d.q1, true);\n var q3 = sdmode ? valAxis.c2p(d.mean + d.sd, true) :\n valAxis.c2p(d.q3, true);\n // make sure median isn't identical to either of the\n // quartiles, so we can see it\n var m = Lib.constrain(\n sdmode ? valAxis.c2p(d.mean, true) :\n valAxis.c2p(d.med, true),\n Math.min(q1, q3) + 1, Math.max(q1, q3) - 1\n );\n\n // for compatibility with box, violin, and candlestick\n // perhaps we should put this into cd0.t instead so it's more explicit,\n // but what we have now is:\n // - box always has d.lf, but boxpoints can be anything\n // - violin has d.lf and should always use it (boxpoints is undefined)\n // - candlestick has only min/max\n var useExtremes = (d.lf === undefined) || (trace.boxpoints === false) || sdmode;\n var lf = valAxis.c2p(useExtremes ? d.min : d.lf, true);\n var uf = valAxis.c2p(useExtremes ? d.max : d.uf, true);\n var ln = valAxis.c2p(d.ln, true);\n var un = valAxis.c2p(d.un, true);\n\n if(isHorizontal) {\n d3.select(this).attr('d',\n 'M' + m + ',' + posm0 + 'V' + posm1 + // median line\n 'M' + q1 + ',' + pos0 + 'V' + pos1 + // left edge\n (notched ?\n 'H' + ln + 'L' + m + ',' + posm1 + 'L' + un + ',' + pos1 :\n ''\n ) + // top notched edge\n 'H' + q3 + // end of the top edge\n 'V' + pos0 + // right edge\n (notched ? 'H' + un + 'L' + m + ',' + posm0 + 'L' + ln + ',' + pos0 : '') + // bottom notched edge\n 'Z' + // end of the box\n (showWhiskers ?\n 'M' + q1 + ',' + posc + 'H' + lf + 'M' + q3 + ',' + posc + 'H' + uf + // whiskers\n (whiskerWidth === 0 ?\n '' : // whisker caps\n 'M' + lf + ',' + posw0 + 'V' + posw1 + 'M' + uf + ',' + posw0 + 'V' + posw1\n ) :\n ''\n )\n );\n } else {\n d3.select(this).attr('d',\n 'M' + posm0 + ',' + m + 'H' + posm1 + // median line\n 'M' + pos0 + ',' + q1 + 'H' + pos1 + // top of the box\n (notched ?\n 'V' + ln + 'L' + posm1 + ',' + m + 'L' + pos1 + ',' + un :\n ''\n ) + // notched right edge\n 'V' + q3 + // end of the right edge\n 'H' + pos0 + // bottom of the box\n (notched ?\n 'V' + un + 'L' + posm0 + ',' + m + 'L' + pos0 + ',' + ln :\n ''\n ) + // notched left edge\n 'Z' + // end of the box\n (showWhiskers ?\n 'M' + posc + ',' + q1 + 'V' + lf + 'M' + posc + ',' + q3 + 'V' + uf + // whiskers\n (whiskerWidth === 0 ?\n '' : // whisker caps\n 'M' + posw0 + ',' + lf + 'H' + posw1 + 'M' + posw0 + ',' + uf + 'H' + posw1\n ) :\n ''\n )\n );\n }\n });\n}\n\nfunction plotPoints(sel, axes, trace, t) {\n var xa = axes.x;\n var ya = axes.y;\n var bdPos = t.bdPos;\n var bPos = t.bPos;\n\n // to support violin points\n var mode = trace.boxpoints || trace.points;\n\n // repeatable pseudo-random number generator\n Lib.seedPseudoRandom();\n\n // since box plot points get an extra level of nesting, each\n // box needs the trace styling info\n var fn = function(d) {\n d.forEach(function(v) {\n v.t = t;\n v.trace = trace;\n });\n return d;\n };\n\n var gPoints = sel.selectAll('g.points')\n .data(mode ? fn : []);\n\n gPoints.enter().append('g')\n .attr('class', 'points');\n\n gPoints.exit().remove();\n\n var paths = gPoints.selectAll('path')\n .data(function(d) {\n var i;\n var pts = d.pts2;\n\n // normally use IQR, but if this is 0 or too small, use max-min\n var typicalSpread = Math.max((d.max - d.min) / 10, d.q3 - d.q1);\n var minSpread = typicalSpread * 1e-9;\n var spreadLimit = typicalSpread * JITTERSPREAD;\n var jitterFactors = [];\n var maxJitterFactor = 0;\n var newJitter;\n\n // dynamic jitter\n if(trace.jitter) {\n if(typicalSpread === 0) {\n // edge case of no spread at all: fall back to max jitter\n maxJitterFactor = 1;\n jitterFactors = new Array(pts.length);\n for(i = 0; i < pts.length; i++) {\n jitterFactors[i] = 1;\n }\n } else {\n for(i = 0; i < pts.length; i++) {\n var i0 = Math.max(0, i - JITTERCOUNT);\n var pmin = pts[i0].v;\n var i1 = Math.min(pts.length - 1, i + JITTERCOUNT);\n var pmax = pts[i1].v;\n\n if(mode !== 'all') {\n if(pts[i].v < d.lf) pmax = Math.min(pmax, d.lf);\n else pmin = Math.max(pmin, d.uf);\n }\n\n var jitterFactor = Math.sqrt(spreadLimit * (i1 - i0) / (pmax - pmin + minSpread)) || 0;\n jitterFactor = Lib.constrain(Math.abs(jitterFactor), 0, 1);\n\n jitterFactors.push(jitterFactor);\n maxJitterFactor = Math.max(jitterFactor, maxJitterFactor);\n }\n }\n newJitter = trace.jitter * 2 / (maxJitterFactor || 1);\n }\n\n // fills in 'x' and 'y' in calcdata 'pts' item\n for(i = 0; i < pts.length; i++) {\n var pt = pts[i];\n var v = pt.v;\n\n var jitterOffset = trace.jitter ?\n (newJitter * jitterFactors[i] * (Lib.pseudoRandom() - 0.5)) :\n 0;\n\n var posPx = d.pos + bPos + bdPos * (trace.pointpos + jitterOffset);\n\n if(trace.orientation === 'h') {\n pt.y = posPx;\n pt.x = v;\n } else {\n pt.x = posPx;\n pt.y = v;\n }\n\n // tag suspected outliers\n if(mode === 'suspectedoutliers' && v < d.uo && v > d.lo) {\n pt.so = true;\n }\n }\n\n return pts;\n });\n\n paths.enter().append('path')\n .classed('point', true);\n\n paths.exit().remove();\n\n paths.call(Drawing.translatePoints, xa, ya);\n}\n\nfunction plotBoxMean(sel, axes, trace, t) {\n var valAxis = axes.val;\n var posAxis = axes.pos;\n var posHasRangeBreaks = !!posAxis.rangebreaks;\n\n var bPos = t.bPos;\n var bPosPxOffset = t.bPosPxOffset || 0;\n\n // to support violin mean lines\n var mode = trace.boxmean || (trace.meanline || {}).visible;\n\n // to support for one-sided box\n var bdPos0;\n var bdPos1;\n if(Array.isArray(t.bdPos)) {\n bdPos0 = t.bdPos[0];\n bdPos1 = t.bdPos[1];\n } else {\n bdPos0 = t.bdPos;\n bdPos1 = t.bdPos;\n }\n\n var paths = sel.selectAll('path.mean').data((\n (trace.type === 'box' && trace.boxmean) ||\n (trace.type === 'violin' && trace.box.visible && trace.meanline.visible)\n ) ? Lib.identity : []);\n\n paths.enter().append('path')\n .attr('class', 'mean')\n .style({\n fill: 'none',\n 'vector-effect': 'non-scaling-stroke'\n });\n\n paths.exit().remove();\n\n paths.each(function(d) {\n var lcenter = posAxis.c2l(d.pos + bPos, true);\n\n var pos0 = posAxis.l2p(lcenter - bdPos0) + bPosPxOffset;\n var pos1 = posAxis.l2p(lcenter + bdPos1) + bPosPxOffset;\n var posc = posHasRangeBreaks ? (pos0 + pos1) / 2 : posAxis.l2p(lcenter) + bPosPxOffset;\n\n var m = valAxis.c2p(d.mean, true);\n var sl = valAxis.c2p(d.mean - d.sd, true);\n var sh = valAxis.c2p(d.mean + d.sd, true);\n\n if(trace.orientation === 'h') {\n d3.select(this).attr('d',\n 'M' + m + ',' + pos0 + 'V' + pos1 +\n (mode === 'sd' ?\n 'm0,0L' + sl + ',' + posc + 'L' + m + ',' + pos0 + 'L' + sh + ',' + posc + 'Z' :\n '')\n );\n } else {\n d3.select(this).attr('d',\n 'M' + pos0 + ',' + m + 'H' + pos1 +\n (mode === 'sd' ?\n 'm0,0L' + posc + ',' + sl + 'L' + pos0 + ',' + m + 'L' + posc + ',' + sh + 'Z' :\n '')\n );\n }\n });\n}\n\nmodule.exports = {\n plot: plot,\n plotBoxAndWhiskers: plotBoxAndWhiskers,\n plotPoints: plotPoints,\n plotBoxMean: plotBoxMean\n};\n","'use strict';\n\nmodule.exports = function eventData(out, pt, trace) {\n // standard cartesian event data\n out.x = 'xVal' in pt ? pt.xVal : pt.x;\n out.y = 'yVal' in pt ? pt.yVal : pt.y;\n if(pt.xa) out.xaxis = pt.xa;\n if(pt.ya) out.yaxis = pt.ya;\n\n if(trace.orientation === 'h') {\n out.label = out.y;\n out.value = out.x;\n } else {\n out.label = out.x;\n out.value = out.y;\n }\n\n return out;\n};\n","'use strict';\n\nvar Axes = require('../../plots/cartesian/axes');\nvar alignPeriod = require('../../plots/cartesian/align_period');\nvar hasColorscale = require('../../components/colorscale/helpers').hasColorscale;\nvar colorscaleCalc = require('../../components/colorscale/calc');\nvar arraysToCalcdata = require('./arrays_to_calcdata');\nvar calcSelection = require('../scatter/calc_selection');\n\nmodule.exports = function calc(gd, trace) {\n var xa = Axes.getFromId(gd, trace.xaxis || 'x');\n var ya = Axes.getFromId(gd, trace.yaxis || 'y');\n var size, pos, origPos, pObj, hasPeriod, pLetter;\n\n var sizeOpts = {\n msUTC: !!(trace.base || trace.base === 0)\n };\n\n if(trace.orientation === 'h') {\n size = xa.makeCalcdata(trace, 'x', sizeOpts);\n origPos = ya.makeCalcdata(trace, 'y');\n pObj = alignPeriod(trace, ya, 'y', origPos);\n hasPeriod = !!trace.yperiodalignment;\n pLetter = 'y';\n } else {\n size = ya.makeCalcdata(trace, 'y', sizeOpts);\n origPos = xa.makeCalcdata(trace, 'x');\n pObj = alignPeriod(trace, xa, 'x', origPos);\n hasPeriod = !!trace.xperiodalignment;\n pLetter = 'x';\n }\n pos = pObj.vals;\n\n // create the \"calculated data\" to plot\n var serieslen = Math.min(pos.length, size.length);\n var cd = new Array(serieslen);\n\n // set position and size\n for(var i = 0; i < serieslen; i++) {\n cd[i] = { p: pos[i], s: size[i] };\n\n if(hasPeriod) {\n cd[i].orig_p = origPos[i]; // used by hover\n cd[i][pLetter + 'End'] = pObj.ends[i];\n cd[i][pLetter + 'Start'] = pObj.starts[i];\n }\n\n if(trace.ids) {\n cd[i].id = String(trace.ids[i]);\n }\n }\n\n // auto-z and autocolorscale if applicable\n if(hasColorscale(trace, 'marker')) {\n colorscaleCalc(gd, trace, {\n vals: trace.marker.color,\n containerStr: 'marker',\n cLetter: 'c'\n });\n }\n if(hasColorscale(trace, 'marker.line')) {\n colorscaleCalc(gd, trace, {\n vals: trace.marker.line.color,\n containerStr: 'marker.line',\n cLetter: 'c'\n });\n }\n\n arraysToCalcdata(cd, trace);\n calcSelection(cd, trace);\n\n return cd;\n};\n","'use strict';\n\nmodule.exports = {\n hiddenlabels: {\n valType: 'data_array',\n editType: 'calc',\n description: [\n 'hiddenlabels is the funnelarea & pie chart analog of',\n 'visible:\\'legendonly\\'',\n 'but it can contain many labels, and can simultaneously',\n 'hide slices from several pies/funnelarea charts'\n ].join(' ')\n },\n piecolorway: {\n valType: 'colorlist',\n editType: 'calc',\n description: [\n 'Sets the default pie slice colors. Defaults to the main',\n '`colorway` used for trace colors. If you specify a new',\n 'list here it can still be extended with lighter and darker',\n 'colors, see `extendpiecolors`.'\n ].join(' ')\n },\n extendpiecolors: {\n valType: 'boolean',\n dflt: true,\n editType: 'calc',\n description: [\n 'If `true`, the pie slice colors (whether given by `piecolorway` or',\n 'inherited from `colorway`) will be extended to three times its',\n 'original length by first repeating every color 20% lighter then',\n 'each color 20% darker. This is intended to reduce the likelihood',\n 'of reusing the same color when you have many slices, but you can',\n 'set `false` to disable.',\n 'Colors provided in the trace, using `marker.colors`, are never',\n 'extended.'\n ].join(' ')\n }\n};\n","'use strict';\n\nvar isNumeric = require('fast-isnumeric');\n\nvar Axes = require('../../plots/cartesian/axes');\nvar alignPeriod = require('../../plots/cartesian/align_period');\nvar Lib = require('../../lib');\n\nvar BADNUM = require('../../constants/numerical').BADNUM;\nvar _ = Lib._;\n\nmodule.exports = function calc(gd, trace) {\n var fullLayout = gd._fullLayout;\n var xa = Axes.getFromId(gd, trace.xaxis || 'x');\n var ya = Axes.getFromId(gd, trace.yaxis || 'y');\n var cd = [];\n\n // N.B. violin reuses same Box.calc\n var numKey = trace.type === 'violin' ? '_numViolins' : '_numBoxes';\n\n var i, j;\n var valAxis, valLetter;\n var posAxis, posLetter;\n\n var hasPeriod;\n if(trace.orientation === 'h') {\n valAxis = xa;\n valLetter = 'x';\n posAxis = ya;\n posLetter = 'y';\n hasPeriod = !!trace.yperiodalignment;\n } else {\n valAxis = ya;\n valLetter = 'y';\n posAxis = xa;\n posLetter = 'x';\n hasPeriod = !!trace.xperiodalignment;\n }\n\n var allPosArrays = getPosArrays(trace, posLetter, posAxis, fullLayout[numKey]);\n var posArray = allPosArrays[0];\n var origPos = allPosArrays[1];\n var dv = Lib.distinctVals(posArray, posAxis);\n var posDistinct = dv.vals;\n var dPos = dv.minDiff / 2;\n\n // item in trace calcdata\n var cdi;\n // array of {v: v, i, i} sample pts\n var pts;\n // values of the `pts` array of objects\n var boxVals;\n // length of sample\n var N;\n // single sample point\n var pt;\n // single sample value\n var v;\n\n // filter function for outlier pts\n // outlier definition based on http://www.physics.csbsju.edu/stats/box2.html\n var ptFilterFn = (trace.boxpoints || trace.points) === 'all' ?\n Lib.identity :\n function(pt) { return (pt.v < cdi.lf || pt.v > cdi.uf); };\n\n if(trace._hasPreCompStats) {\n var valArrayRaw = trace[valLetter];\n var d2c = function(k) { return valAxis.d2c((trace[k] || [])[i]); };\n var minVal = Infinity;\n var maxVal = -Infinity;\n\n for(i = 0; i < trace._length; i++) {\n var posi = posArray[i];\n if(!isNumeric(posi)) continue;\n\n cdi = {};\n cdi.pos = cdi[posLetter] = posi;\n if(hasPeriod && origPos) {\n cdi.orig_p = origPos[i]; // used by hover\n }\n\n cdi.q1 = d2c('q1');\n cdi.med = d2c('median');\n cdi.q3 = d2c('q3');\n\n pts = [];\n if(valArrayRaw && Lib.isArrayOrTypedArray(valArrayRaw[i])) {\n for(j = 0; j < valArrayRaw[i].length; j++) {\n v = valAxis.d2c(valArrayRaw[i][j]);\n if(v !== BADNUM) {\n pt = {v: v, i: [i, j]};\n arraysToCalcdata(pt, trace, [i, j]);\n pts.push(pt);\n }\n }\n }\n cdi.pts = pts.sort(sortByVal);\n boxVals = cdi[valLetter] = pts.map(extractVal);\n N = boxVals.length;\n\n if(cdi.med !== BADNUM && cdi.q1 !== BADNUM && cdi.q3 !== BADNUM &&\n cdi.med >= cdi.q1 && cdi.q3 >= cdi.med\n ) {\n var lf = d2c('lowerfence');\n cdi.lf = (lf !== BADNUM && lf <= cdi.q1) ?\n lf :\n computeLowerFence(cdi, boxVals, N);\n\n var uf = d2c('upperfence');\n cdi.uf = (uf !== BADNUM && uf >= cdi.q3) ?\n uf :\n computeUpperFence(cdi, boxVals, N);\n\n var mean = d2c('mean');\n cdi.mean = (mean !== BADNUM) ?\n mean :\n (N ? Lib.mean(boxVals, N) : (cdi.q1 + cdi.q3) / 2);\n\n var sd = d2c('sd');\n cdi.sd = (mean !== BADNUM && sd >= 0) ?\n sd :\n (N ? Lib.stdev(boxVals, N, cdi.mean) : (cdi.q3 - cdi.q1));\n\n cdi.lo = computeLowerOutlierBound(cdi);\n cdi.uo = computeUpperOutlierBound(cdi);\n\n var ns = d2c('notchspan');\n ns = (ns !== BADNUM && ns > 0) ? ns : computeNotchSpan(cdi, N);\n cdi.ln = cdi.med - ns;\n cdi.un = cdi.med + ns;\n\n var imin = cdi.lf;\n var imax = cdi.uf;\n if(trace.boxpoints && boxVals.length) {\n imin = Math.min(imin, boxVals[0]);\n imax = Math.max(imax, boxVals[N - 1]);\n }\n if(trace.notched) {\n imin = Math.min(imin, cdi.ln);\n imax = Math.max(imax, cdi.un);\n }\n cdi.min = imin;\n cdi.max = imax;\n } else {\n Lib.warn([\n 'Invalid input - make sure that q1 <= median <= q3',\n 'q1 = ' + cdi.q1,\n 'median = ' + cdi.med,\n 'q3 = ' + cdi.q3\n ].join('\\n'));\n\n var v0;\n if(cdi.med !== BADNUM) {\n v0 = cdi.med;\n } else if(cdi.q1 !== BADNUM) {\n if(cdi.q3 !== BADNUM) v0 = (cdi.q1 + cdi.q3) / 2;\n else v0 = cdi.q1;\n } else if(cdi.q3 !== BADNUM) {\n v0 = cdi.q3;\n } else {\n v0 = 0;\n }\n\n // draw box as line segment\n cdi.med = v0;\n cdi.q1 = cdi.q3 = v0;\n cdi.lf = cdi.uf = v0;\n cdi.mean = cdi.sd = v0;\n cdi.ln = cdi.un = v0;\n cdi.min = cdi.max = v0;\n }\n\n minVal = Math.min(minVal, cdi.min);\n maxVal = Math.max(maxVal, cdi.max);\n\n cdi.pts2 = pts.filter(ptFilterFn);\n\n cd.push(cdi);\n }\n\n trace._extremes[valAxis._id] = Axes.findExtremes(valAxis,\n [minVal, maxVal],\n {padded: true}\n );\n } else {\n var valArray = valAxis.makeCalcdata(trace, valLetter);\n var posBins = makeBins(posDistinct, dPos);\n var pLen = posDistinct.length;\n var ptsPerBin = initNestedArray(pLen);\n\n // bin pts info per position bins\n for(i = 0; i < trace._length; i++) {\n v = valArray[i];\n if(!isNumeric(v)) continue;\n\n var n = Lib.findBin(posArray[i], posBins);\n if(n >= 0 && n < pLen) {\n pt = {v: v, i: i};\n arraysToCalcdata(pt, trace, i);\n ptsPerBin[n].push(pt);\n }\n }\n\n var minLowerNotch = Infinity;\n var maxUpperNotch = -Infinity;\n\n var quartilemethod = trace.quartilemethod;\n var usesExclusive = quartilemethod === 'exclusive';\n var usesInclusive = quartilemethod === 'inclusive';\n\n // build calcdata trace items, one item per distinct position\n for(i = 0; i < pLen; i++) {\n if(ptsPerBin[i].length > 0) {\n cdi = {};\n cdi.pos = cdi[posLetter] = posDistinct[i];\n\n pts = cdi.pts = ptsPerBin[i].sort(sortByVal);\n boxVals = cdi[valLetter] = pts.map(extractVal);\n N = boxVals.length;\n\n cdi.min = boxVals[0];\n cdi.max = boxVals[N - 1];\n cdi.mean = Lib.mean(boxVals, N);\n cdi.sd = Lib.stdev(boxVals, N, cdi.mean) * trace.sdmultiple;\n cdi.med = Lib.interp(boxVals, 0.5);\n\n if((N % 2) && (usesExclusive || usesInclusive)) {\n var lower;\n var upper;\n\n if(usesExclusive) {\n // do NOT include the median in either half\n lower = boxVals.slice(0, N / 2);\n upper = boxVals.slice(N / 2 + 1);\n } else if(usesInclusive) {\n // include the median in either half\n lower = boxVals.slice(0, N / 2 + 1);\n upper = boxVals.slice(N / 2);\n }\n\n cdi.q1 = Lib.interp(lower, 0.5);\n cdi.q3 = Lib.interp(upper, 0.5);\n } else {\n cdi.q1 = Lib.interp(boxVals, 0.25);\n cdi.q3 = Lib.interp(boxVals, 0.75);\n }\n\n // lower and upper fences\n cdi.lf = computeLowerFence(cdi, boxVals, N);\n cdi.uf = computeUpperFence(cdi, boxVals, N);\n\n // lower and upper outliers bounds\n cdi.lo = computeLowerOutlierBound(cdi);\n cdi.uo = computeUpperOutlierBound(cdi);\n\n // lower and upper notches\n var mci = computeNotchSpan(cdi, N);\n cdi.ln = cdi.med - mci;\n cdi.un = cdi.med + mci;\n minLowerNotch = Math.min(minLowerNotch, cdi.ln);\n maxUpperNotch = Math.max(maxUpperNotch, cdi.un);\n\n cdi.pts2 = pts.filter(ptFilterFn);\n\n cd.push(cdi);\n }\n }\n\n if(trace.notched && Lib.isTypedArray(valArray)) valArray = Array.from(valArray);\n trace._extremes[valAxis._id] = Axes.findExtremes(valAxis,\n trace.notched ? valArray.concat([minLowerNotch, maxUpperNotch]) : valArray,\n {padded: true}\n );\n }\n\n calcSelection(cd, trace);\n\n if(cd.length > 0) {\n cd[0].t = {\n num: fullLayout[numKey],\n dPos: dPos,\n posLetter: posLetter,\n valLetter: valLetter,\n labels: {\n med: _(gd, 'median:'),\n min: _(gd, 'min:'),\n q1: _(gd, 'q1:'),\n q3: _(gd, 'q3:'),\n max: _(gd, 'max:'),\n mean: (trace.boxmean === 'sd') || (trace.sizemode === 'sd') ?\n _(gd, 'mean ± σ:').replace('σ', trace.sdmultiple === 1 ? 'σ' : (trace.sdmultiple + 'σ')) : // displaying mean +- Nσ whilst supporting translations\n _(gd, 'mean:'),\n lf: _(gd, 'lower fence:'),\n uf: _(gd, 'upper fence:')\n }\n };\n\n fullLayout[numKey]++;\n return cd;\n } else {\n return [{t: {empty: true}}];\n }\n};\n\n// In vertical (horizontal) box plots:\n// if no x (y) data, use x0 (y0), or name\n// so if you want one box\n// per trace, set x0 (y0) to the x (y) value or category for this trace\n// (or set x (y) to a constant array matching y (x))\nfunction getPosArrays(trace, posLetter, posAxis, num) {\n var hasPosArray = posLetter in trace;\n var hasPos0 = posLetter + '0' in trace;\n var hasPosStep = 'd' + posLetter in trace;\n\n if(hasPosArray || (hasPos0 && hasPosStep)) {\n var origPos = posAxis.makeCalcdata(trace, posLetter);\n var pos = alignPeriod(trace, posAxis, posLetter, origPos).vals;\n return [pos, origPos];\n }\n\n var pos0;\n if(hasPos0) {\n pos0 = trace[posLetter + '0'];\n } else if('name' in trace && (\n posAxis.type === 'category' || (\n isNumeric(trace.name) &&\n ['linear', 'log'].indexOf(posAxis.type) !== -1\n ) || (\n Lib.isDateTime(trace.name) &&\n posAxis.type === 'date'\n )\n )) {\n pos0 = trace.name;\n } else {\n pos0 = num;\n }\n\n var pos0c = posAxis.type === 'multicategory' ?\n posAxis.r2c_just_indices(pos0) :\n posAxis.d2c(pos0, 0, trace[posLetter + 'calendar']);\n\n var len = trace._length;\n var out = new Array(len);\n for(var i = 0; i < len; i++) out[i] = pos0c;\n\n return [out];\n}\n\nfunction makeBins(x, dx) {\n var len = x.length;\n var bins = new Array(len + 1);\n\n for(var i = 0; i < len; i++) {\n bins[i] = x[i] - dx;\n }\n bins[len] = x[len - 1] + dx;\n\n return bins;\n}\n\nfunction initNestedArray(len) {\n var arr = new Array(len);\n for(var i = 0; i < len; i++) {\n arr[i] = [];\n }\n return arr;\n}\n\nvar TRACE_TO_CALC = {\n text: 'tx',\n hovertext: 'htx'\n};\n\nfunction arraysToCalcdata(pt, trace, ptNumber) {\n for(var k in TRACE_TO_CALC) {\n if(Lib.isArrayOrTypedArray(trace[k])) {\n if(Array.isArray(ptNumber)) {\n if(Lib.isArrayOrTypedArray(trace[k][ptNumber[0]])) {\n pt[TRACE_TO_CALC[k]] = trace[k][ptNumber[0]][ptNumber[1]];\n }\n } else {\n pt[TRACE_TO_CALC[k]] = trace[k][ptNumber];\n }\n }\n }\n}\n\nfunction calcSelection(cd, trace) {\n if(Lib.isArrayOrTypedArray(trace.selectedpoints)) {\n for(var i = 0; i < cd.length; i++) {\n var pts = cd[i].pts || [];\n var ptNumber2cdIndex = {};\n\n for(var j = 0; j < pts.length; j++) {\n ptNumber2cdIndex[pts[j].i] = j;\n }\n\n Lib.tagSelected(pts, trace, ptNumber2cdIndex);\n }\n }\n}\n\nfunction sortByVal(a, b) { return a.v - b.v; }\n\nfunction extractVal(o) { return o.v; }\n\n// last point below 1.5 * IQR\nfunction computeLowerFence(cdi, boxVals, N) {\n if(N === 0) return cdi.q1;\n return Math.min(\n cdi.q1,\n boxVals[Math.min(\n Lib.findBin(2.5 * cdi.q1 - 1.5 * cdi.q3, boxVals, true) + 1,\n N - 1\n )]\n );\n}\n\n// last point above 1.5 * IQR\nfunction computeUpperFence(cdi, boxVals, N) {\n if(N === 0) return cdi.q3;\n return Math.max(\n cdi.q3,\n boxVals[Math.max(\n Lib.findBin(2.5 * cdi.q3 - 1.5 * cdi.q1, boxVals),\n 0\n )]\n );\n}\n\n// 3 IQR below (don't clip to max/min,\n// this is only for discriminating suspected & far outliers)\nfunction computeLowerOutlierBound(cdi) {\n return 4 * cdi.q1 - 3 * cdi.q3;\n}\n\n// 3 IQR above (don't clip to max/min,\n// this is only for discriminating suspected & far outliers)\nfunction computeUpperOutlierBound(cdi) {\n return 4 * cdi.q3 - 3 * cdi.q1;\n}\n\n// 95% confidence intervals for median\nfunction computeNotchSpan(cdi, N) {\n if(N === 0) return 0;\n return 1.57 * (cdi.q3 - cdi.q1) / Math.sqrt(N);\n}\n","'use strict';\n\n\nmodule.exports = {\n percent: function(size, total) {\n var nMax = size.length;\n var norm = 100 / total;\n for(var n = 0; n < nMax; n++) size[n] *= norm;\n },\n probability: function(size, total) {\n var nMax = size.length;\n for(var n = 0; n < nMax; n++) size[n] /= total;\n },\n density: function(size, total, inc, yinc) {\n var nMax = size.length;\n yinc = yinc || 1;\n for(var n = 0; n < nMax; n++) size[n] *= inc[n] * yinc;\n },\n 'probability density': function(size, total, inc, yinc) {\n var nMax = size.length;\n if(yinc) total /= yinc;\n for(var n = 0; n < nMax; n++) size[n] *= inc[n] / total;\n }\n};\n","'use strict';\n\nvar d3 = require('@plotly/d3');\n\nvar styleOne = require('./style_one');\nvar resizeText = require('../bar/uniform_text').resizeText;\n\nmodule.exports = function style(gd) {\n var s = gd._fullLayout._pielayer.selectAll('.trace');\n resizeText(gd, s, 'pie');\n\n s.each(function(cd) {\n var cd0 = cd[0];\n var trace = cd0.trace;\n var traceSelection = d3.select(this);\n\n traceSelection.style({opacity: trace.opacity});\n\n traceSelection.selectAll('path.surface').each(function(pt) {\n d3.select(this).call(styleOne, pt, trace, gd);\n });\n });\n};\n","'use strict';\n\nvar isNumeric = require('fast-isnumeric');\nvar Lib = require('../../lib');\nvar attributes = require('./attributes');\nvar handleDomainDefaults = require('../../plots/domain').defaults;\nvar handleText = require('../bar/defaults').handleText;\nvar coercePattern = require('../../lib').coercePattern;\n\nfunction handleLabelsAndValues(labels, values) {\n var hasLabels = Lib.isArrayOrTypedArray(labels);\n var hasValues = Lib.isArrayOrTypedArray(values);\n var len = Math.min(\n hasLabels ? labels.length : Infinity,\n hasValues ? values.length : Infinity\n );\n\n if(!isFinite(len)) len = 0;\n\n if(len && hasValues) {\n var hasPositive;\n for(var i = 0; i < len; i++) {\n var v = values[i];\n if(isNumeric(v) && v > 0) {\n hasPositive = true;\n break;\n }\n }\n if(!hasPositive) len = 0;\n }\n\n return {\n hasLabels: hasLabels,\n hasValues: hasValues,\n len: len\n };\n}\n\nfunction handleMarkerDefaults(traceIn, traceOut, layout, coerce, isPie) {\n var lineWidth = coerce('marker.line.width');\n if(lineWidth) {\n coerce('marker.line.color',\n isPie ? undefined :\n layout.paper_bgcolor // case of funnelarea, sunburst, icicle, treemap\n );\n }\n\n var markerColors = coerce('marker.colors');\n coercePattern(coerce, 'marker.pattern', markerColors);\n // push the marker colors (with s) to the foreground colors, to work around logic in the drawing pattern code on marker.color (without s, which is okay for a bar trace)\n if(traceIn.marker && !traceOut.marker.pattern.fgcolor) traceOut.marker.pattern.fgcolor = traceIn.marker.colors;\n if(!traceOut.marker.pattern.bgcolor) traceOut.marker.pattern.bgcolor = layout.paper_bgcolor;\n}\n\nfunction supplyDefaults(traceIn, traceOut, defaultColor, layout) {\n function coerce(attr, dflt) {\n return Lib.coerce(traceIn, traceOut, attributes, attr, dflt);\n }\n\n var labels = coerce('labels');\n var values = coerce('values');\n\n var res = handleLabelsAndValues(labels, values);\n var len = res.len;\n traceOut._hasLabels = res.hasLabels;\n traceOut._hasValues = res.hasValues;\n\n if(!traceOut._hasLabels &&\n traceOut._hasValues\n ) {\n coerce('label0');\n coerce('dlabel');\n }\n\n if(!len) {\n traceOut.visible = false;\n return;\n }\n traceOut._length = len;\n\n handleMarkerDefaults(traceIn, traceOut, layout, coerce, true);\n\n coerce('scalegroup');\n // TODO: hole needs to be coerced to the same value within a scaleegroup\n\n var textData = coerce('text');\n var textTemplate = coerce('texttemplate');\n var textInfo;\n if(!textTemplate) textInfo = coerce('textinfo', Lib.isArrayOrTypedArray(textData) ? 'text+percent' : 'percent');\n\n coerce('hovertext');\n coerce('hovertemplate');\n\n if(textTemplate || (textInfo && textInfo !== 'none')) {\n var textposition = coerce('textposition');\n handleText(traceIn, traceOut, layout, coerce, textposition, {\n moduleHasSelected: false,\n moduleHasUnselected: false,\n moduleHasConstrain: false,\n moduleHasCliponaxis: false,\n moduleHasTextangle: false,\n moduleHasInsideanchor: false\n });\n\n var hasBoth = Array.isArray(textposition) || textposition === 'auto';\n var hasOutside = hasBoth || textposition === 'outside';\n if(hasOutside) {\n coerce('automargin');\n }\n\n if(textposition === 'inside' || textposition === 'auto' || Array.isArray(textposition)) {\n coerce('insidetextorientation');\n }\n }\n\n handleDomainDefaults(traceOut, layout, coerce);\n\n var hole = coerce('hole');\n var title = coerce('title.text');\n if(title) {\n var titlePosition = coerce('title.position', hole ? 'middle center' : 'top center');\n if(!hole && titlePosition === 'middle center') traceOut.title.position = 'top center';\n Lib.coerceFont(coerce, 'title.font', layout.font);\n }\n\n coerce('sort');\n coerce('direction');\n coerce('rotation');\n coerce('pull');\n}\n\nmodule.exports = {\n handleLabelsAndValues: handleLabelsAndValues,\n handleMarkerDefaults: handleMarkerDefaults,\n supplyDefaults: supplyDefaults\n};\n","'use strict';\n\nvar subtypes = require('./subtypes');\n\nmodule.exports = {\n hasLines: subtypes.hasLines,\n hasMarkers: subtypes.hasMarkers,\n hasText: subtypes.hasText,\n isBubble: subtypes.isBubble,\n\n attributes: require('./attributes'),\n layoutAttributes: require('./layout_attributes'),\n supplyDefaults: require('./defaults'),\n crossTraceDefaults: require('./cross_trace_defaults'),\n supplyLayoutDefaults: require('./layout_defaults'),\n calc: require('./calc').calc,\n crossTraceCalc: require('./cross_trace_calc'),\n arraysToCalcdata: require('./arrays_to_calcdata'),\n plot: require('./plot'),\n colorbar: require('./marker_colorbar'),\n formatLabels: require('./format_labels'),\n style: require('./style').style,\n styleOnSelect: require('./style').styleOnSelect,\n hoverPoints: require('./hover'),\n selectPoints: require('./select'),\n animatable: true,\n\n moduleType: 'trace',\n name: 'scatter',\n basePlotModule: require('../../plots/cartesian'),\n categories: [\n 'cartesian', 'svg', 'symbols', 'errorBarsOK', 'showLegend', 'scatter-like',\n 'zoomScale'\n ],\n meta: {\n description: [\n 'The scatter trace type encompasses line charts, scatter charts, text charts, and bubble charts.',\n 'The data visualized as scatter point or lines is set in `x` and `y`.',\n 'Text (appearing either on the chart or on hover only) is via `text`.',\n 'Bubble charts are achieved by setting `marker.size` and/or `marker.color`',\n 'to numerical arrays.'\n ].join(' ')\n }\n};\n","'use strict';\n\nvar Lib = require('../lib');\nvar EventEmitter = require('events').EventEmitter;\n\nvar helpers = require('./helpers');\n\nfunction svgToImg(opts) {\n var ev = opts.emitter || new EventEmitter();\n\n var promise = new Promise(function(resolve, reject) {\n var Image = window.Image;\n var svg = opts.svg;\n var format = opts.format || 'png';\n\n // IE only support svg\n if(Lib.isIE() && format !== 'svg') {\n var ieSvgError = new Error(helpers.MSG_IE_BAD_FORMAT);\n reject(ieSvgError);\n // eventually remove the ev\n // in favor of promises\n if(!opts.promise) {\n return ev.emit('error', ieSvgError);\n } else {\n return promise;\n }\n }\n\n var canvas = opts.canvas;\n var scale = opts.scale || 1;\n var w0 = opts.width || 300;\n var h0 = opts.height || 150;\n var w1 = scale * w0;\n var h1 = scale * h0;\n\n var ctx = canvas.getContext('2d', {willReadFrequently: true});\n var img = new Image();\n var svgBlob, url;\n\n if(format === 'svg' || Lib.isSafari()) {\n url = helpers.encodeSVG(svg);\n } else {\n svgBlob = helpers.createBlob(svg, 'svg');\n url = helpers.createObjectURL(svgBlob);\n }\n\n canvas.width = w1;\n canvas.height = h1;\n\n img.onload = function() {\n var imgData;\n\n svgBlob = null;\n helpers.revokeObjectURL(url);\n\n // don't need to draw to canvas if svg\n // save some time and also avoid failure on IE\n if(format !== 'svg') {\n ctx.drawImage(img, 0, 0, w1, h1);\n }\n\n switch(format) {\n case 'jpeg':\n imgData = canvas.toDataURL('image/jpeg');\n break;\n case 'png':\n imgData = canvas.toDataURL('image/png');\n break;\n case 'webp':\n imgData = canvas.toDataURL('image/webp');\n break;\n case 'svg':\n imgData = url;\n break;\n default:\n var errorMsg = 'Image format is not jpeg, png, svg or webp.';\n reject(new Error(errorMsg));\n // eventually remove the ev\n // in favor of promises\n if(!opts.promise) {\n return ev.emit('error', errorMsg);\n }\n }\n resolve(imgData);\n // eventually remove the ev\n // in favor of promises\n if(!opts.promise) {\n ev.emit('success', imgData);\n }\n };\n\n img.onerror = function(err) {\n svgBlob = null;\n helpers.revokeObjectURL(url);\n\n reject(err);\n // eventually remove the ev\n // in favor of promises\n if(!opts.promise) {\n return ev.emit('error', err);\n }\n };\n\n img.src = url;\n });\n\n // temporary for backward compatibility\n // move to only Promise in 2.0.0\n // and eliminate the EventEmitter\n if(opts.promise) {\n return promise;\n }\n\n return ev;\n}\n\nmodule.exports = svgToImg;\n","'use strict';\n\nvar Lib = require('../../lib');\nvar handleGroupingDefaults = require('./grouping_defaults');\nvar attributes = require('./attributes');\n\n// remove opacity for any trace that has a fill or is filled to\nmodule.exports = function crossTraceDefaults(fullData, fullLayout) {\n var traceIn, traceOut, i;\n\n function coerce(attr) {\n return Lib.coerce(traceOut._input, traceOut, attributes, attr);\n }\n\n if(fullLayout.scattermode === 'group') {\n for(i = 0; i < fullData.length; i++) {\n traceOut = fullData[i];\n\n if(traceOut.type === 'scatter') {\n traceIn = traceOut._input;\n handleGroupingDefaults(traceIn, traceOut, fullLayout, coerce);\n }\n }\n }\n\n for(i = 0; i < fullData.length; i++) {\n var tracei = fullData[i];\n if(tracei.type !== 'scatter') continue;\n\n var filli = tracei.fill;\n if(filli === 'none' || filli === 'toself') continue;\n\n tracei.opacity = undefined;\n\n if(filli === 'tonexty' || filli === 'tonextx') {\n for(var j = i - 1; j >= 0; j--) {\n var tracej = fullData[j];\n\n if((tracej.type === 'scatter') &&\n (tracej.xaxis === tracei.xaxis) &&\n (tracej.yaxis === tracei.yaxis)) {\n tracej.opacity = undefined;\n break;\n }\n }\n }\n }\n};\n","'use strict';\n\nmodule.exports = Sieve;\n\nvar distinctVals = require('../../lib').distinctVals;\n\n/**\n * Helper class to sieve data from traces into bins\n *\n * @class\n *\n * @param {Array} traces\n* Array of calculated traces\n * @param {object} opts\n * - @param {boolean} [sepNegVal]\n * If true, then split data at the same position into a bar\n * for positive values and another for negative values\n * - @param {boolean} [overlapNoMerge]\n * If true, then don't merge overlapping bars into a single bar\n */\nfunction Sieve(traces, opts) {\n this.traces = traces;\n this.sepNegVal = opts.sepNegVal;\n this.overlapNoMerge = opts.overlapNoMerge;\n\n // for single-bin histograms - see histogram/calc\n var width1 = Infinity;\n\n var axLetter = opts.posAxis._id.charAt(0);\n\n var positions = [];\n for(var i = 0; i < traces.length; i++) {\n var trace = traces[i];\n for(var j = 0; j < trace.length; j++) {\n var bar = trace[j];\n var pos = bar.p;\n if(pos === undefined) {\n pos = bar[axLetter];\n }\n if(pos !== undefined) positions.push(pos);\n }\n if(trace[0] && trace[0].width1) {\n width1 = Math.min(trace[0].width1, width1);\n }\n }\n this.positions = positions;\n\n var dv = distinctVals(positions);\n\n this.distinctPositions = dv.vals;\n if(dv.vals.length === 1 && width1 !== Infinity) this.minDiff = width1;\n else this.minDiff = Math.min(dv.minDiff, width1);\n\n var type = (opts.posAxis || {}).type;\n if(type === 'category' || type === 'multicategory') {\n this.minDiff = 1;\n }\n\n this.binWidth = this.minDiff;\n\n this.bins = {};\n}\n\n/**\n * Sieve datum\n *\n * @method\n * @param {number} position\n * @param {number} value\n * @returns {number} Previous bin value\n */\nSieve.prototype.put = function put(position, value) {\n var label = this.getLabel(position, value);\n var oldValue = this.bins[label] || 0;\n\n this.bins[label] = oldValue + value;\n\n return oldValue;\n};\n\n/**\n * Get current bin value for a given datum\n *\n * @method\n * @param {number} position Position of datum\n * @param {number} [value] Value of datum\n * (required if this.sepNegVal is true)\n * @returns {number} Current bin value\n */\nSieve.prototype.get = function get(position, value) {\n var label = this.getLabel(position, value);\n return this.bins[label] || 0;\n};\n\n/**\n * Get bin label for a given datum\n *\n * @method\n * @param {number} position Position of datum\n * @param {number} [value] Value of datum\n * (required if this.sepNegVal is true)\n * @returns {string} Bin label\n * (prefixed with a 'v' if value is negative and this.sepNegVal is\n * true; otherwise prefixed with '^')\n */\nSieve.prototype.getLabel = function getLabel(position, value) {\n var prefix = (value < 0 && this.sepNegVal) ? 'v' : '^';\n var label = (this.overlapNoMerge) ?\n position :\n Math.round(position / this.binWidth);\n return prefix + label;\n};\n","'use strict';\n\nvar Lib = require('../../lib');\n\nvar INTERPTHRESHOLD = 1e-2;\nvar NEIGHBORSHIFTS = [[-1, 0], [1, 0], [0, -1], [0, 1]];\n\nfunction correctionOvershoot(maxFractionalChange) {\n // start with less overshoot, until we know it's converging,\n // then ramp up the overshoot for faster convergence\n return 0.5 - 0.25 * Math.min(1, maxFractionalChange * 0.5);\n}\n\n/*\n * interp2d: Fill in missing data from a 2D array using an iterative\n * poisson equation solver with zero-derivative BC at edges.\n * Amazingly, this just amounts to repeatedly averaging all the existing\n * nearest neighbors, at least if we don't take x/y scaling into account,\n * which is the right approach here where x and y may not even have the\n * same units.\n *\n * @param {array of arrays} z\n * The 2D array to fill in. Will be mutated here. Assumed to already be\n * cleaned, so all entries are numbers except gaps, which are `undefined`.\n * @param {array of arrays} emptyPoints\n * Each entry [i, j, neighborCount] for empty points z[i][j] and the number\n * of neighbors that are *not* missing. Assumed to be sorted from most to\n * least neighbors, as produced by heatmap/find_empties.\n */\nmodule.exports = function interp2d(z, emptyPoints) {\n var maxFractionalChange = 1;\n var i;\n\n // one pass to fill in a starting value for all the empties\n iterateInterp2d(z, emptyPoints);\n\n // we're don't need to iterate lone empties - remove them\n for(i = 0; i < emptyPoints.length; i++) {\n if(emptyPoints[i][2] < 4) break;\n }\n // but don't remove these points from the original array,\n // we'll use them for masking, so make a copy.\n emptyPoints = emptyPoints.slice(i);\n\n for(i = 0; i < 100 && maxFractionalChange > INTERPTHRESHOLD; i++) {\n maxFractionalChange = iterateInterp2d(z, emptyPoints,\n correctionOvershoot(maxFractionalChange));\n }\n if(maxFractionalChange > INTERPTHRESHOLD) {\n Lib.log('interp2d didn\\'t converge quickly', maxFractionalChange);\n }\n\n return z;\n};\n\nfunction iterateInterp2d(z, emptyPoints, overshoot) {\n var maxFractionalChange = 0;\n var thisPt;\n var i;\n var j;\n var p;\n var q;\n var neighborShift;\n var neighborRow;\n var neighborVal;\n var neighborCount;\n var neighborSum;\n var initialVal;\n var minNeighbor;\n var maxNeighbor;\n\n for(p = 0; p < emptyPoints.length; p++) {\n thisPt = emptyPoints[p];\n i = thisPt[0];\n j = thisPt[1];\n initialVal = z[i][j];\n neighborSum = 0;\n neighborCount = 0;\n\n for(q = 0; q < 4; q++) {\n neighborShift = NEIGHBORSHIFTS[q];\n neighborRow = z[i + neighborShift[0]];\n if(!neighborRow) continue;\n neighborVal = neighborRow[j + neighborShift[1]];\n if(neighborVal !== undefined) {\n if(neighborSum === 0) {\n minNeighbor = maxNeighbor = neighborVal;\n } else {\n minNeighbor = Math.min(minNeighbor, neighborVal);\n maxNeighbor = Math.max(maxNeighbor, neighborVal);\n }\n neighborCount++;\n neighborSum += neighborVal;\n }\n }\n\n if(neighborCount === 0) {\n throw 'iterateInterp2d order is wrong: no defined neighbors';\n }\n\n // this is the laplace equation interpolation:\n // each point is just the average of its neighbors\n // note that this ignores differential x/y scaling\n // which I think is the right approach, since we\n // don't know what that scaling means\n z[i][j] = neighborSum / neighborCount;\n\n if(initialVal === undefined) {\n if(neighborCount < 4) maxFractionalChange = 1;\n } else {\n // we can make large empty regions converge faster\n // if we overshoot the change vs the previous value\n z[i][j] = (1 + overshoot) * z[i][j] - overshoot * initialVal;\n\n if(maxNeighbor > minNeighbor) {\n maxFractionalChange = Math.max(maxFractionalChange,\n Math.abs(z[i][j] - initialVal) / (maxNeighbor - minNeighbor));\n }\n }\n }\n\n return maxFractionalChange;\n}\n","'use strict';\n\nvar appendArrayMultiPointValues = require('../../components/fx/helpers').appendArrayMultiPointValues;\n\n// Note: like other eventData routines, this creates the data for hover/unhover/click events\n// but it has a different API and goes through a totally different pathway.\n// So to ensure it doesn't get misused, it's not attached to the Pie module.\nmodule.exports = function eventData(pt, trace) {\n var out = {\n curveNumber: trace.index,\n pointNumbers: pt.pts,\n data: trace._input,\n fullData: trace,\n label: pt.label,\n color: pt.color,\n value: pt.v,\n percent: pt.percent,\n text: pt.text,\n bbox: pt.bbox,\n\n // pt.v (and pt.i below) for backward compatibility\n v: pt.v\n };\n\n // Only include pointNumber if it's unambiguous\n if(pt.pts.length === 1) out.pointNumber = out.i = pt.pts[0];\n\n // Add extra data arrays to the output\n // notice that this is the multi-point version ('s' on the end!)\n // so added data will be arrays matching the pointNumbers array.\n appendArrayMultiPointValues(out, trace, pt.pts);\n\n // don't include obsolete fields in new funnelarea traces\n if(trace.type === 'funnelarea') {\n delete out.v;\n delete out.i;\n }\n\n return out;\n};\n","'use strict';\n\nvar Lib = require('../../lib');\n\nvar handleXYZDefaults = require('./xyz_defaults');\nvar handleHeatmapLabelDefaults = require('./label_defaults');\nvar handlePeriodDefaults = require('../scatter/period_defaults');\nvar handleStyleDefaults = require('./style_defaults');\nvar colorscaleDefaults = require('../../components/colorscale/defaults');\nvar attributes = require('./attributes');\n\n\nmodule.exports = function supplyDefaults(traceIn, traceOut, defaultColor, layout) {\n function coerce(attr, dflt) {\n return Lib.coerce(traceIn, traceOut, attributes, attr, dflt);\n }\n\n var validData = handleXYZDefaults(traceIn, traceOut, coerce, layout);\n if(!validData) {\n traceOut.visible = false;\n return;\n }\n\n handlePeriodDefaults(traceIn, traceOut, layout, coerce);\n coerce('xhoverformat');\n coerce('yhoverformat');\n\n coerce('text');\n coerce('hovertext');\n coerce('hovertemplate');\n\n handleHeatmapLabelDefaults(coerce, layout);\n handleStyleDefaults(traceIn, traceOut, coerce, layout);\n\n coerce('hoverongaps');\n coerce('connectgaps', Lib.isArray1D(traceOut.z) && (traceOut.zsmooth !== false));\n\n colorscaleDefaults(traceIn, traceOut, layout, coerce, {prefix: '', cLetter: 'z'});\n};\n","'use strict';\n\nvar Lib = require('../../lib');\n\n/*\n * opts: object of flags to control features not all text users support\n * noSelect: caller does not support selected/unselected attribute containers\n */\nmodule.exports = function(traceIn, traceOut, layout, coerce, opts) {\n opts = opts || {};\n\n coerce('textposition');\n Lib.coerceFont(coerce, 'textfont', opts.font || layout.font);\n\n if(!opts.noSelect) {\n coerce('selected.textfont.color');\n coerce('unselected.textfont.color');\n }\n};\n","'use strict';\n\nvar Fx = require('../../components/fx');\nvar Registry = require('../../registry');\nvar Color = require('../../components/color');\n\nvar fillText = require('../../lib').fillText;\nvar getLineWidth = require('./helpers').getLineWidth;\nvar hoverLabelText = require('../../plots/cartesian/axes').hoverLabelText;\nvar BADNUM = require('../../constants/numerical').BADNUM;\n\nfunction hoverPoints(pointData, xval, yval, hovermode, opts) {\n var barPointData = hoverOnBars(pointData, xval, yval, hovermode, opts);\n\n if(barPointData) {\n var cd = barPointData.cd;\n var trace = cd[0].trace;\n var di = cd[barPointData.index];\n\n barPointData.color = getTraceColor(trace, di);\n Registry.getComponentMethod('errorbars', 'hoverInfo')(di, trace, barPointData);\n\n return [barPointData];\n }\n}\n\nfunction hoverOnBars(pointData, xval, yval, hovermode, opts) {\n var cd = pointData.cd;\n var trace = cd[0].trace;\n var t = cd[0].t;\n var isClosest = (hovermode === 'closest');\n var isWaterfall = (trace.type === 'waterfall');\n var maxHoverDistance = pointData.maxHoverDistance;\n var maxSpikeDistance = pointData.maxSpikeDistance;\n\n var posVal, sizeVal, posLetter, sizeLetter, dx, dy, pRangeCalc;\n\n if(trace.orientation === 'h') {\n posVal = yval;\n sizeVal = xval;\n posLetter = 'y';\n sizeLetter = 'x';\n dx = sizeFn;\n dy = positionFn;\n } else {\n posVal = xval;\n sizeVal = yval;\n posLetter = 'x';\n sizeLetter = 'y';\n dy = sizeFn;\n dx = positionFn;\n }\n\n var period = trace[posLetter + 'period'];\n var isClosestOrPeriod = isClosest || period;\n\n function thisBarMinPos(di) { return thisBarExtPos(di, -1); }\n function thisBarMaxPos(di) { return thisBarExtPos(di, 1); }\n\n function thisBarExtPos(di, sgn) {\n var w = di.w;\n\n return di[posLetter] + sgn * w / 2;\n }\n\n function periodLength(di) {\n return di[posLetter + 'End'] - di[posLetter + 'Start'];\n }\n\n var minPos = isClosest ?\n thisBarMinPos : period ?\n function(di) {\n return di.p - periodLength(di) / 2;\n } :\n function(di) {\n /*\n * In compare mode, accept a bar if you're on it *or* its group.\n * Nearly always it's the group that matters, but in case the bar\n * was explicitly set wider than its group we'd better accept the\n * whole bar.\n *\n * use `bardelta` instead of `bargroupwidth` so we accept hover\n * in the gap. That way hover doesn't flash on and off as you\n * mouse over the plot in compare modes.\n * In 'closest' mode though the flashing seems inevitable,\n * without far more complex logic\n */\n return Math.min(thisBarMinPos(di), di.p - t.bardelta / 2);\n };\n\n var maxPos = isClosest ?\n thisBarMaxPos : period ?\n function(di) {\n return di.p + periodLength(di) / 2;\n } :\n function(di) {\n return Math.max(thisBarMaxPos(di), di.p + t.bardelta / 2);\n };\n\n function inbox(_minPos, _maxPos, maxDistance) {\n if(opts.finiteRange) maxDistance = 0;\n\n // add a little to the pseudo-distance for wider bars, so that like scatter,\n // if you are over two overlapping bars, the narrower one wins.\n return Fx.inbox(_minPos - posVal, _maxPos - posVal,\n maxDistance + Math.min(1, Math.abs(_maxPos - _minPos) / pRangeCalc) - 1);\n }\n\n function positionFn(di) {\n return inbox(minPos(di), maxPos(di), maxHoverDistance);\n }\n\n function thisBarPositionFn(di) {\n return inbox(thisBarMinPos(di), thisBarMaxPos(di), maxSpikeDistance);\n }\n\n function getSize(di) {\n var s = di[sizeLetter];\n\n if(isWaterfall) {\n var rawS = Math.abs(di.rawS) || 0;\n if(sizeVal > 0) {\n s += rawS;\n } else if(sizeVal < 0) {\n s -= rawS;\n }\n }\n\n return s;\n }\n\n function sizeFn(di) {\n var v = sizeVal;\n var b = di.b;\n var s = getSize(di);\n\n // add a gradient so hovering near the end of a\n // bar makes it a little closer match\n return Fx.inbox(b - v, s - v, maxHoverDistance + (s - v) / (s - b) - 1);\n }\n\n function thisBarSizeFn(di) {\n var v = sizeVal;\n var b = di.b;\n var s = getSize(di);\n\n // add a gradient so hovering near the end of a\n // bar makes it a little closer match\n return Fx.inbox(b - v, s - v, maxSpikeDistance + (s - v) / (s - b) - 1);\n }\n\n var pa = pointData[posLetter + 'a'];\n var sa = pointData[sizeLetter + 'a'];\n\n pRangeCalc = Math.abs(pa.r2c(pa.range[1]) - pa.r2c(pa.range[0]));\n\n function dxy(di) { return (dx(di) + dy(di)) / 2; }\n var distfn = Fx.getDistanceFunction(hovermode, dx, dy, dxy);\n Fx.getClosest(cd, distfn, pointData);\n\n // skip the rest (for this trace) if we didn't find a close point\n if(pointData.index === false) return;\n\n // skip points inside axis rangebreaks\n if(cd[pointData.index].p === BADNUM) return;\n\n // if we get here and we're not in 'closest' mode, push min/max pos back\n // onto the group - even though that means occasionally the mouse will be\n // over the hover label.\n if(!isClosestOrPeriod) {\n minPos = function(di) {\n return Math.min(thisBarMinPos(di), di.p - t.bargroupwidth / 2);\n };\n maxPos = function(di) {\n return Math.max(thisBarMaxPos(di), di.p + t.bargroupwidth / 2);\n };\n }\n\n // the closest data point\n var index = pointData.index;\n var di = cd[index];\n\n var size = (trace.base) ? di.b + di.s : di.s;\n pointData[sizeLetter + '0'] = pointData[sizeLetter + '1'] = sa.c2p(di[sizeLetter], true);\n pointData[sizeLetter + 'LabelVal'] = size;\n\n var extent = t.extents[t.extents.round(di.p)];\n pointData[posLetter + '0'] = pa.c2p(isClosest ? minPos(di) : extent[0], true);\n pointData[posLetter + '1'] = pa.c2p(isClosest ? maxPos(di) : extent[1], true);\n\n var hasPeriod = di.orig_p !== undefined;\n pointData[posLetter + 'LabelVal'] = hasPeriod ? di.orig_p : di.p;\n\n pointData.labelLabel = hoverLabelText(pa, pointData[posLetter + 'LabelVal'], trace[posLetter + 'hoverformat']);\n pointData.valueLabel = hoverLabelText(sa, pointData[sizeLetter + 'LabelVal'], trace[sizeLetter + 'hoverformat']);\n pointData.baseLabel = hoverLabelText(sa, di.b, trace[sizeLetter + 'hoverformat']);\n\n // spikelines always want \"closest\" distance regardless of hovermode\n pointData.spikeDistance = (thisBarSizeFn(di) + thisBarPositionFn(di)) / 2;\n // they also want to point to the data value, regardless of where the label goes\n // in case of bars shifted within groups\n pointData[posLetter + 'Spike'] = pa.c2p(di.p, true);\n\n fillText(di, trace, pointData);\n pointData.hovertemplate = trace.hovertemplate;\n\n return pointData;\n}\n\nfunction getTraceColor(trace, di) {\n var mc = di.mcc || trace.marker.color;\n var mlc = di.mlcc || trace.marker.line.color;\n var mlw = getLineWidth(trace, di);\n\n if(Color.opacity(mc)) return mc;\n else if(Color.opacity(mlc) && mlw) return mlc;\n}\n\nmodule.exports = {\n hoverPoints: hoverPoints,\n hoverOnBars: hoverOnBars,\n getTraceColor: getTraceColor\n};\n","'use strict';\n\nvar isNumeric = require('fast-isnumeric');\n\nvar Lib = require('../../lib');\nvar Color = require('../../components/color');\nvar Registry = require('../../registry');\n\nvar handleXYDefaults = require('../scatter/xy_defaults');\nvar handlePeriodDefaults = require('../scatter/period_defaults');\nvar handleStyleDefaults = require('./style_defaults');\nvar handleGroupingDefaults = require('../scatter/grouping_defaults');\nvar attributes = require('./attributes');\n\nvar coerceFont = Lib.coerceFont;\n\nfunction supplyDefaults(traceIn, traceOut, defaultColor, layout) {\n function coerce(attr, dflt) {\n return Lib.coerce(traceIn, traceOut, attributes, attr, dflt);\n }\n\n var len = handleXYDefaults(traceIn, traceOut, layout, coerce);\n if(!len) {\n traceOut.visible = false;\n return;\n }\n\n handlePeriodDefaults(traceIn, traceOut, layout, coerce);\n coerce('xhoverformat');\n coerce('yhoverformat');\n\n coerce('orientation', (traceOut.x && !traceOut.y) ? 'h' : 'v');\n coerce('base');\n coerce('offset');\n coerce('width');\n\n coerce('text');\n coerce('hovertext');\n coerce('hovertemplate');\n\n var textposition = coerce('textposition');\n handleText(traceIn, traceOut, layout, coerce, textposition, {\n moduleHasSelected: true,\n moduleHasUnselected: true,\n moduleHasConstrain: true,\n moduleHasCliponaxis: true,\n moduleHasTextangle: true,\n moduleHasInsideanchor: true\n });\n\n handleStyleDefaults(traceIn, traceOut, coerce, defaultColor, layout);\n var lineColor = (traceOut.marker.line || {}).color;\n\n // override defaultColor for error bars with defaultLine\n var errorBarsSupplyDefaults = Registry.getComponentMethod('errorbars', 'supplyDefaults');\n errorBarsSupplyDefaults(traceIn, traceOut, lineColor || Color.defaultLine, {axis: 'y'});\n errorBarsSupplyDefaults(traceIn, traceOut, lineColor || Color.defaultLine, {axis: 'x', inherit: 'y'});\n\n Lib.coerceSelectionMarkerOpacity(traceOut, coerce);\n}\n\nfunction crossTraceDefaults(fullData, fullLayout) {\n var traceIn, traceOut;\n\n function coerce(attr, dflt) {\n return Lib.coerce(traceOut._input, traceOut, attributes, attr, dflt);\n }\n\n for(var i = 0; i < fullData.length; i++) {\n traceOut = fullData[i];\n\n if(traceOut.type === 'bar') {\n traceIn = traceOut._input;\n // `marker.cornerradius` needs to be coerced here rather than in handleStyleDefaults()\n // because it needs to happen after `layout.barcornerradius` has been coerced\n var r = coerce('marker.cornerradius', fullLayout.barcornerradius);\n if(traceOut.marker) {\n traceOut.marker.cornerradius = validateCornerradius(r);\n }\n\n if(fullLayout.barmode === 'group') {\n handleGroupingDefaults(traceIn, traceOut, fullLayout, coerce);\n }\n }\n }\n}\n\n// Returns a value equivalent to the given cornerradius value, if valid;\n// otherwise returns`undefined`.\n// Valid cornerradius values must be either:\n// - a numeric value (string or number) >= 0, or\n// - a string consisting of a number >= 0 followed by a % sign\n// If the given cornerradius value is a numeric string, it will be converted\n// to a number.\nfunction validateCornerradius(r) {\n if(isNumeric(r)) {\n r = +r;\n if(r >= 0) return r;\n } else if(typeof r === 'string') {\n r = r.trim();\n if(r.slice(-1) === '%' && isNumeric(r.slice(0, -1))) {\n r = +r.slice(0, -1);\n if(r >= 0) return r + '%';\n }\n }\n return undefined;\n}\n\nfunction handleText(traceIn, traceOut, layout, coerce, textposition, opts) {\n opts = opts || {};\n var moduleHasSelected = !(opts.moduleHasSelected === false);\n var moduleHasUnselected = !(opts.moduleHasUnselected === false);\n var moduleHasConstrain = !(opts.moduleHasConstrain === false);\n var moduleHasCliponaxis = !(opts.moduleHasCliponaxis === false);\n var moduleHasTextangle = !(opts.moduleHasTextangle === false);\n var moduleHasInsideanchor = !(opts.moduleHasInsideanchor === false);\n var hasPathbar = !!opts.hasPathbar;\n\n var hasBoth = Array.isArray(textposition) || textposition === 'auto';\n var hasInside = hasBoth || textposition === 'inside';\n var hasOutside = hasBoth || textposition === 'outside';\n\n if(hasInside || hasOutside) {\n var dfltFont = coerceFont(coerce, 'textfont', layout.font);\n\n // Note that coercing `insidetextfont` is always needed –\n // even if `textposition` is `outside` for each trace – since\n // an outside label can become an inside one, for example because\n // of a bar being stacked on top of it.\n var insideTextFontDefault = Lib.extendFlat({}, dfltFont);\n var isTraceTextfontColorSet = traceIn.textfont && traceIn.textfont.color;\n var isColorInheritedFromLayoutFont = !isTraceTextfontColorSet;\n if(isColorInheritedFromLayoutFont) {\n delete insideTextFontDefault.color;\n }\n coerceFont(coerce, 'insidetextfont', insideTextFontDefault);\n\n if(hasPathbar) {\n var pathbarTextFontDefault = Lib.extendFlat({}, dfltFont);\n if(isColorInheritedFromLayoutFont) {\n delete pathbarTextFontDefault.color;\n }\n coerceFont(coerce, 'pathbar.textfont', pathbarTextFontDefault);\n }\n\n if(hasOutside) coerceFont(coerce, 'outsidetextfont', dfltFont);\n\n if(moduleHasSelected) coerce('selected.textfont.color');\n if(moduleHasUnselected) coerce('unselected.textfont.color');\n if(moduleHasConstrain) coerce('constraintext');\n if(moduleHasCliponaxis) coerce('cliponaxis');\n if(moduleHasTextangle) coerce('textangle');\n\n coerce('texttemplate');\n }\n\n if(hasInside) {\n if(moduleHasInsideanchor) coerce('insidetextanchor');\n }\n}\n\nmodule.exports = {\n supplyDefaults: supplyDefaults,\n crossTraceDefaults: crossTraceDefaults,\n handleText: handleText,\n validateCornerradius: validateCornerradius,\n};\n","'use strict';\n\nvar Registry = require('../../registry');\nvar isArrayOrTypedArray = require('../../lib').isArrayOrTypedArray;\n\nmodule.exports = function makeBoundArray(trace, arrayIn, v0In, dvIn, numbricks, ax) {\n var arrayOut = [];\n var isContour = Registry.traceIs(trace, 'contour');\n var isHist = Registry.traceIs(trace, 'histogram');\n var isGL2D = Registry.traceIs(trace, 'gl2d');\n var v0;\n var dv;\n var i;\n\n var isArrayOfTwoItemsOrMore = isArrayOrTypedArray(arrayIn) && arrayIn.length > 1;\n\n if(isArrayOfTwoItemsOrMore && !isHist && (ax.type !== 'category')) {\n var len = arrayIn.length;\n\n // given vals are brick centers\n // hopefully length === numbricks, but use this method even if too few are supplied\n // and extend it linearly based on the last two points\n if(len <= numbricks) {\n // contour plots only want the centers\n if(isContour || isGL2D) arrayOut = Array.from(arrayIn).slice(0, numbricks);\n else if(numbricks === 1) {\n if(ax.type === 'log') {\n arrayOut = [0.5 * arrayIn[0], 2 * arrayIn[0]];\n } else {\n arrayOut = [arrayIn[0] - 0.5, arrayIn[0] + 0.5];\n }\n } else if(ax.type === 'log') {\n arrayOut = [Math.pow(arrayIn[0], 1.5) / Math.pow(arrayIn[1], 0.5)];\n\n for(i = 1; i < len; i++) {\n // Geomean\n arrayOut.push(Math.sqrt(arrayIn[i - 1] * arrayIn[i]));\n }\n\n arrayOut.push(Math.pow(arrayIn[len - 1], 1.5) / Math.pow(arrayIn[len - 2], 0.5));\n } else {\n arrayOut = [1.5 * arrayIn[0] - 0.5 * arrayIn[1]];\n\n for(i = 1; i < len; i++) {\n // Arithmetic mean\n arrayOut.push((arrayIn[i - 1] + arrayIn[i]) * 0.5);\n }\n\n arrayOut.push(1.5 * arrayIn[len - 1] - 0.5 * arrayIn[len - 2]);\n }\n\n if(len < numbricks) {\n var lastPt = arrayOut[arrayOut.length - 1];\n var delta; // either multiplicative delta (log axis type) or arithmetic delta (all other axis types)\n if(ax.type === 'log') {\n delta = lastPt / arrayOut[arrayOut.length - 2];\n\n for(i = len; i < numbricks; i++) {\n lastPt *= delta;\n arrayOut.push(lastPt);\n }\n } else {\n delta = lastPt - arrayOut[arrayOut.length - 2];\n\n for(i = len; i < numbricks; i++) {\n lastPt += delta;\n arrayOut.push(lastPt);\n }\n }\n }\n } else {\n // hopefully length === numbricks+1, but do something regardless:\n // given vals are brick boundaries\n return isContour ?\n arrayIn.slice(0, numbricks) : // we must be strict for contours\n arrayIn.slice(0, numbricks + 1);\n }\n } else {\n var calendar = trace[ax._id.charAt(0) + 'calendar'];\n\n if(isHist) {\n v0 = ax.r2c(v0In, 0, calendar);\n } else {\n if(isArrayOrTypedArray(arrayIn) && arrayIn.length === 1) {\n v0 = arrayIn[0];\n } else if(v0In === undefined) {\n v0 = 0;\n } else {\n var fn = ax.type === 'log' ? ax.d2c : ax.r2c;\n v0 = fn(v0In, 0, calendar);\n }\n }\n\n dv = dvIn || 1;\n\n for(i = (isContour || isGL2D) ? 0 : -0.5; i < numbricks; i++) {\n arrayOut.push(v0 + dv * i);\n }\n }\n\n return arrayOut;\n};\n","'use strict';\n\nvar Registry = require('../../registry');\nvar Lib = require('../../lib');\nvar layoutAttributes = require('./layout_attributes');\n\nfunction _supply(layoutIn, layoutOut, fullData, coerce, traceType) {\n var category = traceType + 'Layout';\n var hasTraceType = false;\n\n for(var i = 0; i < fullData.length; i++) {\n var trace = fullData[i];\n\n if(Registry.traceIs(trace, category)) {\n hasTraceType = true;\n break;\n }\n }\n if(!hasTraceType) return;\n\n coerce(traceType + 'mode');\n coerce(traceType + 'gap');\n coerce(traceType + 'groupgap');\n}\n\nfunction supplyLayoutDefaults(layoutIn, layoutOut, fullData) {\n function coerce(attr, dflt) {\n return Lib.coerce(layoutIn, layoutOut, layoutAttributes, attr, dflt);\n }\n _supply(layoutIn, layoutOut, fullData, coerce, 'box');\n}\n\nmodule.exports = {\n supplyLayoutDefaults: supplyLayoutDefaults,\n _supply: _supply\n};\n","'use strict';\n\nvar hasColorscale = require('../../components/colorscale/helpers').hasColorscale;\nvar calcColorscale = require('../../components/colorscale/calc');\n\nvar subTypes = require('./subtypes');\n\nmodule.exports = function calcMarkerColorscale(gd, trace) {\n if(subTypes.hasLines(trace) && hasColorscale(trace, 'line')) {\n calcColorscale(gd, trace, {\n vals: trace.line.color,\n containerStr: 'line',\n cLetter: 'c'\n });\n }\n\n if(subTypes.hasMarkers(trace)) {\n if(hasColorscale(trace, 'marker')) {\n calcColorscale(gd, trace, {\n vals: trace.marker.color,\n containerStr: 'marker',\n cLetter: 'c'\n });\n }\n if(hasColorscale(trace, 'marker.line')) {\n calcColorscale(gd, trace, {\n vals: trace.marker.line.color,\n containerStr: 'marker.line',\n cLetter: 'c'\n });\n }\n }\n};\n","'use strict';\n\nvar d3 = require('@plotly/d3');\n\nvar Lib = require('../lib');\nvar Drawing = require('../components/drawing');\nvar Color = require('../components/color');\n\nvar xmlnsNamespaces = require('../constants/xmlns_namespaces');\nvar DOUBLEQUOTE_REGEX = /\"/g;\nvar DUMMY_SUB = 'TOBESTRIPPED';\nvar DUMMY_REGEX = new RegExp('(\"' + DUMMY_SUB + ')|(' + DUMMY_SUB + '\")', 'g');\n\nfunction htmlEntityDecode(s) {\n var hiddenDiv = d3.select('body').append('div').style({display: 'none'}).html('');\n var replaced = s.replace(/(&[^;]*;)/gi, function(d) {\n if(d === '<') { return '<'; } // special handling for brackets\n if(d === '&rt;') { return '>'; }\n if(d.indexOf('<') !== -1 || d.indexOf('>') !== -1) { return ''; }\n return hiddenDiv.html(d).text(); // everything else, let the browser decode it to unicode\n });\n hiddenDiv.remove();\n return replaced;\n}\n\nfunction xmlEntityEncode(str) {\n return str.replace(/&(?!\\w+;|\\#[0-9]+;| \\#x[0-9A-F]+;)/g, '&');\n}\n\nmodule.exports = function toSVG(gd, format, scale) {\n var fullLayout = gd._fullLayout;\n var svg = fullLayout._paper;\n var toppaper = fullLayout._toppaper;\n var width = fullLayout.width;\n var height = fullLayout.height;\n var i;\n\n // make background color a rect in the svg, then revert after scraping\n // all other alterations have been dealt with by properly preparing the svg\n // in the first place... like setting cursors with css classes so we don't\n // have to remove them, and providing the right namespaces in the svg to\n // begin with\n svg.insert('rect', ':first-child')\n .call(Drawing.setRect, 0, 0, width, height)\n .call(Color.fill, fullLayout.paper_bgcolor);\n\n // subplot-specific to-SVG methods\n // which notably add the contents of the gl-container\n // into the main svg node\n var basePlotModules = fullLayout._basePlotModules || [];\n for(i = 0; i < basePlotModules.length; i++) {\n var _module = basePlotModules[i];\n\n if(_module.toSVG) _module.toSVG(gd);\n }\n\n // add top items above them assumes everything in toppaper is either\n // a group or a defs, and if it's empty (like hoverlayer) we can ignore it.\n if(toppaper) {\n var nodes = toppaper.node().childNodes;\n\n // make copy of nodes as childNodes prop gets mutated in loop below\n var topGroups = Array.prototype.slice.call(nodes);\n\n for(i = 0; i < topGroups.length; i++) {\n var topGroup = topGroups[i];\n\n if(topGroup.childNodes.length) svg.node().appendChild(topGroup);\n }\n }\n\n // remove draglayer for Adobe Illustrator compatibility\n if(fullLayout._draggers) {\n fullLayout._draggers.remove();\n }\n\n // in case the svg element had an explicit background color, remove this\n // we want the rect to get the color so it's the right size; svg bg will\n // fill whatever container it's displayed in regardless of plot size.\n svg.node().style.background = '';\n\n svg.selectAll('text')\n .attr({'data-unformatted': null, 'data-math': null})\n .each(function() {\n var txt = d3.select(this);\n\n // hidden text is pre-formatting mathjax, the browser ignores it\n // but in a static plot it's useless and it can confuse batik\n // we've tried to standardize on display:none but make sure we still\n // catch visibility:hidden if it ever arises\n if(this.style.visibility === 'hidden' || this.style.display === 'none') {\n txt.remove();\n return;\n } else {\n // clear other visibility/display values to default\n // to not potentially confuse non-browser SVG implementations\n txt.style({visibility: null, display: null});\n }\n\n // Font family styles break things because of quotation marks,\n // so we must remove them *after* the SVG DOM has been serialized\n // to a string (browsers convert singles back)\n var ff = this.style.fontFamily;\n if(ff && ff.indexOf('\"') !== -1) {\n txt.style('font-family', ff.replace(DOUBLEQUOTE_REGEX, DUMMY_SUB));\n }\n });\n\n svg.selectAll('.gradient_filled,.pattern_filled').each(function() {\n var pt = d3.select(this);\n\n // similar to font family styles above,\n // we must remove \" after the SVG DOM has been serialized\n var fill = this.style.fill;\n if(fill && fill.indexOf('url(') !== -1) {\n pt.style('fill', fill.replace(DOUBLEQUOTE_REGEX, DUMMY_SUB));\n }\n\n var stroke = this.style.stroke;\n if(stroke && stroke.indexOf('url(') !== -1) {\n pt.style('stroke', stroke.replace(DOUBLEQUOTE_REGEX, DUMMY_SUB));\n }\n });\n\n if(format === 'pdf' || format === 'eps') {\n // these formats make the extra line MathJax adds around symbols look super thick in some cases\n // it looks better if this is removed entirely.\n svg.selectAll('#MathJax_SVG_glyphs path')\n .attr('stroke-width', 0);\n }\n\n // fix for IE namespacing quirk?\n // http://stackoverflow.com/questions/19610089/unwanted-namespaces-on-svg-markup-when-using-xmlserializer-in-javascript-with-ie\n svg.node().setAttributeNS(xmlnsNamespaces.xmlns, 'xmlns', xmlnsNamespaces.svg);\n svg.node().setAttributeNS(xmlnsNamespaces.xmlns, 'xmlns:xlink', xmlnsNamespaces.xlink);\n\n if(format === 'svg' && scale) {\n svg.attr('width', scale * width);\n svg.attr('height', scale * height);\n svg.attr('viewBox', '0 0 ' + width + ' ' + height);\n }\n\n var s = new window.XMLSerializer().serializeToString(svg.node());\n s = htmlEntityDecode(s);\n s = xmlEntityEncode(s);\n\n // Fix quotations around font strings and gradient URLs\n s = s.replace(DUMMY_REGEX, '\\'');\n\n // Do we need this process now that IE9 and IE10 are not supported?\n\n // IE is very strict, so we will need to clean\n // svg with the following regex\n // yes this is messy, but do not know a better way\n // Even with this IE will not work due to tainted canvas\n // see https://github.com/kangax/fabric.js/issues/1957\n // http://stackoverflow.com/questions/18112047/canvas-todataurl-working-in-all-browsers-except-ie10\n // Leave here just in case the CORS/tainted IE issue gets resolved\n if(Lib.isIE()) {\n // replace double quote with single quote\n s = s.replace(/\"/gi, '\\'');\n // url in svg are single quoted\n // since we changed double to single\n // we'll need to change these to double-quoted\n s = s.replace(/(\\('#)([^']*)('\\))/gi, '(\\\"#$2\\\")');\n // font names with spaces will be escaped single-quoted\n // we'll need to change these to double-quoted\n s = s.replace(/(\\\\')/gi, '\\\"');\n }\n\n return s;\n};\n","'use strict';\n\nvar scatterAttrs = require('../scatter/attributes');\nvar baseAttrs = require('../../plots/attributes');\nvar fontAttrs = require('../../plots/font_attributes');\nvar axisHoverFormat = require('../../plots/cartesian/axis_format_attributes').axisHoverFormat;\nvar hovertemplateAttrs = require('../../plots/template_attributes').hovertemplateAttrs;\nvar texttemplateAttrs = require('../../plots/template_attributes').texttemplateAttrs;\nvar colorScaleAttrs = require('../../components/colorscale/attributes');\n\nvar extendFlat = require('../../lib/extend').extendFlat;\n\nmodule.exports = extendFlat({\n z: {\n valType: 'data_array',\n editType: 'calc',\n description: 'Sets the z data.'\n },\n x: extendFlat({}, scatterAttrs.x, {impliedEdits: {xtype: 'array'}}),\n x0: extendFlat({}, scatterAttrs.x0, {impliedEdits: {xtype: 'scaled'}}),\n dx: extendFlat({}, scatterAttrs.dx, {impliedEdits: {xtype: 'scaled'}}),\n y: extendFlat({}, scatterAttrs.y, {impliedEdits: {ytype: 'array'}}),\n y0: extendFlat({}, scatterAttrs.y0, {impliedEdits: {ytype: 'scaled'}}),\n dy: extendFlat({}, scatterAttrs.dy, {impliedEdits: {ytype: 'scaled'}}),\n\n xperiod: extendFlat({}, scatterAttrs.xperiod, {impliedEdits: {xtype: 'scaled'}}),\n yperiod: extendFlat({}, scatterAttrs.yperiod, {impliedEdits: {ytype: 'scaled'}}),\n xperiod0: extendFlat({}, scatterAttrs.xperiod0, {impliedEdits: {xtype: 'scaled'}}),\n yperiod0: extendFlat({}, scatterAttrs.yperiod0, {impliedEdits: {ytype: 'scaled'}}),\n xperiodalignment: extendFlat({}, scatterAttrs.xperiodalignment, {impliedEdits: {xtype: 'scaled'}}),\n yperiodalignment: extendFlat({}, scatterAttrs.yperiodalignment, {impliedEdits: {ytype: 'scaled'}}),\n\n text: {\n valType: 'data_array',\n editType: 'calc',\n description: 'Sets the text elements associated with each z value.'\n },\n hovertext: {\n valType: 'data_array',\n editType: 'calc',\n description: 'Same as `text`.'\n },\n transpose: {\n valType: 'boolean',\n dflt: false,\n editType: 'calc',\n description: 'Transposes the z data.'\n },\n xtype: {\n valType: 'enumerated',\n values: ['array', 'scaled'],\n editType: 'calc+clearAxisTypes',\n description: [\n 'If *array*, the heatmap\\'s x coordinates are given by *x*',\n '(the default behavior when `x` is provided).',\n 'If *scaled*, the heatmap\\'s x coordinates are given by *x0* and *dx*',\n '(the default behavior when `x` is not provided).'\n ].join(' ')\n },\n ytype: {\n valType: 'enumerated',\n values: ['array', 'scaled'],\n editType: 'calc+clearAxisTypes',\n description: [\n 'If *array*, the heatmap\\'s y coordinates are given by *y*',\n '(the default behavior when `y` is provided)',\n 'If *scaled*, the heatmap\\'s y coordinates are given by *y0* and *dy*',\n '(the default behavior when `y` is not provided)'\n ].join(' ')\n },\n zsmooth: {\n valType: 'enumerated',\n values: ['fast', 'best', false],\n dflt: false,\n editType: 'calc',\n description: [\n 'Picks a smoothing algorithm use to smooth `z` data.'\n ].join(' ')\n },\n hoverongaps: {\n valType: 'boolean',\n dflt: true,\n editType: 'none',\n description: [\n 'Determines whether or not gaps',\n '(i.e. {nan} or missing values)',\n 'in the `z` data have hover labels associated with them.'\n ].join(' ')\n },\n connectgaps: {\n valType: 'boolean',\n editType: 'calc',\n description: [\n 'Determines whether or not gaps',\n '(i.e. {nan} or missing values)',\n 'in the `z` data are filled in.',\n 'It is defaulted to true if `z` is a',\n 'one dimensional array and `zsmooth` is not false;',\n 'otherwise it is defaulted to false.'\n ].join(' ')\n },\n xgap: {\n valType: 'number',\n dflt: 0,\n min: 0,\n editType: 'plot',\n description: 'Sets the horizontal gap (in pixels) between bricks.'\n },\n ygap: {\n valType: 'number',\n dflt: 0,\n min: 0,\n editType: 'plot',\n description: 'Sets the vertical gap (in pixels) between bricks.'\n },\n xhoverformat: axisHoverFormat('x'),\n yhoverformat: axisHoverFormat('y'),\n zhoverformat: axisHoverFormat('z', 1),\n\n hovertemplate: hovertemplateAttrs(),\n texttemplate: texttemplateAttrs({\n arrayOk: false,\n editType: 'plot'\n }, {\n keys: ['x', 'y', 'z', 'text']\n }),\n textfont: fontAttrs({\n editType: 'plot',\n autoSize: true,\n autoColor: true,\n colorEditType: 'style',\n description: 'Sets the text font.'\n }),\n\n showlegend: extendFlat({}, baseAttrs.showlegend, {dflt: false})\n}, {\n transforms: undefined\n},\n colorScaleAttrs('', {cLetter: 'z', autoColorDflt: false})\n);\n","'use strict';\n\nvar Lib = require('../../lib');\nvar Axes = require('../../plots/cartesian/axes');\n\nvar binFunctions = require('../histogram/bin_functions');\nvar normFunctions = require('../histogram/norm_functions');\nvar doAvg = require('../histogram/average');\nvar getBinSpanLabelRound = require('../histogram/bin_label_vals');\nvar calcAllAutoBins = require('../histogram/calc').calcAllAutoBins;\n\nmodule.exports = function calc(gd, trace) {\n var xa = Axes.getFromId(gd, trace.xaxis);\n var ya = Axes.getFromId(gd, trace.yaxis);\n\n var xcalendar = trace.xcalendar;\n var ycalendar = trace.ycalendar;\n var xr2c = function(v) { return xa.r2c(v, 0, xcalendar); };\n var yr2c = function(v) { return ya.r2c(v, 0, ycalendar); };\n var xc2r = function(v) { return xa.c2r(v, 0, xcalendar); };\n var yc2r = function(v) { return ya.c2r(v, 0, ycalendar); };\n\n var i, j, n, m;\n\n // calculate the bins\n var xBinsAndPos = calcAllAutoBins(gd, trace, xa, 'x');\n var xBinSpec = xBinsAndPos[0];\n var xPos0 = xBinsAndPos[1];\n var yBinsAndPos = calcAllAutoBins(gd, trace, ya, 'y');\n var yBinSpec = yBinsAndPos[0];\n var yPos0 = yBinsAndPos[1];\n\n var serieslen = trace._length;\n if(xPos0.length > serieslen) xPos0.splice(serieslen, xPos0.length - serieslen);\n if(yPos0.length > serieslen) yPos0.splice(serieslen, yPos0.length - serieslen);\n\n // make the empty bin array & scale the map\n var z = [];\n var onecol = [];\n var zerocol = [];\n var nonuniformBinsX = typeof xBinSpec.size === 'string';\n var nonuniformBinsY = typeof yBinSpec.size === 'string';\n var xEdges = [];\n var yEdges = [];\n var xbins = nonuniformBinsX ? xEdges : xBinSpec;\n var ybins = nonuniformBinsY ? yEdges : yBinSpec;\n var total = 0;\n var counts = [];\n var inputPoints = [];\n var norm = trace.histnorm;\n var func = trace.histfunc;\n var densitynorm = norm.indexOf('density') !== -1;\n var extremefunc = func === 'max' || func === 'min';\n var sizeinit = extremefunc ? null : 0;\n var binfunc = binFunctions.count;\n var normfunc = normFunctions[norm];\n var doavg = false;\n var xinc = [];\n var yinc = [];\n\n // set a binning function other than count?\n // for binning functions: check first for 'z',\n // then 'mc' in case we had a colored scatter plot\n // and want to transfer these colors to the 2D histo\n // TODO: axe this, make it the responsibility of the app changing type? or an impliedEdit?\n var rawCounterData = ('z' in trace) ?\n trace.z :\n (('marker' in trace && Array.isArray(trace.marker.color)) ?\n trace.marker.color : '');\n if(rawCounterData && func !== 'count') {\n doavg = func === 'avg';\n binfunc = binFunctions[func];\n }\n\n // decrease end a little in case of rounding errors\n var xBinSize = xBinSpec.size;\n var xBinStart = xr2c(xBinSpec.start);\n var xBinEnd = xr2c(xBinSpec.end) +\n (xBinStart - Axes.tickIncrement(xBinStart, xBinSize, false, xcalendar)) / 1e6;\n\n for(i = xBinStart; i < xBinEnd; i = Axes.tickIncrement(i, xBinSize, false, xcalendar)) {\n onecol.push(sizeinit);\n xEdges.push(i);\n if(doavg) zerocol.push(0);\n }\n xEdges.push(i);\n\n var nx = onecol.length;\n var dx = (i - xBinStart) / nx;\n var x0 = xc2r(xBinStart + dx / 2);\n\n var yBinSize = yBinSpec.size;\n var yBinStart = yr2c(yBinSpec.start);\n var yBinEnd = yr2c(yBinSpec.end) +\n (yBinStart - Axes.tickIncrement(yBinStart, yBinSize, false, ycalendar)) / 1e6;\n\n for(i = yBinStart; i < yBinEnd; i = Axes.tickIncrement(i, yBinSize, false, ycalendar)) {\n z.push(onecol.slice());\n yEdges.push(i);\n var ipCol = new Array(nx);\n for(j = 0; j < nx; j++) ipCol[j] = [];\n inputPoints.push(ipCol);\n if(doavg) counts.push(zerocol.slice());\n }\n yEdges.push(i);\n\n var ny = z.length;\n var dy = (i - yBinStart) / ny;\n var y0 = yc2r(yBinStart + dy / 2);\n\n if(densitynorm) {\n xinc = makeIncrements(onecol.length, xbins, dx, nonuniformBinsX);\n yinc = makeIncrements(z.length, ybins, dy, nonuniformBinsY);\n }\n\n // for date axes we need bin bounds to be calcdata. For nonuniform bins\n // we already have this, but uniform with start/end/size they're still strings.\n if(!nonuniformBinsX && xa.type === 'date') xbins = binsToCalc(xr2c, xbins);\n if(!nonuniformBinsY && ya.type === 'date') ybins = binsToCalc(yr2c, ybins);\n\n // put data into bins\n var uniqueValsPerX = true;\n var uniqueValsPerY = true;\n var xVals = new Array(nx);\n var yVals = new Array(ny);\n var xGapLow = Infinity;\n var xGapHigh = Infinity;\n var yGapLow = Infinity;\n var yGapHigh = Infinity;\n for(i = 0; i < serieslen; i++) {\n var xi = xPos0[i];\n var yi = yPos0[i];\n n = Lib.findBin(xi, xbins);\n m = Lib.findBin(yi, ybins);\n if(n >= 0 && n < nx && m >= 0 && m < ny) {\n total += binfunc(n, i, z[m], rawCounterData, counts[m]);\n inputPoints[m][n].push(i);\n\n if(uniqueValsPerX) {\n if(xVals[n] === undefined) xVals[n] = xi;\n else if(xVals[n] !== xi) uniqueValsPerX = false;\n }\n if(uniqueValsPerY) {\n if(yVals[m] === undefined) yVals[m] = yi;\n else if(yVals[m] !== yi) uniqueValsPerY = false;\n }\n\n xGapLow = Math.min(xGapLow, xi - xEdges[n]);\n xGapHigh = Math.min(xGapHigh, xEdges[n + 1] - xi);\n yGapLow = Math.min(yGapLow, yi - yEdges[m]);\n yGapHigh = Math.min(yGapHigh, yEdges[m + 1] - yi);\n }\n }\n // normalize, if needed\n if(doavg) {\n for(m = 0; m < ny; m++) total += doAvg(z[m], counts[m]);\n }\n if(normfunc) {\n for(m = 0; m < ny; m++) normfunc(z[m], total, xinc, yinc[m]);\n }\n\n return {\n x: xPos0,\n xRanges: getRanges(xEdges, uniqueValsPerX && xVals, xGapLow, xGapHigh, xa, xcalendar),\n x0: x0,\n dx: dx,\n y: yPos0,\n yRanges: getRanges(yEdges, uniqueValsPerY && yVals, yGapLow, yGapHigh, ya, ycalendar),\n y0: y0,\n dy: dy,\n z: z,\n pts: inputPoints\n };\n};\n\nfunction makeIncrements(len, bins, dv, nonuniform) {\n var out = new Array(len);\n var i;\n if(nonuniform) {\n for(i = 0; i < len; i++) out[i] = 1 / (bins[i + 1] - bins[i]);\n } else {\n var inc = 1 / dv;\n for(i = 0; i < len; i++) out[i] = inc;\n }\n return out;\n}\n\nfunction binsToCalc(r2c, bins) {\n return {\n start: r2c(bins.start),\n end: r2c(bins.end),\n size: bins.size\n };\n}\n\nfunction getRanges(edges, uniqueVals, gapLow, gapHigh, ax, calendar) {\n var i;\n var len = edges.length - 1;\n var out = new Array(len);\n var roundFn = getBinSpanLabelRound(gapLow, gapHigh, edges, ax, calendar);\n\n for(i = 0; i < len; i++) {\n var v = (uniqueVals || [])[i];\n out[i] = v === undefined ?\n [roundFn(edges[i]), roundFn(edges[i + 1], true)] :\n [v, v];\n }\n return out;\n}\n","'use strict';\n\nvar Axes = require('../../plots/cartesian/axes');\nvar Lib = require('../../lib');\nvar Fx = require('../../components/fx');\nvar Color = require('../../components/color');\nvar fillText = Lib.fillText;\n\nfunction hoverPoints(pointData, xval, yval, hovermode) {\n var cd = pointData.cd;\n var trace = cd[0].trace;\n var hoveron = trace.hoveron;\n var closeBoxData = [];\n var closePtData;\n\n if(hoveron.indexOf('boxes') !== -1) {\n closeBoxData = closeBoxData.concat(hoverOnBoxes(pointData, xval, yval, hovermode));\n }\n\n if(hoveron.indexOf('points') !== -1) {\n closePtData = hoverOnPoints(pointData, xval, yval);\n }\n\n // If there's a point in range and hoveron has points, show the best single point only.\n // If hoveron has boxes and there's no point in range (or hoveron doesn't have points), show the box stats.\n if(hovermode === 'closest') {\n if(closePtData) return [closePtData];\n return closeBoxData;\n }\n\n // Otherwise in compare mode, allow a point AND the box stats to be labeled\n // If there are multiple boxes in range (ie boxmode = 'overlay') we'll see stats for all of them.\n if(closePtData) {\n closeBoxData.push(closePtData);\n return closeBoxData;\n }\n return closeBoxData;\n}\n\nfunction hoverOnBoxes(pointData, xval, yval, hovermode) {\n var cd = pointData.cd;\n var xa = pointData.xa;\n var ya = pointData.ya;\n var trace = cd[0].trace;\n var t = cd[0].t;\n var isViolin = trace.type === 'violin';\n\n var pLetter, vLetter, pAxis, vAxis, vVal, pVal, dx, dy, dPos,\n hoverPseudoDistance, spikePseudoDistance;\n\n var boxDelta = t.bdPos;\n var boxDeltaPos, boxDeltaNeg;\n var posAcceptance = t.wHover;\n var shiftPos = function(di) { return pAxis.c2l(di.pos) + t.bPos - pAxis.c2l(pVal); };\n\n if(isViolin && trace.side !== 'both') {\n if(trace.side === 'positive') {\n dPos = function(di) {\n var pos = shiftPos(di);\n return Fx.inbox(pos, pos + posAcceptance, hoverPseudoDistance);\n };\n boxDeltaPos = boxDelta;\n boxDeltaNeg = 0;\n }\n if(trace.side === 'negative') {\n dPos = function(di) {\n var pos = shiftPos(di);\n return Fx.inbox(pos - posAcceptance, pos, hoverPseudoDistance);\n };\n boxDeltaPos = 0;\n boxDeltaNeg = boxDelta;\n }\n } else {\n dPos = function(di) {\n var pos = shiftPos(di);\n return Fx.inbox(pos - posAcceptance, pos + posAcceptance, hoverPseudoDistance);\n };\n boxDeltaPos = boxDeltaNeg = boxDelta;\n }\n\n var dVal;\n\n if(isViolin) {\n dVal = function(di) {\n return Fx.inbox(di.span[0] - vVal, di.span[1] - vVal, hoverPseudoDistance);\n };\n } else {\n dVal = function(di) {\n return Fx.inbox(di.min - vVal, di.max - vVal, hoverPseudoDistance);\n };\n }\n\n if(trace.orientation === 'h') {\n vVal = xval;\n pVal = yval;\n dx = dVal;\n dy = dPos;\n pLetter = 'y';\n pAxis = ya;\n vLetter = 'x';\n vAxis = xa;\n } else {\n vVal = yval;\n pVal = xval;\n dx = dPos;\n dy = dVal;\n pLetter = 'x';\n pAxis = xa;\n vLetter = 'y';\n vAxis = ya;\n }\n\n // if two boxes are overlaying, let the narrowest one win\n var pseudoDistance = Math.min(1, boxDelta / Math.abs(pAxis.r2c(pAxis.range[1]) - pAxis.r2c(pAxis.range[0])));\n hoverPseudoDistance = pointData.maxHoverDistance - pseudoDistance;\n spikePseudoDistance = pointData.maxSpikeDistance - pseudoDistance;\n\n function dxy(di) { return (dx(di) + dy(di)) / 2; }\n var distfn = Fx.getDistanceFunction(hovermode, dx, dy, dxy);\n Fx.getClosest(cd, distfn, pointData);\n\n // skip the rest (for this trace) if we didn't find a close point\n // and create the item(s) in closedata for this point\n if(pointData.index === false) return [];\n\n var di = cd[pointData.index];\n var lc = trace.line.color;\n var mc = (trace.marker || {}).color;\n\n if(Color.opacity(lc) && trace.line.width) pointData.color = lc;\n else if(Color.opacity(mc) && trace.boxpoints) pointData.color = mc;\n else pointData.color = trace.fillcolor;\n\n pointData[pLetter + '0'] = pAxis.c2p(di.pos + t.bPos - boxDeltaNeg, true);\n pointData[pLetter + '1'] = pAxis.c2p(di.pos + t.bPos + boxDeltaPos, true);\n\n pointData[pLetter + 'LabelVal'] = di.orig_p !== undefined ? di.orig_p : di.pos;\n\n var spikePosAttr = pLetter + 'Spike';\n pointData.spikeDistance = dxy(di) * spikePseudoDistance / hoverPseudoDistance;\n pointData[spikePosAttr] = pAxis.c2p(di.pos, true);\n\n var hasMean = trace.boxmean || (trace.sizemode === 'sd') || (trace.meanline || {}).visible;\n var hasFences = trace.boxpoints || trace.points;\n\n // labels with equal values (e.g. when min === q1) should still be presented in the order they have when they're unequal\n var attrs =\n (hasFences && hasMean) ? ['max', 'uf', 'q3', 'med', 'mean', 'q1', 'lf', 'min'] :\n (hasFences && !hasMean) ? ['max', 'uf', 'q3', 'med', 'q1', 'lf', 'min'] :\n (!hasFences && hasMean) ? ['max', 'q3', 'med', 'mean', 'q1', 'min'] :\n ['max', 'q3', 'med', 'q1', 'min'];\n\n var rev = vAxis.range[1] < vAxis.range[0];\n\n if(trace.orientation === (rev ? 'v' : 'h')) {\n attrs.reverse();\n }\n\n var spikeDistance = pointData.spikeDistance;\n var spikePosition = pointData[spikePosAttr];\n\n var closeBoxData = [];\n for(var i = 0; i < attrs.length; i++) {\n var attr = attrs[i];\n\n if(!(attr in di)) continue;\n\n // copy out to a new object for each value to label\n var val = di[attr];\n var valPx = vAxis.c2p(val, true);\n var pointData2 = Lib.extendFlat({}, pointData);\n\n pointData2.attr = attr;\n pointData2[vLetter + '0'] = pointData2[vLetter + '1'] = valPx;\n pointData2[vLetter + 'LabelVal'] = val;\n pointData2[vLetter + 'Label'] = (t.labels ? t.labels[attr] + ' ' : '') + Axes.hoverLabelText(vAxis, val, trace[vLetter + 'hoverformat']);\n\n // Note: introduced to be able to distinguish a\n // clicked point from a box during click-to-select\n pointData2.hoverOnBox = true;\n\n if(attr === 'mean' && ('sd' in di) && ((trace.boxmean === 'sd') || (trace.sizemode === 'sd'))) {\n pointData2[vLetter + 'err'] = di.sd;\n }\n\n // no hovertemplate support yet\n pointData2.hovertemplate = false;\n\n closeBoxData.push(pointData2);\n }\n\n // only keep name and spikes on the median\n pointData.name = '';\n pointData.spikeDistance = undefined;\n pointData[spikePosAttr] = undefined;\n for(var k = 0; k < closeBoxData.length; k++) {\n if(closeBoxData[k].attr !== 'med') {\n closeBoxData[k].name = '';\n closeBoxData[k].spikeDistance = undefined;\n closeBoxData[k][spikePosAttr] = undefined;\n } else {\n closeBoxData[k].spikeDistance = spikeDistance;\n closeBoxData[k][spikePosAttr] = spikePosition;\n }\n }\n\n return closeBoxData;\n}\n\nfunction hoverOnPoints(pointData, xval, yval) {\n var cd = pointData.cd;\n var xa = pointData.xa;\n var ya = pointData.ya;\n var trace = cd[0].trace;\n var xPx = xa.c2p(xval);\n var yPx = ya.c2p(yval);\n var closePtData;\n\n var dx = function(di) {\n var rad = Math.max(3, di.mrc || 0);\n return Math.max(Math.abs(xa.c2p(di.x) - xPx) - rad, 1 - 3 / rad);\n };\n var dy = function(di) {\n var rad = Math.max(3, di.mrc || 0);\n return Math.max(Math.abs(ya.c2p(di.y) - yPx) - rad, 1 - 3 / rad);\n };\n var distfn = Fx.quadrature(dx, dy);\n\n // show one point per trace\n var ijClosest = false;\n var di, pt;\n\n for(var i = 0; i < cd.length; i++) {\n di = cd[i];\n\n for(var j = 0; j < (di.pts || []).length; j++) {\n pt = di.pts[j];\n\n var newDistance = distfn(pt);\n if(newDistance <= pointData.distance) {\n pointData.distance = newDistance;\n ijClosest = [i, j];\n }\n }\n }\n\n if(!ijClosest) return false;\n\n di = cd[ijClosest[0]];\n pt = di.pts[ijClosest[1]];\n\n var xc = xa.c2p(pt.x, true);\n var yc = ya.c2p(pt.y, true);\n var rad = pt.mrc || 1;\n\n closePtData = Lib.extendFlat({}, pointData, {\n // corresponds to index in x/y input data array\n index: pt.i,\n color: (trace.marker || {}).color,\n name: trace.name,\n x0: xc - rad,\n x1: xc + rad,\n y0: yc - rad,\n y1: yc + rad,\n spikeDistance: pointData.distance,\n hovertemplate: trace.hovertemplate\n });\n\n var origPos = di.orig_p;\n var pos = origPos !== undefined ? origPos : di.pos;\n var pa;\n if(trace.orientation === 'h') {\n pa = ya;\n closePtData.xLabelVal = pt.x;\n closePtData.yLabelVal = pos;\n } else {\n pa = xa;\n closePtData.xLabelVal = pos;\n closePtData.yLabelVal = pt.y;\n }\n\n var pLetter = pa._id.charAt(0);\n closePtData[pLetter + 'Spike'] = pa.c2p(di.pos, true);\n\n fillText(pt, trace, closePtData);\n\n return closePtData;\n}\n\nmodule.exports = {\n hoverPoints: hoverPoints,\n hoverOnBoxes: hoverOnBoxes,\n hoverOnPoints: hoverOnPoints\n};\n","'use strict';\n\nmodule.exports = {\n attributes: require('./attributes'),\n supplyDefaults: require('./defaults'),\n calc: require('./calc'),\n plot: require('./plot'),\n colorbar: require('./colorbar'),\n style: require('./style'),\n hoverPoints: require('./hover'),\n\n moduleType: 'trace',\n name: 'heatmap',\n basePlotModule: require('../../plots/cartesian'),\n categories: ['cartesian', 'svg', '2dMap', 'showLegend'],\n meta: {\n description: [\n 'The data that describes the heatmap value-to-color mapping',\n 'is set in `z`.',\n 'Data in `z` can either be a {2D array} of values (ragged or not)',\n 'or a 1D array of values.',\n\n 'In the case where `z` is a {2D array},',\n 'say that `z` has N rows and M columns.',\n 'Then, by default, the resulting heatmap will have N partitions along',\n 'the y axis and M partitions along the x axis.',\n 'In other words, the i-th row/ j-th column cell in `z`',\n 'is mapped to the i-th partition of the y axis',\n '(starting from the bottom of the plot) and the j-th partition',\n 'of the x-axis (starting from the left of the plot).',\n 'This behavior can be flipped by using `transpose`.',\n 'Moreover, `x` (`y`) can be provided with M or M+1 (N or N+1) elements.',\n 'If M (N), then the coordinates correspond to the center of the',\n 'heatmap cells and the cells have equal width.',\n 'If M+1 (N+1), then the coordinates correspond to the edges of the',\n 'heatmap cells.',\n\n 'In the case where `z` is a 1D {array}, the x and y coordinates must be',\n 'provided in `x` and `y` respectively to form data triplets.'\n ].join(' ')\n }\n};\n","'use strict';\n\n\nmodule.exports = {\n scattermode: {\n valType: 'enumerated',\n values: ['group', 'overlay'],\n dflt: 'overlay',\n editType: 'calc',\n description: [\n 'Determines how scatter points at the same location coordinate',\n 'are displayed on the graph.',\n 'With *group*, the scatter points are plotted next to one another',\n 'centered around the shared location.',\n 'With *overlay*, the scatter points are plotted over one another,',\n 'you might need to reduce *opacity* to see multiple scatter points.'\n ].join(' ')\n },\n scattergap: {\n valType: 'number',\n min: 0,\n max: 1,\n editType: 'calc',\n description: [\n 'Sets the gap (in plot fraction) between scatter points of',\n 'adjacent location coordinates.',\n 'Defaults to `bargap`.'\n ].join(' ')\n }\n};\n","'use strict';\n\nvar Color = require('../../components/color');\nvar hasColorscale = require('../../components/colorscale/helpers').hasColorscale;\nvar colorscaleDefaults = require('../../components/colorscale/defaults');\n\nvar subTypes = require('./subtypes');\n\n/*\n * opts: object of flags to control features not all marker users support\n * noLine: caller does not support marker lines\n * gradient: caller supports gradients\n * noSelect: caller does not support selected/unselected attribute containers\n */\nmodule.exports = function markerDefaults(traceIn, traceOut, defaultColor, layout, coerce, opts) {\n var isBubble = subTypes.isBubble(traceIn);\n var lineColor = (traceIn.line || {}).color;\n var defaultMLC;\n\n opts = opts || {};\n\n // marker.color inherit from line.color (even if line.color is an array)\n if(lineColor) defaultColor = lineColor;\n\n coerce('marker.symbol');\n coerce('marker.opacity', isBubble ? 0.7 : 1);\n coerce('marker.size');\n if(!opts.noAngle) {\n coerce('marker.angle');\n if(!opts.noAngleRef) {\n coerce('marker.angleref');\n }\n\n if(!opts.noStandOff) {\n coerce('marker.standoff');\n }\n }\n\n coerce('marker.color', defaultColor);\n if(hasColorscale(traceIn, 'marker')) {\n colorscaleDefaults(traceIn, traceOut, layout, coerce, {prefix: 'marker.', cLetter: 'c'});\n }\n\n if(!opts.noSelect) {\n coerce('selected.marker.color');\n coerce('unselected.marker.color');\n coerce('selected.marker.size');\n coerce('unselected.marker.size');\n }\n\n if(!opts.noLine) {\n // if there's a line with a different color than the marker, use\n // that line color as the default marker line color\n // (except when it's an array)\n // mostly this is for transparent markers to behave nicely\n if(lineColor && !Array.isArray(lineColor) && (traceOut.marker.color !== lineColor)) {\n defaultMLC = lineColor;\n } else if(isBubble) defaultMLC = Color.background;\n else defaultMLC = Color.defaultLine;\n\n coerce('marker.line.color', defaultMLC);\n if(hasColorscale(traceIn, 'marker.line')) {\n colorscaleDefaults(traceIn, traceOut, layout, coerce, {prefix: 'marker.line.', cLetter: 'c'});\n }\n\n coerce('marker.line.width', isBubble ? 1 : 0);\n }\n\n if(isBubble) {\n coerce('marker.sizeref');\n coerce('marker.sizemin');\n coerce('marker.sizemode');\n }\n\n if(opts.gradient) {\n var gradientType = coerce('marker.gradient.type');\n if(gradientType !== 'none') {\n coerce('marker.gradient.color');\n }\n }\n};\n","'use strict';\n\nvar Lib = require('../../lib');\n\nfunction format(vRounded) {\n return (\n vRounded.indexOf('e') !== -1 ? vRounded.replace(/[.]?0+e/, 'e') :\n vRounded.indexOf('.') !== -1 ? vRounded.replace(/[.]?0+$/, '') :\n vRounded\n );\n}\n\nexports.formatPiePercent = function formatPiePercent(v, separators) {\n var vRounded = format((v * 100).toPrecision(3));\n return Lib.numSeparate(vRounded, separators) + '%';\n};\n\nexports.formatPieValue = function formatPieValue(v, separators) {\n var vRounded = format(v.toPrecision(10));\n return Lib.numSeparate(vRounded, separators);\n};\n\nexports.getFirstFilled = function getFirstFilled(array, indices) {\n if(!Lib.isArrayOrTypedArray(array)) return;\n for(var i = 0; i < indices.length; i++) {\n var v = array[indices[i]];\n if(v || v === 0 || v === '') return v;\n }\n};\n\nexports.castOption = function castOption(item, indices) {\n if(Lib.isArrayOrTypedArray(item)) return exports.getFirstFilled(item, indices);\n else if(item) return item;\n};\n\nexports.getRotationAngle = function(rotation) {\n return (rotation === 'auto' ? 0 : rotation) * Math.PI / 180;\n};\n","'use strict';\n\n\nmodule.exports = function doAvg(size, counts) {\n var nMax = size.length;\n var total = 0;\n for(var i = 0; i < nMax; i++) {\n if(counts[i]) {\n size[i] /= counts[i];\n total += size[i];\n } else size[i] = null;\n }\n return total;\n};\n","'use strict';\n\nmodule.exports = {\n attributes: require('./attributes'),\n layoutAttributes: require('./layout_attributes'),\n supplyDefaults: require('./defaults').supplyDefaults,\n crossTraceDefaults: require('./defaults').crossTraceDefaults,\n supplyLayoutDefaults: require('./layout_defaults').supplyLayoutDefaults,\n calc: require('./calc'),\n crossTraceCalc: require('./cross_trace_calc').crossTraceCalc,\n plot: require('./plot').plot,\n style: require('./style').style,\n styleOnSelect: require('./style').styleOnSelect,\n hoverPoints: require('./hover').hoverPoints,\n eventData: require('./event_data'),\n selectPoints: require('./select'),\n\n moduleType: 'trace',\n name: 'box',\n basePlotModule: require('../../plots/cartesian'),\n categories: ['cartesian', 'svg', 'symbols', 'oriented', 'box-violin', 'showLegend', 'boxLayout', 'zoomScale'],\n meta: {\n description: [\n 'Each box spans from quartile 1 (Q1) to quartile 3 (Q3).',\n 'The second quartile (Q2, i.e. the median) is marked by a line inside the box.',\n 'The fences grow outward from the boxes\\' edges,',\n 'by default they span +/- 1.5 times the interquartile range (IQR: Q3-Q1),',\n 'The sample mean and standard deviation as well as notches and',\n 'the sample, outlier and suspected outliers points can be optionally',\n 'added to the box plot.',\n\n 'The values and positions corresponding to each boxes can be input',\n 'using two signatures.',\n\n 'The first signature expects users to supply the sample values in the `y`',\n 'data array for vertical boxes (`x` for horizontal boxes).',\n 'By supplying an `x` (`y`) array, one box per distinct `x` (`y`) value is drawn',\n 'If no `x` (`y`) {array} is provided, a single box is drawn.',\n 'In this case, the box is positioned with the trace `name` or with `x0` (`y0`) if provided.',\n\n 'The second signature expects users to supply the boxes corresponding Q1, median and Q3',\n 'statistics in the `q1`, `median` and `q3` data arrays respectively.',\n 'Other box features relying on statistics namely `lowerfence`, `upperfence`, `notchspan`',\n 'can be set directly by the users.',\n 'To have plotly compute them or to show sample points besides the boxes,',\n 'users can set the `y` data array for vertical boxes (`x` for horizontal boxes)',\n 'to a 2D array with the outer length corresponding',\n 'to the number of boxes in the traces and the inner length corresponding the sample size.'\n ].join(' ')\n }\n};\n"],"names":["module","exports","attributes","require","supplyDefaults","supplyLayoutDefaults","layoutAttributes","calc","crossTraceCalc","plot","style","styleOne","moduleType","name","basePlotModule","categories","meta","description","join","isArrayOrTypedArray","hasColorscale","colorscaleDefaults","traceIn","traceOut","defaultColor","layout","coerce","opts","markerColor","marker","color","_inputArray","prefix","cLetter","noDash","backoff","Lib","Registry","constants","subTypes","handleXYDefaults","handlePeriodDefaults","handleStackDefaults","handleMarkerDefaults","handleLineDefaults","handleLineShapeDefaults","handleTextDefaults","handleFillColorDefaults","coercePattern","attr","dflt","len","visible","stackGroupOpts","scattermode","undefined","orientation","defaultMode","PTS_LINESONLY","hasMarkers","gradient","hasLines","hasText","dfltHoverOn","push","fillDflt","fill","fillcolor","lineColor","line","hoveron","errorBarsSupplyDefaults","getComponentMethod","axis","inherit","coerceSelectionMarkerOpacity","plots","gd","traces","transitionOpts","makeOnCompleteCallback","plotBasePlot","clean","newFullData","newFullLayout","oldFullData","oldFullLayout","cleanBasePlot","Color","hasMarkerColorscale","defaultLine","setGroupPositions","insertBlank","calcTrace","index","position","traceIndex","hasAnyBlanks","interpolate","posAttr","newEntry","i","gap","s","splice","prevEntry","pt0","pt1","getInterp","t","trace","plotinfo","_fullLayout","xa","xaxis","ya","yaxis","fullLayout","fullTraces","_fullData","calcTraces","calcdata","calcTracesHorz","calcTracesVert","length","fullTrace","type","_id","mode","scattergap","groupCrossTraceCalc","subplot","subplotStackOpts","_scatterStackOpts","j","k","i2","cd","cd0","posj","sumj","norm","groupOpts","groupnorm","valAttr","stackGroup","indices","traceIndices","stackgaps","Array","allPositions","serieslen","_rawLength","_length","cdj","sNorm","ppad","calcMarkerSize","arrayPad","isArray","ppadRaw","x","y","calcAxisExpansion","getDelay","_has","getRedrawFunc","encodeSVG","svg","encodeURIComponent","encodeJSON","json","DOM_URL","window","URL","webkitURL","createObjectURL","blob","revokeObjectURL","url","createBlob","format","Blob","binary","b","buf","ArrayBuffer","arr","Uint8Array","charCodeAt","fixBinary","atob","octetStream","document","location","href","IMAGE_URL_PREFIX","MSG_IE_BAD_FORMAT","helpers","saveLink","createElement","canUseSaveLink","Promise","resolve","reject","objectUrl","isIE","navigator","msSaveBlob","download","body","appendChild","click","removeChild","isSafari","Error","inheritColorFromMarker","markerLineColor","addOpacity","perStackAttrs","stackOpts","firstTrace","dflts","attrFound","traceHasAttr","isOrientation","trace2","_input","min","max","Axes","getAxisGroup","orientations","setPositionOffset","traceType","boxList","posAxis","axId","axLetter","charAt","pointList","shownPts","c2l","pos","pts2","boxdv","distinctVals","minDiff","dPos0","minDtick","vals","numTotal","group","groupFraction","groupGapFraction","dPos","bdPos","bPos","wHover","pushplus","pushminus","width","side","groupId","alignmentGroupOpts","_alignmentOpts","alignmentgroup","nOffsetGroups","Object","keys","offsetGroups","num","_offsetIndex","edgeplus","edgeminus","vpadplus","vpadminus","ppadplus","ppadminus","edge","padded","Boolean","boxpoints","points","pointpos","jitter","ms","size","pp","pm","_extremes","findExtremes","vpadLinearized","empty","getCentroid","d","isHorizontal","isFunnel","x0","c2p","s0","p0","x1","s1","p1","y0","y1","searchInfo","selectionTester","selection","selected","di","ct","contains","pointNumber","c2d","d3","Drawing","sel","select","selectAll","opacity","each","el","this","lineWidth","styleBox","boxSel","fillColor","call","stroke","allBoxes","boxData","thisBox","container","dir","selectedpoints","pts","pointStyle","styleOnSelect","selectedPointStyle","isNumeric","factor","sizeRef","sizeref","sizeMin","sizemin","baseFn","sizemode","v","Math","sqrt","baseSize","BADNUM","zOld","rowlen","collen","getCollen","old2new","cleanZvalue","transpose","padOld2new","axisMapping","ax","axMapping","traceCategories","ind","_categories","identity","xMap","yMap","zNew","mergeArray","text","hovertext","markerLine","mergeArrayCastPositive","pt","pattern","shape","version","numConstants","oneYear","ONEAVGYEAR","oneMonth","ONEAVGMONTH","oneDay","ONEDAY","oneHour","ONEHOUR","oneMin","ONEMIN","oneSec","ONESEC","tickIncrement","biggestDigitChanged","v1","v2","pa","calendar","Infinity","dv","abs","isDate","digit","biggestGuaranteedDigitChanged","nextDigit","didDigitChange","pow","floor","log","LN10","dateParts1","dateParts","dateParts2","parti","parts","split","unshift","leftGap","rightGap","binEdges","disambiguateEdges","dv0","dv1","dv2","edge0","edge1","leftDigit","rightDigit","dashExclude","increment","isRightEdge","dateStr","dashPos","indexOf","substr","roundedV","d2c","nextV","round","alignPeriod","calcColorscale","arraysToCalcdata","calcSelection","xId","yId","firstScatter","_firstScatter","firstScatterGroup","uid","stackOrientation","getStackOpts","_minDtick","xOptions","yOptions","openEnded","tozero","error_y","markerTrans","setConvert","makeCalcdata","sizeOut","setFirstScatter","stackgroup","stackAx","isV","vali","_xA","getFromId","_yA","origX","origY","xObj","yObj","ids","interpolateGaps","xAttr","yAttr","pushUnique","_expandedIndex","hasPeriodX","xperiodalignment","hasPeriodY","yperiodalignment","cdi","xValid","yValid","orig_x","xEnd","ends","xStart","starts","orig_y","yEnd","yStart","id","String","sort","a","pos0","size0","m","tinycolor","svgTextUtils","formatLabels","extractOpts","makeColorScaleFuncFromTrace","xmlnsNamespaces","LINE_SPACING","supportsPixelatedImage","PIXELATED_IMAGE_STYLE","labelClass","selectLabels","plotGroup","removeLabels","remove","findInterp","pixel","pixArray","maxBin","bin","constrain","findBin","pix0","pix1","interp","bin0","frac","bin1","findInterpFromCenters","centerPixArray","putColor","pixels","pxIndex","c","cdheatmaps","heatmapLayer","makeTraceGroups","left","right","temp","top","bottom","xGap","xgap","yGap","ygap","z","xc","xCenter","yc","yCenter","isContour","traceIs","zsmooth","n","maxRowLength","xrev","yrev","xfill","yfill","drawingMethod","_islinear","extra","canvasW","canvasH","imageWidth","imageHeight","data","exit","canvas","height","xpx","ypx","context","getContext","willReadFrequently","sclFunc","noNumericCheck","returnArray","xb","xi","row","yi","yb","xbi","ybi","pixcount","rcount","gcount","bcount","setColor","pixsize","interpColor","r0","r1","xinterp","yinterp","z00","dxy","z01","z10","z11","dx","dy","e","xForPx","yForPx","xPixArray","yPixArray","xinterpArray","findInterpX","findInterpY","imageData","createImageData","set","pxArray","dlen","putImageData","xGapLeft","yGapTop","reverse","fillStyle","fillRect","avgColor","_hmpixcount","_hmlumcount","getLuminance","image3","enter","append","xmlns","preserveAspectRatio","toDataURL","texttemplate","cOpts","dummyAx","range","_separators","_numFormat","aHistogram2dContour","aContour","iStop","jStart","jStop","textData","yVal","_y","xVal","_x","obj","zVal","zLabel","tickText","theText","_t","texttemplateString","_d3locale","_meta","lines","nL","nC","l","font","textfont","fontFamily","family","fontSize","globalFontSize","minW","minH","maxL","maxC","nextD","isFinite","classed","thisLabel","fontColor","contrast","positionText","xFn","yFn","convertToTspans","axisHoverFormat","texttemplateAttrs","hovertemplateAttrs","colorScaleAttrs","fontAttrs","dash","extendFlat","axisPeriod","valType","editType","axisPeriod0","axisPeriodAlignment","values","anim","xperiod","yperiod","xperiod0","yperiod0","xhoverformat","yhoverformat","offsetgroup","arrayOk","flags","extras","hovertemplate","eventDataKeys","smoothing","simplify","connectgaps","cliponaxis","fillpattern","symbol","symbolList","angle","angleref","standoff","maxdisplayed","unselected","textposition","colorEditType","out","hoverOnBox","boxmode","boxgap","boxgroupgap","barmode","barnorm","bargap","bargroupgap","barcornerradius","customdata","markerGradient","extendDeep","cloneLayoutOverride","tileClass","override","autosize","title","showlegend","margin","r","pad","annotations","hidesources","borderwidth","bordercolor","graphObj","options","keyName","oldData","oldLayout","newData","newLayout","_context","slice","showscale","sceneIds","filter","key","match","axesImageOverride","showaxeslabels","showticklabels","linetickenable","scene","zaxis","_scene","className","plotTile","td","config","staticPlot","plotGlPixelRatio","displaylogo","showLink","showTips","mapboxAccessToken","setBackground","defaultLayout","dateTick0","ONEWEEK","getPeriod0Dflt","period","xcalendar","ycalendar","histogram2dCalc","colorscaleCalc","convertColumnData","clean2dArray","interp2d","findEmpties","makeBoundArray","skipBreaks","binned","isHist","isGL2D","zIn","isArray1D","_z","noZsmooth","msg","warn","scaleIsLinear","avgdx","maxErrX","rangebreaks","newZ","dropZonBreaks","_emptypoints","xlen","xIn","xtype","xArray","yIn","ytype","yArray","_text","_hovertext","xRanges","yRanges","contours","coloring","dummyTrace","fontDflt","coerceFont","handleGroupingDefaults","autoType","handleSampleDefaults","getDims","dims","valid","astr","validate","sLen","q1","median","q3","_hasPreCompStats","minRowLength","defaultOrientation","yDims","xDims","yLen","xLen","autotypenumbers","setInX","hasCategories","handleCalendarDefaults","handlePointsDefaults","outlierColorDflt","coerce2","lineoutliercolor","modeDflt","hasPreCompStats","boxmeanDflt","mean","sd","boxmean","notchedDflt","notchspan","notchwidth","crossTraceDefaults","fullData","scatterAttrs","textFontAttrs","markerLineWidth","cornerradius","insidetextanchor","textangle","insidetextfont","outsidetextfont","constraintext","base","offset","_deprecated","bardir","coerceString","attributeDefinition","value","defaultValue","noBlank","strict","coerceNumber","coerceColor","isValid","coerceEnumerated","getValue","arrayOrScalar","getLineWidth","mlw","isTypedArraySpec","isBubble","isPlainObject","ax1","ax2","var1Name","var2Name","arrayVarNames","colLen","col1","col2","textCol","hasColumnText","hoverTextCol","hasColumnHoverText","col1dv","col1vals","col2dv","col2vals","newArrays","nI","nJ","init2dArray","after2before","i1","arrayVar","map","_after2before","uniformText","recordMinTextSize","clearMinTextSize","attributeText","attributeTextPosition","appendArrayPointValue","TEXTPAD","keyFunc","getKeyFunc","sign","dirSign","transition","onComplete","uniformtext","hasTransition","duration","ease","easing","textfitsInsideBar","barWidth","barHeight","textWidth","textHeight","getRotateFromAngle","getRotatedTextSize","textBB","rotate","PI","absSin","sin","absCos","cos","toMoveInsideBar","constrained","anchor","isEnd","isStart","toRight","leftToRight","toLeft","hasB","overhead","lx","ly","textpad","scale","padForRounding","scaleAndPad","R","clippedR","rX","rY","scaleTextForRoundedBar","textX","textY","targetX","targetY","anchorX","anchorY","extrapad","cdModule","traceLayer","isStatic","groupgap","bartraces","isWaterfall","isHistogram","isBar","shouldDisplayZeros","adjustPixel","connector","withTransition","pointGroup","ensureSingle","bars","lw","mc","bar","xy","p","sAxis","pAxis","getXY","isBlank","cont","roundWithLine","fixpx","vc","hideZeroSpan","ceil","outerBound","_sMax","_sMin","path","h","crValue","crForm","crPx","barLength","stackedBarTotalLength","maxRadius","calcCornerRadius","cornerradiusvalue","cornerradiusform","rectanglePath","refPoint","xdir","ydir","cornersweep","dy1","dy2","xminfunc","dx1","dx2","yminfunc","isNaN","setClipUrl","layerClipId","styleFns","makePointStyleFns","singlePointStyle","textPosition","appendTextNode","class","castOption","pLetter","vLetter","vAxis","formatLabel","u","formatNumber","label","labelLabel","tx","valueLabel","xLabel","yLabel","delta","rawS","deltaLabel","final","finalLabel","initial","initialLabel","percentInitial","begR","percentInitialLabel","formatPercent","percentPrevious","difR","percentPreviousLabel","percentTotal","sumR","percenTotalLabel","calcTexttemplate","textinfo","hasFlag","flag","nPercent","hasMultiplePercents","calcTextinfo","getText","getTextPosition","inStackOrRelativeMode","calcBar","isOutmostBar","_outmost","barIsRounded","layoutFont","barColor","getBarColor","insideTextFont","getInsideTextFont","outsideTextFont","getOutsideTextFont","datum","textSelection","ensureUniformFontSize","bBox","node","fitsInside","textHasSize","currentTransform","transform","toMoveOutsideBar","setTransormAndDisplay","appendBarText","hideOutsideRangePoint","hasClipOnAxisFalse","fillOne","Fx","getTraceColor","fillText","pointData","xval","yval","hovermode","minRad","xPeriod","yPeriod","rad","mrc","distfn","getDistanceFunction","kink","dxRaw","dyRaw","getClosest","sizeVal","xLabelVal","yLabelVal","spikeDistance","isHoverPointInFillElement","svgElement","domPoint","DOMPoint","isPointInFill","TypeError","svgPoint","ownerSVGElement","createSVGPoint","_fillElement","_fillExclusionElement","hoverLabelCoords","polygons","yPos","xAtYPos","polygonsIn","xmin","xmax","ymin","ymax","polygon","getHoverLabelPosition","_polygons","distance","maxHoverDistance","linePoints","linkTraces","polygonTester","plotOne","idx","cdscatter","cdscatterAll","element","xr","extent","simpleMap","r2c","yr","mnum","inc","tnum","forEach","tracei","i0","vis","selectMarkers","tr","errorBarGroup","ownFillEl3","tonext","fillAxisIndex","fillAxisZero","ownFillDir","isRangePlot","thispath","thisrevpath","prevRevpath","prevPolygons","prevtrace","_prevtrace","prevFillsegments","prevFillElement","_prevRevpath","_nextFill","_ownPolygons","_fillsegments","pathfn","revpathbase","revpathfn","lastSegment","fullpath","revpath","thisPolygons","fillsegments","segments","makeUpdate","noop","_ownFill","steps","pLast","smoothclosed","smoothopen","connectGaps","baseTolerance","fillsegmentCount","curpoints","apply","isEnter","lineGroupStyle","singleLineStyle","lineJoin","makeSelfPolygons","makePolygonsToPrevious","reversedPrevFillsegment","concat","polypoints","singleFillStyle","clearFill","showMarkers","showText","markerFilter","hideFilter","textFilter","showFilter","isInferZero","_needsCull","visFilterWithGaps","visFilter","gapFilter","translatePoints","order","translatePoint","g","textPointStyle","makePoints","clipUrl","scatterLayer","isFullReplot","cdscatterSorted","traceJoin","fills","fillData","_ownfill","_nexttrace","fillJoin","createFills","getMinKey","minKey","minSize","minsize","hide","resizeText","gTrace","selector","shouldHide","count","sum","counterData","Number","avg","counts","Loggers","addStyleRule","ExtendModule","basePlotAttributes","baseLayoutAttributes","extendDeepAll","registerTraceModule","_module","thisType","categoriesIn","modules","subplotsRegistry","plotType","componentName","findArrayRegexps","componentsRegistry","mergeComponentAttrsToSubplot","registerSubplot","categoryObj","allCategories","allTypes","mergeComponentAttrsToTrace","traceLayoutAttributes","bpmName","styleRules","PlotlyGeoAssets","topojson","registerComponentModule","_isLinkedToArray","layoutArrayContainers","subplotName","transformType","transformsRegistry","mergeComponentAttrsToTransform","schema","registerTransformModule","hasTransform","hasCalcTransform","calcTransform","registerLocale","locale","baseLocale","newDict","dictionary","newFormat","hasDict","hasFormat","locales","localeRegistry","localeObj","baseLocaleObj","arrayAttrRegexps","_arrayAttrRegexps","layoutArrayRegexes","componentSchema","traceAttrs","transforms","transformAttrs","subplots","subplotModule","subplotAttrs","subplotAttr","componentLayoutAttrs","getTraceType","apiMethodRegistry","collectableSubplotTypes","register","_modules","newModule","fn","getModule","category","getTransformIndices","method","arguments","args","Snapshot","clone","toSVG","svgToImg","toImage","downloadImage","tagSelected","labels","mockGd","getFromTrace","colorbar","hoverPoints","eventData","selectPoints","animatable","LOG_CLIP","LOG_CLIP_PLUS","LOG_CLIP_MINUS","segmentsIntersect","clusterStartPt","clusterEndPt","clusterHighPt","clusterLowPt","thisPt","clusterHighFirst","clusterUnitVector","thisVector","clusterRefDist","clusterHighVal","clusterLowVal","thisVal","clusterMinDeviation","clusterMaxDeviation","thisDeviation","latestXFrac","latestYFrac","xLog","yLog","linear","minTolerance","pti","getPt","linearized","l2p","_m","crossesViewport","xFrac0","yFrac0","xFrac1","yFrac1","dx0","dy0","norm2","dot","cross","getTolerance","nextPt","xFrac","yFrac","offScreenFraction","toleranceGrowth","ptDist","pt2","xEdge","yEdge","lastXEdge","lastYEdge","lastFarPt","edgePt","getEdgeIntersections","maxScreensAway","xEdge0","xEdge1","yEdge0","yEdge1","edges","onlyConstrainedPoint","sameEdge","getABAEdgeIntersections","dim","limit0","limit1","ptInt1","ptInt2","midShift","updateEdge","xSame","ySame","xSame2","ySame2","updateEdgesForReentry","ptCount","ptInt","arrayMarker","addPt","intersections","lastPt","getClosestCorner","lastShapeChar","trimmed","newSegments","start","end","applyBackoff","coordDefaults","coordStr","coord","xName","yName","ylen","zi","allRowsAreArrays","oneRowIsFilled","hasOneNumber","isValidZ","barAttrs","colorAttrs","scatterMarkerAttrs","scatterMarkerLineAttrs","lowerfence","upperfence","notched","sdmultiple","quartilemethod","outliercolor","outlierwidth","whiskerwidth","showwhiskers","xl","yl","nx","ny","zmask","zhoverformat","x2","y2","error","inbox","hoverongaps","hoverformat","maxSpikeDistance","zLabelVal","stylePoints","styleText","fillGroupStyle","selectedTextStyle","LINKEDFILLS","tonextx","tonexty","groupIndex","groupIndices","needsSort","prevGroupIndex","nextGroupIndex","prevUnstackedGroupIndex","_groupIndex","traceA","traceB","prevtraces","Plots","strScale","strTranslate","isValidTextValue","attachFxHandlers","sliceTop","cx","cy","isFunnelArea","_hasHoverLabel","_hasHoverEvent","on","fullLayout2","_dragging","hoverinfo","castHoverinfo","rInscribed","hoverCenterX","pxmid","hoverCenterY","separators","formatPieValue","percent","vTotal","percentLabel","formatPiePercent","hoverLabel","hoverlabel","hoverFont","bbox","loneHover","_x0","TL","_x1","TR","_y0","_y1","BL","idealAlign","bgcolor","borderColor","nameLength","namelength","textAlign","align","hovertemplateLabels","_hoverlayer","outerContainer","_paper","inOut_bbox","emit","event","evt","originalEvent","loneUnhover","_hoverdata","determineInsideTextFont","customColor","prerenderTitles","txt","templateString","dummyTitle","tester","titleBox","transformInsideText","rpx1","startangle","stopangle","rCenter","textPosAngle","newT","ring","isCircle","halfAngle","halfangle","midAngle","midangle","insidetextorientation","isTangential","isRadial","isAuto","allTransforms","considerCrossing","stop","isCrossing","dStart","dStop","closestEdge","calcTanTransform","calcRadTransform","textDiameter","maxScale","calcMaxHalfSize","calcRCenter","calcRotate","q","tan","getInscribedRadiusFraction","hole","transformOutsideText","outside","positionTitleOutside","plotSize","scaleX","scaleY","maxPull","topMiddle","translate","ty","getMaxPull","aspectratio","rx","maxWidth","w","domain","getTitleSpace","pieBoxHeight","pull","layoutAreas","scaleGroups","ry","scalegroup","area","baseratio","groupScale","getCoords","formatSliceLabel","hasLabel","hasValue","hasPercent","getFirstFilled","makeTemplateVariables","ptTx","computeTransform","cosA","sinA","midX","midY","noCenter","gs","_size","plotGroups","_pielayer","currentCoords","currentAngle","getRotationAngle","rotation","angleFactor","firstPt","direction","hidden","largeArc","setCoords","slices","quadrants","hasOutsideText","curveNumber","slicePath","cxFinal","cyFinal","outerCircle","px0","arc","outerArc","px1","rim","sliceTextGroup","sliceText","determineOutsideTextFont","newFont","textXY","yLabelMin","yLabelMid","yLabelMax","labelExtraX","labelExtraY","finish","cw","titleTextGroup","titleText","positionTitleInside","xHalf","yHalf","equatorFirst","farthestX","farthestY","xDiffSign","yDiffSign","thisQuad","oppositeQuad","wholeSide","thisQuadOutside","firstOppositeOutsidePt","topFirst","bottomFirst","scootOneLabel","prevPt","xBuffer","otherPt","newExtraX","prevOuterY","thisInnerY","thisOuterY","thisSliceOuterY","newExtraY","scootLabels","lineStartX","textLinePath","finalX","yFromX","yNet","plotTextLines","automargin","traceBbox","vpw","vph","autoMargin","yt","setTimeout","Sieve","sa","excluded","included","_base","scalendar","hasBase","initBase","setGroupPositionsInOverlayMode","sieve","sepNegVal","overlapNoMerge","positions","distinctPositions","nTraces","overlap","barGroupWidth","alignmentGroups","barWidthPlusGap","offsetFromCenter","barwidth","poffset","bargroupwidth","bardelta","binWidth","applyAttributes","setBarCenterAndWidth","updatePositionAxis","setOffsetAndWidthInGroupMode","inTraceSieve","put","unhideBarsWithinTrace","sieveBars","normalizeBars","setBaseAndTop","setGroupPositionsInGroupMode","cr","standardizeCornerradius","setOffsetAndWidth","sLetter","getAxisLetter","stackBars","get","setGroupPositionsInStackOrRelativeMode","setCornerradius","extents","pMin","pMax","roundFactor","sMinByPos","sMaxByPos","anyTraceHasCornerradius","some","poffsetIsArray","pVal","sMin","sMax","setHelperValuesForRoundedCorners","collectExtents","newPoffset","calcTrace0","_offset","initialPoffset","prototype","_width","initialBarwidth","newBarwidth","barwidthIsArray","allowMinDtick","vpad","calcBarOffset","calcBarWidth","isScatter","isVertical","sTop","sTiny","l2c","needsPadding","_computePh","ph0","ph1","xCat","yCat","binFunctions","normFunctions","doAvg","getBinSpanLabelRound","calcAllAutoBins","mainData","_overlayEdgeCase","autoVals","cumulativeSpec","binAttr","groupName","binOpts","_histogramBinOpts","isOverlay","c2r","cleanBound","cleanDate","setBound","bins","newBins","nestedProperty","allPos","isFirstVisible","has2dMap","hasHist2dContour","mainDatai","dirs","_autoBin","newBinSpec","autoBin","nbins","sizeFound","_dataSpan","bingroup","xbins","overlaidTraceGroup","xid","yid","getConnectedHistograms","pastThisTrace","singleValuedTraces","resulti","binSpeci","isSingleValued","dataVals","handleSingleValueOverlays","cumulative","enabled","currentbin","traceInputBins","traceBinOptsCalc","mainStart","startIn","r2l","hasStart","startFound","traceStart","aggNums","dtick","tick0","l2r","newStart","tickFirst","mainEnd","endIn","hasEnd","endFound","traceEnd","autoBinAttr","binEnd","binsAndPos","binSpec","nonuniformBins","inputPoints","total","histnorm","func","histfunc","densityNorm","replace","rawCounterData","sizeInit","binFunc","normFunc","isAvg","pr2c","_roundFnOpts","roundFnOpts","roundFn","nMax","uniqueValsPerBin","ptNumber2cdIndex","posi","currentBin","vi","prevSum","firstHalfPoint","nextHalfPoint","pop","shift","cdf","seriesLen","firstNonzero","lastNonzero","width1","attributeTextFont","attributeInsideTextFont","attributeOutsideTextFont","styleTextPoints","determineFont","textFont","getTextFont","getFontValue","defaultFont","attributeValue","familyValue","sizeValue","colorValue","mcc","barcount","txs","selectedFontColor","styleTextInSelectionMode","stylePointsInSelectionMode","fileSaver","_gd","getGraphDiv","imageDataOnly","_snapshotInProgress","promise","filename","then","result","catch","err","layoutIn","layoutOut","groupBarmode","posAxId","alignmentOpts","alignmentIndex","offsetGroupOpts","offsetIndex","prevRow","neighborCount","newNeighborHash","foundNewNeighbors","empties","neighborHash","noNeighborList","nextRow","blank","rowLength","point","vs","inside","xj","yj","subtypes","validateCornerradius","hasBars","shouldBeGapless","gappedAnyway","usedSubplots","subploti","EventEmitter","clonePlot","ev","clonedGd","redrawFunc","delay","randstr","emitter","lc","tc","mlc","mlcc","extendedColorWayList","makePullColorFn","colorMap","getAlpha","generateExtendedColors","colorList","extendedColorWays","colorString","JSON","stringify","colors","lighten","toHexString","darken","hiddenLabels","hiddenlabels","hasValues","_hasValues","dlabel","label0","allThisTraceLabels","pullColor","isAggregated","thisLabelIndex","elem","desiredType","colorWay","dfltColorCount","colorway","baseAttrs","domainAttrs","titlefont","titleposition","plotBoxAndWhiskers","axes","bdPos0","bdPos1","valAxis","val","posHasRangeBreaks","wdPos","bPosPxOffset","whiskerWidth","showWhiskers","nw","paths","box","lcenter","pos1","posc","posw0","posw1","posm0","posm1","sdmode","med","useExtremes","lf","uf","ln","un","plotPoints","seedPseudoRandom","gPoints","newJitter","typicalSpread","minSpread","spreadLimit","jitterFactors","maxJitterFactor","pmin","pmax","jitterFactor","jitterOffset","pseudoRandom","posPx","uo","lo","so","plotBoxMean","meanline","sl","sh","cdbox","boxLayer","origPos","pObj","hasPeriod","sizeOpts","msUTC","orig_p","containerStr","piecolorway","extendpiecolors","_","valLetter","posLetter","numKey","boxVals","N","allPosArrays","hasPosArray","hasPos0","hasPosStep","isDateTime","pos0c","r2c_just_indices","getPosArrays","posArray","posDistinct","ptFilterFn","valArrayRaw","minVal","maxVal","sortByVal","extractVal","computeLowerFence","computeUpperFence","stdev","computeLowerOutlierBound","computeUpperOutlierBound","ns","computeNotchSpan","imin","imax","v0","valArray","posBins","makeBins","pLen","ptsPerBin","initNestedArray","minLowerNotch","maxUpperNotch","usesExclusive","usesInclusive","lower","upper","mci","isTypedArray","from","TRACE_TO_CALC","ptNumber","o","probability","density","yinc","traceSelection","handleDomainDefaults","handleText","handleLabelsAndValues","hasLabels","hasPositive","isPie","paper_bgcolor","markerColors","fgcolor","res","_hasLabels","textInfo","textTemplate","moduleHasSelected","moduleHasUnselected","moduleHasConstrain","moduleHasCliponaxis","moduleHasTextangle","moduleHasInsideanchor","titlePosition","Image","ieSvgError","svgBlob","w0","h0","w1","h1","ctx","img","onload","imgData","drawImage","errorMsg","onerror","src","filli","tracej","getLabel","oldValue","NEIGHBORSHIFTS","correctionOvershoot","maxFractionalChange","iterateInterp2d","emptyPoints","overshoot","neighborShift","neighborRow","neighborVal","neighborSum","initialVal","minNeighbor","maxNeighbor","appendArrayMultiPointValues","pointNumbers","handleXYZDefaults","handleHeatmapLabelDefaults","handleStyleDefaults","noSelect","hoverLabelText","hoverOnBars","posVal","sizeLetter","pRangeCalc","isClosest","sizeFn","positionFn","isClosestOrPeriod","thisBarMinPos","thisBarExtPos","thisBarMaxPos","sgn","periodLength","minPos","maxPos","_minPos","_maxPos","maxDistance","finiteRange","getSize","baseLabel","thisBarSizeFn","thisBarPositionFn","barPointData","trim","hasPathbar","hasBoth","hasInside","hasOutside","dfltFont","insideTextFontDefault","isColorInheritedFromLayoutFont","pathbarTextFontDefault","arrayIn","v0In","dvIn","numbricks","arrayOut","_supply","hasTraceType","DOUBLEQUOTE_REGEX","DUMMY_SUB","DUMMY_REGEX","RegExp","toppaper","_toppaper","insert","setRect","basePlotModules","_basePlotModules","nodes","childNodes","topGroups","topGroup","_draggers","background","visibility","display","ff","setAttributeNS","xlink","XMLSerializer","serializeToString","hiddenDiv","html","replaced","htmlEntityDecode","impliedEdits","autoSize","autoColor","autoColorDflt","makeIncrements","nonuniform","binsToCalc","getRanges","uniqueVals","gapLow","gapHigh","xr2c","yr2c","xBinsAndPos","xBinSpec","xPos0","yBinsAndPos","yBinSpec","yPos0","onecol","zerocol","nonuniformBinsX","nonuniformBinsY","xEdges","yEdges","ybins","densitynorm","sizeinit","binfunc","normfunc","doavg","xinc","xBinSize","xBinStart","xBinEnd","yBinSize","yBinStart","yBinEnd","ipCol","yc2r","uniqueValsPerX","uniqueValsPerY","xVals","yVals","xGapLow","xGapHigh","yGapLow","yGapHigh","hoverOnBoxes","vVal","hoverPseudoDistance","spikePseudoDistance","boxDeltaPos","boxDeltaNeg","dVal","isViolin","boxDelta","posAcceptance","shiftPos","span","pseudoDistance","spikePosAttr","hasMean","hasFences","attrs","rev","spikePosition","closeBoxData","valPx","pointData2","hoverOnPoints","closePtData","xPx","yPx","quadrature","ijClosest","newDistance","noAngle","noAngleRef","noStandOff","noLine","vRounded","toPrecision","numSeparate","array","item"],"sourceRoot":""}