{"version":3,"sources":["webpack:///./node_modules/file-saver/dist/FileSaver.min.js","webpack:///./node_modules/core-js/modules/_array-fill.js","webpack:///./src/components/gauge/Waterlevel.vue","webpack:///./node_modules/d3-line-chunked/node_modules/d3-array/src/extent.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/selector.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/selection/select.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/array.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/selectorAll.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/selection/selectAll.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/matcher.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/selection/selectChild.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/selection/selectChildren.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/selection/filter.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/selection/sparse.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/selection/enter.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/constant.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/selection/data.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/selection/exit.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/selection/join.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/selection/merge.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/selection/order.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/selection/sort.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/selection/call.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/selection/nodes.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/selection/node.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/selection/size.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/selection/empty.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/selection/each.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/namespaces.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/namespace.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/selection/attr.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/window.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/selection/style.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/selection/property.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/selection/classed.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/selection/text.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/selection/html.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/selection/raise.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/selection/lower.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/creator.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/selection/append.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/selection/insert.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/selection/remove.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/selection/clone.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/selection/datum.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/selection/on.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/selection/dispatch.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/selection/iterator.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/selection/index.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-selection/src/select.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-shape/src/curve/linear.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-shape/src/array.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-shape/src/constant.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-path/src/path.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-shape/src/path.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-shape/src/point.js","webpack:///./node_modules/d3-line-chunked/node_modules/d3-shape/src/line.js","webpack:///./node_modules/d3-interpolate-path/build/d3-interpolate-path.mjs","webpack:///./node_modules/d3-line-chunked/src/lineChunked.js","webpack:///src/components/gauge/Waterlevel.vue","webpack:///./src/components/gauge/Waterlevel.vue?fbfe","webpack:///./src/components/gauge/Waterlevel.vue?3d34","webpack:///./node_modules/core-js/modules/es6.array.fill.js","webpack:///./src/lib/datelocalization.js","webpack:///./node_modules/debounce/index.js","webpack:///./src/lib/DefaultDiagramTemplate.js"],"names":["this","b","a","autoBom","console","warn","test","type","Blob","c","d","XMLHttpRequest","open","responseType","onload","g","response","onerror","error","send","status","e","dispatchEvent","MouseEvent","document","createEvent","initMouseEvent","window","f","self","global","navigator","userAgent","saveAs","HTMLAnchorElement","prototype","h","i","URL","webkitURL","j","createElement","name","download","rel","href","origin","location","target","createObjectURL","setTimeout","revokeObjectURL","msSaveOrOpenBlob","title","body","innerText","HTMLElement","safari","FileReader","k","onloadend","result","replace","readAsDataURL","l","m","module","exports","toObject","toAbsoluteIndex","toLength","value","O","length","aLen","arguments","index","undefined","end","endPos","render","_vm","_c","_self","staticClass","attrs","close","staticStyle","directives","rawName","_v","form","template","expression","on","$event","$$selectedVal","Array","filter","call","options","o","selected","map","val","_value","$set","multiple","applyChange","_l","templates","key","domProps","_s","waterlevels","downloadPDF","class","disabled","csvLink","concat","fileName","downloadImage","active","showNSC","isArray","_i","$$a","$$el","$$c","checked","$$v","$$i","slice","containerId","_e","staticRenderFns","values","valueof","min","max","none","selector","querySelector","select","groups","_groups","subgroups","node","subnode","group","n","subgroup","__data__","Selection","_parents","array","x","from","empty","querySelectorAll","arrayAll","apply","selectorAll","parents","push","matches","childMatcher","find","childFind","match","children","childFirst","firstElementChild","childrenFilter","selectAll","matcher","update","_enter","sparse","EnterNode","parent","datum","ownerDocument","namespaceURI","_next","_parent","constructor","appendChild","child","insertBefore","next","bindIndex","enter","exit","data","groupLength","dataLength","bindKey","keyValue","nodeByKeyValue","Map","keyValues","has","set","get","delete","bind","constant","arraylike","enterGroup","updateGroup","exitGroup","previous","i0","i1","_exit","onenter","selection","append","onupdate","onexit","remove","merge","order","context","groups0","groups1","m0","m1","Math","merges","group0","group1","compareDocumentPosition","parentNode","compareNode","compare","ascending","sortgroups","sortgroup","sort","NaN","callback","size","xhtml","svg","xlink","xml","xmlns","prefix","indexOf","namespaces","hasOwnProperty","space","local","attrRemove","removeAttribute","attrRemoveNS","fullname","removeAttributeNS","attrConstant","setAttribute","attrConstantNS","setAttributeNS","attrFunction","v","attrFunctionNS","namespace","getAttributeNS","getAttribute","each","defaultView","styleRemove","style","removeProperty","styleConstant","priority","setProperty","styleFunction","styleValue","getPropertyValue","getComputedStyle","propertyRemove","propertyConstant","propertyFunction","classArray","string","trim","split","classList","ClassList","_node","_names","classedAdd","names","list","add","classedRemove","classedTrue","classedFalse","classedFunction","join","splice","contains","textRemove","textContent","textConstant","textFunction","htmlRemove","innerHTML","htmlConstant","htmlFunction","raise","nextSibling","lower","previousSibling","firstChild","creatorInherit","uri","documentElement","createElementNS","creatorFixed","create","creator","constantNull","before","removeChild","selection_cloneShallow","clone","cloneNode","selection_cloneDeep","deep","property","contextListener","listener","event","parseTypenames","typenames","t","onRemove","typename","__on","removeEventListener","onAdd","addEventListener","params","CustomEvent","initEvent","bubbles","cancelable","detail","dispatchConstant","dispatchFunction","selection_select","selectChild","selectChildren","selection_filter","selection_data","selection_enter","selection_exit","selection_merge","nodes","selection_node","selection_empty","selection_each","attr","classed","text","selection_text","html","selection_raise","selection_lower","insert","selection_remove","selection_datum","dispatch","Symbol","iterator","Linear","_context","areaStart","_line","areaEnd","lineStart","_point","lineEnd","closePath","point","y","lineTo","moveTo","pi","PI","tau","epsilon","tauEpsilon","strings","_","appendRound","digits","floor","Error","round","Path","_x0","_y0","_x1","_y1","_append","x1","y1","x2","y2","r","x0","y0","x21","y21","x01","y01","l01_2","abs","x20","y20","l21_2","l20_2","l21","sqrt","l01","tan","acos","t01","t21","a0","a1","ccw","dx","cos","dy","sin","cw","da","w","withPath","shape","RangeError","p","defined","curve","output","path","line","buffer","defined0","ownKeys","object","enumerableOnly","keys","Object","getOwnPropertySymbols","symbols","sym","getOwnPropertyDescriptor","enumerable","_objectSpread2","source","forEach","_defineProperty","getOwnPropertyDescriptors","defineProperties","defineProperty","_typeof","obj","configurable","writable","_extends","assign","_unsupportedIterableToArray","minLen","_arrayLikeToArray","toString","arr","len","arr2","_createForOfIteratorHelper","allowArrayLike","it","F","s","done","TypeError","err","normalCompletion","didErr","step","return","decasteljau","points","left","right","decasteljauRecurse","newPoints","reverse","pointsToCommand","command","splitCurveAsPoints","segmentCount","segments","remainingCurve","tIncrement","tRelative","splitCurve","commandStart","commandEnd","commandTokenRegex","typeMap","M","L","H","V","C","S","Q","T","A","Z","arrayOfLength","commandToString","convertToSameType","aCommand","bCommand","conversionMap","readFromBKeys","toUpperCase","aConverted","bKey","bValue","aValue","includes","splitSegment","copyCommand","extend","commandsToExtend","referenceCommands","excludeSegment","numSegmentsToExtend","numReferenceSegments","segmentRatio","countPointsPerSegment","reduce","accum","insertIndex","addToPriorSegment","extended","lastCommandCopies","unshift","pathCommandsFromString","commandArgs","tokens","commands","interpolatePathCommands","aCommandsInput","bCommandsInput","interpolateOptions","aCommands","bCommands","_ref","snapEndsToInput","addZ","pop","numPointsToExtend","interpolatedCommands","_step","interpolatedCommand","_iterator","arg","interpolatePath","_ref2","commandInterpolator","_step2","interpolatedString","_iterator2","toLowerCase","counter","defaultLineAttrs","fill","stroke","defaultGapAttrs","defaultPointAttrs","lineChunkName","gapChunkName","extendEnds","isNext","chunk","chunkLineResolver","chunkNameLeft","chunkNameRight","chunkNames","leftIndex","rightIndex","chunkDefinitions","lineStyles","lineAttrs","gapStyles","gapAttrs","pointStyles","pointAttrs","transitionInitial","accessData","debug","validateChunkDefinitions","def","pointStyle","pointAttr","getChunkNames","useChunkDefOrder","chunkDefNames","prependLine","prependGap","computeChunkedSegments","chunkName","definedSegments","segment","startNewSegment","addToSegment","lastSegment","dChunkName","dPrev","dNext","added","segmentChunkName","nextSegmentChunkName","chunkSegments","carry","newSegments","computeDefinedSegments","lineData","lastDatum","applyAttrsAndStyles","evaluatedDefinition","attrsKey","stylesKey","evaluateDefinitions","evaluateAttrsOrStyles","input","evaluated","chunks","chunkDef","evaluatedChunk","styles","basePointAttrs","parseFloat","basePointStyles","renderCircles","initialRender","transition","root","className","primaryClassName","circles","id","transitionDuration","duration","transitionDelay","delay","circlesEnter","enterDuration","renderClipRects","xMin","xMax","yMin","yMax","clipPathId","clipPath","gDebug","debugRects","clipPathRects","strokeWidth","strokeWidthClipAdjustment","clipRectY","clipRectHeight","visibleArea","previousRects","nextVisibleArea","visibleStartEnd","xStart","xEnd","xMid","visArea","area","exitRect","rect","enterRect","selectedRect","clipPathRectsEnter","debugRectsEnter","updateRect","valMin","valMax","renderPath","initialLine","pathSelection","attrTween","current","getLineFunctions","yDomain","processedLineData","initializeClipPath","defs","renderLines","lineIndex","filteredLineData","yExtent","xExtent","evaluatedDefinitions","lineResults","modifiedLineData","circlesClassName","lineChunked","getterSetter","setType","asConstant","newValue","d3","d3Base","temp","mixins","diagram","pdfgen","templateLoader","refwaterlevels","components","DiagramLegend","dateFromD","dateToD","selectedGaugeD","resizeListenerFunction","defaultTemplate","defaultDiagramTemplate","pdf","doc","width","height","templateData","zoomStore","computed","_objectSpread","mapState","mapGetters","properties","objname","$gettext","toLocaleDateString","encodeURIComponent","waterlevelsCSV","downloadFilename","selectedGauge","hasPredictions","predicted","watch","drawDiagram","paneSetup","_this","$nextTick","initialDiagramValues","methods","addLegendToCanvas","ctx","font","textAlign","beginPath","fillStyle","strokeStyle","arc","fillText","dateFrom","dateTo","$store","commit","downloadSVG","getElementById","svgXML","XMLSerializer","serializeToString","blog","filename","diagramTitle","isrsInfo","orc","generatePDF","save","_this2","loadTemplates","then","prepareImages","template_data","elements","url","catch","message","_error$response","displayError","addDiagramLegend","position","offset","color","padding","setFontStyle","setFontSize","getTextWidth","getTextHeight","setTextColor","setDrawColor","setFillColor","circle","getPrintLayout","svgHeight","svgWidth","main","top","bottom","nav","zoom","timeFormatDefaultLocale","localeDateString","elem","clientWidth","clientHeight","layout","renderTo","element","dimensions","getDimensions","zoomLevel","_this3","refWaterLevels","JSON","parse","reference_water_levels","extent","getExtent","scale","getScale","dFormat","date","timeSecond","timeFormat","timeMinute","timeHour","timeDay","timeMonth","timeWeek","app","timeYear","axes","axisTop","tickSizeInner","mainHeight","tickSizeOuter","tickFormat","axisRight","$options","filters","waterlevel","yRight","axisBottom","mainMargin","navigation","navMargin","updaters","drawAxes","drawWaterlevelChart","drawPredictionAreas","drawNowLines","drawNavigationChart","drawRefLines","drawNashSutcliffe","hours","eventRect","createZoom","createTooltips","setInlineStyles","rest","_this$determineLDCHDC","determineLDCHDC","LDC","HDC","_toConsumableArray","_ref3","scaleTime","range","scaleLinear","navHeight","_extent$waterlevel","_slicedToArray","lo","hi","ceil","domain","_ref4","_ref5","_this4","waterlevelChartDrawer","domainLeft","Date","getTime","domainRight","setDate","getDate","curveLinear","_ref6","_ref7","_extent$waterlevel2","nowLine","nowLabel","_ref8","predictionArea","isNav","_ref9","_this$determineLDCHDC2","refWaterlevelLine","levelStyle","ref","_ref10","coeff","nashSutcliffe","coeffs","dateNow","when","dateStart","nashSutcliffeBox","nashSutcliffeLabel","label","days","samples","toFixed","_ref11","_this5","brush","brushX","handleSize","scaleExtent","Infinity","translateExtent","sourceEvent","invert","u","transform","zoomIdentity","translate","scaleForZoom","rescaleX","move","invertX","tx","ty","_ref12","_this6","tooltip","tooltipText","tooltipPadding","diagramPadding","mouse","bisector","d0","d1","coords","toLocaleString","year","month","day","hour","minute","textBBox","getBBox","tooltipX","tooltipY","prev","difference","created","_this7","debounce","mounted","_this8","HTTP","headers","localStorage","getItem","_error$response2","destroyed","component","$export","P","dateTime","time","periods","shortDays","months","shortMonths","func","wait","immediate","timeout","args","timestamp","later","last","now","debounced","callNow","clear","clearTimeout","flush","paperSize","fontsize"],"mappings":"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","file":"js/chunk-6e357607.9fc25707.js","sourcesContent":["(function(a,b){if(\"function\"==typeof define&&define.amd)define([],b);else if(\"undefined\"!=typeof exports)b();else{b(),a.FileSaver={exports:{}}.exports}})(this,function(){\"use strict\";function b(a,b){return\"undefined\"==typeof b?b={autoBom:!1}:\"object\"!=typeof b&&(console.warn(\"Deprecated: Expected third argument to be a object\"),b={autoBom:!b}),b.autoBom&&/^\\s*(?:text\\/\\S*|application\\/xml|\\S*\\/\\S*\\+xml)\\s*;.*charset\\s*=\\s*utf-8/i.test(a.type)?new Blob([\"\\uFEFF\",a],{type:a.type}):a}function c(a,b,c){var d=new XMLHttpRequest;d.open(\"GET\",a),d.responseType=\"blob\",d.onload=function(){g(d.response,b,c)},d.onerror=function(){console.error(\"could not download file\")},d.send()}function d(a){var b=new XMLHttpRequest;b.open(\"HEAD\",a,!1);try{b.send()}catch(a){}return 200<=b.status&&299>=b.status}function e(a){try{a.dispatchEvent(new MouseEvent(\"click\"))}catch(c){var b=document.createEvent(\"MouseEvents\");b.initMouseEvent(\"click\",!0,!0,window,0,0,0,80,20,!1,!1,!1,!1,0,null),a.dispatchEvent(b)}}var f=\"object\"==typeof window&&window.window===window?window:\"object\"==typeof self&&self.self===self?self:\"object\"==typeof global&&global.global===global?global:void 0,a=f.navigator&&/Macintosh/.test(navigator.userAgent)&&/AppleWebKit/.test(navigator.userAgent)&&!/Safari/.test(navigator.userAgent),g=f.saveAs||(\"object\"!=typeof window||window!==f?function(){}:\"download\"in HTMLAnchorElement.prototype&&!a?function(b,g,h){var i=f.URL||f.webkitURL,j=document.createElement(\"a\");g=g||b.name||\"download\",j.download=g,j.rel=\"noopener\",\"string\"==typeof b?(j.href=b,j.origin===location.origin?e(j):d(j.href)?c(b,g,h):e(j,j.target=\"_blank\")):(j.href=i.createObjectURL(b),setTimeout(function(){i.revokeObjectURL(j.href)},4E4),setTimeout(function(){e(j)},0))}:\"msSaveOrOpenBlob\"in navigator?function(f,g,h){if(g=g||f.name||\"download\",\"string\"!=typeof f)navigator.msSaveOrOpenBlob(b(f,h),g);else if(d(f))c(f,g,h);else{var i=document.createElement(\"a\");i.href=f,i.target=\"_blank\",setTimeout(function(){e(i)})}}:function(b,d,e,g){if(g=g||open(\"\",\"_blank\"),g&&(g.document.title=g.document.body.innerText=\"downloading...\"),\"string\"==typeof b)return c(b,d,e);var h=\"application/octet-stream\"===b.type,i=/constructor/i.test(f.HTMLElement)||f.safari,j=/CriOS\\/[\\d]+/.test(navigator.userAgent);if((j||h&&i||a)&&\"undefined\"!=typeof FileReader){var k=new FileReader;k.onloadend=function(){var a=k.result;a=j?a:a.replace(/^data:[^;]*;/,\"data:attachment/file;\"),g?g.location.href=a:location=a,g=null},k.readAsDataURL(b)}else{var l=f.URL||f.webkitURL,m=l.createObjectURL(b);g?g.location=m:location.href=m,g=null,setTimeout(function(){l.revokeObjectURL(m)},4E4)}});f.saveAs=g.saveAs=g,\"undefined\"!=typeof module&&(module.exports=g)});\n\n//# sourceMappingURL=FileSaver.min.js.map","// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\n'use strict';\nvar toObject = require('./_to-object');\nvar toAbsoluteIndex = require('./_to-absolute-index');\nvar toLength = require('./_to-length');\nmodule.exports = function fill(value /* , start = 0, end = @length */) {\n  var O = toObject(this);\n  var length = toLength(O.length);\n  var aLen = arguments.length;\n  var index = toAbsoluteIndex(aLen > 1 ? arguments[1] : undefined, length);\n  var end = aLen > 2 ? arguments[2] : undefined;\n  var endPos = end === undefined ? length : toAbsoluteIndex(end, length);\n  while (endPos > index) O[index++] = value;\n  return O;\n};\n","var render = function render(){var _vm=this,_c=_vm._self._c;return _c('div',{staticClass:\"d-flex flex-column flex-fill\"},[_c('UIBoxHeader',{staticClass:\"rounded-0\",attrs:{\"icon\":\"ruler-vertical\",\"title\":_vm.title,\"closeCallback\":_vm.close}}),_c('div',{staticClass:\"d-flex flex-fill\"},[_c('DiagramLegend',{attrs:{\"id\":\"diagramlegendId\"}},[_c('div',{staticClass:\"legend\"},[_c('span',{staticStyle:{\"background-color\":\"steelblue\",\"width\":\"20px\",\"height\":\"20px\"}}),_c('span',{directives:[{name:\"translate\",rawName:\"v-translate\"}],staticClass:\"fix-trans-space\",staticStyle:{\"display\":\"inline\"}},[_vm._v(\"Waterlevel\")])]),_c('div',{staticClass:\"legend\"},[_c('span',{staticStyle:{\"width\":\"8px\",\"height\":\"8px\",\"background-color\":\"rgba(70, 130, 180, 0.6)\",\"border\":\"solid 7px rgba(70, 130, 180, 0.2)\",\"background-clip\":\"padding-box\",\"box-sizing\":\"content-box\"}}),_c('span',{directives:[{name:\"translate\",rawName:\"v-translate\"}],staticClass:\"fix-trans-space\",staticStyle:{\"display\":\"inline\"}},[_vm._v(\"Prediction\")])]),_c('div',{staticClass:\"legend\"},[_c('span',{staticStyle:{\"background-color\":\"rgba(0, 255, 0, 0.1)\",\"width\":\"20px\",\"height\":\"20px\"}}),_c('span',{directives:[{name:\"translate\",rawName:\"v-translate\"}],staticClass:\"fix-trans-space\",staticStyle:{\"display\":\"inline\"}},[_vm._v(\"Navigable Range\")])]),_c('div',[_c('select',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.form.template),expression:\"form.template\"}],staticClass:\"form-control d-block custom-select-sm w-100\",on:{\"change\":[function($event){var $$selectedVal = Array.prototype.filter.call($event.target.options,function(o){return o.selected}).map(function(o){var val = \"_value\" in o ? o._value : o.value;return val}); _vm.$set(_vm.form, \"template\", $event.target.multiple ? $$selectedVal : $$selectedVal[0])},_vm.applyChange]}},_vm._l((_vm.templates),function(template){return _c('option',{key:template.name,domProps:{\"value\":template}},[_vm._v(\"\\n            \"+_vm._s(template.name)+\"\\n          \")])}),0),_c('button',{staticClass:\"btn btn-sm btn-info d-block w-100 mt-2\",attrs:{\"type\":\"button\",\"disabled\":!_vm.waterlevels.length},on:{\"click\":_vm.downloadPDF}},[_c('translate',[_vm._v(\"Export to PDF\")])],1),_c('a',{class:[\n            'btn btn-sm btn-info d-block w-100 mt-2',\n            { disabled: !_vm.waterlevels.length }\n          ],attrs:{\"href\":_vm.csvLink,\"download\":`${_vm.fileName}.csv`}},[_c('translate',[_vm._v(\"Export as CSV\")])],1),_c('a',{class:[\n            'btn btn-sm btn-info text-white d-block w-100 mt-2',\n            { disabled: !_vm.waterlevels.length }\n          ],attrs:{\"id\":\"waterlevelpng\",\"download\":`${_vm.fileName}.png`},on:{\"click\":function($event){return _vm.downloadImage('waterlevelpng', _vm.title)}}},[_c('translate',[_vm._v(\"Export as Image\")])],1)]),_c('div',{staticClass:\"btn-group-toggle w-100 mt-2\"},[_c('label',{staticClass:\"btn btn-outline-secondary btn-sm\",class:{ active: _vm.showNSC }},[_c('input',{directives:[{name:\"model\",rawName:\"v-model\",value:(_vm.showNSC),expression:\"showNSC\"}],attrs:{\"type\":\"checkbox\",\"autocomplete\":\"off\"},domProps:{\"checked\":Array.isArray(_vm.showNSC)?_vm._i(_vm.showNSC,null)>-1:(_vm.showNSC)},on:{\"change\":function($event){var $$a=_vm.showNSC,$$el=$event.target,$$c=$$el.checked?(true):(false);if(Array.isArray($$a)){var $$v=null,$$i=_vm._i($$a,$$v);if($$el.checked){$$i<0&&(_vm.showNSC=$$a.concat([$$v]))}else{$$i>-1&&(_vm.showNSC=$$a.slice(0,$$i).concat($$a.slice($$i+1)))}}else{_vm.showNSC=$$c}}}}),_vm._v(\"Nash-Sutcliffe\\n        \")])])]),_c('div',{staticClass:\"d-flex flex-fill justify-content-center align-items-center\",attrs:{\"id\":_vm.containerId}},[(!_vm.waterlevels.length)?_c('div',[_c('translate',[_vm._v(\"No data available.\")])],1):_vm._e()])],1)],1)\n}\nvar staticRenderFns = []\n\nexport { render, staticRenderFns }","export default function extent(values, valueof) {\n  let min;\n  let max;\n  if (valueof === undefined) {\n    for (const value of values) {\n      if (value != null) {\n        if (min === undefined) {\n          if (value >= value) min = max = value;\n        } else {\n          if (min > value) min = value;\n          if (max < value) max = value;\n        }\n      }\n    }\n  } else {\n    let index = -1;\n    for (let value of values) {\n      if ((value = valueof(value, ++index, values)) != null) {\n        if (min === undefined) {\n          if (value >= value) min = max = value;\n        } else {\n          if (min > value) min = value;\n          if (max < value) max = value;\n        }\n      }\n    }\n  }\n  return [min, max];\n}\n","function none() {}\n\nexport default function(selector) {\n  return selector == null ? none : function() {\n    return this.querySelector(selector);\n  };\n}\n","import {Selection} from \"./index.js\";\nimport selector from \"../selector.js\";\n\nexport default function(select) {\n  if (typeof select !== \"function\") select = selector(select);\n\n  for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n    for (var group = groups[j], n = group.length, subgroup = subgroups[j] = new Array(n), node, subnode, i = 0; i < n; ++i) {\n      if ((node = group[i]) && (subnode = select.call(node, node.__data__, i, group))) {\n        if (\"__data__\" in node) subnode.__data__ = node.__data__;\n        subgroup[i] = subnode;\n      }\n    }\n  }\n\n  return new Selection(subgroups, this._parents);\n}\n","// Given something array like (or null), returns something that is strictly an\n// array. This is used to ensure that array-like objects passed to d3.selectAll\n// or selection.selectAll are converted into proper arrays when creating a\n// selection; we don’t ever want to create a selection backed by a live\n// HTMLCollection or NodeList. However, note that selection.selectAll will use a\n// static NodeList as a group, since it safely derived from querySelectorAll.\nexport default function array(x) {\n  return x == null ? [] : Array.isArray(x) ? x : Array.from(x);\n}\n","function empty() {\n  return [];\n}\n\nexport default function(selector) {\n  return selector == null ? empty : function() {\n    return this.querySelectorAll(selector);\n  };\n}\n","import {Selection} from \"./index.js\";\nimport array from \"../array.js\";\nimport selectorAll from \"../selectorAll.js\";\n\nfunction arrayAll(select) {\n  return function() {\n    return array(select.apply(this, arguments));\n  };\n}\n\nexport default function(select) {\n  if (typeof select === \"function\") select = arrayAll(select);\n  else select = selectorAll(select);\n\n  for (var groups = this._groups, m = groups.length, subgroups = [], parents = [], j = 0; j < m; ++j) {\n    for (var group = groups[j], n = group.length, node, i = 0; i < n; ++i) {\n      if (node = group[i]) {\n        subgroups.push(select.call(node, node.__data__, i, group));\n        parents.push(node);\n      }\n    }\n  }\n\n  return new Selection(subgroups, parents);\n}\n","export default function(selector) {\n  return function() {\n    return this.matches(selector);\n  };\n}\n\nexport function childMatcher(selector) {\n  return function(node) {\n    return node.matches(selector);\n  };\n}\n\n","import {childMatcher} from \"../matcher.js\";\n\nvar find = Array.prototype.find;\n\nfunction childFind(match) {\n  return function() {\n    return find.call(this.children, match);\n  };\n}\n\nfunction childFirst() {\n  return this.firstElementChild;\n}\n\nexport default function(match) {\n  return this.select(match == null ? childFirst\n      : childFind(typeof match === \"function\" ? match : childMatcher(match)));\n}\n","import {childMatcher} from \"../matcher.js\";\n\nvar filter = Array.prototype.filter;\n\nfunction children() {\n  return Array.from(this.children);\n}\n\nfunction childrenFilter(match) {\n  return function() {\n    return filter.call(this.children, match);\n  };\n}\n\nexport default function(match) {\n  return this.selectAll(match == null ? children\n      : childrenFilter(typeof match === \"function\" ? match : childMatcher(match)));\n}\n","import {Selection} from \"./index.js\";\nimport matcher from \"../matcher.js\";\n\nexport default function(match) {\n  if (typeof match !== \"function\") match = matcher(match);\n\n  for (var groups = this._groups, m = groups.length, subgroups = new Array(m), j = 0; j < m; ++j) {\n    for (var group = groups[j], n = group.length, subgroup = subgroups[j] = [], node, i = 0; i < n; ++i) {\n      if ((node = group[i]) && match.call(node, node.__data__, i, group)) {\n        subgroup.push(node);\n      }\n    }\n  }\n\n  return new Selection(subgroups, this._parents);\n}\n","export default function(update) {\n  return new Array(update.length);\n}\n","import sparse from \"./sparse.js\";\nimport {Selection} from \"./index.js\";\n\nexport default function() {\n  return new Selection(this._enter || this._groups.map(sparse), this._parents);\n}\n\nexport function EnterNode(parent, datum) {\n  this.ownerDocument = parent.ownerDocument;\n  this.namespaceURI = parent.namespaceURI;\n  this._next = null;\n  this._parent = parent;\n  this.__data__ = datum;\n}\n\nEnterNode.prototype = {\n  constructor: EnterNode,\n  appendChild: function(child) { return this._parent.insertBefore(child, this._next); },\n  insertBefore: function(child, next) { return this._parent.insertBefore(child, next); },\n  querySelector: function(selector) { return this._parent.querySelector(selector); },\n  querySelectorAll: function(selector) { return this._parent.querySelectorAll(selector); }\n};\n","export default function(x) {\n  return function() {\n    return x;\n  };\n}\n","import {Selection} from \"./index.js\";\nimport {EnterNode} from \"./enter.js\";\nimport constant from \"../constant.js\";\n\nfunction bindIndex(parent, group, enter, update, exit, data) {\n  var i = 0,\n      node,\n      groupLength = group.length,\n      dataLength = data.length;\n\n  // Put any non-null nodes that fit into update.\n  // Put any null nodes into enter.\n  // Put any remaining data into enter.\n  for (; i < dataLength; ++i) {\n    if (node = group[i]) {\n      node.__data__ = data[i];\n      update[i] = node;\n    } else {\n      enter[i] = new EnterNode(parent, data[i]);\n    }\n  }\n\n  // Put any non-null nodes that don’t fit into exit.\n  for (; i < groupLength; ++i) {\n    if (node = group[i]) {\n      exit[i] = node;\n    }\n  }\n}\n\nfunction bindKey(parent, group, enter, update, exit, data, key) {\n  var i,\n      node,\n      nodeByKeyValue = new Map,\n      groupLength = group.length,\n      dataLength = data.length,\n      keyValues = new Array(groupLength),\n      keyValue;\n\n  // Compute the key for each node.\n  // If multiple nodes have the same key, the duplicates are added to exit.\n  for (i = 0; i < groupLength; ++i) {\n    if (node = group[i]) {\n      keyValues[i] = keyValue = key.call(node, node.__data__, i, group) + \"\";\n      if (nodeByKeyValue.has(keyValue)) {\n        exit[i] = node;\n      } else {\n        nodeByKeyValue.set(keyValue, node);\n      }\n    }\n  }\n\n  // Compute the key for each datum.\n  // If there a node associated with this key, join and add it to update.\n  // If there is not (or the key is a duplicate), add it to enter.\n  for (i = 0; i < dataLength; ++i) {\n    keyValue = key.call(parent, data[i], i, data) + \"\";\n    if (node = nodeByKeyValue.get(keyValue)) {\n      update[i] = node;\n      node.__data__ = data[i];\n      nodeByKeyValue.delete(keyValue);\n    } else {\n      enter[i] = new EnterNode(parent, data[i]);\n    }\n  }\n\n  // Add any remaining nodes that were not bound to data to exit.\n  for (i = 0; i < groupLength; ++i) {\n    if ((node = group[i]) && (nodeByKeyValue.get(keyValues[i]) === node)) {\n      exit[i] = node;\n    }\n  }\n}\n\nfunction datum(node) {\n  return node.__data__;\n}\n\nexport default function(value, key) {\n  if (!arguments.length) return Array.from(this, datum);\n\n  var bind = key ? bindKey : bindIndex,\n      parents = this._parents,\n      groups = this._groups;\n\n  if (typeof value !== \"function\") value = constant(value);\n\n  for (var m = groups.length, update = new Array(m), enter = new Array(m), exit = new Array(m), j = 0; j < m; ++j) {\n    var parent = parents[j],\n        group = groups[j],\n        groupLength = group.length,\n        data = arraylike(value.call(parent, parent && parent.__data__, j, parents)),\n        dataLength = data.length,\n        enterGroup = enter[j] = new Array(dataLength),\n        updateGroup = update[j] = new Array(dataLength),\n        exitGroup = exit[j] = new Array(groupLength);\n\n    bind(parent, group, enterGroup, updateGroup, exitGroup, data, key);\n\n    // Now connect the enter nodes to their following update node, such that\n    // appendChild can insert the materialized enter node before this node,\n    // rather than at the end of the parent node.\n    for (var i0 = 0, i1 = 0, previous, next; i0 < dataLength; ++i0) {\n      if (previous = enterGroup[i0]) {\n        if (i0 >= i1) i1 = i0 + 1;\n        while (!(next = updateGroup[i1]) && ++i1 < dataLength);\n        previous._next = next || null;\n      }\n    }\n  }\n\n  update = new Selection(update, parents);\n  update._enter = enter;\n  update._exit = exit;\n  return update;\n}\n\n// Given some data, this returns an array-like view of it: an object that\n// exposes a length property and allows numeric indexing. Note that unlike\n// selectAll, this isn’t worried about “live” collections because the resulting\n// array will only be used briefly while data is being bound. (It is possible to\n// cause the data to change while iterating by using a key function, but please\n// don’t; we’d rather avoid a gratuitous copy.)\nfunction arraylike(data) {\n  return typeof data === \"object\" && \"length\" in data\n    ? data // Array, TypedArray, NodeList, array-like\n    : Array.from(data); // Map, Set, iterable, string, or anything else\n}\n","import sparse from \"./sparse.js\";\nimport {Selection} from \"./index.js\";\n\nexport default function() {\n  return new Selection(this._exit || this._groups.map(sparse), this._parents);\n}\n","export default function(onenter, onupdate, onexit) {\n  var enter = this.enter(), update = this, exit = this.exit();\n  if (typeof onenter === \"function\") {\n    enter = onenter(enter);\n    if (enter) enter = enter.selection();\n  } else {\n    enter = enter.append(onenter + \"\");\n  }\n  if (onupdate != null) {\n    update = onupdate(update);\n    if (update) update = update.selection();\n  }\n  if (onexit == null) exit.remove(); else onexit(exit);\n  return enter && update ? enter.merge(update).order() : update;\n}\n","import {Selection} from \"./index.js\";\n\nexport default function(context) {\n  var selection = context.selection ? context.selection() : context;\n\n  for (var groups0 = this._groups, groups1 = selection._groups, m0 = groups0.length, m1 = groups1.length, m = Math.min(m0, m1), merges = new Array(m0), j = 0; j < m; ++j) {\n    for (var group0 = groups0[j], group1 = groups1[j], n = group0.length, merge = merges[j] = new Array(n), node, i = 0; i < n; ++i) {\n      if (node = group0[i] || group1[i]) {\n        merge[i] = node;\n      }\n    }\n  }\n\n  for (; j < m0; ++j) {\n    merges[j] = groups0[j];\n  }\n\n  return new Selection(merges, this._parents);\n}\n","export default function() {\n\n  for (var groups = this._groups, j = -1, m = groups.length; ++j < m;) {\n    for (var group = groups[j], i = group.length - 1, next = group[i], node; --i >= 0;) {\n      if (node = group[i]) {\n        if (next && node.compareDocumentPosition(next) ^ 4) next.parentNode.insertBefore(node, next);\n        next = node;\n      }\n    }\n  }\n\n  return this;\n}\n","import {Selection} from \"./index.js\";\n\nexport default function(compare) {\n  if (!compare) compare = ascending;\n\n  function compareNode(a, b) {\n    return a && b ? compare(a.__data__, b.__data__) : !a - !b;\n  }\n\n  for (var groups = this._groups, m = groups.length, sortgroups = new Array(m), j = 0; j < m; ++j) {\n    for (var group = groups[j], n = group.length, sortgroup = sortgroups[j] = new Array(n), node, i = 0; i < n; ++i) {\n      if (node = group[i]) {\n        sortgroup[i] = node;\n      }\n    }\n    sortgroup.sort(compareNode);\n  }\n\n  return new Selection(sortgroups, this._parents).order();\n}\n\nfunction ascending(a, b) {\n  return a < b ? -1 : a > b ? 1 : a >= b ? 0 : NaN;\n}\n","export default function() {\n  var callback = arguments[0];\n  arguments[0] = this;\n  callback.apply(null, arguments);\n  return this;\n}\n","export default function() {\n  return Array.from(this);\n}\n","export default function() {\n\n  for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n    for (var group = groups[j], i = 0, n = group.length; i < n; ++i) {\n      var node = group[i];\n      if (node) return node;\n    }\n  }\n\n  return null;\n}\n","export default function() {\n  let size = 0;\n  for (const node of this) ++size; // eslint-disable-line no-unused-vars\n  return size;\n}\n","export default function() {\n  return !this.node();\n}\n","export default function(callback) {\n\n  for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n    for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n      if (node = group[i]) callback.call(node, node.__data__, i, group);\n    }\n  }\n\n  return this;\n}\n","export var xhtml = \"http://www.w3.org/1999/xhtml\";\n\nexport default {\n  svg: \"http://www.w3.org/2000/svg\",\n  xhtml: xhtml,\n  xlink: \"http://www.w3.org/1999/xlink\",\n  xml: \"http://www.w3.org/XML/1998/namespace\",\n  xmlns: \"http://www.w3.org/2000/xmlns/\"\n};\n","import namespaces from \"./namespaces.js\";\n\nexport default function(name) {\n  var prefix = name += \"\", i = prefix.indexOf(\":\");\n  if (i >= 0 && (prefix = name.slice(0, i)) !== \"xmlns\") name = name.slice(i + 1);\n  return namespaces.hasOwnProperty(prefix) ? {space: namespaces[prefix], local: name} : name; // eslint-disable-line no-prototype-builtins\n}\n","import namespace from \"../namespace.js\";\n\nfunction attrRemove(name) {\n  return function() {\n    this.removeAttribute(name);\n  };\n}\n\nfunction attrRemoveNS(fullname) {\n  return function() {\n    this.removeAttributeNS(fullname.space, fullname.local);\n  };\n}\n\nfunction attrConstant(name, value) {\n  return function() {\n    this.setAttribute(name, value);\n  };\n}\n\nfunction attrConstantNS(fullname, value) {\n  return function() {\n    this.setAttributeNS(fullname.space, fullname.local, value);\n  };\n}\n\nfunction attrFunction(name, value) {\n  return function() {\n    var v = value.apply(this, arguments);\n    if (v == null) this.removeAttribute(name);\n    else this.setAttribute(name, v);\n  };\n}\n\nfunction attrFunctionNS(fullname, value) {\n  return function() {\n    var v = value.apply(this, arguments);\n    if (v == null) this.removeAttributeNS(fullname.space, fullname.local);\n    else this.setAttributeNS(fullname.space, fullname.local, v);\n  };\n}\n\nexport default function(name, value) {\n  var fullname = namespace(name);\n\n  if (arguments.length < 2) {\n    var node = this.node();\n    return fullname.local\n        ? node.getAttributeNS(fullname.space, fullname.local)\n        : node.getAttribute(fullname);\n  }\n\n  return this.each((value == null\n      ? (fullname.local ? attrRemoveNS : attrRemove) : (typeof value === \"function\"\n      ? (fullname.local ? attrFunctionNS : attrFunction)\n      : (fullname.local ? attrConstantNS : attrConstant)))(fullname, value));\n}\n","export default function(node) {\n  return (node.ownerDocument && node.ownerDocument.defaultView) // node is a Node\n      || (node.document && node) // node is a Window\n      || node.defaultView; // node is a Document\n}\n","import defaultView from \"../window.js\";\n\nfunction styleRemove(name) {\n  return function() {\n    this.style.removeProperty(name);\n  };\n}\n\nfunction styleConstant(name, value, priority) {\n  return function() {\n    this.style.setProperty(name, value, priority);\n  };\n}\n\nfunction styleFunction(name, value, priority) {\n  return function() {\n    var v = value.apply(this, arguments);\n    if (v == null) this.style.removeProperty(name);\n    else this.style.setProperty(name, v, priority);\n  };\n}\n\nexport default function(name, value, priority) {\n  return arguments.length > 1\n      ? this.each((value == null\n            ? styleRemove : typeof value === \"function\"\n            ? styleFunction\n            : styleConstant)(name, value, priority == null ? \"\" : priority))\n      : styleValue(this.node(), name);\n}\n\nexport function styleValue(node, name) {\n  return node.style.getPropertyValue(name)\n      || defaultView(node).getComputedStyle(node, null).getPropertyValue(name);\n}\n","function propertyRemove(name) {\n  return function() {\n    delete this[name];\n  };\n}\n\nfunction propertyConstant(name, value) {\n  return function() {\n    this[name] = value;\n  };\n}\n\nfunction propertyFunction(name, value) {\n  return function() {\n    var v = value.apply(this, arguments);\n    if (v == null) delete this[name];\n    else this[name] = v;\n  };\n}\n\nexport default function(name, value) {\n  return arguments.length > 1\n      ? this.each((value == null\n          ? propertyRemove : typeof value === \"function\"\n          ? propertyFunction\n          : propertyConstant)(name, value))\n      : this.node()[name];\n}\n","function classArray(string) {\n  return string.trim().split(/^|\\s+/);\n}\n\nfunction classList(node) {\n  return node.classList || new ClassList(node);\n}\n\nfunction ClassList(node) {\n  this._node = node;\n  this._names = classArray(node.getAttribute(\"class\") || \"\");\n}\n\nClassList.prototype = {\n  add: function(name) {\n    var i = this._names.indexOf(name);\n    if (i < 0) {\n      this._names.push(name);\n      this._node.setAttribute(\"class\", this._names.join(\" \"));\n    }\n  },\n  remove: function(name) {\n    var i = this._names.indexOf(name);\n    if (i >= 0) {\n      this._names.splice(i, 1);\n      this._node.setAttribute(\"class\", this._names.join(\" \"));\n    }\n  },\n  contains: function(name) {\n    return this._names.indexOf(name) >= 0;\n  }\n};\n\nfunction classedAdd(node, names) {\n  var list = classList(node), i = -1, n = names.length;\n  while (++i < n) list.add(names[i]);\n}\n\nfunction classedRemove(node, names) {\n  var list = classList(node), i = -1, n = names.length;\n  while (++i < n) list.remove(names[i]);\n}\n\nfunction classedTrue(names) {\n  return function() {\n    classedAdd(this, names);\n  };\n}\n\nfunction classedFalse(names) {\n  return function() {\n    classedRemove(this, names);\n  };\n}\n\nfunction classedFunction(names, value) {\n  return function() {\n    (value.apply(this, arguments) ? classedAdd : classedRemove)(this, names);\n  };\n}\n\nexport default function(name, value) {\n  var names = classArray(name + \"\");\n\n  if (arguments.length < 2) {\n    var list = classList(this.node()), i = -1, n = names.length;\n    while (++i < n) if (!list.contains(names[i])) return false;\n    return true;\n  }\n\n  return this.each((typeof value === \"function\"\n      ? classedFunction : value\n      ? classedTrue\n      : classedFalse)(names, value));\n}\n","function textRemove() {\n  this.textContent = \"\";\n}\n\nfunction textConstant(value) {\n  return function() {\n    this.textContent = value;\n  };\n}\n\nfunction textFunction(value) {\n  return function() {\n    var v = value.apply(this, arguments);\n    this.textContent = v == null ? \"\" : v;\n  };\n}\n\nexport default function(value) {\n  return arguments.length\n      ? this.each(value == null\n          ? textRemove : (typeof value === \"function\"\n          ? textFunction\n          : textConstant)(value))\n      : this.node().textContent;\n}\n","function htmlRemove() {\n  this.innerHTML = \"\";\n}\n\nfunction htmlConstant(value) {\n  return function() {\n    this.innerHTML = value;\n  };\n}\n\nfunction htmlFunction(value) {\n  return function() {\n    var v = value.apply(this, arguments);\n    this.innerHTML = v == null ? \"\" : v;\n  };\n}\n\nexport default function(value) {\n  return arguments.length\n      ? this.each(value == null\n          ? htmlRemove : (typeof value === \"function\"\n          ? htmlFunction\n          : htmlConstant)(value))\n      : this.node().innerHTML;\n}\n","function raise() {\n  if (this.nextSibling) this.parentNode.appendChild(this);\n}\n\nexport default function() {\n  return this.each(raise);\n}\n","function lower() {\n  if (this.previousSibling) this.parentNode.insertBefore(this, this.parentNode.firstChild);\n}\n\nexport default function() {\n  return this.each(lower);\n}\n","import namespace from \"./namespace.js\";\nimport {xhtml} from \"./namespaces.js\";\n\nfunction creatorInherit(name) {\n  return function() {\n    var document = this.ownerDocument,\n        uri = this.namespaceURI;\n    return uri === xhtml && document.documentElement.namespaceURI === xhtml\n        ? document.createElement(name)\n        : document.createElementNS(uri, name);\n  };\n}\n\nfunction creatorFixed(fullname) {\n  return function() {\n    return this.ownerDocument.createElementNS(fullname.space, fullname.local);\n  };\n}\n\nexport default function(name) {\n  var fullname = namespace(name);\n  return (fullname.local\n      ? creatorFixed\n      : creatorInherit)(fullname);\n}\n","import creator from \"../creator.js\";\n\nexport default function(name) {\n  var create = typeof name === \"function\" ? name : creator(name);\n  return this.select(function() {\n    return this.appendChild(create.apply(this, arguments));\n  });\n}\n","import creator from \"../creator.js\";\nimport selector from \"../selector.js\";\n\nfunction constantNull() {\n  return null;\n}\n\nexport default function(name, before) {\n  var create = typeof name === \"function\" ? name : creator(name),\n      select = before == null ? constantNull : typeof before === \"function\" ? before : selector(before);\n  return this.select(function() {\n    return this.insertBefore(create.apply(this, arguments), select.apply(this, arguments) || null);\n  });\n}\n","function remove() {\n  var parent = this.parentNode;\n  if (parent) parent.removeChild(this);\n}\n\nexport default function() {\n  return this.each(remove);\n}\n","function selection_cloneShallow() {\n  var clone = this.cloneNode(false), parent = this.parentNode;\n  return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\nfunction selection_cloneDeep() {\n  var clone = this.cloneNode(true), parent = this.parentNode;\n  return parent ? parent.insertBefore(clone, this.nextSibling) : clone;\n}\n\nexport default function(deep) {\n  return this.select(deep ? selection_cloneDeep : selection_cloneShallow);\n}\n","export default function(value) {\n  return arguments.length\n      ? this.property(\"__data__\", value)\n      : this.node().__data__;\n}\n","function contextListener(listener) {\n  return function(event) {\n    listener.call(this, event, this.__data__);\n  };\n}\n\nfunction parseTypenames(typenames) {\n  return typenames.trim().split(/^|\\s+/).map(function(t) {\n    var name = \"\", i = t.indexOf(\".\");\n    if (i >= 0) name = t.slice(i + 1), t = t.slice(0, i);\n    return {type: t, name: name};\n  });\n}\n\nfunction onRemove(typename) {\n  return function() {\n    var on = this.__on;\n    if (!on) return;\n    for (var j = 0, i = -1, m = on.length, o; j < m; ++j) {\n      if (o = on[j], (!typename.type || o.type === typename.type) && o.name === typename.name) {\n        this.removeEventListener(o.type, o.listener, o.options);\n      } else {\n        on[++i] = o;\n      }\n    }\n    if (++i) on.length = i;\n    else delete this.__on;\n  };\n}\n\nfunction onAdd(typename, value, options) {\n  return function() {\n    var on = this.__on, o, listener = contextListener(value);\n    if (on) for (var j = 0, m = on.length; j < m; ++j) {\n      if ((o = on[j]).type === typename.type && o.name === typename.name) {\n        this.removeEventListener(o.type, o.listener, o.options);\n        this.addEventListener(o.type, o.listener = listener, o.options = options);\n        o.value = value;\n        return;\n      }\n    }\n    this.addEventListener(typename.type, listener, options);\n    o = {type: typename.type, name: typename.name, value: value, listener: listener, options: options};\n    if (!on) this.__on = [o];\n    else on.push(o);\n  };\n}\n\nexport default function(typename, value, options) {\n  var typenames = parseTypenames(typename + \"\"), i, n = typenames.length, t;\n\n  if (arguments.length < 2) {\n    var on = this.node().__on;\n    if (on) for (var j = 0, m = on.length, o; j < m; ++j) {\n      for (i = 0, o = on[j]; i < n; ++i) {\n        if ((t = typenames[i]).type === o.type && t.name === o.name) {\n          return o.value;\n        }\n      }\n    }\n    return;\n  }\n\n  on = value ? onAdd : onRemove;\n  for (i = 0; i < n; ++i) this.each(on(typenames[i], value, options));\n  return this;\n}\n","import defaultView from \"../window.js\";\n\nfunction dispatchEvent(node, type, params) {\n  var window = defaultView(node),\n      event = window.CustomEvent;\n\n  if (typeof event === \"function\") {\n    event = new event(type, params);\n  } else {\n    event = window.document.createEvent(\"Event\");\n    if (params) event.initEvent(type, params.bubbles, params.cancelable), event.detail = params.detail;\n    else event.initEvent(type, false, false);\n  }\n\n  node.dispatchEvent(event);\n}\n\nfunction dispatchConstant(type, params) {\n  return function() {\n    return dispatchEvent(this, type, params);\n  };\n}\n\nfunction dispatchFunction(type, params) {\n  return function() {\n    return dispatchEvent(this, type, params.apply(this, arguments));\n  };\n}\n\nexport default function(type, params) {\n  return this.each((typeof params === \"function\"\n      ? dispatchFunction\n      : dispatchConstant)(type, params));\n}\n","export default function*() {\n  for (var groups = this._groups, j = 0, m = groups.length; j < m; ++j) {\n    for (var group = groups[j], i = 0, n = group.length, node; i < n; ++i) {\n      if (node = group[i]) yield node;\n    }\n  }\n}\n","import selection_select from \"./select.js\";\nimport selection_selectAll from \"./selectAll.js\";\nimport selection_selectChild from \"./selectChild.js\";\nimport selection_selectChildren from \"./selectChildren.js\";\nimport selection_filter from \"./filter.js\";\nimport selection_data from \"./data.js\";\nimport selection_enter from \"./enter.js\";\nimport selection_exit from \"./exit.js\";\nimport selection_join from \"./join.js\";\nimport selection_merge from \"./merge.js\";\nimport selection_order from \"./order.js\";\nimport selection_sort from \"./sort.js\";\nimport selection_call from \"./call.js\";\nimport selection_nodes from \"./nodes.js\";\nimport selection_node from \"./node.js\";\nimport selection_size from \"./size.js\";\nimport selection_empty from \"./empty.js\";\nimport selection_each from \"./each.js\";\nimport selection_attr from \"./attr.js\";\nimport selection_style from \"./style.js\";\nimport selection_property from \"./property.js\";\nimport selection_classed from \"./classed.js\";\nimport selection_text from \"./text.js\";\nimport selection_html from \"./html.js\";\nimport selection_raise from \"./raise.js\";\nimport selection_lower from \"./lower.js\";\nimport selection_append from \"./append.js\";\nimport selection_insert from \"./insert.js\";\nimport selection_remove from \"./remove.js\";\nimport selection_clone from \"./clone.js\";\nimport selection_datum from \"./datum.js\";\nimport selection_on from \"./on.js\";\nimport selection_dispatch from \"./dispatch.js\";\nimport selection_iterator from \"./iterator.js\";\n\nexport var root = [null];\n\nexport function Selection(groups, parents) {\n  this._groups = groups;\n  this._parents = parents;\n}\n\nfunction selection() {\n  return new Selection([[document.documentElement]], root);\n}\n\nfunction selection_selection() {\n  return this;\n}\n\nSelection.prototype = selection.prototype = {\n  constructor: Selection,\n  select: selection_select,\n  selectAll: selection_selectAll,\n  selectChild: selection_selectChild,\n  selectChildren: selection_selectChildren,\n  filter: selection_filter,\n  data: selection_data,\n  enter: selection_enter,\n  exit: selection_exit,\n  join: selection_join,\n  merge: selection_merge,\n  selection: selection_selection,\n  order: selection_order,\n  sort: selection_sort,\n  call: selection_call,\n  nodes: selection_nodes,\n  node: selection_node,\n  size: selection_size,\n  empty: selection_empty,\n  each: selection_each,\n  attr: selection_attr,\n  style: selection_style,\n  property: selection_property,\n  classed: selection_classed,\n  text: selection_text,\n  html: selection_html,\n  raise: selection_raise,\n  lower: selection_lower,\n  append: selection_append,\n  insert: selection_insert,\n  remove: selection_remove,\n  clone: selection_clone,\n  datum: selection_datum,\n  on: selection_on,\n  dispatch: selection_dispatch,\n  [Symbol.iterator]: selection_iterator\n};\n\nexport default selection;\n","import {Selection, root} from \"./selection/index.js\";\n\nexport default function(selector) {\n  return typeof selector === \"string\"\n      ? new Selection([[document.querySelector(selector)]], [document.documentElement])\n      : new Selection([[selector]], root);\n}\n","function Linear(context) {\n  this._context = context;\n}\n\nLinear.prototype = {\n  areaStart: function() {\n    this._line = 0;\n  },\n  areaEnd: function() {\n    this._line = NaN;\n  },\n  lineStart: function() {\n    this._point = 0;\n  },\n  lineEnd: function() {\n    if (this._line || (this._line !== 0 && this._point === 1)) this._context.closePath();\n    this._line = 1 - this._line;\n  },\n  point: function(x, y) {\n    x = +x, y = +y;\n    switch (this._point) {\n      case 0: this._point = 1; this._line ? this._context.lineTo(x, y) : this._context.moveTo(x, y); break;\n      case 1: this._point = 2; // falls through\n      default: this._context.lineTo(x, y); break;\n    }\n  }\n};\n\nexport default function(context) {\n  return new Linear(context);\n}\n","export var slice = Array.prototype.slice;\n\nexport default function(x) {\n  return typeof x === \"object\" && \"length\" in x\n    ? x // Array, TypedArray, NodeList, array-like\n    : Array.from(x); // Map, Set, iterable, string, or anything else\n}\n","export default function(x) {\n  return function constant() {\n    return x;\n  };\n}\n","const pi = Math.PI,\n    tau = 2 * pi,\n    epsilon = 1e-6,\n    tauEpsilon = tau - epsilon;\n\nfunction append(strings) {\n  this._ += strings[0];\n  for (let i = 1, n = strings.length; i < n; ++i) {\n    this._ += arguments[i] + strings[i];\n  }\n}\n\nfunction appendRound(digits) {\n  let d = Math.floor(digits);\n  if (!(d >= 0)) throw new Error(`invalid digits: ${digits}`);\n  if (d > 15) return append;\n  const k = 10 ** d;\n  return function(strings) {\n    this._ += strings[0];\n    for (let i = 1, n = strings.length; i < n; ++i) {\n      this._ += Math.round(arguments[i] * k) / k + strings[i];\n    }\n  };\n}\n\nexport class Path {\n  constructor(digits) {\n    this._x0 = this._y0 = // start of current subpath\n    this._x1 = this._y1 = null; // end of current subpath\n    this._ = \"\";\n    this._append = digits == null ? append : appendRound(digits);\n  }\n  moveTo(x, y) {\n    this._append`M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}`;\n  }\n  closePath() {\n    if (this._x1 !== null) {\n      this._x1 = this._x0, this._y1 = this._y0;\n      this._append`Z`;\n    }\n  }\n  lineTo(x, y) {\n    this._append`L${this._x1 = +x},${this._y1 = +y}`;\n  }\n  quadraticCurveTo(x1, y1, x, y) {\n    this._append`Q${+x1},${+y1},${this._x1 = +x},${this._y1 = +y}`;\n  }\n  bezierCurveTo(x1, y1, x2, y2, x, y) {\n    this._append`C${+x1},${+y1},${+x2},${+y2},${this._x1 = +x},${this._y1 = +y}`;\n  }\n  arcTo(x1, y1, x2, y2, r) {\n    x1 = +x1, y1 = +y1, x2 = +x2, y2 = +y2, r = +r;\n\n    // Is the radius negative? Error.\n    if (r < 0) throw new Error(`negative radius: ${r}`);\n\n    let x0 = this._x1,\n        y0 = this._y1,\n        x21 = x2 - x1,\n        y21 = y2 - y1,\n        x01 = x0 - x1,\n        y01 = y0 - y1,\n        l01_2 = x01 * x01 + y01 * y01;\n\n    // Is this path empty? Move to (x1,y1).\n    if (this._x1 === null) {\n      this._append`M${this._x1 = x1},${this._y1 = y1}`;\n    }\n\n    // Or, is (x1,y1) coincident with (x0,y0)? Do nothing.\n    else if (!(l01_2 > epsilon));\n\n    // Or, are (x0,y0), (x1,y1) and (x2,y2) collinear?\n    // Equivalently, is (x1,y1) coincident with (x2,y2)?\n    // Or, is the radius zero? Line to (x1,y1).\n    else if (!(Math.abs(y01 * x21 - y21 * x01) > epsilon) || !r) {\n      this._append`L${this._x1 = x1},${this._y1 = y1}`;\n    }\n\n    // Otherwise, draw an arc!\n    else {\n      let x20 = x2 - x0,\n          y20 = y2 - y0,\n          l21_2 = x21 * x21 + y21 * y21,\n          l20_2 = x20 * x20 + y20 * y20,\n          l21 = Math.sqrt(l21_2),\n          l01 = Math.sqrt(l01_2),\n          l = r * Math.tan((pi - Math.acos((l21_2 + l01_2 - l20_2) / (2 * l21 * l01))) / 2),\n          t01 = l / l01,\n          t21 = l / l21;\n\n      // If the start tangent is not coincident with (x0,y0), line to.\n      if (Math.abs(t01 - 1) > epsilon) {\n        this._append`L${x1 + t01 * x01},${y1 + t01 * y01}`;\n      }\n\n      this._append`A${r},${r},0,0,${+(y01 * x20 > x01 * y20)},${this._x1 = x1 + t21 * x21},${this._y1 = y1 + t21 * y21}`;\n    }\n  }\n  arc(x, y, r, a0, a1, ccw) {\n    x = +x, y = +y, r = +r, ccw = !!ccw;\n\n    // Is the radius negative? Error.\n    if (r < 0) throw new Error(`negative radius: ${r}`);\n\n    let dx = r * Math.cos(a0),\n        dy = r * Math.sin(a0),\n        x0 = x + dx,\n        y0 = y + dy,\n        cw = 1 ^ ccw,\n        da = ccw ? a0 - a1 : a1 - a0;\n\n    // Is this path empty? Move to (x0,y0).\n    if (this._x1 === null) {\n      this._append`M${x0},${y0}`;\n    }\n\n    // Or, is (x0,y0) not coincident with the previous point? Line to (x0,y0).\n    else if (Math.abs(this._x1 - x0) > epsilon || Math.abs(this._y1 - y0) > epsilon) {\n      this._append`L${x0},${y0}`;\n    }\n\n    // Is this arc empty? We’re done.\n    if (!r) return;\n\n    // Does the angle go the wrong way? Flip the direction.\n    if (da < 0) da = da % tau + tau;\n\n    // Is this a complete circle? Draw two arcs to complete the circle.\n    if (da > tauEpsilon) {\n      this._append`A${r},${r},0,1,${cw},${x - dx},${y - dy}A${r},${r},0,1,${cw},${this._x1 = x0},${this._y1 = y0}`;\n    }\n\n    // Is this arc non-empty? Draw an arc!\n    else if (da > epsilon) {\n      this._append`A${r},${r},0,${+(da >= pi)},${cw},${this._x1 = x + r * Math.cos(a1)},${this._y1 = y + r * Math.sin(a1)}`;\n    }\n  }\n  rect(x, y, w, h) {\n    this._append`M${this._x0 = this._x1 = +x},${this._y0 = this._y1 = +y}h${w = +w}v${+h}h${-w}Z`;\n  }\n  toString() {\n    return this._;\n  }\n}\n\nexport function path() {\n  return new Path;\n}\n\n// Allow instanceof d3.path\npath.prototype = Path.prototype;\n\nexport function pathRound(digits = 3) {\n  return new Path(+digits);\n}\n","import {Path} from \"d3-path\";\n\nexport function withPath(shape) {\n  let digits = 3;\n\n  shape.digits = function(_) {\n    if (!arguments.length) return digits;\n    if (_ == null) {\n      digits = null;\n    } else {\n      const d = Math.floor(_);\n      if (!(d >= 0)) throw new RangeError(`invalid digits: ${_}`);\n      digits = d;\n    }\n    return shape;\n  };\n\n  return () => new Path(digits);\n}\n","export function x(p) {\n  return p[0];\n}\n\nexport function y(p) {\n  return p[1];\n}\n","import array from \"./array.js\";\nimport constant from \"./constant.js\";\nimport curveLinear from \"./curve/linear.js\";\nimport {withPath} from \"./path.js\";\nimport {x as pointX, y as pointY} from \"./point.js\";\n\nexport default function(x, y) {\n  var defined = constant(true),\n      context = null,\n      curve = curveLinear,\n      output = null,\n      path = withPath(line);\n\n  x = typeof x === \"function\" ? x : (x === undefined) ? pointX : constant(x);\n  y = typeof y === \"function\" ? y : (y === undefined) ? pointY : constant(y);\n\n  function line(data) {\n    var i,\n        n = (data = array(data)).length,\n        d,\n        defined0 = false,\n        buffer;\n\n    if (context == null) output = curve(buffer = path());\n\n    for (i = 0; i <= n; ++i) {\n      if (!(i < n && defined(d = data[i], i, data)) === defined0) {\n        if (defined0 = !defined0) output.lineStart();\n        else output.lineEnd();\n      }\n      if (defined0) output.point(+x(d, i, data), +y(d, i, data));\n    }\n\n    if (buffer) return output = null, buffer + \"\" || null;\n  }\n\n  line.x = function(_) {\n    return arguments.length ? (x = typeof _ === \"function\" ? _ : constant(+_), line) : x;\n  };\n\n  line.y = function(_) {\n    return arguments.length ? (y = typeof _ === \"function\" ? _ : constant(+_), line) : y;\n  };\n\n  line.defined = function(_) {\n    return arguments.length ? (defined = typeof _ === \"function\" ? _ : constant(!!_), line) : defined;\n  };\n\n  line.curve = function(_) {\n    return arguments.length ? (curve = _, context != null && (output = curve(context)), line) : curve;\n  };\n\n  line.context = function(_) {\n    return arguments.length ? (_ == null ? context = output = null : output = curve(context = _), line) : context;\n  };\n\n  return line;\n}\n","function ownKeys(object, enumerableOnly) {\n  var keys = Object.keys(object);\n\n  if (Object.getOwnPropertySymbols) {\n    var symbols = Object.getOwnPropertySymbols(object);\n\n    if (enumerableOnly) {\n      symbols = symbols.filter(function (sym) {\n        return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n      });\n    }\n\n    keys.push.apply(keys, symbols);\n  }\n\n  return keys;\n}\n\nfunction _objectSpread2(target) {\n  for (var i = 1; i < arguments.length; i++) {\n    var source = arguments[i] != null ? arguments[i] : {};\n\n    if (i % 2) {\n      ownKeys(Object(source), true).forEach(function (key) {\n        _defineProperty(target, key, source[key]);\n      });\n    } else if (Object.getOwnPropertyDescriptors) {\n      Object.defineProperties(target, Object.getOwnPropertyDescriptors(source));\n    } else {\n      ownKeys(Object(source)).forEach(function (key) {\n        Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n      });\n    }\n  }\n\n  return target;\n}\n\nfunction _typeof(obj) {\n  \"@babel/helpers - typeof\";\n\n  if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") {\n    _typeof = function (obj) {\n      return typeof obj;\n    };\n  } else {\n    _typeof = function (obj) {\n      return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj;\n    };\n  }\n\n  return _typeof(obj);\n}\n\nfunction _defineProperty(obj, key, value) {\n  if (key in obj) {\n    Object.defineProperty(obj, key, {\n      value: value,\n      enumerable: true,\n      configurable: true,\n      writable: true\n    });\n  } else {\n    obj[key] = value;\n  }\n\n  return obj;\n}\n\nfunction _extends() {\n  _extends = Object.assign || function (target) {\n    for (var i = 1; i < arguments.length; i++) {\n      var source = arguments[i];\n\n      for (var key in source) {\n        if (Object.prototype.hasOwnProperty.call(source, key)) {\n          target[key] = source[key];\n        }\n      }\n    }\n\n    return target;\n  };\n\n  return _extends.apply(this, arguments);\n}\n\nfunction _unsupportedIterableToArray(o, minLen) {\n  if (!o) return;\n  if (typeof o === \"string\") return _arrayLikeToArray(o, minLen);\n  var n = Object.prototype.toString.call(o).slice(8, -1);\n  if (n === \"Object\" && o.constructor) n = o.constructor.name;\n  if (n === \"Map\" || n === \"Set\") return Array.from(o);\n  if (n === \"Arguments\" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen);\n}\n\nfunction _arrayLikeToArray(arr, len) {\n  if (len == null || len > arr.length) len = arr.length;\n\n  for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i];\n\n  return arr2;\n}\n\nfunction _createForOfIteratorHelper(o, allowArrayLike) {\n  var it = typeof Symbol !== \"undefined\" && o[Symbol.iterator] || o[\"@@iterator\"];\n\n  if (!it) {\n    if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === \"number\") {\n      if (it) o = it;\n      var i = 0;\n\n      var F = function () {};\n\n      return {\n        s: F,\n        n: function () {\n          if (i >= o.length) return {\n            done: true\n          };\n          return {\n            done: false,\n            value: o[i++]\n          };\n        },\n        e: function (e) {\n          throw e;\n        },\n        f: F\n      };\n    }\n\n    throw new TypeError(\"Invalid attempt to iterate non-iterable instance.\\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.\");\n  }\n\n  var normalCompletion = true,\n      didErr = false,\n      err;\n  return {\n    s: function () {\n      it = it.call(o);\n    },\n    n: function () {\n      var step = it.next();\n      normalCompletion = step.done;\n      return step;\n    },\n    e: function (e) {\n      didErr = true;\n      err = e;\n    },\n    f: function () {\n      try {\n        if (!normalCompletion && it.return != null) it.return();\n      } finally {\n        if (didErr) throw err;\n      }\n    }\n  };\n}\n\n/**\n * de Casteljau's algorithm for drawing and splitting bezier curves.\n * Inspired by https://pomax.github.io/bezierinfo/\n *\n * @param {Number[][]} points Array of [x,y] points: [start, control1, control2, ..., end]\n *   The original segment to split.\n * @param {Number} t Where to split the curve (value between [0, 1])\n * @return {Object} An object { left, right } where left is the segment from 0..t and\n *   right is the segment from t..1.\n */\nfunction decasteljau(points, t) {\n  var left = [];\n  var right = [];\n\n  function decasteljauRecurse(points, t) {\n    if (points.length === 1) {\n      left.push(points[0]);\n      right.push(points[0]);\n    } else {\n      var newPoints = Array(points.length - 1);\n\n      for (var i = 0; i < newPoints.length; i++) {\n        if (i === 0) {\n          left.push(points[0]);\n        }\n\n        if (i === newPoints.length - 1) {\n          right.push(points[i + 1]);\n        }\n\n        newPoints[i] = [(1 - t) * points[i][0] + t * points[i + 1][0], (1 - t) * points[i][1] + t * points[i + 1][1]];\n      }\n\n      decasteljauRecurse(newPoints, t);\n    }\n  }\n\n  if (points.length) {\n    decasteljauRecurse(points, t);\n  }\n\n  return {\n    left: left,\n    right: right.reverse()\n  };\n}\n/**\n * Convert segments represented as points back into a command object\n *\n * @param {Number[][]} points Array of [x,y] points: [start, control1, control2, ..., end]\n *   Represents a segment\n * @return {Object} A command object representing the segment.\n */\n\n\nfunction pointsToCommand(points) {\n  var command = {};\n\n  if (points.length === 4) {\n    command.x2 = points[2][0];\n    command.y2 = points[2][1];\n  }\n\n  if (points.length >= 3) {\n    command.x1 = points[1][0];\n    command.y1 = points[1][1];\n  }\n\n  command.x = points[points.length - 1][0];\n  command.y = points[points.length - 1][1];\n\n  if (points.length === 4) {\n    // start, control1, control2, end\n    command.type = 'C';\n  } else if (points.length === 3) {\n    // start, control, end\n    command.type = 'Q';\n  } else {\n    // start, end\n    command.type = 'L';\n  }\n\n  return command;\n}\n/**\n * Runs de Casteljau's algorithm enough times to produce the desired number of segments.\n *\n * @param {Number[][]} points Array of [x,y] points for de Casteljau (the initial segment to split)\n * @param {Number} segmentCount Number of segments to split the original into\n * @return {Number[][][]} Array of segments\n */\n\n\nfunction splitCurveAsPoints(points, segmentCount) {\n  segmentCount = segmentCount || 2;\n  var segments = [];\n  var remainingCurve = points;\n  var tIncrement = 1 / segmentCount; // x-----x-----x-----x\n  // t=  0.33   0.66   1\n  // x-----o-----------x\n  // r=  0.33\n  //       x-----o-----x\n  // r=         0.5  (0.33 / (1 - 0.33))  === tIncrement / (1 - (tIncrement * (i - 1))\n  // x-----x-----x-----x----x\n  // t=  0.25   0.5   0.75  1\n  // x-----o----------------x\n  // r=  0.25\n  //       x-----o----------x\n  // r=         0.33  (0.25 / (1 - 0.25))\n  //             x-----o----x\n  // r=         0.5  (0.25 / (1 - 0.5))\n\n  for (var i = 0; i < segmentCount - 1; i++) {\n    var tRelative = tIncrement / (1 - tIncrement * i);\n    var split = decasteljau(remainingCurve, tRelative);\n    segments.push(split.left);\n    remainingCurve = split.right;\n  } // last segment is just to the end from the last point\n\n\n  segments.push(remainingCurve);\n  return segments;\n}\n/**\n * Convert command objects to arrays of points, run de Casteljau's algorithm on it\n * to split into to the desired number of segments.\n *\n * @param {Object} commandStart The start command object\n * @param {Object} commandEnd The end command object\n * @param {Number} segmentCount The number of segments to create\n * @return {Object[]} An array of commands representing the segments in sequence\n */\n\n\nfunction splitCurve(commandStart, commandEnd, segmentCount) {\n  var points = [[commandStart.x, commandStart.y]];\n\n  if (commandEnd.x1 != null) {\n    points.push([commandEnd.x1, commandEnd.y1]);\n  }\n\n  if (commandEnd.x2 != null) {\n    points.push([commandEnd.x2, commandEnd.y2]);\n  }\n\n  points.push([commandEnd.x, commandEnd.y]);\n  return splitCurveAsPoints(points, segmentCount).map(pointsToCommand);\n}\n\nvar commandTokenRegex = /[MLCSTQAHVZmlcstqahv]|-?[\\d.e+-]+/g;\n/**\n * List of params for each command type in a path `d` attribute\n */\n\nvar typeMap = {\n  M: ['x', 'y'],\n  L: ['x', 'y'],\n  H: ['x'],\n  V: ['y'],\n  C: ['x1', 'y1', 'x2', 'y2', 'x', 'y'],\n  S: ['x2', 'y2', 'x', 'y'],\n  Q: ['x1', 'y1', 'x', 'y'],\n  T: ['x', 'y'],\n  A: ['rx', 'ry', 'xAxisRotation', 'largeArcFlag', 'sweepFlag', 'x', 'y'],\n  Z: []\n}; // Add lower case entries too matching uppercase (e.g. 'm' == 'M')\n\nObject.keys(typeMap).forEach(function (key) {\n  typeMap[key.toLowerCase()] = typeMap[key];\n});\n\nfunction arrayOfLength(length, value) {\n  var array = Array(length);\n\n  for (var i = 0; i < length; i++) {\n    array[i] = value;\n  }\n\n  return array;\n}\n/**\n * Converts a command object to a string to be used in a `d` attribute\n * @param {Object} command A command object\n * @return {String} The string for the `d` attribute\n */\n\n\nfunction commandToString(command) {\n  return \"\".concat(command.type).concat(typeMap[command.type].map(function (p) {\n    return command[p];\n  }).join(','));\n}\n/**\n * Converts command A to have the same type as command B.\n *\n * e.g., L0,5 -> C0,5,0,5,0,5\n *\n * Uses these rules:\n * x1 <- x\n * x2 <- x\n * y1 <- y\n * y2 <- y\n * rx <- 0\n * ry <- 0\n * xAxisRotation <- read from B\n * largeArcFlag <- read from B\n * sweepflag <- read from B\n *\n * @param {Object} aCommand Command object from path `d` attribute\n * @param {Object} bCommand Command object from path `d` attribute to match against\n * @return {Object} aCommand converted to type of bCommand\n */\n\n\nfunction convertToSameType(aCommand, bCommand) {\n  var conversionMap = {\n    x1: 'x',\n    y1: 'y',\n    x2: 'x',\n    y2: 'y'\n  };\n  var readFromBKeys = ['xAxisRotation', 'largeArcFlag', 'sweepFlag']; // convert (but ignore M types)\n\n  if (aCommand.type !== bCommand.type && bCommand.type.toUpperCase() !== 'M') {\n    var aConverted = {};\n    Object.keys(bCommand).forEach(function (bKey) {\n      var bValue = bCommand[bKey]; // first read from the A command\n\n      var aValue = aCommand[bKey]; // if it is one of these values, read from B no matter what\n\n      if (aValue === undefined) {\n        if (readFromBKeys.includes(bKey)) {\n          aValue = bValue;\n        } else {\n          // if it wasn't in the A command, see if an equivalent was\n          if (aValue === undefined && conversionMap[bKey]) {\n            aValue = aCommand[conversionMap[bKey]];\n          } // if it doesn't have a converted value, use 0\n\n\n          if (aValue === undefined) {\n            aValue = 0;\n          }\n        }\n      }\n\n      aConverted[bKey] = aValue;\n    }); // update the type to match B\n\n    aConverted.type = bCommand.type;\n    aCommand = aConverted;\n  }\n\n  return aCommand;\n}\n/**\n * Interpolate between command objects commandStart and commandEnd segmentCount times.\n * If the types are L, Q, or C then the curves are split as per de Casteljau's algorithm.\n * Otherwise we just copy commandStart segmentCount - 1 times, finally ending with commandEnd.\n *\n * @param {Object} commandStart Command object at the beginning of the segment\n * @param {Object} commandEnd Command object at the end of the segment\n * @param {Number} segmentCount The number of segments to split this into. If only 1\n *   Then [commandEnd] is returned.\n * @return {Object[]} Array of ~segmentCount command objects between commandStart and\n *   commandEnd. (Can be segmentCount+1 objects if commandStart is type M).\n */\n\n\nfunction splitSegment(commandStart, commandEnd, segmentCount) {\n  var segments = []; // line, quadratic bezier, or cubic bezier\n\n  if (commandEnd.type === 'L' || commandEnd.type === 'Q' || commandEnd.type === 'C') {\n    segments = segments.concat(splitCurve(commandStart, commandEnd, segmentCount)); // general case - just copy the same point\n  } else {\n    var copyCommand = _extends({}, commandStart); // convert M to L\n\n\n    if (copyCommand.type === 'M') {\n      copyCommand.type = 'L';\n    }\n\n    segments = segments.concat(arrayOfLength(segmentCount - 1).map(function () {\n      return copyCommand;\n    }));\n    segments.push(commandEnd);\n  }\n\n  return segments;\n}\n/**\n * Extends an array of commandsToExtend to the length of the referenceCommands by\n * splitting segments until the number of commands match. Ensures all the actual\n * points of commandsToExtend are in the extended array.\n *\n * @param {Object[]} commandsToExtend The command object array to extend\n * @param {Object[]} referenceCommands The command object array to match in length\n * @param {Function} excludeSegment a function that takes a start command object and\n *   end command object and returns true if the segment should be excluded from splitting.\n * @return {Object[]} The extended commandsToExtend array\n */\n\n\nfunction extend(commandsToExtend, referenceCommands, excludeSegment) {\n  // compute insertion points:\n  // number of segments in the path to extend\n  var numSegmentsToExtend = commandsToExtend.length - 1; // number of segments in the reference path.\n\n  var numReferenceSegments = referenceCommands.length - 1; // this value is always between [0, 1].\n\n  var segmentRatio = numSegmentsToExtend / numReferenceSegments; // create a map, mapping segments in referenceCommands to how many points\n  // should be added in that segment (should always be >= 1 since we need each\n  // point itself).\n  // 0 = segment 0-1, 1 = segment 1-2, n-1 = last vertex\n\n  var countPointsPerSegment = arrayOfLength(numReferenceSegments).reduce(function (accum, d, i) {\n    var insertIndex = Math.floor(segmentRatio * i); // handle excluding segments\n\n    if (excludeSegment && insertIndex < commandsToExtend.length - 1 && excludeSegment(commandsToExtend[insertIndex], commandsToExtend[insertIndex + 1])) {\n      // set the insertIndex to the segment that this point should be added to:\n      // round the insertIndex essentially so we split half and half on\n      // neighbouring segments. hence the segmentRatio * i < 0.5\n      var addToPriorSegment = segmentRatio * i % 1 < 0.5; // only skip segment if we already have 1 point in it (can't entirely remove a segment)\n\n      if (accum[insertIndex]) {\n        // TODO - Note this is a naive algorithm that should work for most d3-area use cases\n        // but if two adjacent segments are supposed to be skipped, this will not perform as\n        // expected. Could be updated to search for nearest segment to place the point in, but\n        // will only do that if necessary.\n        // add to the prior segment\n        if (addToPriorSegment) {\n          if (insertIndex > 0) {\n            insertIndex -= 1; // not possible to add to previous so adding to next\n          } else if (insertIndex < commandsToExtend.length - 1) {\n            insertIndex += 1;\n          } // add to next segment\n\n        } else if (insertIndex < commandsToExtend.length - 1) {\n          insertIndex += 1; // not possible to add to next so adding to previous\n        } else if (insertIndex > 0) {\n          insertIndex -= 1;\n        }\n      }\n    }\n\n    accum[insertIndex] = (accum[insertIndex] || 0) + 1;\n    return accum;\n  }, []); // extend each segment to have the correct number of points for a smooth interpolation\n\n  var extended = countPointsPerSegment.reduce(function (extended, segmentCount, i) {\n    // if last command, just add `segmentCount` number of times\n    if (i === commandsToExtend.length - 1) {\n      var lastCommandCopies = arrayOfLength(segmentCount, _extends({}, commandsToExtend[commandsToExtend.length - 1])); // convert M to L\n\n      if (lastCommandCopies[0].type === 'M') {\n        lastCommandCopies.forEach(function (d) {\n          d.type = 'L';\n        });\n      }\n\n      return extended.concat(lastCommandCopies);\n    } // otherwise, split the segment segmentCount times.\n\n\n    return extended.concat(splitSegment(commandsToExtend[i], commandsToExtend[i + 1], segmentCount));\n  }, []); // add in the very first point since splitSegment only adds in the ones after it\n\n  extended.unshift(commandsToExtend[0]);\n  return extended;\n}\n/**\n * Takes a path `d` string and converts it into an array of command\n * objects. Drops the `Z` character.\n *\n * @param {String|null} d A path `d` string\n */\n\n\nfunction pathCommandsFromString(d) {\n  // split into valid tokens\n  var tokens = (d || '').match(commandTokenRegex) || [];\n  var commands = [];\n  var commandArgs;\n  var command; // iterate over each token, checking if we are at a new command\n  // by presence in the typeMap\n\n  for (var i = 0; i < tokens.length; ++i) {\n    commandArgs = typeMap[tokens[i]]; // new command found:\n\n    if (commandArgs) {\n      command = {\n        type: tokens[i]\n      }; // add each of the expected args for this command:\n\n      for (var a = 0; a < commandArgs.length; ++a) {\n        command[commandArgs[a]] = +tokens[i + a + 1];\n      } // need to increment our token index appropriately since\n      // we consumed token args\n\n\n      i += commandArgs.length;\n      commands.push(command);\n    }\n  }\n\n  return commands;\n}\n/**\n * Interpolate from A to B by extending A and B during interpolation to have\n * the same number of points. This allows for a smooth transition when they\n * have a different number of points.\n *\n * Ignores the `Z` command in paths unless both A and B end with it.\n *\n * This function works directly with arrays of command objects instead of with\n * path `d` strings (see interpolatePath for working with `d` strings).\n *\n * @param {Object[]} aCommandsInput Array of path commands\n * @param {Object[]} bCommandsInput Array of path commands\n * @param {(Function|Object)} interpolateOptions\n * @param {Function} interpolateOptions.excludeSegment a function that takes a start command object and\n *   end command object and returns true if the segment should be excluded from splitting.\n * @param {Boolean} interpolateOptions.snapEndsToInput a boolean indicating whether end of input should\n *   be sourced from input argument or computed.\n * @returns {Function} Interpolation function that maps t ([0, 1]) to an array of path commands.\n */\n\nfunction interpolatePathCommands(aCommandsInput, bCommandsInput, interpolateOptions) {\n  // make a copy so we don't mess with the input arrays\n  var aCommands = aCommandsInput == null ? [] : aCommandsInput.slice();\n  var bCommands = bCommandsInput == null ? [] : bCommandsInput.slice();\n\n  var _ref = _typeof(interpolateOptions) === 'object' ? interpolateOptions : {\n    excludeSegment: interpolateOptions,\n    snapEndsToInput: true\n  },\n      excludeSegment = _ref.excludeSegment,\n      snapEndsToInput = _ref.snapEndsToInput; // both input sets are empty, so we don't interpolate\n\n\n  if (!aCommands.length && !bCommands.length) {\n    return function nullInterpolator() {\n      return [];\n    };\n  } // do we add Z during interpolation? yes if both have it. (we'd expect both to have it or not)\n\n\n  var addZ = (aCommands.length === 0 || aCommands[aCommands.length - 1].type === 'Z') && (bCommands.length === 0 || bCommands[bCommands.length - 1].type === 'Z'); // we temporarily remove Z\n\n  if (aCommands.length > 0 && aCommands[aCommands.length - 1].type === 'Z') {\n    aCommands.pop();\n  }\n\n  if (bCommands.length > 0 && bCommands[bCommands.length - 1].type === 'Z') {\n    bCommands.pop();\n  } // if A is empty, treat it as if it used to contain just the first point\n  // of B. This makes it so the line extends out of from that first point.\n\n\n  if (!aCommands.length) {\n    aCommands.push(bCommands[0]); // otherwise if B is empty, treat it as if it contains the first point\n    // of A. This makes it so the line retracts into the first point.\n  } else if (!bCommands.length) {\n    bCommands.push(aCommands[0]);\n  } // extend to match equal size\n\n\n  var numPointsToExtend = Math.abs(bCommands.length - aCommands.length);\n\n  if (numPointsToExtend !== 0) {\n    // B has more points than A, so add points to A before interpolating\n    if (bCommands.length > aCommands.length) {\n      aCommands = extend(aCommands, bCommands, excludeSegment); // else if A has more points than B, add more points to B\n    } else if (bCommands.length < aCommands.length) {\n      bCommands = extend(bCommands, aCommands, excludeSegment);\n    }\n  } // commands have same length now.\n  // convert commands in A to the same type as those in B\n\n\n  aCommands = aCommands.map(function (aCommand, i) {\n    return convertToSameType(aCommand, bCommands[i]);\n  }); // create mutable interpolated command objects\n\n  var interpolatedCommands = aCommands.map(function (aCommand) {\n    return _objectSpread2({}, aCommand);\n  });\n\n  if (addZ) {\n    interpolatedCommands.push({\n      type: 'Z'\n    });\n    aCommands.push({\n      type: 'Z'\n    }); // required for when returning at t == 0\n  }\n\n  return function pathCommandInterpolator(t) {\n    // at 1 return the final value without the extensions used during interpolation\n    if (t === 1 && snapEndsToInput) {\n      return bCommandsInput == null ? [] : bCommandsInput;\n    } // work with aCommands directly since interpolatedCommands are mutated\n\n\n    if (t === 0) {\n      return aCommands;\n    } // interpolate the commands using the mutable interpolated command objs\n\n\n    for (var i = 0; i < interpolatedCommands.length; ++i) {\n      // if (interpolatedCommands[i].type === 'Z') continue;\n      var aCommand = aCommands[i];\n      var bCommand = bCommands[i];\n      var interpolatedCommand = interpolatedCommands[i];\n\n      var _iterator = _createForOfIteratorHelper(typeMap[interpolatedCommand.type]),\n          _step;\n\n      try {\n        for (_iterator.s(); !(_step = _iterator.n()).done;) {\n          var arg = _step.value;\n          interpolatedCommand[arg] = (1 - t) * aCommand[arg] + t * bCommand[arg]; // do not use floats for flags (#27), round to integer\n\n          if (arg === 'largeArcFlag' || arg === 'sweepFlag') {\n            interpolatedCommand[arg] = Math.round(interpolatedCommand[arg]);\n          }\n        }\n      } catch (err) {\n        _iterator.e(err);\n      } finally {\n        _iterator.f();\n      }\n    }\n\n    return interpolatedCommands;\n  };\n}\n/** @typedef InterpolateOptions  */\n\n/**\n * Interpolate from A to B by extending A and B during interpolation to have\n * the same number of points. This allows for a smooth transition when they\n * have a different number of points.\n *\n * Ignores the `Z` character in paths unless both A and B end with it.\n *\n * @param {String} a The `d` attribute for a path\n * @param {String} b The `d` attribute for a path\n * @param {((command1, command2) => boolean|{\n *   excludeSegment?: (command1, command2) => boolean;\n *   snapEndsToInput?: boolean\n * })} interpolateOptions The excludeSegment function or an options object\n *    - interpolateOptions.excludeSegment a function that takes a start command object and\n *      end command object and returns true if the segment should be excluded from splitting.\n *    - interpolateOptions.snapEndsToInput a boolean indicating whether end of input should\n *      be sourced from input argument or computed.\n * @returns {Function} Interpolation function that maps t ([0, 1]) to a path `d` string.\n */\n\nfunction interpolatePath(a, b, interpolateOptions) {\n  var aCommands = pathCommandsFromString(a);\n  var bCommands = pathCommandsFromString(b);\n\n  var _ref2 = _typeof(interpolateOptions) === 'object' ? interpolateOptions : {\n    excludeSegment: interpolateOptions,\n    snapEndsToInput: true\n  },\n      excludeSegment = _ref2.excludeSegment,\n      snapEndsToInput = _ref2.snapEndsToInput;\n\n  if (!aCommands.length && !bCommands.length) {\n    return function nullInterpolator() {\n      return '';\n    };\n  }\n\n  var commandInterpolator = interpolatePathCommands(aCommands, bCommands, {\n    excludeSegment: excludeSegment,\n    snapEndsToInput: snapEndsToInput\n  });\n  return function pathStringInterpolator(t) {\n    // at 1 return the final value without the extensions used during interpolation\n    if (t === 1 && snapEndsToInput) {\n      return b == null ? '' : b;\n    }\n\n    var interpolatedCommands = commandInterpolator(t); // convert to a string (fastest concat: https://jsperf.com/join-concat/150)\n\n    var interpolatedString = '';\n\n    var _iterator2 = _createForOfIteratorHelper(interpolatedCommands),\n        _step2;\n\n    try {\n      for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {\n        var interpolatedCommand = _step2.value;\n        interpolatedString += commandToString(interpolatedCommand);\n      }\n    } catch (err) {\n      _iterator2.e(err);\n    } finally {\n      _iterator2.f();\n    }\n\n    return interpolatedString;\n  };\n}\n\nexport { interpolatePath, interpolatePathCommands, pathCommandsFromString };\n","import { extent } from 'd3-array';\nimport { select } from 'd3-selection';\nimport { curveLinear, line as d3Line } from 'd3-shape';\nimport { interpolatePath } from 'd3-interpolate-path'; // only needed if using transitions\n\n// used to generate IDs for clip paths\nlet counter = 0;\n\n/**\n * Renders line with potential gaps in the data by styling the gaps differently\n * from the defined areas. Single points are rendered as circles. Transitions are\n * supported.\n */\nexport default function render() {\n  const defaultLineAttrs = {\n    fill: 'none',\n    stroke: '#222',\n    'stroke-width': 1.5,\n    'stroke-opacity': 1,\n  };\n  const defaultGapAttrs = {\n    'stroke-dasharray': '2 2',\n    'stroke-opacity': 0.35,\n  };\n  const defaultPointAttrs = {\n    // read fill and r at render time in case the lineAttrs changed\n    // fill: defaultLineAttrs.stroke,\n    // r: defaultLineAttrs['stroke-width'],\n  };\n\n  const lineChunkName = 'line';\n  const gapChunkName = 'gap';\n\n  /**\n   * How to access the x attribute of `d`\n   */\n  let x = (d) => d[0];\n\n  /**\n   * How to access the y attribute of `d`\n   */\n  let y = (d) => d[1];\n\n  /**\n   * Function to determine if there is data for a given point.\n   * @param {Any} d data point\n   * @return {Boolean} true if the data is defined for the point, false otherwise\n   */\n  let defined = () => true;\n\n  /**\n   * Function to determine if there a point follows the previous. This functions\n   * enables detecting gaps in the data when there is an unexpected jump. For\n   * instance, if you have time data for every day and the previous data point\n   * is for January 5, 2016 and the current data point is for January 12, 2016,\n   * then there is data missing for January 6-11, so this function would return\n   * true.\n   *\n   * It is only necessary to define this if your data doesn't explicitly include\n   * gaps in it.\n   *\n   * @param {Any} previousDatum The previous data point\n   * @param {Any} currentDatum The data point under consideration\n   * @return {Boolean} true If the data is defined for the point, false otherwise\n   */\n  let isNext = () => true;\n\n  /**\n   * Function to determine which chunk this data is within.\n   *\n   * @param {Any} d data point\n   * @param {Any[]} data the full dataset\n   * @return {String} The id of the chunk. Defaults to \"line\"\n   */\n  let chunk = () => lineChunkName;\n\n  /**\n   * Decides what line the chunk should be in when given two defined points\n   * in different chunks. Uses the order provided by the keys of chunkDefinition\n   * if not specified, with `line` and `gap` prepended to the list if not\n   * in the chunkDefinition object.\n   *\n   * @param {String} chunkNameLeft The name of the chunk for the point on the left\n   * @param {String} chunkNameRight The name of the chunk for the point on the right\n   * @param {String[]} chunkNames the ordered list of chunk names from chunkDefinitions\n   * @return {String} The name of the chunk to assign the line segment between the two points to.\n   */\n  let chunkLineResolver = function defaultChunkLineResolver(\n    chunkNameLeft,\n    chunkNameRight,\n    chunkNames\n  ) {\n    const leftIndex = chunkNames.indexOf(chunkNameLeft);\n    const rightIndex = chunkNames.indexOf(chunkNameRight);\n\n    return leftIndex > rightIndex ? chunkNameLeft : chunkNameRight;\n  };\n\n  /**\n   * Object specifying how to set style and attributes for each chunk.\n   * Format is an object:\n   *\n   * {\n   *   chunkName1: {\n   *     styles: {},\n   *     attrs: {},\n   *     pointStyles: {},\n   *     pointAttrs: {},\n   *   },\n   *   ...\n   * }\n   */\n  let chunkDefinitions = {};\n\n  /**\n   * Passed through to d3.line().curve. Default value: d3.curveLinear.\n   */\n  let curve = curveLinear;\n\n  /**\n   * Object mapping style keys to style values to be applied to both\n   * defined and undefined lines. Uses syntax similar to d3-selection-multi.\n   */\n  let lineStyles = {};\n\n  /**\n   * Object mapping attr keys to attr values to be applied to both\n   * defined and undefined lines. Uses syntax similar to d3-selection-multi.\n   */\n  let lineAttrs = defaultLineAttrs;\n\n  /**\n   * Object mapping style keys to style values to be applied only to the\n   * undefined lines. It overrides values provided in lineStyles. Uses\n   * syntax similar to d3-selection-multi.\n   */\n  let gapStyles = {};\n\n  /**\n   * Object mapping attr keys to attr values to be applied only to the\n   * undefined lines. It overrides values provided in lineAttrs. Uses\n   * syntax similar to d3-selection-multi.\n   */\n  let gapAttrs = defaultGapAttrs;\n\n  /**\n   * Object mapping style keys to style values to be applied to points.\n   * Uses syntax similar to d3-selection-multi.\n   */\n  let pointStyles = {};\n\n  /**\n   * Object mapping attr keys to attr values to be applied to points.\n   * Note that if fill is not defined in pointStyles or pointAttrs, it\n   * will be read from the stroke color on the line itself.\n   * Uses syntax similar to d3-selection-multi.\n   */\n  let pointAttrs = defaultPointAttrs;\n\n  /**\n   * Flag to set whether to transition on initial render or not. If true,\n   * the line starts out flat and transitions in its y value. If false,\n   * it just immediately renders.\n   */\n  let transitionInitial = true;\n\n  /**\n   * An array `[xMin, xMax]` specifying the minimum and maximum x pixel values\n   * (e.g., `xScale.range()`). If defined, the undefined line will extend to\n   * the the values provided, otherwise it will end at the last defined points.\n   */\n  let extendEnds;\n\n  /**\n   * Function to determine how to access the line data array from the passed in data\n   * Defaults to the identity data => data.\n   * @param {Any} data line dataset\n   * @return {Array} The array of data points for that given line\n   */\n  let accessData = (data) => data;\n\n  /**\n   * A flag specifying whether to render in debug mode or not.\n   */\n  let debug = false;\n\n  /**\n   * Logs warnings if the chunk definitions uses 'style' or 'attr' instead of\n   * 'styles' or 'attrs'\n   */\n  function validateChunkDefinitions() {\n    Object.keys(chunkDefinitions).forEach((key) => {\n      const def = chunkDefinitions[key];\n      if (def.style != null) {\n        console.warn(\n          `Warning: chunkDefinitions expects \"styles\", but found \"style\" in ${key}`,\n          def\n        );\n      }\n      if (def.attr != null) {\n        console.warn(\n          `Warning: chunkDefinitions expects \"attrs\", but found \"attr\" in ${key}`,\n          def\n        );\n      }\n      if (def.pointStyle != null) {\n        console.warn(\n          `Warning: chunkDefinitions expects \"pointStyles\", but found \"pointStyle\" in ${key}`,\n          def\n        );\n      }\n      if (def.pointAttr != null) {\n        console.warn(\n          `Warning: chunkDefinitions expects \"pointAttrs\", but found \"pointAttr\" in ${key}`,\n          def\n        );\n      }\n    });\n  }\n\n  /**\n   * Helper to get the chunk names that are defined. Prepends\n   * line, gap to the start of the array unless useChunkDefOrder\n   * is specified. In this case, it only prepends if they are\n   * not specified in the chunk definitions.\n   */\n  function getChunkNames(useChunkDefOrder) {\n    const chunkDefNames = Object.keys(chunkDefinitions);\n    let prependLine = true;\n    let prependGap = true;\n\n    // if using chunk definition order, only prepend line/gap if they aren't in the\n    // chunk definition.\n    if (useChunkDefOrder) {\n      prependLine = !chunkDefNames.includes(lineChunkName);\n      prependGap = !chunkDefNames.includes(gapChunkName);\n    }\n\n    if (prependGap) {\n      chunkDefNames.unshift(gapChunkName);\n    }\n\n    if (prependLine) {\n      chunkDefNames.unshift(lineChunkName);\n    }\n\n    // remove duplicates and return\n    return chunkDefNames.filter((d, i, a) => a.indexOf(d) === i);\n  }\n\n  /**\n   * Helper function to compute the contiguous segments of the data\n   * @param {String} chunkName the chunk name to match. points not matching are removed.\n   *   if undefined, uses 'line'.\n   * @param {Array} definedSegments An array of segments (subarrays) of the defined line data (output from\n   *   computeDefinedSegments)\n   * @return {Array} An array of segments (subarrays) of the chunk line data\n   */\n  function computeChunkedSegments(chunkName, definedSegments) {\n    // helper to split a segment into sub-segments based on the chunk name\n    function splitSegment(segment, chunkNames) {\n      let startNewSegment = true;\n\n      // helper for adding to a segment / creating a new one\n      function addToSegment(segments, d) {\n        // if we are starting a new segment, start it with this point\n        if (startNewSegment) {\n          segments.push([d]);\n          startNewSegment = false;\n\n          // otherwise add to the last segment\n        } else {\n          const lastSegment = segments[segments.length - 1];\n          lastSegment.push(d);\n        }\n      }\n\n      const segments = segment.reduce((segments, d, i) => {\n        const dChunkName = chunk(d);\n        const dPrev = segment[i - 1];\n        const dNext = segment[i + 1];\n\n        // if it matches name, add to the segment\n        if (dChunkName === chunkName) {\n          addToSegment(segments, d);\n        } else {\n          // check if this point belongs in the previous chunk:\n          let added = false;\n          // doesn't match chunk name, but does it go in the segment? as the end?\n          if (dPrev) {\n            const segmentChunkName = chunkLineResolver(\n              chunk(dPrev),\n              dChunkName,\n              chunkNames\n            );\n\n            // if it is supposed to be in this chunk, add it in\n            if (segmentChunkName === chunkName) {\n              addToSegment(segments, d);\n              added = true;\n              startNewSegment = false;\n            }\n          }\n\n          // doesn't belong in previous, so does it belong in next?\n          if (!added && dNext != null) {\n            // check if this point belongs in the next chunk\n            const nextSegmentChunkName = chunkLineResolver(\n              dChunkName,\n              chunk(dNext),\n              chunkNames\n            );\n\n            // if it's supposed to be in the next chunk, create it\n            if (nextSegmentChunkName === chunkName) {\n              segments.push([d]);\n              added = true;\n              startNewSegment = false;\n            } else {\n              startNewSegment = true;\n            }\n\n            // not previous or next\n          } else if (!added) {\n            startNewSegment = true;\n          }\n        }\n\n        return segments;\n      }, []);\n\n      return segments;\n    }\n\n    const chunkNames = getChunkNames(true);\n\n    const chunkSegments = definedSegments.reduce((carry, segment) => {\n      const newSegments = splitSegment(segment, chunkNames);\n      if (newSegments && newSegments.length) {\n        return carry.concat(newSegments);\n      }\n\n      return carry;\n    }, []);\n\n    return chunkSegments;\n  }\n\n  /**\n   * Helper function to compute the contiguous segments of the data\n   * @param {Array} lineData the line data\n   * @param {String} chunkName the chunk name to match. points not matching are removed.\n   *   if undefined, uses 'line'.\n   * @return {Array} An array of segments (subarrays) of the line data\n   */\n  function computeDefinedSegments(lineData) {\n    let startNewSegment = true;\n\n    // split into segments of continuous data\n    const segments = lineData.reduce((segments, d) => {\n      // skip if this point has no data\n      if (!defined(d)) {\n        startNewSegment = true;\n        return segments;\n      }\n\n      // if we are starting a new segment, start it with this point\n      if (startNewSegment) {\n        segments.push([d]);\n        startNewSegment = false;\n\n        // otherwise see if we are adding to the last segment\n      } else {\n        const lastSegment = segments[segments.length - 1];\n        const lastDatum = lastSegment[lastSegment.length - 1];\n        // if we expect this point to come next, add it to the segment\n        if (isNext(lastDatum, d)) {\n          lastSegment.push(d);\n\n          // otherwise create a new segment\n        } else {\n          segments.push([d]);\n        }\n      }\n\n      return segments;\n    }, []);\n\n    return segments;\n  }\n\n  /**\n   * Helper function that applies attrs and styles to the specified selection.\n   *\n   * @param {Object} selection The d3 selection\n   * @param {Object} evaluatedDefinition The evaluated styles and attrs obj (part of output from evaluateDefinitions())\n   * @param {Boolean} point if true, uses pointAttrs and pointStyles, otherwise attrs and styles (default: false).\n   * @return {void}\n   */\n  function applyAttrsAndStyles(selection, evaluatedDefinition, point = false) {\n    const attrsKey = point ? 'pointAttrs' : 'attrs';\n    const stylesKey = point ? 'pointStyles' : 'styles';\n\n    // apply user-provided attrs\n    Object.keys(evaluatedDefinition[attrsKey]).forEach((attr) => {\n      selection.attr(attr, evaluatedDefinition[attrsKey][attr]);\n    });\n\n    // apply user-provided styles\n    Object.keys(evaluatedDefinition[stylesKey]).forEach((style) => {\n      selection.style(style, evaluatedDefinition[stylesKey][style]);\n    });\n  }\n\n  /**\n   * For the selected line, evaluate the definitions objects. This is necessary since\n   * some of the style/attr values are functions that need to be evaluated per line.\n   *\n   * In general, the definitions are added in this order:\n   *\n   * 1. definition from lineStyle, lineAttrs, pointStyles, pointAttrs\n   * 2. if it is the gap line, add in gapStyles, gapAttrs\n   * 3. definition from chunkDefinitions\n   *\n   * Returns an object matching the form of chunkDefinitions:\n   * {\n   *   line: { styles, attrs, pointStyles, pointAttrs },\n   *   gap: { styles, attrs }\n   *   chunkName1: { styles, attrs, pointStyles, pointAttrs },\n   *   ...\n   * }\n   */\n  function evaluateDefinitions(d, i) {\n    // helper to evaluate an object of attr or style definitions\n    function evaluateAttrsOrStyles(input = {}) {\n      return Object.keys(input).reduce((output, key) => {\n        let val = input[key];\n\n        if (typeof val === 'function') {\n          val = val(d, i);\n        }\n\n        output[key] = val;\n        return output;\n      }, {});\n    }\n\n    const evaluated = {};\n\n    // get the list of chunks to create evaluated definitions for\n    const chunks = getChunkNames();\n\n    // for each chunk, evaluate the attrs and styles to use for lines and points\n    chunks.forEach((chunkName) => {\n      const chunkDef = chunkDefinitions[chunkName] || {};\n      const evaluatedChunk = {\n        styles: {\n          ...evaluateAttrsOrStyles(lineStyles),\n          ...evaluateAttrsOrStyles(\n            (chunkDefinitions[lineChunkName] || {}).styles\n          ),\n          ...(chunkName === gapChunkName\n            ? evaluateAttrsOrStyles(gapStyles)\n            : undefined),\n          ...evaluateAttrsOrStyles(chunkDef.styles),\n        },\n        attrs: {\n          ...evaluateAttrsOrStyles(lineAttrs),\n          ...evaluateAttrsOrStyles(\n            (chunkDefinitions[lineChunkName] || {}).attrs\n          ),\n          ...(chunkName === gapChunkName\n            ? evaluateAttrsOrStyles(gapAttrs)\n            : undefined),\n          ...evaluateAttrsOrStyles(chunkDef.attrs),\n        },\n      };\n\n      // set point attrs. defaults read from this chunk's line settings.\n      const basePointAttrs = {\n        fill: evaluatedChunk.attrs.stroke,\n        r:\n          evaluatedChunk.attrs['stroke-width'] == null\n            ? undefined\n            : parseFloat(evaluatedChunk.attrs['stroke-width']) + 1,\n      };\n\n      evaluatedChunk.pointAttrs = Object.assign(\n        basePointAttrs,\n        evaluateAttrsOrStyles(pointAttrs),\n        evaluateAttrsOrStyles(\n          (chunkDefinitions[lineChunkName] || {}).pointAttrs\n        ),\n        evaluateAttrsOrStyles(chunkDef.pointAttrs)\n      );\n\n      // ensure `r` is a number (helps to remove 'px' if provided)\n      if (evaluatedChunk.pointAttrs.r != null) {\n        evaluatedChunk.pointAttrs.r = parseFloat(evaluatedChunk.pointAttrs.r);\n      }\n\n      // set point styles. if no fill attr set, use the line style stroke. otherwise read from the attr.\n      const basePointStyles =\n        chunkDef.pointAttrs && chunkDef.pointAttrs.fill != null\n          ? {}\n          : {\n              fill: evaluatedChunk.styles.stroke,\n            };\n\n      evaluatedChunk.pointStyles = Object.assign(\n        basePointStyles,\n        evaluateAttrsOrStyles(pointStyles),\n        evaluateAttrsOrStyles(\n          (chunkDefinitions[lineChunkName] || {}).pointStyles\n        ),\n        evaluateAttrsOrStyles(chunkDef.pointStyles)\n      );\n\n      evaluated[chunkName] = evaluatedChunk;\n    });\n\n    return evaluated;\n  }\n\n  /**\n   * Render the points for when segments have length 1.\n   */\n  function renderCircles(\n    initialRender,\n    transition,\n    context,\n    root,\n    points,\n    evaluatedDefinition,\n    className\n  ) {\n    const primaryClassName = className.split(' ')[0];\n    let circles = root\n      .selectAll(`.${primaryClassName}`)\n      .data(points, (d) => d.id);\n\n    // read in properties about the transition if we have one\n    const transitionDuration = transition ? context.duration() : 0;\n    const transitionDelay = transition ? context.delay() : 0;\n\n    // EXIT\n    if (transition) {\n      circles\n        .exit()\n        .transition()\n        .delay(transitionDelay)\n        .duration(transitionDuration * 0.05)\n        .attr('r', 1e-6)\n        .remove();\n    } else {\n      circles.exit().remove();\n    }\n\n    // ENTER\n    const circlesEnter = circles.enter().append('circle');\n\n    // apply user-provided attrs, using attributes from current line if not provided\n    applyAttrsAndStyles(circlesEnter, evaluatedDefinition, true);\n\n    circlesEnter\n      .classed(className, true)\n      .attr('r', 1e-6) // overrides provided `r value for now\n      .attr('cx', (d) => x(d.data))\n      .attr('cy', (d) => y(d.data));\n\n    // handle with transition\n    if (\n      (!initialRender || (initialRender && transitionInitial)) &&\n      transition\n    ) {\n      const enterDuration = transitionDuration * 0.15;\n\n      // delay sizing up the radius until after the line transition\n      circlesEnter\n        .transition(context)\n        .delay(transitionDelay + (transitionDuration - enterDuration))\n        .duration(enterDuration)\n        .attr('r', evaluatedDefinition.pointAttrs.r);\n    } else {\n      circlesEnter.attr('r', evaluatedDefinition.pointAttrs.r);\n    }\n\n    // UPDATE\n    if (transition) {\n      circles = circles.transition(context);\n    }\n    circles\n      .attr('r', evaluatedDefinition.pointAttrs.r)\n      .attr('cx', (d) => x(d.data))\n      .attr('cy', (d) => y(d.data));\n  }\n\n  function renderClipRects(\n    initialRender,\n    transition,\n    context,\n    root,\n    segments,\n    [xMin, xMax],\n    [yMin, yMax],\n    evaluatedDefinition,\n    path,\n    clipPathId\n  ) {\n    // TODO: issue with assigning IDs to clipPath elements. need to update how we select/create them\n    // need reference to path element to set stroke-width property\n    const clipPath = root.select(`#${clipPathId}`);\n    let gDebug = root.select('.d3-line-chunked-debug');\n\n    // set up debug group\n    if (debug && gDebug.empty()) {\n      gDebug = root.append('g').classed('d3-line-chunked-debug', true);\n    } else if (!debug && !gDebug.empty()) {\n      gDebug.remove();\n    }\n\n    let clipPathRects = clipPath.selectAll('rect').data(segments);\n    let debugRects;\n    if (debug) {\n      debugRects = gDebug.selectAll('rect').data(segments);\n    }\n\n    // get stroke width to avoid having the clip rects clip the stroke\n    // See https://github.com/pbeshai/d3-line-chunked/issues/2\n    const strokeWidth = parseFloat(\n      evaluatedDefinition.styles['stroke-width'] ||\n        path.style('stroke-width') || // reads from CSS too\n        evaluatedDefinition.attrs['stroke-width']\n    );\n    const strokeWidthClipAdjustment = strokeWidth;\n    const clipRectY = yMin - strokeWidthClipAdjustment;\n    const clipRectHeight =\n      yMax + strokeWidthClipAdjustment - (yMin - strokeWidthClipAdjustment);\n\n    // compute the currently visible area pairs of [xStart, xEnd] for each clip rect\n    // if no clip rects, the whole area is visible.\n    let visibleArea;\n\n    if (transition) {\n      // select previous rects\n      const previousRects = clipPath.selectAll('rect').nodes();\n      // no previous rects = visible area is everything\n      if (!previousRects.length) {\n        visibleArea = [[xMin, xMax]];\n      } else {\n        visibleArea = previousRects.map((rect) => {\n          const selectedRect = select(rect);\n          const xStart = parseFloat(selectedRect.attr('x'));\n          const xEnd = parseFloat(selectedRect.attr('width')) + xStart;\n          return [xStart, xEnd];\n        });\n      }\n\n      // set up the clipping paths\n      // animate by shrinking width to 0 and setting x to the mid point\n      let nextVisibleArea;\n      if (!segments.length) {\n        nextVisibleArea = [[0, 0]];\n      } else {\n        nextVisibleArea = segments.map((d) => {\n          const xStart = x(d[0]);\n          const xEnd = x(d[d.length - 1]);\n          return [xStart, xEnd];\n        });\n      }\n\n      // compute the start and end x values for a data point based on maximizing visibility\n      // around the middle of the rect.\n      function visibleStartEnd(d, visibleArea) {\n        // eslint-disable-line no-inner-declarations\n        const xStart = x(d[0]);\n        const xEnd = x(d[d.length - 1]);\n        const xMid = xStart + (xEnd - xStart) / 2;\n        const visArea = visibleArea.find(\n          (area) => area[0] <= xMid && xMid <= area[1]\n        );\n\n        // set width to overlapping visible area\n        if (visArea) {\n          return [Math.max(visArea[0], xStart), Math.min(xEnd, visArea[1])];\n        }\n\n        // return xEnd - xStart;\n        return [xMid, xMid];\n      }\n\n      function exitRect(rect) {\n        // eslint-disable-line no-inner-declarations\n        rect\n          .attr('x', (d) => visibleStartEnd(d, nextVisibleArea)[0])\n          .attr('width', (d) => {\n            const [xStart, xEnd] = visibleStartEnd(d, nextVisibleArea);\n            return xEnd - xStart;\n          });\n      }\n\n      function enterRect(rect) {\n        // eslint-disable-line no-inner-declarations\n        rect\n          .attr('x', (d) => visibleStartEnd(d, visibleArea)[0])\n          .attr('width', (d) => {\n            const [xStart, xEnd] = visibleStartEnd(d, visibleArea);\n            return xEnd - xStart;\n          })\n          .attr('y', clipRectY)\n          .attr('height', clipRectHeight);\n      }\n\n      clipPathRects.exit().transition(context).call(exitRect).remove();\n      const clipPathRectsEnter = clipPathRects\n        .enter()\n        .append('rect')\n        .call(enterRect);\n      clipPathRects = clipPathRects.merge(clipPathRectsEnter);\n      clipPathRects = clipPathRects.transition(context);\n\n      // debug rects should match clipPathRects\n      if (debug) {\n        debugRects.exit().transition(context).call(exitRect).remove();\n        const debugRectsEnter = debugRects\n          .enter()\n          .append('rect')\n          .style('fill', 'rgba(255, 0, 0, 0.3)')\n          .style('stroke', 'rgba(255, 0, 0, 0.6)')\n          .call(enterRect);\n\n        debugRects = debugRects.merge(debugRectsEnter);\n        debugRects = debugRects.transition(context);\n      }\n\n      // not in transition\n    } else {\n      clipPathRects.exit().remove();\n      const clipPathRectsEnter = clipPathRects.enter().append('rect');\n      clipPathRects = clipPathRects.merge(clipPathRectsEnter);\n\n      if (debug) {\n        debugRects.exit().remove();\n        const debugRectsEnter = debugRects\n          .enter()\n          .append('rect')\n          .style('fill', 'rgba(255, 0, 0, 0.3)')\n          .style('stroke', 'rgba(255, 0, 0, 0.6)');\n        debugRects = debugRects.merge(debugRectsEnter);\n      }\n    }\n\n    // after transition, update the clip rect dimensions\n    function updateRect(rect) {\n      rect\n        .attr('x', (d) => {\n          // if at the edge, adjust for stroke width\n          const val = x(d[0]);\n          if (val === xMin) {\n            return val - strokeWidthClipAdjustment;\n          }\n          return val;\n        })\n        .attr('width', (d) => {\n          // if at the edge, adjust for stroke width to prevent clipping it\n          let valMin = x(d[0]);\n          let valMax = x(d[d.length - 1]);\n          if (valMin === xMin) {\n            valMin -= strokeWidthClipAdjustment;\n          }\n          if (valMax === xMax) {\n            valMax += strokeWidthClipAdjustment;\n          }\n\n          return valMax - valMin;\n        })\n        .attr('y', clipRectY)\n        .attr('height', clipRectHeight);\n    }\n\n    clipPathRects.call(updateRect);\n    if (debug) {\n      debugRects.call(updateRect);\n    }\n  }\n\n  /**\n   * Helper function to draw the actual path\n   */\n  function renderPath(\n    initialRender,\n    transition,\n    context,\n    root,\n    lineData,\n    evaluatedDefinition,\n    line,\n    initialLine,\n    className,\n    clipPathId\n  ) {\n    let path = root.select(`.${className.split(' ')[0]}`);\n\n    // initial render\n    if (path.empty()) {\n      path = root.append('path');\n    }\n    const pathSelection = path;\n\n    if (clipPathId) {\n      path.attr('clip-path', `url(#${clipPathId})`);\n    }\n\n    // handle animations for initial render\n    if (initialRender) {\n      path.attr('d', initialLine(lineData));\n    }\n\n    // apply user defined styles and attributes\n    applyAttrsAndStyles(path, evaluatedDefinition);\n\n    path.classed(className, true);\n\n    // handle transition\n    if (transition) {\n      path = path.transition(context);\n    }\n\n    if (path.attrTween) {\n      // use attrTween is available (in transition)\n      path.attrTween('d', function dTween() {\n        const previous = select(this).attr('d');\n        const current = line(lineData);\n        return interpolatePath(previous, current);\n      });\n    } else {\n      path.attr('d', () => line(lineData));\n    }\n\n    // can't return path since it might have the transition\n    return pathSelection;\n  }\n\n  /**\n   * Helper to get the line functions to use to draw the lines. Possibly\n   * updates the line data to be in [x, y] format if extendEnds is true.\n   *\n   * @return {Object} { line, initialLine, lineData }\n   */\n  function getLineFunctions(lineData, initialRender, yDomain) {\n    // eslint-disable-line no-unused-vars\n    const yMax = yDomain[1];\n\n    // main line function\n    let line = d3Line().x(x).y(y).curve(curve);\n    let initialLine;\n\n    // if the user specifies to extend ends for the undefined line, add points to the line for them.\n    if (extendEnds && lineData.length) {\n      // we have to process the data here since we don't know how to format an input object\n      // we use the [x, y] format of a data point\n      const processedLineData = lineData.map((d) => [x(d), y(d)]);\n      lineData = [\n        [extendEnds[0], processedLineData[0][1]],\n        ...processedLineData,\n        [extendEnds[1], processedLineData[processedLineData.length - 1][1]],\n      ];\n\n      // this line function works on the processed data (default .x and .y read the [x,y] format)\n      line = d3Line().curve(curve);\n    }\n\n    // handle animations for initial render\n    if (initialRender) {\n      // have the line load in with a flat y value\n      initialLine = line;\n      if (transitionInitial) {\n        initialLine = d3Line().x(x).y(yMax).curve(curve);\n\n        // if the user extends ends, we should use the line that works on that data\n        if (extendEnds) {\n          initialLine = d3Line().y(yMax).curve(curve);\n        }\n      }\n    }\n\n    return {\n      line,\n      initialLine: initialLine || line,\n      lineData,\n    };\n  }\n\n  function initializeClipPath(chunkName, root) {\n    if (chunkName === gapChunkName) {\n      return undefined;\n    }\n\n    let defs = root.select('defs');\n    if (defs.empty()) {\n      defs = root.append('defs');\n    }\n\n    // className = d3-line-chunked-clip-chunkName\n    const className = `d3-line-chunked-clip-${chunkName}`;\n    let clipPath = defs.select(`.${className}`);\n\n    // initial render\n    if (clipPath.empty()) {\n      clipPath = defs\n        .append('clipPath')\n        .attr('class', className)\n        .attr('id', `d3-line-chunked-clip-${chunkName}-${counter}`);\n      counter += 1;\n    }\n\n    return clipPath.attr('id');\n  }\n\n  /**\n   * Render the lines: circles, paths, clip rects for the given (data, lineIndex)\n   */\n  function renderLines(\n    initialRender,\n    transition,\n    context,\n    root,\n    data,\n    lineIndex\n  ) {\n    // use the accessor if provided (e.g. if the data is something like\n    // `{ results: [[x,y], [[x,y], ...]}`)\n    const lineData = accessData(data);\n\n    // filter to only defined data to plot the lines\n    const filteredLineData = lineData.filter(defined);\n\n    // determine the extent of the y values\n    const yExtent = extent(filteredLineData.map((d) => y(d)));\n\n    // determine the extent of the x values to handle stroke-width adjustments on\n    // clipping rects. Do not use extendEnds here since it can clip the line ending\n    // in an unnatural way, it's better to just show the end.\n    const xExtent = extent(filteredLineData.map((d) => x(d)));\n\n    // evaluate attrs and styles for the given dataset\n    // pass in the raw data and index for computing attrs and styles if they are functinos\n    const evaluatedDefinitions = evaluateDefinitions(data, lineIndex);\n\n    // update line functions and data depending on animation and render circumstances\n    const lineResults = getLineFunctions(\n      filteredLineData,\n      initialRender,\n      yExtent\n    );\n\n    // lineData possibly updated if extendEnds is true since we normalize to [x, y] format\n    const { line, initialLine, lineData: modifiedLineData } = lineResults;\n\n    // for each chunk type, render a line\n    const chunkNames = getChunkNames();\n\n    const definedSegments = computeDefinedSegments(lineData);\n\n    // for each chunk, draw a line, circles and clip rect\n    chunkNames.forEach((chunkName) => {\n      const clipPathId = initializeClipPath(chunkName, root);\n\n      let className = `d3-line-chunked-chunk-${chunkName}`;\n      if (chunkName === lineChunkName) {\n        className = `d3-line-chunked-defined ${className}`;\n      } else if (chunkName === gapChunkName) {\n        className = `d3-line-chunked-undefined ${className}`;\n      }\n\n      // get the eval defs for this chunk name\n      const evaluatedDefinition = evaluatedDefinitions[chunkName];\n\n      const path = renderPath(\n        initialRender,\n        transition,\n        context,\n        root,\n        modifiedLineData,\n        evaluatedDefinition,\n        line,\n        initialLine,\n        className,\n        clipPathId\n      );\n\n      if (chunkName !== gapChunkName) {\n        // compute the segments and points for this chunk type\n        const segments = computeChunkedSegments(chunkName, definedSegments);\n        const points = segments\n          .filter((segment) => segment.length === 1)\n          .map((segment) => ({\n            // use random ID so they are treated as entering/exiting each time\n            id: x(segment[0]),\n            data: segment[0],\n          }));\n\n        const circlesClassName = className\n          .split(' ')\n          .map((name) => `${name}-point`)\n          .join(' ');\n        renderCircles(\n          initialRender,\n          transition,\n          context,\n          root,\n          points,\n          evaluatedDefinition,\n          circlesClassName\n        );\n\n        renderClipRects(\n          initialRender,\n          transition,\n          context,\n          root,\n          segments,\n          xExtent,\n          yExtent,\n          evaluatedDefinition,\n          path,\n          clipPathId\n        );\n      }\n    });\n\n    // ensure all circles are at the top\n    root.selectAll('circle').raise();\n  }\n\n  // the main function that is returned\n  function lineChunked(context) {\n    if (!context) {\n      return;\n    }\n    const selection = context.selection ? context.selection() : context; // handle transition\n\n    if (!selection || selection.empty()) {\n      return;\n    }\n\n    let transition = false;\n    if (selection !== context) {\n      transition = true;\n    }\n\n    selection.each(function each(data, lineIndex) {\n      const root = select(this);\n\n      const initialRender = root.select('.d3-line-chunked-defined').empty();\n      renderLines(initialRender, transition, context, root, data, lineIndex);\n    });\n\n    // provide warning about wrong attr/defs\n    validateChunkDefinitions();\n  }\n\n  // ------------------------------------------------\n  // Define getters and setters\n  // ------------------------------------------------\n  function getterSetter({ get, set, setType, asConstant }) {\n    return function getSet(newValue) {\n      if (arguments.length) {\n        // main setter if setType matches newValue type\n        // eslint-disable-next-line valid-typeof\n        if (\n          (!setType && newValue != null) ||\n          (setType && typeof newValue === setType)\n        ) {\n          set(newValue);\n\n          // setter to constant function if provided\n        } else if (asConstant && newValue != null) {\n          set(asConstant(newValue));\n        }\n\n        return lineChunked;\n      }\n\n      // otherwise ignore value/no value provided, so use getter\n      return get();\n    };\n  }\n\n  // define `x([x])`\n  lineChunked.x = getterSetter({\n    get: () => x,\n    set: (newValue) => {\n      x = newValue;\n    },\n    setType: 'function',\n    asConstant: (newValue) => () => +newValue, // d3 v4 uses +, so we do too\n  });\n\n  // define `y([y])`\n  lineChunked.y = getterSetter({\n    get: () => y,\n    set: (newValue) => {\n      y = newValue;\n    },\n    setType: 'function',\n    asConstant: (newValue) => () => +newValue,\n  });\n\n  // define `defined([defined])`\n  lineChunked.defined = getterSetter({\n    get: () => defined,\n    set: (newValue) => {\n      defined = newValue;\n    },\n    setType: 'function',\n    asConstant: (newValue) => () => !!newValue,\n  });\n\n  // define `isNext([isNext])`\n  lineChunked.isNext = getterSetter({\n    get: () => isNext,\n    set: (newValue) => {\n      isNext = newValue;\n    },\n    setType: 'function',\n    asConstant: (newValue) => () => !!newValue,\n  });\n\n  // define `chunk([chunk])`\n  lineChunked.chunk = getterSetter({\n    get: () => chunk,\n    set: (newValue) => {\n      chunk = newValue;\n    },\n    setType: 'function',\n    asConstant: (newValue) => () => newValue,\n  });\n\n  // define `chunkLineResolver([chunkLineResolver])`\n  lineChunked.chunkLineResolver = getterSetter({\n    get: () => chunkLineResolver,\n    set: (newValue) => {\n      chunkLineResolver = newValue;\n    },\n    setType: 'function',\n  });\n\n  // define `chunkDefinitions([chunkDefinitions])`\n  lineChunked.chunkDefinitions = getterSetter({\n    get: () => chunkDefinitions,\n    set: (newValue) => {\n      chunkDefinitions = newValue;\n    },\n    setType: 'object',\n  });\n\n  // define `curve([curve])`\n  lineChunked.curve = getterSetter({\n    get: () => curve,\n    set: (newValue) => {\n      curve = newValue;\n    },\n    setType: 'function',\n  });\n\n  // define `lineStyles([lineStyles])`\n  lineChunked.lineStyles = getterSetter({\n    get: () => lineStyles,\n    set: (newValue) => {\n      lineStyles = newValue;\n    },\n    setType: 'object',\n  });\n\n  // define `gapStyles([gapStyles])`\n  lineChunked.gapStyles = getterSetter({\n    get: () => gapStyles,\n    set: (newValue) => {\n      gapStyles = newValue;\n    },\n    setType: 'object',\n  });\n\n  // define `pointStyles([pointStyles])`\n  lineChunked.pointStyles = getterSetter({\n    get: () => pointStyles,\n    set: (newValue) => {\n      pointStyles = newValue;\n    },\n    setType: 'object',\n  });\n\n  // define `lineAttrs([lineAttrs])`\n  lineChunked.lineAttrs = getterSetter({\n    get: () => lineAttrs,\n    set: (newValue) => {\n      lineAttrs = newValue;\n    },\n    setType: 'object',\n  });\n\n  // define `gapAttrs([gapAttrs])`\n  lineChunked.gapAttrs = getterSetter({\n    get: () => gapAttrs,\n    set: (newValue) => {\n      gapAttrs = newValue;\n    },\n    setType: 'object',\n  });\n\n  // define `pointAttrs([pointAttrs])`\n  lineChunked.pointAttrs = getterSetter({\n    get: () => pointAttrs,\n    set: (newValue) => {\n      pointAttrs = newValue;\n    },\n    setType: 'object',\n  });\n\n  // define `transitionInitial([transitionInitial])`\n  lineChunked.transitionInitial = getterSetter({\n    get: () => transitionInitial,\n    set: (newValue) => {\n      transitionInitial = newValue;\n    },\n    setType: 'boolean',\n  });\n\n  // define `extendEnds([extendEnds])`\n  lineChunked.extendEnds = getterSetter({\n    get: () => extendEnds,\n    set: (newValue) => {\n      extendEnds = newValue;\n    },\n    setType: 'object', // should be an array\n  });\n\n  // define `accessData([accessData])`\n  lineChunked.accessData = getterSetter({\n    get: () => accessData,\n    set: (newValue) => {\n      accessData = newValue;\n    },\n    setType: 'function',\n    asConstant: (newValue) => (d) => d[newValue],\n  });\n\n  // define `debug([debug])`\n  lineChunked.debug = getterSetter({\n    get: () => debug,\n    set: (newValue) => {\n      debug = newValue;\n    },\n    setType: 'boolean',\n  });\n\n  return lineChunked;\n}\n","<template>\n  <div class=\"d-flex flex-column flex-fill\">\n    <UIBoxHeader\n      icon=\"ruler-vertical\"\n      :title=\"title\"\n      :closeCallback=\"close\"\n      class=\"rounded-0\"\n    />\n    <div class=\"d-flex flex-fill\">\n      <DiagramLegend id=\"diagramlegendId\">\n        <div class=\"legend\">\n          <span\n            style=\"background-color: steelblue; width: 20px; height: 20px;\"\n          ></span>\n          <span class=\"fix-trans-space\" style=\"display:inline;\" v-translate\n            >Waterlevel</span\n          >\n        </div>\n        <div class=\"legend\">\n          <span\n            style=\"width: 8px; height: 8px; background-color: rgba(70, 130, 180, 0.6); border: solid 7px rgba(70, 130, 180, 0.2); background-clip: padding-box; box-sizing: content-box;\"\n          ></span>\n          <span class=\"fix-trans-space\" style=\"display:inline;\" v-translate\n            >Prediction</span\n          >\n        </div>\n        <div class=\"legend\">\n          <span\n            style=\"background-color: rgba(0, 255, 0, 0.1); width: 20px; height: 20px;\"\n          ></span>\n          <span class=\"fix-trans-space\" style=\"display:inline;\" v-translate\n            >Navigable Range</span\n          >\n        </div>\n        <div>\n          <select\n            @change=\"applyChange\"\n            v-model=\"form.template\"\n            class=\"form-control d-block custom-select-sm w-100\"\n          >\n            <option\n              v-for=\"template in templates\"\n              :value=\"template\"\n              :key=\"template.name\"\n            >\n              {{ template.name }}\n            </option>\n          </select>\n          <button\n            @click=\"downloadPDF\"\n            type=\"button\"\n            class=\"btn btn-sm btn-info d-block w-100 mt-2\"\n            :disabled=\"!waterlevels.length\"\n          >\n            <translate>Export to PDF</translate>\n          </button>\n          <a\n            :class=\"[\n              'btn btn-sm btn-info d-block w-100 mt-2',\n              { disabled: !waterlevels.length }\n            ]\"\n            :href=\"csvLink\"\n            :download=\"`${fileName}.csv`\"\n          >\n            <translate>Export as CSV</translate>\n          </a>\n          <a\n            @click=\"downloadImage('waterlevelpng', title)\"\n            id=\"waterlevelpng\"\n            :class=\"[\n              'btn btn-sm btn-info text-white d-block w-100 mt-2',\n              { disabled: !waterlevels.length }\n            ]\"\n            :download=\"`${fileName}.png`\"\n          >\n            <translate>Export as Image</translate>\n          </a>\n          <!--\n          <button\n            @click=\"downloadSVG\"\n            type=\"button\"\n            class=\"btn btn-sm btn-info d-block w-100 mt-2\"\n            :disabled=\"!waterlevels.length\"\n          >\n            <translate>Export as SVG</translate>\n          </button>\n          -->\n        </div>\n        <div class=\"btn-group-toggle w-100 mt-2\">\n          <label\n            class=\"btn btn-outline-secondary btn-sm\"\n            :class=\"{ active: showNSC }\"\n            ><input\n              type=\"checkbox\"\n              v-model=\"showNSC\"\n              autocomplete=\"off\"\n            />Nash-Sutcliffe\n          </label>\n        </div>\n      </DiagramLegend>\n      <div\n        class=\"d-flex flex-fill justify-content-center align-items-center\"\n        :id=\"containerId\"\n      >\n        <div v-if=\"!waterlevels.length\">\n          <translate>No data available.</translate>\n        </div>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script>\n/* This is Free Software under GNU Affero General Public License v >= 3.0\n * without warranty, see README.md and license for details.\n *\n * SPDX-License-Identifier: AGPL-3.0-or-later\n * License-Filename: LICENSES/AGPL-3.0.txt\n *\n * Copyright (C) 2019 by via donau\n *   – Österreichische Wasserstraßen-Gesellschaft mbH\n * Software engineering by Intevation GmbH\n *\n * Author(s):\n * * Bernhard Reiter <bernhard@intevation.de>\n * * Markus Kottländer <markus.kottlaender@intevation.de>\n * * Fadi Abbud <fadi.abbud@intevation.de>\n */\n\nimport app from \"@/main\";\nimport { mapState, mapGetters } from \"vuex\";\nimport * as d3Base from \"d3\";\nimport { lineChunked } from \"d3-line-chunked\";\nimport debounce from \"debounce\";\nimport { saveAs } from \"file-saver\";\nimport { diagram, pdfgen, templateLoader, refwaterlevels } from \"@/lib/mixins\";\nimport { HTTP } from \"@/lib/http\";\nimport { displayError } from \"@/lib/errors\";\nimport { defaultDiagramTemplate } from \"@/lib/DefaultDiagramTemplate\";\nimport { localeDateString } from \"@/lib/datelocalization\";\n\n// we should load only d3 modules we need but for now we'll go with the lazy way\n// https://www.giacomodebidda.com/how-to-import-d3-plugins-with-webpack/\n// d3-line-chunked plugin: https://github.com/pbeshai/d3-line-chunked\nconst d3 = Object.assign(d3Base, { lineChunked });\n\nlet temp = null;\n\nexport default {\n  mixins: [diagram, pdfgen, templateLoader, refwaterlevels],\n  components: {\n    DiagramLegend: () => import(\"@/components/DiagramLegend\")\n  },\n  data() {\n    return {\n      dateFromD: null,\n      dateToD: null,\n      selectedGaugeD: null,\n      containerId: \"waterlevel-diagram-container\",\n      resizeListenerFunction: null,\n      form: {\n        template: null\n      },\n      templates: [],\n      defaultTemplate: defaultDiagramTemplate,\n      pdf: {\n        doc: null,\n        width: 420,\n        height: 297\n      },\n      templateData: null,\n      zoomStore: null,\n      showNSC: true\n    };\n  },\n  computed: {\n    ...mapState(\"application\", [\"paneSetup\"]),\n    ...mapState(\"gauges\", [\n      \"dateFrom\",\n      \"dateTo\",\n      \"waterlevels\",\n      \"waterlevelsCSV\",\n      \"nashSutcliffe\"\n    ]),\n    ...mapGetters(\"gauges\", [\"selectedGauge\"]),\n    title() {\n      if (!this.selectedGaugeD) return;\n      return `${this.selectedGaugeD.properties.objname}: ${this.$gettext(\n        \"Waterlevel\"\n      )} (${this.dateFromD.toLocaleDateString()} - ${this.dateToD.toLocaleDateString()})`;\n    },\n    csvLink() {\n      return (\n        \"data:text/csv;charset=utf-8,\" + encodeURIComponent(this.waterlevelsCSV)\n      );\n    },\n    fileName() {\n      return this.downloadFilename(\n        this.$gettext(\"Waterlevel\"),\n        this.selectedGauge.properties.objname\n      );\n    },\n    hasPredictions() {\n      return this.waterlevels.find(d => d.predicted);\n    }\n  },\n  watch: {\n    showNSC() {\n      this.drawDiagram({ ...this.zoomStore });\n    },\n    paneSetup() {\n      this.$nextTick(() => this.drawDiagram());\n    },\n    waterlevels() {\n      this.initialDiagramValues();\n      this.drawDiagram();\n    }\n  },\n  methods: {\n    addLegendToCanvas(ctx, { width, height }) {\n      let x = width / 10,\n        y = height - 25;\n      ctx.font = \"12px sans-serif\";\n      ctx.textAlign = \"start\";\n\n      ctx.beginPath();\n      ctx.fillStyle = \"steelblue\";\n      ctx.strokeStyle = \"white\";\n      ctx.arc(x, y, 8, 0, 2 * Math.PI);\n      ctx.fill();\n      ctx.stroke();\n      ctx.fillStyle = \"black\";\n      ctx.fillText(this.$gettext(\"Waterlevel\"), x + 14, y + 5);\n      ctx.closePath();\n\n      ctx.beginPath();\n      ctx.fillStyle = \"#90b4d2\";\n      ctx.strokeStyle = \"#90b4d2\";\n      ctx.arc(x, (y += 20), 8, 0, 2 * Math.PI);\n      ctx.fill();\n      ctx.stroke();\n      ctx.closePath();\n      ctx.beginPath();\n      ctx.fillStyle = \"#4682B4\";\n      ctx.strokeStyle = \"#4682B4\";\n      ctx.arc(x, y, 2, 0, 2 * Math.PI);\n      ctx.fill();\n      ctx.stroke();\n      ctx.fillStyle = \"black\";\n      ctx.fillText(this.$gettext(\"prediction\"), x + 14, y + 5);\n      ctx.closePath();\n\n      ctx.beginPath();\n      ctx.fillStyle = \"rgba(0, 255, 0, 0.1)\";\n      ctx.strokeStyle = \"rgba(0, 255, 0, 0.1)\";\n      ctx.arc(x, (y += 20), 8, 0, 2 * Math.PI);\n      ctx.fill();\n      ctx.stroke();\n      ctx.fillStyle = \"black\";\n      ctx.fillText(this.$gettext(\"Navigable Range\"), x + 14, y + 5);\n      ctx.closePath();\n    },\n    initialDiagramValues() {\n      this.dateFromD = this.dateFrom;\n      this.dateToD = this.dateTo;\n      this.selectedGaugeD = this.selectedGauge;\n    },\n    close() {\n      this.$store.commit(\n        \"application/paneSetup\",\n        this.paneSetup === \"GAUGE_WATERLEVEL_HYDROLOGICALCONDITIONS\"\n          ? \"GAUGE_HYDROLOGICALCONDITIONS\"\n          : \"DEFAULT\"\n      );\n    },\n    downloadSVG() {\n      let svg = document.getElementById(this.containerId).firstElementChild;\n      let svgXML = new XMLSerializer().serializeToString(svg);\n      let blog = new Blob([svgXML], { type: \"image/svg+xml;charset=utf-8\" });\n      let filename =\n        this.selectedGauge.properties.objname + \"-waterlevel-diagram.svg\";\n      saveAs(blog, filename);\n    },\n    downloadPDF() {\n      let diagramTitle = `${this.selectedGaugeD.properties.objname} (${\n        this.isrsInfo(this.selectedGaugeD).orc\n      }): ${this.$gettext(\n        \"Waterlevel\"\n      )} ${this.dateFromD.toLocaleDateString()} - ${this.dateToD.toLocaleDateString()}`;\n      this.generatePDF({\n        templateData: this.templateData,\n        diagramTitle: diagramTitle\n      });\n      this.pdf.doc.save(this.fileName + \".pdf\");\n    },\n    applyChange() {\n      if (this.form.template.hasOwnProperty(\"properties\")) {\n        this.templateData = this.defaultTemplate;\n        return;\n      }\n      if (this.form.template) {\n        this.loadTemplates(\"/templates/diagram/\" + this.form.template.name)\n          .then(response => {\n            this.prepareImages(response.data.template_data.elements).then(\n              values => {\n                values.forEach(v => {\n                  response.data.template_data.elements[v.index].url = v.url;\n                });\n                this.templateData = response.data.template_data;\n              }\n            );\n          })\n          .catch(error => {\n            let message = \"Backend not reachable\";\n            if (error.response) {\n              const { status, data } = error.response;\n              message = `${status}: ${data.message || data}`;\n            }\n            displayError({\n              title: this.$gettext(\"Backend Error\"),\n              message: message\n            });\n          });\n      }\n    },\n    // Diagram legend\n    addDiagramLegend(position, offset, color) {\n      let x = offset.x + 2, // 2 is the radius of the circle\n        y = offset.y,\n        padding = 3;\n      this.pdf.doc.setFontStyle(\"normal\");\n      this.pdf.doc.setFontSize(10);\n      let width = this.pdf.doc.getTextWidth(\"Navigable Range\") + padding;\n      if ([\"topright\", \"bottomright\"].indexOf(position) !== -1) {\n        x = this.pdf.width - offset.x - width;\n      }\n      if ([\"bottomright\", \"bottomleft\"].indexOf(position) !== -1) {\n        y = this.pdf.height - offset.y - this.getTextHeight(3);\n      }\n      if (y < this.getTextHeight(1)) {\n        y = y + this.getTextHeight(1) / 2;\n      }\n      this.pdf.doc.setTextColor(color);\n      this.pdf.doc.setDrawColor(\"white\");\n      this.pdf.doc.setFillColor(\"steelblue\");\n      this.pdf.doc.circle(x, y, 2, \"FD\");\n      this.pdf.doc.text(x + padding, y + 1, this.$gettext(\"Waterlevel\"));\n      this.pdf.doc.setFillColor(\"#dae6f0\");\n      this.pdf.doc.circle(x, y + 5, 2, \"FD\");\n      this.pdf.doc.setFillColor(\"#e5ffe5\");\n      this.pdf.doc.circle(x, y + 10, 2, \"FD\");\n      this.pdf.doc.text(x + padding, y + 11, this.$gettext(\"Navigable Range\"));\n      this.pdf.doc.setDrawColor(\"#90b4d2\");\n      this.pdf.doc.setFillColor(\"#90b4d2\");\n      this.pdf.doc.circle(x, y + 5, 0.6, \"FD\");\n      this.pdf.doc.text(x + padding, y + 6, this.$gettext(\"Prediction\"));\n    },\n    getPrintLayout(svgHeight, svgWidth) {\n      return {\n        main: {\n          top: Math.floor(0.05 * svgHeight),\n          right: Math.floor(0.05 * svgWidth),\n          bottom: Math.floor(0.32 * svgHeight),\n          left: Math.floor(0.09 * svgWidth)\n        },\n        nav: {\n          top: Math.floor(0.78 * svgHeight),\n          right: Math.floor(0.013 * svgWidth),\n          bottom: Math.floor(0.095 * svgHeight),\n          left: Math.floor(0.09 * svgWidth)\n        }\n      };\n    },\n    drawDiagram(zoom) {\n      // remove old diagram and exit if necessary data is missing\n      d3.select(\"#\" + this.containerId + \" svg\").remove();\n      d3.timeFormatDefaultLocale(localeDateString);\n      const elem = document.querySelector(\"#\" + this.containerId);\n      const svgWidth = elem.clientWidth;\n      const svgHeight = elem.clientHeight;\n      const layout = this.getPrintLayout(svgHeight, svgWidth);\n      if (!this.selectedGauge || !this.waterlevels.length || !elem) return;\n      this.renderTo({\n        element: `#${this.containerId}`,\n        dimensions: this.getDimensions({\n          svgWidth: svgWidth,\n          svgHeight: svgHeight,\n          ...layout\n        }),\n        zoomLevel: zoom ? zoom : null\n      });\n    },\n    renderTo({ element, dimensions, zoomLevel }) {\n      // PREPARE HELPERS\n      // HDC/LDC/MW for the selected gauge\n      const refWaterLevels = JSON.parse(\n        this.selectedGauge.properties.reference_water_levels\n      );\n\n      // get min/max values for date and waterlevel axis\n      const extent = this.getExtent(refWaterLevels);\n\n      // scaling helpers\n      const scale = this.getScale({ dimensions, extent });\n      const dFormat = date => {\n        // make the x-axis label formats dynamic, based on zoom\n        // but never display year numbers since they don't make any sense in\n        // this diagram\n        return (d3.timeSecond(date) < date\n          ? d3.timeFormat(\".%L\")\n          : d3.timeMinute(date) < date\n          ? d3.timeFormat(\":%S\")\n          : d3.timeHour(date) < date\n          ? d3.timeFormat(\"%H:%M\")\n          : d3.timeDay(date) < date\n          ? d3.timeFormat(\"%H:%M\")\n          : d3.timeMonth(date) < date\n          ? d3.timeWeek(date) < date\n            ? d3.timeFormat(app.$gettext(\"%a %d\"))\n            : d3.timeFormat(app.$gettext(\"%b %d\"))\n          : d3.timeYear(date) < date\n          ? d3.timeFormat(\"%B\")\n          : d3.timeFormat(\"%Y\"))(date);\n      };\n      // creating the axes based on the scales\n      const axes = {\n        x: d3\n          .axisTop(scale.x)\n          .tickSizeInner(dimensions.mainHeight)\n          .tickSizeOuter(0)\n          .tickFormat(dFormat),\n        y: d3\n          .axisRight(scale.y)\n          .tickSizeInner(dimensions.width)\n          .tickSizeOuter(0)\n          .tickFormat(d => this.$options.filters.waterlevel(d)),\n        yRight: d3\n          .axisRight(scale.y)\n          .tickSizeInner(3)\n          .tickSizeOuter(0)\n          .tickFormat(d => this.$options.filters.waterlevel(d)),\n        x2: d3.axisBottom(scale.x2).tickFormat(dFormat)\n      };\n\n      // DRAW DIAGRAM/NAVIGATION AREAS\n\n      // create svg\n      const svg = d3\n        .select(element)\n        .append(\"svg\")\n        .attr(\"width\", \"100%\")\n        .attr(\"height\", \"100%\");\n      // add white background in the size of the svg\n      // to solve alpha-channel problem when using canvg to export image\n      svg\n        .append(\"g\")\n        .append(\"rect\")\n        .attr(\"width\", \"100%\")\n        .attr(\"height\", \"100%\")\n        .attr(\"fill\", \"#ffffff\");\n\n      // create container for main diagram\n      const diagram = svg\n        .append(\"g\")\n        .attr(\"class\", \"main\")\n        .attr(\n          \"transform\",\n          `translate(${dimensions.mainMargin.left}, ${dimensions.mainMargin.top})`\n        );\n\n      // create container for navigation diagram\n      const navigation = svg\n        .append(\"g\")\n        .attr(\"class\", \"nav\")\n        .attr(\n          \"transform\",\n          `translate(${dimensions.navMargin.left}, ${dimensions.navMargin.top})`\n        );\n\n      // define visible area, everything outside this area will be hidden\n      svg\n        .append(\"defs\")\n        .append(\"clipPath\")\n        .attr(\"id\", \"waterlevel-clip\")\n        .append(\"rect\")\n        .attr(\"width\", dimensions.width)\n        .attr(\"height\", dimensions.mainHeight);\n\n      // DRAW DIAGRAM PARTS\n\n      // Each drawSomething function (with the exception of drawRefLines)\n      // returns a fuction to update the respective chart/area/etc. These\n      // updater functions are used by the zoom feature to rescale all elements.\n      const updaters = [];\n\n      // draw (order matters)\n      updaters.push(this.drawAxes({ diagram, dimensions, axes, navigation }));\n      updaters.push(this.drawWaterlevelChart({ scale, diagram }));\n      if (this.hasPredictions) {\n        updaters.push(this.drawPredictionAreas({ scale, diagram, navigation }));\n      }\n      updaters.push(\n        this.drawNowLines({ scale, extent, diagram, navigation, dimensions })\n      );\n\n      // static, don't need updater\n      this.drawNavigationChart({ scale, navigation });\n      this.drawRefLines({ refWaterLevels, diagram, scale, dimensions, extent });\n      if (this.showNSC) {\n        updaters.push(\n          this.drawNashSutcliffe({ hours: 72, diagram, scale, dimensions })\n        );\n        updaters.push(\n          this.drawNashSutcliffe({ hours: 48, diagram, scale, dimensions })\n        );\n        updaters.push(\n          this.drawNashSutcliffe({ hours: 24, diagram, scale, dimensions })\n        );\n      }\n\n      // INTERACTIONS\n\n      // create rectanlge on the main chart area to capture mouse events\n      const eventRect = svg\n        .append(\"rect\")\n        .attr(\"id\", \"zoom-waterlevels\")\n        .attr(\"class\", \"zoom\")\n        .attr(\"width\", dimensions.width)\n        .attr(\"height\", dimensions.mainHeight)\n        .attr(\n          \"transform\",\n          `translate(${dimensions.mainMargin.left}, ${dimensions.mainMargin.top})`\n        );\n\n      this.createZoom({\n        updaters,\n        eventRect,\n        dimensions,\n        scale,\n        navigation,\n        svg,\n        zoomLevel\n      });\n      this.createTooltips({ eventRect, diagram, scale, dimensions });\n      this.setInlineStyles(svg);\n    },\n    //set the styles of the diagrams to include them in the pdf\n    setInlineStyles(svg) {\n      svg\n        .selectAll(\".line\")\n        .attr(\"clip-path\", \"url(#waterlevel-clip)\")\n        .selectAll(\"path\")\n        .attr(\"stroke\", \"steelblue\")\n        .attr(\"stroke-width\", 2)\n        .attr(\"fill\", \"none\");\n      svg\n        .selectAll(\".line\")\n        .selectAll(\"path.d3-line-chunked-chunk-gap\")\n        .attr(\"stroke-opacity\", 0);\n      svg\n        .selectAll(\".line\")\n        .selectAll(\"circle\")\n        .attr(\"fill\", \"steelblue\")\n        .attr(\"stroke-width\", 0);\n      svg\n        .selectAll(\".line\")\n        .selectAll(\"circle.d3-line-chunked-chunk-predicted-point\")\n        .attr(\"fill-opacity\", 0.6);\n\n      svg\n        .selectAll(\".hdc-line, .mw-line, .ldc-line, .rn-line\")\n        .attr(\"stroke-width\", 1)\n        .attr(\"fill\", \"none\")\n        .attr(\"clip-path\", \"url(#waterlevel-clip)\");\n      svg.selectAll(\".hdc-line\").attr(\"stroke\", \"red\");\n      svg.selectAll(\".ldc-line\").attr(\"stroke\", \"green\");\n\n      svg.selectAll(\".mw-line\").attr(\"stroke\", \"rgb(128,128,128)\");\n      svg.selectAll(\".rn-line\").attr(\"stroke\", \"rgb(128,128,128)\");\n      svg\n        .selectAll(\".ref-waterlevel-label\")\n        .style(\"font-size\", \"10px\")\n        .attr(\"fill\", \"black\");\n      svg\n        .selectAll(\".ref-waterlevel-label-background\")\n        .attr(\"fill\", \"rgb(255, 255, 255)\")\n        .attr(\"fill-opacity\", 0.6);\n      svg\n        .selectAll(\".hdc-ldc-area\")\n        .attr(\"fill\", \"rgb(0, 255, 0)\")\n        .attr(\"fill-opacity\", 0.1);\n      svg\n        .selectAll(\".now-line\")\n        .attr(\"stroke\", \"#999\")\n        .attr(\"stroke-width\", 1)\n        .attr(\"stroke-dasharray\", \"5, 5\")\n        .attr(\"clip-path\", \"url(#waterlevel-clip)\");\n      svg\n        .selectAll(\".now-line-label\")\n        .attr(\"font-size\", \"11px\")\n        .attr(\"fill\", \"#999\");\n      svg\n        .selectAll(\".prediction-area\")\n        .attr(\"fill\", \"steelblue\")\n        .attr(\"fill-opacity\", 0.2)\n        .attr(\"clip-path\", \"url(#waterlevel-clip)\");\n      svg\n        .selectAll(\"path.nash-sutcliffe\")\n        .attr(\"fill\", \"none\")\n        .attr(\"stroke\", \"gray\")\n        .attr(\"stroke-width\", 1)\n        .attr(\"clip-path\", \"url(#waterlevel-clip)\");\n      svg\n        .selectAll(\"path.nash-sutcliffe.ns72\")\n        .attr(\"fill\", \"rgb(255, 255, 255)\")\n        .attr(\"fill-opacity\", 0.5);\n      svg\n        .selectAll(\"text.nash-sutcliffe\")\n        .style(\"font-size\", \"10px\")\n        .attr(\"clip-path\", \"url(#waterlevel-clip)\")\n        .selectAll(\"tspan:last-child, tspan:first-child\")\n        .attr(\"fill\", \"#555\");\n      svg\n        .selectAll(\".axis--x .tick line, .axis--y .tick line\")\n        .attr(\"stroke-dasharray\", 5)\n        .attr(\"stroke\", \"#ccc\");\n      svg.selectAll(\".axis--y-right .tick line\").attr(\"stroke\", \"transparent\");\n      svg.selectAll(\".tick text\").attr(\"fill\", \"black\");\n      svg.selectAll(\".domain\").attr(\"stroke\", \"black\");\n      svg\n        .selectAll(\".domain\")\n        .attr(\"stroke\", \"black\")\n        .attr(\"fill\", \"none\");\n      svg\n        .selectAll(\".zoom\")\n        .attr(\"cursor\", \"move\")\n        .attr(\"fill\", \"none\")\n        .attr(\"pointer-events\", \"all\");\n      svg\n        .selectAll(\".brush .selection\")\n        .attr(\"stroke\", \"none\")\n        .attr(\"fill-opacity\", 0.2);\n      svg\n        .selectAll(\".brush .handle\")\n        .attr(\"stroke\", \"rgba(23, 162, 184, 0.5)\")\n        .attr(\"fill\", \"rgba(23, 162, 184, 0.5)\");\n      svg.selectAll(\".brush .overlay\").attr(\"fill\", \"none\");\n      svg.selectAll(\".chart-dots\").attr(\"clip-path\", \"url(#waterlevel-clip)\");\n      svg\n        .selectAll(\".chart-dots .chart-dot\")\n        .attr(\"fill\", \"steelblue\")\n        .attr(\"stroke\", \"steelblue\")\n        .attr(\"stroke-opacity\", 0)\n        .style(\"pointer-events\", \"none\")\n        .transition()\n        .attr(\"fill-opacity\", \"0.1s\");\n      svg\n        .selectAll(\".chart-tooltip\")\n        .attr(\"fill-opacity\", 0)\n        .transition()\n        .attr(\"fill-opacity\", \"0.3s\");\n      svg\n        .selectAll(\".chart-tooltip rect\")\n        .attr(\"fill\", \"#fff\")\n        .attr(\"stroke\", \"#ccc\");\n      svg\n        .selectAll(\".chart-tooltip text\")\n        .attr(\"fill\", \"666\")\n        .style(\"font-size\", \"0.8em\");\n    },\n    getExtent(refWaterLevels) {\n      let rest;\n      if (refWaterLevels) {\n        // set min/max values for the waterlevel axis\n        // including HDC (+ 1/8 HDC-LDC) and LDC (- 1/4 HDC-LDC)\n        const { LDC, HDC } = this.determineLDCHDC(refWaterLevels);\n        rest = [\n          {\n            waterlevel: HDC + (HDC - LDC) / 8\n          },\n          {\n            waterlevel: Math.max(LDC - (HDC - LDC) / 4, 0)\n          }\n        ];\n      } else {\n        rest = [];\n      }\n      return {\n        // set min/max values for the date axis\n        date: [this.dateFrom, this.dateTo],\n        waterlevel: d3.extent([...this.waterlevels, ...rest], d => d.waterlevel)\n      };\n    },\n    getScale({ dimensions, extent }) {\n      // scaling helpers to convert real world values into pixels\n      const x = d3.scaleTime().range([0, dimensions.width]);\n      const y = d3.scaleLinear().range([dimensions.mainHeight, 0]);\n      const x2 = d3.scaleTime().range([0, dimensions.width]);\n      const y2 = d3.scaleLinear().range([dimensions.navHeight, 0]);\n      const [lo, hi] = extent.waterlevel;\n      // setting the min and max values for the diagram axes\n      const dy = Math.ceil(0.15 * (hi - lo));\n      x.domain(d3.extent(extent.date));\n      y.domain([lo - dy, hi + dy]);\n      x2.domain(x.domain());\n      y2.domain(y.domain());\n\n      return { x, y, x2, y2 };\n    },\n    drawAxes({ diagram, dimensions, axes, navigation }) {\n      diagram\n        .append(\"g\")\n        .attr(\"class\", \"axis--x\")\n        .attr(\"transform\", `translate(0, ${dimensions.mainHeight})`)\n        .call(axes.x)\n        .selectAll(\".tick text\")\n        .attr(\"y\", 15);\n      diagram // label\n        .append(\"text\")\n        .text(this.$gettext(\"Waterlevel [m]\"))\n        .attr(\"text-anchor\", \"middle\")\n        .attr(\n          \"transform\",\n          `translate(-45, ${dimensions.mainHeight / 2}) rotate(-90)`\n        );\n      diagram\n        .append(\"g\")\n        .attr(\"class\", \"axis--y\")\n        .call(axes.y)\n        .selectAll(\".tick text\")\n        .attr(\"x\", -25);\n      diagram\n        .append(\"g\")\n        .attr(\"class\", \"axis--y-right\")\n        .attr(\"transform\", `translate(${dimensions.width})`)\n        .call(axes.yRight)\n        .selectAll(\".tick text\");\n\n      navigation\n        .append(\"g\")\n        .attr(\"class\", \"axis axis--x\")\n        .attr(\"transform\", `translate(0, ${dimensions.navHeight})`)\n        .call(axes.x2);\n\n      return () => {\n        diagram\n          .select(\".axis--x\")\n          .call(axes.x)\n          .selectAll(\".tick text\")\n          .attr(\"y\", 15);\n      };\n    },\n    drawWaterlevelChart({ scale, diagram }) {\n      const waterlevelChartDrawer = () => {\n        let domainLeft = new Date(scale.x.domain()[0].getTime());\n        let domainRight = new Date(scale.x.domain()[1].getTime());\n        domainLeft.setDate(domainLeft.getDate() - 1);\n        domainRight.setDate(domainRight.getDate() + 1);\n\n        let lineChunked = d3\n          .lineChunked()\n          // render only data points that are visible in the current scale\n          .defined(d => d.date > domainLeft && d.date < domainRight)\n          .x(d => scale.x(d.date))\n          .y(d => scale.y(d.waterlevel))\n          .curve(d3.curveLinear)\n          .isNext(this.isNext(scale))\n          .pointAttrs({ r: 1.7 });\n        // to avoid creating empty clip-path element\n        if (this.hasPredictions) {\n          lineChunked\n            .chunk(d => (d.predicted ? \"predicted\" : \"line\"))\n            .chunkDefinitions({ predicted: {} });\n        }\n        return lineChunked;\n      };\n\n      diagram\n        .append(\"g\")\n        .attr(\"class\", \"line\")\n        .datum(this.waterlevels)\n        .call(waterlevelChartDrawer());\n\n      return () => {\n        diagram.select(\".line\").call(waterlevelChartDrawer());\n      };\n    },\n    drawNavigationChart({ scale, navigation }) {\n      let lineChunked = d3\n        .lineChunked()\n        .x(d => scale.x2(d.date))\n        .y(d => scale.y2(d.waterlevel))\n        .curve(d3.curveLinear)\n        .isNext(this.isNext(scale))\n        .pointAttrs({ r: 1.7 });\n      // to avoid creating empty clip-path element\n      if (this.hasPredictions) {\n        lineChunked\n          .chunk(d => (d.predicted ? \"predicted\" : \"line\"))\n          .chunkDefinitions({ predicted: {} });\n      }\n      navigation\n        .append(\"g\")\n        .attr(\"class\", \"line\")\n        .datum(this.waterlevels)\n        .call(lineChunked);\n    },\n    drawNowLines({ scale, extent, diagram, navigation, dimensions }) {\n      const [lo, hi] = extent.waterlevel;\n      const dy = Math.ceil(0.15 * (hi - lo));\n      const nowLine = d3\n        .line()\n        .x(d => scale.x(d.x))\n        .y(d => scale.y(d.y));\n\n      const nowLabel = selection => {\n        selection\n          .attr(\n            \"transform\",\n            `translate(${scale.x(new Date())}, ${scale.y(hi + dy * 0.4)})`\n          )\n          // hide Now label outside the diagram y-axises\n          .attr(\n            \"opacity\",\n            scale.x(new Date()) >= dimensions.width || scale.x(new Date()) <= 0\n              ? 0\n              : 1\n          );\n      };\n\n      // draw in main\n      diagram\n        .append(\"path\")\n        .datum([\n          { x: new Date(), y: lo - dy },\n          { x: new Date(), y: hi + dy * 0.4 }\n        ])\n        .attr(\"class\", \"now-line\")\n        .attr(\"d\", nowLine);\n      diagram // label\n        .append(\"text\")\n        .text(this.$gettext(\"Now\"))\n        .attr(\"class\", \"now-line-label\")\n        .attr(\"text-anchor\", \"middle\")\n        .call(nowLabel);\n\n      // draw in nav\n      navigation\n        .append(\"path\")\n        .datum([\n          { x: new Date(), y: hi + dy },\n          { x: new Date(), y: lo - dy }\n        ])\n        .attr(\"class\", \"now-line\")\n        .attr(\n          \"d\",\n          d3\n            .line()\n            .x(d => scale.x2(d.x))\n            .y(d => scale.y2(d.y))\n        );\n\n      return () => {\n        diagram.select(\".now-line\").attr(\"d\", nowLine);\n        diagram.select(\".now-line-label\").call(nowLabel);\n      };\n    },\n    drawPredictionAreas({ scale, diagram, navigation }) {\n      const predictionArea = isNav =>\n        d3\n          .area()\n          .defined(d => d.predicted && d.min && d.max)\n          .x(d => scale[isNav ? \"x2\" : \"x\"](d.date))\n          .y0(d => scale[isNav ? \"y2\" : \"y\"](d.min))\n          .y1(d => scale[isNav ? \"y2\" : \"y\"](d.max));\n\n      diagram\n        .append(\"path\")\n        .datum(this.waterlevels)\n        .attr(\"class\", \"prediction-area\")\n        .attr(\"d\", predictionArea());\n\n      navigation\n        .append(\"path\")\n        .datum(this.waterlevels)\n        .attr(\"class\", \"prediction-area\")\n        .attr(\"d\", predictionArea(true));\n\n      return () => {\n        diagram.select(\".prediction-area\").attr(\"d\", predictionArea());\n      };\n    },\n    drawRefLines({ refWaterLevels, diagram, scale, dimensions, extent }) {\n      if (refWaterLevels) {\n        const { LDC, HDC } = this.determineLDCHDC(refWaterLevels);\n        // filling area between HDC and LDC if both of them are available\n        if (LDC && HDC) {\n          diagram\n            .append(\"rect\")\n            .attr(\"class\", \"hdc-ldc-area\")\n            .attr(\"x\", 0)\n            .attr(\"y\", scale.y(HDC))\n            .attr(\"width\", dimensions.width)\n            .attr(\"height\", refWaterLevels ? scale.y(LDC) - scale.y(HDC) : 0);\n        }\n      }\n\n      const refWaterlevelLine = d3\n        .line()\n        .x(d => scale.x(d.x))\n        .y(d => scale.y(d.y));\n\n      const levelStyle = name => {\n        if (/HDC/.test(name)) return \"hdc-line\";\n        if (/LDC/.test(name)) return \"ldc-line\";\n        return `${name.toLowerCase()}-line`;\n      };\n\n      for (let ref in refWaterLevels) {\n        if (refWaterLevels[ref]) {\n          diagram\n            .append(\"path\")\n            .datum([\n              { x: 0, y: refWaterLevels[ref] },\n              { x: extent.date[1], y: refWaterLevels[ref] }\n            ])\n            .attr(\"class\", levelStyle(ref))\n            .attr(\"d\", refWaterlevelLine);\n          diagram // label\n            .append(\"rect\")\n            .attr(\"class\", \"ref-waterlevel-label-background\")\n            .attr(\"x\", 1)\n            .attr(\"y\", scale.y(refWaterLevels[ref]) - 13)\n            .attr(\"width\", 55)\n            .attr(\"height\", 12);\n          diagram\n            .append(\"text\")\n            .text(\n              `${ref} (${this.$options.filters.waterlevel(\n                refWaterLevels[ref]\n              )})`\n            )\n            .attr(\"class\", \"ref-waterlevel-label\")\n            .attr(\"x\", 5)\n            .attr(\"y\", scale.y(refWaterLevels[ref]) - 3);\n        }\n      }\n    },\n    drawNashSutcliffe({ hours, diagram, scale, dimensions }) {\n      const coeff = this.nashSutcliffe.coeffs.find(c => c.hours === hours);\n      const dateNow = new Date(this.nashSutcliffe.when);\n      const dateStart = new Date(dateNow.getTime() - hours * 60 * 60 * 1000);\n\n      const nashSutcliffeBox = (hours, date) => {\n        // show/hide boxes depending on scale of chart (hide if > 90 days)\n        diagram\n          .selectAll(\"path.nash-sutcliffe\")\n          .attr(\n            \"stroke-opacity\",\n            scale.x.domain()[1] - scale.x.domain()[0] > 90 * 86400000 ? 0 : 1\n          )\n          // show boxes only if now line in the selected time range\n          .attr(\"opacity\", dimensions.width >= scale.x(date) ? 1 : 0);\n        return d3\n          .area()\n          .x(d => scale.x(d))\n          .y0(() => dimensions.mainHeight + 0.5)\n          .y1(\n            () =>\n              dimensions.mainHeight -\n              Math.floor(0.06 * dimensions.mainHeight) * (hours / 24)\n          );\n      };\n\n      const nashSutcliffeLabel = (label, date, hours) => {\n        let days = hours / 24;\n        label\n          .attr(\"x\", Math.min(scale.x(date), dimensions.width) - 4)\n          .attr(\n            \"y\",\n            dimensions.mainHeight -\n              (Math.floor(0.06 * dimensions.mainHeight) * days + 0.5) +\n              12\n          )\n          // show label only if now line in the selected time range\n          .attr(\"opacity\", dimensions.width >= scale.x(date) ? 1 : 0);\n      };\n\n      if (coeff.samples) {\n        diagram\n          .append(\"path\")\n          .datum([dateStart, dateNow])\n          .attr(\"class\", \"nash-sutcliffe ns\" + hours)\n          .attr(\"d\", nashSutcliffeBox(hours, dateNow));\n        diagram\n          .append(\"text\")\n          .attr(\"class\", \"nash-sutcliffe ns\" + hours)\n          .attr(\"text-anchor\", \"end\")\n          .call(nashSutcliffeLabel, dateNow, hours)\n          .append(\"tspan\")\n          .text(hours + \"h: \")\n          .select(function() {\n            return this.parentNode;\n          })\n          .append(\"tspan\")\n          .text(coeff.value.toFixed(2))\n          .select(function() {\n            return this.parentNode;\n          })\n          .append(\"tspan\")\n          .text(` (${coeff.samples})`);\n      }\n\n      return () => {\n        diagram\n          .select(\"path.nash-sutcliffe.ns\" + hours)\n          .attr(\"d\", nashSutcliffeBox(hours, dateNow));\n        diagram\n          .select(\"text.nash-sutcliffe.ns\" + hours)\n          .call(nashSutcliffeLabel, dateNow, hours);\n      };\n    },\n    createZoom({\n      updaters,\n      eventRect,\n      dimensions,\n      scale,\n      navigation,\n      svg,\n      zoomLevel\n    }) {\n      const brush = d3\n        .brushX()\n        .handleSize(4)\n        .extent([\n          [0, 0],\n          [dimensions.width, dimensions.navHeight]\n        ]);\n\n      const zoom = d3\n        .zoom()\n        .scaleExtent([1, Infinity])\n        .translateExtent([\n          [0, 0],\n          [dimensions.width, dimensions.mainHeight]\n        ])\n        .extent([\n          [0, 0],\n          [dimensions.width, dimensions.mainHeight]\n        ]);\n\n      brush.on(\"brush end\", () => {\n        if (d3.event.sourceEvent && d3.event.sourceEvent.type === \"zoom\")\n          return; // ignore brush-by-zoom\n        let s = d3.event.selection || scale.x2.range();\n        scale.x.domain(s.map(scale.x2.invert, scale.x2));\n        updaters.forEach(u => u && u());\n        this.setInlineStyles(svg);\n        svg\n          .select(\".zoom\")\n          .call(\n            zoom.transform,\n            d3.zoomIdentity\n              .scale(dimensions.width / (s[1] - s[0]))\n              .translate(-s[0], 0)\n          );\n      });\n      let scaleForZoom = t => {\n        scale.x.domain(t.rescaleX(scale.x2).domain());\n        updaters.forEach(u => u && u());\n        this.setInlineStyles(svg);\n        navigation\n          .select(\".brush\")\n          .call(brush.move, scale.x.range().map(t.invertX, t));\n      };\n      zoom.on(\"zoom\", () => {\n        if (d3.event.sourceEvent && d3.event.sourceEvent.type === \"brush\") {\n          return; // ignore zoom-by-brush\n        }\n        let t = d3.event.transform;\n        // set the zoom to the passed zoom level.\n        if (zoomLevel) {\n          let tx = (zoomLevel.x * dimensions.width) / zoomLevel.width;\n          let k = zoomLevel.k;\n          let ty = zoomLevel.y;\n          t = d3.zoomIdentity.translate(tx, ty).scale(k);\n          zoomLevel = null; // avoid to stuck at same zoom level after setting the zoom by subsequent zooming.\n        } else {\n          temp = { ...d3.event.transform, width: dimensions.width };\n        }\n        scaleForZoom(t);\n      });\n      zoom.on(\"start\", () => {\n        svg.select(\".chart-dot\").style(\"opacity\", 0);\n        svg.select(\".chart-tooltip\").style(\"opacity\", 0);\n      });\n      // store the zoom level after zomming is ended\n      zoom.on(\"end\", () => {\n        if (!zoomLevel) {\n          this.zoomStore = temp\n            ? temp\n            : { ...d3.event.transform, width: dimensions.width };\n        }\n      });\n\n      navigation\n        .append(\"g\")\n        .attr(\"class\", \"brush\")\n        .call(brush)\n        .call(brush.move, scale.x.range());\n\n      eventRect.call(zoom);\n    },\n    createTooltips({ eventRect, diagram, scale, dimensions }) {\n      // create clippable container for the dot\n      diagram\n        .append(\"g\")\n        .attr(\"class\", \"chart-dots\")\n        .append(\"circle\")\n        .attr(\"class\", \"chart-dot\")\n        .attr(\"opacity\", 0)\n        .attr(\"r\", 4);\n\n      // create container for the tooltip\n      const tooltip = diagram.append(\"g\").attr(\"class\", \"chart-tooltip\");\n      tooltip\n        .append(\"rect\")\n        .attr(\"rx\", \"0.25em\")\n        .attr(\"ry\", \"0.25em\")\n        .attr(\"width\", \"0px\")\n        .attr(\"height\", \"0px\");\n\n      // create container for multiple text rows\n      const tooltipText = tooltip.append(\"text\").attr(\"text-anchor\", \"middle\");\n\n      // padding inside the tooltip box and diagram padding to determine left\n      // and right offset from the diagram boundaries for the tooltip position.\n      const tooltipPadding = 10;\n      const diagramPadding = 5;\n\n      eventRect\n        .on(\"mouseover\", () => {\n          diagram.select(\".chart-dot\").style(\"opacity\", 1);\n          diagram.select(\".chart-tooltip\").style(\"opacity\", 1);\n        })\n        .on(\"mouseout\", () => {\n          diagram.select(\".chart-dot\").style(\"opacity\", 0);\n          diagram.select(\".chart-tooltip\").style(\"opacity\", 0);\n        })\n        .on(\"mousemove\", () => {\n          // find data point closest to mouse\n          const x0 = scale.x.invert(\n              d3.mouse(document.getElementById(\"zoom-waterlevels\"))[0]\n            ),\n            i = d3.bisector(d => d.date).left(this.waterlevels, x0, 1),\n            d0 = this.waterlevels[i - 1],\n            d1 = this.waterlevels[i] || d0,\n            d = x0 - d0.date > d1.date - x0 ? d1 : d0;\n\n          const coords = {\n            x: scale.x(d.date),\n            y: scale.y(d.waterlevel)\n          };\n\n          // position the dot\n          diagram\n            .select(\".chart-dot\")\n            .style(\"opacity\", 1)\n            .attr(\"transform\", `translate(${coords.x}, ${coords.y})`);\n\n          // remove current texts\n          tooltipText.selectAll(\"tspan\").remove();\n\n          // write date\n          tooltipText\n            .append(\"tspan\")\n            .attr(\"dominant-baseline\", \"hanging\")\n            .attr(\"text-anchor\", \"middle\")\n            .text(\n              d.date.toLocaleString([], {\n                year: \"2-digit\",\n                month: \"2-digit\",\n                day: \"2-digit\",\n                hour: \"2-digit\",\n                minute: \"2-digit\"\n              })\n            );\n\n          if (d.predicted) {\n            tooltipText\n              .append(\"tspan\")\n              .attr(\"x\", 0)\n              .attr(\"y\", 0)\n              .attr(\"dy\", \"1.4em\")\n              .attr(\"dominant-baseline\", \"hanging\")\n              .attr(\"text-anchor\", \"middle\")\n              .text(this.$options.filters.waterlevel(d.max) + \" m\");\n            tooltipText\n              .append(\"tspan\")\n              .attr(\"x\", 0)\n              .attr(\"y\", 0)\n              .attr(\"dy\", \"2.6em\")\n              .attr(\"dominant-baseline\", \"hanging\")\n              .attr(\"text-anchor\", \"middle\")\n              .attr(\"class\", \"font-weight-bold\")\n              .text(this.$options.filters.waterlevel(d.waterlevel) + \" m\");\n            tooltipText\n              .append(\"tspan\")\n              .attr(\"x\", 0)\n              .attr(\"y\", 0)\n              .attr(\"dy\", \"3.8em\")\n              .attr(\"dominant-baseline\", \"hanging\")\n              .attr(\"text-anchor\", \"middle\")\n              .text(this.$options.filters.waterlevel(d.min) + \" m\");\n          } else {\n            tooltipText\n              .append(\"tspan\")\n              .attr(\"x\", 0)\n              .attr(\"y\", 0)\n              .attr(\"dy\", \"1.4em\")\n              .attr(\"dominant-baseline\", \"hanging\")\n              .attr(\"text-anchor\", \"middle\")\n              .attr(\"class\", \"font-weight-bold\")\n              .text(this.$options.filters.waterlevel(d.waterlevel) + \" m\");\n          }\n\n          // get text dimensions\n          const textBBox = tooltipText.node().getBBox();\n\n          diagram\n            .selectAll(\".chart-tooltip text tspan\")\n            .attr(\"x\", textBBox.width / 2 + tooltipPadding)\n            .attr(\"y\", tooltipPadding);\n\n          // position and scale tooltip box\n          const xMax =\n            dimensions.width -\n            (textBBox.width + diagramPadding + tooltipPadding * 2);\n          const tooltipX = Math.max(\n            diagramPadding,\n            Math.min(coords.x - (textBBox.width + tooltipPadding * 2) / 2, xMax)\n          );\n          let tooltipY = coords.y - (textBBox.height + tooltipPadding * 2) - 10;\n          if (coords.y < textBBox.height + tooltipPadding * 2) {\n            tooltipY = coords.y + 10;\n          }\n\n          diagram\n            .select(\".chart-tooltip\")\n            .style(\"opacity\", 1)\n            .attr(\"transform\", `translate(${tooltipX}, ${tooltipY})`)\n            .select(\"rect\")\n            .attr(\"width\", textBBox.width + tooltipPadding * 2)\n            .attr(\"height\", textBBox.height + tooltipPadding * 2);\n        });\n    },\n    isNext(scale) {\n      // Check whether points in the chart can be considered \"next to each other\".\n      // For that they need to be exactly 15 minutes apart (for automatically\n      // imported gauge measurements). If the chart shows more than 15 days then\n      // 1 hour is also valid (for approved gauge measurements).\n      return (prev, current) => {\n        let difference = (current.date - prev.date) / 1000;\n        if ((scale.x.domain()[1] - scale.x.domain()[0]) / 86400000 > 15)\n          return [900, 3600].includes(difference);\n        return difference === 900;\n      };\n    }\n  },\n  created() {\n    this.resizeListenerFunction = debounce(() => {\n      this.zoomStore // restore last zoom level\n        ? this.drawDiagram({ ...this.zoomStore })\n        : this.drawDiagram();\n    }, 100);\n    window.addEventListener(\"resize\", this.resizeListenerFunction);\n  },\n  mounted() {\n    // Nasty but necessary if we don't want to use the updated hook to re-draw\n    // the diagram because this would re-draw it also for irrelevant reasons.\n    // In this case we need to wait for the child component (DiagramLegend) to\n    // render. According to the docs (https://vuejs.org/v2/api/#mounted) this\n    // should be possible with $nextTick() but it doesn't work because it does\n    // not guarantee that the DOM is not only updated but also re-painted on the\n    // screen.\n    setTimeout(this.drawDiagram, 150);\n    this.initialDiagramValues();\n    this.templates[0] = this.defaultTemplate;\n    this.form.template = this.templates[0];\n    this.templateData = this.form.template;\n    HTTP.get(\"/templates/diagram\", {\n      headers: {\n        \"X-Gemma-Auth\": localStorage.getItem(\"token\"),\n        \"Content-type\": \"text/xml; charset=UTF-8\"\n      }\n    })\n      .then(response => {\n        if (response.data.length) {\n          this.templates = response.data;\n          this.form.template = this.templates[0];\n          this.templates[this.templates.length] = this.defaultTemplate;\n          this.applyChange();\n        }\n      })\n      .catch(error => {\n        let message = \"Backend not reachable\";\n        if (error.response) {\n          const { status, data } = error.response;\n          message = `${status}: ${data.message || data}`;\n        }\n        displayError({\n          title: this.$gettext(\"Backend Error\"),\n          message: message\n        });\n      });\n  },\n  destroyed() {\n    window.removeEventListener(\"resize\", this.resizeListenerFunction);\n  }\n};\n</script>\n","import mod from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Waterlevel.vue?vue&type=script&lang=js\"; export default mod; export * from \"-!../../../node_modules/cache-loader/dist/cjs.js??ref--12-0!../../../node_modules/thread-loader/dist/cjs.js!../../../node_modules/babel-loader/lib/index.js!../../../node_modules/cache-loader/dist/cjs.js??ref--0-0!../../../node_modules/vue-loader/lib/index.js??vue-loader-options!./Waterlevel.vue?vue&type=script&lang=js\"","import { render, staticRenderFns } from \"./Waterlevel.vue?vue&type=template&id=b06a2ca0\"\nimport script from \"./Waterlevel.vue?vue&type=script&lang=js\"\nexport * from \"./Waterlevel.vue?vue&type=script&lang=js\"\n\n\n/* normalize component */\nimport normalizer from \"!../../../node_modules/vue-loader/lib/runtime/componentNormalizer.js\"\nvar component = normalizer(\n  script,\n  render,\n  staticRenderFns,\n  false,\n  null,\n  null,\n  null\n  \n)\n\nexport default component.exports","// 22.1.3.6 Array.prototype.fill(value, start = 0, end = this.length)\nvar $export = require('./_export');\n\n$export($export.P, 'Array', { fill: require('./_array-fill') });\n\nrequire('./_add-to-unscopables')('fill');\n","import app from \"@/main\";\nconst localeDateString = {\n  dateTime: \"%a %e %b %X %Y\",\n  date: \"%d/%m/%Y\",\n  time: \"%H:%M:%S\",\n  periods: [app.$gettext(\"AM\"), app.$gettext(\"PM\")],\n  days: [\n    app.$gettext(\"Sunday\"),\n    app.$gettext(\"Monday\"),\n    app.$gettext(\"Tuesday\"),\n    app.$gettext(\"Wednesday\"),\n    app.$gettext(\"Thursday\"),\n    app.$gettext(\"Friday\"),\n    app.$gettext(\"Saturday\")\n  ],\n  shortDays: [\n    app.$gettext(\"Sun\"),\n    app.$gettext(\"Mon\"),\n    app.$gettext(\"Tue\"),\n    app.$gettext(\"Wed\"),\n    app.$gettext(\"Thu\"),\n    app.$gettext(\"Fri\"),\n    app.$gettext(\"Sat\")\n  ],\n  months: [\n    app.$gettext(\"January\"),\n    app.$gettext(\"February\"),\n    app.$gettext(\"March\"),\n    app.$gettext(\"April\"),\n    app.$gettext(\"May\"),\n    app.$gettext(\"June\"),\n    app.$gettext(\"July\"),\n    app.$gettext(\"August\"),\n    app.$gettext(\"September\"),\n    app.$gettext(\"October\"),\n    app.$gettext(\"November\"),\n    app.$gettext(\"December\")\n  ],\n  shortMonths: [\n    app.$gettext(\"Jan\"),\n    app.$gettext(\"Feb\"),\n    app.$gettext(\"Mar\"),\n    app.$gettext(\"Apr\"),\n    app.$gettext(\"May\"),\n    app.$gettext(\"Jun\"),\n    app.$gettext(\"Jul\"),\n    app.$gettext(\"Aug\"),\n    app.$gettext(\"Sep\"),\n    app.$gettext(\"Oct\"),\n    app.$gettext(\"Nov\"),\n    app.$gettext(\"Dec\")\n  ]\n};\n\nexport { localeDateString };\n","/**\n * Returns a function, that, as long as it continues to be invoked, will not\n * be triggered. The function will be called after it stops being called for\n * N milliseconds. If `immediate` is passed, trigger the function on the\n * leading edge, instead of the trailing. The function also has a property 'clear' \n * that is a function which will clear the timer to prevent previously scheduled executions. \n *\n * @source underscore.js\n * @see http://unscriptable.com/2009/03/20/debouncing-javascript-methods/\n * @param {Function} function to wrap\n * @param {Number} timeout in ms (`100`)\n * @param {Boolean} whether to execute at the beginning (`false`)\n * @api public\n */\nfunction debounce(func, wait, immediate){\n  var timeout, args, context, timestamp, result;\n  if (null == wait) wait = 100;\n\n  function later() {\n    var last = Date.now() - timestamp;\n\n    if (last < wait && last >= 0) {\n      timeout = setTimeout(later, wait - last);\n    } else {\n      timeout = null;\n      if (!immediate) {\n        result = func.apply(context, args);\n        context = args = null;\n      }\n    }\n  };\n\n  var debounced = function(){\n    context = this;\n    args = arguments;\n    timestamp = Date.now();\n    var callNow = immediate && !timeout;\n    if (!timeout) timeout = setTimeout(later, wait);\n    if (callNow) {\n      result = func.apply(context, args);\n      context = args = null;\n    }\n\n    return result;\n  };\n\n  debounced.clear = function() {\n    if (timeout) {\n      clearTimeout(timeout);\n      timeout = null;\n    }\n  };\n  \n  debounced.flush = function() {\n    if (timeout) {\n      result = func.apply(context, args);\n      context = args = null;\n      \n      clearTimeout(timeout);\n      timeout = null;\n    }\n  };\n\n  return debounced;\n};\n\n// Adds compatibility for ES modules\ndebounce.debounce = debounce;\n\nmodule.exports = debounce;\n","const defaultDiagramTemplate = {\n  name: \"Default\",\n  properties: {\n    paperSize: \"a4\"\n  },\n  elements: [\n    {\n      type: \"diagramtitle\",\n      position: \"topleft\",\n      offset: { x: 74, y: 25 },\n      fontsize: 20,\n      color: \"steelblue\"\n    },\n    {\n      type: \"diagram\",\n      position: \"topleft\",\n      offset: { x: 24, y: 40 },\n      width: 248,\n      height: 119\n    },\n    {\n      type: \"diagramlegend\",\n      position: \"topleft\",\n      offset: { x: 44, y: 167 },\n      color: \"black\"\n    }\n  ]\n};\n\nexport { defaultDiagramTemplate };\n"],"sourceRoot":""}