diff --git a/asset-manifest.json b/asset-manifest.json index ce8e9cf..83617c9 100644 --- a/asset-manifest.json +++ b/asset-manifest.json @@ -1,7 +1,7 @@ { "files": { "main.css": "/Immersion-Stats/static/css/main.3e38937c.css", - "main.js": "/Immersion-Stats/static/js/main.0f7c2ed7.js", + "main.js": "/Immersion-Stats/static/js/main.a88b75a6.js", "static/js/3.3249ec0e.chunk.js": "/Immersion-Stats/static/js/3.3249ec0e.chunk.js", "static/js/201.806ea779.chunk.js": "/Immersion-Stats/static/js/201.806ea779.chunk.js", "static/js/795.05eded7f.chunk.js": "/Immersion-Stats/static/js/795.05eded7f.chunk.js", @@ -10,11 +10,11 @@ "static/js/482.d3595ae0.chunk.js": "/Immersion-Stats/static/js/482.d3595ae0.chunk.js", "static/js/398.9a1f0bf7.chunk.js": "/Immersion-Stats/static/js/398.9a1f0bf7.chunk.js", "static/js/643.4b2dd8df.chunk.js": "/Immersion-Stats/static/js/643.4b2dd8df.chunk.js", - "static/js/410.2838bd24.chunk.js": "/Immersion-Stats/static/js/410.2838bd24.chunk.js", + "static/js/410.7559e4e7.chunk.js": "/Immersion-Stats/static/js/410.7559e4e7.chunk.js", "static/js/828.549330ba.chunk.js": "/Immersion-Stats/static/js/828.549330ba.chunk.js", "index.html": "/Immersion-Stats/index.html", "main.3e38937c.css.map": "/Immersion-Stats/static/css/main.3e38937c.css.map", - "main.0f7c2ed7.js.map": "/Immersion-Stats/static/js/main.0f7c2ed7.js.map", + "main.a88b75a6.js.map": "/Immersion-Stats/static/js/main.a88b75a6.js.map", "3.3249ec0e.chunk.js.map": "/Immersion-Stats/static/js/3.3249ec0e.chunk.js.map", "201.806ea779.chunk.js.map": "/Immersion-Stats/static/js/201.806ea779.chunk.js.map", "795.05eded7f.chunk.js.map": "/Immersion-Stats/static/js/795.05eded7f.chunk.js.map", @@ -23,11 +23,11 @@ "482.d3595ae0.chunk.js.map": "/Immersion-Stats/static/js/482.d3595ae0.chunk.js.map", "398.9a1f0bf7.chunk.js.map": "/Immersion-Stats/static/js/398.9a1f0bf7.chunk.js.map", "643.4b2dd8df.chunk.js.map": "/Immersion-Stats/static/js/643.4b2dd8df.chunk.js.map", - "410.2838bd24.chunk.js.map": "/Immersion-Stats/static/js/410.2838bd24.chunk.js.map", + "410.7559e4e7.chunk.js.map": "/Immersion-Stats/static/js/410.7559e4e7.chunk.js.map", "828.549330ba.chunk.js.map": "/Immersion-Stats/static/js/828.549330ba.chunk.js.map" }, "entrypoints": [ "static/css/main.3e38937c.css", - "static/js/main.0f7c2ed7.js" + "static/js/main.a88b75a6.js" ] } \ No newline at end of file diff --git a/index.html b/index.html index e5ff27d..685f6a4 100644 --- a/index.html +++ b/index.html @@ -1 +1 @@ -Immersion Stats
\ No newline at end of file +Immersion Stats
\ No newline at end of file diff --git a/static/js/410.2838bd24.chunk.js b/static/js/410.2838bd24.chunk.js deleted file mode 100644 index 55ab43a..0000000 --- a/static/js/410.2838bd24.chunk.js +++ /dev/null @@ -1,3 +0,0 @@ -/*! For license information please see 410.2838bd24.chunk.js.LICENSE.txt */ -"use strict";(self.webpackChunkimmersion_stats=self.webpackChunkimmersion_stats||[]).push([[410],{6886:function(t,e,i){i.d(e,{y1:function(){return w}});var n=i(2791);i(184);function r(){return r=Object.assign?Object.assign.bind():function(t){for(var e=1;e'),1):!e||t.some((function(t){return e.includes(t)}))||t.includes("*"))){var t,e,i=function(t,e){var i;(void 0===e&&(e=!1),!v(t,["input","textarea","select"])||v(t,null==S?void 0:S.enableOnFormTags))&&(null!=S&&null!=S.ignoreEventWhen&&S.ignoreEventWhen(t)||(null===a.current||document.activeElement===a.current||a.current.contains(document.activeElement)?(null==(i=t.target)||!i.isContentEditable||null!=S&&S.enableOnContentEditable)&&l(p,null==S?void 0:S.splitKey).forEach((function(i){var n,r=u(i,null==S?void 0:S.combinationKey);if(g(t,r,null==S?void 0:S.ignoreModifiers)||null!=(n=r.keys)&&n.includes("*")){if(e&&o.current)return;if(function(t,e,i){("function"===typeof i&&i(t,e)||!0===i)&&t.preventDefault()}(t,r,null==S?void 0:S.preventDefault),!function(t,e,i){return"function"===typeof i?i(t,e):!0===i||void 0===i}(t,r,null==S?void 0:S.enabled))return void k(t);M.current(t,r),e||(o.current=!0)}})):k(t)))},n=function(t){void 0!==t.key&&(d(s(t.code)),(void 0===(null==S?void 0:S.keydown)&&!0!==(null==S?void 0:S.keyup)||null!=S&&S.keydown)&&i(t))},r=function(t){void 0!==t.key&&(f(s(t.code)),o.current=!1,null!=S&&S.keyup&&i(t,!0))},c=a.current||(null==h?void 0:h.document)||document;return c.addEventListener("keyup",r),c.addEventListener("keydown",n),O&&l(p,null==S?void 0:S.splitKey).forEach((function(t){return O.addHotkey(u(t,null==S?void 0:S.combinationKey,null==S?void 0:S.description))})),function(){c.removeEventListener("keyup",r),c.removeEventListener("keydown",n),O&&l(p,null==S?void 0:S.splitKey).forEach((function(t){return O.removeHotkey(u(t,null==S?void 0:S.combinationKey,null==S?void 0:S.description))}))}}}),[p,S,P]),a}},4942:function(t,e,i){i.d(e,{Z:function(){return r}});var n=i(9142);function r(t,e,i){return(e=(0,n.Z)(e))in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}},1413:function(t,e,i){i.d(e,{Z:function(){return a}});var n=i(4942);function r(t,e){var i=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),i.push.apply(i,n)}return i}function a(t){for(var e=1;e0&&void 0!==arguments[0]?arguments[0]:Date.now(),i=0;this._charts.forEach((function(n,r){if(n.running&&n.items.length){for(var a,o=n.items,s=o.length-1,l=!1;s>=0;--s)(a=o[s])._active?(a._total>n.duration&&(n.duration=a._total),a.tick(e),l=!0):(o[s]=o[o.length-1],o.pop());l&&(r.draw(),t._notify(r,n,e,"progress")),o.length||(n.running=!1,t._notify(r,n,e,"complete"),n.initial=!1),i+=o.length}})),this._lastDate=e,0===i&&(this._running=!1)}},{key:"_getAnims",value:function(t){var e=this._charts,i=e.get(t);return i||(i={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},e.set(t,i)),i}},{key:"listen",value:function(t,e,i){this._getAnims(t).listeners[e].push(i)}},{key:"add",value:function(t,e){var i;e&&e.length&&(i=this._getAnims(t).items).push.apply(i,(0,d.Z)(e))}},{key:"has",value:function(t){return this._getAnims(t).items.length>0}},{key:"start",value:function(t){var e=this._charts.get(t);e&&(e.running=!0,e.start=Date.now(),e.duration=e.items.reduce((function(t,e){return Math.max(t,e._duration)}),0),this._refresh())}},{key:"running",value:function(t){if(!this._running)return!1;var e=this._charts.get(t);return!!(e&&e.running&&e.items.length)}},{key:"stop",value:function(t){var e=this._charts.get(t);if(e&&e.items.length){for(var i=e.items,n=i.length-1;n>=0;--n)i[n].cancel();e.items=[],this._notify(t,e,Date.now(),"complete")}}},{key:"remove",value:function(t){return this._charts.delete(t)}}]),t}(),y=new p,m="transparent",b={boolean:function(t,e,i){return i>.5?e:t},color:function(t,e,i){var n=(0,g.c)(t||m),r=n.valid&&(0,g.c)(e||m);return r&&r.valid?r.mix(n,i).hexString():e},number:function(t,e,i){return t+(e-t)*i}},x=function(){function t(e,i,n,r){(0,f.Z)(this,t);var a=i[n];r=(0,g.a)([e.to,r,a,e.from]);var o=(0,g.a)([e.from,a,r]);this._active=!0,this._fn=e.fn||b[e.type||typeof o],this._easing=g.e[e.easing]||g.e.linear,this._start=Math.floor(Date.now()+(e.delay||0)),this._duration=this._total=Math.floor(e.duration),this._loop=!!e.loop,this._target=i,this._prop=n,this._from=o,this._to=r,this._promises=void 0}return(0,v.Z)(t,[{key:"active",value:function(){return this._active}},{key:"update",value:function(t,e,i){if(this._active){this._notify(!1);var n=this._target[this._prop],r=i-this._start,a=this._duration-r;this._start=i,this._duration=Math.floor(Math.max(a,t.duration)),this._total+=r,this._loop=!!t.loop,this._to=(0,g.a)([t.to,e,n,t.from]),this._from=(0,g.a)([t.from,n,e])}}},{key:"cancel",value:function(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}},{key:"tick",value:function(t){var e,i=t-this._start,n=this._duration,r=this._prop,a=this._from,o=this._loop,s=this._to;if(this._active=a!==s&&(o||i1?2-e:e,e=this._easing(Math.min(1,Math.max(0,e))),this._target[r]=this._fn(a,s,e))}},{key:"wait",value:function(){var t=this._promises||(this._promises=[]);return new Promise((function(e,i){t.push({res:e,rej:i})}))}},{key:"_notify",value:function(t){for(var e=t?"res":"rej",i=this._promises||[],n=0;n=0;--i){var l=o[i];if("$"!==l.charAt(0))if("options"!==l){var u=e[l],h=a[l],c=n.get(l);if(h){if(c&&h.active()){h.update(c,u,s);continue}h.cancel()}c&&c.duration?(a[l]=h=new x(c,t,l,u),r.push(h)):t[l]=u}else r.push.apply(r,(0,d.Z)(this._animateOptions(t,e)))}return r}},{key:"update",value:function(t,e){if(0!==this._properties.size){var i=this._createAnimations(t,e);return i.length?(y.add(this._chart,i),!0):void 0}Object.assign(t,e)}}]),t}();function _(t,e){var i=t&&t.options||{},n=i.reverse,r=void 0===i.min?e:0,a=void 0===i.max?e:0;return{start:n?a:r,end:n?r:a}}function w(t,e){var i,n,r=[],a=t._getSortedDatasetMetas(e);for(i=0,n=a.length;i3&&void 0!==arguments[3]?arguments[3]:{},l=t.keys,u="single"===s.mode;if(null!==e){for(n=0,r=l.length;n0||!i&&s<0)return o.index}}catch(l){a.e(l)}finally{a.f()}return null}function C(t,e){for(var i,n=t.chart,r=t._cachedMeta,a=n._stacks||(n._stacks={}),o=r.iScale,s=r.vScale,l=r.index,u=o.axis,h=s.axis,c=function(t,e,i){return"".concat(t.id,".").concat(e.id,".").concat(i.stack||i.type)}(o,s,r),d=e.length,f=0;f0&&a._parsed[t-1];if(!1===this._parsing)a._parsed=o,a._sorted=!0,r=o;else{r=(0,g.b)(o[t])?this.parseArrayData(a,o,t,e):(0,g.i)(o[t])?this.parseObjectData(a,o,t,e):this.parsePrimitiveData(a,o,t,e);for(i=0;ie||f=0;--i)if(!v()){this.updateRangeFromParsed(h,t,n,u);break}return h}},{key:"getAllParsedValues",value:function(t){var e,i,n,r=this._cachedMeta._parsed,a=[];for(e=0,i=r.length;e=0&&t1&&void 0!==arguments[1]?arguments[1]:"default",n=arguments.length>2?arguments[2]:void 0,r="active"===i,a=this._cachedDataOpts,o=t+"-"+i,s=a[o],l=this.enableOptionSharing&&(0,g.h)(n);if(s)return E(s,l);var u=this.chart.config,h=u.datasetElementScopeKeys(this._type,t),c=r?["".concat(t,"Hover"),"hover",t,""]:[t,""],d=u.getOptionScopes(this.getDataset(),h),f=Object.keys(g.d.elements[t]),v=u.resolveNamedOptions(d,f,(function(){return e.getContext(n,r,i)}),c);return v.$shared&&(v.$shared=l,a[o]=Object.freeze(E(v,l))),v}},{key:"_resolveAnimations",value:function(t,e,i){var n,r=this.chart,a=this._cachedDataOpts,o="animation-".concat(e),s=a[o];if(s)return s;if(!1!==r.options.animation){var l=this.chart.config,u=l.datasetAnimationScopeKeys(this._type,e),h=l.getOptionScopes(this.getDataset(),u);n=l.createResolver(h,this.getContext(t,i,e))}var c=new k(r,n&&n.animations);return n&&n._cacheable&&(a[o]=Object.freeze(c)),c}},{key:"getSharedOptions",value:function(t){if(t.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},t))}},{key:"includeOptions",value:function(t,e){return!e||T(t)||this.chart._animationsDisabled}},{key:"_getSharedOptions",value:function(t,e){var i=this.resolveDataElementOptions(t,e),n=this._sharedOptions,r=this.getSharedOptions(i),a=this.includeOptions(e,r)||r!==n;return this.updateSharedOptions(r,e,i),{sharedOptions:r,includeOptions:a}}},{key:"updateElement",value:function(t,e,i,n){T(n)?Object.assign(t,i):this._resolveAnimations(e,n).update(t,i)}},{key:"updateSharedOptions",value:function(t,e,i){t&&!T(e)&&this._resolveAnimations(void 0,e).update(t,i)}},{key:"_setStyle",value:function(t,e,i,n){t.active=n;var r=this.getStyle(e,n);this._resolveAnimations(e,i,n).update(t,{options:!n&&this.getSharedOptions(r)||r})}},{key:"removeHoverStyle",value:function(t,e,i){this._setStyle(t,i,"active",!1)}},{key:"setHoverStyle",value:function(t,e,i){this._setStyle(t,i,"active",!0)}},{key:"_removeDatasetHoverStyle",value:function(){var t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!1)}},{key:"_setDatasetHoverStyle",value:function(){var t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!0)}},{key:"_resyncElements",value:function(t){var e,i=this._data,n=this._cachedMeta.data,r=(0,c.Z)(this._syncList);try{for(r.s();!(e=r.n()).done;){var a=(0,u.Z)(e.value,3),o=a[0],s=a[1],l=a[2];this[o](s,l)}}catch(v){r.e(v)}finally{r.f()}this._syncList=[];var h=n.length,d=i.length,f=Math.min(d,h);f&&this.parse(0,f),d>h?this._insertElements(h,d-h,t):d2&&void 0!==arguments[2])||arguments[2],r=this._cachedMeta,a=r.data,o=t+e,s=function(t){for(t.length+=e,i=t.length-1;i>=o;i--)t[i]=t[i-e]};for(s(a),i=t;iMath.abs(s)&&(l=s,u=o),e[i.axis]=u,e._custom={barStart:l,barEnd:u,start:r,end:a,min:o,max:s}}(t,e,i,n):e[i.axis]=i.parse(t,n),e}function I(t,e,i,n){var r,a,o,s,l=t.iScale,u=t.vScale,h=l.getLabels(),c=l===u,d=[];for(r=i,a=i+n;rt.x,i="left",n="right"):(e=t.base=i?1:-1)}(i,r,h)*u,v===h&&(b-=i/2);var x=r.getPixelForDecimal(0),k=r.getPixelForDecimal(1),_=Math.min(x,k),w=Math.max(x,k);e=(b=Math.max(Math.min(b,w),_))+i,a&&!f&&(c._stacks[r.axis]._visualValues[o]=r.getValueForPixel(e)-r.getValueForPixel(b))}if(b===r.getPixelForValue(h)){var M=(0,g.s)(i)*r.getLineWidthForValue(h)/2;b+=M,i-=M}return{size:i,base:b,head:e,center:e+i/2}}},{key:"_calculateBarIndexPixels",value:function(t,e){var i,n,r=e.scale,a=this.options,o=a.skipNull,s=(0,g.v)(a.maxBarThickness,1/0);if(e.grouped){var l=o?this._getStackCount(t):e.stackCount,u="flex"===a.barThickness?function(t,e,i,n){var r=e.pixels,a=r[t],o=t>0?r[t-1]:null,s=t=0;--i)e=Math.max(e,t[i].size(this.resolveDataElementOptions(i))/2);return e>0&&e}},{key:"getLabelAndValue",value:function(t){var e=this._cachedMeta,i=this.chart.data.labels||[],n=e.xScale,r=e.yScale,a=this.getParsed(t),o=n.getLabelForValue(a.x),s=r.getLabelForValue(a.y),l=a._custom;return{label:i[t]||"",value:"("+o+", "+s+(l?", "+l:"")+")"}}},{key:"update",value:function(t){var e=this._cachedMeta.data;this.updateElements(e,0,e.length,t)}},{key:"updateElements",value:function(t,e,i,n){for(var r="reset"===n,a=this._cachedMeta,o=a.iScale,s=a.vScale,l=this._getSharedOptions(e,n),u=l.sharedOptions,h=l.includeOptions,c=o.axis,d=s.axis,f=e;f0&&!isNaN(t)?g.T*(Math.abs(t)/e):0}},{key:"getLabelAndValue",value:function(t){var e=this._cachedMeta,i=this.chart,n=i.data.labels||[],r=(0,g.o)(e._parsed[t],i.options.locale);return{label:n[t]||"",value:r}}},{key:"getMaxBorderWidth",value:function(t){var e,i,n,r,a,o=0,s=this.chart;if(!t)for(e=0,i=s.data.datasets.length;e0&&this.getParsed(e-1),M=0;M<_;++M){var S=t[M],P=x?S:{};if(M=k)P.skip=!0;else{var O=this.getParsed(M),C=(0,g.k)(O[v]),D=P[f]=o.getPixelForValue(O[f],M),A=P[v]=r||C?s.getBasePixel():s.getPixelForValue(l?this.applyStack(s,O,l):O[v],M);P.skip=isNaN(D)||isNaN(A)||C,P.stop=M>0&&Math.abs(O[f]-w[f])>b,m&&(P.parsed=O,P.raw=u.data[M]),d&&(P.options=c||this.resolveDataElementOptions(M,S.active?"active":n)),x||this.updateElement(S,M,P,n),w=O}}}},{key:"getMaxOverflow",value:function(){var t=this._cachedMeta,e=t.dataset,i=e.options&&e.options.borderWidth||0,n=t.data||[];if(!n.length)return i;var r=n[0].size(this.resolveDataElementOptions(0)),a=n[n.length-1].size(this.resolveDataElementOptions(n.length-1));return Math.max(i,r,a)/2}},{key:"draw",value:function(){var t=this._cachedMeta;t.dataset.updateControlPoints(this.chart.chartArea,t.iScale.axis),o((0,a.Z)(i.prototype),"draw",this).call(this)}}]),i}(Z);(0,h.Z)(Y,"id","line"),(0,h.Z)(Y,"defaults",{datasetElementType:"line",dataElementType:"point",showLine:!0,spanGaps:!1}),(0,h.Z)(Y,"overrides",{scales:{_index_:{type:"category"},_value_:{type:"linear"}}});var X=function(t){(0,s.Z)(i,t);var e=(0,l.Z)(i);function i(t,n){var r;return(0,f.Z)(this,i),(r=e.call(this,t,n)).innerRadius=void 0,r.outerRadius=void 0,r}return(0,v.Z)(i,[{key:"getLabelAndValue",value:function(t){var e=this._cachedMeta,i=this.chart,n=i.data.labels||[],r=(0,g.o)(e._parsed[t].r,i.options.locale);return{label:n[t]||"",value:r}}},{key:"parseObjectData",value:function(t,e,i,n){return g.y.bind(this)(t,e,i,n)}},{key:"update",value:function(t){var e=this._cachedMeta.data;this._updateRadius(),this.updateElements(e,0,e.length,t)}},{key:"getMinMax",value:function(){var t=this,e=this._cachedMeta,i={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY};return e.data.forEach((function(e,n){var r=t.getParsed(n).r;!isNaN(r)&&t.chart.getDataVisibility(n)&&(ri.max&&(i.max=r))})),i}},{key:"_updateRadius",value:function(){var t=this.chart,e=t.chartArea,i=t.options,n=Math.min(e.right-e.left,e.bottom-e.top),r=Math.max(n/2,0),a=(r-Math.max(i.cutoutPercentage?r/100*i.cutoutPercentage:1,0))/t.getVisibleDatasetCount();this.outerRadius=r-a*this.index,this.innerRadius=this.outerRadius-a}},{key:"updateElements",value:function(t,e,i,n){var r,a="reset"===n,o=this.chart,s=o.options.animation,l=this._cachedMeta.rScale,u=l.xCenter,h=l.yCenter,c=l.getIndexAngle(0)-.5*g.P,d=c,f=360/this.countVisibleElements();for(r=0;r0&&this.getParsed(e-1),_=e;_0&&Math.abs(M[f]-k[f])>b,m&&(S.parsed=M,S.raw=u.data[_]),d&&(S.options=c||this.resolveDataElementOptions(_,w.active?"active":n)),x||this.updateElement(w,_,S,n),k=M}this.updateSharedOptions(c,n,h)}},{key:"getMaxOverflow",value:function(){var t=this._cachedMeta,e=t.data||[];if(!this.options.showLine){for(var i=0,n=e.length-1;n>=0;--n)i=Math.max(i,e[n].size(this.resolveDataElementOptions(n))/2);return i>0&&i}var r=t.dataset,a=r.options&&r.options.borderWidth||0;if(!e.length)return a;var o=e[0].size(this.resolveDataElementOptions(0)),s=e[e.length-1].size(this.resolveDataElementOptions(e.length-1));return Math.max(a,o,s)/2}}]),i}(Z);(0,h.Z)(K,"id","scatter"),(0,h.Z)(K,"defaults",{datasetElementType:!1,dataElementType:"point",showLine:!1,fill:!1}),(0,h.Z)(K,"overrides",{interaction:{mode:"point"},scales:{x:{type:"linear"},y:{type:"linear"}}});function Q(){throw new Error("This method is not implemented: Check that a complete date adapter is provided.")}var q={_date:function(){function t(e){(0,f.Z)(this,t),(0,h.Z)(this,"options",void 0),this.options=e||{}}return(0,v.Z)(t,[{key:"init",value:function(){}},{key:"formats",value:function(){return Q()}},{key:"parse",value:function(){return Q()}},{key:"format",value:function(){return Q()}},{key:"add",value:function(){return Q()}},{key:"diff",value:function(){return Q()}},{key:"startOf",value:function(){return Q()}},{key:"endOf",value:function(){return Q()}}],[{key:"override",value:function(e){Object.assign(t.prototype,e)}}]),t}()};function J(t,e,i,n){var r=t.controller,a=t.data,o=t._sorted,s=r._cachedMeta.iScale;if(s&&e===s.axis&&"r"!==e&&o&&a.length){var l=s._reversePixels?g.A:g.B;if(!n)return l(a,e,i);if(r._sharedOptions){var u=a[0],h="function"===typeof u.getRange&&u.getRange(e);if(h){var c=l(a,e,i-h),d=l(a,e,i+h);return{lo:c.lo,hi:d.hi}}}}return{lo:0,hi:a.length-1}}function G(t,e,i,n,r){for(var a=t.getSortedVisibleDatasetMetas(),o=i[e],s=0,l=a.length;s0){var l=s[0].datasetIndex,u=t.getDatasetMeta(l).data;s=[];for(var h=0;hr)return function(t,e,i,n){var r,a=0,o=i[0];for(n=Math.ceil(n),r=0;rr)return l}return Math.max(r,1)}(a,e,r);if(o>0){var c,d,f=o>1?Math.round((l-s)/(o-1)):null;for(Ft(e,u,h,(0,g.k)(f)?0:s-f,s),c=0,d=o-1;cs+l)))return u}function Nt(t){return t.drawTicks?t.tickLength:0}function Bt(t,e){if(!t.display)return 0;var i=(0,g.a0)(t.font,e),n=(0,g.E)(t.padding);return((0,g.b)(t.text)?t.text.length:1)*i.lineHeight+n.height}function Ht(t,e,i){var n=(0,g.a1)(t);return(i&&"right"!==e||!i&&"right"===e)&&(n=function(t){return"left"===t?"right":"right"===t?"left":t}(n)),n}var Yt=function(t){(0,s.Z)(i,t);var e=(0,l.Z)(i);function i(t){var n;return(0,f.Z)(this,i),(n=e.call(this)).id=t.id,n.type=t.type,n.options=void 0,n.ctx=t.ctx,n.chart=t.chart,n.top=void 0,n.bottom=void 0,n.left=void 0,n.right=void 0,n.width=void 0,n.height=void 0,n._margins={left:0,right:0,top:0,bottom:0},n.maxWidth=void 0,n.maxHeight=void 0,n.paddingTop=void 0,n.paddingBottom=void 0,n.paddingLeft=void 0,n.paddingRight=void 0,n.axis=void 0,n.labelRotation=void 0,n.min=void 0,n.max=void 0,n._range=void 0,n.ticks=[],n._gridLineItems=null,n._labelItems=null,n._labelSizes=null,n._length=0,n._maxLength=0,n._longestTextCache={},n._startPixel=void 0,n._endPixel=void 0,n._reversePixels=!1,n._userMax=void 0,n._userMin=void 0,n._suggestedMax=void 0,n._suggestedMin=void 0,n._ticksLength=0,n._borderValue=0,n._cache={},n._dataLimitsCached=!1,n.$context=void 0,n}return(0,v.Z)(i,[{key:"init",value:function(t){this.options=t.setContext(this.getContext()),this.axis=t.axis,this._userMin=this.parse(t.min),this._userMax=this.parse(t.max),this._suggestedMin=this.parse(t.suggestedMin),this._suggestedMax=this.parse(t.suggestedMax)}},{key:"parse",value:function(t,e){return t}},{key:"getUserBounds",value:function(){var t=this._userMin,e=this._userMax,i=this._suggestedMin,n=this._suggestedMax;return t=(0,g.O)(t,Number.POSITIVE_INFINITY),e=(0,g.O)(e,Number.NEGATIVE_INFINITY),i=(0,g.O)(i,Number.POSITIVE_INFINITY),n=(0,g.O)(n,Number.NEGATIVE_INFINITY),{min:(0,g.O)(t,i),max:(0,g.O)(e,n),minDefined:(0,g.g)(t),maxDefined:(0,g.g)(e)}}},{key:"getMinMax",value:function(t){var e,i=this.getUserBounds(),n=i.min,r=i.max,a=i.minDefined,o=i.maxDefined;if(a&&o)return{min:n,max:r};for(var s=this.getMatchingVisibleMetas(),l=0,u=s.length;lr?r:n,r=a&&n>r?n:r,{min:(0,g.O)(n,(0,g.O)(r,n)),max:(0,g.O)(r,(0,g.O)(n,r))}}},{key:"getPadding",value:function(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}},{key:"getTicks",value:function(){return this.ticks}},{key:"getLabels",value:function(){var t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels||[]}},{key:"getLabelItems",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.chart.chartArea;return this._labelItems||(this._labelItems=this._computeLabelItems(t))}},{key:"beforeLayout",value:function(){this._cache={},this._dataLimitsCached=!1}},{key:"beforeUpdate",value:function(){(0,g.Q)(this.options.beforeUpdate,[this])}},{key:"update",value:function(t,e,i){var n=this.options,r=n.beginAtZero,a=n.grace,o=n.ticks,s=o.sampleSize;this.beforeUpdate(),this.maxWidth=t,this.maxHeight=e,this._margins=i=Object.assign({left:0,right:0,top:0,bottom:0},i),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+i.left+i.right:this.height+i.top+i.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=(0,g.R)(this,a,r),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();var l=s=s||a<=1||!this.isHorizontal())this.labelRotation=o;else{var u=this._getLabelSizes(),h=u.widest.width,c=u.highest.height,d=(0,g.S)(this.chart.width-h,0,this.maxWidth);h+6>(t=n.offset?this.maxWidth/a:d/(a-1))&&(t=d/(a-(n.offset?.5:1)),e=this.maxHeight-Nt(n.grid)-r.padding-Bt(n.title,this.chart.options.font),i=Math.sqrt(h*h+c*c),l=(0,g.U)(Math.min(Math.asin((0,g.S)((u.highest.height+6)/t,-1,1)),Math.asin((0,g.S)(e/i,-1,1))-Math.asin((0,g.S)(c/i,-1,1)))),l=Math.max(o,Math.min(s,l))),this.labelRotation=l}}},{key:"afterCalculateLabelRotation",value:function(){(0,g.Q)(this.options.afterCalculateLabelRotation,[this])}},{key:"afterAutoSkip",value:function(){}},{key:"beforeFit",value:function(){(0,g.Q)(this.options.beforeFit,[this])}},{key:"fit",value:function(){var t={width:0,height:0},e=this.chart,i=this.options,n=i.ticks,r=i.title,a=i.grid,o=this._isVisible(),s=this.isHorizontal();if(o){var l=Bt(r,e.options.font);if(s?(t.width=this.maxWidth,t.height=Nt(a)+l):(t.height=this.maxHeight,t.width=Nt(a)+l),n.display&&this.ticks.length){var u=this._getLabelSizes(),h=u.first,c=u.last,d=u.widest,f=u.highest,v=2*n.padding,p=(0,g.t)(this.labelRotation),y=Math.cos(p),m=Math.sin(p);if(s){var b=n.mirror?0:m*d.width+y*f.height;t.height=Math.min(this.maxHeight,t.height+b+v)}else{var x=n.mirror?0:y*d.width+m*f.height;t.width=Math.min(this.maxWidth,t.width+x+v)}this._calculatePadding(h,c,m,y)}}this._handleMargins(),s?(this.width=this._length=e.width-this._margins.left-this._margins.right,this.height=t.height):(this.width=t.width,this.height=this._length=e.height-this._margins.top-this._margins.bottom)}},{key:"_calculatePadding",value:function(t,e,i,n){var r=this.options,a=r.ticks,o=a.align,s=a.padding,l=r.position,u=0!==this.labelRotation,h="top"!==l&&"x"===this.axis;if(this.isHorizontal()){var c=this.getPixelForTick(0)-this.left,d=this.right-this.getPixelForTick(this.ticks.length-1),f=0,v=0;u?h?(f=n*t.width,v=i*e.height):(f=i*t.height,v=n*e.width):"start"===o?v=e.width:"end"===o?f=t.width:"inner"!==o&&(f=t.width/2,v=e.width/2),this.paddingLeft=Math.max((f-c+s)*this.width/(this.width-c),0),this.paddingRight=Math.max((v-d+s)*this.width/(this.width-d),0)}else{var g=e.height/2,p=t.height/2;"start"===o?(g=0,p=t.height):"end"===o&&(g=e.height,p=0),this.paddingTop=g+s,this.paddingBottom=p+s}}},{key:"_handleMargins",value:function(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}},{key:"afterFit",value:function(){(0,g.Q)(this.options.afterFit,[this])}},{key:"isHorizontal",value:function(){var t=this.options,e=t.axis,i=t.position;return"top"===i||"bottom"===i||"x"===e}},{key:"isFullSize",value:function(){return this.options.fullSize}},{key:"_convertTicksToLabels",value:function(t){var e,i;for(this.beforeTickToLabelConversion(),this.generateTickLabels(t),e=0,i=t.length;ee){for(i=0;ie.length-1?null:this.getPixelForValue(e[t].value)}},{key:"getPixelForDecimal",value:function(t){this._reversePixels&&(t=1-t);var e=this._startPixel+t*this._length;return(0,g.W)(this._alignToPixels?(0,g.X)(this.chart,e,0):e)}},{key:"getDecimalForPixel",value:function(t){var e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e}},{key:"getBasePixel",value:function(){return this.getPixelForValue(this.getBaseValue())}},{key:"getBaseValue",value:function(){var t=this.min,e=this.max;return t<0&&e<0?e:t>0&&e>0?t:0}},{key:"getContext",value:function(t){var e,i,n=this.ticks||[];if(t>=0&&to*n?o/i:s/n:s*n0}},{key:"_computeGridLineItems",value:function(t){var e,i,n,r,a,o,s,l,u,h,c,d,f=this.axis,v=this.chart,p=this.options,y=p.grid,m=p.position,b=p.border,x=y.offset,k=this.isHorizontal(),_=this.ticks.length+(x?1:0),w=Nt(y),M=[],S=b.setContext(this.getContext()),P=S.display?S.width:0,O=P/2,C=function(t){return(0,g.X)(v,t,P)};if("top"===m)e=C(this.bottom),o=this.bottom-w,l=e-O,h=C(t.top)+O,d=t.bottom;else if("bottom"===m)e=C(this.top),h=t.top,d=C(t.bottom)-O,o=e+O,l=this.top+w;else if("left"===m)e=C(this.right),a=this.right-w,s=e-O,u=C(t.left)+O,c=t.right;else if("right"===m)e=C(this.left),u=t.left,c=C(t.right)-O,a=e+O,s=this.left+w;else if("x"===f){if("center"===m)e=C((t.top+t.bottom)/2+.5);else if((0,g.i)(m)){var D=Object.keys(m)[0],A=m[D];e=C(this.chart.scales[D].getPixelForValue(A))}h=t.top,d=t.bottom,l=(o=e+O)+w}else if("y"===f){if("center"===m)e=C((t.left+t.right)/2);else if((0,g.i)(m)){var T=Object.keys(m)[0],E=m[T];e=C(this.chart.scales[T].getPixelForValue(E))}s=(a=e-O)-w,u=t.left,c=t.right}var Z=(0,g.v)(p.ticks.maxTicksLimit,_),L=Math.max(1,Math.ceil(_/Z));for(i=0;i<_;i+=L){var R=this.getContext(i),I=y.setContext(R),F=b.setContext(R),z=I.lineWidth,j=I.color,W=F.dash||[],V=F.dashOffset,N=I.tickWidth,B=I.tickColor,H=I.tickBorderDash||[],Y=I.tickBorderDashOffset;void 0!==(n=Vt(this,i,x))&&(r=(0,g.X)(v,n,z),k?a=s=u=c=r:o=l=h=d=r,M.push({tx1:a,ty1:o,tx2:s,ty2:l,x1:u,y1:h,x2:c,y2:d,width:z,color:j,borderDash:W,borderDashOffset:V,tickWidth:N,tickColor:B,tickBorderDash:H,tickBorderDashOffset:Y}))}return this._ticksLength=_,this._borderValue=e,M}},{key:"_computeLabelItems",value:function(t){var e,i,n,r,a,o,s,l,u,h,c,d=this.axis,f=this.options,v=f.position,p=f.ticks,y=this.isHorizontal(),m=this.ticks,b=p.align,x=p.crossAlign,k=p.padding,_=p.mirror,w=Nt(f.grid),M=w+k,S=_?-k:M,P=-(0,g.t)(this.labelRotation),O=[],C="middle";if("top"===v)a=this.bottom-S,o=this._getXAxisLabelAlignment();else if("bottom"===v)a=this.top+S,o=this._getXAxisLabelAlignment();else if("left"===v){var D=this._getYAxisLabelAlignment(w);o=D.textAlign,r=D.x}else if("right"===v){var A=this._getYAxisLabelAlignment(w);o=A.textAlign,r=A.x}else if("x"===d){if("center"===v)a=(t.top+t.bottom)/2+M;else if((0,g.i)(v)){var T=Object.keys(v)[0],E=v[T];a=this.chart.scales[T].getPixelForValue(E)+M}o=this._getXAxisLabelAlignment()}else if("y"===d){if("center"===v)r=(t.left+t.right)/2-M;else if((0,g.i)(v)){var Z=Object.keys(v)[0],L=v[Z];r=this.chart.scales[Z].getPixelForValue(L)}o=this._getYAxisLabelAlignment(w).textAlign}"y"===d&&("start"===b?C="top":"end"===b&&(C="bottom"));var R=this._getLabelSizes();for(e=0,i=m.length;e=0?e.setContext(this.getContext(i)).lineWidth:0}},{key:"drawGrid",value:function(t){var e,i,n=this.options.grid,r=this.ctx,a=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(t)),o=function(t,e,i){i.width&&i.color&&(r.save(),r.lineWidth=i.width,r.strokeStyle=i.color,r.setLineDash(i.borderDash||[]),r.lineDashOffset=i.borderDashOffset,r.beginPath(),r.moveTo(t.x,t.y),r.lineTo(e.x,e.y),r.stroke(),r.restore())};if(n.display)for(e=0,i=a.length;e1?e-1:0),n=1;n1&&Gt(t[0].toLowerCase());if(s)return s}var l;throw new Error("Cannot determine type of '".concat(t,"' axis. Please provide 'axis' or 'position' option."))}function ee(t,e,i){if(i[e+"AxisID"]===t)return{axis:e}}function ie(t,e){var i=g.a3[t.type]||{scales:{}},n=e.scales||{},r=Jt(t.type,e),a=Object.create(null);return Object.keys(n).forEach((function(e){var o=n[e];if(!(0,g.i)(o))return console.error("Invalid scale configuration for scale: ".concat(e));if(o._proxy)return console.warn("Ignoring resolver passed as options for scale: ".concat(e));var s=te(e,o,function(t,e){if(e.data&&e.data.datasets){var i=e.data.datasets.filter((function(e){return e.xAxisID===t||e.yAxisID===t}));if(i.length)return ee(t,"x",i[0])||ee(t,"y",i[0])}return{}}(e,t),g.d.scales[o.type]),l=function(t,e){return t===e?"_index_":"_value_"}(s,r),u=i.scales||{};a[e]=(0,g.ab)(Object.create(null),[{axis:s},o,u[s],u[l]])})),t.data.datasets.forEach((function(i){var r=i.type||t.type,o=i.indexAxis||Jt(r,e),s=(g.a3[r]||{}).scales||{};Object.keys(s).forEach((function(t){var e=function(t,e){var i=t;return"_index_"===t?i=e:"_value_"===t&&(i="x"===e?"y":"x"),i}(t,o),r=i[e+"AxisID"]||e;a[r]=a[r]||Object.create(null),(0,g.ab)(a[r],[{axis:e},n[r],s[t]])}))})),Object.keys(a).forEach((function(t){var e=a[t];(0,g.ab)(e,[g.d.scales[e.type],g.d.scale])})),a}function ne(t){var e=t.options||(t.options={});e.plugins=(0,g.v)(e.plugins,{}),e.scales=ie(t,e)}function re(t){return(t=t||{}).datasets=t.datasets||[],t.labels=t.labels||[],t}var ae=new Map,oe=new Set;function se(t,e){var i=ae.get(t);return i||(i=e(),ae.set(t,i),oe.add(i)),i}var le=function(t,e,i){var n=(0,g.f)(e,i);void 0!==n&&t.add(n)},ue=function(){function t(e){(0,f.Z)(this,t),this._config=function(t){return(t=t||{}).data=re(t.data),ne(t),t}(e),this._scopeCache=new Map,this._resolverCache=new Map}return(0,v.Z)(t,[{key:"platform",get:function(){return this._config.platform}},{key:"type",get:function(){return this._config.type},set:function(t){this._config.type=t}},{key:"data",get:function(){return this._config.data},set:function(t){this._config.data=re(t)}},{key:"options",get:function(){return this._config.options},set:function(t){this._config.options=t}},{key:"plugins",get:function(){return this._config.plugins}},{key:"update",value:function(){var t=this._config;this.clearCache(),ne(t)}},{key:"clearCache",value:function(){this._scopeCache.clear(),this._resolverCache.clear()}},{key:"datasetScopeKeys",value:function(t){return se(t,(function(){return[["datasets.".concat(t),""]]}))}},{key:"datasetAnimationScopeKeys",value:function(t,e){return se("".concat(t,".transition.").concat(e),(function(){return[["datasets.".concat(t,".transitions.").concat(e),"transitions.".concat(e)],["datasets.".concat(t),""]]}))}},{key:"datasetElementScopeKeys",value:function(t,e){return se("".concat(t,"-").concat(e),(function(){return[["datasets.".concat(t,".elements.").concat(e),"datasets.".concat(t),"elements.".concat(e),""]]}))}},{key:"pluginScopeKeys",value:function(t){var e=t.id,i=this.type;return se("".concat(i,"-plugin-").concat(e),(function(){return[["plugins.".concat(e)].concat((0,d.Z)(t.additionalOptionScopes||[]))]}))}},{key:"_cachedScopes",value:function(t,e){var i=this._scopeCache,n=i.get(t);return n&&!e||(n=new Map,i.set(t,n)),n}},{key:"getOptionScopes",value:function(t,e,i){var n=this.options,r=this.type,a=this._cachedScopes(t,i),o=a.get(e);if(o)return o;var s=new Set;e.forEach((function(e){t&&(s.add(t),e.forEach((function(e){return le(s,t,e)}))),e.forEach((function(t){return le(s,n,t)})),e.forEach((function(t){return le(s,g.a3[r]||{},t)})),e.forEach((function(t){return le(s,g.d,t)})),e.forEach((function(t){return le(s,g.a6,t)}))}));var l=Array.from(s);return 0===l.length&&l.push(Object.create(null)),oe.has(e)&&a.set(e,l),l}},{key:"chartOptionScopes",value:function(){var t=this.options,e=this.type;return[t,g.a3[e]||{},g.d.datasets[e]||{},{type:e},g.d,g.a6]}},{key:"resolveNamedOptions",value:function(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[""],r={$shared:!0},a=he(this._resolverCache,t,n),o=a.resolver,s=a.subPrefixes,l=o;if(function(t,e){var i,n=(0,g.aa)(t),r=n.isScriptable,a=n.isIndexable,o=(0,c.Z)(e);try{for(o.s();!(i=o.n()).done;){var s=i.value,l=r(s),u=a(s),h=(u||l)&&t[s];if(l&&((0,g.a7)(h)||ce(h))||u&&(0,g.b)(h))return!0}}catch(d){o.e(d)}finally{o.f()}return!1}(o,e)){r.$shared=!1,i=(0,g.a7)(i)?i():i;var u=this.createResolver(t,i,s);l=(0,g.a8)(o,i,u)}var h,d=(0,c.Z)(e);try{for(d.s();!(h=d.n()).done;){var f=h.value;r[f]=l[f]}}catch(v){d.e(v)}finally{d.f()}return r}},{key:"createResolver",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[""],n=arguments.length>3?arguments[3]:void 0,r=he(this._resolverCache,t,i).resolver;return(0,g.i)(e)?(0,g.a8)(r,e,void 0,n):r}}]),t}();function he(t,e,i){var n=t.get(e);n||(n=new Map,t.set(e,n));var r=i.join(),a=n.get(r);a||(a={resolver:(0,g.a9)(e,i),subPrefixes:i.filter((function(t){return!t.toLowerCase().includes("hover")}))},n.set(r,a));return a}var ce=function(t){return(0,g.i)(t)&&Object.getOwnPropertyNames(t).reduce((function(e,i){return e||(0,g.a7)(t[i])}),!1)};var de=["top","bottom","left","right","chartArea"];function fe(t,e){return"top"===t||"bottom"===t||-1===de.indexOf(t)&&"x"===e}function ve(t,e){return function(i,n){return i[t]===n[t]?i[e]-n[e]:i[t]-n[t]}}function ge(t){var e=t.chart,i=e.options.animation;e.notifyPlugins("afterRender"),(0,g.Q)(i&&i.onComplete,[t],e)}function pe(t){var e=t.chart,i=e.options.animation;(0,g.Q)(i&&i.onProgress,[t],e)}function ye(t){return(0,g.M)()&&"string"===typeof t?t=document.getElementById(t):t&&t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas),t}var me={},be=function(t){var e=ye(t);return Object.values(me).filter((function(t){return t.canvas===e})).pop()};function xe(t,e,i){for(var n=0,r=Object.keys(t);n=e){var s=t[a];delete t[a],(i>0||o>e)&&(t[o+i]=s)}}}var ke=function(){function t(e,i){var n=this;(0,f.Z)(this,t);var r=this.config=new ue(i),a=ye(e),o=be(a);if(o)throw new Error("Canvas is already in use. Chart with ID '"+o.id+"' must be destroyed before the canvas with ID '"+o.canvas.id+"' can be reused.");var s=r.createResolver(r.chartOptionScopes(),this.getContext());this.platform=new(r.platform||function(t){return!(0,g.M)()||"undefined"!==typeof OffscreenCanvas&&t instanceof OffscreenCanvas?bt:Lt}(a)),this.platform.updateConfig(r);var l=this.platform.acquireContext(a,s.aspectRatio),u=l&&l.canvas,h=u&&u.height,c=u&&u.width;this.id=(0,g.ac)(),this.ctx=l,this.canvas=u,this.width=c,this.height=h,this._options=s,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new Kt,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=(0,g.ad)((function(t){return n.update(t)}),s.resizeDelay||0),this._dataChanges=[],me[this.id]=this,l&&u?(y.listen(this,"complete",ge),y.listen(this,"progress",pe),this._initialize(),this.attached&&this.update()):console.error("Failed to create chart: can't acquire context from the given item")}return(0,v.Z)(t,[{key:"aspectRatio",get:function(){var t=this.options,e=t.aspectRatio,i=t.maintainAspectRatio,n=this.width,r=this.height,a=this._aspectRatio;return(0,g.k)(e)?i&&a?a:r?n/r:null:e}},{key:"data",get:function(){return this.config.data},set:function(t){this.config.data=t}},{key:"options",get:function(){return this._options},set:function(t){this.config.options=t}},{key:"registry",get:function(){return $t}},{key:"_initialize",value:function(){return this.notifyPlugins("beforeInit"),this.options.responsive?this.resize():(0,g.ae)(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins("afterInit"),this}},{key:"clear",value:function(){return(0,g.af)(this.canvas,this.ctx),this}},{key:"stop",value:function(){return y.stop(this),this}},{key:"resize",value:function(t,e){y.running(this)?this._resizeBeforeDraw={width:t,height:e}:this._resize(t,e)}},{key:"_resize",value:function(t,e){var i=this.options,n=this.canvas,r=i.maintainAspectRatio&&this.aspectRatio,a=this.platform.getMaximumSize(n,t,e,r),o=i.devicePixelRatio||this.platform.getDevicePixelRatio(),s=this.width?"resize":"attach";this.width=a.width,this.height=a.height,this._aspectRatio=this.aspectRatio,(0,g.ae)(this,o,!0)&&(this.notifyPlugins("resize",{size:a}),(0,g.Q)(i.onResize,[this,a],this),this.attached&&this._doResize(s)&&this.render())}},{key:"ensureScalesHaveIDs",value:function(){var t=this.options.scales||{};(0,g.F)(t,(function(t,e){t.id=e}))}},{key:"buildOrUpdateScales",value:function(){var t=this,e=this.options,i=e.scales,n=this.scales,r=Object.keys(n).reduce((function(t,e){return t[e]=!1,t}),{}),a=[];i&&(a=a.concat(Object.keys(i).map((function(t){var e=i[t],n=te(t,e),r="r"===n,a="x"===n;return{options:e,dposition:r?"chartArea":a?"bottom":"left",dtype:r?"radialLinear":a?"category":"linear"}})))),(0,g.F)(a,(function(i){var a=i.options,o=a.id,s=te(o,a),l=(0,g.v)(a.type,i.dtype);void 0!==a.position&&fe(a.position,s)===fe(i.dposition)||(a.position=i.dposition),r[o]=!0;var u=null;o in n&&n[o].type===l?u=n[o]:(u=new($t.getScale(l))({id:o,type:l,ctx:t.ctx,chart:t}),n[u.id]=u);u.init(a,e)})),(0,g.F)(r,(function(t,e){t||delete n[e]})),(0,g.F)(n,(function(e){yt.configure(t,e,e.options),yt.addBox(t,e)}))}},{key:"_updateMetasets",value:function(){var t=this._metasets,e=this.data.datasets.length,i=t.length;if(t.sort((function(t,e){return t.index-e.index})),i>e){for(var n=e;ni.length&&delete this._stacks,e.forEach((function(e,n){0===i.filter((function(t){return t===e._dataset})).length&&t._destroyDatasetMeta(n)}))}},{key:"buildOrUpdateControllers",value:function(){var t,e,i=[],n=this.data.datasets;for(this._removeUnreferencedMetasets(),t=0,e=n.length;t=0;--e)this._drawDataset(t[e]);this.notifyPlugins("afterDatasetsDraw")}}},{key:"_drawDataset",value:function(t){var e=this.ctx,i=t._clip,n=!i.disabled,r=function(t){var e=t.xScale,i=t.yScale;if(e&&i)return{left:e.left,right:e.right,top:i.top,bottom:i.bottom}}(t)||this.chartArea,a={meta:t,index:t.index,cancelable:!0};!1!==this.notifyPlugins("beforeDatasetDraw",a)&&(n&&(0,g.Y)(e,{left:!1===i.left?0:r.left-i.left,right:!1===i.right?this.width:r.right+i.right,top:!1===i.top?0:r.top-i.top,bottom:!1===i.bottom?this.height:r.bottom+i.bottom}),t.controller.draw(),n&&(0,g.$)(e),a.cancelable=!1,this.notifyPlugins("afterDatasetDraw",a))}},{key:"isPointInArea",value:function(t){return(0,g.C)(t,this.chartArea,this._minPadding)}},{key:"getElementsAtEventForMode",value:function(t,e,i,n){var r=rt.modes[e];return"function"===typeof r?r(this,t,i,n):[]}},{key:"getDatasetMeta",value:function(t){var e=this.data.datasets[t],i=this._metasets,n=i.filter((function(t){return t&&t._dataset===e})).pop();return n||(n={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e&&e.order||0,index:t,_dataset:e,_parsed:[],_sorted:!1},i.push(n)),n}},{key:"getContext",value:function(){return this.$context||(this.$context=(0,g.j)(null,{chart:this,type:"chart"}))}},{key:"getVisibleDatasetCount",value:function(){return this.getSortedVisibleDatasetMetas().length}},{key:"isDatasetVisible",value:function(t){var e=this.data.datasets[t];if(!e)return!1;var i=this.getDatasetMeta(t);return"boolean"===typeof i.hidden?!i.hidden:!e.hidden}},{key:"setDatasetVisibility",value:function(t,e){this.getDatasetMeta(t).hidden=!e}},{key:"toggleDataVisibility",value:function(t){this._hiddenIndices[t]=!this._hiddenIndices[t]}},{key:"getDataVisibility",value:function(t){return!this._hiddenIndices[t]}},{key:"_updateVisibility",value:function(t,e,i){var n=i?"show":"hide",r=this.getDatasetMeta(t),a=r.controller._resolveAnimations(void 0,n);(0,g.h)(e)?(r.data[e].hidden=!i,this.update()):(this.setDatasetVisibility(t,i),a.update(r,{visible:i}),this.update((function(e){return e.datasetIndex===t?n:void 0})))}},{key:"hide",value:function(t,e){this._updateVisibility(t,e,!1)}},{key:"show",value:function(t,e){this._updateVisibility(t,e,!0)}},{key:"_destroyDatasetMeta",value:function(t){var e=this._metasets[t];e&&e.controller&&e.controller._destroy(),delete this._metasets[t]}},{key:"_stop",value:function(){var t,e;for(this.stop(),y.remove(this),t=0,e=this.data.datasets.length;t0?h+n+i+u:0,f=0,v=r-l;if(n){var p=((h>0?h-n:0)+(c>0?c-n:0))/2;f=(v-(0!==p?v*p/(p+n):v))/2}var y=(v-Math.max(.001,v*c-i/g.P)/c)/2,m=l+y+f,b=r-y-f,x=we(e,d,c,b-m),k=x.outerStart,_=x.outerEnd,w=x.innerStart,M=x.innerEnd,S=c-k,P=c-_,O=m+k/S,C=b-_/P,D=d+w,A=d+M,T=m+w/D,E=b-M/A;if(t.beginPath(),a){var Z=(O+C)/2;if(t.arc(o,s,c,O,Z),t.arc(o,s,c,Z,C),_>0){var L=Me(P,C,o,s);t.arc(L.x,L.y,_,C,b+g.H)}var R=Me(A,b,o,s);if(t.lineTo(R.x,R.y),M>0){var I=Me(A,E,o,s);t.arc(I.x,I.y,M,b+g.H,E+Math.PI)}var F=(b-M/d+(m+w/d))/2;if(t.arc(o,s,d,b-M/d,F,!0),t.arc(o,s,d,F,m+w/d,!0),w>0){var z=Me(D,T,o,s);t.arc(z.x,z.y,w,T+Math.PI,m-g.H)}var j=Me(S,m,o,s);if(t.lineTo(j.x,j.y),k>0){var W=Me(S,O,o,s);t.arc(W.x,W.y,k,m-g.H,O)}}else{t.moveTo(o,s);var V=Math.cos(O)*c+o,N=Math.sin(O)*c+s;t.lineTo(V,N);var B=Math.cos(C)*c+o,H=Math.sin(C)*c+s;t.lineTo(B,H)}t.closePath()}function Pe(t,e,i,n,r){var a=e.fullCircles,o=e.startAngle,s=e.circumference,l=e.options,u=l.borderWidth,h=l.borderJoinStyle,c=l.borderDash,d=l.borderDashOffset,f="inner"===l.borderAlign;if(u){t.setLineDash(c||[]),t.lineDashOffset=d,f?(t.lineWidth=2*u,t.lineJoin=h||"round"):(t.lineWidth=u,t.lineJoin=h||"bevel");var v=e.endAngle;if(a){Se(t,e,i,n,v,r);for(var p=0;pr?(u=r/l,t.arc(a,o,l,i+u,n-u,!0)):t.arc(a,o,r,i+g.H,n-g.H),t.closePath(),t.clip()}(t,e,v),a||(Se(t,e,i,n,v,r),t.stroke())}}(0,h.Z)(ke,"defaults",g.d),(0,h.Z)(ke,"instances",me),(0,h.Z)(ke,"overrides",g.a3),(0,h.Z)(ke,"registry",$t),(0,h.Z)(ke,"version","4.3.3"),(0,h.Z)(ke,"getChart",be);var Oe=function(t){(0,s.Z)(i,t);var e=(0,l.Z)(i);function i(t){var n;return(0,f.Z)(this,i),n=e.call(this),(0,h.Z)((0,r.Z)(n),"circumference",void 0),(0,h.Z)((0,r.Z)(n),"endAngle",void 0),(0,h.Z)((0,r.Z)(n),"fullCircles",void 0),(0,h.Z)((0,r.Z)(n),"innerRadius",void 0),(0,h.Z)((0,r.Z)(n),"outerRadius",void 0),(0,h.Z)((0,r.Z)(n),"pixelMargin",void 0),(0,h.Z)((0,r.Z)(n),"startAngle",void 0),n.options=void 0,n.circumference=void 0,n.startAngle=void 0,n.endAngle=void 0,n.innerRadius=void 0,n.outerRadius=void 0,n.pixelMargin=0,n.fullCircles=0,t&&Object.assign((0,r.Z)(n),t),n}return(0,v.Z)(i,[{key:"inRange",value:function(t,e,i){var n=this.getProps(["x","y"],i),r=(0,g.D)(n,{x:t,y:e}),a=r.angle,o=r.distance,s=this.getProps(["startAngle","endAngle","innerRadius","outerRadius","circumference"],i),l=s.startAngle,u=s.endAngle,h=s.innerRadius,c=s.outerRadius,d=s.circumference,f=(this.options.spacing+this.options.borderWidth)/2,v=(0,g.v)(d,u-l)>=g.T||(0,g.p)(a,l,u),p=(0,g.aj)(o,h+f,c+f);return v&&p}},{key:"getCenterPoint",value:function(t){var e=this.getProps(["x","y","startAngle","endAngle","innerRadius","outerRadius"],t),i=e.x,n=e.y,r=e.startAngle,a=e.endAngle,o=e.innerRadius,s=e.outerRadius,l=this.options,u=l.offset,h=(r+a)/2,c=(o+s+l.spacing+u)/2;return{x:i+Math.cos(h)*c,y:n+Math.sin(h)*c}}},{key:"tooltipPosition",value:function(t){return this.getCenterPoint(t)}},{key:"draw",value:function(t){var e=this.options,i=this.circumference,n=(e.offset||0)/4,r=(e.spacing||0)/2,a=e.circular;if(this.pixelMargin="inner"===e.borderAlign?.33:0,this.fullCircles=i>g.T?Math.floor(i/g.T):0,!(0===i||this.innerRadius<0||this.outerRadius<0)){t.save();var o=(this.startAngle+this.endAngle)/2;t.translate(Math.cos(o)*n,Math.sin(o)*n);var s=n*(1-Math.sin(Math.min(g.P,i||0)));t.fillStyle=e.backgroundColor,t.strokeStyle=e.borderColor,function(t,e,i,n,r){var a=e.fullCircles,o=e.startAngle,s=e.circumference,l=e.endAngle;if(a){Se(t,e,i,n,l,r);for(var u=0;u2&&void 0!==arguments[2]?arguments[2]:e;t.lineCap=(0,g.v)(i.borderCapStyle,e.borderCapStyle),t.setLineDash((0,g.v)(i.borderDash,e.borderDash)),t.lineDashOffset=(0,g.v)(i.borderDashOffset,e.borderDashOffset),t.lineJoin=(0,g.v)(i.borderJoinStyle,e.borderJoinStyle),t.lineWidth=(0,g.v)(i.borderWidth,e.borderWidth),t.strokeStyle=(0,g.v)(i.borderColor,e.borderColor)}function De(t,e,i){t.lineTo(i.x,i.y)}function Ae(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=t.length,r=i.start,a=void 0===r?0:r,o=i.end,s=void 0===o?n-1:o,l=e.start,u=e.end,h=Math.max(a,l),c=Math.min(s,u),d=au&&s>u;return{count:n,start:h,loop:e.loop,ilen:cl&&(l=M),b=(x*b+w)/++x):(_(),t.lineTo(w,M),o=S,x=0,s=l=M),u=M}_()}function Ze(t){var e=t.options,i=e.borderDash&&e.borderDash.length;return!t._decimated&&!t._loop&&!e.tension&&"monotone"!==e.cubicInterpolationMode&&!e.stepped&&!i?Ee:Te}(0,h.Z)(Oe,"id","arc"),(0,h.Z)(Oe,"defaults",{borderAlign:"center",borderColor:"#fff",borderDash:[],borderDashOffset:0,borderJoinStyle:void 0,borderRadius:0,borderWidth:2,offset:0,spacing:0,angle:void 0,circular:!0}),(0,h.Z)(Oe,"defaultRoutes",{backgroundColor:"backgroundColor"}),(0,h.Z)(Oe,"descriptors",{_scriptable:!0,_indexable:function(t){return"borderDash"!==t}});var Le="function"===typeof Path2D;function Re(t,e,i,n){Le&&!e.options.segment?function(t,e,i,n){var r=e._path;r||(r=e._path=new Path2D,e.path(r,i,n)&&r.closePath()),Ce(t,e.options),t.stroke(r)}(t,e,i,n):function(t,e,i,n){var r,a=e.segments,o=e.options,s=Ze(e),l=(0,c.Z)(a);try{for(l.s();!(r=l.n()).done;){var u=r.value;Ce(t,o,u.style),t.beginPath(),s(t,e,u,{start:i,end:i+n-1})&&t.closePath(),t.stroke()}}catch(h){l.e(h)}finally{l.f()}}(t,e,i,n)}var Ie=function(t){(0,s.Z)(i,t);var e=(0,l.Z)(i);function i(t){var n;return(0,f.Z)(this,i),(n=e.call(this)).animated=!0,n.options=void 0,n._chart=void 0,n._loop=void 0,n._fullLoop=void 0,n._path=void 0,n._points=void 0,n._segments=void 0,n._decimated=!1,n._pointsUpdated=!1,n._datasetIndex=void 0,t&&Object.assign((0,r.Z)(n),t),n}return(0,v.Z)(i,[{key:"updateControlPoints",value:function(t,e){var i=this.options;if((i.tension||"monotone"===i.cubicInterpolationMode)&&!i.stepped&&!this._pointsUpdated){var n=i.spanGaps?this._loop:this._fullLoop;(0,g.al)(this._points,i,t,n,e),this._pointsUpdated=!0}}},{key:"points",get:function(){return this._points},set:function(t){this._points=t,delete this._segments,delete this._path,this._pointsUpdated=!1}},{key:"segments",get:function(){return this._segments||(this._segments=(0,g.am)(this,this.options.segment))}},{key:"first",value:function(){var t=this.segments,e=this.points;return t.length&&e[t[0].start]}},{key:"last",value:function(){var t=this.segments,e=this.points,i=t.length;return i&&e[t[i-1].end]}},{key:"interpolate",value:function(t,e){var i=this.options,n=t[e],r=this.points,a=(0,g.an)(this,{property:e,start:n,end:n});if(a.length){var o,s,l=[],u=function(t){return t.stepped?g.ao:t.tension||"monotone"===t.cubicInterpolationMode?g.ap:g.aq}(i);for(o=0,s=a.length;o2&&void 0!==arguments[2]?arguments[2]:{},n=t.x!==i.x?-e:0,r=t.y!==i.y?-e:0,a=(t.x+t.w!==i.x+i.w?e:0)-n,o=(t.y+t.h!==i.y+i.h?e:0)-r;return{x:t.x+n,y:t.y+r,w:t.w+a,h:t.h+o,radius:t.radius}}(0,h.Z)(ze,"id","point"),(0,h.Z)(ze,"defaults",{borderWidth:1,hitRadius:1,hoverBorderWidth:1,hoverRadius:4,pointStyle:"circle",radius:3,rotation:0}),(0,h.Z)(ze,"defaultRoutes",{backgroundColor:"backgroundColor",borderColor:"borderColor"});var Ye=function(t){(0,s.Z)(i,t);var e=(0,l.Z)(i);function i(t){var n;return(0,f.Z)(this,i),(n=e.call(this)).options=void 0,n.horizontal=void 0,n.base=void 0,n.width=void 0,n.height=void 0,n.inflateAmount=void 0,t&&Object.assign((0,r.Z)(n),t),n}return(0,v.Z)(i,[{key:"draw",value:function(t){var e,i=this.inflateAmount,n=this.options,r=n.borderColor,a=n.backgroundColor,o=Ve(this),s=o.inner,l=o.outer,u=(e=l.radius).topLeft||e.topRight||e.bottomLeft||e.bottomRight?g.au:Be;t.save(),l.w===s.w&&l.h===s.h||(t.beginPath(),u(t,He(l,i,s)),t.clip(),u(t,He(s,-i,l)),t.fillStyle=r,t.fill("evenodd")),t.beginPath(),u(t,He(s,i)),t.fillStyle=a,t.fill(),t.restore()}},{key:"inRange",value:function(t,e,i){return Ne(this,t,e,i)}},{key:"inXRange",value:function(t,e){return Ne(this,t,null,e)}},{key:"inYRange",value:function(t,e){return Ne(this,null,t,e)}},{key:"getCenterPoint",value:function(t){var e=this.getProps(["x","y","base","horizontal"],t),i=e.x,n=e.y,r=e.base,a=e.horizontal;return{x:a?(i+r)/2:i,y:a?n:(n+r)/2}}},{key:"getRange",value:function(t){return"x"===t?this.width/2:this.height/2}}]),i}(Rt);(0,h.Z)(Ye,"id","bar"),(0,h.Z)(Ye,"defaults",{borderSkipped:"start",borderWidth:0,borderRadius:0,inflateAmount:"auto",pointStyle:void 0}),(0,h.Z)(Ye,"defaultRoutes",{backgroundColor:"backgroundColor",borderColor:"borderColor"});var Xe=function(t,e){var i=t.boxHeight,n=void 0===i?e:i,r=t.boxWidth,a=void 0===r?e:r;return t.usePointStyle&&(n=Math.min(n,e),a=t.pointStyleWidth||Math.min(a,e)),{boxWidth:a,boxHeight:n,itemHeight:Math.max(e,n)}},Ue=function(t){(0,s.Z)(i,t);var e=(0,l.Z)(i);function i(t){var n;return(0,f.Z)(this,i),(n=e.call(this))._added=!1,n.legendHitBoxes=[],n._hoveredItem=null,n.doughnutMode=!1,n.chart=t.chart,n.options=t.options,n.ctx=t.ctx,n.legendItems=void 0,n.columnSizes=void 0,n.lineWidths=void 0,n.maxHeight=void 0,n.maxWidth=void 0,n.top=void 0,n.bottom=void 0,n.left=void 0,n.right=void 0,n.height=void 0,n.width=void 0,n._margins=void 0,n.position=void 0,n.weight=void 0,n.fullSize=void 0,n}return(0,v.Z)(i,[{key:"update",value:function(t,e,i){this.maxWidth=t,this.maxHeight=e,this._margins=i,this.setDimensions(),this.buildLabels(),this.fit()}},{key:"setDimensions",value:function(){this.isHorizontal()?(this.width=this.maxWidth,this.left=this._margins.left,this.right=this.width):(this.height=this.maxHeight,this.top=this._margins.top,this.bottom=this.height)}},{key:"buildLabels",value:function(){var t=this,e=this.options.labels||{},i=(0,g.Q)(e.generateLabels,[this.chart],this)||[];e.filter&&(i=i.filter((function(i){return e.filter(i,t.chart.data)}))),e.sort&&(i=i.sort((function(i,n){return e.sort(i,n,t.chart.data)}))),this.options.reverse&&i.reverse(),this.legendItems=i}},{key:"fit",value:function(){var t=this.options,e=this.ctx;if(t.display){var i,n,r=t.labels,a=(0,g.a0)(r.font),o=a.size,s=this._computeTitleHeight(),l=Xe(r,o),u=l.boxWidth,h=l.itemHeight;e.font=a.string,this.isHorizontal()?(i=this.maxWidth,n=this._fitRows(s,o,u,h)+10):(n=this.maxHeight,i=this._fitCols(s,a,u,h)+10),this.width=Math.min(i,t.maxWidth||this.maxWidth),this.height=Math.min(n,t.maxHeight||this.maxHeight)}else this.width=this.height=0}},{key:"_fitRows",value:function(t,e,i,n){var r=this.ctx,a=this.maxWidth,o=this.options.labels.padding,s=this.legendHitBoxes=[],l=this.lineWidths=[0],u=n+o,h=t;r.textAlign="left",r.textBaseline="middle";var c=-1,d=-u;return this.legendItems.forEach((function(t,f){var v=i+e/2+r.measureText(t.text).width;(0===f||l[l.length-1]+v+2*o>a)&&(h+=u,l[l.length-(f>0?0:1)]=0,d+=u,c++),s[f]={left:0,top:d,row:c,width:v,height:n},l[l.length-1]+=v+o})),h}},{key:"_fitCols",value:function(t,e,i,n){var r=this.ctx,a=this.maxHeight,o=this.options.labels.padding,s=this.legendHitBoxes=[],l=this.columnSizes=[],u=a-t,h=o,c=0,d=0,f=0,v=0;return this.legendItems.forEach((function(t,a){var g=function(t,e,i,n,r){var a=function(t,e,i,n){var r=t.text;r&&"string"!==typeof r&&(r=r.reduce((function(t,e){return t.length>e.length?t:e})));return e+i.size/2+n.measureText(r).width}(n,t,e,i),o=function(t,e,i){var n=t;"string"!==typeof e.text&&(n=$e(e,i));return n}(r,n,e.lineHeight);return{itemWidth:a,itemHeight:o}}(i,e,r,t,n),p=g.itemWidth,y=g.itemHeight;a>0&&d+y+2*o>u&&(h+=c+o,l.push({width:c,height:d}),f+=c+o,v++,c=d=0),s[a]={left:f,top:d,col:v,width:p,height:y},c=Math.max(c,p),d+=y+o})),h+=c,l.push({width:c,height:d}),h}},{key:"adjustHitBoxes",value:function(){if(this.options.display){var t=this._computeTitleHeight(),e=this.legendHitBoxes,i=this.options,n=i.align,r=i.labels.padding,a=i.rtl,o=(0,g.az)(a,this.left,this.width);if(this.isHorizontal()){var s,l=0,u=(0,g.a2)(n,this.left+r,this.right-this.lineWidths[l]),h=(0,c.Z)(e);try{for(h.s();!(s=h.n()).done;){var d=s.value;l!==d.row&&(l=d.row,u=(0,g.a2)(n,this.left+r,this.right-this.lineWidths[l])),d.top+=this.top+t+r,d.left=o.leftForLtr(o.x(u),d.width),u+=d.width+r}}catch(b){h.e(b)}finally{h.f()}}else{var f,v=0,p=(0,g.a2)(n,this.top+t+r,this.bottom-this.columnSizes[v].height),y=(0,c.Z)(e);try{for(y.s();!(f=y.n()).done;){var m=f.value;m.col!==v&&(v=m.col,p=(0,g.a2)(n,this.top+t+r,this.bottom-this.columnSizes[v].height)),m.top=p,m.left+=this.left+r,m.left=o.leftForLtr(o.x(m.left),m.width),p+=m.height+r}}catch(b){y.e(b)}finally{y.f()}}}}},{key:"isHorizontal",value:function(){return"top"===this.options.position||"bottom"===this.options.position}},{key:"draw",value:function(){if(this.options.display){var t=this.ctx;(0,g.Y)(t,this),this._draw(),(0,g.$)(t)}}},{key:"_draw",value:function(){var t,e=this,i=this.options,n=this.columnSizes,r=this.lineWidths,a=this.ctx,o=i.align,s=i.labels,l=g.d.color,u=(0,g.az)(i.rtl,this.left,this.width),h=(0,g.a0)(s.font),c=s.padding,d=h.size,f=d/2;this.drawTitle(),a.textAlign=u.textAlign("left"),a.textBaseline="middle",a.lineWidth=.5,a.font=h.string;var v=Xe(s,d),p=v.boxWidth,y=v.boxHeight,m=v.itemHeight,b=this.isHorizontal(),x=this._computeTitleHeight();t=b?{x:(0,g.a2)(o,this.left+c,this.right-r[0]),y:this.top+c+x,line:0}:{x:this.left+c,y:(0,g.a2)(o,this.top+x+c,this.bottom-n[0].height),line:0},(0,g.aA)(this.ctx,i.textDirection);var k=m+c;this.legendItems.forEach((function(v,_){a.strokeStyle=v.fontColor,a.fillStyle=v.fontColor;var w=a.measureText(v.text).width,M=u.textAlign(v.textAlign||(v.textAlign=s.textAlign)),S=p+f+w,P=t.x,O=t.y;if(u.setWidth(e.width),b?_>0&&P+S+c>e.right&&(O=t.y+=k,t.line++,P=t.x=(0,g.a2)(o,e.left+c,e.right-r[t.line])):_>0&&O+k>e.bottom&&(P=t.x=P+n[t.line].width+c,t.line++,O=t.y=(0,g.a2)(o,e.top+x+c,e.bottom-n[t.line].height)),function(t,e,i){if(!(isNaN(p)||p<=0||isNaN(y)||y<0)){a.save();var n=(0,g.v)(i.lineWidth,1);if(a.fillStyle=(0,g.v)(i.fillStyle,l),a.lineCap=(0,g.v)(i.lineCap,"butt"),a.lineDashOffset=(0,g.v)(i.lineDashOffset,0),a.lineJoin=(0,g.v)(i.lineJoin,"miter"),a.lineWidth=n,a.strokeStyle=(0,g.v)(i.strokeStyle,l),a.setLineDash((0,g.v)(i.lineDash,[])),s.usePointStyle){var r={radius:y*Math.SQRT2/2,pointStyle:i.pointStyle,rotation:i.rotation,borderWidth:n},o=u.xPlus(t,p/2),h=e+f;(0,g.aD)(a,r,o,h,s.pointStyleWidth&&p)}else{var c=e+Math.max((d-y)/2,0),v=u.leftForLtr(t,p),m=(0,g.aw)(i.borderRadius);a.beginPath(),Object.values(m).some((function(t){return 0!==t}))?(0,g.au)(a,{x:v,y:c,w:p,h:y,radius:m}):a.rect(v,c,p,y),a.fill(),0!==n&&a.stroke()}a.restore()}}(u.x(P),O,v),P=(0,g.aB)(M,P+p+f,b?P+S:e.right,i.rtl),function(t,e,i){(0,g.Z)(a,i.text,t,e+m/2,h,{strikethrough:i.hidden,textAlign:u.textAlign(i.textAlign)})}(u.x(P),O,v),b)t.x+=S+c;else if("string"!==typeof v.text){var C=h.lineHeight;t.y+=$e(v,C)+c}else t.y+=k})),(0,g.aC)(this.ctx,i.textDirection)}},{key:"drawTitle",value:function(){var t=this.options,e=t.title,i=(0,g.a0)(e.font),n=(0,g.E)(e.padding);if(e.display){var r,a=(0,g.az)(t.rtl,this.left,this.width),o=this.ctx,s=e.position,l=i.size/2,u=n.top+l,h=this.left,c=this.width;if(this.isHorizontal())c=Math.max.apply(Math,(0,d.Z)(this.lineWidths)),r=this.top+u,h=(0,g.a2)(t.align,h,this.right-c);else{var f=this.columnSizes.reduce((function(t,e){return Math.max(t,e.height)}),0);r=u+(0,g.a2)(t.align,this.top,this.bottom-f-t.labels.padding-this._computeTitleHeight())}var v=(0,g.a2)(s,h,h+c);o.textAlign=a.textAlign((0,g.a1)(s)),o.textBaseline="middle",o.strokeStyle=e.color,o.fillStyle=e.color,o.font=i.string,(0,g.Z)(o,e.text,v,r,i)}}},{key:"_computeTitleHeight",value:function(){var t=this.options.title,e=(0,g.a0)(t.font),i=(0,g.E)(t.padding);return t.display?e.lineHeight+i.height:0}},{key:"_getLegendItemAt",value:function(t,e){var i,n,r;if((0,g.aj)(t,this.left,this.right)&&(0,g.aj)(e,this.top,this.bottom))for(r=this.legendHitBoxes,i=0;i-1?t.split("\n"):t}function Ge(t,e){var i=e.element,n=e.datasetIndex,r=e.index,a=t.getDatasetMeta(n).controller,o=a.getLabelAndValue(r),s=o.label,l=o.value;return{chart:t,label:s,parsed:a.getParsed(r),raw:t.data.datasets[n].data[r],formattedValue:l,dataset:a.getDataset(),dataIndex:r,datasetIndex:n,element:i}}function ti(t,e){var i=t.chart.ctx,n=t.body,r=t.footer,a=t.title,o=e.boxWidth,s=e.boxHeight,l=(0,g.a0)(e.bodyFont),u=(0,g.a0)(e.titleFont),h=(0,g.a0)(e.footerFont),c=a.length,d=r.length,f=n.length,v=(0,g.E)(e.padding),p=v.height,y=0,m=n.reduce((function(t,e){return t+e.before.length+e.lines.length+e.after.length}),0);(m+=t.beforeBody.length+t.afterBody.length,c&&(p+=c*u.lineHeight+(c-1)*e.titleSpacing+e.titleMarginBottom),m)&&(p+=f*(e.displayColors?Math.max(s,l.lineHeight):l.lineHeight)+(m-f)*l.lineHeight+(m-1)*e.bodySpacing);d&&(p+=e.footerMarginTop+d*h.lineHeight+(d-1)*e.footerSpacing);var b=0,x=function(t){y=Math.max(y,i.measureText(t).width+b)};return i.save(),i.font=u.string,(0,g.F)(t.title,x),i.font=l.string,(0,g.F)(t.beforeBody.concat(t.afterBody),x),b=e.displayColors?o+2+e.boxPadding:0,(0,g.F)(n,(function(t){(0,g.F)(t.before,x),(0,g.F)(t.lines,x),(0,g.F)(t.after,x)})),b=0,i.font=h.string,(0,g.F)(t.footer,x),i.restore(),{width:y+=v.width,height:p}}function ei(t,e,i,n){var r=i.x,a=i.width,o=t.width,s=t.chartArea,l=s.left,u=s.right,h="center";return"center"===n?h=r<=(l+u)/2?"left":"right":r<=a/2?h="left":r>=o-a/2&&(h="right"),function(t,e,i,n){var r=n.x,a=n.width,o=i.caretSize+i.caretPadding;return"left"===t&&r+a+o>e.width||"right"===t&&r-a-o<0||void 0}(h,t,e,i)&&(h="center"),h}function ii(t,e,i){var n=i.yAlign||e.yAlign||function(t,e){var i=e.y,n=e.height;return it.height-n/2?"bottom":"center"}(t,i);return{xAlign:i.xAlign||e.xAlign||ei(t,e,i,n),yAlign:n}}function ni(t,e,i,n){var r=t.caretSize,a=t.caretPadding,o=t.cornerRadius,s=i.xAlign,l=i.yAlign,u=r+a,h=(0,g.aw)(o),c=h.topLeft,d=h.topRight,f=h.bottomLeft,v=h.bottomRight,p=function(t,e){var i=t.x,n=t.width;return"right"===e?i-=n:"center"===e&&(i-=n/2),i}(e,s),y=function(t,e,i){var n=t.y,r=t.height;return"top"===e?n+=i:n-="bottom"===e?r+i:r/2,n}(e,l,u);return"center"===l?"left"===s?p+=u:"right"===s&&(p-=u):"left"===s?p-=Math.max(c,f)+r:"right"===s&&(p+=Math.max(d,v)+r),{x:(0,g.S)(p,0,n.width-e.width),y:(0,g.S)(y,0,n.height-e.height)}}function ri(t,e,i){var n=(0,g.E)(i.padding);return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-n.right:t.x+n.left}function ai(t){return qe([],Je(t))}function oi(t,e){var i=e&&e.dataset&&e.dataset.tooltip&&e.dataset.tooltip.callbacks;return i?t.override(i):t}var si={beforeTitle:g.aF,title:function(t){if(t.length>0){var e=t[0],i=e.chart.data.labels,n=i?i.length:0;if(this&&this.options&&"dataset"===this.options.mode)return e.dataset.label||"";if(e.label)return e.label;if(n>0&&e.dataIndex0&&e.stroke()}},{key:"_updateAnimationTarget",value:function(t){var e=this.chart,i=this.$animations,n=i&&i.x,r=i&&i.y;if(n||r){var a=Qe[t.position].call(this,this._active,this._eventPosition);if(!a)return;var o=this._size=ti(this,t),s=Object.assign({},a,this._size),l=ii(e,t,s),u=ni(t,s,l,e);n._to===u.x&&r._to===u.y||(this.xAlign=l.xAlign,this.yAlign=l.yAlign,this.width=o.width,this.height=o.height,this.caretX=a.x,this.caretY=a.y,this._resolveAnimations().update(this,u))}}},{key:"_willRender",value:function(){return!!this.opacity}},{key:"draw",value:function(t){var e=this.options.setContext(this.getContext()),i=this.opacity;if(i){this._updateAnimationTarget(e);var n={width:this.width,height:this.height},r={x:this.x,y:this.y};i=Math.abs(i)<.001?0:i;var a=(0,g.E)(e.padding),o=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;e.enabled&&o&&(t.save(),t.globalAlpha=i,this.drawBackground(r,t,n,e),(0,g.aA)(t,e.textDirection),r.y+=a.top,this.drawTitle(r,t,e),this.drawBody(r,t,e),this.drawFooter(r,t,e),(0,g.aC)(t,e.textDirection),t.restore())}}},{key:"getActiveElements",value:function(){return this._active||[]}},{key:"setActiveElements",value:function(t,e){var i=this,n=this._active,r=t.map((function(t){var e=t.datasetIndex,n=t.index,r=i.chart.getDatasetMeta(e);if(!r)throw new Error("Cannot find a dataset at index "+e);return{datasetIndex:e,element:r.data[n],index:n}})),a=!(0,g.ah)(n,r),o=this._positionChanged(r,e);(a||o)&&(this._active=r,this._eventPosition=e,this._ignoreReplayEvents=!0,this.update(!0))}},{key:"handleEvent",value:function(t,e){var i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if(e&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;var n=this.options,r=this._active||[],a=this._getActiveElements(t,r,e,i),o=this._positionChanged(a,t),s=e||!(0,g.ah)(a,r)||o;return s&&(this._active=a,(n.enabled||n.external)&&(this._eventPosition={x:t.x,y:t.y},this.update(!0,e))),s}},{key:"_getActiveElements",value:function(t,e,i,n){var r=this.options;if("mouseout"===t.type)return[];if(!n)return e;var a=this.chart.getElementsAtEventForMode(t,r.mode,r,i);return r.reverse&&a.reverse(),a}},{key:"_positionChanged",value:function(t,e){var i=this.caretX,n=this.caretY,r=this.options,a=Qe[r.position].call(this,t,e);return!1!==a&&(i!==a.x||n!==a.y)}}]),i}(Rt);(0,h.Z)(ui,"positioners",Qe);var hi={id:"tooltip",_element:ui,positioners:Qe,afterInit:function(t,e,i){i&&(t.tooltip=new ui({chart:t,options:i}))},beforeUpdate:function(t,e,i){t.tooltip&&t.tooltip.initialize(i)},reset:function(t,e,i){t.tooltip&&t.tooltip.initialize(i)},afterDraw:function(t){var e=t.tooltip;if(e&&e._willRender()){var i={tooltip:e};if(!1===t.notifyPlugins("beforeTooltipDraw",(0,n.Z)((0,n.Z)({},i),{},{cancelable:!0})))return;e.draw(t.ctx),t.notifyPlugins("afterTooltipDraw",i)}},afterEvent:function(t,e){if(t.tooltip){var i=e.replay;t.tooltip.handleEvent(e.event,i,e.inChartArea)&&(e.changed=!0)}},defaults:{enabled:!0,external:null,position:"average",backgroundColor:"rgba(0,0,0,0.8)",titleColor:"#fff",titleFont:{weight:"bold"},titleSpacing:2,titleMarginBottom:6,titleAlign:"left",bodyColor:"#fff",bodySpacing:2,bodyFont:{},bodyAlign:"left",footerColor:"#fff",footerSpacing:2,footerMarginTop:6,footerFont:{weight:"bold"},footerAlign:"left",padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:function(t,e){return e.bodyFont.size},boxWidth:function(t,e){return e.bodyFont.size},multiKeyBackground:"#fff",displayColors:!0,boxPadding:0,borderColor:"rgba(0,0,0,0)",borderWidth:0,animation:{duration:400,easing:"easeOutQuart"},animations:{numbers:{type:"number",properties:["x","y","width","height","caretX","caretY"]},opacity:{easing:"linear",duration:200}},callbacks:si},defaultRoutes:{bodyFont:"font",footerFont:"font",titleFont:"font"},descriptors:{_scriptable:function(t){return"filter"!==t&&"itemSort"!==t&&"external"!==t},_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:"animation"}},additionalOptionScopes:["interaction"]};function ci(t,e,i,n){var r=t.indexOf(e);return-1===r?function(t,e,i,n){return"string"===typeof e?(i=t.push(e)-1,n.unshift({index:i,label:e})):isNaN(e)&&(i=null),i}(t,e,i,n):r!==t.lastIndexOf(e)?i:r}function di(t){var e=this.getLabels();return t>=0&&te.length-1?null:this.getPixelForValue(e[t].value)}},{key:"getValueForPixel",value:function(t){return Math.round(this._startValue+this.getDecimalForPixel(t)*this._valueRange)}},{key:"getBasePixel",value:function(){return this.bottom}}]),i}(Yt);function vi(t,e,i){var n=i.horizontal,r=i.minRotation,a=(0,g.t)(r),o=(n?Math.sin(a):Math.cos(a))||.001,s=.75*e*(""+t).length;return Math.min(e/o,s)}(0,h.Z)(fi,"id","category"),(0,h.Z)(fi,"defaults",{ticks:{callback:di}});var gi=function(t){(0,s.Z)(i,t);var e=(0,l.Z)(i);function i(t){var n;return(0,f.Z)(this,i),(n=e.call(this,t)).start=void 0,n.end=void 0,n._startValue=void 0,n._endValue=void 0,n._valueRange=0,n}return(0,v.Z)(i,[{key:"parse",value:function(t,e){return(0,g.k)(t)||("number"===typeof t||t instanceof Number)&&!isFinite(+t)?null:+t}},{key:"handleTickRangeOptions",value:function(){var t=this.options.beginAtZero,e=this.getUserBounds(),i=e.minDefined,n=e.maxDefined,r=this.min,a=this.max,o=function(t){return r=i?r:t},s=function(t){return a=n?a:t};if(t){var l=(0,g.s)(r),u=(0,g.s)(a);l<0&&u<0?s(0):l>0&&u>0&&o(0)}if(r===a){var h=0===a?1:Math.abs(.05*a);s(a+h),t||o(r-h)}this.min=r,this.max=a}},{key:"getTickLimit",value:function(){var t,e=this.options.ticks,i=e.maxTicksLimit,n=e.stepSize;return n?(t=Math.ceil(this.max/n)-Math.floor(this.min/n)+1)>1e3&&(console.warn("scales.".concat(this.id,".ticks.stepSize: ").concat(n," would result generating up to ").concat(t," ticks. Limiting to 1000.")),t=1e3):(t=this.computeTickLimit(),i=i||11),i&&(t=Math.min(i,t)),t}},{key:"computeTickLimit",value:function(){return Number.POSITIVE_INFINITY}},{key:"buildTicks",value:function(){var t=this.options,e=t.ticks,i=this.getTickLimit(),n=function(t,e){var i,n,r,a,o=[],s=t.bounds,l=t.step,u=t.min,h=t.max,c=t.precision,d=t.count,f=t.maxTicks,v=t.maxDigits,p=t.includeBounds,y=l||1,m=f-1,b=e.min,x=e.max,k=!(0,g.k)(u),_=!(0,g.k)(h),w=!(0,g.k)(d),M=(x-b)/(v+1),S=(0,g.aH)((x-b)/m/y)*y;if(S<1e-14&&!k&&!_)return[{value:b},{value:x}];(a=Math.ceil(x/S)-Math.floor(b/S))>m&&(S=(0,g.aH)(a*S/m/y)*y),(0,g.k)(c)||(i=Math.pow(10,c),S=Math.ceil(S*i)/i),"ticks"===s?(n=Math.floor(b/S)*S,r=Math.ceil(x/S)*S):(n=b,r=x),k&&_&&l&&(0,g.aI)((h-u)/l,S/1e3)?(S=(h-u)/(a=Math.round(Math.min((h-u)/S,f))),n=u,r=h):w?S=((r=_?h:r)-(n=k?u:n))/(a=d-1):(a=(r-n)/S,a=(0,g.aJ)(a,Math.round(a),S/1e3)?Math.round(a):Math.ceil(a));var P=Math.max((0,g.aK)(S),(0,g.aK)(n));i=Math.pow(10,(0,g.k)(c)?P:c),n=Math.round(n*i)/i,r=Math.round(r*i)/i;var O=0;for(k&&(p&&n!==u?(o.push({value:u}),nh)break;o.push({value:C})}return _&&p&&r!==h?o.length&&(0,g.aJ)(o[o.length-1].value,h,vi(h,M,t))?o[o.length-1].value=h:o.push({value:h}):_&&r!==h||o.push({value:r}),o}({maxTicks:i=Math.max(2,i),bounds:t.bounds,min:t.min,max:t.max,precision:e.precision,step:e.stepSize,count:e.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:e.minRotation||0,includeBounds:!1!==e.includeBounds},this._range||this);return"ticks"===t.bounds&&(0,g.aG)(n,this,"value"),t.reverse?(n.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),n}},{key:"configure",value:function(){var t=this.ticks,e=this.min,n=this.max;if(o((0,a.Z)(i.prototype),"configure",this).call(this),this.options.offset&&t.length){var r=(n-e)/Math.max(t.length-1,1)/2;e-=r,n+=r}this._startValue=e,this._endValue=n,this._valueRange=n-e}},{key:"getLabelForValue",value:function(t){return(0,g.o)(t,this.chart.options.locale,this.options.ticks.format)}}]),i}(Yt),pi=function(t){(0,s.Z)(i,t);var e=(0,l.Z)(i);function i(){return(0,f.Z)(this,i),e.apply(this,arguments)}return(0,v.Z)(i,[{key:"determineDataLimits",value:function(){var t=this.getMinMax(!0),e=t.min,i=t.max;this.min=(0,g.g)(e)?e:0,this.max=(0,g.g)(i)?i:1,this.handleTickRangeOptions()}},{key:"computeTickLimit",value:function(){var t=this.isHorizontal(),e=t?this.width:this.height,i=(0,g.t)(this.options.ticks.minRotation),n=(t?Math.sin(i):Math.cos(i))||.001,r=this._resolveTickFontOptions(0);return Math.ceil(e/Math.min(40,r.lineHeight/n))}},{key:"getPixelForValue",value:function(t){return null===t?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}},{key:"getValueForPixel",value:function(t){return this._startValue+this.getDecimalForPixel(t)*this._valueRange}}]),i}(gi);(0,h.Z)(pi,"id","linear"),(0,h.Z)(pi,"defaults",{ticks:{callback:g.aL.formatters.numeric}});var yi=function(t){return Math.floor((0,g.aM)(t))},mi=function(t,e){return Math.pow(10,yi(t)+e)};function bi(t){return 1===t/Math.pow(10,yi(t))}function xi(t,e,i){var n=Math.pow(10,i),r=Math.floor(t/n);return Math.ceil(e/n)-r}function ki(t,e){var i=e.min,n=e.max;i=(0,g.O)(t.min,i);for(var r=[],a=yi(i),o=function(t,e){for(var i=yi(e-t);xi(t,e,i)>10;)i++;for(;xi(t,e,i)<10;)i--;return Math.min(i,yi(t))}(i,n),s=o<0?Math.pow(10,Math.abs(o)):1,l=Math.pow(10,o),u=a>o?Math.pow(10,a):0,h=Math.round((i-u)*s)/s,c=Math.floor((i-u)/l/10)*l*10,d=Math.floor((h-c)/Math.pow(10,o)),f=(0,g.O)(t.min,Math.round((u+c+d*Math.pow(10,o))*s)/s);f=10?d=d<15?15:20:d++,d>=20&&(d=2,s=++o>=0?1:s),f=Math.round((u+c+d*Math.pow(10,o))*s)/s;var v=(0,g.O)(t.max,f);return r.push({value:v,major:bi(v),significand:d}),r}var _i=function(t){(0,s.Z)(i,t);var e=(0,l.Z)(i);function i(t){var n;return(0,f.Z)(this,i),(n=e.call(this,t)).start=void 0,n.end=void 0,n._startValue=void 0,n._valueRange=0,n}return(0,v.Z)(i,[{key:"parse",value:function(t,e){var i=gi.prototype.parse.apply(this,[t,e]);if(0!==i)return(0,g.g)(i)&&i>0?i:null;this._zero=!0}},{key:"determineDataLimits",value:function(){var t=this.getMinMax(!0),e=t.min,i=t.max;this.min=(0,g.g)(e)?Math.max(0,e):null,this.max=(0,g.g)(i)?Math.max(0,i):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!(0,g.g)(this._userMin)&&(this.min=e===mi(this.min,0)?mi(this.min,-1):mi(this.min,0)),this.handleTickRangeOptions()}},{key:"handleTickRangeOptions",value:function(){var t=this.getUserBounds(),e=t.minDefined,i=t.maxDefined,n=this.min,r=this.max,a=function(t){return n=e?n:t},o=function(t){return r=i?r:t};n===r&&(n<=0?(a(1),o(10)):(a(mi(n,-1)),o(mi(r,1)))),n<=0&&a(mi(r,-1)),r<=0&&o(mi(n,1)),this.min=n,this.max=r}},{key:"buildTicks",value:function(){var t=this.options,e=ki({min:this._userMin,max:this._userMax},this);return"ticks"===t.bounds&&(0,g.aG)(e,this,"value"),t.reverse?(e.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),e}},{key:"getLabelForValue",value:function(t){return void 0===t?"0":(0,g.o)(t,this.chart.options.locale,this.options.ticks.format)}},{key:"configure",value:function(){var t=this.min;o((0,a.Z)(i.prototype),"configure",this).call(this),this._startValue=(0,g.aM)(t),this._valueRange=(0,g.aM)(this.max)-(0,g.aM)(t)}},{key:"getPixelForValue",value:function(t){return void 0!==t&&0!==t||(t=this.min),null===t||isNaN(t)?NaN:this.getPixelForDecimal(t===this.min?0:((0,g.aM)(t)-this._startValue)/this._valueRange)}},{key:"getValueForPixel",value:function(t){var e=this.getDecimalForPixel(t);return Math.pow(10,this._startValue+e*this._valueRange)}}]),i}(Yt);function wi(t){var e=t.ticks;if(e.display&&t.display){var i=(0,g.E)(e.backdropPadding);return(0,g.v)(e.font&&e.font.size,g.d.font.size)+i.height}return 0}function Mi(t,e,i,n,r){return t===n||t===r?{start:e-i/2,end:e+i/2}:tr?{start:e-i,end:e}:{start:e,end:e+i}}function Si(t){for(var e,i,n,r={l:t.left+t._padding.left,r:t.right-t._padding.right,t:t.top+t._padding.top,b:t.bottom-t._padding.bottom},a=Object.assign({},r),o=[],s=[],l=t._pointLabels.length,u=t.options.pointLabels,h=u.centerPointLabels?g.P/l:0,c=0;ce.r&&(s=(n.end-e.r)/a,t.r=Math.max(t.r,e.r+s)),r.starte.b&&(l=(r.end-e.b)/o,t.b=Math.max(t.b,e.b+l))}function Oi(t,e,i){var n=t.drawingArea,r=i.extra,a=i.additionalAngle,o=i.padding,s=i.size,l=t.getPointPosition(e,n+r+o,a),u=Math.round((0,g.U)((0,g.ay)(l.angle+g.H))),h=function(t,e,i){90===i||270===i?t-=e/2:(i>270||i<90)&&(t-=e);return t}(l.y,s.h,u),c=function(t){if(0===t||180===t)return"center";if(t<180)return"left";return"right"}(u),d=function(t,e,i){"right"===i?t-=e:"center"===i&&(t-=e/2);return t}(l.x,s.w,c);return{visible:!0,x:l.x,y:h,textAlign:c,left:d,top:h,right:d+s.w,bottom:h+s.h}}function Ci(t,e){if(!e)return!0;var i=t.left,n=t.top,r=t.right,a=t.bottom;return!((0,g.C)({x:i,y:n},e)||(0,g.C)({x:i,y:a},e)||(0,g.C)({x:r,y:n},e)||(0,g.C)({x:r,y:a},e))}function Di(t,e,i){var n=i.left,r=i.top,a=i.right,o=i.bottom,s=e.backdropColor;if(!(0,g.k)(s)){var l=(0,g.aw)(e.borderRadius),u=(0,g.E)(e.backdropPadding);t.fillStyle=s;var h=n-u.left,c=r-u.top,d=a-n+u.width,f=o-r+u.height;Object.values(l).some((function(t){return 0!==t}))?(t.beginPath(),(0,g.au)(t,{x:h,y:c,w:d,h:f,radius:l}),t.fill()):t.fillRect(h,c,d,f)}}function Ai(t,e,i,n){var r=t.ctx;if(i)r.arc(t.xCenter,t.yCenter,e,0,g.T);else{var a=t.getPointPosition(0,e);r.moveTo(a.x,a.y);for(var o=1;o=0&&t2&&void 0!==arguments[2]?arguments[2]:0,n=this.getIndexAngle(t)-g.H+i;return{x:Math.cos(n)*e+this.xCenter,y:Math.sin(n)*e+this.yCenter,angle:n}}},{key:"getPointPositionForValue",value:function(t,e){return this.getPointPosition(t,this.getDistanceFromCenterForValue(e))}},{key:"getBasePosition",value:function(t){return this.getPointPositionForValue(t||0,this.getBaseValue())}},{key:"getPointLabelPosition",value:function(t){var e=this._pointLabelItems[t];return{left:e.left,top:e.top,right:e.right,bottom:e.bottom}}},{key:"drawBackground",value:function(){var t=this.options,e=t.backgroundColor,i=t.grid.circular;if(e){var n=this.ctx;n.save(),n.beginPath(),Ai(this,this.getDistanceFromCenterForValue(this._endValue),i,this._pointLabels.length),n.closePath(),n.fillStyle=e,n.fill(),n.restore()}}},{key:"drawGrid",value:function(){var t,e,i,n=this,r=this.ctx,a=this.options,o=a.angleLines,s=a.grid,l=a.border,u=this._pointLabels.length;if(a.pointLabels.display&&function(t,e){for(var i=t.ctx,n=t.options.pointLabels,r=e-1;r>=0;r--){var a=t._pointLabelItems[r];if(a.visible){var o=n.setContext(t.getPointLabelContext(r));Di(i,o,a);var s=(0,g.a0)(o.font),l=a.x,u=a.y,h=a.textAlign;(0,g.Z)(i,t._pointLabels[r],l,u+s.lineHeight/2,s,{color:o.color,textAlign:h,textBaseline:"middle"})}}}(this,u),s.display&&this.ticks.forEach((function(t,i){if(0!==i){e=n.getDistanceFromCenterForValue(t.value);var r=n.getContext(i),a=s.setContext(r),o=l.setContext(r);!function(t,e,i,n,r){var a=t.ctx,o=e.circular,s=e.color,l=e.lineWidth;!o&&!n||!s||!l||i<0||(a.save(),a.strokeStyle=s,a.lineWidth=l,a.setLineDash(r.dash),a.lineDashOffset=r.dashOffset,a.beginPath(),Ai(t,i,o,n),a.closePath(),a.stroke(),a.restore())}(n,a,e,u,o)}})),o.display){for(r.save(),t=u-1;t>=0;t--){var h=o.setContext(this.getPointLabelContext(t)),c=h.color,d=h.lineWidth;d&&c&&(r.lineWidth=d,r.strokeStyle=c,r.setLineDash(h.borderDash),r.lineDashOffset=h.borderDashOffset,e=this.getDistanceFromCenterForValue(a.ticks.reverse?this.min:this.max),i=this.getPointPosition(t,e),r.beginPath(),r.moveTo(this.xCenter,this.yCenter),r.lineTo(i.x,i.y),r.stroke())}r.restore()}}},{key:"drawBorder",value:function(){}},{key:"drawLabels",value:function(){var t=this,e=this.ctx,i=this.options,n=i.ticks;if(n.display){var r,a,o=this.getIndexAngle(0);e.save(),e.translate(this.xCenter,this.yCenter),e.rotate(o),e.textAlign="center",e.textBaseline="middle",this.ticks.forEach((function(o,s){if(0!==s||i.reverse){var l=n.setContext(t.getContext(s)),u=(0,g.a0)(l.font);if(r=t.getDistanceFromCenterForValue(t.ticks[s].value),l.showLabelBackdrop){e.font=u.string,a=e.measureText(o.label).width,e.fillStyle=l.backdropColor;var h=(0,g.E)(l.backdropPadding);e.fillRect(-a/2-h.left,-r-u.size/2-h.top,a+h.width,u.size+h.height)}(0,g.Z)(e,o.label,0,-r,u,{color:l.color,strokeColor:l.textStrokeColor,strokeWidth:l.textStrokeWidth})}})),e.restore()}}},{key:"drawTitle",value:function(){}}]),i}(gi);(0,h.Z)(Ti,"id","radialLinear"),(0,h.Z)(Ti,"defaults",{display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,lineWidth:1,borderDash:[],borderDashOffset:0},grid:{circular:!1},startAngle:0,ticks:{showLabelBackdrop:!0,callback:g.aL.formatters.numeric},pointLabels:{backdropColor:void 0,backdropPadding:2,display:!0,font:{size:10},callback:function(t){return t},padding:5,centerPointLabels:!1}}),(0,h.Z)(Ti,"defaultRoutes",{"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"}),(0,h.Z)(Ti,"descriptors",{angleLines:{_fallback:"grid"}});var Ei={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},Zi=Object.keys(Ei);function Li(t,e){return t-e}function Ri(t,e){if((0,g.k)(e))return null;var i=t._adapter,n=t._parseOpts,r=n.parser,a=n.round,o=n.isoWeekday,s=e;return"function"===typeof r&&(s=r(s)),(0,g.g)(s)||(s="string"===typeof r?i.parse(s,r):i.parse(s)),null===s?null:(a&&(s="week"!==a||!(0,g.x)(o)&&!0!==o?i.startOf(s,a):i.startOf(s,"isoWeek",o)),+s)}function Ii(t,e,i,n){for(var r=Zi.length,a=Zi.indexOf(t);a=e?i[r]:i[a]]=!0}}else t[e]=!0}function zi(t,e,i){var n,r,a=[],o={},s=e.length;for(n=0;n=0&&(e[a].major=!0);return e}(t,a,o,i):a}var ji=function(t){(0,s.Z)(i,t);var e=(0,l.Z)(i);function i(t){var n;return(0,f.Z)(this,i),(n=e.call(this,t))._cache={data:[],labels:[],all:[]},n._unit="day",n._majorUnit=void 0,n._offsets={},n._normalized=!1,n._parseOpts=void 0,n}return(0,v.Z)(i,[{key:"init",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.time||(t.time={}),r=this._adapter=new q._date(t.adapters.date);r.init(e),(0,g.ab)(n.displayFormats,r.formats()),this._parseOpts={parser:n.parser,round:n.round,isoWeekday:n.isoWeekday},o((0,a.Z)(i.prototype),"init",this).call(this,t),this._normalized=e.normalized}},{key:"parse",value:function(t,e){return void 0===t?null:Ri(this,t)}},{key:"beforeLayout",value:function(){o((0,a.Z)(i.prototype),"beforeLayout",this).call(this),this._cache={data:[],labels:[],all:[]}}},{key:"determineDataLimits",value:function(){var t=this.options,e=this._adapter,i=t.time.unit||"day",n=this.getUserBounds(),r=n.min,a=n.max,o=n.minDefined,s=n.maxDefined;function l(t){o||isNaN(t.min)||(r=Math.min(r,t.min)),s||isNaN(t.max)||(a=Math.max(a,t.max))}o&&s||(l(this._getLabelBounds()),"ticks"===t.bounds&&"labels"===t.ticks.source||l(this.getMinMax(!1))),r=(0,g.g)(r)&&!isNaN(r)?r:+e.startOf(Date.now(),i),a=(0,g.g)(a)&&!isNaN(a)?a:+e.endOf(Date.now(),i)+1,this.min=Math.min(r,a-1),this.max=Math.max(r+1,a)}},{key:"_getLabelBounds",value:function(){var t=this.getLabelTimestamps(),e=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY;return t.length&&(e=t[0],i=t[t.length-1]),{min:e,max:i}}},{key:"buildTicks",value:function(){var t=this.options,e=t.time,i=t.ticks,n="labels"===i.source?this.getLabelTimestamps():this._generate();"ticks"===t.bounds&&n.length&&(this.min=this._userMin||n[0],this.max=this._userMax||n[n.length-1]);var r=this.min,a=this.max,o=(0,g.aO)(n,r,a);return this._unit=e.unit||(i.autoSkip?Ii(e.minUnit,this.min,this.max,this._getLabelCapacity(r)):function(t,e,i,n,r){for(var a=Zi.length-1;a>=Zi.indexOf(i);a--){var o=Zi[a];if(Ei[o].common&&t._adapter.diff(r,n,o)>=e-1)return o}return Zi[i?Zi.indexOf(i):0]}(this,o.length,e.minUnit,this.min,this.max)),this._majorUnit=i.major.enabled&&"year"!==this._unit?function(t){for(var e=Zi.indexOf(t)+1,i=Zi.length;e0&&void 0!==arguments[0]?arguments[0]:[],n=0,r=0;this.options.offset&&i.length&&(t=this.getDecimalForValue(i[0]),n=1===i.length?1-t:(this.getDecimalForValue(i[1])-t)/2,e=this.getDecimalForValue(i[i.length-1]),r=1===i.length?e:(e-this.getDecimalForValue(i[i.length-2]))/2);var a=i.length<3?.5:.25;n=(0,g.S)(n,0,a),r=(0,g.S)(r,0,a),this._offsets={start:n,end:r,factor:1/(n+1+r)}}},{key:"_generate",value:function(){var t,e,i=this._adapter,n=this.min,r=this.max,a=this.options,o=a.time,s=o.unit||Ii(o.minUnit,n,r,this._getLabelCapacity(n)),l=(0,g.v)(a.ticks.stepSize,1),u="week"===s&&o.isoWeekday,h=(0,g.x)(u)||!0===u,c={},d=n;if(h&&(d=+i.startOf(d,"isoWeek",u)),d=+i.startOf(d,h?"day":s),i.diff(r,n,s)>1e5*l)throw new Error(n+" and "+r+" are too far apart with stepSize of "+l+" "+s);var f="data"===a.ticks.source&&this.getDataTimestamps();for(t=d,e=0;t0?o:1}},{key:"getDataTimestamps",value:function(){var t,e,i=this._cache.data||[];if(i.length)return i;var n=this.getMatchingVisibleMetas();if(this._normalized&&n.length)return this._cache.data=n[0].controller.getAllParsedValues(this);for(t=0,e=n.length;t=t[s].pos&&e<=t[l].pos){var u=(0,g.B)(t,"pos",e);s=u.lo,l=u.hi}var h=t[s];n=h.pos,a=h.time;var c=t[l];r=c.pos,o=c.time}else{if(e>=t[s].time&&e<=t[l].time){var d=(0,g.B)(t,"time",e);s=d.lo,l=d.hi}var f=t[s];n=f.time,a=f.pos;var v=t[l];r=v.time,o=v.pos}var p=r-n;return p?a+(o-a)*(e-n)/p:a}(0,h.Z)(ji,"id","time"),(0,h.Z)(ji,"defaults",{bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{source:"auto",callback:!1,major:{enabled:!1}}});var Vi=function(t){(0,s.Z)(i,t);var e=(0,l.Z)(i);function i(t){var n;return(0,f.Z)(this,i),(n=e.call(this,t))._table=[],n._minPos=void 0,n._tableRange=void 0,n}return(0,v.Z)(i,[{key:"initOffsets",value:function(){var t=this._getTimestampsForTable(),e=this._table=this.buildLookupTable(t);this._minPos=Wi(e,this.min),this._tableRange=Wi(e,this.max)-this._minPos,o((0,a.Z)(i.prototype),"initOffsets",this).call(this,t)}},{key:"buildLookupTable",value:function(t){var e,i,n,r,a,o=this.min,s=this.max,l=[],u=[];for(e=0,i=t.length;e=o&&r<=s&&l.push(r);if(l.length<2)return[{time:o,pos:0},{time:s,pos:1}];for(e=0,i=l.length;e>4]+g[15&t]},m=function(t){return(240&t)>>4===(15&t)};function b(t){var e=function(t){return m(t.r)&&m(t.g)&&m(t.b)&&m(t.a)}(t)?p:y;return t?"#"+e(t.r)+e(t.g)+e(t.b)+function(t,e){return t<255?e(t):""}(t.a,e):void 0}var x=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function k(t,e,i){var n=e*Math.min(i,1-i),r=function(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:(e+t/30)%12;return i-n*Math.max(Math.min(r-3,9-r,1),-1)};return[r(0),r(8),r(4)]}function _(t,e,i){var n=function(n){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:(n+t/60)%6;return i-i*e*Math.max(Math.min(r,4-r,1),0)};return[n(5),n(3),n(1)]}function w(t,e,i){var n,r=k(t,1,.5);for(e+i>1&&(e*=n=1/(e+i),i*=n),n=0;n<3;n++)r[n]*=1-e-i,r[n]+=e;return r}function M(t){var e,i,n,r=t.r/255,a=t.g/255,o=t.b/255,s=Math.max(r,a,o),l=Math.min(r,a,o),u=(s+l)/2;return s!==l&&(n=s-l,i=u>.5?n/(2-s-l):n/(s+l),e=function(t,e,i,n,r){return t===r?(e-i)/n+(e>16&255,i>>8&255,255&i]}return a}()).transparent=[0,0,0,0]);var e=D[t.toLowerCase()];return e&&{r:e[0],g:e[1],b:e[2],a:4===e.length?e[3]:255}}var Z=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;var L=function(t){return t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055},R=function(t){return t<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)};function I(t,e,i){if(t){var n=M(t);n[e]=Math.max(0,Math.min(n[e]+n[e]*i,0===e?360:1)),n=P(n),t.r=n[0],t.g=n[1],t.b=n[2]}}function F(t,e){return t?Object.assign(e||{},t):t}function z(t){var e={r:0,g:0,b:0,a:255};return Array.isArray(t)?t.length>=3&&(e={r:t[0],g:t[1],b:t[2],a:255},t.length>3&&(e.a=c(t[3]))):(e=F(t,{r:0,g:0,b:0,a:1})).a=c(e.a),e}function j(t){return"r"===t.charAt(0)?function(t){var e,i,n,r=Z.exec(t),a=255;if(r){if(r[7]!==e){var o=+r[7];a=r[8]?h(o):u(255*o,0,255)}return e=+r[1],i=+r[3],n=+r[5],{r:e=255&(r[2]?h(e):u(e,0,255)),g:i=255&(r[4]?h(i):u(i,0,255)),b:n=255&(r[6]?h(n):u(n,0,255)),a:a}}}(t):C(t)}var W=function(){function t(e){if((0,a.Z)(this,t),e instanceof t)return e;var i,n=typeof e;"object"===n?i=z(e):"string"===n&&(i=function(t){var e,i=t.length;return"#"===t[0]&&(4===i||5===i?e={r:255&17*v[t[1]],g:255&17*v[t[2]],b:255&17*v[t[3]],a:5===i?17*v[t[4]]:255}:7!==i&&9!==i||(e={r:v[t[1]]<<4|v[t[2]],g:v[t[3]]<<4|v[t[4]],b:v[t[5]]<<4|v[t[6]],a:9===i?v[t[7]]<<4|v[t[8]]:255})),e}(e)||E(e)||j(e)),this._rgb=i,this._valid=!!i}return(0,o.Z)(t,[{key:"valid",get:function(){return this._valid}},{key:"rgb",get:function(){var t=F(this._rgb);return t&&(t.a=d(t.a)),t},set:function(t){this._rgb=z(t)}},{key:"rgbString",value:function(){return this._valid?(t=this._rgb)&&(t.a<255?"rgba(".concat(t.r,", ").concat(t.g,", ").concat(t.b,", ").concat(d(t.a),")"):"rgb(".concat(t.r,", ").concat(t.g,", ").concat(t.b,")")):void 0;var t}},{key:"hexString",value:function(){return this._valid?b(this._rgb):void 0}},{key:"hslString",value:function(){return this._valid?function(t){if(t){var e=M(t),i=e[0],n=f(e[1]),r=f(e[2]);return t.a<255?"hsla(".concat(i,", ").concat(n,"%, ").concat(r,"%, ").concat(d(t.a),")"):"hsl(".concat(i,", ").concat(n,"%, ").concat(r,"%)")}}(this._rgb):void 0}},{key:"mix",value:function(t,e){if(t){var i,n=this.rgb,r=t.rgb,a=e===i?.5:e,o=2*a-1,s=n.a-r.a,l=((o*s===-1?o:(o+s)/(1+o*s))+1)/2;i=1-l,n.r=255&l*n.r+i*r.r+.5,n.g=255&l*n.g+i*r.g+.5,n.b=255&l*n.b+i*r.b+.5,n.a=a*n.a+(1-a)*r.a,this.rgb=n}return this}},{key:"interpolate",value:function(t,e){return t&&(this._rgb=function(t,e,i){var n=R(d(t.r)),r=R(d(t.g)),a=R(d(t.b));return{r:c(L(n+i*(R(d(e.r))-n))),g:c(L(r+i*(R(d(e.g))-r))),b:c(L(a+i*(R(d(e.b))-a))),a:t.a+i*(e.a-t.a)}}(this._rgb,t._rgb,e)),this}},{key:"clone",value:function(){return new t(this.rgb)}},{key:"alpha",value:function(t){return this._rgb.a=c(t),this}},{key:"clearer",value:function(t){return this._rgb.a*=1-t,this}},{key:"greyscale",value:function(){var t=this._rgb,e=l(.3*t.r+.59*t.g+.11*t.b);return t.r=t.g=t.b=e,this}},{key:"opaquer",value:function(t){return this._rgb.a*=1+t,this}},{key:"negate",value:function(){var t=this._rgb;return t.r=255-t.r,t.g=255-t.g,t.b=255-t.b,this}},{key:"lighten",value:function(t){return I(this._rgb,2,t),this}},{key:"darken",value:function(t){return I(this._rgb,2,-t),this}},{key:"saturate",value:function(t){return I(this._rgb,1,t),this}},{key:"desaturate",value:function(t){return I(this._rgb,1,-t),this}},{key:"rotate",value:function(t){return function(t,e){var i=M(t);i[0]=O(i[0]+e),i=P(i),t.r=i[0],t.g=i[1],t.b=i[2]}(this._rgb,t),this}}]),t}();function V(){}var N=function(){var t=0;return function(){return t++}}();function B(t){return null===t||"undefined"===typeof t}function H(t){if(Array.isArray&&Array.isArray(t))return!0;var e=Object.prototype.toString.call(t);return"[object"===e.slice(0,7)&&"Array]"===e.slice(-6)}function Y(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)}function X(t){return("number"===typeof t||t instanceof Number)&&isFinite(+t)}function U(t,e){return X(t)?t:e}function $(t,e){return"undefined"===typeof t?e:t}var K=function(t,e){return"string"===typeof t&&t.endsWith("%")?parseFloat(t)/100:+t/e},Q=function(t,e){return"string"===typeof t&&t.endsWith("%")?parseFloat(t)/100*e:+t};function q(t,e,i){if(t&&"function"===typeof t.call)return t.apply(i,e)}function J(t,e,i,n){var r,a,o;if(H(t))if(a=t.length,n)for(r=a-1;r>=0;r--)e.call(i,t[r],r);else for(r=0;r=t}function Dt(t,e,i){var n,r,a;for(n=0,r=t.length;nl&&u3&&void 0!==arguments[3]?arguments[3]:1e-6;return t>=Math.min(e,i)-n&&t<=Math.max(e,i)+n}function Vt(t,e,i){i=i||function(i){return t[i]1;)i(n=a+r>>1)?a=n:r=n;return{lo:a,hi:r}}var Nt=function(t,e,i,n){return Vt(t,i,n?function(n){var r=t[n][e];return r=i}))};function Ht(t,e,i){for(var n=0,r=t.length;nn&&t[r-1]>i;)r--;return n>0||r0||(Yt.forEach((function(e){delete t[e]})),delete t._chartjs)}}function $t(t){var e=new Set(t);return e.size===t.length?t:Array.from(e)}var Kt="undefined"===typeof window?function(t){return t()}:window.requestAnimationFrame;function Qt(t,e){var i=[],n=!1;return function(){for(var r=arguments.length,a=new Array(r),o=0;o=1?t:-(Math.sqrt(1-t*t)-1)},easeOutCirc:function(t){return Math.sqrt(1-(t-=1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){return ne(t)?t:re(t,.075,.3)},easeOutElastic:function(t){return ne(t)?t:ae(t,.075,.3)},easeInOutElastic:function(t){var e=.1125;return ne(t)?t:t<.5?.5*re(2*t,e,.45):.5+.5*ae(2*t-1,e,.45)},easeInBack:function(t){var e=1.70158;return t*t*((e+1)*t-e)},easeOutBack:function(t){var e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack:function(t){var e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:function(t){return 1-oe.easeOutBounce(1-t)},easeOutBounce:function(t){var e=7.5625,i=2.75;return t<1/i?e*t*t:t<2/i?e*(t-=1.5/i)*t+.75:t<2.5/i?e*(t-=2.25/i)*t+.9375:e*(t-=2.625/i)*t+.984375},easeInOutBounce:function(t){return t<.5?.5*oe.easeInBounce(2*t):.5*oe.easeOutBounce(2*t-1)+.5}};function se(t){if(t&&"object"===typeof t){var e=t.toString();return"[object CanvasPattern]"===e||"[object CanvasGradient]"===e}return!1}function le(t){return se(t)?t:new W(t)}function ue(t){return se(t)?t:new W(t).saturate(.5).darken(.1).hexString()}var he=["x","y","borderWidth","radius","tension"],ce=["color","borderColor","backgroundColor"];var de=new Map;function fe(t,e,i){return function(t,e){e=e||{};var i=t+JSON.stringify(e),n=de.get(i);return n||(n=new Intl.NumberFormat(t,e),de.set(i,n)),n}(e,i).format(t)}var ve={values:function(t){return H(t)?t:""+t},numeric:function(t,e,i){if(0===t)return"0";var n,r=this.chart.options.locale,a=t;if(i.length>1){var o=Math.max(Math.abs(i[0].value),Math.abs(i[i.length-1].value));(o<1e-4||o>1e15)&&(n="scientific"),a=function(t,e){var i=e.length>3?e[2].value-e[1].value:e[1].value-e[0].value;Math.abs(i)>=1&&t!==Math.floor(t)&&(i=t-Math.floor(t));return i}(t,i)}var s=_t(Math.abs(a)),l=isNaN(s)?1:Math.max(Math.min(-1*Math.floor(s),20),0),u={notation:n,minimumFractionDigits:l,maximumFractionDigits:l};return Object.assign(u,this.options.ticks.format),fe(t,r,u)},logarithmic:function(t,e,i){if(0===t)return"0";var n=i[e].significand||t/Math.pow(10,Math.floor(_t(t)));return[1,2,3,5,10,15].includes(n)||e>.8*i.length?ve.numeric.call(this,t,e,i):""}};var ge={formatters:ve};var pe=Object.create(null),ye=Object.create(null);function me(t,e){if(!e)return t;for(var i=e.split("."),n=0,r=i.length;nn&&(n=a),n}function we(t,e,i,n){var r=(n=n||{}).data=n.data||{},a=n.garbageCollect=n.garbageCollect||[];n.font!==e&&(r=n.data={},a=n.garbageCollect=[],n.font=e),t.save(),t.font=e;var o,s,l,u,h,c=0,d=i.length;for(o=0;oi.length){for(o=0;o0&&t.stroke()}}function Ce(t,e,i){return i=i||.5,!e||t&&t.x>e.left-i&&t.xe.top-i&&t.y5&&void 0!==arguments[5]?arguments[5]:{},l=H(e)?e:[e],u=s.strokeWidth>0&&""!==s.strokeColor;for(t.save(),t.font=r.string,function(t,e){e.translation&&t.translate(e.translation[0],e.translation[1]),B(e.rotation)||t.rotate(e.rotation),e.color&&(t.fillStyle=e.color),e.textAlign&&(t.textAlign=e.textAlign),e.textBaseline&&(t.textBaseline=e.textBaseline)}(t,s),a=0;a1&&void 0!==arguments[1]?arguments[1]:[""],a=arguments.length>3?arguments[3]:void 0,o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:function(){return t[0]},l=(arguments.length>2?arguments[2]:void 0)||t;"undefined"===typeof a&&(a=oi("_fallback",t));var u=(e={},(0,r.Z)(e,Symbol.toStringTag,"Object"),(0,r.Z)(e,"_cacheable",!0),(0,r.Z)(e,"_scopes",t),(0,r.Z)(e,"_rootScopes",l),(0,r.Z)(e,"_fallback",a),(0,r.Z)(e,"_getTarget",o),(0,r.Z)(e,"override",(function(e){return Ke([e].concat((0,n.Z)(t)),i,l,a)})),e);return new Proxy(u,{deleteProperty:function(e,i){return delete e[i],delete e._keys,delete t[0][i],!0},get:function(e,n){return ti(e,n,(function(){return function(t,e,i,n){var r,a,o=(0,s.Z)(e);try{for(o.s();!(a=o.n()).done;){var l=a.value;if("undefined"!==typeof(r=oi(Je(l,t),i)))return Ge(t,r)?ri(i,n,t,r):r}}catch(u){o.e(u)}finally{o.f()}}(n,i,t,e)}))},getOwnPropertyDescriptor:function(t,e){return Reflect.getOwnPropertyDescriptor(t._scopes[0],e)},getPrototypeOf:function(){return Reflect.getPrototypeOf(t[0])},has:function(t,e){return si(t).includes(e)},ownKeys:function(t){return si(t)},set:function(t,e,i){var n=t._storage||(t._storage=o());return t[e]=n[e]=i,delete t._keys,!0}})}function Qe(t,e,i,n){var r={_cacheable:!1,_proxy:t,_context:e,_subProxy:i,_stack:new Set,_descriptors:qe(t,n),setContext:function(e){return Qe(t,e,i,n)},override:function(r){return Qe(t.override(r),e,i,n)}};return new Proxy(r,{deleteProperty:function(e,i){return delete e[i],delete t[i],!0},get:function(t,e,i){return ti(t,e,(function(){return function(t,e,i){var n=t._proxy,r=t._context,a=t._subProxy,o=t._descriptors,l=n[e];ct(l)&&o.isScriptable(e)&&(l=function(t,e,i,n){var r=i._proxy,a=i._context,o=i._subProxy,s=i._stack;if(s.has(t))throw new Error("Recursion detected: "+Array.from(s).join("->")+"->"+t);s.add(t);var l=e(a,o||n);s.delete(t),Ge(t,l)&&(l=ri(r._scopes,r,t,l));return l}(e,l,t,i));H(l)&&l.length&&(l=function(t,e,i,n){var r=i._proxy,a=i._context,o=i._subProxy,l=i._descriptors;if("undefined"!==typeof a.index&&n(t))return e[a.index%e.length];if(Y(e[0])){var u=e,h=r._scopes.filter((function(t){return t!==u}));e=[];var c,d=(0,s.Z)(u);try{for(d.s();!(c=d.n()).done;){var f=ri(h,r,t,c.value);e.push(Qe(f,a,o&&o[t],l))}}catch(v){d.e(v)}finally{d.f()}}return e}(e,l,t,o.isIndexable));Ge(e,l)&&(l=Qe(l,r,a&&a[e],o));return l}(t,e,i)}))},getOwnPropertyDescriptor:function(e,i){return e._descriptors.allKeys?Reflect.has(t,i)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(t,i)},getPrototypeOf:function(){return Reflect.getPrototypeOf(t)},has:function(e,i){return Reflect.has(t,i)},ownKeys:function(){return Reflect.ownKeys(t)},set:function(e,i,n){return t[i]=n,delete e[i],!0}})}function qe(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{scriptable:!0,indexable:!0},i=t._scriptable,n=void 0===i?e.scriptable:i,r=t._indexable,a=void 0===r?e.indexable:r,o=t._allKeys;return{allKeys:void 0===o?e.allKeys:o,scriptable:n,indexable:a,isScriptable:ct(n)?n:function(){return n},isIndexable:ct(a)?a:function(){return a}}}var Je=function(t,e){return t?t+ut(e):e},Ge=function(t,e){return Y(e)&&"adapters"!==t&&(null===Object.getPrototypeOf(e)||e.constructor===Object)};function ti(t,e,i){if(Object.prototype.hasOwnProperty.call(t,e))return t[e];var n=i();return t[e]=n,n}function ei(t,e,i){return ct(t)?t(e,i):t}var ii=function(t,e){return!0===t?e:"string"===typeof t?lt(e,t):void 0};function ni(t,e,i,n,r){var a,o=(0,s.Z)(e);try{for(o.s();!(a=o.n()).done;){var l=a.value,u=ii(i,l);if(u){t.add(u);var h=ei(u._fallback,i,r);if("undefined"!==typeof h&&h!==i&&h!==n)return h}else if(!1===u&&"undefined"!==typeof n&&i!==n)return null}}catch(c){o.e(c)}finally{o.f()}return!1}function ri(t,e,i,r){var a=e._rootScopes,o=ei(e._fallback,i,r),s=[].concat((0,n.Z)(t),(0,n.Z)(a)),l=new Set;l.add(r);var u=ai(l,s,i,o||i,r);return null!==u&&(("undefined"===typeof o||o===i||null!==(u=ai(l,s,o,u,r)))&&Ke(Array.from(l),[""],a,o,(function(){return function(t,e,i){var n=t._getTarget();e in n||(n[e]={});var r=n[e];if(H(r)&&Y(i))return i;return r||{}}(e,i,r)})))}function ai(t,e,i,n,r){for(;i;)i=ni(t,e,i,n,r);return i}function oi(t,e){var i,n=(0,s.Z)(e);try{for(n.s();!(i=n.n()).done;){var r=i.value;if(r){var a=r[t];if("undefined"!==typeof a)return a}}}catch(o){n.e(o)}finally{n.f()}}function si(t){var e=t._keys;return e||(e=t._keys=function(t){var e,i=new Set,n=(0,s.Z)(t);try{for(n.s();!(e=n.n()).done;){var r,a=e.value,o=(0,s.Z)(Object.keys(a).filter((function(t){return!t.startsWith("_")})));try{for(o.s();!(r=o.n()).done;){var l=r.value;i.add(l)}}catch(u){o.e(u)}finally{o.f()}}}catch(u){n.e(u)}finally{n.f()}return Array.from(i)}(t._scopes)),e}function li(t,e,i,n){var r,a,o,s,l=t.iScale,u=this._parsing.key,h=void 0===u?"r":u,c=new Array(n);for(r=0,a=n;r1&&void 0!==arguments[1]?arguments[1]:"x",a=ci(r),o=t.length,s=Array(o).fill(0),l=Array(o),u=hi(t,0);for(e=0;e2&&void 0!==arguments[2]?arguments[2]:"x",o=ci(a),s=t.length,l=hi(t,0),u=0;u0||e>0)&&(!i||!i.shadowRoot)};function wi(t,e){if("native"in t)return t;var i=e.canvas,n=e.currentDevicePixelRatio,r=bi(i),a="border-box"===r.boxSizing,o=ki(r,"padding"),s=ki(r,"border","width"),l=function(t,e){var i,n,r=t.touches,a=r&&r.length?r[0]:t,o=a.offsetX,s=a.offsetY,l=!1;if(_i(o,s,t.target))i=o,n=s;else{var u=e.getBoundingClientRect();i=a.clientX-u.left,n=a.clientY-u.top,l=!0}return{x:i,y:n,box:l}}(t,i),u=l.x,h=l.y,c=l.box,d=o.left+(c&&s.left),f=o.top+(c&&s.top),v=e.width,g=e.height;return a&&(v-=o.width+s.width,g-=o.height+s.height),{x:Math.round((u-d)/v*i.width/n),y:Math.round((h-f)/g*i.height/n)}}var Mi=function(t){return Math.round(10*t)/10};function Si(t,e,i,n){var r=bi(t),a=ki(r,"margin"),o=mi(r.maxWidth,t,"clientWidth")||yt,s=mi(r.maxHeight,t,"clientHeight")||yt,l=function(t,e,i){var n,r;if(void 0===e||void 0===i){var a=yi(t);if(a){var o=a.getBoundingClientRect(),s=bi(a),l=ki(s,"border","width"),u=ki(s,"padding");e=o.width-u.width-l.width,i=o.height-u.height-l.height,n=mi(s.maxWidth,a,"clientWidth"),r=mi(s.maxHeight,a,"clientHeight")}else e=t.clientWidth,i=t.clientHeight}return{width:e,height:i,maxWidth:n||yt,maxHeight:r||yt}}(t,e,i),u=l.width,h=l.height;if("content-box"===r.boxSizing){var c=ki(r,"border","width"),d=ki(r,"padding");u-=d.width+c.width,h-=d.height+c.height}return u=Math.max(0,u-a.width),h=Math.max(0,n?u/n:h-a.height),u=Mi(Math.min(u,o,l.maxWidth)),h=Mi(Math.min(h,s,l.maxHeight)),u&&!h&&(h=Mi(u/2)),(void 0!==e||void 0!==i)&&n&&l.height&&h>l.height&&(h=l.height,u=Mi(Math.floor(h*n))),{width:u,height:h}}function Pi(t,e,i){var n=e||1,r=Math.floor(t.height*n),a=Math.floor(t.width*n);t.height=Math.floor(t.height),t.width=Math.floor(t.width);var o=t.canvas;return o.style&&(i||!o.style.height&&!o.style.width)&&(o.style.height="".concat(t.height,"px"),o.style.width="".concat(t.width,"px")),(t.currentDevicePixelRatio!==n||o.height!==r||o.width!==a)&&(t.currentDevicePixelRatio=n,o.height=r,o.width=a,t.ctx.setTransform(n,0,0,n,0,0),!0)}var Oi=function(){var t=!1;try{var e={get passive(){return t=!0,!1}};window.addEventListener("test",null,e),window.removeEventListener("test",null,e)}catch(i){}return t}();function Ci(t,e){var i=function(t,e){return bi(t).getPropertyValue(e)}(t,e),n=i&&i.match(/^(\d+)(\.\d+)?px$/);return n?+n[1]:void 0}function Di(t,e,i,n){return{x:t.x+i*(e.x-t.x),y:t.y+i*(e.y-t.y)}}function Ai(t,e,i,n){return{x:t.x+i*(e.x-t.x),y:"middle"===n?i<.5?t.y:e.y:"after"===n?i<1?t.y:e.y:i>0?e.y:t.y}}function Ti(t,e,i,n){var r={x:t.cp2x,y:t.cp2y},a={x:e.cp1x,y:e.cp1y},o=Di(t,r,i),s=Di(r,a,i),l=Di(a,e,i),u=Di(o,s,i),h=Di(s,l,i);return Di(u,h,i)}var Ei=function(t,e){return{x:function(i){return t+t+e-i},setWidth:function(t){e=t},textAlign:function(t){return"center"===t?t:"right"===t?"left":"right"},xPlus:function(t,e){return t-e},leftForLtr:function(t,e){return t-e}}},Zi=function(){return{x:function(t){return t},setWidth:function(t){},textAlign:function(t){return t},xPlus:function(t,e){return t+e},leftForLtr:function(t,e){return t}}};function Li(t,e,i){return t?Ei(e,i):Zi()}function Ri(t,e){var i,n;"ltr"!==e&&"rtl"!==e||(n=[(i=t.canvas.style).getPropertyValue("direction"),i.getPropertyPriority("direction")],i.setProperty("direction",e,"important"),t.prevTextDirection=n)}function Ii(t,e){void 0!==e&&(delete t.prevTextDirection,t.canvas.style.setProperty("direction",e[0],e[1]))}function Fi(t){return"angle"===t?{between:Ft,compare:Rt,normalize:It}:{between:Wt,compare:function(t,e){return t-e},normalize:function(t){return t}}}function zi(t){var e=t.start,i=t.end,n=t.count;return{start:e%n,end:i%n,loop:t.loop&&(i-e+1)%n===0,style:t.style}}function ji(t,e,i){if(!i)return[t];for(var n,r,a,o=i.property,s=i.start,l=i.end,u=e.length,h=Fi(o),c=h.compare,d=h.between,f=h.normalize,v=function(t,e,i){var n,r,a=i.property,o=i.start,s=i.end,l=Fi(a),u=l.between,h=l.normalize,c=e.length,d=t.start,f=t.end,v=t.loop;if(v){for(d+=c,f+=c,n=0,r=c;nr&&t[a%e].skip;)a--;return{start:r,end:a%=e}}(i,r,a,n),s=o.start,l=o.end;return Ni(t,!0===n?[{start:s,end:l,loop:a}]:function(t,e,i,n){var r,a=t.length,o=[],s=e,l=t[e];for(r=e+1;r<=i;++r){var u=t[r%a];u.skip||u.stop?l.skip||(n=!1,o.push({start:e%a,end:(r-1)%a,loop:n}),e=s=u.stop?r:null):(s=r,l.skip&&(e=r)),l=u}return null!==s&&o.push({start:e%a,end:s%a,loop:n}),o}(i,s,lt||t.length>e.length&&t.slice(0,e.length)===e},p=.001,y=function(t,e,i){return Math.min(i,Math.max(e,t))};function m(t,e,i){for(var n=0,r=Object.keys(t);n=r-l-p&&t.x<=o+l+p,h=t.y>=a-l-p&&t.y<=s+l+p;return"x"===i?u:("y"===i||u)&&h}function x(t,e){var i=t.getProps(["centerX","centerY"],e);return{x:i.centerX,y:i.centerY}}var k=function(t){return"string"===typeof t&&t.endsWith("%")},_=function(t){return parseFloat(t)/100},w=function(t){return y(_(t),0,1)},M=function(t,e){return{x:t,y:e,x2:t,y2:e,width:0,height:0}},S={box:function(t){return M(t.centerX,t.centerY)},ellipse:function(t){return{centerX:t.centerX,centerY:t.centerX,radius:0,width:0,height:0}},label:function(t){return M(t.centerX,t.centerY)},line:function(t){return M(t.x,t.y)},point:function(t){return{centerX:t.centerX,centerY:t.centerY,radius:0,width:0,height:0}},polygon:function(t){return M(t.centerX,t.centerY)}};function P(t,e){return"start"===e?0:"end"===e?t:k(e)?w(e)*t:t/2}function O(t,e){var i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];return"number"===typeof e?e:k(e)?(i?w(e):_(e))*t:t}function C(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"center";return(0,c.i)(t)?{x:(0,c.v)(t.x,e),y:(0,c.v)(t.y,e)}:{x:t=(0,c.v)(t,e),y:t}}function D(t){return t&&((0,c.h)(t.xValue)||(0,c.h)(t.yValue))}function A(t,e,i){var n=i.init;if(n)return!0===n?E(e,i):function(t,e,i){var n=(0,c.Q)(i.init,[{chart:t,properties:e,options:i}]);if(!0===n)return E(e,i);if((0,c.i)(n))return n}(t,e,i)}function T(t,e,i){var n=!1;return e.forEach((function(e){(0,c.a7)(t[e])?(n=!0,i[e]=t[e]):(0,c.h)(i[e])&&delete i[e]})),n}function E(t,e){var i=e.type||"line";return S[i](t)}var Z=new Map,L=function(t){return t.reduce((function(t,e){return t+=e.string}),"")};function R(t){if(t&&"object"===typeof t){var e=t.toString();return"[object HTMLImageElement]"===e||"[object HTMLCanvasElement]"===e}}function I(t,e,i){var n=e.x,r=e.y;i&&(t.translate(n,r),t.rotate((0,c.t)(i)),t.translate(-n,-r))}function F(t,e){if(e&&e.borderWidth)return t.lineCap=e.borderCapStyle,t.setLineDash(e.borderDash),t.lineDashOffset=e.borderDashOffset,t.lineJoin=e.borderJoinStyle,t.lineWidth=e.borderWidth,t.strokeStyle=e.borderColor,!0}function z(t,e){t.shadowColor=e.backgroundShadowColor,t.shadowBlur=e.shadowBlur,t.shadowOffsetX=e.shadowOffsetX,t.shadowOffsetY=e.shadowOffsetY}function j(t,e){var i=e.content;if(R(i))return{width:O(i.width,e.width),height:O(i.height,e.height)};var n=e.font,r=(0,c.b)(n)?n.map((function(t){return(0,c.a0)(t)})):[(0,c.a0)(n)],a=e.textStrokeWidth,o=(0,c.b)(i)?i:[i],s=o.join()+L(r)+a+(t._measureText?"-spriting":"");return Z.has(s)||Z.set(s,function(t,e,i,n){t.save();for(var r=e.length,a=0,o=n,s=0;s0)return t.lineJoin="round",t.miterLimit=2,t.lineWidth=e.textStrokeWidth,t.strokeStyle=e.textStrokeColor,!0}(t,i)&&function(t,e,i,n){var r=e.x,a=e.y;t.beginPath();var o=0;i.forEach((function(e,i){var s=n[Math.min(i,n.length-1)],l=s.lineHeight;t.font=s.string,t.strokeText(e,r,a+l/2+o),o+=l})),t.stroke()}(t,{x:u,y:h},r,o),function(t,e,i,n){var r=e.x,a=e.y,o=n.fonts,s=n.colors,l=0;i.forEach((function(e,i){var n=s[Math.min(i,s.length-1)],u=o[Math.min(i,o.length-1)],h=u.lineHeight;t.beginPath(),t.font=u.string,t.fillStyle=n,t.fillText(e,r,a+h/2+l),l+=h,t.fill()}))}(t,{x:u,y:h},r,{fonts:o,colors:l}),t.restore()}function N(t,e,i,n){var r=e.radius,a=e.options,o=a.pointStyle,s=a.rotation,l=(s||0)*c.b3;if(R(o))return t.save(),t.translate(i,n),t.rotate(l),t.drawImage(o,-o.width/2,-o.height/2,o.width,o.height),void t.restore();(function(t){return isNaN(t)||t<=0})(r)||function(t,e){var i,n,r,a,o=e.x,s=e.y,l=e.radius,u=e.rotation,h=e.style,d=e.rad;switch(t.beginPath(),h){default:t.arc(o,s,l,0,c.T),t.closePath();break;case"triangle":t.moveTo(o+Math.sin(d)*l,s-Math.cos(d)*l),d+=c.b5,t.lineTo(o+Math.sin(d)*l,s-Math.cos(d)*l),d+=c.b5,t.lineTo(o+Math.sin(d)*l,s-Math.cos(d)*l),t.closePath();break;case"rectRounded":r=l-(a=.516*l),i=Math.cos(d+c.b4)*r,n=Math.sin(d+c.b4)*r,t.arc(o-i,s-n,a,d-c.P,d-c.H),t.arc(o+n,s-i,a,d-c.H,d),t.arc(o+i,s+n,a,d,d+c.H),t.arc(o-n,s+i,a,d+c.H,d+c.P),t.closePath();break;case"rect":if(!u){r=Math.SQRT1_2*l,t.rect(o-r,s-r,2*r,2*r);break}d+=c.b4;case"rectRot":i=Math.cos(d)*l,n=Math.sin(d)*l,t.moveTo(o-i,s-n),t.lineTo(o+n,s-i),t.lineTo(o+i,s+n),t.lineTo(o-n,s+i),t.closePath();break;case"crossRot":d+=c.b4;case"cross":i=Math.cos(d)*l,n=Math.sin(d)*l,t.moveTo(o-i,s-n),t.lineTo(o+i,s+n),t.moveTo(o+n,s-i),t.lineTo(o-n,s+i);break;case"star":i=Math.cos(d)*l,n=Math.sin(d)*l,t.moveTo(o-i,s-n),t.lineTo(o+i,s+n),t.moveTo(o+n,s-i),t.lineTo(o-n,s+i),d+=c.b4,i=Math.cos(d)*l,n=Math.sin(d)*l,t.moveTo(o-i,s-n),t.lineTo(o+i,s+n),t.moveTo(o+n,s-i),t.lineTo(o-n,s+i);break;case"line":i=Math.cos(d)*l,n=Math.sin(d)*l,t.moveTo(o-i,s-n),t.lineTo(o+i,s+n);break;case"dash":t.moveTo(o,s),t.lineTo(o+Math.cos(d)*l,s+Math.sin(d)*l)}t.fill()}(t,{x:i,y:n,radius:r,rotation:s,style:o,rad:l})}var B={xScaleID:{min:"xMin",max:"xMax",start:"left",end:"right",startProp:"x",endProp:"x2"},yScaleID:{min:"yMin",max:"yMax",start:"bottom",end:"top",startProp:"y",endProp:"y2"}};function H(t,e,i){return e="number"===typeof e?e:t.parse(e),(0,c.g)(e)?t.getPixelForValue(e):i}function Y(t,e,i){var n=e[i];if(n||"scaleID"===i)return n;var r=i.charAt(0),a=Object.values(t).filter((function(t){return t.axis&&t.axis===r}));return a.length?a[0].id:r}function X(t,e){if(t){var i=t.options.reverse;return{start:H(t,e.min,i?e.end:e.start),end:H(t,e.max,i?e.start:e.end)}}}function U(t,e){var i=t.chartArea,n=t.scales,r=n[Y(n,e,"xScaleID")],a=n[Y(n,e,"yScaleID")],o=i.width/2,s=i.height/2;return r&&(o=H(r,e.xValue,r.left+r.width/2)),a&&(s=H(a,e.yValue,a.top+a.height/2)),{x:o,y:s}}function $(t,e){var i=t.scales,n=i[Y(i,e,"xScaleID")],r=i[Y(i,e,"yScaleID")];if(!n&&!r)return{};var a=n||t.chartArea,o=a.left,s=a.right,l=r||t.chartArea,u=l.top,h=l.bottom,c=J(n,{min:e.xMin,max:e.xMax,start:o,end:s});o=c.start,s=c.end;var d=J(r,{min:e.yMin,max:e.yMax,start:h,end:u});return{x:o,y:u=d.start,x2:s,y2:h=d.end,width:s-o,height:h-u,centerX:o+(s-o)/2,centerY:u+(h-u)/2}}function K(t,e){if(!D(e)){var i=$(t,e),n=e.radius;n&&!isNaN(n)||(n=Math.min(i.width,i.height)/2,e.radius=n);var r=2*n,a=i.centerX+e.xAdjust,o=i.centerY+e.yAdjust;return{x:a-n,y:o-n,x2:a+n,y2:o+n,centerX:a,centerY:o,width:r,height:r,radius:n}}return function(t,e){var i=U(t,e),n=2*e.radius;return{x:i.x-e.radius+e.xAdjust,y:i.y-e.radius+e.yAdjust,x2:i.x+e.radius+e.xAdjust,y2:i.y+e.radius+e.yAdjust,centerX:i.x+e.xAdjust,centerY:i.y+e.yAdjust,radius:e.radius,width:n,height:n}}(t,e)}function Q(t,e){var i=t.scales,n=t.chartArea,r=i[e.scaleID],a={x:n.left,y:n.top,x2:n.right,y2:n.bottom};return r?function(t,e,i){var n=H(t,i.value,NaN),r=H(t,i.endValue,n);t.isHorizontal()?(e.x=n,e.x2=r):(e.y=n,e.y2=r)}(r,a,e):function(t,e,i){for(var n=0,r=Object.keys(B);n0||0===r.borderWidth)&&(t.moveTo(u.x,u.y),t.lineTo(h.x,h.y));t.moveTo(f.x,f.y),t.lineTo(v.x,v.y);var g=et({x:i,y:n},e.getCenterPoint(),(0,c.t)(-e.rotation));t.lineTo(g.x,g.y),t.stroke(),t.restore()}(t,this),W(t,this,e),V(t,function(t){var e=t.x,i=t.y,n=t.width,r=t.height,a=t.options,o=a.borderWidth/2,s=(0,c.E)(a.padding);return{x:e+s.left+o,y:i+s.top+o,width:n-s.left-s.right-a.borderWidth,height:r-s.top-s.bottom-a.borderWidth}}(this),e),t.restore())}},{key:"resolveElementProperties",value:function(t,e){var i;if(D(e))i=U(t,e);else{var n=$(t,e);i={x:n.centerX,y:n.centerY}}var a=(0,c.E)(e.padding),o=function(t,e,i,n){var r=e.width+n.width+i.borderWidth,a=e.height+n.height+i.borderWidth,o=C(i.position,"center"),s=yt(t.x,r,i.xAdjust,o.x),l=yt(t.y,a,i.yAdjust,o.y);return{x:s,y:l,x2:s+r,y2:l+a,width:r,height:a,centerX:s+r/2,centerY:l+a/2}}(i,j(t.ctx,e),e,a);return(0,r.Z)((0,r.Z)({initProperties:A(t,o,e),pointX:i.x,pointY:i.y},o),{},{rotation:e.rotation})}}]),i}(h.W_);function yt(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;return t-P(e,arguments.length>3?arguments[3]:void 0)+i}pt.id="labelAnnotation",pt.defaults={adjustScaleRange:!0,backgroundColor:"transparent",backgroundShadowColor:"transparent",borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",borderRadius:0,borderShadowColor:"transparent",borderWidth:0,callout:{borderCapStyle:"butt",borderColor:void 0,borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",borderWidth:1,display:!1,margin:5,position:"auto",side:5,start:"50%"},color:"black",content:null,display:!0,font:{family:void 0,lineHeight:void 0,size:void 0,style:void 0,weight:void 0},height:void 0,init:void 0,opacity:void 0,padding:6,position:"center",rotation:0,shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,textAlign:"center",textStrokeColor:void 0,textStrokeWidth:0,width:void 0,xAdjust:0,xMax:void 0,xMin:void 0,xScaleID:void 0,xValue:void 0,yAdjust:0,yMax:void 0,yMin:void 0,yScaleID:void 0,yValue:void 0,z:0},pt.defaultRoutes={borderColor:"color"};var mt=function(t,e,i){return{x:t.x+i*(e.x-t.x),y:t.y+i*(e.y-t.y)}},bt=function(t,e,i){return mt(e,i,Math.abs((t-e.y)/(i.y-e.y))).x},xt=function(t,e,i){return mt(e,i,Math.abs((t-e.x)/(i.x-e.x))).y},kt=function(t){return t*t},_t=function(t,e,i,n){return(1-n)*(1-n)*t+2*(1-n)*n*e+n*n*i},wt=function(t,e,i,n){return{x:_t(t.x,e.x,i.x,n),y:_t(t.y,e.y,i.y,n)}},Mt=function(t,e,i,n){return 2*(1-n)*(e-t)+2*n*(i-e)},St=function(t,e,i,n){return-Math.atan2(Mt(t.x,e.x,i.x,n),Mt(t.y,e.y,i.y,n))+.5*c.P},Pt=function(t){(0,s.Z)(i,t);var e=(0,l.Z)(i);function i(){return(0,a.Z)(this,i),e.apply(this,arguments)}return(0,o.Z)(i,[{key:"inRange",value:function(t,e,i,n){var r=this.options.borderWidth/2;if("x"!==i&&"y"!==i){var a={mouseX:t,mouseY:e},o=this.path,s=this.ctx;if(o){F(s,this.options);var l=this.$context.chart,u=t*l.currentDevicePixelRatio,h=e*l.currentDevicePixelRatio,c=s.isPointInStroke(o,u,h)||Dt(this,a,n);return s.restore(),c}return function(t,e){var i,n,r=e.mouseX,a=e.mouseY,o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:p,s=arguments.length>3?arguments[3]:void 0,l=t.getProps(["x","y","x2","y2"],s),u=l.x,h=l.y,c=l.x2,d=l.y2,f=c-u,v=d-h,g=kt(f)+kt(v),y=0===g?-1:((r-u)*f+(a-h)*v)/g;y<0?(i=u,n=h):y>1?(i=c,n=d):(i=u+y*f,n=h+y*v);return kt(r-i)+kt(a-n)<=o}(this,a,kt(r),n)||Dt(this,a,n)}return function(t,e,i,n){var r=e.mouseX,a=e.mouseY,o=n.hBorderWidth,s=n.useFinalPosition,l=function(t,e,i,n){var r=i.x,a=i.y,o=i.x2,s=i.y2;return"y"===n?{start:Math.min(a,s),end:Math.max(a,s),value:e}:{start:Math.min(r,o),end:Math.max(r,o),value:t}}(r,a,t.getProps(["x","y","x2","y2"],s),i);return l.value>=l.start-o&&l.value<=l.end+o||Dt(t,{mouseX:r,mouseY:a},s,i)}(this,{mouseX:t,mouseY:e},i,{hBorderWidth:r,useFinalPosition:n})}},{key:"getCenterPoint",value:function(t){return x(this,t)}},{key:"draw",value:function(t){var e=this.x,i=this.y,n=this.x2,r=this.y2,a=this.cp,o=this.options;if(t.save(),!F(t,o))return t.restore();z(t,o);var s=Math.sqrt(Math.pow(n-e,2)+Math.pow(r-i,2));if(o.curve&&a)return function(t,e,i,n){var r=e.x,a=e.y,o=e.x2,s=e.y2,l=e.options,u=Et(e),h=u.startOpts,d=u.endOpts,f=u.startAdjust,v=u.endAdjust,g={x:r,y:a},p={x:o,y:s},y=St(g,i,p,0),m=St(g,i,p,1)-c.P,b=wt(g,i,p,f/n),x=wt(g,i,p,1-v/n),k=new Path2D;t.beginPath(),k.moveTo(b.x,b.y),k.quadraticCurveTo(i.x,i.y,x.x,x.y),t.shadowColor=l.borderShadowColor,t.stroke(k),e.path=k,e.ctx=t,Rt(t,b,{angle:y,adjust:f},h),Rt(t,x,{angle:m,adjust:v},d)}(t,this,a,s),t.restore();var l=Et(this),u=l.startOpts,h=l.endOpts,d=l.startAdjust,f=l.endAdjust,v=Math.atan2(r-i,n-e);t.translate(e,i),t.rotate(v),t.beginPath(),t.moveTo(0+d,0),t.lineTo(s-f,0),t.shadowColor=o.borderShadowColor,t.stroke(),Lt(t,0,d,u),Lt(t,s,-f,h),t.restore()}},{key:"label",get:function(){return this.elements&&this.elements[0]}},{key:"resolveElementProperties",value:function(t,e){var i=Q(t,e),n=i.x,r=i.y,a=i.x2,o=i.y2,s=function(t,e){var i=t.x,n=t.y,r=t.x2,a=t.y2,o=e.top,s=e.right,l=e.bottom,u=e.left;return!(is&&r>s||nl&&a>l)}(i,t.chartArea),l=s?function(t,e,i){var n=Ct(t,e,i),r=n.x,a=n.y,o=Ct(e,t,i),s=o.x,l=o.y;return{x:r,y:a,x2:s,y2:l,width:Math.abs(s-r),height:Math.abs(l-a)}}({x:n,y:r},{x:a,y:o},t.chartArea):{x:n,y:r,x2:a,y2:o,width:Math.abs(a-n),height:Math.abs(o-r)};if(l.centerX=(a+n)/2,l.centerY=(o+r)/2,l.initProperties=A(t,l,e),e.curve){var u={x:l.x,y:l.y},h={x:l.x2,y:l.y2};l.cp=function(t,e,i){var n=t.x,r=t.y,a=t.x2,o=t.y2,s=t.centerX,l=t.centerY,u=Math.atan2(o-r,a-n),h=C(e.controlPoint,0);return et({x:s+O(i,h.x,!1),y:l+O(i,h.y,!1)},{x:s,y:l},u)}(l,e,(0,c.aE)(u,h))}var d=function(t,e,i){var n=i.borderWidth,r=(0,c.E)(i.padding),a=j(t.ctx,i),o=a.width+r.width+n,s=a.height+r.height+n;return function(t,e,i,n){var r=i.width,a=i.height,o=i.padding,s=e.xAdjust,l=e.yAdjust,u={x:t.x,y:t.y},h={x:t.x2,y:t.y2},d="auto"===e.rotation?function(t){var e=t.x,i=t.y,n=t.x2,r=t.y2,a=Math.atan2(r-i,n-e);return a>c.P/2?a-c.P:ao&&(r=xt(o,{x:n,y:r},e),n=o),rs&&(n=bt(s,{x:n,y:r},e),r=s),{x:n,y:r}}function Dt(t,e,i,n){var r=e.mouseX,a=e.mouseY,o=t.label;return o.options.display&&o.inRange(r,a,n,i)}function At(t,e,i,n){var r=e.labelSize,a=e.padding,o=t.w*n.dx,s=t.h*n.dy,l=o>0&&(r.w/2+a.left-n.x)/o,u=s>0&&(r.h/2+a.top-n.y)/s;return y(Math.max(l,u),0,.25)}function Tt(t,e){var i=e.size,n=e.min,r=e.max,a=e.padding,o=i/2;return i>r-n?(r+n)/2:(n>=t-a-o&&(t=n+a+o),r<=t+a+o&&(t=r-a-o),t)}function Et(t){var e=t.options,i=e.arrowHeads&&e.arrowHeads.start,n=e.arrowHeads&&e.arrowHeads.end;return{startOpts:i,endOpts:n,startAdjust:Zt(t,i),endAdjust:Zt(t,n)}}function Zt(t,e){if(!e||!e.display)return 0;var i=e.length,n=e.width,r=t.options.borderWidth/2,a={x:i,y:n+r},o={x:0,y:r};return Math.abs(bt(0,a,o))}function Lt(t,e,i,n){if(n&&n.display){var r=n.length,a=n.width,o=n.fill,s=n.backgroundColor,l=n.borderColor,u=Math.abs(e-r)+i;t.beginPath(),z(t,n),F(t,n),t.moveTo(u,-a),t.lineTo(e+i,0),t.lineTo(u,a),!0===o?(t.fillStyle=s||l,t.closePath(),t.fill(),t.shadowColor="transparent"):t.shadowColor=n.borderShadowColor,t.stroke()}}function Rt(t,e,i,n){var r=e.x,a=e.y,o=i.angle,s=i.adjust;n&&n.display&&(t.save(),t.translate(r,a),t.rotate(o),Lt(t,0,-s,n),t.restore())}Pt.defaults={adjustScaleRange:!0,arrowHeads:{display:!1,end:Object.assign({},Ot),fill:!1,length:12,start:Object.assign({},Ot),width:6},borderDash:[],borderDashOffset:0,borderShadowColor:"transparent",borderWidth:2,curve:!1,controlPoint:{y:"-50%"},display:!0,endValue:void 0,init:void 0,label:{backgroundColor:"rgba(0,0,0,0.8)",backgroundShadowColor:"transparent",borderCapStyle:"butt",borderColor:"black",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",borderRadius:6,borderShadowColor:"transparent",borderWidth:0,callout:Object.assign({},pt.defaults.callout),color:"#fff",content:null,display:!1,drawTime:void 0,font:{family:void 0,lineHeight:void 0,size:void 0,style:void 0,weight:"bold"},height:void 0,opacity:void 0,padding:6,position:"center",rotation:0,shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,textAlign:"center",textStrokeColor:void 0,textStrokeWidth:0,width:void 0,xAdjust:0,yAdjust:0,z:void 0},scaleID:void 0,shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,value:void 0,xMax:void 0,xMin:void 0,xScaleID:void 0,yMax:void 0,yMin:void 0,yScaleID:void 0,z:0},Pt.descriptors={arrowHeads:{start:{_fallback:!0},end:{_fallback:!0},_fallback:!0}},Pt.defaultRoutes={borderColor:"color"};var It=function(t){(0,s.Z)(i,t);var e=(0,l.Z)(i);function i(){return(0,a.Z)(this,i),e.apply(this,arguments)}return(0,o.Z)(i,[{key:"inRange",value:function(t,e,i,n){var r=this.options.rotation,a=this.options.borderWidth;if("x"!==i&&"y"!==i)return function(t,e,i,n){var r=e.width,a=e.height,o=e.centerX,s=e.centerY,l=r/2,u=a/2;if(l<=0||u<=0)return!1;var h=(0,c.t)(i||0),d=n/2||0,f=Math.cos(h),v=Math.sin(h),g=Math.pow(f*(t.x-o)+v*(t.y-s),2),p=Math.pow(v*(t.x-o)-f*(t.y-s),2);return g/Math.pow(l+d,2)+p/Math.pow(u+d,2)<=1.0001}({x:t,y:e},this.getProps(["width","height","centerX","centerY"],n),r,a);var o=this.getProps(["x","y","x2","y2"],n),s=o.x,l=o.y,u=o.x2,h=o.y2,d=a/2,f="y"===i?{start:l,end:h}:{start:s,end:u},v=et({x:t,y:e},this.getCenterPoint(n),(0,c.t)(-r));return v[i]>=f.start-d-p&&v[i]<=f.end+d+p}},{key:"getCenterPoint",value:function(t){return x(this,t)}},{key:"draw",value:function(t){var e=this.width,i=this.height,n=this.centerX,r=this.centerY,a=this.options;t.save(),I(t,this.getCenterPoint(),a.rotation),z(t,this.options),t.beginPath(),t.fillStyle=a.backgroundColor;var o=F(t,a);t.ellipse(n,r,i/2,e/2,c.P/2,0,2*c.P),t.fill(),o&&(t.shadowColor=a.borderShadowColor,t.stroke()),t.restore()}},{key:"label",get:function(){return this.elements&&this.elements[0]}},{key:"resolveElementProperties",value:function(t,e){return q(t,e)}}]),i}(h.W_);It.id="ellipseAnnotation",It.defaults={adjustScaleRange:!0,backgroundShadowColor:"transparent",borderDash:[],borderDashOffset:0,borderShadowColor:"transparent",borderWidth:1,display:!0,init:void 0,label:Object.assign({},vt.defaults.label),rotation:0,shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,xMax:void 0,xMin:void 0,xScaleID:void 0,yMax:void 0,yMin:void 0,yScaleID:void 0,z:0},It.defaultRoutes={borderColor:"color",backgroundColor:"color"},It.descriptors={label:{_fallback:!0}};var Ft=function(t){(0,s.Z)(i,t);var e=(0,l.Z)(i);function i(){return(0,a.Z)(this,i),e.apply(this,arguments)}return(0,o.Z)(i,[{key:"inRange",value:function(t,e,i,n){var r=this.getProps(["x","y","x2","y2","width"],n),a=r.x,o=r.y,s=r.x2,l=r.y2,u=r.width,h=this.options.borderWidth;if("x"!==i&&"y"!==i)return function(t,e,i,n){if(!t||!e||i<=0)return!1;var r=n/2;return Math.pow(t.x-e.x,2)+Math.pow(t.y-e.y,2)<=Math.pow(i+r,2)}({x:t,y:e},this.getCenterPoint(n),u/2,h);var c=h/2,d="y"===i?{start:o,end:l,value:e}:{start:a,end:s,value:t};return d.value>=d.start-c&&d.value<=d.end+c}},{key:"getCenterPoint",value:function(t){return x(this,t)}},{key:"draw",value:function(t){var e=this.options,i=e.borderWidth;if(!(e.radius<.1)){t.save(),t.fillStyle=e.backgroundColor,z(t,e);var n=F(t,e);N(t,this,this.centerX,this.centerY),n&&!R(e.pointStyle)&&(t.shadowColor=e.borderShadowColor,t.stroke()),t.restore(),e.borderWidth=i}}},{key:"resolveElementProperties",value:function(t,e){var i=K(t,e);return i.initProperties=A(t,i,e),i}}]),i}(h.W_);Ft.id="pointAnnotation",Ft.defaults={adjustScaleRange:!0,backgroundShadowColor:"transparent",borderDash:[],borderDashOffset:0,borderShadowColor:"transparent",borderWidth:1,display:!0,init:void 0,pointStyle:"circle",radius:10,rotation:0,shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,xAdjust:0,xMax:void 0,xMin:void 0,xScaleID:void 0,xValue:void 0,yAdjust:0,yMax:void 0,yMin:void 0,yScaleID:void 0,yValue:void 0,z:0},Ft.defaultRoutes={borderColor:"color",backgroundColor:"color"};var zt=function(t){(0,s.Z)(i,t);var e=(0,l.Z)(i);function i(){return(0,a.Z)(this,i),e.apply(this,arguments)}return(0,o.Z)(i,[{key:"inRange",value:function(t,e,i,r){if("x"!==i&&"y"!==i)return this.options.radius>=.1&&this.elements.length>1&&function(t,e,i,n){var r,a=!1,o=t[t.length-1].getProps(["bX","bY"],n),s=(0,u.Z)(t);try{for(s.s();!(r=s.n()).done;){var l=r.value.getProps(["bX","bY"],n);l.bY>i!==o.bY>i&&e<(o.bX-l.bX)*(i-l.bY)/(o.bY-l.bY)+l.bX&&(a=!a),o=l}}catch(h){s.e(h)}finally{s.f()}return a}(this.elements,t,e,r);var a=et({x:t,y:e},this.getCenterPoint(r),(0,c.t)(-this.options.rotation)),o=this.elements.map((function(t){return"y"===i?t.bY:t.bX})),s=Math.min.apply(Math,(0,n.Z)(o)),l=Math.max.apply(Math,(0,n.Z)(o));return a[i]>=s&&a[i]<=l}},{key:"getCenterPoint",value:function(t){return x(this,t)}},{key:"draw",value:function(t){var e=this.elements,i=this.options;t.save(),t.beginPath(),t.fillStyle=i.backgroundColor,z(t,i);var n,r=F(t,i),a=!0,o=(0,u.Z)(e);try{for(o.s();!(n=o.n()).done;){var s=n.value;a?(t.moveTo(s.x,s.y),a=!1):t.lineTo(s.x,s.y)}}catch(l){o.e(l)}finally{o.f()}t.closePath(),t.fill(),r&&(t.shadowColor=i.borderShadowColor,t.stroke()),t.restore()}},{key:"resolveElementProperties",value:function(t,e){for(var i=K(t,e),n=e.sides,r=e.rotation,a=[],o=2*c.P/n,s=r*c.b3,l=0;l0&&void 0!==arguments[0]?arguments[0]:"line";return Wt[t]?t:(console.warn("Unknown annotation type: '".concat(t,"', defaulting to 'line'")),"line")}function Xt(t,e,i,r){for(var a=function(t,e,i){if("reset"===i||"none"===i||"resize"===i)return Vt;return new h.FK(t,e)}(t,i.animations,r),o=e.annotations,s=function(t,e){var i=e.length,r=t.length;if(ri&&t.splice(i,r-i);return t}(e.elements,o),l=0;l3&&void 0!==arguments[3])||arguments[3],a=i.split("."),o=0,s=(0,u.Z)(e.split("."));try{for(s.s();!(n=s.n()).done;){var l=n.value,h=a[o++];if(parseInt(l,10)=0||(r[i]=t[i]);return r}(t,e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,i)&&(r[i]=t[i])}return r}i.d(e,{x1:function(){return p}});var r=i(1413),a=i(2791),o=i(3644),s=["height","width","redraw","datasetIdKey","type","data","options","plugins","fallbackContent","updateMode"],l="label";function u(t,e){"function"===typeof t?t(e):t&&(t.current=e)}function h(t,e){t.labels=e}function c(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:l,n=[];t.datasets=e.map((function(e){var a=t.datasets.find((function(t){return t[i]===e[i]}));return a&&e.data&&!n.includes(a)?(n.push(a),Object.assign(a,e),a):(0,r.Z)({},e)}))}function d(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:l,i={labels:[],datasets:[]};return h(i,t.labels),c(i,t.datasets,e),i}function f(t,e){var i=t.height,l=void 0===i?150:i,f=t.width,v=void 0===f?300:f,g=t.redraw,p=void 0!==g&&g,y=t.datasetIdKey,m=t.type,b=t.data,x=t.options,k=t.plugins,_=void 0===k?[]:k,w=t.fallbackContent,M=t.updateMode,S=n(t,s),P=(0,a.useRef)(null),O=(0,a.useRef)(),C=function(){P.current&&(O.current=new o.kL(P.current,{type:m,data:d(b,y),options:x&&(0,r.Z)({},x),plugins:_}),u(e,O.current))},D=function(){u(e,null),O.current&&(O.current.destroy(),O.current=null)};return(0,a.useEffect)((function(){!p&&O.current&&x&&function(t,e){var i=t.options;i&&e&&Object.assign(i,e)}(O.current,x)}),[p,x]),(0,a.useEffect)((function(){!p&&O.current&&h(O.current.config.data,b.labels)}),[p,b.labels]),(0,a.useEffect)((function(){!p&&O.current&&b.datasets&&c(O.current.config.data,b.datasets,y)}),[p,b.datasets]),(0,a.useEffect)((function(){O.current&&(p?(D(),setTimeout(C)):O.current.update(M))}),[p,x,b.labels,b.datasets,M]),(0,a.useEffect)((function(){O.current&&(D(),setTimeout(C))}),[m]),(0,a.useEffect)((function(){return C(),function(){return D()}}),[]),a.createElement("canvas",Object.assign({ref:P,role:"img",height:l,width:v},S),w)}var v=(0,a.forwardRef)(f);function g(t,e){return o.kL.register(e),(0,a.forwardRef)((function(e,i){return a.createElement(v,Object.assign({},e,{ref:i,type:t}))}))}var p=g("line",o.ST);o.vn,o.Xi,o.jI,o.CV,o.N0,o.tt,o.ho}}]); -//# sourceMappingURL=410.2838bd24.chunk.js.map \ No newline at end of file diff --git a/static/js/410.2838bd24.chunk.js.map b/static/js/410.2838bd24.chunk.js.map deleted file mode 100644 index 5d613bd..0000000 --- a/static/js/410.2838bd24.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"static/js/410.2838bd24.chunk.js","mappings":"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","sources":["../node_modules/react-hotkeys-hook/src/parseHotkeys.ts","../node_modules/react-hotkeys-hook/src/isHotkeyPressed.ts","../node_modules/react-hotkeys-hook/src/validators.ts","../node_modules/react-hotkeys-hook/src/BoundHotkeysProxyProvider.tsx","../node_modules/react-hotkeys-hook/src/deepEqual.ts","../node_modules/react-hotkeys-hook/src/HotkeysProvider.tsx","../node_modules/react-hotkeys-hook/src/useHotkeys.ts","../node_modules/react-hotkeys-hook/src/useDeepEqualMemo.ts","../node_modules/@babel/runtime/helpers/esm/defineProperty.js","../node_modules/@babel/runtime/helpers/esm/objectSpread2.js","../node_modules/@babel/runtime/helpers/esm/get.js","../node_modules/@babel/runtime/helpers/esm/superPropBase.js","../node_modules/chart.js/src/core/core.animator.js","../node_modules/chart.js/src/core/core.animation.js","../node_modules/chart.js/src/core/core.animations.js","../node_modules/chart.js/src/core/core.datasetController.js","../node_modules/chart.js/src/controllers/controller.bar.js","../node_modules/chart.js/src/controllers/controller.bubble.js","../node_modules/chart.js/src/controllers/controller.doughnut.js","../node_modules/chart.js/src/controllers/controller.line.js","../node_modules/chart.js/src/controllers/controller.polarArea.js","../node_modules/chart.js/src/controllers/controller.pie.js","../node_modules/chart.js/src/controllers/controller.radar.js","../node_modules/chart.js/src/controllers/controller.scatter.js","../node_modules/chart.js/src/core/core.adapters.ts","../node_modules/chart.js/src/core/core.interaction.js","../node_modules/chart.js/src/core/core.layouts.js","../node_modules/chart.js/src/platform/platform.base.js","../node_modules/chart.js/src/platform/platform.basic.js","../node_modules/chart.js/src/platform/platform.dom.js","../node_modules/chart.js/src/platform/index.js","../node_modules/chart.js/src/core/core.element.ts","../node_modules/chart.js/src/core/core.scale.autoskip.js","../node_modules/chart.js/src/core/core.scale.js","../node_modules/chart.js/src/core/core.typedRegistry.js","../node_modules/chart.js/src/core/core.registry.js","../node_modules/chart.js/src/core/core.plugins.js","../node_modules/chart.js/src/core/core.config.js","../node_modules/chart.js/src/core/core.controller.js","../node_modules/chart.js/src/elements/element.arc.ts","../node_modules/chart.js/src/elements/element.line.js","../node_modules/chart.js/src/elements/element.point.ts","../node_modules/chart.js/src/elements/element.bar.js","../node_modules/chart.js/src/plugins/plugin.filler/index.js","../node_modules/chart.js/src/plugins/plugin.legend.js","../node_modules/chart.js/src/plugins/plugin.subtitle.js","../node_modules/chart.js/src/plugins/plugin.title.js","../node_modules/chart.js/src/plugins/plugin.tooltip.js","../node_modules/chart.js/src/scales/scale.category.js","../node_modules/chart.js/src/scales/scale.linearbase.js","../node_modules/chart.js/src/scales/scale.linear.js","../node_modules/chart.js/src/scales/scale.logarithmic.js","../node_modules/chart.js/src/scales/scale.radialLinear.js","../node_modules/chart.js/src/scales/scale.time.js","../node_modules/chart.js/src/scales/scale.timeseries.js","../node_modules/@kurkle/color/dist/color.esm.js","../node_modules/chart.js/src/helpers/helpers.core.ts","../node_modules/chart.js/src/helpers/helpers.math.ts","../node_modules/chart.js/src/helpers/helpers.collection.ts","../node_modules/chart.js/src/helpers/helpers.extras.ts","../node_modules/chart.js/src/helpers/helpers.easing.ts","../node_modules/chart.js/src/helpers/helpers.color.ts","../node_modules/chart.js/src/core/core.animations.defaults.js","../node_modules/chart.js/src/helpers/helpers.intl.ts","../node_modules/chart.js/src/core/core.ticks.js","../node_modules/chart.js/src/core/core.defaults.js","../node_modules/chart.js/src/core/core.layouts.defaults.js","../node_modules/chart.js/src/core/core.scale.defaults.js","../node_modules/chart.js/src/helpers/helpers.canvas.ts","../node_modules/chart.js/src/helpers/helpers.options.ts","../node_modules/chart.js/src/helpers/helpers.config.ts","../node_modules/chart.js/src/helpers/helpers.curve.ts","../node_modules/chart.js/src/helpers/helpers.dom.ts","../node_modules/chart.js/src/helpers/helpers.interpolation.ts","../node_modules/chart.js/src/helpers/helpers.rtl.ts","../node_modules/chart.js/src/helpers/helpers.segment.js","../node_modules/chartjs-plugin-annotation/dist/chartjs-plugin-annotation.esm.js","../node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js","../node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","../node_modules/react-chartjs-2/src/utils.ts","../node_modules/react-chartjs-2/src/chart.tsx","../node_modules/react-chartjs-2/src/typedCharts.tsx"],"sourcesContent":["import { Hotkey, KeyboardModifiers } from './types'\n\nconst reservedModifierKeywords = ['shift', 'alt', 'meta', 'mod', 'ctrl']\n\nconst mappedKeys: Record = {\n esc: 'escape',\n return: 'enter',\n '.': 'period',\n ',': 'comma',\n '-': 'slash',\n ' ': 'space',\n '`': 'backquote',\n '#': 'backslash',\n '+': 'bracketright',\n ShiftLeft: 'shift',\n ShiftRight: 'shift',\n AltLeft: 'alt',\n AltRight: 'alt',\n MetaLeft: 'meta',\n MetaRight: 'meta',\n OSLeft: 'meta',\n OSRight: 'meta',\n ControlLeft: 'ctrl',\n ControlRight: 'ctrl',\n}\n\nexport function mapKey(key: string): string {\n return (mappedKeys[key] || key)\n .trim()\n .toLowerCase()\n .replace(/key|digit|numpad|arrow/, '')\n}\n\nexport function isHotkeyModifier(key: string) {\n return reservedModifierKeywords.includes(key)\n}\n\nexport function parseKeysHookInput(keys: string, splitKey = ','): string[] {\n return keys.split(splitKey)\n}\n\nexport function parseHotkey(hotkey: string, combinationKey = '+', description?: string): Hotkey {\n const keys = hotkey\n .toLocaleLowerCase()\n .split(combinationKey)\n .map((k) => mapKey(k))\n\n const modifiers: KeyboardModifiers = {\n alt: keys.includes('alt'),\n ctrl: keys.includes('ctrl') || keys.includes('control'),\n shift: keys.includes('shift'),\n meta: keys.includes('meta'),\n mod: keys.includes('mod'),\n }\n\n const singleCharKeys = keys.filter((k) => !reservedModifierKeywords.includes(k))\n\n return {\n ...modifiers,\n keys: singleCharKeys,\n description,\n }\n}\n","import { isHotkeyModifier, mapKey } from './parseHotkeys'\n;(() => {\n if (typeof document !== 'undefined') {\n document.addEventListener('keydown', (e) => {\n if (e.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n pushToCurrentlyPressedKeys([mapKey(e.key), mapKey(e.code)])\n })\n\n document.addEventListener('keyup', (e) => {\n if (e.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n removeFromCurrentlyPressedKeys([mapKey(e.key), mapKey(e.code)])\n })\n }\n\n if (typeof window !== 'undefined') {\n window.addEventListener('blur', () => {\n currentlyPressedKeys.clear()\n })\n }\n})()\n\nconst currentlyPressedKeys: Set = new Set()\n\n// https://github.com/microsoft/TypeScript/issues/17002\nexport function isReadonlyArray(value: unknown): value is readonly unknown[] {\n return Array.isArray(value)\n}\n\nexport function isHotkeyPressed(key: string | readonly string[], splitKey = ','): boolean {\n const hotkeyArray = isReadonlyArray(key) ? key : key.split(splitKey)\n\n return hotkeyArray.every((hotkey) => currentlyPressedKeys.has(hotkey.trim().toLowerCase()))\n}\n\nexport function pushToCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n /*\n Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.\n https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser\n Otherwise the set will hold all ever pressed keys while the meta key is down which leads to wrong results.\n */\n if (currentlyPressedKeys.has('meta')) {\n currentlyPressedKeys.forEach((key) => !isHotkeyModifier(key) && currentlyPressedKeys.delete(key.toLowerCase()))\n }\n\n hotkeyArray.forEach((hotkey) => currentlyPressedKeys.add(hotkey.toLowerCase()))\n}\n\nexport function removeFromCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n /*\n Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.\n https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser\n Otherwise the set will hold all ever pressed keys while the meta key is down which leads to wrong results.\n */\n if (key === 'meta') {\n currentlyPressedKeys.clear()\n } else {\n hotkeyArray.forEach((hotkey) => currentlyPressedKeys.delete(hotkey.toLowerCase()))\n }\n}\n","import { FormTags, Hotkey, Scopes, Trigger } from './types'\nimport { isHotkeyPressed, isReadonlyArray } from './isHotkeyPressed'\nimport { mapKey } from './parseHotkeys'\n\nexport function maybePreventDefault(e: KeyboardEvent, hotkey: Hotkey, preventDefault?: Trigger): void {\n if ((typeof preventDefault === 'function' && preventDefault(e, hotkey)) || preventDefault === true) {\n e.preventDefault()\n }\n}\n\nexport function isHotkeyEnabled(e: KeyboardEvent, hotkey: Hotkey, enabled?: Trigger): boolean {\n if (typeof enabled === 'function') {\n return enabled(e, hotkey)\n }\n\n return enabled === true || enabled === undefined\n}\n\nexport function isKeyboardEventTriggeredByInput(ev: KeyboardEvent): boolean {\n return isHotkeyEnabledOnTag(ev, ['input', 'textarea', 'select'])\n}\n\nexport function isHotkeyEnabledOnTag(\n { target }: KeyboardEvent,\n enabledOnTags: readonly FormTags[] | boolean = false\n): boolean {\n const targetTagName = target && (target as HTMLElement).tagName\n\n if (isReadonlyArray(enabledOnTags)) {\n return Boolean(\n targetTagName && enabledOnTags && enabledOnTags.some((tag) => tag.toLowerCase() === targetTagName.toLowerCase())\n )\n }\n\n return Boolean(targetTagName && enabledOnTags && enabledOnTags === true)\n}\n\nexport function isScopeActive(activeScopes: string[], scopes?: Scopes): boolean {\n if (activeScopes.length === 0 && scopes) {\n console.warn(\n 'A hotkey has the \"scopes\" option set, however no active scopes were found. If you want to use the global scopes feature, you need to wrap your app in a '\n )\n\n return true\n }\n\n if (!scopes) {\n return true\n }\n\n return activeScopes.some((scope) => scopes.includes(scope)) || activeScopes.includes('*')\n}\n\nexport const isHotkeyMatchingKeyboardEvent = (e: KeyboardEvent, hotkey: Hotkey, ignoreModifiers = false): boolean => {\n const { alt, meta, mod, shift, ctrl, keys } = hotkey\n const { key: pressedKeyUppercase, code, ctrlKey, metaKey, shiftKey, altKey } = e\n\n const keyCode = mapKey(code)\n const pressedKey = pressedKeyUppercase.toLowerCase()\n\n if (!ignoreModifiers) {\n // We check the pressed keys for compatibility with the keyup event. In keyup events the modifier flags are not set.\n if (alt === !altKey && pressedKey !== 'alt') {\n return false\n }\n\n if (shift === !shiftKey && pressedKey !== 'shift') {\n return false\n }\n\n // Mod is a special key name that is checking for meta on macOS and ctrl on other platforms\n if (mod) {\n if (!metaKey && !ctrlKey) {\n return false\n }\n } else {\n if (meta === !metaKey && pressedKey !== 'meta' && pressedKey !== 'os') {\n return false\n }\n\n if (ctrl === !ctrlKey && pressedKey !== 'ctrl' && pressedKey !== 'control') {\n return false\n }\n }\n }\n\n // All modifiers are correct, now check the key\n // If the key is set, we check for the key\n if (keys && keys.length === 1 && (keys.includes(pressedKey) || keys.includes(keyCode))) {\n return true\n } else if (keys) {\n // Check if all keys are present in pressedDownKeys set\n return isHotkeyPressed(keys)\n } else if (!keys) {\n // If the key is not set, we only listen for modifiers, that check went alright, so we return true\n return true\n }\n\n // There is nothing that matches.\n return false\n}\n","import { createContext, ReactNode, useContext } from 'react'\nimport { Hotkey } from './types'\n\ntype BoundHotkeysProxyProviderType = {\n addHotkey: (hotkey: Hotkey) => void\n removeHotkey: (hotkey: Hotkey) => void\n}\n\nconst BoundHotkeysProxyProvider = createContext(undefined)\n\nexport const useBoundHotkeysProxy = () => {\n return useContext(BoundHotkeysProxyProvider)\n}\n\ninterface Props {\n children: ReactNode\n addHotkey: (hotkey: Hotkey) => void\n removeHotkey: (hotkey: Hotkey) => void\n}\n\nexport default function BoundHotkeysProxyProviderProvider({ addHotkey, removeHotkey, children }: Props) {\n return (\n \n {children}\n \n )\n}\n","export default function deepEqual(x: any, y: any): boolean {\n //@ts-ignore\n return x && y && typeof x === 'object' && typeof y === 'object'\n ? Object.keys(x).length === Object.keys(y).length &&\n //@ts-ignore\n Object.keys(x).reduce((isEqual, key) => isEqual && deepEqual(x[key], y[key]), true)\n : x === y\n}\n","import { Hotkey } from './types'\nimport { createContext, ReactNode, useState, useContext, useCallback } from 'react'\nimport BoundHotkeysProxyProviderProvider from './BoundHotkeysProxyProvider'\nimport deepEqual from './deepEqual'\n\nexport type HotkeysContextType = {\n hotkeys: ReadonlyArray\n enabledScopes: string[]\n toggleScope: (scope: string) => void\n enableScope: (scope: string) => void\n disableScope: (scope: string) => void\n}\n\n// The context is only needed for special features like global scoping, so we use a graceful default fallback\nconst HotkeysContext = createContext({\n hotkeys: [],\n enabledScopes: [], // This array has to be empty instead of containing '*' as default, to check if the provider is set or not\n toggleScope: () => {},\n enableScope: () => {},\n disableScope: () => {},\n})\n\nexport const useHotkeysContext = () => {\n return useContext(HotkeysContext)\n}\n\ninterface Props {\n initiallyActiveScopes?: string[]\n children: ReactNode\n}\n\nexport const HotkeysProvider = ({ initiallyActiveScopes = ['*'], children }: Props) => {\n const [internalActiveScopes, setInternalActiveScopes] = useState(\n initiallyActiveScopes?.length > 0 ? initiallyActiveScopes : ['*']\n )\n const [boundHotkeys, setBoundHotkeys] = useState([])\n\n const enableScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.includes('*')) {\n return [scope]\n }\n\n return Array.from(new Set([...prev, scope]))\n })\n }, [])\n\n const disableScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.filter((s) => s !== scope).length === 0) {\n return ['*']\n } else {\n return prev.filter((s) => s !== scope)\n }\n })\n }, [])\n\n const toggleScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.includes(scope)) {\n if (prev.filter((s) => s !== scope).length === 0) {\n return ['*']\n } else {\n return prev.filter((s) => s !== scope)\n }\n } else {\n if (prev.includes('*')) {\n return [scope]\n }\n\n return Array.from(new Set([...prev, scope]))\n }\n })\n }, [])\n\n const addBoundHotkey = useCallback((hotkey: Hotkey) => {\n setBoundHotkeys((prev) => [...prev, hotkey])\n }, [])\n\n const removeBoundHotkey = useCallback((hotkey: Hotkey) => {\n setBoundHotkeys((prev) => prev.filter((h) => !deepEqual(h, hotkey)))\n }, [])\n\n return (\n \n \n {children}\n \n \n )\n}\n","import { HotkeyCallback, Keys, Options, OptionsOrDependencyArray, RefType } from './types'\nimport { DependencyList, useCallback, useEffect, useLayoutEffect, useRef } from 'react'\nimport { mapKey, parseHotkey, parseKeysHookInput } from './parseHotkeys'\nimport {\n isHotkeyEnabled,\n isHotkeyEnabledOnTag,\n isHotkeyMatchingKeyboardEvent,\n isKeyboardEventTriggeredByInput,\n isScopeActive,\n maybePreventDefault,\n} from './validators'\nimport { useHotkeysContext } from './HotkeysProvider'\nimport { useBoundHotkeysProxy } from './BoundHotkeysProxyProvider'\nimport useDeepEqualMemo from './useDeepEqualMemo'\nimport { isReadonlyArray, pushToCurrentlyPressedKeys, removeFromCurrentlyPressedKeys } from './isHotkeyPressed'\n\nconst stopPropagation = (e: KeyboardEvent): void => {\n e.stopPropagation()\n e.preventDefault()\n e.stopImmediatePropagation()\n}\n\nconst useSafeLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect\n\nexport default function useHotkeys(\n keys: Keys,\n callback: HotkeyCallback,\n options?: OptionsOrDependencyArray,\n dependencies?: OptionsOrDependencyArray\n) {\n const ref = useRef>(null)\n const hasTriggeredRef = useRef(false)\n\n const _options: Options | undefined = !(options instanceof Array)\n ? (options as Options)\n : !(dependencies instanceof Array)\n ? (dependencies as Options)\n : undefined\n const _keys: string = isReadonlyArray(keys) ? keys.join(_options?.splitKey) : keys\n const _deps: DependencyList | undefined =\n options instanceof Array ? options : dependencies instanceof Array ? dependencies : undefined\n\n const memoisedCB = useCallback(callback, _deps ?? [])\n const cbRef = useRef(memoisedCB)\n\n if (_deps) {\n cbRef.current = memoisedCB\n } else {\n cbRef.current = callback\n }\n\n const memoisedOptions = useDeepEqualMemo(_options)\n\n const { enabledScopes } = useHotkeysContext()\n const proxy = useBoundHotkeysProxy()\n\n useSafeLayoutEffect(() => {\n if (memoisedOptions?.enabled === false || !isScopeActive(enabledScopes, memoisedOptions?.scopes)) {\n return\n }\n\n const listener = (e: KeyboardEvent, isKeyUp = false) => {\n if (isKeyboardEventTriggeredByInput(e) && !isHotkeyEnabledOnTag(e, memoisedOptions?.enableOnFormTags)) {\n return\n }\n\n if (memoisedOptions?.ignoreEventWhen?.(e)) {\n return\n }\n\n // TODO: SINCE THE EVENT IS NOW ATTACHED TO THE REF, THE ACTIVE ELEMENT CAN NEVER BE INSIDE THE REF. THE HOTKEY ONLY TRIGGERS IF THE\n // REF IS THE ACTIVE ELEMENT. THIS IS A PROBLEM SINCE FOCUSED SUB COMPONENTS WON'T TRIGGER THE HOTKEY.\n if (\n ref.current !== null &&\n document.activeElement !== ref.current &&\n !ref.current.contains(document.activeElement)\n ) {\n stopPropagation(e)\n\n return\n }\n\n if ((e.target as HTMLElement)?.isContentEditable && !memoisedOptions?.enableOnContentEditable) {\n return\n }\n\n parseKeysHookInput(_keys, memoisedOptions?.splitKey).forEach((key) => {\n const hotkey = parseHotkey(key, memoisedOptions?.combinationKey)\n\n if (isHotkeyMatchingKeyboardEvent(e, hotkey, memoisedOptions?.ignoreModifiers) || hotkey.keys?.includes('*')) {\n if (isKeyUp && hasTriggeredRef.current) {\n return\n }\n\n maybePreventDefault(e, hotkey, memoisedOptions?.preventDefault)\n\n if (!isHotkeyEnabled(e, hotkey, memoisedOptions?.enabled)) {\n stopPropagation(e)\n\n return\n }\n\n // Execute the user callback for that hotkey\n cbRef.current(e, hotkey)\n\n if (!isKeyUp) {\n hasTriggeredRef.current = true\n }\n }\n })\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n pushToCurrentlyPressedKeys(mapKey(event.code))\n\n if ((memoisedOptions?.keydown === undefined && memoisedOptions?.keyup !== true) || memoisedOptions?.keydown) {\n listener(event)\n }\n }\n\n const handleKeyUp = (event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n removeFromCurrentlyPressedKeys(mapKey(event.code))\n\n hasTriggeredRef.current = false\n\n if (memoisedOptions?.keyup) {\n listener(event, true)\n }\n }\n\n const domNode = ref.current || _options?.document || document\n\n // @ts-ignore\n domNode.addEventListener('keyup', handleKeyUp)\n // @ts-ignore\n domNode.addEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(_keys, memoisedOptions?.splitKey).forEach((key) =>\n proxy.addHotkey(parseHotkey(key, memoisedOptions?.combinationKey, memoisedOptions?.description))\n )\n }\n\n return () => {\n // @ts-ignore\n domNode.removeEventListener('keyup', handleKeyUp)\n // @ts-ignore\n domNode.removeEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(_keys, memoisedOptions?.splitKey).forEach((key) =>\n proxy.removeHotkey(parseHotkey(key, memoisedOptions?.combinationKey, memoisedOptions?.description))\n )\n }\n }\n }, [_keys, memoisedOptions, enabledScopes])\n\n return ref\n}\n","import { useRef } from 'react'\nimport deepEqual from './deepEqual'\n\nexport default function useDeepEqualMemo(value: T) {\n const ref = useRef(undefined)\n\n if (!deepEqual(ref.current, value)) {\n ref.current = value\n }\n\n return ref.current\n}\n","import toPropertyKey from \"./toPropertyKey.js\";\nexport default function _defineProperty(obj, key, value) {\n key = toPropertyKey(key);\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}","import defineProperty from \"./defineProperty.js\";\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n enumerableOnly && (symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n })), keys.push.apply(keys, symbols);\n }\n return keys;\n}\nexport default function _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = null != arguments[i] ? arguments[i] : {};\n i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {\n defineProperty(target, key, source[key]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n return target;\n}","import superPropBase from \"./superPropBase.js\";\nexport default function _get() {\n if (typeof Reflect !== \"undefined\" && Reflect.get) {\n _get = Reflect.get.bind();\n } else {\n _get = function _get(target, property, receiver) {\n var base = superPropBase(target, property);\n if (!base) return;\n var desc = Object.getOwnPropertyDescriptor(base, property);\n if (desc.get) {\n return desc.get.call(arguments.length < 3 ? target : receiver);\n }\n return desc.value;\n };\n }\n return _get.apply(this, arguments);\n}","import getPrototypeOf from \"./getPrototypeOf.js\";\nexport default function _superPropBase(object, property) {\n while (!Object.prototype.hasOwnProperty.call(object, property)) {\n object = getPrototypeOf(object);\n if (object === null) break;\n }\n return object;\n}","import {requestAnimFrame} from '../helpers/helpers.extras.js';\n\n/**\n * @typedef { import('./core.animation.js').default } Animation\n * @typedef { import('./core.controller.js').default } Chart\n */\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is export for typedoc\n */\nexport class Animator {\n constructor() {\n this._request = null;\n this._charts = new Map();\n this._running = false;\n this._lastDate = undefined;\n }\n\n /**\n\t * @private\n\t */\n _notify(chart, anims, date, type) {\n const callbacks = anims.listeners[type];\n const numSteps = anims.duration;\n\n callbacks.forEach(fn => fn({\n chart,\n initial: anims.initial,\n numSteps,\n currentStep: Math.min(date - anims.start, numSteps)\n }));\n }\n\n /**\n\t * @private\n\t */\n _refresh() {\n if (this._request) {\n return;\n }\n this._running = true;\n\n this._request = requestAnimFrame.call(window, () => {\n this._update();\n this._request = null;\n\n if (this._running) {\n this._refresh();\n }\n });\n }\n\n /**\n\t * @private\n\t */\n _update(date = Date.now()) {\n let remaining = 0;\n\n this._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\n for (; i >= 0; --i) {\n item = items[i];\n\n if (item._active) {\n if (item._total > anims.duration) {\n // if the animation has been updated and its duration prolonged,\n // update to total duration of current animations run (for progress event)\n anims.duration = item._total;\n }\n item.tick(date);\n draw = true;\n } else {\n // Remove the item by replacing it with last item and removing the last\n // A lot faster than splice.\n items[i] = items[items.length - 1];\n items.pop();\n }\n }\n\n if (draw) {\n chart.draw();\n this._notify(chart, anims, date, 'progress');\n }\n\n if (!items.length) {\n anims.running = false;\n this._notify(chart, anims, date, 'complete');\n anims.initial = false;\n }\n\n remaining += items.length;\n });\n\n this._lastDate = date;\n\n if (remaining === 0) {\n this._running = false;\n }\n }\n\n /**\n\t * @private\n\t */\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\n /**\n\t * @param {Chart} chart\n\t * @param {string} event - event name\n\t * @param {Function} cb - callback\n\t */\n listen(chart, event, cb) {\n this._getAnims(chart).listeners[event].push(cb);\n }\n\n /**\n\t * Add animations\n\t * @param {Chart} chart\n\t * @param {Animation[]} items - animations\n\t */\n add(chart, items) {\n if (!items || !items.length) {\n return;\n }\n this._getAnims(chart).items.push(...items);\n }\n\n /**\n\t * Counts number of active animations for the chart\n\t * @param {Chart} chart\n\t */\n has(chart) {\n return this._getAnims(chart).items.length > 0;\n }\n\n /**\n\t * Start animating (all charts)\n\t * @param {Chart} chart\n\t */\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\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\n /**\n\t * Stop all animations for the chart\n\t * @param {Chart} chart\n\t */\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\n for (; i >= 0; --i) {\n items[i].cancel();\n }\n anims.items = [];\n this._notify(chart, anims, Date.now(), 'complete');\n }\n\n /**\n\t * Remove chart from Animator\n\t * @param {Chart} chart\n\t */\n remove(chart) {\n return this._charts.delete(chart);\n }\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Animator();\n","import effects from '../helpers/helpers.easing.js';\nimport {resolve} from '../helpers/helpers.options.js';\nimport {color as helpersColor} from '../helpers/helpers.color.js';\n\nconst transparent = 'transparent';\nconst interpolators = {\n boolean(from, to, factor) {\n return factor > 0.5 ? to : from;\n },\n /**\n * @param {string} from\n * @param {string} to\n * @param {number} factor\n */\n color(from, to, factor) {\n const c0 = helpersColor(from || transparent);\n const c1 = c0.valid && helpersColor(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};\n\nexport default class Animation {\n constructor(cfg, target, prop, to) {\n const currentValue = target[prop];\n\n to = resolve([cfg.to, to, currentValue, cfg.from]);\n const from = resolve([cfg.from, currentValue, to]);\n\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\n active() {\n return this._active;\n }\n\n update(cfg, to, date) {\n if (this._active) {\n this._notify(false);\n\n const currentValue = this._target[this._prop];\n const elapsed = date - this._start;\n const remain = this._duration - elapsed;\n this._start = date;\n this._duration = Math.floor(Math.max(remain, cfg.duration));\n this._total += elapsed;\n this._loop = !!cfg.loop;\n this._to = resolve([cfg.to, to, currentValue, cfg.from]);\n this._from = resolve([cfg.from, currentValue, to]);\n }\n }\n\n cancel() {\n if (this._active) {\n // update current evaluated value, for smoother animations\n this.tick(Date.now());\n this._active = false;\n this._notify(false);\n }\n }\n\n tick(date) {\n const elapsed = date - this._start;\n const duration = this._duration;\n const prop = this._prop;\n const from = this._from;\n const loop = this._loop;\n const to = this._to;\n let factor;\n\n this._active = from !== to && (loop || (elapsed < duration));\n\n if (!this._active) {\n this._target[prop] = to;\n this._notify(true);\n return;\n }\n\n if (elapsed < 0) {\n this._target[prop] = from;\n return;\n }\n\n factor = (elapsed / duration) % 2;\n factor = loop && factor > 1 ? 2 - factor : factor;\n factor = this._easing(Math.min(1, Math.max(0, factor)));\n\n this._target[prop] = this._fn(from, to, factor);\n }\n\n wait() {\n const promises = this._promises || (this._promises = []);\n return new Promise((res, rej) => {\n promises.push({res, rej});\n });\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","import animator from './core.animator.js';\nimport Animation from './core.animation.js';\nimport defaults from './core.defaults.js';\nimport {isArray, isObject} from '../helpers/helpers.core.js';\n\nexport default class Animations {\n constructor(chart, config) {\n this._chart = chart;\n this._properties = new Map();\n this.configure(config);\n }\n\n configure(config) {\n if (!isObject(config)) {\n return;\n }\n\n const animationOptions = Object.keys(defaults.animation);\n const animatedProps = this._properties;\n\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\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\n /**\n\t * Utility to handle animation of `options`.\n\t * @private\n\t */\n _animateOptions(target, values) {\n const newOptions = values.options;\n const options = resolveTargetOptions(target, newOptions);\n if (!options) {\n return [];\n }\n\n const animations = this._createAnimations(options, newOptions);\n if (newOptions.$shared) {\n // Going to shared options:\n // After all animations are done, assign the shared options object to the element\n // So any new updates to the shared options are observed\n awaitAll(target.options.$animations, newOptions).then(() => {\n target.options = newOptions;\n }, () => {\n // rejected, noop\n });\n }\n\n return animations;\n }\n\n /**\n\t * @private\n\t */\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\n for (i = props.length - 1; i >= 0; --i) {\n const prop = props[i];\n if (prop.charAt(0) === '$') {\n continue;\n }\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\n if (animation) {\n if (cfg && animation.active()) {\n // There is an existing active animation, let's update that\n animation.update(cfg, value, date);\n continue;\n } else {\n animation.cancel();\n }\n }\n if (!cfg || !cfg.duration) {\n // not animated, set directly to new value\n target[prop] = value;\n continue;\n }\n\n running[prop] = animation = new Animation(cfg, target, prop, value);\n animations.push(animation);\n }\n return animations;\n }\n\n\n /**\n\t * Update `target` properties to new values, using configured animations\n\t * @param {object} target - object to update\n\t * @param {object} values - new target properties\n\t * @returns {boolean|undefined} - `true` if animations were started\n\t **/\n update(target, values) {\n if (this._properties.size === 0) {\n // Nothing is animated, just apply the new values.\n Object.assign(target, values);\n return;\n }\n\n const animations = this._createAnimations(target, values);\n\n if (animations.length) {\n animator.add(this._chart, animations);\n return true;\n }\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 // @ts-ignore\n return Promise.all(running);\n}\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 // Going from shared options to distinct one:\n // Create new options object containing the old shared values and start updating that.\n target.options = options = Object.assign({}, options, {$shared: false, $animations: {}});\n }\n return options;\n}\n","import Animations from './core.animations.js';\nimport defaults from './core.defaults.js';\nimport {isArray, isFinite, isObject, valueOrDefault, resolveObjectKey, defined} from '../helpers/helpers.core.js';\nimport {listenArrayEvents, unlistenArrayEvents} from '../helpers/helpers.collection.js';\nimport {createContext, sign} from '../helpers/index.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('./core.scale.js').default } Scale\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}\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\n return {\n top: y.end,\n right: x.end,\n bottom: y.start,\n left: x.start\n };\n}\n\nfunction toClip(value) {\n let t, r, b, l;\n\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\n return {\n top: t,\n right: r,\n bottom: b,\n left: l,\n disabled: value === false\n };\n}\n\nfunction getSortedDatasetIndices(chart, filterVisible) {\n const keys = [];\n const metasets = chart._getSortedDatasetMetas(filterVisible);\n let i, ilen;\n\n for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n keys.push(metasets[i].index);\n }\n return keys;\n}\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\n if (value === null) {\n return;\n }\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 (isFinite(otherValue) && (singleMode || (value === 0 || sign(value) === sign(otherValue)))) {\n value += otherValue;\n }\n }\n return value;\n}\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}\n\nfunction isStacked(scale, meta) {\n const stacked = scale && scale.options.stacked;\n return stacked || (stacked === undefined && meta.stack !== undefined);\n}\n\nfunction getStackKey(indexScale, valueScale, meta) {\n return `${indexScale.id}.${valueScale.id}.${meta.stack || meta.type}`;\n}\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}\n\nfunction getOrCreateStack(stacks, stackKey, indexValue) {\n const subStack = stacks[stackKey] || (stacks[stackKey] = {});\n return subStack[indexValue] || (subStack[indexValue] = {});\n}\n\nfunction getLastIndexInStack(stack, vScale, positive, type) {\n for (const meta of vScale.getMatchingVisibleMetas(type).reverse()) {\n const value = stack[meta.index];\n if ((positive && value > 0) || (!positive && value < 0)) {\n return meta.index;\n }\n }\n\n return null;\n}\n\nfunction updateStacks(controller, parsed) {\n const {chart, _cachedMeta: meta} = controller;\n const stacks = chart._stacks || (chart._stacks = {}); // map structure is {stackKey: {datasetIndex: value}}\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\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\n stack._top = getLastIndexInStack(stack, vScale, true, meta.type);\n stack._bottom = getLastIndexInStack(stack, vScale, false, meta.type);\n\n const visualValues = stack._visualValues || (stack._visualValues = {});\n visualValues[datasetIndex] = value;\n }\n}\n\nfunction getFirstScaleId(chart, axis) {\n const scales = chart.scales;\n return Object.keys(scales).filter(key => scales[key].axis === axis).shift();\n}\n\nfunction createDatasetContext(parent, index) {\n return createContext(parent,\n {\n active: false,\n dataset: undefined,\n datasetIndex: index,\n index,\n mode: 'default',\n type: 'dataset'\n }\n );\n}\n\nfunction createDataContext(parent, index, element) {\n return createContext(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}\n\nfunction clearStacks(meta, items) {\n // Not using meta.index here, because it might be already updated if the dataset changed location\n const datasetIndex = meta.controller.index;\n const axis = meta.vScale && meta.vScale.axis;\n if (!axis) {\n return;\n }\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 if (stacks[axis]._visualValues !== undefined && stacks[axis]._visualValues[datasetIndex] !== undefined) {\n delete stacks[axis]._visualValues[datasetIndex];\n }\n }\n}\n\nconst isDirectUpdateMode = (mode) => mode === 'reset' || mode === 'none';\nconst cloneIfNotShared = (cached, shared) => shared ? cached : Object.assign({}, cached);\nconst createStack = (canStack, meta, chart) => canStack && !meta.hidden && meta._stacked\n && {keys: getSortedDatasetIndices(chart, true), values: null};\n\nexport default class DatasetController {\n\n /**\n * @type {any}\n */\n static defaults = {};\n\n /**\n * Element type used to generate a meta dataset (e.g. Chart.element.LineElement).\n */\n static datasetElementType = null;\n\n /**\n * Element type used to generate a meta data (e.g. Chart.element.PointElement).\n */\n static dataElementType = null;\n\n /**\n\t * @param {Chart} chart\n\t * @param {number} datasetIndex\n\t */\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 /** @type {boolean | object} */\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.supportsDecimation = false;\n this.$context = undefined;\n this._syncList = [];\n this.datasetElementType = new.target.datasetElementType;\n this.dataElementType = new.target.dataElementType;\n\n this.initialize();\n }\n\n initialize() {\n const meta = this._cachedMeta;\n this.configure();\n this.linkScales();\n meta._stacked = isStacked(meta.vScale, meta);\n this.addElements();\n\n if (this.options.fill && !this.chart.isPluginEnabled('filler')) {\n console.warn(\"Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options\");\n }\n }\n\n updateIndex(datasetIndex) {\n if (this.index !== datasetIndex) {\n clearStacks(this._cachedMeta);\n }\n this.index = datasetIndex;\n }\n\n linkScales() {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n\n const chooseId = (axis, x, y, r) => axis === 'x' ? x : axis === 'r' ? r : y;\n\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 = this.getScaleForId(xid);\n meta.yScale = this.getScaleForId(yid);\n meta.rScale = this.getScaleForId(rid);\n meta.iScale = this.getScaleForId(iid);\n meta.vScale = this.getScaleForId(vid);\n }\n\n getDataset() {\n return this.chart.data.datasets[this.index];\n }\n\n getMeta() {\n return this.chart.getDatasetMeta(this.index);\n }\n\n /**\n\t * @param {string} scaleID\n\t * @return {Scale}\n\t */\n getScaleForId(scaleID) {\n return this.chart.scales[scaleID];\n }\n\n /**\n\t * @private\n\t */\n _getOtherScale(scale) {\n const meta = this._cachedMeta;\n return scale === meta.iScale\n ? meta.vScale\n : meta.iScale;\n }\n\n reset() {\n this._update('reset');\n }\n\n /**\n\t * @private\n\t */\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\n /**\n\t * @private\n\t */\n _dataCheck() {\n const dataset = this.getDataset();\n const data = dataset.data || (dataset.data = []);\n const _data = this._data;\n\n // In order to correctly handle data addition/deletion animation (and thus simulate\n // real-time charts), we need to monitor these data modifications and synchronize\n // the internal metadata accordingly.\n\n if (isObject(data)) {\n this._data = convertObjectDataToArray(data);\n } else if (_data !== data) {\n if (_data) {\n // This case happens when the user replaced the data array instance.\n unlistenArrayEvents(_data, this);\n // Discard old parsed data and stacks\n const meta = this._cachedMeta;\n clearStacks(meta);\n meta._parsed = [];\n }\n if (data && Object.isExtensible(data)) {\n listenArrayEvents(data, this);\n }\n this._syncList = [];\n this._data = data;\n }\n }\n\n addElements() {\n const meta = this._cachedMeta;\n\n this._dataCheck();\n\n if (this.datasetElementType) {\n meta.dataset = new this.datasetElementType();\n }\n }\n\n buildOrUpdateElements(resetNewElements) {\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n let stackChanged = false;\n\n this._dataCheck();\n\n // make sure cached _stacked status is current\n const oldStacked = meta._stacked;\n meta._stacked = isStacked(meta.vScale, meta);\n\n // detect change in stack option\n if (meta.stack !== dataset.stack) {\n stackChanged = true;\n // remove values from old stack\n clearStacks(meta);\n meta.stack = dataset.stack;\n }\n\n // Re-sync meta data in case the user replaced the data array or if we missed\n // any updates and so make sure that we handle number of datapoints changing.\n this._resyncElements(resetNewElements);\n\n // if stack changed, update stack values for the whole dataset\n if (stackChanged || oldStacked !== meta._stacked) {\n updateStacks(this, meta._parsed);\n }\n }\n\n /**\n\t * Merges user-supplied and default dataset-level options\n\t * @private\n\t */\n configure() {\n const config = this.chart.config;\n const scopeKeys = config.datasetScopeKeys(this._type);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys, true);\n this.options = config.createResolver(scopes, this.getContext());\n this._parsing = this.options.parsing;\n this._cachedDataOpts = {};\n }\n\n /**\n\t * @param {number} start\n\t * @param {number} count\n\t */\n parse(start, count) {\n const {_cachedMeta: meta, _data: data} = this;\n const {iScale, _stacked} = meta;\n const iAxis = iScale.axis;\n\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\n if (this._parsing === false) {\n meta._parsed = data;\n meta._sorted = true;\n parsed = data;\n } else {\n if (isArray(data[start])) {\n parsed = this.parseArrayData(meta, data, start, count);\n } else if (isObject(data[start])) {\n parsed = this.parseObjectData(meta, data, start, count);\n } else {\n parsed = this.parsePrimitiveData(meta, data, start, count);\n }\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\n if (_stacked) {\n updateStacks(this, parsed);\n }\n }\n\n /**\n\t * Parse array of primitive values\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [1,3,4]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id.\n\t * Example: {xScale0: 0, yScale0: 1}\n\t * @protected\n\t */\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\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\n /**\n\t * Parse array of arrays\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [[1,2],[3,4]]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id.\n\t * Example: {x: 0, y: 1}\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n const {xScale, yScale} = meta;\n const parsed = new Array(count);\n let i, ilen, index, item;\n\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\n /**\n\t * Parse array of objects\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [{x:1, y:5}, {x:2, y:10}]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id. _custom is optional\n\t * Example: {xScale0: 0, yScale0: 1, _custom: {r: 10, foo: 'bar'}}\n\t * @protected\n\t */\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\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\n /**\n\t * @protected\n\t */\n getParsed(index) {\n return this._cachedMeta._parsed[index];\n }\n\n /**\n\t * @protected\n\t */\n getDataElement(index) {\n return this._cachedMeta.data[index];\n }\n\n /**\n\t * @protected\n\t */\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]._visualValues\n };\n return applyStack(stack, value, meta.index, {mode});\n }\n\n /**\n\t * @protected\n\t */\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 value = applyStack(stack, parsedValue, this._cachedMeta.index);\n }\n range.min = Math.min(range.min, value);\n range.max = Math.max(range.max, value);\n }\n\n /**\n\t * @protected\n\t */\n getMinMax(scale, canStack) {\n const meta = this._cachedMeta;\n const _parsed = meta._parsed;\n const sorted = meta._sorted && scale === meta.iScale;\n const ilen = _parsed.length;\n const otherScale = this._getOtherScale(scale);\n const stack = createStack(canStack, meta, this.chart);\n const range = {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY};\n const {min: otherMin, max: otherMax} = getUserBounds(otherScale);\n let i, parsed;\n\n function _skip() {\n parsed = _parsed[i];\n const otherValue = parsed[otherScale.axis];\n return !isFinite(parsed[scale.axis]) || otherMin > otherValue || otherMax < otherValue;\n }\n\n for (i = 0; i < ilen; ++i) {\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n if (sorted) {\n // if the data is sorted, we don't need to check further from this end of array\n break;\n }\n }\n if (sorted) {\n // in the sorted case, find first non-skipped value from other end of array\n for (i = ilen - 1; i >= 0; --i) {\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n break;\n }\n }\n return range;\n }\n\n getAllParsedValues(scale) {\n const parsed = this._cachedMeta._parsed;\n const values = [];\n let i, ilen, value;\n\n for (i = 0, ilen = parsed.length; i < ilen; ++i) {\n value = parsed[i][scale.axis];\n if (isFinite(value)) {\n values.push(value);\n }\n }\n return values;\n }\n\n /**\n\t * @return {number|boolean}\n\t * @protected\n\t */\n getMaxOverflow() {\n return false;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const parsed = this.getParsed(index);\n return {\n label: iScale ? '' + iScale.getLabelForValue(parsed[iScale.axis]) : '',\n value: vScale ? '' + vScale.getLabelForValue(parsed[vScale.axis]) : ''\n };\n }\n\n /**\n\t * @private\n\t */\n _update(mode) {\n const meta = this._cachedMeta;\n this.update(mode || 'default');\n meta._clip = toClip(valueOrDefault(this.options.clip, defaultClip(meta.xScale, meta.yScale, this.getMaxOverflow())));\n }\n\n /**\n\t * @param {string} mode\n\t */\n update(mode) {} // eslint-disable-line no-unused-vars\n\n draw() {\n const ctx = this._ctx;\n const chart = this.chart;\n const meta = this._cachedMeta;\n const elements = meta.data || [];\n const area = chart.chartArea;\n const active = [];\n const start = this._drawStart || 0;\n const count = this._drawCount || (elements.length - start);\n const drawActiveElementsOnTop = this.options.drawActiveElementsOnTop;\n let i;\n\n if (meta.dataset) {\n meta.dataset.draw(ctx, area, start, count);\n }\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 && drawActiveElementsOnTop) {\n active.push(element);\n } else {\n element.draw(ctx, area);\n }\n }\n\n for (i = 0; i < active.length; ++i) {\n active[i].draw(ctx, area);\n }\n }\n\n /**\n\t * Returns a set of predefined style properties that should be used to represent the dataset\n\t * or the data if the index is specified\n\t * @param {number} index - data index\n\t * @param {boolean} [active] - true if hover\n\t * @return {object} style object\n\t */\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\n /**\n\t * @protected\n\t */\n getContext(index, active, mode) {\n const dataset = this.getDataset();\n let context;\n if (index >= 0 && index < this._cachedMeta.data.length) {\n const element = this._cachedMeta.data[index];\n context = element.$context ||\n (element.$context = createDataContext(this.getContext(), index, element));\n context.parsed = this.getParsed(index);\n context.raw = dataset.data[index];\n context.index = context.dataIndex = index;\n } else {\n context = this.$context ||\n (this.$context = createDatasetContext(this.chart.getContext(), this.index));\n context.dataset = dataset;\n context.index = context.datasetIndex = this.index;\n }\n\n context.active = !!active;\n context.mode = mode;\n return context;\n }\n\n /**\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDatasetElementOptions(mode) {\n return this._resolveElementOptions(this.datasetElementType.id, mode);\n }\n\n /**\n\t * @param {number} index\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDataElementOptions(index, mode) {\n return this._resolveElementOptions(this.dataElementType.id, mode, index);\n }\n\n /**\n\t * @private\n\t */\n _resolveElementOptions(elementType, mode = 'default', index) {\n const active = mode === 'active';\n const cache = this._cachedDataOpts;\n const cacheKey = elementType + '-' + mode;\n const cached = cache[cacheKey];\n const sharing = this.enableOptionSharing && defined(index);\n if (cached) {\n return cloneIfNotShared(cached, sharing);\n }\n const config = this.chart.config;\n const scopeKeys = config.datasetElementScopeKeys(this._type, elementType);\n const prefixes = active ? [`${elementType}Hover`, 'hover', elementType, ''] : [elementType, ''];\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n const names = Object.keys(defaults.elements[elementType]);\n // context is provided as a function, and is called only if needed,\n // so we don't create a context for each element if not needed.\n const context = () => this.getContext(index, active, mode);\n const values = config.resolveNamedOptions(scopes, names, context, prefixes);\n\n if (values.$shared) {\n // `$shared` indicates this set of options can be shared between multiple elements.\n // Sharing is used to reduce number of properties to change during animation.\n values.$shared = sharing;\n\n // We cache options by `mode`, which can be 'active' for example. This enables us\n // to have the 'active' element options and 'default' options to switch between\n // when interacting.\n cache[cacheKey] = Object.freeze(cloneIfNotShared(values, sharing));\n }\n\n return values;\n }\n\n\n /**\n\t * @private\n\t */\n _resolveAnimations(index, transition, active) {\n const chart = this.chart;\n const cache = this._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 = this.chart.config;\n const scopeKeys = config.datasetAnimationScopeKeys(this._type, transition);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n options = config.createResolver(scopes, this.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\n /**\n\t * Utility for getting the options object shared between elements\n\t * @protected\n\t */\n getSharedOptions(options) {\n if (!options.$shared) {\n return;\n }\n return this._sharedOptions || (this._sharedOptions = Object.assign({}, options));\n }\n\n /**\n\t * Utility for determining if `options` should be included in the updated properties\n\t * @protected\n\t */\n includeOptions(mode, sharedOptions) {\n return !sharedOptions || isDirectUpdateMode(mode) || this.chart._animationsDisabled;\n }\n\n /**\n * @todo v4, rename to getSharedOptions and remove excess functions\n */\n _getSharedOptions(start, mode) {\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const previouslySharedOptions = this._sharedOptions;\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions) || (sharedOptions !== previouslySharedOptions);\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n return {sharedOptions, includeOptions};\n }\n\n /**\n\t * Utility for updating an element with new properties, using animations when appropriate.\n\t * @protected\n\t */\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\n /**\n\t * Utility to animate the shared options, that are potentially affecting multiple elements.\n\t * @protected\n\t */\n updateSharedOptions(sharedOptions, mode, newOptions) {\n if (sharedOptions && !isDirectUpdateMode(mode)) {\n this._resolveAnimations(undefined, mode).update(sharedOptions, newOptions);\n }\n }\n\n /**\n\t * @private\n\t */\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 // When going from active to inactive, we need to update to the shared options.\n // This way the once hovered element will end up with the same original shared options instance, after animation.\n options: (!active && this.getSharedOptions(options)) || options\n });\n }\n\n removeHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', false);\n }\n\n setHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', true);\n }\n\n /**\n\t * @private\n\t */\n _removeDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n\n if (element) {\n this._setStyle(element, undefined, 'active', false);\n }\n }\n\n /**\n\t * @private\n\t */\n _setDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n\n if (element) {\n this._setStyle(element, undefined, 'active', true);\n }\n }\n\n /**\n\t * @private\n\t */\n _resyncElements(resetNewElements) {\n const data = this._data;\n const elements = this._cachedMeta.data;\n\n // Apply changes detected through array listeners\n for (const [method, arg1, arg2] of this._syncList) {\n this[method](arg1, arg2);\n }\n this._syncList = [];\n\n const numMeta = elements.length;\n const numData = data.length;\n const count = Math.min(numData, numMeta);\n\n if (count) {\n // TODO: It is not optimal to always parse the old data\n // This is done because we are not detecting direct assignments:\n // chart.data.datasets[0].data[5] = 10;\n // chart.data.datasets[0].data[5].y = 10;\n this.parse(0, count);\n }\n\n if (numData > numMeta) {\n this._insertElements(numMeta, numData - numMeta, resetNewElements);\n } else if (numData < numMeta) {\n this._removeElements(numData, numMeta - numData);\n }\n }\n\n /**\n\t * @private\n\t */\n _insertElements(start, count, resetNewElements = true) {\n const meta = this._cachedMeta;\n const data = meta.data;\n const end = start + count;\n let i;\n\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\n for (i = start; i < end; ++i) {\n data[i] = new this.dataElementType();\n }\n\n if (this._parsing) {\n move(meta._parsed);\n }\n this.parse(start, count);\n\n if (resetNewElements) {\n this.updateElements(data, start, count, 'reset');\n }\n }\n\n updateElements(element, start, count, mode) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * @private\n\t */\n _removeElements(start, count) {\n const meta = this._cachedMeta;\n if (this._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\n /**\n\t * @private\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 this.chart._dataChanges.push([this.index, ...args]);\n }\n\n _onDataPush() {\n const count = arguments.length;\n this._sync(['_insertElements', this.getDataset().data.length - count, count]);\n }\n\n _onDataPop() {\n this._sync(['_removeElements', this._cachedMeta.data.length - 1, 1]);\n }\n\n _onDataShift() {\n this._sync(['_removeElements', 0, 1]);\n }\n\n _onDataSplice(start, count) {\n if (count) {\n this._sync(['_removeElements', start, count]);\n }\n const newCount = arguments.length - 2;\n if (newCount) {\n this._sync(['_insertElements', start, newCount]);\n }\n }\n\n _onDataUnshift() {\n this._sync(['_insertElements', 0, arguments.length]);\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {\n _arrayUnique, isArray, isNullOrUndef,\n valueOrDefault, resolveObjectKey, sign, defined\n} from '../helpers/index.js';\n\nfunction getAllScaleValues(scale, type) {\n if (!scale._cache.$bar) {\n const visibleMetas = scale.getMatchingVisibleMetas(type);\n let values = [];\n\n for (let i = 0, ilen = visibleMetas.length; i < ilen; i++) {\n values = values.concat(visibleMetas[i].controller.getAllParsedValues(scale));\n }\n scale._cache.$bar = _arrayUnique(values.sort((a, b) => a - b));\n }\n return scale._cache.$bar;\n}\n\n/**\n * Computes the \"optimal\" sample size to maintain bars equally sized while preventing overlap.\n * @private\n */\nfunction computeMinSampleSize(meta) {\n const scale = meta.iScale;\n const values = getAllScaleValues(scale, meta.type);\n let min = scale._length;\n let i, ilen, curr, prev;\n const updateMinAndPrev = () => {\n if (curr === 32767 || curr === -32768) {\n // Ignore truncated pixels\n return;\n }\n if (defined(prev)) {\n // curr - prev === 0 is ignored\n min = Math.min(min, Math.abs(curr - prev) || min);\n }\n prev = curr;\n };\n\n for (i = 0, ilen = values.length; i < ilen; ++i) {\n curr = scale.getPixelForValue(values[i]);\n updateMinAndPrev();\n }\n\n prev = undefined;\n for (i = 0, ilen = scale.ticks.length; i < ilen; ++i) {\n curr = scale.getPixelForTick(i);\n updateMinAndPrev();\n }\n\n return min;\n}\n\n/**\n * Computes an \"ideal\" category based on the absolute bar thickness or, if undefined or null,\n * uses the smallest interval (see computeMinSampleSize) that prevents bar overlapping. This\n * mode currently always generates bars equally sized (until we introduce scriptable options?).\n * @private\n */\nfunction computeFitCategoryTraits(index, ruler, options, stackCount) {\n const thickness = options.barThickness;\n let size, ratio;\n\n if (isNullOrUndef(thickness)) {\n size = ruler.min * options.categoryPercentage;\n ratio = options.barPercentage;\n } else {\n // When bar thickness is enforced, category and bar percentages are ignored.\n // Note(SB): we could add support for relative bar thickness (e.g. barThickness: '50%')\n // and deprecate barPercentage since this value is ignored when thickness is absolute.\n size = thickness * stackCount;\n ratio = 1;\n }\n\n return {\n chunk: size / stackCount,\n ratio,\n start: ruler.pixels[index] - (size / 2)\n };\n}\n\n/**\n * Computes an \"optimal\" category that globally arranges bars side by side (no gap when\n * percentage options are 1), based on the previous and following categories. This mode\n * generates bars with different widths when data are not evenly spaced.\n * @private\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\n if (prev === null) {\n // first data: its size is double based on the next point or,\n // if it's also the last data, we use the scale size.\n prev = curr - (next === null ? ruler.end - ruler.start : next - curr);\n }\n\n if (next === null) {\n // last data: its size is also double based on the previous point.\n next = curr + curr - prev;\n }\n\n const start = curr - (curr - Math.min(prev, next)) / 2 * percent;\n const size = Math.abs(next - prev) / 2 * percent;\n\n return {\n chunk: size / stackCount,\n ratio: options.barPercentage,\n start\n };\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\n if (Math.abs(min) > Math.abs(max)) {\n barStart = max;\n barEnd = min;\n }\n\n // Store `barEnd` (furthest away from origin) as parsed value,\n // to make stacking straight forward\n item[vScale.axis] = barEnd;\n\n item._custom = {\n barStart,\n barEnd,\n start: startValue,\n end: endValue,\n min,\n max\n };\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}\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\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}\n\nfunction isFloatBar(custom) {\n return custom && custom.barStart !== undefined && custom.barEnd !== undefined;\n}\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}\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}\n\nfunction setBorderSkipped(properties, options, stack, index) {\n let edge = options.borderSkipped;\n const res = {};\n\n if (!edge) {\n properties.borderSkipped = res;\n return;\n }\n\n if (edge === true) {\n properties.borderSkipped = {top: true, right: true, bottom: true, left: true};\n return;\n }\n\n const {start, end, reverse, top, bottom} = borderProps(properties);\n\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\n res[parseEdge(edge, start, end, reverse)] = true;\n properties.borderSkipped = res;\n}\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}\n\nfunction swap(orig, v1, v2) {\n return orig === v1 ? v2 : orig === v2 ? v1 : orig;\n}\n\nfunction startEnd(v, start, end) {\n return v === 'start' ? start : v === 'end' ? end : v;\n}\n\nfunction setInflateAmount(properties, {inflateAmount}, ratio) {\n properties.inflateAmount = inflateAmount === 'auto'\n ? ratio === 1 ? 0.33 : 0\n : inflateAmount;\n}\n\nexport default class BarController extends DatasetController {\n\n static id = 'bar';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'bar',\n\n categoryPercentage: 0.8,\n barPercentage: 0.9,\n grouped: true,\n\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'base', 'width', 'height']\n }\n }\n };\n\n /**\n * @type {any}\n */\n static 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\n\n /**\n\t * Overriding primitive data parsing since we support mixed primitive/array\n\t * data for float bars\n\t * @protected\n\t */\n parsePrimitiveData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n\n /**\n\t * Overriding array data parsing since we support mixed primitive/array\n\t * data for float bars\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n\n /**\n\t * Overriding object data parsing since we support mixed primitive/array\n\t * value-scale data for float bars\n\t * @protected\n\t */\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\n /**\n\t * @protected\n\t */\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 // float bar: only one end of the bar is considered by `super`\n range.min = Math.min(range.min, custom.min);\n range.max = Math.max(range.max, custom.max);\n }\n }\n\n /**\n\t * @return {number|boolean}\n\t * @protected\n\t */\n getMaxOverflow() {\n return 0;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const {iScale, vScale} = meta;\n const parsed = this.getParsed(index);\n const custom = parsed._custom;\n const value = isFloatBar(custom)\n ? '[' + custom.start + ', ' + custom.end + ']'\n : '' + vScale.getLabelForValue(parsed[vScale.axis]);\n\n return {\n label: '' + iScale.getLabelForValue(parsed[iScale.axis]),\n value\n };\n }\n\n initialize() {\n this.enableOptionSharing = true;\n\n super.initialize();\n\n const meta = this._cachedMeta;\n meta.stack = this.getDataset().stack;\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n this.updateElements(meta.data, 0, meta.data.length, mode);\n }\n\n updateElements(bars, start, count, mode) {\n const reset = mode === 'reset';\n const {index, _cachedMeta: {vScale}} = this;\n const base = vScale.getBasePixel();\n const horizontal = vScale.isHorizontal();\n const ruler = this._getRuler();\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n\n for (let i = start; i < start + count; i++) {\n const parsed = this.getParsed(i);\n const vpixels = reset || isNullOrUndef(parsed[vScale.axis]) ? {base, head: base} : this._calculateBarValuePixels(i);\n const ipixels = this._calculateBarIndexPixels(i, ruler);\n const stack = (parsed._stacks || {})[vScale.axis];\n\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\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, bars[i].active ? 'active' : mode);\n }\n const options = properties.options || bars[i].options;\n setBorderSkipped(properties, options, stack, index);\n setInflateAmount(properties, options, ruler.ratio);\n this.updateElement(bars[i], i, properties, mode);\n }\n }\n\n /**\n\t * Returns the stacks based on groups and bar visibility.\n\t * @param {number} [last] - The dataset index\n\t * @param {number} [dataIndex] - The data index of the ruler\n\t * @returns {string[]} The list of stack IDs\n\t * @private\n\t */\n _getStacks(last, dataIndex) {\n const {iScale} = this._cachedMeta;\n const metasets = iScale.getMatchingVisibleMetas(this._type)\n .filter(meta => meta.controller.options.grouped);\n const stacked = iScale.options.stacked;\n const stacks = [];\n\n const skipNull = (meta) => {\n const parsed = meta.controller.getParsed(dataIndex);\n const val = parsed && parsed[meta.vScale.axis];\n\n if (isNullOrUndef(val) || isNaN(val)) {\n return true;\n }\n };\n\n for (const meta of metasets) {\n if (dataIndex !== undefined && skipNull(meta)) {\n continue;\n }\n\n // stacked | meta.stack\n // | found | not found | undefined\n // false | x | x | x\n // true | | x |\n // undefined | | x | x\n if (stacked === false || stacks.indexOf(meta.stack) === -1 ||\n\t\t\t\t(stacked === undefined && meta.stack === undefined)) {\n stacks.push(meta.stack);\n }\n if (meta.index === last) {\n break;\n }\n }\n\n // No stacks? that means there is no visible data. Let's still initialize an `undefined`\n // stack where possible invisible bars will be located.\n // https://github.com/chartjs/Chart.js/issues/6368\n if (!stacks.length) {\n stacks.push(undefined);\n }\n\n return stacks;\n }\n\n /**\n\t * Returns the effective number of stacks based on groups and bar visibility.\n\t * @private\n\t */\n _getStackCount(index) {\n return this._getStacks(undefined, index).length;\n }\n\n /**\n\t * Returns the stack index for the given dataset based on groups and bar visibility.\n\t * @param {number} [datasetIndex] - The dataset index\n\t * @param {string} [name] - The stack name to find\n * @param {number} [dataIndex]\n\t * @returns {number} The stack index\n\t * @private\n\t */\n _getStackIndex(datasetIndex, name, dataIndex) {\n const stacks = this._getStacks(datasetIndex, dataIndex);\n const index = (name !== undefined)\n ? stacks.indexOf(name)\n : -1; // indexOf returns -1 if element is not present\n\n return (index === -1)\n ? stacks.length - 1\n : index;\n }\n\n /**\n\t * @private\n\t */\n _getRuler() {\n const opts = this.options;\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const pixels = [];\n let i, ilen;\n\n for (i = 0, ilen = meta.data.length; i < ilen; ++i) {\n pixels.push(iScale.getPixelForValue(this.getParsed(i)[iScale.axis], i));\n }\n\n const barThickness = opts.barThickness;\n const min = barThickness || computeMinSampleSize(meta);\n\n return {\n min,\n pixels,\n start: iScale._startPixel,\n end: iScale._endPixel,\n stackCount: this._getStackCount(),\n scale: iScale,\n grouped: opts.grouped,\n // bar thickness ratio used for non-grouped bars\n ratio: barThickness ? 1 : opts.categoryPercentage * opts.barPercentage\n };\n }\n\n /**\n\t * Note: pixel values are not clamped to the scale area.\n\t * @private\n\t */\n _calculateBarValuePixels(index) {\n const {_cachedMeta: {vScale, _stacked, index: datasetIndex}, options: {base: baseValue, minBarLength}} = this;\n const actualBase = baseValue || 0;\n const parsed = this.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 ? this.applyStack(vScale, parsed, _stacked) : value;\n let head, size;\n\n if (length !== value) {\n start = length - value;\n length = value;\n }\n\n if (floating) {\n value = custom.barStart;\n length = custom.barEnd - custom.barStart;\n // bars crossing origin are not stacked\n if (value !== 0 && sign(value) !== sign(custom.barEnd)) {\n start = 0;\n }\n start += value;\n }\n\n const startValue = !isNullOrUndef(baseValue) && !floating ? baseValue : start;\n let base = vScale.getPixelForValue(startValue);\n\n if (this.chart.getDataVisibility(index)) {\n head = vScale.getPixelForValue(start + length);\n } else {\n // When not visible, no height\n head = base;\n }\n\n size = head - base;\n\n if (Math.abs(size) < minBarLength) {\n size = barSign(size, vScale, actualBase) * minBarLength;\n if (value === actualBase) {\n base -= size / 2;\n }\n const startPixel = vScale.getPixelForDecimal(0);\n const endPixel = vScale.getPixelForDecimal(1);\n const min = Math.min(startPixel, endPixel);\n const max = Math.max(startPixel, endPixel);\n base = Math.max(Math.min(base, max), min);\n head = base + size;\n\n if (_stacked && !floating) {\n // visual data coordinates after applying minBarLength\n parsed._stacks[vScale.axis]._visualValues[datasetIndex] = vScale.getValueForPixel(head) - vScale.getValueForPixel(base);\n }\n }\n\n if (base === vScale.getPixelForValue(actualBase)) {\n const halfGrid = sign(size) * vScale.getLineWidthForValue(actualBase) / 2;\n base += halfGrid;\n size -= halfGrid;\n }\n\n return {\n size,\n base,\n head,\n center: head + size / 2\n };\n }\n\n /**\n\t * @private\n\t */\n _calculateBarIndexPixels(index, ruler) {\n const scale = ruler.scale;\n const options = this.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 ? this._getStackCount(index) : ruler.stackCount;\n const range = options.barThickness === 'flex'\n ? computeFlexCategoryTraits(index, ruler, options, stackCount)\n : computeFitCategoryTraits(index, ruler, options, stackCount);\n\n const stackIndex = this._getStackIndex(this.index, this._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 // For non-grouped bar charts, exact pixel values are used\n center = scale.getPixelForValue(this.getParsed(index)[scale.axis], index);\n size = Math.min(maxBarThickness, ruler.min * ruler.ratio);\n }\n\n return {\n base: center - size / 2,\n head: center + size / 2,\n center,\n size\n };\n }\n\n draw() {\n const meta = this._cachedMeta;\n const vScale = meta.vScale;\n const rects = meta.data;\n const ilen = rects.length;\n let i = 0;\n\n for (; i < ilen; ++i) {\n if (this.getParsed(i)[vScale.axis] !== null) {\n rects[i].draw(this._ctx);\n }\n }\n }\n\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {valueOrDefault} from '../helpers/helpers.core.js';\n\nexport default class BubbleController extends DatasetController {\n\n static id = 'bubble';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'borderWidth', 'radius']\n }\n }\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n };\n\n initialize() {\n this.enableOptionSharing = true;\n super.initialize();\n }\n\n /**\n\t * Parse array of primitive values\n\t * @protected\n\t */\n parsePrimitiveData(meta, data, start, count) {\n const parsed = super.parsePrimitiveData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n parsed[i]._custom = this.resolveDataElementOptions(i + start).radius;\n }\n return parsed;\n }\n\n /**\n\t * Parse array of arrays\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n const parsed = super.parseArrayData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item[2], this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n\n /**\n\t * Parse array of objects\n\t * @protected\n\t */\n parseObjectData(meta, data, start, count) {\n const parsed = super.parseObjectData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item && item.r && +item.r, this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const data = this._cachedMeta.data;\n\n let max = 0;\n for (let i = data.length - 1; i >= 0; --i) {\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const {xScale, yScale} = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n const r = parsed._custom;\n\n return {\n label: labels[index] || '',\n value: '(' + x + ', ' + y + (r ? ', ' + r : '') + ')'\n };\n }\n\n update(mode) {\n const points = this._cachedMeta.data;\n\n // Update Points\n this.updateElements(points, 0, points.length, mode);\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale} = this._cachedMeta;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n\n for (let i = start; i < start + count; i++) {\n const point = points[i];\n const parsed = !reset && this.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\n properties.skip = isNaN(iPixel) || isNaN(vPixel);\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n\n if (reset) {\n properties.options.radius = 0;\n }\n }\n\n this.updateElement(point, i, properties, mode);\n }\n }\n\n /**\n\t * @param {number} index\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDataElementOptions(index, mode) {\n const parsed = this.getParsed(index);\n let values = super.resolveDataElementOptions(index, mode);\n\n // In case values were cached (and thus frozen), we need to clone the values\n if (values.$shared) {\n values = Object.assign({}, values, {$shared: false});\n }\n\n // Custom radius resolution\n const radius = values.radius;\n if (mode !== 'active') {\n values.radius = 0;\n }\n values.radius += valueOrDefault(parsed && parsed._custom, radius);\n\n return values;\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {isObject, resolveObjectKey, toPercentage, toDimension, valueOrDefault} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {toRadians, PI, TAU, HALF_PI, _angleBetween} from '../helpers/helpers.math.js';\n\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\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 the chart's circumference isn't a full circle, calculate size as a ratio of the width/height of the arc\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}\n\nexport default class DoughnutController extends DatasetController {\n\n static id = 'doughnut';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'arc',\n animation: {\n // Boolean - Whether we animate the rotation of the Doughnut\n animateRotate: true,\n // Boolean - Whether we animate scaling the Doughnut from the centre\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 // The percentage of the chart that we cut out of the middle.\n cutout: '50%',\n\n // The rotation of the chart, where the first data arc begins.\n rotation: 0,\n\n // The total circumference of the chart.\n circumference: 360,\n\n // The outer radius of the chart\n radius: '100%',\n\n // Spacing between arcs\n spacing: 0,\n\n indexAxis: 'r',\n };\n\n static descriptors = {\n _scriptable: (name) => name !== 'spacing',\n _indexable: (name) => name !== 'spacing' && !name.startsWith('borderDash') && !name.startsWith('hoverBorderDash'),\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\n // Need to override these to give a nice default\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, color}} = chart.legend.options;\n\n return data.labels.map((label, i) => {\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n\n return {\n text: label,\n fillStyle: style.backgroundColor,\n strokeStyle: style.borderColor,\n fontColor: color,\n lineWidth: style.borderWidth,\n pointStyle: pointStyle,\n hidden: !chart.getDataVisibility(i),\n\n // Extra data used for toggling the correct item\n index: i\n };\n });\n }\n return [];\n }\n },\n\n onClick(e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n }\n }\n };\n\n constructor(chart, datasetIndex) {\n super(chart, datasetIndex);\n\n this.enableOptionSharing = true;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.offsetX = undefined;\n this.offsetY = undefined;\n }\n\n linkScales() {}\n\n /**\n\t * Override data parsing, since we are not using scales\n\t */\n parse(start, count) {\n const data = this.getDataset().data;\n const meta = this._cachedMeta;\n\n if (this._parsing === false) {\n meta._parsed = data;\n } else {\n let getter = (i) => +data[i];\n\n if (isObject(data[start])) {\n const {key = 'value'} = this._parsing;\n getter = (i) => +resolveObjectKey(data[i], key);\n }\n\n let i, ilen;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n meta._parsed[i] = getter(i);\n }\n }\n }\n\n /**\n\t * @private\n\t */\n _getRotation() {\n return toRadians(this.options.rotation - 90);\n }\n\n /**\n\t * @private\n\t */\n _getCircumference() {\n return toRadians(this.options.circumference);\n }\n\n /**\n\t * Get the maximal rotation & circumference extents\n\t * across all visible datasets.\n\t */\n _getRotationExtents() {\n let min = TAU;\n let max = -TAU;\n\n for (let i = 0; i < this.chart.data.datasets.length; ++i) {\n if (this.chart.isDatasetVisible(i) && this.chart.getDatasetMeta(i).type === this._type) {\n const controller = this.chart.getDatasetMeta(i).controller;\n const rotation = controller._getRotation();\n const circumference = controller._getCircumference();\n\n min = Math.min(min, rotation);\n max = Math.max(max, rotation + circumference);\n }\n }\n\n return {\n rotation: min,\n circumference: max - min,\n };\n }\n\n /**\n\t * @param {string} mode\n\t */\n update(mode) {\n const chart = this.chart;\n const {chartArea} = chart;\n const meta = this._cachedMeta;\n const arcs = meta.data;\n const spacing = this.getMaxBorderWidth() + this.getMaxOffset(arcs) + this.options.spacing;\n const maxSize = Math.max((Math.min(chartArea.width, chartArea.height) - spacing) / 2, 0);\n const cutout = Math.min(toPercentage(this.options.cutout, maxSize), 1);\n const chartWeight = this._getRingWeight(this.index);\n\n // Compute the maximal rotation & circumference limits.\n // If we only consider our dataset, this can cause problems when two datasets\n // are both less than a circle with different rotations (starting angles)\n const {circumference, rotation} = this._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(this.options.radius, maxRadius);\n const innerRadius = Math.max(outerRadius * cutout, 0);\n const radiusLength = (outerRadius - innerRadius) / this._getVisibleDatasetWeightTotal();\n this.offsetX = offsetX * outerRadius;\n this.offsetY = offsetY * outerRadius;\n\n meta.total = this.calculateTotal();\n\n this.outerRadius = outerRadius - radiusLength * this._getRingWeightOffset(this.index);\n this.innerRadius = Math.max(this.outerRadius - radiusLength * chartWeight, 0);\n\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n\n /**\n * @private\n */\n _circumference(i, reset) {\n const opts = this.options;\n const meta = this._cachedMeta;\n const circumference = this._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 this.calculateCircumference(meta._parsed[i] * circumference / TAU);\n }\n\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.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 : this.innerRadius;\n const outerRadius = animateScale ? 0 : this.outerRadius;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n let startAngle = this._getRotation();\n let i;\n\n for (i = 0; i < start; ++i) {\n startAngle += this._circumference(i, reset);\n }\n\n for (i = start; i < start + count; ++i) {\n const circumference = this._circumference(i, reset);\n const arc = arcs[i];\n const properties = {\n x: centerX + this.offsetX,\n y: centerY + this.offsetY,\n startAngle,\n endAngle: startAngle + circumference,\n circumference,\n outerRadius,\n innerRadius\n };\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, arc.active ? 'active' : mode);\n }\n startAngle += circumference;\n\n this.updateElement(arc, i, properties, mode);\n }\n }\n\n calculateTotal() {\n const meta = this._cachedMeta;\n const metaData = meta.data;\n let total = 0;\n let i;\n\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\n return total;\n }\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\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index], chart.options.locale);\n\n return {\n label: labels[index] || '',\n value,\n };\n }\n\n getMaxBorderWidth(arcs) {\n let max = 0;\n const chart = this.chart;\n let i, ilen, meta, controller, options;\n\n if (!arcs) {\n // Find the outmost visible dataset\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 break;\n }\n }\n }\n\n if (!arcs) {\n return 0;\n }\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\n getMaxOffset(arcs) {\n let max = 0;\n\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\n /**\n\t * Get radius length offset of the dataset in relation to the visible datasets weights. This allows determining the inner and outer radius correctly\n\t * @private\n\t */\n _getRingWeightOffset(datasetIndex) {\n let ringWeightOffset = 0;\n\n for (let i = 0; i < datasetIndex; ++i) {\n if (this.chart.isDatasetVisible(i)) {\n ringWeightOffset += this._getRingWeight(i);\n }\n }\n\n return ringWeightOffset;\n }\n\n /**\n\t * @private\n\t */\n _getRingWeight(datasetIndex) {\n return Math.max(valueOrDefault(this.chart.data.datasets[datasetIndex].weight, 1), 0);\n }\n\n /**\n\t * Returns the sum of all visible data set weights.\n\t * @private\n\t */\n _getVisibleDatasetWeightTotal() {\n return this._getRingWeightOffset(this.chart.data.datasets.length) || 1;\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {isNullOrUndef} from '../helpers/index.js';\nimport {isNumber} from '../helpers/helpers.math.js';\nimport {_getStartAndCountOfVisiblePoints, _scaleRangesChanged} from '../helpers/helpers.extras.js';\n\nexport default class LineController extends DatasetController {\n\n static id = 'line';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n\n showLine: true,\n spanGaps: false,\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n scales: {\n _index_: {\n type: 'category',\n },\n _value_: {\n type: 'linear',\n },\n }\n };\n\n initialize() {\n this.enableOptionSharing = true;\n this.supportsDecimation = true;\n super.initialize();\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const {dataset: line, data: points = [], _dataset} = meta;\n // @ts-ignore\n const animationsDisabled = this.chart._animationsDisabled;\n let {start, count} = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n\n this._drawStart = start;\n this._drawCount = count;\n\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n\n // Update Line\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n\n // Update Points\n this.updateElements(points, start, count, mode);\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale, _stacked, _dataset} = this._cachedMeta;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const {spanGaps, segment} = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n const end = start + count;\n const pointsCount = points.length;\n let prevParsed = start > 0 && this.getParsed(start - 1);\n\n for (let i = 0; i < pointsCount; ++i) {\n const point = points[i];\n const properties = directUpdate ? point : {};\n\n if (i < start || i >= end) {\n properties.skip = true;\n continue;\n }\n\n const parsed = this.getParsed(i);\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 ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && (Math.abs(parsed[iAxis] - prevParsed[iAxis])) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n\n prevParsed = parsed;\n }\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const meta = this._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(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n\n draw() {\n const meta = this._cachedMeta;\n meta.dataset.updateControlPoints(this.chart.chartArea, meta.iScale.axis);\n super.draw();\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {toRadians, PI, formatNumber, _parseObjectDataRadialScale} from '../helpers/index.js';\n\nexport default class PolarAreaController extends DatasetController {\n\n static id = 'polarArea';\n\n /**\n * @type {any}\n */\n static 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 };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\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, color}} = chart.legend.options;\n\n return data.labels.map((label, i) => {\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n\n return {\n text: label,\n fillStyle: style.backgroundColor,\n strokeStyle: style.borderColor,\n fontColor: color,\n lineWidth: style.borderWidth,\n pointStyle: pointStyle,\n hidden: !chart.getDataVisibility(i),\n\n // Extra data used for toggling the correct item\n index: i\n };\n });\n }\n return [];\n }\n },\n\n onClick(e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\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\n constructor(chart, datasetIndex) {\n super(chart, datasetIndex);\n\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n }\n\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index].r, chart.options.locale);\n\n return {\n label: labels[index] || '',\n value,\n };\n }\n\n parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n\n update(mode) {\n const arcs = this._cachedMeta.data;\n\n this._updateRadius();\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n\n /**\n * @protected\n */\n getMinMax() {\n const meta = this._cachedMeta;\n const range = {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY};\n\n meta.data.forEach((element, index) => {\n const parsed = this.getParsed(index).r;\n\n if (!isNaN(parsed) && this.chart.getDataVisibility(index)) {\n if (parsed < range.min) {\n range.min = parsed;\n }\n\n if (parsed > range.max) {\n range.max = parsed;\n }\n }\n });\n\n return range;\n }\n\n /**\n\t * @private\n\t */\n _updateRadius() {\n const chart = this.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\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\n this.outerRadius = outerRadius - (radiusLength * this.index);\n this.innerRadius = this.outerRadius - radiusLength;\n }\n\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.chart;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const scale = this._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\n const defaultAngle = 360 / this.countVisibleElements();\n\n for (i = 0; i < start; ++i) {\n angle += this._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 + this._computeAngle(i, mode, defaultAngle);\n let outerRadius = chart.getDataVisibility(i) ? scale.getDistanceFromCenterForValue(this.getParsed(i).r) : 0;\n angle = endAngle;\n\n if (reset) {\n if (animationOpts.animateScale) {\n outerRadius = 0;\n }\n if (animationOpts.animateRotate) {\n startAngle = endAngle = datasetStartAngle;\n }\n }\n\n const properties = {\n x: centerX,\n y: centerY,\n innerRadius: 0,\n outerRadius,\n startAngle,\n endAngle,\n options: this.resolveDataElementOptions(i, arc.active ? 'active' : mode)\n };\n\n this.updateElement(arc, i, properties, mode);\n }\n }\n\n countVisibleElements() {\n const meta = this._cachedMeta;\n let count = 0;\n\n meta.data.forEach((element, index) => {\n if (!isNaN(this.getParsed(index).r) && this.chart.getDataVisibility(index)) {\n count++;\n }\n });\n\n return count;\n }\n\n /**\n\t * @private\n\t */\n _computeAngle(index, mode, defaultAngle) {\n return this.chart.getDataVisibility(index)\n ? toRadians(this.resolveDataElementOptions(index, mode).angle || defaultAngle)\n : 0;\n }\n}\n","import DoughnutController from './controller.doughnut.js';\n\n// Pie charts are Doughnut chart with different defaults\nexport default class PieController extends DoughnutController {\n\n static id = 'pie';\n\n /**\n * @type {any}\n */\n static defaults = {\n // The percentage of the chart that we cut out of the middle.\n cutout: 0,\n\n // The rotation of the chart, where the first data arc begins.\n rotation: 0,\n\n // The total circumference of the chart.\n circumference: 360,\n\n // The outer radius of the chart\n radius: '100%'\n };\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {_parseObjectDataRadialScale} from '../helpers/index.js';\n\nexport default class RadarController extends DatasetController {\n\n static id = 'radar';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n indexAxis: 'r',\n showLine: true,\n elements: {\n line: {\n fill: 'start'\n }\n },\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\n scales: {\n r: {\n type: 'radialLinear',\n }\n }\n };\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const vScale = this._cachedMeta.vScale;\n const parsed = this.getParsed(index);\n\n return {\n label: vScale.getLabels()[index],\n value: '' + vScale.getLabelForValue(parsed[vScale.axis])\n };\n }\n\n parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const line = meta.dataset;\n const points = meta.data || [];\n const labels = meta.iScale.getLabels();\n\n // Update Line\n line.points = points;\n // In resize mode only point locations change, so no need to set the points or options.\n if (mode !== 'resize') {\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n\n const properties = {\n _loop: true,\n _fullLoop: labels.length === points.length,\n options\n };\n\n this.updateElement(line, undefined, properties, mode);\n }\n\n // Update Points\n this.updateElements(points, 0, points.length, mode);\n }\n\n updateElements(points, start, count, mode) {\n const scale = this._cachedMeta.rScale;\n const reset = mode === 'reset';\n\n for (let i = start; i < start + count; i++) {\n const point = points[i];\n const options = this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n const pointPosition = scale.getPointPositionForValue(i, this.getParsed(i).r);\n\n const x = reset ? scale.xCenter : pointPosition.x;\n const y = reset ? scale.yCenter : pointPosition.y;\n\n const properties = {\n x,\n y,\n angle: pointPosition.angle,\n skip: isNaN(x) || isNaN(y),\n options\n };\n\n this.updateElement(point, i, properties, mode);\n }\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {isNullOrUndef} from '../helpers/index.js';\nimport {isNumber} from '../helpers/helpers.math.js';\nimport {_getStartAndCountOfVisiblePoints, _scaleRangesChanged} from '../helpers/helpers.extras.js';\n\nexport default class ScatterController extends DatasetController {\n\n static id = 'scatter';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n showLine: false,\n fill: false\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n\n interaction: {\n mode: 'point'\n },\n\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n };\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const {xScale, yScale} = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n\n return {\n label: labels[index] || '',\n value: '(' + x + ', ' + y + ')'\n };\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const {data: points = []} = meta;\n // @ts-ignore\n const animationsDisabled = this.chart._animationsDisabled;\n let {start, count} = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n\n this._drawStart = start;\n this._drawCount = count;\n\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n\n if (this.options.showLine) {\n\n // https://github.com/chartjs/Chart.js/issues/11333\n if (!this.datasetElementType) {\n this.addElements();\n }\n const {dataset: line, _dataset} = meta;\n\n // Update Line\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n\n const options = this.resolveDatasetElementOptions(mode);\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n } else if (this.datasetElementType) {\n // https://github.com/chartjs/Chart.js/issues/11333\n delete meta.dataset;\n this.datasetElementType = false;\n }\n\n // Update Points\n this.updateElements(points, start, count, mode);\n }\n\n addElements() {\n const {showLine} = this.options;\n\n if (!this.datasetElementType && showLine) {\n this.datasetElementType = this.chart.registry.getElement('line');\n }\n\n super.addElements();\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale, _stacked, _dataset} = this._cachedMeta;\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const {spanGaps, segment} = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n let prevParsed = start > 0 && this.getParsed(start - 1);\n\n for (let i = start; i < start + count; ++i) {\n const point = points[i];\n const parsed = this.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 ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && (Math.abs(parsed[iAxis] - prevParsed[iAxis])) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n\n prevParsed = parsed;\n }\n\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const meta = this._cachedMeta;\n const data = meta.data || [];\n\n if (!this.options.showLine) {\n let max = 0;\n for (let i = data.length - 1; i >= 0; --i) {\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n\n if (!data.length) {\n return border;\n }\n\n const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n}\n","/**\n * @namespace Chart._adapters\n * @since 2.8.0\n * @private\n */\n\nimport type {AnyObject} from '../types/basic.js';\nimport type {ChartOptions} from '../types/index.js';\n\nexport type TimeUnit = 'millisecond' | 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'quarter' | 'year';\n\nexport interface DateAdapter {\n readonly options: T;\n /**\n * Will called with chart options after adapter creation.\n */\n init(this: DateAdapter, chartOptions: ChartOptions): void;\n /**\n * Returns a map of time formats for the supported formatting units defined\n * in Unit as well as 'datetime' representing a detailed date/time string.\n */\n formats(this: DateAdapter): Record;\n /**\n * Parses the given `value` and return the associated timestamp.\n * @param value - the value to parse (usually comes from the data)\n * @param [format] - the expected data format\n */\n parse(this: DateAdapter, value: unknown, format?: TimeUnit): number | null;\n /**\n * Returns the formatted date in the specified `format` for a given `timestamp`.\n * @param timestamp - the timestamp to format\n * @param format - the date/time token\n */\n format(this: DateAdapter, timestamp: number, format: TimeUnit): string;\n /**\n * Adds the specified `amount` of `unit` to the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param amount - the amount to add\n * @param unit - the unit as string\n */\n add(this: DateAdapter, timestamp: number, amount: number, unit: TimeUnit): number;\n /**\n * Returns the number of `unit` between the given timestamps.\n * @param a - the input timestamp (reference)\n * @param b - the timestamp to subtract\n * @param unit - the unit as string\n */\n diff(this: DateAdapter, a: number, b: number, unit: TimeUnit): number;\n /**\n * Returns start of `unit` for the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param unit - the unit as string\n * @param [weekday] - the ISO day of the week with 1 being Monday\n * and 7 being Sunday (only needed if param *unit* is `isoWeek`).\n */\n startOf(this: DateAdapter, timestamp: number, unit: TimeUnit | 'isoWeek', weekday?: number): number;\n /**\n * Returns end of `unit` for the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param unit - the unit as string\n */\n endOf(this: DateAdapter, timestamp: number, unit: TimeUnit | 'isoWeek'): number;\n}\n\nfunction abstract(): T {\n throw new Error('This method is not implemented: Check that a complete date adapter is provided.');\n}\n\n/**\n * Date adapter (current used by the time scale)\n * @namespace Chart._adapters._date\n * @memberof Chart._adapters\n * @private\n */\nclass DateAdapterBase implements DateAdapter {\n\n /**\n * Override default date adapter methods.\n * Accepts type parameter to define options type.\n * @example\n * Chart._adapters._date.override<{myAdapterOption: string}>({\n * init() {\n * console.log(this.options.myAdapterOption);\n * }\n * })\n */\n static override(\n members: Partial, 'options'>>\n ) {\n Object.assign(DateAdapterBase.prototype, members);\n }\n\n readonly options: AnyObject;\n\n constructor(options: AnyObject) {\n this.options = options || {};\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n init() {}\n\n formats(): Record {\n return abstract();\n }\n\n parse(): number | null {\n return abstract();\n }\n\n format(): string {\n return abstract();\n }\n\n add(): number {\n return abstract();\n }\n\n diff(): number {\n return abstract();\n }\n\n startOf(): number {\n return abstract();\n }\n\n endOf(): number {\n return abstract();\n }\n}\n\nexport default {\n _date: DateAdapterBase\n};\n","import {_lookupByKey, _rlookupByKey} from '../helpers/helpers.collection.js';\nimport {getRelativePosition} from '../helpers/helpers.dom.js';\nimport {_angleBetween, getAngleFromPoint} from '../helpers/helpers.math.js';\nimport {_isPointInArea} from '../helpers/index.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef {{axis?: string, intersect?: boolean, includeInvisible?: boolean}} InteractionOptions\n * @typedef {{datasetIndex: number, index: number, element: import('./core.element.js').default}} InteractionItem\n * @typedef { import('../types/index.js').Point } Point\n */\n\n/**\n * Helper function to do binary search when possible\n * @param {object} metaset - the dataset meta\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {number} value - the value to find\n * @param {boolean} [intersect] - should the element intersect\n * @returns {{lo:number, hi:number}} indices to search data array between\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 && axis !== 'r' && _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 // _sharedOptions indicates that each element has equal options -> equal proportions\n // So we can do a ranged binary search based on the range of first element and\n // be confident to get the full range of indices that can intersect with the value.\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 // Default to all elements, when binary search can not be used.\n return {lo: 0, hi: data.length - 1};\n}\n\n/**\n * Helper function to select candidate elements for interaction\n * @param {Chart} chart - the chart\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {function} handler - the callback to execute for each visible item\n * @param {boolean} [intersect] - consider intersecting items\n */\nfunction evaluateInteractionItems(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}\n\n/**\n * Get a distance metric function for two points based on the\n * axis mode setting\n * @param {string} axis - the axis mode. x|y|xy|r\n */\nfunction getDistanceMetricForAxis(axis) {\n const useX = axis.indexOf('x') !== -1;\n const useY = axis.indexOf('y') !== -1;\n\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}\n\n/**\n * Helper function to get the items that intersect the event position\n * @param {Chart} chart - the chart\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) {\n const items = [];\n\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return items;\n }\n\n const evaluationFunc = function(element, datasetIndex, index) {\n if (!includeInvisible && !_isPointInArea(element, chart.chartArea, 0)) {\n return;\n }\n if (element.inRange(position.x, position.y, useFinalPosition)) {\n items.push({element, datasetIndex, index});\n }\n };\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc, true);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position for a radial chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestRadialItems(chart, position, axis, useFinalPosition) {\n let items = [];\n\n function evaluationFunc(element, datasetIndex, index) {\n const {startAngle, endAngle} = element.getProps(['startAngle', 'endAngle'], useFinalPosition);\n const {angle} = getAngleFromPoint(element, {x: position.x, y: position.y});\n\n if (_angleBetween(angle, startAngle, endAngle)) {\n items.push({element, datasetIndex, index});\n }\n }\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position for a cartesian chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n let items = [];\n const distanceMetric = getDistanceMetricForAxis(axis);\n let minDistance = Number.POSITIVE_INFINITY;\n\n function evaluationFunc(element, datasetIndex, index) {\n const inRange = element.inRange(position.x, position.y, useFinalPosition);\n if (intersect && !inRange) {\n return;\n }\n\n const center = element.getCenterPoint(useFinalPosition);\n const pointInArea = !!includeInvisible || chart.isPointInArea(center);\n if (!pointInArea && !inRange) {\n return;\n }\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 // Can have multiple items at the same distance in which case we sort by size\n items.push({element, datasetIndex, index});\n }\n }\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position considering all visible items in the chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return [];\n }\n\n return axis === 'r' && !intersect\n ? getNearestRadialItems(chart, position, axis, useFinalPosition)\n : getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible);\n}\n\n/**\n * Helper function to get the items matching along the given X or Y axis\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axis to match\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @return {InteractionItem[]} the nearest items\n */\nfunction getAxisItems(chart, position, axis, intersect, useFinalPosition) {\n const items = [];\n const rangeMethod = axis === 'x' ? 'inXRange' : 'inYRange';\n let intersectsItem = false;\n\n evaluateInteractionItems(chart, axis, position, (element, datasetIndex, index) => {\n if (element[rangeMethod](position[axis], useFinalPosition)) {\n items.push({element, datasetIndex, index});\n intersectsItem = intersectsItem || element.inRange(position.x, position.y, useFinalPosition);\n }\n });\n\n // If we want to trigger on an intersect and we don't have any items\n // that intersect the position, return nothing\n if (intersect && !intersectsItem) {\n return [];\n }\n return items;\n}\n\n/**\n * Contains interaction related functions\n * @namespace Chart.Interaction\n */\nexport default {\n // Part of the public API to facilitate developers creating their own modes\n evaluateInteractionItems,\n\n // Helper function for different modes\n modes: {\n /**\n\t\t * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item\n\t\t * @function Chart.Interaction.modes.index\n\t\t * @since v2.4.0\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n index(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n // Default axis for index mode is 'x' to match old behaviour\n const axis = options.axis || 'x';\n const includeInvisible = options.includeInvisible || false;\n const items = options.intersect\n ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible)\n : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n const elements = [];\n\n if (!items.length) {\n return [];\n }\n\n chart.getSortedVisibleDatasetMetas().forEach((meta) => {\n const index = items[0].index;\n const element = meta.data[index];\n\n // don't count items that are skipped (null data)\n if (element && !element.skip) {\n elements.push({element, datasetIndex: meta.index, index});\n }\n });\n\n return elements;\n },\n\n /**\n\t\t * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t * If the options.intersect is false, we find the nearest item and return the items in that dataset\n\t\t * @function Chart.Interaction.modes.dataset\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n dataset(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n let items = options.intersect\n ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) :\n getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n\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\n return items;\n },\n\n /**\n\t\t * Point mode returns all elements that hit test based on the event position\n\t\t * of the event\n\t\t * @function Chart.Interaction.modes.intersect\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n point(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n return getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible);\n },\n\n /**\n\t\t * nearest mode returns the element closest to the point\n\t\t * @function Chart.Interaction.modes.intersect\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n nearest(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n return getNearestItems(chart, position, axis, options.intersect, useFinalPosition, includeInvisible);\n },\n\n /**\n\t\t * x mode returns the elements that hit-test at the current x coordinate\n\t\t * @function Chart.Interaction.modes.x\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n x(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, 'x', options.intersect, useFinalPosition);\n },\n\n /**\n\t\t * y mode returns the elements that hit-test at the current y coordinate\n\t\t * @function Chart.Interaction.modes.y\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n y(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, 'y', options.intersect, useFinalPosition);\n }\n }\n};\n","import {defined, each, isObject} from '../helpers/helpers.core.js';\nimport {toPadding} from '../helpers/helpers.options.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n */\n\nconst STATIC_POSITIONS = ['left', 'top', 'right', 'bottom'];\n\nfunction filterByPosition(array, position) {\n return array.filter(v => v.pos === position);\n}\n\nfunction filterDynamicPositionByAxis(array, axis) {\n return array.filter(v => STATIC_POSITIONS.indexOf(v.pos) === -1 && v.box.axis === axis);\n}\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}\n\nfunction wrapBoxes(boxes) {\n const layoutBoxes = [];\n let i, ilen, box, pos, stack, stackWeight;\n\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}\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}\n\n/**\n * store dimensions used instead of available chartArea in fitBoxes\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}\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\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}\n\nfunction getCombinedMax(maxPadding, chartArea, a, b) {\n return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]);\n}\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}\n\nfunction updateDims(chartArea, params, layout, stacks) {\n const {pos, box} = layout;\n const maxPadding = chartArea.maxPadding;\n\n // dynamically placed boxes size is not considered\n if (!isObject(pos)) {\n if (layout.size) {\n // this layout was already counted for, lets first reduce old 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\n if (box.getPadding) {\n updateMaxPadding(maxPadding, box.getPadding());\n }\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\n // return booleans on the changes per direction\n return layout.horizontal\n ? {same: widthChanged, other: heightChanged}\n : {same: heightChanged, other: widthChanged};\n}\n\nfunction handleMaxPadding(chartArea) {\n const maxPadding = chartArea.maxPadding;\n\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}\n\nfunction getMargins(horizontal, chartArea) {\n const maxPadding = chartArea.maxPadding;\n\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\n return horizontal\n ? marginForPositions(['left', 'right'])\n : marginForPositions(['top', 'bottom']);\n}\n\nfunction fitBoxes(boxes, chartArea, params, stacks) {\n const refitBoxes = [];\n let i, ilen, layout, box, refit, changed;\n\n for (i = 0, ilen = boxes.length, refit = 0; i < ilen; ++i) {\n layout = boxes[i];\n box = layout.box;\n\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\n // Dimensions changed and there were non full width boxes before this\n // -> we have to refit those\n refit |= same && refitBoxes.length;\n\n // Chart area changed in the opposite direction\n changed = changed || other;\n\n if (!box.fullSize) { // fullSize boxes don't need to be re-fitted in any case\n refitBoxes.push(layout);\n }\n }\n\n return refit && fitBoxes(refitBoxes, chartArea, params, stacks) || changed;\n}\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}\n\nfunction placeBoxes(boxes, chartArea, params, stacks) {\n const userPadding = params.padding;\n let {x, y} = chartArea;\n\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\n chartArea.x = x;\n chartArea.y = y;\n}\n\n/**\n * @interface LayoutItem\n * @typedef {object} LayoutItem\n * @prop {string} position - The position of the item in the chart layout. Possible values are\n * 'left', 'top', 'right', 'bottom', and 'chartArea'\n * @prop {number} weight - The weight used to sort the item. Higher weights are further away from the chart area\n * @prop {boolean} fullSize - if true, and the item is horizontal, then push vertical boxes down\n * @prop {function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom)\n * @prop {function} update - Takes two parameters: width and height. Returns size of item\n * @prop {function} draw - Draws the element\n * @prop {function} [getPadding] - Returns an object with padding on the edges\n * @prop {number} width - Width of item. Must be valid after update()\n * @prop {number} height - Height of item. Must be valid after update()\n * @prop {number} left - Left edge of the item. Set by layout system and cannot be used in update\n * @prop {number} top - Top edge of the item. Set by layout system and cannot be used in update\n * @prop {number} right - Right edge of the item. Set by layout system and cannot be used in update\n * @prop {number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update\n */\n\n// The layout service is very self explanatory. It's responsible for the layout within a chart.\n// Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need\n// It is this service's responsibility of carrying out that layout.\nexport default {\n\n /**\n\t * Register a box to a chart.\n\t * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title.\n\t * @param {Chart} chart - the chart to use\n\t * @param {LayoutItem} item - the item to add to be laid out\n\t */\n addBox(chart, item) {\n if (!chart.boxes) {\n chart.boxes = [];\n }\n\n // initialize item with default values\n item.fullSize = item.fullSize || false;\n item.position = item.position || 'top';\n item.weight = item.weight || 0;\n // @ts-ignore\n item._layers = item._layers || function() {\n return [{\n z: 0,\n draw(chartArea) {\n item.draw(chartArea);\n }\n }];\n };\n\n chart.boxes.push(item);\n },\n\n /**\n\t * Remove a layoutItem from a chart\n\t * @param {Chart} chart - the chart to remove the box from\n\t * @param {LayoutItem} layoutItem - the item to remove from the layout\n\t */\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\n /**\n\t * Sets (or updates) options on the given `item`.\n\t * @param {Chart} chart - the chart in which the item lives (or will be added to)\n\t * @param {LayoutItem} item - the item to configure with the given options\n\t * @param {object} options - the new item options.\n\t */\n configure(chart, item, options) {\n item.fullSize = options.fullSize;\n item.position = options.position;\n item.weight = options.weight;\n },\n\n /**\n\t * Fits boxes of the given chart into the given size by having each box measure itself\n\t * then running a fitting algorithm\n\t * @param {Chart} chart - the chart\n\t * @param {number} width - the width to fit into\n\t * @param {number} height - the height to fit into\n * @param {number} minPadding - minimum padding required for each side of chart area\n\t */\n update(chart, width, height, minPadding) {\n if (!chart) {\n return;\n }\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\n // Before any changes are made, notify boxes that an update is about to being\n // This is used to clear any cached data (e.g. scale limits)\n each(chart.boxes, box => {\n if (typeof box.beforeLayout === 'function') {\n box.beforeLayout();\n }\n });\n\n // Essentially we now have any number of boxes on each of the 4 sides.\n // Our canvas looks like the following.\n // The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and\n // B1 is the bottom axis\n // There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays\n // These locations are single-box locations only, when trying to register a chartArea location that is already taken,\n // an error will be thrown.\n //\n // |----------------------------------------------------|\n // | T1 (Full Width) |\n // |----------------------------------------------------|\n // | | | T2 | |\n // | |----|-------------------------------------|----|\n // | | | C1 | | C2 | |\n // | | |----| |----| |\n // | | | | |\n // | L1 | L2 | ChartArea (C0) | R1 |\n // | | | | |\n // | | |----| |----| |\n // | | | C3 | | C4 | |\n // | |----|-------------------------------------|----|\n // | | | B1 | |\n // |----------------------------------------------------|\n // | B2 (Full Width) |\n // |----------------------------------------------------|\n //\n\n const visibleVerticalBoxCount = verticalBoxes.reduce((total, wrap) =>\n wrap.box.options && wrap.box.options.display === false ? total : total + 1, 0) || 1;\n\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\n const stacks = setLayoutDims(verticalBoxes.concat(horizontalBoxes), params);\n\n // First fit the fullSize boxes, to reduce probability of re-fitting.\n fitBoxes(boxes.fullSize, chartArea, params, stacks);\n\n // Then fit vertical boxes\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n\n // Then fit horizontal boxes\n if (fitBoxes(horizontalBoxes, chartArea, params, stacks)) {\n // if the area changed, re-fit vertical boxes\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n }\n\n handleMaxPadding(chartArea);\n\n // Finally place the boxes to correct coordinates\n placeBoxes(boxes.leftAndTop, chartArea, params, stacks);\n\n // Move to opposite side of chart\n chartArea.x += chartArea.w;\n chartArea.y += chartArea.h;\n\n placeBoxes(boxes.rightAndBottom, chartArea, params, stacks);\n\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\n // Finally update boxes in chartArea (radial scale for example)\n each(boxes.chartArea, (layout) => {\n const box = layout.box;\n Object.assign(box, chart.chartArea);\n box.update(chartArea.w, chartArea.h, {left: 0, top: 0, right: 0, bottom: 0});\n });\n }\n};\n","\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\n/**\n * Abstract class that allows abstracting platform dependencies away from the chart.\n */\nexport default class BasePlatform {\n /**\n\t * Called at chart construction time, returns a context2d instance implementing\n\t * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}.\n\t * @param {HTMLCanvasElement} canvas - The canvas from which to acquire context (platform specific)\n\t * @param {number} [aspectRatio] - The chart options\n\t */\n acquireContext(canvas, aspectRatio) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Called at chart destruction time, releases any resources associated to the context\n\t * previously returned by the acquireContext() method.\n\t * @param {CanvasRenderingContext2D} context - The context2d instance\n\t * @returns {boolean} true if the method succeeded, else false\n\t */\n releaseContext(context) { // eslint-disable-line no-unused-vars\n return false;\n }\n\n /**\n\t * Registers the specified listener on the given chart.\n\t * @param {Chart} chart - Chart from which to listen for event\n\t * @param {string} type - The ({@link ChartEvent}) type to listen for\n\t * @param {function} listener - Receives a notification (an object that implements\n\t * the {@link ChartEvent} interface) when an event of the specified type occurs.\n\t */\n addEventListener(chart, type, listener) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Removes the specified listener previously registered with addEventListener.\n\t * @param {Chart} chart - Chart from which to remove the listener\n\t * @param {string} type - The ({@link ChartEvent}) type to remove\n\t * @param {function} listener - The listener function to remove from the event target.\n\t */\n removeEventListener(chart, type, listener) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * @returns {number} the current devicePixelRatio of the device this platform is connected to.\n\t */\n getDevicePixelRatio() {\n return 1;\n }\n\n /**\n\t * Returns the maximum size in pixels of given canvas element.\n\t * @param {HTMLCanvasElement} element\n\t * @param {number} [width] - content width of parent element\n\t * @param {number} [height] - content height of parent element\n\t * @param {number} [aspectRatio] - aspect ratio to maintain\n\t */\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\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @returns {boolean} true if the canvas is attached to the platform, false if not.\n\t */\n isAttached(canvas) { // eslint-disable-line no-unused-vars\n return true;\n }\n\n /**\n * Updates config with platform specific requirements\n * @param {import('../core/core.config.js').default} config\n */\n updateConfig(config) { // eslint-disable-line no-unused-vars\n // no-op\n }\n}\n","/**\n * Platform fallback implementation (minimal).\n * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939\n */\n\nimport BasePlatform from './platform.base.js';\n\n/**\n * Platform class for charts without access to the DOM or to many element properties\n * This platform is used by default for any chart passed an OffscreenCanvas.\n * @extends BasePlatform\n */\nexport default class BasicPlatform extends BasePlatform {\n acquireContext(item) {\n // To prevent canvas fingerprinting, some add-ons undefine the getContext\n // method, for example: https://github.com/kkapsner/CanvasBlocker\n // https://github.com/chartjs/Chart.js/issues/2807\n return item && item.getContext && item.getContext('2d') || null;\n }\n updateConfig(config) {\n config.options.animation = false;\n }\n}\n","/**\n * Chart.Platform implementation for targeting a web browser\n */\n\nimport BasePlatform from './platform.base.js';\nimport {_getParentNode, getRelativePosition, supportsEventListenerOptions, readUsedSize, getMaximumSize} from '../helpers/helpers.dom.js';\nimport {throttled} from '../helpers/helpers.extras.js';\nimport {isNullOrUndef} from '../helpers/helpers.core.js';\n\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\nconst EXPANDO_KEY = '$chartjs';\n\n/**\n * DOM event types -> Chart.js event types.\n * Note: only events with different types are mapped.\n * @see https://developer.mozilla.org/en-US/docs/Web/Events\n */\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};\n\nconst isNullOrEmpty = value => value === null || value === '';\n/**\n * Initializes the canvas style and render size without modifying the canvas display size,\n * since responsiveness is handled by the controller.resize() method. The config is used\n * to determine the aspect ratio to apply in case no explicit height has been specified.\n * @param {HTMLCanvasElement} canvas\n * @param {number} [aspectRatio]\n */\nfunction initCanvas(canvas, aspectRatio) {\n const style = canvas.style;\n\n // NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it\n // returns null or '' if no explicit value has been set to the canvas attribute.\n const renderHeight = canvas.getAttribute('height');\n const renderWidth = canvas.getAttribute('width');\n\n // Chart.js modifies some canvas values that we want to restore on destroy\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\n // Force canvas to display as block to avoid extra space caused by inline\n // elements, which would interfere with the responsive resize process.\n // https://github.com/chartjs/Chart.js/issues/2538\n style.display = style.display || 'block';\n // Include possible borders in the size\n style.boxSizing = style.boxSizing || 'border-box';\n\n if (isNullOrEmpty(renderWidth)) {\n const displayWidth = readUsedSize(canvas, 'width');\n if (displayWidth !== undefined) {\n canvas.width = displayWidth;\n }\n }\n\n if (isNullOrEmpty(renderHeight)) {\n if (canvas.style.height === '') {\n // If no explicit render height and style height, let's apply the aspect ratio,\n // which one can be specified by the user but also by charts as default option\n // (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2.\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\n return canvas;\n}\n\n// Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events.\n// https://github.com/chartjs/Chart.js/issues/4287\nconst eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false;\n\nfunction addListener(node, type, listener) {\n node.addEventListener(type, listener, eventListenerOptions);\n}\n\nfunction removeListener(chart, type, listener) {\n chart.canvas.removeEventListener(type, listener, eventListenerOptions);\n}\n\nfunction fromNativeEvent(event, chart) {\n const type = EVENT_TYPES[event.type] || event.type;\n const {x, y} = getRelativePosition(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}\n\nfunction nodeListContains(nodeList, canvas) {\n for (const node of nodeList) {\n if (node === canvas || node.contains(canvas)) {\n return true;\n }\n }\n}\n\nfunction createAttachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver(entries => {\n let trigger = false;\n for (const entry of entries) {\n trigger = trigger || nodeListContains(entry.addedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.removedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {childList: true, subtree: true});\n return observer;\n}\n\nfunction createDetachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver(entries => {\n let trigger = false;\n for (const entry of entries) {\n trigger = trigger || nodeListContains(entry.removedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.addedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {childList: true, subtree: true});\n return observer;\n}\n\nconst drpListeningCharts = new Map();\nlet oldDevicePixelRatio = 0;\n\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}\n\nfunction listenDevicePixelRatioChanges(chart, resize) {\n if (!drpListeningCharts.size) {\n window.addEventListener('resize', onWindowResize);\n }\n drpListeningCharts.set(chart, resize);\n}\n\nfunction unlistenDevicePixelRatioChanges(chart) {\n drpListeningCharts.delete(chart);\n if (!drpListeningCharts.size) {\n window.removeEventListener('resize', onWindowResize);\n }\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 // If the container size shrank during chart resize, let's assume\n // scrollbar appeared. So we resize again with the scrollbar visible -\n // effectively making chart smaller and the scrollbar hidden again.\n // Because we are inside `throttled`, and currently `ticking`, scroll\n // events are ignored during this whole 2 resize process.\n // If we assumed wrong and something else happened, we are resizing\n // twice in a frame (potential performance issue)\n listener();\n }\n }, window);\n\n // @ts-ignore until https://github.com/microsoft/TypeScript/issues/37861 implemented\n const observer = new ResizeObserver(entries => {\n const entry = entries[0];\n const width = entry.contentRect.width;\n const height = entry.contentRect.height;\n // When its container's display is set to 'none' the callback will be called with a\n // size of (0, 0), which will cause the chart to lose its original height, so skip\n // resizing in such case.\n if (width === 0 && height === 0) {\n return;\n }\n resize(width, height);\n });\n observer.observe(container);\n listenDevicePixelRatioChanges(chart, resize);\n\n return observer;\n}\n\nfunction releaseObserver(chart, type, observer) {\n if (observer) {\n observer.disconnect();\n }\n if (type === 'resize') {\n unlistenDevicePixelRatioChanges(chart);\n }\n}\n\nfunction createProxyAndListen(chart, type, listener) {\n const canvas = chart.canvas;\n const proxy = throttled((event) => {\n // This case can occur if the chart is destroyed while waiting\n // for the throttled function to occur. We prevent crashes by checking\n // for a destroyed chart\n if (chart.ctx !== null) {\n listener(fromNativeEvent(event, chart));\n }\n }, chart);\n\n addListener(canvas, type, proxy);\n\n return proxy;\n}\n\n/**\n * Platform class for charts that can access the DOM and global window/document properties\n * @extends BasePlatform\n */\nexport default class DomPlatform extends BasePlatform {\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @param {number} [aspectRatio]\n\t * @return {CanvasRenderingContext2D|null}\n\t */\n acquireContext(canvas, aspectRatio) {\n // To prevent canvas fingerprinting, some add-ons undefine the getContext\n // method, for example: https://github.com/kkapsner/CanvasBlocker\n // https://github.com/chartjs/Chart.js/issues/2807\n const context = canvas && canvas.getContext && canvas.getContext('2d');\n\n // `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the canvas is\n // inside an iframe or when running in a protected environment. We could guess the\n // types from their toString() value but let's keep things flexible and assume it's\n // a sufficient condition if the canvas has a context2D which has canvas as `canvas`.\n // https://github.com/chartjs/Chart.js/issues/3887\n // https://github.com/chartjs/Chart.js/issues/4102\n // https://github.com/chartjs/Chart.js/issues/4152\n if (context && context.canvas === canvas) {\n // Load platform resources on first chart creation, to make it possible to\n // import the library before setting platform options.\n initCanvas(canvas, aspectRatio);\n return context;\n }\n\n return null;\n }\n\n /**\n\t * @param {CanvasRenderingContext2D} context\n\t */\n releaseContext(context) {\n const canvas = context.canvas;\n if (!canvas[EXPANDO_KEY]) {\n return false;\n }\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\n const style = initial.style || {};\n Object.keys(style).forEach((key) => {\n canvas.style[key] = style[key];\n });\n\n // The canvas render size might have been changed (and thus the state stack discarded),\n // we can't use save() and restore() to restore the initial state. So make sure that at\n // least the canvas context is reset to the default state by setting the canvas width.\n // https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html\n // eslint-disable-next-line no-self-assign\n canvas.width = canvas.width;\n\n delete canvas[EXPANDO_KEY];\n return true;\n }\n\n /**\n\t *\n\t * @param {Chart} chart\n\t * @param {string} type\n\t * @param {function} listener\n\t */\n addEventListener(chart, type, listener) {\n // Can have only one listener per type, so make sure previous is removed\n this.removeEventListener(chart, type);\n\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\n\n /**\n\t * @param {Chart} chart\n\t * @param {string} type\n\t */\n removeEventListener(chart, type) {\n const proxies = chart.$proxies || (chart.$proxies = {});\n const proxy = proxies[type];\n\n if (!proxy) {\n return;\n }\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\n getDevicePixelRatio() {\n return window.devicePixelRatio;\n }\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @param {number} [width] - content width of parent element\n\t * @param {number} [height] - content height of parent element\n\t * @param {number} [aspectRatio] - aspect ratio to maintain\n\t */\n getMaximumSize(canvas, width, height, aspectRatio) {\n return getMaximumSize(canvas, width, height, aspectRatio);\n }\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t */\n isAttached(canvas) {\n const container = _getParentNode(canvas);\n return !!(container && container.isConnected);\n }\n}\n","import {_isDomSupported} from '../helpers/index.js';\nimport BasePlatform from './platform.base.js';\nimport BasicPlatform from './platform.basic.js';\nimport DomPlatform from './platform.dom.js';\n\nexport function _detectPlatform(canvas) {\n if (!_isDomSupported() || (typeof OffscreenCanvas !== 'undefined' && canvas instanceof OffscreenCanvas)) {\n return BasicPlatform;\n }\n return DomPlatform;\n}\n\nexport {BasePlatform, BasicPlatform, DomPlatform};\n","import type {AnyObject} from '../types/basic.js';\nimport type {Point} from '../types/geometric.js';\nimport type {Animation} from '../types/animation.js';\nimport {isNumber} from '../helpers/helpers.math.js';\n\nexport default class Element {\n\n static defaults = {};\n static defaultRoutes = undefined;\n\n x: number;\n y: number;\n active = false;\n options: O;\n $animations: Record;\n\n tooltipPosition(useFinalPosition: boolean): Point {\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return {x, y} as Point;\n }\n\n hasValue() {\n return isNumber(this.x) && isNumber(this.y);\n }\n\n /**\n * Gets the current or final value of each prop. Can return extra properties (whole object).\n * @param props - properties to get\n * @param [final] - get the final value (animation target)\n */\n getProps

(props: P, final?: boolean): Pick;\n getProps

(props: P[], final?: boolean): Partial>;\n getProps(props: string[], final?: boolean): Partial> {\n const anims = this.$animations;\n if (!final || !anims) {\n // let's not create an object, if not needed\n return this as Record;\n }\n const ret: Record = {};\n props.forEach((prop) => {\n ret[prop] = anims[prop] && anims[prop].active() ? anims[prop]._to : this[prop as string];\n });\n return ret;\n }\n}\n","import {isNullOrUndef, valueOrDefault} from '../helpers/helpers.core.js';\nimport {_factorize} from '../helpers/helpers.math.js';\n\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef {{value:number | string, label?:string, major?:boolean, $context?:any}} Tick\n */\n\n/**\n * Returns a subset of ticks to be plotted to avoid overlapping labels.\n * @param {import('./core.scale.js').default} scale\n * @param {Tick[]} ticks\n * @return {Tick[]}\n * @private\n */\nexport function autoSkip(scale, ticks) {\n const tickOpts = scale.options.ticks;\n const determinedMaxTicks = determineMaxTicks(scale);\n const ticksLimit = Math.min(tickOpts.maxTicksLimit || determinedMaxTicks, determinedMaxTicks);\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\n // If there are too many major ticks to display them all\n if (numMajorIndices > ticksLimit) {\n skipMajors(ticks, newTicks, majorIndices, numMajorIndices / ticksLimit);\n return newTicks;\n }\n\n const spacing = calculateSpacing(majorIndices, ticks, ticksLimit);\n\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}\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}\n\n/**\n * @param {number[]} majorIndices\n * @param {Tick[]} ticks\n * @param {number} ticksLimit\n */\nfunction calculateSpacing(majorIndices, ticks, ticksLimit) {\n const evenMajorSpacing = getEvenSpacing(majorIndices);\n const spacing = ticks.length / ticksLimit;\n\n // If the major ticks are evenly spaced apart, place the minor ticks\n // so that they divide the major ticks into even chunks\n if (!evenMajorSpacing) {\n return Math.max(spacing, 1);\n }\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}\n\n/**\n * @param {Tick[]} ticks\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}\n\n/**\n * @param {Tick[]} ticks\n * @param {Tick[]} newTicks\n * @param {number[]} majorIndices\n * @param {number} spacing\n */\nfunction skipMajors(ticks, newTicks, majorIndices, spacing) {\n let count = 0;\n let next = majorIndices[0];\n let i;\n\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}\n\n/**\n * @param {Tick[]} ticks\n * @param {Tick[]} newTicks\n * @param {number} spacing\n * @param {number} [majorStart]\n * @param {number} [majorEnd]\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\n spacing = Math.ceil(spacing);\n if (majorEnd) {\n length = majorEnd - majorStart;\n spacing = length / Math.floor(length / spacing);\n }\n\n next = start;\n\n while (next < 0) {\n count++;\n next = Math.round(start + count * spacing);\n }\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}\n\n\n/**\n * @param {number[]} arr\n */\nfunction getEvenSpacing(arr) {\n const len = arr.length;\n let i, diff;\n\n if (len < 2) {\n return false;\n }\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","import Element from './core.element.js';\nimport {_alignPixel, _measureText, renderText, clipArea, unclipArea} from '../helpers/helpers.canvas.js';\nimport {callback as call, each, finiteOrDefault, isArray, isFinite, isNullOrUndef, isObject, valueOrDefault} from '../helpers/helpers.core.js';\nimport {toDegrees, toRadians, _int16Range, _limitValue, HALF_PI} from '../helpers/helpers.math.js';\nimport {_alignStartEnd, _toLeftRightCenter} from '../helpers/helpers.extras.js';\nimport {createContext, toFont, toPadding, _addGrace} from '../helpers/helpers.options.js';\nimport {autoSkip} from './core.scale.autoskip.js';\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;\nconst getTicksLimit = (ticksLength, maxTicksLimit) => Math.min(maxTicksLimit || ticksLength, ticksLength);\n\n/**\n * @typedef { import('../types/index.js').Chart } Chart\n * @typedef {{value:number | string, label?:string, major?:boolean, $context?:any}} Tick\n */\n\n/**\n * Returns a new array containing numItems from arr\n * @param {any[]} arr\n * @param {number} numItems\n */\nfunction sample(arr, numItems) {\n const result = [];\n const increment = arr.length / numItems;\n const len = arr.length;\n let i = 0;\n\n for (; i < len; i += increment) {\n result.push(arr[Math.floor(i)]);\n }\n return result;\n}\n\n/**\n * @param {Scale} scale\n * @param {number} index\n * @param {boolean} offsetGridLines\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; // 1e-6 is margin in pixels for accumulated error.\n let lineValue = scale.getPixelForTick(validIndex);\n let offset;\n\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\n // Return undefined if the pixel is out of the range\n if (lineValue < start - epsilon || lineValue > end + epsilon) {\n return;\n }\n }\n return lineValue;\n}\n\n/**\n * @param {object} caches\n * @param {number} length\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}\n\n/**\n * @param {object} options\n */\nfunction getTickMarkLength(options) {\n return options.drawTicks ? options.tickLength : 0;\n}\n\n/**\n * @param {object} options\n */\nfunction getTitleHeight(options, fallback) {\n if (!options.display) {\n return 0;\n }\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\n return (lines * font.lineHeight) + padding.height;\n}\n\nfunction createScaleContext(parent, scale) {\n return createContext(parent, {\n scale,\n type: 'scale'\n });\n}\n\nfunction createTickContext(parent, index, tick) {\n return createContext(parent, {\n tick,\n index,\n type: 'tick'\n });\n}\n\nfunction titleAlign(align, position, reverse) {\n /** @type {CanvasTextAlign} */\n let ret = _toLeftRightCenter(align);\n if ((reverse && position !== 'right') || (!reverse && position === 'right')) {\n ret = reverseAlign(ret);\n }\n return ret;\n}\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\n if (scale.isHorizontal()) {\n titleX = _alignStartEnd(align, left, right);\n\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}\n\nexport default class Scale extends Element {\n\n // eslint-disable-next-line max-statements\n constructor(cfg) {\n super();\n\n /** @type {string} */\n this.id = cfg.id;\n /** @type {string} */\n this.type = cfg.type;\n /** @type {any} */\n this.options = undefined;\n /** @type {CanvasRenderingContext2D} */\n this.ctx = cfg.ctx;\n /** @type {Chart} */\n this.chart = cfg.chart;\n\n // implements box\n /** @type {number} */\n this.top = undefined;\n /** @type {number} */\n this.bottom = undefined;\n /** @type {number} */\n this.left = undefined;\n /** @type {number} */\n this.right = undefined;\n /** @type {number} */\n this.width = undefined;\n /** @type {number} */\n this.height = undefined;\n this._margins = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n };\n /** @type {number} */\n this.maxWidth = undefined;\n /** @type {number} */\n this.maxHeight = undefined;\n /** @type {number} */\n this.paddingTop = undefined;\n /** @type {number} */\n this.paddingBottom = undefined;\n /** @type {number} */\n this.paddingLeft = undefined;\n /** @type {number} */\n this.paddingRight = undefined;\n\n // scale-specific properties\n /** @type {string=} */\n this.axis = undefined;\n /** @type {number=} */\n this.labelRotation = undefined;\n this.min = undefined;\n this.max = undefined;\n this._range = undefined;\n /** @type {Tick[]} */\n this.ticks = [];\n /** @type {object[]|null} */\n this._gridLineItems = null;\n /** @type {object[]|null} */\n this._labelItems = null;\n /** @type {object|null} */\n this._labelSizes = null;\n this._length = 0;\n this._maxLength = 0;\n this._longestTextCache = {};\n /** @type {number} */\n this._startPixel = undefined;\n /** @type {number} */\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\n /**\n\t * @param {any} options\n\t * @since 3.0\n\t */\n init(options) {\n this.options = options.setContext(this.getContext());\n\n this.axis = options.axis;\n\n // parse min/max value, so we can properly determine min/max for other scales\n this._userMin = this.parse(options.min);\n this._userMax = this.parse(options.max);\n this._suggestedMin = this.parse(options.suggestedMin);\n this._suggestedMax = this.parse(options.suggestedMax);\n }\n\n /**\n\t * Parse a supported input value to internal representation.\n\t * @param {*} raw\n\t * @param {number} [index]\n\t * @since 3.0\n\t */\n parse(raw, index) { // eslint-disable-line no-unused-vars\n return raw;\n }\n\n /**\n\t * @return {{min: number, max: number, minDefined: boolean, maxDefined: boolean}}\n\t * @protected\n\t * @since 3.0\n\t */\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: isFinite(_userMin),\n maxDefined: isFinite(_userMax)\n };\n }\n\n /**\n\t * @param {boolean} canStack\n\t * @return {{min: number, max: number}}\n\t * @protected\n\t * @since 3.0\n\t */\n getMinMax(canStack) {\n // eslint-disable-next-line prefer-const\n let {min, max, minDefined, maxDefined} = this.getUserBounds();\n let range;\n\n if (minDefined && maxDefined) {\n return {min, max};\n }\n\n const metas = this.getMatchingVisibleMetas();\n for (let i = 0, ilen = metas.length; i < ilen; ++i) {\n range = metas[i].controller.getMinMax(this, 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\n // Make sure min <= max when only min or max is defined by user and the data is outside that range\n min = maxDefined && min > max ? max : min;\n max = minDefined && min > max ? min : max;\n\n return {\n min: finiteOrDefault(min, finiteOrDefault(max, min)),\n max: finiteOrDefault(max, finiteOrDefault(min, max))\n };\n }\n\n /**\n\t * Get the padding needed for the scale\n\t * @return {{top: number, left: number, bottom: number, right: number}} the necessary padding\n\t * @private\n\t */\n getPadding() {\n return {\n left: this.paddingLeft || 0,\n top: this.paddingTop || 0,\n right: this.paddingRight || 0,\n bottom: this.paddingBottom || 0\n };\n }\n\n /**\n\t * Returns the scale tick objects\n\t * @return {Tick[]}\n\t * @since 2.7\n\t */\n getTicks() {\n return this.ticks;\n }\n\n /**\n\t * @return {string[]}\n\t */\n getLabels() {\n const data = this.chart.data;\n return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || [];\n }\n\n /**\n * @return {import('../types.js').LabelItem[]}\n */\n getLabelItems(chartArea = this.chart.chartArea) {\n const items = this._labelItems || (this._labelItems = this._computeLabelItems(chartArea));\n return items;\n }\n\n // When a new layout is created, reset the data limits cache\n beforeLayout() {\n this._cache = {};\n this._dataLimitsCached = false;\n }\n\n // These methods are ordered by lifecycle. Utilities then follow.\n // Any function defined here is inherited by all scale types.\n // Any function can be extended by the scale type\n\n beforeUpdate() {\n call(this.options.beforeUpdate, [this]);\n }\n\n /**\n\t * @param {number} maxWidth - the max width in pixels\n\t * @param {number} maxHeight - the max height in pixels\n\t * @param {{top: number, left: number, bottom: number, right: number}} margins - the space between the edge of the other scales and edge of the chart\n\t * This space comes from two sources:\n\t * - padding - space that's required to show the labels at the edges of the scale\n\t * - thickness of scales or legends in another orientation\n\t */\n update(maxWidth, maxHeight, margins) {\n const {beginAtZero, grace, ticks: tickOpts} = this.options;\n const sampleSize = tickOpts.sampleSize;\n\n // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n this.beforeUpdate();\n\n // Absorb the master measurements\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins = Object.assign({\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n }, margins);\n\n this.ticks = null;\n this._labelSizes = null;\n this._gridLineItems = null;\n this._labelItems = null;\n\n // Dimensions\n this.beforeSetDimensions();\n this.setDimensions();\n this.afterSetDimensions();\n\n this._maxLength = this.isHorizontal()\n ? this.width + margins.left + margins.right\n : this.height + margins.top + margins.bottom;\n\n // Data min/max\n if (!this._dataLimitsCached) {\n this.beforeDataLimits();\n this.determineDataLimits();\n this.afterDataLimits();\n this._range = _addGrace(this, grace, beginAtZero);\n this._dataLimitsCached = true;\n }\n\n this.beforeBuildTicks();\n\n this.ticks = this.buildTicks() || [];\n\n // Allow modification of ticks in callback.\n this.afterBuildTicks();\n\n // Compute tick rotation and fit using a sampled subset of labels\n // We generally don't need to compute the size of every single label for determining scale size\n const samplingEnabled = sampleSize < this.ticks.length;\n this._convertTicksToLabels(samplingEnabled ? sample(this.ticks, sampleSize) : this.ticks);\n\n // configure is called twice, once here, once from core.controller.updateLayout.\n // Here we haven't been positioned yet, but dimensions are correct.\n // Variables set in configure are needed for calculateLabelRotation, and\n // it's ok that coordinates are not correct there, only dimensions matter.\n this.configure();\n\n // Tick Rotation\n this.beforeCalculateLabelRotation();\n this.calculateLabelRotation(); // Preconditions: number of ticks and sizes of largest labels must be calculated beforehand\n this.afterCalculateLabelRotation();\n\n // Auto-skip\n if (tickOpts.display && (tickOpts.autoSkip || tickOpts.source === 'auto')) {\n this.ticks = autoSkip(this, this.ticks);\n this._labelSizes = null;\n this.afterAutoSkip();\n }\n\n if (samplingEnabled) {\n // Generate labels using all non-skipped ticks\n this._convertTicksToLabels(this.ticks);\n }\n\n this.beforeFit();\n this.fit(); // Preconditions: label rotation and label sizes must be calculated beforehand\n this.afterFit();\n\n // IMPORTANT: after this point, we consider that `this.ticks` will NEVER change!\n\n this.afterUpdate();\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n let reversePixels = this.options.reverse;\n let startPixel, endPixel;\n\n if (this.isHorizontal()) {\n startPixel = this.left;\n endPixel = this.right;\n } else {\n startPixel = this.top;\n endPixel = this.bottom;\n // by default vertical scales are from bottom to top, so pixels are reversed\n reversePixels = !reversePixels;\n }\n this._startPixel = startPixel;\n this._endPixel = endPixel;\n this._reversePixels = reversePixels;\n this._length = endPixel - startPixel;\n this._alignToPixels = this.options.alignToPixels;\n }\n\n afterUpdate() {\n call(this.options.afterUpdate, [this]);\n }\n\n //\n\n beforeSetDimensions() {\n call(this.options.beforeSetDimensions, [this]);\n }\n setDimensions() {\n // Set the unconstrained dimension before label rotation\n if (this.isHorizontal()) {\n // Reset position before calculating rotation\n this.width = this.maxWidth;\n this.left = 0;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n\n // Reset position before calculating rotation\n this.top = 0;\n this.bottom = this.height;\n }\n\n // Reset padding\n this.paddingLeft = 0;\n this.paddingTop = 0;\n this.paddingRight = 0;\n this.paddingBottom = 0;\n }\n afterSetDimensions() {\n call(this.options.afterSetDimensions, [this]);\n }\n\n _callHooks(name) {\n this.chart.notifyPlugins(name, this.getContext());\n call(this.options[name], [this]);\n }\n\n // Data limits\n beforeDataLimits() {\n this._callHooks('beforeDataLimits');\n }\n determineDataLimits() {}\n afterDataLimits() {\n this._callHooks('afterDataLimits');\n }\n\n //\n beforeBuildTicks() {\n this._callHooks('beforeBuildTicks');\n }\n /**\n\t * @return {object[]} the ticks\n\t */\n buildTicks() {\n return [];\n }\n afterBuildTicks() {\n this._callHooks('afterBuildTicks');\n }\n\n beforeTickToLabelConversion() {\n call(this.options.beforeTickToLabelConversion, [this]);\n }\n /**\n\t * Convert ticks to label strings\n\t * @param {Tick[]} ticks\n\t */\n generateTickLabels(ticks) {\n const tickOpts = this.options.ticks;\n let i, ilen, tick;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n tick = ticks[i];\n tick.label = call(tickOpts.callback, [tick.value, i, ticks], this);\n }\n }\n afterTickToLabelConversion() {\n call(this.options.afterTickToLabelConversion, [this]);\n }\n\n //\n\n beforeCalculateLabelRotation() {\n call(this.options.beforeCalculateLabelRotation, [this]);\n }\n calculateLabelRotation() {\n const options = this.options;\n const tickOpts = options.ticks;\n const numTicks = getTicksLimit(this.ticks.length, options.ticks.maxTicksLimit);\n const minRotation = tickOpts.minRotation || 0;\n const maxRotation = tickOpts.maxRotation;\n let labelRotation = minRotation;\n let tickWidth, maxHeight, maxLabelDiagonal;\n\n if (!this._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !this.isHorizontal()) {\n this.labelRotation = minRotation;\n return;\n }\n\n const labelSizes = this._getLabelSizes();\n const maxLabelWidth = labelSizes.widest.width;\n const maxLabelHeight = labelSizes.highest.height;\n\n // Estimate the width of each grid based on the canvas width, the maximum\n // label width and the number of tick intervals\n const maxWidth = _limitValue(this.chart.width - maxLabelWidth, 0, this.maxWidth);\n tickWidth = options.offset ? this.maxWidth / numTicks : maxWidth / (numTicks - 1);\n\n // Allow 3 pixels x2 padding either side for label readability\n if (maxLabelWidth + 6 > tickWidth) {\n tickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1));\n maxHeight = this.maxHeight - getTickMarkLength(options.grid)\n\t\t\t\t- tickOpts.padding - getTitleHeight(options.title, this.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\n this.labelRotation = labelRotation;\n }\n afterCalculateLabelRotation() {\n call(this.options.afterCalculateLabelRotation, [this]);\n }\n afterAutoSkip() {}\n\n //\n\n beforeFit() {\n call(this.options.beforeFit, [this]);\n }\n fit() {\n // Reset\n const minSize = {\n width: 0,\n height: 0\n };\n\n const {chart, options: {ticks: tickOpts, title: titleOpts, grid: gridOpts}} = this;\n const display = this._isVisible();\n const isHorizontal = this.isHorizontal();\n\n if (display) {\n const titleHeight = getTitleHeight(titleOpts, chart.options.font);\n if (isHorizontal) {\n minSize.width = this.maxWidth;\n minSize.height = getTickMarkLength(gridOpts) + titleHeight;\n } else {\n minSize.height = this.maxHeight; // fill all the height\n minSize.width = getTickMarkLength(gridOpts) + titleHeight;\n }\n\n // Don't bother fitting the ticks if we are not showing the labels\n if (tickOpts.display && this.ticks.length) {\n const {first, last, widest, highest} = this._getLabelSizes();\n const tickPadding = tickOpts.padding * 2;\n const angleRadians = toRadians(this.labelRotation);\n const cos = Math.cos(angleRadians);\n const sin = Math.sin(angleRadians);\n\n if (isHorizontal) {\n // A horizontal axis is more constrained by the height.\n const labelHeight = tickOpts.mirror ? 0 : sin * widest.width + cos * highest.height;\n minSize.height = Math.min(this.maxHeight, minSize.height + labelHeight + tickPadding);\n } else {\n // A vertical axis is more constrained by the width. Labels are the\n // dominant factor here, so get that length first and account for padding\n const labelWidth = tickOpts.mirror ? 0 : cos * widest.width + sin * highest.height;\n\n minSize.width = Math.min(this.maxWidth, minSize.width + labelWidth + tickPadding);\n }\n this._calculatePadding(first, last, sin, cos);\n }\n }\n\n this._handleMargins();\n\n if (isHorizontal) {\n this.width = this._length = chart.width - this._margins.left - this._margins.right;\n this.height = minSize.height;\n } else {\n this.width = minSize.width;\n this.height = this._length = chart.height - this._margins.top - this._margins.bottom;\n }\n }\n\n _calculatePadding(first, last, sin, cos) {\n const {ticks: {align, padding}, position} = this.options;\n const isRotated = this.labelRotation !== 0;\n const labelsBelowTicks = position !== 'top' && this.axis === 'x';\n\n if (this.isHorizontal()) {\n const offsetLeft = this.getPixelForTick(0) - this.left;\n const offsetRight = this.right - this.getPixelForTick(this.ticks.length - 1);\n let paddingLeft = 0;\n let paddingRight = 0;\n\n // Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned\n // which means that the right padding is dominated by the font height\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 if (align !== 'inner') {\n paddingLeft = first.width / 2;\n paddingRight = last.width / 2;\n }\n\n // Adjust padding taking into account changes in offsets\n this.paddingLeft = Math.max((paddingLeft - offsetLeft + padding) * this.width / (this.width - offsetLeft), 0);\n this.paddingRight = Math.max((paddingRight - offsetRight + padding) * this.width / (this.width - offsetRight), 0);\n } else {\n let paddingTop = last.height / 2;\n let paddingBottom = first.height / 2;\n\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\n this.paddingTop = paddingTop + padding;\n this.paddingBottom = paddingBottom + padding;\n }\n }\n\n /**\n\t * Handle margins and padding interactions\n\t * @private\n\t */\n _handleMargins() {\n if (this._margins) {\n this._margins.left = Math.max(this.paddingLeft, this._margins.left);\n this._margins.top = Math.max(this.paddingTop, this._margins.top);\n this._margins.right = Math.max(this.paddingRight, this._margins.right);\n this._margins.bottom = Math.max(this.paddingBottom, this._margins.bottom);\n }\n }\n\n afterFit() {\n call(this.options.afterFit, [this]);\n }\n\n // Shared Methods\n /**\n\t * @return {boolean}\n\t */\n isHorizontal() {\n const {axis, position} = this.options;\n return position === 'top' || position === 'bottom' || axis === 'x';\n }\n /**\n\t * @return {boolean}\n\t */\n isFullSize() {\n return this.options.fullSize;\n }\n\n /**\n\t * @param {Tick[]} ticks\n\t * @private\n\t */\n _convertTicksToLabels(ticks) {\n this.beforeTickToLabelConversion();\n\n this.generateTickLabels(ticks);\n\n // Ticks should be skipped when callback returns null or undef, so lets remove those.\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\n this.afterTickToLabelConversion();\n }\n\n /**\n\t * @return {{ first: object, last: object, widest: object, highest: object, widths: Array, heights: array }}\n\t * @private\n\t */\n _getLabelSizes() {\n let labelSizes = this._labelSizes;\n\n if (!labelSizes) {\n const sampleSize = this.options.ticks.sampleSize;\n let ticks = this.ticks;\n if (sampleSize < ticks.length) {\n ticks = sample(ticks, sampleSize);\n }\n\n this._labelSizes = labelSizes = this._computeLabelSizes(ticks, ticks.length, this.options.ticks.maxTicksLimit);\n }\n\n return labelSizes;\n }\n\n /**\n\t * Returns {width, height, offset} objects for the first, last, widest, highest tick\n\t * labels where offset indicates the anchor point offset from the top in pixels.\n\t * @return {{ first: object, last: object, widest: object, highest: object, widths: Array, heights: array }}\n\t * @private\n\t */\n _computeLabelSizes(ticks, length, maxTicksLimit) {\n const {ctx, _longestTextCache: caches} = this;\n const widths = [];\n const heights = [];\n const increment = Math.floor(length / getTicksLimit(length, maxTicksLimit));\n let widestLabelSize = 0;\n let highestLabelSize = 0;\n let i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel;\n\n for (i = 0; i < length; i += increment) {\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 // Undefined labels and arrays should not be measured\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 // if it is an array let's measure each element\n for (j = 0, jlen = label.length; j < jlen; ++j) {\n nestedLabel = /** @type {string} */ (label[j]);\n // Undefined labels and arrays should not be measured\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\n const widest = widths.indexOf(widestLabelSize);\n const highest = heights.indexOf(highestLabelSize);\n\n const valueAt = (idx) => ({width: widths[idx] || 0, height: heights[idx] || 0});\n\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\n /**\n\t * Used to get the label to display in the tooltip for the given value\n\t * @param {*} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n return value;\n }\n\n /**\n\t * Returns the location of the given data point. Value can either be an index or a numerical value\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {*} value\n\t * @param {number} [index]\n\t * @return {number}\n\t */\n getPixelForValue(value, index) { // eslint-disable-line no-unused-vars\n return NaN;\n }\n\n /**\n\t * Used to get the data value from a given pixel. This is the inverse of getPixelForValue\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} pixel\n\t * @return {*}\n\t */\n getValueForPixel(pixel) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Returns the location of the tick at the given index\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} index\n\t * @return {number}\n\t */\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\n /**\n\t * Utility for getting the pixel location of a percentage of scale\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} decimal\n\t * @return {number}\n\t */\n getPixelForDecimal(decimal) {\n if (this._reversePixels) {\n decimal = 1 - decimal;\n }\n\n const pixel = this._startPixel + decimal * this._length;\n return _int16Range(this._alignToPixels ? _alignPixel(this.chart, pixel, 0) : pixel);\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getDecimalForPixel(pixel) {\n const decimal = (pixel - this._startPixel) / this._length;\n return this._reversePixels ? 1 - decimal : decimal;\n }\n\n /**\n\t * Returns the pixel for the minimum chart value\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @return {number}\n\t */\n getBasePixel() {\n return this.getPixelForValue(this.getBaseValue());\n }\n\n /**\n\t * @return {number}\n\t */\n getBaseValue() {\n const {min, max} = this;\n\n return min < 0 && max < 0 ? max :\n min > 0 && max > 0 ? min :\n 0;\n }\n\n /**\n\t * @protected\n\t */\n getContext(index) {\n const ticks = this.ticks || [];\n\n if (index >= 0 && index < ticks.length) {\n const tick = ticks[index];\n return tick.$context ||\n\t\t\t\t(tick.$context = createTickContext(this.getContext(), index, tick));\n }\n return this.$context ||\n\t\t\t(this.$context = createScaleContext(this.chart.getContext(), this));\n }\n\n /**\n\t * @return {number}\n\t * @private\n\t */\n _tickSize() {\n const optionTicks = this.options.ticks;\n\n // Calculate space needed by label in axis direction.\n const rot = toRadians(this.labelRotation);\n const cos = Math.abs(Math.cos(rot));\n const sin = Math.abs(Math.sin(rot));\n\n const labelSizes = this._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\n // Calculate space needed for 1 tick in axis direction.\n return this.isHorizontal()\n ? h * cos > w * sin ? w / cos : h / sin\n : h * sin < w * cos ? h / cos : w / sin;\n }\n\n /**\n\t * @return {boolean}\n\t * @private\n\t */\n _isVisible() {\n const display = this.options.display;\n\n if (display !== 'auto') {\n return !!display;\n }\n\n return this.getMatchingVisibleMetas().length > 0;\n }\n\n /**\n\t * @private\n\t */\n _computeGridLineItems(chartArea) {\n const axis = this.axis;\n const chart = this.chart;\n const options = this.options;\n const {grid, position, border} = options;\n const offset = grid.offset;\n const isHorizontal = this.isHorizontal();\n const ticks = this.ticks;\n const ticksLength = ticks.length + (offset ? 1 : 0);\n const tl = getTickMarkLength(grid);\n const items = [];\n\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = borderOpts.display ? borderOpts.width : 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\n if (position === 'top') {\n borderValue = alignBorderValue(this.bottom);\n ty1 = this.bottom - tl;\n ty2 = borderValue - axisHalfWidth;\n y1 = alignBorderValue(chartArea.top) + axisHalfWidth;\n y2 = chartArea.bottom;\n } else if (position === 'bottom') {\n borderValue = alignBorderValue(this.top);\n y1 = chartArea.top;\n y2 = alignBorderValue(chartArea.bottom) - axisHalfWidth;\n ty1 = borderValue + axisHalfWidth;\n ty2 = this.top + tl;\n } else if (position === 'left') {\n borderValue = alignBorderValue(this.right);\n tx1 = this.right - tl;\n tx2 = borderValue - axisHalfWidth;\n x1 = alignBorderValue(chartArea.left) + axisHalfWidth;\n x2 = chartArea.right;\n } else if (position === 'right') {\n borderValue = alignBorderValue(this.left);\n x1 = chartArea.left;\n x2 = alignBorderValue(chartArea.right) - axisHalfWidth;\n tx1 = borderValue + axisHalfWidth;\n tx2 = this.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(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\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(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\n\n tx1 = borderValue - axisHalfWidth;\n tx2 = tx1 - tl;\n x1 = chartArea.left;\n x2 = chartArea.right;\n }\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 context = this.getContext(i);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n\n const lineWidth = optsAtIndex.lineWidth;\n const lineColor = optsAtIndex.color;\n const borderDash = optsAtIndexBorder.dash || [];\n const borderDashOffset = optsAtIndexBorder.dashOffset;\n\n const tickWidth = optsAtIndex.tickWidth;\n const tickColor = optsAtIndex.tickColor;\n const tickBorderDash = optsAtIndex.tickBorderDash || [];\n const tickBorderDashOffset = optsAtIndex.tickBorderDashOffset;\n\n lineValue = getPixelForGridLine(this, i, offset);\n\n // Skip if the pixel is out of the range\n if (lineValue === undefined) {\n continue;\n }\n\n alignedLineValue = _alignPixel(chart, lineValue, lineWidth);\n\n if (isHorizontal) {\n tx1 = tx2 = x1 = x2 = alignedLineValue;\n } else {\n ty1 = ty2 = y1 = y2 = alignedLineValue;\n }\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\n this._ticksLength = ticksLength;\n this._borderValue = borderValue;\n\n return items;\n }\n\n /**\n\t * @private\n\t */\n _computeLabelItems(chartArea) {\n const axis = this.axis;\n const options = this.options;\n const {position, ticks: optionTicks} = options;\n const isHorizontal = this.isHorizontal();\n const ticks = this.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(this.labelRotation);\n const items = [];\n let i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset;\n let textBaseline = 'middle';\n\n if (position === 'top') {\n y = this.bottom - hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'bottom') {\n y = this.top + hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'left') {\n const ret = this._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (position === 'right') {\n const ret = this._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 = this.chart.scales[positionAxisID].getPixelForValue(value) + tickAndPadding;\n }\n textAlign = this._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 = this.chart.scales[positionAxisID].getPixelForValue(value);\n }\n textAlign = this._getYAxisLabelAlignment(tl).textAlign;\n }\n\n if (axis === 'y') {\n if (align === 'start') {\n textBaseline = 'top';\n } else if (align === 'end') {\n textBaseline = 'bottom';\n }\n }\n\n const labelSizes = this._getLabelSizes();\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n tick = ticks[i];\n label = tick.label;\n\n const optsAtIndex = optionTicks.setContext(this.getContext(i));\n pixel = this.getPixelForTick(i) + optionTicks.labelOffset;\n font = this._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 let tickTextAlign = textAlign;\n\n if (isHorizontal) {\n x = pixel;\n\n if (textAlign === 'inner') {\n if (i === ilen - 1) {\n tickTextAlign = !this.options.reverse ? 'right' : 'left';\n } else if (i === 0) {\n tickTextAlign = !this.options.reverse ? 'left' : 'right';\n } else {\n tickTextAlign = 'center';\n }\n }\n\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 // eslint-disable-next-line no-lonely-if\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 if (rotation !== 0 && !optsAtIndex.showLabelBackdrop) {\n x += (lineHeight / 2) * Math.sin(rotation);\n }\n } else {\n y = pixel;\n textOffset = (1 - lineCount) * lineHeight / 2;\n }\n\n let backdrop;\n\n if (optsAtIndex.showLabelBackdrop) {\n const labelPadding = toPadding(optsAtIndex.backdropPadding);\n const height = labelSizes.heights[i];\n const width = labelSizes.widths[i];\n\n let top = textOffset - labelPadding.top;\n let left = 0 - labelPadding.left;\n\n switch (textBaseline) {\n case 'middle':\n top -= height / 2;\n break;\n case 'bottom':\n top -= height;\n break;\n default:\n break;\n }\n\n switch (textAlign) {\n case 'center':\n left -= width / 2;\n break;\n case 'right':\n left -= width;\n break;\n default:\n break;\n }\n\n backdrop = {\n left,\n top,\n width: width + labelPadding.width,\n height: height + labelPadding.height,\n\n color: optsAtIndex.backdropColor,\n };\n }\n\n items.push({\n label,\n font,\n textOffset,\n options: {\n rotation,\n color,\n strokeColor,\n strokeWidth,\n textAlign: tickTextAlign,\n textBaseline,\n translation: [x, y],\n backdrop,\n }\n });\n }\n\n return items;\n }\n\n _getXAxisLabelAlignment() {\n const {position, ticks} = this.options;\n const rotation = -toRadians(this.labelRotation);\n\n if (rotation) {\n return position === 'top' ? 'left' : 'right';\n }\n\n let align = 'center';\n\n if (ticks.align === 'start') {\n align = 'left';\n } else if (ticks.align === 'end') {\n align = 'right';\n } else if (ticks.align === 'inner') {\n align = 'inner';\n }\n\n return align;\n }\n\n _getYAxisLabelAlignment(tl) {\n const {position, ticks: {crossAlign, mirror, padding}} = this.options;\n const labelSizes = this._getLabelSizes();\n const tickAndPadding = tl + padding;\n const widest = labelSizes.widest.width;\n\n let textAlign;\n let x;\n\n if (position === 'left') {\n if (mirror) {\n x = this.right + padding;\n\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 = this.right - tickAndPadding;\n\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 = this.left;\n }\n }\n } else if (position === 'right') {\n if (mirror) {\n x = this.left + padding;\n\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 = this.left + tickAndPadding;\n\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 = this.right;\n }\n }\n } else {\n textAlign = 'right';\n }\n\n return {textAlign, x};\n }\n\n /**\n\t * @private\n\t */\n _computeLabelArea() {\n if (this.options.ticks.mirror) {\n return;\n }\n\n const chart = this.chart;\n const position = this.options.position;\n\n if (position === 'left' || position === 'right') {\n return {top: 0, left: this.left, bottom: chart.height, right: this.right};\n } if (position === 'top' || position === 'bottom') {\n return {top: this.top, left: 0, bottom: this.bottom, right: chart.width};\n }\n }\n\n /**\n * @protected\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\n getLineWidthForValue(value) {\n const grid = this.options.grid;\n if (!this._isVisible() || !grid.display) {\n return 0;\n }\n const ticks = this.ticks;\n const index = ticks.findIndex(t => t.value === value);\n if (index >= 0) {\n const opts = grid.setContext(this.getContext(index));\n return opts.lineWidth;\n }\n return 0;\n }\n\n /**\n\t * @protected\n\t */\n drawGrid(chartArea) {\n const grid = this.options.grid;\n const ctx = this.ctx;\n const items = this._gridLineItems || (this._gridLineItems = this._computeGridLineItems(chartArea));\n let i, ilen;\n\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\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\n if (grid.display) {\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n const item = items[i];\n\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\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\n /**\n\t * @protected\n\t */\n drawBorder() {\n const {chart, ctx, options: {border, grid}} = this;\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = border.display ? borderOpts.width : 0;\n if (!axisWidth) {\n return;\n }\n const lastLineWidth = grid.setContext(this.getContext(0)).lineWidth;\n const borderValue = this._borderValue;\n let x1, x2, y1, y2;\n\n if (this.isHorizontal()) {\n x1 = _alignPixel(chart, this.left, axisWidth) - axisWidth / 2;\n x2 = _alignPixel(chart, this.right, lastLineWidth) + lastLineWidth / 2;\n y1 = y2 = borderValue;\n } else {\n y1 = _alignPixel(chart, this.top, axisWidth) - axisWidth / 2;\n y2 = _alignPixel(chart, this.bottom, lastLineWidth) + lastLineWidth / 2;\n x1 = x2 = borderValue;\n }\n ctx.save();\n ctx.lineWidth = borderOpts.width;\n ctx.strokeStyle = borderOpts.color;\n\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n\n ctx.restore();\n }\n\n /**\n\t * @protected\n\t */\n drawLabels(chartArea) {\n const optionTicks = this.options.ticks;\n\n if (!optionTicks.display) {\n return;\n }\n\n const ctx = this.ctx;\n\n const area = this._computeLabelArea();\n if (area) {\n clipArea(ctx, area);\n }\n\n const items = this.getLabelItems(chartArea);\n for (const item of items) {\n const renderTextOptions = item.options;\n const tickFont = item.font;\n const label = item.label;\n const y = item.textOffset;\n renderText(ctx, label, 0, y, tickFont, renderTextOptions);\n }\n\n if (area) {\n unclipArea(ctx);\n }\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {\n const {ctx, options: {position, title, reverse}} = this;\n\n if (!title.display) {\n return;\n }\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\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\n const {titleX, titleY, maxWidth, rotation} = titleArgs(this, offset, position, align);\n\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\n draw(chartArea) {\n if (!this._isVisible()) {\n return;\n }\n\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawBorder();\n this.drawTitle();\n this.drawLabels(chartArea);\n }\n\n /**\n\t * @return {object[]}\n\t * @private\n\t */\n _layers() {\n const opts = this.options;\n const tz = opts.ticks && opts.ticks.z || 0;\n const gz = valueOrDefault(opts.grid && opts.grid.z, -1);\n const bz = valueOrDefault(opts.border && opts.border.z, 0);\n\n if (!this._isVisible() || this.draw !== Scale.prototype.draw) {\n // backward compatibility: draw has been overridden by custom scale\n return [{\n z: tz,\n draw: (chartArea) => {\n this.draw(chartArea);\n }\n }];\n }\n\n return [{\n z: gz,\n draw: (chartArea) => {\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawTitle();\n }\n }, {\n z: bz,\n draw: () => {\n this.drawBorder();\n }\n }, {\n z: tz,\n draw: (chartArea) => {\n this.drawLabels(chartArea);\n }\n }];\n }\n\n /**\n\t * Returns visible dataset metas that are attached to this scale\n\t * @param {string} [type] - if specified, also filter by dataset type\n\t * @return {object[]}\n\t */\n getMatchingVisibleMetas(type) {\n const metas = this.chart.getSortedVisibleDatasetMetas();\n const axisID = this.axis + 'AxisID';\n const result = [];\n let i, ilen;\n\n for (i = 0, ilen = metas.length; i < ilen; ++i) {\n const meta = metas[i];\n if (meta[axisID] === this.id && (!type || meta.type === type)) {\n result.push(meta);\n }\n }\n return result;\n }\n\n /**\n\t * @param {number} index\n\t * @return {object}\n\t * @protected\n \t */\n _resolveTickFontOptions(index) {\n const opts = this.options.ticks.setContext(this.getContext(index));\n return toFont(opts.font);\n }\n\n /**\n * @protected\n */\n _maxDigits() {\n const fontSize = this._resolveTickFontOptions(0).lineHeight;\n return (this.isHorizontal() ? this.width : this.height) / fontSize;\n }\n}\n","import {merge} from '../helpers/index.js';\nimport defaults, {overrides} from './core.defaults.js';\n\n/**\n * @typedef {{id: string, defaults: any, overrides?: any, defaultRoutes: any}} IChartComponent\n */\n\nexport default class 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\n isForType(type) {\n return Object.prototype.isPrototypeOf.call(this.type.prototype, type.prototype);\n }\n\n /**\n\t * @param {IChartComponent} item\n\t * @returns {string} The scope where items defaults were registered to.\n\t */\n register(item) {\n const proto = Object.getPrototypeOf(item);\n let parentScope;\n\n if (isIChartComponent(proto)) {\n // Make sure the parent is registered and note the scope where its defaults are.\n parentScope = this.register(proto);\n }\n\n const items = this.items;\n const id = item.id;\n const scope = this.scope + '.' + id;\n\n if (!id) {\n throw new Error('class does not have id: ' + item);\n }\n\n if (id in items) {\n // already registered\n return scope;\n }\n\n items[id] = item;\n registerDefaults(item, scope, parentScope);\n if (this.override) {\n defaults.override(item.id, item.overrides);\n }\n\n return scope;\n }\n\n /**\n\t * @param {string} id\n\t * @returns {object?}\n\t */\n get(id) {\n return this.items[id];\n }\n\n /**\n\t * @param {IChartComponent} item\n\t */\n unregister(item) {\n const items = this.items;\n const id = item.id;\n const scope = this.scope;\n\n if (id in items) {\n delete items[id];\n }\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}\n\nfunction registerDefaults(item, scope, parentScope) {\n // Inherit the parent's defaults and keep existing defaults\n const itemDefaults = merge(Object.create(null), [\n parentScope ? defaults.get(parentScope) : {},\n defaults.get(scope),\n item.defaults\n ]);\n\n defaults.set(scope, itemDefaults);\n\n if (item.defaultRoutes) {\n routeDefaults(scope, item.defaultRoutes);\n }\n\n if (item.descriptors) {\n defaults.describe(scope, item.descriptors);\n }\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}\n\nfunction isIChartComponent(proto) {\n return 'id' in proto && 'defaults' in proto;\n}\n","import DatasetController from './core.datasetController.js';\nimport Element from './core.element.js';\nimport Scale from './core.scale.js';\nimport TypedRegistry from './core.typedRegistry.js';\nimport {each, callback as call, _capitalize} from '../helpers/helpers.core.js';\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is exported for typedoc\n */\nexport class 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 // Order is important, Scale has Element in prototype chain,\n // so Scales must be before Elements. Plugins are a fallback, so not listed here.\n this._typedRegistries = [this.controllers, this.scales, this.elements];\n }\n\n /**\n\t * @param {...any} args\n\t */\n add(...args) {\n this._each('register', args);\n }\n\n remove(...args) {\n this._each('unregister', args);\n }\n\n /**\n\t * @param {...typeof DatasetController} args\n\t */\n addControllers(...args) {\n this._each('register', args, this.controllers);\n }\n\n /**\n\t * @param {...typeof Element} args\n\t */\n addElements(...args) {\n this._each('register', args, this.elements);\n }\n\n /**\n\t * @param {...any} args\n\t */\n addPlugins(...args) {\n this._each('register', args, this.plugins);\n }\n\n /**\n\t * @param {...typeof Scale} args\n\t */\n addScales(...args) {\n this._each('register', args, this.scales);\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof DatasetController}\n\t */\n getController(id) {\n return this._get(id, this.controllers, 'controller');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof Element}\n\t */\n getElement(id) {\n return this._get(id, this.elements, 'element');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {object}\n\t */\n getPlugin(id) {\n return this._get(id, this.plugins, 'plugin');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof Scale}\n\t */\n getScale(id) {\n return this._get(id, this.scales, 'scale');\n }\n\n /**\n\t * @param {...typeof DatasetController} args\n\t */\n removeControllers(...args) {\n this._each('unregister', args, this.controllers);\n }\n\n /**\n\t * @param {...typeof Element} args\n\t */\n removeElements(...args) {\n this._each('unregister', args, this.elements);\n }\n\n /**\n\t * @param {...any} args\n\t */\n removePlugins(...args) {\n this._each('unregister', args, this.plugins);\n }\n\n /**\n\t * @param {...typeof Scale} args\n\t */\n removeScales(...args) {\n this._each('unregister', args, this.scales);\n }\n\n /**\n\t * @private\n\t */\n _each(method, args, typedRegistry) {\n [...args].forEach(arg => {\n const reg = typedRegistry || this._getRegistryForType(arg);\n if (typedRegistry || reg.isForType(arg) || (reg === this.plugins && arg.id)) {\n this._exec(method, reg, arg);\n } else {\n // Handle loopable args\n // Use case:\n // import * as plugins from './plugins.js';\n // Chart.register(plugins);\n each(arg, item => {\n // If there are mixed types in the loopable, make sure those are\n // registered in correct registry\n // Use case: (treemap exporting controller, elements etc)\n // import * as treemap from 'chartjs-chart-treemap.js';\n // Chart.register(treemap);\n\n const itemReg = typedRegistry || this._getRegistryForType(item);\n this._exec(method, itemReg, item);\n });\n }\n });\n }\n\n /**\n\t * @private\n\t */\n _exec(method, registry, component) {\n const camelMethod = _capitalize(method);\n call(component['before' + camelMethod], [], component); // beforeRegister / beforeUnregister\n registry[method](component);\n call(component['after' + camelMethod], [], component); // afterRegister / afterUnregister\n }\n\n /**\n\t * @private\n\t */\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 // plugins is the fallback registry\n return this.plugins;\n }\n\n /**\n\t * @private\n\t */\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\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Registry();\n","import registry from './core.registry.js';\nimport {callback as callCallback, isNullOrUndef, valueOrDefault} from '../helpers/helpers.core.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../plugins/plugin.tooltip.js').default } Tooltip\n */\n\n/**\n * @callback filterCallback\n * @param {{plugin: object, options: object}} value\n * @param {number} [index]\n * @param {array} [array]\n * @param {object} [thisArg]\n * @return {boolean}\n */\n\n\nexport default class PluginService {\n constructor() {\n this._init = [];\n }\n\n /**\n\t * Calls enabled plugins for `chart` on the specified hook and with the given args.\n\t * This method immediately returns as soon as a plugin explicitly returns false. The\n\t * returned value can be used, for instance, to interrupt the current action.\n\t * @param {Chart} chart - The chart instance for which plugins should be called.\n\t * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n\t * @param {object} [args] - Extra arguments to apply to the hook call.\n * @param {filterCallback} [filter] - Filtering function for limiting which plugins are notified\n\t * @returns {boolean} false if any of the plugins return false, else returns true.\n\t */\n notify(chart, hook, args, filter) {\n if (hook === 'beforeInit') {\n this._init = this._createDescriptors(chart, true);\n this._notify(this._init, chart, 'install');\n }\n\n const descriptors = filter ? this._descriptors(chart).filter(filter) : this._descriptors(chart);\n const result = this._notify(descriptors, chart, hook, args);\n\n if (hook === 'afterDestroy') {\n this._notify(descriptors, chart, 'stop');\n this._notify(this._init, chart, 'uninstall');\n }\n return result;\n }\n\n /**\n\t * @private\n\t */\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 (callCallback(method, params, plugin) === false && args.cancelable) {\n return false;\n }\n }\n\n return true;\n }\n\n invalidate() {\n // When plugins are registered, there is the possibility of a double\n // invalidate situation. In this case, we only want to invalidate once.\n // If we invalidate multiple times, the `_oldCache` is lost and all of the\n // plugins are restarted without being correctly stopped.\n // See https://github.com/chartjs/Chart.js/issues/8147\n if (!isNullOrUndef(this._cache)) {\n this._oldCache = this._cache;\n this._cache = undefined;\n }\n }\n\n /**\n\t * @param {Chart} chart\n\t * @private\n\t */\n _descriptors(chart) {\n if (this._cache) {\n return this._cache;\n }\n\n const descriptors = this._cache = this._createDescriptors(chart);\n\n this._notifyStateChanges(chart);\n\n return descriptors;\n }\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 // options === false => all plugins are disabled\n return options === false && !all ? [] : createDescriptors(chart, plugins, options, all);\n }\n\n /**\n\t * @param {Chart} chart\n\t * @private\n\t */\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}\n\n/**\n * @param {import('./core.config.js').default} config\n */\nfunction allPlugins(config) {\n const localIds = {};\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\n const local = config.plugins || [];\n for (let i = 0; i < local.length; i++) {\n const plugin = local[i];\n\n if (plugins.indexOf(plugin) === -1) {\n plugins.push(plugin);\n localIds[plugin.id] = true;\n }\n }\n\n return {plugins, localIds};\n}\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}\n\nfunction createDescriptors(chart, {plugins, localIds}, options, all) {\n const result = [];\n const context = chart.getContext();\n\n for (const plugin of plugins) {\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, local: localIds[id]}, opts, context)\n });\n }\n\n return result;\n}\n\nfunction pluginOpts(config, {plugin, local}, opts, context) {\n const keys = config.pluginScopeKeys(plugin);\n const scopes = config.getOptionScopes(opts, keys);\n if (local && plugin.defaults) {\n // make sure plugin defaults are in scopes for local (not registered) plugins\n scopes.push(plugin.defaults);\n }\n return config.createResolver(scopes, context, [''], {\n // These are just defaults that plugins can override\n scriptable: false,\n indexable: false,\n allKeys: true\n });\n}\n","import defaults, {overrides, descriptors} from './core.defaults.js';\nimport {mergeIf, resolveObjectKey, isArray, isFunction, valueOrDefault, isObject} from '../helpers/helpers.core.js';\nimport {_attachContext, _createResolver, _descriptors} from '../helpers/helpers.config.js';\n\nexport function 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}\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}\n\nfunction getDefaultScaleIDFromAxis(axis, indexAxis) {\n return axis === indexAxis ? '_index_' : '_value_';\n}\n\nfunction idMatchesAxis(id) {\n if (id === 'x' || id === 'y' || id === 'r') {\n return id;\n }\n}\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}\n\nexport function determineAxis(id, ...scaleOptions) {\n if (idMatchesAxis(id)) {\n return id;\n }\n for (const opts of scaleOptions) {\n const axis = opts.axis\n || axisFromPosition(opts.position)\n || id.length > 1 && idMatchesAxis(id[0].toLowerCase());\n if (axis) {\n return axis;\n }\n }\n throw new Error(`Cannot determine type of '${id}' axis. Please provide 'axis' or 'position' option.`);\n}\n\nfunction getAxisFromDataset(id, axis, dataset) {\n if (dataset[axis + 'AxisID'] === id) {\n return {axis};\n }\n}\n\nfunction retrieveAxisFromDatasets(id, config) {\n if (config.data && config.data.datasets) {\n const boundDs = config.data.datasets.filter((d) => d.xAxisID === id || d.yAxisID === id);\n if (boundDs.length) {\n return getAxisFromDataset(id, 'x', boundDs[0]) || getAxisFromDataset(id, 'y', boundDs[0]);\n }\n }\n return {};\n}\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 scales = Object.create(null);\n\n // First figure out first scale id's per axis.\n Object.keys(configScales).forEach(id => {\n const scaleConf = configScales[id];\n if (!isObject(scaleConf)) {\n return console.error(`Invalid scale configuration for scale: ${id}`);\n }\n if (scaleConf._proxy) {\n return console.warn(`Ignoring resolver passed as options for scale: ${id}`);\n }\n const axis = determineAxis(id, scaleConf, retrieveAxisFromDatasets(id, config), defaults.scales[scaleConf.type]);\n const defaultId = getDefaultScaleIDFromAxis(axis, chartIndexAxis);\n const defaultScaleOptions = chartDefaults.scales || {};\n scales[id] = mergeIf(Object.create(null), [{axis}, scaleConf, defaultScaleOptions[axis], defaultScaleOptions[defaultId]]);\n });\n\n // Then merge dataset defaults to scale configs\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'] || axis;\n scales[id] = scales[id] || Object.create(null);\n mergeIf(scales[id], [{axis}, configScales[id], defaultScaleOptions[defaultID]]);\n });\n });\n\n // apply scale defaults, if not overridden by dataset defaults\n Object.keys(scales).forEach(key => {\n const scale = scales[key];\n mergeIf(scale, [defaults.scales[scale.type], defaults.scale]);\n });\n\n return scales;\n}\n\nfunction initOptions(config) {\n const options = config.options || (config.options = {});\n\n options.plugins = valueOrDefault(options.plugins, {});\n options.scales = mergeScaleConfig(config, options);\n}\n\nfunction initData(data) {\n data = data || {};\n data.datasets = data.datasets || [];\n data.labels = data.labels || [];\n return data;\n}\n\nfunction initConfig(config) {\n config = config || {};\n config.data = initData(config.data);\n\n initOptions(config);\n\n return config;\n}\n\nconst keyCache = new Map();\nconst keysCached = new Set();\n\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}\n\nconst addIfFound = (set, obj, key) => {\n const opts = resolveObjectKey(obj, key);\n if (opts !== undefined) {\n set.add(opts);\n }\n};\n\nexport default class Config {\n constructor(config) {\n this._config = initConfig(config);\n this._scopeCache = new Map();\n this._resolverCache = new Map();\n }\n\n get platform() {\n return this._config.platform;\n }\n\n get type() {\n return this._config.type;\n }\n\n set type(type) {\n this._config.type = type;\n }\n\n get data() {\n return this._config.data;\n }\n\n set data(data) {\n this._config.data = initData(data);\n }\n\n get options() {\n return this._config.options;\n }\n\n set options(options) {\n this._config.options = options;\n }\n\n get plugins() {\n return this._config.plugins;\n }\n\n update() {\n const config = this._config;\n this.clearCache();\n initOptions(config);\n }\n\n clearCache() {\n this._scopeCache.clear();\n this._resolverCache.clear();\n }\n\n /**\n * Returns the option scope keys for resolving dataset options.\n * These keys do not include the dataset itself, because it is not under options.\n * @param {string} datasetType\n * @return {string[][]}\n */\n datasetScopeKeys(datasetType) {\n return cachedKeys(datasetType,\n () => [[\n `datasets.${datasetType}`,\n ''\n ]]);\n }\n\n /**\n * Returns the option scope keys for resolving dataset animation options.\n * These keys do not include the dataset itself, because it is not under options.\n * @param {string} datasetType\n * @param {string} transition\n * @return {string[][]}\n */\n datasetAnimationScopeKeys(datasetType, transition) {\n return cachedKeys(`${datasetType}.transition.${transition}`,\n () => [\n [\n `datasets.${datasetType}.transitions.${transition}`,\n `transitions.${transition}`,\n ],\n // The following are used for looking up the `animations` and `animation` keys\n [\n `datasets.${datasetType}`,\n ''\n ]\n ]);\n }\n\n /**\n * Returns the options scope keys for resolving element options that belong\n * to an dataset. These keys do not include the dataset itself, because it\n * is not under options.\n * @param {string} datasetType\n * @param {string} elementType\n * @return {string[][]}\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\n /**\n * Returns the options scope keys for resolving plugin options.\n * @param {{id: string, additionalOptionScopes?: string[]}} plugin\n * @return {string[][]}\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\n /**\n * @private\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\n /**\n * Resolves the objects from options and defaults for option value resolution.\n * @param {object} mainScope - The main scope object for options\n * @param {string[][]} keyLists - The arrays of keys in resolution order\n * @param {boolean} [resetCache] - reset the cache for this mainScope\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\n const scopes = new Set();\n\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\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\n /**\n * Returns the option scopes for resolving chart options\n * @return {object[]}\n */\n chartOptionScopes() {\n const {options, type} = this;\n\n return [\n options,\n overrides[type] || {},\n defaults.datasets[type] || {}, // https://github.com/chartjs/Chart.js/issues/8531\n {type},\n defaults,\n descriptors\n ];\n }\n\n /**\n * @param {object[]} scopes\n * @param {string[]} names\n * @param {function|object} context\n * @param {string[]} [prefixes]\n * @return {object}\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 // subResolver is passed to scriptable options. It should not resolve to hover options.\n const subResolver = this.createResolver(scopes, context, subPrefixes);\n options = _attachContext(resolver, context, subResolver);\n }\n\n for (const prop of names) {\n result[prop] = options[prop];\n }\n return result;\n }\n\n /**\n * @param {object[]} scopes\n * @param {object} [context]\n * @param {string[]} [prefixes]\n * @param {{scriptable: boolean, indexable: boolean, allKeys?: boolean}} [descriptorDefaults]\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}\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}\n\nconst hasFunction = value => isObject(value)\n && Object.getOwnPropertyNames(value).reduce((acc, key) => acc || isFunction(value[key]), false);\n\nfunction needContext(proxy, names) {\n const {isScriptable, isIndexable} = _descriptors(proxy);\n\n for (const prop of names) {\n const scriptable = isScriptable(prop);\n const indexable = isIndexable(prop);\n const value = (indexable || scriptable) && proxy[prop];\n if ((scriptable && (isFunction(value) || hasFunction(value)))\n || (indexable && isArray(value))) {\n return true;\n }\n }\n return false;\n}\n","import animator from './core.animator.js';\nimport defaults, {overrides} from './core.defaults.js';\nimport Interaction from './core.interaction.js';\nimport layouts from './core.layouts.js';\nimport {_detectPlatform} from '../platform/index.js';\nimport PluginService from './core.plugins.js';\nimport registry from './core.registry.js';\nimport Config, {determineAxis, getIndexAxis} from './core.config.js';\nimport {retinaScale, _isDomSupported} from '../helpers/helpers.dom.js';\nimport {each, callback as callCallback, uid, valueOrDefault, _elementsEqual, isNullOrUndef, setsEqual, defined, isFunction, _isClickEvent} from '../helpers/helpers.core.js';\nimport {clearCanvas, clipArea, createContext, unclipArea, _isPointInArea} from '../helpers/index.js';\n// @ts-ignore\nimport {version} from '../../package.json';\nimport {debounce} from '../helpers/helpers.extras.js';\n\n/**\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../types/index.js').Point } Point\n */\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}\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}\n\nfunction onAnimationsComplete(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n\n chart.notifyPlugins('afterRender');\n callCallback(animationOptions && animationOptions.onComplete, [context], chart);\n}\n\nfunction onAnimationProgress(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n callCallback(animationOptions && animationOptions.onProgress, [context], chart);\n}\n\n/**\n * Chart.js can take a string id of a canvas element, a 2d context, or a canvas element itself.\n * Attempt to unwrap the item passed into the chart constructor so that it is a canvas element (if possible).\n */\nfunction getCanvas(item) {\n if (_isDomSupported() && typeof item === 'string') {\n item = document.getElementById(item);\n } else if (item && item.length) {\n // Support for array based queries (such as jQuery)\n item = item[0];\n }\n\n if (item && item.canvas) {\n // Support for any object associated to a canvas (including a context2d)\n item = item.canvas;\n }\n return item;\n}\n\nconst instances = {};\nconst getChart = (key) => {\n const canvas = getCanvas(key);\n return Object.values(instances).filter((c) => c.canvas === canvas).pop();\n};\n\nfunction moveNumericKeys(obj, start, move) {\n const keys = Object.keys(obj);\n for (const key of keys) {\n const intKey = +key;\n if (intKey >= start) {\n const value = obj[key];\n delete obj[key];\n if (move > 0 || intKey > start) {\n obj[intKey + move] = value;\n }\n }\n }\n}\n\n/**\n * @param {ChartEvent} e\n * @param {ChartEvent|null} lastEvent\n * @param {boolean} inChartArea\n * @param {boolean} isClick\n * @returns {ChartEvent|null}\n */\nfunction determineLastEvent(e, lastEvent, inChartArea, isClick) {\n if (!inChartArea || e.type === 'mouseout') {\n return null;\n }\n if (isClick) {\n return lastEvent;\n }\n return e;\n}\n\nfunction getDatasetArea(meta) {\n const {xScale, yScale} = meta;\n if (xScale && yScale) {\n return {\n left: xScale.left,\n right: xScale.right,\n top: yScale.top,\n bottom: yScale.bottom\n };\n }\n}\n\nclass Chart {\n\n static defaults = defaults;\n static instances = instances;\n static overrides = overrides;\n static registry = registry;\n static version = version;\n static getChart = getChart;\n\n static register(...items) {\n registry.add(...items);\n invalidatePlugins();\n }\n\n static unregister(...items) {\n registry.remove(...items);\n invalidatePlugins();\n }\n\n // eslint-disable-next-line max-statements\n constructor(item, userConfig) {\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 with ID \\'' + existingChart.canvas.id + '\\' can be reused.'\n );\n }\n\n const options = config.createResolver(config.chartOptionScopes(), this.getContext());\n\n this.platform = new (config.platform || _detectPlatform(initialCanvas))();\n this.platform.updateConfig(config);\n\n const context = this.platform.acquireContext(initialCanvas, options.aspectRatio);\n const canvas = context && context.canvas;\n const height = canvas && canvas.height;\n const width = canvas && canvas.width;\n\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 // Store the previously used aspect ratio to determine if a resize\n // is needed during updates. Do this after _options is set since\n // aspectRatio uses a getter\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 /** @type {?{attach?: function, detach?: function, resize?: function}} */\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(mode => this.update(mode), options.resizeDelay || 0);\n this._dataChanges = [];\n\n // Add the chart instance to the global namespace\n instances[this.id] = this;\n\n if (!context || !canvas) {\n // The given item is not a compatible context2d element, let's return before finalizing\n // the chart initialization but after setting basic chart / controller properties that\n // can help to figure out that the chart is not valid (e.g chart.canvas !== null);\n // https://github.com/chartjs/Chart.js/issues/2807\n console.error(\"Failed to create chart: can't acquire context from the given item\");\n return;\n }\n\n animator.listen(this, 'complete', onAnimationsComplete);\n animator.listen(this, 'progress', onAnimationProgress);\n\n this._initialize();\n if (this.attached) {\n this.update();\n }\n }\n\n get aspectRatio() {\n const {options: {aspectRatio, maintainAspectRatio}, width, height, _aspectRatio} = this;\n if (!isNullOrUndef(aspectRatio)) {\n // If aspectRatio is defined in options, use that.\n return aspectRatio;\n }\n\n if (maintainAspectRatio && _aspectRatio) {\n // If maintainAspectRatio is truthly and we had previously determined _aspectRatio, use that\n return _aspectRatio;\n }\n\n // Calculate\n return height ? width / height : null;\n }\n\n get data() {\n return this.config.data;\n }\n\n set data(data) {\n this.config.data = data;\n }\n\n get options() {\n return this._options;\n }\n\n set options(options) {\n this.config.options = options;\n }\n\n get registry() {\n return registry;\n }\n\n /**\n\t * @private\n\t */\n _initialize() {\n // Before init plugin notification\n this.notifyPlugins('beforeInit');\n\n if (this.options.responsive) {\n this.resize();\n } else {\n retinaScale(this, this.options.devicePixelRatio);\n }\n\n this.bindEvents();\n\n // After init plugin notification\n this.notifyPlugins('afterInit');\n\n return this;\n }\n\n clear() {\n clearCanvas(this.canvas, this.ctx);\n return this;\n }\n\n stop() {\n animator.stop(this);\n return this;\n }\n\n /**\n\t * Resize the chart to its container or to explicit dimensions.\n\t * @param {number} [width]\n\t * @param {number} [height]\n\t */\n resize(width, height) {\n if (!animator.running(this)) {\n this._resize(width, height);\n } else {\n this._resizeBeforeDraw = {width, height};\n }\n }\n\n _resize(width, height) {\n const options = this.options;\n const canvas = this.canvas;\n const aspectRatio = options.maintainAspectRatio && this.aspectRatio;\n const newSize = this.platform.getMaximumSize(canvas, width, height, aspectRatio);\n const newRatio = options.devicePixelRatio || this.platform.getDevicePixelRatio();\n const mode = this.width ? 'resize' : 'attach';\n\n this.width = newSize.width;\n this.height = newSize.height;\n this._aspectRatio = this.aspectRatio;\n if (!retinaScale(this, newRatio, true)) {\n return;\n }\n\n this.notifyPlugins('resize', {size: newSize});\n\n callCallback(options.onResize, [this, newSize], this);\n\n if (this.attached) {\n if (this._doResize(mode)) {\n // The resize update is delayed, only draw without updating.\n this.render();\n }\n }\n }\n\n ensureScalesHaveIDs() {\n const options = this.options;\n const scalesOptions = options.scales || {};\n\n each(scalesOptions, (axisOptions, axisID) => {\n axisOptions.id = axisID;\n });\n }\n\n /**\n\t * Builds a map of scale ID to scale object for future lookup.\n\t */\n buildOrUpdateScales() {\n const options = this.options;\n const scaleOpts = options.scales;\n const scales = this.scales;\n const updated = Object.keys(scales).reduce((obj, id) => {\n obj[id] = false;\n return obj;\n }, {});\n let items = [];\n\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\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\n if (scaleOptions.position === undefined || positionIsHorizontal(scaleOptions.position, axis) !== positionIsHorizontal(item.dposition)) {\n scaleOptions.position = item.dposition;\n }\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: this.ctx,\n chart: this\n });\n scales[scale.id] = scale;\n }\n\n scale.init(scaleOptions, options);\n });\n // clear up discarded scales\n each(updated, (hasUpdated, id) => {\n if (!hasUpdated) {\n delete scales[id];\n }\n });\n\n each(scales, (scale) => {\n layouts.configure(this, scale, scale.options);\n layouts.addBox(this, scale);\n });\n }\n\n /**\n\t * @private\n\t */\n _updateMetasets() {\n const metasets = this._metasets;\n const numData = this.data.datasets.length;\n const numMeta = metasets.length;\n\n metasets.sort((a, b) => a.index - b.index);\n if (numMeta > numData) {\n for (let i = numData; i < numMeta; ++i) {\n this._destroyDatasetMeta(i);\n }\n metasets.splice(numData, numMeta - numData);\n }\n this._sortedMetasets = metasets.slice(0).sort(compare2Level('order', 'index'));\n }\n\n /**\n\t * @private\n\t */\n _removeUnreferencedMetasets() {\n const {_metasets: metasets, data: {datasets}} = this;\n if (metasets.length > datasets.length) {\n delete this._stacks;\n }\n metasets.forEach((meta, index) => {\n if (datasets.filter(x => x === meta._dataset).length === 0) {\n this._destroyDatasetMeta(index);\n }\n });\n }\n\n buildOrUpdateControllers() {\n const newControllers = [];\n const datasets = this.data.datasets;\n let i, ilen;\n\n this._removeUnreferencedMetasets();\n\n for (i = 0, ilen = datasets.length; i < ilen; i++) {\n const dataset = datasets[i];\n let meta = this.getDatasetMeta(i);\n const type = dataset.type || this.config.type;\n\n if (meta.type && meta.type !== type) {\n this._destroyDatasetMeta(i);\n meta = this.getDatasetMeta(i);\n }\n meta.type = type;\n meta.indexAxis = dataset.indexAxis || getIndexAxis(type, this.options);\n meta.order = dataset.order || 0;\n meta.index = i;\n meta.label = '' + dataset.label;\n meta.visible = this.isDatasetVisible(i);\n\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, {\n dataElementType: registry.getElement(dataElementType),\n datasetElementType: datasetElementType && registry.getElement(datasetElementType)\n });\n meta.controller = new ControllerClass(this, i);\n newControllers.push(meta.controller);\n }\n }\n\n this._updateMetasets();\n return newControllers;\n }\n\n /**\n\t * Reset the elements of all datasets\n\t * @private\n\t */\n _resetElements() {\n each(this.data.datasets, (dataset, datasetIndex) => {\n this.getDatasetMeta(datasetIndex).controller.reset();\n }, this);\n }\n\n /**\n\t* Resets the chart back to its state before the initial animation\n\t*/\n reset() {\n this._resetElements();\n this.notifyPlugins('reset');\n }\n\n update(mode) {\n const config = this.config;\n\n config.update();\n const options = this._options = config.createResolver(config.chartOptionScopes(), this.getContext());\n const animsDisabled = this._animationsDisabled = !options.animation;\n\n this._updateScales();\n this._checkEventBindings();\n this._updateHiddenIndices();\n\n // plugins options references might have change, let's invalidate the cache\n // https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167\n this._plugins.invalidate();\n\n if (this.notifyPlugins('beforeUpdate', {mode, cancelable: true}) === false) {\n return;\n }\n\n // Make sure dataset controllers are updated and new controllers are reset\n const newControllers = this.buildOrUpdateControllers();\n\n this.notifyPlugins('beforeElementsUpdate');\n\n // Make sure all dataset controllers have correct meta data counts\n let minPadding = 0;\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; i++) {\n const {controller} = this.getDatasetMeta(i);\n const reset = !animsDisabled && newControllers.indexOf(controller) === -1;\n // New controllers will be reset after the layout pass, so we only want to modify\n // elements added to new datasets\n controller.buildOrUpdateElements(reset);\n minPadding = Math.max(+controller.getMaxOverflow(), minPadding);\n }\n minPadding = this._minPadding = options.layout.autoPadding ? minPadding : 0;\n this._updateLayout(minPadding);\n\n // Only reset the controllers if we have animations\n if (!animsDisabled) {\n // Can only reset the new controllers after the scales have been updated\n // Reset is done to get the starting point for the initial animation\n each(newControllers, (controller) => {\n controller.reset();\n });\n }\n\n this._updateDatasets(mode);\n\n // Do this before render so that any plugins that need final scale updates can use it\n this.notifyPlugins('afterUpdate', {mode});\n\n this._layers.sort(compare2Level('z', '_idx'));\n\n // Replay last event from before update, or set hover styles on active elements\n const {_active, _lastEvent} = this;\n if (_lastEvent) {\n this._eventHandler(_lastEvent, true);\n } else if (_active.length) {\n this._updateHoverStyles(_active, _active, true);\n }\n\n this.render();\n }\n\n /**\n * @private\n */\n _updateScales() {\n each(this.scales, (scale) => {\n layouts.removeBox(this, scale);\n });\n\n this.ensureScalesHaveIDs();\n this.buildOrUpdateScales();\n }\n\n /**\n * @private\n */\n _checkEventBindings() {\n const options = this.options;\n const existingEvents = new Set(Object.keys(this._listeners));\n const newEvents = new Set(options.events);\n\n if (!setsEqual(existingEvents, newEvents) || !!this._responsiveListeners !== options.responsive) {\n // The configured events have changed. Rebind.\n this.unbindEvents();\n this.bindEvents();\n }\n }\n\n /**\n * @private\n */\n _updateHiddenIndices() {\n const {_hiddenIndices} = this;\n const changes = this._getUniformDataChanges() || [];\n for (const {method, start, count} of changes) {\n const move = method === '_removeElements' ? -count : count;\n moveNumericKeys(_hiddenIndices, start, move);\n }\n }\n\n /**\n * @private\n */\n _getUniformDataChanges() {\n const _dataChanges = this._dataChanges;\n if (!_dataChanges || !_dataChanges.length) {\n return;\n }\n\n this._dataChanges = [];\n const datasetCount = this.data.datasets.length;\n const makeSet = (idx) => new Set(\n _dataChanges\n .filter(c => c[0] === idx)\n .map((c, i) => i + ',' + c.splice(1).join(','))\n );\n\n const changeSet = makeSet(0);\n for (let i = 1; i < datasetCount; i++) {\n if (!setsEqual(changeSet, makeSet(i))) {\n return;\n }\n }\n return Array.from(changeSet)\n .map(c => c.split(','))\n .map(a => ({method: a[1], start: +a[2], count: +a[3]}));\n }\n\n /**\n\t * Updates the chart layout unless a plugin returns `false` to the `beforeLayout`\n\t * hook, in which case, plugins will not be called on `afterLayout`.\n\t * @private\n\t */\n _updateLayout(minPadding) {\n if (this.notifyPlugins('beforeLayout', {cancelable: true}) === false) {\n return;\n }\n\n layouts.update(this, this.width, this.height, minPadding);\n\n const area = this.chartArea;\n const noArea = area.width <= 0 || area.height <= 0;\n\n this._layers = [];\n each(this.boxes, (box) => {\n if (noArea && box.position === 'chartArea') {\n // Skip drawing and configuring chartArea boxes when chartArea is zero or negative\n return;\n }\n\n // configure is called twice, once in core.scale.update and once here.\n // Here the boxes are fully updated and at their final positions.\n if (box.configure) {\n box.configure();\n }\n this._layers.push(...box._layers());\n }, this);\n\n this._layers.forEach((item, index) => {\n item._idx = index;\n });\n\n this.notifyPlugins('afterLayout');\n }\n\n /**\n\t * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate`\n\t * hook, in which case, plugins will not be called on `afterDatasetsUpdate`.\n\t * @private\n\t */\n _updateDatasets(mode) {\n if (this.notifyPlugins('beforeDatasetsUpdate', {mode, cancelable: true}) === false) {\n return;\n }\n\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this.getDatasetMeta(i).controller.configure();\n }\n\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this._updateDataset(i, isFunction(mode) ? mode({datasetIndex: i}) : mode);\n }\n\n this.notifyPlugins('afterDatasetsUpdate', {mode});\n }\n\n /**\n\t * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate`\n\t * hook, in which case, plugins will not be called on `afterDatasetUpdate`.\n\t * @private\n\t */\n _updateDataset(index, mode) {\n const meta = this.getDatasetMeta(index);\n const args = {meta, index, mode, cancelable: true};\n\n if (this.notifyPlugins('beforeDatasetUpdate', args) === false) {\n return;\n }\n\n meta.controller._update(mode);\n\n args.cancelable = false;\n this.notifyPlugins('afterDatasetUpdate', args);\n }\n\n render() {\n if (this.notifyPlugins('beforeRender', {cancelable: true}) === false) {\n return;\n }\n\n if (animator.has(this)) {\n if (this.attached && !animator.running(this)) {\n animator.start(this);\n }\n } else {\n this.draw();\n onAnimationsComplete({chart: this});\n }\n }\n\n draw() {\n let i;\n if (this._resizeBeforeDraw) {\n const {width, height} = this._resizeBeforeDraw;\n this._resize(width, height);\n this._resizeBeforeDraw = null;\n }\n this.clear();\n\n if (this.width <= 0 || this.height <= 0) {\n return;\n }\n\n if (this.notifyPlugins('beforeDraw', {cancelable: true}) === false) {\n return;\n }\n\n // Because of plugin hooks (before/afterDatasetsDraw), datasets can't\n // currently be part of layers. Instead, we draw\n // layers <= 0 before(default, backward compat), and the rest after\n const layers = this._layers;\n for (i = 0; i < layers.length && layers[i].z <= 0; ++i) {\n layers[i].draw(this.chartArea);\n }\n\n this._drawDatasets();\n\n // Rest of layers\n for (; i < layers.length; ++i) {\n layers[i].draw(this.chartArea);\n }\n\n this.notifyPlugins('afterDraw');\n }\n\n /**\n\t * @private\n\t */\n _getSortedDatasetMetas(filterVisible) {\n const metasets = this._sortedMetasets;\n const result = [];\n let i, ilen;\n\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\n return result;\n }\n\n /**\n\t * Gets the visible dataset metas in drawing order\n\t * @return {object[]}\n\t */\n getSortedVisibleDatasetMetas() {\n return this._getSortedDatasetMetas(true);\n }\n\n /**\n\t * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw`\n\t * hook, in which case, plugins will not be called on `afterDatasetsDraw`.\n\t * @private\n\t */\n _drawDatasets() {\n if (this.notifyPlugins('beforeDatasetsDraw', {cancelable: true}) === false) {\n return;\n }\n\n const metasets = this.getSortedVisibleDatasetMetas();\n for (let i = metasets.length - 1; i >= 0; --i) {\n this._drawDataset(metasets[i]);\n }\n\n this.notifyPlugins('afterDatasetsDraw');\n }\n\n /**\n\t * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw`\n\t * hook, in which case, plugins will not be called on `afterDatasetDraw`.\n\t * @private\n\t */\n _drawDataset(meta) {\n const ctx = this.ctx;\n const clip = meta._clip;\n const useClip = !clip.disabled;\n const area = getDatasetArea(meta) || this.chartArea;\n const args = {\n meta,\n index: meta.index,\n cancelable: true\n };\n\n if (this.notifyPlugins('beforeDatasetDraw', args) === false) {\n return;\n }\n\n if (useClip) {\n clipArea(ctx, {\n left: clip.left === false ? 0 : area.left - clip.left,\n right: clip.right === false ? this.width : area.right + clip.right,\n top: clip.top === false ? 0 : area.top - clip.top,\n bottom: clip.bottom === false ? this.height : area.bottom + clip.bottom\n });\n }\n\n meta.controller.draw();\n\n if (useClip) {\n unclipArea(ctx);\n }\n\n args.cancelable = false;\n this.notifyPlugins('afterDatasetDraw', args);\n }\n\n /**\n * Checks whether the given point is in the chart area.\n * @param {Point} point - in relative coordinates (see, e.g., getRelativePosition)\n * @returns {boolean}\n */\n isPointInArea(point) {\n return _isPointInArea(point, this.chartArea, this._minPadding);\n }\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\n return [];\n }\n\n getDatasetMeta(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n const metasets = this._metasets;\n let meta = metasets.filter(x => x && x._dataset === dataset).pop();\n\n if (!meta) {\n meta = {\n type: null,\n data: [],\n dataset: null,\n controller: null,\n hidden: null,\t\t\t// See isDatasetVisible() comment\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\n return meta;\n }\n\n getContext() {\n return this.$context || (this.$context = createContext(null, {chart: this, type: 'chart'}));\n }\n\n getVisibleDatasetCount() {\n return this.getSortedVisibleDatasetMetas().length;\n }\n\n isDatasetVisible(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n if (!dataset) {\n return false;\n }\n\n const meta = this.getDatasetMeta(datasetIndex);\n\n // meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false,\n // the dataset.hidden value is ignored, else if null, the dataset hidden state is returned.\n return typeof meta.hidden === 'boolean' ? !meta.hidden : !dataset.hidden;\n }\n\n setDatasetVisibility(datasetIndex, visible) {\n const meta = this.getDatasetMeta(datasetIndex);\n meta.hidden = !visible;\n }\n\n toggleDataVisibility(index) {\n this._hiddenIndices[index] = !this._hiddenIndices[index];\n }\n\n getDataVisibility(index) {\n return !this._hiddenIndices[index];\n }\n\n /**\n\t * @private\n\t */\n _updateVisibility(datasetIndex, dataIndex, visible) {\n const mode = visible ? 'show' : 'hide';\n const meta = this.getDatasetMeta(datasetIndex);\n const anims = meta.controller._resolveAnimations(undefined, mode);\n\n if (defined(dataIndex)) {\n meta.data[dataIndex].hidden = !visible;\n this.update();\n } else {\n this.setDatasetVisibility(datasetIndex, visible);\n // Animate visible state, so hide animation can be seen. This could be handled better if update / updateDataset returned a Promise.\n anims.update(meta, {visible});\n this.update((ctx) => ctx.datasetIndex === datasetIndex ? mode : undefined);\n }\n }\n\n hide(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, false);\n }\n\n show(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, true);\n }\n\n /**\n\t * @private\n\t */\n _destroyDatasetMeta(datasetIndex) {\n const meta = this._metasets[datasetIndex];\n if (meta && meta.controller) {\n meta.controller._destroy();\n }\n delete this._metasets[datasetIndex];\n }\n\n _stop() {\n let i, ilen;\n this.stop();\n animator.remove(this);\n\n for (i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this._destroyDatasetMeta(i);\n }\n }\n\n destroy() {\n this.notifyPlugins('beforeDestroy');\n const {canvas, ctx} = this;\n\n this._stop();\n this.config.clearCache();\n\n if (canvas) {\n this.unbindEvents();\n clearCanvas(canvas, ctx);\n this.platform.releaseContext(ctx);\n this.canvas = null;\n this.ctx = null;\n }\n\n delete instances[this.id];\n\n this.notifyPlugins('afterDestroy');\n }\n\n toBase64Image(...args) {\n return this.canvas.toDataURL(...args);\n }\n\n /**\n\t * @private\n\t */\n bindEvents() {\n this.bindUserEvents();\n if (this.options.responsive) {\n this.bindResponsiveEvents();\n } else {\n this.attached = true;\n }\n }\n\n /**\n * @private\n */\n bindUserEvents() {\n const listeners = this._listeners;\n const platform = this.platform;\n\n const _add = (type, listener) => {\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n\n const listener = (e, x, y) => {\n e.offsetX = x;\n e.offsetY = y;\n this._eventHandler(e);\n };\n\n each(this.options.events, (type) => _add(type, listener));\n }\n\n /**\n * @private\n */\n bindResponsiveEvents() {\n if (!this._responsiveListeners) {\n this._responsiveListeners = {};\n }\n const listeners = this._responsiveListeners;\n const platform = this.platform;\n\n const _add = (type, listener) => {\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n const _remove = (type, listener) => {\n if (listeners[type]) {\n platform.removeEventListener(this, type, listener);\n delete listeners[type];\n }\n };\n\n const listener = (width, height) => {\n if (this.canvas) {\n this.resize(width, height);\n }\n };\n\n let detached; // eslint-disable-line prefer-const\n const attached = () => {\n _remove('attach', attached);\n\n this.attached = true;\n this.resize();\n\n _add('resize', listener);\n _add('detach', detached);\n };\n\n detached = () => {\n this.attached = false;\n\n _remove('resize', listener);\n\n // Stop animating and remove metasets, so when re-attached, the animations start from beginning.\n this._stop();\n this._resize(0, 0);\n\n _add('attach', attached);\n };\n\n if (platform.isAttached(this.canvas)) {\n attached();\n } else {\n detached();\n }\n }\n\n /**\n\t * @private\n\t */\n unbindEvents() {\n each(this._listeners, (listener, type) => {\n this.platform.removeEventListener(this, type, listener);\n });\n this._listeners = {};\n\n each(this._responsiveListeners, (listener, type) => {\n this.platform.removeEventListener(this, type, listener);\n });\n this._responsiveListeners = undefined;\n }\n\n updateHoverStyle(items, mode, enabled) {\n const prefix = enabled ? 'set' : 'remove';\n let meta, item, i, ilen;\n\n if (mode === 'dataset') {\n meta = this.getDatasetMeta(items[0].datasetIndex);\n meta.controller['_' + prefix + 'DatasetHoverStyle']();\n }\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\n /**\n\t * Get active (hovered) elements\n\t * @returns array\n\t */\n getActiveElements() {\n return this._active || [];\n }\n\n /**\n\t * Set active (hovered) elements\n\t * @param {array} activeElements New active data points\n\t */\n setActiveElements(activeElements) {\n const lastActive = this._active || [];\n const active = activeElements.map(({datasetIndex, index}) => {\n const meta = this.getDatasetMeta(datasetIndex);\n if (!meta) {\n throw new Error('No dataset found at index ' + datasetIndex);\n }\n\n return {\n datasetIndex,\n element: meta.data[index],\n index,\n };\n });\n const changed = !_elementsEqual(active, lastActive);\n\n if (changed) {\n this._active = active;\n // Make sure we don't use the previous mouse event to override the active elements in update.\n this._lastEvent = null;\n this._updateHoverStyles(active, lastActive);\n }\n }\n\n /**\n\t * Calls enabled plugins on the specified hook and with the given args.\n\t * This method immediately returns as soon as a plugin explicitly returns false. The\n\t * returned value can be used, for instance, to interrupt the current action.\n\t * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n\t * @param {Object} [args] - Extra arguments to apply to the hook call.\n * @param {import('./core.plugins.js').filterCallback} [filter] - Filtering function for limiting which plugins are notified\n\t * @returns {boolean} false if any of the plugins return false, else returns true.\n\t */\n notifyPlugins(hook, args, filter) {\n return this._plugins.notify(this, hook, args, filter);\n }\n\n /**\n * Check if a plugin with the specific ID is registered and enabled\n * @param {string} pluginId - The ID of the plugin of which to check if it is enabled\n * @returns {boolean}\n */\n isPluginEnabled(pluginId) {\n return this._plugins._cache.filter(p => p.plugin.id === pluginId).length === 1;\n }\n\n /**\n\t * @private\n\t */\n _updateHoverStyles(active, lastActive, replay) {\n const hoverOptions = this.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\n if (deactivated.length) {\n this.updateHoverStyle(deactivated, hoverOptions.mode, false);\n }\n\n if (activated.length && hoverOptions.mode) {\n this.updateHoverStyle(activated, hoverOptions.mode, true);\n }\n }\n\n /**\n\t * @private\n\t */\n _eventHandler(e, replay) {\n const args = {\n event: e,\n replay,\n cancelable: true,\n inChartArea: this.isPointInArea(e)\n };\n const eventFilter = (plugin) => (plugin.options.events || this.options.events).includes(e.native.type);\n\n if (this.notifyPlugins('beforeEvent', args, eventFilter) === false) {\n return;\n }\n\n const changed = this._handleEvent(e, replay, args.inChartArea);\n\n args.cancelable = false;\n this.notifyPlugins('afterEvent', args, eventFilter);\n\n if (changed || args.changed) {\n this.render();\n }\n\n return this;\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e the event to handle\n\t * @param {boolean} [replay] - true if the event was replayed by `update`\n * @param {boolean} [inChartArea] - true if the event is inside chartArea\n\t * @return {boolean} true if the chart needs to re-render\n\t * @private\n\t */\n _handleEvent(e, replay, inChartArea) {\n const {_active: lastActive = [], options} = this;\n\n // If the event is replayed from `update`, we should evaluate with the final positions.\n //\n // The `replay`:\n // It's the last event (excluding click) that has occurred before `update`.\n // So mouse has not moved. It's also over the chart, because there is a `replay`.\n //\n // The why:\n // If animations are active, the elements haven't moved yet compared to state before update.\n // But if they will, we are activating the elements that would be active, if this check\n // was done after the animations have completed. => \"final positions\".\n // If there is no animations, the \"final\" and \"current\" positions are equal.\n // This is done so we do not have to evaluate the active elements each animation frame\n // - it would be expensive.\n const useFinalPosition = replay;\n const active = this._getActiveElements(e, lastActive, inChartArea, useFinalPosition);\n const isClick = _isClickEvent(e);\n const lastEvent = determineLastEvent(e, this._lastEvent, inChartArea, isClick);\n\n if (inChartArea) {\n // Set _lastEvent to null while we are processing the event handlers.\n // This prevents recursion if the handler calls chart.update()\n this._lastEvent = null;\n\n // Invoke onHover hook\n callCallback(options.onHover, [e, active, this], this);\n\n if (isClick) {\n callCallback(options.onClick, [e, active, this], this);\n }\n }\n\n const changed = !_elementsEqual(active, lastActive);\n if (changed || replay) {\n this._active = active;\n this._updateHoverStyles(active, lastActive, replay);\n }\n\n this._lastEvent = lastEvent;\n\n return changed;\n }\n\n /**\n * @param {ChartEvent} e - The event\n * @param {import('../types/index.js').ActiveElement[]} lastActive - Previously active elements\n * @param {boolean} inChartArea - Is the envent inside chartArea\n * @param {boolean} useFinalPosition - Should the evaluation be done with current or final (after animation) element positions\n * @returns {import('../types/index.js').ActiveElement[]} - The active elements\n * @pravate\n */\n _getActiveElements(e, lastActive, inChartArea, useFinalPosition) {\n if (e.type === 'mouseout') {\n return [];\n }\n\n if (!inChartArea) {\n // Let user control the active elements outside chartArea. Eg. using Legend.\n return lastActive;\n }\n\n const hoverOptions = this.options.hover;\n return this.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions, useFinalPosition);\n }\n}\n\n// @ts-ignore\nfunction invalidatePlugins() {\n return each(Chart.instances, (chart) => chart._plugins.invalidate());\n}\n\nexport default Chart;\n","import Element from '../core/core.element.js';\nimport {_angleBetween, getAngleFromPoint, TAU, HALF_PI, valueOrDefault} from '../helpers/index.js';\nimport {PI, _isBetween, _limitValue} from '../helpers/helpers.math.js';\nimport {_readValueToProps} from '../helpers/helpers.options.js';\nimport type {ArcOptions, Point} from '../types/index.js';\n\n\nfunction clipArc(ctx: CanvasRenderingContext2D, element: ArcElement, endAngle: number) {\n const {startAngle, pixelMargin, x, y, outerRadius, innerRadius} = element;\n let angleMargin = pixelMargin / outerRadius;\n\n // Draw an inner border by clipping the arc and drawing a double-width border\n // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders\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}\n\nfunction toRadiusCorners(value) {\n return _readValueToProps(value, ['outerStart', 'outerEnd', 'innerStart', 'innerEnd']);\n}\n\n/**\n * Parse border radius from the provided options\n */\nfunction parseBorderRadius(arc: ArcElement, innerRadius: number, outerRadius: number, angleDelta: number) {\n const o = toRadiusCorners(arc.options.borderRadius);\n const halfThickness = (outerRadius - innerRadius) / 2;\n const innerLimit = Math.min(halfThickness, angleDelta * innerRadius / 2);\n\n // Outer limits are complicated. We want to compute the available angular distance at\n // a radius of outerRadius - borderRadius because for small angular distances, this term limits.\n // We compute at r = outerRadius - borderRadius because this circle defines the center of the border corners.\n //\n // If the borderRadius is large, that value can become negative.\n // This causes the outer borders to lose their radius entirely, which is rather unexpected. To solve that, if borderRadius > outerRadius\n // we know that the thickness term will dominate and compute the limits at that point\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\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}\n\n/**\n * Convert (r, 𝜃) to (x, y)\n */\nfunction rThetaToXY(r: number, theta: number, x: number, y: number) {\n return {\n x: x + r * Math.cos(theta),\n y: y + r * Math.sin(theta),\n };\n}\n\n\n/**\n * Path the arc, respecting border radius by separating into left and right halves.\n *\n * Start End\n *\n * 1--->a--->2 Outer\n * / \\\n * 8 3\n * | |\n * | |\n * 7 4\n * \\ /\n * 6<---b<---5 Inner\n */\nfunction pathArc(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n end: number,\n circular: boolean,\n) {\n const {x, y, startAngle: start, pixelMargin, innerRadius: innerR} = element;\n\n const outerRadius = Math.max(element.outerRadius + spacing + offset - pixelMargin, 0);\n const innerRadius = innerR > 0 ? innerR + spacing + offset + pixelMargin : 0;\n\n let spacingOffset = 0;\n const alpha = end - start;\n\n if (spacing) {\n // When spacing is present, it is the same for all items\n // So we adjust the start and end angle of the arc such that\n // the distance is the same as it would be without the 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\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(element, innerRadius, outerRadius, endAngle - startAngle);\n\n const outerStartAdjustedRadius = outerRadius - outerStart;\n const outerEndAdjustedRadius = outerRadius - outerEnd;\n const outerStartAdjustedAngle = startAngle + outerStart / outerStartAdjustedRadius;\n const outerEndAdjustedAngle = endAngle - outerEnd / outerEndAdjustedRadius;\n\n const innerStartAdjustedRadius = innerRadius + innerStart;\n const innerEndAdjustedRadius = innerRadius + innerEnd;\n const innerStartAdjustedAngle = startAngle + innerStart / innerStartAdjustedRadius;\n const innerEndAdjustedAngle = endAngle - innerEnd / innerEndAdjustedRadius;\n\n ctx.beginPath();\n\n if (circular) {\n // The first arc segments from point 1 to point a to point 2\n const outerMidAdjustedAngle = (outerStartAdjustedAngle + outerEndAdjustedAngle) / 2;\n ctx.arc(x, y, outerRadius, outerStartAdjustedAngle, outerMidAdjustedAngle);\n ctx.arc(x, y, outerRadius, outerMidAdjustedAngle, outerEndAdjustedAngle);\n\n // The corner segment from point 2 to point 3\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\n // The line from point 3 to point 4\n const p4 = rThetaToXY(innerEndAdjustedRadius, endAngle, x, y);\n ctx.lineTo(p4.x, p4.y);\n\n // The corner segment from point 4 to point 5\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\n // The inner arc from point 5 to point b to point 6\n const innerMidAdjustedAngle = ((endAngle - (innerEnd / innerRadius)) + (startAngle + (innerStart / innerRadius))) / 2;\n ctx.arc(x, y, innerRadius, endAngle - (innerEnd / innerRadius), innerMidAdjustedAngle, true);\n ctx.arc(x, y, innerRadius, innerMidAdjustedAngle, startAngle + (innerStart / innerRadius), true);\n\n // The corner segment from point 6 to point 7\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\n // The line from point 7 to point 8\n const p8 = rThetaToXY(outerStartAdjustedRadius, startAngle, x, y);\n ctx.lineTo(p8.x, p8.y);\n\n // The corner segment from point 8 to point 1\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 } else {\n ctx.moveTo(x, y);\n\n const outerStartX = Math.cos(outerStartAdjustedAngle) * outerRadius + x;\n const outerStartY = Math.sin(outerStartAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerStartX, outerStartY);\n\n const outerEndX = Math.cos(outerEndAdjustedAngle) * outerRadius + x;\n const outerEndY = Math.sin(outerEndAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerEndX, outerEndY);\n }\n\n ctx.closePath();\n}\n\nfunction drawArc(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n circular: boolean,\n) {\n const {fullCircles, startAngle, circumference} = element;\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for (let i = 0; i < fullCircles; ++i) {\n ctx.fill();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % TAU || TAU);\n }\n }\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.fill();\n return endAngle;\n}\n\nfunction drawBorder(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n circular: boolean,\n) {\n const {fullCircles, startAngle, circumference, options} = element;\n const {borderWidth, borderJoinStyle, borderDash, borderDashOffset} = options;\n const inner = options.borderAlign === 'inner';\n\n if (!borderWidth) {\n return;\n }\n\n ctx.setLineDash(borderDash || []);\n ctx.lineDashOffset = borderDashOffset;\n\n if (inner) {\n ctx.lineWidth = borderWidth * 2;\n ctx.lineJoin = borderJoinStyle || 'round';\n } else {\n ctx.lineWidth = borderWidth;\n ctx.lineJoin = borderJoinStyle || 'bevel';\n }\n\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for (let i = 0; i < fullCircles; ++i) {\n ctx.stroke();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % TAU || TAU);\n }\n }\n\n if (inner) {\n clipArc(ctx, element, endAngle);\n }\n\n if (!fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.stroke();\n }\n}\n\nexport interface ArcProps extends Point {\n startAngle: number;\n endAngle: number;\n innerRadius: number;\n outerRadius: number;\n circumference: number;\n}\n\nexport default class ArcElement extends Element {\n\n static id = 'arc';\n\n static defaults = {\n borderAlign: 'center',\n borderColor: '#fff',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: undefined,\n borderRadius: 0,\n borderWidth: 2,\n offset: 0,\n spacing: 0,\n angle: undefined,\n circular: true,\n };\n\n static defaultRoutes = {\n backgroundColor: 'backgroundColor'\n };\n\n static descriptors = {\n _scriptable: true,\n _indexable: (name) => name !== 'borderDash'\n };\n\n circumference: number;\n endAngle: number;\n fullCircles: number;\n innerRadius: number;\n outerRadius: number;\n pixelMargin: number;\n startAngle: number;\n\n constructor(cfg) {\n super();\n\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\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n inRange(chartX: number, chartY: number, useFinalPosition: boolean) {\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 + this.options.borderWidth) / 2;\n const _circumference = valueOrDefault(circumference, endAngle - startAngle);\n const betweenAngles = _circumference >= TAU || _angleBetween(angle, startAngle, endAngle);\n const withinRadius = _isBetween(distance, innerRadius + rAdjust, outerRadius + rAdjust);\n\n return (betweenAngles && withinRadius);\n }\n\n getCenterPoint(useFinalPosition: boolean) {\n const {x, y, startAngle, endAngle, innerRadius, outerRadius} = this.getProps([\n 'x',\n 'y',\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius'\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\n tooltipPosition(useFinalPosition: boolean) {\n return this.getCenterPoint(useFinalPosition);\n }\n\n draw(ctx: CanvasRenderingContext2D) {\n const {options, circumference} = this;\n const offset = (options.offset || 0) / 4;\n const spacing = (options.spacing || 0) / 2;\n const circular = options.circular;\n this.pixelMargin = (options.borderAlign === 'inner') ? 0.33 : 0;\n this.fullCircles = circumference > TAU ? Math.floor(circumference / TAU) : 0;\n\n if (circumference === 0 || this.innerRadius < 0 || this.outerRadius < 0) {\n return;\n }\n\n ctx.save();\n\n const halfAngle = (this.startAngle + this.endAngle) / 2;\n ctx.translate(Math.cos(halfAngle) * offset, Math.sin(halfAngle) * offset);\n const fix = 1 - Math.sin(Math.min(PI, circumference || 0));\n const radiusOffset = offset * fix;\n\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n\n drawArc(ctx, this, radiusOffset, spacing, circular);\n drawBorder(ctx, this, radiusOffset, spacing, circular);\n\n ctx.restore();\n }\n}\n","import Element from '../core/core.element.js';\nimport {_bezierInterpolation, _pointInLine, _steppedInterpolation} from '../helpers/helpers.interpolation.js';\nimport {_computeSegments, _boundSegments} from '../helpers/helpers.segment.js';\nimport {_steppedLineTo, _bezierCurveTo} from '../helpers/helpers.canvas.js';\nimport {_updateBezierControlPoints} from '../helpers/helpers.curve.js';\nimport {valueOrDefault} from '../helpers/index.js';\n\n/**\n * @typedef { import('./element.point.js').default } PointElement\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}\n\nfunction lineTo(ctx, previous, target) {\n ctx.lineTo(target.x, target.y);\n}\n\n/**\n * @returns {any}\n */\nfunction getLineMethod(options) {\n if (options.stepped) {\n return _steppedLineTo;\n }\n\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierCurveTo;\n }\n\n return lineTo;\n}\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\n return {\n count,\n start,\n loop: segment.loop,\n ilen: end < start && !outside ? count + end - start : end - start\n };\n}\n\n/**\n * Create path from points, grouping by truncated x-coordinate\n * Points need to be in order by x-coordinate for this to work efficiently\n * @param {CanvasRenderingContext2D|Path2D} ctx - Context\n * @param {LineElement} line\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} params\n * @param {boolean} params.move - move to starting point (vs line to it)\n * @param {boolean} params.reverse - path the segment from end to start\n * @param {number} params.start - limit segment to points starting from `start` index\n * @param {number} params.end - limit segment to points ending at `start` + `count` index\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 // eslint-disable-next-line prefer-const\n let {move = true, reverse} = params || {};\n let i, point, prev;\n\n for (i = 0; i <= ilen; ++i) {\n point = points[(start + (reverse ? ilen - i : i)) % count];\n\n if (point.skip) {\n // If there is a skipped point inside a segment, spanGaps must be true\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\n prev = point;\n }\n\n if (loop) {\n point = points[(start + (reverse ? ilen : 0)) % count];\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n\n return !!loop;\n}\n\n/**\n * Create path from points, grouping by truncated x-coordinate\n * Points need to be in order by x-coordinate for this to work efficiently\n * @param {CanvasRenderingContext2D|Path2D} ctx - Context\n * @param {LineElement} line\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} params\n * @param {boolean} params.move - move to starting point (vs line to it)\n * @param {boolean} params.reverse - path the segment from end to start\n * @param {number} params.start - limit segment to points starting from `start` index\n * @param {number} params.end - limit segment to points ending at `start` + `count` index\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\n const pointIndex = (index) => (start + (reverse ? ilen - index : index)) % count;\n const drawX = () => {\n if (minY !== maxY) {\n // Draw line to maxY and minY, using the average x-coordinate\n ctx.lineTo(avgX, maxY);\n ctx.lineTo(avgX, minY);\n // Line to y-value of last point in group. So the line continues\n // from correct position. Not using move, to have solid path.\n ctx.lineTo(avgX, lastY);\n }\n };\n\n if (move) {\n point = points[pointIndex(0)];\n ctx.moveTo(point.x, point.y);\n }\n\n for (i = 0; i <= ilen; ++i) {\n point = points[pointIndex(i)];\n\n if (point.skip) {\n // If there is a skipped point inside a segment, spanGaps must be true\n continue;\n }\n\n const x = point.x;\n const y = point.y;\n const truncX = x | 0; // truncated x-coordinate\n\n if (truncX === prevX) {\n // Determine `minY` / `maxY` and `avgX` while we stay within same x-position\n if (y < minY) {\n minY = y;\n } else if (y > maxY) {\n maxY = y;\n }\n // For first point in group, countX is `0`, so average will be `x` / 1.\n avgX = (countX * avgX + x) / ++countX;\n } else {\n drawX();\n // Draw line to next x-position, using the first (or only)\n // y-value in that group\n ctx.lineTo(x, y);\n\n prevX = truncX;\n countX = 0;\n minY = maxY = y;\n }\n // Keep track of the last y-value in group\n lastY = y;\n }\n drawX();\n}\n\n/**\n * @param {LineElement} line - the line\n * @returns {function}\n * @private\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}\n\n/**\n * @private\n */\nfunction _getInterpolationMethod(options) {\n if (options.stepped) {\n return _steppedInterpolation;\n }\n\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierInterpolation;\n }\n\n return _pointInLine;\n}\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}\n\nfunction strokePathDirect(ctx, line, start, count) {\n const {segments, options} = line;\n const segmentMethod = _getSegmentMethod(line);\n\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}\n\nconst usePath2D = typeof Path2D === 'function';\n\nfunction draw(ctx, line, start, count) {\n if (usePath2D && !line.options.segment) {\n strokePathWithCache(ctx, line, start, count);\n } else {\n strokePathDirect(ctx, line, start, count);\n }\n}\n\nexport default class LineElement extends Element {\n\n static id = 'line';\n\n /**\n * @type {any}\n */\n static 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 };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n\n static descriptors = {\n _scriptable: true,\n _indexable: (name) => name !== 'borderDash' && name !== 'fill',\n };\n\n\n constructor(cfg) {\n super();\n\n this.animated = true;\n this.options = undefined;\n this._chart = 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\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n updateControlPoints(chartArea, indexAxis) {\n const options = this.options;\n if ((options.tension || options.cubicInterpolationMode === 'monotone') && !options.stepped && !this._pointsUpdated) {\n const loop = options.spanGaps ? this._loop : this._fullLoop;\n _updateBezierControlPoints(this._points, options, chartArea, loop, indexAxis);\n this._pointsUpdated = true;\n }\n }\n\n set points(points) {\n this._points = points;\n delete this._segments;\n delete this._path;\n this._pointsUpdated = false;\n }\n\n get points() {\n return this._points;\n }\n\n get segments() {\n return this._segments || (this._segments = _computeSegments(this, this.options.segment));\n }\n\n /**\n\t * First non-skipped point on this line\n\t * @returns {PointElement|undefined}\n\t */\n first() {\n const segments = this.segments;\n const points = this.points;\n return segments.length && points[segments[0].start];\n }\n\n /**\n\t * Last non-skipped point on this line\n\t * @returns {PointElement|undefined}\n\t */\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\n /**\n\t * Interpolate a point in this line at the same value on `property` as\n\t * the reference `point` provided\n\t * @param {PointElement} point - the reference point\n\t * @param {string} property - the property to match on\n\t * @returns {PointElement|undefined}\n\t */\n interpolate(point, property) {\n const options = this.options;\n const value = point[property];\n const points = this.points;\n const segments = _boundSegments(this, {property, start: value, end: value});\n\n if (!segments.length) {\n return;\n }\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\n /**\n\t * Append a segment of this line to current path.\n\t * @param {CanvasRenderingContext2D} ctx\n\t * @param {object} segment\n\t * @param {number} segment.start - start index of the segment, referring the points array\n \t * @param {number} segment.end - end index of the segment, referring the points array\n \t * @param {boolean} segment.loop - indicates that the segment is a loop\n\t * @param {object} params\n\t * @param {boolean} params.move - move to starting point (vs line to it)\n\t * @param {boolean} params.reverse - path the segment from end to start\n\t * @param {number} params.start - limit segment to points starting from `start` index\n\t * @param {number} params.end - limit segment to points ending at `start` + `count` index\n\t * @returns {undefined|boolean} - true if the segment is a full loop (path should be closed)\n\t */\n pathSegment(ctx, segment, params) {\n const segmentMethod = _getSegmentMethod(this);\n return segmentMethod(ctx, this, segment, params);\n }\n\n /**\n\t * Append all segments of this line to current path.\n\t * @param {CanvasRenderingContext2D|Path2D} ctx\n\t * @param {number} [start]\n\t * @param {number} [count]\n\t * @returns {undefined|boolean} - true if line is a full loop (path should be closed)\n\t */\n path(ctx, start, count) {\n const segments = this.segments;\n const segmentMethod = _getSegmentMethod(this);\n let loop = this._loop;\n\n start = start || 0;\n count = count || (this.points.length - start);\n\n for (const segment of segments) {\n loop &= segmentMethod(ctx, this, segment, {start, end: start + count - 1});\n }\n return !!loop;\n }\n\n /**\n\t * Draw\n\t * @param {CanvasRenderingContext2D} ctx\n\t * @param {object} chartArea\n\t * @param {number} [start]\n\t * @param {number} [count]\n\t */\n draw(ctx, chartArea, start, count) {\n const options = this.options || {};\n const points = this.points || [];\n\n if (points.length && options.borderWidth) {\n ctx.save();\n\n draw(ctx, this, start, count);\n\n ctx.restore();\n }\n\n if (this.animated) {\n // When line is animated, the control points and path are not cached.\n this._pointsUpdated = false;\n this._path = undefined;\n }\n }\n}\n","import Element from '../core/core.element.js';\nimport {drawPoint, _isPointInArea} from '../helpers/helpers.canvas.js';\nimport type {\n CartesianParsedData,\n ChartArea,\n Point,\n PointHoverOptions,\n PointOptions,\n} from '../types/index.js';\n\nfunction inRange(el: PointElement, pos: number, axis: 'x' | 'y', useFinalPosition?: boolean) {\n const options = el.options;\n const {[axis]: value} = el.getProps([axis], useFinalPosition);\n\n return (Math.abs(pos - value) < options.radius + options.hitRadius);\n}\n\nexport type PointProps = Point\n\nexport default class PointElement extends Element {\n\n static id = 'point';\n\n parsed: CartesianParsedData;\n skip?: boolean;\n stop?: boolean;\n\n /**\n * @type {any}\n */\n static defaults = {\n borderWidth: 1,\n hitRadius: 1,\n hoverBorderWidth: 1,\n hoverRadius: 4,\n pointStyle: 'circle',\n radius: 3,\n rotation: 0\n };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.parsed = undefined;\n this.skip = undefined;\n this.stop = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n inRange(mouseX: number, mouseY: number, useFinalPosition?: boolean) {\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\n inXRange(mouseX: number, useFinalPosition?: boolean) {\n return inRange(this, mouseX, 'x', useFinalPosition);\n }\n\n inYRange(mouseY: number, useFinalPosition?: boolean) {\n return inRange(this, mouseY, 'y', useFinalPosition);\n }\n\n getCenterPoint(useFinalPosition?: boolean) {\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return {x, y};\n }\n\n size(options?: Partial) {\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\n draw(ctx: CanvasRenderingContext2D, area: ChartArea) {\n const options = this.options;\n\n if (this.skip || options.radius < 0.1 || !_isPointInArea(this, area, this.size(options) / 2)) {\n return;\n }\n\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n ctx.fillStyle = options.backgroundColor;\n drawPoint(ctx, options, this.x, this.y);\n }\n\n getRange() {\n const options = this.options || {};\n // @ts-expect-error Fallbacks should never be hit in practice\n return options.radius + options.hitRadius;\n }\n}\n","import Element from '../core/core.element.js';\nimport {isObject, _isBetween, _limitValue} from '../helpers/index.js';\nimport {addRoundedRectPath} from '../helpers/helpers.canvas.js';\nimport {toTRBL, toTRBLCorners} from '../helpers/helpers.options.js';\n\n/** @typedef {{ x: number, y: number, base: number, horizontal: boolean, width: number, height: number }} BarProps */\n\n/**\n * Helper function to get the bounds of the bar regardless of the orientation\n * @param {BarElement} bar the bar\n * @param {boolean} [useFinalPosition]\n * @return {object} bounds of the bar\n * @private\n */\nfunction getBarBounds(bar, useFinalPosition) {\n const {x, y, base, width, height} = /** @type {BarProps} */ (bar.getProps(['x', 'y', 'base', 'width', 'height'], useFinalPosition));\n\n let left, right, top, bottom, half;\n\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\n return {left, top, right, bottom};\n}\n\nfunction skipOrLimit(skip, value, min, max) {\n return skip ? 0 : _limitValue(value, min, max);\n}\n\nfunction parseBorderWidth(bar, maxW, maxH) {\n const value = bar.options.borderWidth;\n const skip = bar.borderSkipped;\n const o = toTRBL(value);\n\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}\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\n // If the value is an object, assume the user knows what they are doing\n // and apply as directed.\n const enableBorder = enableBorderRadius || isObject(value);\n\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}\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\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}\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\n return bounds\n\t\t&& (skipX || _isBetween(x, bounds.left, bounds.right))\n\t\t&& (skipY || _isBetween(y, bounds.top, bounds.bottom));\n}\n\nfunction hasRadius(radius) {\n return radius.topLeft || radius.topRight || radius.bottomLeft || radius.bottomRight;\n}\n\n/**\n * Add a path of a rectangle to the current sub-path\n * @param {CanvasRenderingContext2D} ctx Context\n * @param {*} rect Bounding rect\n */\nfunction addNormalRectPath(ctx, rect) {\n ctx.rect(rect.x, rect.y, rect.w, rect.h);\n}\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}\n\nexport default class BarElement extends Element {\n\n static id = 'bar';\n\n /**\n * @type {any}\n */\n static defaults = {\n borderSkipped: 'start',\n borderWidth: 0,\n borderRadius: 0,\n inflateAmount: 'auto',\n pointStyle: undefined\n };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.horizontal = undefined;\n this.base = undefined;\n this.width = undefined;\n this.height = undefined;\n this.inflateAmount = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n draw(ctx) {\n const {inflateAmount, options: {borderColor, backgroundColor}} = this;\n const {inner, outer} = boundingRects(this);\n const addRectPath = hasRadius(outer.radius) ? addRoundedRectPath : addNormalRectPath;\n\n ctx.save();\n\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 = borderColor;\n ctx.fill('evenodd');\n }\n\n ctx.beginPath();\n addRectPath(ctx, inflateRect(inner, inflateAmount));\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n\n ctx.restore();\n }\n\n inRange(mouseX, mouseY, useFinalPosition) {\n return inRange(this, mouseX, mouseY, useFinalPosition);\n }\n\n inXRange(mouseX, useFinalPosition) {\n return inRange(this, mouseX, null, useFinalPosition);\n }\n\n inYRange(mouseY, useFinalPosition) {\n return inRange(this, null, mouseY, useFinalPosition);\n }\n\n getCenterPoint(useFinalPosition) {\n const {x, y, base, horizontal} = /** @type {BarProps} */ (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\n getRange(axis) {\n return axis === 'x' ? this.width / 2 : this.height / 2;\n }\n}\n","/**\n * Plugin based on discussion from the following Chart.js issues:\n * @see https://github.com/chartjs/Chart.js/issues/2380#issuecomment-279961569\n * @see https://github.com/chartjs/Chart.js/issues/2440#issuecomment-256461897\n */\n\nimport LineElement from '../../elements/element.line.js';\nimport {_drawfill} from './filler.drawing.js';\nimport {_shouldApplyFill} from './filler.helper.js';\nimport {_decodeFill, _resolveTarget} from './filler.options.js';\n\nexport default {\n id: 'filler',\n\n afterDatasetsUpdate(chart, _args, options) {\n const count = (chart.data.datasets || []).length;\n const sources = [];\n let meta, i, line, source;\n\n for (i = 0; i < count; ++i) {\n meta = chart.getDatasetMeta(i);\n line = meta.dataset;\n source = null;\n\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\n meta.$filler = source;\n sources.push(source);\n }\n\n for (i = 0; i < count; ++i) {\n source = sources[i];\n if (!source || source.fill === false) {\n continue;\n }\n\n source.fill = _resolveTarget(sources, i, options.propagate);\n }\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\n source.line.updateControlPoints(area, source.axis);\n if (draw && source.fill) {\n _drawfill(chart.ctx, source, area);\n }\n }\n },\n\n beforeDatasetsDraw(chart, _args, options) {\n if (options.drawTime !== 'beforeDatasetsDraw') {\n return;\n }\n\n const metasets = chart.getSortedVisibleDatasetMetas();\n for (let i = metasets.length - 1; i >= 0; --i) {\n const source = metasets[i].$filler;\n\n if (_shouldApplyFill(source)) {\n _drawfill(chart.ctx, source, chart.chartArea);\n }\n }\n },\n\n beforeDatasetDraw(chart, args, options) {\n const source = args.meta.$filler;\n\n if (!_shouldApplyFill(source) || options.drawTime !== 'beforeDatasetDraw') {\n return;\n }\n\n _drawfill(chart.ctx, source, chart.chartArea);\n },\n\n defaults: {\n propagate: true,\n drawTime: 'beforeDatasetDraw'\n }\n};\n","import defaults from '../core/core.defaults.js';\nimport Element from '../core/core.element.js';\nimport layouts from '../core/core.layouts.js';\nimport {addRoundedRectPath, drawPointLegend, renderText} from '../helpers/helpers.canvas.js';\nimport {\n _isBetween,\n callback as call,\n clipArea,\n getRtlAdapter,\n overrideTextDirection,\n restoreTextDirection,\n toFont,\n toPadding,\n unclipArea,\n valueOrDefault,\n} from '../helpers/index.js';\nimport {_alignStartEnd, _textX, _toLeftRightCenter} from '../helpers/helpers.extras.js';\nimport {toTRBLCorners} from '../helpers/helpers.options.js';\n\n/**\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n */\n\nconst getBoxSize = (labelOpts, fontSize) => {\n let {boxHeight = fontSize, boxWidth = fontSize} = labelOpts;\n\n if (labelOpts.usePointStyle) {\n boxHeight = Math.min(boxHeight, fontSize);\n boxWidth = labelOpts.pointStyleWidth || Math.min(boxWidth, fontSize);\n }\n\n return {\n boxWidth,\n boxHeight,\n itemHeight: Math.max(fontSize, boxHeight)\n };\n};\n\nconst itemsEqual = (a, b) => a !== null && b !== null && a.datasetIndex === b.datasetIndex && a.index === b.index;\n\nexport class Legend extends Element {\n\n /**\n\t * @param {{ ctx: any; options: any; chart: any; }} config\n\t */\n constructor(config) {\n super();\n\n this._added = false;\n\n // Contains hit boxes for each dataset (in dataset order)\n this.legendHitBoxes = [];\n\n /**\n \t\t * @private\n \t\t */\n this._hoveredItem = null;\n\n // Are we in doughnut mode which has a different data type\n this.doughnutMode = false;\n\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\n update(maxWidth, maxHeight, margins) {\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins;\n\n this.setDimensions();\n this.buildLabels();\n this.fit();\n }\n\n setDimensions() {\n if (this.isHorizontal()) {\n this.width = this.maxWidth;\n this.left = this._margins.left;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n this.top = this._margins.top;\n this.bottom = this.height;\n }\n }\n\n buildLabels() {\n const labelOpts = this.options.labels || {};\n let legendItems = call(labelOpts.generateLabels, [this.chart], this) || [];\n\n if (labelOpts.filter) {\n legendItems = legendItems.filter((item) => labelOpts.filter(item, this.chart.data));\n }\n\n if (labelOpts.sort) {\n legendItems = legendItems.sort((a, b) => labelOpts.sort(a, b, this.chart.data));\n }\n\n if (this.options.reverse) {\n legendItems.reverse();\n }\n\n this.legendItems = legendItems;\n }\n\n fit() {\n const {options, ctx} = this;\n\n // The legend may not be displayed for a variety of reasons including\n // the fact that the defaults got set to `false`.\n // When the legend is not displayed, there are no guarantees that the options\n // are correctly formatted so we need to bail out as early as possible.\n if (!options.display) {\n this.width = this.height = 0;\n return;\n }\n\n const labelOpts = options.labels;\n const labelFont = toFont(labelOpts.font);\n const fontSize = labelFont.size;\n const titleHeight = this._computeTitleHeight();\n const {boxWidth, itemHeight} = getBoxSize(labelOpts, fontSize);\n\n let width, height;\n\n ctx.font = labelFont.string;\n\n if (this.isHorizontal()) {\n width = this.maxWidth; // fill all the width\n height = this._fitRows(titleHeight, fontSize, boxWidth, itemHeight) + 10;\n } else {\n height = this.maxHeight; // fill all the height\n width = this._fitCols(titleHeight, labelFont, boxWidth, itemHeight) + 10;\n }\n\n this.width = Math.min(width, options.maxWidth || this.maxWidth);\n this.height = Math.min(height, options.maxHeight || this.maxHeight);\n }\n\n /**\n\t * @private\n\t */\n _fitRows(titleHeight, fontSize, boxWidth, itemHeight) {\n const {ctx, maxWidth, options: {labels: {padding}}} = this;\n const hitboxes = this.legendHitBoxes = [];\n // Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one\n const lineWidths = this.lineWidths = [0];\n const lineHeight = itemHeight + padding;\n let totalHeight = titleHeight;\n\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n\n let row = -1;\n let top = -lineHeight;\n this.legendItems.forEach((legendItem, i) => {\n const itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n\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\n hitboxes[i] = {left: 0, top, row, width: itemWidth, height: itemHeight};\n\n lineWidths[lineWidths.length - 1] += itemWidth + padding;\n });\n\n return totalHeight;\n }\n\n _fitCols(titleHeight, labelFont, boxWidth, _itemHeight) {\n const {ctx, maxHeight, options: {labels: {padding}}} = this;\n const hitboxes = this.legendHitBoxes = [];\n const columnSizes = this.columnSizes = [];\n const heightLimit = maxHeight - titleHeight;\n\n let totalWidth = padding;\n let currentColWidth = 0;\n let currentColHeight = 0;\n\n let left = 0;\n let col = 0;\n\n this.legendItems.forEach((legendItem, i) => {\n const {itemWidth, itemHeight} = calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight);\n\n // If too tall, go to new column\n if (i > 0 && currentColHeight + itemHeight + 2 * padding > heightLimit) {\n totalWidth += currentColWidth + padding;\n columnSizes.push({width: currentColWidth, height: currentColHeight}); // previous column size\n left += currentColWidth + padding;\n col++;\n currentColWidth = currentColHeight = 0;\n }\n\n // Store the hitbox width and height here. Final position will be updated in `draw`\n hitboxes[i] = {left, top: currentColHeight, col, width: itemWidth, height: itemHeight};\n\n // Get max width\n currentColWidth = Math.max(currentColWidth, itemWidth);\n currentColHeight += itemHeight + padding;\n });\n\n totalWidth += currentColWidth;\n columnSizes.push({width: currentColWidth, height: currentColHeight}); // previous column size\n\n return totalWidth;\n }\n\n adjustHitBoxes() {\n if (!this.options.display) {\n return;\n }\n const titleHeight = this._computeTitleHeight();\n const {legendHitBoxes: hitboxes, options: {align, labels: {padding}, rtl}} = this;\n const rtlHelper = getRtlAdapter(rtl, this.left, this.width);\n if (this.isHorizontal()) {\n let row = 0;\n let left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n for (const hitbox of hitboxes) {\n if (row !== hitbox.row) {\n row = hitbox.row;\n left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n }\n hitbox.top += this.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, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n for (const hitbox of hitboxes) {\n if (hitbox.col !== col) {\n col = hitbox.col;\n top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n }\n hitbox.top = top;\n hitbox.left += this.left + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(hitbox.left), hitbox.width);\n top += hitbox.height + padding;\n }\n }\n }\n\n isHorizontal() {\n return this.options.position === 'top' || this.options.position === 'bottom';\n }\n\n draw() {\n if (this.options.display) {\n const ctx = this.ctx;\n clipArea(ctx, this);\n\n this._draw();\n\n unclipArea(ctx);\n }\n }\n\n /**\n\t * @private\n\t */\n _draw() {\n const {options: opts, columnSizes, lineWidths, ctx} = this;\n const {align, labels: labelOpts} = opts;\n const defaultColor = defaults.color;\n const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n const labelFont = toFont(labelOpts.font);\n const {padding} = labelOpts;\n const fontSize = labelFont.size;\n const halfFontSize = fontSize / 2;\n let cursor;\n\n this.drawTitle();\n\n // Canvas setup\n ctx.textAlign = rtlHelper.textAlign('left');\n ctx.textBaseline = 'middle';\n ctx.lineWidth = 0.5;\n ctx.font = labelFont.string;\n\n const {boxWidth, boxHeight, itemHeight} = getBoxSize(labelOpts, fontSize);\n\n // current position\n const drawLegendBox = function(x, y, legendItem) {\n if (isNaN(boxWidth) || boxWidth <= 0 || isNaN(boxHeight) || boxHeight < 0) {\n return;\n }\n\n // Set the ctx for the box\n ctx.save();\n\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\n ctx.setLineDash(valueOrDefault(legendItem.lineDash, []));\n\n if (labelOpts.usePointStyle) {\n // Recalculate x and y for drawPoint() because its expecting\n // x and y to be center of figure (instead of top left)\n const drawOptions = {\n radius: boxHeight * 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\n // Draw pointStyle as legend symbol\n drawPointLegend(ctx, drawOptions, centerX, centerY, labelOpts.pointStyleWidth && boxWidth);\n } else {\n // Draw box as legend symbol\n // Adjust position when boxHeight < fontSize (want it centered)\n const yBoxTop = y + Math.max((fontSize - boxHeight) / 2, 0);\n const xBoxLeft = rtlHelper.leftForLtr(x, boxWidth);\n const borderRadius = toTRBLCorners(legendItem.borderRadius);\n\n ctx.beginPath();\n\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\n ctx.fill();\n if (lineWidth !== 0) {\n ctx.stroke();\n }\n }\n\n ctx.restore();\n };\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\n // Horizontal\n const isHorizontal = this.isHorizontal();\n const titleHeight = this._computeTitleHeight();\n if (isHorizontal) {\n cursor = {\n x: _alignStartEnd(align, this.left + padding, this.right - lineWidths[0]),\n y: this.top + padding + titleHeight,\n line: 0\n };\n } else {\n cursor = {\n x: this.left + padding,\n y: _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[0].height),\n line: 0\n };\n }\n\n overrideTextDirection(this.ctx, opts.textDirection);\n\n const lineHeight = itemHeight + padding;\n this.legendItems.forEach((legendItem, i) => {\n ctx.strokeStyle = legendItem.fontColor; // for strikethrough effect\n ctx.fillStyle = legendItem.fontColor; // render in correct colour\n\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\n rtlHelper.setWidth(this.width);\n\n if (isHorizontal) {\n if (i > 0 && x + width + padding > this.right) {\n y = cursor.y += lineHeight;\n cursor.line++;\n x = cursor.x = _alignStartEnd(align, this.left + padding, this.right - lineWidths[cursor.line]);\n }\n } else if (i > 0 && y + lineHeight > this.bottom) {\n x = cursor.x = x + columnSizes[cursor.line].width + padding;\n cursor.line++;\n y = cursor.y = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[cursor.line].height);\n }\n\n const realX = rtlHelper.x(x);\n\n drawLegendBox(realX, y, legendItem);\n\n x = _textX(textAlign, x + boxWidth + halfFontSize, isHorizontal ? x + width : this.right, opts.rtl);\n\n // Fill the actual label\n fillText(rtlHelper.x(x), y, legendItem);\n\n if (isHorizontal) {\n cursor.x += width + padding;\n } else if (typeof legendItem.text !== 'string') {\n const fontLineHeight = labelFont.lineHeight;\n cursor.y += calculateLegendItemHeight(legendItem, fontLineHeight) + padding;\n } else {\n cursor.y += lineHeight;\n }\n });\n\n restoreTextDirection(this.ctx, opts.textDirection);\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {\n const opts = this.options;\n const titleOpts = opts.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n\n if (!titleOpts.display) {\n return;\n }\n\n const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n const ctx = this.ctx;\n const position = titleOpts.position;\n const halfFontSize = titleFont.size / 2;\n const topPaddingPlusHalfFontSize = titlePadding.top + halfFontSize;\n let y;\n\n // These defaults are used when the legend is vertical.\n // When horizontal, they are computed below.\n let left = this.left;\n let maxWidth = this.width;\n\n if (this.isHorizontal()) {\n // Move left / right so that the title is above the legend lines\n maxWidth = Math.max(...this.lineWidths);\n y = this.top + topPaddingPlusHalfFontSize;\n left = _alignStartEnd(opts.align, left, this.right - maxWidth);\n } else {\n // Move down so that the title is above the legend stack in every alignment\n const maxHeight = this.columnSizes.reduce((acc, size) => Math.max(acc, size.height), 0);\n y = topPaddingPlusHalfFontSize + _alignStartEnd(opts.align, this.top, this.bottom - maxHeight - opts.labels.padding - this._computeTitleHeight());\n }\n\n // Now that we know the left edge of the inner legend box, compute the correct\n // X coordinate from the title alignment\n const x = _alignStartEnd(position, left, left + maxWidth);\n\n // Canvas setup\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\n renderText(ctx, titleOpts.text, x, y, titleFont);\n }\n\n /**\n\t * @private\n\t */\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\n /**\n\t * @private\n\t */\n _getLegendItemAt(x, y) {\n let i, hitBox, lh;\n\n if (_isBetween(x, this.left, this.right)\n && _isBetween(y, this.top, this.bottom)) {\n // See if we are touching one of the dataset boxes\n lh = this.legendHitBoxes;\n for (i = 0; i < lh.length; ++i) {\n hitBox = lh[i];\n\n if (_isBetween(x, hitBox.left, hitBox.left + hitBox.width)\n && _isBetween(y, hitBox.top, hitBox.top + hitBox.height)) {\n // Touching an element\n return this.legendItems[i];\n }\n }\n }\n\n return null;\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e - The event to handle\n\t */\n handleEvent(e) {\n const opts = this.options;\n if (!isListened(e.type, opts)) {\n return;\n }\n\n // Chart event already has relative position in it\n const hoveredItem = this._getLegendItemAt(e.x, e.y);\n\n if (e.type === 'mousemove' || e.type === 'mouseout') {\n const previous = this._hoveredItem;\n const sameItem = itemsEqual(previous, hoveredItem);\n if (previous && !sameItem) {\n call(opts.onLeave, [e, previous, this], this);\n }\n\n this._hoveredItem = hoveredItem;\n\n if (hoveredItem && !sameItem) {\n call(opts.onHover, [e, hoveredItem, this], this);\n }\n } else if (hoveredItem) {\n call(opts.onClick, [e, hoveredItem, this], this);\n }\n }\n}\n\nfunction calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight) {\n const itemWidth = calculateItemWidth(legendItem, boxWidth, labelFont, ctx);\n const itemHeight = calculateItemHeight(_itemHeight, legendItem, labelFont.lineHeight);\n return {itemWidth, itemHeight};\n}\n\nfunction calculateItemWidth(legendItem, boxWidth, labelFont, ctx) {\n let legendItemText = legendItem.text;\n if (legendItemText && typeof legendItemText !== 'string') {\n legendItemText = legendItemText.reduce((a, b) => a.length > b.length ? a : b);\n }\n return boxWidth + (labelFont.size / 2) + ctx.measureText(legendItemText).width;\n}\n\nfunction calculateItemHeight(_itemHeight, legendItem, fontLineHeight) {\n let itemHeight = _itemHeight;\n if (typeof legendItem.text !== 'string') {\n itemHeight = calculateLegendItemHeight(legendItem, fontLineHeight);\n }\n return itemHeight;\n}\n\nfunction calculateLegendItemHeight(legendItem, fontLineHeight) {\n const labelHeight = legendItem.text ? legendItem.text.length : 0;\n return fontLineHeight * labelHeight;\n}\n\nfunction isListened(type, opts) {\n if ((type === 'mousemove' || type === 'mouseout') && (opts.onHover || opts.onLeave)) {\n return true;\n }\n if (opts.onClick && (type === 'click' || type === 'mouseup')) {\n return true;\n }\n return false;\n}\n\nexport default {\n id: 'legend',\n\n /**\n\t * For tests\n\t * @private\n\t */\n _element: Legend,\n\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\n stop(chart) {\n layouts.removeBox(chart, chart.legend);\n delete chart.legend;\n },\n\n // During the beforeUpdate step, the layout configuration needs to run\n // This ensures that if the legend position changes (via an option update)\n // the layout system respects the change. See https://github.com/chartjs/Chart.js/issues/7527\n beforeUpdate(chart, _args, options) {\n const legend = chart.legend;\n layouts.configure(chart, legend, options);\n legend.options = options;\n },\n\n // The labels need to be built after datasets are updated to ensure that colors\n // and other styling are correct. See https://github.com/chartjs/Chart.js/issues/6968\n afterUpdate(chart) {\n const legend = chart.legend;\n legend.buildLabels();\n legend.adjustHitBoxes();\n },\n\n\n afterEvent(chart, args) {\n if (!args.replay) {\n chart.legend.handleEvent(args.event);\n }\n },\n\n defaults: {\n display: true,\n position: 'top',\n align: 'center',\n fullSize: true,\n reverse: false,\n weight: 1000,\n\n // a callback that will handle\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\n onHover: null,\n onLeave: null,\n\n labels: {\n color: (ctx) => ctx.chart.options.color,\n boxWidth: 40,\n padding: 10,\n // Generates labels shown in the legend\n // Valid properties to return:\n // text : text to display\n // fillStyle : fill of coloured box\n // strokeStyle: stroke of coloured box\n // hidden : if this legend item refers to a hidden item\n // lineCap : cap style for line\n // lineDash\n // lineDashOffset :\n // lineJoin :\n // lineWidth :\n generateLabels(chart) {\n const datasets = chart.data.datasets;\n const {labels: {usePointStyle, pointStyle, textAlign, color, useBorderRadius, borderRadius}} = chart.legend.options;\n\n return chart._getSortedDatasetMetas().map((meta) => {\n const style = meta.controller.getStyle(usePointStyle ? 0 : undefined);\n const borderWidth = toPadding(style.borderWidth);\n\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: useBorderRadius && (borderRadius || style.borderRadius),\n\n // Below is extra data used for toggling the datasets\n datasetIndex: meta.index\n };\n }, this);\n }\n },\n\n title: {\n color: (ctx) => ctx.chart.options.color,\n display: false,\n position: 'center',\n text: '',\n }\n },\n\n descriptors: {\n _scriptable: (name) => !name.startsWith('on'),\n labels: {\n _scriptable: (name) => !['generateLabels', 'filter', 'sort'].includes(name),\n }\n },\n};\n","import {Title} from './plugin.title.js';\nimport layouts from '../core/core.layouts.js';\n\nconst map = new WeakMap();\n\nexport default {\n id: 'subtitle',\n\n start(chart, _args, options) {\n const title = new Title({\n ctx: chart.ctx,\n options,\n chart\n });\n\n layouts.configure(chart, title, options);\n layouts.addBox(chart, title);\n map.set(chart, title);\n },\n\n stop(chart) {\n layouts.removeBox(chart, map.get(chart));\n map.delete(chart);\n },\n\n beforeUpdate(chart, _args, options) {\n const title = map.get(chart);\n layouts.configure(chart, title, options);\n title.options = options;\n },\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 // by default greater than legend (1000) and smaller than title (2000)\n },\n\n defaultRoutes: {\n color: 'color'\n },\n\n descriptors: {\n _scriptable: true,\n _indexable: false,\n },\n};\n","import Element from '../core/core.element.js';\nimport layouts from '../core/core.layouts.js';\nimport {PI, isArray, toPadding, toFont} from '../helpers/index.js';\nimport {_toLeftRightCenter, _alignStartEnd} from '../helpers/helpers.extras.js';\nimport {renderText} from '../helpers/helpers.canvas.js';\n\nexport class Title extends Element {\n /**\n\t * @param {{ ctx: any; options: any; chart: any; }} config\n\t */\n constructor(config) {\n super();\n\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\n update(maxWidth, maxHeight) {\n const opts = this.options;\n\n this.left = 0;\n this.top = 0;\n\n if (!opts.display) {\n this.width = this.height = this.right = this.bottom = 0;\n return;\n }\n\n this.width = this.right = maxWidth;\n this.height = this.bottom = maxHeight;\n\n const lineCount = isArray(opts.text) ? opts.text.length : 1;\n this._padding = toPadding(opts.padding);\n const textSize = lineCount * toFont(opts.font).lineHeight + this._padding.height;\n\n if (this.isHorizontal()) {\n this.height = textSize;\n } else {\n this.width = textSize;\n }\n }\n\n isHorizontal() {\n const pos = this.options.position;\n return pos === 'top' || pos === 'bottom';\n }\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\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\n draw() {\n const ctx = this.ctx;\n const opts = this.options;\n\n if (!opts.display) {\n return;\n }\n\n const fontOpts = toFont(opts.font);\n const lineHeight = fontOpts.lineHeight;\n const offset = lineHeight / 2 + this._padding.top;\n const {titleX, titleY, maxWidth, rotation} = this._drawArgs(offset);\n\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}\n\nfunction createTitle(chart, titleOpts) {\n const title = new Title({\n ctx: chart.ctx,\n options: titleOpts,\n chart\n });\n\n layouts.configure(chart, title, titleOpts);\n layouts.addBox(chart, title);\n chart.titleBlock = title;\n}\n\nexport default {\n id: 'title',\n\n /**\n\t * For tests\n\t * @private\n\t */\n _element: Title,\n\n start(chart, _args, options) {\n createTitle(chart, options);\n },\n\n stop(chart) {\n const titleBlock = chart.titleBlock;\n layouts.removeBox(chart, titleBlock);\n delete chart.titleBlock;\n },\n\n beforeUpdate(chart, _args, options) {\n const title = chart.titleBlock;\n layouts.configure(chart, title, options);\n title.options = options;\n },\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 // by default greater than legend (1000) to be above\n },\n\n defaultRoutes: {\n color: 'color'\n },\n\n descriptors: {\n _scriptable: true,\n _indexable: false,\n },\n};\n","import Animations from '../core/core.animations.js';\nimport Element from '../core/core.element.js';\nimport {addRoundedRectPath} from '../helpers/helpers.canvas.js';\nimport {each, noop, isNullOrUndef, isArray, _elementsEqual, isObject} from '../helpers/helpers.core.js';\nimport {toFont, toPadding, toTRBLCorners} from '../helpers/helpers.options.js';\nimport {getRtlAdapter, overrideTextDirection, restoreTextDirection} from '../helpers/helpers.rtl.js';\nimport {distanceBetweenPoints, _limitValue} from '../helpers/helpers.math.js';\nimport {createContext, drawPoint} from '../helpers/index.js';\n\n/**\n * @typedef { import('../platform/platform.base.js').Chart } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../types/index.js').ActiveElement } ActiveElement\n * @typedef { import('../core/core.interaction.js').InteractionItem } InteractionItem\n */\n\nconst positioners = {\n /**\n\t * Average mode places the tooltip at the average position of the elements shown\n\t */\n average(items) {\n if (!items.length) {\n return false;\n }\n\n let i, len;\n let x = 0;\n let y = 0;\n let count = 0;\n\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\n return {\n x: x / count,\n y: y / count\n };\n },\n\n /**\n\t * Gets the tooltip position nearest of the item nearest to the event position\n\t */\n nearest(items, eventPosition) {\n if (!items.length) {\n return false;\n }\n\n let x = eventPosition.x;\n let y = eventPosition.y;\n let minDistance = Number.POSITIVE_INFINITY;\n let i, len, nearestElement;\n\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\n if (d < minDistance) {\n minDistance = d;\n nearestElement = el;\n }\n }\n }\n\n if (nearestElement) {\n const tp = nearestElement.tooltipPosition();\n x = tp.x;\n y = tp.y;\n }\n\n return {\n x,\n y\n };\n }\n};\n\n// Helper to push or concat based on if the 2nd parameter is an array or not\nfunction pushOrConcat(base, toPush) {\n if (toPush) {\n if (isArray(toPush)) {\n // base = base.concat(toPush);\n Array.prototype.push.apply(base, toPush);\n } else {\n base.push(toPush);\n }\n }\n\n return base;\n}\n\n/**\n * Returns array of strings split by newline\n * @param {*} str - The value to split by newline.\n * @returns {string|string[]} value if newline present - Returned from String split() method\n * @function\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}\n\n\n/**\n * Private helper to create a tooltip item model\n * @param {Chart} chart\n * @param {ActiveElement} item - {element, index, datasetIndex} to create the tooltip item for\n * @return new tooltip item\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\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}\n\n/**\n * Get the size of the tooltip\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\n const padding = toPadding(options.padding);\n let height = padding.height;\n let width = 0;\n\n // Count of all lines in the body\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\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 // Body lines may include some extra height depending on boxHeight\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\n // Title width\n let widthPadding = 0;\n const maxLineWidth = function(line) {\n width = Math.max(width, ctx.measureText(line).width + widthPadding);\n };\n\n ctx.save();\n\n ctx.font = titleFont.string;\n each(tooltip.title, maxLineWidth);\n\n // Body width\n ctx.font = bodyFont.string;\n each(tooltip.beforeBody.concat(tooltip.afterBody), maxLineWidth);\n\n // Body lines may include some extra width due to the color box\n widthPadding = options.displayColors ? (boxWidth + 2 + options.boxPadding) : 0;\n each(body, (bodyItem) => {\n each(bodyItem.before, maxLineWidth);\n each(bodyItem.lines, maxLineWidth);\n each(bodyItem.after, maxLineWidth);\n });\n\n // Reset back to 0\n widthPadding = 0;\n\n // Footer width\n ctx.font = footerFont.string;\n each(tooltip.footer, maxLineWidth);\n\n ctx.restore();\n\n // Add padding\n width += padding.width;\n\n return {width, height};\n}\n\nfunction determineYAlign(chart, size) {\n const {y, height} = size;\n\n if (y < height / 2) {\n return 'top';\n } else if (y > (chart.height - height / 2)) {\n return 'bottom';\n }\n return 'center';\n}\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\n if (xAlign === 'right' && x - width - caret < 0) {\n return true;\n }\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\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\n if (doesNotFitWithAlign(xAlign, chart, options, size)) {\n xAlign = 'center';\n }\n\n return xAlign;\n}\n\n/**\n * Helper to get the alignment of a tooltip given the size\n */\nfunction determineAlignment(chart, options, size) {\n const yAlign = size.yAlign || options.yAlign || determineYAlign(chart, size);\n\n return {\n xAlign: size.xAlign || options.xAlign || determineXAlign(chart, options, size, yAlign),\n yAlign\n };\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}\n\nfunction alignY(size, yAlign, paddingAndSize) {\n // eslint-disable-next-line prefer-const\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}\n\n/**\n * Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment\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 {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(cornerRadius);\n\n let x = alignX(size, xAlign);\n const y = alignY(size, yAlign, paddingAndSize);\n\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 -= Math.max(topLeft, bottomLeft) + caretSize;\n } else if (xAlign === 'right') {\n x += Math.max(topRight, bottomRight) + caretSize;\n }\n\n return {\n x: _limitValue(x, 0, chart.width - size.width),\n y: _limitValue(y, 0, chart.height - size.height)\n };\n}\n\nfunction getAlignedX(tooltip, align, options) {\n const padding = toPadding(options.padding);\n\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}\n\n/**\n * Helper to build before and after body lines\n */\nfunction getBeforeAfterBodyLines(callback) {\n return pushOrConcat([], splitNewlines(callback));\n}\n\nfunction createTooltipContext(parent, tooltip, tooltipItems) {\n return createContext(parent, {\n tooltip,\n tooltipItems,\n type: 'tooltip'\n });\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}\n\nconst defaultCallbacks = {\n // Args are: (tooltipItems, data)\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\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\n return '';\n },\n afterTitle: noop,\n\n // Args are: (tooltipItems, data)\n beforeBody: noop,\n\n // Args are: (tooltipItem, data)\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\n let label = tooltipItem.dataset.label || '';\n\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\n // Args are: (tooltipItems, data)\n afterBody: noop,\n\n // Args are: (tooltipItems, data)\n beforeFooter: noop,\n footer: noop,\n afterFooter: noop\n};\n\n/**\n * Invoke callback from object with context and arguments.\n * If callback returns `undefined`, then will be invoked default callback.\n * @param {Record} callbacks\n * @param {keyof typeof defaultCallbacks} name\n * @param {*} ctx\n * @param {*} arg\n * @returns {any}\n */\nfunction invokeCallbackWithFallback(callbacks, name, ctx, arg) {\n const result = callbacks[name].call(ctx, arg);\n\n if (typeof result === 'undefined') {\n return defaultCallbacks[name].call(ctx, arg);\n }\n\n return result;\n}\n\nexport class Tooltip extends Element {\n\n /**\n * @namespace Chart.Tooltip.positioners\n */\n static positioners = positioners;\n\n constructor(config) {\n super();\n\n this.opacity = 0;\n this._active = [];\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.chart = config.chart;\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 // TODO: V4, make this private, rename to `_labelStyles`, and combine with `labelPointStyles`\n // and `labelTextColors` to create a single variable\n this.labelColors = undefined;\n this.labelPointStyles = undefined;\n this.labelTextColors = undefined;\n }\n\n initialize(options) {\n this.options = options;\n this._cachedAnimations = undefined;\n this.$context = undefined;\n }\n\n /**\n\t * @private\n\t */\n _resolveAnimations() {\n const cached = this._cachedAnimations;\n\n if (cached) {\n return cached;\n }\n\n const chart = this.chart;\n const options = this.options.setContext(this.getContext());\n const opts = options.enabled && chart.options.animation && options.animations;\n const animations = new Animations(this.chart, opts);\n if (opts._cacheable) {\n this._cachedAnimations = Object.freeze(animations);\n }\n\n return animations;\n }\n\n /**\n\t * @protected\n\t */\n getContext() {\n return this.$context ||\n\t\t\t(this.$context = createTooltipContext(this.chart.getContext(), this, this._tooltipItems));\n }\n\n getTitle(context, options) {\n const {callbacks} = options;\n\n const beforeTitle = invokeCallbackWithFallback(callbacks, 'beforeTitle', this, context);\n const title = invokeCallbackWithFallback(callbacks, 'title', this, context);\n const afterTitle = invokeCallbackWithFallback(callbacks, 'afterTitle', this, context);\n\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeTitle));\n lines = pushOrConcat(lines, splitNewlines(title));\n lines = pushOrConcat(lines, splitNewlines(afterTitle));\n\n return lines;\n }\n\n getBeforeBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(\n invokeCallbackWithFallback(options.callbacks, 'beforeBody', this, tooltipItems)\n );\n }\n\n getBody(tooltipItems, options) {\n const {callbacks} = options;\n const bodyItems = [];\n\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(invokeCallbackWithFallback(scoped, 'beforeLabel', this, context)));\n pushOrConcat(bodyItem.lines, invokeCallbackWithFallback(scoped, 'label', this, context));\n pushOrConcat(bodyItem.after, splitNewlines(invokeCallbackWithFallback(scoped, 'afterLabel', this, context)));\n\n bodyItems.push(bodyItem);\n });\n\n return bodyItems;\n }\n\n getAfterBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(\n invokeCallbackWithFallback(options.callbacks, 'afterBody', this, tooltipItems)\n );\n }\n\n // Get the footer and beforeFooter and afterFooter lines\n getFooter(tooltipItems, options) {\n const {callbacks} = options;\n\n const beforeFooter = invokeCallbackWithFallback(callbacks, 'beforeFooter', this, tooltipItems);\n const footer = invokeCallbackWithFallback(callbacks, 'footer', this, tooltipItems);\n const afterFooter = invokeCallbackWithFallback(callbacks, 'afterFooter', this, tooltipItems);\n\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeFooter));\n lines = pushOrConcat(lines, splitNewlines(footer));\n lines = pushOrConcat(lines, splitNewlines(afterFooter));\n\n return lines;\n }\n\n /**\n\t * @private\n\t */\n _createItems(options) {\n const active = this._active;\n const data = this.chart.data;\n const labelColors = [];\n const labelPointStyles = [];\n const labelTextColors = [];\n let tooltipItems = [];\n let i, len;\n\n for (i = 0, len = active.length; i < len; ++i) {\n tooltipItems.push(createTooltipItem(this.chart, active[i]));\n }\n\n // If the user provided a filter function, use it to modify the tooltip items\n if (options.filter) {\n tooltipItems = tooltipItems.filter((element, index, array) => options.filter(element, index, array, data));\n }\n\n // If the user provided a sorting function, use it to modify the tooltip items\n if (options.itemSort) {\n tooltipItems = tooltipItems.sort((a, b) => options.itemSort(a, b, data));\n }\n\n // Determine colors for boxes\n each(tooltipItems, (context) => {\n const scoped = overrideCallbacks(options.callbacks, context);\n labelColors.push(invokeCallbackWithFallback(scoped, 'labelColor', this, context));\n labelPointStyles.push(invokeCallbackWithFallback(scoped, 'labelPointStyle', this, context));\n labelTextColors.push(invokeCallbackWithFallback(scoped, 'labelTextColor', this, context));\n });\n\n this.labelColors = labelColors;\n this.labelPointStyles = labelPointStyles;\n this.labelTextColors = labelTextColors;\n this.dataPoints = tooltipItems;\n return tooltipItems;\n }\n\n update(changed, replay) {\n const options = this.options.setContext(this.getContext());\n const active = this._active;\n let properties;\n let tooltipItems = [];\n\n if (!active.length) {\n if (this.opacity !== 0) {\n properties = {\n opacity: 0\n };\n }\n } else {\n const position = positioners[options.position].call(this, active, this._eventPosition);\n tooltipItems = this._createItems(options);\n\n this.title = this.getTitle(tooltipItems, options);\n this.beforeBody = this.getBeforeBody(tooltipItems, options);\n this.body = this.getBody(tooltipItems, options);\n this.afterBody = this.getAfterBody(tooltipItems, options);\n this.footer = this.getFooter(tooltipItems, options);\n\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, size);\n const alignment = determineAlignment(this.chart, options, positionAndSize);\n const backgroundPoint = getBackgroundPoint(options, positionAndSize, alignment, this.chart);\n\n this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n\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\n this._tooltipItems = tooltipItems;\n this.$context = undefined;\n\n if (properties) {\n this._resolveAnimations().update(this, properties);\n }\n\n if (changed && options.external) {\n options.external.call(this, {chart: this.chart, tooltip: this, replay});\n }\n }\n\n drawCaret(tooltipPoint, ctx, size, options) {\n const caretPosition = this.getCaretPosition(tooltipPoint, size, options);\n\n ctx.lineTo(caretPosition.x1, caretPosition.y1);\n ctx.lineTo(caretPosition.x2, caretPosition.y2);\n ctx.lineTo(caretPosition.x3, caretPosition.y3);\n }\n\n getCaretPosition(tooltipPoint, size, options) {\n const {xAlign, yAlign} = this;\n const {caretSize, cornerRadius} = options;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(cornerRadius);\n const {x: ptX, y: ptY} = tooltipPoint;\n const {width, height} = size;\n let x1, x2, x3, y1, y2, y3;\n\n if (yAlign === 'center') {\n y2 = ptY + (height / 2);\n\n if (xAlign === 'left') {\n x1 = ptX;\n x2 = x1 - caretSize;\n\n // Left draws bottom -> top, this y1 is on the bottom\n y1 = y2 + caretSize;\n y3 = y2 - caretSize;\n } else {\n x1 = ptX + width;\n x2 = x1 + caretSize;\n\n // Right draws top -> bottom, thus y1 is on the top\n y1 = y2 - caretSize;\n y3 = y2 + caretSize;\n }\n\n x3 = x1;\n } else {\n if (xAlign === 'left') {\n x2 = ptX + Math.max(topLeft, bottomLeft) + (caretSize);\n } else if (xAlign === 'right') {\n x2 = ptX + width - Math.max(topRight, bottomRight) - caretSize;\n } else {\n x2 = this.caretX;\n }\n\n if (yAlign === 'top') {\n y1 = ptY;\n y2 = y1 - caretSize;\n\n // Top draws left -> right, thus x1 is on the left\n x1 = x2 - caretSize;\n x3 = x2 + caretSize;\n } else {\n y1 = ptY + height;\n y2 = y1 + caretSize;\n\n // Bottom draws right -> left, thus x1 is on the right\n x1 = x2 + caretSize;\n x3 = x2 - caretSize;\n }\n y3 = y1;\n }\n return {x1, x2, x3, y1, y2, y3};\n }\n\n drawTitle(pt, ctx, options) {\n const title = this.title;\n const length = title.length;\n let titleFont, titleSpacing, i;\n\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n pt.x = getAlignedX(this, options.titleAlign, options);\n\n ctx.textAlign = rtlHelper.textAlign(options.titleAlign);\n ctx.textBaseline = 'middle';\n\n titleFont = toFont(options.titleFont);\n titleSpacing = options.titleSpacing;\n\n ctx.fillStyle = options.titleColor;\n ctx.font = titleFont.string;\n\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; // Line Height and spacing\n\n if (i + 1 === length) {\n pt.y += options.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing\n }\n }\n }\n }\n\n /**\n\t * @private\n\t */\n _drawColorBox(ctx, pt, i, rtlHelper, options) {\n const labelColor = this.labelColors[i];\n const labelPointStyle = this.labelPointStyles[i];\n const {boxHeight, boxWidth} = options;\n const bodyFont = toFont(options.bodyFont);\n const colorX = getAlignedX(this, '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\n if (options.usePointStyle) {\n const drawOptions = {\n radius: Math.min(boxWidth, boxHeight) / 2, // fit the circle in the box\n pointStyle: labelPointStyle.pointStyle,\n rotation: labelPointStyle.rotation,\n borderWidth: 1\n };\n // Recalculate x and y for drawPoint() because its expecting\n // x and y to be center of figure (instead of top left)\n const centerX = rtlHelper.leftForLtr(rtlColorX, boxWidth) + boxWidth / 2;\n const centerY = colorY + boxHeight / 2;\n\n // Fill the point with white so that colours merge nicely if the opacity is < 1\n ctx.strokeStyle = options.multiKeyBackground;\n ctx.fillStyle = options.multiKeyBackground;\n drawPoint(ctx, drawOptions, centerX, centerY);\n\n // Draw the point\n ctx.strokeStyle = labelColor.borderColor;\n ctx.fillStyle = labelColor.backgroundColor;\n drawPoint(ctx, drawOptions, centerX, centerY);\n } else {\n // Border\n ctx.lineWidth = isObject(labelColor.borderWidth) ? Math.max(...Object.values(labelColor.borderWidth)) : (labelColor.borderWidth || 1); // TODO, v4 remove fallback\n ctx.strokeStyle = labelColor.borderColor;\n ctx.setLineDash(labelColor.borderDash || []);\n ctx.lineDashOffset = labelColor.borderDashOffset || 0;\n\n // Fill a white rect so that colours merge nicely if the opacity is < 1\n const outerX = rtlHelper.leftForLtr(rtlColorX, boxWidth);\n const innerX = rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), boxWidth - 2);\n const borderRadius = toTRBLCorners(labelColor.borderRadius);\n\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\n // Inner square\n ctx.fillStyle = labelColor.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 // Normal rect\n ctx.fillStyle = options.multiKeyBackground;\n ctx.fillRect(outerX, colorY, boxWidth, boxHeight);\n ctx.strokeRect(outerX, colorY, boxWidth, boxHeight);\n // Inner square\n ctx.fillStyle = labelColor.backgroundColor;\n ctx.fillRect(innerX, colorY + 1, boxWidth - 2, boxHeight - 2);\n }\n }\n\n // restore fillStyle\n ctx.fillStyle = this.labelTextColors[i];\n }\n\n drawBody(pt, ctx, options) {\n const {body} = this;\n const {bodySpacing, bodyAlign, displayColors, boxHeight, boxWidth, boxPadding} = options;\n const bodyFont = toFont(options.bodyFont);\n let bodyLineHeight = bodyFont.lineHeight;\n let xLinePadding = 0;\n\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\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\n const bodyAlignForCalculation = rtlHelper.textAlign(bodyAlign);\n let bodyItem, textColor, lines, i, j, ilen, jlen;\n\n ctx.textAlign = bodyAlign;\n ctx.textBaseline = 'middle';\n ctx.font = bodyFont.string;\n\n pt.x = getAlignedX(this, bodyAlignForCalculation, options);\n\n // Before body lines\n ctx.fillStyle = options.bodyColor;\n each(this.beforeBody, fillLineOfText);\n\n xLinePadding = displayColors && bodyAlignForCalculation !== 'right'\n ? bodyAlign === 'center' ? (boxWidth / 2 + boxPadding) : (boxWidth + 2 + boxPadding)\n : 0;\n\n // Draw body lines now\n for (i = 0, ilen = body.length; i < ilen; ++i) {\n bodyItem = body[i];\n textColor = this.labelTextColors[i];\n\n ctx.fillStyle = textColor;\n each(bodyItem.before, fillLineOfText);\n\n lines = bodyItem.lines;\n // Draw Legend-like boxes if needed\n if (displayColors && lines.length) {\n this._drawColorBox(ctx, pt, i, rtlHelper, options);\n bodyLineHeight = Math.max(bodyFont.lineHeight, boxHeight);\n }\n\n for (j = 0, jlen = lines.length; j < jlen; ++j) {\n fillLineOfText(lines[j]);\n // Reset for any lines that don't include colorbox\n bodyLineHeight = bodyFont.lineHeight;\n }\n\n each(bodyItem.after, fillLineOfText);\n }\n\n // Reset back to 0 for after body\n xLinePadding = 0;\n bodyLineHeight = bodyFont.lineHeight;\n\n // After body lines\n each(this.afterBody, fillLineOfText);\n pt.y -= bodySpacing; // Remove last body spacing\n }\n\n drawFooter(pt, ctx, options) {\n const footer = this.footer;\n const length = footer.length;\n let footerFont, i;\n\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n pt.x = getAlignedX(this, options.footerAlign, options);\n pt.y += options.footerMarginTop;\n\n ctx.textAlign = rtlHelper.textAlign(options.footerAlign);\n ctx.textBaseline = 'middle';\n\n footerFont = toFont(options.footerFont);\n\n ctx.fillStyle = options.footerColor;\n ctx.font = footerFont.string;\n\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\n drawBackground(pt, ctx, tooltipSize, options) {\n const {xAlign, yAlign} = this;\n const {x, y} = pt;\n const {width, height} = tooltipSize;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(options.cornerRadius);\n\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n\n ctx.beginPath();\n ctx.moveTo(x + topLeft, y);\n if (yAlign === 'top') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width - topRight, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + topRight);\n if (yAlign === 'center' && xAlign === 'right') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width, y + height - bottomRight);\n ctx.quadraticCurveTo(x + width, y + height, x + width - bottomRight, y + height);\n if (yAlign === 'bottom') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + bottomLeft, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - bottomLeft);\n if (yAlign === 'center' && xAlign === 'left') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x, y + topLeft);\n ctx.quadraticCurveTo(x, y, x + topLeft, y);\n ctx.closePath();\n\n ctx.fill();\n\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n }\n\n /**\n\t * Update x/y animation targets when _active elements are animating too\n\t * @private\n\t */\n _updateAnimationTarget(options) {\n const chart = this.chart;\n const anims = this.$animations;\n const animX = anims && anims.x;\n const animY = anims && anims.y;\n if (animX || animY) {\n const position = positioners[options.position].call(this, this._active, this._eventPosition);\n if (!position) {\n return;\n }\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, this._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 this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n this.width = size.width;\n this.height = size.height;\n this.caretX = position.x;\n this.caretY = position.y;\n this._resolveAnimations().update(this, point);\n }\n }\n }\n\n /**\n * Determine if the tooltip will draw anything\n * @returns {boolean} True if the tooltip will render\n */\n _willRender() {\n return !!this.opacity;\n }\n\n draw(ctx) {\n const options = this.options.setContext(this.getContext());\n let opacity = this.opacity;\n\n if (!opacity) {\n return;\n }\n\n this._updateAnimationTarget(options);\n\n const tooltipSize = {\n width: this.width,\n height: this.height\n };\n const pt = {\n x: this.x,\n y: this.y\n };\n\n // IE11/Edge does not like very small opacities, so snap to 0\n opacity = Math.abs(opacity) < 1e-3 ? 0 : opacity;\n\n const padding = toPadding(options.padding);\n\n // Truthy/falsey value for empty tooltip\n const hasTooltipContent = this.title.length || this.beforeBody.length || this.body.length || this.afterBody.length || this.footer.length;\n\n if (options.enabled && hasTooltipContent) {\n ctx.save();\n ctx.globalAlpha = opacity;\n\n // Draw Background\n this.drawBackground(pt, ctx, tooltipSize, options);\n\n overrideTextDirection(ctx, options.textDirection);\n\n pt.y += padding.top;\n\n // Titles\n this.drawTitle(pt, ctx, options);\n\n // Body\n this.drawBody(pt, ctx, options);\n\n // Footer\n this.drawFooter(pt, ctx, options);\n\n restoreTextDirection(ctx, options.textDirection);\n\n ctx.restore();\n }\n }\n\n /**\n\t * Get active elements in the tooltip\n\t * @returns {Array} Array of elements that are active in the tooltip\n\t */\n getActiveElements() {\n return this._active || [];\n }\n\n /**\n\t * Set active elements in the tooltip\n\t * @param {array} activeElements Array of active datasetIndex/index pairs.\n\t * @param {object} eventPosition Synthetic event position used in positioning\n\t */\n setActiveElements(activeElements, eventPosition) {\n const lastActive = this._active;\n const active = activeElements.map(({datasetIndex, index}) => {\n const meta = this.chart.getDatasetMeta(datasetIndex);\n\n if (!meta) {\n throw new Error('Cannot find a dataset at index ' + datasetIndex);\n }\n\n return {\n datasetIndex,\n element: meta.data[index],\n index,\n };\n });\n const changed = !_elementsEqual(lastActive, active);\n const positionChanged = this._positionChanged(active, eventPosition);\n\n if (changed || positionChanged) {\n this._active = active;\n this._eventPosition = eventPosition;\n this._ignoreReplayEvents = true;\n this.update(true);\n }\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e - The event to handle\n\t * @param {boolean} [replay] - This is a replayed event (from update)\n\t * @param {boolean} [inChartArea] - The event is inside chartArea\n\t * @returns {boolean} true if the tooltip changed\n\t */\n handleEvent(e, replay, inChartArea = true) {\n if (replay && this._ignoreReplayEvents) {\n return false;\n }\n this._ignoreReplayEvents = false;\n\n const options = this.options;\n const lastActive = this._active || [];\n const active = this._getActiveElements(e, lastActive, replay, inChartArea);\n\n // When there are multiple items shown, but the tooltip position is nearest mode\n // an update may need to be made because our position may have changed even though\n // the items are the same as before.\n const positionChanged = this._positionChanged(active, e);\n\n // Remember Last Actives\n const changed = replay || !_elementsEqual(active, lastActive) || positionChanged;\n\n // Only handle target event on tooltip change\n if (changed) {\n this._active = active;\n\n if (options.enabled || options.external) {\n this._eventPosition = {\n x: e.x,\n y: e.y\n };\n\n this.update(true, replay);\n }\n }\n\n return changed;\n }\n\n /**\n\t * Helper for determining the active elements for event\n\t * @param {ChartEvent} e - The event to handle\n\t * @param {InteractionItem[]} lastActive - Previously active elements\n\t * @param {boolean} [replay] - This is a replayed event (from update)\n\t * @param {boolean} [inChartArea] - The event is inside chartArea\n\t * @returns {InteractionItem[]} - Active elements\n\t * @private\n\t */\n _getActiveElements(e, lastActive, replay, inChartArea) {\n const options = this.options;\n\n if (e.type === 'mouseout') {\n return [];\n }\n\n if (!inChartArea) {\n // Let user control the active elements outside chartArea. Eg. using Legend.\n return lastActive;\n }\n\n // Find Active Elements for tooltips\n const active = this.chart.getElementsAtEventForMode(e, options.mode, options, replay);\n\n if (options.reverse) {\n active.reverse();\n }\n\n return active;\n }\n\n /**\n\t * Determine if the active elements + event combination changes the\n\t * tooltip position\n\t * @param {array} active - Active elements\n\t * @param {ChartEvent} e - Event that triggered the position change\n\t * @returns {boolean} True if the position has changed\n\t */\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}\n\nexport default {\n id: 'tooltip',\n _element: Tooltip,\n positioners,\n\n afterInit(chart, _args, options) {\n if (options) {\n chart.tooltip = new Tooltip({chart, options});\n }\n },\n\n beforeUpdate(chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n\n reset(chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n\n afterDraw(chart) {\n const tooltip = chart.tooltip;\n\n if (tooltip && tooltip._willRender()) {\n const args = {\n tooltip\n };\n\n if (chart.notifyPlugins('beforeTooltipDraw', {...args, cancelable: true}) === false) {\n return;\n }\n\n tooltip.draw(chart.ctx);\n\n chart.notifyPlugins('afterTooltipDraw', args);\n }\n },\n\n afterEvent(chart, args) {\n if (chart.tooltip) {\n // If the event is replayed from `update`, we should evaluate with the final positions.\n const useFinalPosition = args.replay;\n if (chart.tooltip.handleEvent(args.event, useFinalPosition, args.inChartArea)) {\n // notify chart about the change, so it will render\n args.changed = true;\n }\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 boxPadding: 0,\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: defaultCallbacks\n },\n\n defaultRoutes: {\n bodyFont: 'font',\n footerFont: 'font',\n titleFont: 'font'\n },\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\n // Resolve additionally from `interaction` options and defaults.\n additionalOptionScopes: ['interaction']\n};\n","import Scale from '../core/core.scale.js';\nimport {isNullOrUndef, valueOrDefault, _limitValue} from '../helpers/index.js';\n\nconst addIfString = (labels, raw, index, addedLabels) => {\n if (typeof raw === 'string') {\n index = labels.push(raw) - 1;\n addedLabels.unshift({index, label: raw});\n } else if (isNaN(raw)) {\n index = null;\n }\n return index;\n};\n\nfunction findOrAddLabel(labels, raw, index, addedLabels) {\n const first = labels.indexOf(raw);\n if (first === -1) {\n return addIfString(labels, raw, index, addedLabels);\n }\n const last = labels.lastIndexOf(raw);\n return first !== last ? index : first;\n}\n\nconst validIndex = (index, max) => index === null ? null : _limitValue(Math.round(index), 0, max);\n\nfunction _getLabelForValue(value) {\n const labels = this.getLabels();\n\n if (value >= 0 && value < labels.length) {\n return labels[value];\n }\n return value;\n}\n\nexport default class CategoryScale extends Scale {\n\n static id = 'category';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: _getLabelForValue\n }\n };\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this._startValue = undefined;\n this._valueRange = 0;\n this._addedLabels = [];\n }\n\n init(scaleOptions) {\n const added = this._addedLabels;\n if (added.length) {\n const labels = this.getLabels();\n for (const {index, label} of added) {\n if (labels[index] === label) {\n labels.splice(index, 1);\n }\n }\n this._addedLabels = [];\n }\n super.init(scaleOptions);\n }\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), this._addedLabels);\n return validIndex(index, labels.length - 1);\n }\n\n determineDataLimits() {\n const {minDefined, maxDefined} = this.getUserBounds();\n let {min, max} = this.getMinMax(true);\n\n if (this.options.bounds === 'ticks') {\n if (!minDefined) {\n min = 0;\n }\n if (!maxDefined) {\n max = this.getLabels().length - 1;\n }\n }\n\n this.min = min;\n this.max = max;\n }\n\n buildTicks() {\n const min = this.min;\n const max = this.max;\n const offset = this.options.offset;\n const ticks = [];\n let labels = this.getLabels();\n\n // If we are viewing some subset of labels, slice the original array\n labels = (min === 0 && max === labels.length - 1) ? labels : labels.slice(min, max + 1);\n\n this._valueRange = Math.max(labels.length - (offset ? 0 : 1), 1);\n this._startValue = this.min - (offset ? 0.5 : 0);\n\n for (let value = min; value <= max; value++) {\n ticks.push({value});\n }\n return ticks;\n }\n\n getLabelForValue(value) {\n return _getLabelForValue.call(this, value);\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n super.configure();\n\n if (!this.isHorizontal()) {\n // For backward compatibility, vertical category scale reverse is inverted.\n this._reversePixels = !this._reversePixels;\n }\n }\n\n // Used to get data value locations. Value can either be an index or a numerical value\n getPixelForValue(value) {\n if (typeof value !== 'number') {\n value = this.parse(value);\n }\n\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n\n // Must override base implementation because it calls getPixelForValue\n // and category scale can have duplicate values\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\n getValueForPixel(pixel) {\n return Math.round(this._startValue + this.getDecimalForPixel(pixel) * this._valueRange);\n }\n\n getBasePixel() {\n return this.bottom;\n }\n}\n","import {isNullOrUndef} from '../helpers/helpers.core.js';\nimport {almostEquals, almostWhole, niceNum, _decimalPlaces, _setMinAndMaxByKey, sign, toRadians} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\n\n/**\n * Generate a set of linear ticks for an axis\n * 1. If generationOptions.min, generationOptions.max, and generationOptions.step are defined:\n * if (max - min) / step is an integer, ticks are generated as [min, min + step, ..., max]\n * Note that the generationOptions.maxCount setting is respected in this scenario\n *\n * 2. If generationOptions.min, generationOptions.max, and generationOptions.count is defined\n * spacing = (max - min) / count\n * Ticks are generated as [min, min + spacing, ..., max]\n *\n * 3. If generationOptions.count is defined\n * spacing = (niceMax - niceMin) / count\n *\n * 4. Compute optimal spacing of ticks using niceNum algorithm\n *\n * @param generationOptions the options used to generate the ticks\n * @param dataRange the range of the data\n * @returns {object[]} array of tick objects\n */\nfunction generateTicks(generationOptions, dataRange) {\n const ticks = [];\n // To get a \"nice\" value for the tick spacing, we will use the appropriately named\n // \"nice number\" algorithm. See https://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks\n // for details.\n\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\n // Beyond MIN_SPACING floating point numbers being to lose precision\n // such that we can't do the math necessary to generate ticks\n if (spacing < MIN_SPACING && !minDefined && !maxDefined) {\n return [{value: rmin}, {value: rmax}];\n }\n\n numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing);\n if (numSpaces > maxSpaces) {\n // If the calculated num of spaces exceeds maxNumSpaces, recalculate it\n spacing = niceNum(numSpaces * spacing / maxSpaces / unit) * unit;\n }\n\n if (!isNullOrUndef(precision)) {\n // If the user specified a precision, round to that number of decimal places\n factor = Math.pow(10, precision);\n spacing = Math.ceil(spacing * factor) / factor;\n }\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\n if (minDefined && maxDefined && step && almostWhole((max - min) / step, spacing / 1000)) {\n // Case 1: If min, max and stepSize are set and they make an evenly spaced scale use it.\n // spacing = step;\n // numSpaces = (max - min) / spacing;\n // Note that we round here to handle the case where almostWhole translated an FP error\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 // Cases 2 & 3, we have a count specified. Handle optional user defined edges to the range.\n // Sometimes these are no-ops, but it makes the code a lot clearer\n // and when a user defined range is specified, we want the correct ticks\n niceMin = minDefined ? min : niceMin;\n niceMax = maxDefined ? max : niceMax;\n numSpaces = count - 1;\n spacing = (niceMax - niceMin) / numSpaces;\n } else {\n // Case 4\n numSpaces = (niceMax - niceMin) / spacing;\n\n // If very close to our rounded value, use it.\n if (almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n numSpaces = Math.round(numSpaces);\n } else {\n numSpaces = Math.ceil(numSpaces);\n }\n }\n\n // The spacing will have changed in cases 1, 2, and 3 so the factor cannot be computed\n // until this point\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\n let j = 0;\n if (minDefined) {\n if (includeBounds && niceMin !== min) {\n ticks.push({value: min});\n\n if (niceMin < min) {\n j++; // Skip niceMin\n }\n // If the next nice tick is close to min, skip it\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\n for (; j < numSpaces; ++j) {\n const tickValue = Math.round((niceMin + j * spacing) * factor) / factor;\n if (maxDefined && tickValue > max) {\n break;\n }\n ticks.push({value: tickValue});\n }\n\n if (maxDefined && includeBounds && niceMax !== max) {\n // If the previous tick is too close to max, replace it with max, else add max\n if (ticks.length && 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\n return ticks;\n}\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}\n\nexport default class LinearScaleBase extends Scale {\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.start = undefined;\n /** @type {number} */\n this.end = undefined;\n /** @type {number} */\n this._startValue = undefined;\n /** @type {number} */\n this._endValue = undefined;\n this._valueRange = 0;\n }\n\n parse(raw, index) { // eslint-disable-line no-unused-vars\n if (isNullOrUndef(raw)) {\n return null;\n }\n if ((typeof raw === 'number' || raw instanceof Number) && !isFinite(+raw)) {\n return null;\n }\n\n return +raw;\n }\n\n handleTickRangeOptions() {\n const {beginAtZero} = this.options;\n const {minDefined, maxDefined} = this.getUserBounds();\n let {min, max} = this;\n\n const setMin = v => (min = minDefined ? min : v);\n const setMax = v => (max = maxDefined ? max : v);\n\n if (beginAtZero) {\n const minSign = sign(min);\n const maxSign = sign(max);\n\n if (minSign < 0 && maxSign < 0) {\n setMax(0);\n } else if (minSign > 0 && maxSign > 0) {\n setMin(0);\n }\n }\n\n if (min === max) {\n let offset = max === 0 ? 1 : Math.abs(max * 0.05);\n\n setMax(max + offset);\n\n if (!beginAtZero) {\n setMin(min - offset);\n }\n }\n this.min = min;\n this.max = max;\n }\n\n getTickLimit() {\n const tickOpts = this.options.ticks;\n // eslint-disable-next-line prefer-const\n let {maxTicksLimit, stepSize} = tickOpts;\n let maxTicks;\n\n if (stepSize) {\n maxTicks = Math.ceil(this.max / stepSize) - Math.floor(this.min / stepSize) + 1;\n if (maxTicks > 1000) {\n console.warn(`scales.${this.id}.ticks.stepSize: ${stepSize} would result generating up to ${maxTicks} ticks. Limiting to 1000.`);\n maxTicks = 1000;\n }\n } else {\n maxTicks = this.computeTickLimit();\n maxTicksLimit = maxTicksLimit || 11;\n }\n\n if (maxTicksLimit) {\n maxTicks = Math.min(maxTicksLimit, maxTicks);\n }\n\n return maxTicks;\n }\n\n /**\n\t * @protected\n\t */\n computeTickLimit() {\n return Number.POSITIVE_INFINITY;\n }\n\n buildTicks() {\n const opts = this.options;\n const tickOpts = opts.ticks;\n\n // Figure out what the max number of ticks we can support it is based on the size of\n // the axis area. For now, we say that the minimum tick spacing in pixels must be 40\n // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\n // the graph. Make sure we always have at least 2 ticks\n let maxTicks = this.getTickLimit();\n maxTicks = Math.max(2, maxTicks);\n\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: this._maxDigits(),\n horizontal: this.isHorizontal(),\n minRotation: tickOpts.minRotation || 0,\n includeBounds: tickOpts.includeBounds !== false\n };\n const dataRange = this._range || this;\n const ticks = generateTicks(numericGeneratorOptions, dataRange);\n\n // At this point, we need to update our max and min given the tick values,\n // since we probably have expanded the range of the scale\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, this, 'value');\n }\n\n if (opts.reverse) {\n ticks.reverse();\n\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n\n return ticks;\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n const ticks = this.ticks;\n let start = this.min;\n let end = this.max;\n\n super.configure();\n\n if (this.options.offset && ticks.length) {\n const offset = (end - start) / Math.max(ticks.length - 1, 1) / 2;\n start -= offset;\n end += offset;\n }\n this._startValue = start;\n this._endValue = end;\n this._valueRange = end - start;\n }\n\n getLabelForValue(value) {\n return formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n}\n","import {isFinite} from '../helpers/helpers.core.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\nimport {toRadians} from '../helpers/index.js';\n\nexport default class LinearScale extends LinearScaleBase {\n\n static id = 'linear';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: Ticks.formatters.numeric\n }\n };\n\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(true);\n\n this.min = isFinite(min) ? min : 0;\n this.max = isFinite(max) ? max : 1;\n\n // Common base implementation to handle min, max, beginAtZero\n this.handleTickRangeOptions();\n }\n\n /**\n\t * Returns the maximum number of ticks based on the scale dimension\n\t * @protected\n \t */\n computeTickLimit() {\n const horizontal = this.isHorizontal();\n const length = horizontal ? this.width : this.height;\n const minRotation = toRadians(this.options.ticks.minRotation);\n const ratio = (horizontal ? Math.sin(minRotation) : Math.cos(minRotation)) || 0.001;\n const tickFont = this._resolveTickFontOptions(0);\n return Math.ceil(length / Math.min(40, tickFont.lineHeight / ratio));\n }\n\n // Utils\n getPixelForValue(value) {\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n\n getValueForPixel(pixel) {\n return this._startValue + this.getDecimalForPixel(pixel) * this._valueRange;\n }\n}\n","import {finiteOrDefault, isFinite} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {_setMinAndMaxByKey, log10} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\n\nconst log10Floor = v => Math.floor(log10(v));\nconst changeExponent = (v, m) => Math.pow(10, log10Floor(v) + m);\n\nfunction isMajor(tickVal) {\n const remain = tickVal / (Math.pow(10, log10Floor(tickVal)));\n return remain === 1;\n}\n\nfunction steps(min, max, rangeExp) {\n const rangeStep = Math.pow(10, rangeExp);\n const start = Math.floor(min / rangeStep);\n const end = Math.ceil(max / rangeStep);\n return end - start;\n}\n\nfunction startExp(min, max) {\n const range = max - min;\n let rangeExp = log10Floor(range);\n while (steps(min, max, rangeExp) > 10) {\n rangeExp++;\n }\n while (steps(min, max, rangeExp) < 10) {\n rangeExp--;\n }\n return Math.min(rangeExp, log10Floor(min));\n}\n\n\n/**\n * Generate a set of logarithmic ticks\n * @param generationOptions the options used to generate the ticks\n * @param dataRange the range of the data\n * @returns {object[]} array of tick objects\n */\nfunction generateTicks(generationOptions, {min, max}) {\n min = finiteOrDefault(generationOptions.min, min);\n const ticks = [];\n const minExp = log10Floor(min);\n let exp = startExp(min, max);\n let precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;\n const stepSize = Math.pow(10, exp);\n const base = minExp > exp ? Math.pow(10, minExp) : 0;\n const start = Math.round((min - base) * precision) / precision;\n const offset = Math.floor((min - base) / stepSize / 10) * stepSize * 10;\n let significand = Math.floor((start - offset) / Math.pow(10, exp));\n let value = finiteOrDefault(generationOptions.min, Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision);\n while (value < max) {\n ticks.push({value, major: isMajor(value), significand});\n if (significand >= 10) {\n significand = significand < 15 ? 15 : 20;\n } else {\n significand++;\n }\n if (significand >= 20) {\n exp++;\n significand = 2;\n precision = exp >= 0 ? 1 : precision;\n }\n value = Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision;\n }\n const lastTick = finiteOrDefault(generationOptions.max, value);\n ticks.push({value: lastTick, major: isMajor(lastTick), significand});\n\n return ticks;\n}\n\nexport default class LogarithmicScale extends Scale {\n\n static id = 'logarithmic';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: Ticks.formatters.logarithmic,\n major: {\n enabled: true\n }\n }\n };\n\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.start = undefined;\n /** @type {number} */\n this.end = undefined;\n /** @type {number} */\n this._startValue = undefined;\n this._valueRange = 0;\n }\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 isFinite(value) && value > 0 ? value : null;\n }\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(true);\n\n this.min = isFinite(min) ? Math.max(0, min) : null;\n this.max = isFinite(max) ? Math.max(0, max) : null;\n\n if (this.options.beginAtZero) {\n this._zero = true;\n }\n\n // if data has `0` in it or `beginAtZero` is true, min (non zero) value is at bottom\n // of scale, and it does not equal suggestedMin, lower the min bound by one exp.\n if (this._zero && this.min !== this._suggestedMin && !isFinite(this._userMin)) {\n this.min = min === changeExponent(this.min, 0) ? changeExponent(this.min, -1) : changeExponent(this.min, 0);\n }\n\n this.handleTickRangeOptions();\n }\n\n handleTickRangeOptions() {\n const {minDefined, maxDefined} = this.getUserBounds();\n let min = this.min;\n let max = this.max;\n\n const setMin = v => (min = minDefined ? min : v);\n const setMax = v => (max = maxDefined ? max : v);\n\n if (min === max) {\n if (min <= 0) { // includes null\n setMin(1);\n setMax(10);\n } else {\n setMin(changeExponent(min, -1));\n setMax(changeExponent(max, +1));\n }\n }\n if (min <= 0) {\n setMin(changeExponent(max, -1));\n }\n if (max <= 0) {\n\n setMax(changeExponent(min, +1));\n }\n\n this.min = min;\n this.max = max;\n }\n\n buildTicks() {\n const opts = this.options;\n\n const generationOptions = {\n min: this._userMin,\n max: this._userMax\n };\n const ticks = generateTicks(generationOptions, this);\n\n // At this point, we need to update our max and min given the tick values,\n // since we probably have expanded the range of the scale\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, this, 'value');\n }\n\n if (opts.reverse) {\n ticks.reverse();\n\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n\n return ticks;\n }\n\n /**\n\t * @param {number} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n return value === undefined\n ? '0'\n : formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n const start = this.min;\n\n super.configure();\n\n this._startValue = log10(start);\n this._valueRange = log10(this.max) - log10(start);\n }\n\n getPixelForValue(value) {\n if (value === undefined || value === 0) {\n value = this.min;\n }\n if (value === null || isNaN(value)) {\n return NaN;\n }\n return this.getPixelForDecimal(value === this.min\n ? 0\n : (log10(value) - this._startValue) / this._valueRange);\n }\n\n getValueForPixel(pixel) {\n const decimal = this.getDecimalForPixel(pixel);\n return Math.pow(10, this._startValue + decimal * this._valueRange);\n }\n}\n","import defaults from '../core/core.defaults.js';\nimport {_longestText, addRoundedRectPath, renderText, _isPointInArea} from '../helpers/helpers.canvas.js';\nimport {HALF_PI, TAU, toDegrees, toRadians, _normalizeAngle, PI} from '../helpers/helpers.math.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\nimport {valueOrDefault, isArray, isFinite, callback as callCallback, isNullOrUndef} from '../helpers/helpers.core.js';\nimport {createContext, toFont, toPadding, toTRBLCorners} from '../helpers/helpers.options.js';\n\nfunction getTickBackdropHeight(opts) {\n const tickOpts = opts.ticks;\n\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}\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}\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\n return {\n start: pos,\n end: pos + size\n };\n}\n\n/**\n * Helper function to fit a radial linear scale with point labels\n */\nfunction fitWithPointLabels(scale) {\n\n // Right, this is really confusing and there is a lot of maths going on here\n // The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9\n //\n // Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif\n //\n // Solution:\n //\n // We assume the radius of the polygon is half the size of the canvas at first\n // at each index we check if the text overlaps.\n //\n // Where it does, we store that angle and that index.\n //\n // After finding the largest index and angle we calculate how much we need to remove\n // from the shape radius to move the point inwards by that x.\n //\n // We average the left and right distances to get the maximum shape radius that can fit in the box\n // along with labels.\n //\n // Once we have that, we can find the centre point for the chart, by taking the x text protrusion\n // on each side, removing that from the size, halving it and adding the left x protrusion width.\n //\n // This will mean we have a shape fitted to the canvas, as large as it can be with the labels\n // and position it in the most space efficient manner\n //\n // https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif\n\n // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width.\n // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points\n const orig = {\n l: scale.left + scale._padding.left,\n r: scale.right - scale._padding.right,\n t: scale.top + scale._padding.top,\n b: scale.bottom - scale._padding.bottom\n };\n const limits = Object.assign({}, orig);\n const labelSizes = [];\n const padding = [];\n const valueCount = scale._pointLabels.length;\n const pointLabelOpts = scale.options.pointLabels;\n const additionalAngle = pointLabelOpts.centerPointLabels ? PI / valueCount : 0;\n\n for (let i = 0; i < valueCount; i++) {\n const opts = pointLabelOpts.setContext(scale.getPointLabelContext(i));\n padding[i] = opts.padding;\n const pointPosition = scale.getPointPosition(i, scale.drawingArea + padding[i], additionalAngle);\n const plFont = toFont(opts.font);\n const textSize = measureLabelSize(scale.ctx, plFont, scale._pointLabels[i]);\n labelSizes[i] = textSize;\n\n const angleRadians = _normalizeAngle(scale.getIndexAngle(i) + additionalAngle);\n const angle = Math.round(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 updateLimits(limits, orig, angleRadians, hLimits, vLimits);\n }\n\n scale.setCenterPoint(\n orig.l - limits.l,\n limits.r - orig.r,\n orig.t - limits.t,\n limits.b - orig.b\n );\n\n // Now that text size is determined, compute the full positions\n scale._pointLabelItems = buildPointLabelItems(scale, labelSizes, padding);\n}\n\nfunction updateLimits(limits, orig, angle, hLimits, vLimits) {\n const sin = Math.abs(Math.sin(angle));\n const cos = Math.abs(Math.cos(angle));\n let x = 0;\n let y = 0;\n if (hLimits.start < orig.l) {\n x = (orig.l - hLimits.start) / sin;\n limits.l = Math.min(limits.l, orig.l - x);\n } else if (hLimits.end > orig.r) {\n x = (hLimits.end - orig.r) / sin;\n limits.r = Math.max(limits.r, orig.r + x);\n }\n if (vLimits.start < orig.t) {\n y = (orig.t - vLimits.start) / cos;\n limits.t = Math.min(limits.t, orig.t - y);\n } else if (vLimits.end > orig.b) {\n y = (vLimits.end - orig.b) / cos;\n limits.b = Math.max(limits.b, orig.b + y);\n }\n}\n\nfunction createPointLabelItem(scale, index, itemOpts) {\n const outerDistance = scale.drawingArea;\n const {extra, additionalAngle, padding, size} = itemOpts;\n const pointLabelPosition = scale.getPointPosition(index, outerDistance + extra + padding, additionalAngle);\n const angle = Math.round(toDegrees(_normalizeAngle(pointLabelPosition.angle + HALF_PI)));\n const y = yForAngle(pointLabelPosition.y, size.h, angle);\n const textAlign = getTextAlignForAngle(angle);\n const left = leftForTextAlign(pointLabelPosition.x, size.w, textAlign);\n return {\n // if to draw or overlapped\n visible: true,\n\n // Text position\n x: pointLabelPosition.x,\n y,\n\n // Text rendering data\n textAlign,\n\n // Bounding box\n left,\n top: y,\n right: left + size.w,\n bottom: y + size.h\n };\n}\n\nfunction isNotOverlapped(item, area) {\n if (!area) {\n return true;\n }\n const {left, top, right, bottom} = item;\n const apexesInArea = _isPointInArea({x: left, y: top}, area) || _isPointInArea({x: left, y: bottom}, area) ||\n _isPointInArea({x: right, y: top}, area) || _isPointInArea({x: right, y: bottom}, area);\n return !apexesInArea;\n}\n\nfunction buildPointLabelItems(scale, labelSizes, padding) {\n const items = [];\n const valueCount = scale._pointLabels.length;\n const opts = scale.options;\n const {centerPointLabels, display} = opts.pointLabels;\n const itemOpts = {\n extra: getTickBackdropHeight(opts) / 2,\n additionalAngle: centerPointLabels ? PI / valueCount : 0\n };\n let area;\n\n for (let i = 0; i < valueCount; i++) {\n itemOpts.padding = padding[i];\n itemOpts.size = labelSizes[i];\n\n const item = createPointLabelItem(scale, i, itemOpts);\n items.push(item);\n if (display === 'auto') {\n item.visible = isNotOverlapped(item, area);\n if (item.visible) {\n area = item;\n }\n }\n }\n return items;\n}\n\nfunction getTextAlignForAngle(angle) {\n if (angle === 0 || angle === 180) {\n return 'center';\n } else if (angle < 180) {\n return 'left';\n }\n\n return 'right';\n}\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}\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}\n\nfunction drawPointLabelBox(ctx, opts, item) {\n const {left, top, right, bottom} = item;\n const {backdropColor} = opts;\n\n if (!isNullOrUndef(backdropColor)) {\n const borderRadius = toTRBLCorners(opts.borderRadius);\n const padding = toPadding(opts.backdropPadding);\n ctx.fillStyle = backdropColor;\n\n const backdropLeft = left - padding.left;\n const backdropTop = top - padding.top;\n const backdropWidth = right - left + padding.width;\n const backdropHeight = bottom - top + padding.height;\n\n if (Object.values(borderRadius).some(v => v !== 0)) {\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: backdropLeft,\n y: backdropTop,\n w: backdropWidth,\n h: backdropHeight,\n radius: borderRadius,\n });\n ctx.fill();\n } else {\n ctx.fillRect(backdropLeft, backdropTop, backdropWidth, backdropHeight);\n }\n }\n}\n\nfunction drawPointLabels(scale, labelCount) {\n const {ctx, options: {pointLabels}} = scale;\n\n for (let i = labelCount - 1; i >= 0; i--) {\n const item = scale._pointLabelItems[i];\n if (!item.visible) {\n // overlapping\n continue;\n }\n const optsAtIndex = pointLabels.setContext(scale.getPointLabelContext(i));\n drawPointLabelBox(ctx, optsAtIndex, item);\n const plFont = toFont(optsAtIndex.font);\n const {x, y, textAlign} = item;\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}\n\nfunction pathRadiusLine(scale, radius, circular, labelCount) {\n const {ctx} = scale;\n if (circular) {\n // Draw circular arcs between the points\n ctx.arc(scale.xCenter, scale.yCenter, radius, 0, TAU);\n } else {\n // Draw straight lines connecting each index\n let pointPosition = scale.getPointPosition(0, radius);\n ctx.moveTo(pointPosition.x, pointPosition.y);\n\n for (let i = 1; i < labelCount; i++) {\n pointPosition = scale.getPointPosition(i, radius);\n ctx.lineTo(pointPosition.x, pointPosition.y);\n }\n }\n}\n\nfunction drawRadiusLine(scale, gridLineOpts, radius, labelCount, borderOpts) {\n const ctx = scale.ctx;\n const circular = gridLineOpts.circular;\n\n const {color, lineWidth} = gridLineOpts;\n\n if ((!circular && !labelCount) || !color || !lineWidth || radius < 0) {\n return;\n }\n\n ctx.save();\n ctx.strokeStyle = color;\n ctx.lineWidth = lineWidth;\n ctx.setLineDash(borderOpts.dash);\n ctx.lineDashOffset = borderOpts.dashOffset;\n\n ctx.beginPath();\n pathRadiusLine(scale, radius, circular, labelCount);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n}\n\nfunction createPointLabelContext(parent, index, label) {\n return createContext(parent, {\n label,\n index,\n type: 'pointLabel'\n });\n}\n\nexport default class RadialLinearScale extends LinearScaleBase {\n\n static id = 'radialLinear';\n\n /**\n * @type {any}\n */\n static defaults = {\n display: true,\n\n // Boolean - Whether to animate scaling the chart from the centre\n animate: true,\n position: 'chartArea',\n\n angleLines: {\n display: true,\n lineWidth: 1,\n borderDash: [],\n borderDashOffset: 0.0\n },\n\n grid: {\n circular: false\n },\n\n startAngle: 0,\n\n // label settings\n ticks: {\n // Boolean - Show a backdrop to the scale label\n showLabelBackdrop: true,\n\n callback: Ticks.formatters.numeric\n },\n\n pointLabels: {\n backdropColor: undefined,\n\n // Number - The backdrop padding above & below the label in pixels\n backdropPadding: 2,\n\n // Boolean - if true, show point labels\n display: true,\n\n // Number - Point label font size in pixels\n font: {\n size: 10\n },\n\n // Function - Used to convert point labels\n callback(label) {\n return label;\n },\n\n // Number - Additionl padding between scale and pointLabel\n padding: 5,\n\n // Boolean - if true, center point labels to slices in polar chart\n centerPointLabels: false\n }\n };\n\n static defaultRoutes = {\n 'angleLines.color': 'borderColor',\n 'pointLabels.color': 'color',\n 'ticks.color': 'color'\n };\n\n static descriptors = {\n angleLines: {\n _fallback: 'grid'\n }\n };\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.xCenter = undefined;\n /** @type {number} */\n this.yCenter = undefined;\n /** @type {number} */\n this.drawingArea = undefined;\n /** @type {string[]} */\n this._pointLabels = [];\n this._pointLabelItems = [];\n }\n\n setDimensions() {\n // Set the unconstrained dimension before label rotation\n const padding = this._padding = toPadding(getTickBackdropHeight(this.options) / 2);\n const w = this.width = this.maxWidth - padding.width;\n const h = this.height = this.maxHeight - padding.height;\n this.xCenter = Math.floor(this.left + w / 2 + padding.left);\n this.yCenter = Math.floor(this.top + h / 2 + padding.top);\n this.drawingArea = Math.floor(Math.min(w, h) / 2);\n }\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(false);\n\n this.min = isFinite(min) && !isNaN(min) ? min : 0;\n this.max = isFinite(max) && !isNaN(max) ? max : 0;\n\n // Common base implementation to handle min, max, beginAtZero\n this.handleTickRangeOptions();\n }\n\n /**\n\t * Returns the maximum number of ticks based on the scale dimension\n\t * @protected\n\t */\n computeTickLimit() {\n return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options));\n }\n\n generateTickLabels(ticks) {\n LinearScaleBase.prototype.generateTickLabels.call(this, ticks);\n\n // Point labels\n this._pointLabels = this.getLabels()\n .map((value, index) => {\n const label = callCallback(this.options.pointLabels.callback, [value, index], this);\n return label || label === 0 ? label : '';\n })\n .filter((v, i) => this.chart.getDataVisibility(i));\n }\n\n fit() {\n const opts = this.options;\n\n if (opts.display && opts.pointLabels.display) {\n fitWithPointLabels(this);\n } else {\n this.setCenterPoint(0, 0, 0, 0);\n }\n }\n\n setCenterPoint(leftMovement, rightMovement, topMovement, bottomMovement) {\n this.xCenter += Math.floor((leftMovement - rightMovement) / 2);\n this.yCenter += Math.floor((topMovement - bottomMovement) / 2);\n this.drawingArea -= Math.min(this.drawingArea / 2, Math.max(leftMovement, rightMovement, topMovement, bottomMovement));\n }\n\n getIndexAngle(index) {\n const angleMultiplier = TAU / (this._pointLabels.length || 1);\n const startAngle = this.options.startAngle || 0;\n\n return _normalizeAngle(index * angleMultiplier + toRadians(startAngle));\n }\n\n getDistanceFromCenterForValue(value) {\n if (isNullOrUndef(value)) {\n return NaN;\n }\n\n // Take into account half font size + the yPadding of the top value\n const scalingFactor = this.drawingArea / (this.max - this.min);\n if (this.options.reverse) {\n return (this.max - value) * scalingFactor;\n }\n return (value - this.min) * scalingFactor;\n }\n\n getValueForDistanceFromCenter(distance) {\n if (isNullOrUndef(distance)) {\n return NaN;\n }\n\n const scaledDistance = distance / (this.drawingArea / (this.max - this.min));\n return this.options.reverse ? this.max - scaledDistance : this.min + scaledDistance;\n }\n\n getPointLabelContext(index) {\n const pointLabels = this._pointLabels || [];\n\n if (index >= 0 && index < pointLabels.length) {\n const pointLabel = pointLabels[index];\n return createPointLabelContext(this.getContext(), index, pointLabel);\n }\n }\n\n getPointPosition(index, distanceFromCenter, additionalAngle = 0) {\n const angle = this.getIndexAngle(index) - HALF_PI + additionalAngle;\n return {\n x: Math.cos(angle) * distanceFromCenter + this.xCenter,\n y: Math.sin(angle) * distanceFromCenter + this.yCenter,\n angle\n };\n }\n\n getPointPositionForValue(index, value) {\n return this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n }\n\n getBasePosition(index) {\n return this.getPointPositionForValue(index || 0, this.getBaseValue());\n }\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\n /**\n\t * @protected\n\t */\n drawBackground() {\n const {backgroundColor, grid: {circular}} = this.options;\n if (backgroundColor) {\n const ctx = this.ctx;\n ctx.save();\n ctx.beginPath();\n pathRadiusLine(this, this.getDistanceFromCenterForValue(this._endValue), circular, this._pointLabels.length);\n ctx.closePath();\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n ctx.restore();\n }\n }\n\n /**\n\t * @protected\n\t */\n drawGrid() {\n const ctx = this.ctx;\n const opts = this.options;\n const {angleLines, grid, border} = opts;\n const labelCount = this._pointLabels.length;\n\n let i, offset, position;\n\n if (opts.pointLabels.display) {\n drawPointLabels(this, labelCount);\n }\n\n if (grid.display) {\n this.ticks.forEach((tick, index) => {\n if (index !== 0) {\n offset = this.getDistanceFromCenterForValue(tick.value);\n const context = this.getContext(index);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n\n drawRadiusLine(this, optsAtIndex, offset, labelCount, optsAtIndexBorder);\n }\n });\n }\n\n if (angleLines.display) {\n ctx.save();\n\n for (i = labelCount - 1; i >= 0; i--) {\n const optsAtIndex = angleLines.setContext(this.getPointLabelContext(i));\n const {color, lineWidth} = optsAtIndex;\n\n if (!lineWidth || !color) {\n continue;\n }\n\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = color;\n\n ctx.setLineDash(optsAtIndex.borderDash);\n ctx.lineDashOffset = optsAtIndex.borderDashOffset;\n\n offset = this.getDistanceFromCenterForValue(opts.ticks.reverse ? this.min : this.max);\n position = this.getPointPosition(i, offset);\n ctx.beginPath();\n ctx.moveTo(this.xCenter, this.yCenter);\n ctx.lineTo(position.x, position.y);\n ctx.stroke();\n }\n\n ctx.restore();\n }\n }\n\n /**\n\t * @protected\n\t */\n drawBorder() {}\n\n /**\n\t * @protected\n\t */\n drawLabels() {\n const ctx = this.ctx;\n const opts = this.options;\n const tickOpts = opts.ticks;\n\n if (!tickOpts.display) {\n return;\n }\n\n const startAngle = this.getIndexAngle(0);\n let offset, width;\n\n ctx.save();\n ctx.translate(this.xCenter, this.yCenter);\n ctx.rotate(startAngle);\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n\n this.ticks.forEach((tick, index) => {\n if (index === 0 && !opts.reverse) {\n return;\n }\n\n const optsAtIndex = tickOpts.setContext(this.getContext(index));\n const tickFont = toFont(optsAtIndex.font);\n offset = this.getDistanceFromCenterForValue(this.ticks[index].value);\n\n if (optsAtIndex.showLabelBackdrop) {\n ctx.font = tickFont.string;\n width = ctx.measureText(tick.label).width;\n ctx.fillStyle = optsAtIndex.backdropColor;\n\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\n renderText(ctx, tick.label, 0, -offset, tickFont, {\n color: optsAtIndex.color,\n strokeColor: optsAtIndex.textStrokeColor,\n strokeWidth: optsAtIndex.textStrokeWidth,\n });\n });\n\n ctx.restore();\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {}\n}\n","import adapters from '../core/core.adapters.js';\nimport {callback as call, isFinite, isNullOrUndef, mergeIf, valueOrDefault} from '../helpers/helpers.core.js';\nimport {toRadians, isNumber, _limitValue} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport {_arrayUnique, _filterBetween, _lookup} from '../helpers/helpers.collection.js';\n\n/**\n * @typedef { import('../core/core.adapters.js').TimeUnit } Unit\n * @typedef {{common: boolean, size: number, steps?: number}} Interval\n * @typedef { import('../core/core.adapters.js').DateAdapter } DateAdapter\n */\n\n/**\n * @type {Object}\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};\n\n/**\n * @type {Unit[]}\n */\nconst UNITS = /** @type Unit[] */ /* #__PURE__ */ (Object.keys(INTERVALS));\n\n/**\n * @param {number} a\n * @param {number} b\n */\nfunction sorter(a, b) {\n return a - b;\n}\n\n/**\n * @param {TimeScale} scale\n * @param {*} input\n * @return {number}\n */\nfunction parse(scale, input) {\n if (isNullOrUndef(input)) {\n return null;\n }\n\n const adapter = scale._adapter;\n const {parser, round, isoWeekday} = scale._parseOpts;\n let value = input;\n\n if (typeof parser === 'function') {\n value = parser(value);\n }\n\n // Only parse if it's not a timestamp already\n if (!isFinite(value)) {\n value = typeof parser === 'string'\n ? adapter.parse(value, /** @type {Unit} */ (parser))\n : adapter.parse(value);\n }\n\n if (value === null) {\n return null;\n }\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\n return +value;\n}\n\n/**\n * Figures out what unit results in an appropriate number of auto-generated ticks\n * @param {Unit} minUnit\n * @param {number} min\n * @param {number} max\n * @param {number} capacity\n * @return {object}\n */\nfunction determineUnitForAutoTicks(minUnit, min, max, capacity) {\n const ilen = UNITS.length;\n\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\n if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\n return UNITS[i];\n }\n }\n\n return UNITS[ilen - 1];\n}\n\n/**\n * Figures out what unit to format a set of ticks with\n * @param {TimeScale} scale\n * @param {number} numTicks\n * @param {Unit} minUnit\n * @param {number} min\n * @param {number} max\n * @return {Unit}\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\n return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];\n}\n\n/**\n * @param {Unit} unit\n * @return {object}\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}\n\n/**\n * @param {object} ticks\n * @param {number} time\n * @param {number[]} [timestamps] - if defined, snap to these timestamps\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}\n\n/**\n * @param {TimeScale} scale\n * @param {object[]} ticks\n * @param {object} map\n * @param {Unit} majorUnit\n * @return {object[]}\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\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}\n\n/**\n * @param {TimeScale} scale\n * @param {number[]} values\n * @param {Unit|undefined} [majorUnit]\n * @return {object[]}\n */\nfunction ticksFromTimestamps(scale, values, majorUnit) {\n const ticks = [];\n /** @type {Object} */\n const map = {};\n const ilen = values.length;\n let i, value;\n\n for (i = 0; i < ilen; ++i) {\n value = values[i];\n map[value] = i;\n\n ticks.push({\n value,\n major: false\n });\n }\n\n // We set the major ticks separately from the above loop because calling startOf for every tick\n // is expensive when there is a large number of ticks\n return (ilen === 0 || !majorUnit) ? ticks : setMajorTicks(scale, ticks, map, majorUnit);\n}\n\nexport default class TimeScale extends Scale {\n\n static id = 'time';\n\n /**\n * @type {any}\n */\n static defaults = {\n /**\n * Scale boundary strategy (bypassed by min/max time options)\n * - `data`: make sure data are fully visible, ticks outside are removed\n * - `ticks`: make sure ticks are fully visible, data outside are truncated\n * @see https://github.com/chartjs/Chart.js/pull/4556\n * @since 2.7.0\n */\n bounds: 'data',\n\n adapters: {},\n time: {\n parser: false, // false == a pattern string from or a custom callback that converts its argument to a timestamp\n unit: false, // false == automatic or override with week, month, year, etc.\n round: false, // none, or override with week, month, year, etc.\n isoWeekday: false, // override week start day\n minUnit: 'millisecond',\n displayFormats: {}\n },\n ticks: {\n /**\n * Ticks generation input values:\n * - 'auto': generates \"optimal\" ticks based on scale size and time options.\n * - 'data': generates ticks from data (including labels from data {t|x|y} objects).\n * - 'labels': generates ticks from user given `data.labels` values ONLY.\n * @see https://github.com/chartjs/Chart.js/pull/4507\n * @since 2.7.0\n */\n source: 'auto',\n\n callback: false,\n\n major: {\n enabled: false\n }\n }\n };\n\n /**\n\t * @param {object} props\n\t */\n constructor(props) {\n super(props);\n\n /** @type {{data: number[], labels: number[], all: number[]}} */\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n\n /** @type {Unit} */\n this._unit = 'day';\n /** @type {Unit=} */\n this._majorUnit = undefined;\n this._offsets = {};\n this._normalized = false;\n this._parseOpts = undefined;\n }\n\n init(scaleOpts, opts = {}) {\n const time = scaleOpts.time || (scaleOpts.time = {});\n /** @type {DateAdapter} */\n const adapter = this._adapter = new adapters._date(scaleOpts.adapters.date);\n\n adapter.init(opts);\n\n // Backward compatibility: before introducing adapter, `displayFormats` was\n // supposed to contain *all* unit/string pairs but this can't be resolved\n // when loading the scale (adapters are loaded afterward), so let's populate\n // missing formats on update\n mergeIf(time.displayFormats, adapter.formats());\n\n this._parseOpts = {\n parser: time.parser,\n round: time.round,\n isoWeekday: time.isoWeekday\n };\n\n super.init(scaleOpts);\n\n this._normalized = opts.normalized;\n }\n\n /**\n\t * @param {*} raw\n\t * @param {number?} [index]\n\t * @return {number}\n\t */\n parse(raw, index) { // eslint-disable-line no-unused-vars\n if (raw === undefined) {\n return null;\n }\n return parse(this, raw);\n }\n\n beforeLayout() {\n super.beforeLayout();\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n }\n\n determineDataLimits() {\n const options = this.options;\n const adapter = this._adapter;\n const unit = options.time.unit || 'day';\n // eslint-disable-next-line prefer-const\n let {min, max, minDefined, maxDefined} = this.getUserBounds();\n\n /**\n\t\t * @param {object} bounds\n\t\t */\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\n // If we have user provided `min` and `max` labels / data bounds can be ignored\n if (!minDefined || !maxDefined) {\n // Labels are always considered, when user did not force bounds\n _applyBounds(this._getLabelBounds());\n\n // If `bounds` is `'ticks'` and `ticks.source` is `'labels'`,\n // data bounds are ignored (and don't need to be determined)\n if (options.bounds !== 'ticks' || options.ticks.source !== 'labels') {\n _applyBounds(this.getMinMax(false));\n }\n }\n\n min = isFinite(min) && !isNaN(min) ? min : +adapter.startOf(Date.now(), unit);\n max = isFinite(max) && !isNaN(max) ? max : +adapter.endOf(Date.now(), unit) + 1;\n\n // Make sure that max is strictly higher than min (required by the timeseries lookup table)\n this.min = Math.min(min, max - 1);\n this.max = Math.max(min + 1, max);\n }\n\n /**\n\t * @private\n\t */\n _getLabelBounds() {\n const arr = this.getLabelTimestamps();\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n\n if (arr.length) {\n min = arr[0];\n max = arr[arr.length - 1];\n }\n return {min, max};\n }\n\n /**\n\t * @return {object[]}\n\t */\n buildTicks() {\n const options = this.options;\n const timeOpts = options.time;\n const tickOpts = options.ticks;\n const timestamps = tickOpts.source === 'labels' ? this.getLabelTimestamps() : this._generate();\n\n if (options.bounds === 'ticks' && timestamps.length) {\n this.min = this._userMin || timestamps[0];\n this.max = this._userMax || timestamps[timestamps.length - 1];\n }\n\n const min = this.min;\n const max = this.max;\n\n const ticks = _filterBetween(timestamps, min, max);\n\n // PRIVATE\n // determineUnitForFormatting relies on the number of ticks so we don't use it when\n // autoSkip is enabled because we don't yet know what the final number of ticks will be\n this._unit = timeOpts.unit || (tickOpts.autoSkip\n ? determineUnitForAutoTicks(timeOpts.minUnit, this.min, this.max, this._getLabelCapacity(min))\n : determineUnitForFormatting(this, ticks.length, timeOpts.minUnit, this.min, this.max));\n this._majorUnit = !tickOpts.major.enabled || this._unit === 'year' ? undefined\n : determineMajorUnit(this._unit);\n this.initOffsets(timestamps);\n\n if (options.reverse) {\n ticks.reverse();\n }\n\n return ticksFromTimestamps(this, ticks, this._majorUnit);\n }\n\n afterAutoSkip() {\n // Offsets for bar charts need to be handled with the auto skipped\n // ticks. Once ticks have been skipped, we re-compute the offsets.\n if (this.options.offsetAfterAutoskip) {\n this.initOffsets(this.ticks.map(tick => +tick.value));\n }\n }\n\n /**\n\t * Returns the start and end offsets from edges in the form of {start, end}\n\t * where each value is a relative width to the scale and ranges between 0 and 1.\n\t * They add extra margins on the both sides by scaling down the original scale.\n\t * Offsets are added when the `offset` option is true.\n\t * @param {number[]} timestamps\n\t * @protected\n\t */\n initOffsets(timestamps = []) {\n let start = 0;\n let end = 0;\n let first, last;\n\n if (this.options.offset && timestamps.length) {\n first = this.getDecimalForValue(timestamps[0]);\n if (timestamps.length === 1) {\n start = 1 - first;\n } else {\n start = (this.getDecimalForValue(timestamps[1]) - first) / 2;\n }\n last = this.getDecimalForValue(timestamps[timestamps.length - 1]);\n if (timestamps.length === 1) {\n end = last;\n } else {\n end = (last - this.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\n this._offsets = {start, end, factor: 1 / (start + 1 + end)};\n }\n\n /**\n\t * Generates a maximum of `capacity` timestamps between min and max, rounded to the\n\t * `minor` unit using the given scale time `options`.\n\t * Important: this method can return ticks outside the min and max range, it's the\n\t * responsibility of the calling code to clamp values if needed.\n\t * @protected\n\t */\n _generate() {\n const adapter = this._adapter;\n const min = this.min;\n const max = this.max;\n const options = this.options;\n const timeOpts = options.time;\n // @ts-ignore\n const minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, this._getLabelCapacity(min));\n const stepSize = valueOrDefault(options.ticks.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\n // For 'week' unit, handle the first day of week option\n if (hasWeekday) {\n first = +adapter.startOf(first, 'isoWeek', weekday);\n }\n\n // Align first ticks on unit\n first = +adapter.startOf(first, hasWeekday ? 'day' : minor);\n\n // Prevent browser from freezing in case user options request millions of milliseconds\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\n const timestamps = options.ticks.source === 'data' && this.getDataTimestamps();\n for (time = first, count = 0; time < max; time = +adapter.add(time, stepSize, minor), count++) {\n addTick(ticks, time, timestamps);\n }\n\n if (time === max || options.bounds === 'ticks' || count === 1) {\n addTick(ticks, time, timestamps);\n }\n\n // @ts-ignore\n return Object.keys(ticks).sort(sorter).map(x => +x);\n }\n\n /**\n\t * @param {number} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n const adapter = this._adapter;\n const timeOpts = this.options.time;\n\n if (timeOpts.tooltipFormat) {\n return adapter.format(value, timeOpts.tooltipFormat);\n }\n return adapter.format(value, timeOpts.displayFormats.datetime);\n }\n\n /**\n\t * @param {number} value\n\t * @param {string|undefined} format\n\t * @return {string}\n\t */\n format(value, format) {\n const options = this.options;\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const fmt = format || formats[unit];\n return this._adapter.format(value, fmt);\n }\n\n /**\n\t * Function to format an individual tick mark\n\t * @param {number} time\n\t * @param {number} index\n\t * @param {object[]} ticks\n\t * @param {string|undefined} [format]\n\t * @return {string}\n\t * @private\n\t */\n _tickFormatFunction(time, index, ticks, format) {\n const options = this.options;\n const formatter = options.ticks.callback;\n\n if (formatter) {\n return call(formatter, [time, index, ticks], this);\n }\n\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const majorUnit = this._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\n return this._adapter.format(time, format || (major ? majorFormat : minorFormat));\n }\n\n /**\n\t * @param {object[]} ticks\n\t */\n generateTickLabels(ticks) {\n let i, ilen, tick;\n\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\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getDecimalForValue(value) {\n return value === null ? NaN : (value - this.min) / (this.max - this.min);\n }\n\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getPixelForValue(value) {\n const offsets = this._offsets;\n const pos = this.getDecimalForValue(value);\n return this.getPixelForDecimal((offsets.start + pos) * offsets.factor);\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const pos = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return this.min + pos * (this.max - this.min);\n }\n\n /**\n\t * @param {string} label\n\t * @return {{w:number, h:number}}\n\t * @private\n\t */\n _getLabelSize(label) {\n const ticksOpts = this.options.ticks;\n const tickLabelWidth = this.ctx.measureText(label).width;\n const angle = toRadians(this.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation);\n const cosRotation = Math.cos(angle);\n const sinRotation = Math.sin(angle);\n const tickFontSize = this._resolveTickFontOptions(0).size;\n\n return {\n w: (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation),\n h: (tickLabelWidth * sinRotation) + (tickFontSize * cosRotation)\n };\n }\n\n /**\n\t * @param {number} exampleTime\n\t * @return {number}\n\t * @private\n\t */\n _getLabelCapacity(exampleTime) {\n const timeOpts = this.options.time;\n const displayFormats = timeOpts.displayFormats;\n\n // pick the longest format (milliseconds) for guesstimation\n const format = displayFormats[timeOpts.unit] || displayFormats.millisecond;\n const exampleLabel = this._tickFormatFunction(exampleTime, 0, ticksFromTimestamps(this, [exampleTime], this._majorUnit), format);\n const size = this._getLabelSize(exampleLabel);\n // subtract 1 - if offset then there's one less label than tick\n // if not offset then one half label padding is added to each end leaving room for one less label\n const capacity = Math.floor(this.isHorizontal() ? this.width / size.w : this.height / size.h) - 1;\n return capacity > 0 ? capacity : 1;\n }\n\n /**\n\t * @protected\n\t */\n getDataTimestamps() {\n let timestamps = this._cache.data || [];\n let i, ilen;\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const metas = this.getMatchingVisibleMetas();\n\n if (this._normalized && metas.length) {\n return (this._cache.data = metas[0].controller.getAllParsedValues(this));\n }\n\n for (i = 0, ilen = metas.length; i < ilen; ++i) {\n timestamps = timestamps.concat(metas[i].controller.getAllParsedValues(this));\n }\n\n return (this._cache.data = this.normalize(timestamps));\n }\n\n /**\n\t * @protected\n\t */\n getLabelTimestamps() {\n const timestamps = this._cache.labels || [];\n let i, ilen;\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const labels = this.getLabels();\n for (i = 0, ilen = labels.length; i < ilen; ++i) {\n timestamps.push(parse(this, labels[i]));\n }\n\n return (this._cache.labels = this._normalized ? timestamps : this.normalize(timestamps));\n }\n\n /**\n\t * @param {number[]} values\n\t * @protected\n\t */\n normalize(values) {\n // It seems to be somewhat faster to do sorting first\n return _arrayUnique(values.sort(sorter));\n }\n}\n","import TimeScale from './scale.time.js';\nimport {_lookupByKey} from '../helpers/helpers.collection.js';\n\n/**\n * Linearly interpolates the given source `val` using the table. If value is out of bounds, values\n * at edges are used for the interpolation.\n * @param {object} table\n * @param {number} val\n * @param {boolean} [reverse] lookup time based on position instead of vice versa\n * @return {object}\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\n const span = nextSource - prevSource;\n return span ? prevTarget + (nextTarget - prevTarget) * (val - prevSource) / span : prevTarget;\n}\n\nclass TimeSeriesScale extends TimeScale {\n\n static id = 'timeseries';\n\n /**\n * @type {any}\n */\n static defaults = TimeScale.defaults;\n\n /**\n\t * @param {object} props\n\t */\n constructor(props) {\n super(props);\n\n /** @type {object[]} */\n this._table = [];\n /** @type {number} */\n this._minPos = undefined;\n /** @type {number} */\n this._tableRange = undefined;\n }\n\n /**\n\t * @protected\n\t */\n initOffsets() {\n const timestamps = this._getTimestampsForTable();\n const table = this._table = this.buildLookupTable(timestamps);\n this._minPos = interpolate(table, this.min);\n this._tableRange = interpolate(table, this.max) - this._minPos;\n super.initOffsets(timestamps);\n }\n\n /**\n\t * Returns an array of {time, pos} objects used to interpolate a specific `time` or position\n\t * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is\n\t * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other\n\t * extremity (left + width or top + height). Note that it would be more optimized to directly\n\t * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need\n\t * to create the lookup table. The table ALWAYS contains at least two items: min and max.\n\t * @param {number[]} timestamps\n\t * @return {object[]}\n\t * @protected\n\t */\n buildLookupTable(timestamps) {\n const {min, max} = this;\n const items = [];\n const table = [];\n let i, ilen, prev, curr, next;\n\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\n if (items.length < 2) {\n // In case there is less that 2 timestamps between min and max, the scale is defined by min and max\n return [\n {time: min, pos: 0},\n {time: max, pos: 1}\n ];\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\n // only add points that breaks the scale linearity\n if (Math.round((next + prev) / 2) !== curr) {\n table.push({time: curr, pos: i / (ilen - 1)});\n }\n }\n return table;\n }\n\n /**\n * Generates all timestamps defined in the data.\n * Important: this method can return ticks outside the min and max range, it's the\n * responsibility of the calling code to clamp values if needed.\n * @protected\n */\n _generate() {\n const min = this.min;\n const max = this.max;\n let timestamps = super.getDataTimestamps();\n if (!timestamps.includes(min) || !timestamps.length) {\n timestamps.splice(0, 0, min);\n }\n if (!timestamps.includes(max) || timestamps.length === 1) {\n timestamps.push(max);\n }\n return timestamps.sort((a, b) => a - b);\n }\n\n /**\n\t * Returns all timestamps\n\t * @return {number[]}\n\t * @private\n\t */\n _getTimestampsForTable() {\n let timestamps = this._cache.all || [];\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const data = this.getDataTimestamps();\n const label = this.getLabelTimestamps();\n if (data.length && label.length) {\n // If combining labels and data (data might not contain all labels),\n // we need to recheck uniqueness and sort\n timestamps = this.normalize(data.concat(label));\n } else {\n timestamps = data.length ? data : label;\n }\n timestamps = this._cache.all = timestamps;\n\n return timestamps;\n }\n\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getDecimalForValue(value) {\n return (interpolate(this._table, value) - this._minPos) / this._tableRange;\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const decimal = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return interpolate(this._table, decimal * this._tableRange + this._minPos, true);\n }\n}\n\nexport default TimeSeriesScale;\n","/*!\n * @kurkle/color v0.3.2\n * https://github.com/kurkle/color#readme\n * (c) 2023 Jukka Kurkela\n * Released under the MIT License\n */\nfunction round(v) {\n return v + 0.5 | 0;\n}\nconst lim = (v, l, h) => Math.max(Math.min(v, h), l);\nfunction p2b(v) {\n return lim(round(v * 2.55), 0, 255);\n}\nfunction b2p(v) {\n return lim(round(v / 2.55), 0, 100);\n}\nfunction n2b(v) {\n return lim(round(v * 255), 0, 255);\n}\nfunction b2n(v) {\n return lim(round(v / 2.55) / 100, 0, 1);\n}\nfunction n2p(v) {\n return lim(round(v * 100), 0, 100);\n}\n\nconst map$1 = {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);\nconst isShort = v => eq(v.r) && eq(v.g) && eq(v.b) && eq(v.a);\nfunction hexParse(str) {\n var len = str.length;\n var ret;\n if (str[0] === '#') {\n if (len === 4 || len === 5) {\n ret = {\n r: 255 & map$1[str[1]] * 17,\n g: 255 & map$1[str[2]] * 17,\n b: 255 & map$1[str[3]] * 17,\n a: len === 5 ? map$1[str[4]] * 17 : 255\n };\n } else if (len === 7 || len === 9) {\n ret = {\n r: map$1[str[1]] << 4 | map$1[str[2]],\n g: map$1[str[3]] << 4 | map$1[str[4]],\n b: map$1[str[5]] << 4 | map$1[str[6]],\n a: len === 9 ? (map$1[str[7]] << 4 | map$1[str[8]]) : 255\n };\n }\n }\n return ret;\n}\nconst alpha = (a, f) => a < 255 ? f(a) : '';\nfunction hexString(v) {\n var f = isShort(v) ? h1 : h2;\n return v\n ? '#' + f(v.r) + f(v.g) + f(v.b) + alpha(v.a, f)\n : undefined;\n}\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 const a = s * Math.min(l, 1 - l);\n const f = (n, k = (n + h / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return [f(0), f(8), f(4)];\n}\nfunction hsv2rgbn(h, s, v) {\n const f = (n, k = (n + h / 60) % 6) => v - v * s * Math.max(Math.min(k, 4 - k, 1), 0);\n return [f(5), f(3), f(1)];\n}\nfunction hwb2rgbn(h, w, b) {\n const rgb = hsl2rgbn(h, 1, 0.5);\n let i;\n if (w + b > 1) {\n i = 1 / (w + b);\n w *= i;\n b *= i;\n }\n for (i = 0; i < 3; i++) {\n rgb[i] *= 1 - w - b;\n rgb[i] += w;\n }\n return rgb;\n}\nfunction hueValue(r, g, b, d, max) {\n if (r === max) {\n return ((g - b) / d) + (g < b ? 6 : 0);\n }\n if (g === max) {\n return (b - r) / d + 2;\n }\n return (r - g) / d + 4;\n}\nfunction rgb2hsl(v) {\n const range = 255;\n const r = v.r / range;\n const g = v.g / range;\n const b = v.b / range;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n let h, s, d;\n if (max !== min) {\n d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n h = hueValue(r, g, b, d, max);\n h = h * 60 + 0.5;\n }\n return [h | 0, s || 0, l];\n}\nfunction calln(f, a, b, c) {\n return (\n Array.isArray(a)\n ? f(a[0], a[1], a[2])\n : f(a, b, c)\n ).map(n2b);\n}\nfunction hsl2rgb(h, s, l) {\n return calln(hsl2rgbn, h, s, l);\n}\nfunction hwb2rgb(h, w, b) {\n return calln(hwb2rgbn, h, w, b);\n}\nfunction hsv2rgb(h, s, v) {\n return calln(hsv2rgbn, h, s, v);\n}\nfunction hue(h) {\n return (h % 360 + 360) % 360;\n}\nfunction hueParse(str) {\n const m = HUE_RE.exec(str);\n let a = 255;\n let v;\n if (!m) {\n return;\n }\n if (m[5] !== v) {\n a = m[6] ? p2b(+m[5]) : n2b(+m[5]);\n }\n const h = hue(+m[2]);\n const p1 = +m[3] / 100;\n const p2 = +m[4] / 100;\n if (m[1] === 'hwb') {\n v = hwb2rgb(h, p1, p2);\n } else if (m[1] === 'hsv') {\n v = hsv2rgb(h, p1, p2);\n } else {\n v = hsl2rgb(h, p1, p2);\n }\n return {\n r: v[0],\n g: v[1],\n b: v[2],\n a: a\n };\n}\nfunction rotate(v, deg) {\n var h = rgb2hsl(v);\n h[0] = hue(h[0] + deg);\n h = hsl2rgb(h);\n v.r = h[0];\n v.g = h[1];\n v.b = h[2];\n}\nfunction hslString(v) {\n if (!v) {\n return;\n }\n const a = rgb2hsl(v);\n const h = a[0];\n const s = n2p(a[1]);\n const l = n2p(a[2]);\n return v.a < 255\n ? `hsla(${h}, ${s}%, ${l}%, ${b2n(v.a)})`\n : `hsl(${h}, ${s}%, ${l}%)`;\n}\n\nconst map = {\n x: 'dark',\n Z: 'light',\n Y: 're',\n X: 'blu',\n W: 'gr',\n V: 'medium',\n U: 'slate',\n A: 'ee',\n T: 'ol',\n S: 'or',\n B: 'ra',\n C: 'lateg',\n D: 'ights',\n R: 'in',\n Q: 'turquois',\n E: 'hi',\n P: 'ro',\n O: 'al',\n N: 'le',\n M: 'de',\n L: 'yello',\n F: 'en',\n K: 'ch',\n G: 'arks',\n H: 'ea',\n I: 'ightg',\n J: 'wh'\n};\nconst names$1 = {\n OiceXe: 'f0f8ff',\n antiquewEte: 'faebd7',\n aqua: 'ffff',\n aquamarRe: '7fffd4',\n azuY: 'f0ffff',\n beige: 'f5f5dc',\n bisque: 'ffe4c4',\n black: '0',\n blanKedOmond: 'ffebcd',\n Xe: 'ff',\n XeviTet: '8a2be2',\n bPwn: 'a52a2a',\n burlywood: 'deb887',\n caMtXe: '5f9ea0',\n KartYuse: '7fff00',\n KocTate: 'd2691e',\n cSO: 'ff7f50',\n cSnflowerXe: '6495ed',\n cSnsilk: 'fff8dc',\n crimson: 'dc143c',\n cyan: 'ffff',\n xXe: '8b',\n xcyan: '8b8b',\n xgTMnPd: 'b8860b',\n xWay: 'a9a9a9',\n xgYF: '6400',\n xgYy: 'a9a9a9',\n xkhaki: 'bdb76b',\n xmagFta: '8b008b',\n xTivegYF: '556b2f',\n xSange: 'ff8c00',\n xScEd: '9932cc',\n xYd: '8b0000',\n xsOmon: 'e9967a',\n xsHgYF: '8fbc8f',\n xUXe: '483d8b',\n xUWay: '2f4f4f',\n xUgYy: '2f4f4f',\n xQe: 'ced1',\n xviTet: '9400d3',\n dAppRk: 'ff1493',\n dApskyXe: 'bfff',\n dimWay: '696969',\n dimgYy: '696969',\n dodgerXe: '1e90ff',\n fiYbrick: 'b22222',\n flSOwEte: 'fffaf0',\n foYstWAn: '228b22',\n fuKsia: 'ff00ff',\n gaRsbSo: 'dcdcdc',\n ghostwEte: 'f8f8ff',\n gTd: 'ffd700',\n gTMnPd: 'daa520',\n Way: '808080',\n gYF: '8000',\n gYFLw: 'adff2f',\n gYy: '808080',\n honeyMw: 'f0fff0',\n hotpRk: 'ff69b4',\n RdianYd: 'cd5c5c',\n Rdigo: '4b0082',\n ivSy: 'fffff0',\n khaki: 'f0e68c',\n lavFMr: 'e6e6fa',\n lavFMrXsh: 'fff0f5',\n lawngYF: '7cfc00',\n NmoncEffon: 'fffacd',\n ZXe: 'add8e6',\n ZcSO: 'f08080',\n Zcyan: 'e0ffff',\n ZgTMnPdLw: 'fafad2',\n ZWay: 'd3d3d3',\n ZgYF: '90ee90',\n ZgYy: 'd3d3d3',\n ZpRk: 'ffb6c1',\n ZsOmon: 'ffa07a',\n ZsHgYF: '20b2aa',\n ZskyXe: '87cefa',\n ZUWay: '778899',\n ZUgYy: '778899',\n ZstAlXe: 'b0c4de',\n ZLw: 'ffffe0',\n lime: 'ff00',\n limegYF: '32cd32',\n lRF: 'faf0e6',\n magFta: 'ff00ff',\n maPon: '800000',\n VaquamarRe: '66cdaa',\n VXe: 'cd',\n VScEd: 'ba55d3',\n VpurpN: '9370db',\n VsHgYF: '3cb371',\n VUXe: '7b68ee',\n VsprRggYF: 'fa9a',\n VQe: '48d1cc',\n VviTetYd: 'c71585',\n midnightXe: '191970',\n mRtcYam: 'f5fffa',\n mistyPse: 'ffe4e1',\n moccasR: 'ffe4b5',\n navajowEte: 'ffdead',\n navy: '80',\n Tdlace: 'fdf5e6',\n Tive: '808000',\n TivedBb: '6b8e23',\n Sange: 'ffa500',\n SangeYd: 'ff4500',\n ScEd: 'da70d6',\n pOegTMnPd: 'eee8aa',\n pOegYF: '98fb98',\n pOeQe: 'afeeee',\n pOeviTetYd: 'db7093',\n papayawEp: 'ffefd5',\n pHKpuff: 'ffdab9',\n peru: 'cd853f',\n pRk: 'ffc0cb',\n plum: 'dda0dd',\n powMrXe: 'b0e0e6',\n purpN: '800080',\n YbeccapurpN: '663399',\n Yd: 'ff0000',\n Psybrown: 'bc8f8f',\n PyOXe: '4169e1',\n saddNbPwn: '8b4513',\n sOmon: 'fa8072',\n sandybPwn: 'f4a460',\n sHgYF: '2e8b57',\n sHshell: 'fff5ee',\n siFna: 'a0522d',\n silver: 'c0c0c0',\n skyXe: '87ceeb',\n UXe: '6a5acd',\n UWay: '708090',\n UgYy: '708090',\n snow: 'fffafa',\n sprRggYF: 'ff7f',\n stAlXe: '4682b4',\n tan: 'd2b48c',\n teO: '8080',\n tEstN: 'd8bfd8',\n tomato: 'ff6347',\n Qe: '40e0d0',\n viTet: 'ee82ee',\n JHt: 'f5deb3',\n wEte: 'ffffff',\n wEtesmoke: 'f5f5f5',\n Lw: 'ffff00',\n LwgYF: '9acd32'\n};\nfunction unpack() {\n const unpacked = {};\n const keys = Object.keys(names$1);\n const tkeys = Object.keys(map);\n let i, j, k, ok, nk;\n for (i = 0; i < keys.length; i++) {\n ok = nk = keys[i];\n for (j = 0; j < tkeys.length; j++) {\n k = tkeys[j];\n nk = nk.replace(k, map[k]);\n }\n k = parseInt(names$1[ok], 16);\n unpacked[nk] = [k >> 16 & 0xFF, k >> 8 & 0xFF, k & 0xFF];\n }\n return unpacked;\n}\n\nlet names;\nfunction nameParse(str) {\n if (!names) {\n names = unpack();\n names.transparent = [0, 0, 0, 0];\n }\n const a = names[str.toLowerCase()];\n return a && {\n r: a[0],\n g: a[1],\n b: a[2],\n a: a.length === 4 ? a[3] : 255\n };\n}\n\nconst RGB_RE = /^rgba?\\(\\s*([-+.\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?(?:[\\s,/]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction rgbParse(str) {\n const m = RGB_RE.exec(str);\n let a = 255;\n let r, g, b;\n if (!m) {\n return;\n }\n if (m[7] !== r) {\n const v = +m[7];\n a = m[8] ? p2b(v) : lim(v * 255, 0, 255);\n }\n r = +m[1];\n g = +m[3];\n b = +m[5];\n r = 255 & (m[2] ? p2b(r) : lim(r, 0, 255));\n g = 255 & (m[4] ? p2b(g) : lim(g, 0, 255));\n b = 255 & (m[6] ? p2b(b) : lim(b, 0, 255));\n return {\n r: r,\n g: g,\n b: b,\n a: a\n };\n}\nfunction rgbString(v) {\n return v && (\n v.a < 255\n ? `rgba(${v.r}, ${v.g}, ${v.b}, ${b2n(v.a)})`\n : `rgb(${v.r}, ${v.g}, ${v.b})`\n );\n}\n\nconst to = v => v <= 0.0031308 ? v * 12.92 : Math.pow(v, 1.0 / 2.4) * 1.055 - 0.055;\nconst from = v => v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\nfunction interpolate(rgb1, rgb2, t) {\n const r = from(b2n(rgb1.r));\n const g = from(b2n(rgb1.g));\n const b = from(b2n(rgb1.b));\n return {\n r: n2b(to(r + t * (from(b2n(rgb2.r)) - r))),\n g: n2b(to(g + t * (from(b2n(rgb2.g)) - g))),\n b: n2b(to(b + t * (from(b2n(rgb2.b)) - b))),\n a: rgb1.a + t * (rgb2.a - rgb1.a)\n };\n}\n\nfunction modHSL(v, i, ratio) {\n if (v) {\n let tmp = rgb2hsl(v);\n tmp[i] = Math.max(0, Math.min(tmp[i] + tmp[i] * ratio, i === 0 ? 360 : 1));\n tmp = hsl2rgb(tmp);\n v.r = tmp[0];\n v.g = tmp[1];\n v.b = tmp[2];\n }\n}\nfunction clone(v, proto) {\n return v ? Object.assign(proto || {}, v) : v;\n}\nfunction fromObject(input) {\n var v = {r: 0, g: 0, b: 0, a: 255};\n if (Array.isArray(input)) {\n if (input.length >= 3) {\n v = {r: input[0], g: input[1], b: input[2], a: 255};\n if (input.length > 3) {\n v.a = n2b(input[3]);\n }\n }\n } else {\n v = clone(input, {r: 0, g: 0, b: 0, a: 1});\n v.a = n2b(v.a);\n }\n return v;\n}\nfunction functionParse(str) {\n if (str.charAt(0) === 'r') {\n return rgbParse(str);\n }\n return hueParse(str);\n}\nclass Color {\n constructor(input) {\n if (input instanceof Color) {\n return input;\n }\n const type = typeof input;\n let v;\n if (type === 'object') {\n v = fromObject(input);\n } else if (type === 'string') {\n v = hexParse(input) || nameParse(input) || functionParse(input);\n }\n this._rgb = v;\n this._valid = !!v;\n }\n get valid() {\n return this._valid;\n }\n get rgb() {\n var v = clone(this._rgb);\n if (v) {\n v.a = b2n(v.a);\n }\n return v;\n }\n set rgb(obj) {\n this._rgb = fromObject(obj);\n }\n rgbString() {\n return this._valid ? rgbString(this._rgb) : undefined;\n }\n hexString() {\n return this._valid ? hexString(this._rgb) : undefined;\n }\n hslString() {\n return this._valid ? hslString(this._rgb) : undefined;\n }\n mix(color, weight) {\n if (color) {\n const c1 = this.rgb;\n const c2 = color.rgb;\n let w2;\n const p = weight === w2 ? 0.5 : weight;\n const w = 2 * p - 1;\n const a = c1.a - c2.a;\n const w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n w2 = 1 - w1;\n c1.r = 0xFF & w1 * c1.r + w2 * c2.r + 0.5;\n c1.g = 0xFF & w1 * c1.g + w2 * c2.g + 0.5;\n c1.b = 0xFF & w1 * c1.b + w2 * c2.b + 0.5;\n c1.a = p * c1.a + (1 - p) * c2.a;\n this.rgb = c1;\n }\n return this;\n }\n interpolate(color, t) {\n if (color) {\n this._rgb = interpolate(this._rgb, color._rgb, t);\n }\n return this;\n }\n clone() {\n return new Color(this.rgb);\n }\n alpha(a) {\n this._rgb.a = n2b(a);\n return this;\n }\n clearer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 - ratio;\n return this;\n }\n greyscale() {\n const rgb = this._rgb;\n const val = round(rgb.r * 0.3 + rgb.g * 0.59 + rgb.b * 0.11);\n rgb.r = rgb.g = rgb.b = val;\n return this;\n }\n opaquer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 + ratio;\n return this;\n }\n negate() {\n const v = this._rgb;\n v.r = 255 - v.r;\n v.g = 255 - v.g;\n v.b = 255 - v.b;\n return this;\n }\n lighten(ratio) {\n modHSL(this._rgb, 2, ratio);\n return this;\n }\n darken(ratio) {\n modHSL(this._rgb, 2, -ratio);\n return this;\n }\n saturate(ratio) {\n modHSL(this._rgb, 1, ratio);\n return this;\n }\n desaturate(ratio) {\n modHSL(this._rgb, 1, -ratio);\n return this;\n }\n rotate(deg) {\n rotate(this._rgb, deg);\n return this;\n }\n}\n\nfunction index_esm(input) {\n return new Color(input);\n}\n\nexport { Color, b2n, b2p, index_esm as default, hexParse, hexString, hsl2rgb, hslString, hsv2rgb, hueParse, hwb2rgb, lim, n2b, n2p, nameParse, p2b, rgb2hsl, rgbParse, rgbString, rotate, round };\n","/**\n * @namespace Chart.helpers\n */\n\nimport type {AnyObject} from '../types/basic.js';\nimport type {ActiveDataPoint, ChartEvent} from '../types/index.js';\n\n/**\n * An empty function that can be used, for example, for optional callback.\n */\nexport function noop() {\n /* noop */\n}\n\n/**\n * Returns a unique id, sequentially generated from a global variable.\n */\nexport const uid = (() => {\n let id = 0;\n return () => id++;\n})();\n\n/**\n * Returns true if `value` is neither null nor undefined, else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */\nexport function isNullOrUndef(value: unknown): value is null | undefined {\n return value === null || typeof value === 'undefined';\n}\n\n/**\n * Returns true if `value` is an array (including typed arrays), else returns false.\n * @param value - The value to test.\n * @function\n */\nexport function isArray(value: unknown): value is T[] {\n if (Array.isArray && Array.isArray(value)) {\n return true;\n }\n const type = Object.prototype.toString.call(value);\n if (type.slice(0, 7) === '[object' && type.slice(-6) === 'Array]') {\n return true;\n }\n return false;\n}\n\n/**\n * Returns true if `value` is an object (excluding null), else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */\nexport function isObject(value: unknown): value is AnyObject {\n return value !== null && Object.prototype.toString.call(value) === '[object Object]';\n}\n\n/**\n * Returns true if `value` is a finite number, else returns false\n * @param value - The value to test.\n */\nfunction isNumberFinite(value: unknown): value is number {\n return (typeof value === 'number' || value instanceof Number) && isFinite(+value);\n}\nexport {\n isNumberFinite as isFinite,\n};\n\n/**\n * Returns `value` if finite, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is not finite.\n */\nexport function finiteOrDefault(value: unknown, defaultValue: number) {\n return isNumberFinite(value) ? value : defaultValue;\n}\n\n/**\n * Returns `value` if defined, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is undefined.\n */\nexport function valueOrDefault(value: T | undefined, defaultValue: T) {\n return typeof value === 'undefined' ? defaultValue : value;\n}\n\nexport const toPercentage = (value: number | string, dimension: number) =>\n typeof value === 'string' && value.endsWith('%') ?\n parseFloat(value) / 100\n : +value / dimension;\n\nexport const toDimension = (value: number | string, dimension: number) =>\n typeof value === 'string' && value.endsWith('%') ?\n parseFloat(value) / 100 * dimension\n : +value;\n\n/**\n * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the\n * value returned by `fn`. If `fn` is not a function, this method returns undefined.\n * @param fn - The function to call.\n * @param args - The arguments with which `fn` should be called.\n * @param [thisArg] - The value of `this` provided for the call to `fn`.\n */\nexport function callback R, TA, R>(\n fn: T | undefined,\n args: unknown[],\n thisArg?: TA\n): R | undefined {\n if (fn && typeof fn.call === 'function') {\n return fn.apply(thisArg, args);\n }\n}\n\n/**\n * Note(SB) for performance sake, this method should only be used when loopable type\n * is unknown or in none intensive code (not called often and small loopable). Else\n * it's preferable to use a regular for() loop and save extra function calls.\n * @param loopable - The object or array to be iterated.\n * @param fn - The function to call for each item.\n * @param [thisArg] - The value of `this` provided for the call to `fn`.\n * @param [reverse] - If true, iterates backward on the loopable.\n */\nexport function each(\n loopable: Record,\n fn: (this: TA, v: T, i: string) => void,\n thisArg?: TA,\n reverse?: boolean\n): void;\nexport function each(\n loopable: T[],\n fn: (this: TA, v: T, i: number) => void,\n thisArg?: TA,\n reverse?: boolean\n): void;\nexport function each(\n loopable: T[] | Record,\n fn: (this: TA, v: T, i: any) => void,\n thisArg?: TA,\n reverse?: boolean\n) {\n let i: number, len: number, keys: string[];\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}\n\n/**\n * Returns true if the `a0` and `a1` arrays have the same content, else returns false.\n * @param a0 - The array to compare\n * @param a1 - The array to compare\n * @private\n */\nexport function _elementsEqual(a0: ActiveDataPoint[], a1: ActiveDataPoint[]) {\n let i: number, ilen: number, v0: ActiveDataPoint, v1: ActiveDataPoint;\n\n if (!a0 || !a1 || a0.length !== a1.length) {\n return false;\n }\n\n for (i = 0, ilen = a0.length; i < ilen; ++i) {\n v0 = a0[i];\n v1 = a1[i];\n\n if (v0.datasetIndex !== v1.datasetIndex || v0.index !== v1.index) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Returns a deep copy of `source` without keeping references on objects and arrays.\n * @param source - The value to clone.\n */\nexport function clone(source: T): T {\n if (isArray(source)) {\n return source.map(clone) as unknown as T;\n }\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\n for (; k < klen; ++k) {\n target[keys[k]] = clone(source[keys[k]]);\n }\n\n return target;\n }\n\n return source;\n}\n\nfunction isValidKey(key: string) {\n return ['__proto__', 'prototype', 'constructor'].indexOf(key) === -1;\n}\n\n/**\n * The default merger when Chart.helpers.merge is called without merger option.\n * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback.\n * @private\n */\nexport function _merger(key: string, target: AnyObject, source: AnyObject, options: AnyObject) {\n if (!isValidKey(key)) {\n return;\n }\n\n const tval = target[key];\n const sval = source[key];\n\n if (isObject(tval) && isObject(sval)) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n merge(tval, sval, options);\n } else {\n target[key] = clone(sval);\n }\n}\n\nexport interface MergeOptions {\n merger?: (key: string, target: AnyObject, source: AnyObject, options?: AnyObject) => void;\n}\n\n/**\n * Recursively deep copies `source` properties into `target` with the given `options`.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param target - The target object in which all sources are merged into.\n * @param source - Object(s) to merge into `target`.\n * @param [options] - Merging options:\n * @param [options.merger] - The merge method (key, target, source, options)\n * @returns The `target` object.\n */\nexport function merge(target: T, source: [], options?: MergeOptions): T;\nexport function merge(target: T, source: S1, options?: MergeOptions): T & S1;\nexport function merge(target: T, source: [S1], options?: MergeOptions): T & S1;\nexport function merge(target: T, source: [S1, S2], options?: MergeOptions): T & S1 & S2;\nexport function merge(target: T, source: [S1, S2, S3], options?: MergeOptions): T & S1 & S2 & S3;\nexport function merge(\n target: T,\n source: [S1, S2, S3, S4],\n options?: MergeOptions\n): T & S1 & S2 & S3 & S4;\nexport function merge(target: T, source: AnyObject[], options?: MergeOptions): AnyObject;\nexport function merge(target: T, source: AnyObject[], options?: MergeOptions): AnyObject {\n const sources = isArray(source) ? source : [source];\n const ilen = sources.length;\n\n if (!isObject(target)) {\n return target as AnyObject;\n }\n\n options = options || {};\n const merger = options.merger || _merger;\n let current: AnyObject;\n\n for (let i = 0; i < ilen; ++i) {\n current = sources[i];\n if (!isObject(current)) {\n continue;\n }\n\n const keys = Object.keys(current);\n for (let k = 0, klen = keys.length; k < klen; ++k) {\n merger(keys[k], target, current, options as AnyObject);\n }\n }\n\n return target;\n}\n\n/**\n * Recursively deep copies `source` properties into `target` *only* if not defined in target.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param target - The target object in which all sources are merged into.\n * @param source - Object(s) to merge into `target`.\n * @returns The `target` object.\n */\nexport function mergeIf(target: T, source: []): T;\nexport function mergeIf(target: T, source: S1): T & S1;\nexport function mergeIf(target: T, source: [S1]): T & S1;\nexport function mergeIf(target: T, source: [S1, S2]): T & S1 & S2;\nexport function mergeIf(target: T, source: [S1, S2, S3]): T & S1 & S2 & S3;\nexport function mergeIf(target: T, source: [S1, S2, S3, S4]): T & S1 & S2 & S3 & S4;\nexport function mergeIf(target: T, source: AnyObject[]): AnyObject;\nexport function mergeIf(target: T, source: AnyObject[]): AnyObject {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n return merge(target, source, {merger: _mergerIf});\n}\n\n/**\n * Merges source[key] in target[key] only if target[key] is undefined.\n * @private\n */\nexport function _mergerIf(key: string, target: AnyObject, source: AnyObject) {\n if (!isValidKey(key)) {\n return;\n }\n\n const tval = target[key];\n const sval = source[key];\n\n if (isObject(tval) && isObject(sval)) {\n mergeIf(tval, sval);\n } else if (!Object.prototype.hasOwnProperty.call(target, key)) {\n target[key] = clone(sval);\n }\n}\n\n/**\n * @private\n */\nexport function _deprecated(scope: string, value: unknown, previous: string, current: string) {\n if (value !== undefined) {\n console.warn(scope + ': \"' + previous +\n '\" is deprecated. Please use \"' + current + '\" instead');\n }\n}\n\n// resolveObjectKey resolver cache\nconst keyResolvers = {\n // Chart.helpers.core resolveObjectKey should resolve empty key to root object\n '': v => v,\n // default resolvers\n x: o => o.x,\n y: o => o.y\n};\n\n/**\n * @private\n */\nexport function _splitKey(key: string) {\n const parts = key.split('.');\n const keys: string[] = [];\n let tmp = '';\n for (const part of parts) {\n tmp += part;\n if (tmp.endsWith('\\\\')) {\n tmp = tmp.slice(0, -1) + '.';\n } else {\n keys.push(tmp);\n tmp = '';\n }\n }\n return keys;\n}\n\nfunction _getKeyResolver(key: string) {\n const keys = _splitKey(key);\n return obj => {\n for (const k of keys) {\n if (k === '') {\n // For backward compatibility:\n // Chart.helpers.core resolveObjectKey should break at empty key\n break;\n }\n obj = obj && obj[k];\n }\n return obj;\n };\n}\n\nexport function resolveObjectKey(obj: AnyObject, key: string): any {\n const resolver = keyResolvers[key] || (keyResolvers[key] = _getKeyResolver(key));\n return resolver(obj);\n}\n\n/**\n * @private\n */\nexport function _capitalize(str: string) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n\nexport const defined = (value: unknown) => typeof value !== 'undefined';\n\nexport const isFunction = (value: unknown): value is (...args: any[]) => any => typeof value === 'function';\n\n// Adapted from https://stackoverflow.com/questions/31128855/comparing-ecma6-sets-for-equality#31129384\nexport const setsEqual = (a: Set, b: Set) => {\n if (a.size !== b.size) {\n return false;\n }\n\n for (const item of a) {\n if (!b.has(item)) {\n return false;\n }\n }\n\n return true;\n};\n\n/**\n * @param e - The event\n * @private\n */\nexport function _isClickEvent(e: ChartEvent) {\n return e.type === 'mouseup' || e.type === 'click' || e.type === 'contextmenu';\n}\n","import type {Point} from '../types/geometric.js';\nimport {isFinite as isFiniteNumber} from './helpers.core.js';\n\n/**\n * @alias Chart.helpers.math\n * @namespace\n */\n\nexport const PI = Math.PI;\nexport const TAU = 2 * PI;\nexport const PITAU = TAU + PI;\nexport const INFINITY = Number.POSITIVE_INFINITY;\nexport const RAD_PER_DEG = PI / 180;\nexport const HALF_PI = PI / 2;\nexport const QUARTER_PI = PI / 4;\nexport const TWO_THIRDS_PI = PI * 2 / 3;\n\nexport const log10 = Math.log10;\nexport const sign = Math.sign;\n\nexport function almostEquals(x: number, y: number, epsilon: number) {\n return Math.abs(x - y) < epsilon;\n}\n\n/**\n * Implementation of the nice number algorithm used in determining where axis labels will go\n */\nexport function niceNum(range: number) {\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}\n\n/**\n * Returns an array of factors sorted from 1 to sqrt(value)\n * @private\n */\nexport function _factorize(value: number) {\n const result: number[] = [];\n const sqrt = Math.sqrt(value);\n let i: number;\n\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)) { // if value is a square number\n result.push(sqrt);\n }\n\n result.sort((a, b) => a - b).pop();\n return result;\n}\n\nexport function isNumber(n: unknown): n is number {\n return !isNaN(parseFloat(n as string)) && isFinite(n as number);\n}\n\nexport function almostWhole(x: number, epsilon: number) {\n const rounded = Math.round(x);\n return ((rounded - epsilon) <= x) && ((rounded + epsilon) >= x);\n}\n\n/**\n * @private\n */\nexport function _setMinAndMaxByKey(\n array: Record[],\n target: { min: number, max: number },\n property: string\n) {\n let i: number, ilen: number, value: number;\n\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}\n\nexport function toRadians(degrees: number) {\n return degrees * (PI / 180);\n}\n\nexport function toDegrees(radians: number) {\n return radians * (180 / PI);\n}\n\n/**\n * Returns the number of decimal places\n * i.e. the number of digits after the decimal point, of the value of this Number.\n * @param x - A number.\n * @returns The number of decimal places.\n * @private\n */\nexport function _decimalPlaces(x: number) {\n if (!isFiniteNumber(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}\n\n// Gets the angle from vertical upright to the point about a centre.\nexport function getAngleFromPoint(\n centrePoint: Point,\n anglePoint: Point\n) {\n const distanceFromXCenter = anglePoint.x - centrePoint.x;\n const distanceFromYCenter = anglePoint.y - centrePoint.y;\n const radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n\n let angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n\n if (angle < (-0.5 * PI)) {\n angle += TAU; // make sure the returned angle is in the range of (-PI/2, 3PI/2]\n }\n\n return {\n angle,\n distance: radialDistanceFromCenter\n };\n}\n\nexport function distanceBetweenPoints(pt1: Point, pt2: Point) {\n return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n}\n\n/**\n * Shortest distance between angles, in either direction.\n * @private\n */\nexport function _angleDiff(a: number, b: number) {\n return (a - b + PITAU) % TAU - PI;\n}\n\n/**\n * Normalize angle to be between 0 and 2*PI\n * @private\n */\nexport function _normalizeAngle(a: number) {\n return (a % TAU + TAU) % TAU;\n}\n\n/**\n * @private\n */\nexport function _angleBetween(angle: number, start: number, end: number, sameAngleIsFullCircle?: boolean) {\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}\n\n/**\n * Limit `value` between `min` and `max`\n * @param value\n * @param min\n * @param max\n * @private\n */\nexport function _limitValue(value: number, min: number, max: number) {\n return Math.max(min, Math.min(max, value));\n}\n\n/**\n * @param {number} value\n * @private\n */\nexport function _int16Range(value: number) {\n return _limitValue(value, -32768, 32767);\n}\n\n/**\n * @param value\n * @param start\n * @param end\n * @param [epsilon]\n * @private\n */\nexport function _isBetween(value: number, start: number, end: number, epsilon = 1e-6) {\n return value >= Math.min(start, end) - epsilon && value <= Math.max(start, end) + epsilon;\n}\n","import {_capitalize} from './helpers.core.js';\n\n/**\n * Binary search\n * @param table - the table search. must be sorted!\n * @param value - value to find\n * @param cmp\n * @private\n */\nexport function _lookup(\n table: number[],\n value: number,\n cmp?: (value: number) => boolean\n): {lo: number, hi: number};\nexport function _lookup(\n table: T[],\n value: number,\n cmp: (value: number) => boolean\n): {lo: number, hi: number};\nexport function _lookup(\n table: unknown[],\n value: number,\n cmp?: (value: number) => boolean\n) {\n cmp = cmp || ((index) => table[index] < value);\n let hi = table.length - 1;\n let lo = 0;\n let mid: number;\n\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\n return {lo, hi};\n}\n\n/**\n * Binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @param last - lookup last index\n * @private\n */\nexport const _lookupByKey = (\n table: Record[],\n key: string,\n value: number,\n last?: boolean\n) =>\n _lookup(table, value, last\n ? index => {\n const ti = table[index][key];\n return ti < value || ti === value && table[index + 1][key] === value;\n }\n : index => table[index][key] < value);\n\n/**\n * Reverse binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @private\n */\nexport const _rlookupByKey = (\n table: Record[],\n key: string,\n value: number\n) =>\n _lookup(table, value, index => table[index][key] >= value);\n\n/**\n * Return subset of `values` between `min` and `max` inclusive.\n * Values are assumed to be in sorted order.\n * @param values - sorted array of values\n * @param min - min value\n * @param max - max value\n */\nexport function _filterBetween(values: number[], min: number, max: number) {\n let start = 0;\n let end = values.length;\n\n while (start < end && values[start] < min) {\n start++;\n }\n while (end > start && values[end - 1] > max) {\n end--;\n }\n\n return start > 0 || end < values.length\n ? values.slice(start, end)\n : values;\n}\n\nconst arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift'] as const;\n\nexport interface ArrayListener {\n _onDataPush?(...item: T[]): void;\n _onDataPop?(): void;\n _onDataShift?(): void;\n _onDataSplice?(index: number, deleteCount: number, ...items: T[]): void;\n _onDataUnshift?(...item: T[]): void;\n}\n\n/**\n * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice',\n * 'unshift') and notify the listener AFTER the array has been altered. Listeners are\n * called on the '_onData*' callbacks (e.g. _onDataPush, etc.) with same arguments.\n */\nexport function listenArrayEvents(array: T[], listener: ArrayListener): void;\nexport function listenArrayEvents(array, listener) {\n if (array._chartjs) {\n array._chartjs.listeners.push(listener);\n return;\n }\n\n Object.defineProperty(array, '_chartjs', {\n configurable: true,\n enumerable: false,\n value: {\n listeners: [listener]\n }\n });\n\n arrayEvents.forEach((key) => {\n const method = '_onData' + _capitalize(key);\n const base = array[key];\n\n Object.defineProperty(array, key, {\n configurable: true,\n enumerable: false,\n value(...args) {\n const res = base.apply(this, args);\n\n array._chartjs.listeners.forEach((object) => {\n if (typeof object[method] === 'function') {\n object[method](...args);\n }\n });\n\n return res;\n }\n });\n });\n}\n\n\n/**\n * Removes the given array event listener and cleanup extra attached properties (such as\n * the _chartjs stub and overridden methods) if array doesn't have any more listeners.\n */\nexport function unlistenArrayEvents(array: T[], listener: ArrayListener): void;\nexport function unlistenArrayEvents(array, listener) {\n const stub = array._chartjs;\n if (!stub) {\n return;\n }\n\n const listeners = stub.listeners;\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n\n if (listeners.length > 0) {\n return;\n }\n\n arrayEvents.forEach((key) => {\n delete array[key];\n });\n\n delete array._chartjs;\n}\n\n/**\n * @param items\n */\nexport function _arrayUnique(items: T[]) {\n const set = new Set(items);\n\n if (set.size === items.length) {\n return items;\n }\n\n return Array.from(set);\n}\n","import type {ChartMeta, PointElement} from '../types/index.js';\n\nimport {_limitValue} from './helpers.math.js';\nimport {_lookupByKey} from './helpers.collection.js';\n\nexport function fontString(pixelSize: number, fontStyle: string, fontFamily: string) {\n return fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n}\n\n/**\n* Request animation polyfill\n*/\nexport const requestAnimFrame = (function() {\n if (typeof window === 'undefined') {\n return function(callback) {\n return callback();\n };\n }\n return window.requestAnimationFrame;\n}());\n\n/**\n * Throttles calling `fn` once per animation frame\n * Latest arguments are used on the actual call\n */\nexport function throttled>(\n fn: (...args: TArgs) => void,\n thisArg: any,\n) {\n let argsToUse = [] as TArgs;\n let ticking = false;\n\n return function(...args: TArgs) {\n // Save the args for use later\n argsToUse = args;\n if (!ticking) {\n ticking = true;\n requestAnimFrame.call(window, () => {\n ticking = false;\n fn.apply(thisArg, argsToUse);\n });\n }\n };\n}\n\n/**\n * Debounces calling `fn` for `delay` ms\n */\nexport function debounce>(fn: (...args: TArgs) => void, delay: number) {\n let timeout;\n return function(...args: TArgs) {\n if (delay) {\n clearTimeout(timeout);\n timeout = setTimeout(fn, delay, args);\n } else {\n fn.apply(this, args);\n }\n return delay;\n };\n}\n\n/**\n * Converts 'start' to 'left', 'end' to 'right' and others to 'center'\n * @private\n */\nexport const _toLeftRightCenter = (align: 'start' | 'end' | 'center') => align === 'start' ? 'left' : align === 'end' ? 'right' : 'center';\n\n/**\n * Returns `start`, `end` or `(start + end) / 2` depending on `align`. Defaults to `center`\n * @private\n */\nexport const _alignStartEnd = (align: 'start' | 'end' | 'center', start: number, end: number) => align === 'start' ? start : align === 'end' ? end : (start + end) / 2;\n\n/**\n * Returns `left`, `right` or `(left + right) / 2` depending on `align`. Defaults to `left`\n * @private\n */\nexport const _textX = (align: 'left' | 'right' | 'center', left: number, right: number, rtl: boolean) => {\n const check = rtl ? 'left' : 'right';\n return align === check ? right : align === 'center' ? (left + right) / 2 : left;\n};\n\n/**\n * Return start and count of visible points.\n * @private\n */\nexport function _getStartAndCountOfVisiblePoints(meta: ChartMeta<'line' | 'scatter'>, points: PointElement[], animationsDisabled: boolean) {\n const pointCount = points.length;\n\n let start = 0;\n let count = pointCount;\n\n if (meta._sorted) {\n const {iScale, _parsed} = meta;\n const axis = iScale.axis;\n const {min, max, minDefined, maxDefined} = iScale.getUserBounds();\n\n if (minDefined) {\n start = _limitValue(Math.min(\n // @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, axis, min).lo,\n // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? pointCount : _lookupByKey(points, axis, iScale.getPixelForValue(min)).lo),\n 0, pointCount - 1);\n }\n if (maxDefined) {\n count = _limitValue(Math.max(\n // @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, iScale.axis, max, true).hi + 1,\n // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? 0 : _lookupByKey(points, axis, iScale.getPixelForValue(max), true).hi + 1),\n start, pointCount) - start;\n } else {\n count = pointCount - start;\n }\n }\n\n return {start, count};\n}\n\n/**\n * Checks if the scale ranges have changed.\n * @param {object} meta - dataset meta.\n * @returns {boolean}\n * @private\n */\nexport function _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\n Object.assign(_scaleRanges, newRanges);\n return changed;\n}\n","import {PI, TAU, HALF_PI} from './helpers.math.js';\n\nconst atEdge = (t: number) => t === 0 || t === 1;\nconst elasticIn = (t: number, s: number, p: number) => -(Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * TAU / p));\nconst elasticOut = (t: number, s: number, p: number) => Math.pow(2, -10 * t) * Math.sin((t - s) * TAU / p) + 1;\n\n/**\n * Easing functions adapted from Robert Penner's easing equations.\n * @namespace Chart.helpers.easing.effects\n * @see http://www.robertpenner.com/easing/\n */\nconst effects = {\n linear: (t: number) => t,\n\n easeInQuad: (t: number) => t * t,\n\n easeOutQuad: (t: number) => -t * (t - 2),\n\n easeInOutQuad: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t\n : -0.5 * ((--t) * (t - 2) - 1),\n\n easeInCubic: (t: number) => t * t * t,\n\n easeOutCubic: (t: number) => (t -= 1) * t * t + 1,\n\n easeInOutCubic: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t\n : 0.5 * ((t -= 2) * t * t + 2),\n\n easeInQuart: (t: number) => t * t * t * t,\n\n easeOutQuart: (t: number) => -((t -= 1) * t * t * t - 1),\n\n easeInOutQuart: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t * t\n : -0.5 * ((t -= 2) * t * t * t - 2),\n\n easeInQuint: (t: number) => t * t * t * t * t,\n\n easeOutQuint: (t: number) => (t -= 1) * t * t * t * t + 1,\n\n easeInOutQuint: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t * t * t\n : 0.5 * ((t -= 2) * t * t * t * t + 2),\n\n easeInSine: (t: number) => -Math.cos(t * HALF_PI) + 1,\n\n easeOutSine: (t: number) => Math.sin(t * HALF_PI),\n\n easeInOutSine: (t: number) => -0.5 * (Math.cos(PI * t) - 1),\n\n easeInExpo: (t: number) => (t === 0) ? 0 : Math.pow(2, 10 * (t - 1)),\n\n easeOutExpo: (t: number) => (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1,\n\n easeInOutExpo: (t: number) => 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\n easeInCirc: (t: number) => (t >= 1) ? t : -(Math.sqrt(1 - t * t) - 1),\n\n easeOutCirc: (t: number) => Math.sqrt(1 - (t -= 1) * t),\n\n easeInOutCirc: (t: number) => ((t /= 0.5) < 1)\n ? -0.5 * (Math.sqrt(1 - t * t) - 1)\n : 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1),\n\n easeInElastic: (t: number) => atEdge(t) ? t : elasticIn(t, 0.075, 0.3),\n\n easeOutElastic: (t: number) => atEdge(t) ? t : elasticOut(t, 0.075, 0.3),\n\n easeInOutElastic(t: number) {\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\n easeInBack(t: number) {\n const s = 1.70158;\n return t * t * ((s + 1) * t - s);\n },\n\n easeOutBack(t: number) {\n const s = 1.70158;\n return (t -= 1) * t * ((s + 1) * t + s) + 1;\n },\n\n easeInOutBack(t: number) {\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\n easeInBounce: (t: number) => 1 - effects.easeOutBounce(1 - t),\n\n easeOutBounce(t: number) {\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\n easeInOutBounce: (t: number) => (t < 0.5)\n ? effects.easeInBounce(t * 2) * 0.5\n : effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5,\n} as const;\n\nexport type EasingFunction = keyof typeof effects\n\nexport default effects;\n","import {Color} from '@kurkle/color';\n\nexport function isPatternOrGradient(value: unknown): value is CanvasPattern | CanvasGradient {\n if (value && typeof value === 'object') {\n const type = value.toString();\n return type === '[object CanvasPattern]' || type === '[object CanvasGradient]';\n }\n\n return false;\n}\n\nexport function color(value: CanvasGradient): CanvasGradient;\nexport function color(value: CanvasPattern): CanvasPattern;\nexport function color(\n value:\n | string\n | { r: number; g: number; b: number; a: number }\n | [number, number, number]\n | [number, number, number, number]\n): Color;\nexport function color(value) {\n return isPatternOrGradient(value) ? value : new Color(value);\n}\n\nexport function getHoverColor(value: CanvasGradient): CanvasGradient;\nexport function getHoverColor(value: CanvasPattern): CanvasPattern;\nexport function getHoverColor(value: string): string;\nexport function getHoverColor(value) {\n return isPatternOrGradient(value)\n ? value\n : new Color(value).saturate(0.5).darken(0.1).hexString();\n}\n","const numbers = ['x', 'y', 'borderWidth', 'radius', 'tension'];\nconst colors = ['color', 'borderColor', 'backgroundColor'];\n\nexport function applyAnimationsDefaults(defaults) {\n defaults.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 });\n\n defaults.describe('animation', {\n _fallback: false,\n _indexable: false,\n _scriptable: (name) => name !== 'onProgress' && name !== 'onComplete' && name !== 'fn',\n });\n\n defaults.set('animations', {\n colors: {\n type: 'color',\n properties: colors\n },\n numbers: {\n type: 'number',\n properties: numbers\n },\n });\n\n defaults.describe('animations', {\n _fallback: 'animation',\n });\n\n defaults.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 // show immediately\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 // for keeping the dataset visible all the way through the animation\n },\n }\n }\n });\n}\n","\nconst intlCache = new Map();\n\nfunction getNumberFormat(locale: string, options?: Intl.NumberFormatOptions) {\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}\n\nexport function formatNumber(num: number, locale: string, options?: Intl.NumberFormatOptions) {\n return getNumberFormat(locale, options).format(num);\n}\n","import {isArray} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {log10} from '../helpers/helpers.math.js';\n\n/**\n * Namespace to hold formatters for different types of ticks\n * @namespace Chart.Ticks.formatters\n */\nconst formatters = {\n /**\n * Formatter for value labels\n * @method Chart.Ticks.formatters.values\n * @param value the value to display\n * @return {string|string[]} the label to display\n */\n values(value) {\n return isArray(value) ? /** @type {string[]} */ (value) : '' + value;\n },\n\n /**\n * Formatter for numeric ticks\n * @method Chart.Ticks.formatters.numeric\n * @param tickValue {number} the value to be formatted\n * @param index {number} the position of the tickValue parameter in the ticks array\n * @param ticks {object[]} the list of ticks being converted\n * @return {string} string representation of the tickValue parameter\n */\n numeric(tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0'; // never show decimal places for 0\n }\n\n const locale = this.chart.options.locale;\n let notation;\n let delta = tickValue; // This is used when there are less than 2 ticks as the tick interval.\n\n if (ticks.length > 1) {\n // all ticks are small or there huge numbers; use scientific notation\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\n delta = calculateDelta(tickValue, ticks);\n }\n\n const logDelta = log10(Math.abs(delta));\n\n // When datasets have values approaching Number.MAX_VALUE, the tick calculations might result in\n // infinity and eventually NaN. Passing NaN for minimumFractionDigits or maximumFractionDigits\n // will make the number formatter throw. So instead we check for isNaN and use a fallback value.\n //\n // toFixed has a max of 20 decimal places\n const numDecimal = isNaN(logDelta) ? 1 : Math.max(Math.min(-1 * Math.floor(logDelta), 20), 0);\n\n const options = {notation, minimumFractionDigits: numDecimal, maximumFractionDigits: numDecimal};\n Object.assign(options, this.options.ticks.format);\n\n return formatNumber(tickValue, locale, options);\n },\n\n\n /**\n * Formatter for logarithmic ticks\n * @method Chart.Ticks.formatters.logarithmic\n * @param tickValue {number} the value to be formatted\n * @param index {number} the position of the tickValue parameter in the ticks array\n * @param ticks {object[]} the list of ticks being converted\n * @return {string} string representation of the tickValue parameter\n */\n logarithmic(tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0';\n }\n const remain = ticks[index].significand || (tickValue / (Math.pow(10, Math.floor(log10(tickValue)))));\n if ([1, 2, 3, 5, 10, 15].includes(remain) || index > 0.8 * ticks.length) {\n return formatters.numeric.call(this, tickValue, index, ticks);\n }\n return '';\n }\n\n};\n\n\nfunction calculateDelta(tickValue, ticks) {\n // Figure out how many digits to show\n // The space between the first two ticks might be smaller than normal spacing\n let delta = ticks.length > 3 ? ticks[2].value - ticks[1].value : ticks[1].value - ticks[0].value;\n\n // If we have a number like 2.5 as the delta, figure out how many decimal places we need\n if (Math.abs(delta) >= 1 && tickValue !== Math.floor(tickValue)) {\n // not an integer\n delta = tickValue - Math.floor(tickValue);\n }\n return delta;\n}\n\n/**\n * Namespace to hold static tick generation functions\n * @namespace Chart.Ticks\n */\nexport default {formatters};\n","import {getHoverColor} from '../helpers/helpers.color.js';\nimport {isObject, merge, valueOrDefault} from '../helpers/helpers.core.js';\nimport {applyAnimationsDefaults} from './core.animations.defaults.js';\nimport {applyLayoutsDefaults} from './core.layouts.defaults.js';\nimport {applyScaleDefaults} from './core.scale.defaults.js';\n\nexport const overrides = Object.create(null);\nexport const descriptors = Object.create(null);\n\n/**\n * @param {object} node\n * @param {string} key\n * @return {object}\n */\nfunction getScope(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}\n\nfunction set(root, scope, values) {\n if (typeof scope === 'string') {\n return merge(getScope(root, scope), values);\n }\n return merge(getScope(root, ''), scope);\n}\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is exported for typedoc\n */\nexport class Defaults {\n constructor(_descriptors, _appliers) {\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 includeInvisible: false\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.drawActiveElementsOnTop = true;\n\n this.describe(_descriptors);\n this.apply(_appliers);\n }\n\n /**\n\t * @param {string|object} scope\n\t * @param {object} [values]\n\t */\n set(scope, values) {\n return set(this, scope, values);\n }\n\n /**\n\t * @param {string} scope\n\t */\n get(scope) {\n return getScope(this, scope);\n }\n\n /**\n\t * @param {string|object} scope\n\t * @param {object} [values]\n\t */\n describe(scope, values) {\n return set(descriptors, scope, values);\n }\n\n override(scope, values) {\n return set(overrides, scope, values);\n }\n\n /**\n\t * Routes the named defaults to fallback to another scope/name.\n\t * This routing is useful when those target values, like defaults.color, are changed runtime.\n\t * If the values would be copied, the runtime change would not take effect. By routing, the\n\t * fallback is evaluated at each access, so its always up to date.\n\t *\n\t * Example:\n\t *\n\t * \tdefaults.route('elements.arc', 'backgroundColor', '', 'color')\n\t * - reads the backgroundColor from defaults.color when undefined locally\n\t *\n\t * @param {string} scope Scope this route applies to.\n\t * @param {string} name Property name that should be routed to different namespace when not defined here.\n\t * @param {string} targetScope The namespace where those properties should be routed to.\n\t * Empty string ('') is the root of defaults.\n\t * @param {string} targetName The target name in the target scope the property should be routed to.\n\t */\n route(scope, name, targetScope, targetName) {\n const scopeObject = getScope(this, scope);\n const targetScopeObject = getScope(this, targetScope);\n const privateName = '_' + name;\n\n Object.defineProperties(scopeObject, {\n // A private property is defined to hold the actual value, when this property is set in its scope (set in the setter)\n [privateName]: {\n value: scopeObject[name],\n writable: true\n },\n // The actual property is defined as getter/setter so we can do the routing when value is not locally set.\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\n apply(appliers) {\n appliers.forEach((apply) => apply(this));\n }\n}\n\n// singleton instance\nexport default /* #__PURE__ */ 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}, [applyAnimationsDefaults, applyLayoutsDefaults, applyScaleDefaults]);\n","export function applyLayoutsDefaults(defaults) {\n defaults.set('layout', {\n autoPadding: true,\n padding: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n }\n });\n}\n","import Ticks from './core.ticks.js';\n\nexport function applyScaleDefaults(defaults) {\n defaults.set('scale', {\n display: true,\n offset: false,\n reverse: false,\n beginAtZero: false,\n\n /**\n * Scale boundary strategy (bypassed by min/max time options)\n * - `data`: make sure data are fully visible, ticks outside are removed\n * - `ticks`: make sure ticks are fully visible, data outside are truncated\n * @see https://github.com/chartjs/Chart.js/pull/4556\n * @since 3.0.0\n */\n bounds: 'ticks',\n\n /**\n * Addition grace added to max and reduced from min data value.\n * @since 3.0.0\n */\n grace: 0,\n\n // grid line settings\n grid: {\n display: true,\n lineWidth: 1,\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 },\n\n border: {\n display: true,\n dash: [],\n dashOffset: 0.0,\n width: 1\n },\n\n // scale title\n title: {\n // display property\n display: false,\n\n // actual label\n text: '',\n\n // top/bottom padding\n padding: {\n top: 4,\n bottom: 4\n }\n },\n\n // label settings\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 // We pass through arrays to be rendered as multiline labels, we convert Others to strings here.\n callback: Ticks.formatters.values,\n minor: {},\n major: {},\n align: 'center',\n crossAlign: 'near',\n\n showLabelBackdrop: false,\n backdropColor: 'rgba(255, 255, 255, 0.75)',\n backdropPadding: 2,\n }\n });\n\n defaults.route('scale.ticks', 'color', '', 'color');\n defaults.route('scale.grid', 'color', '', 'borderColor');\n defaults.route('scale.border', 'color', '', 'borderColor');\n defaults.route('scale.title', 'color', '', 'color');\n\n defaults.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' && name !== 'dash',\n });\n\n defaults.describe('scales', {\n _fallback: 'scale',\n });\n\n defaults.describe('scale.ticks', {\n _scriptable: (name) => name !== 'backdropPadding' && name !== 'callback',\n _indexable: (name) => name !== 'backdropPadding',\n });\n}\n","import type {\n Chart,\n Point,\n FontSpec,\n CanvasFontSpec,\n PointStyle,\n RenderTextOpts,\n BackdropOptions\n} from '../types/index.js';\nimport type {\n TRBL,\n SplinePoint,\n RoundedRect,\n TRBLCorners\n} from '../types/geometric.js';\nimport {isArray, isNullOrUndef} from './helpers.core.js';\nimport {PI, TAU, HALF_PI, QUARTER_PI, TWO_THIRDS_PI, RAD_PER_DEG} from './helpers.math.js';\n\n/**\n * Converts the given font object into a CSS font string.\n * @param font - A font object.\n * @return The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font\n * @private\n */\nexport function toFontString(font: FontSpec) {\n if (!font || isNullOrUndef(font.size) || isNullOrUndef(font.family)) {\n return null;\n }\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}\n\n/**\n * @private\n */\nexport function _measureText(\n ctx: CanvasRenderingContext2D,\n data: Record,\n gc: string[],\n longest: number,\n string: string\n) {\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}\n\ntype Thing = string | undefined | null\ntype Things = (Thing | Thing[])[]\n\n/**\n * @private\n */\n// eslint-disable-next-line complexity\nexport function _longestText(\n ctx: CanvasRenderingContext2D,\n font: string,\n arrayOfThings: Things,\n cache?: {data?: Record, garbageCollect?: string[], font?: string}\n) {\n cache = cache || {};\n let data = cache.data = cache.data || {};\n let gc = cache.garbageCollect = cache.garbageCollect || [];\n\n if (cache.font !== font) {\n data = cache.data = {};\n gc = cache.garbageCollect = [];\n cache.font = font;\n }\n\n ctx.save();\n\n ctx.font = font;\n let longest = 0;\n const ilen = arrayOfThings.length;\n let i: number, j: number, jlen: number, thing: Thing | Thing[], nestedThing: Thing | Thing[];\n for (i = 0; i < ilen; i++) {\n thing = arrayOfThings[i];\n\n // Undefined strings and arrays should not be measured\n if (thing !== undefined && thing !== null && !isArray(thing)) {\n longest = _measureText(ctx, data, gc, longest, thing);\n } else if (isArray(thing)) {\n // if it is an array lets measure each element\n // to do maybe simplify this function a bit so we can do this more recursively?\n for (j = 0, jlen = thing.length; j < jlen; j++) {\n nestedThing = thing[j];\n // Undefined strings and arrays should not be measured\n if (nestedThing !== undefined && nestedThing !== null && !isArray(nestedThing)) {\n longest = _measureText(ctx, data, gc, longest, nestedThing);\n }\n }\n }\n }\n\n ctx.restore();\n\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}\n\n/**\n * Returns the aligned pixel value to avoid anti-aliasing blur\n * @param chart - The chart instance.\n * @param pixel - A pixel value.\n * @param width - The width of the element.\n * @returns The aligned pixel value.\n * @private\n */\nexport function _alignPixel(chart: Chart, pixel: number, width: number) {\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}\n\n/**\n * Clears the entire canvas.\n */\nexport function clearCanvas(canvas: HTMLCanvasElement, ctx?: CanvasRenderingContext2D) {\n ctx = ctx || canvas.getContext('2d');\n\n ctx.save();\n // canvas.width and canvas.height do not consider the canvas transform,\n // while clearRect does\n ctx.resetTransform();\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.restore();\n}\n\nexport interface DrawPointOptions {\n pointStyle: PointStyle;\n rotation?: number;\n radius: number;\n borderWidth: number;\n}\n\nexport function drawPoint(\n ctx: CanvasRenderingContext2D,\n options: DrawPointOptions,\n x: number,\n y: number\n) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n drawPointLegend(ctx, options, x, y, null);\n}\n\n// eslint-disable-next-line complexity\nexport function drawPointLegend(\n ctx: CanvasRenderingContext2D,\n options: DrawPointOptions,\n x: number,\n y: number,\n w: number\n) {\n let type: string, xOffset: number, yOffset: number, size: number, cornerRadius: number, width: number, xOffsetW: number, yOffsetW: number;\n const style = options.pointStyle;\n const rotation = options.rotation;\n const radius = options.radius;\n let rad = (rotation || 0) * RAD_PER_DEG;\n\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\n if (isNaN(radius) || radius <= 0) {\n return;\n }\n\n ctx.beginPath();\n\n switch (style) {\n // Default includes circle\n default:\n if (w) {\n ctx.ellipse(x, y, w / 2, radius, 0, 0, TAU);\n } else {\n ctx.arc(x, y, radius, 0, TAU);\n }\n ctx.closePath();\n break;\n case 'triangle':\n width = w ? w / 2 : radius;\n ctx.moveTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n ctx.closePath();\n break;\n case 'rectRounded':\n // NOTE: the rounded rect implementation changed to use `arc` instead of\n // `quadraticCurveTo` since it generates better results when rect is\n // almost a circle. 0.516 (instead of 0.5) produces results with visually\n // closer proportion to the previous impl and it is inscribed in the\n // circle with `radius`. For more details, see the following PRs:\n // https://github.com/chartjs/Chart.js/issues/5597\n // https://github.com/chartjs/Chart.js/issues/5858\n cornerRadius = radius * 0.516;\n size = radius - cornerRadius;\n xOffset = Math.cos(rad + QUARTER_PI) * size;\n xOffsetW = Math.cos(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n yOffset = Math.sin(rad + QUARTER_PI) * size;\n yOffsetW = Math.sin(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n ctx.arc(x - xOffsetW, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);\n ctx.arc(x + yOffsetW, y - xOffset, cornerRadius, rad - HALF_PI, rad);\n ctx.arc(x + xOffsetW, y + yOffset, cornerRadius, rad, rad + HALF_PI);\n ctx.arc(x - yOffsetW, 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 width = w ? w / 2 : size;\n ctx.rect(x - width, y - size, 2 * width, 2 * size);\n break;\n }\n rad += QUARTER_PI;\n /* falls through */\n case 'rectRot':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n ctx.closePath();\n break;\n case 'crossRot':\n rad += QUARTER_PI;\n /* falls through */\n case 'cross':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case 'star':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n rad += QUARTER_PI;\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case 'line':\n xOffset = w ? w / 2 : 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) * (w ? w / 2 : radius), y + Math.sin(rad) * radius);\n break;\n case false:\n ctx.closePath();\n break;\n }\n\n ctx.fill();\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n}\n\n/**\n * Returns true if the point is inside the rectangle\n * @param point - The point to test\n * @param area - The rectangle\n * @param margin - allowed margin\n * @private\n */\nexport function _isPointInArea(\n point: Point,\n area: TRBL,\n margin?: number\n) {\n margin = margin || 0.5; // margin - default is to match rounded decimals\n\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}\n\nexport function clipArea(ctx: CanvasRenderingContext2D, area: TRBL) {\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}\n\nexport function unclipArea(ctx: CanvasRenderingContext2D) {\n ctx.restore();\n}\n\n/**\n * @private\n */\nexport function _steppedLineTo(\n ctx: CanvasRenderingContext2D,\n previous: Point,\n target: Point,\n flip?: boolean,\n mode?: string\n) {\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}\n\n/**\n * @private\n */\nexport function _bezierCurveTo(\n ctx: CanvasRenderingContext2D,\n previous: SplinePoint,\n target: SplinePoint,\n flip?: boolean\n) {\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}\n\nfunction setRenderOpts(ctx: CanvasRenderingContext2D, opts: RenderTextOpts) {\n if (opts.translation) {\n ctx.translate(opts.translation[0], opts.translation[1]);\n }\n\n if (!isNullOrUndef(opts.rotation)) {\n ctx.rotate(opts.rotation);\n }\n\n if (opts.color) {\n ctx.fillStyle = opts.color;\n }\n\n if (opts.textAlign) {\n ctx.textAlign = opts.textAlign;\n }\n\n if (opts.textBaseline) {\n ctx.textBaseline = opts.textBaseline;\n }\n}\n\nfunction decorateText(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n line: string,\n opts: RenderTextOpts\n) {\n if (opts.strikethrough || opts.underline) {\n /**\n * Now that IE11 support has been dropped, we can use more\n * of the TextMetrics object. The actual bounding boxes\n * are unflagged in Chrome, Firefox, Edge, and Safari so they\n * can be safely used.\n * See https://developer.mozilla.org/en-US/docs/Web/API/TextMetrics#Browser_compatibility\n */\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\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}\n\nfunction drawBackdrop(ctx: CanvasRenderingContext2D, opts: BackdropOptions) {\n const oldColor = ctx.fillStyle;\n\n ctx.fillStyle = opts.color as string;\n ctx.fillRect(opts.left, opts.top, opts.width, opts.height);\n ctx.fillStyle = oldColor;\n}\n\n/**\n * Render text onto the canvas\n */\nexport function renderText(\n ctx: CanvasRenderingContext2D,\n text: string | string[],\n x: number,\n y: number,\n font: CanvasFontSpec,\n opts: RenderTextOpts = {}\n) {\n const lines = isArray(text) ? text : [text];\n const stroke = opts.strokeWidth > 0 && opts.strokeColor !== '';\n let i: number, line: string;\n\n ctx.save();\n ctx.font = font.string;\n setRenderOpts(ctx, opts);\n\n for (i = 0; i < lines.length; ++i) {\n line = lines[i];\n\n if (opts.backdrop) {\n drawBackdrop(ctx, opts.backdrop);\n }\n\n if (stroke) {\n if (opts.strokeColor) {\n ctx.strokeStyle = opts.strokeColor;\n }\n\n if (!isNullOrUndef(opts.strokeWidth)) {\n ctx.lineWidth = opts.strokeWidth;\n }\n\n ctx.strokeText(line, x, y, opts.maxWidth);\n }\n\n ctx.fillText(line, x, y, opts.maxWidth);\n decorateText(ctx, x, y, line, opts);\n\n y += Number(font.lineHeight);\n }\n\n ctx.restore();\n}\n\n/**\n * Add a path of a rectangle with rounded corners to the current sub-path\n * @param ctx - Context\n * @param rect - Bounding rect\n */\nexport function addRoundedRectPath(\n ctx: CanvasRenderingContext2D,\n rect: RoundedRect & { radius: TRBLCorners }\n) {\n const {x, y, w, h, radius} = rect;\n\n // top left arc\n ctx.arc(x + radius.topLeft, y + radius.topLeft, radius.topLeft, -HALF_PI, PI, true);\n\n // line from top left to bottom left\n ctx.lineTo(x, y + h - radius.bottomLeft);\n\n // bottom left arc\n ctx.arc(x + radius.bottomLeft, y + h - radius.bottomLeft, radius.bottomLeft, PI, HALF_PI, true);\n\n // line from bottom left to bottom right\n ctx.lineTo(x + w - radius.bottomRight, y + h);\n\n // bottom right arc\n ctx.arc(x + w - radius.bottomRight, y + h - radius.bottomRight, radius.bottomRight, HALF_PI, 0, true);\n\n // line from bottom right to top right\n ctx.lineTo(x + w, y + radius.topRight);\n\n // top right arc\n ctx.arc(x + w - radius.topRight, y + radius.topRight, radius.topRight, 0, -HALF_PI, true);\n\n // line from top right to top left\n ctx.lineTo(x + radius.topLeft, y);\n}\n","import defaults from '../core/core.defaults.js';\nimport {isArray, isObject, toDimension, valueOrDefault} from './helpers.core.js';\nimport {toFontString} from './helpers.canvas.js';\nimport type {ChartArea, FontSpec, Point} from '../types/index.js';\nimport type {TRBL, TRBLCorners} from '../types/geometric.js';\n\nconst LINE_HEIGHT = /^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/;\nconst FONT_STYLE = /^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;\n\n/**\n * @alias Chart.helpers.options\n * @namespace\n */\n/**\n * Converts the given line height `value` in pixels for a specific font `size`.\n * @param value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em').\n * @param size - The font size (in pixels) used to resolve relative `value`.\n * @returns The effective line height in pixels (size * 1.2 if value is invalid).\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\n * @since 2.7.0\n */\nexport function toLineHeight(value: number | string, size: number): number {\n const matches = ('' + value).match(LINE_HEIGHT);\n if (!matches || matches[1] === 'normal') {\n return size * 1.2;\n }\n\n value = +matches[2];\n\n switch (matches[3]) {\n case 'px':\n return value;\n case '%':\n value /= 100;\n break;\n default:\n break;\n }\n\n return size * value;\n}\n\nconst numberOrZero = (v: unknown) => +v || 0;\n\n/**\n * @param value\n * @param props\n */\nexport function _readValueToProps(value: number | Record, props: K[]): Record;\nexport function _readValueToProps(value: number | Record, props: Record): Record;\nexport function _readValueToProps(value: number | Record, props: string[] | Record) {\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\n for (const prop of keys) {\n ret[prop] = numberOrZero(read(prop));\n }\n return ret;\n}\n\n/**\n * Converts the given value into a TRBL object.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left)\n * @since 3.0.0\n */\nexport function toTRBL(value: number | TRBL | Point) {\n return _readValueToProps(value, {top: 'y', right: 'x', bottom: 'y', left: 'x'});\n}\n\n/**\n * Converts the given value into a TRBL corners object (similar with css border-radius).\n * @param value - If a number, set the value to all TRBL corner components,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * @returns The TRBL corner values (topLeft, topRight, bottomLeft, bottomRight)\n * @since 3.0.0\n */\nexport function toTRBLCorners(value: number | TRBLCorners) {\n return _readValueToProps(value, ['topLeft', 'topRight', 'bottomLeft', 'bottomRight']);\n}\n\n/**\n * Converts the given value into a padding object with pre-computed width/height.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left, width, height)\n * @since 2.7.0\n */\nexport function toPadding(value?: number | TRBL): ChartArea {\n const obj = toTRBL(value) as ChartArea;\n\n obj.width = obj.left + obj.right;\n obj.height = obj.top + obj.bottom;\n\n return obj;\n}\n\n/**\n * Parses font options and returns the font object.\n * @param options - A object that contains font options to be parsed.\n * @param fallback - A object that contains fallback font options.\n * @return The font object.\n * @private\n */\n\nexport function toFont(options: Partial, fallback?: Partial) {\n options = options || {};\n fallback = fallback || defaults.font as FontSpec;\n\n let size = valueOrDefault(options.size, fallback.size);\n\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 = undefined;\n }\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\n font.string = toFontString(font);\n return font;\n}\n\n/**\n * Evaluates the given `inputs` sequentially and returns the first defined value.\n * @param inputs - An array of values, falling back to the last value.\n * @param context - If defined and the current value is a function, the value\n * is called with `context` as first argument and the result becomes the new input.\n * @param index - If defined and the current value is an array, the value\n * at `index` become the new input.\n * @param info - object to return information about resolution in\n * @param info.cacheable - Will be set to `false` if option is not cacheable.\n * @since 2.7.0\n */\nexport function resolve(inputs: Array, context?: object, index?: number, info?: { cacheable: boolean }) {\n let cacheable = true;\n let i: number, ilen: number, value: unknown;\n\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}\n\n/**\n * @param minmax\n * @param grace\n * @param beginAtZero\n * @private\n */\nexport function _addGrace(minmax: { min: number; max: number; }, grace: number | string, beginAtZero: boolean) {\n const {min, max} = minmax;\n const change = toDimension(grace, (max - min) / 2);\n const keepZero = (value: number, add: number) => beginAtZero && value === 0 ? 0 : value + add;\n return {\n min: keepZero(min, -Math.abs(change)),\n max: keepZero(max, change)\n };\n}\n\n/**\n * Create a context inheriting parentContext\n * @param parentContext\n * @param context\n * @returns\n */\nexport function createContext(parentContext: null, context: T): T;\nexport function createContext(parentContext: P, context: T): P & T;\nexport function createContext(parentContext: object, context: object) {\n return Object.assign(Object.create(parentContext), context);\n}\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport type {AnyObject} from '../types/basic.js';\nimport type {ChartMeta} from '../types/index.js';\nimport type {\n ResolverObjectKey,\n ResolverCache,\n ResolverProxy,\n DescriptorDefaults,\n Descriptor,\n ContextCache,\n ContextProxy\n} from './helpers.config.types.js';\nimport {isArray, isFunction, isObject, resolveObjectKey, _capitalize} from './helpers.core.js';\n\nexport * from './helpers.config.types.js';\n\n/**\n * Creates a Proxy for resolving raw values for options.\n * @param scopes - The option scopes to look for values, in resolution order\n * @param prefixes - The prefixes for values, in resolution order.\n * @param rootScopes - The root option scopes\n * @param fallback - Parent scopes fallback\n * @param getTarget - callback for getting the target for changed values\n * @returns Proxy\n * @private\n */\nexport function _createResolver<\n T extends AnyObject[] = AnyObject[],\n R extends AnyObject[] = T\n>(\n scopes: T,\n prefixes = [''],\n rootScopes?: R,\n fallback?: ResolverObjectKey,\n getTarget = () => scopes[0]\n) {\n const finalRootScopes = rootScopes || scopes;\n if (typeof fallback === 'undefined') {\n fallback = _resolve('_fallback', scopes);\n }\n const cache: ResolverCache = {\n [Symbol.toStringTag]: 'Object',\n _cacheable: true,\n _scopes: scopes,\n _rootScopes: finalRootScopes,\n _fallback: fallback,\n _getTarget: getTarget,\n override: (scope: AnyObject) => _createResolver([scope, ...scopes], prefixes, finalRootScopes, fallback),\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */\n deleteProperty(target, prop: string) {\n delete target[prop]; // remove from cache\n delete target._keys; // remove cached keys\n delete scopes[0][prop]; // remove from top level scope\n return true;\n },\n\n /**\n * A trap for getting property values.\n */\n get(target, prop: string) {\n return _cached(target, prop,\n () => _resolveWithPrefixes(prop, prefixes, scopes, target));\n },\n\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\n */\n getOwnPropertyDescriptor(target, prop) {\n return Reflect.getOwnPropertyDescriptor(target._scopes[0], prop);\n },\n\n /**\n * A trap for Object.getPrototypeOf.\n */\n getPrototypeOf() {\n return Reflect.getPrototypeOf(scopes[0]);\n },\n\n /**\n * A trap for the in operator.\n */\n has(target, prop: string) {\n return getKeysFromAllScopes(target).includes(prop);\n },\n\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */\n ownKeys(target) {\n return getKeysFromAllScopes(target);\n },\n\n /**\n * A trap for setting property values.\n */\n set(target, prop: string, value) {\n const storage = target._storage || (target._storage = getTarget());\n target[prop] = storage[prop] = value; // set to top level scope + cache\n delete target._keys; // remove cached keys\n return true;\n }\n }) as ResolverProxy;\n}\n\n/**\n * Returns an Proxy for resolving option values with context.\n * @param proxy - The Proxy returned by `_createResolver`\n * @param context - Context object for scriptable/indexable options\n * @param subProxy - The proxy provided for scriptable options\n * @param descriptorDefaults - Defaults for descriptors\n * @private\n */\nexport function _attachContext<\n T extends AnyObject[] = AnyObject[],\n R extends AnyObject[] = T\n>(\n proxy: ResolverProxy,\n context: AnyObject,\n subProxy?: ResolverProxy,\n descriptorDefaults?: DescriptorDefaults\n) {\n const cache: ContextCache = {\n _cacheable: false,\n _proxy: proxy,\n _context: context,\n _subProxy: subProxy,\n _stack: new Set(),\n _descriptors: _descriptors(proxy, descriptorDefaults),\n setContext: (ctx: AnyObject) => _attachContext(proxy, ctx, subProxy, descriptorDefaults),\n override: (scope: AnyObject) => _attachContext(proxy.override(scope), context, subProxy, descriptorDefaults)\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */\n deleteProperty(target, prop) {\n delete target[prop]; // remove from cache\n delete proxy[prop]; // remove from proxy\n return true;\n },\n\n /**\n * A trap for getting property values.\n */\n get(target, prop: string, receiver) {\n return _cached(target, prop,\n () => _resolveWithContext(target, prop, receiver));\n },\n\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\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\n /**\n * A trap for Object.getPrototypeOf.\n */\n getPrototypeOf() {\n return Reflect.getPrototypeOf(proxy);\n },\n\n /**\n * A trap for the in operator.\n */\n has(target, prop) {\n return Reflect.has(proxy, prop);\n },\n\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */\n ownKeys() {\n return Reflect.ownKeys(proxy);\n },\n\n /**\n * A trap for setting property values.\n */\n set(target, prop, value) {\n proxy[prop] = value; // set to proxy\n delete target[prop]; // remove from cache\n return true;\n }\n }) as ContextProxy;\n}\n\n/**\n * @private\n */\nexport function _descriptors(\n proxy: ResolverCache,\n defaults: DescriptorDefaults = {scriptable: true, indexable: true}\n): Descriptor {\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}\n\nconst readKey = (prefix: string, name: string) => prefix ? prefix + _capitalize(name) : name;\nconst needsSubResolver = (prop: string, value: unknown) => isObject(value) && prop !== 'adapters' &&\n (Object.getPrototypeOf(value) === null || value.constructor === Object);\n\nfunction _cached(\n target: AnyObject,\n prop: string,\n resolve: () => unknown\n) {\n if (Object.prototype.hasOwnProperty.call(target, prop)) {\n return target[prop];\n }\n\n const value = resolve();\n // cache the resolved value\n target[prop] = value;\n return value;\n}\n\nfunction _resolveWithContext(\n target: ContextCache,\n prop: string,\n receiver: AnyObject\n) {\n const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n let value = _proxy[prop]; // resolve from proxy\n\n // resolve with context\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 // if the resolved value is an object, create a sub resolver for it\n value = _attachContext(value, _context, _subProxy && _subProxy[prop], descriptors);\n }\n return value;\n}\n\nfunction _resolveScriptable(\n prop: string,\n getValue: (ctx: AnyObject, sub: AnyObject) => unknown,\n target: ContextCache,\n receiver: AnyObject\n) {\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 let value = getValue(_context, _subProxy || receiver);\n _stack.delete(prop);\n if (needsSubResolver(prop, value)) {\n // When scriptable option returns an object, create a resolver on that.\n value = createSubResolver(_proxy._scopes, _proxy, prop, value);\n }\n return value;\n}\n\nfunction _resolveArray(\n prop: string,\n value: unknown[],\n target: ContextCache,\n isIndexable: (key: string) => boolean\n) {\n const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n\n if (typeof _context.index !== 'undefined' && isIndexable(prop)) {\n return value[_context.index % value.length];\n } else if (isObject(value[0])) {\n // Array of objects, return array or resolvers\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}\n\nfunction resolveFallback(\n fallback: ResolverObjectKey | ((prop: ResolverObjectKey, value: unknown) => ResolverObjectKey),\n prop: ResolverObjectKey,\n value: unknown\n) {\n return isFunction(fallback) ? fallback(prop, value) : fallback;\n}\n\nconst getScope = (key: ResolverObjectKey, parent: AnyObject) => key === true ? parent\n : typeof key === 'string' ? resolveObjectKey(parent, key) : undefined;\n\nfunction addScopes(\n set: Set,\n parentScopes: AnyObject[],\n key: ResolverObjectKey,\n parentFallback: ResolverObjectKey,\n value: unknown\n) {\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, value);\n if (typeof fallback !== 'undefined' && fallback !== key && fallback !== parentFallback) {\n // When we reach the descriptor that defines a new _fallback, return that.\n // The fallback will resume to that new scope.\n return fallback;\n }\n } else if (scope === false && typeof parentFallback !== 'undefined' && key !== parentFallback) {\n // Fallback to `false` results to `false`, when falling back to different key.\n // For example `interaction` from `hover` or `plugins.tooltip` and `animation` from `animations`\n return null;\n }\n }\n return false;\n}\n\nfunction createSubResolver(\n parentScopes: AnyObject[],\n resolver: ResolverCache,\n prop: ResolverObjectKey,\n value: unknown\n) {\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, value);\n if (key === null) {\n return false;\n }\n if (typeof fallback !== 'undefined' && fallback !== prop) {\n key = addScopesFromKey(set, allScopes, fallback, key, value);\n if (key === null) {\n return false;\n }\n }\n return _createResolver(Array.from(set), [''], rootScopes, fallback,\n () => subGetTarget(resolver, prop as string, value));\n}\n\nfunction addScopesFromKey(\n set: Set,\n allScopes: AnyObject[],\n key: ResolverObjectKey,\n fallback: ResolverObjectKey,\n item: unknown\n) {\n while (key) {\n key = addScopes(set, allScopes, key, fallback, item);\n }\n return key;\n}\n\nfunction subGetTarget(\n resolver: ResolverCache,\n prop: string,\n value: unknown\n) {\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 // For array of objects, the object is used to store updated values\n return value;\n }\n return target || {};\n}\n\nfunction _resolveWithPrefixes(\n prop: string,\n prefixes: string[],\n scopes: AnyObject[],\n proxy: ResolverProxy\n) {\n let value: unknown;\n for (const prefix of prefixes) {\n value = _resolve(readKey(prefix, prop), scopes);\n if (typeof value !== 'undefined') {\n return needsSubResolver(prop, value)\n ? createSubResolver(scopes, proxy, prop, value)\n : value;\n }\n }\n}\n\nfunction _resolve(key: string, scopes: AnyObject[]) {\n for (const scope of scopes) {\n if (!scope) {\n continue;\n }\n const value = scope[key];\n if (typeof value !== 'undefined') {\n return value;\n }\n }\n}\n\nfunction getKeysFromAllScopes(target: ResolverCache) {\n let keys = target._keys;\n if (!keys) {\n keys = target._keys = resolveKeysFromAllScopes(target._scopes);\n }\n return keys;\n}\n\nfunction resolveKeysFromAllScopes(scopes: AnyObject[]) {\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\nexport function _parseObjectDataRadialScale(\n meta: ChartMeta<'line' | 'scatter'>,\n data: AnyObject[],\n start: number,\n count: number\n) {\n const {iScale} = meta;\n const {key = 'r'} = this._parsing;\n const parsed = new Array<{r: unknown}>(count);\n let i: number, ilen: number, index: number, item: AnyObject;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n r: iScale.parse(resolveObjectKey(item, key), index)\n };\n }\n return parsed;\n}\n","import {almostEquals, distanceBetweenPoints, sign} from './helpers.math.js';\nimport {_isPointInArea} from './helpers.canvas.js';\nimport type {ChartArea} from '../types/index.js';\nimport type {SplinePoint} from '../types/geometric.js';\n\nconst EPSILON = Number.EPSILON || 1e-14;\n\ntype OptionalSplinePoint = SplinePoint | false\nconst getPoint = (points: SplinePoint[], i: number): OptionalSplinePoint => i < points.length && !points[i].skip && points[i];\nconst getValueAxis = (indexAxis: 'x' | 'y') => indexAxis === 'x' ? 'y' : 'x';\n\nexport function splineCurve(\n firstPoint: SplinePoint,\n middlePoint: SplinePoint,\n afterPoint: SplinePoint,\n t: number\n): {\n previous: SplinePoint\n next: SplinePoint\n } {\n // Props to Rob Spencer at scaled innovation for his post on splining between points\n // http://scaledinnovation.com/analytics/splines/aboutSplines.html\n\n // This function must also respect \"skipped\" points\n\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\n let s01 = d01 / (d01 + d12);\n let s12 = d12 / (d01 + d12);\n\n // If all points are the same, s01 & s02 will be inf\n s01 = isNaN(s01) ? 0 : s01;\n s12 = isNaN(s12) ? 0 : s12;\n\n const fa = t * s01; // scaling factor for triangle Ta\n const fb = t * s12;\n\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}\n\n/**\n * Adjust tangents to ensure monotonic properties\n */\nfunction monotoneAdjust(points: SplinePoint[], deltaK: number[], mK: number[]) {\n const pointsLen = points.length;\n\n let alphaK: number, betaK: number, tauK: number, squaredMagnitude: number, pointCurrent: OptionalSplinePoint;\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\n if (almostEquals(deltaK[i], 0, EPSILON)) {\n mK[i] = mK[i + 1] = 0;\n continue;\n }\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\n tauK = 3 / Math.sqrt(squaredMagnitude);\n mK[i] = alphaK * tauK * deltaK[i];\n mK[i + 1] = betaK * tauK * deltaK[i];\n }\n}\n\nfunction monotoneCompute(points: SplinePoint[], mK: number[], indexAxis: 'x' | 'y' = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n let delta: number, pointBefore: OptionalSplinePoint, pointCurrent: OptionalSplinePoint;\n let pointAfter = getPoint(points, 0);\n\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\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}\n\n/**\n * This function calculates Bézier control points in a similar way than |splineCurve|,\n * but preserves monotonicity of the provided data and ensures no local extremums are added\n * between the dataset discrete points due to the interpolation.\n * See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation\n */\nexport function splineCurveMonotone(points: SplinePoint[], indexAxis: 'x' | 'y' = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n const deltaK: number[] = Array(pointsLen).fill(0);\n const mK: number[] = Array(pointsLen);\n\n // Calculate slopes (deltaK) and initialize tangents (mK)\n let i, pointBefore: OptionalSplinePoint, pointCurrent: OptionalSplinePoint;\n let pointAfter = getPoint(points, 0);\n\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\n if (pointAfter) {\n const slopeDelta = pointAfter[indexAxis] - pointCurrent[indexAxis];\n\n // In the case of two points that appear at the same x pixel, slopeDeltaX is 0\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\n monotoneAdjust(points, deltaK, mK);\n\n monotoneCompute(points, mK, indexAxis);\n}\n\nfunction capControlPoint(pt: number, min: number, max: number) {\n return Math.max(Math.min(pt, max), min);\n}\n\nfunction capBezierPoints(points: SplinePoint[], area: ChartArea) {\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}\n\n/**\n * @private\n */\nexport function _updateBezierControlPoints(\n points: SplinePoint[],\n options,\n area: ChartArea,\n loop: boolean,\n indexAxis: 'x' | 'y'\n) {\n let i: number, ilen: number, point: SplinePoint, controlPoints: ReturnType;\n\n // Only consider points that are drawn in case the spanGaps option is used\n if (options.spanGaps) {\n points = points.filter((pt) => !pt.skip);\n }\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\n if (options.capBezierPoints) {\n capBezierPoints(points, area);\n }\n}\n","import type {ChartArea, Scale} from '../types/index.js';\nimport type Chart from '../core/core.controller.js';\nimport type {ChartEvent} from '../types.js';\nimport {INFINITY} from './helpers.math.js';\n\n/**\n * Note: typedefs are auto-exported, so use a made-up `dom` namespace where\n * necessary to avoid duplicates with `export * from './helpers`; see\n * https://github.com/microsoft/TypeScript/issues/46011\n * @typedef { import('../core/core.controller.js').default } dom.Chart\n * @typedef { import('../../types').ChartEvent } ChartEvent\n */\n\n/**\n * @private\n */\nexport function _isDomSupported(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\n/**\n * @private\n */\nexport function _getParentNode(domNode: HTMLCanvasElement): HTMLCanvasElement {\n let parent = domNode.parentNode;\n if (parent && parent.toString() === '[object ShadowRoot]') {\n parent = (parent as ShadowRoot).host;\n }\n return parent as HTMLCanvasElement;\n}\n\n/**\n * convert max-width/max-height values that may be percentages into a number\n * @private\n */\n\nfunction parseMaxStyle(styleValue: string | number, node: HTMLElement, parentProperty: string) {\n let valueInPixels: number;\n if (typeof styleValue === 'string') {\n valueInPixels = parseInt(styleValue, 10);\n\n if (styleValue.indexOf('%') !== -1) {\n // percentage * size in dimension\n valueInPixels = (valueInPixels / 100) * node.parentNode[parentProperty];\n }\n } else {\n valueInPixels = styleValue;\n }\n\n return valueInPixels;\n}\n\nconst getComputedStyle = (element: HTMLElement): CSSStyleDeclaration =>\n element.ownerDocument.defaultView.getComputedStyle(element, null);\n\nexport function getStyle(el: HTMLElement, property: string): string {\n return getComputedStyle(el).getPropertyValue(property);\n}\n\nconst positions = ['top', 'right', 'bottom', 'left'];\nfunction getPositionedStyle(styles: CSSStyleDeclaration, style: string, suffix?: string): ChartArea {\n const result = {} as ChartArea;\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}\n\nconst useOffsetPos = (x: number, y: number, target: HTMLElement | EventTarget) =>\n (x > 0 || y > 0) && (!target || !(target as HTMLElement).shadowRoot);\n\n/**\n * @param e\n * @param canvas\n * @returns Canvas position\n */\nfunction getCanvasPosition(\n e: Event | TouchEvent | MouseEvent,\n canvas: HTMLCanvasElement\n): {\n x: number;\n y: number;\n box: boolean;\n } {\n const touches = (e as TouchEvent).touches;\n const source = (touches && touches.length ? touches[0] : e) as MouseEvent;\n const {offsetX, offsetY} = source as MouseEvent;\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}\n\n/**\n * Gets an event's x, y coordinates, relative to the chart area\n * @param event\n * @param chart\n * @returns x and y coordinates of the event\n */\n\nexport function getRelativePosition(\n event: Event | ChartEvent | TouchEvent | MouseEvent,\n chart: Chart\n): { x: number; y: number } {\n if ('native' in event) {\n return event;\n }\n\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(event, canvas);\n const xOffset = paddings.left + (box && borders.left);\n const yOffset = paddings.top + (box && borders.top);\n\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}\n\nfunction getContainerSize(canvas: HTMLCanvasElement, width: number, height: number): Partial {\n let maxWidth: number, maxHeight: number;\n\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(); // this is the border box of the container\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}\n\nconst round1 = (v: number) => Math.round(v * 10) / 10;\n\n// eslint-disable-next-line complexity\nexport function getMaximumSize(\n canvas: HTMLCanvasElement,\n bbWidth?: number,\n bbHeight?: number,\n aspectRatio?: number\n): { width: number; height: number } {\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\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 ? 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 // https://github.com/chartjs/Chart.js/issues/4659\n // If the canvas has width, but no height, default to aspectRatio of 2 (canvas default)\n height = round1(width / 2);\n }\n\n const maintainHeight = bbWidth !== undefined || bbHeight !== undefined;\n\n if (maintainHeight && aspectRatio && containerSize.height && height > containerSize.height) {\n height = containerSize.height;\n width = round1(Math.floor(height * aspectRatio));\n }\n\n return {width, height};\n}\n\n/**\n * @param chart\n * @param forceRatio\n * @param forceStyle\n * @returns True if the canvas context size or transformation has changed.\n */\nexport function retinaScale(\n chart: Chart,\n forceRatio: number,\n forceStyle?: boolean\n): boolean | void {\n const pixelRatio = forceRatio || 1;\n const deviceHeight = Math.floor(chart.height * pixelRatio);\n const deviceWidth = Math.floor(chart.width * pixelRatio);\n\n chart.height = Math.floor(chart.height);\n chart.width = Math.floor(chart.width);\n\n const canvas = chart.canvas;\n\n // If no style has been set on the canvas, the render size is used as display size,\n // making the chart visually bigger, so let's enforce it to the \"correct\" values.\n // See https://github.com/chartjs/Chart.js/issues/3575\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\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}\n\n/**\n * Detects support for options object argument in addEventListener.\n * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support\n * @private\n */\nexport const supportsEventListenerOptions = (function() {\n let passiveSupported = false;\n try {\n const options = {\n get passive() { // This function will be called when the browser attempts to access the passive property.\n passiveSupported = true;\n return false;\n }\n } as EventListenerOptions;\n\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (e) {\n // continue regardless of error\n }\n return passiveSupported;\n}());\n\n/**\n * The \"used\" size is the final value of a dimension property after all calculations have\n * been performed. This method uses the computed style of `element` but returns undefined\n * if the computed style is not expressed in pixels. That can happen in some cases where\n * `element` has a size relative to its parent and this last one is not yet displayed,\n * for example because of `display: none` on a parent node.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value\n * @returns Size in pixels or undefined if unknown.\n */\n\nexport function readUsedSize(\n element: HTMLElement,\n property: 'width' | 'height'\n): number | undefined {\n const value = getStyle(element, property);\n const matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n return matches ? +matches[1] : undefined;\n}\n","import type {Point, SplinePoint} from '../types/geometric.js';\n\n/**\n * @private\n */\nexport function _pointInLine(p1: Point, p2: Point, t: number, mode?) { // eslint-disable-line @typescript-eslint/no-unused-vars\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: p1.y + t * (p2.y - p1.y)\n };\n}\n\n/**\n * @private\n */\nexport function _steppedInterpolation(\n p1: Point,\n p2: Point,\n t: number, mode: 'middle' | 'after' | unknown\n) {\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}\n\n/**\n * @private\n */\nexport function _bezierInterpolation(p1: SplinePoint, p2: SplinePoint, t: number, mode?) { // eslint-disable-line @typescript-eslint/no-unused-vars\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","export interface RTLAdapter {\n x(x: number): number;\n setWidth(w: number): void;\n textAlign(align: 'center' | 'left' | 'right'): 'center' | 'left' | 'right';\n xPlus(x: number, value: number): number;\n leftForLtr(x: number, itemWidth: number): number;\n}\n\nconst getRightToLeftAdapter = function(rectX: number, width: number): RTLAdapter {\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};\n\nconst getLeftToRightAdapter = function(): RTLAdapter {\n return {\n x(x) {\n return x;\n },\n setWidth(w) { // eslint-disable-line no-unused-vars\n },\n textAlign(align) {\n return align;\n },\n xPlus(x, value) {\n return x + value;\n },\n leftForLtr(x, _itemWidth) { // eslint-disable-line @typescript-eslint/no-unused-vars\n return x;\n },\n };\n};\n\nexport function getRtlAdapter(rtl: boolean, rectX: number, width: number) {\n return rtl ? getRightToLeftAdapter(rectX, width) : getLeftToRightAdapter();\n}\n\nexport function overrideTextDirection(ctx: CanvasRenderingContext2D, direction: 'ltr' | 'rtl') {\n let style: CSSStyleDeclaration, original: [string, string];\n if (direction === 'ltr' || direction === 'rtl') {\n style = ctx.canvas.style;\n original = [\n style.getPropertyValue('direction'),\n style.getPropertyPriority('direction'),\n ];\n\n style.setProperty('direction', direction, 'important');\n (ctx as { prevTextDirection?: [string, string] }).prevTextDirection = original;\n }\n}\n\nexport function restoreTextDirection(ctx: CanvasRenderingContext2D, original?: [string, string]) {\n if (original !== undefined) {\n delete (ctx as { prevTextDirection?: [string, string] }).prevTextDirection;\n ctx.canvas.style.setProperty('direction', original[0], original[1]);\n }\n}\n","import {_angleBetween, _angleDiff, _isBetween, _normalizeAngle} from './helpers.math.js';\nimport {createContext} from './helpers.options.js';\nimport {isPatternOrGradient} from './helpers.color.js';\n\n/**\n * @typedef { import('../elements/element.line.js').default } LineElement\n * @typedef { import('../elements/element.point.js').default } PointElement\n * @typedef {{start: number, end: number, loop: boolean, style?: any}} Segment\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: _isBetween,\n compare: (a, b) => a - b,\n normalize: x => x\n };\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}\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 // eslint-disable-next-line prefer-const\n let {start, end, loop} = segment;\n let i, ilen;\n\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\n if (end < start) {\n end += count;\n }\n return {start, end, loop, style: segment.style};\n}\n\n/**\n * Returns the sub-segment(s) of a line segment that fall in the given bounds\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} [segment.style] - segment style\n * @param {PointElement[]} points - the points that this segment refers to\n * @param {object} [bounds]\n * @param {string} bounds.property - the property of a `PointElement` we are bounding. `x`, `y` or `angle`.\n * @param {number} bounds.start - start value of the property\n * @param {number} bounds.end - end value of the property\n * @private\n **/\nexport function _boundSegment(segment, points, bounds) {\n if (!bounds) {\n return [segment];\n }\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\n const result = [];\n let inside = false;\n let subStart = null;\n let value, point, prevValue;\n\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\n for (let i = start, prev = start; i <= end; ++i) {\n point = points[i % count];\n\n if (point.skip) {\n continue;\n }\n\n value = normalize(point[property]);\n\n if (value === prevValue) {\n continue;\n }\n\n inside = between(value, startBound, endBound);\n\n if (subStart === null && shouldStart()) {\n subStart = compare(value, startBound) === 0 ? i : prev;\n }\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\n if (subStart !== null) {\n result.push(normalizeSegment({start: subStart, end, loop, count, style}));\n }\n\n return result;\n}\n\n\n/**\n * Returns the segments of the line that are inside given bounds\n * @param {LineElement} line\n * @param {object} [bounds]\n * @param {string} bounds.property - the property we are bounding with. `x`, `y` or `angle`.\n * @param {number} bounds.start - start value of the `property`\n * @param {number} bounds.end - end value of the `property`\n * @private\n */\nexport function _boundSegments(line, bounds) {\n const result = [];\n const segments = line.segments;\n\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}\n\n/**\n * Find start and end index of a line.\n */\nfunction findStartAndEnd(points, count, loop, spanGaps) {\n let start = 0;\n let end = count - 1;\n\n if (loop && !spanGaps) {\n // loop and not spanning gaps, first find a gap to start from\n while (start < count && !points[start].skip) {\n start++;\n }\n }\n\n // find first non skipped point (after the first gap possibly)\n while (start < count && points[start].skip) {\n start++;\n }\n\n // if we looped to count, start needs to be 0\n start %= count;\n\n if (loop) {\n // loop will go past count, if start > 0\n end += start;\n }\n\n while (end > start && points[end % count].skip) {\n end--;\n }\n\n // end could be more than count, normalize\n end %= count;\n\n return {start, end};\n}\n\n/**\n * Compute solid segments from Points, when spanGaps === false\n * @param {PointElement[]} points - the points\n * @param {number} start - start index\n * @param {number} max - max index (can go past count on a loop)\n * @param {boolean} loop - boolean indicating that this would be a loop if no gaps are found\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\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 // @ts-ignore\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\n if (last !== null) {\n result.push({start: start % count, end: last % count, loop});\n }\n\n return result;\n}\n\n/**\n * Compute the continuous segments that define the whole line\n * There can be skipped points within a segment, if spanGaps is true.\n * @param {LineElement} line\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n * @private\n */\nexport function _computeSegments(line, segmentOptions) {\n const points = line.points;\n const spanGaps = line.options.spanGaps;\n const count = points.length;\n\n if (!count) {\n return [];\n }\n\n const loop = !!line._loop;\n const {start, end} = findStartAndEnd(points, count, loop, spanGaps);\n\n if (spanGaps === true) {\n return splitByStyles(line, [{start, end, loop}], points, segmentOptions);\n }\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}\n\n/**\n * @param {Segment[]} segments\n * @param {PointElement[]} points\n * @param {object} [segmentOptions]\n * @return {Segment[]}\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}\n\n/**\n * @param {LineElement} line\n * @param {Segment[]} segments\n * @param {PointElement[]} points\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n */\nfunction doSplitByStyles(line, segments, points, segmentOptions) {\n const chartContext = line._chart.getContext();\n const baseStyle = readStyle(line.options);\n const {_datasetIndex: datasetIndex, options: {spanGaps}} = line;\n const count = points.length;\n const result = [];\n let prevStyle = baseStyle;\n let start = segments[0].start;\n let i = start;\n\n function addStyle(s, e, l, st) {\n const dir = spanGaps ? -1 : 1;\n if (s === e) {\n return;\n }\n // Style can not start/end on a skipped point, adjust indices accordingly\n s += count;\n while (points[s % count].skip) {\n s -= dir;\n }\n while (points[e % count].skip) {\n e += dir;\n }\n if (s % count !== e % count) {\n result.push({start: s % count, end: e % count, loop: l, style: st});\n prevStyle = st;\n start = e % count;\n }\n }\n\n for (const segment of segments) {\n start = spanGaps ? start : segment.start;\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(createContext(chartContext, {\n type: 'segment',\n p0: prev,\n p1: pt,\n p0DataIndex: (i - 1) % count,\n p1DataIndex: i % count,\n datasetIndex\n })));\n if (styleChanged(style, prevStyle)) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n prev = pt;\n prevStyle = style;\n }\n if (start < i - 1) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n }\n\n return result;\n}\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}\n\nfunction styleChanged(style, prevStyle) {\n if (!prevStyle) {\n return false;\n }\n const cache = [];\n const replacer = function(key, value) {\n if (!isPatternOrGradient(value)) {\n return value;\n }\n if (!cache.includes(value)) {\n cache.push(value);\n }\n return cache.indexOf(value);\n };\n return JSON.stringify(style, replacer) !== JSON.stringify(prevStyle, replacer);\n}\n","/*!\n* chartjs-plugin-annotation v3.0.1\n* https://www.chartjs.org/chartjs-plugin-annotation/index\n * (c) 2023 chartjs-plugin-annotation Contributors\n * Released under the MIT License\n */\nimport { Element, defaults, Animations, Chart } from 'chart.js';\nimport { distanceBetweenPoints, defined, isFunction, callback, isObject, valueOrDefault, toRadians, isArray, toFont, addRoundedRectPath, toTRBLCorners, QUARTER_PI, PI, HALF_PI, TWO_THIRDS_PI, TAU, isNumber, RAD_PER_DEG, toPadding, isFinite, toDegrees, clipArea, unclipArea } from 'chart.js/helpers';\n\n/**\n * @typedef { import(\"chart.js\").ChartEvent } ChartEvent\n * @typedef { import('../../types/element').AnnotationElement } AnnotationElement\n */\n\nconst interaction = {\n modes: {\n /**\n * Point mode returns all elements that hit test based on the event position\n * @param {Object} state - the state of the plugin\n * @param {ChartEvent} event - the event we are find things at\n * @return {AnnotationElement[]} - elements that are found\n */\n point(state, event) {\n return filterElements(state, event, {intersect: true});\n },\n\n /**\n * Nearest mode returns the element closest to the event position\n * @param {Object} state - the state of the plugin\n * @param {ChartEvent} event - the event we are find things at\n * @param {Object} options - interaction options to use\n * @return {AnnotationElement[]} - elements that are found (only 1 element)\n */\n nearest(state, event, options) {\n return getNearestItem(state, event, options);\n },\n /**\n * x mode returns the elements that hit-test at the current x coordinate\n * @param {Object} state - the state of the plugin\n * @param {ChartEvent} event - the event we are find things at\n * @param {Object} options - interaction options to use\n * @return {AnnotationElement[]} - elements that are found\n */\n x(state, event, options) {\n return filterElements(state, event, {intersect: options.intersect, axis: 'x'});\n },\n\n /**\n * y mode returns the elements that hit-test at the current y coordinate\n * @param {Object} state - the state of the plugin\n * @param {ChartEvent} event - the event we are find things at\n * @param {Object} options - interaction options to use\n * @return {AnnotationElement[]} - elements that are found\n */\n y(state, event, options) {\n return filterElements(state, event, {intersect: options.intersect, axis: 'y'});\n }\n }\n};\n\n/**\n * Returns all elements that hit test based on the event position\n * @param {Object} state - the state of the plugin\n * @param {ChartEvent} event - the event we are find things at\n * @param {Object} options - interaction options to use\n * @return {AnnotationElement[]} - elements that are found\n */\nfunction getElements(state, event, options) {\n const mode = interaction.modes[options.mode] || interaction.modes.nearest;\n return mode(state, event, options);\n}\n\nfunction inRangeByAxis(element, event, axis) {\n if (axis !== 'x' && axis !== 'y') {\n return element.inRange(event.x, event.y, 'x', true) || element.inRange(event.x, event.y, 'y', true);\n }\n return element.inRange(event.x, event.y, axis, true);\n}\n\nfunction getPointByAxis(event, center, axis) {\n if (axis === 'x') {\n return {x: event.x, y: center.y};\n } else if (axis === 'y') {\n return {x: center.x, y: event.y};\n }\n return center;\n}\n\nfunction filterElements(state, event, options) {\n return state.visibleElements.filter((element) => options.intersect ? element.inRange(event.x, event.y) : inRangeByAxis(element, event, options.axis));\n}\n\nfunction getNearestItem(state, event, options) {\n let minDistance = Number.POSITIVE_INFINITY;\n\n return filterElements(state, event, options)\n .reduce((nearestItems, element) => {\n const center = element.getCenterPoint();\n const evenPoint = getPointByAxis(event, center, options.axis);\n const distance = distanceBetweenPoints(event, evenPoint);\n if (distance < minDistance) {\n nearestItems = [element];\n minDistance = distance;\n } else if (distance === minDistance) {\n // Can have multiple items at the same distance in which case we sort by size\n nearestItems.push(element);\n }\n\n return nearestItems;\n }, [])\n .sort((a, b) => a._index - b._index)\n .slice(0, 1); // return only the top item;\n}\n\nconst isOlderPart = (act, req) => req > act || (act.length > req.length && act.slice(0, req.length) === req);\n\n/**\n * @typedef { import('chart.js').Point } Point\n * @typedef { import('chart.js').InteractionAxis } InteractionAxis\n * @typedef { import('../../types/element').AnnotationElement } AnnotationElement\n */\n\nconst EPSILON = 0.001;\nconst clamp = (x, from, to) => Math.min(to, Math.max(from, x));\n\n/**\n * @param {Object} obj\n * @param {number} from\n * @param {number} to\n * @returns {Object}\n */\nfunction clampAll(obj, from, to) {\n for (const key of Object.keys(obj)) {\n obj[key] = clamp(obj[key], from, to);\n }\n return obj;\n}\n\n/**\n * @param {Point} point\n * @param {Point} center\n * @param {number} radius\n * @param {number} borderWidth\n * @returns {boolean}\n */\nfunction inPointRange(point, center, radius, borderWidth) {\n if (!point || !center || radius <= 0) {\n return false;\n }\n const hBorderWidth = borderWidth / 2;\n return (Math.pow(point.x - center.x, 2) + Math.pow(point.y - center.y, 2)) <= Math.pow(radius + hBorderWidth, 2);\n}\n\n/**\n * @param {Point} point\n * @param {{x: number, y: number, x2: number, y2: number}} rect\n * @param {InteractionAxis} axis\n * @param {number} borderWidth\n * @returns {boolean}\n */\nfunction inBoxRange(point, {x, y, x2, y2}, axis, borderWidth) {\n const hBorderWidth = borderWidth / 2;\n const inRangeX = point.x >= x - hBorderWidth - EPSILON && point.x <= x2 + hBorderWidth + EPSILON;\n const inRangeY = point.y >= y - hBorderWidth - EPSILON && point.y <= y2 + hBorderWidth + EPSILON;\n if (axis === 'x') {\n return inRangeX;\n } else if (axis === 'y') {\n return inRangeY;\n }\n return inRangeX && inRangeY;\n}\n\n/**\n * @param {AnnotationElement} element\n * @param {boolean} useFinalPosition\n * @returns {Point}\n */\nfunction getElementCenterPoint(element, useFinalPosition) {\n const {centerX, centerY} = element.getProps(['centerX', 'centerY'], useFinalPosition);\n return {x: centerX, y: centerY};\n}\n\n/**\n * @param {string} pkg\n * @param {string} min\n * @param {string} ver\n * @param {boolean} [strict=true]\n * @returns {boolean}\n */\nfunction requireVersion(pkg, min, ver, strict = true) {\n const parts = ver.split('.');\n let i = 0;\n for (const req of min.split('.')) {\n const act = parts[i++];\n if (parseInt(req, 10) < parseInt(act, 10)) {\n break;\n }\n if (isOlderPart(act, req)) {\n if (strict) {\n throw new Error(`${pkg} v${ver} is not supported. v${min} or newer is required.`);\n } else {\n return false;\n }\n }\n }\n return true;\n}\n\nconst isPercentString = (s) => typeof s === 'string' && s.endsWith('%');\nconst toPercent = (s) => parseFloat(s) / 100;\nconst toPositivePercent = (s) => clamp(toPercent(s), 0, 1);\n\nconst boxAppering = (x, y) => ({x, y, x2: x, y2: y, width: 0, height: 0});\nconst defaultInitAnimation = {\n box: (properties) => boxAppering(properties.centerX, properties.centerY),\n ellipse: (properties) => ({centerX: properties.centerX, centerY: properties.centerX, radius: 0, width: 0, height: 0}),\n label: (properties) => boxAppering(properties.centerX, properties.centerY),\n line: (properties) => boxAppering(properties.x, properties.y),\n point: (properties) => ({centerX: properties.centerX, centerY: properties.centerY, radius: 0, width: 0, height: 0}),\n polygon: (properties) => boxAppering(properties.centerX, properties.centerY)\n};\n\n/**\n * @typedef { import(\"chart.js\").Chart } Chart\n * @typedef { import('../../types/element').AnnotationBoxModel } AnnotationBoxModel\n * @typedef { import('../../types/element').AnnotationElement } AnnotationElement\n * @typedef { import('../../types/options').AnnotationPointCoordinates } AnnotationPointCoordinates\n * @typedef { import('../../types/label').CoreLabelOptions } CoreLabelOptions\n * @typedef { import('../../types/label').LabelPositionObject } LabelPositionObject\n */\n\n/**\n * @param {number} size\n * @param {number|string} position\n * @returns {number}\n */\nfunction getRelativePosition(size, position) {\n if (position === 'start') {\n return 0;\n }\n if (position === 'end') {\n return size;\n }\n if (isPercentString(position)) {\n return toPositivePercent(position) * size;\n }\n return size / 2;\n}\n\n/**\n * @param {number} size\n * @param {number|string} value\n * @param {boolean} [positivePercent=true]\n * @returns {number}\n */\nfunction getSize(size, value, positivePercent = true) {\n if (typeof value === 'number') {\n return value;\n } else if (isPercentString(value)) {\n return (positivePercent ? toPositivePercent(value) : toPercent(value)) * size;\n }\n return size;\n}\n\n/**\n * @param {{x: number, width: number}} size\n * @param {CoreLabelOptions} options\n * @returns {number}\n */\nfunction calculateTextAlignment(size, options) {\n const {x, width} = size;\n const textAlign = options.textAlign;\n if (textAlign === 'center') {\n return x + width / 2;\n } else if (textAlign === 'end' || textAlign === 'right') {\n return x + width;\n }\n return x;\n}\n\n/**\n * @param {{x: number|string, y: number|string}|string|number} value\n * @param {string|number} defaultValue\n * @returns {{x: number|string, y: number|string}}\n */\nfunction toPosition(value, defaultValue = 'center') {\n if (isObject(value)) {\n return {\n x: valueOrDefault(value.x, defaultValue),\n y: valueOrDefault(value.y, defaultValue),\n };\n }\n value = valueOrDefault(value, defaultValue);\n return {\n x: value,\n y: value\n };\n}\n\n/**\n * @param {AnnotationPointCoordinates} options\n * @returns {boolean}\n */\nfunction isBoundToPoint(options) {\n return options && (defined(options.xValue) || defined(options.yValue));\n}\n\n/**\n * @param {Chart} chart\n * @param {AnnotationBoxModel} properties\n * @param {CoreAnnotationOptions} options\n * @returns {AnnotationElement}\n */\nfunction initAnimationProperties(chart, properties, options) {\n const initAnim = options.init;\n if (!initAnim) {\n return;\n } else if (initAnim === true) {\n return applyDefault(properties, options);\n }\n return execCallback(chart, properties, options);\n}\n\n/**\n * @param {Object} options\n * @param {Array} hooks\n * @param {Object} hooksContainer\n * @returns {boolean}\n */\nfunction loadHooks(options, hooks, hooksContainer) {\n let activated = false;\n hooks.forEach(hook => {\n if (isFunction(options[hook])) {\n activated = true;\n hooksContainer[hook] = options[hook];\n } else if (defined(hooksContainer[hook])) {\n delete hooksContainer[hook];\n }\n });\n return activated;\n}\n\nfunction applyDefault(properties, options) {\n const type = options.type || 'line';\n return defaultInitAnimation[type](properties);\n}\n\nfunction execCallback(chart, properties, options) {\n const result = callback(options.init, [{chart, properties, options}]);\n if (result === true) {\n return applyDefault(properties, options);\n } else if (isObject(result)) {\n return result;\n }\n}\n\nconst widthCache = new Map();\nconst notRadius = (radius) => isNaN(radius) || radius <= 0;\nconst fontsKey = (fonts) => fonts.reduce(function(prev, item) {\n prev += item.string;\n return prev;\n}, '');\n\n/**\n * @typedef { import('chart.js').Point } Point\n * @typedef { import('../../types/label').CoreLabelOptions } CoreLabelOptions\n * @typedef { import('../../types/options').PointAnnotationOptions } PointAnnotationOptions\n */\n\n/**\n * Determine if content is an image or a canvas.\n * @param {*} content\n * @returns boolean|undefined\n * @todo move this function to chart.js helpers\n */\nfunction isImageOrCanvas(content) {\n if (content && typeof content === 'object') {\n const type = content.toString();\n return (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]');\n }\n}\n\n/**\n * Set the translation on the canvas if the rotation must be applied.\n * @param {CanvasRenderingContext2D} ctx - chart canvas context\n * @param {Point} point - the point of translation\n * @param {number} rotation - rotation (in degrees) to apply\n */\nfunction translate(ctx, {x, y}, rotation) {\n if (rotation) {\n ctx.translate(x, y);\n ctx.rotate(toRadians(rotation));\n ctx.translate(-x, -y);\n }\n}\n\n/**\n * @param {CanvasRenderingContext2D} ctx\n * @param {Object} options\n * @returns {boolean|undefined}\n */\nfunction setBorderStyle(ctx, options) {\n if (options && options.borderWidth) {\n ctx.lineCap = options.borderCapStyle;\n ctx.setLineDash(options.borderDash);\n ctx.lineDashOffset = options.borderDashOffset;\n ctx.lineJoin = options.borderJoinStyle;\n ctx.lineWidth = options.borderWidth;\n ctx.strokeStyle = options.borderColor;\n return true;\n }\n}\n\n/**\n * @param {CanvasRenderingContext2D} ctx\n * @param {Object} options\n */\nfunction setShadowStyle(ctx, options) {\n ctx.shadowColor = options.backgroundShadowColor;\n ctx.shadowBlur = options.shadowBlur;\n ctx.shadowOffsetX = options.shadowOffsetX;\n ctx.shadowOffsetY = options.shadowOffsetY;\n}\n\n/**\n * @param {CanvasRenderingContext2D} ctx\n * @param {CoreLabelOptions} options\n * @returns {{width: number, height: number}}\n */\nfunction measureLabelSize(ctx, options) {\n const content = options.content;\n if (isImageOrCanvas(content)) {\n return {\n width: getSize(content.width, options.width),\n height: getSize(content.height, options.height)\n };\n }\n const optFont = options.font;\n const fonts = isArray(optFont) ? optFont.map(f => toFont(f)) : [toFont(optFont)];\n const strokeWidth = options.textStrokeWidth;\n const lines = isArray(content) ? content : [content];\n const mapKey = lines.join() + fontsKey(fonts) + strokeWidth + (ctx._measureText ? '-spriting' : '');\n if (!widthCache.has(mapKey)) {\n widthCache.set(mapKey, calculateLabelSize(ctx, lines, fonts, strokeWidth));\n }\n return widthCache.get(mapKey);\n}\n\n/**\n * @param {CanvasRenderingContext2D} ctx\n * @param {{x: number, y: number, width: number, height: number}} rect\n * @param {Object} options\n */\nfunction drawBox(ctx, rect, options) {\n const {x, y, width, height} = rect;\n ctx.save();\n setShadowStyle(ctx, options);\n const stroke = setBorderStyle(ctx, options);\n ctx.fillStyle = options.backgroundColor;\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x, y, w: width, h: height,\n radius: clampAll(toTRBLCorners(options.borderRadius), 0, Math.min(width, height) / 2)\n });\n ctx.closePath();\n ctx.fill();\n if (stroke) {\n ctx.shadowColor = options.borderShadowColor;\n ctx.stroke();\n }\n ctx.restore();\n}\n\n/**\n * @param {CanvasRenderingContext2D} ctx\n * @param {{x: number, y: number, width: number, height: number}} rect\n * @param {CoreLabelOptions} options\n */\nfunction drawLabel(ctx, rect, options) {\n const content = options.content;\n if (isImageOrCanvas(content)) {\n ctx.save();\n ctx.globalAlpha = getOpacity(options.opacity, content.style.opacity);\n ctx.drawImage(content, rect.x, rect.y, rect.width, rect.height);\n ctx.restore();\n return;\n }\n const labels = isArray(content) ? content : [content];\n const optFont = options.font;\n const fonts = isArray(optFont) ? optFont.map(f => toFont(f)) : [toFont(optFont)];\n const optColor = options.color;\n const colors = isArray(optColor) ? optColor : [optColor];\n const x = calculateTextAlignment(rect, options);\n const y = rect.y + options.textStrokeWidth / 2;\n ctx.save();\n ctx.textBaseline = 'middle';\n ctx.textAlign = options.textAlign;\n if (setTextStrokeStyle(ctx, options)) {\n applyLabelDecoration(ctx, {x, y}, labels, fonts);\n }\n applyLabelContent(ctx, {x, y}, labels, {fonts, colors});\n ctx.restore();\n}\n\nfunction setTextStrokeStyle(ctx, options) {\n if (options.textStrokeWidth > 0) {\n // https://stackoverflow.com/questions/13627111/drawing-text-with-an-outer-stroke-with-html5s-canvas\n ctx.lineJoin = 'round';\n ctx.miterLimit = 2;\n ctx.lineWidth = options.textStrokeWidth;\n ctx.strokeStyle = options.textStrokeColor;\n return true;\n }\n}\n\n/**\n * @param {CanvasRenderingContext2D} ctx\n * @param {{radius: number, options: PointAnnotationOptions}} element\n * @param {number} x\n * @param {number} y\n */\nfunction drawPoint(ctx, element, x, y) {\n const {radius, options} = element;\n const style = options.pointStyle;\n const rotation = options.rotation;\n let rad = (rotation || 0) * RAD_PER_DEG;\n\n if (isImageOrCanvas(style)) {\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 if (notRadius(radius)) {\n return;\n }\n drawPointStyle(ctx, {x, y, radius, rotation, style, rad});\n}\n\nfunction drawPointStyle(ctx, {x, y, radius, rotation, style, rad}) {\n let xOffset, yOffset, size, cornerRadius;\n ctx.beginPath();\n\n switch (style) {\n // Default includes circle\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 // NOTE: the rounded rect implementation changed to use `arc` instead of\n // `quadraticCurveTo` since it generates better results when rect is\n // almost a circle. 0.516 (instead of 0.5) produces results with visually\n // closer proportion to the previous impl and it is inscribed in the\n // circle with `radius`. For more details, see the following PRs:\n // https://github.com/chartjs/Chart.js/issues/5597\n // https://github.com/chartjs/Chart.js/issues/5858\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 /* falls through */\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 /* falls through */\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\n ctx.fill();\n}\n\nfunction calculateLabelSize(ctx, lines, fonts, strokeWidth) {\n ctx.save();\n const count = lines.length;\n let width = 0;\n let height = strokeWidth;\n for (let i = 0; i < count; i++) {\n const font = fonts[Math.min(i, fonts.length - 1)];\n ctx.font = font.string;\n const text = lines[i];\n width = Math.max(width, ctx.measureText(text).width + strokeWidth);\n height += font.lineHeight;\n }\n ctx.restore();\n return {width, height};\n}\n\nfunction applyLabelDecoration(ctx, {x, y}, labels, fonts) {\n ctx.beginPath();\n let lhs = 0;\n labels.forEach(function(l, i) {\n const f = fonts[Math.min(i, fonts.length - 1)];\n const lh = f.lineHeight;\n ctx.font = f.string;\n ctx.strokeText(l, x, y + lh / 2 + lhs);\n lhs += lh;\n });\n ctx.stroke();\n}\n\nfunction applyLabelContent(ctx, {x, y}, labels, {fonts, colors}) {\n let lhs = 0;\n labels.forEach(function(l, i) {\n const c = colors[Math.min(i, colors.length - 1)];\n const f = fonts[Math.min(i, fonts.length - 1)];\n const lh = f.lineHeight;\n ctx.beginPath();\n ctx.font = f.string;\n ctx.fillStyle = c;\n ctx.fillText(l, x, y + lh / 2 + lhs);\n lhs += lh;\n ctx.fill();\n });\n}\n\nfunction getOpacity(value, elementValue) {\n const opacity = isNumber(value) ? value : elementValue;\n return isNumber(opacity) ? clamp(opacity, 0, 1) : 1;\n}\n\nconst limitedLineScale = {\n xScaleID: {min: 'xMin', max: 'xMax', start: 'left', end: 'right', startProp: 'x', endProp: 'x2'},\n yScaleID: {min: 'yMin', max: 'yMax', start: 'bottom', end: 'top', startProp: 'y', endProp: 'y2'}\n};\n\n/**\n * @typedef { import(\"chart.js\").Chart } Chart\n * @typedef { import(\"chart.js\").Scale } Scale\n * @typedef { import(\"chart.js\").Point } Point\n * @typedef { import('../../types/element').AnnotationBoxModel } AnnotationBoxModel\n * @typedef { import('../../types/options').CoreAnnotationOptions } CoreAnnotationOptions\n * @typedef { import('../../types/options').LineAnnotationOptions } LineAnnotationOptions\n * @typedef { import('../../types/options').PointAnnotationOptions } PointAnnotationOptions\n * @typedef { import('../../types/options').PolygonAnnotationOptions } PolygonAnnotationOptions\n */\n\n/**\n * @param {Scale} scale\n * @param {number|string} value\n * @param {number} fallback\n * @returns {number}\n */\nfunction scaleValue(scale, value, fallback) {\n value = typeof value === 'number' ? value : scale.parse(value);\n return isFinite(value) ? scale.getPixelForValue(value) : fallback;\n}\n\n/**\n * Search the scale defined in chartjs by the axis related to the annotation options key.\n * @param {{ [key: string]: Scale }} scales\n * @param {CoreAnnotationOptions} options\n * @param {string} key\n * @returns {string}\n */\nfunction retrieveScaleID(scales, options, key) {\n const scaleID = options[key];\n if (scaleID || key === 'scaleID') {\n return scaleID;\n }\n const axis = key.charAt(0);\n const axes = Object.values(scales).filter((scale) => scale.axis && scale.axis === axis);\n if (axes.length) {\n return axes[0].id;\n }\n return axis;\n}\n\n/**\n * @param {Scale} scale\n * @param {{min: number, max: number, start: number, end: number}} options\n * @returns {{start: number, end: number}|undefined}\n */\nfunction getDimensionByScale(scale, options) {\n if (scale) {\n const reverse = scale.options.reverse;\n const start = scaleValue(scale, options.min, reverse ? options.end : options.start);\n const end = scaleValue(scale, options.max, reverse ? options.start : options.end);\n return {\n start,\n end\n };\n }\n}\n\n/**\n * @param {Chart} chart\n * @param {CoreAnnotationOptions} options\n * @returns {Point}\n */\nfunction getChartPoint(chart, options) {\n const {chartArea, scales} = chart;\n const xScale = scales[retrieveScaleID(scales, options, 'xScaleID')];\n const yScale = scales[retrieveScaleID(scales, options, 'yScaleID')];\n let x = chartArea.width / 2;\n let y = chartArea.height / 2;\n\n if (xScale) {\n x = scaleValue(xScale, options.xValue, xScale.left + xScale.width / 2);\n }\n\n if (yScale) {\n y = scaleValue(yScale, options.yValue, yScale.top + yScale.height / 2);\n }\n return {x, y};\n}\n\n/**\n * @param {Chart} chart\n * @param {CoreAnnotationOptions} options\n * @returns {AnnotationBoxModel}\n */\nfunction resolveBoxProperties(chart, options) {\n const scales = chart.scales;\n const xScale = scales[retrieveScaleID(scales, options, 'xScaleID')];\n const yScale = scales[retrieveScaleID(scales, options, 'yScaleID')];\n\n if (!xScale && !yScale) {\n return {};\n }\n\n let {left: x, right: x2} = xScale || chart.chartArea;\n let {top: y, bottom: y2} = yScale || chart.chartArea;\n const xDim = getChartDimensionByScale(xScale, {min: options.xMin, max: options.xMax, start: x, end: x2});\n x = xDim.start;\n x2 = xDim.end;\n const yDim = getChartDimensionByScale(yScale, {min: options.yMin, max: options.yMax, start: y2, end: y});\n y = yDim.start;\n y2 = yDim.end;\n\n return {\n x,\n y,\n x2,\n y2,\n width: x2 - x,\n height: y2 - y,\n centerX: x + (x2 - x) / 2,\n centerY: y + (y2 - y) / 2\n };\n}\n\n/**\n * @param {Chart} chart\n * @param {PointAnnotationOptions|PolygonAnnotationOptions} options\n * @returns {AnnotationBoxModel}\n */\nfunction resolvePointProperties(chart, options) {\n if (!isBoundToPoint(options)) {\n const box = resolveBoxProperties(chart, options);\n let radius = options.radius;\n if (!radius || isNaN(radius)) {\n radius = Math.min(box.width, box.height) / 2;\n options.radius = radius;\n }\n const size = radius * 2;\n const adjustCenterX = box.centerX + options.xAdjust;\n const adjustCenterY = box.centerY + options.yAdjust;\n return {\n x: adjustCenterX - radius,\n y: adjustCenterY - radius,\n x2: adjustCenterX + radius,\n y2: adjustCenterY + radius,\n centerX: adjustCenterX,\n centerY: adjustCenterY,\n width: size,\n height: size,\n radius\n };\n }\n return getChartCircle(chart, options);\n}\n/**\n * @param {Chart} chart\n * @param {LineAnnotationOptions} options\n * @returns {AnnotationBoxModel}\n */\nfunction resolveLineProperties(chart, options) {\n const {scales, chartArea} = chart;\n const scale = scales[options.scaleID];\n const area = {x: chartArea.left, y: chartArea.top, x2: chartArea.right, y2: chartArea.bottom};\n\n if (scale) {\n resolveFullLineProperties(scale, area, options);\n } else {\n resolveLimitedLineProperties(scales, area, options);\n }\n return area;\n}\n\n/**\n * @param {Chart} chart\n * @param {CoreAnnotationOptions} options\n * @param {boolean} [centerBased=false]\n * @returns {AnnotationBoxModel}\n */\nfunction resolveBoxAndLabelProperties(chart, options) {\n const properties = resolveBoxProperties(chart, options);\n properties.initProperties = initAnimationProperties(chart, properties, options);\n properties.elements = [{\n type: 'label',\n optionScope: 'label',\n properties: resolveLabelElementProperties$1(chart, properties, options),\n initProperties: properties.initProperties\n }];\n return properties;\n}\n\nfunction getChartCircle(chart, options) {\n const point = getChartPoint(chart, options);\n const size = options.radius * 2;\n return {\n x: point.x - options.radius + options.xAdjust,\n y: point.y - options.radius + options.yAdjust,\n x2: point.x + options.radius + options.xAdjust,\n y2: point.y + options.radius + options.yAdjust,\n centerX: point.x + options.xAdjust,\n centerY: point.y + options.yAdjust,\n radius: options.radius,\n width: size,\n height: size\n };\n}\n\nfunction getChartDimensionByScale(scale, options) {\n const result = getDimensionByScale(scale, options) || options;\n return {\n start: Math.min(result.start, result.end),\n end: Math.max(result.start, result.end)\n };\n}\n\nfunction resolveFullLineProperties(scale, area, options) {\n const min = scaleValue(scale, options.value, NaN);\n const max = scaleValue(scale, options.endValue, min);\n if (scale.isHorizontal()) {\n area.x = min;\n area.x2 = max;\n } else {\n area.y = min;\n area.y2 = max;\n }\n}\n\nfunction resolveLimitedLineProperties(scales, area, options) {\n for (const scaleId of Object.keys(limitedLineScale)) {\n const scale = scales[retrieveScaleID(scales, options, scaleId)];\n if (scale) {\n const {min, max, start, end, startProp, endProp} = limitedLineScale[scaleId];\n const dim = getDimensionByScale(scale, {min: options[min], max: options[max], start: scale[start], end: scale[end]});\n area[startProp] = dim.start;\n area[endProp] = dim.end;\n }\n }\n}\n\nfunction calculateX({properties, options}, labelSize, position, padding) {\n const {x: start, x2: end, width: size} = properties;\n return calculatePosition$1({start, end, size, borderWidth: options.borderWidth}, {\n position: position.x,\n padding: {start: padding.left, end: padding.right},\n adjust: options.label.xAdjust,\n size: labelSize.width\n });\n}\n\nfunction calculateY({properties, options}, labelSize, position, padding) {\n const {y: start, y2: end, height: size} = properties;\n return calculatePosition$1({start, end, size, borderWidth: options.borderWidth}, {\n position: position.y,\n padding: {start: padding.top, end: padding.bottom},\n adjust: options.label.yAdjust,\n size: labelSize.height\n });\n}\n\nfunction calculatePosition$1(boxOpts, labelOpts) {\n const {start, end, borderWidth} = boxOpts;\n const {position, padding: {start: padStart, end: padEnd}, adjust} = labelOpts;\n const availableSize = end - borderWidth - start - padStart - padEnd - labelOpts.size;\n return start + borderWidth / 2 + adjust + getRelativePosition(availableSize, position);\n}\n\nfunction resolveLabelElementProperties$1(chart, properties, options) {\n const label = options.label;\n label.backgroundColor = 'transparent';\n label.callout.display = false;\n const position = toPosition(label.position);\n const padding = toPadding(label.padding);\n const labelSize = measureLabelSize(chart.ctx, label);\n const x = calculateX({properties, options}, labelSize, position, padding);\n const y = calculateY({properties, options}, labelSize, position, padding);\n const width = labelSize.width + padding.width;\n const height = labelSize.height + padding.height;\n return {\n x,\n y,\n x2: x + width,\n y2: y + height,\n width,\n height,\n centerX: x + width / 2,\n centerY: y + height / 2,\n rotation: label.rotation\n };\n\n}\n\n/**\n * @typedef {import('chart.js').Point} Point\n */\n\n/**\n * Rotate a `point` relative to `center` point by `angle`\n * @param {Point} point - the point to rotate\n * @param {Point} center - center point for rotation\n * @param {number} angle - angle for rotation, in radians\n * @returns {Point} rotated point\n */\nfunction rotated(point, center, angle) {\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n const cx = center.x;\n const 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\nconst moveHooks = ['enter', 'leave'];\n\n/**\n * @typedef { import(\"chart.js\").Chart } Chart\n * @typedef { import('../../types/options').AnnotationPluginOptions } AnnotationPluginOptions\n */\n\nconst eventHooks = moveHooks.concat('click');\n\n/**\n * @param {Chart} chart\n * @param {Object} state\n * @param {AnnotationPluginOptions} options\n */\nfunction updateListeners(chart, state, options) {\n state.listened = loadHooks(options, eventHooks, state.listeners);\n state.moveListened = false;\n state._getElements = getElements; // for testing\n\n moveHooks.forEach(hook => {\n if (isFunction(options[hook])) {\n state.moveListened = true;\n }\n });\n\n if (!state.listened || !state.moveListened) {\n state.annotations.forEach(scope => {\n if (!state.listened && isFunction(scope.click)) {\n state.listened = true;\n }\n if (!state.moveListened) {\n moveHooks.forEach(hook => {\n if (isFunction(scope[hook])) {\n state.listened = true;\n state.moveListened = true;\n }\n });\n }\n });\n }\n}\n\n/**\n * @param {Object} state\n * @param {ChartEvent} event\n * @param {AnnotationPluginOptions} options\n * @return {boolean|undefined}\n */\nfunction handleEvent(state, event, options) {\n if (state.listened) {\n switch (event.type) {\n case 'mousemove':\n case 'mouseout':\n return handleMoveEvents(state, event, options);\n case 'click':\n return handleClickEvents(state, event, options);\n }\n }\n}\n\nfunction handleMoveEvents(state, event, options) {\n if (!state.moveListened) {\n return;\n }\n\n let elements;\n\n if (event.type === 'mousemove') {\n elements = getElements(state, event, options.interaction);\n } else {\n elements = [];\n }\n\n const previous = state.hovered;\n state.hovered = elements;\n\n const context = {state, event};\n let changed = dispatchMoveEvents(context, 'leave', previous, elements);\n return dispatchMoveEvents(context, 'enter', elements, previous) || changed;\n}\n\nfunction dispatchMoveEvents({state, event}, hook, elements, checkElements) {\n let changed;\n for (const element of elements) {\n if (checkElements.indexOf(element) < 0) {\n changed = dispatchEvent(element.options[hook] || state.listeners[hook], element, event) || changed;\n }\n }\n return changed;\n}\n\nfunction handleClickEvents(state, event, options) {\n const listeners = state.listeners;\n const elements = getElements(state, event, options.interaction);\n let changed;\n for (const element of elements) {\n changed = dispatchEvent(element.options.click || listeners.click, element, event) || changed;\n }\n return changed;\n}\n\nfunction dispatchEvent(handler, element, event) {\n return callback(handler, [element.$context, event]) === true;\n}\n\n/**\n * @typedef { import(\"chart.js\").Chart } Chart\n * @typedef { import('../../types/options').AnnotationPluginOptions } AnnotationPluginOptions\n * @typedef { import('../../types/element').AnnotationElement } AnnotationElement\n */\n\nconst elementHooks = ['afterDraw', 'beforeDraw'];\n\n/**\n * @param {Chart} chart\n * @param {Object} state\n * @param {AnnotationPluginOptions} options\n */\nfunction updateHooks(chart, state, options) {\n const visibleElements = state.visibleElements;\n state.hooked = loadHooks(options, elementHooks, state.hooks);\n\n if (!state.hooked) {\n visibleElements.forEach(scope => {\n if (!state.hooked) {\n elementHooks.forEach(hook => {\n if (isFunction(scope.options[hook])) {\n state.hooked = true;\n }\n });\n }\n });\n }\n}\n\n/**\n * @param {Object} state\n * @param {AnnotationElement} element\n * @param {string} hook\n */\nfunction invokeHook(state, element, hook) {\n if (state.hooked) {\n const callbackHook = element.options[hook] || state.hooks[hook];\n return callback(callbackHook, [element.$context]);\n }\n}\n\n/**\n * @typedef { import(\"chart.js\").Chart } Chart\n * @typedef { import(\"chart.js\").Scale } Scale\n * @typedef { import('../../types/options').CoreAnnotationOptions } CoreAnnotationOptions\n */\n\n/**\n * @param {Chart} chart\n * @param {Scale} scale\n * @param {CoreAnnotationOptions[]} annotations\n */\nfunction adjustScaleRange(chart, scale, annotations) {\n const range = getScaleLimits(chart.scales, scale, annotations);\n let changed = changeScaleLimit(scale, range, 'min', 'suggestedMin');\n changed = changeScaleLimit(scale, range, 'max', 'suggestedMax') || changed;\n if (changed && isFunction(scale.handleTickRangeOptions)) {\n scale.handleTickRangeOptions();\n }\n}\n\n/**\n * @param {CoreAnnotationOptions[]} annotations\n * @param {{ [key: string]: Scale }} scales\n */\nfunction verifyScaleOptions(annotations, scales) {\n for (const annotation of annotations) {\n verifyScaleIDs(annotation, scales);\n }\n}\n\nfunction changeScaleLimit(scale, range, limit, suggestedLimit) {\n if (isFinite(range[limit]) && !scaleLimitDefined(scale.options, limit, suggestedLimit)) {\n const changed = scale[limit] !== range[limit];\n scale[limit] = range[limit];\n return changed;\n }\n}\n\nfunction scaleLimitDefined(scaleOptions, limit, suggestedLimit) {\n return defined(scaleOptions[limit]) || defined(scaleOptions[suggestedLimit]);\n}\n\nfunction verifyScaleIDs(annotation, scales) {\n for (const key of ['scaleID', 'xScaleID', 'yScaleID']) {\n const scaleID = retrieveScaleID(scales, annotation, key);\n if (scaleID && !scales[scaleID] && verifyProperties(annotation, key)) {\n console.warn(`No scale found with id '${scaleID}' for annotation '${annotation.id}'`);\n }\n }\n}\n\nfunction verifyProperties(annotation, key) {\n if (key === 'scaleID') {\n return true;\n }\n const axis = key.charAt(0);\n for (const prop of ['Min', 'Max', 'Value']) {\n if (defined(annotation[axis + prop])) {\n return true;\n }\n }\n return false;\n}\n\nfunction getScaleLimits(scales, scale, annotations) {\n const axis = scale.axis;\n const scaleID = scale.id;\n const scaleIDOption = axis + 'ScaleID';\n const limits = {\n min: valueOrDefault(scale.min, Number.NEGATIVE_INFINITY),\n max: valueOrDefault(scale.max, Number.POSITIVE_INFINITY)\n };\n for (const annotation of annotations) {\n if (annotation.scaleID === scaleID) {\n updateLimits(annotation, scale, ['value', 'endValue'], limits);\n } else if (retrieveScaleID(scales, annotation, scaleIDOption) === scaleID) {\n updateLimits(annotation, scale, [axis + 'Min', axis + 'Max', axis + 'Value'], limits);\n }\n }\n return limits;\n}\n\nfunction updateLimits(annotation, scale, props, limits) {\n for (const prop of props) {\n const raw = annotation[prop];\n if (defined(raw)) {\n const value = scale.parse(raw);\n limits.min = Math.min(limits.min, value);\n limits.max = Math.max(limits.max, value);\n }\n }\n}\n\nclass BoxAnnotation extends Element {\n\n inRange(mouseX, mouseY, axis, useFinalPosition) {\n const {x, y} = rotated({x: mouseX, y: mouseY}, this.getCenterPoint(useFinalPosition), toRadians(-this.options.rotation));\n return inBoxRange({x, y}, this.getProps(['x', 'y', 'x2', 'y2'], useFinalPosition), axis, this.options.borderWidth);\n }\n\n getCenterPoint(useFinalPosition) {\n return getElementCenterPoint(this, useFinalPosition);\n }\n\n draw(ctx) {\n ctx.save();\n translate(ctx, this.getCenterPoint(), this.options.rotation);\n drawBox(ctx, this, this.options);\n ctx.restore();\n }\n\n get label() {\n return this.elements && this.elements[0];\n }\n\n resolveElementProperties(chart, options) {\n return resolveBoxAndLabelProperties(chart, options);\n }\n}\n\nBoxAnnotation.id = 'boxAnnotation';\n\nBoxAnnotation.defaults = {\n adjustScaleRange: true,\n backgroundShadowColor: 'transparent',\n borderCapStyle: 'butt',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: 'miter',\n borderRadius: 0,\n borderShadowColor: 'transparent',\n borderWidth: 1,\n display: true,\n init: undefined,\n label: {\n backgroundColor: 'transparent',\n borderWidth: 0,\n callout: {\n display: false\n },\n color: 'black',\n content: null,\n display: false,\n drawTime: undefined,\n font: {\n family: undefined,\n lineHeight: undefined,\n size: undefined,\n style: undefined,\n weight: 'bold'\n },\n height: undefined,\n opacity: undefined,\n padding: 6,\n position: 'center',\n rotation: undefined,\n textAlign: 'start',\n textStrokeColor: undefined,\n textStrokeWidth: 0,\n width: undefined,\n xAdjust: 0,\n yAdjust: 0,\n z: undefined\n },\n rotation: 0,\n shadowBlur: 0,\n shadowOffsetX: 0,\n shadowOffsetY: 0,\n xMax: undefined,\n xMin: undefined,\n xScaleID: undefined,\n yMax: undefined,\n yMin: undefined,\n yScaleID: undefined,\n z: 0\n};\n\nBoxAnnotation.defaultRoutes = {\n borderColor: 'color',\n backgroundColor: 'color'\n};\n\nBoxAnnotation.descriptors = {\n label: {\n _fallback: true\n }\n};\n\nconst positions = ['left', 'bottom', 'top', 'right'];\n\nclass LabelAnnotation extends Element {\n\n inRange(mouseX, mouseY, axis, useFinalPosition) {\n const {x, y} = rotated({x: mouseX, y: mouseY}, this.getCenterPoint(useFinalPosition), toRadians(-this.rotation));\n return inBoxRange({x, y}, this.getProps(['x', 'y', 'x2', 'y2'], useFinalPosition), axis, this.options.borderWidth);\n }\n\n getCenterPoint(useFinalPosition) {\n return getElementCenterPoint(this, useFinalPosition);\n }\n\n draw(ctx) {\n const options = this.options;\n const visible = !defined(this._visible) || this._visible;\n if (!options.display || !options.content || !visible) {\n return;\n }\n ctx.save();\n translate(ctx, this.getCenterPoint(), this.rotation);\n drawCallout(ctx, this);\n drawBox(ctx, this, options);\n drawLabel(ctx, getLabelSize(this), options);\n ctx.restore();\n }\n\n resolveElementProperties(chart, options) {\n let point;\n if (!isBoundToPoint(options)) {\n const {centerX, centerY} = resolveBoxProperties(chart, options);\n point = {x: centerX, y: centerY};\n } else {\n point = getChartPoint(chart, options);\n }\n const padding = toPadding(options.padding);\n const labelSize = measureLabelSize(chart.ctx, options);\n const boxSize = measureRect(point, labelSize, options, padding);\n return {\n initProperties: initAnimationProperties(chart, boxSize, options),\n pointX: point.x,\n pointY: point.y,\n ...boxSize,\n rotation: options.rotation\n };\n }\n}\n\nLabelAnnotation.id = 'labelAnnotation';\n\nLabelAnnotation.defaults = {\n adjustScaleRange: true,\n backgroundColor: 'transparent',\n backgroundShadowColor: 'transparent',\n borderCapStyle: 'butt',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: 'miter',\n borderRadius: 0,\n borderShadowColor: 'transparent',\n borderWidth: 0,\n callout: {\n borderCapStyle: 'butt',\n borderColor: undefined,\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: 'miter',\n borderWidth: 1,\n display: false,\n margin: 5,\n position: 'auto',\n side: 5,\n start: '50%',\n },\n color: 'black',\n content: null,\n display: true,\n font: {\n family: undefined,\n lineHeight: undefined,\n size: undefined,\n style: undefined,\n weight: undefined\n },\n height: undefined,\n init: undefined,\n opacity: undefined,\n padding: 6,\n position: 'center',\n rotation: 0,\n shadowBlur: 0,\n shadowOffsetX: 0,\n shadowOffsetY: 0,\n textAlign: 'center',\n textStrokeColor: undefined,\n textStrokeWidth: 0,\n width: undefined,\n xAdjust: 0,\n xMax: undefined,\n xMin: undefined,\n xScaleID: undefined,\n xValue: undefined,\n yAdjust: 0,\n yMax: undefined,\n yMin: undefined,\n yScaleID: undefined,\n yValue: undefined,\n z: 0\n};\n\nLabelAnnotation.defaultRoutes = {\n borderColor: 'color'\n};\n\nfunction measureRect(point, size, options, padding) {\n const width = size.width + padding.width + options.borderWidth;\n const height = size.height + padding.height + options.borderWidth;\n const position = toPosition(options.position, 'center');\n const x = calculatePosition(point.x, width, options.xAdjust, position.x);\n const y = calculatePosition(point.y, height, options.yAdjust, position.y);\n\n return {\n x,\n y,\n x2: x + width,\n y2: y + height,\n width,\n height,\n centerX: x + width / 2,\n centerY: y + height / 2\n };\n}\n\nfunction calculatePosition(start, size, adjust = 0, position) {\n return start - getRelativePosition(size, position) + adjust;\n}\n\nfunction drawCallout(ctx, element) {\n const {pointX, pointY, options} = element;\n const callout = options.callout;\n const calloutPosition = callout && callout.display && resolveCalloutPosition(element, callout);\n if (!calloutPosition || isPointInRange(element, callout, calloutPosition)) {\n return;\n }\n\n ctx.save();\n ctx.beginPath();\n const stroke = setBorderStyle(ctx, callout);\n if (!stroke) {\n return ctx.restore();\n }\n const {separatorStart, separatorEnd} = getCalloutSeparatorCoord(element, calloutPosition);\n const {sideStart, sideEnd} = getCalloutSideCoord(element, calloutPosition, separatorStart);\n if (callout.margin > 0 || options.borderWidth === 0) {\n ctx.moveTo(separatorStart.x, separatorStart.y);\n ctx.lineTo(separatorEnd.x, separatorEnd.y);\n }\n ctx.moveTo(sideStart.x, sideStart.y);\n ctx.lineTo(sideEnd.x, sideEnd.y);\n const rotatedPoint = rotated({x: pointX, y: pointY}, element.getCenterPoint(), toRadians(-element.rotation));\n ctx.lineTo(rotatedPoint.x, rotatedPoint.y);\n ctx.stroke();\n ctx.restore();\n}\n\nfunction getCalloutSeparatorCoord(element, position) {\n const {x, y, x2, y2} = element;\n const adjust = getCalloutSeparatorAdjust(element, position);\n let separatorStart, separatorEnd;\n if (position === 'left' || position === 'right') {\n separatorStart = {x: x + adjust, y};\n separatorEnd = {x: separatorStart.x, y: y2};\n } else {\n // position 'top' or 'bottom'\n separatorStart = {x, y: y + adjust};\n separatorEnd = {x: x2, y: separatorStart.y};\n }\n return {separatorStart, separatorEnd};\n}\n\nfunction getCalloutSeparatorAdjust(element, position) {\n const {width, height, options} = element;\n const adjust = options.callout.margin + options.borderWidth / 2;\n if (position === 'right') {\n return width + adjust;\n } else if (position === 'bottom') {\n return height + adjust;\n }\n return -adjust;\n}\n\nfunction getCalloutSideCoord(element, position, separatorStart) {\n const {y, width, height, options} = element;\n const start = options.callout.start;\n const side = getCalloutSideAdjust(position, options.callout);\n let sideStart, sideEnd;\n if (position === 'left' || position === 'right') {\n sideStart = {x: separatorStart.x, y: y + getSize(height, start)};\n sideEnd = {x: sideStart.x + side, y: sideStart.y};\n } else {\n // position 'top' or 'bottom'\n sideStart = {x: separatorStart.x + getSize(width, start), y: separatorStart.y};\n sideEnd = {x: sideStart.x, y: sideStart.y + side};\n }\n return {sideStart, sideEnd};\n}\n\nfunction getCalloutSideAdjust(position, options) {\n const side = options.side;\n if (position === 'left' || position === 'top') {\n return -side;\n }\n return side;\n}\n\nfunction resolveCalloutPosition(element, options) {\n const position = options.position;\n if (positions.includes(position)) {\n return position;\n }\n return resolveCalloutAutoPosition(element, options);\n}\n\nfunction resolveCalloutAutoPosition(element, options) {\n const {x, y, x2, y2, width, height, pointX, pointY, centerX, centerY, rotation} = element;\n const center = {x: centerX, y: centerY};\n const start = options.start;\n const xAdjust = getSize(width, start);\n const yAdjust = getSize(height, start);\n const xPoints = [x, x + xAdjust, x + xAdjust, x2];\n const yPoints = [y + yAdjust, y2, y, y2];\n const result = [];\n for (let index = 0; index < 4; index++) {\n const rotatedPoint = rotated({x: xPoints[index], y: yPoints[index]}, center, toRadians(rotation));\n result.push({\n position: positions[index],\n distance: distanceBetweenPoints(rotatedPoint, {x: pointX, y: pointY})\n });\n }\n return result.sort((a, b) => a.distance - b.distance)[0].position;\n}\n\nfunction getLabelSize({x, y, width, height, options}) {\n const hBorderWidth = options.borderWidth / 2;\n const padding = toPadding(options.padding);\n return {\n x: x + padding.left + hBorderWidth,\n y: y + padding.top + hBorderWidth,\n width: width - padding.left - padding.right - options.borderWidth,\n height: height - padding.top - padding.bottom - options.borderWidth\n };\n}\n\nfunction isPointInRange(element, callout, position) {\n const {pointX, pointY} = element;\n const margin = callout.margin;\n let x = pointX;\n let y = pointY;\n if (position === 'left') {\n x += margin;\n } else if (position === 'right') {\n x -= margin;\n } else if (position === 'top') {\n y += margin;\n } else if (position === 'bottom') {\n y -= margin;\n }\n return element.inRange(x, y);\n}\n\nconst pointInLine = (p1, p2, t) => ({x: p1.x + t * (p2.x - p1.x), y: p1.y + t * (p2.y - p1.y)});\nconst interpolateX = (y, p1, p2) => pointInLine(p1, p2, Math.abs((y - p1.y) / (p2.y - p1.y))).x;\nconst interpolateY = (x, p1, p2) => pointInLine(p1, p2, Math.abs((x - p1.x) / (p2.x - p1.x))).y;\nconst sqr = v => v * v;\nconst rangeLimit = (mouseX, mouseY, {x, y, x2, y2}, axis) => axis === 'y' ? {start: Math.min(y, y2), end: Math.max(y, y2), value: mouseY} : {start: Math.min(x, x2), end: Math.max(x, x2), value: mouseX};\n// http://www.independent-software.com/determining-coordinates-on-a-html-canvas-bezier-curve.html\nconst coordInCurve = (start, cp, end, t) => (1 - t) * (1 - t) * start + 2 * (1 - t) * t * cp + t * t * end;\nconst pointInCurve = (start, cp, end, t) => ({x: coordInCurve(start.x, cp.x, end.x, t), y: coordInCurve(start.y, cp.y, end.y, t)});\nconst coordAngleInCurve = (start, cp, end, t) => 2 * (1 - t) * (cp - start) + 2 * t * (end - cp);\nconst angleInCurve = (start, cp, end, t) => -Math.atan2(coordAngleInCurve(start.x, cp.x, end.x, t), coordAngleInCurve(start.y, cp.y, end.y, t)) + 0.5 * PI;\n\nclass LineAnnotation extends Element {\n\n inRange(mouseX, mouseY, axis, useFinalPosition) {\n const hBorderWidth = this.options.borderWidth / 2;\n if (axis !== 'x' && axis !== 'y') {\n const point = {mouseX, mouseY};\n const {path, ctx} = this;\n if (path) {\n setBorderStyle(ctx, this.options);\n const {chart} = this.$context;\n const mx = mouseX * chart.currentDevicePixelRatio;\n const my = mouseY * chart.currentDevicePixelRatio;\n const result = ctx.isPointInStroke(path, mx, my) || isOnLabel(this, point, useFinalPosition);\n ctx.restore();\n return result;\n }\n const epsilon = sqr(hBorderWidth);\n return intersects(this, point, epsilon, useFinalPosition) || isOnLabel(this, point, useFinalPosition);\n }\n return inAxisRange(this, {mouseX, mouseY}, axis, {hBorderWidth, useFinalPosition});\n }\n\n getCenterPoint(useFinalPosition) {\n return getElementCenterPoint(this, useFinalPosition);\n }\n\n draw(ctx) {\n const {x, y, x2, y2, cp, options} = this;\n\n ctx.save();\n if (!setBorderStyle(ctx, options)) {\n // no border width, then line is not drawn\n return ctx.restore();\n }\n setShadowStyle(ctx, options);\n\n const length = Math.sqrt(Math.pow(x2 - x, 2) + Math.pow(y2 - y, 2));\n if (options.curve && cp) {\n drawCurve(ctx, this, cp, length);\n return ctx.restore();\n }\n const {startOpts, endOpts, startAdjust, endAdjust} = getArrowHeads(this);\n const angle = Math.atan2(y2 - y, x2 - x);\n ctx.translate(x, y);\n ctx.rotate(angle);\n ctx.beginPath();\n ctx.moveTo(0 + startAdjust, 0);\n ctx.lineTo(length - endAdjust, 0);\n ctx.shadowColor = options.borderShadowColor;\n ctx.stroke();\n drawArrowHead(ctx, 0, startAdjust, startOpts);\n drawArrowHead(ctx, length, -endAdjust, endOpts);\n ctx.restore();\n }\n\n get label() {\n return this.elements && this.elements[0];\n }\n\n resolveElementProperties(chart, options) {\n const area = resolveLineProperties(chart, options);\n const {x, y, x2, y2} = area;\n const inside = isLineInArea(area, chart.chartArea);\n const properties = inside\n ? limitLineToArea({x, y}, {x: x2, y: y2}, chart.chartArea)\n : {x, y, x2, y2, width: Math.abs(x2 - x), height: Math.abs(y2 - y)};\n properties.centerX = (x2 + x) / 2;\n properties.centerY = (y2 + y) / 2;\n properties.initProperties = initAnimationProperties(chart, properties, options);\n if (options.curve) {\n const p1 = {x: properties.x, y: properties.y};\n const p2 = {x: properties.x2, y: properties.y2};\n properties.cp = getControlPoint(properties, options, distanceBetweenPoints(p1, p2));\n }\n const labelProperties = resolveLabelElementProperties(chart, properties, options.label);\n // additonal prop to manage zoom/pan\n labelProperties._visible = inside;\n\n properties.elements = [{\n type: 'label',\n optionScope: 'label',\n properties: labelProperties,\n initProperties: properties.initProperties\n }];\n return properties;\n }\n}\n\nLineAnnotation.id = 'lineAnnotation';\n\nconst arrowHeadsDefaults = {\n backgroundColor: undefined,\n backgroundShadowColor: undefined,\n borderColor: undefined,\n borderDash: undefined,\n borderDashOffset: undefined,\n borderShadowColor: undefined,\n borderWidth: undefined,\n display: undefined,\n fill: undefined,\n length: undefined,\n shadowBlur: undefined,\n shadowOffsetX: undefined,\n shadowOffsetY: undefined,\n width: undefined\n};\n\nLineAnnotation.defaults = {\n adjustScaleRange: true,\n arrowHeads: {\n display: false,\n end: Object.assign({}, arrowHeadsDefaults),\n fill: false,\n length: 12,\n start: Object.assign({}, arrowHeadsDefaults),\n width: 6\n },\n borderDash: [],\n borderDashOffset: 0,\n borderShadowColor: 'transparent',\n borderWidth: 2,\n curve: false,\n controlPoint: {\n y: '-50%'\n },\n display: true,\n endValue: undefined,\n init: undefined,\n label: {\n backgroundColor: 'rgba(0,0,0,0.8)',\n backgroundShadowColor: 'transparent',\n borderCapStyle: 'butt',\n borderColor: 'black',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: 'miter',\n borderRadius: 6,\n borderShadowColor: 'transparent',\n borderWidth: 0,\n callout: Object.assign({}, LabelAnnotation.defaults.callout),\n color: '#fff',\n content: null,\n display: false,\n drawTime: undefined,\n font: {\n family: undefined,\n lineHeight: undefined,\n size: undefined,\n style: undefined,\n weight: 'bold'\n },\n height: undefined,\n opacity: undefined,\n padding: 6,\n position: 'center',\n rotation: 0,\n shadowBlur: 0,\n shadowOffsetX: 0,\n shadowOffsetY: 0,\n textAlign: 'center',\n textStrokeColor: undefined,\n textStrokeWidth: 0,\n width: undefined,\n xAdjust: 0,\n yAdjust: 0,\n z: undefined\n },\n scaleID: undefined,\n shadowBlur: 0,\n shadowOffsetX: 0,\n shadowOffsetY: 0,\n value: undefined,\n xMax: undefined,\n xMin: undefined,\n xScaleID: undefined,\n yMax: undefined,\n yMin: undefined,\n yScaleID: undefined,\n z: 0\n};\n\nLineAnnotation.descriptors = {\n arrowHeads: {\n start: {\n _fallback: true\n },\n end: {\n _fallback: true\n },\n _fallback: true\n }\n};\n\nLineAnnotation.defaultRoutes = {\n borderColor: 'color'\n};\n\nfunction inAxisRange(element, {mouseX, mouseY}, axis, {hBorderWidth, useFinalPosition}) {\n const limit = rangeLimit(mouseX, mouseY, element.getProps(['x', 'y', 'x2', 'y2'], useFinalPosition), axis);\n return (limit.value >= limit.start - hBorderWidth && limit.value <= limit.end + hBorderWidth) || isOnLabel(element, {mouseX, mouseY}, useFinalPosition, axis);\n}\n\nfunction isLineInArea({x, y, x2, y2}, {top, right, bottom, left}) {\n return !(\n (x < left && x2 < left) ||\n (x > right && x2 > right) ||\n (y < top && y2 < top) ||\n (y > bottom && y2 > bottom)\n );\n}\n\nfunction limitPointToArea({x, y}, p2, {top, right, bottom, left}) {\n if (x < left) {\n y = interpolateY(left, {x, y}, p2);\n x = left;\n }\n if (x > right) {\n y = interpolateY(right, {x, y}, p2);\n x = right;\n }\n if (y < top) {\n x = interpolateX(top, {x, y}, p2);\n y = top;\n }\n if (y > bottom) {\n x = interpolateX(bottom, {x, y}, p2);\n y = bottom;\n }\n return {x, y};\n}\n\nfunction limitLineToArea(p1, p2, area) {\n const {x, y} = limitPointToArea(p1, p2, area);\n const {x: x2, y: y2} = limitPointToArea(p2, p1, area);\n return {x, y, x2, y2, width: Math.abs(x2 - x), height: Math.abs(y2 - y)};\n}\n\nfunction intersects(element, {mouseX, mouseY}, epsilon = EPSILON, useFinalPosition) {\n // Adapted from https://stackoverflow.com/a/6853926/25507\n const {x: x1, y: y1, x2, y2} = element.getProps(['x', 'y', 'x2', 'y2'], useFinalPosition);\n const dx = x2 - x1;\n const dy = y2 - y1;\n const lenSq = sqr(dx) + sqr(dy);\n const t = lenSq === 0 ? -1 : ((mouseX - x1) * dx + (mouseY - y1) * dy) / lenSq;\n let xx, yy;\n if (t < 0) {\n xx = x1;\n yy = y1;\n } else if (t > 1) {\n xx = x2;\n yy = y2;\n } else {\n xx = x1 + t * dx;\n yy = y1 + t * dy;\n }\n return (sqr(mouseX - xx) + sqr(mouseY - yy)) <= epsilon;\n}\n\nfunction isOnLabel(element, {mouseX, mouseY}, useFinalPosition, axis) {\n const label = element.label;\n return label.options.display && label.inRange(mouseX, mouseY, axis, useFinalPosition);\n}\n\nfunction resolveLabelElementProperties(chart, properties, options) {\n const borderWidth = options.borderWidth;\n const padding = toPadding(options.padding);\n const textSize = measureLabelSize(chart.ctx, options);\n const width = textSize.width + padding.width + borderWidth;\n const height = textSize.height + padding.height + borderWidth;\n return calculateLabelPosition(properties, options, {width, height, padding}, chart.chartArea);\n}\n\nfunction calculateAutoRotation(properties) {\n const {x, y, x2, y2} = properties;\n const rotation = Math.atan2(y2 - y, x2 - x);\n // Flip the rotation if it goes > PI/2 or < -PI/2, so label stays upright\n return rotation > PI / 2 ? rotation - PI : rotation < PI / -2 ? rotation + PI : rotation;\n}\n\nfunction calculateLabelPosition(properties, label, sizes, chartArea) {\n const {width, height, padding} = sizes;\n const {xAdjust, yAdjust} = label;\n const p1 = {x: properties.x, y: properties.y};\n const p2 = {x: properties.x2, y: properties.y2};\n const rotation = label.rotation === 'auto' ? calculateAutoRotation(properties) : toRadians(label.rotation);\n const size = rotatedSize(width, height, rotation);\n const t = calculateT(properties, label, {labelSize: size, padding}, chartArea);\n const pt = properties.cp ? pointInCurve(p1, properties.cp, p2, t) : pointInLine(p1, p2, t);\n const xCoordinateSizes = {size: size.w, min: chartArea.left, max: chartArea.right, padding: padding.left};\n const yCoordinateSizes = {size: size.h, min: chartArea.top, max: chartArea.bottom, padding: padding.top};\n const centerX = adjustLabelCoordinate(pt.x, xCoordinateSizes) + xAdjust;\n const centerY = adjustLabelCoordinate(pt.y, yCoordinateSizes) + yAdjust;\n return {\n x: centerX - (width / 2),\n y: centerY - (height / 2),\n x2: centerX + (width / 2),\n y2: centerY + (height / 2),\n centerX,\n centerY,\n pointX: pt.x,\n pointY: pt.y,\n width,\n height,\n rotation: toDegrees(rotation)\n };\n}\n\nfunction rotatedSize(width, height, rotation) {\n const cos = Math.cos(rotation);\n const sin = Math.sin(rotation);\n return {\n w: Math.abs(width * cos) + Math.abs(height * sin),\n h: Math.abs(width * sin) + Math.abs(height * cos)\n };\n}\n\nfunction calculateT(properties, label, sizes, chartArea) {\n let t;\n const space = spaceAround(properties, chartArea);\n if (label.position === 'start') {\n t = calculateTAdjust({w: properties.x2 - properties.x, h: properties.y2 - properties.y}, sizes, label, space);\n } else if (label.position === 'end') {\n t = 1 - calculateTAdjust({w: properties.x - properties.x2, h: properties.y - properties.y2}, sizes, label, space);\n } else {\n t = getRelativePosition(1, label.position);\n }\n return t;\n}\n\nfunction calculateTAdjust(lineSize, sizes, label, space) {\n const {labelSize, padding} = sizes;\n const lineW = lineSize.w * space.dx;\n const lineH = lineSize.h * space.dy;\n const x = (lineW > 0) && ((labelSize.w / 2 + padding.left - space.x) / lineW);\n const y = (lineH > 0) && ((labelSize.h / 2 + padding.top - space.y) / lineH);\n return clamp(Math.max(x, y), 0, 0.25);\n}\n\nfunction spaceAround(properties, chartArea) {\n const {x, x2, y, y2} = properties;\n const t = Math.min(y, y2) - chartArea.top;\n const l = Math.min(x, x2) - chartArea.left;\n const b = chartArea.bottom - Math.max(y, y2);\n const r = chartArea.right - Math.max(x, x2);\n return {\n x: Math.min(l, r),\n y: Math.min(t, b),\n dx: l <= r ? 1 : -1,\n dy: t <= b ? 1 : -1\n };\n}\n\nfunction adjustLabelCoordinate(coordinate, labelSizes) {\n const {size, min, max, padding} = labelSizes;\n const halfSize = size / 2;\n if (size > max - min) {\n // if it does not fit, display as much as possible\n return (max + min) / 2;\n }\n if (min >= (coordinate - padding - halfSize)) {\n coordinate = min + padding + halfSize;\n }\n if (max <= (coordinate + padding + halfSize)) {\n coordinate = max - padding - halfSize;\n }\n return coordinate;\n}\n\nfunction getArrowHeads(line) {\n const options = line.options;\n const arrowStartOpts = options.arrowHeads && options.arrowHeads.start;\n const arrowEndOpts = options.arrowHeads && options.arrowHeads.end;\n return {\n startOpts: arrowStartOpts,\n endOpts: arrowEndOpts,\n startAdjust: getLineAdjust(line, arrowStartOpts),\n endAdjust: getLineAdjust(line, arrowEndOpts)\n };\n}\n\nfunction getLineAdjust(line, arrowOpts) {\n if (!arrowOpts || !arrowOpts.display) {\n return 0;\n }\n const {length, width} = arrowOpts;\n const adjust = line.options.borderWidth / 2;\n const p1 = {x: length, y: width + adjust};\n const p2 = {x: 0, y: adjust};\n return Math.abs(interpolateX(0, p1, p2));\n}\n\nfunction drawArrowHead(ctx, offset, adjust, arrowOpts) {\n if (!arrowOpts || !arrowOpts.display) {\n return;\n }\n const {length, width, fill, backgroundColor, borderColor} = arrowOpts;\n const arrowOffsetX = Math.abs(offset - length) + adjust;\n ctx.beginPath();\n setShadowStyle(ctx, arrowOpts);\n setBorderStyle(ctx, arrowOpts);\n ctx.moveTo(arrowOffsetX, -width);\n ctx.lineTo(offset + adjust, 0);\n ctx.lineTo(arrowOffsetX, width);\n if (fill === true) {\n ctx.fillStyle = backgroundColor || borderColor;\n ctx.closePath();\n ctx.fill();\n ctx.shadowColor = 'transparent';\n } else {\n ctx.shadowColor = arrowOpts.borderShadowColor;\n }\n ctx.stroke();\n}\n\nfunction getControlPoint(properties, options, distance) {\n const {x, y, x2, y2, centerX, centerY} = properties;\n const angle = Math.atan2(y2 - y, x2 - x);\n const cp = toPosition(options.controlPoint, 0);\n const point = {\n x: centerX + getSize(distance, cp.x, false),\n y: centerY + getSize(distance, cp.y, false)\n };\n return rotated(point, {x: centerX, y: centerY}, angle);\n}\n\nfunction drawArrowHeadOnCurve(ctx, {x, y}, {angle, adjust}, arrowOpts) {\n if (!arrowOpts || !arrowOpts.display) {\n return;\n }\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate(angle);\n drawArrowHead(ctx, 0, -adjust, arrowOpts);\n ctx.restore();\n}\n\nfunction drawCurve(ctx, element, cp, length) {\n const {x, y, x2, y2, options} = element;\n const {startOpts, endOpts, startAdjust, endAdjust} = getArrowHeads(element);\n const p1 = {x, y};\n const p2 = {x: x2, y: y2};\n const startAngle = angleInCurve(p1, cp, p2, 0);\n const endAngle = angleInCurve(p1, cp, p2, 1) - PI;\n const ps = pointInCurve(p1, cp, p2, startAdjust / length);\n const pe = pointInCurve(p1, cp, p2, 1 - endAdjust / length);\n\n const path = new Path2D();\n ctx.beginPath();\n path.moveTo(ps.x, ps.y);\n path.quadraticCurveTo(cp.x, cp.y, pe.x, pe.y);\n ctx.shadowColor = options.borderShadowColor;\n ctx.stroke(path);\n element.path = path;\n element.ctx = ctx;\n drawArrowHeadOnCurve(ctx, ps, {angle: startAngle, adjust: startAdjust}, startOpts);\n drawArrowHeadOnCurve(ctx, pe, {angle: endAngle, adjust: endAdjust}, endOpts);\n}\n\nclass EllipseAnnotation extends Element {\n\n inRange(mouseX, mouseY, axis, useFinalPosition) {\n const rotation = this.options.rotation;\n const borderWidth = this.options.borderWidth;\n if (axis !== 'x' && axis !== 'y') {\n return pointInEllipse({x: mouseX, y: mouseY}, this.getProps(['width', 'height', 'centerX', 'centerY'], useFinalPosition), rotation, borderWidth);\n }\n const {x, y, x2, y2} = this.getProps(['x', 'y', 'x2', 'y2'], useFinalPosition);\n const hBorderWidth = borderWidth / 2;\n const limit = axis === 'y' ? {start: y, end: y2} : {start: x, end: x2};\n const rotatedPoint = rotated({x: mouseX, y: mouseY}, this.getCenterPoint(useFinalPosition), toRadians(-rotation));\n return rotatedPoint[axis] >= limit.start - hBorderWidth - EPSILON && rotatedPoint[axis] <= limit.end + hBorderWidth + EPSILON;\n }\n\n getCenterPoint(useFinalPosition) {\n return getElementCenterPoint(this, useFinalPosition);\n }\n\n draw(ctx) {\n const {width, height, centerX, centerY, options} = this;\n ctx.save();\n translate(ctx, this.getCenterPoint(), options.rotation);\n setShadowStyle(ctx, this.options);\n ctx.beginPath();\n ctx.fillStyle = options.backgroundColor;\n const stroke = setBorderStyle(ctx, options);\n ctx.ellipse(centerX, centerY, height / 2, width / 2, PI / 2, 0, 2 * PI);\n ctx.fill();\n if (stroke) {\n ctx.shadowColor = options.borderShadowColor;\n ctx.stroke();\n }\n ctx.restore();\n }\n\n get label() {\n return this.elements && this.elements[0];\n }\n\n resolveElementProperties(chart, options) {\n return resolveBoxAndLabelProperties(chart, options);\n }\n\n}\n\nEllipseAnnotation.id = 'ellipseAnnotation';\n\nEllipseAnnotation.defaults = {\n adjustScaleRange: true,\n backgroundShadowColor: 'transparent',\n borderDash: [],\n borderDashOffset: 0,\n borderShadowColor: 'transparent',\n borderWidth: 1,\n display: true,\n init: undefined,\n label: Object.assign({}, BoxAnnotation.defaults.label),\n rotation: 0,\n shadowBlur: 0,\n shadowOffsetX: 0,\n shadowOffsetY: 0,\n xMax: undefined,\n xMin: undefined,\n xScaleID: undefined,\n yMax: undefined,\n yMin: undefined,\n yScaleID: undefined,\n z: 0\n};\n\nEllipseAnnotation.defaultRoutes = {\n borderColor: 'color',\n backgroundColor: 'color'\n};\n\nEllipseAnnotation.descriptors = {\n label: {\n _fallback: true\n }\n};\n\nfunction pointInEllipse(p, ellipse, rotation, borderWidth) {\n const {width, height, centerX, centerY} = ellipse;\n const xRadius = width / 2;\n const yRadius = height / 2;\n\n if (xRadius <= 0 || yRadius <= 0) {\n return false;\n }\n // https://stackoverflow.com/questions/7946187/point-and-ellipse-rotated-position-test-algorithm\n const angle = toRadians(rotation || 0);\n const hBorderWidth = borderWidth / 2 || 0;\n const cosAngle = Math.cos(angle);\n const sinAngle = Math.sin(angle);\n const a = Math.pow(cosAngle * (p.x - centerX) + sinAngle * (p.y - centerY), 2);\n const b = Math.pow(sinAngle * (p.x - centerX) - cosAngle * (p.y - centerY), 2);\n return (a / Math.pow(xRadius + hBorderWidth, 2)) + (b / Math.pow(yRadius + hBorderWidth, 2)) <= 1.0001;\n}\n\nclass PointAnnotation extends Element {\n\n inRange(mouseX, mouseY, axis, useFinalPosition) {\n const {x, y, x2, y2, width} = this.getProps(['x', 'y', 'x2', 'y2', 'width'], useFinalPosition);\n const borderWidth = this.options.borderWidth;\n if (axis !== 'x' && axis !== 'y') {\n return inPointRange({x: mouseX, y: mouseY}, this.getCenterPoint(useFinalPosition), width / 2, borderWidth);\n }\n const hBorderWidth = borderWidth / 2;\n const limit = axis === 'y' ? {start: y, end: y2, value: mouseY} : {start: x, end: x2, value: mouseX};\n return limit.value >= limit.start - hBorderWidth && limit.value <= limit.end + hBorderWidth;\n }\n\n getCenterPoint(useFinalPosition) {\n return getElementCenterPoint(this, useFinalPosition);\n }\n\n draw(ctx) {\n const options = this.options;\n const borderWidth = options.borderWidth;\n if (options.radius < 0.1) {\n return;\n }\n ctx.save();\n ctx.fillStyle = options.backgroundColor;\n setShadowStyle(ctx, options);\n const stroke = setBorderStyle(ctx, options);\n drawPoint(ctx, this, this.centerX, this.centerY);\n if (stroke && !isImageOrCanvas(options.pointStyle)) {\n ctx.shadowColor = options.borderShadowColor;\n ctx.stroke();\n }\n ctx.restore();\n options.borderWidth = borderWidth;\n }\n\n resolveElementProperties(chart, options) {\n const properties = resolvePointProperties(chart, options);\n properties.initProperties = initAnimationProperties(chart, properties, options);\n return properties;\n }\n}\n\nPointAnnotation.id = 'pointAnnotation';\n\nPointAnnotation.defaults = {\n adjustScaleRange: true,\n backgroundShadowColor: 'transparent',\n borderDash: [],\n borderDashOffset: 0,\n borderShadowColor: 'transparent',\n borderWidth: 1,\n display: true,\n init: undefined,\n pointStyle: 'circle',\n radius: 10,\n rotation: 0,\n shadowBlur: 0,\n shadowOffsetX: 0,\n shadowOffsetY: 0,\n xAdjust: 0,\n xMax: undefined,\n xMin: undefined,\n xScaleID: undefined,\n xValue: undefined,\n yAdjust: 0,\n yMax: undefined,\n yMin: undefined,\n yScaleID: undefined,\n yValue: undefined,\n z: 0\n};\n\nPointAnnotation.defaultRoutes = {\n borderColor: 'color',\n backgroundColor: 'color'\n};\n\nclass PolygonAnnotation extends Element {\n\n inRange(mouseX, mouseY, axis, useFinalPosition) {\n if (axis !== 'x' && axis !== 'y') {\n return this.options.radius >= 0.1 && this.elements.length > 1 && pointIsInPolygon(this.elements, mouseX, mouseY, useFinalPosition);\n }\n const rotatedPoint = rotated({x: mouseX, y: mouseY}, this.getCenterPoint(useFinalPosition), toRadians(-this.options.rotation));\n const axisPoints = this.elements.map((point) => axis === 'y' ? point.bY : point.bX);\n const start = Math.min(...axisPoints);\n const end = Math.max(...axisPoints);\n return rotatedPoint[axis] >= start && rotatedPoint[axis] <= end;\n }\n\n getCenterPoint(useFinalPosition) {\n return getElementCenterPoint(this, useFinalPosition);\n }\n\n draw(ctx) {\n const {elements, options} = this;\n ctx.save();\n ctx.beginPath();\n ctx.fillStyle = options.backgroundColor;\n setShadowStyle(ctx, options);\n const stroke = setBorderStyle(ctx, options);\n let first = true;\n for (const el of elements) {\n if (first) {\n ctx.moveTo(el.x, el.y);\n first = false;\n } else {\n ctx.lineTo(el.x, el.y);\n }\n }\n ctx.closePath();\n ctx.fill();\n // If no border, don't draw it\n if (stroke) {\n ctx.shadowColor = options.borderShadowColor;\n ctx.stroke();\n }\n ctx.restore();\n }\n\n resolveElementProperties(chart, options) {\n const properties = resolvePointProperties(chart, options);\n const {sides, rotation} = options;\n const elements = [];\n const angle = (2 * PI) / sides;\n let rad = rotation * RAD_PER_DEG;\n for (let i = 0; i < sides; i++, rad += angle) {\n const elProps = buildPointElement(properties, options, rad);\n elProps.initProperties = initAnimationProperties(chart, properties, options);\n elements.push(elProps);\n }\n properties.elements = elements;\n return properties;\n }\n}\n\nPolygonAnnotation.id = 'polygonAnnotation';\n\nPolygonAnnotation.defaults = {\n adjustScaleRange: true,\n backgroundShadowColor: 'transparent',\n borderCapStyle: 'butt',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: 'miter',\n borderShadowColor: 'transparent',\n borderWidth: 1,\n display: true,\n init: undefined,\n point: {\n radius: 0\n },\n radius: 10,\n rotation: 0,\n shadowBlur: 0,\n shadowOffsetX: 0,\n shadowOffsetY: 0,\n sides: 3,\n xAdjust: 0,\n xMax: undefined,\n xMin: undefined,\n xScaleID: undefined,\n xValue: undefined,\n yAdjust: 0,\n yMax: undefined,\n yMin: undefined,\n yScaleID: undefined,\n yValue: undefined,\n z: 0\n};\n\nPolygonAnnotation.defaultRoutes = {\n borderColor: 'color',\n backgroundColor: 'color'\n};\n\nfunction buildPointElement({centerX, centerY}, {radius, borderWidth}, rad) {\n const halfBorder = borderWidth / 2;\n const sin = Math.sin(rad);\n const cos = Math.cos(rad);\n const point = {x: centerX + sin * radius, y: centerY - cos * radius};\n return {\n type: 'point',\n optionScope: 'point',\n properties: {\n x: point.x,\n y: point.y,\n centerX: point.x,\n centerY: point.y,\n bX: centerX + sin * (radius + halfBorder),\n bY: centerY - cos * (radius + halfBorder)\n }\n };\n}\n\nfunction pointIsInPolygon(points, x, y, useFinalPosition) {\n let isInside = false;\n let A = points[points.length - 1].getProps(['bX', 'bY'], useFinalPosition);\n for (const point of points) {\n const B = point.getProps(['bX', 'bY'], useFinalPosition);\n if ((B.bY > y) !== (A.bY > y) && x < (A.bX - B.bX) * (y - B.bY) / (A.bY - B.bY) + B.bX) {\n isInside = !isInside;\n }\n A = B;\n }\n return isInside;\n}\n\nconst annotationTypes = {\n box: BoxAnnotation,\n ellipse: EllipseAnnotation,\n label: LabelAnnotation,\n line: LineAnnotation,\n point: PointAnnotation,\n polygon: PolygonAnnotation\n};\n\n/**\n * Register fallback for annotation elements\n * For example lineAnnotation options would be looked through:\n * - the annotation object (options.plugins.annotation.annotations[id])\n * - element options (options.elements.lineAnnotation)\n * - element defaults (defaults.elements.lineAnnotation)\n * - annotation plugin defaults (defaults.plugins.annotation, this is what we are registering here)\n */\nObject.keys(annotationTypes).forEach(key => {\n defaults.describe(`elements.${annotationTypes[key].id}`, {\n _fallback: 'plugins.annotation.common'\n });\n});\n\nconst directUpdater = {\n update: Object.assign\n};\n\nconst hooks$1 = eventHooks.concat(elementHooks);\nconst resolve = (value, optDefs) => isObject(optDefs) ? resolveObj(value, optDefs) : value;\n\n\n/**\n * @typedef { import(\"chart.js\").Chart } Chart\n * @typedef { import(\"chart.js\").UpdateMode } UpdateMode\n * @typedef { import('../../types/options').AnnotationPluginOptions } AnnotationPluginOptions\n */\n\n/**\n * @param {string} prop\n * @returns {boolean}\n */\nconst isIndexable = (prop) => prop === 'color' || prop === 'font';\n\n/**\n * Resolve the annotation type, checking if is supported.\n * @param {string} [type=line] - annotation type\n * @returns {string} resolved annotation type\n */\nfunction resolveType(type = 'line') {\n if (annotationTypes[type]) {\n return type;\n }\n console.warn(`Unknown annotation type: '${type}', defaulting to 'line'`);\n return 'line';\n}\n\n/**\n * @param {Chart} chart\n * @param {Object} state\n * @param {AnnotationPluginOptions} options\n * @param {UpdateMode} mode\n */\nfunction updateElements(chart, state, options, mode) {\n const animations = resolveAnimations(chart, options.animations, mode);\n\n const annotations = state.annotations;\n const elements = resyncElements(state.elements, annotations);\n\n for (let i = 0; i < annotations.length; i++) {\n const annotationOptions = annotations[i];\n const element = getOrCreateElement(elements, i, annotationOptions.type);\n const resolver = annotationOptions.setContext(getContext(chart, element, annotationOptions));\n const properties = element.resolveElementProperties(chart, resolver);\n\n properties.skip = toSkip(properties);\n\n if ('elements' in properties) {\n updateSubElements(element, properties.elements, resolver, animations);\n // Remove the sub-element definitions from properties, so the actual elements\n // are not overwritten by their definitions\n delete properties.elements;\n }\n\n if (!defined(element.x)) {\n // If the element is newly created, assing the properties directly - to\n // make them readily awailable to any scriptable options. If we do not do this,\n // the properties retruned by `resolveElementProperties` are available only\n // after options resolution.\n Object.assign(element, properties);\n }\n\n Object.assign(element, properties.initProperties);\n properties.options = resolveAnnotationOptions(resolver);\n\n animations.update(element, properties);\n }\n}\n\nfunction toSkip(properties) {\n return isNaN(properties.x) || isNaN(properties.y);\n}\n\nfunction resolveAnimations(chart, animOpts, mode) {\n if (mode === 'reset' || mode === 'none' || mode === 'resize') {\n return directUpdater;\n }\n return new Animations(chart, animOpts);\n}\n\nfunction updateSubElements(mainElement, elements, resolver, animations) {\n const subElements = mainElement.elements || (mainElement.elements = []);\n subElements.length = elements.length;\n for (let i = 0; i < elements.length; i++) {\n const definition = elements[i];\n const properties = definition.properties;\n const subElement = getOrCreateElement(subElements, i, definition.type, definition.initProperties);\n const subResolver = resolver[definition.optionScope].override(definition);\n properties.options = resolveAnnotationOptions(subResolver);\n animations.update(subElement, properties);\n }\n}\n\nfunction getOrCreateElement(elements, index, type, initProperties) {\n const elementClass = annotationTypes[resolveType(type)];\n let element = elements[index];\n if (!element || !(element instanceof elementClass)) {\n element = elements[index] = new elementClass();\n Object.assign(element, initProperties);\n }\n return element;\n}\n\nfunction resolveAnnotationOptions(resolver) {\n const elementClass = annotationTypes[resolveType(resolver.type)];\n const result = {};\n result.id = resolver.id;\n result.type = resolver.type;\n result.drawTime = resolver.drawTime;\n Object.assign(result,\n resolveObj(resolver, elementClass.defaults),\n resolveObj(resolver, elementClass.defaultRoutes));\n for (const hook of hooks$1) {\n result[hook] = resolver[hook];\n }\n return result;\n}\n\nfunction resolveObj(resolver, defs) {\n const result = {};\n for (const prop of Object.keys(defs)) {\n const optDefs = defs[prop];\n const value = resolver[prop];\n if (isIndexable(prop) && isArray(value)) {\n result[prop] = value.map((item) => resolve(item, optDefs));\n } else {\n result[prop] = resolve(value, optDefs);\n }\n }\n return result;\n}\n\nfunction getContext(chart, element, annotation) {\n return element.$context || (element.$context = Object.assign(Object.create(chart.getContext()), {\n element,\n id: annotation.id,\n type: 'annotation'\n }));\n}\n\nfunction resyncElements(elements, annotations) {\n const count = annotations.length;\n const start = elements.length;\n\n if (start < count) {\n const add = count - start;\n elements.splice(start, 0, ...new Array(add));\n } else if (start > count) {\n elements.splice(count, start - count);\n }\n return elements;\n}\n\nvar version = \"3.0.1\";\n\nconst chartStates = new Map();\nconst hooks = eventHooks.concat(elementHooks);\n\nvar annotation = {\n id: 'annotation',\n\n version,\n\n beforeRegister() {\n requireVersion('chart.js', '4.0', Chart.version);\n },\n\n afterRegister() {\n Chart.register(annotationTypes);\n },\n\n afterUnregister() {\n Chart.unregister(annotationTypes);\n },\n\n beforeInit(chart) {\n chartStates.set(chart, {\n annotations: [],\n elements: [],\n visibleElements: [],\n listeners: {},\n listened: false,\n moveListened: false,\n hooks: {},\n hooked: false,\n hovered: []\n });\n },\n\n beforeUpdate(chart, args, options) {\n const state = chartStates.get(chart);\n const annotations = state.annotations = [];\n\n let annotationOptions = options.annotations;\n if (isObject(annotationOptions)) {\n Object.keys(annotationOptions).forEach(key => {\n const value = annotationOptions[key];\n if (isObject(value)) {\n value.id = key;\n annotations.push(value);\n }\n });\n } else if (isArray(annotationOptions)) {\n annotations.push(...annotationOptions);\n }\n verifyScaleOptions(annotations, chart.scales);\n },\n\n afterDataLimits(chart, args) {\n const state = chartStates.get(chart);\n adjustScaleRange(chart, args.scale, state.annotations.filter(a => a.display && a.adjustScaleRange));\n },\n\n afterUpdate(chart, args, options) {\n const state = chartStates.get(chart);\n updateListeners(chart, state, options);\n updateElements(chart, state, options, args.mode);\n state.visibleElements = state.elements.filter(el => !el.skip && el.options.display);\n updateHooks(chart, state, options);\n },\n\n beforeDatasetsDraw(chart, _args, options) {\n draw(chart, 'beforeDatasetsDraw', options.clip);\n },\n\n afterDatasetsDraw(chart, _args, options) {\n draw(chart, 'afterDatasetsDraw', options.clip);\n },\n\n beforeDraw(chart, _args, options) {\n draw(chart, 'beforeDraw', options.clip);\n },\n\n afterDraw(chart, _args, options) {\n draw(chart, 'afterDraw', options.clip);\n },\n\n beforeEvent(chart, args, options) {\n const state = chartStates.get(chart);\n if (handleEvent(state, args.event, options)) {\n args.changed = true;\n }\n },\n\n afterDestroy(chart) {\n chartStates.delete(chart);\n },\n\n _getState(chart) {\n return chartStates.get(chart);\n },\n\n defaults: {\n animations: {\n numbers: {\n properties: ['x', 'y', 'x2', 'y2', 'width', 'height', 'centerX', 'centerY', 'pointX', 'pointY', 'radius'],\n type: 'number'\n },\n },\n clip: true,\n interaction: {\n mode: undefined,\n axis: undefined,\n intersect: undefined\n },\n common: {\n drawTime: 'afterDatasetsDraw',\n init: false,\n label: {\n }\n }\n },\n\n descriptors: {\n _indexable: false,\n _scriptable: (prop) => !hooks.includes(prop) && prop !== 'init',\n annotations: {\n _allKeys: false,\n _fallback: (prop, opts) => `elements.${annotationTypes[resolveType(opts.type)].id}`\n },\n interaction: {\n _fallback: true\n },\n common: {\n label: {\n _indexable: isIndexable,\n _fallback: true\n },\n _indexable: isIndexable\n }\n },\n\n additionalOptionScopes: ['']\n};\n\nfunction draw(chart, caller, clip) {\n const {ctx, chartArea} = chart;\n const state = chartStates.get(chart);\n\n if (clip) {\n clipArea(ctx, chartArea);\n }\n\n const drawableElements = getDrawableElements(state.visibleElements, caller).sort((a, b) => a.element.options.z - b.element.options.z);\n for (const item of drawableElements) {\n drawElement(ctx, chartArea, state, item);\n }\n\n if (clip) {\n unclipArea(ctx);\n }\n}\n\nfunction getDrawableElements(elements, caller) {\n const drawableElements = [];\n for (const el of elements) {\n if (el.options.drawTime === caller) {\n drawableElements.push({element: el, main: true});\n }\n if (el.elements && el.elements.length) {\n for (const sub of el.elements) {\n if (sub.options.display && sub.options.drawTime === caller) {\n drawableElements.push({element: sub});\n }\n }\n }\n }\n return drawableElements;\n}\n\nfunction drawElement(ctx, chartArea, state, item) {\n const el = item.element;\n if (item.main) {\n invokeHook(state, el, 'beforeDraw');\n el.draw(ctx, chartArea);\n invokeHook(state, el, 'afterDraw');\n } else {\n el.draw(ctx, chartArea);\n }\n}\n\nexport { annotation as default };\n","import objectWithoutPropertiesLoose from \"./objectWithoutPropertiesLoose.js\";\nexport default function _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n return target;\n}","export default function _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}","import type { MouseEvent } from 'react';\nimport type {\n ChartType,\n ChartData,\n DefaultDataPoint,\n ChartDataset,\n ChartOptions,\n Chart,\n} from 'chart.js';\n\nimport type { ForwardedRef } from './types.js';\n\nconst defaultDatasetIdKey = 'label';\n\nexport function reforwardRef(ref: ForwardedRef, value: T) {\n if (typeof ref === 'function') {\n ref(value);\n } else if (ref) {\n ref.current = value;\n }\n}\n\nexport function setOptions<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(chart: Chart, nextOptions: ChartOptions) {\n const options = chart.options;\n\n if (options && nextOptions) {\n Object.assign(options, nextOptions);\n }\n}\n\nexport function setLabels<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(\n currentData: ChartData,\n nextLabels: TLabel[] | undefined\n) {\n currentData.labels = nextLabels;\n}\n\nexport function setDatasets<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(\n currentData: ChartData,\n nextDatasets: ChartDataset[],\n datasetIdKey = defaultDatasetIdKey\n) {\n const addedDatasets: ChartDataset[] = [];\n\n currentData.datasets = nextDatasets.map(\n (nextDataset: Record) => {\n // given the new set, find it's current match\n const currentDataset = currentData.datasets.find(\n (dataset: Record) =>\n dataset[datasetIdKey] === nextDataset[datasetIdKey]\n );\n\n // There is no original to update, so simply add new one\n if (\n !currentDataset ||\n !nextDataset.data ||\n addedDatasets.includes(currentDataset)\n ) {\n return { ...nextDataset } as ChartDataset;\n }\n\n addedDatasets.push(currentDataset);\n\n Object.assign(currentDataset, nextDataset);\n\n return currentDataset;\n }\n );\n}\n\nexport function cloneData<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(data: ChartData, datasetIdKey = defaultDatasetIdKey) {\n const nextData: ChartData = {\n labels: [],\n datasets: [],\n };\n\n setLabels(nextData, data.labels);\n setDatasets(nextData, data.datasets, datasetIdKey);\n\n return nextData;\n}\n\n/**\n * Get dataset from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */\nexport function getDatasetAtEvent(\n chart: Chart,\n event: MouseEvent\n) {\n return chart.getElementsAtEventForMode(\n event.nativeEvent,\n 'dataset',\n { intersect: true },\n false\n );\n}\n\n/**\n * Get single dataset element from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */\nexport function getElementAtEvent(\n chart: Chart,\n event: MouseEvent\n) {\n return chart.getElementsAtEventForMode(\n event.nativeEvent,\n 'nearest',\n { intersect: true },\n false\n );\n}\n\n/**\n * Get all dataset elements from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */\nexport function getElementsAtEvent(\n chart: Chart,\n event: MouseEvent\n) {\n return chart.getElementsAtEventForMode(\n event.nativeEvent,\n 'index',\n { intersect: true },\n false\n );\n}\n","import React, { useEffect, useRef, forwardRef } from 'react';\nimport { Chart as ChartJS } from 'chart.js';\nimport type { ChartType, DefaultDataPoint } from 'chart.js';\n\nimport type { ForwardedRef, ChartProps, BaseChartComponent } from './types.js';\nimport {\n reforwardRef,\n cloneData,\n setOptions,\n setLabels,\n setDatasets,\n} from './utils.js';\n\nfunction ChartComponent<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(\n props: ChartProps,\n ref: ForwardedRef>\n) {\n const {\n height = 150,\n width = 300,\n redraw = false,\n datasetIdKey,\n type,\n data,\n options,\n plugins = [],\n fallbackContent,\n updateMode,\n ...canvasProps\n } = props as ChartProps;\n const canvasRef = useRef(null);\n const chartRef = useRef();\n\n const renderChart = () => {\n if (!canvasRef.current) return;\n\n chartRef.current = new ChartJS(canvasRef.current, {\n type,\n data: cloneData(data, datasetIdKey),\n options: options && { ...options },\n plugins,\n });\n\n reforwardRef(ref, chartRef.current);\n };\n\n const destroyChart = () => {\n reforwardRef(ref, null);\n\n if (chartRef.current) {\n chartRef.current.destroy();\n chartRef.current = null;\n }\n };\n\n useEffect(() => {\n if (!redraw && chartRef.current && options) {\n setOptions(chartRef.current, options);\n }\n }, [redraw, options]);\n\n useEffect(() => {\n if (!redraw && chartRef.current) {\n setLabels(chartRef.current.config.data, data.labels);\n }\n }, [redraw, data.labels]);\n\n useEffect(() => {\n if (!redraw && chartRef.current && data.datasets) {\n setDatasets(chartRef.current.config.data, data.datasets, datasetIdKey);\n }\n }, [redraw, data.datasets]);\n\n useEffect(() => {\n if (!chartRef.current) return;\n\n if (redraw) {\n destroyChart();\n setTimeout(renderChart);\n } else {\n chartRef.current.update(updateMode);\n }\n }, [redraw, options, data.labels, data.datasets, updateMode]);\n\n useEffect(() => {\n if (!chartRef.current) return;\n\n destroyChart();\n setTimeout(renderChart);\n }, [type]);\n\n useEffect(() => {\n renderChart();\n\n return () => destroyChart();\n }, []);\n\n return (\n \n {fallbackContent}\n \n );\n}\n\nexport const Chart = forwardRef(ChartComponent) as BaseChartComponent;\n","import React, { forwardRef } from 'react';\nimport {\n Chart as ChartJS,\n LineController,\n BarController,\n RadarController,\n DoughnutController,\n PolarAreaController,\n BubbleController,\n PieController,\n ScatterController,\n} from 'chart.js';\nimport type { ChartType, ChartComponentLike } from 'chart.js';\n\nimport type {\n ChartProps,\n ChartJSOrUndefined,\n TypedChartComponent,\n} from './types.js';\nimport { Chart } from './chart.js';\n\nfunction createTypedChart(\n type: T,\n registerables: ChartComponentLike\n) {\n ChartJS.register(registerables);\n\n return forwardRef, Omit, 'type'>>(\n (props, ref) => \n ) as TypedChartComponent;\n}\n\nexport const Line = /* #__PURE__ */ createTypedChart('line', LineController);\n\nexport const Bar = /* #__PURE__ */ createTypedChart('bar', BarController);\n\nexport const Radar = /* #__PURE__ */ createTypedChart('radar', RadarController);\n\nexport const Doughnut = /* #__PURE__ */ createTypedChart(\n 'doughnut',\n DoughnutController\n);\n\nexport const PolarArea = /* #__PURE__ */ createTypedChart(\n 'polarArea',\n PolarAreaController\n);\n\nexport const Bubble = /* #__PURE__ */ createTypedChart(\n 'bubble',\n BubbleController\n);\n\nexport const Pie = /* #__PURE__ */ createTypedChart('pie', PieController);\n\nexport const Scatter = /* #__PURE__ */ createTypedChart(\n 'scatter',\n ScatterController\n);\n"],"names":["reservedModifierKeywords","mappedKeys","esc","return","ShiftLeft","ShiftRight","AltLeft","AltRight","MetaLeft","MetaRight","OSLeft","OSRight","ControlLeft","ControlRight","mapKey","key","trim","toLowerCase","replace","parseKeysHookInput","keys","splitKey","split","parseHotkey","hotkey","combinationKey","description","toLocaleLowerCase","map","k","_extends","alt","includes","ctrl","shift","meta","mod","filter","document","addEventListener","e","undefined","pushToCurrentlyPressedKeys","code","removeFromCurrentlyPressedKeys","window","currentlyPressedKeys","clear","Set","isReadonlyArray","value","Array","isArray","hotkeyArray","has","forEach","isHotkeyModifier","add","isHotkeyEnabledOnTag","_ref","enabledOnTags","target","targetTagName","tagName","Boolean","some","tag","isHotkeyMatchingKeyboardEvent","ignoreModifiers","pressedKeyUppercase","ctrlKey","metaKey","shiftKey","altKey","keyCode","pressedKey","length","every","BoundHotkeysProxyProvider","createContext","useBoundHotkeysProxy","useContext","deepEqual","x","y","Object","reduce","isEqual","HotkeysContext","hotkeys","enabledScopes","toggleScope","enableScope","disableScope","useHotkeysContext","stopPropagation","preventDefault","stopImmediatePropagation","useSafeLayoutEffect","useLayoutEffect","useEffect","useHotkeys","callback","options","dependencies","ref","useRef","hasTriggeredRef","_options","_keys","join","_deps","memoisedCB","useCallback","cbRef","current","memoisedOptions","useDeepEqualMemo","proxy","enabled","activeScopes","scopes","console","warn","scope","listener","isKeyUp","enableOnFormTags","ignoreEventWhen","activeElement","contains","_e$target","isContentEditable","enableOnContentEditable","_hotkey$keys","maybePreventDefault","isHotkeyEnabled","handleKeyDown","event","keydown","keyup","handleKeyUp","domNode","addHotkey","removeEventListener","removeHotkey","_defineProperty","obj","defineProperty","enumerable","configurable","writable","ownKeys","object","enumerableOnly","getOwnPropertySymbols","symbols","sym","getOwnPropertyDescriptor","push","apply","_objectSpread2","i","arguments","source","getOwnPropertyDescriptors","defineProperties","_get","Reflect","get","bind","property","receiver","base","prototype","hasOwnProperty","call","getPrototypeOf","desc","this","Animator","_classCallCheck","_request","_charts","Map","_running","_lastDate","_createClass","chart","anims","date","type","callbacks","listeners","numSteps","duration","fn","initial","currentStep","Math","min","start","_this","requestAnimFrame","_update","_refresh","_this2","Date","now","remaining","running","items","item","draw","_active","_total","tick","pop","_notify","charts","complete","progress","set","cb","_getAnims","_this$_getAnims$items","_toConsumableArray","acc","cur","max","_duration","cancel","delete","animator","transparent","interpolators","boolean","from","to","factor","color","c0","c1","valid","mix","hexString","number","Animation","cfg","prop","currentValue","resolve","_fn","_easing","effects","easing","_start","floor","delay","_loop","loop","_target","_prop","_from","_to","_promises","elapsed","remain","promises","Promise","res","rej","resolved","method","Animations","config","_chart","_properties","configure","isObject","animationOptions","defaults","animatedProps","getOwnPropertyNames","_i","_animationOptions","option","properties","values","newOptions","$shared","assign","$animations","resolveTargetOptions","animations","_createAnimations","anim","active","wait","all","awaitAll","then","props","charAt","animation","update","_animateOptions","size","scaleClip","scale","allowedOverflow","opts","reverse","end","getSortedDatasetIndices","filterVisible","ilen","metasets","_getSortedDatasetMetas","index","applyStack","stack","dsIndex","datasetIndex","otherValue","singleMode","mode","isNumberFinite","sign","isStacked","stacked","getOrCreateStack","stacks","stackKey","indexValue","subStack","getLastIndexInStack","vScale","positive","_step","_iterator","_createForOfIteratorHelper","getMatchingVisibleMetas","s","n","done","err","f","updateStacks","controller","parsed","_cachedMeta","_stacks","iScale","iAxis","axis","vAxis","indexScale","valueScale","concat","id","getStackKey","_top","_bottom","_visualValues","getFirstScaleId","scales","clearStacks","_parsed","_step2","_iterator2","isDirectUpdateMode","cloneIfNotShared","cached","shared","DatasetController","_ctx","ctx","_cachedDataOpts","getMeta","_type","_parsing","_data","_objectData","_sharedOptions","_drawStart","_drawCount","enableOptionSharing","supportsDecimation","$context","_syncList","datasetElementType","constructor","dataElementType","initialize","linkScales","_stacked","addElements","fill","isPluginEnabled","dataset","getDataset","chooseId","r","xid","xAxisID","valueOrDefault","yid","yAxisID","rid","rAxisID","indexAxis","iid","iAxisID","vid","vAxisID","xScale","getScaleForId","yScale","rScale","data","datasets","getDatasetMeta","scaleID","unlistenArrayEvents","adata","convertObjectDataToArray","isExtensible","listenArrayEvents","_dataCheck","resetNewElements","stackChanged","oldStacked","_resyncElements","scopeKeys","datasetScopeKeys","getOptionScopes","createResolver","getContext","parsing","count","sorted","_sorted","prev","parseArrayData","parseObjectData","parsePrimitiveData","labels","getLabels","singleScale","_parsed$i","parse","_this$_parsing","_this$_parsing$xAxisK","xAxisKey","_this$_parsing$yAxisK","yAxisKey","resolveObjectKey","range","parsedValue","NaN","canStack","otherScale","_getOtherScale","hidden","createStack","Number","POSITIVE_INFINITY","NEGATIVE_INFINITY","_getUserBounds","_scale$getUserBounds","getUserBounds","minDefined","maxDefined","otherMin","otherMax","_skip","updateRangeFromParsed","getParsed","label","getLabelForValue","_clip","t","b","l","top","right","bottom","left","disabled","toClip","clip","defaultClip","getMaxOverflow","elements","area","chartArea","drawActiveElementsOnTop","element","resolveDatasetElementOptions","resolveDataElementOptions","context","parent","dataIndex","raw","createDataContext","createDatasetContext","_resolveElementOptions","elementType","_this3","cache","cacheKey","sharing","defined","datasetElementScopeKeys","prefixes","names","resolveNamedOptions","freeze","transition","datasetAnimationScopeKeys","_cacheable","sharedOptions","_animationsDisabled","firstOpts","previouslySharedOptions","getSharedOptions","includeOptions","updateSharedOptions","_resolveAnimations","getStyle","_setStyle","_step3","_iterator3","_step3$value","_slicedToArray","arg1","arg2","numMeta","numData","_insertElements","_removeElements","move","arr","updateElements","removed","splice","args","_args2","_dataChanges","_sync","newCount","computeMinSampleSize","curr","_cache","$bar","visibleMetas","getAllParsedValues","_arrayUnique","sort","a","getAllScaleValues","_length","updateMinAndPrev","abs","getPixelForValue","ticks","getPixelForTick","parseValue","entry","startValue","endValue","barStart","barEnd","_custom","parseFloatBar","parseArrayOrPrimitive","isFloatBar","custom","setBorderSkipped","edge","borderSkipped","_borderProps","horizontal","borderProps","enableBorderRadius","parseEdge","orig","v1","v2","startEnd","v","setInflateAmount","ratio","inflateAmount","BarController","_DatasetController","_inherits","_super","_createSuper","_this$_parsing2","_this$_parsing2$xAxis","_this$_parsing2$yAxis","iAxisKey","vAxisKey","_getPrototypeOf","bars","reset","getBasePixel","isHorizontal","ruler","_getRuler","_this$_getSharedOptio","_getSharedOptions","vpixels","isNullOrUndef","head","_calculateBarValuePixels","ipixels","_calculateBarIndexPixels","center","height","width","updateElement","last","_step4","grouped","skipNull","val","isNaN","_iterator4","indexOf","_getStacks","name","pixels","barThickness","_startPixel","_endPixel","stackCount","_getStackCount","categoryPercentage","barPercentage","_this$_cachedMeta","_this$options","baseValue","minBarLength","actualBase","floating","getDataVisibility","barSign","startPixel","getPixelForDecimal","endPixel","getValueForPixel","halfGrid","getLineWidthForValue","maxBarThickness","Infinity","next","percent","chunk","computeFlexCategoryTraits","thickness","computeFitCategoryTraits","stackIndex","_getStackIndex","rects","numbers","_index_","offset","grid","_value_","beginAtZero","BubbleController","_DatasetController2","_super2","radius","points","_this$_cachedMeta2","_this$_getSharedOptio2","point","iPixel","vPixel","skip","DoughnutController","_DatasetController3","_super3","_this4","innerRadius","outerRadius","offsetX","offsetY","getter","_this$_parsing$key","toRadians","rotation","circumference","TAU","isDatasetVisible","_getRotation","_getCircumference","arcs","spacing","getMaxBorderWidth","getMaxOffset","maxSize","cutout","toPercentage","chartWeight","_getRingWeight","_this$_getRotationExt","_getRotationExtents","_getRatioAndOffset","ratioX","ratioY","startAngle","endAngle","startX","cos","startY","sin","endX","endY","calcMax","angle","_angleBetween","calcMin","maxX","maxY","HALF_PI","minX","PI","minY","getRatioAndOffset","maxWidth","maxHeight","maxRadius","toDimension","radiusLength","_getVisibleDatasetWeightTotal","total","calculateTotal","_getRingWeightOffset","animateRotate","calculateCircumference","animationOpts","centerX","centerY","animateScale","_this$_getSharedOptio3","_circumference","arc","metaData","formatNumber","locale","borderAlign","borderWidth","hoverBorderWidth","hoverOffset","ringWeightOffset","weight","_scriptable","_indexable","startsWith","aspectRatio","plugins","legend","generateLabels","_chart$legend$options2","pointStyle","style","text","fillStyle","backgroundColor","strokeStyle","borderColor","fontColor","lineWidth","onClick","legendItem","toggleDataVisibility","LineController","_DatasetController4","_super4","line","_meta$data","_dataset","animationsDisabled","_getStartAndCountOfVi","_getStartAndCountOfVisiblePoints","_scaleRangesChanged","_datasetIndex","_decimated","showLine","segment","animated","_this$_cachedMeta3","_this$_getSharedOptio4","_this$options2","spanGaps","maxGapLength","isNumber","directUpdate","pointsCount","prevParsed","nullData","stop","border","firstPoint","lastPoint","updateControlPoints","PolarAreaController","_DatasetController5","_super5","_this5","_parseObjectDataRadialScale","_updateRadius","_this6","minSize","cutoutPercentage","getVisibleDatasetCount","xCenter","yCenter","datasetStartAngle","getIndexAngle","defaultAngle","countVisibleElements","_computeAngle","getDistanceFromCenterForValue","_this7","_chart$legend$options3","angleLines","display","circular","pointLabels","PieController","_DoughnutController","_super6","RadarController","_DatasetController6","_super7","_fullLoop","pointPosition","getPointPositionForValue","ScatterController","_DatasetController7","_super8","_meta$data2","_getStartAndCountOfVi2","registry","getElement","_this$_cachedMeta4","_this$options3","interaction","abstract","Error","adapters","_date","DateAdapterBase","members","binarySearch","metaset","intersect","lookupMethod","_reversePixels","_rlookupByKey","_lookupByKey","el","getRange","lo","hi","evaluateInteractionItems","position","handler","getSortedVisibleDatasetMetas","_metasets$i","_binarySearch","j","getIntersectItems","useFinalPosition","includeInvisible","isPointInArea","_isPointInArea","inRange","getNearestCartesianItems","distanceMetric","useX","useY","pt1","pt2","deltaX","deltaY","sqrt","pow","getDistanceMetricForAxis","minDistance","getCenterPoint","distance","getNearestItems","_element$getProps","getProps","getAngleFromPoint","getNearestRadialItems","getAxisItems","rangeMethod","intersectsItem","Interaction","modes","getRelativePosition","nearest","STATIC_POSITIONS","filterByPosition","array","pos","filterDynamicPositionByAxis","box","sortByWeight","v0","setLayoutDims","layouts","params","layout","_step5","_iterator5","wrap","stackWeight","_stack","placed","buildStacks","vBoxMaxWidth","hBoxMaxHeight","fullSize","availableWidth","availableHeight","getCombinedMax","maxPadding","updateMaxPadding","boxPadding","updateDims","getPadding","newWidth","outerWidth","newHeight","outerHeight","widthChanged","w","heightChanged","h","same","other","getMargins","marginForPositions","positions","margin","fitBoxes","boxes","refit","changed","refitBoxes","_updateDims","setBoxDims","placeBoxes","_step6","userPadding","padding","_iterator6","addBox","_layers","z","removeBox","layoutItem","minPadding","toPadding","layoutBoxes","_box","_box$options","_box$options$stackWei","wrapBoxes","centerHorizontal","centerVertical","leftAndTop","rightAndBottom","vertical","buildLayoutBoxes","verticalBoxes","horizontalBoxes","each","beforeLayout","visibleVerticalBoxCount","updatePos","change","handleMaxPadding","BasePlatform","canvas","BasicPlatform","_BasePlatform","_super9","EXPANDO_KEY","EVENT_TYPES","touchstart","touchmove","touchend","pointerenter","pointerdown","pointermove","pointerup","pointerleave","pointerout","isNullOrEmpty","eventListenerOptions","supportsEventListenerOptions","passive","removeListener","nodeListContains","nodeList","_step7","_iterator7","node","createAttachObserver","observer","MutationObserver","entries","_step8","trigger","_iterator8","addedNodes","removedNodes","observe","childList","subtree","createDetachObserver","_step9","_iterator9","drpListeningCharts","oldDevicePixelRatio","onWindowResize","dpr","devicePixelRatio","resize","currentDevicePixelRatio","createResizeObserver","container","_getParentNode","throttled","clientWidth","ResizeObserver","contentRect","listenDevicePixelRatioChanges","releaseObserver","disconnect","unlistenDevicePixelRatioChanges","createProxyAndListen","_getRelativePosition","native","fromNativeEvent","addListener","DomPlatform","_BasePlatform2","_super10","renderHeight","getAttribute","renderWidth","boxSizing","displayWidth","readUsedSize","displayHeight","initCanvas","removeAttribute","setAttribute","proxies","$proxies","attach","detach","getMaximumSize","isConnected","Element","_this$getProps","final","_this8","ret","autoSkip","tickOpts","determinedMaxTicks","tickLength","_tickSize","maxScale","maxChart","_maxLength","determineMaxTicks","ticksLimit","maxTicksLimit","majorIndices","major","result","getMajorIndices","numMajorIndices","first","newTicks","ceil","skipMajors","evenMajorSpacing","diff","len","getEvenSpacing","factors","_factorize","calculateSpacing","avgMajorSpacing","round","majorStart","majorEnd","offsetFromEdge","getTicksLimit","ticksLength","sample","numItems","increment","getPixelForGridLine","offsetGridLines","validIndex","epsilon","lineValue","getTickMarkLength","drawTicks","getTitleHeight","fallback","font","toFont","lineHeight","titleAlign","align","_toLeftRightCenter","reverseAlign","Scale","_Element","_super11","_this9","_margins","paddingTop","paddingBottom","paddingLeft","paddingRight","labelRotation","_range","_gridLineItems","_labelItems","_labelSizes","_longestTextCache","_userMax","_userMin","_suggestedMax","_suggestedMin","_ticksLength","_borderValue","_dataLimitsCached","setContext","suggestedMin","suggestedMax","finiteOrDefault","_this$getUserBounds","metas","getMinMax","xLabels","yLabels","_computeLabelItems","beforeUpdate","margins","_this$options4","grace","sampleSize","beforeSetDimensions","setDimensions","afterSetDimensions","beforeDataLimits","determineDataLimits","afterDataLimits","_addGrace","beforeBuildTicks","buildTicks","afterBuildTicks","samplingEnabled","_convertTicksToLabels","beforeCalculateLabelRotation","calculateLabelRotation","afterCalculateLabelRotation","afterAutoSkip","beforeFit","fit","afterFit","afterUpdate","reversePixels","_alignToPixels","alignToPixels","notifyPlugins","_callHooks","beforeTickToLabelConversion","afterTickToLabelConversion","tickWidth","maxLabelDiagonal","numTicks","minRotation","maxRotation","_isVisible","labelSizes","_getLabelSizes","maxLabelWidth","widest","maxLabelHeight","highest","_limitValue","title","toDegrees","asin","_this$options5","titleOpts","gridOpts","titleHeight","_this$_getLabelSizes","tickPadding","angleRadians","labelHeight","mirror","labelWidth","_calculatePadding","_handleMargins","_this$options6","_this$options6$ticks","isRotated","labelsBelowTicks","offsetLeft","offsetRight","_this$options7","generateTickLabels","_computeLabelSizes","jlen","tickFont","fontString","nestedLabel","caches","widths","heights","widestLabelSize","highestLabelSize","_resolveTickFontOptions","string","gc","_measureText","gcLen","garbageCollect","valueAt","idx","pixel","decimal","_int16Range","_alignPixel","getBaseValue","createTickContext","optionTicks","rot","autoSkipPadding","borderValue","alignedLineValue","tx1","ty1","tx2","ty2","x1","y1","x2","y2","tl","borderOpts","axisWidth","axisHalfWidth","alignBorderValue","positionAxisID","limit","step","optsAtIndex","optsAtIndexBorder","lineColor","borderDash","dash","borderDashOffset","dashOffset","tickColor","tickBorderDash","tickBorderDashOffset","textAlign","lineCount","textOffset","crossAlign","tickAndPadding","hTickAndPadding","textBaseline","_getXAxisLabelAlignment","_getYAxisLabelAlignment","labelOffset","halfCount","strokeColor","textStrokeColor","strokeWidth","textStrokeWidth","tickTextAlign","showLabelBackdrop","backdrop","labelPadding","backdropPadding","backdropColor","translation","_this$options8","_this$options9","_this$options9$ticks","save","fillRect","restore","findIndex","_computeGridLineItems","drawLine","p1","p2","setLineDash","lineDashOffset","beginPath","moveTo","lineTo","stroke","drawOnChartArea","_this$options10","lastLineWidth","_computeLabelArea","clipArea","_step10","getLabelItems","_iterator10","renderTextOptions","renderText","unclipArea","_this$options11","_titleArgs","titleX","titleY","_alignStartEnd","titleArgs","drawBackground","drawGrid","drawBorder","drawTitle","drawLabels","_this10","tz","gz","bz","axisID","fontSize","TypedRegistry","override","create","isPrototypeOf","parentScope","proto","isIChartComponent","register","itemDefaults","merge","defaultRoutes","routes","propertyParts","sourceName","sourceScope","parts","targetName","targetScope","routeDefaults","descriptors","registerDefaults","overrides","Registry","controllers","_typedRegistries","_len","_key","_each","_len2","_key2","_len3","_key3","_len4","_key4","_len5","_key5","_len6","_key6","_len7","_key7","_len8","_key8","_len9","_key9","_len10","_key10","typedRegistry","_this11","arg","reg","_getRegistryForType","isForType","_exec","itemReg","component","camelMethod","_capitalize","PluginService","_init","hook","_createDescriptors","_descriptors","_step11","_iterator11","descriptor","plugin","cancelable","_oldCache","_notifyStateChanges","localIds","getPlugin","local","allPlugins","_ref2","_step12","_iterator12","getOpts","pluginOpts","createDescriptors","previousDescriptors","_ref3","pluginScopeKeys","scriptable","indexable","allKeys","getIndexAxis","datasetDefaults","idMatchesAxis","determineAxis","_len11","scaleOptions","_key11","_i3","_scaleOptions","getAxisFromDataset","mergeScaleConfig","chartDefaults","configScales","chartIndexAxis","scaleConf","error","_proxy","boundDs","d","retrieveAxisFromDatasets","defaultId","getDefaultScaleIDFromAxis","defaultScaleOptions","mergeIf","defaultID","getAxisFromDefaultScaleID","initOptions","initData","keyCache","keysCached","cachedKeys","generate","addIfFound","Config","_config","initConfig","_scopeCache","_resolverCache","platform","clearCache","datasetType","additionalOptionScopes","mainScope","resetCache","keyLists","_cachedScopes","_getResolver","getResolver","resolver","subPrefixes","_step14","_descriptors2","isScriptable","isIndexable","_iterator14","isFunction","hasFunction","needContext","subResolver","_attachContext","_step13","_iterator13","descriptorDefaults","resolverCache","_createResolver","p","KNOWN_POSITIONS","positionIsHorizontal","compare2Level","l1","l2","onAnimationsComplete","onComplete","onAnimationProgress","onProgress","getCanvas","_isDomSupported","getElementById","instances","getChart","c","moveNumericKeys","_i4","intKey","Chart","userConfig","_this12","initialCanvas","existingChart","chartOptionScopes","OffscreenCanvas","_detectPlatform","updateConfig","acquireContext","uid","_aspectRatio","_metasets","_lastEvent","_listeners","_responsiveListeners","_sortedMetasets","_plugins","_hiddenIndices","attached","_doResize","debounce","resizeDelay","listen","_initialize","_this$options12","maintainAspectRatio","responsive","retinaScale","bindEvents","clearCanvas","_resizeBeforeDraw","_resize","newSize","newRatio","getDevicePixelRatio","onResize","render","scalesOptions","axisOptions","_this13","scaleOpts","updated","isRadial","dposition","dtype","scaleType","getScale","init","hasUpdated","_destroyDatasetMeta","slice","_this14","newControllers","_removeUnreferencedMetasets","order","visible","updateIndex","ControllerClass","getController","_defaults$datasets$ty","_updateMetasets","_this15","_resetElements","animsDisabled","_updateScales","_checkEventBindings","_updateHiddenIndices","invalidate","buildOrUpdateControllers","buildOrUpdateElements","_minPadding","autoPadding","_updateLayout","_updateDatasets","_eventHandler","_updateHoverStyles","_this16","ensureScalesHaveIDs","buildOrUpdateScales","existingEvents","newEvents","events","setsEqual","unbindEvents","_step15","changes","_getUniformDataChanges","_iterator15","_step15$value","datasetCount","makeSet","changeSet","_this17","noArea","_this17$_layers","_idx","_updateDataset","_this$_resizeBeforeDr","layers","_drawDatasets","_drawDataset","useClip","getDatasetArea","setDatasetVisibility","_updateVisibility","_destroy","remove","_stop","releaseContext","_this$canvas","toDataURL","bindUserEvents","bindResponsiveEvents","_this18","_add","_this19","detached","_remove","isAttached","_this20","prefix","activeElements","_this21","lastActive","_ref4","_elementsEqual","notify","pluginId","replay","hoverOptions","hover","deactivated","activated","updateHoverStyle","_this22","inChartArea","eventFilter","_handleEvent","_this$_active","_getActiveElements","isClick","_isClickEvent","lastEvent","determineLastEvent","onHover","getElementsAtEventForMode","invalidatePlugins","parseBorderRadius$1","angleDelta","o","borderRadius","_readValueToProps","halfThickness","innerLimit","computeOuterLimit","outerArcLimit","outerStart","outerEnd","innerStart","innerEnd","rThetaToXY","theta","pathArc","pixelMargin","innerR","spacingOffset","alpha","avNogSpacingRadius","angleOffset","_parseBorderRadius$","outerStartAdjustedRadius","outerEndAdjustedRadius","outerStartAdjustedAngle","outerEndAdjustedAngle","innerStartAdjustedRadius","innerEndAdjustedRadius","innerStartAdjustedAngle","innerEndAdjustedAngle","outerMidAdjustedAngle","pCenter","p4","innerMidAdjustedAngle","p8","outerStartX","outerStartY","outerEndX","outerEndY","closePath","fullCircles","borderJoinStyle","inner","lineJoin","angleMargin","clipArc","ArcElement","_Element2","_super12","_this23","_assertThisInitialized","chartX","chartY","_getAngleFromPoint2","_this$getProps2","rAdjust","betweenAngles","withinRadius","_isBetween","_this$getProps3","_this$options13","halfAngle","halfRadius","translate","radiusOffset","drawArc","setStyle","lineCap","borderCapStyle","previous","pathVars","_params$start","paramsStart","_params$end","paramsEnd","segmentStart","segmentEnd","outside","pathSegment","_pathVars","lineMethod","stepped","_steppedLineTo","tension","cubicInterpolationMode","_bezierCurveTo","getLineMethod","_ref5","_ref5$move","fastPathSegment","prevX","lastY","_pathVars2","_ref6","_ref6$move","avgX","countX","pointIndex","drawX","truncX","_getSegmentMethod","usePath2D","Path2D","path","_path","strokePathWithCache","_step16","segments","segmentMethod","_iterator16","strokePathDirect","LineElement","_Element3","_super13","_this24","_points","_segments","_pointsUpdated","_updateBezierControlPoints","_computeSegments","_boundSegments","_interpolate","_steppedInterpolation","_bezierInterpolation","_pointInLine","_getInterpolationMethod","_segments$i","interpolated","_step17","_iterator17","inRange$1","hitRadius","capBezierPoints","PointElement","_Element4","_super14","_this25","mouseX","mouseY","_this$getProps4","_this$getProps5","hoverRadius","drawPoint","getBarBounds","bar","half","_bar$getProps","skipOrLimit","boundingRects","bounds","maxW","maxH","toTRBL","parseBorderWidth","toTRBLCorners","maxR","enableBorder","topLeft","topRight","bottomLeft","bottomRight","parseBorderRadius","outer","skipX","skipY","addNormalRectPath","rect","inflateRect","amount","refRect","BarElement","_Element5","_super15","_this26","_this$options14","_boundingRects","addRectPath","addRoundedRectPath","_this$getProps6","getBoxSize","labelOpts","_labelOpts$boxHeight","boxHeight","_labelOpts$boxWidth","boxWidth","usePointStyle","pointStyleWidth","itemHeight","Legend","_Element6","_super16","_this27","_added","legendHitBoxes","_hoveredItem","doughnutMode","legendItems","columnSizes","lineWidths","buildLabels","_this28","labelFont","_computeTitleHeight","_getBoxSize","_fitRows","_fitCols","hitboxes","totalHeight","row","itemWidth","measureText","_itemHeight","heightLimit","totalWidth","currentColWidth","currentColHeight","col","_calculateItemSize","legendItemText","calculateItemWidth","fontLineHeight","calculateLegendItemHeight","calculateItemHeight","calculateItemSize","_this$options15","rtl","rtlHelper","getRtlAdapter","_step23","_iterator23","hitbox","leftForLtr","_step24","_iterator24","_draw","cursor","_this29","defaultColor","halfFontSize","_getBoxSize2","overrideTextDirection","textDirection","textWidth","setWidth","lineDash","drawOptions","SQRT2","xPlus","drawPointLegend","yBoxTop","xBoxLeft","drawLegendBox","_textX","strikethrough","fillText","restoreTextDirection","titleFont","titlePadding","topPaddingPlusHalfFontSize","hitBox","lh","onLeave","isListened","hoveredItem","_getLegendItemAt","sameItem","plugin_legend","_element","_args","adjustHitBoxes","afterEvent","handleEvent","ci","hide","show","_chart$legend$options","useBorderRadius","WeakMap","positioners","average","hasValue","tooltipPosition","eventPosition","nearestElement","distanceBetweenPoints","tp","pushOrConcat","toPush","splitNewlines","str","String","createTooltipItem","_controller$getLabelA","getLabelAndValue","formattedValue","getTooltipSize","tooltip","body","footer","bodyFont","footerFont","titleLineCount","footerLineCount","bodyLineItemCount","combinedBodyLength","bodyItem","before","lines","after","beforeBody","afterBody","titleSpacing","titleMarginBottom","displayColors","bodySpacing","footerMarginTop","footerSpacing","widthPadding","maxLineWidth","determineXAlign","yAlign","chartWidth","_chart$chartArea","xAlign","caret","caretSize","caretPadding","doesNotFitWithAlign","determineAlignment","determineYAlign","getBackgroundPoint","alignment","cornerRadius","paddingAndSize","_toTRBLCorners","alignX","alignY","getAlignedX","getBeforeAfterBodyLines","overrideCallbacks","defaultCallbacks","beforeTitle","noop","tooltipItems","labelCount","afterTitle","beforeLabel","tooltipItem","labelColor","labelTextColor","bodyColor","labelPointStyle","afterLabel","beforeFooter","afterFooter","invokeCallbackWithFallback","Tooltip","_Element8","_super18","_this31","opacity","_eventPosition","_size","_cachedAnimations","_tooltipItems","dataPoints","caretX","caretY","labelColors","labelPointStyles","labelTextColors","_this32","bodyItems","scoped","_this33","itemSort","_createItems","getTitle","getBeforeBody","getBody","getAfterBody","getFooter","positionAndSize","backgroundPoint","external","tooltipPoint","caretPosition","getCaretPosition","x3","y3","_toTRBLCorners2","ptX","ptY","pt","titleColor","colorX","rtlColorX","yOffSet","colorY","multiKeyBackground","outerX","innerX","strokeRect","textColor","bodyAlign","bodyLineHeight","xLinePadding","fillLineOfText","bodyAlignForCalculation","_drawColorBox","footerAlign","footerColor","tooltipSize","_toTRBLCorners3","drawCaret","quadraticCurveTo","animX","animY","_updateAnimationTarget","hasTooltipContent","globalAlpha","drawBody","drawFooter","_this34","_ref11","positionChanged","_positionChanged","_ignoreReplayEvents","plugin_tooltip","afterInit","afterDraw","_willRender","_objectSpread","_fallback","findOrAddLabel","addedLabels","unshift","addIfString","lastIndexOf","_getLabelForValue","CategoryScale","_Scale","_super19","_this35","_startValue","_valueRange","_addedLabels","added","_step25","_iterator25","_step25$value","isFinite","_this$getUserBounds2","_this$getMinMax","getDecimalForPixel","relativeLabelSize","minSpacing","_ref12","rad","LinearScaleBase","_Scale2","_super20","_this36","_endValue","_this$getUserBounds3","setMin","setMax","minSign","maxSign","maxTicks","stepSize","computeTickLimit","getTickLimit","generationOptions","dataRange","niceMin","niceMax","numSpaces","precision","maxDigits","includeBounds","unit","maxSpaces","rmin","rmax","countDefined","niceNum","almostWhole","almostEquals","decimalPlaces","_decimalPlaces","tickValue","generateTicks$1","_maxDigits","_setMinAndMaxByKey","format","LinearScale","_LinearScaleBase","_super21","_this$getMinMax2","handleTickRangeOptions","Ticks","log10Floor","log10","changeExponent","m","isMajor","tickVal","steps","rangeExp","rangeStep","generateTicks","_ref13","minExp","exp","startExp","significand","lastTick","LogarithmicScale","_Scale3","_super22","_this37","_zero","_this$getMinMax3","_this$getUserBounds4","getTickBackdropHeight","determineLimits","fitWithPointLabels","_padding","limits","valueCount","_pointLabels","pointLabelOpts","additionalAngle","centerPointLabels","getPointLabelContext","getPointPosition","drawingArea","plFont","textSize","_longestText","_normalizeAngle","updateLimits","setCenterPoint","_pointLabelItems","_opts$pointLabels","itemOpts","extra","createPointLabelItem","isNotOverlapped","buildPointLabelItems","hLimits","vLimits","outerDistance","pointLabelPosition","yForAngle","getTextAlignForAngle","leftForTextAlign","drawPointLabelBox","backdropLeft","backdropTop","backdropWidth","backdropHeight","pathRadiusLine","RadialLinearScale","_LinearScaleBase2","_super23","_this38","_this$getMinMax4","_this39","leftMovement","rightMovement","topMovement","bottomMovement","angleMultiplier","scalingFactor","scaledDistance","pointLabel","createPointLabelContext","distanceFromCenter","_this$_pointLabelItem","_this$options16","_this40","drawPointLabels","gridLineOpts","drawRadiusLine","_this41","rotate","animate","INTERVALS","millisecond","common","second","minute","hour","day","week","month","quarter","year","UNITS","sorter","input","adapter","_adapter","_scale$_parseOpts","_parseOpts","parser","isoWeekday","startOf","determineUnitForAutoTicks","minUnit","capacity","interval","MAX_SAFE_INTEGER","addTick","time","timestamps","_lookup2","_lookup","ticksFromTimestamps","majorUnit","setMajorTicks","TimeScale","_Scale4","_super24","_this42","_unit","_majorUnit","_offsets","_normalized","displayFormats","formats","normalized","_this$getUserBounds5","_applyBounds","_getLabelBounds","endOf","getLabelTimestamps","timeOpts","_generate","_filterBetween","_getLabelCapacity","determineUnitForFormatting","determineMajorUnit","initOffsets","offsetAfterAutoskip","getDecimalForValue","minor","weekday","hasWeekday","getDataTimestamps","tooltipFormat","datetime","fmt","formatter","minorFormat","majorFormat","_tickFormatFunction","offsets","ticksOpts","tickLabelWidth","cosRotation","sinRotation","tickFontSize","exampleTime","exampleLabel","_getLabelSize","normalize","interpolate","table","prevSource","nextSource","prevTarget","nextTarget","_lookupByKey2","_table$lo","_table$hi","_lookupByKey3","_table$lo2","_table$hi2","span","TimeSeriesScale","_TimeScale","_super25","_this43","_table","_minPos","_tableRange","_getTimestampsForTable","buildLookupTable","lim","p2b","n2b","b2n","n2p","map$1","A","B","C","D","E","F","hex","h1","h2","eq","g","isShort","HUE_RE","hsl2rgbn","hsv2rgbn","hwb2rgbn","rgb","rgb2hsl","hueValue","calln","hsl2rgb","hue","hueParse","exec","hwb2rgb","hsv2rgb","Z","Y","X","W","V","U","T","S","R","Q","P","O","N","M","L","K","G","H","I","J","names$1","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","nameParse","ok","nk","unpacked","tkeys","parseInt","unpack","RGB_RE","modHSL","tmp","clone","fromObject","functionParse","rgbParse","Color","hexParse","_rgb","_valid","hslString","w2","c2","w1","rgb1","rgb2","deg","toString","defaultValue","dimension","endsWith","parseFloat","thisArg","loopable","a0","a1","klen","isValidKey","_merger","tval","sval","sources","merger","_mergerIf","keyResolvers","_getKeyResolver","_splitKey","toUpperCase","PITAU","INFINITY","RAD_PER_DEG","QUARTER_PI","TWO_THIRDS_PI","roundedRange","niceRange","fraction","rounded","degrees","radians","centrePoint","anglePoint","distanceFromXCenter","distanceFromYCenter","radialDistanceFromCenter","atan2","_angleDiff","sameAngleIsFullCircle","angleToStart","angleToEnd","startToAngle","endToAngle","cmp","mid","ti","arrayEvents","_chartjs","stub","requestAnimationFrame","argsToUse","ticking","timeout","clearTimeout","setTimeout","pointCount","_iScale$getUserBounds","_scaleRanges","newRanges","xmin","xmax","ymin","ymax","atEdge","elasticIn","elasticOut","linear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInElastic","easeOutElastic","easeInOutElastic","easeInBack","easeOutBack","easeInOutBack","easeInBounce","easeOutBounce","easeInOutBounce","isPatternOrGradient","getHoverColor","saturate","darken","colors","intlCache","num","JSON","stringify","Intl","NumberFormat","getNumberFormat","formatters","numeric","notation","delta","maxTick","calculateDelta","logDelta","numDecimal","minimumFractionDigits","maximumFractionDigits","logarithmic","getScope$1","root","Defaults","_appliers","family","hoverBackgroundColor","hoverBorderColor","hoverColor","describe","_Object$definePropert","scopeObject","targetScopeObject","privateName","appliers","route","longest","arrayOfThings","thing","nestedThing","halfWidth","resetTransform","clearRect","xOffset","yOffset","xOffsetW","yOffsetW","drawImage","ellipse","SQRT1_2","flip","midpoint","bezierCurveTo","cp1x","cp2x","cp1y","cp2y","decorateText","underline","metrics","actualBoundingBoxLeft","actualBoundingBoxRight","actualBoundingBoxAscent","actualBoundingBoxDescent","yDecoration","decorationWidth","drawBackdrop","oldColor","setRenderOpts","strokeText","LINE_HEIGHT","FONT_STYLE","toLineHeight","matches","match","numberOrZero","objProps","read","toFontString","inputs","info","cacheable","minmax","keepZero","parentContext","getTarget","finalRootScopes","_resolve","Symbol","toStringTag","Proxy","deleteProperty","_cached","readKey","needsSubResolver","createSubResolver","_resolveWithPrefixes","_scopes","getKeysFromAllScopes","storage","_storage","subProxy","_context","_subProxy","getValue","_resolveScriptable","_resolveArray","_resolveWithContext","_proxy$_scriptable","_proxy$_indexable","_proxy$_allKeys","_allKeys","resolveFallback","getScope","addScopes","parentScopes","parentFallback","rootScopes","_rootScopes","allScopes","addScopesFromKey","_getTarget","subGetTarget","resolveKeysFromAllScopes","EPSILON","getPoint","getValueAxis","splineCurve","middlePoint","afterPoint","d01","d12","s01","s12","fa","fb","splineCurveMonotone","pointBefore","pointCurrent","valueAxis","pointsLen","deltaK","mK","pointAfter","slopeDelta","alphaK","betaK","tauK","squaredMagnitude","monotoneAdjust","monotoneCompute","capControlPoint","controlPoints","inArea","inAreaPrev","inAreaNext","parentNode","host","parseMaxStyle","styleValue","parentProperty","valueInPixels","getComputedStyle","ownerDocument","defaultView","getPositionedStyle","styles","suffix","useOffsetPos","shadowRoot","borderBox","paddings","borders","_getCanvasPosition","touches","getBoundingClientRect","clientX","clientY","getCanvasPosition","round1","bbWidth","bbHeight","containerSize","containerStyle","containerBorder","containerPadding","clientHeight","getContainerSize","forceRatio","forceStyle","pixelRatio","deviceHeight","deviceWidth","setTransform","passiveSupported","getPropertyValue","cp1","cp2","getRightToLeftAdapter","rectX","getLeftToRightAdapter","_itemWidth","direction","original","getPropertyPriority","setProperty","prevTextDirection","propertyFn","between","compare","normalizeSegment","_boundSegment","prevValue","startBound","endBound","_propertyFn2","_getSegment","_propertyFn","getSegment","inside","subStart","shouldStart","shouldStop","sub","segmentOptions","_findStartAndEnd","findStartAndEnd","splitByStyles","solidSegments","chartContext","baseStyle","readStyle","prevStyle","addStyle","st","dir","styleChanged","p0","p0DataIndex","p1DataIndex","doSplitByStyles","replacer","state","filterElements","nearestItems","evenPoint","getPointByAxis","_index","getNearestItem","getElements","visibleElements","inRangeByAxis","isOlderPart","act","req","clamp","clampAll","_Object$keys","inBoxRange","hBorderWidth","inRangeX","inRangeY","getElementCenterPoint","isPercentString","toPercent","toPositivePercent","boxAppering","defaultInitAnimation","polygon","getSize","positivePercent","toPosition","isBoundToPoint","xValue","yValue","initAnimationProperties","initAnim","applyDefault","execCallback","loadHooks","hooks","hooksContainer","widthCache","fontsKey","fonts","isImageOrCanvas","content","setBorderStyle","setShadowStyle","shadowColor","backgroundShadowColor","shadowBlur","shadowOffsetX","shadowOffsetY","measureLabelSize","optFont","calculateLabelSize","drawBox","borderShadowColor","drawLabel","elementValue","getOpacity","optColor","calculateTextAlignment","miterLimit","setTextStrokeStyle","lhs","applyLabelDecoration","applyLabelContent","notRadius","drawPointStyle","limitedLineScale","xScaleID","startProp","endProp","yScaleID","scaleValue","retrieveScaleID","axes","getDimensionByScale","getChartPoint","resolveBoxProperties","_ref7","_ref8","xDim","getChartDimensionByScale","xMin","xMax","yDim","yMin","yMax","resolvePointProperties","adjustCenterX","xAdjust","adjustCenterY","yAdjust","getChartCircle","resolveLineProperties","resolveFullLineProperties","_i2","_Object$keys2","scaleId","_limitedLineScale$sca","dim","resolveLimitedLineProperties","resolveBoxAndLabelProperties","initProperties","optionScope","resolveLabelElementProperties$1","calculatePosition$1","boxOpts","_labelOpts$padding","padStart","padEnd","adjust","callout","labelSize","_ref9","calculateX","_ref10","calculateY","rotated","cx","cy","moveHooks","eventHooks","listened","moveListened","hovered","dispatchMoveEvents","handleMoveEvents","dispatchEvent","click","handleClickEvents","checkElements","elementHooks","invokeHook","hooked","callbackHook","adjustScaleRange","annotations","scaleIDOption","annotation","getScaleLimits","changeScaleLimit","suggestedLimit","scaleLimitDefined","verifyScaleIDs","_arr","verifyProperties","_arr2","BoxAnnotation","_rotated","drawTime","LabelAnnotation","_rotated2","_visible","pointX","pointY","calloutPosition","xPoints","yPoints","rotatedPoint","resolveCalloutAutoPosition","resolveCalloutPosition","isPointInRange","_getCalloutSeparatorC","separatorStart","separatorEnd","getCalloutSeparatorAdjust","getCalloutSeparatorCoord","_getCalloutSideCoord","sideStart","sideEnd","side","getCalloutSideAdjust","getCalloutSideCoord","drawCallout","getLabelSize","_resolveBoxProperties","boxSize","calculatePosition","measureRect","pointInLine","interpolateX","interpolateY","sqr","coordInCurve","cp","pointInCurve","coordAngleInCurve","angleInCurve","LineAnnotation","mx","my","isPointInStroke","isOnLabel","_ref20","xx","yy","_element$getProps2","dx","dy","lenSq","intersects","_ref14","_ref15","rangeLimit","inAxisRange","curve","_getArrowHeads2","getArrowHeads","startOpts","endOpts","startAdjust","endAdjust","ps","pe","drawArrowHeadOnCurve","drawCurve","_getArrowHeads","drawArrowHead","_ref16","_ref17","isLineInArea","_limitPointToArea","limitPointToArea","_limitPointToArea2","limitLineToArea","controlPoint","getControlPoint","labelProperties","sizes","calculateAutoRotation","rotatedSize","space","spaceAround","calculateTAdjust","calculateT","xCoordinateSizes","yCoordinateSizes","adjustLabelCoordinate","calculateLabelPosition","resolveLabelElementProperties","arrowHeadsDefaults","_ref18","_ref19","_ref21","lineSize","lineW","lineH","coordinate","halfSize","arrowStartOpts","arrowHeads","arrowEndOpts","getLineAdjust","arrowOpts","arrowOffsetX","_ref22","_ref23","EllipseAnnotation","xRadius","yRadius","cosAngle","sinAngle","pointInEllipse","PointAnnotation","inPointRange","PolygonAnnotation","isInside","bY","bX","pointIsInPolygon","axisPoints","sides","elProps","buildPointElement","_ref24","_ref25","halfBorder","annotationTypes","directUpdater","hooks$1","optDefs","resolveObj","resolveType","animOpts","resolveAnimations","resyncElements","annotationOptions","getOrCreateElement","resolveElementProperties","toSkip","updateSubElements","resolveAnnotationOptions","mainElement","subElements","definition","subElement","elementClass","defs","_Object$keys3","_i5","chartStates","version","beforeRegister","pkg","ver","strict","requireVersion","afterRegister","afterUnregister","beforeInit","verifyScaleOptions","_getElements","updateListeners","updateHooks","beforeDatasetsDraw","afterDatasetsDraw","beforeDraw","beforeEvent","afterDestroy","_getState","caller","drawableElements","main","getDrawableElements","drawElement","_objectWithoutProperties","excluded","sourceKeys","sourceSymbolKeys","propertyIsEnumerable","defaultDatasetIdKey","reforwardRef","setLabels","currentData","nextLabels","setDatasets","nextDatasets","datasetIdKey","addedDatasets","nextDataset","currentDataset","find","cloneData","nextData","ChartComponent","_props$height","_props$width","_props$redraw","redraw","_props$plugins","fallbackContent","updateMode","canvasProps","_excluded","canvasRef","chartRef","renderChart","Chart$1","destroyChart","destroy","nextOptions","setOptions","React","role","forwardRef","createTypedChart","registerables","Line"],"sourceRoot":""} \ No newline at end of file diff --git a/static/js/410.7559e4e7.chunk.js b/static/js/410.7559e4e7.chunk.js new file mode 100644 index 0000000..a567025 --- /dev/null +++ b/static/js/410.7559e4e7.chunk.js @@ -0,0 +1,3 @@ +/*! For license information please see 410.7559e4e7.chunk.js.LICENSE.txt */ +"use strict";(self.webpackChunkimmersion_stats=self.webpackChunkimmersion_stats||[]).push([[410],{6886:function(t,e,i){i.d(e,{y1:function(){return w}});var n=i(2791);i(184);function r(){return r=Object.assign?Object.assign.bind():function(t){for(var e=1;e'),1):!e||t.some((function(t){return e.includes(t)}))||t.includes("*"))){var t,e,i=function(t,e){var i;(void 0===e&&(e=!1),!v(t,["input","textarea","select"])||v(t,null==S?void 0:S.enableOnFormTags))&&(null!=S&&null!=S.ignoreEventWhen&&S.ignoreEventWhen(t)||(null===a.current||document.activeElement===a.current||a.current.contains(document.activeElement)?(null==(i=t.target)||!i.isContentEditable||null!=S&&S.enableOnContentEditable)&&l(p,null==S?void 0:S.splitKey).forEach((function(i){var n,r=u(i,null==S?void 0:S.combinationKey);if(g(t,r,null==S?void 0:S.ignoreModifiers)||null!=(n=r.keys)&&n.includes("*")){if(e&&o.current)return;if(function(t,e,i){("function"===typeof i&&i(t,e)||!0===i)&&t.preventDefault()}(t,r,null==S?void 0:S.preventDefault),!function(t,e,i){return"function"===typeof i?i(t,e):!0===i||void 0===i}(t,r,null==S?void 0:S.enabled))return void k(t);M.current(t,r),e||(o.current=!0)}})):k(t)))},n=function(t){void 0!==t.key&&(d(s(t.code)),(void 0===(null==S?void 0:S.keydown)&&!0!==(null==S?void 0:S.keyup)||null!=S&&S.keydown)&&i(t))},r=function(t){void 0!==t.key&&(f(s(t.code)),o.current=!1,null!=S&&S.keyup&&i(t,!0))},c=a.current||(null==h?void 0:h.document)||document;return c.addEventListener("keyup",r),c.addEventListener("keydown",n),O&&l(p,null==S?void 0:S.splitKey).forEach((function(t){return O.addHotkey(u(t,null==S?void 0:S.combinationKey,null==S?void 0:S.description))})),function(){c.removeEventListener("keyup",r),c.removeEventListener("keydown",n),O&&l(p,null==S?void 0:S.splitKey).forEach((function(t){return O.removeHotkey(u(t,null==S?void 0:S.combinationKey,null==S?void 0:S.description))}))}}}),[p,S,P]),a}},4942:function(t,e,i){i.d(e,{Z:function(){return r}});var n=i(9142);function r(t,e,i){return(e=(0,n.Z)(e))in t?Object.defineProperty(t,e,{value:i,enumerable:!0,configurable:!0,writable:!0}):t[e]=i,t}},1413:function(t,e,i){i.d(e,{Z:function(){return a}});var n=i(4942);function r(t,e){var i=Object.keys(t);if(Object.getOwnPropertySymbols){var n=Object.getOwnPropertySymbols(t);e&&(n=n.filter((function(e){return Object.getOwnPropertyDescriptor(t,e).enumerable}))),i.push.apply(i,n)}return i}function a(t){for(var e=1;e0&&void 0!==arguments[0]?arguments[0]:Date.now(),i=0;this._charts.forEach((function(n,r){if(n.running&&n.items.length){for(var a,o=n.items,s=o.length-1,l=!1;s>=0;--s)(a=o[s])._active?(a._total>n.duration&&(n.duration=a._total),a.tick(e),l=!0):(o[s]=o[o.length-1],o.pop());l&&(r.draw(),t._notify(r,n,e,"progress")),o.length||(n.running=!1,t._notify(r,n,e,"complete"),n.initial=!1),i+=o.length}})),this._lastDate=e,0===i&&(this._running=!1)}},{key:"_getAnims",value:function(t){var e=this._charts,i=e.get(t);return i||(i={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},e.set(t,i)),i}},{key:"listen",value:function(t,e,i){this._getAnims(t).listeners[e].push(i)}},{key:"add",value:function(t,e){var i;e&&e.length&&(i=this._getAnims(t).items).push.apply(i,(0,d.Z)(e))}},{key:"has",value:function(t){return this._getAnims(t).items.length>0}},{key:"start",value:function(t){var e=this._charts.get(t);e&&(e.running=!0,e.start=Date.now(),e.duration=e.items.reduce((function(t,e){return Math.max(t,e._duration)}),0),this._refresh())}},{key:"running",value:function(t){if(!this._running)return!1;var e=this._charts.get(t);return!!(e&&e.running&&e.items.length)}},{key:"stop",value:function(t){var e=this._charts.get(t);if(e&&e.items.length){for(var i=e.items,n=i.length-1;n>=0;--n)i[n].cancel();e.items=[],this._notify(t,e,Date.now(),"complete")}}},{key:"remove",value:function(t){return this._charts.delete(t)}}]),t}(),y=new p,m="transparent",b={boolean:function(t,e,i){return i>.5?e:t},color:function(t,e,i){var n=(0,g.c)(t||m),r=n.valid&&(0,g.c)(e||m);return r&&r.valid?r.mix(n,i).hexString():e},number:function(t,e,i){return t+(e-t)*i}},x=function(){function t(e,i,n,r){(0,f.Z)(this,t);var a=i[n];r=(0,g.a)([e.to,r,a,e.from]);var o=(0,g.a)([e.from,a,r]);this._active=!0,this._fn=e.fn||b[e.type||typeof o],this._easing=g.e[e.easing]||g.e.linear,this._start=Math.floor(Date.now()+(e.delay||0)),this._duration=this._total=Math.floor(e.duration),this._loop=!!e.loop,this._target=i,this._prop=n,this._from=o,this._to=r,this._promises=void 0}return(0,v.Z)(t,[{key:"active",value:function(){return this._active}},{key:"update",value:function(t,e,i){if(this._active){this._notify(!1);var n=this._target[this._prop],r=i-this._start,a=this._duration-r;this._start=i,this._duration=Math.floor(Math.max(a,t.duration)),this._total+=r,this._loop=!!t.loop,this._to=(0,g.a)([t.to,e,n,t.from]),this._from=(0,g.a)([t.from,n,e])}}},{key:"cancel",value:function(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}},{key:"tick",value:function(t){var e,i=t-this._start,n=this._duration,r=this._prop,a=this._from,o=this._loop,s=this._to;if(this._active=a!==s&&(o||i1?2-e:e,e=this._easing(Math.min(1,Math.max(0,e))),this._target[r]=this._fn(a,s,e))}},{key:"wait",value:function(){var t=this._promises||(this._promises=[]);return new Promise((function(e,i){t.push({res:e,rej:i})}))}},{key:"_notify",value:function(t){for(var e=t?"res":"rej",i=this._promises||[],n=0;n=0;--i){var l=o[i];if("$"!==l.charAt(0))if("options"!==l){var u=e[l],h=a[l],c=n.get(l);if(h){if(c&&h.active()){h.update(c,u,s);continue}h.cancel()}c&&c.duration?(a[l]=h=new x(c,t,l,u),r.push(h)):t[l]=u}else r.push.apply(r,(0,d.Z)(this._animateOptions(t,e)))}return r}},{key:"update",value:function(t,e){if(0!==this._properties.size){var i=this._createAnimations(t,e);return i.length?(y.add(this._chart,i),!0):void 0}Object.assign(t,e)}}]),t}();function _(t,e){var i=t&&t.options||{},n=i.reverse,r=void 0===i.min?e:0,a=void 0===i.max?e:0;return{start:n?a:r,end:n?r:a}}function w(t,e){var i,n,r=[],a=t._getSortedDatasetMetas(e);for(i=0,n=a.length;i3&&void 0!==arguments[3]?arguments[3]:{},l=t.keys,u="single"===s.mode;if(null!==e){for(n=0,r=l.length;n0||!i&&s<0)return o.index}}catch(l){a.e(l)}finally{a.f()}return null}function C(t,e){for(var i,n=t.chart,r=t._cachedMeta,a=n._stacks||(n._stacks={}),o=r.iScale,s=r.vScale,l=r.index,u=o.axis,h=s.axis,c=function(t,e,i){return"".concat(t.id,".").concat(e.id,".").concat(i.stack||i.type)}(o,s,r),d=e.length,f=0;f0&&a._parsed[t-1];if(!1===this._parsing)a._parsed=o,a._sorted=!0,r=o;else{r=(0,g.b)(o[t])?this.parseArrayData(a,o,t,e):(0,g.i)(o[t])?this.parseObjectData(a,o,t,e):this.parsePrimitiveData(a,o,t,e);for(i=0;ie||f=0;--i)if(!v()){this.updateRangeFromParsed(h,t,n,u);break}return h}},{key:"getAllParsedValues",value:function(t){var e,i,n,r=this._cachedMeta._parsed,a=[];for(e=0,i=r.length;e=0&&t1&&void 0!==arguments[1]?arguments[1]:"default",n=arguments.length>2?arguments[2]:void 0,r="active"===i,a=this._cachedDataOpts,o=t+"-"+i,s=a[o],l=this.enableOptionSharing&&(0,g.h)(n);if(s)return E(s,l);var u=this.chart.config,h=u.datasetElementScopeKeys(this._type,t),c=r?["".concat(t,"Hover"),"hover",t,""]:[t,""],d=u.getOptionScopes(this.getDataset(),h),f=Object.keys(g.d.elements[t]),v=u.resolveNamedOptions(d,f,(function(){return e.getContext(n,r,i)}),c);return v.$shared&&(v.$shared=l,a[o]=Object.freeze(E(v,l))),v}},{key:"_resolveAnimations",value:function(t,e,i){var n,r=this.chart,a=this._cachedDataOpts,o="animation-".concat(e),s=a[o];if(s)return s;if(!1!==r.options.animation){var l=this.chart.config,u=l.datasetAnimationScopeKeys(this._type,e),h=l.getOptionScopes(this.getDataset(),u);n=l.createResolver(h,this.getContext(t,i,e))}var c=new k(r,n&&n.animations);return n&&n._cacheable&&(a[o]=Object.freeze(c)),c}},{key:"getSharedOptions",value:function(t){if(t.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},t))}},{key:"includeOptions",value:function(t,e){return!e||T(t)||this.chart._animationsDisabled}},{key:"_getSharedOptions",value:function(t,e){var i=this.resolveDataElementOptions(t,e),n=this._sharedOptions,r=this.getSharedOptions(i),a=this.includeOptions(e,r)||r!==n;return this.updateSharedOptions(r,e,i),{sharedOptions:r,includeOptions:a}}},{key:"updateElement",value:function(t,e,i,n){T(n)?Object.assign(t,i):this._resolveAnimations(e,n).update(t,i)}},{key:"updateSharedOptions",value:function(t,e,i){t&&!T(e)&&this._resolveAnimations(void 0,e).update(t,i)}},{key:"_setStyle",value:function(t,e,i,n){t.active=n;var r=this.getStyle(e,n);this._resolveAnimations(e,i,n).update(t,{options:!n&&this.getSharedOptions(r)||r})}},{key:"removeHoverStyle",value:function(t,e,i){this._setStyle(t,i,"active",!1)}},{key:"setHoverStyle",value:function(t,e,i){this._setStyle(t,i,"active",!0)}},{key:"_removeDatasetHoverStyle",value:function(){var t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!1)}},{key:"_setDatasetHoverStyle",value:function(){var t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!0)}},{key:"_resyncElements",value:function(t){var e,i=this._data,n=this._cachedMeta.data,r=(0,c.Z)(this._syncList);try{for(r.s();!(e=r.n()).done;){var a=(0,u.Z)(e.value,3),o=a[0],s=a[1],l=a[2];this[o](s,l)}}catch(v){r.e(v)}finally{r.f()}this._syncList=[];var h=n.length,d=i.length,f=Math.min(d,h);f&&this.parse(0,f),d>h?this._insertElements(h,d-h,t):d2&&void 0!==arguments[2])||arguments[2],r=this._cachedMeta,a=r.data,o=t+e,s=function(t){for(t.length+=e,i=t.length-1;i>=o;i--)t[i]=t[i-e]};for(s(a),i=t;iMath.abs(s)&&(l=s,u=o),e[i.axis]=u,e._custom={barStart:l,barEnd:u,start:r,end:a,min:o,max:s}}(t,e,i,n):e[i.axis]=i.parse(t,n),e}function I(t,e,i,n){var r,a,o,s,l=t.iScale,u=t.vScale,h=l.getLabels(),c=l===u,d=[];for(r=i,a=i+n;rt.x,i="left",n="right"):(e=t.base=i?1:-1)}(i,r,h)*u,v===h&&(b-=i/2);var x=r.getPixelForDecimal(0),k=r.getPixelForDecimal(1),_=Math.min(x,k),w=Math.max(x,k);e=(b=Math.max(Math.min(b,w),_))+i,a&&!f&&(c._stacks[r.axis]._visualValues[o]=r.getValueForPixel(e)-r.getValueForPixel(b))}if(b===r.getPixelForValue(h)){var M=(0,g.s)(i)*r.getLineWidthForValue(h)/2;b+=M,i-=M}return{size:i,base:b,head:e,center:e+i/2}}},{key:"_calculateBarIndexPixels",value:function(t,e){var i,n,r=e.scale,a=this.options,o=a.skipNull,s=(0,g.v)(a.maxBarThickness,1/0);if(e.grouped){var l=o?this._getStackCount(t):e.stackCount,u="flex"===a.barThickness?function(t,e,i,n){var r=e.pixels,a=r[t],o=t>0?r[t-1]:null,s=t=0;--i)e=Math.max(e,t[i].size(this.resolveDataElementOptions(i))/2);return e>0&&e}},{key:"getLabelAndValue",value:function(t){var e=this._cachedMeta,i=this.chart.data.labels||[],n=e.xScale,r=e.yScale,a=this.getParsed(t),o=n.getLabelForValue(a.x),s=r.getLabelForValue(a.y),l=a._custom;return{label:i[t]||"",value:"("+o+", "+s+(l?", "+l:"")+")"}}},{key:"update",value:function(t){var e=this._cachedMeta.data;this.updateElements(e,0,e.length,t)}},{key:"updateElements",value:function(t,e,i,n){for(var r="reset"===n,a=this._cachedMeta,o=a.iScale,s=a.vScale,l=this._getSharedOptions(e,n),u=l.sharedOptions,h=l.includeOptions,c=o.axis,d=s.axis,f=e;f0&&!isNaN(t)?g.T*(Math.abs(t)/e):0}},{key:"getLabelAndValue",value:function(t){var e=this._cachedMeta,i=this.chart,n=i.data.labels||[],r=(0,g.o)(e._parsed[t],i.options.locale);return{label:n[t]||"",value:r}}},{key:"getMaxBorderWidth",value:function(t){var e,i,n,r,a,o=0,s=this.chart;if(!t)for(e=0,i=s.data.datasets.length;e0&&this.getParsed(e-1),M=0;M<_;++M){var S=t[M],P=x?S:{};if(M=k)P.skip=!0;else{var O=this.getParsed(M),C=(0,g.k)(O[v]),D=P[f]=o.getPixelForValue(O[f],M),A=P[v]=r||C?s.getBasePixel():s.getPixelForValue(l?this.applyStack(s,O,l):O[v],M);P.skip=isNaN(D)||isNaN(A)||C,P.stop=M>0&&Math.abs(O[f]-w[f])>b,m&&(P.parsed=O,P.raw=u.data[M]),d&&(P.options=c||this.resolveDataElementOptions(M,S.active?"active":n)),x||this.updateElement(S,M,P,n),w=O}}}},{key:"getMaxOverflow",value:function(){var t=this._cachedMeta,e=t.dataset,i=e.options&&e.options.borderWidth||0,n=t.data||[];if(!n.length)return i;var r=n[0].size(this.resolveDataElementOptions(0)),a=n[n.length-1].size(this.resolveDataElementOptions(n.length-1));return Math.max(i,r,a)/2}},{key:"draw",value:function(){var t=this._cachedMeta;t.dataset.updateControlPoints(this.chart.chartArea,t.iScale.axis),o((0,a.Z)(i.prototype),"draw",this).call(this)}}]),i}(Z);(0,h.Z)(Y,"id","line"),(0,h.Z)(Y,"defaults",{datasetElementType:"line",dataElementType:"point",showLine:!0,spanGaps:!1}),(0,h.Z)(Y,"overrides",{scales:{_index_:{type:"category"},_value_:{type:"linear"}}});var X=function(t){(0,s.Z)(i,t);var e=(0,l.Z)(i);function i(t,n){var r;return(0,f.Z)(this,i),(r=e.call(this,t,n)).innerRadius=void 0,r.outerRadius=void 0,r}return(0,v.Z)(i,[{key:"getLabelAndValue",value:function(t){var e=this._cachedMeta,i=this.chart,n=i.data.labels||[],r=(0,g.o)(e._parsed[t].r,i.options.locale);return{label:n[t]||"",value:r}}},{key:"parseObjectData",value:function(t,e,i,n){return g.y.bind(this)(t,e,i,n)}},{key:"update",value:function(t){var e=this._cachedMeta.data;this._updateRadius(),this.updateElements(e,0,e.length,t)}},{key:"getMinMax",value:function(){var t=this,e=this._cachedMeta,i={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY};return e.data.forEach((function(e,n){var r=t.getParsed(n).r;!isNaN(r)&&t.chart.getDataVisibility(n)&&(ri.max&&(i.max=r))})),i}},{key:"_updateRadius",value:function(){var t=this.chart,e=t.chartArea,i=t.options,n=Math.min(e.right-e.left,e.bottom-e.top),r=Math.max(n/2,0),a=(r-Math.max(i.cutoutPercentage?r/100*i.cutoutPercentage:1,0))/t.getVisibleDatasetCount();this.outerRadius=r-a*this.index,this.innerRadius=this.outerRadius-a}},{key:"updateElements",value:function(t,e,i,n){var r,a="reset"===n,o=this.chart,s=o.options.animation,l=this._cachedMeta.rScale,u=l.xCenter,h=l.yCenter,c=l.getIndexAngle(0)-.5*g.P,d=c,f=360/this.countVisibleElements();for(r=0;r0&&this.getParsed(e-1),_=e;_0&&Math.abs(M[f]-k[f])>b,m&&(S.parsed=M,S.raw=u.data[_]),d&&(S.options=c||this.resolveDataElementOptions(_,w.active?"active":n)),x||this.updateElement(w,_,S,n),k=M}this.updateSharedOptions(c,n,h)}},{key:"getMaxOverflow",value:function(){var t=this._cachedMeta,e=t.data||[];if(!this.options.showLine){for(var i=0,n=e.length-1;n>=0;--n)i=Math.max(i,e[n].size(this.resolveDataElementOptions(n))/2);return i>0&&i}var r=t.dataset,a=r.options&&r.options.borderWidth||0;if(!e.length)return a;var o=e[0].size(this.resolveDataElementOptions(0)),s=e[e.length-1].size(this.resolveDataElementOptions(e.length-1));return Math.max(a,o,s)/2}}]),i}(Z);(0,h.Z)(K,"id","scatter"),(0,h.Z)(K,"defaults",{datasetElementType:!1,dataElementType:"point",showLine:!1,fill:!1}),(0,h.Z)(K,"overrides",{interaction:{mode:"point"},scales:{x:{type:"linear"},y:{type:"linear"}}});function Q(){throw new Error("This method is not implemented: Check that a complete date adapter is provided.")}var q={_date:function(){function t(e){(0,f.Z)(this,t),(0,h.Z)(this,"options",void 0),this.options=e||{}}return(0,v.Z)(t,[{key:"init",value:function(){}},{key:"formats",value:function(){return Q()}},{key:"parse",value:function(){return Q()}},{key:"format",value:function(){return Q()}},{key:"add",value:function(){return Q()}},{key:"diff",value:function(){return Q()}},{key:"startOf",value:function(){return Q()}},{key:"endOf",value:function(){return Q()}}],[{key:"override",value:function(e){Object.assign(t.prototype,e)}}]),t}()};function J(t,e,i,n){var r=t.controller,a=t.data,o=t._sorted,s=r._cachedMeta.iScale;if(s&&e===s.axis&&"r"!==e&&o&&a.length){var l=s._reversePixels?g.A:g.B;if(!n)return l(a,e,i);if(r._sharedOptions){var u=a[0],h="function"===typeof u.getRange&&u.getRange(e);if(h){var c=l(a,e,i-h),d=l(a,e,i+h);return{lo:c.lo,hi:d.hi}}}}return{lo:0,hi:a.length-1}}function G(t,e,i,n,r){for(var a=t.getSortedVisibleDatasetMetas(),o=i[e],s=0,l=a.length;s0){var l=s[0].datasetIndex,u=t.getDatasetMeta(l).data;s=[];for(var h=0;hr)return function(t,e,i,n){var r,a=0,o=i[0];for(n=Math.ceil(n),r=0;rr)return l}return Math.max(r,1)}(a,e,r);if(o>0){var c,d,f=o>1?Math.round((l-s)/(o-1)):null;for(Ft(e,u,h,(0,g.k)(f)?0:s-f,s),c=0,d=o-1;cs+l)))return u}function Nt(t){return t.drawTicks?t.tickLength:0}function Bt(t,e){if(!t.display)return 0;var i=(0,g.a0)(t.font,e),n=(0,g.E)(t.padding);return((0,g.b)(t.text)?t.text.length:1)*i.lineHeight+n.height}function Ht(t,e,i){var n=(0,g.a1)(t);return(i&&"right"!==e||!i&&"right"===e)&&(n=function(t){return"left"===t?"right":"right"===t?"left":t}(n)),n}var Yt=function(t){(0,s.Z)(i,t);var e=(0,l.Z)(i);function i(t){var n;return(0,f.Z)(this,i),(n=e.call(this)).id=t.id,n.type=t.type,n.options=void 0,n.ctx=t.ctx,n.chart=t.chart,n.top=void 0,n.bottom=void 0,n.left=void 0,n.right=void 0,n.width=void 0,n.height=void 0,n._margins={left:0,right:0,top:0,bottom:0},n.maxWidth=void 0,n.maxHeight=void 0,n.paddingTop=void 0,n.paddingBottom=void 0,n.paddingLeft=void 0,n.paddingRight=void 0,n.axis=void 0,n.labelRotation=void 0,n.min=void 0,n.max=void 0,n._range=void 0,n.ticks=[],n._gridLineItems=null,n._labelItems=null,n._labelSizes=null,n._length=0,n._maxLength=0,n._longestTextCache={},n._startPixel=void 0,n._endPixel=void 0,n._reversePixels=!1,n._userMax=void 0,n._userMin=void 0,n._suggestedMax=void 0,n._suggestedMin=void 0,n._ticksLength=0,n._borderValue=0,n._cache={},n._dataLimitsCached=!1,n.$context=void 0,n}return(0,v.Z)(i,[{key:"init",value:function(t){this.options=t.setContext(this.getContext()),this.axis=t.axis,this._userMin=this.parse(t.min),this._userMax=this.parse(t.max),this._suggestedMin=this.parse(t.suggestedMin),this._suggestedMax=this.parse(t.suggestedMax)}},{key:"parse",value:function(t,e){return t}},{key:"getUserBounds",value:function(){var t=this._userMin,e=this._userMax,i=this._suggestedMin,n=this._suggestedMax;return t=(0,g.O)(t,Number.POSITIVE_INFINITY),e=(0,g.O)(e,Number.NEGATIVE_INFINITY),i=(0,g.O)(i,Number.POSITIVE_INFINITY),n=(0,g.O)(n,Number.NEGATIVE_INFINITY),{min:(0,g.O)(t,i),max:(0,g.O)(e,n),minDefined:(0,g.g)(t),maxDefined:(0,g.g)(e)}}},{key:"getMinMax",value:function(t){var e,i=this.getUserBounds(),n=i.min,r=i.max,a=i.minDefined,o=i.maxDefined;if(a&&o)return{min:n,max:r};for(var s=this.getMatchingVisibleMetas(),l=0,u=s.length;lr?r:n,r=a&&n>r?n:r,{min:(0,g.O)(n,(0,g.O)(r,n)),max:(0,g.O)(r,(0,g.O)(n,r))}}},{key:"getPadding",value:function(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}},{key:"getTicks",value:function(){return this.ticks}},{key:"getLabels",value:function(){var t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels||[]}},{key:"getLabelItems",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:this.chart.chartArea;return this._labelItems||(this._labelItems=this._computeLabelItems(t))}},{key:"beforeLayout",value:function(){this._cache={},this._dataLimitsCached=!1}},{key:"beforeUpdate",value:function(){(0,g.Q)(this.options.beforeUpdate,[this])}},{key:"update",value:function(t,e,i){var n=this.options,r=n.beginAtZero,a=n.grace,o=n.ticks,s=o.sampleSize;this.beforeUpdate(),this.maxWidth=t,this.maxHeight=e,this._margins=i=Object.assign({left:0,right:0,top:0,bottom:0},i),this.ticks=null,this._labelSizes=null,this._gridLineItems=null,this._labelItems=null,this.beforeSetDimensions(),this.setDimensions(),this.afterSetDimensions(),this._maxLength=this.isHorizontal()?this.width+i.left+i.right:this.height+i.top+i.bottom,this._dataLimitsCached||(this.beforeDataLimits(),this.determineDataLimits(),this.afterDataLimits(),this._range=(0,g.R)(this,a,r),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();var l=s=s||a<=1||!this.isHorizontal())this.labelRotation=o;else{var u=this._getLabelSizes(),h=u.widest.width,c=u.highest.height,d=(0,g.S)(this.chart.width-h,0,this.maxWidth);h+6>(t=n.offset?this.maxWidth/a:d/(a-1))&&(t=d/(a-(n.offset?.5:1)),e=this.maxHeight-Nt(n.grid)-r.padding-Bt(n.title,this.chart.options.font),i=Math.sqrt(h*h+c*c),l=(0,g.U)(Math.min(Math.asin((0,g.S)((u.highest.height+6)/t,-1,1)),Math.asin((0,g.S)(e/i,-1,1))-Math.asin((0,g.S)(c/i,-1,1)))),l=Math.max(o,Math.min(s,l))),this.labelRotation=l}}},{key:"afterCalculateLabelRotation",value:function(){(0,g.Q)(this.options.afterCalculateLabelRotation,[this])}},{key:"afterAutoSkip",value:function(){}},{key:"beforeFit",value:function(){(0,g.Q)(this.options.beforeFit,[this])}},{key:"fit",value:function(){var t={width:0,height:0},e=this.chart,i=this.options,n=i.ticks,r=i.title,a=i.grid,o=this._isVisible(),s=this.isHorizontal();if(o){var l=Bt(r,e.options.font);if(s?(t.width=this.maxWidth,t.height=Nt(a)+l):(t.height=this.maxHeight,t.width=Nt(a)+l),n.display&&this.ticks.length){var u=this._getLabelSizes(),h=u.first,c=u.last,d=u.widest,f=u.highest,v=2*n.padding,p=(0,g.t)(this.labelRotation),y=Math.cos(p),m=Math.sin(p);if(s){var b=n.mirror?0:m*d.width+y*f.height;t.height=Math.min(this.maxHeight,t.height+b+v)}else{var x=n.mirror?0:y*d.width+m*f.height;t.width=Math.min(this.maxWidth,t.width+x+v)}this._calculatePadding(h,c,m,y)}}this._handleMargins(),s?(this.width=this._length=e.width-this._margins.left-this._margins.right,this.height=t.height):(this.width=t.width,this.height=this._length=e.height-this._margins.top-this._margins.bottom)}},{key:"_calculatePadding",value:function(t,e,i,n){var r=this.options,a=r.ticks,o=a.align,s=a.padding,l=r.position,u=0!==this.labelRotation,h="top"!==l&&"x"===this.axis;if(this.isHorizontal()){var c=this.getPixelForTick(0)-this.left,d=this.right-this.getPixelForTick(this.ticks.length-1),f=0,v=0;u?h?(f=n*t.width,v=i*e.height):(f=i*t.height,v=n*e.width):"start"===o?v=e.width:"end"===o?f=t.width:"inner"!==o&&(f=t.width/2,v=e.width/2),this.paddingLeft=Math.max((f-c+s)*this.width/(this.width-c),0),this.paddingRight=Math.max((v-d+s)*this.width/(this.width-d),0)}else{var g=e.height/2,p=t.height/2;"start"===o?(g=0,p=t.height):"end"===o&&(g=e.height,p=0),this.paddingTop=g+s,this.paddingBottom=p+s}}},{key:"_handleMargins",value:function(){this._margins&&(this._margins.left=Math.max(this.paddingLeft,this._margins.left),this._margins.top=Math.max(this.paddingTop,this._margins.top),this._margins.right=Math.max(this.paddingRight,this._margins.right),this._margins.bottom=Math.max(this.paddingBottom,this._margins.bottom))}},{key:"afterFit",value:function(){(0,g.Q)(this.options.afterFit,[this])}},{key:"isHorizontal",value:function(){var t=this.options,e=t.axis,i=t.position;return"top"===i||"bottom"===i||"x"===e}},{key:"isFullSize",value:function(){return this.options.fullSize}},{key:"_convertTicksToLabels",value:function(t){var e,i;for(this.beforeTickToLabelConversion(),this.generateTickLabels(t),e=0,i=t.length;ee){for(i=0;ie.length-1?null:this.getPixelForValue(e[t].value)}},{key:"getPixelForDecimal",value:function(t){this._reversePixels&&(t=1-t);var e=this._startPixel+t*this._length;return(0,g.W)(this._alignToPixels?(0,g.X)(this.chart,e,0):e)}},{key:"getDecimalForPixel",value:function(t){var e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e}},{key:"getBasePixel",value:function(){return this.getPixelForValue(this.getBaseValue())}},{key:"getBaseValue",value:function(){var t=this.min,e=this.max;return t<0&&e<0?e:t>0&&e>0?t:0}},{key:"getContext",value:function(t){var e,i,n=this.ticks||[];if(t>=0&&to*n?o/i:s/n:s*n0}},{key:"_computeGridLineItems",value:function(t){var e,i,n,r,a,o,s,l,u,h,c,d,f=this.axis,v=this.chart,p=this.options,y=p.grid,m=p.position,b=p.border,x=y.offset,k=this.isHorizontal(),_=this.ticks.length+(x?1:0),w=Nt(y),M=[],S=b.setContext(this.getContext()),P=S.display?S.width:0,O=P/2,C=function(t){return(0,g.X)(v,t,P)};if("top"===m)e=C(this.bottom),o=this.bottom-w,l=e-O,h=C(t.top)+O,d=t.bottom;else if("bottom"===m)e=C(this.top),h=t.top,d=C(t.bottom)-O,o=e+O,l=this.top+w;else if("left"===m)e=C(this.right),a=this.right-w,s=e-O,u=C(t.left)+O,c=t.right;else if("right"===m)e=C(this.left),u=t.left,c=C(t.right)-O,a=e+O,s=this.left+w;else if("x"===f){if("center"===m)e=C((t.top+t.bottom)/2+.5);else if((0,g.i)(m)){var D=Object.keys(m)[0],A=m[D];e=C(this.chart.scales[D].getPixelForValue(A))}h=t.top,d=t.bottom,l=(o=e+O)+w}else if("y"===f){if("center"===m)e=C((t.left+t.right)/2);else if((0,g.i)(m)){var T=Object.keys(m)[0],E=m[T];e=C(this.chart.scales[T].getPixelForValue(E))}s=(a=e-O)-w,u=t.left,c=t.right}var Z=(0,g.v)(p.ticks.maxTicksLimit,_),L=Math.max(1,Math.ceil(_/Z));for(i=0;i<_;i+=L){var R=this.getContext(i),I=y.setContext(R),F=b.setContext(R),z=I.lineWidth,j=I.color,W=F.dash||[],V=F.dashOffset,N=I.tickWidth,B=I.tickColor,H=I.tickBorderDash||[],Y=I.tickBorderDashOffset;void 0!==(n=Vt(this,i,x))&&(r=(0,g.X)(v,n,z),k?a=s=u=c=r:o=l=h=d=r,M.push({tx1:a,ty1:o,tx2:s,ty2:l,x1:u,y1:h,x2:c,y2:d,width:z,color:j,borderDash:W,borderDashOffset:V,tickWidth:N,tickColor:B,tickBorderDash:H,tickBorderDashOffset:Y}))}return this._ticksLength=_,this._borderValue=e,M}},{key:"_computeLabelItems",value:function(t){var e,i,n,r,a,o,s,l,u,h,c,d=this.axis,f=this.options,v=f.position,p=f.ticks,y=this.isHorizontal(),m=this.ticks,b=p.align,x=p.crossAlign,k=p.padding,_=p.mirror,w=Nt(f.grid),M=w+k,S=_?-k:M,P=-(0,g.t)(this.labelRotation),O=[],C="middle";if("top"===v)a=this.bottom-S,o=this._getXAxisLabelAlignment();else if("bottom"===v)a=this.top+S,o=this._getXAxisLabelAlignment();else if("left"===v){var D=this._getYAxisLabelAlignment(w);o=D.textAlign,r=D.x}else if("right"===v){var A=this._getYAxisLabelAlignment(w);o=A.textAlign,r=A.x}else if("x"===d){if("center"===v)a=(t.top+t.bottom)/2+M;else if((0,g.i)(v)){var T=Object.keys(v)[0],E=v[T];a=this.chart.scales[T].getPixelForValue(E)+M}o=this._getXAxisLabelAlignment()}else if("y"===d){if("center"===v)r=(t.left+t.right)/2-M;else if((0,g.i)(v)){var Z=Object.keys(v)[0],L=v[Z];r=this.chart.scales[Z].getPixelForValue(L)}o=this._getYAxisLabelAlignment(w).textAlign}"y"===d&&("start"===b?C="top":"end"===b&&(C="bottom"));var R=this._getLabelSizes();for(e=0,i=m.length;e=0?e.setContext(this.getContext(i)).lineWidth:0}},{key:"drawGrid",value:function(t){var e,i,n=this.options.grid,r=this.ctx,a=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(t)),o=function(t,e,i){i.width&&i.color&&(r.save(),r.lineWidth=i.width,r.strokeStyle=i.color,r.setLineDash(i.borderDash||[]),r.lineDashOffset=i.borderDashOffset,r.beginPath(),r.moveTo(t.x,t.y),r.lineTo(e.x,e.y),r.stroke(),r.restore())};if(n.display)for(e=0,i=a.length;e1?e-1:0),n=1;n1&&Gt(t[0].toLowerCase());if(s)return s}var l;throw new Error("Cannot determine type of '".concat(t,"' axis. Please provide 'axis' or 'position' option."))}function ee(t,e,i){if(i[e+"AxisID"]===t)return{axis:e}}function ie(t,e){var i=g.a3[t.type]||{scales:{}},n=e.scales||{},r=Jt(t.type,e),a=Object.create(null);return Object.keys(n).forEach((function(e){var o=n[e];if(!(0,g.i)(o))return console.error("Invalid scale configuration for scale: ".concat(e));if(o._proxy)return console.warn("Ignoring resolver passed as options for scale: ".concat(e));var s=te(e,o,function(t,e){if(e.data&&e.data.datasets){var i=e.data.datasets.filter((function(e){return e.xAxisID===t||e.yAxisID===t}));if(i.length)return ee(t,"x",i[0])||ee(t,"y",i[0])}return{}}(e,t),g.d.scales[o.type]),l=function(t,e){return t===e?"_index_":"_value_"}(s,r),u=i.scales||{};a[e]=(0,g.ab)(Object.create(null),[{axis:s},o,u[s],u[l]])})),t.data.datasets.forEach((function(i){var r=i.type||t.type,o=i.indexAxis||Jt(r,e),s=(g.a3[r]||{}).scales||{};Object.keys(s).forEach((function(t){var e=function(t,e){var i=t;return"_index_"===t?i=e:"_value_"===t&&(i="x"===e?"y":"x"),i}(t,o),r=i[e+"AxisID"]||e;a[r]=a[r]||Object.create(null),(0,g.ab)(a[r],[{axis:e},n[r],s[t]])}))})),Object.keys(a).forEach((function(t){var e=a[t];(0,g.ab)(e,[g.d.scales[e.type],g.d.scale])})),a}function ne(t){var e=t.options||(t.options={});e.plugins=(0,g.v)(e.plugins,{}),e.scales=ie(t,e)}function re(t){return(t=t||{}).datasets=t.datasets||[],t.labels=t.labels||[],t}var ae=new Map,oe=new Set;function se(t,e){var i=ae.get(t);return i||(i=e(),ae.set(t,i),oe.add(i)),i}var le=function(t,e,i){var n=(0,g.f)(e,i);void 0!==n&&t.add(n)},ue=function(){function t(e){(0,f.Z)(this,t),this._config=function(t){return(t=t||{}).data=re(t.data),ne(t),t}(e),this._scopeCache=new Map,this._resolverCache=new Map}return(0,v.Z)(t,[{key:"platform",get:function(){return this._config.platform}},{key:"type",get:function(){return this._config.type},set:function(t){this._config.type=t}},{key:"data",get:function(){return this._config.data},set:function(t){this._config.data=re(t)}},{key:"options",get:function(){return this._config.options},set:function(t){this._config.options=t}},{key:"plugins",get:function(){return this._config.plugins}},{key:"update",value:function(){var t=this._config;this.clearCache(),ne(t)}},{key:"clearCache",value:function(){this._scopeCache.clear(),this._resolverCache.clear()}},{key:"datasetScopeKeys",value:function(t){return se(t,(function(){return[["datasets.".concat(t),""]]}))}},{key:"datasetAnimationScopeKeys",value:function(t,e){return se("".concat(t,".transition.").concat(e),(function(){return[["datasets.".concat(t,".transitions.").concat(e),"transitions.".concat(e)],["datasets.".concat(t),""]]}))}},{key:"datasetElementScopeKeys",value:function(t,e){return se("".concat(t,"-").concat(e),(function(){return[["datasets.".concat(t,".elements.").concat(e),"datasets.".concat(t),"elements.".concat(e),""]]}))}},{key:"pluginScopeKeys",value:function(t){var e=t.id,i=this.type;return se("".concat(i,"-plugin-").concat(e),(function(){return[["plugins.".concat(e)].concat((0,d.Z)(t.additionalOptionScopes||[]))]}))}},{key:"_cachedScopes",value:function(t,e){var i=this._scopeCache,n=i.get(t);return n&&!e||(n=new Map,i.set(t,n)),n}},{key:"getOptionScopes",value:function(t,e,i){var n=this.options,r=this.type,a=this._cachedScopes(t,i),o=a.get(e);if(o)return o;var s=new Set;e.forEach((function(e){t&&(s.add(t),e.forEach((function(e){return le(s,t,e)}))),e.forEach((function(t){return le(s,n,t)})),e.forEach((function(t){return le(s,g.a3[r]||{},t)})),e.forEach((function(t){return le(s,g.d,t)})),e.forEach((function(t){return le(s,g.a6,t)}))}));var l=Array.from(s);return 0===l.length&&l.push(Object.create(null)),oe.has(e)&&a.set(e,l),l}},{key:"chartOptionScopes",value:function(){var t=this.options,e=this.type;return[t,g.a3[e]||{},g.d.datasets[e]||{},{type:e},g.d,g.a6]}},{key:"resolveNamedOptions",value:function(t,e,i){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:[""],r={$shared:!0},a=he(this._resolverCache,t,n),o=a.resolver,s=a.subPrefixes,l=o;if(function(t,e){var i,n=(0,g.aa)(t),r=n.isScriptable,a=n.isIndexable,o=(0,c.Z)(e);try{for(o.s();!(i=o.n()).done;){var s=i.value,l=r(s),u=a(s),h=(u||l)&&t[s];if(l&&((0,g.a7)(h)||ce(h))||u&&(0,g.b)(h))return!0}}catch(d){o.e(d)}finally{o.f()}return!1}(o,e)){r.$shared=!1,i=(0,g.a7)(i)?i():i;var u=this.createResolver(t,i,s);l=(0,g.a8)(o,i,u)}var h,d=(0,c.Z)(e);try{for(d.s();!(h=d.n()).done;){var f=h.value;r[f]=l[f]}}catch(v){d.e(v)}finally{d.f()}return r}},{key:"createResolver",value:function(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:[""],n=arguments.length>3?arguments[3]:void 0,r=he(this._resolverCache,t,i).resolver;return(0,g.i)(e)?(0,g.a8)(r,e,void 0,n):r}}]),t}();function he(t,e,i){var n=t.get(e);n||(n=new Map,t.set(e,n));var r=i.join(),a=n.get(r);a||(a={resolver:(0,g.a9)(e,i),subPrefixes:i.filter((function(t){return!t.toLowerCase().includes("hover")}))},n.set(r,a));return a}var ce=function(t){return(0,g.i)(t)&&Object.getOwnPropertyNames(t).reduce((function(e,i){return e||(0,g.a7)(t[i])}),!1)};var de=["top","bottom","left","right","chartArea"];function fe(t,e){return"top"===t||"bottom"===t||-1===de.indexOf(t)&&"x"===e}function ve(t,e){return function(i,n){return i[t]===n[t]?i[e]-n[e]:i[t]-n[t]}}function ge(t){var e=t.chart,i=e.options.animation;e.notifyPlugins("afterRender"),(0,g.Q)(i&&i.onComplete,[t],e)}function pe(t){var e=t.chart,i=e.options.animation;(0,g.Q)(i&&i.onProgress,[t],e)}function ye(t){return(0,g.M)()&&"string"===typeof t?t=document.getElementById(t):t&&t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas),t}var me={},be=function(t){var e=ye(t);return Object.values(me).filter((function(t){return t.canvas===e})).pop()};function xe(t,e,i){for(var n=0,r=Object.keys(t);n=e){var s=t[a];delete t[a],(i>0||o>e)&&(t[o+i]=s)}}}function ke(t,e,i){return t.options.clip?t[i]:e[i]}var _e=function(){function t(e,i){var n=this;(0,f.Z)(this,t);var r=this.config=new ue(i),a=ye(e),o=be(a);if(o)throw new Error("Canvas is already in use. Chart with ID '"+o.id+"' must be destroyed before the canvas with ID '"+o.canvas.id+"' can be reused.");var s=r.createResolver(r.chartOptionScopes(),this.getContext());this.platform=new(r.platform||function(t){return!(0,g.M)()||"undefined"!==typeof OffscreenCanvas&&t instanceof OffscreenCanvas?bt:Lt}(a)),this.platform.updateConfig(r);var l=this.platform.acquireContext(a,s.aspectRatio),u=l&&l.canvas,h=u&&u.height,c=u&&u.width;this.id=(0,g.ac)(),this.ctx=l,this.canvas=u,this.width=c,this.height=h,this._options=s,this._aspectRatio=this.aspectRatio,this._layers=[],this._metasets=[],this._stacks=void 0,this.boxes=[],this.currentDevicePixelRatio=void 0,this.chartArea=void 0,this._active=[],this._lastEvent=void 0,this._listeners={},this._responsiveListeners=void 0,this._sortedMetasets=[],this.scales={},this._plugins=new Kt,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=(0,g.ad)((function(t){return n.update(t)}),s.resizeDelay||0),this._dataChanges=[],me[this.id]=this,l&&u?(y.listen(this,"complete",ge),y.listen(this,"progress",pe),this._initialize(),this.attached&&this.update()):console.error("Failed to create chart: can't acquire context from the given item")}return(0,v.Z)(t,[{key:"aspectRatio",get:function(){var t=this.options,e=t.aspectRatio,i=t.maintainAspectRatio,n=this.width,r=this.height,a=this._aspectRatio;return(0,g.k)(e)?i&&a?a:r?n/r:null:e}},{key:"data",get:function(){return this.config.data},set:function(t){this.config.data=t}},{key:"options",get:function(){return this._options},set:function(t){this.config.options=t}},{key:"registry",get:function(){return $t}},{key:"_initialize",value:function(){return this.notifyPlugins("beforeInit"),this.options.responsive?this.resize():(0,g.ae)(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins("afterInit"),this}},{key:"clear",value:function(){return(0,g.af)(this.canvas,this.ctx),this}},{key:"stop",value:function(){return y.stop(this),this}},{key:"resize",value:function(t,e){y.running(this)?this._resizeBeforeDraw={width:t,height:e}:this._resize(t,e)}},{key:"_resize",value:function(t,e){var i=this.options,n=this.canvas,r=i.maintainAspectRatio&&this.aspectRatio,a=this.platform.getMaximumSize(n,t,e,r),o=i.devicePixelRatio||this.platform.getDevicePixelRatio(),s=this.width?"resize":"attach";this.width=a.width,this.height=a.height,this._aspectRatio=this.aspectRatio,(0,g.ae)(this,o,!0)&&(this.notifyPlugins("resize",{size:a}),(0,g.Q)(i.onResize,[this,a],this),this.attached&&this._doResize(s)&&this.render())}},{key:"ensureScalesHaveIDs",value:function(){var t=this.options.scales||{};(0,g.F)(t,(function(t,e){t.id=e}))}},{key:"buildOrUpdateScales",value:function(){var t=this,e=this.options,i=e.scales,n=this.scales,r=Object.keys(n).reduce((function(t,e){return t[e]=!1,t}),{}),a=[];i&&(a=a.concat(Object.keys(i).map((function(t){var e=i[t],n=te(t,e),r="r"===n,a="x"===n;return{options:e,dposition:r?"chartArea":a?"bottom":"left",dtype:r?"radialLinear":a?"category":"linear"}})))),(0,g.F)(a,(function(i){var a=i.options,o=a.id,s=te(o,a),l=(0,g.v)(a.type,i.dtype);void 0!==a.position&&fe(a.position,s)===fe(i.dposition)||(a.position=i.dposition),r[o]=!0;var u=null;o in n&&n[o].type===l?u=n[o]:(u=new($t.getScale(l))({id:o,type:l,ctx:t.ctx,chart:t}),n[u.id]=u);u.init(a,e)})),(0,g.F)(r,(function(t,e){t||delete n[e]})),(0,g.F)(n,(function(e){yt.configure(t,e,e.options),yt.addBox(t,e)}))}},{key:"_updateMetasets",value:function(){var t=this._metasets,e=this.data.datasets.length,i=t.length;if(t.sort((function(t,e){return t.index-e.index})),i>e){for(var n=e;ni.length&&delete this._stacks,e.forEach((function(e,n){0===i.filter((function(t){return t===e._dataset})).length&&t._destroyDatasetMeta(n)}))}},{key:"buildOrUpdateControllers",value:function(){var t,e,i=[],n=this.data.datasets;for(this._removeUnreferencedMetasets(),t=0,e=n.length;t=0;--e)this._drawDataset(t[e]);this.notifyPlugins("afterDatasetsDraw")}}},{key:"_drawDataset",value:function(t){var e=this.ctx,i=t._clip,n=!i.disabled,r=function(t,e){var i=t.xScale,n=t.yScale;return i&&n?{left:ke(i,e,"left"),right:ke(i,e,"right"),top:ke(n,e,"top"),bottom:ke(n,e,"bottom")}:e}(t,this.chartArea),a={meta:t,index:t.index,cancelable:!0};!1!==this.notifyPlugins("beforeDatasetDraw",a)&&(n&&(0,g.Y)(e,{left:!1===i.left?0:r.left-i.left,right:!1===i.right?this.width:r.right+i.right,top:!1===i.top?0:r.top-i.top,bottom:!1===i.bottom?this.height:r.bottom+i.bottom}),t.controller.draw(),n&&(0,g.$)(e),a.cancelable=!1,this.notifyPlugins("afterDatasetDraw",a))}},{key:"isPointInArea",value:function(t){return(0,g.C)(t,this.chartArea,this._minPadding)}},{key:"getElementsAtEventForMode",value:function(t,e,i,n){var r=rt.modes[e];return"function"===typeof r?r(this,t,i,n):[]}},{key:"getDatasetMeta",value:function(t){var e=this.data.datasets[t],i=this._metasets,n=i.filter((function(t){return t&&t._dataset===e})).pop();return n||(n={type:null,data:[],dataset:null,controller:null,hidden:null,xAxisID:null,yAxisID:null,order:e&&e.order||0,index:t,_dataset:e,_parsed:[],_sorted:!1},i.push(n)),n}},{key:"getContext",value:function(){return this.$context||(this.$context=(0,g.j)(null,{chart:this,type:"chart"}))}},{key:"getVisibleDatasetCount",value:function(){return this.getSortedVisibleDatasetMetas().length}},{key:"isDatasetVisible",value:function(t){var e=this.data.datasets[t];if(!e)return!1;var i=this.getDatasetMeta(t);return"boolean"===typeof i.hidden?!i.hidden:!e.hidden}},{key:"setDatasetVisibility",value:function(t,e){this.getDatasetMeta(t).hidden=!e}},{key:"toggleDataVisibility",value:function(t){this._hiddenIndices[t]=!this._hiddenIndices[t]}},{key:"getDataVisibility",value:function(t){return!this._hiddenIndices[t]}},{key:"_updateVisibility",value:function(t,e,i){var n=i?"show":"hide",r=this.getDatasetMeta(t),a=r.controller._resolveAnimations(void 0,n);(0,g.h)(e)?(r.data[e].hidden=!i,this.update()):(this.setDatasetVisibility(t,i),a.update(r,{visible:i}),this.update((function(e){return e.datasetIndex===t?n:void 0})))}},{key:"hide",value:function(t,e){this._updateVisibility(t,e,!1)}},{key:"show",value:function(t,e){this._updateVisibility(t,e,!0)}},{key:"_destroyDatasetMeta",value:function(t){var e=this._metasets[t];e&&e.controller&&e.controller._destroy(),delete this._metasets[t]}},{key:"_stop",value:function(){var t,e;for(this.stop(),y.remove(this),t=0,e=this.data.datasets.length;t0?h+n+i+u:0,f=0,v=r-l;if(n){var p=((h>0?h-n:0)+(c>0?c-n:0))/2;f=(v-(0!==p?v*p/(p+n):v))/2}var y=(v-Math.max(.001,v*c-i/g.P)/c)/2,m=l+y+f,b=r-y-f,x=Me(e,d,c,b-m),k=x.outerStart,_=x.outerEnd,w=x.innerStart,M=x.innerEnd,S=c-k,P=c-_,O=m+k/S,C=b-_/P,D=d+w,A=d+M,T=m+w/D,E=b-M/A;if(t.beginPath(),a){var Z=(O+C)/2;if(t.arc(o,s,c,O,Z),t.arc(o,s,c,Z,C),_>0){var L=Se(P,C,o,s);t.arc(L.x,L.y,_,C,b+g.H)}var R=Se(A,b,o,s);if(t.lineTo(R.x,R.y),M>0){var I=Se(A,E,o,s);t.arc(I.x,I.y,M,b+g.H,E+Math.PI)}var F=(b-M/d+(m+w/d))/2;if(t.arc(o,s,d,b-M/d,F,!0),t.arc(o,s,d,F,m+w/d,!0),w>0){var z=Se(D,T,o,s);t.arc(z.x,z.y,w,T+Math.PI,m-g.H)}var j=Se(S,m,o,s);if(t.lineTo(j.x,j.y),k>0){var W=Se(S,O,o,s);t.arc(W.x,W.y,k,m-g.H,O)}}else{t.moveTo(o,s);var V=Math.cos(O)*c+o,N=Math.sin(O)*c+s;t.lineTo(V,N);var B=Math.cos(C)*c+o,H=Math.sin(C)*c+s;t.lineTo(B,H)}t.closePath()}function Oe(t,e,i,n,r){var a=e.fullCircles,o=e.startAngle,s=e.circumference,l=e.options,u=l.borderWidth,h=l.borderJoinStyle,c=l.borderDash,d=l.borderDashOffset,f="inner"===l.borderAlign;if(u){t.setLineDash(c||[]),t.lineDashOffset=d,f?(t.lineWidth=2*u,t.lineJoin=h||"round"):(t.lineWidth=u,t.lineJoin=h||"bevel");var v=e.endAngle;if(a){Pe(t,e,i,n,v,r);for(var p=0;pr?(u=r/l,t.arc(a,o,l,i+u,n-u,!0)):t.arc(a,o,r,i+g.H,n-g.H),t.closePath(),t.clip()}(t,e,v),a||(Pe(t,e,i,n,v,r),t.stroke())}}(0,h.Z)(_e,"defaults",g.d),(0,h.Z)(_e,"instances",me),(0,h.Z)(_e,"overrides",g.a3),(0,h.Z)(_e,"registry",$t),(0,h.Z)(_e,"version","4.4.0"),(0,h.Z)(_e,"getChart",be);var Ce=function(t){(0,s.Z)(i,t);var e=(0,l.Z)(i);function i(t){var n;return(0,f.Z)(this,i),n=e.call(this),(0,h.Z)((0,r.Z)(n),"circumference",void 0),(0,h.Z)((0,r.Z)(n),"endAngle",void 0),(0,h.Z)((0,r.Z)(n),"fullCircles",void 0),(0,h.Z)((0,r.Z)(n),"innerRadius",void 0),(0,h.Z)((0,r.Z)(n),"outerRadius",void 0),(0,h.Z)((0,r.Z)(n),"pixelMargin",void 0),(0,h.Z)((0,r.Z)(n),"startAngle",void 0),n.options=void 0,n.circumference=void 0,n.startAngle=void 0,n.endAngle=void 0,n.innerRadius=void 0,n.outerRadius=void 0,n.pixelMargin=0,n.fullCircles=0,t&&Object.assign((0,r.Z)(n),t),n}return(0,v.Z)(i,[{key:"inRange",value:function(t,e,i){var n=this.getProps(["x","y"],i),r=(0,g.D)(n,{x:t,y:e}),a=r.angle,o=r.distance,s=this.getProps(["startAngle","endAngle","innerRadius","outerRadius","circumference"],i),l=s.startAngle,u=s.endAngle,h=s.innerRadius,c=s.outerRadius,d=s.circumference,f=(this.options.spacing+this.options.borderWidth)/2,v=(0,g.v)(d,u-l)>=g.T||(0,g.p)(a,l,u),p=(0,g.aj)(o,h+f,c+f);return v&&p}},{key:"getCenterPoint",value:function(t){var e=this.getProps(["x","y","startAngle","endAngle","innerRadius","outerRadius"],t),i=e.x,n=e.y,r=e.startAngle,a=e.endAngle,o=e.innerRadius,s=e.outerRadius,l=this.options,u=l.offset,h=(r+a)/2,c=(o+s+l.spacing+u)/2;return{x:i+Math.cos(h)*c,y:n+Math.sin(h)*c}}},{key:"tooltipPosition",value:function(t){return this.getCenterPoint(t)}},{key:"draw",value:function(t){var e=this.options,i=this.circumference,n=(e.offset||0)/4,r=(e.spacing||0)/2,a=e.circular;if(this.pixelMargin="inner"===e.borderAlign?.33:0,this.fullCircles=i>g.T?Math.floor(i/g.T):0,!(0===i||this.innerRadius<0||this.outerRadius<0)){t.save();var o=(this.startAngle+this.endAngle)/2;t.translate(Math.cos(o)*n,Math.sin(o)*n);var s=n*(1-Math.sin(Math.min(g.P,i||0)));t.fillStyle=e.backgroundColor,t.strokeStyle=e.borderColor,function(t,e,i,n,r){var a=e.fullCircles,o=e.startAngle,s=e.circumference,l=e.endAngle;if(a){Pe(t,e,i,n,l,r);for(var u=0;u2&&void 0!==arguments[2]?arguments[2]:e;t.lineCap=(0,g.v)(i.borderCapStyle,e.borderCapStyle),t.setLineDash((0,g.v)(i.borderDash,e.borderDash)),t.lineDashOffset=(0,g.v)(i.borderDashOffset,e.borderDashOffset),t.lineJoin=(0,g.v)(i.borderJoinStyle,e.borderJoinStyle),t.lineWidth=(0,g.v)(i.borderWidth,e.borderWidth),t.strokeStyle=(0,g.v)(i.borderColor,e.borderColor)}function Ae(t,e,i){t.lineTo(i.x,i.y)}function Te(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{},n=t.length,r=i.start,a=void 0===r?0:r,o=i.end,s=void 0===o?n-1:o,l=e.start,u=e.end,h=Math.max(a,l),c=Math.min(s,u),d=au&&s>u;return{count:n,start:h,loop:e.loop,ilen:cl&&(l=M),b=(x*b+w)/++x):(_(),t.lineTo(w,M),o=S,x=0,s=l=M),u=M}_()}function Le(t){var e=t.options,i=e.borderDash&&e.borderDash.length;return!t._decimated&&!t._loop&&!e.tension&&"monotone"!==e.cubicInterpolationMode&&!e.stepped&&!i?Ze:Ee}(0,h.Z)(Ce,"id","arc"),(0,h.Z)(Ce,"defaults",{borderAlign:"center",borderColor:"#fff",borderDash:[],borderDashOffset:0,borderJoinStyle:void 0,borderRadius:0,borderWidth:2,offset:0,spacing:0,angle:void 0,circular:!0}),(0,h.Z)(Ce,"defaultRoutes",{backgroundColor:"backgroundColor"}),(0,h.Z)(Ce,"descriptors",{_scriptable:!0,_indexable:function(t){return"borderDash"!==t}});var Re="function"===typeof Path2D;function Ie(t,e,i,n){Re&&!e.options.segment?function(t,e,i,n){var r=e._path;r||(r=e._path=new Path2D,e.path(r,i,n)&&r.closePath()),De(t,e.options),t.stroke(r)}(t,e,i,n):function(t,e,i,n){var r,a=e.segments,o=e.options,s=Le(e),l=(0,c.Z)(a);try{for(l.s();!(r=l.n()).done;){var u=r.value;De(t,o,u.style),t.beginPath(),s(t,e,u,{start:i,end:i+n-1})&&t.closePath(),t.stroke()}}catch(h){l.e(h)}finally{l.f()}}(t,e,i,n)}var Fe=function(t){(0,s.Z)(i,t);var e=(0,l.Z)(i);function i(t){var n;return(0,f.Z)(this,i),(n=e.call(this)).animated=!0,n.options=void 0,n._chart=void 0,n._loop=void 0,n._fullLoop=void 0,n._path=void 0,n._points=void 0,n._segments=void 0,n._decimated=!1,n._pointsUpdated=!1,n._datasetIndex=void 0,t&&Object.assign((0,r.Z)(n),t),n}return(0,v.Z)(i,[{key:"updateControlPoints",value:function(t,e){var i=this.options;if((i.tension||"monotone"===i.cubicInterpolationMode)&&!i.stepped&&!this._pointsUpdated){var n=i.spanGaps?this._loop:this._fullLoop;(0,g.al)(this._points,i,t,n,e),this._pointsUpdated=!0}}},{key:"points",get:function(){return this._points},set:function(t){this._points=t,delete this._segments,delete this._path,this._pointsUpdated=!1}},{key:"segments",get:function(){return this._segments||(this._segments=(0,g.am)(this,this.options.segment))}},{key:"first",value:function(){var t=this.segments,e=this.points;return t.length&&e[t[0].start]}},{key:"last",value:function(){var t=this.segments,e=this.points,i=t.length;return i&&e[t[i-1].end]}},{key:"interpolate",value:function(t,e){var i=this.options,n=t[e],r=this.points,a=(0,g.an)(this,{property:e,start:n,end:n});if(a.length){var o,s,l=[],u=function(t){return t.stepped?g.ao:t.tension||"monotone"===t.cubicInterpolationMode?g.ap:g.aq}(i);for(o=0,s=a.length;o2&&void 0!==arguments[2]?arguments[2]:{},n=t.x!==i.x?-e:0,r=t.y!==i.y?-e:0,a=(t.x+t.w!==i.x+i.w?e:0)-n,o=(t.y+t.h!==i.y+i.h?e:0)-r;return{x:t.x+n,y:t.y+r,w:t.w+a,h:t.h+o,radius:t.radius}}(0,h.Z)(je,"id","point"),(0,h.Z)(je,"defaults",{borderWidth:1,hitRadius:1,hoverBorderWidth:1,hoverRadius:4,pointStyle:"circle",radius:3,rotation:0}),(0,h.Z)(je,"defaultRoutes",{backgroundColor:"backgroundColor",borderColor:"borderColor"});var Xe=function(t){(0,s.Z)(i,t);var e=(0,l.Z)(i);function i(t){var n;return(0,f.Z)(this,i),(n=e.call(this)).options=void 0,n.horizontal=void 0,n.base=void 0,n.width=void 0,n.height=void 0,n.inflateAmount=void 0,t&&Object.assign((0,r.Z)(n),t),n}return(0,v.Z)(i,[{key:"draw",value:function(t){var e,i=this.inflateAmount,n=this.options,r=n.borderColor,a=n.backgroundColor,o=Ne(this),s=o.inner,l=o.outer,u=(e=l.radius).topLeft||e.topRight||e.bottomLeft||e.bottomRight?g.au:He;t.save(),l.w===s.w&&l.h===s.h||(t.beginPath(),u(t,Ye(l,i,s)),t.clip(),u(t,Ye(s,-i,l)),t.fillStyle=r,t.fill("evenodd")),t.beginPath(),u(t,Ye(s,i)),t.fillStyle=a,t.fill(),t.restore()}},{key:"inRange",value:function(t,e,i){return Be(this,t,e,i)}},{key:"inXRange",value:function(t,e){return Be(this,t,null,e)}},{key:"inYRange",value:function(t,e){return Be(this,null,t,e)}},{key:"getCenterPoint",value:function(t){var e=this.getProps(["x","y","base","horizontal"],t),i=e.x,n=e.y,r=e.base,a=e.horizontal;return{x:a?(i+r)/2:i,y:a?n:(n+r)/2}}},{key:"getRange",value:function(t){return"x"===t?this.width/2:this.height/2}}]),i}(Rt);(0,h.Z)(Xe,"id","bar"),(0,h.Z)(Xe,"defaults",{borderSkipped:"start",borderWidth:0,borderRadius:0,inflateAmount:"auto",pointStyle:void 0}),(0,h.Z)(Xe,"defaultRoutes",{backgroundColor:"backgroundColor",borderColor:"borderColor"});var Ue=function(t,e){var i=t.boxHeight,n=void 0===i?e:i,r=t.boxWidth,a=void 0===r?e:r;return t.usePointStyle&&(n=Math.min(n,e),a=t.pointStyleWidth||Math.min(a,e)),{boxWidth:a,boxHeight:n,itemHeight:Math.max(e,n)}},$e=function(t){(0,s.Z)(i,t);var e=(0,l.Z)(i);function i(t){var n;return(0,f.Z)(this,i),(n=e.call(this))._added=!1,n.legendHitBoxes=[],n._hoveredItem=null,n.doughnutMode=!1,n.chart=t.chart,n.options=t.options,n.ctx=t.ctx,n.legendItems=void 0,n.columnSizes=void 0,n.lineWidths=void 0,n.maxHeight=void 0,n.maxWidth=void 0,n.top=void 0,n.bottom=void 0,n.left=void 0,n.right=void 0,n.height=void 0,n.width=void 0,n._margins=void 0,n.position=void 0,n.weight=void 0,n.fullSize=void 0,n}return(0,v.Z)(i,[{key:"update",value:function(t,e,i){this.maxWidth=t,this.maxHeight=e,this._margins=i,this.setDimensions(),this.buildLabels(),this.fit()}},{key:"setDimensions",value:function(){this.isHorizontal()?(this.width=this.maxWidth,this.left=this._margins.left,this.right=this.width):(this.height=this.maxHeight,this.top=this._margins.top,this.bottom=this.height)}},{key:"buildLabels",value:function(){var t=this,e=this.options.labels||{},i=(0,g.Q)(e.generateLabels,[this.chart],this)||[];e.filter&&(i=i.filter((function(i){return e.filter(i,t.chart.data)}))),e.sort&&(i=i.sort((function(i,n){return e.sort(i,n,t.chart.data)}))),this.options.reverse&&i.reverse(),this.legendItems=i}},{key:"fit",value:function(){var t=this.options,e=this.ctx;if(t.display){var i,n,r=t.labels,a=(0,g.a0)(r.font),o=a.size,s=this._computeTitleHeight(),l=Ue(r,o),u=l.boxWidth,h=l.itemHeight;e.font=a.string,this.isHorizontal()?(i=this.maxWidth,n=this._fitRows(s,o,u,h)+10):(n=this.maxHeight,i=this._fitCols(s,a,u,h)+10),this.width=Math.min(i,t.maxWidth||this.maxWidth),this.height=Math.min(n,t.maxHeight||this.maxHeight)}else this.width=this.height=0}},{key:"_fitRows",value:function(t,e,i,n){var r=this.ctx,a=this.maxWidth,o=this.options.labels.padding,s=this.legendHitBoxes=[],l=this.lineWidths=[0],u=n+o,h=t;r.textAlign="left",r.textBaseline="middle";var c=-1,d=-u;return this.legendItems.forEach((function(t,f){var v=i+e/2+r.measureText(t.text).width;(0===f||l[l.length-1]+v+2*o>a)&&(h+=u,l[l.length-(f>0?0:1)]=0,d+=u,c++),s[f]={left:0,top:d,row:c,width:v,height:n},l[l.length-1]+=v+o})),h}},{key:"_fitCols",value:function(t,e,i,n){var r=this.ctx,a=this.maxHeight,o=this.options.labels.padding,s=this.legendHitBoxes=[],l=this.columnSizes=[],u=a-t,h=o,c=0,d=0,f=0,v=0;return this.legendItems.forEach((function(t,a){var g=function(t,e,i,n,r){var a=function(t,e,i,n){var r=t.text;r&&"string"!==typeof r&&(r=r.reduce((function(t,e){return t.length>e.length?t:e})));return e+i.size/2+n.measureText(r).width}(n,t,e,i),o=function(t,e,i){var n=t;"string"!==typeof e.text&&(n=Ke(e,i));return n}(r,n,e.lineHeight);return{itemWidth:a,itemHeight:o}}(i,e,r,t,n),p=g.itemWidth,y=g.itemHeight;a>0&&d+y+2*o>u&&(h+=c+o,l.push({width:c,height:d}),f+=c+o,v++,c=d=0),s[a]={left:f,top:d,col:v,width:p,height:y},c=Math.max(c,p),d+=y+o})),h+=c,l.push({width:c,height:d}),h}},{key:"adjustHitBoxes",value:function(){if(this.options.display){var t=this._computeTitleHeight(),e=this.legendHitBoxes,i=this.options,n=i.align,r=i.labels.padding,a=i.rtl,o=(0,g.az)(a,this.left,this.width);if(this.isHorizontal()){var s,l=0,u=(0,g.a2)(n,this.left+r,this.right-this.lineWidths[l]),h=(0,c.Z)(e);try{for(h.s();!(s=h.n()).done;){var d=s.value;l!==d.row&&(l=d.row,u=(0,g.a2)(n,this.left+r,this.right-this.lineWidths[l])),d.top+=this.top+t+r,d.left=o.leftForLtr(o.x(u),d.width),u+=d.width+r}}catch(b){h.e(b)}finally{h.f()}}else{var f,v=0,p=(0,g.a2)(n,this.top+t+r,this.bottom-this.columnSizes[v].height),y=(0,c.Z)(e);try{for(y.s();!(f=y.n()).done;){var m=f.value;m.col!==v&&(v=m.col,p=(0,g.a2)(n,this.top+t+r,this.bottom-this.columnSizes[v].height)),m.top=p,m.left+=this.left+r,m.left=o.leftForLtr(o.x(m.left),m.width),p+=m.height+r}}catch(b){y.e(b)}finally{y.f()}}}}},{key:"isHorizontal",value:function(){return"top"===this.options.position||"bottom"===this.options.position}},{key:"draw",value:function(){if(this.options.display){var t=this.ctx;(0,g.Y)(t,this),this._draw(),(0,g.$)(t)}}},{key:"_draw",value:function(){var t,e=this,i=this.options,n=this.columnSizes,r=this.lineWidths,a=this.ctx,o=i.align,s=i.labels,l=g.d.color,u=(0,g.az)(i.rtl,this.left,this.width),h=(0,g.a0)(s.font),c=s.padding,d=h.size,f=d/2;this.drawTitle(),a.textAlign=u.textAlign("left"),a.textBaseline="middle",a.lineWidth=.5,a.font=h.string;var v=Ue(s,d),p=v.boxWidth,y=v.boxHeight,m=v.itemHeight,b=this.isHorizontal(),x=this._computeTitleHeight();t=b?{x:(0,g.a2)(o,this.left+c,this.right-r[0]),y:this.top+c+x,line:0}:{x:this.left+c,y:(0,g.a2)(o,this.top+x+c,this.bottom-n[0].height),line:0},(0,g.aA)(this.ctx,i.textDirection);var k=m+c;this.legendItems.forEach((function(v,_){a.strokeStyle=v.fontColor,a.fillStyle=v.fontColor;var w=a.measureText(v.text).width,M=u.textAlign(v.textAlign||(v.textAlign=s.textAlign)),S=p+f+w,P=t.x,O=t.y;if(u.setWidth(e.width),b?_>0&&P+S+c>e.right&&(O=t.y+=k,t.line++,P=t.x=(0,g.a2)(o,e.left+c,e.right-r[t.line])):_>0&&O+k>e.bottom&&(P=t.x=P+n[t.line].width+c,t.line++,O=t.y=(0,g.a2)(o,e.top+x+c,e.bottom-n[t.line].height)),function(t,e,i){if(!(isNaN(p)||p<=0||isNaN(y)||y<0)){a.save();var n=(0,g.v)(i.lineWidth,1);if(a.fillStyle=(0,g.v)(i.fillStyle,l),a.lineCap=(0,g.v)(i.lineCap,"butt"),a.lineDashOffset=(0,g.v)(i.lineDashOffset,0),a.lineJoin=(0,g.v)(i.lineJoin,"miter"),a.lineWidth=n,a.strokeStyle=(0,g.v)(i.strokeStyle,l),a.setLineDash((0,g.v)(i.lineDash,[])),s.usePointStyle){var r={radius:y*Math.SQRT2/2,pointStyle:i.pointStyle,rotation:i.rotation,borderWidth:n},o=u.xPlus(t,p/2),h=e+f;(0,g.aD)(a,r,o,h,s.pointStyleWidth&&p)}else{var c=e+Math.max((d-y)/2,0),v=u.leftForLtr(t,p),m=(0,g.aw)(i.borderRadius);a.beginPath(),Object.values(m).some((function(t){return 0!==t}))?(0,g.au)(a,{x:v,y:c,w:p,h:y,radius:m}):a.rect(v,c,p,y),a.fill(),0!==n&&a.stroke()}a.restore()}}(u.x(P),O,v),P=(0,g.aB)(M,P+p+f,b?P+S:e.right,i.rtl),function(t,e,i){(0,g.Z)(a,i.text,t,e+m/2,h,{strikethrough:i.hidden,textAlign:u.textAlign(i.textAlign)})}(u.x(P),O,v),b)t.x+=S+c;else if("string"!==typeof v.text){var C=h.lineHeight;t.y+=Ke(v,C)+c}else t.y+=k})),(0,g.aC)(this.ctx,i.textDirection)}},{key:"drawTitle",value:function(){var t=this.options,e=t.title,i=(0,g.a0)(e.font),n=(0,g.E)(e.padding);if(e.display){var r,a=(0,g.az)(t.rtl,this.left,this.width),o=this.ctx,s=e.position,l=i.size/2,u=n.top+l,h=this.left,c=this.width;if(this.isHorizontal())c=Math.max.apply(Math,(0,d.Z)(this.lineWidths)),r=this.top+u,h=(0,g.a2)(t.align,h,this.right-c);else{var f=this.columnSizes.reduce((function(t,e){return Math.max(t,e.height)}),0);r=u+(0,g.a2)(t.align,this.top,this.bottom-f-t.labels.padding-this._computeTitleHeight())}var v=(0,g.a2)(s,h,h+c);o.textAlign=a.textAlign((0,g.a1)(s)),o.textBaseline="middle",o.strokeStyle=e.color,o.fillStyle=e.color,o.font=i.string,(0,g.Z)(o,e.text,v,r,i)}}},{key:"_computeTitleHeight",value:function(){var t=this.options.title,e=(0,g.a0)(t.font),i=(0,g.E)(t.padding);return t.display?e.lineHeight+i.height:0}},{key:"_getLegendItemAt",value:function(t,e){var i,n,r;if((0,g.aj)(t,this.left,this.right)&&(0,g.aj)(e,this.top,this.bottom))for(r=this.legendHitBoxes,i=0;i-1?t.split("\n"):t}function ti(t,e){var i=e.element,n=e.datasetIndex,r=e.index,a=t.getDatasetMeta(n).controller,o=a.getLabelAndValue(r),s=o.label,l=o.value;return{chart:t,label:s,parsed:a.getParsed(r),raw:t.data.datasets[n].data[r],formattedValue:l,dataset:a.getDataset(),dataIndex:r,datasetIndex:n,element:i}}function ei(t,e){var i=t.chart.ctx,n=t.body,r=t.footer,a=t.title,o=e.boxWidth,s=e.boxHeight,l=(0,g.a0)(e.bodyFont),u=(0,g.a0)(e.titleFont),h=(0,g.a0)(e.footerFont),c=a.length,d=r.length,f=n.length,v=(0,g.E)(e.padding),p=v.height,y=0,m=n.reduce((function(t,e){return t+e.before.length+e.lines.length+e.after.length}),0);(m+=t.beforeBody.length+t.afterBody.length,c&&(p+=c*u.lineHeight+(c-1)*e.titleSpacing+e.titleMarginBottom),m)&&(p+=f*(e.displayColors?Math.max(s,l.lineHeight):l.lineHeight)+(m-f)*l.lineHeight+(m-1)*e.bodySpacing);d&&(p+=e.footerMarginTop+d*h.lineHeight+(d-1)*e.footerSpacing);var b=0,x=function(t){y=Math.max(y,i.measureText(t).width+b)};return i.save(),i.font=u.string,(0,g.F)(t.title,x),i.font=l.string,(0,g.F)(t.beforeBody.concat(t.afterBody),x),b=e.displayColors?o+2+e.boxPadding:0,(0,g.F)(n,(function(t){(0,g.F)(t.before,x),(0,g.F)(t.lines,x),(0,g.F)(t.after,x)})),b=0,i.font=h.string,(0,g.F)(t.footer,x),i.restore(),{width:y+=v.width,height:p}}function ii(t,e,i,n){var r=i.x,a=i.width,o=t.width,s=t.chartArea,l=s.left,u=s.right,h="center";return"center"===n?h=r<=(l+u)/2?"left":"right":r<=a/2?h="left":r>=o-a/2&&(h="right"),function(t,e,i,n){var r=n.x,a=n.width,o=i.caretSize+i.caretPadding;return"left"===t&&r+a+o>e.width||"right"===t&&r-a-o<0||void 0}(h,t,e,i)&&(h="center"),h}function ni(t,e,i){var n=i.yAlign||e.yAlign||function(t,e){var i=e.y,n=e.height;return it.height-n/2?"bottom":"center"}(t,i);return{xAlign:i.xAlign||e.xAlign||ii(t,e,i,n),yAlign:n}}function ri(t,e,i,n){var r=t.caretSize,a=t.caretPadding,o=t.cornerRadius,s=i.xAlign,l=i.yAlign,u=r+a,h=(0,g.aw)(o),c=h.topLeft,d=h.topRight,f=h.bottomLeft,v=h.bottomRight,p=function(t,e){var i=t.x,n=t.width;return"right"===e?i-=n:"center"===e&&(i-=n/2),i}(e,s),y=function(t,e,i){var n=t.y,r=t.height;return"top"===e?n+=i:n-="bottom"===e?r+i:r/2,n}(e,l,u);return"center"===l?"left"===s?p+=u:"right"===s&&(p-=u):"left"===s?p-=Math.max(c,f)+r:"right"===s&&(p+=Math.max(d,v)+r),{x:(0,g.S)(p,0,n.width-e.width),y:(0,g.S)(y,0,n.height-e.height)}}function ai(t,e,i){var n=(0,g.E)(i.padding);return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-n.right:t.x+n.left}function oi(t){return Je([],Ge(t))}function si(t,e){var i=e&&e.dataset&&e.dataset.tooltip&&e.dataset.tooltip.callbacks;return i?t.override(i):t}var li={beforeTitle:g.aF,title:function(t){if(t.length>0){var e=t[0],i=e.chart.data.labels,n=i?i.length:0;if(this&&this.options&&"dataset"===this.options.mode)return e.dataset.label||"";if(e.label)return e.label;if(n>0&&e.dataIndex0&&e.stroke()}},{key:"_updateAnimationTarget",value:function(t){var e=this.chart,i=this.$animations,n=i&&i.x,r=i&&i.y;if(n||r){var a=qe[t.position].call(this,this._active,this._eventPosition);if(!a)return;var o=this._size=ei(this,t),s=Object.assign({},a,this._size),l=ni(e,t,s),u=ri(t,s,l,e);n._to===u.x&&r._to===u.y||(this.xAlign=l.xAlign,this.yAlign=l.yAlign,this.width=o.width,this.height=o.height,this.caretX=a.x,this.caretY=a.y,this._resolveAnimations().update(this,u))}}},{key:"_willRender",value:function(){return!!this.opacity}},{key:"draw",value:function(t){var e=this.options.setContext(this.getContext()),i=this.opacity;if(i){this._updateAnimationTarget(e);var n={width:this.width,height:this.height},r={x:this.x,y:this.y};i=Math.abs(i)<.001?0:i;var a=(0,g.E)(e.padding),o=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;e.enabled&&o&&(t.save(),t.globalAlpha=i,this.drawBackground(r,t,n,e),(0,g.aA)(t,e.textDirection),r.y+=a.top,this.drawTitle(r,t,e),this.drawBody(r,t,e),this.drawFooter(r,t,e),(0,g.aC)(t,e.textDirection),t.restore())}}},{key:"getActiveElements",value:function(){return this._active||[]}},{key:"setActiveElements",value:function(t,e){var i=this,n=this._active,r=t.map((function(t){var e=t.datasetIndex,n=t.index,r=i.chart.getDatasetMeta(e);if(!r)throw new Error("Cannot find a dataset at index "+e);return{datasetIndex:e,element:r.data[n],index:n}})),a=!(0,g.ah)(n,r),o=this._positionChanged(r,e);(a||o)&&(this._active=r,this._eventPosition=e,this._ignoreReplayEvents=!0,this.update(!0))}},{key:"handleEvent",value:function(t,e){var i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];if(e&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;var n=this.options,r=this._active||[],a=this._getActiveElements(t,r,e,i),o=this._positionChanged(a,t),s=e||!(0,g.ah)(a,r)||o;return s&&(this._active=a,(n.enabled||n.external)&&(this._eventPosition={x:t.x,y:t.y},this.update(!0,e))),s}},{key:"_getActiveElements",value:function(t,e,i,n){var r=this.options;if("mouseout"===t.type)return[];if(!n)return e;var a=this.chart.getElementsAtEventForMode(t,r.mode,r,i);return r.reverse&&a.reverse(),a}},{key:"_positionChanged",value:function(t,e){var i=this.caretX,n=this.caretY,r=this.options,a=qe[r.position].call(this,t,e);return!1!==a&&(i!==a.x||n!==a.y)}}]),i}(Rt);(0,h.Z)(hi,"positioners",qe);var ci={id:"tooltip",_element:hi,positioners:qe,afterInit:function(t,e,i){i&&(t.tooltip=new hi({chart:t,options:i}))},beforeUpdate:function(t,e,i){t.tooltip&&t.tooltip.initialize(i)},reset:function(t,e,i){t.tooltip&&t.tooltip.initialize(i)},afterDraw:function(t){var e=t.tooltip;if(e&&e._willRender()){var i={tooltip:e};if(!1===t.notifyPlugins("beforeTooltipDraw",(0,n.Z)((0,n.Z)({},i),{},{cancelable:!0})))return;e.draw(t.ctx),t.notifyPlugins("afterTooltipDraw",i)}},afterEvent:function(t,e){if(t.tooltip){var i=e.replay;t.tooltip.handleEvent(e.event,i,e.inChartArea)&&(e.changed=!0)}},defaults:{enabled:!0,external:null,position:"average",backgroundColor:"rgba(0,0,0,0.8)",titleColor:"#fff",titleFont:{weight:"bold"},titleSpacing:2,titleMarginBottom:6,titleAlign:"left",bodyColor:"#fff",bodySpacing:2,bodyFont:{},bodyAlign:"left",footerColor:"#fff",footerSpacing:2,footerMarginTop:6,footerFont:{weight:"bold"},footerAlign:"left",padding:6,caretPadding:2,caretSize:5,cornerRadius:6,boxHeight:function(t,e){return e.bodyFont.size},boxWidth:function(t,e){return e.bodyFont.size},multiKeyBackground:"#fff",displayColors:!0,boxPadding:0,borderColor:"rgba(0,0,0,0)",borderWidth:0,animation:{duration:400,easing:"easeOutQuart"},animations:{numbers:{type:"number",properties:["x","y","width","height","caretX","caretY"]},opacity:{easing:"linear",duration:200}},callbacks:li},defaultRoutes:{bodyFont:"font",footerFont:"font",titleFont:"font"},descriptors:{_scriptable:function(t){return"filter"!==t&&"itemSort"!==t&&"external"!==t},_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:"animation"}},additionalOptionScopes:["interaction"]};function di(t,e,i,n){var r=t.indexOf(e);return-1===r?function(t,e,i,n){return"string"===typeof e?(i=t.push(e)-1,n.unshift({index:i,label:e})):isNaN(e)&&(i=null),i}(t,e,i,n):r!==t.lastIndexOf(e)?i:r}function fi(t){var e=this.getLabels();return t>=0&&te.length-1?null:this.getPixelForValue(e[t].value)}},{key:"getValueForPixel",value:function(t){return Math.round(this._startValue+this.getDecimalForPixel(t)*this._valueRange)}},{key:"getBasePixel",value:function(){return this.bottom}}]),i}(Yt);function gi(t,e,i){var n=i.horizontal,r=i.minRotation,a=(0,g.t)(r),o=(n?Math.sin(a):Math.cos(a))||.001,s=.75*e*(""+t).length;return Math.min(e/o,s)}(0,h.Z)(vi,"id","category"),(0,h.Z)(vi,"defaults",{ticks:{callback:fi}});var pi=function(t){(0,s.Z)(i,t);var e=(0,l.Z)(i);function i(t){var n;return(0,f.Z)(this,i),(n=e.call(this,t)).start=void 0,n.end=void 0,n._startValue=void 0,n._endValue=void 0,n._valueRange=0,n}return(0,v.Z)(i,[{key:"parse",value:function(t,e){return(0,g.k)(t)||("number"===typeof t||t instanceof Number)&&!isFinite(+t)?null:+t}},{key:"handleTickRangeOptions",value:function(){var t=this.options.beginAtZero,e=this.getUserBounds(),i=e.minDefined,n=e.maxDefined,r=this.min,a=this.max,o=function(t){return r=i?r:t},s=function(t){return a=n?a:t};if(t){var l=(0,g.s)(r),u=(0,g.s)(a);l<0&&u<0?s(0):l>0&&u>0&&o(0)}if(r===a){var h=0===a?1:Math.abs(.05*a);s(a+h),t||o(r-h)}this.min=r,this.max=a}},{key:"getTickLimit",value:function(){var t,e=this.options.ticks,i=e.maxTicksLimit,n=e.stepSize;return n?(t=Math.ceil(this.max/n)-Math.floor(this.min/n)+1)>1e3&&(console.warn("scales.".concat(this.id,".ticks.stepSize: ").concat(n," would result generating up to ").concat(t," ticks. Limiting to 1000.")),t=1e3):(t=this.computeTickLimit(),i=i||11),i&&(t=Math.min(i,t)),t}},{key:"computeTickLimit",value:function(){return Number.POSITIVE_INFINITY}},{key:"buildTicks",value:function(){var t=this.options,e=t.ticks,i=this.getTickLimit(),n=function(t,e){var i,n,r,a,o=[],s=t.bounds,l=t.step,u=t.min,h=t.max,c=t.precision,d=t.count,f=t.maxTicks,v=t.maxDigits,p=t.includeBounds,y=l||1,m=f-1,b=e.min,x=e.max,k=!(0,g.k)(u),_=!(0,g.k)(h),w=!(0,g.k)(d),M=(x-b)/(v+1),S=(0,g.aH)((x-b)/m/y)*y;if(S<1e-14&&!k&&!_)return[{value:b},{value:x}];(a=Math.ceil(x/S)-Math.floor(b/S))>m&&(S=(0,g.aH)(a*S/m/y)*y),(0,g.k)(c)||(i=Math.pow(10,c),S=Math.ceil(S*i)/i),"ticks"===s?(n=Math.floor(b/S)*S,r=Math.ceil(x/S)*S):(n=b,r=x),k&&_&&l&&(0,g.aI)((h-u)/l,S/1e3)?(S=(h-u)/(a=Math.round(Math.min((h-u)/S,f))),n=u,r=h):w?S=((r=_?h:r)-(n=k?u:n))/(a=d-1):(a=(r-n)/S,a=(0,g.aJ)(a,Math.round(a),S/1e3)?Math.round(a):Math.ceil(a));var P=Math.max((0,g.aK)(S),(0,g.aK)(n));i=Math.pow(10,(0,g.k)(c)?P:c),n=Math.round(n*i)/i,r=Math.round(r*i)/i;var O=0;for(k&&(p&&n!==u?(o.push({value:u}),nh)break;o.push({value:C})}return _&&p&&r!==h?o.length&&(0,g.aJ)(o[o.length-1].value,h,gi(h,M,t))?o[o.length-1].value=h:o.push({value:h}):_&&r!==h||o.push({value:r}),o}({maxTicks:i=Math.max(2,i),bounds:t.bounds,min:t.min,max:t.max,precision:e.precision,step:e.stepSize,count:e.count,maxDigits:this._maxDigits(),horizontal:this.isHorizontal(),minRotation:e.minRotation||0,includeBounds:!1!==e.includeBounds},this._range||this);return"ticks"===t.bounds&&(0,g.aG)(n,this,"value"),t.reverse?(n.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),n}},{key:"configure",value:function(){var t=this.ticks,e=this.min,n=this.max;if(o((0,a.Z)(i.prototype),"configure",this).call(this),this.options.offset&&t.length){var r=(n-e)/Math.max(t.length-1,1)/2;e-=r,n+=r}this._startValue=e,this._endValue=n,this._valueRange=n-e}},{key:"getLabelForValue",value:function(t){return(0,g.o)(t,this.chart.options.locale,this.options.ticks.format)}}]),i}(Yt),yi=function(t){(0,s.Z)(i,t);var e=(0,l.Z)(i);function i(){return(0,f.Z)(this,i),e.apply(this,arguments)}return(0,v.Z)(i,[{key:"determineDataLimits",value:function(){var t=this.getMinMax(!0),e=t.min,i=t.max;this.min=(0,g.g)(e)?e:0,this.max=(0,g.g)(i)?i:1,this.handleTickRangeOptions()}},{key:"computeTickLimit",value:function(){var t=this.isHorizontal(),e=t?this.width:this.height,i=(0,g.t)(this.options.ticks.minRotation),n=(t?Math.sin(i):Math.cos(i))||.001,r=this._resolveTickFontOptions(0);return Math.ceil(e/Math.min(40,r.lineHeight/n))}},{key:"getPixelForValue",value:function(t){return null===t?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}},{key:"getValueForPixel",value:function(t){return this._startValue+this.getDecimalForPixel(t)*this._valueRange}}]),i}(pi);(0,h.Z)(yi,"id","linear"),(0,h.Z)(yi,"defaults",{ticks:{callback:g.aL.formatters.numeric}});var mi=function(t){return Math.floor((0,g.aM)(t))},bi=function(t,e){return Math.pow(10,mi(t)+e)};function xi(t){return 1===t/Math.pow(10,mi(t))}function ki(t,e,i){var n=Math.pow(10,i),r=Math.floor(t/n);return Math.ceil(e/n)-r}function _i(t,e){var i=e.min,n=e.max;i=(0,g.O)(t.min,i);for(var r=[],a=mi(i),o=function(t,e){for(var i=mi(e-t);ki(t,e,i)>10;)i++;for(;ki(t,e,i)<10;)i--;return Math.min(i,mi(t))}(i,n),s=o<0?Math.pow(10,Math.abs(o)):1,l=Math.pow(10,o),u=a>o?Math.pow(10,a):0,h=Math.round((i-u)*s)/s,c=Math.floor((i-u)/l/10)*l*10,d=Math.floor((h-c)/Math.pow(10,o)),f=(0,g.O)(t.min,Math.round((u+c+d*Math.pow(10,o))*s)/s);f=10?d=d<15?15:20:d++,d>=20&&(d=2,s=++o>=0?1:s),f=Math.round((u+c+d*Math.pow(10,o))*s)/s;var v=(0,g.O)(t.max,f);return r.push({value:v,major:xi(v),significand:d}),r}var wi=function(t){(0,s.Z)(i,t);var e=(0,l.Z)(i);function i(t){var n;return(0,f.Z)(this,i),(n=e.call(this,t)).start=void 0,n.end=void 0,n._startValue=void 0,n._valueRange=0,n}return(0,v.Z)(i,[{key:"parse",value:function(t,e){var i=pi.prototype.parse.apply(this,[t,e]);if(0!==i)return(0,g.g)(i)&&i>0?i:null;this._zero=!0}},{key:"determineDataLimits",value:function(){var t=this.getMinMax(!0),e=t.min,i=t.max;this.min=(0,g.g)(e)?Math.max(0,e):null,this.max=(0,g.g)(i)?Math.max(0,i):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!(0,g.g)(this._userMin)&&(this.min=e===bi(this.min,0)?bi(this.min,-1):bi(this.min,0)),this.handleTickRangeOptions()}},{key:"handleTickRangeOptions",value:function(){var t=this.getUserBounds(),e=t.minDefined,i=t.maxDefined,n=this.min,r=this.max,a=function(t){return n=e?n:t},o=function(t){return r=i?r:t};n===r&&(n<=0?(a(1),o(10)):(a(bi(n,-1)),o(bi(r,1)))),n<=0&&a(bi(r,-1)),r<=0&&o(bi(n,1)),this.min=n,this.max=r}},{key:"buildTicks",value:function(){var t=this.options,e=_i({min:this._userMin,max:this._userMax},this);return"ticks"===t.bounds&&(0,g.aG)(e,this,"value"),t.reverse?(e.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),e}},{key:"getLabelForValue",value:function(t){return void 0===t?"0":(0,g.o)(t,this.chart.options.locale,this.options.ticks.format)}},{key:"configure",value:function(){var t=this.min;o((0,a.Z)(i.prototype),"configure",this).call(this),this._startValue=(0,g.aM)(t),this._valueRange=(0,g.aM)(this.max)-(0,g.aM)(t)}},{key:"getPixelForValue",value:function(t){return void 0!==t&&0!==t||(t=this.min),null===t||isNaN(t)?NaN:this.getPixelForDecimal(t===this.min?0:((0,g.aM)(t)-this._startValue)/this._valueRange)}},{key:"getValueForPixel",value:function(t){var e=this.getDecimalForPixel(t);return Math.pow(10,this._startValue+e*this._valueRange)}}]),i}(Yt);function Mi(t){var e=t.ticks;if(e.display&&t.display){var i=(0,g.E)(e.backdropPadding);return(0,g.v)(e.font&&e.font.size,g.d.font.size)+i.height}return 0}function Si(t,e,i,n,r){return t===n||t===r?{start:e-i/2,end:e+i/2}:tr?{start:e-i,end:e}:{start:e,end:e+i}}function Pi(t){for(var e,i,n,r={l:t.left+t._padding.left,r:t.right-t._padding.right,t:t.top+t._padding.top,b:t.bottom-t._padding.bottom},a=Object.assign({},r),o=[],s=[],l=t._pointLabels.length,u=t.options.pointLabels,h=u.centerPointLabels?g.P/l:0,c=0;ce.r&&(s=(n.end-e.r)/a,t.r=Math.max(t.r,e.r+s)),r.starte.b&&(l=(r.end-e.b)/o,t.b=Math.max(t.b,e.b+l))}function Ci(t,e,i){var n=t.drawingArea,r=i.extra,a=i.additionalAngle,o=i.padding,s=i.size,l=t.getPointPosition(e,n+r+o,a),u=Math.round((0,g.U)((0,g.ay)(l.angle+g.H))),h=function(t,e,i){90===i||270===i?t-=e/2:(i>270||i<90)&&(t-=e);return t}(l.y,s.h,u),c=function(t){if(0===t||180===t)return"center";if(t<180)return"left";return"right"}(u),d=function(t,e,i){"right"===i?t-=e:"center"===i&&(t-=e/2);return t}(l.x,s.w,c);return{visible:!0,x:l.x,y:h,textAlign:c,left:d,top:h,right:d+s.w,bottom:h+s.h}}function Di(t,e){if(!e)return!0;var i=t.left,n=t.top,r=t.right,a=t.bottom;return!((0,g.C)({x:i,y:n},e)||(0,g.C)({x:i,y:a},e)||(0,g.C)({x:r,y:n},e)||(0,g.C)({x:r,y:a},e))}function Ai(t,e,i){var n=i.left,r=i.top,a=i.right,o=i.bottom,s=e.backdropColor;if(!(0,g.k)(s)){var l=(0,g.aw)(e.borderRadius),u=(0,g.E)(e.backdropPadding);t.fillStyle=s;var h=n-u.left,c=r-u.top,d=a-n+u.width,f=o-r+u.height;Object.values(l).some((function(t){return 0!==t}))?(t.beginPath(),(0,g.au)(t,{x:h,y:c,w:d,h:f,radius:l}),t.fill()):t.fillRect(h,c,d,f)}}function Ti(t,e,i,n){var r=t.ctx;if(i)r.arc(t.xCenter,t.yCenter,e,0,g.T);else{var a=t.getPointPosition(0,e);r.moveTo(a.x,a.y);for(var o=1;o=0&&t2&&void 0!==arguments[2]?arguments[2]:0,n=this.getIndexAngle(t)-g.H+i;return{x:Math.cos(n)*e+this.xCenter,y:Math.sin(n)*e+this.yCenter,angle:n}}},{key:"getPointPositionForValue",value:function(t,e){return this.getPointPosition(t,this.getDistanceFromCenterForValue(e))}},{key:"getBasePosition",value:function(t){return this.getPointPositionForValue(t||0,this.getBaseValue())}},{key:"getPointLabelPosition",value:function(t){var e=this._pointLabelItems[t];return{left:e.left,top:e.top,right:e.right,bottom:e.bottom}}},{key:"drawBackground",value:function(){var t=this.options,e=t.backgroundColor,i=t.grid.circular;if(e){var n=this.ctx;n.save(),n.beginPath(),Ti(this,this.getDistanceFromCenterForValue(this._endValue),i,this._pointLabels.length),n.closePath(),n.fillStyle=e,n.fill(),n.restore()}}},{key:"drawGrid",value:function(){var t,e,i,n=this,r=this.ctx,a=this.options,o=a.angleLines,s=a.grid,l=a.border,u=this._pointLabels.length;if(a.pointLabels.display&&function(t,e){for(var i=t.ctx,n=t.options.pointLabels,r=e-1;r>=0;r--){var a=t._pointLabelItems[r];if(a.visible){var o=n.setContext(t.getPointLabelContext(r));Ai(i,o,a);var s=(0,g.a0)(o.font),l=a.x,u=a.y,h=a.textAlign;(0,g.Z)(i,t._pointLabels[r],l,u+s.lineHeight/2,s,{color:o.color,textAlign:h,textBaseline:"middle"})}}}(this,u),s.display&&this.ticks.forEach((function(t,i){if(0!==i){e=n.getDistanceFromCenterForValue(t.value);var r=n.getContext(i),a=s.setContext(r),o=l.setContext(r);!function(t,e,i,n,r){var a=t.ctx,o=e.circular,s=e.color,l=e.lineWidth;!o&&!n||!s||!l||i<0||(a.save(),a.strokeStyle=s,a.lineWidth=l,a.setLineDash(r.dash),a.lineDashOffset=r.dashOffset,a.beginPath(),Ti(t,i,o,n),a.closePath(),a.stroke(),a.restore())}(n,a,e,u,o)}})),o.display){for(r.save(),t=u-1;t>=0;t--){var h=o.setContext(this.getPointLabelContext(t)),c=h.color,d=h.lineWidth;d&&c&&(r.lineWidth=d,r.strokeStyle=c,r.setLineDash(h.borderDash),r.lineDashOffset=h.borderDashOffset,e=this.getDistanceFromCenterForValue(a.ticks.reverse?this.min:this.max),i=this.getPointPosition(t,e),r.beginPath(),r.moveTo(this.xCenter,this.yCenter),r.lineTo(i.x,i.y),r.stroke())}r.restore()}}},{key:"drawBorder",value:function(){}},{key:"drawLabels",value:function(){var t=this,e=this.ctx,i=this.options,n=i.ticks;if(n.display){var r,a,o=this.getIndexAngle(0);e.save(),e.translate(this.xCenter,this.yCenter),e.rotate(o),e.textAlign="center",e.textBaseline="middle",this.ticks.forEach((function(o,s){if(0!==s||i.reverse){var l=n.setContext(t.getContext(s)),u=(0,g.a0)(l.font);if(r=t.getDistanceFromCenterForValue(t.ticks[s].value),l.showLabelBackdrop){e.font=u.string,a=e.measureText(o.label).width,e.fillStyle=l.backdropColor;var h=(0,g.E)(l.backdropPadding);e.fillRect(-a/2-h.left,-r-u.size/2-h.top,a+h.width,u.size+h.height)}(0,g.Z)(e,o.label,0,-r,u,{color:l.color,strokeColor:l.textStrokeColor,strokeWidth:l.textStrokeWidth})}})),e.restore()}}},{key:"drawTitle",value:function(){}}]),i}(pi);(0,h.Z)(Ei,"id","radialLinear"),(0,h.Z)(Ei,"defaults",{display:!0,animate:!0,position:"chartArea",angleLines:{display:!0,lineWidth:1,borderDash:[],borderDashOffset:0},grid:{circular:!1},startAngle:0,ticks:{showLabelBackdrop:!0,callback:g.aL.formatters.numeric},pointLabels:{backdropColor:void 0,backdropPadding:2,display:!0,font:{size:10},callback:function(t){return t},padding:5,centerPointLabels:!1}}),(0,h.Z)(Ei,"defaultRoutes",{"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"}),(0,h.Z)(Ei,"descriptors",{angleLines:{_fallback:"grid"}});var Zi={millisecond:{common:!0,size:1,steps:1e3},second:{common:!0,size:1e3,steps:60},minute:{common:!0,size:6e4,steps:60},hour:{common:!0,size:36e5,steps:24},day:{common:!0,size:864e5,steps:30},week:{common:!1,size:6048e5,steps:4},month:{common:!0,size:2628e6,steps:12},quarter:{common:!1,size:7884e6,steps:4},year:{common:!0,size:3154e7}},Li=Object.keys(Zi);function Ri(t,e){return t-e}function Ii(t,e){if((0,g.k)(e))return null;var i=t._adapter,n=t._parseOpts,r=n.parser,a=n.round,o=n.isoWeekday,s=e;return"function"===typeof r&&(s=r(s)),(0,g.g)(s)||(s="string"===typeof r?i.parse(s,r):i.parse(s)),null===s?null:(a&&(s="week"!==a||!(0,g.x)(o)&&!0!==o?i.startOf(s,a):i.startOf(s,"isoWeek",o)),+s)}function Fi(t,e,i,n){for(var r=Li.length,a=Li.indexOf(t);a=e?i[r]:i[a]]=!0}}else t[e]=!0}function ji(t,e,i){var n,r,a=[],o={},s=e.length;for(n=0;n=0&&(e[a].major=!0);return e}(t,a,o,i):a}var Wi=function(t){(0,s.Z)(i,t);var e=(0,l.Z)(i);function i(t){var n;return(0,f.Z)(this,i),(n=e.call(this,t))._cache={data:[],labels:[],all:[]},n._unit="day",n._majorUnit=void 0,n._offsets={},n._normalized=!1,n._parseOpts=void 0,n}return(0,v.Z)(i,[{key:"init",value:function(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{},n=t.time||(t.time={}),r=this._adapter=new q._date(t.adapters.date);r.init(e),(0,g.ab)(n.displayFormats,r.formats()),this._parseOpts={parser:n.parser,round:n.round,isoWeekday:n.isoWeekday},o((0,a.Z)(i.prototype),"init",this).call(this,t),this._normalized=e.normalized}},{key:"parse",value:function(t,e){return void 0===t?null:Ii(this,t)}},{key:"beforeLayout",value:function(){o((0,a.Z)(i.prototype),"beforeLayout",this).call(this),this._cache={data:[],labels:[],all:[]}}},{key:"determineDataLimits",value:function(){var t=this.options,e=this._adapter,i=t.time.unit||"day",n=this.getUserBounds(),r=n.min,a=n.max,o=n.minDefined,s=n.maxDefined;function l(t){o||isNaN(t.min)||(r=Math.min(r,t.min)),s||isNaN(t.max)||(a=Math.max(a,t.max))}o&&s||(l(this._getLabelBounds()),"ticks"===t.bounds&&"labels"===t.ticks.source||l(this.getMinMax(!1))),r=(0,g.g)(r)&&!isNaN(r)?r:+e.startOf(Date.now(),i),a=(0,g.g)(a)&&!isNaN(a)?a:+e.endOf(Date.now(),i)+1,this.min=Math.min(r,a-1),this.max=Math.max(r+1,a)}},{key:"_getLabelBounds",value:function(){var t=this.getLabelTimestamps(),e=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY;return t.length&&(e=t[0],i=t[t.length-1]),{min:e,max:i}}},{key:"buildTicks",value:function(){var t=this.options,e=t.time,i=t.ticks,n="labels"===i.source?this.getLabelTimestamps():this._generate();"ticks"===t.bounds&&n.length&&(this.min=this._userMin||n[0],this.max=this._userMax||n[n.length-1]);var r=this.min,a=this.max,o=(0,g.aO)(n,r,a);return this._unit=e.unit||(i.autoSkip?Fi(e.minUnit,this.min,this.max,this._getLabelCapacity(r)):function(t,e,i,n,r){for(var a=Li.length-1;a>=Li.indexOf(i);a--){var o=Li[a];if(Zi[o].common&&t._adapter.diff(r,n,o)>=e-1)return o}return Li[i?Li.indexOf(i):0]}(this,o.length,e.minUnit,this.min,this.max)),this._majorUnit=i.major.enabled&&"year"!==this._unit?function(t){for(var e=Li.indexOf(t)+1,i=Li.length;e0&&void 0!==arguments[0]?arguments[0]:[],n=0,r=0;this.options.offset&&i.length&&(t=this.getDecimalForValue(i[0]),n=1===i.length?1-t:(this.getDecimalForValue(i[1])-t)/2,e=this.getDecimalForValue(i[i.length-1]),r=1===i.length?e:(e-this.getDecimalForValue(i[i.length-2]))/2);var a=i.length<3?.5:.25;n=(0,g.S)(n,0,a),r=(0,g.S)(r,0,a),this._offsets={start:n,end:r,factor:1/(n+1+r)}}},{key:"_generate",value:function(){var t,e,i=this._adapter,n=this.min,r=this.max,a=this.options,o=a.time,s=o.unit||Fi(o.minUnit,n,r,this._getLabelCapacity(n)),l=(0,g.v)(a.ticks.stepSize,1),u="week"===s&&o.isoWeekday,h=(0,g.x)(u)||!0===u,c={},d=n;if(h&&(d=+i.startOf(d,"isoWeek",u)),d=+i.startOf(d,h?"day":s),i.diff(r,n,s)>1e5*l)throw new Error(n+" and "+r+" are too far apart with stepSize of "+l+" "+s);var f="data"===a.ticks.source&&this.getDataTimestamps();for(t=d,e=0;t0?o:1}},{key:"getDataTimestamps",value:function(){var t,e,i=this._cache.data||[];if(i.length)return i;var n=this.getMatchingVisibleMetas();if(this._normalized&&n.length)return this._cache.data=n[0].controller.getAllParsedValues(this);for(t=0,e=n.length;t=t[s].pos&&e<=t[l].pos){var u=(0,g.B)(t,"pos",e);s=u.lo,l=u.hi}var h=t[s];n=h.pos,a=h.time;var c=t[l];r=c.pos,o=c.time}else{if(e>=t[s].time&&e<=t[l].time){var d=(0,g.B)(t,"time",e);s=d.lo,l=d.hi}var f=t[s];n=f.time,a=f.pos;var v=t[l];r=v.time,o=v.pos}var p=r-n;return p?a+(o-a)*(e-n)/p:a}(0,h.Z)(Wi,"id","time"),(0,h.Z)(Wi,"defaults",{bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{source:"auto",callback:!1,major:{enabled:!1}}});var Ni=function(t){(0,s.Z)(i,t);var e=(0,l.Z)(i);function i(t){var n;return(0,f.Z)(this,i),(n=e.call(this,t))._table=[],n._minPos=void 0,n._tableRange=void 0,n}return(0,v.Z)(i,[{key:"initOffsets",value:function(){var t=this._getTimestampsForTable(),e=this._table=this.buildLookupTable(t);this._minPos=Vi(e,this.min),this._tableRange=Vi(e,this.max)-this._minPos,o((0,a.Z)(i.prototype),"initOffsets",this).call(this,t)}},{key:"buildLookupTable",value:function(t){var e,i,n,r,a,o=this.min,s=this.max,l=[],u=[];for(e=0,i=t.length;e=o&&r<=s&&l.push(r);if(l.length<2)return[{time:o,pos:0},{time:s,pos:1}];for(e=0,i=l.length;e>4]+g[15&t]},m=function(t){return(240&t)>>4===(15&t)};function b(t){var e=function(t){return m(t.r)&&m(t.g)&&m(t.b)&&m(t.a)}(t)?p:y;return t?"#"+e(t.r)+e(t.g)+e(t.b)+function(t,e){return t<255?e(t):""}(t.a,e):void 0}var x=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function k(t,e,i){var n=e*Math.min(i,1-i),r=function(e){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:(e+t/30)%12;return i-n*Math.max(Math.min(r-3,9-r,1),-1)};return[r(0),r(8),r(4)]}function _(t,e,i){var n=function(n){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:(n+t/60)%6;return i-i*e*Math.max(Math.min(r,4-r,1),0)};return[n(5),n(3),n(1)]}function w(t,e,i){var n,r=k(t,1,.5);for(e+i>1&&(e*=n=1/(e+i),i*=n),n=0;n<3;n++)r[n]*=1-e-i,r[n]+=e;return r}function M(t){var e,i,n,r=t.r/255,a=t.g/255,o=t.b/255,s=Math.max(r,a,o),l=Math.min(r,a,o),u=(s+l)/2;return s!==l&&(n=s-l,i=u>.5?n/(2-s-l):n/(s+l),e=function(t,e,i,n,r){return t===r?(e-i)/n+(e>16&255,i>>8&255,255&i]}return a}()).transparent=[0,0,0,0]);var e=D[t.toLowerCase()];return e&&{r:e[0],g:e[1],b:e[2],a:4===e.length?e[3]:255}}var Z=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;var L=function(t){return t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055},R=function(t){return t<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4)};function I(t,e,i){if(t){var n=M(t);n[e]=Math.max(0,Math.min(n[e]+n[e]*i,0===e?360:1)),n=P(n),t.r=n[0],t.g=n[1],t.b=n[2]}}function F(t,e){return t?Object.assign(e||{},t):t}function z(t){var e={r:0,g:0,b:0,a:255};return Array.isArray(t)?t.length>=3&&(e={r:t[0],g:t[1],b:t[2],a:255},t.length>3&&(e.a=c(t[3]))):(e=F(t,{r:0,g:0,b:0,a:1})).a=c(e.a),e}function j(t){return"r"===t.charAt(0)?function(t){var e,i,n,r=Z.exec(t),a=255;if(r){if(r[7]!==e){var o=+r[7];a=r[8]?h(o):u(255*o,0,255)}return e=+r[1],i=+r[3],n=+r[5],{r:e=255&(r[2]?h(e):u(e,0,255)),g:i=255&(r[4]?h(i):u(i,0,255)),b:n=255&(r[6]?h(n):u(n,0,255)),a:a}}}(t):C(t)}var W=function(){function t(e){if((0,a.Z)(this,t),e instanceof t)return e;var i,n=typeof e;"object"===n?i=z(e):"string"===n&&(i=function(t){var e,i=t.length;return"#"===t[0]&&(4===i||5===i?e={r:255&17*v[t[1]],g:255&17*v[t[2]],b:255&17*v[t[3]],a:5===i?17*v[t[4]]:255}:7!==i&&9!==i||(e={r:v[t[1]]<<4|v[t[2]],g:v[t[3]]<<4|v[t[4]],b:v[t[5]]<<4|v[t[6]],a:9===i?v[t[7]]<<4|v[t[8]]:255})),e}(e)||E(e)||j(e)),this._rgb=i,this._valid=!!i}return(0,o.Z)(t,[{key:"valid",get:function(){return this._valid}},{key:"rgb",get:function(){var t=F(this._rgb);return t&&(t.a=d(t.a)),t},set:function(t){this._rgb=z(t)}},{key:"rgbString",value:function(){return this._valid?(t=this._rgb)&&(t.a<255?"rgba(".concat(t.r,", ").concat(t.g,", ").concat(t.b,", ").concat(d(t.a),")"):"rgb(".concat(t.r,", ").concat(t.g,", ").concat(t.b,")")):void 0;var t}},{key:"hexString",value:function(){return this._valid?b(this._rgb):void 0}},{key:"hslString",value:function(){return this._valid?function(t){if(t){var e=M(t),i=e[0],n=f(e[1]),r=f(e[2]);return t.a<255?"hsla(".concat(i,", ").concat(n,"%, ").concat(r,"%, ").concat(d(t.a),")"):"hsl(".concat(i,", ").concat(n,"%, ").concat(r,"%)")}}(this._rgb):void 0}},{key:"mix",value:function(t,e){if(t){var i,n=this.rgb,r=t.rgb,a=e===i?.5:e,o=2*a-1,s=n.a-r.a,l=((o*s===-1?o:(o+s)/(1+o*s))+1)/2;i=1-l,n.r=255&l*n.r+i*r.r+.5,n.g=255&l*n.g+i*r.g+.5,n.b=255&l*n.b+i*r.b+.5,n.a=a*n.a+(1-a)*r.a,this.rgb=n}return this}},{key:"interpolate",value:function(t,e){return t&&(this._rgb=function(t,e,i){var n=R(d(t.r)),r=R(d(t.g)),a=R(d(t.b));return{r:c(L(n+i*(R(d(e.r))-n))),g:c(L(r+i*(R(d(e.g))-r))),b:c(L(a+i*(R(d(e.b))-a))),a:t.a+i*(e.a-t.a)}}(this._rgb,t._rgb,e)),this}},{key:"clone",value:function(){return new t(this.rgb)}},{key:"alpha",value:function(t){return this._rgb.a=c(t),this}},{key:"clearer",value:function(t){return this._rgb.a*=1-t,this}},{key:"greyscale",value:function(){var t=this._rgb,e=l(.3*t.r+.59*t.g+.11*t.b);return t.r=t.g=t.b=e,this}},{key:"opaquer",value:function(t){return this._rgb.a*=1+t,this}},{key:"negate",value:function(){var t=this._rgb;return t.r=255-t.r,t.g=255-t.g,t.b=255-t.b,this}},{key:"lighten",value:function(t){return I(this._rgb,2,t),this}},{key:"darken",value:function(t){return I(this._rgb,2,-t),this}},{key:"saturate",value:function(t){return I(this._rgb,1,t),this}},{key:"desaturate",value:function(t){return I(this._rgb,1,-t),this}},{key:"rotate",value:function(t){return function(t,e){var i=M(t);i[0]=O(i[0]+e),i=P(i),t.r=i[0],t.g=i[1],t.b=i[2]}(this._rgb,t),this}}]),t}();function V(){}var N=function(){var t=0;return function(){return t++}}();function B(t){return null===t||"undefined"===typeof t}function H(t){if(Array.isArray&&Array.isArray(t))return!0;var e=Object.prototype.toString.call(t);return"[object"===e.slice(0,7)&&"Array]"===e.slice(-6)}function Y(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)}function X(t){return("number"===typeof t||t instanceof Number)&&isFinite(+t)}function U(t,e){return X(t)?t:e}function $(t,e){return"undefined"===typeof t?e:t}var K=function(t,e){return"string"===typeof t&&t.endsWith("%")?parseFloat(t)/100:+t/e},Q=function(t,e){return"string"===typeof t&&t.endsWith("%")?parseFloat(t)/100*e:+t};function q(t,e,i){if(t&&"function"===typeof t.call)return t.apply(i,e)}function J(t,e,i,n){var r,a,o;if(H(t))if(a=t.length,n)for(r=a-1;r>=0;r--)e.call(i,t[r],r);else for(r=0;r=t}function Dt(t,e,i){var n,r,a;for(n=0,r=t.length;nl&&u3&&void 0!==arguments[3]?arguments[3]:1e-6;return t>=Math.min(e,i)-n&&t<=Math.max(e,i)+n}function Vt(t,e,i){i=i||function(i){return t[i]1;)i(n=a+r>>1)?a=n:r=n;return{lo:a,hi:r}}var Nt=function(t,e,i,n){return Vt(t,i,n?function(n){var r=t[n][e];return r=i}))};function Ht(t,e,i){for(var n=0,r=t.length;nn&&t[r-1]>i;)r--;return n>0||r0||(Yt.forEach((function(e){delete t[e]})),delete t._chartjs)}}function $t(t){var e=new Set(t);return e.size===t.length?t:Array.from(e)}var Kt="undefined"===typeof window?function(t){return t()}:window.requestAnimationFrame;function Qt(t,e){var i=[],n=!1;return function(){for(var r=arguments.length,a=new Array(r),o=0;o=1?t:-(Math.sqrt(1-t*t)-1)},easeOutCirc:function(t){return Math.sqrt(1-(t-=1)*t)},easeInOutCirc:function(t){return(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1)},easeInElastic:function(t){return ne(t)?t:re(t,.075,.3)},easeOutElastic:function(t){return ne(t)?t:ae(t,.075,.3)},easeInOutElastic:function(t){var e=.1125;return ne(t)?t:t<.5?.5*re(2*t,e,.45):.5+.5*ae(2*t-1,e,.45)},easeInBack:function(t){var e=1.70158;return t*t*((e+1)*t-e)},easeOutBack:function(t){var e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack:function(t){var e=1.70158;return(t/=.5)<1?t*t*((1+(e*=1.525))*t-e)*.5:.5*((t-=2)*t*((1+(e*=1.525))*t+e)+2)},easeInBounce:function(t){return 1-oe.easeOutBounce(1-t)},easeOutBounce:function(t){var e=7.5625,i=2.75;return t<1/i?e*t*t:t<2/i?e*(t-=1.5/i)*t+.75:t<2.5/i?e*(t-=2.25/i)*t+.9375:e*(t-=2.625/i)*t+.984375},easeInOutBounce:function(t){return t<.5?.5*oe.easeInBounce(2*t):.5*oe.easeOutBounce(2*t-1)+.5}};function se(t){if(t&&"object"===typeof t){var e=t.toString();return"[object CanvasPattern]"===e||"[object CanvasGradient]"===e}return!1}function le(t){return se(t)?t:new W(t)}function ue(t){return se(t)?t:new W(t).saturate(.5).darken(.1).hexString()}var he=["x","y","borderWidth","radius","tension"],ce=["color","borderColor","backgroundColor"];var de=new Map;function fe(t,e,i){return function(t,e){e=e||{};var i=t+JSON.stringify(e),n=de.get(i);return n||(n=new Intl.NumberFormat(t,e),de.set(i,n)),n}(e,i).format(t)}var ve={values:function(t){return H(t)?t:""+t},numeric:function(t,e,i){if(0===t)return"0";var n,r=this.chart.options.locale,a=t;if(i.length>1){var o=Math.max(Math.abs(i[0].value),Math.abs(i[i.length-1].value));(o<1e-4||o>1e15)&&(n="scientific"),a=function(t,e){var i=e.length>3?e[2].value-e[1].value:e[1].value-e[0].value;Math.abs(i)>=1&&t!==Math.floor(t)&&(i=t-Math.floor(t));return i}(t,i)}var s=_t(Math.abs(a)),l=isNaN(s)?1:Math.max(Math.min(-1*Math.floor(s),20),0),u={notation:n,minimumFractionDigits:l,maximumFractionDigits:l};return Object.assign(u,this.options.ticks.format),fe(t,r,u)},logarithmic:function(t,e,i){if(0===t)return"0";var n=i[e].significand||t/Math.pow(10,Math.floor(_t(t)));return[1,2,3,5,10,15].includes(n)||e>.8*i.length?ve.numeric.call(this,t,e,i):""}};var ge={formatters:ve};var pe=Object.create(null),ye=Object.create(null);function me(t,e){if(!e)return t;for(var i=e.split("."),n=0,r=i.length;nn&&(n=a),n}function we(t,e,i,n){var r=(n=n||{}).data=n.data||{},a=n.garbageCollect=n.garbageCollect||[];n.font!==e&&(r=n.data={},a=n.garbageCollect=[],n.font=e),t.save(),t.font=e;var o,s,l,u,h,c=0,d=i.length;for(o=0;oi.length){for(o=0;o0&&t.stroke()}}function Ce(t,e,i){return i=i||.5,!e||t&&t.x>e.left-i&&t.xe.top-i&&t.y5&&void 0!==arguments[5]?arguments[5]:{},l=H(e)?e:[e],u=s.strokeWidth>0&&""!==s.strokeColor;for(t.save(),t.font=r.string,function(t,e){e.translation&&t.translate(e.translation[0],e.translation[1]),B(e.rotation)||t.rotate(e.rotation),e.color&&(t.fillStyle=e.color),e.textAlign&&(t.textAlign=e.textAlign),e.textBaseline&&(t.textBaseline=e.textBaseline)}(t,s),a=0;a1&&void 0!==arguments[1]?arguments[1]:[""],a=arguments.length>3?arguments[3]:void 0,o=arguments.length>4&&void 0!==arguments[4]?arguments[4]:function(){return t[0]},l=(arguments.length>2?arguments[2]:void 0)||t;"undefined"===typeof a&&(a=oi("_fallback",t));var u=(e={},(0,r.Z)(e,Symbol.toStringTag,"Object"),(0,r.Z)(e,"_cacheable",!0),(0,r.Z)(e,"_scopes",t),(0,r.Z)(e,"_rootScopes",l),(0,r.Z)(e,"_fallback",a),(0,r.Z)(e,"_getTarget",o),(0,r.Z)(e,"override",(function(e){return Ke([e].concat((0,n.Z)(t)),i,l,a)})),e);return new Proxy(u,{deleteProperty:function(e,i){return delete e[i],delete e._keys,delete t[0][i],!0},get:function(e,n){return ti(e,n,(function(){return function(t,e,i,n){var r,a,o=(0,s.Z)(e);try{for(o.s();!(a=o.n()).done;){var l=a.value;if("undefined"!==typeof(r=oi(Je(l,t),i)))return Ge(t,r)?ri(i,n,t,r):r}}catch(u){o.e(u)}finally{o.f()}}(n,i,t,e)}))},getOwnPropertyDescriptor:function(t,e){return Reflect.getOwnPropertyDescriptor(t._scopes[0],e)},getPrototypeOf:function(){return Reflect.getPrototypeOf(t[0])},has:function(t,e){return si(t).includes(e)},ownKeys:function(t){return si(t)},set:function(t,e,i){var n=t._storage||(t._storage=o());return t[e]=n[e]=i,delete t._keys,!0}})}function Qe(t,e,i,n){var r={_cacheable:!1,_proxy:t,_context:e,_subProxy:i,_stack:new Set,_descriptors:qe(t,n),setContext:function(e){return Qe(t,e,i,n)},override:function(r){return Qe(t.override(r),e,i,n)}};return new Proxy(r,{deleteProperty:function(e,i){return delete e[i],delete t[i],!0},get:function(t,e,i){return ti(t,e,(function(){return function(t,e,i){var n=t._proxy,r=t._context,a=t._subProxy,o=t._descriptors,l=n[e];ct(l)&&o.isScriptable(e)&&(l=function(t,e,i,n){var r=i._proxy,a=i._context,o=i._subProxy,s=i._stack;if(s.has(t))throw new Error("Recursion detected: "+Array.from(s).join("->")+"->"+t);s.add(t);var l=e(a,o||n);s.delete(t),Ge(t,l)&&(l=ri(r._scopes,r,t,l));return l}(e,l,t,i));H(l)&&l.length&&(l=function(t,e,i,n){var r=i._proxy,a=i._context,o=i._subProxy,l=i._descriptors;if("undefined"!==typeof a.index&&n(t))return e[a.index%e.length];if(Y(e[0])){var u=e,h=r._scopes.filter((function(t){return t!==u}));e=[];var c,d=(0,s.Z)(u);try{for(d.s();!(c=d.n()).done;){var f=ri(h,r,t,c.value);e.push(Qe(f,a,o&&o[t],l))}}catch(v){d.e(v)}finally{d.f()}}return e}(e,l,t,o.isIndexable));Ge(e,l)&&(l=Qe(l,r,a&&a[e],o));return l}(t,e,i)}))},getOwnPropertyDescriptor:function(e,i){return e._descriptors.allKeys?Reflect.has(t,i)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(t,i)},getPrototypeOf:function(){return Reflect.getPrototypeOf(t)},has:function(e,i){return Reflect.has(t,i)},ownKeys:function(){return Reflect.ownKeys(t)},set:function(e,i,n){return t[i]=n,delete e[i],!0}})}function qe(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{scriptable:!0,indexable:!0},i=t._scriptable,n=void 0===i?e.scriptable:i,r=t._indexable,a=void 0===r?e.indexable:r,o=t._allKeys;return{allKeys:void 0===o?e.allKeys:o,scriptable:n,indexable:a,isScriptable:ct(n)?n:function(){return n},isIndexable:ct(a)?a:function(){return a}}}var Je=function(t,e){return t?t+ut(e):e},Ge=function(t,e){return Y(e)&&"adapters"!==t&&(null===Object.getPrototypeOf(e)||e.constructor===Object)};function ti(t,e,i){if(Object.prototype.hasOwnProperty.call(t,e))return t[e];var n=i();return t[e]=n,n}function ei(t,e,i){return ct(t)?t(e,i):t}var ii=function(t,e){return!0===t?e:"string"===typeof t?lt(e,t):void 0};function ni(t,e,i,n,r){var a,o=(0,s.Z)(e);try{for(o.s();!(a=o.n()).done;){var l=a.value,u=ii(i,l);if(u){t.add(u);var h=ei(u._fallback,i,r);if("undefined"!==typeof h&&h!==i&&h!==n)return h}else if(!1===u&&"undefined"!==typeof n&&i!==n)return null}}catch(c){o.e(c)}finally{o.f()}return!1}function ri(t,e,i,r){var a=e._rootScopes,o=ei(e._fallback,i,r),s=[].concat((0,n.Z)(t),(0,n.Z)(a)),l=new Set;l.add(r);var u=ai(l,s,i,o||i,r);return null!==u&&(("undefined"===typeof o||o===i||null!==(u=ai(l,s,o,u,r)))&&Ke(Array.from(l),[""],a,o,(function(){return function(t,e,i){var n=t._getTarget();e in n||(n[e]={});var r=n[e];if(H(r)&&Y(i))return i;return r||{}}(e,i,r)})))}function ai(t,e,i,n,r){for(;i;)i=ni(t,e,i,n,r);return i}function oi(t,e){var i,n=(0,s.Z)(e);try{for(n.s();!(i=n.n()).done;){var r=i.value;if(r){var a=r[t];if("undefined"!==typeof a)return a}}}catch(o){n.e(o)}finally{n.f()}}function si(t){var e=t._keys;return e||(e=t._keys=function(t){var e,i=new Set,n=(0,s.Z)(t);try{for(n.s();!(e=n.n()).done;){var r,a=e.value,o=(0,s.Z)(Object.keys(a).filter((function(t){return!t.startsWith("_")})));try{for(o.s();!(r=o.n()).done;){var l=r.value;i.add(l)}}catch(u){o.e(u)}finally{o.f()}}}catch(u){n.e(u)}finally{n.f()}return Array.from(i)}(t._scopes)),e}function li(t,e,i,n){var r,a,o,s,l=t.iScale,u=this._parsing.key,h=void 0===u?"r":u,c=new Array(n);for(r=0,a=n;r1&&void 0!==arguments[1]?arguments[1]:"x",a=ci(r),o=t.length,s=Array(o).fill(0),l=Array(o),u=hi(t,0);for(e=0;e2&&void 0!==arguments[2]?arguments[2]:"x",o=ci(a),s=t.length,l=hi(t,0),u=0;u0||e>0)&&(!i||!i.shadowRoot)};function wi(t,e){if("native"in t)return t;var i=e.canvas,n=e.currentDevicePixelRatio,r=bi(i),a="border-box"===r.boxSizing,o=ki(r,"padding"),s=ki(r,"border","width"),l=function(t,e){var i,n,r=t.touches,a=r&&r.length?r[0]:t,o=a.offsetX,s=a.offsetY,l=!1;if(_i(o,s,t.target))i=o,n=s;else{var u=e.getBoundingClientRect();i=a.clientX-u.left,n=a.clientY-u.top,l=!0}return{x:i,y:n,box:l}}(t,i),u=l.x,h=l.y,c=l.box,d=o.left+(c&&s.left),f=o.top+(c&&s.top),v=e.width,g=e.height;return a&&(v-=o.width+s.width,g-=o.height+s.height),{x:Math.round((u-d)/v*i.width/n),y:Math.round((h-f)/g*i.height/n)}}var Mi=function(t){return Math.round(10*t)/10};function Si(t,e,i,n){var r=bi(t),a=ki(r,"margin"),o=mi(r.maxWidth,t,"clientWidth")||yt,s=mi(r.maxHeight,t,"clientHeight")||yt,l=function(t,e,i){var n,r;if(void 0===e||void 0===i){var a=yi(t);if(a){var o=a.getBoundingClientRect(),s=bi(a),l=ki(s,"border","width"),u=ki(s,"padding");e=o.width-u.width-l.width,i=o.height-u.height-l.height,n=mi(s.maxWidth,a,"clientWidth"),r=mi(s.maxHeight,a,"clientHeight")}else e=t.clientWidth,i=t.clientHeight}return{width:e,height:i,maxWidth:n||yt,maxHeight:r||yt}}(t,e,i),u=l.width,h=l.height;if("content-box"===r.boxSizing){var c=ki(r,"border","width"),d=ki(r,"padding");u-=d.width+c.width,h-=d.height+c.height}return u=Math.max(0,u-a.width),h=Math.max(0,n?u/n:h-a.height),u=Mi(Math.min(u,o,l.maxWidth)),h=Mi(Math.min(h,s,l.maxHeight)),u&&!h&&(h=Mi(u/2)),(void 0!==e||void 0!==i)&&n&&l.height&&h>l.height&&(h=l.height,u=Mi(Math.floor(h*n))),{width:u,height:h}}function Pi(t,e,i){var n=e||1,r=Math.floor(t.height*n),a=Math.floor(t.width*n);t.height=Math.floor(t.height),t.width=Math.floor(t.width);var o=t.canvas;return o.style&&(i||!o.style.height&&!o.style.width)&&(o.style.height="".concat(t.height,"px"),o.style.width="".concat(t.width,"px")),(t.currentDevicePixelRatio!==n||o.height!==r||o.width!==a)&&(t.currentDevicePixelRatio=n,o.height=r,o.width=a,t.ctx.setTransform(n,0,0,n,0,0),!0)}var Oi=function(){var t=!1;try{var e={get passive(){return t=!0,!1}};window.addEventListener("test",null,e),window.removeEventListener("test",null,e)}catch(i){}return t}();function Ci(t,e){var i=function(t,e){return bi(t).getPropertyValue(e)}(t,e),n=i&&i.match(/^(\d+)(\.\d+)?px$/);return n?+n[1]:void 0}function Di(t,e,i,n){return{x:t.x+i*(e.x-t.x),y:t.y+i*(e.y-t.y)}}function Ai(t,e,i,n){return{x:t.x+i*(e.x-t.x),y:"middle"===n?i<.5?t.y:e.y:"after"===n?i<1?t.y:e.y:i>0?e.y:t.y}}function Ti(t,e,i,n){var r={x:t.cp2x,y:t.cp2y},a={x:e.cp1x,y:e.cp1y},o=Di(t,r,i),s=Di(r,a,i),l=Di(a,e,i),u=Di(o,s,i),h=Di(s,l,i);return Di(u,h,i)}var Ei=function(t,e){return{x:function(i){return t+t+e-i},setWidth:function(t){e=t},textAlign:function(t){return"center"===t?t:"right"===t?"left":"right"},xPlus:function(t,e){return t-e},leftForLtr:function(t,e){return t-e}}},Zi=function(){return{x:function(t){return t},setWidth:function(t){},textAlign:function(t){return t},xPlus:function(t,e){return t+e},leftForLtr:function(t,e){return t}}};function Li(t,e,i){return t?Ei(e,i):Zi()}function Ri(t,e){var i,n;"ltr"!==e&&"rtl"!==e||(n=[(i=t.canvas.style).getPropertyValue("direction"),i.getPropertyPriority("direction")],i.setProperty("direction",e,"important"),t.prevTextDirection=n)}function Ii(t,e){void 0!==e&&(delete t.prevTextDirection,t.canvas.style.setProperty("direction",e[0],e[1]))}function Fi(t){return"angle"===t?{between:Ft,compare:Rt,normalize:It}:{between:Wt,compare:function(t,e){return t-e},normalize:function(t){return t}}}function zi(t){var e=t.start,i=t.end,n=t.count;return{start:e%n,end:i%n,loop:t.loop&&(i-e+1)%n===0,style:t.style}}function ji(t,e,i){if(!i)return[t];for(var n,r,a,o=i.property,s=i.start,l=i.end,u=e.length,h=Fi(o),c=h.compare,d=h.between,f=h.normalize,v=function(t,e,i){var n,r,a=i.property,o=i.start,s=i.end,l=Fi(a),u=l.between,h=l.normalize,c=e.length,d=t.start,f=t.end,v=t.loop;if(v){for(d+=c,f+=c,n=0,r=c;nr&&t[a%e].skip;)a--;return{start:r,end:a%=e}}(i,r,a,n),s=o.start,l=o.end;return Ni(t,!0===n?[{start:s,end:l,loop:a}]:function(t,e,i,n){var r,a=t.length,o=[],s=e,l=t[e];for(r=e+1;r<=i;++r){var u=t[r%a];u.skip||u.stop?l.skip||(n=!1,o.push({start:e%a,end:(r-1)%a,loop:n}),e=s=u.stop?r:null):(s=r,l.skip&&(e=r)),l=u}return null!==s&&o.push({start:e%a,end:s%a,loop:n}),o}(i,s,lt||t.length>e.length&&t.slice(0,e.length)===e},p=.001,y=function(t,e,i){return Math.min(i,Math.max(e,t))};function m(t,e,i){for(var n=0,r=Object.keys(t);n=r-l-p&&t.x<=o+l+p,h=t.y>=a-l-p&&t.y<=s+l+p;return"x"===i?u:("y"===i||u)&&h}function x(t,e){var i=t.getProps(["centerX","centerY"],e);return{x:i.centerX,y:i.centerY}}var k=function(t){return"string"===typeof t&&t.endsWith("%")},_=function(t){return parseFloat(t)/100},w=function(t){return y(_(t),0,1)},M=function(t,e){return{x:t,y:e,x2:t,y2:e,width:0,height:0}},S={box:function(t){return M(t.centerX,t.centerY)},ellipse:function(t){return{centerX:t.centerX,centerY:t.centerX,radius:0,width:0,height:0}},label:function(t){return M(t.centerX,t.centerY)},line:function(t){return M(t.x,t.y)},point:function(t){return{centerX:t.centerX,centerY:t.centerY,radius:0,width:0,height:0}},polygon:function(t){return M(t.centerX,t.centerY)}};function P(t,e){return"start"===e?0:"end"===e?t:k(e)?w(e)*t:t/2}function O(t,e){var i=!(arguments.length>2&&void 0!==arguments[2])||arguments[2];return"number"===typeof e?e:k(e)?(i?w(e):_(e))*t:t}function C(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:"center";return(0,c.i)(t)?{x:(0,c.v)(t.x,e),y:(0,c.v)(t.y,e)}:{x:t=(0,c.v)(t,e),y:t}}function D(t){return t&&((0,c.h)(t.xValue)||(0,c.h)(t.yValue))}function A(t,e,i){var n=i.init;if(n)return!0===n?E(e,i):function(t,e,i){var n=(0,c.Q)(i.init,[{chart:t,properties:e,options:i}]);if(!0===n)return E(e,i);if((0,c.i)(n))return n}(t,e,i)}function T(t,e,i){var n=!1;return e.forEach((function(e){(0,c.a7)(t[e])?(n=!0,i[e]=t[e]):(0,c.h)(i[e])&&delete i[e]})),n}function E(t,e){var i=e.type||"line";return S[i](t)}var Z=new Map,L=function(t){return t.reduce((function(t,e){return t+=e.string}),"")};function R(t){if(t&&"object"===typeof t){var e=t.toString();return"[object HTMLImageElement]"===e||"[object HTMLCanvasElement]"===e}}function I(t,e,i){var n=e.x,r=e.y;i&&(t.translate(n,r),t.rotate((0,c.t)(i)),t.translate(-n,-r))}function F(t,e){if(e&&e.borderWidth)return t.lineCap=e.borderCapStyle,t.setLineDash(e.borderDash),t.lineDashOffset=e.borderDashOffset,t.lineJoin=e.borderJoinStyle,t.lineWidth=e.borderWidth,t.strokeStyle=e.borderColor,!0}function z(t,e){t.shadowColor=e.backgroundShadowColor,t.shadowBlur=e.shadowBlur,t.shadowOffsetX=e.shadowOffsetX,t.shadowOffsetY=e.shadowOffsetY}function j(t,e){var i=e.content;if(R(i))return{width:O(i.width,e.width),height:O(i.height,e.height)};var n=e.font,r=(0,c.b)(n)?n.map((function(t){return(0,c.a0)(t)})):[(0,c.a0)(n)],a=e.textStrokeWidth,o=(0,c.b)(i)?i:[i],s=o.join()+L(r)+a+(t._measureText?"-spriting":"");return Z.has(s)||Z.set(s,function(t,e,i,n){t.save();for(var r=e.length,a=0,o=n,s=0;s0)return t.lineJoin="round",t.miterLimit=2,t.lineWidth=e.textStrokeWidth,t.strokeStyle=e.textStrokeColor,!0}(t,i)&&function(t,e,i,n){var r=e.x,a=e.y;t.beginPath();var o=0;i.forEach((function(e,i){var s=n[Math.min(i,n.length-1)],l=s.lineHeight;t.font=s.string,t.strokeText(e,r,a+l/2+o),o+=l})),t.stroke()}(t,{x:u,y:h},r,o),function(t,e,i,n){var r=e.x,a=e.y,o=n.fonts,s=n.colors,l=0;i.forEach((function(e,i){var n=s[Math.min(i,s.length-1)],u=o[Math.min(i,o.length-1)],h=u.lineHeight;t.beginPath(),t.font=u.string,t.fillStyle=n,t.fillText(e,r,a+h/2+l),l+=h,t.fill()}))}(t,{x:u,y:h},r,{fonts:o,colors:l}),t.restore()}function N(t,e,i,n){var r=e.radius,a=e.options,o=a.pointStyle,s=a.rotation,l=(s||0)*c.b3;if(R(o))return t.save(),t.translate(i,n),t.rotate(l),t.drawImage(o,-o.width/2,-o.height/2,o.width,o.height),void t.restore();(function(t){return isNaN(t)||t<=0})(r)||function(t,e){var i,n,r,a,o=e.x,s=e.y,l=e.radius,u=e.rotation,h=e.style,d=e.rad;switch(t.beginPath(),h){default:t.arc(o,s,l,0,c.T),t.closePath();break;case"triangle":t.moveTo(o+Math.sin(d)*l,s-Math.cos(d)*l),d+=c.b5,t.lineTo(o+Math.sin(d)*l,s-Math.cos(d)*l),d+=c.b5,t.lineTo(o+Math.sin(d)*l,s-Math.cos(d)*l),t.closePath();break;case"rectRounded":r=l-(a=.516*l),i=Math.cos(d+c.b4)*r,n=Math.sin(d+c.b4)*r,t.arc(o-i,s-n,a,d-c.P,d-c.H),t.arc(o+n,s-i,a,d-c.H,d),t.arc(o+i,s+n,a,d,d+c.H),t.arc(o-n,s+i,a,d+c.H,d+c.P),t.closePath();break;case"rect":if(!u){r=Math.SQRT1_2*l,t.rect(o-r,s-r,2*r,2*r);break}d+=c.b4;case"rectRot":i=Math.cos(d)*l,n=Math.sin(d)*l,t.moveTo(o-i,s-n),t.lineTo(o+n,s-i),t.lineTo(o+i,s+n),t.lineTo(o-n,s+i),t.closePath();break;case"crossRot":d+=c.b4;case"cross":i=Math.cos(d)*l,n=Math.sin(d)*l,t.moveTo(o-i,s-n),t.lineTo(o+i,s+n),t.moveTo(o+n,s-i),t.lineTo(o-n,s+i);break;case"star":i=Math.cos(d)*l,n=Math.sin(d)*l,t.moveTo(o-i,s-n),t.lineTo(o+i,s+n),t.moveTo(o+n,s-i),t.lineTo(o-n,s+i),d+=c.b4,i=Math.cos(d)*l,n=Math.sin(d)*l,t.moveTo(o-i,s-n),t.lineTo(o+i,s+n),t.moveTo(o+n,s-i),t.lineTo(o-n,s+i);break;case"line":i=Math.cos(d)*l,n=Math.sin(d)*l,t.moveTo(o-i,s-n),t.lineTo(o+i,s+n);break;case"dash":t.moveTo(o,s),t.lineTo(o+Math.cos(d)*l,s+Math.sin(d)*l)}t.fill()}(t,{x:i,y:n,radius:r,rotation:s,style:o,rad:l})}var B={xScaleID:{min:"xMin",max:"xMax",start:"left",end:"right",startProp:"x",endProp:"x2"},yScaleID:{min:"yMin",max:"yMax",start:"bottom",end:"top",startProp:"y",endProp:"y2"}};function H(t,e,i){return e="number"===typeof e?e:t.parse(e),(0,c.g)(e)?t.getPixelForValue(e):i}function Y(t,e,i){var n=e[i];if(n||"scaleID"===i)return n;var r=i.charAt(0),a=Object.values(t).filter((function(t){return t.axis&&t.axis===r}));return a.length?a[0].id:r}function X(t,e){if(t){var i=t.options.reverse;return{start:H(t,e.min,i?e.end:e.start),end:H(t,e.max,i?e.start:e.end)}}}function U(t,e){var i=t.chartArea,n=t.scales,r=n[Y(n,e,"xScaleID")],a=n[Y(n,e,"yScaleID")],o=i.width/2,s=i.height/2;return r&&(o=H(r,e.xValue,r.left+r.width/2)),a&&(s=H(a,e.yValue,a.top+a.height/2)),{x:o,y:s}}function $(t,e){var i=t.scales,n=i[Y(i,e,"xScaleID")],r=i[Y(i,e,"yScaleID")];if(!n&&!r)return{};var a=n||t.chartArea,o=a.left,s=a.right,l=r||t.chartArea,u=l.top,h=l.bottom,c=J(n,{min:e.xMin,max:e.xMax,start:o,end:s});o=c.start,s=c.end;var d=J(r,{min:e.yMin,max:e.yMax,start:h,end:u});return{x:o,y:u=d.start,x2:s,y2:h=d.end,width:s-o,height:h-u,centerX:o+(s-o)/2,centerY:u+(h-u)/2}}function K(t,e){if(!D(e)){var i=$(t,e),n=e.radius;n&&!isNaN(n)||(n=Math.min(i.width,i.height)/2,e.radius=n);var r=2*n,a=i.centerX+e.xAdjust,o=i.centerY+e.yAdjust;return{x:a-n,y:o-n,x2:a+n,y2:o+n,centerX:a,centerY:o,width:r,height:r,radius:n}}return function(t,e){var i=U(t,e),n=2*e.radius;return{x:i.x-e.radius+e.xAdjust,y:i.y-e.radius+e.yAdjust,x2:i.x+e.radius+e.xAdjust,y2:i.y+e.radius+e.yAdjust,centerX:i.x+e.xAdjust,centerY:i.y+e.yAdjust,radius:e.radius,width:n,height:n}}(t,e)}function Q(t,e){var i=t.scales,n=t.chartArea,r=i[e.scaleID],a={x:n.left,y:n.top,x2:n.right,y2:n.bottom};return r?function(t,e,i){var n=H(t,i.value,NaN),r=H(t,i.endValue,n);t.isHorizontal()?(e.x=n,e.x2=r):(e.y=n,e.y2=r)}(r,a,e):function(t,e,i){for(var n=0,r=Object.keys(B);n0||0===r.borderWidth)&&(t.moveTo(u.x,u.y),t.lineTo(h.x,h.y));t.moveTo(f.x,f.y),t.lineTo(v.x,v.y);var g=et({x:i,y:n},e.getCenterPoint(),(0,c.t)(-e.rotation));t.lineTo(g.x,g.y),t.stroke(),t.restore()}(t,this),W(t,this,e),V(t,function(t){var e=t.x,i=t.y,n=t.width,r=t.height,a=t.options,o=a.borderWidth/2,s=(0,c.E)(a.padding);return{x:e+s.left+o,y:i+s.top+o,width:n-s.left-s.right-a.borderWidth,height:r-s.top-s.bottom-a.borderWidth}}(this),e),t.restore())}},{key:"resolveElementProperties",value:function(t,e){var i;if(D(e))i=U(t,e);else{var n=$(t,e);i={x:n.centerX,y:n.centerY}}var a=(0,c.E)(e.padding),o=function(t,e,i,n){var r=e.width+n.width+i.borderWidth,a=e.height+n.height+i.borderWidth,o=C(i.position,"center"),s=yt(t.x,r,i.xAdjust,o.x),l=yt(t.y,a,i.yAdjust,o.y);return{x:s,y:l,x2:s+r,y2:l+a,width:r,height:a,centerX:s+r/2,centerY:l+a/2}}(i,j(t.ctx,e),e,a);return(0,r.Z)((0,r.Z)({initProperties:A(t,o,e),pointX:i.x,pointY:i.y},o),{},{rotation:e.rotation})}}]),i}(h.W_);function yt(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:0;return t-P(e,arguments.length>3?arguments[3]:void 0)+i}pt.id="labelAnnotation",pt.defaults={adjustScaleRange:!0,backgroundColor:"transparent",backgroundShadowColor:"transparent",borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",borderRadius:0,borderShadowColor:"transparent",borderWidth:0,callout:{borderCapStyle:"butt",borderColor:void 0,borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",borderWidth:1,display:!1,margin:5,position:"auto",side:5,start:"50%"},color:"black",content:null,display:!0,font:{family:void 0,lineHeight:void 0,size:void 0,style:void 0,weight:void 0},height:void 0,init:void 0,opacity:void 0,padding:6,position:"center",rotation:0,shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,textAlign:"center",textStrokeColor:void 0,textStrokeWidth:0,width:void 0,xAdjust:0,xMax:void 0,xMin:void 0,xScaleID:void 0,xValue:void 0,yAdjust:0,yMax:void 0,yMin:void 0,yScaleID:void 0,yValue:void 0,z:0},pt.defaultRoutes={borderColor:"color"};var mt=function(t,e,i){return{x:t.x+i*(e.x-t.x),y:t.y+i*(e.y-t.y)}},bt=function(t,e,i){return mt(e,i,Math.abs((t-e.y)/(i.y-e.y))).x},xt=function(t,e,i){return mt(e,i,Math.abs((t-e.x)/(i.x-e.x))).y},kt=function(t){return t*t},_t=function(t,e,i,n){return(1-n)*(1-n)*t+2*(1-n)*n*e+n*n*i},wt=function(t,e,i,n){return{x:_t(t.x,e.x,i.x,n),y:_t(t.y,e.y,i.y,n)}},Mt=function(t,e,i,n){return 2*(1-n)*(e-t)+2*n*(i-e)},St=function(t,e,i,n){return-Math.atan2(Mt(t.x,e.x,i.x,n),Mt(t.y,e.y,i.y,n))+.5*c.P},Pt=function(t){(0,s.Z)(i,t);var e=(0,l.Z)(i);function i(){return(0,a.Z)(this,i),e.apply(this,arguments)}return(0,o.Z)(i,[{key:"inRange",value:function(t,e,i,n){var r=this.options.borderWidth/2;if("x"!==i&&"y"!==i){var a={mouseX:t,mouseY:e},o=this.path,s=this.ctx;if(o){F(s,this.options);var l=this.$context.chart,u=t*l.currentDevicePixelRatio,h=e*l.currentDevicePixelRatio,c=s.isPointInStroke(o,u,h)||Dt(this,a,n);return s.restore(),c}return function(t,e){var i,n,r=e.mouseX,a=e.mouseY,o=arguments.length>2&&void 0!==arguments[2]?arguments[2]:p,s=arguments.length>3?arguments[3]:void 0,l=t.getProps(["x","y","x2","y2"],s),u=l.x,h=l.y,c=l.x2,d=l.y2,f=c-u,v=d-h,g=kt(f)+kt(v),y=0===g?-1:((r-u)*f+(a-h)*v)/g;y<0?(i=u,n=h):y>1?(i=c,n=d):(i=u+y*f,n=h+y*v);return kt(r-i)+kt(a-n)<=o}(this,a,kt(r),n)||Dt(this,a,n)}return function(t,e,i,n){var r=e.mouseX,a=e.mouseY,o=n.hBorderWidth,s=n.useFinalPosition,l=function(t,e,i,n){var r=i.x,a=i.y,o=i.x2,s=i.y2;return"y"===n?{start:Math.min(a,s),end:Math.max(a,s),value:e}:{start:Math.min(r,o),end:Math.max(r,o),value:t}}(r,a,t.getProps(["x","y","x2","y2"],s),i);return l.value>=l.start-o&&l.value<=l.end+o||Dt(t,{mouseX:r,mouseY:a},s,i)}(this,{mouseX:t,mouseY:e},i,{hBorderWidth:r,useFinalPosition:n})}},{key:"getCenterPoint",value:function(t){return x(this,t)}},{key:"draw",value:function(t){var e=this.x,i=this.y,n=this.x2,r=this.y2,a=this.cp,o=this.options;if(t.save(),!F(t,o))return t.restore();z(t,o);var s=Math.sqrt(Math.pow(n-e,2)+Math.pow(r-i,2));if(o.curve&&a)return function(t,e,i,n){var r=e.x,a=e.y,o=e.x2,s=e.y2,l=e.options,u=Et(e),h=u.startOpts,d=u.endOpts,f=u.startAdjust,v=u.endAdjust,g={x:r,y:a},p={x:o,y:s},y=St(g,i,p,0),m=St(g,i,p,1)-c.P,b=wt(g,i,p,f/n),x=wt(g,i,p,1-v/n),k=new Path2D;t.beginPath(),k.moveTo(b.x,b.y),k.quadraticCurveTo(i.x,i.y,x.x,x.y),t.shadowColor=l.borderShadowColor,t.stroke(k),e.path=k,e.ctx=t,Rt(t,b,{angle:y,adjust:f},h),Rt(t,x,{angle:m,adjust:v},d)}(t,this,a,s),t.restore();var l=Et(this),u=l.startOpts,h=l.endOpts,d=l.startAdjust,f=l.endAdjust,v=Math.atan2(r-i,n-e);t.translate(e,i),t.rotate(v),t.beginPath(),t.moveTo(0+d,0),t.lineTo(s-f,0),t.shadowColor=o.borderShadowColor,t.stroke(),Lt(t,0,d,u),Lt(t,s,-f,h),t.restore()}},{key:"label",get:function(){return this.elements&&this.elements[0]}},{key:"resolveElementProperties",value:function(t,e){var i=Q(t,e),n=i.x,r=i.y,a=i.x2,o=i.y2,s=function(t,e){var i=t.x,n=t.y,r=t.x2,a=t.y2,o=e.top,s=e.right,l=e.bottom,u=e.left;return!(is&&r>s||nl&&a>l)}(i,t.chartArea),l=s?function(t,e,i){var n=Ct(t,e,i),r=n.x,a=n.y,o=Ct(e,t,i),s=o.x,l=o.y;return{x:r,y:a,x2:s,y2:l,width:Math.abs(s-r),height:Math.abs(l-a)}}({x:n,y:r},{x:a,y:o},t.chartArea):{x:n,y:r,x2:a,y2:o,width:Math.abs(a-n),height:Math.abs(o-r)};if(l.centerX=(a+n)/2,l.centerY=(o+r)/2,l.initProperties=A(t,l,e),e.curve){var u={x:l.x,y:l.y},h={x:l.x2,y:l.y2};l.cp=function(t,e,i){var n=t.x,r=t.y,a=t.x2,o=t.y2,s=t.centerX,l=t.centerY,u=Math.atan2(o-r,a-n),h=C(e.controlPoint,0);return et({x:s+O(i,h.x,!1),y:l+O(i,h.y,!1)},{x:s,y:l},u)}(l,e,(0,c.aE)(u,h))}var d=function(t,e,i){var n=i.borderWidth,r=(0,c.E)(i.padding),a=j(t.ctx,i),o=a.width+r.width+n,s=a.height+r.height+n;return function(t,e,i,n){var r=i.width,a=i.height,o=i.padding,s=e.xAdjust,l=e.yAdjust,u={x:t.x,y:t.y},h={x:t.x2,y:t.y2},d="auto"===e.rotation?function(t){var e=t.x,i=t.y,n=t.x2,r=t.y2,a=Math.atan2(r-i,n-e);return a>c.P/2?a-c.P:ao&&(r=xt(o,{x:n,y:r},e),n=o),rs&&(n=bt(s,{x:n,y:r},e),r=s),{x:n,y:r}}function Dt(t,e,i,n){var r=e.mouseX,a=e.mouseY,o=t.label;return o.options.display&&o.inRange(r,a,n,i)}function At(t,e,i,n){var r=e.labelSize,a=e.padding,o=t.w*n.dx,s=t.h*n.dy,l=o>0&&(r.w/2+a.left-n.x)/o,u=s>0&&(r.h/2+a.top-n.y)/s;return y(Math.max(l,u),0,.25)}function Tt(t,e){var i=e.size,n=e.min,r=e.max,a=e.padding,o=i/2;return i>r-n?(r+n)/2:(n>=t-a-o&&(t=n+a+o),r<=t+a+o&&(t=r-a-o),t)}function Et(t){var e=t.options,i=e.arrowHeads&&e.arrowHeads.start,n=e.arrowHeads&&e.arrowHeads.end;return{startOpts:i,endOpts:n,startAdjust:Zt(t,i),endAdjust:Zt(t,n)}}function Zt(t,e){if(!e||!e.display)return 0;var i=e.length,n=e.width,r=t.options.borderWidth/2,a={x:i,y:n+r},o={x:0,y:r};return Math.abs(bt(0,a,o))}function Lt(t,e,i,n){if(n&&n.display){var r=n.length,a=n.width,o=n.fill,s=n.backgroundColor,l=n.borderColor,u=Math.abs(e-r)+i;t.beginPath(),z(t,n),F(t,n),t.moveTo(u,-a),t.lineTo(e+i,0),t.lineTo(u,a),!0===o?(t.fillStyle=s||l,t.closePath(),t.fill(),t.shadowColor="transparent"):t.shadowColor=n.borderShadowColor,t.stroke()}}function Rt(t,e,i,n){var r=e.x,a=e.y,o=i.angle,s=i.adjust;n&&n.display&&(t.save(),t.translate(r,a),t.rotate(o),Lt(t,0,-s,n),t.restore())}Pt.defaults={adjustScaleRange:!0,arrowHeads:{display:!1,end:Object.assign({},Ot),fill:!1,length:12,start:Object.assign({},Ot),width:6},borderDash:[],borderDashOffset:0,borderShadowColor:"transparent",borderWidth:2,curve:!1,controlPoint:{y:"-50%"},display:!0,endValue:void 0,init:void 0,label:{backgroundColor:"rgba(0,0,0,0.8)",backgroundShadowColor:"transparent",borderCapStyle:"butt",borderColor:"black",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",borderRadius:6,borderShadowColor:"transparent",borderWidth:0,callout:Object.assign({},pt.defaults.callout),color:"#fff",content:null,display:!1,drawTime:void 0,font:{family:void 0,lineHeight:void 0,size:void 0,style:void 0,weight:"bold"},height:void 0,opacity:void 0,padding:6,position:"center",rotation:0,shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,textAlign:"center",textStrokeColor:void 0,textStrokeWidth:0,width:void 0,xAdjust:0,yAdjust:0,z:void 0},scaleID:void 0,shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,value:void 0,xMax:void 0,xMin:void 0,xScaleID:void 0,yMax:void 0,yMin:void 0,yScaleID:void 0,z:0},Pt.descriptors={arrowHeads:{start:{_fallback:!0},end:{_fallback:!0},_fallback:!0}},Pt.defaultRoutes={borderColor:"color"};var It=function(t){(0,s.Z)(i,t);var e=(0,l.Z)(i);function i(){return(0,a.Z)(this,i),e.apply(this,arguments)}return(0,o.Z)(i,[{key:"inRange",value:function(t,e,i,n){var r=this.options.rotation,a=this.options.borderWidth;if("x"!==i&&"y"!==i)return function(t,e,i,n){var r=e.width,a=e.height,o=e.centerX,s=e.centerY,l=r/2,u=a/2;if(l<=0||u<=0)return!1;var h=(0,c.t)(i||0),d=n/2||0,f=Math.cos(h),v=Math.sin(h),g=Math.pow(f*(t.x-o)+v*(t.y-s),2),p=Math.pow(v*(t.x-o)-f*(t.y-s),2);return g/Math.pow(l+d,2)+p/Math.pow(u+d,2)<=1.0001}({x:t,y:e},this.getProps(["width","height","centerX","centerY"],n),r,a);var o=this.getProps(["x","y","x2","y2"],n),s=o.x,l=o.y,u=o.x2,h=o.y2,d=a/2,f="y"===i?{start:l,end:h}:{start:s,end:u},v=et({x:t,y:e},this.getCenterPoint(n),(0,c.t)(-r));return v[i]>=f.start-d-p&&v[i]<=f.end+d+p}},{key:"getCenterPoint",value:function(t){return x(this,t)}},{key:"draw",value:function(t){var e=this.width,i=this.height,n=this.centerX,r=this.centerY,a=this.options;t.save(),I(t,this.getCenterPoint(),a.rotation),z(t,this.options),t.beginPath(),t.fillStyle=a.backgroundColor;var o=F(t,a);t.ellipse(n,r,i/2,e/2,c.P/2,0,2*c.P),t.fill(),o&&(t.shadowColor=a.borderShadowColor,t.stroke()),t.restore()}},{key:"label",get:function(){return this.elements&&this.elements[0]}},{key:"resolveElementProperties",value:function(t,e){return q(t,e)}}]),i}(h.W_);It.id="ellipseAnnotation",It.defaults={adjustScaleRange:!0,backgroundShadowColor:"transparent",borderDash:[],borderDashOffset:0,borderShadowColor:"transparent",borderWidth:1,display:!0,init:void 0,label:Object.assign({},vt.defaults.label),rotation:0,shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,xMax:void 0,xMin:void 0,xScaleID:void 0,yMax:void 0,yMin:void 0,yScaleID:void 0,z:0},It.defaultRoutes={borderColor:"color",backgroundColor:"color"},It.descriptors={label:{_fallback:!0}};var Ft=function(t){(0,s.Z)(i,t);var e=(0,l.Z)(i);function i(){return(0,a.Z)(this,i),e.apply(this,arguments)}return(0,o.Z)(i,[{key:"inRange",value:function(t,e,i,n){var r=this.getProps(["x","y","x2","y2","width"],n),a=r.x,o=r.y,s=r.x2,l=r.y2,u=r.width,h=this.options.borderWidth;if("x"!==i&&"y"!==i)return function(t,e,i,n){if(!t||!e||i<=0)return!1;var r=n/2;return Math.pow(t.x-e.x,2)+Math.pow(t.y-e.y,2)<=Math.pow(i+r,2)}({x:t,y:e},this.getCenterPoint(n),u/2,h);var c=h/2,d="y"===i?{start:o,end:l,value:e}:{start:a,end:s,value:t};return d.value>=d.start-c&&d.value<=d.end+c}},{key:"getCenterPoint",value:function(t){return x(this,t)}},{key:"draw",value:function(t){var e=this.options,i=e.borderWidth;if(!(e.radius<.1)){t.save(),t.fillStyle=e.backgroundColor,z(t,e);var n=F(t,e);N(t,this,this.centerX,this.centerY),n&&!R(e.pointStyle)&&(t.shadowColor=e.borderShadowColor,t.stroke()),t.restore(),e.borderWidth=i}}},{key:"resolveElementProperties",value:function(t,e){var i=K(t,e);return i.initProperties=A(t,i,e),i}}]),i}(h.W_);Ft.id="pointAnnotation",Ft.defaults={adjustScaleRange:!0,backgroundShadowColor:"transparent",borderDash:[],borderDashOffset:0,borderShadowColor:"transparent",borderWidth:1,display:!0,init:void 0,pointStyle:"circle",radius:10,rotation:0,shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,xAdjust:0,xMax:void 0,xMin:void 0,xScaleID:void 0,xValue:void 0,yAdjust:0,yMax:void 0,yMin:void 0,yScaleID:void 0,yValue:void 0,z:0},Ft.defaultRoutes={borderColor:"color",backgroundColor:"color"};var zt=function(t){(0,s.Z)(i,t);var e=(0,l.Z)(i);function i(){return(0,a.Z)(this,i),e.apply(this,arguments)}return(0,o.Z)(i,[{key:"inRange",value:function(t,e,i,r){if("x"!==i&&"y"!==i)return this.options.radius>=.1&&this.elements.length>1&&function(t,e,i,n){var r,a=!1,o=t[t.length-1].getProps(["bX","bY"],n),s=(0,u.Z)(t);try{for(s.s();!(r=s.n()).done;){var l=r.value.getProps(["bX","bY"],n);l.bY>i!==o.bY>i&&e<(o.bX-l.bX)*(i-l.bY)/(o.bY-l.bY)+l.bX&&(a=!a),o=l}}catch(h){s.e(h)}finally{s.f()}return a}(this.elements,t,e,r);var a=et({x:t,y:e},this.getCenterPoint(r),(0,c.t)(-this.options.rotation)),o=this.elements.map((function(t){return"y"===i?t.bY:t.bX})),s=Math.min.apply(Math,(0,n.Z)(o)),l=Math.max.apply(Math,(0,n.Z)(o));return a[i]>=s&&a[i]<=l}},{key:"getCenterPoint",value:function(t){return x(this,t)}},{key:"draw",value:function(t){var e=this.elements,i=this.options;t.save(),t.beginPath(),t.fillStyle=i.backgroundColor,z(t,i);var n,r=F(t,i),a=!0,o=(0,u.Z)(e);try{for(o.s();!(n=o.n()).done;){var s=n.value;a?(t.moveTo(s.x,s.y),a=!1):t.lineTo(s.x,s.y)}}catch(l){o.e(l)}finally{o.f()}t.closePath(),t.fill(),r&&(t.shadowColor=i.borderShadowColor,t.stroke()),t.restore()}},{key:"resolveElementProperties",value:function(t,e){for(var i=K(t,e),n=e.sides,r=e.rotation,a=[],o=2*c.P/n,s=r*c.b3,l=0;l0&&void 0!==arguments[0]?arguments[0]:"line";return Wt[t]?t:(console.warn("Unknown annotation type: '".concat(t,"', defaulting to 'line'")),"line")}function Xt(t,e,i,r){for(var a=function(t,e,i){if("reset"===i||"none"===i||"resize"===i)return Vt;return new h.FK(t,e)}(t,i.animations,r),o=e.annotations,s=function(t,e){var i=e.length,r=t.length;if(ri&&t.splice(i,r-i);return t}(e.elements,o),l=0;l3&&void 0!==arguments[3])||arguments[3],a=i.split("."),o=0,s=(0,u.Z)(e.split("."));try{for(s.s();!(n=s.n()).done;){var l=n.value,h=a[o++];if(parseInt(l,10)=0||(r[i]=t[i]);return r}(t,e);if(Object.getOwnPropertySymbols){var a=Object.getOwnPropertySymbols(t);for(n=0;n=0||Object.prototype.propertyIsEnumerable.call(t,i)&&(r[i]=t[i])}return r}i.d(e,{x1:function(){return p}});var r=i(1413),a=i(2791),o=i(3644),s=["height","width","redraw","datasetIdKey","type","data","options","plugins","fallbackContent","updateMode"],l="label";function u(t,e){"function"===typeof t?t(e):t&&(t.current=e)}function h(t,e){t.labels=e}function c(t,e){var i=arguments.length>2&&void 0!==arguments[2]?arguments[2]:l,n=[];t.datasets=e.map((function(e){var a=t.datasets.find((function(t){return t[i]===e[i]}));return a&&e.data&&!n.includes(a)?(n.push(a),Object.assign(a,e),a):(0,r.Z)({},e)}))}function d(t){var e=arguments.length>1&&void 0!==arguments[1]?arguments[1]:l,i={labels:[],datasets:[]};return h(i,t.labels),c(i,t.datasets,e),i}function f(t,e){var i=t.height,l=void 0===i?150:i,f=t.width,v=void 0===f?300:f,g=t.redraw,p=void 0!==g&&g,y=t.datasetIdKey,m=t.type,b=t.data,x=t.options,k=t.plugins,_=void 0===k?[]:k,w=t.fallbackContent,M=t.updateMode,S=n(t,s),P=(0,a.useRef)(null),O=(0,a.useRef)(),C=function(){P.current&&(O.current=new o.kL(P.current,{type:m,data:d(b,y),options:x&&(0,r.Z)({},x),plugins:_}),u(e,O.current))},D=function(){u(e,null),O.current&&(O.current.destroy(),O.current=null)};return(0,a.useEffect)((function(){!p&&O.current&&x&&function(t,e){var i=t.options;i&&e&&Object.assign(i,e)}(O.current,x)}),[p,x]),(0,a.useEffect)((function(){!p&&O.current&&h(O.current.config.data,b.labels)}),[p,b.labels]),(0,a.useEffect)((function(){!p&&O.current&&b.datasets&&c(O.current.config.data,b.datasets,y)}),[p,b.datasets]),(0,a.useEffect)((function(){O.current&&(p?(D(),setTimeout(C)):O.current.update(M))}),[p,x,b.labels,b.datasets,M]),(0,a.useEffect)((function(){O.current&&(D(),setTimeout(C))}),[m]),(0,a.useEffect)((function(){return C(),function(){return D()}}),[]),a.createElement("canvas",Object.assign({ref:P,role:"img",height:l,width:v},S),w)}var v=(0,a.forwardRef)(f);function g(t,e){return o.kL.register(e),(0,a.forwardRef)((function(e,i){return a.createElement(v,Object.assign({},e,{ref:i,type:t}))}))}var p=g("line",o.ST);o.vn,o.Xi,o.jI,o.CV,o.N0,o.tt,o.ho}}]); +//# sourceMappingURL=410.7559e4e7.chunk.js.map \ No newline at end of file diff --git a/static/js/410.2838bd24.chunk.js.LICENSE.txt b/static/js/410.7559e4e7.chunk.js.LICENSE.txt similarity index 92% rename from static/js/410.2838bd24.chunk.js.LICENSE.txt rename to static/js/410.7559e4e7.chunk.js.LICENSE.txt index 04080b6..4201a57 100644 --- a/static/js/410.2838bd24.chunk.js.LICENSE.txt +++ b/static/js/410.7559e4e7.chunk.js.LICENSE.txt @@ -6,7 +6,7 @@ */ /*! - * Chart.js v4.3.3 + * Chart.js v4.4.0 * https://www.chartjs.org * (c) 2023 Chart.js Contributors * Released under the MIT License diff --git a/static/js/410.7559e4e7.chunk.js.map b/static/js/410.7559e4e7.chunk.js.map new file mode 100644 index 0000000..2a6faef --- /dev/null +++ b/static/js/410.7559e4e7.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"file":"static/js/410.7559e4e7.chunk.js","mappings":"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","sources":["../node_modules/react-hotkeys-hook/src/parseHotkeys.ts","../node_modules/react-hotkeys-hook/src/isHotkeyPressed.ts","../node_modules/react-hotkeys-hook/src/validators.ts","../node_modules/react-hotkeys-hook/src/BoundHotkeysProxyProvider.tsx","../node_modules/react-hotkeys-hook/src/deepEqual.ts","../node_modules/react-hotkeys-hook/src/HotkeysProvider.tsx","../node_modules/react-hotkeys-hook/src/useHotkeys.ts","../node_modules/react-hotkeys-hook/src/useDeepEqualMemo.ts","../node_modules/@babel/runtime/helpers/esm/defineProperty.js","../node_modules/@babel/runtime/helpers/esm/objectSpread2.js","../node_modules/@babel/runtime/helpers/esm/get.js","../node_modules/@babel/runtime/helpers/esm/superPropBase.js","../node_modules/chart.js/src/core/core.animator.js","../node_modules/chart.js/src/core/core.animation.js","../node_modules/chart.js/src/core/core.animations.js","../node_modules/chart.js/src/core/core.datasetController.js","../node_modules/chart.js/src/controllers/controller.bar.js","../node_modules/chart.js/src/controllers/controller.bubble.js","../node_modules/chart.js/src/controllers/controller.doughnut.js","../node_modules/chart.js/src/controllers/controller.line.js","../node_modules/chart.js/src/controllers/controller.polarArea.js","../node_modules/chart.js/src/controllers/controller.pie.js","../node_modules/chart.js/src/controllers/controller.radar.js","../node_modules/chart.js/src/controllers/controller.scatter.js","../node_modules/chart.js/src/core/core.adapters.ts","../node_modules/chart.js/src/core/core.interaction.js","../node_modules/chart.js/src/core/core.layouts.js","../node_modules/chart.js/src/platform/platform.base.js","../node_modules/chart.js/src/platform/platform.basic.js","../node_modules/chart.js/src/platform/platform.dom.js","../node_modules/chart.js/src/platform/index.js","../node_modules/chart.js/src/core/core.element.ts","../node_modules/chart.js/src/core/core.scale.autoskip.js","../node_modules/chart.js/src/core/core.scale.js","../node_modules/chart.js/src/core/core.typedRegistry.js","../node_modules/chart.js/src/core/core.registry.js","../node_modules/chart.js/src/core/core.plugins.js","../node_modules/chart.js/src/core/core.config.js","../node_modules/chart.js/src/core/core.controller.js","../node_modules/chart.js/src/elements/element.arc.ts","../node_modules/chart.js/src/elements/element.line.js","../node_modules/chart.js/src/elements/element.point.ts","../node_modules/chart.js/src/elements/element.bar.js","../node_modules/chart.js/src/plugins/plugin.filler/index.js","../node_modules/chart.js/src/plugins/plugin.legend.js","../node_modules/chart.js/src/plugins/plugin.subtitle.js","../node_modules/chart.js/src/plugins/plugin.title.js","../node_modules/chart.js/src/plugins/plugin.tooltip.js","../node_modules/chart.js/src/scales/scale.category.js","../node_modules/chart.js/src/scales/scale.linearbase.js","../node_modules/chart.js/src/scales/scale.linear.js","../node_modules/chart.js/src/scales/scale.logarithmic.js","../node_modules/chart.js/src/scales/scale.radialLinear.js","../node_modules/chart.js/src/scales/scale.time.js","../node_modules/chart.js/src/scales/scale.timeseries.js","../node_modules/@kurkle/color/dist/color.esm.js","../node_modules/chart.js/src/helpers/helpers.core.ts","../node_modules/chart.js/src/helpers/helpers.math.ts","../node_modules/chart.js/src/helpers/helpers.collection.ts","../node_modules/chart.js/src/helpers/helpers.extras.ts","../node_modules/chart.js/src/helpers/helpers.easing.ts","../node_modules/chart.js/src/helpers/helpers.color.ts","../node_modules/chart.js/src/core/core.animations.defaults.js","../node_modules/chart.js/src/helpers/helpers.intl.ts","../node_modules/chart.js/src/core/core.ticks.js","../node_modules/chart.js/src/core/core.defaults.js","../node_modules/chart.js/src/core/core.layouts.defaults.js","../node_modules/chart.js/src/core/core.scale.defaults.js","../node_modules/chart.js/src/helpers/helpers.canvas.ts","../node_modules/chart.js/src/helpers/helpers.options.ts","../node_modules/chart.js/src/helpers/helpers.config.ts","../node_modules/chart.js/src/helpers/helpers.curve.ts","../node_modules/chart.js/src/helpers/helpers.dom.ts","../node_modules/chart.js/src/helpers/helpers.interpolation.ts","../node_modules/chart.js/src/helpers/helpers.rtl.ts","../node_modules/chart.js/src/helpers/helpers.segment.js","../node_modules/chartjs-plugin-annotation/dist/chartjs-plugin-annotation.esm.js","../node_modules/@babel/runtime/helpers/esm/objectWithoutProperties.js","../node_modules/@babel/runtime/helpers/esm/objectWithoutPropertiesLoose.js","../node_modules/react-chartjs-2/src/utils.ts","../node_modules/react-chartjs-2/src/chart.tsx","../node_modules/react-chartjs-2/src/typedCharts.tsx"],"sourcesContent":["import { Hotkey, KeyboardModifiers } from './types'\n\nconst reservedModifierKeywords = ['shift', 'alt', 'meta', 'mod', 'ctrl']\n\nconst mappedKeys: Record = {\n esc: 'escape',\n return: 'enter',\n '.': 'period',\n ',': 'comma',\n '-': 'slash',\n ' ': 'space',\n '`': 'backquote',\n '#': 'backslash',\n '+': 'bracketright',\n ShiftLeft: 'shift',\n ShiftRight: 'shift',\n AltLeft: 'alt',\n AltRight: 'alt',\n MetaLeft: 'meta',\n MetaRight: 'meta',\n OSLeft: 'meta',\n OSRight: 'meta',\n ControlLeft: 'ctrl',\n ControlRight: 'ctrl',\n}\n\nexport function mapKey(key: string): string {\n return (mappedKeys[key] || key)\n .trim()\n .toLowerCase()\n .replace(/key|digit|numpad|arrow/, '')\n}\n\nexport function isHotkeyModifier(key: string) {\n return reservedModifierKeywords.includes(key)\n}\n\nexport function parseKeysHookInput(keys: string, splitKey = ','): string[] {\n return keys.split(splitKey)\n}\n\nexport function parseHotkey(hotkey: string, combinationKey = '+', description?: string): Hotkey {\n const keys = hotkey\n .toLocaleLowerCase()\n .split(combinationKey)\n .map((k) => mapKey(k))\n\n const modifiers: KeyboardModifiers = {\n alt: keys.includes('alt'),\n ctrl: keys.includes('ctrl') || keys.includes('control'),\n shift: keys.includes('shift'),\n meta: keys.includes('meta'),\n mod: keys.includes('mod'),\n }\n\n const singleCharKeys = keys.filter((k) => !reservedModifierKeywords.includes(k))\n\n return {\n ...modifiers,\n keys: singleCharKeys,\n description,\n }\n}\n","import { isHotkeyModifier, mapKey } from './parseHotkeys'\n;(() => {\n if (typeof document !== 'undefined') {\n document.addEventListener('keydown', (e) => {\n if (e.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n pushToCurrentlyPressedKeys([mapKey(e.key), mapKey(e.code)])\n })\n\n document.addEventListener('keyup', (e) => {\n if (e.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n removeFromCurrentlyPressedKeys([mapKey(e.key), mapKey(e.code)])\n })\n }\n\n if (typeof window !== 'undefined') {\n window.addEventListener('blur', () => {\n currentlyPressedKeys.clear()\n })\n }\n})()\n\nconst currentlyPressedKeys: Set = new Set()\n\n// https://github.com/microsoft/TypeScript/issues/17002\nexport function isReadonlyArray(value: unknown): value is readonly unknown[] {\n return Array.isArray(value)\n}\n\nexport function isHotkeyPressed(key: string | readonly string[], splitKey = ','): boolean {\n const hotkeyArray = isReadonlyArray(key) ? key : key.split(splitKey)\n\n return hotkeyArray.every((hotkey) => currentlyPressedKeys.has(hotkey.trim().toLowerCase()))\n}\n\nexport function pushToCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n /*\n Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.\n https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser\n Otherwise the set will hold all ever pressed keys while the meta key is down which leads to wrong results.\n */\n if (currentlyPressedKeys.has('meta')) {\n currentlyPressedKeys.forEach((key) => !isHotkeyModifier(key) && currentlyPressedKeys.delete(key.toLowerCase()))\n }\n\n hotkeyArray.forEach((hotkey) => currentlyPressedKeys.add(hotkey.toLowerCase()))\n}\n\nexport function removeFromCurrentlyPressedKeys(key: string | string[]): void {\n const hotkeyArray = Array.isArray(key) ? key : [key]\n\n /*\n Due to a weird behavior on macOS we need to clear the set if the user pressed down the meta key and presses another key.\n https://stackoverflow.com/questions/11818637/why-does-javascript-drop-keyup-events-when-the-metakey-is-pressed-on-mac-browser\n Otherwise the set will hold all ever pressed keys while the meta key is down which leads to wrong results.\n */\n if (key === 'meta') {\n currentlyPressedKeys.clear()\n } else {\n hotkeyArray.forEach((hotkey) => currentlyPressedKeys.delete(hotkey.toLowerCase()))\n }\n}\n","import { FormTags, Hotkey, Scopes, Trigger } from './types'\nimport { isHotkeyPressed, isReadonlyArray } from './isHotkeyPressed'\nimport { mapKey } from './parseHotkeys'\n\nexport function maybePreventDefault(e: KeyboardEvent, hotkey: Hotkey, preventDefault?: Trigger): void {\n if ((typeof preventDefault === 'function' && preventDefault(e, hotkey)) || preventDefault === true) {\n e.preventDefault()\n }\n}\n\nexport function isHotkeyEnabled(e: KeyboardEvent, hotkey: Hotkey, enabled?: Trigger): boolean {\n if (typeof enabled === 'function') {\n return enabled(e, hotkey)\n }\n\n return enabled === true || enabled === undefined\n}\n\nexport function isKeyboardEventTriggeredByInput(ev: KeyboardEvent): boolean {\n return isHotkeyEnabledOnTag(ev, ['input', 'textarea', 'select'])\n}\n\nexport function isHotkeyEnabledOnTag(\n { target }: KeyboardEvent,\n enabledOnTags: readonly FormTags[] | boolean = false\n): boolean {\n const targetTagName = target && (target as HTMLElement).tagName\n\n if (isReadonlyArray(enabledOnTags)) {\n return Boolean(\n targetTagName && enabledOnTags && enabledOnTags.some((tag) => tag.toLowerCase() === targetTagName.toLowerCase())\n )\n }\n\n return Boolean(targetTagName && enabledOnTags && enabledOnTags === true)\n}\n\nexport function isScopeActive(activeScopes: string[], scopes?: Scopes): boolean {\n if (activeScopes.length === 0 && scopes) {\n console.warn(\n 'A hotkey has the \"scopes\" option set, however no active scopes were found. If you want to use the global scopes feature, you need to wrap your app in a '\n )\n\n return true\n }\n\n if (!scopes) {\n return true\n }\n\n return activeScopes.some((scope) => scopes.includes(scope)) || activeScopes.includes('*')\n}\n\nexport const isHotkeyMatchingKeyboardEvent = (e: KeyboardEvent, hotkey: Hotkey, ignoreModifiers = false): boolean => {\n const { alt, meta, mod, shift, ctrl, keys } = hotkey\n const { key: pressedKeyUppercase, code, ctrlKey, metaKey, shiftKey, altKey } = e\n\n const keyCode = mapKey(code)\n const pressedKey = pressedKeyUppercase.toLowerCase()\n\n if (!ignoreModifiers) {\n // We check the pressed keys for compatibility with the keyup event. In keyup events the modifier flags are not set.\n if (alt === !altKey && pressedKey !== 'alt') {\n return false\n }\n\n if (shift === !shiftKey && pressedKey !== 'shift') {\n return false\n }\n\n // Mod is a special key name that is checking for meta on macOS and ctrl on other platforms\n if (mod) {\n if (!metaKey && !ctrlKey) {\n return false\n }\n } else {\n if (meta === !metaKey && pressedKey !== 'meta' && pressedKey !== 'os') {\n return false\n }\n\n if (ctrl === !ctrlKey && pressedKey !== 'ctrl' && pressedKey !== 'control') {\n return false\n }\n }\n }\n\n // All modifiers are correct, now check the key\n // If the key is set, we check for the key\n if (keys && keys.length === 1 && (keys.includes(pressedKey) || keys.includes(keyCode))) {\n return true\n } else if (keys) {\n // Check if all keys are present in pressedDownKeys set\n return isHotkeyPressed(keys)\n } else if (!keys) {\n // If the key is not set, we only listen for modifiers, that check went alright, so we return true\n return true\n }\n\n // There is nothing that matches.\n return false\n}\n","import { createContext, ReactNode, useContext } from 'react'\nimport { Hotkey } from './types'\n\ntype BoundHotkeysProxyProviderType = {\n addHotkey: (hotkey: Hotkey) => void\n removeHotkey: (hotkey: Hotkey) => void\n}\n\nconst BoundHotkeysProxyProvider = createContext(undefined)\n\nexport const useBoundHotkeysProxy = () => {\n return useContext(BoundHotkeysProxyProvider)\n}\n\ninterface Props {\n children: ReactNode\n addHotkey: (hotkey: Hotkey) => void\n removeHotkey: (hotkey: Hotkey) => void\n}\n\nexport default function BoundHotkeysProxyProviderProvider({ addHotkey, removeHotkey, children }: Props) {\n return (\n \n {children}\n \n )\n}\n","export default function deepEqual(x: any, y: any): boolean {\n //@ts-ignore\n return x && y && typeof x === 'object' && typeof y === 'object'\n ? Object.keys(x).length === Object.keys(y).length &&\n //@ts-ignore\n Object.keys(x).reduce((isEqual, key) => isEqual && deepEqual(x[key], y[key]), true)\n : x === y\n}\n","import { Hotkey } from './types'\nimport { createContext, ReactNode, useState, useContext, useCallback } from 'react'\nimport BoundHotkeysProxyProviderProvider from './BoundHotkeysProxyProvider'\nimport deepEqual from './deepEqual'\n\nexport type HotkeysContextType = {\n hotkeys: ReadonlyArray\n enabledScopes: string[]\n toggleScope: (scope: string) => void\n enableScope: (scope: string) => void\n disableScope: (scope: string) => void\n}\n\n// The context is only needed for special features like global scoping, so we use a graceful default fallback\nconst HotkeysContext = createContext({\n hotkeys: [],\n enabledScopes: [], // This array has to be empty instead of containing '*' as default, to check if the provider is set or not\n toggleScope: () => {},\n enableScope: () => {},\n disableScope: () => {},\n})\n\nexport const useHotkeysContext = () => {\n return useContext(HotkeysContext)\n}\n\ninterface Props {\n initiallyActiveScopes?: string[]\n children: ReactNode\n}\n\nexport const HotkeysProvider = ({ initiallyActiveScopes = ['*'], children }: Props) => {\n const [internalActiveScopes, setInternalActiveScopes] = useState(\n initiallyActiveScopes?.length > 0 ? initiallyActiveScopes : ['*']\n )\n const [boundHotkeys, setBoundHotkeys] = useState([])\n\n const enableScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.includes('*')) {\n return [scope]\n }\n\n return Array.from(new Set([...prev, scope]))\n })\n }, [])\n\n const disableScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.filter((s) => s !== scope).length === 0) {\n return ['*']\n } else {\n return prev.filter((s) => s !== scope)\n }\n })\n }, [])\n\n const toggleScope = useCallback((scope: string) => {\n setInternalActiveScopes((prev) => {\n if (prev.includes(scope)) {\n if (prev.filter((s) => s !== scope).length === 0) {\n return ['*']\n } else {\n return prev.filter((s) => s !== scope)\n }\n } else {\n if (prev.includes('*')) {\n return [scope]\n }\n\n return Array.from(new Set([...prev, scope]))\n }\n })\n }, [])\n\n const addBoundHotkey = useCallback((hotkey: Hotkey) => {\n setBoundHotkeys((prev) => [...prev, hotkey])\n }, [])\n\n const removeBoundHotkey = useCallback((hotkey: Hotkey) => {\n setBoundHotkeys((prev) => prev.filter((h) => !deepEqual(h, hotkey)))\n }, [])\n\n return (\n \n \n {children}\n \n \n )\n}\n","import { HotkeyCallback, Keys, Options, OptionsOrDependencyArray, RefType } from './types'\nimport { DependencyList, useCallback, useEffect, useLayoutEffect, useRef } from 'react'\nimport { mapKey, parseHotkey, parseKeysHookInput } from './parseHotkeys'\nimport {\n isHotkeyEnabled,\n isHotkeyEnabledOnTag,\n isHotkeyMatchingKeyboardEvent,\n isKeyboardEventTriggeredByInput,\n isScopeActive,\n maybePreventDefault,\n} from './validators'\nimport { useHotkeysContext } from './HotkeysProvider'\nimport { useBoundHotkeysProxy } from './BoundHotkeysProxyProvider'\nimport useDeepEqualMemo from './useDeepEqualMemo'\nimport { isReadonlyArray, pushToCurrentlyPressedKeys, removeFromCurrentlyPressedKeys } from './isHotkeyPressed'\n\nconst stopPropagation = (e: KeyboardEvent): void => {\n e.stopPropagation()\n e.preventDefault()\n e.stopImmediatePropagation()\n}\n\nconst useSafeLayoutEffect = typeof window !== 'undefined' ? useLayoutEffect : useEffect\n\nexport default function useHotkeys(\n keys: Keys,\n callback: HotkeyCallback,\n options?: OptionsOrDependencyArray,\n dependencies?: OptionsOrDependencyArray\n) {\n const ref = useRef>(null)\n const hasTriggeredRef = useRef(false)\n\n const _options: Options | undefined = !(options instanceof Array)\n ? (options as Options)\n : !(dependencies instanceof Array)\n ? (dependencies as Options)\n : undefined\n const _keys: string = isReadonlyArray(keys) ? keys.join(_options?.splitKey) : keys\n const _deps: DependencyList | undefined =\n options instanceof Array ? options : dependencies instanceof Array ? dependencies : undefined\n\n const memoisedCB = useCallback(callback, _deps ?? [])\n const cbRef = useRef(memoisedCB)\n\n if (_deps) {\n cbRef.current = memoisedCB\n } else {\n cbRef.current = callback\n }\n\n const memoisedOptions = useDeepEqualMemo(_options)\n\n const { enabledScopes } = useHotkeysContext()\n const proxy = useBoundHotkeysProxy()\n\n useSafeLayoutEffect(() => {\n if (memoisedOptions?.enabled === false || !isScopeActive(enabledScopes, memoisedOptions?.scopes)) {\n return\n }\n\n const listener = (e: KeyboardEvent, isKeyUp = false) => {\n if (isKeyboardEventTriggeredByInput(e) && !isHotkeyEnabledOnTag(e, memoisedOptions?.enableOnFormTags)) {\n return\n }\n\n if (memoisedOptions?.ignoreEventWhen?.(e)) {\n return\n }\n\n // TODO: SINCE THE EVENT IS NOW ATTACHED TO THE REF, THE ACTIVE ELEMENT CAN NEVER BE INSIDE THE REF. THE HOTKEY ONLY TRIGGERS IF THE\n // REF IS THE ACTIVE ELEMENT. THIS IS A PROBLEM SINCE FOCUSED SUB COMPONENTS WON'T TRIGGER THE HOTKEY.\n if (\n ref.current !== null &&\n document.activeElement !== ref.current &&\n !ref.current.contains(document.activeElement)\n ) {\n stopPropagation(e)\n\n return\n }\n\n if ((e.target as HTMLElement)?.isContentEditable && !memoisedOptions?.enableOnContentEditable) {\n return\n }\n\n parseKeysHookInput(_keys, memoisedOptions?.splitKey).forEach((key) => {\n const hotkey = parseHotkey(key, memoisedOptions?.combinationKey)\n\n if (isHotkeyMatchingKeyboardEvent(e, hotkey, memoisedOptions?.ignoreModifiers) || hotkey.keys?.includes('*')) {\n if (isKeyUp && hasTriggeredRef.current) {\n return\n }\n\n maybePreventDefault(e, hotkey, memoisedOptions?.preventDefault)\n\n if (!isHotkeyEnabled(e, hotkey, memoisedOptions?.enabled)) {\n stopPropagation(e)\n\n return\n }\n\n // Execute the user callback for that hotkey\n cbRef.current(e, hotkey)\n\n if (!isKeyUp) {\n hasTriggeredRef.current = true\n }\n }\n })\n }\n\n const handleKeyDown = (event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n pushToCurrentlyPressedKeys(mapKey(event.code))\n\n if ((memoisedOptions?.keydown === undefined && memoisedOptions?.keyup !== true) || memoisedOptions?.keydown) {\n listener(event)\n }\n }\n\n const handleKeyUp = (event: KeyboardEvent) => {\n if (event.key === undefined) {\n // Synthetic event (e.g., Chrome autofill). Ignore.\n return\n }\n\n removeFromCurrentlyPressedKeys(mapKey(event.code))\n\n hasTriggeredRef.current = false\n\n if (memoisedOptions?.keyup) {\n listener(event, true)\n }\n }\n\n const domNode = ref.current || _options?.document || document\n\n // @ts-ignore\n domNode.addEventListener('keyup', handleKeyUp)\n // @ts-ignore\n domNode.addEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(_keys, memoisedOptions?.splitKey).forEach((key) =>\n proxy.addHotkey(parseHotkey(key, memoisedOptions?.combinationKey, memoisedOptions?.description))\n )\n }\n\n return () => {\n // @ts-ignore\n domNode.removeEventListener('keyup', handleKeyUp)\n // @ts-ignore\n domNode.removeEventListener('keydown', handleKeyDown)\n\n if (proxy) {\n parseKeysHookInput(_keys, memoisedOptions?.splitKey).forEach((key) =>\n proxy.removeHotkey(parseHotkey(key, memoisedOptions?.combinationKey, memoisedOptions?.description))\n )\n }\n }\n }, [_keys, memoisedOptions, enabledScopes])\n\n return ref\n}\n","import { useRef } from 'react'\nimport deepEqual from './deepEqual'\n\nexport default function useDeepEqualMemo(value: T) {\n const ref = useRef(undefined)\n\n if (!deepEqual(ref.current, value)) {\n ref.current = value\n }\n\n return ref.current\n}\n","import toPropertyKey from \"./toPropertyKey.js\";\nexport default function _defineProperty(obj, key, value) {\n key = toPropertyKey(key);\n if (key in obj) {\n Object.defineProperty(obj, key, {\n value: value,\n enumerable: true,\n configurable: true,\n writable: true\n });\n } else {\n obj[key] = value;\n }\n return obj;\n}","import defineProperty from \"./defineProperty.js\";\nfunction ownKeys(object, enumerableOnly) {\n var keys = Object.keys(object);\n if (Object.getOwnPropertySymbols) {\n var symbols = Object.getOwnPropertySymbols(object);\n enumerableOnly && (symbols = symbols.filter(function (sym) {\n return Object.getOwnPropertyDescriptor(object, sym).enumerable;\n })), keys.push.apply(keys, symbols);\n }\n return keys;\n}\nexport default function _objectSpread2(target) {\n for (var i = 1; i < arguments.length; i++) {\n var source = null != arguments[i] ? arguments[i] : {};\n i % 2 ? ownKeys(Object(source), !0).forEach(function (key) {\n defineProperty(target, key, source[key]);\n }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) {\n Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key));\n });\n }\n return target;\n}","import superPropBase from \"./superPropBase.js\";\nexport default function _get() {\n if (typeof Reflect !== \"undefined\" && Reflect.get) {\n _get = Reflect.get.bind();\n } else {\n _get = function _get(target, property, receiver) {\n var base = superPropBase(target, property);\n if (!base) return;\n var desc = Object.getOwnPropertyDescriptor(base, property);\n if (desc.get) {\n return desc.get.call(arguments.length < 3 ? target : receiver);\n }\n return desc.value;\n };\n }\n return _get.apply(this, arguments);\n}","import getPrototypeOf from \"./getPrototypeOf.js\";\nexport default function _superPropBase(object, property) {\n while (!Object.prototype.hasOwnProperty.call(object, property)) {\n object = getPrototypeOf(object);\n if (object === null) break;\n }\n return object;\n}","import {requestAnimFrame} from '../helpers/helpers.extras.js';\n\n/**\n * @typedef { import('./core.animation.js').default } Animation\n * @typedef { import('./core.controller.js').default } Chart\n */\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is export for typedoc\n */\nexport class Animator {\n constructor() {\n this._request = null;\n this._charts = new Map();\n this._running = false;\n this._lastDate = undefined;\n }\n\n /**\n\t * @private\n\t */\n _notify(chart, anims, date, type) {\n const callbacks = anims.listeners[type];\n const numSteps = anims.duration;\n\n callbacks.forEach(fn => fn({\n chart,\n initial: anims.initial,\n numSteps,\n currentStep: Math.min(date - anims.start, numSteps)\n }));\n }\n\n /**\n\t * @private\n\t */\n _refresh() {\n if (this._request) {\n return;\n }\n this._running = true;\n\n this._request = requestAnimFrame.call(window, () => {\n this._update();\n this._request = null;\n\n if (this._running) {\n this._refresh();\n }\n });\n }\n\n /**\n\t * @private\n\t */\n _update(date = Date.now()) {\n let remaining = 0;\n\n this._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\n for (; i >= 0; --i) {\n item = items[i];\n\n if (item._active) {\n if (item._total > anims.duration) {\n // if the animation has been updated and its duration prolonged,\n // update to total duration of current animations run (for progress event)\n anims.duration = item._total;\n }\n item.tick(date);\n draw = true;\n } else {\n // Remove the item by replacing it with last item and removing the last\n // A lot faster than splice.\n items[i] = items[items.length - 1];\n items.pop();\n }\n }\n\n if (draw) {\n chart.draw();\n this._notify(chart, anims, date, 'progress');\n }\n\n if (!items.length) {\n anims.running = false;\n this._notify(chart, anims, date, 'complete');\n anims.initial = false;\n }\n\n remaining += items.length;\n });\n\n this._lastDate = date;\n\n if (remaining === 0) {\n this._running = false;\n }\n }\n\n /**\n\t * @private\n\t */\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\n /**\n\t * @param {Chart} chart\n\t * @param {string} event - event name\n\t * @param {Function} cb - callback\n\t */\n listen(chart, event, cb) {\n this._getAnims(chart).listeners[event].push(cb);\n }\n\n /**\n\t * Add animations\n\t * @param {Chart} chart\n\t * @param {Animation[]} items - animations\n\t */\n add(chart, items) {\n if (!items || !items.length) {\n return;\n }\n this._getAnims(chart).items.push(...items);\n }\n\n /**\n\t * Counts number of active animations for the chart\n\t * @param {Chart} chart\n\t */\n has(chart) {\n return this._getAnims(chart).items.length > 0;\n }\n\n /**\n\t * Start animating (all charts)\n\t * @param {Chart} chart\n\t */\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\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\n /**\n\t * Stop all animations for the chart\n\t * @param {Chart} chart\n\t */\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\n for (; i >= 0; --i) {\n items[i].cancel();\n }\n anims.items = [];\n this._notify(chart, anims, Date.now(), 'complete');\n }\n\n /**\n\t * Remove chart from Animator\n\t * @param {Chart} chart\n\t */\n remove(chart) {\n return this._charts.delete(chart);\n }\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Animator();\n","import effects from '../helpers/helpers.easing.js';\nimport {resolve} from '../helpers/helpers.options.js';\nimport {color as helpersColor} from '../helpers/helpers.color.js';\n\nconst transparent = 'transparent';\nconst interpolators = {\n boolean(from, to, factor) {\n return factor > 0.5 ? to : from;\n },\n /**\n * @param {string} from\n * @param {string} to\n * @param {number} factor\n */\n color(from, to, factor) {\n const c0 = helpersColor(from || transparent);\n const c1 = c0.valid && helpersColor(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};\n\nexport default class Animation {\n constructor(cfg, target, prop, to) {\n const currentValue = target[prop];\n\n to = resolve([cfg.to, to, currentValue, cfg.from]);\n const from = resolve([cfg.from, currentValue, to]);\n\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\n active() {\n return this._active;\n }\n\n update(cfg, to, date) {\n if (this._active) {\n this._notify(false);\n\n const currentValue = this._target[this._prop];\n const elapsed = date - this._start;\n const remain = this._duration - elapsed;\n this._start = date;\n this._duration = Math.floor(Math.max(remain, cfg.duration));\n this._total += elapsed;\n this._loop = !!cfg.loop;\n this._to = resolve([cfg.to, to, currentValue, cfg.from]);\n this._from = resolve([cfg.from, currentValue, to]);\n }\n }\n\n cancel() {\n if (this._active) {\n // update current evaluated value, for smoother animations\n this.tick(Date.now());\n this._active = false;\n this._notify(false);\n }\n }\n\n tick(date) {\n const elapsed = date - this._start;\n const duration = this._duration;\n const prop = this._prop;\n const from = this._from;\n const loop = this._loop;\n const to = this._to;\n let factor;\n\n this._active = from !== to && (loop || (elapsed < duration));\n\n if (!this._active) {\n this._target[prop] = to;\n this._notify(true);\n return;\n }\n\n if (elapsed < 0) {\n this._target[prop] = from;\n return;\n }\n\n factor = (elapsed / duration) % 2;\n factor = loop && factor > 1 ? 2 - factor : factor;\n factor = this._easing(Math.min(1, Math.max(0, factor)));\n\n this._target[prop] = this._fn(from, to, factor);\n }\n\n wait() {\n const promises = this._promises || (this._promises = []);\n return new Promise((res, rej) => {\n promises.push({res, rej});\n });\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","import animator from './core.animator.js';\nimport Animation from './core.animation.js';\nimport defaults from './core.defaults.js';\nimport {isArray, isObject} from '../helpers/helpers.core.js';\n\nexport default class Animations {\n constructor(chart, config) {\n this._chart = chart;\n this._properties = new Map();\n this.configure(config);\n }\n\n configure(config) {\n if (!isObject(config)) {\n return;\n }\n\n const animationOptions = Object.keys(defaults.animation);\n const animatedProps = this._properties;\n\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\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\n /**\n\t * Utility to handle animation of `options`.\n\t * @private\n\t */\n _animateOptions(target, values) {\n const newOptions = values.options;\n const options = resolveTargetOptions(target, newOptions);\n if (!options) {\n return [];\n }\n\n const animations = this._createAnimations(options, newOptions);\n if (newOptions.$shared) {\n // Going to shared options:\n // After all animations are done, assign the shared options object to the element\n // So any new updates to the shared options are observed\n awaitAll(target.options.$animations, newOptions).then(() => {\n target.options = newOptions;\n }, () => {\n // rejected, noop\n });\n }\n\n return animations;\n }\n\n /**\n\t * @private\n\t */\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\n for (i = props.length - 1; i >= 0; --i) {\n const prop = props[i];\n if (prop.charAt(0) === '$') {\n continue;\n }\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\n if (animation) {\n if (cfg && animation.active()) {\n // There is an existing active animation, let's update that\n animation.update(cfg, value, date);\n continue;\n } else {\n animation.cancel();\n }\n }\n if (!cfg || !cfg.duration) {\n // not animated, set directly to new value\n target[prop] = value;\n continue;\n }\n\n running[prop] = animation = new Animation(cfg, target, prop, value);\n animations.push(animation);\n }\n return animations;\n }\n\n\n /**\n\t * Update `target` properties to new values, using configured animations\n\t * @param {object} target - object to update\n\t * @param {object} values - new target properties\n\t * @returns {boolean|undefined} - `true` if animations were started\n\t **/\n update(target, values) {\n if (this._properties.size === 0) {\n // Nothing is animated, just apply the new values.\n Object.assign(target, values);\n return;\n }\n\n const animations = this._createAnimations(target, values);\n\n if (animations.length) {\n animator.add(this._chart, animations);\n return true;\n }\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 // @ts-ignore\n return Promise.all(running);\n}\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 // Going from shared options to distinct one:\n // Create new options object containing the old shared values and start updating that.\n target.options = options = Object.assign({}, options, {$shared: false, $animations: {}});\n }\n return options;\n}\n","import Animations from './core.animations.js';\nimport defaults from './core.defaults.js';\nimport {isArray, isFinite, isObject, valueOrDefault, resolveObjectKey, defined} from '../helpers/helpers.core.js';\nimport {listenArrayEvents, unlistenArrayEvents} from '../helpers/helpers.collection.js';\nimport {createContext, sign} from '../helpers/index.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('./core.scale.js').default } Scale\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}\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\n return {\n top: y.end,\n right: x.end,\n bottom: y.start,\n left: x.start\n };\n}\n\nfunction toClip(value) {\n let t, r, b, l;\n\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\n return {\n top: t,\n right: r,\n bottom: b,\n left: l,\n disabled: value === false\n };\n}\n\nfunction getSortedDatasetIndices(chart, filterVisible) {\n const keys = [];\n const metasets = chart._getSortedDatasetMetas(filterVisible);\n let i, ilen;\n\n for (i = 0, ilen = metasets.length; i < ilen; ++i) {\n keys.push(metasets[i].index);\n }\n return keys;\n}\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\n if (value === null) {\n return;\n }\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 (isFinite(otherValue) && (singleMode || (value === 0 || sign(value) === sign(otherValue)))) {\n value += otherValue;\n }\n }\n return value;\n}\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}\n\nfunction isStacked(scale, meta) {\n const stacked = scale && scale.options.stacked;\n return stacked || (stacked === undefined && meta.stack !== undefined);\n}\n\nfunction getStackKey(indexScale, valueScale, meta) {\n return `${indexScale.id}.${valueScale.id}.${meta.stack || meta.type}`;\n}\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}\n\nfunction getOrCreateStack(stacks, stackKey, indexValue) {\n const subStack = stacks[stackKey] || (stacks[stackKey] = {});\n return subStack[indexValue] || (subStack[indexValue] = {});\n}\n\nfunction getLastIndexInStack(stack, vScale, positive, type) {\n for (const meta of vScale.getMatchingVisibleMetas(type).reverse()) {\n const value = stack[meta.index];\n if ((positive && value > 0) || (!positive && value < 0)) {\n return meta.index;\n }\n }\n\n return null;\n}\n\nfunction updateStacks(controller, parsed) {\n const {chart, _cachedMeta: meta} = controller;\n const stacks = chart._stacks || (chart._stacks = {}); // map structure is {stackKey: {datasetIndex: value}}\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\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\n stack._top = getLastIndexInStack(stack, vScale, true, meta.type);\n stack._bottom = getLastIndexInStack(stack, vScale, false, meta.type);\n\n const visualValues = stack._visualValues || (stack._visualValues = {});\n visualValues[datasetIndex] = value;\n }\n}\n\nfunction getFirstScaleId(chart, axis) {\n const scales = chart.scales;\n return Object.keys(scales).filter(key => scales[key].axis === axis).shift();\n}\n\nfunction createDatasetContext(parent, index) {\n return createContext(parent,\n {\n active: false,\n dataset: undefined,\n datasetIndex: index,\n index,\n mode: 'default',\n type: 'dataset'\n }\n );\n}\n\nfunction createDataContext(parent, index, element) {\n return createContext(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}\n\nfunction clearStacks(meta, items) {\n // Not using meta.index here, because it might be already updated if the dataset changed location\n const datasetIndex = meta.controller.index;\n const axis = meta.vScale && meta.vScale.axis;\n if (!axis) {\n return;\n }\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 if (stacks[axis]._visualValues !== undefined && stacks[axis]._visualValues[datasetIndex] !== undefined) {\n delete stacks[axis]._visualValues[datasetIndex];\n }\n }\n}\n\nconst isDirectUpdateMode = (mode) => mode === 'reset' || mode === 'none';\nconst cloneIfNotShared = (cached, shared) => shared ? cached : Object.assign({}, cached);\nconst createStack = (canStack, meta, chart) => canStack && !meta.hidden && meta._stacked\n && {keys: getSortedDatasetIndices(chart, true), values: null};\n\nexport default class DatasetController {\n\n /**\n * @type {any}\n */\n static defaults = {};\n\n /**\n * Element type used to generate a meta dataset (e.g. Chart.element.LineElement).\n */\n static datasetElementType = null;\n\n /**\n * Element type used to generate a meta data (e.g. Chart.element.PointElement).\n */\n static dataElementType = null;\n\n /**\n\t * @param {Chart} chart\n\t * @param {number} datasetIndex\n\t */\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 /** @type {boolean | object} */\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.supportsDecimation = false;\n this.$context = undefined;\n this._syncList = [];\n this.datasetElementType = new.target.datasetElementType;\n this.dataElementType = new.target.dataElementType;\n\n this.initialize();\n }\n\n initialize() {\n const meta = this._cachedMeta;\n this.configure();\n this.linkScales();\n meta._stacked = isStacked(meta.vScale, meta);\n this.addElements();\n\n if (this.options.fill && !this.chart.isPluginEnabled('filler')) {\n console.warn(\"Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options\");\n }\n }\n\n updateIndex(datasetIndex) {\n if (this.index !== datasetIndex) {\n clearStacks(this._cachedMeta);\n }\n this.index = datasetIndex;\n }\n\n linkScales() {\n const chart = this.chart;\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n\n const chooseId = (axis, x, y, r) => axis === 'x' ? x : axis === 'r' ? r : y;\n\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 = this.getScaleForId(xid);\n meta.yScale = this.getScaleForId(yid);\n meta.rScale = this.getScaleForId(rid);\n meta.iScale = this.getScaleForId(iid);\n meta.vScale = this.getScaleForId(vid);\n }\n\n getDataset() {\n return this.chart.data.datasets[this.index];\n }\n\n getMeta() {\n return this.chart.getDatasetMeta(this.index);\n }\n\n /**\n\t * @param {string} scaleID\n\t * @return {Scale}\n\t */\n getScaleForId(scaleID) {\n return this.chart.scales[scaleID];\n }\n\n /**\n\t * @private\n\t */\n _getOtherScale(scale) {\n const meta = this._cachedMeta;\n return scale === meta.iScale\n ? meta.vScale\n : meta.iScale;\n }\n\n reset() {\n this._update('reset');\n }\n\n /**\n\t * @private\n\t */\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\n /**\n\t * @private\n\t */\n _dataCheck() {\n const dataset = this.getDataset();\n const data = dataset.data || (dataset.data = []);\n const _data = this._data;\n\n // In order to correctly handle data addition/deletion animation (and thus simulate\n // real-time charts), we need to monitor these data modifications and synchronize\n // the internal metadata accordingly.\n\n if (isObject(data)) {\n this._data = convertObjectDataToArray(data);\n } else if (_data !== data) {\n if (_data) {\n // This case happens when the user replaced the data array instance.\n unlistenArrayEvents(_data, this);\n // Discard old parsed data and stacks\n const meta = this._cachedMeta;\n clearStacks(meta);\n meta._parsed = [];\n }\n if (data && Object.isExtensible(data)) {\n listenArrayEvents(data, this);\n }\n this._syncList = [];\n this._data = data;\n }\n }\n\n addElements() {\n const meta = this._cachedMeta;\n\n this._dataCheck();\n\n if (this.datasetElementType) {\n meta.dataset = new this.datasetElementType();\n }\n }\n\n buildOrUpdateElements(resetNewElements) {\n const meta = this._cachedMeta;\n const dataset = this.getDataset();\n let stackChanged = false;\n\n this._dataCheck();\n\n // make sure cached _stacked status is current\n const oldStacked = meta._stacked;\n meta._stacked = isStacked(meta.vScale, meta);\n\n // detect change in stack option\n if (meta.stack !== dataset.stack) {\n stackChanged = true;\n // remove values from old stack\n clearStacks(meta);\n meta.stack = dataset.stack;\n }\n\n // Re-sync meta data in case the user replaced the data array or if we missed\n // any updates and so make sure that we handle number of datapoints changing.\n this._resyncElements(resetNewElements);\n\n // if stack changed, update stack values for the whole dataset\n if (stackChanged || oldStacked !== meta._stacked) {\n updateStacks(this, meta._parsed);\n }\n }\n\n /**\n\t * Merges user-supplied and default dataset-level options\n\t * @private\n\t */\n configure() {\n const config = this.chart.config;\n const scopeKeys = config.datasetScopeKeys(this._type);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys, true);\n this.options = config.createResolver(scopes, this.getContext());\n this._parsing = this.options.parsing;\n this._cachedDataOpts = {};\n }\n\n /**\n\t * @param {number} start\n\t * @param {number} count\n\t */\n parse(start, count) {\n const {_cachedMeta: meta, _data: data} = this;\n const {iScale, _stacked} = meta;\n const iAxis = iScale.axis;\n\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\n if (this._parsing === false) {\n meta._parsed = data;\n meta._sorted = true;\n parsed = data;\n } else {\n if (isArray(data[start])) {\n parsed = this.parseArrayData(meta, data, start, count);\n } else if (isObject(data[start])) {\n parsed = this.parseObjectData(meta, data, start, count);\n } else {\n parsed = this.parsePrimitiveData(meta, data, start, count);\n }\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\n if (_stacked) {\n updateStacks(this, parsed);\n }\n }\n\n /**\n\t * Parse array of primitive values\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [1,3,4]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id.\n\t * Example: {xScale0: 0, yScale0: 1}\n\t * @protected\n\t */\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\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\n /**\n\t * Parse array of arrays\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [[1,2],[3,4]]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id.\n\t * Example: {x: 0, y: 1}\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n const {xScale, yScale} = meta;\n const parsed = new Array(count);\n let i, ilen, index, item;\n\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\n /**\n\t * Parse array of objects\n\t * @param {object} meta - dataset meta\n\t * @param {array} data - data array. Example [{x:1, y:5}, {x:2, y:10}]\n\t * @param {number} start - start index\n\t * @param {number} count - number of items to parse\n\t * @returns {object} parsed item - item containing index and a parsed value\n\t * for each scale id. _custom is optional\n\t * Example: {xScale0: 0, yScale0: 1, _custom: {r: 10, foo: 'bar'}}\n\t * @protected\n\t */\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\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\n /**\n\t * @protected\n\t */\n getParsed(index) {\n return this._cachedMeta._parsed[index];\n }\n\n /**\n\t * @protected\n\t */\n getDataElement(index) {\n return this._cachedMeta.data[index];\n }\n\n /**\n\t * @protected\n\t */\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]._visualValues\n };\n return applyStack(stack, value, meta.index, {mode});\n }\n\n /**\n\t * @protected\n\t */\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 value = applyStack(stack, parsedValue, this._cachedMeta.index);\n }\n range.min = Math.min(range.min, value);\n range.max = Math.max(range.max, value);\n }\n\n /**\n\t * @protected\n\t */\n getMinMax(scale, canStack) {\n const meta = this._cachedMeta;\n const _parsed = meta._parsed;\n const sorted = meta._sorted && scale === meta.iScale;\n const ilen = _parsed.length;\n const otherScale = this._getOtherScale(scale);\n const stack = createStack(canStack, meta, this.chart);\n const range = {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY};\n const {min: otherMin, max: otherMax} = getUserBounds(otherScale);\n let i, parsed;\n\n function _skip() {\n parsed = _parsed[i];\n const otherValue = parsed[otherScale.axis];\n return !isFinite(parsed[scale.axis]) || otherMin > otherValue || otherMax < otherValue;\n }\n\n for (i = 0; i < ilen; ++i) {\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n if (sorted) {\n // if the data is sorted, we don't need to check further from this end of array\n break;\n }\n }\n if (sorted) {\n // in the sorted case, find first non-skipped value from other end of array\n for (i = ilen - 1; i >= 0; --i) {\n if (_skip()) {\n continue;\n }\n this.updateRangeFromParsed(range, scale, parsed, stack);\n break;\n }\n }\n return range;\n }\n\n getAllParsedValues(scale) {\n const parsed = this._cachedMeta._parsed;\n const values = [];\n let i, ilen, value;\n\n for (i = 0, ilen = parsed.length; i < ilen; ++i) {\n value = parsed[i][scale.axis];\n if (isFinite(value)) {\n values.push(value);\n }\n }\n return values;\n }\n\n /**\n\t * @return {number|boolean}\n\t * @protected\n\t */\n getMaxOverflow() {\n return false;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const vScale = meta.vScale;\n const parsed = this.getParsed(index);\n return {\n label: iScale ? '' + iScale.getLabelForValue(parsed[iScale.axis]) : '',\n value: vScale ? '' + vScale.getLabelForValue(parsed[vScale.axis]) : ''\n };\n }\n\n /**\n\t * @private\n\t */\n _update(mode) {\n const meta = this._cachedMeta;\n this.update(mode || 'default');\n meta._clip = toClip(valueOrDefault(this.options.clip, defaultClip(meta.xScale, meta.yScale, this.getMaxOverflow())));\n }\n\n /**\n\t * @param {string} mode\n\t */\n update(mode) {} // eslint-disable-line no-unused-vars\n\n draw() {\n const ctx = this._ctx;\n const chart = this.chart;\n const meta = this._cachedMeta;\n const elements = meta.data || [];\n const area = chart.chartArea;\n const active = [];\n const start = this._drawStart || 0;\n const count = this._drawCount || (elements.length - start);\n const drawActiveElementsOnTop = this.options.drawActiveElementsOnTop;\n let i;\n\n if (meta.dataset) {\n meta.dataset.draw(ctx, area, start, count);\n }\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 && drawActiveElementsOnTop) {\n active.push(element);\n } else {\n element.draw(ctx, area);\n }\n }\n\n for (i = 0; i < active.length; ++i) {\n active[i].draw(ctx, area);\n }\n }\n\n /**\n\t * Returns a set of predefined style properties that should be used to represent the dataset\n\t * or the data if the index is specified\n\t * @param {number} index - data index\n\t * @param {boolean} [active] - true if hover\n\t * @return {object} style object\n\t */\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\n /**\n\t * @protected\n\t */\n getContext(index, active, mode) {\n const dataset = this.getDataset();\n let context;\n if (index >= 0 && index < this._cachedMeta.data.length) {\n const element = this._cachedMeta.data[index];\n context = element.$context ||\n (element.$context = createDataContext(this.getContext(), index, element));\n context.parsed = this.getParsed(index);\n context.raw = dataset.data[index];\n context.index = context.dataIndex = index;\n } else {\n context = this.$context ||\n (this.$context = createDatasetContext(this.chart.getContext(), this.index));\n context.dataset = dataset;\n context.index = context.datasetIndex = this.index;\n }\n\n context.active = !!active;\n context.mode = mode;\n return context;\n }\n\n /**\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDatasetElementOptions(mode) {\n return this._resolveElementOptions(this.datasetElementType.id, mode);\n }\n\n /**\n\t * @param {number} index\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDataElementOptions(index, mode) {\n return this._resolveElementOptions(this.dataElementType.id, mode, index);\n }\n\n /**\n\t * @private\n\t */\n _resolveElementOptions(elementType, mode = 'default', index) {\n const active = mode === 'active';\n const cache = this._cachedDataOpts;\n const cacheKey = elementType + '-' + mode;\n const cached = cache[cacheKey];\n const sharing = this.enableOptionSharing && defined(index);\n if (cached) {\n return cloneIfNotShared(cached, sharing);\n }\n const config = this.chart.config;\n const scopeKeys = config.datasetElementScopeKeys(this._type, elementType);\n const prefixes = active ? [`${elementType}Hover`, 'hover', elementType, ''] : [elementType, ''];\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n const names = Object.keys(defaults.elements[elementType]);\n // context is provided as a function, and is called only if needed,\n // so we don't create a context for each element if not needed.\n const context = () => this.getContext(index, active, mode);\n const values = config.resolveNamedOptions(scopes, names, context, prefixes);\n\n if (values.$shared) {\n // `$shared` indicates this set of options can be shared between multiple elements.\n // Sharing is used to reduce number of properties to change during animation.\n values.$shared = sharing;\n\n // We cache options by `mode`, which can be 'active' for example. This enables us\n // to have the 'active' element options and 'default' options to switch between\n // when interacting.\n cache[cacheKey] = Object.freeze(cloneIfNotShared(values, sharing));\n }\n\n return values;\n }\n\n\n /**\n\t * @private\n\t */\n _resolveAnimations(index, transition, active) {\n const chart = this.chart;\n const cache = this._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 = this.chart.config;\n const scopeKeys = config.datasetAnimationScopeKeys(this._type, transition);\n const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n options = config.createResolver(scopes, this.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\n /**\n\t * Utility for getting the options object shared between elements\n\t * @protected\n\t */\n getSharedOptions(options) {\n if (!options.$shared) {\n return;\n }\n return this._sharedOptions || (this._sharedOptions = Object.assign({}, options));\n }\n\n /**\n\t * Utility for determining if `options` should be included in the updated properties\n\t * @protected\n\t */\n includeOptions(mode, sharedOptions) {\n return !sharedOptions || isDirectUpdateMode(mode) || this.chart._animationsDisabled;\n }\n\n /**\n * @todo v4, rename to getSharedOptions and remove excess functions\n */\n _getSharedOptions(start, mode) {\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const previouslySharedOptions = this._sharedOptions;\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions) || (sharedOptions !== previouslySharedOptions);\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n return {sharedOptions, includeOptions};\n }\n\n /**\n\t * Utility for updating an element with new properties, using animations when appropriate.\n\t * @protected\n\t */\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\n /**\n\t * Utility to animate the shared options, that are potentially affecting multiple elements.\n\t * @protected\n\t */\n updateSharedOptions(sharedOptions, mode, newOptions) {\n if (sharedOptions && !isDirectUpdateMode(mode)) {\n this._resolveAnimations(undefined, mode).update(sharedOptions, newOptions);\n }\n }\n\n /**\n\t * @private\n\t */\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 // When going from active to inactive, we need to update to the shared options.\n // This way the once hovered element will end up with the same original shared options instance, after animation.\n options: (!active && this.getSharedOptions(options)) || options\n });\n }\n\n removeHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', false);\n }\n\n setHoverStyle(element, datasetIndex, index) {\n this._setStyle(element, index, 'active', true);\n }\n\n /**\n\t * @private\n\t */\n _removeDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n\n if (element) {\n this._setStyle(element, undefined, 'active', false);\n }\n }\n\n /**\n\t * @private\n\t */\n _setDatasetHoverStyle() {\n const element = this._cachedMeta.dataset;\n\n if (element) {\n this._setStyle(element, undefined, 'active', true);\n }\n }\n\n /**\n\t * @private\n\t */\n _resyncElements(resetNewElements) {\n const data = this._data;\n const elements = this._cachedMeta.data;\n\n // Apply changes detected through array listeners\n for (const [method, arg1, arg2] of this._syncList) {\n this[method](arg1, arg2);\n }\n this._syncList = [];\n\n const numMeta = elements.length;\n const numData = data.length;\n const count = Math.min(numData, numMeta);\n\n if (count) {\n // TODO: It is not optimal to always parse the old data\n // This is done because we are not detecting direct assignments:\n // chart.data.datasets[0].data[5] = 10;\n // chart.data.datasets[0].data[5].y = 10;\n this.parse(0, count);\n }\n\n if (numData > numMeta) {\n this._insertElements(numMeta, numData - numMeta, resetNewElements);\n } else if (numData < numMeta) {\n this._removeElements(numData, numMeta - numData);\n }\n }\n\n /**\n\t * @private\n\t */\n _insertElements(start, count, resetNewElements = true) {\n const meta = this._cachedMeta;\n const data = meta.data;\n const end = start + count;\n let i;\n\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\n for (i = start; i < end; ++i) {\n data[i] = new this.dataElementType();\n }\n\n if (this._parsing) {\n move(meta._parsed);\n }\n this.parse(start, count);\n\n if (resetNewElements) {\n this.updateElements(data, start, count, 'reset');\n }\n }\n\n updateElements(element, start, count, mode) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * @private\n\t */\n _removeElements(start, count) {\n const meta = this._cachedMeta;\n if (this._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\n /**\n\t * @private\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 this.chart._dataChanges.push([this.index, ...args]);\n }\n\n _onDataPush() {\n const count = arguments.length;\n this._sync(['_insertElements', this.getDataset().data.length - count, count]);\n }\n\n _onDataPop() {\n this._sync(['_removeElements', this._cachedMeta.data.length - 1, 1]);\n }\n\n _onDataShift() {\n this._sync(['_removeElements', 0, 1]);\n }\n\n _onDataSplice(start, count) {\n if (count) {\n this._sync(['_removeElements', start, count]);\n }\n const newCount = arguments.length - 2;\n if (newCount) {\n this._sync(['_insertElements', start, newCount]);\n }\n }\n\n _onDataUnshift() {\n this._sync(['_insertElements', 0, arguments.length]);\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {\n _arrayUnique, isArray, isNullOrUndef,\n valueOrDefault, resolveObjectKey, sign, defined\n} from '../helpers/index.js';\n\nfunction getAllScaleValues(scale, type) {\n if (!scale._cache.$bar) {\n const visibleMetas = scale.getMatchingVisibleMetas(type);\n let values = [];\n\n for (let i = 0, ilen = visibleMetas.length; i < ilen; i++) {\n values = values.concat(visibleMetas[i].controller.getAllParsedValues(scale));\n }\n scale._cache.$bar = _arrayUnique(values.sort((a, b) => a - b));\n }\n return scale._cache.$bar;\n}\n\n/**\n * Computes the \"optimal\" sample size to maintain bars equally sized while preventing overlap.\n * @private\n */\nfunction computeMinSampleSize(meta) {\n const scale = meta.iScale;\n const values = getAllScaleValues(scale, meta.type);\n let min = scale._length;\n let i, ilen, curr, prev;\n const updateMinAndPrev = () => {\n if (curr === 32767 || curr === -32768) {\n // Ignore truncated pixels\n return;\n }\n if (defined(prev)) {\n // curr - prev === 0 is ignored\n min = Math.min(min, Math.abs(curr - prev) || min);\n }\n prev = curr;\n };\n\n for (i = 0, ilen = values.length; i < ilen; ++i) {\n curr = scale.getPixelForValue(values[i]);\n updateMinAndPrev();\n }\n\n prev = undefined;\n for (i = 0, ilen = scale.ticks.length; i < ilen; ++i) {\n curr = scale.getPixelForTick(i);\n updateMinAndPrev();\n }\n\n return min;\n}\n\n/**\n * Computes an \"ideal\" category based on the absolute bar thickness or, if undefined or null,\n * uses the smallest interval (see computeMinSampleSize) that prevents bar overlapping. This\n * mode currently always generates bars equally sized (until we introduce scriptable options?).\n * @private\n */\nfunction computeFitCategoryTraits(index, ruler, options, stackCount) {\n const thickness = options.barThickness;\n let size, ratio;\n\n if (isNullOrUndef(thickness)) {\n size = ruler.min * options.categoryPercentage;\n ratio = options.barPercentage;\n } else {\n // When bar thickness is enforced, category and bar percentages are ignored.\n // Note(SB): we could add support for relative bar thickness (e.g. barThickness: '50%')\n // and deprecate barPercentage since this value is ignored when thickness is absolute.\n size = thickness * stackCount;\n ratio = 1;\n }\n\n return {\n chunk: size / stackCount,\n ratio,\n start: ruler.pixels[index] - (size / 2)\n };\n}\n\n/**\n * Computes an \"optimal\" category that globally arranges bars side by side (no gap when\n * percentage options are 1), based on the previous and following categories. This mode\n * generates bars with different widths when data are not evenly spaced.\n * @private\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\n if (prev === null) {\n // first data: its size is double based on the next point or,\n // if it's also the last data, we use the scale size.\n prev = curr - (next === null ? ruler.end - ruler.start : next - curr);\n }\n\n if (next === null) {\n // last data: its size is also double based on the previous point.\n next = curr + curr - prev;\n }\n\n const start = curr - (curr - Math.min(prev, next)) / 2 * percent;\n const size = Math.abs(next - prev) / 2 * percent;\n\n return {\n chunk: size / stackCount,\n ratio: options.barPercentage,\n start\n };\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\n if (Math.abs(min) > Math.abs(max)) {\n barStart = max;\n barEnd = min;\n }\n\n // Store `barEnd` (furthest away from origin) as parsed value,\n // to make stacking straight forward\n item[vScale.axis] = barEnd;\n\n item._custom = {\n barStart,\n barEnd,\n start: startValue,\n end: endValue,\n min,\n max\n };\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}\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\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}\n\nfunction isFloatBar(custom) {\n return custom && custom.barStart !== undefined && custom.barEnd !== undefined;\n}\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}\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}\n\nfunction setBorderSkipped(properties, options, stack, index) {\n let edge = options.borderSkipped;\n const res = {};\n\n if (!edge) {\n properties.borderSkipped = res;\n return;\n }\n\n if (edge === true) {\n properties.borderSkipped = {top: true, right: true, bottom: true, left: true};\n return;\n }\n\n const {start, end, reverse, top, bottom} = borderProps(properties);\n\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\n res[parseEdge(edge, start, end, reverse)] = true;\n properties.borderSkipped = res;\n}\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}\n\nfunction swap(orig, v1, v2) {\n return orig === v1 ? v2 : orig === v2 ? v1 : orig;\n}\n\nfunction startEnd(v, start, end) {\n return v === 'start' ? start : v === 'end' ? end : v;\n}\n\nfunction setInflateAmount(properties, {inflateAmount}, ratio) {\n properties.inflateAmount = inflateAmount === 'auto'\n ? ratio === 1 ? 0.33 : 0\n : inflateAmount;\n}\n\nexport default class BarController extends DatasetController {\n\n static id = 'bar';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'bar',\n\n categoryPercentage: 0.8,\n barPercentage: 0.9,\n grouped: true,\n\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'base', 'width', 'height']\n }\n }\n };\n\n /**\n * @type {any}\n */\n static 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\n\n /**\n\t * Overriding primitive data parsing since we support mixed primitive/array\n\t * data for float bars\n\t * @protected\n\t */\n parsePrimitiveData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n\n /**\n\t * Overriding array data parsing since we support mixed primitive/array\n\t * data for float bars\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n return parseArrayOrPrimitive(meta, data, start, count);\n }\n\n /**\n\t * Overriding object data parsing since we support mixed primitive/array\n\t * value-scale data for float bars\n\t * @protected\n\t */\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\n /**\n\t * @protected\n\t */\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 // float bar: only one end of the bar is considered by `super`\n range.min = Math.min(range.min, custom.min);\n range.max = Math.max(range.max, custom.max);\n }\n }\n\n /**\n\t * @return {number|boolean}\n\t * @protected\n\t */\n getMaxOverflow() {\n return 0;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const {iScale, vScale} = meta;\n const parsed = this.getParsed(index);\n const custom = parsed._custom;\n const value = isFloatBar(custom)\n ? '[' + custom.start + ', ' + custom.end + ']'\n : '' + vScale.getLabelForValue(parsed[vScale.axis]);\n\n return {\n label: '' + iScale.getLabelForValue(parsed[iScale.axis]),\n value\n };\n }\n\n initialize() {\n this.enableOptionSharing = true;\n\n super.initialize();\n\n const meta = this._cachedMeta;\n meta.stack = this.getDataset().stack;\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n this.updateElements(meta.data, 0, meta.data.length, mode);\n }\n\n updateElements(bars, start, count, mode) {\n const reset = mode === 'reset';\n const {index, _cachedMeta: {vScale}} = this;\n const base = vScale.getBasePixel();\n const horizontal = vScale.isHorizontal();\n const ruler = this._getRuler();\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n\n for (let i = start; i < start + count; i++) {\n const parsed = this.getParsed(i);\n const vpixels = reset || isNullOrUndef(parsed[vScale.axis]) ? {base, head: base} : this._calculateBarValuePixels(i);\n const ipixels = this._calculateBarIndexPixels(i, ruler);\n const stack = (parsed._stacks || {})[vScale.axis];\n\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\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, bars[i].active ? 'active' : mode);\n }\n const options = properties.options || bars[i].options;\n setBorderSkipped(properties, options, stack, index);\n setInflateAmount(properties, options, ruler.ratio);\n this.updateElement(bars[i], i, properties, mode);\n }\n }\n\n /**\n\t * Returns the stacks based on groups and bar visibility.\n\t * @param {number} [last] - The dataset index\n\t * @param {number} [dataIndex] - The data index of the ruler\n\t * @returns {string[]} The list of stack IDs\n\t * @private\n\t */\n _getStacks(last, dataIndex) {\n const {iScale} = this._cachedMeta;\n const metasets = iScale.getMatchingVisibleMetas(this._type)\n .filter(meta => meta.controller.options.grouped);\n const stacked = iScale.options.stacked;\n const stacks = [];\n\n const skipNull = (meta) => {\n const parsed = meta.controller.getParsed(dataIndex);\n const val = parsed && parsed[meta.vScale.axis];\n\n if (isNullOrUndef(val) || isNaN(val)) {\n return true;\n }\n };\n\n for (const meta of metasets) {\n if (dataIndex !== undefined && skipNull(meta)) {\n continue;\n }\n\n // stacked | meta.stack\n // | found | not found | undefined\n // false | x | x | x\n // true | | x |\n // undefined | | x | x\n if (stacked === false || stacks.indexOf(meta.stack) === -1 ||\n\t\t\t\t(stacked === undefined && meta.stack === undefined)) {\n stacks.push(meta.stack);\n }\n if (meta.index === last) {\n break;\n }\n }\n\n // No stacks? that means there is no visible data. Let's still initialize an `undefined`\n // stack where possible invisible bars will be located.\n // https://github.com/chartjs/Chart.js/issues/6368\n if (!stacks.length) {\n stacks.push(undefined);\n }\n\n return stacks;\n }\n\n /**\n\t * Returns the effective number of stacks based on groups and bar visibility.\n\t * @private\n\t */\n _getStackCount(index) {\n return this._getStacks(undefined, index).length;\n }\n\n /**\n\t * Returns the stack index for the given dataset based on groups and bar visibility.\n\t * @param {number} [datasetIndex] - The dataset index\n\t * @param {string} [name] - The stack name to find\n * @param {number} [dataIndex]\n\t * @returns {number} The stack index\n\t * @private\n\t */\n _getStackIndex(datasetIndex, name, dataIndex) {\n const stacks = this._getStacks(datasetIndex, dataIndex);\n const index = (name !== undefined)\n ? stacks.indexOf(name)\n : -1; // indexOf returns -1 if element is not present\n\n return (index === -1)\n ? stacks.length - 1\n : index;\n }\n\n /**\n\t * @private\n\t */\n _getRuler() {\n const opts = this.options;\n const meta = this._cachedMeta;\n const iScale = meta.iScale;\n const pixels = [];\n let i, ilen;\n\n for (i = 0, ilen = meta.data.length; i < ilen; ++i) {\n pixels.push(iScale.getPixelForValue(this.getParsed(i)[iScale.axis], i));\n }\n\n const barThickness = opts.barThickness;\n const min = barThickness || computeMinSampleSize(meta);\n\n return {\n min,\n pixels,\n start: iScale._startPixel,\n end: iScale._endPixel,\n stackCount: this._getStackCount(),\n scale: iScale,\n grouped: opts.grouped,\n // bar thickness ratio used for non-grouped bars\n ratio: barThickness ? 1 : opts.categoryPercentage * opts.barPercentage\n };\n }\n\n /**\n\t * Note: pixel values are not clamped to the scale area.\n\t * @private\n\t */\n _calculateBarValuePixels(index) {\n const {_cachedMeta: {vScale, _stacked, index: datasetIndex}, options: {base: baseValue, minBarLength}} = this;\n const actualBase = baseValue || 0;\n const parsed = this.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 ? this.applyStack(vScale, parsed, _stacked) : value;\n let head, size;\n\n if (length !== value) {\n start = length - value;\n length = value;\n }\n\n if (floating) {\n value = custom.barStart;\n length = custom.barEnd - custom.barStart;\n // bars crossing origin are not stacked\n if (value !== 0 && sign(value) !== sign(custom.barEnd)) {\n start = 0;\n }\n start += value;\n }\n\n const startValue = !isNullOrUndef(baseValue) && !floating ? baseValue : start;\n let base = vScale.getPixelForValue(startValue);\n\n if (this.chart.getDataVisibility(index)) {\n head = vScale.getPixelForValue(start + length);\n } else {\n // When not visible, no height\n head = base;\n }\n\n size = head - base;\n\n if (Math.abs(size) < minBarLength) {\n size = barSign(size, vScale, actualBase) * minBarLength;\n if (value === actualBase) {\n base -= size / 2;\n }\n const startPixel = vScale.getPixelForDecimal(0);\n const endPixel = vScale.getPixelForDecimal(1);\n const min = Math.min(startPixel, endPixel);\n const max = Math.max(startPixel, endPixel);\n base = Math.max(Math.min(base, max), min);\n head = base + size;\n\n if (_stacked && !floating) {\n // visual data coordinates after applying minBarLength\n parsed._stacks[vScale.axis]._visualValues[datasetIndex] = vScale.getValueForPixel(head) - vScale.getValueForPixel(base);\n }\n }\n\n if (base === vScale.getPixelForValue(actualBase)) {\n const halfGrid = sign(size) * vScale.getLineWidthForValue(actualBase) / 2;\n base += halfGrid;\n size -= halfGrid;\n }\n\n return {\n size,\n base,\n head,\n center: head + size / 2\n };\n }\n\n /**\n\t * @private\n\t */\n _calculateBarIndexPixels(index, ruler) {\n const scale = ruler.scale;\n const options = this.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 ? this._getStackCount(index) : ruler.stackCount;\n const range = options.barThickness === 'flex'\n ? computeFlexCategoryTraits(index, ruler, options, stackCount)\n : computeFitCategoryTraits(index, ruler, options, stackCount);\n\n const stackIndex = this._getStackIndex(this.index, this._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 // For non-grouped bar charts, exact pixel values are used\n center = scale.getPixelForValue(this.getParsed(index)[scale.axis], index);\n size = Math.min(maxBarThickness, ruler.min * ruler.ratio);\n }\n\n return {\n base: center - size / 2,\n head: center + size / 2,\n center,\n size\n };\n }\n\n draw() {\n const meta = this._cachedMeta;\n const vScale = meta.vScale;\n const rects = meta.data;\n const ilen = rects.length;\n let i = 0;\n\n for (; i < ilen; ++i) {\n if (this.getParsed(i)[vScale.axis] !== null) {\n rects[i].draw(this._ctx);\n }\n }\n }\n\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {valueOrDefault} from '../helpers/helpers.core.js';\n\nexport default class BubbleController extends DatasetController {\n\n static id = 'bubble';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n\n animations: {\n numbers: {\n type: 'number',\n properties: ['x', 'y', 'borderWidth', 'radius']\n }\n }\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n };\n\n initialize() {\n this.enableOptionSharing = true;\n super.initialize();\n }\n\n /**\n\t * Parse array of primitive values\n\t * @protected\n\t */\n parsePrimitiveData(meta, data, start, count) {\n const parsed = super.parsePrimitiveData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n parsed[i]._custom = this.resolveDataElementOptions(i + start).radius;\n }\n return parsed;\n }\n\n /**\n\t * Parse array of arrays\n\t * @protected\n\t */\n parseArrayData(meta, data, start, count) {\n const parsed = super.parseArrayData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item[2], this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n\n /**\n\t * Parse array of objects\n\t * @protected\n\t */\n parseObjectData(meta, data, start, count) {\n const parsed = super.parseObjectData(meta, data, start, count);\n for (let i = 0; i < parsed.length; i++) {\n const item = data[start + i];\n parsed[i]._custom = valueOrDefault(item && item.r && +item.r, this.resolveDataElementOptions(i + start).radius);\n }\n return parsed;\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const data = this._cachedMeta.data;\n\n let max = 0;\n for (let i = data.length - 1; i >= 0; --i) {\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const {xScale, yScale} = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n const r = parsed._custom;\n\n return {\n label: labels[index] || '',\n value: '(' + x + ', ' + y + (r ? ', ' + r : '') + ')'\n };\n }\n\n update(mode) {\n const points = this._cachedMeta.data;\n\n // Update Points\n this.updateElements(points, 0, points.length, mode);\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale} = this._cachedMeta;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n\n for (let i = start; i < start + count; i++) {\n const point = points[i];\n const parsed = !reset && this.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\n properties.skip = isNaN(iPixel) || isNaN(vPixel);\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n\n if (reset) {\n properties.options.radius = 0;\n }\n }\n\n this.updateElement(point, i, properties, mode);\n }\n }\n\n /**\n\t * @param {number} index\n\t * @param {string} [mode]\n\t * @protected\n\t */\n resolveDataElementOptions(index, mode) {\n const parsed = this.getParsed(index);\n let values = super.resolveDataElementOptions(index, mode);\n\n // In case values were cached (and thus frozen), we need to clone the values\n if (values.$shared) {\n values = Object.assign({}, values, {$shared: false});\n }\n\n // Custom radius resolution\n const radius = values.radius;\n if (mode !== 'active') {\n values.radius = 0;\n }\n values.radius += valueOrDefault(parsed && parsed._custom, radius);\n\n return values;\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {isObject, resolveObjectKey, toPercentage, toDimension, valueOrDefault} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {toRadians, PI, TAU, HALF_PI, _angleBetween} from '../helpers/helpers.math.js';\n\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\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 the chart's circumference isn't a full circle, calculate size as a ratio of the width/height of the arc\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}\n\nexport default class DoughnutController extends DatasetController {\n\n static id = 'doughnut';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'arc',\n animation: {\n // Boolean - Whether we animate the rotation of the Doughnut\n animateRotate: true,\n // Boolean - Whether we animate scaling the Doughnut from the centre\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 // The percentage of the chart that we cut out of the middle.\n cutout: '50%',\n\n // The rotation of the chart, where the first data arc begins.\n rotation: 0,\n\n // The total circumference of the chart.\n circumference: 360,\n\n // The outer radius of the chart\n radius: '100%',\n\n // Spacing between arcs\n spacing: 0,\n\n indexAxis: 'r',\n };\n\n static descriptors = {\n _scriptable: (name) => name !== 'spacing',\n _indexable: (name) => name !== 'spacing' && !name.startsWith('borderDash') && !name.startsWith('hoverBorderDash'),\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\n // Need to override these to give a nice default\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, color}} = chart.legend.options;\n\n return data.labels.map((label, i) => {\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n\n return {\n text: label,\n fillStyle: style.backgroundColor,\n strokeStyle: style.borderColor,\n fontColor: color,\n lineWidth: style.borderWidth,\n pointStyle: pointStyle,\n hidden: !chart.getDataVisibility(i),\n\n // Extra data used for toggling the correct item\n index: i\n };\n });\n }\n return [];\n }\n },\n\n onClick(e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\n }\n }\n }\n };\n\n constructor(chart, datasetIndex) {\n super(chart, datasetIndex);\n\n this.enableOptionSharing = true;\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n this.offsetX = undefined;\n this.offsetY = undefined;\n }\n\n linkScales() {}\n\n /**\n\t * Override data parsing, since we are not using scales\n\t */\n parse(start, count) {\n const data = this.getDataset().data;\n const meta = this._cachedMeta;\n\n if (this._parsing === false) {\n meta._parsed = data;\n } else {\n let getter = (i) => +data[i];\n\n if (isObject(data[start])) {\n const {key = 'value'} = this._parsing;\n getter = (i) => +resolveObjectKey(data[i], key);\n }\n\n let i, ilen;\n for (i = start, ilen = start + count; i < ilen; ++i) {\n meta._parsed[i] = getter(i);\n }\n }\n }\n\n /**\n\t * @private\n\t */\n _getRotation() {\n return toRadians(this.options.rotation - 90);\n }\n\n /**\n\t * @private\n\t */\n _getCircumference() {\n return toRadians(this.options.circumference);\n }\n\n /**\n\t * Get the maximal rotation & circumference extents\n\t * across all visible datasets.\n\t */\n _getRotationExtents() {\n let min = TAU;\n let max = -TAU;\n\n for (let i = 0; i < this.chart.data.datasets.length; ++i) {\n if (this.chart.isDatasetVisible(i) && this.chart.getDatasetMeta(i).type === this._type) {\n const controller = this.chart.getDatasetMeta(i).controller;\n const rotation = controller._getRotation();\n const circumference = controller._getCircumference();\n\n min = Math.min(min, rotation);\n max = Math.max(max, rotation + circumference);\n }\n }\n\n return {\n rotation: min,\n circumference: max - min,\n };\n }\n\n /**\n\t * @param {string} mode\n\t */\n update(mode) {\n const chart = this.chart;\n const {chartArea} = chart;\n const meta = this._cachedMeta;\n const arcs = meta.data;\n const spacing = this.getMaxBorderWidth() + this.getMaxOffset(arcs) + this.options.spacing;\n const maxSize = Math.max((Math.min(chartArea.width, chartArea.height) - spacing) / 2, 0);\n const cutout = Math.min(toPercentage(this.options.cutout, maxSize), 1);\n const chartWeight = this._getRingWeight(this.index);\n\n // Compute the maximal rotation & circumference limits.\n // If we only consider our dataset, this can cause problems when two datasets\n // are both less than a circle with different rotations (starting angles)\n const {circumference, rotation} = this._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(this.options.radius, maxRadius);\n const innerRadius = Math.max(outerRadius * cutout, 0);\n const radiusLength = (outerRadius - innerRadius) / this._getVisibleDatasetWeightTotal();\n this.offsetX = offsetX * outerRadius;\n this.offsetY = offsetY * outerRadius;\n\n meta.total = this.calculateTotal();\n\n this.outerRadius = outerRadius - radiusLength * this._getRingWeightOffset(this.index);\n this.innerRadius = Math.max(this.outerRadius - radiusLength * chartWeight, 0);\n\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n\n /**\n * @private\n */\n _circumference(i, reset) {\n const opts = this.options;\n const meta = this._cachedMeta;\n const circumference = this._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 this.calculateCircumference(meta._parsed[i] * circumference / TAU);\n }\n\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.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 : this.innerRadius;\n const outerRadius = animateScale ? 0 : this.outerRadius;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n let startAngle = this._getRotation();\n let i;\n\n for (i = 0; i < start; ++i) {\n startAngle += this._circumference(i, reset);\n }\n\n for (i = start; i < start + count; ++i) {\n const circumference = this._circumference(i, reset);\n const arc = arcs[i];\n const properties = {\n x: centerX + this.offsetX,\n y: centerY + this.offsetY,\n startAngle,\n endAngle: startAngle + circumference,\n circumference,\n outerRadius,\n innerRadius\n };\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, arc.active ? 'active' : mode);\n }\n startAngle += circumference;\n\n this.updateElement(arc, i, properties, mode);\n }\n }\n\n calculateTotal() {\n const meta = this._cachedMeta;\n const metaData = meta.data;\n let total = 0;\n let i;\n\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\n return total;\n }\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\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index], chart.options.locale);\n\n return {\n label: labels[index] || '',\n value,\n };\n }\n\n getMaxBorderWidth(arcs) {\n let max = 0;\n const chart = this.chart;\n let i, ilen, meta, controller, options;\n\n if (!arcs) {\n // Find the outmost visible dataset\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 break;\n }\n }\n }\n\n if (!arcs) {\n return 0;\n }\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\n getMaxOffset(arcs) {\n let max = 0;\n\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\n /**\n\t * Get radius length offset of the dataset in relation to the visible datasets weights. This allows determining the inner and outer radius correctly\n\t * @private\n\t */\n _getRingWeightOffset(datasetIndex) {\n let ringWeightOffset = 0;\n\n for (let i = 0; i < datasetIndex; ++i) {\n if (this.chart.isDatasetVisible(i)) {\n ringWeightOffset += this._getRingWeight(i);\n }\n }\n\n return ringWeightOffset;\n }\n\n /**\n\t * @private\n\t */\n _getRingWeight(datasetIndex) {\n return Math.max(valueOrDefault(this.chart.data.datasets[datasetIndex].weight, 1), 0);\n }\n\n /**\n\t * Returns the sum of all visible data set weights.\n\t * @private\n\t */\n _getVisibleDatasetWeightTotal() {\n return this._getRingWeightOffset(this.chart.data.datasets.length) || 1;\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {isNullOrUndef} from '../helpers/index.js';\nimport {isNumber} from '../helpers/helpers.math.js';\nimport {_getStartAndCountOfVisiblePoints, _scaleRangesChanged} from '../helpers/helpers.extras.js';\n\nexport default class LineController extends DatasetController {\n\n static id = 'line';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n\n showLine: true,\n spanGaps: false,\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n scales: {\n _index_: {\n type: 'category',\n },\n _value_: {\n type: 'linear',\n },\n }\n };\n\n initialize() {\n this.enableOptionSharing = true;\n this.supportsDecimation = true;\n super.initialize();\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const {dataset: line, data: points = [], _dataset} = meta;\n // @ts-ignore\n const animationsDisabled = this.chart._animationsDisabled;\n let {start, count} = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n\n this._drawStart = start;\n this._drawCount = count;\n\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n\n // Update Line\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n\n // Update Points\n this.updateElements(points, start, count, mode);\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale, _stacked, _dataset} = this._cachedMeta;\n const {sharedOptions, includeOptions} = this._getSharedOptions(start, mode);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const {spanGaps, segment} = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n const end = start + count;\n const pointsCount = points.length;\n let prevParsed = start > 0 && this.getParsed(start - 1);\n\n for (let i = 0; i < pointsCount; ++i) {\n const point = points[i];\n const properties = directUpdate ? point : {};\n\n if (i < start || i >= end) {\n properties.skip = true;\n continue;\n }\n\n const parsed = this.getParsed(i);\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 ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && (Math.abs(parsed[iAxis] - prevParsed[iAxis])) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n\n prevParsed = parsed;\n }\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const meta = this._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(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n\n draw() {\n const meta = this._cachedMeta;\n meta.dataset.updateControlPoints(this.chart.chartArea, meta.iScale.axis);\n super.draw();\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {toRadians, PI, formatNumber, _parseObjectDataRadialScale} from '../helpers/index.js';\n\nexport default class PolarAreaController extends DatasetController {\n\n static id = 'polarArea';\n\n /**\n * @type {any}\n */\n static 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 };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\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, color}} = chart.legend.options;\n\n return data.labels.map((label, i) => {\n const meta = chart.getDatasetMeta(0);\n const style = meta.controller.getStyle(i);\n\n return {\n text: label,\n fillStyle: style.backgroundColor,\n strokeStyle: style.borderColor,\n fontColor: color,\n lineWidth: style.borderWidth,\n pointStyle: pointStyle,\n hidden: !chart.getDataVisibility(i),\n\n // Extra data used for toggling the correct item\n index: i\n };\n });\n }\n return [];\n }\n },\n\n onClick(e, legendItem, legend) {\n legend.chart.toggleDataVisibility(legendItem.index);\n legend.chart.update();\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\n constructor(chart, datasetIndex) {\n super(chart, datasetIndex);\n\n this.innerRadius = undefined;\n this.outerRadius = undefined;\n }\n\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const chart = this.chart;\n const labels = chart.data.labels || [];\n const value = formatNumber(meta._parsed[index].r, chart.options.locale);\n\n return {\n label: labels[index] || '',\n value,\n };\n }\n\n parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n\n update(mode) {\n const arcs = this._cachedMeta.data;\n\n this._updateRadius();\n this.updateElements(arcs, 0, arcs.length, mode);\n }\n\n /**\n * @protected\n */\n getMinMax() {\n const meta = this._cachedMeta;\n const range = {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY};\n\n meta.data.forEach((element, index) => {\n const parsed = this.getParsed(index).r;\n\n if (!isNaN(parsed) && this.chart.getDataVisibility(index)) {\n if (parsed < range.min) {\n range.min = parsed;\n }\n\n if (parsed > range.max) {\n range.max = parsed;\n }\n }\n });\n\n return range;\n }\n\n /**\n\t * @private\n\t */\n _updateRadius() {\n const chart = this.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\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\n this.outerRadius = outerRadius - (radiusLength * this.index);\n this.innerRadius = this.outerRadius - radiusLength;\n }\n\n updateElements(arcs, start, count, mode) {\n const reset = mode === 'reset';\n const chart = this.chart;\n const opts = chart.options;\n const animationOpts = opts.animation;\n const scale = this._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\n const defaultAngle = 360 / this.countVisibleElements();\n\n for (i = 0; i < start; ++i) {\n angle += this._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 + this._computeAngle(i, mode, defaultAngle);\n let outerRadius = chart.getDataVisibility(i) ? scale.getDistanceFromCenterForValue(this.getParsed(i).r) : 0;\n angle = endAngle;\n\n if (reset) {\n if (animationOpts.animateScale) {\n outerRadius = 0;\n }\n if (animationOpts.animateRotate) {\n startAngle = endAngle = datasetStartAngle;\n }\n }\n\n const properties = {\n x: centerX,\n y: centerY,\n innerRadius: 0,\n outerRadius,\n startAngle,\n endAngle,\n options: this.resolveDataElementOptions(i, arc.active ? 'active' : mode)\n };\n\n this.updateElement(arc, i, properties, mode);\n }\n }\n\n countVisibleElements() {\n const meta = this._cachedMeta;\n let count = 0;\n\n meta.data.forEach((element, index) => {\n if (!isNaN(this.getParsed(index).r) && this.chart.getDataVisibility(index)) {\n count++;\n }\n });\n\n return count;\n }\n\n /**\n\t * @private\n\t */\n _computeAngle(index, mode, defaultAngle) {\n return this.chart.getDataVisibility(index)\n ? toRadians(this.resolveDataElementOptions(index, mode).angle || defaultAngle)\n : 0;\n }\n}\n","import DoughnutController from './controller.doughnut.js';\n\n// Pie charts are Doughnut chart with different defaults\nexport default class PieController extends DoughnutController {\n\n static id = 'pie';\n\n /**\n * @type {any}\n */\n static defaults = {\n // The percentage of the chart that we cut out of the middle.\n cutout: 0,\n\n // The rotation of the chart, where the first data arc begins.\n rotation: 0,\n\n // The total circumference of the chart.\n circumference: 360,\n\n // The outer radius of the chart\n radius: '100%'\n };\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {_parseObjectDataRadialScale} from '../helpers/index.js';\n\nexport default class RadarController extends DatasetController {\n\n static id = 'radar';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: 'line',\n dataElementType: 'point',\n indexAxis: 'r',\n showLine: true,\n elements: {\n line: {\n fill: 'start'\n }\n },\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n aspectRatio: 1,\n\n scales: {\n r: {\n type: 'radialLinear',\n }\n }\n };\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const vScale = this._cachedMeta.vScale;\n const parsed = this.getParsed(index);\n\n return {\n label: vScale.getLabels()[index],\n value: '' + vScale.getLabelForValue(parsed[vScale.axis])\n };\n }\n\n parseObjectData(meta, data, start, count) {\n return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const line = meta.dataset;\n const points = meta.data || [];\n const labels = meta.iScale.getLabels();\n\n // Update Line\n line.points = points;\n // In resize mode only point locations change, so no need to set the points or options.\n if (mode !== 'resize') {\n const options = this.resolveDatasetElementOptions(mode);\n if (!this.options.showLine) {\n options.borderWidth = 0;\n }\n\n const properties = {\n _loop: true,\n _fullLoop: labels.length === points.length,\n options\n };\n\n this.updateElement(line, undefined, properties, mode);\n }\n\n // Update Points\n this.updateElements(points, 0, points.length, mode);\n }\n\n updateElements(points, start, count, mode) {\n const scale = this._cachedMeta.rScale;\n const reset = mode === 'reset';\n\n for (let i = start; i < start + count; i++) {\n const point = points[i];\n const options = this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n const pointPosition = scale.getPointPositionForValue(i, this.getParsed(i).r);\n\n const x = reset ? scale.xCenter : pointPosition.x;\n const y = reset ? scale.yCenter : pointPosition.y;\n\n const properties = {\n x,\n y,\n angle: pointPosition.angle,\n skip: isNaN(x) || isNaN(y),\n options\n };\n\n this.updateElement(point, i, properties, mode);\n }\n }\n}\n","import DatasetController from '../core/core.datasetController.js';\nimport {isNullOrUndef} from '../helpers/index.js';\nimport {isNumber} from '../helpers/helpers.math.js';\nimport {_getStartAndCountOfVisiblePoints, _scaleRangesChanged} from '../helpers/helpers.extras.js';\n\nexport default class ScatterController extends DatasetController {\n\n static id = 'scatter';\n\n /**\n * @type {any}\n */\n static defaults = {\n datasetElementType: false,\n dataElementType: 'point',\n showLine: false,\n fill: false\n };\n\n /**\n * @type {any}\n */\n static overrides = {\n\n interaction: {\n mode: 'point'\n },\n\n scales: {\n x: {\n type: 'linear'\n },\n y: {\n type: 'linear'\n }\n }\n };\n\n /**\n\t * @protected\n\t */\n getLabelAndValue(index) {\n const meta = this._cachedMeta;\n const labels = this.chart.data.labels || [];\n const {xScale, yScale} = meta;\n const parsed = this.getParsed(index);\n const x = xScale.getLabelForValue(parsed.x);\n const y = yScale.getLabelForValue(parsed.y);\n\n return {\n label: labels[index] || '',\n value: '(' + x + ', ' + y + ')'\n };\n }\n\n update(mode) {\n const meta = this._cachedMeta;\n const {data: points = []} = meta;\n // @ts-ignore\n const animationsDisabled = this.chart._animationsDisabled;\n let {start, count} = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n\n this._drawStart = start;\n this._drawCount = count;\n\n if (_scaleRangesChanged(meta)) {\n start = 0;\n count = points.length;\n }\n\n if (this.options.showLine) {\n\n // https://github.com/chartjs/Chart.js/issues/11333\n if (!this.datasetElementType) {\n this.addElements();\n }\n const {dataset: line, _dataset} = meta;\n\n // Update Line\n line._chart = this.chart;\n line._datasetIndex = this.index;\n line._decimated = !!_dataset._decimated;\n line.points = points;\n\n const options = this.resolveDatasetElementOptions(mode);\n options.segment = this.options.segment;\n this.updateElement(line, undefined, {\n animated: !animationsDisabled,\n options\n }, mode);\n } else if (this.datasetElementType) {\n // https://github.com/chartjs/Chart.js/issues/11333\n delete meta.dataset;\n this.datasetElementType = false;\n }\n\n // Update Points\n this.updateElements(points, start, count, mode);\n }\n\n addElements() {\n const {showLine} = this.options;\n\n if (!this.datasetElementType && showLine) {\n this.datasetElementType = this.chart.registry.getElement('line');\n }\n\n super.addElements();\n }\n\n updateElements(points, start, count, mode) {\n const reset = mode === 'reset';\n const {iScale, vScale, _stacked, _dataset} = this._cachedMeta;\n const firstOpts = this.resolveDataElementOptions(start, mode);\n const sharedOptions = this.getSharedOptions(firstOpts);\n const includeOptions = this.includeOptions(mode, sharedOptions);\n const iAxis = iScale.axis;\n const vAxis = vScale.axis;\n const {spanGaps, segment} = this.options;\n const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n let prevParsed = start > 0 && this.getParsed(start - 1);\n\n for (let i = start; i < start + count; ++i) {\n const point = points[i];\n const parsed = this.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 ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n\n properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n properties.stop = i > 0 && (Math.abs(parsed[iAxis] - prevParsed[iAxis])) > maxGapLength;\n if (segment) {\n properties.parsed = parsed;\n properties.raw = _dataset.data[i];\n }\n\n if (includeOptions) {\n properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n }\n\n if (!directUpdate) {\n this.updateElement(point, i, properties, mode);\n }\n\n prevParsed = parsed;\n }\n\n this.updateSharedOptions(sharedOptions, mode, firstOpts);\n }\n\n /**\n\t * @protected\n\t */\n getMaxOverflow() {\n const meta = this._cachedMeta;\n const data = meta.data || [];\n\n if (!this.options.showLine) {\n let max = 0;\n for (let i = data.length - 1; i >= 0; --i) {\n max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n }\n return max > 0 && max;\n }\n\n const dataset = meta.dataset;\n const border = dataset.options && dataset.options.borderWidth || 0;\n\n if (!data.length) {\n return border;\n }\n\n const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n return Math.max(border, firstPoint, lastPoint) / 2;\n }\n}\n","/**\n * @namespace Chart._adapters\n * @since 2.8.0\n * @private\n */\n\nimport type {AnyObject} from '../types/basic.js';\nimport type {ChartOptions} from '../types/index.js';\n\nexport type TimeUnit = 'millisecond' | 'second' | 'minute' | 'hour' | 'day' | 'week' | 'month' | 'quarter' | 'year';\n\nexport interface DateAdapter {\n readonly options: T;\n /**\n * Will called with chart options after adapter creation.\n */\n init(this: DateAdapter, chartOptions: ChartOptions): void;\n /**\n * Returns a map of time formats for the supported formatting units defined\n * in Unit as well as 'datetime' representing a detailed date/time string.\n */\n formats(this: DateAdapter): Record;\n /**\n * Parses the given `value` and return the associated timestamp.\n * @param value - the value to parse (usually comes from the data)\n * @param [format] - the expected data format\n */\n parse(this: DateAdapter, value: unknown, format?: TimeUnit): number | null;\n /**\n * Returns the formatted date in the specified `format` for a given `timestamp`.\n * @param timestamp - the timestamp to format\n * @param format - the date/time token\n */\n format(this: DateAdapter, timestamp: number, format: TimeUnit): string;\n /**\n * Adds the specified `amount` of `unit` to the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param amount - the amount to add\n * @param unit - the unit as string\n */\n add(this: DateAdapter, timestamp: number, amount: number, unit: TimeUnit): number;\n /**\n * Returns the number of `unit` between the given timestamps.\n * @param a - the input timestamp (reference)\n * @param b - the timestamp to subtract\n * @param unit - the unit as string\n */\n diff(this: DateAdapter, a: number, b: number, unit: TimeUnit): number;\n /**\n * Returns start of `unit` for the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param unit - the unit as string\n * @param [weekday] - the ISO day of the week with 1 being Monday\n * and 7 being Sunday (only needed if param *unit* is `isoWeek`).\n */\n startOf(this: DateAdapter, timestamp: number, unit: TimeUnit | 'isoWeek', weekday?: number): number;\n /**\n * Returns end of `unit` for the given `timestamp`.\n * @param timestamp - the input timestamp\n * @param unit - the unit as string\n */\n endOf(this: DateAdapter, timestamp: number, unit: TimeUnit | 'isoWeek'): number;\n}\n\nfunction abstract(): T {\n throw new Error('This method is not implemented: Check that a complete date adapter is provided.');\n}\n\n/**\n * Date adapter (current used by the time scale)\n * @namespace Chart._adapters._date\n * @memberof Chart._adapters\n * @private\n */\nclass DateAdapterBase implements DateAdapter {\n\n /**\n * Override default date adapter methods.\n * Accepts type parameter to define options type.\n * @example\n * Chart._adapters._date.override<{myAdapterOption: string}>({\n * init() {\n * console.log(this.options.myAdapterOption);\n * }\n * })\n */\n static override(\n members: Partial, 'options'>>\n ) {\n Object.assign(DateAdapterBase.prototype, members);\n }\n\n readonly options: AnyObject;\n\n constructor(options: AnyObject) {\n this.options = options || {};\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-function\n init() {}\n\n formats(): Record {\n return abstract();\n }\n\n parse(): number | null {\n return abstract();\n }\n\n format(): string {\n return abstract();\n }\n\n add(): number {\n return abstract();\n }\n\n diff(): number {\n return abstract();\n }\n\n startOf(): number {\n return abstract();\n }\n\n endOf(): number {\n return abstract();\n }\n}\n\nexport default {\n _date: DateAdapterBase\n};\n","import {_lookupByKey, _rlookupByKey} from '../helpers/helpers.collection.js';\nimport {getRelativePosition} from '../helpers/helpers.dom.js';\nimport {_angleBetween, getAngleFromPoint} from '../helpers/helpers.math.js';\nimport {_isPointInArea} from '../helpers/index.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef {{axis?: string, intersect?: boolean, includeInvisible?: boolean}} InteractionOptions\n * @typedef {{datasetIndex: number, index: number, element: import('./core.element.js').default}} InteractionItem\n * @typedef { import('../types/index.js').Point } Point\n */\n\n/**\n * Helper function to do binary search when possible\n * @param {object} metaset - the dataset meta\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {number} value - the value to find\n * @param {boolean} [intersect] - should the element intersect\n * @returns {{lo:number, hi:number}} indices to search data array between\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 && axis !== 'r' && _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 // _sharedOptions indicates that each element has equal options -> equal proportions\n // So we can do a ranged binary search based on the range of first element and\n // be confident to get the full range of indices that can intersect with the value.\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 // Default to all elements, when binary search can not be used.\n return {lo: 0, hi: data.length - 1};\n}\n\n/**\n * Helper function to select candidate elements for interaction\n * @param {Chart} chart - the chart\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {function} handler - the callback to execute for each visible item\n * @param {boolean} [intersect] - consider intersecting items\n */\nfunction evaluateInteractionItems(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}\n\n/**\n * Get a distance metric function for two points based on the\n * axis mode setting\n * @param {string} axis - the axis mode. x|y|xy|r\n */\nfunction getDistanceMetricForAxis(axis) {\n const useX = axis.indexOf('x') !== -1;\n const useY = axis.indexOf('y') !== -1;\n\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}\n\n/**\n * Helper function to get the items that intersect the event position\n * @param {Chart} chart - the chart\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axis mode. x|y|xy|r\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) {\n const items = [];\n\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return items;\n }\n\n const evaluationFunc = function(element, datasetIndex, index) {\n if (!includeInvisible && !_isPointInArea(element, chart.chartArea, 0)) {\n return;\n }\n if (element.inRange(position.x, position.y, useFinalPosition)) {\n items.push({element, datasetIndex, index});\n }\n };\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc, true);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position for a radial chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestRadialItems(chart, position, axis, useFinalPosition) {\n let items = [];\n\n function evaluationFunc(element, datasetIndex, index) {\n const {startAngle, endAngle} = element.getProps(['startAngle', 'endAngle'], useFinalPosition);\n const {angle} = getAngleFromPoint(element, {x: position.x, y: position.y});\n\n if (_angleBetween(angle, startAngle, endAngle)) {\n items.push({element, datasetIndex, index});\n }\n }\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position for a cartesian chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n let items = [];\n const distanceMetric = getDistanceMetricForAxis(axis);\n let minDistance = Number.POSITIVE_INFINITY;\n\n function evaluationFunc(element, datasetIndex, index) {\n const inRange = element.inRange(position.x, position.y, useFinalPosition);\n if (intersect && !inRange) {\n return;\n }\n\n const center = element.getCenterPoint(useFinalPosition);\n const pointInArea = !!includeInvisible || chart.isPointInArea(center);\n if (!pointInArea && !inRange) {\n return;\n }\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 // Can have multiple items at the same distance in which case we sort by size\n items.push({element, datasetIndex, index});\n }\n }\n\n evaluateInteractionItems(chart, axis, position, evaluationFunc);\n return items;\n}\n\n/**\n * Helper function to get the items nearest to the event position considering all visible items in the chart\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axes along which to measure distance\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @param {boolean} [includeInvisible] - include invisible points that are outside of the chart area\n * @return {InteractionItem[]} the nearest items\n */\nfunction getNearestItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n if (!includeInvisible && !chart.isPointInArea(position)) {\n return [];\n }\n\n return axis === 'r' && !intersect\n ? getNearestRadialItems(chart, position, axis, useFinalPosition)\n : getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible);\n}\n\n/**\n * Helper function to get the items matching along the given X or Y axis\n * @param {Chart} chart - the chart to look at elements from\n * @param {Point} position - the point to be nearest to, in relative coordinates\n * @param {string} axis - the axis to match\n * @param {boolean} [intersect] - if true, only consider items that intersect the position\n * @param {boolean} [useFinalPosition] - use the element's animation target instead of current position\n * @return {InteractionItem[]} the nearest items\n */\nfunction getAxisItems(chart, position, axis, intersect, useFinalPosition) {\n const items = [];\n const rangeMethod = axis === 'x' ? 'inXRange' : 'inYRange';\n let intersectsItem = false;\n\n evaluateInteractionItems(chart, axis, position, (element, datasetIndex, index) => {\n if (element[rangeMethod](position[axis], useFinalPosition)) {\n items.push({element, datasetIndex, index});\n intersectsItem = intersectsItem || element.inRange(position.x, position.y, useFinalPosition);\n }\n });\n\n // If we want to trigger on an intersect and we don't have any items\n // that intersect the position, return nothing\n if (intersect && !intersectsItem) {\n return [];\n }\n return items;\n}\n\n/**\n * Contains interaction related functions\n * @namespace Chart.Interaction\n */\nexport default {\n // Part of the public API to facilitate developers creating their own modes\n evaluateInteractionItems,\n\n // Helper function for different modes\n modes: {\n /**\n\t\t * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item\n\t\t * @function Chart.Interaction.modes.index\n\t\t * @since v2.4.0\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n index(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n // Default axis for index mode is 'x' to match old behaviour\n const axis = options.axis || 'x';\n const includeInvisible = options.includeInvisible || false;\n const items = options.intersect\n ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible)\n : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n const elements = [];\n\n if (!items.length) {\n return [];\n }\n\n chart.getSortedVisibleDatasetMetas().forEach((meta) => {\n const index = items[0].index;\n const element = meta.data[index];\n\n // don't count items that are skipped (null data)\n if (element && !element.skip) {\n elements.push({element, datasetIndex: meta.index, index});\n }\n });\n\n return elements;\n },\n\n /**\n\t\t * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something\n\t\t * If the options.intersect is false, we find the nearest item and return the items in that dataset\n\t\t * @function Chart.Interaction.modes.dataset\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n dataset(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n let items = options.intersect\n ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) :\n getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n\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\n return items;\n },\n\n /**\n\t\t * Point mode returns all elements that hit test based on the event position\n\t\t * of the event\n\t\t * @function Chart.Interaction.modes.intersect\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n point(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n return getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible);\n },\n\n /**\n\t\t * nearest mode returns the element closest to the point\n\t\t * @function Chart.Interaction.modes.intersect\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n nearest(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n const axis = options.axis || 'xy';\n const includeInvisible = options.includeInvisible || false;\n return getNearestItems(chart, position, axis, options.intersect, useFinalPosition, includeInvisible);\n },\n\n /**\n\t\t * x mode returns the elements that hit-test at the current x coordinate\n\t\t * @function Chart.Interaction.modes.x\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n x(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, 'x', options.intersect, useFinalPosition);\n },\n\n /**\n\t\t * y mode returns the elements that hit-test at the current y coordinate\n\t\t * @function Chart.Interaction.modes.y\n\t\t * @param {Chart} chart - the chart we are returning items from\n\t\t * @param {Event} e - the event we are find things at\n\t\t * @param {InteractionOptions} options - options to use\n\t\t * @param {boolean} [useFinalPosition] - use final element position (animation target)\n\t\t * @return {InteractionItem[]} - items that are found\n\t\t */\n y(chart, e, options, useFinalPosition) {\n const position = getRelativePosition(e, chart);\n return getAxisItems(chart, position, 'y', options.intersect, useFinalPosition);\n }\n }\n};\n","import {defined, each, isObject} from '../helpers/helpers.core.js';\nimport {toPadding} from '../helpers/helpers.options.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n */\n\nconst STATIC_POSITIONS = ['left', 'top', 'right', 'bottom'];\n\nfunction filterByPosition(array, position) {\n return array.filter(v => v.pos === position);\n}\n\nfunction filterDynamicPositionByAxis(array, axis) {\n return array.filter(v => STATIC_POSITIONS.indexOf(v.pos) === -1 && v.box.axis === axis);\n}\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}\n\nfunction wrapBoxes(boxes) {\n const layoutBoxes = [];\n let i, ilen, box, pos, stack, stackWeight;\n\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}\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}\n\n/**\n * store dimensions used instead of available chartArea in fitBoxes\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}\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\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}\n\nfunction getCombinedMax(maxPadding, chartArea, a, b) {\n return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]);\n}\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}\n\nfunction updateDims(chartArea, params, layout, stacks) {\n const {pos, box} = layout;\n const maxPadding = chartArea.maxPadding;\n\n // dynamically placed boxes size is not considered\n if (!isObject(pos)) {\n if (layout.size) {\n // this layout was already counted for, lets first reduce old 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\n if (box.getPadding) {\n updateMaxPadding(maxPadding, box.getPadding());\n }\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\n // return booleans on the changes per direction\n return layout.horizontal\n ? {same: widthChanged, other: heightChanged}\n : {same: heightChanged, other: widthChanged};\n}\n\nfunction handleMaxPadding(chartArea) {\n const maxPadding = chartArea.maxPadding;\n\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}\n\nfunction getMargins(horizontal, chartArea) {\n const maxPadding = chartArea.maxPadding;\n\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\n return horizontal\n ? marginForPositions(['left', 'right'])\n : marginForPositions(['top', 'bottom']);\n}\n\nfunction fitBoxes(boxes, chartArea, params, stacks) {\n const refitBoxes = [];\n let i, ilen, layout, box, refit, changed;\n\n for (i = 0, ilen = boxes.length, refit = 0; i < ilen; ++i) {\n layout = boxes[i];\n box = layout.box;\n\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\n // Dimensions changed and there were non full width boxes before this\n // -> we have to refit those\n refit |= same && refitBoxes.length;\n\n // Chart area changed in the opposite direction\n changed = changed || other;\n\n if (!box.fullSize) { // fullSize boxes don't need to be re-fitted in any case\n refitBoxes.push(layout);\n }\n }\n\n return refit && fitBoxes(refitBoxes, chartArea, params, stacks) || changed;\n}\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}\n\nfunction placeBoxes(boxes, chartArea, params, stacks) {\n const userPadding = params.padding;\n let {x, y} = chartArea;\n\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\n chartArea.x = x;\n chartArea.y = y;\n}\n\n/**\n * @interface LayoutItem\n * @typedef {object} LayoutItem\n * @prop {string} position - The position of the item in the chart layout. Possible values are\n * 'left', 'top', 'right', 'bottom', and 'chartArea'\n * @prop {number} weight - The weight used to sort the item. Higher weights are further away from the chart area\n * @prop {boolean} fullSize - if true, and the item is horizontal, then push vertical boxes down\n * @prop {function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom)\n * @prop {function} update - Takes two parameters: width and height. Returns size of item\n * @prop {function} draw - Draws the element\n * @prop {function} [getPadding] - Returns an object with padding on the edges\n * @prop {number} width - Width of item. Must be valid after update()\n * @prop {number} height - Height of item. Must be valid after update()\n * @prop {number} left - Left edge of the item. Set by layout system and cannot be used in update\n * @prop {number} top - Top edge of the item. Set by layout system and cannot be used in update\n * @prop {number} right - Right edge of the item. Set by layout system and cannot be used in update\n * @prop {number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update\n */\n\n// The layout service is very self explanatory. It's responsible for the layout within a chart.\n// Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need\n// It is this service's responsibility of carrying out that layout.\nexport default {\n\n /**\n\t * Register a box to a chart.\n\t * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title.\n\t * @param {Chart} chart - the chart to use\n\t * @param {LayoutItem} item - the item to add to be laid out\n\t */\n addBox(chart, item) {\n if (!chart.boxes) {\n chart.boxes = [];\n }\n\n // initialize item with default values\n item.fullSize = item.fullSize || false;\n item.position = item.position || 'top';\n item.weight = item.weight || 0;\n // @ts-ignore\n item._layers = item._layers || function() {\n return [{\n z: 0,\n draw(chartArea) {\n item.draw(chartArea);\n }\n }];\n };\n\n chart.boxes.push(item);\n },\n\n /**\n\t * Remove a layoutItem from a chart\n\t * @param {Chart} chart - the chart to remove the box from\n\t * @param {LayoutItem} layoutItem - the item to remove from the layout\n\t */\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\n /**\n\t * Sets (or updates) options on the given `item`.\n\t * @param {Chart} chart - the chart in which the item lives (or will be added to)\n\t * @param {LayoutItem} item - the item to configure with the given options\n\t * @param {object} options - the new item options.\n\t */\n configure(chart, item, options) {\n item.fullSize = options.fullSize;\n item.position = options.position;\n item.weight = options.weight;\n },\n\n /**\n\t * Fits boxes of the given chart into the given size by having each box measure itself\n\t * then running a fitting algorithm\n\t * @param {Chart} chart - the chart\n\t * @param {number} width - the width to fit into\n\t * @param {number} height - the height to fit into\n * @param {number} minPadding - minimum padding required for each side of chart area\n\t */\n update(chart, width, height, minPadding) {\n if (!chart) {\n return;\n }\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\n // Before any changes are made, notify boxes that an update is about to being\n // This is used to clear any cached data (e.g. scale limits)\n each(chart.boxes, box => {\n if (typeof box.beforeLayout === 'function') {\n box.beforeLayout();\n }\n });\n\n // Essentially we now have any number of boxes on each of the 4 sides.\n // Our canvas looks like the following.\n // The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and\n // B1 is the bottom axis\n // There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays\n // These locations are single-box locations only, when trying to register a chartArea location that is already taken,\n // an error will be thrown.\n //\n // |----------------------------------------------------|\n // | T1 (Full Width) |\n // |----------------------------------------------------|\n // | | | T2 | |\n // | |----|-------------------------------------|----|\n // | | | C1 | | C2 | |\n // | | |----| |----| |\n // | | | | |\n // | L1 | L2 | ChartArea (C0) | R1 |\n // | | | | |\n // | | |----| |----| |\n // | | | C3 | | C4 | |\n // | |----|-------------------------------------|----|\n // | | | B1 | |\n // |----------------------------------------------------|\n // | B2 (Full Width) |\n // |----------------------------------------------------|\n //\n\n const visibleVerticalBoxCount = verticalBoxes.reduce((total, wrap) =>\n wrap.box.options && wrap.box.options.display === false ? total : total + 1, 0) || 1;\n\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\n const stacks = setLayoutDims(verticalBoxes.concat(horizontalBoxes), params);\n\n // First fit the fullSize boxes, to reduce probability of re-fitting.\n fitBoxes(boxes.fullSize, chartArea, params, stacks);\n\n // Then fit vertical boxes\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n\n // Then fit horizontal boxes\n if (fitBoxes(horizontalBoxes, chartArea, params, stacks)) {\n // if the area changed, re-fit vertical boxes\n fitBoxes(verticalBoxes, chartArea, params, stacks);\n }\n\n handleMaxPadding(chartArea);\n\n // Finally place the boxes to correct coordinates\n placeBoxes(boxes.leftAndTop, chartArea, params, stacks);\n\n // Move to opposite side of chart\n chartArea.x += chartArea.w;\n chartArea.y += chartArea.h;\n\n placeBoxes(boxes.rightAndBottom, chartArea, params, stacks);\n\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\n // Finally update boxes in chartArea (radial scale for example)\n each(boxes.chartArea, (layout) => {\n const box = layout.box;\n Object.assign(box, chart.chartArea);\n box.update(chartArea.w, chartArea.h, {left: 0, top: 0, right: 0, bottom: 0});\n });\n }\n};\n","\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\n/**\n * Abstract class that allows abstracting platform dependencies away from the chart.\n */\nexport default class BasePlatform {\n /**\n\t * Called at chart construction time, returns a context2d instance implementing\n\t * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}.\n\t * @param {HTMLCanvasElement} canvas - The canvas from which to acquire context (platform specific)\n\t * @param {number} [aspectRatio] - The chart options\n\t */\n acquireContext(canvas, aspectRatio) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Called at chart destruction time, releases any resources associated to the context\n\t * previously returned by the acquireContext() method.\n\t * @param {CanvasRenderingContext2D} context - The context2d instance\n\t * @returns {boolean} true if the method succeeded, else false\n\t */\n releaseContext(context) { // eslint-disable-line no-unused-vars\n return false;\n }\n\n /**\n\t * Registers the specified listener on the given chart.\n\t * @param {Chart} chart - Chart from which to listen for event\n\t * @param {string} type - The ({@link ChartEvent}) type to listen for\n\t * @param {function} listener - Receives a notification (an object that implements\n\t * the {@link ChartEvent} interface) when an event of the specified type occurs.\n\t */\n addEventListener(chart, type, listener) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Removes the specified listener previously registered with addEventListener.\n\t * @param {Chart} chart - Chart from which to remove the listener\n\t * @param {string} type - The ({@link ChartEvent}) type to remove\n\t * @param {function} listener - The listener function to remove from the event target.\n\t */\n removeEventListener(chart, type, listener) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * @returns {number} the current devicePixelRatio of the device this platform is connected to.\n\t */\n getDevicePixelRatio() {\n return 1;\n }\n\n /**\n\t * Returns the maximum size in pixels of given canvas element.\n\t * @param {HTMLCanvasElement} element\n\t * @param {number} [width] - content width of parent element\n\t * @param {number} [height] - content height of parent element\n\t * @param {number} [aspectRatio] - aspect ratio to maintain\n\t */\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\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @returns {boolean} true if the canvas is attached to the platform, false if not.\n\t */\n isAttached(canvas) { // eslint-disable-line no-unused-vars\n return true;\n }\n\n /**\n * Updates config with platform specific requirements\n * @param {import('../core/core.config.js').default} config\n */\n updateConfig(config) { // eslint-disable-line no-unused-vars\n // no-op\n }\n}\n","/**\n * Platform fallback implementation (minimal).\n * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939\n */\n\nimport BasePlatform from './platform.base.js';\n\n/**\n * Platform class for charts without access to the DOM or to many element properties\n * This platform is used by default for any chart passed an OffscreenCanvas.\n * @extends BasePlatform\n */\nexport default class BasicPlatform extends BasePlatform {\n acquireContext(item) {\n // To prevent canvas fingerprinting, some add-ons undefine the getContext\n // method, for example: https://github.com/kkapsner/CanvasBlocker\n // https://github.com/chartjs/Chart.js/issues/2807\n return item && item.getContext && item.getContext('2d') || null;\n }\n updateConfig(config) {\n config.options.animation = false;\n }\n}\n","/**\n * Chart.Platform implementation for targeting a web browser\n */\n\nimport BasePlatform from './platform.base.js';\nimport {_getParentNode, getRelativePosition, supportsEventListenerOptions, readUsedSize, getMaximumSize} from '../helpers/helpers.dom.js';\nimport {throttled} from '../helpers/helpers.extras.js';\nimport {isNullOrUndef} from '../helpers/helpers.core.js';\n\n/**\n * @typedef { import('../core/core.controller.js').default } Chart\n */\n\nconst EXPANDO_KEY = '$chartjs';\n\n/**\n * DOM event types -> Chart.js event types.\n * Note: only events with different types are mapped.\n * @see https://developer.mozilla.org/en-US/docs/Web/Events\n */\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};\n\nconst isNullOrEmpty = value => value === null || value === '';\n/**\n * Initializes the canvas style and render size without modifying the canvas display size,\n * since responsiveness is handled by the controller.resize() method. The config is used\n * to determine the aspect ratio to apply in case no explicit height has been specified.\n * @param {HTMLCanvasElement} canvas\n * @param {number} [aspectRatio]\n */\nfunction initCanvas(canvas, aspectRatio) {\n const style = canvas.style;\n\n // NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it\n // returns null or '' if no explicit value has been set to the canvas attribute.\n const renderHeight = canvas.getAttribute('height');\n const renderWidth = canvas.getAttribute('width');\n\n // Chart.js modifies some canvas values that we want to restore on destroy\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\n // Force canvas to display as block to avoid extra space caused by inline\n // elements, which would interfere with the responsive resize process.\n // https://github.com/chartjs/Chart.js/issues/2538\n style.display = style.display || 'block';\n // Include possible borders in the size\n style.boxSizing = style.boxSizing || 'border-box';\n\n if (isNullOrEmpty(renderWidth)) {\n const displayWidth = readUsedSize(canvas, 'width');\n if (displayWidth !== undefined) {\n canvas.width = displayWidth;\n }\n }\n\n if (isNullOrEmpty(renderHeight)) {\n if (canvas.style.height === '') {\n // If no explicit render height and style height, let's apply the aspect ratio,\n // which one can be specified by the user but also by charts as default option\n // (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2.\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\n return canvas;\n}\n\n// Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events.\n// https://github.com/chartjs/Chart.js/issues/4287\nconst eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false;\n\nfunction addListener(node, type, listener) {\n node.addEventListener(type, listener, eventListenerOptions);\n}\n\nfunction removeListener(chart, type, listener) {\n chart.canvas.removeEventListener(type, listener, eventListenerOptions);\n}\n\nfunction fromNativeEvent(event, chart) {\n const type = EVENT_TYPES[event.type] || event.type;\n const {x, y} = getRelativePosition(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}\n\nfunction nodeListContains(nodeList, canvas) {\n for (const node of nodeList) {\n if (node === canvas || node.contains(canvas)) {\n return true;\n }\n }\n}\n\nfunction createAttachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver(entries => {\n let trigger = false;\n for (const entry of entries) {\n trigger = trigger || nodeListContains(entry.addedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.removedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {childList: true, subtree: true});\n return observer;\n}\n\nfunction createDetachObserver(chart, type, listener) {\n const canvas = chart.canvas;\n const observer = new MutationObserver(entries => {\n let trigger = false;\n for (const entry of entries) {\n trigger = trigger || nodeListContains(entry.removedNodes, canvas);\n trigger = trigger && !nodeListContains(entry.addedNodes, canvas);\n }\n if (trigger) {\n listener();\n }\n });\n observer.observe(document, {childList: true, subtree: true});\n return observer;\n}\n\nconst drpListeningCharts = new Map();\nlet oldDevicePixelRatio = 0;\n\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}\n\nfunction listenDevicePixelRatioChanges(chart, resize) {\n if (!drpListeningCharts.size) {\n window.addEventListener('resize', onWindowResize);\n }\n drpListeningCharts.set(chart, resize);\n}\n\nfunction unlistenDevicePixelRatioChanges(chart) {\n drpListeningCharts.delete(chart);\n if (!drpListeningCharts.size) {\n window.removeEventListener('resize', onWindowResize);\n }\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 // If the container size shrank during chart resize, let's assume\n // scrollbar appeared. So we resize again with the scrollbar visible -\n // effectively making chart smaller and the scrollbar hidden again.\n // Because we are inside `throttled`, and currently `ticking`, scroll\n // events are ignored during this whole 2 resize process.\n // If we assumed wrong and something else happened, we are resizing\n // twice in a frame (potential performance issue)\n listener();\n }\n }, window);\n\n // @ts-ignore until https://github.com/microsoft/TypeScript/issues/37861 implemented\n const observer = new ResizeObserver(entries => {\n const entry = entries[0];\n const width = entry.contentRect.width;\n const height = entry.contentRect.height;\n // When its container's display is set to 'none' the callback will be called with a\n // size of (0, 0), which will cause the chart to lose its original height, so skip\n // resizing in such case.\n if (width === 0 && height === 0) {\n return;\n }\n resize(width, height);\n });\n observer.observe(container);\n listenDevicePixelRatioChanges(chart, resize);\n\n return observer;\n}\n\nfunction releaseObserver(chart, type, observer) {\n if (observer) {\n observer.disconnect();\n }\n if (type === 'resize') {\n unlistenDevicePixelRatioChanges(chart);\n }\n}\n\nfunction createProxyAndListen(chart, type, listener) {\n const canvas = chart.canvas;\n const proxy = throttled((event) => {\n // This case can occur if the chart is destroyed while waiting\n // for the throttled function to occur. We prevent crashes by checking\n // for a destroyed chart\n if (chart.ctx !== null) {\n listener(fromNativeEvent(event, chart));\n }\n }, chart);\n\n addListener(canvas, type, proxy);\n\n return proxy;\n}\n\n/**\n * Platform class for charts that can access the DOM and global window/document properties\n * @extends BasePlatform\n */\nexport default class DomPlatform extends BasePlatform {\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @param {number} [aspectRatio]\n\t * @return {CanvasRenderingContext2D|null}\n\t */\n acquireContext(canvas, aspectRatio) {\n // To prevent canvas fingerprinting, some add-ons undefine the getContext\n // method, for example: https://github.com/kkapsner/CanvasBlocker\n // https://github.com/chartjs/Chart.js/issues/2807\n const context = canvas && canvas.getContext && canvas.getContext('2d');\n\n // `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the canvas is\n // inside an iframe or when running in a protected environment. We could guess the\n // types from their toString() value but let's keep things flexible and assume it's\n // a sufficient condition if the canvas has a context2D which has canvas as `canvas`.\n // https://github.com/chartjs/Chart.js/issues/3887\n // https://github.com/chartjs/Chart.js/issues/4102\n // https://github.com/chartjs/Chart.js/issues/4152\n if (context && context.canvas === canvas) {\n // Load platform resources on first chart creation, to make it possible to\n // import the library before setting platform options.\n initCanvas(canvas, aspectRatio);\n return context;\n }\n\n return null;\n }\n\n /**\n\t * @param {CanvasRenderingContext2D} context\n\t */\n releaseContext(context) {\n const canvas = context.canvas;\n if (!canvas[EXPANDO_KEY]) {\n return false;\n }\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\n const style = initial.style || {};\n Object.keys(style).forEach((key) => {\n canvas.style[key] = style[key];\n });\n\n // The canvas render size might have been changed (and thus the state stack discarded),\n // we can't use save() and restore() to restore the initial state. So make sure that at\n // least the canvas context is reset to the default state by setting the canvas width.\n // https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html\n // eslint-disable-next-line no-self-assign\n canvas.width = canvas.width;\n\n delete canvas[EXPANDO_KEY];\n return true;\n }\n\n /**\n\t *\n\t * @param {Chart} chart\n\t * @param {string} type\n\t * @param {function} listener\n\t */\n addEventListener(chart, type, listener) {\n // Can have only one listener per type, so make sure previous is removed\n this.removeEventListener(chart, type);\n\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\n\n /**\n\t * @param {Chart} chart\n\t * @param {string} type\n\t */\n removeEventListener(chart, type) {\n const proxies = chart.$proxies || (chart.$proxies = {});\n const proxy = proxies[type];\n\n if (!proxy) {\n return;\n }\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\n getDevicePixelRatio() {\n return window.devicePixelRatio;\n }\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t * @param {number} [width] - content width of parent element\n\t * @param {number} [height] - content height of parent element\n\t * @param {number} [aspectRatio] - aspect ratio to maintain\n\t */\n getMaximumSize(canvas, width, height, aspectRatio) {\n return getMaximumSize(canvas, width, height, aspectRatio);\n }\n\n /**\n\t * @param {HTMLCanvasElement} canvas\n\t */\n isAttached(canvas) {\n const container = _getParentNode(canvas);\n return !!(container && container.isConnected);\n }\n}\n","import {_isDomSupported} from '../helpers/index.js';\nimport BasePlatform from './platform.base.js';\nimport BasicPlatform from './platform.basic.js';\nimport DomPlatform from './platform.dom.js';\n\nexport function _detectPlatform(canvas) {\n if (!_isDomSupported() || (typeof OffscreenCanvas !== 'undefined' && canvas instanceof OffscreenCanvas)) {\n return BasicPlatform;\n }\n return DomPlatform;\n}\n\nexport {BasePlatform, BasicPlatform, DomPlatform};\n","import type {AnyObject} from '../types/basic.js';\nimport type {Point} from '../types/geometric.js';\nimport type {Animation} from '../types/animation.js';\nimport {isNumber} from '../helpers/helpers.math.js';\n\nexport default class Element {\n\n static defaults = {};\n static defaultRoutes = undefined;\n\n x: number;\n y: number;\n active = false;\n options: O;\n $animations: Record;\n\n tooltipPosition(useFinalPosition: boolean): Point {\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return {x, y} as Point;\n }\n\n hasValue() {\n return isNumber(this.x) && isNumber(this.y);\n }\n\n /**\n * Gets the current or final value of each prop. Can return extra properties (whole object).\n * @param props - properties to get\n * @param [final] - get the final value (animation target)\n */\n getProps

(props: P, final?: boolean): Pick;\n getProps

(props: P[], final?: boolean): Partial>;\n getProps(props: string[], final?: boolean): Partial> {\n const anims = this.$animations;\n if (!final || !anims) {\n // let's not create an object, if not needed\n return this as Record;\n }\n const ret: Record = {};\n props.forEach((prop) => {\n ret[prop] = anims[prop] && anims[prop].active() ? anims[prop]._to : this[prop as string];\n });\n return ret;\n }\n}\n","import {isNullOrUndef, valueOrDefault} from '../helpers/helpers.core.js';\nimport {_factorize} from '../helpers/helpers.math.js';\n\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef {{value:number | string, label?:string, major?:boolean, $context?:any}} Tick\n */\n\n/**\n * Returns a subset of ticks to be plotted to avoid overlapping labels.\n * @param {import('./core.scale.js').default} scale\n * @param {Tick[]} ticks\n * @return {Tick[]}\n * @private\n */\nexport function autoSkip(scale, ticks) {\n const tickOpts = scale.options.ticks;\n const determinedMaxTicks = determineMaxTicks(scale);\n const ticksLimit = Math.min(tickOpts.maxTicksLimit || determinedMaxTicks, determinedMaxTicks);\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\n // If there are too many major ticks to display them all\n if (numMajorIndices > ticksLimit) {\n skipMajors(ticks, newTicks, majorIndices, numMajorIndices / ticksLimit);\n return newTicks;\n }\n\n const spacing = calculateSpacing(majorIndices, ticks, ticksLimit);\n\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}\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}\n\n/**\n * @param {number[]} majorIndices\n * @param {Tick[]} ticks\n * @param {number} ticksLimit\n */\nfunction calculateSpacing(majorIndices, ticks, ticksLimit) {\n const evenMajorSpacing = getEvenSpacing(majorIndices);\n const spacing = ticks.length / ticksLimit;\n\n // If the major ticks are evenly spaced apart, place the minor ticks\n // so that they divide the major ticks into even chunks\n if (!evenMajorSpacing) {\n return Math.max(spacing, 1);\n }\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}\n\n/**\n * @param {Tick[]} ticks\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}\n\n/**\n * @param {Tick[]} ticks\n * @param {Tick[]} newTicks\n * @param {number[]} majorIndices\n * @param {number} spacing\n */\nfunction skipMajors(ticks, newTicks, majorIndices, spacing) {\n let count = 0;\n let next = majorIndices[0];\n let i;\n\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}\n\n/**\n * @param {Tick[]} ticks\n * @param {Tick[]} newTicks\n * @param {number} spacing\n * @param {number} [majorStart]\n * @param {number} [majorEnd]\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\n spacing = Math.ceil(spacing);\n if (majorEnd) {\n length = majorEnd - majorStart;\n spacing = length / Math.floor(length / spacing);\n }\n\n next = start;\n\n while (next < 0) {\n count++;\n next = Math.round(start + count * spacing);\n }\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}\n\n\n/**\n * @param {number[]} arr\n */\nfunction getEvenSpacing(arr) {\n const len = arr.length;\n let i, diff;\n\n if (len < 2) {\n return false;\n }\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","import Element from './core.element.js';\nimport {_alignPixel, _measureText, renderText, clipArea, unclipArea} from '../helpers/helpers.canvas.js';\nimport {callback as call, each, finiteOrDefault, isArray, isFinite, isNullOrUndef, isObject, valueOrDefault} from '../helpers/helpers.core.js';\nimport {toDegrees, toRadians, _int16Range, _limitValue, HALF_PI} from '../helpers/helpers.math.js';\nimport {_alignStartEnd, _toLeftRightCenter} from '../helpers/helpers.extras.js';\nimport {createContext, toFont, toPadding, _addGrace} from '../helpers/helpers.options.js';\nimport {autoSkip} from './core.scale.autoskip.js';\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;\nconst getTicksLimit = (ticksLength, maxTicksLimit) => Math.min(maxTicksLimit || ticksLength, ticksLength);\n\n/**\n * @typedef { import('../types/index.js').Chart } Chart\n * @typedef {{value:number | string, label?:string, major?:boolean, $context?:any}} Tick\n */\n\n/**\n * Returns a new array containing numItems from arr\n * @param {any[]} arr\n * @param {number} numItems\n */\nfunction sample(arr, numItems) {\n const result = [];\n const increment = arr.length / numItems;\n const len = arr.length;\n let i = 0;\n\n for (; i < len; i += increment) {\n result.push(arr[Math.floor(i)]);\n }\n return result;\n}\n\n/**\n * @param {Scale} scale\n * @param {number} index\n * @param {boolean} offsetGridLines\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; // 1e-6 is margin in pixels for accumulated error.\n let lineValue = scale.getPixelForTick(validIndex);\n let offset;\n\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\n // Return undefined if the pixel is out of the range\n if (lineValue < start - epsilon || lineValue > end + epsilon) {\n return;\n }\n }\n return lineValue;\n}\n\n/**\n * @param {object} caches\n * @param {number} length\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}\n\n/**\n * @param {object} options\n */\nfunction getTickMarkLength(options) {\n return options.drawTicks ? options.tickLength : 0;\n}\n\n/**\n * @param {object} options\n */\nfunction getTitleHeight(options, fallback) {\n if (!options.display) {\n return 0;\n }\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\n return (lines * font.lineHeight) + padding.height;\n}\n\nfunction createScaleContext(parent, scale) {\n return createContext(parent, {\n scale,\n type: 'scale'\n });\n}\n\nfunction createTickContext(parent, index, tick) {\n return createContext(parent, {\n tick,\n index,\n type: 'tick'\n });\n}\n\nfunction titleAlign(align, position, reverse) {\n /** @type {CanvasTextAlign} */\n let ret = _toLeftRightCenter(align);\n if ((reverse && position !== 'right') || (!reverse && position === 'right')) {\n ret = reverseAlign(ret);\n }\n return ret;\n}\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\n if (scale.isHorizontal()) {\n titleX = _alignStartEnd(align, left, right);\n\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}\n\nexport default class Scale extends Element {\n\n // eslint-disable-next-line max-statements\n constructor(cfg) {\n super();\n\n /** @type {string} */\n this.id = cfg.id;\n /** @type {string} */\n this.type = cfg.type;\n /** @type {any} */\n this.options = undefined;\n /** @type {CanvasRenderingContext2D} */\n this.ctx = cfg.ctx;\n /** @type {Chart} */\n this.chart = cfg.chart;\n\n // implements box\n /** @type {number} */\n this.top = undefined;\n /** @type {number} */\n this.bottom = undefined;\n /** @type {number} */\n this.left = undefined;\n /** @type {number} */\n this.right = undefined;\n /** @type {number} */\n this.width = undefined;\n /** @type {number} */\n this.height = undefined;\n this._margins = {\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n };\n /** @type {number} */\n this.maxWidth = undefined;\n /** @type {number} */\n this.maxHeight = undefined;\n /** @type {number} */\n this.paddingTop = undefined;\n /** @type {number} */\n this.paddingBottom = undefined;\n /** @type {number} */\n this.paddingLeft = undefined;\n /** @type {number} */\n this.paddingRight = undefined;\n\n // scale-specific properties\n /** @type {string=} */\n this.axis = undefined;\n /** @type {number=} */\n this.labelRotation = undefined;\n this.min = undefined;\n this.max = undefined;\n this._range = undefined;\n /** @type {Tick[]} */\n this.ticks = [];\n /** @type {object[]|null} */\n this._gridLineItems = null;\n /** @type {object[]|null} */\n this._labelItems = null;\n /** @type {object|null} */\n this._labelSizes = null;\n this._length = 0;\n this._maxLength = 0;\n this._longestTextCache = {};\n /** @type {number} */\n this._startPixel = undefined;\n /** @type {number} */\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\n /**\n\t * @param {any} options\n\t * @since 3.0\n\t */\n init(options) {\n this.options = options.setContext(this.getContext());\n\n this.axis = options.axis;\n\n // parse min/max value, so we can properly determine min/max for other scales\n this._userMin = this.parse(options.min);\n this._userMax = this.parse(options.max);\n this._suggestedMin = this.parse(options.suggestedMin);\n this._suggestedMax = this.parse(options.suggestedMax);\n }\n\n /**\n\t * Parse a supported input value to internal representation.\n\t * @param {*} raw\n\t * @param {number} [index]\n\t * @since 3.0\n\t */\n parse(raw, index) { // eslint-disable-line no-unused-vars\n return raw;\n }\n\n /**\n\t * @return {{min: number, max: number, minDefined: boolean, maxDefined: boolean}}\n\t * @protected\n\t * @since 3.0\n\t */\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: isFinite(_userMin),\n maxDefined: isFinite(_userMax)\n };\n }\n\n /**\n\t * @param {boolean} canStack\n\t * @return {{min: number, max: number}}\n\t * @protected\n\t * @since 3.0\n\t */\n getMinMax(canStack) {\n // eslint-disable-next-line prefer-const\n let {min, max, minDefined, maxDefined} = this.getUserBounds();\n let range;\n\n if (minDefined && maxDefined) {\n return {min, max};\n }\n\n const metas = this.getMatchingVisibleMetas();\n for (let i = 0, ilen = metas.length; i < ilen; ++i) {\n range = metas[i].controller.getMinMax(this, 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\n // Make sure min <= max when only min or max is defined by user and the data is outside that range\n min = maxDefined && min > max ? max : min;\n max = minDefined && min > max ? min : max;\n\n return {\n min: finiteOrDefault(min, finiteOrDefault(max, min)),\n max: finiteOrDefault(max, finiteOrDefault(min, max))\n };\n }\n\n /**\n\t * Get the padding needed for the scale\n\t * @return {{top: number, left: number, bottom: number, right: number}} the necessary padding\n\t * @private\n\t */\n getPadding() {\n return {\n left: this.paddingLeft || 0,\n top: this.paddingTop || 0,\n right: this.paddingRight || 0,\n bottom: this.paddingBottom || 0\n };\n }\n\n /**\n\t * Returns the scale tick objects\n\t * @return {Tick[]}\n\t * @since 2.7\n\t */\n getTicks() {\n return this.ticks;\n }\n\n /**\n\t * @return {string[]}\n\t */\n getLabels() {\n const data = this.chart.data;\n return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || [];\n }\n\n /**\n * @return {import('../types.js').LabelItem[]}\n */\n getLabelItems(chartArea = this.chart.chartArea) {\n const items = this._labelItems || (this._labelItems = this._computeLabelItems(chartArea));\n return items;\n }\n\n // When a new layout is created, reset the data limits cache\n beforeLayout() {\n this._cache = {};\n this._dataLimitsCached = false;\n }\n\n // These methods are ordered by lifecycle. Utilities then follow.\n // Any function defined here is inherited by all scale types.\n // Any function can be extended by the scale type\n\n beforeUpdate() {\n call(this.options.beforeUpdate, [this]);\n }\n\n /**\n\t * @param {number} maxWidth - the max width in pixels\n\t * @param {number} maxHeight - the max height in pixels\n\t * @param {{top: number, left: number, bottom: number, right: number}} margins - the space between the edge of the other scales and edge of the chart\n\t * This space comes from two sources:\n\t * - padding - space that's required to show the labels at the edges of the scale\n\t * - thickness of scales or legends in another orientation\n\t */\n update(maxWidth, maxHeight, margins) {\n const {beginAtZero, grace, ticks: tickOpts} = this.options;\n const sampleSize = tickOpts.sampleSize;\n\n // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;)\n this.beforeUpdate();\n\n // Absorb the master measurements\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins = Object.assign({\n left: 0,\n right: 0,\n top: 0,\n bottom: 0\n }, margins);\n\n this.ticks = null;\n this._labelSizes = null;\n this._gridLineItems = null;\n this._labelItems = null;\n\n // Dimensions\n this.beforeSetDimensions();\n this.setDimensions();\n this.afterSetDimensions();\n\n this._maxLength = this.isHorizontal()\n ? this.width + margins.left + margins.right\n : this.height + margins.top + margins.bottom;\n\n // Data min/max\n if (!this._dataLimitsCached) {\n this.beforeDataLimits();\n this.determineDataLimits();\n this.afterDataLimits();\n this._range = _addGrace(this, grace, beginAtZero);\n this._dataLimitsCached = true;\n }\n\n this.beforeBuildTicks();\n\n this.ticks = this.buildTicks() || [];\n\n // Allow modification of ticks in callback.\n this.afterBuildTicks();\n\n // Compute tick rotation and fit using a sampled subset of labels\n // We generally don't need to compute the size of every single label for determining scale size\n const samplingEnabled = sampleSize < this.ticks.length;\n this._convertTicksToLabels(samplingEnabled ? sample(this.ticks, sampleSize) : this.ticks);\n\n // configure is called twice, once here, once from core.controller.updateLayout.\n // Here we haven't been positioned yet, but dimensions are correct.\n // Variables set in configure are needed for calculateLabelRotation, and\n // it's ok that coordinates are not correct there, only dimensions matter.\n this.configure();\n\n // Tick Rotation\n this.beforeCalculateLabelRotation();\n this.calculateLabelRotation(); // Preconditions: number of ticks and sizes of largest labels must be calculated beforehand\n this.afterCalculateLabelRotation();\n\n // Auto-skip\n if (tickOpts.display && (tickOpts.autoSkip || tickOpts.source === 'auto')) {\n this.ticks = autoSkip(this, this.ticks);\n this._labelSizes = null;\n this.afterAutoSkip();\n }\n\n if (samplingEnabled) {\n // Generate labels using all non-skipped ticks\n this._convertTicksToLabels(this.ticks);\n }\n\n this.beforeFit();\n this.fit(); // Preconditions: label rotation and label sizes must be calculated beforehand\n this.afterFit();\n\n // IMPORTANT: after this point, we consider that `this.ticks` will NEVER change!\n\n this.afterUpdate();\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n let reversePixels = this.options.reverse;\n let startPixel, endPixel;\n\n if (this.isHorizontal()) {\n startPixel = this.left;\n endPixel = this.right;\n } else {\n startPixel = this.top;\n endPixel = this.bottom;\n // by default vertical scales are from bottom to top, so pixels are reversed\n reversePixels = !reversePixels;\n }\n this._startPixel = startPixel;\n this._endPixel = endPixel;\n this._reversePixels = reversePixels;\n this._length = endPixel - startPixel;\n this._alignToPixels = this.options.alignToPixels;\n }\n\n afterUpdate() {\n call(this.options.afterUpdate, [this]);\n }\n\n //\n\n beforeSetDimensions() {\n call(this.options.beforeSetDimensions, [this]);\n }\n setDimensions() {\n // Set the unconstrained dimension before label rotation\n if (this.isHorizontal()) {\n // Reset position before calculating rotation\n this.width = this.maxWidth;\n this.left = 0;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n\n // Reset position before calculating rotation\n this.top = 0;\n this.bottom = this.height;\n }\n\n // Reset padding\n this.paddingLeft = 0;\n this.paddingTop = 0;\n this.paddingRight = 0;\n this.paddingBottom = 0;\n }\n afterSetDimensions() {\n call(this.options.afterSetDimensions, [this]);\n }\n\n _callHooks(name) {\n this.chart.notifyPlugins(name, this.getContext());\n call(this.options[name], [this]);\n }\n\n // Data limits\n beforeDataLimits() {\n this._callHooks('beforeDataLimits');\n }\n determineDataLimits() {}\n afterDataLimits() {\n this._callHooks('afterDataLimits');\n }\n\n //\n beforeBuildTicks() {\n this._callHooks('beforeBuildTicks');\n }\n /**\n\t * @return {object[]} the ticks\n\t */\n buildTicks() {\n return [];\n }\n afterBuildTicks() {\n this._callHooks('afterBuildTicks');\n }\n\n beforeTickToLabelConversion() {\n call(this.options.beforeTickToLabelConversion, [this]);\n }\n /**\n\t * Convert ticks to label strings\n\t * @param {Tick[]} ticks\n\t */\n generateTickLabels(ticks) {\n const tickOpts = this.options.ticks;\n let i, ilen, tick;\n for (i = 0, ilen = ticks.length; i < ilen; i++) {\n tick = ticks[i];\n tick.label = call(tickOpts.callback, [tick.value, i, ticks], this);\n }\n }\n afterTickToLabelConversion() {\n call(this.options.afterTickToLabelConversion, [this]);\n }\n\n //\n\n beforeCalculateLabelRotation() {\n call(this.options.beforeCalculateLabelRotation, [this]);\n }\n calculateLabelRotation() {\n const options = this.options;\n const tickOpts = options.ticks;\n const numTicks = getTicksLimit(this.ticks.length, options.ticks.maxTicksLimit);\n const minRotation = tickOpts.minRotation || 0;\n const maxRotation = tickOpts.maxRotation;\n let labelRotation = minRotation;\n let tickWidth, maxHeight, maxLabelDiagonal;\n\n if (!this._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !this.isHorizontal()) {\n this.labelRotation = minRotation;\n return;\n }\n\n const labelSizes = this._getLabelSizes();\n const maxLabelWidth = labelSizes.widest.width;\n const maxLabelHeight = labelSizes.highest.height;\n\n // Estimate the width of each grid based on the canvas width, the maximum\n // label width and the number of tick intervals\n const maxWidth = _limitValue(this.chart.width - maxLabelWidth, 0, this.maxWidth);\n tickWidth = options.offset ? this.maxWidth / numTicks : maxWidth / (numTicks - 1);\n\n // Allow 3 pixels x2 padding either side for label readability\n if (maxLabelWidth + 6 > tickWidth) {\n tickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1));\n maxHeight = this.maxHeight - getTickMarkLength(options.grid)\n\t\t\t\t- tickOpts.padding - getTitleHeight(options.title, this.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\n this.labelRotation = labelRotation;\n }\n afterCalculateLabelRotation() {\n call(this.options.afterCalculateLabelRotation, [this]);\n }\n afterAutoSkip() {}\n\n //\n\n beforeFit() {\n call(this.options.beforeFit, [this]);\n }\n fit() {\n // Reset\n const minSize = {\n width: 0,\n height: 0\n };\n\n const {chart, options: {ticks: tickOpts, title: titleOpts, grid: gridOpts}} = this;\n const display = this._isVisible();\n const isHorizontal = this.isHorizontal();\n\n if (display) {\n const titleHeight = getTitleHeight(titleOpts, chart.options.font);\n if (isHorizontal) {\n minSize.width = this.maxWidth;\n minSize.height = getTickMarkLength(gridOpts) + titleHeight;\n } else {\n minSize.height = this.maxHeight; // fill all the height\n minSize.width = getTickMarkLength(gridOpts) + titleHeight;\n }\n\n // Don't bother fitting the ticks if we are not showing the labels\n if (tickOpts.display && this.ticks.length) {\n const {first, last, widest, highest} = this._getLabelSizes();\n const tickPadding = tickOpts.padding * 2;\n const angleRadians = toRadians(this.labelRotation);\n const cos = Math.cos(angleRadians);\n const sin = Math.sin(angleRadians);\n\n if (isHorizontal) {\n // A horizontal axis is more constrained by the height.\n const labelHeight = tickOpts.mirror ? 0 : sin * widest.width + cos * highest.height;\n minSize.height = Math.min(this.maxHeight, minSize.height + labelHeight + tickPadding);\n } else {\n // A vertical axis is more constrained by the width. Labels are the\n // dominant factor here, so get that length first and account for padding\n const labelWidth = tickOpts.mirror ? 0 : cos * widest.width + sin * highest.height;\n\n minSize.width = Math.min(this.maxWidth, minSize.width + labelWidth + tickPadding);\n }\n this._calculatePadding(first, last, sin, cos);\n }\n }\n\n this._handleMargins();\n\n if (isHorizontal) {\n this.width = this._length = chart.width - this._margins.left - this._margins.right;\n this.height = minSize.height;\n } else {\n this.width = minSize.width;\n this.height = this._length = chart.height - this._margins.top - this._margins.bottom;\n }\n }\n\n _calculatePadding(first, last, sin, cos) {\n const {ticks: {align, padding}, position} = this.options;\n const isRotated = this.labelRotation !== 0;\n const labelsBelowTicks = position !== 'top' && this.axis === 'x';\n\n if (this.isHorizontal()) {\n const offsetLeft = this.getPixelForTick(0) - this.left;\n const offsetRight = this.right - this.getPixelForTick(this.ticks.length - 1);\n let paddingLeft = 0;\n let paddingRight = 0;\n\n // Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned\n // which means that the right padding is dominated by the font height\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 if (align !== 'inner') {\n paddingLeft = first.width / 2;\n paddingRight = last.width / 2;\n }\n\n // Adjust padding taking into account changes in offsets\n this.paddingLeft = Math.max((paddingLeft - offsetLeft + padding) * this.width / (this.width - offsetLeft), 0);\n this.paddingRight = Math.max((paddingRight - offsetRight + padding) * this.width / (this.width - offsetRight), 0);\n } else {\n let paddingTop = last.height / 2;\n let paddingBottom = first.height / 2;\n\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\n this.paddingTop = paddingTop + padding;\n this.paddingBottom = paddingBottom + padding;\n }\n }\n\n /**\n\t * Handle margins and padding interactions\n\t * @private\n\t */\n _handleMargins() {\n if (this._margins) {\n this._margins.left = Math.max(this.paddingLeft, this._margins.left);\n this._margins.top = Math.max(this.paddingTop, this._margins.top);\n this._margins.right = Math.max(this.paddingRight, this._margins.right);\n this._margins.bottom = Math.max(this.paddingBottom, this._margins.bottom);\n }\n }\n\n afterFit() {\n call(this.options.afterFit, [this]);\n }\n\n // Shared Methods\n /**\n\t * @return {boolean}\n\t */\n isHorizontal() {\n const {axis, position} = this.options;\n return position === 'top' || position === 'bottom' || axis === 'x';\n }\n /**\n\t * @return {boolean}\n\t */\n isFullSize() {\n return this.options.fullSize;\n }\n\n /**\n\t * @param {Tick[]} ticks\n\t * @private\n\t */\n _convertTicksToLabels(ticks) {\n this.beforeTickToLabelConversion();\n\n this.generateTickLabels(ticks);\n\n // Ticks should be skipped when callback returns null or undef, so lets remove those.\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\n this.afterTickToLabelConversion();\n }\n\n /**\n\t * @return {{ first: object, last: object, widest: object, highest: object, widths: Array, heights: array }}\n\t * @private\n\t */\n _getLabelSizes() {\n let labelSizes = this._labelSizes;\n\n if (!labelSizes) {\n const sampleSize = this.options.ticks.sampleSize;\n let ticks = this.ticks;\n if (sampleSize < ticks.length) {\n ticks = sample(ticks, sampleSize);\n }\n\n this._labelSizes = labelSizes = this._computeLabelSizes(ticks, ticks.length, this.options.ticks.maxTicksLimit);\n }\n\n return labelSizes;\n }\n\n /**\n\t * Returns {width, height, offset} objects for the first, last, widest, highest tick\n\t * labels where offset indicates the anchor point offset from the top in pixels.\n\t * @return {{ first: object, last: object, widest: object, highest: object, widths: Array, heights: array }}\n\t * @private\n\t */\n _computeLabelSizes(ticks, length, maxTicksLimit) {\n const {ctx, _longestTextCache: caches} = this;\n const widths = [];\n const heights = [];\n const increment = Math.floor(length / getTicksLimit(length, maxTicksLimit));\n let widestLabelSize = 0;\n let highestLabelSize = 0;\n let i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel;\n\n for (i = 0; i < length; i += increment) {\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 // Undefined labels and arrays should not be measured\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 // if it is an array let's measure each element\n for (j = 0, jlen = label.length; j < jlen; ++j) {\n nestedLabel = /** @type {string} */ (label[j]);\n // Undefined labels and arrays should not be measured\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\n const widest = widths.indexOf(widestLabelSize);\n const highest = heights.indexOf(highestLabelSize);\n\n const valueAt = (idx) => ({width: widths[idx] || 0, height: heights[idx] || 0});\n\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\n /**\n\t * Used to get the label to display in the tooltip for the given value\n\t * @param {*} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n return value;\n }\n\n /**\n\t * Returns the location of the given data point. Value can either be an index or a numerical value\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {*} value\n\t * @param {number} [index]\n\t * @return {number}\n\t */\n getPixelForValue(value, index) { // eslint-disable-line no-unused-vars\n return NaN;\n }\n\n /**\n\t * Used to get the data value from a given pixel. This is the inverse of getPixelForValue\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} pixel\n\t * @return {*}\n\t */\n getValueForPixel(pixel) {} // eslint-disable-line no-unused-vars\n\n /**\n\t * Returns the location of the tick at the given index\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} index\n\t * @return {number}\n\t */\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\n /**\n\t * Utility for getting the pixel location of a percentage of scale\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @param {number} decimal\n\t * @return {number}\n\t */\n getPixelForDecimal(decimal) {\n if (this._reversePixels) {\n decimal = 1 - decimal;\n }\n\n const pixel = this._startPixel + decimal * this._length;\n return _int16Range(this._alignToPixels ? _alignPixel(this.chart, pixel, 0) : pixel);\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getDecimalForPixel(pixel) {\n const decimal = (pixel - this._startPixel) / this._length;\n return this._reversePixels ? 1 - decimal : decimal;\n }\n\n /**\n\t * Returns the pixel for the minimum chart value\n\t * The coordinate (0, 0) is at the upper-left corner of the canvas\n\t * @return {number}\n\t */\n getBasePixel() {\n return this.getPixelForValue(this.getBaseValue());\n }\n\n /**\n\t * @return {number}\n\t */\n getBaseValue() {\n const {min, max} = this;\n\n return min < 0 && max < 0 ? max :\n min > 0 && max > 0 ? min :\n 0;\n }\n\n /**\n\t * @protected\n\t */\n getContext(index) {\n const ticks = this.ticks || [];\n\n if (index >= 0 && index < ticks.length) {\n const tick = ticks[index];\n return tick.$context ||\n\t\t\t\t(tick.$context = createTickContext(this.getContext(), index, tick));\n }\n return this.$context ||\n\t\t\t(this.$context = createScaleContext(this.chart.getContext(), this));\n }\n\n /**\n\t * @return {number}\n\t * @private\n\t */\n _tickSize() {\n const optionTicks = this.options.ticks;\n\n // Calculate space needed by label in axis direction.\n const rot = toRadians(this.labelRotation);\n const cos = Math.abs(Math.cos(rot));\n const sin = Math.abs(Math.sin(rot));\n\n const labelSizes = this._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\n // Calculate space needed for 1 tick in axis direction.\n return this.isHorizontal()\n ? h * cos > w * sin ? w / cos : h / sin\n : h * sin < w * cos ? h / cos : w / sin;\n }\n\n /**\n\t * @return {boolean}\n\t * @private\n\t */\n _isVisible() {\n const display = this.options.display;\n\n if (display !== 'auto') {\n return !!display;\n }\n\n return this.getMatchingVisibleMetas().length > 0;\n }\n\n /**\n\t * @private\n\t */\n _computeGridLineItems(chartArea) {\n const axis = this.axis;\n const chart = this.chart;\n const options = this.options;\n const {grid, position, border} = options;\n const offset = grid.offset;\n const isHorizontal = this.isHorizontal();\n const ticks = this.ticks;\n const ticksLength = ticks.length + (offset ? 1 : 0);\n const tl = getTickMarkLength(grid);\n const items = [];\n\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = borderOpts.display ? borderOpts.width : 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\n if (position === 'top') {\n borderValue = alignBorderValue(this.bottom);\n ty1 = this.bottom - tl;\n ty2 = borderValue - axisHalfWidth;\n y1 = alignBorderValue(chartArea.top) + axisHalfWidth;\n y2 = chartArea.bottom;\n } else if (position === 'bottom') {\n borderValue = alignBorderValue(this.top);\n y1 = chartArea.top;\n y2 = alignBorderValue(chartArea.bottom) - axisHalfWidth;\n ty1 = borderValue + axisHalfWidth;\n ty2 = this.top + tl;\n } else if (position === 'left') {\n borderValue = alignBorderValue(this.right);\n tx1 = this.right - tl;\n tx2 = borderValue - axisHalfWidth;\n x1 = alignBorderValue(chartArea.left) + axisHalfWidth;\n x2 = chartArea.right;\n } else if (position === 'right') {\n borderValue = alignBorderValue(this.left);\n x1 = chartArea.left;\n x2 = alignBorderValue(chartArea.right) - axisHalfWidth;\n tx1 = borderValue + axisHalfWidth;\n tx2 = this.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(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\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(this.chart.scales[positionAxisID].getPixelForValue(value));\n }\n\n tx1 = borderValue - axisHalfWidth;\n tx2 = tx1 - tl;\n x1 = chartArea.left;\n x2 = chartArea.right;\n }\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 context = this.getContext(i);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n\n const lineWidth = optsAtIndex.lineWidth;\n const lineColor = optsAtIndex.color;\n const borderDash = optsAtIndexBorder.dash || [];\n const borderDashOffset = optsAtIndexBorder.dashOffset;\n\n const tickWidth = optsAtIndex.tickWidth;\n const tickColor = optsAtIndex.tickColor;\n const tickBorderDash = optsAtIndex.tickBorderDash || [];\n const tickBorderDashOffset = optsAtIndex.tickBorderDashOffset;\n\n lineValue = getPixelForGridLine(this, i, offset);\n\n // Skip if the pixel is out of the range\n if (lineValue === undefined) {\n continue;\n }\n\n alignedLineValue = _alignPixel(chart, lineValue, lineWidth);\n\n if (isHorizontal) {\n tx1 = tx2 = x1 = x2 = alignedLineValue;\n } else {\n ty1 = ty2 = y1 = y2 = alignedLineValue;\n }\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\n this._ticksLength = ticksLength;\n this._borderValue = borderValue;\n\n return items;\n }\n\n /**\n\t * @private\n\t */\n _computeLabelItems(chartArea) {\n const axis = this.axis;\n const options = this.options;\n const {position, ticks: optionTicks} = options;\n const isHorizontal = this.isHorizontal();\n const ticks = this.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(this.labelRotation);\n const items = [];\n let i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset;\n let textBaseline = 'middle';\n\n if (position === 'top') {\n y = this.bottom - hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'bottom') {\n y = this.top + hTickAndPadding;\n textAlign = this._getXAxisLabelAlignment();\n } else if (position === 'left') {\n const ret = this._getYAxisLabelAlignment(tl);\n textAlign = ret.textAlign;\n x = ret.x;\n } else if (position === 'right') {\n const ret = this._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 = this.chart.scales[positionAxisID].getPixelForValue(value) + tickAndPadding;\n }\n textAlign = this._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 = this.chart.scales[positionAxisID].getPixelForValue(value);\n }\n textAlign = this._getYAxisLabelAlignment(tl).textAlign;\n }\n\n if (axis === 'y') {\n if (align === 'start') {\n textBaseline = 'top';\n } else if (align === 'end') {\n textBaseline = 'bottom';\n }\n }\n\n const labelSizes = this._getLabelSizes();\n for (i = 0, ilen = ticks.length; i < ilen; ++i) {\n tick = ticks[i];\n label = tick.label;\n\n const optsAtIndex = optionTicks.setContext(this.getContext(i));\n pixel = this.getPixelForTick(i) + optionTicks.labelOffset;\n font = this._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 let tickTextAlign = textAlign;\n\n if (isHorizontal) {\n x = pixel;\n\n if (textAlign === 'inner') {\n if (i === ilen - 1) {\n tickTextAlign = !this.options.reverse ? 'right' : 'left';\n } else if (i === 0) {\n tickTextAlign = !this.options.reverse ? 'left' : 'right';\n } else {\n tickTextAlign = 'center';\n }\n }\n\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 // eslint-disable-next-line no-lonely-if\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 if (rotation !== 0 && !optsAtIndex.showLabelBackdrop) {\n x += (lineHeight / 2) * Math.sin(rotation);\n }\n } else {\n y = pixel;\n textOffset = (1 - lineCount) * lineHeight / 2;\n }\n\n let backdrop;\n\n if (optsAtIndex.showLabelBackdrop) {\n const labelPadding = toPadding(optsAtIndex.backdropPadding);\n const height = labelSizes.heights[i];\n const width = labelSizes.widths[i];\n\n let top = textOffset - labelPadding.top;\n let left = 0 - labelPadding.left;\n\n switch (textBaseline) {\n case 'middle':\n top -= height / 2;\n break;\n case 'bottom':\n top -= height;\n break;\n default:\n break;\n }\n\n switch (textAlign) {\n case 'center':\n left -= width / 2;\n break;\n case 'right':\n left -= width;\n break;\n default:\n break;\n }\n\n backdrop = {\n left,\n top,\n width: width + labelPadding.width,\n height: height + labelPadding.height,\n\n color: optsAtIndex.backdropColor,\n };\n }\n\n items.push({\n label,\n font,\n textOffset,\n options: {\n rotation,\n color,\n strokeColor,\n strokeWidth,\n textAlign: tickTextAlign,\n textBaseline,\n translation: [x, y],\n backdrop,\n }\n });\n }\n\n return items;\n }\n\n _getXAxisLabelAlignment() {\n const {position, ticks} = this.options;\n const rotation = -toRadians(this.labelRotation);\n\n if (rotation) {\n return position === 'top' ? 'left' : 'right';\n }\n\n let align = 'center';\n\n if (ticks.align === 'start') {\n align = 'left';\n } else if (ticks.align === 'end') {\n align = 'right';\n } else if (ticks.align === 'inner') {\n align = 'inner';\n }\n\n return align;\n }\n\n _getYAxisLabelAlignment(tl) {\n const {position, ticks: {crossAlign, mirror, padding}} = this.options;\n const labelSizes = this._getLabelSizes();\n const tickAndPadding = tl + padding;\n const widest = labelSizes.widest.width;\n\n let textAlign;\n let x;\n\n if (position === 'left') {\n if (mirror) {\n x = this.right + padding;\n\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 = this.right - tickAndPadding;\n\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 = this.left;\n }\n }\n } else if (position === 'right') {\n if (mirror) {\n x = this.left + padding;\n\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 = this.left + tickAndPadding;\n\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 = this.right;\n }\n }\n } else {\n textAlign = 'right';\n }\n\n return {textAlign, x};\n }\n\n /**\n\t * @private\n\t */\n _computeLabelArea() {\n if (this.options.ticks.mirror) {\n return;\n }\n\n const chart = this.chart;\n const position = this.options.position;\n\n if (position === 'left' || position === 'right') {\n return {top: 0, left: this.left, bottom: chart.height, right: this.right};\n } if (position === 'top' || position === 'bottom') {\n return {top: this.top, left: 0, bottom: this.bottom, right: chart.width};\n }\n }\n\n /**\n * @protected\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\n getLineWidthForValue(value) {\n const grid = this.options.grid;\n if (!this._isVisible() || !grid.display) {\n return 0;\n }\n const ticks = this.ticks;\n const index = ticks.findIndex(t => t.value === value);\n if (index >= 0) {\n const opts = grid.setContext(this.getContext(index));\n return opts.lineWidth;\n }\n return 0;\n }\n\n /**\n\t * @protected\n\t */\n drawGrid(chartArea) {\n const grid = this.options.grid;\n const ctx = this.ctx;\n const items = this._gridLineItems || (this._gridLineItems = this._computeGridLineItems(chartArea));\n let i, ilen;\n\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\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\n if (grid.display) {\n for (i = 0, ilen = items.length; i < ilen; ++i) {\n const item = items[i];\n\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\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\n /**\n\t * @protected\n\t */\n drawBorder() {\n const {chart, ctx, options: {border, grid}} = this;\n const borderOpts = border.setContext(this.getContext());\n const axisWidth = border.display ? borderOpts.width : 0;\n if (!axisWidth) {\n return;\n }\n const lastLineWidth = grid.setContext(this.getContext(0)).lineWidth;\n const borderValue = this._borderValue;\n let x1, x2, y1, y2;\n\n if (this.isHorizontal()) {\n x1 = _alignPixel(chart, this.left, axisWidth) - axisWidth / 2;\n x2 = _alignPixel(chart, this.right, lastLineWidth) + lastLineWidth / 2;\n y1 = y2 = borderValue;\n } else {\n y1 = _alignPixel(chart, this.top, axisWidth) - axisWidth / 2;\n y2 = _alignPixel(chart, this.bottom, lastLineWidth) + lastLineWidth / 2;\n x1 = x2 = borderValue;\n }\n ctx.save();\n ctx.lineWidth = borderOpts.width;\n ctx.strokeStyle = borderOpts.color;\n\n ctx.beginPath();\n ctx.moveTo(x1, y1);\n ctx.lineTo(x2, y2);\n ctx.stroke();\n\n ctx.restore();\n }\n\n /**\n\t * @protected\n\t */\n drawLabels(chartArea) {\n const optionTicks = this.options.ticks;\n\n if (!optionTicks.display) {\n return;\n }\n\n const ctx = this.ctx;\n\n const area = this._computeLabelArea();\n if (area) {\n clipArea(ctx, area);\n }\n\n const items = this.getLabelItems(chartArea);\n for (const item of items) {\n const renderTextOptions = item.options;\n const tickFont = item.font;\n const label = item.label;\n const y = item.textOffset;\n renderText(ctx, label, 0, y, tickFont, renderTextOptions);\n }\n\n if (area) {\n unclipArea(ctx);\n }\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {\n const {ctx, options: {position, title, reverse}} = this;\n\n if (!title.display) {\n return;\n }\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\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\n const {titleX, titleY, maxWidth, rotation} = titleArgs(this, offset, position, align);\n\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\n draw(chartArea) {\n if (!this._isVisible()) {\n return;\n }\n\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawBorder();\n this.drawTitle();\n this.drawLabels(chartArea);\n }\n\n /**\n\t * @return {object[]}\n\t * @private\n\t */\n _layers() {\n const opts = this.options;\n const tz = opts.ticks && opts.ticks.z || 0;\n const gz = valueOrDefault(opts.grid && opts.grid.z, -1);\n const bz = valueOrDefault(opts.border && opts.border.z, 0);\n\n if (!this._isVisible() || this.draw !== Scale.prototype.draw) {\n // backward compatibility: draw has been overridden by custom scale\n return [{\n z: tz,\n draw: (chartArea) => {\n this.draw(chartArea);\n }\n }];\n }\n\n return [{\n z: gz,\n draw: (chartArea) => {\n this.drawBackground();\n this.drawGrid(chartArea);\n this.drawTitle();\n }\n }, {\n z: bz,\n draw: () => {\n this.drawBorder();\n }\n }, {\n z: tz,\n draw: (chartArea) => {\n this.drawLabels(chartArea);\n }\n }];\n }\n\n /**\n\t * Returns visible dataset metas that are attached to this scale\n\t * @param {string} [type] - if specified, also filter by dataset type\n\t * @return {object[]}\n\t */\n getMatchingVisibleMetas(type) {\n const metas = this.chart.getSortedVisibleDatasetMetas();\n const axisID = this.axis + 'AxisID';\n const result = [];\n let i, ilen;\n\n for (i = 0, ilen = metas.length; i < ilen; ++i) {\n const meta = metas[i];\n if (meta[axisID] === this.id && (!type || meta.type === type)) {\n result.push(meta);\n }\n }\n return result;\n }\n\n /**\n\t * @param {number} index\n\t * @return {object}\n\t * @protected\n \t */\n _resolveTickFontOptions(index) {\n const opts = this.options.ticks.setContext(this.getContext(index));\n return toFont(opts.font);\n }\n\n /**\n * @protected\n */\n _maxDigits() {\n const fontSize = this._resolveTickFontOptions(0).lineHeight;\n return (this.isHorizontal() ? this.width : this.height) / fontSize;\n }\n}\n","import {merge} from '../helpers/index.js';\nimport defaults, {overrides} from './core.defaults.js';\n\n/**\n * @typedef {{id: string, defaults: any, overrides?: any, defaultRoutes: any}} IChartComponent\n */\n\nexport default class 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\n isForType(type) {\n return Object.prototype.isPrototypeOf.call(this.type.prototype, type.prototype);\n }\n\n /**\n\t * @param {IChartComponent} item\n\t * @returns {string} The scope where items defaults were registered to.\n\t */\n register(item) {\n const proto = Object.getPrototypeOf(item);\n let parentScope;\n\n if (isIChartComponent(proto)) {\n // Make sure the parent is registered and note the scope where its defaults are.\n parentScope = this.register(proto);\n }\n\n const items = this.items;\n const id = item.id;\n const scope = this.scope + '.' + id;\n\n if (!id) {\n throw new Error('class does not have id: ' + item);\n }\n\n if (id in items) {\n // already registered\n return scope;\n }\n\n items[id] = item;\n registerDefaults(item, scope, parentScope);\n if (this.override) {\n defaults.override(item.id, item.overrides);\n }\n\n return scope;\n }\n\n /**\n\t * @param {string} id\n\t * @returns {object?}\n\t */\n get(id) {\n return this.items[id];\n }\n\n /**\n\t * @param {IChartComponent} item\n\t */\n unregister(item) {\n const items = this.items;\n const id = item.id;\n const scope = this.scope;\n\n if (id in items) {\n delete items[id];\n }\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}\n\nfunction registerDefaults(item, scope, parentScope) {\n // Inherit the parent's defaults and keep existing defaults\n const itemDefaults = merge(Object.create(null), [\n parentScope ? defaults.get(parentScope) : {},\n defaults.get(scope),\n item.defaults\n ]);\n\n defaults.set(scope, itemDefaults);\n\n if (item.defaultRoutes) {\n routeDefaults(scope, item.defaultRoutes);\n }\n\n if (item.descriptors) {\n defaults.describe(scope, item.descriptors);\n }\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}\n\nfunction isIChartComponent(proto) {\n return 'id' in proto && 'defaults' in proto;\n}\n","import DatasetController from './core.datasetController.js';\nimport Element from './core.element.js';\nimport Scale from './core.scale.js';\nimport TypedRegistry from './core.typedRegistry.js';\nimport {each, callback as call, _capitalize} from '../helpers/helpers.core.js';\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is exported for typedoc\n */\nexport class 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 // Order is important, Scale has Element in prototype chain,\n // so Scales must be before Elements. Plugins are a fallback, so not listed here.\n this._typedRegistries = [this.controllers, this.scales, this.elements];\n }\n\n /**\n\t * @param {...any} args\n\t */\n add(...args) {\n this._each('register', args);\n }\n\n remove(...args) {\n this._each('unregister', args);\n }\n\n /**\n\t * @param {...typeof DatasetController} args\n\t */\n addControllers(...args) {\n this._each('register', args, this.controllers);\n }\n\n /**\n\t * @param {...typeof Element} args\n\t */\n addElements(...args) {\n this._each('register', args, this.elements);\n }\n\n /**\n\t * @param {...any} args\n\t */\n addPlugins(...args) {\n this._each('register', args, this.plugins);\n }\n\n /**\n\t * @param {...typeof Scale} args\n\t */\n addScales(...args) {\n this._each('register', args, this.scales);\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof DatasetController}\n\t */\n getController(id) {\n return this._get(id, this.controllers, 'controller');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof Element}\n\t */\n getElement(id) {\n return this._get(id, this.elements, 'element');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {object}\n\t */\n getPlugin(id) {\n return this._get(id, this.plugins, 'plugin');\n }\n\n /**\n\t * @param {string} id\n\t * @returns {typeof Scale}\n\t */\n getScale(id) {\n return this._get(id, this.scales, 'scale');\n }\n\n /**\n\t * @param {...typeof DatasetController} args\n\t */\n removeControllers(...args) {\n this._each('unregister', args, this.controllers);\n }\n\n /**\n\t * @param {...typeof Element} args\n\t */\n removeElements(...args) {\n this._each('unregister', args, this.elements);\n }\n\n /**\n\t * @param {...any} args\n\t */\n removePlugins(...args) {\n this._each('unregister', args, this.plugins);\n }\n\n /**\n\t * @param {...typeof Scale} args\n\t */\n removeScales(...args) {\n this._each('unregister', args, this.scales);\n }\n\n /**\n\t * @private\n\t */\n _each(method, args, typedRegistry) {\n [...args].forEach(arg => {\n const reg = typedRegistry || this._getRegistryForType(arg);\n if (typedRegistry || reg.isForType(arg) || (reg === this.plugins && arg.id)) {\n this._exec(method, reg, arg);\n } else {\n // Handle loopable args\n // Use case:\n // import * as plugins from './plugins.js';\n // Chart.register(plugins);\n each(arg, item => {\n // If there are mixed types in the loopable, make sure those are\n // registered in correct registry\n // Use case: (treemap exporting controller, elements etc)\n // import * as treemap from 'chartjs-chart-treemap.js';\n // Chart.register(treemap);\n\n const itemReg = typedRegistry || this._getRegistryForType(item);\n this._exec(method, itemReg, item);\n });\n }\n });\n }\n\n /**\n\t * @private\n\t */\n _exec(method, registry, component) {\n const camelMethod = _capitalize(method);\n call(component['before' + camelMethod], [], component); // beforeRegister / beforeUnregister\n registry[method](component);\n call(component['after' + camelMethod], [], component); // afterRegister / afterUnregister\n }\n\n /**\n\t * @private\n\t */\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 // plugins is the fallback registry\n return this.plugins;\n }\n\n /**\n\t * @private\n\t */\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\n}\n\n// singleton instance\nexport default /* #__PURE__ */ new Registry();\n","import registry from './core.registry.js';\nimport {callback as callCallback, isNullOrUndef, valueOrDefault} from '../helpers/helpers.core.js';\n\n/**\n * @typedef { import('./core.controller.js').default } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../plugins/plugin.tooltip.js').default } Tooltip\n */\n\n/**\n * @callback filterCallback\n * @param {{plugin: object, options: object}} value\n * @param {number} [index]\n * @param {array} [array]\n * @param {object} [thisArg]\n * @return {boolean}\n */\n\n\nexport default class PluginService {\n constructor() {\n this._init = [];\n }\n\n /**\n\t * Calls enabled plugins for `chart` on the specified hook and with the given args.\n\t * This method immediately returns as soon as a plugin explicitly returns false. The\n\t * returned value can be used, for instance, to interrupt the current action.\n\t * @param {Chart} chart - The chart instance for which plugins should be called.\n\t * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n\t * @param {object} [args] - Extra arguments to apply to the hook call.\n * @param {filterCallback} [filter] - Filtering function for limiting which plugins are notified\n\t * @returns {boolean} false if any of the plugins return false, else returns true.\n\t */\n notify(chart, hook, args, filter) {\n if (hook === 'beforeInit') {\n this._init = this._createDescriptors(chart, true);\n this._notify(this._init, chart, 'install');\n }\n\n const descriptors = filter ? this._descriptors(chart).filter(filter) : this._descriptors(chart);\n const result = this._notify(descriptors, chart, hook, args);\n\n if (hook === 'afterDestroy') {\n this._notify(descriptors, chart, 'stop');\n this._notify(this._init, chart, 'uninstall');\n }\n return result;\n }\n\n /**\n\t * @private\n\t */\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 (callCallback(method, params, plugin) === false && args.cancelable) {\n return false;\n }\n }\n\n return true;\n }\n\n invalidate() {\n // When plugins are registered, there is the possibility of a double\n // invalidate situation. In this case, we only want to invalidate once.\n // If we invalidate multiple times, the `_oldCache` is lost and all of the\n // plugins are restarted without being correctly stopped.\n // See https://github.com/chartjs/Chart.js/issues/8147\n if (!isNullOrUndef(this._cache)) {\n this._oldCache = this._cache;\n this._cache = undefined;\n }\n }\n\n /**\n\t * @param {Chart} chart\n\t * @private\n\t */\n _descriptors(chart) {\n if (this._cache) {\n return this._cache;\n }\n\n const descriptors = this._cache = this._createDescriptors(chart);\n\n this._notifyStateChanges(chart);\n\n return descriptors;\n }\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 // options === false => all plugins are disabled\n return options === false && !all ? [] : createDescriptors(chart, plugins, options, all);\n }\n\n /**\n\t * @param {Chart} chart\n\t * @private\n\t */\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}\n\n/**\n * @param {import('./core.config.js').default} config\n */\nfunction allPlugins(config) {\n const localIds = {};\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\n const local = config.plugins || [];\n for (let i = 0; i < local.length; i++) {\n const plugin = local[i];\n\n if (plugins.indexOf(plugin) === -1) {\n plugins.push(plugin);\n localIds[plugin.id] = true;\n }\n }\n\n return {plugins, localIds};\n}\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}\n\nfunction createDescriptors(chart, {plugins, localIds}, options, all) {\n const result = [];\n const context = chart.getContext();\n\n for (const plugin of plugins) {\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, local: localIds[id]}, opts, context)\n });\n }\n\n return result;\n}\n\nfunction pluginOpts(config, {plugin, local}, opts, context) {\n const keys = config.pluginScopeKeys(plugin);\n const scopes = config.getOptionScopes(opts, keys);\n if (local && plugin.defaults) {\n // make sure plugin defaults are in scopes for local (not registered) plugins\n scopes.push(plugin.defaults);\n }\n return config.createResolver(scopes, context, [''], {\n // These are just defaults that plugins can override\n scriptable: false,\n indexable: false,\n allKeys: true\n });\n}\n","import defaults, {overrides, descriptors} from './core.defaults.js';\nimport {mergeIf, resolveObjectKey, isArray, isFunction, valueOrDefault, isObject} from '../helpers/helpers.core.js';\nimport {_attachContext, _createResolver, _descriptors} from '../helpers/helpers.config.js';\n\nexport function 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}\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}\n\nfunction getDefaultScaleIDFromAxis(axis, indexAxis) {\n return axis === indexAxis ? '_index_' : '_value_';\n}\n\nfunction idMatchesAxis(id) {\n if (id === 'x' || id === 'y' || id === 'r') {\n return id;\n }\n}\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}\n\nexport function determineAxis(id, ...scaleOptions) {\n if (idMatchesAxis(id)) {\n return id;\n }\n for (const opts of scaleOptions) {\n const axis = opts.axis\n || axisFromPosition(opts.position)\n || id.length > 1 && idMatchesAxis(id[0].toLowerCase());\n if (axis) {\n return axis;\n }\n }\n throw new Error(`Cannot determine type of '${id}' axis. Please provide 'axis' or 'position' option.`);\n}\n\nfunction getAxisFromDataset(id, axis, dataset) {\n if (dataset[axis + 'AxisID'] === id) {\n return {axis};\n }\n}\n\nfunction retrieveAxisFromDatasets(id, config) {\n if (config.data && config.data.datasets) {\n const boundDs = config.data.datasets.filter((d) => d.xAxisID === id || d.yAxisID === id);\n if (boundDs.length) {\n return getAxisFromDataset(id, 'x', boundDs[0]) || getAxisFromDataset(id, 'y', boundDs[0]);\n }\n }\n return {};\n}\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 scales = Object.create(null);\n\n // First figure out first scale id's per axis.\n Object.keys(configScales).forEach(id => {\n const scaleConf = configScales[id];\n if (!isObject(scaleConf)) {\n return console.error(`Invalid scale configuration for scale: ${id}`);\n }\n if (scaleConf._proxy) {\n return console.warn(`Ignoring resolver passed as options for scale: ${id}`);\n }\n const axis = determineAxis(id, scaleConf, retrieveAxisFromDatasets(id, config), defaults.scales[scaleConf.type]);\n const defaultId = getDefaultScaleIDFromAxis(axis, chartIndexAxis);\n const defaultScaleOptions = chartDefaults.scales || {};\n scales[id] = mergeIf(Object.create(null), [{axis}, scaleConf, defaultScaleOptions[axis], defaultScaleOptions[defaultId]]);\n });\n\n // Then merge dataset defaults to scale configs\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'] || axis;\n scales[id] = scales[id] || Object.create(null);\n mergeIf(scales[id], [{axis}, configScales[id], defaultScaleOptions[defaultID]]);\n });\n });\n\n // apply scale defaults, if not overridden by dataset defaults\n Object.keys(scales).forEach(key => {\n const scale = scales[key];\n mergeIf(scale, [defaults.scales[scale.type], defaults.scale]);\n });\n\n return scales;\n}\n\nfunction initOptions(config) {\n const options = config.options || (config.options = {});\n\n options.plugins = valueOrDefault(options.plugins, {});\n options.scales = mergeScaleConfig(config, options);\n}\n\nfunction initData(data) {\n data = data || {};\n data.datasets = data.datasets || [];\n data.labels = data.labels || [];\n return data;\n}\n\nfunction initConfig(config) {\n config = config || {};\n config.data = initData(config.data);\n\n initOptions(config);\n\n return config;\n}\n\nconst keyCache = new Map();\nconst keysCached = new Set();\n\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}\n\nconst addIfFound = (set, obj, key) => {\n const opts = resolveObjectKey(obj, key);\n if (opts !== undefined) {\n set.add(opts);\n }\n};\n\nexport default class Config {\n constructor(config) {\n this._config = initConfig(config);\n this._scopeCache = new Map();\n this._resolverCache = new Map();\n }\n\n get platform() {\n return this._config.platform;\n }\n\n get type() {\n return this._config.type;\n }\n\n set type(type) {\n this._config.type = type;\n }\n\n get data() {\n return this._config.data;\n }\n\n set data(data) {\n this._config.data = initData(data);\n }\n\n get options() {\n return this._config.options;\n }\n\n set options(options) {\n this._config.options = options;\n }\n\n get plugins() {\n return this._config.plugins;\n }\n\n update() {\n const config = this._config;\n this.clearCache();\n initOptions(config);\n }\n\n clearCache() {\n this._scopeCache.clear();\n this._resolverCache.clear();\n }\n\n /**\n * Returns the option scope keys for resolving dataset options.\n * These keys do not include the dataset itself, because it is not under options.\n * @param {string} datasetType\n * @return {string[][]}\n */\n datasetScopeKeys(datasetType) {\n return cachedKeys(datasetType,\n () => [[\n `datasets.${datasetType}`,\n ''\n ]]);\n }\n\n /**\n * Returns the option scope keys for resolving dataset animation options.\n * These keys do not include the dataset itself, because it is not under options.\n * @param {string} datasetType\n * @param {string} transition\n * @return {string[][]}\n */\n datasetAnimationScopeKeys(datasetType, transition) {\n return cachedKeys(`${datasetType}.transition.${transition}`,\n () => [\n [\n `datasets.${datasetType}.transitions.${transition}`,\n `transitions.${transition}`,\n ],\n // The following are used for looking up the `animations` and `animation` keys\n [\n `datasets.${datasetType}`,\n ''\n ]\n ]);\n }\n\n /**\n * Returns the options scope keys for resolving element options that belong\n * to an dataset. These keys do not include the dataset itself, because it\n * is not under options.\n * @param {string} datasetType\n * @param {string} elementType\n * @return {string[][]}\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\n /**\n * Returns the options scope keys for resolving plugin options.\n * @param {{id: string, additionalOptionScopes?: string[]}} plugin\n * @return {string[][]}\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\n /**\n * @private\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\n /**\n * Resolves the objects from options and defaults for option value resolution.\n * @param {object} mainScope - The main scope object for options\n * @param {string[][]} keyLists - The arrays of keys in resolution order\n * @param {boolean} [resetCache] - reset the cache for this mainScope\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\n const scopes = new Set();\n\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\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\n /**\n * Returns the option scopes for resolving chart options\n * @return {object[]}\n */\n chartOptionScopes() {\n const {options, type} = this;\n\n return [\n options,\n overrides[type] || {},\n defaults.datasets[type] || {}, // https://github.com/chartjs/Chart.js/issues/8531\n {type},\n defaults,\n descriptors\n ];\n }\n\n /**\n * @param {object[]} scopes\n * @param {string[]} names\n * @param {function|object} context\n * @param {string[]} [prefixes]\n * @return {object}\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 // subResolver is passed to scriptable options. It should not resolve to hover options.\n const subResolver = this.createResolver(scopes, context, subPrefixes);\n options = _attachContext(resolver, context, subResolver);\n }\n\n for (const prop of names) {\n result[prop] = options[prop];\n }\n return result;\n }\n\n /**\n * @param {object[]} scopes\n * @param {object} [context]\n * @param {string[]} [prefixes]\n * @param {{scriptable: boolean, indexable: boolean, allKeys?: boolean}} [descriptorDefaults]\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}\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}\n\nconst hasFunction = value => isObject(value)\n && Object.getOwnPropertyNames(value).reduce((acc, key) => acc || isFunction(value[key]), false);\n\nfunction needContext(proxy, names) {\n const {isScriptable, isIndexable} = _descriptors(proxy);\n\n for (const prop of names) {\n const scriptable = isScriptable(prop);\n const indexable = isIndexable(prop);\n const value = (indexable || scriptable) && proxy[prop];\n if ((scriptable && (isFunction(value) || hasFunction(value)))\n || (indexable && isArray(value))) {\n return true;\n }\n }\n return false;\n}\n","import animator from './core.animator.js';\nimport defaults, {overrides} from './core.defaults.js';\nimport Interaction from './core.interaction.js';\nimport layouts from './core.layouts.js';\nimport {_detectPlatform} from '../platform/index.js';\nimport PluginService from './core.plugins.js';\nimport registry from './core.registry.js';\nimport Config, {determineAxis, getIndexAxis} from './core.config.js';\nimport {retinaScale, _isDomSupported} from '../helpers/helpers.dom.js';\nimport {each, callback as callCallback, uid, valueOrDefault, _elementsEqual, isNullOrUndef, setsEqual, defined, isFunction, _isClickEvent} from '../helpers/helpers.core.js';\nimport {clearCanvas, clipArea, createContext, unclipArea, _isPointInArea} from '../helpers/index.js';\n// @ts-ignore\nimport {version} from '../../package.json';\nimport {debounce} from '../helpers/helpers.extras.js';\n\n/**\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../types/index.js').Point } Point\n */\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}\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}\n\nfunction onAnimationsComplete(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n\n chart.notifyPlugins('afterRender');\n callCallback(animationOptions && animationOptions.onComplete, [context], chart);\n}\n\nfunction onAnimationProgress(context) {\n const chart = context.chart;\n const animationOptions = chart.options.animation;\n callCallback(animationOptions && animationOptions.onProgress, [context], chart);\n}\n\n/**\n * Chart.js can take a string id of a canvas element, a 2d context, or a canvas element itself.\n * Attempt to unwrap the item passed into the chart constructor so that it is a canvas element (if possible).\n */\nfunction getCanvas(item) {\n if (_isDomSupported() && typeof item === 'string') {\n item = document.getElementById(item);\n } else if (item && item.length) {\n // Support for array based queries (such as jQuery)\n item = item[0];\n }\n\n if (item && item.canvas) {\n // Support for any object associated to a canvas (including a context2d)\n item = item.canvas;\n }\n return item;\n}\n\nconst instances = {};\nconst getChart = (key) => {\n const canvas = getCanvas(key);\n return Object.values(instances).filter((c) => c.canvas === canvas).pop();\n};\n\nfunction moveNumericKeys(obj, start, move) {\n const keys = Object.keys(obj);\n for (const key of keys) {\n const intKey = +key;\n if (intKey >= start) {\n const value = obj[key];\n delete obj[key];\n if (move > 0 || intKey > start) {\n obj[intKey + move] = value;\n }\n }\n }\n}\n\n/**\n * @param {ChartEvent} e\n * @param {ChartEvent|null} lastEvent\n * @param {boolean} inChartArea\n * @param {boolean} isClick\n * @returns {ChartEvent|null}\n */\nfunction determineLastEvent(e, lastEvent, inChartArea, isClick) {\n if (!inChartArea || e.type === 'mouseout') {\n return null;\n }\n if (isClick) {\n return lastEvent;\n }\n return e;\n}\n\nfunction getSizeForArea(scale, chartArea, field) {\n return scale.options.clip ? scale[field] : chartArea[field];\n}\n\nfunction getDatasetArea(meta, chartArea) {\n const {xScale, yScale} = meta;\n if (xScale && yScale) {\n return {\n left: getSizeForArea(xScale, chartArea, 'left'),\n right: getSizeForArea(xScale, chartArea, 'right'),\n top: getSizeForArea(yScale, chartArea, 'top'),\n bottom: getSizeForArea(yScale, chartArea, 'bottom')\n };\n }\n return chartArea;\n}\n\nclass Chart {\n\n static defaults = defaults;\n static instances = instances;\n static overrides = overrides;\n static registry = registry;\n static version = version;\n static getChart = getChart;\n\n static register(...items) {\n registry.add(...items);\n invalidatePlugins();\n }\n\n static unregister(...items) {\n registry.remove(...items);\n invalidatePlugins();\n }\n\n // eslint-disable-next-line max-statements\n constructor(item, userConfig) {\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 with ID \\'' + existingChart.canvas.id + '\\' can be reused.'\n );\n }\n\n const options = config.createResolver(config.chartOptionScopes(), this.getContext());\n\n this.platform = new (config.platform || _detectPlatform(initialCanvas))();\n this.platform.updateConfig(config);\n\n const context = this.platform.acquireContext(initialCanvas, options.aspectRatio);\n const canvas = context && context.canvas;\n const height = canvas && canvas.height;\n const width = canvas && canvas.width;\n\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 // Store the previously used aspect ratio to determine if a resize\n // is needed during updates. Do this after _options is set since\n // aspectRatio uses a getter\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 /** @type {?{attach?: function, detach?: function, resize?: function}} */\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(mode => this.update(mode), options.resizeDelay || 0);\n this._dataChanges = [];\n\n // Add the chart instance to the global namespace\n instances[this.id] = this;\n\n if (!context || !canvas) {\n // The given item is not a compatible context2d element, let's return before finalizing\n // the chart initialization but after setting basic chart / controller properties that\n // can help to figure out that the chart is not valid (e.g chart.canvas !== null);\n // https://github.com/chartjs/Chart.js/issues/2807\n console.error(\"Failed to create chart: can't acquire context from the given item\");\n return;\n }\n\n animator.listen(this, 'complete', onAnimationsComplete);\n animator.listen(this, 'progress', onAnimationProgress);\n\n this._initialize();\n if (this.attached) {\n this.update();\n }\n }\n\n get aspectRatio() {\n const {options: {aspectRatio, maintainAspectRatio}, width, height, _aspectRatio} = this;\n if (!isNullOrUndef(aspectRatio)) {\n // If aspectRatio is defined in options, use that.\n return aspectRatio;\n }\n\n if (maintainAspectRatio && _aspectRatio) {\n // If maintainAspectRatio is truthly and we had previously determined _aspectRatio, use that\n return _aspectRatio;\n }\n\n // Calculate\n return height ? width / height : null;\n }\n\n get data() {\n return this.config.data;\n }\n\n set data(data) {\n this.config.data = data;\n }\n\n get options() {\n return this._options;\n }\n\n set options(options) {\n this.config.options = options;\n }\n\n get registry() {\n return registry;\n }\n\n /**\n\t * @private\n\t */\n _initialize() {\n // Before init plugin notification\n this.notifyPlugins('beforeInit');\n\n if (this.options.responsive) {\n this.resize();\n } else {\n retinaScale(this, this.options.devicePixelRatio);\n }\n\n this.bindEvents();\n\n // After init plugin notification\n this.notifyPlugins('afterInit');\n\n return this;\n }\n\n clear() {\n clearCanvas(this.canvas, this.ctx);\n return this;\n }\n\n stop() {\n animator.stop(this);\n return this;\n }\n\n /**\n\t * Resize the chart to its container or to explicit dimensions.\n\t * @param {number} [width]\n\t * @param {number} [height]\n\t */\n resize(width, height) {\n if (!animator.running(this)) {\n this._resize(width, height);\n } else {\n this._resizeBeforeDraw = {width, height};\n }\n }\n\n _resize(width, height) {\n const options = this.options;\n const canvas = this.canvas;\n const aspectRatio = options.maintainAspectRatio && this.aspectRatio;\n const newSize = this.platform.getMaximumSize(canvas, width, height, aspectRatio);\n const newRatio = options.devicePixelRatio || this.platform.getDevicePixelRatio();\n const mode = this.width ? 'resize' : 'attach';\n\n this.width = newSize.width;\n this.height = newSize.height;\n this._aspectRatio = this.aspectRatio;\n if (!retinaScale(this, newRatio, true)) {\n return;\n }\n\n this.notifyPlugins('resize', {size: newSize});\n\n callCallback(options.onResize, [this, newSize], this);\n\n if (this.attached) {\n if (this._doResize(mode)) {\n // The resize update is delayed, only draw without updating.\n this.render();\n }\n }\n }\n\n ensureScalesHaveIDs() {\n const options = this.options;\n const scalesOptions = options.scales || {};\n\n each(scalesOptions, (axisOptions, axisID) => {\n axisOptions.id = axisID;\n });\n }\n\n /**\n\t * Builds a map of scale ID to scale object for future lookup.\n\t */\n buildOrUpdateScales() {\n const options = this.options;\n const scaleOpts = options.scales;\n const scales = this.scales;\n const updated = Object.keys(scales).reduce((obj, id) => {\n obj[id] = false;\n return obj;\n }, {});\n let items = [];\n\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\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\n if (scaleOptions.position === undefined || positionIsHorizontal(scaleOptions.position, axis) !== positionIsHorizontal(item.dposition)) {\n scaleOptions.position = item.dposition;\n }\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: this.ctx,\n chart: this\n });\n scales[scale.id] = scale;\n }\n\n scale.init(scaleOptions, options);\n });\n // clear up discarded scales\n each(updated, (hasUpdated, id) => {\n if (!hasUpdated) {\n delete scales[id];\n }\n });\n\n each(scales, (scale) => {\n layouts.configure(this, scale, scale.options);\n layouts.addBox(this, scale);\n });\n }\n\n /**\n\t * @private\n\t */\n _updateMetasets() {\n const metasets = this._metasets;\n const numData = this.data.datasets.length;\n const numMeta = metasets.length;\n\n metasets.sort((a, b) => a.index - b.index);\n if (numMeta > numData) {\n for (let i = numData; i < numMeta; ++i) {\n this._destroyDatasetMeta(i);\n }\n metasets.splice(numData, numMeta - numData);\n }\n this._sortedMetasets = metasets.slice(0).sort(compare2Level('order', 'index'));\n }\n\n /**\n\t * @private\n\t */\n _removeUnreferencedMetasets() {\n const {_metasets: metasets, data: {datasets}} = this;\n if (metasets.length > datasets.length) {\n delete this._stacks;\n }\n metasets.forEach((meta, index) => {\n if (datasets.filter(x => x === meta._dataset).length === 0) {\n this._destroyDatasetMeta(index);\n }\n });\n }\n\n buildOrUpdateControllers() {\n const newControllers = [];\n const datasets = this.data.datasets;\n let i, ilen;\n\n this._removeUnreferencedMetasets();\n\n for (i = 0, ilen = datasets.length; i < ilen; i++) {\n const dataset = datasets[i];\n let meta = this.getDatasetMeta(i);\n const type = dataset.type || this.config.type;\n\n if (meta.type && meta.type !== type) {\n this._destroyDatasetMeta(i);\n meta = this.getDatasetMeta(i);\n }\n meta.type = type;\n meta.indexAxis = dataset.indexAxis || getIndexAxis(type, this.options);\n meta.order = dataset.order || 0;\n meta.index = i;\n meta.label = '' + dataset.label;\n meta.visible = this.isDatasetVisible(i);\n\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, {\n dataElementType: registry.getElement(dataElementType),\n datasetElementType: datasetElementType && registry.getElement(datasetElementType)\n });\n meta.controller = new ControllerClass(this, i);\n newControllers.push(meta.controller);\n }\n }\n\n this._updateMetasets();\n return newControllers;\n }\n\n /**\n\t * Reset the elements of all datasets\n\t * @private\n\t */\n _resetElements() {\n each(this.data.datasets, (dataset, datasetIndex) => {\n this.getDatasetMeta(datasetIndex).controller.reset();\n }, this);\n }\n\n /**\n\t* Resets the chart back to its state before the initial animation\n\t*/\n reset() {\n this._resetElements();\n this.notifyPlugins('reset');\n }\n\n update(mode) {\n const config = this.config;\n\n config.update();\n const options = this._options = config.createResolver(config.chartOptionScopes(), this.getContext());\n const animsDisabled = this._animationsDisabled = !options.animation;\n\n this._updateScales();\n this._checkEventBindings();\n this._updateHiddenIndices();\n\n // plugins options references might have change, let's invalidate the cache\n // https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167\n this._plugins.invalidate();\n\n if (this.notifyPlugins('beforeUpdate', {mode, cancelable: true}) === false) {\n return;\n }\n\n // Make sure dataset controllers are updated and new controllers are reset\n const newControllers = this.buildOrUpdateControllers();\n\n this.notifyPlugins('beforeElementsUpdate');\n\n // Make sure all dataset controllers have correct meta data counts\n let minPadding = 0;\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; i++) {\n const {controller} = this.getDatasetMeta(i);\n const reset = !animsDisabled && newControllers.indexOf(controller) === -1;\n // New controllers will be reset after the layout pass, so we only want to modify\n // elements added to new datasets\n controller.buildOrUpdateElements(reset);\n minPadding = Math.max(+controller.getMaxOverflow(), minPadding);\n }\n minPadding = this._minPadding = options.layout.autoPadding ? minPadding : 0;\n this._updateLayout(minPadding);\n\n // Only reset the controllers if we have animations\n if (!animsDisabled) {\n // Can only reset the new controllers after the scales have been updated\n // Reset is done to get the starting point for the initial animation\n each(newControllers, (controller) => {\n controller.reset();\n });\n }\n\n this._updateDatasets(mode);\n\n // Do this before render so that any plugins that need final scale updates can use it\n this.notifyPlugins('afterUpdate', {mode});\n\n this._layers.sort(compare2Level('z', '_idx'));\n\n // Replay last event from before update, or set hover styles on active elements\n const {_active, _lastEvent} = this;\n if (_lastEvent) {\n this._eventHandler(_lastEvent, true);\n } else if (_active.length) {\n this._updateHoverStyles(_active, _active, true);\n }\n\n this.render();\n }\n\n /**\n * @private\n */\n _updateScales() {\n each(this.scales, (scale) => {\n layouts.removeBox(this, scale);\n });\n\n this.ensureScalesHaveIDs();\n this.buildOrUpdateScales();\n }\n\n /**\n * @private\n */\n _checkEventBindings() {\n const options = this.options;\n const existingEvents = new Set(Object.keys(this._listeners));\n const newEvents = new Set(options.events);\n\n if (!setsEqual(existingEvents, newEvents) || !!this._responsiveListeners !== options.responsive) {\n // The configured events have changed. Rebind.\n this.unbindEvents();\n this.bindEvents();\n }\n }\n\n /**\n * @private\n */\n _updateHiddenIndices() {\n const {_hiddenIndices} = this;\n const changes = this._getUniformDataChanges() || [];\n for (const {method, start, count} of changes) {\n const move = method === '_removeElements' ? -count : count;\n moveNumericKeys(_hiddenIndices, start, move);\n }\n }\n\n /**\n * @private\n */\n _getUniformDataChanges() {\n const _dataChanges = this._dataChanges;\n if (!_dataChanges || !_dataChanges.length) {\n return;\n }\n\n this._dataChanges = [];\n const datasetCount = this.data.datasets.length;\n const makeSet = (idx) => new Set(\n _dataChanges\n .filter(c => c[0] === idx)\n .map((c, i) => i + ',' + c.splice(1).join(','))\n );\n\n const changeSet = makeSet(0);\n for (let i = 1; i < datasetCount; i++) {\n if (!setsEqual(changeSet, makeSet(i))) {\n return;\n }\n }\n return Array.from(changeSet)\n .map(c => c.split(','))\n .map(a => ({method: a[1], start: +a[2], count: +a[3]}));\n }\n\n /**\n\t * Updates the chart layout unless a plugin returns `false` to the `beforeLayout`\n\t * hook, in which case, plugins will not be called on `afterLayout`.\n\t * @private\n\t */\n _updateLayout(minPadding) {\n if (this.notifyPlugins('beforeLayout', {cancelable: true}) === false) {\n return;\n }\n\n layouts.update(this, this.width, this.height, minPadding);\n\n const area = this.chartArea;\n const noArea = area.width <= 0 || area.height <= 0;\n\n this._layers = [];\n each(this.boxes, (box) => {\n if (noArea && box.position === 'chartArea') {\n // Skip drawing and configuring chartArea boxes when chartArea is zero or negative\n return;\n }\n\n // configure is called twice, once in core.scale.update and once here.\n // Here the boxes are fully updated and at their final positions.\n if (box.configure) {\n box.configure();\n }\n this._layers.push(...box._layers());\n }, this);\n\n this._layers.forEach((item, index) => {\n item._idx = index;\n });\n\n this.notifyPlugins('afterLayout');\n }\n\n /**\n\t * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate`\n\t * hook, in which case, plugins will not be called on `afterDatasetsUpdate`.\n\t * @private\n\t */\n _updateDatasets(mode) {\n if (this.notifyPlugins('beforeDatasetsUpdate', {mode, cancelable: true}) === false) {\n return;\n }\n\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this.getDatasetMeta(i).controller.configure();\n }\n\n for (let i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this._updateDataset(i, isFunction(mode) ? mode({datasetIndex: i}) : mode);\n }\n\n this.notifyPlugins('afterDatasetsUpdate', {mode});\n }\n\n /**\n\t * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate`\n\t * hook, in which case, plugins will not be called on `afterDatasetUpdate`.\n\t * @private\n\t */\n _updateDataset(index, mode) {\n const meta = this.getDatasetMeta(index);\n const args = {meta, index, mode, cancelable: true};\n\n if (this.notifyPlugins('beforeDatasetUpdate', args) === false) {\n return;\n }\n\n meta.controller._update(mode);\n\n args.cancelable = false;\n this.notifyPlugins('afterDatasetUpdate', args);\n }\n\n render() {\n if (this.notifyPlugins('beforeRender', {cancelable: true}) === false) {\n return;\n }\n\n if (animator.has(this)) {\n if (this.attached && !animator.running(this)) {\n animator.start(this);\n }\n } else {\n this.draw();\n onAnimationsComplete({chart: this});\n }\n }\n\n draw() {\n let i;\n if (this._resizeBeforeDraw) {\n const {width, height} = this._resizeBeforeDraw;\n this._resize(width, height);\n this._resizeBeforeDraw = null;\n }\n this.clear();\n\n if (this.width <= 0 || this.height <= 0) {\n return;\n }\n\n if (this.notifyPlugins('beforeDraw', {cancelable: true}) === false) {\n return;\n }\n\n // Because of plugin hooks (before/afterDatasetsDraw), datasets can't\n // currently be part of layers. Instead, we draw\n // layers <= 0 before(default, backward compat), and the rest after\n const layers = this._layers;\n for (i = 0; i < layers.length && layers[i].z <= 0; ++i) {\n layers[i].draw(this.chartArea);\n }\n\n this._drawDatasets();\n\n // Rest of layers\n for (; i < layers.length; ++i) {\n layers[i].draw(this.chartArea);\n }\n\n this.notifyPlugins('afterDraw');\n }\n\n /**\n\t * @private\n\t */\n _getSortedDatasetMetas(filterVisible) {\n const metasets = this._sortedMetasets;\n const result = [];\n let i, ilen;\n\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\n return result;\n }\n\n /**\n\t * Gets the visible dataset metas in drawing order\n\t * @return {object[]}\n\t */\n getSortedVisibleDatasetMetas() {\n return this._getSortedDatasetMetas(true);\n }\n\n /**\n\t * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw`\n\t * hook, in which case, plugins will not be called on `afterDatasetsDraw`.\n\t * @private\n\t */\n _drawDatasets() {\n if (this.notifyPlugins('beforeDatasetsDraw', {cancelable: true}) === false) {\n return;\n }\n\n const metasets = this.getSortedVisibleDatasetMetas();\n for (let i = metasets.length - 1; i >= 0; --i) {\n this._drawDataset(metasets[i]);\n }\n\n this.notifyPlugins('afterDatasetsDraw');\n }\n\n /**\n\t * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw`\n\t * hook, in which case, plugins will not be called on `afterDatasetDraw`.\n\t * @private\n\t */\n _drawDataset(meta) {\n const ctx = this.ctx;\n const clip = meta._clip;\n const useClip = !clip.disabled;\n const area = getDatasetArea(meta, this.chartArea);\n const args = {\n meta,\n index: meta.index,\n cancelable: true\n };\n\n if (this.notifyPlugins('beforeDatasetDraw', args) === false) {\n return;\n }\n\n if (useClip) {\n clipArea(ctx, {\n left: clip.left === false ? 0 : area.left - clip.left,\n right: clip.right === false ? this.width : area.right + clip.right,\n top: clip.top === false ? 0 : area.top - clip.top,\n bottom: clip.bottom === false ? this.height : area.bottom + clip.bottom\n });\n }\n\n meta.controller.draw();\n\n if (useClip) {\n unclipArea(ctx);\n }\n\n args.cancelable = false;\n this.notifyPlugins('afterDatasetDraw', args);\n }\n\n /**\n * Checks whether the given point is in the chart area.\n * @param {Point} point - in relative coordinates (see, e.g., getRelativePosition)\n * @returns {boolean}\n */\n isPointInArea(point) {\n return _isPointInArea(point, this.chartArea, this._minPadding);\n }\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\n return [];\n }\n\n getDatasetMeta(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n const metasets = this._metasets;\n let meta = metasets.filter(x => x && x._dataset === dataset).pop();\n\n if (!meta) {\n meta = {\n type: null,\n data: [],\n dataset: null,\n controller: null,\n hidden: null,\t\t\t// See isDatasetVisible() comment\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\n return meta;\n }\n\n getContext() {\n return this.$context || (this.$context = createContext(null, {chart: this, type: 'chart'}));\n }\n\n getVisibleDatasetCount() {\n return this.getSortedVisibleDatasetMetas().length;\n }\n\n isDatasetVisible(datasetIndex) {\n const dataset = this.data.datasets[datasetIndex];\n if (!dataset) {\n return false;\n }\n\n const meta = this.getDatasetMeta(datasetIndex);\n\n // meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false,\n // the dataset.hidden value is ignored, else if null, the dataset hidden state is returned.\n return typeof meta.hidden === 'boolean' ? !meta.hidden : !dataset.hidden;\n }\n\n setDatasetVisibility(datasetIndex, visible) {\n const meta = this.getDatasetMeta(datasetIndex);\n meta.hidden = !visible;\n }\n\n toggleDataVisibility(index) {\n this._hiddenIndices[index] = !this._hiddenIndices[index];\n }\n\n getDataVisibility(index) {\n return !this._hiddenIndices[index];\n }\n\n /**\n\t * @private\n\t */\n _updateVisibility(datasetIndex, dataIndex, visible) {\n const mode = visible ? 'show' : 'hide';\n const meta = this.getDatasetMeta(datasetIndex);\n const anims = meta.controller._resolveAnimations(undefined, mode);\n\n if (defined(dataIndex)) {\n meta.data[dataIndex].hidden = !visible;\n this.update();\n } else {\n this.setDatasetVisibility(datasetIndex, visible);\n // Animate visible state, so hide animation can be seen. This could be handled better if update / updateDataset returned a Promise.\n anims.update(meta, {visible});\n this.update((ctx) => ctx.datasetIndex === datasetIndex ? mode : undefined);\n }\n }\n\n hide(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, false);\n }\n\n show(datasetIndex, dataIndex) {\n this._updateVisibility(datasetIndex, dataIndex, true);\n }\n\n /**\n\t * @private\n\t */\n _destroyDatasetMeta(datasetIndex) {\n const meta = this._metasets[datasetIndex];\n if (meta && meta.controller) {\n meta.controller._destroy();\n }\n delete this._metasets[datasetIndex];\n }\n\n _stop() {\n let i, ilen;\n this.stop();\n animator.remove(this);\n\n for (i = 0, ilen = this.data.datasets.length; i < ilen; ++i) {\n this._destroyDatasetMeta(i);\n }\n }\n\n destroy() {\n this.notifyPlugins('beforeDestroy');\n const {canvas, ctx} = this;\n\n this._stop();\n this.config.clearCache();\n\n if (canvas) {\n this.unbindEvents();\n clearCanvas(canvas, ctx);\n this.platform.releaseContext(ctx);\n this.canvas = null;\n this.ctx = null;\n }\n\n delete instances[this.id];\n\n this.notifyPlugins('afterDestroy');\n }\n\n toBase64Image(...args) {\n return this.canvas.toDataURL(...args);\n }\n\n /**\n\t * @private\n\t */\n bindEvents() {\n this.bindUserEvents();\n if (this.options.responsive) {\n this.bindResponsiveEvents();\n } else {\n this.attached = true;\n }\n }\n\n /**\n * @private\n */\n bindUserEvents() {\n const listeners = this._listeners;\n const platform = this.platform;\n\n const _add = (type, listener) => {\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n\n const listener = (e, x, y) => {\n e.offsetX = x;\n e.offsetY = y;\n this._eventHandler(e);\n };\n\n each(this.options.events, (type) => _add(type, listener));\n }\n\n /**\n * @private\n */\n bindResponsiveEvents() {\n if (!this._responsiveListeners) {\n this._responsiveListeners = {};\n }\n const listeners = this._responsiveListeners;\n const platform = this.platform;\n\n const _add = (type, listener) => {\n platform.addEventListener(this, type, listener);\n listeners[type] = listener;\n };\n const _remove = (type, listener) => {\n if (listeners[type]) {\n platform.removeEventListener(this, type, listener);\n delete listeners[type];\n }\n };\n\n const listener = (width, height) => {\n if (this.canvas) {\n this.resize(width, height);\n }\n };\n\n let detached; // eslint-disable-line prefer-const\n const attached = () => {\n _remove('attach', attached);\n\n this.attached = true;\n this.resize();\n\n _add('resize', listener);\n _add('detach', detached);\n };\n\n detached = () => {\n this.attached = false;\n\n _remove('resize', listener);\n\n // Stop animating and remove metasets, so when re-attached, the animations start from beginning.\n this._stop();\n this._resize(0, 0);\n\n _add('attach', attached);\n };\n\n if (platform.isAttached(this.canvas)) {\n attached();\n } else {\n detached();\n }\n }\n\n /**\n\t * @private\n\t */\n unbindEvents() {\n each(this._listeners, (listener, type) => {\n this.platform.removeEventListener(this, type, listener);\n });\n this._listeners = {};\n\n each(this._responsiveListeners, (listener, type) => {\n this.platform.removeEventListener(this, type, listener);\n });\n this._responsiveListeners = undefined;\n }\n\n updateHoverStyle(items, mode, enabled) {\n const prefix = enabled ? 'set' : 'remove';\n let meta, item, i, ilen;\n\n if (mode === 'dataset') {\n meta = this.getDatasetMeta(items[0].datasetIndex);\n meta.controller['_' + prefix + 'DatasetHoverStyle']();\n }\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\n /**\n\t * Get active (hovered) elements\n\t * @returns array\n\t */\n getActiveElements() {\n return this._active || [];\n }\n\n /**\n\t * Set active (hovered) elements\n\t * @param {array} activeElements New active data points\n\t */\n setActiveElements(activeElements) {\n const lastActive = this._active || [];\n const active = activeElements.map(({datasetIndex, index}) => {\n const meta = this.getDatasetMeta(datasetIndex);\n if (!meta) {\n throw new Error('No dataset found at index ' + datasetIndex);\n }\n\n return {\n datasetIndex,\n element: meta.data[index],\n index,\n };\n });\n const changed = !_elementsEqual(active, lastActive);\n\n if (changed) {\n this._active = active;\n // Make sure we don't use the previous mouse event to override the active elements in update.\n this._lastEvent = null;\n this._updateHoverStyles(active, lastActive);\n }\n }\n\n /**\n\t * Calls enabled plugins on the specified hook and with the given args.\n\t * This method immediately returns as soon as a plugin explicitly returns false. The\n\t * returned value can be used, for instance, to interrupt the current action.\n\t * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate').\n\t * @param {Object} [args] - Extra arguments to apply to the hook call.\n * @param {import('./core.plugins.js').filterCallback} [filter] - Filtering function for limiting which plugins are notified\n\t * @returns {boolean} false if any of the plugins return false, else returns true.\n\t */\n notifyPlugins(hook, args, filter) {\n return this._plugins.notify(this, hook, args, filter);\n }\n\n /**\n * Check if a plugin with the specific ID is registered and enabled\n * @param {string} pluginId - The ID of the plugin of which to check if it is enabled\n * @returns {boolean}\n */\n isPluginEnabled(pluginId) {\n return this._plugins._cache.filter(p => p.plugin.id === pluginId).length === 1;\n }\n\n /**\n\t * @private\n\t */\n _updateHoverStyles(active, lastActive, replay) {\n const hoverOptions = this.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\n if (deactivated.length) {\n this.updateHoverStyle(deactivated, hoverOptions.mode, false);\n }\n\n if (activated.length && hoverOptions.mode) {\n this.updateHoverStyle(activated, hoverOptions.mode, true);\n }\n }\n\n /**\n\t * @private\n\t */\n _eventHandler(e, replay) {\n const args = {\n event: e,\n replay,\n cancelable: true,\n inChartArea: this.isPointInArea(e)\n };\n const eventFilter = (plugin) => (plugin.options.events || this.options.events).includes(e.native.type);\n\n if (this.notifyPlugins('beforeEvent', args, eventFilter) === false) {\n return;\n }\n\n const changed = this._handleEvent(e, replay, args.inChartArea);\n\n args.cancelable = false;\n this.notifyPlugins('afterEvent', args, eventFilter);\n\n if (changed || args.changed) {\n this.render();\n }\n\n return this;\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e the event to handle\n\t * @param {boolean} [replay] - true if the event was replayed by `update`\n * @param {boolean} [inChartArea] - true if the event is inside chartArea\n\t * @return {boolean} true if the chart needs to re-render\n\t * @private\n\t */\n _handleEvent(e, replay, inChartArea) {\n const {_active: lastActive = [], options} = this;\n\n // If the event is replayed from `update`, we should evaluate with the final positions.\n //\n // The `replay`:\n // It's the last event (excluding click) that has occurred before `update`.\n // So mouse has not moved. It's also over the chart, because there is a `replay`.\n //\n // The why:\n // If animations are active, the elements haven't moved yet compared to state before update.\n // But if they will, we are activating the elements that would be active, if this check\n // was done after the animations have completed. => \"final positions\".\n // If there is no animations, the \"final\" and \"current\" positions are equal.\n // This is done so we do not have to evaluate the active elements each animation frame\n // - it would be expensive.\n const useFinalPosition = replay;\n const active = this._getActiveElements(e, lastActive, inChartArea, useFinalPosition);\n const isClick = _isClickEvent(e);\n const lastEvent = determineLastEvent(e, this._lastEvent, inChartArea, isClick);\n\n if (inChartArea) {\n // Set _lastEvent to null while we are processing the event handlers.\n // This prevents recursion if the handler calls chart.update()\n this._lastEvent = null;\n\n // Invoke onHover hook\n callCallback(options.onHover, [e, active, this], this);\n\n if (isClick) {\n callCallback(options.onClick, [e, active, this], this);\n }\n }\n\n const changed = !_elementsEqual(active, lastActive);\n if (changed || replay) {\n this._active = active;\n this._updateHoverStyles(active, lastActive, replay);\n }\n\n this._lastEvent = lastEvent;\n\n return changed;\n }\n\n /**\n * @param {ChartEvent} e - The event\n * @param {import('../types/index.js').ActiveElement[]} lastActive - Previously active elements\n * @param {boolean} inChartArea - Is the envent inside chartArea\n * @param {boolean} useFinalPosition - Should the evaluation be done with current or final (after animation) element positions\n * @returns {import('../types/index.js').ActiveElement[]} - The active elements\n * @pravate\n */\n _getActiveElements(e, lastActive, inChartArea, useFinalPosition) {\n if (e.type === 'mouseout') {\n return [];\n }\n\n if (!inChartArea) {\n // Let user control the active elements outside chartArea. Eg. using Legend.\n return lastActive;\n }\n\n const hoverOptions = this.options.hover;\n return this.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions, useFinalPosition);\n }\n}\n\n// @ts-ignore\nfunction invalidatePlugins() {\n return each(Chart.instances, (chart) => chart._plugins.invalidate());\n}\n\nexport default Chart;\n","import Element from '../core/core.element.js';\nimport {_angleBetween, getAngleFromPoint, TAU, HALF_PI, valueOrDefault} from '../helpers/index.js';\nimport {PI, _isBetween, _limitValue} from '../helpers/helpers.math.js';\nimport {_readValueToProps} from '../helpers/helpers.options.js';\nimport type {ArcOptions, Point} from '../types/index.js';\n\n\nfunction clipArc(ctx: CanvasRenderingContext2D, element: ArcElement, endAngle: number) {\n const {startAngle, pixelMargin, x, y, outerRadius, innerRadius} = element;\n let angleMargin = pixelMargin / outerRadius;\n\n // Draw an inner border by clipping the arc and drawing a double-width border\n // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders\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}\n\nfunction toRadiusCorners(value) {\n return _readValueToProps(value, ['outerStart', 'outerEnd', 'innerStart', 'innerEnd']);\n}\n\n/**\n * Parse border radius from the provided options\n */\nfunction parseBorderRadius(arc: ArcElement, innerRadius: number, outerRadius: number, angleDelta: number) {\n const o = toRadiusCorners(arc.options.borderRadius);\n const halfThickness = (outerRadius - innerRadius) / 2;\n const innerLimit = Math.min(halfThickness, angleDelta * innerRadius / 2);\n\n // Outer limits are complicated. We want to compute the available angular distance at\n // a radius of outerRadius - borderRadius because for small angular distances, this term limits.\n // We compute at r = outerRadius - borderRadius because this circle defines the center of the border corners.\n //\n // If the borderRadius is large, that value can become negative.\n // This causes the outer borders to lose their radius entirely, which is rather unexpected. To solve that, if borderRadius > outerRadius\n // we know that the thickness term will dominate and compute the limits at that point\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\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}\n\n/**\n * Convert (r, 𝜃) to (x, y)\n */\nfunction rThetaToXY(r: number, theta: number, x: number, y: number) {\n return {\n x: x + r * Math.cos(theta),\n y: y + r * Math.sin(theta),\n };\n}\n\n\n/**\n * Path the arc, respecting border radius by separating into left and right halves.\n *\n * Start End\n *\n * 1--->a--->2 Outer\n * / \\\n * 8 3\n * | |\n * | |\n * 7 4\n * \\ /\n * 6<---b<---5 Inner\n */\nfunction pathArc(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n end: number,\n circular: boolean,\n) {\n const {x, y, startAngle: start, pixelMargin, innerRadius: innerR} = element;\n\n const outerRadius = Math.max(element.outerRadius + spacing + offset - pixelMargin, 0);\n const innerRadius = innerR > 0 ? innerR + spacing + offset + pixelMargin : 0;\n\n let spacingOffset = 0;\n const alpha = end - start;\n\n if (spacing) {\n // When spacing is present, it is the same for all items\n // So we adjust the start and end angle of the arc such that\n // the distance is the same as it would be without the 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\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(element, innerRadius, outerRadius, endAngle - startAngle);\n\n const outerStartAdjustedRadius = outerRadius - outerStart;\n const outerEndAdjustedRadius = outerRadius - outerEnd;\n const outerStartAdjustedAngle = startAngle + outerStart / outerStartAdjustedRadius;\n const outerEndAdjustedAngle = endAngle - outerEnd / outerEndAdjustedRadius;\n\n const innerStartAdjustedRadius = innerRadius + innerStart;\n const innerEndAdjustedRadius = innerRadius + innerEnd;\n const innerStartAdjustedAngle = startAngle + innerStart / innerStartAdjustedRadius;\n const innerEndAdjustedAngle = endAngle - innerEnd / innerEndAdjustedRadius;\n\n ctx.beginPath();\n\n if (circular) {\n // The first arc segments from point 1 to point a to point 2\n const outerMidAdjustedAngle = (outerStartAdjustedAngle + outerEndAdjustedAngle) / 2;\n ctx.arc(x, y, outerRadius, outerStartAdjustedAngle, outerMidAdjustedAngle);\n ctx.arc(x, y, outerRadius, outerMidAdjustedAngle, outerEndAdjustedAngle);\n\n // The corner segment from point 2 to point 3\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\n // The line from point 3 to point 4\n const p4 = rThetaToXY(innerEndAdjustedRadius, endAngle, x, y);\n ctx.lineTo(p4.x, p4.y);\n\n // The corner segment from point 4 to point 5\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\n // The inner arc from point 5 to point b to point 6\n const innerMidAdjustedAngle = ((endAngle - (innerEnd / innerRadius)) + (startAngle + (innerStart / innerRadius))) / 2;\n ctx.arc(x, y, innerRadius, endAngle - (innerEnd / innerRadius), innerMidAdjustedAngle, true);\n ctx.arc(x, y, innerRadius, innerMidAdjustedAngle, startAngle + (innerStart / innerRadius), true);\n\n // The corner segment from point 6 to point 7\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\n // The line from point 7 to point 8\n const p8 = rThetaToXY(outerStartAdjustedRadius, startAngle, x, y);\n ctx.lineTo(p8.x, p8.y);\n\n // The corner segment from point 8 to point 1\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 } else {\n ctx.moveTo(x, y);\n\n const outerStartX = Math.cos(outerStartAdjustedAngle) * outerRadius + x;\n const outerStartY = Math.sin(outerStartAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerStartX, outerStartY);\n\n const outerEndX = Math.cos(outerEndAdjustedAngle) * outerRadius + x;\n const outerEndY = Math.sin(outerEndAdjustedAngle) * outerRadius + y;\n ctx.lineTo(outerEndX, outerEndY);\n }\n\n ctx.closePath();\n}\n\nfunction drawArc(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n circular: boolean,\n) {\n const {fullCircles, startAngle, circumference} = element;\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for (let i = 0; i < fullCircles; ++i) {\n ctx.fill();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % TAU || TAU);\n }\n }\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.fill();\n return endAngle;\n}\n\nfunction drawBorder(\n ctx: CanvasRenderingContext2D,\n element: ArcElement,\n offset: number,\n spacing: number,\n circular: boolean,\n) {\n const {fullCircles, startAngle, circumference, options} = element;\n const {borderWidth, borderJoinStyle, borderDash, borderDashOffset} = options;\n const inner = options.borderAlign === 'inner';\n\n if (!borderWidth) {\n return;\n }\n\n ctx.setLineDash(borderDash || []);\n ctx.lineDashOffset = borderDashOffset;\n\n if (inner) {\n ctx.lineWidth = borderWidth * 2;\n ctx.lineJoin = borderJoinStyle || 'round';\n } else {\n ctx.lineWidth = borderWidth;\n ctx.lineJoin = borderJoinStyle || 'bevel';\n }\n\n let endAngle = element.endAngle;\n if (fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n for (let i = 0; i < fullCircles; ++i) {\n ctx.stroke();\n }\n if (!isNaN(circumference)) {\n endAngle = startAngle + (circumference % TAU || TAU);\n }\n }\n\n if (inner) {\n clipArc(ctx, element, endAngle);\n }\n\n if (!fullCircles) {\n pathArc(ctx, element, offset, spacing, endAngle, circular);\n ctx.stroke();\n }\n}\n\nexport interface ArcProps extends Point {\n startAngle: number;\n endAngle: number;\n innerRadius: number;\n outerRadius: number;\n circumference: number;\n}\n\nexport default class ArcElement extends Element {\n\n static id = 'arc';\n\n static defaults = {\n borderAlign: 'center',\n borderColor: '#fff',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: undefined,\n borderRadius: 0,\n borderWidth: 2,\n offset: 0,\n spacing: 0,\n angle: undefined,\n circular: true,\n };\n\n static defaultRoutes = {\n backgroundColor: 'backgroundColor'\n };\n\n static descriptors = {\n _scriptable: true,\n _indexable: (name) => name !== 'borderDash'\n };\n\n circumference: number;\n endAngle: number;\n fullCircles: number;\n innerRadius: number;\n outerRadius: number;\n pixelMargin: number;\n startAngle: number;\n\n constructor(cfg) {\n super();\n\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\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n inRange(chartX: number, chartY: number, useFinalPosition: boolean) {\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 + this.options.borderWidth) / 2;\n const _circumference = valueOrDefault(circumference, endAngle - startAngle);\n const betweenAngles = _circumference >= TAU || _angleBetween(angle, startAngle, endAngle);\n const withinRadius = _isBetween(distance, innerRadius + rAdjust, outerRadius + rAdjust);\n\n return (betweenAngles && withinRadius);\n }\n\n getCenterPoint(useFinalPosition: boolean) {\n const {x, y, startAngle, endAngle, innerRadius, outerRadius} = this.getProps([\n 'x',\n 'y',\n 'startAngle',\n 'endAngle',\n 'innerRadius',\n 'outerRadius'\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\n tooltipPosition(useFinalPosition: boolean) {\n return this.getCenterPoint(useFinalPosition);\n }\n\n draw(ctx: CanvasRenderingContext2D) {\n const {options, circumference} = this;\n const offset = (options.offset || 0) / 4;\n const spacing = (options.spacing || 0) / 2;\n const circular = options.circular;\n this.pixelMargin = (options.borderAlign === 'inner') ? 0.33 : 0;\n this.fullCircles = circumference > TAU ? Math.floor(circumference / TAU) : 0;\n\n if (circumference === 0 || this.innerRadius < 0 || this.outerRadius < 0) {\n return;\n }\n\n ctx.save();\n\n const halfAngle = (this.startAngle + this.endAngle) / 2;\n ctx.translate(Math.cos(halfAngle) * offset, Math.sin(halfAngle) * offset);\n const fix = 1 - Math.sin(Math.min(PI, circumference || 0));\n const radiusOffset = offset * fix;\n\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n\n drawArc(ctx, this, radiusOffset, spacing, circular);\n drawBorder(ctx, this, radiusOffset, spacing, circular);\n\n ctx.restore();\n }\n}\n","import Element from '../core/core.element.js';\nimport {_bezierInterpolation, _pointInLine, _steppedInterpolation} from '../helpers/helpers.interpolation.js';\nimport {_computeSegments, _boundSegments} from '../helpers/helpers.segment.js';\nimport {_steppedLineTo, _bezierCurveTo} from '../helpers/helpers.canvas.js';\nimport {_updateBezierControlPoints} from '../helpers/helpers.curve.js';\nimport {valueOrDefault} from '../helpers/index.js';\n\n/**\n * @typedef { import('./element.point.js').default } PointElement\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}\n\nfunction lineTo(ctx, previous, target) {\n ctx.lineTo(target.x, target.y);\n}\n\n/**\n * @returns {any}\n */\nfunction getLineMethod(options) {\n if (options.stepped) {\n return _steppedLineTo;\n }\n\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierCurveTo;\n }\n\n return lineTo;\n}\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\n return {\n count,\n start,\n loop: segment.loop,\n ilen: end < start && !outside ? count + end - start : end - start\n };\n}\n\n/**\n * Create path from points, grouping by truncated x-coordinate\n * Points need to be in order by x-coordinate for this to work efficiently\n * @param {CanvasRenderingContext2D|Path2D} ctx - Context\n * @param {LineElement} line\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} params\n * @param {boolean} params.move - move to starting point (vs line to it)\n * @param {boolean} params.reverse - path the segment from end to start\n * @param {number} params.start - limit segment to points starting from `start` index\n * @param {number} params.end - limit segment to points ending at `start` + `count` index\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 // eslint-disable-next-line prefer-const\n let {move = true, reverse} = params || {};\n let i, point, prev;\n\n for (i = 0; i <= ilen; ++i) {\n point = points[(start + (reverse ? ilen - i : i)) % count];\n\n if (point.skip) {\n // If there is a skipped point inside a segment, spanGaps must be true\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\n prev = point;\n }\n\n if (loop) {\n point = points[(start + (reverse ? ilen : 0)) % count];\n lineMethod(ctx, prev, point, reverse, options.stepped);\n }\n\n return !!loop;\n}\n\n/**\n * Create path from points, grouping by truncated x-coordinate\n * Points need to be in order by x-coordinate for this to work efficiently\n * @param {CanvasRenderingContext2D|Path2D} ctx - Context\n * @param {LineElement} line\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} params\n * @param {boolean} params.move - move to starting point (vs line to it)\n * @param {boolean} params.reverse - path the segment from end to start\n * @param {number} params.start - limit segment to points starting from `start` index\n * @param {number} params.end - limit segment to points ending at `start` + `count` index\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\n const pointIndex = (index) => (start + (reverse ? ilen - index : index)) % count;\n const drawX = () => {\n if (minY !== maxY) {\n // Draw line to maxY and minY, using the average x-coordinate\n ctx.lineTo(avgX, maxY);\n ctx.lineTo(avgX, minY);\n // Line to y-value of last point in group. So the line continues\n // from correct position. Not using move, to have solid path.\n ctx.lineTo(avgX, lastY);\n }\n };\n\n if (move) {\n point = points[pointIndex(0)];\n ctx.moveTo(point.x, point.y);\n }\n\n for (i = 0; i <= ilen; ++i) {\n point = points[pointIndex(i)];\n\n if (point.skip) {\n // If there is a skipped point inside a segment, spanGaps must be true\n continue;\n }\n\n const x = point.x;\n const y = point.y;\n const truncX = x | 0; // truncated x-coordinate\n\n if (truncX === prevX) {\n // Determine `minY` / `maxY` and `avgX` while we stay within same x-position\n if (y < minY) {\n minY = y;\n } else if (y > maxY) {\n maxY = y;\n }\n // For first point in group, countX is `0`, so average will be `x` / 1.\n avgX = (countX * avgX + x) / ++countX;\n } else {\n drawX();\n // Draw line to next x-position, using the first (or only)\n // y-value in that group\n ctx.lineTo(x, y);\n\n prevX = truncX;\n countX = 0;\n minY = maxY = y;\n }\n // Keep track of the last y-value in group\n lastY = y;\n }\n drawX();\n}\n\n/**\n * @param {LineElement} line - the line\n * @returns {function}\n * @private\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}\n\n/**\n * @private\n */\nfunction _getInterpolationMethod(options) {\n if (options.stepped) {\n return _steppedInterpolation;\n }\n\n if (options.tension || options.cubicInterpolationMode === 'monotone') {\n return _bezierInterpolation;\n }\n\n return _pointInLine;\n}\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}\n\nfunction strokePathDirect(ctx, line, start, count) {\n const {segments, options} = line;\n const segmentMethod = _getSegmentMethod(line);\n\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}\n\nconst usePath2D = typeof Path2D === 'function';\n\nfunction draw(ctx, line, start, count) {\n if (usePath2D && !line.options.segment) {\n strokePathWithCache(ctx, line, start, count);\n } else {\n strokePathDirect(ctx, line, start, count);\n }\n}\n\nexport default class LineElement extends Element {\n\n static id = 'line';\n\n /**\n * @type {any}\n */\n static 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 };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n\n static descriptors = {\n _scriptable: true,\n _indexable: (name) => name !== 'borderDash' && name !== 'fill',\n };\n\n\n constructor(cfg) {\n super();\n\n this.animated = true;\n this.options = undefined;\n this._chart = 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\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n updateControlPoints(chartArea, indexAxis) {\n const options = this.options;\n if ((options.tension || options.cubicInterpolationMode === 'monotone') && !options.stepped && !this._pointsUpdated) {\n const loop = options.spanGaps ? this._loop : this._fullLoop;\n _updateBezierControlPoints(this._points, options, chartArea, loop, indexAxis);\n this._pointsUpdated = true;\n }\n }\n\n set points(points) {\n this._points = points;\n delete this._segments;\n delete this._path;\n this._pointsUpdated = false;\n }\n\n get points() {\n return this._points;\n }\n\n get segments() {\n return this._segments || (this._segments = _computeSegments(this, this.options.segment));\n }\n\n /**\n\t * First non-skipped point on this line\n\t * @returns {PointElement|undefined}\n\t */\n first() {\n const segments = this.segments;\n const points = this.points;\n return segments.length && points[segments[0].start];\n }\n\n /**\n\t * Last non-skipped point on this line\n\t * @returns {PointElement|undefined}\n\t */\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\n /**\n\t * Interpolate a point in this line at the same value on `property` as\n\t * the reference `point` provided\n\t * @param {PointElement} point - the reference point\n\t * @param {string} property - the property to match on\n\t * @returns {PointElement|undefined}\n\t */\n interpolate(point, property) {\n const options = this.options;\n const value = point[property];\n const points = this.points;\n const segments = _boundSegments(this, {property, start: value, end: value});\n\n if (!segments.length) {\n return;\n }\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\n /**\n\t * Append a segment of this line to current path.\n\t * @param {CanvasRenderingContext2D} ctx\n\t * @param {object} segment\n\t * @param {number} segment.start - start index of the segment, referring the points array\n \t * @param {number} segment.end - end index of the segment, referring the points array\n \t * @param {boolean} segment.loop - indicates that the segment is a loop\n\t * @param {object} params\n\t * @param {boolean} params.move - move to starting point (vs line to it)\n\t * @param {boolean} params.reverse - path the segment from end to start\n\t * @param {number} params.start - limit segment to points starting from `start` index\n\t * @param {number} params.end - limit segment to points ending at `start` + `count` index\n\t * @returns {undefined|boolean} - true if the segment is a full loop (path should be closed)\n\t */\n pathSegment(ctx, segment, params) {\n const segmentMethod = _getSegmentMethod(this);\n return segmentMethod(ctx, this, segment, params);\n }\n\n /**\n\t * Append all segments of this line to current path.\n\t * @param {CanvasRenderingContext2D|Path2D} ctx\n\t * @param {number} [start]\n\t * @param {number} [count]\n\t * @returns {undefined|boolean} - true if line is a full loop (path should be closed)\n\t */\n path(ctx, start, count) {\n const segments = this.segments;\n const segmentMethod = _getSegmentMethod(this);\n let loop = this._loop;\n\n start = start || 0;\n count = count || (this.points.length - start);\n\n for (const segment of segments) {\n loop &= segmentMethod(ctx, this, segment, {start, end: start + count - 1});\n }\n return !!loop;\n }\n\n /**\n\t * Draw\n\t * @param {CanvasRenderingContext2D} ctx\n\t * @param {object} chartArea\n\t * @param {number} [start]\n\t * @param {number} [count]\n\t */\n draw(ctx, chartArea, start, count) {\n const options = this.options || {};\n const points = this.points || [];\n\n if (points.length && options.borderWidth) {\n ctx.save();\n\n draw(ctx, this, start, count);\n\n ctx.restore();\n }\n\n if (this.animated) {\n // When line is animated, the control points and path are not cached.\n this._pointsUpdated = false;\n this._path = undefined;\n }\n }\n}\n","import Element from '../core/core.element.js';\nimport {drawPoint, _isPointInArea} from '../helpers/helpers.canvas.js';\nimport type {\n CartesianParsedData,\n ChartArea,\n Point,\n PointHoverOptions,\n PointOptions,\n} from '../types/index.js';\n\nfunction inRange(el: PointElement, pos: number, axis: 'x' | 'y', useFinalPosition?: boolean) {\n const options = el.options;\n const {[axis]: value} = el.getProps([axis], useFinalPosition);\n\n return (Math.abs(pos - value) < options.radius + options.hitRadius);\n}\n\nexport type PointProps = Point\n\nexport default class PointElement extends Element {\n\n static id = 'point';\n\n parsed: CartesianParsedData;\n skip?: boolean;\n stop?: boolean;\n\n /**\n * @type {any}\n */\n static defaults = {\n borderWidth: 1,\n hitRadius: 1,\n hoverBorderWidth: 1,\n hoverRadius: 4,\n pointStyle: 'circle',\n radius: 3,\n rotation: 0\n };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.parsed = undefined;\n this.skip = undefined;\n this.stop = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n inRange(mouseX: number, mouseY: number, useFinalPosition?: boolean) {\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\n inXRange(mouseX: number, useFinalPosition?: boolean) {\n return inRange(this, mouseX, 'x', useFinalPosition);\n }\n\n inYRange(mouseY: number, useFinalPosition?: boolean) {\n return inRange(this, mouseY, 'y', useFinalPosition);\n }\n\n getCenterPoint(useFinalPosition?: boolean) {\n const {x, y} = this.getProps(['x', 'y'], useFinalPosition);\n return {x, y};\n }\n\n size(options?: Partial) {\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\n draw(ctx: CanvasRenderingContext2D, area: ChartArea) {\n const options = this.options;\n\n if (this.skip || options.radius < 0.1 || !_isPointInArea(this, area, this.size(options) / 2)) {\n return;\n }\n\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n ctx.fillStyle = options.backgroundColor;\n drawPoint(ctx, options, this.x, this.y);\n }\n\n getRange() {\n const options = this.options || {};\n // @ts-expect-error Fallbacks should never be hit in practice\n return options.radius + options.hitRadius;\n }\n}\n","import Element from '../core/core.element.js';\nimport {isObject, _isBetween, _limitValue} from '../helpers/index.js';\nimport {addRoundedRectPath} from '../helpers/helpers.canvas.js';\nimport {toTRBL, toTRBLCorners} from '../helpers/helpers.options.js';\n\n/** @typedef {{ x: number, y: number, base: number, horizontal: boolean, width: number, height: number }} BarProps */\n\n/**\n * Helper function to get the bounds of the bar regardless of the orientation\n * @param {BarElement} bar the bar\n * @param {boolean} [useFinalPosition]\n * @return {object} bounds of the bar\n * @private\n */\nfunction getBarBounds(bar, useFinalPosition) {\n const {x, y, base, width, height} = /** @type {BarProps} */ (bar.getProps(['x', 'y', 'base', 'width', 'height'], useFinalPosition));\n\n let left, right, top, bottom, half;\n\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\n return {left, top, right, bottom};\n}\n\nfunction skipOrLimit(skip, value, min, max) {\n return skip ? 0 : _limitValue(value, min, max);\n}\n\nfunction parseBorderWidth(bar, maxW, maxH) {\n const value = bar.options.borderWidth;\n const skip = bar.borderSkipped;\n const o = toTRBL(value);\n\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}\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\n // If the value is an object, assume the user knows what they are doing\n // and apply as directed.\n const enableBorder = enableBorderRadius || isObject(value);\n\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}\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\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}\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\n return bounds\n\t\t&& (skipX || _isBetween(x, bounds.left, bounds.right))\n\t\t&& (skipY || _isBetween(y, bounds.top, bounds.bottom));\n}\n\nfunction hasRadius(radius) {\n return radius.topLeft || radius.topRight || radius.bottomLeft || radius.bottomRight;\n}\n\n/**\n * Add a path of a rectangle to the current sub-path\n * @param {CanvasRenderingContext2D} ctx Context\n * @param {*} rect Bounding rect\n */\nfunction addNormalRectPath(ctx, rect) {\n ctx.rect(rect.x, rect.y, rect.w, rect.h);\n}\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}\n\nexport default class BarElement extends Element {\n\n static id = 'bar';\n\n /**\n * @type {any}\n */\n static defaults = {\n borderSkipped: 'start',\n borderWidth: 0,\n borderRadius: 0,\n inflateAmount: 'auto',\n pointStyle: undefined\n };\n\n /**\n * @type {any}\n */\n static defaultRoutes = {\n backgroundColor: 'backgroundColor',\n borderColor: 'borderColor'\n };\n\n constructor(cfg) {\n super();\n\n this.options = undefined;\n this.horizontal = undefined;\n this.base = undefined;\n this.width = undefined;\n this.height = undefined;\n this.inflateAmount = undefined;\n\n if (cfg) {\n Object.assign(this, cfg);\n }\n }\n\n draw(ctx) {\n const {inflateAmount, options: {borderColor, backgroundColor}} = this;\n const {inner, outer} = boundingRects(this);\n const addRectPath = hasRadius(outer.radius) ? addRoundedRectPath : addNormalRectPath;\n\n ctx.save();\n\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 = borderColor;\n ctx.fill('evenodd');\n }\n\n ctx.beginPath();\n addRectPath(ctx, inflateRect(inner, inflateAmount));\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n\n ctx.restore();\n }\n\n inRange(mouseX, mouseY, useFinalPosition) {\n return inRange(this, mouseX, mouseY, useFinalPosition);\n }\n\n inXRange(mouseX, useFinalPosition) {\n return inRange(this, mouseX, null, useFinalPosition);\n }\n\n inYRange(mouseY, useFinalPosition) {\n return inRange(this, null, mouseY, useFinalPosition);\n }\n\n getCenterPoint(useFinalPosition) {\n const {x, y, base, horizontal} = /** @type {BarProps} */ (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\n getRange(axis) {\n return axis === 'x' ? this.width / 2 : this.height / 2;\n }\n}\n","/**\n * Plugin based on discussion from the following Chart.js issues:\n * @see https://github.com/chartjs/Chart.js/issues/2380#issuecomment-279961569\n * @see https://github.com/chartjs/Chart.js/issues/2440#issuecomment-256461897\n */\n\nimport LineElement from '../../elements/element.line.js';\nimport {_drawfill} from './filler.drawing.js';\nimport {_shouldApplyFill} from './filler.helper.js';\nimport {_decodeFill, _resolveTarget} from './filler.options.js';\n\nexport default {\n id: 'filler',\n\n afterDatasetsUpdate(chart, _args, options) {\n const count = (chart.data.datasets || []).length;\n const sources = [];\n let meta, i, line, source;\n\n for (i = 0; i < count; ++i) {\n meta = chart.getDatasetMeta(i);\n line = meta.dataset;\n source = null;\n\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\n meta.$filler = source;\n sources.push(source);\n }\n\n for (i = 0; i < count; ++i) {\n source = sources[i];\n if (!source || source.fill === false) {\n continue;\n }\n\n source.fill = _resolveTarget(sources, i, options.propagate);\n }\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\n source.line.updateControlPoints(area, source.axis);\n if (draw && source.fill) {\n _drawfill(chart.ctx, source, area);\n }\n }\n },\n\n beforeDatasetsDraw(chart, _args, options) {\n if (options.drawTime !== 'beforeDatasetsDraw') {\n return;\n }\n\n const metasets = chart.getSortedVisibleDatasetMetas();\n for (let i = metasets.length - 1; i >= 0; --i) {\n const source = metasets[i].$filler;\n\n if (_shouldApplyFill(source)) {\n _drawfill(chart.ctx, source, chart.chartArea);\n }\n }\n },\n\n beforeDatasetDraw(chart, args, options) {\n const source = args.meta.$filler;\n\n if (!_shouldApplyFill(source) || options.drawTime !== 'beforeDatasetDraw') {\n return;\n }\n\n _drawfill(chart.ctx, source, chart.chartArea);\n },\n\n defaults: {\n propagate: true,\n drawTime: 'beforeDatasetDraw'\n }\n};\n","import defaults from '../core/core.defaults.js';\nimport Element from '../core/core.element.js';\nimport layouts from '../core/core.layouts.js';\nimport {addRoundedRectPath, drawPointLegend, renderText} from '../helpers/helpers.canvas.js';\nimport {\n _isBetween,\n callback as call,\n clipArea,\n getRtlAdapter,\n overrideTextDirection,\n restoreTextDirection,\n toFont,\n toPadding,\n unclipArea,\n valueOrDefault,\n} from '../helpers/index.js';\nimport {_alignStartEnd, _textX, _toLeftRightCenter} from '../helpers/helpers.extras.js';\nimport {toTRBLCorners} from '../helpers/helpers.options.js';\n\n/**\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n */\n\nconst getBoxSize = (labelOpts, fontSize) => {\n let {boxHeight = fontSize, boxWidth = fontSize} = labelOpts;\n\n if (labelOpts.usePointStyle) {\n boxHeight = Math.min(boxHeight, fontSize);\n boxWidth = labelOpts.pointStyleWidth || Math.min(boxWidth, fontSize);\n }\n\n return {\n boxWidth,\n boxHeight,\n itemHeight: Math.max(fontSize, boxHeight)\n };\n};\n\nconst itemsEqual = (a, b) => a !== null && b !== null && a.datasetIndex === b.datasetIndex && a.index === b.index;\n\nexport class Legend extends Element {\n\n /**\n\t * @param {{ ctx: any; options: any; chart: any; }} config\n\t */\n constructor(config) {\n super();\n\n this._added = false;\n\n // Contains hit boxes for each dataset (in dataset order)\n this.legendHitBoxes = [];\n\n /**\n \t\t * @private\n \t\t */\n this._hoveredItem = null;\n\n // Are we in doughnut mode which has a different data type\n this.doughnutMode = false;\n\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\n update(maxWidth, maxHeight, margins) {\n this.maxWidth = maxWidth;\n this.maxHeight = maxHeight;\n this._margins = margins;\n\n this.setDimensions();\n this.buildLabels();\n this.fit();\n }\n\n setDimensions() {\n if (this.isHorizontal()) {\n this.width = this.maxWidth;\n this.left = this._margins.left;\n this.right = this.width;\n } else {\n this.height = this.maxHeight;\n this.top = this._margins.top;\n this.bottom = this.height;\n }\n }\n\n buildLabels() {\n const labelOpts = this.options.labels || {};\n let legendItems = call(labelOpts.generateLabels, [this.chart], this) || [];\n\n if (labelOpts.filter) {\n legendItems = legendItems.filter((item) => labelOpts.filter(item, this.chart.data));\n }\n\n if (labelOpts.sort) {\n legendItems = legendItems.sort((a, b) => labelOpts.sort(a, b, this.chart.data));\n }\n\n if (this.options.reverse) {\n legendItems.reverse();\n }\n\n this.legendItems = legendItems;\n }\n\n fit() {\n const {options, ctx} = this;\n\n // The legend may not be displayed for a variety of reasons including\n // the fact that the defaults got set to `false`.\n // When the legend is not displayed, there are no guarantees that the options\n // are correctly formatted so we need to bail out as early as possible.\n if (!options.display) {\n this.width = this.height = 0;\n return;\n }\n\n const labelOpts = options.labels;\n const labelFont = toFont(labelOpts.font);\n const fontSize = labelFont.size;\n const titleHeight = this._computeTitleHeight();\n const {boxWidth, itemHeight} = getBoxSize(labelOpts, fontSize);\n\n let width, height;\n\n ctx.font = labelFont.string;\n\n if (this.isHorizontal()) {\n width = this.maxWidth; // fill all the width\n height = this._fitRows(titleHeight, fontSize, boxWidth, itemHeight) + 10;\n } else {\n height = this.maxHeight; // fill all the height\n width = this._fitCols(titleHeight, labelFont, boxWidth, itemHeight) + 10;\n }\n\n this.width = Math.min(width, options.maxWidth || this.maxWidth);\n this.height = Math.min(height, options.maxHeight || this.maxHeight);\n }\n\n /**\n\t * @private\n\t */\n _fitRows(titleHeight, fontSize, boxWidth, itemHeight) {\n const {ctx, maxWidth, options: {labels: {padding}}} = this;\n const hitboxes = this.legendHitBoxes = [];\n // Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one\n const lineWidths = this.lineWidths = [0];\n const lineHeight = itemHeight + padding;\n let totalHeight = titleHeight;\n\n ctx.textAlign = 'left';\n ctx.textBaseline = 'middle';\n\n let row = -1;\n let top = -lineHeight;\n this.legendItems.forEach((legendItem, i) => {\n const itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width;\n\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\n hitboxes[i] = {left: 0, top, row, width: itemWidth, height: itemHeight};\n\n lineWidths[lineWidths.length - 1] += itemWidth + padding;\n });\n\n return totalHeight;\n }\n\n _fitCols(titleHeight, labelFont, boxWidth, _itemHeight) {\n const {ctx, maxHeight, options: {labels: {padding}}} = this;\n const hitboxes = this.legendHitBoxes = [];\n const columnSizes = this.columnSizes = [];\n const heightLimit = maxHeight - titleHeight;\n\n let totalWidth = padding;\n let currentColWidth = 0;\n let currentColHeight = 0;\n\n let left = 0;\n let col = 0;\n\n this.legendItems.forEach((legendItem, i) => {\n const {itemWidth, itemHeight} = calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight);\n\n // If too tall, go to new column\n if (i > 0 && currentColHeight + itemHeight + 2 * padding > heightLimit) {\n totalWidth += currentColWidth + padding;\n columnSizes.push({width: currentColWidth, height: currentColHeight}); // previous column size\n left += currentColWidth + padding;\n col++;\n currentColWidth = currentColHeight = 0;\n }\n\n // Store the hitbox width and height here. Final position will be updated in `draw`\n hitboxes[i] = {left, top: currentColHeight, col, width: itemWidth, height: itemHeight};\n\n // Get max width\n currentColWidth = Math.max(currentColWidth, itemWidth);\n currentColHeight += itemHeight + padding;\n });\n\n totalWidth += currentColWidth;\n columnSizes.push({width: currentColWidth, height: currentColHeight}); // previous column size\n\n return totalWidth;\n }\n\n adjustHitBoxes() {\n if (!this.options.display) {\n return;\n }\n const titleHeight = this._computeTitleHeight();\n const {legendHitBoxes: hitboxes, options: {align, labels: {padding}, rtl}} = this;\n const rtlHelper = getRtlAdapter(rtl, this.left, this.width);\n if (this.isHorizontal()) {\n let row = 0;\n let left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n for (const hitbox of hitboxes) {\n if (row !== hitbox.row) {\n row = hitbox.row;\n left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n }\n hitbox.top += this.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, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n for (const hitbox of hitboxes) {\n if (hitbox.col !== col) {\n col = hitbox.col;\n top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n }\n hitbox.top = top;\n hitbox.left += this.left + padding;\n hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(hitbox.left), hitbox.width);\n top += hitbox.height + padding;\n }\n }\n }\n\n isHorizontal() {\n return this.options.position === 'top' || this.options.position === 'bottom';\n }\n\n draw() {\n if (this.options.display) {\n const ctx = this.ctx;\n clipArea(ctx, this);\n\n this._draw();\n\n unclipArea(ctx);\n }\n }\n\n /**\n\t * @private\n\t */\n _draw() {\n const {options: opts, columnSizes, lineWidths, ctx} = this;\n const {align, labels: labelOpts} = opts;\n const defaultColor = defaults.color;\n const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n const labelFont = toFont(labelOpts.font);\n const {padding} = labelOpts;\n const fontSize = labelFont.size;\n const halfFontSize = fontSize / 2;\n let cursor;\n\n this.drawTitle();\n\n // Canvas setup\n ctx.textAlign = rtlHelper.textAlign('left');\n ctx.textBaseline = 'middle';\n ctx.lineWidth = 0.5;\n ctx.font = labelFont.string;\n\n const {boxWidth, boxHeight, itemHeight} = getBoxSize(labelOpts, fontSize);\n\n // current position\n const drawLegendBox = function(x, y, legendItem) {\n if (isNaN(boxWidth) || boxWidth <= 0 || isNaN(boxHeight) || boxHeight < 0) {\n return;\n }\n\n // Set the ctx for the box\n ctx.save();\n\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\n ctx.setLineDash(valueOrDefault(legendItem.lineDash, []));\n\n if (labelOpts.usePointStyle) {\n // Recalculate x and y for drawPoint() because its expecting\n // x and y to be center of figure (instead of top left)\n const drawOptions = {\n radius: boxHeight * 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\n // Draw pointStyle as legend symbol\n drawPointLegend(ctx, drawOptions, centerX, centerY, labelOpts.pointStyleWidth && boxWidth);\n } else {\n // Draw box as legend symbol\n // Adjust position when boxHeight < fontSize (want it centered)\n const yBoxTop = y + Math.max((fontSize - boxHeight) / 2, 0);\n const xBoxLeft = rtlHelper.leftForLtr(x, boxWidth);\n const borderRadius = toTRBLCorners(legendItem.borderRadius);\n\n ctx.beginPath();\n\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\n ctx.fill();\n if (lineWidth !== 0) {\n ctx.stroke();\n }\n }\n\n ctx.restore();\n };\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\n // Horizontal\n const isHorizontal = this.isHorizontal();\n const titleHeight = this._computeTitleHeight();\n if (isHorizontal) {\n cursor = {\n x: _alignStartEnd(align, this.left + padding, this.right - lineWidths[0]),\n y: this.top + padding + titleHeight,\n line: 0\n };\n } else {\n cursor = {\n x: this.left + padding,\n y: _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[0].height),\n line: 0\n };\n }\n\n overrideTextDirection(this.ctx, opts.textDirection);\n\n const lineHeight = itemHeight + padding;\n this.legendItems.forEach((legendItem, i) => {\n ctx.strokeStyle = legendItem.fontColor; // for strikethrough effect\n ctx.fillStyle = legendItem.fontColor; // render in correct colour\n\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\n rtlHelper.setWidth(this.width);\n\n if (isHorizontal) {\n if (i > 0 && x + width + padding > this.right) {\n y = cursor.y += lineHeight;\n cursor.line++;\n x = cursor.x = _alignStartEnd(align, this.left + padding, this.right - lineWidths[cursor.line]);\n }\n } else if (i > 0 && y + lineHeight > this.bottom) {\n x = cursor.x = x + columnSizes[cursor.line].width + padding;\n cursor.line++;\n y = cursor.y = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[cursor.line].height);\n }\n\n const realX = rtlHelper.x(x);\n\n drawLegendBox(realX, y, legendItem);\n\n x = _textX(textAlign, x + boxWidth + halfFontSize, isHorizontal ? x + width : this.right, opts.rtl);\n\n // Fill the actual label\n fillText(rtlHelper.x(x), y, legendItem);\n\n if (isHorizontal) {\n cursor.x += width + padding;\n } else if (typeof legendItem.text !== 'string') {\n const fontLineHeight = labelFont.lineHeight;\n cursor.y += calculateLegendItemHeight(legendItem, fontLineHeight) + padding;\n } else {\n cursor.y += lineHeight;\n }\n });\n\n restoreTextDirection(this.ctx, opts.textDirection);\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {\n const opts = this.options;\n const titleOpts = opts.title;\n const titleFont = toFont(titleOpts.font);\n const titlePadding = toPadding(titleOpts.padding);\n\n if (!titleOpts.display) {\n return;\n }\n\n const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n const ctx = this.ctx;\n const position = titleOpts.position;\n const halfFontSize = titleFont.size / 2;\n const topPaddingPlusHalfFontSize = titlePadding.top + halfFontSize;\n let y;\n\n // These defaults are used when the legend is vertical.\n // When horizontal, they are computed below.\n let left = this.left;\n let maxWidth = this.width;\n\n if (this.isHorizontal()) {\n // Move left / right so that the title is above the legend lines\n maxWidth = Math.max(...this.lineWidths);\n y = this.top + topPaddingPlusHalfFontSize;\n left = _alignStartEnd(opts.align, left, this.right - maxWidth);\n } else {\n // Move down so that the title is above the legend stack in every alignment\n const maxHeight = this.columnSizes.reduce((acc, size) => Math.max(acc, size.height), 0);\n y = topPaddingPlusHalfFontSize + _alignStartEnd(opts.align, this.top, this.bottom - maxHeight - opts.labels.padding - this._computeTitleHeight());\n }\n\n // Now that we know the left edge of the inner legend box, compute the correct\n // X coordinate from the title alignment\n const x = _alignStartEnd(position, left, left + maxWidth);\n\n // Canvas setup\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\n renderText(ctx, titleOpts.text, x, y, titleFont);\n }\n\n /**\n\t * @private\n\t */\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\n /**\n\t * @private\n\t */\n _getLegendItemAt(x, y) {\n let i, hitBox, lh;\n\n if (_isBetween(x, this.left, this.right)\n && _isBetween(y, this.top, this.bottom)) {\n // See if we are touching one of the dataset boxes\n lh = this.legendHitBoxes;\n for (i = 0; i < lh.length; ++i) {\n hitBox = lh[i];\n\n if (_isBetween(x, hitBox.left, hitBox.left + hitBox.width)\n && _isBetween(y, hitBox.top, hitBox.top + hitBox.height)) {\n // Touching an element\n return this.legendItems[i];\n }\n }\n }\n\n return null;\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e - The event to handle\n\t */\n handleEvent(e) {\n const opts = this.options;\n if (!isListened(e.type, opts)) {\n return;\n }\n\n // Chart event already has relative position in it\n const hoveredItem = this._getLegendItemAt(e.x, e.y);\n\n if (e.type === 'mousemove' || e.type === 'mouseout') {\n const previous = this._hoveredItem;\n const sameItem = itemsEqual(previous, hoveredItem);\n if (previous && !sameItem) {\n call(opts.onLeave, [e, previous, this], this);\n }\n\n this._hoveredItem = hoveredItem;\n\n if (hoveredItem && !sameItem) {\n call(opts.onHover, [e, hoveredItem, this], this);\n }\n } else if (hoveredItem) {\n call(opts.onClick, [e, hoveredItem, this], this);\n }\n }\n}\n\nfunction calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight) {\n const itemWidth = calculateItemWidth(legendItem, boxWidth, labelFont, ctx);\n const itemHeight = calculateItemHeight(_itemHeight, legendItem, labelFont.lineHeight);\n return {itemWidth, itemHeight};\n}\n\nfunction calculateItemWidth(legendItem, boxWidth, labelFont, ctx) {\n let legendItemText = legendItem.text;\n if (legendItemText && typeof legendItemText !== 'string') {\n legendItemText = legendItemText.reduce((a, b) => a.length > b.length ? a : b);\n }\n return boxWidth + (labelFont.size / 2) + ctx.measureText(legendItemText).width;\n}\n\nfunction calculateItemHeight(_itemHeight, legendItem, fontLineHeight) {\n let itemHeight = _itemHeight;\n if (typeof legendItem.text !== 'string') {\n itemHeight = calculateLegendItemHeight(legendItem, fontLineHeight);\n }\n return itemHeight;\n}\n\nfunction calculateLegendItemHeight(legendItem, fontLineHeight) {\n const labelHeight = legendItem.text ? legendItem.text.length : 0;\n return fontLineHeight * labelHeight;\n}\n\nfunction isListened(type, opts) {\n if ((type === 'mousemove' || type === 'mouseout') && (opts.onHover || opts.onLeave)) {\n return true;\n }\n if (opts.onClick && (type === 'click' || type === 'mouseup')) {\n return true;\n }\n return false;\n}\n\nexport default {\n id: 'legend',\n\n /**\n\t * For tests\n\t * @private\n\t */\n _element: Legend,\n\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\n stop(chart) {\n layouts.removeBox(chart, chart.legend);\n delete chart.legend;\n },\n\n // During the beforeUpdate step, the layout configuration needs to run\n // This ensures that if the legend position changes (via an option update)\n // the layout system respects the change. See https://github.com/chartjs/Chart.js/issues/7527\n beforeUpdate(chart, _args, options) {\n const legend = chart.legend;\n layouts.configure(chart, legend, options);\n legend.options = options;\n },\n\n // The labels need to be built after datasets are updated to ensure that colors\n // and other styling are correct. See https://github.com/chartjs/Chart.js/issues/6968\n afterUpdate(chart) {\n const legend = chart.legend;\n legend.buildLabels();\n legend.adjustHitBoxes();\n },\n\n\n afterEvent(chart, args) {\n if (!args.replay) {\n chart.legend.handleEvent(args.event);\n }\n },\n\n defaults: {\n display: true,\n position: 'top',\n align: 'center',\n fullSize: true,\n reverse: false,\n weight: 1000,\n\n // a callback that will handle\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\n onHover: null,\n onLeave: null,\n\n labels: {\n color: (ctx) => ctx.chart.options.color,\n boxWidth: 40,\n padding: 10,\n // Generates labels shown in the legend\n // Valid properties to return:\n // text : text to display\n // fillStyle : fill of coloured box\n // strokeStyle: stroke of coloured box\n // hidden : if this legend item refers to a hidden item\n // lineCap : cap style for line\n // lineDash\n // lineDashOffset :\n // lineJoin :\n // lineWidth :\n generateLabels(chart) {\n const datasets = chart.data.datasets;\n const {labels: {usePointStyle, pointStyle, textAlign, color, useBorderRadius, borderRadius}} = chart.legend.options;\n\n return chart._getSortedDatasetMetas().map((meta) => {\n const style = meta.controller.getStyle(usePointStyle ? 0 : undefined);\n const borderWidth = toPadding(style.borderWidth);\n\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: useBorderRadius && (borderRadius || style.borderRadius),\n\n // Below is extra data used for toggling the datasets\n datasetIndex: meta.index\n };\n }, this);\n }\n },\n\n title: {\n color: (ctx) => ctx.chart.options.color,\n display: false,\n position: 'center',\n text: '',\n }\n },\n\n descriptors: {\n _scriptable: (name) => !name.startsWith('on'),\n labels: {\n _scriptable: (name) => !['generateLabels', 'filter', 'sort'].includes(name),\n }\n },\n};\n","import {Title} from './plugin.title.js';\nimport layouts from '../core/core.layouts.js';\n\nconst map = new WeakMap();\n\nexport default {\n id: 'subtitle',\n\n start(chart, _args, options) {\n const title = new Title({\n ctx: chart.ctx,\n options,\n chart\n });\n\n layouts.configure(chart, title, options);\n layouts.addBox(chart, title);\n map.set(chart, title);\n },\n\n stop(chart) {\n layouts.removeBox(chart, map.get(chart));\n map.delete(chart);\n },\n\n beforeUpdate(chart, _args, options) {\n const title = map.get(chart);\n layouts.configure(chart, title, options);\n title.options = options;\n },\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 // by default greater than legend (1000) and smaller than title (2000)\n },\n\n defaultRoutes: {\n color: 'color'\n },\n\n descriptors: {\n _scriptable: true,\n _indexable: false,\n },\n};\n","import Element from '../core/core.element.js';\nimport layouts from '../core/core.layouts.js';\nimport {PI, isArray, toPadding, toFont} from '../helpers/index.js';\nimport {_toLeftRightCenter, _alignStartEnd} from '../helpers/helpers.extras.js';\nimport {renderText} from '../helpers/helpers.canvas.js';\n\nexport class Title extends Element {\n /**\n\t * @param {{ ctx: any; options: any; chart: any; }} config\n\t */\n constructor(config) {\n super();\n\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\n update(maxWidth, maxHeight) {\n const opts = this.options;\n\n this.left = 0;\n this.top = 0;\n\n if (!opts.display) {\n this.width = this.height = this.right = this.bottom = 0;\n return;\n }\n\n this.width = this.right = maxWidth;\n this.height = this.bottom = maxHeight;\n\n const lineCount = isArray(opts.text) ? opts.text.length : 1;\n this._padding = toPadding(opts.padding);\n const textSize = lineCount * toFont(opts.font).lineHeight + this._padding.height;\n\n if (this.isHorizontal()) {\n this.height = textSize;\n } else {\n this.width = textSize;\n }\n }\n\n isHorizontal() {\n const pos = this.options.position;\n return pos === 'top' || pos === 'bottom';\n }\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\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\n draw() {\n const ctx = this.ctx;\n const opts = this.options;\n\n if (!opts.display) {\n return;\n }\n\n const fontOpts = toFont(opts.font);\n const lineHeight = fontOpts.lineHeight;\n const offset = lineHeight / 2 + this._padding.top;\n const {titleX, titleY, maxWidth, rotation} = this._drawArgs(offset);\n\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}\n\nfunction createTitle(chart, titleOpts) {\n const title = new Title({\n ctx: chart.ctx,\n options: titleOpts,\n chart\n });\n\n layouts.configure(chart, title, titleOpts);\n layouts.addBox(chart, title);\n chart.titleBlock = title;\n}\n\nexport default {\n id: 'title',\n\n /**\n\t * For tests\n\t * @private\n\t */\n _element: Title,\n\n start(chart, _args, options) {\n createTitle(chart, options);\n },\n\n stop(chart) {\n const titleBlock = chart.titleBlock;\n layouts.removeBox(chart, titleBlock);\n delete chart.titleBlock;\n },\n\n beforeUpdate(chart, _args, options) {\n const title = chart.titleBlock;\n layouts.configure(chart, title, options);\n title.options = options;\n },\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 // by default greater than legend (1000) to be above\n },\n\n defaultRoutes: {\n color: 'color'\n },\n\n descriptors: {\n _scriptable: true,\n _indexable: false,\n },\n};\n","import Animations from '../core/core.animations.js';\nimport Element from '../core/core.element.js';\nimport {addRoundedRectPath} from '../helpers/helpers.canvas.js';\nimport {each, noop, isNullOrUndef, isArray, _elementsEqual, isObject} from '../helpers/helpers.core.js';\nimport {toFont, toPadding, toTRBLCorners} from '../helpers/helpers.options.js';\nimport {getRtlAdapter, overrideTextDirection, restoreTextDirection} from '../helpers/helpers.rtl.js';\nimport {distanceBetweenPoints, _limitValue} from '../helpers/helpers.math.js';\nimport {createContext, drawPoint} from '../helpers/index.js';\n\n/**\n * @typedef { import('../platform/platform.base.js').Chart } Chart\n * @typedef { import('../types/index.js').ChartEvent } ChartEvent\n * @typedef { import('../types/index.js').ActiveElement } ActiveElement\n * @typedef { import('../core/core.interaction.js').InteractionItem } InteractionItem\n */\n\nconst positioners = {\n /**\n\t * Average mode places the tooltip at the average position of the elements shown\n\t */\n average(items) {\n if (!items.length) {\n return false;\n }\n\n let i, len;\n let x = 0;\n let y = 0;\n let count = 0;\n\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\n return {\n x: x / count,\n y: y / count\n };\n },\n\n /**\n\t * Gets the tooltip position nearest of the item nearest to the event position\n\t */\n nearest(items, eventPosition) {\n if (!items.length) {\n return false;\n }\n\n let x = eventPosition.x;\n let y = eventPosition.y;\n let minDistance = Number.POSITIVE_INFINITY;\n let i, len, nearestElement;\n\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\n if (d < minDistance) {\n minDistance = d;\n nearestElement = el;\n }\n }\n }\n\n if (nearestElement) {\n const tp = nearestElement.tooltipPosition();\n x = tp.x;\n y = tp.y;\n }\n\n return {\n x,\n y\n };\n }\n};\n\n// Helper to push or concat based on if the 2nd parameter is an array or not\nfunction pushOrConcat(base, toPush) {\n if (toPush) {\n if (isArray(toPush)) {\n // base = base.concat(toPush);\n Array.prototype.push.apply(base, toPush);\n } else {\n base.push(toPush);\n }\n }\n\n return base;\n}\n\n/**\n * Returns array of strings split by newline\n * @param {*} str - The value to split by newline.\n * @returns {string|string[]} value if newline present - Returned from String split() method\n * @function\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}\n\n\n/**\n * Private helper to create a tooltip item model\n * @param {Chart} chart\n * @param {ActiveElement} item - {element, index, datasetIndex} to create the tooltip item for\n * @return new tooltip item\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\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}\n\n/**\n * Get the size of the tooltip\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\n const padding = toPadding(options.padding);\n let height = padding.height;\n let width = 0;\n\n // Count of all lines in the body\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\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 // Body lines may include some extra height depending on boxHeight\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\n // Title width\n let widthPadding = 0;\n const maxLineWidth = function(line) {\n width = Math.max(width, ctx.measureText(line).width + widthPadding);\n };\n\n ctx.save();\n\n ctx.font = titleFont.string;\n each(tooltip.title, maxLineWidth);\n\n // Body width\n ctx.font = bodyFont.string;\n each(tooltip.beforeBody.concat(tooltip.afterBody), maxLineWidth);\n\n // Body lines may include some extra width due to the color box\n widthPadding = options.displayColors ? (boxWidth + 2 + options.boxPadding) : 0;\n each(body, (bodyItem) => {\n each(bodyItem.before, maxLineWidth);\n each(bodyItem.lines, maxLineWidth);\n each(bodyItem.after, maxLineWidth);\n });\n\n // Reset back to 0\n widthPadding = 0;\n\n // Footer width\n ctx.font = footerFont.string;\n each(tooltip.footer, maxLineWidth);\n\n ctx.restore();\n\n // Add padding\n width += padding.width;\n\n return {width, height};\n}\n\nfunction determineYAlign(chart, size) {\n const {y, height} = size;\n\n if (y < height / 2) {\n return 'top';\n } else if (y > (chart.height - height / 2)) {\n return 'bottom';\n }\n return 'center';\n}\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\n if (xAlign === 'right' && x - width - caret < 0) {\n return true;\n }\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\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\n if (doesNotFitWithAlign(xAlign, chart, options, size)) {\n xAlign = 'center';\n }\n\n return xAlign;\n}\n\n/**\n * Helper to get the alignment of a tooltip given the size\n */\nfunction determineAlignment(chart, options, size) {\n const yAlign = size.yAlign || options.yAlign || determineYAlign(chart, size);\n\n return {\n xAlign: size.xAlign || options.xAlign || determineXAlign(chart, options, size, yAlign),\n yAlign\n };\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}\n\nfunction alignY(size, yAlign, paddingAndSize) {\n // eslint-disable-next-line prefer-const\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}\n\n/**\n * Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment\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 {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(cornerRadius);\n\n let x = alignX(size, xAlign);\n const y = alignY(size, yAlign, paddingAndSize);\n\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 -= Math.max(topLeft, bottomLeft) + caretSize;\n } else if (xAlign === 'right') {\n x += Math.max(topRight, bottomRight) + caretSize;\n }\n\n return {\n x: _limitValue(x, 0, chart.width - size.width),\n y: _limitValue(y, 0, chart.height - size.height)\n };\n}\n\nfunction getAlignedX(tooltip, align, options) {\n const padding = toPadding(options.padding);\n\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}\n\n/**\n * Helper to build before and after body lines\n */\nfunction getBeforeAfterBodyLines(callback) {\n return pushOrConcat([], splitNewlines(callback));\n}\n\nfunction createTooltipContext(parent, tooltip, tooltipItems) {\n return createContext(parent, {\n tooltip,\n tooltipItems,\n type: 'tooltip'\n });\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}\n\nconst defaultCallbacks = {\n // Args are: (tooltipItems, data)\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\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\n return '';\n },\n afterTitle: noop,\n\n // Args are: (tooltipItems, data)\n beforeBody: noop,\n\n // Args are: (tooltipItem, data)\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\n let label = tooltipItem.dataset.label || '';\n\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\n // Args are: (tooltipItems, data)\n afterBody: noop,\n\n // Args are: (tooltipItems, data)\n beforeFooter: noop,\n footer: noop,\n afterFooter: noop\n};\n\n/**\n * Invoke callback from object with context and arguments.\n * If callback returns `undefined`, then will be invoked default callback.\n * @param {Record} callbacks\n * @param {keyof typeof defaultCallbacks} name\n * @param {*} ctx\n * @param {*} arg\n * @returns {any}\n */\nfunction invokeCallbackWithFallback(callbacks, name, ctx, arg) {\n const result = callbacks[name].call(ctx, arg);\n\n if (typeof result === 'undefined') {\n return defaultCallbacks[name].call(ctx, arg);\n }\n\n return result;\n}\n\nexport class Tooltip extends Element {\n\n /**\n * @namespace Chart.Tooltip.positioners\n */\n static positioners = positioners;\n\n constructor(config) {\n super();\n\n this.opacity = 0;\n this._active = [];\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.chart = config.chart;\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 // TODO: V4, make this private, rename to `_labelStyles`, and combine with `labelPointStyles`\n // and `labelTextColors` to create a single variable\n this.labelColors = undefined;\n this.labelPointStyles = undefined;\n this.labelTextColors = undefined;\n }\n\n initialize(options) {\n this.options = options;\n this._cachedAnimations = undefined;\n this.$context = undefined;\n }\n\n /**\n\t * @private\n\t */\n _resolveAnimations() {\n const cached = this._cachedAnimations;\n\n if (cached) {\n return cached;\n }\n\n const chart = this.chart;\n const options = this.options.setContext(this.getContext());\n const opts = options.enabled && chart.options.animation && options.animations;\n const animations = new Animations(this.chart, opts);\n if (opts._cacheable) {\n this._cachedAnimations = Object.freeze(animations);\n }\n\n return animations;\n }\n\n /**\n\t * @protected\n\t */\n getContext() {\n return this.$context ||\n\t\t\t(this.$context = createTooltipContext(this.chart.getContext(), this, this._tooltipItems));\n }\n\n getTitle(context, options) {\n const {callbacks} = options;\n\n const beforeTitle = invokeCallbackWithFallback(callbacks, 'beforeTitle', this, context);\n const title = invokeCallbackWithFallback(callbacks, 'title', this, context);\n const afterTitle = invokeCallbackWithFallback(callbacks, 'afterTitle', this, context);\n\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeTitle));\n lines = pushOrConcat(lines, splitNewlines(title));\n lines = pushOrConcat(lines, splitNewlines(afterTitle));\n\n return lines;\n }\n\n getBeforeBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(\n invokeCallbackWithFallback(options.callbacks, 'beforeBody', this, tooltipItems)\n );\n }\n\n getBody(tooltipItems, options) {\n const {callbacks} = options;\n const bodyItems = [];\n\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(invokeCallbackWithFallback(scoped, 'beforeLabel', this, context)));\n pushOrConcat(bodyItem.lines, invokeCallbackWithFallback(scoped, 'label', this, context));\n pushOrConcat(bodyItem.after, splitNewlines(invokeCallbackWithFallback(scoped, 'afterLabel', this, context)));\n\n bodyItems.push(bodyItem);\n });\n\n return bodyItems;\n }\n\n getAfterBody(tooltipItems, options) {\n return getBeforeAfterBodyLines(\n invokeCallbackWithFallback(options.callbacks, 'afterBody', this, tooltipItems)\n );\n }\n\n // Get the footer and beforeFooter and afterFooter lines\n getFooter(tooltipItems, options) {\n const {callbacks} = options;\n\n const beforeFooter = invokeCallbackWithFallback(callbacks, 'beforeFooter', this, tooltipItems);\n const footer = invokeCallbackWithFallback(callbacks, 'footer', this, tooltipItems);\n const afterFooter = invokeCallbackWithFallback(callbacks, 'afterFooter', this, tooltipItems);\n\n let lines = [];\n lines = pushOrConcat(lines, splitNewlines(beforeFooter));\n lines = pushOrConcat(lines, splitNewlines(footer));\n lines = pushOrConcat(lines, splitNewlines(afterFooter));\n\n return lines;\n }\n\n /**\n\t * @private\n\t */\n _createItems(options) {\n const active = this._active;\n const data = this.chart.data;\n const labelColors = [];\n const labelPointStyles = [];\n const labelTextColors = [];\n let tooltipItems = [];\n let i, len;\n\n for (i = 0, len = active.length; i < len; ++i) {\n tooltipItems.push(createTooltipItem(this.chart, active[i]));\n }\n\n // If the user provided a filter function, use it to modify the tooltip items\n if (options.filter) {\n tooltipItems = tooltipItems.filter((element, index, array) => options.filter(element, index, array, data));\n }\n\n // If the user provided a sorting function, use it to modify the tooltip items\n if (options.itemSort) {\n tooltipItems = tooltipItems.sort((a, b) => options.itemSort(a, b, data));\n }\n\n // Determine colors for boxes\n each(tooltipItems, (context) => {\n const scoped = overrideCallbacks(options.callbacks, context);\n labelColors.push(invokeCallbackWithFallback(scoped, 'labelColor', this, context));\n labelPointStyles.push(invokeCallbackWithFallback(scoped, 'labelPointStyle', this, context));\n labelTextColors.push(invokeCallbackWithFallback(scoped, 'labelTextColor', this, context));\n });\n\n this.labelColors = labelColors;\n this.labelPointStyles = labelPointStyles;\n this.labelTextColors = labelTextColors;\n this.dataPoints = tooltipItems;\n return tooltipItems;\n }\n\n update(changed, replay) {\n const options = this.options.setContext(this.getContext());\n const active = this._active;\n let properties;\n let tooltipItems = [];\n\n if (!active.length) {\n if (this.opacity !== 0) {\n properties = {\n opacity: 0\n };\n }\n } else {\n const position = positioners[options.position].call(this, active, this._eventPosition);\n tooltipItems = this._createItems(options);\n\n this.title = this.getTitle(tooltipItems, options);\n this.beforeBody = this.getBeforeBody(tooltipItems, options);\n this.body = this.getBody(tooltipItems, options);\n this.afterBody = this.getAfterBody(tooltipItems, options);\n this.footer = this.getFooter(tooltipItems, options);\n\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, size);\n const alignment = determineAlignment(this.chart, options, positionAndSize);\n const backgroundPoint = getBackgroundPoint(options, positionAndSize, alignment, this.chart);\n\n this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n\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\n this._tooltipItems = tooltipItems;\n this.$context = undefined;\n\n if (properties) {\n this._resolveAnimations().update(this, properties);\n }\n\n if (changed && options.external) {\n options.external.call(this, {chart: this.chart, tooltip: this, replay});\n }\n }\n\n drawCaret(tooltipPoint, ctx, size, options) {\n const caretPosition = this.getCaretPosition(tooltipPoint, size, options);\n\n ctx.lineTo(caretPosition.x1, caretPosition.y1);\n ctx.lineTo(caretPosition.x2, caretPosition.y2);\n ctx.lineTo(caretPosition.x3, caretPosition.y3);\n }\n\n getCaretPosition(tooltipPoint, size, options) {\n const {xAlign, yAlign} = this;\n const {caretSize, cornerRadius} = options;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(cornerRadius);\n const {x: ptX, y: ptY} = tooltipPoint;\n const {width, height} = size;\n let x1, x2, x3, y1, y2, y3;\n\n if (yAlign === 'center') {\n y2 = ptY + (height / 2);\n\n if (xAlign === 'left') {\n x1 = ptX;\n x2 = x1 - caretSize;\n\n // Left draws bottom -> top, this y1 is on the bottom\n y1 = y2 + caretSize;\n y3 = y2 - caretSize;\n } else {\n x1 = ptX + width;\n x2 = x1 + caretSize;\n\n // Right draws top -> bottom, thus y1 is on the top\n y1 = y2 - caretSize;\n y3 = y2 + caretSize;\n }\n\n x3 = x1;\n } else {\n if (xAlign === 'left') {\n x2 = ptX + Math.max(topLeft, bottomLeft) + (caretSize);\n } else if (xAlign === 'right') {\n x2 = ptX + width - Math.max(topRight, bottomRight) - caretSize;\n } else {\n x2 = this.caretX;\n }\n\n if (yAlign === 'top') {\n y1 = ptY;\n y2 = y1 - caretSize;\n\n // Top draws left -> right, thus x1 is on the left\n x1 = x2 - caretSize;\n x3 = x2 + caretSize;\n } else {\n y1 = ptY + height;\n y2 = y1 + caretSize;\n\n // Bottom draws right -> left, thus x1 is on the right\n x1 = x2 + caretSize;\n x3 = x2 - caretSize;\n }\n y3 = y1;\n }\n return {x1, x2, x3, y1, y2, y3};\n }\n\n drawTitle(pt, ctx, options) {\n const title = this.title;\n const length = title.length;\n let titleFont, titleSpacing, i;\n\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n pt.x = getAlignedX(this, options.titleAlign, options);\n\n ctx.textAlign = rtlHelper.textAlign(options.titleAlign);\n ctx.textBaseline = 'middle';\n\n titleFont = toFont(options.titleFont);\n titleSpacing = options.titleSpacing;\n\n ctx.fillStyle = options.titleColor;\n ctx.font = titleFont.string;\n\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; // Line Height and spacing\n\n if (i + 1 === length) {\n pt.y += options.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing\n }\n }\n }\n }\n\n /**\n\t * @private\n\t */\n _drawColorBox(ctx, pt, i, rtlHelper, options) {\n const labelColor = this.labelColors[i];\n const labelPointStyle = this.labelPointStyles[i];\n const {boxHeight, boxWidth} = options;\n const bodyFont = toFont(options.bodyFont);\n const colorX = getAlignedX(this, '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\n if (options.usePointStyle) {\n const drawOptions = {\n radius: Math.min(boxWidth, boxHeight) / 2, // fit the circle in the box\n pointStyle: labelPointStyle.pointStyle,\n rotation: labelPointStyle.rotation,\n borderWidth: 1\n };\n // Recalculate x and y for drawPoint() because its expecting\n // x and y to be center of figure (instead of top left)\n const centerX = rtlHelper.leftForLtr(rtlColorX, boxWidth) + boxWidth / 2;\n const centerY = colorY + boxHeight / 2;\n\n // Fill the point with white so that colours merge nicely if the opacity is < 1\n ctx.strokeStyle = options.multiKeyBackground;\n ctx.fillStyle = options.multiKeyBackground;\n drawPoint(ctx, drawOptions, centerX, centerY);\n\n // Draw the point\n ctx.strokeStyle = labelColor.borderColor;\n ctx.fillStyle = labelColor.backgroundColor;\n drawPoint(ctx, drawOptions, centerX, centerY);\n } else {\n // Border\n ctx.lineWidth = isObject(labelColor.borderWidth) ? Math.max(...Object.values(labelColor.borderWidth)) : (labelColor.borderWidth || 1); // TODO, v4 remove fallback\n ctx.strokeStyle = labelColor.borderColor;\n ctx.setLineDash(labelColor.borderDash || []);\n ctx.lineDashOffset = labelColor.borderDashOffset || 0;\n\n // Fill a white rect so that colours merge nicely if the opacity is < 1\n const outerX = rtlHelper.leftForLtr(rtlColorX, boxWidth);\n const innerX = rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), boxWidth - 2);\n const borderRadius = toTRBLCorners(labelColor.borderRadius);\n\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\n // Inner square\n ctx.fillStyle = labelColor.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 // Normal rect\n ctx.fillStyle = options.multiKeyBackground;\n ctx.fillRect(outerX, colorY, boxWidth, boxHeight);\n ctx.strokeRect(outerX, colorY, boxWidth, boxHeight);\n // Inner square\n ctx.fillStyle = labelColor.backgroundColor;\n ctx.fillRect(innerX, colorY + 1, boxWidth - 2, boxHeight - 2);\n }\n }\n\n // restore fillStyle\n ctx.fillStyle = this.labelTextColors[i];\n }\n\n drawBody(pt, ctx, options) {\n const {body} = this;\n const {bodySpacing, bodyAlign, displayColors, boxHeight, boxWidth, boxPadding} = options;\n const bodyFont = toFont(options.bodyFont);\n let bodyLineHeight = bodyFont.lineHeight;\n let xLinePadding = 0;\n\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\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\n const bodyAlignForCalculation = rtlHelper.textAlign(bodyAlign);\n let bodyItem, textColor, lines, i, j, ilen, jlen;\n\n ctx.textAlign = bodyAlign;\n ctx.textBaseline = 'middle';\n ctx.font = bodyFont.string;\n\n pt.x = getAlignedX(this, bodyAlignForCalculation, options);\n\n // Before body lines\n ctx.fillStyle = options.bodyColor;\n each(this.beforeBody, fillLineOfText);\n\n xLinePadding = displayColors && bodyAlignForCalculation !== 'right'\n ? bodyAlign === 'center' ? (boxWidth / 2 + boxPadding) : (boxWidth + 2 + boxPadding)\n : 0;\n\n // Draw body lines now\n for (i = 0, ilen = body.length; i < ilen; ++i) {\n bodyItem = body[i];\n textColor = this.labelTextColors[i];\n\n ctx.fillStyle = textColor;\n each(bodyItem.before, fillLineOfText);\n\n lines = bodyItem.lines;\n // Draw Legend-like boxes if needed\n if (displayColors && lines.length) {\n this._drawColorBox(ctx, pt, i, rtlHelper, options);\n bodyLineHeight = Math.max(bodyFont.lineHeight, boxHeight);\n }\n\n for (j = 0, jlen = lines.length; j < jlen; ++j) {\n fillLineOfText(lines[j]);\n // Reset for any lines that don't include colorbox\n bodyLineHeight = bodyFont.lineHeight;\n }\n\n each(bodyItem.after, fillLineOfText);\n }\n\n // Reset back to 0 for after body\n xLinePadding = 0;\n bodyLineHeight = bodyFont.lineHeight;\n\n // After body lines\n each(this.afterBody, fillLineOfText);\n pt.y -= bodySpacing; // Remove last body spacing\n }\n\n drawFooter(pt, ctx, options) {\n const footer = this.footer;\n const length = footer.length;\n let footerFont, i;\n\n if (length) {\n const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n\n pt.x = getAlignedX(this, options.footerAlign, options);\n pt.y += options.footerMarginTop;\n\n ctx.textAlign = rtlHelper.textAlign(options.footerAlign);\n ctx.textBaseline = 'middle';\n\n footerFont = toFont(options.footerFont);\n\n ctx.fillStyle = options.footerColor;\n ctx.font = footerFont.string;\n\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\n drawBackground(pt, ctx, tooltipSize, options) {\n const {xAlign, yAlign} = this;\n const {x, y} = pt;\n const {width, height} = tooltipSize;\n const {topLeft, topRight, bottomLeft, bottomRight} = toTRBLCorners(options.cornerRadius);\n\n ctx.fillStyle = options.backgroundColor;\n ctx.strokeStyle = options.borderColor;\n ctx.lineWidth = options.borderWidth;\n\n ctx.beginPath();\n ctx.moveTo(x + topLeft, y);\n if (yAlign === 'top') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width - topRight, y);\n ctx.quadraticCurveTo(x + width, y, x + width, y + topRight);\n if (yAlign === 'center' && xAlign === 'right') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + width, y + height - bottomRight);\n ctx.quadraticCurveTo(x + width, y + height, x + width - bottomRight, y + height);\n if (yAlign === 'bottom') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x + bottomLeft, y + height);\n ctx.quadraticCurveTo(x, y + height, x, y + height - bottomLeft);\n if (yAlign === 'center' && xAlign === 'left') {\n this.drawCaret(pt, ctx, tooltipSize, options);\n }\n ctx.lineTo(x, y + topLeft);\n ctx.quadraticCurveTo(x, y, x + topLeft, y);\n ctx.closePath();\n\n ctx.fill();\n\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n }\n\n /**\n\t * Update x/y animation targets when _active elements are animating too\n\t * @private\n\t */\n _updateAnimationTarget(options) {\n const chart = this.chart;\n const anims = this.$animations;\n const animX = anims && anims.x;\n const animY = anims && anims.y;\n if (animX || animY) {\n const position = positioners[options.position].call(this, this._active, this._eventPosition);\n if (!position) {\n return;\n }\n const size = this._size = getTooltipSize(this, options);\n const positionAndSize = Object.assign({}, position, this._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 this.xAlign = alignment.xAlign;\n this.yAlign = alignment.yAlign;\n this.width = size.width;\n this.height = size.height;\n this.caretX = position.x;\n this.caretY = position.y;\n this._resolveAnimations().update(this, point);\n }\n }\n }\n\n /**\n * Determine if the tooltip will draw anything\n * @returns {boolean} True if the tooltip will render\n */\n _willRender() {\n return !!this.opacity;\n }\n\n draw(ctx) {\n const options = this.options.setContext(this.getContext());\n let opacity = this.opacity;\n\n if (!opacity) {\n return;\n }\n\n this._updateAnimationTarget(options);\n\n const tooltipSize = {\n width: this.width,\n height: this.height\n };\n const pt = {\n x: this.x,\n y: this.y\n };\n\n // IE11/Edge does not like very small opacities, so snap to 0\n opacity = Math.abs(opacity) < 1e-3 ? 0 : opacity;\n\n const padding = toPadding(options.padding);\n\n // Truthy/falsey value for empty tooltip\n const hasTooltipContent = this.title.length || this.beforeBody.length || this.body.length || this.afterBody.length || this.footer.length;\n\n if (options.enabled && hasTooltipContent) {\n ctx.save();\n ctx.globalAlpha = opacity;\n\n // Draw Background\n this.drawBackground(pt, ctx, tooltipSize, options);\n\n overrideTextDirection(ctx, options.textDirection);\n\n pt.y += padding.top;\n\n // Titles\n this.drawTitle(pt, ctx, options);\n\n // Body\n this.drawBody(pt, ctx, options);\n\n // Footer\n this.drawFooter(pt, ctx, options);\n\n restoreTextDirection(ctx, options.textDirection);\n\n ctx.restore();\n }\n }\n\n /**\n\t * Get active elements in the tooltip\n\t * @returns {Array} Array of elements that are active in the tooltip\n\t */\n getActiveElements() {\n return this._active || [];\n }\n\n /**\n\t * Set active elements in the tooltip\n\t * @param {array} activeElements Array of active datasetIndex/index pairs.\n\t * @param {object} eventPosition Synthetic event position used in positioning\n\t */\n setActiveElements(activeElements, eventPosition) {\n const lastActive = this._active;\n const active = activeElements.map(({datasetIndex, index}) => {\n const meta = this.chart.getDatasetMeta(datasetIndex);\n\n if (!meta) {\n throw new Error('Cannot find a dataset at index ' + datasetIndex);\n }\n\n return {\n datasetIndex,\n element: meta.data[index],\n index,\n };\n });\n const changed = !_elementsEqual(lastActive, active);\n const positionChanged = this._positionChanged(active, eventPosition);\n\n if (changed || positionChanged) {\n this._active = active;\n this._eventPosition = eventPosition;\n this._ignoreReplayEvents = true;\n this.update(true);\n }\n }\n\n /**\n\t * Handle an event\n\t * @param {ChartEvent} e - The event to handle\n\t * @param {boolean} [replay] - This is a replayed event (from update)\n\t * @param {boolean} [inChartArea] - The event is inside chartArea\n\t * @returns {boolean} true if the tooltip changed\n\t */\n handleEvent(e, replay, inChartArea = true) {\n if (replay && this._ignoreReplayEvents) {\n return false;\n }\n this._ignoreReplayEvents = false;\n\n const options = this.options;\n const lastActive = this._active || [];\n const active = this._getActiveElements(e, lastActive, replay, inChartArea);\n\n // When there are multiple items shown, but the tooltip position is nearest mode\n // an update may need to be made because our position may have changed even though\n // the items are the same as before.\n const positionChanged = this._positionChanged(active, e);\n\n // Remember Last Actives\n const changed = replay || !_elementsEqual(active, lastActive) || positionChanged;\n\n // Only handle target event on tooltip change\n if (changed) {\n this._active = active;\n\n if (options.enabled || options.external) {\n this._eventPosition = {\n x: e.x,\n y: e.y\n };\n\n this.update(true, replay);\n }\n }\n\n return changed;\n }\n\n /**\n\t * Helper for determining the active elements for event\n\t * @param {ChartEvent} e - The event to handle\n\t * @param {InteractionItem[]} lastActive - Previously active elements\n\t * @param {boolean} [replay] - This is a replayed event (from update)\n\t * @param {boolean} [inChartArea] - The event is inside chartArea\n\t * @returns {InteractionItem[]} - Active elements\n\t * @private\n\t */\n _getActiveElements(e, lastActive, replay, inChartArea) {\n const options = this.options;\n\n if (e.type === 'mouseout') {\n return [];\n }\n\n if (!inChartArea) {\n // Let user control the active elements outside chartArea. Eg. using Legend.\n return lastActive;\n }\n\n // Find Active Elements for tooltips\n const active = this.chart.getElementsAtEventForMode(e, options.mode, options, replay);\n\n if (options.reverse) {\n active.reverse();\n }\n\n return active;\n }\n\n /**\n\t * Determine if the active elements + event combination changes the\n\t * tooltip position\n\t * @param {array} active - Active elements\n\t * @param {ChartEvent} e - Event that triggered the position change\n\t * @returns {boolean} True if the position has changed\n\t */\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}\n\nexport default {\n id: 'tooltip',\n _element: Tooltip,\n positioners,\n\n afterInit(chart, _args, options) {\n if (options) {\n chart.tooltip = new Tooltip({chart, options});\n }\n },\n\n beforeUpdate(chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n\n reset(chart, _args, options) {\n if (chart.tooltip) {\n chart.tooltip.initialize(options);\n }\n },\n\n afterDraw(chart) {\n const tooltip = chart.tooltip;\n\n if (tooltip && tooltip._willRender()) {\n const args = {\n tooltip\n };\n\n if (chart.notifyPlugins('beforeTooltipDraw', {...args, cancelable: true}) === false) {\n return;\n }\n\n tooltip.draw(chart.ctx);\n\n chart.notifyPlugins('afterTooltipDraw', args);\n }\n },\n\n afterEvent(chart, args) {\n if (chart.tooltip) {\n // If the event is replayed from `update`, we should evaluate with the final positions.\n const useFinalPosition = args.replay;\n if (chart.tooltip.handleEvent(args.event, useFinalPosition, args.inChartArea)) {\n // notify chart about the change, so it will render\n args.changed = true;\n }\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 boxPadding: 0,\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: defaultCallbacks\n },\n\n defaultRoutes: {\n bodyFont: 'font',\n footerFont: 'font',\n titleFont: 'font'\n },\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\n // Resolve additionally from `interaction` options and defaults.\n additionalOptionScopes: ['interaction']\n};\n","import Scale from '../core/core.scale.js';\nimport {isNullOrUndef, valueOrDefault, _limitValue} from '../helpers/index.js';\n\nconst addIfString = (labels, raw, index, addedLabels) => {\n if (typeof raw === 'string') {\n index = labels.push(raw) - 1;\n addedLabels.unshift({index, label: raw});\n } else if (isNaN(raw)) {\n index = null;\n }\n return index;\n};\n\nfunction findOrAddLabel(labels, raw, index, addedLabels) {\n const first = labels.indexOf(raw);\n if (first === -1) {\n return addIfString(labels, raw, index, addedLabels);\n }\n const last = labels.lastIndexOf(raw);\n return first !== last ? index : first;\n}\n\nconst validIndex = (index, max) => index === null ? null : _limitValue(Math.round(index), 0, max);\n\nfunction _getLabelForValue(value) {\n const labels = this.getLabels();\n\n if (value >= 0 && value < labels.length) {\n return labels[value];\n }\n return value;\n}\n\nexport default class CategoryScale extends Scale {\n\n static id = 'category';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: _getLabelForValue\n }\n };\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this._startValue = undefined;\n this._valueRange = 0;\n this._addedLabels = [];\n }\n\n init(scaleOptions) {\n const added = this._addedLabels;\n if (added.length) {\n const labels = this.getLabels();\n for (const {index, label} of added) {\n if (labels[index] === label) {\n labels.splice(index, 1);\n }\n }\n this._addedLabels = [];\n }\n super.init(scaleOptions);\n }\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), this._addedLabels);\n return validIndex(index, labels.length - 1);\n }\n\n determineDataLimits() {\n const {minDefined, maxDefined} = this.getUserBounds();\n let {min, max} = this.getMinMax(true);\n\n if (this.options.bounds === 'ticks') {\n if (!minDefined) {\n min = 0;\n }\n if (!maxDefined) {\n max = this.getLabels().length - 1;\n }\n }\n\n this.min = min;\n this.max = max;\n }\n\n buildTicks() {\n const min = this.min;\n const max = this.max;\n const offset = this.options.offset;\n const ticks = [];\n let labels = this.getLabels();\n\n // If we are viewing some subset of labels, slice the original array\n labels = (min === 0 && max === labels.length - 1) ? labels : labels.slice(min, max + 1);\n\n this._valueRange = Math.max(labels.length - (offset ? 0 : 1), 1);\n this._startValue = this.min - (offset ? 0.5 : 0);\n\n for (let value = min; value <= max; value++) {\n ticks.push({value});\n }\n return ticks;\n }\n\n getLabelForValue(value) {\n return _getLabelForValue.call(this, value);\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n super.configure();\n\n if (!this.isHorizontal()) {\n // For backward compatibility, vertical category scale reverse is inverted.\n this._reversePixels = !this._reversePixels;\n }\n }\n\n // Used to get data value locations. Value can either be an index or a numerical value\n getPixelForValue(value) {\n if (typeof value !== 'number') {\n value = this.parse(value);\n }\n\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n\n // Must override base implementation because it calls getPixelForValue\n // and category scale can have duplicate values\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\n getValueForPixel(pixel) {\n return Math.round(this._startValue + this.getDecimalForPixel(pixel) * this._valueRange);\n }\n\n getBasePixel() {\n return this.bottom;\n }\n}\n","import {isNullOrUndef} from '../helpers/helpers.core.js';\nimport {almostEquals, almostWhole, niceNum, _decimalPlaces, _setMinAndMaxByKey, sign, toRadians} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\n\n/**\n * Generate a set of linear ticks for an axis\n * 1. If generationOptions.min, generationOptions.max, and generationOptions.step are defined:\n * if (max - min) / step is an integer, ticks are generated as [min, min + step, ..., max]\n * Note that the generationOptions.maxCount setting is respected in this scenario\n *\n * 2. If generationOptions.min, generationOptions.max, and generationOptions.count is defined\n * spacing = (max - min) / count\n * Ticks are generated as [min, min + spacing, ..., max]\n *\n * 3. If generationOptions.count is defined\n * spacing = (niceMax - niceMin) / count\n *\n * 4. Compute optimal spacing of ticks using niceNum algorithm\n *\n * @param generationOptions the options used to generate the ticks\n * @param dataRange the range of the data\n * @returns {object[]} array of tick objects\n */\nfunction generateTicks(generationOptions, dataRange) {\n const ticks = [];\n // To get a \"nice\" value for the tick spacing, we will use the appropriately named\n // \"nice number\" algorithm. See https://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks\n // for details.\n\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\n // Beyond MIN_SPACING floating point numbers being to lose precision\n // such that we can't do the math necessary to generate ticks\n if (spacing < MIN_SPACING && !minDefined && !maxDefined) {\n return [{value: rmin}, {value: rmax}];\n }\n\n numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing);\n if (numSpaces > maxSpaces) {\n // If the calculated num of spaces exceeds maxNumSpaces, recalculate it\n spacing = niceNum(numSpaces * spacing / maxSpaces / unit) * unit;\n }\n\n if (!isNullOrUndef(precision)) {\n // If the user specified a precision, round to that number of decimal places\n factor = Math.pow(10, precision);\n spacing = Math.ceil(spacing * factor) / factor;\n }\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\n if (minDefined && maxDefined && step && almostWhole((max - min) / step, spacing / 1000)) {\n // Case 1: If min, max and stepSize are set and they make an evenly spaced scale use it.\n // spacing = step;\n // numSpaces = (max - min) / spacing;\n // Note that we round here to handle the case where almostWhole translated an FP error\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 // Cases 2 & 3, we have a count specified. Handle optional user defined edges to the range.\n // Sometimes these are no-ops, but it makes the code a lot clearer\n // and when a user defined range is specified, we want the correct ticks\n niceMin = minDefined ? min : niceMin;\n niceMax = maxDefined ? max : niceMax;\n numSpaces = count - 1;\n spacing = (niceMax - niceMin) / numSpaces;\n } else {\n // Case 4\n numSpaces = (niceMax - niceMin) / spacing;\n\n // If very close to our rounded value, use it.\n if (almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n numSpaces = Math.round(numSpaces);\n } else {\n numSpaces = Math.ceil(numSpaces);\n }\n }\n\n // The spacing will have changed in cases 1, 2, and 3 so the factor cannot be computed\n // until this point\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\n let j = 0;\n if (minDefined) {\n if (includeBounds && niceMin !== min) {\n ticks.push({value: min});\n\n if (niceMin < min) {\n j++; // Skip niceMin\n }\n // If the next nice tick is close to min, skip it\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\n for (; j < numSpaces; ++j) {\n const tickValue = Math.round((niceMin + j * spacing) * factor) / factor;\n if (maxDefined && tickValue > max) {\n break;\n }\n ticks.push({value: tickValue});\n }\n\n if (maxDefined && includeBounds && niceMax !== max) {\n // If the previous tick is too close to max, replace it with max, else add max\n if (ticks.length && 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\n return ticks;\n}\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}\n\nexport default class LinearScaleBase extends Scale {\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.start = undefined;\n /** @type {number} */\n this.end = undefined;\n /** @type {number} */\n this._startValue = undefined;\n /** @type {number} */\n this._endValue = undefined;\n this._valueRange = 0;\n }\n\n parse(raw, index) { // eslint-disable-line no-unused-vars\n if (isNullOrUndef(raw)) {\n return null;\n }\n if ((typeof raw === 'number' || raw instanceof Number) && !isFinite(+raw)) {\n return null;\n }\n\n return +raw;\n }\n\n handleTickRangeOptions() {\n const {beginAtZero} = this.options;\n const {minDefined, maxDefined} = this.getUserBounds();\n let {min, max} = this;\n\n const setMin = v => (min = minDefined ? min : v);\n const setMax = v => (max = maxDefined ? max : v);\n\n if (beginAtZero) {\n const minSign = sign(min);\n const maxSign = sign(max);\n\n if (minSign < 0 && maxSign < 0) {\n setMax(0);\n } else if (minSign > 0 && maxSign > 0) {\n setMin(0);\n }\n }\n\n if (min === max) {\n let offset = max === 0 ? 1 : Math.abs(max * 0.05);\n\n setMax(max + offset);\n\n if (!beginAtZero) {\n setMin(min - offset);\n }\n }\n this.min = min;\n this.max = max;\n }\n\n getTickLimit() {\n const tickOpts = this.options.ticks;\n // eslint-disable-next-line prefer-const\n let {maxTicksLimit, stepSize} = tickOpts;\n let maxTicks;\n\n if (stepSize) {\n maxTicks = Math.ceil(this.max / stepSize) - Math.floor(this.min / stepSize) + 1;\n if (maxTicks > 1000) {\n console.warn(`scales.${this.id}.ticks.stepSize: ${stepSize} would result generating up to ${maxTicks} ticks. Limiting to 1000.`);\n maxTicks = 1000;\n }\n } else {\n maxTicks = this.computeTickLimit();\n maxTicksLimit = maxTicksLimit || 11;\n }\n\n if (maxTicksLimit) {\n maxTicks = Math.min(maxTicksLimit, maxTicks);\n }\n\n return maxTicks;\n }\n\n /**\n\t * @protected\n\t */\n computeTickLimit() {\n return Number.POSITIVE_INFINITY;\n }\n\n buildTicks() {\n const opts = this.options;\n const tickOpts = opts.ticks;\n\n // Figure out what the max number of ticks we can support it is based on the size of\n // the axis area. For now, we say that the minimum tick spacing in pixels must be 40\n // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on\n // the graph. Make sure we always have at least 2 ticks\n let maxTicks = this.getTickLimit();\n maxTicks = Math.max(2, maxTicks);\n\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: this._maxDigits(),\n horizontal: this.isHorizontal(),\n minRotation: tickOpts.minRotation || 0,\n includeBounds: tickOpts.includeBounds !== false\n };\n const dataRange = this._range || this;\n const ticks = generateTicks(numericGeneratorOptions, dataRange);\n\n // At this point, we need to update our max and min given the tick values,\n // since we probably have expanded the range of the scale\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, this, 'value');\n }\n\n if (opts.reverse) {\n ticks.reverse();\n\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n\n return ticks;\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n const ticks = this.ticks;\n let start = this.min;\n let end = this.max;\n\n super.configure();\n\n if (this.options.offset && ticks.length) {\n const offset = (end - start) / Math.max(ticks.length - 1, 1) / 2;\n start -= offset;\n end += offset;\n }\n this._startValue = start;\n this._endValue = end;\n this._valueRange = end - start;\n }\n\n getLabelForValue(value) {\n return formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n}\n","import {isFinite} from '../helpers/helpers.core.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\nimport {toRadians} from '../helpers/index.js';\n\nexport default class LinearScale extends LinearScaleBase {\n\n static id = 'linear';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: Ticks.formatters.numeric\n }\n };\n\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(true);\n\n this.min = isFinite(min) ? min : 0;\n this.max = isFinite(max) ? max : 1;\n\n // Common base implementation to handle min, max, beginAtZero\n this.handleTickRangeOptions();\n }\n\n /**\n\t * Returns the maximum number of ticks based on the scale dimension\n\t * @protected\n \t */\n computeTickLimit() {\n const horizontal = this.isHorizontal();\n const length = horizontal ? this.width : this.height;\n const minRotation = toRadians(this.options.ticks.minRotation);\n const ratio = (horizontal ? Math.sin(minRotation) : Math.cos(minRotation)) || 0.001;\n const tickFont = this._resolveTickFontOptions(0);\n return Math.ceil(length / Math.min(40, tickFont.lineHeight / ratio));\n }\n\n // Utils\n getPixelForValue(value) {\n return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n }\n\n getValueForPixel(pixel) {\n return this._startValue + this.getDecimalForPixel(pixel) * this._valueRange;\n }\n}\n","import {finiteOrDefault, isFinite} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {_setMinAndMaxByKey, log10} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\n\nconst log10Floor = v => Math.floor(log10(v));\nconst changeExponent = (v, m) => Math.pow(10, log10Floor(v) + m);\n\nfunction isMajor(tickVal) {\n const remain = tickVal / (Math.pow(10, log10Floor(tickVal)));\n return remain === 1;\n}\n\nfunction steps(min, max, rangeExp) {\n const rangeStep = Math.pow(10, rangeExp);\n const start = Math.floor(min / rangeStep);\n const end = Math.ceil(max / rangeStep);\n return end - start;\n}\n\nfunction startExp(min, max) {\n const range = max - min;\n let rangeExp = log10Floor(range);\n while (steps(min, max, rangeExp) > 10) {\n rangeExp++;\n }\n while (steps(min, max, rangeExp) < 10) {\n rangeExp--;\n }\n return Math.min(rangeExp, log10Floor(min));\n}\n\n\n/**\n * Generate a set of logarithmic ticks\n * @param generationOptions the options used to generate the ticks\n * @param dataRange the range of the data\n * @returns {object[]} array of tick objects\n */\nfunction generateTicks(generationOptions, {min, max}) {\n min = finiteOrDefault(generationOptions.min, min);\n const ticks = [];\n const minExp = log10Floor(min);\n let exp = startExp(min, max);\n let precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;\n const stepSize = Math.pow(10, exp);\n const base = minExp > exp ? Math.pow(10, minExp) : 0;\n const start = Math.round((min - base) * precision) / precision;\n const offset = Math.floor((min - base) / stepSize / 10) * stepSize * 10;\n let significand = Math.floor((start - offset) / Math.pow(10, exp));\n let value = finiteOrDefault(generationOptions.min, Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision);\n while (value < max) {\n ticks.push({value, major: isMajor(value), significand});\n if (significand >= 10) {\n significand = significand < 15 ? 15 : 20;\n } else {\n significand++;\n }\n if (significand >= 20) {\n exp++;\n significand = 2;\n precision = exp >= 0 ? 1 : precision;\n }\n value = Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision;\n }\n const lastTick = finiteOrDefault(generationOptions.max, value);\n ticks.push({value: lastTick, major: isMajor(lastTick), significand});\n\n return ticks;\n}\n\nexport default class LogarithmicScale extends Scale {\n\n static id = 'logarithmic';\n\n /**\n * @type {any}\n */\n static defaults = {\n ticks: {\n callback: Ticks.formatters.logarithmic,\n major: {\n enabled: true\n }\n }\n };\n\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.start = undefined;\n /** @type {number} */\n this.end = undefined;\n /** @type {number} */\n this._startValue = undefined;\n this._valueRange = 0;\n }\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 isFinite(value) && value > 0 ? value : null;\n }\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(true);\n\n this.min = isFinite(min) ? Math.max(0, min) : null;\n this.max = isFinite(max) ? Math.max(0, max) : null;\n\n if (this.options.beginAtZero) {\n this._zero = true;\n }\n\n // if data has `0` in it or `beginAtZero` is true, min (non zero) value is at bottom\n // of scale, and it does not equal suggestedMin, lower the min bound by one exp.\n if (this._zero && this.min !== this._suggestedMin && !isFinite(this._userMin)) {\n this.min = min === changeExponent(this.min, 0) ? changeExponent(this.min, -1) : changeExponent(this.min, 0);\n }\n\n this.handleTickRangeOptions();\n }\n\n handleTickRangeOptions() {\n const {minDefined, maxDefined} = this.getUserBounds();\n let min = this.min;\n let max = this.max;\n\n const setMin = v => (min = minDefined ? min : v);\n const setMax = v => (max = maxDefined ? max : v);\n\n if (min === max) {\n if (min <= 0) { // includes null\n setMin(1);\n setMax(10);\n } else {\n setMin(changeExponent(min, -1));\n setMax(changeExponent(max, +1));\n }\n }\n if (min <= 0) {\n setMin(changeExponent(max, -1));\n }\n if (max <= 0) {\n\n setMax(changeExponent(min, +1));\n }\n\n this.min = min;\n this.max = max;\n }\n\n buildTicks() {\n const opts = this.options;\n\n const generationOptions = {\n min: this._userMin,\n max: this._userMax\n };\n const ticks = generateTicks(generationOptions, this);\n\n // At this point, we need to update our max and min given the tick values,\n // since we probably have expanded the range of the scale\n if (opts.bounds === 'ticks') {\n _setMinAndMaxByKey(ticks, this, 'value');\n }\n\n if (opts.reverse) {\n ticks.reverse();\n\n this.start = this.max;\n this.end = this.min;\n } else {\n this.start = this.min;\n this.end = this.max;\n }\n\n return ticks;\n }\n\n /**\n\t * @param {number} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n return value === undefined\n ? '0'\n : formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n }\n\n /**\n\t * @protected\n\t */\n configure() {\n const start = this.min;\n\n super.configure();\n\n this._startValue = log10(start);\n this._valueRange = log10(this.max) - log10(start);\n }\n\n getPixelForValue(value) {\n if (value === undefined || value === 0) {\n value = this.min;\n }\n if (value === null || isNaN(value)) {\n return NaN;\n }\n return this.getPixelForDecimal(value === this.min\n ? 0\n : (log10(value) - this._startValue) / this._valueRange);\n }\n\n getValueForPixel(pixel) {\n const decimal = this.getDecimalForPixel(pixel);\n return Math.pow(10, this._startValue + decimal * this._valueRange);\n }\n}\n","import defaults from '../core/core.defaults.js';\nimport {_longestText, addRoundedRectPath, renderText, _isPointInArea} from '../helpers/helpers.canvas.js';\nimport {HALF_PI, TAU, toDegrees, toRadians, _normalizeAngle, PI} from '../helpers/helpers.math.js';\nimport LinearScaleBase from './scale.linearbase.js';\nimport Ticks from '../core/core.ticks.js';\nimport {valueOrDefault, isArray, isFinite, callback as callCallback, isNullOrUndef} from '../helpers/helpers.core.js';\nimport {createContext, toFont, toPadding, toTRBLCorners} from '../helpers/helpers.options.js';\n\nfunction getTickBackdropHeight(opts) {\n const tickOpts = opts.ticks;\n\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}\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}\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\n return {\n start: pos,\n end: pos + size\n };\n}\n\n/**\n * Helper function to fit a radial linear scale with point labels\n */\nfunction fitWithPointLabels(scale) {\n\n // Right, this is really confusing and there is a lot of maths going on here\n // The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9\n //\n // Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif\n //\n // Solution:\n //\n // We assume the radius of the polygon is half the size of the canvas at first\n // at each index we check if the text overlaps.\n //\n // Where it does, we store that angle and that index.\n //\n // After finding the largest index and angle we calculate how much we need to remove\n // from the shape radius to move the point inwards by that x.\n //\n // We average the left and right distances to get the maximum shape radius that can fit in the box\n // along with labels.\n //\n // Once we have that, we can find the centre point for the chart, by taking the x text protrusion\n // on each side, removing that from the size, halving it and adding the left x protrusion width.\n //\n // This will mean we have a shape fitted to the canvas, as large as it can be with the labels\n // and position it in the most space efficient manner\n //\n // https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif\n\n // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width.\n // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points\n const orig = {\n l: scale.left + scale._padding.left,\n r: scale.right - scale._padding.right,\n t: scale.top + scale._padding.top,\n b: scale.bottom - scale._padding.bottom\n };\n const limits = Object.assign({}, orig);\n const labelSizes = [];\n const padding = [];\n const valueCount = scale._pointLabels.length;\n const pointLabelOpts = scale.options.pointLabels;\n const additionalAngle = pointLabelOpts.centerPointLabels ? PI / valueCount : 0;\n\n for (let i = 0; i < valueCount; i++) {\n const opts = pointLabelOpts.setContext(scale.getPointLabelContext(i));\n padding[i] = opts.padding;\n const pointPosition = scale.getPointPosition(i, scale.drawingArea + padding[i], additionalAngle);\n const plFont = toFont(opts.font);\n const textSize = measureLabelSize(scale.ctx, plFont, scale._pointLabels[i]);\n labelSizes[i] = textSize;\n\n const angleRadians = _normalizeAngle(scale.getIndexAngle(i) + additionalAngle);\n const angle = Math.round(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 updateLimits(limits, orig, angleRadians, hLimits, vLimits);\n }\n\n scale.setCenterPoint(\n orig.l - limits.l,\n limits.r - orig.r,\n orig.t - limits.t,\n limits.b - orig.b\n );\n\n // Now that text size is determined, compute the full positions\n scale._pointLabelItems = buildPointLabelItems(scale, labelSizes, padding);\n}\n\nfunction updateLimits(limits, orig, angle, hLimits, vLimits) {\n const sin = Math.abs(Math.sin(angle));\n const cos = Math.abs(Math.cos(angle));\n let x = 0;\n let y = 0;\n if (hLimits.start < orig.l) {\n x = (orig.l - hLimits.start) / sin;\n limits.l = Math.min(limits.l, orig.l - x);\n } else if (hLimits.end > orig.r) {\n x = (hLimits.end - orig.r) / sin;\n limits.r = Math.max(limits.r, orig.r + x);\n }\n if (vLimits.start < orig.t) {\n y = (orig.t - vLimits.start) / cos;\n limits.t = Math.min(limits.t, orig.t - y);\n } else if (vLimits.end > orig.b) {\n y = (vLimits.end - orig.b) / cos;\n limits.b = Math.max(limits.b, orig.b + y);\n }\n}\n\nfunction createPointLabelItem(scale, index, itemOpts) {\n const outerDistance = scale.drawingArea;\n const {extra, additionalAngle, padding, size} = itemOpts;\n const pointLabelPosition = scale.getPointPosition(index, outerDistance + extra + padding, additionalAngle);\n const angle = Math.round(toDegrees(_normalizeAngle(pointLabelPosition.angle + HALF_PI)));\n const y = yForAngle(pointLabelPosition.y, size.h, angle);\n const textAlign = getTextAlignForAngle(angle);\n const left = leftForTextAlign(pointLabelPosition.x, size.w, textAlign);\n return {\n // if to draw or overlapped\n visible: true,\n\n // Text position\n x: pointLabelPosition.x,\n y,\n\n // Text rendering data\n textAlign,\n\n // Bounding box\n left,\n top: y,\n right: left + size.w,\n bottom: y + size.h\n };\n}\n\nfunction isNotOverlapped(item, area) {\n if (!area) {\n return true;\n }\n const {left, top, right, bottom} = item;\n const apexesInArea = _isPointInArea({x: left, y: top}, area) || _isPointInArea({x: left, y: bottom}, area) ||\n _isPointInArea({x: right, y: top}, area) || _isPointInArea({x: right, y: bottom}, area);\n return !apexesInArea;\n}\n\nfunction buildPointLabelItems(scale, labelSizes, padding) {\n const items = [];\n const valueCount = scale._pointLabels.length;\n const opts = scale.options;\n const {centerPointLabels, display} = opts.pointLabels;\n const itemOpts = {\n extra: getTickBackdropHeight(opts) / 2,\n additionalAngle: centerPointLabels ? PI / valueCount : 0\n };\n let area;\n\n for (let i = 0; i < valueCount; i++) {\n itemOpts.padding = padding[i];\n itemOpts.size = labelSizes[i];\n\n const item = createPointLabelItem(scale, i, itemOpts);\n items.push(item);\n if (display === 'auto') {\n item.visible = isNotOverlapped(item, area);\n if (item.visible) {\n area = item;\n }\n }\n }\n return items;\n}\n\nfunction getTextAlignForAngle(angle) {\n if (angle === 0 || angle === 180) {\n return 'center';\n } else if (angle < 180) {\n return 'left';\n }\n\n return 'right';\n}\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}\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}\n\nfunction drawPointLabelBox(ctx, opts, item) {\n const {left, top, right, bottom} = item;\n const {backdropColor} = opts;\n\n if (!isNullOrUndef(backdropColor)) {\n const borderRadius = toTRBLCorners(opts.borderRadius);\n const padding = toPadding(opts.backdropPadding);\n ctx.fillStyle = backdropColor;\n\n const backdropLeft = left - padding.left;\n const backdropTop = top - padding.top;\n const backdropWidth = right - left + padding.width;\n const backdropHeight = bottom - top + padding.height;\n\n if (Object.values(borderRadius).some(v => v !== 0)) {\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x: backdropLeft,\n y: backdropTop,\n w: backdropWidth,\n h: backdropHeight,\n radius: borderRadius,\n });\n ctx.fill();\n } else {\n ctx.fillRect(backdropLeft, backdropTop, backdropWidth, backdropHeight);\n }\n }\n}\n\nfunction drawPointLabels(scale, labelCount) {\n const {ctx, options: {pointLabels}} = scale;\n\n for (let i = labelCount - 1; i >= 0; i--) {\n const item = scale._pointLabelItems[i];\n if (!item.visible) {\n // overlapping\n continue;\n }\n const optsAtIndex = pointLabels.setContext(scale.getPointLabelContext(i));\n drawPointLabelBox(ctx, optsAtIndex, item);\n const plFont = toFont(optsAtIndex.font);\n const {x, y, textAlign} = item;\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}\n\nfunction pathRadiusLine(scale, radius, circular, labelCount) {\n const {ctx} = scale;\n if (circular) {\n // Draw circular arcs between the points\n ctx.arc(scale.xCenter, scale.yCenter, radius, 0, TAU);\n } else {\n // Draw straight lines connecting each index\n let pointPosition = scale.getPointPosition(0, radius);\n ctx.moveTo(pointPosition.x, pointPosition.y);\n\n for (let i = 1; i < labelCount; i++) {\n pointPosition = scale.getPointPosition(i, radius);\n ctx.lineTo(pointPosition.x, pointPosition.y);\n }\n }\n}\n\nfunction drawRadiusLine(scale, gridLineOpts, radius, labelCount, borderOpts) {\n const ctx = scale.ctx;\n const circular = gridLineOpts.circular;\n\n const {color, lineWidth} = gridLineOpts;\n\n if ((!circular && !labelCount) || !color || !lineWidth || radius < 0) {\n return;\n }\n\n ctx.save();\n ctx.strokeStyle = color;\n ctx.lineWidth = lineWidth;\n ctx.setLineDash(borderOpts.dash);\n ctx.lineDashOffset = borderOpts.dashOffset;\n\n ctx.beginPath();\n pathRadiusLine(scale, radius, circular, labelCount);\n ctx.closePath();\n ctx.stroke();\n ctx.restore();\n}\n\nfunction createPointLabelContext(parent, index, label) {\n return createContext(parent, {\n label,\n index,\n type: 'pointLabel'\n });\n}\n\nexport default class RadialLinearScale extends LinearScaleBase {\n\n static id = 'radialLinear';\n\n /**\n * @type {any}\n */\n static defaults = {\n display: true,\n\n // Boolean - Whether to animate scaling the chart from the centre\n animate: true,\n position: 'chartArea',\n\n angleLines: {\n display: true,\n lineWidth: 1,\n borderDash: [],\n borderDashOffset: 0.0\n },\n\n grid: {\n circular: false\n },\n\n startAngle: 0,\n\n // label settings\n ticks: {\n // Boolean - Show a backdrop to the scale label\n showLabelBackdrop: true,\n\n callback: Ticks.formatters.numeric\n },\n\n pointLabels: {\n backdropColor: undefined,\n\n // Number - The backdrop padding above & below the label in pixels\n backdropPadding: 2,\n\n // Boolean - if true, show point labels\n display: true,\n\n // Number - Point label font size in pixels\n font: {\n size: 10\n },\n\n // Function - Used to convert point labels\n callback(label) {\n return label;\n },\n\n // Number - Additionl padding between scale and pointLabel\n padding: 5,\n\n // Boolean - if true, center point labels to slices in polar chart\n centerPointLabels: false\n }\n };\n\n static defaultRoutes = {\n 'angleLines.color': 'borderColor',\n 'pointLabels.color': 'color',\n 'ticks.color': 'color'\n };\n\n static descriptors = {\n angleLines: {\n _fallback: 'grid'\n }\n };\n\n constructor(cfg) {\n super(cfg);\n\n /** @type {number} */\n this.xCenter = undefined;\n /** @type {number} */\n this.yCenter = undefined;\n /** @type {number} */\n this.drawingArea = undefined;\n /** @type {string[]} */\n this._pointLabels = [];\n this._pointLabelItems = [];\n }\n\n setDimensions() {\n // Set the unconstrained dimension before label rotation\n const padding = this._padding = toPadding(getTickBackdropHeight(this.options) / 2);\n const w = this.width = this.maxWidth - padding.width;\n const h = this.height = this.maxHeight - padding.height;\n this.xCenter = Math.floor(this.left + w / 2 + padding.left);\n this.yCenter = Math.floor(this.top + h / 2 + padding.top);\n this.drawingArea = Math.floor(Math.min(w, h) / 2);\n }\n\n determineDataLimits() {\n const {min, max} = this.getMinMax(false);\n\n this.min = isFinite(min) && !isNaN(min) ? min : 0;\n this.max = isFinite(max) && !isNaN(max) ? max : 0;\n\n // Common base implementation to handle min, max, beginAtZero\n this.handleTickRangeOptions();\n }\n\n /**\n\t * Returns the maximum number of ticks based on the scale dimension\n\t * @protected\n\t */\n computeTickLimit() {\n return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options));\n }\n\n generateTickLabels(ticks) {\n LinearScaleBase.prototype.generateTickLabels.call(this, ticks);\n\n // Point labels\n this._pointLabels = this.getLabels()\n .map((value, index) => {\n const label = callCallback(this.options.pointLabels.callback, [value, index], this);\n return label || label === 0 ? label : '';\n })\n .filter((v, i) => this.chart.getDataVisibility(i));\n }\n\n fit() {\n const opts = this.options;\n\n if (opts.display && opts.pointLabels.display) {\n fitWithPointLabels(this);\n } else {\n this.setCenterPoint(0, 0, 0, 0);\n }\n }\n\n setCenterPoint(leftMovement, rightMovement, topMovement, bottomMovement) {\n this.xCenter += Math.floor((leftMovement - rightMovement) / 2);\n this.yCenter += Math.floor((topMovement - bottomMovement) / 2);\n this.drawingArea -= Math.min(this.drawingArea / 2, Math.max(leftMovement, rightMovement, topMovement, bottomMovement));\n }\n\n getIndexAngle(index) {\n const angleMultiplier = TAU / (this._pointLabels.length || 1);\n const startAngle = this.options.startAngle || 0;\n\n return _normalizeAngle(index * angleMultiplier + toRadians(startAngle));\n }\n\n getDistanceFromCenterForValue(value) {\n if (isNullOrUndef(value)) {\n return NaN;\n }\n\n // Take into account half font size + the yPadding of the top value\n const scalingFactor = this.drawingArea / (this.max - this.min);\n if (this.options.reverse) {\n return (this.max - value) * scalingFactor;\n }\n return (value - this.min) * scalingFactor;\n }\n\n getValueForDistanceFromCenter(distance) {\n if (isNullOrUndef(distance)) {\n return NaN;\n }\n\n const scaledDistance = distance / (this.drawingArea / (this.max - this.min));\n return this.options.reverse ? this.max - scaledDistance : this.min + scaledDistance;\n }\n\n getPointLabelContext(index) {\n const pointLabels = this._pointLabels || [];\n\n if (index >= 0 && index < pointLabels.length) {\n const pointLabel = pointLabels[index];\n return createPointLabelContext(this.getContext(), index, pointLabel);\n }\n }\n\n getPointPosition(index, distanceFromCenter, additionalAngle = 0) {\n const angle = this.getIndexAngle(index) - HALF_PI + additionalAngle;\n return {\n x: Math.cos(angle) * distanceFromCenter + this.xCenter,\n y: Math.sin(angle) * distanceFromCenter + this.yCenter,\n angle\n };\n }\n\n getPointPositionForValue(index, value) {\n return this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n }\n\n getBasePosition(index) {\n return this.getPointPositionForValue(index || 0, this.getBaseValue());\n }\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\n /**\n\t * @protected\n\t */\n drawBackground() {\n const {backgroundColor, grid: {circular}} = this.options;\n if (backgroundColor) {\n const ctx = this.ctx;\n ctx.save();\n ctx.beginPath();\n pathRadiusLine(this, this.getDistanceFromCenterForValue(this._endValue), circular, this._pointLabels.length);\n ctx.closePath();\n ctx.fillStyle = backgroundColor;\n ctx.fill();\n ctx.restore();\n }\n }\n\n /**\n\t * @protected\n\t */\n drawGrid() {\n const ctx = this.ctx;\n const opts = this.options;\n const {angleLines, grid, border} = opts;\n const labelCount = this._pointLabels.length;\n\n let i, offset, position;\n\n if (opts.pointLabels.display) {\n drawPointLabels(this, labelCount);\n }\n\n if (grid.display) {\n this.ticks.forEach((tick, index) => {\n if (index !== 0) {\n offset = this.getDistanceFromCenterForValue(tick.value);\n const context = this.getContext(index);\n const optsAtIndex = grid.setContext(context);\n const optsAtIndexBorder = border.setContext(context);\n\n drawRadiusLine(this, optsAtIndex, offset, labelCount, optsAtIndexBorder);\n }\n });\n }\n\n if (angleLines.display) {\n ctx.save();\n\n for (i = labelCount - 1; i >= 0; i--) {\n const optsAtIndex = angleLines.setContext(this.getPointLabelContext(i));\n const {color, lineWidth} = optsAtIndex;\n\n if (!lineWidth || !color) {\n continue;\n }\n\n ctx.lineWidth = lineWidth;\n ctx.strokeStyle = color;\n\n ctx.setLineDash(optsAtIndex.borderDash);\n ctx.lineDashOffset = optsAtIndex.borderDashOffset;\n\n offset = this.getDistanceFromCenterForValue(opts.ticks.reverse ? this.min : this.max);\n position = this.getPointPosition(i, offset);\n ctx.beginPath();\n ctx.moveTo(this.xCenter, this.yCenter);\n ctx.lineTo(position.x, position.y);\n ctx.stroke();\n }\n\n ctx.restore();\n }\n }\n\n /**\n\t * @protected\n\t */\n drawBorder() {}\n\n /**\n\t * @protected\n\t */\n drawLabels() {\n const ctx = this.ctx;\n const opts = this.options;\n const tickOpts = opts.ticks;\n\n if (!tickOpts.display) {\n return;\n }\n\n const startAngle = this.getIndexAngle(0);\n let offset, width;\n\n ctx.save();\n ctx.translate(this.xCenter, this.yCenter);\n ctx.rotate(startAngle);\n ctx.textAlign = 'center';\n ctx.textBaseline = 'middle';\n\n this.ticks.forEach((tick, index) => {\n if (index === 0 && !opts.reverse) {\n return;\n }\n\n const optsAtIndex = tickOpts.setContext(this.getContext(index));\n const tickFont = toFont(optsAtIndex.font);\n offset = this.getDistanceFromCenterForValue(this.ticks[index].value);\n\n if (optsAtIndex.showLabelBackdrop) {\n ctx.font = tickFont.string;\n width = ctx.measureText(tick.label).width;\n ctx.fillStyle = optsAtIndex.backdropColor;\n\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\n renderText(ctx, tick.label, 0, -offset, tickFont, {\n color: optsAtIndex.color,\n strokeColor: optsAtIndex.textStrokeColor,\n strokeWidth: optsAtIndex.textStrokeWidth,\n });\n });\n\n ctx.restore();\n }\n\n /**\n\t * @protected\n\t */\n drawTitle() {}\n}\n","import adapters from '../core/core.adapters.js';\nimport {callback as call, isFinite, isNullOrUndef, mergeIf, valueOrDefault} from '../helpers/helpers.core.js';\nimport {toRadians, isNumber, _limitValue} from '../helpers/helpers.math.js';\nimport Scale from '../core/core.scale.js';\nimport {_arrayUnique, _filterBetween, _lookup} from '../helpers/helpers.collection.js';\n\n/**\n * @typedef { import('../core/core.adapters.js').TimeUnit } Unit\n * @typedef {{common: boolean, size: number, steps?: number}} Interval\n * @typedef { import('../core/core.adapters.js').DateAdapter } DateAdapter\n */\n\n/**\n * @type {Object}\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};\n\n/**\n * @type {Unit[]}\n */\nconst UNITS = /** @type Unit[] */ /* #__PURE__ */ (Object.keys(INTERVALS));\n\n/**\n * @param {number} a\n * @param {number} b\n */\nfunction sorter(a, b) {\n return a - b;\n}\n\n/**\n * @param {TimeScale} scale\n * @param {*} input\n * @return {number}\n */\nfunction parse(scale, input) {\n if (isNullOrUndef(input)) {\n return null;\n }\n\n const adapter = scale._adapter;\n const {parser, round, isoWeekday} = scale._parseOpts;\n let value = input;\n\n if (typeof parser === 'function') {\n value = parser(value);\n }\n\n // Only parse if it's not a timestamp already\n if (!isFinite(value)) {\n value = typeof parser === 'string'\n ? adapter.parse(value, /** @type {Unit} */ (parser))\n : adapter.parse(value);\n }\n\n if (value === null) {\n return null;\n }\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\n return +value;\n}\n\n/**\n * Figures out what unit results in an appropriate number of auto-generated ticks\n * @param {Unit} minUnit\n * @param {number} min\n * @param {number} max\n * @param {number} capacity\n * @return {object}\n */\nfunction determineUnitForAutoTicks(minUnit, min, max, capacity) {\n const ilen = UNITS.length;\n\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\n if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\n return UNITS[i];\n }\n }\n\n return UNITS[ilen - 1];\n}\n\n/**\n * Figures out what unit to format a set of ticks with\n * @param {TimeScale} scale\n * @param {number} numTicks\n * @param {Unit} minUnit\n * @param {number} min\n * @param {number} max\n * @return {Unit}\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\n return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];\n}\n\n/**\n * @param {Unit} unit\n * @return {object}\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}\n\n/**\n * @param {object} ticks\n * @param {number} time\n * @param {number[]} [timestamps] - if defined, snap to these timestamps\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}\n\n/**\n * @param {TimeScale} scale\n * @param {object[]} ticks\n * @param {object} map\n * @param {Unit} majorUnit\n * @return {object[]}\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\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}\n\n/**\n * @param {TimeScale} scale\n * @param {number[]} values\n * @param {Unit|undefined} [majorUnit]\n * @return {object[]}\n */\nfunction ticksFromTimestamps(scale, values, majorUnit) {\n const ticks = [];\n /** @type {Object} */\n const map = {};\n const ilen = values.length;\n let i, value;\n\n for (i = 0; i < ilen; ++i) {\n value = values[i];\n map[value] = i;\n\n ticks.push({\n value,\n major: false\n });\n }\n\n // We set the major ticks separately from the above loop because calling startOf for every tick\n // is expensive when there is a large number of ticks\n return (ilen === 0 || !majorUnit) ? ticks : setMajorTicks(scale, ticks, map, majorUnit);\n}\n\nexport default class TimeScale extends Scale {\n\n static id = 'time';\n\n /**\n * @type {any}\n */\n static defaults = {\n /**\n * Scale boundary strategy (bypassed by min/max time options)\n * - `data`: make sure data are fully visible, ticks outside are removed\n * - `ticks`: make sure ticks are fully visible, data outside are truncated\n * @see https://github.com/chartjs/Chart.js/pull/4556\n * @since 2.7.0\n */\n bounds: 'data',\n\n adapters: {},\n time: {\n parser: false, // false == a pattern string from or a custom callback that converts its argument to a timestamp\n unit: false, // false == automatic or override with week, month, year, etc.\n round: false, // none, or override with week, month, year, etc.\n isoWeekday: false, // override week start day\n minUnit: 'millisecond',\n displayFormats: {}\n },\n ticks: {\n /**\n * Ticks generation input values:\n * - 'auto': generates \"optimal\" ticks based on scale size and time options.\n * - 'data': generates ticks from data (including labels from data {t|x|y} objects).\n * - 'labels': generates ticks from user given `data.labels` values ONLY.\n * @see https://github.com/chartjs/Chart.js/pull/4507\n * @since 2.7.0\n */\n source: 'auto',\n\n callback: false,\n\n major: {\n enabled: false\n }\n }\n };\n\n /**\n\t * @param {object} props\n\t */\n constructor(props) {\n super(props);\n\n /** @type {{data: number[], labels: number[], all: number[]}} */\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n\n /** @type {Unit} */\n this._unit = 'day';\n /** @type {Unit=} */\n this._majorUnit = undefined;\n this._offsets = {};\n this._normalized = false;\n this._parseOpts = undefined;\n }\n\n init(scaleOpts, opts = {}) {\n const time = scaleOpts.time || (scaleOpts.time = {});\n /** @type {DateAdapter} */\n const adapter = this._adapter = new adapters._date(scaleOpts.adapters.date);\n\n adapter.init(opts);\n\n // Backward compatibility: before introducing adapter, `displayFormats` was\n // supposed to contain *all* unit/string pairs but this can't be resolved\n // when loading the scale (adapters are loaded afterward), so let's populate\n // missing formats on update\n mergeIf(time.displayFormats, adapter.formats());\n\n this._parseOpts = {\n parser: time.parser,\n round: time.round,\n isoWeekday: time.isoWeekday\n };\n\n super.init(scaleOpts);\n\n this._normalized = opts.normalized;\n }\n\n /**\n\t * @param {*} raw\n\t * @param {number?} [index]\n\t * @return {number}\n\t */\n parse(raw, index) { // eslint-disable-line no-unused-vars\n if (raw === undefined) {\n return null;\n }\n return parse(this, raw);\n }\n\n beforeLayout() {\n super.beforeLayout();\n this._cache = {\n data: [],\n labels: [],\n all: []\n };\n }\n\n determineDataLimits() {\n const options = this.options;\n const adapter = this._adapter;\n const unit = options.time.unit || 'day';\n // eslint-disable-next-line prefer-const\n let {min, max, minDefined, maxDefined} = this.getUserBounds();\n\n /**\n\t\t * @param {object} bounds\n\t\t */\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\n // If we have user provided `min` and `max` labels / data bounds can be ignored\n if (!minDefined || !maxDefined) {\n // Labels are always considered, when user did not force bounds\n _applyBounds(this._getLabelBounds());\n\n // If `bounds` is `'ticks'` and `ticks.source` is `'labels'`,\n // data bounds are ignored (and don't need to be determined)\n if (options.bounds !== 'ticks' || options.ticks.source !== 'labels') {\n _applyBounds(this.getMinMax(false));\n }\n }\n\n min = isFinite(min) && !isNaN(min) ? min : +adapter.startOf(Date.now(), unit);\n max = isFinite(max) && !isNaN(max) ? max : +adapter.endOf(Date.now(), unit) + 1;\n\n // Make sure that max is strictly higher than min (required by the timeseries lookup table)\n this.min = Math.min(min, max - 1);\n this.max = Math.max(min + 1, max);\n }\n\n /**\n\t * @private\n\t */\n _getLabelBounds() {\n const arr = this.getLabelTimestamps();\n let min = Number.POSITIVE_INFINITY;\n let max = Number.NEGATIVE_INFINITY;\n\n if (arr.length) {\n min = arr[0];\n max = arr[arr.length - 1];\n }\n return {min, max};\n }\n\n /**\n\t * @return {object[]}\n\t */\n buildTicks() {\n const options = this.options;\n const timeOpts = options.time;\n const tickOpts = options.ticks;\n const timestamps = tickOpts.source === 'labels' ? this.getLabelTimestamps() : this._generate();\n\n if (options.bounds === 'ticks' && timestamps.length) {\n this.min = this._userMin || timestamps[0];\n this.max = this._userMax || timestamps[timestamps.length - 1];\n }\n\n const min = this.min;\n const max = this.max;\n\n const ticks = _filterBetween(timestamps, min, max);\n\n // PRIVATE\n // determineUnitForFormatting relies on the number of ticks so we don't use it when\n // autoSkip is enabled because we don't yet know what the final number of ticks will be\n this._unit = timeOpts.unit || (tickOpts.autoSkip\n ? determineUnitForAutoTicks(timeOpts.minUnit, this.min, this.max, this._getLabelCapacity(min))\n : determineUnitForFormatting(this, ticks.length, timeOpts.minUnit, this.min, this.max));\n this._majorUnit = !tickOpts.major.enabled || this._unit === 'year' ? undefined\n : determineMajorUnit(this._unit);\n this.initOffsets(timestamps);\n\n if (options.reverse) {\n ticks.reverse();\n }\n\n return ticksFromTimestamps(this, ticks, this._majorUnit);\n }\n\n afterAutoSkip() {\n // Offsets for bar charts need to be handled with the auto skipped\n // ticks. Once ticks have been skipped, we re-compute the offsets.\n if (this.options.offsetAfterAutoskip) {\n this.initOffsets(this.ticks.map(tick => +tick.value));\n }\n }\n\n /**\n\t * Returns the start and end offsets from edges in the form of {start, end}\n\t * where each value is a relative width to the scale and ranges between 0 and 1.\n\t * They add extra margins on the both sides by scaling down the original scale.\n\t * Offsets are added when the `offset` option is true.\n\t * @param {number[]} timestamps\n\t * @protected\n\t */\n initOffsets(timestamps = []) {\n let start = 0;\n let end = 0;\n let first, last;\n\n if (this.options.offset && timestamps.length) {\n first = this.getDecimalForValue(timestamps[0]);\n if (timestamps.length === 1) {\n start = 1 - first;\n } else {\n start = (this.getDecimalForValue(timestamps[1]) - first) / 2;\n }\n last = this.getDecimalForValue(timestamps[timestamps.length - 1]);\n if (timestamps.length === 1) {\n end = last;\n } else {\n end = (last - this.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\n this._offsets = {start, end, factor: 1 / (start + 1 + end)};\n }\n\n /**\n\t * Generates a maximum of `capacity` timestamps between min and max, rounded to the\n\t * `minor` unit using the given scale time `options`.\n\t * Important: this method can return ticks outside the min and max range, it's the\n\t * responsibility of the calling code to clamp values if needed.\n\t * @protected\n\t */\n _generate() {\n const adapter = this._adapter;\n const min = this.min;\n const max = this.max;\n const options = this.options;\n const timeOpts = options.time;\n // @ts-ignore\n const minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, this._getLabelCapacity(min));\n const stepSize = valueOrDefault(options.ticks.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\n // For 'week' unit, handle the first day of week option\n if (hasWeekday) {\n first = +adapter.startOf(first, 'isoWeek', weekday);\n }\n\n // Align first ticks on unit\n first = +adapter.startOf(first, hasWeekday ? 'day' : minor);\n\n // Prevent browser from freezing in case user options request millions of milliseconds\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\n const timestamps = options.ticks.source === 'data' && this.getDataTimestamps();\n for (time = first, count = 0; time < max; time = +adapter.add(time, stepSize, minor), count++) {\n addTick(ticks, time, timestamps);\n }\n\n if (time === max || options.bounds === 'ticks' || count === 1) {\n addTick(ticks, time, timestamps);\n }\n\n // @ts-ignore\n return Object.keys(ticks).sort(sorter).map(x => +x);\n }\n\n /**\n\t * @param {number} value\n\t * @return {string}\n\t */\n getLabelForValue(value) {\n const adapter = this._adapter;\n const timeOpts = this.options.time;\n\n if (timeOpts.tooltipFormat) {\n return adapter.format(value, timeOpts.tooltipFormat);\n }\n return adapter.format(value, timeOpts.displayFormats.datetime);\n }\n\n /**\n\t * @param {number} value\n\t * @param {string|undefined} format\n\t * @return {string}\n\t */\n format(value, format) {\n const options = this.options;\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const fmt = format || formats[unit];\n return this._adapter.format(value, fmt);\n }\n\n /**\n\t * Function to format an individual tick mark\n\t * @param {number} time\n\t * @param {number} index\n\t * @param {object[]} ticks\n\t * @param {string|undefined} [format]\n\t * @return {string}\n\t * @private\n\t */\n _tickFormatFunction(time, index, ticks, format) {\n const options = this.options;\n const formatter = options.ticks.callback;\n\n if (formatter) {\n return call(formatter, [time, index, ticks], this);\n }\n\n const formats = options.time.displayFormats;\n const unit = this._unit;\n const majorUnit = this._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\n return this._adapter.format(time, format || (major ? majorFormat : minorFormat));\n }\n\n /**\n\t * @param {object[]} ticks\n\t */\n generateTickLabels(ticks) {\n let i, ilen, tick;\n\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\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getDecimalForValue(value) {\n return value === null ? NaN : (value - this.min) / (this.max - this.min);\n }\n\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getPixelForValue(value) {\n const offsets = this._offsets;\n const pos = this.getDecimalForValue(value);\n return this.getPixelForDecimal((offsets.start + pos) * offsets.factor);\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const pos = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return this.min + pos * (this.max - this.min);\n }\n\n /**\n\t * @param {string} label\n\t * @return {{w:number, h:number}}\n\t * @private\n\t */\n _getLabelSize(label) {\n const ticksOpts = this.options.ticks;\n const tickLabelWidth = this.ctx.measureText(label).width;\n const angle = toRadians(this.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation);\n const cosRotation = Math.cos(angle);\n const sinRotation = Math.sin(angle);\n const tickFontSize = this._resolveTickFontOptions(0).size;\n\n return {\n w: (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation),\n h: (tickLabelWidth * sinRotation) + (tickFontSize * cosRotation)\n };\n }\n\n /**\n\t * @param {number} exampleTime\n\t * @return {number}\n\t * @private\n\t */\n _getLabelCapacity(exampleTime) {\n const timeOpts = this.options.time;\n const displayFormats = timeOpts.displayFormats;\n\n // pick the longest format (milliseconds) for guesstimation\n const format = displayFormats[timeOpts.unit] || displayFormats.millisecond;\n const exampleLabel = this._tickFormatFunction(exampleTime, 0, ticksFromTimestamps(this, [exampleTime], this._majorUnit), format);\n const size = this._getLabelSize(exampleLabel);\n // subtract 1 - if offset then there's one less label than tick\n // if not offset then one half label padding is added to each end leaving room for one less label\n const capacity = Math.floor(this.isHorizontal() ? this.width / size.w : this.height / size.h) - 1;\n return capacity > 0 ? capacity : 1;\n }\n\n /**\n\t * @protected\n\t */\n getDataTimestamps() {\n let timestamps = this._cache.data || [];\n let i, ilen;\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const metas = this.getMatchingVisibleMetas();\n\n if (this._normalized && metas.length) {\n return (this._cache.data = metas[0].controller.getAllParsedValues(this));\n }\n\n for (i = 0, ilen = metas.length; i < ilen; ++i) {\n timestamps = timestamps.concat(metas[i].controller.getAllParsedValues(this));\n }\n\n return (this._cache.data = this.normalize(timestamps));\n }\n\n /**\n\t * @protected\n\t */\n getLabelTimestamps() {\n const timestamps = this._cache.labels || [];\n let i, ilen;\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const labels = this.getLabels();\n for (i = 0, ilen = labels.length; i < ilen; ++i) {\n timestamps.push(parse(this, labels[i]));\n }\n\n return (this._cache.labels = this._normalized ? timestamps : this.normalize(timestamps));\n }\n\n /**\n\t * @param {number[]} values\n\t * @protected\n\t */\n normalize(values) {\n // It seems to be somewhat faster to do sorting first\n return _arrayUnique(values.sort(sorter));\n }\n}\n","import TimeScale from './scale.time.js';\nimport {_lookupByKey} from '../helpers/helpers.collection.js';\n\n/**\n * Linearly interpolates the given source `val` using the table. If value is out of bounds, values\n * at edges are used for the interpolation.\n * @param {object} table\n * @param {number} val\n * @param {boolean} [reverse] lookup time based on position instead of vice versa\n * @return {object}\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\n const span = nextSource - prevSource;\n return span ? prevTarget + (nextTarget - prevTarget) * (val - prevSource) / span : prevTarget;\n}\n\nclass TimeSeriesScale extends TimeScale {\n\n static id = 'timeseries';\n\n /**\n * @type {any}\n */\n static defaults = TimeScale.defaults;\n\n /**\n\t * @param {object} props\n\t */\n constructor(props) {\n super(props);\n\n /** @type {object[]} */\n this._table = [];\n /** @type {number} */\n this._minPos = undefined;\n /** @type {number} */\n this._tableRange = undefined;\n }\n\n /**\n\t * @protected\n\t */\n initOffsets() {\n const timestamps = this._getTimestampsForTable();\n const table = this._table = this.buildLookupTable(timestamps);\n this._minPos = interpolate(table, this.min);\n this._tableRange = interpolate(table, this.max) - this._minPos;\n super.initOffsets(timestamps);\n }\n\n /**\n\t * Returns an array of {time, pos} objects used to interpolate a specific `time` or position\n\t * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is\n\t * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other\n\t * extremity (left + width or top + height). Note that it would be more optimized to directly\n\t * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need\n\t * to create the lookup table. The table ALWAYS contains at least two items: min and max.\n\t * @param {number[]} timestamps\n\t * @return {object[]}\n\t * @protected\n\t */\n buildLookupTable(timestamps) {\n const {min, max} = this;\n const items = [];\n const table = [];\n let i, ilen, prev, curr, next;\n\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\n if (items.length < 2) {\n // In case there is less that 2 timestamps between min and max, the scale is defined by min and max\n return [\n {time: min, pos: 0},\n {time: max, pos: 1}\n ];\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\n // only add points that breaks the scale linearity\n if (Math.round((next + prev) / 2) !== curr) {\n table.push({time: curr, pos: i / (ilen - 1)});\n }\n }\n return table;\n }\n\n /**\n * Generates all timestamps defined in the data.\n * Important: this method can return ticks outside the min and max range, it's the\n * responsibility of the calling code to clamp values if needed.\n * @protected\n */\n _generate() {\n const min = this.min;\n const max = this.max;\n let timestamps = super.getDataTimestamps();\n if (!timestamps.includes(min) || !timestamps.length) {\n timestamps.splice(0, 0, min);\n }\n if (!timestamps.includes(max) || timestamps.length === 1) {\n timestamps.push(max);\n }\n return timestamps.sort((a, b) => a - b);\n }\n\n /**\n\t * Returns all timestamps\n\t * @return {number[]}\n\t * @private\n\t */\n _getTimestampsForTable() {\n let timestamps = this._cache.all || [];\n\n if (timestamps.length) {\n return timestamps;\n }\n\n const data = this.getDataTimestamps();\n const label = this.getLabelTimestamps();\n if (data.length && label.length) {\n // If combining labels and data (data might not contain all labels),\n // we need to recheck uniqueness and sort\n timestamps = this.normalize(data.concat(label));\n } else {\n timestamps = data.length ? data : label;\n }\n timestamps = this._cache.all = timestamps;\n\n return timestamps;\n }\n\n /**\n\t * @param {number} value - Milliseconds since epoch (1 January 1970 00:00:00 UTC)\n\t * @return {number}\n\t */\n getDecimalForValue(value) {\n return (interpolate(this._table, value) - this._minPos) / this._tableRange;\n }\n\n /**\n\t * @param {number} pixel\n\t * @return {number}\n\t */\n getValueForPixel(pixel) {\n const offsets = this._offsets;\n const decimal = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n return interpolate(this._table, decimal * this._tableRange + this._minPos, true);\n }\n}\n\nexport default TimeSeriesScale;\n","/*!\n * @kurkle/color v0.3.2\n * https://github.com/kurkle/color#readme\n * (c) 2023 Jukka Kurkela\n * Released under the MIT License\n */\nfunction round(v) {\n return v + 0.5 | 0;\n}\nconst lim = (v, l, h) => Math.max(Math.min(v, h), l);\nfunction p2b(v) {\n return lim(round(v * 2.55), 0, 255);\n}\nfunction b2p(v) {\n return lim(round(v / 2.55), 0, 100);\n}\nfunction n2b(v) {\n return lim(round(v * 255), 0, 255);\n}\nfunction b2n(v) {\n return lim(round(v / 2.55) / 100, 0, 1);\n}\nfunction n2p(v) {\n return lim(round(v * 100), 0, 100);\n}\n\nconst map$1 = {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);\nconst isShort = v => eq(v.r) && eq(v.g) && eq(v.b) && eq(v.a);\nfunction hexParse(str) {\n var len = str.length;\n var ret;\n if (str[0] === '#') {\n if (len === 4 || len === 5) {\n ret = {\n r: 255 & map$1[str[1]] * 17,\n g: 255 & map$1[str[2]] * 17,\n b: 255 & map$1[str[3]] * 17,\n a: len === 5 ? map$1[str[4]] * 17 : 255\n };\n } else if (len === 7 || len === 9) {\n ret = {\n r: map$1[str[1]] << 4 | map$1[str[2]],\n g: map$1[str[3]] << 4 | map$1[str[4]],\n b: map$1[str[5]] << 4 | map$1[str[6]],\n a: len === 9 ? (map$1[str[7]] << 4 | map$1[str[8]]) : 255\n };\n }\n }\n return ret;\n}\nconst alpha = (a, f) => a < 255 ? f(a) : '';\nfunction hexString(v) {\n var f = isShort(v) ? h1 : h2;\n return v\n ? '#' + f(v.r) + f(v.g) + f(v.b) + alpha(v.a, f)\n : undefined;\n}\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 const a = s * Math.min(l, 1 - l);\n const f = (n, k = (n + h / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n return [f(0), f(8), f(4)];\n}\nfunction hsv2rgbn(h, s, v) {\n const f = (n, k = (n + h / 60) % 6) => v - v * s * Math.max(Math.min(k, 4 - k, 1), 0);\n return [f(5), f(3), f(1)];\n}\nfunction hwb2rgbn(h, w, b) {\n const rgb = hsl2rgbn(h, 1, 0.5);\n let i;\n if (w + b > 1) {\n i = 1 / (w + b);\n w *= i;\n b *= i;\n }\n for (i = 0; i < 3; i++) {\n rgb[i] *= 1 - w - b;\n rgb[i] += w;\n }\n return rgb;\n}\nfunction hueValue(r, g, b, d, max) {\n if (r === max) {\n return ((g - b) / d) + (g < b ? 6 : 0);\n }\n if (g === max) {\n return (b - r) / d + 2;\n }\n return (r - g) / d + 4;\n}\nfunction rgb2hsl(v) {\n const range = 255;\n const r = v.r / range;\n const g = v.g / range;\n const b = v.b / range;\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n const l = (max + min) / 2;\n let h, s, d;\n if (max !== min) {\n d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n h = hueValue(r, g, b, d, max);\n h = h * 60 + 0.5;\n }\n return [h | 0, s || 0, l];\n}\nfunction calln(f, a, b, c) {\n return (\n Array.isArray(a)\n ? f(a[0], a[1], a[2])\n : f(a, b, c)\n ).map(n2b);\n}\nfunction hsl2rgb(h, s, l) {\n return calln(hsl2rgbn, h, s, l);\n}\nfunction hwb2rgb(h, w, b) {\n return calln(hwb2rgbn, h, w, b);\n}\nfunction hsv2rgb(h, s, v) {\n return calln(hsv2rgbn, h, s, v);\n}\nfunction hue(h) {\n return (h % 360 + 360) % 360;\n}\nfunction hueParse(str) {\n const m = HUE_RE.exec(str);\n let a = 255;\n let v;\n if (!m) {\n return;\n }\n if (m[5] !== v) {\n a = m[6] ? p2b(+m[5]) : n2b(+m[5]);\n }\n const h = hue(+m[2]);\n const p1 = +m[3] / 100;\n const p2 = +m[4] / 100;\n if (m[1] === 'hwb') {\n v = hwb2rgb(h, p1, p2);\n } else if (m[1] === 'hsv') {\n v = hsv2rgb(h, p1, p2);\n } else {\n v = hsl2rgb(h, p1, p2);\n }\n return {\n r: v[0],\n g: v[1],\n b: v[2],\n a: a\n };\n}\nfunction rotate(v, deg) {\n var h = rgb2hsl(v);\n h[0] = hue(h[0] + deg);\n h = hsl2rgb(h);\n v.r = h[0];\n v.g = h[1];\n v.b = h[2];\n}\nfunction hslString(v) {\n if (!v) {\n return;\n }\n const a = rgb2hsl(v);\n const h = a[0];\n const s = n2p(a[1]);\n const l = n2p(a[2]);\n return v.a < 255\n ? `hsla(${h}, ${s}%, ${l}%, ${b2n(v.a)})`\n : `hsl(${h}, ${s}%, ${l}%)`;\n}\n\nconst map = {\n x: 'dark',\n Z: 'light',\n Y: 're',\n X: 'blu',\n W: 'gr',\n V: 'medium',\n U: 'slate',\n A: 'ee',\n T: 'ol',\n S: 'or',\n B: 'ra',\n C: 'lateg',\n D: 'ights',\n R: 'in',\n Q: 'turquois',\n E: 'hi',\n P: 'ro',\n O: 'al',\n N: 'le',\n M: 'de',\n L: 'yello',\n F: 'en',\n K: 'ch',\n G: 'arks',\n H: 'ea',\n I: 'ightg',\n J: 'wh'\n};\nconst names$1 = {\n OiceXe: 'f0f8ff',\n antiquewEte: 'faebd7',\n aqua: 'ffff',\n aquamarRe: '7fffd4',\n azuY: 'f0ffff',\n beige: 'f5f5dc',\n bisque: 'ffe4c4',\n black: '0',\n blanKedOmond: 'ffebcd',\n Xe: 'ff',\n XeviTet: '8a2be2',\n bPwn: 'a52a2a',\n burlywood: 'deb887',\n caMtXe: '5f9ea0',\n KartYuse: '7fff00',\n KocTate: 'd2691e',\n cSO: 'ff7f50',\n cSnflowerXe: '6495ed',\n cSnsilk: 'fff8dc',\n crimson: 'dc143c',\n cyan: 'ffff',\n xXe: '8b',\n xcyan: '8b8b',\n xgTMnPd: 'b8860b',\n xWay: 'a9a9a9',\n xgYF: '6400',\n xgYy: 'a9a9a9',\n xkhaki: 'bdb76b',\n xmagFta: '8b008b',\n xTivegYF: '556b2f',\n xSange: 'ff8c00',\n xScEd: '9932cc',\n xYd: '8b0000',\n xsOmon: 'e9967a',\n xsHgYF: '8fbc8f',\n xUXe: '483d8b',\n xUWay: '2f4f4f',\n xUgYy: '2f4f4f',\n xQe: 'ced1',\n xviTet: '9400d3',\n dAppRk: 'ff1493',\n dApskyXe: 'bfff',\n dimWay: '696969',\n dimgYy: '696969',\n dodgerXe: '1e90ff',\n fiYbrick: 'b22222',\n flSOwEte: 'fffaf0',\n foYstWAn: '228b22',\n fuKsia: 'ff00ff',\n gaRsbSo: 'dcdcdc',\n ghostwEte: 'f8f8ff',\n gTd: 'ffd700',\n gTMnPd: 'daa520',\n Way: '808080',\n gYF: '8000',\n gYFLw: 'adff2f',\n gYy: '808080',\n honeyMw: 'f0fff0',\n hotpRk: 'ff69b4',\n RdianYd: 'cd5c5c',\n Rdigo: '4b0082',\n ivSy: 'fffff0',\n khaki: 'f0e68c',\n lavFMr: 'e6e6fa',\n lavFMrXsh: 'fff0f5',\n lawngYF: '7cfc00',\n NmoncEffon: 'fffacd',\n ZXe: 'add8e6',\n ZcSO: 'f08080',\n Zcyan: 'e0ffff',\n ZgTMnPdLw: 'fafad2',\n ZWay: 'd3d3d3',\n ZgYF: '90ee90',\n ZgYy: 'd3d3d3',\n ZpRk: 'ffb6c1',\n ZsOmon: 'ffa07a',\n ZsHgYF: '20b2aa',\n ZskyXe: '87cefa',\n ZUWay: '778899',\n ZUgYy: '778899',\n ZstAlXe: 'b0c4de',\n ZLw: 'ffffe0',\n lime: 'ff00',\n limegYF: '32cd32',\n lRF: 'faf0e6',\n magFta: 'ff00ff',\n maPon: '800000',\n VaquamarRe: '66cdaa',\n VXe: 'cd',\n VScEd: 'ba55d3',\n VpurpN: '9370db',\n VsHgYF: '3cb371',\n VUXe: '7b68ee',\n VsprRggYF: 'fa9a',\n VQe: '48d1cc',\n VviTetYd: 'c71585',\n midnightXe: '191970',\n mRtcYam: 'f5fffa',\n mistyPse: 'ffe4e1',\n moccasR: 'ffe4b5',\n navajowEte: 'ffdead',\n navy: '80',\n Tdlace: 'fdf5e6',\n Tive: '808000',\n TivedBb: '6b8e23',\n Sange: 'ffa500',\n SangeYd: 'ff4500',\n ScEd: 'da70d6',\n pOegTMnPd: 'eee8aa',\n pOegYF: '98fb98',\n pOeQe: 'afeeee',\n pOeviTetYd: 'db7093',\n papayawEp: 'ffefd5',\n pHKpuff: 'ffdab9',\n peru: 'cd853f',\n pRk: 'ffc0cb',\n plum: 'dda0dd',\n powMrXe: 'b0e0e6',\n purpN: '800080',\n YbeccapurpN: '663399',\n Yd: 'ff0000',\n Psybrown: 'bc8f8f',\n PyOXe: '4169e1',\n saddNbPwn: '8b4513',\n sOmon: 'fa8072',\n sandybPwn: 'f4a460',\n sHgYF: '2e8b57',\n sHshell: 'fff5ee',\n siFna: 'a0522d',\n silver: 'c0c0c0',\n skyXe: '87ceeb',\n UXe: '6a5acd',\n UWay: '708090',\n UgYy: '708090',\n snow: 'fffafa',\n sprRggYF: 'ff7f',\n stAlXe: '4682b4',\n tan: 'd2b48c',\n teO: '8080',\n tEstN: 'd8bfd8',\n tomato: 'ff6347',\n Qe: '40e0d0',\n viTet: 'ee82ee',\n JHt: 'f5deb3',\n wEte: 'ffffff',\n wEtesmoke: 'f5f5f5',\n Lw: 'ffff00',\n LwgYF: '9acd32'\n};\nfunction unpack() {\n const unpacked = {};\n const keys = Object.keys(names$1);\n const tkeys = Object.keys(map);\n let i, j, k, ok, nk;\n for (i = 0; i < keys.length; i++) {\n ok = nk = keys[i];\n for (j = 0; j < tkeys.length; j++) {\n k = tkeys[j];\n nk = nk.replace(k, map[k]);\n }\n k = parseInt(names$1[ok], 16);\n unpacked[nk] = [k >> 16 & 0xFF, k >> 8 & 0xFF, k & 0xFF];\n }\n return unpacked;\n}\n\nlet names;\nfunction nameParse(str) {\n if (!names) {\n names = unpack();\n names.transparent = [0, 0, 0, 0];\n }\n const a = names[str.toLowerCase()];\n return a && {\n r: a[0],\n g: a[1],\n b: a[2],\n a: a.length === 4 ? a[3] : 255\n };\n}\n\nconst RGB_RE = /^rgba?\\(\\s*([-+.\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?(?:[\\s,/]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction rgbParse(str) {\n const m = RGB_RE.exec(str);\n let a = 255;\n let r, g, b;\n if (!m) {\n return;\n }\n if (m[7] !== r) {\n const v = +m[7];\n a = m[8] ? p2b(v) : lim(v * 255, 0, 255);\n }\n r = +m[1];\n g = +m[3];\n b = +m[5];\n r = 255 & (m[2] ? p2b(r) : lim(r, 0, 255));\n g = 255 & (m[4] ? p2b(g) : lim(g, 0, 255));\n b = 255 & (m[6] ? p2b(b) : lim(b, 0, 255));\n return {\n r: r,\n g: g,\n b: b,\n a: a\n };\n}\nfunction rgbString(v) {\n return v && (\n v.a < 255\n ? `rgba(${v.r}, ${v.g}, ${v.b}, ${b2n(v.a)})`\n : `rgb(${v.r}, ${v.g}, ${v.b})`\n );\n}\n\nconst to = v => v <= 0.0031308 ? v * 12.92 : Math.pow(v, 1.0 / 2.4) * 1.055 - 0.055;\nconst from = v => v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\nfunction interpolate(rgb1, rgb2, t) {\n const r = from(b2n(rgb1.r));\n const g = from(b2n(rgb1.g));\n const b = from(b2n(rgb1.b));\n return {\n r: n2b(to(r + t * (from(b2n(rgb2.r)) - r))),\n g: n2b(to(g + t * (from(b2n(rgb2.g)) - g))),\n b: n2b(to(b + t * (from(b2n(rgb2.b)) - b))),\n a: rgb1.a + t * (rgb2.a - rgb1.a)\n };\n}\n\nfunction modHSL(v, i, ratio) {\n if (v) {\n let tmp = rgb2hsl(v);\n tmp[i] = Math.max(0, Math.min(tmp[i] + tmp[i] * ratio, i === 0 ? 360 : 1));\n tmp = hsl2rgb(tmp);\n v.r = tmp[0];\n v.g = tmp[1];\n v.b = tmp[2];\n }\n}\nfunction clone(v, proto) {\n return v ? Object.assign(proto || {}, v) : v;\n}\nfunction fromObject(input) {\n var v = {r: 0, g: 0, b: 0, a: 255};\n if (Array.isArray(input)) {\n if (input.length >= 3) {\n v = {r: input[0], g: input[1], b: input[2], a: 255};\n if (input.length > 3) {\n v.a = n2b(input[3]);\n }\n }\n } else {\n v = clone(input, {r: 0, g: 0, b: 0, a: 1});\n v.a = n2b(v.a);\n }\n return v;\n}\nfunction functionParse(str) {\n if (str.charAt(0) === 'r') {\n return rgbParse(str);\n }\n return hueParse(str);\n}\nclass Color {\n constructor(input) {\n if (input instanceof Color) {\n return input;\n }\n const type = typeof input;\n let v;\n if (type === 'object') {\n v = fromObject(input);\n } else if (type === 'string') {\n v = hexParse(input) || nameParse(input) || functionParse(input);\n }\n this._rgb = v;\n this._valid = !!v;\n }\n get valid() {\n return this._valid;\n }\n get rgb() {\n var v = clone(this._rgb);\n if (v) {\n v.a = b2n(v.a);\n }\n return v;\n }\n set rgb(obj) {\n this._rgb = fromObject(obj);\n }\n rgbString() {\n return this._valid ? rgbString(this._rgb) : undefined;\n }\n hexString() {\n return this._valid ? hexString(this._rgb) : undefined;\n }\n hslString() {\n return this._valid ? hslString(this._rgb) : undefined;\n }\n mix(color, weight) {\n if (color) {\n const c1 = this.rgb;\n const c2 = color.rgb;\n let w2;\n const p = weight === w2 ? 0.5 : weight;\n const w = 2 * p - 1;\n const a = c1.a - c2.a;\n const w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n w2 = 1 - w1;\n c1.r = 0xFF & w1 * c1.r + w2 * c2.r + 0.5;\n c1.g = 0xFF & w1 * c1.g + w2 * c2.g + 0.5;\n c1.b = 0xFF & w1 * c1.b + w2 * c2.b + 0.5;\n c1.a = p * c1.a + (1 - p) * c2.a;\n this.rgb = c1;\n }\n return this;\n }\n interpolate(color, t) {\n if (color) {\n this._rgb = interpolate(this._rgb, color._rgb, t);\n }\n return this;\n }\n clone() {\n return new Color(this.rgb);\n }\n alpha(a) {\n this._rgb.a = n2b(a);\n return this;\n }\n clearer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 - ratio;\n return this;\n }\n greyscale() {\n const rgb = this._rgb;\n const val = round(rgb.r * 0.3 + rgb.g * 0.59 + rgb.b * 0.11);\n rgb.r = rgb.g = rgb.b = val;\n return this;\n }\n opaquer(ratio) {\n const rgb = this._rgb;\n rgb.a *= 1 + ratio;\n return this;\n }\n negate() {\n const v = this._rgb;\n v.r = 255 - v.r;\n v.g = 255 - v.g;\n v.b = 255 - v.b;\n return this;\n }\n lighten(ratio) {\n modHSL(this._rgb, 2, ratio);\n return this;\n }\n darken(ratio) {\n modHSL(this._rgb, 2, -ratio);\n return this;\n }\n saturate(ratio) {\n modHSL(this._rgb, 1, ratio);\n return this;\n }\n desaturate(ratio) {\n modHSL(this._rgb, 1, -ratio);\n return this;\n }\n rotate(deg) {\n rotate(this._rgb, deg);\n return this;\n }\n}\n\nfunction index_esm(input) {\n return new Color(input);\n}\n\nexport { Color, b2n, b2p, index_esm as default, hexParse, hexString, hsl2rgb, hslString, hsv2rgb, hueParse, hwb2rgb, lim, n2b, n2p, nameParse, p2b, rgb2hsl, rgbParse, rgbString, rotate, round };\n","/**\n * @namespace Chart.helpers\n */\n\nimport type {AnyObject} from '../types/basic.js';\nimport type {ActiveDataPoint, ChartEvent} from '../types/index.js';\n\n/**\n * An empty function that can be used, for example, for optional callback.\n */\nexport function noop() {\n /* noop */\n}\n\n/**\n * Returns a unique id, sequentially generated from a global variable.\n */\nexport const uid = (() => {\n let id = 0;\n return () => id++;\n})();\n\n/**\n * Returns true if `value` is neither null nor undefined, else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */\nexport function isNullOrUndef(value: unknown): value is null | undefined {\n return value === null || typeof value === 'undefined';\n}\n\n/**\n * Returns true if `value` is an array (including typed arrays), else returns false.\n * @param value - The value to test.\n * @function\n */\nexport function isArray(value: unknown): value is T[] {\n if (Array.isArray && Array.isArray(value)) {\n return true;\n }\n const type = Object.prototype.toString.call(value);\n if (type.slice(0, 7) === '[object' && type.slice(-6) === 'Array]') {\n return true;\n }\n return false;\n}\n\n/**\n * Returns true if `value` is an object (excluding null), else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */\nexport function isObject(value: unknown): value is AnyObject {\n return value !== null && Object.prototype.toString.call(value) === '[object Object]';\n}\n\n/**\n * Returns true if `value` is a finite number, else returns false\n * @param value - The value to test.\n */\nfunction isNumberFinite(value: unknown): value is number {\n return (typeof value === 'number' || value instanceof Number) && isFinite(+value);\n}\nexport {\n isNumberFinite as isFinite,\n};\n\n/**\n * Returns `value` if finite, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is not finite.\n */\nexport function finiteOrDefault(value: unknown, defaultValue: number) {\n return isNumberFinite(value) ? value : defaultValue;\n}\n\n/**\n * Returns `value` if defined, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is undefined.\n */\nexport function valueOrDefault(value: T | undefined, defaultValue: T) {\n return typeof value === 'undefined' ? defaultValue : value;\n}\n\nexport const toPercentage = (value: number | string, dimension: number) =>\n typeof value === 'string' && value.endsWith('%') ?\n parseFloat(value) / 100\n : +value / dimension;\n\nexport const toDimension = (value: number | string, dimension: number) =>\n typeof value === 'string' && value.endsWith('%') ?\n parseFloat(value) / 100 * dimension\n : +value;\n\n/**\n * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the\n * value returned by `fn`. If `fn` is not a function, this method returns undefined.\n * @param fn - The function to call.\n * @param args - The arguments with which `fn` should be called.\n * @param [thisArg] - The value of `this` provided for the call to `fn`.\n */\nexport function callback R, TA, R>(\n fn: T | undefined,\n args: unknown[],\n thisArg?: TA\n): R | undefined {\n if (fn && typeof fn.call === 'function') {\n return fn.apply(thisArg, args);\n }\n}\n\n/**\n * Note(SB) for performance sake, this method should only be used when loopable type\n * is unknown or in none intensive code (not called often and small loopable). Else\n * it's preferable to use a regular for() loop and save extra function calls.\n * @param loopable - The object or array to be iterated.\n * @param fn - The function to call for each item.\n * @param [thisArg] - The value of `this` provided for the call to `fn`.\n * @param [reverse] - If true, iterates backward on the loopable.\n */\nexport function each(\n loopable: Record,\n fn: (this: TA, v: T, i: string) => void,\n thisArg?: TA,\n reverse?: boolean\n): void;\nexport function each(\n loopable: T[],\n fn: (this: TA, v: T, i: number) => void,\n thisArg?: TA,\n reverse?: boolean\n): void;\nexport function each(\n loopable: T[] | Record,\n fn: (this: TA, v: T, i: any) => void,\n thisArg?: TA,\n reverse?: boolean\n) {\n let i: number, len: number, keys: string[];\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}\n\n/**\n * Returns true if the `a0` and `a1` arrays have the same content, else returns false.\n * @param a0 - The array to compare\n * @param a1 - The array to compare\n * @private\n */\nexport function _elementsEqual(a0: ActiveDataPoint[], a1: ActiveDataPoint[]) {\n let i: number, ilen: number, v0: ActiveDataPoint, v1: ActiveDataPoint;\n\n if (!a0 || !a1 || a0.length !== a1.length) {\n return false;\n }\n\n for (i = 0, ilen = a0.length; i < ilen; ++i) {\n v0 = a0[i];\n v1 = a1[i];\n\n if (v0.datasetIndex !== v1.datasetIndex || v0.index !== v1.index) {\n return false;\n }\n }\n\n return true;\n}\n\n/**\n * Returns a deep copy of `source` without keeping references on objects and arrays.\n * @param source - The value to clone.\n */\nexport function clone(source: T): T {\n if (isArray(source)) {\n return source.map(clone) as unknown as T;\n }\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\n for (; k < klen; ++k) {\n target[keys[k]] = clone(source[keys[k]]);\n }\n\n return target;\n }\n\n return source;\n}\n\nfunction isValidKey(key: string) {\n return ['__proto__', 'prototype', 'constructor'].indexOf(key) === -1;\n}\n\n/**\n * The default merger when Chart.helpers.merge is called without merger option.\n * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback.\n * @private\n */\nexport function _merger(key: string, target: AnyObject, source: AnyObject, options: AnyObject) {\n if (!isValidKey(key)) {\n return;\n }\n\n const tval = target[key];\n const sval = source[key];\n\n if (isObject(tval) && isObject(sval)) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n merge(tval, sval, options);\n } else {\n target[key] = clone(sval);\n }\n}\n\nexport interface MergeOptions {\n merger?: (key: string, target: AnyObject, source: AnyObject, options?: AnyObject) => void;\n}\n\n/**\n * Recursively deep copies `source` properties into `target` with the given `options`.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param target - The target object in which all sources are merged into.\n * @param source - Object(s) to merge into `target`.\n * @param [options] - Merging options:\n * @param [options.merger] - The merge method (key, target, source, options)\n * @returns The `target` object.\n */\nexport function merge(target: T, source: [], options?: MergeOptions): T;\nexport function merge(target: T, source: S1, options?: MergeOptions): T & S1;\nexport function merge(target: T, source: [S1], options?: MergeOptions): T & S1;\nexport function merge(target: T, source: [S1, S2], options?: MergeOptions): T & S1 & S2;\nexport function merge(target: T, source: [S1, S2, S3], options?: MergeOptions): T & S1 & S2 & S3;\nexport function merge(\n target: T,\n source: [S1, S2, S3, S4],\n options?: MergeOptions\n): T & S1 & S2 & S3 & S4;\nexport function merge(target: T, source: AnyObject[], options?: MergeOptions): AnyObject;\nexport function merge(target: T, source: AnyObject[], options?: MergeOptions): AnyObject {\n const sources = isArray(source) ? source : [source];\n const ilen = sources.length;\n\n if (!isObject(target)) {\n return target as AnyObject;\n }\n\n options = options || {};\n const merger = options.merger || _merger;\n let current: AnyObject;\n\n for (let i = 0; i < ilen; ++i) {\n current = sources[i];\n if (!isObject(current)) {\n continue;\n }\n\n const keys = Object.keys(current);\n for (let k = 0, klen = keys.length; k < klen; ++k) {\n merger(keys[k], target, current, options as AnyObject);\n }\n }\n\n return target;\n}\n\n/**\n * Recursively deep copies `source` properties into `target` *only* if not defined in target.\n * IMPORTANT: `target` is not cloned and will be updated with `source` properties.\n * @param target - The target object in which all sources are merged into.\n * @param source - Object(s) to merge into `target`.\n * @returns The `target` object.\n */\nexport function mergeIf(target: T, source: []): T;\nexport function mergeIf(target: T, source: S1): T & S1;\nexport function mergeIf(target: T, source: [S1]): T & S1;\nexport function mergeIf(target: T, source: [S1, S2]): T & S1 & S2;\nexport function mergeIf(target: T, source: [S1, S2, S3]): T & S1 & S2 & S3;\nexport function mergeIf(target: T, source: [S1, S2, S3, S4]): T & S1 & S2 & S3 & S4;\nexport function mergeIf(target: T, source: AnyObject[]): AnyObject;\nexport function mergeIf(target: T, source: AnyObject[]): AnyObject {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n return merge(target, source, {merger: _mergerIf});\n}\n\n/**\n * Merges source[key] in target[key] only if target[key] is undefined.\n * @private\n */\nexport function _mergerIf(key: string, target: AnyObject, source: AnyObject) {\n if (!isValidKey(key)) {\n return;\n }\n\n const tval = target[key];\n const sval = source[key];\n\n if (isObject(tval) && isObject(sval)) {\n mergeIf(tval, sval);\n } else if (!Object.prototype.hasOwnProperty.call(target, key)) {\n target[key] = clone(sval);\n }\n}\n\n/**\n * @private\n */\nexport function _deprecated(scope: string, value: unknown, previous: string, current: string) {\n if (value !== undefined) {\n console.warn(scope + ': \"' + previous +\n '\" is deprecated. Please use \"' + current + '\" instead');\n }\n}\n\n// resolveObjectKey resolver cache\nconst keyResolvers = {\n // Chart.helpers.core resolveObjectKey should resolve empty key to root object\n '': v => v,\n // default resolvers\n x: o => o.x,\n y: o => o.y\n};\n\n/**\n * @private\n */\nexport function _splitKey(key: string) {\n const parts = key.split('.');\n const keys: string[] = [];\n let tmp = '';\n for (const part of parts) {\n tmp += part;\n if (tmp.endsWith('\\\\')) {\n tmp = tmp.slice(0, -1) + '.';\n } else {\n keys.push(tmp);\n tmp = '';\n }\n }\n return keys;\n}\n\nfunction _getKeyResolver(key: string) {\n const keys = _splitKey(key);\n return obj => {\n for (const k of keys) {\n if (k === '') {\n // For backward compatibility:\n // Chart.helpers.core resolveObjectKey should break at empty key\n break;\n }\n obj = obj && obj[k];\n }\n return obj;\n };\n}\n\nexport function resolveObjectKey(obj: AnyObject, key: string): any {\n const resolver = keyResolvers[key] || (keyResolvers[key] = _getKeyResolver(key));\n return resolver(obj);\n}\n\n/**\n * @private\n */\nexport function _capitalize(str: string) {\n return str.charAt(0).toUpperCase() + str.slice(1);\n}\n\n\nexport const defined = (value: unknown) => typeof value !== 'undefined';\n\nexport const isFunction = (value: unknown): value is (...args: any[]) => any => typeof value === 'function';\n\n// Adapted from https://stackoverflow.com/questions/31128855/comparing-ecma6-sets-for-equality#31129384\nexport const setsEqual = (a: Set, b: Set) => {\n if (a.size !== b.size) {\n return false;\n }\n\n for (const item of a) {\n if (!b.has(item)) {\n return false;\n }\n }\n\n return true;\n};\n\n/**\n * @param e - The event\n * @private\n */\nexport function _isClickEvent(e: ChartEvent) {\n return e.type === 'mouseup' || e.type === 'click' || e.type === 'contextmenu';\n}\n","import type {Point} from '../types/geometric.js';\nimport {isFinite as isFiniteNumber} from './helpers.core.js';\n\n/**\n * @alias Chart.helpers.math\n * @namespace\n */\n\nexport const PI = Math.PI;\nexport const TAU = 2 * PI;\nexport const PITAU = TAU + PI;\nexport const INFINITY = Number.POSITIVE_INFINITY;\nexport const RAD_PER_DEG = PI / 180;\nexport const HALF_PI = PI / 2;\nexport const QUARTER_PI = PI / 4;\nexport const TWO_THIRDS_PI = PI * 2 / 3;\n\nexport const log10 = Math.log10;\nexport const sign = Math.sign;\n\nexport function almostEquals(x: number, y: number, epsilon: number) {\n return Math.abs(x - y) < epsilon;\n}\n\n/**\n * Implementation of the nice number algorithm used in determining where axis labels will go\n */\nexport function niceNum(range: number) {\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}\n\n/**\n * Returns an array of factors sorted from 1 to sqrt(value)\n * @private\n */\nexport function _factorize(value: number) {\n const result: number[] = [];\n const sqrt = Math.sqrt(value);\n let i: number;\n\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)) { // if value is a square number\n result.push(sqrt);\n }\n\n result.sort((a, b) => a - b).pop();\n return result;\n}\n\nexport function isNumber(n: unknown): n is number {\n return !isNaN(parseFloat(n as string)) && isFinite(n as number);\n}\n\nexport function almostWhole(x: number, epsilon: number) {\n const rounded = Math.round(x);\n return ((rounded - epsilon) <= x) && ((rounded + epsilon) >= x);\n}\n\n/**\n * @private\n */\nexport function _setMinAndMaxByKey(\n array: Record[],\n target: { min: number, max: number },\n property: string\n) {\n let i: number, ilen: number, value: number;\n\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}\n\nexport function toRadians(degrees: number) {\n return degrees * (PI / 180);\n}\n\nexport function toDegrees(radians: number) {\n return radians * (180 / PI);\n}\n\n/**\n * Returns the number of decimal places\n * i.e. the number of digits after the decimal point, of the value of this Number.\n * @param x - A number.\n * @returns The number of decimal places.\n * @private\n */\nexport function _decimalPlaces(x: number) {\n if (!isFiniteNumber(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}\n\n// Gets the angle from vertical upright to the point about a centre.\nexport function getAngleFromPoint(\n centrePoint: Point,\n anglePoint: Point\n) {\n const distanceFromXCenter = anglePoint.x - centrePoint.x;\n const distanceFromYCenter = anglePoint.y - centrePoint.y;\n const radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n\n let angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n\n if (angle < (-0.5 * PI)) {\n angle += TAU; // make sure the returned angle is in the range of (-PI/2, 3PI/2]\n }\n\n return {\n angle,\n distance: radialDistanceFromCenter\n };\n}\n\nexport function distanceBetweenPoints(pt1: Point, pt2: Point) {\n return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n}\n\n/**\n * Shortest distance between angles, in either direction.\n * @private\n */\nexport function _angleDiff(a: number, b: number) {\n return (a - b + PITAU) % TAU - PI;\n}\n\n/**\n * Normalize angle to be between 0 and 2*PI\n * @private\n */\nexport function _normalizeAngle(a: number) {\n return (a % TAU + TAU) % TAU;\n}\n\n/**\n * @private\n */\nexport function _angleBetween(angle: number, start: number, end: number, sameAngleIsFullCircle?: boolean) {\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}\n\n/**\n * Limit `value` between `min` and `max`\n * @param value\n * @param min\n * @param max\n * @private\n */\nexport function _limitValue(value: number, min: number, max: number) {\n return Math.max(min, Math.min(max, value));\n}\n\n/**\n * @param {number} value\n * @private\n */\nexport function _int16Range(value: number) {\n return _limitValue(value, -32768, 32767);\n}\n\n/**\n * @param value\n * @param start\n * @param end\n * @param [epsilon]\n * @private\n */\nexport function _isBetween(value: number, start: number, end: number, epsilon = 1e-6) {\n return value >= Math.min(start, end) - epsilon && value <= Math.max(start, end) + epsilon;\n}\n","import {_capitalize} from './helpers.core.js';\n\n/**\n * Binary search\n * @param table - the table search. must be sorted!\n * @param value - value to find\n * @param cmp\n * @private\n */\nexport function _lookup(\n table: number[],\n value: number,\n cmp?: (value: number) => boolean\n): {lo: number, hi: number};\nexport function _lookup(\n table: T[],\n value: number,\n cmp: (value: number) => boolean\n): {lo: number, hi: number};\nexport function _lookup(\n table: unknown[],\n value: number,\n cmp?: (value: number) => boolean\n) {\n cmp = cmp || ((index) => table[index] < value);\n let hi = table.length - 1;\n let lo = 0;\n let mid: number;\n\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\n return {lo, hi};\n}\n\n/**\n * Binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @param last - lookup last index\n * @private\n */\nexport const _lookupByKey = (\n table: Record[],\n key: string,\n value: number,\n last?: boolean\n) =>\n _lookup(table, value, last\n ? index => {\n const ti = table[index][key];\n return ti < value || ti === value && table[index + 1][key] === value;\n }\n : index => table[index][key] < value);\n\n/**\n * Reverse binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @private\n */\nexport const _rlookupByKey = (\n table: Record[],\n key: string,\n value: number\n) =>\n _lookup(table, value, index => table[index][key] >= value);\n\n/**\n * Return subset of `values` between `min` and `max` inclusive.\n * Values are assumed to be in sorted order.\n * @param values - sorted array of values\n * @param min - min value\n * @param max - max value\n */\nexport function _filterBetween(values: number[], min: number, max: number) {\n let start = 0;\n let end = values.length;\n\n while (start < end && values[start] < min) {\n start++;\n }\n while (end > start && values[end - 1] > max) {\n end--;\n }\n\n return start > 0 || end < values.length\n ? values.slice(start, end)\n : values;\n}\n\nconst arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift'] as const;\n\nexport interface ArrayListener {\n _onDataPush?(...item: T[]): void;\n _onDataPop?(): void;\n _onDataShift?(): void;\n _onDataSplice?(index: number, deleteCount: number, ...items: T[]): void;\n _onDataUnshift?(...item: T[]): void;\n}\n\n/**\n * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice',\n * 'unshift') and notify the listener AFTER the array has been altered. Listeners are\n * called on the '_onData*' callbacks (e.g. _onDataPush, etc.) with same arguments.\n */\nexport function listenArrayEvents(array: T[], listener: ArrayListener): void;\nexport function listenArrayEvents(array, listener) {\n if (array._chartjs) {\n array._chartjs.listeners.push(listener);\n return;\n }\n\n Object.defineProperty(array, '_chartjs', {\n configurable: true,\n enumerable: false,\n value: {\n listeners: [listener]\n }\n });\n\n arrayEvents.forEach((key) => {\n const method = '_onData' + _capitalize(key);\n const base = array[key];\n\n Object.defineProperty(array, key, {\n configurable: true,\n enumerable: false,\n value(...args) {\n const res = base.apply(this, args);\n\n array._chartjs.listeners.forEach((object) => {\n if (typeof object[method] === 'function') {\n object[method](...args);\n }\n });\n\n return res;\n }\n });\n });\n}\n\n\n/**\n * Removes the given array event listener and cleanup extra attached properties (such as\n * the _chartjs stub and overridden methods) if array doesn't have any more listeners.\n */\nexport function unlistenArrayEvents(array: T[], listener: ArrayListener): void;\nexport function unlistenArrayEvents(array, listener) {\n const stub = array._chartjs;\n if (!stub) {\n return;\n }\n\n const listeners = stub.listeners;\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n listeners.splice(index, 1);\n }\n\n if (listeners.length > 0) {\n return;\n }\n\n arrayEvents.forEach((key) => {\n delete array[key];\n });\n\n delete array._chartjs;\n}\n\n/**\n * @param items\n */\nexport function _arrayUnique(items: T[]) {\n const set = new Set(items);\n\n if (set.size === items.length) {\n return items;\n }\n\n return Array.from(set);\n}\n","import type {ChartMeta, PointElement} from '../types/index.js';\n\nimport {_limitValue} from './helpers.math.js';\nimport {_lookupByKey} from './helpers.collection.js';\n\nexport function fontString(pixelSize: number, fontStyle: string, fontFamily: string) {\n return fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n}\n\n/**\n* Request animation polyfill\n*/\nexport const requestAnimFrame = (function() {\n if (typeof window === 'undefined') {\n return function(callback) {\n return callback();\n };\n }\n return window.requestAnimationFrame;\n}());\n\n/**\n * Throttles calling `fn` once per animation frame\n * Latest arguments are used on the actual call\n */\nexport function throttled>(\n fn: (...args: TArgs) => void,\n thisArg: any,\n) {\n let argsToUse = [] as TArgs;\n let ticking = false;\n\n return function(...args: TArgs) {\n // Save the args for use later\n argsToUse = args;\n if (!ticking) {\n ticking = true;\n requestAnimFrame.call(window, () => {\n ticking = false;\n fn.apply(thisArg, argsToUse);\n });\n }\n };\n}\n\n/**\n * Debounces calling `fn` for `delay` ms\n */\nexport function debounce>(fn: (...args: TArgs) => void, delay: number) {\n let timeout;\n return function(...args: TArgs) {\n if (delay) {\n clearTimeout(timeout);\n timeout = setTimeout(fn, delay, args);\n } else {\n fn.apply(this, args);\n }\n return delay;\n };\n}\n\n/**\n * Converts 'start' to 'left', 'end' to 'right' and others to 'center'\n * @private\n */\nexport const _toLeftRightCenter = (align: 'start' | 'end' | 'center') => align === 'start' ? 'left' : align === 'end' ? 'right' : 'center';\n\n/**\n * Returns `start`, `end` or `(start + end) / 2` depending on `align`. Defaults to `center`\n * @private\n */\nexport const _alignStartEnd = (align: 'start' | 'end' | 'center', start: number, end: number) => align === 'start' ? start : align === 'end' ? end : (start + end) / 2;\n\n/**\n * Returns `left`, `right` or `(left + right) / 2` depending on `align`. Defaults to `left`\n * @private\n */\nexport const _textX = (align: 'left' | 'right' | 'center', left: number, right: number, rtl: boolean) => {\n const check = rtl ? 'left' : 'right';\n return align === check ? right : align === 'center' ? (left + right) / 2 : left;\n};\n\n/**\n * Return start and count of visible points.\n * @private\n */\nexport function _getStartAndCountOfVisiblePoints(meta: ChartMeta<'line' | 'scatter'>, points: PointElement[], animationsDisabled: boolean) {\n const pointCount = points.length;\n\n let start = 0;\n let count = pointCount;\n\n if (meta._sorted) {\n const {iScale, _parsed} = meta;\n const axis = iScale.axis;\n const {min, max, minDefined, maxDefined} = iScale.getUserBounds();\n\n if (minDefined) {\n start = _limitValue(Math.min(\n // @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, axis, min).lo,\n // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? pointCount : _lookupByKey(points, axis, iScale.getPixelForValue(min)).lo),\n 0, pointCount - 1);\n }\n if (maxDefined) {\n count = _limitValue(Math.max(\n // @ts-expect-error Need to type _parsed\n _lookupByKey(_parsed, iScale.axis, max, true).hi + 1,\n // @ts-expect-error Need to fix types on _lookupByKey\n animationsDisabled ? 0 : _lookupByKey(points, axis, iScale.getPixelForValue(max), true).hi + 1),\n start, pointCount) - start;\n } else {\n count = pointCount - start;\n }\n }\n\n return {start, count};\n}\n\n/**\n * Checks if the scale ranges have changed.\n * @param {object} meta - dataset meta.\n * @returns {boolean}\n * @private\n */\nexport function _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\n Object.assign(_scaleRanges, newRanges);\n return changed;\n}\n","import {PI, TAU, HALF_PI} from './helpers.math.js';\n\nconst atEdge = (t: number) => t === 0 || t === 1;\nconst elasticIn = (t: number, s: number, p: number) => -(Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * TAU / p));\nconst elasticOut = (t: number, s: number, p: number) => Math.pow(2, -10 * t) * Math.sin((t - s) * TAU / p) + 1;\n\n/**\n * Easing functions adapted from Robert Penner's easing equations.\n * @namespace Chart.helpers.easing.effects\n * @see http://www.robertpenner.com/easing/\n */\nconst effects = {\n linear: (t: number) => t,\n\n easeInQuad: (t: number) => t * t,\n\n easeOutQuad: (t: number) => -t * (t - 2),\n\n easeInOutQuad: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t\n : -0.5 * ((--t) * (t - 2) - 1),\n\n easeInCubic: (t: number) => t * t * t,\n\n easeOutCubic: (t: number) => (t -= 1) * t * t + 1,\n\n easeInOutCubic: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t\n : 0.5 * ((t -= 2) * t * t + 2),\n\n easeInQuart: (t: number) => t * t * t * t,\n\n easeOutQuart: (t: number) => -((t -= 1) * t * t * t - 1),\n\n easeInOutQuart: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t * t\n : -0.5 * ((t -= 2) * t * t * t - 2),\n\n easeInQuint: (t: number) => t * t * t * t * t,\n\n easeOutQuint: (t: number) => (t -= 1) * t * t * t * t + 1,\n\n easeInOutQuint: (t: number) => ((t /= 0.5) < 1)\n ? 0.5 * t * t * t * t * t\n : 0.5 * ((t -= 2) * t * t * t * t + 2),\n\n easeInSine: (t: number) => -Math.cos(t * HALF_PI) + 1,\n\n easeOutSine: (t: number) => Math.sin(t * HALF_PI),\n\n easeInOutSine: (t: number) => -0.5 * (Math.cos(PI * t) - 1),\n\n easeInExpo: (t: number) => (t === 0) ? 0 : Math.pow(2, 10 * (t - 1)),\n\n easeOutExpo: (t: number) => (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1,\n\n easeInOutExpo: (t: number) => 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\n easeInCirc: (t: number) => (t >= 1) ? t : -(Math.sqrt(1 - t * t) - 1),\n\n easeOutCirc: (t: number) => Math.sqrt(1 - (t -= 1) * t),\n\n easeInOutCirc: (t: number) => ((t /= 0.5) < 1)\n ? -0.5 * (Math.sqrt(1 - t * t) - 1)\n : 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1),\n\n easeInElastic: (t: number) => atEdge(t) ? t : elasticIn(t, 0.075, 0.3),\n\n easeOutElastic: (t: number) => atEdge(t) ? t : elasticOut(t, 0.075, 0.3),\n\n easeInOutElastic(t: number) {\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\n easeInBack(t: number) {\n const s = 1.70158;\n return t * t * ((s + 1) * t - s);\n },\n\n easeOutBack(t: number) {\n const s = 1.70158;\n return (t -= 1) * t * ((s + 1) * t + s) + 1;\n },\n\n easeInOutBack(t: number) {\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\n easeInBounce: (t: number) => 1 - effects.easeOutBounce(1 - t),\n\n easeOutBounce(t: number) {\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\n easeInOutBounce: (t: number) => (t < 0.5)\n ? effects.easeInBounce(t * 2) * 0.5\n : effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5,\n} as const;\n\nexport type EasingFunction = keyof typeof effects\n\nexport default effects;\n","import {Color} from '@kurkle/color';\n\nexport function isPatternOrGradient(value: unknown): value is CanvasPattern | CanvasGradient {\n if (value && typeof value === 'object') {\n const type = value.toString();\n return type === '[object CanvasPattern]' || type === '[object CanvasGradient]';\n }\n\n return false;\n}\n\nexport function color(value: CanvasGradient): CanvasGradient;\nexport function color(value: CanvasPattern): CanvasPattern;\nexport function color(\n value:\n | string\n | { r: number; g: number; b: number; a: number }\n | [number, number, number]\n | [number, number, number, number]\n): Color;\nexport function color(value) {\n return isPatternOrGradient(value) ? value : new Color(value);\n}\n\nexport function getHoverColor(value: CanvasGradient): CanvasGradient;\nexport function getHoverColor(value: CanvasPattern): CanvasPattern;\nexport function getHoverColor(value: string): string;\nexport function getHoverColor(value) {\n return isPatternOrGradient(value)\n ? value\n : new Color(value).saturate(0.5).darken(0.1).hexString();\n}\n","const numbers = ['x', 'y', 'borderWidth', 'radius', 'tension'];\nconst colors = ['color', 'borderColor', 'backgroundColor'];\n\nexport function applyAnimationsDefaults(defaults) {\n defaults.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 });\n\n defaults.describe('animation', {\n _fallback: false,\n _indexable: false,\n _scriptable: (name) => name !== 'onProgress' && name !== 'onComplete' && name !== 'fn',\n });\n\n defaults.set('animations', {\n colors: {\n type: 'color',\n properties: colors\n },\n numbers: {\n type: 'number',\n properties: numbers\n },\n });\n\n defaults.describe('animations', {\n _fallback: 'animation',\n });\n\n defaults.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 // show immediately\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 // for keeping the dataset visible all the way through the animation\n },\n }\n }\n });\n}\n","\nconst intlCache = new Map();\n\nfunction getNumberFormat(locale: string, options?: Intl.NumberFormatOptions) {\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}\n\nexport function formatNumber(num: number, locale: string, options?: Intl.NumberFormatOptions) {\n return getNumberFormat(locale, options).format(num);\n}\n","import {isArray} from '../helpers/helpers.core.js';\nimport {formatNumber} from '../helpers/helpers.intl.js';\nimport {log10} from '../helpers/helpers.math.js';\n\n/**\n * Namespace to hold formatters for different types of ticks\n * @namespace Chart.Ticks.formatters\n */\nconst formatters = {\n /**\n * Formatter for value labels\n * @method Chart.Ticks.formatters.values\n * @param value the value to display\n * @return {string|string[]} the label to display\n */\n values(value) {\n return isArray(value) ? /** @type {string[]} */ (value) : '' + value;\n },\n\n /**\n * Formatter for numeric ticks\n * @method Chart.Ticks.formatters.numeric\n * @param tickValue {number} the value to be formatted\n * @param index {number} the position of the tickValue parameter in the ticks array\n * @param ticks {object[]} the list of ticks being converted\n * @return {string} string representation of the tickValue parameter\n */\n numeric(tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0'; // never show decimal places for 0\n }\n\n const locale = this.chart.options.locale;\n let notation;\n let delta = tickValue; // This is used when there are less than 2 ticks as the tick interval.\n\n if (ticks.length > 1) {\n // all ticks are small or there huge numbers; use scientific notation\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\n delta = calculateDelta(tickValue, ticks);\n }\n\n const logDelta = log10(Math.abs(delta));\n\n // When datasets have values approaching Number.MAX_VALUE, the tick calculations might result in\n // infinity and eventually NaN. Passing NaN for minimumFractionDigits or maximumFractionDigits\n // will make the number formatter throw. So instead we check for isNaN and use a fallback value.\n //\n // toFixed has a max of 20 decimal places\n const numDecimal = isNaN(logDelta) ? 1 : Math.max(Math.min(-1 * Math.floor(logDelta), 20), 0);\n\n const options = {notation, minimumFractionDigits: numDecimal, maximumFractionDigits: numDecimal};\n Object.assign(options, this.options.ticks.format);\n\n return formatNumber(tickValue, locale, options);\n },\n\n\n /**\n * Formatter for logarithmic ticks\n * @method Chart.Ticks.formatters.logarithmic\n * @param tickValue {number} the value to be formatted\n * @param index {number} the position of the tickValue parameter in the ticks array\n * @param ticks {object[]} the list of ticks being converted\n * @return {string} string representation of the tickValue parameter\n */\n logarithmic(tickValue, index, ticks) {\n if (tickValue === 0) {\n return '0';\n }\n const remain = ticks[index].significand || (tickValue / (Math.pow(10, Math.floor(log10(tickValue)))));\n if ([1, 2, 3, 5, 10, 15].includes(remain) || index > 0.8 * ticks.length) {\n return formatters.numeric.call(this, tickValue, index, ticks);\n }\n return '';\n }\n\n};\n\n\nfunction calculateDelta(tickValue, ticks) {\n // Figure out how many digits to show\n // The space between the first two ticks might be smaller than normal spacing\n let delta = ticks.length > 3 ? ticks[2].value - ticks[1].value : ticks[1].value - ticks[0].value;\n\n // If we have a number like 2.5 as the delta, figure out how many decimal places we need\n if (Math.abs(delta) >= 1 && tickValue !== Math.floor(tickValue)) {\n // not an integer\n delta = tickValue - Math.floor(tickValue);\n }\n return delta;\n}\n\n/**\n * Namespace to hold static tick generation functions\n * @namespace Chart.Ticks\n */\nexport default {formatters};\n","import {getHoverColor} from '../helpers/helpers.color.js';\nimport {isObject, merge, valueOrDefault} from '../helpers/helpers.core.js';\nimport {applyAnimationsDefaults} from './core.animations.defaults.js';\nimport {applyLayoutsDefaults} from './core.layouts.defaults.js';\nimport {applyScaleDefaults} from './core.scale.defaults.js';\n\nexport const overrides = Object.create(null);\nexport const descriptors = Object.create(null);\n\n/**\n * @param {object} node\n * @param {string} key\n * @return {object}\n */\nfunction getScope(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}\n\nfunction set(root, scope, values) {\n if (typeof scope === 'string') {\n return merge(getScope(root, scope), values);\n }\n return merge(getScope(root, ''), scope);\n}\n\n/**\n * Please use the module's default export which provides a singleton instance\n * Note: class is exported for typedoc\n */\nexport class Defaults {\n constructor(_descriptors, _appliers) {\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 includeInvisible: false\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.drawActiveElementsOnTop = true;\n\n this.describe(_descriptors);\n this.apply(_appliers);\n }\n\n /**\n\t * @param {string|object} scope\n\t * @param {object} [values]\n\t */\n set(scope, values) {\n return set(this, scope, values);\n }\n\n /**\n\t * @param {string} scope\n\t */\n get(scope) {\n return getScope(this, scope);\n }\n\n /**\n\t * @param {string|object} scope\n\t * @param {object} [values]\n\t */\n describe(scope, values) {\n return set(descriptors, scope, values);\n }\n\n override(scope, values) {\n return set(overrides, scope, values);\n }\n\n /**\n\t * Routes the named defaults to fallback to another scope/name.\n\t * This routing is useful when those target values, like defaults.color, are changed runtime.\n\t * If the values would be copied, the runtime change would not take effect. By routing, the\n\t * fallback is evaluated at each access, so its always up to date.\n\t *\n\t * Example:\n\t *\n\t * \tdefaults.route('elements.arc', 'backgroundColor', '', 'color')\n\t * - reads the backgroundColor from defaults.color when undefined locally\n\t *\n\t * @param {string} scope Scope this route applies to.\n\t * @param {string} name Property name that should be routed to different namespace when not defined here.\n\t * @param {string} targetScope The namespace where those properties should be routed to.\n\t * Empty string ('') is the root of defaults.\n\t * @param {string} targetName The target name in the target scope the property should be routed to.\n\t */\n route(scope, name, targetScope, targetName) {\n const scopeObject = getScope(this, scope);\n const targetScopeObject = getScope(this, targetScope);\n const privateName = '_' + name;\n\n Object.defineProperties(scopeObject, {\n // A private property is defined to hold the actual value, when this property is set in its scope (set in the setter)\n [privateName]: {\n value: scopeObject[name],\n writable: true\n },\n // The actual property is defined as getter/setter so we can do the routing when value is not locally set.\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\n apply(appliers) {\n appliers.forEach((apply) => apply(this));\n }\n}\n\n// singleton instance\nexport default /* #__PURE__ */ 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}, [applyAnimationsDefaults, applyLayoutsDefaults, applyScaleDefaults]);\n","export function applyLayoutsDefaults(defaults) {\n defaults.set('layout', {\n autoPadding: true,\n padding: {\n top: 0,\n right: 0,\n bottom: 0,\n left: 0\n }\n });\n}\n","import Ticks from './core.ticks.js';\n\nexport function applyScaleDefaults(defaults) {\n defaults.set('scale', {\n display: true,\n offset: false,\n reverse: false,\n beginAtZero: false,\n\n /**\n * Scale boundary strategy (bypassed by min/max time options)\n * - `data`: make sure data are fully visible, ticks outside are removed\n * - `ticks`: make sure ticks are fully visible, data outside are truncated\n * @see https://github.com/chartjs/Chart.js/pull/4556\n * @since 3.0.0\n */\n bounds: 'ticks',\n\n clip: true,\n\n /**\n * Addition grace added to max and reduced from min data value.\n * @since 3.0.0\n */\n grace: 0,\n\n // grid line settings\n grid: {\n display: true,\n lineWidth: 1,\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 },\n\n border: {\n display: true,\n dash: [],\n dashOffset: 0.0,\n width: 1\n },\n\n // scale title\n title: {\n // display property\n display: false,\n\n // actual label\n text: '',\n\n // top/bottom padding\n padding: {\n top: 4,\n bottom: 4\n }\n },\n\n // label settings\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 // We pass through arrays to be rendered as multiline labels, we convert Others to strings here.\n callback: Ticks.formatters.values,\n minor: {},\n major: {},\n align: 'center',\n crossAlign: 'near',\n\n showLabelBackdrop: false,\n backdropColor: 'rgba(255, 255, 255, 0.75)',\n backdropPadding: 2,\n }\n });\n\n defaults.route('scale.ticks', 'color', '', 'color');\n defaults.route('scale.grid', 'color', '', 'borderColor');\n defaults.route('scale.border', 'color', '', 'borderColor');\n defaults.route('scale.title', 'color', '', 'color');\n\n defaults.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' && name !== 'dash',\n });\n\n defaults.describe('scales', {\n _fallback: 'scale',\n });\n\n defaults.describe('scale.ticks', {\n _scriptable: (name) => name !== 'backdropPadding' && name !== 'callback',\n _indexable: (name) => name !== 'backdropPadding',\n });\n}\n","import type {\n Chart,\n Point,\n FontSpec,\n CanvasFontSpec,\n PointStyle,\n RenderTextOpts,\n BackdropOptions\n} from '../types/index.js';\nimport type {\n TRBL,\n SplinePoint,\n RoundedRect,\n TRBLCorners\n} from '../types/geometric.js';\nimport {isArray, isNullOrUndef} from './helpers.core.js';\nimport {PI, TAU, HALF_PI, QUARTER_PI, TWO_THIRDS_PI, RAD_PER_DEG} from './helpers.math.js';\n\n/**\n * Converts the given font object into a CSS font string.\n * @param font - A font object.\n * @return The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font\n * @private\n */\nexport function toFontString(font: FontSpec) {\n if (!font || isNullOrUndef(font.size) || isNullOrUndef(font.family)) {\n return null;\n }\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}\n\n/**\n * @private\n */\nexport function _measureText(\n ctx: CanvasRenderingContext2D,\n data: Record,\n gc: string[],\n longest: number,\n string: string\n) {\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}\n\ntype Thing = string | undefined | null\ntype Things = (Thing | Thing[])[]\n\n/**\n * @private\n */\n// eslint-disable-next-line complexity\nexport function _longestText(\n ctx: CanvasRenderingContext2D,\n font: string,\n arrayOfThings: Things,\n cache?: {data?: Record, garbageCollect?: string[], font?: string}\n) {\n cache = cache || {};\n let data = cache.data = cache.data || {};\n let gc = cache.garbageCollect = cache.garbageCollect || [];\n\n if (cache.font !== font) {\n data = cache.data = {};\n gc = cache.garbageCollect = [];\n cache.font = font;\n }\n\n ctx.save();\n\n ctx.font = font;\n let longest = 0;\n const ilen = arrayOfThings.length;\n let i: number, j: number, jlen: number, thing: Thing | Thing[], nestedThing: Thing | Thing[];\n for (i = 0; i < ilen; i++) {\n thing = arrayOfThings[i];\n\n // Undefined strings and arrays should not be measured\n if (thing !== undefined && thing !== null && !isArray(thing)) {\n longest = _measureText(ctx, data, gc, longest, thing);\n } else if (isArray(thing)) {\n // if it is an array lets measure each element\n // to do maybe simplify this function a bit so we can do this more recursively?\n for (j = 0, jlen = thing.length; j < jlen; j++) {\n nestedThing = thing[j];\n // Undefined strings and arrays should not be measured\n if (nestedThing !== undefined && nestedThing !== null && !isArray(nestedThing)) {\n longest = _measureText(ctx, data, gc, longest, nestedThing);\n }\n }\n }\n }\n\n ctx.restore();\n\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}\n\n/**\n * Returns the aligned pixel value to avoid anti-aliasing blur\n * @param chart - The chart instance.\n * @param pixel - A pixel value.\n * @param width - The width of the element.\n * @returns The aligned pixel value.\n * @private\n */\nexport function _alignPixel(chart: Chart, pixel: number, width: number) {\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}\n\n/**\n * Clears the entire canvas.\n */\nexport function clearCanvas(canvas: HTMLCanvasElement, ctx?: CanvasRenderingContext2D) {\n ctx = ctx || canvas.getContext('2d');\n\n ctx.save();\n // canvas.width and canvas.height do not consider the canvas transform,\n // while clearRect does\n ctx.resetTransform();\n ctx.clearRect(0, 0, canvas.width, canvas.height);\n ctx.restore();\n}\n\nexport interface DrawPointOptions {\n pointStyle: PointStyle;\n rotation?: number;\n radius: number;\n borderWidth: number;\n}\n\nexport function drawPoint(\n ctx: CanvasRenderingContext2D,\n options: DrawPointOptions,\n x: number,\n y: number\n) {\n // eslint-disable-next-line @typescript-eslint/no-use-before-define\n drawPointLegend(ctx, options, x, y, null);\n}\n\n// eslint-disable-next-line complexity\nexport function drawPointLegend(\n ctx: CanvasRenderingContext2D,\n options: DrawPointOptions,\n x: number,\n y: number,\n w: number\n) {\n let type: string, xOffset: number, yOffset: number, size: number, cornerRadius: number, width: number, xOffsetW: number, yOffsetW: number;\n const style = options.pointStyle;\n const rotation = options.rotation;\n const radius = options.radius;\n let rad = (rotation || 0) * RAD_PER_DEG;\n\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\n if (isNaN(radius) || radius <= 0) {\n return;\n }\n\n ctx.beginPath();\n\n switch (style) {\n // Default includes circle\n default:\n if (w) {\n ctx.ellipse(x, y, w / 2, radius, 0, 0, TAU);\n } else {\n ctx.arc(x, y, radius, 0, TAU);\n }\n ctx.closePath();\n break;\n case 'triangle':\n width = w ? w / 2 : radius;\n ctx.moveTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n rad += TWO_THIRDS_PI;\n ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n ctx.closePath();\n break;\n case 'rectRounded':\n // NOTE: the rounded rect implementation changed to use `arc` instead of\n // `quadraticCurveTo` since it generates better results when rect is\n // almost a circle. 0.516 (instead of 0.5) produces results with visually\n // closer proportion to the previous impl and it is inscribed in the\n // circle with `radius`. For more details, see the following PRs:\n // https://github.com/chartjs/Chart.js/issues/5597\n // https://github.com/chartjs/Chart.js/issues/5858\n cornerRadius = radius * 0.516;\n size = radius - cornerRadius;\n xOffset = Math.cos(rad + QUARTER_PI) * size;\n xOffsetW = Math.cos(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n yOffset = Math.sin(rad + QUARTER_PI) * size;\n yOffsetW = Math.sin(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n ctx.arc(x - xOffsetW, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);\n ctx.arc(x + yOffsetW, y - xOffset, cornerRadius, rad - HALF_PI, rad);\n ctx.arc(x + xOffsetW, y + yOffset, cornerRadius, rad, rad + HALF_PI);\n ctx.arc(x - yOffsetW, 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 width = w ? w / 2 : size;\n ctx.rect(x - width, y - size, 2 * width, 2 * size);\n break;\n }\n rad += QUARTER_PI;\n /* falls through */\n case 'rectRot':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n ctx.closePath();\n break;\n case 'crossRot':\n rad += QUARTER_PI;\n /* falls through */\n case 'cross':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case 'star':\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n rad += QUARTER_PI;\n xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n xOffset = Math.cos(rad) * radius;\n yOffset = Math.sin(rad) * radius;\n yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n ctx.moveTo(x - xOffsetW, y - yOffset);\n ctx.lineTo(x + xOffsetW, y + yOffset);\n ctx.moveTo(x + yOffsetW, y - xOffset);\n ctx.lineTo(x - yOffsetW, y + xOffset);\n break;\n case 'line':\n xOffset = w ? w / 2 : 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) * (w ? w / 2 : radius), y + Math.sin(rad) * radius);\n break;\n case false:\n ctx.closePath();\n break;\n }\n\n ctx.fill();\n if (options.borderWidth > 0) {\n ctx.stroke();\n }\n}\n\n/**\n * Returns true if the point is inside the rectangle\n * @param point - The point to test\n * @param area - The rectangle\n * @param margin - allowed margin\n * @private\n */\nexport function _isPointInArea(\n point: Point,\n area: TRBL,\n margin?: number\n) {\n margin = margin || 0.5; // margin - default is to match rounded decimals\n\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}\n\nexport function clipArea(ctx: CanvasRenderingContext2D, area: TRBL) {\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}\n\nexport function unclipArea(ctx: CanvasRenderingContext2D) {\n ctx.restore();\n}\n\n/**\n * @private\n */\nexport function _steppedLineTo(\n ctx: CanvasRenderingContext2D,\n previous: Point,\n target: Point,\n flip?: boolean,\n mode?: string\n) {\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}\n\n/**\n * @private\n */\nexport function _bezierCurveTo(\n ctx: CanvasRenderingContext2D,\n previous: SplinePoint,\n target: SplinePoint,\n flip?: boolean\n) {\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}\n\nfunction setRenderOpts(ctx: CanvasRenderingContext2D, opts: RenderTextOpts) {\n if (opts.translation) {\n ctx.translate(opts.translation[0], opts.translation[1]);\n }\n\n if (!isNullOrUndef(opts.rotation)) {\n ctx.rotate(opts.rotation);\n }\n\n if (opts.color) {\n ctx.fillStyle = opts.color;\n }\n\n if (opts.textAlign) {\n ctx.textAlign = opts.textAlign;\n }\n\n if (opts.textBaseline) {\n ctx.textBaseline = opts.textBaseline;\n }\n}\n\nfunction decorateText(\n ctx: CanvasRenderingContext2D,\n x: number,\n y: number,\n line: string,\n opts: RenderTextOpts\n) {\n if (opts.strikethrough || opts.underline) {\n /**\n * Now that IE11 support has been dropped, we can use more\n * of the TextMetrics object. The actual bounding boxes\n * are unflagged in Chrome, Firefox, Edge, and Safari so they\n * can be safely used.\n * See https://developer.mozilla.org/en-US/docs/Web/API/TextMetrics#Browser_compatibility\n */\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\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}\n\nfunction drawBackdrop(ctx: CanvasRenderingContext2D, opts: BackdropOptions) {\n const oldColor = ctx.fillStyle;\n\n ctx.fillStyle = opts.color as string;\n ctx.fillRect(opts.left, opts.top, opts.width, opts.height);\n ctx.fillStyle = oldColor;\n}\n\n/**\n * Render text onto the canvas\n */\nexport function renderText(\n ctx: CanvasRenderingContext2D,\n text: string | string[],\n x: number,\n y: number,\n font: CanvasFontSpec,\n opts: RenderTextOpts = {}\n) {\n const lines = isArray(text) ? text : [text];\n const stroke = opts.strokeWidth > 0 && opts.strokeColor !== '';\n let i: number, line: string;\n\n ctx.save();\n ctx.font = font.string;\n setRenderOpts(ctx, opts);\n\n for (i = 0; i < lines.length; ++i) {\n line = lines[i];\n\n if (opts.backdrop) {\n drawBackdrop(ctx, opts.backdrop);\n }\n\n if (stroke) {\n if (opts.strokeColor) {\n ctx.strokeStyle = opts.strokeColor;\n }\n\n if (!isNullOrUndef(opts.strokeWidth)) {\n ctx.lineWidth = opts.strokeWidth;\n }\n\n ctx.strokeText(line, x, y, opts.maxWidth);\n }\n\n ctx.fillText(line, x, y, opts.maxWidth);\n decorateText(ctx, x, y, line, opts);\n\n y += Number(font.lineHeight);\n }\n\n ctx.restore();\n}\n\n/**\n * Add a path of a rectangle with rounded corners to the current sub-path\n * @param ctx - Context\n * @param rect - Bounding rect\n */\nexport function addRoundedRectPath(\n ctx: CanvasRenderingContext2D,\n rect: RoundedRect & { radius: TRBLCorners }\n) {\n const {x, y, w, h, radius} = rect;\n\n // top left arc\n ctx.arc(x + radius.topLeft, y + radius.topLeft, radius.topLeft, 1.5 * PI, PI, true);\n\n // line from top left to bottom left\n ctx.lineTo(x, y + h - radius.bottomLeft);\n\n // bottom left arc\n ctx.arc(x + radius.bottomLeft, y + h - radius.bottomLeft, radius.bottomLeft, PI, HALF_PI, true);\n\n // line from bottom left to bottom right\n ctx.lineTo(x + w - radius.bottomRight, y + h);\n\n // bottom right arc\n ctx.arc(x + w - radius.bottomRight, y + h - radius.bottomRight, radius.bottomRight, HALF_PI, 0, true);\n\n // line from bottom right to top right\n ctx.lineTo(x + w, y + radius.topRight);\n\n // top right arc\n ctx.arc(x + w - radius.topRight, y + radius.topRight, radius.topRight, 0, -HALF_PI, true);\n\n // line from top right to top left\n ctx.lineTo(x + radius.topLeft, y);\n}\n","import defaults from '../core/core.defaults.js';\nimport {isArray, isObject, toDimension, valueOrDefault} from './helpers.core.js';\nimport {toFontString} from './helpers.canvas.js';\nimport type {ChartArea, FontSpec, Point} from '../types/index.js';\nimport type {TRBL, TRBLCorners} from '../types/geometric.js';\n\nconst LINE_HEIGHT = /^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/;\nconst FONT_STYLE = /^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;\n\n/**\n * @alias Chart.helpers.options\n * @namespace\n */\n/**\n * Converts the given line height `value` in pixels for a specific font `size`.\n * @param value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em').\n * @param size - The font size (in pixels) used to resolve relative `value`.\n * @returns The effective line height in pixels (size * 1.2 if value is invalid).\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\n * @since 2.7.0\n */\nexport function toLineHeight(value: number | string, size: number): number {\n const matches = ('' + value).match(LINE_HEIGHT);\n if (!matches || matches[1] === 'normal') {\n return size * 1.2;\n }\n\n value = +matches[2];\n\n switch (matches[3]) {\n case 'px':\n return value;\n case '%':\n value /= 100;\n break;\n default:\n break;\n }\n\n return size * value;\n}\n\nconst numberOrZero = (v: unknown) => +v || 0;\n\n/**\n * @param value\n * @param props\n */\nexport function _readValueToProps(value: number | Record, props: K[]): Record;\nexport function _readValueToProps(value: number | Record, props: Record): Record;\nexport function _readValueToProps(value: number | Record, props: string[] | Record) {\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\n for (const prop of keys) {\n ret[prop] = numberOrZero(read(prop));\n }\n return ret;\n}\n\n/**\n * Converts the given value into a TRBL object.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left)\n * @since 3.0.0\n */\nexport function toTRBL(value: number | TRBL | Point) {\n return _readValueToProps(value, {top: 'y', right: 'x', bottom: 'y', left: 'x'});\n}\n\n/**\n * Converts the given value into a TRBL corners object (similar with css border-radius).\n * @param value - If a number, set the value to all TRBL corner components,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * @returns The TRBL corner values (topLeft, topRight, bottomLeft, bottomRight)\n * @since 3.0.0\n */\nexport function toTRBLCorners(value: number | TRBLCorners) {\n return _readValueToProps(value, ['topLeft', 'topRight', 'bottomLeft', 'bottomRight']);\n}\n\n/**\n * Converts the given value into a padding object with pre-computed width/height.\n * @param value - If a number, set the value to all TRBL component,\n * else, if an object, use defined properties and sets undefined ones to 0.\n * x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left, width, height)\n * @since 2.7.0\n */\nexport function toPadding(value?: number | TRBL): ChartArea {\n const obj = toTRBL(value) as ChartArea;\n\n obj.width = obj.left + obj.right;\n obj.height = obj.top + obj.bottom;\n\n return obj;\n}\n\n/**\n * Parses font options and returns the font object.\n * @param options - A object that contains font options to be parsed.\n * @param fallback - A object that contains fallback font options.\n * @return The font object.\n * @private\n */\n\nexport function toFont(options: Partial, fallback?: Partial) {\n options = options || {};\n fallback = fallback || defaults.font as FontSpec;\n\n let size = valueOrDefault(options.size, fallback.size);\n\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 = undefined;\n }\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\n font.string = toFontString(font);\n return font;\n}\n\n/**\n * Evaluates the given `inputs` sequentially and returns the first defined value.\n * @param inputs - An array of values, falling back to the last value.\n * @param context - If defined and the current value is a function, the value\n * is called with `context` as first argument and the result becomes the new input.\n * @param index - If defined and the current value is an array, the value\n * at `index` become the new input.\n * @param info - object to return information about resolution in\n * @param info.cacheable - Will be set to `false` if option is not cacheable.\n * @since 2.7.0\n */\nexport function resolve(inputs: Array, context?: object, index?: number, info?: { cacheable: boolean }) {\n let cacheable = true;\n let i: number, ilen: number, value: unknown;\n\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}\n\n/**\n * @param minmax\n * @param grace\n * @param beginAtZero\n * @private\n */\nexport function _addGrace(minmax: { min: number; max: number; }, grace: number | string, beginAtZero: boolean) {\n const {min, max} = minmax;\n const change = toDimension(grace, (max - min) / 2);\n const keepZero = (value: number, add: number) => beginAtZero && value === 0 ? 0 : value + add;\n return {\n min: keepZero(min, -Math.abs(change)),\n max: keepZero(max, change)\n };\n}\n\n/**\n * Create a context inheriting parentContext\n * @param parentContext\n * @param context\n * @returns\n */\nexport function createContext(parentContext: null, context: T): T;\nexport function createContext(parentContext: P, context: T): P & T;\nexport function createContext(parentContext: object, context: object) {\n return Object.assign(Object.create(parentContext), context);\n}\n","/* eslint-disable @typescript-eslint/no-use-before-define */\nimport type {AnyObject} from '../types/basic.js';\nimport type {ChartMeta} from '../types/index.js';\nimport type {\n ResolverObjectKey,\n ResolverCache,\n ResolverProxy,\n DescriptorDefaults,\n Descriptor,\n ContextCache,\n ContextProxy\n} from './helpers.config.types.js';\nimport {isArray, isFunction, isObject, resolveObjectKey, _capitalize} from './helpers.core.js';\n\nexport * from './helpers.config.types.js';\n\n/**\n * Creates a Proxy for resolving raw values for options.\n * @param scopes - The option scopes to look for values, in resolution order\n * @param prefixes - The prefixes for values, in resolution order.\n * @param rootScopes - The root option scopes\n * @param fallback - Parent scopes fallback\n * @param getTarget - callback for getting the target for changed values\n * @returns Proxy\n * @private\n */\nexport function _createResolver<\n T extends AnyObject[] = AnyObject[],\n R extends AnyObject[] = T\n>(\n scopes: T,\n prefixes = [''],\n rootScopes?: R,\n fallback?: ResolverObjectKey,\n getTarget = () => scopes[0]\n) {\n const finalRootScopes = rootScopes || scopes;\n if (typeof fallback === 'undefined') {\n fallback = _resolve('_fallback', scopes);\n }\n const cache: ResolverCache = {\n [Symbol.toStringTag]: 'Object',\n _cacheable: true,\n _scopes: scopes,\n _rootScopes: finalRootScopes,\n _fallback: fallback,\n _getTarget: getTarget,\n override: (scope: AnyObject) => _createResolver([scope, ...scopes], prefixes, finalRootScopes, fallback),\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */\n deleteProperty(target, prop: string) {\n delete target[prop]; // remove from cache\n delete target._keys; // remove cached keys\n delete scopes[0][prop]; // remove from top level scope\n return true;\n },\n\n /**\n * A trap for getting property values.\n */\n get(target, prop: string) {\n return _cached(target, prop,\n () => _resolveWithPrefixes(prop, prefixes, scopes, target));\n },\n\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\n */\n getOwnPropertyDescriptor(target, prop) {\n return Reflect.getOwnPropertyDescriptor(target._scopes[0], prop);\n },\n\n /**\n * A trap for Object.getPrototypeOf.\n */\n getPrototypeOf() {\n return Reflect.getPrototypeOf(scopes[0]);\n },\n\n /**\n * A trap for the in operator.\n */\n has(target, prop: string) {\n return getKeysFromAllScopes(target).includes(prop);\n },\n\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */\n ownKeys(target) {\n return getKeysFromAllScopes(target);\n },\n\n /**\n * A trap for setting property values.\n */\n set(target, prop: string, value) {\n const storage = target._storage || (target._storage = getTarget());\n target[prop] = storage[prop] = value; // set to top level scope + cache\n delete target._keys; // remove cached keys\n return true;\n }\n }) as ResolverProxy;\n}\n\n/**\n * Returns an Proxy for resolving option values with context.\n * @param proxy - The Proxy returned by `_createResolver`\n * @param context - Context object for scriptable/indexable options\n * @param subProxy - The proxy provided for scriptable options\n * @param descriptorDefaults - Defaults for descriptors\n * @private\n */\nexport function _attachContext<\n T extends AnyObject[] = AnyObject[],\n R extends AnyObject[] = T\n>(\n proxy: ResolverProxy,\n context: AnyObject,\n subProxy?: ResolverProxy,\n descriptorDefaults?: DescriptorDefaults\n) {\n const cache: ContextCache = {\n _cacheable: false,\n _proxy: proxy,\n _context: context,\n _subProxy: subProxy,\n _stack: new Set(),\n _descriptors: _descriptors(proxy, descriptorDefaults),\n setContext: (ctx: AnyObject) => _attachContext(proxy, ctx, subProxy, descriptorDefaults),\n override: (scope: AnyObject) => _attachContext(proxy.override(scope), context, subProxy, descriptorDefaults)\n };\n return new Proxy(cache, {\n /**\n * A trap for the delete operator.\n */\n deleteProperty(target, prop) {\n delete target[prop]; // remove from cache\n delete proxy[prop]; // remove from proxy\n return true;\n },\n\n /**\n * A trap for getting property values.\n */\n get(target, prop: string, receiver) {\n return _cached(target, prop,\n () => _resolveWithContext(target, prop, receiver));\n },\n\n /**\n * A trap for Object.getOwnPropertyDescriptor.\n * Also used by Object.hasOwnProperty.\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\n /**\n * A trap for Object.getPrototypeOf.\n */\n getPrototypeOf() {\n return Reflect.getPrototypeOf(proxy);\n },\n\n /**\n * A trap for the in operator.\n */\n has(target, prop) {\n return Reflect.has(proxy, prop);\n },\n\n /**\n * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n */\n ownKeys() {\n return Reflect.ownKeys(proxy);\n },\n\n /**\n * A trap for setting property values.\n */\n set(target, prop, value) {\n proxy[prop] = value; // set to proxy\n delete target[prop]; // remove from cache\n return true;\n }\n }) as ContextProxy;\n}\n\n/**\n * @private\n */\nexport function _descriptors(\n proxy: ResolverCache,\n defaults: DescriptorDefaults = {scriptable: true, indexable: true}\n): Descriptor {\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}\n\nconst readKey = (prefix: string, name: string) => prefix ? prefix + _capitalize(name) : name;\nconst needsSubResolver = (prop: string, value: unknown) => isObject(value) && prop !== 'adapters' &&\n (Object.getPrototypeOf(value) === null || value.constructor === Object);\n\nfunction _cached(\n target: AnyObject,\n prop: string,\n resolve: () => unknown\n) {\n if (Object.prototype.hasOwnProperty.call(target, prop)) {\n return target[prop];\n }\n\n const value = resolve();\n // cache the resolved value\n target[prop] = value;\n return value;\n}\n\nfunction _resolveWithContext(\n target: ContextCache,\n prop: string,\n receiver: AnyObject\n) {\n const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n let value = _proxy[prop]; // resolve from proxy\n\n // resolve with context\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 // if the resolved value is an object, create a sub resolver for it\n value = _attachContext(value, _context, _subProxy && _subProxy[prop], descriptors);\n }\n return value;\n}\n\nfunction _resolveScriptable(\n prop: string,\n getValue: (ctx: AnyObject, sub: AnyObject) => unknown,\n target: ContextCache,\n receiver: AnyObject\n) {\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 let value = getValue(_context, _subProxy || receiver);\n _stack.delete(prop);\n if (needsSubResolver(prop, value)) {\n // When scriptable option returns an object, create a resolver on that.\n value = createSubResolver(_proxy._scopes, _proxy, prop, value);\n }\n return value;\n}\n\nfunction _resolveArray(\n prop: string,\n value: unknown[],\n target: ContextCache,\n isIndexable: (key: string) => boolean\n) {\n const {_proxy, _context, _subProxy, _descriptors: descriptors} = target;\n\n if (typeof _context.index !== 'undefined' && isIndexable(prop)) {\n return value[_context.index % value.length];\n } else if (isObject(value[0])) {\n // Array of objects, return array or resolvers\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}\n\nfunction resolveFallback(\n fallback: ResolverObjectKey | ((prop: ResolverObjectKey, value: unknown) => ResolverObjectKey),\n prop: ResolverObjectKey,\n value: unknown\n) {\n return isFunction(fallback) ? fallback(prop, value) : fallback;\n}\n\nconst getScope = (key: ResolverObjectKey, parent: AnyObject) => key === true ? parent\n : typeof key === 'string' ? resolveObjectKey(parent, key) : undefined;\n\nfunction addScopes(\n set: Set,\n parentScopes: AnyObject[],\n key: ResolverObjectKey,\n parentFallback: ResolverObjectKey,\n value: unknown\n) {\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, value);\n if (typeof fallback !== 'undefined' && fallback !== key && fallback !== parentFallback) {\n // When we reach the descriptor that defines a new _fallback, return that.\n // The fallback will resume to that new scope.\n return fallback;\n }\n } else if (scope === false && typeof parentFallback !== 'undefined' && key !== parentFallback) {\n // Fallback to `false` results to `false`, when falling back to different key.\n // For example `interaction` from `hover` or `plugins.tooltip` and `animation` from `animations`\n return null;\n }\n }\n return false;\n}\n\nfunction createSubResolver(\n parentScopes: AnyObject[],\n resolver: ResolverCache,\n prop: ResolverObjectKey,\n value: unknown\n) {\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, value);\n if (key === null) {\n return false;\n }\n if (typeof fallback !== 'undefined' && fallback !== prop) {\n key = addScopesFromKey(set, allScopes, fallback, key, value);\n if (key === null) {\n return false;\n }\n }\n return _createResolver(Array.from(set), [''], rootScopes, fallback,\n () => subGetTarget(resolver, prop as string, value));\n}\n\nfunction addScopesFromKey(\n set: Set,\n allScopes: AnyObject[],\n key: ResolverObjectKey,\n fallback: ResolverObjectKey,\n item: unknown\n) {\n while (key) {\n key = addScopes(set, allScopes, key, fallback, item);\n }\n return key;\n}\n\nfunction subGetTarget(\n resolver: ResolverCache,\n prop: string,\n value: unknown\n) {\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 // For array of objects, the object is used to store updated values\n return value;\n }\n return target || {};\n}\n\nfunction _resolveWithPrefixes(\n prop: string,\n prefixes: string[],\n scopes: AnyObject[],\n proxy: ResolverProxy\n) {\n let value: unknown;\n for (const prefix of prefixes) {\n value = _resolve(readKey(prefix, prop), scopes);\n if (typeof value !== 'undefined') {\n return needsSubResolver(prop, value)\n ? createSubResolver(scopes, proxy, prop, value)\n : value;\n }\n }\n}\n\nfunction _resolve(key: string, scopes: AnyObject[]) {\n for (const scope of scopes) {\n if (!scope) {\n continue;\n }\n const value = scope[key];\n if (typeof value !== 'undefined') {\n return value;\n }\n }\n}\n\nfunction getKeysFromAllScopes(target: ResolverCache) {\n let keys = target._keys;\n if (!keys) {\n keys = target._keys = resolveKeysFromAllScopes(target._scopes);\n }\n return keys;\n}\n\nfunction resolveKeysFromAllScopes(scopes: AnyObject[]) {\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\nexport function _parseObjectDataRadialScale(\n meta: ChartMeta<'line' | 'scatter'>,\n data: AnyObject[],\n start: number,\n count: number\n) {\n const {iScale} = meta;\n const {key = 'r'} = this._parsing;\n const parsed = new Array<{r: unknown}>(count);\n let i: number, ilen: number, index: number, item: AnyObject;\n\n for (i = 0, ilen = count; i < ilen; ++i) {\n index = i + start;\n item = data[index];\n parsed[i] = {\n r: iScale.parse(resolveObjectKey(item, key), index)\n };\n }\n return parsed;\n}\n","import {almostEquals, distanceBetweenPoints, sign} from './helpers.math.js';\nimport {_isPointInArea} from './helpers.canvas.js';\nimport type {ChartArea} from '../types/index.js';\nimport type {SplinePoint} from '../types/geometric.js';\n\nconst EPSILON = Number.EPSILON || 1e-14;\n\ntype OptionalSplinePoint = SplinePoint | false\nconst getPoint = (points: SplinePoint[], i: number): OptionalSplinePoint => i < points.length && !points[i].skip && points[i];\nconst getValueAxis = (indexAxis: 'x' | 'y') => indexAxis === 'x' ? 'y' : 'x';\n\nexport function splineCurve(\n firstPoint: SplinePoint,\n middlePoint: SplinePoint,\n afterPoint: SplinePoint,\n t: number\n): {\n previous: SplinePoint\n next: SplinePoint\n } {\n // Props to Rob Spencer at scaled innovation for his post on splining between points\n // http://scaledinnovation.com/analytics/splines/aboutSplines.html\n\n // This function must also respect \"skipped\" points\n\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\n let s01 = d01 / (d01 + d12);\n let s12 = d12 / (d01 + d12);\n\n // If all points are the same, s01 & s02 will be inf\n s01 = isNaN(s01) ? 0 : s01;\n s12 = isNaN(s12) ? 0 : s12;\n\n const fa = t * s01; // scaling factor for triangle Ta\n const fb = t * s12;\n\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}\n\n/**\n * Adjust tangents to ensure monotonic properties\n */\nfunction monotoneAdjust(points: SplinePoint[], deltaK: number[], mK: number[]) {\n const pointsLen = points.length;\n\n let alphaK: number, betaK: number, tauK: number, squaredMagnitude: number, pointCurrent: OptionalSplinePoint;\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\n if (almostEquals(deltaK[i], 0, EPSILON)) {\n mK[i] = mK[i + 1] = 0;\n continue;\n }\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\n tauK = 3 / Math.sqrt(squaredMagnitude);\n mK[i] = alphaK * tauK * deltaK[i];\n mK[i + 1] = betaK * tauK * deltaK[i];\n }\n}\n\nfunction monotoneCompute(points: SplinePoint[], mK: number[], indexAxis: 'x' | 'y' = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n let delta: number, pointBefore: OptionalSplinePoint, pointCurrent: OptionalSplinePoint;\n let pointAfter = getPoint(points, 0);\n\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\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}\n\n/**\n * This function calculates Bézier control points in a similar way than |splineCurve|,\n * but preserves monotonicity of the provided data and ensures no local extremums are added\n * between the dataset discrete points due to the interpolation.\n * See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation\n */\nexport function splineCurveMonotone(points: SplinePoint[], indexAxis: 'x' | 'y' = 'x') {\n const valueAxis = getValueAxis(indexAxis);\n const pointsLen = points.length;\n const deltaK: number[] = Array(pointsLen).fill(0);\n const mK: number[] = Array(pointsLen);\n\n // Calculate slopes (deltaK) and initialize tangents (mK)\n let i, pointBefore: OptionalSplinePoint, pointCurrent: OptionalSplinePoint;\n let pointAfter = getPoint(points, 0);\n\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\n if (pointAfter) {\n const slopeDelta = pointAfter[indexAxis] - pointCurrent[indexAxis];\n\n // In the case of two points that appear at the same x pixel, slopeDeltaX is 0\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\n monotoneAdjust(points, deltaK, mK);\n\n monotoneCompute(points, mK, indexAxis);\n}\n\nfunction capControlPoint(pt: number, min: number, max: number) {\n return Math.max(Math.min(pt, max), min);\n}\n\nfunction capBezierPoints(points: SplinePoint[], area: ChartArea) {\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}\n\n/**\n * @private\n */\nexport function _updateBezierControlPoints(\n points: SplinePoint[],\n options,\n area: ChartArea,\n loop: boolean,\n indexAxis: 'x' | 'y'\n) {\n let i: number, ilen: number, point: SplinePoint, controlPoints: ReturnType;\n\n // Only consider points that are drawn in case the spanGaps option is used\n if (options.spanGaps) {\n points = points.filter((pt) => !pt.skip);\n }\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\n if (options.capBezierPoints) {\n capBezierPoints(points, area);\n }\n}\n","import type {ChartArea, Scale} from '../types/index.js';\nimport type Chart from '../core/core.controller.js';\nimport type {ChartEvent} from '../types.js';\nimport {INFINITY} from './helpers.math.js';\n\n/**\n * Note: typedefs are auto-exported, so use a made-up `dom` namespace where\n * necessary to avoid duplicates with `export * from './helpers`; see\n * https://github.com/microsoft/TypeScript/issues/46011\n * @typedef { import('../core/core.controller.js').default } dom.Chart\n * @typedef { import('../../types').ChartEvent } ChartEvent\n */\n\n/**\n * @private\n */\nexport function _isDomSupported(): boolean {\n return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n\n/**\n * @private\n */\nexport function _getParentNode(domNode: HTMLCanvasElement): HTMLCanvasElement {\n let parent = domNode.parentNode;\n if (parent && parent.toString() === '[object ShadowRoot]') {\n parent = (parent as ShadowRoot).host;\n }\n return parent as HTMLCanvasElement;\n}\n\n/**\n * convert max-width/max-height values that may be percentages into a number\n * @private\n */\n\nfunction parseMaxStyle(styleValue: string | number, node: HTMLElement, parentProperty: string) {\n let valueInPixels: number;\n if (typeof styleValue === 'string') {\n valueInPixels = parseInt(styleValue, 10);\n\n if (styleValue.indexOf('%') !== -1) {\n // percentage * size in dimension\n valueInPixels = (valueInPixels / 100) * node.parentNode[parentProperty];\n }\n } else {\n valueInPixels = styleValue;\n }\n\n return valueInPixels;\n}\n\nconst getComputedStyle = (element: HTMLElement): CSSStyleDeclaration =>\n element.ownerDocument.defaultView.getComputedStyle(element, null);\n\nexport function getStyle(el: HTMLElement, property: string): string {\n return getComputedStyle(el).getPropertyValue(property);\n}\n\nconst positions = ['top', 'right', 'bottom', 'left'];\nfunction getPositionedStyle(styles: CSSStyleDeclaration, style: string, suffix?: string): ChartArea {\n const result = {} as ChartArea;\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}\n\nconst useOffsetPos = (x: number, y: number, target: HTMLElement | EventTarget) =>\n (x > 0 || y > 0) && (!target || !(target as HTMLElement).shadowRoot);\n\n/**\n * @param e\n * @param canvas\n * @returns Canvas position\n */\nfunction getCanvasPosition(\n e: Event | TouchEvent | MouseEvent,\n canvas: HTMLCanvasElement\n): {\n x: number;\n y: number;\n box: boolean;\n } {\n const touches = (e as TouchEvent).touches;\n const source = (touches && touches.length ? touches[0] : e) as MouseEvent;\n const {offsetX, offsetY} = source as MouseEvent;\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}\n\n/**\n * Gets an event's x, y coordinates, relative to the chart area\n * @param event\n * @param chart\n * @returns x and y coordinates of the event\n */\n\nexport function getRelativePosition(\n event: Event | ChartEvent | TouchEvent | MouseEvent,\n chart: Chart\n): { x: number; y: number } {\n if ('native' in event) {\n return event;\n }\n\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(event, canvas);\n const xOffset = paddings.left + (box && borders.left);\n const yOffset = paddings.top + (box && borders.top);\n\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}\n\nfunction getContainerSize(canvas: HTMLCanvasElement, width: number, height: number): Partial {\n let maxWidth: number, maxHeight: number;\n\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(); // this is the border box of the container\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}\n\nconst round1 = (v: number) => Math.round(v * 10) / 10;\n\n// eslint-disable-next-line complexity\nexport function getMaximumSize(\n canvas: HTMLCanvasElement,\n bbWidth?: number,\n bbHeight?: number,\n aspectRatio?: number\n): { width: number; height: number } {\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\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 ? 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 // https://github.com/chartjs/Chart.js/issues/4659\n // If the canvas has width, but no height, default to aspectRatio of 2 (canvas default)\n height = round1(width / 2);\n }\n\n const maintainHeight = bbWidth !== undefined || bbHeight !== undefined;\n\n if (maintainHeight && aspectRatio && containerSize.height && height > containerSize.height) {\n height = containerSize.height;\n width = round1(Math.floor(height * aspectRatio));\n }\n\n return {width, height};\n}\n\n/**\n * @param chart\n * @param forceRatio\n * @param forceStyle\n * @returns True if the canvas context size or transformation has changed.\n */\nexport function retinaScale(\n chart: Chart,\n forceRatio: number,\n forceStyle?: boolean\n): boolean | void {\n const pixelRatio = forceRatio || 1;\n const deviceHeight = Math.floor(chart.height * pixelRatio);\n const deviceWidth = Math.floor(chart.width * pixelRatio);\n\n chart.height = Math.floor(chart.height);\n chart.width = Math.floor(chart.width);\n\n const canvas = chart.canvas;\n\n // If no style has been set on the canvas, the render size is used as display size,\n // making the chart visually bigger, so let's enforce it to the \"correct\" values.\n // See https://github.com/chartjs/Chart.js/issues/3575\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\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}\n\n/**\n * Detects support for options object argument in addEventListener.\n * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support\n * @private\n */\nexport const supportsEventListenerOptions = (function() {\n let passiveSupported = false;\n try {\n const options = {\n get passive() { // This function will be called when the browser attempts to access the passive property.\n passiveSupported = true;\n return false;\n }\n } as EventListenerOptions;\n\n window.addEventListener('test', null, options);\n window.removeEventListener('test', null, options);\n } catch (e) {\n // continue regardless of error\n }\n return passiveSupported;\n}());\n\n/**\n * The \"used\" size is the final value of a dimension property after all calculations have\n * been performed. This method uses the computed style of `element` but returns undefined\n * if the computed style is not expressed in pixels. That can happen in some cases where\n * `element` has a size relative to its parent and this last one is not yet displayed,\n * for example because of `display: none` on a parent node.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value\n * @returns Size in pixels or undefined if unknown.\n */\n\nexport function readUsedSize(\n element: HTMLElement,\n property: 'width' | 'height'\n): number | undefined {\n const value = getStyle(element, property);\n const matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n return matches ? +matches[1] : undefined;\n}\n","import type {Point, SplinePoint} from '../types/geometric.js';\n\n/**\n * @private\n */\nexport function _pointInLine(p1: Point, p2: Point, t: number, mode?) { // eslint-disable-line @typescript-eslint/no-unused-vars\n return {\n x: p1.x + t * (p2.x - p1.x),\n y: p1.y + t * (p2.y - p1.y)\n };\n}\n\n/**\n * @private\n */\nexport function _steppedInterpolation(\n p1: Point,\n p2: Point,\n t: number, mode: 'middle' | 'after' | unknown\n) {\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}\n\n/**\n * @private\n */\nexport function _bezierInterpolation(p1: SplinePoint, p2: SplinePoint, t: number, mode?) { // eslint-disable-line @typescript-eslint/no-unused-vars\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","export interface RTLAdapter {\n x(x: number): number;\n setWidth(w: number): void;\n textAlign(align: 'center' | 'left' | 'right'): 'center' | 'left' | 'right';\n xPlus(x: number, value: number): number;\n leftForLtr(x: number, itemWidth: number): number;\n}\n\nconst getRightToLeftAdapter = function(rectX: number, width: number): RTLAdapter {\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};\n\nconst getLeftToRightAdapter = function(): RTLAdapter {\n return {\n x(x) {\n return x;\n },\n setWidth(w) { // eslint-disable-line no-unused-vars\n },\n textAlign(align) {\n return align;\n },\n xPlus(x, value) {\n return x + value;\n },\n leftForLtr(x, _itemWidth) { // eslint-disable-line @typescript-eslint/no-unused-vars\n return x;\n },\n };\n};\n\nexport function getRtlAdapter(rtl: boolean, rectX: number, width: number) {\n return rtl ? getRightToLeftAdapter(rectX, width) : getLeftToRightAdapter();\n}\n\nexport function overrideTextDirection(ctx: CanvasRenderingContext2D, direction: 'ltr' | 'rtl') {\n let style: CSSStyleDeclaration, original: [string, string];\n if (direction === 'ltr' || direction === 'rtl') {\n style = ctx.canvas.style;\n original = [\n style.getPropertyValue('direction'),\n style.getPropertyPriority('direction'),\n ];\n\n style.setProperty('direction', direction, 'important');\n (ctx as { prevTextDirection?: [string, string] }).prevTextDirection = original;\n }\n}\n\nexport function restoreTextDirection(ctx: CanvasRenderingContext2D, original?: [string, string]) {\n if (original !== undefined) {\n delete (ctx as { prevTextDirection?: [string, string] }).prevTextDirection;\n ctx.canvas.style.setProperty('direction', original[0], original[1]);\n }\n}\n","import {_angleBetween, _angleDiff, _isBetween, _normalizeAngle} from './helpers.math.js';\nimport {createContext} from './helpers.options.js';\nimport {isPatternOrGradient} from './helpers.color.js';\n\n/**\n * @typedef { import('../elements/element.line.js').default } LineElement\n * @typedef { import('../elements/element.point.js').default } PointElement\n * @typedef {{start: number, end: number, loop: boolean, style?: any}} Segment\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: _isBetween,\n compare: (a, b) => a - b,\n normalize: x => x\n };\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}\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 // eslint-disable-next-line prefer-const\n let {start, end, loop} = segment;\n let i, ilen;\n\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\n if (end < start) {\n end += count;\n }\n return {start, end, loop, style: segment.style};\n}\n\n/**\n * Returns the sub-segment(s) of a line segment that fall in the given bounds\n * @param {object} segment\n * @param {number} segment.start - start index of the segment, referring the points array\n * @param {number} segment.end - end index of the segment, referring the points array\n * @param {boolean} segment.loop - indicates that the segment is a loop\n * @param {object} [segment.style] - segment style\n * @param {PointElement[]} points - the points that this segment refers to\n * @param {object} [bounds]\n * @param {string} bounds.property - the property of a `PointElement` we are bounding. `x`, `y` or `angle`.\n * @param {number} bounds.start - start value of the property\n * @param {number} bounds.end - end value of the property\n * @private\n **/\nexport function _boundSegment(segment, points, bounds) {\n if (!bounds) {\n return [segment];\n }\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\n const result = [];\n let inside = false;\n let subStart = null;\n let value, point, prevValue;\n\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\n for (let i = start, prev = start; i <= end; ++i) {\n point = points[i % count];\n\n if (point.skip) {\n continue;\n }\n\n value = normalize(point[property]);\n\n if (value === prevValue) {\n continue;\n }\n\n inside = between(value, startBound, endBound);\n\n if (subStart === null && shouldStart()) {\n subStart = compare(value, startBound) === 0 ? i : prev;\n }\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\n if (subStart !== null) {\n result.push(normalizeSegment({start: subStart, end, loop, count, style}));\n }\n\n return result;\n}\n\n\n/**\n * Returns the segments of the line that are inside given bounds\n * @param {LineElement} line\n * @param {object} [bounds]\n * @param {string} bounds.property - the property we are bounding with. `x`, `y` or `angle`.\n * @param {number} bounds.start - start value of the `property`\n * @param {number} bounds.end - end value of the `property`\n * @private\n */\nexport function _boundSegments(line, bounds) {\n const result = [];\n const segments = line.segments;\n\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}\n\n/**\n * Find start and end index of a line.\n */\nfunction findStartAndEnd(points, count, loop, spanGaps) {\n let start = 0;\n let end = count - 1;\n\n if (loop && !spanGaps) {\n // loop and not spanning gaps, first find a gap to start from\n while (start < count && !points[start].skip) {\n start++;\n }\n }\n\n // find first non skipped point (after the first gap possibly)\n while (start < count && points[start].skip) {\n start++;\n }\n\n // if we looped to count, start needs to be 0\n start %= count;\n\n if (loop) {\n // loop will go past count, if start > 0\n end += start;\n }\n\n while (end > start && points[end % count].skip) {\n end--;\n }\n\n // end could be more than count, normalize\n end %= count;\n\n return {start, end};\n}\n\n/**\n * Compute solid segments from Points, when spanGaps === false\n * @param {PointElement[]} points - the points\n * @param {number} start - start index\n * @param {number} max - max index (can go past count on a loop)\n * @param {boolean} loop - boolean indicating that this would be a loop if no gaps are found\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\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 // @ts-ignore\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\n if (last !== null) {\n result.push({start: start % count, end: last % count, loop});\n }\n\n return result;\n}\n\n/**\n * Compute the continuous segments that define the whole line\n * There can be skipped points within a segment, if spanGaps is true.\n * @param {LineElement} line\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n * @private\n */\nexport function _computeSegments(line, segmentOptions) {\n const points = line.points;\n const spanGaps = line.options.spanGaps;\n const count = points.length;\n\n if (!count) {\n return [];\n }\n\n const loop = !!line._loop;\n const {start, end} = findStartAndEnd(points, count, loop, spanGaps);\n\n if (spanGaps === true) {\n return splitByStyles(line, [{start, end, loop}], points, segmentOptions);\n }\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}\n\n/**\n * @param {Segment[]} segments\n * @param {PointElement[]} points\n * @param {object} [segmentOptions]\n * @return {Segment[]}\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}\n\n/**\n * @param {LineElement} line\n * @param {Segment[]} segments\n * @param {PointElement[]} points\n * @param {object} [segmentOptions]\n * @return {Segment[]}\n */\nfunction doSplitByStyles(line, segments, points, segmentOptions) {\n const chartContext = line._chart.getContext();\n const baseStyle = readStyle(line.options);\n const {_datasetIndex: datasetIndex, options: {spanGaps}} = line;\n const count = points.length;\n const result = [];\n let prevStyle = baseStyle;\n let start = segments[0].start;\n let i = start;\n\n function addStyle(s, e, l, st) {\n const dir = spanGaps ? -1 : 1;\n if (s === e) {\n return;\n }\n // Style can not start/end on a skipped point, adjust indices accordingly\n s += count;\n while (points[s % count].skip) {\n s -= dir;\n }\n while (points[e % count].skip) {\n e += dir;\n }\n if (s % count !== e % count) {\n result.push({start: s % count, end: e % count, loop: l, style: st});\n prevStyle = st;\n start = e % count;\n }\n }\n\n for (const segment of segments) {\n start = spanGaps ? start : segment.start;\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(createContext(chartContext, {\n type: 'segment',\n p0: prev,\n p1: pt,\n p0DataIndex: (i - 1) % count,\n p1DataIndex: i % count,\n datasetIndex\n })));\n if (styleChanged(style, prevStyle)) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n prev = pt;\n prevStyle = style;\n }\n if (start < i - 1) {\n addStyle(start, i - 1, segment.loop, prevStyle);\n }\n }\n\n return result;\n}\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}\n\nfunction styleChanged(style, prevStyle) {\n if (!prevStyle) {\n return false;\n }\n const cache = [];\n const replacer = function(key, value) {\n if (!isPatternOrGradient(value)) {\n return value;\n }\n if (!cache.includes(value)) {\n cache.push(value);\n }\n return cache.indexOf(value);\n };\n return JSON.stringify(style, replacer) !== JSON.stringify(prevStyle, replacer);\n}\n","/*!\n* chartjs-plugin-annotation v3.0.1\n* https://www.chartjs.org/chartjs-plugin-annotation/index\n * (c) 2023 chartjs-plugin-annotation Contributors\n * Released under the MIT License\n */\nimport { Element, defaults, Animations, Chart } from 'chart.js';\nimport { distanceBetweenPoints, defined, isFunction, callback, isObject, valueOrDefault, toRadians, isArray, toFont, addRoundedRectPath, toTRBLCorners, QUARTER_PI, PI, HALF_PI, TWO_THIRDS_PI, TAU, isNumber, RAD_PER_DEG, toPadding, isFinite, toDegrees, clipArea, unclipArea } from 'chart.js/helpers';\n\n/**\n * @typedef { import(\"chart.js\").ChartEvent } ChartEvent\n * @typedef { import('../../types/element').AnnotationElement } AnnotationElement\n */\n\nconst interaction = {\n modes: {\n /**\n * Point mode returns all elements that hit test based on the event position\n * @param {Object} state - the state of the plugin\n * @param {ChartEvent} event - the event we are find things at\n * @return {AnnotationElement[]} - elements that are found\n */\n point(state, event) {\n return filterElements(state, event, {intersect: true});\n },\n\n /**\n * Nearest mode returns the element closest to the event position\n * @param {Object} state - the state of the plugin\n * @param {ChartEvent} event - the event we are find things at\n * @param {Object} options - interaction options to use\n * @return {AnnotationElement[]} - elements that are found (only 1 element)\n */\n nearest(state, event, options) {\n return getNearestItem(state, event, options);\n },\n /**\n * x mode returns the elements that hit-test at the current x coordinate\n * @param {Object} state - the state of the plugin\n * @param {ChartEvent} event - the event we are find things at\n * @param {Object} options - interaction options to use\n * @return {AnnotationElement[]} - elements that are found\n */\n x(state, event, options) {\n return filterElements(state, event, {intersect: options.intersect, axis: 'x'});\n },\n\n /**\n * y mode returns the elements that hit-test at the current y coordinate\n * @param {Object} state - the state of the plugin\n * @param {ChartEvent} event - the event we are find things at\n * @param {Object} options - interaction options to use\n * @return {AnnotationElement[]} - elements that are found\n */\n y(state, event, options) {\n return filterElements(state, event, {intersect: options.intersect, axis: 'y'});\n }\n }\n};\n\n/**\n * Returns all elements that hit test based on the event position\n * @param {Object} state - the state of the plugin\n * @param {ChartEvent} event - the event we are find things at\n * @param {Object} options - interaction options to use\n * @return {AnnotationElement[]} - elements that are found\n */\nfunction getElements(state, event, options) {\n const mode = interaction.modes[options.mode] || interaction.modes.nearest;\n return mode(state, event, options);\n}\n\nfunction inRangeByAxis(element, event, axis) {\n if (axis !== 'x' && axis !== 'y') {\n return element.inRange(event.x, event.y, 'x', true) || element.inRange(event.x, event.y, 'y', true);\n }\n return element.inRange(event.x, event.y, axis, true);\n}\n\nfunction getPointByAxis(event, center, axis) {\n if (axis === 'x') {\n return {x: event.x, y: center.y};\n } else if (axis === 'y') {\n return {x: center.x, y: event.y};\n }\n return center;\n}\n\nfunction filterElements(state, event, options) {\n return state.visibleElements.filter((element) => options.intersect ? element.inRange(event.x, event.y) : inRangeByAxis(element, event, options.axis));\n}\n\nfunction getNearestItem(state, event, options) {\n let minDistance = Number.POSITIVE_INFINITY;\n\n return filterElements(state, event, options)\n .reduce((nearestItems, element) => {\n const center = element.getCenterPoint();\n const evenPoint = getPointByAxis(event, center, options.axis);\n const distance = distanceBetweenPoints(event, evenPoint);\n if (distance < minDistance) {\n nearestItems = [element];\n minDistance = distance;\n } else if (distance === minDistance) {\n // Can have multiple items at the same distance in which case we sort by size\n nearestItems.push(element);\n }\n\n return nearestItems;\n }, [])\n .sort((a, b) => a._index - b._index)\n .slice(0, 1); // return only the top item;\n}\n\nconst isOlderPart = (act, req) => req > act || (act.length > req.length && act.slice(0, req.length) === req);\n\n/**\n * @typedef { import('chart.js').Point } Point\n * @typedef { import('chart.js').InteractionAxis } InteractionAxis\n * @typedef { import('../../types/element').AnnotationElement } AnnotationElement\n */\n\nconst EPSILON = 0.001;\nconst clamp = (x, from, to) => Math.min(to, Math.max(from, x));\n\n/**\n * @param {Object} obj\n * @param {number} from\n * @param {number} to\n * @returns {Object}\n */\nfunction clampAll(obj, from, to) {\n for (const key of Object.keys(obj)) {\n obj[key] = clamp(obj[key], from, to);\n }\n return obj;\n}\n\n/**\n * @param {Point} point\n * @param {Point} center\n * @param {number} radius\n * @param {number} borderWidth\n * @returns {boolean}\n */\nfunction inPointRange(point, center, radius, borderWidth) {\n if (!point || !center || radius <= 0) {\n return false;\n }\n const hBorderWidth = borderWidth / 2;\n return (Math.pow(point.x - center.x, 2) + Math.pow(point.y - center.y, 2)) <= Math.pow(radius + hBorderWidth, 2);\n}\n\n/**\n * @param {Point} point\n * @param {{x: number, y: number, x2: number, y2: number}} rect\n * @param {InteractionAxis} axis\n * @param {number} borderWidth\n * @returns {boolean}\n */\nfunction inBoxRange(point, {x, y, x2, y2}, axis, borderWidth) {\n const hBorderWidth = borderWidth / 2;\n const inRangeX = point.x >= x - hBorderWidth - EPSILON && point.x <= x2 + hBorderWidth + EPSILON;\n const inRangeY = point.y >= y - hBorderWidth - EPSILON && point.y <= y2 + hBorderWidth + EPSILON;\n if (axis === 'x') {\n return inRangeX;\n } else if (axis === 'y') {\n return inRangeY;\n }\n return inRangeX && inRangeY;\n}\n\n/**\n * @param {AnnotationElement} element\n * @param {boolean} useFinalPosition\n * @returns {Point}\n */\nfunction getElementCenterPoint(element, useFinalPosition) {\n const {centerX, centerY} = element.getProps(['centerX', 'centerY'], useFinalPosition);\n return {x: centerX, y: centerY};\n}\n\n/**\n * @param {string} pkg\n * @param {string} min\n * @param {string} ver\n * @param {boolean} [strict=true]\n * @returns {boolean}\n */\nfunction requireVersion(pkg, min, ver, strict = true) {\n const parts = ver.split('.');\n let i = 0;\n for (const req of min.split('.')) {\n const act = parts[i++];\n if (parseInt(req, 10) < parseInt(act, 10)) {\n break;\n }\n if (isOlderPart(act, req)) {\n if (strict) {\n throw new Error(`${pkg} v${ver} is not supported. v${min} or newer is required.`);\n } else {\n return false;\n }\n }\n }\n return true;\n}\n\nconst isPercentString = (s) => typeof s === 'string' && s.endsWith('%');\nconst toPercent = (s) => parseFloat(s) / 100;\nconst toPositivePercent = (s) => clamp(toPercent(s), 0, 1);\n\nconst boxAppering = (x, y) => ({x, y, x2: x, y2: y, width: 0, height: 0});\nconst defaultInitAnimation = {\n box: (properties) => boxAppering(properties.centerX, properties.centerY),\n ellipse: (properties) => ({centerX: properties.centerX, centerY: properties.centerX, radius: 0, width: 0, height: 0}),\n label: (properties) => boxAppering(properties.centerX, properties.centerY),\n line: (properties) => boxAppering(properties.x, properties.y),\n point: (properties) => ({centerX: properties.centerX, centerY: properties.centerY, radius: 0, width: 0, height: 0}),\n polygon: (properties) => boxAppering(properties.centerX, properties.centerY)\n};\n\n/**\n * @typedef { import(\"chart.js\").Chart } Chart\n * @typedef { import('../../types/element').AnnotationBoxModel } AnnotationBoxModel\n * @typedef { import('../../types/element').AnnotationElement } AnnotationElement\n * @typedef { import('../../types/options').AnnotationPointCoordinates } AnnotationPointCoordinates\n * @typedef { import('../../types/label').CoreLabelOptions } CoreLabelOptions\n * @typedef { import('../../types/label').LabelPositionObject } LabelPositionObject\n */\n\n/**\n * @param {number} size\n * @param {number|string} position\n * @returns {number}\n */\nfunction getRelativePosition(size, position) {\n if (position === 'start') {\n return 0;\n }\n if (position === 'end') {\n return size;\n }\n if (isPercentString(position)) {\n return toPositivePercent(position) * size;\n }\n return size / 2;\n}\n\n/**\n * @param {number} size\n * @param {number|string} value\n * @param {boolean} [positivePercent=true]\n * @returns {number}\n */\nfunction getSize(size, value, positivePercent = true) {\n if (typeof value === 'number') {\n return value;\n } else if (isPercentString(value)) {\n return (positivePercent ? toPositivePercent(value) : toPercent(value)) * size;\n }\n return size;\n}\n\n/**\n * @param {{x: number, width: number}} size\n * @param {CoreLabelOptions} options\n * @returns {number}\n */\nfunction calculateTextAlignment(size, options) {\n const {x, width} = size;\n const textAlign = options.textAlign;\n if (textAlign === 'center') {\n return x + width / 2;\n } else if (textAlign === 'end' || textAlign === 'right') {\n return x + width;\n }\n return x;\n}\n\n/**\n * @param {{x: number|string, y: number|string}|string|number} value\n * @param {string|number} defaultValue\n * @returns {{x: number|string, y: number|string}}\n */\nfunction toPosition(value, defaultValue = 'center') {\n if (isObject(value)) {\n return {\n x: valueOrDefault(value.x, defaultValue),\n y: valueOrDefault(value.y, defaultValue),\n };\n }\n value = valueOrDefault(value, defaultValue);\n return {\n x: value,\n y: value\n };\n}\n\n/**\n * @param {AnnotationPointCoordinates} options\n * @returns {boolean}\n */\nfunction isBoundToPoint(options) {\n return options && (defined(options.xValue) || defined(options.yValue));\n}\n\n/**\n * @param {Chart} chart\n * @param {AnnotationBoxModel} properties\n * @param {CoreAnnotationOptions} options\n * @returns {AnnotationElement}\n */\nfunction initAnimationProperties(chart, properties, options) {\n const initAnim = options.init;\n if (!initAnim) {\n return;\n } else if (initAnim === true) {\n return applyDefault(properties, options);\n }\n return execCallback(chart, properties, options);\n}\n\n/**\n * @param {Object} options\n * @param {Array} hooks\n * @param {Object} hooksContainer\n * @returns {boolean}\n */\nfunction loadHooks(options, hooks, hooksContainer) {\n let activated = false;\n hooks.forEach(hook => {\n if (isFunction(options[hook])) {\n activated = true;\n hooksContainer[hook] = options[hook];\n } else if (defined(hooksContainer[hook])) {\n delete hooksContainer[hook];\n }\n });\n return activated;\n}\n\nfunction applyDefault(properties, options) {\n const type = options.type || 'line';\n return defaultInitAnimation[type](properties);\n}\n\nfunction execCallback(chart, properties, options) {\n const result = callback(options.init, [{chart, properties, options}]);\n if (result === true) {\n return applyDefault(properties, options);\n } else if (isObject(result)) {\n return result;\n }\n}\n\nconst widthCache = new Map();\nconst notRadius = (radius) => isNaN(radius) || radius <= 0;\nconst fontsKey = (fonts) => fonts.reduce(function(prev, item) {\n prev += item.string;\n return prev;\n}, '');\n\n/**\n * @typedef { import('chart.js').Point } Point\n * @typedef { import('../../types/label').CoreLabelOptions } CoreLabelOptions\n * @typedef { import('../../types/options').PointAnnotationOptions } PointAnnotationOptions\n */\n\n/**\n * Determine if content is an image or a canvas.\n * @param {*} content\n * @returns boolean|undefined\n * @todo move this function to chart.js helpers\n */\nfunction isImageOrCanvas(content) {\n if (content && typeof content === 'object') {\n const type = content.toString();\n return (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]');\n }\n}\n\n/**\n * Set the translation on the canvas if the rotation must be applied.\n * @param {CanvasRenderingContext2D} ctx - chart canvas context\n * @param {Point} point - the point of translation\n * @param {number} rotation - rotation (in degrees) to apply\n */\nfunction translate(ctx, {x, y}, rotation) {\n if (rotation) {\n ctx.translate(x, y);\n ctx.rotate(toRadians(rotation));\n ctx.translate(-x, -y);\n }\n}\n\n/**\n * @param {CanvasRenderingContext2D} ctx\n * @param {Object} options\n * @returns {boolean|undefined}\n */\nfunction setBorderStyle(ctx, options) {\n if (options && options.borderWidth) {\n ctx.lineCap = options.borderCapStyle;\n ctx.setLineDash(options.borderDash);\n ctx.lineDashOffset = options.borderDashOffset;\n ctx.lineJoin = options.borderJoinStyle;\n ctx.lineWidth = options.borderWidth;\n ctx.strokeStyle = options.borderColor;\n return true;\n }\n}\n\n/**\n * @param {CanvasRenderingContext2D} ctx\n * @param {Object} options\n */\nfunction setShadowStyle(ctx, options) {\n ctx.shadowColor = options.backgroundShadowColor;\n ctx.shadowBlur = options.shadowBlur;\n ctx.shadowOffsetX = options.shadowOffsetX;\n ctx.shadowOffsetY = options.shadowOffsetY;\n}\n\n/**\n * @param {CanvasRenderingContext2D} ctx\n * @param {CoreLabelOptions} options\n * @returns {{width: number, height: number}}\n */\nfunction measureLabelSize(ctx, options) {\n const content = options.content;\n if (isImageOrCanvas(content)) {\n return {\n width: getSize(content.width, options.width),\n height: getSize(content.height, options.height)\n };\n }\n const optFont = options.font;\n const fonts = isArray(optFont) ? optFont.map(f => toFont(f)) : [toFont(optFont)];\n const strokeWidth = options.textStrokeWidth;\n const lines = isArray(content) ? content : [content];\n const mapKey = lines.join() + fontsKey(fonts) + strokeWidth + (ctx._measureText ? '-spriting' : '');\n if (!widthCache.has(mapKey)) {\n widthCache.set(mapKey, calculateLabelSize(ctx, lines, fonts, strokeWidth));\n }\n return widthCache.get(mapKey);\n}\n\n/**\n * @param {CanvasRenderingContext2D} ctx\n * @param {{x: number, y: number, width: number, height: number}} rect\n * @param {Object} options\n */\nfunction drawBox(ctx, rect, options) {\n const {x, y, width, height} = rect;\n ctx.save();\n setShadowStyle(ctx, options);\n const stroke = setBorderStyle(ctx, options);\n ctx.fillStyle = options.backgroundColor;\n ctx.beginPath();\n addRoundedRectPath(ctx, {\n x, y, w: width, h: height,\n radius: clampAll(toTRBLCorners(options.borderRadius), 0, Math.min(width, height) / 2)\n });\n ctx.closePath();\n ctx.fill();\n if (stroke) {\n ctx.shadowColor = options.borderShadowColor;\n ctx.stroke();\n }\n ctx.restore();\n}\n\n/**\n * @param {CanvasRenderingContext2D} ctx\n * @param {{x: number, y: number, width: number, height: number}} rect\n * @param {CoreLabelOptions} options\n */\nfunction drawLabel(ctx, rect, options) {\n const content = options.content;\n if (isImageOrCanvas(content)) {\n ctx.save();\n ctx.globalAlpha = getOpacity(options.opacity, content.style.opacity);\n ctx.drawImage(content, rect.x, rect.y, rect.width, rect.height);\n ctx.restore();\n return;\n }\n const labels = isArray(content) ? content : [content];\n const optFont = options.font;\n const fonts = isArray(optFont) ? optFont.map(f => toFont(f)) : [toFont(optFont)];\n const optColor = options.color;\n const colors = isArray(optColor) ? optColor : [optColor];\n const x = calculateTextAlignment(rect, options);\n const y = rect.y + options.textStrokeWidth / 2;\n ctx.save();\n ctx.textBaseline = 'middle';\n ctx.textAlign = options.textAlign;\n if (setTextStrokeStyle(ctx, options)) {\n applyLabelDecoration(ctx, {x, y}, labels, fonts);\n }\n applyLabelContent(ctx, {x, y}, labels, {fonts, colors});\n ctx.restore();\n}\n\nfunction setTextStrokeStyle(ctx, options) {\n if (options.textStrokeWidth > 0) {\n // https://stackoverflow.com/questions/13627111/drawing-text-with-an-outer-stroke-with-html5s-canvas\n ctx.lineJoin = 'round';\n ctx.miterLimit = 2;\n ctx.lineWidth = options.textStrokeWidth;\n ctx.strokeStyle = options.textStrokeColor;\n return true;\n }\n}\n\n/**\n * @param {CanvasRenderingContext2D} ctx\n * @param {{radius: number, options: PointAnnotationOptions}} element\n * @param {number} x\n * @param {number} y\n */\nfunction drawPoint(ctx, element, x, y) {\n const {radius, options} = element;\n const style = options.pointStyle;\n const rotation = options.rotation;\n let rad = (rotation || 0) * RAD_PER_DEG;\n\n if (isImageOrCanvas(style)) {\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 if (notRadius(radius)) {\n return;\n }\n drawPointStyle(ctx, {x, y, radius, rotation, style, rad});\n}\n\nfunction drawPointStyle(ctx, {x, y, radius, rotation, style, rad}) {\n let xOffset, yOffset, size, cornerRadius;\n ctx.beginPath();\n\n switch (style) {\n // Default includes circle\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 // NOTE: the rounded rect implementation changed to use `arc` instead of\n // `quadraticCurveTo` since it generates better results when rect is\n // almost a circle. 0.516 (instead of 0.5) produces results with visually\n // closer proportion to the previous impl and it is inscribed in the\n // circle with `radius`. For more details, see the following PRs:\n // https://github.com/chartjs/Chart.js/issues/5597\n // https://github.com/chartjs/Chart.js/issues/5858\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 /* falls through */\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 /* falls through */\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\n ctx.fill();\n}\n\nfunction calculateLabelSize(ctx, lines, fonts, strokeWidth) {\n ctx.save();\n const count = lines.length;\n let width = 0;\n let height = strokeWidth;\n for (let i = 0; i < count; i++) {\n const font = fonts[Math.min(i, fonts.length - 1)];\n ctx.font = font.string;\n const text = lines[i];\n width = Math.max(width, ctx.measureText(text).width + strokeWidth);\n height += font.lineHeight;\n }\n ctx.restore();\n return {width, height};\n}\n\nfunction applyLabelDecoration(ctx, {x, y}, labels, fonts) {\n ctx.beginPath();\n let lhs = 0;\n labels.forEach(function(l, i) {\n const f = fonts[Math.min(i, fonts.length - 1)];\n const lh = f.lineHeight;\n ctx.font = f.string;\n ctx.strokeText(l, x, y + lh / 2 + lhs);\n lhs += lh;\n });\n ctx.stroke();\n}\n\nfunction applyLabelContent(ctx, {x, y}, labels, {fonts, colors}) {\n let lhs = 0;\n labels.forEach(function(l, i) {\n const c = colors[Math.min(i, colors.length - 1)];\n const f = fonts[Math.min(i, fonts.length - 1)];\n const lh = f.lineHeight;\n ctx.beginPath();\n ctx.font = f.string;\n ctx.fillStyle = c;\n ctx.fillText(l, x, y + lh / 2 + lhs);\n lhs += lh;\n ctx.fill();\n });\n}\n\nfunction getOpacity(value, elementValue) {\n const opacity = isNumber(value) ? value : elementValue;\n return isNumber(opacity) ? clamp(opacity, 0, 1) : 1;\n}\n\nconst limitedLineScale = {\n xScaleID: {min: 'xMin', max: 'xMax', start: 'left', end: 'right', startProp: 'x', endProp: 'x2'},\n yScaleID: {min: 'yMin', max: 'yMax', start: 'bottom', end: 'top', startProp: 'y', endProp: 'y2'}\n};\n\n/**\n * @typedef { import(\"chart.js\").Chart } Chart\n * @typedef { import(\"chart.js\").Scale } Scale\n * @typedef { import(\"chart.js\").Point } Point\n * @typedef { import('../../types/element').AnnotationBoxModel } AnnotationBoxModel\n * @typedef { import('../../types/options').CoreAnnotationOptions } CoreAnnotationOptions\n * @typedef { import('../../types/options').LineAnnotationOptions } LineAnnotationOptions\n * @typedef { import('../../types/options').PointAnnotationOptions } PointAnnotationOptions\n * @typedef { import('../../types/options').PolygonAnnotationOptions } PolygonAnnotationOptions\n */\n\n/**\n * @param {Scale} scale\n * @param {number|string} value\n * @param {number} fallback\n * @returns {number}\n */\nfunction scaleValue(scale, value, fallback) {\n value = typeof value === 'number' ? value : scale.parse(value);\n return isFinite(value) ? scale.getPixelForValue(value) : fallback;\n}\n\n/**\n * Search the scale defined in chartjs by the axis related to the annotation options key.\n * @param {{ [key: string]: Scale }} scales\n * @param {CoreAnnotationOptions} options\n * @param {string} key\n * @returns {string}\n */\nfunction retrieveScaleID(scales, options, key) {\n const scaleID = options[key];\n if (scaleID || key === 'scaleID') {\n return scaleID;\n }\n const axis = key.charAt(0);\n const axes = Object.values(scales).filter((scale) => scale.axis && scale.axis === axis);\n if (axes.length) {\n return axes[0].id;\n }\n return axis;\n}\n\n/**\n * @param {Scale} scale\n * @param {{min: number, max: number, start: number, end: number}} options\n * @returns {{start: number, end: number}|undefined}\n */\nfunction getDimensionByScale(scale, options) {\n if (scale) {\n const reverse = scale.options.reverse;\n const start = scaleValue(scale, options.min, reverse ? options.end : options.start);\n const end = scaleValue(scale, options.max, reverse ? options.start : options.end);\n return {\n start,\n end\n };\n }\n}\n\n/**\n * @param {Chart} chart\n * @param {CoreAnnotationOptions} options\n * @returns {Point}\n */\nfunction getChartPoint(chart, options) {\n const {chartArea, scales} = chart;\n const xScale = scales[retrieveScaleID(scales, options, 'xScaleID')];\n const yScale = scales[retrieveScaleID(scales, options, 'yScaleID')];\n let x = chartArea.width / 2;\n let y = chartArea.height / 2;\n\n if (xScale) {\n x = scaleValue(xScale, options.xValue, xScale.left + xScale.width / 2);\n }\n\n if (yScale) {\n y = scaleValue(yScale, options.yValue, yScale.top + yScale.height / 2);\n }\n return {x, y};\n}\n\n/**\n * @param {Chart} chart\n * @param {CoreAnnotationOptions} options\n * @returns {AnnotationBoxModel}\n */\nfunction resolveBoxProperties(chart, options) {\n const scales = chart.scales;\n const xScale = scales[retrieveScaleID(scales, options, 'xScaleID')];\n const yScale = scales[retrieveScaleID(scales, options, 'yScaleID')];\n\n if (!xScale && !yScale) {\n return {};\n }\n\n let {left: x, right: x2} = xScale || chart.chartArea;\n let {top: y, bottom: y2} = yScale || chart.chartArea;\n const xDim = getChartDimensionByScale(xScale, {min: options.xMin, max: options.xMax, start: x, end: x2});\n x = xDim.start;\n x2 = xDim.end;\n const yDim = getChartDimensionByScale(yScale, {min: options.yMin, max: options.yMax, start: y2, end: y});\n y = yDim.start;\n y2 = yDim.end;\n\n return {\n x,\n y,\n x2,\n y2,\n width: x2 - x,\n height: y2 - y,\n centerX: x + (x2 - x) / 2,\n centerY: y + (y2 - y) / 2\n };\n}\n\n/**\n * @param {Chart} chart\n * @param {PointAnnotationOptions|PolygonAnnotationOptions} options\n * @returns {AnnotationBoxModel}\n */\nfunction resolvePointProperties(chart, options) {\n if (!isBoundToPoint(options)) {\n const box = resolveBoxProperties(chart, options);\n let radius = options.radius;\n if (!radius || isNaN(radius)) {\n radius = Math.min(box.width, box.height) / 2;\n options.radius = radius;\n }\n const size = radius * 2;\n const adjustCenterX = box.centerX + options.xAdjust;\n const adjustCenterY = box.centerY + options.yAdjust;\n return {\n x: adjustCenterX - radius,\n y: adjustCenterY - radius,\n x2: adjustCenterX + radius,\n y2: adjustCenterY + radius,\n centerX: adjustCenterX,\n centerY: adjustCenterY,\n width: size,\n height: size,\n radius\n };\n }\n return getChartCircle(chart, options);\n}\n/**\n * @param {Chart} chart\n * @param {LineAnnotationOptions} options\n * @returns {AnnotationBoxModel}\n */\nfunction resolveLineProperties(chart, options) {\n const {scales, chartArea} = chart;\n const scale = scales[options.scaleID];\n const area = {x: chartArea.left, y: chartArea.top, x2: chartArea.right, y2: chartArea.bottom};\n\n if (scale) {\n resolveFullLineProperties(scale, area, options);\n } else {\n resolveLimitedLineProperties(scales, area, options);\n }\n return area;\n}\n\n/**\n * @param {Chart} chart\n * @param {CoreAnnotationOptions} options\n * @param {boolean} [centerBased=false]\n * @returns {AnnotationBoxModel}\n */\nfunction resolveBoxAndLabelProperties(chart, options) {\n const properties = resolveBoxProperties(chart, options);\n properties.initProperties = initAnimationProperties(chart, properties, options);\n properties.elements = [{\n type: 'label',\n optionScope: 'label',\n properties: resolveLabelElementProperties$1(chart, properties, options),\n initProperties: properties.initProperties\n }];\n return properties;\n}\n\nfunction getChartCircle(chart, options) {\n const point = getChartPoint(chart, options);\n const size = options.radius * 2;\n return {\n x: point.x - options.radius + options.xAdjust,\n y: point.y - options.radius + options.yAdjust,\n x2: point.x + options.radius + options.xAdjust,\n y2: point.y + options.radius + options.yAdjust,\n centerX: point.x + options.xAdjust,\n centerY: point.y + options.yAdjust,\n radius: options.radius,\n width: size,\n height: size\n };\n}\n\nfunction getChartDimensionByScale(scale, options) {\n const result = getDimensionByScale(scale, options) || options;\n return {\n start: Math.min(result.start, result.end),\n end: Math.max(result.start, result.end)\n };\n}\n\nfunction resolveFullLineProperties(scale, area, options) {\n const min = scaleValue(scale, options.value, NaN);\n const max = scaleValue(scale, options.endValue, min);\n if (scale.isHorizontal()) {\n area.x = min;\n area.x2 = max;\n } else {\n area.y = min;\n area.y2 = max;\n }\n}\n\nfunction resolveLimitedLineProperties(scales, area, options) {\n for (const scaleId of Object.keys(limitedLineScale)) {\n const scale = scales[retrieveScaleID(scales, options, scaleId)];\n if (scale) {\n const {min, max, start, end, startProp, endProp} = limitedLineScale[scaleId];\n const dim = getDimensionByScale(scale, {min: options[min], max: options[max], start: scale[start], end: scale[end]});\n area[startProp] = dim.start;\n area[endProp] = dim.end;\n }\n }\n}\n\nfunction calculateX({properties, options}, labelSize, position, padding) {\n const {x: start, x2: end, width: size} = properties;\n return calculatePosition$1({start, end, size, borderWidth: options.borderWidth}, {\n position: position.x,\n padding: {start: padding.left, end: padding.right},\n adjust: options.label.xAdjust,\n size: labelSize.width\n });\n}\n\nfunction calculateY({properties, options}, labelSize, position, padding) {\n const {y: start, y2: end, height: size} = properties;\n return calculatePosition$1({start, end, size, borderWidth: options.borderWidth}, {\n position: position.y,\n padding: {start: padding.top, end: padding.bottom},\n adjust: options.label.yAdjust,\n size: labelSize.height\n });\n}\n\nfunction calculatePosition$1(boxOpts, labelOpts) {\n const {start, end, borderWidth} = boxOpts;\n const {position, padding: {start: padStart, end: padEnd}, adjust} = labelOpts;\n const availableSize = end - borderWidth - start - padStart - padEnd - labelOpts.size;\n return start + borderWidth / 2 + adjust + getRelativePosition(availableSize, position);\n}\n\nfunction resolveLabelElementProperties$1(chart, properties, options) {\n const label = options.label;\n label.backgroundColor = 'transparent';\n label.callout.display = false;\n const position = toPosition(label.position);\n const padding = toPadding(label.padding);\n const labelSize = measureLabelSize(chart.ctx, label);\n const x = calculateX({properties, options}, labelSize, position, padding);\n const y = calculateY({properties, options}, labelSize, position, padding);\n const width = labelSize.width + padding.width;\n const height = labelSize.height + padding.height;\n return {\n x,\n y,\n x2: x + width,\n y2: y + height,\n width,\n height,\n centerX: x + width / 2,\n centerY: y + height / 2,\n rotation: label.rotation\n };\n\n}\n\n/**\n * @typedef {import('chart.js').Point} Point\n */\n\n/**\n * Rotate a `point` relative to `center` point by `angle`\n * @param {Point} point - the point to rotate\n * @param {Point} center - center point for rotation\n * @param {number} angle - angle for rotation, in radians\n * @returns {Point} rotated point\n */\nfunction rotated(point, center, angle) {\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n const cx = center.x;\n const 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\nconst moveHooks = ['enter', 'leave'];\n\n/**\n * @typedef { import(\"chart.js\").Chart } Chart\n * @typedef { import('../../types/options').AnnotationPluginOptions } AnnotationPluginOptions\n */\n\nconst eventHooks = moveHooks.concat('click');\n\n/**\n * @param {Chart} chart\n * @param {Object} state\n * @param {AnnotationPluginOptions} options\n */\nfunction updateListeners(chart, state, options) {\n state.listened = loadHooks(options, eventHooks, state.listeners);\n state.moveListened = false;\n state._getElements = getElements; // for testing\n\n moveHooks.forEach(hook => {\n if (isFunction(options[hook])) {\n state.moveListened = true;\n }\n });\n\n if (!state.listened || !state.moveListened) {\n state.annotations.forEach(scope => {\n if (!state.listened && isFunction(scope.click)) {\n state.listened = true;\n }\n if (!state.moveListened) {\n moveHooks.forEach(hook => {\n if (isFunction(scope[hook])) {\n state.listened = true;\n state.moveListened = true;\n }\n });\n }\n });\n }\n}\n\n/**\n * @param {Object} state\n * @param {ChartEvent} event\n * @param {AnnotationPluginOptions} options\n * @return {boolean|undefined}\n */\nfunction handleEvent(state, event, options) {\n if (state.listened) {\n switch (event.type) {\n case 'mousemove':\n case 'mouseout':\n return handleMoveEvents(state, event, options);\n case 'click':\n return handleClickEvents(state, event, options);\n }\n }\n}\n\nfunction handleMoveEvents(state, event, options) {\n if (!state.moveListened) {\n return;\n }\n\n let elements;\n\n if (event.type === 'mousemove') {\n elements = getElements(state, event, options.interaction);\n } else {\n elements = [];\n }\n\n const previous = state.hovered;\n state.hovered = elements;\n\n const context = {state, event};\n let changed = dispatchMoveEvents(context, 'leave', previous, elements);\n return dispatchMoveEvents(context, 'enter', elements, previous) || changed;\n}\n\nfunction dispatchMoveEvents({state, event}, hook, elements, checkElements) {\n let changed;\n for (const element of elements) {\n if (checkElements.indexOf(element) < 0) {\n changed = dispatchEvent(element.options[hook] || state.listeners[hook], element, event) || changed;\n }\n }\n return changed;\n}\n\nfunction handleClickEvents(state, event, options) {\n const listeners = state.listeners;\n const elements = getElements(state, event, options.interaction);\n let changed;\n for (const element of elements) {\n changed = dispatchEvent(element.options.click || listeners.click, element, event) || changed;\n }\n return changed;\n}\n\nfunction dispatchEvent(handler, element, event) {\n return callback(handler, [element.$context, event]) === true;\n}\n\n/**\n * @typedef { import(\"chart.js\").Chart } Chart\n * @typedef { import('../../types/options').AnnotationPluginOptions } AnnotationPluginOptions\n * @typedef { import('../../types/element').AnnotationElement } AnnotationElement\n */\n\nconst elementHooks = ['afterDraw', 'beforeDraw'];\n\n/**\n * @param {Chart} chart\n * @param {Object} state\n * @param {AnnotationPluginOptions} options\n */\nfunction updateHooks(chart, state, options) {\n const visibleElements = state.visibleElements;\n state.hooked = loadHooks(options, elementHooks, state.hooks);\n\n if (!state.hooked) {\n visibleElements.forEach(scope => {\n if (!state.hooked) {\n elementHooks.forEach(hook => {\n if (isFunction(scope.options[hook])) {\n state.hooked = true;\n }\n });\n }\n });\n }\n}\n\n/**\n * @param {Object} state\n * @param {AnnotationElement} element\n * @param {string} hook\n */\nfunction invokeHook(state, element, hook) {\n if (state.hooked) {\n const callbackHook = element.options[hook] || state.hooks[hook];\n return callback(callbackHook, [element.$context]);\n }\n}\n\n/**\n * @typedef { import(\"chart.js\").Chart } Chart\n * @typedef { import(\"chart.js\").Scale } Scale\n * @typedef { import('../../types/options').CoreAnnotationOptions } CoreAnnotationOptions\n */\n\n/**\n * @param {Chart} chart\n * @param {Scale} scale\n * @param {CoreAnnotationOptions[]} annotations\n */\nfunction adjustScaleRange(chart, scale, annotations) {\n const range = getScaleLimits(chart.scales, scale, annotations);\n let changed = changeScaleLimit(scale, range, 'min', 'suggestedMin');\n changed = changeScaleLimit(scale, range, 'max', 'suggestedMax') || changed;\n if (changed && isFunction(scale.handleTickRangeOptions)) {\n scale.handleTickRangeOptions();\n }\n}\n\n/**\n * @param {CoreAnnotationOptions[]} annotations\n * @param {{ [key: string]: Scale }} scales\n */\nfunction verifyScaleOptions(annotations, scales) {\n for (const annotation of annotations) {\n verifyScaleIDs(annotation, scales);\n }\n}\n\nfunction changeScaleLimit(scale, range, limit, suggestedLimit) {\n if (isFinite(range[limit]) && !scaleLimitDefined(scale.options, limit, suggestedLimit)) {\n const changed = scale[limit] !== range[limit];\n scale[limit] = range[limit];\n return changed;\n }\n}\n\nfunction scaleLimitDefined(scaleOptions, limit, suggestedLimit) {\n return defined(scaleOptions[limit]) || defined(scaleOptions[suggestedLimit]);\n}\n\nfunction verifyScaleIDs(annotation, scales) {\n for (const key of ['scaleID', 'xScaleID', 'yScaleID']) {\n const scaleID = retrieveScaleID(scales, annotation, key);\n if (scaleID && !scales[scaleID] && verifyProperties(annotation, key)) {\n console.warn(`No scale found with id '${scaleID}' for annotation '${annotation.id}'`);\n }\n }\n}\n\nfunction verifyProperties(annotation, key) {\n if (key === 'scaleID') {\n return true;\n }\n const axis = key.charAt(0);\n for (const prop of ['Min', 'Max', 'Value']) {\n if (defined(annotation[axis + prop])) {\n return true;\n }\n }\n return false;\n}\n\nfunction getScaleLimits(scales, scale, annotations) {\n const axis = scale.axis;\n const scaleID = scale.id;\n const scaleIDOption = axis + 'ScaleID';\n const limits = {\n min: valueOrDefault(scale.min, Number.NEGATIVE_INFINITY),\n max: valueOrDefault(scale.max, Number.POSITIVE_INFINITY)\n };\n for (const annotation of annotations) {\n if (annotation.scaleID === scaleID) {\n updateLimits(annotation, scale, ['value', 'endValue'], limits);\n } else if (retrieveScaleID(scales, annotation, scaleIDOption) === scaleID) {\n updateLimits(annotation, scale, [axis + 'Min', axis + 'Max', axis + 'Value'], limits);\n }\n }\n return limits;\n}\n\nfunction updateLimits(annotation, scale, props, limits) {\n for (const prop of props) {\n const raw = annotation[prop];\n if (defined(raw)) {\n const value = scale.parse(raw);\n limits.min = Math.min(limits.min, value);\n limits.max = Math.max(limits.max, value);\n }\n }\n}\n\nclass BoxAnnotation extends Element {\n\n inRange(mouseX, mouseY, axis, useFinalPosition) {\n const {x, y} = rotated({x: mouseX, y: mouseY}, this.getCenterPoint(useFinalPosition), toRadians(-this.options.rotation));\n return inBoxRange({x, y}, this.getProps(['x', 'y', 'x2', 'y2'], useFinalPosition), axis, this.options.borderWidth);\n }\n\n getCenterPoint(useFinalPosition) {\n return getElementCenterPoint(this, useFinalPosition);\n }\n\n draw(ctx) {\n ctx.save();\n translate(ctx, this.getCenterPoint(), this.options.rotation);\n drawBox(ctx, this, this.options);\n ctx.restore();\n }\n\n get label() {\n return this.elements && this.elements[0];\n }\n\n resolveElementProperties(chart, options) {\n return resolveBoxAndLabelProperties(chart, options);\n }\n}\n\nBoxAnnotation.id = 'boxAnnotation';\n\nBoxAnnotation.defaults = {\n adjustScaleRange: true,\n backgroundShadowColor: 'transparent',\n borderCapStyle: 'butt',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: 'miter',\n borderRadius: 0,\n borderShadowColor: 'transparent',\n borderWidth: 1,\n display: true,\n init: undefined,\n label: {\n backgroundColor: 'transparent',\n borderWidth: 0,\n callout: {\n display: false\n },\n color: 'black',\n content: null,\n display: false,\n drawTime: undefined,\n font: {\n family: undefined,\n lineHeight: undefined,\n size: undefined,\n style: undefined,\n weight: 'bold'\n },\n height: undefined,\n opacity: undefined,\n padding: 6,\n position: 'center',\n rotation: undefined,\n textAlign: 'start',\n textStrokeColor: undefined,\n textStrokeWidth: 0,\n width: undefined,\n xAdjust: 0,\n yAdjust: 0,\n z: undefined\n },\n rotation: 0,\n shadowBlur: 0,\n shadowOffsetX: 0,\n shadowOffsetY: 0,\n xMax: undefined,\n xMin: undefined,\n xScaleID: undefined,\n yMax: undefined,\n yMin: undefined,\n yScaleID: undefined,\n z: 0\n};\n\nBoxAnnotation.defaultRoutes = {\n borderColor: 'color',\n backgroundColor: 'color'\n};\n\nBoxAnnotation.descriptors = {\n label: {\n _fallback: true\n }\n};\n\nconst positions = ['left', 'bottom', 'top', 'right'];\n\nclass LabelAnnotation extends Element {\n\n inRange(mouseX, mouseY, axis, useFinalPosition) {\n const {x, y} = rotated({x: mouseX, y: mouseY}, this.getCenterPoint(useFinalPosition), toRadians(-this.rotation));\n return inBoxRange({x, y}, this.getProps(['x', 'y', 'x2', 'y2'], useFinalPosition), axis, this.options.borderWidth);\n }\n\n getCenterPoint(useFinalPosition) {\n return getElementCenterPoint(this, useFinalPosition);\n }\n\n draw(ctx) {\n const options = this.options;\n const visible = !defined(this._visible) || this._visible;\n if (!options.display || !options.content || !visible) {\n return;\n }\n ctx.save();\n translate(ctx, this.getCenterPoint(), this.rotation);\n drawCallout(ctx, this);\n drawBox(ctx, this, options);\n drawLabel(ctx, getLabelSize(this), options);\n ctx.restore();\n }\n\n resolveElementProperties(chart, options) {\n let point;\n if (!isBoundToPoint(options)) {\n const {centerX, centerY} = resolveBoxProperties(chart, options);\n point = {x: centerX, y: centerY};\n } else {\n point = getChartPoint(chart, options);\n }\n const padding = toPadding(options.padding);\n const labelSize = measureLabelSize(chart.ctx, options);\n const boxSize = measureRect(point, labelSize, options, padding);\n return {\n initProperties: initAnimationProperties(chart, boxSize, options),\n pointX: point.x,\n pointY: point.y,\n ...boxSize,\n rotation: options.rotation\n };\n }\n}\n\nLabelAnnotation.id = 'labelAnnotation';\n\nLabelAnnotation.defaults = {\n adjustScaleRange: true,\n backgroundColor: 'transparent',\n backgroundShadowColor: 'transparent',\n borderCapStyle: 'butt',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: 'miter',\n borderRadius: 0,\n borderShadowColor: 'transparent',\n borderWidth: 0,\n callout: {\n borderCapStyle: 'butt',\n borderColor: undefined,\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: 'miter',\n borderWidth: 1,\n display: false,\n margin: 5,\n position: 'auto',\n side: 5,\n start: '50%',\n },\n color: 'black',\n content: null,\n display: true,\n font: {\n family: undefined,\n lineHeight: undefined,\n size: undefined,\n style: undefined,\n weight: undefined\n },\n height: undefined,\n init: undefined,\n opacity: undefined,\n padding: 6,\n position: 'center',\n rotation: 0,\n shadowBlur: 0,\n shadowOffsetX: 0,\n shadowOffsetY: 0,\n textAlign: 'center',\n textStrokeColor: undefined,\n textStrokeWidth: 0,\n width: undefined,\n xAdjust: 0,\n xMax: undefined,\n xMin: undefined,\n xScaleID: undefined,\n xValue: undefined,\n yAdjust: 0,\n yMax: undefined,\n yMin: undefined,\n yScaleID: undefined,\n yValue: undefined,\n z: 0\n};\n\nLabelAnnotation.defaultRoutes = {\n borderColor: 'color'\n};\n\nfunction measureRect(point, size, options, padding) {\n const width = size.width + padding.width + options.borderWidth;\n const height = size.height + padding.height + options.borderWidth;\n const position = toPosition(options.position, 'center');\n const x = calculatePosition(point.x, width, options.xAdjust, position.x);\n const y = calculatePosition(point.y, height, options.yAdjust, position.y);\n\n return {\n x,\n y,\n x2: x + width,\n y2: y + height,\n width,\n height,\n centerX: x + width / 2,\n centerY: y + height / 2\n };\n}\n\nfunction calculatePosition(start, size, adjust = 0, position) {\n return start - getRelativePosition(size, position) + adjust;\n}\n\nfunction drawCallout(ctx, element) {\n const {pointX, pointY, options} = element;\n const callout = options.callout;\n const calloutPosition = callout && callout.display && resolveCalloutPosition(element, callout);\n if (!calloutPosition || isPointInRange(element, callout, calloutPosition)) {\n return;\n }\n\n ctx.save();\n ctx.beginPath();\n const stroke = setBorderStyle(ctx, callout);\n if (!stroke) {\n return ctx.restore();\n }\n const {separatorStart, separatorEnd} = getCalloutSeparatorCoord(element, calloutPosition);\n const {sideStart, sideEnd} = getCalloutSideCoord(element, calloutPosition, separatorStart);\n if (callout.margin > 0 || options.borderWidth === 0) {\n ctx.moveTo(separatorStart.x, separatorStart.y);\n ctx.lineTo(separatorEnd.x, separatorEnd.y);\n }\n ctx.moveTo(sideStart.x, sideStart.y);\n ctx.lineTo(sideEnd.x, sideEnd.y);\n const rotatedPoint = rotated({x: pointX, y: pointY}, element.getCenterPoint(), toRadians(-element.rotation));\n ctx.lineTo(rotatedPoint.x, rotatedPoint.y);\n ctx.stroke();\n ctx.restore();\n}\n\nfunction getCalloutSeparatorCoord(element, position) {\n const {x, y, x2, y2} = element;\n const adjust = getCalloutSeparatorAdjust(element, position);\n let separatorStart, separatorEnd;\n if (position === 'left' || position === 'right') {\n separatorStart = {x: x + adjust, y};\n separatorEnd = {x: separatorStart.x, y: y2};\n } else {\n // position 'top' or 'bottom'\n separatorStart = {x, y: y + adjust};\n separatorEnd = {x: x2, y: separatorStart.y};\n }\n return {separatorStart, separatorEnd};\n}\n\nfunction getCalloutSeparatorAdjust(element, position) {\n const {width, height, options} = element;\n const adjust = options.callout.margin + options.borderWidth / 2;\n if (position === 'right') {\n return width + adjust;\n } else if (position === 'bottom') {\n return height + adjust;\n }\n return -adjust;\n}\n\nfunction getCalloutSideCoord(element, position, separatorStart) {\n const {y, width, height, options} = element;\n const start = options.callout.start;\n const side = getCalloutSideAdjust(position, options.callout);\n let sideStart, sideEnd;\n if (position === 'left' || position === 'right') {\n sideStart = {x: separatorStart.x, y: y + getSize(height, start)};\n sideEnd = {x: sideStart.x + side, y: sideStart.y};\n } else {\n // position 'top' or 'bottom'\n sideStart = {x: separatorStart.x + getSize(width, start), y: separatorStart.y};\n sideEnd = {x: sideStart.x, y: sideStart.y + side};\n }\n return {sideStart, sideEnd};\n}\n\nfunction getCalloutSideAdjust(position, options) {\n const side = options.side;\n if (position === 'left' || position === 'top') {\n return -side;\n }\n return side;\n}\n\nfunction resolveCalloutPosition(element, options) {\n const position = options.position;\n if (positions.includes(position)) {\n return position;\n }\n return resolveCalloutAutoPosition(element, options);\n}\n\nfunction resolveCalloutAutoPosition(element, options) {\n const {x, y, x2, y2, width, height, pointX, pointY, centerX, centerY, rotation} = element;\n const center = {x: centerX, y: centerY};\n const start = options.start;\n const xAdjust = getSize(width, start);\n const yAdjust = getSize(height, start);\n const xPoints = [x, x + xAdjust, x + xAdjust, x2];\n const yPoints = [y + yAdjust, y2, y, y2];\n const result = [];\n for (let index = 0; index < 4; index++) {\n const rotatedPoint = rotated({x: xPoints[index], y: yPoints[index]}, center, toRadians(rotation));\n result.push({\n position: positions[index],\n distance: distanceBetweenPoints(rotatedPoint, {x: pointX, y: pointY})\n });\n }\n return result.sort((a, b) => a.distance - b.distance)[0].position;\n}\n\nfunction getLabelSize({x, y, width, height, options}) {\n const hBorderWidth = options.borderWidth / 2;\n const padding = toPadding(options.padding);\n return {\n x: x + padding.left + hBorderWidth,\n y: y + padding.top + hBorderWidth,\n width: width - padding.left - padding.right - options.borderWidth,\n height: height - padding.top - padding.bottom - options.borderWidth\n };\n}\n\nfunction isPointInRange(element, callout, position) {\n const {pointX, pointY} = element;\n const margin = callout.margin;\n let x = pointX;\n let y = pointY;\n if (position === 'left') {\n x += margin;\n } else if (position === 'right') {\n x -= margin;\n } else if (position === 'top') {\n y += margin;\n } else if (position === 'bottom') {\n y -= margin;\n }\n return element.inRange(x, y);\n}\n\nconst pointInLine = (p1, p2, t) => ({x: p1.x + t * (p2.x - p1.x), y: p1.y + t * (p2.y - p1.y)});\nconst interpolateX = (y, p1, p2) => pointInLine(p1, p2, Math.abs((y - p1.y) / (p2.y - p1.y))).x;\nconst interpolateY = (x, p1, p2) => pointInLine(p1, p2, Math.abs((x - p1.x) / (p2.x - p1.x))).y;\nconst sqr = v => v * v;\nconst rangeLimit = (mouseX, mouseY, {x, y, x2, y2}, axis) => axis === 'y' ? {start: Math.min(y, y2), end: Math.max(y, y2), value: mouseY} : {start: Math.min(x, x2), end: Math.max(x, x2), value: mouseX};\n// http://www.independent-software.com/determining-coordinates-on-a-html-canvas-bezier-curve.html\nconst coordInCurve = (start, cp, end, t) => (1 - t) * (1 - t) * start + 2 * (1 - t) * t * cp + t * t * end;\nconst pointInCurve = (start, cp, end, t) => ({x: coordInCurve(start.x, cp.x, end.x, t), y: coordInCurve(start.y, cp.y, end.y, t)});\nconst coordAngleInCurve = (start, cp, end, t) => 2 * (1 - t) * (cp - start) + 2 * t * (end - cp);\nconst angleInCurve = (start, cp, end, t) => -Math.atan2(coordAngleInCurve(start.x, cp.x, end.x, t), coordAngleInCurve(start.y, cp.y, end.y, t)) + 0.5 * PI;\n\nclass LineAnnotation extends Element {\n\n inRange(mouseX, mouseY, axis, useFinalPosition) {\n const hBorderWidth = this.options.borderWidth / 2;\n if (axis !== 'x' && axis !== 'y') {\n const point = {mouseX, mouseY};\n const {path, ctx} = this;\n if (path) {\n setBorderStyle(ctx, this.options);\n const {chart} = this.$context;\n const mx = mouseX * chart.currentDevicePixelRatio;\n const my = mouseY * chart.currentDevicePixelRatio;\n const result = ctx.isPointInStroke(path, mx, my) || isOnLabel(this, point, useFinalPosition);\n ctx.restore();\n return result;\n }\n const epsilon = sqr(hBorderWidth);\n return intersects(this, point, epsilon, useFinalPosition) || isOnLabel(this, point, useFinalPosition);\n }\n return inAxisRange(this, {mouseX, mouseY}, axis, {hBorderWidth, useFinalPosition});\n }\n\n getCenterPoint(useFinalPosition) {\n return getElementCenterPoint(this, useFinalPosition);\n }\n\n draw(ctx) {\n const {x, y, x2, y2, cp, options} = this;\n\n ctx.save();\n if (!setBorderStyle(ctx, options)) {\n // no border width, then line is not drawn\n return ctx.restore();\n }\n setShadowStyle(ctx, options);\n\n const length = Math.sqrt(Math.pow(x2 - x, 2) + Math.pow(y2 - y, 2));\n if (options.curve && cp) {\n drawCurve(ctx, this, cp, length);\n return ctx.restore();\n }\n const {startOpts, endOpts, startAdjust, endAdjust} = getArrowHeads(this);\n const angle = Math.atan2(y2 - y, x2 - x);\n ctx.translate(x, y);\n ctx.rotate(angle);\n ctx.beginPath();\n ctx.moveTo(0 + startAdjust, 0);\n ctx.lineTo(length - endAdjust, 0);\n ctx.shadowColor = options.borderShadowColor;\n ctx.stroke();\n drawArrowHead(ctx, 0, startAdjust, startOpts);\n drawArrowHead(ctx, length, -endAdjust, endOpts);\n ctx.restore();\n }\n\n get label() {\n return this.elements && this.elements[0];\n }\n\n resolveElementProperties(chart, options) {\n const area = resolveLineProperties(chart, options);\n const {x, y, x2, y2} = area;\n const inside = isLineInArea(area, chart.chartArea);\n const properties = inside\n ? limitLineToArea({x, y}, {x: x2, y: y2}, chart.chartArea)\n : {x, y, x2, y2, width: Math.abs(x2 - x), height: Math.abs(y2 - y)};\n properties.centerX = (x2 + x) / 2;\n properties.centerY = (y2 + y) / 2;\n properties.initProperties = initAnimationProperties(chart, properties, options);\n if (options.curve) {\n const p1 = {x: properties.x, y: properties.y};\n const p2 = {x: properties.x2, y: properties.y2};\n properties.cp = getControlPoint(properties, options, distanceBetweenPoints(p1, p2));\n }\n const labelProperties = resolveLabelElementProperties(chart, properties, options.label);\n // additonal prop to manage zoom/pan\n labelProperties._visible = inside;\n\n properties.elements = [{\n type: 'label',\n optionScope: 'label',\n properties: labelProperties,\n initProperties: properties.initProperties\n }];\n return properties;\n }\n}\n\nLineAnnotation.id = 'lineAnnotation';\n\nconst arrowHeadsDefaults = {\n backgroundColor: undefined,\n backgroundShadowColor: undefined,\n borderColor: undefined,\n borderDash: undefined,\n borderDashOffset: undefined,\n borderShadowColor: undefined,\n borderWidth: undefined,\n display: undefined,\n fill: undefined,\n length: undefined,\n shadowBlur: undefined,\n shadowOffsetX: undefined,\n shadowOffsetY: undefined,\n width: undefined\n};\n\nLineAnnotation.defaults = {\n adjustScaleRange: true,\n arrowHeads: {\n display: false,\n end: Object.assign({}, arrowHeadsDefaults),\n fill: false,\n length: 12,\n start: Object.assign({}, arrowHeadsDefaults),\n width: 6\n },\n borderDash: [],\n borderDashOffset: 0,\n borderShadowColor: 'transparent',\n borderWidth: 2,\n curve: false,\n controlPoint: {\n y: '-50%'\n },\n display: true,\n endValue: undefined,\n init: undefined,\n label: {\n backgroundColor: 'rgba(0,0,0,0.8)',\n backgroundShadowColor: 'transparent',\n borderCapStyle: 'butt',\n borderColor: 'black',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: 'miter',\n borderRadius: 6,\n borderShadowColor: 'transparent',\n borderWidth: 0,\n callout: Object.assign({}, LabelAnnotation.defaults.callout),\n color: '#fff',\n content: null,\n display: false,\n drawTime: undefined,\n font: {\n family: undefined,\n lineHeight: undefined,\n size: undefined,\n style: undefined,\n weight: 'bold'\n },\n height: undefined,\n opacity: undefined,\n padding: 6,\n position: 'center',\n rotation: 0,\n shadowBlur: 0,\n shadowOffsetX: 0,\n shadowOffsetY: 0,\n textAlign: 'center',\n textStrokeColor: undefined,\n textStrokeWidth: 0,\n width: undefined,\n xAdjust: 0,\n yAdjust: 0,\n z: undefined\n },\n scaleID: undefined,\n shadowBlur: 0,\n shadowOffsetX: 0,\n shadowOffsetY: 0,\n value: undefined,\n xMax: undefined,\n xMin: undefined,\n xScaleID: undefined,\n yMax: undefined,\n yMin: undefined,\n yScaleID: undefined,\n z: 0\n};\n\nLineAnnotation.descriptors = {\n arrowHeads: {\n start: {\n _fallback: true\n },\n end: {\n _fallback: true\n },\n _fallback: true\n }\n};\n\nLineAnnotation.defaultRoutes = {\n borderColor: 'color'\n};\n\nfunction inAxisRange(element, {mouseX, mouseY}, axis, {hBorderWidth, useFinalPosition}) {\n const limit = rangeLimit(mouseX, mouseY, element.getProps(['x', 'y', 'x2', 'y2'], useFinalPosition), axis);\n return (limit.value >= limit.start - hBorderWidth && limit.value <= limit.end + hBorderWidth) || isOnLabel(element, {mouseX, mouseY}, useFinalPosition, axis);\n}\n\nfunction isLineInArea({x, y, x2, y2}, {top, right, bottom, left}) {\n return !(\n (x < left && x2 < left) ||\n (x > right && x2 > right) ||\n (y < top && y2 < top) ||\n (y > bottom && y2 > bottom)\n );\n}\n\nfunction limitPointToArea({x, y}, p2, {top, right, bottom, left}) {\n if (x < left) {\n y = interpolateY(left, {x, y}, p2);\n x = left;\n }\n if (x > right) {\n y = interpolateY(right, {x, y}, p2);\n x = right;\n }\n if (y < top) {\n x = interpolateX(top, {x, y}, p2);\n y = top;\n }\n if (y > bottom) {\n x = interpolateX(bottom, {x, y}, p2);\n y = bottom;\n }\n return {x, y};\n}\n\nfunction limitLineToArea(p1, p2, area) {\n const {x, y} = limitPointToArea(p1, p2, area);\n const {x: x2, y: y2} = limitPointToArea(p2, p1, area);\n return {x, y, x2, y2, width: Math.abs(x2 - x), height: Math.abs(y2 - y)};\n}\n\nfunction intersects(element, {mouseX, mouseY}, epsilon = EPSILON, useFinalPosition) {\n // Adapted from https://stackoverflow.com/a/6853926/25507\n const {x: x1, y: y1, x2, y2} = element.getProps(['x', 'y', 'x2', 'y2'], useFinalPosition);\n const dx = x2 - x1;\n const dy = y2 - y1;\n const lenSq = sqr(dx) + sqr(dy);\n const t = lenSq === 0 ? -1 : ((mouseX - x1) * dx + (mouseY - y1) * dy) / lenSq;\n let xx, yy;\n if (t < 0) {\n xx = x1;\n yy = y1;\n } else if (t > 1) {\n xx = x2;\n yy = y2;\n } else {\n xx = x1 + t * dx;\n yy = y1 + t * dy;\n }\n return (sqr(mouseX - xx) + sqr(mouseY - yy)) <= epsilon;\n}\n\nfunction isOnLabel(element, {mouseX, mouseY}, useFinalPosition, axis) {\n const label = element.label;\n return label.options.display && label.inRange(mouseX, mouseY, axis, useFinalPosition);\n}\n\nfunction resolveLabelElementProperties(chart, properties, options) {\n const borderWidth = options.borderWidth;\n const padding = toPadding(options.padding);\n const textSize = measureLabelSize(chart.ctx, options);\n const width = textSize.width + padding.width + borderWidth;\n const height = textSize.height + padding.height + borderWidth;\n return calculateLabelPosition(properties, options, {width, height, padding}, chart.chartArea);\n}\n\nfunction calculateAutoRotation(properties) {\n const {x, y, x2, y2} = properties;\n const rotation = Math.atan2(y2 - y, x2 - x);\n // Flip the rotation if it goes > PI/2 or < -PI/2, so label stays upright\n return rotation > PI / 2 ? rotation - PI : rotation < PI / -2 ? rotation + PI : rotation;\n}\n\nfunction calculateLabelPosition(properties, label, sizes, chartArea) {\n const {width, height, padding} = sizes;\n const {xAdjust, yAdjust} = label;\n const p1 = {x: properties.x, y: properties.y};\n const p2 = {x: properties.x2, y: properties.y2};\n const rotation = label.rotation === 'auto' ? calculateAutoRotation(properties) : toRadians(label.rotation);\n const size = rotatedSize(width, height, rotation);\n const t = calculateT(properties, label, {labelSize: size, padding}, chartArea);\n const pt = properties.cp ? pointInCurve(p1, properties.cp, p2, t) : pointInLine(p1, p2, t);\n const xCoordinateSizes = {size: size.w, min: chartArea.left, max: chartArea.right, padding: padding.left};\n const yCoordinateSizes = {size: size.h, min: chartArea.top, max: chartArea.bottom, padding: padding.top};\n const centerX = adjustLabelCoordinate(pt.x, xCoordinateSizes) + xAdjust;\n const centerY = adjustLabelCoordinate(pt.y, yCoordinateSizes) + yAdjust;\n return {\n x: centerX - (width / 2),\n y: centerY - (height / 2),\n x2: centerX + (width / 2),\n y2: centerY + (height / 2),\n centerX,\n centerY,\n pointX: pt.x,\n pointY: pt.y,\n width,\n height,\n rotation: toDegrees(rotation)\n };\n}\n\nfunction rotatedSize(width, height, rotation) {\n const cos = Math.cos(rotation);\n const sin = Math.sin(rotation);\n return {\n w: Math.abs(width * cos) + Math.abs(height * sin),\n h: Math.abs(width * sin) + Math.abs(height * cos)\n };\n}\n\nfunction calculateT(properties, label, sizes, chartArea) {\n let t;\n const space = spaceAround(properties, chartArea);\n if (label.position === 'start') {\n t = calculateTAdjust({w: properties.x2 - properties.x, h: properties.y2 - properties.y}, sizes, label, space);\n } else if (label.position === 'end') {\n t = 1 - calculateTAdjust({w: properties.x - properties.x2, h: properties.y - properties.y2}, sizes, label, space);\n } else {\n t = getRelativePosition(1, label.position);\n }\n return t;\n}\n\nfunction calculateTAdjust(lineSize, sizes, label, space) {\n const {labelSize, padding} = sizes;\n const lineW = lineSize.w * space.dx;\n const lineH = lineSize.h * space.dy;\n const x = (lineW > 0) && ((labelSize.w / 2 + padding.left - space.x) / lineW);\n const y = (lineH > 0) && ((labelSize.h / 2 + padding.top - space.y) / lineH);\n return clamp(Math.max(x, y), 0, 0.25);\n}\n\nfunction spaceAround(properties, chartArea) {\n const {x, x2, y, y2} = properties;\n const t = Math.min(y, y2) - chartArea.top;\n const l = Math.min(x, x2) - chartArea.left;\n const b = chartArea.bottom - Math.max(y, y2);\n const r = chartArea.right - Math.max(x, x2);\n return {\n x: Math.min(l, r),\n y: Math.min(t, b),\n dx: l <= r ? 1 : -1,\n dy: t <= b ? 1 : -1\n };\n}\n\nfunction adjustLabelCoordinate(coordinate, labelSizes) {\n const {size, min, max, padding} = labelSizes;\n const halfSize = size / 2;\n if (size > max - min) {\n // if it does not fit, display as much as possible\n return (max + min) / 2;\n }\n if (min >= (coordinate - padding - halfSize)) {\n coordinate = min + padding + halfSize;\n }\n if (max <= (coordinate + padding + halfSize)) {\n coordinate = max - padding - halfSize;\n }\n return coordinate;\n}\n\nfunction getArrowHeads(line) {\n const options = line.options;\n const arrowStartOpts = options.arrowHeads && options.arrowHeads.start;\n const arrowEndOpts = options.arrowHeads && options.arrowHeads.end;\n return {\n startOpts: arrowStartOpts,\n endOpts: arrowEndOpts,\n startAdjust: getLineAdjust(line, arrowStartOpts),\n endAdjust: getLineAdjust(line, arrowEndOpts)\n };\n}\n\nfunction getLineAdjust(line, arrowOpts) {\n if (!arrowOpts || !arrowOpts.display) {\n return 0;\n }\n const {length, width} = arrowOpts;\n const adjust = line.options.borderWidth / 2;\n const p1 = {x: length, y: width + adjust};\n const p2 = {x: 0, y: adjust};\n return Math.abs(interpolateX(0, p1, p2));\n}\n\nfunction drawArrowHead(ctx, offset, adjust, arrowOpts) {\n if (!arrowOpts || !arrowOpts.display) {\n return;\n }\n const {length, width, fill, backgroundColor, borderColor} = arrowOpts;\n const arrowOffsetX = Math.abs(offset - length) + adjust;\n ctx.beginPath();\n setShadowStyle(ctx, arrowOpts);\n setBorderStyle(ctx, arrowOpts);\n ctx.moveTo(arrowOffsetX, -width);\n ctx.lineTo(offset + adjust, 0);\n ctx.lineTo(arrowOffsetX, width);\n if (fill === true) {\n ctx.fillStyle = backgroundColor || borderColor;\n ctx.closePath();\n ctx.fill();\n ctx.shadowColor = 'transparent';\n } else {\n ctx.shadowColor = arrowOpts.borderShadowColor;\n }\n ctx.stroke();\n}\n\nfunction getControlPoint(properties, options, distance) {\n const {x, y, x2, y2, centerX, centerY} = properties;\n const angle = Math.atan2(y2 - y, x2 - x);\n const cp = toPosition(options.controlPoint, 0);\n const point = {\n x: centerX + getSize(distance, cp.x, false),\n y: centerY + getSize(distance, cp.y, false)\n };\n return rotated(point, {x: centerX, y: centerY}, angle);\n}\n\nfunction drawArrowHeadOnCurve(ctx, {x, y}, {angle, adjust}, arrowOpts) {\n if (!arrowOpts || !arrowOpts.display) {\n return;\n }\n ctx.save();\n ctx.translate(x, y);\n ctx.rotate(angle);\n drawArrowHead(ctx, 0, -adjust, arrowOpts);\n ctx.restore();\n}\n\nfunction drawCurve(ctx, element, cp, length) {\n const {x, y, x2, y2, options} = element;\n const {startOpts, endOpts, startAdjust, endAdjust} = getArrowHeads(element);\n const p1 = {x, y};\n const p2 = {x: x2, y: y2};\n const startAngle = angleInCurve(p1, cp, p2, 0);\n const endAngle = angleInCurve(p1, cp, p2, 1) - PI;\n const ps = pointInCurve(p1, cp, p2, startAdjust / length);\n const pe = pointInCurve(p1, cp, p2, 1 - endAdjust / length);\n\n const path = new Path2D();\n ctx.beginPath();\n path.moveTo(ps.x, ps.y);\n path.quadraticCurveTo(cp.x, cp.y, pe.x, pe.y);\n ctx.shadowColor = options.borderShadowColor;\n ctx.stroke(path);\n element.path = path;\n element.ctx = ctx;\n drawArrowHeadOnCurve(ctx, ps, {angle: startAngle, adjust: startAdjust}, startOpts);\n drawArrowHeadOnCurve(ctx, pe, {angle: endAngle, adjust: endAdjust}, endOpts);\n}\n\nclass EllipseAnnotation extends Element {\n\n inRange(mouseX, mouseY, axis, useFinalPosition) {\n const rotation = this.options.rotation;\n const borderWidth = this.options.borderWidth;\n if (axis !== 'x' && axis !== 'y') {\n return pointInEllipse({x: mouseX, y: mouseY}, this.getProps(['width', 'height', 'centerX', 'centerY'], useFinalPosition), rotation, borderWidth);\n }\n const {x, y, x2, y2} = this.getProps(['x', 'y', 'x2', 'y2'], useFinalPosition);\n const hBorderWidth = borderWidth / 2;\n const limit = axis === 'y' ? {start: y, end: y2} : {start: x, end: x2};\n const rotatedPoint = rotated({x: mouseX, y: mouseY}, this.getCenterPoint(useFinalPosition), toRadians(-rotation));\n return rotatedPoint[axis] >= limit.start - hBorderWidth - EPSILON && rotatedPoint[axis] <= limit.end + hBorderWidth + EPSILON;\n }\n\n getCenterPoint(useFinalPosition) {\n return getElementCenterPoint(this, useFinalPosition);\n }\n\n draw(ctx) {\n const {width, height, centerX, centerY, options} = this;\n ctx.save();\n translate(ctx, this.getCenterPoint(), options.rotation);\n setShadowStyle(ctx, this.options);\n ctx.beginPath();\n ctx.fillStyle = options.backgroundColor;\n const stroke = setBorderStyle(ctx, options);\n ctx.ellipse(centerX, centerY, height / 2, width / 2, PI / 2, 0, 2 * PI);\n ctx.fill();\n if (stroke) {\n ctx.shadowColor = options.borderShadowColor;\n ctx.stroke();\n }\n ctx.restore();\n }\n\n get label() {\n return this.elements && this.elements[0];\n }\n\n resolveElementProperties(chart, options) {\n return resolveBoxAndLabelProperties(chart, options);\n }\n\n}\n\nEllipseAnnotation.id = 'ellipseAnnotation';\n\nEllipseAnnotation.defaults = {\n adjustScaleRange: true,\n backgroundShadowColor: 'transparent',\n borderDash: [],\n borderDashOffset: 0,\n borderShadowColor: 'transparent',\n borderWidth: 1,\n display: true,\n init: undefined,\n label: Object.assign({}, BoxAnnotation.defaults.label),\n rotation: 0,\n shadowBlur: 0,\n shadowOffsetX: 0,\n shadowOffsetY: 0,\n xMax: undefined,\n xMin: undefined,\n xScaleID: undefined,\n yMax: undefined,\n yMin: undefined,\n yScaleID: undefined,\n z: 0\n};\n\nEllipseAnnotation.defaultRoutes = {\n borderColor: 'color',\n backgroundColor: 'color'\n};\n\nEllipseAnnotation.descriptors = {\n label: {\n _fallback: true\n }\n};\n\nfunction pointInEllipse(p, ellipse, rotation, borderWidth) {\n const {width, height, centerX, centerY} = ellipse;\n const xRadius = width / 2;\n const yRadius = height / 2;\n\n if (xRadius <= 0 || yRadius <= 0) {\n return false;\n }\n // https://stackoverflow.com/questions/7946187/point-and-ellipse-rotated-position-test-algorithm\n const angle = toRadians(rotation || 0);\n const hBorderWidth = borderWidth / 2 || 0;\n const cosAngle = Math.cos(angle);\n const sinAngle = Math.sin(angle);\n const a = Math.pow(cosAngle * (p.x - centerX) + sinAngle * (p.y - centerY), 2);\n const b = Math.pow(sinAngle * (p.x - centerX) - cosAngle * (p.y - centerY), 2);\n return (a / Math.pow(xRadius + hBorderWidth, 2)) + (b / Math.pow(yRadius + hBorderWidth, 2)) <= 1.0001;\n}\n\nclass PointAnnotation extends Element {\n\n inRange(mouseX, mouseY, axis, useFinalPosition) {\n const {x, y, x2, y2, width} = this.getProps(['x', 'y', 'x2', 'y2', 'width'], useFinalPosition);\n const borderWidth = this.options.borderWidth;\n if (axis !== 'x' && axis !== 'y') {\n return inPointRange({x: mouseX, y: mouseY}, this.getCenterPoint(useFinalPosition), width / 2, borderWidth);\n }\n const hBorderWidth = borderWidth / 2;\n const limit = axis === 'y' ? {start: y, end: y2, value: mouseY} : {start: x, end: x2, value: mouseX};\n return limit.value >= limit.start - hBorderWidth && limit.value <= limit.end + hBorderWidth;\n }\n\n getCenterPoint(useFinalPosition) {\n return getElementCenterPoint(this, useFinalPosition);\n }\n\n draw(ctx) {\n const options = this.options;\n const borderWidth = options.borderWidth;\n if (options.radius < 0.1) {\n return;\n }\n ctx.save();\n ctx.fillStyle = options.backgroundColor;\n setShadowStyle(ctx, options);\n const stroke = setBorderStyle(ctx, options);\n drawPoint(ctx, this, this.centerX, this.centerY);\n if (stroke && !isImageOrCanvas(options.pointStyle)) {\n ctx.shadowColor = options.borderShadowColor;\n ctx.stroke();\n }\n ctx.restore();\n options.borderWidth = borderWidth;\n }\n\n resolveElementProperties(chart, options) {\n const properties = resolvePointProperties(chart, options);\n properties.initProperties = initAnimationProperties(chart, properties, options);\n return properties;\n }\n}\n\nPointAnnotation.id = 'pointAnnotation';\n\nPointAnnotation.defaults = {\n adjustScaleRange: true,\n backgroundShadowColor: 'transparent',\n borderDash: [],\n borderDashOffset: 0,\n borderShadowColor: 'transparent',\n borderWidth: 1,\n display: true,\n init: undefined,\n pointStyle: 'circle',\n radius: 10,\n rotation: 0,\n shadowBlur: 0,\n shadowOffsetX: 0,\n shadowOffsetY: 0,\n xAdjust: 0,\n xMax: undefined,\n xMin: undefined,\n xScaleID: undefined,\n xValue: undefined,\n yAdjust: 0,\n yMax: undefined,\n yMin: undefined,\n yScaleID: undefined,\n yValue: undefined,\n z: 0\n};\n\nPointAnnotation.defaultRoutes = {\n borderColor: 'color',\n backgroundColor: 'color'\n};\n\nclass PolygonAnnotation extends Element {\n\n inRange(mouseX, mouseY, axis, useFinalPosition) {\n if (axis !== 'x' && axis !== 'y') {\n return this.options.radius >= 0.1 && this.elements.length > 1 && pointIsInPolygon(this.elements, mouseX, mouseY, useFinalPosition);\n }\n const rotatedPoint = rotated({x: mouseX, y: mouseY}, this.getCenterPoint(useFinalPosition), toRadians(-this.options.rotation));\n const axisPoints = this.elements.map((point) => axis === 'y' ? point.bY : point.bX);\n const start = Math.min(...axisPoints);\n const end = Math.max(...axisPoints);\n return rotatedPoint[axis] >= start && rotatedPoint[axis] <= end;\n }\n\n getCenterPoint(useFinalPosition) {\n return getElementCenterPoint(this, useFinalPosition);\n }\n\n draw(ctx) {\n const {elements, options} = this;\n ctx.save();\n ctx.beginPath();\n ctx.fillStyle = options.backgroundColor;\n setShadowStyle(ctx, options);\n const stroke = setBorderStyle(ctx, options);\n let first = true;\n for (const el of elements) {\n if (first) {\n ctx.moveTo(el.x, el.y);\n first = false;\n } else {\n ctx.lineTo(el.x, el.y);\n }\n }\n ctx.closePath();\n ctx.fill();\n // If no border, don't draw it\n if (stroke) {\n ctx.shadowColor = options.borderShadowColor;\n ctx.stroke();\n }\n ctx.restore();\n }\n\n resolveElementProperties(chart, options) {\n const properties = resolvePointProperties(chart, options);\n const {sides, rotation} = options;\n const elements = [];\n const angle = (2 * PI) / sides;\n let rad = rotation * RAD_PER_DEG;\n for (let i = 0; i < sides; i++, rad += angle) {\n const elProps = buildPointElement(properties, options, rad);\n elProps.initProperties = initAnimationProperties(chart, properties, options);\n elements.push(elProps);\n }\n properties.elements = elements;\n return properties;\n }\n}\n\nPolygonAnnotation.id = 'polygonAnnotation';\n\nPolygonAnnotation.defaults = {\n adjustScaleRange: true,\n backgroundShadowColor: 'transparent',\n borderCapStyle: 'butt',\n borderDash: [],\n borderDashOffset: 0,\n borderJoinStyle: 'miter',\n borderShadowColor: 'transparent',\n borderWidth: 1,\n display: true,\n init: undefined,\n point: {\n radius: 0\n },\n radius: 10,\n rotation: 0,\n shadowBlur: 0,\n shadowOffsetX: 0,\n shadowOffsetY: 0,\n sides: 3,\n xAdjust: 0,\n xMax: undefined,\n xMin: undefined,\n xScaleID: undefined,\n xValue: undefined,\n yAdjust: 0,\n yMax: undefined,\n yMin: undefined,\n yScaleID: undefined,\n yValue: undefined,\n z: 0\n};\n\nPolygonAnnotation.defaultRoutes = {\n borderColor: 'color',\n backgroundColor: 'color'\n};\n\nfunction buildPointElement({centerX, centerY}, {radius, borderWidth}, rad) {\n const halfBorder = borderWidth / 2;\n const sin = Math.sin(rad);\n const cos = Math.cos(rad);\n const point = {x: centerX + sin * radius, y: centerY - cos * radius};\n return {\n type: 'point',\n optionScope: 'point',\n properties: {\n x: point.x,\n y: point.y,\n centerX: point.x,\n centerY: point.y,\n bX: centerX + sin * (radius + halfBorder),\n bY: centerY - cos * (radius + halfBorder)\n }\n };\n}\n\nfunction pointIsInPolygon(points, x, y, useFinalPosition) {\n let isInside = false;\n let A = points[points.length - 1].getProps(['bX', 'bY'], useFinalPosition);\n for (const point of points) {\n const B = point.getProps(['bX', 'bY'], useFinalPosition);\n if ((B.bY > y) !== (A.bY > y) && x < (A.bX - B.bX) * (y - B.bY) / (A.bY - B.bY) + B.bX) {\n isInside = !isInside;\n }\n A = B;\n }\n return isInside;\n}\n\nconst annotationTypes = {\n box: BoxAnnotation,\n ellipse: EllipseAnnotation,\n label: LabelAnnotation,\n line: LineAnnotation,\n point: PointAnnotation,\n polygon: PolygonAnnotation\n};\n\n/**\n * Register fallback for annotation elements\n * For example lineAnnotation options would be looked through:\n * - the annotation object (options.plugins.annotation.annotations[id])\n * - element options (options.elements.lineAnnotation)\n * - element defaults (defaults.elements.lineAnnotation)\n * - annotation plugin defaults (defaults.plugins.annotation, this is what we are registering here)\n */\nObject.keys(annotationTypes).forEach(key => {\n defaults.describe(`elements.${annotationTypes[key].id}`, {\n _fallback: 'plugins.annotation.common'\n });\n});\n\nconst directUpdater = {\n update: Object.assign\n};\n\nconst hooks$1 = eventHooks.concat(elementHooks);\nconst resolve = (value, optDefs) => isObject(optDefs) ? resolveObj(value, optDefs) : value;\n\n\n/**\n * @typedef { import(\"chart.js\").Chart } Chart\n * @typedef { import(\"chart.js\").UpdateMode } UpdateMode\n * @typedef { import('../../types/options').AnnotationPluginOptions } AnnotationPluginOptions\n */\n\n/**\n * @param {string} prop\n * @returns {boolean}\n */\nconst isIndexable = (prop) => prop === 'color' || prop === 'font';\n\n/**\n * Resolve the annotation type, checking if is supported.\n * @param {string} [type=line] - annotation type\n * @returns {string} resolved annotation type\n */\nfunction resolveType(type = 'line') {\n if (annotationTypes[type]) {\n return type;\n }\n console.warn(`Unknown annotation type: '${type}', defaulting to 'line'`);\n return 'line';\n}\n\n/**\n * @param {Chart} chart\n * @param {Object} state\n * @param {AnnotationPluginOptions} options\n * @param {UpdateMode} mode\n */\nfunction updateElements(chart, state, options, mode) {\n const animations = resolveAnimations(chart, options.animations, mode);\n\n const annotations = state.annotations;\n const elements = resyncElements(state.elements, annotations);\n\n for (let i = 0; i < annotations.length; i++) {\n const annotationOptions = annotations[i];\n const element = getOrCreateElement(elements, i, annotationOptions.type);\n const resolver = annotationOptions.setContext(getContext(chart, element, annotationOptions));\n const properties = element.resolveElementProperties(chart, resolver);\n\n properties.skip = toSkip(properties);\n\n if ('elements' in properties) {\n updateSubElements(element, properties.elements, resolver, animations);\n // Remove the sub-element definitions from properties, so the actual elements\n // are not overwritten by their definitions\n delete properties.elements;\n }\n\n if (!defined(element.x)) {\n // If the element is newly created, assing the properties directly - to\n // make them readily awailable to any scriptable options. If we do not do this,\n // the properties retruned by `resolveElementProperties` are available only\n // after options resolution.\n Object.assign(element, properties);\n }\n\n Object.assign(element, properties.initProperties);\n properties.options = resolveAnnotationOptions(resolver);\n\n animations.update(element, properties);\n }\n}\n\nfunction toSkip(properties) {\n return isNaN(properties.x) || isNaN(properties.y);\n}\n\nfunction resolveAnimations(chart, animOpts, mode) {\n if (mode === 'reset' || mode === 'none' || mode === 'resize') {\n return directUpdater;\n }\n return new Animations(chart, animOpts);\n}\n\nfunction updateSubElements(mainElement, elements, resolver, animations) {\n const subElements = mainElement.elements || (mainElement.elements = []);\n subElements.length = elements.length;\n for (let i = 0; i < elements.length; i++) {\n const definition = elements[i];\n const properties = definition.properties;\n const subElement = getOrCreateElement(subElements, i, definition.type, definition.initProperties);\n const subResolver = resolver[definition.optionScope].override(definition);\n properties.options = resolveAnnotationOptions(subResolver);\n animations.update(subElement, properties);\n }\n}\n\nfunction getOrCreateElement(elements, index, type, initProperties) {\n const elementClass = annotationTypes[resolveType(type)];\n let element = elements[index];\n if (!element || !(element instanceof elementClass)) {\n element = elements[index] = new elementClass();\n Object.assign(element, initProperties);\n }\n return element;\n}\n\nfunction resolveAnnotationOptions(resolver) {\n const elementClass = annotationTypes[resolveType(resolver.type)];\n const result = {};\n result.id = resolver.id;\n result.type = resolver.type;\n result.drawTime = resolver.drawTime;\n Object.assign(result,\n resolveObj(resolver, elementClass.defaults),\n resolveObj(resolver, elementClass.defaultRoutes));\n for (const hook of hooks$1) {\n result[hook] = resolver[hook];\n }\n return result;\n}\n\nfunction resolveObj(resolver, defs) {\n const result = {};\n for (const prop of Object.keys(defs)) {\n const optDefs = defs[prop];\n const value = resolver[prop];\n if (isIndexable(prop) && isArray(value)) {\n result[prop] = value.map((item) => resolve(item, optDefs));\n } else {\n result[prop] = resolve(value, optDefs);\n }\n }\n return result;\n}\n\nfunction getContext(chart, element, annotation) {\n return element.$context || (element.$context = Object.assign(Object.create(chart.getContext()), {\n element,\n id: annotation.id,\n type: 'annotation'\n }));\n}\n\nfunction resyncElements(elements, annotations) {\n const count = annotations.length;\n const start = elements.length;\n\n if (start < count) {\n const add = count - start;\n elements.splice(start, 0, ...new Array(add));\n } else if (start > count) {\n elements.splice(count, start - count);\n }\n return elements;\n}\n\nvar version = \"3.0.1\";\n\nconst chartStates = new Map();\nconst hooks = eventHooks.concat(elementHooks);\n\nvar annotation = {\n id: 'annotation',\n\n version,\n\n beforeRegister() {\n requireVersion('chart.js', '4.0', Chart.version);\n },\n\n afterRegister() {\n Chart.register(annotationTypes);\n },\n\n afterUnregister() {\n Chart.unregister(annotationTypes);\n },\n\n beforeInit(chart) {\n chartStates.set(chart, {\n annotations: [],\n elements: [],\n visibleElements: [],\n listeners: {},\n listened: false,\n moveListened: false,\n hooks: {},\n hooked: false,\n hovered: []\n });\n },\n\n beforeUpdate(chart, args, options) {\n const state = chartStates.get(chart);\n const annotations = state.annotations = [];\n\n let annotationOptions = options.annotations;\n if (isObject(annotationOptions)) {\n Object.keys(annotationOptions).forEach(key => {\n const value = annotationOptions[key];\n if (isObject(value)) {\n value.id = key;\n annotations.push(value);\n }\n });\n } else if (isArray(annotationOptions)) {\n annotations.push(...annotationOptions);\n }\n verifyScaleOptions(annotations, chart.scales);\n },\n\n afterDataLimits(chart, args) {\n const state = chartStates.get(chart);\n adjustScaleRange(chart, args.scale, state.annotations.filter(a => a.display && a.adjustScaleRange));\n },\n\n afterUpdate(chart, args, options) {\n const state = chartStates.get(chart);\n updateListeners(chart, state, options);\n updateElements(chart, state, options, args.mode);\n state.visibleElements = state.elements.filter(el => !el.skip && el.options.display);\n updateHooks(chart, state, options);\n },\n\n beforeDatasetsDraw(chart, _args, options) {\n draw(chart, 'beforeDatasetsDraw', options.clip);\n },\n\n afterDatasetsDraw(chart, _args, options) {\n draw(chart, 'afterDatasetsDraw', options.clip);\n },\n\n beforeDraw(chart, _args, options) {\n draw(chart, 'beforeDraw', options.clip);\n },\n\n afterDraw(chart, _args, options) {\n draw(chart, 'afterDraw', options.clip);\n },\n\n beforeEvent(chart, args, options) {\n const state = chartStates.get(chart);\n if (handleEvent(state, args.event, options)) {\n args.changed = true;\n }\n },\n\n afterDestroy(chart) {\n chartStates.delete(chart);\n },\n\n _getState(chart) {\n return chartStates.get(chart);\n },\n\n defaults: {\n animations: {\n numbers: {\n properties: ['x', 'y', 'x2', 'y2', 'width', 'height', 'centerX', 'centerY', 'pointX', 'pointY', 'radius'],\n type: 'number'\n },\n },\n clip: true,\n interaction: {\n mode: undefined,\n axis: undefined,\n intersect: undefined\n },\n common: {\n drawTime: 'afterDatasetsDraw',\n init: false,\n label: {\n }\n }\n },\n\n descriptors: {\n _indexable: false,\n _scriptable: (prop) => !hooks.includes(prop) && prop !== 'init',\n annotations: {\n _allKeys: false,\n _fallback: (prop, opts) => `elements.${annotationTypes[resolveType(opts.type)].id}`\n },\n interaction: {\n _fallback: true\n },\n common: {\n label: {\n _indexable: isIndexable,\n _fallback: true\n },\n _indexable: isIndexable\n }\n },\n\n additionalOptionScopes: ['']\n};\n\nfunction draw(chart, caller, clip) {\n const {ctx, chartArea} = chart;\n const state = chartStates.get(chart);\n\n if (clip) {\n clipArea(ctx, chartArea);\n }\n\n const drawableElements = getDrawableElements(state.visibleElements, caller).sort((a, b) => a.element.options.z - b.element.options.z);\n for (const item of drawableElements) {\n drawElement(ctx, chartArea, state, item);\n }\n\n if (clip) {\n unclipArea(ctx);\n }\n}\n\nfunction getDrawableElements(elements, caller) {\n const drawableElements = [];\n for (const el of elements) {\n if (el.options.drawTime === caller) {\n drawableElements.push({element: el, main: true});\n }\n if (el.elements && el.elements.length) {\n for (const sub of el.elements) {\n if (sub.options.display && sub.options.drawTime === caller) {\n drawableElements.push({element: sub});\n }\n }\n }\n }\n return drawableElements;\n}\n\nfunction drawElement(ctx, chartArea, state, item) {\n const el = item.element;\n if (item.main) {\n invokeHook(state, el, 'beforeDraw');\n el.draw(ctx, chartArea);\n invokeHook(state, el, 'afterDraw');\n } else {\n el.draw(ctx, chartArea);\n }\n}\n\nexport { annotation as default };\n","import objectWithoutPropertiesLoose from \"./objectWithoutPropertiesLoose.js\";\nexport default function _objectWithoutProperties(source, excluded) {\n if (source == null) return {};\n var target = objectWithoutPropertiesLoose(source, excluded);\n var key, i;\n if (Object.getOwnPropertySymbols) {\n var sourceSymbolKeys = Object.getOwnPropertySymbols(source);\n for (i = 0; i < sourceSymbolKeys.length; i++) {\n key = sourceSymbolKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue;\n target[key] = source[key];\n }\n }\n return target;\n}","export default function _objectWithoutPropertiesLoose(source, excluded) {\n if (source == null) return {};\n var target = {};\n var sourceKeys = Object.keys(source);\n var key, i;\n for (i = 0; i < sourceKeys.length; i++) {\n key = sourceKeys[i];\n if (excluded.indexOf(key) >= 0) continue;\n target[key] = source[key];\n }\n return target;\n}","import type { MouseEvent } from 'react';\nimport type {\n ChartType,\n ChartData,\n DefaultDataPoint,\n ChartDataset,\n ChartOptions,\n Chart,\n} from 'chart.js';\n\nimport type { ForwardedRef } from './types.js';\n\nconst defaultDatasetIdKey = 'label';\n\nexport function reforwardRef(ref: ForwardedRef, value: T) {\n if (typeof ref === 'function') {\n ref(value);\n } else if (ref) {\n ref.current = value;\n }\n}\n\nexport function setOptions<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(chart: Chart, nextOptions: ChartOptions) {\n const options = chart.options;\n\n if (options && nextOptions) {\n Object.assign(options, nextOptions);\n }\n}\n\nexport function setLabels<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(\n currentData: ChartData,\n nextLabels: TLabel[] | undefined\n) {\n currentData.labels = nextLabels;\n}\n\nexport function setDatasets<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(\n currentData: ChartData,\n nextDatasets: ChartDataset[],\n datasetIdKey = defaultDatasetIdKey\n) {\n const addedDatasets: ChartDataset[] = [];\n\n currentData.datasets = nextDatasets.map(\n (nextDataset: Record) => {\n // given the new set, find it's current match\n const currentDataset = currentData.datasets.find(\n (dataset: Record) =>\n dataset[datasetIdKey] === nextDataset[datasetIdKey]\n );\n\n // There is no original to update, so simply add new one\n if (\n !currentDataset ||\n !nextDataset.data ||\n addedDatasets.includes(currentDataset)\n ) {\n return { ...nextDataset } as ChartDataset;\n }\n\n addedDatasets.push(currentDataset);\n\n Object.assign(currentDataset, nextDataset);\n\n return currentDataset;\n }\n );\n}\n\nexport function cloneData<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(data: ChartData, datasetIdKey = defaultDatasetIdKey) {\n const nextData: ChartData = {\n labels: [],\n datasets: [],\n };\n\n setLabels(nextData, data.labels);\n setDatasets(nextData, data.datasets, datasetIdKey);\n\n return nextData;\n}\n\n/**\n * Get dataset from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */\nexport function getDatasetAtEvent(\n chart: Chart,\n event: MouseEvent\n) {\n return chart.getElementsAtEventForMode(\n event.nativeEvent,\n 'dataset',\n { intersect: true },\n false\n );\n}\n\n/**\n * Get single dataset element from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */\nexport function getElementAtEvent(\n chart: Chart,\n event: MouseEvent\n) {\n return chart.getElementsAtEventForMode(\n event.nativeEvent,\n 'nearest',\n { intersect: true },\n false\n );\n}\n\n/**\n * Get all dataset elements from mouse click event\n * @param chart - Chart.js instance\n * @param event - Mouse click event\n * @returns Dataset\n */\nexport function getElementsAtEvent(\n chart: Chart,\n event: MouseEvent\n) {\n return chart.getElementsAtEventForMode(\n event.nativeEvent,\n 'index',\n { intersect: true },\n false\n );\n}\n","import React, { useEffect, useRef, forwardRef } from 'react';\nimport { Chart as ChartJS } from 'chart.js';\nimport type { ChartType, DefaultDataPoint } from 'chart.js';\n\nimport type { ForwardedRef, ChartProps, BaseChartComponent } from './types.js';\nimport {\n reforwardRef,\n cloneData,\n setOptions,\n setLabels,\n setDatasets,\n} from './utils.js';\n\nfunction ChartComponent<\n TType extends ChartType = ChartType,\n TData = DefaultDataPoint,\n TLabel = unknown\n>(\n props: ChartProps,\n ref: ForwardedRef>\n) {\n const {\n height = 150,\n width = 300,\n redraw = false,\n datasetIdKey,\n type,\n data,\n options,\n plugins = [],\n fallbackContent,\n updateMode,\n ...canvasProps\n } = props as ChartProps;\n const canvasRef = useRef(null);\n const chartRef = useRef();\n\n const renderChart = () => {\n if (!canvasRef.current) return;\n\n chartRef.current = new ChartJS(canvasRef.current, {\n type,\n data: cloneData(data, datasetIdKey),\n options: options && { ...options },\n plugins,\n });\n\n reforwardRef(ref, chartRef.current);\n };\n\n const destroyChart = () => {\n reforwardRef(ref, null);\n\n if (chartRef.current) {\n chartRef.current.destroy();\n chartRef.current = null;\n }\n };\n\n useEffect(() => {\n if (!redraw && chartRef.current && options) {\n setOptions(chartRef.current, options);\n }\n }, [redraw, options]);\n\n useEffect(() => {\n if (!redraw && chartRef.current) {\n setLabels(chartRef.current.config.data, data.labels);\n }\n }, [redraw, data.labels]);\n\n useEffect(() => {\n if (!redraw && chartRef.current && data.datasets) {\n setDatasets(chartRef.current.config.data, data.datasets, datasetIdKey);\n }\n }, [redraw, data.datasets]);\n\n useEffect(() => {\n if (!chartRef.current) return;\n\n if (redraw) {\n destroyChart();\n setTimeout(renderChart);\n } else {\n chartRef.current.update(updateMode);\n }\n }, [redraw, options, data.labels, data.datasets, updateMode]);\n\n useEffect(() => {\n if (!chartRef.current) return;\n\n destroyChart();\n setTimeout(renderChart);\n }, [type]);\n\n useEffect(() => {\n renderChart();\n\n return () => destroyChart();\n }, []);\n\n return (\n \n {fallbackContent}\n \n );\n}\n\nexport const Chart = forwardRef(ChartComponent) as BaseChartComponent;\n","import React, { forwardRef } from 'react';\nimport {\n Chart as ChartJS,\n LineController,\n BarController,\n RadarController,\n DoughnutController,\n PolarAreaController,\n BubbleController,\n PieController,\n ScatterController,\n} from 'chart.js';\nimport type { ChartType, ChartComponentLike } from 'chart.js';\n\nimport type {\n ChartProps,\n ChartJSOrUndefined,\n TypedChartComponent,\n} from './types.js';\nimport { Chart } from './chart.js';\n\nfunction createTypedChart(\n type: T,\n registerables: ChartComponentLike\n) {\n ChartJS.register(registerables);\n\n return forwardRef, Omit, 'type'>>(\n (props, ref) => \n ) as TypedChartComponent;\n}\n\nexport const Line = /* #__PURE__ */ createTypedChart('line', LineController);\n\nexport const Bar = /* #__PURE__ */ createTypedChart('bar', BarController);\n\nexport const Radar = /* #__PURE__ */ createTypedChart('radar', RadarController);\n\nexport const Doughnut = /* #__PURE__ */ createTypedChart(\n 'doughnut',\n DoughnutController\n);\n\nexport const PolarArea = /* #__PURE__ */ createTypedChart(\n 'polarArea',\n PolarAreaController\n);\n\nexport const Bubble = /* #__PURE__ */ createTypedChart(\n 'bubble',\n BubbleController\n);\n\nexport const Pie = /* #__PURE__ */ createTypedChart('pie', PieController);\n\nexport const Scatter = /* #__PURE__ */ createTypedChart(\n 'scatter',\n ScatterController\n);\n"],"names":["reservedModifierKeywords","mappedKeys","esc","return","ShiftLeft","ShiftRight","AltLeft","AltRight","MetaLeft","MetaRight","OSLeft","OSRight","ControlLeft","ControlRight","mapKey","key","trim","toLowerCase","replace","parseKeysHookInput","keys","splitKey","split","parseHotkey","hotkey","combinationKey","description","toLocaleLowerCase","map","k","_extends","alt","includes","ctrl","shift","meta","mod","filter","document","addEventListener","e","undefined","pushToCurrentlyPressedKeys","code","removeFromCurrentlyPressedKeys","window","currentlyPressedKeys","clear","Set","isReadonlyArray","value","Array","isArray","hotkeyArray","has","forEach","isHotkeyModifier","add","isHotkeyEnabledOnTag","_ref","enabledOnTags","target","targetTagName","tagName","Boolean","some","tag","isHotkeyMatchingKeyboardEvent","ignoreModifiers","pressedKeyUppercase","ctrlKey","metaKey","shiftKey","altKey","keyCode","pressedKey","length","every","BoundHotkeysProxyProvider","createContext","useBoundHotkeysProxy","useContext","deepEqual","x","y","Object","reduce","isEqual","HotkeysContext","hotkeys","enabledScopes","toggleScope","enableScope","disableScope","useHotkeysContext","stopPropagation","preventDefault","stopImmediatePropagation","useSafeLayoutEffect","useLayoutEffect","useEffect","useHotkeys","callback","options","dependencies","ref","useRef","hasTriggeredRef","_options","_keys","join","_deps","memoisedCB","useCallback","cbRef","current","memoisedOptions","useDeepEqualMemo","proxy","enabled","activeScopes","scopes","console","warn","scope","listener","isKeyUp","enableOnFormTags","ignoreEventWhen","activeElement","contains","_e$target","isContentEditable","enableOnContentEditable","_hotkey$keys","maybePreventDefault","isHotkeyEnabled","handleKeyDown","event","keydown","keyup","handleKeyUp","domNode","addHotkey","removeEventListener","removeHotkey","_defineProperty","obj","defineProperty","enumerable","configurable","writable","ownKeys","object","enumerableOnly","getOwnPropertySymbols","symbols","sym","getOwnPropertyDescriptor","push","apply","_objectSpread2","i","arguments","source","getOwnPropertyDescriptors","defineProperties","_get","Reflect","get","bind","property","receiver","base","prototype","hasOwnProperty","call","getPrototypeOf","desc","this","Animator","_classCallCheck","_request","_charts","Map","_running","_lastDate","_createClass","chart","anims","date","type","callbacks","listeners","numSteps","duration","fn","initial","currentStep","Math","min","start","_this","requestAnimFrame","_update","_refresh","_this2","Date","now","remaining","running","items","item","draw","_active","_total","tick","pop","_notify","charts","complete","progress","set","cb","_getAnims","_this$_getAnims$items","_toConsumableArray","acc","cur","max","_duration","cancel","delete","animator","transparent","interpolators","boolean","from","to","factor","color","c0","c1","valid","mix","hexString","number","Animation","cfg","prop","currentValue","resolve","_fn","_easing","effects","easing","_start","floor","delay","_loop","loop","_target","_prop","_from","_to","_promises","elapsed","remain","promises","Promise","res","rej","resolved","method","Animations","config","_chart","_properties","configure","isObject","animationOptions","defaults","animatedProps","getOwnPropertyNames","_i","_animationOptions","option","properties","values","newOptions","$shared","assign","$animations","resolveTargetOptions","animations","_createAnimations","anim","active","wait","all","awaitAll","then","props","charAt","animation","update","_animateOptions","size","scaleClip","scale","allowedOverflow","opts","reverse","end","getSortedDatasetIndices","filterVisible","ilen","metasets","_getSortedDatasetMetas","index","applyStack","stack","dsIndex","datasetIndex","otherValue","singleMode","mode","isNumberFinite","sign","isStacked","stacked","getOrCreateStack","stacks","stackKey","indexValue","subStack","getLastIndexInStack","vScale","positive","_step","_iterator","_createForOfIteratorHelper","getMatchingVisibleMetas","s","n","done","err","f","updateStacks","controller","parsed","_cachedMeta","_stacks","iScale","iAxis","axis","vAxis","indexScale","valueScale","concat","id","getStackKey","_top","_bottom","_visualValues","getFirstScaleId","scales","clearStacks","_parsed","_step2","_iterator2","isDirectUpdateMode","cloneIfNotShared","cached","shared","DatasetController","_ctx","ctx","_cachedDataOpts","getMeta","_type","_parsing","_data","_objectData","_sharedOptions","_drawStart","_drawCount","enableOptionSharing","supportsDecimation","$context","_syncList","datasetElementType","constructor","dataElementType","initialize","linkScales","_stacked","addElements","fill","isPluginEnabled","dataset","getDataset","chooseId","r","xid","xAxisID","valueOrDefault","yid","yAxisID","rid","rAxisID","indexAxis","iid","iAxisID","vid","vAxisID","xScale","getScaleForId","yScale","rScale","data","datasets","getDatasetMeta","scaleID","unlistenArrayEvents","adata","convertObjectDataToArray","isExtensible","listenArrayEvents","_dataCheck","resetNewElements","stackChanged","oldStacked","_resyncElements","scopeKeys","datasetScopeKeys","getOptionScopes","createResolver","getContext","parsing","count","sorted","_sorted","prev","parseArrayData","parseObjectData","parsePrimitiveData","labels","getLabels","singleScale","_parsed$i","parse","_this$_parsing","_this$_parsing$xAxisK","xAxisKey","_this$_parsing$yAxisK","yAxisKey","resolveObjectKey","range","parsedValue","NaN","canStack","otherScale","_getOtherScale","hidden","createStack","Number","POSITIVE_INFINITY","NEGATIVE_INFINITY","_getUserBounds","_scale$getUserBounds","getUserBounds","minDefined","maxDefined","otherMin","otherMax","_skip","updateRangeFromParsed","getParsed","label","getLabelForValue","_clip","t","b","l","top","right","bottom","left","disabled","toClip","clip","defaultClip","getMaxOverflow","elements","area","chartArea","drawActiveElementsOnTop","element","resolveDatasetElementOptions","resolveDataElementOptions","context","parent","dataIndex","raw","createDataContext","createDatasetContext","_resolveElementOptions","elementType","_this3","cache","cacheKey","sharing","defined","datasetElementScopeKeys","prefixes","names","resolveNamedOptions","freeze","transition","datasetAnimationScopeKeys","_cacheable","sharedOptions","_animationsDisabled","firstOpts","previouslySharedOptions","getSharedOptions","includeOptions","updateSharedOptions","_resolveAnimations","getStyle","_setStyle","_step3","_iterator3","_step3$value","_slicedToArray","arg1","arg2","numMeta","numData","_insertElements","_removeElements","move","arr","updateElements","removed","splice","args","_args2","_dataChanges","_sync","newCount","computeMinSampleSize","curr","_cache","$bar","visibleMetas","getAllParsedValues","_arrayUnique","sort","a","getAllScaleValues","_length","updateMinAndPrev","abs","getPixelForValue","ticks","getPixelForTick","parseValue","entry","startValue","endValue","barStart","barEnd","_custom","parseFloatBar","parseArrayOrPrimitive","isFloatBar","custom","setBorderSkipped","edge","borderSkipped","_borderProps","horizontal","borderProps","enableBorderRadius","parseEdge","orig","v1","v2","startEnd","v","setInflateAmount","ratio","inflateAmount","BarController","_DatasetController","_inherits","_super","_createSuper","_this$_parsing2","_this$_parsing2$xAxis","_this$_parsing2$yAxis","iAxisKey","vAxisKey","_getPrototypeOf","bars","reset","getBasePixel","isHorizontal","ruler","_getRuler","_this$_getSharedOptio","_getSharedOptions","vpixels","isNullOrUndef","head","_calculateBarValuePixels","ipixels","_calculateBarIndexPixels","center","height","width","updateElement","last","_step4","grouped","skipNull","val","isNaN","_iterator4","indexOf","_getStacks","name","pixels","barThickness","_startPixel","_endPixel","stackCount","_getStackCount","categoryPercentage","barPercentage","_this$_cachedMeta","_this$options","baseValue","minBarLength","actualBase","floating","getDataVisibility","barSign","startPixel","getPixelForDecimal","endPixel","getValueForPixel","halfGrid","getLineWidthForValue","maxBarThickness","Infinity","next","percent","chunk","computeFlexCategoryTraits","thickness","computeFitCategoryTraits","stackIndex","_getStackIndex","rects","numbers","_index_","offset","grid","_value_","beginAtZero","BubbleController","_DatasetController2","_super2","radius","points","_this$_cachedMeta2","_this$_getSharedOptio2","point","iPixel","vPixel","skip","DoughnutController","_DatasetController3","_super3","_this4","innerRadius","outerRadius","offsetX","offsetY","getter","_this$_parsing$key","toRadians","rotation","circumference","TAU","isDatasetVisible","_getRotation","_getCircumference","arcs","spacing","getMaxBorderWidth","getMaxOffset","maxSize","cutout","toPercentage","chartWeight","_getRingWeight","_this$_getRotationExt","_getRotationExtents","_getRatioAndOffset","ratioX","ratioY","startAngle","endAngle","startX","cos","startY","sin","endX","endY","calcMax","angle","_angleBetween","calcMin","maxX","maxY","HALF_PI","minX","PI","minY","getRatioAndOffset","maxWidth","maxHeight","maxRadius","toDimension","radiusLength","_getVisibleDatasetWeightTotal","total","calculateTotal","_getRingWeightOffset","animateRotate","calculateCircumference","animationOpts","centerX","centerY","animateScale","_this$_getSharedOptio3","_circumference","arc","metaData","formatNumber","locale","borderAlign","borderWidth","hoverBorderWidth","hoverOffset","ringWeightOffset","weight","_scriptable","_indexable","startsWith","aspectRatio","plugins","legend","generateLabels","_chart$legend$options2","pointStyle","style","text","fillStyle","backgroundColor","strokeStyle","borderColor","fontColor","lineWidth","onClick","legendItem","toggleDataVisibility","LineController","_DatasetController4","_super4","line","_meta$data","_dataset","animationsDisabled","_getStartAndCountOfVi","_getStartAndCountOfVisiblePoints","_scaleRangesChanged","_datasetIndex","_decimated","showLine","segment","animated","_this$_cachedMeta3","_this$_getSharedOptio4","_this$options2","spanGaps","maxGapLength","isNumber","directUpdate","pointsCount","prevParsed","nullData","stop","border","firstPoint","lastPoint","updateControlPoints","PolarAreaController","_DatasetController5","_super5","_this5","_parseObjectDataRadialScale","_updateRadius","_this6","minSize","cutoutPercentage","getVisibleDatasetCount","xCenter","yCenter","datasetStartAngle","getIndexAngle","defaultAngle","countVisibleElements","_computeAngle","getDistanceFromCenterForValue","_this7","_chart$legend$options3","angleLines","display","circular","pointLabels","PieController","_DoughnutController","_super6","RadarController","_DatasetController6","_super7","_fullLoop","pointPosition","getPointPositionForValue","ScatterController","_DatasetController7","_super8","_meta$data2","_getStartAndCountOfVi2","registry","getElement","_this$_cachedMeta4","_this$options3","interaction","abstract","Error","adapters","_date","DateAdapterBase","members","binarySearch","metaset","intersect","lookupMethod","_reversePixels","_rlookupByKey","_lookupByKey","el","getRange","lo","hi","evaluateInteractionItems","position","handler","getSortedVisibleDatasetMetas","_metasets$i","_binarySearch","j","getIntersectItems","useFinalPosition","includeInvisible","isPointInArea","_isPointInArea","inRange","getNearestCartesianItems","distanceMetric","useX","useY","pt1","pt2","deltaX","deltaY","sqrt","pow","getDistanceMetricForAxis","minDistance","getCenterPoint","distance","getNearestItems","_element$getProps","getProps","getAngleFromPoint","getNearestRadialItems","getAxisItems","rangeMethod","intersectsItem","Interaction","modes","getRelativePosition","nearest","STATIC_POSITIONS","filterByPosition","array","pos","filterDynamicPositionByAxis","box","sortByWeight","v0","setLayoutDims","layouts","params","layout","_step5","_iterator5","wrap","stackWeight","_stack","placed","buildStacks","vBoxMaxWidth","hBoxMaxHeight","fullSize","availableWidth","availableHeight","getCombinedMax","maxPadding","updateMaxPadding","boxPadding","updateDims","getPadding","newWidth","outerWidth","newHeight","outerHeight","widthChanged","w","heightChanged","h","same","other","getMargins","marginForPositions","positions","margin","fitBoxes","boxes","refit","changed","refitBoxes","_updateDims","setBoxDims","placeBoxes","_step6","userPadding","padding","_iterator6","addBox","_layers","z","removeBox","layoutItem","minPadding","toPadding","layoutBoxes","_box","_box$options","_box$options$stackWei","wrapBoxes","centerHorizontal","centerVertical","leftAndTop","rightAndBottom","vertical","buildLayoutBoxes","verticalBoxes","horizontalBoxes","each","beforeLayout","visibleVerticalBoxCount","updatePos","change","handleMaxPadding","BasePlatform","canvas","BasicPlatform","_BasePlatform","_super9","EXPANDO_KEY","EVENT_TYPES","touchstart","touchmove","touchend","pointerenter","pointerdown","pointermove","pointerup","pointerleave","pointerout","isNullOrEmpty","eventListenerOptions","supportsEventListenerOptions","passive","removeListener","nodeListContains","nodeList","_step7","_iterator7","node","createAttachObserver","observer","MutationObserver","entries","_step8","trigger","_iterator8","addedNodes","removedNodes","observe","childList","subtree","createDetachObserver","_step9","_iterator9","drpListeningCharts","oldDevicePixelRatio","onWindowResize","dpr","devicePixelRatio","resize","currentDevicePixelRatio","createResizeObserver","container","_getParentNode","throttled","clientWidth","ResizeObserver","contentRect","listenDevicePixelRatioChanges","releaseObserver","disconnect","unlistenDevicePixelRatioChanges","createProxyAndListen","_getRelativePosition","native","fromNativeEvent","addListener","DomPlatform","_BasePlatform2","_super10","renderHeight","getAttribute","renderWidth","boxSizing","displayWidth","readUsedSize","displayHeight","initCanvas","removeAttribute","setAttribute","proxies","$proxies","attach","detach","getMaximumSize","isConnected","Element","_this$getProps","final","_this8","ret","autoSkip","tickOpts","determinedMaxTicks","tickLength","_tickSize","maxScale","maxChart","_maxLength","determineMaxTicks","ticksLimit","maxTicksLimit","majorIndices","major","result","getMajorIndices","numMajorIndices","first","newTicks","ceil","skipMajors","evenMajorSpacing","diff","len","getEvenSpacing","factors","_factorize","calculateSpacing","avgMajorSpacing","round","majorStart","majorEnd","offsetFromEdge","getTicksLimit","ticksLength","sample","numItems","increment","getPixelForGridLine","offsetGridLines","validIndex","epsilon","lineValue","getTickMarkLength","drawTicks","getTitleHeight","fallback","font","toFont","lineHeight","titleAlign","align","_toLeftRightCenter","reverseAlign","Scale","_Element","_super11","_this9","_margins","paddingTop","paddingBottom","paddingLeft","paddingRight","labelRotation","_range","_gridLineItems","_labelItems","_labelSizes","_longestTextCache","_userMax","_userMin","_suggestedMax","_suggestedMin","_ticksLength","_borderValue","_dataLimitsCached","setContext","suggestedMin","suggestedMax","finiteOrDefault","_this$getUserBounds","metas","getMinMax","xLabels","yLabels","_computeLabelItems","beforeUpdate","margins","_this$options4","grace","sampleSize","beforeSetDimensions","setDimensions","afterSetDimensions","beforeDataLimits","determineDataLimits","afterDataLimits","_addGrace","beforeBuildTicks","buildTicks","afterBuildTicks","samplingEnabled","_convertTicksToLabels","beforeCalculateLabelRotation","calculateLabelRotation","afterCalculateLabelRotation","afterAutoSkip","beforeFit","fit","afterFit","afterUpdate","reversePixels","_alignToPixels","alignToPixels","notifyPlugins","_callHooks","beforeTickToLabelConversion","afterTickToLabelConversion","tickWidth","maxLabelDiagonal","numTicks","minRotation","maxRotation","_isVisible","labelSizes","_getLabelSizes","maxLabelWidth","widest","maxLabelHeight","highest","_limitValue","title","toDegrees","asin","_this$options5","titleOpts","gridOpts","titleHeight","_this$_getLabelSizes","tickPadding","angleRadians","labelHeight","mirror","labelWidth","_calculatePadding","_handleMargins","_this$options6","_this$options6$ticks","isRotated","labelsBelowTicks","offsetLeft","offsetRight","_this$options7","generateTickLabels","_computeLabelSizes","jlen","tickFont","fontString","nestedLabel","caches","widths","heights","widestLabelSize","highestLabelSize","_resolveTickFontOptions","string","gc","_measureText","gcLen","garbageCollect","valueAt","idx","pixel","decimal","_int16Range","_alignPixel","getBaseValue","createTickContext","optionTicks","rot","autoSkipPadding","borderValue","alignedLineValue","tx1","ty1","tx2","ty2","x1","y1","x2","y2","tl","borderOpts","axisWidth","axisHalfWidth","alignBorderValue","positionAxisID","limit","step","optsAtIndex","optsAtIndexBorder","lineColor","borderDash","dash","borderDashOffset","dashOffset","tickColor","tickBorderDash","tickBorderDashOffset","textAlign","lineCount","textOffset","crossAlign","tickAndPadding","hTickAndPadding","textBaseline","_getXAxisLabelAlignment","_getYAxisLabelAlignment","labelOffset","halfCount","strokeColor","textStrokeColor","strokeWidth","textStrokeWidth","tickTextAlign","showLabelBackdrop","backdrop","labelPadding","backdropPadding","backdropColor","translation","_this$options8","_this$options9","_this$options9$ticks","save","fillRect","restore","findIndex","_computeGridLineItems","drawLine","p1","p2","setLineDash","lineDashOffset","beginPath","moveTo","lineTo","stroke","drawOnChartArea","_this$options10","lastLineWidth","_computeLabelArea","clipArea","_step10","getLabelItems","_iterator10","renderTextOptions","renderText","unclipArea","_this$options11","_titleArgs","titleX","titleY","_alignStartEnd","titleArgs","drawBackground","drawGrid","drawBorder","drawTitle","drawLabels","_this10","tz","gz","bz","axisID","fontSize","TypedRegistry","override","create","isPrototypeOf","parentScope","proto","isIChartComponent","register","itemDefaults","merge","defaultRoutes","routes","propertyParts","sourceName","sourceScope","parts","targetName","targetScope","routeDefaults","descriptors","registerDefaults","overrides","Registry","controllers","_typedRegistries","_len","_key","_each","_len2","_key2","_len3","_key3","_len4","_key4","_len5","_key5","_len6","_key6","_len7","_key7","_len8","_key8","_len9","_key9","_len10","_key10","typedRegistry","_this11","arg","reg","_getRegistryForType","isForType","_exec","itemReg","component","camelMethod","_capitalize","PluginService","_init","hook","_createDescriptors","_descriptors","_step11","_iterator11","descriptor","plugin","cancelable","_oldCache","_notifyStateChanges","localIds","getPlugin","local","allPlugins","_ref2","_step12","_iterator12","getOpts","pluginOpts","createDescriptors","previousDescriptors","_ref3","pluginScopeKeys","scriptable","indexable","allKeys","getIndexAxis","datasetDefaults","idMatchesAxis","determineAxis","_len11","scaleOptions","_key11","_i3","_scaleOptions","getAxisFromDataset","mergeScaleConfig","chartDefaults","configScales","chartIndexAxis","scaleConf","error","_proxy","boundDs","d","retrieveAxisFromDatasets","defaultId","getDefaultScaleIDFromAxis","defaultScaleOptions","mergeIf","defaultID","getAxisFromDefaultScaleID","initOptions","initData","keyCache","keysCached","cachedKeys","generate","addIfFound","Config","_config","initConfig","_scopeCache","_resolverCache","platform","clearCache","datasetType","additionalOptionScopes","mainScope","resetCache","keyLists","_cachedScopes","_getResolver","getResolver","resolver","subPrefixes","_step14","_descriptors2","isScriptable","isIndexable","_iterator14","isFunction","hasFunction","needContext","subResolver","_attachContext","_step13","_iterator13","descriptorDefaults","resolverCache","_createResolver","p","KNOWN_POSITIONS","positionIsHorizontal","compare2Level","l1","l2","onAnimationsComplete","onComplete","onAnimationProgress","onProgress","getCanvas","_isDomSupported","getElementById","instances","getChart","c","moveNumericKeys","_i4","intKey","getSizeForArea","field","Chart","userConfig","_this12","initialCanvas","existingChart","chartOptionScopes","OffscreenCanvas","_detectPlatform","updateConfig","acquireContext","uid","_aspectRatio","_metasets","_lastEvent","_listeners","_responsiveListeners","_sortedMetasets","_plugins","_hiddenIndices","attached","_doResize","debounce","resizeDelay","listen","_initialize","_this$options12","maintainAspectRatio","responsive","retinaScale","bindEvents","clearCanvas","_resizeBeforeDraw","_resize","newSize","newRatio","getDevicePixelRatio","onResize","render","scalesOptions","axisOptions","_this13","scaleOpts","updated","isRadial","dposition","dtype","scaleType","getScale","init","hasUpdated","_destroyDatasetMeta","slice","_this14","newControllers","_removeUnreferencedMetasets","order","visible","updateIndex","ControllerClass","getController","_defaults$datasets$ty","_updateMetasets","_this15","_resetElements","animsDisabled","_updateScales","_checkEventBindings","_updateHiddenIndices","invalidate","buildOrUpdateControllers","buildOrUpdateElements","_minPadding","autoPadding","_updateLayout","_updateDatasets","_eventHandler","_updateHoverStyles","_this16","ensureScalesHaveIDs","buildOrUpdateScales","existingEvents","newEvents","events","setsEqual","unbindEvents","_step15","changes","_getUniformDataChanges","_iterator15","_step15$value","datasetCount","makeSet","changeSet","_this17","noArea","_this17$_layers","_idx","_updateDataset","_this$_resizeBeforeDr","layers","_drawDatasets","_drawDataset","useClip","getDatasetArea","setDatasetVisibility","_updateVisibility","_destroy","remove","_stop","releaseContext","_this$canvas","toDataURL","bindUserEvents","bindResponsiveEvents","_this18","_add","_this19","detached","_remove","isAttached","_this20","prefix","activeElements","_this21","lastActive","_ref4","_elementsEqual","notify","pluginId","replay","hoverOptions","hover","deactivated","activated","updateHoverStyle","_this22","inChartArea","eventFilter","_handleEvent","_this$_active","_getActiveElements","isClick","_isClickEvent","lastEvent","determineLastEvent","onHover","getElementsAtEventForMode","invalidatePlugins","parseBorderRadius$1","angleDelta","o","borderRadius","_readValueToProps","halfThickness","innerLimit","computeOuterLimit","outerArcLimit","outerStart","outerEnd","innerStart","innerEnd","rThetaToXY","theta","pathArc","pixelMargin","innerR","spacingOffset","alpha","avNogSpacingRadius","angleOffset","_parseBorderRadius$","outerStartAdjustedRadius","outerEndAdjustedRadius","outerStartAdjustedAngle","outerEndAdjustedAngle","innerStartAdjustedRadius","innerEndAdjustedRadius","innerStartAdjustedAngle","innerEndAdjustedAngle","outerMidAdjustedAngle","pCenter","p4","innerMidAdjustedAngle","p8","outerStartX","outerStartY","outerEndX","outerEndY","closePath","fullCircles","borderJoinStyle","inner","lineJoin","angleMargin","clipArc","ArcElement","_Element2","_super12","_this23","_assertThisInitialized","chartX","chartY","_getAngleFromPoint2","_this$getProps2","rAdjust","betweenAngles","withinRadius","_isBetween","_this$getProps3","_this$options13","halfAngle","halfRadius","translate","radiusOffset","drawArc","setStyle","lineCap","borderCapStyle","previous","pathVars","_params$start","paramsStart","_params$end","paramsEnd","segmentStart","segmentEnd","outside","pathSegment","_pathVars","lineMethod","stepped","_steppedLineTo","tension","cubicInterpolationMode","_bezierCurveTo","getLineMethod","_ref5","_ref5$move","fastPathSegment","prevX","lastY","_pathVars2","_ref6","_ref6$move","avgX","countX","pointIndex","drawX","truncX","_getSegmentMethod","usePath2D","Path2D","path","_path","strokePathWithCache","_step16","segments","segmentMethod","_iterator16","strokePathDirect","LineElement","_Element3","_super13","_this24","_points","_segments","_pointsUpdated","_updateBezierControlPoints","_computeSegments","_boundSegments","_interpolate","_steppedInterpolation","_bezierInterpolation","_pointInLine","_getInterpolationMethod","_segments$i","interpolated","_step17","_iterator17","inRange$1","hitRadius","capBezierPoints","PointElement","_Element4","_super14","_this25","mouseX","mouseY","_this$getProps4","_this$getProps5","hoverRadius","drawPoint","getBarBounds","bar","half","_bar$getProps","skipOrLimit","boundingRects","bounds","maxW","maxH","toTRBL","parseBorderWidth","toTRBLCorners","maxR","enableBorder","topLeft","topRight","bottomLeft","bottomRight","parseBorderRadius","outer","skipX","skipY","addNormalRectPath","rect","inflateRect","amount","refRect","BarElement","_Element5","_super15","_this26","_this$options14","_boundingRects","addRectPath","addRoundedRectPath","_this$getProps6","getBoxSize","labelOpts","_labelOpts$boxHeight","boxHeight","_labelOpts$boxWidth","boxWidth","usePointStyle","pointStyleWidth","itemHeight","Legend","_Element6","_super16","_this27","_added","legendHitBoxes","_hoveredItem","doughnutMode","legendItems","columnSizes","lineWidths","buildLabels","_this28","labelFont","_computeTitleHeight","_getBoxSize","_fitRows","_fitCols","hitboxes","totalHeight","row","itemWidth","measureText","_itemHeight","heightLimit","totalWidth","currentColWidth","currentColHeight","col","_calculateItemSize","legendItemText","calculateItemWidth","fontLineHeight","calculateLegendItemHeight","calculateItemHeight","calculateItemSize","_this$options15","rtl","rtlHelper","getRtlAdapter","_step23","_iterator23","hitbox","leftForLtr","_step24","_iterator24","_draw","cursor","_this29","defaultColor","halfFontSize","_getBoxSize2","overrideTextDirection","textDirection","textWidth","setWidth","lineDash","drawOptions","SQRT2","xPlus","drawPointLegend","yBoxTop","xBoxLeft","drawLegendBox","_textX","strikethrough","fillText","restoreTextDirection","titleFont","titlePadding","topPaddingPlusHalfFontSize","hitBox","lh","onLeave","isListened","hoveredItem","_getLegendItemAt","sameItem","plugin_legend","_element","_args","adjustHitBoxes","afterEvent","handleEvent","ci","hide","show","_chart$legend$options","useBorderRadius","WeakMap","positioners","average","hasValue","tooltipPosition","eventPosition","nearestElement","distanceBetweenPoints","tp","pushOrConcat","toPush","splitNewlines","str","String","createTooltipItem","_controller$getLabelA","getLabelAndValue","formattedValue","getTooltipSize","tooltip","body","footer","bodyFont","footerFont","titleLineCount","footerLineCount","bodyLineItemCount","combinedBodyLength","bodyItem","before","lines","after","beforeBody","afterBody","titleSpacing","titleMarginBottom","displayColors","bodySpacing","footerMarginTop","footerSpacing","widthPadding","maxLineWidth","determineXAlign","yAlign","chartWidth","_chart$chartArea","xAlign","caret","caretSize","caretPadding","doesNotFitWithAlign","determineAlignment","determineYAlign","getBackgroundPoint","alignment","cornerRadius","paddingAndSize","_toTRBLCorners","alignX","alignY","getAlignedX","getBeforeAfterBodyLines","overrideCallbacks","defaultCallbacks","beforeTitle","noop","tooltipItems","labelCount","afterTitle","beforeLabel","tooltipItem","labelColor","labelTextColor","bodyColor","labelPointStyle","afterLabel","beforeFooter","afterFooter","invokeCallbackWithFallback","Tooltip","_Element8","_super18","_this31","opacity","_eventPosition","_size","_cachedAnimations","_tooltipItems","dataPoints","caretX","caretY","labelColors","labelPointStyles","labelTextColors","_this32","bodyItems","scoped","_this33","itemSort","_createItems","getTitle","getBeforeBody","getBody","getAfterBody","getFooter","positionAndSize","backgroundPoint","external","tooltipPoint","caretPosition","getCaretPosition","x3","y3","_toTRBLCorners2","ptX","ptY","pt","titleColor","colorX","rtlColorX","yOffSet","colorY","multiKeyBackground","outerX","innerX","strokeRect","textColor","bodyAlign","bodyLineHeight","xLinePadding","fillLineOfText","bodyAlignForCalculation","_drawColorBox","footerAlign","footerColor","tooltipSize","_toTRBLCorners3","drawCaret","quadraticCurveTo","animX","animY","_updateAnimationTarget","hasTooltipContent","globalAlpha","drawBody","drawFooter","_this34","_ref11","positionChanged","_positionChanged","_ignoreReplayEvents","plugin_tooltip","afterInit","afterDraw","_willRender","_objectSpread","_fallback","findOrAddLabel","addedLabels","unshift","addIfString","lastIndexOf","_getLabelForValue","CategoryScale","_Scale","_super19","_this35","_startValue","_valueRange","_addedLabels","added","_step25","_iterator25","_step25$value","isFinite","_this$getUserBounds2","_this$getMinMax","getDecimalForPixel","relativeLabelSize","minSpacing","_ref12","rad","LinearScaleBase","_Scale2","_super20","_this36","_endValue","_this$getUserBounds3","setMin","setMax","minSign","maxSign","maxTicks","stepSize","computeTickLimit","getTickLimit","generationOptions","dataRange","niceMin","niceMax","numSpaces","precision","maxDigits","includeBounds","unit","maxSpaces","rmin","rmax","countDefined","niceNum","almostWhole","almostEquals","decimalPlaces","_decimalPlaces","tickValue","generateTicks$1","_maxDigits","_setMinAndMaxByKey","format","LinearScale","_LinearScaleBase","_super21","_this$getMinMax2","handleTickRangeOptions","Ticks","log10Floor","log10","changeExponent","m","isMajor","tickVal","steps","rangeExp","rangeStep","generateTicks","_ref13","minExp","exp","startExp","significand","lastTick","LogarithmicScale","_Scale3","_super22","_this37","_zero","_this$getMinMax3","_this$getUserBounds4","getTickBackdropHeight","determineLimits","fitWithPointLabels","_padding","limits","valueCount","_pointLabels","pointLabelOpts","additionalAngle","centerPointLabels","getPointLabelContext","getPointPosition","drawingArea","plFont","textSize","_longestText","_normalizeAngle","updateLimits","setCenterPoint","_pointLabelItems","_opts$pointLabels","itemOpts","extra","createPointLabelItem","isNotOverlapped","buildPointLabelItems","hLimits","vLimits","outerDistance","pointLabelPosition","yForAngle","getTextAlignForAngle","leftForTextAlign","drawPointLabelBox","backdropLeft","backdropTop","backdropWidth","backdropHeight","pathRadiusLine","RadialLinearScale","_LinearScaleBase2","_super23","_this38","_this$getMinMax4","_this39","leftMovement","rightMovement","topMovement","bottomMovement","angleMultiplier","scalingFactor","scaledDistance","pointLabel","createPointLabelContext","distanceFromCenter","_this$_pointLabelItem","_this$options16","_this40","drawPointLabels","gridLineOpts","drawRadiusLine","_this41","rotate","animate","INTERVALS","millisecond","common","second","minute","hour","day","week","month","quarter","year","UNITS","sorter","input","adapter","_adapter","_scale$_parseOpts","_parseOpts","parser","isoWeekday","startOf","determineUnitForAutoTicks","minUnit","capacity","interval","MAX_SAFE_INTEGER","addTick","time","timestamps","_lookup2","_lookup","ticksFromTimestamps","majorUnit","setMajorTicks","TimeScale","_Scale4","_super24","_this42","_unit","_majorUnit","_offsets","_normalized","displayFormats","formats","normalized","_this$getUserBounds5","_applyBounds","_getLabelBounds","endOf","getLabelTimestamps","timeOpts","_generate","_filterBetween","_getLabelCapacity","determineUnitForFormatting","determineMajorUnit","initOffsets","offsetAfterAutoskip","getDecimalForValue","minor","weekday","hasWeekday","getDataTimestamps","tooltipFormat","datetime","fmt","formatter","minorFormat","majorFormat","_tickFormatFunction","offsets","ticksOpts","tickLabelWidth","cosRotation","sinRotation","tickFontSize","exampleTime","exampleLabel","_getLabelSize","normalize","interpolate","table","prevSource","nextSource","prevTarget","nextTarget","_lookupByKey2","_table$lo","_table$hi","_lookupByKey3","_table$lo2","_table$hi2","span","TimeSeriesScale","_TimeScale","_super25","_this43","_table","_minPos","_tableRange","_getTimestampsForTable","buildLookupTable","lim","p2b","n2b","b2n","n2p","map$1","A","B","C","D","E","F","hex","h1","h2","eq","g","isShort","HUE_RE","hsl2rgbn","hsv2rgbn","hwb2rgbn","rgb","rgb2hsl","hueValue","calln","hsl2rgb","hue","hueParse","exec","hwb2rgb","hsv2rgb","Z","Y","X","W","V","U","T","S","R","Q","P","O","N","M","L","K","G","H","I","J","names$1","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","nameParse","ok","nk","unpacked","tkeys","parseInt","unpack","RGB_RE","modHSL","tmp","clone","fromObject","functionParse","rgbParse","Color","hexParse","_rgb","_valid","hslString","w2","c2","w1","rgb1","rgb2","deg","toString","defaultValue","dimension","endsWith","parseFloat","thisArg","loopable","a0","a1","klen","isValidKey","_merger","tval","sval","sources","merger","_mergerIf","keyResolvers","_getKeyResolver","_splitKey","toUpperCase","PITAU","INFINITY","RAD_PER_DEG","QUARTER_PI","TWO_THIRDS_PI","roundedRange","niceRange","fraction","rounded","degrees","radians","centrePoint","anglePoint","distanceFromXCenter","distanceFromYCenter","radialDistanceFromCenter","atan2","_angleDiff","sameAngleIsFullCircle","angleToStart","angleToEnd","startToAngle","endToAngle","cmp","mid","ti","arrayEvents","_chartjs","stub","requestAnimationFrame","argsToUse","ticking","timeout","clearTimeout","setTimeout","pointCount","_iScale$getUserBounds","_scaleRanges","newRanges","xmin","xmax","ymin","ymax","atEdge","elasticIn","elasticOut","linear","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInElastic","easeOutElastic","easeInOutElastic","easeInBack","easeOutBack","easeInOutBack","easeInBounce","easeOutBounce","easeInOutBounce","isPatternOrGradient","getHoverColor","saturate","darken","colors","intlCache","num","JSON","stringify","Intl","NumberFormat","getNumberFormat","formatters","numeric","notation","delta","maxTick","calculateDelta","logDelta","numDecimal","minimumFractionDigits","maximumFractionDigits","logarithmic","getScope$1","root","Defaults","_appliers","family","hoverBackgroundColor","hoverBorderColor","hoverColor","describe","_Object$definePropert","scopeObject","targetScopeObject","privateName","appliers","route","longest","arrayOfThings","thing","nestedThing","halfWidth","resetTransform","clearRect","xOffset","yOffset","xOffsetW","yOffsetW","drawImage","ellipse","SQRT1_2","flip","midpoint","bezierCurveTo","cp1x","cp2x","cp1y","cp2y","decorateText","underline","metrics","actualBoundingBoxLeft","actualBoundingBoxRight","actualBoundingBoxAscent","actualBoundingBoxDescent","yDecoration","decorationWidth","drawBackdrop","oldColor","setRenderOpts","strokeText","LINE_HEIGHT","FONT_STYLE","toLineHeight","matches","match","numberOrZero","objProps","read","toFontString","inputs","info","cacheable","minmax","keepZero","parentContext","getTarget","finalRootScopes","_resolve","Symbol","toStringTag","Proxy","deleteProperty","_cached","readKey","needsSubResolver","createSubResolver","_resolveWithPrefixes","_scopes","getKeysFromAllScopes","storage","_storage","subProxy","_context","_subProxy","getValue","_resolveScriptable","_resolveArray","_resolveWithContext","_proxy$_scriptable","_proxy$_indexable","_proxy$_allKeys","_allKeys","resolveFallback","getScope","addScopes","parentScopes","parentFallback","rootScopes","_rootScopes","allScopes","addScopesFromKey","_getTarget","subGetTarget","resolveKeysFromAllScopes","EPSILON","getPoint","getValueAxis","splineCurve","middlePoint","afterPoint","d01","d12","s01","s12","fa","fb","splineCurveMonotone","pointBefore","pointCurrent","valueAxis","pointsLen","deltaK","mK","pointAfter","slopeDelta","alphaK","betaK","tauK","squaredMagnitude","monotoneAdjust","monotoneCompute","capControlPoint","controlPoints","inArea","inAreaPrev","inAreaNext","parentNode","host","parseMaxStyle","styleValue","parentProperty","valueInPixels","getComputedStyle","ownerDocument","defaultView","getPositionedStyle","styles","suffix","useOffsetPos","shadowRoot","borderBox","paddings","borders","_getCanvasPosition","touches","getBoundingClientRect","clientX","clientY","getCanvasPosition","round1","bbWidth","bbHeight","containerSize","containerStyle","containerBorder","containerPadding","clientHeight","getContainerSize","forceRatio","forceStyle","pixelRatio","deviceHeight","deviceWidth","setTransform","passiveSupported","getPropertyValue","cp1","cp2","getRightToLeftAdapter","rectX","getLeftToRightAdapter","_itemWidth","direction","original","getPropertyPriority","setProperty","prevTextDirection","propertyFn","between","compare","normalizeSegment","_boundSegment","prevValue","startBound","endBound","_propertyFn2","_getSegment","_propertyFn","getSegment","inside","subStart","shouldStart","shouldStop","sub","segmentOptions","_findStartAndEnd","findStartAndEnd","splitByStyles","solidSegments","chartContext","baseStyle","readStyle","prevStyle","addStyle","st","dir","styleChanged","p0","p0DataIndex","p1DataIndex","doSplitByStyles","replacer","state","filterElements","nearestItems","evenPoint","getPointByAxis","_index","getNearestItem","getElements","visibleElements","inRangeByAxis","isOlderPart","act","req","clamp","clampAll","_Object$keys","inBoxRange","hBorderWidth","inRangeX","inRangeY","getElementCenterPoint","isPercentString","toPercent","toPositivePercent","boxAppering","defaultInitAnimation","polygon","getSize","positivePercent","toPosition","isBoundToPoint","xValue","yValue","initAnimationProperties","initAnim","applyDefault","execCallback","loadHooks","hooks","hooksContainer","widthCache","fontsKey","fonts","isImageOrCanvas","content","setBorderStyle","setShadowStyle","shadowColor","backgroundShadowColor","shadowBlur","shadowOffsetX","shadowOffsetY","measureLabelSize","optFont","calculateLabelSize","drawBox","borderShadowColor","drawLabel","elementValue","getOpacity","optColor","calculateTextAlignment","miterLimit","setTextStrokeStyle","lhs","applyLabelDecoration","applyLabelContent","notRadius","drawPointStyle","limitedLineScale","xScaleID","startProp","endProp","yScaleID","scaleValue","retrieveScaleID","axes","getDimensionByScale","getChartPoint","resolveBoxProperties","_ref7","_ref8","xDim","getChartDimensionByScale","xMin","xMax","yDim","yMin","yMax","resolvePointProperties","adjustCenterX","xAdjust","adjustCenterY","yAdjust","getChartCircle","resolveLineProperties","resolveFullLineProperties","_i2","_Object$keys2","scaleId","_limitedLineScale$sca","dim","resolveLimitedLineProperties","resolveBoxAndLabelProperties","initProperties","optionScope","resolveLabelElementProperties$1","calculatePosition$1","boxOpts","_labelOpts$padding","padStart","padEnd","adjust","callout","labelSize","_ref9","calculateX","_ref10","calculateY","rotated","cx","cy","moveHooks","eventHooks","listened","moveListened","hovered","dispatchMoveEvents","handleMoveEvents","dispatchEvent","click","handleClickEvents","checkElements","elementHooks","invokeHook","hooked","callbackHook","adjustScaleRange","annotations","scaleIDOption","annotation","getScaleLimits","changeScaleLimit","suggestedLimit","scaleLimitDefined","verifyScaleIDs","_arr","verifyProperties","_arr2","BoxAnnotation","_rotated","drawTime","LabelAnnotation","_rotated2","_visible","pointX","pointY","calloutPosition","xPoints","yPoints","rotatedPoint","resolveCalloutAutoPosition","resolveCalloutPosition","isPointInRange","_getCalloutSeparatorC","separatorStart","separatorEnd","getCalloutSeparatorAdjust","getCalloutSeparatorCoord","_getCalloutSideCoord","sideStart","sideEnd","side","getCalloutSideAdjust","getCalloutSideCoord","drawCallout","getLabelSize","_resolveBoxProperties","boxSize","calculatePosition","measureRect","pointInLine","interpolateX","interpolateY","sqr","coordInCurve","cp","pointInCurve","coordAngleInCurve","angleInCurve","LineAnnotation","mx","my","isPointInStroke","isOnLabel","_ref20","xx","yy","_element$getProps2","dx","dy","lenSq","intersects","_ref14","_ref15","rangeLimit","inAxisRange","curve","_getArrowHeads2","getArrowHeads","startOpts","endOpts","startAdjust","endAdjust","ps","pe","drawArrowHeadOnCurve","drawCurve","_getArrowHeads","drawArrowHead","_ref16","_ref17","isLineInArea","_limitPointToArea","limitPointToArea","_limitPointToArea2","limitLineToArea","controlPoint","getControlPoint","labelProperties","sizes","calculateAutoRotation","rotatedSize","space","spaceAround","calculateTAdjust","calculateT","xCoordinateSizes","yCoordinateSizes","adjustLabelCoordinate","calculateLabelPosition","resolveLabelElementProperties","arrowHeadsDefaults","_ref18","_ref19","_ref21","lineSize","lineW","lineH","coordinate","halfSize","arrowStartOpts","arrowHeads","arrowEndOpts","getLineAdjust","arrowOpts","arrowOffsetX","_ref22","_ref23","EllipseAnnotation","xRadius","yRadius","cosAngle","sinAngle","pointInEllipse","PointAnnotation","inPointRange","PolygonAnnotation","isInside","bY","bX","pointIsInPolygon","axisPoints","sides","elProps","buildPointElement","_ref24","_ref25","halfBorder","annotationTypes","directUpdater","hooks$1","optDefs","resolveObj","resolveType","animOpts","resolveAnimations","resyncElements","annotationOptions","getOrCreateElement","resolveElementProperties","toSkip","updateSubElements","resolveAnnotationOptions","mainElement","subElements","definition","subElement","elementClass","defs","_Object$keys3","_i5","chartStates","version","beforeRegister","pkg","ver","strict","requireVersion","afterRegister","afterUnregister","beforeInit","verifyScaleOptions","_getElements","updateListeners","updateHooks","beforeDatasetsDraw","afterDatasetsDraw","beforeDraw","beforeEvent","afterDestroy","_getState","caller","drawableElements","main","getDrawableElements","drawElement","_objectWithoutProperties","excluded","sourceKeys","sourceSymbolKeys","propertyIsEnumerable","defaultDatasetIdKey","reforwardRef","setLabels","currentData","nextLabels","setDatasets","nextDatasets","datasetIdKey","addedDatasets","nextDataset","currentDataset","find","cloneData","nextData","ChartComponent","_props$height","_props$width","_props$redraw","redraw","_props$plugins","fallbackContent","updateMode","canvasProps","_excluded","canvasRef","chartRef","renderChart","Chart$1","destroyChart","destroy","nextOptions","setOptions","React","role","forwardRef","createTypedChart","registerables","Line"],"sourceRoot":""} \ No newline at end of file diff --git a/static/js/main.0f7c2ed7.js b/static/js/main.a88b75a6.js similarity index 99% rename from static/js/main.0f7c2ed7.js rename to static/js/main.a88b75a6.js index 3b26424..322303f 100644 --- a/static/js/main.0f7c2ed7.js +++ b/static/js/main.a88b75a6.js @@ -1,3 +1,3 @@ -/*! For license information please see main.0f7c2ed7.js.LICENSE.txt */ -!function(){var e={861:function(e,t,n){"use strict";n.d(t,{Z:function(){return u}});var r=n(3587),a=n(2791),i=n(7387),o=n(184);function u(){var e=(0,a.useContext)(i.F),t=e.bunproData,n=e.bunproIsLoading;return(0,o.jsx)(r.Z,{csvData:t,csvDataIsLoading:n,chartTitle:"Bunpro Reviews"})}},3587:function(e,t,n){"use strict";n.d(t,{Z:function(){return p}});var r=n(9439),a=n(2791),i=n(4164),o=n(8617),u=n(184);function l(e){var t=e.onClose,n=e.children;return(0,a.useEffect)((function(){return document.body.style.overflow="hidden",function(){return document.body.style.overflow="unset"}}),[]),(0,i.createPortal)((0,u.jsxs)(u.Fragment,{children:[(0,u.jsx)("div",{className:"modal-backdrop","data-testid":"modal-backdrop",onClick:t}),(0,u.jsxs)("dialog",{className:"modal-dialog",open:!0,children:[(0,u.jsx)("button",{className:"modal-close-button",onClick:t,children:(0,u.jsx)(o.apv,{style:{color:"#b7b7b7"}})}),(0,u.jsx)("div",{className:"modal-content-container",children:n})]})]}),document.getElementById("modals"))}var s=n(1355),c=n(7649),f=n(7534),d=n.n(f),h=function(e,t,n){if(!e||!t||!n||0==e)return"color-empty";var r=(parseFloat(e)-t)/parseFloat(n-t),a=(Math.round(4*r)/4).toFixed(2)/.25;return"color-scale-".concat(a)};function p(e){var t=e.csvData,n=e.csvDataIsLoading,i=e.chartTitle,f=(0,a.useState)(),p=(0,r.Z)(f,2),v=p[0],m=p[1],y=(0,a.useState)(),g=(0,r.Z)(y,2),b=g[0],w=g[1],k=(0,a.useState)(),S=(0,r.Z)(k,2),x=S[0],E=S[1],C=(0,a.useState)(),_=(0,r.Z)(C,2),O=_[0],P=_[1],R=(0,a.useState)(""),L=(0,r.Z)(R,2),T=L[0],N=L[1],D=(0,a.useState)(""),j=(0,r.Z)(D,2),F=j[0],z=j[1],I=(0,a.useState)(""),M=(0,r.Z)(I,2),A=M[0],U=M[1],Q=(0,a.useState)(""),W=(0,r.Z)(Q,2),q=W[0],Z=W[1],V=(0,a.useState)(!1),B=(0,r.Z)(V,2),H=B[0],$=B[1],K=(0,s.Z)(n,t),G=(0,a.useMemo)((function(){return(0,u.jsxs)("div",{children:[(0,u.jsxs)("h2",{style:{margin:"-14px 0",padding:"0",fontSize:"22px",fontWeight:"500"},children:[i," data"]}),(0,u.jsx)("ul",{style:{marginTop:"24px"},children:K.map((function(e,t){return(0,u.jsxs)("li",{children:[new Date(e.Date).toLocaleDateString("en-US",{timeStyle:void 0,day:"2-digit",month:"2-digit",year:"numeric"}),": ",e["Time (mins)"]," mins"]},t)}))})]})}),[K]);if((0,a.useEffect)((function(){var e=K.filter((function(e){return e["Time (mins)"]>0})).sort((function(e,t){return new Date(t.Date)-new Date(e.Date)})),t=e[e.length-1];t&&m(new Date(t.Date));var n=e[0];n&&w(new Date(n.Date))}),[K]),(0,a.useEffect)((function(){var e=K.sort((function(e,t){return t["Time (mins)"]-e["Time (mins)"]})),t=e[0];t&&E(t["Time (mins)"]);var n=e[e.length-1];n&&P(n["Time (mins)"])}),[K]),(0,a.useEffect)((function(){var e=K.map((function(e){return parseInt(e["Time (mins)"])})).reduce((function(e,t){return e+t}),0),t=(0,c.j)(e);N("".concat(t.hours,"hrs ").concat(t.minutes,"mins")),U("".concat(t.hours,"hrs ").concat(t.minutes,"mins"));var n=K.filter((function(e){return parseInt(e["Time (mins)"])>0})).length;z("".concat(n," days")),Z("".concat(n," days"))}),[K]),n)return(0,u.jsx)("p",{className:"loading-messsage",children:"Fetching csv file..."});if(!v||!b||!x||!O)return(0,u.jsx)("p",{className:"loading-messsage",children:"Processing data..."});var J=new Date("11/11/2022"),Y=v>J?J:v;return(0,u.jsxs)("div",{className:"ReviewsHeatmap",onClick:function(e){"rect"!=e.target.tagName&&(U(T),Z(F))},style:{width:"100%"},children:[(0,u.jsx)("h1",{onClick:function(){return $((function(e){return!e}))},style:{margin:"4px 0 2px 0",padding:"0",fontSize:"28px",fontWeight:"600"},children:i}),(0,u.jsxs)("div",{style:{margin:"0",fontWeight:"200",fontSize:"14px",textAlign:"center"},children:[(0,u.jsxs)("p",{style:{margin:"0"},"data-testid":"day-label",children:[q===F&&(0,u.jsx)(o.v9e,{style:{color:"#ff9600",margin:"0 3px -3px 0",fontSize:"18px",display:"inline"}}),q]}),(0,u.jsx)("p",{style:{margin:"0"},"data-testid":"time-label",children:A})]}),(0,u.jsx)("div",{className:"heatmap-container",children:(0,u.jsx)(d(),{startDate:Y,endDate:b,values:K.map((function(e){return{date:e.Date,count:e["Time (mins)"]}})),classForValue:function(e){return h(null===e||void 0===e?void 0:e.count,O,x)},titleForValue:function(e){return e?"".concat(e.date,", ").concat(parseInt(e.count)," minutes"):"No value"},onClick:function(e){e&&(U("".concat(parseInt(e.count)," minutes")),Z(e.date))}})}),H&&(0,u.jsx)(l,{onClose:function(){return $((function(e){return!e}))},children:G})]})}},1355:function(e,t,n){"use strict";var r=n(2791),a=n(4442);t.Z=function(e,t){return(0,r.useMemo)((function(){return e?[]:(0,a.c)(t)}),[e,t])}},420:function(e,t,n){"use strict";n.d(t,{R:function(){return l},Z:function(){return s}});var r=n(1933),a=n(6291),i=n(2791),o=n(184),u="aggregated-immersion",l=(0,i.createContext)({aggregatedImmersionData:void 0,aggregatedImmersionIsLoading:!0});function s(e){var t=e.children,n=(0,r.useQuery)({queryKey:[u],queryFn:a.Gw}),i=n.data,s=n.isLoading;return(0,o.jsx)(l.Provider,{value:{aggregatedImmersionData:i,aggregatedImmersionIsLoading:s},children:t})}},1526:function(e,t,n){"use strict";n.d(t,{Z:function(){return s},b:function(){return l}});var r=n(1933),a=n(6291),i=n(2791),o=n(184),u="anki",l=(0,i.createContext)({ankiData:void 0,ankiIsLoading:!0});function s(e){var t=e.children,n=(0,r.useQuery)({queryKey:[u],queryFn:a.r_}),i=n.data,s=n.isLoading;return(0,o.jsx)(l.Provider,{value:{ankiData:i,ankiIsLoading:s},children:t})}},7387:function(e,t,n){"use strict";n.d(t,{F:function(){return l},Z:function(){return s}});var r=n(1933),a=n(6291),i=n(2791),o=n(184),u="bunpro",l=(0,i.createContext)({bunproData:void 0,bunproIsLoading:!0});function s(e){var t=e.children,n=(0,r.useQuery)({queryKey:[u],queryFn:a.bT}),i=n.data,s=n.isLoading;return(0,o.jsx)(l.Provider,{value:{bunproData:i,bunproIsLoading:s},children:t})}},8995:function(e,t,n){"use strict";n.d(t,{Z:function(){return s},o:function(){return l}});var r=n(1933),a=n(6291),i=n(2791),o=n(184),u="immersion",l=(0,i.createContext)({immersionData:void 0,immersionIsLoading:!0});function s(e){var t=e.children,n=(0,r.useQuery)({queryKey:[u],queryFn:a.zP}),i=n.data,s=n.isLoading;return(0,o.jsx)(l.Provider,{value:{immersionData:i,immersionIsLoading:s},children:t})}},5653:function(e,t,n){"use strict";n.d(t,{Z:function(){return s},u:function(){return l}});var r=n(1933),a=n(6291),i=n(2791),o=n(184),u="jpdb",l=(0,i.createContext)({jpdbData:void 0,jpdbIsLoading:!0});function s(e){var t=e.children,n=(0,r.useQuery)({queryKey:[u],queryFn:a.uV}),i=n.data,s=n.isLoading;return(0,o.jsx)(l.Provider,{value:{jpdbData:i,jpdbIsLoading:s},children:t})}},6291:function(e,t,n){"use strict";n.d(t,{Gw:function(){return l},r_:function(){return s},bT:function(){return f},zP:function(){return u},uV:function(){return c}});var r=n(1002);function a(){a=function(){return e};var e={},t=Object.prototype,n=t.hasOwnProperty,i=Object.defineProperty||function(e,t,n){e[t]=n.value},o="function"==typeof Symbol?Symbol:{},u=o.iterator||"@@iterator",l=o.asyncIterator||"@@asyncIterator",s=o.toStringTag||"@@toStringTag";function c(e,t,n){return Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}),e[t]}try{c({},"")}catch(L){c=function(e,t,n){return e[t]=n}}function f(e,t,n,r){var a=t&&t.prototype instanceof p?t:p,o=Object.create(a.prototype),u=new O(r||[]);return i(o,"_invoke",{value:x(e,n,u)}),o}function d(e,t,n){try{return{type:"normal",arg:e.call(t,n)}}catch(L){return{type:"throw",arg:L}}}e.wrap=f;var h={};function p(){}function v(){}function m(){}var y={};c(y,u,(function(){return this}));var g=Object.getPrototypeOf,b=g&&g(g(P([])));b&&b!==t&&n.call(b,u)&&(y=b);var w=m.prototype=p.prototype=Object.create(y);function k(e){["next","throw","return"].forEach((function(t){c(e,t,(function(e){return this._invoke(t,e)}))}))}function S(e,t){function a(i,o,u,l){var s=d(e[i],e,o);if("throw"!==s.type){var c=s.arg,f=c.value;return f&&"object"==(0,r.Z)(f)&&n.call(f,"__await")?t.resolve(f.__await).then((function(e){a("next",e,u,l)}),(function(e){a("throw",e,u,l)})):t.resolve(f).then((function(e){c.value=e,u(c)}),(function(e){return a("throw",e,u,l)}))}l(s.arg)}var o;i(this,"_invoke",{value:function(e,n){function r(){return new t((function(t,r){a(e,n,t,r)}))}return o=o?o.then(r,r):r()}})}function x(e,t,n){var r="suspendedStart";return function(a,i){if("executing"===r)throw new Error("Generator is already running");if("completed"===r){if("throw"===a)throw i;return R()}for(n.method=a,n.arg=i;;){var o=n.delegate;if(o){var u=E(o,n);if(u){if(u===h)continue;return u}}if("next"===n.method)n.sent=n._sent=n.arg;else if("throw"===n.method){if("suspendedStart"===r)throw r="completed",n.arg;n.dispatchException(n.arg)}else"return"===n.method&&n.abrupt("return",n.arg);r="executing";var l=d(e,t,n);if("normal"===l.type){if(r=n.done?"completed":"suspendedYield",l.arg===h)continue;return{value:l.arg,done:n.done}}"throw"===l.type&&(r="completed",n.method="throw",n.arg=l.arg)}}}function E(e,t){var n=t.method,r=e.iterator[n];if(void 0===r)return t.delegate=null,"throw"===n&&e.iterator.return&&(t.method="return",t.arg=void 0,E(e,t),"throw"===t.method)||"return"!==n&&(t.method="throw",t.arg=new TypeError("The iterator does not provide a '"+n+"' method")),h;var a=d(r,e.iterator,t.arg);if("throw"===a.type)return t.method="throw",t.arg=a.arg,t.delegate=null,h;var i=a.arg;return i?i.done?(t[e.resultName]=i.value,t.next=e.nextLoc,"return"!==t.method&&(t.method="next",t.arg=void 0),t.delegate=null,h):i:(t.method="throw",t.arg=new TypeError("iterator result is not an object"),t.delegate=null,h)}function C(e){var t={tryLoc:e[0]};1 in e&&(t.catchLoc=e[1]),2 in e&&(t.finallyLoc=e[2],t.afterLoc=e[3]),this.tryEntries.push(t)}function _(e){var t=e.completion||{};t.type="normal",delete t.arg,e.completion=t}function O(e){this.tryEntries=[{tryLoc:"root"}],e.forEach(C,this),this.reset(!0)}function P(e){if(e){var t=e[u];if(t)return t.call(e);if("function"==typeof e.next)return e;if(!isNaN(e.length)){var r=-1,a=function t(){for(;++r=0;--a){var i=this.tryEntries[a],o=i.completion;if("root"===i.tryLoc)return r("end");if(i.tryLoc<=this.prev){var u=n.call(i,"catchLoc"),l=n.call(i,"finallyLoc");if(u&&l){if(this.prev=0;--r){var a=this.tryEntries[r];if(a.tryLoc<=this.prev&&n.call(a,"finallyLoc")&&this.prev=0;--t){var n=this.tryEntries[t];if(n.finallyLoc===e)return this.complete(n.completion,n.afterLoc),_(n),h}},catch:function(e){for(var t=this.tryEntries.length-1;t>=0;--t){var n=this.tryEntries[t];if(n.tryLoc===e){var r=n.completion;if("throw"===r.type){var a=r.arg;_(n)}return a}}throw new Error("illegal catch attempt")},delegateYield:function(e,t,n){return this.delegate={iterator:P(e),resultName:t,nextLoc:n},"next"===this.method&&(this.arg=void 0),h}},e}function i(e,t,n,r,a,i,o){try{var u=e[i](o),l=u.value}catch(s){return void n(s)}u.done?t(l):Promise.resolve(l).then(r,a)}function o(e){return function(){var t=this,n=arguments;return new Promise((function(r,a){var o=e.apply(t,n);function u(e){i(o,r,a,u,l,"next",e)}function l(e){i(o,r,a,u,l,"throw",e)}u(void 0)}))}}var u=function(){var e=o(a().mark((function e(){var t;return a().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,fetch("https://docs.google.com/spreadsheets/d/e/2PACX-1vQpattUOpPKcUSS8bxlk3P-9OdmCHcNB32FINvEfnQg81WN6OsxK6AIho-gijZROruqizBjlukxKscX/pub?output=csv");case 2:return t=e.sent,e.next=5,t.text();case 5:return e.abrupt("return",e.sent);case 6:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),l=function(){var e=o(a().mark((function e(){var t;return a().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,fetch("https://docs.google.com/spreadsheets/d/e/2PACX-1vQpattUOpPKcUSS8bxlk3P-9OdmCHcNB32FINvEfnQg81WN6OsxK6AIho-gijZROruqizBjlukxKscX/pub?gid=1631773302&single=true&output=csv");case 2:return t=e.sent,e.next=5,t.text();case 5:return e.abrupt("return",e.sent);case 6:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),s=function(){var e=o(a().mark((function e(){var t,n;return a().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,fetch("https://docs.google.com/spreadsheets/d/e/2PACX-1vRtfhZzd63RTmi_cQ4sTSpLCYbufMKNxdWBrf1fIjqomzeNFRdX1O6DBXUUNcfwNQuRaY-TTp_Fa5M3/pub?gid=0&single=true&output=csv");case 2:return t=e.sent,e.next=5,t.text();case 5:return n=e.sent,e.abrupt("return",n);case 7:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),c=function(){var e=o(a().mark((function e(){var t,n;return a().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,fetch("https://raw.githubusercontent.com/jhunschejones/Ruby-Scripts/master/jpdb_daily_study_time/daily_study_time.csv");case 2:return t=e.sent,e.next=5,t.text();case 5:return n=e.sent,e.abrupt("return",n);case 7:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}(),f=function(){var e=o(a().mark((function e(){var t,n;return a().wrap((function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,fetch("https://docs.google.com/spreadsheets/d/e/2PACX-1vQhPY-bvFduC3LEIPRsp4bFOQm4J1VH2FQwIOWRHc6Z3Q5j0VKfl8xGdS5wBuAW4nJYIyx-2lzpw4VO/pub?gid=0&single=true&output=csv");case 2:return t=e.sent,e.next=5,t.text();case 5:return n=e.sent,e.abrupt("return",n);case 7:case"end":return e.stop()}}),e)})));return function(){return e.apply(this,arguments)}}()},4442:function(e,t,n){"use strict";n.d(t,{c:function(){return i}});var r=n(1025),a=n.n(r),i=function(e){return a().parse(e,{header:!0,skipEmptyLines:"greedy"}).data}},7649:function(e,t,n){"use strict";n.d(t,{f:function(){return i},j:function(){return a}});var r=n(9439),a=function(e){return{hours:Math.floor(e/60),minutes:e%60}},i=function(e){var t=Object.values(a(e)),n=(0,r.Z)(t,2),i=n[0],o=n[1];return"".concat(i,":").concat(o.toString().padStart(2,"0"))}},1989:function(e,t,n){"use strict";n.d(t,{X3:function(){return X},aU:function(){return y},Zq:function(){return H},J0:function(){return E},q_:function(){return x},Ep:function(){return P},WK:function(){return ee},RQ:function(){return K},fp:function(){return T},cP:function(){return R},pC:function(){return $},Zn:function(){return V}});var r=n(3144),a=n(5671),i=n(136),o=n(7277),u=n(1120),l=n(9611);var s=n(8814);function c(e,t,n){return c=(0,s.Z)()?Reflect.construct.bind():function(e,t,n){var r=[null];r.push.apply(r,t);var a=new(Function.bind.apply(e,r));return n&&(0,l.Z)(a,n.prototype),a},c.apply(null,arguments)}function f(e){var t="function"===typeof Map?new Map:void 0;return f=function(e){if(null===e||(n=e,-1===Function.toString.call(n).indexOf("[native code]")))return e;var n;if("function"!==typeof e)throw new TypeError("Super expression must either be null or a function");if("undefined"!==typeof t){if(t.has(e))return t.get(e);t.set(e,r)}function r(){return c(e,arguments,(0,u.Z)(this).constructor)}return r.prototype=Object.create(e.prototype,{constructor:{value:r,enumerable:!1,writable:!0,configurable:!0}}),(0,l.Z)(r,e)},f(e)}var d=n(9439),h=n(3878),p=n(9199),v=n(181),m=n(5267);var y,g=n(7762),b=n(3433);function w(){return w=Object.assign?Object.assign.bind():function(e){for(var t=1;t=0&&(t.hash=e.substr(n),e=e.substr(0,n));var r=e.indexOf("?");r>=0&&(t.search=e.substr(r),e=e.substr(0,r)),e&&(t.pathname=e)}return t}function L(e,t,n,r){void 0===r&&(r={});var a=r,i=a.window,o=void 0===i?document.defaultView:i,u=a.v5Compat,l=void 0!==u&&u,s=o.history,c=y.Pop,f=null,d=h();function h(){return(s.state||{idx:null}).idx}function p(){c=y.Pop;var e=h(),t=null==e?null:e-d;d=e,f&&f({action:c,location:m.location,delta:t})}function v(e){var t="null"!==o.location.origin?o.location.origin:o.location.href,n="string"===typeof e?e:P(e);return E(t,"No window.location.(origin|href) available to create URL for href: "+n),new URL(n,t)}null==d&&(d=0,s.replaceState(w({},s.state,{idx:d}),""));var m={get action(){return c},get location(){return e(o,s)},listen:function(e){if(f)throw new Error("A history only accepts one active listener");return o.addEventListener(S,p),f=e,function(){o.removeEventListener(S,p),f=null}},createHref:function(e){return t(o,e)},createURL:v,encodeLocation:function(e){var t=v(e);return{pathname:t.pathname,search:t.search,hash:t.hash}},push:function(e,t){c=y.Push;var r=O(m.location,e,t);n&&n(r,e);var a=_(r,d=h()+1),i=m.createHref(r);try{s.pushState(a,"",i)}catch(u){if(u instanceof DOMException&&"DataCloneError"===u.name)throw u;o.location.assign(i)}l&&f&&f({action:c,location:m.location,delta:1})},replace:function(e,t){c=y.Replace;var r=O(m.location,e,t);n&&n(r,e);var a=_(r,d=h()),i=m.createHref(r);s.replaceState(a,"",i),l&&f&&f({action:c,location:m.location,delta:0})},go:function(e){return s.go(e)}};return m}!function(e){e.data="data",e.deferred="deferred",e.redirect="redirect",e.error="error"}(k||(k={}));new Set(["lazy","caseSensitive","path","id","index","children"]);function T(e,t,n){void 0===n&&(n="/");var r=V(("string"===typeof t?R(t):t).pathname||"/",n);if(null==r)return null;var a=N(e);!function(e){e.sort((function(e,t){return e.score!==t.score?t.score-e.score:function(e,t){var n=e.length===t.length&&e.slice(0,-1).every((function(e,n){return e===t[n]}));return n?e[e.length-1]-t[t.length-1]:0}(e.routesMeta.map((function(e){return e.childrenIndex})),t.routesMeta.map((function(e){return e.childrenIndex})))}))}(a);for(var i=null,o=0;null==i&&o0&&(E(!0!==e.index,'Index routes must not have child routes. Please remove all child routes from route path "'+u+'".'),N(e.children,t,l,u)),(null!=e.path||e.index)&&t.push({path:u,score:Q(u,e.index),routesMeta:l})};return e.forEach((function(e,t){var n;if(""!==e.path&&null!=(n=e.path)&&n.includes("?")){var r,i=(0,g.Z)(D(e.path));try{for(i.s();!(r=i.n()).done;){var o=r.value;a(e,t,o)}}catch(u){i.e(u)}finally{i.f()}}else a(e,t)})),t}function D(e){var t=e.split("/");if(0===t.length)return[];var n,r=(n=t,(0,h.Z)(n)||(0,p.Z)(n)||(0,v.Z)(n)||(0,m.Z)()),a=r[0],i=r.slice(1),o=a.endsWith("?"),u=a.replace(/\?$/,"");if(0===i.length)return o?[u,""]:[u];var l=D(i.join("/")),s=[];return s.push.apply(s,(0,b.Z)(l.map((function(e){return""===e?u:[u,e].join("/")})))),o&&s.push.apply(s,(0,b.Z)(l)),s.map((function(t){return e.startsWith("/")&&""===t?"/":t}))}var j=/^:\w+$/,F=3,z=2,I=1,M=10,A=-2,U=function(e){return"*"===e};function Q(e,t){var n=e.split("/"),r=n.length;return n.some(U)&&(r+=A),t&&(r+=z),n.filter((function(e){return!U(e)})).reduce((function(e,t){return e+(j.test(t)?F:""===t?I:M)}),r)}function W(e,t){for(var n=e.routesMeta,r={},a="/",i=[],o=0;o and the router will parse it for you.'}function H(e){return e.filter((function(e,t){return 0===t||e.route.path&&e.route.path.length>0}))}function $(e,t,n,r){var a;void 0===r&&(r=!1),"string"===typeof e?a=R(e):(E(!(a=w({},e)).pathname||!a.pathname.includes("?"),B("?","pathname","search",a)),E(!a.pathname||!a.pathname.includes("#"),B("#","pathname","hash",a)),E(!a.search||!a.search.includes("#"),B("#","search","hash",a)));var i,o=""===e||""===a.pathname,u=o?"/":a.pathname;if(r||null==u)i=n;else{var l=t.length-1;if(u.startsWith("..")){for(var s=u.split("/");".."===s[0];)s.shift(),l-=1;a.pathname=s.join("/")}i=l>=0?t[l]:"/"}var c=function(e,t){void 0===t&&(t="/");var n="string"===typeof e?R(e):e,r=n.pathname,a=n.search,i=void 0===a?"":a,o=n.hash,u=void 0===o?"":o,l=r?r.startsWith("/")?r:function(e,t){var n=t.replace(/\/+$/,"").split("/");return e.split("/").forEach((function(e){".."===e?n.length>1&&n.pop():"."!==e&&n.push(e)})),n.length>1?n.join("/"):"/"}(r,t):t;return{pathname:l,search:J(i),hash:Y(u)}}(a,i),f=u&&"/"!==u&&u.endsWith("/"),d=(o||"."===u)&&n.endsWith("/");return c.pathname.endsWith("/")||!f&&!d||(c.pathname+="/"),c}var K=function(e){return e.join("/").replace(/\/\/+/g,"/")},G=function(e){return e.replace(/\/+$/,"").replace(/^\/*/,"/")},J=function(e){return e&&"?"!==e?e.startsWith("?")?e:"?"+e:""},Y=function(e){return e&&"#"!==e?e.startsWith("#")?e:"#"+e:""},X=function(e){(0,i.Z)(n,e);var t=(0,o.Z)(n);function n(){return(0,a.Z)(this,n),t.apply(this,arguments)}return(0,r.Z)(n)}(f(Error));function ee(e){return null!=e&&"number"===typeof e.status&&"string"===typeof e.statusText&&"boolean"===typeof e.internal&&"data"in e}var te=["post","put","patch","delete"],ne=(new Set(te),["get"].concat(te));new Set(ne),new Set([301,302,303,307,308]),new Set([307,308]);Symbol("deferred")},1025:function(e,t){var n,r,a;r=[],n=function e(){"use strict";var t="undefined"!=typeof self?self:"undefined"!=typeof window?window:void 0!==t?t:{},n=!t.document&&!!t.postMessage,r=t.IS_PAPA_WORKER||!1,a={},i=0,o={parse:function(n,r){var u=(r=r||{}).dynamicTyping||!1;if(k(u)&&(r.dynamicTypingFunction=u,u={}),r.dynamicTyping=u,r.transform=!!k(r.transform)&&r.transform,r.worker&&o.WORKERS_SUPPORTED){var l=function(){if(!o.WORKERS_SUPPORTED)return!1;var n,r,u=(n=t.URL||t.webkitURL||null,r=e.toString(),o.BLOB_URL||(o.BLOB_URL=n.createObjectURL(new Blob(["var global = (function() { if (typeof self !== 'undefined') { return self; } if (typeof window !== 'undefined') { return window; } if (typeof global !== 'undefined') { return global; } return {}; })(); global.IS_PAPA_WORKER=true; ","(",r,")();"],{type:"text/javascript"})))),l=new t.Worker(u);return l.onmessage=m,l.id=i++,a[l.id]=l}();return l.userStep=r.step,l.userChunk=r.chunk,l.userComplete=r.complete,l.userError=r.error,r.step=k(r.step),r.chunk=k(r.chunk),r.complete=k(r.complete),r.error=k(r.error),delete r.worker,void l.postMessage({input:n,config:r,workerId:l.id})}var h=null;return o.NODE_STREAM_INPUT,"string"==typeof n?(n=function(e){return 65279===e.charCodeAt(0)?e.slice(1):e}(n),h=r.download?new s(r):new f(r)):!0===n.readable&&k(n.read)&&k(n.on)?h=new d(r):(t.File&&n instanceof File||n instanceof Object)&&(h=new c(r)),h.stream(n)},unparse:function(e,t){var n=!1,r=!0,a=",",i="\r\n",u='"',l=u+u,s=!1,c=null,f=!1;!function(){if("object"==typeof t){if("string"!=typeof t.delimiter||o.BAD_DELIMITERS.filter((function(e){return-1!==t.delimiter.indexOf(e)})).length||(a=t.delimiter),("boolean"==typeof t.quotes||"function"==typeof t.quotes||Array.isArray(t.quotes))&&(n=t.quotes),"boolean"!=typeof t.skipEmptyLines&&"string"!=typeof t.skipEmptyLines||(s=t.skipEmptyLines),"string"==typeof t.newline&&(i=t.newline),"string"==typeof t.quoteChar&&(u=t.quoteChar),"boolean"==typeof t.header&&(r=t.header),Array.isArray(t.columns)){if(0===t.columns.length)throw new Error("Option columns is empty");c=t.columns}void 0!==t.escapeChar&&(l=t.escapeChar+u),("boolean"==typeof t.escapeFormulae||t.escapeFormulae instanceof RegExp)&&(f=t.escapeFormulae instanceof RegExp?t.escapeFormulae:/^[=+\-@\t\r].*$/)}}();var d=new RegExp(p(u),"g");if("string"==typeof e&&(e=JSON.parse(e)),Array.isArray(e)){if(!e.length||Array.isArray(e[0]))return h(null,e,s);if("object"==typeof e[0])return h(c||Object.keys(e[0]),e,s)}else if("object"==typeof e)return"string"==typeof e.data&&(e.data=JSON.parse(e.data)),Array.isArray(e.data)&&(e.fields||(e.fields=e.meta&&e.meta.fields||c),e.fields||(e.fields=Array.isArray(e.data[0])?e.fields:"object"==typeof e.data[0]?Object.keys(e.data[0]):[]),Array.isArray(e.data[0])||"object"==typeof e.data[0]||(e.data=[e.data])),h(e.fields||[],e.data||[],s);throw new Error("Unable to serialize unrecognized input");function h(e,t,n){var o="";"string"==typeof e&&(e=JSON.parse(e)),"string"==typeof t&&(t=JSON.parse(t));var u=Array.isArray(e)&&0=this._config.preview;if(r)t.postMessage({results:u,workerId:o.WORKER_ID,finished:s});else if(k(this._config.chunk)&&!n){if(this._config.chunk(u,this._handle),this._handle.paused()||this._handle.aborted())return void(this._halted=!0);u=void 0,this._completeResults=void 0}return this._config.step||this._config.chunk||(this._completeResults.data=this._completeResults.data.concat(u.data),this._completeResults.errors=this._completeResults.errors.concat(u.errors),this._completeResults.meta=u.meta),this._completed||!s||!k(this._config.complete)||u&&u.meta.aborted||(this._config.complete(this._completeResults,this._input),this._completed=!0),s||u&&u.meta.paused||this._nextChunk(),u}this._halted=!0},this._sendError=function(e){k(this._config.error)?this._config.error(e):r&&this._config.error&&t.postMessage({workerId:o.WORKER_ID,error:e,finished:!1})}}function s(e){var t;(e=e||{}).chunkSize||(e.chunkSize=o.RemoteChunkSize),l.call(this,e),this._nextChunk=n?function(){this._readChunk(),this._chunkLoaded()}:function(){this._readChunk()},this.stream=function(e){this._input=e,this._nextChunk()},this._readChunk=function(){if(this._finished)this._chunkLoaded();else{if(t=new XMLHttpRequest,this._config.withCredentials&&(t.withCredentials=this._config.withCredentials),n||(t.onload=w(this._chunkLoaded,this),t.onerror=w(this._chunkError,this)),t.open(this._config.downloadRequestBody?"POST":"GET",this._input,!n),this._config.downloadRequestHeaders){var e=this._config.downloadRequestHeaders;for(var r in e)t.setRequestHeader(r,e[r])}if(this._config.chunkSize){var a=this._start+this._config.chunkSize-1;t.setRequestHeader("Range","bytes="+this._start+"-"+a)}try{t.send(this._config.downloadRequestBody)}catch(e){this._chunkError(e.message)}n&&0===t.status&&this._chunkError()}},this._chunkLoaded=function(){4===t.readyState&&(t.status<200||400<=t.status?this._chunkError():(this._start+=this._config.chunkSize?this._config.chunkSize:t.responseText.length,this._finished=!this._config.chunkSize||this._start>=function(e){var t=e.getResponseHeader("Content-Range");return null===t?-1:parseInt(t.substring(t.lastIndexOf("/")+1))}(t),this.parseChunk(t.responseText)))},this._chunkError=function(e){var n=t.statusText||e;this._sendError(new Error(n))}}function c(e){var t,n;(e=e||{}).chunkSize||(e.chunkSize=o.LocalChunkSize),l.call(this,e);var r="undefined"!=typeof FileReader;this.stream=function(e){this._input=e,n=e.slice||e.webkitSlice||e.mozSlice,r?((t=new FileReader).onload=w(this._chunkLoaded,this),t.onerror=w(this._chunkError,this)):t=new FileReaderSync,this._nextChunk()},this._nextChunk=function(){this._finished||this._config.preview&&!(this._rowCount=this._input.size,this.parseChunk(e.target.result)},this._chunkError=function(){this._sendError(t.error)}}function f(e){var t;l.call(this,e=e||{}),this.stream=function(e){return t=e,this._nextChunk()},this._nextChunk=function(){if(!this._finished){var e,n=this._config.chunkSize;return n?(e=t.substring(0,n),t=t.substring(n)):(e=t,t=""),this._finished=!t,this.parseChunk(e)}}}function d(e){l.call(this,e=e||{});var t=[],n=!0,r=!1;this.pause=function(){l.prototype.pause.apply(this,arguments),this._input.pause()},this.resume=function(){l.prototype.resume.apply(this,arguments),this._input.resume()},this.stream=function(e){this._input=e,this._input.on("data",this._streamData),this._input.on("end",this._streamEnd),this._input.on("error",this._streamError)},this._checkIsFinished=function(){r&&1===t.length&&(this._finished=!0)},this._nextChunk=function(){this._checkIsFinished(),t.length?this.parseChunk(t.shift()):n=!0},this._streamData=w((function(e){try{t.push("string"==typeof e?e:e.toString(this._config.encoding)),n&&(n=!1,this._checkIsFinished(),this.parseChunk(t.shift()))}catch(e){this._streamError(e)}}),this),this._streamError=w((function(e){this._streamCleanUp(),this._sendError(e)}),this),this._streamEnd=w((function(){this._streamCleanUp(),r=!0,this._streamData("")}),this),this._streamCleanUp=w((function(){this._input.removeListener("data",this._streamData),this._input.removeListener("end",this._streamEnd),this._input.removeListener("error",this._streamError)}),this)}function h(e){var t,n,r,a=Math.pow(2,53),i=-a,u=/^\s*-?(\d+\.?|\.\d+|\d+\.\d+)([eE][-+]?\d+)?\s*$/,l=/^((\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z))|(\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d([+-][0-2]\d:[0-5]\d|Z)))$/,s=this,c=0,f=0,d=!1,h=!1,m=[],y={data:[],errors:[],meta:{}};if(k(e.step)){var g=e.step;e.step=function(t){if(y=t,x())S();else{if(S(),0===y.data.length)return;c+=t.data.length,e.preview&&c>e.preview?n.abort():(y.data=y.data[0],g(y,s))}}}function w(t){return"greedy"===e.skipEmptyLines?""===t.join("").trim():1===t.length&&0===t[0].length}function S(){return y&&r&&(C("Delimiter","UndetectableDelimiter","Unable to auto-detect delimiting character; defaulted to '"+o.DefaultDelimiter+"'"),r=!1),e.skipEmptyLines&&(y.data=y.data.filter((function(e){return!w(e)}))),x()&&function(){if(y)if(Array.isArray(y.data[0])){for(var t=0;x()&&t=m.length?"__parsed_extra":m[r]),e.transform&&(o=e.transform(o,i)),o=E(i,o),"__parsed_extra"===i?(a[i]=a[i]||[],a[i].push(o)):a[i]=o}return e.header&&(r>m.length?C("FieldMismatch","TooManyFields","Too many fields: expected "+m.length+" fields but parsed "+r,f+n):r=r.length/2?"\r\n":"\r"}(a,l)),r=!1,e.delimiter)k(e.delimiter)&&(e.delimiter=e.delimiter(a),y.meta.delimiter=e.delimiter);else{var s=function(t,n,r,a,i){var u,l,s,c;i=i||[",","\t","|",";",o.RECORD_SEP,o.UNIT_SEP];for(var f=0;f=u)return B(!0)}else for(A=c,c++;;){if(-1===(A=o.indexOf(t,A+1)))return h||S.push({type:"Quotes",code:"MissingQuotes",message:"Quoted field unterminated",row:w.length,index:c}),Z();if(A===v-1)return Z(o.substring(c,A).replace(M,t));if(t!==s||o[A+1]!==s){if(t===s||0===A||o[A-1]!==s){-1!==z&&z=u)return B(!0);break}S.push({type:"Quotes",code:"InvalidQuotes",message:"Trailing quote on quoted field is malformed",row:w.length,index:c}),A++}}else A++}return Z();function W(e){w.push(e),E=c}function q(e){var t=0;if(-1!==e){var n=o.substring(A+1,e);n&&""===n.trim()&&(t=n.length)}return t}function Z(e){return h||(void 0===e&&(e=o.substring(c)),x.push(e),c=v,W(x),b&&H()),B()}function V(e){c=e,W(x),x=[],I=o.indexOf(r,c)}function B(e){return{data:w,errors:S,meta:{delimiter:n,linebreak:r,aborted:f,truncated:!!e,cursor:E+(d||0)}}}function H(){i(B()),w=[],S=[]}},this.abort=function(){f=!0},this.getCharIndex=function(){return c}}function m(e){var t=e.data,n=a[t.workerId],r=!1;if(t.error)n.userError(t.error,t.file);else if(t.results&&t.results.data){var i={abort:function(){r=!0,y(t.workerId,{data:[],errors:[],meta:{aborted:!0}})},pause:g,resume:g};if(k(n.userStep)){for(var o=0;o=this.getNumEmptyDaysAtStart()+this.getDateDifferenceInDays())&&!this.props.showOutOfRangeDays)return null;var a=f(this.getSquareCoordinates(t),2),o=a[0],u=a[1],l=this.getValueForIndex(n),s=e.createElement("rect",i({key:n,width:N,height:N,x:o,y:u,className:this.getClassNameForIndex(n),onClick:function(){return r.handleClick(l)},onMouseOver:function(e){return r.handleMouseOver(e,l)},onMouseLeave:function(e){return r.handleMouseLeave(e,l)}},this.getTooltipDataAttrsForIndex(n)),e.createElement("title",null,this.getTitleForIndex(n))),c=this.props.transformDayElement;return c?c(s,l,n):s}},{key:"renderWeek",value:function(t){var n=this;return e.createElement("g",{key:t,transform:this.getTransformForWeek(t),className:"".concat(j,"week")},T(E).map((function(e){return n.renderSquare(e,t*E+e)})))}},{key:"renderAllWeeks",value:function(){var e=this;return T(this.getWeekCount()).map((function(t){return e.renderWeek(t)}))}},{key:"renderMonthLabels",value:function(){var t=this;return this.props.showMonthLabels?T(this.getWeekCount()-1).map((function(n){var r=O(t.getStartDateWithEmptyDays(),(n+1)*E),a=f(t.getMonthLabelCoordinates(n),2),i=a[0],o=a[1];return r.getDate()>=1&&r.getDate()<=E?e.createElement("text",{key:n,x:i,y:o,className:"".concat(j,"month-label")},t.props.monthLabels[r.getMonth()]):null})):null}},{key:"renderWeekdayLabels",value:function(){var t=this;return this.props.showWeekdayLabels?this.props.weekdayLabels.map((function(n,r){var a=f(t.getWeekdayLabelCoordinates(r),2),i=a[0],o=a[1],u="".concat(t.props.horizontal?"":"".concat(j,"small-text")," ").concat(j,"weekday-label");return 1&r?e.createElement("text",{key:"".concat(i).concat(o),x:i,y:o,className:u},n):null})):null}},{key:"render",value:function(){return this.valueCache=this.getValueCache(this.props),e.createElement("svg",{className:"react-calendar-heatmap",viewBox:this.getViewBox()},e.createElement("g",{transform:this.getTransformForMonthLabels(),className:"".concat(j,"month-labels")},this.renderMonthLabels()),e.createElement("g",{transform:this.getTransformForAllWeeks(),className:"".concat(j,"all-weeks")},this.renderAllWeeks()),e.createElement("g",{transform:this.getTransformForWeekdayLabels(),className:"".concat(j,"weekday-labels")},this.renderWeekdayLabels()))}}]),l}(e.Component);return F.propTypes={values:w.arrayOf(w.shape({date:w.oneOfType([w.string,w.number,w.instanceOf(Date)]).isRequired}).isRequired).isRequired,numDays:w.number,startDate:w.oneOfType([w.string,w.number,w.instanceOf(Date)]),endDate:w.oneOfType([w.string,w.number,w.instanceOf(Date)]),gutterSize:w.number,horizontal:w.bool,showMonthLabels:w.bool,showWeekdayLabels:w.bool,showOutOfRangeDays:w.bool,tooltipDataAttrs:w.oneOfType([w.object,w.func]),titleForValue:w.func,classForValue:w.func,monthLabels:w.arrayOf(w.string),weekdayLabels:w.arrayOf(w.string),onClick:w.func,onMouseOver:w.func,onMouseLeave:w.func,transformDayElement:w.func},F.defaultProps={numDays:null,startDate:L(200),endDate:new Date,gutterSize:1,horizontal:!0,showMonthLabels:!0,showWeekdayLabels:!1,showOutOfRangeDays:!1,tooltipDataAttrs:null,titleForValue:null,classForValue:function(e){return e?"color-filled":"color-empty"},monthLabels:C,weekdayLabels:_,onClick:null,onMouseOver:null,onMouseLeave:null,transformDayElement:null},F}(n(2791))},4463:function(e,t,n){"use strict";var r=n(2791),a=n(5296);function i(e){for(var t="https://reactjs.org/docs/error-decoder.html?invariant="+e,n=1;n

\n \n \n
\n {children}\n
\n
\n ,\n document.getElementById(\"modals\")\n );\n}\n","import { useEffect, useState, useMemo } from \"react\";\nimport PropTypes from \"prop-types\";\nimport Modal from \"./Modal\";\nimport useParsedCsv from \"../hooks/use-parsed-csv\";\nimport { minutesToHoursAndMinutes } from \"../utils/time\";\nimport { HiFire } from \"react-icons/hi\";\n\nimport CalendarHeatmap from \"react-calendar-heatmap\";\nimport \"react-calendar-heatmap/dist/styles.css\";\n\nexport const colorScaleClassFromValue = (value, lowestValue, highestValue) => {\n if (!value || !lowestValue || !highestValue || value == 0) {\n return \"color-empty\";\n }\n const percentage = (parseFloat(value) - lowestValue) / parseFloat(highestValue - lowestValue);\n // round to nearest .25 then convert to number from 0 to 4\n const colorScaleNumber = (Math.round(percentage * 4) / 4).toFixed(2) / 0.25;\n return `color-scale-${colorScaleNumber}`;\n};\n\nReviewsHeatmap.propTypes = {\n csvData: PropTypes.any,\n csvDataIsLoading: PropTypes.bool,\n chartTitle: PropTypes.string,\n};\n\n/**\n * @param {array<{\"Date\": string, \"Time (mins)\": number}> | undefined} csvData - Data from a CSV request, should contain at least\n * `Date` and `\"Time (mins)\"` columns, represented as keys in the objects in the array\n * @param {boolean} csvDataIsLoading - Indicates that the data is still being loaded\n * @param {string} chartTitle - The title to be displayed over the heatmap chart.\n */\nexport default function ReviewsHeatmap ({csvData, csvDataIsLoading, chartTitle}) {\n const [firstDate, setFirstDate] = useState();\n const [lastDate, setLastDate] = useState();\n const [highestValue, setHighestValue] = useState();\n const [lowestValue, setLowestValue] = useState();\n const [totalTimeString, setTotalTimeString] = useState(\"\");\n const [totalDaysString, setTotalDaysString] = useState(\"\");\n const [timeLabel, setTimeLabel] = useState(\"\");\n const [dayLabel, setDayLabel] = useState(\"\");\n const [showDataModal, setShowDataModal] = useState(false);\n\n /**\n * Expects a CSV with at least two columns named `Date` and `Time (mins)`.\n * @example\n * ```csv\n * Date,Time (mins)\n * 2/6/2023,36\n * 2/5/2023,96\n * 2/4/2023,75\n * 2/3/2023,1\n * ```\n */\n const parsedCsvData = useParsedCsv(csvDataIsLoading, csvData);\n\n const dataModalContent = useMemo(() => {\n return(\n
\n \n {chartTitle} data\n \n
    \n {parsedCsvData.map((row, index) => {\n return(\n
  • \n {(new Date(row[\"Date\"])).toLocaleDateString(\"en-US\", {timeStyle: undefined, day: \"2-digit\", month: \"2-digit\", year: \"numeric\"})}: {row[\"Time (mins)\"]} mins\n
  • \n );\n })}\n
\n
\n );\n }, [parsedCsvData]);\n\n useEffect(() => {\n // sort by date, removing days with 0 minutes of study because these can't\n // be the first or last days of actual study\n const csvDataSortedByDate = parsedCsvData\n .filter((row) => row[\"Time (mins)\"] > 0)\n .sort((a, b) => new Date(b[\"Date\"]) - new Date(a[\"Date\"]));\n\n const firstEntry = csvDataSortedByDate[csvDataSortedByDate.length - 1];\n if (firstEntry) {\n setFirstDate(new Date(firstEntry[\"Date\"]));\n }\n const latestEntry = csvDataSortedByDate[0];\n if (latestEntry) {\n setLastDate(new Date(latestEntry[\"Date\"]));\n }\n }, [parsedCsvData]);\n\n useEffect(() => {\n const csvDataSortedByStudyTime = parsedCsvData.sort((a, b) => b[\"Time (mins)\"] - a[\"Time (mins)\"]);\n\n const highestEntry = csvDataSortedByStudyTime[0];\n if (highestEntry) {\n setHighestValue(highestEntry[\"Time (mins)\"]);\n }\n const lowestEntry = csvDataSortedByStudyTime[csvDataSortedByStudyTime.length - 1];\n if (lowestEntry) {\n setLowestValue(lowestEntry[\"Time (mins)\"]);\n }\n }, [parsedCsvData]);\n\n useEffect(() => {\n const totalMinutes = parsedCsvData.map(row => parseInt(row[\"Time (mins)\"])).reduce((a, b) => a + b, 0);\n const formattedTime = minutesToHoursAndMinutes(totalMinutes);\n setTotalTimeString(`${formattedTime.hours}hrs ${formattedTime.minutes}mins`);\n setTimeLabel(`${formattedTime.hours}hrs ${formattedTime.minutes}mins`);\n\n const totalDays = parsedCsvData.filter(row => parseInt(row[\"Time (mins)\"]) > 0).length;\n setTotalDaysString(`${totalDays} days`);\n setDayLabel(`${totalDays} days`);\n }, [parsedCsvData]);\n\n if (csvDataIsLoading) {\n return

Fetching csv file...

;\n }\n\n if (!firstDate || !lastDate || !highestValue || !lowestValue) {\n return

Processing data...

;\n }\n\n // 🐛 https://github.com/kevinsqi/react-calendar-heatmap/issues/203\n // if the start date is after 11/11/2022, 03/13/2023 gets dropped from the calendar\n const maxStartDate = new Date(\"11/11/2022\");\n const bugfixStartDate = firstDate > maxStartDate ? maxStartDate : firstDate;\n\n return(\n {\n if (e.target.tagName != \"rect\") {\n setTimeLabel(totalTimeString);\n setDayLabel(totalDaysString);\n }\n }}\n style={{width: \"100%\"}}\n >\n setShowDataModal(s => !s)}\n style={{\n margin: \"4px 0 2px 0\",\n padding: \"0\",\n fontSize: \"28px\",\n fontWeight: \"600\"\n }}\n >\n {chartTitle}\n \n
\n

\n {dayLabel === totalDaysString && }\n {dayLabel}\n

\n

{timeLabel}

\n
\n
\n {\n return { date: row[\"Date\"], count: row[\"Time (mins)\"] };\n })}\n classForValue={(value) => colorScaleClassFromValue(value?.count, lowestValue, highestValue)}\n titleForValue={(value) => {\n if (value) return `${value.date}, ${parseInt(value.count)} minutes`;\n return \"No value\";\n }}\n onClick={(value) => {\n if (value) {\n setTimeLabel(`${parseInt(value.count)} minutes`);\n setDayLabel(value.date);\n }\n }}\n />\n
\n {showDataModal && setShowDataModal(s => !s)}>{dataModalContent}}\n \n );\n}\n","import { useMemo } from \"react\";\nimport { parseCsvFile } from \"../utils/parsing\";\n\nconst useParsedCsv = (isLoading, data) => {\n const parsedCsvData = useMemo(() => {\n if (isLoading) {\n return [];\n }\n return parseCsvFile(data);\n }, [isLoading, data]);\n\n return parsedCsvData;\n};\n\nexport default useParsedCsv;\n","import { useQuery } from \"react-query\";\nimport { fetchAggregatedImmersion } from \"../utils/csv-fetching\";\nimport { createContext } from \"react\";\nimport PropTypes from \"prop-types\";\n\nconst QUERY_CACHE_KEY = \"aggregated-immersion\";\n\nexport const AggregatedImmersionContext = createContext({\n aggregatedImmersionData: undefined,\n aggregatedImmersionIsLoading: true,\n});\n\nAggregatedImmersionProvider.propTypes = {\n children: PropTypes.element,\n};\n\nexport default function AggregatedImmersionProvider({ children }) {\n const { data: aggregatedImmersionData, isLoading: aggregatedImmersionIsLoading } = useQuery({ queryKey: [QUERY_CACHE_KEY], queryFn: fetchAggregatedImmersion });\n\n return (\n \n {children}\n \n );\n}\n","import { useQuery } from \"react-query\";\nimport { fetchAnki } from \"../utils/csv-fetching\";\nimport { createContext } from \"react\";\nimport PropTypes from \"prop-types\";\n\nconst QUERY_CACHE_KEY = \"anki\";\n\nexport const AnkiContext = createContext({\n ankiData: undefined,\n ankiIsLoading: true,\n});\n\nAnkiProvider.propTypes = {\n children: PropTypes.element,\n};\n\nexport default function AnkiProvider({ children }) {\n const { data: ankiData, isLoading: ankiIsLoading } = useQuery({ queryKey: [QUERY_CACHE_KEY], queryFn: fetchAnki });\n\n return (\n \n {children}\n \n );\n}\n","import { useQuery } from \"react-query\";\nimport { fetchBunpro } from \"../utils/csv-fetching\";\nimport { createContext } from \"react\";\nimport PropTypes from \"prop-types\";\n\nconst QUERY_CACHE_KEY = \"bunpro\";\n\nexport const BunproContenxt = createContext({\n bunproData: undefined,\n bunproIsLoading: true,\n});\n\nBunproProvider.propTypes = {\n children: PropTypes.element,\n};\n\nexport default function BunproProvider({ children }) {\n const { data: bunproData, isLoading: bunproIsLoading } = useQuery({ queryKey: [QUERY_CACHE_KEY], queryFn: fetchBunpro });\n\n return (\n \n {children}\n \n );\n}\n","import { useQuery } from \"react-query\";\nimport { fetchImmersion } from \"../utils/csv-fetching\";\nimport { createContext } from \"react\";\nimport PropTypes from \"prop-types\";\n\nconst QUERY_CACHE_KEY = \"immersion\";\n\nexport const ImmersionContext = createContext({\n immersionData: undefined,\n immersionIsLoading: true,\n});\n\nImmersionProvider.propTypes = {\n children: PropTypes.element,\n};\n\nexport default function ImmersionProvider({ children }) {\n const { data: immersionData, isLoading: immersionIsLoading } = useQuery({ queryKey: [QUERY_CACHE_KEY], queryFn: fetchImmersion });\n\n return (\n \n {children}\n \n );\n}\n","import { useQuery } from \"react-query\";\nimport { fetchJpdb } from \"../utils/csv-fetching\";\nimport { createContext } from \"react\";\nimport PropTypes from \"prop-types\";\n\nconst QUERY_CACHE_KEY = \"jpdb\";\n\nexport const JpdbContext = createContext({\n jpdbData: undefined,\n jpdbIsLoading: true,\n});\n\nJpdbProvider.propTypes = {\n children: PropTypes.element,\n};\n\nexport default function JpdbProvider({ children }) {\n const { data: jpdbData, isLoading: jpdbIsLoading } = useQuery({ queryKey: [QUERY_CACHE_KEY], queryFn: fetchJpdb });\n\n return (\n \n {children}\n \n );\n}\n","import _typeof from \"./typeof.js\";\nexport default function _regeneratorRuntime() {\n \"use strict\"; /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */\n _regeneratorRuntime = function _regeneratorRuntime() {\n return exports;\n };\n var exports = {},\n Op = Object.prototype,\n hasOwn = Op.hasOwnProperty,\n defineProperty = Object.defineProperty || function (obj, key, desc) {\n obj[key] = desc.value;\n },\n $Symbol = \"function\" == typeof Symbol ? Symbol : {},\n iteratorSymbol = $Symbol.iterator || \"@@iterator\",\n asyncIteratorSymbol = $Symbol.asyncIterator || \"@@asyncIterator\",\n toStringTagSymbol = $Symbol.toStringTag || \"@@toStringTag\";\n function define(obj, key, value) {\n return Object.defineProperty(obj, key, {\n value: value,\n enumerable: !0,\n configurable: !0,\n writable: !0\n }), obj[key];\n }\n try {\n define({}, \"\");\n } catch (err) {\n define = function define(obj, key, value) {\n return obj[key] = value;\n };\n }\n function wrap(innerFn, outerFn, self, tryLocsList) {\n var protoGenerator = outerFn && outerFn.prototype instanceof Generator ? outerFn : Generator,\n generator = Object.create(protoGenerator.prototype),\n context = new Context(tryLocsList || []);\n return defineProperty(generator, \"_invoke\", {\n value: makeInvokeMethod(innerFn, self, context)\n }), generator;\n }\n function tryCatch(fn, obj, arg) {\n try {\n return {\n type: \"normal\",\n arg: fn.call(obj, arg)\n };\n } catch (err) {\n return {\n type: \"throw\",\n arg: err\n };\n }\n }\n exports.wrap = wrap;\n var ContinueSentinel = {};\n function Generator() {}\n function GeneratorFunction() {}\n function GeneratorFunctionPrototype() {}\n var IteratorPrototype = {};\n define(IteratorPrototype, iteratorSymbol, function () {\n return this;\n });\n var getProto = Object.getPrototypeOf,\n NativeIteratorPrototype = getProto && getProto(getProto(values([])));\n NativeIteratorPrototype && NativeIteratorPrototype !== Op && hasOwn.call(NativeIteratorPrototype, iteratorSymbol) && (IteratorPrototype = NativeIteratorPrototype);\n var Gp = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(IteratorPrototype);\n function defineIteratorMethods(prototype) {\n [\"next\", \"throw\", \"return\"].forEach(function (method) {\n define(prototype, method, function (arg) {\n return this._invoke(method, arg);\n });\n });\n }\n function AsyncIterator(generator, PromiseImpl) {\n function invoke(method, arg, resolve, reject) {\n var record = tryCatch(generator[method], generator, arg);\n if (\"throw\" !== record.type) {\n var result = record.arg,\n value = result.value;\n return value && \"object\" == _typeof(value) && hasOwn.call(value, \"__await\") ? PromiseImpl.resolve(value.__await).then(function (value) {\n invoke(\"next\", value, resolve, reject);\n }, function (err) {\n invoke(\"throw\", err, resolve, reject);\n }) : PromiseImpl.resolve(value).then(function (unwrapped) {\n result.value = unwrapped, resolve(result);\n }, function (error) {\n return invoke(\"throw\", error, resolve, reject);\n });\n }\n reject(record.arg);\n }\n var previousPromise;\n defineProperty(this, \"_invoke\", {\n value: function value(method, arg) {\n function callInvokeWithMethodAndArg() {\n return new PromiseImpl(function (resolve, reject) {\n invoke(method, arg, resolve, reject);\n });\n }\n return previousPromise = previousPromise ? previousPromise.then(callInvokeWithMethodAndArg, callInvokeWithMethodAndArg) : callInvokeWithMethodAndArg();\n }\n });\n }\n function makeInvokeMethod(innerFn, self, context) {\n var state = \"suspendedStart\";\n return function (method, arg) {\n if (\"executing\" === state) throw new Error(\"Generator is already running\");\n if (\"completed\" === state) {\n if (\"throw\" === method) throw arg;\n return doneResult();\n }\n for (context.method = method, context.arg = arg;;) {\n var delegate = context.delegate;\n if (delegate) {\n var delegateResult = maybeInvokeDelegate(delegate, context);\n if (delegateResult) {\n if (delegateResult === ContinueSentinel) continue;\n return delegateResult;\n }\n }\n if (\"next\" === context.method) context.sent = context._sent = context.arg;else if (\"throw\" === context.method) {\n if (\"suspendedStart\" === state) throw state = \"completed\", context.arg;\n context.dispatchException(context.arg);\n } else \"return\" === context.method && context.abrupt(\"return\", context.arg);\n state = \"executing\";\n var record = tryCatch(innerFn, self, context);\n if (\"normal\" === record.type) {\n if (state = context.done ? \"completed\" : \"suspendedYield\", record.arg === ContinueSentinel) continue;\n return {\n value: record.arg,\n done: context.done\n };\n }\n \"throw\" === record.type && (state = \"completed\", context.method = \"throw\", context.arg = record.arg);\n }\n };\n }\n function maybeInvokeDelegate(delegate, context) {\n var methodName = context.method,\n method = delegate.iterator[methodName];\n if (undefined === method) return context.delegate = null, \"throw\" === methodName && delegate.iterator[\"return\"] && (context.method = \"return\", context.arg = undefined, maybeInvokeDelegate(delegate, context), \"throw\" === context.method) || \"return\" !== methodName && (context.method = \"throw\", context.arg = new TypeError(\"The iterator does not provide a '\" + methodName + \"' method\")), ContinueSentinel;\n var record = tryCatch(method, delegate.iterator, context.arg);\n if (\"throw\" === record.type) return context.method = \"throw\", context.arg = record.arg, context.delegate = null, ContinueSentinel;\n var info = record.arg;\n return info ? info.done ? (context[delegate.resultName] = info.value, context.next = delegate.nextLoc, \"return\" !== context.method && (context.method = \"next\", context.arg = undefined), context.delegate = null, ContinueSentinel) : info : (context.method = \"throw\", context.arg = new TypeError(\"iterator result is not an object\"), context.delegate = null, ContinueSentinel);\n }\n function pushTryEntry(locs) {\n var entry = {\n tryLoc: locs[0]\n };\n 1 in locs && (entry.catchLoc = locs[1]), 2 in locs && (entry.finallyLoc = locs[2], entry.afterLoc = locs[3]), this.tryEntries.push(entry);\n }\n function resetTryEntry(entry) {\n var record = entry.completion || {};\n record.type = \"normal\", delete record.arg, entry.completion = record;\n }\n function Context(tryLocsList) {\n this.tryEntries = [{\n tryLoc: \"root\"\n }], tryLocsList.forEach(pushTryEntry, this), this.reset(!0);\n }\n function values(iterable) {\n if (iterable) {\n var iteratorMethod = iterable[iteratorSymbol];\n if (iteratorMethod) return iteratorMethod.call(iterable);\n if (\"function\" == typeof iterable.next) return iterable;\n if (!isNaN(iterable.length)) {\n var i = -1,\n next = function next() {\n for (; ++i < iterable.length;) {\n if (hasOwn.call(iterable, i)) return next.value = iterable[i], next.done = !1, next;\n }\n return next.value = undefined, next.done = !0, next;\n };\n return next.next = next;\n }\n }\n return {\n next: doneResult\n };\n }\n function doneResult() {\n return {\n value: undefined,\n done: !0\n };\n }\n return GeneratorFunction.prototype = GeneratorFunctionPrototype, defineProperty(Gp, \"constructor\", {\n value: GeneratorFunctionPrototype,\n configurable: !0\n }), defineProperty(GeneratorFunctionPrototype, \"constructor\", {\n value: GeneratorFunction,\n configurable: !0\n }), GeneratorFunction.displayName = define(GeneratorFunctionPrototype, toStringTagSymbol, \"GeneratorFunction\"), exports.isGeneratorFunction = function (genFun) {\n var ctor = \"function\" == typeof genFun && genFun.constructor;\n return !!ctor && (ctor === GeneratorFunction || \"GeneratorFunction\" === (ctor.displayName || ctor.name));\n }, exports.mark = function (genFun) {\n return Object.setPrototypeOf ? Object.setPrototypeOf(genFun, GeneratorFunctionPrototype) : (genFun.__proto__ = GeneratorFunctionPrototype, define(genFun, toStringTagSymbol, \"GeneratorFunction\")), genFun.prototype = Object.create(Gp), genFun;\n }, exports.awrap = function (arg) {\n return {\n __await: arg\n };\n }, defineIteratorMethods(AsyncIterator.prototype), define(AsyncIterator.prototype, asyncIteratorSymbol, function () {\n return this;\n }), exports.AsyncIterator = AsyncIterator, exports.async = function (innerFn, outerFn, self, tryLocsList, PromiseImpl) {\n void 0 === PromiseImpl && (PromiseImpl = Promise);\n var iter = new AsyncIterator(wrap(innerFn, outerFn, self, tryLocsList), PromiseImpl);\n return exports.isGeneratorFunction(outerFn) ? iter : iter.next().then(function (result) {\n return result.done ? result.value : iter.next();\n });\n }, defineIteratorMethods(Gp), define(Gp, toStringTagSymbol, \"Generator\"), define(Gp, iteratorSymbol, function () {\n return this;\n }), define(Gp, \"toString\", function () {\n return \"[object Generator]\";\n }), exports.keys = function (val) {\n var object = Object(val),\n keys = [];\n for (var key in object) {\n keys.push(key);\n }\n return keys.reverse(), function next() {\n for (; keys.length;) {\n var key = keys.pop();\n if (key in object) return next.value = key, next.done = !1, next;\n }\n return next.done = !0, next;\n };\n }, exports.values = values, Context.prototype = {\n constructor: Context,\n reset: function reset(skipTempReset) {\n if (this.prev = 0, this.next = 0, this.sent = this._sent = undefined, this.done = !1, this.delegate = null, this.method = \"next\", this.arg = undefined, this.tryEntries.forEach(resetTryEntry), !skipTempReset) for (var name in this) {\n \"t\" === name.charAt(0) && hasOwn.call(this, name) && !isNaN(+name.slice(1)) && (this[name] = undefined);\n }\n },\n stop: function stop() {\n this.done = !0;\n var rootRecord = this.tryEntries[0].completion;\n if (\"throw\" === rootRecord.type) throw rootRecord.arg;\n return this.rval;\n },\n dispatchException: function dispatchException(exception) {\n if (this.done) throw exception;\n var context = this;\n function handle(loc, caught) {\n return record.type = \"throw\", record.arg = exception, context.next = loc, caught && (context.method = \"next\", context.arg = undefined), !!caught;\n }\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i],\n record = entry.completion;\n if (\"root\" === entry.tryLoc) return handle(\"end\");\n if (entry.tryLoc <= this.prev) {\n var hasCatch = hasOwn.call(entry, \"catchLoc\"),\n hasFinally = hasOwn.call(entry, \"finallyLoc\");\n if (hasCatch && hasFinally) {\n if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0);\n if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc);\n } else if (hasCatch) {\n if (this.prev < entry.catchLoc) return handle(entry.catchLoc, !0);\n } else {\n if (!hasFinally) throw new Error(\"try statement without catch or finally\");\n if (this.prev < entry.finallyLoc) return handle(entry.finallyLoc);\n }\n }\n }\n },\n abrupt: function abrupt(type, arg) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc <= this.prev && hasOwn.call(entry, \"finallyLoc\") && this.prev < entry.finallyLoc) {\n var finallyEntry = entry;\n break;\n }\n }\n finallyEntry && (\"break\" === type || \"continue\" === type) && finallyEntry.tryLoc <= arg && arg <= finallyEntry.finallyLoc && (finallyEntry = null);\n var record = finallyEntry ? finallyEntry.completion : {};\n return record.type = type, record.arg = arg, finallyEntry ? (this.method = \"next\", this.next = finallyEntry.finallyLoc, ContinueSentinel) : this.complete(record);\n },\n complete: function complete(record, afterLoc) {\n if (\"throw\" === record.type) throw record.arg;\n return \"break\" === record.type || \"continue\" === record.type ? this.next = record.arg : \"return\" === record.type ? (this.rval = this.arg = record.arg, this.method = \"return\", this.next = \"end\") : \"normal\" === record.type && afterLoc && (this.next = afterLoc), ContinueSentinel;\n },\n finish: function finish(finallyLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.finallyLoc === finallyLoc) return this.complete(entry.completion, entry.afterLoc), resetTryEntry(entry), ContinueSentinel;\n }\n },\n \"catch\": function _catch(tryLoc) {\n for (var i = this.tryEntries.length - 1; i >= 0; --i) {\n var entry = this.tryEntries[i];\n if (entry.tryLoc === tryLoc) {\n var record = entry.completion;\n if (\"throw\" === record.type) {\n var thrown = record.arg;\n resetTryEntry(entry);\n }\n return thrown;\n }\n }\n throw new Error(\"illegal catch attempt\");\n },\n delegateYield: function delegateYield(iterable, resultName, nextLoc) {\n return this.delegate = {\n iterator: values(iterable),\n resultName: resultName,\n nextLoc: nextLoc\n }, \"next\" === this.method && (this.arg = undefined), ContinueSentinel;\n }\n }, exports;\n}","function asyncGeneratorStep(gen, resolve, reject, _next, _throw, key, arg) {\n try {\n var info = gen[key](arg);\n var value = info.value;\n } catch (error) {\n reject(error);\n return;\n }\n if (info.done) {\n resolve(value);\n } else {\n Promise.resolve(value).then(_next, _throw);\n }\n}\nexport default function _asyncToGenerator(fn) {\n return function () {\n var self = this,\n args = arguments;\n return new Promise(function (resolve, reject) {\n var gen = fn.apply(self, args);\n function _next(value) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"next\", value);\n }\n function _throw(err) {\n asyncGeneratorStep(gen, resolve, reject, _next, _throw, \"throw\", err);\n }\n _next(undefined);\n });\n };\n}","export const fetchImmersion = async () => {\n const response = await fetch(\"https://docs.google.com/spreadsheets/d/e/2PACX-1vQpattUOpPKcUSS8bxlk3P-9OdmCHcNB32FINvEfnQg81WN6OsxK6AIho-gijZROruqizBjlukxKscX/pub?output=csv\");\n return await response.text();\n};\n\nexport const fetchAggregatedImmersion = async () => {\n const response = await fetch(\"https://docs.google.com/spreadsheets/d/e/2PACX-1vQpattUOpPKcUSS8bxlk3P-9OdmCHcNB32FINvEfnQg81WN6OsxK6AIho-gijZROruqizBjlukxKscX/pub?gid=1631773302&single=true&output=csv\");\n return await response.text();\n};\n\nexport const fetchAnki = async () => {\n const response = await fetch(\"https://docs.google.com/spreadsheets/d/e/2PACX-1vRtfhZzd63RTmi_cQ4sTSpLCYbufMKNxdWBrf1fIjqomzeNFRdX1O6DBXUUNcfwNQuRaY-TTp_Fa5M3/pub?gid=0&single=true&output=csv\");\n const csv = await response.text();\n return csv;\n};\n\nexport const fetchJpdb = async () => {\n // const response = await fetch(\"https://docs.google.com/spreadsheets/d/e/2PACX-1vQdhJ2te76EStGko41NZ8GGge8Sv2C9tG6Qh2gspis6G7-e28NUHjDhG-xGbDMsApNxLCWFPwtGOgTi/pub?gid=0&single=true&output=csv\");\n const response = await fetch(\"https://raw.githubusercontent.com/jhunschejones/Ruby-Scripts/master/jpdb_daily_study_time/daily_study_time.csv\");\n const csv = await response.text();\n return csv;\n};\n\nexport const fetchBunpro = async () => {\n const response = await fetch(\"https://docs.google.com/spreadsheets/d/e/2PACX-1vQhPY-bvFduC3LEIPRsp4bFOQm4J1VH2FQwIOWRHc6Z3Q5j0VKfl8xGdS5wBuAW4nJYIyx-2lzpw4VO/pub?gid=0&single=true&output=csv\");\n const csv = await response.text();\n return csv;\n};\n","import Papa from \"papaparse\";\n\n/**\n * parses a csv file and passes the results to a callback function\n * @param {file} file - the csv file to parse\n */\nexport const parseCsvFile = (file) => {\n return Papa.parse(file, {\n header: true,\n skipEmptyLines: \"greedy\"\n }).data;\n};\n","export const minutesToHoursAndMinutes = (totalMinutes) => {\n const hours = Math.floor(totalMinutes / 60);\n const minutes = totalMinutes % 60;\n return { hours, minutes };\n};\n\nexport const minutesToHoursAndMinutesString = (totalMinutes) => {\n const [ hours, minutes ] = Object.values(minutesToHoursAndMinutes(totalMinutes));\n return `${hours}:${minutes.toString().padStart(2, \"0\")}`;\n};\n","import setPrototypeOf from \"./setPrototypeOf.js\";\nimport isNativeReflectConstruct from \"./isNativeReflectConstruct.js\";\nexport default function _construct(Parent, args, Class) {\n if (isNativeReflectConstruct()) {\n _construct = Reflect.construct.bind();\n } else {\n _construct = function _construct(Parent, args, Class) {\n var a = [null];\n a.push.apply(a, args);\n var Constructor = Function.bind.apply(Parent, a);\n var instance = new Constructor();\n if (Class) setPrototypeOf(instance, Class.prototype);\n return instance;\n };\n }\n return _construct.apply(null, arguments);\n}","import getPrototypeOf from \"./getPrototypeOf.js\";\nimport setPrototypeOf from \"./setPrototypeOf.js\";\nimport isNativeFunction from \"./isNativeFunction.js\";\nimport construct from \"./construct.js\";\nexport default function _wrapNativeSuper(Class) {\n var _cache = typeof Map === \"function\" ? new Map() : undefined;\n _wrapNativeSuper = function _wrapNativeSuper(Class) {\n if (Class === null || !isNativeFunction(Class)) return Class;\n if (typeof Class !== \"function\") {\n throw new TypeError(\"Super expression must either be null or a function\");\n }\n if (typeof _cache !== \"undefined\") {\n if (_cache.has(Class)) return _cache.get(Class);\n _cache.set(Class, Wrapper);\n }\n function Wrapper() {\n return construct(Class, arguments, getPrototypeOf(this).constructor);\n }\n Wrapper.prototype = Object.create(Class.prototype, {\n constructor: {\n value: Wrapper,\n enumerable: false,\n writable: true,\n configurable: true\n }\n });\n return setPrototypeOf(Wrapper, Class);\n };\n return _wrapNativeSuper(Class);\n}","export default function _isNativeFunction(fn) {\n return Function.toString.call(fn).indexOf(\"[native code]\") !== -1;\n}","////////////////////////////////////////////////////////////////////////////////\n//#region Types and Constants\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Actions represent the type of change to a location value.\n */\nexport enum Action {\n /**\n * A POP indicates a change to an arbitrary index in the history stack, such\n * as a back or forward navigation. It does not describe the direction of the\n * navigation, only that the current index changed.\n *\n * Note: This is the default action for newly created history objects.\n */\n Pop = \"POP\",\n\n /**\n * A PUSH indicates a new entry being added to the history stack, such as when\n * a link is clicked and a new page loads. When this happens, all subsequent\n * entries in the stack are lost.\n */\n Push = \"PUSH\",\n\n /**\n * A REPLACE indicates the entry at the current index in the history stack\n * being replaced by a new one.\n */\n Replace = \"REPLACE\",\n}\n\n/**\n * The pathname, search, and hash values of a URL.\n */\nexport interface Path {\n /**\n * A URL pathname, beginning with a /.\n */\n pathname: string;\n\n /**\n * A URL search string, beginning with a ?.\n */\n search: string;\n\n /**\n * A URL fragment identifier, beginning with a #.\n */\n hash: string;\n}\n\n/**\n * An entry in a history stack. A location contains information about the\n * URL path, as well as possibly some arbitrary state and a key.\n */\nexport interface Location extends Path {\n /**\n * A value of arbitrary data associated with this location.\n */\n state: any;\n\n /**\n * A unique string associated with this location. May be used to safely store\n * and retrieve data in some other storage API, like `localStorage`.\n *\n * Note: This value is always \"default\" on the initial location.\n */\n key: string;\n}\n\n/**\n * A change to the current location.\n */\nexport interface Update {\n /**\n * The action that triggered the change.\n */\n action: Action;\n\n /**\n * The new location.\n */\n location: Location;\n\n /**\n * The delta between this location and the former location in the history stack\n */\n delta: number | null;\n}\n\n/**\n * A function that receives notifications about location changes.\n */\nexport interface Listener {\n (update: Update): void;\n}\n\n/**\n * Describes a location that is the destination of some navigation, either via\n * `history.push` or `history.replace`. May be either a URL or the pieces of a\n * URL path.\n */\nexport type To = string | Partial;\n\n/**\n * A history is an interface to the navigation stack. The history serves as the\n * source of truth for the current location, as well as provides a set of\n * methods that may be used to change it.\n *\n * It is similar to the DOM's `window.history` object, but with a smaller, more\n * focused API.\n */\nexport interface History {\n /**\n * The last action that modified the current location. This will always be\n * Action.Pop when a history instance is first created. This value is mutable.\n */\n readonly action: Action;\n\n /**\n * The current location. This value is mutable.\n */\n readonly location: Location;\n\n /**\n * Returns a valid href for the given `to` value that may be used as\n * the value of an attribute.\n *\n * @param to - The destination URL\n */\n createHref(to: To): string;\n\n /**\n * Returns a URL for the given `to` value\n *\n * @param to - The destination URL\n */\n createURL(to: To): URL;\n\n /**\n * Encode a location the same way window.history would do (no-op for memory\n * history) so we ensure our PUSH/REPLACE navigations for data routers\n * behave the same as POP\n *\n * @param to Unencoded path\n */\n encodeLocation(to: To): Path;\n\n /**\n * Pushes a new location onto the history stack, increasing its length by one.\n * If there were any entries in the stack after the current one, they are\n * lost.\n *\n * @param to - The new URL\n * @param state - Data to associate with the new location\n */\n push(to: To, state?: any): void;\n\n /**\n * Replaces the current location in the history stack with a new one. The\n * location that was replaced will no longer be available.\n *\n * @param to - The new URL\n * @param state - Data to associate with the new location\n */\n replace(to: To, state?: any): void;\n\n /**\n * Navigates `n` entries backward/forward in the history stack relative to the\n * current index. For example, a \"back\" navigation would use go(-1).\n *\n * @param delta - The delta in the stack index\n */\n go(delta: number): void;\n\n /**\n * Sets up a listener that will be called whenever the current location\n * changes.\n *\n * @param listener - A function that will be called when the location changes\n * @returns unlisten - A function that may be used to stop listening\n */\n listen(listener: Listener): () => void;\n}\n\ntype HistoryState = {\n usr: any;\n key?: string;\n idx: number;\n};\n\nconst PopStateEventType = \"popstate\";\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Memory History\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * A user-supplied object that describes a location. Used when providing\n * entries to `createMemoryHistory` via its `initialEntries` option.\n */\nexport type InitialEntry = string | Partial;\n\nexport type MemoryHistoryOptions = {\n initialEntries?: InitialEntry[];\n initialIndex?: number;\n v5Compat?: boolean;\n};\n\n/**\n * A memory history stores locations in memory. This is useful in stateful\n * environments where there is no web browser, such as node tests or React\n * Native.\n */\nexport interface MemoryHistory extends History {\n /**\n * The current index in the history stack.\n */\n readonly index: number;\n}\n\n/**\n * Memory history stores the current location in memory. It is designed for use\n * in stateful non-browser environments like tests and React Native.\n */\nexport function createMemoryHistory(\n options: MemoryHistoryOptions = {}\n): MemoryHistory {\n let { initialEntries = [\"/\"], initialIndex, v5Compat = false } = options;\n let entries: Location[]; // Declare so we can access from createMemoryLocation\n entries = initialEntries.map((entry, index) =>\n createMemoryLocation(\n entry,\n typeof entry === \"string\" ? null : entry.state,\n index === 0 ? \"default\" : undefined\n )\n );\n let index = clampIndex(\n initialIndex == null ? entries.length - 1 : initialIndex\n );\n let action = Action.Pop;\n let listener: Listener | null = null;\n\n function clampIndex(n: number): number {\n return Math.min(Math.max(n, 0), entries.length - 1);\n }\n function getCurrentLocation(): Location {\n return entries[index];\n }\n function createMemoryLocation(\n to: To,\n state: any = null,\n key?: string\n ): Location {\n let location = createLocation(\n entries ? getCurrentLocation().pathname : \"/\",\n to,\n state,\n key\n );\n warning(\n location.pathname.charAt(0) === \"/\",\n `relative pathnames are not supported in memory history: ${JSON.stringify(\n to\n )}`\n );\n return location;\n }\n\n function createHref(to: To) {\n return typeof to === \"string\" ? to : createPath(to);\n }\n\n let history: MemoryHistory = {\n get index() {\n return index;\n },\n get action() {\n return action;\n },\n get location() {\n return getCurrentLocation();\n },\n createHref,\n createURL(to) {\n return new URL(createHref(to), \"http://localhost\");\n },\n encodeLocation(to: To) {\n let path = typeof to === \"string\" ? parsePath(to) : to;\n return {\n pathname: path.pathname || \"\",\n search: path.search || \"\",\n hash: path.hash || \"\",\n };\n },\n push(to, state) {\n action = Action.Push;\n let nextLocation = createMemoryLocation(to, state);\n index += 1;\n entries.splice(index, entries.length, nextLocation);\n if (v5Compat && listener) {\n listener({ action, location: nextLocation, delta: 1 });\n }\n },\n replace(to, state) {\n action = Action.Replace;\n let nextLocation = createMemoryLocation(to, state);\n entries[index] = nextLocation;\n if (v5Compat && listener) {\n listener({ action, location: nextLocation, delta: 0 });\n }\n },\n go(delta) {\n action = Action.Pop;\n let nextIndex = clampIndex(index + delta);\n let nextLocation = entries[nextIndex];\n index = nextIndex;\n if (listener) {\n listener({ action, location: nextLocation, delta });\n }\n },\n listen(fn: Listener) {\n listener = fn;\n return () => {\n listener = null;\n };\n },\n };\n\n return history;\n}\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Browser History\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * A browser history stores the current location in regular URLs in a web\n * browser environment. This is the standard for most web apps and provides the\n * cleanest URLs the browser's address bar.\n *\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#browserhistory\n */\nexport interface BrowserHistory extends UrlHistory {}\n\nexport type BrowserHistoryOptions = UrlHistoryOptions;\n\n/**\n * Browser history stores the location in regular URLs. This is the standard for\n * most web apps, but it requires some configuration on the server to ensure you\n * serve the same app at multiple URLs.\n *\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#createbrowserhistory\n */\nexport function createBrowserHistory(\n options: BrowserHistoryOptions = {}\n): BrowserHistory {\n function createBrowserLocation(\n window: Window,\n globalHistory: Window[\"history\"]\n ) {\n let { pathname, search, hash } = window.location;\n return createLocation(\n \"\",\n { pathname, search, hash },\n // state defaults to `null` because `window.history.state` does\n (globalHistory.state && globalHistory.state.usr) || null,\n (globalHistory.state && globalHistory.state.key) || \"default\"\n );\n }\n\n function createBrowserHref(window: Window, to: To) {\n return typeof to === \"string\" ? to : createPath(to);\n }\n\n return getUrlBasedHistory(\n createBrowserLocation,\n createBrowserHref,\n null,\n options\n );\n}\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Hash History\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * A hash history stores the current location in the fragment identifier portion\n * of the URL in a web browser environment.\n *\n * This is ideal for apps that do not control the server for some reason\n * (because the fragment identifier is never sent to the server), including some\n * shared hosting environments that do not provide fine-grained controls over\n * which pages are served at which URLs.\n *\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#hashhistory\n */\nexport interface HashHistory extends UrlHistory {}\n\nexport type HashHistoryOptions = UrlHistoryOptions;\n\n/**\n * Hash history stores the location in window.location.hash. This makes it ideal\n * for situations where you don't want to send the location to the server for\n * some reason, either because you do cannot configure it or the URL space is\n * reserved for something else.\n *\n * @see https://github.com/remix-run/history/tree/main/docs/api-reference.md#createhashhistory\n */\nexport function createHashHistory(\n options: HashHistoryOptions = {}\n): HashHistory {\n function createHashLocation(\n window: Window,\n globalHistory: Window[\"history\"]\n ) {\n let {\n pathname = \"/\",\n search = \"\",\n hash = \"\",\n } = parsePath(window.location.hash.substr(1));\n\n // Hash URL should always have a leading / just like window.location.pathname\n // does, so if an app ends up at a route like /#something then we add a\n // leading slash so all of our path-matching behaves the same as if it would\n // in a browser router. This is particularly important when there exists a\n // root splat route () since that matches internally against\n // \"/*\" and we'd expect /#something to 404 in a hash router app.\n if (!pathname.startsWith(\"/\") && !pathname.startsWith(\".\")) {\n pathname = \"/\" + pathname;\n }\n\n return createLocation(\n \"\",\n { pathname, search, hash },\n // state defaults to `null` because `window.history.state` does\n (globalHistory.state && globalHistory.state.usr) || null,\n (globalHistory.state && globalHistory.state.key) || \"default\"\n );\n }\n\n function createHashHref(window: Window, to: To) {\n let base = window.document.querySelector(\"base\");\n let href = \"\";\n\n if (base && base.getAttribute(\"href\")) {\n let url = window.location.href;\n let hashIndex = url.indexOf(\"#\");\n href = hashIndex === -1 ? url : url.slice(0, hashIndex);\n }\n\n return href + \"#\" + (typeof to === \"string\" ? to : createPath(to));\n }\n\n function validateHashLocation(location: Location, to: To) {\n warning(\n location.pathname.charAt(0) === \"/\",\n `relative pathnames are not supported in hash history.push(${JSON.stringify(\n to\n )})`\n );\n }\n\n return getUrlBasedHistory(\n createHashLocation,\n createHashHref,\n validateHashLocation,\n options\n );\n}\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region UTILS\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * @private\n */\nexport function invariant(value: boolean, message?: string): asserts value;\nexport function invariant(\n value: T | null | undefined,\n message?: string\n): asserts value is T;\nexport function invariant(value: any, message?: string) {\n if (value === false || value === null || typeof value === \"undefined\") {\n throw new Error(message);\n }\n}\n\nexport function warning(cond: any, message: string) {\n if (!cond) {\n // eslint-disable-next-line no-console\n if (typeof console !== \"undefined\") console.warn(message);\n\n try {\n // Welcome to debugging history!\n //\n // This error is thrown as a convenience so you can more easily\n // find the source for a warning that appears in the console by\n // enabling \"pause on exceptions\" in your JavaScript debugger.\n throw new Error(message);\n // eslint-disable-next-line no-empty\n } catch (e) {}\n }\n}\n\nfunction createKey() {\n return Math.random().toString(36).substr(2, 8);\n}\n\n/**\n * For browser-based histories, we combine the state and key into an object\n */\nfunction getHistoryState(location: Location, index: number): HistoryState {\n return {\n usr: location.state,\n key: location.key,\n idx: index,\n };\n}\n\n/**\n * Creates a Location object with a unique key from the given Path\n */\nexport function createLocation(\n current: string | Location,\n to: To,\n state: any = null,\n key?: string\n): Readonly {\n let location: Readonly = {\n pathname: typeof current === \"string\" ? current : current.pathname,\n search: \"\",\n hash: \"\",\n ...(typeof to === \"string\" ? parsePath(to) : to),\n state,\n // TODO: This could be cleaned up. push/replace should probably just take\n // full Locations now and avoid the need to run through this flow at all\n // But that's a pretty big refactor to the current test suite so going to\n // keep as is for the time being and just let any incoming keys take precedence\n key: (to && (to as Location).key) || key || createKey(),\n };\n return location;\n}\n\n/**\n * Creates a string URL path from the given pathname, search, and hash components.\n */\nexport function createPath({\n pathname = \"/\",\n search = \"\",\n hash = \"\",\n}: Partial) {\n if (search && search !== \"?\")\n pathname += search.charAt(0) === \"?\" ? search : \"?\" + search;\n if (hash && hash !== \"#\")\n pathname += hash.charAt(0) === \"#\" ? hash : \"#\" + hash;\n return pathname;\n}\n\n/**\n * Parses a string URL path into its separate pathname, search, and hash components.\n */\nexport function parsePath(path: string): Partial {\n let parsedPath: Partial = {};\n\n if (path) {\n let hashIndex = path.indexOf(\"#\");\n if (hashIndex >= 0) {\n parsedPath.hash = path.substr(hashIndex);\n path = path.substr(0, hashIndex);\n }\n\n let searchIndex = path.indexOf(\"?\");\n if (searchIndex >= 0) {\n parsedPath.search = path.substr(searchIndex);\n path = path.substr(0, searchIndex);\n }\n\n if (path) {\n parsedPath.pathname = path;\n }\n }\n\n return parsedPath;\n}\n\nexport interface UrlHistory extends History {}\n\nexport type UrlHistoryOptions = {\n window?: Window;\n v5Compat?: boolean;\n};\n\nfunction getUrlBasedHistory(\n getLocation: (window: Window, globalHistory: Window[\"history\"]) => Location,\n createHref: (window: Window, to: To) => string,\n validateLocation: ((location: Location, to: To) => void) | null,\n options: UrlHistoryOptions = {}\n): UrlHistory {\n let { window = document.defaultView!, v5Compat = false } = options;\n let globalHistory = window.history;\n let action = Action.Pop;\n let listener: Listener | null = null;\n\n let index = getIndex()!;\n // Index should only be null when we initialize. If not, it's because the\n // user called history.pushState or history.replaceState directly, in which\n // case we should log a warning as it will result in bugs.\n if (index == null) {\n index = 0;\n globalHistory.replaceState({ ...globalHistory.state, idx: index }, \"\");\n }\n\n function getIndex(): number {\n let state = globalHistory.state || { idx: null };\n return state.idx;\n }\n\n function handlePop() {\n action = Action.Pop;\n let nextIndex = getIndex();\n let delta = nextIndex == null ? null : nextIndex - index;\n index = nextIndex;\n if (listener) {\n listener({ action, location: history.location, delta });\n }\n }\n\n function push(to: To, state?: any) {\n action = Action.Push;\n let location = createLocation(history.location, to, state);\n if (validateLocation) validateLocation(location, to);\n\n index = getIndex() + 1;\n let historyState = getHistoryState(location, index);\n let url = history.createHref(location);\n\n // try...catch because iOS limits us to 100 pushState calls :/\n try {\n globalHistory.pushState(historyState, \"\", url);\n } catch (error) {\n // If the exception is because `state` can't be serialized, let that throw\n // outwards just like a replace call would so the dev knows the cause\n // https://html.spec.whatwg.org/multipage/nav-history-apis.html#shared-history-push/replace-state-steps\n // https://html.spec.whatwg.org/multipage/structured-data.html#structuredserializeinternal\n if (error instanceof DOMException && error.name === \"DataCloneError\") {\n throw error;\n }\n // They are going to lose state here, but there is no real\n // way to warn them about it since the page will refresh...\n window.location.assign(url);\n }\n\n if (v5Compat && listener) {\n listener({ action, location: history.location, delta: 1 });\n }\n }\n\n function replace(to: To, state?: any) {\n action = Action.Replace;\n let location = createLocation(history.location, to, state);\n if (validateLocation) validateLocation(location, to);\n\n index = getIndex();\n let historyState = getHistoryState(location, index);\n let url = history.createHref(location);\n globalHistory.replaceState(historyState, \"\", url);\n\n if (v5Compat && listener) {\n listener({ action, location: history.location, delta: 0 });\n }\n }\n\n function createURL(to: To): URL {\n // window.location.origin is \"null\" (the literal string value) in Firefox\n // under certain conditions, notably when serving from a local HTML file\n // See https://bugzilla.mozilla.org/show_bug.cgi?id=878297\n let base =\n window.location.origin !== \"null\"\n ? window.location.origin\n : window.location.href;\n\n let href = typeof to === \"string\" ? to : createPath(to);\n invariant(\n base,\n `No window.location.(origin|href) available to create URL for href: ${href}`\n );\n return new URL(href, base);\n }\n\n let history: History = {\n get action() {\n return action;\n },\n get location() {\n return getLocation(window, globalHistory);\n },\n listen(fn: Listener) {\n if (listener) {\n throw new Error(\"A history only accepts one active listener\");\n }\n window.addEventListener(PopStateEventType, handlePop);\n listener = fn;\n\n return () => {\n window.removeEventListener(PopStateEventType, handlePop);\n listener = null;\n };\n },\n createHref(to) {\n return createHref(window, to);\n },\n createURL,\n encodeLocation(to) {\n // Encode a Location the same way window.location would\n let url = createURL(to);\n return {\n pathname: url.pathname,\n search: url.search,\n hash: url.hash,\n };\n },\n push,\n replace,\n go(n) {\n return globalHistory.go(n);\n },\n };\n\n return history;\n}\n\n//#endregion\n","import type { Location, Path, To } from \"./history\";\nimport { warning, invariant, parsePath } from \"./history\";\n\n/**\n * Map of routeId -> data returned from a loader/action/error\n */\nexport interface RouteData {\n [routeId: string]: any;\n}\n\nexport enum ResultType {\n data = \"data\",\n deferred = \"deferred\",\n redirect = \"redirect\",\n error = \"error\",\n}\n\n/**\n * Successful result from a loader or action\n */\nexport interface SuccessResult {\n type: ResultType.data;\n data: any;\n statusCode?: number;\n headers?: Headers;\n}\n\n/**\n * Successful defer() result from a loader or action\n */\nexport interface DeferredResult {\n type: ResultType.deferred;\n deferredData: DeferredData;\n statusCode?: number;\n headers?: Headers;\n}\n\n/**\n * Redirect result from a loader or action\n */\nexport interface RedirectResult {\n type: ResultType.redirect;\n status: number;\n location: string;\n revalidate: boolean;\n reloadDocument?: boolean;\n}\n\n/**\n * Unsuccessful result from a loader or action\n */\nexport interface ErrorResult {\n type: ResultType.error;\n error: any;\n headers?: Headers;\n}\n\n/**\n * Result from a loader or action - potentially successful or unsuccessful\n */\nexport type DataResult =\n | SuccessResult\n | DeferredResult\n | RedirectResult\n | ErrorResult;\n\ntype LowerCaseFormMethod = \"get\" | \"post\" | \"put\" | \"patch\" | \"delete\";\ntype UpperCaseFormMethod = Uppercase;\n\n/**\n * Users can specify either lowercase or uppercase form methods on
,\n * useSubmit(), , etc.\n */\nexport type HTMLFormMethod = LowerCaseFormMethod | UpperCaseFormMethod;\n\n/**\n * Active navigation/fetcher form methods are exposed in lowercase on the\n * RouterState\n */\nexport type FormMethod = LowerCaseFormMethod;\nexport type MutationFormMethod = Exclude;\n\n/**\n * In v7, active navigation/fetcher form methods are exposed in uppercase on the\n * RouterState. This is to align with the normalization done via fetch().\n */\nexport type V7_FormMethod = UpperCaseFormMethod;\nexport type V7_MutationFormMethod = Exclude;\n\nexport type FormEncType =\n | \"application/x-www-form-urlencoded\"\n | \"multipart/form-data\"\n | \"application/json\"\n | \"text/plain\";\n\n// Thanks https://github.com/sindresorhus/type-fest!\ntype JsonObject = { [Key in string]: JsonValue } & {\n [Key in string]?: JsonValue | undefined;\n};\ntype JsonArray = JsonValue[] | readonly JsonValue[];\ntype JsonPrimitive = string | number | boolean | null;\ntype JsonValue = JsonPrimitive | JsonObject | JsonArray;\n\n/**\n * @private\n * Internal interface to pass around for action submissions, not intended for\n * external consumption\n */\nexport type Submission =\n | {\n formMethod: FormMethod | V7_FormMethod;\n formAction: string;\n formEncType: FormEncType;\n formData: FormData;\n json: undefined;\n text: undefined;\n }\n | {\n formMethod: FormMethod | V7_FormMethod;\n formAction: string;\n formEncType: FormEncType;\n formData: undefined;\n json: JsonValue;\n text: undefined;\n }\n | {\n formMethod: FormMethod | V7_FormMethod;\n formAction: string;\n formEncType: FormEncType;\n formData: undefined;\n json: undefined;\n text: string;\n };\n\n/**\n * @private\n * Arguments passed to route loader/action functions. Same for now but we keep\n * this as a private implementation detail in case they diverge in the future.\n */\ninterface DataFunctionArgs {\n request: Request;\n params: Params;\n context?: any;\n}\n\n/**\n * Arguments passed to loader functions\n */\nexport interface LoaderFunctionArgs extends DataFunctionArgs {}\n\n/**\n * Arguments passed to action functions\n */\nexport interface ActionFunctionArgs extends DataFunctionArgs {}\n\n/**\n * Loaders and actions can return anything except `undefined` (`null` is a\n * valid return value if there is no data to return). Responses are preferred\n * and will ease any future migration to Remix\n */\ntype DataFunctionValue = Response | NonNullable | null;\n\n/**\n * Route loader function signature\n */\nexport interface LoaderFunction {\n (args: LoaderFunctionArgs): Promise | DataFunctionValue;\n}\n\n/**\n * Route action function signature\n */\nexport interface ActionFunction {\n (args: ActionFunctionArgs): Promise | DataFunctionValue;\n}\n\n/**\n * Route shouldRevalidate function signature. This runs after any submission\n * (navigation or fetcher), so we flatten the navigation/fetcher submission\n * onto the arguments. It shouldn't matter whether it came from a navigation\n * or a fetcher, what really matters is the URLs and the formData since loaders\n * have to re-run based on the data models that were potentially mutated.\n */\nexport interface ShouldRevalidateFunction {\n (args: {\n currentUrl: URL;\n currentParams: AgnosticDataRouteMatch[\"params\"];\n nextUrl: URL;\n nextParams: AgnosticDataRouteMatch[\"params\"];\n formMethod?: Submission[\"formMethod\"];\n formAction?: Submission[\"formAction\"];\n formEncType?: Submission[\"formEncType\"];\n text?: Submission[\"text\"];\n formData?: Submission[\"formData\"];\n json?: Submission[\"json\"];\n actionResult?: DataResult;\n defaultShouldRevalidate: boolean;\n }): boolean;\n}\n\n/**\n * Function provided by the framework-aware layers to set `hasErrorBoundary`\n * from the framework-aware `errorElement` prop\n *\n * @deprecated Use `mapRouteProperties` instead\n */\nexport interface DetectErrorBoundaryFunction {\n (route: AgnosticRouteObject): boolean;\n}\n\n/**\n * Function provided by the framework-aware layers to set any framework-specific\n * properties from framework-agnostic properties\n */\nexport interface MapRoutePropertiesFunction {\n (route: AgnosticRouteObject): {\n hasErrorBoundary: boolean;\n } & Record;\n}\n\n/**\n * Keys we cannot change from within a lazy() function. We spread all other keys\n * onto the route. Either they're meaningful to the router, or they'll get\n * ignored.\n */\nexport type ImmutableRouteKey =\n | \"lazy\"\n | \"caseSensitive\"\n | \"path\"\n | \"id\"\n | \"index\"\n | \"children\";\n\nexport const immutableRouteKeys = new Set([\n \"lazy\",\n \"caseSensitive\",\n \"path\",\n \"id\",\n \"index\",\n \"children\",\n]);\n\ntype RequireOne = Exclude<\n {\n [K in keyof T]: K extends Key ? Omit & Required> : never;\n }[keyof T],\n undefined\n>;\n\n/**\n * lazy() function to load a route definition, which can add non-matching\n * related properties to a route\n */\nexport interface LazyRouteFunction {\n (): Promise>>;\n}\n\n/**\n * Base RouteObject with common props shared by all types of routes\n */\ntype AgnosticBaseRouteObject = {\n caseSensitive?: boolean;\n path?: string;\n id?: string;\n loader?: LoaderFunction;\n action?: ActionFunction;\n hasErrorBoundary?: boolean;\n shouldRevalidate?: ShouldRevalidateFunction;\n handle?: any;\n lazy?: LazyRouteFunction;\n};\n\n/**\n * Index routes must not have children\n */\nexport type AgnosticIndexRouteObject = AgnosticBaseRouteObject & {\n children?: undefined;\n index: true;\n};\n\n/**\n * Non-index routes may have children, but cannot have index\n */\nexport type AgnosticNonIndexRouteObject = AgnosticBaseRouteObject & {\n children?: AgnosticRouteObject[];\n index?: false;\n};\n\n/**\n * A route object represents a logical route, with (optionally) its child\n * routes organized in a tree-like structure.\n */\nexport type AgnosticRouteObject =\n | AgnosticIndexRouteObject\n | AgnosticNonIndexRouteObject;\n\nexport type AgnosticDataIndexRouteObject = AgnosticIndexRouteObject & {\n id: string;\n};\n\nexport type AgnosticDataNonIndexRouteObject = AgnosticNonIndexRouteObject & {\n children?: AgnosticDataRouteObject[];\n id: string;\n};\n\n/**\n * A data route object, which is just a RouteObject with a required unique ID\n */\nexport type AgnosticDataRouteObject =\n | AgnosticDataIndexRouteObject\n | AgnosticDataNonIndexRouteObject;\n\nexport type RouteManifest = Record;\n\n// Recursive helper for finding path parameters in the absence of wildcards\ntype _PathParam =\n // split path into individual path segments\n Path extends `${infer L}/${infer R}`\n ? _PathParam | _PathParam\n : // find params after `:`\n Path extends `:${infer Param}`\n ? Param extends `${infer Optional}?`\n ? Optional\n : Param\n : // otherwise, there aren't any params present\n never;\n\n/**\n * Examples:\n * \"/a/b/*\" -> \"*\"\n * \":a\" -> \"a\"\n * \"/a/:b\" -> \"b\"\n * \"/a/blahblahblah:b\" -> \"b\"\n * \"/:a/:b\" -> \"a\" | \"b\"\n * \"/:a/b/:c/*\" -> \"a\" | \"c\" | \"*\"\n */\ntype PathParam =\n // check if path is just a wildcard\n Path extends \"*\" | \"/*\"\n ? \"*\"\n : // look for wildcard at the end of the path\n Path extends `${infer Rest}/*`\n ? \"*\" | _PathParam\n : // look for params in the absence of wildcards\n _PathParam;\n\n// Attempt to parse the given string segment. If it fails, then just return the\n// plain string type as a default fallback. Otherwise return the union of the\n// parsed string literals that were referenced as dynamic segments in the route.\nexport type ParamParseKey =\n // if could not find path params, fallback to `string`\n [PathParam] extends [never] ? string : PathParam;\n\n/**\n * The parameters that were parsed from the URL path.\n */\nexport type Params = {\n readonly [key in Key]: string | undefined;\n};\n\n/**\n * A RouteMatch contains info about how a route matched a URL.\n */\nexport interface AgnosticRouteMatch<\n ParamKey extends string = string,\n RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n> {\n /**\n * The names and values of dynamic parameters in the URL.\n */\n params: Params;\n /**\n * The portion of the URL pathname that was matched.\n */\n pathname: string;\n /**\n * The portion of the URL pathname that was matched before child routes.\n */\n pathnameBase: string;\n /**\n * The route object that was used to match.\n */\n route: RouteObjectType;\n}\n\nexport interface AgnosticDataRouteMatch\n extends AgnosticRouteMatch {}\n\nfunction isIndexRoute(\n route: AgnosticRouteObject\n): route is AgnosticIndexRouteObject {\n return route.index === true;\n}\n\n// Walk the route tree generating unique IDs where necessary so we are working\n// solely with AgnosticDataRouteObject's within the Router\nexport function convertRoutesToDataRoutes(\n routes: AgnosticRouteObject[],\n mapRouteProperties: MapRoutePropertiesFunction,\n parentPath: number[] = [],\n manifest: RouteManifest = {}\n): AgnosticDataRouteObject[] {\n return routes.map((route, index) => {\n let treePath = [...parentPath, index];\n let id = typeof route.id === \"string\" ? route.id : treePath.join(\"-\");\n invariant(\n route.index !== true || !route.children,\n `Cannot specify children on an index route`\n );\n invariant(\n !manifest[id],\n `Found a route id collision on id \"${id}\". Route ` +\n \"id's must be globally unique within Data Router usages\"\n );\n\n if (isIndexRoute(route)) {\n let indexRoute: AgnosticDataIndexRouteObject = {\n ...route,\n ...mapRouteProperties(route),\n id,\n };\n manifest[id] = indexRoute;\n return indexRoute;\n } else {\n let pathOrLayoutRoute: AgnosticDataNonIndexRouteObject = {\n ...route,\n ...mapRouteProperties(route),\n id,\n children: undefined,\n };\n manifest[id] = pathOrLayoutRoute;\n\n if (route.children) {\n pathOrLayoutRoute.children = convertRoutesToDataRoutes(\n route.children,\n mapRouteProperties,\n treePath,\n manifest\n );\n }\n\n return pathOrLayoutRoute;\n }\n });\n}\n\n/**\n * Matches the given routes to a location and returns the match data.\n *\n * @see https://reactrouter.com/utils/match-routes\n */\nexport function matchRoutes<\n RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n>(\n routes: RouteObjectType[],\n locationArg: Partial | string,\n basename = \"/\"\n): AgnosticRouteMatch[] | null {\n let location =\n typeof locationArg === \"string\" ? parsePath(locationArg) : locationArg;\n\n let pathname = stripBasename(location.pathname || \"/\", basename);\n\n if (pathname == null) {\n return null;\n }\n\n let branches = flattenRoutes(routes);\n rankRouteBranches(branches);\n\n let matches = null;\n for (let i = 0; matches == null && i < branches.length; ++i) {\n matches = matchRouteBranch(\n branches[i],\n // Incoming pathnames are generally encoded from either window.location\n // or from router.navigate, but we want to match against the unencoded\n // paths in the route definitions. Memory router locations won't be\n // encoded here but there also shouldn't be anything to decode so this\n // should be a safe operation. This avoids needing matchRoutes to be\n // history-aware.\n safelyDecodeURI(pathname)\n );\n }\n\n return matches;\n}\n\ninterface RouteMeta<\n RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n> {\n relativePath: string;\n caseSensitive: boolean;\n childrenIndex: number;\n route: RouteObjectType;\n}\n\ninterface RouteBranch<\n RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n> {\n path: string;\n score: number;\n routesMeta: RouteMeta[];\n}\n\nfunction flattenRoutes<\n RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n>(\n routes: RouteObjectType[],\n branches: RouteBranch[] = [],\n parentsMeta: RouteMeta[] = [],\n parentPath = \"\"\n): RouteBranch[] {\n let flattenRoute = (\n route: RouteObjectType,\n index: number,\n relativePath?: string\n ) => {\n let meta: RouteMeta = {\n relativePath:\n relativePath === undefined ? route.path || \"\" : relativePath,\n caseSensitive: route.caseSensitive === true,\n childrenIndex: index,\n route,\n };\n\n if (meta.relativePath.startsWith(\"/\")) {\n invariant(\n meta.relativePath.startsWith(parentPath),\n `Absolute route path \"${meta.relativePath}\" nested under path ` +\n `\"${parentPath}\" is not valid. An absolute child route path ` +\n `must start with the combined path of all its parent routes.`\n );\n\n meta.relativePath = meta.relativePath.slice(parentPath.length);\n }\n\n let path = joinPaths([parentPath, meta.relativePath]);\n let routesMeta = parentsMeta.concat(meta);\n\n // Add the children before adding this route to the array so we traverse the\n // route tree depth-first and child routes appear before their parents in\n // the \"flattened\" version.\n if (route.children && route.children.length > 0) {\n invariant(\n // Our types know better, but runtime JS may not!\n // @ts-expect-error\n route.index !== true,\n `Index routes must not have child routes. Please remove ` +\n `all child routes from route path \"${path}\".`\n );\n\n flattenRoutes(route.children, branches, routesMeta, path);\n }\n\n // Routes without a path shouldn't ever match by themselves unless they are\n // index routes, so don't add them to the list of possible branches.\n if (route.path == null && !route.index) {\n return;\n }\n\n branches.push({\n path,\n score: computeScore(path, route.index),\n routesMeta,\n });\n };\n routes.forEach((route, index) => {\n // coarse-grain check for optional params\n if (route.path === \"\" || !route.path?.includes(\"?\")) {\n flattenRoute(route, index);\n } else {\n for (let exploded of explodeOptionalSegments(route.path)) {\n flattenRoute(route, index, exploded);\n }\n }\n });\n\n return branches;\n}\n\n/**\n * Computes all combinations of optional path segments for a given path,\n * excluding combinations that are ambiguous and of lower priority.\n *\n * For example, `/one/:two?/three/:four?/:five?` explodes to:\n * - `/one/three`\n * - `/one/:two/three`\n * - `/one/three/:four`\n * - `/one/three/:five`\n * - `/one/:two/three/:four`\n * - `/one/:two/three/:five`\n * - `/one/three/:four/:five`\n * - `/one/:two/three/:four/:five`\n */\nfunction explodeOptionalSegments(path: string): string[] {\n let segments = path.split(\"/\");\n if (segments.length === 0) return [];\n\n let [first, ...rest] = segments;\n\n // Optional path segments are denoted by a trailing `?`\n let isOptional = first.endsWith(\"?\");\n // Compute the corresponding required segment: `foo?` -> `foo`\n let required = first.replace(/\\?$/, \"\");\n\n if (rest.length === 0) {\n // Intepret empty string as omitting an optional segment\n // `[\"one\", \"\", \"three\"]` corresponds to omitting `:two` from `/one/:two?/three` -> `/one/three`\n return isOptional ? [required, \"\"] : [required];\n }\n\n let restExploded = explodeOptionalSegments(rest.join(\"/\"));\n\n let result: string[] = [];\n\n // All child paths with the prefix. Do this for all children before the\n // optional version for all children so we get consistent ordering where the\n // parent optional aspect is preferred as required. Otherwise, we can get\n // child sections interspersed where deeper optional segments are higher than\n // parent optional segments, where for example, /:two would explodes _earlier_\n // then /:one. By always including the parent as required _for all children_\n // first, we avoid this issue\n result.push(\n ...restExploded.map((subpath) =>\n subpath === \"\" ? required : [required, subpath].join(\"/\")\n )\n );\n\n // Then if this is an optional value, add all child versions without\n if (isOptional) {\n result.push(...restExploded);\n }\n\n // for absolute paths, ensure `/` instead of empty segment\n return result.map((exploded) =>\n path.startsWith(\"/\") && exploded === \"\" ? \"/\" : exploded\n );\n}\n\nfunction rankRouteBranches(branches: RouteBranch[]): void {\n branches.sort((a, b) =>\n a.score !== b.score\n ? b.score - a.score // Higher score first\n : compareIndexes(\n a.routesMeta.map((meta) => meta.childrenIndex),\n b.routesMeta.map((meta) => meta.childrenIndex)\n )\n );\n}\n\nconst paramRe = /^:\\w+$/;\nconst dynamicSegmentValue = 3;\nconst indexRouteValue = 2;\nconst emptySegmentValue = 1;\nconst staticSegmentValue = 10;\nconst splatPenalty = -2;\nconst isSplat = (s: string) => s === \"*\";\n\nfunction computeScore(path: string, index: boolean | undefined): number {\n let segments = path.split(\"/\");\n let initialScore = segments.length;\n if (segments.some(isSplat)) {\n initialScore += splatPenalty;\n }\n\n if (index) {\n initialScore += indexRouteValue;\n }\n\n return segments\n .filter((s) => !isSplat(s))\n .reduce(\n (score, segment) =>\n score +\n (paramRe.test(segment)\n ? dynamicSegmentValue\n : segment === \"\"\n ? emptySegmentValue\n : staticSegmentValue),\n initialScore\n );\n}\n\nfunction compareIndexes(a: number[], b: number[]): number {\n let siblings =\n a.length === b.length && a.slice(0, -1).every((n, i) => n === b[i]);\n\n return siblings\n ? // If two routes are siblings, we should try to match the earlier sibling\n // first. This allows people to have fine-grained control over the matching\n // behavior by simply putting routes with identical paths in the order they\n // want them tried.\n a[a.length - 1] - b[b.length - 1]\n : // Otherwise, it doesn't really make sense to rank non-siblings by index,\n // so they sort equally.\n 0;\n}\n\nfunction matchRouteBranch<\n ParamKey extends string = string,\n RouteObjectType extends AgnosticRouteObject = AgnosticRouteObject\n>(\n branch: RouteBranch,\n pathname: string\n): AgnosticRouteMatch[] | null {\n let { routesMeta } = branch;\n\n let matchedParams = {};\n let matchedPathname = \"/\";\n let matches: AgnosticRouteMatch[] = [];\n for (let i = 0; i < routesMeta.length; ++i) {\n let meta = routesMeta[i];\n let end = i === routesMeta.length - 1;\n let remainingPathname =\n matchedPathname === \"/\"\n ? pathname\n : pathname.slice(matchedPathname.length) || \"/\";\n let match = matchPath(\n { path: meta.relativePath, caseSensitive: meta.caseSensitive, end },\n remainingPathname\n );\n\n if (!match) return null;\n\n Object.assign(matchedParams, match.params);\n\n let route = meta.route;\n\n matches.push({\n // TODO: Can this as be avoided?\n params: matchedParams as Params,\n pathname: joinPaths([matchedPathname, match.pathname]),\n pathnameBase: normalizePathname(\n joinPaths([matchedPathname, match.pathnameBase])\n ),\n route,\n });\n\n if (match.pathnameBase !== \"/\") {\n matchedPathname = joinPaths([matchedPathname, match.pathnameBase]);\n }\n }\n\n return matches;\n}\n\n/**\n * Returns a path with params interpolated.\n *\n * @see https://reactrouter.com/utils/generate-path\n */\nexport function generatePath(\n originalPath: Path,\n params: {\n [key in PathParam]: string | null;\n } = {} as any\n): string {\n let path: string = originalPath;\n if (path.endsWith(\"*\") && path !== \"*\" && !path.endsWith(\"/*\")) {\n warning(\n false,\n `Route path \"${path}\" will be treated as if it were ` +\n `\"${path.replace(/\\*$/, \"/*\")}\" because the \\`*\\` character must ` +\n `always follow a \\`/\\` in the pattern. To get rid of this warning, ` +\n `please change the route path to \"${path.replace(/\\*$/, \"/*\")}\".`\n );\n path = path.replace(/\\*$/, \"/*\") as Path;\n }\n\n // ensure `/` is added at the beginning if the path is absolute\n const prefix = path.startsWith(\"/\") ? \"/\" : \"\";\n\n const stringify = (p: any) =>\n p == null ? \"\" : typeof p === \"string\" ? p : String(p);\n\n const segments = path\n .split(/\\/+/)\n .map((segment, index, array) => {\n const isLastSegment = index === array.length - 1;\n\n // only apply the splat if it's the last segment\n if (isLastSegment && segment === \"*\") {\n const star = \"*\" as PathParam;\n // Apply the splat\n return stringify(params[star]);\n }\n\n const keyMatch = segment.match(/^:(\\w+)(\\??)$/);\n if (keyMatch) {\n const [, key, optional] = keyMatch;\n let param = params[key as PathParam];\n invariant(optional === \"?\" || param != null, `Missing \":${key}\" param`);\n return stringify(param);\n }\n\n // Remove any optional markers from optional static segments\n return segment.replace(/\\?$/g, \"\");\n })\n // Remove empty segments\n .filter((segment) => !!segment);\n\n return prefix + segments.join(\"/\");\n}\n\n/**\n * A PathPattern is used to match on some portion of a URL pathname.\n */\nexport interface PathPattern {\n /**\n * A string to match against a URL pathname. May contain `:id`-style segments\n * to indicate placeholders for dynamic parameters. May also end with `/*` to\n * indicate matching the rest of the URL pathname.\n */\n path: Path;\n /**\n * Should be `true` if the static portions of the `path` should be matched in\n * the same case.\n */\n caseSensitive?: boolean;\n /**\n * Should be `true` if this pattern should match the entire URL pathname.\n */\n end?: boolean;\n}\n\n/**\n * A PathMatch contains info about how a PathPattern matched on a URL pathname.\n */\nexport interface PathMatch {\n /**\n * The names and values of dynamic parameters in the URL.\n */\n params: Params;\n /**\n * The portion of the URL pathname that was matched.\n */\n pathname: string;\n /**\n * The portion of the URL pathname that was matched before child routes.\n */\n pathnameBase: string;\n /**\n * The pattern that was used to match.\n */\n pattern: PathPattern;\n}\n\ntype Mutable = {\n -readonly [P in keyof T]: T[P];\n};\n\n/**\n * Performs pattern matching on a URL pathname and returns information about\n * the match.\n *\n * @see https://reactrouter.com/utils/match-path\n */\nexport function matchPath<\n ParamKey extends ParamParseKey,\n Path extends string\n>(\n pattern: PathPattern | Path,\n pathname: string\n): PathMatch | null {\n if (typeof pattern === \"string\") {\n pattern = { path: pattern, caseSensitive: false, end: true };\n }\n\n let [matcher, paramNames] = compilePath(\n pattern.path,\n pattern.caseSensitive,\n pattern.end\n );\n\n let match = pathname.match(matcher);\n if (!match) return null;\n\n let matchedPathname = match[0];\n let pathnameBase = matchedPathname.replace(/(.)\\/+$/, \"$1\");\n let captureGroups = match.slice(1);\n let params: Params = paramNames.reduce>(\n (memo, paramName, index) => {\n // We need to compute the pathnameBase here using the raw splat value\n // instead of using params[\"*\"] later because it will be decoded then\n if (paramName === \"*\") {\n let splatValue = captureGroups[index] || \"\";\n pathnameBase = matchedPathname\n .slice(0, matchedPathname.length - splatValue.length)\n .replace(/(.)\\/+$/, \"$1\");\n }\n\n memo[paramName] = safelyDecodeURIComponent(\n captureGroups[index] || \"\",\n paramName\n );\n return memo;\n },\n {}\n );\n\n return {\n params,\n pathname: matchedPathname,\n pathnameBase,\n pattern,\n };\n}\n\nfunction compilePath(\n path: string,\n caseSensitive = false,\n end = true\n): [RegExp, string[]] {\n warning(\n path === \"*\" || !path.endsWith(\"*\") || path.endsWith(\"/*\"),\n `Route path \"${path}\" will be treated as if it were ` +\n `\"${path.replace(/\\*$/, \"/*\")}\" because the \\`*\\` character must ` +\n `always follow a \\`/\\` in the pattern. To get rid of this warning, ` +\n `please change the route path to \"${path.replace(/\\*$/, \"/*\")}\".`\n );\n\n let paramNames: string[] = [];\n let regexpSource =\n \"^\" +\n path\n .replace(/\\/*\\*?$/, \"\") // Ignore trailing / and /*, we'll handle it below\n .replace(/^\\/*/, \"/\") // Make sure it has a leading /\n .replace(/[\\\\.*+^$?{}|()[\\]]/g, \"\\\\$&\") // Escape special regex chars\n .replace(/\\/:(\\w+)/g, (_: string, paramName: string) => {\n paramNames.push(paramName);\n return \"/([^\\\\/]+)\";\n });\n\n if (path.endsWith(\"*\")) {\n paramNames.push(\"*\");\n regexpSource +=\n path === \"*\" || path === \"/*\"\n ? \"(.*)$\" // Already matched the initial /, just match the rest\n : \"(?:\\\\/(.+)|\\\\/*)$\"; // Don't include the / in params[\"*\"]\n } else if (end) {\n // When matching to the end, ignore trailing slashes\n regexpSource += \"\\\\/*$\";\n } else if (path !== \"\" && path !== \"/\") {\n // If our path is non-empty and contains anything beyond an initial slash,\n // then we have _some_ form of path in our regex so we should expect to\n // match only if we find the end of this path segment. Look for an optional\n // non-captured trailing slash (to match a portion of the URL) or the end\n // of the path (if we've matched to the end). We used to do this with a\n // word boundary but that gives false positives on routes like\n // /user-preferences since `-` counts as a word boundary.\n regexpSource += \"(?:(?=\\\\/|$))\";\n } else {\n // Nothing to match for \"\" or \"/\"\n }\n\n let matcher = new RegExp(regexpSource, caseSensitive ? undefined : \"i\");\n\n return [matcher, paramNames];\n}\n\nfunction safelyDecodeURI(value: string) {\n try {\n return decodeURI(value);\n } catch (error) {\n warning(\n false,\n `The URL path \"${value}\" could not be decoded because it is is a ` +\n `malformed URL segment. This is probably due to a bad percent ` +\n `encoding (${error}).`\n );\n\n return value;\n }\n}\n\nfunction safelyDecodeURIComponent(value: string, paramName: string) {\n try {\n return decodeURIComponent(value);\n } catch (error) {\n warning(\n false,\n `The value for the URL param \"${paramName}\" will not be decoded because` +\n ` the string \"${value}\" is a malformed URL segment. This is probably` +\n ` due to a bad percent encoding (${error}).`\n );\n\n return value;\n }\n}\n\n/**\n * @private\n */\nexport function stripBasename(\n pathname: string,\n basename: string\n): string | null {\n if (basename === \"/\") return pathname;\n\n if (!pathname.toLowerCase().startsWith(basename.toLowerCase())) {\n return null;\n }\n\n // We want to leave trailing slash behavior in the user's control, so if they\n // specify a basename with a trailing slash, we should support it\n let startIndex = basename.endsWith(\"/\")\n ? basename.length - 1\n : basename.length;\n let nextChar = pathname.charAt(startIndex);\n if (nextChar && nextChar !== \"/\") {\n // pathname does not start with basename/\n return null;\n }\n\n return pathname.slice(startIndex) || \"/\";\n}\n\n/**\n * Returns a resolved path object relative to the given pathname.\n *\n * @see https://reactrouter.com/utils/resolve-path\n */\nexport function resolvePath(to: To, fromPathname = \"/\"): Path {\n let {\n pathname: toPathname,\n search = \"\",\n hash = \"\",\n } = typeof to === \"string\" ? parsePath(to) : to;\n\n let pathname = toPathname\n ? toPathname.startsWith(\"/\")\n ? toPathname\n : resolvePathname(toPathname, fromPathname)\n : fromPathname;\n\n return {\n pathname,\n search: normalizeSearch(search),\n hash: normalizeHash(hash),\n };\n}\n\nfunction resolvePathname(relativePath: string, fromPathname: string): string {\n let segments = fromPathname.replace(/\\/+$/, \"\").split(\"/\");\n let relativeSegments = relativePath.split(\"/\");\n\n relativeSegments.forEach((segment) => {\n if (segment === \"..\") {\n // Keep the root \"\" segment so the pathname starts at /\n if (segments.length > 1) segments.pop();\n } else if (segment !== \".\") {\n segments.push(segment);\n }\n });\n\n return segments.length > 1 ? segments.join(\"/\") : \"/\";\n}\n\nfunction getInvalidPathError(\n char: string,\n field: string,\n dest: string,\n path: Partial\n) {\n return (\n `Cannot include a '${char}' character in a manually specified ` +\n `\\`to.${field}\\` field [${JSON.stringify(\n path\n )}]. Please separate it out to the ` +\n `\\`to.${dest}\\` field. Alternatively you may provide the full path as ` +\n `a string in and the router will parse it for you.`\n );\n}\n\n/**\n * @private\n *\n * When processing relative navigation we want to ignore ancestor routes that\n * do not contribute to the path, such that index/pathless layout routes don't\n * interfere.\n *\n * For example, when moving a route element into an index route and/or a\n * pathless layout route, relative link behavior contained within should stay\n * the same. Both of the following examples should link back to the root:\n *\n * \n * \n * \n *\n * \n * \n * }> // <-- Does not contribute\n * // <-- Does not contribute\n * \n * \n */\nexport function getPathContributingMatches<\n T extends AgnosticRouteMatch = AgnosticRouteMatch\n>(matches: T[]) {\n return matches.filter(\n (match, index) =>\n index === 0 || (match.route.path && match.route.path.length > 0)\n );\n}\n\n/**\n * @private\n */\nexport function resolveTo(\n toArg: To,\n routePathnames: string[],\n locationPathname: string,\n isPathRelative = false\n): Path {\n let to: Partial;\n if (typeof toArg === \"string\") {\n to = parsePath(toArg);\n } else {\n to = { ...toArg };\n\n invariant(\n !to.pathname || !to.pathname.includes(\"?\"),\n getInvalidPathError(\"?\", \"pathname\", \"search\", to)\n );\n invariant(\n !to.pathname || !to.pathname.includes(\"#\"),\n getInvalidPathError(\"#\", \"pathname\", \"hash\", to)\n );\n invariant(\n !to.search || !to.search.includes(\"#\"),\n getInvalidPathError(\"#\", \"search\", \"hash\", to)\n );\n }\n\n let isEmptyPath = toArg === \"\" || to.pathname === \"\";\n let toPathname = isEmptyPath ? \"/\" : to.pathname;\n\n let from: string;\n\n // Routing is relative to the current pathname if explicitly requested.\n //\n // If a pathname is explicitly provided in `to`, it should be relative to the\n // route context. This is explained in `Note on `` values` in our\n // migration guide from v5 as a means of disambiguation between `to` values\n // that begin with `/` and those that do not. However, this is problematic for\n // `to` values that do not provide a pathname. `to` can simply be a search or\n // hash string, in which case we should assume that the navigation is relative\n // to the current location's pathname and *not* the route pathname.\n if (isPathRelative || toPathname == null) {\n from = locationPathname;\n } else {\n let routePathnameIndex = routePathnames.length - 1;\n\n if (toPathname.startsWith(\"..\")) {\n let toSegments = toPathname.split(\"/\");\n\n // Each leading .. segment means \"go up one route\" instead of \"go up one\n // URL segment\". This is a key difference from how works and a\n // major reason we call this a \"to\" value instead of a \"href\".\n while (toSegments[0] === \"..\") {\n toSegments.shift();\n routePathnameIndex -= 1;\n }\n\n to.pathname = toSegments.join(\"/\");\n }\n\n // If there are more \"..\" segments than parent routes, resolve relative to\n // the root / URL.\n from = routePathnameIndex >= 0 ? routePathnames[routePathnameIndex] : \"/\";\n }\n\n let path = resolvePath(to, from);\n\n // Ensure the pathname has a trailing slash if the original \"to\" had one\n let hasExplicitTrailingSlash =\n toPathname && toPathname !== \"/\" && toPathname.endsWith(\"/\");\n // Or if this was a link to the current path which has a trailing slash\n let hasCurrentTrailingSlash =\n (isEmptyPath || toPathname === \".\") && locationPathname.endsWith(\"/\");\n if (\n !path.pathname.endsWith(\"/\") &&\n (hasExplicitTrailingSlash || hasCurrentTrailingSlash)\n ) {\n path.pathname += \"/\";\n }\n\n return path;\n}\n\n/**\n * @private\n */\nexport function getToPathname(to: To): string | undefined {\n // Empty strings should be treated the same as / paths\n return to === \"\" || (to as Path).pathname === \"\"\n ? \"/\"\n : typeof to === \"string\"\n ? parsePath(to).pathname\n : to.pathname;\n}\n\n/**\n * @private\n */\nexport const joinPaths = (paths: string[]): string =>\n paths.join(\"/\").replace(/\\/\\/+/g, \"/\");\n\n/**\n * @private\n */\nexport const normalizePathname = (pathname: string): string =>\n pathname.replace(/\\/+$/, \"\").replace(/^\\/*/, \"/\");\n\n/**\n * @private\n */\nexport const normalizeSearch = (search: string): string =>\n !search || search === \"?\"\n ? \"\"\n : search.startsWith(\"?\")\n ? search\n : \"?\" + search;\n\n/**\n * @private\n */\nexport const normalizeHash = (hash: string): string =>\n !hash || hash === \"#\" ? \"\" : hash.startsWith(\"#\") ? hash : \"#\" + hash;\n\nexport type JsonFunction = (\n data: Data,\n init?: number | ResponseInit\n) => Response;\n\n/**\n * This is a shortcut for creating `application/json` responses. Converts `data`\n * to JSON and sets the `Content-Type` header.\n */\nexport const json: JsonFunction = (data, init = {}) => {\n let responseInit = typeof init === \"number\" ? { status: init } : init;\n\n let headers = new Headers(responseInit.headers);\n if (!headers.has(\"Content-Type\")) {\n headers.set(\"Content-Type\", \"application/json; charset=utf-8\");\n }\n\n return new Response(JSON.stringify(data), {\n ...responseInit,\n headers,\n });\n};\n\nexport interface TrackedPromise extends Promise {\n _tracked?: boolean;\n _data?: any;\n _error?: any;\n}\n\nexport class AbortedDeferredError extends Error {}\n\nexport class DeferredData {\n private pendingKeysSet: Set = new Set();\n private controller: AbortController;\n private abortPromise: Promise;\n private unlistenAbortSignal: () => void;\n private subscribers: Set<(aborted: boolean, settledKey?: string) => void> =\n new Set();\n data: Record;\n init?: ResponseInit;\n deferredKeys: string[] = [];\n\n constructor(data: Record, responseInit?: ResponseInit) {\n invariant(\n data && typeof data === \"object\" && !Array.isArray(data),\n \"defer() only accepts plain objects\"\n );\n\n // Set up an AbortController + Promise we can race against to exit early\n // cancellation\n let reject: (e: AbortedDeferredError) => void;\n this.abortPromise = new Promise((_, r) => (reject = r));\n this.controller = new AbortController();\n let onAbort = () =>\n reject(new AbortedDeferredError(\"Deferred data aborted\"));\n this.unlistenAbortSignal = () =>\n this.controller.signal.removeEventListener(\"abort\", onAbort);\n this.controller.signal.addEventListener(\"abort\", onAbort);\n\n this.data = Object.entries(data).reduce(\n (acc, [key, value]) =>\n Object.assign(acc, {\n [key]: this.trackPromise(key, value),\n }),\n {}\n );\n\n if (this.done) {\n // All incoming values were resolved\n this.unlistenAbortSignal();\n }\n\n this.init = responseInit;\n }\n\n private trackPromise(\n key: string,\n value: Promise | unknown\n ): TrackedPromise | unknown {\n if (!(value instanceof Promise)) {\n return value;\n }\n\n this.deferredKeys.push(key);\n this.pendingKeysSet.add(key);\n\n // We store a little wrapper promise that will be extended with\n // _data/_error props upon resolve/reject\n let promise: TrackedPromise = Promise.race([value, this.abortPromise]).then(\n (data) => this.onSettle(promise, key, undefined, data as unknown),\n (error) => this.onSettle(promise, key, error as unknown)\n );\n\n // Register rejection listeners to avoid uncaught promise rejections on\n // errors or aborted deferred values\n promise.catch(() => {});\n\n Object.defineProperty(promise, \"_tracked\", { get: () => true });\n return promise;\n }\n\n private onSettle(\n promise: TrackedPromise,\n key: string,\n error: unknown,\n data?: unknown\n ): unknown {\n if (\n this.controller.signal.aborted &&\n error instanceof AbortedDeferredError\n ) {\n this.unlistenAbortSignal();\n Object.defineProperty(promise, \"_error\", { get: () => error });\n return Promise.reject(error);\n }\n\n this.pendingKeysSet.delete(key);\n\n if (this.done) {\n // Nothing left to abort!\n this.unlistenAbortSignal();\n }\n\n // If the promise was resolved/rejected with undefined, we'll throw an error as you\n // should always resolve with a value or null\n if (error === undefined && data === undefined) {\n let undefinedError = new Error(\n `Deferred data for key \"${key}\" resolved/rejected with \\`undefined\\`, ` +\n `you must resolve/reject with a value or \\`null\\`.`\n );\n Object.defineProperty(promise, \"_error\", { get: () => undefinedError });\n this.emit(false, key);\n return Promise.reject(undefinedError);\n }\n\n if (data === undefined) {\n Object.defineProperty(promise, \"_error\", { get: () => error });\n this.emit(false, key);\n return Promise.reject(error);\n }\n\n Object.defineProperty(promise, \"_data\", { get: () => data });\n this.emit(false, key);\n return data;\n }\n\n private emit(aborted: boolean, settledKey?: string) {\n this.subscribers.forEach((subscriber) => subscriber(aborted, settledKey));\n }\n\n subscribe(fn: (aborted: boolean, settledKey?: string) => void) {\n this.subscribers.add(fn);\n return () => this.subscribers.delete(fn);\n }\n\n cancel() {\n this.controller.abort();\n this.pendingKeysSet.forEach((v, k) => this.pendingKeysSet.delete(k));\n this.emit(true);\n }\n\n async resolveData(signal: AbortSignal) {\n let aborted = false;\n if (!this.done) {\n let onAbort = () => this.cancel();\n signal.addEventListener(\"abort\", onAbort);\n aborted = await new Promise((resolve) => {\n this.subscribe((aborted) => {\n signal.removeEventListener(\"abort\", onAbort);\n if (aborted || this.done) {\n resolve(aborted);\n }\n });\n });\n }\n return aborted;\n }\n\n get done() {\n return this.pendingKeysSet.size === 0;\n }\n\n get unwrappedData() {\n invariant(\n this.data !== null && this.done,\n \"Can only unwrap data on initialized and settled deferreds\"\n );\n\n return Object.entries(this.data).reduce(\n (acc, [key, value]) =>\n Object.assign(acc, {\n [key]: unwrapTrackedPromise(value),\n }),\n {}\n );\n }\n\n get pendingKeys() {\n return Array.from(this.pendingKeysSet);\n }\n}\n\nfunction isTrackedPromise(value: any): value is TrackedPromise {\n return (\n value instanceof Promise && (value as TrackedPromise)._tracked === true\n );\n}\n\nfunction unwrapTrackedPromise(value: any) {\n if (!isTrackedPromise(value)) {\n return value;\n }\n\n if (value._error) {\n throw value._error;\n }\n return value._data;\n}\n\nexport type DeferFunction = (\n data: Record,\n init?: number | ResponseInit\n) => DeferredData;\n\nexport const defer: DeferFunction = (data, init = {}) => {\n let responseInit = typeof init === \"number\" ? { status: init } : init;\n\n return new DeferredData(data, responseInit);\n};\n\nexport type RedirectFunction = (\n url: string,\n init?: number | ResponseInit\n) => Response;\n\n/**\n * A redirect response. Sets the status code and the `Location` header.\n * Defaults to \"302 Found\".\n */\nexport const redirect: RedirectFunction = (url, init = 302) => {\n let responseInit = init;\n if (typeof responseInit === \"number\") {\n responseInit = { status: responseInit };\n } else if (typeof responseInit.status === \"undefined\") {\n responseInit.status = 302;\n }\n\n let headers = new Headers(responseInit.headers);\n headers.set(\"Location\", url);\n\n return new Response(null, {\n ...responseInit,\n headers,\n });\n};\n\n/**\n * A redirect response that will force a document reload to the new location.\n * Sets the status code and the `Location` header.\n * Defaults to \"302 Found\".\n */\nexport const redirectDocument: RedirectFunction = (url, init) => {\n let response = redirect(url, init);\n response.headers.set(\"X-Remix-Reload-Document\", \"true\");\n return response;\n};\n\n/**\n * @private\n * Utility class we use to hold auto-unwrapped 4xx/5xx Response bodies\n */\nexport class ErrorResponse {\n status: number;\n statusText: string;\n data: any;\n error?: Error;\n internal: boolean;\n\n constructor(\n status: number,\n statusText: string | undefined,\n data: any,\n internal = false\n ) {\n this.status = status;\n this.statusText = statusText || \"\";\n this.internal = internal;\n if (data instanceof Error) {\n this.data = data.toString();\n this.error = data;\n } else {\n this.data = data;\n }\n }\n}\n\n/**\n * Check if the given error is an ErrorResponse generated from a 4xx/5xx\n * Response thrown from an action/loader\n */\nexport function isRouteErrorResponse(error: any): error is ErrorResponse {\n return (\n error != null &&\n typeof error.status === \"number\" &&\n typeof error.statusText === \"string\" &&\n typeof error.internal === \"boolean\" &&\n \"data\" in error\n );\n}\n","import arrayWithHoles from \"./arrayWithHoles.js\";\nimport iterableToArray from \"./iterableToArray.js\";\nimport unsupportedIterableToArray from \"./unsupportedIterableToArray.js\";\nimport nonIterableRest from \"./nonIterableRest.js\";\nexport default function _toArray(arr) {\n return arrayWithHoles(arr) || iterableToArray(arr) || unsupportedIterableToArray(arr) || nonIterableRest();\n}","import type { History, Location, Path, To } from \"./history\";\nimport {\n Action as HistoryAction,\n createLocation,\n createPath,\n invariant,\n parsePath,\n warning,\n} from \"./history\";\nimport type {\n DataResult,\n DeferredData,\n AgnosticDataRouteMatch,\n AgnosticDataRouteObject,\n DeferredResult,\n ErrorResult,\n FormEncType,\n FormMethod,\n DetectErrorBoundaryFunction,\n RedirectResult,\n RouteData,\n AgnosticRouteObject,\n Submission,\n SuccessResult,\n AgnosticRouteMatch,\n ShouldRevalidateFunction,\n RouteManifest,\n ImmutableRouteKey,\n ActionFunction,\n LoaderFunction,\n V7_MutationFormMethod,\n V7_FormMethod,\n HTMLFormMethod,\n MutationFormMethod,\n MapRoutePropertiesFunction,\n} from \"./utils\";\nimport {\n ErrorResponse,\n ResultType,\n convertRoutesToDataRoutes,\n getPathContributingMatches,\n immutableRouteKeys,\n isRouteErrorResponse,\n joinPaths,\n matchRoutes,\n resolveTo,\n stripBasename,\n} from \"./utils\";\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Types and Constants\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * A Router instance manages all navigation and data loading/mutations\n */\nexport interface Router {\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Return the basename for the router\n */\n get basename(): RouterInit[\"basename\"];\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Return the current state of the router\n */\n get state(): RouterState;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Return the routes for this router instance\n */\n get routes(): AgnosticDataRouteObject[];\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Initialize the router, including adding history listeners and kicking off\n * initial data fetches. Returns a function to cleanup listeners and abort\n * any in-progress loads\n */\n initialize(): Router;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Subscribe to router.state updates\n *\n * @param fn function to call with the new state\n */\n subscribe(fn: RouterSubscriber): () => void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Enable scroll restoration behavior in the router\n *\n * @param savedScrollPositions Object that will manage positions, in case\n * it's being restored from sessionStorage\n * @param getScrollPosition Function to get the active Y scroll position\n * @param getKey Function to get the key to use for restoration\n */\n enableScrollRestoration(\n savedScrollPositions: Record,\n getScrollPosition: GetScrollPositionFunction,\n getKey?: GetScrollRestorationKeyFunction\n ): () => void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Navigate forward/backward in the history stack\n * @param to Delta to move in the history stack\n */\n navigate(to: number): Promise;\n\n /**\n * Navigate to the given path\n * @param to Path to navigate to\n * @param opts Navigation options (method, submission, etc.)\n */\n navigate(to: To | null, opts?: RouterNavigateOptions): Promise;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Trigger a fetcher load/submission\n *\n * @param key Fetcher key\n * @param routeId Route that owns the fetcher\n * @param href href to fetch\n * @param opts Fetcher options, (method, submission, etc.)\n */\n fetch(\n key: string,\n routeId: string,\n href: string | null,\n opts?: RouterFetchOptions\n ): void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Trigger a revalidation of all current route loaders and fetcher loads\n */\n revalidate(): void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Utility function to create an href for the given location\n * @param location\n */\n createHref(location: Location | URL): string;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Utility function to URL encode a destination path according to the internal\n * history implementation\n * @param to\n */\n encodeLocation(to: To): Path;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Get/create a fetcher for the given key\n * @param key\n */\n getFetcher(key?: string): Fetcher;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Delete the fetcher for a given key\n * @param key\n */\n deleteFetcher(key?: string): void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Cleanup listeners and abort any in-progress loads\n */\n dispose(): void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Get a navigation blocker\n * @param key The identifier for the blocker\n * @param fn The blocker function implementation\n */\n getBlocker(key: string, fn: BlockerFunction): Blocker;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Delete a navigation blocker\n * @param key The identifier for the blocker\n */\n deleteBlocker(key: string): void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * HMR needs to pass in-flight route updates to React Router\n * TODO: Replace this with granular route update APIs (addRoute, updateRoute, deleteRoute)\n */\n _internalSetRoutes(routes: AgnosticRouteObject[]): void;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Internal fetch AbortControllers accessed by unit tests\n */\n _internalFetchControllers: Map;\n\n /**\n * @internal\n * PRIVATE - DO NOT USE\n *\n * Internal pending DeferredData instances accessed by unit tests\n */\n _internalActiveDeferreds: Map;\n}\n\n/**\n * State maintained internally by the router. During a navigation, all states\n * reflect the the \"old\" location unless otherwise noted.\n */\nexport interface RouterState {\n /**\n * The action of the most recent navigation\n */\n historyAction: HistoryAction;\n\n /**\n * The current location reflected by the router\n */\n location: Location;\n\n /**\n * The current set of route matches\n */\n matches: AgnosticDataRouteMatch[];\n\n /**\n * Tracks whether we've completed our initial data load\n */\n initialized: boolean;\n\n /**\n * Current scroll position we should start at for a new view\n * - number -> scroll position to restore to\n * - false -> do not restore scroll at all (used during submissions)\n * - null -> don't have a saved position, scroll to hash or top of page\n */\n restoreScrollPosition: number | false | null;\n\n /**\n * Indicate whether this navigation should skip resetting the scroll position\n * if we are unable to restore the scroll position\n */\n preventScrollReset: boolean;\n\n /**\n * Tracks the state of the current navigation\n */\n navigation: Navigation;\n\n /**\n * Tracks any in-progress revalidations\n */\n revalidation: RevalidationState;\n\n /**\n * Data from the loaders for the current matches\n */\n loaderData: RouteData;\n\n /**\n * Data from the action for the current matches\n */\n actionData: RouteData | null;\n\n /**\n * Errors caught from loaders for the current matches\n */\n errors: RouteData | null;\n\n /**\n * Map of current fetchers\n */\n fetchers: Map;\n\n /**\n * Map of current blockers\n */\n blockers: Map;\n}\n\n/**\n * Data that can be passed into hydrate a Router from SSR\n */\nexport type HydrationState = Partial<\n Pick\n>;\n\n/**\n * Future flags to toggle new feature behavior\n */\nexport interface FutureConfig {\n v7_normalizeFormMethod: boolean;\n v7_prependBasename: boolean;\n}\n\n/**\n * Initialization options for createRouter\n */\nexport interface RouterInit {\n routes: AgnosticRouteObject[];\n history: History;\n basename?: string;\n /**\n * @deprecated Use `mapRouteProperties` instead\n */\n detectErrorBoundary?: DetectErrorBoundaryFunction;\n mapRouteProperties?: MapRoutePropertiesFunction;\n future?: Partial;\n hydrationData?: HydrationState;\n window?: Window;\n}\n\n/**\n * State returned from a server-side query() call\n */\nexport interface StaticHandlerContext {\n basename: Router[\"basename\"];\n location: RouterState[\"location\"];\n matches: RouterState[\"matches\"];\n loaderData: RouterState[\"loaderData\"];\n actionData: RouterState[\"actionData\"];\n errors: RouterState[\"errors\"];\n statusCode: number;\n loaderHeaders: Record;\n actionHeaders: Record;\n activeDeferreds: Record | null;\n _deepestRenderedBoundaryId?: string | null;\n}\n\n/**\n * A StaticHandler instance manages a singular SSR navigation/fetch event\n */\nexport interface StaticHandler {\n dataRoutes: AgnosticDataRouteObject[];\n query(\n request: Request,\n opts?: { requestContext?: unknown }\n ): Promise;\n queryRoute(\n request: Request,\n opts?: { routeId?: string; requestContext?: unknown }\n ): Promise;\n}\n\n/**\n * Subscriber function signature for changes to router state\n */\nexport interface RouterSubscriber {\n (state: RouterState): void;\n}\n\ninterface UseMatchesMatch {\n id: string;\n pathname: string;\n params: AgnosticRouteMatch[\"params\"];\n data: unknown;\n handle: unknown;\n}\n\n/**\n * Function signature for determining the key to be used in scroll restoration\n * for a given location\n */\nexport interface GetScrollRestorationKeyFunction {\n (location: Location, matches: UseMatchesMatch[]): string | null;\n}\n\n/**\n * Function signature for determining the current scroll position\n */\nexport interface GetScrollPositionFunction {\n (): number;\n}\n\nexport type RelativeRoutingType = \"route\" | \"path\";\n\n// Allowed for any navigation or fetch\ntype BaseNavigateOrFetchOptions = {\n preventScrollReset?: boolean;\n relative?: RelativeRoutingType;\n};\n\n// Only allowed for navigations\ntype BaseNavigateOptions = BaseNavigateOrFetchOptions & {\n replace?: boolean;\n state?: any;\n fromRouteId?: string;\n};\n\n// Only allowed for submission navigations\ntype BaseSubmissionOptions = {\n formMethod?: HTMLFormMethod;\n formEncType?: FormEncType;\n} & (\n | { formData: FormData; body?: undefined }\n | { formData?: undefined; body: any }\n);\n\n/**\n * Options for a navigate() call for a normal (non-submission) navigation\n */\ntype LinkNavigateOptions = BaseNavigateOptions;\n\n/**\n * Options for a navigate() call for a submission navigation\n */\ntype SubmissionNavigateOptions = BaseNavigateOptions & BaseSubmissionOptions;\n\n/**\n * Options to pass to navigate() for a navigation\n */\nexport type RouterNavigateOptions =\n | LinkNavigateOptions\n | SubmissionNavigateOptions;\n\n/**\n * Options for a fetch() load\n */\ntype LoadFetchOptions = BaseNavigateOrFetchOptions;\n\n/**\n * Options for a fetch() submission\n */\ntype SubmitFetchOptions = BaseNavigateOrFetchOptions & BaseSubmissionOptions;\n\n/**\n * Options to pass to fetch()\n */\nexport type RouterFetchOptions = LoadFetchOptions | SubmitFetchOptions;\n\n/**\n * Potential states for state.navigation\n */\nexport type NavigationStates = {\n Idle: {\n state: \"idle\";\n location: undefined;\n formMethod: undefined;\n formAction: undefined;\n formEncType: undefined;\n formData: undefined;\n json: undefined;\n text: undefined;\n };\n Loading: {\n state: \"loading\";\n location: Location;\n formMethod: Submission[\"formMethod\"] | undefined;\n formAction: Submission[\"formAction\"] | undefined;\n formEncType: Submission[\"formEncType\"] | undefined;\n formData: Submission[\"formData\"] | undefined;\n json: Submission[\"json\"] | undefined;\n text: Submission[\"text\"] | undefined;\n };\n Submitting: {\n state: \"submitting\";\n location: Location;\n formMethod: Submission[\"formMethod\"];\n formAction: Submission[\"formAction\"];\n formEncType: Submission[\"formEncType\"];\n formData: Submission[\"formData\"];\n json: Submission[\"json\"];\n text: Submission[\"text\"];\n };\n};\n\nexport type Navigation = NavigationStates[keyof NavigationStates];\n\nexport type RevalidationState = \"idle\" | \"loading\";\n\n/**\n * Potential states for fetchers\n */\ntype FetcherStates = {\n Idle: {\n state: \"idle\";\n formMethod: undefined;\n formAction: undefined;\n formEncType: undefined;\n text: undefined;\n formData: undefined;\n json: undefined;\n data: TData | undefined;\n \" _hasFetcherDoneAnything \"?: boolean;\n };\n Loading: {\n state: \"loading\";\n formMethod: Submission[\"formMethod\"] | undefined;\n formAction: Submission[\"formAction\"] | undefined;\n formEncType: Submission[\"formEncType\"] | undefined;\n text: Submission[\"text\"] | undefined;\n formData: Submission[\"formData\"] | undefined;\n json: Submission[\"json\"] | undefined;\n data: TData | undefined;\n \" _hasFetcherDoneAnything \"?: boolean;\n };\n Submitting: {\n state: \"submitting\";\n formMethod: Submission[\"formMethod\"];\n formAction: Submission[\"formAction\"];\n formEncType: Submission[\"formEncType\"];\n text: Submission[\"text\"];\n formData: Submission[\"formData\"];\n json: Submission[\"json\"];\n data: TData | undefined;\n \" _hasFetcherDoneAnything \"?: boolean;\n };\n};\n\nexport type Fetcher =\n FetcherStates[keyof FetcherStates];\n\ninterface BlockerBlocked {\n state: \"blocked\";\n reset(): void;\n proceed(): void;\n location: Location;\n}\n\ninterface BlockerUnblocked {\n state: \"unblocked\";\n reset: undefined;\n proceed: undefined;\n location: undefined;\n}\n\ninterface BlockerProceeding {\n state: \"proceeding\";\n reset: undefined;\n proceed: undefined;\n location: Location;\n}\n\nexport type Blocker = BlockerUnblocked | BlockerBlocked | BlockerProceeding;\n\nexport type BlockerFunction = (args: {\n currentLocation: Location;\n nextLocation: Location;\n historyAction: HistoryAction;\n}) => boolean;\n\ninterface ShortCircuitable {\n /**\n * startNavigation does not need to complete the navigation because we\n * redirected or got interrupted\n */\n shortCircuited?: boolean;\n}\n\ninterface HandleActionResult extends ShortCircuitable {\n /**\n * Error thrown from the current action, keyed by the route containing the\n * error boundary to render the error. To be committed to the state after\n * loaders have completed\n */\n pendingActionError?: RouteData;\n /**\n * Data returned from the current action, keyed by the route owning the action.\n * To be committed to the state after loaders have completed\n */\n pendingActionData?: RouteData;\n}\n\ninterface HandleLoadersResult extends ShortCircuitable {\n /**\n * loaderData returned from the current set of loaders\n */\n loaderData?: RouterState[\"loaderData\"];\n /**\n * errors thrown from the current set of loaders\n */\n errors?: RouterState[\"errors\"];\n}\n\n/**\n * Cached info for active fetcher.load() instances so they can participate\n * in revalidation\n */\ninterface FetchLoadMatch {\n routeId: string;\n path: string;\n}\n\n/**\n * Identified fetcher.load() calls that need to be revalidated\n */\ninterface RevalidatingFetcher extends FetchLoadMatch {\n key: string;\n match: AgnosticDataRouteMatch | null;\n matches: AgnosticDataRouteMatch[] | null;\n controller: AbortController | null;\n}\n\n/**\n * Wrapper object to allow us to throw any response out from callLoaderOrAction\n * for queryRouter while preserving whether or not it was thrown or returned\n * from the loader/action\n */\ninterface QueryRouteResponse {\n type: ResultType.data | ResultType.error;\n response: Response;\n}\n\nconst validMutationMethodsArr: MutationFormMethod[] = [\n \"post\",\n \"put\",\n \"patch\",\n \"delete\",\n];\nconst validMutationMethods = new Set(\n validMutationMethodsArr\n);\n\nconst validRequestMethodsArr: FormMethod[] = [\n \"get\",\n ...validMutationMethodsArr,\n];\nconst validRequestMethods = new Set(validRequestMethodsArr);\n\nconst redirectStatusCodes = new Set([301, 302, 303, 307, 308]);\nconst redirectPreserveMethodStatusCodes = new Set([307, 308]);\n\nexport const IDLE_NAVIGATION: NavigationStates[\"Idle\"] = {\n state: \"idle\",\n location: undefined,\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n json: undefined,\n text: undefined,\n};\n\nexport const IDLE_FETCHER: FetcherStates[\"Idle\"] = {\n state: \"idle\",\n data: undefined,\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n json: undefined,\n text: undefined,\n};\n\nexport const IDLE_BLOCKER: BlockerUnblocked = {\n state: \"unblocked\",\n proceed: undefined,\n reset: undefined,\n location: undefined,\n};\n\nconst ABSOLUTE_URL_REGEX = /^(?:[a-z][a-z0-9+.-]*:|\\/\\/)/i;\n\nconst defaultMapRouteProperties: MapRoutePropertiesFunction = (route) => ({\n hasErrorBoundary: Boolean(route.hasErrorBoundary),\n});\n\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region createRouter\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Create a router and listen to history POP navigations\n */\nexport function createRouter(init: RouterInit): Router {\n const routerWindow = init.window\n ? init.window\n : typeof window !== \"undefined\"\n ? window\n : undefined;\n const isBrowser =\n typeof routerWindow !== \"undefined\" &&\n typeof routerWindow.document !== \"undefined\" &&\n typeof routerWindow.document.createElement !== \"undefined\";\n const isServer = !isBrowser;\n\n invariant(\n init.routes.length > 0,\n \"You must provide a non-empty routes array to createRouter\"\n );\n\n let mapRouteProperties: MapRoutePropertiesFunction;\n if (init.mapRouteProperties) {\n mapRouteProperties = init.mapRouteProperties;\n } else if (init.detectErrorBoundary) {\n // If they are still using the deprecated version, wrap it with the new API\n let detectErrorBoundary = init.detectErrorBoundary;\n mapRouteProperties = (route) => ({\n hasErrorBoundary: detectErrorBoundary(route),\n });\n } else {\n mapRouteProperties = defaultMapRouteProperties;\n }\n\n // Routes keyed by ID\n let manifest: RouteManifest = {};\n // Routes in tree format for matching\n let dataRoutes = convertRoutesToDataRoutes(\n init.routes,\n mapRouteProperties,\n undefined,\n manifest\n );\n let inFlightDataRoutes: AgnosticDataRouteObject[] | undefined;\n let basename = init.basename || \"/\";\n // Config driven behavior flags\n let future: FutureConfig = {\n v7_normalizeFormMethod: false,\n v7_prependBasename: false,\n ...init.future,\n };\n // Cleanup function for history\n let unlistenHistory: (() => void) | null = null;\n // Externally-provided functions to call on all state changes\n let subscribers = new Set();\n // Externally-provided object to hold scroll restoration locations during routing\n let savedScrollPositions: Record | null = null;\n // Externally-provided function to get scroll restoration keys\n let getScrollRestorationKey: GetScrollRestorationKeyFunction | null = null;\n // Externally-provided function to get current scroll position\n let getScrollPosition: GetScrollPositionFunction | null = null;\n // One-time flag to control the initial hydration scroll restoration. Because\n // we don't get the saved positions from until _after_\n // the initial render, we need to manually trigger a separate updateState to\n // send along the restoreScrollPosition\n // Set to true if we have `hydrationData` since we assume we were SSR'd and that\n // SSR did the initial scroll restoration.\n let initialScrollRestored = init.hydrationData != null;\n\n let initialMatches = matchRoutes(dataRoutes, init.history.location, basename);\n let initialErrors: RouteData | null = null;\n\n if (initialMatches == null) {\n // If we do not match a user-provided-route, fall back to the root\n // to allow the error boundary to take over\n let error = getInternalRouterError(404, {\n pathname: init.history.location.pathname,\n });\n let { matches, route } = getShortCircuitMatches(dataRoutes);\n initialMatches = matches;\n initialErrors = { [route.id]: error };\n }\n\n let initialized =\n // All initialMatches need to be loaded before we're ready. If we have lazy\n // functions around still then we'll need to run them in initialize()\n !initialMatches.some((m) => m.route.lazy) &&\n // And we have to either have no loaders or have been provided hydrationData\n (!initialMatches.some((m) => m.route.loader) || init.hydrationData != null);\n\n let router: Router;\n let state: RouterState = {\n historyAction: init.history.action,\n location: init.history.location,\n matches: initialMatches,\n initialized,\n navigation: IDLE_NAVIGATION,\n // Don't restore on initial updateState() if we were SSR'd\n restoreScrollPosition: init.hydrationData != null ? false : null,\n preventScrollReset: false,\n revalidation: \"idle\",\n loaderData: (init.hydrationData && init.hydrationData.loaderData) || {},\n actionData: (init.hydrationData && init.hydrationData.actionData) || null,\n errors: (init.hydrationData && init.hydrationData.errors) || initialErrors,\n fetchers: new Map(),\n blockers: new Map(),\n };\n\n // -- Stateful internal variables to manage navigations --\n // Current navigation in progress (to be committed in completeNavigation)\n let pendingAction: HistoryAction = HistoryAction.Pop;\n\n // Should the current navigation prevent the scroll reset if scroll cannot\n // be restored?\n let pendingPreventScrollReset = false;\n\n // AbortController for the active navigation\n let pendingNavigationController: AbortController | null;\n\n // We use this to avoid touching history in completeNavigation if a\n // revalidation is entirely uninterrupted\n let isUninterruptedRevalidation = false;\n\n // Use this internal flag to force revalidation of all loaders:\n // - submissions (completed or interrupted)\n // - useRevalidator()\n // - X-Remix-Revalidate (from redirect)\n let isRevalidationRequired = false;\n\n // Use this internal array to capture routes that require revalidation due\n // to a cancelled deferred on action submission\n let cancelledDeferredRoutes: string[] = [];\n\n // Use this internal array to capture fetcher loads that were cancelled by an\n // action navigation and require revalidation\n let cancelledFetcherLoads: string[] = [];\n\n // AbortControllers for any in-flight fetchers\n let fetchControllers = new Map();\n\n // Track loads based on the order in which they started\n let incrementingLoadId = 0;\n\n // Track the outstanding pending navigation data load to be compared against\n // the globally incrementing load when a fetcher load lands after a completed\n // navigation\n let pendingNavigationLoadId = -1;\n\n // Fetchers that triggered data reloads as a result of their actions\n let fetchReloadIds = new Map();\n\n // Fetchers that triggered redirect navigations\n let fetchRedirectIds = new Set();\n\n // Most recent href/match for fetcher.load calls for fetchers\n let fetchLoadMatches = new Map();\n\n // Store DeferredData instances for active route matches. When a\n // route loader returns defer() we stick one in here. Then, when a nested\n // promise resolves we update loaderData. If a new navigation starts we\n // cancel active deferreds for eliminated routes.\n let activeDeferreds = new Map();\n\n // Store blocker functions in a separate Map outside of router state since\n // we don't need to update UI state if they change\n let blockerFunctions = new Map();\n\n // Flag to ignore the next history update, so we can revert the URL change on\n // a POP navigation that was blocked by the user without touching router state\n let ignoreNextHistoryUpdate = false;\n\n // Initialize the router, all side effects should be kicked off from here.\n // Implemented as a Fluent API for ease of:\n // let router = createRouter(init).initialize();\n function initialize() {\n // If history informs us of a POP navigation, start the navigation but do not update\n // state. We'll update our own state once the navigation completes\n unlistenHistory = init.history.listen(\n ({ action: historyAction, location, delta }) => {\n // Ignore this event if it was just us resetting the URL from a\n // blocked POP navigation\n if (ignoreNextHistoryUpdate) {\n ignoreNextHistoryUpdate = false;\n return;\n }\n\n warning(\n blockerFunctions.size === 0 || delta != null,\n \"You are trying to use a blocker on a POP navigation to a location \" +\n \"that was not created by @remix-run/router. This will fail silently in \" +\n \"production. This can happen if you are navigating outside the router \" +\n \"via `window.history.pushState`/`window.location.hash` instead of using \" +\n \"router navigation APIs. This can also happen if you are using \" +\n \"createHashRouter and the user manually changes the URL.\"\n );\n\n let blockerKey = shouldBlockNavigation({\n currentLocation: state.location,\n nextLocation: location,\n historyAction,\n });\n\n if (blockerKey && delta != null) {\n // Restore the URL to match the current UI, but don't update router state\n ignoreNextHistoryUpdate = true;\n init.history.go(delta * -1);\n\n // Put the blocker into a blocked state\n updateBlocker(blockerKey, {\n state: \"blocked\",\n location,\n proceed() {\n updateBlocker(blockerKey!, {\n state: \"proceeding\",\n proceed: undefined,\n reset: undefined,\n location,\n });\n // Re-do the same POP navigation we just blocked\n init.history.go(delta);\n },\n reset() {\n let blockers = new Map(state.blockers);\n blockers.set(blockerKey!, IDLE_BLOCKER);\n updateState({ blockers });\n },\n });\n return;\n }\n\n return startNavigation(historyAction, location);\n }\n );\n\n // Kick off initial data load if needed. Use Pop to avoid modifying history\n // Note we don't do any handling of lazy here. For SPA's it'll get handled\n // in the normal navigation flow. For SSR it's expected that lazy modules are\n // resolved prior to router creation since we can't go into a fallbackElement\n // UI for SSR'd apps\n if (!state.initialized) {\n startNavigation(HistoryAction.Pop, state.location);\n }\n\n return router;\n }\n\n // Clean up a router and it's side effects\n function dispose() {\n if (unlistenHistory) {\n unlistenHistory();\n }\n subscribers.clear();\n pendingNavigationController && pendingNavigationController.abort();\n state.fetchers.forEach((_, key) => deleteFetcher(key));\n state.blockers.forEach((_, key) => deleteBlocker(key));\n }\n\n // Subscribe to state updates for the router\n function subscribe(fn: RouterSubscriber) {\n subscribers.add(fn);\n return () => subscribers.delete(fn);\n }\n\n // Update our state and notify the calling context of the change\n function updateState(newState: Partial): void {\n state = {\n ...state,\n ...newState,\n };\n subscribers.forEach((subscriber) => subscriber(state));\n }\n\n // Complete a navigation returning the state.navigation back to the IDLE_NAVIGATION\n // and setting state.[historyAction/location/matches] to the new route.\n // - Location is a required param\n // - Navigation will always be set to IDLE_NAVIGATION\n // - Can pass any other state in newState\n function completeNavigation(\n location: Location,\n newState: Partial>\n ): void {\n // Deduce if we're in a loading/actionReload state:\n // - We have committed actionData in the store\n // - The current navigation was a mutation submission\n // - We're past the submitting state and into the loading state\n // - The location being loaded is not the result of a redirect\n let isActionReload =\n state.actionData != null &&\n state.navigation.formMethod != null &&\n isMutationMethod(state.navigation.formMethod) &&\n state.navigation.state === \"loading\" &&\n location.state?._isRedirect !== true;\n\n let actionData: RouteData | null;\n if (newState.actionData) {\n if (Object.keys(newState.actionData).length > 0) {\n actionData = newState.actionData;\n } else {\n // Empty actionData -> clear prior actionData due to an action error\n actionData = null;\n }\n } else if (isActionReload) {\n // Keep the current data if we're wrapping up the action reload\n actionData = state.actionData;\n } else {\n // Clear actionData on any other completed navigations\n actionData = null;\n }\n\n // Always preserve any existing loaderData from re-used routes\n let loaderData = newState.loaderData\n ? mergeLoaderData(\n state.loaderData,\n newState.loaderData,\n newState.matches || [],\n newState.errors\n )\n : state.loaderData;\n\n // On a successful navigation we can assume we got through all blockers\n // so we can start fresh\n let blockers = state.blockers;\n if (blockers.size > 0) {\n blockers = new Map(blockers);\n blockers.forEach((_, k) => blockers.set(k, IDLE_BLOCKER));\n }\n\n // Always respect the user flag. Otherwise don't reset on mutation\n // submission navigations unless they redirect\n let preventScrollReset =\n pendingPreventScrollReset === true ||\n (state.navigation.formMethod != null &&\n isMutationMethod(state.navigation.formMethod) &&\n location.state?._isRedirect !== true);\n\n if (inFlightDataRoutes) {\n dataRoutes = inFlightDataRoutes;\n inFlightDataRoutes = undefined;\n }\n\n if (isUninterruptedRevalidation) {\n // If this was an uninterrupted revalidation then do not touch history\n } else if (pendingAction === HistoryAction.Pop) {\n // Do nothing for POP - URL has already been updated\n } else if (pendingAction === HistoryAction.Push) {\n init.history.push(location, location.state);\n } else if (pendingAction === HistoryAction.Replace) {\n init.history.replace(location, location.state);\n }\n\n updateState({\n ...newState, // matches, errors, fetchers go through as-is\n actionData,\n loaderData,\n historyAction: pendingAction,\n location,\n initialized: true,\n navigation: IDLE_NAVIGATION,\n revalidation: \"idle\",\n restoreScrollPosition: getSavedScrollPosition(\n location,\n newState.matches || state.matches\n ),\n preventScrollReset,\n blockers,\n });\n\n // Reset stateful navigation vars\n pendingAction = HistoryAction.Pop;\n pendingPreventScrollReset = false;\n isUninterruptedRevalidation = false;\n isRevalidationRequired = false;\n cancelledDeferredRoutes = [];\n cancelledFetcherLoads = [];\n }\n\n // Trigger a navigation event, which can either be a numerical POP or a PUSH\n // replace with an optional submission\n async function navigate(\n to: number | To | null,\n opts?: RouterNavigateOptions\n ): Promise {\n if (typeof to === \"number\") {\n init.history.go(to);\n return;\n }\n\n let normalizedPath = normalizeTo(\n state.location,\n state.matches,\n basename,\n future.v7_prependBasename,\n to,\n opts?.fromRouteId,\n opts?.relative\n );\n let { path, submission, error } = normalizeNavigateOptions(\n future.v7_normalizeFormMethod,\n false,\n normalizedPath,\n opts\n );\n\n let currentLocation = state.location;\n let nextLocation = createLocation(state.location, path, opts && opts.state);\n\n // When using navigate as a PUSH/REPLACE we aren't reading an already-encoded\n // URL from window.location, so we need to encode it here so the behavior\n // remains the same as POP and non-data-router usages. new URL() does all\n // the same encoding we'd get from a history.pushState/window.location read\n // without having to touch history\n nextLocation = {\n ...nextLocation,\n ...init.history.encodeLocation(nextLocation),\n };\n\n let userReplace = opts && opts.replace != null ? opts.replace : undefined;\n\n let historyAction = HistoryAction.Push;\n\n if (userReplace === true) {\n historyAction = HistoryAction.Replace;\n } else if (userReplace === false) {\n // no-op\n } else if (\n submission != null &&\n isMutationMethod(submission.formMethod) &&\n submission.formAction === state.location.pathname + state.location.search\n ) {\n // By default on submissions to the current location we REPLACE so that\n // users don't have to double-click the back button to get to the prior\n // location. If the user redirects to a different location from the\n // action/loader this will be ignored and the redirect will be a PUSH\n historyAction = HistoryAction.Replace;\n }\n\n let preventScrollReset =\n opts && \"preventScrollReset\" in opts\n ? opts.preventScrollReset === true\n : undefined;\n\n let blockerKey = shouldBlockNavigation({\n currentLocation,\n nextLocation,\n historyAction,\n });\n\n if (blockerKey) {\n // Put the blocker into a blocked state\n updateBlocker(blockerKey, {\n state: \"blocked\",\n location: nextLocation,\n proceed() {\n updateBlocker(blockerKey!, {\n state: \"proceeding\",\n proceed: undefined,\n reset: undefined,\n location: nextLocation,\n });\n // Send the same navigation through\n navigate(to, opts);\n },\n reset() {\n let blockers = new Map(state.blockers);\n blockers.set(blockerKey!, IDLE_BLOCKER);\n updateState({ blockers });\n },\n });\n return;\n }\n\n return await startNavigation(historyAction, nextLocation, {\n submission,\n // Send through the formData serialization error if we have one so we can\n // render at the right error boundary after we match routes\n pendingError: error,\n preventScrollReset,\n replace: opts && opts.replace,\n });\n }\n\n // Revalidate all current loaders. If a navigation is in progress or if this\n // is interrupted by a navigation, allow this to \"succeed\" by calling all\n // loaders during the next loader round\n function revalidate() {\n interruptActiveLoads();\n updateState({ revalidation: \"loading\" });\n\n // If we're currently submitting an action, we don't need to start a new\n // navigation, we'll just let the follow up loader execution call all loaders\n if (state.navigation.state === \"submitting\") {\n return;\n }\n\n // If we're currently in an idle state, start a new navigation for the current\n // action/location and mark it as uninterrupted, which will skip the history\n // update in completeNavigation\n if (state.navigation.state === \"idle\") {\n startNavigation(state.historyAction, state.location, {\n startUninterruptedRevalidation: true,\n });\n return;\n }\n\n // Otherwise, if we're currently in a loading state, just start a new\n // navigation to the navigation.location but do not trigger an uninterrupted\n // revalidation so that history correctly updates once the navigation completes\n startNavigation(\n pendingAction || state.historyAction,\n state.navigation.location,\n { overrideNavigation: state.navigation }\n );\n }\n\n // Start a navigation to the given action/location. Can optionally provide a\n // overrideNavigation which will override the normalLoad in the case of a redirect\n // navigation\n async function startNavigation(\n historyAction: HistoryAction,\n location: Location,\n opts?: {\n submission?: Submission;\n fetcherSubmission?: Submission;\n overrideNavigation?: Navigation;\n pendingError?: ErrorResponse;\n startUninterruptedRevalidation?: boolean;\n preventScrollReset?: boolean;\n replace?: boolean;\n }\n ): Promise {\n // Abort any in-progress navigations and start a new one. Unset any ongoing\n // uninterrupted revalidations unless told otherwise, since we want this\n // new navigation to update history normally\n pendingNavigationController && pendingNavigationController.abort();\n pendingNavigationController = null;\n pendingAction = historyAction;\n isUninterruptedRevalidation =\n (opts && opts.startUninterruptedRevalidation) === true;\n\n // Save the current scroll position every time we start a new navigation,\n // and track whether we should reset scroll on completion\n saveScrollPosition(state.location, state.matches);\n pendingPreventScrollReset = (opts && opts.preventScrollReset) === true;\n\n let routesToUse = inFlightDataRoutes || dataRoutes;\n let loadingNavigation = opts && opts.overrideNavigation;\n let matches = matchRoutes(routesToUse, location, basename);\n\n // Short circuit with a 404 on the root error boundary if we match nothing\n if (!matches) {\n let error = getInternalRouterError(404, { pathname: location.pathname });\n let { matches: notFoundMatches, route } =\n getShortCircuitMatches(routesToUse);\n // Cancel all pending deferred on 404s since we don't keep any routes\n cancelActiveDeferreds();\n completeNavigation(location, {\n matches: notFoundMatches,\n loaderData: {},\n errors: {\n [route.id]: error,\n },\n });\n return;\n }\n\n // Short circuit if it's only a hash change and not a revalidation or\n // mutation submission.\n //\n // Ignore on initial page loads because since the initial load will always\n // be \"same hash\". For example, on /page#hash and submit a \n // which will default to a navigation to /page\n if (\n state.initialized &&\n !isRevalidationRequired &&\n isHashChangeOnly(state.location, location) &&\n !(opts && opts.submission && isMutationMethod(opts.submission.formMethod))\n ) {\n completeNavigation(location, { matches });\n return;\n }\n\n // Create a controller/Request for this navigation\n pendingNavigationController = new AbortController();\n let request = createClientSideRequest(\n init.history,\n location,\n pendingNavigationController.signal,\n opts && opts.submission\n );\n let pendingActionData: RouteData | undefined;\n let pendingError: RouteData | undefined;\n\n if (opts && opts.pendingError) {\n // If we have a pendingError, it means the user attempted a GET submission\n // with binary FormData so assign here and skip to handleLoaders. That\n // way we handle calling loaders above the boundary etc. It's not really\n // different from an actionError in that sense.\n pendingError = {\n [findNearestBoundary(matches).route.id]: opts.pendingError,\n };\n } else if (\n opts &&\n opts.submission &&\n isMutationMethod(opts.submission.formMethod)\n ) {\n // Call action if we received an action submission\n let actionOutput = await handleAction(\n request,\n location,\n opts.submission,\n matches,\n { replace: opts.replace }\n );\n\n if (actionOutput.shortCircuited) {\n return;\n }\n\n pendingActionData = actionOutput.pendingActionData;\n pendingError = actionOutput.pendingActionError;\n loadingNavigation = getLoadingNavigation(location, opts.submission);\n\n // Create a GET request for the loaders\n request = new Request(request.url, { signal: request.signal });\n }\n\n // Call loaders\n let { shortCircuited, loaderData, errors } = await handleLoaders(\n request,\n location,\n matches,\n loadingNavigation,\n opts && opts.submission,\n opts && opts.fetcherSubmission,\n opts && opts.replace,\n pendingActionData,\n pendingError\n );\n\n if (shortCircuited) {\n return;\n }\n\n // Clean up now that the action/loaders have completed. Don't clean up if\n // we short circuited because pendingNavigationController will have already\n // been assigned to a new controller for the next navigation\n pendingNavigationController = null;\n\n completeNavigation(location, {\n matches,\n ...(pendingActionData ? { actionData: pendingActionData } : {}),\n loaderData,\n errors,\n });\n }\n\n // Call the action matched by the leaf route for this navigation and handle\n // redirects/errors\n async function handleAction(\n request: Request,\n location: Location,\n submission: Submission,\n matches: AgnosticDataRouteMatch[],\n opts: { replace?: boolean } = {}\n ): Promise {\n interruptActiveLoads();\n\n // Put us in a submitting state\n let navigation = getSubmittingNavigation(location, submission);\n updateState({ navigation });\n\n // Call our action and get the result\n let result: DataResult;\n let actionMatch = getTargetMatch(matches, location);\n\n if (!actionMatch.route.action && !actionMatch.route.lazy) {\n result = {\n type: ResultType.error,\n error: getInternalRouterError(405, {\n method: request.method,\n pathname: location.pathname,\n routeId: actionMatch.route.id,\n }),\n };\n } else {\n result = await callLoaderOrAction(\n \"action\",\n request,\n actionMatch,\n matches,\n manifest,\n mapRouteProperties,\n basename\n );\n\n if (request.signal.aborted) {\n return { shortCircuited: true };\n }\n }\n\n if (isRedirectResult(result)) {\n let replace: boolean;\n if (opts && opts.replace != null) {\n replace = opts.replace;\n } else {\n // If the user didn't explicity indicate replace behavior, replace if\n // we redirected to the exact same location we're currently at to avoid\n // double back-buttons\n replace =\n result.location === state.location.pathname + state.location.search;\n }\n await startRedirectNavigation(state, result, { submission, replace });\n return { shortCircuited: true };\n }\n\n if (isErrorResult(result)) {\n // Store off the pending error - we use it to determine which loaders\n // to call and will commit it when we complete the navigation\n let boundaryMatch = findNearestBoundary(matches, actionMatch.route.id);\n\n // By default, all submissions are REPLACE navigations, but if the\n // action threw an error that'll be rendered in an errorElement, we fall\n // back to PUSH so that the user can use the back button to get back to\n // the pre-submission form location to try again\n if ((opts && opts.replace) !== true) {\n pendingAction = HistoryAction.Push;\n }\n\n return {\n // Send back an empty object we can use to clear out any prior actionData\n pendingActionData: {},\n pendingActionError: { [boundaryMatch.route.id]: result.error },\n };\n }\n\n if (isDeferredResult(result)) {\n throw getInternalRouterError(400, { type: \"defer-action\" });\n }\n\n return {\n pendingActionData: { [actionMatch.route.id]: result.data },\n };\n }\n\n // Call all applicable loaders for the given matches, handling redirects,\n // errors, etc.\n async function handleLoaders(\n request: Request,\n location: Location,\n matches: AgnosticDataRouteMatch[],\n overrideNavigation?: Navigation,\n submission?: Submission,\n fetcherSubmission?: Submission,\n replace?: boolean,\n pendingActionData?: RouteData,\n pendingError?: RouteData\n ): Promise {\n // Figure out the right navigation we want to use for data loading\n let loadingNavigation =\n overrideNavigation || getLoadingNavigation(location, submission);\n\n // If this was a redirect from an action we don't have a \"submission\" but\n // we have it on the loading navigation so use that if available\n let activeSubmission =\n submission ||\n fetcherSubmission ||\n getSubmissionFromNavigation(loadingNavigation);\n\n let routesToUse = inFlightDataRoutes || dataRoutes;\n let [matchesToLoad, revalidatingFetchers] = getMatchesToLoad(\n init.history,\n state,\n matches,\n activeSubmission,\n location,\n isRevalidationRequired,\n cancelledDeferredRoutes,\n cancelledFetcherLoads,\n fetchLoadMatches,\n fetchRedirectIds,\n routesToUse,\n basename,\n pendingActionData,\n pendingError\n );\n\n // Cancel pending deferreds for no-longer-matched routes or routes we're\n // about to reload. Note that if this is an action reload we would have\n // already cancelled all pending deferreds so this would be a no-op\n cancelActiveDeferreds(\n (routeId) =>\n !(matches && matches.some((m) => m.route.id === routeId)) ||\n (matchesToLoad && matchesToLoad.some((m) => m.route.id === routeId))\n );\n\n pendingNavigationLoadId = ++incrementingLoadId;\n\n // Short circuit if we have no loaders to run\n if (matchesToLoad.length === 0 && revalidatingFetchers.length === 0) {\n let updatedFetchers = markFetchRedirectsDone();\n completeNavigation(location, {\n matches,\n loaderData: {},\n // Commit pending error if we're short circuiting\n errors: pendingError || null,\n ...(pendingActionData ? { actionData: pendingActionData } : {}),\n ...(updatedFetchers ? { fetchers: new Map(state.fetchers) } : {}),\n });\n return { shortCircuited: true };\n }\n\n // If this is an uninterrupted revalidation, we remain in our current idle\n // state. If not, we need to switch to our loading state and load data,\n // preserving any new action data or existing action data (in the case of\n // a revalidation interrupting an actionReload)\n if (!isUninterruptedRevalidation) {\n revalidatingFetchers.forEach((rf) => {\n let fetcher = state.fetchers.get(rf.key);\n let revalidatingFetcher = getLoadingFetcher(\n undefined,\n fetcher ? fetcher.data : undefined\n );\n state.fetchers.set(rf.key, revalidatingFetcher);\n });\n let actionData = pendingActionData || state.actionData;\n updateState({\n navigation: loadingNavigation,\n ...(actionData\n ? Object.keys(actionData).length === 0\n ? { actionData: null }\n : { actionData }\n : {}),\n ...(revalidatingFetchers.length > 0\n ? { fetchers: new Map(state.fetchers) }\n : {}),\n });\n }\n\n revalidatingFetchers.forEach((rf) => {\n if (fetchControllers.has(rf.key)) {\n abortFetcher(rf.key);\n }\n if (rf.controller) {\n // Fetchers use an independent AbortController so that aborting a fetcher\n // (via deleteFetcher) does not abort the triggering navigation that\n // triggered the revalidation\n fetchControllers.set(rf.key, rf.controller);\n }\n });\n\n // Proxy navigation abort through to revalidation fetchers\n let abortPendingFetchRevalidations = () =>\n revalidatingFetchers.forEach((f) => abortFetcher(f.key));\n if (pendingNavigationController) {\n pendingNavigationController.signal.addEventListener(\n \"abort\",\n abortPendingFetchRevalidations\n );\n }\n\n let { results, loaderResults, fetcherResults } =\n await callLoadersAndMaybeResolveData(\n state.matches,\n matches,\n matchesToLoad,\n revalidatingFetchers,\n request\n );\n\n if (request.signal.aborted) {\n return { shortCircuited: true };\n }\n\n // Clean up _after_ loaders have completed. Don't clean up if we short\n // circuited because fetchControllers would have been aborted and\n // reassigned to new controllers for the next navigation\n if (pendingNavigationController) {\n pendingNavigationController.signal.removeEventListener(\n \"abort\",\n abortPendingFetchRevalidations\n );\n }\n revalidatingFetchers.forEach((rf) => fetchControllers.delete(rf.key));\n\n // If any loaders returned a redirect Response, start a new REPLACE navigation\n let redirect = findRedirect(results);\n if (redirect) {\n if (redirect.idx >= matchesToLoad.length) {\n // If this redirect came from a fetcher make sure we mark it in\n // fetchRedirectIds so it doesn't get revalidated on the next set of\n // loader executions\n let fetcherKey =\n revalidatingFetchers[redirect.idx - matchesToLoad.length].key;\n fetchRedirectIds.add(fetcherKey);\n }\n await startRedirectNavigation(state, redirect.result, { replace });\n return { shortCircuited: true };\n }\n\n // Process and commit output from loaders\n let { loaderData, errors } = processLoaderData(\n state,\n matches,\n matchesToLoad,\n loaderResults,\n pendingError,\n revalidatingFetchers,\n fetcherResults,\n activeDeferreds\n );\n\n // Wire up subscribers to update loaderData as promises settle\n activeDeferreds.forEach((deferredData, routeId) => {\n deferredData.subscribe((aborted) => {\n // Note: No need to updateState here since the TrackedPromise on\n // loaderData is stable across resolve/reject\n // Remove this instance if we were aborted or if promises have settled\n if (aborted || deferredData.done) {\n activeDeferreds.delete(routeId);\n }\n });\n });\n\n let updatedFetchers = markFetchRedirectsDone();\n let didAbortFetchLoads = abortStaleFetchLoads(pendingNavigationLoadId);\n let shouldUpdateFetchers =\n updatedFetchers || didAbortFetchLoads || revalidatingFetchers.length > 0;\n\n return {\n loaderData,\n errors,\n ...(shouldUpdateFetchers ? { fetchers: new Map(state.fetchers) } : {}),\n };\n }\n\n function getFetcher(key: string): Fetcher {\n return state.fetchers.get(key) || IDLE_FETCHER;\n }\n\n // Trigger a fetcher load/submit for the given fetcher key\n function fetch(\n key: string,\n routeId: string,\n href: string | null,\n opts?: RouterFetchOptions\n ) {\n if (isServer) {\n throw new Error(\n \"router.fetch() was called during the server render, but it shouldn't be. \" +\n \"You are likely calling a useFetcher() method in the body of your component. \" +\n \"Try moving it to a useEffect or a callback.\"\n );\n }\n\n if (fetchControllers.has(key)) abortFetcher(key);\n\n let routesToUse = inFlightDataRoutes || dataRoutes;\n let normalizedPath = normalizeTo(\n state.location,\n state.matches,\n basename,\n future.v7_prependBasename,\n href,\n routeId,\n opts?.relative\n );\n let matches = matchRoutes(routesToUse, normalizedPath, basename);\n\n if (!matches) {\n setFetcherError(\n key,\n routeId,\n getInternalRouterError(404, { pathname: normalizedPath })\n );\n return;\n }\n\n let { path, submission, error } = normalizeNavigateOptions(\n future.v7_normalizeFormMethod,\n true,\n normalizedPath,\n opts\n );\n\n if (error) {\n setFetcherError(key, routeId, error);\n return;\n }\n\n let match = getTargetMatch(matches, path);\n\n pendingPreventScrollReset = (opts && opts.preventScrollReset) === true;\n\n if (submission && isMutationMethod(submission.formMethod)) {\n handleFetcherAction(key, routeId, path, match, matches, submission);\n return;\n }\n\n // Store off the match so we can call it's shouldRevalidate on subsequent\n // revalidations\n fetchLoadMatches.set(key, { routeId, path });\n handleFetcherLoader(key, routeId, path, match, matches, submission);\n }\n\n // Call the action for the matched fetcher.submit(), and then handle redirects,\n // errors, and revalidation\n async function handleFetcherAction(\n key: string,\n routeId: string,\n path: string,\n match: AgnosticDataRouteMatch,\n requestMatches: AgnosticDataRouteMatch[],\n submission: Submission\n ) {\n interruptActiveLoads();\n fetchLoadMatches.delete(key);\n\n if (!match.route.action && !match.route.lazy) {\n let error = getInternalRouterError(405, {\n method: submission.formMethod,\n pathname: path,\n routeId: routeId,\n });\n setFetcherError(key, routeId, error);\n return;\n }\n\n // Put this fetcher into it's submitting state\n let existingFetcher = state.fetchers.get(key);\n let fetcher = getSubmittingFetcher(submission, existingFetcher);\n state.fetchers.set(key, fetcher);\n updateState({ fetchers: new Map(state.fetchers) });\n\n // Call the action for the fetcher\n let abortController = new AbortController();\n let fetchRequest = createClientSideRequest(\n init.history,\n path,\n abortController.signal,\n submission\n );\n fetchControllers.set(key, abortController);\n\n let originatingLoadId = incrementingLoadId;\n let actionResult = await callLoaderOrAction(\n \"action\",\n fetchRequest,\n match,\n requestMatches,\n manifest,\n mapRouteProperties,\n basename\n );\n\n if (fetchRequest.signal.aborted) {\n // We can delete this so long as we weren't aborted by ou our own fetcher\n // re-submit which would have put _new_ controller is in fetchControllers\n if (fetchControllers.get(key) === abortController) {\n fetchControllers.delete(key);\n }\n return;\n }\n\n if (isRedirectResult(actionResult)) {\n fetchControllers.delete(key);\n if (pendingNavigationLoadId > originatingLoadId) {\n // A new navigation was kicked off after our action started, so that\n // should take precedence over this redirect navigation. We already\n // set isRevalidationRequired so all loaders for the new route should\n // fire unless opted out via shouldRevalidate\n let doneFetcher = getDoneFetcher(undefined);\n state.fetchers.set(key, doneFetcher);\n updateState({ fetchers: new Map(state.fetchers) });\n return;\n } else {\n fetchRedirectIds.add(key);\n let loadingFetcher = getLoadingFetcher(submission);\n state.fetchers.set(key, loadingFetcher);\n updateState({ fetchers: new Map(state.fetchers) });\n\n return startRedirectNavigation(state, actionResult, {\n submission,\n isFetchActionRedirect: true,\n });\n }\n }\n\n // Process any non-redirect errors thrown\n if (isErrorResult(actionResult)) {\n setFetcherError(key, routeId, actionResult.error);\n return;\n }\n\n if (isDeferredResult(actionResult)) {\n throw getInternalRouterError(400, { type: \"defer-action\" });\n }\n\n // Start the data load for current matches, or the next location if we're\n // in the middle of a navigation\n let nextLocation = state.navigation.location || state.location;\n let revalidationRequest = createClientSideRequest(\n init.history,\n nextLocation,\n abortController.signal\n );\n let routesToUse = inFlightDataRoutes || dataRoutes;\n let matches =\n state.navigation.state !== \"idle\"\n ? matchRoutes(routesToUse, state.navigation.location, basename)\n : state.matches;\n\n invariant(matches, \"Didn't find any matches after fetcher action\");\n\n let loadId = ++incrementingLoadId;\n fetchReloadIds.set(key, loadId);\n\n let loadFetcher = getLoadingFetcher(submission, actionResult.data);\n state.fetchers.set(key, loadFetcher);\n\n let [matchesToLoad, revalidatingFetchers] = getMatchesToLoad(\n init.history,\n state,\n matches,\n submission,\n nextLocation,\n isRevalidationRequired,\n cancelledDeferredRoutes,\n cancelledFetcherLoads,\n fetchLoadMatches,\n fetchRedirectIds,\n routesToUse,\n basename,\n { [match.route.id]: actionResult.data },\n undefined // No need to send through errors since we short circuit above\n );\n\n // Put all revalidating fetchers into the loading state, except for the\n // current fetcher which we want to keep in it's current loading state which\n // contains it's action submission info + action data\n revalidatingFetchers\n .filter((rf) => rf.key !== key)\n .forEach((rf) => {\n let staleKey = rf.key;\n let existingFetcher = state.fetchers.get(staleKey);\n let revalidatingFetcher = getLoadingFetcher(\n undefined,\n existingFetcher ? existingFetcher.data : undefined\n );\n state.fetchers.set(staleKey, revalidatingFetcher);\n if (fetchControllers.has(staleKey)) {\n abortFetcher(staleKey);\n }\n if (rf.controller) {\n fetchControllers.set(staleKey, rf.controller);\n }\n });\n\n updateState({ fetchers: new Map(state.fetchers) });\n\n let abortPendingFetchRevalidations = () =>\n revalidatingFetchers.forEach((rf) => abortFetcher(rf.key));\n\n abortController.signal.addEventListener(\n \"abort\",\n abortPendingFetchRevalidations\n );\n\n let { results, loaderResults, fetcherResults } =\n await callLoadersAndMaybeResolveData(\n state.matches,\n matches,\n matchesToLoad,\n revalidatingFetchers,\n revalidationRequest\n );\n\n if (abortController.signal.aborted) {\n return;\n }\n\n abortController.signal.removeEventListener(\n \"abort\",\n abortPendingFetchRevalidations\n );\n\n fetchReloadIds.delete(key);\n fetchControllers.delete(key);\n revalidatingFetchers.forEach((r) => fetchControllers.delete(r.key));\n\n let redirect = findRedirect(results);\n if (redirect) {\n if (redirect.idx >= matchesToLoad.length) {\n // If this redirect came from a fetcher make sure we mark it in\n // fetchRedirectIds so it doesn't get revalidated on the next set of\n // loader executions\n let fetcherKey =\n revalidatingFetchers[redirect.idx - matchesToLoad.length].key;\n fetchRedirectIds.add(fetcherKey);\n }\n return startRedirectNavigation(state, redirect.result);\n }\n\n // Process and commit output from loaders\n let { loaderData, errors } = processLoaderData(\n state,\n state.matches,\n matchesToLoad,\n loaderResults,\n undefined,\n revalidatingFetchers,\n fetcherResults,\n activeDeferreds\n );\n\n // Since we let revalidations complete even if the submitting fetcher was\n // deleted, only put it back to idle if it hasn't been deleted\n if (state.fetchers.has(key)) {\n let doneFetcher = getDoneFetcher(actionResult.data);\n state.fetchers.set(key, doneFetcher);\n }\n\n let didAbortFetchLoads = abortStaleFetchLoads(loadId);\n\n // If we are currently in a navigation loading state and this fetcher is\n // more recent than the navigation, we want the newer data so abort the\n // navigation and complete it with the fetcher data\n if (\n state.navigation.state === \"loading\" &&\n loadId > pendingNavigationLoadId\n ) {\n invariant(pendingAction, \"Expected pending action\");\n pendingNavigationController && pendingNavigationController.abort();\n\n completeNavigation(state.navigation.location, {\n matches,\n loaderData,\n errors,\n fetchers: new Map(state.fetchers),\n });\n } else {\n // otherwise just update with the fetcher data, preserving any existing\n // loaderData for loaders that did not need to reload. We have to\n // manually merge here since we aren't going through completeNavigation\n updateState({\n errors,\n loaderData: mergeLoaderData(\n state.loaderData,\n loaderData,\n matches,\n errors\n ),\n ...(didAbortFetchLoads || revalidatingFetchers.length > 0\n ? { fetchers: new Map(state.fetchers) }\n : {}),\n });\n isRevalidationRequired = false;\n }\n }\n\n // Call the matched loader for fetcher.load(), handling redirects, errors, etc.\n async function handleFetcherLoader(\n key: string,\n routeId: string,\n path: string,\n match: AgnosticDataRouteMatch,\n matches: AgnosticDataRouteMatch[],\n submission?: Submission\n ) {\n let existingFetcher = state.fetchers.get(key);\n // Put this fetcher into it's loading state\n let loadingFetcher = getLoadingFetcher(\n submission,\n existingFetcher ? existingFetcher.data : undefined\n );\n state.fetchers.set(key, loadingFetcher);\n updateState({ fetchers: new Map(state.fetchers) });\n\n // Call the loader for this fetcher route match\n let abortController = new AbortController();\n let fetchRequest = createClientSideRequest(\n init.history,\n path,\n abortController.signal\n );\n fetchControllers.set(key, abortController);\n\n let originatingLoadId = incrementingLoadId;\n let result: DataResult = await callLoaderOrAction(\n \"loader\",\n fetchRequest,\n match,\n matches,\n manifest,\n mapRouteProperties,\n basename\n );\n\n // Deferred isn't supported for fetcher loads, await everything and treat it\n // as a normal load. resolveDeferredData will return undefined if this\n // fetcher gets aborted, so we just leave result untouched and short circuit\n // below if that happens\n if (isDeferredResult(result)) {\n result =\n (await resolveDeferredData(result, fetchRequest.signal, true)) ||\n result;\n }\n\n // We can delete this so long as we weren't aborted by our our own fetcher\n // re-load which would have put _new_ controller is in fetchControllers\n if (fetchControllers.get(key) === abortController) {\n fetchControllers.delete(key);\n }\n\n if (fetchRequest.signal.aborted) {\n return;\n }\n\n // If the loader threw a redirect Response, start a new REPLACE navigation\n if (isRedirectResult(result)) {\n if (pendingNavigationLoadId > originatingLoadId) {\n // A new navigation was kicked off after our loader started, so that\n // should take precedence over this redirect navigation\n let doneFetcher = getDoneFetcher(undefined);\n state.fetchers.set(key, doneFetcher);\n updateState({ fetchers: new Map(state.fetchers) });\n return;\n } else {\n fetchRedirectIds.add(key);\n await startRedirectNavigation(state, result);\n return;\n }\n }\n\n // Process any non-redirect errors thrown\n if (isErrorResult(result)) {\n let boundaryMatch = findNearestBoundary(state.matches, routeId);\n state.fetchers.delete(key);\n // TODO: In remix, this would reset to IDLE_NAVIGATION if it was a catch -\n // do we need to behave any differently with our non-redirect errors?\n // What if it was a non-redirect Response?\n updateState({\n fetchers: new Map(state.fetchers),\n errors: {\n [boundaryMatch.route.id]: result.error,\n },\n });\n return;\n }\n\n invariant(!isDeferredResult(result), \"Unhandled fetcher deferred data\");\n\n // Put the fetcher back into an idle state\n let doneFetcher = getDoneFetcher(result.data);\n state.fetchers.set(key, doneFetcher);\n updateState({ fetchers: new Map(state.fetchers) });\n }\n\n /**\n * Utility function to handle redirects returned from an action or loader.\n * Normally, a redirect \"replaces\" the navigation that triggered it. So, for\n * example:\n *\n * - user is on /a\n * - user clicks a link to /b\n * - loader for /b redirects to /c\n *\n * In a non-JS app the browser would track the in-flight navigation to /b and\n * then replace it with /c when it encountered the redirect response. In\n * the end it would only ever update the URL bar with /c.\n *\n * In client-side routing using pushState/replaceState, we aim to emulate\n * this behavior and we also do not update history until the end of the\n * navigation (including processed redirects). This means that we never\n * actually touch history until we've processed redirects, so we just use\n * the history action from the original navigation (PUSH or REPLACE).\n */\n async function startRedirectNavigation(\n state: RouterState,\n redirect: RedirectResult,\n {\n submission,\n replace,\n isFetchActionRedirect,\n }: {\n submission?: Submission;\n replace?: boolean;\n isFetchActionRedirect?: boolean;\n } = {}\n ) {\n if (redirect.revalidate) {\n isRevalidationRequired = true;\n }\n\n let redirectLocation = createLocation(\n state.location,\n redirect.location,\n // TODO: This can be removed once we get rid of useTransition in Remix v2\n {\n _isRedirect: true,\n ...(isFetchActionRedirect ? { _isFetchActionRedirect: true } : {}),\n }\n );\n invariant(\n redirectLocation,\n \"Expected a location on the redirect navigation\"\n );\n\n if (isBrowser) {\n let isDocumentReload = false;\n\n if (redirect.reloadDocument) {\n // Hard reload if the response contained X-Remix-Reload-Document\n isDocumentReload = true;\n } else if (ABSOLUTE_URL_REGEX.test(redirect.location)) {\n const url = init.history.createURL(redirect.location);\n isDocumentReload =\n // Hard reload if it's an absolute URL to a new origin\n url.origin !== routerWindow.location.origin ||\n // Hard reload if it's an absolute URL that does not match our basename\n stripBasename(url.pathname, basename) == null;\n }\n\n if (isDocumentReload) {\n if (replace) {\n routerWindow.location.replace(redirect.location);\n } else {\n routerWindow.location.assign(redirect.location);\n }\n return;\n }\n }\n\n // There's no need to abort on redirects, since we don't detect the\n // redirect until the action/loaders have settled\n pendingNavigationController = null;\n\n let redirectHistoryAction =\n replace === true ? HistoryAction.Replace : HistoryAction.Push;\n\n // Use the incoming submission if provided, fallback on the active one in\n // state.navigation\n let activeSubmission =\n submission || getSubmissionFromNavigation(state.navigation);\n\n // If this was a 307/308 submission we want to preserve the HTTP method and\n // re-submit the GET/POST/PUT/PATCH/DELETE as a submission navigation to the\n // redirected location\n if (\n redirectPreserveMethodStatusCodes.has(redirect.status) &&\n activeSubmission &&\n isMutationMethod(activeSubmission.formMethod)\n ) {\n await startNavigation(redirectHistoryAction, redirectLocation, {\n submission: {\n ...activeSubmission,\n formAction: redirect.location,\n },\n // Preserve this flag across redirects\n preventScrollReset: pendingPreventScrollReset,\n });\n } else if (isFetchActionRedirect) {\n // For a fetch action redirect, we kick off a new loading navigation\n // without the fetcher submission, but we send it along for shouldRevalidate\n await startNavigation(redirectHistoryAction, redirectLocation, {\n overrideNavigation: getLoadingNavigation(redirectLocation),\n fetcherSubmission: activeSubmission,\n // Preserve this flag across redirects\n preventScrollReset: pendingPreventScrollReset,\n });\n } else {\n // If we have a submission, we will preserve it through the redirect navigation\n let overrideNavigation = getLoadingNavigation(\n redirectLocation,\n activeSubmission\n );\n await startNavigation(redirectHistoryAction, redirectLocation, {\n overrideNavigation,\n // Preserve this flag across redirects\n preventScrollReset: pendingPreventScrollReset,\n });\n }\n }\n\n async function callLoadersAndMaybeResolveData(\n currentMatches: AgnosticDataRouteMatch[],\n matches: AgnosticDataRouteMatch[],\n matchesToLoad: AgnosticDataRouteMatch[],\n fetchersToLoad: RevalidatingFetcher[],\n request: Request\n ) {\n // Call all navigation loaders and revalidating fetcher loaders in parallel,\n // then slice off the results into separate arrays so we can handle them\n // accordingly\n let results = await Promise.all([\n ...matchesToLoad.map((match) =>\n callLoaderOrAction(\n \"loader\",\n request,\n match,\n matches,\n manifest,\n mapRouteProperties,\n basename\n )\n ),\n ...fetchersToLoad.map((f) => {\n if (f.matches && f.match && f.controller) {\n return callLoaderOrAction(\n \"loader\",\n createClientSideRequest(init.history, f.path, f.controller.signal),\n f.match,\n f.matches,\n manifest,\n mapRouteProperties,\n basename\n );\n } else {\n let error: ErrorResult = {\n type: ResultType.error,\n error: getInternalRouterError(404, { pathname: f.path }),\n };\n return error;\n }\n }),\n ]);\n let loaderResults = results.slice(0, matchesToLoad.length);\n let fetcherResults = results.slice(matchesToLoad.length);\n\n await Promise.all([\n resolveDeferredResults(\n currentMatches,\n matchesToLoad,\n loaderResults,\n loaderResults.map(() => request.signal),\n false,\n state.loaderData\n ),\n resolveDeferredResults(\n currentMatches,\n fetchersToLoad.map((f) => f.match),\n fetcherResults,\n fetchersToLoad.map((f) => (f.controller ? f.controller.signal : null)),\n true\n ),\n ]);\n\n return { results, loaderResults, fetcherResults };\n }\n\n function interruptActiveLoads() {\n // Every interruption triggers a revalidation\n isRevalidationRequired = true;\n\n // Cancel pending route-level deferreds and mark cancelled routes for\n // revalidation\n cancelledDeferredRoutes.push(...cancelActiveDeferreds());\n\n // Abort in-flight fetcher loads\n fetchLoadMatches.forEach((_, key) => {\n if (fetchControllers.has(key)) {\n cancelledFetcherLoads.push(key);\n abortFetcher(key);\n }\n });\n }\n\n function setFetcherError(key: string, routeId: string, error: any) {\n let boundaryMatch = findNearestBoundary(state.matches, routeId);\n deleteFetcher(key);\n updateState({\n errors: {\n [boundaryMatch.route.id]: error,\n },\n fetchers: new Map(state.fetchers),\n });\n }\n\n function deleteFetcher(key: string): void {\n let fetcher = state.fetchers.get(key);\n // Don't abort the controller if this is a deletion of a fetcher.submit()\n // in it's loading phase since - we don't want to abort the corresponding\n // revalidation and want them to complete and land\n if (\n fetchControllers.has(key) &&\n !(fetcher && fetcher.state === \"loading\" && fetchReloadIds.has(key))\n ) {\n abortFetcher(key);\n }\n fetchLoadMatches.delete(key);\n fetchReloadIds.delete(key);\n fetchRedirectIds.delete(key);\n state.fetchers.delete(key);\n }\n\n function abortFetcher(key: string) {\n let controller = fetchControllers.get(key);\n invariant(controller, `Expected fetch controller: ${key}`);\n controller.abort();\n fetchControllers.delete(key);\n }\n\n function markFetchersDone(keys: string[]) {\n for (let key of keys) {\n let fetcher = getFetcher(key);\n let doneFetcher = getDoneFetcher(fetcher.data);\n state.fetchers.set(key, doneFetcher);\n }\n }\n\n function markFetchRedirectsDone(): boolean {\n let doneKeys = [];\n let updatedFetchers = false;\n for (let key of fetchRedirectIds) {\n let fetcher = state.fetchers.get(key);\n invariant(fetcher, `Expected fetcher: ${key}`);\n if (fetcher.state === \"loading\") {\n fetchRedirectIds.delete(key);\n doneKeys.push(key);\n updatedFetchers = true;\n }\n }\n markFetchersDone(doneKeys);\n return updatedFetchers;\n }\n\n function abortStaleFetchLoads(landedId: number): boolean {\n let yeetedKeys = [];\n for (let [key, id] of fetchReloadIds) {\n if (id < landedId) {\n let fetcher = state.fetchers.get(key);\n invariant(fetcher, `Expected fetcher: ${key}`);\n if (fetcher.state === \"loading\") {\n abortFetcher(key);\n fetchReloadIds.delete(key);\n yeetedKeys.push(key);\n }\n }\n }\n markFetchersDone(yeetedKeys);\n return yeetedKeys.length > 0;\n }\n\n function getBlocker(key: string, fn: BlockerFunction) {\n let blocker: Blocker = state.blockers.get(key) || IDLE_BLOCKER;\n\n if (blockerFunctions.get(key) !== fn) {\n blockerFunctions.set(key, fn);\n }\n\n return blocker;\n }\n\n function deleteBlocker(key: string) {\n state.blockers.delete(key);\n blockerFunctions.delete(key);\n }\n\n // Utility function to update blockers, ensuring valid state transitions\n function updateBlocker(key: string, newBlocker: Blocker) {\n let blocker = state.blockers.get(key) || IDLE_BLOCKER;\n\n // Poor mans state machine :)\n // https://mermaid.live/edit#pako:eNqVkc9OwzAMxl8l8nnjAYrEtDIOHEBIgwvKJTReGy3_lDpIqO27k6awMG0XcrLlnz87nwdonESogKXXBuE79rq75XZO3-yHds0RJVuv70YrPlUrCEe2HfrORS3rubqZfuhtpg5C9wk5tZ4VKcRUq88q9Z8RS0-48cE1iHJkL0ugbHuFLus9L6spZy8nX9MP2CNdomVaposqu3fGayT8T8-jJQwhepo_UtpgBQaDEUom04dZhAN1aJBDlUKJBxE1ceB2Smj0Mln-IBW5AFU2dwUiktt_2Qaq2dBfaKdEup85UV7Yd-dKjlnkabl2Pvr0DTkTreM\n invariant(\n (blocker.state === \"unblocked\" && newBlocker.state === \"blocked\") ||\n (blocker.state === \"blocked\" && newBlocker.state === \"blocked\") ||\n (blocker.state === \"blocked\" && newBlocker.state === \"proceeding\") ||\n (blocker.state === \"blocked\" && newBlocker.state === \"unblocked\") ||\n (blocker.state === \"proceeding\" && newBlocker.state === \"unblocked\"),\n `Invalid blocker state transition: ${blocker.state} -> ${newBlocker.state}`\n );\n\n let blockers = new Map(state.blockers);\n blockers.set(key, newBlocker);\n updateState({ blockers });\n }\n\n function shouldBlockNavigation({\n currentLocation,\n nextLocation,\n historyAction,\n }: {\n currentLocation: Location;\n nextLocation: Location;\n historyAction: HistoryAction;\n }): string | undefined {\n if (blockerFunctions.size === 0) {\n return;\n }\n\n // We ony support a single active blocker at the moment since we don't have\n // any compelling use cases for multi-blocker yet\n if (blockerFunctions.size > 1) {\n warning(false, \"A router only supports one blocker at a time\");\n }\n\n let entries = Array.from(blockerFunctions.entries());\n let [blockerKey, blockerFunction] = entries[entries.length - 1];\n let blocker = state.blockers.get(blockerKey);\n\n if (blocker && blocker.state === \"proceeding\") {\n // If the blocker is currently proceeding, we don't need to re-check\n // it and can let this navigation continue\n return;\n }\n\n // At this point, we know we're unblocked/blocked so we need to check the\n // user-provided blocker function\n if (blockerFunction({ currentLocation, nextLocation, historyAction })) {\n return blockerKey;\n }\n }\n\n function cancelActiveDeferreds(\n predicate?: (routeId: string) => boolean\n ): string[] {\n let cancelledRouteIds: string[] = [];\n activeDeferreds.forEach((dfd, routeId) => {\n if (!predicate || predicate(routeId)) {\n // Cancel the deferred - but do not remove from activeDeferreds here -\n // we rely on the subscribers to do that so our tests can assert proper\n // cleanup via _internalActiveDeferreds\n dfd.cancel();\n cancelledRouteIds.push(routeId);\n activeDeferreds.delete(routeId);\n }\n });\n return cancelledRouteIds;\n }\n\n // Opt in to capturing and reporting scroll positions during navigations,\n // used by the component\n function enableScrollRestoration(\n positions: Record,\n getPosition: GetScrollPositionFunction,\n getKey?: GetScrollRestorationKeyFunction\n ) {\n savedScrollPositions = positions;\n getScrollPosition = getPosition;\n getScrollRestorationKey = getKey || null;\n\n // Perform initial hydration scroll restoration, since we miss the boat on\n // the initial updateState() because we've not yet rendered \n // and therefore have no savedScrollPositions available\n if (!initialScrollRestored && state.navigation === IDLE_NAVIGATION) {\n initialScrollRestored = true;\n let y = getSavedScrollPosition(state.location, state.matches);\n if (y != null) {\n updateState({ restoreScrollPosition: y });\n }\n }\n\n return () => {\n savedScrollPositions = null;\n getScrollPosition = null;\n getScrollRestorationKey = null;\n };\n }\n\n function getScrollKey(location: Location, matches: AgnosticDataRouteMatch[]) {\n if (getScrollRestorationKey) {\n let key = getScrollRestorationKey(\n location,\n matches.map((m) => createUseMatchesMatch(m, state.loaderData))\n );\n return key || location.key;\n }\n return location.key;\n }\n\n function saveScrollPosition(\n location: Location,\n matches: AgnosticDataRouteMatch[]\n ): void {\n if (savedScrollPositions && getScrollPosition) {\n let key = getScrollKey(location, matches);\n savedScrollPositions[key] = getScrollPosition();\n }\n }\n\n function getSavedScrollPosition(\n location: Location,\n matches: AgnosticDataRouteMatch[]\n ): number | null {\n if (savedScrollPositions) {\n let key = getScrollKey(location, matches);\n let y = savedScrollPositions[key];\n if (typeof y === \"number\") {\n return y;\n }\n }\n return null;\n }\n\n function _internalSetRoutes(newRoutes: AgnosticDataRouteObject[]) {\n manifest = {};\n inFlightDataRoutes = convertRoutesToDataRoutes(\n newRoutes,\n mapRouteProperties,\n undefined,\n manifest\n );\n }\n\n router = {\n get basename() {\n return basename;\n },\n get state() {\n return state;\n },\n get routes() {\n return dataRoutes;\n },\n initialize,\n subscribe,\n enableScrollRestoration,\n navigate,\n fetch,\n revalidate,\n // Passthrough to history-aware createHref used by useHref so we get proper\n // hash-aware URLs in DOM paths\n createHref: (to: To) => init.history.createHref(to),\n encodeLocation: (to: To) => init.history.encodeLocation(to),\n getFetcher,\n deleteFetcher,\n dispose,\n getBlocker,\n deleteBlocker,\n _internalFetchControllers: fetchControllers,\n _internalActiveDeferreds: activeDeferreds,\n // TODO: Remove setRoutes, it's temporary to avoid dealing with\n // updating the tree while validating the update algorithm.\n _internalSetRoutes,\n };\n\n return router;\n}\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region createStaticHandler\n////////////////////////////////////////////////////////////////////////////////\n\nexport const UNSAFE_DEFERRED_SYMBOL = Symbol(\"deferred\");\n\nexport interface CreateStaticHandlerOptions {\n basename?: string;\n /**\n * @deprecated Use `mapRouteProperties` instead\n */\n detectErrorBoundary?: DetectErrorBoundaryFunction;\n mapRouteProperties?: MapRoutePropertiesFunction;\n}\n\nexport function createStaticHandler(\n routes: AgnosticRouteObject[],\n opts?: CreateStaticHandlerOptions\n): StaticHandler {\n invariant(\n routes.length > 0,\n \"You must provide a non-empty routes array to createStaticHandler\"\n );\n\n let manifest: RouteManifest = {};\n let basename = (opts ? opts.basename : null) || \"/\";\n let mapRouteProperties: MapRoutePropertiesFunction;\n if (opts?.mapRouteProperties) {\n mapRouteProperties = opts.mapRouteProperties;\n } else if (opts?.detectErrorBoundary) {\n // If they are still using the deprecated version, wrap it with the new API\n let detectErrorBoundary = opts.detectErrorBoundary;\n mapRouteProperties = (route) => ({\n hasErrorBoundary: detectErrorBoundary(route),\n });\n } else {\n mapRouteProperties = defaultMapRouteProperties;\n }\n\n let dataRoutes = convertRoutesToDataRoutes(\n routes,\n mapRouteProperties,\n undefined,\n manifest\n );\n\n /**\n * The query() method is intended for document requests, in which we want to\n * call an optional action and potentially multiple loaders for all nested\n * routes. It returns a StaticHandlerContext object, which is very similar\n * to the router state (location, loaderData, actionData, errors, etc.) and\n * also adds SSR-specific information such as the statusCode and headers\n * from action/loaders Responses.\n *\n * It _should_ never throw and should report all errors through the\n * returned context.errors object, properly associating errors to their error\n * boundary. Additionally, it tracks _deepestRenderedBoundaryId which can be\n * used to emulate React error boundaries during SSr by performing a second\n * pass only down to the boundaryId.\n *\n * The one exception where we do not return a StaticHandlerContext is when a\n * redirect response is returned or thrown from any action/loader. We\n * propagate that out and return the raw Response so the HTTP server can\n * return it directly.\n */\n async function query(\n request: Request,\n { requestContext }: { requestContext?: unknown } = {}\n ): Promise {\n let url = new URL(request.url);\n let method = request.method;\n let location = createLocation(\"\", createPath(url), null, \"default\");\n let matches = matchRoutes(dataRoutes, location, basename);\n\n // SSR supports HEAD requests while SPA doesn't\n if (!isValidMethod(method) && method !== \"HEAD\") {\n let error = getInternalRouterError(405, { method });\n let { matches: methodNotAllowedMatches, route } =\n getShortCircuitMatches(dataRoutes);\n return {\n basename,\n location,\n matches: methodNotAllowedMatches,\n loaderData: {},\n actionData: null,\n errors: {\n [route.id]: error,\n },\n statusCode: error.status,\n loaderHeaders: {},\n actionHeaders: {},\n activeDeferreds: null,\n };\n } else if (!matches) {\n let error = getInternalRouterError(404, { pathname: location.pathname });\n let { matches: notFoundMatches, route } =\n getShortCircuitMatches(dataRoutes);\n return {\n basename,\n location,\n matches: notFoundMatches,\n loaderData: {},\n actionData: null,\n errors: {\n [route.id]: error,\n },\n statusCode: error.status,\n loaderHeaders: {},\n actionHeaders: {},\n activeDeferreds: null,\n };\n }\n\n let result = await queryImpl(request, location, matches, requestContext);\n if (isResponse(result)) {\n return result;\n }\n\n // When returning StaticHandlerContext, we patch back in the location here\n // since we need it for React Context. But this helps keep our submit and\n // loadRouteData operating on a Request instead of a Location\n return { location, basename, ...result };\n }\n\n /**\n * The queryRoute() method is intended for targeted route requests, either\n * for fetch ?_data requests or resource route requests. In this case, we\n * are only ever calling a single action or loader, and we are returning the\n * returned value directly. In most cases, this will be a Response returned\n * from the action/loader, but it may be a primitive or other value as well -\n * and in such cases the calling context should handle that accordingly.\n *\n * We do respect the throw/return differentiation, so if an action/loader\n * throws, then this method will throw the value. This is important so we\n * can do proper boundary identification in Remix where a thrown Response\n * must go to the Catch Boundary but a returned Response is happy-path.\n *\n * One thing to note is that any Router-initiated Errors that make sense\n * to associate with a status code will be thrown as an ErrorResponse\n * instance which include the raw Error, such that the calling context can\n * serialize the error as they see fit while including the proper response\n * code. Examples here are 404 and 405 errors that occur prior to reaching\n * any user-defined loaders.\n */\n async function queryRoute(\n request: Request,\n {\n routeId,\n requestContext,\n }: { requestContext?: unknown; routeId?: string } = {}\n ): Promise {\n let url = new URL(request.url);\n let method = request.method;\n let location = createLocation(\"\", createPath(url), null, \"default\");\n let matches = matchRoutes(dataRoutes, location, basename);\n\n // SSR supports HEAD requests while SPA doesn't\n if (!isValidMethod(method) && method !== \"HEAD\" && method !== \"OPTIONS\") {\n throw getInternalRouterError(405, { method });\n } else if (!matches) {\n throw getInternalRouterError(404, { pathname: location.pathname });\n }\n\n let match = routeId\n ? matches.find((m) => m.route.id === routeId)\n : getTargetMatch(matches, location);\n\n if (routeId && !match) {\n throw getInternalRouterError(403, {\n pathname: location.pathname,\n routeId,\n });\n } else if (!match) {\n // This should never hit I don't think?\n throw getInternalRouterError(404, { pathname: location.pathname });\n }\n\n let result = await queryImpl(\n request,\n location,\n matches,\n requestContext,\n match\n );\n if (isResponse(result)) {\n return result;\n }\n\n let error = result.errors ? Object.values(result.errors)[0] : undefined;\n if (error !== undefined) {\n // If we got back result.errors, that means the loader/action threw\n // _something_ that wasn't a Response, but it's not guaranteed/required\n // to be an `instanceof Error` either, so we have to use throw here to\n // preserve the \"error\" state outside of queryImpl.\n throw error;\n }\n\n // Pick off the right state value to return\n if (result.actionData) {\n return Object.values(result.actionData)[0];\n }\n\n if (result.loaderData) {\n let data = Object.values(result.loaderData)[0];\n if (result.activeDeferreds?.[match.route.id]) {\n data[UNSAFE_DEFERRED_SYMBOL] = result.activeDeferreds[match.route.id];\n }\n return data;\n }\n\n return undefined;\n }\n\n async function queryImpl(\n request: Request,\n location: Location,\n matches: AgnosticDataRouteMatch[],\n requestContext: unknown,\n routeMatch?: AgnosticDataRouteMatch\n ): Promise | Response> {\n invariant(\n request.signal,\n \"query()/queryRoute() requests must contain an AbortController signal\"\n );\n\n try {\n if (isMutationMethod(request.method.toLowerCase())) {\n let result = await submit(\n request,\n matches,\n routeMatch || getTargetMatch(matches, location),\n requestContext,\n routeMatch != null\n );\n return result;\n }\n\n let result = await loadRouteData(\n request,\n matches,\n requestContext,\n routeMatch\n );\n return isResponse(result)\n ? result\n : {\n ...result,\n actionData: null,\n actionHeaders: {},\n };\n } catch (e) {\n // If the user threw/returned a Response in callLoaderOrAction, we throw\n // it to bail out and then return or throw here based on whether the user\n // returned or threw\n if (isQueryRouteResponse(e)) {\n if (e.type === ResultType.error) {\n throw e.response;\n }\n return e.response;\n }\n // Redirects are always returned since they don't propagate to catch\n // boundaries\n if (isRedirectResponse(e)) {\n return e;\n }\n throw e;\n }\n }\n\n async function submit(\n request: Request,\n matches: AgnosticDataRouteMatch[],\n actionMatch: AgnosticDataRouteMatch,\n requestContext: unknown,\n isRouteRequest: boolean\n ): Promise | Response> {\n let result: DataResult;\n\n if (!actionMatch.route.action && !actionMatch.route.lazy) {\n let error = getInternalRouterError(405, {\n method: request.method,\n pathname: new URL(request.url).pathname,\n routeId: actionMatch.route.id,\n });\n if (isRouteRequest) {\n throw error;\n }\n result = {\n type: ResultType.error,\n error,\n };\n } else {\n result = await callLoaderOrAction(\n \"action\",\n request,\n actionMatch,\n matches,\n manifest,\n mapRouteProperties,\n basename,\n { isStaticRequest: true, isRouteRequest, requestContext }\n );\n\n if (request.signal.aborted) {\n let method = isRouteRequest ? \"queryRoute\" : \"query\";\n throw new Error(`${method}() call aborted`);\n }\n }\n\n if (isRedirectResult(result)) {\n // Uhhhh - this should never happen, we should always throw these from\n // callLoaderOrAction, but the type narrowing here keeps TS happy and we\n // can get back on the \"throw all redirect responses\" train here should\n // this ever happen :/\n throw new Response(null, {\n status: result.status,\n headers: {\n Location: result.location,\n },\n });\n }\n\n if (isDeferredResult(result)) {\n let error = getInternalRouterError(400, { type: \"defer-action\" });\n if (isRouteRequest) {\n throw error;\n }\n result = {\n type: ResultType.error,\n error,\n };\n }\n\n if (isRouteRequest) {\n // Note: This should only be non-Response values if we get here, since\n // isRouteRequest should throw any Response received in callLoaderOrAction\n if (isErrorResult(result)) {\n throw result.error;\n }\n\n return {\n matches: [actionMatch],\n loaderData: {},\n actionData: { [actionMatch.route.id]: result.data },\n errors: null,\n // Note: statusCode + headers are unused here since queryRoute will\n // return the raw Response or value\n statusCode: 200,\n loaderHeaders: {},\n actionHeaders: {},\n activeDeferreds: null,\n };\n }\n\n if (isErrorResult(result)) {\n // Store off the pending error - we use it to determine which loaders\n // to call and will commit it when we complete the navigation\n let boundaryMatch = findNearestBoundary(matches, actionMatch.route.id);\n let context = await loadRouteData(\n request,\n matches,\n requestContext,\n undefined,\n {\n [boundaryMatch.route.id]: result.error,\n }\n );\n\n // action status codes take precedence over loader status codes\n return {\n ...context,\n statusCode: isRouteErrorResponse(result.error)\n ? result.error.status\n : 500,\n actionData: null,\n actionHeaders: {\n ...(result.headers ? { [actionMatch.route.id]: result.headers } : {}),\n },\n };\n }\n\n // Create a GET request for the loaders\n let loaderRequest = new Request(request.url, {\n headers: request.headers,\n redirect: request.redirect,\n signal: request.signal,\n });\n let context = await loadRouteData(loaderRequest, matches, requestContext);\n\n return {\n ...context,\n // action status codes take precedence over loader status codes\n ...(result.statusCode ? { statusCode: result.statusCode } : {}),\n actionData: {\n [actionMatch.route.id]: result.data,\n },\n actionHeaders: {\n ...(result.headers ? { [actionMatch.route.id]: result.headers } : {}),\n },\n };\n }\n\n async function loadRouteData(\n request: Request,\n matches: AgnosticDataRouteMatch[],\n requestContext: unknown,\n routeMatch?: AgnosticDataRouteMatch,\n pendingActionError?: RouteData\n ): Promise<\n | Omit<\n StaticHandlerContext,\n \"location\" | \"basename\" | \"actionData\" | \"actionHeaders\"\n >\n | Response\n > {\n let isRouteRequest = routeMatch != null;\n\n // Short circuit if we have no loaders to run (queryRoute())\n if (\n isRouteRequest &&\n !routeMatch?.route.loader &&\n !routeMatch?.route.lazy\n ) {\n throw getInternalRouterError(400, {\n method: request.method,\n pathname: new URL(request.url).pathname,\n routeId: routeMatch?.route.id,\n });\n }\n\n let requestMatches = routeMatch\n ? [routeMatch]\n : getLoaderMatchesUntilBoundary(\n matches,\n Object.keys(pendingActionError || {})[0]\n );\n let matchesToLoad = requestMatches.filter(\n (m) => m.route.loader || m.route.lazy\n );\n\n // Short circuit if we have no loaders to run (query())\n if (matchesToLoad.length === 0) {\n return {\n matches,\n // Add a null for all matched routes for proper revalidation on the client\n loaderData: matches.reduce(\n (acc, m) => Object.assign(acc, { [m.route.id]: null }),\n {}\n ),\n errors: pendingActionError || null,\n statusCode: 200,\n loaderHeaders: {},\n activeDeferreds: null,\n };\n }\n\n let results = await Promise.all([\n ...matchesToLoad.map((match) =>\n callLoaderOrAction(\n \"loader\",\n request,\n match,\n matches,\n manifest,\n mapRouteProperties,\n basename,\n { isStaticRequest: true, isRouteRequest, requestContext }\n )\n ),\n ]);\n\n if (request.signal.aborted) {\n let method = isRouteRequest ? \"queryRoute\" : \"query\";\n throw new Error(`${method}() call aborted`);\n }\n\n // Process and commit output from loaders\n let activeDeferreds = new Map();\n let context = processRouteLoaderData(\n matches,\n matchesToLoad,\n results,\n pendingActionError,\n activeDeferreds\n );\n\n // Add a null for any non-loader matches for proper revalidation on the client\n let executedLoaders = new Set(\n matchesToLoad.map((match) => match.route.id)\n );\n matches.forEach((match) => {\n if (!executedLoaders.has(match.route.id)) {\n context.loaderData[match.route.id] = null;\n }\n });\n\n return {\n ...context,\n matches,\n activeDeferreds:\n activeDeferreds.size > 0\n ? Object.fromEntries(activeDeferreds.entries())\n : null,\n };\n }\n\n return {\n dataRoutes,\n query,\n queryRoute,\n };\n}\n\n//#endregion\n\n////////////////////////////////////////////////////////////////////////////////\n//#region Helpers\n////////////////////////////////////////////////////////////////////////////////\n\n/**\n * Given an existing StaticHandlerContext and an error thrown at render time,\n * provide an updated StaticHandlerContext suitable for a second SSR render\n */\nexport function getStaticContextFromError(\n routes: AgnosticDataRouteObject[],\n context: StaticHandlerContext,\n error: any\n) {\n let newContext: StaticHandlerContext = {\n ...context,\n statusCode: 500,\n errors: {\n [context._deepestRenderedBoundaryId || routes[0].id]: error,\n },\n };\n return newContext;\n}\n\nfunction isSubmissionNavigation(\n opts: RouterNavigateOptions\n): opts is SubmissionNavigateOptions {\n return (\n opts != null &&\n ((\"formData\" in opts && opts.formData != null) ||\n (\"body\" in opts && opts.body !== undefined))\n );\n}\n\nfunction normalizeTo(\n location: Path,\n matches: AgnosticDataRouteMatch[],\n basename: string,\n prependBasename: boolean,\n to: To | null,\n fromRouteId?: string,\n relative?: RelativeRoutingType\n) {\n let contextualMatches: AgnosticDataRouteMatch[];\n let activeRouteMatch: AgnosticDataRouteMatch | undefined;\n if (fromRouteId != null && relative !== \"path\") {\n // Grab matches up to the calling route so our route-relative logic is\n // relative to the correct source route. When using relative:path,\n // fromRouteId is ignored since that is always relative to the current\n // location path\n contextualMatches = [];\n for (let match of matches) {\n contextualMatches.push(match);\n if (match.route.id === fromRouteId) {\n activeRouteMatch = match;\n break;\n }\n }\n } else {\n contextualMatches = matches;\n activeRouteMatch = matches[matches.length - 1];\n }\n\n // Resolve the relative path\n let path = resolveTo(\n to ? to : \".\",\n getPathContributingMatches(contextualMatches).map((m) => m.pathnameBase),\n stripBasename(location.pathname, basename) || location.pathname,\n relative === \"path\"\n );\n\n // When `to` is not specified we inherit search/hash from the current\n // location, unlike when to=\".\" and we just inherit the path.\n // See https://github.com/remix-run/remix/issues/927\n if (to == null) {\n path.search = location.search;\n path.hash = location.hash;\n }\n\n // Add an ?index param for matched index routes if we don't already have one\n if (\n (to == null || to === \"\" || to === \".\") &&\n activeRouteMatch &&\n activeRouteMatch.route.index &&\n !hasNakedIndexQuery(path.search)\n ) {\n path.search = path.search\n ? path.search.replace(/^\\?/, \"?index&\")\n : \"?index\";\n }\n\n // If we're operating within a basename, prepend it to the pathname. If\n // this is a root navigation, then just use the raw basename which allows\n // the basename to have full control over the presence of a trailing slash\n // on root actions\n if (prependBasename && basename !== \"/\") {\n path.pathname =\n path.pathname === \"/\" ? basename : joinPaths([basename, path.pathname]);\n }\n\n return createPath(path);\n}\n\n// Normalize navigation options by converting formMethod=GET formData objects to\n// URLSearchParams so they behave identically to links with query params\nfunction normalizeNavigateOptions(\n normalizeFormMethod: boolean,\n isFetcher: boolean,\n path: string,\n opts?: RouterNavigateOptions\n): {\n path: string;\n submission?: Submission;\n error?: ErrorResponse;\n} {\n // Return location verbatim on non-submission navigations\n if (!opts || !isSubmissionNavigation(opts)) {\n return { path };\n }\n\n if (opts.formMethod && !isValidMethod(opts.formMethod)) {\n return {\n path,\n error: getInternalRouterError(405, { method: opts.formMethod }),\n };\n }\n\n let getInvalidBodyError = () => ({\n path,\n error: getInternalRouterError(400, { type: \"invalid-body\" }),\n });\n\n // Create a Submission on non-GET navigations\n let rawFormMethod = opts.formMethod || \"get\";\n let formMethod = normalizeFormMethod\n ? (rawFormMethod.toUpperCase() as V7_FormMethod)\n : (rawFormMethod.toLowerCase() as FormMethod);\n let formAction = stripHashFromPath(path);\n\n if (opts.body !== undefined) {\n if (opts.formEncType === \"text/plain\") {\n // text only support POST/PUT/PATCH/DELETE submissions\n if (!isMutationMethod(formMethod)) {\n return getInvalidBodyError();\n }\n\n let text =\n typeof opts.body === \"string\"\n ? opts.body\n : opts.body instanceof FormData ||\n opts.body instanceof URLSearchParams\n ? // https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#plain-text-form-data\n Array.from(opts.body.entries()).reduce(\n (acc, [name, value]) => `${acc}${name}=${value}\\n`,\n \"\"\n )\n : String(opts.body);\n\n return {\n path,\n submission: {\n formMethod,\n formAction,\n formEncType: opts.formEncType,\n formData: undefined,\n json: undefined,\n text,\n },\n };\n } else if (opts.formEncType === \"application/json\") {\n // json only supports POST/PUT/PATCH/DELETE submissions\n if (!isMutationMethod(formMethod)) {\n return getInvalidBodyError();\n }\n\n try {\n let json =\n typeof opts.body === \"string\" ? JSON.parse(opts.body) : opts.body;\n\n return {\n path,\n submission: {\n formMethod,\n formAction,\n formEncType: opts.formEncType,\n formData: undefined,\n json,\n text: undefined,\n },\n };\n } catch (e) {\n return getInvalidBodyError();\n }\n }\n }\n\n invariant(\n typeof FormData === \"function\",\n \"FormData is not available in this environment\"\n );\n\n let searchParams: URLSearchParams;\n let formData: FormData;\n\n if (opts.formData) {\n searchParams = convertFormDataToSearchParams(opts.formData);\n formData = opts.formData;\n } else if (opts.body instanceof FormData) {\n searchParams = convertFormDataToSearchParams(opts.body);\n formData = opts.body;\n } else if (opts.body instanceof URLSearchParams) {\n searchParams = opts.body;\n formData = convertSearchParamsToFormData(searchParams);\n } else if (opts.body == null) {\n searchParams = new URLSearchParams();\n formData = new FormData();\n } else {\n try {\n searchParams = new URLSearchParams(opts.body);\n formData = convertSearchParamsToFormData(searchParams);\n } catch (e) {\n return getInvalidBodyError();\n }\n }\n\n let submission: Submission = {\n formMethod,\n formAction,\n formEncType:\n (opts && opts.formEncType) || \"application/x-www-form-urlencoded\",\n formData,\n json: undefined,\n text: undefined,\n };\n\n if (isMutationMethod(submission.formMethod)) {\n return { path, submission };\n }\n\n // Flatten submission onto URLSearchParams for GET submissions\n let parsedPath = parsePath(path);\n // On GET navigation submissions we can drop the ?index param from the\n // resulting location since all loaders will run. But fetcher GET submissions\n // only run a single loader so we need to preserve any incoming ?index params\n if (isFetcher && parsedPath.search && hasNakedIndexQuery(parsedPath.search)) {\n searchParams.append(\"index\", \"\");\n }\n parsedPath.search = `?${searchParams}`;\n\n return { path: createPath(parsedPath), submission };\n}\n\n// Filter out all routes below any caught error as they aren't going to\n// render so we don't need to load them\nfunction getLoaderMatchesUntilBoundary(\n matches: AgnosticDataRouteMatch[],\n boundaryId?: string\n) {\n let boundaryMatches = matches;\n if (boundaryId) {\n let index = matches.findIndex((m) => m.route.id === boundaryId);\n if (index >= 0) {\n boundaryMatches = matches.slice(0, index);\n }\n }\n return boundaryMatches;\n}\n\nfunction getMatchesToLoad(\n history: History,\n state: RouterState,\n matches: AgnosticDataRouteMatch[],\n submission: Submission | undefined,\n location: Location,\n isRevalidationRequired: boolean,\n cancelledDeferredRoutes: string[],\n cancelledFetcherLoads: string[],\n fetchLoadMatches: Map,\n fetchRedirectIds: Set,\n routesToUse: AgnosticDataRouteObject[],\n basename: string | undefined,\n pendingActionData?: RouteData,\n pendingError?: RouteData\n): [AgnosticDataRouteMatch[], RevalidatingFetcher[]] {\n let actionResult = pendingError\n ? Object.values(pendingError)[0]\n : pendingActionData\n ? Object.values(pendingActionData)[0]\n : undefined;\n\n let currentUrl = history.createURL(state.location);\n let nextUrl = history.createURL(location);\n\n // Pick navigation matches that are net-new or qualify for revalidation\n let boundaryId = pendingError ? Object.keys(pendingError)[0] : undefined;\n let boundaryMatches = getLoaderMatchesUntilBoundary(matches, boundaryId);\n\n let navigationMatches = boundaryMatches.filter((match, index) => {\n if (match.route.lazy) {\n // We haven't loaded this route yet so we don't know if it's got a loader!\n return true;\n }\n if (match.route.loader == null) {\n return false;\n }\n\n // Always call the loader on new route instances and pending defer cancellations\n if (\n isNewLoader(state.loaderData, state.matches[index], match) ||\n cancelledDeferredRoutes.some((id) => id === match.route.id)\n ) {\n return true;\n }\n\n // This is the default implementation for when we revalidate. If the route\n // provides it's own implementation, then we give them full control but\n // provide this value so they can leverage it if needed after they check\n // their own specific use cases\n let currentRouteMatch = state.matches[index];\n let nextRouteMatch = match;\n\n return shouldRevalidateLoader(match, {\n currentUrl,\n currentParams: currentRouteMatch.params,\n nextUrl,\n nextParams: nextRouteMatch.params,\n ...submission,\n actionResult,\n defaultShouldRevalidate:\n // Forced revalidation due to submission, useRevalidator, or X-Remix-Revalidate\n isRevalidationRequired ||\n // Clicked the same link, resubmitted a GET form\n currentUrl.pathname + currentUrl.search ===\n nextUrl.pathname + nextUrl.search ||\n // Search params affect all loaders\n currentUrl.search !== nextUrl.search ||\n isNewRouteInstance(currentRouteMatch, nextRouteMatch),\n });\n });\n\n // Pick fetcher.loads that need to be revalidated\n let revalidatingFetchers: RevalidatingFetcher[] = [];\n fetchLoadMatches.forEach((f, key) => {\n // Don't revalidate if fetcher won't be present in the subsequent render\n if (!matches.some((m) => m.route.id === f.routeId)) {\n return;\n }\n\n let fetcherMatches = matchRoutes(routesToUse, f.path, basename);\n\n // If the fetcher path no longer matches, push it in with null matches so\n // we can trigger a 404 in callLoadersAndMaybeResolveData. Note this is\n // currently only a use-case for Remix HMR where the route tree can change\n // at runtime and remove a route previously loaded via a fetcher\n if (!fetcherMatches) {\n revalidatingFetchers.push({\n key,\n routeId: f.routeId,\n path: f.path,\n matches: null,\n match: null,\n controller: null,\n });\n return;\n }\n\n // Revalidating fetchers are decoupled from the route matches since they\n // load from a static href. They revalidate based on explicit revalidation\n // (submission, useRevalidator, or X-Remix-Revalidate)\n let fetcher = state.fetchers.get(key);\n let fetcherMatch = getTargetMatch(fetcherMatches, f.path);\n\n let shouldRevalidate = false;\n if (fetchRedirectIds.has(key)) {\n // Never trigger a revalidation of an actively redirecting fetcher\n shouldRevalidate = false;\n } else if (cancelledFetcherLoads.includes(key)) {\n // Always revalidate if the fetcher was cancelled\n shouldRevalidate = true;\n } else if (\n fetcher &&\n fetcher.state !== \"idle\" &&\n fetcher.data === undefined\n ) {\n // If the fetcher hasn't ever completed loading yet, then this isn't a\n // revalidation, it would just be a brand new load if an explicit\n // revalidation is required\n shouldRevalidate = isRevalidationRequired;\n } else {\n // Otherwise fall back on any user-defined shouldRevalidate, defaulting\n // to explicit revalidations only\n shouldRevalidate = shouldRevalidateLoader(fetcherMatch, {\n currentUrl,\n currentParams: state.matches[state.matches.length - 1].params,\n nextUrl,\n nextParams: matches[matches.length - 1].params,\n ...submission,\n actionResult,\n defaultShouldRevalidate: isRevalidationRequired,\n });\n }\n\n if (shouldRevalidate) {\n revalidatingFetchers.push({\n key,\n routeId: f.routeId,\n path: f.path,\n matches: fetcherMatches,\n match: fetcherMatch,\n controller: new AbortController(),\n });\n }\n });\n\n return [navigationMatches, revalidatingFetchers];\n}\n\nfunction isNewLoader(\n currentLoaderData: RouteData,\n currentMatch: AgnosticDataRouteMatch,\n match: AgnosticDataRouteMatch\n) {\n let isNew =\n // [a] -> [a, b]\n !currentMatch ||\n // [a, b] -> [a, c]\n match.route.id !== currentMatch.route.id;\n\n // Handle the case that we don't have data for a re-used route, potentially\n // from a prior error or from a cancelled pending deferred\n let isMissingData = currentLoaderData[match.route.id] === undefined;\n\n // Always load if this is a net-new route or we don't yet have data\n return isNew || isMissingData;\n}\n\nfunction isNewRouteInstance(\n currentMatch: AgnosticDataRouteMatch,\n match: AgnosticDataRouteMatch\n) {\n let currentPath = currentMatch.route.path;\n return (\n // param change for this match, /users/123 -> /users/456\n currentMatch.pathname !== match.pathname ||\n // splat param changed, which is not present in match.path\n // e.g. /files/images/avatar.jpg -> files/finances.xls\n (currentPath != null &&\n currentPath.endsWith(\"*\") &&\n currentMatch.params[\"*\"] !== match.params[\"*\"])\n );\n}\n\nfunction shouldRevalidateLoader(\n loaderMatch: AgnosticDataRouteMatch,\n arg: Parameters[0]\n) {\n if (loaderMatch.route.shouldRevalidate) {\n let routeChoice = loaderMatch.route.shouldRevalidate(arg);\n if (typeof routeChoice === \"boolean\") {\n return routeChoice;\n }\n }\n\n return arg.defaultShouldRevalidate;\n}\n\n/**\n * Execute route.lazy() methods to lazily load route modules (loader, action,\n * shouldRevalidate) and update the routeManifest in place which shares objects\n * with dataRoutes so those get updated as well.\n */\nasync function loadLazyRouteModule(\n route: AgnosticDataRouteObject,\n mapRouteProperties: MapRoutePropertiesFunction,\n manifest: RouteManifest\n) {\n if (!route.lazy) {\n return;\n }\n\n let lazyRoute = await route.lazy();\n\n // If the lazy route function was executed and removed by another parallel\n // call then we can return - first lazy() to finish wins because the return\n // value of lazy is expected to be static\n if (!route.lazy) {\n return;\n }\n\n let routeToUpdate = manifest[route.id];\n invariant(routeToUpdate, \"No route found in manifest\");\n\n // Update the route in place. This should be safe because there's no way\n // we could yet be sitting on this route as we can't get there without\n // resolving lazy() first.\n //\n // This is different than the HMR \"update\" use-case where we may actively be\n // on the route being updated. The main concern boils down to \"does this\n // mutation affect any ongoing navigations or any current state.matches\n // values?\". If not, it should be safe to update in place.\n let routeUpdates: Record = {};\n for (let lazyRouteProperty in lazyRoute) {\n let staticRouteValue =\n routeToUpdate[lazyRouteProperty as keyof typeof routeToUpdate];\n\n let isPropertyStaticallyDefined =\n staticRouteValue !== undefined &&\n // This property isn't static since it should always be updated based\n // on the route updates\n lazyRouteProperty !== \"hasErrorBoundary\";\n\n warning(\n !isPropertyStaticallyDefined,\n `Route \"${routeToUpdate.id}\" has a static property \"${lazyRouteProperty}\" ` +\n `defined but its lazy function is also returning a value for this property. ` +\n `The lazy route property \"${lazyRouteProperty}\" will be ignored.`\n );\n\n if (\n !isPropertyStaticallyDefined &&\n !immutableRouteKeys.has(lazyRouteProperty as ImmutableRouteKey)\n ) {\n routeUpdates[lazyRouteProperty] =\n lazyRoute[lazyRouteProperty as keyof typeof lazyRoute];\n }\n }\n\n // Mutate the route with the provided updates. Do this first so we pass\n // the updated version to mapRouteProperties\n Object.assign(routeToUpdate, routeUpdates);\n\n // Mutate the `hasErrorBoundary` property on the route based on the route\n // updates and remove the `lazy` function so we don't resolve the lazy\n // route again.\n Object.assign(routeToUpdate, {\n // To keep things framework agnostic, we use the provided\n // `mapRouteProperties` (or wrapped `detectErrorBoundary`) function to\n // set the framework-aware properties (`element`/`hasErrorBoundary`) since\n // the logic will differ between frameworks.\n ...mapRouteProperties(routeToUpdate),\n lazy: undefined,\n });\n}\n\nasync function callLoaderOrAction(\n type: \"loader\" | \"action\",\n request: Request,\n match: AgnosticDataRouteMatch,\n matches: AgnosticDataRouteMatch[],\n manifest: RouteManifest,\n mapRouteProperties: MapRoutePropertiesFunction,\n basename: string,\n opts: {\n isStaticRequest?: boolean;\n isRouteRequest?: boolean;\n requestContext?: unknown;\n } = {}\n): Promise {\n let resultType;\n let result;\n let onReject: (() => void) | undefined;\n\n let runHandler = (handler: ActionFunction | LoaderFunction) => {\n // Setup a promise we can race against so that abort signals short circuit\n let reject: () => void;\n let abortPromise = new Promise((_, r) => (reject = r));\n onReject = () => reject();\n request.signal.addEventListener(\"abort\", onReject);\n return Promise.race([\n handler({\n request,\n params: match.params,\n context: opts.requestContext,\n }),\n abortPromise,\n ]);\n };\n\n try {\n let handler = match.route[type];\n\n if (match.route.lazy) {\n if (handler) {\n // Run statically defined handler in parallel with lazy()\n let values = await Promise.all([\n runHandler(handler),\n loadLazyRouteModule(match.route, mapRouteProperties, manifest),\n ]);\n result = values[0];\n } else {\n // Load lazy route module, then run any returned handler\n await loadLazyRouteModule(match.route, mapRouteProperties, manifest);\n\n handler = match.route[type];\n if (handler) {\n // Handler still run even if we got interrupted to maintain consistency\n // with un-abortable behavior of handler execution on non-lazy or\n // previously-lazy-loaded routes\n result = await runHandler(handler);\n } else if (type === \"action\") {\n let url = new URL(request.url);\n let pathname = url.pathname + url.search;\n throw getInternalRouterError(405, {\n method: request.method,\n pathname,\n routeId: match.route.id,\n });\n } else {\n // lazy() route has no loader to run. Short circuit here so we don't\n // hit the invariant below that errors on returning undefined.\n return { type: ResultType.data, data: undefined };\n }\n }\n } else if (!handler) {\n let url = new URL(request.url);\n let pathname = url.pathname + url.search;\n throw getInternalRouterError(404, {\n pathname,\n });\n } else {\n result = await runHandler(handler);\n }\n\n invariant(\n result !== undefined,\n `You defined ${type === \"action\" ? \"an action\" : \"a loader\"} for route ` +\n `\"${match.route.id}\" but didn't return anything from your \\`${type}\\` ` +\n `function. Please return a value or \\`null\\`.`\n );\n } catch (e) {\n resultType = ResultType.error;\n result = e;\n } finally {\n if (onReject) {\n request.signal.removeEventListener(\"abort\", onReject);\n }\n }\n\n if (isResponse(result)) {\n let status = result.status;\n\n // Process redirects\n if (redirectStatusCodes.has(status)) {\n let location = result.headers.get(\"Location\");\n invariant(\n location,\n \"Redirects returned/thrown from loaders/actions must have a Location header\"\n );\n\n // Support relative routing in internal redirects\n if (!ABSOLUTE_URL_REGEX.test(location)) {\n location = normalizeTo(\n new URL(request.url),\n matches.slice(0, matches.indexOf(match) + 1),\n basename,\n true,\n location\n );\n } else if (!opts.isStaticRequest) {\n // Strip off the protocol+origin for same-origin + same-basename absolute\n // redirects. If this is a static request, we can let it go back to the\n // browser as-is\n let currentUrl = new URL(request.url);\n let url = location.startsWith(\"//\")\n ? new URL(currentUrl.protocol + location)\n : new URL(location);\n let isSameBasename = stripBasename(url.pathname, basename) != null;\n if (url.origin === currentUrl.origin && isSameBasename) {\n location = url.pathname + url.search + url.hash;\n }\n }\n\n // Don't process redirects in the router during static requests requests.\n // Instead, throw the Response and let the server handle it with an HTTP\n // redirect. We also update the Location header in place in this flow so\n // basename and relative routing is taken into account\n if (opts.isStaticRequest) {\n result.headers.set(\"Location\", location);\n throw result;\n }\n\n return {\n type: ResultType.redirect,\n status,\n location,\n revalidate: result.headers.get(\"X-Remix-Revalidate\") !== null,\n reloadDocument: result.headers.get(\"X-Remix-Reload-Document\") !== null,\n };\n }\n\n // For SSR single-route requests, we want to hand Responses back directly\n // without unwrapping. We do this with the QueryRouteResponse wrapper\n // interface so we can know whether it was returned or thrown\n if (opts.isRouteRequest) {\n let queryRouteResponse: QueryRouteResponse = {\n type:\n resultType === ResultType.error ? ResultType.error : ResultType.data,\n response: result,\n };\n throw queryRouteResponse;\n }\n\n let data: any;\n let contentType = result.headers.get(\"Content-Type\");\n // Check between word boundaries instead of startsWith() due to the last\n // paragraph of https://httpwg.org/specs/rfc9110.html#field.content-type\n if (contentType && /\\bapplication\\/json\\b/.test(contentType)) {\n data = await result.json();\n } else {\n data = await result.text();\n }\n\n if (resultType === ResultType.error) {\n return {\n type: resultType,\n error: new ErrorResponse(status, result.statusText, data),\n headers: result.headers,\n };\n }\n\n return {\n type: ResultType.data,\n data,\n statusCode: result.status,\n headers: result.headers,\n };\n }\n\n if (resultType === ResultType.error) {\n return { type: resultType, error: result };\n }\n\n if (isDeferredData(result)) {\n return {\n type: ResultType.deferred,\n deferredData: result,\n statusCode: result.init?.status,\n headers: result.init?.headers && new Headers(result.init.headers),\n };\n }\n\n return { type: ResultType.data, data: result };\n}\n\n// Utility method for creating the Request instances for loaders/actions during\n// client-side navigations and fetches. During SSR we will always have a\n// Request instance from the static handler (query/queryRoute)\nfunction createClientSideRequest(\n history: History,\n location: string | Location,\n signal: AbortSignal,\n submission?: Submission\n): Request {\n let url = history.createURL(stripHashFromPath(location)).toString();\n let init: RequestInit = { signal };\n\n if (submission && isMutationMethod(submission.formMethod)) {\n let { formMethod, formEncType } = submission;\n // Didn't think we needed this but it turns out unlike other methods, patch\n // won't be properly normalized to uppercase and results in a 405 error.\n // See: https://fetch.spec.whatwg.org/#concept-method\n init.method = formMethod.toUpperCase();\n\n if (formEncType === \"application/json\") {\n init.headers = new Headers({ \"Content-Type\": formEncType });\n init.body = JSON.stringify(submission.json);\n } else if (formEncType === \"text/plain\") {\n // Content-Type is inferred (https://fetch.spec.whatwg.org/#dom-request)\n init.body = submission.text;\n } else if (\n formEncType === \"application/x-www-form-urlencoded\" &&\n submission.formData\n ) {\n // Content-Type is inferred (https://fetch.spec.whatwg.org/#dom-request)\n init.body = convertFormDataToSearchParams(submission.formData);\n } else {\n // Content-Type is inferred (https://fetch.spec.whatwg.org/#dom-request)\n init.body = submission.formData;\n }\n }\n\n return new Request(url, init);\n}\n\nfunction convertFormDataToSearchParams(formData: FormData): URLSearchParams {\n let searchParams = new URLSearchParams();\n\n for (let [key, value] of formData.entries()) {\n // https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#converting-an-entry-list-to-a-list-of-name-value-pairs\n searchParams.append(key, typeof value === \"string\" ? value : value.name);\n }\n\n return searchParams;\n}\n\nfunction convertSearchParamsToFormData(\n searchParams: URLSearchParams\n): FormData {\n let formData = new FormData();\n for (let [key, value] of searchParams.entries()) {\n formData.append(key, value);\n }\n return formData;\n}\n\nfunction processRouteLoaderData(\n matches: AgnosticDataRouteMatch[],\n matchesToLoad: AgnosticDataRouteMatch[],\n results: DataResult[],\n pendingError: RouteData | undefined,\n activeDeferreds: Map\n): {\n loaderData: RouterState[\"loaderData\"];\n errors: RouterState[\"errors\"] | null;\n statusCode: number;\n loaderHeaders: Record;\n} {\n // Fill in loaderData/errors from our loaders\n let loaderData: RouterState[\"loaderData\"] = {};\n let errors: RouterState[\"errors\"] | null = null;\n let statusCode: number | undefined;\n let foundError = false;\n let loaderHeaders: Record = {};\n\n // Process loader results into state.loaderData/state.errors\n results.forEach((result, index) => {\n let id = matchesToLoad[index].route.id;\n invariant(\n !isRedirectResult(result),\n \"Cannot handle redirect results in processLoaderData\"\n );\n if (isErrorResult(result)) {\n // Look upwards from the matched route for the closest ancestor\n // error boundary, defaulting to the root match\n let boundaryMatch = findNearestBoundary(matches, id);\n let error = result.error;\n // If we have a pending action error, we report it at the highest-route\n // that throws a loader error, and then clear it out to indicate that\n // it was consumed\n if (pendingError) {\n error = Object.values(pendingError)[0];\n pendingError = undefined;\n }\n\n errors = errors || {};\n\n // Prefer higher error values if lower errors bubble to the same boundary\n if (errors[boundaryMatch.route.id] == null) {\n errors[boundaryMatch.route.id] = error;\n }\n\n // Clear our any prior loaderData for the throwing route\n loaderData[id] = undefined;\n\n // Once we find our first (highest) error, we set the status code and\n // prevent deeper status codes from overriding\n if (!foundError) {\n foundError = true;\n statusCode = isRouteErrorResponse(result.error)\n ? result.error.status\n : 500;\n }\n if (result.headers) {\n loaderHeaders[id] = result.headers;\n }\n } else {\n if (isDeferredResult(result)) {\n activeDeferreds.set(id, result.deferredData);\n loaderData[id] = result.deferredData.data;\n } else {\n loaderData[id] = result.data;\n }\n\n // Error status codes always override success status codes, but if all\n // loaders are successful we take the deepest status code.\n if (\n result.statusCode != null &&\n result.statusCode !== 200 &&\n !foundError\n ) {\n statusCode = result.statusCode;\n }\n if (result.headers) {\n loaderHeaders[id] = result.headers;\n }\n }\n });\n\n // If we didn't consume the pending action error (i.e., all loaders\n // resolved), then consume it here. Also clear out any loaderData for the\n // throwing route\n if (pendingError) {\n errors = pendingError;\n loaderData[Object.keys(pendingError)[0]] = undefined;\n }\n\n return {\n loaderData,\n errors,\n statusCode: statusCode || 200,\n loaderHeaders,\n };\n}\n\nfunction processLoaderData(\n state: RouterState,\n matches: AgnosticDataRouteMatch[],\n matchesToLoad: AgnosticDataRouteMatch[],\n results: DataResult[],\n pendingError: RouteData | undefined,\n revalidatingFetchers: RevalidatingFetcher[],\n fetcherResults: DataResult[],\n activeDeferreds: Map\n): {\n loaderData: RouterState[\"loaderData\"];\n errors?: RouterState[\"errors\"];\n} {\n let { loaderData, errors } = processRouteLoaderData(\n matches,\n matchesToLoad,\n results,\n pendingError,\n activeDeferreds\n );\n\n // Process results from our revalidating fetchers\n for (let index = 0; index < revalidatingFetchers.length; index++) {\n let { key, match, controller } = revalidatingFetchers[index];\n invariant(\n fetcherResults !== undefined && fetcherResults[index] !== undefined,\n \"Did not find corresponding fetcher result\"\n );\n let result = fetcherResults[index];\n\n // Process fetcher non-redirect errors\n if (controller && controller.signal.aborted) {\n // Nothing to do for aborted fetchers\n continue;\n } else if (isErrorResult(result)) {\n let boundaryMatch = findNearestBoundary(state.matches, match?.route.id);\n if (!(errors && errors[boundaryMatch.route.id])) {\n errors = {\n ...errors,\n [boundaryMatch.route.id]: result.error,\n };\n }\n state.fetchers.delete(key);\n } else if (isRedirectResult(result)) {\n // Should never get here, redirects should get processed above, but we\n // keep this to type narrow to a success result in the else\n invariant(false, \"Unhandled fetcher revalidation redirect\");\n } else if (isDeferredResult(result)) {\n // Should never get here, deferred data should be awaited for fetchers\n // in resolveDeferredResults\n invariant(false, \"Unhandled fetcher deferred data\");\n } else {\n let doneFetcher = getDoneFetcher(result.data);\n state.fetchers.set(key, doneFetcher);\n }\n }\n\n return { loaderData, errors };\n}\n\nfunction mergeLoaderData(\n loaderData: RouteData,\n newLoaderData: RouteData,\n matches: AgnosticDataRouteMatch[],\n errors: RouteData | null | undefined\n): RouteData {\n let mergedLoaderData = { ...newLoaderData };\n for (let match of matches) {\n let id = match.route.id;\n if (newLoaderData.hasOwnProperty(id)) {\n if (newLoaderData[id] !== undefined) {\n mergedLoaderData[id] = newLoaderData[id];\n } else {\n // No-op - this is so we ignore existing data if we have a key in the\n // incoming object with an undefined value, which is how we unset a prior\n // loaderData if we encounter a loader error\n }\n } else if (loaderData[id] !== undefined && match.route.loader) {\n // Preserve existing keys not included in newLoaderData and where a loader\n // wasn't removed by HMR\n mergedLoaderData[id] = loaderData[id];\n }\n\n if (errors && errors.hasOwnProperty(id)) {\n // Don't keep any loader data below the boundary\n break;\n }\n }\n return mergedLoaderData;\n}\n\n// Find the nearest error boundary, looking upwards from the leaf route (or the\n// route specified by routeId) for the closest ancestor error boundary,\n// defaulting to the root match\nfunction findNearestBoundary(\n matches: AgnosticDataRouteMatch[],\n routeId?: string\n): AgnosticDataRouteMatch {\n let eligibleMatches = routeId\n ? matches.slice(0, matches.findIndex((m) => m.route.id === routeId) + 1)\n : [...matches];\n return (\n eligibleMatches.reverse().find((m) => m.route.hasErrorBoundary === true) ||\n matches[0]\n );\n}\n\nfunction getShortCircuitMatches(routes: AgnosticDataRouteObject[]): {\n matches: AgnosticDataRouteMatch[];\n route: AgnosticDataRouteObject;\n} {\n // Prefer a root layout route if present, otherwise shim in a route object\n let route = routes.find((r) => r.index || !r.path || r.path === \"/\") || {\n id: `__shim-error-route__`,\n };\n\n return {\n matches: [\n {\n params: {},\n pathname: \"\",\n pathnameBase: \"\",\n route,\n },\n ],\n route,\n };\n}\n\nfunction getInternalRouterError(\n status: number,\n {\n pathname,\n routeId,\n method,\n type,\n }: {\n pathname?: string;\n routeId?: string;\n method?: string;\n type?: \"defer-action\" | \"invalid-body\";\n } = {}\n) {\n let statusText = \"Unknown Server Error\";\n let errorMessage = \"Unknown @remix-run/router error\";\n\n if (status === 400) {\n statusText = \"Bad Request\";\n if (method && pathname && routeId) {\n errorMessage =\n `You made a ${method} request to \"${pathname}\" but ` +\n `did not provide a \\`loader\\` for route \"${routeId}\", ` +\n `so there is no way to handle the request.`;\n } else if (type === \"defer-action\") {\n errorMessage = \"defer() is not supported in actions\";\n } else if (type === \"invalid-body\") {\n errorMessage = \"Unable to encode submission body\";\n }\n } else if (status === 403) {\n statusText = \"Forbidden\";\n errorMessage = `Route \"${routeId}\" does not match URL \"${pathname}\"`;\n } else if (status === 404) {\n statusText = \"Not Found\";\n errorMessage = `No route matches URL \"${pathname}\"`;\n } else if (status === 405) {\n statusText = \"Method Not Allowed\";\n if (method && pathname && routeId) {\n errorMessage =\n `You made a ${method.toUpperCase()} request to \"${pathname}\" but ` +\n `did not provide an \\`action\\` for route \"${routeId}\", ` +\n `so there is no way to handle the request.`;\n } else if (method) {\n errorMessage = `Invalid request method \"${method.toUpperCase()}\"`;\n }\n }\n\n return new ErrorResponse(\n status || 500,\n statusText,\n new Error(errorMessage),\n true\n );\n}\n\n// Find any returned redirect errors, starting from the lowest match\nfunction findRedirect(\n results: DataResult[]\n): { result: RedirectResult; idx: number } | undefined {\n for (let i = results.length - 1; i >= 0; i--) {\n let result = results[i];\n if (isRedirectResult(result)) {\n return { result, idx: i };\n }\n }\n}\n\nfunction stripHashFromPath(path: To) {\n let parsedPath = typeof path === \"string\" ? parsePath(path) : path;\n return createPath({ ...parsedPath, hash: \"\" });\n}\n\nfunction isHashChangeOnly(a: Location, b: Location): boolean {\n if (a.pathname !== b.pathname || a.search !== b.search) {\n return false;\n }\n\n if (a.hash === \"\") {\n // /page -> /page#hash\n return b.hash !== \"\";\n } else if (a.hash === b.hash) {\n // /page#hash -> /page#hash\n return true;\n } else if (b.hash !== \"\") {\n // /page#hash -> /page#other\n return true;\n }\n\n // If the hash is removed the browser will re-perform a request to the server\n // /page#hash -> /page\n return false;\n}\n\nfunction isDeferredResult(result: DataResult): result is DeferredResult {\n return result.type === ResultType.deferred;\n}\n\nfunction isErrorResult(result: DataResult): result is ErrorResult {\n return result.type === ResultType.error;\n}\n\nfunction isRedirectResult(result?: DataResult): result is RedirectResult {\n return (result && result.type) === ResultType.redirect;\n}\n\nexport function isDeferredData(value: any): value is DeferredData {\n let deferred: DeferredData = value;\n return (\n deferred &&\n typeof deferred === \"object\" &&\n typeof deferred.data === \"object\" &&\n typeof deferred.subscribe === \"function\" &&\n typeof deferred.cancel === \"function\" &&\n typeof deferred.resolveData === \"function\"\n );\n}\n\nfunction isResponse(value: any): value is Response {\n return (\n value != null &&\n typeof value.status === \"number\" &&\n typeof value.statusText === \"string\" &&\n typeof value.headers === \"object\" &&\n typeof value.body !== \"undefined\"\n );\n}\n\nfunction isRedirectResponse(result: any): result is Response {\n if (!isResponse(result)) {\n return false;\n }\n\n let status = result.status;\n let location = result.headers.get(\"Location\");\n return status >= 300 && status <= 399 && location != null;\n}\n\nfunction isQueryRouteResponse(obj: any): obj is QueryRouteResponse {\n return (\n obj &&\n isResponse(obj.response) &&\n (obj.type === ResultType.data || obj.type === ResultType.error)\n );\n}\n\nfunction isValidMethod(method: string): method is FormMethod | V7_FormMethod {\n return validRequestMethods.has(method.toLowerCase() as FormMethod);\n}\n\nfunction isMutationMethod(\n method: string\n): method is MutationFormMethod | V7_MutationFormMethod {\n return validMutationMethods.has(method.toLowerCase() as MutationFormMethod);\n}\n\nasync function resolveDeferredResults(\n currentMatches: AgnosticDataRouteMatch[],\n matchesToLoad: (AgnosticDataRouteMatch | null)[],\n results: DataResult[],\n signals: (AbortSignal | null)[],\n isFetcher: boolean,\n currentLoaderData?: RouteData\n) {\n for (let index = 0; index < results.length; index++) {\n let result = results[index];\n let match = matchesToLoad[index];\n // If we don't have a match, then we can have a deferred result to do\n // anything with. This is for revalidating fetchers where the route was\n // removed during HMR\n if (!match) {\n continue;\n }\n\n let currentMatch = currentMatches.find(\n (m) => m.route.id === match!.route.id\n );\n let isRevalidatingLoader =\n currentMatch != null &&\n !isNewRouteInstance(currentMatch, match) &&\n (currentLoaderData && currentLoaderData[match.route.id]) !== undefined;\n\n if (isDeferredResult(result) && (isFetcher || isRevalidatingLoader)) {\n // Note: we do not have to touch activeDeferreds here since we race them\n // against the signal in resolveDeferredData and they'll get aborted\n // there if needed\n let signal = signals[index];\n invariant(\n signal,\n \"Expected an AbortSignal for revalidating fetcher deferred result\"\n );\n await resolveDeferredData(result, signal, isFetcher).then((result) => {\n if (result) {\n results[index] = result || results[index];\n }\n });\n }\n }\n}\n\nasync function resolveDeferredData(\n result: DeferredResult,\n signal: AbortSignal,\n unwrap = false\n): Promise {\n let aborted = await result.deferredData.resolveData(signal);\n if (aborted) {\n return;\n }\n\n if (unwrap) {\n try {\n return {\n type: ResultType.data,\n data: result.deferredData.unwrappedData,\n };\n } catch (e) {\n // Handle any TrackedPromise._error values encountered while unwrapping\n return {\n type: ResultType.error,\n error: e,\n };\n }\n }\n\n return {\n type: ResultType.data,\n data: result.deferredData.data,\n };\n}\n\nfunction hasNakedIndexQuery(search: string): boolean {\n return new URLSearchParams(search).getAll(\"index\").some((v) => v === \"\");\n}\n\n// Note: This should match the format exported by useMatches, so if you change\n// this please also change that :) Eventually we'll DRY this up\nfunction createUseMatchesMatch(\n match: AgnosticDataRouteMatch,\n loaderData: RouteData\n): UseMatchesMatch {\n let { route, pathname, params } = match;\n return {\n id: route.id,\n pathname,\n params,\n data: loaderData[route.id] as unknown,\n handle: route.handle as unknown,\n };\n}\n\nfunction getTargetMatch(\n matches: AgnosticDataRouteMatch[],\n location: Location | string\n) {\n let search =\n typeof location === \"string\" ? parsePath(location).search : location.search;\n if (\n matches[matches.length - 1].route.index &&\n hasNakedIndexQuery(search || \"\")\n ) {\n // Return the leaf index route when index is present\n return matches[matches.length - 1];\n }\n // Otherwise grab the deepest \"path contributing\" match (ignoring index and\n // pathless layout routes)\n let pathMatches = getPathContributingMatches(matches);\n return pathMatches[pathMatches.length - 1];\n}\n\nfunction getSubmissionFromNavigation(\n navigation: Navigation\n): Submission | undefined {\n let { formMethod, formAction, formEncType, text, formData, json } =\n navigation;\n if (!formMethod || !formAction || !formEncType) {\n return;\n }\n\n if (text != null) {\n return {\n formMethod,\n formAction,\n formEncType,\n formData: undefined,\n json: undefined,\n text,\n };\n } else if (formData != null) {\n return {\n formMethod,\n formAction,\n formEncType,\n formData,\n json: undefined,\n text: undefined,\n };\n } else if (json !== undefined) {\n return {\n formMethod,\n formAction,\n formEncType,\n formData: undefined,\n json,\n text: undefined,\n };\n }\n}\n\nfunction getLoadingNavigation(\n location: Location,\n submission?: Submission\n): NavigationStates[\"Loading\"] {\n if (submission) {\n let navigation: NavigationStates[\"Loading\"] = {\n state: \"loading\",\n location,\n formMethod: submission.formMethod,\n formAction: submission.formAction,\n formEncType: submission.formEncType,\n formData: submission.formData,\n json: submission.json,\n text: submission.text,\n };\n return navigation;\n } else {\n let navigation: NavigationStates[\"Loading\"] = {\n state: \"loading\",\n location,\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n json: undefined,\n text: undefined,\n };\n return navigation;\n }\n}\n\nfunction getSubmittingNavigation(\n location: Location,\n submission: Submission\n): NavigationStates[\"Submitting\"] {\n let navigation: NavigationStates[\"Submitting\"] = {\n state: \"submitting\",\n location,\n formMethod: submission.formMethod,\n formAction: submission.formAction,\n formEncType: submission.formEncType,\n formData: submission.formData,\n json: submission.json,\n text: submission.text,\n };\n return navigation;\n}\n\nfunction getLoadingFetcher(\n submission?: Submission,\n data?: Fetcher[\"data\"]\n): FetcherStates[\"Loading\"] {\n if (submission) {\n let fetcher: FetcherStates[\"Loading\"] = {\n state: \"loading\",\n formMethod: submission.formMethod,\n formAction: submission.formAction,\n formEncType: submission.formEncType,\n formData: submission.formData,\n json: submission.json,\n text: submission.text,\n data,\n \" _hasFetcherDoneAnything \": true,\n };\n return fetcher;\n } else {\n let fetcher: FetcherStates[\"Loading\"] = {\n state: \"loading\",\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n json: undefined,\n text: undefined,\n data,\n \" _hasFetcherDoneAnything \": true,\n };\n return fetcher;\n }\n}\n\nfunction getSubmittingFetcher(\n submission: Submission,\n existingFetcher?: Fetcher\n): FetcherStates[\"Submitting\"] {\n let fetcher: FetcherStates[\"Submitting\"] = {\n state: \"submitting\",\n formMethod: submission.formMethod,\n formAction: submission.formAction,\n formEncType: submission.formEncType,\n formData: submission.formData,\n json: submission.json,\n text: submission.text,\n data: existingFetcher ? existingFetcher.data : undefined,\n \" _hasFetcherDoneAnything \": true,\n };\n return fetcher;\n}\n\nfunction getDoneFetcher(data: Fetcher[\"data\"]): FetcherStates[\"Idle\"] {\n let fetcher: FetcherStates[\"Idle\"] = {\n state: \"idle\",\n formMethod: undefined,\n formAction: undefined,\n formEncType: undefined,\n formData: undefined,\n json: undefined,\n text: undefined,\n data,\n \" _hasFetcherDoneAnything \": true,\n };\n return fetcher;\n}\n//#endregion\n","/* @license\nPapa Parse\nv5.4.1\nhttps://github.com/mholt/PapaParse\nLicense: MIT\n*/\n!function(e,t){\"function\"==typeof define&&define.amd?define([],t):\"object\"==typeof module&&\"undefined\"!=typeof exports?module.exports=t():e.Papa=t()}(this,function s(){\"use strict\";var f=\"undefined\"!=typeof self?self:\"undefined\"!=typeof window?window:void 0!==f?f:{};var n=!f.document&&!!f.postMessage,o=f.IS_PAPA_WORKER||!1,a={},u=0,b={parse:function(e,t){var r=(t=t||{}).dynamicTyping||!1;J(r)&&(t.dynamicTypingFunction=r,r={});if(t.dynamicTyping=r,t.transform=!!J(t.transform)&&t.transform,t.worker&&b.WORKERS_SUPPORTED){var i=function(){if(!b.WORKERS_SUPPORTED)return!1;var e=(r=f.URL||f.webkitURL||null,i=s.toString(),b.BLOB_URL||(b.BLOB_URL=r.createObjectURL(new Blob([\"var global = (function() { if (typeof self !== 'undefined') { return self; } if (typeof window !== 'undefined') { return window; } if (typeof global !== 'undefined') { return global; } return {}; })(); global.IS_PAPA_WORKER=true; \",\"(\",i,\")();\"],{type:\"text/javascript\"})))),t=new f.Worker(e);var r,i;return t.onmessage=_,t.id=u++,a[t.id]=t}();return i.userStep=t.step,i.userChunk=t.chunk,i.userComplete=t.complete,i.userError=t.error,t.step=J(t.step),t.chunk=J(t.chunk),t.complete=J(t.complete),t.error=J(t.error),delete t.worker,void i.postMessage({input:e,config:t,workerId:i.id})}var n=null;b.NODE_STREAM_INPUT,\"string\"==typeof e?(e=function(e){if(65279===e.charCodeAt(0))return e.slice(1);return e}(e),n=t.download?new l(t):new p(t)):!0===e.readable&&J(e.read)&&J(e.on)?n=new g(t):(f.File&&e instanceof File||e instanceof Object)&&(n=new c(t));return n.stream(e)},unparse:function(e,t){var n=!1,_=!0,m=\",\",y=\"\\r\\n\",s='\"',a=s+s,r=!1,i=null,o=!1;!function(){if(\"object\"!=typeof t)return;\"string\"!=typeof t.delimiter||b.BAD_DELIMITERS.filter(function(e){return-1!==t.delimiter.indexOf(e)}).length||(m=t.delimiter);(\"boolean\"==typeof t.quotes||\"function\"==typeof t.quotes||Array.isArray(t.quotes))&&(n=t.quotes);\"boolean\"!=typeof t.skipEmptyLines&&\"string\"!=typeof t.skipEmptyLines||(r=t.skipEmptyLines);\"string\"==typeof t.newline&&(y=t.newline);\"string\"==typeof t.quoteChar&&(s=t.quoteChar);\"boolean\"==typeof t.header&&(_=t.header);if(Array.isArray(t.columns)){if(0===t.columns.length)throw new Error(\"Option columns is empty\");i=t.columns}void 0!==t.escapeChar&&(a=t.escapeChar+s);(\"boolean\"==typeof t.escapeFormulae||t.escapeFormulae instanceof RegExp)&&(o=t.escapeFormulae instanceof RegExp?t.escapeFormulae:/^[=+\\-@\\t\\r].*$/)}();var u=new RegExp(Q(s),\"g\");\"string\"==typeof e&&(e=JSON.parse(e));if(Array.isArray(e)){if(!e.length||Array.isArray(e[0]))return h(null,e,r);if(\"object\"==typeof e[0])return h(i||Object.keys(e[0]),e,r)}else if(\"object\"==typeof e)return\"string\"==typeof e.data&&(e.data=JSON.parse(e.data)),Array.isArray(e.data)&&(e.fields||(e.fields=e.meta&&e.meta.fields||i),e.fields||(e.fields=Array.isArray(e.data[0])?e.fields:\"object\"==typeof e.data[0]?Object.keys(e.data[0]):[]),Array.isArray(e.data[0])||\"object\"==typeof e.data[0]||(e.data=[e.data])),h(e.fields||[],e.data||[],r);throw new Error(\"Unable to serialize unrecognized input\");function h(e,t,r){var i=\"\";\"string\"==typeof e&&(e=JSON.parse(e)),\"string\"==typeof t&&(t=JSON.parse(t));var n=Array.isArray(e)&&0=this._config.preview;if(o)f.postMessage({results:n,workerId:b.WORKER_ID,finished:a});else if(J(this._config.chunk)&&!t){if(this._config.chunk(n,this._handle),this._handle.paused()||this._handle.aborted())return void(this._halted=!0);n=void 0,this._completeResults=void 0}return this._config.step||this._config.chunk||(this._completeResults.data=this._completeResults.data.concat(n.data),this._completeResults.errors=this._completeResults.errors.concat(n.errors),this._completeResults.meta=n.meta),this._completed||!a||!J(this._config.complete)||n&&n.meta.aborted||(this._config.complete(this._completeResults,this._input),this._completed=!0),a||n&&n.meta.paused||this._nextChunk(),n}this._halted=!0},this._sendError=function(e){J(this._config.error)?this._config.error(e):o&&this._config.error&&f.postMessage({workerId:b.WORKER_ID,error:e,finished:!1})}}function l(e){var i;(e=e||{}).chunkSize||(e.chunkSize=b.RemoteChunkSize),h.call(this,e),this._nextChunk=n?function(){this._readChunk(),this._chunkLoaded()}:function(){this._readChunk()},this.stream=function(e){this._input=e,this._nextChunk()},this._readChunk=function(){if(this._finished)this._chunkLoaded();else{if(i=new XMLHttpRequest,this._config.withCredentials&&(i.withCredentials=this._config.withCredentials),n||(i.onload=v(this._chunkLoaded,this),i.onerror=v(this._chunkError,this)),i.open(this._config.downloadRequestBody?\"POST\":\"GET\",this._input,!n),this._config.downloadRequestHeaders){var e=this._config.downloadRequestHeaders;for(var t in e)i.setRequestHeader(t,e[t])}if(this._config.chunkSize){var r=this._start+this._config.chunkSize-1;i.setRequestHeader(\"Range\",\"bytes=\"+this._start+\"-\"+r)}try{i.send(this._config.downloadRequestBody)}catch(e){this._chunkError(e.message)}n&&0===i.status&&this._chunkError()}},this._chunkLoaded=function(){4===i.readyState&&(i.status<200||400<=i.status?this._chunkError():(this._start+=this._config.chunkSize?this._config.chunkSize:i.responseText.length,this._finished=!this._config.chunkSize||this._start>=function(e){var t=e.getResponseHeader(\"Content-Range\");if(null===t)return-1;return parseInt(t.substring(t.lastIndexOf(\"/\")+1))}(i),this.parseChunk(i.responseText)))},this._chunkError=function(e){var t=i.statusText||e;this._sendError(new Error(t))}}function c(e){var i,n;(e=e||{}).chunkSize||(e.chunkSize=b.LocalChunkSize),h.call(this,e);var s=\"undefined\"!=typeof FileReader;this.stream=function(e){this._input=e,n=e.slice||e.webkitSlice||e.mozSlice,s?((i=new FileReader).onload=v(this._chunkLoaded,this),i.onerror=v(this._chunkError,this)):i=new FileReaderSync,this._nextChunk()},this._nextChunk=function(){this._finished||this._config.preview&&!(this._rowCount=this._input.size,this.parseChunk(e.target.result)},this._chunkError=function(){this._sendError(i.error)}}function p(e){var r;h.call(this,e=e||{}),this.stream=function(e){return r=e,this._nextChunk()},this._nextChunk=function(){if(!this._finished){var e,t=this._config.chunkSize;return t?(e=r.substring(0,t),r=r.substring(t)):(e=r,r=\"\"),this._finished=!r,this.parseChunk(e)}}}function g(e){h.call(this,e=e||{});var t=[],r=!0,i=!1;this.pause=function(){h.prototype.pause.apply(this,arguments),this._input.pause()},this.resume=function(){h.prototype.resume.apply(this,arguments),this._input.resume()},this.stream=function(e){this._input=e,this._input.on(\"data\",this._streamData),this._input.on(\"end\",this._streamEnd),this._input.on(\"error\",this._streamError)},this._checkIsFinished=function(){i&&1===t.length&&(this._finished=!0)},this._nextChunk=function(){this._checkIsFinished(),t.length?this.parseChunk(t.shift()):r=!0},this._streamData=v(function(e){try{t.push(\"string\"==typeof e?e:e.toString(this._config.encoding)),r&&(r=!1,this._checkIsFinished(),this.parseChunk(t.shift()))}catch(e){this._streamError(e)}},this),this._streamError=v(function(e){this._streamCleanUp(),this._sendError(e)},this),this._streamEnd=v(function(){this._streamCleanUp(),i=!0,this._streamData(\"\")},this),this._streamCleanUp=v(function(){this._input.removeListener(\"data\",this._streamData),this._input.removeListener(\"end\",this._streamEnd),this._input.removeListener(\"error\",this._streamError)},this)}function r(m){var a,o,u,i=Math.pow(2,53),n=-i,s=/^\\s*-?(\\d+\\.?|\\.\\d+|\\d+\\.\\d+)([eE][-+]?\\d+)?\\s*$/,h=/^((\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d\\.\\d+([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z))|(\\d{4}-[01]\\d-[0-3]\\dT[0-2]\\d:[0-5]\\d([+-][0-2]\\d:[0-5]\\d|Z)))$/,t=this,r=0,f=0,d=!1,e=!1,l=[],c={data:[],errors:[],meta:{}};if(J(m.step)){var p=m.step;m.step=function(e){if(c=e,_())g();else{if(g(),0===c.data.length)return;r+=e.data.length,m.preview&&r>m.preview?o.abort():(c.data=c.data[0],p(c,t))}}}function y(e){return\"greedy\"===m.skipEmptyLines?\"\"===e.join(\"\").trim():1===e.length&&0===e[0].length}function g(){return c&&u&&(k(\"Delimiter\",\"UndetectableDelimiter\",\"Unable to auto-detect delimiting character; defaulted to '\"+b.DefaultDelimiter+\"'\"),u=!1),m.skipEmptyLines&&(c.data=c.data.filter(function(e){return!y(e)})),_()&&function(){if(!c)return;function e(e,t){J(m.transformHeader)&&(e=m.transformHeader(e,t)),l.push(e)}if(Array.isArray(c.data[0])){for(var t=0;_()&&t=l.length?\"__parsed_extra\":l[r]),m.transform&&(s=m.transform(s,n)),s=v(n,s),\"__parsed_extra\"===n?(i[n]=i[n]||[],i[n].push(s)):i[n]=s}return m.header&&(r>l.length?k(\"FieldMismatch\",\"TooManyFields\",\"Too many fields: expected \"+l.length+\" fields but parsed \"+r,f+t):r=i.length/2?\"\\r\\n\":\"\\r\"}(e,i)),u=!1,m.delimiter)J(m.delimiter)&&(m.delimiter=m.delimiter(e),c.meta.delimiter=m.delimiter);else{var n=function(e,t,r,i,n){var s,a,o,u;n=n||[\",\",\"\\t\",\"|\",\";\",b.RECORD_SEP,b.UNIT_SEP];for(var h=0;h=N)return L(!0)}else for(S=W,W++;;){if(-1===(S=i.indexOf(z,S+1)))return r||h.push({type:\"Quotes\",code:\"MissingQuotes\",message:\"Quoted field unterminated\",row:u.length,index:W}),T();if(S===n-1)return T(i.substring(W,S).replace(C,z));if(z!==K||i[S+1]!==K){if(z===K||0===S||i[S-1]!==K){-1!==w&&w=N)return L(!0);break}h.push({type:\"Quotes\",code:\"InvalidQuotes\",message:\"Trailing quote on quoted field is malformed\",row:u.length,index:W}),S++}}else S++}return T();function I(e){u.push(e),d=W}function A(e){var t=0;if(-1!==e){var r=i.substring(S+1,e);r&&\"\"===r.trim()&&(t=r.length)}return t}function T(e){return r||(void 0===e&&(e=i.substring(W)),f.push(e),W=n,I(f),o&&F()),L()}function D(e){W=e,I(f),f=[],R=i.indexOf(P,W)}function L(e){return{data:u,errors:h,meta:{delimiter:M,linebreak:P,aborted:H,truncated:!!e,cursor:d+(t||0)}}}function F(){q(L()),u=[],h=[]}},this.abort=function(){H=!0},this.getCharIndex=function(){return W}}function _(e){var t=e.data,r=a[t.workerId],i=!1;if(t.error)r.userError(t.error,t.file);else if(t.results&&t.results.data){var n={abort:function(){i=!0,m(t.workerId,{data:[],errors:[],meta:{aborted:!0}})},pause:y,resume:y};if(J(r.userStep)){for(var s=0;s= this.getNumEmptyDaysAtStart() + this.getDateDifferenceInDays();\n\n if (indexOutOfRange && !this.props.showOutOfRangeDays) {\n return null;\n }\n\n var _this$getSquareCoordi = this.getSquareCoordinates(dayIndex),\n _this$getSquareCoordi2 = _slicedToArray(_this$getSquareCoordi, 2),\n x = _this$getSquareCoordi2[0],\n y = _this$getSquareCoordi2[1];\n\n var value = this.getValueForIndex(index);\n var rect = // eslint-disable-next-line jsx-a11y/mouse-events-have-key-events\n React.createElement(\"rect\", _extends({\n key: index,\n width: SQUARE_SIZE,\n height: SQUARE_SIZE,\n x: x,\n y: y,\n className: this.getClassNameForIndex(index),\n onClick: function onClick() {\n return _this2.handleClick(value);\n },\n onMouseOver: function onMouseOver(e) {\n return _this2.handleMouseOver(e, value);\n },\n onMouseLeave: function onMouseLeave(e) {\n return _this2.handleMouseLeave(e, value);\n }\n }, this.getTooltipDataAttrsForIndex(index)), React.createElement(\"title\", null, this.getTitleForIndex(index)));\n var transformDayElement = this.props.transformDayElement;\n return transformDayElement ? transformDayElement(rect, value, index) : rect;\n }\n }, {\n key: \"renderWeek\",\n value: function renderWeek(weekIndex) {\n var _this3 = this;\n\n return React.createElement(\"g\", {\n key: weekIndex,\n transform: this.getTransformForWeek(weekIndex),\n className: \"\".concat(CSS_PSEDUO_NAMESPACE, \"week\")\n }, getRange(DAYS_IN_WEEK).map(function (dayIndex) {\n return _this3.renderSquare(dayIndex, weekIndex * DAYS_IN_WEEK + dayIndex);\n }));\n }\n }, {\n key: \"renderAllWeeks\",\n value: function renderAllWeeks() {\n var _this4 = this;\n\n return getRange(this.getWeekCount()).map(function (weekIndex) {\n return _this4.renderWeek(weekIndex);\n });\n }\n }, {\n key: \"renderMonthLabels\",\n value: function renderMonthLabels() {\n var _this5 = this;\n\n if (!this.props.showMonthLabels) {\n return null;\n }\n\n var weekRange = getRange(this.getWeekCount() - 1); // don't render for last week, because label will be cut off\n\n return weekRange.map(function (weekIndex) {\n var endOfWeek = shiftDate(_this5.getStartDateWithEmptyDays(), (weekIndex + 1) * DAYS_IN_WEEK);\n\n var _this5$getMonthLabelC = _this5.getMonthLabelCoordinates(weekIndex),\n _this5$getMonthLabelC2 = _slicedToArray(_this5$getMonthLabelC, 2),\n x = _this5$getMonthLabelC2[0],\n y = _this5$getMonthLabelC2[1];\n\n return endOfWeek.getDate() >= 1 && endOfWeek.getDate() <= DAYS_IN_WEEK ? React.createElement(\"text\", {\n key: weekIndex,\n x: x,\n y: y,\n className: \"\".concat(CSS_PSEDUO_NAMESPACE, \"month-label\")\n }, _this5.props.monthLabels[endOfWeek.getMonth()]) : null;\n });\n }\n }, {\n key: \"renderWeekdayLabels\",\n value: function renderWeekdayLabels() {\n var _this6 = this;\n\n if (!this.props.showWeekdayLabels) {\n return null;\n }\n\n return this.props.weekdayLabels.map(function (weekdayLabel, dayIndex) {\n var _this6$getWeekdayLabe = _this6.getWeekdayLabelCoordinates(dayIndex),\n _this6$getWeekdayLabe2 = _slicedToArray(_this6$getWeekdayLabe, 2),\n x = _this6$getWeekdayLabe2[0],\n y = _this6$getWeekdayLabe2[1];\n\n var cssClasses = \"\".concat(_this6.props.horizontal ? '' : \"\".concat(CSS_PSEDUO_NAMESPACE, \"small-text\"), \" \").concat(CSS_PSEDUO_NAMESPACE, \"weekday-label\"); // eslint-disable-next-line no-bitwise\n\n return dayIndex & 1 ? React.createElement(\"text\", {\n key: \"\".concat(x).concat(y),\n x: x,\n y: y,\n className: cssClasses\n }, weekdayLabel) : null;\n });\n }\n }, {\n key: \"render\",\n value: function render() {\n this.valueCache = this.getValueCache(this.props);\n return React.createElement(\"svg\", {\n className: \"react-calendar-heatmap\",\n viewBox: this.getViewBox()\n }, React.createElement(\"g\", {\n transform: this.getTransformForMonthLabels(),\n className: \"\".concat(CSS_PSEDUO_NAMESPACE, \"month-labels\")\n }, this.renderMonthLabels()), React.createElement(\"g\", {\n transform: this.getTransformForAllWeeks(),\n className: \"\".concat(CSS_PSEDUO_NAMESPACE, \"all-weeks\")\n }, this.renderAllWeeks()), React.createElement(\"g\", {\n transform: this.getTransformForWeekdayLabels(),\n className: \"\".concat(CSS_PSEDUO_NAMESPACE, \"weekday-labels\")\n }, this.renderWeekdayLabels()));\n }\n }]);\n\n return CalendarHeatmap;\n }(React.Component);\n\n CalendarHeatmap.propTypes = {\n values: propTypes.arrayOf(propTypes.shape({\n date: propTypes.oneOfType([propTypes.string, propTypes.number, propTypes.instanceOf(Date)]).isRequired\n }).isRequired).isRequired,\n // array of objects with date and arbitrary metadata\n numDays: propTypes.number,\n // number of days back from endDate to show\n startDate: propTypes.oneOfType([propTypes.string, propTypes.number, propTypes.instanceOf(Date)]),\n // start of date range\n endDate: propTypes.oneOfType([propTypes.string, propTypes.number, propTypes.instanceOf(Date)]),\n // end of date range\n gutterSize: propTypes.number,\n // size of space between squares\n horizontal: propTypes.bool,\n // whether to orient horizontally or vertically\n showMonthLabels: propTypes.bool,\n // whether to show month labels\n showWeekdayLabels: propTypes.bool,\n // whether to show weekday labels\n showOutOfRangeDays: propTypes.bool,\n // whether to render squares for extra days in week after endDate, and before start date\n tooltipDataAttrs: propTypes.oneOfType([propTypes.object, propTypes.func]),\n // data attributes to add to square for setting 3rd party tooltips, e.g. { 'data-toggle': 'tooltip' } for bootstrap tooltips\n titleForValue: propTypes.func,\n // function which returns title text for value\n classForValue: propTypes.func,\n // function which returns html class for value\n monthLabels: propTypes.arrayOf(propTypes.string),\n // An array with 12 strings representing the text from janurary to december\n weekdayLabels: propTypes.arrayOf(propTypes.string),\n // An array with 7 strings representing the text from Sun to Sat\n onClick: propTypes.func,\n // callback function when a square is clicked\n onMouseOver: propTypes.func,\n // callback function when mouse pointer is over a square\n onMouseLeave: propTypes.func,\n // callback function when mouse pointer is left a square\n transformDayElement: propTypes.func // function to further transform the svg element for a single day\n\n };\n CalendarHeatmap.defaultProps = {\n numDays: null,\n startDate: dateNDaysAgo(200),\n endDate: new Date(),\n gutterSize: 1,\n horizontal: true,\n showMonthLabels: true,\n showWeekdayLabels: false,\n showOutOfRangeDays: false,\n tooltipDataAttrs: null,\n titleForValue: null,\n classForValue: function classForValue(value) {\n return value ? 'color-filled' : 'color-empty';\n },\n monthLabels: MONTH_LABELS,\n weekdayLabels: DAY_LABELS,\n onClick: null,\n onMouseOver: null,\n onMouseLeave: null,\n transformDayElement: null\n };\n\n return CalendarHeatmap;\n\n})));\n","/**\n * @license React\n * react-dom.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */\n/*\n Modernizr 3.0.0pre (Custom Build) | MIT\n*/\n'use strict';var aa=require(\"react\"),ca=require(\"scheduler\");function p(a){for(var b=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+a,c=1;cb}return!1}function v(a,b,c,d,e,f,g){this.acceptsBooleans=2===b||3===b||4===b;this.attributeName=d;this.attributeNamespace=e;this.mustUseProperty=c;this.propertyName=a;this.type=b;this.sanitizeURL=f;this.removeEmptyString=g}var z={};\n\"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style\".split(\" \").forEach(function(a){z[a]=new v(a,0,!1,a,null,!1,!1)});[[\"acceptCharset\",\"accept-charset\"],[\"className\",\"class\"],[\"htmlFor\",\"for\"],[\"httpEquiv\",\"http-equiv\"]].forEach(function(a){var b=a[0];z[b]=new v(b,1,!1,a[1],null,!1,!1)});[\"contentEditable\",\"draggable\",\"spellCheck\",\"value\"].forEach(function(a){z[a]=new v(a,2,!1,a.toLowerCase(),null,!1,!1)});\n[\"autoReverse\",\"externalResourcesRequired\",\"focusable\",\"preserveAlpha\"].forEach(function(a){z[a]=new v(a,2,!1,a,null,!1,!1)});\"allowFullScreen async autoFocus autoPlay controls default defer disabled disablePictureInPicture disableRemotePlayback formNoValidate hidden loop noModule noValidate open playsInline readOnly required reversed scoped seamless itemScope\".split(\" \").forEach(function(a){z[a]=new v(a,3,!1,a.toLowerCase(),null,!1,!1)});\n[\"checked\",\"multiple\",\"muted\",\"selected\"].forEach(function(a){z[a]=new v(a,3,!0,a,null,!1,!1)});[\"capture\",\"download\"].forEach(function(a){z[a]=new v(a,4,!1,a,null,!1,!1)});[\"cols\",\"rows\",\"size\",\"span\"].forEach(function(a){z[a]=new v(a,6,!1,a,null,!1,!1)});[\"rowSpan\",\"start\"].forEach(function(a){z[a]=new v(a,5,!1,a.toLowerCase(),null,!1,!1)});var ra=/[\\-:]([a-z])/g;function sa(a){return a[1].toUpperCase()}\n\"accent-height alignment-baseline arabic-form baseline-shift cap-height clip-path clip-rule color-interpolation color-interpolation-filters color-profile color-rendering dominant-baseline enable-background fill-opacity fill-rule flood-color flood-opacity font-family font-size font-size-adjust font-stretch font-style font-variant font-weight glyph-name glyph-orientation-horizontal glyph-orientation-vertical horiz-adv-x horiz-origin-x image-rendering letter-spacing lighting-color marker-end marker-mid marker-start overline-position overline-thickness paint-order panose-1 pointer-events rendering-intent shape-rendering stop-color stop-opacity strikethrough-position strikethrough-thickness stroke-dasharray stroke-dashoffset stroke-linecap stroke-linejoin stroke-miterlimit stroke-opacity stroke-width text-anchor text-decoration text-rendering underline-position underline-thickness unicode-bidi unicode-range units-per-em v-alphabetic v-hanging v-ideographic v-mathematical vector-effect vert-adv-y vert-origin-x vert-origin-y word-spacing writing-mode xmlns:xlink x-height\".split(\" \").forEach(function(a){var b=a.replace(ra,\nsa);z[b]=new v(b,1,!1,a,null,!1,!1)});\"xlink:actuate xlink:arcrole xlink:role xlink:show xlink:title xlink:type\".split(\" \").forEach(function(a){var b=a.replace(ra,sa);z[b]=new v(b,1,!1,a,\"http://www.w3.org/1999/xlink\",!1,!1)});[\"xml:base\",\"xml:lang\",\"xml:space\"].forEach(function(a){var b=a.replace(ra,sa);z[b]=new v(b,1,!1,a,\"http://www.w3.org/XML/1998/namespace\",!1,!1)});[\"tabIndex\",\"crossOrigin\"].forEach(function(a){z[a]=new v(a,1,!1,a.toLowerCase(),null,!1,!1)});\nz.xlinkHref=new v(\"xlinkHref\",1,!1,\"xlink:href\",\"http://www.w3.org/1999/xlink\",!0,!1);[\"src\",\"href\",\"action\",\"formAction\"].forEach(function(a){z[a]=new v(a,1,!1,a.toLowerCase(),null,!0,!0)});\nfunction ta(a,b,c,d){var e=z.hasOwnProperty(b)?z[b]:null;if(null!==e?0!==e.type:d||!(2h||e[g]!==f[h]){var k=\"\\n\"+e[g].replace(\" at new \",\" at \");a.displayName&&k.includes(\"\")&&(k=k.replace(\"\",a.displayName));return k}while(1<=g&&0<=h)}break}}}finally{Na=!1,Error.prepareStackTrace=c}return(a=a?a.displayName||a.name:\"\")?Ma(a):\"\"}\nfunction Pa(a){switch(a.tag){case 5:return Ma(a.type);case 16:return Ma(\"Lazy\");case 13:return Ma(\"Suspense\");case 19:return Ma(\"SuspenseList\");case 0:case 2:case 15:return a=Oa(a.type,!1),a;case 11:return a=Oa(a.type.render,!1),a;case 1:return a=Oa(a.type,!0),a;default:return\"\"}}\nfunction Qa(a){if(null==a)return null;if(\"function\"===typeof a)return a.displayName||a.name||null;if(\"string\"===typeof a)return a;switch(a){case ya:return\"Fragment\";case wa:return\"Portal\";case Aa:return\"Profiler\";case za:return\"StrictMode\";case Ea:return\"Suspense\";case Fa:return\"SuspenseList\"}if(\"object\"===typeof a)switch(a.$$typeof){case Ca:return(a.displayName||\"Context\")+\".Consumer\";case Ba:return(a._context.displayName||\"Context\")+\".Provider\";case Da:var b=a.render;a=a.displayName;a||(a=b.displayName||\nb.name||\"\",a=\"\"!==a?\"ForwardRef(\"+a+\")\":\"ForwardRef\");return a;case Ga:return b=a.displayName||null,null!==b?b:Qa(a.type)||\"Memo\";case Ha:b=a._payload;a=a._init;try{return Qa(a(b))}catch(c){}}return null}\nfunction Ra(a){var b=a.type;switch(a.tag){case 24:return\"Cache\";case 9:return(b.displayName||\"Context\")+\".Consumer\";case 10:return(b._context.displayName||\"Context\")+\".Provider\";case 18:return\"DehydratedFragment\";case 11:return a=b.render,a=a.displayName||a.name||\"\",b.displayName||(\"\"!==a?\"ForwardRef(\"+a+\")\":\"ForwardRef\");case 7:return\"Fragment\";case 5:return b;case 4:return\"Portal\";case 3:return\"Root\";case 6:return\"Text\";case 16:return Qa(b);case 8:return b===za?\"StrictMode\":\"Mode\";case 22:return\"Offscreen\";\ncase 12:return\"Profiler\";case 21:return\"Scope\";case 13:return\"Suspense\";case 19:return\"SuspenseList\";case 25:return\"TracingMarker\";case 1:case 0:case 17:case 2:case 14:case 15:if(\"function\"===typeof b)return b.displayName||b.name||null;if(\"string\"===typeof b)return b}return null}function Sa(a){switch(typeof a){case \"boolean\":case \"number\":case \"string\":case \"undefined\":return a;case \"object\":return a;default:return\"\"}}\nfunction Ta(a){var b=a.type;return(a=a.nodeName)&&\"input\"===a.toLowerCase()&&(\"checkbox\"===b||\"radio\"===b)}\nfunction Ua(a){var b=Ta(a)?\"checked\":\"value\",c=Object.getOwnPropertyDescriptor(a.constructor.prototype,b),d=\"\"+a[b];if(!a.hasOwnProperty(b)&&\"undefined\"!==typeof c&&\"function\"===typeof c.get&&\"function\"===typeof c.set){var e=c.get,f=c.set;Object.defineProperty(a,b,{configurable:!0,get:function(){return e.call(this)},set:function(a){d=\"\"+a;f.call(this,a)}});Object.defineProperty(a,b,{enumerable:c.enumerable});return{getValue:function(){return d},setValue:function(a){d=\"\"+a},stopTracking:function(){a._valueTracker=\nnull;delete a[b]}}}}function Va(a){a._valueTracker||(a._valueTracker=Ua(a))}function Wa(a){if(!a)return!1;var b=a._valueTracker;if(!b)return!0;var c=b.getValue();var d=\"\";a&&(d=Ta(a)?a.checked?\"true\":\"false\":a.value);a=d;return a!==c?(b.setValue(a),!0):!1}function Xa(a){a=a||(\"undefined\"!==typeof document?document:void 0);if(\"undefined\"===typeof a)return null;try{return a.activeElement||a.body}catch(b){return a.body}}\nfunction Ya(a,b){var c=b.checked;return A({},b,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:null!=c?c:a._wrapperState.initialChecked})}function Za(a,b){var c=null==b.defaultValue?\"\":b.defaultValue,d=null!=b.checked?b.checked:b.defaultChecked;c=Sa(null!=b.value?b.value:c);a._wrapperState={initialChecked:d,initialValue:c,controlled:\"checkbox\"===b.type||\"radio\"===b.type?null!=b.checked:null!=b.value}}function ab(a,b){b=b.checked;null!=b&&ta(a,\"checked\",b,!1)}\nfunction bb(a,b){ab(a,b);var c=Sa(b.value),d=b.type;if(null!=c)if(\"number\"===d){if(0===c&&\"\"===a.value||a.value!=c)a.value=\"\"+c}else a.value!==\"\"+c&&(a.value=\"\"+c);else if(\"submit\"===d||\"reset\"===d){a.removeAttribute(\"value\");return}b.hasOwnProperty(\"value\")?cb(a,b.type,c):b.hasOwnProperty(\"defaultValue\")&&cb(a,b.type,Sa(b.defaultValue));null==b.checked&&null!=b.defaultChecked&&(a.defaultChecked=!!b.defaultChecked)}\nfunction db(a,b,c){if(b.hasOwnProperty(\"value\")||b.hasOwnProperty(\"defaultValue\")){var d=b.type;if(!(\"submit\"!==d&&\"reset\"!==d||void 0!==b.value&&null!==b.value))return;b=\"\"+a._wrapperState.initialValue;c||b===a.value||(a.value=b);a.defaultValue=b}c=a.name;\"\"!==c&&(a.name=\"\");a.defaultChecked=!!a._wrapperState.initialChecked;\"\"!==c&&(a.name=c)}\nfunction cb(a,b,c){if(\"number\"!==b||Xa(a.ownerDocument)!==a)null==c?a.defaultValue=\"\"+a._wrapperState.initialValue:a.defaultValue!==\"\"+c&&(a.defaultValue=\"\"+c)}var eb=Array.isArray;\nfunction fb(a,b,c,d){a=a.options;if(b){b={};for(var e=0;e\"+b.valueOf().toString()+\"\";for(b=mb.firstChild;a.firstChild;)a.removeChild(a.firstChild);for(;b.firstChild;)a.appendChild(b.firstChild)}});\nfunction ob(a,b){if(b){var c=a.firstChild;if(c&&c===a.lastChild&&3===c.nodeType){c.nodeValue=b;return}}a.textContent=b}\nvar pb={animationIterationCount:!0,aspectRatio:!0,borderImageOutset:!0,borderImageSlice:!0,borderImageWidth:!0,boxFlex:!0,boxFlexGroup:!0,boxOrdinalGroup:!0,columnCount:!0,columns:!0,flex:!0,flexGrow:!0,flexPositive:!0,flexShrink:!0,flexNegative:!0,flexOrder:!0,gridArea:!0,gridRow:!0,gridRowEnd:!0,gridRowSpan:!0,gridRowStart:!0,gridColumn:!0,gridColumnEnd:!0,gridColumnSpan:!0,gridColumnStart:!0,fontWeight:!0,lineClamp:!0,lineHeight:!0,opacity:!0,order:!0,orphans:!0,tabSize:!0,widows:!0,zIndex:!0,\nzoom:!0,fillOpacity:!0,floodOpacity:!0,stopOpacity:!0,strokeDasharray:!0,strokeDashoffset:!0,strokeMiterlimit:!0,strokeOpacity:!0,strokeWidth:!0},qb=[\"Webkit\",\"ms\",\"Moz\",\"O\"];Object.keys(pb).forEach(function(a){qb.forEach(function(b){b=b+a.charAt(0).toUpperCase()+a.substring(1);pb[b]=pb[a]})});function rb(a,b,c){return null==b||\"boolean\"===typeof b||\"\"===b?\"\":c||\"number\"!==typeof b||0===b||pb.hasOwnProperty(a)&&pb[a]?(\"\"+b).trim():b+\"px\"}\nfunction sb(a,b){a=a.style;for(var c in b)if(b.hasOwnProperty(c)){var d=0===c.indexOf(\"--\"),e=rb(c,b[c],d);\"float\"===c&&(c=\"cssFloat\");d?a.setProperty(c,e):a[c]=e}}var tb=A({menuitem:!0},{area:!0,base:!0,br:!0,col:!0,embed:!0,hr:!0,img:!0,input:!0,keygen:!0,link:!0,meta:!0,param:!0,source:!0,track:!0,wbr:!0});\nfunction ub(a,b){if(b){if(tb[a]&&(null!=b.children||null!=b.dangerouslySetInnerHTML))throw Error(p(137,a));if(null!=b.dangerouslySetInnerHTML){if(null!=b.children)throw Error(p(60));if(\"object\"!==typeof b.dangerouslySetInnerHTML||!(\"__html\"in b.dangerouslySetInnerHTML))throw Error(p(61));}if(null!=b.style&&\"object\"!==typeof b.style)throw Error(p(62));}}\nfunction vb(a,b){if(-1===a.indexOf(\"-\"))return\"string\"===typeof b.is;switch(a){case \"annotation-xml\":case \"color-profile\":case \"font-face\":case \"font-face-src\":case \"font-face-uri\":case \"font-face-format\":case \"font-face-name\":case \"missing-glyph\":return!1;default:return!0}}var wb=null;function xb(a){a=a.target||a.srcElement||window;a.correspondingUseElement&&(a=a.correspondingUseElement);return 3===a.nodeType?a.parentNode:a}var yb=null,zb=null,Ab=null;\nfunction Bb(a){if(a=Cb(a)){if(\"function\"!==typeof yb)throw Error(p(280));var b=a.stateNode;b&&(b=Db(b),yb(a.stateNode,a.type,b))}}function Eb(a){zb?Ab?Ab.push(a):Ab=[a]:zb=a}function Fb(){if(zb){var a=zb,b=Ab;Ab=zb=null;Bb(a);if(b)for(a=0;a>>=0;return 0===a?32:31-(pc(a)/qc|0)|0}var rc=64,sc=4194304;\nfunction tc(a){switch(a&-a){case 1:return 1;case 2:return 2;case 4:return 4;case 8:return 8;case 16:return 16;case 32:return 32;case 64:case 128:case 256:case 512:case 1024:case 2048:case 4096:case 8192:case 16384:case 32768:case 65536:case 131072:case 262144:case 524288:case 1048576:case 2097152:return a&4194240;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return a&130023424;case 134217728:return 134217728;case 268435456:return 268435456;case 536870912:return 536870912;case 1073741824:return 1073741824;\ndefault:return a}}function uc(a,b){var c=a.pendingLanes;if(0===c)return 0;var d=0,e=a.suspendedLanes,f=a.pingedLanes,g=c&268435455;if(0!==g){var h=g&~e;0!==h?d=tc(h):(f&=g,0!==f&&(d=tc(f)))}else g=c&~e,0!==g?d=tc(g):0!==f&&(d=tc(f));if(0===d)return 0;if(0!==b&&b!==d&&0===(b&e)&&(e=d&-d,f=b&-b,e>=f||16===e&&0!==(f&4194240)))return b;0!==(d&4)&&(d|=c&16);b=a.entangledLanes;if(0!==b)for(a=a.entanglements,b&=d;0c;c++)b.push(a);return b}\nfunction Ac(a,b,c){a.pendingLanes|=b;536870912!==b&&(a.suspendedLanes=0,a.pingedLanes=0);a=a.eventTimes;b=31-oc(b);a[b]=c}function Bc(a,b){var c=a.pendingLanes&~b;a.pendingLanes=b;a.suspendedLanes=0;a.pingedLanes=0;a.expiredLanes&=b;a.mutableReadLanes&=b;a.entangledLanes&=b;b=a.entanglements;var d=a.eventTimes;for(a=a.expirationTimes;0=be),ee=String.fromCharCode(32),fe=!1;\nfunction ge(a,b){switch(a){case \"keyup\":return-1!==$d.indexOf(b.keyCode);case \"keydown\":return 229!==b.keyCode;case \"keypress\":case \"mousedown\":case \"focusout\":return!0;default:return!1}}function he(a){a=a.detail;return\"object\"===typeof a&&\"data\"in a?a.data:null}var ie=!1;function je(a,b){switch(a){case \"compositionend\":return he(b);case \"keypress\":if(32!==b.which)return null;fe=!0;return ee;case \"textInput\":return a=b.data,a===ee&&fe?null:a;default:return null}}\nfunction ke(a,b){if(ie)return\"compositionend\"===a||!ae&&ge(a,b)?(a=nd(),md=ld=kd=null,ie=!1,a):null;switch(a){case \"paste\":return null;case \"keypress\":if(!(b.ctrlKey||b.altKey||b.metaKey)||b.ctrlKey&&b.altKey){if(b.char&&1=b)return{node:c,offset:b-a};a=d}a:{for(;c;){if(c.nextSibling){c=c.nextSibling;break a}c=c.parentNode}c=void 0}c=Je(c)}}function Le(a,b){return a&&b?a===b?!0:a&&3===a.nodeType?!1:b&&3===b.nodeType?Le(a,b.parentNode):\"contains\"in a?a.contains(b):a.compareDocumentPosition?!!(a.compareDocumentPosition(b)&16):!1:!1}\nfunction Me(){for(var a=window,b=Xa();b instanceof a.HTMLIFrameElement;){try{var c=\"string\"===typeof b.contentWindow.location.href}catch(d){c=!1}if(c)a=b.contentWindow;else break;b=Xa(a.document)}return b}function Ne(a){var b=a&&a.nodeName&&a.nodeName.toLowerCase();return b&&(\"input\"===b&&(\"text\"===a.type||\"search\"===a.type||\"tel\"===a.type||\"url\"===a.type||\"password\"===a.type)||\"textarea\"===b||\"true\"===a.contentEditable)}\nfunction Oe(a){var b=Me(),c=a.focusedElem,d=a.selectionRange;if(b!==c&&c&&c.ownerDocument&&Le(c.ownerDocument.documentElement,c)){if(null!==d&&Ne(c))if(b=d.start,a=d.end,void 0===a&&(a=b),\"selectionStart\"in c)c.selectionStart=b,c.selectionEnd=Math.min(a,c.value.length);else if(a=(b=c.ownerDocument||document)&&b.defaultView||window,a.getSelection){a=a.getSelection();var e=c.textContent.length,f=Math.min(d.start,e);d=void 0===d.end?f:Math.min(d.end,e);!a.extend&&f>d&&(e=d,d=f,f=e);e=Ke(c,f);var g=Ke(c,\nd);e&&g&&(1!==a.rangeCount||a.anchorNode!==e.node||a.anchorOffset!==e.offset||a.focusNode!==g.node||a.focusOffset!==g.offset)&&(b=b.createRange(),b.setStart(e.node,e.offset),a.removeAllRanges(),f>d?(a.addRange(b),a.extend(g.node,g.offset)):(b.setEnd(g.node,g.offset),a.addRange(b)))}b=[];for(a=c;a=a.parentNode;)1===a.nodeType&&b.push({element:a,left:a.scrollLeft,top:a.scrollTop});\"function\"===typeof c.focus&&c.focus();for(c=0;c=document.documentMode,Qe=null,Re=null,Se=null,Te=!1;\nfunction Ue(a,b,c){var d=c.window===c?c.document:9===c.nodeType?c:c.ownerDocument;Te||null==Qe||Qe!==Xa(d)||(d=Qe,\"selectionStart\"in d&&Ne(d)?d={start:d.selectionStart,end:d.selectionEnd}:(d=(d.ownerDocument&&d.ownerDocument.defaultView||window).getSelection(),d={anchorNode:d.anchorNode,anchorOffset:d.anchorOffset,focusNode:d.focusNode,focusOffset:d.focusOffset}),Se&&Ie(Se,d)||(Se=d,d=oe(Re,\"onSelect\"),0Tf||(a.current=Sf[Tf],Sf[Tf]=null,Tf--)}function G(a,b){Tf++;Sf[Tf]=a.current;a.current=b}var Vf={},H=Uf(Vf),Wf=Uf(!1),Xf=Vf;function Yf(a,b){var c=a.type.contextTypes;if(!c)return Vf;var d=a.stateNode;if(d&&d.__reactInternalMemoizedUnmaskedChildContext===b)return d.__reactInternalMemoizedMaskedChildContext;var e={},f;for(f in c)e[f]=b[f];d&&(a=a.stateNode,a.__reactInternalMemoizedUnmaskedChildContext=b,a.__reactInternalMemoizedMaskedChildContext=e);return e}\nfunction Zf(a){a=a.childContextTypes;return null!==a&&void 0!==a}function $f(){E(Wf);E(H)}function ag(a,b,c){if(H.current!==Vf)throw Error(p(168));G(H,b);G(Wf,c)}function bg(a,b,c){var d=a.stateNode;b=b.childContextTypes;if(\"function\"!==typeof d.getChildContext)return c;d=d.getChildContext();for(var e in d)if(!(e in b))throw Error(p(108,Ra(a)||\"Unknown\",e));return A({},c,d)}\nfunction cg(a){a=(a=a.stateNode)&&a.__reactInternalMemoizedMergedChildContext||Vf;Xf=H.current;G(H,a);G(Wf,Wf.current);return!0}function dg(a,b,c){var d=a.stateNode;if(!d)throw Error(p(169));c?(a=bg(a,b,Xf),d.__reactInternalMemoizedMergedChildContext=a,E(Wf),E(H),G(H,a)):E(Wf);G(Wf,c)}var eg=null,fg=!1,gg=!1;function hg(a){null===eg?eg=[a]:eg.push(a)}function ig(a){fg=!0;hg(a)}\nfunction jg(){if(!gg&&null!==eg){gg=!0;var a=0,b=C;try{var c=eg;for(C=1;a>=g;e-=g;rg=1<<32-oc(b)+e|c<w?(x=u,u=null):x=u.sibling;var n=r(e,u,h[w],k);if(null===n){null===u&&(u=x);break}a&&u&&null===n.alternate&&b(e,u);g=f(n,g,w);null===m?l=n:m.sibling=n;m=n;u=x}if(w===h.length)return c(e,u),I&&tg(e,w),l;if(null===u){for(;ww?(x=m,m=null):x=m.sibling;var t=r(e,m,n.value,k);if(null===t){null===m&&(m=x);break}a&&m&&null===t.alternate&&b(e,m);g=f(t,g,w);null===u?l=t:u.sibling=t;u=t;m=x}if(n.done)return c(e,\nm),I&&tg(e,w),l;if(null===m){for(;!n.done;w++,n=h.next())n=q(e,n.value,k),null!==n&&(g=f(n,g,w),null===u?l=n:u.sibling=n,u=n);I&&tg(e,w);return l}for(m=d(e,m);!n.done;w++,n=h.next())n=y(m,e,w,n.value,k),null!==n&&(a&&null!==n.alternate&&m.delete(null===n.key?w:n.key),g=f(n,g,w),null===u?l=n:u.sibling=n,u=n);a&&m.forEach(function(a){return b(e,a)});I&&tg(e,w);return l}function J(a,d,f,h){\"object\"===typeof f&&null!==f&&f.type===ya&&null===f.key&&(f=f.props.children);if(\"object\"===typeof f&&null!==f){switch(f.$$typeof){case va:a:{for(var k=\nf.key,l=d;null!==l;){if(l.key===k){k=f.type;if(k===ya){if(7===l.tag){c(a,l.sibling);d=e(l,f.props.children);d.return=a;a=d;break a}}else if(l.elementType===k||\"object\"===typeof k&&null!==k&&k.$$typeof===Ha&&uh(k)===l.type){c(a,l.sibling);d=e(l,f.props);d.ref=sh(a,l,f);d.return=a;a=d;break a}c(a,l);break}else b(a,l);l=l.sibling}f.type===ya?(d=Ah(f.props.children,a.mode,h,f.key),d.return=a,a=d):(h=yh(f.type,f.key,f.props,null,a.mode,h),h.ref=sh(a,d,f),h.return=a,a=h)}return g(a);case wa:a:{for(l=f.key;null!==\nd;){if(d.key===l)if(4===d.tag&&d.stateNode.containerInfo===f.containerInfo&&d.stateNode.implementation===f.implementation){c(a,d.sibling);d=e(d,f.children||[]);d.return=a;a=d;break a}else{c(a,d);break}else b(a,d);d=d.sibling}d=zh(f,a.mode,h);d.return=a;a=d}return g(a);case Ha:return l=f._init,J(a,d,l(f._payload),h)}if(eb(f))return n(a,d,f,h);if(Ka(f))return t(a,d,f,h);th(a,f)}return\"string\"===typeof f&&\"\"!==f||\"number\"===typeof f?(f=\"\"+f,null!==d&&6===d.tag?(c(a,d.sibling),d=e(d,f),d.return=a,a=d):\n(c(a,d),d=xh(f,a.mode,h),d.return=a,a=d),g(a)):c(a,d)}return J}var Bh=vh(!0),Ch=vh(!1),Dh={},Eh=Uf(Dh),Fh=Uf(Dh),Gh=Uf(Dh);function Hh(a){if(a===Dh)throw Error(p(174));return a}function Ih(a,b){G(Gh,b);G(Fh,a);G(Eh,Dh);a=b.nodeType;switch(a){case 9:case 11:b=(b=b.documentElement)?b.namespaceURI:lb(null,\"\");break;default:a=8===a?b.parentNode:b,b=a.namespaceURI||null,a=a.tagName,b=lb(b,a)}E(Eh);G(Eh,b)}function Jh(){E(Eh);E(Fh);E(Gh)}\nfunction Kh(a){Hh(Gh.current);var b=Hh(Eh.current);var c=lb(b,a.type);b!==c&&(G(Fh,a),G(Eh,c))}function Lh(a){Fh.current===a&&(E(Eh),E(Fh))}var M=Uf(0);\nfunction Mh(a){for(var b=a;null!==b;){if(13===b.tag){var c=b.memoizedState;if(null!==c&&(c=c.dehydrated,null===c||\"$?\"===c.data||\"$!\"===c.data))return b}else if(19===b.tag&&void 0!==b.memoizedProps.revealOrder){if(0!==(b.flags&128))return b}else if(null!==b.child){b.child.return=b;b=b.child;continue}if(b===a)break;for(;null===b.sibling;){if(null===b.return||b.return===a)return null;b=b.return}b.sibling.return=b.return;b=b.sibling}return null}var Nh=[];\nfunction Oh(){for(var a=0;ac?c:4;a(!0);var d=Qh.transition;Qh.transition={};try{a(!1),b()}finally{C=c,Qh.transition=d}}function Fi(){return di().memoizedState}\nfunction Gi(a,b,c){var d=lh(a);c={lane:d,action:c,hasEagerState:!1,eagerState:null,next:null};if(Hi(a))Ii(b,c);else if(c=Yg(a,b,c,d),null!==c){var e=L();mh(c,a,d,e);Ji(c,b,d)}}\nfunction ri(a,b,c){var d=lh(a),e={lane:d,action:c,hasEagerState:!1,eagerState:null,next:null};if(Hi(a))Ii(b,e);else{var f=a.alternate;if(0===a.lanes&&(null===f||0===f.lanes)&&(f=b.lastRenderedReducer,null!==f))try{var g=b.lastRenderedState,h=f(g,c);e.hasEagerState=!0;e.eagerState=h;if(He(h,g)){var k=b.interleaved;null===k?(e.next=e,Xg(b)):(e.next=k.next,k.next=e);b.interleaved=e;return}}catch(l){}finally{}c=Yg(a,b,e,d);null!==c&&(e=L(),mh(c,a,d,e),Ji(c,b,d))}}\nfunction Hi(a){var b=a.alternate;return a===N||null!==b&&b===N}function Ii(a,b){Th=Sh=!0;var c=a.pending;null===c?b.next=b:(b.next=c.next,c.next=b);a.pending=b}function Ji(a,b,c){if(0!==(c&4194240)){var d=b.lanes;d&=a.pendingLanes;c|=d;b.lanes=c;Cc(a,c)}}\nvar ai={readContext:Vg,useCallback:Q,useContext:Q,useEffect:Q,useImperativeHandle:Q,useInsertionEffect:Q,useLayoutEffect:Q,useMemo:Q,useReducer:Q,useRef:Q,useState:Q,useDebugValue:Q,useDeferredValue:Q,useTransition:Q,useMutableSource:Q,useSyncExternalStore:Q,useId:Q,unstable_isNewReconciler:!1},Yh={readContext:Vg,useCallback:function(a,b){ci().memoizedState=[a,void 0===b?null:b];return a},useContext:Vg,useEffect:vi,useImperativeHandle:function(a,b,c){c=null!==c&&void 0!==c?c.concat([a]):null;return ti(4194308,\n4,yi.bind(null,b,a),c)},useLayoutEffect:function(a,b){return ti(4194308,4,a,b)},useInsertionEffect:function(a,b){return ti(4,2,a,b)},useMemo:function(a,b){var c=ci();b=void 0===b?null:b;a=a();c.memoizedState=[a,b];return a},useReducer:function(a,b,c){var d=ci();b=void 0!==c?c(b):b;d.memoizedState=d.baseState=b;a={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:a,lastRenderedState:b};d.queue=a;a=a.dispatch=Gi.bind(null,N,a);return[d.memoizedState,a]},useRef:function(a){var b=\nci();a={current:a};return b.memoizedState=a},useState:qi,useDebugValue:Ai,useDeferredValue:function(a){return ci().memoizedState=a},useTransition:function(){var a=qi(!1),b=a[0];a=Ei.bind(null,a[1]);ci().memoizedState=a;return[b,a]},useMutableSource:function(){},useSyncExternalStore:function(a,b,c){var d=N,e=ci();if(I){if(void 0===c)throw Error(p(407));c=c()}else{c=b();if(null===R)throw Error(p(349));0!==(Rh&30)||ni(d,b,c)}e.memoizedState=c;var f={value:c,getSnapshot:b};e.queue=f;vi(ki.bind(null,d,\nf,a),[a]);d.flags|=2048;li(9,mi.bind(null,d,f,c,b),void 0,null);return c},useId:function(){var a=ci(),b=R.identifierPrefix;if(I){var c=sg;var d=rg;c=(d&~(1<<32-oc(d)-1)).toString(32)+c;b=\":\"+b+\"R\"+c;c=Uh++;0\\x3c/script>\",a=a.removeChild(a.firstChild)):\n\"string\"===typeof d.is?a=g.createElement(c,{is:d.is}):(a=g.createElement(c),\"select\"===c&&(g=a,d.multiple?g.multiple=!0:d.size&&(g.size=d.size))):a=g.createElementNS(a,c);a[Of]=b;a[Pf]=d;Aj(a,b,!1,!1);b.stateNode=a;a:{g=vb(c,d);switch(c){case \"dialog\":D(\"cancel\",a);D(\"close\",a);e=d;break;case \"iframe\":case \"object\":case \"embed\":D(\"load\",a);e=d;break;case \"video\":case \"audio\":for(e=0;eHj&&(b.flags|=128,d=!0,Ej(f,!1),b.lanes=4194304)}else{if(!d)if(a=Mh(g),null!==a){if(b.flags|=128,d=!0,c=a.updateQueue,null!==c&&(b.updateQueue=c,b.flags|=4),Ej(f,!0),null===f.tail&&\"hidden\"===f.tailMode&&!g.alternate&&!I)return S(b),null}else 2*B()-f.renderingStartTime>Hj&&1073741824!==c&&(b.flags|=128,d=!0,Ej(f,!1),b.lanes=4194304);f.isBackwards?(g.sibling=b.child,b.child=g):(c=f.last,null!==c?c.sibling=g:b.child=g,f.last=g)}if(null!==f.tail)return b=f.tail,f.rendering=\nb,f.tail=b.sibling,f.renderingStartTime=B(),b.sibling=null,c=M.current,G(M,d?c&1|2:c&1),b;S(b);return null;case 22:case 23:return Ij(),d=null!==b.memoizedState,null!==a&&null!==a.memoizedState!==d&&(b.flags|=8192),d&&0!==(b.mode&1)?0!==(gj&1073741824)&&(S(b),b.subtreeFlags&6&&(b.flags|=8192)):S(b),null;case 24:return null;case 25:return null}throw Error(p(156,b.tag));}\nfunction Jj(a,b){wg(b);switch(b.tag){case 1:return Zf(b.type)&&$f(),a=b.flags,a&65536?(b.flags=a&-65537|128,b):null;case 3:return Jh(),E(Wf),E(H),Oh(),a=b.flags,0!==(a&65536)&&0===(a&128)?(b.flags=a&-65537|128,b):null;case 5:return Lh(b),null;case 13:E(M);a=b.memoizedState;if(null!==a&&null!==a.dehydrated){if(null===b.alternate)throw Error(p(340));Ig()}a=b.flags;return a&65536?(b.flags=a&-65537|128,b):null;case 19:return E(M),null;case 4:return Jh(),null;case 10:return Rg(b.type._context),null;case 22:case 23:return Ij(),\nnull;case 24:return null;default:return null}}var Kj=!1,U=!1,Lj=\"function\"===typeof WeakSet?WeakSet:Set,V=null;function Mj(a,b){var c=a.ref;if(null!==c)if(\"function\"===typeof c)try{c(null)}catch(d){W(a,b,d)}else c.current=null}function Nj(a,b,c){try{c()}catch(d){W(a,b,d)}}var Oj=!1;\nfunction Pj(a,b){Cf=dd;a=Me();if(Ne(a)){if(\"selectionStart\"in a)var c={start:a.selectionStart,end:a.selectionEnd};else a:{c=(c=a.ownerDocument)&&c.defaultView||window;var d=c.getSelection&&c.getSelection();if(d&&0!==d.rangeCount){c=d.anchorNode;var e=d.anchorOffset,f=d.focusNode;d=d.focusOffset;try{c.nodeType,f.nodeType}catch(F){c=null;break a}var g=0,h=-1,k=-1,l=0,m=0,q=a,r=null;b:for(;;){for(var y;;){q!==c||0!==e&&3!==q.nodeType||(h=g+e);q!==f||0!==d&&3!==q.nodeType||(k=g+d);3===q.nodeType&&(g+=\nq.nodeValue.length);if(null===(y=q.firstChild))break;r=q;q=y}for(;;){if(q===a)break b;r===c&&++l===e&&(h=g);r===f&&++m===d&&(k=g);if(null!==(y=q.nextSibling))break;q=r;r=q.parentNode}q=y}c=-1===h||-1===k?null:{start:h,end:k}}else c=null}c=c||{start:0,end:0}}else c=null;Df={focusedElem:a,selectionRange:c};dd=!1;for(V=b;null!==V;)if(b=V,a=b.child,0!==(b.subtreeFlags&1028)&&null!==a)a.return=b,V=a;else for(;null!==V;){b=V;try{var n=b.alternate;if(0!==(b.flags&1024))switch(b.tag){case 0:case 11:case 15:break;\ncase 1:if(null!==n){var t=n.memoizedProps,J=n.memoizedState,x=b.stateNode,w=x.getSnapshotBeforeUpdate(b.elementType===b.type?t:Lg(b.type,t),J);x.__reactInternalSnapshotBeforeUpdate=w}break;case 3:var u=b.stateNode.containerInfo;1===u.nodeType?u.textContent=\"\":9===u.nodeType&&u.documentElement&&u.removeChild(u.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(p(163));}}catch(F){W(b,b.return,F)}a=b.sibling;if(null!==a){a.return=b.return;V=a;break}V=b.return}n=Oj;Oj=!1;return n}\nfunction Qj(a,b,c){var d=b.updateQueue;d=null!==d?d.lastEffect:null;if(null!==d){var e=d=d.next;do{if((e.tag&a)===a){var f=e.destroy;e.destroy=void 0;void 0!==f&&Nj(b,c,f)}e=e.next}while(e!==d)}}function Rj(a,b){b=b.updateQueue;b=null!==b?b.lastEffect:null;if(null!==b){var c=b=b.next;do{if((c.tag&a)===a){var d=c.create;c.destroy=d()}c=c.next}while(c!==b)}}function Sj(a){var b=a.ref;if(null!==b){var c=a.stateNode;switch(a.tag){case 5:a=c;break;default:a=c}\"function\"===typeof b?b(a):b.current=a}}\nfunction Tj(a){var b=a.alternate;null!==b&&(a.alternate=null,Tj(b));a.child=null;a.deletions=null;a.sibling=null;5===a.tag&&(b=a.stateNode,null!==b&&(delete b[Of],delete b[Pf],delete b[of],delete b[Qf],delete b[Rf]));a.stateNode=null;a.return=null;a.dependencies=null;a.memoizedProps=null;a.memoizedState=null;a.pendingProps=null;a.stateNode=null;a.updateQueue=null}function Uj(a){return 5===a.tag||3===a.tag||4===a.tag}\nfunction Vj(a){a:for(;;){for(;null===a.sibling;){if(null===a.return||Uj(a.return))return null;a=a.return}a.sibling.return=a.return;for(a=a.sibling;5!==a.tag&&6!==a.tag&&18!==a.tag;){if(a.flags&2)continue a;if(null===a.child||4===a.tag)continue a;else a.child.return=a,a=a.child}if(!(a.flags&2))return a.stateNode}}\nfunction Wj(a,b,c){var d=a.tag;if(5===d||6===d)a=a.stateNode,b?8===c.nodeType?c.parentNode.insertBefore(a,b):c.insertBefore(a,b):(8===c.nodeType?(b=c.parentNode,b.insertBefore(a,c)):(b=c,b.appendChild(a)),c=c._reactRootContainer,null!==c&&void 0!==c||null!==b.onclick||(b.onclick=Bf));else if(4!==d&&(a=a.child,null!==a))for(Wj(a,b,c),a=a.sibling;null!==a;)Wj(a,b,c),a=a.sibling}\nfunction Xj(a,b,c){var d=a.tag;if(5===d||6===d)a=a.stateNode,b?c.insertBefore(a,b):c.appendChild(a);else if(4!==d&&(a=a.child,null!==a))for(Xj(a,b,c),a=a.sibling;null!==a;)Xj(a,b,c),a=a.sibling}var X=null,Yj=!1;function Zj(a,b,c){for(c=c.child;null!==c;)ak(a,b,c),c=c.sibling}\nfunction ak(a,b,c){if(lc&&\"function\"===typeof lc.onCommitFiberUnmount)try{lc.onCommitFiberUnmount(kc,c)}catch(h){}switch(c.tag){case 5:U||Mj(c,b);case 6:var d=X,e=Yj;X=null;Zj(a,b,c);X=d;Yj=e;null!==X&&(Yj?(a=X,c=c.stateNode,8===a.nodeType?a.parentNode.removeChild(c):a.removeChild(c)):X.removeChild(c.stateNode));break;case 18:null!==X&&(Yj?(a=X,c=c.stateNode,8===a.nodeType?Kf(a.parentNode,c):1===a.nodeType&&Kf(a,c),bd(a)):Kf(X,c.stateNode));break;case 4:d=X;e=Yj;X=c.stateNode.containerInfo;Yj=!0;\nZj(a,b,c);X=d;Yj=e;break;case 0:case 11:case 14:case 15:if(!U&&(d=c.updateQueue,null!==d&&(d=d.lastEffect,null!==d))){e=d=d.next;do{var f=e,g=f.destroy;f=f.tag;void 0!==g&&(0!==(f&2)?Nj(c,b,g):0!==(f&4)&&Nj(c,b,g));e=e.next}while(e!==d)}Zj(a,b,c);break;case 1:if(!U&&(Mj(c,b),d=c.stateNode,\"function\"===typeof d.componentWillUnmount))try{d.props=c.memoizedProps,d.state=c.memoizedState,d.componentWillUnmount()}catch(h){W(c,b,h)}Zj(a,b,c);break;case 21:Zj(a,b,c);break;case 22:c.mode&1?(U=(d=U)||null!==\nc.memoizedState,Zj(a,b,c),U=d):Zj(a,b,c);break;default:Zj(a,b,c)}}function bk(a){var b=a.updateQueue;if(null!==b){a.updateQueue=null;var c=a.stateNode;null===c&&(c=a.stateNode=new Lj);b.forEach(function(b){var d=ck.bind(null,a,b);c.has(b)||(c.add(b),b.then(d,d))})}}\nfunction dk(a,b){var c=b.deletions;if(null!==c)for(var d=0;de&&(e=g);d&=~f}d=e;d=B()-d;d=(120>d?120:480>d?480:1080>d?1080:1920>d?1920:3E3>d?3E3:4320>d?4320:1960*mk(d/1960))-d;if(10a?16:a;if(null===xk)var d=!1;else{a=xk;xk=null;yk=0;if(0!==(K&6))throw Error(p(331));var e=K;K|=4;for(V=a.current;null!==V;){var f=V,g=f.child;if(0!==(V.flags&16)){var h=f.deletions;if(null!==h){for(var k=0;kB()-gk?Lk(a,0):sk|=c);Ek(a,b)}function Zk(a,b){0===b&&(0===(a.mode&1)?b=1:(b=sc,sc<<=1,0===(sc&130023424)&&(sc=4194304)));var c=L();a=Zg(a,b);null!==a&&(Ac(a,b,c),Ek(a,c))}function vj(a){var b=a.memoizedState,c=0;null!==b&&(c=b.retryLane);Zk(a,c)}\nfunction ck(a,b){var c=0;switch(a.tag){case 13:var d=a.stateNode;var e=a.memoizedState;null!==e&&(c=e.retryLane);break;case 19:d=a.stateNode;break;default:throw Error(p(314));}null!==d&&d.delete(b);Zk(a,c)}var Wk;\nWk=function(a,b,c){if(null!==a)if(a.memoizedProps!==b.pendingProps||Wf.current)Ug=!0;else{if(0===(a.lanes&c)&&0===(b.flags&128))return Ug=!1,zj(a,b,c);Ug=0!==(a.flags&131072)?!0:!1}else Ug=!1,I&&0!==(b.flags&1048576)&&ug(b,ng,b.index);b.lanes=0;switch(b.tag){case 2:var d=b.type;jj(a,b);a=b.pendingProps;var e=Yf(b,H.current);Tg(b,c);e=Xh(null,b,d,a,e,c);var f=bi();b.flags|=1;\"object\"===typeof e&&null!==e&&\"function\"===typeof e.render&&void 0===e.$$typeof?(b.tag=1,b.memoizedState=null,b.updateQueue=\nnull,Zf(d)?(f=!0,cg(b)):f=!1,b.memoizedState=null!==e.state&&void 0!==e.state?e.state:null,ah(b),e.updater=nh,b.stateNode=e,e._reactInternals=b,rh(b,d,a,c),b=kj(null,b,d,!0,f,c)):(b.tag=0,I&&f&&vg(b),Yi(null,b,e,c),b=b.child);return b;case 16:d=b.elementType;a:{jj(a,b);a=b.pendingProps;e=d._init;d=e(d._payload);b.type=d;e=b.tag=$k(d);a=Lg(d,a);switch(e){case 0:b=dj(null,b,d,a,c);break a;case 1:b=ij(null,b,d,a,c);break a;case 11:b=Zi(null,b,d,a,c);break a;case 14:b=aj(null,b,d,Lg(d.type,a),c);break a}throw Error(p(306,\nd,\"\"));}return b;case 0:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Lg(d,e),dj(a,b,d,e,c);case 1:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Lg(d,e),ij(a,b,d,e,c);case 3:a:{lj(b);if(null===a)throw Error(p(387));d=b.pendingProps;f=b.memoizedState;e=f.element;bh(a,b);gh(b,d,null,c);var g=b.memoizedState;d=g.element;if(f.isDehydrated)if(f={element:d,isDehydrated:!1,cache:g.cache,pendingSuspenseBoundaries:g.pendingSuspenseBoundaries,transitions:g.transitions},b.updateQueue.baseState=\nf,b.memoizedState=f,b.flags&256){e=Ki(Error(p(423)),b);b=mj(a,b,d,c,e);break a}else if(d!==e){e=Ki(Error(p(424)),b);b=mj(a,b,d,c,e);break a}else for(yg=Lf(b.stateNode.containerInfo.firstChild),xg=b,I=!0,zg=null,c=Ch(b,null,d,c),b.child=c;c;)c.flags=c.flags&-3|4096,c=c.sibling;else{Ig();if(d===e){b=$i(a,b,c);break a}Yi(a,b,d,c)}b=b.child}return b;case 5:return Kh(b),null===a&&Eg(b),d=b.type,e=b.pendingProps,f=null!==a?a.memoizedProps:null,g=e.children,Ef(d,e)?g=null:null!==f&&Ef(d,f)&&(b.flags|=32),\nhj(a,b),Yi(a,b,g,c),b.child;case 6:return null===a&&Eg(b),null;case 13:return pj(a,b,c);case 4:return Ih(b,b.stateNode.containerInfo),d=b.pendingProps,null===a?b.child=Bh(b,null,d,c):Yi(a,b,d,c),b.child;case 11:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Lg(d,e),Zi(a,b,d,e,c);case 7:return Yi(a,b,b.pendingProps,c),b.child;case 8:return Yi(a,b,b.pendingProps.children,c),b.child;case 12:return Yi(a,b,b.pendingProps.children,c),b.child;case 10:a:{d=b.type._context;e=b.pendingProps;f=b.memoizedProps;\ng=e.value;G(Mg,d._currentValue);d._currentValue=g;if(null!==f)if(He(f.value,g)){if(f.children===e.children&&!Wf.current){b=$i(a,b,c);break a}}else for(f=b.child,null!==f&&(f.return=b);null!==f;){var h=f.dependencies;if(null!==h){g=f.child;for(var k=h.firstContext;null!==k;){if(k.context===d){if(1===f.tag){k=ch(-1,c&-c);k.tag=2;var l=f.updateQueue;if(null!==l){l=l.shared;var m=l.pending;null===m?k.next=k:(k.next=m.next,m.next=k);l.pending=k}}f.lanes|=c;k=f.alternate;null!==k&&(k.lanes|=c);Sg(f.return,\nc,b);h.lanes|=c;break}k=k.next}}else if(10===f.tag)g=f.type===b.type?null:f.child;else if(18===f.tag){g=f.return;if(null===g)throw Error(p(341));g.lanes|=c;h=g.alternate;null!==h&&(h.lanes|=c);Sg(g,c,b);g=f.sibling}else g=f.child;if(null!==g)g.return=f;else for(g=f;null!==g;){if(g===b){g=null;break}f=g.sibling;if(null!==f){f.return=g.return;g=f;break}g=g.return}f=g}Yi(a,b,e.children,c);b=b.child}return b;case 9:return e=b.type,d=b.pendingProps.children,Tg(b,c),e=Vg(e),d=d(e),b.flags|=1,Yi(a,b,d,c),\nb.child;case 14:return d=b.type,e=Lg(d,b.pendingProps),e=Lg(d.type,e),aj(a,b,d,e,c);case 15:return cj(a,b,b.type,b.pendingProps,c);case 17:return d=b.type,e=b.pendingProps,e=b.elementType===d?e:Lg(d,e),jj(a,b),b.tag=1,Zf(d)?(a=!0,cg(b)):a=!1,Tg(b,c),ph(b,d,e),rh(b,d,e,c),kj(null,b,d,!0,a,c);case 19:return yj(a,b,c);case 22:return ej(a,b,c)}throw Error(p(156,b.tag));};function Gk(a,b){return ac(a,b)}\nfunction al(a,b,c,d){this.tag=a;this.key=c;this.sibling=this.child=this.return=this.stateNode=this.type=this.elementType=null;this.index=0;this.ref=null;this.pendingProps=b;this.dependencies=this.memoizedState=this.updateQueue=this.memoizedProps=null;this.mode=d;this.subtreeFlags=this.flags=0;this.deletions=null;this.childLanes=this.lanes=0;this.alternate=null}function Bg(a,b,c,d){return new al(a,b,c,d)}function bj(a){a=a.prototype;return!(!a||!a.isReactComponent)}\nfunction $k(a){if(\"function\"===typeof a)return bj(a)?1:0;if(void 0!==a&&null!==a){a=a.$$typeof;if(a===Da)return 11;if(a===Ga)return 14}return 2}\nfunction wh(a,b){var c=a.alternate;null===c?(c=Bg(a.tag,b,a.key,a.mode),c.elementType=a.elementType,c.type=a.type,c.stateNode=a.stateNode,c.alternate=a,a.alternate=c):(c.pendingProps=b,c.type=a.type,c.flags=0,c.subtreeFlags=0,c.deletions=null);c.flags=a.flags&14680064;c.childLanes=a.childLanes;c.lanes=a.lanes;c.child=a.child;c.memoizedProps=a.memoizedProps;c.memoizedState=a.memoizedState;c.updateQueue=a.updateQueue;b=a.dependencies;c.dependencies=null===b?null:{lanes:b.lanes,firstContext:b.firstContext};\nc.sibling=a.sibling;c.index=a.index;c.ref=a.ref;return c}\nfunction yh(a,b,c,d,e,f){var g=2;d=a;if(\"function\"===typeof a)bj(a)&&(g=1);else if(\"string\"===typeof a)g=5;else a:switch(a){case ya:return Ah(c.children,e,f,b);case za:g=8;e|=8;break;case Aa:return a=Bg(12,c,b,e|2),a.elementType=Aa,a.lanes=f,a;case Ea:return a=Bg(13,c,b,e),a.elementType=Ea,a.lanes=f,a;case Fa:return a=Bg(19,c,b,e),a.elementType=Fa,a.lanes=f,a;case Ia:return qj(c,e,f,b);default:if(\"object\"===typeof a&&null!==a)switch(a.$$typeof){case Ba:g=10;break a;case Ca:g=9;break a;case Da:g=11;\nbreak a;case Ga:g=14;break a;case Ha:g=16;d=null;break a}throw Error(p(130,null==a?a:typeof a,\"\"));}b=Bg(g,c,b,e);b.elementType=a;b.type=d;b.lanes=f;return b}function Ah(a,b,c,d){a=Bg(7,a,d,b);a.lanes=c;return a}function qj(a,b,c,d){a=Bg(22,a,d,b);a.elementType=Ia;a.lanes=c;a.stateNode={isHidden:!1};return a}function xh(a,b,c){a=Bg(6,a,null,b);a.lanes=c;return a}\nfunction zh(a,b,c){b=Bg(4,null!==a.children?a.children:[],a.key,b);b.lanes=c;b.stateNode={containerInfo:a.containerInfo,pendingChildren:null,implementation:a.implementation};return b}\nfunction bl(a,b,c,d,e){this.tag=b;this.containerInfo=a;this.finishedWork=this.pingCache=this.current=this.pendingChildren=null;this.timeoutHandle=-1;this.callbackNode=this.pendingContext=this.context=null;this.callbackPriority=0;this.eventTimes=zc(0);this.expirationTimes=zc(-1);this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0;this.entanglements=zc(0);this.identifierPrefix=d;this.onRecoverableError=e;this.mutableSourceEagerHydrationData=\nnull}function cl(a,b,c,d,e,f,g,h,k){a=new bl(a,b,c,h,k);1===b?(b=1,!0===f&&(b|=8)):b=0;f=Bg(3,null,null,b);a.current=f;f.stateNode=a;f.memoizedState={element:d,isDehydrated:c,cache:null,transitions:null,pendingSuspenseBoundaries:null};ah(f);return a}function dl(a,b,c){var d=3 0 ? this.queries.filter(function (query) {\n return matchQuery(filters, query);\n }) : this.queries;\n };\n\n _proto.notify = function notify(event) {\n var _this3 = this;\n\n notifyManager.batch(function () {\n _this3.listeners.forEach(function (listener) {\n listener(event);\n });\n });\n };\n\n _proto.onFocus = function onFocus() {\n var _this4 = this;\n\n notifyManager.batch(function () {\n _this4.queries.forEach(function (query) {\n query.onFocus();\n });\n });\n };\n\n _proto.onOnline = function onOnline() {\n var _this5 = this;\n\n notifyManager.batch(function () {\n _this5.queries.forEach(function (query) {\n query.onOnline();\n });\n });\n };\n\n return QueryCache;\n}(Subscribable);","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport { getLogger } from './logger';\nimport { notifyManager } from './notifyManager';\nimport { Retryer } from './retryer';\nimport { noop } from './utils'; // TYPES\n\n// CLASS\nexport var Mutation = /*#__PURE__*/function () {\n function Mutation(config) {\n this.options = _extends({}, config.defaultOptions, config.options);\n this.mutationId = config.mutationId;\n this.mutationCache = config.mutationCache;\n this.observers = [];\n this.state = config.state || getDefaultState();\n this.meta = config.meta;\n }\n\n var _proto = Mutation.prototype;\n\n _proto.setState = function setState(state) {\n this.dispatch({\n type: 'setState',\n state: state\n });\n };\n\n _proto.addObserver = function addObserver(observer) {\n if (this.observers.indexOf(observer) === -1) {\n this.observers.push(observer);\n }\n };\n\n _proto.removeObserver = function removeObserver(observer) {\n this.observers = this.observers.filter(function (x) {\n return x !== observer;\n });\n };\n\n _proto.cancel = function cancel() {\n if (this.retryer) {\n this.retryer.cancel();\n return this.retryer.promise.then(noop).catch(noop);\n }\n\n return Promise.resolve();\n };\n\n _proto.continue = function _continue() {\n if (this.retryer) {\n this.retryer.continue();\n return this.retryer.promise;\n }\n\n return this.execute();\n };\n\n _proto.execute = function execute() {\n var _this = this;\n\n var data;\n var restored = this.state.status === 'loading';\n var promise = Promise.resolve();\n\n if (!restored) {\n this.dispatch({\n type: 'loading',\n variables: this.options.variables\n });\n promise = promise.then(function () {\n // Notify cache callback\n _this.mutationCache.config.onMutate == null ? void 0 : _this.mutationCache.config.onMutate(_this.state.variables, _this);\n }).then(function () {\n return _this.options.onMutate == null ? void 0 : _this.options.onMutate(_this.state.variables);\n }).then(function (context) {\n if (context !== _this.state.context) {\n _this.dispatch({\n type: 'loading',\n context: context,\n variables: _this.state.variables\n });\n }\n });\n }\n\n return promise.then(function () {\n return _this.executeMutation();\n }).then(function (result) {\n data = result; // Notify cache callback\n\n _this.mutationCache.config.onSuccess == null ? void 0 : _this.mutationCache.config.onSuccess(data, _this.state.variables, _this.state.context, _this);\n }).then(function () {\n return _this.options.onSuccess == null ? void 0 : _this.options.onSuccess(data, _this.state.variables, _this.state.context);\n }).then(function () {\n return _this.options.onSettled == null ? void 0 : _this.options.onSettled(data, null, _this.state.variables, _this.state.context);\n }).then(function () {\n _this.dispatch({\n type: 'success',\n data: data\n });\n\n return data;\n }).catch(function (error) {\n // Notify cache callback\n _this.mutationCache.config.onError == null ? void 0 : _this.mutationCache.config.onError(error, _this.state.variables, _this.state.context, _this); // Log error\n\n getLogger().error(error);\n return Promise.resolve().then(function () {\n return _this.options.onError == null ? void 0 : _this.options.onError(error, _this.state.variables, _this.state.context);\n }).then(function () {\n return _this.options.onSettled == null ? void 0 : _this.options.onSettled(undefined, error, _this.state.variables, _this.state.context);\n }).then(function () {\n _this.dispatch({\n type: 'error',\n error: error\n });\n\n throw error;\n });\n });\n };\n\n _proto.executeMutation = function executeMutation() {\n var _this2 = this,\n _this$options$retry;\n\n this.retryer = new Retryer({\n fn: function fn() {\n if (!_this2.options.mutationFn) {\n return Promise.reject('No mutationFn found');\n }\n\n return _this2.options.mutationFn(_this2.state.variables);\n },\n onFail: function onFail() {\n _this2.dispatch({\n type: 'failed'\n });\n },\n onPause: function onPause() {\n _this2.dispatch({\n type: 'pause'\n });\n },\n onContinue: function onContinue() {\n _this2.dispatch({\n type: 'continue'\n });\n },\n retry: (_this$options$retry = this.options.retry) != null ? _this$options$retry : 0,\n retryDelay: this.options.retryDelay\n });\n return this.retryer.promise;\n };\n\n _proto.dispatch = function dispatch(action) {\n var _this3 = this;\n\n this.state = reducer(this.state, action);\n notifyManager.batch(function () {\n _this3.observers.forEach(function (observer) {\n observer.onMutationUpdate(action);\n });\n\n _this3.mutationCache.notify(_this3);\n });\n };\n\n return Mutation;\n}();\nexport function getDefaultState() {\n return {\n context: undefined,\n data: undefined,\n error: null,\n failureCount: 0,\n isPaused: false,\n status: 'idle',\n variables: undefined\n };\n}\n\nfunction reducer(state, action) {\n switch (action.type) {\n case 'failed':\n return _extends({}, state, {\n failureCount: state.failureCount + 1\n });\n\n case 'pause':\n return _extends({}, state, {\n isPaused: true\n });\n\n case 'continue':\n return _extends({}, state, {\n isPaused: false\n });\n\n case 'loading':\n return _extends({}, state, {\n context: action.context,\n data: undefined,\n error: null,\n isPaused: false,\n status: 'loading',\n variables: action.variables\n });\n\n case 'success':\n return _extends({}, state, {\n data: action.data,\n error: null,\n status: 'success',\n isPaused: false\n });\n\n case 'error':\n return _extends({}, state, {\n data: undefined,\n error: action.error,\n failureCount: state.failureCount + 1,\n isPaused: false,\n status: 'error'\n });\n\n case 'setState':\n return _extends({}, state, action.state);\n\n default:\n return state;\n }\n}","import _inheritsLoose from \"@babel/runtime/helpers/esm/inheritsLoose\";\nimport { notifyManager } from './notifyManager';\nimport { Mutation } from './mutation';\nimport { matchMutation, noop } from './utils';\nimport { Subscribable } from './subscribable'; // TYPES\n\n// CLASS\nexport var MutationCache = /*#__PURE__*/function (_Subscribable) {\n _inheritsLoose(MutationCache, _Subscribable);\n\n function MutationCache(config) {\n var _this;\n\n _this = _Subscribable.call(this) || this;\n _this.config = config || {};\n _this.mutations = [];\n _this.mutationId = 0;\n return _this;\n }\n\n var _proto = MutationCache.prototype;\n\n _proto.build = function build(client, options, state) {\n var mutation = new Mutation({\n mutationCache: this,\n mutationId: ++this.mutationId,\n options: client.defaultMutationOptions(options),\n state: state,\n defaultOptions: options.mutationKey ? client.getMutationDefaults(options.mutationKey) : undefined,\n meta: options.meta\n });\n this.add(mutation);\n return mutation;\n };\n\n _proto.add = function add(mutation) {\n this.mutations.push(mutation);\n this.notify(mutation);\n };\n\n _proto.remove = function remove(mutation) {\n this.mutations = this.mutations.filter(function (x) {\n return x !== mutation;\n });\n mutation.cancel();\n this.notify(mutation);\n };\n\n _proto.clear = function clear() {\n var _this2 = this;\n\n notifyManager.batch(function () {\n _this2.mutations.forEach(function (mutation) {\n _this2.remove(mutation);\n });\n });\n };\n\n _proto.getAll = function getAll() {\n return this.mutations;\n };\n\n _proto.find = function find(filters) {\n if (typeof filters.exact === 'undefined') {\n filters.exact = true;\n }\n\n return this.mutations.find(function (mutation) {\n return matchMutation(filters, mutation);\n });\n };\n\n _proto.findAll = function findAll(filters) {\n return this.mutations.filter(function (mutation) {\n return matchMutation(filters, mutation);\n });\n };\n\n _proto.notify = function notify(mutation) {\n var _this3 = this;\n\n notifyManager.batch(function () {\n _this3.listeners.forEach(function (listener) {\n listener(mutation);\n });\n });\n };\n\n _proto.onFocus = function onFocus() {\n this.resumePausedMutations();\n };\n\n _proto.onOnline = function onOnline() {\n this.resumePausedMutations();\n };\n\n _proto.resumePausedMutations = function resumePausedMutations() {\n var pausedMutations = this.mutations.filter(function (x) {\n return x.state.isPaused;\n });\n return notifyManager.batch(function () {\n return pausedMutations.reduce(function (promise, mutation) {\n return promise.then(function () {\n return mutation.continue().catch(noop);\n });\n }, Promise.resolve());\n });\n };\n\n return MutationCache;\n}(Subscribable);","import { isCancelable } from './retryer';\nimport { getAbortController } from './utils';\nexport function infiniteQueryBehavior() {\n return {\n onFetch: function onFetch(context) {\n context.fetchFn = function () {\n var _context$fetchOptions, _context$fetchOptions2, _context$fetchOptions3, _context$fetchOptions4, _context$state$data, _context$state$data2;\n\n var refetchPage = (_context$fetchOptions = context.fetchOptions) == null ? void 0 : (_context$fetchOptions2 = _context$fetchOptions.meta) == null ? void 0 : _context$fetchOptions2.refetchPage;\n var fetchMore = (_context$fetchOptions3 = context.fetchOptions) == null ? void 0 : (_context$fetchOptions4 = _context$fetchOptions3.meta) == null ? void 0 : _context$fetchOptions4.fetchMore;\n var pageParam = fetchMore == null ? void 0 : fetchMore.pageParam;\n var isFetchingNextPage = (fetchMore == null ? void 0 : fetchMore.direction) === 'forward';\n var isFetchingPreviousPage = (fetchMore == null ? void 0 : fetchMore.direction) === 'backward';\n var oldPages = ((_context$state$data = context.state.data) == null ? void 0 : _context$state$data.pages) || [];\n var oldPageParams = ((_context$state$data2 = context.state.data) == null ? void 0 : _context$state$data2.pageParams) || [];\n var abortController = getAbortController();\n var abortSignal = abortController == null ? void 0 : abortController.signal;\n var newPageParams = oldPageParams;\n var cancelled = false; // Get query function\n\n var queryFn = context.options.queryFn || function () {\n return Promise.reject('Missing queryFn');\n };\n\n var buildNewPages = function buildNewPages(pages, param, page, previous) {\n newPageParams = previous ? [param].concat(newPageParams) : [].concat(newPageParams, [param]);\n return previous ? [page].concat(pages) : [].concat(pages, [page]);\n }; // Create function to fetch a page\n\n\n var fetchPage = function fetchPage(pages, manual, param, previous) {\n if (cancelled) {\n return Promise.reject('Cancelled');\n }\n\n if (typeof param === 'undefined' && !manual && pages.length) {\n return Promise.resolve(pages);\n }\n\n var queryFnContext = {\n queryKey: context.queryKey,\n signal: abortSignal,\n pageParam: param,\n meta: context.meta\n };\n var queryFnResult = queryFn(queryFnContext);\n var promise = Promise.resolve(queryFnResult).then(function (page) {\n return buildNewPages(pages, param, page, previous);\n });\n\n if (isCancelable(queryFnResult)) {\n var promiseAsAny = promise;\n promiseAsAny.cancel = queryFnResult.cancel;\n }\n\n return promise;\n };\n\n var promise; // Fetch first page?\n\n if (!oldPages.length) {\n promise = fetchPage([]);\n } // Fetch next page?\n else if (isFetchingNextPage) {\n var manual = typeof pageParam !== 'undefined';\n var param = manual ? pageParam : getNextPageParam(context.options, oldPages);\n promise = fetchPage(oldPages, manual, param);\n } // Fetch previous page?\n else if (isFetchingPreviousPage) {\n var _manual = typeof pageParam !== 'undefined';\n\n var _param = _manual ? pageParam : getPreviousPageParam(context.options, oldPages);\n\n promise = fetchPage(oldPages, _manual, _param, true);\n } // Refetch pages\n else {\n (function () {\n newPageParams = [];\n var manual = typeof context.options.getNextPageParam === 'undefined';\n var shouldFetchFirstPage = refetchPage && oldPages[0] ? refetchPage(oldPages[0], 0, oldPages) : true; // Fetch first page\n\n promise = shouldFetchFirstPage ? fetchPage([], manual, oldPageParams[0]) : Promise.resolve(buildNewPages([], oldPageParams[0], oldPages[0])); // Fetch remaining pages\n\n var _loop = function _loop(i) {\n promise = promise.then(function (pages) {\n var shouldFetchNextPage = refetchPage && oldPages[i] ? refetchPage(oldPages[i], i, oldPages) : true;\n\n if (shouldFetchNextPage) {\n var _param2 = manual ? oldPageParams[i] : getNextPageParam(context.options, pages);\n\n return fetchPage(pages, manual, _param2);\n }\n\n return Promise.resolve(buildNewPages(pages, oldPageParams[i], oldPages[i]));\n });\n };\n\n for (var i = 1; i < oldPages.length; i++) {\n _loop(i);\n }\n })();\n }\n\n var finalPromise = promise.then(function (pages) {\n return {\n pages: pages,\n pageParams: newPageParams\n };\n });\n var finalPromiseAsAny = finalPromise;\n\n finalPromiseAsAny.cancel = function () {\n cancelled = true;\n abortController == null ? void 0 : abortController.abort();\n\n if (isCancelable(promise)) {\n promise.cancel();\n }\n };\n\n return finalPromise;\n };\n }\n };\n}\nexport function getNextPageParam(options, pages) {\n return options.getNextPageParam == null ? void 0 : options.getNextPageParam(pages[pages.length - 1], pages);\n}\nexport function getPreviousPageParam(options, pages) {\n return options.getPreviousPageParam == null ? void 0 : options.getPreviousPageParam(pages[0], pages);\n}\n/**\n * Checks if there is a next page.\n * Returns `undefined` if it cannot be determined.\n */\n\nexport function hasNextPage(options, pages) {\n if (options.getNextPageParam && Array.isArray(pages)) {\n var nextPageParam = getNextPageParam(options, pages);\n return typeof nextPageParam !== 'undefined' && nextPageParam !== null && nextPageParam !== false;\n }\n}\n/**\n * Checks if there is a previous page.\n * Returns `undefined` if it cannot be determined.\n */\n\nexport function hasPreviousPage(options, pages) {\n if (options.getPreviousPageParam && Array.isArray(pages)) {\n var previousPageParam = getPreviousPageParam(options, pages);\n return typeof previousPageParam !== 'undefined' && previousPageParam !== null && previousPageParam !== false;\n }\n}","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport { hashQueryKey, noop, parseFilterArgs, parseQueryArgs, partialMatchKey, hashQueryKeyByOptions } from './utils';\nimport { QueryCache } from './queryCache';\nimport { MutationCache } from './mutationCache';\nimport { focusManager } from './focusManager';\nimport { onlineManager } from './onlineManager';\nimport { notifyManager } from './notifyManager';\nimport { infiniteQueryBehavior } from './infiniteQueryBehavior';\n// CLASS\nexport var QueryClient = /*#__PURE__*/function () {\n function QueryClient(config) {\n if (config === void 0) {\n config = {};\n }\n\n this.queryCache = config.queryCache || new QueryCache();\n this.mutationCache = config.mutationCache || new MutationCache();\n this.defaultOptions = config.defaultOptions || {};\n this.queryDefaults = [];\n this.mutationDefaults = [];\n }\n\n var _proto = QueryClient.prototype;\n\n _proto.mount = function mount() {\n var _this = this;\n\n this.unsubscribeFocus = focusManager.subscribe(function () {\n if (focusManager.isFocused() && onlineManager.isOnline()) {\n _this.mutationCache.onFocus();\n\n _this.queryCache.onFocus();\n }\n });\n this.unsubscribeOnline = onlineManager.subscribe(function () {\n if (focusManager.isFocused() && onlineManager.isOnline()) {\n _this.mutationCache.onOnline();\n\n _this.queryCache.onOnline();\n }\n });\n };\n\n _proto.unmount = function unmount() {\n var _this$unsubscribeFocu, _this$unsubscribeOnli;\n\n (_this$unsubscribeFocu = this.unsubscribeFocus) == null ? void 0 : _this$unsubscribeFocu.call(this);\n (_this$unsubscribeOnli = this.unsubscribeOnline) == null ? void 0 : _this$unsubscribeOnli.call(this);\n };\n\n _proto.isFetching = function isFetching(arg1, arg2) {\n var _parseFilterArgs = parseFilterArgs(arg1, arg2),\n filters = _parseFilterArgs[0];\n\n filters.fetching = true;\n return this.queryCache.findAll(filters).length;\n };\n\n _proto.isMutating = function isMutating(filters) {\n return this.mutationCache.findAll(_extends({}, filters, {\n fetching: true\n })).length;\n };\n\n _proto.getQueryData = function getQueryData(queryKey, filters) {\n var _this$queryCache$find;\n\n return (_this$queryCache$find = this.queryCache.find(queryKey, filters)) == null ? void 0 : _this$queryCache$find.state.data;\n };\n\n _proto.getQueriesData = function getQueriesData(queryKeyOrFilters) {\n return this.getQueryCache().findAll(queryKeyOrFilters).map(function (_ref) {\n var queryKey = _ref.queryKey,\n state = _ref.state;\n var data = state.data;\n return [queryKey, data];\n });\n };\n\n _proto.setQueryData = function setQueryData(queryKey, updater, options) {\n var parsedOptions = parseQueryArgs(queryKey);\n var defaultedOptions = this.defaultQueryOptions(parsedOptions);\n return this.queryCache.build(this, defaultedOptions).setData(updater, options);\n };\n\n _proto.setQueriesData = function setQueriesData(queryKeyOrFilters, updater, options) {\n var _this2 = this;\n\n return notifyManager.batch(function () {\n return _this2.getQueryCache().findAll(queryKeyOrFilters).map(function (_ref2) {\n var queryKey = _ref2.queryKey;\n return [queryKey, _this2.setQueryData(queryKey, updater, options)];\n });\n });\n };\n\n _proto.getQueryState = function getQueryState(queryKey, filters) {\n var _this$queryCache$find2;\n\n return (_this$queryCache$find2 = this.queryCache.find(queryKey, filters)) == null ? void 0 : _this$queryCache$find2.state;\n };\n\n _proto.removeQueries = function removeQueries(arg1, arg2) {\n var _parseFilterArgs2 = parseFilterArgs(arg1, arg2),\n filters = _parseFilterArgs2[0];\n\n var queryCache = this.queryCache;\n notifyManager.batch(function () {\n queryCache.findAll(filters).forEach(function (query) {\n queryCache.remove(query);\n });\n });\n };\n\n _proto.resetQueries = function resetQueries(arg1, arg2, arg3) {\n var _this3 = this;\n\n var _parseFilterArgs3 = parseFilterArgs(arg1, arg2, arg3),\n filters = _parseFilterArgs3[0],\n options = _parseFilterArgs3[1];\n\n var queryCache = this.queryCache;\n\n var refetchFilters = _extends({}, filters, {\n active: true\n });\n\n return notifyManager.batch(function () {\n queryCache.findAll(filters).forEach(function (query) {\n query.reset();\n });\n return _this3.refetchQueries(refetchFilters, options);\n });\n };\n\n _proto.cancelQueries = function cancelQueries(arg1, arg2, arg3) {\n var _this4 = this;\n\n var _parseFilterArgs4 = parseFilterArgs(arg1, arg2, arg3),\n filters = _parseFilterArgs4[0],\n _parseFilterArgs4$ = _parseFilterArgs4[1],\n cancelOptions = _parseFilterArgs4$ === void 0 ? {} : _parseFilterArgs4$;\n\n if (typeof cancelOptions.revert === 'undefined') {\n cancelOptions.revert = true;\n }\n\n var promises = notifyManager.batch(function () {\n return _this4.queryCache.findAll(filters).map(function (query) {\n return query.cancel(cancelOptions);\n });\n });\n return Promise.all(promises).then(noop).catch(noop);\n };\n\n _proto.invalidateQueries = function invalidateQueries(arg1, arg2, arg3) {\n var _ref3,\n _filters$refetchActiv,\n _filters$refetchInact,\n _this5 = this;\n\n var _parseFilterArgs5 = parseFilterArgs(arg1, arg2, arg3),\n filters = _parseFilterArgs5[0],\n options = _parseFilterArgs5[1];\n\n var refetchFilters = _extends({}, filters, {\n // if filters.refetchActive is not provided and filters.active is explicitly false,\n // e.g. invalidateQueries({ active: false }), we don't want to refetch active queries\n active: (_ref3 = (_filters$refetchActiv = filters.refetchActive) != null ? _filters$refetchActiv : filters.active) != null ? _ref3 : true,\n inactive: (_filters$refetchInact = filters.refetchInactive) != null ? _filters$refetchInact : false\n });\n\n return notifyManager.batch(function () {\n _this5.queryCache.findAll(filters).forEach(function (query) {\n query.invalidate();\n });\n\n return _this5.refetchQueries(refetchFilters, options);\n });\n };\n\n _proto.refetchQueries = function refetchQueries(arg1, arg2, arg3) {\n var _this6 = this;\n\n var _parseFilterArgs6 = parseFilterArgs(arg1, arg2, arg3),\n filters = _parseFilterArgs6[0],\n options = _parseFilterArgs6[1];\n\n var promises = notifyManager.batch(function () {\n return _this6.queryCache.findAll(filters).map(function (query) {\n return query.fetch(undefined, _extends({}, options, {\n meta: {\n refetchPage: filters == null ? void 0 : filters.refetchPage\n }\n }));\n });\n });\n var promise = Promise.all(promises).then(noop);\n\n if (!(options == null ? void 0 : options.throwOnError)) {\n promise = promise.catch(noop);\n }\n\n return promise;\n };\n\n _proto.fetchQuery = function fetchQuery(arg1, arg2, arg3) {\n var parsedOptions = parseQueryArgs(arg1, arg2, arg3);\n var defaultedOptions = this.defaultQueryOptions(parsedOptions); // https://github.com/tannerlinsley/react-query/issues/652\n\n if (typeof defaultedOptions.retry === 'undefined') {\n defaultedOptions.retry = false;\n }\n\n var query = this.queryCache.build(this, defaultedOptions);\n return query.isStaleByTime(defaultedOptions.staleTime) ? query.fetch(defaultedOptions) : Promise.resolve(query.state.data);\n };\n\n _proto.prefetchQuery = function prefetchQuery(arg1, arg2, arg3) {\n return this.fetchQuery(arg1, arg2, arg3).then(noop).catch(noop);\n };\n\n _proto.fetchInfiniteQuery = function fetchInfiniteQuery(arg1, arg2, arg3) {\n var parsedOptions = parseQueryArgs(arg1, arg2, arg3);\n parsedOptions.behavior = infiniteQueryBehavior();\n return this.fetchQuery(parsedOptions);\n };\n\n _proto.prefetchInfiniteQuery = function prefetchInfiniteQuery(arg1, arg2, arg3) {\n return this.fetchInfiniteQuery(arg1, arg2, arg3).then(noop).catch(noop);\n };\n\n _proto.cancelMutations = function cancelMutations() {\n var _this7 = this;\n\n var promises = notifyManager.batch(function () {\n return _this7.mutationCache.getAll().map(function (mutation) {\n return mutation.cancel();\n });\n });\n return Promise.all(promises).then(noop).catch(noop);\n };\n\n _proto.resumePausedMutations = function resumePausedMutations() {\n return this.getMutationCache().resumePausedMutations();\n };\n\n _proto.executeMutation = function executeMutation(options) {\n return this.mutationCache.build(this, options).execute();\n };\n\n _proto.getQueryCache = function getQueryCache() {\n return this.queryCache;\n };\n\n _proto.getMutationCache = function getMutationCache() {\n return this.mutationCache;\n };\n\n _proto.getDefaultOptions = function getDefaultOptions() {\n return this.defaultOptions;\n };\n\n _proto.setDefaultOptions = function setDefaultOptions(options) {\n this.defaultOptions = options;\n };\n\n _proto.setQueryDefaults = function setQueryDefaults(queryKey, options) {\n var result = this.queryDefaults.find(function (x) {\n return hashQueryKey(queryKey) === hashQueryKey(x.queryKey);\n });\n\n if (result) {\n result.defaultOptions = options;\n } else {\n this.queryDefaults.push({\n queryKey: queryKey,\n defaultOptions: options\n });\n }\n };\n\n _proto.getQueryDefaults = function getQueryDefaults(queryKey) {\n var _this$queryDefaults$f;\n\n return queryKey ? (_this$queryDefaults$f = this.queryDefaults.find(function (x) {\n return partialMatchKey(queryKey, x.queryKey);\n })) == null ? void 0 : _this$queryDefaults$f.defaultOptions : undefined;\n };\n\n _proto.setMutationDefaults = function setMutationDefaults(mutationKey, options) {\n var result = this.mutationDefaults.find(function (x) {\n return hashQueryKey(mutationKey) === hashQueryKey(x.mutationKey);\n });\n\n if (result) {\n result.defaultOptions = options;\n } else {\n this.mutationDefaults.push({\n mutationKey: mutationKey,\n defaultOptions: options\n });\n }\n };\n\n _proto.getMutationDefaults = function getMutationDefaults(mutationKey) {\n var _this$mutationDefault;\n\n return mutationKey ? (_this$mutationDefault = this.mutationDefaults.find(function (x) {\n return partialMatchKey(mutationKey, x.mutationKey);\n })) == null ? void 0 : _this$mutationDefault.defaultOptions : undefined;\n };\n\n _proto.defaultQueryOptions = function defaultQueryOptions(options) {\n if (options == null ? void 0 : options._defaulted) {\n return options;\n }\n\n var defaultedOptions = _extends({}, this.defaultOptions.queries, this.getQueryDefaults(options == null ? void 0 : options.queryKey), options, {\n _defaulted: true\n });\n\n if (!defaultedOptions.queryHash && defaultedOptions.queryKey) {\n defaultedOptions.queryHash = hashQueryKeyByOptions(defaultedOptions.queryKey, defaultedOptions);\n }\n\n return defaultedOptions;\n };\n\n _proto.defaultQueryObserverOptions = function defaultQueryObserverOptions(options) {\n return this.defaultQueryOptions(options);\n };\n\n _proto.defaultMutationOptions = function defaultMutationOptions(options) {\n if (options == null ? void 0 : options._defaulted) {\n return options;\n }\n\n return _extends({}, this.defaultOptions.mutations, this.getMutationDefaults(options == null ? void 0 : options.mutationKey), options, {\n _defaulted: true\n });\n };\n\n _proto.clear = function clear() {\n this.queryCache.clear();\n this.mutationCache.clear();\n };\n\n return QueryClient;\n}();","import { focusManager } from './focusManager';\nimport { onlineManager } from './onlineManager';\nimport { sleep } from './utils';\n\nfunction defaultRetryDelay(failureCount) {\n return Math.min(1000 * Math.pow(2, failureCount), 30000);\n}\n\nexport function isCancelable(value) {\n return typeof (value == null ? void 0 : value.cancel) === 'function';\n}\nexport var CancelledError = function CancelledError(options) {\n this.revert = options == null ? void 0 : options.revert;\n this.silent = options == null ? void 0 : options.silent;\n};\nexport function isCancelledError(value) {\n return value instanceof CancelledError;\n} // CLASS\n\nexport var Retryer = function Retryer(config) {\n var _this = this;\n\n var cancelRetry = false;\n var cancelFn;\n var continueFn;\n var promiseResolve;\n var promiseReject;\n this.abort = config.abort;\n\n this.cancel = function (cancelOptions) {\n return cancelFn == null ? void 0 : cancelFn(cancelOptions);\n };\n\n this.cancelRetry = function () {\n cancelRetry = true;\n };\n\n this.continueRetry = function () {\n cancelRetry = false;\n };\n\n this.continue = function () {\n return continueFn == null ? void 0 : continueFn();\n };\n\n this.failureCount = 0;\n this.isPaused = false;\n this.isResolved = false;\n this.isTransportCancelable = false;\n this.promise = new Promise(function (outerResolve, outerReject) {\n promiseResolve = outerResolve;\n promiseReject = outerReject;\n });\n\n var resolve = function resolve(value) {\n if (!_this.isResolved) {\n _this.isResolved = true;\n config.onSuccess == null ? void 0 : config.onSuccess(value);\n continueFn == null ? void 0 : continueFn();\n promiseResolve(value);\n }\n };\n\n var reject = function reject(value) {\n if (!_this.isResolved) {\n _this.isResolved = true;\n config.onError == null ? void 0 : config.onError(value);\n continueFn == null ? void 0 : continueFn();\n promiseReject(value);\n }\n };\n\n var pause = function pause() {\n return new Promise(function (continueResolve) {\n continueFn = continueResolve;\n _this.isPaused = true;\n config.onPause == null ? void 0 : config.onPause();\n }).then(function () {\n continueFn = undefined;\n _this.isPaused = false;\n config.onContinue == null ? void 0 : config.onContinue();\n });\n }; // Create loop function\n\n\n var run = function run() {\n // Do nothing if already resolved\n if (_this.isResolved) {\n return;\n }\n\n var promiseOrValue; // Execute query\n\n try {\n promiseOrValue = config.fn();\n } catch (error) {\n promiseOrValue = Promise.reject(error);\n } // Create callback to cancel this fetch\n\n\n cancelFn = function cancelFn(cancelOptions) {\n if (!_this.isResolved) {\n reject(new CancelledError(cancelOptions));\n _this.abort == null ? void 0 : _this.abort(); // Cancel transport if supported\n\n if (isCancelable(promiseOrValue)) {\n try {\n promiseOrValue.cancel();\n } catch (_unused) {}\n }\n }\n }; // Check if the transport layer support cancellation\n\n\n _this.isTransportCancelable = isCancelable(promiseOrValue);\n Promise.resolve(promiseOrValue).then(resolve).catch(function (error) {\n var _config$retry, _config$retryDelay;\n\n // Stop if the fetch is already resolved\n if (_this.isResolved) {\n return;\n } // Do we need to retry the request?\n\n\n var retry = (_config$retry = config.retry) != null ? _config$retry : 3;\n var retryDelay = (_config$retryDelay = config.retryDelay) != null ? _config$retryDelay : defaultRetryDelay;\n var delay = typeof retryDelay === 'function' ? retryDelay(_this.failureCount, error) : retryDelay;\n var shouldRetry = retry === true || typeof retry === 'number' && _this.failureCount < retry || typeof retry === 'function' && retry(_this.failureCount, error);\n\n if (cancelRetry || !shouldRetry) {\n // We are done if the query does not need to be retried\n reject(error);\n return;\n }\n\n _this.failureCount++; // Notify on fail\n\n config.onFail == null ? void 0 : config.onFail(_this.failureCount, error); // Delay\n\n sleep(delay) // Pause if the document is not visible or when the device is offline\n .then(function () {\n if (!focusManager.isFocused() || !onlineManager.isOnline()) {\n return pause();\n }\n }).then(function () {\n if (cancelRetry) {\n reject(error);\n } else {\n run();\n }\n });\n });\n }; // Start loop\n\n\n run();\n};","export var Subscribable = /*#__PURE__*/function () {\n function Subscribable() {\n this.listeners = [];\n }\n\n var _proto = Subscribable.prototype;\n\n _proto.subscribe = function subscribe(listener) {\n var _this = this;\n\n var callback = listener || function () {\n return undefined;\n };\n\n this.listeners.push(callback);\n this.onSubscribe();\n return function () {\n _this.listeners = _this.listeners.filter(function (x) {\n return x !== callback;\n });\n\n _this.onUnsubscribe();\n };\n };\n\n _proto.hasListeners = function hasListeners() {\n return this.listeners.length > 0;\n };\n\n _proto.onSubscribe = function onSubscribe() {// Do nothing\n };\n\n _proto.onUnsubscribe = function onUnsubscribe() {// Do nothing\n };\n\n return Subscribable;\n}();","import _extends from \"@babel/runtime/helpers/esm/extends\";\n// TYPES\n// UTILS\nexport var isServer = typeof window === 'undefined';\nexport function noop() {\n return undefined;\n}\nexport function functionalUpdate(updater, input) {\n return typeof updater === 'function' ? updater(input) : updater;\n}\nexport function isValidTimeout(value) {\n return typeof value === 'number' && value >= 0 && value !== Infinity;\n}\nexport function ensureQueryKeyArray(value) {\n return Array.isArray(value) ? value : [value];\n}\nexport function difference(array1, array2) {\n return array1.filter(function (x) {\n return array2.indexOf(x) === -1;\n });\n}\nexport function replaceAt(array, index, value) {\n var copy = array.slice(0);\n copy[index] = value;\n return copy;\n}\nexport function timeUntilStale(updatedAt, staleTime) {\n return Math.max(updatedAt + (staleTime || 0) - Date.now(), 0);\n}\nexport function parseQueryArgs(arg1, arg2, arg3) {\n if (!isQueryKey(arg1)) {\n return arg1;\n }\n\n if (typeof arg2 === 'function') {\n return _extends({}, arg3, {\n queryKey: arg1,\n queryFn: arg2\n });\n }\n\n return _extends({}, arg2, {\n queryKey: arg1\n });\n}\nexport function parseMutationArgs(arg1, arg2, arg3) {\n if (isQueryKey(arg1)) {\n if (typeof arg2 === 'function') {\n return _extends({}, arg3, {\n mutationKey: arg1,\n mutationFn: arg2\n });\n }\n\n return _extends({}, arg2, {\n mutationKey: arg1\n });\n }\n\n if (typeof arg1 === 'function') {\n return _extends({}, arg2, {\n mutationFn: arg1\n });\n }\n\n return _extends({}, arg1);\n}\nexport function parseFilterArgs(arg1, arg2, arg3) {\n return isQueryKey(arg1) ? [_extends({}, arg2, {\n queryKey: arg1\n }), arg3] : [arg1 || {}, arg2];\n}\nexport function parseMutationFilterArgs(arg1, arg2) {\n return isQueryKey(arg1) ? _extends({}, arg2, {\n mutationKey: arg1\n }) : arg1;\n}\nexport function mapQueryStatusFilter(active, inactive) {\n if (active === true && inactive === true || active == null && inactive == null) {\n return 'all';\n } else if (active === false && inactive === false) {\n return 'none';\n } else {\n // At this point, active|inactive can only be true|false or false|true\n // so, when only one value is provided, the missing one has to be the negated value\n var isActive = active != null ? active : !inactive;\n return isActive ? 'active' : 'inactive';\n }\n}\nexport function matchQuery(filters, query) {\n var active = filters.active,\n exact = filters.exact,\n fetching = filters.fetching,\n inactive = filters.inactive,\n predicate = filters.predicate,\n queryKey = filters.queryKey,\n stale = filters.stale;\n\n if (isQueryKey(queryKey)) {\n if (exact) {\n if (query.queryHash !== hashQueryKeyByOptions(queryKey, query.options)) {\n return false;\n }\n } else if (!partialMatchKey(query.queryKey, queryKey)) {\n return false;\n }\n }\n\n var queryStatusFilter = mapQueryStatusFilter(active, inactive);\n\n if (queryStatusFilter === 'none') {\n return false;\n } else if (queryStatusFilter !== 'all') {\n var isActive = query.isActive();\n\n if (queryStatusFilter === 'active' && !isActive) {\n return false;\n }\n\n if (queryStatusFilter === 'inactive' && isActive) {\n return false;\n }\n }\n\n if (typeof stale === 'boolean' && query.isStale() !== stale) {\n return false;\n }\n\n if (typeof fetching === 'boolean' && query.isFetching() !== fetching) {\n return false;\n }\n\n if (predicate && !predicate(query)) {\n return false;\n }\n\n return true;\n}\nexport function matchMutation(filters, mutation) {\n var exact = filters.exact,\n fetching = filters.fetching,\n predicate = filters.predicate,\n mutationKey = filters.mutationKey;\n\n if (isQueryKey(mutationKey)) {\n if (!mutation.options.mutationKey) {\n return false;\n }\n\n if (exact) {\n if (hashQueryKey(mutation.options.mutationKey) !== hashQueryKey(mutationKey)) {\n return false;\n }\n } else if (!partialMatchKey(mutation.options.mutationKey, mutationKey)) {\n return false;\n }\n }\n\n if (typeof fetching === 'boolean' && mutation.state.status === 'loading' !== fetching) {\n return false;\n }\n\n if (predicate && !predicate(mutation)) {\n return false;\n }\n\n return true;\n}\nexport function hashQueryKeyByOptions(queryKey, options) {\n var hashFn = (options == null ? void 0 : options.queryKeyHashFn) || hashQueryKey;\n return hashFn(queryKey);\n}\n/**\n * Default query keys hash function.\n */\n\nexport function hashQueryKey(queryKey) {\n var asArray = ensureQueryKeyArray(queryKey);\n return stableValueHash(asArray);\n}\n/**\n * Hashes the value into a stable hash.\n */\n\nexport function stableValueHash(value) {\n return JSON.stringify(value, function (_, val) {\n return isPlainObject(val) ? Object.keys(val).sort().reduce(function (result, key) {\n result[key] = val[key];\n return result;\n }, {}) : val;\n });\n}\n/**\n * Checks if key `b` partially matches with key `a`.\n */\n\nexport function partialMatchKey(a, b) {\n return partialDeepEqual(ensureQueryKeyArray(a), ensureQueryKeyArray(b));\n}\n/**\n * Checks if `b` partially matches with `a`.\n */\n\nexport function partialDeepEqual(a, b) {\n if (a === b) {\n return true;\n }\n\n if (typeof a !== typeof b) {\n return false;\n }\n\n if (a && b && typeof a === 'object' && typeof b === 'object') {\n return !Object.keys(b).some(function (key) {\n return !partialDeepEqual(a[key], b[key]);\n });\n }\n\n return false;\n}\n/**\n * This function returns `a` if `b` is deeply equal.\n * If not, it will replace any deeply equal children of `b` with those of `a`.\n * This can be used for structural sharing between JSON values for example.\n */\n\nexport function replaceEqualDeep(a, b) {\n if (a === b) {\n return a;\n }\n\n var array = Array.isArray(a) && Array.isArray(b);\n\n if (array || isPlainObject(a) && isPlainObject(b)) {\n var aSize = array ? a.length : Object.keys(a).length;\n var bItems = array ? b : Object.keys(b);\n var bSize = bItems.length;\n var copy = array ? [] : {};\n var equalItems = 0;\n\n for (var i = 0; i < bSize; i++) {\n var key = array ? i : bItems[i];\n copy[key] = replaceEqualDeep(a[key], b[key]);\n\n if (copy[key] === a[key]) {\n equalItems++;\n }\n }\n\n return aSize === bSize && equalItems === aSize ? a : copy;\n }\n\n return b;\n}\n/**\n * Shallow compare objects. Only works with objects that always have the same properties.\n */\n\nexport function shallowEqualObjects(a, b) {\n if (a && !b || b && !a) {\n return false;\n }\n\n for (var key in a) {\n if (a[key] !== b[key]) {\n return false;\n }\n }\n\n return true;\n} // Copied from: https://github.com/jonschlinkert/is-plain-object\n\nexport function isPlainObject(o) {\n if (!hasObjectPrototype(o)) {\n return false;\n } // If has modified constructor\n\n\n var ctor = o.constructor;\n\n if (typeof ctor === 'undefined') {\n return true;\n } // If has modified prototype\n\n\n var prot = ctor.prototype;\n\n if (!hasObjectPrototype(prot)) {\n return false;\n } // If constructor does not have an Object-specific method\n\n\n if (!prot.hasOwnProperty('isPrototypeOf')) {\n return false;\n } // Most likely a plain Object\n\n\n return true;\n}\n\nfunction hasObjectPrototype(o) {\n return Object.prototype.toString.call(o) === '[object Object]';\n}\n\nexport function isQueryKey(value) {\n return typeof value === 'string' || Array.isArray(value);\n}\nexport function isError(value) {\n return value instanceof Error;\n}\nexport function sleep(timeout) {\n return new Promise(function (resolve) {\n setTimeout(resolve, timeout);\n });\n}\n/**\n * Schedules a microtask.\n * This can be useful to schedule state updates after rendering.\n */\n\nexport function scheduleMicrotask(callback) {\n Promise.resolve().then(callback).catch(function (error) {\n return setTimeout(function () {\n throw error;\n });\n });\n}\nexport function getAbortController() {\n if (typeof AbortController === 'function') {\n return new AbortController();\n }\n}","import ReactDOM from 'react-dom';\nexport var unstable_batchedUpdates = ReactDOM.unstable_batchedUpdates;","import { notifyManager } from '../core';\nimport { unstable_batchedUpdates } from './reactBatchedUpdates';\nnotifyManager.setBatchNotifyFunction(unstable_batchedUpdates);","export var logger = console;","import { setLogger } from '../core';\nimport { logger } from './logger';\nsetLogger(logger);","import React from 'react';\nvar defaultContext = /*#__PURE__*/React.createContext(undefined);\nvar QueryClientSharingContext = /*#__PURE__*/React.createContext(false); // if contextSharing is on, we share the first and at least one\n// instance of the context across the window\n// to ensure that if React Query is used across\n// different bundles or microfrontends they will\n// all use the same **instance** of context, regardless\n// of module scoping.\n\nfunction getQueryClientContext(contextSharing) {\n if (contextSharing && typeof window !== 'undefined') {\n if (!window.ReactQueryClientContext) {\n window.ReactQueryClientContext = defaultContext;\n }\n\n return window.ReactQueryClientContext;\n }\n\n return defaultContext;\n}\n\nexport var useQueryClient = function useQueryClient() {\n var queryClient = React.useContext(getQueryClientContext(React.useContext(QueryClientSharingContext)));\n\n if (!queryClient) {\n throw new Error('No QueryClient set, use QueryClientProvider to set one');\n }\n\n return queryClient;\n};\nexport var QueryClientProvider = function QueryClientProvider(_ref) {\n var client = _ref.client,\n _ref$contextSharing = _ref.contextSharing,\n contextSharing = _ref$contextSharing === void 0 ? false : _ref$contextSharing,\n children = _ref.children;\n React.useEffect(function () {\n client.mount();\n return function () {\n client.unmount();\n };\n }, [client]);\n var Context = getQueryClientContext(contextSharing);\n return /*#__PURE__*/React.createElement(QueryClientSharingContext.Provider, {\n value: contextSharing\n }, /*#__PURE__*/React.createElement(Context.Provider, {\n value: client\n }, children));\n};","import _extends from \"@babel/runtime/helpers/esm/extends\";\nimport _inheritsLoose from \"@babel/runtime/helpers/esm/inheritsLoose\";\nimport { isServer, isValidTimeout, noop, replaceEqualDeep, shallowEqualObjects, timeUntilStale } from './utils';\nimport { notifyManager } from './notifyManager';\nimport { focusManager } from './focusManager';\nimport { Subscribable } from './subscribable';\nimport { getLogger } from './logger';\nimport { isCancelledError } from './retryer';\nexport var QueryObserver = /*#__PURE__*/function (_Subscribable) {\n _inheritsLoose(QueryObserver, _Subscribable);\n\n function QueryObserver(client, options) {\n var _this;\n\n _this = _Subscribable.call(this) || this;\n _this.client = client;\n _this.options = options;\n _this.trackedProps = [];\n _this.selectError = null;\n\n _this.bindMethods();\n\n _this.setOptions(options);\n\n return _this;\n }\n\n var _proto = QueryObserver.prototype;\n\n _proto.bindMethods = function bindMethods() {\n this.remove = this.remove.bind(this);\n this.refetch = this.refetch.bind(this);\n };\n\n _proto.onSubscribe = function onSubscribe() {\n if (this.listeners.length === 1) {\n this.currentQuery.addObserver(this);\n\n if (shouldFetchOnMount(this.currentQuery, this.options)) {\n this.executeFetch();\n }\n\n this.updateTimers();\n }\n };\n\n _proto.onUnsubscribe = function onUnsubscribe() {\n if (!this.listeners.length) {\n this.destroy();\n }\n };\n\n _proto.shouldFetchOnReconnect = function shouldFetchOnReconnect() {\n return shouldFetchOn(this.currentQuery, this.options, this.options.refetchOnReconnect);\n };\n\n _proto.shouldFetchOnWindowFocus = function shouldFetchOnWindowFocus() {\n return shouldFetchOn(this.currentQuery, this.options, this.options.refetchOnWindowFocus);\n };\n\n _proto.destroy = function destroy() {\n this.listeners = [];\n this.clearTimers();\n this.currentQuery.removeObserver(this);\n };\n\n _proto.setOptions = function setOptions(options, notifyOptions) {\n var prevOptions = this.options;\n var prevQuery = this.currentQuery;\n this.options = this.client.defaultQueryObserverOptions(options);\n\n if (typeof this.options.enabled !== 'undefined' && typeof this.options.enabled !== 'boolean') {\n throw new Error('Expected enabled to be a boolean');\n } // Keep previous query key if the user does not supply one\n\n\n if (!this.options.queryKey) {\n this.options.queryKey = prevOptions.queryKey;\n }\n\n this.updateQuery();\n var mounted = this.hasListeners(); // Fetch if there are subscribers\n\n if (mounted && shouldFetchOptionally(this.currentQuery, prevQuery, this.options, prevOptions)) {\n this.executeFetch();\n } // Update result\n\n\n this.updateResult(notifyOptions); // Update stale interval if needed\n\n if (mounted && (this.currentQuery !== prevQuery || this.options.enabled !== prevOptions.enabled || this.options.staleTime !== prevOptions.staleTime)) {\n this.updateStaleTimeout();\n }\n\n var nextRefetchInterval = this.computeRefetchInterval(); // Update refetch interval if needed\n\n if (mounted && (this.currentQuery !== prevQuery || this.options.enabled !== prevOptions.enabled || nextRefetchInterval !== this.currentRefetchInterval)) {\n this.updateRefetchInterval(nextRefetchInterval);\n }\n };\n\n _proto.getOptimisticResult = function getOptimisticResult(options) {\n var defaultedOptions = this.client.defaultQueryObserverOptions(options);\n var query = this.client.getQueryCache().build(this.client, defaultedOptions);\n return this.createResult(query, defaultedOptions);\n };\n\n _proto.getCurrentResult = function getCurrentResult() {\n return this.currentResult;\n };\n\n _proto.trackResult = function trackResult(result, defaultedOptions) {\n var _this2 = this;\n\n var trackedResult = {};\n\n var trackProp = function trackProp(key) {\n if (!_this2.trackedProps.includes(key)) {\n _this2.trackedProps.push(key);\n }\n };\n\n Object.keys(result).forEach(function (key) {\n Object.defineProperty(trackedResult, key, {\n configurable: false,\n enumerable: true,\n get: function get() {\n trackProp(key);\n return result[key];\n }\n });\n });\n\n if (defaultedOptions.useErrorBoundary || defaultedOptions.suspense) {\n trackProp('error');\n }\n\n return trackedResult;\n };\n\n _proto.getNextResult = function getNextResult(options) {\n var _this3 = this;\n\n return new Promise(function (resolve, reject) {\n var unsubscribe = _this3.subscribe(function (result) {\n if (!result.isFetching) {\n unsubscribe();\n\n if (result.isError && (options == null ? void 0 : options.throwOnError)) {\n reject(result.error);\n } else {\n resolve(result);\n }\n }\n });\n });\n };\n\n _proto.getCurrentQuery = function getCurrentQuery() {\n return this.currentQuery;\n };\n\n _proto.remove = function remove() {\n this.client.getQueryCache().remove(this.currentQuery);\n };\n\n _proto.refetch = function refetch(options) {\n return this.fetch(_extends({}, options, {\n meta: {\n refetchPage: options == null ? void 0 : options.refetchPage\n }\n }));\n };\n\n _proto.fetchOptimistic = function fetchOptimistic(options) {\n var _this4 = this;\n\n var defaultedOptions = this.client.defaultQueryObserverOptions(options);\n var query = this.client.getQueryCache().build(this.client, defaultedOptions);\n return query.fetch().then(function () {\n return _this4.createResult(query, defaultedOptions);\n });\n };\n\n _proto.fetch = function fetch(fetchOptions) {\n var _this5 = this;\n\n return this.executeFetch(fetchOptions).then(function () {\n _this5.updateResult();\n\n return _this5.currentResult;\n });\n };\n\n _proto.executeFetch = function executeFetch(fetchOptions) {\n // Make sure we reference the latest query as the current one might have been removed\n this.updateQuery(); // Fetch\n\n var promise = this.currentQuery.fetch(this.options, fetchOptions);\n\n if (!(fetchOptions == null ? void 0 : fetchOptions.throwOnError)) {\n promise = promise.catch(noop);\n }\n\n return promise;\n };\n\n _proto.updateStaleTimeout = function updateStaleTimeout() {\n var _this6 = this;\n\n this.clearStaleTimeout();\n\n if (isServer || this.currentResult.isStale || !isValidTimeout(this.options.staleTime)) {\n return;\n }\n\n var time = timeUntilStale(this.currentResult.dataUpdatedAt, this.options.staleTime); // The timeout is sometimes triggered 1 ms before the stale time expiration.\n // To mitigate this issue we always add 1 ms to the timeout.\n\n var timeout = time + 1;\n this.staleTimeoutId = setTimeout(function () {\n if (!_this6.currentResult.isStale) {\n _this6.updateResult();\n }\n }, timeout);\n };\n\n _proto.computeRefetchInterval = function computeRefetchInterval() {\n var _this$options$refetch;\n\n return typeof this.options.refetchInterval === 'function' ? this.options.refetchInterval(this.currentResult.data, this.currentQuery) : (_this$options$refetch = this.options.refetchInterval) != null ? _this$options$refetch : false;\n };\n\n _proto.updateRefetchInterval = function updateRefetchInterval(nextInterval) {\n var _this7 = this;\n\n this.clearRefetchInterval();\n this.currentRefetchInterval = nextInterval;\n\n if (isServer || this.options.enabled === false || !isValidTimeout(this.currentRefetchInterval) || this.currentRefetchInterval === 0) {\n return;\n }\n\n this.refetchIntervalId = setInterval(function () {\n if (_this7.options.refetchIntervalInBackground || focusManager.isFocused()) {\n _this7.executeFetch();\n }\n }, this.currentRefetchInterval);\n };\n\n _proto.updateTimers = function updateTimers() {\n this.updateStaleTimeout();\n this.updateRefetchInterval(this.computeRefetchInterval());\n };\n\n _proto.clearTimers = function clearTimers() {\n this.clearStaleTimeout();\n this.clearRefetchInterval();\n };\n\n _proto.clearStaleTimeout = function clearStaleTimeout() {\n if (this.staleTimeoutId) {\n clearTimeout(this.staleTimeoutId);\n this.staleTimeoutId = undefined;\n }\n };\n\n _proto.clearRefetchInterval = function clearRefetchInterval() {\n if (this.refetchIntervalId) {\n clearInterval(this.refetchIntervalId);\n this.refetchIntervalId = undefined;\n }\n };\n\n _proto.createResult = function createResult(query, options) {\n var prevQuery = this.currentQuery;\n var prevOptions = this.options;\n var prevResult = this.currentResult;\n var prevResultState = this.currentResultState;\n var prevResultOptions = this.currentResultOptions;\n var queryChange = query !== prevQuery;\n var queryInitialState = queryChange ? query.state : this.currentQueryInitialState;\n var prevQueryResult = queryChange ? this.currentResult : this.previousQueryResult;\n var state = query.state;\n var dataUpdatedAt = state.dataUpdatedAt,\n error = state.error,\n errorUpdatedAt = state.errorUpdatedAt,\n isFetching = state.isFetching,\n status = state.status;\n var isPreviousData = false;\n var isPlaceholderData = false;\n var data; // Optimistically set result in fetching state if needed\n\n if (options.optimisticResults) {\n var mounted = this.hasListeners();\n var fetchOnMount = !mounted && shouldFetchOnMount(query, options);\n var fetchOptionally = mounted && shouldFetchOptionally(query, prevQuery, options, prevOptions);\n\n if (fetchOnMount || fetchOptionally) {\n isFetching = true;\n\n if (!dataUpdatedAt) {\n status = 'loading';\n }\n }\n } // Keep previous data if needed\n\n\n if (options.keepPreviousData && !state.dataUpdateCount && (prevQueryResult == null ? void 0 : prevQueryResult.isSuccess) && status !== 'error') {\n data = prevQueryResult.data;\n dataUpdatedAt = prevQueryResult.dataUpdatedAt;\n status = prevQueryResult.status;\n isPreviousData = true;\n } // Select data if needed\n else if (options.select && typeof state.data !== 'undefined') {\n // Memoize select result\n if (prevResult && state.data === (prevResultState == null ? void 0 : prevResultState.data) && options.select === this.selectFn) {\n data = this.selectResult;\n } else {\n try {\n this.selectFn = options.select;\n data = options.select(state.data);\n\n if (options.structuralSharing !== false) {\n data = replaceEqualDeep(prevResult == null ? void 0 : prevResult.data, data);\n }\n\n this.selectResult = data;\n this.selectError = null;\n } catch (selectError) {\n getLogger().error(selectError);\n this.selectError = selectError;\n }\n }\n } // Use query data\n else {\n data = state.data;\n } // Show placeholder data if needed\n\n\n if (typeof options.placeholderData !== 'undefined' && typeof data === 'undefined' && (status === 'loading' || status === 'idle')) {\n var placeholderData; // Memoize placeholder data\n\n if ((prevResult == null ? void 0 : prevResult.isPlaceholderData) && options.placeholderData === (prevResultOptions == null ? void 0 : prevResultOptions.placeholderData)) {\n placeholderData = prevResult.data;\n } else {\n placeholderData = typeof options.placeholderData === 'function' ? options.placeholderData() : options.placeholderData;\n\n if (options.select && typeof placeholderData !== 'undefined') {\n try {\n placeholderData = options.select(placeholderData);\n\n if (options.structuralSharing !== false) {\n placeholderData = replaceEqualDeep(prevResult == null ? void 0 : prevResult.data, placeholderData);\n }\n\n this.selectError = null;\n } catch (selectError) {\n getLogger().error(selectError);\n this.selectError = selectError;\n }\n }\n }\n\n if (typeof placeholderData !== 'undefined') {\n status = 'success';\n data = placeholderData;\n isPlaceholderData = true;\n }\n }\n\n if (this.selectError) {\n error = this.selectError;\n data = this.selectResult;\n errorUpdatedAt = Date.now();\n status = 'error';\n }\n\n var result = {\n status: status,\n isLoading: status === 'loading',\n isSuccess: status === 'success',\n isError: status === 'error',\n isIdle: status === 'idle',\n data: data,\n dataUpdatedAt: dataUpdatedAt,\n error: error,\n errorUpdatedAt: errorUpdatedAt,\n failureCount: state.fetchFailureCount,\n errorUpdateCount: state.errorUpdateCount,\n isFetched: state.dataUpdateCount > 0 || state.errorUpdateCount > 0,\n isFetchedAfterMount: state.dataUpdateCount > queryInitialState.dataUpdateCount || state.errorUpdateCount > queryInitialState.errorUpdateCount,\n isFetching: isFetching,\n isRefetching: isFetching && status !== 'loading',\n isLoadingError: status === 'error' && state.dataUpdatedAt === 0,\n isPlaceholderData: isPlaceholderData,\n isPreviousData: isPreviousData,\n isRefetchError: status === 'error' && state.dataUpdatedAt !== 0,\n isStale: isStale(query, options),\n refetch: this.refetch,\n remove: this.remove\n };\n return result;\n };\n\n _proto.shouldNotifyListeners = function shouldNotifyListeners(result, prevResult) {\n if (!prevResult) {\n return true;\n }\n\n var _this$options = this.options,\n notifyOnChangeProps = _this$options.notifyOnChangeProps,\n notifyOnChangePropsExclusions = _this$options.notifyOnChangePropsExclusions;\n\n if (!notifyOnChangeProps && !notifyOnChangePropsExclusions) {\n return true;\n }\n\n if (notifyOnChangeProps === 'tracked' && !this.trackedProps.length) {\n return true;\n }\n\n var includedProps = notifyOnChangeProps === 'tracked' ? this.trackedProps : notifyOnChangeProps;\n return Object.keys(result).some(function (key) {\n var typedKey = key;\n var changed = result[typedKey] !== prevResult[typedKey];\n var isIncluded = includedProps == null ? void 0 : includedProps.some(function (x) {\n return x === key;\n });\n var isExcluded = notifyOnChangePropsExclusions == null ? void 0 : notifyOnChangePropsExclusions.some(function (x) {\n return x === key;\n });\n return changed && !isExcluded && (!includedProps || isIncluded);\n });\n };\n\n _proto.updateResult = function updateResult(notifyOptions) {\n var prevResult = this.currentResult;\n this.currentResult = this.createResult(this.currentQuery, this.options);\n this.currentResultState = this.currentQuery.state;\n this.currentResultOptions = this.options; // Only notify if something has changed\n\n if (shallowEqualObjects(this.currentResult, prevResult)) {\n return;\n } // Determine which callbacks to trigger\n\n\n var defaultNotifyOptions = {\n cache: true\n };\n\n if ((notifyOptions == null ? void 0 : notifyOptions.listeners) !== false && this.shouldNotifyListeners(this.currentResult, prevResult)) {\n defaultNotifyOptions.listeners = true;\n }\n\n this.notify(_extends({}, defaultNotifyOptions, notifyOptions));\n };\n\n _proto.updateQuery = function updateQuery() {\n var query = this.client.getQueryCache().build(this.client, this.options);\n\n if (query === this.currentQuery) {\n return;\n }\n\n var prevQuery = this.currentQuery;\n this.currentQuery = query;\n this.currentQueryInitialState = query.state;\n this.previousQueryResult = this.currentResult;\n\n if (this.hasListeners()) {\n prevQuery == null ? void 0 : prevQuery.removeObserver(this);\n query.addObserver(this);\n }\n };\n\n _proto.onQueryUpdate = function onQueryUpdate(action) {\n var notifyOptions = {};\n\n if (action.type === 'success') {\n notifyOptions.onSuccess = true;\n } else if (action.type === 'error' && !isCancelledError(action.error)) {\n notifyOptions.onError = true;\n }\n\n this.updateResult(notifyOptions);\n\n if (this.hasListeners()) {\n this.updateTimers();\n }\n };\n\n _proto.notify = function notify(notifyOptions) {\n var _this8 = this;\n\n notifyManager.batch(function () {\n // First trigger the configuration callbacks\n if (notifyOptions.onSuccess) {\n _this8.options.onSuccess == null ? void 0 : _this8.options.onSuccess(_this8.currentResult.data);\n _this8.options.onSettled == null ? void 0 : _this8.options.onSettled(_this8.currentResult.data, null);\n } else if (notifyOptions.onError) {\n _this8.options.onError == null ? void 0 : _this8.options.onError(_this8.currentResult.error);\n _this8.options.onSettled == null ? void 0 : _this8.options.onSettled(undefined, _this8.currentResult.error);\n } // Then trigger the listeners\n\n\n if (notifyOptions.listeners) {\n _this8.listeners.forEach(function (listener) {\n listener(_this8.currentResult);\n });\n } // Then the cache listeners\n\n\n if (notifyOptions.cache) {\n _this8.client.getQueryCache().notify({\n query: _this8.currentQuery,\n type: 'observerResultsUpdated'\n });\n }\n });\n };\n\n return QueryObserver;\n}(Subscribable);\n\nfunction shouldLoadOnMount(query, options) {\n return options.enabled !== false && !query.state.dataUpdatedAt && !(query.state.status === 'error' && options.retryOnMount === false);\n}\n\nfunction shouldFetchOnMount(query, options) {\n return shouldLoadOnMount(query, options) || query.state.dataUpdatedAt > 0 && shouldFetchOn(query, options, options.refetchOnMount);\n}\n\nfunction shouldFetchOn(query, options, field) {\n if (options.enabled !== false) {\n var value = typeof field === 'function' ? field(query) : field;\n return value === 'always' || value !== false && isStale(query, options);\n }\n\n return false;\n}\n\nfunction shouldFetchOptionally(query, prevQuery, options, prevOptions) {\n return options.enabled !== false && (query !== prevQuery || prevOptions.enabled === false) && (!options.suspense || query.state.status !== 'error') && isStale(query, options);\n}\n\nfunction isStale(query, options) {\n return query.isStaleByTime(options.staleTime);\n}","import React from 'react'; // CONTEXT\n\nfunction createValue() {\n var _isReset = false;\n return {\n clearReset: function clearReset() {\n _isReset = false;\n },\n reset: function reset() {\n _isReset = true;\n },\n isReset: function isReset() {\n return _isReset;\n }\n };\n}\n\nvar QueryErrorResetBoundaryContext = /*#__PURE__*/React.createContext(createValue()); // HOOK\n\nexport var useQueryErrorResetBoundary = function useQueryErrorResetBoundary() {\n return React.useContext(QueryErrorResetBoundaryContext);\n}; // COMPONENT\n\nexport var QueryErrorResetBoundary = function QueryErrorResetBoundary(_ref) {\n var children = _ref.children;\n var value = React.useMemo(function () {\n return createValue();\n }, []);\n return /*#__PURE__*/React.createElement(QueryErrorResetBoundaryContext.Provider, {\n value: value\n }, typeof children === 'function' ? children(value) : children);\n};","import { QueryObserver } from '../core';\nimport { parseQueryArgs } from '../core/utils';\nimport { useBaseQuery } from './useBaseQuery'; // HOOK\n\nexport function useQuery(arg1, arg2, arg3) {\n var parsedOptions = parseQueryArgs(arg1, arg2, arg3);\n return useBaseQuery(parsedOptions, QueryObserver);\n}","import React from 'react';\nimport { notifyManager } from '../core/notifyManager';\nimport { useQueryErrorResetBoundary } from './QueryErrorResetBoundary';\nimport { useQueryClient } from './QueryClientProvider';\nimport { shouldThrowError } from './utils';\nexport function useBaseQuery(options, Observer) {\n var mountedRef = React.useRef(false);\n\n var _React$useState = React.useState(0),\n forceUpdate = _React$useState[1];\n\n var queryClient = useQueryClient();\n var errorResetBoundary = useQueryErrorResetBoundary();\n var defaultedOptions = queryClient.defaultQueryObserverOptions(options); // Make sure results are optimistically set in fetching state before subscribing or updating options\n\n defaultedOptions.optimisticResults = true; // Include callbacks in batch renders\n\n if (defaultedOptions.onError) {\n defaultedOptions.onError = notifyManager.batchCalls(defaultedOptions.onError);\n }\n\n if (defaultedOptions.onSuccess) {\n defaultedOptions.onSuccess = notifyManager.batchCalls(defaultedOptions.onSuccess);\n }\n\n if (defaultedOptions.onSettled) {\n defaultedOptions.onSettled = notifyManager.batchCalls(defaultedOptions.onSettled);\n }\n\n if (defaultedOptions.suspense) {\n // Always set stale time when using suspense to prevent\n // fetching again when directly mounting after suspending\n if (typeof defaultedOptions.staleTime !== 'number') {\n defaultedOptions.staleTime = 1000;\n } // Set cache time to 1 if the option has been set to 0\n // when using suspense to prevent infinite loop of fetches\n\n\n if (defaultedOptions.cacheTime === 0) {\n defaultedOptions.cacheTime = 1;\n }\n }\n\n if (defaultedOptions.suspense || defaultedOptions.useErrorBoundary) {\n // Prevent retrying failed query if the error boundary has not been reset yet\n if (!errorResetBoundary.isReset()) {\n defaultedOptions.retryOnMount = false;\n }\n }\n\n var _React$useState2 = React.useState(function () {\n return new Observer(queryClient, defaultedOptions);\n }),\n observer = _React$useState2[0];\n\n var result = observer.getOptimisticResult(defaultedOptions);\n React.useEffect(function () {\n mountedRef.current = true;\n errorResetBoundary.clearReset();\n var unsubscribe = observer.subscribe(notifyManager.batchCalls(function () {\n if (mountedRef.current) {\n forceUpdate(function (x) {\n return x + 1;\n });\n }\n })); // Update result to make sure we did not miss any query updates\n // between creating the observer and subscribing to it.\n\n observer.updateResult();\n return function () {\n mountedRef.current = false;\n unsubscribe();\n };\n }, [errorResetBoundary, observer]);\n React.useEffect(function () {\n // Do not notify on updates because of changes in the options because\n // these changes should already be reflected in the optimistic result.\n observer.setOptions(defaultedOptions, {\n listeners: false\n });\n }, [defaultedOptions, observer]); // Handle suspense\n\n if (defaultedOptions.suspense && result.isLoading) {\n throw observer.fetchOptimistic(defaultedOptions).then(function (_ref) {\n var data = _ref.data;\n defaultedOptions.onSuccess == null ? void 0 : defaultedOptions.onSuccess(data);\n defaultedOptions.onSettled == null ? void 0 : defaultedOptions.onSettled(data, null);\n }).catch(function (error) {\n errorResetBoundary.clearReset();\n defaultedOptions.onError == null ? void 0 : defaultedOptions.onError(error);\n defaultedOptions.onSettled == null ? void 0 : defaultedOptions.onSettled(undefined, error);\n });\n } // Handle error boundary\n\n\n if (result.isError && !errorResetBoundary.isReset() && !result.isFetching && shouldThrowError(defaultedOptions.suspense, defaultedOptions.useErrorBoundary, [result.error, observer.getCurrentQuery()])) {\n throw result.error;\n } // Handle result property usage tracking\n\n\n if (defaultedOptions.notifyOnChangeProps === 'tracked') {\n result = observer.trackResult(result, defaultedOptions);\n }\n\n return result;\n}","export function shouldThrowError(suspense, _useErrorBoundary, params) {\n // Allow useErrorBoundary function to override throwing behavior on a per-error basis\n if (typeof _useErrorBoundary === 'function') {\n return _useErrorBoundary.apply(void 0, params);\n } // Allow useErrorBoundary to override suspense's throwing behavior\n\n\n if (typeof _useErrorBoundary === 'boolean') return _useErrorBoundary; // If suspense is enabled default to throwing errors\n\n return !!suspense;\n}","import type {\n FormEncType,\n HTMLFormMethod,\n RelativeRoutingType,\n} from \"@remix-run/router\";\nimport { stripBasename, UNSAFE_warning as warning } from \"@remix-run/router\";\n\nexport const defaultMethod: HTMLFormMethod = \"get\";\nconst defaultEncType: FormEncType = \"application/x-www-form-urlencoded\";\n\nexport function isHtmlElement(object: any): object is HTMLElement {\n return object != null && typeof object.tagName === \"string\";\n}\n\nexport function isButtonElement(object: any): object is HTMLButtonElement {\n return isHtmlElement(object) && object.tagName.toLowerCase() === \"button\";\n}\n\nexport function isFormElement(object: any): object is HTMLFormElement {\n return isHtmlElement(object) && object.tagName.toLowerCase() === \"form\";\n}\n\nexport function isInputElement(object: any): object is HTMLInputElement {\n return isHtmlElement(object) && object.tagName.toLowerCase() === \"input\";\n}\n\ntype LimitedMouseEvent = Pick<\n MouseEvent,\n \"button\" | \"metaKey\" | \"altKey\" | \"ctrlKey\" | \"shiftKey\"\n>;\n\nfunction isModifiedEvent(event: LimitedMouseEvent) {\n return !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey);\n}\n\nexport function shouldProcessLinkClick(\n event: LimitedMouseEvent,\n target?: string\n) {\n return (\n event.button === 0 && // Ignore everything but left clicks\n (!target || target === \"_self\") && // Let browser handle \"target=_blank\" etc.\n !isModifiedEvent(event) // Ignore clicks with modifier keys\n );\n}\n\nexport type ParamKeyValuePair = [string, string];\n\nexport type URLSearchParamsInit =\n | string\n | ParamKeyValuePair[]\n | Record\n | URLSearchParams;\n\n/**\n * Creates a URLSearchParams object using the given initializer.\n *\n * This is identical to `new URLSearchParams(init)` except it also\n * supports arrays as values in the object form of the initializer\n * instead of just strings. This is convenient when you need multiple\n * values for a given key, but don't want to use an array initializer.\n *\n * For example, instead of:\n *\n * let searchParams = new URLSearchParams([\n * ['sort', 'name'],\n * ['sort', 'price']\n * ]);\n *\n * you can do:\n *\n * let searchParams = createSearchParams({\n * sort: ['name', 'price']\n * });\n */\nexport function createSearchParams(\n init: URLSearchParamsInit = \"\"\n): URLSearchParams {\n return new URLSearchParams(\n typeof init === \"string\" ||\n Array.isArray(init) ||\n init instanceof URLSearchParams\n ? init\n : Object.keys(init).reduce((memo, key) => {\n let value = init[key];\n return memo.concat(\n Array.isArray(value) ? value.map((v) => [key, v]) : [[key, value]]\n );\n }, [] as ParamKeyValuePair[])\n );\n}\n\nexport function getSearchParamsForLocation(\n locationSearch: string,\n defaultSearchParams: URLSearchParams | null\n) {\n let searchParams = createSearchParams(locationSearch);\n\n if (defaultSearchParams) {\n // Use `defaultSearchParams.forEach(...)` here instead of iterating of\n // `defaultSearchParams.keys()` to work-around a bug in Firefox related to\n // web extensions. Relevant Bugzilla tickets:\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1414602\n // https://bugzilla.mozilla.org/show_bug.cgi?id=1023984\n defaultSearchParams.forEach((_, key) => {\n if (!searchParams.has(key)) {\n defaultSearchParams.getAll(key).forEach((value) => {\n searchParams.append(key, value);\n });\n }\n });\n }\n\n return searchParams;\n}\n\n// Thanks https://github.com/sindresorhus/type-fest!\ntype JsonObject = { [Key in string]: JsonValue } & {\n [Key in string]?: JsonValue | undefined;\n};\ntype JsonArray = JsonValue[] | readonly JsonValue[];\ntype JsonPrimitive = string | number | boolean | null;\ntype JsonValue = JsonPrimitive | JsonObject | JsonArray;\n\nexport type SubmitTarget =\n | HTMLFormElement\n | HTMLButtonElement\n | HTMLInputElement\n | FormData\n | URLSearchParams\n | JsonValue\n | null;\n\n// One-time check for submitter support\nlet _formDataSupportsSubmitter: boolean | null = null;\n\nfunction isFormDataSubmitterSupported() {\n if (_formDataSupportsSubmitter === null) {\n try {\n new FormData(\n document.createElement(\"form\"),\n // @ts-expect-error if FormData supports the submitter parameter, this will throw\n 0\n );\n _formDataSupportsSubmitter = false;\n } catch (e) {\n _formDataSupportsSubmitter = true;\n }\n }\n return _formDataSupportsSubmitter;\n}\n\nexport interface SubmitOptions {\n /**\n * The HTTP method used to submit the form. Overrides ``.\n * Defaults to \"GET\".\n */\n method?: HTMLFormMethod;\n\n /**\n * The action URL path used to submit the form. Overrides ``.\n * Defaults to the path of the current route.\n */\n action?: string;\n\n /**\n * The encoding used to submit the form. Overrides ``.\n * Defaults to \"application/x-www-form-urlencoded\".\n */\n encType?: FormEncType;\n\n /**\n * Set `true` to replace the current entry in the browser's history stack\n * instead of creating a new one (i.e. stay on \"the same page\"). Defaults\n * to `false`.\n */\n replace?: boolean;\n\n /**\n * State object to add to the history stack entry for this navigation\n */\n state?: any;\n\n /**\n * Determines whether the form action is relative to the route hierarchy or\n * the pathname. Use this if you want to opt out of navigating the route\n * hierarchy and want to instead route based on /-delimited URL segments\n */\n relative?: RelativeRoutingType;\n\n /**\n * In browser-based environments, prevent resetting scroll after this\n * navigation when using the component\n */\n preventScrollReset?: boolean;\n}\n\nconst supportedFormEncTypes: Set = new Set([\n \"application/x-www-form-urlencoded\",\n \"multipart/form-data\",\n \"text/plain\",\n]);\n\nfunction getFormEncType(encType: string | null) {\n if (encType != null && !supportedFormEncTypes.has(encType as FormEncType)) {\n warning(\n false,\n `\"${encType}\" is not a valid \\`encType\\` for \\`\\`/\\`\\` ` +\n `and will default to \"${defaultEncType}\"`\n );\n\n return null;\n }\n return encType;\n}\n\nexport function getFormSubmissionInfo(\n target: SubmitTarget,\n basename: string\n): {\n action: string | null;\n method: string;\n encType: string;\n formData: FormData | undefined;\n body: any;\n} {\n let method: string;\n let action: string | null;\n let encType: string;\n let formData: FormData | undefined;\n let body: any;\n\n if (isFormElement(target)) {\n // When grabbing the action from the element, it will have had the basename\n // prefixed to ensure non-JS scenarios work, so strip it since we'll\n // re-prefix in the router\n let attr = target.getAttribute(\"action\");\n action = attr ? stripBasename(attr, basename) : null;\n method = target.getAttribute(\"method\") || defaultMethod;\n encType = getFormEncType(target.getAttribute(\"enctype\")) || defaultEncType;\n\n formData = new FormData(target);\n } else if (\n isButtonElement(target) ||\n (isInputElement(target) &&\n (target.type === \"submit\" || target.type === \"image\"))\n ) {\n let form = target.form;\n\n if (form == null) {\n throw new Error(\n `Cannot submit a