{"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":""}