{"version":3,"sources":["webpack:///./node_modules/v-money/dist/v-money.js","webpack:///./node_modules/vue-frag/dist/frag.esm.js","webpack:///./node_modules/chart.js/dist/chart.esm.js","webpack:///./node_modules/chartjs-plugin-datalabels/dist/chartjs-plugin-datalabels.esm.js","webpack:///./node_modules/chart.js/dist/chunks/helpers.segment.js"],"names":["e","t","module","exports","this","r","n","i","l","call","m","c","d","o","Object","defineProperty","configurable","enumerable","get","__esModule","default","prototype","hasOwnProperty","p","s","a","prefix","suffix","thousands","decimal","precision","u","value","tagName","toLocaleUpperCase","getElementsByTagName","length","oninput","selectionEnd","Math","max","b","dispatchEvent","onfocus","arguments","toFixed","indexOf","split","f","parseFloat","replace","min","pow","toString","setSelectionRange","document","activeElement","setTimeout","createEvent","initEvent","keys","map","directive","component","window","Vue","use","name","props","required","type","Number","String","masked","Boolean","directives","money","data","formattedValue","watch","immediate","handler","$props","methods","change","$emit","target","concat","reduce","options","render","staticRenderFns","_scopeId","computed","forEach","esModule","$createElement","_self","_c","rawName","expression","staticClass","attrs","domProps","on","getChildNodes","$placeholder","Symbol","$fakeParent","nextSiblingPatched","childNodesPatched","isFrag","node","patchParentNode","fakeParent","parentElement","patchNextSibling","childNodes","parentNode","index","getTopFragment","fromParent","_node","getChildNodesWithFragments","childNodesDescriptor","getOwnPropertyDescriptor","Node","realChildNodes","apply","Array","from","childNode","filter","patchChildNodes","defineProperties","frag","firstChild","hasChildNodes","before","_this$frag$","remove","removed","splice","getFragmentLeafNodes","children","_Array$prototype","addPlaceholder","insertBeforeNode","placeholder","unshift","removeChild","hasChildInFragment","_this$frag$splice","removedNode","hasChild","insertBefore","insertNode","_this","insertNodes","_frag","_lastNode","push","after","removePlaceholder","includes","append","lastNode","appendChild","lastChild","shift","inserted","element","nextSibling","previousSibling","createComment","fragment","createDocumentFragment","replaceWith","assign","set","htmlString","_this2","slice","child","domify","createElement","innerHTML","unbind","h","$slots","Animator","_request","_charts","Map","_running","_lastDate","undefined","chart","anims","date","callbacks","listeners","numSteps","duration","fn","initial","currentStep","start","me","_update","_refresh","Date","now","remaining","running","items","item","draw","_active","_total","tick","pop","_notify","charts","complete","progress","event","cb","_getAnims","acc","cur","_duration","cancel","delete","animator","transparent","interpolators","to","factor","c0","c1","valid","mix","hexString","Animation","cfg","prop","currentValue","_fn","_easing","easing","linear","_start","floor","delay","_loop","loop","_target","_prop","_from","_to","_promises","elapsed","remain","promises","Promise","res","rej","resolved","method","numbers","colors","animationOptions","animation","describe","_fallback","_indexable","_scriptable","properties","active","resize","show","animations","visible","hide","v","Animations","config","_chart","_properties","configure","animatedProps","getOwnPropertyNames","key","option","has","values","newOptions","resolveTargetOptions","_createAnimations","$shared","awaitAll","$animations","then","charAt","_animateOptions","update","size","add","anim","wait","all","scaleClip","scale","allowedOverflow","opts","reverse","end","defaultClip","xScale","yScale","x","y","top","right","bottom","left","toClip","disabled","getSortedDatasetIndices","filterVisible","metasets","_getSortedDatasetMetas","ilen","applyStack","stack","dsIndex","singleMode","mode","datasetIndex","otherValue","convertObjectDataToArray","adata","isStacked","meta","stacked","getStackKey","indexScale","valueScale","id","getUserBounds","minDefined","maxDefined","NEGATIVE_INFINITY","POSITIVE_INFINITY","getOrCreateStack","stacks","stackKey","indexValue","subStack","getLastIndexInStack","vScale","positive","getMatchingVisibleMetas","updateStacks","controller","parsed","_cachedMeta","_stacks","iScale","iAxis","axis","vAxis","itemStacks","_top","_bottom","getFirstScaleId","scales","createDatasetContext","parent","create","dataset","createDataContext","dataIndex","raw","clearStacks","_parsed","isDirectUpdateMode","cloneIfNotShared","cached","shared","DatasetController","_ctx","ctx","_cachedDataOpts","getMeta","_type","_parsing","_data","_objectData","_sharedOptions","_drawStart","_drawCount","enableOptionSharing","$context","_syncList","initialize","linkScales","_stacked","addElements","getDataset","chooseId","xid","xAxisID","yid","yAxisID","rid","rAxisID","indexAxis","iid","iAxisID","vid","vAxisID","getScaleForId","rScale","datasets","getDatasetMeta","scaleID","isExtensible","_dataCheck","datasetElementType","resetNewElements","stackChanged","oldStacked","_resyncElements","scopeKeys","datasetScopeKeys","scopes","getOptionScopes","createResolver","getContext","parsing","count","sorted","_sorted","prev","parseArrayData","parseObjectData","parsePrimitiveData","isNotInOrderComparedToPrev","labels","getLabels","singleScale","parse","xAxisKey","yAxisKey","range","parsedValue","NaN","canStack","otherScale","_getOtherScale","otherMin","otherMax","_skip","updateRangeFromParsed","getParsed","label","getLabelForValue","_clip","clip","getMaxOverflow","elements","area","chartArea","hidden","resolveDatasetElementOptions","resolveDataElementOptions","context","_resolveElementOptions","dataElementType","elementType","cache","cacheKey","sharing","datasetElementScopeKeys","prefixes","names","resolveNamedOptions","freeze","transition","datasetAnimationScopeKeys","_cacheable","sharedOptions","_animationsDisabled","_resolveAnimations","getStyle","getSharedOptions","_setStyle","arg1","arg2","numMeta","numData","_insertElements","_removeElements","move","arr","updateElements","args","_sync","getAllScaleValues","_cache","$bar","metas","getAllParsedValues","sort","computeMinSampleSize","curr","_length","updateMinAndPrev","abs","getPixelForValue","ticks","getPixelForTick","computeFitCategoryTraits","ruler","stackCount","thickness","barThickness","ratio","categoryPercentage","barPercentage","chunk","pixels","computeFlexCategoryTraits","next","percent","parseFloatBar","entry","startValue","endValue","barStart","barEnd","_custom","parseValue","parseArrayOrPrimitive","isFloatBar","custom","barSign","actualBase","isHorizontal","borderProps","horizontal","base","setBorderSkipped","edge","borderSkipped","enableBorderRadius","parseEdge","swap","startEnd","orig","v1","v2","defaults","BarController","iAxisKey","vAxisKey","obj","super","bars","reset","getBasePixel","_getRuler","firstOpts","includeOptions","updateSharedOptions","vpixels","head","_calculateBarValuePixels","ipixels","_calculateBarIndexPixels","center","height","width","updateElement","last","grouped","val","isNaN","_getStacks","_startPixel","_endPixel","_getStackCount","baseValue","minBarLength","floating","getDataVisibility","halfGrid","getLineWidthForValue","skipNull","maxBarThickness","Infinity","stackIndex","_getStackIndex","rects","overrides","_index_","offset","grid","_value_","beginAtZero","BubbleController","points","point","iPixel","getPixelForDecimal","vPixel","skip","radius","getRatioAndOffset","rotation","circumference","cutout","ratioX","ratioY","offsetX","offsetY","startAngle","endAngle","startX","cos","startY","sin","endX","endY","calcMax","angle","calcMin","maxX","maxY","minX","minY","plugins","tooltip","DoughnutController","innerRadius","outerRadius","isDatasetVisible","_getRotation","_getCircumference","arcs","spacing","getMaxBorderWidth","getMaxOffset","maxSize","chartWeight","_getRingWeight","_getRotationExtents","maxWidth","maxHeight","maxRadius","radiusLength","_getVisibleDatasetWeightTotal","total","calculateTotal","_getRingWeightOffset","animateRotate","calculateCircumference","animationOpts","centerX","centerY","animateScale","_circumference","arc","metaData","locale","borderAlign","borderWidth","hoverBorderWidth","hoverOffset","ringWeightOffset","weight","descriptors","aspectRatio","legend","pointStyle","style","text","fillStyle","backgroundColor","strokeStyle","borderColor","lineWidth","legendItem","toggleDataVisibility","tooltipItem","dataLabel","LineController","line","_dataset","animationsDisabled","getStartAndCountOfVisiblePoints","scaleRangesChanged","_datasetIndex","_decimated","showLine","segment","animated","spanGaps","maxGapLength","directUpdate","prevParsed","nullData","stop","border","firstPoint","lastPoint","updateControlPoints","pointCount","lo","hi","_scaleRanges","newRanges","xmin","xmax","ymin","ymax","changed","PolarAreaController","_updateRadius","minSize","cutoutPercentage","getVisibleDatasetCount","xCenter","yCenter","datasetStartAngle","getIndexAngle","defaultAngle","countVisibleElements","_computeAngle","getDistanceFromCenterForValue","angleLines","display","circular","pointLabels","PieController","RadarController","_fullLoop","pointPosition","getPointPositionForValue","fill","ScatterController","interaction","abstract","Error","DateAdapter","format","timestamp","amount","unit","weekday","override","members","adapters","_date","getRelativePosition","evaluateAllVisibleItems","getSortedVisibleDatasetMetas","j","jlen","binarySearch","metaset","intersect","lookupMethod","_reversePixels","el","getRange","optimizedEvaluateItems","position","getDistanceMetricForAxis","useX","useY","pt1","pt2","deltaX","deltaY","sqrt","getIntersectItems","useFinalPosition","_minPadding","evaluationFunc","inRange","getNearestItems","distanceMetric","minDistance","getCenterPoint","distance","getAxisItems","rangeMethod","intersectsItem","Interaction","modes","STATIC_POSITIONS","filterByPosition","array","pos","filterDynamicPositionByAxis","box","sortByWeight","v0","wrapBoxes","boxes","layoutBoxes","stackWeight","buildStacks","layouts","wrap","_stack","placed","setLayoutDims","params","vBoxMaxWidth","hBoxMaxHeight","layout","fullSize","availableWidth","availableHeight","buildLayoutBoxes","centerHorizontal","centerVertical","leftAndTop","rightAndBottom","vertical","getCombinedMax","maxPadding","updateMaxPadding","boxPadding","updateDims","getPadding","newWidth","outerWidth","newHeight","outerHeight","widthChanged","w","heightChanged","same","other","handleMaxPadding","updatePos","getMargins","marginForPositions","positions","margin","fitBoxes","refitBoxes","refit","setBoxDims","placeBoxes","userPadding","padding","_layers","z","layoutItem","minPadding","verticalBoxes","horizontalBoxes","beforeLayout","visibleVerticalBoxCount","BasePlatform","canvas","listener","BasicPlatform","EXPANDO_KEY","EVENT_TYPES","touchstart","touchmove","touchend","pointerenter","pointerdown","pointermove","pointerup","pointerleave","pointerout","isNullOrEmpty","initCanvas","renderHeight","getAttribute","renderWidth","boxSizing","displayWidth","displayHeight","eventListenerOptions","passive","addListener","addEventListener","removeListener","removeEventListener","fromNativeEvent","native","createAttachObserver","container","observer","MutationObserver","entries","addedNodes","added","observe","childList","subtree","createDetachObserver","removedNodes","drpListeningCharts","oldDevicePixelRatio","onWindowResize","dpr","devicePixelRatio","currentDevicePixelRatio","listenDevicePixelRatioChanges","unlistenDevicePixelRatioChanges","createResizeObserver","clientWidth","ResizeObserver","contentRect","releaseObserver","disconnect","createProxyAndListen","proxy","DomPlatform","removeAttribute","setAttribute","proxies","$proxies","handlers","attach","detach","isConnected","_detectPlatform","OffscreenCanvas","Element","getProps","final","ret","defaultRoutes","formatters","tickValue","notation","delta","maxTick","calculateDelta","logDelta","numDecimal","minimumFractionDigits","maximumFractionDigits","numeric","Ticks","autoSkip","tickOpts","ticksLimit","maxTicksLimit","determineMaxTicks","majorIndices","major","enabled","getMajorIndices","numMajorIndices","first","newTicks","skipMajors","calculateSpacing","avgMajorSpacing","round","tickLength","_tickSize","maxScale","maxChart","_maxLength","evenMajorSpacing","getEvenSpacing","factors","result","ceil","majorStart","majorEnd","len","diff","bounds","grace","drawBorder","drawOnChartArea","drawTicks","tickWidth","tickColor","color","borderDash","borderDashOffset","title","minRotation","maxRotation","mirror","textStrokeWidth","textStrokeColor","autoSkipPadding","labelOffset","callback","minor","align","crossAlign","showLabelBackdrop","backdropColor","backdropPadding","route","startsWith","reverseAlign","offsetFromEdge","sample","numItems","increment","getPixelForGridLine","offsetGridLines","validIndex","epsilon","lineValue","garbageCollect","caches","gc","gcLen","getTickMarkLength","getTitleHeight","fallback","font","lines","lineHeight","createScaleContext","createTickContext","titleAlign","titleArgs","titleX","titleY","positionAxisID","Scale","_margins","paddingTop","paddingBottom","paddingLeft","paddingRight","labelRotation","_range","_gridLineItems","_labelItems","_labelSizes","_longestTextCache","_userMax","_userMin","_suggestedMax","_suggestedMin","_ticksLength","_borderValue","_dataLimitsCached","setContext","suggestedMin","suggestedMax","getMinMax","xLabels","yLabels","beforeUpdate","margins","sampleSize","beforeSetDimensions","setDimensions","afterSetDimensions","beforeDataLimits","determineDataLimits","afterDataLimits","beforeBuildTicks","buildTicks","afterBuildTicks","samplingEnabled","_convertTicksToLabels","beforeCalculateLabelRotation","calculateLabelRotation","afterCalculateLabelRotation","source","beforeFit","fit","afterFit","afterUpdate","startPixel","endPixel","reversePixels","_alignToPixels","alignToPixels","notifyPlugins","_callHooks","beforeTickToLabelConversion","afterTickToLabelConversion","numTicks","maxLabelDiagonal","_isVisible","labelSizes","_getLabelSizes","maxLabelWidth","widest","maxLabelHeight","highest","asin","titleOpts","gridOpts","titleHeight","tickPadding","angleRadians","labelHeight","labelWidth","_calculatePadding","_handleMargins","isRotated","labelsBelowTicks","offsetLeft","offsetRight","generateTickLabels","_computeLabelSizes","widths","heights","tickFont","fontString","nestedLabel","widestLabelSize","highestLabelSize","_resolveTickFontOptions","string","valueAt","idx","pixel","getBaseValue","optionTicks","rot","ticksLength","tl","borderOpts","axisWidth","axisHalfWidth","alignBorderValue","borderValue","alignedLineValue","tx1","ty1","tx2","ty2","x1","y1","x2","y2","limit","step","optsAtIndex","lineColor","tickBorderDash","tickBorderDashOffset","tickAndPadding","hTickAndPadding","textAlign","lineCount","textOffset","textBaseline","_getXAxisLabelAlignment","_getYAxisLabelAlignment","halfCount","strokeColor","strokeWidth","backdrop","labelPadding","translation","save","fillRect","restore","findIndex","_computeGridLineItems","drawLine","p1","p2","setLineDash","lineDashOffset","beginPath","moveTo","lineTo","stroke","lastLineWidth","_computeLabelArea","_computeLabelItems","drawBackground","drawGrid","drawTitle","drawLabels","tz","gz","axisID","fontSize","TypedRegistry","scope","isPrototypeOf","proto","getPrototypeOf","parentScope","isIChartComponent","register","registerDefaults","itemDefaults","routeDefaults","routes","property","propertyParts","sourceName","sourceScope","join","parts","targetName","targetScope","Registry","controllers","_typedRegistries","_each","_get","typedRegistry","arg","reg","_getRegistryForType","isForType","_exec","itemReg","registry","camelMethod","PluginService","_init","hook","_createDescriptors","_descriptors","descriptor","plugin","cancelable","_oldCache","_notifyStateChanges","allPlugins","createDescriptors","previousDescriptors","some","getPlugin","local","getOpts","pluginOpts","pluginScopeKeys","scriptable","indexable","allKeys","getIndexAxis","datasetDefaults","datasetOptions","getAxisFromDefaultScaleID","getDefaultScaleIDFromAxis","axisFromPosition","determineAxis","scaleOptions","toLowerCase","mergeScaleConfig","chartDefaults","configScales","chartIndexAxis","firstIDs","scaleConf","defaultId","defaultScaleOptions","defaultID","initOptions","initData","initConfig","keyCache","keysCached","Set","cachedKeys","generate","addIfFound","Config","_config","_scopeCache","_resolverCache","platform","clearCache","clear","datasetType","additionalOptionScopes","mainScope","resetCache","keyLists","_cachedScopes","resolver","subPrefixes","getResolver","needContext","subResolver","descriptorDefaults","resolverCache","isScriptable","isIndexable","version","KNOWN_POSITIONS","positionIsHorizontal","compare2Level","l1","l2","onAnimationsComplete","onComplete","onAnimationProgress","onProgress","getCanvas","getElementById","instances","getChart","Chart","userConfig","initialCanvas","existingChart","chartOptionScopes","acquireContext","_options","_aspectRatio","_metasets","_lastEvent","_listeners","_responsiveListeners","_sortedMetasets","_plugins","_hiddenIndices","attached","_doResize","resizeDelay","listen","_initialize","console","error","maintainAspectRatio","responsive","bindEvents","_resizeBeforeDraw","_resize","newSize","getMaximumSize","newRatio","getDevicePixelRatio","onResize","scalesOptions","axisOptions","scaleOpts","updated","isRadial","dposition","dtype","scaleType","scaleClass","getScale","init","hasUpdated","addBox","_destroyDatasetMeta","newControllers","_removeUnreferencedMetasets","order","updateIndex","ControllerClass","getController","getElement","_updateMetasets","_resetElements","removeBox","animsDisabled","ensureScalesHaveIDs","buildOrUpdateScales","existingEvents","newEvents","events","unbindEvents","invalidate","buildOrUpdateControllers","buildOrUpdateElements","_updateLayout","_updateDatasets","_eventHandler","noArea","_idx","isFunction","_updateDataset","layers","_drawDatasets","_drawDataset","useClip","setDatasetVisibility","_updateVisibility","_destroy","releaseContext","toDataURL","bindUserEvents","bindResponsiveEvents","_add","_remove","detached","isAttached","activeElements","lastActive","_updateHoverStyles","notify","replay","hoverOptions","hover","deactivated","activated","updateHoverStyle","eventFilter","_handleEvent","lastEvent","getElementsAtEventForMode","onHover","onClick","invalidatePlugins","clipArc","pixelMargin","angleMargin","closePath","toRadiusCorners","parseBorderRadius$1","angleDelta","borderRadius","halfThickness","innerLimit","computeOuterLimit","outerArcLimit","outerStart","outerEnd","innerStart","innerEnd","rThetaToXY","theta","pathArc","innerR","spacingOffset","alpha","noSpacingInnerRadius","noSpacingOuterRadius","avNogSpacingRadius","adjustedAngle","beta","angleOffset","outerStartAdjustedRadius","outerEndAdjustedRadius","outerStartAdjustedAngle","outerEndAdjustedAngle","innerStartAdjustedRadius","innerEndAdjustedRadius","innerStartAdjustedAngle","innerEndAdjustedAngle","pCenter","p4","PI","p8","drawArc","fullCircles","drawFullCircleBorders","inner","lineJoin","unregister","ArcElement","chartX","chartY","rAdjust","betweenAngles","withinRadius","halfAngle","halfRadius","radiusOffset","translate","setStyle","lineCap","borderCapStyle","borderJoinStyle","previous","getLineMethod","stepped","tension","cubicInterpolationMode","pathVars","paramsStart","paramsEnd","segmentStart","segmentEnd","outside","pathSegment","lineMethod","fastPathSegment","prevX","lastY","avgX","countX","pointIndex","drawX","truncX","_getSegmentMethod","useFastPath","_getInterpolationMethod","strokePathWithCache","path","_path","Path2D","strokePathDirect","segments","segmentMethod","usePath2D","LineElement","_points","_segments","_pointsUpdated","_interpolate","interpolated","inRange$1","hitRadius","capBezierPoints","PointElement","mouseX","mouseY","hoverRadius","getBarBounds","bar","half","skipOrLimit","parseBorderWidth","maxW","maxH","parseBorderRadius","maxR","enableBorder","topLeft","topRight","bottomLeft","bottomRight","boundingRects","outer","skipX","skipY","skipBoth","hasRadius","addNormalRectPath","rect","inflateRect","refRect","BarElement","addRectPath","inflateAmount","WeakMap","positioners","hasValue","tooltipPosition","eventPosition","nearestElement","tp","pushOrConcat","toPush","splitNewlines","str","createTooltipItem","getLabelAndValue","getTooltipSize","body","footer","boxWidth","boxHeight","bodyFont","titleFont","footerFont","titleLineCount","footerLineCount","bodyLineItemCount","combinedBodyLength","bodyItem","beforeBody","afterBody","titleSpacing","titleMarginBottom","bodyLineHeight","displayColors","bodySpacing","footerMarginTop","footerSpacing","widthPadding","maxLineWidth","measureText","determineYAlign","doesNotFitWithAlign","xAlign","caret","caretSize","caretPadding","determineXAlign","yAlign","chartWidth","determineAlignment","alignX","alignY","paddingAndSize","getBackgroundPoint","alignment","cornerRadius","radiusAndPadding","getAlignedX","getBeforeAfterBodyLines","createTooltipContext","tooltipItems","overrideCallbacks","Tooltip","opacity","_eventPosition","_size","_cachedAnimations","_tooltipItems","dataPoints","caretX","caretY","labelColors","labelPointStyles","labelTextColors","beforeTitle","afterTitle","bodyItems","scoped","beforeLabel","afterLabel","beforeFooter","afterFooter","itemSort","labelColor","labelPointStyle","labelTextColor","_createItems","getTitle","getBeforeBody","getBody","getAfterBody","getFooter","positionAndSize","backgroundPoint","external","tooltipPoint","caretPosition","getCaretPosition","x3","y3","ptX","ptY","pt","rtlHelper","rtl","titleColor","fillText","colorX","rtlColorX","yOffSet","colorY","usePointStyle","drawOptions","leftForLtr","multiKeyBackground","outerX","innerX","xPlus","strokeRect","bodyAlign","xLinePadding","fillLineOfText","bodyAlignForCalculation","textColor","bodyColor","_drawColorBox","footerAlign","footerColor","tooltipSize","drawCaret","quadraticCurveTo","animX","animY","_updateAnimationTarget","hasTooltipContent","globalAlpha","textDirection","drawBody","drawFooter","positionChanged","_positionChanged","addIfString","findOrAddLabel","lastIndexOf","CategoryScale","_startValue","_valueRange","isFinite","getDecimalForPixel","generateTicks$1","generationOptions","dataRange","MIN_SPACING","maxTicks","maxDigits","includeBounds","maxSpaces","rmin","rmax","countDefined","minSpacing","niceMin","niceMax","numSpaces","decimalPlaces","relativeLabelSize","rad","LinearScaleBase","_endValue","setMin","setMax","minSign","maxSign","MAX_SAFE_INTEGER","MIN_SAFE_INTEGER","stepSize","computeTickLimit","getTickLimit","numericGeneratorOptions","_maxDigits","LinearScale","handleTickRangeOptions","isMajor","tickVal","generateTicks","endExp","endSignificand","exp","significand","lastTick","LogarithmicScale","_zero","getTickBackdropHeight","measureLabelSize","determineLimits","fitWithPointLabels","furthestLimits","furthestAngles","valueCount","getPointLabelContext","getPointPosition","drawingArea","plFont","textSize","_pointLabels","hLimits","vLimits","_setReductions","_pointLabelItems","buildPointLabelItems","tickBackdropHeight","outerDistance","extra","pointLabelPosition","yForAngle","getTextAlignForAngle","leftForTextAlign","drawPointLabels","labelCount","pathRadiusLine","drawRadiusLine","gridLineOpts","numberOrZero","param","createPointLabelContext","logarithmic","RadialLinearScale","setCenterPoint","largestPossibleRadius","radiusReductionLeft","radiusReductionRight","radiusReductionTop","radiusReductionBottom","leftMovement","rightMovement","topMovement","bottomMovement","maxRight","maxLeft","maxTop","maxBottom","angleMultiplier","scalingFactor","scaledDistance","pointLabel","distanceFromCenter","rotate","animate","INTERVALS","millisecond","common","steps","second","minute","hour","day","week","month","quarter","year","UNITS","sorter","input","adapter","_adapter","parser","isoWeekday","_parseOpts","startOf","determineUnitForAutoTicks","minUnit","capacity","interval","determineUnitForFormatting","determineMajorUnit","addTick","time","timestamps","setMajorTicks","majorUnit","ticksFromTimestamps","TimeScale","_unit","_majorUnit","_offsets","_normalized","displayFormats","formats","normalized","_applyBounds","_getLabelBounds","endOf","getLabelTimestamps","timeOpts","_generate","_getLabelCapacity","initOffsets","getDecimalForValue","hasWeekday","getDataTimestamps","tooltipFormat","datetime","minorFormat","majorFormat","formatter","_tickFormatFunction","offsets","ticksOpts","tickLabelWidth","cosRotation","sinRotation","tickFontSize","exampleTime","exampleLabel","_getLabelSize","normalize","interpolate","table","prevSource","nextSource","prevTarget","nextTarget","span","TimeSeriesScale","_table","_minPos","_tableRange","_getTimestampsForTable","buildLookupTable","screen","deviceXDPI","logicalXDPI","utils","toTextLines","inputs","isArray","bound","arrayDiff","a0","a1","updates","rasterize","orient","origin","x0","y0","dx","dy","ln","aligned","vx","vy","R_INSIDE","R_LEFT","R_RIGHT","R_BOTTOM","R_TOP","region","clipped","r0","r1","compute$1","anchor","clamp","rx","ry","sx","sy","model","th","tw","tx","ty","frame","getScaleOrigin","getPositioner","drawRoundedRect","HALF_PI","drawFrame","bgColor","textGeometry","drawTextLine","shadow","shadowBlur","stroked","strokeText","filled","drawText","textShadowBlur","shadowColor","textShadowColor","Label","_index","_model","_rects","_el","_modelize","positioner","geometry","MIN_INTEGER","MAX_INTEGER","rotated","cx","cy","projected","dp","toAxis","p0","HitBox","_rotation","_rect","coordinates","vs","collide","collider","s0","s1","$layout","_visible","_box","intersects","compute","state","Proxy","h0","_hidable","h1","contains","pr0","pr1","axes","prepare","_set","sa","sb","dirty","lookup","klen","k","family","DEFAULT_KEY","datalabels","configs","_key","callback$1","groups","$groups","_dirty","dispatchMoveEvents","enter","leave","handleMoveEvents","expando","_labels","_hovered","handleClickEvents","click","beforeInit","_actives","_listened","_datasets","afterDatasetUpdate","merger","afterDatasetsDraw","beforeEvent","afterEvent","actives","getActiveElements","requestAnimFrame","requestAnimationFrame","throttled","thisArg","updateFn","updateArgs","ticking","rest","debounce","timeout","clearTimeout","_toLeftRightCenter","_alignStartEnd","_textX","check","noop","uid","isNullOrUndef","substr","isObject","isNumberFinite","finiteOrDefault","defaultValue","valueOrDefault","toPercentage","dimension","endsWith","toDimension","each","loopable","_elementsEqual","clone$1","isValidKey","_merger","tval","sval","merge","sources","mergeIf","_mergerIf","emptyString","dot","indexOfDotOrLength","resolveObjectKey","_capitalize","toUpperCase","defined","setsEqual","TAU","PITAU","INFINITY","RAD_PER_DEG","QUARTER_PI","TWO_THIRDS_PI","log10","sign","niceNum","roundedRange","almostEquals","niceRange","fraction","niceFraction","_factorize","isNumber","almostWhole","rounded","_setMinAndMaxByKey","toRadians","degrees","toDegrees","radians","_decimalPlaces","getAngleFromPoint","centrePoint","anglePoint","distanceFromXCenter","distanceFromYCenter","radialDistanceFromCenter","atan2","distanceBetweenPoints","_angleDiff","_normalizeAngle","_angleBetween","sameAngleIsFullCircle","angleToStart","angleToEnd","startToAngle","endToAngle","_limitValue","_int16Range","atEdge","elasticIn","elasticOut","effects","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInElastic","easeOutElastic","easeInBounce","easeOutBounce","easeInOutBounce","0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F","hex","h2","eq","isShort","g","hexParse","lim","p2b","n2b","b2n","n2p","RGB_RE","rgbParse","exec","rgbString","HUE_RE","hsl2rgbn","hsv2rgbn","hwb2rgbn","rgb","rgb2hsl","calln","hsl2rgb","hwb2rgb","hsv2rgb","hue","hueParse","deg","hslString","map$1","Z","Y","X","W","V","U","T","S","R","Q","P","O","N","M","L","K","G","H","I","J","OiceXe","antiquewEte","aqua","aquamarRe","azuY","beige","bisque","black","blanKedOmond","Xe","XeviTet","bPwn","burlywood","caMtXe","KartYuse","KocTate","cSO","cSnflowerXe","cSnsilk","crimson","cyan","xXe","xcyan","xgTMnPd","xWay","xgYF","xgYy","xkhaki","xmagFta","xTivegYF","xSange","xScEd","xYd","xsOmon","xsHgYF","xUXe","xUWay","xUgYy","xQe","xviTet","dAppRk","dApskyXe","dimWay","dimgYy","dodgerXe","fiYbrick","flSOwEte","foYstWAn","fuKsia","gaRsbSo","ghostwEte","gTd","gTMnPd","Way","gYF","gYFLw","gYy","honeyMw","hotpRk","RdianYd","Rdigo","ivSy","khaki","lavFMr","lavFMrXsh","lawngYF","NmoncEffon","ZXe","ZcSO","Zcyan","ZgTMnPdLw","ZWay","ZgYF","ZgYy","ZpRk","ZsOmon","ZsHgYF","ZskyXe","ZUWay","ZUgYy","ZstAlXe","ZLw","lime","limegYF","lRF","magFta","maPon","VaquamarRe","VXe","VScEd","VpurpN","VsHgYF","VUXe","VsprRggYF","VQe","VviTetYd","midnightXe","mRtcYam","mistyPse","moccasR","navajowEte","navy","Tdlace","Tive","TivedBb","Sange","SangeYd","ScEd","pOegTMnPd","pOegYF","pOeQe","pOeviTetYd","papayawEp","pHKpuff","peru","pRk","plum","powMrXe","purpN","YbeccapurpN","Yd","Psybrown","PyOXe","saddNbPwn","sOmon","sandybPwn","sHgYF","sHshell","siFna","silver","skyXe","UXe","UWay","UgYy","snow","sprRggYF","stAlXe","tan","teO","tEstN","tomato","Qe","viTet","JHt","wEte","wEtesmoke","Lw","LwgYF","unpack","unpacked","tkeys","ok","nk","parseInt","names$1","nameParse","modHSL","tmp","clone","fromObject","functionParse","Color","_rgb","_valid","c2","w2","w1","index_esm","isPatternOrGradient","CanvasGradient","CanvasPattern","getHoverColor","saturate","darken","getScope$1","root","Defaults","hoverBackgroundColor","hoverBorderColor","hoverColor","scopeObject","targetScopeObject","privateName","writable","toFontString","_measureText","longest","textWidth","_longestText","arrayOfThings","thing","nestedThing","_alignPixel","halfWidth","clearCanvas","resetTransform","clearRect","drawPoint","xOffset","yOffset","drawImage","SQRT1_2","_isPointInArea","clipArea","unclipArea","_steppedLineTo","flip","midpoint","_bezierCurveTo","bezierCurveTo","cp1x","cp2x","cp1y","cp2y","renderText","setRenderOpts","decorateText","strikethrough","underline","metrics","actualBoundingBoxLeft","actualBoundingBoxRight","actualBoundingBoxAscent","actualBoundingBoxDescent","yDecoration","decorationWidth","addRoundedRectPath","LINE_HEIGHT","RegExp","FONT_STYLE","toLineHeight","matches","match","_readValueToProps","objProps","read","toTRBL","toTRBLCorners","toPadding","toFont","warn","resolve","info","cacheable","_addGrace","minmax","_lookup","cmp","mid","_lookupByKey","_rlookupByKey","_filterBetween","arrayEvents","listenArrayEvents","_chartjs","object","unlistenArrayEvents","stub","_arrayUnique","_createResolver","rootScopes","getTarget","_resolve","toStringTag","_scopes","_rootScopes","_getTarget","_keys","_cached","_resolveWithPrefixes","Reflect","getKeysFromAllScopes","storage","_storage","_attachContext","subProxy","_proxy","_context","_subProxy","receiver","_resolveWithContext","ownKeys","_allKeys","readKey","needsSubResolver","_resolveScriptable","_resolveArray","createSubResolver","resolveFallback","getScope","addScopes","parentScopes","parentFallback","allScopes","addScopesFromKey","subGetTarget","resolveKeysFromAllScopes","EPSILON","getPoint","getValueAxis","splineCurve","middlePoint","afterPoint","current","d01","d12","s01","s12","fa","fb","monotoneAdjust","deltaK","mK","pointsLen","alphaK","betaK","tauK","squaredMagnitude","pointCurrent","pointAfter","monotoneCompute","valueAxis","pointBefore","splineCurveMonotone","slopeDelta","capControlPoint","inArea","inAreaPrev","inAreaNext","_updateBezierControlPoints","controlPoints","_isDomSupported","_getParentNode","domNode","host","parseMaxStyle","styleValue","parentProperty","valueInPixels","getComputedStyle","getPropertyValue","getPositionedStyle","styles","useOffsetPos","shadowRoot","getCanvasPosition","evt","touches","getBoundingClientRect","clientX","clientY","borderBox","paddings","borders","getContainerSize","containerStyle","containerBorder","containerPadding","clientHeight","round1","bbWidth","bbHeight","containerSize","retinaScale","forceRatio","forceStyle","pixelRatio","deviceHeight","deviceWidth","setTransform","supportsEventListenerOptions","passiveSupported","readUsedSize","_pointInLine","_steppedInterpolation","_bezierInterpolation","cp1","cp2","intlCache","getNumberFormat","JSON","stringify","Intl","NumberFormat","formatNumber","num","getRightToLeftAdapter","rectX","itemWidth","getLeftToRightAdapter","_itemWidth","getRtlAdapter","overrideTextDirection","direction","original","getPropertyPriority","setProperty","prevTextDirection","restoreTextDirection","propertyFn","between","compare","normalizeSegment","getSegment","startBound","endBound","_boundSegment","prevValue","inside","subStart","startIsBefore","endIsBefore","shouldStart","shouldStop","_boundSegments","sub","findStartAndEnd","solidSegments","_computeSegments","segmentOptions","splitByStyles","completeLoop","doSplitByStyles","baseStyle","readStyle","prevStyle","p0DataIndex","p1DataIndex","styleChanged"],"mappings":"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","file":"js/chunk-roi-calculator-vendors.js","sourcesContent":["(function(e,t){\"object\"==typeof exports&&\"object\"==typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof exports?exports.VMoney=t():e.VMoney=t()})(this,function(){return function(e){function t(r){if(n[r])return n[r].exports;var i=n[r]={i:r,l:!1,exports:{}};return e[r].call(i.exports,i,i.exports,t),i.l=!0,i.exports}var n={};return t.m=e,t.c=n,t.i=function(e){return e},t.d=function(e,n,r){t.o(e,n)||Object.defineProperty(e,n,{configurable:!1,enumerable:!0,get:r})},t.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return t.d(n,\"a\",n),n},t.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},t.p=\".\",t(t.s=9)}([function(e,t,n){\"use strict\";t.a={prefix:\"\",suffix:\"\",thousands:\",\",decimal:\".\",precision:2}},function(e,t,n){\"use strict\";var r=n(2),i=n(5),u=n(0);t.a=function(e,t){if(t.value){var o=n.i(i.a)(u.a,t.value);if(\"INPUT\"!==e.tagName.toLocaleUpperCase()){var a=e.getElementsByTagName(\"input\");1!==a.length||(e=a[0])}e.oninput=function(){var t=e.value.length-e.selectionEnd;e.value=n.i(r.a)(e.value,o),t=Math.max(t,o.suffix.length),t=e.value.length-t,t=Math.max(t,o.prefix.length+1),n.i(r.b)(e,t),e.dispatchEvent(n.i(r.c)(\"change\"))},e.onfocus=function(){n.i(r.b)(e,e.value.length-o.suffix.length)},e.oninput(),e.dispatchEvent(n.i(r.c)(\"input\"))}}},function(e,t,n){\"use strict\";function r(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:m.a;\"number\"==typeof e&&(e=e.toFixed(o(t.precision)));var n=e.indexOf(\"-\")>=0?\"-\":\"\",r=u(e),i=c(r,t.precision),a=d(i).split(\".\"),p=a[0],l=a[1];return p=f(p,t.thousands),t.prefix+n+s(p,l,t.decimal)+t.suffix}function i(e,t){var n=e.indexOf(\"-\")>=0?-1:1,r=u(e),i=c(r,t);return parseFloat(i)*n}function u(e){return d(e).replace(/\\D+/g,\"\")||\"0\"}function o(e){return a(0,e,20)}function a(e,t,n){return Math.max(e,Math.min(t,n))}function c(e,t){var n=Math.pow(10,t);return(parseFloat(e)/n).toFixed(o(t))}function f(e,t){return e.replace(/(\\d)(?=(?:\\d{3})+\\b)/gm,\"$1\"+t)}function s(e,t,n){return t?e+n+t:e}function d(e){return e?e.toString():\"\"}function p(e,t){var n=function(){e.setSelectionRange(t,t)};e===document.activeElement&&(n(),setTimeout(n,1))}function l(e){var t=document.createEvent(\"Event\");return t.initEvent(e,!0,!0),t}var m=n(0);n.d(t,\"a\",function(){return r}),n.d(t,\"d\",function(){return i}),n.d(t,\"b\",function(){return p}),n.d(t,\"c\",function(){return l})},function(e,t,n){\"use strict\";function r(e,t){t&&Object.keys(t).map(function(e){a.a[e]=t[e]}),e.directive(\"money\",o.a),e.component(\"money\",u.a)}Object.defineProperty(t,\"__esModule\",{value:!0});var i=n(6),u=n.n(i),o=n(1),a=n(0);n.d(t,\"Money\",function(){return u.a}),n.d(t,\"VMoney\",function(){return o.a}),n.d(t,\"options\",function(){return a.a}),n.d(t,\"VERSION\",function(){return c});var c=\"0.8.1\";t.default=r,\"undefined\"!=typeof window&&window.Vue&&window.Vue.use(r)},function(e,t,n){\"use strict\";Object.defineProperty(t,\"__esModule\",{value:!0});var r=n(1),i=n(0),u=n(2);t.default={name:\"Money\",props:{value:{required:!0,type:[Number,String],default:0},masked:{type:Boolean,default:!1},precision:{type:Number,default:function(){return i.a.precision}},decimal:{type:String,default:function(){return i.a.decimal}},thousands:{type:String,default:function(){return i.a.thousands}},prefix:{type:String,default:function(){return i.a.prefix}},suffix:{type:String,default:function(){return i.a.suffix}}},directives:{money:r.a},data:function(){return{formattedValue:\"\"}},watch:{value:{immediate:!0,handler:function(e,t){var r=n.i(u.a)(e,this.$props);r!==this.formattedValue&&(this.formattedValue=r)}}},methods:{change:function(e){this.$emit(\"input\",this.masked?e.target.value:n.i(u.d)(e.target.value,this.precision))}}}},function(e,t,n){\"use strict\";t.a=function(e,t){return e=e||{},t=t||{},Object.keys(e).concat(Object.keys(t)).reduce(function(n,r){return n[r]=void 0===t[r]?e[r]:t[r],n},{})}},function(e,t,n){var r=n(7)(n(4),n(8),null,null);e.exports=r.exports},function(e,t){e.exports=function(e,t,n,r){var i,u=e=e||{},o=typeof e.default;\"object\"!==o&&\"function\"!==o||(i=e,u=e.default);var a=\"function\"==typeof u?u.options:u;if(t&&(a.render=t.render,a.staticRenderFns=t.staticRenderFns),n&&(a._scopeId=n),r){var c=a.computed||(a.computed={});Object.keys(r).forEach(function(e){var t=r[e];c[e]=function(){return t}})}return{esModule:i,exports:u,options:a}}},function(e,t){e.exports={render:function(){var e=this,t=e.$createElement;return(e._self._c||t)(\"input\",{directives:[{name:\"money\",rawName:\"v-money\",value:{precision:e.precision,decimal:e.decimal,thousands:e.thousands,prefix:e.prefix,suffix:e.suffix},expression:\"{precision, decimal, thousands, prefix, suffix}\"}],staticClass:\"v-money\",attrs:{type:\"tel\"},domProps:{value:e.formattedValue},on:{change:e.change}})},staticRenderFns:[]}},function(e,t,n){e.exports=n(3)}])});","var $placeholder = Symbol();\n\nvar $fakeParent = Symbol();\n\nvar nextSiblingPatched = Symbol();\n\nvar childNodesPatched = Symbol();\n\nvar isFrag = function isFrag(node) {\n return \"frag\" in node;\n};\n\nfunction patchParentNode(node, fakeParent) {\n if ($fakeParent in node) {\n return;\n }\n node[$fakeParent] = fakeParent;\n Object.defineProperty(node, \"parentNode\", {\n get: function get() {\n return this[$fakeParent] || this.parentElement;\n }\n });\n}\n\nfunction patchNextSibling(node) {\n if (nextSiblingPatched in node) {\n return;\n }\n node[nextSiblingPatched] = true;\n Object.defineProperty(node, \"nextSibling\", {\n get: function get() {\n var childNodes = this.parentNode.childNodes;\n var index = childNodes.indexOf(this);\n if (index > -1) {\n return childNodes[index + 1] || null;\n }\n return null;\n }\n });\n}\n\nfunction getTopFragment(node, fromParent) {\n while (node.parentNode !== fromParent) {\n var _node = node, parentNode = _node.parentNode;\n if (parentNode) {\n node = parentNode;\n }\n }\n return node;\n}\n\nvar getChildNodes;\n\nfunction getChildNodesWithFragments(node) {\n if (!getChildNodes) {\n var childNodesDescriptor = Object.getOwnPropertyDescriptor(Node.prototype, \"childNodes\");\n getChildNodes = childNodesDescriptor.get;\n }\n var realChildNodes = getChildNodes.apply(node);\n var childNodes = Array.from(realChildNodes).map((function(childNode) {\n return getTopFragment(childNode, node);\n }));\n return childNodes.filter((function(childNode, index) {\n return childNode !== childNodes[index - 1];\n }));\n}\n\nfunction patchChildNodes(node) {\n if (childNodesPatched in node) {\n return;\n }\n node[childNodesPatched] = true;\n Object.defineProperties(node, {\n childNodes: {\n get: function get() {\n return this.frag || getChildNodesWithFragments(this);\n }\n },\n firstChild: {\n get: function get() {\n return this.childNodes[0] || null;\n }\n }\n });\n node.hasChildNodes = function() {\n return this.childNodes.length > 0;\n };\n}\n\nfunction before() {\n var _this$frag$;\n (_this$frag$ = this.frag[0]).before.apply(_this$frag$, arguments);\n}\n\nfunction remove() {\n var frag = this.frag;\n var removed = frag.splice(0, frag.length);\n removed.forEach((function(node) {\n node.remove();\n }));\n}\n\nvar getFragmentLeafNodes = function getFragmentLeafNodes(children) {\n var _Array$prototype;\n return (_Array$prototype = Array.prototype).concat.apply(_Array$prototype, children.map((function(childNode) {\n return isFrag(childNode) ? getFragmentLeafNodes(childNode.frag) : childNode;\n })));\n};\n\nfunction addPlaceholder(node, insertBeforeNode) {\n var placeholder = node[$placeholder];\n insertBeforeNode.before(placeholder);\n patchParentNode(placeholder, node);\n node.frag.unshift(placeholder);\n}\n\nfunction removeChild(node) {\n if (isFrag(this)) {\n var hasChildInFragment = this.frag.indexOf(node);\n if (hasChildInFragment > -1) {\n var _this$frag$splice = this.frag.splice(hasChildInFragment, 1), removedNode = _this$frag$splice[0];\n if (this.frag.length === 0) {\n addPlaceholder(this, removedNode);\n }\n node.remove();\n }\n } else {\n var children = getChildNodesWithFragments(this);\n var hasChild = children.indexOf(node);\n if (hasChild > -1) {\n node.remove();\n }\n }\n return node;\n}\n\nfunction insertBefore(insertNode, insertBeforeNode) {\n var _this = this;\n var insertNodes = insertNode.frag || [ insertNode ];\n if (isFrag(this)) {\n var _frag = this.frag;\n if (insertBeforeNode) {\n var index = _frag.indexOf(insertBeforeNode);\n if (index > -1) {\n _frag.splice.apply(_frag, [ index, 0 ].concat(insertNodes));\n insertBeforeNode.before.apply(insertBeforeNode, insertNodes);\n }\n } else {\n var _lastNode = _frag[_frag.length - 1];\n _frag.push.apply(_frag, insertNodes);\n _lastNode.after.apply(_lastNode, insertNodes);\n }\n removePlaceholder(this);\n } else if (insertBeforeNode) {\n if (this.childNodes.includes(insertBeforeNode)) {\n insertBeforeNode.before.apply(insertBeforeNode, insertNodes);\n }\n } else {\n this.append.apply(this, insertNodes);\n }\n insertNodes.forEach((function(node) {\n patchParentNode(node, _this);\n }));\n var lastNode = insertNodes[insertNodes.length - 1];\n patchNextSibling(lastNode);\n return insertNode;\n}\n\nfunction appendChild(node) {\n var frag = this.frag;\n var lastChild = frag[frag.length - 1];\n lastChild.after(node);\n patchParentNode(node, this);\n removePlaceholder(this);\n frag.push(node);\n return node;\n}\n\nfunction removePlaceholder(node) {\n var placeholder = node[$placeholder];\n if (node.frag[0] === placeholder) {\n node.frag.shift();\n placeholder.remove();\n }\n}\n\nvar frag = {\n inserted: function inserted(element) {\n var parentNode = element.parentNode, nextSibling = element.nextSibling, previousSibling = element.previousSibling;\n var childNodes = Array.from(element.childNodes);\n var placeholder = document.createComment(\"\");\n if (childNodes.length === 0) {\n childNodes.push(placeholder);\n }\n element.frag = childNodes;\n element[$placeholder] = placeholder;\n var fragment = document.createDocumentFragment();\n fragment.append.apply(fragment, getFragmentLeafNodes(childNodes));\n element.replaceWith(fragment);\n childNodes.forEach((function(node) {\n patchParentNode(node, element);\n patchNextSibling(node);\n }));\n patchChildNodes(element);\n Object.assign(element, {\n remove: remove,\n appendChild: appendChild,\n insertBefore: insertBefore,\n removeChild: removeChild,\n before: before\n });\n Object.defineProperty(element, \"innerHTML\", {\n set: function set(htmlString) {\n var _this2 = this;\n if (this.frag[0] !== placeholder) {\n this.frag.slice().forEach((function(child) {\n return _this2.removeChild(child);\n }));\n }\n if (htmlString) {\n var domify = document.createElement(\"div\");\n domify.innerHTML = htmlString;\n Array.from(domify.childNodes).forEach((function(node) {\n _this2.appendChild(node);\n }));\n }\n },\n get: function get() {\n return \"\";\n }\n });\n if (parentNode) {\n Object.assign(parentNode, {\n removeChild: removeChild,\n insertBefore: insertBefore\n });\n patchParentNode(element, parentNode);\n patchChildNodes(parentNode);\n }\n if (nextSibling) {\n patchNextSibling(element);\n }\n if (previousSibling) {\n patchNextSibling(previousSibling);\n }\n },\n unbind: function unbind(element) {\n element.remove();\n }\n};\n\nvar fragment = {\n name: \"Fragment\",\n directives: {\n frag: frag\n },\n render: function render(h) {\n return h(\"div\", {\n directives: [ {\n name: \"frag\"\n } ]\n }, this.$slots[\"default\"]);\n }\n};\n\nexport { fragment as Fragment, frag as default };\n","/*!\n * Chart.js v3.5.1\n * https://www.chartjs.org\n * (c) 2021 Chart.js Contributors\n * Released under the MIT License\n */\nimport { r as requestAnimFrame, a as resolve, e as effects, c as color, d as defaults, i as isObject, b as isArray, v as valueOrDefault, u as unlistenArrayEvents, l as listenArrayEvents, f as resolveObjectKey, g as isNumberFinite, h as defined, s as sign, j as isNullOrUndef, _ as _arrayUnique, t as toRadians, k as toPercentage, m as toDimension, T as TAU, n as formatNumber, o as _angleBetween, H as HALF_PI, P as PI, p as isNumber, q as _limitValue, w as _lookupByKey, x as getRelativePosition$1, y as _isPointInArea, z as _rlookupByKey, A as toPadding, B as each, C as getMaximumSize, D as _getParentNode, E as readUsedSize, F as throttled, G as supportsEventListenerOptions, I as _isDomSupported, J as log10, K as _factorize, L as finiteOrDefault, M as callback, N as _addGrace, O as toDegrees, Q as _measureText, R as _int16Range, S as _alignPixel, U as clipArea, V as renderText, W as unclipArea, X as toFont, Y as _toLeftRightCenter, Z as _alignStartEnd, $ as overrides, a0 as merge, a1 as _capitalize, a2 as descriptors, a3 as isFunction, a4 as _attachContext, a5 as _createResolver, a6 as _descriptors, a7 as mergeIf, a8 as uid, a9 as debounce, aa as retinaScale, ab as clearCanvas, ac as setsEqual, ad as _elementsEqual, ae as getAngleFromPoint, af as _readValueToProps, ag as _updateBezierControlPoints, ah as _computeSegments, ai as _boundSegments, aj as _steppedInterpolation, ak as _bezierInterpolation, al as _pointInLine, am as _steppedLineTo, an as _bezierCurveTo, ao as drawPoint, ap as addRoundedRectPath, aq as toTRBL, ar as toTRBLCorners, as as _boundSegment, at as _normalizeAngle, au as getRtlAdapter, av as overrideTextDirection, aw as _textX, ax as restoreTextDirection, ay as noop, az as distanceBetweenPoints, aA as _setMinAndMaxByKey, aB as niceNum, aC as almostWhole, aD as almostEquals, aE as _decimalPlaces, aF as _longestText, aG as _filterBetween, aH as _lookup } from './chunks/helpers.segment.js';\nexport { d as defaults } from './chunks/helpers.segment.js';\n\nclass Animator {\n constructor() {\n this._request = null;\n this._charts = new Map();\n this._running = false;\n this._lastDate = undefined;\n }\n _notify(chart, anims, date, type) {\n const callbacks = anims.listeners[type];\n const numSteps = anims.duration;\n callbacks.forEach(fn => fn({\n chart,\n initial: anims.initial,\n numSteps,\n currentStep: Math.min(date - anims.start, numSteps)\n }));\n }\n _refresh() {\n const me = this;\n if (me._request) {\n return;\n }\n me._running = true;\n me._request = requestAnimFrame.call(window, () => {\n me._update();\n me._request = null;\n if (me._running) {\n me._refresh();\n }\n });\n }\n _update(date = Date.now()) {\n const me = this;\n let remaining = 0;\n me._charts.forEach((anims, chart) => {\n if (!anims.running || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n let draw = false;\n let item;\n for (; i >= 0; --i) {\n item = items[i];\n if (item._active) {\n if (item._total > anims.duration) {\n anims.duration = item._total;\n }\n item.tick(date);\n draw = true;\n } else {\n items[i] = items[items.length - 1];\n items.pop();\n }\n }\n if (draw) {\n chart.draw();\n me._notify(chart, anims, date, 'progress');\n }\n if (!items.length) {\n anims.running = false;\n me._notify(chart, anims, date, 'complete');\n anims.initial = false;\n }\n remaining += items.length;\n });\n me._lastDate = date;\n if (remaining === 0) {\n me._running = false;\n }\n }\n _getAnims(chart) {\n const charts = this._charts;\n let anims = charts.get(chart);\n if (!anims) {\n anims = {\n running: false,\n initial: true,\n items: [],\n listeners: {\n complete: [],\n progress: []\n }\n };\n charts.set(chart, anims);\n }\n return anims;\n }\n listen(chart, event, cb) {\n this._getAnims(chart).listeners[event].push(cb);\n }\n add(chart, items) {\n if (!items || !items.length) {\n return;\n }\n this._getAnims(chart).items.push(...items);\n }\n has(chart) {\n return this._getAnims(chart).items.length > 0;\n }\n start(chart) {\n const anims = this._charts.get(chart);\n if (!anims) {\n return;\n }\n anims.running = true;\n anims.start = Date.now();\n anims.duration = anims.items.reduce((acc, cur) => Math.max(acc, cur._duration), 0);\n this._refresh();\n }\n running(chart) {\n if (!this._running) {\n return false;\n }\n const anims = this._charts.get(chart);\n if (!anims || !anims.running || !anims.items.length) {\n return false;\n }\n return true;\n }\n stop(chart) {\n const anims = this._charts.get(chart);\n if (!anims || !anims.items.length) {\n return;\n }\n const items = anims.items;\n let i = items.length - 1;\n for (; i >= 0; --i) {\n items[i].cancel();\n }\n anims.items = [];\n this._notify(chart, anims, Date.now(), 'complete');\n }\n remove(chart) {\n return this._charts.delete(chart);\n }\n}\nvar animator = new Animator();\n\nconst transparent = 'transparent';\nconst interpolators = {\n boolean(from, to, factor) {\n return factor > 0.5 ? to : from;\n },\n color(from, to, factor) {\n const c0 = color(from || transparent);\n const c1 = c0.valid && color(to || transparent);\n return c1 && c1.valid\n ? c1.mix(c0, factor).hexString()\n : to;\n },\n number(from, to, factor) {\n return from + (to - from) * factor;\n }\n};\nclass Animation {\n constructor(cfg, target, prop, to) {\n const currentValue = target[prop];\n to = resolve([cfg.to, to, currentValue, cfg.from]);\n const from = resolve([cfg.from, currentValue, to]);\n this._active = true;\n this._fn = cfg.fn || interpolators[cfg.type || typeof from];\n this._easing = effects[cfg.easing] || effects.linear;\n this._start = Math.floor(Date.now() + (cfg.delay || 0));\n this._duration = this._total = Math.floor(cfg.duration);\n this._loop = !!cfg.loop;\n this._target = target;\n this._prop = prop;\n this._from = from;\n this._to = to;\n this._promises = undefined;\n }\n active() {\n return this._active;\n }\n update(cfg, to, date) {\n const me = this;\n if (me._active) {\n me._notify(false);\n const currentValue = me._target[me._prop];\n const elapsed = date - me._start;\n const remain = me._duration - elapsed;\n me._start = date;\n me._duration = Math.floor(Math.max(remain, cfg.duration));\n me._total += elapsed;\n me._loop = !!cfg.loop;\n me._to = resolve([cfg.to, to, currentValue, cfg.from]);\n me._from = resolve([cfg.from, currentValue, to]);\n }\n }\n cancel() {\n const me = this;\n if (me._active) {\n me.tick(Date.now());\n me._active = false;\n me._notify(false);\n }\n }\n tick(date) {\n const me = this;\n const elapsed = date - me._start;\n const duration = me._duration;\n const prop = me._prop;\n const from = me._from;\n const loop = me._loop;\n const to = me._to;\n let factor;\n me._active = from !== to && (loop || (elapsed < duration));\n if (!me._active) {\n me._target[prop] = to;\n me._notify(true);\n return;\n }\n if (elapsed < 0) {\n me._target[prop] = from;\n return;\n }\n factor = (elapsed / duration) % 2;\n factor = loop && factor > 1 ? 2 - factor : factor;\n factor = me._easing(Math.min(1, Math.max(0, factor)));\n me._target[prop] = me._fn(from, to, factor);\n }\n wait() {\n const promises = this._promises || (this._promises = []);\n return new Promise((res, rej) => {\n promises.push({res, rej});\n });\n }\n _notify(resolved) {\n const method = resolved ? 'res' : 'rej';\n const promises = this._promises || [];\n for (let i = 0; i < promises.length; i++) {\n promises[i][method]();\n }\n }\n}\n\nconst numbers = ['x', 'y', 'borderWidth', 'radius', 'tension'];\nconst colors = ['color', 'borderColor', 'backgroundColor'];\ndefaults.set('animation', {\n delay: undefined,\n duration: 1000,\n easing: 'easeOutQuart',\n fn: undefined,\n from: undefined,\n loop: undefined,\n to: undefined,\n type: undefined,\n});\nconst animationOptions = Object.keys(defaults.animation);\ndefaults.describe('animation', {\n _fallback: false,\n _indexable: false,\n _scriptable: (name) => name !== 'onProgress' && name !== 'onComplete' && name !== 'fn',\n});\ndefaults.set('animations', {\n colors: {\n type: 'color',\n properties: colors\n },\n numbers: {\n type: 'number',\n properties: numbers\n },\n});\ndefaults.describe('animations', {\n _fallback: 'animation',\n});\ndefaults.set('transitions', {\n active: {\n animation: {\n duration: 400\n }\n },\n resize: {\n animation: {\n duration: 0\n }\n },\n show: {\n animations: {\n colors: {\n from: 'transparent'\n },\n visible: {\n type: 'boolean',\n duration: 0\n },\n }\n },\n hide: {\n animations: {\n colors: {\n to: 'transparent'\n },\n visible: {\n type: 'boolean',\n easing: 'linear',\n fn: v => v | 0\n },\n }\n }\n});\nclass Animations {\n constructor(chart, config) {\n this._chart = chart;\n this._properties = new Map();\n this.configure(config);\n }\n configure(config) {\n if (!isObject(config)) {\n return;\n }\n const animatedProps = this._properties;\n Object.getOwnPropertyNames(config).forEach(key => {\n const cfg = config[key];\n if (!isObject(cfg)) {\n return;\n }\n const resolved = {};\n for (const option of animationOptions) {\n resolved[option] = cfg[option];\n }\n (isArray(cfg.properties) && cfg.properties || [key]).forEach((prop) => {\n if (prop === key || !animatedProps.has(prop)) {\n animatedProps.set(prop, resolved);\n }\n });\n });\n }\n _animateOptions(target, values) {\n const newOptions = values.options;\n const options = resolveTargetOptions(target, newOptions);\n if (!options) {\n return [];\n }\n const animations = this._createAnimations(options, newOptions);\n if (newOptions.$shared) {\n awaitAll(target.options.$animations, newOptions).then(() => {\n target.options = newOptions;\n }, () => {\n });\n }\n return animations;\n }\n _createAnimations(target, values) {\n const animatedProps = this._properties;\n const animations = [];\n const running = target.$animations || (target.$animations = {});\n const props = Object.keys(values);\n const date = Date.now();\n let i;\n for (i = props.length - 1; i >= 0; --i) {\n const prop = props[i];\n if (prop.charAt(0) === '$') {\n continue;\n }\n if (prop === 'options') {\n animations.push(...this._animateOptions(target, values));\n continue;\n }\n const value = values[prop];\n let animation = running[prop];\n const cfg = animatedProps.get(prop);\n if (animation) {\n if (cfg && animation.active()) {\n animation.update(cfg, value, date);\n continue;\n } else {\n animation.cancel();\n }\n }\n if (!cfg || !cfg.duration) {\n target[prop] = value;\n continue;\n }\n running[prop] = animation = new Animation(cfg, target, prop, value);\n animations.push(animation);\n }\n return animations;\n }\n update(target, values) {\n if (this._properties.size === 0) {\n Object.assign(target, values);\n return;\n }\n const animations = this._createAnimations(target, values);\n if (animations.length) {\n animator.add(this._chart, animations);\n return true;\n }\n }\n}\nfunction awaitAll(animations, properties) {\n const running = [];\n const keys = Object.keys(properties);\n for (let i = 0; i < keys.length; i++) {\n const anim = animations[keys[i]];\n if (anim && anim.active()) {\n running.push(anim.wait());\n }\n }\n return Promise.all(running);\n}\nfunction resolveTargetOptions(target, newOptions) {\n if (!newOptions) {\n return;\n }\n let options = target.options;\n if (!options) {\n target.options = newOptions;\n return;\n }\n if (options.$shared) {\n target.options = options = Object.assign({}, options, {$shared: false, $animations: {}});\n }\n return options;\n}\n\nfunction scaleClip(scale, allowedOverflow) {\n const opts = scale && scale.options || {};\n const reverse = opts.reverse;\n const min = opts.min === undefined ? allowedOverflow : 0;\n const max = opts.max === undefined ? allowedOverflow : 0;\n return {\n start: reverse ? max : min,\n end: reverse ? min : max\n };\n}\nfunction defaultClip(xScale, yScale, allowedOverflow) {\n if (allowedOverflow === false) {\n return false;\n }\n const x = scaleClip(xScale, allowedOverflow);\n const y = scaleClip(yScale, allowedOverflow);\n return {\n top: y.end,\n right: x.end,\n bottom: y.start,\n left: x.start\n };\n}\nfunction toClip(value) {\n let t, r, b, l;\n if (isObject(value)) {\n t = value.top;\n r = value.right;\n b = value.bottom;\n l = value.left;\n } else {\n t = r = b = l = value;\n }\n return {\n top: t,\n right: r,\n bottom: b,\n left: l,\n disabled: value === false\n };\n}\nfunction getSortedDatasetIndices(chart, filterVisible) {\n const keys = [];\n const metasets = chart._getSortedDatasetMetas(filterVisible);\n let i, ilen;\n for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n keys.push(metasets[i].index);\n }\n return keys;\n}\nfunction applyStack(stack, value, dsIndex, options) {\n const keys = stack.keys;\n const singleMode = options.mode === 'single';\n let i, ilen, datasetIndex, otherValue;\n if (value === null) {\n return;\n }\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n datasetIndex = +keys[i];\n if (datasetIndex === dsIndex) {\n if (options.all) {\n continue;\n }\n break;\n }\n otherValue = stack.values[datasetIndex];\n if (isNumberFinite(otherValue) && (singleMode || (value === 0 || sign(value) === sign(otherValue)))) {\n value += otherValue;\n }\n }\n return value;\n}\nfunction convertObjectDataToArray(data) {\n const keys = Object.keys(data);\n const adata = new Array(keys.length);\n let i, ilen, key;\n for (i = 0, ilen = keys.length; i < ilen; ++i) {\n key = keys[i];\n adata[i] = {\n x: key,\n y: data[key]\n };\n }\n return adata;\n}\nfunction isStacked(scale, meta) {\n const stacked = scale && scale.options.stacked;\n return stacked || (stacked === undefined && meta.stack !== undefined);\n}\nfunction getStackKey(indexScale, valueScale, meta) {\n return `${indexScale.id}.${valueScale.id}.${meta.stack || meta.type}`;\n}\nfunction getUserBounds(scale) {\n const {min, max, minDefined, maxDefined} = scale.getUserBounds();\n return {\n min: minDefined ? min : Number.NEGATIVE_INFINITY,\n max: maxDefined ? max : Number.POSITIVE_INFINITY\n };\n}\nfunction getOrCreateStack(stacks, stackKey, indexValue) {\n const subStack = stacks[stackKey] || (stacks[stackKey] = {});\n return subStack[indexValue] || (subStack[indexValue] = {});\n}\nfunction getLastIndexInStack(stack, vScale, positive) {\n for (const meta of vScale.getMatchingVisibleMetas('bar').reverse()) {\n const value = stack[meta.index];\n if ((positive && value > 0) || (!positive && value < 0)) {\n return meta.index;\n }\n }\n return null;\n}\nfunction updateStacks(controller, parsed) {\n const {chart, _cachedMeta: meta} = controller;\n const stacks = chart._stacks || (chart._stacks = {});\n const {iScale, vScale, index: datasetIndex} = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const key = getStackKey(iScale, vScale, meta);\n const ilen = parsed.length;\n let stack;\n for (let i = 0; i < ilen; ++i) {\n const item = parsed[i];\n const {[iAxis]: index, [vAxis]: value} = item;\n const itemStacks = item._stacks || (item._stacks = {});\n stack = itemStacks[vAxis] = getOrCreateStack(stacks, key, index);\n stack[datasetIndex] = value;\n stack._top = getLastIndexInStack(stack, vScale, true);\n stack._bottom = getLastIndexInStack(stack, vScale, false);\n }\n}\nfunction getFirstScaleId(chart, axis) {\n const scales = chart.scales;\n return Object.keys(scales).filter(key => scales[key].axis === axis).shift();\n}\nfunction createDatasetContext(parent, index) {\n return Object.assign(Object.create(parent),\n {\n active: false,\n dataset: undefined,\n datasetIndex: index,\n index,\n mode: 'default',\n type: 'dataset'\n }\n );\n}\nfunction createDataContext(parent, index, element) {\n return Object.assign(Object.create(parent), {\n active: false,\n dataIndex: index,\n parsed: undefined,\n raw: undefined,\n element,\n index,\n mode: 'default',\n type: 'data'\n });\n}\nfunction clearStacks(meta, items) {\n const datasetIndex = meta.controller.index;\n const axis = meta.vScale && meta.vScale.axis;\n if (!axis) {\n return;\n }\n items = items || meta._parsed;\n for (const parsed of items) {\n const stacks = parsed._stacks;\n if (!stacks || stacks[axis] === undefined || stacks[axis][datasetIndex] === undefined) {\n return;\n }\n delete stacks[axis][datasetIndex];\n }\n}\nconst isDirectUpdateMode = (mode) => mode === 'reset' || mode === 'none';\nconst cloneIfNotShared = (cached, shared) => shared ? cached : Object.assign({}, cached);\nclass DatasetController {\n constructor(chart, datasetIndex) {\n this.chart = chart;\n this._ctx = chart.ctx;\n this.index = datasetIndex;\n this._cachedDataOpts = {};\n this._cachedMeta = this.getMeta();\n this._type = this._cachedMeta.type;\n this.options = undefined;\n this._parsing = false;\n this._data = undefined;\n this._objectData = undefined;\n this._sharedOptions = undefined;\n this._drawStart = undefined;\n this._drawCount = undefined;\n this.enableOptionSharing = false;\n this.$context = undefined;\n this._syncList = [];\n this.initialize();\n }\n initialize() {\n const me = this;\n const meta = me._cachedMeta;\n me.configure();\n me.linkScales();\n meta._stacked = isStacked(meta.vScale, meta);\n me.addElements();\n }\n updateIndex(datasetIndex) {\n if (this.index !== datasetIndex) {\n clearStacks(this._cachedMeta);\n }\n this.index = datasetIndex;\n }\n linkScales() {\n const me = this;\n const chart = me.chart;\n const meta = me._cachedMeta;\n const dataset = me.getDataset();\n const chooseId = (axis, x, y, r) => axis === 'x' ? x : axis === 'r' ? r : y;\n const xid = meta.xAxisID = valueOrDefault(dataset.xAxisID, getFirstScaleId(chart, 'x'));\n const yid = meta.yAxisID = valueOrDefault(dataset.yAxisID, getFirstScaleId(chart, 'y'));\n const rid = meta.rAxisID = valueOrDefault(dataset.rAxisID, getFirstScaleId(chart, 'r'));\n const indexAxis = meta.indexAxis;\n const iid = meta.iAxisID = chooseId(indexAxis, xid, yid, rid);\n const vid = meta.vAxisID = chooseId(indexAxis, yid, xid, rid);\n meta.xScale = me.getScaleForId(xid);\n meta.yScale = me.getScaleForId(yid);\n meta.rScale = me.getScaleForId(rid);\n meta.iScale = me.getScaleForId(iid);\n meta.vScale = me.getScaleForId(vid);\n }\n getDataset() {\n return this.chart.data.datasets[this.index];\n }\n getMeta() {\n return this.chart.getDatasetMeta(this.index);\n }\n getScaleForId(scaleID) {\n return this.chart.scales[scaleID];\n }\n _getOtherScale(scale) {\n const meta = this._cachedMeta;\n return scale === meta.iScale\n ? meta.vScale\n : meta.iScale;\n }\n reset() {\n this._update('reset');\n }\n _destroy() {\n const meta = this._cachedMeta;\n if (this._data) {\n unlistenArrayEvents(this._data, this);\n }\n if (meta._stacked) {\n clearStacks(meta);\n }\n }\n _dataCheck() {\n const me = this;\n const dataset = me.getDataset();\n const data = dataset.data || (dataset.data = []);\n const _data = me._data;\n if (isObject(data)) {\n me._data = convertObjectDataToArray(data);\n } else if (_data !== data) {\n if (_data) {\n unlistenArrayEvents(_data, me);\n const meta = me._cachedMeta;\n clearStacks(meta);\n meta._parsed = [];\n }\n if (data && Object.isExtensible(data)) {\n listenArrayEvents(data, me);\n }\n me._syncList = [];\n me._data = data;\n }\n }\n addElements() {\n const me = this;\n const meta = me._cachedMeta;\n me._dataCheck();\n if (me.datasetElementType) {\n meta.dataset = new me.datasetElementType();\n }\n }\n buildOrUpdateElements(resetNewElements) {\n const me = this;\n const meta = me._cachedMeta;\n const dataset = me.getDataset();\n let stackChanged = false;\n me._dataCheck();\n const oldStacked = meta._stacked;\n meta._stacked = isStacked(meta.vScale, meta);\n if (meta.stack !== dataset.stack) {\n stackChanged = true;\n clearStacks(meta);\n meta.stack = dataset.stack;\n }\n me._resyncElements(resetNewElements);\n if (stackChanged || oldStacked !== meta._stacked) {\n updateStacks(me, meta._parsed);\n }\n }\n configure() {\n const me = this;\n const config = me.chart.config;\n const scopeKeys = config.datasetScopeKeys(me._type);\n const scopes = config.getOptionScopes(me.getDataset(), scopeKeys, true);\n me.options = config.createResolver(scopes, me.getContext());\n me._parsing = me.options.parsing;\n }\n parse(start, count) {\n const me = this;\n const {_cachedMeta: meta, _data: data} = me;\n const {iScale, _stacked} = meta;\n const iAxis = iScale.axis;\n let sorted = start === 0 && count === data.length ? true : meta._sorted;\n let prev = start > 0 && meta._parsed[start - 1];\n let i, cur, parsed;\n if (me._parsing === false) {\n meta._parsed = data;\n meta._sorted = true;\n parsed = data;\n } else {\n if (isArray(data[start])) {\n parsed = me.parseArrayData(meta, data, start, count);\n } else if (isObject(data[start])) {\n parsed = me.parseObjectData(meta, data, start, count);\n } else {\n parsed = me.parsePrimitiveData(meta, data, start, count);\n }\n const isNotInOrderComparedToPrev = () => cur[iAxis] === null || (prev && cur[iAxis] < prev[iAxis]);\n for (i = 0; i < count; ++i) {\n meta._parsed[i + start] = cur = parsed[i];\n if (sorted) {\n if (isNotInOrderComparedToPrev()) {\n sorted = false;\n }\n prev = cur;\n }\n }\n meta._sorted = sorted;\n }\n if (_stacked) {\n updateStacks(me, parsed);\n }\n }\n parsePrimitiveData(meta, data, start, count) {\n const {iScale, vScale} = meta;\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = new Array(count);\n let i, ilen, index;\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n parsed[i] = {\n [iAxis]: singleScale || iScale.parse(labels[index], index),\n [vAxis]: vScale.parse(data[index], index)\n };\n }\n return parsed;\n }\n parseArrayData(meta, data, start, count) {\n const {xScale, yScale} = meta;\n const parsed = new Array(count);\n let i, ilen, index, item;\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(item[0], index),\n y: yScale.parse(item[1], index)\n };\n }\n return parsed;\n }\n parseObjectData(meta, data, start, count) {\n const {xScale, yScale} = meta;\n const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n const parsed = new Array(count);\n let i, ilen, index, item;\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n x: xScale.parse(resolveObjectKey(item, xAxisKey), index),\n y: yScale.parse(resolveObjectKey(item, yAxisKey), index)\n };\n }\n return parsed;\n }\n getParsed(index) {\n return this._cachedMeta._parsed[index];\n }\n getDataElement(index) {\n return this._cachedMeta.data[index];\n }\n applyStack(scale, parsed, mode) {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const value = parsed[scale.axis];\n const stack = {\n keys: getSortedDatasetIndices(chart, true),\n values: parsed._stacks[scale.axis]\n };\n return applyStack(stack, value, meta.index, {mode});\n }\n updateRangeFromParsed(range, scale, parsed, stack) {\n const parsedValue = parsed[scale.axis];\n let value = parsedValue === null ? NaN : parsedValue;\n const values = stack && parsed._stacks[scale.axis];\n if (stack && values) {\n stack.values = values;\n range.min = Math.min(range.min, value);\n range.max = Math.max(range.max, value);\n value = applyStack(stack, parsedValue, this._cachedMeta.index, {all: true});\n }\n range.min = Math.min(range.min, value);\n range.max = Math.max(range.max, value);\n }\n getMinMax(scale, canStack) {\n const me = this;\n const meta = me._cachedMeta;\n const _parsed = meta._parsed;\n const sorted = meta._sorted && scale === meta.iScale;\n const ilen = _parsed.length;\n const otherScale = me._getOtherScale(scale);\n const stack = canStack && meta._stacked && {keys: getSortedDatasetIndices(me.chart, true), values: null};\n const range = {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY};\n const {min: otherMin, max: otherMax} = getUserBounds(otherScale);\n let i, value, parsed, otherValue;\n function _skip() {\n parsed = _parsed[i];\n value = parsed[scale.axis];\n otherValue = parsed[otherScale.axis];\n return !isNumberFinite(value) || otherMin > otherValue || otherMax < otherValue;\n }\n for (i = 0; i < ilen; ++i) {\n if (_skip()) {\n continue;\n }\n me.updateRangeFromParsed(range, scale, parsed, stack);\n if (sorted) {\n break;\n }\n }\n if (sorted) {\n for (i = ilen - 1; i >= 0; --i) {\n if (_skip()) {\n continue;\n }\n me.updateRangeFromParsed(range, scale, parsed, stack);\n break;\n }\n }\n return range;\n }\n getAllParsedValues(scale) {\n const parsed = this._cachedMeta._parsed;\n const values = [];\n let i, ilen, value;\n for (i = 0, ilen = parsed.length; i < ilen; ++i) {\n value = parsed[i][scale.axis];\n if (isNumberFinite(value)) {\n values.push(value);\n }\n }\n return values;\n }\n getMaxOverflow() {\n return false;\n }\n getLabelAndValue(index) {\n const me = this;\n const meta = me._cachedMeta;\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const parsed = me.getParsed(index);\n return {\n label: iScale ? '' + iScale.getLabelForValue(parsed[iScale.axis]) : '',\n value: vScale ? '' + vScale.getLabelForValue(parsed[vScale.axis]) : ''\n };\n }\n _update(mode) {\n const me = this;\n const meta = me._cachedMeta;\n me.configure();\n me._cachedDataOpts = {};\n me.update(mode || 'default');\n meta._clip = toClip(valueOrDefault(me.options.clip, defaultClip(meta.xScale, meta.yScale, me.getMaxOverflow())));\n }\n update(mode) {}\n draw() {\n const me = this;\n const ctx = me._ctx;\n const chart = me.chart;\n const meta = me._cachedMeta;\n const elements = meta.data || [];\n const area = chart.chartArea;\n const active = [];\n const start = me._drawStart || 0;\n const count = me._drawCount || (elements.length - start);\n let i;\n if (meta.dataset) {\n meta.dataset.draw(ctx, area, start, count);\n }\n for (i = start; i < start + count; ++i) {\n const element = elements[i];\n if (element.hidden) {\n continue;\n }\n if (element.active) {\n active.push(element);\n } else {\n element.draw(ctx, area);\n }\n }\n for (i = 0; i < active.length; ++i) {\n active[i].draw(ctx, area);\n }\n }\n getStyle(index, active) {\n const mode = active ? 'active' : 'default';\n return index === undefined && this._cachedMeta.dataset\n ? this.resolveDatasetElementOptions(mode)\n : this.resolveDataElementOptions(index || 0, mode);\n }\n getContext(index, active, mode) {\n const me = this;\n const dataset = me.getDataset();\n let context;\n if (index >= 0 && index < me._cachedMeta.data.length) {\n const element = me._cachedMeta.data[index];\n context = element.$context ||\n (element.$context = createDataContext(me.getContext(), index, element));\n context.parsed = me.getParsed(index);\n context.raw = dataset.data[index];\n context.index = context.dataIndex = index;\n } else {\n context = me.$context ||\n (me.$context = createDatasetContext(me.chart.getContext(), me.index));\n context.dataset = dataset;\n context.index = context.datasetIndex = me.index;\n }\n context.active = !!active;\n context.mode = mode;\n return context;\n }\n resolveDatasetElementOptions(mode) {\n return this._resolveElementOptions(this.datasetElementType.id, mode);\n }\n resolveDataElementOptions(index, mode) {\n return this._resolveElementOptions(this.dataElementType.id, mode, index);\n }\n _resolveElementOptions(elementType, mode = 'default', index) {\n const me = this;\n const active = mode === 'active';\n const cache = me._cachedDataOpts;\n const cacheKey = elementType + '-' + mode;\n const cached = cache[cacheKey];\n const sharing = me.enableOptionSharing && defined(index);\n if (cached) {\n return cloneIfNotShared(cached, sharing);\n }\n const config = me.chart.config;\n const scopeKeys = config.datasetElementScopeKeys(me._type, elementType);\n const prefixes = active ? [`${elementType}Hover`, 'hover', elementType, ''] : [elementType, ''];\n const scopes = config.getOptionScopes(me.getDataset(), scopeKeys);\n const names = Object.keys(defaults.elements[elementType]);\n const context = () => me.getContext(index, active);\n const values = config.resolveNamedOptions(scopes, names, context, prefixes);\n if (values.$shared) {\n values.$shared = sharing;\n cache[cacheKey] = Object.freeze(cloneIfNotShared(values, sharing));\n }\n return values;\n }\n _resolveAnimations(index, transition, active) {\n const me = this;\n const chart = me.chart;\n const cache = me._cachedDataOpts;\n const cacheKey = `animation-${transition}`;\n const cached = cache[cacheKey];\n if (cached) {\n return cached;\n }\n let options;\n if (chart.options.animation !== false) {\n const config = me.chart.config;\n const scopeKeys = config.datasetAnimationScopeKeys(me._type, transition);\n const scopes = config.getOptionScopes(me.getDataset(), scopeKeys);\n options = config.createResolver(scopes, me.getContext(index, active, transition));\n }\n const animations = new Animations(chart, options && options.animations);\n if (options && options._cacheable) {\n cache[cacheKey] = Object.freeze(animations);\n }\n return animations;\n }\n getSharedOptions(options) {\n if (!options.$shared) {\n return;\n }\n return this._sharedOptions || (this._sharedOptions = Object.assign({}, options));\n }\n includeOptions(mode, sharedOptions) {\n return !sharedOptions || isDirectUpdateMode(mode) || this.chart._animationsDisabled;\n }\n updateElement(element, index, properties, mode) {\n if (isDirectUpdateMode(mode)) {\n Object.assign(element, properties);\n } else {\n this._resolveAnimations(index, mode).update(element, properties);\n }\n }\n updateSharedOptions(sharedOptions, mode, newOptions) {\n if (sharedOptions && !isDirectUpdateMode(mode)) {\n this._resolveAnimations(undefined, mode).update(sharedOptions, newOptions);\n }\n }\n _setStyle(element, index, mode, active) {\n element.active = active;\n const options = this.getStyle(index, active);\n this._resolveAnimations(index, mode, active).update(element, {\n options: (!active && this.getSharedOptions(options)) || options\n });\n }\n removeHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', false);\n }\n setHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', true);\n }\n _removeDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n if (element) {\n this._setStyle(element, undefined, 'active', false);\n }\n }\n _setDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n if (element) {\n this._setStyle(element, undefined, 'active', true);\n }\n }\n _resyncElements(resetNewElements) {\n const me = this;\n const data = me._data;\n const elements = me._cachedMeta.data;\n for (const [method, arg1, arg2] of me._syncList) {\n me[method](arg1, arg2);\n }\n me._syncList = [];\n const numMeta = elements.length;\n const numData = data.length;\n const count = Math.min(numData, numMeta);\n if (count) {\n me.parse(0, count);\n }\n if (numData > numMeta) {\n me._insertElements(numMeta, numData - numMeta, resetNewElements);\n } else if (numData < numMeta) {\n me._removeElements(numData, numMeta - numData);\n }\n }\n _insertElements(start, count, resetNewElements = true) {\n const me = this;\n const meta = me._cachedMeta;\n const data = meta.data;\n const end = start + count;\n let i;\n const move = (arr) => {\n arr.length += count;\n for (i = arr.length - 1; i >= end; i--) {\n arr[i] = arr[i - count];\n }\n };\n move(data);\n for (i = start; i < end; ++i) {\n data[i] = new me.dataElementType();\n }\n if (me._parsing) {\n move(meta._parsed);\n }\n me.parse(start, count);\n if (resetNewElements) {\n me.updateElements(data, start, count, 'reset');\n }\n }\n updateElements(element, start, count, mode) {}\n _removeElements(start, count) {\n const me = this;\n const meta = me._cachedMeta;\n if (me._parsing) {\n const removed = meta._parsed.splice(start, count);\n if (meta._stacked) {\n clearStacks(meta, removed);\n }\n }\n meta.data.splice(start, count);\n }\n _sync(args) {\n if (this._parsing) {\n this._syncList.push(args);\n } else {\n const [method, arg1, arg2] = args;\n this[method](arg1, arg2);\n }\n }\n _onDataPush() {\n const count = arguments.length;\n this._sync(['_insertElements', this.getDataset().data.length - count, count]);\n }\n _onDataPop() {\n this._sync(['_removeElements', this._cachedMeta.data.length - 1, 1]);\n }\n _onDataShift() {\n this._sync(['_removeElements', 0, 1]);\n }\n _onDataSplice(start, count) {\n this._sync(['_removeElements', start, count]);\n this._sync(['_insertElements', start, arguments.length - 2]);\n }\n _onDataUnshift() {\n this._sync(['_insertElements', 0, arguments.length]);\n }\n}\nDatasetController.defaults = {};\nDatasetController.prototype.datasetElementType = null;\nDatasetController.prototype.dataElementType = null;\n\nfunction getAllScaleValues(scale) {\n if (!scale._cache.$bar) {\n const metas = scale.getMatchingVisibleMetas('bar');\n let values = [];\n for (let i = 0, ilen = metas.length; i < ilen; i++) {\n values = values.concat(metas[i].controller.getAllParsedValues(scale));\n }\n scale._cache.$bar = _arrayUnique(values.sort((a, b) => a - b));\n }\n return scale._cache.$bar;\n}\nfunction computeMinSampleSize(scale) {\n const values = getAllScaleValues(scale);\n let min = scale._length;\n let i, ilen, curr, prev;\n const updateMinAndPrev = () => {\n if (curr === 32767 || curr === -32768) {\n return;\n }\n if (defined(prev)) {\n min = Math.min(min, Math.abs(curr - prev) || min);\n }\n prev = curr;\n };\n for (i = 0, ilen = values.length; i < ilen; ++i) {\n curr = scale.getPixelForValue(values[i]);\n updateMinAndPrev();\n }\n prev = undefined;\n for (i = 0, ilen = scale.ticks.length; i < ilen; ++i) {\n curr = scale.getPixelForTick(i);\n updateMinAndPrev();\n }\n return min;\n}\nfunction computeFitCategoryTraits(index, ruler, options, stackCount) {\n const thickness = options.barThickness;\n let size, ratio;\n if (isNullOrUndef(thickness)) {\n size = ruler.min * options.categoryPercentage;\n ratio = options.barPercentage;\n } else {\n size = thickness * stackCount;\n ratio = 1;\n }\n return {\n chunk: size / stackCount,\n ratio,\n start: ruler.pixels[index] - (size / 2)\n };\n}\nfunction computeFlexCategoryTraits(index, ruler, options, stackCount) {\n const pixels = ruler.pixels;\n const curr = pixels[index];\n let prev = index > 0 ? pixels[index - 1] : null;\n let next = index < pixels.length - 1 ? pixels[index + 1] : null;\n const percent = options.categoryPercentage;\n if (prev === null) {\n prev = curr - (next === null ? ruler.end - ruler.start : next - curr);\n }\n if (next === null) {\n next = curr + curr - prev;\n }\n const start = curr - (curr - Math.min(prev, next)) / 2 * percent;\n const size = Math.abs(next - prev) / 2 * percent;\n return {\n chunk: size / stackCount,\n ratio: options.barPercentage,\n start\n };\n}\nfunction parseFloatBar(entry, item, vScale, i) {\n const startValue = vScale.parse(entry[0], i);\n const endValue = vScale.parse(entry[1], i);\n const min = Math.min(startValue, endValue);\n const max = Math.max(startValue, endValue);\n let barStart = min;\n let barEnd = max;\n if (Math.abs(min) > Math.abs(max)) {\n barStart = max;\n barEnd = min;\n }\n item[vScale.axis] = barEnd;\n item._custom = {\n barStart,\n barEnd,\n start: startValue,\n end: endValue,\n min,\n max\n };\n}\nfunction parseValue(entry, item, vScale, i) {\n if (isArray(entry)) {\n parseFloatBar(entry, item, vScale, i);\n } else {\n item[vScale.axis] = vScale.parse(entry, i);\n }\n return item;\n}\nfunction parseArrayOrPrimitive(meta, data, start, count) {\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const labels = iScale.getLabels();\n const singleScale = iScale === vScale;\n const parsed = [];\n let i, ilen, item, entry;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n entry = data[i];\n item = {};\n item[iScale.axis] = singleScale || iScale.parse(labels[i], i);\n parsed.push(parseValue(entry, item, vScale, i));\n }\n return parsed;\n}\nfunction isFloatBar(custom) {\n return custom && custom.barStart !== undefined && custom.barEnd !== undefined;\n}\nfunction barSign(size, vScale, actualBase) {\n if (size !== 0) {\n return sign(size);\n }\n return (vScale.isHorizontal() ? 1 : -1) * (vScale.min >= actualBase ? 1 : -1);\n}\nfunction borderProps(properties) {\n let reverse, start, end, top, bottom;\n if (properties.horizontal) {\n reverse = properties.base > properties.x;\n start = 'left';\n end = 'right';\n } else {\n reverse = properties.base < properties.y;\n start = 'bottom';\n end = 'top';\n }\n if (reverse) {\n top = 'end';\n bottom = 'start';\n } else {\n top = 'start';\n bottom = 'end';\n }\n return {start, end, reverse, top, bottom};\n}\nfunction setBorderSkipped(properties, options, stack, index) {\n let edge = options.borderSkipped;\n const res = {};\n if (!edge) {\n properties.borderSkipped = res;\n return;\n }\n const {start, end, reverse, top, bottom} = borderProps(properties);\n if (edge === 'middle' && stack) {\n properties.enableBorderRadius = true;\n if ((stack._top || 0) === index) {\n edge = top;\n } else if ((stack._bottom || 0) === index) {\n edge = bottom;\n } else {\n res[parseEdge(bottom, start, end, reverse)] = true;\n edge = top;\n }\n }\n res[parseEdge(edge, start, end, reverse)] = true;\n properties.borderSkipped = res;\n}\nfunction parseEdge(edge, a, b, reverse) {\n if (reverse) {\n edge = swap(edge, a, b);\n edge = startEnd(edge, b, a);\n } else {\n edge = startEnd(edge, a, b);\n }\n return edge;\n}\nfunction swap(orig, v1, v2) {\n return orig === v1 ? v2 : orig === v2 ? v1 : orig;\n}\nfunction startEnd(v, start, end) {\n return v === 'start' ? start : v === 'end' ? end : v;\n}\nclass BarController extends DatasetController {\n parsePrimitiveData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n parseArrayData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n parseObjectData(meta, data, start, count) {\n const {iScale, vScale} = meta;\n const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n const iAxisKey = iScale.axis === 'x' ? xAxisKey : yAxisKey;\n const vAxisKey = vScale.axis === 'x' ? xAxisKey : yAxisKey;\n const parsed = [];\n let i, ilen, item, obj;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n obj = data[i];\n item = {};\n item[iScale.axis] = iScale.parse(resolveObjectKey(obj, iAxisKey), i);\n parsed.push(parseValue(resolveObjectKey(obj, vAxisKey), item, vScale, i));\n }\n return parsed;\n }\n updateRangeFromParsed(range, scale, parsed, stack) {\n super.updateRangeFromParsed(range, scale, parsed, stack);\n const custom = parsed._custom;\n if (custom && scale === this._cachedMeta.vScale) {\n range.min = Math.min(range.min, custom.min);\n range.max = Math.max(range.max, custom.max);\n }\n }\n getMaxOverflow() {\n return 0;\n }\n getLabelAndValue(index) {\n const me = this;\n const meta = me._cachedMeta;\n const {iScale, vScale} = meta;\n const parsed = me.getParsed(index);\n const custom = parsed._custom;\n const value = isFloatBar(custom)\n ? '[' + custom.start + ', ' + custom.end + ']'\n : '' + vScale.getLabelForValue(parsed[vScale.axis]);\n return {\n label: '' + iScale.getLabelForValue(parsed[iScale.axis]),\n value\n };\n }\n initialize() {\n const me = this;\n me.enableOptionSharing = true;\n super.initialize();\n const meta = me._cachedMeta;\n meta.stack = me.getDataset().stack;\n }\n update(mode) {\n const me = this;\n const meta = me._cachedMeta;\n me.updateElements(meta.data, 0, meta.data.length, mode);\n }\n updateElements(bars, start, count, mode) {\n const me = this;\n const reset = mode === 'reset';\n const {index, _cachedMeta: {vScale}} = me;\n const base = vScale.getBasePixel();\n const horizontal = vScale.isHorizontal();\n const ruler = me._getRuler();\n const firstOpts = me.resolveDataElementOptions(start, mode);\n const sharedOptions = me.getSharedOptions(firstOpts);\n const includeOptions = me.includeOptions(mode, sharedOptions);\n me.updateSharedOptions(sharedOptions, mode, firstOpts);\n for (let i = start; i < start + count; i++) {\n const parsed = me.getParsed(i);\n const vpixels = reset || isNullOrUndef(parsed[vScale.axis]) ? {base, head: base} : me._calculateBarValuePixels(i);\n const ipixels = me._calculateBarIndexPixels(i, ruler);\n const stack = (parsed._stacks || {})[vScale.axis];\n const properties = {\n horizontal,\n base: vpixels.base,\n enableBorderRadius: !stack || isFloatBar(parsed._custom) || (index === stack._top || index === stack._bottom),\n x: horizontal ? vpixels.head : ipixels.center,\n y: horizontal ? ipixels.center : vpixels.head,\n height: horizontal ? ipixels.size : Math.abs(vpixels.size),\n width: horizontal ? Math.abs(vpixels.size) : ipixels.size\n };\n if (includeOptions) {\n properties.options = sharedOptions || me.resolveDataElementOptions(i, bars[i].active ? 'active' : mode);\n }\n setBorderSkipped(properties, properties.options || bars[i].options, stack, index);\n me.updateElement(bars[i], i, properties, mode);\n }\n }\n _getStacks(last, dataIndex) {\n const me = this;\n const meta = me._cachedMeta;\n const iScale = meta.iScale;\n const metasets = iScale.getMatchingVisibleMetas(me._type);\n const stacked = iScale.options.stacked;\n const ilen = metasets.length;\n const stacks = [];\n let i, item;\n for (i = 0; i < ilen; ++i) {\n item = metasets[i];\n if (!item.controller.options.grouped) {\n continue;\n }\n if (typeof dataIndex !== 'undefined') {\n const val = item.controller.getParsed(dataIndex)[\n item.controller._cachedMeta.vScale.axis\n ];\n if (isNullOrUndef(val) || isNaN(val)) {\n continue;\n }\n }\n if (stacked === false || stacks.indexOf(item.stack) === -1 ||\n\t\t\t\t(stacked === undefined && item.stack === undefined)) {\n stacks.push(item.stack);\n }\n if (item.index === last) {\n break;\n }\n }\n if (!stacks.length) {\n stacks.push(undefined);\n }\n return stacks;\n }\n _getStackCount(index) {\n return this._getStacks(undefined, index).length;\n }\n _getStackIndex(datasetIndex, name, dataIndex) {\n const stacks = this._getStacks(datasetIndex, dataIndex);\n const index = (name !== undefined)\n ? stacks.indexOf(name)\n : -1;\n return (index === -1)\n ? stacks.length - 1\n : index;\n }\n _getRuler() {\n const me = this;\n const opts = me.options;\n const meta = me._cachedMeta;\n const iScale = meta.iScale;\n const pixels = [];\n let i, ilen;\n for (i = 0, ilen = meta.data.length; i < ilen; ++i) {\n pixels.push(iScale.getPixelForValue(me.getParsed(i)[iScale.axis], i));\n }\n const barThickness = opts.barThickness;\n const min = barThickness || computeMinSampleSize(iScale);\n return {\n min,\n pixels,\n start: iScale._startPixel,\n end: iScale._endPixel,\n stackCount: me._getStackCount(),\n scale: iScale,\n grouped: opts.grouped,\n ratio: barThickness ? 1 : opts.categoryPercentage * opts.barPercentage\n };\n }\n _calculateBarValuePixels(index) {\n const me = this;\n const {_cachedMeta: {vScale, _stacked}, options: {base: baseValue, minBarLength}} = me;\n const actualBase = baseValue || 0;\n const parsed = me.getParsed(index);\n const custom = parsed._custom;\n const floating = isFloatBar(custom);\n let value = parsed[vScale.axis];\n let start = 0;\n let length = _stacked ? me.applyStack(vScale, parsed, _stacked) : value;\n let head, size;\n if (length !== value) {\n start = length - value;\n length = value;\n }\n if (floating) {\n value = custom.barStart;\n length = custom.barEnd - custom.barStart;\n if (value !== 0 && sign(value) !== sign(custom.barEnd)) {\n start = 0;\n }\n start += value;\n }\n const startValue = !isNullOrUndef(baseValue) && !floating ? baseValue : start;\n let base = vScale.getPixelForValue(startValue);\n if (me.chart.getDataVisibility(index)) {\n head = vScale.getPixelForValue(start + length);\n } else {\n head = base;\n }\n size = head - base;\n if (Math.abs(size) < minBarLength) {\n size = barSign(size, vScale, actualBase) * minBarLength;\n if (value === actualBase) {\n base -= size / 2;\n }\n head = base + size;\n }\n if (base === vScale.getPixelForValue(actualBase)) {\n const halfGrid = sign(size) * vScale.getLineWidthForValue(actualBase) / 2;\n base += halfGrid;\n size -= halfGrid;\n }\n return {\n size,\n base,\n head,\n center: head + size / 2\n };\n }\n _calculateBarIndexPixels(index, ruler) {\n const me = this;\n const scale = ruler.scale;\n const options = me.options;\n const skipNull = options.skipNull;\n const maxBarThickness = valueOrDefault(options.maxBarThickness, Infinity);\n let center, size;\n if (ruler.grouped) {\n const stackCount = skipNull ? me._getStackCount(index) : ruler.stackCount;\n const range = options.barThickness === 'flex'\n ? computeFlexCategoryTraits(index, ruler, options, stackCount)\n : computeFitCategoryTraits(index, ruler, options, stackCount);\n const stackIndex = me._getStackIndex(me.index, me._cachedMeta.stack, skipNull ? index : undefined);\n center = range.start + (range.chunk * stackIndex) + (range.chunk / 2);\n size = Math.min(maxBarThickness, range.chunk * range.ratio);\n } else {\n center = scale.getPixelForValue(me.getParsed(index)[scale.axis], index);\n size = Math.min(maxBarThickness, ruler.min * ruler.ratio);\n }\n return {\n base: center - size / 2,\n head: center + size / 2,\n center,\n size\n };\n }\n draw() {\n const me = this;\n const meta = me._cachedMeta;\n const vScale = meta.vScale;\n const rects = meta.data;\n const ilen = rects.length;\n let i = 0;\n for (; i < ilen; ++i) {\n if (me.getParsed(i)[vScale.axis] !== null) {\n rects[i].draw(me._ctx);\n }\n }\n }\n}\nBarController.id = 'bar';\nBarController.defaults = {\n datasetElementType: false,\n dataElementType: 'bar',\n categoryPercentage: 0.8,\n barPercentage: 0.9,\n grouped: true,\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'base', 'width', 'height']\n }\n }\n};\nBarController.overrides = {\n scales: {\n _index_: {\n type: 'category',\n offset: true,\n grid: {\n offset: true\n }\n },\n _value_: {\n type: 'linear',\n beginAtZero: true,\n }\n }\n};\n\nclass BubbleController extends DatasetController {\n initialize() {\n this.enableOptionSharing = true;\n super.initialize();\n }\n parseObjectData(meta, data, start, count) {\n const {xScale, yScale} = meta;\n const {xAxisKey = 'x', yAxisKey = 'y'} = this._parsing;\n const parsed = [];\n let i, ilen, item;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n item = data[i];\n parsed.push({\n x: xScale.parse(resolveObjectKey(item, xAxisKey), i),\n y: yScale.parse(resolveObjectKey(item, yAxisKey), i),\n _custom: item && item.r && +item.r\n });\n }\n return parsed;\n }\n getMaxOverflow() {\n const {data, _parsed} = this._cachedMeta;\n let max = 0;\n for (let i = data.length - 1; i >= 0; --i) {\n max = Math.max(max, data[i].size() / 2, _parsed[i]._custom);\n }\n return max > 0 && max;\n }\n getLabelAndValue(index) {\n const me = this;\n const meta = me._cachedMeta;\n const {xScale, yScale} = meta;\n const parsed = me.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n const r = parsed._custom;\n return {\n label: meta.label,\n value: '(' + x + ', ' + y + (r ? ', ' + r : '') + ')'\n };\n }\n update(mode) {\n const me = this;\n const points = me._cachedMeta.data;\n me.updateElements(points, 0, points.length, mode);\n }\n updateElements(points, start, count, mode) {\n const me = this;\n const reset = mode === 'reset';\n const {iScale, vScale} = me._cachedMeta;\n const firstOpts = me.resolveDataElementOptions(start, mode);\n const sharedOptions = me.getSharedOptions(firstOpts);\n const includeOptions = me.includeOptions(mode, sharedOptions);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n for (let i = start; i < start + count; i++) {\n const point = points[i];\n const parsed = !reset && me.getParsed(i);\n const properties = {};\n const iPixel = properties[iAxis] = reset ? iScale.getPixelForDecimal(0.5) : iScale.getPixelForValue(parsed[iAxis]);\n const vPixel = properties[vAxis] = reset ? vScale.getBasePixel() : vScale.getPixelForValue(parsed[vAxis]);\n properties.skip = isNaN(iPixel) || isNaN(vPixel);\n if (includeOptions) {\n properties.options = me.resolveDataElementOptions(i, point.active ? 'active' : mode);\n if (reset) {\n properties.options.radius = 0;\n }\n }\n me.updateElement(point, i, properties, mode);\n }\n me.updateSharedOptions(sharedOptions, mode, firstOpts);\n }\n resolveDataElementOptions(index, mode) {\n const parsed = this.getParsed(index);\n let values = super.resolveDataElementOptions(index, mode);\n if (values.$shared) {\n values = Object.assign({}, values, {$shared: false});\n }\n const radius = values.radius;\n if (mode !== 'active') {\n values.radius = 0;\n }\n values.radius += valueOrDefault(parsed && parsed._custom, radius);\n return values;\n }\n}\nBubbleController.id = 'bubble';\nBubbleController.defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'borderWidth', 'radius']\n }\n }\n};\nBubbleController.overrides = {\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n },\n plugins: {\n tooltip: {\n callbacks: {\n title() {\n return '';\n }\n }\n }\n }\n};\n\nfunction getRatioAndOffset(rotation, circumference, cutout) {\n let ratioX = 1;\n let ratioY = 1;\n let offsetX = 0;\n let offsetY = 0;\n if (circumference < TAU) {\n const startAngle = rotation;\n const endAngle = startAngle + circumference;\n const startX = Math.cos(startAngle);\n const startY = Math.sin(startAngle);\n const endX = Math.cos(endAngle);\n const endY = Math.sin(endAngle);\n const calcMax = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? 1 : Math.max(a, a * cutout, b, b * cutout);\n const calcMin = (angle, a, b) => _angleBetween(angle, startAngle, endAngle, true) ? -1 : Math.min(a, a * cutout, b, b * cutout);\n const maxX = calcMax(0, startX, endX);\n const maxY = calcMax(HALF_PI, startY, endY);\n const minX = calcMin(PI, startX, endX);\n const minY = calcMin(PI + HALF_PI, startY, endY);\n ratioX = (maxX - minX) / 2;\n ratioY = (maxY - minY) / 2;\n offsetX = -(maxX + minX) / 2;\n offsetY = -(maxY + minY) / 2;\n }\n return {ratioX, ratioY, offsetX, offsetY};\n}\nclass DoughnutController extends DatasetController {\n constructor(chart, datasetIndex) {\n super(chart, datasetIndex);\n this.enableOptionSharing = true;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.offsetX = undefined;\n this.offsetY = undefined;\n }\n linkScales() {}\n parse(start, count) {\n const data = this.getDataset().data;\n const meta = this._cachedMeta;\n let i, ilen;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n meta._parsed[i] = +data[i];\n }\n }\n _getRotation() {\n return toRadians(this.options.rotation - 90);\n }\n _getCircumference() {\n return toRadians(this.options.circumference);\n }\n _getRotationExtents() {\n let min = TAU;\n let max = -TAU;\n const me = this;\n for (let i = 0; i < me.chart.data.datasets.length; ++i) {\n if (me.chart.isDatasetVisible(i)) {\n const controller = me.chart.getDatasetMeta(i).controller;\n const rotation = controller._getRotation();\n const circumference = controller._getCircumference();\n min = Math.min(min, rotation);\n max = Math.max(max, rotation + circumference);\n }\n }\n return {\n rotation: min,\n circumference: max - min,\n };\n }\n update(mode) {\n const me = this;\n const chart = me.chart;\n const {chartArea} = chart;\n const meta = me._cachedMeta;\n const arcs = meta.data;\n const spacing = me.getMaxBorderWidth() + me.getMaxOffset(arcs) + me.options.spacing;\n const maxSize = Math.max((Math.min(chartArea.width, chartArea.height) - spacing) / 2, 0);\n const cutout = Math.min(toPercentage(me.options.cutout, maxSize), 1);\n const chartWeight = me._getRingWeight(me.index);\n const {circumference, rotation} = me._getRotationExtents();\n const {ratioX, ratioY, offsetX, offsetY} = getRatioAndOffset(rotation, circumference, cutout);\n const maxWidth = (chartArea.width - spacing) / ratioX;\n const maxHeight = (chartArea.height - spacing) / ratioY;\n const maxRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0);\n const outerRadius = toDimension(me.options.radius, maxRadius);\n const innerRadius = Math.max(outerRadius * cutout, 0);\n const radiusLength = (outerRadius - innerRadius) / me._getVisibleDatasetWeightTotal();\n me.offsetX = offsetX * outerRadius;\n me.offsetY = offsetY * outerRadius;\n meta.total = me.calculateTotal();\n me.outerRadius = outerRadius - radiusLength * me._getRingWeightOffset(me.index);\n me.innerRadius = Math.max(me.outerRadius - radiusLength * chartWeight, 0);\n me.updateElements(arcs, 0, arcs.length, mode);\n }\n _circumference(i, reset) {\n const me = this;\n const opts = me.options;\n const meta = me._cachedMeta;\n const circumference = me._getCircumference();\n if ((reset && opts.animation.animateRotate) || !this.chart.getDataVisibility(i) || meta._parsed[i] === null || meta.data[i].hidden) {\n return 0;\n }\n return me.calculateCircumference(meta._parsed[i] * circumference / TAU);\n }\n updateElements(arcs, start, count, mode) {\n const me = this;\n const reset = mode === 'reset';\n const chart = me.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const centerX = (chartArea.left + chartArea.right) / 2;\n const centerY = (chartArea.top + chartArea.bottom) / 2;\n const animateScale = reset && animationOpts.animateScale;\n const innerRadius = animateScale ? 0 : me.innerRadius;\n const outerRadius = animateScale ? 0 : me.outerRadius;\n const firstOpts = me.resolveDataElementOptions(start, mode);\n const sharedOptions = me.getSharedOptions(firstOpts);\n const includeOptions = me.includeOptions(mode, sharedOptions);\n let startAngle = me._getRotation();\n let i;\n for (i = 0; i < start; ++i) {\n startAngle += me._circumference(i, reset);\n }\n for (i = start; i < start + count; ++i) {\n const circumference = me._circumference(i, reset);\n const arc = arcs[i];\n const properties = {\n x: centerX + me.offsetX,\n y: centerY + me.offsetY,\n startAngle,\n endAngle: startAngle + circumference,\n circumference,\n outerRadius,\n innerRadius\n };\n if (includeOptions) {\n properties.options = sharedOptions || me.resolveDataElementOptions(i, arc.active ? 'active' : mode);\n }\n startAngle += circumference;\n me.updateElement(arc, i, properties, mode);\n }\n me.updateSharedOptions(sharedOptions, mode, firstOpts);\n }\n calculateTotal() {\n const meta = this._cachedMeta;\n const metaData = meta.data;\n let total = 0;\n let i;\n for (i = 0; i < metaData.length; i++) {\n const value = meta._parsed[i];\n if (value !== null && !isNaN(value) && this.chart.getDataVisibility(i) && !metaData[i].hidden) {\n total += Math.abs(value);\n }\n }\n return total;\n }\n calculateCircumference(value) {\n const total = this._cachedMeta.total;\n if (total > 0 && !isNaN(value)) {\n return TAU * (Math.abs(value) / total);\n }\n return 0;\n }\n getLabelAndValue(index) {\n const me = this;\n const meta = me._cachedMeta;\n const chart = me.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index], chart.options.locale);\n return {\n label: labels[index] || '',\n value,\n };\n }\n getMaxBorderWidth(arcs) {\n const me = this;\n let max = 0;\n const chart = me.chart;\n let i, ilen, meta, controller, options;\n if (!arcs) {\n for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) {\n if (chart.isDatasetVisible(i)) {\n meta = chart.getDatasetMeta(i);\n arcs = meta.data;\n controller = meta.controller;\n if (controller !== me) {\n controller.configure();\n }\n break;\n }\n }\n }\n if (!arcs) {\n return 0;\n }\n for (i = 0, ilen = arcs.length; i < ilen; ++i) {\n options = controller.resolveDataElementOptions(i);\n if (options.borderAlign !== 'inner') {\n max = Math.max(max, options.borderWidth || 0, options.hoverBorderWidth || 0);\n }\n }\n return max;\n }\n getMaxOffset(arcs) {\n let max = 0;\n for (let i = 0, ilen = arcs.length; i < ilen; ++i) {\n const options = this.resolveDataElementOptions(i);\n max = Math.max(max, options.offset || 0, options.hoverOffset || 0);\n }\n return max;\n }\n _getRingWeightOffset(datasetIndex) {\n let ringWeightOffset = 0;\n for (let i = 0; i < datasetIndex; ++i) {\n if (this.chart.isDatasetVisible(i)) {\n ringWeightOffset += this._getRingWeight(i);\n }\n }\n return ringWeightOffset;\n }\n _getRingWeight(datasetIndex) {\n return Math.max(valueOrDefault(this.chart.data.datasets[datasetIndex].weight, 1), 0);\n }\n _getVisibleDatasetWeightTotal() {\n return this._getRingWeightOffset(this.chart.data.datasets.length) || 1;\n }\n}\nDoughnutController.id = 'doughnut';\nDoughnutController.defaults = {\n datasetElementType: false,\n dataElementType: 'arc',\n animation: {\n animateRotate: true,\n animateScale: false\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['circumference', 'endAngle', 'innerRadius', 'outerRadius', 'startAngle', 'x', 'y', 'offset', 'borderWidth', 'spacing']\n },\n },\n cutout: '50%',\n rotation: 0,\n circumference: 360,\n radius: '100%',\n spacing: 0,\n indexAxis: 'r',\n};\nDoughnutController.descriptors = {\n _scriptable: (name) => name !== 'spacing',\n _indexable: (name) => name !== 'spacing',\n};\nDoughnutController.overrides = {\n aspectRatio: 1,\n plugins: {\n legend: {\n labels: {\n generateLabels(chart) {\n const data = chart.data;\n if (data.labels.length && data.datasets.length) {\n const {labels: {pointStyle}} = chart.legend.options;\n return data.labels.map((label, i) => {\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n return {\n text: label,\n fillStyle: style.backgroundColor,\n strokeStyle: style.borderColor,\n lineWidth: style.borderWidth,\n pointStyle: pointStyle,\n hidden: !chart.getDataVisibility(i),\n index: i\n };\n });\n }\n return [];\n }\n },\n onClick(e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n },\n tooltip: {\n callbacks: {\n title() {\n return '';\n },\n label(tooltipItem) {\n let dataLabel = tooltipItem.label;\n const value = ': ' + tooltipItem.formattedValue;\n if (isArray(dataLabel)) {\n dataLabel = dataLabel.slice();\n dataLabel[0] += value;\n } else {\n dataLabel += value;\n }\n return dataLabel;\n }\n }\n }\n }\n};\n\nclass LineController extends DatasetController {\n initialize() {\n this.enableOptionSharing = true;\n super.initialize();\n }\n update(mode) {\n const me = this;\n const meta = me._cachedMeta;\n const {dataset: line, data: points = [], _dataset} = meta;\n const animationsDisabled = me.chart._animationsDisabled;\n let {start, count} = getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n me._drawStart = start;\n me._drawCount = count;\n if (scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n line._datasetIndex = me.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n const options = me.resolveDatasetElementOptions(mode);\n if (!me.options.showLine) {\n options.borderWidth = 0;\n }\n options.segment = me.options.segment;\n me.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n me.updateElements(points, start, count, mode);\n }\n updateElements(points, start, count, mode) {\n const me = this;\n const reset = mode === 'reset';\n const {iScale, vScale, _stacked} = me._cachedMeta;\n const firstOpts = me.resolveDataElementOptions(start, mode);\n const sharedOptions = me.getSharedOptions(firstOpts);\n const includeOptions = me.includeOptions(mode, sharedOptions);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const spanGaps = me.options.spanGaps;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = me.chart._animationsDisabled || reset || mode === 'none';\n let prevParsed = start > 0 && me.getParsed(start - 1);\n for (let i = start; i < start + count; ++i) {\n const point = points[i];\n const parsed = me.getParsed(i);\n const properties = directUpdate ? point : {};\n const nullData = isNullOrUndef(parsed[vAxis]);\n const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? me.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && (parsed[iAxis] - prevParsed[iAxis]) > maxGapLength;\n properties.parsed = parsed;\n if (includeOptions) {\n properties.options = sharedOptions || me.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n if (!directUpdate) {\n me.updateElement(point, i, properties, mode);\n }\n prevParsed = parsed;\n }\n me.updateSharedOptions(sharedOptions, mode, firstOpts);\n }\n getMaxOverflow() {\n const me = this;\n const meta = me._cachedMeta;\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n const data = meta.data || [];\n if (!data.length) {\n return border;\n }\n const firstPoint = data[0].size(me.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(me.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n draw() {\n const meta = this._cachedMeta;\n meta.dataset.updateControlPoints(this.chart.chartArea, meta.iScale.axis);\n super.draw();\n }\n}\nLineController.id = 'line';\nLineController.defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n showLine: true,\n spanGaps: false,\n};\nLineController.overrides = {\n scales: {\n _index_: {\n type: 'category',\n },\n _value_: {\n type: 'linear',\n },\n }\n};\nfunction getStartAndCountOfVisiblePoints(meta, points, animationsDisabled) {\n const pointCount = points.length;\n let start = 0;\n let count = pointCount;\n if (meta._sorted) {\n const {iScale, _parsed} = meta;\n const axis = iScale.axis;\n const {min, max, minDefined, maxDefined} = iScale.getUserBounds();\n if (minDefined) {\n start = _limitValue(Math.min(\n _lookupByKey(_parsed, iScale.axis, min).lo,\n animationsDisabled ? pointCount : _lookupByKey(points, axis, iScale.getPixelForValue(min)).lo),\n 0, pointCount - 1);\n }\n if (maxDefined) {\n count = _limitValue(Math.max(\n _lookupByKey(_parsed, iScale.axis, max).hi + 1,\n animationsDisabled ? 0 : _lookupByKey(points, axis, iScale.getPixelForValue(max)).hi + 1),\n start, pointCount) - start;\n } else {\n count = pointCount - start;\n }\n }\n return {start, count};\n}\nfunction scaleRangesChanged(meta) {\n const {xScale, yScale, _scaleRanges} = meta;\n const newRanges = {\n xmin: xScale.min,\n xmax: xScale.max,\n ymin: yScale.min,\n ymax: yScale.max\n };\n if (!_scaleRanges) {\n meta._scaleRanges = newRanges;\n return true;\n }\n const changed = _scaleRanges.xmin !== xScale.min\n\t\t|| _scaleRanges.xmax !== xScale.max\n\t\t|| _scaleRanges.ymin !== yScale.min\n\t\t|| _scaleRanges.ymax !== yScale.max;\n Object.assign(_scaleRanges, newRanges);\n return changed;\n}\n\nclass PolarAreaController extends DatasetController {\n constructor(chart, datasetIndex) {\n super(chart, datasetIndex);\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n }\n getLabelAndValue(index) {\n const me = this;\n const meta = me._cachedMeta;\n const chart = me.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index].r, chart.options.locale);\n return {\n label: labels[index] || '',\n value,\n };\n }\n update(mode) {\n const arcs = this._cachedMeta.data;\n this._updateRadius();\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n _updateRadius() {\n const me = this;\n const chart = me.chart;\n const chartArea = chart.chartArea;\n const opts = chart.options;\n const minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n const outerRadius = Math.max(minSize / 2, 0);\n const innerRadius = Math.max(opts.cutoutPercentage ? (outerRadius / 100) * (opts.cutoutPercentage) : 1, 0);\n const radiusLength = (outerRadius - innerRadius) / chart.getVisibleDatasetCount();\n me.outerRadius = outerRadius - (radiusLength * me.index);\n me.innerRadius = me.outerRadius - radiusLength;\n }\n updateElements(arcs, start, count, mode) {\n const me = this;\n const reset = mode === 'reset';\n const chart = me.chart;\n const dataset = me.getDataset();\n const opts = chart.options;\n const animationOpts = opts.animation;\n const scale = me._cachedMeta.rScale;\n const centerX = scale.xCenter;\n const centerY = scale.yCenter;\n const datasetStartAngle = scale.getIndexAngle(0) - 0.5 * PI;\n let angle = datasetStartAngle;\n let i;\n const defaultAngle = 360 / me.countVisibleElements();\n for (i = 0; i < start; ++i) {\n angle += me._computeAngle(i, mode, defaultAngle);\n }\n for (i = start; i < start + count; i++) {\n const arc = arcs[i];\n let startAngle = angle;\n let endAngle = angle + me._computeAngle(i, mode, defaultAngle);\n let outerRadius = chart.getDataVisibility(i) ? scale.getDistanceFromCenterForValue(dataset.data[i]) : 0;\n angle = endAngle;\n if (reset) {\n if (animationOpts.animateScale) {\n outerRadius = 0;\n }\n if (animationOpts.animateRotate) {\n startAngle = endAngle = datasetStartAngle;\n }\n }\n const properties = {\n x: centerX,\n y: centerY,\n innerRadius: 0,\n outerRadius,\n startAngle,\n endAngle,\n options: me.resolveDataElementOptions(i, arc.active ? 'active' : mode)\n };\n me.updateElement(arc, i, properties, mode);\n }\n }\n countVisibleElements() {\n const dataset = this.getDataset();\n const meta = this._cachedMeta;\n let count = 0;\n meta.data.forEach((element, index) => {\n if (!isNaN(dataset.data[index]) && this.chart.getDataVisibility(index)) {\n count++;\n }\n });\n return count;\n }\n _computeAngle(index, mode, defaultAngle) {\n return this.chart.getDataVisibility(index)\n ? toRadians(this.resolveDataElementOptions(index, mode).angle || defaultAngle)\n : 0;\n }\n}\nPolarAreaController.id = 'polarArea';\nPolarAreaController.defaults = {\n dataElementType: 'arc',\n animation: {\n animateRotate: true,\n animateScale: true\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'startAngle', 'endAngle', 'innerRadius', 'outerRadius']\n },\n },\n indexAxis: 'r',\n startAngle: 0,\n};\nPolarAreaController.overrides = {\n aspectRatio: 1,\n plugins: {\n legend: {\n labels: {\n generateLabels(chart) {\n const data = chart.data;\n if (data.labels.length && data.datasets.length) {\n const {labels: {pointStyle}} = chart.legend.options;\n return data.labels.map((label, i) => {\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n return {\n text: label,\n fillStyle: style.backgroundColor,\n strokeStyle: style.borderColor,\n lineWidth: style.borderWidth,\n pointStyle: pointStyle,\n hidden: !chart.getDataVisibility(i),\n index: i\n };\n });\n }\n return [];\n }\n },\n onClick(e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n },\n tooltip: {\n callbacks: {\n title() {\n return '';\n },\n label(context) {\n return context.chart.data.labels[context.dataIndex] + ': ' + context.formattedValue;\n }\n }\n }\n },\n scales: {\n r: {\n type: 'radialLinear',\n angleLines: {\n display: false\n },\n beginAtZero: true,\n grid: {\n circular: true\n },\n pointLabels: {\n display: false\n },\n startAngle: 0\n }\n }\n};\n\nclass PieController extends DoughnutController {\n}\nPieController.id = 'pie';\nPieController.defaults = {\n cutout: 0,\n rotation: 0,\n circumference: 360,\n radius: '100%'\n};\n\nclass RadarController extends DatasetController {\n getLabelAndValue(index) {\n const me = this;\n const vScale = me._cachedMeta.vScale;\n const parsed = me.getParsed(index);\n return {\n label: vScale.getLabels()[index],\n value: '' + vScale.getLabelForValue(parsed[vScale.axis])\n };\n }\n update(mode) {\n const me = this;\n const meta = me._cachedMeta;\n const line = meta.dataset;\n const points = meta.data || [];\n const labels = meta.iScale.getLabels();\n line.points = points;\n if (mode !== 'resize') {\n const options = me.resolveDatasetElementOptions(mode);\n if (!me.options.showLine) {\n options.borderWidth = 0;\n }\n const properties = {\n _loop: true,\n _fullLoop: labels.length === points.length,\n options\n };\n me.updateElement(line, undefined, properties, mode);\n }\n me.updateElements(points, 0, points.length, mode);\n }\n updateElements(points, start, count, mode) {\n const me = this;\n const dataset = me.getDataset();\n const scale = me._cachedMeta.rScale;\n const reset = mode === 'reset';\n for (let i = start; i < start + count; i++) {\n const point = points[i];\n const options = me.resolveDataElementOptions(i, point.active ? 'active' : mode);\n const pointPosition = scale.getPointPositionForValue(i, dataset.data[i]);\n const x = reset ? scale.xCenter : pointPosition.x;\n const y = reset ? scale.yCenter : pointPosition.y;\n const properties = {\n x,\n y,\n angle: pointPosition.angle,\n skip: isNaN(x) || isNaN(y),\n options\n };\n me.updateElement(point, i, properties, mode);\n }\n }\n}\nRadarController.id = 'radar';\nRadarController.defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n indexAxis: 'r',\n showLine: true,\n elements: {\n line: {\n fill: 'start'\n }\n },\n};\nRadarController.overrides = {\n aspectRatio: 1,\n scales: {\n r: {\n type: 'radialLinear',\n }\n }\n};\n\nclass ScatterController extends LineController {\n}\nScatterController.id = 'scatter';\nScatterController.defaults = {\n showLine: false,\n fill: false\n};\nScatterController.overrides = {\n interaction: {\n mode: 'point'\n },\n plugins: {\n tooltip: {\n callbacks: {\n title() {\n return '';\n },\n label(item) {\n return '(' + item.label + ', ' + item.formattedValue + ')';\n }\n }\n }\n },\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n};\n\nvar controllers = /*#__PURE__*/Object.freeze({\n__proto__: null,\nBarController: BarController,\nBubbleController: BubbleController,\nDoughnutController: DoughnutController,\nLineController: LineController,\nPolarAreaController: PolarAreaController,\nPieController: PieController,\nRadarController: RadarController,\nScatterController: ScatterController\n});\n\nfunction abstract() {\n throw new Error('This method is not implemented: Check that a complete date adapter is provided.');\n}\nclass DateAdapter {\n constructor(options) {\n this.options = options || {};\n }\n formats() {\n return abstract();\n }\n parse(value, format) {\n return abstract();\n }\n format(timestamp, format) {\n return abstract();\n }\n add(timestamp, amount, unit) {\n return abstract();\n }\n diff(a, b, unit) {\n return abstract();\n }\n startOf(timestamp, unit, weekday) {\n return abstract();\n }\n endOf(timestamp, unit) {\n return abstract();\n }\n}\nDateAdapter.override = function(members) {\n Object.assign(DateAdapter.prototype, members);\n};\nvar adapters = {\n _date: DateAdapter\n};\n\nfunction getRelativePosition(e, chart) {\n if ('native' in e) {\n return {\n x: e.x,\n y: e.y\n };\n }\n return getRelativePosition$1(e, chart);\n}\nfunction evaluateAllVisibleItems(chart, handler) {\n const metasets = chart.getSortedVisibleDatasetMetas();\n let index, data, element;\n for (let i = 0, ilen = metasets.length; i < ilen; ++i) {\n ({index, data} = metasets[i]);\n for (let j = 0, jlen = data.length; j < jlen; ++j) {\n element = data[j];\n if (!element.skip) {\n handler(element, index, j);\n }\n }\n }\n}\nfunction binarySearch(metaset, axis, value, intersect) {\n const {controller, data, _sorted} = metaset;\n const iScale = controller._cachedMeta.iScale;\n if (iScale && axis === iScale.axis && _sorted && data.length) {\n const lookupMethod = iScale._reversePixels ? _rlookupByKey : _lookupByKey;\n if (!intersect) {\n return lookupMethod(data, axis, value);\n } else if (controller._sharedOptions) {\n const el = data[0];\n const range = typeof el.getRange === 'function' && el.getRange(axis);\n if (range) {\n const start = lookupMethod(data, axis, value - range);\n const end = lookupMethod(data, axis, value + range);\n return {lo: start.lo, hi: end.hi};\n }\n }\n }\n return {lo: 0, hi: data.length - 1};\n}\nfunction optimizedEvaluateItems(chart, axis, position, handler, intersect) {\n const metasets = chart.getSortedVisibleDatasetMetas();\n const value = position[axis];\n for (let i = 0, ilen = metasets.length; i < ilen; ++i) {\n const {index, data} = metasets[i];\n const {lo, hi} = binarySearch(metasets[i], axis, value, intersect);\n for (let j = lo; j <= hi; ++j) {\n const element = data[j];\n if (!element.skip) {\n handler(element, index, j);\n }\n }\n }\n}\nfunction getDistanceMetricForAxis(axis) {\n const useX = axis.indexOf('x') !== -1;\n const useY = axis.indexOf('y') !== -1;\n return function(pt1, pt2) {\n const deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;\n const deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;\n return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\n };\n}\nfunction getIntersectItems(chart, position, axis, useFinalPosition) {\n const items = [];\n if (!_isPointInArea(position, chart.chartArea, chart._minPadding)) {\n return items;\n }\n const evaluationFunc = function(element, datasetIndex, index) {\n if (element.inRange(position.x, position.y, useFinalPosition)) {\n items.push({element, datasetIndex, index});\n }\n };\n optimizedEvaluateItems(chart, axis, position, evaluationFunc, true);\n return items;\n}\nfunction getNearestItems(chart, position, axis, intersect, useFinalPosition) {\n const distanceMetric = getDistanceMetricForAxis(axis);\n let minDistance = Number.POSITIVE_INFINITY;\n let items = [];\n if (!_isPointInArea(position, chart.chartArea, chart._minPadding)) {\n return items;\n }\n const evaluationFunc = function(element, datasetIndex, index) {\n if (intersect && !element.inRange(position.x, position.y, useFinalPosition)) {\n return;\n }\n const center = element.getCenterPoint(useFinalPosition);\n if (!_isPointInArea(center, chart.chartArea, chart._minPadding) && !element.inRange(position.x, position.y, useFinalPosition)) {\n return;\n }\n const distance = distanceMetric(position, center);\n if (distance < minDistance) {\n items = [{element, datasetIndex, index}];\n minDistance = distance;\n } else if (distance === minDistance) {\n items.push({element, datasetIndex, index});\n }\n };\n optimizedEvaluateItems(chart, axis, position, evaluationFunc);\n return items;\n}\nfunction getAxisItems(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const items = [];\n const axis = options.axis;\n const rangeMethod = axis === 'x' ? 'inXRange' : 'inYRange';\n let intersectsItem = false;\n evaluateAllVisibleItems(chart, (element, datasetIndex, index) => {\n if (element[rangeMethod](position[axis], useFinalPosition)) {\n items.push({element, datasetIndex, index});\n }\n if (element.inRange(position.x, position.y, useFinalPosition)) {\n intersectsItem = true;\n }\n });\n if (options.intersect && !intersectsItem) {\n return [];\n }\n return items;\n}\nvar Interaction = {\n modes: {\n index(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'x';\n const items = options.intersect\n ? getIntersectItems(chart, position, axis, useFinalPosition)\n : getNearestItems(chart, position, axis, false, useFinalPosition);\n const elements = [];\n if (!items.length) {\n return [];\n }\n chart.getSortedVisibleDatasetMetas().forEach((meta) => {\n const index = items[0].index;\n const element = meta.data[index];\n if (element && !element.skip) {\n elements.push({element, datasetIndex: meta.index, index});\n }\n });\n return elements;\n },\n dataset(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n let items = options.intersect\n ? getIntersectItems(chart, position, axis, useFinalPosition) :\n getNearestItems(chart, position, axis, false, useFinalPosition);\n if (items.length > 0) {\n const datasetIndex = items[0].datasetIndex;\n const data = chart.getDatasetMeta(datasetIndex).data;\n items = [];\n for (let i = 0; i < data.length; ++i) {\n items.push({element: data[i], datasetIndex, index: i});\n }\n }\n return items;\n },\n point(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n return getIntersectItems(chart, position, axis, useFinalPosition);\n },\n nearest(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n return getNearestItems(chart, position, axis, options.intersect, useFinalPosition);\n },\n x(chart, e, options, useFinalPosition) {\n options.axis = 'x';\n return getAxisItems(chart, e, options, useFinalPosition);\n },\n y(chart, e, options, useFinalPosition) {\n options.axis = 'y';\n return getAxisItems(chart, e, options, useFinalPosition);\n }\n }\n};\n\nconst STATIC_POSITIONS = ['left', 'top', 'right', 'bottom'];\nfunction filterByPosition(array, position) {\n return array.filter(v => v.pos === position);\n}\nfunction filterDynamicPositionByAxis(array, axis) {\n return array.filter(v => STATIC_POSITIONS.indexOf(v.pos) === -1 && v.box.axis === axis);\n}\nfunction sortByWeight(array, reverse) {\n return array.sort((a, b) => {\n const v0 = reverse ? b : a;\n const v1 = reverse ? a : b;\n return v0.weight === v1.weight ?\n v0.index - v1.index :\n v0.weight - v1.weight;\n });\n}\nfunction wrapBoxes(boxes) {\n const layoutBoxes = [];\n let i, ilen, box, pos, stack, stackWeight;\n for (i = 0, ilen = (boxes || []).length; i < ilen; ++i) {\n box = boxes[i];\n ({position: pos, options: {stack, stackWeight = 1}} = box);\n layoutBoxes.push({\n index: i,\n box,\n pos,\n horizontal: box.isHorizontal(),\n weight: box.weight,\n stack: stack && (pos + stack),\n stackWeight\n });\n }\n return layoutBoxes;\n}\nfunction buildStacks(layouts) {\n const stacks = {};\n for (const wrap of layouts) {\n const {stack, pos, stackWeight} = wrap;\n if (!stack || !STATIC_POSITIONS.includes(pos)) {\n continue;\n }\n const _stack = stacks[stack] || (stacks[stack] = {count: 0, placed: 0, weight: 0, size: 0});\n _stack.count++;\n _stack.weight += stackWeight;\n }\n return stacks;\n}\nfunction setLayoutDims(layouts, params) {\n const stacks = buildStacks(layouts);\n const {vBoxMaxWidth, hBoxMaxHeight} = params;\n let i, ilen, layout;\n for (i = 0, ilen = layouts.length; i < ilen; ++i) {\n layout = layouts[i];\n const {fullSize} = layout.box;\n const stack = stacks[layout.stack];\n const factor = stack && layout.stackWeight / stack.weight;\n if (layout.horizontal) {\n layout.width = factor ? factor * vBoxMaxWidth : fullSize && params.availableWidth;\n layout.height = hBoxMaxHeight;\n } else {\n layout.width = vBoxMaxWidth;\n layout.height = factor ? factor * hBoxMaxHeight : fullSize && params.availableHeight;\n }\n }\n return stacks;\n}\nfunction buildLayoutBoxes(boxes) {\n const layoutBoxes = wrapBoxes(boxes);\n const fullSize = sortByWeight(layoutBoxes.filter(wrap => wrap.box.fullSize), true);\n const left = sortByWeight(filterByPosition(layoutBoxes, 'left'), true);\n const right = sortByWeight(filterByPosition(layoutBoxes, 'right'));\n const top = sortByWeight(filterByPosition(layoutBoxes, 'top'), true);\n const bottom = sortByWeight(filterByPosition(layoutBoxes, 'bottom'));\n const centerHorizontal = filterDynamicPositionByAxis(layoutBoxes, 'x');\n const centerVertical = filterDynamicPositionByAxis(layoutBoxes, 'y');\n return {\n fullSize,\n leftAndTop: left.concat(top),\n rightAndBottom: right.concat(centerVertical).concat(bottom).concat(centerHorizontal),\n chartArea: filterByPosition(layoutBoxes, 'chartArea'),\n vertical: left.concat(right).concat(centerVertical),\n horizontal: top.concat(bottom).concat(centerHorizontal)\n };\n}\nfunction getCombinedMax(maxPadding, chartArea, a, b) {\n return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]);\n}\nfunction updateMaxPadding(maxPadding, boxPadding) {\n maxPadding.top = Math.max(maxPadding.top, boxPadding.top);\n maxPadding.left = Math.max(maxPadding.left, boxPadding.left);\n maxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom);\n maxPadding.right = Math.max(maxPadding.right, boxPadding.right);\n}\nfunction updateDims(chartArea, params, layout, stacks) {\n const {pos, box} = layout;\n const maxPadding = chartArea.maxPadding;\n if (!isObject(pos)) {\n if (layout.size) {\n chartArea[pos] -= layout.size;\n }\n const stack = stacks[layout.stack] || {size: 0, count: 1};\n stack.size = Math.max(stack.size, layout.horizontal ? box.height : box.width);\n layout.size = stack.size / stack.count;\n chartArea[pos] += layout.size;\n }\n if (box.getPadding) {\n updateMaxPadding(maxPadding, box.getPadding());\n }\n const newWidth = Math.max(0, params.outerWidth - getCombinedMax(maxPadding, chartArea, 'left', 'right'));\n const newHeight = Math.max(0, params.outerHeight - getCombinedMax(maxPadding, chartArea, 'top', 'bottom'));\n const widthChanged = newWidth !== chartArea.w;\n const heightChanged = newHeight !== chartArea.h;\n chartArea.w = newWidth;\n chartArea.h = newHeight;\n return layout.horizontal\n ? {same: widthChanged, other: heightChanged}\n : {same: heightChanged, other: widthChanged};\n}\nfunction handleMaxPadding(chartArea) {\n const maxPadding = chartArea.maxPadding;\n function updatePos(pos) {\n const change = Math.max(maxPadding[pos] - chartArea[pos], 0);\n chartArea[pos] += change;\n return change;\n }\n chartArea.y += updatePos('top');\n chartArea.x += updatePos('left');\n updatePos('right');\n updatePos('bottom');\n}\nfunction getMargins(horizontal, chartArea) {\n const maxPadding = chartArea.maxPadding;\n function marginForPositions(positions) {\n const margin = {left: 0, top: 0, right: 0, bottom: 0};\n positions.forEach((pos) => {\n margin[pos] = Math.max(chartArea[pos], maxPadding[pos]);\n });\n return margin;\n }\n return horizontal\n ? marginForPositions(['left', 'right'])\n : marginForPositions(['top', 'bottom']);\n}\nfunction fitBoxes(boxes, chartArea, params, stacks) {\n const refitBoxes = [];\n let i, ilen, layout, box, refit, changed;\n for (i = 0, ilen = boxes.length, refit = 0; i < ilen; ++i) {\n layout = boxes[i];\n box = layout.box;\n box.update(\n layout.width || chartArea.w,\n layout.height || chartArea.h,\n getMargins(layout.horizontal, chartArea)\n );\n const {same, other} = updateDims(chartArea, params, layout, stacks);\n refit |= same && refitBoxes.length;\n changed = changed || other;\n if (!box.fullSize) {\n refitBoxes.push(layout);\n }\n }\n return refit && fitBoxes(refitBoxes, chartArea, params, stacks) || changed;\n}\nfunction setBoxDims(box, left, top, width, height) {\n box.top = top;\n box.left = left;\n box.right = left + width;\n box.bottom = top + height;\n box.width = width;\n box.height = height;\n}\nfunction placeBoxes(boxes, chartArea, params, stacks) {\n const userPadding = params.padding;\n let {x, y} = chartArea;\n for (const layout of boxes) {\n const box = layout.box;\n const stack = stacks[layout.stack] || {count: 1, placed: 0, weight: 1};\n const weight = (layout.stackWeight / stack.weight) || 1;\n if (layout.horizontal) {\n const width = chartArea.w * weight;\n const height = stack.size || box.height;\n if (defined(stack.start)) {\n y = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, userPadding.left, y, params.outerWidth - userPadding.right - userPadding.left, height);\n } else {\n setBoxDims(box, chartArea.left + stack.placed, y, width, height);\n }\n stack.start = y;\n stack.placed += width;\n y = box.bottom;\n } else {\n const height = chartArea.h * weight;\n const width = stack.size || box.width;\n if (defined(stack.start)) {\n x = stack.start;\n }\n if (box.fullSize) {\n setBoxDims(box, x, userPadding.top, width, params.outerHeight - userPadding.bottom - userPadding.top);\n } else {\n setBoxDims(box, x, chartArea.top + stack.placed, width, height);\n }\n stack.start = x;\n stack.placed += height;\n x = box.right;\n }\n }\n chartArea.x = x;\n chartArea.y = y;\n}\ndefaults.set('layout', {\n padding: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n }\n});\nvar layouts = {\n addBox(chart, item) {\n if (!chart.boxes) {\n chart.boxes = [];\n }\n item.fullSize = item.fullSize || false;\n item.position = item.position || 'top';\n item.weight = item.weight || 0;\n item._layers = item._layers || function() {\n return [{\n z: 0,\n draw(chartArea) {\n item.draw(chartArea);\n }\n }];\n };\n chart.boxes.push(item);\n },\n removeBox(chart, layoutItem) {\n const index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;\n if (index !== -1) {\n chart.boxes.splice(index, 1);\n }\n },\n configure(chart, item, options) {\n item.fullSize = options.fullSize;\n item.position = options.position;\n item.weight = options.weight;\n },\n update(chart, width, height, minPadding) {\n if (!chart) {\n return;\n }\n const padding = toPadding(chart.options.layout.padding);\n const availableWidth = Math.max(width - padding.width, 0);\n const availableHeight = Math.max(height - padding.height, 0);\n const boxes = buildLayoutBoxes(chart.boxes);\n const verticalBoxes = boxes.vertical;\n const horizontalBoxes = boxes.horizontal;\n each(chart.boxes, box => {\n if (typeof box.beforeLayout === 'function') {\n box.beforeLayout();\n }\n });\n const visibleVerticalBoxCount = verticalBoxes.reduce((total, wrap) =>\n wrap.box.options && wrap.box.options.display === false ? total : total + 1, 0) || 1;\n const params = Object.freeze({\n outerWidth: width,\n outerHeight: height,\n padding,\n availableWidth,\n availableHeight,\n vBoxMaxWidth: availableWidth / 2 / visibleVerticalBoxCount,\n hBoxMaxHeight: availableHeight / 2\n });\n const maxPadding = Object.assign({}, padding);\n updateMaxPadding(maxPadding, toPadding(minPadding));\n const chartArea = Object.assign({\n maxPadding,\n w: availableWidth,\n h: availableHeight,\n x: padding.left,\n y: padding.top\n }, padding);\n const stacks = setLayoutDims(verticalBoxes.concat(horizontalBoxes), params);\n fitBoxes(boxes.fullSize, chartArea, params, stacks);\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n if (fitBoxes(horizontalBoxes, chartArea, params, stacks)) {\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n }\n handleMaxPadding(chartArea);\n placeBoxes(boxes.leftAndTop, chartArea, params, stacks);\n chartArea.x += chartArea.w;\n chartArea.y += chartArea.h;\n placeBoxes(boxes.rightAndBottom, chartArea, params, stacks);\n chart.chartArea = {\n left: chartArea.left,\n top: chartArea.top,\n right: chartArea.left + chartArea.w,\n bottom: chartArea.top + chartArea.h,\n height: chartArea.h,\n width: chartArea.w,\n };\n each(boxes.chartArea, (layout) => {\n const box = layout.box;\n Object.assign(box, chart.chartArea);\n box.update(chartArea.w, chartArea.h);\n });\n }\n};\n\nclass BasePlatform {\n acquireContext(canvas, aspectRatio) {}\n releaseContext(context) {\n return false;\n }\n addEventListener(chart, type, listener) {}\n removeEventListener(chart, type, listener) {}\n getDevicePixelRatio() {\n return 1;\n }\n getMaximumSize(element, width, height, aspectRatio) {\n width = Math.max(0, width || element.width);\n height = height || element.height;\n return {\n width,\n height: Math.max(0, aspectRatio ? Math.floor(width / aspectRatio) : height)\n };\n }\n isAttached(canvas) {\n return true;\n }\n}\n\nclass BasicPlatform extends BasePlatform {\n acquireContext(item) {\n return item && item.getContext && item.getContext('2d') || null;\n }\n}\n\nconst EXPANDO_KEY = '$chartjs';\nconst EVENT_TYPES = {\n touchstart: 'mousedown',\n touchmove: 'mousemove',\n touchend: 'mouseup',\n pointerenter: 'mouseenter',\n pointerdown: 'mousedown',\n pointermove: 'mousemove',\n pointerup: 'mouseup',\n pointerleave: 'mouseout',\n pointerout: 'mouseout'\n};\nconst isNullOrEmpty = value => value === null || value === '';\nfunction initCanvas(canvas, aspectRatio) {\n const style = canvas.style;\n const renderHeight = canvas.getAttribute('height');\n const renderWidth = canvas.getAttribute('width');\n canvas[EXPANDO_KEY] = {\n initial: {\n height: renderHeight,\n width: renderWidth,\n style: {\n display: style.display,\n height: style.height,\n width: style.width\n }\n }\n };\n style.display = style.display || 'block';\n style.boxSizing = style.boxSizing || 'border-box';\n if (isNullOrEmpty(renderWidth)) {\n const displayWidth = readUsedSize(canvas, 'width');\n if (displayWidth !== undefined) {\n canvas.width = displayWidth;\n }\n }\n if (isNullOrEmpty(renderHeight)) {\n if (canvas.style.height === '') {\n canvas.height = canvas.width / (aspectRatio || 2);\n } else {\n const displayHeight = readUsedSize(canvas, 'height');\n if (displayHeight !== undefined) {\n canvas.height = displayHeight;\n }\n }\n }\n return canvas;\n}\nconst eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false;\nfunction addListener(node, type, listener) {\n node.addEventListener(type, listener, eventListenerOptions);\n}\nfunction removeListener(chart, type, listener) {\n chart.canvas.removeEventListener(type, listener, eventListenerOptions);\n}\nfunction fromNativeEvent(event, chart) {\n const type = EVENT_TYPES[event.type] || event.type;\n const {x, y} = getRelativePosition$1(event, chart);\n return {\n type,\n chart,\n native: event,\n x: x !== undefined ? x : null,\n y: y !== undefined ? y : null,\n };\n}\nfunction createAttachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const container = canvas && _getParentNode(canvas);\n const element = container || canvas;\n const observer = new MutationObserver(entries => {\n const parent = _getParentNode(element);\n entries.forEach(entry => {\n for (let i = 0; i < entry.addedNodes.length; i++) {\n const added = entry.addedNodes[i];\n if (added === element || added === parent) {\n listener(entry.target);\n }\n }\n });\n });\n observer.observe(document, {childList: true, subtree: true});\n return observer;\n}\nfunction createDetachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n return;\n }\n const observer = new MutationObserver(entries => {\n entries.forEach(entry => {\n for (let i = 0; i < entry.removedNodes.length; i++) {\n if (entry.removedNodes[i] === canvas) {\n listener();\n break;\n }\n }\n });\n });\n observer.observe(container, {childList: true});\n return observer;\n}\nconst drpListeningCharts = new Map();\nlet oldDevicePixelRatio = 0;\nfunction onWindowResize() {\n const dpr = window.devicePixelRatio;\n if (dpr === oldDevicePixelRatio) {\n return;\n }\n oldDevicePixelRatio = dpr;\n drpListeningCharts.forEach((resize, chart) => {\n if (chart.currentDevicePixelRatio !== dpr) {\n resize();\n }\n });\n}\nfunction listenDevicePixelRatioChanges(chart, resize) {\n if (!drpListeningCharts.size) {\n window.addEventListener('resize', onWindowResize);\n }\n drpListeningCharts.set(chart, resize);\n}\nfunction unlistenDevicePixelRatioChanges(chart) {\n drpListeningCharts.delete(chart);\n if (!drpListeningCharts.size) {\n window.removeEventListener('resize', onWindowResize);\n }\n}\nfunction createResizeObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const container = canvas && _getParentNode(canvas);\n if (!container) {\n return;\n }\n const resize = throttled((width, height) => {\n const w = container.clientWidth;\n listener(width, height);\n if (w < container.clientWidth) {\n listener();\n }\n }, window);\n const observer = new ResizeObserver(entries => {\n const entry = entries[0];\n const width = entry.contentRect.width;\n const height = entry.contentRect.height;\n if (width === 0 && height === 0) {\n return;\n }\n resize(width, height);\n });\n observer.observe(container);\n listenDevicePixelRatioChanges(chart, resize);\n return observer;\n}\nfunction releaseObserver(chart, type, observer) {\n if (observer) {\n observer.disconnect();\n }\n if (type === 'resize') {\n unlistenDevicePixelRatioChanges(chart);\n }\n}\nfunction createProxyAndListen(chart, type, listener) {\n const canvas = chart.canvas;\n const proxy = throttled((event) => {\n if (chart.ctx !== null) {\n listener(fromNativeEvent(event, chart));\n }\n }, chart, (args) => {\n const event = args[0];\n return [event, event.offsetX, event.offsetY];\n });\n addListener(canvas, type, proxy);\n return proxy;\n}\nclass DomPlatform extends BasePlatform {\n acquireContext(canvas, aspectRatio) {\n const context = canvas && canvas.getContext && canvas.getContext('2d');\n if (context && context.canvas === canvas) {\n initCanvas(canvas, aspectRatio);\n return context;\n }\n return null;\n }\n releaseContext(context) {\n const canvas = context.canvas;\n if (!canvas[EXPANDO_KEY]) {\n return false;\n }\n const initial = canvas[EXPANDO_KEY].initial;\n ['height', 'width'].forEach((prop) => {\n const value = initial[prop];\n if (isNullOrUndef(value)) {\n canvas.removeAttribute(prop);\n } else {\n canvas.setAttribute(prop, value);\n }\n });\n const style = initial.style || {};\n Object.keys(style).forEach((key) => {\n canvas.style[key] = style[key];\n });\n canvas.width = canvas.width;\n delete canvas[EXPANDO_KEY];\n return true;\n }\n addEventListener(chart, type, listener) {\n this.removeEventListener(chart, type);\n const proxies = chart.$proxies || (chart.$proxies = {});\n const handlers = {\n attach: createAttachObserver,\n detach: createDetachObserver,\n resize: createResizeObserver\n };\n const handler = handlers[type] || createProxyAndListen;\n proxies[type] = handler(chart, type, listener);\n }\n removeEventListener(chart, type) {\n const proxies = chart.$proxies || (chart.$proxies = {});\n const proxy = proxies[type];\n if (!proxy) {\n return;\n }\n const handlers = {\n attach: releaseObserver,\n detach: releaseObserver,\n resize: releaseObserver\n };\n const handler = handlers[type] || removeListener;\n handler(chart, type, proxy);\n proxies[type] = undefined;\n }\n getDevicePixelRatio() {\n return window.devicePixelRatio;\n }\n getMaximumSize(canvas, width, height, aspectRatio) {\n return getMaximumSize(canvas, width, height, aspectRatio);\n }\n isAttached(canvas) {\n const container = _getParentNode(canvas);\n return !!(container && container.isConnected);\n }\n}\n\nfunction _detectPlatform(canvas) {\n if (!_isDomSupported() || (typeof OffscreenCanvas !== 'undefined' && canvas instanceof OffscreenCanvas)) {\n return BasicPlatform;\n }\n return DomPlatform;\n}\n\nclass Element {\n constructor() {\n this.x = undefined;\n this.y = undefined;\n this.active = false;\n this.options = undefined;\n this.$animations = undefined;\n }\n tooltipPosition(useFinalPosition) {\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return {x, y};\n }\n hasValue() {\n return isNumber(this.x) && isNumber(this.y);\n }\n getProps(props, final) {\n const me = this;\n const anims = this.$animations;\n if (!final || !anims) {\n return me;\n }\n const ret = {};\n props.forEach(prop => {\n ret[prop] = anims[prop] && anims[prop].active() ? anims[prop]._to : me[prop];\n });\n return ret;\n }\n}\nElement.defaults = {};\nElement.defaultRoutes = undefined;\n\nconst formatters = {\n values(value) {\n return isArray(value) ? value : '' + value;\n },\n numeric(tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0';\n }\n const locale = this.chart.options.locale;\n let notation;\n let delta = tickValue;\n if (ticks.length > 1) {\n const maxTick = Math.max(Math.abs(ticks[0].value), Math.abs(ticks[ticks.length - 1].value));\n if (maxTick < 1e-4 || maxTick > 1e+15) {\n notation = 'scientific';\n }\n delta = calculateDelta(tickValue, ticks);\n }\n const logDelta = log10(Math.abs(delta));\n const numDecimal = Math.max(Math.min(-1 * Math.floor(logDelta), 20), 0);\n const options = {notation, minimumFractionDigits: numDecimal, maximumFractionDigits: numDecimal};\n Object.assign(options, this.options.ticks.format);\n return formatNumber(tickValue, locale, options);\n },\n logarithmic(tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0';\n }\n const remain = tickValue / (Math.pow(10, Math.floor(log10(tickValue))));\n if (remain === 1 || remain === 2 || remain === 5) {\n return formatters.numeric.call(this, tickValue, index, ticks);\n }\n return '';\n }\n};\nfunction calculateDelta(tickValue, ticks) {\n let delta = ticks.length > 3 ? ticks[2].value - ticks[1].value : ticks[1].value - ticks[0].value;\n if (Math.abs(delta) >= 1 && tickValue !== Math.floor(tickValue)) {\n delta = tickValue - Math.floor(tickValue);\n }\n return delta;\n}\nvar Ticks = {formatters};\n\ndefaults.set('scale', {\n display: true,\n offset: false,\n reverse: false,\n beginAtZero: false,\n bounds: 'ticks',\n grace: 0,\n grid: {\n display: true,\n lineWidth: 1,\n drawBorder: true,\n drawOnChartArea: true,\n drawTicks: true,\n tickLength: 8,\n tickWidth: (_ctx, options) => options.lineWidth,\n tickColor: (_ctx, options) => options.color,\n offset: false,\n borderDash: [],\n borderDashOffset: 0.0,\n borderWidth: 1\n },\n title: {\n display: false,\n text: '',\n padding: {\n top: 4,\n bottom: 4\n }\n },\n ticks: {\n minRotation: 0,\n maxRotation: 50,\n mirror: false,\n textStrokeWidth: 0,\n textStrokeColor: '',\n padding: 3,\n display: true,\n autoSkip: true,\n autoSkipPadding: 3,\n labelOffset: 0,\n callback: Ticks.formatters.values,\n minor: {},\n major: {},\n align: 'center',\n crossAlign: 'near',\n showLabelBackdrop: false,\n backdropColor: 'rgba(255, 255, 255, 0.75)',\n backdropPadding: 2,\n }\n});\ndefaults.route('scale.ticks', 'color', '', 'color');\ndefaults.route('scale.grid', 'color', '', 'borderColor');\ndefaults.route('scale.grid', 'borderColor', '', 'borderColor');\ndefaults.route('scale.title', 'color', '', 'color');\ndefaults.describe('scale', {\n _fallback: false,\n _scriptable: (name) => !name.startsWith('before') && !name.startsWith('after') && name !== 'callback' && name !== 'parser',\n _indexable: (name) => name !== 'borderDash' && name !== 'tickBorderDash',\n});\ndefaults.describe('scales', {\n _fallback: 'scale',\n});\ndefaults.describe('scale.ticks', {\n _scriptable: (name) => name !== 'backdropPadding' && name !== 'callback',\n _indexable: (name) => name !== 'backdropPadding',\n});\n\nfunction autoSkip(scale, ticks) {\n const tickOpts = scale.options.ticks;\n const ticksLimit = tickOpts.maxTicksLimit || determineMaxTicks(scale);\n const majorIndices = tickOpts.major.enabled ? getMajorIndices(ticks) : [];\n const numMajorIndices = majorIndices.length;\n const first = majorIndices[0];\n const last = majorIndices[numMajorIndices - 1];\n const newTicks = [];\n if (numMajorIndices > ticksLimit) {\n skipMajors(ticks, newTicks, majorIndices, numMajorIndices / ticksLimit);\n return newTicks;\n }\n const spacing = calculateSpacing(majorIndices, ticks, ticksLimit);\n if (numMajorIndices > 0) {\n let i, ilen;\n const avgMajorSpacing = numMajorIndices > 1 ? Math.round((last - first) / (numMajorIndices - 1)) : null;\n skip(ticks, newTicks, spacing, isNullOrUndef(avgMajorSpacing) ? 0 : first - avgMajorSpacing, first);\n for (i = 0, ilen = numMajorIndices - 1; i < ilen; i++) {\n skip(ticks, newTicks, spacing, majorIndices[i], majorIndices[i + 1]);\n }\n skip(ticks, newTicks, spacing, last, isNullOrUndef(avgMajorSpacing) ? ticks.length : last + avgMajorSpacing);\n return newTicks;\n }\n skip(ticks, newTicks, spacing);\n return newTicks;\n}\nfunction determineMaxTicks(scale) {\n const offset = scale.options.offset;\n const tickLength = scale._tickSize();\n const maxScale = scale._length / tickLength + (offset ? 0 : 1);\n const maxChart = scale._maxLength / tickLength;\n return Math.floor(Math.min(maxScale, maxChart));\n}\nfunction calculateSpacing(majorIndices, ticks, ticksLimit) {\n const evenMajorSpacing = getEvenSpacing(majorIndices);\n const spacing = ticks.length / ticksLimit;\n if (!evenMajorSpacing) {\n return Math.max(spacing, 1);\n }\n const factors = _factorize(evenMajorSpacing);\n for (let i = 0, ilen = factors.length - 1; i < ilen; i++) {\n const factor = factors[i];\n if (factor > spacing) {\n return factor;\n }\n }\n return Math.max(spacing, 1);\n}\nfunction getMajorIndices(ticks) {\n const result = [];\n let i, ilen;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n if (ticks[i].major) {\n result.push(i);\n }\n }\n return result;\n}\nfunction skipMajors(ticks, newTicks, majorIndices, spacing) {\n let count = 0;\n let next = majorIndices[0];\n let i;\n spacing = Math.ceil(spacing);\n for (i = 0; i < ticks.length; i++) {\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = majorIndices[count * spacing];\n }\n }\n}\nfunction skip(ticks, newTicks, spacing, majorStart, majorEnd) {\n const start = valueOrDefault(majorStart, 0);\n const end = Math.min(valueOrDefault(majorEnd, ticks.length), ticks.length);\n let count = 0;\n let length, i, next;\n spacing = Math.ceil(spacing);\n if (majorEnd) {\n length = majorEnd - majorStart;\n spacing = length / Math.floor(length / spacing);\n }\n next = start;\n while (next < 0) {\n count++;\n next = Math.round(start + count * spacing);\n }\n for (i = Math.max(start, 0); i < end; i++) {\n if (i === next) {\n newTicks.push(ticks[i]);\n count++;\n next = Math.round(start + count * spacing);\n }\n }\n}\nfunction getEvenSpacing(arr) {\n const len = arr.length;\n let i, diff;\n if (len < 2) {\n return false;\n }\n for (diff = arr[0], i = 1; i < len; ++i) {\n if (arr[i] - arr[i - 1] !== diff) {\n return false;\n }\n }\n return diff;\n}\n\nconst reverseAlign = (align) => align === 'left' ? 'right' : align === 'right' ? 'left' : align;\nconst offsetFromEdge = (scale, edge, offset) => edge === 'top' || edge === 'left' ? scale[edge] + offset : scale[edge] - offset;\nfunction sample(arr, numItems) {\n const result = [];\n const increment = arr.length / numItems;\n const len = arr.length;\n let i = 0;\n for (; i < len; i += increment) {\n result.push(arr[Math.floor(i)]);\n }\n return result;\n}\nfunction getPixelForGridLine(scale, index, offsetGridLines) {\n const length = scale.ticks.length;\n const validIndex = Math.min(index, length - 1);\n const start = scale._startPixel;\n const end = scale._endPixel;\n const epsilon = 1e-6;\n let lineValue = scale.getPixelForTick(validIndex);\n let offset;\n if (offsetGridLines) {\n if (length === 1) {\n offset = Math.max(lineValue - start, end - lineValue);\n } else if (index === 0) {\n offset = (scale.getPixelForTick(1) - lineValue) / 2;\n } else {\n offset = (lineValue - scale.getPixelForTick(validIndex - 1)) / 2;\n }\n lineValue += validIndex < index ? offset : -offset;\n if (lineValue < start - epsilon || lineValue > end + epsilon) {\n return;\n }\n }\n return lineValue;\n}\nfunction garbageCollect(caches, length) {\n each(caches, (cache) => {\n const gc = cache.gc;\n const gcLen = gc.length / 2;\n let i;\n if (gcLen > length) {\n for (i = 0; i < gcLen; ++i) {\n delete cache.data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n });\n}\nfunction getTickMarkLength(options) {\n return options.drawTicks ? options.tickLength : 0;\n}\nfunction getTitleHeight(options, fallback) {\n if (!options.display) {\n return 0;\n }\n const font = toFont(options.font, fallback);\n const padding = toPadding(options.padding);\n const lines = isArray(options.text) ? options.text.length : 1;\n return (lines * font.lineHeight) + padding.height;\n}\nfunction createScaleContext(parent, scale) {\n return Object.assign(Object.create(parent), {\n scale,\n type: 'scale'\n });\n}\nfunction createTickContext(parent, index, tick) {\n return Object.assign(Object.create(parent), {\n tick,\n index,\n type: 'tick'\n });\n}\nfunction titleAlign(align, position, reverse) {\n let ret = _toLeftRightCenter(align);\n if ((reverse && position !== 'right') || (!reverse && position === 'right')) {\n ret = reverseAlign(ret);\n }\n return ret;\n}\nfunction titleArgs(scale, offset, position, align) {\n const {top, left, bottom, right, chart} = scale;\n const {chartArea, scales} = chart;\n let rotation = 0;\n let maxWidth, titleX, titleY;\n const height = bottom - top;\n const width = right - left;\n if (scale.isHorizontal()) {\n titleX = _alignStartEnd(align, left, right);\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleY = scales[positionAxisID].getPixelForValue(value) + height - offset;\n } else if (position === 'center') {\n titleY = (chartArea.bottom + chartArea.top) / 2 + height - offset;\n } else {\n titleY = offsetFromEdge(scale, position, offset);\n }\n maxWidth = right - left;\n } else {\n if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n titleX = scales[positionAxisID].getPixelForValue(value) - width + offset;\n } else if (position === 'center') {\n titleX = (chartArea.left + chartArea.right) / 2 - width + offset;\n } else {\n titleX = offsetFromEdge(scale, position, offset);\n }\n titleY = _alignStartEnd(align, bottom, top);\n rotation = position === 'left' ? -HALF_PI : HALF_PI;\n }\n return {titleX, titleY, maxWidth, rotation};\n}\nclass Scale extends Element {\n constructor(cfg) {\n super();\n this.id = cfg.id;\n this.type = cfg.type;\n this.options = undefined;\n this.ctx = cfg.ctx;\n this.chart = cfg.chart;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.width = undefined;\n this.height = undefined;\n this._margins = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n };\n this.maxWidth = undefined;\n this.maxHeight = undefined;\n this.paddingTop = undefined;\n this.paddingBottom = undefined;\n this.paddingLeft = undefined;\n this.paddingRight = undefined;\n this.axis = undefined;\n this.labelRotation = undefined;\n this.min = undefined;\n this.max = undefined;\n this._range = undefined;\n this.ticks = [];\n this._gridLineItems = null;\n this._labelItems = null;\n this._labelSizes = null;\n this._length = 0;\n this._maxLength = 0;\n this._longestTextCache = {};\n this._startPixel = undefined;\n this._endPixel = undefined;\n this._reversePixels = false;\n this._userMax = undefined;\n this._userMin = undefined;\n this._suggestedMax = undefined;\n this._suggestedMin = undefined;\n this._ticksLength = 0;\n this._borderValue = 0;\n this._cache = {};\n this._dataLimitsCached = false;\n this.$context = undefined;\n }\n init(options) {\n const me = this;\n me.options = options.setContext(me.getContext());\n me.axis = options.axis;\n me._userMin = me.parse(options.min);\n me._userMax = me.parse(options.max);\n me._suggestedMin = me.parse(options.suggestedMin);\n me._suggestedMax = me.parse(options.suggestedMax);\n }\n parse(raw, index) {\n return raw;\n }\n getUserBounds() {\n let {_userMin, _userMax, _suggestedMin, _suggestedMax} = this;\n _userMin = finiteOrDefault(_userMin, Number.POSITIVE_INFINITY);\n _userMax = finiteOrDefault(_userMax, Number.NEGATIVE_INFINITY);\n _suggestedMin = finiteOrDefault(_suggestedMin, Number.POSITIVE_INFINITY);\n _suggestedMax = finiteOrDefault(_suggestedMax, Number.NEGATIVE_INFINITY);\n return {\n min: finiteOrDefault(_userMin, _suggestedMin),\n max: finiteOrDefault(_userMax, _suggestedMax),\n minDefined: isNumberFinite(_userMin),\n maxDefined: isNumberFinite(_userMax)\n };\n }\n getMinMax(canStack) {\n const me = this;\n let {min, max, minDefined, maxDefined} = me.getUserBounds();\n let range;\n if (minDefined && maxDefined) {\n return {min, max};\n }\n const metas = me.getMatchingVisibleMetas();\n for (let i = 0, ilen = metas.length; i < ilen; ++i) {\n range = metas[i].controller.getMinMax(me, canStack);\n if (!minDefined) {\n min = Math.min(min, range.min);\n }\n if (!maxDefined) {\n max = Math.max(max, range.max);\n }\n }\n return {\n min: finiteOrDefault(min, finiteOrDefault(max, min)),\n max: finiteOrDefault(max, finiteOrDefault(min, max))\n };\n }\n getPadding() {\n const me = this;\n return {\n left: me.paddingLeft || 0,\n top: me.paddingTop || 0,\n right: me.paddingRight || 0,\n bottom: me.paddingBottom || 0\n };\n }\n getTicks() {\n return this.ticks;\n }\n getLabels() {\n const data = this.chart.data;\n return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || [];\n }\n beforeLayout() {\n this._cache = {};\n this._dataLimitsCached = false;\n }\n beforeUpdate() {\n callback(this.options.beforeUpdate, [this]);\n }\n update(maxWidth, maxHeight, margins) {\n const me = this;\n const tickOpts = me.options.ticks;\n const sampleSize = tickOpts.sampleSize;\n me.beforeUpdate();\n me.maxWidth = maxWidth;\n me.maxHeight = maxHeight;\n me._margins = margins = Object.assign({\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n }, margins);\n me.ticks = null;\n me._labelSizes = null;\n me._gridLineItems = null;\n me._labelItems = null;\n me.beforeSetDimensions();\n me.setDimensions();\n me.afterSetDimensions();\n me._maxLength = me.isHorizontal()\n ? me.width + margins.left + margins.right\n : me.height + margins.top + margins.bottom;\n if (!me._dataLimitsCached) {\n me.beforeDataLimits();\n me.determineDataLimits();\n me.afterDataLimits();\n me._range = _addGrace(me, me.options.grace);\n me._dataLimitsCached = true;\n }\n me.beforeBuildTicks();\n me.ticks = me.buildTicks() || [];\n me.afterBuildTicks();\n const samplingEnabled = sampleSize < me.ticks.length;\n me._convertTicksToLabels(samplingEnabled ? sample(me.ticks, sampleSize) : me.ticks);\n me.configure();\n me.beforeCalculateLabelRotation();\n me.calculateLabelRotation();\n me.afterCalculateLabelRotation();\n if (tickOpts.display && (tickOpts.autoSkip || tickOpts.source === 'auto')) {\n me.ticks = autoSkip(me, me.ticks);\n me._labelSizes = null;\n }\n if (samplingEnabled) {\n me._convertTicksToLabels(me.ticks);\n }\n me.beforeFit();\n me.fit();\n me.afterFit();\n me.afterUpdate();\n }\n configure() {\n const me = this;\n let reversePixels = me.options.reverse;\n let startPixel, endPixel;\n if (me.isHorizontal()) {\n startPixel = me.left;\n endPixel = me.right;\n } else {\n startPixel = me.top;\n endPixel = me.bottom;\n reversePixels = !reversePixels;\n }\n me._startPixel = startPixel;\n me._endPixel = endPixel;\n me._reversePixels = reversePixels;\n me._length = endPixel - startPixel;\n me._alignToPixels = me.options.alignToPixels;\n }\n afterUpdate() {\n callback(this.options.afterUpdate, [this]);\n }\n beforeSetDimensions() {\n callback(this.options.beforeSetDimensions, [this]);\n }\n setDimensions() {\n const me = this;\n if (me.isHorizontal()) {\n me.width = me.maxWidth;\n me.left = 0;\n me.right = me.width;\n } else {\n me.height = me.maxHeight;\n me.top = 0;\n me.bottom = me.height;\n }\n me.paddingLeft = 0;\n me.paddingTop = 0;\n me.paddingRight = 0;\n me.paddingBottom = 0;\n }\n afterSetDimensions() {\n callback(this.options.afterSetDimensions, [this]);\n }\n _callHooks(name) {\n const me = this;\n me.chart.notifyPlugins(name, me.getContext());\n callback(me.options[name], [me]);\n }\n beforeDataLimits() {\n this._callHooks('beforeDataLimits');\n }\n determineDataLimits() {}\n afterDataLimits() {\n this._callHooks('afterDataLimits');\n }\n beforeBuildTicks() {\n this._callHooks('beforeBuildTicks');\n }\n buildTicks() {\n return [];\n }\n afterBuildTicks() {\n this._callHooks('afterBuildTicks');\n }\n beforeTickToLabelConversion() {\n callback(this.options.beforeTickToLabelConversion, [this]);\n }\n generateTickLabels(ticks) {\n const me = this;\n const tickOpts = me.options.ticks;\n let i, ilen, tick;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n tick = ticks[i];\n tick.label = callback(tickOpts.callback, [tick.value, i, ticks], me);\n }\n }\n afterTickToLabelConversion() {\n callback(this.options.afterTickToLabelConversion, [this]);\n }\n beforeCalculateLabelRotation() {\n callback(this.options.beforeCalculateLabelRotation, [this]);\n }\n calculateLabelRotation() {\n const me = this;\n const options = me.options;\n const tickOpts = options.ticks;\n const numTicks = me.ticks.length;\n const minRotation = tickOpts.minRotation || 0;\n const maxRotation = tickOpts.maxRotation;\n let labelRotation = minRotation;\n let tickWidth, maxHeight, maxLabelDiagonal;\n if (!me._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !me.isHorizontal()) {\n me.labelRotation = minRotation;\n return;\n }\n const labelSizes = me._getLabelSizes();\n const maxLabelWidth = labelSizes.widest.width;\n const maxLabelHeight = labelSizes.highest.height;\n const maxWidth = _limitValue(me.chart.width - maxLabelWidth, 0, me.maxWidth);\n tickWidth = options.offset ? me.maxWidth / numTicks : maxWidth / (numTicks - 1);\n if (maxLabelWidth + 6 > tickWidth) {\n tickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1));\n maxHeight = me.maxHeight - getTickMarkLength(options.grid)\n\t\t\t\t- tickOpts.padding - getTitleHeight(options.title, me.chart.options.font);\n maxLabelDiagonal = Math.sqrt(maxLabelWidth * maxLabelWidth + maxLabelHeight * maxLabelHeight);\n labelRotation = toDegrees(Math.min(\n Math.asin(_limitValue((labelSizes.highest.height + 6) / tickWidth, -1, 1)),\n Math.asin(_limitValue(maxHeight / maxLabelDiagonal, -1, 1)) - Math.asin(_limitValue(maxLabelHeight / maxLabelDiagonal, -1, 1))\n ));\n labelRotation = Math.max(minRotation, Math.min(maxRotation, labelRotation));\n }\n me.labelRotation = labelRotation;\n }\n afterCalculateLabelRotation() {\n callback(this.options.afterCalculateLabelRotation, [this]);\n }\n beforeFit() {\n callback(this.options.beforeFit, [this]);\n }\n fit() {\n const me = this;\n const minSize = {\n width: 0,\n height: 0\n };\n const {chart, options: {ticks: tickOpts, title: titleOpts, grid: gridOpts}} = me;\n const display = me._isVisible();\n const isHorizontal = me.isHorizontal();\n if (display) {\n const titleHeight = getTitleHeight(titleOpts, chart.options.font);\n if (isHorizontal) {\n minSize.width = me.maxWidth;\n minSize.height = getTickMarkLength(gridOpts) + titleHeight;\n } else {\n minSize.height = me.maxHeight;\n minSize.width = getTickMarkLength(gridOpts) + titleHeight;\n }\n if (tickOpts.display && me.ticks.length) {\n const {first, last, widest, highest} = me._getLabelSizes();\n const tickPadding = tickOpts.padding * 2;\n const angleRadians = toRadians(me.labelRotation);\n const cos = Math.cos(angleRadians);\n const sin = Math.sin(angleRadians);\n if (isHorizontal) {\n const labelHeight = tickOpts.mirror ? 0 : sin * widest.width + cos * highest.height;\n minSize.height = Math.min(me.maxHeight, minSize.height + labelHeight + tickPadding);\n } else {\n const labelWidth = tickOpts.mirror ? 0 : cos * widest.width + sin * highest.height;\n minSize.width = Math.min(me.maxWidth, minSize.width + labelWidth + tickPadding);\n }\n me._calculatePadding(first, last, sin, cos);\n }\n }\n me._handleMargins();\n if (isHorizontal) {\n me.width = me._length = chart.width - me._margins.left - me._margins.right;\n me.height = minSize.height;\n } else {\n me.width = minSize.width;\n me.height = me._length = chart.height - me._margins.top - me._margins.bottom;\n }\n }\n _calculatePadding(first, last, sin, cos) {\n const me = this;\n const {ticks: {align, padding}, position} = me.options;\n const isRotated = me.labelRotation !== 0;\n const labelsBelowTicks = position !== 'top' && me.axis === 'x';\n if (me.isHorizontal()) {\n const offsetLeft = me.getPixelForTick(0) - me.left;\n const offsetRight = me.right - me.getPixelForTick(me.ticks.length - 1);\n let paddingLeft = 0;\n let paddingRight = 0;\n if (isRotated) {\n if (labelsBelowTicks) {\n paddingLeft = cos * first.width;\n paddingRight = sin * last.height;\n } else {\n paddingLeft = sin * first.height;\n paddingRight = cos * last.width;\n }\n } else if (align === 'start') {\n paddingRight = last.width;\n } else if (align === 'end') {\n paddingLeft = first.width;\n } else {\n paddingLeft = first.width / 2;\n paddingRight = last.width / 2;\n }\n me.paddingLeft = Math.max((paddingLeft - offsetLeft + padding) * me.width / (me.width - offsetLeft), 0);\n me.paddingRight = Math.max((paddingRight - offsetRight + padding) * me.width / (me.width - offsetRight), 0);\n } else {\n let paddingTop = last.height / 2;\n let paddingBottom = first.height / 2;\n if (align === 'start') {\n paddingTop = 0;\n paddingBottom = first.height;\n } else if (align === 'end') {\n paddingTop = last.height;\n paddingBottom = 0;\n }\n me.paddingTop = paddingTop + padding;\n me.paddingBottom = paddingBottom + padding;\n }\n }\n _handleMargins() {\n const me = this;\n if (me._margins) {\n me._margins.left = Math.max(me.paddingLeft, me._margins.left);\n me._margins.top = Math.max(me.paddingTop, me._margins.top);\n me._margins.right = Math.max(me.paddingRight, me._margins.right);\n me._margins.bottom = Math.max(me.paddingBottom, me._margins.bottom);\n }\n }\n afterFit() {\n callback(this.options.afterFit, [this]);\n }\n isHorizontal() {\n const {axis, position} = this.options;\n return position === 'top' || position === 'bottom' || axis === 'x';\n }\n isFullSize() {\n return this.options.fullSize;\n }\n _convertTicksToLabels(ticks) {\n const me = this;\n me.beforeTickToLabelConversion();\n me.generateTickLabels(ticks);\n let i, ilen;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n if (isNullOrUndef(ticks[i].label)) {\n ticks.splice(i, 1);\n ilen--;\n i--;\n }\n }\n me.afterTickToLabelConversion();\n }\n _getLabelSizes() {\n const me = this;\n let labelSizes = me._labelSizes;\n if (!labelSizes) {\n const sampleSize = me.options.ticks.sampleSize;\n let ticks = me.ticks;\n if (sampleSize < ticks.length) {\n ticks = sample(ticks, sampleSize);\n }\n me._labelSizes = labelSizes = me._computeLabelSizes(ticks, ticks.length);\n }\n return labelSizes;\n }\n _computeLabelSizes(ticks, length) {\n const {ctx, _longestTextCache: caches} = this;\n const widths = [];\n const heights = [];\n let widestLabelSize = 0;\n let highestLabelSize = 0;\n let i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel;\n for (i = 0; i < length; ++i) {\n label = ticks[i].label;\n tickFont = this._resolveTickFontOptions(i);\n ctx.font = fontString = tickFont.string;\n cache = caches[fontString] = caches[fontString] || {data: {}, gc: []};\n lineHeight = tickFont.lineHeight;\n width = height = 0;\n if (!isNullOrUndef(label) && !isArray(label)) {\n width = _measureText(ctx, cache.data, cache.gc, width, label);\n height = lineHeight;\n } else if (isArray(label)) {\n for (j = 0, jlen = label.length; j < jlen; ++j) {\n nestedLabel = label[j];\n if (!isNullOrUndef(nestedLabel) && !isArray(nestedLabel)) {\n width = _measureText(ctx, cache.data, cache.gc, width, nestedLabel);\n height += lineHeight;\n }\n }\n }\n widths.push(width);\n heights.push(height);\n widestLabelSize = Math.max(width, widestLabelSize);\n highestLabelSize = Math.max(height, highestLabelSize);\n }\n garbageCollect(caches, length);\n const widest = widths.indexOf(widestLabelSize);\n const highest = heights.indexOf(highestLabelSize);\n const valueAt = (idx) => ({width: widths[idx] || 0, height: heights[idx] || 0});\n return {\n first: valueAt(0),\n last: valueAt(length - 1),\n widest: valueAt(widest),\n highest: valueAt(highest),\n widths,\n heights,\n };\n }\n getLabelForValue(value) {\n return value;\n }\n getPixelForValue(value, index) {\n return NaN;\n }\n getValueForPixel(pixel) {}\n getPixelForTick(index) {\n const ticks = this.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return this.getPixelForValue(ticks[index].value);\n }\n getPixelForDecimal(decimal) {\n const me = this;\n if (me._reversePixels) {\n decimal = 1 - decimal;\n }\n const pixel = me._startPixel + decimal * me._length;\n return _int16Range(me._alignToPixels ? _alignPixel(me.chart, pixel, 0) : pixel);\n }\n getDecimalForPixel(pixel) {\n const decimal = (pixel - this._startPixel) / this._length;\n return this._reversePixels ? 1 - decimal : decimal;\n }\n getBasePixel() {\n return this.getPixelForValue(this.getBaseValue());\n }\n getBaseValue() {\n const {min, max} = this;\n return min < 0 && max < 0 ? max :\n min > 0 && max > 0 ? min :\n 0;\n }\n getContext(index) {\n const me = this;\n const ticks = me.ticks || [];\n if (index >= 0 && index < ticks.length) {\n const tick = ticks[index];\n return tick.$context ||\n\t\t\t\t(tick.$context = createTickContext(me.getContext(), index, tick));\n }\n return me.$context ||\n\t\t\t(me.$context = createScaleContext(me.chart.getContext(), me));\n }\n _tickSize() {\n const me = this;\n const optionTicks = me.options.ticks;\n const rot = toRadians(me.labelRotation);\n const cos = Math.abs(Math.cos(rot));\n const sin = Math.abs(Math.sin(rot));\n const labelSizes = me._getLabelSizes();\n const padding = optionTicks.autoSkipPadding || 0;\n const w = labelSizes ? labelSizes.widest.width + padding : 0;\n const h = labelSizes ? labelSizes.highest.height + padding : 0;\n return me.isHorizontal()\n ? h * cos > w * sin ? w / cos : h / sin\n : h * sin < w * cos ? h / cos : w / sin;\n }\n _isVisible() {\n const display = this.options.display;\n if (display !== 'auto') {\n return !!display;\n }\n return this.getMatchingVisibleMetas().length > 0;\n }\n _computeGridLineItems(chartArea) {\n const me = this;\n const axis = me.axis;\n const chart = me.chart;\n const options = me.options;\n const {grid, position} = options;\n const offset = grid.offset;\n const isHorizontal = me.isHorizontal();\n const ticks = me.ticks;\n const ticksLength = ticks.length + (offset ? 1 : 0);\n const tl = getTickMarkLength(grid);\n const items = [];\n const borderOpts = grid.setContext(me.getContext());\n const axisWidth = borderOpts.drawBorder ? borderOpts.borderWidth : 0;\n const axisHalfWidth = axisWidth / 2;\n const alignBorderValue = function(pixel) {\n return _alignPixel(chart, pixel, axisWidth);\n };\n let borderValue, i, lineValue, alignedLineValue;\n let tx1, ty1, tx2, ty2, x1, y1, x2, y2;\n if (position === 'top') {\n borderValue = alignBorderValue(me.bottom);\n ty1 = me.bottom - tl;\n ty2 = borderValue - axisHalfWidth;\n y1 = alignBorderValue(chartArea.top) + axisHalfWidth;\n y2 = chartArea.bottom;\n } else if (position === 'bottom') {\n borderValue = alignBorderValue(me.top);\n y1 = chartArea.top;\n y2 = alignBorderValue(chartArea.bottom) - axisHalfWidth;\n ty1 = borderValue + axisHalfWidth;\n ty2 = me.top + tl;\n } else if (position === 'left') {\n borderValue = alignBorderValue(me.right);\n tx1 = me.right - tl;\n tx2 = borderValue - axisHalfWidth;\n x1 = alignBorderValue(chartArea.left) + axisHalfWidth;\n x2 = chartArea.right;\n } else if (position === 'right') {\n borderValue = alignBorderValue(me.left);\n x1 = chartArea.left;\n x2 = alignBorderValue(chartArea.right) - axisHalfWidth;\n tx1 = borderValue + axisHalfWidth;\n tx2 = me.left + tl;\n } else if (axis === 'x') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.top + chartArea.bottom) / 2 + 0.5);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(me.chart.scales[positionAxisID].getPixelForValue(value));\n }\n y1 = chartArea.top;\n y2 = chartArea.bottom;\n ty1 = borderValue + axisHalfWidth;\n ty2 = ty1 + tl;\n } else if (axis === 'y') {\n if (position === 'center') {\n borderValue = alignBorderValue((chartArea.left + chartArea.right) / 2);\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n borderValue = alignBorderValue(me.chart.scales[positionAxisID].getPixelForValue(value));\n }\n tx1 = borderValue - axisHalfWidth;\n tx2 = tx1 - tl;\n x1 = chartArea.left;\n x2 = chartArea.right;\n }\n const limit = valueOrDefault(options.ticks.maxTicksLimit, ticksLength);\n const step = Math.max(1, Math.ceil(ticksLength / limit));\n for (i = 0; i < ticksLength; i += step) {\n const optsAtIndex = grid.setContext(me.getContext(i));\n const lineWidth = optsAtIndex.lineWidth;\n const lineColor = optsAtIndex.color;\n const borderDash = grid.borderDash || [];\n const borderDashOffset = optsAtIndex.borderDashOffset;\n const tickWidth = optsAtIndex.tickWidth;\n const tickColor = optsAtIndex.tickColor;\n const tickBorderDash = optsAtIndex.tickBorderDash || [];\n const tickBorderDashOffset = optsAtIndex.tickBorderDashOffset;\n lineValue = getPixelForGridLine(me, i, offset);\n if (lineValue === undefined) {\n continue;\n }\n alignedLineValue = _alignPixel(chart, lineValue, lineWidth);\n if (isHorizontal) {\n tx1 = tx2 = x1 = x2 = alignedLineValue;\n } else {\n ty1 = ty2 = y1 = y2 = alignedLineValue;\n }\n items.push({\n tx1,\n ty1,\n tx2,\n ty2,\n x1,\n y1,\n x2,\n y2,\n width: lineWidth,\n color: lineColor,\n borderDash,\n borderDashOffset,\n tickWidth,\n tickColor,\n tickBorderDash,\n tickBorderDashOffset,\n });\n }\n me._ticksLength = ticksLength;\n me._borderValue = borderValue;\n return items;\n }\n _computeLabelItems(chartArea) {\n const me = this;\n const axis = me.axis;\n const options = me.options;\n const {position, ticks: optionTicks} = options;\n const isHorizontal = me.isHorizontal();\n const ticks = me.ticks;\n const {align, crossAlign, padding, mirror} = optionTicks;\n const tl = getTickMarkLength(options.grid);\n const tickAndPadding = tl + padding;\n const hTickAndPadding = mirror ? -padding : tickAndPadding;\n const rotation = -toRadians(me.labelRotation);\n const items = [];\n let i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset;\n let textBaseline = 'middle';\n if (position === 'top') {\n y = me.bottom - hTickAndPadding;\n textAlign = me._getXAxisLabelAlignment();\n } else if (position === 'bottom') {\n y = me.top + hTickAndPadding;\n textAlign = me._getXAxisLabelAlignment();\n } else if (position === 'left') {\n const ret = me._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (position === 'right') {\n const ret = me._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (axis === 'x') {\n if (position === 'center') {\n y = ((chartArea.top + chartArea.bottom) / 2) + tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n y = me.chart.scales[positionAxisID].getPixelForValue(value) + tickAndPadding;\n }\n textAlign = me._getXAxisLabelAlignment();\n } else if (axis === 'y') {\n if (position === 'center') {\n x = ((chartArea.left + chartArea.right) / 2) - tickAndPadding;\n } else if (isObject(position)) {\n const positionAxisID = Object.keys(position)[0];\n const value = position[positionAxisID];\n x = me.chart.scales[positionAxisID].getPixelForValue(value);\n }\n textAlign = me._getYAxisLabelAlignment(tl).textAlign;\n }\n if (axis === 'y') {\n if (align === 'start') {\n textBaseline = 'top';\n } else if (align === 'end') {\n textBaseline = 'bottom';\n }\n }\n const labelSizes = me._getLabelSizes();\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n tick = ticks[i];\n label = tick.label;\n const optsAtIndex = optionTicks.setContext(me.getContext(i));\n pixel = me.getPixelForTick(i) + optionTicks.labelOffset;\n font = me._resolveTickFontOptions(i);\n lineHeight = font.lineHeight;\n lineCount = isArray(label) ? label.length : 1;\n const halfCount = lineCount / 2;\n const color = optsAtIndex.color;\n const strokeColor = optsAtIndex.textStrokeColor;\n const strokeWidth = optsAtIndex.textStrokeWidth;\n if (isHorizontal) {\n x = pixel;\n if (position === 'top') {\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = -lineCount * lineHeight + lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = -labelSizes.highest.height / 2 - halfCount * lineHeight + lineHeight;\n } else {\n textOffset = -labelSizes.highest.height + lineHeight / 2;\n }\n } else {\n if (crossAlign === 'near' || rotation !== 0) {\n textOffset = lineHeight / 2;\n } else if (crossAlign === 'center') {\n textOffset = labelSizes.highest.height / 2 - halfCount * lineHeight;\n } else {\n textOffset = labelSizes.highest.height - lineCount * lineHeight;\n }\n }\n if (mirror) {\n textOffset *= -1;\n }\n } else {\n y = pixel;\n textOffset = (1 - lineCount) * lineHeight / 2;\n }\n let backdrop;\n if (optsAtIndex.showLabelBackdrop) {\n const labelPadding = toPadding(optsAtIndex.backdropPadding);\n const height = labelSizes.heights[i];\n const width = labelSizes.widths[i];\n let top = y + textOffset - labelPadding.top;\n let left = x - labelPadding.left;\n switch (textBaseline) {\n case 'middle':\n top -= height / 2;\n break;\n case 'bottom':\n top -= height;\n break;\n }\n switch (textAlign) {\n case 'center':\n left -= width / 2;\n break;\n case 'right':\n left -= width;\n break;\n }\n backdrop = {\n left,\n top,\n width: width + labelPadding.width,\n height: height + labelPadding.height,\n color: optsAtIndex.backdropColor,\n };\n }\n items.push({\n rotation,\n label,\n font,\n color,\n strokeColor,\n strokeWidth,\n textOffset,\n textAlign,\n textBaseline,\n translation: [x, y],\n backdrop,\n });\n }\n return items;\n }\n _getXAxisLabelAlignment() {\n const me = this;\n const {position, ticks} = me.options;\n const rotation = -toRadians(me.labelRotation);\n if (rotation) {\n return position === 'top' ? 'left' : 'right';\n }\n let align = 'center';\n if (ticks.align === 'start') {\n align = 'left';\n } else if (ticks.align === 'end') {\n align = 'right';\n }\n return align;\n }\n _getYAxisLabelAlignment(tl) {\n const me = this;\n const {position, ticks: {crossAlign, mirror, padding}} = me.options;\n const labelSizes = me._getLabelSizes();\n const tickAndPadding = tl + padding;\n const widest = labelSizes.widest.width;\n let textAlign;\n let x;\n if (position === 'left') {\n if (mirror) {\n x = me.right + padding;\n if (crossAlign === 'near') {\n textAlign = 'left';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x += (widest / 2);\n } else {\n textAlign = 'right';\n x += widest;\n }\n } else {\n x = me.right - tickAndPadding;\n if (crossAlign === 'near') {\n textAlign = 'right';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x -= (widest / 2);\n } else {\n textAlign = 'left';\n x = me.left;\n }\n }\n } else if (position === 'right') {\n if (mirror) {\n x = me.left + padding;\n if (crossAlign === 'near') {\n textAlign = 'right';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x -= (widest / 2);\n } else {\n textAlign = 'left';\n x -= widest;\n }\n } else {\n x = me.left + tickAndPadding;\n if (crossAlign === 'near') {\n textAlign = 'left';\n } else if (crossAlign === 'center') {\n textAlign = 'center';\n x += widest / 2;\n } else {\n textAlign = 'right';\n x = me.right;\n }\n }\n } else {\n textAlign = 'right';\n }\n return {textAlign, x};\n }\n _computeLabelArea() {\n const me = this;\n if (me.options.ticks.mirror) {\n return;\n }\n const chart = me.chart;\n const position = me.options.position;\n if (position === 'left' || position === 'right') {\n return {top: 0, left: me.left, bottom: chart.height, right: me.right};\n } if (position === 'top' || position === 'bottom') {\n return {top: me.top, left: 0, bottom: me.bottom, right: chart.width};\n }\n }\n drawBackground() {\n const {ctx, options: {backgroundColor}, left, top, width, height} = this;\n if (backgroundColor) {\n ctx.save();\n ctx.fillStyle = backgroundColor;\n ctx.fillRect(left, top, width, height);\n ctx.restore();\n }\n }\n getLineWidthForValue(value) {\n const me = this;\n const grid = me.options.grid;\n if (!me._isVisible() || !grid.display) {\n return 0;\n }\n const ticks = me.ticks;\n const index = ticks.findIndex(t => t.value === value);\n if (index >= 0) {\n const opts = grid.setContext(me.getContext(index));\n return opts.lineWidth;\n }\n return 0;\n }\n drawGrid(chartArea) {\n const me = this;\n const grid = me.options.grid;\n const ctx = me.ctx;\n const items = me._gridLineItems || (me._gridLineItems = me._computeGridLineItems(chartArea));\n let i, ilen;\n const drawLine = (p1, p2, style) => {\n if (!style.width || !style.color) {\n return;\n }\n ctx.save();\n ctx.lineWidth = style.width;\n ctx.strokeStyle = style.color;\n ctx.setLineDash(style.borderDash || []);\n ctx.lineDashOffset = style.borderDashOffset;\n ctx.beginPath();\n ctx.moveTo(p1.x, p1.y);\n ctx.lineTo(p2.x, p2.y);\n ctx.stroke();\n ctx.restore();\n };\n if (grid.display) {\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n const item = items[i];\n if (grid.drawOnChartArea) {\n drawLine(\n {x: item.x1, y: item.y1},\n {x: item.x2, y: item.y2},\n item\n );\n }\n if (grid.drawTicks) {\n drawLine(\n {x: item.tx1, y: item.ty1},\n {x: item.tx2, y: item.ty2},\n {\n color: item.tickColor,\n width: item.tickWidth,\n borderDash: item.tickBorderDash,\n borderDashOffset: item.tickBorderDashOffset\n }\n );\n }\n }\n }\n }\n drawBorder() {\n const me = this;\n const {chart, ctx, options: {grid}} = me;\n const borderOpts = grid.setContext(me.getContext());\n const axisWidth = grid.drawBorder ? borderOpts.borderWidth : 0;\n if (!axisWidth) {\n return;\n }\n const lastLineWidth = grid.setContext(me.getContext(0)).lineWidth;\n const borderValue = me._borderValue;\n let x1, x2, y1, y2;\n if (me.isHorizontal()) {\n x1 = _alignPixel(chart, me.left, axisWidth) - axisWidth / 2;\n x2 = _alignPixel(chart, me.right, lastLineWidth) + lastLineWidth / 2;\n y1 = y2 = borderValue;\n } else {\n y1 = _alignPixel(chart, me.top, axisWidth) - axisWidth / 2;\n y2 = _alignPixel(chart, me.bottom, lastLineWidth) + lastLineWidth / 2;\n x1 = x2 = borderValue;\n }\n ctx.save();\n ctx.lineWidth = borderOpts.borderWidth;\n ctx.strokeStyle = borderOpts.borderColor;\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n ctx.restore();\n }\n drawLabels(chartArea) {\n const me = this;\n const optionTicks = me.options.ticks;\n if (!optionTicks.display) {\n return;\n }\n const ctx = me.ctx;\n const area = me._computeLabelArea();\n if (area) {\n clipArea(ctx, area);\n }\n const items = me._labelItems || (me._labelItems = me._computeLabelItems(chartArea));\n let i, ilen;\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n const item = items[i];\n const tickFont = item.font;\n const label = item.label;\n if (item.backdrop) {\n ctx.fillStyle = item.backdrop.color;\n ctx.fillRect(item.backdrop.left, item.backdrop.top, item.backdrop.width, item.backdrop.height);\n }\n let y = item.textOffset;\n renderText(ctx, label, 0, y, tickFont, item);\n }\n if (area) {\n unclipArea(ctx);\n }\n }\n drawTitle() {\n const {ctx, options: {position, title, reverse}} = this;\n if (!title.display) {\n return;\n }\n const font = toFont(title.font);\n const padding = toPadding(title.padding);\n const align = title.align;\n let offset = font.lineHeight / 2;\n if (position === 'bottom' || position === 'center' || isObject(position)) {\n offset += padding.bottom;\n if (isArray(title.text)) {\n offset += font.lineHeight * (title.text.length - 1);\n }\n } else {\n offset += padding.top;\n }\n const {titleX, titleY, maxWidth, rotation} = titleArgs(this, offset, position, align);\n renderText(ctx, title.text, 0, 0, font, {\n color: title.color,\n maxWidth,\n rotation,\n textAlign: titleAlign(align, position, reverse),\n textBaseline: 'middle',\n translation: [titleX, titleY],\n });\n }\n draw(chartArea) {\n const me = this;\n if (!me._isVisible()) {\n return;\n }\n me.drawBackground();\n me.drawGrid(chartArea);\n me.drawBorder();\n me.drawTitle();\n me.drawLabels(chartArea);\n }\n _layers() {\n const me = this;\n const opts = me.options;\n const tz = opts.ticks && opts.ticks.z || 0;\n const gz = valueOrDefault(opts.grid && opts.grid.z, -1);\n if (!me._isVisible() || me.draw !== Scale.prototype.draw) {\n return [{\n z: tz,\n draw(chartArea) {\n me.draw(chartArea);\n }\n }];\n }\n return [{\n z: gz,\n draw(chartArea) {\n me.drawBackground();\n me.drawGrid(chartArea);\n me.drawTitle();\n }\n }, {\n z: gz + 1,\n draw() {\n me.drawBorder();\n }\n }, {\n z: tz,\n draw(chartArea) {\n me.drawLabels(chartArea);\n }\n }];\n }\n getMatchingVisibleMetas(type) {\n const me = this;\n const metas = me.chart.getSortedVisibleDatasetMetas();\n const axisID = me.axis + 'AxisID';\n const result = [];\n let i, ilen;\n for (i = 0, ilen = metas.length; i < ilen; ++i) {\n const meta = metas[i];\n if (meta[axisID] === me.id && (!type || meta.type === type)) {\n result.push(meta);\n }\n }\n return result;\n }\n _resolveTickFontOptions(index) {\n const opts = this.options.ticks.setContext(this.getContext(index));\n return toFont(opts.font);\n }\n _maxDigits() {\n const me = this;\n const fontSize = me._resolveTickFontOptions(0).lineHeight;\n return (me.isHorizontal() ? me.width : me.height) / fontSize;\n }\n}\n\nclass TypedRegistry {\n constructor(type, scope, override) {\n this.type = type;\n this.scope = scope;\n this.override = override;\n this.items = Object.create(null);\n }\n isForType(type) {\n return Object.prototype.isPrototypeOf.call(this.type.prototype, type.prototype);\n }\n register(item) {\n const me = this;\n const proto = Object.getPrototypeOf(item);\n let parentScope;\n if (isIChartComponent(proto)) {\n parentScope = me.register(proto);\n }\n const items = me.items;\n const id = item.id;\n const scope = me.scope + '.' + id;\n if (!id) {\n throw new Error('class does not have id: ' + item);\n }\n if (id in items) {\n return scope;\n }\n items[id] = item;\n registerDefaults(item, scope, parentScope);\n if (me.override) {\n defaults.override(item.id, item.overrides);\n }\n return scope;\n }\n get(id) {\n return this.items[id];\n }\n unregister(item) {\n const items = this.items;\n const id = item.id;\n const scope = this.scope;\n if (id in items) {\n delete items[id];\n }\n if (scope && id in defaults[scope]) {\n delete defaults[scope][id];\n if (this.override) {\n delete overrides[id];\n }\n }\n }\n}\nfunction registerDefaults(item, scope, parentScope) {\n const itemDefaults = merge(Object.create(null), [\n parentScope ? defaults.get(parentScope) : {},\n defaults.get(scope),\n item.defaults\n ]);\n defaults.set(scope, itemDefaults);\n if (item.defaultRoutes) {\n routeDefaults(scope, item.defaultRoutes);\n }\n if (item.descriptors) {\n defaults.describe(scope, item.descriptors);\n }\n}\nfunction routeDefaults(scope, routes) {\n Object.keys(routes).forEach(property => {\n const propertyParts = property.split('.');\n const sourceName = propertyParts.pop();\n const sourceScope = [scope].concat(propertyParts).join('.');\n const parts = routes[property].split('.');\n const targetName = parts.pop();\n const targetScope = parts.join('.');\n defaults.route(sourceScope, sourceName, targetScope, targetName);\n });\n}\nfunction isIChartComponent(proto) {\n return 'id' in proto && 'defaults' in proto;\n}\n\nclass Registry {\n constructor() {\n this.controllers = new TypedRegistry(DatasetController, 'datasets', true);\n this.elements = new TypedRegistry(Element, 'elements');\n this.plugins = new TypedRegistry(Object, 'plugins');\n this.scales = new TypedRegistry(Scale, 'scales');\n this._typedRegistries = [this.controllers, this.scales, this.elements];\n }\n add(...args) {\n this._each('register', args);\n }\n remove(...args) {\n this._each('unregister', args);\n }\n addControllers(...args) {\n this._each('register', args, this.controllers);\n }\n addElements(...args) {\n this._each('register', args, this.elements);\n }\n addPlugins(...args) {\n this._each('register', args, this.plugins);\n }\n addScales(...args) {\n this._each('register', args, this.scales);\n }\n getController(id) {\n return this._get(id, this.controllers, 'controller');\n }\n getElement(id) {\n return this._get(id, this.elements, 'element');\n }\n getPlugin(id) {\n return this._get(id, this.plugins, 'plugin');\n }\n getScale(id) {\n return this._get(id, this.scales, 'scale');\n }\n removeControllers(...args) {\n this._each('unregister', args, this.controllers);\n }\n removeElements(...args) {\n this._each('unregister', args, this.elements);\n }\n removePlugins(...args) {\n this._each('unregister', args, this.plugins);\n }\n removeScales(...args) {\n this._each('unregister', args, this.scales);\n }\n _each(method, args, typedRegistry) {\n const me = this;\n [...args].forEach(arg => {\n const reg = typedRegistry || me._getRegistryForType(arg);\n if (typedRegistry || reg.isForType(arg) || (reg === me.plugins && arg.id)) {\n me._exec(method, reg, arg);\n } else {\n each(arg, item => {\n const itemReg = typedRegistry || me._getRegistryForType(item);\n me._exec(method, itemReg, item);\n });\n }\n });\n }\n _exec(method, registry, component) {\n const camelMethod = _capitalize(method);\n callback(component['before' + camelMethod], [], component);\n registry[method](component);\n callback(component['after' + camelMethod], [], component);\n }\n _getRegistryForType(type) {\n for (let i = 0; i < this._typedRegistries.length; i++) {\n const reg = this._typedRegistries[i];\n if (reg.isForType(type)) {\n return reg;\n }\n }\n return this.plugins;\n }\n _get(id, typedRegistry, type) {\n const item = typedRegistry.get(id);\n if (item === undefined) {\n throw new Error('\"' + id + '\" is not a registered ' + type + '.');\n }\n return item;\n }\n}\nvar registry = new Registry();\n\nclass PluginService {\n constructor() {\n this._init = [];\n }\n notify(chart, hook, args, filter) {\n const me = this;\n if (hook === 'beforeInit') {\n me._init = me._createDescriptors(chart, true);\n me._notify(me._init, chart, 'install');\n }\n const descriptors = filter ? me._descriptors(chart).filter(filter) : me._descriptors(chart);\n const result = me._notify(descriptors, chart, hook, args);\n if (hook === 'destroy') {\n me._notify(descriptors, chart, 'stop');\n me._notify(me._init, chart, 'uninstall');\n }\n return result;\n }\n _notify(descriptors, chart, hook, args) {\n args = args || {};\n for (const descriptor of descriptors) {\n const plugin = descriptor.plugin;\n const method = plugin[hook];\n const params = [chart, args, descriptor.options];\n if (callback(method, params, plugin) === false && args.cancelable) {\n return false;\n }\n }\n return true;\n }\n invalidate() {\n if (!isNullOrUndef(this._cache)) {\n this._oldCache = this._cache;\n this._cache = undefined;\n }\n }\n _descriptors(chart) {\n if (this._cache) {\n return this._cache;\n }\n const descriptors = this._cache = this._createDescriptors(chart);\n this._notifyStateChanges(chart);\n return descriptors;\n }\n _createDescriptors(chart, all) {\n const config = chart && chart.config;\n const options = valueOrDefault(config.options && config.options.plugins, {});\n const plugins = allPlugins(config);\n return options === false && !all ? [] : createDescriptors(chart, plugins, options, all);\n }\n _notifyStateChanges(chart) {\n const previousDescriptors = this._oldCache || [];\n const descriptors = this._cache;\n const diff = (a, b) => a.filter(x => !b.some(y => x.plugin.id === y.plugin.id));\n this._notify(diff(previousDescriptors, descriptors), chart, 'stop');\n this._notify(diff(descriptors, previousDescriptors), chart, 'start');\n }\n}\nfunction allPlugins(config) {\n const plugins = [];\n const keys = Object.keys(registry.plugins.items);\n for (let i = 0; i < keys.length; i++) {\n plugins.push(registry.getPlugin(keys[i]));\n }\n const local = config.plugins || [];\n for (let i = 0; i < local.length; i++) {\n const plugin = local[i];\n if (plugins.indexOf(plugin) === -1) {\n plugins.push(plugin);\n }\n }\n return plugins;\n}\nfunction getOpts(options, all) {\n if (!all && options === false) {\n return null;\n }\n if (options === true) {\n return {};\n }\n return options;\n}\nfunction createDescriptors(chart, plugins, options, all) {\n const result = [];\n const context = chart.getContext();\n for (let i = 0; i < plugins.length; i++) {\n const plugin = plugins[i];\n const id = plugin.id;\n const opts = getOpts(options[id], all);\n if (opts === null) {\n continue;\n }\n result.push({\n plugin,\n options: pluginOpts(chart.config, plugin, opts, context)\n });\n }\n return result;\n}\nfunction pluginOpts(config, plugin, opts, context) {\n const keys = config.pluginScopeKeys(plugin);\n const scopes = config.getOptionScopes(opts, keys);\n return config.createResolver(scopes, context, [''], {scriptable: false, indexable: false, allKeys: true});\n}\n\nfunction getIndexAxis(type, options) {\n const datasetDefaults = defaults.datasets[type] || {};\n const datasetOptions = (options.datasets || {})[type] || {};\n return datasetOptions.indexAxis || options.indexAxis || datasetDefaults.indexAxis || 'x';\n}\nfunction getAxisFromDefaultScaleID(id, indexAxis) {\n let axis = id;\n if (id === '_index_') {\n axis = indexAxis;\n } else if (id === '_value_') {\n axis = indexAxis === 'x' ? 'y' : 'x';\n }\n return axis;\n}\nfunction getDefaultScaleIDFromAxis(axis, indexAxis) {\n return axis === indexAxis ? '_index_' : '_value_';\n}\nfunction axisFromPosition(position) {\n if (position === 'top' || position === 'bottom') {\n return 'x';\n }\n if (position === 'left' || position === 'right') {\n return 'y';\n }\n}\nfunction determineAxis(id, scaleOptions) {\n if (id === 'x' || id === 'y') {\n return id;\n }\n return scaleOptions.axis || axisFromPosition(scaleOptions.position) || id.charAt(0).toLowerCase();\n}\nfunction mergeScaleConfig(config, options) {\n const chartDefaults = overrides[config.type] || {scales: {}};\n const configScales = options.scales || {};\n const chartIndexAxis = getIndexAxis(config.type, options);\n const firstIDs = Object.create(null);\n const scales = Object.create(null);\n Object.keys(configScales).forEach(id => {\n const scaleConf = configScales[id];\n const axis = determineAxis(id, scaleConf);\n const defaultId = getDefaultScaleIDFromAxis(axis, chartIndexAxis);\n const defaultScaleOptions = chartDefaults.scales || {};\n firstIDs[axis] = firstIDs[axis] || id;\n scales[id] = mergeIf(Object.create(null), [{axis}, scaleConf, defaultScaleOptions[axis], defaultScaleOptions[defaultId]]);\n });\n config.data.datasets.forEach(dataset => {\n const type = dataset.type || config.type;\n const indexAxis = dataset.indexAxis || getIndexAxis(type, options);\n const datasetDefaults = overrides[type] || {};\n const defaultScaleOptions = datasetDefaults.scales || {};\n Object.keys(defaultScaleOptions).forEach(defaultID => {\n const axis = getAxisFromDefaultScaleID(defaultID, indexAxis);\n const id = dataset[axis + 'AxisID'] || firstIDs[axis] || axis;\n scales[id] = scales[id] || Object.create(null);\n mergeIf(scales[id], [{axis}, configScales[id], defaultScaleOptions[defaultID]]);\n });\n });\n Object.keys(scales).forEach(key => {\n const scale = scales[key];\n mergeIf(scale, [defaults.scales[scale.type], defaults.scale]);\n });\n return scales;\n}\nfunction initOptions(config) {\n const options = config.options || (config.options = {});\n options.plugins = valueOrDefault(options.plugins, {});\n options.scales = mergeScaleConfig(config, options);\n}\nfunction initData(data) {\n data = data || {};\n data.datasets = data.datasets || [];\n data.labels = data.labels || [];\n return data;\n}\nfunction initConfig(config) {\n config = config || {};\n config.data = initData(config.data);\n initOptions(config);\n return config;\n}\nconst keyCache = new Map();\nconst keysCached = new Set();\nfunction cachedKeys(cacheKey, generate) {\n let keys = keyCache.get(cacheKey);\n if (!keys) {\n keys = generate();\n keyCache.set(cacheKey, keys);\n keysCached.add(keys);\n }\n return keys;\n}\nconst addIfFound = (set, obj, key) => {\n const opts = resolveObjectKey(obj, key);\n if (opts !== undefined) {\n set.add(opts);\n }\n};\nclass Config {\n constructor(config) {\n this._config = initConfig(config);\n this._scopeCache = new Map();\n this._resolverCache = new Map();\n }\n get platform() {\n return this._config.platform;\n }\n get type() {\n return this._config.type;\n }\n set type(type) {\n this._config.type = type;\n }\n get data() {\n return this._config.data;\n }\n set data(data) {\n this._config.data = initData(data);\n }\n get options() {\n return this._config.options;\n }\n set options(options) {\n this._config.options = options;\n }\n get plugins() {\n return this._config.plugins;\n }\n update() {\n const config = this._config;\n this.clearCache();\n initOptions(config);\n }\n clearCache() {\n this._scopeCache.clear();\n this._resolverCache.clear();\n }\n datasetScopeKeys(datasetType) {\n return cachedKeys(datasetType,\n () => [[\n `datasets.${datasetType}`,\n ''\n ]]);\n }\n datasetAnimationScopeKeys(datasetType, transition) {\n return cachedKeys(`${datasetType}.transition.${transition}`,\n () => [\n [\n `datasets.${datasetType}.transitions.${transition}`,\n `transitions.${transition}`,\n ],\n [\n `datasets.${datasetType}`,\n ''\n ]\n ]);\n }\n datasetElementScopeKeys(datasetType, elementType) {\n return cachedKeys(`${datasetType}-${elementType}`,\n () => [[\n `datasets.${datasetType}.elements.${elementType}`,\n `datasets.${datasetType}`,\n `elements.${elementType}`,\n ''\n ]]);\n }\n pluginScopeKeys(plugin) {\n const id = plugin.id;\n const type = this.type;\n return cachedKeys(`${type}-plugin-${id}`,\n () => [[\n `plugins.${id}`,\n ...plugin.additionalOptionScopes || [],\n ]]);\n }\n _cachedScopes(mainScope, resetCache) {\n const _scopeCache = this._scopeCache;\n let cache = _scopeCache.get(mainScope);\n if (!cache || resetCache) {\n cache = new Map();\n _scopeCache.set(mainScope, cache);\n }\n return cache;\n }\n getOptionScopes(mainScope, keyLists, resetCache) {\n const {options, type} = this;\n const cache = this._cachedScopes(mainScope, resetCache);\n const cached = cache.get(keyLists);\n if (cached) {\n return cached;\n }\n const scopes = new Set();\n keyLists.forEach(keys => {\n if (mainScope) {\n scopes.add(mainScope);\n keys.forEach(key => addIfFound(scopes, mainScope, key));\n }\n keys.forEach(key => addIfFound(scopes, options, key));\n keys.forEach(key => addIfFound(scopes, overrides[type] || {}, key));\n keys.forEach(key => addIfFound(scopes, defaults, key));\n keys.forEach(key => addIfFound(scopes, descriptors, key));\n });\n const array = Array.from(scopes);\n if (array.length === 0) {\n array.push(Object.create(null));\n }\n if (keysCached.has(keyLists)) {\n cache.set(keyLists, array);\n }\n return array;\n }\n chartOptionScopes() {\n const {options, type} = this;\n return [\n options,\n overrides[type] || {},\n defaults.datasets[type] || {},\n {type},\n defaults,\n descriptors\n ];\n }\n resolveNamedOptions(scopes, names, context, prefixes = ['']) {\n const result = {$shared: true};\n const {resolver, subPrefixes} = getResolver(this._resolverCache, scopes, prefixes);\n let options = resolver;\n if (needContext(resolver, names)) {\n result.$shared = false;\n context = isFunction(context) ? context() : context;\n const subResolver = this.createResolver(scopes, context, subPrefixes);\n options = _attachContext(resolver, context, subResolver);\n }\n for (const prop of names) {\n result[prop] = options[prop];\n }\n return result;\n }\n createResolver(scopes, context, prefixes = [''], descriptorDefaults) {\n const {resolver} = getResolver(this._resolverCache, scopes, prefixes);\n return isObject(context)\n ? _attachContext(resolver, context, undefined, descriptorDefaults)\n : resolver;\n }\n}\nfunction getResolver(resolverCache, scopes, prefixes) {\n let cache = resolverCache.get(scopes);\n if (!cache) {\n cache = new Map();\n resolverCache.set(scopes, cache);\n }\n const cacheKey = prefixes.join();\n let cached = cache.get(cacheKey);\n if (!cached) {\n const resolver = _createResolver(scopes, prefixes);\n cached = {\n resolver,\n subPrefixes: prefixes.filter(p => !p.toLowerCase().includes('hover'))\n };\n cache.set(cacheKey, cached);\n }\n return cached;\n}\nfunction needContext(proxy, names) {\n const {isScriptable, isIndexable} = _descriptors(proxy);\n for (const prop of names) {\n if ((isScriptable(prop) && isFunction(proxy[prop]))\n || (isIndexable(prop) && isArray(proxy[prop]))) {\n return true;\n }\n }\n return false;\n}\n\nvar version = \"3.5.1\";\n\nconst KNOWN_POSITIONS = ['top', 'bottom', 'left', 'right', 'chartArea'];\nfunction positionIsHorizontal(position, axis) {\n return position === 'top' || position === 'bottom' || (KNOWN_POSITIONS.indexOf(position) === -1 && axis === 'x');\n}\nfunction compare2Level(l1, l2) {\n return function(a, b) {\n return a[l1] === b[l1]\n ? a[l2] - b[l2]\n : a[l1] - b[l1];\n };\n}\nfunction onAnimationsComplete(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n chart.notifyPlugins('afterRender');\n callback(animationOptions && animationOptions.onComplete, [context], chart);\n}\nfunction onAnimationProgress(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n callback(animationOptions && animationOptions.onProgress, [context], chart);\n}\nfunction getCanvas(item) {\n if (_isDomSupported() && typeof item === 'string') {\n item = document.getElementById(item);\n } else if (item && item.length) {\n item = item[0];\n }\n if (item && item.canvas) {\n item = item.canvas;\n }\n return item;\n}\nconst instances = {};\nconst getChart = (key) => {\n const canvas = getCanvas(key);\n return Object.values(instances).filter((c) => c.canvas === canvas).pop();\n};\nclass Chart {\n constructor(item, userConfig) {\n const me = this;\n const config = this.config = new Config(userConfig);\n const initialCanvas = getCanvas(item);\n const existingChart = getChart(initialCanvas);\n if (existingChart) {\n throw new Error(\n 'Canvas is already in use. Chart with ID \\'' + existingChart.id + '\\'' +\n\t\t\t\t' must be destroyed before the canvas can be reused.'\n );\n }\n const options = config.createResolver(config.chartOptionScopes(), me.getContext());\n this.platform = new (config.platform || _detectPlatform(initialCanvas))();\n const context = me.platform.acquireContext(initialCanvas, options.aspectRatio);\n const canvas = context && context.canvas;\n const height = canvas && canvas.height;\n const width = canvas && canvas.width;\n this.id = uid();\n this.ctx = context;\n this.canvas = canvas;\n this.width = width;\n this.height = height;\n this._options = options;\n this._aspectRatio = this.aspectRatio;\n this._layers = [];\n this._metasets = [];\n this._stacks = undefined;\n this.boxes = [];\n this.currentDevicePixelRatio = undefined;\n this.chartArea = undefined;\n this._active = [];\n this._lastEvent = undefined;\n this._listeners = {};\n this._responsiveListeners = undefined;\n this._sortedMetasets = [];\n this.scales = {};\n this._plugins = new PluginService();\n this.$proxies = {};\n this._hiddenIndices = {};\n this.attached = false;\n this._animationsDisabled = undefined;\n this.$context = undefined;\n this._doResize = debounce(() => this.update('resize'), options.resizeDelay || 0);\n instances[me.id] = me;\n if (!context || !canvas) {\n console.error(\"Failed to create chart: can't acquire context from the given item\");\n return;\n }\n animator.listen(me, 'complete', onAnimationsComplete);\n animator.listen(me, 'progress', onAnimationProgress);\n me._initialize();\n if (me.attached) {\n me.update();\n }\n }\n get aspectRatio() {\n const {options: {aspectRatio, maintainAspectRatio}, width, height, _aspectRatio} = this;\n if (!isNullOrUndef(aspectRatio)) {\n return aspectRatio;\n }\n if (maintainAspectRatio && _aspectRatio) {\n return _aspectRatio;\n }\n return height ? width / height : null;\n }\n get data() {\n return this.config.data;\n }\n set data(data) {\n this.config.data = data;\n }\n get options() {\n return this._options;\n }\n set options(options) {\n this.config.options = options;\n }\n _initialize() {\n const me = this;\n me.notifyPlugins('beforeInit');\n if (me.options.responsive) {\n me.resize();\n } else {\n retinaScale(me, me.options.devicePixelRatio);\n }\n me.bindEvents();\n me.notifyPlugins('afterInit');\n return me;\n }\n clear() {\n clearCanvas(this.canvas, this.ctx);\n return this;\n }\n stop() {\n animator.stop(this);\n return this;\n }\n resize(width, height) {\n if (!animator.running(this)) {\n this._resize(width, height);\n } else {\n this._resizeBeforeDraw = {width, height};\n }\n }\n _resize(width, height) {\n const me = this;\n const options = me.options;\n const canvas = me.canvas;\n const aspectRatio = options.maintainAspectRatio && me.aspectRatio;\n const newSize = me.platform.getMaximumSize(canvas, width, height, aspectRatio);\n const newRatio = options.devicePixelRatio || me.platform.getDevicePixelRatio();\n me.width = newSize.width;\n me.height = newSize.height;\n me._aspectRatio = me.aspectRatio;\n if (!retinaScale(me, newRatio, true)) {\n return;\n }\n me.notifyPlugins('resize', {size: newSize});\n callback(options.onResize, [me, newSize], me);\n if (me.attached) {\n if (me._doResize()) {\n me.render();\n }\n }\n }\n ensureScalesHaveIDs() {\n const options = this.options;\n const scalesOptions = options.scales || {};\n each(scalesOptions, (axisOptions, axisID) => {\n axisOptions.id = axisID;\n });\n }\n buildOrUpdateScales() {\n const me = this;\n const options = me.options;\n const scaleOpts = options.scales;\n const scales = me.scales;\n const updated = Object.keys(scales).reduce((obj, id) => {\n obj[id] = false;\n return obj;\n }, {});\n let items = [];\n if (scaleOpts) {\n items = items.concat(\n Object.keys(scaleOpts).map((id) => {\n const scaleOptions = scaleOpts[id];\n const axis = determineAxis(id, scaleOptions);\n const isRadial = axis === 'r';\n const isHorizontal = axis === 'x';\n return {\n options: scaleOptions,\n dposition: isRadial ? 'chartArea' : isHorizontal ? 'bottom' : 'left',\n dtype: isRadial ? 'radialLinear' : isHorizontal ? 'category' : 'linear'\n };\n })\n );\n }\n each(items, (item) => {\n const scaleOptions = item.options;\n const id = scaleOptions.id;\n const axis = determineAxis(id, scaleOptions);\n const scaleType = valueOrDefault(scaleOptions.type, item.dtype);\n if (scaleOptions.position === undefined || positionIsHorizontal(scaleOptions.position, axis) !== positionIsHorizontal(item.dposition)) {\n scaleOptions.position = item.dposition;\n }\n updated[id] = true;\n let scale = null;\n if (id in scales && scales[id].type === scaleType) {\n scale = scales[id];\n } else {\n const scaleClass = registry.getScale(scaleType);\n scale = new scaleClass({\n id,\n type: scaleType,\n ctx: me.ctx,\n chart: me\n });\n scales[scale.id] = scale;\n }\n scale.init(scaleOptions, options);\n });\n each(updated, (hasUpdated, id) => {\n if (!hasUpdated) {\n delete scales[id];\n }\n });\n each(scales, (scale) => {\n layouts.configure(me, scale, scale.options);\n layouts.addBox(me, scale);\n });\n }\n _updateMetasets() {\n const me = this;\n const metasets = me._metasets;\n const numData = me.data.datasets.length;\n const numMeta = metasets.length;\n metasets.sort((a, b) => a.index - b.index);\n if (numMeta > numData) {\n for (let i = numData; i < numMeta; ++i) {\n me._destroyDatasetMeta(i);\n }\n metasets.splice(numData, numMeta - numData);\n }\n me._sortedMetasets = metasets.slice(0).sort(compare2Level('order', 'index'));\n }\n _removeUnreferencedMetasets() {\n const me = this;\n const {_metasets: metasets, data: {datasets}} = me;\n if (metasets.length > datasets.length) {\n delete me._stacks;\n }\n metasets.forEach((meta, index) => {\n if (datasets.filter(x => x === meta._dataset).length === 0) {\n me._destroyDatasetMeta(index);\n }\n });\n }\n buildOrUpdateControllers() {\n const me = this;\n const newControllers = [];\n const datasets = me.data.datasets;\n let i, ilen;\n me._removeUnreferencedMetasets();\n for (i = 0, ilen = datasets.length; i < ilen; i++) {\n const dataset = datasets[i];\n let meta = me.getDatasetMeta(i);\n const type = dataset.type || me.config.type;\n if (meta.type && meta.type !== type) {\n me._destroyDatasetMeta(i);\n meta = me.getDatasetMeta(i);\n }\n meta.type = type;\n meta.indexAxis = dataset.indexAxis || getIndexAxis(type, me.options);\n meta.order = dataset.order || 0;\n meta.index = i;\n meta.label = '' + dataset.label;\n meta.visible = me.isDatasetVisible(i);\n if (meta.controller) {\n meta.controller.updateIndex(i);\n meta.controller.linkScales();\n } else {\n const ControllerClass = registry.getController(type);\n const {datasetElementType, dataElementType} = defaults.datasets[type];\n Object.assign(ControllerClass.prototype, {\n dataElementType: registry.getElement(dataElementType),\n datasetElementType: datasetElementType && registry.getElement(datasetElementType)\n });\n meta.controller = new ControllerClass(me, i);\n newControllers.push(meta.controller);\n }\n }\n me._updateMetasets();\n return newControllers;\n }\n _resetElements() {\n const me = this;\n each(me.data.datasets, (dataset, datasetIndex) => {\n me.getDatasetMeta(datasetIndex).controller.reset();\n }, me);\n }\n reset() {\n this._resetElements();\n this.notifyPlugins('reset');\n }\n update(mode) {\n const me = this;\n const config = me.config;\n config.update();\n me._options = config.createResolver(config.chartOptionScopes(), me.getContext());\n each(me.scales, (scale) => {\n layouts.removeBox(me, scale);\n });\n const animsDisabled = me._animationsDisabled = !me.options.animation;\n me.ensureScalesHaveIDs();\n me.buildOrUpdateScales();\n const existingEvents = new Set(Object.keys(me._listeners));\n const newEvents = new Set(me.options.events);\n if (!setsEqual(existingEvents, newEvents) || !!this._responsiveListeners !== me.options.responsive) {\n me.unbindEvents();\n me.bindEvents();\n }\n me._plugins.invalidate();\n if (me.notifyPlugins('beforeUpdate', {mode, cancelable: true}) === false) {\n return;\n }\n const newControllers = me.buildOrUpdateControllers();\n me.notifyPlugins('beforeElementsUpdate');\n let minPadding = 0;\n for (let i = 0, ilen = me.data.datasets.length; i < ilen; i++) {\n const {controller} = me.getDatasetMeta(i);\n const reset = !animsDisabled && newControllers.indexOf(controller) === -1;\n controller.buildOrUpdateElements(reset);\n minPadding = Math.max(+controller.getMaxOverflow(), minPadding);\n }\n me._minPadding = minPadding;\n me._updateLayout(minPadding);\n if (!animsDisabled) {\n each(newControllers, (controller) => {\n controller.reset();\n });\n }\n me._updateDatasets(mode);\n me.notifyPlugins('afterUpdate', {mode});\n me._layers.sort(compare2Level('z', '_idx'));\n if (me._lastEvent) {\n me._eventHandler(me._lastEvent, true);\n }\n me.render();\n }\n _updateLayout(minPadding) {\n const me = this;\n if (me.notifyPlugins('beforeLayout', {cancelable: true}) === false) {\n return;\n }\n layouts.update(me, me.width, me.height, minPadding);\n const area = me.chartArea;\n const noArea = area.width <= 0 || area.height <= 0;\n me._layers = [];\n each(me.boxes, (box) => {\n if (noArea && box.position === 'chartArea') {\n return;\n }\n if (box.configure) {\n box.configure();\n }\n me._layers.push(...box._layers());\n }, me);\n me._layers.forEach((item, index) => {\n item._idx = index;\n });\n me.notifyPlugins('afterLayout');\n }\n _updateDatasets(mode) {\n const me = this;\n const isFunction = typeof mode === 'function';\n if (me.notifyPlugins('beforeDatasetsUpdate', {mode, cancelable: true}) === false) {\n return;\n }\n for (let i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {\n me._updateDataset(i, isFunction ? mode({datasetIndex: i}) : mode);\n }\n me.notifyPlugins('afterDatasetsUpdate', {mode});\n }\n _updateDataset(index, mode) {\n const me = this;\n const meta = me.getDatasetMeta(index);\n const args = {meta, index, mode, cancelable: true};\n if (me.notifyPlugins('beforeDatasetUpdate', args) === false) {\n return;\n }\n meta.controller._update(mode);\n args.cancelable = false;\n me.notifyPlugins('afterDatasetUpdate', args);\n }\n render() {\n const me = this;\n if (me.notifyPlugins('beforeRender', {cancelable: true}) === false) {\n return;\n }\n if (animator.has(me)) {\n if (me.attached && !animator.running(me)) {\n animator.start(me);\n }\n } else {\n me.draw();\n onAnimationsComplete({chart: me});\n }\n }\n draw() {\n const me = this;\n let i;\n if (me._resizeBeforeDraw) {\n const {width, height} = me._resizeBeforeDraw;\n me._resize(width, height);\n me._resizeBeforeDraw = null;\n }\n me.clear();\n if (me.width <= 0 || me.height <= 0) {\n return;\n }\n if (me.notifyPlugins('beforeDraw', {cancelable: true}) === false) {\n return;\n }\n const layers = me._layers;\n for (i = 0; i < layers.length && layers[i].z <= 0; ++i) {\n layers[i].draw(me.chartArea);\n }\n me._drawDatasets();\n for (; i < layers.length; ++i) {\n layers[i].draw(me.chartArea);\n }\n me.notifyPlugins('afterDraw');\n }\n _getSortedDatasetMetas(filterVisible) {\n const me = this;\n const metasets = me._sortedMetasets;\n const result = [];\n let i, ilen;\n for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n const meta = metasets[i];\n if (!filterVisible || meta.visible) {\n result.push(meta);\n }\n }\n return result;\n }\n getSortedVisibleDatasetMetas() {\n return this._getSortedDatasetMetas(true);\n }\n _drawDatasets() {\n const me = this;\n if (me.notifyPlugins('beforeDatasetsDraw', {cancelable: true}) === false) {\n return;\n }\n const metasets = me.getSortedVisibleDatasetMetas();\n for (let i = metasets.length - 1; i >= 0; --i) {\n me._drawDataset(metasets[i]);\n }\n me.notifyPlugins('afterDatasetsDraw');\n }\n _drawDataset(meta) {\n const me = this;\n const ctx = me.ctx;\n const clip = meta._clip;\n const useClip = !clip.disabled;\n const area = me.chartArea;\n const args = {\n meta,\n index: meta.index,\n cancelable: true\n };\n if (me.notifyPlugins('beforeDatasetDraw', args) === false) {\n return;\n }\n if (useClip) {\n clipArea(ctx, {\n left: clip.left === false ? 0 : area.left - clip.left,\n right: clip.right === false ? me.width : area.right + clip.right,\n top: clip.top === false ? 0 : area.top - clip.top,\n bottom: clip.bottom === false ? me.height : area.bottom + clip.bottom\n });\n }\n meta.controller.draw();\n if (useClip) {\n unclipArea(ctx);\n }\n args.cancelable = false;\n me.notifyPlugins('afterDatasetDraw', args);\n }\n getElementsAtEventForMode(e, mode, options, useFinalPosition) {\n const method = Interaction.modes[mode];\n if (typeof method === 'function') {\n return method(this, e, options, useFinalPosition);\n }\n return [];\n }\n getDatasetMeta(datasetIndex) {\n const me = this;\n const dataset = me.data.datasets[datasetIndex];\n const metasets = me._metasets;\n let meta = metasets.filter(x => x && x._dataset === dataset).pop();\n if (!meta) {\n meta = {\n type: null,\n data: [],\n dataset: null,\n controller: null,\n hidden: null,\n xAxisID: null,\n yAxisID: null,\n order: dataset && dataset.order || 0,\n index: datasetIndex,\n _dataset: dataset,\n _parsed: [],\n _sorted: false\n };\n metasets.push(meta);\n }\n return meta;\n }\n getContext() {\n return this.$context || (this.$context = {chart: this, type: 'chart'});\n }\n getVisibleDatasetCount() {\n return this.getSortedVisibleDatasetMetas().length;\n }\n isDatasetVisible(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n if (!dataset) {\n return false;\n }\n const meta = this.getDatasetMeta(datasetIndex);\n return typeof meta.hidden === 'boolean' ? !meta.hidden : !dataset.hidden;\n }\n setDatasetVisibility(datasetIndex, visible) {\n const meta = this.getDatasetMeta(datasetIndex);\n meta.hidden = !visible;\n }\n toggleDataVisibility(index) {\n this._hiddenIndices[index] = !this._hiddenIndices[index];\n }\n getDataVisibility(index) {\n return !this._hiddenIndices[index];\n }\n _updateVisibility(datasetIndex, dataIndex, visible) {\n const me = this;\n const mode = visible ? 'show' : 'hide';\n const meta = me.getDatasetMeta(datasetIndex);\n const anims = meta.controller._resolveAnimations(undefined, mode);\n if (defined(dataIndex)) {\n meta.data[dataIndex].hidden = !visible;\n me.update();\n } else {\n me.setDatasetVisibility(datasetIndex, visible);\n anims.update(meta, {visible});\n me.update((ctx) => ctx.datasetIndex === datasetIndex ? mode : undefined);\n }\n }\n hide(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, false);\n }\n show(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, true);\n }\n _destroyDatasetMeta(datasetIndex) {\n const me = this;\n const meta = me._metasets && me._metasets[datasetIndex];\n if (meta && meta.controller) {\n meta.controller._destroy();\n delete me._metasets[datasetIndex];\n }\n }\n destroy() {\n const me = this;\n const {canvas, ctx} = me;\n let i, ilen;\n me.stop();\n animator.remove(me);\n for (i = 0, ilen = me.data.datasets.length; i < ilen; ++i) {\n me._destroyDatasetMeta(i);\n }\n me.config.clearCache();\n if (canvas) {\n me.unbindEvents();\n clearCanvas(canvas, ctx);\n me.platform.releaseContext(ctx);\n me.canvas = null;\n me.ctx = null;\n }\n me.notifyPlugins('destroy');\n delete instances[me.id];\n }\n toBase64Image(...args) {\n return this.canvas.toDataURL(...args);\n }\n bindEvents() {\n this.bindUserEvents();\n if (this.options.responsive) {\n this.bindResponsiveEvents();\n } else {\n this.attached = true;\n }\n }\n bindUserEvents() {\n const me = this;\n const listeners = me._listeners;\n const platform = me.platform;\n const _add = (type, listener) => {\n platform.addEventListener(me, type, listener);\n listeners[type] = listener;\n };\n const listener = function(e, x, y) {\n e.offsetX = x;\n e.offsetY = y;\n me._eventHandler(e);\n };\n each(me.options.events, (type) => _add(type, listener));\n }\n bindResponsiveEvents() {\n const me = this;\n if (!me._responsiveListeners) {\n me._responsiveListeners = {};\n }\n const listeners = me._responsiveListeners;\n const platform = me.platform;\n const _add = (type, listener) => {\n platform.addEventListener(me, type, listener);\n listeners[type] = listener;\n };\n const _remove = (type, listener) => {\n if (listeners[type]) {\n platform.removeEventListener(me, type, listener);\n delete listeners[type];\n }\n };\n const listener = (width, height) => {\n if (me.canvas) {\n me.resize(width, height);\n }\n };\n let detached;\n const attached = () => {\n _remove('attach', attached);\n me.attached = true;\n me.resize();\n _add('resize', listener);\n _add('detach', detached);\n };\n detached = () => {\n me.attached = false;\n _remove('resize', listener);\n _add('attach', attached);\n };\n if (platform.isAttached(me.canvas)) {\n attached();\n } else {\n detached();\n }\n }\n unbindEvents() {\n const me = this;\n each(me._listeners, (listener, type) => {\n me.platform.removeEventListener(me, type, listener);\n });\n me._listeners = {};\n each(me._responsiveListeners, (listener, type) => {\n me.platform.removeEventListener(me, type, listener);\n });\n me._responsiveListeners = undefined;\n }\n updateHoverStyle(items, mode, enabled) {\n const prefix = enabled ? 'set' : 'remove';\n let meta, item, i, ilen;\n if (mode === 'dataset') {\n meta = this.getDatasetMeta(items[0].datasetIndex);\n meta.controller['_' + prefix + 'DatasetHoverStyle']();\n }\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n item = items[i];\n const controller = item && this.getDatasetMeta(item.datasetIndex).controller;\n if (controller) {\n controller[prefix + 'HoverStyle'](item.element, item.datasetIndex, item.index);\n }\n }\n }\n getActiveElements() {\n return this._active || [];\n }\n setActiveElements(activeElements) {\n const me = this;\n const lastActive = me._active || [];\n const active = activeElements.map(({datasetIndex, index}) => {\n const meta = me.getDatasetMeta(datasetIndex);\n if (!meta) {\n throw new Error('No dataset found at index ' + datasetIndex);\n }\n return {\n datasetIndex,\n element: meta.data[index],\n index,\n };\n });\n const changed = !_elementsEqual(active, lastActive);\n if (changed) {\n me._active = active;\n me._updateHoverStyles(active, lastActive);\n }\n }\n notifyPlugins(hook, args, filter) {\n return this._plugins.notify(this, hook, args, filter);\n }\n _updateHoverStyles(active, lastActive, replay) {\n const me = this;\n const hoverOptions = me.options.hover;\n const diff = (a, b) => a.filter(x => !b.some(y => x.datasetIndex === y.datasetIndex && x.index === y.index));\n const deactivated = diff(lastActive, active);\n const activated = replay ? active : diff(active, lastActive);\n if (deactivated.length) {\n me.updateHoverStyle(deactivated, hoverOptions.mode, false);\n }\n if (activated.length && hoverOptions.mode) {\n me.updateHoverStyle(activated, hoverOptions.mode, true);\n }\n }\n _eventHandler(e, replay) {\n const me = this;\n const args = {event: e, replay, cancelable: true};\n const eventFilter = (plugin) => (plugin.options.events || this.options.events).includes(e.type);\n if (me.notifyPlugins('beforeEvent', args, eventFilter) === false) {\n return;\n }\n const changed = me._handleEvent(e, replay);\n args.cancelable = false;\n me.notifyPlugins('afterEvent', args, eventFilter);\n if (changed || args.changed) {\n me.render();\n }\n return me;\n }\n _handleEvent(e, replay) {\n const me = this;\n const {_active: lastActive = [], options} = me;\n const hoverOptions = options.hover;\n const useFinalPosition = replay;\n let active = [];\n let changed = false;\n let lastEvent = null;\n if (e.type !== 'mouseout') {\n active = me.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions, useFinalPosition);\n lastEvent = e.type === 'click' ? me._lastEvent : e;\n }\n me._lastEvent = null;\n if (_isPointInArea(e, me.chartArea, me._minPadding)) {\n callback(options.onHover, [e, active, me], me);\n if (e.type === 'mouseup' || e.type === 'click' || e.type === 'contextmenu') {\n callback(options.onClick, [e, active, me], me);\n }\n }\n changed = !_elementsEqual(active, lastActive);\n if (changed || replay) {\n me._active = active;\n me._updateHoverStyles(active, lastActive, replay);\n }\n me._lastEvent = lastEvent;\n return changed;\n }\n}\nconst invalidatePlugins = () => each(Chart.instances, (chart) => chart._plugins.invalidate());\nconst enumerable = true;\nObject.defineProperties(Chart, {\n defaults: {\n enumerable,\n value: defaults\n },\n instances: {\n enumerable,\n value: instances\n },\n overrides: {\n enumerable,\n value: overrides\n },\n registry: {\n enumerable,\n value: registry\n },\n version: {\n enumerable,\n value: version\n },\n getChart: {\n enumerable,\n value: getChart\n },\n register: {\n enumerable,\n value: (...items) => {\n registry.add(...items);\n invalidatePlugins();\n }\n },\n unregister: {\n enumerable,\n value: (...items) => {\n registry.remove(...items);\n invalidatePlugins();\n }\n }\n});\n\nfunction clipArc(ctx, element, endAngle) {\n const {startAngle, pixelMargin, x, y, outerRadius, innerRadius} = element;\n let angleMargin = pixelMargin / outerRadius;\n ctx.beginPath();\n ctx.arc(x, y, outerRadius, startAngle - angleMargin, endAngle + angleMargin);\n if (innerRadius > pixelMargin) {\n angleMargin = pixelMargin / innerRadius;\n ctx.arc(x, y, innerRadius, endAngle + angleMargin, startAngle - angleMargin, true);\n } else {\n ctx.arc(x, y, pixelMargin, endAngle + HALF_PI, startAngle - HALF_PI);\n }\n ctx.closePath();\n ctx.clip();\n}\nfunction toRadiusCorners(value) {\n return _readValueToProps(value, ['outerStart', 'outerEnd', 'innerStart', 'innerEnd']);\n}\nfunction parseBorderRadius$1(arc, innerRadius, outerRadius, angleDelta) {\n const o = toRadiusCorners(arc.options.borderRadius);\n const halfThickness = (outerRadius - innerRadius) / 2;\n const innerLimit = Math.min(halfThickness, angleDelta * innerRadius / 2);\n const computeOuterLimit = (val) => {\n const outerArcLimit = (outerRadius - Math.min(halfThickness, val)) * angleDelta / 2;\n return _limitValue(val, 0, Math.min(halfThickness, outerArcLimit));\n };\n return {\n outerStart: computeOuterLimit(o.outerStart),\n outerEnd: computeOuterLimit(o.outerEnd),\n innerStart: _limitValue(o.innerStart, 0, innerLimit),\n innerEnd: _limitValue(o.innerEnd, 0, innerLimit),\n };\n}\nfunction rThetaToXY(r, theta, x, y) {\n return {\n x: x + r * Math.cos(theta),\n y: y + r * Math.sin(theta),\n };\n}\nfunction pathArc(ctx, element, offset, spacing, end) {\n const {x, y, startAngle: start, pixelMargin, innerRadius: innerR} = element;\n const outerRadius = Math.max(element.outerRadius + spacing + offset - pixelMargin, 0);\n const innerRadius = innerR > 0 ? innerR + spacing + offset + pixelMargin : 0;\n let spacingOffset = 0;\n const alpha = end - start;\n if (spacing) {\n const noSpacingInnerRadius = innerR > 0 ? innerR - spacing : 0;\n const noSpacingOuterRadius = outerRadius > 0 ? outerRadius - spacing : 0;\n const avNogSpacingRadius = (noSpacingInnerRadius + noSpacingOuterRadius) / 2;\n const adjustedAngle = avNogSpacingRadius !== 0 ? (alpha * avNogSpacingRadius) / (avNogSpacingRadius + spacing) : alpha;\n spacingOffset = (alpha - adjustedAngle) / 2;\n }\n const beta = Math.max(0.001, alpha * outerRadius - offset / PI) / outerRadius;\n const angleOffset = (alpha - beta) / 2;\n const startAngle = start + angleOffset + spacingOffset;\n const endAngle = end - angleOffset - spacingOffset;\n const {outerStart, outerEnd, innerStart, innerEnd} = parseBorderRadius$1(element, innerRadius, outerRadius, endAngle - startAngle);\n const outerStartAdjustedRadius = outerRadius - outerStart;\n const outerEndAdjustedRadius = outerRadius - outerEnd;\n const outerStartAdjustedAngle = startAngle + outerStart / outerStartAdjustedRadius;\n const outerEndAdjustedAngle = endAngle - outerEnd / outerEndAdjustedRadius;\n const innerStartAdjustedRadius = innerRadius + innerStart;\n const innerEndAdjustedRadius = innerRadius + innerEnd;\n const innerStartAdjustedAngle = startAngle + innerStart / innerStartAdjustedRadius;\n const innerEndAdjustedAngle = endAngle - innerEnd / innerEndAdjustedRadius;\n ctx.beginPath();\n ctx.arc(x, y, outerRadius, outerStartAdjustedAngle, outerEndAdjustedAngle);\n if (outerEnd > 0) {\n const pCenter = rThetaToXY(outerEndAdjustedRadius, outerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerEnd, outerEndAdjustedAngle, endAngle + HALF_PI);\n }\n const p4 = rThetaToXY(innerEndAdjustedRadius, endAngle, x, y);\n ctx.lineTo(p4.x, p4.y);\n if (innerEnd > 0) {\n const pCenter = rThetaToXY(innerEndAdjustedRadius, innerEndAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerEnd, endAngle + HALF_PI, innerEndAdjustedAngle + Math.PI);\n }\n ctx.arc(x, y, innerRadius, endAngle - (innerEnd / innerRadius), startAngle + (innerStart / innerRadius), true);\n if (innerStart > 0) {\n const pCenter = rThetaToXY(innerStartAdjustedRadius, innerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, innerStart, innerStartAdjustedAngle + Math.PI, startAngle - HALF_PI);\n }\n const p8 = rThetaToXY(outerStartAdjustedRadius, startAngle, x, y);\n ctx.lineTo(p8.x, p8.y);\n if (outerStart > 0) {\n const pCenter = rThetaToXY(outerStartAdjustedRadius, outerStartAdjustedAngle, x, y);\n ctx.arc(pCenter.x, pCenter.y, outerStart, startAngle - HALF_PI, outerStartAdjustedAngle);\n }\n ctx.closePath();\n}\nfunction drawArc(ctx, element, offset, spacing) {\n const {fullCircles, startAngle, circumference} = element;\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, startAngle + TAU);\n for (let i = 0; i < fullCircles; ++i) {\n ctx.fill();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + circumference % TAU;\n if (circumference % TAU === 0) {\n endAngle += TAU;\n }\n }\n }\n pathArc(ctx, element, offset, spacing, endAngle);\n ctx.fill();\n return endAngle;\n}\nfunction drawFullCircleBorders(ctx, element, inner) {\n const {x, y, startAngle, pixelMargin, fullCircles} = element;\n const outerRadius = Math.max(element.outerRadius - pixelMargin, 0);\n const innerRadius = element.innerRadius + pixelMargin;\n let i;\n if (inner) {\n clipArc(ctx, element, startAngle + TAU);\n }\n ctx.beginPath();\n ctx.arc(x, y, innerRadius, startAngle + TAU, startAngle, true);\n for (i = 0; i < fullCircles; ++i) {\n ctx.stroke();\n }\n ctx.beginPath();\n ctx.arc(x, y, outerRadius, startAngle, startAngle + TAU);\n for (i = 0; i < fullCircles; ++i) {\n ctx.stroke();\n }\n}\nfunction drawBorder(ctx, element, offset, spacing, endAngle) {\n const {options} = element;\n const inner = options.borderAlign === 'inner';\n if (!options.borderWidth) {\n return;\n }\n if (inner) {\n ctx.lineWidth = options.borderWidth * 2;\n ctx.lineJoin = 'round';\n } else {\n ctx.lineWidth = options.borderWidth;\n ctx.lineJoin = 'bevel';\n }\n if (element.fullCircles) {\n drawFullCircleBorders(ctx, element, inner);\n }\n if (inner) {\n clipArc(ctx, element, endAngle);\n }\n pathArc(ctx, element, offset, spacing, endAngle);\n ctx.stroke();\n}\nclass ArcElement extends Element {\n constructor(cfg) {\n super();\n this.options = undefined;\n this.circumference = undefined;\n this.startAngle = undefined;\n this.endAngle = undefined;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.pixelMargin = 0;\n this.fullCircles = 0;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n inRange(chartX, chartY, useFinalPosition) {\n const point = this.getProps(['x', 'y'], useFinalPosition);\n const {angle, distance} = getAngleFromPoint(point, {x: chartX, y: chartY});\n const {startAngle, endAngle, innerRadius, outerRadius, circumference} = this.getProps([\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius',\n 'circumference'\n ], useFinalPosition);\n const rAdjust = this.options.spacing / 2;\n const betweenAngles = circumference >= TAU || _angleBetween(angle, startAngle, endAngle);\n const withinRadius = (distance >= innerRadius + rAdjust && distance <= outerRadius + rAdjust);\n return (betweenAngles && withinRadius);\n }\n getCenterPoint(useFinalPosition) {\n const {x, y, startAngle, endAngle, innerRadius, outerRadius} = this.getProps([\n 'x',\n 'y',\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius',\n 'circumference',\n ], useFinalPosition);\n const {offset, spacing} = this.options;\n const halfAngle = (startAngle + endAngle) / 2;\n const halfRadius = (innerRadius + outerRadius + spacing + offset) / 2;\n return {\n x: x + Math.cos(halfAngle) * halfRadius,\n y: y + Math.sin(halfAngle) * halfRadius\n };\n }\n tooltipPosition(useFinalPosition) {\n return this.getCenterPoint(useFinalPosition);\n }\n draw(ctx) {\n const me = this;\n const {options, circumference} = me;\n const offset = (options.offset || 0) / 2;\n const spacing = (options.spacing || 0) / 2;\n me.pixelMargin = (options.borderAlign === 'inner') ? 0.33 : 0;\n me.fullCircles = circumference > TAU ? Math.floor(circumference / TAU) : 0;\n if (circumference === 0 || me.innerRadius < 0 || me.outerRadius < 0) {\n return;\n }\n ctx.save();\n let radiusOffset = 0;\n if (offset) {\n radiusOffset = offset / 2;\n const halfAngle = (me.startAngle + me.endAngle) / 2;\n ctx.translate(Math.cos(halfAngle) * radiusOffset, Math.sin(halfAngle) * radiusOffset);\n if (me.circumference >= PI) {\n radiusOffset = offset;\n }\n }\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n const endAngle = drawArc(ctx, me, radiusOffset, spacing);\n drawBorder(ctx, me, radiusOffset, spacing, endAngle);\n ctx.restore();\n }\n}\nArcElement.id = 'arc';\nArcElement.defaults = {\n borderAlign: 'center',\n borderColor: '#fff',\n borderRadius: 0,\n borderWidth: 2,\n offset: 0,\n spacing: 0,\n angle: undefined,\n};\nArcElement.defaultRoutes = {\n backgroundColor: 'backgroundColor'\n};\n\nfunction setStyle(ctx, options, style = options) {\n ctx.lineCap = valueOrDefault(style.borderCapStyle, options.borderCapStyle);\n ctx.setLineDash(valueOrDefault(style.borderDash, options.borderDash));\n ctx.lineDashOffset = valueOrDefault(style.borderDashOffset, options.borderDashOffset);\n ctx.lineJoin = valueOrDefault(style.borderJoinStyle, options.borderJoinStyle);\n ctx.lineWidth = valueOrDefault(style.borderWidth, options.borderWidth);\n ctx.strokeStyle = valueOrDefault(style.borderColor, options.borderColor);\n}\nfunction lineTo(ctx, previous, target) {\n ctx.lineTo(target.x, target.y);\n}\nfunction getLineMethod(options) {\n if (options.stepped) {\n return _steppedLineTo;\n }\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierCurveTo;\n }\n return lineTo;\n}\nfunction pathVars(points, segment, params = {}) {\n const count = points.length;\n const {start: paramsStart = 0, end: paramsEnd = count - 1} = params;\n const {start: segmentStart, end: segmentEnd} = segment;\n const start = Math.max(paramsStart, segmentStart);\n const end = Math.min(paramsEnd, segmentEnd);\n const outside = paramsStart < segmentStart && paramsEnd < segmentStart || paramsStart > segmentEnd && paramsEnd > segmentEnd;\n return {\n count,\n start,\n loop: segment.loop,\n ilen: end < start && !outside ? count + end - start : end - start\n };\n}\nfunction pathSegment(ctx, line, segment, params) {\n const {points, options} = line;\n const {count, start, loop, ilen} = pathVars(points, segment, params);\n const lineMethod = getLineMethod(options);\n let {move = true, reverse} = params || {};\n let i, point, prev;\n for (i = 0; i <= ilen; ++i) {\n point = points[(start + (reverse ? ilen - i : i)) % count];\n if (point.skip) {\n continue;\n } else if (move) {\n ctx.moveTo(point.x, point.y);\n move = false;\n } else {\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n prev = point;\n }\n if (loop) {\n point = points[(start + (reverse ? ilen : 0)) % count];\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n return !!loop;\n}\nfunction fastPathSegment(ctx, line, segment, params) {\n const points = line.points;\n const {count, start, ilen} = pathVars(points, segment, params);\n const {move = true, reverse} = params || {};\n let avgX = 0;\n let countX = 0;\n let i, point, prevX, minY, maxY, lastY;\n const pointIndex = (index) => (start + (reverse ? ilen - index : index)) % count;\n const drawX = () => {\n if (minY !== maxY) {\n ctx.lineTo(avgX, maxY);\n ctx.lineTo(avgX, minY);\n ctx.lineTo(avgX, lastY);\n }\n };\n if (move) {\n point = points[pointIndex(0)];\n ctx.moveTo(point.x, point.y);\n }\n for (i = 0; i <= ilen; ++i) {\n point = points[pointIndex(i)];\n if (point.skip) {\n continue;\n }\n const x = point.x;\n const y = point.y;\n const truncX = x | 0;\n if (truncX === prevX) {\n if (y < minY) {\n minY = y;\n } else if (y > maxY) {\n maxY = y;\n }\n avgX = (countX * avgX + x) / ++countX;\n } else {\n drawX();\n ctx.lineTo(x, y);\n prevX = truncX;\n countX = 0;\n minY = maxY = y;\n }\n lastY = y;\n }\n drawX();\n}\nfunction _getSegmentMethod(line) {\n const opts = line.options;\n const borderDash = opts.borderDash && opts.borderDash.length;\n const useFastPath = !line._decimated && !line._loop && !opts.tension && opts.cubicInterpolationMode !== 'monotone' && !opts.stepped && !borderDash;\n return useFastPath ? fastPathSegment : pathSegment;\n}\nfunction _getInterpolationMethod(options) {\n if (options.stepped) {\n return _steppedInterpolation;\n }\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierInterpolation;\n }\n return _pointInLine;\n}\nfunction strokePathWithCache(ctx, line, start, count) {\n let path = line._path;\n if (!path) {\n path = line._path = new Path2D();\n if (line.path(path, start, count)) {\n path.closePath();\n }\n }\n setStyle(ctx, line.options);\n ctx.stroke(path);\n}\nfunction strokePathDirect(ctx, line, start, count) {\n const {segments, options} = line;\n const segmentMethod = _getSegmentMethod(line);\n for (const segment of segments) {\n setStyle(ctx, options, segment.style);\n ctx.beginPath();\n if (segmentMethod(ctx, line, segment, {start, end: start + count - 1})) {\n ctx.closePath();\n }\n ctx.stroke();\n }\n}\nconst usePath2D = typeof Path2D === 'function';\nfunction draw(ctx, line, start, count) {\n if (usePath2D && line.segments.length === 1) {\n strokePathWithCache(ctx, line, start, count);\n } else {\n strokePathDirect(ctx, line, start, count);\n }\n}\nclass LineElement extends Element {\n constructor(cfg) {\n super();\n this.animated = true;\n this.options = undefined;\n this._loop = undefined;\n this._fullLoop = undefined;\n this._path = undefined;\n this._points = undefined;\n this._segments = undefined;\n this._decimated = false;\n this._pointsUpdated = false;\n this._datasetIndex = undefined;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n updateControlPoints(chartArea, indexAxis) {\n const me = this;\n const options = me.options;\n if ((options.tension || options.cubicInterpolationMode === 'monotone') && !options.stepped && !me._pointsUpdated) {\n const loop = options.spanGaps ? me._loop : me._fullLoop;\n _updateBezierControlPoints(me._points, options, chartArea, loop, indexAxis);\n me._pointsUpdated = true;\n }\n }\n set points(points) {\n const me = this;\n me._points = points;\n delete me._segments;\n delete me._path;\n me._pointsUpdated = false;\n }\n get points() {\n return this._points;\n }\n get segments() {\n return this._segments || (this._segments = _computeSegments(this, this.options.segment));\n }\n first() {\n const segments = this.segments;\n const points = this.points;\n return segments.length && points[segments[0].start];\n }\n last() {\n const segments = this.segments;\n const points = this.points;\n const count = segments.length;\n return count && points[segments[count - 1].end];\n }\n interpolate(point, property) {\n const me = this;\n const options = me.options;\n const value = point[property];\n const points = me.points;\n const segments = _boundSegments(me, {property, start: value, end: value});\n if (!segments.length) {\n return;\n }\n const result = [];\n const _interpolate = _getInterpolationMethod(options);\n let i, ilen;\n for (i = 0, ilen = segments.length; i < ilen; ++i) {\n const {start, end} = segments[i];\n const p1 = points[start];\n const p2 = points[end];\n if (p1 === p2) {\n result.push(p1);\n continue;\n }\n const t = Math.abs((value - p1[property]) / (p2[property] - p1[property]));\n const interpolated = _interpolate(p1, p2, t, options.stepped);\n interpolated[property] = point[property];\n result.push(interpolated);\n }\n return result.length === 1 ? result[0] : result;\n }\n pathSegment(ctx, segment, params) {\n const segmentMethod = _getSegmentMethod(this);\n return segmentMethod(ctx, this, segment, params);\n }\n path(ctx, start, count) {\n const me = this;\n const segments = me.segments;\n const segmentMethod = _getSegmentMethod(me);\n let loop = me._loop;\n start = start || 0;\n count = count || (me.points.length - start);\n for (const segment of segments) {\n loop &= segmentMethod(ctx, me, segment, {start, end: start + count - 1});\n }\n return !!loop;\n }\n draw(ctx, chartArea, start, count) {\n const me = this;\n const options = me.options || {};\n const points = me.points || [];\n if (!points.length || !options.borderWidth) {\n return;\n }\n ctx.save();\n draw(ctx, me, start, count);\n ctx.restore();\n if (me.animated) {\n me._pointsUpdated = false;\n me._path = undefined;\n }\n }\n}\nLineElement.id = 'line';\nLineElement.defaults = {\n borderCapStyle: 'butt',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: 'miter',\n borderWidth: 3,\n capBezierPoints: true,\n cubicInterpolationMode: 'default',\n fill: false,\n spanGaps: false,\n stepped: false,\n tension: 0,\n};\nLineElement.defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n};\nLineElement.descriptors = {\n _scriptable: true,\n _indexable: (name) => name !== 'borderDash' && name !== 'fill',\n};\n\nfunction inRange$1(el, pos, axis, useFinalPosition) {\n const options = el.options;\n const {[axis]: value} = el.getProps([axis], useFinalPosition);\n return (Math.abs(pos - value) < options.radius + options.hitRadius);\n}\nclass PointElement extends Element {\n constructor(cfg) {\n super();\n this.options = undefined;\n this.parsed = undefined;\n this.skip = undefined;\n this.stop = undefined;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n inRange(mouseX, mouseY, useFinalPosition) {\n const options = this.options;\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return ((Math.pow(mouseX - x, 2) + Math.pow(mouseY - y, 2)) < Math.pow(options.hitRadius + options.radius, 2));\n }\n inXRange(mouseX, useFinalPosition) {\n return inRange$1(this, mouseX, 'x', useFinalPosition);\n }\n inYRange(mouseY, useFinalPosition) {\n return inRange$1(this, mouseY, 'y', useFinalPosition);\n }\n getCenterPoint(useFinalPosition) {\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return {x, y};\n }\n size(options) {\n options = options || this.options || {};\n let radius = options.radius || 0;\n radius = Math.max(radius, radius && options.hoverRadius || 0);\n const borderWidth = radius && options.borderWidth || 0;\n return (radius + borderWidth) * 2;\n }\n draw(ctx, area) {\n const me = this;\n const options = me.options;\n if (me.skip || options.radius < 0.1 || !_isPointInArea(me, area, me.size(options) / 2)) {\n return;\n }\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n ctx.fillStyle = options.backgroundColor;\n drawPoint(ctx, options, me.x, me.y);\n }\n getRange() {\n const options = this.options || {};\n return options.radius + options.hitRadius;\n }\n}\nPointElement.id = 'point';\nPointElement.defaults = {\n borderWidth: 1,\n hitRadius: 1,\n hoverBorderWidth: 1,\n hoverRadius: 4,\n pointStyle: 'circle',\n radius: 3,\n rotation: 0\n};\nPointElement.defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n};\n\nfunction getBarBounds(bar, useFinalPosition) {\n const {x, y, base, width, height} = bar.getProps(['x', 'y', 'base', 'width', 'height'], useFinalPosition);\n let left, right, top, bottom, half;\n if (bar.horizontal) {\n half = height / 2;\n left = Math.min(x, base);\n right = Math.max(x, base);\n top = y - half;\n bottom = y + half;\n } else {\n half = width / 2;\n left = x - half;\n right = x + half;\n top = Math.min(y, base);\n bottom = Math.max(y, base);\n }\n return {left, top, right, bottom};\n}\nfunction skipOrLimit(skip, value, min, max) {\n return skip ? 0 : _limitValue(value, min, max);\n}\nfunction parseBorderWidth(bar, maxW, maxH) {\n const value = bar.options.borderWidth;\n const skip = bar.borderSkipped;\n const o = toTRBL(value);\n return {\n t: skipOrLimit(skip.top, o.top, 0, maxH),\n r: skipOrLimit(skip.right, o.right, 0, maxW),\n b: skipOrLimit(skip.bottom, o.bottom, 0, maxH),\n l: skipOrLimit(skip.left, o.left, 0, maxW)\n };\n}\nfunction parseBorderRadius(bar, maxW, maxH) {\n const {enableBorderRadius} = bar.getProps(['enableBorderRadius']);\n const value = bar.options.borderRadius;\n const o = toTRBLCorners(value);\n const maxR = Math.min(maxW, maxH);\n const skip = bar.borderSkipped;\n const enableBorder = enableBorderRadius || isObject(value);\n return {\n topLeft: skipOrLimit(!enableBorder || skip.top || skip.left, o.topLeft, 0, maxR),\n topRight: skipOrLimit(!enableBorder || skip.top || skip.right, o.topRight, 0, maxR),\n bottomLeft: skipOrLimit(!enableBorder || skip.bottom || skip.left, o.bottomLeft, 0, maxR),\n bottomRight: skipOrLimit(!enableBorder || skip.bottom || skip.right, o.bottomRight, 0, maxR)\n };\n}\nfunction boundingRects(bar) {\n const bounds = getBarBounds(bar);\n const width = bounds.right - bounds.left;\n const height = bounds.bottom - bounds.top;\n const border = parseBorderWidth(bar, width / 2, height / 2);\n const radius = parseBorderRadius(bar, width / 2, height / 2);\n return {\n outer: {\n x: bounds.left,\n y: bounds.top,\n w: width,\n h: height,\n radius\n },\n inner: {\n x: bounds.left + border.l,\n y: bounds.top + border.t,\n w: width - border.l - border.r,\n h: height - border.t - border.b,\n radius: {\n topLeft: Math.max(0, radius.topLeft - Math.max(border.t, border.l)),\n topRight: Math.max(0, radius.topRight - Math.max(border.t, border.r)),\n bottomLeft: Math.max(0, radius.bottomLeft - Math.max(border.b, border.l)),\n bottomRight: Math.max(0, radius.bottomRight - Math.max(border.b, border.r)),\n }\n }\n };\n}\nfunction inRange(bar, x, y, useFinalPosition) {\n const skipX = x === null;\n const skipY = y === null;\n const skipBoth = skipX && skipY;\n const bounds = bar && !skipBoth && getBarBounds(bar, useFinalPosition);\n return bounds\n\t\t&& (skipX || x >= bounds.left && x <= bounds.right)\n\t\t&& (skipY || y >= bounds.top && y <= bounds.bottom);\n}\nfunction hasRadius(radius) {\n return radius.topLeft || radius.topRight || radius.bottomLeft || radius.bottomRight;\n}\nfunction addNormalRectPath(ctx, rect) {\n ctx.rect(rect.x, rect.y, rect.w, rect.h);\n}\nfunction inflateRect(rect, amount, refRect = {}) {\n const x = rect.x !== refRect.x ? -amount : 0;\n const y = rect.y !== refRect.y ? -amount : 0;\n const w = (rect.x + rect.w !== refRect.x + refRect.w ? amount : 0) - x;\n const h = (rect.y + rect.h !== refRect.y + refRect.h ? amount : 0) - y;\n return {\n x: rect.x + x,\n y: rect.y + y,\n w: rect.w + w,\n h: rect.h + h,\n radius: rect.radius\n };\n}\nclass BarElement extends Element {\n constructor(cfg) {\n super();\n this.options = undefined;\n this.horizontal = undefined;\n this.base = undefined;\n this.width = undefined;\n this.height = undefined;\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n draw(ctx) {\n const options = this.options;\n const {inner, outer} = boundingRects(this);\n const addRectPath = hasRadius(outer.radius) ? addRoundedRectPath : addNormalRectPath;\n const inflateAmount = 0.33;\n ctx.save();\n if (outer.w !== inner.w || outer.h !== inner.h) {\n ctx.beginPath();\n addRectPath(ctx, inflateRect(outer, inflateAmount, inner));\n ctx.clip();\n addRectPath(ctx, inflateRect(inner, -inflateAmount, outer));\n ctx.fillStyle = options.borderColor;\n ctx.fill('evenodd');\n }\n ctx.beginPath();\n addRectPath(ctx, inflateRect(inner, inflateAmount, outer));\n ctx.fillStyle = options.backgroundColor;\n ctx.fill();\n ctx.restore();\n }\n inRange(mouseX, mouseY, useFinalPosition) {\n return inRange(this, mouseX, mouseY, useFinalPosition);\n }\n inXRange(mouseX, useFinalPosition) {\n return inRange(this, mouseX, null, useFinalPosition);\n }\n inYRange(mouseY, useFinalPosition) {\n return inRange(this, null, mouseY, useFinalPosition);\n }\n getCenterPoint(useFinalPosition) {\n const {x, y, base, horizontal} = this.getProps(['x', 'y', 'base', 'horizontal'], useFinalPosition);\n return {\n x: horizontal ? (x + base) / 2 : x,\n y: horizontal ? y : (y + base) / 2\n };\n }\n getRange(axis) {\n return axis === 'x' ? this.width / 2 : this.height / 2;\n }\n}\nBarElement.id = 'bar';\nBarElement.defaults = {\n borderSkipped: 'start',\n borderWidth: 0,\n borderRadius: 0,\n enableBorderRadius: true,\n pointStyle: undefined\n};\nBarElement.defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n};\n\nvar elements = /*#__PURE__*/Object.freeze({\n__proto__: null,\nArcElement: ArcElement,\nLineElement: LineElement,\nPointElement: PointElement,\nBarElement: BarElement\n});\n\nfunction lttbDecimation(data, start, count, availableWidth, options) {\n const samples = options.samples || availableWidth;\n if (samples >= count) {\n return data.slice(start, start + count);\n }\n const decimated = [];\n const bucketWidth = (count - 2) / (samples - 2);\n let sampledIndex = 0;\n const endIndex = start + count - 1;\n let a = start;\n let i, maxAreaPoint, maxArea, area, nextA;\n decimated[sampledIndex++] = data[a];\n for (i = 0; i < samples - 2; i++) {\n let avgX = 0;\n let avgY = 0;\n let j;\n const avgRangeStart = Math.floor((i + 1) * bucketWidth) + 1 + start;\n const avgRangeEnd = Math.min(Math.floor((i + 2) * bucketWidth) + 1, count) + start;\n const avgRangeLength = avgRangeEnd - avgRangeStart;\n for (j = avgRangeStart; j < avgRangeEnd; j++) {\n avgX += data[j].x;\n avgY += data[j].y;\n }\n avgX /= avgRangeLength;\n avgY /= avgRangeLength;\n const rangeOffs = Math.floor(i * bucketWidth) + 1 + start;\n const rangeTo = Math.min(Math.floor((i + 1) * bucketWidth) + 1, count) + start;\n const {x: pointAx, y: pointAy} = data[a];\n maxArea = area = -1;\n for (j = rangeOffs; j < rangeTo; j++) {\n area = 0.5 * Math.abs(\n (pointAx - avgX) * (data[j].y - pointAy) -\n (pointAx - data[j].x) * (avgY - pointAy)\n );\n if (area > maxArea) {\n maxArea = area;\n maxAreaPoint = data[j];\n nextA = j;\n }\n }\n decimated[sampledIndex++] = maxAreaPoint;\n a = nextA;\n }\n decimated[sampledIndex++] = data[endIndex];\n return decimated;\n}\nfunction minMaxDecimation(data, start, count, availableWidth) {\n let avgX = 0;\n let countX = 0;\n let i, point, x, y, prevX, minIndex, maxIndex, startIndex, minY, maxY;\n const decimated = [];\n const endIndex = start + count - 1;\n const xMin = data[start].x;\n const xMax = data[endIndex].x;\n const dx = xMax - xMin;\n for (i = start; i < start + count; ++i) {\n point = data[i];\n x = (point.x - xMin) / dx * availableWidth;\n y = point.y;\n const truncX = x | 0;\n if (truncX === prevX) {\n if (y < minY) {\n minY = y;\n minIndex = i;\n } else if (y > maxY) {\n maxY = y;\n maxIndex = i;\n }\n avgX = (countX * avgX + point.x) / ++countX;\n } else {\n const lastIndex = i - 1;\n if (!isNullOrUndef(minIndex) && !isNullOrUndef(maxIndex)) {\n const intermediateIndex1 = Math.min(minIndex, maxIndex);\n const intermediateIndex2 = Math.max(minIndex, maxIndex);\n if (intermediateIndex1 !== startIndex && intermediateIndex1 !== lastIndex) {\n decimated.push({\n ...data[intermediateIndex1],\n x: avgX,\n });\n }\n if (intermediateIndex2 !== startIndex && intermediateIndex2 !== lastIndex) {\n decimated.push({\n ...data[intermediateIndex2],\n x: avgX\n });\n }\n }\n if (i > 0 && lastIndex !== startIndex) {\n decimated.push(data[lastIndex]);\n }\n decimated.push(point);\n prevX = truncX;\n countX = 0;\n minY = maxY = y;\n minIndex = maxIndex = startIndex = i;\n }\n }\n return decimated;\n}\nfunction cleanDecimatedDataset(dataset) {\n if (dataset._decimated) {\n const data = dataset._data;\n delete dataset._decimated;\n delete dataset._data;\n Object.defineProperty(dataset, 'data', {value: data});\n }\n}\nfunction cleanDecimatedData(chart) {\n chart.data.datasets.forEach((dataset) => {\n cleanDecimatedDataset(dataset);\n });\n}\nfunction getStartAndCountOfVisiblePointsSimplified(meta, points) {\n const pointCount = points.length;\n let start = 0;\n let count;\n const {iScale} = meta;\n const {min, max, minDefined, maxDefined} = iScale.getUserBounds();\n if (minDefined) {\n start = _limitValue(_lookupByKey(points, iScale.axis, min).lo, 0, pointCount - 1);\n }\n if (maxDefined) {\n count = _limitValue(_lookupByKey(points, iScale.axis, max).hi + 1, start, pointCount) - start;\n } else {\n count = pointCount - start;\n }\n return {start, count};\n}\nvar plugin_decimation = {\n id: 'decimation',\n defaults: {\n algorithm: 'min-max',\n enabled: false,\n },\n beforeElementsUpdate: (chart, args, options) => {\n if (!options.enabled) {\n cleanDecimatedData(chart);\n return;\n }\n const availableWidth = chart.width;\n chart.data.datasets.forEach((dataset, datasetIndex) => {\n const {_data, indexAxis} = dataset;\n const meta = chart.getDatasetMeta(datasetIndex);\n const data = _data || dataset.data;\n if (resolve([indexAxis, chart.options.indexAxis]) === 'y') {\n return;\n }\n if (meta.type !== 'line') {\n return;\n }\n const xAxis = chart.scales[meta.xAxisID];\n if (xAxis.type !== 'linear' && xAxis.type !== 'time') {\n return;\n }\n if (chart.options.parsing) {\n return;\n }\n let {start, count} = getStartAndCountOfVisiblePointsSimplified(meta, data);\n const threshold = options.threshold || 4 * availableWidth;\n if (count <= threshold) {\n cleanDecimatedDataset(dataset);\n return;\n }\n if (isNullOrUndef(_data)) {\n dataset._data = data;\n delete dataset.data;\n Object.defineProperty(dataset, 'data', {\n configurable: true,\n enumerable: true,\n get: function() {\n return this._decimated;\n },\n set: function(d) {\n this._data = d;\n }\n });\n }\n let decimated;\n switch (options.algorithm) {\n case 'lttb':\n decimated = lttbDecimation(data, start, count, availableWidth, options);\n break;\n case 'min-max':\n decimated = minMaxDecimation(data, start, count, availableWidth);\n break;\n default:\n throw new Error(`Unsupported decimation algorithm '${options.algorithm}'`);\n }\n dataset._decimated = decimated;\n });\n },\n destroy(chart) {\n cleanDecimatedData(chart);\n }\n};\n\nfunction getLineByIndex(chart, index) {\n const meta = chart.getDatasetMeta(index);\n const visible = meta && chart.isDatasetVisible(index);\n return visible ? meta.dataset : null;\n}\nfunction parseFillOption(line) {\n const options = line.options;\n const fillOption = options.fill;\n let fill = valueOrDefault(fillOption && fillOption.target, fillOption);\n if (fill === undefined) {\n fill = !!options.backgroundColor;\n }\n if (fill === false || fill === null) {\n return false;\n }\n if (fill === true) {\n return 'origin';\n }\n return fill;\n}\nfunction decodeFill(line, index, count) {\n const fill = parseFillOption(line);\n if (isObject(fill)) {\n return isNaN(fill.value) ? false : fill;\n }\n let target = parseFloat(fill);\n if (isNumberFinite(target) && Math.floor(target) === target) {\n if (fill[0] === '-' || fill[0] === '+') {\n target = index + target;\n }\n if (target === index || target < 0 || target >= count) {\n return false;\n }\n return target;\n }\n return ['origin', 'start', 'end', 'stack', 'shape'].indexOf(fill) >= 0 && fill;\n}\nfunction computeLinearBoundary(source) {\n const {scale = {}, fill} = source;\n let target = null;\n let horizontal;\n if (fill === 'start') {\n target = scale.bottom;\n } else if (fill === 'end') {\n target = scale.top;\n } else if (isObject(fill)) {\n target = scale.getPixelForValue(fill.value);\n } else if (scale.getBasePixel) {\n target = scale.getBasePixel();\n }\n if (isNumberFinite(target)) {\n horizontal = scale.isHorizontal();\n return {\n x: horizontal ? target : null,\n y: horizontal ? null : target\n };\n }\n return null;\n}\nclass simpleArc {\n constructor(opts) {\n this.x = opts.x;\n this.y = opts.y;\n this.radius = opts.radius;\n }\n pathSegment(ctx, bounds, opts) {\n const {x, y, radius} = this;\n bounds = bounds || {start: 0, end: TAU};\n ctx.arc(x, y, radius, bounds.end, bounds.start, true);\n return !opts.bounds;\n }\n interpolate(point) {\n const {x, y, radius} = this;\n const angle = point.angle;\n return {\n x: x + Math.cos(angle) * radius,\n y: y + Math.sin(angle) * radius,\n angle\n };\n }\n}\nfunction computeCircularBoundary(source) {\n const {scale, fill} = source;\n const options = scale.options;\n const length = scale.getLabels().length;\n const target = [];\n const start = options.reverse ? scale.max : scale.min;\n const end = options.reverse ? scale.min : scale.max;\n let i, center, value;\n if (fill === 'start') {\n value = start;\n } else if (fill === 'end') {\n value = end;\n } else if (isObject(fill)) {\n value = fill.value;\n } else {\n value = scale.getBaseValue();\n }\n if (options.grid.circular) {\n center = scale.getPointPositionForValue(0, start);\n return new simpleArc({\n x: center.x,\n y: center.y,\n radius: scale.getDistanceFromCenterForValue(value)\n });\n }\n for (i = 0; i < length; ++i) {\n target.push(scale.getPointPositionForValue(i, value));\n }\n return target;\n}\nfunction computeBoundary(source) {\n const scale = source.scale || {};\n if (scale.getPointPositionForValue) {\n return computeCircularBoundary(source);\n }\n return computeLinearBoundary(source);\n}\nfunction findSegmentEnd(start, end, points) {\n for (;end > start; end--) {\n const point = points[end];\n if (!isNaN(point.x) && !isNaN(point.y)) {\n break;\n }\n }\n return end;\n}\nfunction pointsFromSegments(boundary, line) {\n const {x = null, y = null} = boundary || {};\n const linePoints = line.points;\n const points = [];\n line.segments.forEach(({start, end}) => {\n end = findSegmentEnd(start, end, linePoints);\n const first = linePoints[start];\n const last = linePoints[end];\n if (y !== null) {\n points.push({x: first.x, y});\n points.push({x: last.x, y});\n } else if (x !== null) {\n points.push({x, y: first.y});\n points.push({x, y: last.y});\n }\n });\n return points;\n}\nfunction buildStackLine(source) {\n const {chart, scale, index, line} = source;\n const points = [];\n const segments = line.segments;\n const sourcePoints = line.points;\n const linesBelow = getLinesBelow(chart, index);\n linesBelow.push(createBoundaryLine({x: null, y: scale.bottom}, line));\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n for (let j = segment.start; j <= segment.end; j++) {\n addPointsBelow(points, sourcePoints[j], linesBelow);\n }\n }\n return new LineElement({points, options: {}});\n}\nconst isLineAndNotInHideAnimation = (meta) => meta.type === 'line' && !meta.hidden;\nfunction getLinesBelow(chart, index) {\n const below = [];\n const metas = chart.getSortedVisibleDatasetMetas();\n for (let i = 0; i < metas.length; i++) {\n const meta = metas[i];\n if (meta.index === index) {\n break;\n }\n if (isLineAndNotInHideAnimation(meta)) {\n below.unshift(meta.dataset);\n }\n }\n return below;\n}\nfunction addPointsBelow(points, sourcePoint, linesBelow) {\n const postponed = [];\n for (let j = 0; j < linesBelow.length; j++) {\n const line = linesBelow[j];\n const {first, last, point} = findPoint(line, sourcePoint, 'x');\n if (!point || (first && last)) {\n continue;\n }\n if (first) {\n postponed.unshift(point);\n } else {\n points.push(point);\n if (!last) {\n break;\n }\n }\n }\n points.push(...postponed);\n}\nfunction findPoint(line, sourcePoint, property) {\n const point = line.interpolate(sourcePoint, property);\n if (!point) {\n return {};\n }\n const pointValue = point[property];\n const segments = line.segments;\n const linePoints = line.points;\n let first = false;\n let last = false;\n for (let i = 0; i < segments.length; i++) {\n const segment = segments[i];\n const firstValue = linePoints[segment.start][property];\n const lastValue = linePoints[segment.end][property];\n if (pointValue >= firstValue && pointValue <= lastValue) {\n first = pointValue === firstValue;\n last = pointValue === lastValue;\n break;\n }\n }\n return {first, last, point};\n}\nfunction getTarget(source) {\n const {chart, fill, line} = source;\n if (isNumberFinite(fill)) {\n return getLineByIndex(chart, fill);\n }\n if (fill === 'stack') {\n return buildStackLine(source);\n }\n if (fill === 'shape') {\n return true;\n }\n const boundary = computeBoundary(source);\n if (boundary instanceof simpleArc) {\n return boundary;\n }\n return createBoundaryLine(boundary, line);\n}\nfunction createBoundaryLine(boundary, line) {\n let points = [];\n let _loop = false;\n if (isArray(boundary)) {\n _loop = true;\n points = boundary;\n } else {\n points = pointsFromSegments(boundary, line);\n }\n return points.length ? new LineElement({\n points,\n options: {tension: 0},\n _loop,\n _fullLoop: _loop\n }) : null;\n}\nfunction resolveTarget(sources, index, propagate) {\n const source = sources[index];\n let fill = source.fill;\n const visited = [index];\n let target;\n if (!propagate) {\n return fill;\n }\n while (fill !== false && visited.indexOf(fill) === -1) {\n if (!isNumberFinite(fill)) {\n return fill;\n }\n target = sources[fill];\n if (!target) {\n return false;\n }\n if (target.visible) {\n return fill;\n }\n visited.push(fill);\n fill = target.fill;\n }\n return false;\n}\nfunction _clip(ctx, target, clipY) {\n ctx.beginPath();\n target.path(ctx);\n ctx.lineTo(target.last().x, clipY);\n ctx.lineTo(target.first().x, clipY);\n ctx.closePath();\n ctx.clip();\n}\nfunction getBounds(property, first, last, loop) {\n if (loop) {\n return;\n }\n let start = first[property];\n let end = last[property];\n if (property === 'angle') {\n start = _normalizeAngle(start);\n end = _normalizeAngle(end);\n }\n return {property, start, end};\n}\nfunction _getEdge(a, b, prop, fn) {\n if (a && b) {\n return fn(a[prop], b[prop]);\n }\n return a ? a[prop] : b ? b[prop] : 0;\n}\nfunction _segments(line, target, property) {\n const segments = line.segments;\n const points = line.points;\n const tpoints = target.points;\n const parts = [];\n for (const segment of segments) {\n let {start, end} = segment;\n end = findSegmentEnd(start, end, points);\n const bounds = getBounds(property, points[start], points[end], segment.loop);\n if (!target.segments) {\n parts.push({\n source: segment,\n target: bounds,\n start: points[start],\n end: points[end]\n });\n continue;\n }\n const targetSegments = _boundSegments(target, bounds);\n for (const tgt of targetSegments) {\n const subBounds = getBounds(property, tpoints[tgt.start], tpoints[tgt.end], tgt.loop);\n const fillSources = _boundSegment(segment, points, subBounds);\n for (const fillSource of fillSources) {\n parts.push({\n source: fillSource,\n target: tgt,\n start: {\n [property]: _getEdge(bounds, subBounds, 'start', Math.max)\n },\n end: {\n [property]: _getEdge(bounds, subBounds, 'end', Math.min)\n }\n });\n }\n }\n }\n return parts;\n}\nfunction clipBounds(ctx, scale, bounds) {\n const {top, bottom} = scale.chart.chartArea;\n const {property, start, end} = bounds || {};\n if (property === 'x') {\n ctx.beginPath();\n ctx.rect(start, top, end - start, bottom - top);\n ctx.clip();\n }\n}\nfunction interpolatedLineTo(ctx, target, point, property) {\n const interpolatedPoint = target.interpolate(point, property);\n if (interpolatedPoint) {\n ctx.lineTo(interpolatedPoint.x, interpolatedPoint.y);\n }\n}\nfunction _fill(ctx, cfg) {\n const {line, target, property, color, scale} = cfg;\n const segments = _segments(line, target, property);\n for (const {source: src, target: tgt, start, end} of segments) {\n const {style: {backgroundColor = color} = {}} = src;\n const notShape = target !== true;\n ctx.save();\n ctx.fillStyle = backgroundColor;\n clipBounds(ctx, scale, notShape && getBounds(property, start, end));\n ctx.beginPath();\n const lineLoop = !!line.pathSegment(ctx, src);\n let loop;\n if (notShape) {\n if (lineLoop) {\n ctx.closePath();\n } else {\n interpolatedLineTo(ctx, target, end, property);\n }\n const targetLoop = !!target.pathSegment(ctx, tgt, {move: lineLoop, reverse: true});\n loop = lineLoop && targetLoop;\n if (!loop) {\n interpolatedLineTo(ctx, target, start, property);\n }\n }\n ctx.closePath();\n ctx.fill(loop ? 'evenodd' : 'nonzero');\n ctx.restore();\n }\n}\nfunction doFill(ctx, cfg) {\n const {line, target, above, below, area, scale} = cfg;\n const property = line._loop ? 'angle' : cfg.axis;\n ctx.save();\n if (property === 'x' && below !== above) {\n _clip(ctx, target, area.top);\n _fill(ctx, {line, target, color: above, scale, property});\n ctx.restore();\n ctx.save();\n _clip(ctx, target, area.bottom);\n }\n _fill(ctx, {line, target, color: below, scale, property});\n ctx.restore();\n}\nfunction drawfill(ctx, source, area) {\n const target = getTarget(source);\n const {line, scale, axis} = source;\n const lineOpts = line.options;\n const fillOption = lineOpts.fill;\n const color = lineOpts.backgroundColor;\n const {above = color, below = color} = fillOption || {};\n if (target && line.points.length) {\n clipArea(ctx, area);\n doFill(ctx, {line, target, above, below, area, scale, axis});\n unclipArea(ctx);\n }\n}\nvar plugin_filler = {\n id: 'filler',\n afterDatasetsUpdate(chart, _args, options) {\n const count = (chart.data.datasets || []).length;\n const sources = [];\n let meta, i, line, source;\n for (i = 0; i < count; ++i) {\n meta = chart.getDatasetMeta(i);\n line = meta.dataset;\n source = null;\n if (line && line.options && line instanceof LineElement) {\n source = {\n visible: chart.isDatasetVisible(i),\n index: i,\n fill: decodeFill(line, i, count),\n chart,\n axis: meta.controller.options.indexAxis,\n scale: meta.vScale,\n line,\n };\n }\n meta.$filler = source;\n sources.push(source);\n }\n for (i = 0; i < count; ++i) {\n source = sources[i];\n if (!source || source.fill === false) {\n continue;\n }\n source.fill = resolveTarget(sources, i, options.propagate);\n }\n },\n beforeDraw(chart, _args, options) {\n const draw = options.drawTime === 'beforeDraw';\n const metasets = chart.getSortedVisibleDatasetMetas();\n const area = chart.chartArea;\n for (let i = metasets.length - 1; i >= 0; --i) {\n const source = metasets[i].$filler;\n if (!source) {\n continue;\n }\n source.line.updateControlPoints(area, source.axis);\n if (draw) {\n drawfill(chart.ctx, source, area);\n }\n }\n },\n beforeDatasetsDraw(chart, _args, options) {\n if (options.drawTime !== 'beforeDatasetsDraw') {\n return;\n }\n const metasets = chart.getSortedVisibleDatasetMetas();\n for (let i = metasets.length - 1; i >= 0; --i) {\n const source = metasets[i].$filler;\n if (source) {\n drawfill(chart.ctx, source, chart.chartArea);\n }\n }\n },\n beforeDatasetDraw(chart, args, options) {\n const source = args.meta.$filler;\n if (!source || source.fill === false || options.drawTime !== 'beforeDatasetDraw') {\n return;\n }\n drawfill(chart.ctx, source, chart.chartArea);\n },\n defaults: {\n propagate: true,\n drawTime: 'beforeDatasetDraw'\n }\n};\n\nconst getBoxSize = (labelOpts, fontSize) => {\n let {boxHeight = fontSize, boxWidth = fontSize} = labelOpts;\n if (labelOpts.usePointStyle) {\n boxHeight = Math.min(boxHeight, fontSize);\n boxWidth = Math.min(boxWidth, fontSize);\n }\n return {\n boxWidth,\n boxHeight,\n itemHeight: Math.max(fontSize, boxHeight)\n };\n};\nconst itemsEqual = (a, b) => a !== null && b !== null && a.datasetIndex === b.datasetIndex && a.index === b.index;\nclass Legend extends Element {\n constructor(config) {\n super();\n this._added = false;\n this.legendHitBoxes = [];\n this._hoveredItem = null;\n this.doughnutMode = false;\n this.chart = config.chart;\n this.options = config.options;\n this.ctx = config.ctx;\n this.legendItems = undefined;\n this.columnSizes = undefined;\n this.lineWidths = undefined;\n this.maxHeight = undefined;\n this.maxWidth = undefined;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.height = undefined;\n this.width = undefined;\n this._margins = undefined;\n this.position = undefined;\n this.weight = undefined;\n this.fullSize = undefined;\n }\n update(maxWidth, maxHeight, margins) {\n const me = this;\n me.maxWidth = maxWidth;\n me.maxHeight = maxHeight;\n me._margins = margins;\n me.setDimensions();\n me.buildLabels();\n me.fit();\n }\n setDimensions() {\n const me = this;\n if (me.isHorizontal()) {\n me.width = me.maxWidth;\n me.left = me._margins.left;\n me.right = me.width;\n } else {\n me.height = me.maxHeight;\n me.top = me._margins.top;\n me.bottom = me.height;\n }\n }\n buildLabels() {\n const me = this;\n const labelOpts = me.options.labels || {};\n let legendItems = callback(labelOpts.generateLabels, [me.chart], me) || [];\n if (labelOpts.filter) {\n legendItems = legendItems.filter((item) => labelOpts.filter(item, me.chart.data));\n }\n if (labelOpts.sort) {\n legendItems = legendItems.sort((a, b) => labelOpts.sort(a, b, me.chart.data));\n }\n if (me.options.reverse) {\n legendItems.reverse();\n }\n me.legendItems = legendItems;\n }\n fit() {\n const me = this;\n const {options, ctx} = me;\n if (!options.display) {\n me.width = me.height = 0;\n return;\n }\n const labelOpts = options.labels;\n const labelFont = toFont(labelOpts.font);\n const fontSize = labelFont.size;\n const titleHeight = me._computeTitleHeight();\n const {boxWidth, itemHeight} = getBoxSize(labelOpts, fontSize);\n let width, height;\n ctx.font = labelFont.string;\n if (me.isHorizontal()) {\n width = me.maxWidth;\n height = me._fitRows(titleHeight, fontSize, boxWidth, itemHeight) + 10;\n } else {\n height = me.maxHeight;\n width = me._fitCols(titleHeight, fontSize, boxWidth, itemHeight) + 10;\n }\n me.width = Math.min(width, options.maxWidth || me.maxWidth);\n me.height = Math.min(height, options.maxHeight || me.maxHeight);\n }\n _fitRows(titleHeight, fontSize, boxWidth, itemHeight) {\n const me = this;\n const {ctx, maxWidth, options: {labels: {padding}}} = me;\n const hitboxes = me.legendHitBoxes = [];\n const lineWidths = me.lineWidths = [0];\n const lineHeight = itemHeight + padding;\n let totalHeight = titleHeight;\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n let row = -1;\n let top = -lineHeight;\n me.legendItems.forEach((legendItem, i) => {\n const itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n if (i === 0 || lineWidths[lineWidths.length - 1] + itemWidth + 2 * padding > maxWidth) {\n totalHeight += lineHeight;\n lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = 0;\n top += lineHeight;\n row++;\n }\n hitboxes[i] = {left: 0, top, row, width: itemWidth, height: itemHeight};\n lineWidths[lineWidths.length - 1] += itemWidth + padding;\n });\n return totalHeight;\n }\n _fitCols(titleHeight, fontSize, boxWidth, itemHeight) {\n const me = this;\n const {ctx, maxHeight, options: {labels: {padding}}} = me;\n const hitboxes = me.legendHitBoxes = [];\n const columnSizes = me.columnSizes = [];\n const heightLimit = maxHeight - titleHeight;\n let totalWidth = padding;\n let currentColWidth = 0;\n let currentColHeight = 0;\n let left = 0;\n let col = 0;\n me.legendItems.forEach((legendItem, i) => {\n const itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n if (i > 0 && currentColHeight + itemHeight + 2 * padding > heightLimit) {\n totalWidth += currentColWidth + padding;\n columnSizes.push({width: currentColWidth, height: currentColHeight});\n left += currentColWidth + padding;\n col++;\n currentColWidth = currentColHeight = 0;\n }\n hitboxes[i] = {left, top: currentColHeight, col, width: itemWidth, height: itemHeight};\n currentColWidth = Math.max(currentColWidth, itemWidth);\n currentColHeight += itemHeight + padding;\n });\n totalWidth += currentColWidth;\n columnSizes.push({width: currentColWidth, height: currentColHeight});\n return totalWidth;\n }\n adjustHitBoxes() {\n const me = this;\n if (!me.options.display) {\n return;\n }\n const titleHeight = me._computeTitleHeight();\n const {legendHitBoxes: hitboxes, options: {align, labels: {padding}, rtl}} = me;\n const rtlHelper = getRtlAdapter(rtl, me.left, me.width);\n if (this.isHorizontal()) {\n let row = 0;\n let left = _alignStartEnd(align, me.left + padding, me.right - me.lineWidths[row]);\n for (const hitbox of hitboxes) {\n if (row !== hitbox.row) {\n row = hitbox.row;\n left = _alignStartEnd(align, me.left + padding, me.right - me.lineWidths[row]);\n }\n hitbox.top += me.top + titleHeight + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(left), hitbox.width);\n left += hitbox.width + padding;\n }\n } else {\n let col = 0;\n let top = _alignStartEnd(align, me.top + titleHeight + padding, me.bottom - me.columnSizes[col].height);\n for (const hitbox of hitboxes) {\n if (hitbox.col !== col) {\n col = hitbox.col;\n top = _alignStartEnd(align, me.top + titleHeight + padding, me.bottom - me.columnSizes[col].height);\n }\n hitbox.top = top;\n hitbox.left += me.left + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(hitbox.left), hitbox.width);\n top += hitbox.height + padding;\n }\n }\n }\n isHorizontal() {\n return this.options.position === 'top' || this.options.position === 'bottom';\n }\n draw() {\n const me = this;\n if (me.options.display) {\n const ctx = me.ctx;\n clipArea(ctx, me);\n me._draw();\n unclipArea(ctx);\n }\n }\n _draw() {\n const me = this;\n const {options: opts, columnSizes, lineWidths, ctx} = me;\n const {align, labels: labelOpts} = opts;\n const defaultColor = defaults.color;\n const rtlHelper = getRtlAdapter(opts.rtl, me.left, me.width);\n const labelFont = toFont(labelOpts.font);\n const {color: fontColor, padding} = labelOpts;\n const fontSize = labelFont.size;\n const halfFontSize = fontSize / 2;\n let cursor;\n me.drawTitle();\n ctx.textAlign = rtlHelper.textAlign('left');\n ctx.textBaseline = 'middle';\n ctx.lineWidth = 0.5;\n ctx.font = labelFont.string;\n const {boxWidth, boxHeight, itemHeight} = getBoxSize(labelOpts, fontSize);\n const drawLegendBox = function(x, y, legendItem) {\n if (isNaN(boxWidth) || boxWidth <= 0 || isNaN(boxHeight) || boxHeight < 0) {\n return;\n }\n ctx.save();\n const lineWidth = valueOrDefault(legendItem.lineWidth, 1);\n ctx.fillStyle = valueOrDefault(legendItem.fillStyle, defaultColor);\n ctx.lineCap = valueOrDefault(legendItem.lineCap, 'butt');\n ctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, 0);\n ctx.lineJoin = valueOrDefault(legendItem.lineJoin, 'miter');\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, defaultColor);\n ctx.setLineDash(valueOrDefault(legendItem.lineDash, []));\n if (labelOpts.usePointStyle) {\n const drawOptions = {\n radius: boxWidth * Math.SQRT2 / 2,\n pointStyle: legendItem.pointStyle,\n rotation: legendItem.rotation,\n borderWidth: lineWidth\n };\n const centerX = rtlHelper.xPlus(x, boxWidth / 2);\n const centerY = y + halfFontSize;\n drawPoint(ctx, drawOptions, centerX, centerY);\n } else {\n const yBoxTop = y + Math.max((fontSize - boxHeight) / 2, 0);\n const xBoxLeft = rtlHelper.leftForLtr(x, boxWidth);\n const borderRadius = toTRBLCorners(legendItem.borderRadius);\n ctx.beginPath();\n if (Object.values(borderRadius).some(v => v !== 0)) {\n addRoundedRectPath(ctx, {\n x: xBoxLeft,\n y: yBoxTop,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius,\n });\n } else {\n ctx.rect(xBoxLeft, yBoxTop, boxWidth, boxHeight);\n }\n ctx.fill();\n if (lineWidth !== 0) {\n ctx.stroke();\n }\n }\n ctx.restore();\n };\n const fillText = function(x, y, legendItem) {\n renderText(ctx, legendItem.text, x, y + (itemHeight / 2), labelFont, {\n strikethrough: legendItem.hidden,\n textAlign: rtlHelper.textAlign(legendItem.textAlign)\n });\n };\n const isHorizontal = me.isHorizontal();\n const titleHeight = this._computeTitleHeight();\n if (isHorizontal) {\n cursor = {\n x: _alignStartEnd(align, me.left + padding, me.right - lineWidths[0]),\n y: me.top + padding + titleHeight,\n line: 0\n };\n } else {\n cursor = {\n x: me.left + padding,\n y: _alignStartEnd(align, me.top + titleHeight + padding, me.bottom - columnSizes[0].height),\n line: 0\n };\n }\n overrideTextDirection(me.ctx, opts.textDirection);\n const lineHeight = itemHeight + padding;\n me.legendItems.forEach((legendItem, i) => {\n ctx.strokeStyle = legendItem.fontColor || fontColor;\n ctx.fillStyle = legendItem.fontColor || fontColor;\n const textWidth = ctx.measureText(legendItem.text).width;\n const textAlign = rtlHelper.textAlign(legendItem.textAlign || (legendItem.textAlign = labelOpts.textAlign));\n const width = boxWidth + halfFontSize + textWidth;\n let x = cursor.x;\n let y = cursor.y;\n rtlHelper.setWidth(me.width);\n if (isHorizontal) {\n if (i > 0 && x + width + padding > me.right) {\n y = cursor.y += lineHeight;\n cursor.line++;\n x = cursor.x = _alignStartEnd(align, me.left + padding, me.right - lineWidths[cursor.line]);\n }\n } else if (i > 0 && y + lineHeight > me.bottom) {\n x = cursor.x = x + columnSizes[cursor.line].width + padding;\n cursor.line++;\n y = cursor.y = _alignStartEnd(align, me.top + titleHeight + padding, me.bottom - columnSizes[cursor.line].height);\n }\n const realX = rtlHelper.x(x);\n drawLegendBox(realX, y, legendItem);\n x = _textX(textAlign, x + boxWidth + halfFontSize, isHorizontal ? x + width : me.right, opts.rtl);\n fillText(rtlHelper.x(x), y, legendItem);\n if (isHorizontal) {\n cursor.x += width + padding;\n } else {\n cursor.y += lineHeight;\n }\n });\n restoreTextDirection(me.ctx, opts.textDirection);\n }\n drawTitle() {\n const me = this;\n const opts = me.options;\n const titleOpts = opts.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n if (!titleOpts.display) {\n return;\n }\n const rtlHelper = getRtlAdapter(opts.rtl, me.left, me.width);\n const ctx = me.ctx;\n const position = titleOpts.position;\n const halfFontSize = titleFont.size / 2;\n const topPaddingPlusHalfFontSize = titlePadding.top + halfFontSize;\n let y;\n let left = me.left;\n let maxWidth = me.width;\n if (this.isHorizontal()) {\n maxWidth = Math.max(...me.lineWidths);\n y = me.top + topPaddingPlusHalfFontSize;\n left = _alignStartEnd(opts.align, left, me.right - maxWidth);\n } else {\n const maxHeight = me.columnSizes.reduce((acc, size) => Math.max(acc, size.height), 0);\n y = topPaddingPlusHalfFontSize + _alignStartEnd(opts.align, me.top, me.bottom - maxHeight - opts.labels.padding - me._computeTitleHeight());\n }\n const x = _alignStartEnd(position, left, left + maxWidth);\n ctx.textAlign = rtlHelper.textAlign(_toLeftRightCenter(position));\n ctx.textBaseline = 'middle';\n ctx.strokeStyle = titleOpts.color;\n ctx.fillStyle = titleOpts.color;\n ctx.font = titleFont.string;\n renderText(ctx, titleOpts.text, x, y, titleFont);\n }\n _computeTitleHeight() {\n const titleOpts = this.options.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n return titleOpts.display ? titleFont.lineHeight + titlePadding.height : 0;\n }\n _getLegendItemAt(x, y) {\n const me = this;\n let i, hitBox, lh;\n if (x >= me.left && x <= me.right && y >= me.top && y <= me.bottom) {\n lh = me.legendHitBoxes;\n for (i = 0; i < lh.length; ++i) {\n hitBox = lh[i];\n if (x >= hitBox.left && x <= hitBox.left + hitBox.width && y >= hitBox.top && y <= hitBox.top + hitBox.height) {\n return me.legendItems[i];\n }\n }\n }\n return null;\n }\n handleEvent(e) {\n const me = this;\n const opts = me.options;\n if (!isListened(e.type, opts)) {\n return;\n }\n const hoveredItem = me._getLegendItemAt(e.x, e.y);\n if (e.type === 'mousemove') {\n const previous = me._hoveredItem;\n const sameItem = itemsEqual(previous, hoveredItem);\n if (previous && !sameItem) {\n callback(opts.onLeave, [e, previous, me], me);\n }\n me._hoveredItem = hoveredItem;\n if (hoveredItem && !sameItem) {\n callback(opts.onHover, [e, hoveredItem, me], me);\n }\n } else if (hoveredItem) {\n callback(opts.onClick, [e, hoveredItem, me], me);\n }\n }\n}\nfunction isListened(type, opts) {\n if (type === 'mousemove' && (opts.onHover || opts.onLeave)) {\n return true;\n }\n if (opts.onClick && (type === 'click' || type === 'mouseup')) {\n return true;\n }\n return false;\n}\nvar plugin_legend = {\n id: 'legend',\n _element: Legend,\n start(chart, _args, options) {\n const legend = chart.legend = new Legend({ctx: chart.ctx, options, chart});\n layouts.configure(chart, legend, options);\n layouts.addBox(chart, legend);\n },\n stop(chart) {\n layouts.removeBox(chart, chart.legend);\n delete chart.legend;\n },\n beforeUpdate(chart, _args, options) {\n const legend = chart.legend;\n layouts.configure(chart, legend, options);\n legend.options = options;\n },\n afterUpdate(chart) {\n const legend = chart.legend;\n legend.buildLabels();\n legend.adjustHitBoxes();\n },\n afterEvent(chart, args) {\n if (!args.replay) {\n chart.legend.handleEvent(args.event);\n }\n },\n defaults: {\n display: true,\n position: 'top',\n align: 'center',\n fullSize: true,\n reverse: false,\n weight: 1000,\n onClick(e, legendItem, legend) {\n const index = legendItem.datasetIndex;\n const ci = legend.chart;\n if (ci.isDatasetVisible(index)) {\n ci.hide(index);\n legendItem.hidden = true;\n } else {\n ci.show(index);\n legendItem.hidden = false;\n }\n },\n onHover: null,\n onLeave: null,\n labels: {\n color: (ctx) => ctx.chart.options.color,\n boxWidth: 40,\n padding: 10,\n generateLabels(chart) {\n const datasets = chart.data.datasets;\n const {labels: {usePointStyle, pointStyle, textAlign, color}} = chart.legend.options;\n return chart._getSortedDatasetMetas().map((meta) => {\n const style = meta.controller.getStyle(usePointStyle ? 0 : undefined);\n const borderWidth = toPadding(style.borderWidth);\n return {\n text: datasets[meta.index].label,\n fillStyle: style.backgroundColor,\n fontColor: color,\n hidden: !meta.visible,\n lineCap: style.borderCapStyle,\n lineDash: style.borderDash,\n lineDashOffset: style.borderDashOffset,\n lineJoin: style.borderJoinStyle,\n lineWidth: (borderWidth.width + borderWidth.height) / 4,\n strokeStyle: style.borderColor,\n pointStyle: pointStyle || style.pointStyle,\n rotation: style.rotation,\n textAlign: textAlign || style.textAlign,\n borderRadius: 0,\n datasetIndex: meta.index\n };\n }, this);\n }\n },\n title: {\n color: (ctx) => ctx.chart.options.color,\n display: false,\n position: 'center',\n text: '',\n }\n },\n descriptors: {\n _scriptable: (name) => !name.startsWith('on'),\n labels: {\n _scriptable: (name) => !['generateLabels', 'filter', 'sort'].includes(name),\n }\n },\n};\n\nclass Title extends Element {\n constructor(config) {\n super();\n this.chart = config.chart;\n this.options = config.options;\n this.ctx = config.ctx;\n this._padding = undefined;\n this.top = undefined;\n this.bottom = undefined;\n this.left = undefined;\n this.right = undefined;\n this.width = undefined;\n this.height = undefined;\n this.position = undefined;\n this.weight = undefined;\n this.fullSize = undefined;\n }\n update(maxWidth, maxHeight) {\n const me = this;\n const opts = me.options;\n me.left = 0;\n me.top = 0;\n if (!opts.display) {\n me.width = me.height = me.right = me.bottom = 0;\n return;\n }\n me.width = me.right = maxWidth;\n me.height = me.bottom = maxHeight;\n const lineCount = isArray(opts.text) ? opts.text.length : 1;\n me._padding = toPadding(opts.padding);\n const textSize = lineCount * toFont(opts.font).lineHeight + me._padding.height;\n if (me.isHorizontal()) {\n me.height = textSize;\n } else {\n me.width = textSize;\n }\n }\n isHorizontal() {\n const pos = this.options.position;\n return pos === 'top' || pos === 'bottom';\n }\n _drawArgs(offset) {\n const {top, left, bottom, right, options} = this;\n const align = options.align;\n let rotation = 0;\n let maxWidth, titleX, titleY;\n if (this.isHorizontal()) {\n titleX = _alignStartEnd(align, left, right);\n titleY = top + offset;\n maxWidth = right - left;\n } else {\n if (options.position === 'left') {\n titleX = left + offset;\n titleY = _alignStartEnd(align, bottom, top);\n rotation = PI * -0.5;\n } else {\n titleX = right - offset;\n titleY = _alignStartEnd(align, top, bottom);\n rotation = PI * 0.5;\n }\n maxWidth = bottom - top;\n }\n return {titleX, titleY, maxWidth, rotation};\n }\n draw() {\n const me = this;\n const ctx = me.ctx;\n const opts = me.options;\n if (!opts.display) {\n return;\n }\n const fontOpts = toFont(opts.font);\n const lineHeight = fontOpts.lineHeight;\n const offset = lineHeight / 2 + me._padding.top;\n const {titleX, titleY, maxWidth, rotation} = me._drawArgs(offset);\n renderText(ctx, opts.text, 0, 0, fontOpts, {\n color: opts.color,\n maxWidth,\n rotation,\n textAlign: _toLeftRightCenter(opts.align),\n textBaseline: 'middle',\n translation: [titleX, titleY],\n });\n }\n}\nfunction createTitle(chart, titleOpts) {\n const title = new Title({\n ctx: chart.ctx,\n options: titleOpts,\n chart\n });\n layouts.configure(chart, title, titleOpts);\n layouts.addBox(chart, title);\n chart.titleBlock = title;\n}\nvar plugin_title = {\n id: 'title',\n _element: Title,\n start(chart, _args, options) {\n createTitle(chart, options);\n },\n stop(chart) {\n const titleBlock = chart.titleBlock;\n layouts.removeBox(chart, titleBlock);\n delete chart.titleBlock;\n },\n beforeUpdate(chart, _args, options) {\n const title = chart.titleBlock;\n layouts.configure(chart, title, options);\n title.options = options;\n },\n defaults: {\n align: 'center',\n display: false,\n font: {\n weight: 'bold',\n },\n fullSize: true,\n padding: 10,\n position: 'top',\n text: '',\n weight: 2000\n },\n defaultRoutes: {\n color: 'color'\n },\n descriptors: {\n _scriptable: true,\n _indexable: false,\n },\n};\n\nconst map = new WeakMap();\nvar plugin_subtitle = {\n id: 'subtitle',\n start(chart, _args, options) {\n const title = new Title({\n ctx: chart.ctx,\n options,\n chart\n });\n layouts.configure(chart, title, options);\n layouts.addBox(chart, title);\n map.set(chart, title);\n },\n stop(chart) {\n layouts.removeBox(chart, map.get(chart));\n map.delete(chart);\n },\n beforeUpdate(chart, _args, options) {\n const title = map.get(chart);\n layouts.configure(chart, title, options);\n title.options = options;\n },\n defaults: {\n align: 'center',\n display: false,\n font: {\n weight: 'normal',\n },\n fullSize: true,\n padding: 0,\n position: 'top',\n text: '',\n weight: 1500\n },\n defaultRoutes: {\n color: 'color'\n },\n descriptors: {\n _scriptable: true,\n _indexable: false,\n },\n};\n\nconst positioners = {\n average(items) {\n if (!items.length) {\n return false;\n }\n let i, len;\n let x = 0;\n let y = 0;\n let count = 0;\n for (i = 0, len = items.length; i < len; ++i) {\n const el = items[i].element;\n if (el && el.hasValue()) {\n const pos = el.tooltipPosition();\n x += pos.x;\n y += pos.y;\n ++count;\n }\n }\n return {\n x: x / count,\n y: y / count\n };\n },\n nearest(items, eventPosition) {\n if (!items.length) {\n return false;\n }\n let x = eventPosition.x;\n let y = eventPosition.y;\n let minDistance = Number.POSITIVE_INFINITY;\n let i, len, nearestElement;\n for (i = 0, len = items.length; i < len; ++i) {\n const el = items[i].element;\n if (el && el.hasValue()) {\n const center = el.getCenterPoint();\n const d = distanceBetweenPoints(eventPosition, center);\n if (d < minDistance) {\n minDistance = d;\n nearestElement = el;\n }\n }\n }\n if (nearestElement) {\n const tp = nearestElement.tooltipPosition();\n x = tp.x;\n y = tp.y;\n }\n return {\n x,\n y\n };\n }\n};\nfunction pushOrConcat(base, toPush) {\n if (toPush) {\n if (isArray(toPush)) {\n Array.prototype.push.apply(base, toPush);\n } else {\n base.push(toPush);\n }\n }\n return base;\n}\nfunction splitNewlines(str) {\n if ((typeof str === 'string' || str instanceof String) && str.indexOf('\\n') > -1) {\n return str.split('\\n');\n }\n return str;\n}\nfunction createTooltipItem(chart, item) {\n const {element, datasetIndex, index} = item;\n const controller = chart.getDatasetMeta(datasetIndex).controller;\n const {label, value} = controller.getLabelAndValue(index);\n return {\n chart,\n label,\n parsed: controller.getParsed(index),\n raw: chart.data.datasets[datasetIndex].data[index],\n formattedValue: value,\n dataset: controller.getDataset(),\n dataIndex: index,\n datasetIndex,\n element\n };\n}\nfunction getTooltipSize(tooltip, options) {\n const ctx = tooltip._chart.ctx;\n const {body, footer, title} = tooltip;\n const {boxWidth, boxHeight} = options;\n const bodyFont = toFont(options.bodyFont);\n const titleFont = toFont(options.titleFont);\n const footerFont = toFont(options.footerFont);\n const titleLineCount = title.length;\n const footerLineCount = footer.length;\n const bodyLineItemCount = body.length;\n const padding = toPadding(options.padding);\n let height = padding.height;\n let width = 0;\n let combinedBodyLength = body.reduce((count, bodyItem) => count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length, 0);\n combinedBodyLength += tooltip.beforeBody.length + tooltip.afterBody.length;\n if (titleLineCount) {\n height += titleLineCount * titleFont.lineHeight\n\t\t\t+ (titleLineCount - 1) * options.titleSpacing\n\t\t\t+ options.titleMarginBottom;\n }\n if (combinedBodyLength) {\n const bodyLineHeight = options.displayColors ? Math.max(boxHeight, bodyFont.lineHeight) : bodyFont.lineHeight;\n height += bodyLineItemCount * bodyLineHeight\n\t\t\t+ (combinedBodyLength - bodyLineItemCount) * bodyFont.lineHeight\n\t\t\t+ (combinedBodyLength - 1) * options.bodySpacing;\n }\n if (footerLineCount) {\n height += options.footerMarginTop\n\t\t\t+ footerLineCount * footerFont.lineHeight\n\t\t\t+ (footerLineCount - 1) * options.footerSpacing;\n }\n let widthPadding = 0;\n const maxLineWidth = function(line) {\n width = Math.max(width, ctx.measureText(line).width + widthPadding);\n };\n ctx.save();\n ctx.font = titleFont.string;\n each(tooltip.title, maxLineWidth);\n ctx.font = bodyFont.string;\n each(tooltip.beforeBody.concat(tooltip.afterBody), maxLineWidth);\n widthPadding = options.displayColors ? (boxWidth + 2) : 0;\n each(body, (bodyItem) => {\n each(bodyItem.before, maxLineWidth);\n each(bodyItem.lines, maxLineWidth);\n each(bodyItem.after, maxLineWidth);\n });\n widthPadding = 0;\n ctx.font = footerFont.string;\n each(tooltip.footer, maxLineWidth);\n ctx.restore();\n width += padding.width;\n return {width, height};\n}\nfunction determineYAlign(chart, size) {\n const {y, height} = size;\n if (y < height / 2) {\n return 'top';\n } else if (y > (chart.height - height / 2)) {\n return 'bottom';\n }\n return 'center';\n}\nfunction doesNotFitWithAlign(xAlign, chart, options, size) {\n const {x, width} = size;\n const caret = options.caretSize + options.caretPadding;\n if (xAlign === 'left' && x + width + caret > chart.width) {\n return true;\n }\n if (xAlign === 'right' && x - width - caret < 0) {\n return true;\n }\n}\nfunction determineXAlign(chart, options, size, yAlign) {\n const {x, width} = size;\n const {width: chartWidth, chartArea: {left, right}} = chart;\n let xAlign = 'center';\n if (yAlign === 'center') {\n xAlign = x <= (left + right) / 2 ? 'left' : 'right';\n } else if (x <= width / 2) {\n xAlign = 'left';\n } else if (x >= chartWidth - width / 2) {\n xAlign = 'right';\n }\n if (doesNotFitWithAlign(xAlign, chart, options, size)) {\n xAlign = 'center';\n }\n return xAlign;\n}\nfunction determineAlignment(chart, options, size) {\n const yAlign = options.yAlign || determineYAlign(chart, size);\n return {\n xAlign: options.xAlign || determineXAlign(chart, options, size, yAlign),\n yAlign\n };\n}\nfunction alignX(size, xAlign) {\n let {x, width} = size;\n if (xAlign === 'right') {\n x -= width;\n } else if (xAlign === 'center') {\n x -= (width / 2);\n }\n return x;\n}\nfunction alignY(size, yAlign, paddingAndSize) {\n let {y, height} = size;\n if (yAlign === 'top') {\n y += paddingAndSize;\n } else if (yAlign === 'bottom') {\n y -= height + paddingAndSize;\n } else {\n y -= (height / 2);\n }\n return y;\n}\nfunction getBackgroundPoint(options, size, alignment, chart) {\n const {caretSize, caretPadding, cornerRadius} = options;\n const {xAlign, yAlign} = alignment;\n const paddingAndSize = caretSize + caretPadding;\n const radiusAndPadding = cornerRadius + caretPadding;\n let x = alignX(size, xAlign);\n const y = alignY(size, yAlign, paddingAndSize);\n if (yAlign === 'center') {\n if (xAlign === 'left') {\n x += paddingAndSize;\n } else if (xAlign === 'right') {\n x -= paddingAndSize;\n }\n } else if (xAlign === 'left') {\n x -= radiusAndPadding;\n } else if (xAlign === 'right') {\n x += radiusAndPadding;\n }\n return {\n x: _limitValue(x, 0, chart.width - size.width),\n y: _limitValue(y, 0, chart.height - size.height)\n };\n}\nfunction getAlignedX(tooltip, align, options) {\n const padding = toPadding(options.padding);\n return align === 'center'\n ? tooltip.x + tooltip.width / 2\n : align === 'right'\n ? tooltip.x + tooltip.width - padding.right\n : tooltip.x + padding.left;\n}\nfunction getBeforeAfterBodyLines(callback) {\n return pushOrConcat([], splitNewlines(callback));\n}\nfunction createTooltipContext(parent, tooltip, tooltipItems) {\n return Object.assign(Object.create(parent), {\n tooltip,\n tooltipItems,\n type: 'tooltip'\n });\n}\nfunction overrideCallbacks(callbacks, context) {\n const override = context && context.dataset && context.dataset.tooltip && context.dataset.tooltip.callbacks;\n return override ? callbacks.override(override) : callbacks;\n}\nclass Tooltip extends Element {\n constructor(config) {\n super();\n this.opacity = 0;\n this._active = [];\n this._chart = config._chart;\n this._eventPosition = undefined;\n this._size = undefined;\n this._cachedAnimations = undefined;\n this._tooltipItems = [];\n this.$animations = undefined;\n this.$context = undefined;\n this.options = config.options;\n this.dataPoints = undefined;\n this.title = undefined;\n this.beforeBody = undefined;\n this.body = undefined;\n this.afterBody = undefined;\n this.footer = undefined;\n this.xAlign = undefined;\n this.yAlign = undefined;\n this.x = undefined;\n this.y = undefined;\n this.height = undefined;\n this.width = undefined;\n this.caretX = undefined;\n this.caretY = undefined;\n this.labelColors = undefined;\n this.labelPointStyles = undefined;\n this.labelTextColors = undefined;\n }\n initialize(options) {\n this.options = options;\n this._cachedAnimations = undefined;\n this.$context = undefined;\n }\n _resolveAnimations() {\n const me = this;\n const cached = me._cachedAnimations;\n if (cached) {\n return cached;\n }\n const chart = me._chart;\n const options = me.options.setContext(me.getContext());\n const opts = options.enabled && chart.options.animation && options.animations;\n const animations = new Animations(me._chart, opts);\n if (opts._cacheable) {\n me._cachedAnimations = Object.freeze(animations);\n }\n return animations;\n }\n getContext() {\n const me = this;\n return me.$context ||\n\t\t\t(me.$context = createTooltipContext(me._chart.getContext(), me, me._tooltipItems));\n }\n getTitle(context, options) {\n const me = this;\n const {callbacks} = options;\n const beforeTitle = callbacks.beforeTitle.apply(me, [context]);\n const title = callbacks.title.apply(me, [context]);\n const afterTitle = callbacks.afterTitle.apply(me, [context]);\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeTitle));\n lines = pushOrConcat(lines, splitNewlines(title));\n lines = pushOrConcat(lines, splitNewlines(afterTitle));\n return lines;\n }\n getBeforeBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(options.callbacks.beforeBody.apply(this, [tooltipItems]));\n }\n getBody(tooltipItems, options) {\n const me = this;\n const {callbacks} = options;\n const bodyItems = [];\n each(tooltipItems, (context) => {\n const bodyItem = {\n before: [],\n lines: [],\n after: []\n };\n const scoped = overrideCallbacks(callbacks, context);\n pushOrConcat(bodyItem.before, splitNewlines(scoped.beforeLabel.call(me, context)));\n pushOrConcat(bodyItem.lines, scoped.label.call(me, context));\n pushOrConcat(bodyItem.after, splitNewlines(scoped.afterLabel.call(me, context)));\n bodyItems.push(bodyItem);\n });\n return bodyItems;\n }\n getAfterBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(options.callbacks.afterBody.apply(this, [tooltipItems]));\n }\n getFooter(tooltipItems, options) {\n const me = this;\n const {callbacks} = options;\n const beforeFooter = callbacks.beforeFooter.apply(me, [tooltipItems]);\n const footer = callbacks.footer.apply(me, [tooltipItems]);\n const afterFooter = callbacks.afterFooter.apply(me, [tooltipItems]);\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeFooter));\n lines = pushOrConcat(lines, splitNewlines(footer));\n lines = pushOrConcat(lines, splitNewlines(afterFooter));\n return lines;\n }\n _createItems(options) {\n const me = this;\n const active = me._active;\n const data = me._chart.data;\n const labelColors = [];\n const labelPointStyles = [];\n const labelTextColors = [];\n let tooltipItems = [];\n let i, len;\n for (i = 0, len = active.length; i < len; ++i) {\n tooltipItems.push(createTooltipItem(me._chart, active[i]));\n }\n if (options.filter) {\n tooltipItems = tooltipItems.filter((element, index, array) => options.filter(element, index, array, data));\n }\n if (options.itemSort) {\n tooltipItems = tooltipItems.sort((a, b) => options.itemSort(a, b, data));\n }\n each(tooltipItems, (context) => {\n const scoped = overrideCallbacks(options.callbacks, context);\n labelColors.push(scoped.labelColor.call(me, context));\n labelPointStyles.push(scoped.labelPointStyle.call(me, context));\n labelTextColors.push(scoped.labelTextColor.call(me, context));\n });\n me.labelColors = labelColors;\n me.labelPointStyles = labelPointStyles;\n me.labelTextColors = labelTextColors;\n me.dataPoints = tooltipItems;\n return tooltipItems;\n }\n update(changed, replay) {\n const me = this;\n const options = me.options.setContext(me.getContext());\n const active = me._active;\n let properties;\n let tooltipItems = [];\n if (!active.length) {\n if (me.opacity !== 0) {\n properties = {\n opacity: 0\n };\n }\n } else {\n const position = positioners[options.position].call(me, active, me._eventPosition);\n tooltipItems = me._createItems(options);\n me.title = me.getTitle(tooltipItems, options);\n me.beforeBody = me.getBeforeBody(tooltipItems, options);\n me.body = me.getBody(tooltipItems, options);\n me.afterBody = me.getAfterBody(tooltipItems, options);\n me.footer = me.getFooter(tooltipItems, options);\n const size = me._size = getTooltipSize(me, options);\n const positionAndSize = Object.assign({}, position, size);\n const alignment = determineAlignment(me._chart, options, positionAndSize);\n const backgroundPoint = getBackgroundPoint(options, positionAndSize, alignment, me._chart);\n me.xAlign = alignment.xAlign;\n me.yAlign = alignment.yAlign;\n properties = {\n opacity: 1,\n x: backgroundPoint.x,\n y: backgroundPoint.y,\n width: size.width,\n height: size.height,\n caretX: position.x,\n caretY: position.y\n };\n }\n me._tooltipItems = tooltipItems;\n me.$context = undefined;\n if (properties) {\n me._resolveAnimations().update(me, properties);\n }\n if (changed && options.external) {\n options.external.call(me, {chart: me._chart, tooltip: me, replay});\n }\n }\n drawCaret(tooltipPoint, ctx, size, options) {\n const caretPosition = this.getCaretPosition(tooltipPoint, size, options);\n ctx.lineTo(caretPosition.x1, caretPosition.y1);\n ctx.lineTo(caretPosition.x2, caretPosition.y2);\n ctx.lineTo(caretPosition.x3, caretPosition.y3);\n }\n getCaretPosition(tooltipPoint, size, options) {\n const {xAlign, yAlign} = this;\n const {cornerRadius, caretSize} = options;\n const {x: ptX, y: ptY} = tooltipPoint;\n const {width, height} = size;\n let x1, x2, x3, y1, y2, y3;\n if (yAlign === 'center') {\n y2 = ptY + (height / 2);\n if (xAlign === 'left') {\n x1 = ptX;\n x2 = x1 - caretSize;\n y1 = y2 + caretSize;\n y3 = y2 - caretSize;\n } else {\n x1 = ptX + width;\n x2 = x1 + caretSize;\n y1 = y2 - caretSize;\n y3 = y2 + caretSize;\n }\n x3 = x1;\n } else {\n if (xAlign === 'left') {\n x2 = ptX + cornerRadius + (caretSize);\n } else if (xAlign === 'right') {\n x2 = ptX + width - cornerRadius - caretSize;\n } else {\n x2 = this.caretX;\n }\n if (yAlign === 'top') {\n y1 = ptY;\n y2 = y1 - caretSize;\n x1 = x2 - caretSize;\n x3 = x2 + caretSize;\n } else {\n y1 = ptY + height;\n y2 = y1 + caretSize;\n x1 = x2 + caretSize;\n x3 = x2 - caretSize;\n }\n y3 = y1;\n }\n return {x1, x2, x3, y1, y2, y3};\n }\n drawTitle(pt, ctx, options) {\n const me = this;\n const title = me.title;\n const length = title.length;\n let titleFont, titleSpacing, i;\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, me.x, me.width);\n pt.x = getAlignedX(me, options.titleAlign, options);\n ctx.textAlign = rtlHelper.textAlign(options.titleAlign);\n ctx.textBaseline = 'middle';\n titleFont = toFont(options.titleFont);\n titleSpacing = options.titleSpacing;\n ctx.fillStyle = options.titleColor;\n ctx.font = titleFont.string;\n for (i = 0; i < length; ++i) {\n ctx.fillText(title[i], rtlHelper.x(pt.x), pt.y + titleFont.lineHeight / 2);\n pt.y += titleFont.lineHeight + titleSpacing;\n if (i + 1 === length) {\n pt.y += options.titleMarginBottom - titleSpacing;\n }\n }\n }\n }\n _drawColorBox(ctx, pt, i, rtlHelper, options) {\n const me = this;\n const labelColors = me.labelColors[i];\n const labelPointStyle = me.labelPointStyles[i];\n const {boxHeight, boxWidth} = options;\n const bodyFont = toFont(options.bodyFont);\n const colorX = getAlignedX(me, 'left', options);\n const rtlColorX = rtlHelper.x(colorX);\n const yOffSet = boxHeight < bodyFont.lineHeight ? (bodyFont.lineHeight - boxHeight) / 2 : 0;\n const colorY = pt.y + yOffSet;\n if (options.usePointStyle) {\n const drawOptions = {\n radius: Math.min(boxWidth, boxHeight) / 2,\n pointStyle: labelPointStyle.pointStyle,\n rotation: labelPointStyle.rotation,\n borderWidth: 1\n };\n const centerX = rtlHelper.leftForLtr(rtlColorX, boxWidth) + boxWidth / 2;\n const centerY = colorY + boxHeight / 2;\n ctx.strokeStyle = options.multiKeyBackground;\n ctx.fillStyle = options.multiKeyBackground;\n drawPoint(ctx, drawOptions, centerX, centerY);\n ctx.strokeStyle = labelColors.borderColor;\n ctx.fillStyle = labelColors.backgroundColor;\n drawPoint(ctx, drawOptions, centerX, centerY);\n } else {\n ctx.lineWidth = labelColors.borderWidth || 1;\n ctx.strokeStyle = labelColors.borderColor;\n ctx.setLineDash(labelColors.borderDash || []);\n ctx.lineDashOffset = labelColors.borderDashOffset || 0;\n const outerX = rtlHelper.leftForLtr(rtlColorX, boxWidth);\n const innerX = rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), boxWidth - 2);\n const borderRadius = toTRBLCorners(labelColors.borderRadius);\n if (Object.values(borderRadius).some(v => v !== 0)) {\n ctx.beginPath();\n ctx.fillStyle = options.multiKeyBackground;\n addRoundedRectPath(ctx, {\n x: outerX,\n y: colorY,\n w: boxWidth,\n h: boxHeight,\n radius: borderRadius,\n });\n ctx.fill();\n ctx.stroke();\n ctx.fillStyle = labelColors.backgroundColor;\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: innerX,\n y: colorY + 1,\n w: boxWidth - 2,\n h: boxHeight - 2,\n radius: borderRadius,\n });\n ctx.fill();\n } else {\n ctx.fillStyle = options.multiKeyBackground;\n ctx.fillRect(outerX, colorY, boxWidth, boxHeight);\n ctx.strokeRect(outerX, colorY, boxWidth, boxHeight);\n ctx.fillStyle = labelColors.backgroundColor;\n ctx.fillRect(innerX, colorY + 1, boxWidth - 2, boxHeight - 2);\n }\n }\n ctx.fillStyle = me.labelTextColors[i];\n }\n drawBody(pt, ctx, options) {\n const me = this;\n const {body} = me;\n const {bodySpacing, bodyAlign, displayColors, boxHeight, boxWidth} = options;\n const bodyFont = toFont(options.bodyFont);\n let bodyLineHeight = bodyFont.lineHeight;\n let xLinePadding = 0;\n const rtlHelper = getRtlAdapter(options.rtl, me.x, me.width);\n const fillLineOfText = function(line) {\n ctx.fillText(line, rtlHelper.x(pt.x + xLinePadding), pt.y + bodyLineHeight / 2);\n pt.y += bodyLineHeight + bodySpacing;\n };\n const bodyAlignForCalculation = rtlHelper.textAlign(bodyAlign);\n let bodyItem, textColor, lines, i, j, ilen, jlen;\n ctx.textAlign = bodyAlign;\n ctx.textBaseline = 'middle';\n ctx.font = bodyFont.string;\n pt.x = getAlignedX(me, bodyAlignForCalculation, options);\n ctx.fillStyle = options.bodyColor;\n each(me.beforeBody, fillLineOfText);\n xLinePadding = displayColors && bodyAlignForCalculation !== 'right'\n ? bodyAlign === 'center' ? (boxWidth / 2 + 1) : (boxWidth + 2)\n : 0;\n for (i = 0, ilen = body.length; i < ilen; ++i) {\n bodyItem = body[i];\n textColor = me.labelTextColors[i];\n ctx.fillStyle = textColor;\n each(bodyItem.before, fillLineOfText);\n lines = bodyItem.lines;\n if (displayColors && lines.length) {\n me._drawColorBox(ctx, pt, i, rtlHelper, options);\n bodyLineHeight = Math.max(bodyFont.lineHeight, boxHeight);\n }\n for (j = 0, jlen = lines.length; j < jlen; ++j) {\n fillLineOfText(lines[j]);\n bodyLineHeight = bodyFont.lineHeight;\n }\n each(bodyItem.after, fillLineOfText);\n }\n xLinePadding = 0;\n bodyLineHeight = bodyFont.lineHeight;\n each(me.afterBody, fillLineOfText);\n pt.y -= bodySpacing;\n }\n drawFooter(pt, ctx, options) {\n const me = this;\n const footer = me.footer;\n const length = footer.length;\n let footerFont, i;\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, me.x, me.width);\n pt.x = getAlignedX(me, options.footerAlign, options);\n pt.y += options.footerMarginTop;\n ctx.textAlign = rtlHelper.textAlign(options.footerAlign);\n ctx.textBaseline = 'middle';\n footerFont = toFont(options.footerFont);\n ctx.fillStyle = options.footerColor;\n ctx.font = footerFont.string;\n for (i = 0; i < length; ++i) {\n ctx.fillText(footer[i], rtlHelper.x(pt.x), pt.y + footerFont.lineHeight / 2);\n pt.y += footerFont.lineHeight + options.footerSpacing;\n }\n }\n }\n drawBackground(pt, ctx, tooltipSize, options) {\n const {xAlign, yAlign} = this;\n const {x, y} = pt;\n const {width, height} = tooltipSize;\n const radius = options.cornerRadius;\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n ctx.beginPath();\n ctx.moveTo(x + radius, y);\n if (yAlign === 'top') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width - radius, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + radius);\n if (yAlign === 'center' && xAlign === 'right') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width, y + height - radius);\n ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);\n if (yAlign === 'bottom') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + radius, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - radius);\n if (yAlign === 'center' && xAlign === 'left') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x, y + radius);\n ctx.quadraticCurveTo(x, y, x + radius, y);\n ctx.closePath();\n ctx.fill();\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n }\n _updateAnimationTarget(options) {\n const me = this;\n const chart = me._chart;\n const anims = me.$animations;\n const animX = anims && anims.x;\n const animY = anims && anims.y;\n if (animX || animY) {\n const position = positioners[options.position].call(me, me._active, me._eventPosition);\n if (!position) {\n return;\n }\n const size = me._size = getTooltipSize(me, options);\n const positionAndSize = Object.assign({}, position, me._size);\n const alignment = determineAlignment(chart, options, positionAndSize);\n const point = getBackgroundPoint(options, positionAndSize, alignment, chart);\n if (animX._to !== point.x || animY._to !== point.y) {\n me.xAlign = alignment.xAlign;\n me.yAlign = alignment.yAlign;\n me.width = size.width;\n me.height = size.height;\n me.caretX = position.x;\n me.caretY = position.y;\n me._resolveAnimations().update(me, point);\n }\n }\n }\n draw(ctx) {\n const me = this;\n const options = me.options.setContext(me.getContext());\n let opacity = me.opacity;\n if (!opacity) {\n return;\n }\n me._updateAnimationTarget(options);\n const tooltipSize = {\n width: me.width,\n height: me.height\n };\n const pt = {\n x: me.x,\n y: me.y\n };\n opacity = Math.abs(opacity) < 1e-3 ? 0 : opacity;\n const padding = toPadding(options.padding);\n const hasTooltipContent = me.title.length || me.beforeBody.length || me.body.length || me.afterBody.length || me.footer.length;\n if (options.enabled && hasTooltipContent) {\n ctx.save();\n ctx.globalAlpha = opacity;\n me.drawBackground(pt, ctx, tooltipSize, options);\n overrideTextDirection(ctx, options.textDirection);\n pt.y += padding.top;\n me.drawTitle(pt, ctx, options);\n me.drawBody(pt, ctx, options);\n me.drawFooter(pt, ctx, options);\n restoreTextDirection(ctx, options.textDirection);\n ctx.restore();\n }\n }\n getActiveElements() {\n return this._active || [];\n }\n setActiveElements(activeElements, eventPosition) {\n const me = this;\n const lastActive = me._active;\n const active = activeElements.map(({datasetIndex, index}) => {\n const meta = me._chart.getDatasetMeta(datasetIndex);\n if (!meta) {\n throw new Error('Cannot find a dataset at index ' + datasetIndex);\n }\n return {\n datasetIndex,\n element: meta.data[index],\n index,\n };\n });\n const changed = !_elementsEqual(lastActive, active);\n const positionChanged = me._positionChanged(active, eventPosition);\n if (changed || positionChanged) {\n me._active = active;\n me._eventPosition = eventPosition;\n me.update(true);\n }\n }\n handleEvent(e, replay) {\n const me = this;\n const options = me.options;\n const lastActive = me._active || [];\n let changed = false;\n let active = [];\n if (e.type !== 'mouseout') {\n active = me._chart.getElementsAtEventForMode(e, options.mode, options, replay);\n if (options.reverse) {\n active.reverse();\n }\n }\n const positionChanged = me._positionChanged(active, e);\n changed = replay || !_elementsEqual(active, lastActive) || positionChanged;\n if (changed) {\n me._active = active;\n if (options.enabled || options.external) {\n me._eventPosition = {\n x: e.x,\n y: e.y\n };\n me.update(true, replay);\n }\n }\n return changed;\n }\n _positionChanged(active, e) {\n const {caretX, caretY, options} = this;\n const position = positioners[options.position].call(this, active, e);\n return position !== false && (caretX !== position.x || caretY !== position.y);\n }\n}\nTooltip.positioners = positioners;\nvar plugin_tooltip = {\n id: 'tooltip',\n _element: Tooltip,\n positioners,\n afterInit(chart, _args, options) {\n if (options) {\n chart.tooltip = new Tooltip({_chart: chart, options});\n }\n },\n beforeUpdate(chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n reset(chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n afterDraw(chart) {\n const tooltip = chart.tooltip;\n const args = {\n tooltip\n };\n if (chart.notifyPlugins('beforeTooltipDraw', args) === false) {\n return;\n }\n if (tooltip) {\n tooltip.draw(chart.ctx);\n }\n chart.notifyPlugins('afterTooltipDraw', args);\n },\n afterEvent(chart, args) {\n if (chart.tooltip) {\n const useFinalPosition = args.replay;\n if (chart.tooltip.handleEvent(args.event, useFinalPosition)) {\n args.changed = true;\n }\n }\n },\n defaults: {\n enabled: true,\n external: null,\n position: 'average',\n backgroundColor: 'rgba(0,0,0,0.8)',\n titleColor: '#fff',\n titleFont: {\n weight: 'bold',\n },\n titleSpacing: 2,\n titleMarginBottom: 6,\n titleAlign: 'left',\n bodyColor: '#fff',\n bodySpacing: 2,\n bodyFont: {\n },\n bodyAlign: 'left',\n footerColor: '#fff',\n footerSpacing: 2,\n footerMarginTop: 6,\n footerFont: {\n weight: 'bold',\n },\n footerAlign: 'left',\n padding: 6,\n caretPadding: 2,\n caretSize: 5,\n cornerRadius: 6,\n boxHeight: (ctx, opts) => opts.bodyFont.size,\n boxWidth: (ctx, opts) => opts.bodyFont.size,\n multiKeyBackground: '#fff',\n displayColors: true,\n borderColor: 'rgba(0,0,0,0)',\n borderWidth: 0,\n animation: {\n duration: 400,\n easing: 'easeOutQuart',\n },\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'width', 'height', 'caretX', 'caretY'],\n },\n opacity: {\n easing: 'linear',\n duration: 200\n }\n },\n callbacks: {\n beforeTitle: noop,\n title(tooltipItems) {\n if (tooltipItems.length > 0) {\n const item = tooltipItems[0];\n const labels = item.chart.data.labels;\n const labelCount = labels ? labels.length : 0;\n if (this && this.options && this.options.mode === 'dataset') {\n return item.dataset.label || '';\n } else if (item.label) {\n return item.label;\n } else if (labelCount > 0 && item.dataIndex < labelCount) {\n return labels[item.dataIndex];\n }\n }\n return '';\n },\n afterTitle: noop,\n beforeBody: noop,\n beforeLabel: noop,\n label(tooltipItem) {\n if (this && this.options && this.options.mode === 'dataset') {\n return tooltipItem.label + ': ' + tooltipItem.formattedValue || tooltipItem.formattedValue;\n }\n let label = tooltipItem.dataset.label || '';\n if (label) {\n label += ': ';\n }\n const value = tooltipItem.formattedValue;\n if (!isNullOrUndef(value)) {\n label += value;\n }\n return label;\n },\n labelColor(tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n borderColor: options.borderColor,\n backgroundColor: options.backgroundColor,\n borderWidth: options.borderWidth,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderRadius: 0,\n };\n },\n labelTextColor() {\n return this.options.bodyColor;\n },\n labelPointStyle(tooltipItem) {\n const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n const options = meta.controller.getStyle(tooltipItem.dataIndex);\n return {\n pointStyle: options.pointStyle,\n rotation: options.rotation,\n };\n },\n afterLabel: noop,\n afterBody: noop,\n beforeFooter: noop,\n footer: noop,\n afterFooter: noop\n }\n },\n defaultRoutes: {\n bodyFont: 'font',\n footerFont: 'font',\n titleFont: 'font'\n },\n descriptors: {\n _scriptable: (name) => name !== 'filter' && name !== 'itemSort' && name !== 'external',\n _indexable: false,\n callbacks: {\n _scriptable: false,\n _indexable: false,\n },\n animation: {\n _fallback: false\n },\n animations: {\n _fallback: 'animation'\n }\n },\n additionalOptionScopes: ['interaction']\n};\n\nvar plugins = /*#__PURE__*/Object.freeze({\n__proto__: null,\nDecimation: plugin_decimation,\nFiller: plugin_filler,\nLegend: plugin_legend,\nSubTitle: plugin_subtitle,\nTitle: plugin_title,\nTooltip: plugin_tooltip\n});\n\nconst addIfString = (labels, raw, index) => typeof raw === 'string'\n ? labels.push(raw) - 1\n : isNaN(raw) ? null : index;\nfunction findOrAddLabel(labels, raw, index) {\n const first = labels.indexOf(raw);\n if (first === -1) {\n return addIfString(labels, raw, index);\n }\n const last = labels.lastIndexOf(raw);\n return first !== last ? index : first;\n}\nconst validIndex = (index, max) => index === null ? null : _limitValue(Math.round(index), 0, max);\nclass CategoryScale extends Scale {\n constructor(cfg) {\n super(cfg);\n this._startValue = undefined;\n this._valueRange = 0;\n }\n parse(raw, index) {\n if (isNullOrUndef(raw)) {\n return null;\n }\n const labels = this.getLabels();\n index = isFinite(index) && labels[index] === raw ? index\n : findOrAddLabel(labels, raw, valueOrDefault(index, raw));\n return validIndex(index, labels.length - 1);\n }\n determineDataLimits() {\n const me = this;\n const {minDefined, maxDefined} = me.getUserBounds();\n let {min, max} = me.getMinMax(true);\n if (me.options.bounds === 'ticks') {\n if (!minDefined) {\n min = 0;\n }\n if (!maxDefined) {\n max = me.getLabels().length - 1;\n }\n }\n me.min = min;\n me.max = max;\n }\n buildTicks() {\n const me = this;\n const min = me.min;\n const max = me.max;\n const offset = me.options.offset;\n const ticks = [];\n let labels = me.getLabels();\n labels = (min === 0 && max === labels.length - 1) ? labels : labels.slice(min, max + 1);\n me._valueRange = Math.max(labels.length - (offset ? 0 : 1), 1);\n me._startValue = me.min - (offset ? 0.5 : 0);\n for (let value = min; value <= max; value++) {\n ticks.push({value});\n }\n return ticks;\n }\n getLabelForValue(value) {\n const me = this;\n const labels = me.getLabels();\n if (value >= 0 && value < labels.length) {\n return labels[value];\n }\n return value;\n }\n configure() {\n const me = this;\n super.configure();\n if (!me.isHorizontal()) {\n me._reversePixels = !me._reversePixels;\n }\n }\n getPixelForValue(value) {\n const me = this;\n if (typeof value !== 'number') {\n value = me.parse(value);\n }\n return value === null ? NaN : me.getPixelForDecimal((value - me._startValue) / me._valueRange);\n }\n getPixelForTick(index) {\n const me = this;\n const ticks = me.ticks;\n if (index < 0 || index > ticks.length - 1) {\n return null;\n }\n return me.getPixelForValue(ticks[index].value);\n }\n getValueForPixel(pixel) {\n const me = this;\n return Math.round(me._startValue + me.getDecimalForPixel(pixel) * me._valueRange);\n }\n getBasePixel() {\n return this.bottom;\n }\n}\nCategoryScale.id = 'category';\nCategoryScale.defaults = {\n ticks: {\n callback: CategoryScale.prototype.getLabelForValue\n }\n};\n\nfunction generateTicks$1(generationOptions, dataRange) {\n const ticks = [];\n const MIN_SPACING = 1e-14;\n const {bounds, step, min, max, precision, count, maxTicks, maxDigits, includeBounds} = generationOptions;\n const unit = step || 1;\n const maxSpaces = maxTicks - 1;\n const {min: rmin, max: rmax} = dataRange;\n const minDefined = !isNullOrUndef(min);\n const maxDefined = !isNullOrUndef(max);\n const countDefined = !isNullOrUndef(count);\n const minSpacing = (rmax - rmin) / (maxDigits + 1);\n let spacing = niceNum((rmax - rmin) / maxSpaces / unit) * unit;\n let factor, niceMin, niceMax, numSpaces;\n if (spacing < MIN_SPACING && !minDefined && !maxDefined) {\n return [{value: rmin}, {value: rmax}];\n }\n numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing);\n if (numSpaces > maxSpaces) {\n spacing = niceNum(numSpaces * spacing / maxSpaces / unit) * unit;\n }\n if (!isNullOrUndef(precision)) {\n factor = Math.pow(10, precision);\n spacing = Math.ceil(spacing * factor) / factor;\n }\n if (bounds === 'ticks') {\n niceMin = Math.floor(rmin / spacing) * spacing;\n niceMax = Math.ceil(rmax / spacing) * spacing;\n } else {\n niceMin = rmin;\n niceMax = rmax;\n }\n if (minDefined && maxDefined && step && almostWhole((max - min) / step, spacing / 1000)) {\n numSpaces = Math.round(Math.min((max - min) / spacing, maxTicks));\n spacing = (max - min) / numSpaces;\n niceMin = min;\n niceMax = max;\n } else if (countDefined) {\n niceMin = minDefined ? min : niceMin;\n niceMax = maxDefined ? max : niceMax;\n numSpaces = count - 1;\n spacing = (niceMax - niceMin) / numSpaces;\n } else {\n numSpaces = (niceMax - niceMin) / spacing;\n if (almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n numSpaces = Math.round(numSpaces);\n } else {\n numSpaces = Math.ceil(numSpaces);\n }\n }\n const decimalPlaces = Math.max(\n _decimalPlaces(spacing),\n _decimalPlaces(niceMin)\n );\n factor = Math.pow(10, isNullOrUndef(precision) ? decimalPlaces : precision);\n niceMin = Math.round(niceMin * factor) / factor;\n niceMax = Math.round(niceMax * factor) / factor;\n let j = 0;\n if (minDefined) {\n if (includeBounds && niceMin !== min) {\n ticks.push({value: min});\n if (niceMin < min) {\n j++;\n }\n if (almostEquals(Math.round((niceMin + j * spacing) * factor) / factor, min, relativeLabelSize(min, minSpacing, generationOptions))) {\n j++;\n }\n } else if (niceMin < min) {\n j++;\n }\n }\n for (; j < numSpaces; ++j) {\n ticks.push({value: Math.round((niceMin + j * spacing) * factor) / factor});\n }\n if (maxDefined && includeBounds && niceMax !== max) {\n if (almostEquals(ticks[ticks.length - 1].value, max, relativeLabelSize(max, minSpacing, generationOptions))) {\n ticks[ticks.length - 1].value = max;\n } else {\n ticks.push({value: max});\n }\n } else if (!maxDefined || niceMax === max) {\n ticks.push({value: niceMax});\n }\n return ticks;\n}\nfunction relativeLabelSize(value, minSpacing, {horizontal, minRotation}) {\n const rad = toRadians(minRotation);\n const ratio = (horizontal ? Math.sin(rad) : Math.cos(rad)) || 0.001;\n const length = 0.75 * minSpacing * ('' + value).length;\n return Math.min(minSpacing / ratio, length);\n}\nclass LinearScaleBase extends Scale {\n constructor(cfg) {\n super(cfg);\n this.start = undefined;\n this.end = undefined;\n this._startValue = undefined;\n this._endValue = undefined;\n this._valueRange = 0;\n }\n parse(raw, index) {\n if (isNullOrUndef(raw)) {\n return null;\n }\n if ((typeof raw === 'number' || raw instanceof Number) && !isFinite(+raw)) {\n return null;\n }\n return +raw;\n }\n handleTickRangeOptions() {\n const me = this;\n const {beginAtZero} = me.options;\n const {minDefined, maxDefined} = me.getUserBounds();\n let {min, max} = me;\n const setMin = v => (min = minDefined ? min : v);\n const setMax = v => (max = maxDefined ? max : v);\n if (beginAtZero) {\n const minSign = sign(min);\n const maxSign = sign(max);\n if (minSign < 0 && maxSign < 0) {\n setMax(0);\n } else if (minSign > 0 && maxSign > 0) {\n setMin(0);\n }\n }\n if (min === max) {\n let offset = 1;\n if (max >= Number.MAX_SAFE_INTEGER || min <= Number.MIN_SAFE_INTEGER) {\n offset = Math.abs(max * 0.05);\n }\n setMax(max + offset);\n if (!beginAtZero) {\n setMin(min - offset);\n }\n }\n me.min = min;\n me.max = max;\n }\n getTickLimit() {\n const me = this;\n const tickOpts = me.options.ticks;\n let {maxTicksLimit, stepSize} = tickOpts;\n let maxTicks;\n if (stepSize) {\n maxTicks = Math.ceil(me.max / stepSize) - Math.floor(me.min / stepSize) + 1;\n } else {\n maxTicks = me.computeTickLimit();\n maxTicksLimit = maxTicksLimit || 11;\n }\n if (maxTicksLimit) {\n maxTicks = Math.min(maxTicksLimit, maxTicks);\n }\n return maxTicks;\n }\n computeTickLimit() {\n return Number.POSITIVE_INFINITY;\n }\n buildTicks() {\n const me = this;\n const opts = me.options;\n const tickOpts = opts.ticks;\n let maxTicks = me.getTickLimit();\n maxTicks = Math.max(2, maxTicks);\n const numericGeneratorOptions = {\n maxTicks,\n bounds: opts.bounds,\n min: opts.min,\n max: opts.max,\n precision: tickOpts.precision,\n step: tickOpts.stepSize,\n count: tickOpts.count,\n maxDigits: me._maxDigits(),\n horizontal: me.isHorizontal(),\n minRotation: tickOpts.minRotation || 0,\n includeBounds: tickOpts.includeBounds !== false\n };\n const dataRange = me._range || me;\n const ticks = generateTicks$1(numericGeneratorOptions, dataRange);\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, me, 'value');\n }\n if (opts.reverse) {\n ticks.reverse();\n me.start = me.max;\n me.end = me.min;\n } else {\n me.start = me.min;\n me.end = me.max;\n }\n return ticks;\n }\n configure() {\n const me = this;\n const ticks = me.ticks;\n let start = me.min;\n let end = me.max;\n super.configure();\n if (me.options.offset && ticks.length) {\n const offset = (end - start) / Math.max(ticks.length - 1, 1) / 2;\n start -= offset;\n end += offset;\n }\n me._startValue = start;\n me._endValue = end;\n me._valueRange = end - start;\n }\n getLabelForValue(value) {\n return formatNumber(value, this.chart.options.locale);\n }\n}\n\nclass LinearScale extends LinearScaleBase {\n determineDataLimits() {\n const me = this;\n const {min, max} = me.getMinMax(true);\n me.min = isNumberFinite(min) ? min : 0;\n me.max = isNumberFinite(max) ? max : 1;\n me.handleTickRangeOptions();\n }\n computeTickLimit() {\n const me = this;\n const horizontal = me.isHorizontal();\n const length = horizontal ? me.width : me.height;\n const minRotation = toRadians(me.options.ticks.minRotation);\n const ratio = (horizontal ? Math.sin(minRotation) : Math.cos(minRotation)) || 0.001;\n const tickFont = me._resolveTickFontOptions(0);\n return Math.ceil(length / Math.min(40, tickFont.lineHeight / ratio));\n }\n getPixelForValue(value) {\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n getValueForPixel(pixel) {\n return this._startValue + this.getDecimalForPixel(pixel) * this._valueRange;\n }\n}\nLinearScale.id = 'linear';\nLinearScale.defaults = {\n ticks: {\n callback: Ticks.formatters.numeric\n }\n};\n\nfunction isMajor(tickVal) {\n const remain = tickVal / (Math.pow(10, Math.floor(log10(tickVal))));\n return remain === 1;\n}\nfunction generateTicks(generationOptions, dataRange) {\n const endExp = Math.floor(log10(dataRange.max));\n const endSignificand = Math.ceil(dataRange.max / Math.pow(10, endExp));\n const ticks = [];\n let tickVal = finiteOrDefault(generationOptions.min, Math.pow(10, Math.floor(log10(dataRange.min))));\n let exp = Math.floor(log10(tickVal));\n let significand = Math.floor(tickVal / Math.pow(10, exp));\n let precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;\n do {\n ticks.push({value: tickVal, major: isMajor(tickVal)});\n ++significand;\n if (significand === 10) {\n significand = 1;\n ++exp;\n precision = exp >= 0 ? 1 : precision;\n }\n tickVal = Math.round(significand * Math.pow(10, exp) * precision) / precision;\n } while (exp < endExp || (exp === endExp && significand < endSignificand));\n const lastTick = finiteOrDefault(generationOptions.max, tickVal);\n ticks.push({value: lastTick, major: isMajor(tickVal)});\n return ticks;\n}\nclass LogarithmicScale extends Scale {\n constructor(cfg) {\n super(cfg);\n this.start = undefined;\n this.end = undefined;\n this._startValue = undefined;\n this._valueRange = 0;\n }\n parse(raw, index) {\n const value = LinearScaleBase.prototype.parse.apply(this, [raw, index]);\n if (value === 0) {\n this._zero = true;\n return undefined;\n }\n return isNumberFinite(value) && value > 0 ? value : null;\n }\n determineDataLimits() {\n const me = this;\n const {min, max} = me.getMinMax(true);\n me.min = isNumberFinite(min) ? Math.max(0, min) : null;\n me.max = isNumberFinite(max) ? Math.max(0, max) : null;\n if (me.options.beginAtZero) {\n me._zero = true;\n }\n me.handleTickRangeOptions();\n }\n handleTickRangeOptions() {\n const me = this;\n const {minDefined, maxDefined} = me.getUserBounds();\n let min = me.min;\n let max = me.max;\n const setMin = v => (min = minDefined ? min : v);\n const setMax = v => (max = maxDefined ? max : v);\n const exp = (v, m) => Math.pow(10, Math.floor(log10(v)) + m);\n if (min === max) {\n if (min <= 0) {\n setMin(1);\n setMax(10);\n } else {\n setMin(exp(min, -1));\n setMax(exp(max, +1));\n }\n }\n if (min <= 0) {\n setMin(exp(max, -1));\n }\n if (max <= 0) {\n setMax(exp(min, +1));\n }\n if (me._zero && me.min !== me._suggestedMin && min === exp(me.min, 0)) {\n setMin(exp(min, -1));\n }\n me.min = min;\n me.max = max;\n }\n buildTicks() {\n const me = this;\n const opts = me.options;\n const generationOptions = {\n min: me._userMin,\n max: me._userMax\n };\n const ticks = generateTicks(generationOptions, me);\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, me, 'value');\n }\n if (opts.reverse) {\n ticks.reverse();\n me.start = me.max;\n me.end = me.min;\n } else {\n me.start = me.min;\n me.end = me.max;\n }\n return ticks;\n }\n getLabelForValue(value) {\n return value === undefined ? '0' : formatNumber(value, this.chart.options.locale);\n }\n configure() {\n const me = this;\n const start = me.min;\n super.configure();\n me._startValue = log10(start);\n me._valueRange = log10(me.max) - log10(start);\n }\n getPixelForValue(value) {\n const me = this;\n if (value === undefined || value === 0) {\n value = me.min;\n }\n if (value === null || isNaN(value)) {\n return NaN;\n }\n return me.getPixelForDecimal(value === me.min\n ? 0\n : (log10(value) - me._startValue) / me._valueRange);\n }\n getValueForPixel(pixel) {\n const me = this;\n const decimal = me.getDecimalForPixel(pixel);\n return Math.pow(10, me._startValue + decimal * me._valueRange);\n }\n}\nLogarithmicScale.id = 'logarithmic';\nLogarithmicScale.defaults = {\n ticks: {\n callback: Ticks.formatters.logarithmic,\n major: {\n enabled: true\n }\n }\n};\n\nfunction getTickBackdropHeight(opts) {\n const tickOpts = opts.ticks;\n if (tickOpts.display && opts.display) {\n const padding = toPadding(tickOpts.backdropPadding);\n return valueOrDefault(tickOpts.font && tickOpts.font.size, defaults.font.size) + padding.height;\n }\n return 0;\n}\nfunction measureLabelSize(ctx, font, label) {\n label = isArray(label) ? label : [label];\n return {\n w: _longestText(ctx, font.string, label),\n h: label.length * font.lineHeight\n };\n}\nfunction determineLimits(angle, pos, size, min, max) {\n if (angle === min || angle === max) {\n return {\n start: pos - (size / 2),\n end: pos + (size / 2)\n };\n } else if (angle < min || angle > max) {\n return {\n start: pos - size,\n end: pos\n };\n }\n return {\n start: pos,\n end: pos + size\n };\n}\nfunction fitWithPointLabels(scale) {\n const furthestLimits = {\n l: 0,\n r: scale.width,\n t: 0,\n b: scale.height - scale.paddingTop\n };\n const furthestAngles = {};\n const labelSizes = [];\n const padding = [];\n const valueCount = scale.getLabels().length;\n for (let i = 0; i < valueCount; i++) {\n const opts = scale.options.pointLabels.setContext(scale.getPointLabelContext(i));\n padding[i] = opts.padding;\n const pointPosition = scale.getPointPosition(i, scale.drawingArea + padding[i]);\n const plFont = toFont(opts.font);\n const textSize = measureLabelSize(scale.ctx, plFont, scale._pointLabels[i]);\n labelSizes[i] = textSize;\n const angleRadians = scale.getIndexAngle(i);\n const angle = toDegrees(angleRadians);\n const hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n const vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n if (hLimits.start < furthestLimits.l) {\n furthestLimits.l = hLimits.start;\n furthestAngles.l = angleRadians;\n }\n if (hLimits.end > furthestLimits.r) {\n furthestLimits.r = hLimits.end;\n furthestAngles.r = angleRadians;\n }\n if (vLimits.start < furthestLimits.t) {\n furthestLimits.t = vLimits.start;\n furthestAngles.t = angleRadians;\n }\n if (vLimits.end > furthestLimits.b) {\n furthestLimits.b = vLimits.end;\n furthestAngles.b = angleRadians;\n }\n }\n scale._setReductions(scale.drawingArea, furthestLimits, furthestAngles);\n scale._pointLabelItems = buildPointLabelItems(scale, labelSizes, padding);\n}\nfunction buildPointLabelItems(scale, labelSizes, padding) {\n const items = [];\n const valueCount = scale.getLabels().length;\n const opts = scale.options;\n const tickBackdropHeight = getTickBackdropHeight(opts);\n const outerDistance = scale.getDistanceFromCenterForValue(opts.ticks.reverse ? scale.min : scale.max);\n for (let i = 0; i < valueCount; i++) {\n const extra = (i === 0 ? tickBackdropHeight / 2 : 0);\n const pointLabelPosition = scale.getPointPosition(i, outerDistance + extra + padding[i]);\n const angle = toDegrees(scale.getIndexAngle(i));\n const size = labelSizes[i];\n const y = yForAngle(pointLabelPosition.y, size.h, angle);\n const textAlign = getTextAlignForAngle(angle);\n const left = leftForTextAlign(pointLabelPosition.x, size.w, textAlign);\n items.push({\n x: pointLabelPosition.x,\n y,\n textAlign,\n left,\n top: y,\n right: left + size.w,\n bottom: y + size.h\n });\n }\n return items;\n}\nfunction getTextAlignForAngle(angle) {\n if (angle === 0 || angle === 180) {\n return 'center';\n } else if (angle < 180) {\n return 'left';\n }\n return 'right';\n}\nfunction leftForTextAlign(x, w, align) {\n if (align === 'right') {\n x -= w;\n } else if (align === 'center') {\n x -= (w / 2);\n }\n return x;\n}\nfunction yForAngle(y, h, angle) {\n if (angle === 90 || angle === 270) {\n y -= (h / 2);\n } else if (angle > 270 || angle < 90) {\n y -= h;\n }\n return y;\n}\nfunction drawPointLabels(scale, labelCount) {\n const {ctx, options: {pointLabels}} = scale;\n for (let i = labelCount - 1; i >= 0; i--) {\n const optsAtIndex = pointLabels.setContext(scale.getPointLabelContext(i));\n const plFont = toFont(optsAtIndex.font);\n const {x, y, textAlign, left, top, right, bottom} = scale._pointLabelItems[i];\n const {backdropColor} = optsAtIndex;\n if (!isNullOrUndef(backdropColor)) {\n const padding = toPadding(optsAtIndex.backdropPadding);\n ctx.fillStyle = backdropColor;\n ctx.fillRect(left - padding.left, top - padding.top, right - left + padding.width, bottom - top + padding.height);\n }\n renderText(\n ctx,\n scale._pointLabels[i],\n x,\n y + (plFont.lineHeight / 2),\n plFont,\n {\n color: optsAtIndex.color,\n textAlign: textAlign,\n textBaseline: 'middle'\n }\n );\n }\n}\nfunction pathRadiusLine(scale, radius, circular, labelCount) {\n const {ctx} = scale;\n if (circular) {\n ctx.arc(scale.xCenter, scale.yCenter, radius, 0, TAU);\n } else {\n let pointPosition = scale.getPointPosition(0, radius);\n ctx.moveTo(pointPosition.x, pointPosition.y);\n for (let i = 1; i < labelCount; i++) {\n pointPosition = scale.getPointPosition(i, radius);\n ctx.lineTo(pointPosition.x, pointPosition.y);\n }\n }\n}\nfunction drawRadiusLine(scale, gridLineOpts, radius, labelCount) {\n const ctx = scale.ctx;\n const circular = gridLineOpts.circular;\n const {color, lineWidth} = gridLineOpts;\n if ((!circular && !labelCount) || !color || !lineWidth || radius < 0) {\n return;\n }\n ctx.save();\n ctx.strokeStyle = color;\n ctx.lineWidth = lineWidth;\n ctx.setLineDash(gridLineOpts.borderDash);\n ctx.lineDashOffset = gridLineOpts.borderDashOffset;\n ctx.beginPath();\n pathRadiusLine(scale, radius, circular, labelCount);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n}\nfunction numberOrZero(param) {\n return isNumber(param) ? param : 0;\n}\nfunction createPointLabelContext(parent, index, label) {\n return Object.assign(Object.create(parent), {\n label,\n index,\n type: 'pointLabel'\n });\n}\nclass RadialLinearScale extends LinearScaleBase {\n constructor(cfg) {\n super(cfg);\n this.xCenter = undefined;\n this.yCenter = undefined;\n this.drawingArea = undefined;\n this._pointLabels = [];\n this._pointLabelItems = [];\n }\n setDimensions() {\n const me = this;\n me.width = me.maxWidth;\n me.height = me.maxHeight;\n me.paddingTop = getTickBackdropHeight(me.options) / 2;\n me.xCenter = Math.floor(me.width / 2);\n me.yCenter = Math.floor((me.height - me.paddingTop) / 2);\n me.drawingArea = Math.min(me.height - me.paddingTop, me.width) / 2;\n }\n determineDataLimits() {\n const me = this;\n const {min, max} = me.getMinMax(false);\n me.min = isNumberFinite(min) && !isNaN(min) ? min : 0;\n me.max = isNumberFinite(max) && !isNaN(max) ? max : 0;\n me.handleTickRangeOptions();\n }\n computeTickLimit() {\n return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options));\n }\n generateTickLabels(ticks) {\n const me = this;\n LinearScaleBase.prototype.generateTickLabels.call(me, ticks);\n me._pointLabels = me.getLabels().map((value, index) => {\n const label = callback(me.options.pointLabels.callback, [value, index], me);\n return label || label === 0 ? label : '';\n });\n }\n fit() {\n const me = this;\n const opts = me.options;\n if (opts.display && opts.pointLabels.display) {\n fitWithPointLabels(me);\n } else {\n me.setCenterPoint(0, 0, 0, 0);\n }\n }\n _setReductions(largestPossibleRadius, furthestLimits, furthestAngles) {\n const me = this;\n let radiusReductionLeft = furthestLimits.l / Math.sin(furthestAngles.l);\n let radiusReductionRight = Math.max(furthestLimits.r - me.width, 0) / Math.sin(furthestAngles.r);\n let radiusReductionTop = -furthestLimits.t / Math.cos(furthestAngles.t);\n let radiusReductionBottom = -Math.max(furthestLimits.b - (me.height - me.paddingTop), 0) / Math.cos(furthestAngles.b);\n radiusReductionLeft = numberOrZero(radiusReductionLeft);\n radiusReductionRight = numberOrZero(radiusReductionRight);\n radiusReductionTop = numberOrZero(radiusReductionTop);\n radiusReductionBottom = numberOrZero(radiusReductionBottom);\n me.drawingArea = Math.max(largestPossibleRadius / 2, Math.min(\n Math.floor(largestPossibleRadius - (radiusReductionLeft + radiusReductionRight) / 2),\n Math.floor(largestPossibleRadius - (radiusReductionTop + radiusReductionBottom) / 2)));\n me.setCenterPoint(radiusReductionLeft, radiusReductionRight, radiusReductionTop, radiusReductionBottom);\n }\n setCenterPoint(leftMovement, rightMovement, topMovement, bottomMovement) {\n const me = this;\n const maxRight = me.width - rightMovement - me.drawingArea;\n const maxLeft = leftMovement + me.drawingArea;\n const maxTop = topMovement + me.drawingArea;\n const maxBottom = (me.height - me.paddingTop) - bottomMovement - me.drawingArea;\n me.xCenter = Math.floor(((maxLeft + maxRight) / 2) + me.left);\n me.yCenter = Math.floor(((maxTop + maxBottom) / 2) + me.top + me.paddingTop);\n }\n getIndexAngle(index) {\n const angleMultiplier = TAU / this.getLabels().length;\n const startAngle = this.options.startAngle || 0;\n return _normalizeAngle(index * angleMultiplier + toRadians(startAngle));\n }\n getDistanceFromCenterForValue(value) {\n const me = this;\n if (isNullOrUndef(value)) {\n return NaN;\n }\n const scalingFactor = me.drawingArea / (me.max - me.min);\n if (me.options.reverse) {\n return (me.max - value) * scalingFactor;\n }\n return (value - me.min) * scalingFactor;\n }\n getValueForDistanceFromCenter(distance) {\n if (isNullOrUndef(distance)) {\n return NaN;\n }\n const me = this;\n const scaledDistance = distance / (me.drawingArea / (me.max - me.min));\n return me.options.reverse ? me.max - scaledDistance : me.min + scaledDistance;\n }\n getPointLabelContext(index) {\n const me = this;\n const pointLabels = me._pointLabels || [];\n if (index >= 0 && index < pointLabels.length) {\n const pointLabel = pointLabels[index];\n return createPointLabelContext(me.getContext(), index, pointLabel);\n }\n }\n getPointPosition(index, distanceFromCenter) {\n const me = this;\n const angle = me.getIndexAngle(index) - HALF_PI;\n return {\n x: Math.cos(angle) * distanceFromCenter + me.xCenter,\n y: Math.sin(angle) * distanceFromCenter + me.yCenter,\n angle\n };\n }\n getPointPositionForValue(index, value) {\n return this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n }\n getBasePosition(index) {\n return this.getPointPositionForValue(index || 0, this.getBaseValue());\n }\n getPointLabelPosition(index) {\n const {left, top, right, bottom} = this._pointLabelItems[index];\n return {\n left,\n top,\n right,\n bottom,\n };\n }\n drawBackground() {\n const me = this;\n const {backgroundColor, grid: {circular}} = me.options;\n if (backgroundColor) {\n const ctx = me.ctx;\n ctx.save();\n ctx.beginPath();\n pathRadiusLine(me, me.getDistanceFromCenterForValue(me._endValue), circular, me.getLabels().length);\n ctx.closePath();\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n ctx.restore();\n }\n }\n drawGrid() {\n const me = this;\n const ctx = me.ctx;\n const opts = me.options;\n const {angleLines, grid} = opts;\n const labelCount = me.getLabels().length;\n let i, offset, position;\n if (opts.pointLabels.display) {\n drawPointLabels(me, labelCount);\n }\n if (grid.display) {\n me.ticks.forEach((tick, index) => {\n if (index !== 0) {\n offset = me.getDistanceFromCenterForValue(tick.value);\n const optsAtIndex = grid.setContext(me.getContext(index - 1));\n drawRadiusLine(me, optsAtIndex, offset, labelCount);\n }\n });\n }\n if (angleLines.display) {\n ctx.save();\n for (i = me.getLabels().length - 1; i >= 0; i--) {\n const optsAtIndex = angleLines.setContext(me.getPointLabelContext(i));\n const {color, lineWidth} = optsAtIndex;\n if (!lineWidth || !color) {\n continue;\n }\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = color;\n ctx.setLineDash(optsAtIndex.borderDash);\n ctx.lineDashOffset = optsAtIndex.borderDashOffset;\n offset = me.getDistanceFromCenterForValue(opts.ticks.reverse ? me.min : me.max);\n position = me.getPointPosition(i, offset);\n ctx.beginPath();\n ctx.moveTo(me.xCenter, me.yCenter);\n ctx.lineTo(position.x, position.y);\n ctx.stroke();\n }\n ctx.restore();\n }\n }\n drawBorder() {}\n drawLabels() {\n const me = this;\n const ctx = me.ctx;\n const opts = me.options;\n const tickOpts = opts.ticks;\n if (!tickOpts.display) {\n return;\n }\n const startAngle = me.getIndexAngle(0);\n let offset, width;\n ctx.save();\n ctx.translate(me.xCenter, me.yCenter);\n ctx.rotate(startAngle);\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n me.ticks.forEach((tick, index) => {\n if (index === 0 && !opts.reverse) {\n return;\n }\n const optsAtIndex = tickOpts.setContext(me.getContext(index));\n const tickFont = toFont(optsAtIndex.font);\n offset = me.getDistanceFromCenterForValue(me.ticks[index].value);\n if (optsAtIndex.showLabelBackdrop) {\n ctx.font = tickFont.string;\n width = ctx.measureText(tick.label).width;\n ctx.fillStyle = optsAtIndex.backdropColor;\n const padding = toPadding(optsAtIndex.backdropPadding);\n ctx.fillRect(\n -width / 2 - padding.left,\n -offset - tickFont.size / 2 - padding.top,\n width + padding.width,\n tickFont.size + padding.height\n );\n }\n renderText(ctx, tick.label, 0, -offset, tickFont, {\n color: optsAtIndex.color,\n });\n });\n ctx.restore();\n }\n drawTitle() {}\n}\nRadialLinearScale.id = 'radialLinear';\nRadialLinearScale.defaults = {\n display: true,\n animate: true,\n position: 'chartArea',\n angleLines: {\n display: true,\n lineWidth: 1,\n borderDash: [],\n borderDashOffset: 0.0\n },\n grid: {\n circular: false\n },\n startAngle: 0,\n ticks: {\n showLabelBackdrop: true,\n callback: Ticks.formatters.numeric\n },\n pointLabels: {\n backdropColor: undefined,\n backdropPadding: 2,\n display: true,\n font: {\n size: 10\n },\n callback(label) {\n return label;\n },\n padding: 5\n }\n};\nRadialLinearScale.defaultRoutes = {\n 'angleLines.color': 'borderColor',\n 'pointLabels.color': 'color',\n 'ticks.color': 'color'\n};\nRadialLinearScale.descriptors = {\n angleLines: {\n _fallback: 'grid'\n }\n};\n\nconst INTERVALS = {\n millisecond: {common: true, size: 1, steps: 1000},\n second: {common: true, size: 1000, steps: 60},\n minute: {common: true, size: 60000, steps: 60},\n hour: {common: true, size: 3600000, steps: 24},\n day: {common: true, size: 86400000, steps: 30},\n week: {common: false, size: 604800000, steps: 4},\n month: {common: true, size: 2.628e9, steps: 12},\n quarter: {common: false, size: 7.884e9, steps: 4},\n year: {common: true, size: 3.154e10}\n};\nconst UNITS = (Object.keys(INTERVALS));\nfunction sorter(a, b) {\n return a - b;\n}\nfunction parse(scale, input) {\n if (isNullOrUndef(input)) {\n return null;\n }\n const adapter = scale._adapter;\n const {parser, round, isoWeekday} = scale._parseOpts;\n let value = input;\n if (typeof parser === 'function') {\n value = parser(value);\n }\n if (!isNumberFinite(value)) {\n value = typeof parser === 'string'\n ? adapter.parse(value, parser)\n : adapter.parse(value);\n }\n if (value === null) {\n return null;\n }\n if (round) {\n value = round === 'week' && (isNumber(isoWeekday) || isoWeekday === true)\n ? adapter.startOf(value, 'isoWeek', isoWeekday)\n : adapter.startOf(value, round);\n }\n return +value;\n}\nfunction determineUnitForAutoTicks(minUnit, min, max, capacity) {\n const ilen = UNITS.length;\n for (let i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) {\n const interval = INTERVALS[UNITS[i]];\n const factor = interval.steps ? interval.steps : Number.MAX_SAFE_INTEGER;\n if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\n return UNITS[i];\n }\n }\n return UNITS[ilen - 1];\n}\nfunction determineUnitForFormatting(scale, numTicks, minUnit, min, max) {\n for (let i = UNITS.length - 1; i >= UNITS.indexOf(minUnit); i--) {\n const unit = UNITS[i];\n if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= numTicks - 1) {\n return unit;\n }\n }\n return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];\n}\nfunction determineMajorUnit(unit) {\n for (let i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) {\n if (INTERVALS[UNITS[i]].common) {\n return UNITS[i];\n }\n }\n}\nfunction addTick(ticks, time, timestamps) {\n if (!timestamps) {\n ticks[time] = true;\n } else if (timestamps.length) {\n const {lo, hi} = _lookup(timestamps, time);\n const timestamp = timestamps[lo] >= time ? timestamps[lo] : timestamps[hi];\n ticks[timestamp] = true;\n }\n}\nfunction setMajorTicks(scale, ticks, map, majorUnit) {\n const adapter = scale._adapter;\n const first = +adapter.startOf(ticks[0].value, majorUnit);\n const last = ticks[ticks.length - 1].value;\n let major, index;\n for (major = first; major <= last; major = +adapter.add(major, 1, majorUnit)) {\n index = map[major];\n if (index >= 0) {\n ticks[index].major = true;\n }\n }\n return ticks;\n}\nfunction ticksFromTimestamps(scale, values, majorUnit) {\n const ticks = [];\n const map = {};\n const ilen = values.length;\n let i, value;\n for (i = 0; i < ilen; ++i) {\n value = values[i];\n map[value] = i;\n ticks.push({\n value,\n major: false\n });\n }\n return (ilen === 0 || !majorUnit) ? ticks : setMajorTicks(scale, ticks, map, majorUnit);\n}\nclass TimeScale extends Scale {\n constructor(props) {\n super(props);\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n this._unit = 'day';\n this._majorUnit = undefined;\n this._offsets = {};\n this._normalized = false;\n this._parseOpts = undefined;\n }\n init(scaleOpts, opts) {\n const time = scaleOpts.time || (scaleOpts.time = {});\n const adapter = this._adapter = new adapters._date(scaleOpts.adapters.date);\n mergeIf(time.displayFormats, adapter.formats());\n this._parseOpts = {\n parser: time.parser,\n round: time.round,\n isoWeekday: time.isoWeekday\n };\n super.init(scaleOpts);\n this._normalized = opts.normalized;\n }\n parse(raw, index) {\n if (raw === undefined) {\n return null;\n }\n return parse(this, raw);\n }\n beforeLayout() {\n super.beforeLayout();\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n }\n determineDataLimits() {\n const me = this;\n const options = me.options;\n const adapter = me._adapter;\n const unit = options.time.unit || 'day';\n let {min, max, minDefined, maxDefined} = me.getUserBounds();\n function _applyBounds(bounds) {\n if (!minDefined && !isNaN(bounds.min)) {\n min = Math.min(min, bounds.min);\n }\n if (!maxDefined && !isNaN(bounds.max)) {\n max = Math.max(max, bounds.max);\n }\n }\n if (!minDefined || !maxDefined) {\n _applyBounds(me._getLabelBounds());\n if (options.bounds !== 'ticks' || options.ticks.source !== 'labels') {\n _applyBounds(me.getMinMax(false));\n }\n }\n min = isNumberFinite(min) && !isNaN(min) ? min : +adapter.startOf(Date.now(), unit);\n max = isNumberFinite(max) && !isNaN(max) ? max : +adapter.endOf(Date.now(), unit) + 1;\n me.min = Math.min(min, max - 1);\n me.max = Math.max(min + 1, max);\n }\n _getLabelBounds() {\n const arr = this.getLabelTimestamps();\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n if (arr.length) {\n min = arr[0];\n max = arr[arr.length - 1];\n }\n return {min, max};\n }\n buildTicks() {\n const me = this;\n const options = me.options;\n const timeOpts = options.time;\n const tickOpts = options.ticks;\n const timestamps = tickOpts.source === 'labels' ? me.getLabelTimestamps() : me._generate();\n if (options.bounds === 'ticks' && timestamps.length) {\n me.min = me._userMin || timestamps[0];\n me.max = me._userMax || timestamps[timestamps.length - 1];\n }\n const min = me.min;\n const max = me.max;\n const ticks = _filterBetween(timestamps, min, max);\n me._unit = timeOpts.unit || (tickOpts.autoSkip\n ? determineUnitForAutoTicks(timeOpts.minUnit, me.min, me.max, me._getLabelCapacity(min))\n : determineUnitForFormatting(me, ticks.length, timeOpts.minUnit, me.min, me.max));\n me._majorUnit = !tickOpts.major.enabled || me._unit === 'year' ? undefined\n : determineMajorUnit(me._unit);\n me.initOffsets(timestamps);\n if (options.reverse) {\n ticks.reverse();\n }\n return ticksFromTimestamps(me, ticks, me._majorUnit);\n }\n initOffsets(timestamps) {\n const me = this;\n let start = 0;\n let end = 0;\n let first, last;\n if (me.options.offset && timestamps.length) {\n first = me.getDecimalForValue(timestamps[0]);\n if (timestamps.length === 1) {\n start = 1 - first;\n } else {\n start = (me.getDecimalForValue(timestamps[1]) - first) / 2;\n }\n last = me.getDecimalForValue(timestamps[timestamps.length - 1]);\n if (timestamps.length === 1) {\n end = last;\n } else {\n end = (last - me.getDecimalForValue(timestamps[timestamps.length - 2])) / 2;\n }\n }\n const limit = timestamps.length < 3 ? 0.5 : 0.25;\n start = _limitValue(start, 0, limit);\n end = _limitValue(end, 0, limit);\n me._offsets = {start, end, factor: 1 / (start + 1 + end)};\n }\n _generate() {\n const me = this;\n const adapter = me._adapter;\n const min = me.min;\n const max = me.max;\n const options = me.options;\n const timeOpts = options.time;\n const minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, me._getLabelCapacity(min));\n const stepSize = valueOrDefault(timeOpts.stepSize, 1);\n const weekday = minor === 'week' ? timeOpts.isoWeekday : false;\n const hasWeekday = isNumber(weekday) || weekday === true;\n const ticks = {};\n let first = min;\n let time, count;\n if (hasWeekday) {\n first = +adapter.startOf(first, 'isoWeek', weekday);\n }\n first = +adapter.startOf(first, hasWeekday ? 'day' : minor);\n if (adapter.diff(max, min, minor) > 100000 * stepSize) {\n throw new Error(min + ' and ' + max + ' are too far apart with stepSize of ' + stepSize + ' ' + minor);\n }\n const timestamps = options.ticks.source === 'data' && me.getDataTimestamps();\n for (time = first, count = 0; time < max; time = +adapter.add(time, stepSize, minor), count++) {\n addTick(ticks, time, timestamps);\n }\n if (time === max || options.bounds === 'ticks' || count === 1) {\n addTick(ticks, time, timestamps);\n }\n return Object.keys(ticks).sort((a, b) => a - b).map(x => +x);\n }\n getLabelForValue(value) {\n const me = this;\n const adapter = me._adapter;\n const timeOpts = me.options.time;\n if (timeOpts.tooltipFormat) {\n return adapter.format(value, timeOpts.tooltipFormat);\n }\n return adapter.format(value, timeOpts.displayFormats.datetime);\n }\n _tickFormatFunction(time, index, ticks, format) {\n const me = this;\n const options = me.options;\n const formats = options.time.displayFormats;\n const unit = me._unit;\n const majorUnit = me._majorUnit;\n const minorFormat = unit && formats[unit];\n const majorFormat = majorUnit && formats[majorUnit];\n const tick = ticks[index];\n const major = majorUnit && majorFormat && tick && tick.major;\n const label = me._adapter.format(time, format || (major ? majorFormat : minorFormat));\n const formatter = options.ticks.callback;\n return formatter ? callback(formatter, [label, index, ticks], me) : label;\n }\n generateTickLabels(ticks) {\n let i, ilen, tick;\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n tick = ticks[i];\n tick.label = this._tickFormatFunction(tick.value, i, ticks);\n }\n }\n getDecimalForValue(value) {\n const me = this;\n return value === null ? NaN : (value - me.min) / (me.max - me.min);\n }\n getPixelForValue(value) {\n const me = this;\n const offsets = me._offsets;\n const pos = me.getDecimalForValue(value);\n return me.getPixelForDecimal((offsets.start + pos) * offsets.factor);\n }\n getValueForPixel(pixel) {\n const me = this;\n const offsets = me._offsets;\n const pos = me.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return me.min + pos * (me.max - me.min);\n }\n _getLabelSize(label) {\n const me = this;\n const ticksOpts = me.options.ticks;\n const tickLabelWidth = me.ctx.measureText(label).width;\n const angle = toRadians(me.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation);\n const cosRotation = Math.cos(angle);\n const sinRotation = Math.sin(angle);\n const tickFontSize = me._resolveTickFontOptions(0).size;\n return {\n w: (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation),\n h: (tickLabelWidth * sinRotation) + (tickFontSize * cosRotation)\n };\n }\n _getLabelCapacity(exampleTime) {\n const me = this;\n const timeOpts = me.options.time;\n const displayFormats = timeOpts.displayFormats;\n const format = displayFormats[timeOpts.unit] || displayFormats.millisecond;\n const exampleLabel = me._tickFormatFunction(exampleTime, 0, ticksFromTimestamps(me, [exampleTime], me._majorUnit), format);\n const size = me._getLabelSize(exampleLabel);\n const capacity = Math.floor(me.isHorizontal() ? me.width / size.w : me.height / size.h) - 1;\n return capacity > 0 ? capacity : 1;\n }\n getDataTimestamps() {\n const me = this;\n let timestamps = me._cache.data || [];\n let i, ilen;\n if (timestamps.length) {\n return timestamps;\n }\n const metas = me.getMatchingVisibleMetas();\n if (me._normalized && metas.length) {\n return (me._cache.data = metas[0].controller.getAllParsedValues(me));\n }\n for (i = 0, ilen = metas.length; i < ilen; ++i) {\n timestamps = timestamps.concat(metas[i].controller.getAllParsedValues(me));\n }\n return (me._cache.data = me.normalize(timestamps));\n }\n getLabelTimestamps() {\n const me = this;\n const timestamps = me._cache.labels || [];\n let i, ilen;\n if (timestamps.length) {\n return timestamps;\n }\n const labels = me.getLabels();\n for (i = 0, ilen = labels.length; i < ilen; ++i) {\n timestamps.push(parse(me, labels[i]));\n }\n return (me._cache.labels = me._normalized ? timestamps : me.normalize(timestamps));\n }\n normalize(values) {\n return _arrayUnique(values.sort(sorter));\n }\n}\nTimeScale.id = 'time';\nTimeScale.defaults = {\n bounds: 'data',\n adapters: {},\n time: {\n parser: false,\n unit: false,\n round: false,\n isoWeekday: false,\n minUnit: 'millisecond',\n displayFormats: {}\n },\n ticks: {\n source: 'auto',\n major: {\n enabled: false\n }\n }\n};\n\nfunction interpolate(table, val, reverse) {\n let lo = 0;\n let hi = table.length - 1;\n let prevSource, nextSource, prevTarget, nextTarget;\n if (reverse) {\n if (val >= table[lo].pos && val <= table[hi].pos) {\n ({lo, hi} = _lookupByKey(table, 'pos', val));\n }\n ({pos: prevSource, time: prevTarget} = table[lo]);\n ({pos: nextSource, time: nextTarget} = table[hi]);\n } else {\n if (val >= table[lo].time && val <= table[hi].time) {\n ({lo, hi} = _lookupByKey(table, 'time', val));\n }\n ({time: prevSource, pos: prevTarget} = table[lo]);\n ({time: nextSource, pos: nextTarget} = table[hi]);\n }\n const span = nextSource - prevSource;\n return span ? prevTarget + (nextTarget - prevTarget) * (val - prevSource) / span : prevTarget;\n}\nclass TimeSeriesScale extends TimeScale {\n constructor(props) {\n super(props);\n this._table = [];\n this._minPos = undefined;\n this._tableRange = undefined;\n }\n initOffsets() {\n const me = this;\n const timestamps = me._getTimestampsForTable();\n const table = me._table = me.buildLookupTable(timestamps);\n me._minPos = interpolate(table, me.min);\n me._tableRange = interpolate(table, me.max) - me._minPos;\n super.initOffsets(timestamps);\n }\n buildLookupTable(timestamps) {\n const {min, max} = this;\n const items = [];\n const table = [];\n let i, ilen, prev, curr, next;\n for (i = 0, ilen = timestamps.length; i < ilen; ++i) {\n curr = timestamps[i];\n if (curr >= min && curr <= max) {\n items.push(curr);\n }\n }\n if (items.length < 2) {\n return [\n {time: min, pos: 0},\n {time: max, pos: 1}\n ];\n }\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n next = items[i + 1];\n prev = items[i - 1];\n curr = items[i];\n if (Math.round((next + prev) / 2) !== curr) {\n table.push({time: curr, pos: i / (ilen - 1)});\n }\n }\n return table;\n }\n _getTimestampsForTable() {\n const me = this;\n let timestamps = me._cache.all || [];\n if (timestamps.length) {\n return timestamps;\n }\n const data = me.getDataTimestamps();\n const label = me.getLabelTimestamps();\n if (data.length && label.length) {\n timestamps = me.normalize(data.concat(label));\n } else {\n timestamps = data.length ? data : label;\n }\n timestamps = me._cache.all = timestamps;\n return timestamps;\n }\n getDecimalForValue(value) {\n return (interpolate(this._table, value) - this._minPos) / this._tableRange;\n }\n getValueForPixel(pixel) {\n const me = this;\n const offsets = me._offsets;\n const decimal = me.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return interpolate(me._table, decimal * me._tableRange + me._minPos, true);\n }\n}\nTimeSeriesScale.id = 'timeseries';\nTimeSeriesScale.defaults = TimeScale.defaults;\n\nvar scales = /*#__PURE__*/Object.freeze({\n__proto__: null,\nCategoryScale: CategoryScale,\nLinearScale: LinearScale,\nLogarithmicScale: LogarithmicScale,\nRadialLinearScale: RadialLinearScale,\nTimeScale: TimeScale,\nTimeSeriesScale: TimeSeriesScale\n});\n\nconst registerables = [\n controllers,\n elements,\n plugins,\n scales,\n];\n\nexport { Animation, Animations, ArcElement, BarController, BarElement, BasePlatform, BasicPlatform, BubbleController, CategoryScale, Chart, DatasetController, plugin_decimation as Decimation, DomPlatform, DoughnutController, Element, plugin_filler as Filler, Interaction, plugin_legend as Legend, LineController, LineElement, LinearScale, LogarithmicScale, PieController, PointElement, PolarAreaController, RadarController, RadialLinearScale, Scale, ScatterController, plugin_subtitle as SubTitle, Ticks, TimeScale, TimeSeriesScale, plugin_title as Title, plugin_tooltip as Tooltip, adapters as _adapters, _detectPlatform, animator, controllers, elements, layouts, plugins, registerables, registry, scales };\n","/*!\n * chartjs-plugin-datalabels v2.0.0\n * https://chartjs-plugin-datalabels.netlify.app\n * (c) 2017-2021 chartjs-plugin-datalabels contributors\n * Released under the MIT license\n */\nimport { isNullOrUndef, merge, toFont, resolve, toPadding, valueOrDefault, callback, isObject, each } from 'chart.js/helpers';\nimport { defaults as defaults$1, ArcElement, PointElement, BarElement } from 'chart.js';\n\nvar devicePixelRatio = (function() {\n if (typeof window !== 'undefined') {\n if (window.devicePixelRatio) {\n return window.devicePixelRatio;\n }\n\n // devicePixelRatio is undefined on IE10\n // https://stackoverflow.com/a/20204180/8837887\n // https://github.com/chartjs/chartjs-plugin-datalabels/issues/85\n var screen = window.screen;\n if (screen) {\n return (screen.deviceXDPI || 1) / (screen.logicalXDPI || 1);\n }\n }\n\n return 1;\n}());\n\nvar utils = {\n // @todo move this in Chart.helpers.toTextLines\n toTextLines: function(inputs) {\n var lines = [];\n var input;\n\n inputs = [].concat(inputs);\n while (inputs.length) {\n input = inputs.pop();\n if (typeof input === 'string') {\n lines.unshift.apply(lines, input.split('\\n'));\n } else if (Array.isArray(input)) {\n inputs.push.apply(inputs, input);\n } else if (!isNullOrUndef(inputs)) {\n lines.unshift('' + input);\n }\n }\n\n return lines;\n },\n\n // @todo move this in Chart.helpers.canvas.textSize\n // @todo cache calls of measureText if font doesn't change?!\n textSize: function(ctx, lines, font) {\n var items = [].concat(lines);\n var ilen = items.length;\n var prev = ctx.font;\n var width = 0;\n var i;\n\n ctx.font = font.string;\n\n for (i = 0; i < ilen; ++i) {\n width = Math.max(ctx.measureText(items[i]).width, width);\n }\n\n ctx.font = prev;\n\n return {\n height: ilen * font.lineHeight,\n width: width\n };\n },\n\n /**\n * Returns value bounded by min and max. This is equivalent to max(min, min(value, max)).\n * @todo move this method in Chart.helpers.bound\n * https://doc.qt.io/qt-5/qtglobal.html#qBound\n */\n bound: function(min, value, max) {\n return Math.max(min, Math.min(value, max));\n },\n\n /**\n * Returns an array of pair [value, state] where state is:\n * * -1: value is only in a0 (removed)\n * * 1: value is only in a1 (added)\n */\n arrayDiff: function(a0, a1) {\n var prev = a0.slice();\n var updates = [];\n var i, j, ilen, v;\n\n for (i = 0, ilen = a1.length; i < ilen; ++i) {\n v = a1[i];\n j = prev.indexOf(v);\n\n if (j === -1) {\n updates.push([v, 1]);\n } else {\n prev.splice(j, 1);\n }\n }\n\n for (i = 0, ilen = prev.length; i < ilen; ++i) {\n updates.push([prev[i], -1]);\n }\n\n return updates;\n },\n\n /**\n * https://github.com/chartjs/chartjs-plugin-datalabels/issues/70\n */\n rasterize: function(v) {\n return Math.round(v * devicePixelRatio) / devicePixelRatio;\n }\n};\n\nfunction orient(point, origin) {\n var x0 = origin.x;\n var y0 = origin.y;\n\n if (x0 === null) {\n return {x: 0, y: -1};\n }\n if (y0 === null) {\n return {x: 1, y: 0};\n }\n\n var dx = point.x - x0;\n var dy = point.y - y0;\n var ln = Math.sqrt(dx * dx + dy * dy);\n\n return {\n x: ln ? dx / ln : 0,\n y: ln ? dy / ln : -1\n };\n}\n\nfunction aligned(x, y, vx, vy, align) {\n switch (align) {\n case 'center':\n vx = vy = 0;\n break;\n case 'bottom':\n vx = 0;\n vy = 1;\n break;\n case 'right':\n vx = 1;\n vy = 0;\n break;\n case 'left':\n vx = -1;\n vy = 0;\n break;\n case 'top':\n vx = 0;\n vy = -1;\n break;\n case 'start':\n vx = -vx;\n vy = -vy;\n break;\n case 'end':\n // keep natural orientation\n break;\n default:\n // clockwise rotation (in degree)\n align *= (Math.PI / 180);\n vx = Math.cos(align);\n vy = Math.sin(align);\n break;\n }\n\n return {\n x: x,\n y: y,\n vx: vx,\n vy: vy\n };\n}\n\n// Line clipping (Cohen–Sutherland algorithm)\n// https://en.wikipedia.org/wiki/Cohen–Sutherland_algorithm\n\nvar R_INSIDE = 0;\nvar R_LEFT = 1;\nvar R_RIGHT = 2;\nvar R_BOTTOM = 4;\nvar R_TOP = 8;\n\nfunction region(x, y, rect) {\n var res = R_INSIDE;\n\n if (x < rect.left) {\n res |= R_LEFT;\n } else if (x > rect.right) {\n res |= R_RIGHT;\n }\n if (y < rect.top) {\n res |= R_TOP;\n } else if (y > rect.bottom) {\n res |= R_BOTTOM;\n }\n\n return res;\n}\n\nfunction clipped(segment, area) {\n var x0 = segment.x0;\n var y0 = segment.y0;\n var x1 = segment.x1;\n var y1 = segment.y1;\n var r0 = region(x0, y0, area);\n var r1 = region(x1, y1, area);\n var r, x, y;\n\n // eslint-disable-next-line no-constant-condition\n while (true) {\n if (!(r0 | r1) || (r0 & r1)) {\n // both points inside or on the same side: no clipping\n break;\n }\n\n // at least one point is outside\n r = r0 || r1;\n\n if (r & R_TOP) {\n x = x0 + (x1 - x0) * (area.top - y0) / (y1 - y0);\n y = area.top;\n } else if (r & R_BOTTOM) {\n x = x0 + (x1 - x0) * (area.bottom - y0) / (y1 - y0);\n y = area.bottom;\n } else if (r & R_RIGHT) {\n y = y0 + (y1 - y0) * (area.right - x0) / (x1 - x0);\n x = area.right;\n } else if (r & R_LEFT) {\n y = y0 + (y1 - y0) * (area.left - x0) / (x1 - x0);\n x = area.left;\n }\n\n if (r === r0) {\n x0 = x;\n y0 = y;\n r0 = region(x0, y0, area);\n } else {\n x1 = x;\n y1 = y;\n r1 = region(x1, y1, area);\n }\n }\n\n return {\n x0: x0,\n x1: x1,\n y0: y0,\n y1: y1\n };\n}\n\nfunction compute$1(range, config) {\n var anchor = config.anchor;\n var segment = range;\n var x, y;\n\n if (config.clamp) {\n segment = clipped(segment, config.area);\n }\n\n if (anchor === 'start') {\n x = segment.x0;\n y = segment.y0;\n } else if (anchor === 'end') {\n x = segment.x1;\n y = segment.y1;\n } else {\n x = (segment.x0 + segment.x1) / 2;\n y = (segment.y0 + segment.y1) / 2;\n }\n\n return aligned(x, y, range.vx, range.vy, config.align);\n}\n\nvar positioners = {\n arc: function(el, config) {\n var angle = (el.startAngle + el.endAngle) / 2;\n var vx = Math.cos(angle);\n var vy = Math.sin(angle);\n var r0 = el.innerRadius;\n var r1 = el.outerRadius;\n\n return compute$1({\n x0: el.x + vx * r0,\n y0: el.y + vy * r0,\n x1: el.x + vx * r1,\n y1: el.y + vy * r1,\n vx: vx,\n vy: vy\n }, config);\n },\n\n point: function(el, config) {\n var v = orient(el, config.origin);\n var rx = v.x * el.options.radius;\n var ry = v.y * el.options.radius;\n\n return compute$1({\n x0: el.x - rx,\n y0: el.y - ry,\n x1: el.x + rx,\n y1: el.y + ry,\n vx: v.x,\n vy: v.y\n }, config);\n },\n\n bar: function(el, config) {\n var v = orient(el, config.origin);\n var x = el.x;\n var y = el.y;\n var sx = 0;\n var sy = 0;\n\n if (el.horizontal) {\n x = Math.min(el.x, el.base);\n sx = Math.abs(el.base - el.x);\n } else {\n y = Math.min(el.y, el.base);\n sy = Math.abs(el.base - el.y);\n }\n\n return compute$1({\n x0: x,\n y0: y + sy,\n x1: x + sx,\n y1: y,\n vx: v.x,\n vy: v.y\n }, config);\n },\n\n fallback: function(el, config) {\n var v = orient(el, config.origin);\n\n return compute$1({\n x0: el.x,\n y0: el.y,\n x1: el.x,\n y1: el.y,\n vx: v.x,\n vy: v.y\n }, config);\n }\n};\n\nvar rasterize = utils.rasterize;\n\nfunction boundingRects(model) {\n var borderWidth = model.borderWidth || 0;\n var padding = model.padding;\n var th = model.size.height;\n var tw = model.size.width;\n var tx = -tw / 2;\n var ty = -th / 2;\n\n return {\n frame: {\n x: tx - padding.left - borderWidth,\n y: ty - padding.top - borderWidth,\n w: tw + padding.width + borderWidth * 2,\n h: th + padding.height + borderWidth * 2\n },\n text: {\n x: tx,\n y: ty,\n w: tw,\n h: th\n }\n };\n}\n\nfunction getScaleOrigin(el, context) {\n var scale = context.chart.getDatasetMeta(context.datasetIndex).vScale;\n\n if (!scale) {\n return null;\n }\n\n if (scale.xCenter !== undefined && scale.yCenter !== undefined) {\n return {x: scale.xCenter, y: scale.yCenter};\n }\n\n var pixel = scale.getBasePixel();\n return el.horizontal ?\n {x: pixel, y: null} :\n {x: null, y: pixel};\n}\n\nfunction getPositioner(el) {\n if (el instanceof ArcElement) {\n return positioners.arc;\n }\n if (el instanceof PointElement) {\n return positioners.point;\n }\n if (el instanceof BarElement) {\n return positioners.bar;\n }\n return positioners.fallback;\n}\n\nfunction drawRoundedRect(ctx, x, y, w, h, radius) {\n var HALF_PI = Math.PI / 2;\n\n if (radius) {\n var r = Math.min(radius, h / 2, w / 2);\n var left = x + r;\n var top = y + r;\n var right = x + w - r;\n var bottom = y + h - r;\n\n ctx.moveTo(x, top);\n if (left < right && top < bottom) {\n ctx.arc(left, top, r, -Math.PI, -HALF_PI);\n ctx.arc(right, top, r, -HALF_PI, 0);\n ctx.arc(right, bottom, r, 0, HALF_PI);\n ctx.arc(left, bottom, r, HALF_PI, Math.PI);\n } else if (left < right) {\n ctx.moveTo(left, y);\n ctx.arc(right, top, r, -HALF_PI, HALF_PI);\n ctx.arc(left, top, r, HALF_PI, Math.PI + HALF_PI);\n } else if (top < bottom) {\n ctx.arc(left, top, r, -Math.PI, 0);\n ctx.arc(left, bottom, r, 0, Math.PI);\n } else {\n ctx.arc(left, top, r, -Math.PI, Math.PI);\n }\n ctx.closePath();\n ctx.moveTo(x, y);\n } else {\n ctx.rect(x, y, w, h);\n }\n}\n\nfunction drawFrame(ctx, rect, model) {\n var bgColor = model.backgroundColor;\n var borderColor = model.borderColor;\n var borderWidth = model.borderWidth;\n\n if (!bgColor && (!borderColor || !borderWidth)) {\n return;\n }\n\n ctx.beginPath();\n\n drawRoundedRect(\n ctx,\n rasterize(rect.x) + borderWidth / 2,\n rasterize(rect.y) + borderWidth / 2,\n rasterize(rect.w) - borderWidth,\n rasterize(rect.h) - borderWidth,\n model.borderRadius);\n\n ctx.closePath();\n\n if (bgColor) {\n ctx.fillStyle = bgColor;\n ctx.fill();\n }\n\n if (borderColor && borderWidth) {\n ctx.strokeStyle = borderColor;\n ctx.lineWidth = borderWidth;\n ctx.lineJoin = 'miter';\n ctx.stroke();\n }\n}\n\nfunction textGeometry(rect, align, font) {\n var h = font.lineHeight;\n var w = rect.w;\n var x = rect.x;\n var y = rect.y + h / 2;\n\n if (align === 'center') {\n x += w / 2;\n } else if (align === 'end' || align === 'right') {\n x += w;\n }\n\n return {\n h: h,\n w: w,\n x: x,\n y: y\n };\n}\n\nfunction drawTextLine(ctx, text, cfg) {\n var shadow = ctx.shadowBlur;\n var stroked = cfg.stroked;\n var x = rasterize(cfg.x);\n var y = rasterize(cfg.y);\n var w = rasterize(cfg.w);\n\n if (stroked) {\n ctx.strokeText(text, x, y, w);\n }\n\n if (cfg.filled) {\n if (shadow && stroked) {\n // Prevent drawing shadow on both the text stroke and fill, so\n // if the text is stroked, remove the shadow for the text fill.\n ctx.shadowBlur = 0;\n }\n\n ctx.fillText(text, x, y, w);\n\n if (shadow && stroked) {\n ctx.shadowBlur = shadow;\n }\n }\n}\n\nfunction drawText(ctx, lines, rect, model) {\n var align = model.textAlign;\n var color = model.color;\n var filled = !!color;\n var font = model.font;\n var ilen = lines.length;\n var strokeColor = model.textStrokeColor;\n var strokeWidth = model.textStrokeWidth;\n var stroked = strokeColor && strokeWidth;\n var i;\n\n if (!ilen || (!filled && !stroked)) {\n return;\n }\n\n // Adjust coordinates based on text alignment and line height\n rect = textGeometry(rect, align, font);\n\n ctx.font = font.string;\n ctx.textAlign = align;\n ctx.textBaseline = 'middle';\n ctx.shadowBlur = model.textShadowBlur;\n ctx.shadowColor = model.textShadowColor;\n\n if (filled) {\n ctx.fillStyle = color;\n }\n if (stroked) {\n ctx.lineJoin = 'round';\n ctx.lineWidth = strokeWidth;\n ctx.strokeStyle = strokeColor;\n }\n\n for (i = 0, ilen = lines.length; i < ilen; ++i) {\n drawTextLine(ctx, lines[i], {\n stroked: stroked,\n filled: filled,\n w: rect.w,\n x: rect.x,\n y: rect.y + rect.h * i\n });\n }\n}\n\nvar Label = function(config, ctx, el, index) {\n var me = this;\n\n me._config = config;\n me._index = index;\n me._model = null;\n me._rects = null;\n me._ctx = ctx;\n me._el = el;\n};\n\nmerge(Label.prototype, {\n /**\n * @private\n */\n _modelize: function(display, lines, config, context) {\n var me = this;\n var index = me._index;\n var font = toFont(resolve([config.font, {}], context, index));\n var color = resolve([config.color, defaults$1.color], context, index);\n\n return {\n align: resolve([config.align, 'center'], context, index),\n anchor: resolve([config.anchor, 'center'], context, index),\n area: context.chart.chartArea,\n backgroundColor: resolve([config.backgroundColor, null], context, index),\n borderColor: resolve([config.borderColor, null], context, index),\n borderRadius: resolve([config.borderRadius, 0], context, index),\n borderWidth: resolve([config.borderWidth, 0], context, index),\n clamp: resolve([config.clamp, false], context, index),\n clip: resolve([config.clip, false], context, index),\n color: color,\n display: display,\n font: font,\n lines: lines,\n offset: resolve([config.offset, 0], context, index),\n opacity: resolve([config.opacity, 1], context, index),\n origin: getScaleOrigin(me._el, context),\n padding: toPadding(resolve([config.padding, 0], context, index)),\n positioner: getPositioner(me._el),\n rotation: resolve([config.rotation, 0], context, index) * (Math.PI / 180),\n size: utils.textSize(me._ctx, lines, font),\n textAlign: resolve([config.textAlign, 'start'], context, index),\n textShadowBlur: resolve([config.textShadowBlur, 0], context, index),\n textShadowColor: resolve([config.textShadowColor, color], context, index),\n textStrokeColor: resolve([config.textStrokeColor, color], context, index),\n textStrokeWidth: resolve([config.textStrokeWidth, 0], context, index)\n };\n },\n\n update: function(context) {\n var me = this;\n var model = null;\n var rects = null;\n var index = me._index;\n var config = me._config;\n var value, label, lines;\n\n // We first resolve the display option (separately) to avoid computing\n // other options in case the label is hidden (i.e. display: false).\n var display = resolve([config.display, true], context, index);\n\n if (display) {\n value = context.dataset.data[index];\n label = valueOrDefault(callback(config.formatter, [value, context]), value);\n lines = isNullOrUndef(label) ? [] : utils.toTextLines(label);\n\n if (lines.length) {\n model = me._modelize(display, lines, config, context);\n rects = boundingRects(model);\n }\n }\n\n me._model = model;\n me._rects = rects;\n },\n\n geometry: function() {\n return this._rects ? this._rects.frame : {};\n },\n\n rotation: function() {\n return this._model ? this._model.rotation : 0;\n },\n\n visible: function() {\n return this._model && this._model.opacity;\n },\n\n model: function() {\n return this._model;\n },\n\n draw: function(chart, center) {\n var me = this;\n var ctx = chart.ctx;\n var model = me._model;\n var rects = me._rects;\n var area;\n\n if (!this.visible()) {\n return;\n }\n\n ctx.save();\n\n if (model.clip) {\n area = model.area;\n ctx.beginPath();\n ctx.rect(\n area.left,\n area.top,\n area.right - area.left,\n area.bottom - area.top);\n ctx.clip();\n }\n\n ctx.globalAlpha = utils.bound(0, model.opacity, 1);\n ctx.translate(rasterize(center.x), rasterize(center.y));\n ctx.rotate(model.rotation);\n\n drawFrame(ctx, rects.frame, model);\n drawText(ctx, model.lines, rects.text, model);\n\n ctx.restore();\n }\n});\n\nvar MIN_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991; // eslint-disable-line es/no-number-minsafeinteger\nvar MAX_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991; // eslint-disable-line es/no-number-maxsafeinteger\n\nfunction rotated(point, center, angle) {\n var cos = Math.cos(angle);\n var sin = Math.sin(angle);\n var cx = center.x;\n var cy = center.y;\n\n return {\n x: cx + cos * (point.x - cx) - sin * (point.y - cy),\n y: cy + sin * (point.x - cx) + cos * (point.y - cy)\n };\n}\n\nfunction projected(points, axis) {\n var min = MAX_INTEGER;\n var max = MIN_INTEGER;\n var origin = axis.origin;\n var i, pt, vx, vy, dp;\n\n for (i = 0; i < points.length; ++i) {\n pt = points[i];\n vx = pt.x - origin.x;\n vy = pt.y - origin.y;\n dp = axis.vx * vx + axis.vy * vy;\n min = Math.min(min, dp);\n max = Math.max(max, dp);\n }\n\n return {\n min: min,\n max: max\n };\n}\n\nfunction toAxis(p0, p1) {\n var vx = p1.x - p0.x;\n var vy = p1.y - p0.y;\n var ln = Math.sqrt(vx * vx + vy * vy);\n\n return {\n vx: (p1.x - p0.x) / ln,\n vy: (p1.y - p0.y) / ln,\n origin: p0,\n ln: ln\n };\n}\n\nvar HitBox = function() {\n this._rotation = 0;\n this._rect = {\n x: 0,\n y: 0,\n w: 0,\n h: 0\n };\n};\n\nmerge(HitBox.prototype, {\n center: function() {\n var r = this._rect;\n return {\n x: r.x + r.w / 2,\n y: r.y + r.h / 2\n };\n },\n\n update: function(center, rect, rotation) {\n this._rotation = rotation;\n this._rect = {\n x: rect.x + center.x,\n y: rect.y + center.y,\n w: rect.w,\n h: rect.h\n };\n },\n\n contains: function(point) {\n var me = this;\n var margin = 1;\n var rect = me._rect;\n\n point = rotated(point, me.center(), -me._rotation);\n\n return !(point.x < rect.x - margin\n || point.y < rect.y - margin\n || point.x > rect.x + rect.w + margin * 2\n || point.y > rect.y + rect.h + margin * 2);\n },\n\n // Separating Axis Theorem\n // https://gamedevelopment.tutsplus.com/tutorials/collision-detection-using-the-separating-axis-theorem--gamedev-169\n intersects: function(other) {\n var r0 = this._points();\n var r1 = other._points();\n var axes = [\n toAxis(r0[0], r0[1]),\n toAxis(r0[0], r0[3])\n ];\n var i, pr0, pr1;\n\n if (this._rotation !== other._rotation) {\n // Only separate with r1 axis if the rotation is different,\n // else it's enough to separate r0 and r1 with r0 axis only!\n axes.push(\n toAxis(r1[0], r1[1]),\n toAxis(r1[0], r1[3])\n );\n }\n\n for (i = 0; i < axes.length; ++i) {\n pr0 = projected(r0, axes[i]);\n pr1 = projected(r1, axes[i]);\n\n if (pr0.max < pr1.min || pr1.max < pr0.min) {\n return false;\n }\n }\n\n return true;\n },\n\n /**\n * @private\n */\n _points: function() {\n var me = this;\n var rect = me._rect;\n var angle = me._rotation;\n var center = me.center();\n\n return [\n rotated({x: rect.x, y: rect.y}, center, angle),\n rotated({x: rect.x + rect.w, y: rect.y}, center, angle),\n rotated({x: rect.x + rect.w, y: rect.y + rect.h}, center, angle),\n rotated({x: rect.x, y: rect.y + rect.h}, center, angle)\n ];\n }\n});\n\nfunction coordinates(el, model, geometry) {\n var point = model.positioner(el, model);\n var vx = point.vx;\n var vy = point.vy;\n\n if (!vx && !vy) {\n // if aligned center, we don't want to offset the center point\n return {x: point.x, y: point.y};\n }\n\n var w = geometry.w;\n var h = geometry.h;\n\n // take in account the label rotation\n var rotation = model.rotation;\n var dx = Math.abs(w / 2 * Math.cos(rotation)) + Math.abs(h / 2 * Math.sin(rotation));\n var dy = Math.abs(w / 2 * Math.sin(rotation)) + Math.abs(h / 2 * Math.cos(rotation));\n\n // scale the unit vector (vx, vy) to get at least dx or dy equal to\n // w or h respectively (else we would calculate the distance to the\n // ellipse inscribed in the bounding rect)\n var vs = 1 / Math.max(Math.abs(vx), Math.abs(vy));\n dx *= vx * vs;\n dy *= vy * vs;\n\n // finally, include the explicit offset\n dx += model.offset * vx;\n dy += model.offset * vy;\n\n return {\n x: point.x + dx,\n y: point.y + dy\n };\n}\n\nfunction collide(labels, collider) {\n var i, j, s0, s1;\n\n // IMPORTANT Iterate in the reverse order since items at the end of the\n // list have an higher weight/priority and thus should be less impacted\n // by the overlapping strategy.\n\n for (i = labels.length - 1; i >= 0; --i) {\n s0 = labels[i].$layout;\n\n for (j = i - 1; j >= 0 && s0._visible; --j) {\n s1 = labels[j].$layout;\n\n if (s1._visible && s0._box.intersects(s1._box)) {\n collider(s0, s1);\n }\n }\n }\n\n return labels;\n}\n\nfunction compute(labels) {\n var i, ilen, label, state, geometry, center, proxy;\n\n // Initialize labels for overlap detection\n for (i = 0, ilen = labels.length; i < ilen; ++i) {\n label = labels[i];\n state = label.$layout;\n\n if (state._visible) {\n // Chart.js 3 removed el._model in favor of getProps(), making harder to\n // abstract reading values in positioners. Also, using string arrays to\n // read values (i.e. var {a,b,c} = el.getProps([\"a\",\"b\",\"c\"])) would make\n // positioners inefficient in the normal case (i.e. not the final values)\n // and the code a bit ugly, so let's use a Proxy instead.\n proxy = new Proxy(label._el, {get: (el, p) => el.getProps([p], true)[p]});\n\n geometry = label.geometry();\n center = coordinates(proxy, label.model(), geometry);\n state._box.update(center, geometry, label.rotation());\n }\n }\n\n // Auto hide overlapping labels\n return collide(labels, function(s0, s1) {\n var h0 = s0._hidable;\n var h1 = s1._hidable;\n\n if ((h0 && h1) || h1) {\n s1._visible = false;\n } else if (h0) {\n s0._visible = false;\n }\n });\n}\n\nvar layout = {\n prepare: function(datasets) {\n var labels = [];\n var i, j, ilen, jlen, label;\n\n for (i = 0, ilen = datasets.length; i < ilen; ++i) {\n for (j = 0, jlen = datasets[i].length; j < jlen; ++j) {\n label = datasets[i][j];\n labels.push(label);\n label.$layout = {\n _box: new HitBox(),\n _hidable: false,\n _visible: true,\n _set: i,\n _idx: j\n };\n }\n }\n\n // TODO New `z` option: labels with a higher z-index are drawn\n // of top of the ones with a lower index. Lowest z-index labels\n // are also discarded first when hiding overlapping labels.\n labels.sort(function(a, b) {\n var sa = a.$layout;\n var sb = b.$layout;\n\n return sa._idx === sb._idx\n ? sb._set - sa._set\n : sb._idx - sa._idx;\n });\n\n this.update(labels);\n\n return labels;\n },\n\n update: function(labels) {\n var dirty = false;\n var i, ilen, label, model, state;\n\n for (i = 0, ilen = labels.length; i < ilen; ++i) {\n label = labels[i];\n model = label.model();\n state = label.$layout;\n state._hidable = model && model.display === 'auto';\n state._visible = label.visible();\n dirty |= state._hidable;\n }\n\n if (dirty) {\n compute(labels);\n }\n },\n\n lookup: function(labels, point) {\n var i, state;\n\n // IMPORTANT Iterate in the reverse order since items at the end of\n // the list have an higher z-index, thus should be picked first.\n\n for (i = labels.length - 1; i >= 0; --i) {\n state = labels[i].$layout;\n\n if (state && state._visible && state._box.contains(point)) {\n return labels[i];\n }\n }\n\n return null;\n },\n\n draw: function(chart, labels) {\n var i, ilen, label, state, geometry, center;\n\n for (i = 0, ilen = labels.length; i < ilen; ++i) {\n label = labels[i];\n state = label.$layout;\n\n if (state._visible) {\n geometry = label.geometry();\n center = coordinates(label._el, label.model(), geometry);\n state._box.update(center, geometry, label.rotation());\n label.draw(chart, center);\n }\n }\n }\n};\n\nvar formatter = function(value) {\n if (isNullOrUndef(value)) {\n return null;\n }\n\n var label = value;\n var keys, klen, k;\n if (isObject(value)) {\n if (!isNullOrUndef(value.label)) {\n label = value.label;\n } else if (!isNullOrUndef(value.r)) {\n label = value.r;\n } else {\n label = '';\n keys = Object.keys(value);\n for (k = 0, klen = keys.length; k < klen; ++k) {\n label += (k !== 0 ? ', ' : '') + keys[k] + ': ' + value[keys[k]];\n }\n }\n }\n\n return '' + label;\n};\n\n/**\n * IMPORTANT: make sure to also update tests and TypeScript definition\n * files (`/test/specs/defaults.spec.js` and `/types/options.d.ts`)\n */\n\nvar defaults = {\n align: 'center',\n anchor: 'center',\n backgroundColor: null,\n borderColor: null,\n borderRadius: 0,\n borderWidth: 0,\n clamp: false,\n clip: false,\n color: undefined,\n display: true,\n font: {\n family: undefined,\n lineHeight: 1.2,\n size: undefined,\n style: undefined,\n weight: null\n },\n formatter: formatter,\n labels: undefined,\n listeners: {},\n offset: 4,\n opacity: 1,\n padding: {\n top: 4,\n right: 4,\n bottom: 4,\n left: 4\n },\n rotation: 0,\n textAlign: 'start',\n textStrokeColor: undefined,\n textStrokeWidth: 0,\n textShadowBlur: 0,\n textShadowColor: undefined\n};\n\n/**\n * @see https://github.com/chartjs/Chart.js/issues/4176\n */\n\nvar EXPANDO_KEY = '$datalabels';\nvar DEFAULT_KEY = '$default';\n\nfunction configure(dataset, options) {\n var override = dataset.datalabels;\n var listeners = {};\n var configs = [];\n var labels, keys;\n\n if (override === false) {\n return null;\n }\n if (override === true) {\n override = {};\n }\n\n options = merge({}, [options, override]);\n labels = options.labels || {};\n keys = Object.keys(labels);\n delete options.labels;\n\n if (keys.length) {\n keys.forEach(function(key) {\n if (labels[key]) {\n configs.push(merge({}, [\n options,\n labels[key],\n {_key: key}\n ]));\n }\n });\n } else {\n // Default label if no \"named\" label defined.\n configs.push(options);\n }\n\n // listeners: {: {: }}\n listeners = configs.reduce(function(target, config) {\n each(config.listeners || {}, function(fn, event) {\n target[event] = target[event] || {};\n target[event][config._key || DEFAULT_KEY] = fn;\n });\n\n delete config.listeners;\n return target;\n }, {});\n\n return {\n labels: configs,\n listeners: listeners\n };\n}\n\nfunction dispatchEvent(chart, listeners, label) {\n if (!listeners) {\n return;\n }\n\n var context = label.$context;\n var groups = label.$groups;\n var callback$1;\n\n if (!listeners[groups._set]) {\n return;\n }\n\n callback$1 = listeners[groups._set][groups._key];\n if (!callback$1) {\n return;\n }\n\n if (callback(callback$1, [context]) === true) {\n // Users are allowed to tweak the given context by injecting values that can be\n // used in scriptable options to display labels differently based on the current\n // event (e.g. highlight an hovered label). That's why we update the label with\n // the output context and schedule a new chart render by setting it dirty.\n chart[EXPANDO_KEY]._dirty = true;\n label.update(context);\n }\n}\n\nfunction dispatchMoveEvents(chart, listeners, previous, label) {\n var enter, leave;\n\n if (!previous && !label) {\n return;\n }\n\n if (!previous) {\n enter = true;\n } else if (!label) {\n leave = true;\n } else if (previous !== label) {\n leave = enter = true;\n }\n\n if (leave) {\n dispatchEvent(chart, listeners.leave, previous);\n }\n if (enter) {\n dispatchEvent(chart, listeners.enter, label);\n }\n}\n\nfunction handleMoveEvents(chart, event) {\n var expando = chart[EXPANDO_KEY];\n var listeners = expando._listeners;\n var previous, label;\n\n if (!listeners.enter && !listeners.leave) {\n return;\n }\n\n if (event.type === 'mousemove') {\n label = layout.lookup(expando._labels, event);\n } else if (event.type !== 'mouseout') {\n return;\n }\n\n previous = expando._hovered;\n expando._hovered = label;\n dispatchMoveEvents(chart, listeners, previous, label);\n}\n\nfunction handleClickEvents(chart, event) {\n var expando = chart[EXPANDO_KEY];\n var handlers = expando._listeners.click;\n var label = handlers && layout.lookup(expando._labels, event);\n if (label) {\n dispatchEvent(chart, handlers, label);\n }\n}\n\nvar plugin = {\n id: 'datalabels',\n\n defaults: defaults,\n\n beforeInit: function(chart) {\n chart[EXPANDO_KEY] = {\n _actives: []\n };\n },\n\n beforeUpdate: function(chart) {\n var expando = chart[EXPANDO_KEY];\n expando._listened = false;\n expando._listeners = {}; // {: {: {: }}}\n expando._datasets = []; // per dataset labels: [Label[]]\n expando._labels = []; // layouted labels: Label[]\n },\n\n afterDatasetUpdate: function(chart, args, options) {\n var datasetIndex = args.index;\n var expando = chart[EXPANDO_KEY];\n var labels = expando._datasets[datasetIndex] = [];\n var visible = chart.isDatasetVisible(datasetIndex);\n var dataset = chart.data.datasets[datasetIndex];\n var config = configure(dataset, options);\n var elements = args.meta.data || [];\n var ctx = chart.ctx;\n var i, j, ilen, jlen, cfg, key, el, label;\n\n ctx.save();\n\n for (i = 0, ilen = elements.length; i < ilen; ++i) {\n el = elements[i];\n el[EXPANDO_KEY] = [];\n\n if (visible && el && chart.getDataVisibility(i) && !el.skip) {\n for (j = 0, jlen = config.labels.length; j < jlen; ++j) {\n cfg = config.labels[j];\n key = cfg._key;\n\n label = new Label(cfg, ctx, el, i);\n label.$groups = {\n _set: datasetIndex,\n _key: key || DEFAULT_KEY\n };\n label.$context = {\n active: false,\n chart: chart,\n dataIndex: i,\n dataset: dataset,\n datasetIndex: datasetIndex\n };\n\n label.update(label.$context);\n el[EXPANDO_KEY].push(label);\n labels.push(label);\n }\n }\n }\n\n ctx.restore();\n\n // Store listeners at the chart level and per event type to optimize\n // cases where no listeners are registered for a specific event.\n merge(expando._listeners, config.listeners, {\n merger: function(event, target, source) {\n target[event] = target[event] || {};\n target[event][args.index] = source[event];\n expando._listened = true;\n }\n });\n },\n\n afterUpdate: function(chart, options) {\n chart[EXPANDO_KEY]._labels = layout.prepare(\n chart[EXPANDO_KEY]._datasets,\n options);\n },\n\n // Draw labels on top of all dataset elements\n // https://github.com/chartjs/chartjs-plugin-datalabels/issues/29\n // https://github.com/chartjs/chartjs-plugin-datalabels/issues/32\n afterDatasetsDraw: function(chart) {\n layout.draw(chart, chart[EXPANDO_KEY]._labels);\n },\n\n beforeEvent: function(chart, args) {\n // If there is no listener registered for this chart, `listened` will be false,\n // meaning we can immediately ignore the incoming event and avoid useless extra\n // computation for users who don't implement label interactions.\n if (chart[EXPANDO_KEY]._listened) {\n var event = args.event;\n switch (event.type) {\n case 'mousemove':\n case 'mouseout':\n handleMoveEvents(chart, event);\n break;\n case 'click':\n handleClickEvents(chart, event);\n break;\n }\n }\n },\n\n afterEvent: function(chart) {\n var expando = chart[EXPANDO_KEY];\n var previous = expando._actives;\n var actives = expando._actives = chart.getActiveElements();\n var updates = utils.arrayDiff(previous, actives);\n var i, ilen, j, jlen, update, label, labels;\n\n for (i = 0, ilen = updates.length; i < ilen; ++i) {\n update = updates[i];\n if (update[1]) {\n labels = update[0].element[EXPANDO_KEY] || [];\n for (j = 0, jlen = labels.length; j < jlen; ++j) {\n label = labels[j];\n label.$context.active = (update[1] === 1);\n label.update(label.$context);\n }\n }\n }\n\n if (expando._dirty || updates.length) {\n layout.update(expando._labels);\n chart.render();\n }\n\n delete expando._dirty;\n }\n};\n\nexport default plugin;\n","/*!\n * Chart.js v3.5.1\n * https://www.chartjs.org\n * (c) 2021 Chart.js Contributors\n * Released under the MIT License\n */\nfunction fontString(pixelSize, fontStyle, fontFamily) {\n return fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n}\nconst requestAnimFrame = (function() {\n if (typeof window === 'undefined') {\n return function(callback) {\n return callback();\n };\n }\n return window.requestAnimationFrame;\n}());\nfunction throttled(fn, thisArg, updateFn) {\n const updateArgs = updateFn || ((args) => Array.prototype.slice.call(args));\n let ticking = false;\n let args = [];\n return function(...rest) {\n args = updateArgs(rest);\n if (!ticking) {\n ticking = true;\n requestAnimFrame.call(window, () => {\n ticking = false;\n fn.apply(thisArg, args);\n });\n }\n };\n}\nfunction debounce(fn, delay) {\n let timeout;\n return function() {\n if (delay) {\n clearTimeout(timeout);\n timeout = setTimeout(fn, delay);\n } else {\n fn();\n }\n return delay;\n };\n}\nconst _toLeftRightCenter = (align) => align === 'start' ? 'left' : align === 'end' ? 'right' : 'center';\nconst _alignStartEnd = (align, start, end) => align === 'start' ? start : align === 'end' ? end : (start + end) / 2;\nconst _textX = (align, left, right, rtl) => {\n const check = rtl ? 'left' : 'right';\n return align === check ? right : align === 'center' ? (left + right) / 2 : left;\n};\n\nfunction noop() {}\nconst uid = (function() {\n let id = 0;\n return function() {\n return id++;\n };\n}());\nfunction isNullOrUndef(value) {\n return value === null || typeof value === 'undefined';\n}\nfunction isArray(value) {\n if (Array.isArray && Array.isArray(value)) {\n return true;\n }\n const type = Object.prototype.toString.call(value);\n if (type.substr(0, 7) === '[object' && type.substr(-6) === 'Array]') {\n return true;\n }\n return false;\n}\nfunction isObject(value) {\n return value !== null && Object.prototype.toString.call(value) === '[object Object]';\n}\nconst isNumberFinite = (value) => (typeof value === 'number' || value instanceof Number) && isFinite(+value);\nfunction finiteOrDefault(value, defaultValue) {\n return isNumberFinite(value) ? value : defaultValue;\n}\nfunction valueOrDefault(value, defaultValue) {\n return typeof value === 'undefined' ? defaultValue : value;\n}\nconst toPercentage = (value, dimension) =>\n typeof value === 'string' && value.endsWith('%') ?\n parseFloat(value) / 100\n : value / dimension;\nconst toDimension = (value, dimension) =>\n typeof value === 'string' && value.endsWith('%') ?\n parseFloat(value) / 100 * dimension\n : +value;\nfunction callback(fn, args, thisArg) {\n if (fn && typeof fn.call === 'function') {\n return fn.apply(thisArg, args);\n }\n}\nfunction each(loopable, fn, thisArg, reverse) {\n let i, len, keys;\n if (isArray(loopable)) {\n len = loopable.length;\n if (reverse) {\n for (i = len - 1; i >= 0; i--) {\n fn.call(thisArg, loopable[i], i);\n }\n } else {\n for (i = 0; i < len; i++) {\n fn.call(thisArg, loopable[i], i);\n }\n }\n } else if (isObject(loopable)) {\n keys = Object.keys(loopable);\n len = keys.length;\n for (i = 0; i < len; i++) {\n fn.call(thisArg, loopable[keys[i]], keys[i]);\n }\n }\n}\nfunction _elementsEqual(a0, a1) {\n let i, ilen, v0, v1;\n if (!a0 || !a1 || a0.length !== a1.length) {\n return false;\n }\n for (i = 0, ilen = a0.length; i < ilen; ++i) {\n v0 = a0[i];\n v1 = a1[i];\n if (v0.datasetIndex !== v1.datasetIndex || v0.index !== v1.index) {\n return false;\n }\n }\n return true;\n}\nfunction clone$1(source) {\n if (isArray(source)) {\n return source.map(clone$1);\n }\n if (isObject(source)) {\n const target = Object.create(null);\n const keys = Object.keys(source);\n const klen = keys.length;\n let k = 0;\n for (; k < klen; ++k) {\n target[keys[k]] = clone$1(source[keys[k]]);\n }\n return target;\n }\n return source;\n}\nfunction isValidKey(key) {\n return ['__proto__', 'prototype', 'constructor'].indexOf(key) === -1;\n}\nfunction _merger(key, target, source, options) {\n if (!isValidKey(key)) {\n return;\n }\n const tval = target[key];\n const sval = source[key];\n if (isObject(tval) && isObject(sval)) {\n merge(tval, sval, options);\n } else {\n target[key] = clone$1(sval);\n }\n}\nfunction merge(target, source, options) {\n const sources = isArray(source) ? source : [source];\n const ilen = sources.length;\n if (!isObject(target)) {\n return target;\n }\n options = options || {};\n const merger = options.merger || _merger;\n for (let i = 0; i < ilen; ++i) {\n source = sources[i];\n if (!isObject(source)) {\n continue;\n }\n const keys = Object.keys(source);\n for (let k = 0, klen = keys.length; k < klen; ++k) {\n merger(keys[k], target, source, options);\n }\n }\n return target;\n}\nfunction mergeIf(target, source) {\n return merge(target, source, {merger: _mergerIf});\n}\nfunction _mergerIf(key, target, source) {\n if (!isValidKey(key)) {\n return;\n }\n const tval = target[key];\n const sval = source[key];\n if (isObject(tval) && isObject(sval)) {\n mergeIf(tval, sval);\n } else if (!Object.prototype.hasOwnProperty.call(target, key)) {\n target[key] = clone$1(sval);\n }\n}\nfunction _deprecated(scope, value, previous, current) {\n if (value !== undefined) {\n console.warn(scope + ': \"' + previous +\n\t\t\t'\" is deprecated. Please use \"' + current + '\" instead');\n }\n}\nconst emptyString = '';\nconst dot = '.';\nfunction indexOfDotOrLength(key, start) {\n const idx = key.indexOf(dot, start);\n return idx === -1 ? key.length : idx;\n}\nfunction resolveObjectKey(obj, key) {\n if (key === emptyString) {\n return obj;\n }\n let pos = 0;\n let idx = indexOfDotOrLength(key, pos);\n while (obj && idx > pos) {\n obj = obj[key.substr(pos, idx - pos)];\n pos = idx + 1;\n idx = indexOfDotOrLength(key, pos);\n }\n return obj;\n}\nfunction _capitalize(str) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\nconst defined = (value) => typeof value !== 'undefined';\nconst isFunction = (value) => typeof value === 'function';\nconst setsEqual = (a, b) => {\n if (a.size !== b.size) {\n return false;\n }\n for (const item of a) {\n if (!b.has(item)) {\n return false;\n }\n }\n return true;\n};\n\nconst PI = Math.PI;\nconst TAU = 2 * PI;\nconst PITAU = TAU + PI;\nconst INFINITY = Number.POSITIVE_INFINITY;\nconst RAD_PER_DEG = PI / 180;\nconst HALF_PI = PI / 2;\nconst QUARTER_PI = PI / 4;\nconst TWO_THIRDS_PI = PI * 2 / 3;\nconst log10 = Math.log10;\nconst sign = Math.sign;\nfunction niceNum(range) {\n const roundedRange = Math.round(range);\n range = almostEquals(range, roundedRange, range / 1000) ? roundedRange : range;\n const niceRange = Math.pow(10, Math.floor(log10(range)));\n const fraction = range / niceRange;\n const niceFraction = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10;\n return niceFraction * niceRange;\n}\nfunction _factorize(value) {\n const result = [];\n const sqrt = Math.sqrt(value);\n let i;\n for (i = 1; i < sqrt; i++) {\n if (value % i === 0) {\n result.push(i);\n result.push(value / i);\n }\n }\n if (sqrt === (sqrt | 0)) {\n result.push(sqrt);\n }\n result.sort((a, b) => a - b).pop();\n return result;\n}\nfunction isNumber(n) {\n return !isNaN(parseFloat(n)) && isFinite(n);\n}\nfunction almostEquals(x, y, epsilon) {\n return Math.abs(x - y) < epsilon;\n}\nfunction almostWhole(x, epsilon) {\n const rounded = Math.round(x);\n return ((rounded - epsilon) <= x) && ((rounded + epsilon) >= x);\n}\nfunction _setMinAndMaxByKey(array, target, property) {\n let i, ilen, value;\n for (i = 0, ilen = array.length; i < ilen; i++) {\n value = array[i][property];\n if (!isNaN(value)) {\n target.min = Math.min(target.min, value);\n target.max = Math.max(target.max, value);\n }\n }\n}\nfunction toRadians(degrees) {\n return degrees * (PI / 180);\n}\nfunction toDegrees(radians) {\n return radians * (180 / PI);\n}\nfunction _decimalPlaces(x) {\n if (!isNumberFinite(x)) {\n return;\n }\n let e = 1;\n let p = 0;\n while (Math.round(x * e) / e !== x) {\n e *= 10;\n p++;\n }\n return p;\n}\nfunction getAngleFromPoint(centrePoint, anglePoint) {\n const distanceFromXCenter = anglePoint.x - centrePoint.x;\n const distanceFromYCenter = anglePoint.y - centrePoint.y;\n const radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n let angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n if (angle < (-0.5 * PI)) {\n angle += TAU;\n }\n return {\n angle,\n distance: radialDistanceFromCenter\n };\n}\nfunction distanceBetweenPoints(pt1, pt2) {\n return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n}\nfunction _angleDiff(a, b) {\n return (a - b + PITAU) % TAU - PI;\n}\nfunction _normalizeAngle(a) {\n return (a % TAU + TAU) % TAU;\n}\nfunction _angleBetween(angle, start, end, sameAngleIsFullCircle) {\n const a = _normalizeAngle(angle);\n const s = _normalizeAngle(start);\n const e = _normalizeAngle(end);\n const angleToStart = _normalizeAngle(s - a);\n const angleToEnd = _normalizeAngle(e - a);\n const startToAngle = _normalizeAngle(a - s);\n const endToAngle = _normalizeAngle(a - e);\n return a === s || a === e || (sameAngleIsFullCircle && s === e)\n || (angleToStart > angleToEnd && startToAngle < endToAngle);\n}\nfunction _limitValue(value, min, max) {\n return Math.max(min, Math.min(max, value));\n}\nfunction _int16Range(value) {\n return _limitValue(value, -32768, 32767);\n}\n\nconst atEdge = (t) => t === 0 || t === 1;\nconst elasticIn = (t, s, p) => -(Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * TAU / p));\nconst elasticOut = (t, s, p) => Math.pow(2, -10 * t) * Math.sin((t - s) * TAU / p) + 1;\nconst effects = {\n linear: t => t,\n easeInQuad: t => t * t,\n easeOutQuad: t => -t * (t - 2),\n easeInOutQuad: t => ((t /= 0.5) < 1)\n ? 0.5 * t * t\n : -0.5 * ((--t) * (t - 2) - 1),\n easeInCubic: t => t * t * t,\n easeOutCubic: t => (t -= 1) * t * t + 1,\n easeInOutCubic: t => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t\n : 0.5 * ((t -= 2) * t * t + 2),\n easeInQuart: t => t * t * t * t,\n easeOutQuart: t => -((t -= 1) * t * t * t - 1),\n easeInOutQuart: t => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t * t\n : -0.5 * ((t -= 2) * t * t * t - 2),\n easeInQuint: t => t * t * t * t * t,\n easeOutQuint: t => (t -= 1) * t * t * t * t + 1,\n easeInOutQuint: t => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t * t * t\n : 0.5 * ((t -= 2) * t * t * t * t + 2),\n easeInSine: t => -Math.cos(t * HALF_PI) + 1,\n easeOutSine: t => Math.sin(t * HALF_PI),\n easeInOutSine: t => -0.5 * (Math.cos(PI * t) - 1),\n easeInExpo: t => (t === 0) ? 0 : Math.pow(2, 10 * (t - 1)),\n easeOutExpo: t => (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1,\n easeInOutExpo: t => atEdge(t) ? t : t < 0.5\n ? 0.5 * Math.pow(2, 10 * (t * 2 - 1))\n : 0.5 * (-Math.pow(2, -10 * (t * 2 - 1)) + 2),\n easeInCirc: t => (t >= 1) ? t : -(Math.sqrt(1 - t * t) - 1),\n easeOutCirc: t => Math.sqrt(1 - (t -= 1) * t),\n easeInOutCirc: t => ((t /= 0.5) < 1)\n ? -0.5 * (Math.sqrt(1 - t * t) - 1)\n : 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1),\n easeInElastic: t => atEdge(t) ? t : elasticIn(t, 0.075, 0.3),\n easeOutElastic: t => atEdge(t) ? t : elasticOut(t, 0.075, 0.3),\n easeInOutElastic(t) {\n const s = 0.1125;\n const p = 0.45;\n return atEdge(t) ? t :\n t < 0.5\n ? 0.5 * elasticIn(t * 2, s, p)\n : 0.5 + 0.5 * elasticOut(t * 2 - 1, s, p);\n },\n easeInBack(t) {\n const s = 1.70158;\n return t * t * ((s + 1) * t - s);\n },\n easeOutBack(t) {\n const s = 1.70158;\n return (t -= 1) * t * ((s + 1) * t + s) + 1;\n },\n easeInOutBack(t) {\n let s = 1.70158;\n if ((t /= 0.5) < 1) {\n return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s));\n }\n return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2);\n },\n easeInBounce: t => 1 - effects.easeOutBounce(1 - t),\n easeOutBounce(t) {\n const m = 7.5625;\n const d = 2.75;\n if (t < (1 / d)) {\n return m * t * t;\n }\n if (t < (2 / d)) {\n return m * (t -= (1.5 / d)) * t + 0.75;\n }\n if (t < (2.5 / d)) {\n return m * (t -= (2.25 / d)) * t + 0.9375;\n }\n return m * (t -= (2.625 / d)) * t + 0.984375;\n },\n easeInOutBounce: t => (t < 0.5)\n ? effects.easeInBounce(t * 2) * 0.5\n : effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5,\n};\n\n/*!\n * @kurkle/color v0.1.9\n * https://github.com/kurkle/color#readme\n * (c) 2020 Jukka Kurkela\n * Released under the MIT License\n */\nconst map = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, A: 10, B: 11, C: 12, D: 13, E: 14, F: 15, a: 10, b: 11, c: 12, d: 13, e: 14, f: 15};\nconst hex = '0123456789ABCDEF';\nconst h1 = (b) => hex[b & 0xF];\nconst h2 = (b) => hex[(b & 0xF0) >> 4] + hex[b & 0xF];\nconst eq = (b) => (((b & 0xF0) >> 4) === (b & 0xF));\nfunction isShort(v) {\n\treturn eq(v.r) && eq(v.g) && eq(v.b) && eq(v.a);\n}\nfunction hexParse(str) {\n\tvar len = str.length;\n\tvar ret;\n\tif (str[0] === '#') {\n\t\tif (len === 4 || len === 5) {\n\t\t\tret = {\n\t\t\t\tr: 255 & map[str[1]] * 17,\n\t\t\t\tg: 255 & map[str[2]] * 17,\n\t\t\t\tb: 255 & map[str[3]] * 17,\n\t\t\t\ta: len === 5 ? map[str[4]] * 17 : 255\n\t\t\t};\n\t\t} else if (len === 7 || len === 9) {\n\t\t\tret = {\n\t\t\t\tr: map[str[1]] << 4 | map[str[2]],\n\t\t\t\tg: map[str[3]] << 4 | map[str[4]],\n\t\t\t\tb: map[str[5]] << 4 | map[str[6]],\n\t\t\t\ta: len === 9 ? (map[str[7]] << 4 | map[str[8]]) : 255\n\t\t\t};\n\t\t}\n\t}\n\treturn ret;\n}\nfunction hexString(v) {\n\tvar f = isShort(v) ? h1 : h2;\n\treturn v\n\t\t? '#' + f(v.r) + f(v.g) + f(v.b) + (v.a < 255 ? f(v.a) : '')\n\t\t: v;\n}\nfunction round(v) {\n\treturn v + 0.5 | 0;\n}\nconst lim = (v, l, h) => Math.max(Math.min(v, h), l);\nfunction p2b(v) {\n\treturn lim(round(v * 2.55), 0, 255);\n}\nfunction n2b(v) {\n\treturn lim(round(v * 255), 0, 255);\n}\nfunction b2n(v) {\n\treturn lim(round(v / 2.55) / 100, 0, 1);\n}\nfunction n2p(v) {\n\treturn lim(round(v * 100), 0, 100);\n}\nconst RGB_RE = /^rgba?\\(\\s*([-+.\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?(?:[\\s,/]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction rgbParse(str) {\n\tconst m = RGB_RE.exec(str);\n\tlet a = 255;\n\tlet r, g, b;\n\tif (!m) {\n\t\treturn;\n\t}\n\tif (m[7] !== r) {\n\t\tconst v = +m[7];\n\t\ta = 255 & (m[8] ? p2b(v) : v * 255);\n\t}\n\tr = +m[1];\n\tg = +m[3];\n\tb = +m[5];\n\tr = 255 & (m[2] ? p2b(r) : r);\n\tg = 255 & (m[4] ? p2b(g) : g);\n\tb = 255 & (m[6] ? p2b(b) : b);\n\treturn {\n\t\tr: r,\n\t\tg: g,\n\t\tb: b,\n\t\ta: a\n\t};\n}\nfunction rgbString(v) {\n\treturn v && (\n\t\tv.a < 255\n\t\t\t? `rgba(${v.r}, ${v.g}, ${v.b}, ${b2n(v.a)})`\n\t\t\t: `rgb(${v.r}, ${v.g}, ${v.b})`\n\t);\n}\nconst HUE_RE = /^(hsla?|hwb|hsv)\\(\\s*([-+.e\\d]+)(?:deg)?[\\s,]+([-+.e\\d]+)%[\\s,]+([-+.e\\d]+)%(?:[\\s,]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction hsl2rgbn(h, s, l) {\n\tconst a = s * Math.min(l, 1 - l);\n\tconst f = (n, k = (n + h / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n\treturn [f(0), f(8), f(4)];\n}\nfunction hsv2rgbn(h, s, v) {\n\tconst f = (n, k = (n + h / 60) % 6) => v - v * s * Math.max(Math.min(k, 4 - k, 1), 0);\n\treturn [f(5), f(3), f(1)];\n}\nfunction hwb2rgbn(h, w, b) {\n\tconst rgb = hsl2rgbn(h, 1, 0.5);\n\tlet i;\n\tif (w + b > 1) {\n\t\ti = 1 / (w + b);\n\t\tw *= i;\n\t\tb *= i;\n\t}\n\tfor (i = 0; i < 3; i++) {\n\t\trgb[i] *= 1 - w - b;\n\t\trgb[i] += w;\n\t}\n\treturn rgb;\n}\nfunction rgb2hsl(v) {\n\tconst range = 255;\n\tconst r = v.r / range;\n\tconst g = v.g / range;\n\tconst b = v.b / range;\n\tconst max = Math.max(r, g, b);\n\tconst min = Math.min(r, g, b);\n\tconst l = (max + min) / 2;\n\tlet h, s, d;\n\tif (max !== min) {\n\t\td = max - min;\n\t\ts = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n\t\th = max === r\n\t\t\t? ((g - b) / d) + (g < b ? 6 : 0)\n\t\t\t: max === g\n\t\t\t\t? (b - r) / d + 2\n\t\t\t\t: (r - g) / d + 4;\n\t\th = h * 60 + 0.5;\n\t}\n\treturn [h | 0, s || 0, l];\n}\nfunction calln(f, a, b, c) {\n\treturn (\n\t\tArray.isArray(a)\n\t\t\t? f(a[0], a[1], a[2])\n\t\t\t: f(a, b, c)\n\t).map(n2b);\n}\nfunction hsl2rgb(h, s, l) {\n\treturn calln(hsl2rgbn, h, s, l);\n}\nfunction hwb2rgb(h, w, b) {\n\treturn calln(hwb2rgbn, h, w, b);\n}\nfunction hsv2rgb(h, s, v) {\n\treturn calln(hsv2rgbn, h, s, v);\n}\nfunction hue(h) {\n\treturn (h % 360 + 360) % 360;\n}\nfunction hueParse(str) {\n\tconst m = HUE_RE.exec(str);\n\tlet a = 255;\n\tlet v;\n\tif (!m) {\n\t\treturn;\n\t}\n\tif (m[5] !== v) {\n\t\ta = m[6] ? p2b(+m[5]) : n2b(+m[5]);\n\t}\n\tconst h = hue(+m[2]);\n\tconst p1 = +m[3] / 100;\n\tconst p2 = +m[4] / 100;\n\tif (m[1] === 'hwb') {\n\t\tv = hwb2rgb(h, p1, p2);\n\t} else if (m[1] === 'hsv') {\n\t\tv = hsv2rgb(h, p1, p2);\n\t} else {\n\t\tv = hsl2rgb(h, p1, p2);\n\t}\n\treturn {\n\t\tr: v[0],\n\t\tg: v[1],\n\t\tb: v[2],\n\t\ta: a\n\t};\n}\nfunction rotate(v, deg) {\n\tvar h = rgb2hsl(v);\n\th[0] = hue(h[0] + deg);\n\th = hsl2rgb(h);\n\tv.r = h[0];\n\tv.g = h[1];\n\tv.b = h[2];\n}\nfunction hslString(v) {\n\tif (!v) {\n\t\treturn;\n\t}\n\tconst a = rgb2hsl(v);\n\tconst h = a[0];\n\tconst s = n2p(a[1]);\n\tconst l = n2p(a[2]);\n\treturn v.a < 255\n\t\t? `hsla(${h}, ${s}%, ${l}%, ${b2n(v.a)})`\n\t\t: `hsl(${h}, ${s}%, ${l}%)`;\n}\nconst map$1 = {\n\tx: 'dark',\n\tZ: 'light',\n\tY: 're',\n\tX: 'blu',\n\tW: 'gr',\n\tV: 'medium',\n\tU: 'slate',\n\tA: 'ee',\n\tT: 'ol',\n\tS: 'or',\n\tB: 'ra',\n\tC: 'lateg',\n\tD: 'ights',\n\tR: 'in',\n\tQ: 'turquois',\n\tE: 'hi',\n\tP: 'ro',\n\tO: 'al',\n\tN: 'le',\n\tM: 'de',\n\tL: 'yello',\n\tF: 'en',\n\tK: 'ch',\n\tG: 'arks',\n\tH: 'ea',\n\tI: 'ightg',\n\tJ: 'wh'\n};\nconst names = {\n\tOiceXe: 'f0f8ff',\n\tantiquewEte: 'faebd7',\n\taqua: 'ffff',\n\taquamarRe: '7fffd4',\n\tazuY: 'f0ffff',\n\tbeige: 'f5f5dc',\n\tbisque: 'ffe4c4',\n\tblack: '0',\n\tblanKedOmond: 'ffebcd',\n\tXe: 'ff',\n\tXeviTet: '8a2be2',\n\tbPwn: 'a52a2a',\n\tburlywood: 'deb887',\n\tcaMtXe: '5f9ea0',\n\tKartYuse: '7fff00',\n\tKocTate: 'd2691e',\n\tcSO: 'ff7f50',\n\tcSnflowerXe: '6495ed',\n\tcSnsilk: 'fff8dc',\n\tcrimson: 'dc143c',\n\tcyan: 'ffff',\n\txXe: '8b',\n\txcyan: '8b8b',\n\txgTMnPd: 'b8860b',\n\txWay: 'a9a9a9',\n\txgYF: '6400',\n\txgYy: 'a9a9a9',\n\txkhaki: 'bdb76b',\n\txmagFta: '8b008b',\n\txTivegYF: '556b2f',\n\txSange: 'ff8c00',\n\txScEd: '9932cc',\n\txYd: '8b0000',\n\txsOmon: 'e9967a',\n\txsHgYF: '8fbc8f',\n\txUXe: '483d8b',\n\txUWay: '2f4f4f',\n\txUgYy: '2f4f4f',\n\txQe: 'ced1',\n\txviTet: '9400d3',\n\tdAppRk: 'ff1493',\n\tdApskyXe: 'bfff',\n\tdimWay: '696969',\n\tdimgYy: '696969',\n\tdodgerXe: '1e90ff',\n\tfiYbrick: 'b22222',\n\tflSOwEte: 'fffaf0',\n\tfoYstWAn: '228b22',\n\tfuKsia: 'ff00ff',\n\tgaRsbSo: 'dcdcdc',\n\tghostwEte: 'f8f8ff',\n\tgTd: 'ffd700',\n\tgTMnPd: 'daa520',\n\tWay: '808080',\n\tgYF: '8000',\n\tgYFLw: 'adff2f',\n\tgYy: '808080',\n\thoneyMw: 'f0fff0',\n\thotpRk: 'ff69b4',\n\tRdianYd: 'cd5c5c',\n\tRdigo: '4b0082',\n\tivSy: 'fffff0',\n\tkhaki: 'f0e68c',\n\tlavFMr: 'e6e6fa',\n\tlavFMrXsh: 'fff0f5',\n\tlawngYF: '7cfc00',\n\tNmoncEffon: 'fffacd',\n\tZXe: 'add8e6',\n\tZcSO: 'f08080',\n\tZcyan: 'e0ffff',\n\tZgTMnPdLw: 'fafad2',\n\tZWay: 'd3d3d3',\n\tZgYF: '90ee90',\n\tZgYy: 'd3d3d3',\n\tZpRk: 'ffb6c1',\n\tZsOmon: 'ffa07a',\n\tZsHgYF: '20b2aa',\n\tZskyXe: '87cefa',\n\tZUWay: '778899',\n\tZUgYy: '778899',\n\tZstAlXe: 'b0c4de',\n\tZLw: 'ffffe0',\n\tlime: 'ff00',\n\tlimegYF: '32cd32',\n\tlRF: 'faf0e6',\n\tmagFta: 'ff00ff',\n\tmaPon: '800000',\n\tVaquamarRe: '66cdaa',\n\tVXe: 'cd',\n\tVScEd: 'ba55d3',\n\tVpurpN: '9370db',\n\tVsHgYF: '3cb371',\n\tVUXe: '7b68ee',\n\tVsprRggYF: 'fa9a',\n\tVQe: '48d1cc',\n\tVviTetYd: 'c71585',\n\tmidnightXe: '191970',\n\tmRtcYam: 'f5fffa',\n\tmistyPse: 'ffe4e1',\n\tmoccasR: 'ffe4b5',\n\tnavajowEte: 'ffdead',\n\tnavy: '80',\n\tTdlace: 'fdf5e6',\n\tTive: '808000',\n\tTivedBb: '6b8e23',\n\tSange: 'ffa500',\n\tSangeYd: 'ff4500',\n\tScEd: 'da70d6',\n\tpOegTMnPd: 'eee8aa',\n\tpOegYF: '98fb98',\n\tpOeQe: 'afeeee',\n\tpOeviTetYd: 'db7093',\n\tpapayawEp: 'ffefd5',\n\tpHKpuff: 'ffdab9',\n\tperu: 'cd853f',\n\tpRk: 'ffc0cb',\n\tplum: 'dda0dd',\n\tpowMrXe: 'b0e0e6',\n\tpurpN: '800080',\n\tYbeccapurpN: '663399',\n\tYd: 'ff0000',\n\tPsybrown: 'bc8f8f',\n\tPyOXe: '4169e1',\n\tsaddNbPwn: '8b4513',\n\tsOmon: 'fa8072',\n\tsandybPwn: 'f4a460',\n\tsHgYF: '2e8b57',\n\tsHshell: 'fff5ee',\n\tsiFna: 'a0522d',\n\tsilver: 'c0c0c0',\n\tskyXe: '87ceeb',\n\tUXe: '6a5acd',\n\tUWay: '708090',\n\tUgYy: '708090',\n\tsnow: 'fffafa',\n\tsprRggYF: 'ff7f',\n\tstAlXe: '4682b4',\n\ttan: 'd2b48c',\n\tteO: '8080',\n\ttEstN: 'd8bfd8',\n\ttomato: 'ff6347',\n\tQe: '40e0d0',\n\tviTet: 'ee82ee',\n\tJHt: 'f5deb3',\n\twEte: 'ffffff',\n\twEtesmoke: 'f5f5f5',\n\tLw: 'ffff00',\n\tLwgYF: '9acd32'\n};\nfunction unpack() {\n\tconst unpacked = {};\n\tconst keys = Object.keys(names);\n\tconst tkeys = Object.keys(map$1);\n\tlet i, j, k, ok, nk;\n\tfor (i = 0; i < keys.length; i++) {\n\t\tok = nk = keys[i];\n\t\tfor (j = 0; j < tkeys.length; j++) {\n\t\t\tk = tkeys[j];\n\t\t\tnk = nk.replace(k, map$1[k]);\n\t\t}\n\t\tk = parseInt(names[ok], 16);\n\t\tunpacked[nk] = [k >> 16 & 0xFF, k >> 8 & 0xFF, k & 0xFF];\n\t}\n\treturn unpacked;\n}\nlet names$1;\nfunction nameParse(str) {\n\tif (!names$1) {\n\t\tnames$1 = unpack();\n\t\tnames$1.transparent = [0, 0, 0, 0];\n\t}\n\tconst a = names$1[str.toLowerCase()];\n\treturn a && {\n\t\tr: a[0],\n\t\tg: a[1],\n\t\tb: a[2],\n\t\ta: a.length === 4 ? a[3] : 255\n\t};\n}\nfunction modHSL(v, i, ratio) {\n\tif (v) {\n\t\tlet tmp = rgb2hsl(v);\n\t\ttmp[i] = Math.max(0, Math.min(tmp[i] + tmp[i] * ratio, i === 0 ? 360 : 1));\n\t\ttmp = hsl2rgb(tmp);\n\t\tv.r = tmp[0];\n\t\tv.g = tmp[1];\n\t\tv.b = tmp[2];\n\t}\n}\nfunction clone(v, proto) {\n\treturn v ? Object.assign(proto || {}, v) : v;\n}\nfunction fromObject(input) {\n\tvar v = {r: 0, g: 0, b: 0, a: 255};\n\tif (Array.isArray(input)) {\n\t\tif (input.length >= 3) {\n\t\t\tv = {r: input[0], g: input[1], b: input[2], a: 255};\n\t\t\tif (input.length > 3) {\n\t\t\t\tv.a = n2b(input[3]);\n\t\t\t}\n\t\t}\n\t} else {\n\t\tv = clone(input, {r: 0, g: 0, b: 0, a: 1});\n\t\tv.a = n2b(v.a);\n\t}\n\treturn v;\n}\nfunction functionParse(str) {\n\tif (str.charAt(0) === 'r') {\n\t\treturn rgbParse(str);\n\t}\n\treturn hueParse(str);\n}\nclass Color {\n\tconstructor(input) {\n\t\tif (input instanceof Color) {\n\t\t\treturn input;\n\t\t}\n\t\tconst type = typeof input;\n\t\tlet v;\n\t\tif (type === 'object') {\n\t\t\tv = fromObject(input);\n\t\t} else if (type === 'string') {\n\t\t\tv = hexParse(input) || nameParse(input) || functionParse(input);\n\t\t}\n\t\tthis._rgb = v;\n\t\tthis._valid = !!v;\n\t}\n\tget valid() {\n\t\treturn this._valid;\n\t}\n\tget rgb() {\n\t\tvar v = clone(this._rgb);\n\t\tif (v) {\n\t\t\tv.a = b2n(v.a);\n\t\t}\n\t\treturn v;\n\t}\n\tset rgb(obj) {\n\t\tthis._rgb = fromObject(obj);\n\t}\n\trgbString() {\n\t\treturn this._valid ? rgbString(this._rgb) : this._rgb;\n\t}\n\thexString() {\n\t\treturn this._valid ? hexString(this._rgb) : this._rgb;\n\t}\n\thslString() {\n\t\treturn this._valid ? hslString(this._rgb) : this._rgb;\n\t}\n\tmix(color, weight) {\n\t\tconst me = this;\n\t\tif (color) {\n\t\t\tconst c1 = me.rgb;\n\t\t\tconst c2 = color.rgb;\n\t\t\tlet w2;\n\t\t\tconst p = weight === w2 ? 0.5 : weight;\n\t\t\tconst w = 2 * p - 1;\n\t\t\tconst a = c1.a - c2.a;\n\t\t\tconst w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n\t\t\tw2 = 1 - w1;\n\t\t\tc1.r = 0xFF & w1 * c1.r + w2 * c2.r + 0.5;\n\t\t\tc1.g = 0xFF & w1 * c1.g + w2 * c2.g + 0.5;\n\t\t\tc1.b = 0xFF & w1 * c1.b + w2 * c2.b + 0.5;\n\t\t\tc1.a = p * c1.a + (1 - p) * c2.a;\n\t\t\tme.rgb = c1;\n\t\t}\n\t\treturn me;\n\t}\n\tclone() {\n\t\treturn new Color(this.rgb);\n\t}\n\talpha(a) {\n\t\tthis._rgb.a = n2b(a);\n\t\treturn this;\n\t}\n\tclearer(ratio) {\n\t\tconst rgb = this._rgb;\n\t\trgb.a *= 1 - ratio;\n\t\treturn this;\n\t}\n\tgreyscale() {\n\t\tconst rgb = this._rgb;\n\t\tconst val = round(rgb.r * 0.3 + rgb.g * 0.59 + rgb.b * 0.11);\n\t\trgb.r = rgb.g = rgb.b = val;\n\t\treturn this;\n\t}\n\topaquer(ratio) {\n\t\tconst rgb = this._rgb;\n\t\trgb.a *= 1 + ratio;\n\t\treturn this;\n\t}\n\tnegate() {\n\t\tconst v = this._rgb;\n\t\tv.r = 255 - v.r;\n\t\tv.g = 255 - v.g;\n\t\tv.b = 255 - v.b;\n\t\treturn this;\n\t}\n\tlighten(ratio) {\n\t\tmodHSL(this._rgb, 2, ratio);\n\t\treturn this;\n\t}\n\tdarken(ratio) {\n\t\tmodHSL(this._rgb, 2, -ratio);\n\t\treturn this;\n\t}\n\tsaturate(ratio) {\n\t\tmodHSL(this._rgb, 1, ratio);\n\t\treturn this;\n\t}\n\tdesaturate(ratio) {\n\t\tmodHSL(this._rgb, 1, -ratio);\n\t\treturn this;\n\t}\n\trotate(deg) {\n\t\trotate(this._rgb, deg);\n\t\treturn this;\n\t}\n}\nfunction index_esm(input) {\n\treturn new Color(input);\n}\n\nconst isPatternOrGradient = (value) => value instanceof CanvasGradient || value instanceof CanvasPattern;\nfunction color(value) {\n return isPatternOrGradient(value) ? value : index_esm(value);\n}\nfunction getHoverColor(value) {\n return isPatternOrGradient(value)\n ? value\n : index_esm(value).saturate(0.5).darken(0.1).hexString();\n}\n\nconst overrides = Object.create(null);\nconst descriptors = Object.create(null);\nfunction getScope$1(node, key) {\n if (!key) {\n return node;\n }\n const keys = key.split('.');\n for (let i = 0, n = keys.length; i < n; ++i) {\n const k = keys[i];\n node = node[k] || (node[k] = Object.create(null));\n }\n return node;\n}\nfunction set(root, scope, values) {\n if (typeof scope === 'string') {\n return merge(getScope$1(root, scope), values);\n }\n return merge(getScope$1(root, ''), scope);\n}\nclass Defaults {\n constructor(_descriptors) {\n this.animation = undefined;\n this.backgroundColor = 'rgba(0,0,0,0.1)';\n this.borderColor = 'rgba(0,0,0,0.1)';\n this.color = '#666';\n this.datasets = {};\n this.devicePixelRatio = (context) => context.chart.platform.getDevicePixelRatio();\n this.elements = {};\n this.events = [\n 'mousemove',\n 'mouseout',\n 'click',\n 'touchstart',\n 'touchmove'\n ];\n this.font = {\n family: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n size: 12,\n style: 'normal',\n lineHeight: 1.2,\n weight: null\n };\n this.hover = {};\n this.hoverBackgroundColor = (ctx, options) => getHoverColor(options.backgroundColor);\n this.hoverBorderColor = (ctx, options) => getHoverColor(options.borderColor);\n this.hoverColor = (ctx, options) => getHoverColor(options.color);\n this.indexAxis = 'x';\n this.interaction = {\n mode: 'nearest',\n intersect: true\n };\n this.maintainAspectRatio = true;\n this.onHover = null;\n this.onClick = null;\n this.parsing = true;\n this.plugins = {};\n this.responsive = true;\n this.scale = undefined;\n this.scales = {};\n this.showLine = true;\n this.describe(_descriptors);\n }\n set(scope, values) {\n return set(this, scope, values);\n }\n get(scope) {\n return getScope$1(this, scope);\n }\n describe(scope, values) {\n return set(descriptors, scope, values);\n }\n override(scope, values) {\n return set(overrides, scope, values);\n }\n route(scope, name, targetScope, targetName) {\n const scopeObject = getScope$1(this, scope);\n const targetScopeObject = getScope$1(this, targetScope);\n const privateName = '_' + name;\n Object.defineProperties(scopeObject, {\n [privateName]: {\n value: scopeObject[name],\n writable: true\n },\n [name]: {\n enumerable: true,\n get() {\n const local = this[privateName];\n const target = targetScopeObject[targetName];\n if (isObject(local)) {\n return Object.assign({}, target, local);\n }\n return valueOrDefault(local, target);\n },\n set(value) {\n this[privateName] = value;\n }\n }\n });\n }\n}\nvar defaults = new Defaults({\n _scriptable: (name) => !name.startsWith('on'),\n _indexable: (name) => name !== 'events',\n hover: {\n _fallback: 'interaction'\n },\n interaction: {\n _scriptable: false,\n _indexable: false,\n }\n});\n\nfunction toFontString(font) {\n if (!font || isNullOrUndef(font.size) || isNullOrUndef(font.family)) {\n return null;\n }\n return (font.style ? font.style + ' ' : '')\n\t\t+ (font.weight ? font.weight + ' ' : '')\n\t\t+ font.size + 'px '\n\t\t+ font.family;\n}\nfunction _measureText(ctx, data, gc, longest, string) {\n let textWidth = data[string];\n if (!textWidth) {\n textWidth = data[string] = ctx.measureText(string).width;\n gc.push(string);\n }\n if (textWidth > longest) {\n longest = textWidth;\n }\n return longest;\n}\nfunction _longestText(ctx, font, arrayOfThings, cache) {\n cache = cache || {};\n let data = cache.data = cache.data || {};\n let gc = cache.garbageCollect = cache.garbageCollect || [];\n if (cache.font !== font) {\n data = cache.data = {};\n gc = cache.garbageCollect = [];\n cache.font = font;\n }\n ctx.save();\n ctx.font = font;\n let longest = 0;\n const ilen = arrayOfThings.length;\n let i, j, jlen, thing, nestedThing;\n for (i = 0; i < ilen; i++) {\n thing = arrayOfThings[i];\n if (thing !== undefined && thing !== null && isArray(thing) !== true) {\n longest = _measureText(ctx, data, gc, longest, thing);\n } else if (isArray(thing)) {\n for (j = 0, jlen = thing.length; j < jlen; j++) {\n nestedThing = thing[j];\n if (nestedThing !== undefined && nestedThing !== null && !isArray(nestedThing)) {\n longest = _measureText(ctx, data, gc, longest, nestedThing);\n }\n }\n }\n }\n ctx.restore();\n const gcLen = gc.length / 2;\n if (gcLen > arrayOfThings.length) {\n for (i = 0; i < gcLen; i++) {\n delete data[gc[i]];\n }\n gc.splice(0, gcLen);\n }\n return longest;\n}\nfunction _alignPixel(chart, pixel, width) {\n const devicePixelRatio = chart.currentDevicePixelRatio;\n const halfWidth = width !== 0 ? Math.max(width / 2, 0.5) : 0;\n return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth;\n}\nfunction clearCanvas(canvas, ctx) {\n ctx = ctx || canvas.getContext('2d');\n ctx.save();\n ctx.resetTransform();\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.restore();\n}\nfunction drawPoint(ctx, options, x, y) {\n let type, xOffset, yOffset, size, cornerRadius;\n const style = options.pointStyle;\n const rotation = options.rotation;\n const radius = options.radius;\n let rad = (rotation || 0) * RAD_PER_DEG;\n if (style && typeof style === 'object') {\n type = style.toString();\n if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate(rad);\n ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height);\n ctx.restore();\n return;\n }\n }\n if (isNaN(radius) || radius <= 0) {\n return;\n }\n ctx.beginPath();\n switch (style) {\n default:\n ctx.arc(x, y, radius, 0, TAU);\n ctx.closePath();\n break;\n case 'triangle':\n ctx.moveTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius);\n ctx.closePath();\n break;\n case 'rectRounded':\n cornerRadius = radius * 0.516;\n size = radius - cornerRadius;\n xOffset = Math.cos(rad + QUARTER_PI) * size;\n yOffset = Math.sin(rad + QUARTER_PI) * size;\n ctx.arc(x - xOffset, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);\n ctx.arc(x + yOffset, y - xOffset, cornerRadius, rad - HALF_PI, rad);\n ctx.arc(x + xOffset, y + yOffset, cornerRadius, rad, rad + HALF_PI);\n ctx.arc(x - yOffset, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI);\n ctx.closePath();\n break;\n case 'rect':\n if (!rotation) {\n size = Math.SQRT1_2 * radius;\n ctx.rect(x - size, y - size, 2 * size, 2 * size);\n break;\n }\n rad += QUARTER_PI;\n case 'rectRot':\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + yOffset, y - xOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n ctx.lineTo(x - yOffset, y + xOffset);\n ctx.closePath();\n break;\n case 'crossRot':\n rad += QUARTER_PI;\n case 'cross':\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n ctx.moveTo(x + yOffset, y - xOffset);\n ctx.lineTo(x - yOffset, y + xOffset);\n break;\n case 'star':\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n ctx.moveTo(x + yOffset, y - xOffset);\n ctx.lineTo(x - yOffset, y + xOffset);\n rad += QUARTER_PI;\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n ctx.moveTo(x + yOffset, y - xOffset);\n ctx.lineTo(x - yOffset, y + xOffset);\n break;\n case 'line':\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n ctx.moveTo(x - xOffset, y - yOffset);\n ctx.lineTo(x + xOffset, y + yOffset);\n break;\n case 'dash':\n ctx.moveTo(x, y);\n ctx.lineTo(x + Math.cos(rad) * radius, y + Math.sin(rad) * radius);\n break;\n }\n ctx.fill();\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n}\nfunction _isPointInArea(point, area, margin) {\n margin = margin || 0.5;\n return !area || (point && point.x > area.left - margin && point.x < area.right + margin &&\n\t\tpoint.y > area.top - margin && point.y < area.bottom + margin);\n}\nfunction clipArea(ctx, area) {\n ctx.save();\n ctx.beginPath();\n ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);\n ctx.clip();\n}\nfunction unclipArea(ctx) {\n ctx.restore();\n}\nfunction _steppedLineTo(ctx, previous, target, flip, mode) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n if (mode === 'middle') {\n const midpoint = (previous.x + target.x) / 2.0;\n ctx.lineTo(midpoint, previous.y);\n ctx.lineTo(midpoint, target.y);\n } else if (mode === 'after' !== !!flip) {\n ctx.lineTo(previous.x, target.y);\n } else {\n ctx.lineTo(target.x, previous.y);\n }\n ctx.lineTo(target.x, target.y);\n}\nfunction _bezierCurveTo(ctx, previous, target, flip) {\n if (!previous) {\n return ctx.lineTo(target.x, target.y);\n }\n ctx.bezierCurveTo(\n flip ? previous.cp1x : previous.cp2x,\n flip ? previous.cp1y : previous.cp2y,\n flip ? target.cp2x : target.cp1x,\n flip ? target.cp2y : target.cp1y,\n target.x,\n target.y);\n}\nfunction renderText(ctx, text, x, y, font, opts = {}) {\n const lines = isArray(text) ? text : [text];\n const stroke = opts.strokeWidth > 0 && opts.strokeColor !== '';\n let i, line;\n ctx.save();\n ctx.font = font.string;\n setRenderOpts(ctx, opts);\n for (i = 0; i < lines.length; ++i) {\n line = lines[i];\n if (stroke) {\n if (opts.strokeColor) {\n ctx.strokeStyle = opts.strokeColor;\n }\n if (!isNullOrUndef(opts.strokeWidth)) {\n ctx.lineWidth = opts.strokeWidth;\n }\n ctx.strokeText(line, x, y, opts.maxWidth);\n }\n ctx.fillText(line, x, y, opts.maxWidth);\n decorateText(ctx, x, y, line, opts);\n y += font.lineHeight;\n }\n ctx.restore();\n}\nfunction setRenderOpts(ctx, opts) {\n if (opts.translation) {\n ctx.translate(opts.translation[0], opts.translation[1]);\n }\n if (!isNullOrUndef(opts.rotation)) {\n ctx.rotate(opts.rotation);\n }\n if (opts.color) {\n ctx.fillStyle = opts.color;\n }\n if (opts.textAlign) {\n ctx.textAlign = opts.textAlign;\n }\n if (opts.textBaseline) {\n ctx.textBaseline = opts.textBaseline;\n }\n}\nfunction decorateText(ctx, x, y, line, opts) {\n if (opts.strikethrough || opts.underline) {\n const metrics = ctx.measureText(line);\n const left = x - metrics.actualBoundingBoxLeft;\n const right = x + metrics.actualBoundingBoxRight;\n const top = y - metrics.actualBoundingBoxAscent;\n const bottom = y + metrics.actualBoundingBoxDescent;\n const yDecoration = opts.strikethrough ? (top + bottom) / 2 : bottom;\n ctx.strokeStyle = ctx.fillStyle;\n ctx.beginPath();\n ctx.lineWidth = opts.decorationWidth || 2;\n ctx.moveTo(left, yDecoration);\n ctx.lineTo(right, yDecoration);\n ctx.stroke();\n }\n}\nfunction addRoundedRectPath(ctx, rect) {\n const {x, y, w, h, radius} = rect;\n ctx.arc(x + radius.topLeft, y + radius.topLeft, radius.topLeft, -HALF_PI, PI, true);\n ctx.lineTo(x, y + h - radius.bottomLeft);\n ctx.arc(x + radius.bottomLeft, y + h - radius.bottomLeft, radius.bottomLeft, PI, HALF_PI, true);\n ctx.lineTo(x + w - radius.bottomRight, y + h);\n ctx.arc(x + w - radius.bottomRight, y + h - radius.bottomRight, radius.bottomRight, HALF_PI, 0, true);\n ctx.lineTo(x + w, y + radius.topRight);\n ctx.arc(x + w - radius.topRight, y + radius.topRight, radius.topRight, 0, -HALF_PI, true);\n ctx.lineTo(x + radius.topLeft, y);\n}\n\nconst LINE_HEIGHT = new RegExp(/^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/);\nconst FONT_STYLE = new RegExp(/^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/);\nfunction toLineHeight(value, size) {\n const matches = ('' + value).match(LINE_HEIGHT);\n if (!matches || matches[1] === 'normal') {\n return size * 1.2;\n }\n value = +matches[2];\n switch (matches[3]) {\n case 'px':\n return value;\n case '%':\n value /= 100;\n break;\n }\n return size * value;\n}\nconst numberOrZero = v => +v || 0;\nfunction _readValueToProps(value, props) {\n const ret = {};\n const objProps = isObject(props);\n const keys = objProps ? Object.keys(props) : props;\n const read = isObject(value)\n ? objProps\n ? prop => valueOrDefault(value[prop], value[props[prop]])\n : prop => value[prop]\n : () => value;\n for (const prop of keys) {\n ret[prop] = numberOrZero(read(prop));\n }\n return ret;\n}\nfunction toTRBL(value) {\n return _readValueToProps(value, {top: 'y', right: 'x', bottom: 'y', left: 'x'});\n}\nfunction toTRBLCorners(value) {\n return _readValueToProps(value, ['topLeft', 'topRight', 'bottomLeft', 'bottomRight']);\n}\nfunction toPadding(value) {\n const obj = toTRBL(value);\n obj.width = obj.left + obj.right;\n obj.height = obj.top + obj.bottom;\n return obj;\n}\nfunction toFont(options, fallback) {\n options = options || {};\n fallback = fallback || defaults.font;\n let size = valueOrDefault(options.size, fallback.size);\n if (typeof size === 'string') {\n size = parseInt(size, 10);\n }\n let style = valueOrDefault(options.style, fallback.style);\n if (style && !('' + style).match(FONT_STYLE)) {\n console.warn('Invalid font style specified: \"' + style + '\"');\n style = '';\n }\n const font = {\n family: valueOrDefault(options.family, fallback.family),\n lineHeight: toLineHeight(valueOrDefault(options.lineHeight, fallback.lineHeight), size),\n size,\n style,\n weight: valueOrDefault(options.weight, fallback.weight),\n string: ''\n };\n font.string = toFontString(font);\n return font;\n}\nfunction resolve(inputs, context, index, info) {\n let cacheable = true;\n let i, ilen, value;\n for (i = 0, ilen = inputs.length; i < ilen; ++i) {\n value = inputs[i];\n if (value === undefined) {\n continue;\n }\n if (context !== undefined && typeof value === 'function') {\n value = value(context);\n cacheable = false;\n }\n if (index !== undefined && isArray(value)) {\n value = value[index % value.length];\n cacheable = false;\n }\n if (value !== undefined) {\n if (info && !cacheable) {\n info.cacheable = false;\n }\n return value;\n }\n }\n}\nfunction _addGrace(minmax, grace) {\n const {min, max} = minmax;\n return {\n min: min - Math.abs(toDimension(grace, min)),\n max: max + toDimension(grace, max)\n };\n}\n\nfunction _lookup(table, value, cmp) {\n cmp = cmp || ((index) => table[index] < value);\n let hi = table.length - 1;\n let lo = 0;\n let mid;\n while (hi - lo > 1) {\n mid = (lo + hi) >> 1;\n if (cmp(mid)) {\n lo = mid;\n } else {\n hi = mid;\n }\n }\n return {lo, hi};\n}\nconst _lookupByKey = (table, key, value) =>\n _lookup(table, value, index => table[index][key] < value);\nconst _rlookupByKey = (table, key, value) =>\n _lookup(table, value, index => table[index][key] >= value);\nfunction _filterBetween(values, min, max) {\n let start = 0;\n let end = values.length;\n while (start < end && values[start] < min) {\n start++;\n }\n while (end > start && values[end - 1] > max) {\n end--;\n }\n return start > 0 || end < values.length\n ? values.slice(start, end)\n : values;\n}\nconst arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift'];\nfunction listenArrayEvents(array, listener) {\n if (array._chartjs) {\n array._chartjs.listeners.push(listener);\n return;\n }\n Object.defineProperty(array, '_chartjs', {\n configurable: true,\n enumerable: false,\n value: {\n listeners: [listener]\n }\n });\n arrayEvents.forEach((key) => {\n const method = '_onData' + _capitalize(key);\n const base = array[key];\n Object.defineProperty(array, key, {\n configurable: true,\n enumerable: false,\n value(...args) {\n const res = base.apply(this, args);\n array._chartjs.listeners.forEach((object) => {\n if (typeof object[method] === 'function') {\n object[method](...args);\n }\n });\n return res;\n }\n });\n });\n}\nfunction unlistenArrayEvents(array, listener) {\n const stub = array._chartjs;\n if (!stub) {\n return;\n }\n const listeners = stub.listeners;\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n if (listeners.length > 0) {\n return;\n }\n arrayEvents.forEach((key) => {\n delete array[key];\n });\n delete array._chartjs;\n}\nfunction _arrayUnique(items) {\n const set = new Set();\n let i, ilen;\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n set.add(items[i]);\n }\n if (set.size === ilen) {\n return items;\n }\n return Array.from(set);\n}\n\nfunction _createResolver(scopes, prefixes = [''], rootScopes = scopes, fallback, getTarget = () => scopes[0]) {\n if (!defined(fallback)) {\n fallback = _resolve('_fallback', scopes);\n }\n const cache = {\n [Symbol.toStringTag]: 'Object',\n _cacheable: true,\n _scopes: scopes,\n _rootScopes: rootScopes,\n _fallback: fallback,\n _getTarget: getTarget,\n override: (scope) => _createResolver([scope, ...scopes], prefixes, rootScopes, fallback),\n };\n return new Proxy(cache, {\n deleteProperty(target, prop) {\n delete target[prop];\n delete target._keys;\n delete scopes[0][prop];\n return true;\n },\n get(target, prop) {\n return _cached(target, prop,\n () => _resolveWithPrefixes(prop, prefixes, scopes, target));\n },\n getOwnPropertyDescriptor(target, prop) {\n return Reflect.getOwnPropertyDescriptor(target._scopes[0], prop);\n },\n getPrototypeOf() {\n return Reflect.getPrototypeOf(scopes[0]);\n },\n has(target, prop) {\n return getKeysFromAllScopes(target).includes(prop);\n },\n ownKeys(target) {\n return getKeysFromAllScopes(target);\n },\n set(target, prop, value) {\n const storage = target._storage || (target._storage = getTarget());\n storage[prop] = value;\n delete target[prop];\n delete target._keys;\n return true;\n }\n });\n}\nfunction _attachContext(proxy, context, subProxy, descriptorDefaults) {\n const cache = {\n _cacheable: false,\n _proxy: proxy,\n _context: context,\n _subProxy: subProxy,\n _stack: new Set(),\n _descriptors: _descriptors(proxy, descriptorDefaults),\n setContext: (ctx) => _attachContext(proxy, ctx, subProxy, descriptorDefaults),\n override: (scope) => _attachContext(proxy.override(scope), context, subProxy, descriptorDefaults)\n };\n return new Proxy(cache, {\n deleteProperty(target, prop) {\n delete target[prop];\n delete proxy[prop];\n return true;\n },\n get(target, prop, receiver) {\n return _cached(target, prop,\n () => _resolveWithContext(target, prop, receiver));\n },\n getOwnPropertyDescriptor(target, prop) {\n return target._descriptors.allKeys\n ? Reflect.has(proxy, prop) ? {enumerable: true, configurable: true} : undefined\n : Reflect.getOwnPropertyDescriptor(proxy, prop);\n },\n getPrototypeOf() {\n return Reflect.getPrototypeOf(proxy);\n },\n has(target, prop) {\n return Reflect.has(proxy, prop);\n },\n ownKeys() {\n return Reflect.ownKeys(proxy);\n },\n set(target, prop, value) {\n proxy[prop] = value;\n delete target[prop];\n return true;\n }\n });\n}\nfunction _descriptors(proxy, defaults = {scriptable: true, indexable: true}) {\n const {_scriptable = defaults.scriptable, _indexable = defaults.indexable, _allKeys = defaults.allKeys} = proxy;\n return {\n allKeys: _allKeys,\n scriptable: _scriptable,\n indexable: _indexable,\n isScriptable: isFunction(_scriptable) ? _scriptable : () => _scriptable,\n isIndexable: isFunction(_indexable) ? _indexable : () => _indexable\n };\n}\nconst readKey = (prefix, name) => prefix ? prefix + _capitalize(name) : name;\nconst needsSubResolver = (prop, value) => isObject(value) && prop !== 'adapters';\nfunction _cached(target, prop, resolve) {\n let value = target[prop];\n if (defined(value)) {\n return value;\n }\n value = resolve();\n if (defined(value)) {\n target[prop] = value;\n }\n return value;\n}\nfunction _resolveWithContext(target, prop, receiver) {\n const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n let value = _proxy[prop];\n if (isFunction(value) && descriptors.isScriptable(prop)) {\n value = _resolveScriptable(prop, value, target, receiver);\n }\n if (isArray(value) && value.length) {\n value = _resolveArray(prop, value, target, descriptors.isIndexable);\n }\n if (needsSubResolver(prop, value)) {\n value = _attachContext(value, _context, _subProxy && _subProxy[prop], descriptors);\n }\n return value;\n}\nfunction _resolveScriptable(prop, value, target, receiver) {\n const {_proxy, _context, _subProxy, _stack} = target;\n if (_stack.has(prop)) {\n throw new Error('Recursion detected: ' + Array.from(_stack).join('->') + '->' + prop);\n }\n _stack.add(prop);\n value = value(_context, _subProxy || receiver);\n _stack.delete(prop);\n if (isObject(value)) {\n value = createSubResolver(_proxy._scopes, _proxy, prop, value);\n }\n return value;\n}\nfunction _resolveArray(prop, value, target, isIndexable) {\n const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n if (defined(_context.index) && isIndexable(prop)) {\n value = value[_context.index % value.length];\n } else if (isObject(value[0])) {\n const arr = value;\n const scopes = _proxy._scopes.filter(s => s !== arr);\n value = [];\n for (const item of arr) {\n const resolver = createSubResolver(scopes, _proxy, prop, item);\n value.push(_attachContext(resolver, _context, _subProxy && _subProxy[prop], descriptors));\n }\n }\n return value;\n}\nfunction resolveFallback(fallback, prop, value) {\n return isFunction(fallback) ? fallback(prop, value) : fallback;\n}\nconst getScope = (key, parent) => key === true ? parent\n : typeof key === 'string' ? resolveObjectKey(parent, key) : undefined;\nfunction addScopes(set, parentScopes, key, parentFallback) {\n for (const parent of parentScopes) {\n const scope = getScope(key, parent);\n if (scope) {\n set.add(scope);\n const fallback = resolveFallback(scope._fallback, key, scope);\n if (defined(fallback) && fallback !== key && fallback !== parentFallback) {\n return fallback;\n }\n } else if (scope === false && defined(parentFallback) && key !== parentFallback) {\n return null;\n }\n }\n return false;\n}\nfunction createSubResolver(parentScopes, resolver, prop, value) {\n const rootScopes = resolver._rootScopes;\n const fallback = resolveFallback(resolver._fallback, prop, value);\n const allScopes = [...parentScopes, ...rootScopes];\n const set = new Set();\n set.add(value);\n let key = addScopesFromKey(set, allScopes, prop, fallback || prop);\n if (key === null) {\n return false;\n }\n if (defined(fallback) && fallback !== prop) {\n key = addScopesFromKey(set, allScopes, fallback, key);\n if (key === null) {\n return false;\n }\n }\n return _createResolver(Array.from(set), [''], rootScopes, fallback,\n () => subGetTarget(resolver, prop, value));\n}\nfunction addScopesFromKey(set, allScopes, key, fallback) {\n while (key) {\n key = addScopes(set, allScopes, key, fallback);\n }\n return key;\n}\nfunction subGetTarget(resolver, prop, value) {\n const parent = resolver._getTarget();\n if (!(prop in parent)) {\n parent[prop] = {};\n }\n const target = parent[prop];\n if (isArray(target) && isObject(value)) {\n return value;\n }\n return target;\n}\nfunction _resolveWithPrefixes(prop, prefixes, scopes, proxy) {\n let value;\n for (const prefix of prefixes) {\n value = _resolve(readKey(prefix, prop), scopes);\n if (defined(value)) {\n return needsSubResolver(prop, value)\n ? createSubResolver(scopes, proxy, prop, value)\n : value;\n }\n }\n}\nfunction _resolve(key, scopes) {\n for (const scope of scopes) {\n if (!scope) {\n continue;\n }\n const value = scope[key];\n if (defined(value)) {\n return value;\n }\n }\n}\nfunction getKeysFromAllScopes(target) {\n let keys = target._keys;\n if (!keys) {\n keys = target._keys = resolveKeysFromAllScopes(target._scopes);\n }\n return keys;\n}\nfunction resolveKeysFromAllScopes(scopes) {\n const set = new Set();\n for (const scope of scopes) {\n for (const key of Object.keys(scope).filter(k => !k.startsWith('_'))) {\n set.add(key);\n }\n }\n return Array.from(set);\n}\n\nconst EPSILON = Number.EPSILON || 1e-14;\nconst getPoint = (points, i) => i < points.length && !points[i].skip && points[i];\nconst getValueAxis = (indexAxis) => indexAxis === 'x' ? 'y' : 'x';\nfunction splineCurve(firstPoint, middlePoint, afterPoint, t) {\n const previous = firstPoint.skip ? middlePoint : firstPoint;\n const current = middlePoint;\n const next = afterPoint.skip ? middlePoint : afterPoint;\n const d01 = distanceBetweenPoints(current, previous);\n const d12 = distanceBetweenPoints(next, current);\n let s01 = d01 / (d01 + d12);\n let s12 = d12 / (d01 + d12);\n s01 = isNaN(s01) ? 0 : s01;\n s12 = isNaN(s12) ? 0 : s12;\n const fa = t * s01;\n const fb = t * s12;\n return {\n previous: {\n x: current.x - fa * (next.x - previous.x),\n y: current.y - fa * (next.y - previous.y)\n },\n next: {\n x: current.x + fb * (next.x - previous.x),\n y: current.y + fb * (next.y - previous.y)\n }\n };\n}\nfunction monotoneAdjust(points, deltaK, mK) {\n const pointsLen = points.length;\n let alphaK, betaK, tauK, squaredMagnitude, pointCurrent;\n let pointAfter = getPoint(points, 0);\n for (let i = 0; i < pointsLen - 1; ++i) {\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent || !pointAfter) {\n continue;\n }\n if (almostEquals(deltaK[i], 0, EPSILON)) {\n mK[i] = mK[i + 1] = 0;\n continue;\n }\n alphaK = mK[i] / deltaK[i];\n betaK = mK[i + 1] / deltaK[i];\n squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n if (squaredMagnitude <= 9) {\n continue;\n }\n tauK = 3 / Math.sqrt(squaredMagnitude);\n mK[i] = alphaK * tauK * deltaK[i];\n mK[i + 1] = betaK * tauK * deltaK[i];\n }\n}\nfunction monotoneCompute(points, mK, indexAxis = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n let delta, pointBefore, pointCurrent;\n let pointAfter = getPoint(points, 0);\n for (let i = 0; i < pointsLen; ++i) {\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n const iPixel = pointCurrent[indexAxis];\n const vPixel = pointCurrent[valueAxis];\n if (pointBefore) {\n delta = (iPixel - pointBefore[indexAxis]) / 3;\n pointCurrent[`cp1${indexAxis}`] = iPixel - delta;\n pointCurrent[`cp1${valueAxis}`] = vPixel - delta * mK[i];\n }\n if (pointAfter) {\n delta = (pointAfter[indexAxis] - iPixel) / 3;\n pointCurrent[`cp2${indexAxis}`] = iPixel + delta;\n pointCurrent[`cp2${valueAxis}`] = vPixel + delta * mK[i];\n }\n }\n}\nfunction splineCurveMonotone(points, indexAxis = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n const deltaK = Array(pointsLen).fill(0);\n const mK = Array(pointsLen);\n let i, pointBefore, pointCurrent;\n let pointAfter = getPoint(points, 0);\n for (i = 0; i < pointsLen; ++i) {\n pointBefore = pointCurrent;\n pointCurrent = pointAfter;\n pointAfter = getPoint(points, i + 1);\n if (!pointCurrent) {\n continue;\n }\n if (pointAfter) {\n const slopeDelta = pointAfter[indexAxis] - pointCurrent[indexAxis];\n deltaK[i] = slopeDelta !== 0 ? (pointAfter[valueAxis] - pointCurrent[valueAxis]) / slopeDelta : 0;\n }\n mK[i] = !pointBefore ? deltaK[i]\n : !pointAfter ? deltaK[i - 1]\n : (sign(deltaK[i - 1]) !== sign(deltaK[i])) ? 0\n : (deltaK[i - 1] + deltaK[i]) / 2;\n }\n monotoneAdjust(points, deltaK, mK);\n monotoneCompute(points, mK, indexAxis);\n}\nfunction capControlPoint(pt, min, max) {\n return Math.max(Math.min(pt, max), min);\n}\nfunction capBezierPoints(points, area) {\n let i, ilen, point, inArea, inAreaPrev;\n let inAreaNext = _isPointInArea(points[0], area);\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n inAreaPrev = inArea;\n inArea = inAreaNext;\n inAreaNext = i < ilen - 1 && _isPointInArea(points[i + 1], area);\n if (!inArea) {\n continue;\n }\n point = points[i];\n if (inAreaPrev) {\n point.cp1x = capControlPoint(point.cp1x, area.left, area.right);\n point.cp1y = capControlPoint(point.cp1y, area.top, area.bottom);\n }\n if (inAreaNext) {\n point.cp2x = capControlPoint(point.cp2x, area.left, area.right);\n point.cp2y = capControlPoint(point.cp2y, area.top, area.bottom);\n }\n }\n}\nfunction _updateBezierControlPoints(points, options, area, loop, indexAxis) {\n let i, ilen, point, controlPoints;\n if (options.spanGaps) {\n points = points.filter((pt) => !pt.skip);\n }\n if (options.cubicInterpolationMode === 'monotone') {\n splineCurveMonotone(points, indexAxis);\n } else {\n let prev = loop ? points[points.length - 1] : points[0];\n for (i = 0, ilen = points.length; i < ilen; ++i) {\n point = points[i];\n controlPoints = splineCurve(\n prev,\n point,\n points[Math.min(i + 1, ilen - (loop ? 0 : 1)) % ilen],\n options.tension\n );\n point.cp1x = controlPoints.previous.x;\n point.cp1y = controlPoints.previous.y;\n point.cp2x = controlPoints.next.x;\n point.cp2y = controlPoints.next.y;\n prev = point;\n }\n }\n if (options.capBezierPoints) {\n capBezierPoints(points, area);\n }\n}\n\nfunction _isDomSupported() {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\nfunction _getParentNode(domNode) {\n let parent = domNode.parentNode;\n if (parent && parent.toString() === '[object ShadowRoot]') {\n parent = parent.host;\n }\n return parent;\n}\nfunction parseMaxStyle(styleValue, node, parentProperty) {\n let valueInPixels;\n if (typeof styleValue === 'string') {\n valueInPixels = parseInt(styleValue, 10);\n if (styleValue.indexOf('%') !== -1) {\n valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty];\n }\n } else {\n valueInPixels = styleValue;\n }\n return valueInPixels;\n}\nconst getComputedStyle = (element) => window.getComputedStyle(element, null);\nfunction getStyle(el, property) {\n return getComputedStyle(el).getPropertyValue(property);\n}\nconst positions = ['top', 'right', 'bottom', 'left'];\nfunction getPositionedStyle(styles, style, suffix) {\n const result = {};\n suffix = suffix ? '-' + suffix : '';\n for (let i = 0; i < 4; i++) {\n const pos = positions[i];\n result[pos] = parseFloat(styles[style + '-' + pos + suffix]) || 0;\n }\n result.width = result.left + result.right;\n result.height = result.top + result.bottom;\n return result;\n}\nconst useOffsetPos = (x, y, target) => (x > 0 || y > 0) && (!target || !target.shadowRoot);\nfunction getCanvasPosition(evt, canvas) {\n const e = evt.native || evt;\n const touches = e.touches;\n const source = touches && touches.length ? touches[0] : e;\n const {offsetX, offsetY} = source;\n let box = false;\n let x, y;\n if (useOffsetPos(offsetX, offsetY, e.target)) {\n x = offsetX;\n y = offsetY;\n } else {\n const rect = canvas.getBoundingClientRect();\n x = source.clientX - rect.left;\n y = source.clientY - rect.top;\n box = true;\n }\n return {x, y, box};\n}\nfunction getRelativePosition(evt, chart) {\n const {canvas, currentDevicePixelRatio} = chart;\n const style = getComputedStyle(canvas);\n const borderBox = style.boxSizing === 'border-box';\n const paddings = getPositionedStyle(style, 'padding');\n const borders = getPositionedStyle(style, 'border', 'width');\n const {x, y, box} = getCanvasPosition(evt, canvas);\n const xOffset = paddings.left + (box && borders.left);\n const yOffset = paddings.top + (box && borders.top);\n let {width, height} = chart;\n if (borderBox) {\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n return {\n x: Math.round((x - xOffset) / width * canvas.width / currentDevicePixelRatio),\n y: Math.round((y - yOffset) / height * canvas.height / currentDevicePixelRatio)\n };\n}\nfunction getContainerSize(canvas, width, height) {\n let maxWidth, maxHeight;\n if (width === undefined || height === undefined) {\n const container = _getParentNode(canvas);\n if (!container) {\n width = canvas.clientWidth;\n height = canvas.clientHeight;\n } else {\n const rect = container.getBoundingClientRect();\n const containerStyle = getComputedStyle(container);\n const containerBorder = getPositionedStyle(containerStyle, 'border', 'width');\n const containerPadding = getPositionedStyle(containerStyle, 'padding');\n width = rect.width - containerPadding.width - containerBorder.width;\n height = rect.height - containerPadding.height - containerBorder.height;\n maxWidth = parseMaxStyle(containerStyle.maxWidth, container, 'clientWidth');\n maxHeight = parseMaxStyle(containerStyle.maxHeight, container, 'clientHeight');\n }\n }\n return {\n width,\n height,\n maxWidth: maxWidth || INFINITY,\n maxHeight: maxHeight || INFINITY\n };\n}\nconst round1 = v => Math.round(v * 10) / 10;\nfunction getMaximumSize(canvas, bbWidth, bbHeight, aspectRatio) {\n const style = getComputedStyle(canvas);\n const margins = getPositionedStyle(style, 'margin');\n const maxWidth = parseMaxStyle(style.maxWidth, canvas, 'clientWidth') || INFINITY;\n const maxHeight = parseMaxStyle(style.maxHeight, canvas, 'clientHeight') || INFINITY;\n const containerSize = getContainerSize(canvas, bbWidth, bbHeight);\n let {width, height} = containerSize;\n if (style.boxSizing === 'content-box') {\n const borders = getPositionedStyle(style, 'border', 'width');\n const paddings = getPositionedStyle(style, 'padding');\n width -= paddings.width + borders.width;\n height -= paddings.height + borders.height;\n }\n width = Math.max(0, width - margins.width);\n height = Math.max(0, aspectRatio ? Math.floor(width / aspectRatio) : height - margins.height);\n width = round1(Math.min(width, maxWidth, containerSize.maxWidth));\n height = round1(Math.min(height, maxHeight, containerSize.maxHeight));\n if (width && !height) {\n height = round1(width / 2);\n }\n return {\n width,\n height\n };\n}\nfunction retinaScale(chart, forceRatio, forceStyle) {\n const pixelRatio = forceRatio || 1;\n const deviceHeight = Math.floor(chart.height * pixelRatio);\n const deviceWidth = Math.floor(chart.width * pixelRatio);\n chart.height = deviceHeight / pixelRatio;\n chart.width = deviceWidth / pixelRatio;\n const canvas = chart.canvas;\n if (canvas.style && (forceStyle || (!canvas.style.height && !canvas.style.width))) {\n canvas.style.height = `${chart.height}px`;\n canvas.style.width = `${chart.width}px`;\n }\n if (chart.currentDevicePixelRatio !== pixelRatio\n || canvas.height !== deviceHeight\n || canvas.width !== deviceWidth) {\n chart.currentDevicePixelRatio = pixelRatio;\n canvas.height = deviceHeight;\n canvas.width = deviceWidth;\n chart.ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n return true;\n }\n return false;\n}\nconst supportsEventListenerOptions = (function() {\n let passiveSupported = false;\n try {\n const options = {\n get passive() {\n passiveSupported = true;\n return false;\n }\n };\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (e) {\n }\n return passiveSupported;\n}());\nfunction readUsedSize(element, property) {\n const value = getStyle(element, property);\n const matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n return matches ? +matches[1] : undefined;\n}\n\nfunction _pointInLine(p1, p2, t, mode) {\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: p1.y + t * (p2.y - p1.y)\n };\n}\nfunction _steppedInterpolation(p1, p2, t, mode) {\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: mode === 'middle' ? t < 0.5 ? p1.y : p2.y\n : mode === 'after' ? t < 1 ? p1.y : p2.y\n : t > 0 ? p2.y : p1.y\n };\n}\nfunction _bezierInterpolation(p1, p2, t, mode) {\n const cp1 = {x: p1.cp2x, y: p1.cp2y};\n const cp2 = {x: p2.cp1x, y: p2.cp1y};\n const a = _pointInLine(p1, cp1, t);\n const b = _pointInLine(cp1, cp2, t);\n const c = _pointInLine(cp2, p2, t);\n const d = _pointInLine(a, b, t);\n const e = _pointInLine(b, c, t);\n return _pointInLine(d, e, t);\n}\n\nconst intlCache = new Map();\nfunction getNumberFormat(locale, options) {\n options = options || {};\n const cacheKey = locale + JSON.stringify(options);\n let formatter = intlCache.get(cacheKey);\n if (!formatter) {\n formatter = new Intl.NumberFormat(locale, options);\n intlCache.set(cacheKey, formatter);\n }\n return formatter;\n}\nfunction formatNumber(num, locale, options) {\n return getNumberFormat(locale, options).format(num);\n}\n\nconst getRightToLeftAdapter = function(rectX, width) {\n return {\n x(x) {\n return rectX + rectX + width - x;\n },\n setWidth(w) {\n width = w;\n },\n textAlign(align) {\n if (align === 'center') {\n return align;\n }\n return align === 'right' ? 'left' : 'right';\n },\n xPlus(x, value) {\n return x - value;\n },\n leftForLtr(x, itemWidth) {\n return x - itemWidth;\n },\n };\n};\nconst getLeftToRightAdapter = function() {\n return {\n x(x) {\n return x;\n },\n setWidth(w) {\n },\n textAlign(align) {\n return align;\n },\n xPlus(x, value) {\n return x + value;\n },\n leftForLtr(x, _itemWidth) {\n return x;\n },\n };\n};\nfunction getRtlAdapter(rtl, rectX, width) {\n return rtl ? getRightToLeftAdapter(rectX, width) : getLeftToRightAdapter();\n}\nfunction overrideTextDirection(ctx, direction) {\n let style, original;\n if (direction === 'ltr' || direction === 'rtl') {\n style = ctx.canvas.style;\n original = [\n style.getPropertyValue('direction'),\n style.getPropertyPriority('direction'),\n ];\n style.setProperty('direction', direction, 'important');\n ctx.prevTextDirection = original;\n }\n}\nfunction restoreTextDirection(ctx, original) {\n if (original !== undefined) {\n delete ctx.prevTextDirection;\n ctx.canvas.style.setProperty('direction', original[0], original[1]);\n }\n}\n\nfunction propertyFn(property) {\n if (property === 'angle') {\n return {\n between: _angleBetween,\n compare: _angleDiff,\n normalize: _normalizeAngle,\n };\n }\n return {\n between: (n, s, e) => n >= Math.min(s, e) && n <= Math.max(e, s),\n compare: (a, b) => a - b,\n normalize: x => x\n };\n}\nfunction normalizeSegment({start, end, count, loop, style}) {\n return {\n start: start % count,\n end: end % count,\n loop: loop && (end - start + 1) % count === 0,\n style\n };\n}\nfunction getSegment(segment, points, bounds) {\n const {property, start: startBound, end: endBound} = bounds;\n const {between, normalize} = propertyFn(property);\n const count = points.length;\n let {start, end, loop} = segment;\n let i, ilen;\n if (loop) {\n start += count;\n end += count;\n for (i = 0, ilen = count; i < ilen; ++i) {\n if (!between(normalize(points[start % count][property]), startBound, endBound)) {\n break;\n }\n start--;\n end--;\n }\n start %= count;\n end %= count;\n }\n if (end < start) {\n end += count;\n }\n return {start, end, loop, style: segment.style};\n}\nfunction _boundSegment(segment, points, bounds) {\n if (!bounds) {\n return [segment];\n }\n const {property, start: startBound, end: endBound} = bounds;\n const count = points.length;\n const {compare, between, normalize} = propertyFn(property);\n const {start, end, loop, style} = getSegment(segment, points, bounds);\n const result = [];\n let inside = false;\n let subStart = null;\n let value, point, prevValue;\n const startIsBefore = () => between(startBound, prevValue, value) && compare(startBound, prevValue) !== 0;\n const endIsBefore = () => compare(endBound, value) === 0 || between(endBound, prevValue, value);\n const shouldStart = () => inside || startIsBefore();\n const shouldStop = () => !inside || endIsBefore();\n for (let i = start, prev = start; i <= end; ++i) {\n point = points[i % count];\n if (point.skip) {\n continue;\n }\n value = normalize(point[property]);\n if (value === prevValue) {\n continue;\n }\n inside = between(value, startBound, endBound);\n if (subStart === null && shouldStart()) {\n subStart = compare(value, startBound) === 0 ? i : prev;\n }\n if (subStart !== null && shouldStop()) {\n result.push(normalizeSegment({start: subStart, end: i, loop, count, style}));\n subStart = null;\n }\n prev = i;\n prevValue = value;\n }\n if (subStart !== null) {\n result.push(normalizeSegment({start: subStart, end, loop, count, style}));\n }\n return result;\n}\nfunction _boundSegments(line, bounds) {\n const result = [];\n const segments = line.segments;\n for (let i = 0; i < segments.length; i++) {\n const sub = _boundSegment(segments[i], line.points, bounds);\n if (sub.length) {\n result.push(...sub);\n }\n }\n return result;\n}\nfunction findStartAndEnd(points, count, loop, spanGaps) {\n let start = 0;\n let end = count - 1;\n if (loop && !spanGaps) {\n while (start < count && !points[start].skip) {\n start++;\n }\n }\n while (start < count && points[start].skip) {\n start++;\n }\n start %= count;\n if (loop) {\n end += start;\n }\n while (end > start && points[end % count].skip) {\n end--;\n }\n end %= count;\n return {start, end};\n}\nfunction solidSegments(points, start, max, loop) {\n const count = points.length;\n const result = [];\n let last = start;\n let prev = points[start];\n let end;\n for (end = start + 1; end <= max; ++end) {\n const cur = points[end % count];\n if (cur.skip || cur.stop) {\n if (!prev.skip) {\n loop = false;\n result.push({start: start % count, end: (end - 1) % count, loop});\n start = last = cur.stop ? end : null;\n }\n } else {\n last = end;\n if (prev.skip) {\n start = end;\n }\n }\n prev = cur;\n }\n if (last !== null) {\n result.push({start: start % count, end: last % count, loop});\n }\n return result;\n}\nfunction _computeSegments(line, segmentOptions) {\n const points = line.points;\n const spanGaps = line.options.spanGaps;\n const count = points.length;\n if (!count) {\n return [];\n }\n const loop = !!line._loop;\n const {start, end} = findStartAndEnd(points, count, loop, spanGaps);\n if (spanGaps === true) {\n return splitByStyles(line, [{start, end, loop}], points, segmentOptions);\n }\n const max = end < start ? end + count : end;\n const completeLoop = !!line._fullLoop && start === 0 && end === count - 1;\n return splitByStyles(line, solidSegments(points, start, max, completeLoop), points, segmentOptions);\n}\nfunction splitByStyles(line, segments, points, segmentOptions) {\n if (!segmentOptions || !segmentOptions.setContext || !points) {\n return segments;\n }\n return doSplitByStyles(line, segments, points, segmentOptions);\n}\nfunction doSplitByStyles(line, segments, points, segmentOptions) {\n const baseStyle = readStyle(line.options);\n const count = points.length;\n const result = [];\n let start = segments[0].start;\n let i = start;\n for (const segment of segments) {\n let prevStyle = baseStyle;\n let prev = points[start % count];\n let style;\n for (i = start + 1; i <= segment.end; i++) {\n const pt = points[i % count];\n style = readStyle(segmentOptions.setContext({\n type: 'segment',\n p0: prev,\n p1: pt,\n p0DataIndex: (i - 1) % count,\n p1DataIndex: i % count,\n datasetIndex: line._datasetIndex\n }));\n if (styleChanged(style, prevStyle)) {\n result.push({start: start, end: i - 1, loop: segment.loop, style: prevStyle});\n prevStyle = style;\n start = i - 1;\n }\n prev = pt;\n prevStyle = style;\n }\n if (start < i - 1) {\n result.push({start, end: i - 1, loop: segment.loop, style});\n start = i - 1;\n }\n }\n return result;\n}\nfunction readStyle(options) {\n return {\n backgroundColor: options.backgroundColor,\n borderCapStyle: options.borderCapStyle,\n borderDash: options.borderDash,\n borderDashOffset: options.borderDashOffset,\n borderJoinStyle: options.borderJoinStyle,\n borderWidth: options.borderWidth,\n borderColor: options.borderColor\n };\n}\nfunction styleChanged(style, prevStyle) {\n return prevStyle && JSON.stringify(style) !== JSON.stringify(prevStyle);\n}\n\nexport { overrides as $, toPadding as A, each as B, getMaximumSize as C, _getParentNode as D, readUsedSize as E, throttled as F, supportsEventListenerOptions as G, HALF_PI as H, _isDomSupported as I, log10 as J, _factorize as K, finiteOrDefault as L, callback as M, _addGrace as N, toDegrees as O, PI as P, _measureText as Q, _int16Range as R, _alignPixel as S, TAU as T, clipArea as U, renderText as V, unclipArea as W, toFont as X, _toLeftRightCenter as Y, _alignStartEnd as Z, _arrayUnique as _, resolve as a, merge as a0, _capitalize as a1, descriptors as a2, isFunction as a3, _attachContext as a4, _createResolver as a5, _descriptors as a6, mergeIf as a7, uid as a8, debounce as a9, _setMinAndMaxByKey as aA, niceNum as aB, almostWhole as aC, almostEquals as aD, _decimalPlaces as aE, _longestText as aF, _filterBetween as aG, _lookup as aH, getHoverColor as aI, clone$1 as aJ, _merger as aK, _mergerIf as aL, _deprecated as aM, toFontString as aN, splineCurve as aO, splineCurveMonotone as aP, getStyle as aQ, fontString as aR, toLineHeight as aS, PITAU as aT, INFINITY as aU, RAD_PER_DEG as aV, QUARTER_PI as aW, TWO_THIRDS_PI as aX, _angleDiff as aY, retinaScale as aa, clearCanvas as ab, setsEqual as ac, _elementsEqual as ad, getAngleFromPoint as ae, _readValueToProps as af, _updateBezierControlPoints as ag, _computeSegments as ah, _boundSegments as ai, _steppedInterpolation as aj, _bezierInterpolation as ak, _pointInLine as al, _steppedLineTo as am, _bezierCurveTo as an, drawPoint as ao, addRoundedRectPath as ap, toTRBL as aq, toTRBLCorners as ar, _boundSegment as as, _normalizeAngle as at, getRtlAdapter as au, overrideTextDirection as av, _textX as aw, restoreTextDirection as ax, noop as ay, distanceBetweenPoints as az, isArray as b, color as c, defaults as d, effects as e, resolveObjectKey as f, isNumberFinite as g, defined as h, isObject as i, isNullOrUndef as j, toPercentage as k, listenArrayEvents as l, toDimension as m, formatNumber as n, _angleBetween as o, isNumber as p, _limitValue as q, requestAnimFrame as r, sign as s, toRadians as t, unlistenArrayEvents as u, valueOrDefault as v, _lookupByKey as w, getRelativePosition as x, _isPointInArea as y, _rlookupByKey as z };\n"],"sourceRoot":""}