From 31d1fa8056a09cb11973a9d73574c97c3b2f5790 Mon Sep 17 00:00:00 2001 From: SqrtMinusOne Date: Tue, 4 Apr 2023 21:23:18 +0300 Subject: [PATCH 01/11] feat(emacs): add chart.js --- .gitignore | 1 + content/posts/2023-04-14-emacs.md | 12 ++++++++++++ layouts/_default/single.html | 3 +++ org/2023-04-14-emacs.org | 13 +++++++++++++ static/js/2023-04-14-emacs.js | 32 +++++++++++++++++++++++++++++++ static/js/chart.js | 20 +++++++++++++++++++ 6 files changed, 81 insertions(+) create mode 100644 content/posts/2023-04-14-emacs.md create mode 100644 org/2023-04-14-emacs.org create mode 100644 static/js/2023-04-14-emacs.js create mode 100644 static/js/chart.js diff --git a/.gitignore b/.gitignore index 872f349..62bb8f7 100644 --- a/.gitignore +++ b/.gitignore @@ -5,3 +5,4 @@ org/configs/** /public/ resources/_gen /content/configs/ +/.log/ diff --git a/content/posts/2023-04-14-emacs.md b/content/posts/2023-04-14-emacs.md new file mode 100644 index 0000000..99d0046 --- /dev/null +++ b/content/posts/2023-04-14-emacs.md @@ -0,0 +1,12 @@ ++++ +title = "Charts test" +author = ["Pavel Korytov"] +date = 2023-02-02 +tags = ["emacs"] +draft = true +scripts = ["/js/chart.js", "/js/2023-04-14-emacs.js"] ++++ + +Hello world + + \ No newline at end of file diff --git a/layouts/_default/single.html b/layouts/_default/single.html index 443deaa..9fe61e1 100644 --- a/layouts/_default/single.html +++ b/layouts/_default/single.html @@ -1,5 +1,8 @@ {{ define "main" }} +{{ range $script := .Params.scripts }} + +{{ end}}

{{ .Title }}

diff --git a/org/2023-04-14-emacs.org b/org/2023-04-14-emacs.org new file mode 100644 index 0000000..ee831a9 --- /dev/null +++ b/org/2023-04-14-emacs.org @@ -0,0 +1,13 @@ +#+HUGO_SECTION: posts +#+HUGO_BASE_DIR: ../ +#+TITLE: Charts test +#+DATE: 2023-02-02 +#+HUGO_TAGS: emacs +#+HUGO_DRAFT: true +#+HUGO_CUSTOM_FRONT_MATTER: :scripts '("/js/chart.js" "/js/2023-04-14-emacs.js") + +Hello world + +#+begin_export html + +#+end_export diff --git a/static/js/2023-04-14-emacs.js b/static/js/2023-04-14-emacs.js new file mode 100644 index 0000000..358e9f6 --- /dev/null +++ b/static/js/2023-04-14-emacs.js @@ -0,0 +1,32 @@ +function initChart() { + const ctx = document.getElementById("myChart"); + + new Chart(ctx, { + type: "bar", + data: { + labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"], + datasets: [ + { + label: "# of Votes", + data: [12, 19, 3, 5, 2, 3], + borderWidth: 1, + }, + ], + }, + options: { + scales: { + y: { + beginAtZero: true, + }, + }, + }, + }); +} + +document.addEventListener( + "DOMContentLoaded", + function () { + initChart(); + }, + false +); diff --git a/static/js/chart.js b/static/js/chart.js new file mode 100644 index 0000000..d819689 --- /dev/null +++ b/static/js/chart.js @@ -0,0 +1,20 @@ +/** + * Skipped minification because the original files appears to be already minified. + * Original file: /npm/chart.js@4.2.1/dist/chart.umd.js + * + * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files + */ +/*! + * Chart.js v4.2.1 + * https://www.chartjs.org + * (c) 2023 Chart.js Contributors + * Released under the MIT License + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?module.exports=e():"function"==typeof define&&define.amd?define(e):(t="undefined"!=typeof globalThis?globalThis:t||self).Chart=e()}(this,(function(){"use strict";var t=Object.freeze({__proto__:null,get Colors(){return jo},get Decimation(){return Uo},get Filler(){return ha},get Legend(){return fa},get SubTitle(){return ba},get Title(){return pa},get Tooltip(){return La}});function e(){}const i=(()=>{let t=0;return()=>t++})();function s(t){return null==t}function n(t){if(Array.isArray&&Array.isArray(t))return!0;const e=Object.prototype.toString.call(t);return"[object"===e.slice(0,7)&&"Array]"===e.slice(-6)}function o(t){return null!==t&&"[object Object]"===Object.prototype.toString.call(t)}function a(t){return("number"==typeof t||t instanceof Number)&&isFinite(+t)}function r(t,e){return a(t)?t:e}function l(t,e){return void 0===t?e:t}const h=(t,e)=>"string"==typeof t&&t.endsWith("%")?parseFloat(t)/100:+t/e,c=(t,e)=>"string"==typeof t&&t.endsWith("%")?parseFloat(t)/100*e:+t;function d(t,e,i){if(t&&"function"==typeof t.call)return t.apply(i,e)}function u(t,e,i,s){let a,r,l;if(n(t))if(r=t.length,s)for(a=r-1;a>=0;a--)e.call(i,t[a],a);else for(a=0;at,x:t=>t.x,y:t=>t.y};function v(t){const e=t.split("."),i=[];let s="";for(const t of e)s+=t,s.endsWith("\\")?s=s.slice(0,-1)+".":(i.push(s),s="");return i}function M(t,e){const i=y[e]||(y[e]=function(t){const e=v(t);return t=>{for(const i of e){if(""===i)break;t=t&&t[i]}return t}}(e));return i(t)}function w(t){return t.charAt(0).toUpperCase()+t.slice(1)}const k=t=>void 0!==t,S=t=>"function"==typeof t,P=(t,e)=>{if(t.size!==e.size)return!1;for(const i of t)if(!e.has(i))return!1;return!0};function D(t){return"mouseup"===t.type||"click"===t.type||"contextmenu"===t.type}const C=Math.PI,O=2*C,A=O+C,T=Number.POSITIVE_INFINITY,L=C/180,E=C/2,R=C/4,I=2*C/3,z=Math.log10,F=Math.sign;function V(t,e,i){return Math.abs(t-e)t-e)).pop(),e}function W(t){return!isNaN(parseFloat(t))&&isFinite(t)}function H(t,e){const i=Math.round(t);return i-e<=t&&i+e>=t}function j(t,e,i){let s,n,o;for(s=0,n=t.length;sl&&h=Math.min(e,i)-s&&t<=Math.max(e,i)+s}function et(t,e,i){i=i||(i=>t[i]1;)s=o+n>>1,i(s)?o=s:n=s;return{lo:o,hi:n}}const it=(t,e,i,s)=>et(t,i,s?s=>{const n=t[s][e];return nt[s][e]et(t,i,(s=>t[s][e]>=i));function nt(t,e,i){let s=0,n=t.length;for(;ss&&t[n-1]>i;)n--;return s>0||n{const i="_onData"+w(e),s=t[e];Object.defineProperty(t,e,{configurable:!0,enumerable:!1,value(...e){const n=s.apply(this,e);return t._chartjs.listeners.forEach((t=>{"function"==typeof t[i]&&t[i](...e)})),n}})})))}function rt(t,e){const i=t._chartjs;if(!i)return;const s=i.listeners,n=s.indexOf(e);-1!==n&&s.splice(n,1),s.length>0||(ot.forEach((e=>{delete t[e]})),delete t._chartjs)}function lt(t){const e=new Set;let i,s;for(i=0,s=t.length;i{s=!1,t.apply(e,i)})))}}function dt(t,e){let i;return function(...s){return e?(clearTimeout(i),i=setTimeout(t,e,s)):t.apply(this,s),e}}const ut=t=>"start"===t?"left":"end"===t?"right":"center",ft=(t,e,i)=>"start"===t?e:"end"===t?i:(e+i)/2,gt=(t,e,i,s)=>t===(s?"left":"right")?i:"center"===t?(e+i)/2:e;function pt(t,e,i){const s=e.length;let n=0,o=s;if(t._sorted){const{iScale:a,_parsed:r}=t,l=a.axis,{min:h,max:c,minDefined:d,maxDefined:u}=a.getUserBounds();d&&(n=J(Math.min(it(r,a.axis,h).lo,i?s:it(e,l,a.getPixelForValue(h)).lo),0,s-1)),o=u?J(Math.max(it(r,a.axis,c,!0).hi+1,i?0:it(e,l,a.getPixelForValue(c),!0).hi+1),n,s)-n:s-n}return{start:n,count:o}}function mt(t){const{xScale:e,yScale:i,_scaleRanges:s}=t,n={xmin:e.min,xmax:e.max,ymin:i.min,ymax:i.max};if(!s)return t._scaleRanges=n,!0;const o=s.xmin!==e.min||s.xmax!==e.max||s.ymin!==i.min||s.ymax!==i.max;return Object.assign(s,n),o}class bt{constructor(){this._request=null,this._charts=new Map,this._running=!1,this._lastDate=void 0}_notify(t,e,i,s){const n=e.listeners[s],o=e.duration;n.forEach((s=>s({chart:t,initial:e.initial,numSteps:o,currentStep:Math.min(i-e.start,o)})))}_refresh(){this._request||(this._running=!0,this._request=ht.call(window,(()=>{this._update(),this._request=null,this._running&&this._refresh()})))}_update(t=Date.now()){let e=0;this._charts.forEach(((i,s)=>{if(!i.running||!i.items.length)return;const n=i.items;let o,a=n.length-1,r=!1;for(;a>=0;--a)o=n[a],o._active?(o._total>i.duration&&(i.duration=o._total),o.tick(t),r=!0):(n[a]=n[n.length-1],n.pop());r&&(s.draw(),this._notify(s,i,t,"progress")),n.length||(i.running=!1,this._notify(s,i,t,"complete"),i.initial=!1),e+=n.length})),this._lastDate=t,0===e&&(this._running=!1)}_getAnims(t){const e=this._charts;let i=e.get(t);return i||(i={running:!1,initial:!0,items:[],listeners:{complete:[],progress:[]}},e.set(t,i)),i}listen(t,e,i){this._getAnims(t).listeners[e].push(i)}add(t,e){e&&e.length&&this._getAnims(t).items.push(...e)}has(t){return this._getAnims(t).items.length>0}start(t){const e=this._charts.get(t);e&&(e.running=!0,e.start=Date.now(),e.duration=e.items.reduce(((t,e)=>Math.max(t,e._duration)),0),this._refresh())}running(t){if(!this._running)return!1;const e=this._charts.get(t);return!!(e&&e.running&&e.items.length)}stop(t){const e=this._charts.get(t);if(!e||!e.items.length)return;const i=e.items;let s=i.length-1;for(;s>=0;--s)i[s].cancel();e.items=[],this._notify(t,e,Date.now(),"complete")}remove(t){return this._charts.delete(t)}}var xt=new bt; +/*! + * @kurkle/color v0.3.0 + * https://github.com/kurkle/color#readme + * (c) 2022 Jukka Kurkela + * Released under the MIT License + */function _t(t){return t+.5|0}const yt=(t,e,i)=>Math.max(Math.min(t,i),e);function vt(t){return yt(_t(2.55*t),0,255)}function Mt(t){return yt(_t(255*t),0,255)}function wt(t){return yt(_t(t/2.55)/100,0,1)}function kt(t){return yt(_t(100*t),0,100)}const St={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},Pt=[..."0123456789ABCDEF"],Dt=t=>Pt[15&t],Ct=t=>Pt[(240&t)>>4]+Pt[15&t],Ot=t=>(240&t)>>4==(15&t);function At(t){var e=(t=>Ot(t.r)&&Ot(t.g)&&Ot(t.b)&&Ot(t.a))(t)?Dt:Ct;return t?"#"+e(t.r)+e(t.g)+e(t.b)+((t,e)=>t<255?e(t):"")(t.a,e):void 0}const Tt=/^(hsla?|hwb|hsv)\(\s*([-+.e\d]+)(?:deg)?[\s,]+([-+.e\d]+)%[\s,]+([-+.e\d]+)%(?:[\s,]+([-+.e\d]+)(%)?)?\s*\)$/;function Lt(t,e,i){const s=e*Math.min(i,1-i),n=(e,n=(e+t/30)%12)=>i-s*Math.max(Math.min(n-3,9-n,1),-1);return[n(0),n(8),n(4)]}function Et(t,e,i){const s=(s,n=(s+t/60)%6)=>i-i*e*Math.max(Math.min(n,4-n,1),0);return[s(5),s(3),s(1)]}function Rt(t,e,i){const s=Lt(t,1,.5);let n;for(e+i>1&&(n=1/(e+i),e*=n,i*=n),n=0;n<3;n++)s[n]*=1-e-i,s[n]+=e;return s}function It(t){const e=t.r/255,i=t.g/255,s=t.b/255,n=Math.max(e,i,s),o=Math.min(e,i,s),a=(n+o)/2;let r,l,h;return n!==o&&(h=n-o,l=a>.5?h/(2-n-o):h/(n+o),r=function(t,e,i,s,n){return t===n?(e-i)/s+(e>16&255,o>>8&255,255&o]}return t}(),Ht.transparent=[0,0,0,0]);const e=Ht[t.toLowerCase()];return e&&{r:e[0],g:e[1],b:e[2],a:4===e.length?e[3]:255}}const $t=/^rgba?\(\s*([-+.\d]+)(%)?[\s,]+([-+.e\d]+)(%)?[\s,]+([-+.e\d]+)(%)?(?:[\s,/]+([-+.e\d]+)(%)?)?\s*\)$/;const Yt=t=>t<=.0031308?12.92*t:1.055*Math.pow(t,1/2.4)-.055,Ut=t=>t<=.04045?t/12.92:Math.pow((t+.055)/1.055,2.4);function Xt(t,e,i){if(t){let s=It(t);s[e]=Math.max(0,Math.min(s[e]+s[e]*i,0===e?360:1)),s=Ft(s),t.r=s[0],t.g=s[1],t.b=s[2]}}function qt(t,e){return t?Object.assign(e||{},t):t}function Kt(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=Mt(t[3]))):(e=qt(t,{r:0,g:0,b:0,a:1})).a=Mt(e.a),e}function Gt(t){return"r"===t.charAt(0)?function(t){const e=$t.exec(t);let i,s,n,o=255;if(e){if(e[7]!==i){const t=+e[7];o=e[8]?vt(t):yt(255*t,0,255)}return i=+e[1],s=+e[3],n=+e[5],i=255&(e[2]?vt(i):yt(i,0,255)),s=255&(e[4]?vt(s):yt(s,0,255)),n=255&(e[6]?vt(n):yt(n,0,255)),{r:i,g:s,b:n,a:o}}}(t):Bt(t)}class Zt{constructor(t){if(t instanceof Zt)return t;const e=typeof t;let i;var s,n,o;"object"===e?i=Kt(t):"string"===e&&(o=(s=t).length,"#"===s[0]&&(4===o||5===o?n={r:255&17*St[s[1]],g:255&17*St[s[2]],b:255&17*St[s[3]],a:5===o?17*St[s[4]]:255}:7!==o&&9!==o||(n={r:St[s[1]]<<4|St[s[2]],g:St[s[3]]<<4|St[s[4]],b:St[s[5]]<<4|St[s[6]],a:9===o?St[s[7]]<<4|St[s[8]]:255})),i=n||jt(t)||Gt(t)),this._rgb=i,this._valid=!!i}get valid(){return this._valid}get rgb(){var t=qt(this._rgb);return t&&(t.a=wt(t.a)),t}set rgb(t){this._rgb=Kt(t)}rgbString(){return this._valid?(t=this._rgb)&&(t.a<255?`rgba(${t.r}, ${t.g}, ${t.b}, ${wt(t.a)})`:`rgb(${t.r}, ${t.g}, ${t.b})`):void 0;var t}hexString(){return this._valid?At(this._rgb):void 0}hslString(){return this._valid?function(t){if(!t)return;const e=It(t),i=e[0],s=kt(e[1]),n=kt(e[2]);return t.a<255?`hsla(${i}, ${s}%, ${n}%, ${wt(t.a)})`:`hsl(${i}, ${s}%, ${n}%)`}(this._rgb):void 0}mix(t,e){if(t){const i=this.rgb,s=t.rgb;let n;const o=e===n?.5:e,a=2*o-1,r=i.a-s.a,l=((a*r==-1?a:(a+r)/(1+a*r))+1)/2;n=1-l,i.r=255&l*i.r+n*s.r+.5,i.g=255&l*i.g+n*s.g+.5,i.b=255&l*i.b+n*s.b+.5,i.a=o*i.a+(1-o)*s.a,this.rgb=i}return this}interpolate(t,e){return t&&(this._rgb=function(t,e,i){const s=Ut(wt(t.r)),n=Ut(wt(t.g)),o=Ut(wt(t.b));return{r:Mt(Yt(s+i*(Ut(wt(e.r))-s))),g:Mt(Yt(n+i*(Ut(wt(e.g))-n))),b:Mt(Yt(o+i*(Ut(wt(e.b))-o))),a:t.a+i*(e.a-t.a)}}(this._rgb,t._rgb,e)),this}clone(){return new Zt(this.rgb)}alpha(t){return this._rgb.a=Mt(t),this}clearer(t){return this._rgb.a*=1-t,this}greyscale(){const t=this._rgb,e=_t(.3*t.r+.59*t.g+.11*t.b);return t.r=t.g=t.b=e,this}opaquer(t){return this._rgb.a*=1+t,this}negate(){const t=this._rgb;return t.r=255-t.r,t.g=255-t.g,t.b=255-t.b,this}lighten(t){return Xt(this._rgb,2,t),this}darken(t){return Xt(this._rgb,2,-t),this}saturate(t){return Xt(this._rgb,1,t),this}desaturate(t){return Xt(this._rgb,1,-t),this}rotate(t){return function(t,e){var i=It(t);i[0]=Vt(i[0]+e),i=Ft(i),t.r=i[0],t.g=i[1],t.b=i[2]}(this._rgb,t),this}}function Jt(t){if(t&&"object"==typeof t){const e=t.toString();return"[object CanvasPattern]"===e||"[object CanvasGradient]"===e}return!1}function Qt(t){return Jt(t)?t:new Zt(t)}function te(t){return Jt(t)?t:new Zt(t).saturate(.5).darken(.1).hexString()}const ee=["x","y","borderWidth","radius","tension"],ie=["color","borderColor","backgroundColor"];const se=new Map;function ne(t,e,i){return function(t,e){e=e||{};const i=t+JSON.stringify(e);let s=se.get(i);return s||(s=new Intl.NumberFormat(t,e),se.set(i,s)),s}(e,i).format(t)}const oe={values:t=>n(t)?t:""+t,numeric(t,e,i){if(0===t)return"0";const s=this.chart.options.locale;let n,o=t;if(i.length>1){const e=Math.max(Math.abs(i[0].value),Math.abs(i[i.length-1].value));(e<1e-4||e>1e15)&&(n="scientific"),o=function(t,e){let 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)}const a=z(Math.abs(o)),r=Math.max(Math.min(-1*Math.floor(a),20),0),l={notation:n,minimumFractionDigits:r,maximumFractionDigits:r};return Object.assign(l,this.options.ticks.format),ne(t,s,l)},logarithmic(t,e,i){if(0===t)return"0";const s=i[e].significand||t/Math.pow(10,Math.floor(z(t)));return[1,2,3,5,10,15].includes(s)||e>.8*i.length?oe.numeric.call(this,t,e,i):""}};var ae={formatters:oe};const re=Object.create(null),le=Object.create(null);function he(t,e){if(!e)return t;const i=e.split(".");for(let e=0,s=i.length;et.chart.platform.getDevicePixelRatio(),this.elements={},this.events=["mousemove","mouseout","click","touchstart","touchmove"],this.font={family:"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif",size:12,style:"normal",lineHeight:1.2,weight:null},this.hover={},this.hoverBackgroundColor=(t,e)=>te(e.backgroundColor),this.hoverBorderColor=(t,e)=>te(e.borderColor),this.hoverColor=(t,e)=>te(e.color),this.indexAxis="x",this.interaction={mode:"nearest",intersect:!0,includeInvisible:!1},this.maintainAspectRatio=!0,this.onHover=null,this.onClick=null,this.parsing=!0,this.plugins={},this.responsive=!0,this.scale=void 0,this.scales={},this.showLine=!0,this.drawActiveElementsOnTop=!0,this.describe(t),this.apply(e)}set(t,e){return ce(this,t,e)}get(t){return he(this,t)}describe(t,e){return ce(le,t,e)}override(t,e){return ce(re,t,e)}route(t,e,i,s){const n=he(this,t),a=he(this,i),r="_"+e;Object.defineProperties(n,{[r]:{value:n[e],writable:!0},[e]:{enumerable:!0,get(){const t=this[r],e=a[s];return o(t)?Object.assign({},e,t):l(t,e)},set(t){this[r]=t}}})}apply(t){t.forEach((t=>t(this)))}}var ue=new de({_scriptable:t=>!t.startsWith("on"),_indexable:t=>"events"!==t,hover:{_fallback:"interaction"},interaction:{_scriptable:!1,_indexable:!1}},[function(t){t.set("animation",{delay:void 0,duration:1e3,easing:"easeOutQuart",fn:void 0,from:void 0,loop:void 0,to:void 0,type:void 0}),t.describe("animation",{_fallback:!1,_indexable:!1,_scriptable:t=>"onProgress"!==t&&"onComplete"!==t&&"fn"!==t}),t.set("animations",{colors:{type:"color",properties:ie},numbers:{type:"number",properties:ee}}),t.describe("animations",{_fallback:"animation"}),t.set("transitions",{active:{animation:{duration:400}},resize:{animation:{duration:0}},show:{animations:{colors:{from:"transparent"},visible:{type:"boolean",duration:0}}},hide:{animations:{colors:{to:"transparent"},visible:{type:"boolean",easing:"linear",fn:t=>0|t}}}})},function(t){t.set("layout",{autoPadding:!0,padding:{top:0,right:0,bottom:0,left:0}})},function(t){t.set("scale",{display:!0,offset:!1,reverse:!1,beginAtZero:!1,bounds:"ticks",grace:0,grid:{display:!0,lineWidth:1,drawOnChartArea:!0,drawTicks:!0,tickLength:8,tickWidth:(t,e)=>e.lineWidth,tickColor:(t,e)=>e.color,offset:!1},border:{display:!0,dash:[],dashOffset:0,width:1},title:{display:!1,text:"",padding:{top:4,bottom:4}},ticks:{minRotation:0,maxRotation:50,mirror:!1,textStrokeWidth:0,textStrokeColor:"",padding:3,display:!0,autoSkip:!0,autoSkipPadding:3,labelOffset:0,callback:ae.formatters.values,minor:{},major:{},align:"center",crossAlign:"near",showLabelBackdrop:!1,backdropColor:"rgba(255, 255, 255, 0.75)",backdropPadding:2}}),t.route("scale.ticks","color","","color"),t.route("scale.grid","color","","borderColor"),t.route("scale.border","color","","borderColor"),t.route("scale.title","color","","color"),t.describe("scale",{_fallback:!1,_scriptable:t=>!t.startsWith("before")&&!t.startsWith("after")&&"callback"!==t&&"parser"!==t,_indexable:t=>"borderDash"!==t&&"tickBorderDash"!==t&&"dash"!==t}),t.describe("scales",{_fallback:"scale"}),t.describe("scale.ticks",{_scriptable:t=>"backdropPadding"!==t&&"callback"!==t,_indexable:t=>"backdropPadding"!==t})}]);function fe(){return"undefined"!=typeof window&&"undefined"!=typeof document}function ge(t){let e=t.parentNode;return e&&"[object ShadowRoot]"===e.toString()&&(e=e.host),e}function pe(t,e,i){let s;return"string"==typeof t?(s=parseInt(t,10),-1!==t.indexOf("%")&&(s=s/100*e.parentNode[i])):s=t,s}const me=t=>t.ownerDocument.defaultView.getComputedStyle(t,null);function be(t,e){return me(t).getPropertyValue(e)}const xe=["top","right","bottom","left"];function _e(t,e,i){const s={};i=i?"-"+i:"";for(let n=0;n<4;n++){const o=xe[n];s[o]=parseFloat(t[e+"-"+o+i])||0}return s.width=s.left+s.right,s.height=s.top+s.bottom,s}function ye(t,e){if("native"in t)return t;const{canvas:i,currentDevicePixelRatio:s}=e,n=me(i),o="border-box"===n.boxSizing,a=_e(n,"padding"),r=_e(n,"border","width"),{x:l,y:h,box:c}=function(t,e){const i=t.touches,s=i&&i.length?i[0]:t,{offsetX:n,offsetY:o}=s;let a,r,l=!1;if(((t,e,i)=>(t>0||e>0)&&(!i||!i.shadowRoot))(n,o,t.target))a=n,r=o;else{const t=e.getBoundingClientRect();a=s.clientX-t.left,r=s.clientY-t.top,l=!0}return{x:a,y:r,box:l}}(t,i),d=a.left+(c&&r.left),u=a.top+(c&&r.top);let{width:f,height:g}=e;return o&&(f-=a.width+r.width,g-=a.height+r.height),{x:Math.round((l-d)/f*i.width/s),y:Math.round((h-u)/g*i.height/s)}}const ve=t=>Math.round(10*t)/10;function Me(t,e,i,s){const n=me(t),o=_e(n,"margin"),a=pe(n.maxWidth,t,"clientWidth")||T,r=pe(n.maxHeight,t,"clientHeight")||T,l=function(t,e,i){let s,n;if(void 0===e||void 0===i){const o=ge(t);if(o){const t=o.getBoundingClientRect(),a=me(o),r=_e(a,"border","width"),l=_e(a,"padding");e=t.width-l.width-r.width,i=t.height-l.height-r.height,s=pe(a.maxWidth,o,"clientWidth"),n=pe(a.maxHeight,o,"clientHeight")}else e=t.clientWidth,i=t.clientHeight}return{width:e,height:i,maxWidth:s||T,maxHeight:n||T}}(t,e,i);let{width:h,height:c}=l;if("content-box"===n.boxSizing){const t=_e(n,"border","width"),e=_e(n,"padding");h-=e.width+t.width,c-=e.height+t.height}h=Math.max(0,h-o.width),c=Math.max(0,s?h/s:c-o.height),h=ve(Math.min(h,a,l.maxWidth)),c=ve(Math.min(c,r,l.maxHeight)),h&&!c&&(c=ve(h/2));return(void 0!==e||void 0!==i)&&s&&l.height&&c>l.height&&(c=l.height,h=ve(Math.floor(c*s))),{width:h,height:c}}function we(t,e,i){const s=e||1,n=Math.floor(t.height*s),o=Math.floor(t.width*s);t.height=Math.floor(t.height),t.width=Math.floor(t.width);const a=t.canvas;return a.style&&(i||!a.style.height&&!a.style.width)&&(a.style.height=`${t.height}px`,a.style.width=`${t.width}px`),(t.currentDevicePixelRatio!==s||a.height!==n||a.width!==o)&&(t.currentDevicePixelRatio=s,a.height=n,a.width=o,t.ctx.setTransform(s,0,0,s,0,0),!0)}const ke=function(){let t=!1;try{const e={get passive(){return t=!0,!1}};window.addEventListener("test",null,e),window.removeEventListener("test",null,e)}catch(t){}return t}();function Se(t,e){const i=be(t,e),s=i&&i.match(/^(\d+)(\.\d+)?px$/);return s?+s[1]:void 0}function Pe(t){return!t||s(t.size)||s(t.family)?null:(t.style?t.style+" ":"")+(t.weight?t.weight+" ":"")+t.size+"px "+t.family}function De(t,e,i,s,n){let o=e[n];return o||(o=e[n]=t.measureText(n).width,i.push(n)),o>s&&(s=o),s}function Ce(t,e,i,s){let o=(s=s||{}).data=s.data||{},a=s.garbageCollect=s.garbageCollect||[];s.font!==e&&(o=s.data={},a=s.garbageCollect=[],s.font=e),t.save(),t.font=e;let r=0;const l=i.length;let h,c,d,u,f;for(h=0;hi.length){for(h=0;h0&&t.stroke()}}function Ee(t,e,i){return i=i||.5,!e||t&&t.x>e.left-i&&t.xe.top-i&&t.y0&&""!==r.strokeColor;let c,d;for(t.save(),t.font=a.string,function(t,e){e.translation&&t.translate(e.translation[0],e.translation[1]);s(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,r),c=0;ct[0])){k(s)||(s=Qe("_fallback",t));const o={[Symbol.toStringTag]:"Object",_cacheable:!0,_scopes:t,_rootScopes:i,_fallback:s,_getTarget:n,override:n=>He([n,...t],e,i,s)};return new Proxy(o,{deleteProperty:(e,i)=>(delete e[i],delete e._keys,delete t[0][i],!0),get:(i,s)=>Xe(i,s,(()=>function(t,e,i,s){let n;for(const o of e)if(n=Qe(Ye(o,t),i),k(n))return Ue(t,n)?Ze(i,s,t,n):n}(s,e,t,i))),getOwnPropertyDescriptor:(t,e)=>Reflect.getOwnPropertyDescriptor(t._scopes[0],e),getPrototypeOf:()=>Reflect.getPrototypeOf(t[0]),has:(t,e)=>ti(t).includes(e),ownKeys:t=>ti(t),set(t,e,i){const s=t._storage||(t._storage=n());return t[e]=s[e]=i,delete t._keys,!0}})}function je(t,e,i,s){const a={_cacheable:!1,_proxy:t,_context:e,_subProxy:i,_stack:new Set,_descriptors:$e(t,s),setContext:e=>je(t,e,i,s),override:n=>je(t.override(n),e,i,s)};return new Proxy(a,{deleteProperty:(e,i)=>(delete e[i],delete t[i],!0),get:(t,e,i)=>Xe(t,e,(()=>function(t,e,i){const{_proxy:s,_context:a,_subProxy:r,_descriptors:l}=t;let h=s[e];S(h)&&l.isScriptable(e)&&(h=function(t,e,i,s){const{_proxy:n,_context:o,_subProxy:a,_stack:r}=i;if(r.has(t))throw new Error("Recursion detected: "+Array.from(r).join("->")+"->"+t);r.add(t),e=e(o,a||s),r.delete(t),Ue(t,e)&&(e=Ze(n._scopes,n,t,e));return e}(e,h,t,i));n(h)&&h.length&&(h=function(t,e,i,s){const{_proxy:n,_context:a,_subProxy:r,_descriptors:l}=i;if(k(a.index)&&s(t))e=e[a.index%e.length];else if(o(e[0])){const i=e,s=n._scopes.filter((t=>t!==i));e=[];for(const o of i){const i=Ze(s,n,t,o);e.push(je(i,a,r&&r[t],l))}}return e}(e,h,t,l.isIndexable));Ue(e,h)&&(h=je(h,a,r&&r[e],l));return h}(t,e,i))),getOwnPropertyDescriptor:(e,i)=>e._descriptors.allKeys?Reflect.has(t,i)?{enumerable:!0,configurable:!0}:void 0:Reflect.getOwnPropertyDescriptor(t,i),getPrototypeOf:()=>Reflect.getPrototypeOf(t),has:(e,i)=>Reflect.has(t,i),ownKeys:()=>Reflect.ownKeys(t),set:(e,i,s)=>(t[i]=s,delete e[i],!0)})}function $e(t,e={scriptable:!0,indexable:!0}){const{_scriptable:i=e.scriptable,_indexable:s=e.indexable,_allKeys:n=e.allKeys}=t;return{allKeys:n,scriptable:i,indexable:s,isScriptable:S(i)?i:()=>i,isIndexable:S(s)?s:()=>s}}const Ye=(t,e)=>t?t+w(e):e,Ue=(t,e)=>o(e)&&"adapters"!==t&&(null===Object.getPrototypeOf(e)||e.constructor===Object);function Xe(t,e,i){if(Object.prototype.hasOwnProperty.call(t,e))return t[e];const s=i();return t[e]=s,s}function qe(t,e,i){return S(t)?t(e,i):t}const Ke=(t,e)=>!0===t?e:"string"==typeof t?M(e,t):void 0;function Ge(t,e,i,s,n){for(const o of e){const e=Ke(i,o);if(e){t.add(e);const o=qe(e._fallback,i,n);if(k(o)&&o!==i&&o!==s)return o}else if(!1===e&&k(s)&&i!==s)return null}return!1}function Ze(t,e,i,s){const a=e._rootScopes,r=qe(e._fallback,i,s),l=[...t,...a],h=new Set;h.add(s);let c=Je(h,l,i,r||i,s);return null!==c&&((!k(r)||r===i||(c=Je(h,l,r,c,s),null!==c))&&He(Array.from(h),[""],a,r,(()=>function(t,e,i){const s=t._getTarget();e in s||(s[e]={});const a=s[e];if(n(a)&&o(i))return i;return a||{}}(e,i,s))))}function Je(t,e,i,s,n){for(;i;)i=Ge(t,e,i,s,n);return i}function Qe(t,e){for(const i of e){if(!i)continue;const e=i[t];if(k(e))return e}}function ti(t){let e=t._keys;return e||(e=t._keys=function(t){const e=new Set;for(const i of t)for(const t of Object.keys(i).filter((t=>!t.startsWith("_"))))e.add(t);return Array.from(e)}(t._scopes)),e}function ei(t,e,i,s){const{iScale:n}=t,{key:o="r"}=this._parsing,a=new Array(s);let r,l,h,c;for(r=0,l=s;re"x"===t?"y":"x";function oi(t,e,i,s){const n=t.skip?e:t,o=e,a=i.skip?e:i,r=q(o,n),l=q(a,o);let h=r/(r+l),c=l/(r+l);h=isNaN(h)?0:h,c=isNaN(c)?0:c;const d=s*h,u=s*c;return{previous:{x:o.x-d*(a.x-n.x),y:o.y-d*(a.y-n.y)},next:{x:o.x+u*(a.x-n.x),y:o.y+u*(a.y-n.y)}}}function ai(t,e="x"){const i=ni(e),s=t.length,n=Array(s).fill(0),o=Array(s);let a,r,l,h=si(t,0);for(a=0;a!t.skip))),"monotone"===e.cubicInterpolationMode)ai(t,n);else{let i=s?t[t.length-1]:t[0];for(o=0,a=t.length;o0===t||1===t,ci=(t,e,i)=>-Math.pow(2,10*(t-=1))*Math.sin((t-e)*O/i),di=(t,e,i)=>Math.pow(2,-10*t)*Math.sin((t-e)*O/i)+1,ui={linear:t=>t,easeInQuad:t=>t*t,easeOutQuad:t=>-t*(t-2),easeInOutQuad:t=>(t/=.5)<1?.5*t*t:-.5*(--t*(t-2)-1),easeInCubic:t=>t*t*t,easeOutCubic:t=>(t-=1)*t*t+1,easeInOutCubic:t=>(t/=.5)<1?.5*t*t*t:.5*((t-=2)*t*t+2),easeInQuart:t=>t*t*t*t,easeOutQuart:t=>-((t-=1)*t*t*t-1),easeInOutQuart:t=>(t/=.5)<1?.5*t*t*t*t:-.5*((t-=2)*t*t*t-2),easeInQuint:t=>t*t*t*t*t,easeOutQuint:t=>(t-=1)*t*t*t*t+1,easeInOutQuint:t=>(t/=.5)<1?.5*t*t*t*t*t:.5*((t-=2)*t*t*t*t+2),easeInSine:t=>1-Math.cos(t*E),easeOutSine:t=>Math.sin(t*E),easeInOutSine:t=>-.5*(Math.cos(C*t)-1),easeInExpo:t=>0===t?0:Math.pow(2,10*(t-1)),easeOutExpo:t=>1===t?1:1-Math.pow(2,-10*t),easeInOutExpo:t=>hi(t)?t:t<.5?.5*Math.pow(2,10*(2*t-1)):.5*(2-Math.pow(2,-10*(2*t-1))),easeInCirc:t=>t>=1?t:-(Math.sqrt(1-t*t)-1),easeOutCirc:t=>Math.sqrt(1-(t-=1)*t),easeInOutCirc:t=>(t/=.5)<1?-.5*(Math.sqrt(1-t*t)-1):.5*(Math.sqrt(1-(t-=2)*t)+1),easeInElastic:t=>hi(t)?t:ci(t,.075,.3),easeOutElastic:t=>hi(t)?t:di(t,.075,.3),easeInOutElastic(t){const e=.1125;return hi(t)?t:t<.5?.5*ci(2*t,e,.45):.5+.5*di(2*t-1,e,.45)},easeInBack(t){const e=1.70158;return t*t*((e+1)*t-e)},easeOutBack(t){const e=1.70158;return(t-=1)*t*((e+1)*t+e)+1},easeInOutBack(t){let 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:t=>1-ui.easeOutBounce(1-t),easeOutBounce(t){const 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:t=>t<.5?.5*ui.easeInBounce(2*t):.5*ui.easeOutBounce(2*t-1)+.5};function fi(t,e,i,s){return{x:t.x+i*(e.x-t.x),y:t.y+i*(e.y-t.y)}}function gi(t,e,i,s){return{x:t.x+i*(e.x-t.x),y:"middle"===s?i<.5?t.y:e.y:"after"===s?i<1?t.y:e.y:i>0?e.y:t.y}}function pi(t,e,i,s){const n={x:t.cp2x,y:t.cp2y},o={x:e.cp1x,y:e.cp1y},a=fi(t,n,i),r=fi(n,o,i),l=fi(o,e,i),h=fi(a,r,i),c=fi(r,l,i);return fi(h,c,i)}const mi=/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/,bi=/^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;function xi(t,e){const i=(""+t).match(mi);if(!i||"normal"===i[1])return 1.2*e;switch(t=+i[2],i[3]){case"px":return t;case"%":t/=100}return e*t}function _i(t,e){const i={},s=o(e),n=s?Object.keys(e):e,a=o(t)?s?i=>l(t[i],t[e[i]]):e=>t[e]:()=>t;for(const t of n)i[t]=+a(t)||0;return i}function yi(t){return _i(t,{top:"y",right:"x",bottom:"y",left:"x"})}function vi(t){return _i(t,["topLeft","topRight","bottomLeft","bottomRight"])}function Mi(t){const e=yi(t);return e.width=e.left+e.right,e.height=e.top+e.bottom,e}function wi(t,e){t=t||{},e=e||ue.font;let i=l(t.size,e.size);"string"==typeof i&&(i=parseInt(i,10));let s=l(t.style,e.style);s&&!(""+s).match(bi)&&(console.warn('Invalid font style specified: "'+s+'"'),s=void 0);const n={family:l(t.family,e.family),lineHeight:xi(l(t.lineHeight,e.lineHeight),i),size:i,style:s,weight:l(t.weight,e.weight),string:""};return n.string=Pe(n),n}function ki(t,e,i,s){let o,a,r,l=!0;for(o=0,a=t.length;oi&&0===t?0:t+e;return{min:a(s,-Math.abs(o)),max:a(n,o)}}function Pi(t,e){return Object.assign(Object.create(t),e)}function Di(t,e,i){return t?function(t,e){return{x:i=>t+t+e-i,setWidth(t){e=t},textAlign:t=>"center"===t?t:"right"===t?"left":"right",xPlus:(t,e)=>t-e,leftForLtr:(t,e)=>t-e}}(e,i):{x:t=>t,setWidth(t){},textAlign:t=>t,xPlus:(t,e)=>t+e,leftForLtr:(t,e)=>t}}function Ci(t,e){let i,s;"ltr"!==e&&"rtl"!==e||(i=t.canvas.style,s=[i.getPropertyValue("direction"),i.getPropertyPriority("direction")],i.setProperty("direction",e,"important"),t.prevTextDirection=s)}function Oi(t,e){void 0!==e&&(delete t.prevTextDirection,t.canvas.style.setProperty("direction",e[0],e[1]))}function Ai(t){return"angle"===t?{between:Z,compare:K,normalize:G}:{between:tt,compare:(t,e)=>t-e,normalize:t=>t}}function Ti({start:t,end:e,count:i,loop:s,style:n}){return{start:t%i,end:e%i,loop:s&&(e-t+1)%i==0,style:n}}function Li(t,e,i){if(!i)return[t];const{property:s,start:n,end:o}=i,a=e.length,{compare:r,between:l,normalize:h}=Ai(s),{start:c,end:d,loop:u,style:f}=function(t,e,i){const{property:s,start:n,end:o}=i,{between:a,normalize:r}=Ai(s),l=e.length;let h,c,{start:d,end:u,loop:f}=t;if(f){for(d+=l,u+=l,h=0,c=l;hx||l(n,b,p)&&0!==r(n,b),v=()=>!x||0===r(o,p)||l(o,b,p);for(let t=c,i=c;t<=d;++t)m=e[t%a],m.skip||(p=h(m[s]),p!==b&&(x=l(p,n,o),null===_&&y()&&(_=0===r(p,n)?t:i),null!==_&&v()&&(g.push(Ti({start:_,end:t,loop:u,count:a,style:f})),_=null),i=t,b=p));return null!==_&&g.push(Ti({start:_,end:d,loop:u,count:a,style:f})),g}function Ei(t,e){const i=[],s=t.segments;for(let n=0;nn&&t[o%e].skip;)o--;return o%=e,{start:n,end:o}}(i,n,o,s);if(!0===s)return Ii(t,[{start:a,end:r,loop:o}],i,e);return Ii(t,function(t,e,i,s){const n=t.length,o=[];let a,r=e,l=t[e];for(a=e+1;a<=i;++a){const i=t[a%n];i.skip||i.stop?l.skip||(s=!1,o.push({start:e%n,end:(a-1)%n,loop:s}),e=r=i.stop?a:null):(r=a,l.skip&&(e=a)),l=i}return null!==r&&o.push({start:e%n,end:r%n,loop:s}),o}(i,a,r{t[a](e[i],n)&&(o.push({element:t,datasetIndex:s,index:l}),r=r||t.inRange(e.x,e.y,n))})),s&&!r?[]:o}var Yi={evaluateInteractionItems:Ni,modes:{index(t,e,i,s){const n=ye(e,t),o=i.axis||"x",a=i.includeInvisible||!1,r=i.intersect?Wi(t,n,o,s,a):ji(t,n,o,!1,s,a),l=[];return r.length?(t.getSortedVisibleDatasetMetas().forEach((t=>{const e=r[0].index,i=t.data[e];i&&!i.skip&&l.push({element:i,datasetIndex:t.index,index:e})})),l):[]},dataset(t,e,i,s){const n=ye(e,t),o=i.axis||"xy",a=i.includeInvisible||!1;let r=i.intersect?Wi(t,n,o,s,a):ji(t,n,o,!1,s,a);if(r.length>0){const e=r[0].datasetIndex,i=t.getDatasetMeta(e).data;r=[];for(let t=0;tWi(t,ye(e,t),i.axis||"xy",s,i.includeInvisible||!1),nearest(t,e,i,s){const n=ye(e,t),o=i.axis||"xy",a=i.includeInvisible||!1;return ji(t,n,o,i.intersect,s,a)},x:(t,e,i,s)=>$i(t,ye(e,t),"x",i.intersect,s),y:(t,e,i,s)=>$i(t,ye(e,t),"y",i.intersect,s)}};const Ui=["left","top","right","bottom"];function Xi(t,e){return t.filter((t=>t.pos===e))}function qi(t,e){return t.filter((t=>-1===Ui.indexOf(t.pos)&&t.box.axis===e))}function Ki(t,e){return t.sort(((t,i)=>{const s=e?i:t,n=e?t:i;return s.weight===n.weight?s.index-n.index:s.weight-n.weight}))}function Gi(t,e){const i=function(t){const e={};for(const i of t){const{stack:t,pos:s,stackWeight:n}=i;if(!t||!Ui.includes(s))continue;const o=e[t]||(e[t]={count:0,placed:0,weight:0,size:0});o.count++,o.weight+=n}return e}(t),{vBoxMaxWidth:s,hBoxMaxHeight:n}=e;let o,a,r;for(o=0,a=t.length;o{s[t]=Math.max(e[t],i[t])})),s}return s(t?["left","right"]:["top","bottom"])}function es(t,e,i,s){const n=[];let o,a,r,l,h,c;for(o=0,a=t.length,h=0;ot.box.fullSize)),!0),s=Ki(Xi(e,"left"),!0),n=Ki(Xi(e,"right")),o=Ki(Xi(e,"top"),!0),a=Ki(Xi(e,"bottom")),r=qi(e,"x"),l=qi(e,"y");return{fullSize:i,leftAndTop:s.concat(o),rightAndBottom:n.concat(l).concat(a).concat(r),chartArea:Xi(e,"chartArea"),vertical:s.concat(n).concat(l),horizontal:o.concat(a).concat(r)}}(t.boxes),l=r.vertical,h=r.horizontal;u(t.boxes,(t=>{"function"==typeof t.beforeLayout&&t.beforeLayout()}));const c=l.reduce(((t,e)=>e.box.options&&!1===e.box.options.display?t:t+1),0)||1,d=Object.freeze({outerWidth:e,outerHeight:i,padding:n,availableWidth:o,availableHeight:a,vBoxMaxWidth:o/2/c,hBoxMaxHeight:a/2}),f=Object.assign({},n);Ji(f,Mi(s));const g=Object.assign({maxPadding:f,w:o,h:a,x:n.left,y:n.top},n),p=Gi(l.concat(h),d);es(r.fullSize,g,d,p),es(l,g,d,p),es(h,g,d,p)&&es(l,g,d,p),function(t){const e=t.maxPadding;function i(i){const s=Math.max(e[i]-t[i],0);return t[i]+=s,s}t.y+=i("top"),t.x+=i("left"),i("right"),i("bottom")}(g),ss(r.leftAndTop,g,d,p),g.x+=g.w,g.y+=g.h,ss(r.rightAndBottom,g,d,p),t.chartArea={left:g.left,top:g.top,right:g.left+g.w,bottom:g.top+g.h,height:g.h,width:g.w},u(r.chartArea,(e=>{const i=e.box;Object.assign(i,t.chartArea),i.update(g.w,g.h,{left:0,top:0,right:0,bottom:0})}))}};class os{acquireContext(t,e){}releaseContext(t){return!1}addEventListener(t,e,i){}removeEventListener(t,e,i){}getDevicePixelRatio(){return 1}getMaximumSize(t,e,i,s){return e=Math.max(0,e||t.width),i=i||t.height,{width:e,height:Math.max(0,s?Math.floor(e/s):i)}}isAttached(t){return!0}updateConfig(t){}}class as extends os{acquireContext(t){return t&&t.getContext&&t.getContext("2d")||null}updateConfig(t){t.options.animation=!1}}const rs={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup",pointerenter:"mouseenter",pointerdown:"mousedown",pointermove:"mousemove",pointerup:"mouseup",pointerleave:"mouseout",pointerout:"mouseout"},ls=t=>null===t||""===t;const hs=!!ke&&{passive:!0};function cs(t,e,i){t.canvas.removeEventListener(e,i,hs)}function ds(t,e){for(const i of t)if(i===e||i.contains(e))return!0}function us(t,e,i){const s=t.canvas,n=new MutationObserver((t=>{let e=!1;for(const i of t)e=e||ds(i.addedNodes,s),e=e&&!ds(i.removedNodes,s);e&&i()}));return n.observe(document,{childList:!0,subtree:!0}),n}function fs(t,e,i){const s=t.canvas,n=new MutationObserver((t=>{let e=!1;for(const i of t)e=e||ds(i.removedNodes,s),e=e&&!ds(i.addedNodes,s);e&&i()}));return n.observe(document,{childList:!0,subtree:!0}),n}const gs=new Map;let ps=0;function ms(){const t=window.devicePixelRatio;t!==ps&&(ps=t,gs.forEach(((e,i)=>{i.currentDevicePixelRatio!==t&&e()})))}function bs(t,e,i){const s=t.canvas,n=s&&ge(s);if(!n)return;const o=ct(((t,e)=>{const s=n.clientWidth;i(t,e),s{const e=t[0],i=e.contentRect.width,s=e.contentRect.height;0===i&&0===s||o(i,s)}));return a.observe(n),function(t,e){gs.size||window.addEventListener("resize",ms),gs.set(t,e)}(t,o),a}function xs(t,e,i){i&&i.disconnect(),"resize"===e&&function(t){gs.delete(t),gs.size||window.removeEventListener("resize",ms)}(t)}function _s(t,e,i){const s=t.canvas,n=ct((e=>{null!==t.ctx&&i(function(t,e){const i=rs[t.type]||t.type,{x:s,y:n}=ye(t,e);return{type:i,chart:e,native:t,x:void 0!==s?s:null,y:void 0!==n?n:null}}(e,t))}),t);return function(t,e,i){t.addEventListener(e,i,hs)}(s,e,n),n}class ys extends os{acquireContext(t,e){const i=t&&t.getContext&&t.getContext("2d");return i&&i.canvas===t?(function(t,e){const i=t.style,s=t.getAttribute("height"),n=t.getAttribute("width");if(t.$chartjs={initial:{height:s,width:n,style:{display:i.display,height:i.height,width:i.width}}},i.display=i.display||"block",i.boxSizing=i.boxSizing||"border-box",ls(n)){const e=Se(t,"width");void 0!==e&&(t.width=e)}if(ls(s))if(""===t.style.height)t.height=t.width/(e||2);else{const e=Se(t,"height");void 0!==e&&(t.height=e)}}(t,e),i):null}releaseContext(t){const e=t.canvas;if(!e.$chartjs)return!1;const i=e.$chartjs.initial;["height","width"].forEach((t=>{const n=i[t];s(n)?e.removeAttribute(t):e.setAttribute(t,n)}));const n=i.style||{};return Object.keys(n).forEach((t=>{e.style[t]=n[t]})),e.width=e.width,delete e.$chartjs,!0}addEventListener(t,e,i){this.removeEventListener(t,e);const s=t.$proxies||(t.$proxies={}),n={attach:us,detach:fs,resize:bs}[e]||_s;s[e]=n(t,e,i)}removeEventListener(t,e){const i=t.$proxies||(t.$proxies={}),s=i[e];if(!s)return;({attach:xs,detach:xs,resize:xs}[e]||cs)(t,e,s),i[e]=void 0}getDevicePixelRatio(){return window.devicePixelRatio}getMaximumSize(t,e,i,s){return Me(t,e,i,s)}isAttached(t){const e=ge(t);return!(!e||!e.isConnected)}}function vs(t){return!fe()||"undefined"!=typeof OffscreenCanvas&&t instanceof OffscreenCanvas?as:ys}var Ms=Object.freeze({__proto__:null,_detectPlatform:vs,BasePlatform:os,BasicPlatform:as,DomPlatform:ys});const ws="transparent",ks={boolean:(t,e,i)=>i>.5?e:t,color(t,e,i){const s=Qt(t||ws),n=s.valid&&Qt(e||ws);return n&&n.valid?n.mix(s,i).hexString():e},number:(t,e,i)=>t+(e-t)*i};class Ss{constructor(t,e,i,s){const n=e[i];s=ki([t.to,s,n,t.from]);const o=ki([t.from,n,s]);this._active=!0,this._fn=t.fn||ks[t.type||typeof o],this._easing=ui[t.easing]||ui.linear,this._start=Math.floor(Date.now()+(t.delay||0)),this._duration=this._total=Math.floor(t.duration),this._loop=!!t.loop,this._target=e,this._prop=i,this._from=o,this._to=s,this._promises=void 0}active(){return this._active}update(t,e,i){if(this._active){this._notify(!1);const s=this._target[this._prop],n=i-this._start,o=this._duration-n;this._start=i,this._duration=Math.floor(Math.max(o,t.duration)),this._total+=n,this._loop=!!t.loop,this._to=ki([t.to,e,s,t.from]),this._from=ki([t.from,s,e])}}cancel(){this._active&&(this.tick(Date.now()),this._active=!1,this._notify(!1))}tick(t){const e=t-this._start,i=this._duration,s=this._prop,n=this._from,o=this._loop,a=this._to;let r;if(this._active=n!==a&&(o||e1?2-r:r,r=this._easing(Math.min(1,Math.max(0,r))),this._target[s]=this._fn(n,a,r))}wait(){const t=this._promises||(this._promises=[]);return new Promise(((e,i)=>{t.push({res:e,rej:i})}))}_notify(t){const e=t?"res":"rej",i=this._promises||[];for(let t=0;t{const a=t[s];if(!o(a))return;const r={};for(const t of e)r[t]=a[t];(n(a.properties)&&a.properties||[s]).forEach((t=>{t!==s&&i.has(t)||i.set(t,r)}))}))}_animateOptions(t,e){const i=e.options,s=function(t,e){if(!e)return;let i=t.options;if(!i)return void(t.options=e);i.$shared&&(t.options=i=Object.assign({},i,{$shared:!1,$animations:{}}));return i}(t,i);if(!s)return[];const n=this._createAnimations(s,i);return i.$shared&&function(t,e){const i=[],s=Object.keys(e);for(let e=0;e{t.options=i}),(()=>{})),n}_createAnimations(t,e){const i=this._properties,s=[],n=t.$animations||(t.$animations={}),o=Object.keys(e),a=Date.now();let r;for(r=o.length-1;r>=0;--r){const l=o[r];if("$"===l.charAt(0))continue;if("options"===l){s.push(...this._animateOptions(t,e));continue}const h=e[l];let c=n[l];const d=i.get(l);if(c){if(d&&c.active()){c.update(d,h,a);continue}c.cancel()}d&&d.duration?(n[l]=c=new Ss(d,t,l,h),s.push(c)):t[l]=h}return s}update(t,e){if(0===this._properties.size)return void Object.assign(t,e);const i=this._createAnimations(t,e);return i.length?(xt.add(this._chart,i),!0):void 0}}function Ds(t,e){const i=t&&t.options||{},s=i.reverse,n=void 0===i.min?e:0,o=void 0===i.max?e:0;return{start:s?o:n,end:s?n:o}}function Cs(t,e){const i=[],s=t._getSortedDatasetMetas(e);let n,o;for(n=0,o=s.length;n0||!i&&e<0)return n.index}return null}function Es(t,e){const{chart:i,_cachedMeta:s}=t,n=i._stacks||(i._stacks={}),{iScale:o,vScale:a,index:r}=s,l=o.axis,h=a.axis,c=function(t,e,i){return`${t.id}.${e.id}.${i.stack||i.type}`}(o,a,s),d=e.length;let u;for(let t=0;ti[t].axis===e)).shift()}function Is(t,e){const i=t.controller.index,s=t.vScale&&t.vScale.axis;if(s){e=e||t._parsed;for(const t of e){const e=t._stacks;if(!e||void 0===e[s]||void 0===e[s][i])return;delete e[s][i],void 0!==e[s]._visualValues&&void 0!==e[s]._visualValues[i]&&delete e[s]._visualValues[i]}}}const zs=t=>"reset"===t||"none"===t,Fs=(t,e)=>e?t:Object.assign({},t);class Vs{static defaults={};static datasetElementType=null;static dataElementType=null;constructor(t,e){this.chart=t,this._ctx=t.ctx,this.index=e,this._cachedDataOpts={},this._cachedMeta=this.getMeta(),this._type=this._cachedMeta.type,this.options=void 0,this._parsing=!1,this._data=void 0,this._objectData=void 0,this._sharedOptions=void 0,this._drawStart=void 0,this._drawCount=void 0,this.enableOptionSharing=!1,this.supportsDecimation=!1,this.$context=void 0,this._syncList=[],this.datasetElementType=new.target.datasetElementType,this.dataElementType=new.target.dataElementType,this.initialize()}initialize(){const t=this._cachedMeta;this.configure(),this.linkScales(),t._stacked=As(t.vScale,t),this.addElements(),this.options.fill&&!this.chart.isPluginEnabled("filler")&&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")}updateIndex(t){this.index!==t&&Is(this._cachedMeta),this.index=t}linkScales(){const t=this.chart,e=this._cachedMeta,i=this.getDataset(),s=(t,e,i,s)=>"x"===t?e:"r"===t?s:i,n=e.xAxisID=l(i.xAxisID,Rs(t,"x")),o=e.yAxisID=l(i.yAxisID,Rs(t,"y")),a=e.rAxisID=l(i.rAxisID,Rs(t,"r")),r=e.indexAxis,h=e.iAxisID=s(r,n,o,a),c=e.vAxisID=s(r,o,n,a);e.xScale=this.getScaleForId(n),e.yScale=this.getScaleForId(o),e.rScale=this.getScaleForId(a),e.iScale=this.getScaleForId(h),e.vScale=this.getScaleForId(c)}getDataset(){return this.chart.data.datasets[this.index]}getMeta(){return this.chart.getDatasetMeta(this.index)}getScaleForId(t){return this.chart.scales[t]}_getOtherScale(t){const e=this._cachedMeta;return t===e.iScale?e.vScale:e.iScale}reset(){this._update("reset")}_destroy(){const t=this._cachedMeta;this._data&&rt(this._data,this),t._stacked&&Is(t)}_dataCheck(){const t=this.getDataset(),e=t.data||(t.data=[]),i=this._data;if(o(e))this._data=function(t){const e=Object.keys(t),i=new Array(e.length);let s,n,o;for(s=0,n=e.length;s0&&i._parsed[t-1];if(!1===this._parsing)i._parsed=s,i._sorted=!0,d=s;else{d=n(s[t])?this.parseArrayData(i,s,t,e):o(s[t])?this.parseObjectData(i,s,t,e):this.parsePrimitiveData(i,s,t,e);const a=()=>null===c[l]||f&&c[l]t&&!e.hidden&&e._stacked&&{keys:Cs(i,!0),values:null})(e,i,this.chart),h={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY},{min:c,max:d}=function(t){const{min:e,max:i,minDefined:s,maxDefined:n}=t.getUserBounds();return{min:s?e:Number.NEGATIVE_INFINITY,max:n?i:Number.POSITIVE_INFINITY}}(r);let u,f;function g(){f=s[u];const e=f[r.axis];return!a(f[t.axis])||c>e||d=0;--u)if(!g()){this.updateRangeFromParsed(h,t,f,l);break}return h}getAllParsedValues(t){const e=this._cachedMeta._parsed,i=[];let s,n,o;for(s=0,n=e.length;s=0&&tthis.getContext(i,s,e)),c);return f.$shared&&(f.$shared=r,n[o]=Object.freeze(Fs(f,r))),f}_resolveAnimations(t,e,i){const s=this.chart,n=this._cachedDataOpts,o=`animation-${e}`,a=n[o];if(a)return a;let r;if(!1!==s.options.animation){const s=this.chart.config,n=s.datasetAnimationScopeKeys(this._type,e),o=s.getOptionScopes(this.getDataset(),n);r=s.createResolver(o,this.getContext(t,i,e))}const l=new Ps(s,r&&r.animations);return r&&r._cacheable&&(n[o]=Object.freeze(l)),l}getSharedOptions(t){if(t.$shared)return this._sharedOptions||(this._sharedOptions=Object.assign({},t))}includeOptions(t,e){return!e||zs(t)||this.chart._animationsDisabled}_getSharedOptions(t,e){const i=this.resolveDataElementOptions(t,e),s=this._sharedOptions,n=this.getSharedOptions(i),o=this.includeOptions(e,n)||n!==s;return this.updateSharedOptions(n,e,i),{sharedOptions:n,includeOptions:o}}updateElement(t,e,i,s){zs(s)?Object.assign(t,i):this._resolveAnimations(e,s).update(t,i)}updateSharedOptions(t,e,i){t&&!zs(e)&&this._resolveAnimations(void 0,e).update(t,i)}_setStyle(t,e,i,s){t.active=s;const n=this.getStyle(e,s);this._resolveAnimations(e,i,s).update(t,{options:!s&&this.getSharedOptions(n)||n})}removeHoverStyle(t,e,i){this._setStyle(t,i,"active",!1)}setHoverStyle(t,e,i){this._setStyle(t,i,"active",!0)}_removeDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!1)}_setDatasetHoverStyle(){const t=this._cachedMeta.dataset;t&&this._setStyle(t,void 0,"active",!0)}_resyncElements(t){const e=this._data,i=this._cachedMeta.data;for(const[t,e,i]of this._syncList)this[t](e,i);this._syncList=[];const s=i.length,n=e.length,o=Math.min(n,s);o&&this.parse(0,o),n>s?this._insertElements(s,n-s,t):n{for(t.length+=e,a=t.length-1;a>=o;a--)t[a]=t[a-e]};for(r(n),a=t;a{s[t]=i[t]&&i[t].active()?i[t]._to:this[t]})),s}}function Ns(t,e){const i=t.options.ticks,n=function(t){const e=t.options.offset,i=t._tickSize(),s=t._length/i+(e?0:1),n=t._maxLength/i;return Math.floor(Math.min(s,n))}(t),o=Math.min(i.maxTicksLimit||n,n),a=i.major.enabled?function(t){const e=[];let i,s;for(i=0,s=t.length;io)return function(t,e,i,s){let n,o=0,a=i[0];for(s=Math.ceil(s),n=0;nn)return e}return Math.max(n,1)}(a,e,o);if(r>0){let t,i;const n=r>1?Math.round((h-l)/(r-1)):null;for(Ws(e,c,d,s(n)?0:l-n,l),t=0,i=r-1;t"top"===e||"left"===e?t[e]+i:t[e]-i,js=(t,e)=>Math.min(e||t,t);function $s(t,e){const i=[],s=t.length/e,n=t.length;let o=0;for(;oa+r)))return h}function Us(t){return t.drawTicks?t.tickLength:0}function Xs(t,e){if(!t.display)return 0;const i=wi(t.font,e),s=Mi(t.padding);return(n(t.text)?t.text.length:1)*i.lineHeight+s.height}function qs(t,e,i){let s=ut(t);return(i&&"right"!==e||!i&&"right"===e)&&(s=(t=>"left"===t?"right":"right"===t?"left":t)(s)),s}class Ks extends Bs{constructor(t){super(),this.id=t.id,this.type=t.type,this.options=void 0,this.ctx=t.ctx,this.chart=t.chart,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this._margins={left:0,right:0,top:0,bottom:0},this.maxWidth=void 0,this.maxHeight=void 0,this.paddingTop=void 0,this.paddingBottom=void 0,this.paddingLeft=void 0,this.paddingRight=void 0,this.axis=void 0,this.labelRotation=void 0,this.min=void 0,this.max=void 0,this._range=void 0,this.ticks=[],this._gridLineItems=null,this._labelItems=null,this._labelSizes=null,this._length=0,this._maxLength=0,this._longestTextCache={},this._startPixel=void 0,this._endPixel=void 0,this._reversePixels=!1,this._userMax=void 0,this._userMin=void 0,this._suggestedMax=void 0,this._suggestedMin=void 0,this._ticksLength=0,this._borderValue=0,this._cache={},this._dataLimitsCached=!1,this.$context=void 0}init(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)}parse(t,e){return t}getUserBounds(){let{_userMin:t,_userMax:e,_suggestedMin:i,_suggestedMax:s}=this;return t=r(t,Number.POSITIVE_INFINITY),e=r(e,Number.NEGATIVE_INFINITY),i=r(i,Number.POSITIVE_INFINITY),s=r(s,Number.NEGATIVE_INFINITY),{min:r(t,i),max:r(e,s),minDefined:a(t),maxDefined:a(e)}}getMinMax(t){let e,{min:i,max:s,minDefined:n,maxDefined:o}=this.getUserBounds();if(n&&o)return{min:i,max:s};const a=this.getMatchingVisibleMetas();for(let r=0,l=a.length;rs?s:i,s=n&&i>s?i:s,{min:r(i,r(s,i)),max:r(s,r(i,s))}}getPadding(){return{left:this.paddingLeft||0,top:this.paddingTop||0,right:this.paddingRight||0,bottom:this.paddingBottom||0}}getTicks(){return this.ticks}getLabels(){const t=this.chart.data;return this.options.labels||(this.isHorizontal()?t.xLabels:t.yLabels)||t.labels||[]}getLabelItems(t=this.chart.chartArea){return this._labelItems||(this._labelItems=this._computeLabelItems(t))}beforeLayout(){this._cache={},this._dataLimitsCached=!1}beforeUpdate(){d(this.options.beforeUpdate,[this])}update(t,e,i){const{beginAtZero:s,grace:n,ticks:o}=this.options,a=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=Si(this,n,s),this._dataLimitsCached=!0),this.beforeBuildTicks(),this.ticks=this.buildTicks()||[],this.afterBuildTicks();const r=a=n||i<=1||!this.isHorizontal())return void(this.labelRotation=s);const h=this._getLabelSizes(),c=h.widest.width,d=h.highest.height,u=J(this.chart.width-c,0,this.maxWidth);o=t.offset?this.maxWidth/i:u/(i-1),c+6>o&&(o=u/(i-(t.offset?.5:1)),a=this.maxHeight-Us(t.grid)-e.padding-Xs(t.title,this.chart.options.font),r=Math.sqrt(c*c+d*d),l=Y(Math.min(Math.asin(J((h.highest.height+6)/o,-1,1)),Math.asin(J(a/r,-1,1))-Math.asin(J(d/r,-1,1)))),l=Math.max(s,Math.min(n,l))),this.labelRotation=l}afterCalculateLabelRotation(){d(this.options.afterCalculateLabelRotation,[this])}afterAutoSkip(){}beforeFit(){d(this.options.beforeFit,[this])}fit(){const t={width:0,height:0},{chart:e,options:{ticks:i,title:s,grid:n}}=this,o=this._isVisible(),a=this.isHorizontal();if(o){const o=Xs(s,e.options.font);if(a?(t.width=this.maxWidth,t.height=Us(n)+o):(t.height=this.maxHeight,t.width=Us(n)+o),i.display&&this.ticks.length){const{first:e,last:s,widest:n,highest:o}=this._getLabelSizes(),r=2*i.padding,l=$(this.labelRotation),h=Math.cos(l),c=Math.sin(l);if(a){const e=i.mirror?0:c*n.width+h*o.height;t.height=Math.min(this.maxHeight,t.height+e+r)}else{const e=i.mirror?0:h*n.width+c*o.height;t.width=Math.min(this.maxWidth,t.width+e+r)}this._calculatePadding(e,s,c,h)}}this._handleMargins(),a?(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)}_calculatePadding(t,e,i,s){const{ticks:{align:n,padding:o},position:a}=this.options,r=0!==this.labelRotation,l="top"!==a&&"x"===this.axis;if(this.isHorizontal()){const a=this.getPixelForTick(0)-this.left,h=this.right-this.getPixelForTick(this.ticks.length-1);let c=0,d=0;r?l?(c=s*t.width,d=i*e.height):(c=i*t.height,d=s*e.width):"start"===n?d=e.width:"end"===n?c=t.width:"inner"!==n&&(c=t.width/2,d=e.width/2),this.paddingLeft=Math.max((c-a+o)*this.width/(this.width-a),0),this.paddingRight=Math.max((d-h+o)*this.width/(this.width-h),0)}else{let i=e.height/2,s=t.height/2;"start"===n?(i=0,s=t.height):"end"===n&&(i=e.height,s=0),this.paddingTop=i+o,this.paddingBottom=s+o}}_handleMargins(){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))}afterFit(){d(this.options.afterFit,[this])}isHorizontal(){const{axis:t,position:e}=this.options;return"top"===e||"bottom"===e||"x"===t}isFullSize(){return this.options.fullSize}_convertTicksToLabels(t){let e,i;for(this.beforeTickToLabelConversion(),this.generateTickLabels(t),e=0,i=t.length;e{const i=t.gc,s=i.length/2;let n;if(s>e){for(n=0;n({width:r[t]||0,height:l[t]||0});return{first:P(0),last:P(e-1),widest:P(k),highest:P(S),widths:r,heights:l}}getLabelForValue(t){return t}getPixelForValue(t,e){return NaN}getValueForPixel(t){}getPixelForTick(t){const e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getPixelForDecimal(t){this._reversePixels&&(t=1-t);const e=this._startPixel+t*this._length;return Q(this._alignToPixels?Oe(this.chart,e,0):e)}getDecimalForPixel(t){const e=(t-this._startPixel)/this._length;return this._reversePixels?1-e:e}getBasePixel(){return this.getPixelForValue(this.getBaseValue())}getBaseValue(){const{min:t,max:e}=this;return t<0&&e<0?e:t>0&&e>0?t:0}getContext(t){const e=this.ticks||[];if(t>=0&&ta*s?a/i:r/s:r*s0}_computeGridLineItems(t){const e=this.axis,i=this.chart,s=this.options,{grid:n,position:a,border:r}=s,h=n.offset,c=this.isHorizontal(),d=this.ticks.length+(h?1:0),u=Us(n),f=[],g=r.setContext(this.getContext()),p=g.display?g.width:0,m=p/2,b=function(t){return Oe(i,t,p)};let x,_,y,v,M,w,k,S,P,D,C,O;if("top"===a)x=b(this.bottom),w=this.bottom-u,S=x-m,D=b(t.top)+m,O=t.bottom;else if("bottom"===a)x=b(this.top),D=t.top,O=b(t.bottom)-m,w=x+m,S=this.top+u;else if("left"===a)x=b(this.right),M=this.right-u,k=x-m,P=b(t.left)+m,C=t.right;else if("right"===a)x=b(this.left),P=t.left,C=b(t.right)-m,M=x+m,k=this.left+u;else if("x"===e){if("center"===a)x=b((t.top+t.bottom)/2+.5);else if(o(a)){const t=Object.keys(a)[0],e=a[t];x=b(this.chart.scales[t].getPixelForValue(e))}D=t.top,O=t.bottom,w=x+m,S=w+u}else if("y"===e){if("center"===a)x=b((t.left+t.right)/2);else if(o(a)){const t=Object.keys(a)[0],e=a[t];x=b(this.chart.scales[t].getPixelForValue(e))}M=x-m,k=M-u,P=t.left,C=t.right}const A=l(s.ticks.maxTicksLimit,d),T=Math.max(1,Math.ceil(d/A));for(_=0;_e.value===t));if(i>=0){return e.setContext(this.getContext(i)).lineWidth}return 0}drawGrid(t){const e=this.options.grid,i=this.ctx,s=this._gridLineItems||(this._gridLineItems=this._computeGridLineItems(t));let n,o;const a=(t,e,s)=>{s.width&&s.color&&(i.save(),i.lineWidth=s.width,i.strokeStyle=s.color,i.setLineDash(s.borderDash||[]),i.lineDashOffset=s.borderDashOffset,i.beginPath(),i.moveTo(t.x,t.y),i.lineTo(e.x,e.y),i.stroke(),i.restore())};if(e.display)for(n=0,o=s.length;n{this.drawBackground(),this.drawGrid(t),this.drawTitle()}},{z:s,draw:()=>{this.drawBorder()}},{z:e,draw:t=>{this.drawLabels(t)}}]:[{z:e,draw:t=>{this.draw(t)}}]}getMatchingVisibleMetas(t){const e=this.chart.getSortedVisibleDatasetMetas(),i=this.axis+"AxisID",s=[];let n,o;for(n=0,o=e.length;n{const s=i.split("."),n=s.pop(),o=[t].concat(s).join("."),a=e[i].split("."),r=a.pop(),l=a.join(".");ue.route(o,n,l,r)}))}(e,t.defaultRoutes);t.descriptors&&ue.describe(e,t.descriptors)}(t,o,i),this.override&&ue.override(t.id,t.overrides)),o}get(t){return this.items[t]}unregister(t){const e=this.items,i=t.id,s=this.scope;i in e&&delete e[i],s&&i in ue[s]&&(delete ue[s][i],this.override&&delete re[i])}}class Zs{constructor(){this.controllers=new Gs(Vs,"datasets",!0),this.elements=new Gs(Bs,"elements"),this.plugins=new Gs(Object,"plugins"),this.scales=new Gs(Ks,"scales"),this._typedRegistries=[this.controllers,this.scales,this.elements]}add(...t){this._each("register",t)}remove(...t){this._each("unregister",t)}addControllers(...t){this._each("register",t,this.controllers)}addElements(...t){this._each("register",t,this.elements)}addPlugins(...t){this._each("register",t,this.plugins)}addScales(...t){this._each("register",t,this.scales)}getController(t){return this._get(t,this.controllers,"controller")}getElement(t){return this._get(t,this.elements,"element")}getPlugin(t){return this._get(t,this.plugins,"plugin")}getScale(t){return this._get(t,this.scales,"scale")}removeControllers(...t){this._each("unregister",t,this.controllers)}removeElements(...t){this._each("unregister",t,this.elements)}removePlugins(...t){this._each("unregister",t,this.plugins)}removeScales(...t){this._each("unregister",t,this.scales)}_each(t,e,i){[...e].forEach((e=>{const s=i||this._getRegistryForType(e);i||s.isForType(e)||s===this.plugins&&e.id?this._exec(t,s,e):u(e,(e=>{const s=i||this._getRegistryForType(e);this._exec(t,s,e)}))}))}_exec(t,e,i){const s=w(t);d(i["before"+s],[],i),e[t](i),d(i["after"+s],[],i)}_getRegistryForType(t){for(let e=0;et.filter((t=>!e.some((e=>t.plugin.id===e.plugin.id))));this._notify(s(e,i),t,"stop"),this._notify(s(i,e),t,"start")}}function tn(t,e){return e||!1!==t?!0===t?{}:t:null}function en(t,{plugin:e,local:i},s,n){const o=t.pluginScopeKeys(e),a=t.getOptionScopes(s,o);return i&&e.defaults&&a.push(e.defaults),t.createResolver(a,n,[""],{scriptable:!1,indexable:!1,allKeys:!0})}function sn(t,e){const i=ue.datasets[t]||{};return((e.datasets||{})[t]||{}).indexAxis||e.indexAxis||i.indexAxis||"x"}function nn(t,e){if("x"===t||"y"===t||"r"===t)return t;var i;if(t=e.axis||("top"===(i=e.position)||"bottom"===i?"x":"left"===i||"right"===i?"y":void 0)||t.length>1&&nn(t[0].toLowerCase(),e))return t;throw new Error(`Cannot determine type of '${name}' axis. Please provide 'axis' or 'position' option.`)}function on(t){const e=t.options||(t.options={});e.plugins=l(e.plugins,{}),e.scales=function(t,e){const i=re[t.type]||{scales:{}},s=e.scales||{},n=sn(t.type,e),a=Object.create(null);return Object.keys(s).forEach((t=>{const e=s[t];if(!o(e))return console.error(`Invalid scale configuration for scale: ${t}`);if(e._proxy)return console.warn(`Ignoring resolver passed as options for scale: ${t}`);const r=nn(t,e),l=function(t,e){return t===e?"_index_":"_value_"}(r,n),h=i.scales||{};a[t]=x(Object.create(null),[{axis:r},e,h[r],h[l]])})),t.data.datasets.forEach((i=>{const n=i.type||t.type,o=i.indexAxis||sn(n,e),r=(re[n]||{}).scales||{};Object.keys(r).forEach((t=>{const e=function(t,e){let i=t;return"_index_"===t?i=e:"_value_"===t&&(i="x"===e?"y":"x"),i}(t,o),n=i[e+"AxisID"]||e;a[n]=a[n]||Object.create(null),x(a[n],[{axis:e},s[n],r[t]])}))})),Object.keys(a).forEach((t=>{const e=a[t];x(e,[ue.scales[e.type],ue.scale])})),a}(t,e)}function an(t){return(t=t||{}).datasets=t.datasets||[],t.labels=t.labels||[],t}const rn=new Map,ln=new Set;function hn(t,e){let i=rn.get(t);return i||(i=e(),rn.set(t,i),ln.add(i)),i}const cn=(t,e,i)=>{const s=M(e,i);void 0!==s&&t.add(s)};class dn{constructor(t){this._config=function(t){return(t=t||{}).data=an(t.data),on(t),t}(t),this._scopeCache=new Map,this._resolverCache=new Map}get platform(){return this._config.platform}get type(){return this._config.type}set type(t){this._config.type=t}get data(){return this._config.data}set data(t){this._config.data=an(t)}get options(){return this._config.options}set options(t){this._config.options=t}get plugins(){return this._config.plugins}update(){const t=this._config;this.clearCache(),on(t)}clearCache(){this._scopeCache.clear(),this._resolverCache.clear()}datasetScopeKeys(t){return hn(t,(()=>[[`datasets.${t}`,""]]))}datasetAnimationScopeKeys(t,e){return hn(`${t}.transition.${e}`,(()=>[[`datasets.${t}.transitions.${e}`,`transitions.${e}`],[`datasets.${t}`,""]]))}datasetElementScopeKeys(t,e){return hn(`${t}-${e}`,(()=>[[`datasets.${t}.elements.${e}`,`datasets.${t}`,`elements.${e}`,""]]))}pluginScopeKeys(t){const e=t.id;return hn(`${this.type}-plugin-${e}`,(()=>[[`plugins.${e}`,...t.additionalOptionScopes||[]]]))}_cachedScopes(t,e){const i=this._scopeCache;let s=i.get(t);return s&&!e||(s=new Map,i.set(t,s)),s}getOptionScopes(t,e,i){const{options:s,type:n}=this,o=this._cachedScopes(t,i),a=o.get(e);if(a)return a;const r=new Set;e.forEach((e=>{t&&(r.add(t),e.forEach((e=>cn(r,t,e)))),e.forEach((t=>cn(r,s,t))),e.forEach((t=>cn(r,re[n]||{},t))),e.forEach((t=>cn(r,ue,t))),e.forEach((t=>cn(r,le,t)))}));const l=Array.from(r);return 0===l.length&&l.push(Object.create(null)),ln.has(e)&&o.set(e,l),l}chartOptionScopes(){const{options:t,type:e}=this;return[t,re[e]||{},ue.datasets[e]||{},{type:e},ue,le]}resolveNamedOptions(t,e,i,s=[""]){const o={$shared:!0},{resolver:a,subPrefixes:r}=un(this._resolverCache,t,s);let l=a;if(function(t,e){const{isScriptable:i,isIndexable:s}=$e(t);for(const o of e){const e=i(o),a=s(o),r=(a||e)&&t[o];if(e&&(S(r)||fn(r))||a&&n(r))return!0}return!1}(a,e)){o.$shared=!1;l=je(a,i=S(i)?i():i,this.createResolver(t,i,r))}for(const t of e)o[t]=l[t];return o}createResolver(t,e,i=[""],s){const{resolver:n}=un(this._resolverCache,t,i);return o(e)?je(n,e,void 0,s):n}}function un(t,e,i){let s=t.get(e);s||(s=new Map,t.set(e,s));const n=i.join();let o=s.get(n);if(!o){o={resolver:He(e,i),subPrefixes:i.filter((t=>!t.toLowerCase().includes("hover")))},s.set(n,o)}return o}const fn=t=>o(t)&&Object.getOwnPropertyNames(t).reduce(((e,i)=>e||S(t[i])),!1);const gn=["top","bottom","left","right","chartArea"];function pn(t,e){return"top"===t||"bottom"===t||-1===gn.indexOf(t)&&"x"===e}function mn(t,e){return function(i,s){return i[t]===s[t]?i[e]-s[e]:i[t]-s[t]}}function bn(t){const e=t.chart,i=e.options.animation;e.notifyPlugins("afterRender"),d(i&&i.onComplete,[t],e)}function xn(t){const e=t.chart,i=e.options.animation;d(i&&i.onProgress,[t],e)}function _n(t){return fe()&&"string"==typeof t?t=document.getElementById(t):t&&t.length&&(t=t[0]),t&&t.canvas&&(t=t.canvas),t}const yn={},vn=t=>{const e=_n(t);return Object.values(yn).filter((t=>t.canvas===e)).pop()};function Mn(t,e,i){const s=Object.keys(t);for(const n of s){const s=+n;if(s>=e){const o=t[n];delete t[n],(i>0||s>e)&&(t[s+i]=o)}}}class wn{static defaults=ue;static instances=yn;static overrides=re;static registry=Js;static version="4.2.1";static getChart=vn;static register(...t){Js.add(...t),kn()}static unregister(...t){Js.remove(...t),kn()}constructor(t,e){const s=this.config=new dn(e),n=_n(t),o=vn(n);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.");const a=s.createResolver(s.chartOptionScopes(),this.getContext());this.platform=new(s.platform||vs(n)),this.platform.updateConfig(s);const r=this.platform.acquireContext(n,a.aspectRatio),l=r&&r.canvas,h=l&&l.height,c=l&&l.width;this.id=i(),this.ctx=r,this.canvas=l,this.width=c,this.height=h,this._options=a,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 Qs,this.$proxies={},this._hiddenIndices={},this.attached=!1,this._animationsDisabled=void 0,this.$context=void 0,this._doResize=dt((t=>this.update(t)),a.resizeDelay||0),this._dataChanges=[],yn[this.id]=this,r&&l?(xt.listen(this,"complete",bn),xt.listen(this,"progress",xn),this._initialize(),this.attached&&this.update()):console.error("Failed to create chart: can't acquire context from the given item")}get aspectRatio(){const{options:{aspectRatio:t,maintainAspectRatio:e},width:i,height:n,_aspectRatio:o}=this;return s(t)?e&&o?o:n?i/n:null:t}get data(){return this.config.data}set data(t){this.config.data=t}get options(){return this._options}set options(t){this.config.options=t}get registry(){return Js}_initialize(){return this.notifyPlugins("beforeInit"),this.options.responsive?this.resize():we(this,this.options.devicePixelRatio),this.bindEvents(),this.notifyPlugins("afterInit"),this}clear(){return Ae(this.canvas,this.ctx),this}stop(){return xt.stop(this),this}resize(t,e){xt.running(this)?this._resizeBeforeDraw={width:t,height:e}:this._resize(t,e)}_resize(t,e){const i=this.options,s=this.canvas,n=i.maintainAspectRatio&&this.aspectRatio,o=this.platform.getMaximumSize(s,t,e,n),a=i.devicePixelRatio||this.platform.getDevicePixelRatio(),r=this.width?"resize":"attach";this.width=o.width,this.height=o.height,this._aspectRatio=this.aspectRatio,we(this,a,!0)&&(this.notifyPlugins("resize",{size:o}),d(i.onResize,[this,o],this),this.attached&&this._doResize(r)&&this.render())}ensureScalesHaveIDs(){u(this.options.scales||{},((t,e)=>{t.id=e}))}buildOrUpdateScales(){const t=this.options,e=t.scales,i=this.scales,s=Object.keys(i).reduce(((t,e)=>(t[e]=!1,t)),{});let n=[];e&&(n=n.concat(Object.keys(e).map((t=>{const i=e[t],s=nn(t,i),n="r"===s,o="x"===s;return{options:i,dposition:n?"chartArea":o?"bottom":"left",dtype:n?"radialLinear":o?"category":"linear"}})))),u(n,(e=>{const n=e.options,o=n.id,a=nn(o,n),r=l(n.type,e.dtype);void 0!==n.position&&pn(n.position,a)===pn(e.dposition)||(n.position=e.dposition),s[o]=!0;let h=null;if(o in i&&i[o].type===r)h=i[o];else{h=new(Js.getScale(r))({id:o,type:r,ctx:this.ctx,chart:this}),i[h.id]=h}h.init(n,t)})),u(s,((t,e)=>{t||delete i[e]})),u(i,(t=>{ns.configure(this,t,t.options),ns.addBox(this,t)}))}_updateMetasets(){const t=this._metasets,e=this.data.datasets.length,i=t.length;if(t.sort(((t,e)=>t.index-e.index)),i>e){for(let t=e;te.length&&delete this._stacks,t.forEach(((t,i)=>{0===e.filter((e=>e===t._dataset)).length&&this._destroyDatasetMeta(i)}))}buildOrUpdateControllers(){const t=[],e=this.data.datasets;let i,s;for(this._removeUnreferencedMetasets(),i=0,s=e.length;i{this.getDatasetMeta(e).controller.reset()}),this)}reset(){this._resetElements(),this.notifyPlugins("reset")}update(t){const e=this.config;e.update();const i=this._options=e.createResolver(e.chartOptionScopes(),this.getContext()),s=this._animationsDisabled=!i.animation;if(this._updateScales(),this._checkEventBindings(),this._updateHiddenIndices(),this._plugins.invalidate(),!1===this.notifyPlugins("beforeUpdate",{mode:t,cancelable:!0}))return;const n=this.buildOrUpdateControllers();this.notifyPlugins("beforeElementsUpdate");let o=0;for(let t=0,e=this.data.datasets.length;t{t.reset()})),this._updateDatasets(t),this.notifyPlugins("afterUpdate",{mode:t}),this._layers.sort(mn("z","_idx"));const{_active:a,_lastEvent:r}=this;r?this._eventHandler(r,!0):a.length&&this._updateHoverStyles(a,a,!0),this.render()}_updateScales(){u(this.scales,(t=>{ns.removeBox(this,t)})),this.ensureScalesHaveIDs(),this.buildOrUpdateScales()}_checkEventBindings(){const t=this.options,e=new Set(Object.keys(this._listeners)),i=new Set(t.events);P(e,i)&&!!this._responsiveListeners===t.responsive||(this.unbindEvents(),this.bindEvents())}_updateHiddenIndices(){const{_hiddenIndices:t}=this,e=this._getUniformDataChanges()||[];for(const{method:i,start:s,count:n}of e){Mn(t,s,"_removeElements"===i?-n:n)}}_getUniformDataChanges(){const t=this._dataChanges;if(!t||!t.length)return;this._dataChanges=[];const e=this.data.datasets.length,i=e=>new Set(t.filter((t=>t[0]===e)).map(((t,e)=>e+","+t.splice(1).join(",")))),s=i(0);for(let t=1;tt.split(","))).map((t=>({method:t[1],start:+t[2],count:+t[3]})))}_updateLayout(t){if(!1===this.notifyPlugins("beforeLayout",{cancelable:!0}))return;ns.update(this,this.width,this.height,t);const e=this.chartArea,i=e.width<=0||e.height<=0;this._layers=[],u(this.boxes,(t=>{i&&"chartArea"===t.position||(t.configure&&t.configure(),this._layers.push(...t._layers()))}),this),this._layers.forEach(((t,e)=>{t._idx=e})),this.notifyPlugins("afterLayout")}_updateDatasets(t){if(!1!==this.notifyPlugins("beforeDatasetsUpdate",{mode:t,cancelable:!0})){for(let t=0,e=this.data.datasets.length;t=0;--e)this._drawDataset(t[e]);this.notifyPlugins("afterDatasetsDraw")}_drawDataset(t){const e=this.ctx,i=t._clip,s=!i.disabled,n=function(t){const{xScale:e,yScale:i}=t;if(e&&i)return{left:e.left,right:e.right,top:i.top,bottom:i.bottom}}(t)||this.chartArea,o={meta:t,index:t.index,cancelable:!0};!1!==this.notifyPlugins("beforeDatasetDraw",o)&&(s&&Re(e,{left:!1===i.left?0:n.left-i.left,right:!1===i.right?this.width:n.right+i.right,top:!1===i.top?0:n.top-i.top,bottom:!1===i.bottom?this.height:n.bottom+i.bottom}),t.controller.draw(),s&&Ie(e),o.cancelable=!1,this.notifyPlugins("afterDatasetDraw",o))}isPointInArea(t){return Ee(t,this.chartArea,this._minPadding)}getElementsAtEventForMode(t,e,i,s){const n=Yi.modes[e];return"function"==typeof n?n(this,t,i,s):[]}getDatasetMeta(t){const e=this.data.datasets[t],i=this._metasets;let s=i.filter((t=>t&&t._dataset===e)).pop();return s||(s={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(s)),s}getContext(){return this.$context||(this.$context=Pi(null,{chart:this,type:"chart"}))}getVisibleDatasetCount(){return this.getSortedVisibleDatasetMetas().length}isDatasetVisible(t){const e=this.data.datasets[t];if(!e)return!1;const i=this.getDatasetMeta(t);return"boolean"==typeof i.hidden?!i.hidden:!e.hidden}setDatasetVisibility(t,e){this.getDatasetMeta(t).hidden=!e}toggleDataVisibility(t){this._hiddenIndices[t]=!this._hiddenIndices[t]}getDataVisibility(t){return!this._hiddenIndices[t]}_updateVisibility(t,e,i){const s=i?"show":"hide",n=this.getDatasetMeta(t),o=n.controller._resolveAnimations(void 0,s);k(e)?(n.data[e].hidden=!i,this.update()):(this.setDatasetVisibility(t,i),o.update(n,{visible:i}),this.update((e=>e.datasetIndex===t?s:void 0)))}hide(t,e){this._updateVisibility(t,e,!1)}show(t,e){this._updateVisibility(t,e,!0)}_destroyDatasetMeta(t){const e=this._metasets[t];e&&e.controller&&e.controller._destroy(),delete this._metasets[t]}_stop(){let t,e;for(this.stop(),xt.remove(this),t=0,e=this.data.datasets.length;t{e.addEventListener(this,i,s),t[i]=s},s=(t,e,i)=>{t.offsetX=e,t.offsetY=i,this._eventHandler(t)};u(this.options.events,(t=>i(t,s)))}bindResponsiveEvents(){this._responsiveListeners||(this._responsiveListeners={});const t=this._responsiveListeners,e=this.platform,i=(i,s)=>{e.addEventListener(this,i,s),t[i]=s},s=(i,s)=>{t[i]&&(e.removeEventListener(this,i,s),delete t[i])},n=(t,e)=>{this.canvas&&this.resize(t,e)};let o;const a=()=>{s("attach",a),this.attached=!0,this.resize(),i("resize",n),i("detach",o)};o=()=>{this.attached=!1,s("resize",n),this._stop(),this._resize(0,0),i("attach",a)},e.isAttached(this.canvas)?a():o()}unbindEvents(){u(this._listeners,((t,e)=>{this.platform.removeEventListener(this,e,t)})),this._listeners={},u(this._responsiveListeners,((t,e)=>{this.platform.removeEventListener(this,e,t)})),this._responsiveListeners=void 0}updateHoverStyle(t,e,i){const s=i?"set":"remove";let n,o,a,r;for("dataset"===e&&(n=this.getDatasetMeta(t[0].datasetIndex),n.controller["_"+s+"DatasetHoverStyle"]()),a=0,r=t.length;a{const i=this.getDatasetMeta(t);if(!i)throw new Error("No dataset found at index "+t);return{datasetIndex:t,element:i.data[e],index:e}}));!f(i,e)&&(this._active=i,this._lastEvent=null,this._updateHoverStyles(i,e))}notifyPlugins(t,e,i){return this._plugins.notify(this,t,e,i)}isPluginEnabled(t){return 1===this._plugins._cache.filter((e=>e.plugin.id===t)).length}_updateHoverStyles(t,e,i){const s=this.options.hover,n=(t,e)=>t.filter((t=>!e.some((e=>t.datasetIndex===e.datasetIndex&&t.index===e.index)))),o=n(e,t),a=i?t:n(t,e);o.length&&this.updateHoverStyle(o,s.mode,!1),a.length&&s.mode&&this.updateHoverStyle(a,s.mode,!0)}_eventHandler(t,e){const i={event:t,replay:e,cancelable:!0,inChartArea:this.isPointInArea(t)},s=e=>(e.options.events||this.options.events).includes(t.native.type);if(!1===this.notifyPlugins("beforeEvent",i,s))return;const n=this._handleEvent(t,e,i.inChartArea);return i.cancelable=!1,this.notifyPlugins("afterEvent",i,s),(n||i.changed)&&this.render(),this}_handleEvent(t,e,i){const{_active:s=[],options:n}=this,o=e,a=this._getActiveElements(t,s,i,o),r=D(t),l=function(t,e,i,s){return i&&"mouseout"!==t.type?s?e:t:null}(t,this._lastEvent,i,r);i&&(this._lastEvent=null,d(n.onHover,[t,a,this],this),r&&d(n.onClick,[t,a,this],this));const h=!f(a,s);return(h||e)&&(this._active=a,this._updateHoverStyles(a,s,e)),this._lastEvent=l,h}_getActiveElements(t,e,i,s){if("mouseout"===t.type)return[];if(!i)return e;const n=this.options.hover;return this.getElementsAtEventForMode(t,n.mode,n,s)}}function kn(){return u(wn.instances,(t=>t._plugins.invalidate()))}function Sn(){throw new Error("This method is not implemented: Check that a complete date adapter is provided.")}class Pn{static override(t){Object.assign(Pn.prototype,t)}constructor(t){this.options=t||{}}init(){}formats(){return Sn()}parse(){return Sn()}format(){return Sn()}add(){return Sn()}diff(){return Sn()}startOf(){return Sn()}endOf(){return Sn()}}var Dn={_date:Pn};function Cn(t){const e=t.iScale,i=function(t,e){if(!t._cache.$bar){const i=t.getMatchingVisibleMetas(e);let s=[];for(let e=0,n=i.length;et-e)))}return t._cache.$bar}(e,t.type);let s,n,o,a,r=e._length;const l=()=>{32767!==o&&-32768!==o&&(k(a)&&(r=Math.min(r,Math.abs(o-a)||r)),a=o)};for(s=0,n=i.length;sMath.abs(r)&&(l=r,h=a),e[i.axis]=h,e._custom={barStart:l,barEnd:h,start:n,end:o,min:a,max:r}}(t,e,i,s):e[i.axis]=i.parse(t,s),e}function An(t,e,i,s){const n=t.iScale,o=t.vScale,a=n.getLabels(),r=n===o,l=[];let h,c,d,u;for(h=i,c=i+s;ht.x,i="left",s="right"):(e=t.base"spacing"!==t,_indexable:t=>"spacing"!==t};static overrides={aspectRatio:1,plugins:{legend:{labels:{generateLabels(t){const e=t.data;if(e.labels.length&&e.datasets.length){const{labels:{pointStyle:i,color:s}}=t.legend.options;return e.labels.map(((e,n)=>{const o=t.getDatasetMeta(0).controller.getStyle(n);return{text:e,fillStyle:o.backgroundColor,strokeStyle:o.borderColor,fontColor:s,lineWidth:o.borderWidth,pointStyle:i,hidden:!t.getDataVisibility(n),index:n}}))}return[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}}}};constructor(t,e){super(t,e),this.enableOptionSharing=!0,this.innerRadius=void 0,this.outerRadius=void 0,this.offsetX=void 0,this.offsetY=void 0}linkScales(){}parse(t,e){const i=this.getDataset().data,s=this._cachedMeta;if(!1===this._parsing)s._parsed=i;else{let n,a,r=t=>+i[t];if(o(i[t])){const{key:t="value"}=this._parsing;r=e=>+M(i[e],t)}for(n=t,a=t+e;nZ(t,r,l,!0)?1:Math.max(e,e*i,s,s*i),g=(t,e,s)=>Z(t,r,l,!0)?-1:Math.min(e,e*i,s,s*i),p=f(0,h,d),m=f(E,c,u),b=g(C,h,d),x=g(C+E,c,u);s=(p-b)/2,n=(m-x)/2,o=-(p+b)/2,a=-(m+x)/2}return{ratioX:s,ratioY:n,offsetX:o,offsetY:a}}(u,d,r),b=(i.width-o)/f,x=(i.height-o)/g,_=Math.max(Math.min(b,x)/2,0),y=c(this.options.radius,_),v=(y-Math.max(y*r,0))/this._getVisibleDatasetWeightTotal();this.offsetX=p*y,this.offsetY=m*y,s.total=this.calculateTotal(),this.outerRadius=y-v*this._getRingWeightOffset(this.index),this.innerRadius=Math.max(this.outerRadius-v*l,0),this.updateElements(n,0,n.length,t)}_circumference(t,e){const i=this.options,s=this._cachedMeta,n=this._getCircumference();return e&&i.animation.animateRotate||!this.chart.getDataVisibility(t)||null===s._parsed[t]||s.data[t].hidden?0:this.calculateCircumference(s._parsed[t]*n/O)}updateElements(t,e,i,s){const n="reset"===s,o=this.chart,a=o.chartArea,r=o.options.animation,l=(a.left+a.right)/2,h=(a.top+a.bottom)/2,c=n&&r.animateScale,d=c?0:this.innerRadius,u=c?0:this.outerRadius,{sharedOptions:f,includeOptions:g}=this._getSharedOptions(e,s);let p,m=this._getRotation();for(p=0;p0&&!isNaN(t)?O*(Math.abs(t)/e):0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,s=i.data.labels||[],n=ne(e._parsed[t],i.options.locale);return{label:s[t]||"",value:n}}getMaxBorderWidth(t){let e=0;const i=this.chart;let s,n,o,a,r;if(!t)for(s=0,n=i.data.datasets.length;s{const o=t.getDatasetMeta(0).controller.getStyle(n);return{text:e,fillStyle:o.backgroundColor,strokeStyle:o.borderColor,fontColor:s,lineWidth:o.borderWidth,pointStyle:i,hidden:!t.getDataVisibility(n),index:n}}))}return[]}},onClick(t,e,i){i.chart.toggleDataVisibility(e.index),i.chart.update()}}},scales:{r:{type:"radialLinear",angleLines:{display:!1},beginAtZero:!0,grid:{circular:!0},pointLabels:{display:!1},startAngle:0}}};constructor(t,e){super(t,e),this.innerRadius=void 0,this.outerRadius=void 0}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart,s=i.data.labels||[],n=ne(e._parsed[t].r,i.options.locale);return{label:s[t]||"",value:n}}parseObjectData(t,e,i,s){return ei.bind(this)(t,e,i,s)}update(t){const e=this._cachedMeta.data;this._updateRadius(),this.updateElements(e,0,e.length,t)}getMinMax(){const t=this._cachedMeta,e={min:Number.POSITIVE_INFINITY,max:Number.NEGATIVE_INFINITY};return t.data.forEach(((t,i)=>{const s=this.getParsed(i).r;!isNaN(s)&&this.chart.getDataVisibility(i)&&(se.max&&(e.max=s))})),e}_updateRadius(){const t=this.chart,e=t.chartArea,i=t.options,s=Math.min(e.right-e.left,e.bottom-e.top),n=Math.max(s/2,0),o=(n-Math.max(i.cutoutPercentage?n/100*i.cutoutPercentage:1,0))/t.getVisibleDatasetCount();this.outerRadius=n-o*this.index,this.innerRadius=this.outerRadius-o}updateElements(t,e,i,s){const n="reset"===s,o=this.chart,a=o.options.animation,r=this._cachedMeta.rScale,l=r.xCenter,h=r.yCenter,c=r.getIndexAngle(0)-.5*C;let d,u=c;const f=360/this.countVisibleElements();for(d=0;d{!isNaN(this.getParsed(i).r)&&this.chart.getDataVisibility(i)&&e++})),e}_computeAngle(t,e,i){return this.chart.getDataVisibility(t)?$(this.resolveDataElementOptions(t,e).angle||i):0}}var Vn=Object.freeze({__proto__:null,BarController:class extends Vs{static id="bar";static defaults={datasetElementType:!1,dataElementType:"bar",categoryPercentage:.8,barPercentage:.9,grouped:!0,animations:{numbers:{type:"number",properties:["x","y","base","width","height"]}}};static overrides={scales:{_index_:{type:"category",offset:!0,grid:{offset:!0}},_value_:{type:"linear",beginAtZero:!0}}};parsePrimitiveData(t,e,i,s){return An(t,e,i,s)}parseArrayData(t,e,i,s){return An(t,e,i,s)}parseObjectData(t,e,i,s){const{iScale:n,vScale:o}=t,{xAxisKey:a="x",yAxisKey:r="y"}=this._parsing,l="x"===n.axis?a:r,h="x"===o.axis?a:r,c=[];let d,u,f,g;for(d=i,u=i+s;dt.controller.options.grouped)),o=i.options.stacked,a=[],r=t=>{const i=t.controller.getParsed(e),n=i&&i[t.vScale.axis];if(s(n)||isNaN(n))return!0};for(const i of n)if((void 0===e||!r(i))&&((!1===o||-1===a.indexOf(i.stack)||void 0===o&&void 0===i.stack)&&a.push(i.stack),i.index===t))break;return a.length||a.push(void 0),a}_getStackCount(t){return this._getStacks(void 0,t).length}_getStackIndex(t,e,i){const s=this._getStacks(t,i),n=void 0!==e?s.indexOf(e):-1;return-1===n?s.length-1:n}_getRuler(){const t=this.options,e=this._cachedMeta,i=e.iScale,s=[];let n,o;for(n=0,o=e.data.length;n=i?1:-1)}(u,e,r)*a,f===r&&(b-=u/2);const t=e.getPixelForDecimal(0),s=e.getPixelForDecimal(1),o=Math.min(t,s),h=Math.max(t,s);b=Math.max(Math.min(b,h),o),d=b+u,i&&!c&&(l._stacks[e.axis]._visualValues[n]=e.getValueForPixel(d)-e.getValueForPixel(b))}if(b===e.getPixelForValue(r)){const t=F(u)*e.getLineWidthForValue(r)/2;b+=t,u-=t}return{size:u,base:b,head:d,center:d+u/2}}_calculateBarIndexPixels(t,e){const i=e.scale,n=this.options,o=n.skipNull,a=l(n.maxBarThickness,1/0);let r,h;if(e.grouped){const i=o?this._getStackCount(t):e.stackCount,l="flex"===n.barThickness?function(t,e,i,s){const n=e.pixels,o=n[t];let a=t>0?n[t-1]:null,r=t=0;--i)e=Math.max(e,t[i].size(this.resolveDataElementOptions(i))/2);return e>0&&e}getLabelAndValue(t){const e=this._cachedMeta,i=this.chart.data.labels||[],{xScale:s,yScale:n}=e,o=this.getParsed(t),a=s.getLabelForValue(o.x),r=n.getLabelForValue(o.y),l=o._custom;return{label:i[t]||"",value:"("+a+", "+r+(l?", "+l:"")+")"}}update(t){const e=this._cachedMeta.data;this.updateElements(e,0,e.length,t)}updateElements(t,e,i,s){const n="reset"===s,{iScale:o,vScale:a}=this._cachedMeta,{sharedOptions:r,includeOptions:l}=this._getSharedOptions(e,s),h=o.axis,c=a.axis;for(let d=e;d0&&this.getParsed(e-1);for(let i=0;i<_;++i){const g=t[i],_=b?g:{};if(i=x){_.skip=!0;continue}const v=this.getParsed(i),M=s(v[f]),w=_[u]=a.getPixelForValue(v[u],i),k=_[f]=o||M?r.getBasePixel():r.getPixelForValue(l?this.applyStack(r,v,l):v[f],i);_.skip=isNaN(w)||isNaN(k)||M,_.stop=i>0&&Math.abs(v[u]-y[u])>m,p&&(_.parsed=v,_.raw=h.data[i]),d&&(_.options=c||this.resolveDataElementOptions(i,g.active?"active":n)),b||this.updateElement(g,i,_,n),y=v}}getMaxOverflow(){const t=this._cachedMeta,e=t.dataset,i=e.options&&e.options.borderWidth||0,s=t.data||[];if(!s.length)return i;const n=s[0].size(this.resolveDataElementOptions(0)),o=s[s.length-1].size(this.resolveDataElementOptions(s.length-1));return Math.max(i,n,o)/2}draw(){const t=this._cachedMeta;t.dataset.updateControlPoints(this.chart.chartArea,t.iScale.axis),super.draw()}},PolarAreaController:Fn,PieController:class extends zn{static id="pie";static defaults={cutout:0,rotation:0,circumference:360,radius:"100%"}},RadarController:class extends Vs{static id="radar";static defaults={datasetElementType:"line",dataElementType:"point",indexAxis:"r",showLine:!0,elements:{line:{fill:"start"}}};static overrides={aspectRatio:1,scales:{r:{type:"radialLinear"}}};getLabelAndValue(t){const e=this._cachedMeta.vScale,i=this.getParsed(t);return{label:e.getLabels()[t],value:""+e.getLabelForValue(i[e.axis])}}parseObjectData(t,e,i,s){return ei.bind(this)(t,e,i,s)}update(t){const e=this._cachedMeta,i=e.dataset,s=e.data||[],n=e.iScale.getLabels();if(i.points=s,"resize"!==t){const e=this.resolveDatasetElementOptions(t);this.options.showLine||(e.borderWidth=0);const o={_loop:!0,_fullLoop:n.length===s.length,options:e};this.updateElement(i,void 0,o,t)}this.updateElements(s,0,s.length,t)}updateElements(t,e,i,s){const n=this._cachedMeta.rScale,o="reset"===s;for(let a=e;a0&&this.getParsed(e-1);for(let c=e;c0&&Math.abs(i[f]-_[f])>b,m&&(p.parsed=i,p.raw=h.data[c]),u&&(p.options=d||this.resolveDataElementOptions(c,e.active?"active":n)),x||this.updateElement(e,c,p,n),_=i}this.updateSharedOptions(d,n,c)}getMaxOverflow(){const t=this._cachedMeta,e=t.data||[];if(!this.options.showLine){let t=0;for(let i=e.length-1;i>=0;--i)t=Math.max(t,e[i].size(this.resolveDataElementOptions(i))/2);return t>0&&t}const i=t.dataset,s=i.options&&i.options.borderWidth||0;if(!e.length)return s;const n=e[0].size(this.resolveDataElementOptions(0)),o=e[e.length-1].size(this.resolveDataElementOptions(e.length-1));return Math.max(s,n,o)/2}}});function Bn(t,e,i,s){const n=_i(t.options.borderRadius,["outerStart","outerEnd","innerStart","innerEnd"]);const o=(i-e)/2,a=Math.min(o,s*e/2),r=t=>{const e=(i-Math.min(o,t))*s/2;return J(t,0,Math.min(o,e))};return{outerStart:r(n.outerStart),outerEnd:r(n.outerEnd),innerStart:J(n.innerStart,0,a),innerEnd:J(n.innerEnd,0,a)}}function Nn(t,e,i,s){return{x:i+t*Math.cos(e),y:s+t*Math.sin(e)}}function Wn(t,e,i,s,n,o){const{x:a,y:r,startAngle:l,pixelMargin:h,innerRadius:c}=e,d=Math.max(e.outerRadius+s+i-h,0),u=c>0?c+s+i+h:0;let f=0;const g=n-l;if(s){const t=((c>0?c-s:0)+(d>0?d-s:0))/2;f=(g-(0!==t?g*t/(t+s):g))/2}const p=(g-Math.max(.001,g*d-i/C)/d)/2,m=l+p+f,b=n-p-f,{outerStart:x,outerEnd:_,innerStart:y,innerEnd:v}=Bn(e,u,d,b-m),M=d-x,w=d-_,k=m+x/M,S=b-_/w,P=u+y,D=u+v,O=m+y/P,A=b-v/D;if(t.beginPath(),o){const e=(k+S)/2;if(t.arc(a,r,d,k,e),t.arc(a,r,d,e,S),_>0){const e=Nn(w,S,a,r);t.arc(e.x,e.y,_,S,b+E)}const i=Nn(D,b,a,r);if(t.lineTo(i.x,i.y),v>0){const e=Nn(D,A,a,r);t.arc(e.x,e.y,v,b+E,A+Math.PI)}const s=(b-v/u+(m+y/u))/2;if(t.arc(a,r,u,b-v/u,s,!0),t.arc(a,r,u,s,m+y/u,!0),y>0){const e=Nn(P,O,a,r);t.arc(e.x,e.y,y,O+Math.PI,m-E)}const n=Nn(M,m,a,r);if(t.lineTo(n.x,n.y),x>0){const e=Nn(M,k,a,r);t.arc(e.x,e.y,x,m-E,k)}}else{t.moveTo(a,r);const e=Math.cos(k)*d+a,i=Math.sin(k)*d+r;t.lineTo(e,i);const s=Math.cos(S)*d+a,n=Math.sin(S)*d+r;t.lineTo(s,n)}t.closePath()}function Hn(t,e,i,s,n){const{fullCircles:o,startAngle:a,circumference:r,options:l}=e,{borderWidth:h,borderJoinStyle:c}=l,d="inner"===l.borderAlign;if(!h)return;d?(t.lineWidth=2*h,t.lineJoin=c||"round"):(t.lineWidth=h,t.lineJoin=c||"bevel");let u=e.endAngle;if(o){Wn(t,e,i,s,u,n);for(let e=0;en?(h=n/l,t.arc(o,a,l,i+h,s-h,!0)):t.arc(o,a,n,i+E,s-E),t.closePath(),t.clip()}(t,e,u),o||(Wn(t,e,i,s,u,n),t.stroke())}function jn(t,e,i=e){t.lineCap=l(i.borderCapStyle,e.borderCapStyle),t.setLineDash(l(i.borderDash,e.borderDash)),t.lineDashOffset=l(i.borderDashOffset,e.borderDashOffset),t.lineJoin=l(i.borderJoinStyle,e.borderJoinStyle),t.lineWidth=l(i.borderWidth,e.borderWidth),t.strokeStyle=l(i.borderColor,e.borderColor)}function $n(t,e,i){t.lineTo(i.x,i.y)}function Yn(t,e,i={}){const s=t.length,{start:n=0,end:o=s-1}=i,{start:a,end:r}=e,l=Math.max(n,a),h=Math.min(o,r),c=nr&&o>r;return{count:s,start:l,loop:e.loop,ilen:h(a+(h?r-t:t))%o,_=()=>{f!==g&&(t.lineTo(m,g),t.lineTo(m,f),t.lineTo(m,p))};for(l&&(d=n[x(0)],t.moveTo(d.x,d.y)),c=0;c<=r;++c){if(d=n[x(c)],d.skip)continue;const e=d.x,i=d.y,s=0|e;s===u?(ig&&(g=i),m=(b*m+e)/++b):(_(),t.lineTo(e,i),u=s,b=0,f=g=i),p=i}_()}function qn(t){const e=t.options,i=e.borderDash&&e.borderDash.length;return!(t._decimated||t._loop||e.tension||"monotone"===e.cubicInterpolationMode||e.stepped||i)?Xn:Un}const Kn="function"==typeof Path2D;function Gn(t,e,i,s){Kn&&!e.options.segment?function(t,e,i,s){let n=e._path;n||(n=e._path=new Path2D,e.path(n,i,s)&&n.closePath()),jn(t,e.options),t.stroke(n)}(t,e,i,s):function(t,e,i,s){const{segments:n,options:o}=e,a=qn(e);for(const r of n)jn(t,o,r.style),t.beginPath(),a(t,e,r,{start:i,end:i+s-1})&&t.closePath(),t.stroke()}(t,e,i,s)}class Zn extends Bs{static id="line";static defaults={borderCapStyle:"butt",borderDash:[],borderDashOffset:0,borderJoinStyle:"miter",borderWidth:3,capBezierPoints:!0,cubicInterpolationMode:"default",fill:!1,spanGaps:!1,stepped:!1,tension:0};static defaultRoutes={backgroundColor:"backgroundColor",borderColor:"borderColor"};static descriptors={_scriptable:!0,_indexable:t=>"borderDash"!==t&&"fill"!==t};constructor(t){super(),this.animated=!0,this.options=void 0,this._chart=void 0,this._loop=void 0,this._fullLoop=void 0,this._path=void 0,this._points=void 0,this._segments=void 0,this._decimated=!1,this._pointsUpdated=!1,this._datasetIndex=void 0,t&&Object.assign(this,t)}updateControlPoints(t,e){const i=this.options;if((i.tension||"monotone"===i.cubicInterpolationMode)&&!i.stepped&&!this._pointsUpdated){const s=i.spanGaps?this._loop:this._fullLoop;li(this._points,i,t,s,e),this._pointsUpdated=!0}}set points(t){this._points=t,delete this._segments,delete this._path,this._pointsUpdated=!1}get points(){return this._points}get segments(){return this._segments||(this._segments=Ri(this,this.options.segment))}first(){const t=this.segments,e=this.points;return t.length&&e[t[0].start]}last(){const t=this.segments,e=this.points,i=t.length;return i&&e[t[i-1].end]}interpolate(t,e){const i=this.options,s=t[e],n=this.points,o=Ei(this,{property:e,start:s,end:s});if(!o.length)return;const a=[],r=function(t){return t.stepped?gi:t.tension||"monotone"===t.cubicInterpolationMode?pi:fi}(i);let l,h;for(l=0,h=o.length;l=O||Z(n,a,r),g=tt(o,h+u,c+u);return f&&g}getCenterPoint(t){const{x:e,y:i,startAngle:s,endAngle:n,innerRadius:o,outerRadius:a}=this.getProps(["x","y","startAngle","endAngle","innerRadius","outerRadius"],t),{offset:r,spacing:l}=this.options,h=(s+n)/2,c=(o+a+l+r)/2;return{x:e+Math.cos(h)*c,y:i+Math.sin(h)*c}}tooltipPosition(t){return this.getCenterPoint(t)}draw(t){const{options:e,circumference:i}=this,s=(e.offset||0)/4,n=(e.spacing||0)/2,o=e.circular;if(this.pixelMargin="inner"===e.borderAlign?.33:0,this.fullCircles=i>O?Math.floor(i/O):0,0===i||this.innerRadius<0||this.outerRadius<0)return;t.save();const a=(this.startAngle+this.endAngle)/2;t.translate(Math.cos(a)*s,Math.sin(a)*s);const r=s*(1-Math.sin(Math.min(C,i||0)));t.fillStyle=e.backgroundColor,t.strokeStyle=e.borderColor,function(t,e,i,s,n){const{fullCircles:o,startAngle:a,circumference:r}=e;let l=e.endAngle;if(o){Wn(t,e,i,s,l,n);for(let e=0;e("string"==typeof e?(i=t.push(e)-1,s.unshift({index:i,label:e})):isNaN(e)&&(i=null),i))(t,e,i,s);return n!==t.lastIndexOf(e)?i:n}function ro(t){const e=this.getLabels();return t>=0&&ts=e?s:t,a=t=>n=i?n:t;if(t){const t=F(s),e=F(n);t<0&&e<0?a(0):t>0&&e>0&&o(0)}if(s===n){let e=0===n?1:Math.abs(.05*n);a(n+e),t||o(s-e)}this.min=s,this.max=n}getTickLimit(){const t=this.options.ticks;let e,{maxTicksLimit:i,stepSize:s}=t;return s?(e=Math.ceil(this.max/s)-Math.floor(this.min/s)+1,e>1e3&&(console.warn(`scales.${this.id}.ticks.stepSize: ${s} would result generating up to ${e} ticks. Limiting to 1000.`),e=1e3)):(e=this.computeTickLimit(),i=i||11),i&&(e=Math.min(i,e)),e}computeTickLimit(){return Number.POSITIVE_INFINITY}buildTicks(){const t=this.options,e=t.ticks;let i=this.getTickLimit();i=Math.max(2,i);const n=function(t,e){const i=[],{bounds:n,step:o,min:a,max:r,precision:l,count:h,maxTicks:c,maxDigits:d,includeBounds:u}=t,f=o||1,g=c-1,{min:p,max:m}=e,b=!s(a),x=!s(r),_=!s(h),y=(m-p)/(d+1);let v,M,w,k,S=B((m-p)/g/f)*f;if(S<1e-14&&!b&&!x)return[{value:p},{value:m}];k=Math.ceil(m/S)-Math.floor(p/S),k>g&&(S=B(k*S/g/f)*f),s(l)||(v=Math.pow(10,l),S=Math.ceil(S*v)/v),"ticks"===n?(M=Math.floor(p/S)*S,w=Math.ceil(m/S)*S):(M=p,w=m),b&&x&&o&&H((r-a)/o,S/1e3)?(k=Math.round(Math.min((r-a)/S,c)),S=(r-a)/k,M=a,w=r):_?(M=b?a:M,w=x?r:w,k=h-1,S=(w-M)/k):(k=(w-M)/S,k=V(k,Math.round(k),S/1e3)?Math.round(k):Math.ceil(k));const P=Math.max(U(S),U(M));v=Math.pow(10,s(l)?P:l),M=Math.round(M*v)/v,w=Math.round(w*v)/v;let D=0;for(b&&(u&&M!==a?(i.push({value:a}),MMath.floor(z(t)),fo=(t,e)=>Math.pow(10,uo(t)+e);function go(t){return 1===t/Math.pow(10,uo(t))}function po(t,e,i){const s=Math.pow(10,i),n=Math.floor(t/s);return Math.ceil(e/s)-n}function mo(t,{min:e,max:i}){e=r(t.min,e);const s=[],n=uo(e);let o=function(t,e){let i=uo(e-t);for(;po(t,e,i)>10;)i++;for(;po(t,e,i)<10;)i--;return Math.min(i,uo(t))}(e,i),a=o<0?Math.pow(10,Math.abs(o)):1;const l=Math.pow(10,o),h=n>o?Math.pow(10,n):0,c=Math.round((e-h)*a)/a,d=Math.floor((e-h)/l/10)*l*10;let u=Math.floor((c-d)/Math.pow(10,o)),f=r(t.min,Math.round((h+d+u*Math.pow(10,o))*a)/a);for(;f=10?u=u<15?15:20:u++,u>=20&&(o++,u=2,a=o>=0?1:a),f=Math.round((h+d+u*Math.pow(10,o))*a)/a;const g=r(t.max,f);return s.push({value:g,major:go(g),significand:u}),s}class bo extends Ks{static id="logarithmic";static defaults={ticks:{callback:ae.formatters.logarithmic,major:{enabled:!0}}};constructor(t){super(t),this.start=void 0,this.end=void 0,this._startValue=void 0,this._valueRange=0}parse(t,e){const i=ho.prototype.parse.apply(this,[t,e]);if(0!==i)return a(i)&&i>0?i:null;this._zero=!0}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!0);this.min=a(t)?Math.max(0,t):null,this.max=a(e)?Math.max(0,e):null,this.options.beginAtZero&&(this._zero=!0),this._zero&&this.min!==this._suggestedMin&&!a(this._userMin)&&(this.min=t===fo(this.min,0)?fo(this.min,-1):fo(this.min,0)),this.handleTickRangeOptions()}handleTickRangeOptions(){const{minDefined:t,maxDefined:e}=this.getUserBounds();let i=this.min,s=this.max;const n=e=>i=t?i:e,o=t=>s=e?s:t;i===s&&(i<=0?(n(1),o(10)):(n(fo(i,-1)),o(fo(s,1)))),i<=0&&n(fo(s,-1)),s<=0&&o(fo(i,1)),this.min=i,this.max=s}buildTicks(){const t=this.options,e=mo({min:this._userMin,max:this._userMax},this);return"ticks"===t.bounds&&j(e,this,"value"),t.reverse?(e.reverse(),this.start=this.max,this.end=this.min):(this.start=this.min,this.end=this.max),e}getLabelForValue(t){return void 0===t?"0":ne(t,this.chart.options.locale,this.options.ticks.format)}configure(){const t=this.min;super.configure(),this._startValue=z(t),this._valueRange=z(this.max)-z(t)}getPixelForValue(t){return void 0!==t&&0!==t||(t=this.min),null===t||isNaN(t)?NaN:this.getPixelForDecimal(t===this.min?0:(z(t)-this._startValue)/this._valueRange)}getValueForPixel(t){const e=this.getDecimalForPixel(t);return Math.pow(10,this._startValue+e*this._valueRange)}}function xo(t){const e=t.ticks;if(e.display&&t.display){const t=Mi(e.backdropPadding);return l(e.font&&e.font.size,ue.font.size)+t.height}return 0}function _o(t,e,i,s,n){return t===s||t===n?{start:e-i/2,end:e+i/2}:tn?{start:e-i,end:e}:{start:e,end:e+i}}function yo(t){const e={l:t.left+t._padding.left,r:t.right-t._padding.right,t:t.top+t._padding.top,b:t.bottom-t._padding.bottom},i=Object.assign({},e),s=[],o=[],a=t._pointLabels.length,r=t.options.pointLabels,l=r.centerPointLabels?C/a:0;for(let u=0;ue.r&&(r=(s.end-e.r)/o,t.r=Math.max(t.r,e.r+r)),n.starte.b&&(l=(n.end-e.b)/a,t.b=Math.max(t.b,e.b+l))}function Mo(t){return 0===t||180===t?"center":t<180?"left":"right"}function wo(t,e,i){return"right"===i?t-=e:"center"===i&&(t-=e/2),t}function ko(t,e,i){return 90===i||270===i?t-=e/2:(i>270||i<90)&&(t-=e),t}function So(t,e,i,s){const{ctx:n}=t;if(i)n.arc(t.xCenter,t.yCenter,e,0,O);else{let i=t.getPointPosition(0,e);n.moveTo(i.x,i.y);for(let o=1;ot,padding:5,centerPointLabels:!1}};static defaultRoutes={"angleLines.color":"borderColor","pointLabels.color":"color","ticks.color":"color"};static descriptors={angleLines:{_fallback:"grid"}};constructor(t){super(t),this.xCenter=void 0,this.yCenter=void 0,this.drawingArea=void 0,this._pointLabels=[],this._pointLabelItems=[]}setDimensions(){const t=this._padding=Mi(xo(this.options)/2),e=this.width=this.maxWidth-t.width,i=this.height=this.maxHeight-t.height;this.xCenter=Math.floor(this.left+e/2+t.left),this.yCenter=Math.floor(this.top+i/2+t.top),this.drawingArea=Math.floor(Math.min(e,i)/2)}determineDataLimits(){const{min:t,max:e}=this.getMinMax(!1);this.min=a(t)&&!isNaN(t)?t:0,this.max=a(e)&&!isNaN(e)?e:0,this.handleTickRangeOptions()}computeTickLimit(){return Math.ceil(this.drawingArea/xo(this.options))}generateTickLabels(t){ho.prototype.generateTickLabels.call(this,t),this._pointLabels=this.getLabels().map(((t,e)=>{const i=d(this.options.pointLabels.callback,[t,e],this);return i||0===i?i:""})).filter(((t,e)=>this.chart.getDataVisibility(e)))}fit(){const t=this.options;t.display&&t.pointLabels.display?yo(this):this.setCenterPoint(0,0,0,0)}setCenterPoint(t,e,i,s){this.xCenter+=Math.floor((t-e)/2),this.yCenter+=Math.floor((i-s)/2),this.drawingArea-=Math.min(this.drawingArea/2,Math.max(t,e,i,s))}getIndexAngle(t){return G(t*(O/(this._pointLabels.length||1))+$(this.options.startAngle||0))}getDistanceFromCenterForValue(t){if(s(t))return NaN;const e=this.drawingArea/(this.max-this.min);return this.options.reverse?(this.max-t)*e:(t-this.min)*e}getValueForDistanceFromCenter(t){if(s(t))return NaN;const e=t/(this.drawingArea/(this.max-this.min));return this.options.reverse?this.max-e:this.min+e}getPointLabelContext(t){const e=this._pointLabels||[];if(t>=0&&t=0;o--){const e=n.setContext(t.getPointLabelContext(o)),a=wi(e.font),{x:r,y:l,textAlign:h,left:c,top:d,right:u,bottom:f}=t._pointLabelItems[o],{backdropColor:g}=e;if(!s(g)){const t=vi(e.borderRadius),s=Mi(e.backdropPadding);i.fillStyle=g;const n=c-s.left,o=d-s.top,a=u-c+s.width,r=f-d+s.height;Object.values(t).some((t=>0!==t))?(i.beginPath(),We(i,{x:n,y:o,w:a,h:r,radius:t}),i.fill()):i.fillRect(n,o,a,r)}Ve(i,t._pointLabels[o],r,l+a.lineHeight/2,a,{color:e.color,textAlign:h,textBaseline:"middle"})}}(this,a),n.display&&this.ticks.forEach(((t,e)=>{if(0!==e){l=this.getDistanceFromCenterForValue(t.value);const i=this.getContext(e),s=n.setContext(i),r=o.setContext(i);!function(t,e,i,s,n){const o=t.ctx,a=e.circular,{color:r,lineWidth:l}=e;!a&&!s||!r||!l||i<0||(o.save(),o.strokeStyle=r,o.lineWidth=l,o.setLineDash(n.dash),o.lineDashOffset=n.dashOffset,o.beginPath(),So(t,i,a,s),o.closePath(),o.stroke(),o.restore())}(this,s,l,a,r)}})),i.display){for(t.save(),r=a-1;r>=0;r--){const s=i.setContext(this.getPointLabelContext(r)),{color:n,lineWidth:o}=s;o&&n&&(t.lineWidth=o,t.strokeStyle=n,t.setLineDash(s.borderDash),t.lineDashOffset=s.borderDashOffset,l=this.getDistanceFromCenterForValue(e.ticks.reverse?this.min:this.max),h=this.getPointPosition(r,l),t.beginPath(),t.moveTo(this.xCenter,this.yCenter),t.lineTo(h.x,h.y),t.stroke())}t.restore()}}drawBorder(){}drawLabels(){const t=this.ctx,e=this.options,i=e.ticks;if(!i.display)return;const s=this.getIndexAngle(0);let n,o;t.save(),t.translate(this.xCenter,this.yCenter),t.rotate(s),t.textAlign="center",t.textBaseline="middle",this.ticks.forEach(((s,a)=>{if(0===a&&!e.reverse)return;const r=i.setContext(this.getContext(a)),l=wi(r.font);if(n=this.getDistanceFromCenterForValue(this.ticks[a].value),r.showLabelBackdrop){t.font=l.string,o=t.measureText(s.label).width,t.fillStyle=r.backdropColor;const e=Mi(r.backdropPadding);t.fillRect(-o/2-e.left,-n-l.size/2-e.top,o+e.width,l.size+e.height)}Ve(t,s.label,0,-n,l,{color:r.color})})),t.restore()}drawTitle(){}}const Do={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}},Co=Object.keys(Do);function Oo(t,e){return t-e}function Ao(t,e){if(s(e))return null;const i=t._adapter,{parser:n,round:o,isoWeekday:r}=t._parseOpts;let l=e;return"function"==typeof n&&(l=n(l)),a(l)||(l="string"==typeof n?i.parse(l,n):i.parse(l)),null===l?null:(o&&(l="week"!==o||!W(r)&&!0!==r?i.startOf(l,o):i.startOf(l,"isoWeek",r)),+l)}function To(t,e,i,s){const n=Co.length;for(let o=Co.indexOf(t);o=e?i[s]:i[n]]=!0}}else t[e]=!0}function Eo(t,e,i){const s=[],n={},o=e.length;let a,r;for(a=0;a=0&&(e[l].major=!0);return e}(t,s,n,i):s}class Ro extends Ks{static id="time";static defaults={bounds:"data",adapters:{},time:{parser:!1,unit:!1,round:!1,isoWeekday:!1,minUnit:"millisecond",displayFormats:{}},ticks:{source:"auto",callback:!1,major:{enabled:!1}}};constructor(t){super(t),this._cache={data:[],labels:[],all:[]},this._unit="day",this._majorUnit=void 0,this._offsets={},this._normalized=!1,this._parseOpts=void 0}init(t,e={}){const i=t.time||(t.time={}),s=this._adapter=new Dn._date(t.adapters.date);s.init(e),x(i.displayFormats,s.formats()),this._parseOpts={parser:i.parser,round:i.round,isoWeekday:i.isoWeekday},super.init(t),this._normalized=e.normalized}parse(t,e){return void 0===t?null:Ao(this,t)}beforeLayout(){super.beforeLayout(),this._cache={data:[],labels:[],all:[]}}determineDataLimits(){const t=this.options,e=this._adapter,i=t.time.unit||"day";let{min:s,max:n,minDefined:o,maxDefined:r}=this.getUserBounds();function l(t){o||isNaN(t.min)||(s=Math.min(s,t.min)),r||isNaN(t.max)||(n=Math.max(n,t.max))}o&&r||(l(this._getLabelBounds()),"ticks"===t.bounds&&"labels"===t.ticks.source||l(this.getMinMax(!1))),s=a(s)&&!isNaN(s)?s:+e.startOf(Date.now(),i),n=a(n)&&!isNaN(n)?n:+e.endOf(Date.now(),i)+1,this.min=Math.min(s,n-1),this.max=Math.max(s+1,n)}_getLabelBounds(){const t=this.getLabelTimestamps();let e=Number.POSITIVE_INFINITY,i=Number.NEGATIVE_INFINITY;return t.length&&(e=t[0],i=t[t.length-1]),{min:e,max:i}}buildTicks(){const t=this.options,e=t.time,i=t.ticks,s="labels"===i.source?this.getLabelTimestamps():this._generate();"ticks"===t.bounds&&s.length&&(this.min=this._userMin||s[0],this.max=this._userMax||s[s.length-1]);const n=this.min,o=nt(s,n,this.max);return this._unit=e.unit||(i.autoSkip?To(e.minUnit,this.min,this.max,this._getLabelCapacity(n)):function(t,e,i,s,n){for(let o=Co.length-1;o>=Co.indexOf(i);o--){const i=Co[o];if(Do[i].common&&t._adapter.diff(n,s,i)>=e-1)return i}return Co[i?Co.indexOf(i):0]}(this,o.length,e.minUnit,this.min,this.max)),this._majorUnit=i.major.enabled&&"year"!==this._unit?function(t){for(let e=Co.indexOf(t)+1,i=Co.length;e+t.value)))}initOffsets(t=[]){let e,i,s=0,n=0;this.options.offset&&t.length&&(e=this.getDecimalForValue(t[0]),s=1===t.length?1-e:(this.getDecimalForValue(t[1])-e)/2,i=this.getDecimalForValue(t[t.length-1]),n=1===t.length?i:(i-this.getDecimalForValue(t[t.length-2]))/2);const o=t.length<3?.5:.25;s=J(s,0,o),n=J(n,0,o),this._offsets={start:s,end:n,factor:1/(s+1+n)}}_generate(){const t=this._adapter,e=this.min,i=this.max,s=this.options,n=s.time,o=n.unit||To(n.minUnit,e,i,this._getLabelCapacity(e)),a=l(s.ticks.stepSize,1),r="week"===o&&n.isoWeekday,h=W(r)||!0===r,c={};let d,u,f=e;if(h&&(f=+t.startOf(f,"isoWeek",r)),f=+t.startOf(f,h?"day":o),t.diff(i,e,o)>1e5*a)throw new Error(e+" and "+i+" are too far apart with stepSize of "+a+" "+o);const g="data"===s.ticks.source&&this.getDataTimestamps();for(d=f,u=0;dt-e)).map((t=>+t))}getLabelForValue(t){const e=this._adapter,i=this.options.time;return i.tooltipFormat?e.format(t,i.tooltipFormat):e.format(t,i.displayFormats.datetime)}format(t,e){const i=this.options.time.displayFormats,s=this._unit,n=e||i[s];return this._adapter.format(t,n)}_tickFormatFunction(t,e,i,s){const n=this.options,o=n.ticks.callback;if(o)return d(o,[t,e,i],this);const a=n.time.displayFormats,r=this._unit,l=this._majorUnit,h=r&&a[r],c=l&&a[l],u=i[e],f=l&&c&&u&&u.major;return this._adapter.format(t,s||(f?c:h))}generateTickLabels(t){let e,i,s;for(e=0,i=t.length;e0?a:1}getDataTimestamps(){let t,e,i=this._cache.data||[];if(i.length)return i;const s=this.getMatchingVisibleMetas();if(this._normalized&&s.length)return this._cache.data=s[0].controller.getAllParsedValues(this);for(t=0,e=s.length;t=t[r].pos&&e<=t[l].pos&&({lo:r,hi:l}=it(t,"pos",e)),({pos:s,time:o}=t[r]),({pos:n,time:a}=t[l])):(e>=t[r].time&&e<=t[l].time&&({lo:r,hi:l}=it(t,"time",e)),({time:s,pos:o}=t[r]),({time:n,pos:a}=t[l]));const h=n-s;return h?o+(a-o)*(e-s)/h:o}var zo=Object.freeze({__proto__:null,CategoryScale:class extends Ks{static id="category";static defaults={ticks:{callback:ro}};constructor(t){super(t),this._startValue=void 0,this._valueRange=0,this._addedLabels=[]}init(t){const e=this._addedLabels;if(e.length){const t=this.getLabels();for(const{index:i,label:s}of e)t[i]===s&&t.splice(i,1);this._addedLabels=[]}super.init(t)}parse(t,e){if(s(t))return null;const i=this.getLabels();return((t,e)=>null===t?null:J(Math.round(t),0,e))(e=isFinite(e)&&i[e]===t?e:ao(i,t,l(e,t),this._addedLabels),i.length-1)}determineDataLimits(){const{minDefined:t,maxDefined:e}=this.getUserBounds();let{min:i,max:s}=this.getMinMax(!0);"ticks"===this.options.bounds&&(t||(i=0),e||(s=this.getLabels().length-1)),this.min=i,this.max=s}buildTicks(){const t=this.min,e=this.max,i=this.options.offset,s=[];let n=this.getLabels();n=0===t&&e===n.length-1?n:n.slice(t,e+1),this._valueRange=Math.max(n.length-(i?0:1),1),this._startValue=this.min-(i?.5:0);for(let i=t;i<=e;i++)s.push({value:i});return s}getLabelForValue(t){return ro.call(this,t)}configure(){super.configure(),this.isHorizontal()||(this._reversePixels=!this._reversePixels)}getPixelForValue(t){return"number"!=typeof t&&(t=this.parse(t)),null===t?NaN:this.getPixelForDecimal((t-this._startValue)/this._valueRange)}getPixelForTick(t){const e=this.ticks;return t<0||t>e.length-1?null:this.getPixelForValue(e[t].value)}getValueForPixel(t){return Math.round(this._startValue+this.getDecimalForPixel(t)*this._valueRange)}getBasePixel(){return this.bottom}},LinearScale:co,LogarithmicScale:bo,RadialLinearScale:Po,TimeScale:Ro,TimeSeriesScale:class extends Ro{static id="timeseries";static defaults=Ro.defaults;constructor(t){super(t),this._table=[],this._minPos=void 0,this._tableRange=void 0}initOffsets(){const t=this._getTimestampsForTable(),e=this._table=this.buildLookupTable(t);this._minPos=Io(e,this.min),this._tableRange=Io(e,this.max)-this._minPos,super.initOffsets(t)}buildLookupTable(t){const{min:e,max:i}=this,s=[],n=[];let o,a,r,l,h;for(o=0,a=t.length;o=e&&l<=i&&s.push(l);if(s.length<2)return[{time:e,pos:0},{time:i,pos:1}];for(o=0,a=s.length;ot.replace("rgb(","rgba(").replace(")",", 0.5)")));function Bo(t){return Fo[t%Fo.length]}function No(t){return Vo[t%Vo.length]}function Wo(t){let e=0;return(i,s)=>{const n=t.getDatasetMeta(s).controller;n instanceof zn?e=function(t,e){return t.backgroundColor=t.data.map((()=>Bo(e++))),e}(i,e):n instanceof Fn?e=function(t,e){return t.backgroundColor=t.data.map((()=>No(e++))),e}(i,e):n&&(e=function(t,e){return t.borderColor=Bo(e),t.backgroundColor=No(e),++e}(i,e))}}function Ho(t){let e;for(e in t)if(t[e].borderColor||t[e].backgroundColor)return!0;return!1}var jo={id:"colors",defaults:{enabled:!0,forceOverride:!1},beforeLayout(t,e,i){if(!i.enabled)return;const{data:{datasets:s},options:n}=t.config,{elements:o}=n;if(!i.forceOverride&&(Ho(s)||(a=n)&&(a.borderColor||a.backgroundColor)||o&&Ho(o)))return;var a;const r=Wo(t);s.forEach(r)}};function $o(t){if(t._decimated){const e=t._data;delete t._decimated,delete t._data,Object.defineProperty(t,"data",{configurable:!0,enumerable:!0,writable:!0,value:e})}}function Yo(t){t.data.datasets.forEach((t=>{$o(t)}))}var Uo={id:"decimation",defaults:{algorithm:"min-max",enabled:!1},beforeElementsUpdate:(t,e,i)=>{if(!i.enabled)return void Yo(t);const n=t.width;t.data.datasets.forEach(((e,o)=>{const{_data:a,indexAxis:r}=e,l=t.getDatasetMeta(o),h=a||e.data;if("y"===ki([r,t.options.indexAxis]))return;if(!l.controller.supportsDecimation)return;const c=t.scales[l.xAxisID];if("linear"!==c.type&&"time"!==c.type)return;if(t.options.parsing)return;let{start:d,count:u}=function(t,e){const i=e.length;let s,n=0;const{iScale:o}=t,{min:a,max:r,minDefined:l,maxDefined:h}=o.getUserBounds();return l&&(n=J(it(e,o.axis,a).lo,0,i-1)),s=h?J(it(e,o.axis,r).hi+1,n,i)-n:i-n,{start:n,count:s}}(l,h);if(u<=(i.threshold||4*n))return void $o(e);let f;switch(s(a)&&(e._data=h,delete e.data,Object.defineProperty(e,"data",{configurable:!0,enumerable:!0,get:function(){return this._decimated},set:function(t){this._data=t}})),i.algorithm){case"lttb":f=function(t,e,i,s,n){const o=n.samples||s;if(o>=i)return t.slice(e,e+i);const a=[],r=(i-2)/(o-2);let l=0;const h=e+i-1;let c,d,u,f,g,p=e;for(a[l++]=t[p],c=0;cu&&(u=f,d=t[s],g=s);a[l++]=d,p=g}return a[l++]=t[h],a}(h,d,u,n,i);break;case"min-max":f=function(t,e,i,n){let o,a,r,l,h,c,d,u,f,g,p=0,m=0;const b=[],x=e+i-1,_=t[e].x,y=t[x].x-_;for(o=e;og&&(g=l,d=o),p=(m*p+a.x)/++m;else{const i=o-1;if(!s(c)&&!s(d)){const e=Math.min(c,d),s=Math.max(c,d);e!==u&&e!==i&&b.push({...t[e],x:p}),s!==u&&s!==i&&b.push({...t[s],x:p})}o>0&&i!==u&&b.push(t[i]),b.push(a),h=e,m=0,f=g=l,c=d=u=o}}return b}(h,d,u,n);break;default:throw new Error(`Unsupported decimation algorithm '${i.algorithm}'`)}e._decimated=f}))},destroy(t){Yo(t)}};function Xo(t,e,i,s){if(s)return;let n=e[t],o=i[t];return"angle"===t&&(n=G(n),o=G(o)),{property:t,start:n,end:o}}function qo(t,e,i){for(;e>t;e--){const t=i[e];if(!isNaN(t.x)&&!isNaN(t.y))break}return e}function Ko(t,e,i,s){return t&&e?s(t[i],e[i]):t?t[i]:e?e[i]:0}function Go(t,e){let i=[],s=!1;return n(t)?(s=!0,i=t):i=function(t,e){const{x:i=null,y:s=null}=t||{},n=e.points,o=[];return e.segments.forEach((({start:t,end:e})=>{e=qo(t,e,n);const a=n[t],r=n[e];null!==s?(o.push({x:a.x,y:s}),o.push({x:r.x,y:s})):null!==i&&(o.push({x:i,y:a.y}),o.push({x:i,y:r.y}))})),o}(t,e),i.length?new Zn({points:i,options:{tension:0},_loop:s,_fullLoop:s}):null}function Zo(t){return t&&!1!==t.fill}function Jo(t,e,i){let s=t[e].fill;const n=[e];let o;if(!i)return s;for(;!1!==s&&-1===n.indexOf(s);){if(!a(s))return s;if(o=t[s],!o)return!1;if(o.visible)return s;n.push(s),s=o.fill}return!1}function Qo(t,e,i){const s=function(t){const e=t.options,i=e.fill;let s=l(i&&i.target,i);void 0===s&&(s=!!e.backgroundColor);if(!1===s||null===s)return!1;if(!0===s)return"origin";return s}(t);if(o(s))return!isNaN(s.value)&&s;let n=parseFloat(s);return a(n)&&Math.floor(n)===n?function(t,e,i,s){"-"!==t&&"+"!==t||(i=e+i);if(i===e||i<0||i>=s)return!1;return i}(s[0],e,n,i):["origin","start","end","stack","shape"].indexOf(s)>=0&&s}function ta(t,e,i){const s=[];for(let n=0;n=0;--e){const i=n[e].$filler;i&&(i.line.updateControlPoints(o,i.axis),s&&i.fill&&na(t.ctx,i,o))}},beforeDatasetsDraw(t,e,i){if("beforeDatasetsDraw"!==i.drawTime)return;const s=t.getSortedVisibleDatasetMetas();for(let e=s.length-1;e>=0;--e){const i=s[e].$filler;Zo(i)&&na(t.ctx,i,t.chartArea)}},beforeDatasetDraw(t,e,i){const s=e.meta.$filler;Zo(s)&&"beforeDatasetDraw"===i.drawTime&&na(t.ctx,s,t.chartArea)},defaults:{propagate:!0,drawTime:"beforeDatasetDraw"}};const ca=(t,e)=>{let{boxHeight:i=e,boxWidth:s=e}=t;return t.usePointStyle&&(i=Math.min(i,e),s=t.pointStyleWidth||Math.min(s,e)),{boxWidth:s,boxHeight:i,itemHeight:Math.max(e,i)}};class da extends Bs{constructor(t){super(),this._added=!1,this.legendHitBoxes=[],this._hoveredItem=null,this.doughnutMode=!1,this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this.legendItems=void 0,this.columnSizes=void 0,this.lineWidths=void 0,this.maxHeight=void 0,this.maxWidth=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.height=void 0,this.width=void 0,this._margins=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e,i){this.maxWidth=t,this.maxHeight=e,this._margins=i,this.setDimensions(),this.buildLabels(),this.fit()}setDimensions(){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)}buildLabels(){const t=this.options.labels||{};let e=d(t.generateLabels,[this.chart],this)||[];t.filter&&(e=e.filter((e=>t.filter(e,this.chart.data)))),t.sort&&(e=e.sort(((e,i)=>t.sort(e,i,this.chart.data)))),this.options.reverse&&e.reverse(),this.legendItems=e}fit(){const{options:t,ctx:e}=this;if(!t.display)return void(this.width=this.height=0);const i=t.labels,s=wi(i.font),n=s.size,o=this._computeTitleHeight(),{boxWidth:a,itemHeight:r}=ca(i,n);let l,h;e.font=s.string,this.isHorizontal()?(l=this.maxWidth,h=this._fitRows(o,n,a,r)+10):(h=this.maxHeight,l=this._fitCols(o,s,a,r)+10),this.width=Math.min(l,t.maxWidth||this.maxWidth),this.height=Math.min(h,t.maxHeight||this.maxHeight)}_fitRows(t,e,i,s){const{ctx:n,maxWidth:o,options:{labels:{padding:a}}}=this,r=this.legendHitBoxes=[],l=this.lineWidths=[0],h=s+a;let c=t;n.textAlign="left",n.textBaseline="middle";let d=-1,u=-h;return this.legendItems.forEach(((t,f)=>{const g=i+e/2+n.measureText(t.text).width;(0===f||l[l.length-1]+g+2*a>o)&&(c+=h,l[l.length-(f>0?0:1)]=0,u+=h,d++),r[f]={left:0,top:u,row:d,width:g,height:s},l[l.length-1]+=g+a})),c}_fitCols(t,e,i,s){const{ctx:n,maxHeight:o,options:{labels:{padding:a}}}=this,r=this.legendHitBoxes=[],l=this.columnSizes=[],h=o-t;let c=a,d=0,u=0,f=0,g=0;return this.legendItems.forEach(((t,o)=>{const{itemWidth:p,itemHeight:m}=function(t,e,i,s,n){const o=function(t,e,i,s){let n=t.text;n&&"string"!=typeof n&&(n=n.reduce(((t,e)=>t.length>e.length?t:e)));return e+i.size/2+s.measureText(n).width}(s,t,e,i),a=function(t,e,i){let s=t;"string"!=typeof e.text&&(s=ua(e,i));return s}(n,s,e.lineHeight);return{itemWidth:o,itemHeight:a}}(i,e,n,t,s);o>0&&u+m+2*a>h&&(c+=d+a,l.push({width:d,height:u}),f+=d+a,g++,d=u=0),r[o]={left:f,top:u,col:g,width:p,height:m},d=Math.max(d,p),u+=m+a})),c+=d,l.push({width:d,height:u}),c}adjustHitBoxes(){if(!this.options.display)return;const t=this._computeTitleHeight(),{legendHitBoxes:e,options:{align:i,labels:{padding:s},rtl:n}}=this,o=Di(n,this.left,this.width);if(this.isHorizontal()){let n=0,a=ft(i,this.left+s,this.right-this.lineWidths[n]);for(const r of e)n!==r.row&&(n=r.row,a=ft(i,this.left+s,this.right-this.lineWidths[n])),r.top+=this.top+t+s,r.left=o.leftForLtr(o.x(a),r.width),a+=r.width+s}else{let n=0,a=ft(i,this.top+t+s,this.bottom-this.columnSizes[n].height);for(const r of e)r.col!==n&&(n=r.col,a=ft(i,this.top+t+s,this.bottom-this.columnSizes[n].height)),r.top=a,r.left+=this.left+s,r.left=o.leftForLtr(o.x(r.left),r.width),a+=r.height+s}}isHorizontal(){return"top"===this.options.position||"bottom"===this.options.position}draw(){if(this.options.display){const t=this.ctx;Re(t,this),this._draw(),Ie(t)}}_draw(){const{options:t,columnSizes:e,lineWidths:i,ctx:s}=this,{align:n,labels:o}=t,a=ue.color,r=Di(t.rtl,this.left,this.width),h=wi(o.font),{padding:c}=o,d=h.size,u=d/2;let f;this.drawTitle(),s.textAlign=r.textAlign("left"),s.textBaseline="middle",s.lineWidth=.5,s.font=h.string;const{boxWidth:g,boxHeight:p,itemHeight:m}=ca(o,d),b=this.isHorizontal(),x=this._computeTitleHeight();f=b?{x:ft(n,this.left+c,this.right-i[0]),y:this.top+c+x,line:0}:{x:this.left+c,y:ft(n,this.top+x+c,this.bottom-e[0].height),line:0},Ci(this.ctx,t.textDirection);const _=m+c;this.legendItems.forEach(((y,v)=>{s.strokeStyle=y.fontColor,s.fillStyle=y.fontColor;const M=s.measureText(y.text).width,w=r.textAlign(y.textAlign||(y.textAlign=o.textAlign)),k=g+u+M;let S=f.x,P=f.y;r.setWidth(this.width),b?v>0&&S+k+c>this.right&&(P=f.y+=_,f.line++,S=f.x=ft(n,this.left+c,this.right-i[f.line])):v>0&&P+_>this.bottom&&(S=f.x=S+e[f.line].width+c,f.line++,P=f.y=ft(n,this.top+x+c,this.bottom-e[f.line].height));if(function(t,e,i){if(isNaN(g)||g<=0||isNaN(p)||p<0)return;s.save();const n=l(i.lineWidth,1);if(s.fillStyle=l(i.fillStyle,a),s.lineCap=l(i.lineCap,"butt"),s.lineDashOffset=l(i.lineDashOffset,0),s.lineJoin=l(i.lineJoin,"miter"),s.lineWidth=n,s.strokeStyle=l(i.strokeStyle,a),s.setLineDash(l(i.lineDash,[])),o.usePointStyle){const a={radius:p*Math.SQRT2/2,pointStyle:i.pointStyle,rotation:i.rotation,borderWidth:n},l=r.xPlus(t,g/2);Le(s,a,l,e+u,o.pointStyleWidth&&g)}else{const o=e+Math.max((d-p)/2,0),a=r.leftForLtr(t,g),l=vi(i.borderRadius);s.beginPath(),Object.values(l).some((t=>0!==t))?We(s,{x:a,y:o,w:g,h:p,radius:l}):s.rect(a,o,g,p),s.fill(),0!==n&&s.stroke()}s.restore()}(r.x(S),P,y),S=gt(w,S+g+u,b?S+k:this.right,t.rtl),function(t,e,i){Ve(s,i.text,t,e+m/2,h,{strikethrough:i.hidden,textAlign:r.textAlign(i.textAlign)})}(r.x(S),P,y),b)f.x+=k+c;else if("string"!=typeof y.text){const t=h.lineHeight;f.y+=ua(y,t)}else f.y+=_})),Oi(this.ctx,t.textDirection)}drawTitle(){const t=this.options,e=t.title,i=wi(e.font),s=Mi(e.padding);if(!e.display)return;const n=Di(t.rtl,this.left,this.width),o=this.ctx,a=e.position,r=i.size/2,l=s.top+r;let h,c=this.left,d=this.width;if(this.isHorizontal())d=Math.max(...this.lineWidths),h=this.top+l,c=ft(t.align,c,this.right-d);else{const e=this.columnSizes.reduce(((t,e)=>Math.max(t,e.height)),0);h=l+ft(t.align,this.top,this.bottom-e-t.labels.padding-this._computeTitleHeight())}const u=ft(a,c,c+d);o.textAlign=n.textAlign(ut(a)),o.textBaseline="middle",o.strokeStyle=e.color,o.fillStyle=e.color,o.font=i.string,Ve(o,e.text,u,h,i)}_computeTitleHeight(){const t=this.options.title,e=wi(t.font),i=Mi(t.padding);return t.display?e.lineHeight+i.height:0}_getLegendItemAt(t,e){let i,s,n;if(tt(t,this.left,this.right)&&tt(e,this.top,this.bottom))for(n=this.legendHitBoxes,i=0;it.chart.options.color,boxWidth:40,padding:10,generateLabels(t){const e=t.data.datasets,{labels:{usePointStyle:i,pointStyle:s,textAlign:n,color:o,useBorderRadius:a,borderRadius:r}}=t.legend.options;return t._getSortedDatasetMetas().map((t=>{const l=t.controller.getStyle(i?0:void 0),h=Mi(l.borderWidth);return{text:e[t.index].label,fillStyle:l.backgroundColor,fontColor:o,hidden:!t.visible,lineCap:l.borderCapStyle,lineDash:l.borderDash,lineDashOffset:l.borderDashOffset,lineJoin:l.borderJoinStyle,lineWidth:(h.width+h.height)/4,strokeStyle:l.borderColor,pointStyle:s||l.pointStyle,rotation:l.rotation,textAlign:n||l.textAlign,borderRadius:a&&(r||l.borderRadius),datasetIndex:t.index}}),this)}},title:{color:t=>t.chart.options.color,display:!1,position:"center",text:""}},descriptors:{_scriptable:t=>!t.startsWith("on"),labels:{_scriptable:t=>!["generateLabels","filter","sort"].includes(t)}}};class ga extends Bs{constructor(t){super(),this.chart=t.chart,this.options=t.options,this.ctx=t.ctx,this._padding=void 0,this.top=void 0,this.bottom=void 0,this.left=void 0,this.right=void 0,this.width=void 0,this.height=void 0,this.position=void 0,this.weight=void 0,this.fullSize=void 0}update(t,e){const i=this.options;if(this.left=0,this.top=0,!i.display)return void(this.width=this.height=this.right=this.bottom=0);this.width=this.right=t,this.height=this.bottom=e;const s=n(i.text)?i.text.length:1;this._padding=Mi(i.padding);const o=s*wi(i.font).lineHeight+this._padding.height;this.isHorizontal()?this.height=o:this.width=o}isHorizontal(){const t=this.options.position;return"top"===t||"bottom"===t}_drawArgs(t){const{top:e,left:i,bottom:s,right:n,options:o}=this,a=o.align;let r,l,h,c=0;return this.isHorizontal()?(l=ft(a,i,n),h=e+t,r=n-i):("left"===o.position?(l=i+t,h=ft(a,s,e),c=-.5*C):(l=n-t,h=ft(a,e,s),c=.5*C),r=s-e),{titleX:l,titleY:h,maxWidth:r,rotation:c}}draw(){const t=this.ctx,e=this.options;if(!e.display)return;const i=wi(e.font),s=i.lineHeight/2+this._padding.top,{titleX:n,titleY:o,maxWidth:a,rotation:r}=this._drawArgs(s);Ve(t,e.text,0,0,i,{color:e.color,maxWidth:a,rotation:r,textAlign:ut(e.align),textBaseline:"middle",translation:[n,o]})}}var pa={id:"title",_element:ga,start(t,e,i){!function(t,e){const i=new ga({ctx:t.ctx,options:e,chart:t});ns.configure(t,i,e),ns.addBox(t,i),t.titleBlock=i}(t,i)},stop(t){const e=t.titleBlock;ns.removeBox(t,e),delete t.titleBlock},beforeUpdate(t,e,i){const s=t.titleBlock;ns.configure(t,s,i),s.options=i},defaults:{align:"center",display:!1,font:{weight:"bold"},fullSize:!0,padding:10,position:"top",text:"",weight:2e3},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}};const ma=new WeakMap;var ba={id:"subtitle",start(t,e,i){const s=new ga({ctx:t.ctx,options:i,chart:t});ns.configure(t,s,i),ns.addBox(t,s),ma.set(t,s)},stop(t){ns.removeBox(t,ma.get(t)),ma.delete(t)},beforeUpdate(t,e,i){const s=ma.get(t);ns.configure(t,s,i),s.options=i},defaults:{align:"center",display:!1,font:{weight:"normal"},fullSize:!0,padding:0,position:"top",text:"",weight:1500},defaultRoutes:{color:"color"},descriptors:{_scriptable:!0,_indexable:!1}};const xa={average(t){if(!t.length)return!1;let e,i,s=0,n=0,o=0;for(e=0,i=t.length;e-1?t.split("\n"):t}function va(t,e){const{element:i,datasetIndex:s,index:n}=e,o=t.getDatasetMeta(s).controller,{label:a,value:r}=o.getLabelAndValue(n);return{chart:t,label:a,parsed:o.getParsed(n),raw:t.data.datasets[s].data[n],formattedValue:r,dataset:o.getDataset(),dataIndex:n,datasetIndex:s,element:i}}function Ma(t,e){const i=t.chart.ctx,{body:s,footer:n,title:o}=t,{boxWidth:a,boxHeight:r}=e,l=wi(e.bodyFont),h=wi(e.titleFont),c=wi(e.footerFont),d=o.length,f=n.length,g=s.length,p=Mi(e.padding);let m=p.height,b=0,x=s.reduce(((t,e)=>t+e.before.length+e.lines.length+e.after.length),0);if(x+=t.beforeBody.length+t.afterBody.length,d&&(m+=d*h.lineHeight+(d-1)*e.titleSpacing+e.titleMarginBottom),x){m+=g*(e.displayColors?Math.max(r,l.lineHeight):l.lineHeight)+(x-g)*l.lineHeight+(x-1)*e.bodySpacing}f&&(m+=e.footerMarginTop+f*c.lineHeight+(f-1)*e.footerSpacing);let _=0;const y=function(t){b=Math.max(b,i.measureText(t).width+_)};return i.save(),i.font=h.string,u(t.title,y),i.font=l.string,u(t.beforeBody.concat(t.afterBody),y),_=e.displayColors?a+2+e.boxPadding:0,u(s,(t=>{u(t.before,y),u(t.lines,y),u(t.after,y)})),_=0,i.font=c.string,u(t.footer,y),i.restore(),b+=p.width,{width:b,height:m}}function wa(t,e,i,s){const{x:n,width:o}=i,{width:a,chartArea:{left:r,right:l}}=t;let h="center";return"center"===s?h=n<=(r+l)/2?"left":"right":n<=o/2?h="left":n>=a-o/2&&(h="right"),function(t,e,i,s){const{x:n,width:o}=s,a=i.caretSize+i.caretPadding;return"left"===t&&n+o+a>e.width||"right"===t&&n-o-a<0||void 0}(h,t,e,i)&&(h="center"),h}function ka(t,e,i){const s=i.yAlign||e.yAlign||function(t,e){const{y:i,height:s}=e;return it.height-s/2?"bottom":"center"}(t,i);return{xAlign:i.xAlign||e.xAlign||wa(t,e,i,s),yAlign:s}}function Sa(t,e,i,s){const{caretSize:n,caretPadding:o,cornerRadius:a}=t,{xAlign:r,yAlign:l}=i,h=n+o,{topLeft:c,topRight:d,bottomLeft:u,bottomRight:f}=vi(a);let g=function(t,e){let{x:i,width:s}=t;return"right"===e?i-=s:"center"===e&&(i-=s/2),i}(e,r);const p=function(t,e,i){let{y:s,height:n}=t;return"top"===e?s+=i:s-="bottom"===e?n+i:n/2,s}(e,l,h);return"center"===l?"left"===r?g+=h:"right"===r&&(g-=h):"left"===r?g-=Math.max(c,u)+n:"right"===r&&(g+=Math.max(d,f)+n),{x:J(g,0,s.width-e.width),y:J(p,0,s.height-e.height)}}function Pa(t,e,i){const s=Mi(i.padding);return"center"===e?t.x+t.width/2:"right"===e?t.x+t.width-s.right:t.x+s.left}function Da(t){return _a([],ya(t))}function Ca(t,e){const i=e&&e.dataset&&e.dataset.tooltip&&e.dataset.tooltip.callbacks;return i?t.override(i):t}const Oa={beforeTitle:e,title(t){if(t.length>0){const e=t[0],i=e.chart.data.labels,s=i?i.length:0;if(this&&this.options&&"dataset"===this.options.mode)return e.dataset.label||"";if(e.label)return e.label;if(s>0&&e.dataIndex{const e={before:[],lines:[],after:[]},n=Ca(i,t);_a(e.before,ya(Aa(n,"beforeLabel",this,t))),_a(e.lines,Aa(n,"label",this,t)),_a(e.after,ya(Aa(n,"afterLabel",this,t))),s.push(e)})),s}getAfterBody(t,e){return Da(Aa(e.callbacks,"afterBody",this,t))}getFooter(t,e){const{callbacks:i}=e,s=Aa(i,"beforeFooter",this,t),n=Aa(i,"footer",this,t),o=Aa(i,"afterFooter",this,t);let a=[];return a=_a(a,ya(s)),a=_a(a,ya(n)),a=_a(a,ya(o)),a}_createItems(t){const e=this._active,i=this.chart.data,s=[],n=[],o=[];let a,r,l=[];for(a=0,r=e.length;at.filter(e,s,n,i)))),t.itemSort&&(l=l.sort(((e,s)=>t.itemSort(e,s,i)))),u(l,(e=>{const i=Ca(t.callbacks,e);s.push(Aa(i,"labelColor",this,e)),n.push(Aa(i,"labelPointStyle",this,e)),o.push(Aa(i,"labelTextColor",this,e))})),this.labelColors=s,this.labelPointStyles=n,this.labelTextColors=o,this.dataPoints=l,l}update(t,e){const i=this.options.setContext(this.getContext()),s=this._active;let n,o=[];if(s.length){const t=xa[i.position].call(this,s,this._eventPosition);o=this._createItems(i),this.title=this.getTitle(o,i),this.beforeBody=this.getBeforeBody(o,i),this.body=this.getBody(o,i),this.afterBody=this.getAfterBody(o,i),this.footer=this.getFooter(o,i);const e=this._size=Ma(this,i),a=Object.assign({},t,e),r=ka(this.chart,i,a),l=Sa(i,a,r,this.chart);this.xAlign=r.xAlign,this.yAlign=r.yAlign,n={opacity:1,x:l.x,y:l.y,width:e.width,height:e.height,caretX:t.x,caretY:t.y}}else 0!==this.opacity&&(n={opacity:0});this._tooltipItems=o,this.$context=void 0,n&&this._resolveAnimations().update(this,n),t&&i.external&&i.external.call(this,{chart:this.chart,tooltip:this,replay:e})}drawCaret(t,e,i,s){const n=this.getCaretPosition(t,i,s);e.lineTo(n.x1,n.y1),e.lineTo(n.x2,n.y2),e.lineTo(n.x3,n.y3)}getCaretPosition(t,e,i){const{xAlign:s,yAlign:n}=this,{caretSize:o,cornerRadius:a}=i,{topLeft:r,topRight:l,bottomLeft:h,bottomRight:c}=vi(a),{x:d,y:u}=t,{width:f,height:g}=e;let p,m,b,x,_,y;return"center"===n?(_=u+g/2,"left"===s?(p=d,m=p-o,x=_+o,y=_-o):(p=d+f,m=p+o,x=_-o,y=_+o),b=p):(m="left"===s?d+Math.max(r,h)+o:"right"===s?d+f-Math.max(l,c)-o:this.caretX,"top"===n?(x=u,_=x-o,p=m-o,b=m+o):(x=u+g,_=x+o,p=m+o,b=m-o),y=x),{x1:p,x2:m,x3:b,y1:x,y2:_,y3:y}}drawTitle(t,e,i){const s=this.title,n=s.length;let o,a,r;if(n){const l=Di(i.rtl,this.x,this.width);for(t.x=Pa(this,i.titleAlign,i),e.textAlign=l.textAlign(i.titleAlign),e.textBaseline="middle",o=wi(i.titleFont),a=i.titleSpacing,e.fillStyle=i.titleColor,e.font=o.string,r=0;r0!==t))?(t.beginPath(),t.fillStyle=n.multiKeyBackground,We(t,{x:e,y:p,w:h,h:l,radius:r}),t.fill(),t.stroke(),t.fillStyle=a.backgroundColor,t.beginPath(),We(t,{x:i,y:p+1,w:h-2,h:l-2,radius:r}),t.fill()):(t.fillStyle=n.multiKeyBackground,t.fillRect(e,p,h,l),t.strokeRect(e,p,h,l),t.fillStyle=a.backgroundColor,t.fillRect(i,p+1,h-2,l-2))}t.fillStyle=this.labelTextColors[i]}drawBody(t,e,i){const{body:s}=this,{bodySpacing:n,bodyAlign:o,displayColors:a,boxHeight:r,boxWidth:l,boxPadding:h}=i,c=wi(i.bodyFont);let d=c.lineHeight,f=0;const g=Di(i.rtl,this.x,this.width),p=function(i){e.fillText(i,g.x(t.x+f),t.y+d/2),t.y+=d+n},m=g.textAlign(o);let b,x,_,y,v,M,w;for(e.textAlign=o,e.textBaseline="middle",e.font=c.string,t.x=Pa(this,m,i),e.fillStyle=i.bodyColor,u(this.beforeBody,p),f=a&&"right"!==m?"center"===o?l/2+h:l+2+h:0,y=0,M=s.length;y0&&e.stroke()}_updateAnimationTarget(t){const e=this.chart,i=this.$animations,s=i&&i.x,n=i&&i.y;if(s||n){const i=xa[t.position].call(this,this._active,this._eventPosition);if(!i)return;const o=this._size=Ma(this,t),a=Object.assign({},i,this._size),r=ka(e,t,a),l=Sa(t,a,r,e);s._to===l.x&&n._to===l.y||(this.xAlign=r.xAlign,this.yAlign=r.yAlign,this.width=o.width,this.height=o.height,this.caretX=i.x,this.caretY=i.y,this._resolveAnimations().update(this,l))}}_willRender(){return!!this.opacity}draw(t){const e=this.options.setContext(this.getContext());let i=this.opacity;if(!i)return;this._updateAnimationTarget(e);const s={width:this.width,height:this.height},n={x:this.x,y:this.y};i=Math.abs(i)<.001?0:i;const o=Mi(e.padding),a=this.title.length||this.beforeBody.length||this.body.length||this.afterBody.length||this.footer.length;e.enabled&&a&&(t.save(),t.globalAlpha=i,this.drawBackground(n,t,s,e),Ci(t,e.textDirection),n.y+=o.top,this.drawTitle(n,t,e),this.drawBody(n,t,e),this.drawFooter(n,t,e),Oi(t,e.textDirection),t.restore())}getActiveElements(){return this._active||[]}setActiveElements(t,e){const i=this._active,s=t.map((({datasetIndex:t,index:e})=>{const i=this.chart.getDatasetMeta(t);if(!i)throw new Error("Cannot find a dataset at index "+t);return{datasetIndex:t,element:i.data[e],index:e}})),n=!f(i,s),o=this._positionChanged(s,e);(n||o)&&(this._active=s,this._eventPosition=e,this._ignoreReplayEvents=!0,this.update(!0))}handleEvent(t,e,i=!0){if(e&&this._ignoreReplayEvents)return!1;this._ignoreReplayEvents=!1;const s=this.options,n=this._active||[],o=this._getActiveElements(t,n,e,i),a=this._positionChanged(o,t),r=e||!f(o,n)||a;return r&&(this._active=o,(s.enabled||s.external)&&(this._eventPosition={x:t.x,y:t.y},this.update(!0,e))),r}_getActiveElements(t,e,i,s){const n=this.options;if("mouseout"===t.type)return[];if(!s)return e;const o=this.chart.getElementsAtEventForMode(t,n.mode,n,i);return n.reverse&&o.reverse(),o}_positionChanged(t,e){const{caretX:i,caretY:s,options:n}=this,o=xa[n.position].call(this,t,e);return!1!==o&&(i!==o.x||s!==o.y)}}var La={id:"tooltip",_element:Ta,positioners:xa,afterInit(t,e,i){i&&(t.tooltip=new Ta({chart:t,options:i}))},beforeUpdate(t,e,i){t.tooltip&&t.tooltip.initialize(i)},reset(t,e,i){t.tooltip&&t.tooltip.initialize(i)},afterDraw(t){const e=t.tooltip;if(e&&e._willRender()){const i={tooltip:e};if(!1===t.notifyPlugins("beforeTooltipDraw",{...i,cancelable:!0}))return;e.draw(t.ctx),t.notifyPlugins("afterTooltipDraw",i)}},afterEvent(t,e){if(t.tooltip){const 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:(t,e)=>e.bodyFont.size,boxWidth:(t,e)=>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:Oa},defaultRoutes:{bodyFont:"font",footerFont:"font",titleFont:"font"},descriptors:{_scriptable:t=>"filter"!==t&&"itemSort"!==t&&"external"!==t,_indexable:!1,callbacks:{_scriptable:!1,_indexable:!1},animation:{_fallback:!1},animations:{_fallback:"animation"}},additionalOptionScopes:["interaction"]};return wn.register(Vn,zo,oo,t),wn.helpers={...Vi},wn._adapters=Dn,wn.Animation=Ss,wn.Animations=Ps,wn.animator=xt,wn.controllers=Js.controllers.items,wn.DatasetController=Vs,wn.Element=Bs,wn.elements=oo,wn.Interaction=Yi,wn.layouts=ns,wn.platforms=Ms,wn.Scale=Ks,wn.Ticks=ae,Object.assign(wn,Vn,zo,oo,t,Ms),wn.Chart=wn,"undefined"!=typeof window&&(window.Chart=wn),wn})); +//# sourceMappingURL=chart.umd.js.map From 0633a9bdefc1c9999f41557514b5df9ab1a7e8e6 Mon Sep 17 00:00:00 2001 From: SqrtMinusOne Date: Tue, 4 Apr 2023 23:28:29 +0300 Subject: [PATCH 02/11] feat(emacs): 1rst chart works as expected --- content/posts/2023-04-14-emacs.md | 4 +- org/2023-04-14-emacs.org | 4 +- static/js/2023-04-14-emacs.js | 134 ++++++++++++++++-- .../js/chartjs-adapter-date-fns.bundle.min.js | 7 + static/js/chartjs-plugin-datalabels.js | 7 + 5 files changed, 139 insertions(+), 17 deletions(-) create mode 100644 static/js/chartjs-adapter-date-fns.bundle.min.js create mode 100644 static/js/chartjs-plugin-datalabels.js diff --git a/content/posts/2023-04-14-emacs.md b/content/posts/2023-04-14-emacs.md index 99d0046..64c7797 100644 --- a/content/posts/2023-04-14-emacs.md +++ b/content/posts/2023-04-14-emacs.md @@ -4,9 +4,9 @@ author = ["Pavel Korytov"] date = 2023-02-02 tags = ["emacs"] draft = true -scripts = ["/js/chart.js", "/js/2023-04-14-emacs.js"] +scripts = ["/js/chart.js", "/js/chartjs-adapter-date-fns.bundle.min.js", "/js/chartjs-plugin-datalabels.js", "/js/2023-04-14-emacs.js"] +++ Hello world - \ No newline at end of file + \ No newline at end of file diff --git a/org/2023-04-14-emacs.org b/org/2023-04-14-emacs.org index ee831a9..cfc7d6d 100644 --- a/org/2023-04-14-emacs.org +++ b/org/2023-04-14-emacs.org @@ -4,10 +4,10 @@ #+DATE: 2023-02-02 #+HUGO_TAGS: emacs #+HUGO_DRAFT: true -#+HUGO_CUSTOM_FRONT_MATTER: :scripts '("/js/chart.js" "/js/2023-04-14-emacs.js") +#+HUGO_CUSTOM_FRONT_MATTER: :scripts '("/js/chart.js" "/js/chartjs-adapter-date-fns.bundle.min.js" "/js/chartjs-plugin-datalabels.js" "/js/2023-04-14-emacs.js") Hello world #+begin_export html - + #+end_export diff --git a/static/js/2023-04-14-emacs.js b/static/js/2023-04-14-emacs.js index 358e9f6..3468942 100644 --- a/static/js/2023-04-14-emacs.js +++ b/static/js/2023-04-14-emacs.js @@ -1,22 +1,130 @@ -function initChart() { - const ctx = document.getElementById("myChart"); +const TODAY = new Date("2023-04-14"); +const TODAY_LOCALE = TODAY.toLocaleDateString("en-GB"); - new Chart(ctx, { - type: "bar", - data: { - labels: ["Red", "Blue", "Yellow", "Green", "Purple", "Orange"], - datasets: [ +const EMACS_DATA = { + labels: ["Editor/IDE", "File manager"], + datasets: [ + { + label: "Jupyter", + data: [ { - label: "# of Votes", - data: [12, 19, 3, 5, 2, 3], - borderWidth: 1, + name: "Editor/IDE", + span: [new Date("2018-10-24"), new Date("2021-04-01")], }, ], + yAxisID: "yAxis1", }, + { + label: "NeoVim", + data: [ + { + name: "Editor/IDE", + span: [new Date("2019-03-30"), new Date("2020-10-12")], + }, + ], + yAxisID: "yAxis1", + }, + { + label: "DataGrip", + data: [ + { + name: "Editor/IDE", + span: [new Date("2020-02-01"), TODAY], + }, + ], + yAxisID: "yAxis1", + }, + { + label: "Emacs", + data: [ + { + name: "Editor/IDE", + span: [new Date("2020-10-12"), TODAY], + }, + ], + yAxisID: "yAxis1", + }, + { + label: "vifm", + data: [ + { + name: "File manager", + span: [new Date("2020-02-17"), new Date("2020-11-11")], + }, + ], + yAxisID: "yAxis2", + }, + { + label: "Dired", + data: [ + { + name: "File manager", + span: [new Date("2020-11-11"), TODAY], + }, + ], + yAxisID: "yAxis2", + }, + ], +}; + +function emacsChart() { + const ctx = document.getElementById("chart-emacs-history"); + new Chart(ctx, { + type: "bar", + data: EMACS_DATA, + plugins: [ChartDataLabels], options: { + indexAxis: "y", + grouped: true, + parsing: { + yAxisKey: "name", + xAxisKey: "span", + }, + layout: { + padding: 1, + }, scales: { - y: { - beginAtZero: true, + x: { + type: "time", + min: new Date("2018-06"), + }, + yAxis1: { + ticks: { + display: false, + }, + }, + yAxis2: { + ticks: { + // display: false + }, + }, + }, + plugins: { + legend: { + display: false, + }, + datalabels: { + formatter: function (value, context) { + return context.dataset.label; + }, + color: "black", + }, + tooltip: { + callbacks: { + label: function (context) { + const startDate = new Date( + context.parsed._custom.start + ).toLocaleDateString("en-GB"); + let endDate = new Date( + context.parsed._custom.end + ).toLocaleDateString("en-GB"); + if (endDate === TODAY_LOCALE) { + endDate = "Today"; + } + const label = context.dataset.label; + return `${label}: ${startDate} - ${endDate}`; + }, + }, }, }, }, @@ -26,7 +134,7 @@ function initChart() { document.addEventListener( "DOMContentLoaded", function () { - initChart(); + emacsChart(); }, false ); diff --git a/static/js/chartjs-adapter-date-fns.bundle.min.js b/static/js/chartjs-adapter-date-fns.bundle.min.js new file mode 100644 index 0000000..37bffe6 --- /dev/null +++ b/static/js/chartjs-adapter-date-fns.bundle.min.js @@ -0,0 +1,7 @@ +/*! + * chartjs-adapter-date-fns v3.0.0 + * https://www.chartjs.org + * (c) 2022 chartjs-adapter-date-fns Contributors + * Released under the MIT license + */ +!function(t,e){"object"==typeof exports&&"undefined"!=typeof module?e(require("chart.js")):"function"==typeof define&&define.amd?define(["chart.js"],e):e((t="undefined"!=typeof globalThis?globalThis:t||self).Chart)}(this,(function(t){"use strict";function e(t){if(null===t||!0===t||!1===t)return NaN;var e=Number(t);return isNaN(e)?e:e<0?Math.ceil(e):Math.floor(e)}function r(t,e){if(e.length1?"s":"")+" required, but only "+e.length+" present")}function n(t){r(1,arguments);var e=Object.prototype.toString.call(t);return t instanceof Date||"object"==typeof t&&"[object Date]"===e?new Date(t.getTime()):"number"==typeof t||"[object Number]"===e?new Date(t):("string"!=typeof t&&"[object String]"!==e||"undefined"==typeof console||(console.warn("Starting with v2.0.0-beta.1 date-fns doesn't accept strings as date arguments. Please use `parseISO` to parse strings. See: https://git.io/fjule"),console.warn((new Error).stack)),new Date(NaN))}function a(t,a){r(2,arguments);var i=n(t),o=e(a);return isNaN(o)?new Date(NaN):o?(i.setDate(i.getDate()+o),i):i}function i(t,a){r(2,arguments);var i=n(t),o=e(a);if(isNaN(o))return new Date(NaN);if(!o)return i;var u=i.getDate(),s=new Date(i.getTime());s.setMonth(i.getMonth()+o+1,0);var c=s.getDate();return u>=c?s:(i.setFullYear(s.getFullYear(),s.getMonth(),u),i)}function o(t,a){r(2,arguments);var i=n(t).getTime(),o=e(a);return new Date(i+o)}var u=36e5;function s(t,a){r(1,arguments);var i=a||{},o=i.locale,u=o&&o.options&&o.options.weekStartsOn,s=null==u?0:e(u),c=null==i.weekStartsOn?s:e(i.weekStartsOn);if(!(c>=0&&c<=6))throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");var d=n(t),l=d.getDay(),f=(l0?1:o}function m(t){r(1,arguments);var e=n(t);return!isNaN(e)}function w(t,e){r(2,arguments);var a=n(t),i=n(e),o=a.getFullYear()-i.getFullYear(),u=a.getMonth()-i.getMonth();return 12*o+u}function g(t,e){r(2,arguments);var a=n(t),i=n(e);return a.getFullYear()-i.getFullYear()}function v(t,e){var r=t.getFullYear()-e.getFullYear()||t.getMonth()-e.getMonth()||t.getDate()-e.getDate()||t.getHours()-e.getHours()||t.getMinutes()-e.getMinutes()||t.getSeconds()-e.getSeconds()||t.getMilliseconds()-e.getMilliseconds();return r<0?-1:r>0?1:r}function y(t,e){r(2,arguments);var a=n(t),i=n(e),o=v(a,i),u=Math.abs(f(a,i));a.setDate(a.getDate()-o*u);var s=v(a,i)===-o,c=o*(u-s);return 0===c?0:c}function b(t,e){r(2,arguments);var a=n(t),i=n(e);return a.getTime()-i.getTime()}var T=36e5;function p(t){r(1,arguments);var e=n(t);return e.setHours(23,59,59,999),e}function C(t){r(1,arguments);var e=n(t),a=e.getMonth();return e.setFullYear(e.getFullYear(),a+1,0),e.setHours(23,59,59,999),e}function M(t){r(1,arguments);var e=n(t);return p(e).getTime()===C(e).getTime()}function D(t,e){r(2,arguments);var a,i=n(t),o=n(e),u=h(i,o),s=Math.abs(w(i,o));if(s<1)a=0;else{1===i.getMonth()&&i.getDate()>27&&i.setDate(30),i.setMonth(i.getMonth()-u*s);var c=h(i,o)===-u;M(n(t))&&1===s&&1===h(t,o)&&(c=!1),a=u*(s-c)}return 0===a?0:a}var x={lessThanXSeconds:{one:"less than a second",other:"less than {{count}} seconds"},xSeconds:{one:"1 second",other:"{{count}} seconds"},halfAMinute:"half a minute",lessThanXMinutes:{one:"less than a minute",other:"less than {{count}} minutes"},xMinutes:{one:"1 minute",other:"{{count}} minutes"},aboutXHours:{one:"about 1 hour",other:"about {{count}} hours"},xHours:{one:"1 hour",other:"{{count}} hours"},xDays:{one:"1 day",other:"{{count}} days"},aboutXWeeks:{one:"about 1 week",other:"about {{count}} weeks"},xWeeks:{one:"1 week",other:"{{count}} weeks"},aboutXMonths:{one:"about 1 month",other:"about {{count}} months"},xMonths:{one:"1 month",other:"{{count}} months"},aboutXYears:{one:"about 1 year",other:"about {{count}} years"},xYears:{one:"1 year",other:"{{count}} years"},overXYears:{one:"over 1 year",other:"over {{count}} years"},almostXYears:{one:"almost 1 year",other:"almost {{count}} years"}};function k(t){return function(e){var r=e||{},n=r.width?String(r.width):t.defaultWidth;return t.formats[n]||t.formats[t.defaultWidth]}}var U={date:k({formats:{full:"EEEE, MMMM do, y",long:"MMMM do, y",medium:"MMM d, y",short:"MM/dd/yyyy"},defaultWidth:"full"}),time:k({formats:{full:"h:mm:ss a zzzz",long:"h:mm:ss a z",medium:"h:mm:ss a",short:"h:mm a"},defaultWidth:"full"}),dateTime:k({formats:{full:"{{date}} 'at' {{time}}",long:"{{date}} 'at' {{time}}",medium:"{{date}}, {{time}}",short:"{{date}}, {{time}}"},defaultWidth:"full"})},Y={lastWeek:"'last' eeee 'at' p",yesterday:"'yesterday at' p",today:"'today at' p",tomorrow:"'tomorrow at' p",nextWeek:"eeee 'at' p",other:"P"};function N(t){return function(e,r){var n,a=r||{};if("formatting"===(a.context?String(a.context):"standalone")&&t.formattingValues){var i=t.defaultFormattingWidth||t.defaultWidth,o=a.width?String(a.width):i;n=t.formattingValues[o]||t.formattingValues[i]}else{var u=t.defaultWidth,s=a.width?String(a.width):t.defaultWidth;n=t.values[s]||t.values[u]}return n[t.argumentCallback?t.argumentCallback(e):e]}}function S(t){return function(e,r){var n=String(e),a=r||{},i=a.width,o=i&&t.matchPatterns[i]||t.matchPatterns[t.defaultMatchWidth],u=n.match(o);if(!u)return null;var s,c=u[0],d=i&&t.parsePatterns[i]||t.parsePatterns[t.defaultParseWidth];return s="[object Array]"===Object.prototype.toString.call(d)?function(t,e){for(var r=0;r0?"in "+n:n+" ago":n},formatLong:U,formatRelative:function(t,e,r,n){return Y[t]},localize:{ordinalNumber:function(t,e){var r=Number(t),n=r%100;if(n>20||n<10)switch(n%10){case 1:return r+"st";case 2:return r+"nd";case 3:return r+"rd"}return r+"th"},era:N({values:{narrow:["B","A"],abbreviated:["BC","AD"],wide:["Before Christ","Anno Domini"]},defaultWidth:"wide"}),quarter:N({values:{narrow:["1","2","3","4"],abbreviated:["Q1","Q2","Q3","Q4"],wide:["1st quarter","2nd quarter","3rd quarter","4th quarter"]},defaultWidth:"wide",argumentCallback:function(t){return Number(t)-1}}),month:N({values:{narrow:["J","F","M","A","M","J","J","A","S","O","N","D"],abbreviated:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],wide:["January","February","March","April","May","June","July","August","September","October","November","December"]},defaultWidth:"wide"}),day:N({values:{narrow:["S","M","T","W","T","F","S"],short:["Su","Mo","Tu","We","Th","Fr","Sa"],abbreviated:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],wide:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"]},defaultWidth:"wide"}),dayPeriod:N({values:{narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"morning",afternoon:"afternoon",evening:"evening",night:"night"}},defaultWidth:"wide",formattingValues:{narrow:{am:"a",pm:"p",midnight:"mi",noon:"n",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},abbreviated:{am:"AM",pm:"PM",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"},wide:{am:"a.m.",pm:"p.m.",midnight:"midnight",noon:"noon",morning:"in the morning",afternoon:"in the afternoon",evening:"in the evening",night:"at night"}},defaultFormattingWidth:"wide"})},match:{ordinalNumber:(P={matchPattern:/^(\d+)(th|st|nd|rd)?/i,parsePattern:/\d+/i,valueCallback:function(t){return parseInt(t,10)}},function(t,e){var r=String(t),n=e||{},a=r.match(P.matchPattern);if(!a)return null;var i=a[0],o=r.match(P.parsePattern);if(!o)return null;var u=P.valueCallback?P.valueCallback(o[0]):o[0];return{value:u=n.valueCallback?n.valueCallback(u):u,rest:r.slice(i.length)}}),era:S({matchPatterns:{narrow:/^(b|a)/i,abbreviated:/^(b\.?\s?c\.?|b\.?\s?c\.?\s?e\.?|a\.?\s?d\.?|c\.?\s?e\.?)/i,wide:/^(before christ|before common era|anno domini|common era)/i},defaultMatchWidth:"wide",parsePatterns:{any:[/^b/i,/^(a|c)/i]},defaultParseWidth:"any"}),quarter:S({matchPatterns:{narrow:/^[1234]/i,abbreviated:/^q[1234]/i,wide:/^[1234](th|st|nd|rd)? quarter/i},defaultMatchWidth:"wide",parsePatterns:{any:[/1/i,/2/i,/3/i,/4/i]},defaultParseWidth:"any",valueCallback:function(t){return t+1}}),month:S({matchPatterns:{narrow:/^[jfmasond]/i,abbreviated:/^(jan|feb|mar|apr|may|jun|jul|aug|sep|oct|nov|dec)/i,wide:/^(january|february|march|april|may|june|july|august|september|october|november|december)/i},defaultMatchWidth:"wide",parsePatterns:{narrow:[/^j/i,/^f/i,/^m/i,/^a/i,/^m/i,/^j/i,/^j/i,/^a/i,/^s/i,/^o/i,/^n/i,/^d/i],any:[/^ja/i,/^f/i,/^mar/i,/^ap/i,/^may/i,/^jun/i,/^jul/i,/^au/i,/^s/i,/^o/i,/^n/i,/^d/i]},defaultParseWidth:"any"}),day:S({matchPatterns:{narrow:/^[smtwf]/i,short:/^(su|mo|tu|we|th|fr|sa)/i,abbreviated:/^(sun|mon|tue|wed|thu|fri|sat)/i,wide:/^(sunday|monday|tuesday|wednesday|thursday|friday|saturday)/i},defaultMatchWidth:"wide",parsePatterns:{narrow:[/^s/i,/^m/i,/^t/i,/^w/i,/^t/i,/^f/i,/^s/i],any:[/^su/i,/^m/i,/^tu/i,/^w/i,/^th/i,/^f/i,/^sa/i]},defaultParseWidth:"any"}),dayPeriod:S({matchPatterns:{narrow:/^(a|p|mi|n|(in the|at) (morning|afternoon|evening|night))/i,any:/^([ap]\.?\s?m\.?|midnight|noon|(in the|at) (morning|afternoon|evening|night))/i},defaultMatchWidth:"any",parsePatterns:{any:{am:/^a/i,pm:/^p/i,midnight:/^mi/i,noon:/^no/i,morning:/morning/i,afternoon:/afternoon/i,evening:/evening/i,night:/night/i}},defaultParseWidth:"any"})},options:{weekStartsOn:0,firstWeekContainsDate:1}};function H(t,n){r(2,arguments);var a=e(n);return o(t,-a)}function E(t,e){for(var r=t<0?"-":"",n=Math.abs(t).toString();n.length0?r:1-r;return E("yy"===e?n%100:n,e.length)},M:function(t,e){var r=t.getUTCMonth();return"M"===e?String(r+1):E(r+1,2)},d:function(t,e){return E(t.getUTCDate(),e.length)},a:function(t,e){var r=t.getUTCHours()/12>=1?"pm":"am";switch(e){case"a":case"aa":return r.toUpperCase();case"aaa":return r;case"aaaaa":return r[0];default:return"am"===r?"a.m.":"p.m."}},h:function(t,e){return E(t.getUTCHours()%12||12,e.length)},H:function(t,e){return E(t.getUTCHours(),e.length)},m:function(t,e){return E(t.getUTCMinutes(),e.length)},s:function(t,e){return E(t.getUTCSeconds(),e.length)},S:function(t,e){var r=e.length,n=t.getUTCMilliseconds();return E(Math.floor(n*Math.pow(10,r-3)),e.length)}},F=864e5;function W(t){r(1,arguments);var e=1,a=n(t),i=a.getUTCDay(),o=(i=o.getTime()?a+1:e.getTime()>=s.getTime()?a:a-1}function Q(t){r(1,arguments);var e=L(t),n=new Date(0);n.setUTCFullYear(e,0,4),n.setUTCHours(0,0,0,0);var a=W(n);return a}var R=6048e5;function I(t){r(1,arguments);var e=n(t),a=W(e).getTime()-Q(e).getTime();return Math.round(a/R)+1}function G(t,a){r(1,arguments);var i=a||{},o=i.locale,u=o&&o.options&&o.options.weekStartsOn,s=null==u?0:e(u),c=null==i.weekStartsOn?s:e(i.weekStartsOn);if(!(c>=0&&c<=6))throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");var d=n(t),l=d.getUTCDay(),f=(l=1&&l<=7))throw new RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");var f=new Date(0);f.setUTCFullYear(o+1,0,l),f.setUTCHours(0,0,0,0);var h=G(f,a),m=new Date(0);m.setUTCFullYear(o,0,l),m.setUTCHours(0,0,0,0);var w=G(m,a);return i.getTime()>=h.getTime()?o+1:i.getTime()>=w.getTime()?o:o-1}function j(t,n){r(1,arguments);var a=n||{},i=a.locale,o=i&&i.options&&i.options.firstWeekContainsDate,u=null==o?1:e(o),s=null==a.firstWeekContainsDate?u:e(a.firstWeekContainsDate),c=X(t,n),d=new Date(0);d.setUTCFullYear(c,0,s),d.setUTCHours(0,0,0,0);var l=G(d,n);return l}var B=6048e5;function z(t,e){r(1,arguments);var a=n(t),i=G(a,e).getTime()-j(a,e).getTime();return Math.round(i/B)+1}var A="midnight",Z="noon",K="morning",$="afternoon",_="evening",J="night",V={G:function(t,e,r){var n=t.getUTCFullYear()>0?1:0;switch(e){case"G":case"GG":case"GGG":return r.era(n,{width:"abbreviated"});case"GGGGG":return r.era(n,{width:"narrow"});default:return r.era(n,{width:"wide"})}},y:function(t,e,r){if("yo"===e){var n=t.getUTCFullYear(),a=n>0?n:1-n;return r.ordinalNumber(a,{unit:"year"})}return O.y(t,e)},Y:function(t,e,r,n){var a=X(t,n),i=a>0?a:1-a;return"YY"===e?E(i%100,2):"Yo"===e?r.ordinalNumber(i,{unit:"year"}):E(i,e.length)},R:function(t,e){return E(L(t),e.length)},u:function(t,e){return E(t.getUTCFullYear(),e.length)},Q:function(t,e,r){var n=Math.ceil((t.getUTCMonth()+1)/3);switch(e){case"Q":return String(n);case"QQ":return E(n,2);case"Qo":return r.ordinalNumber(n,{unit:"quarter"});case"QQQ":return r.quarter(n,{width:"abbreviated",context:"formatting"});case"QQQQQ":return r.quarter(n,{width:"narrow",context:"formatting"});default:return r.quarter(n,{width:"wide",context:"formatting"})}},q:function(t,e,r){var n=Math.ceil((t.getUTCMonth()+1)/3);switch(e){case"q":return String(n);case"qq":return E(n,2);case"qo":return r.ordinalNumber(n,{unit:"quarter"});case"qqq":return r.quarter(n,{width:"abbreviated",context:"standalone"});case"qqqqq":return r.quarter(n,{width:"narrow",context:"standalone"});default:return r.quarter(n,{width:"wide",context:"standalone"})}},M:function(t,e,r){var n=t.getUTCMonth();switch(e){case"M":case"MM":return O.M(t,e);case"Mo":return r.ordinalNumber(n+1,{unit:"month"});case"MMM":return r.month(n,{width:"abbreviated",context:"formatting"});case"MMMMM":return r.month(n,{width:"narrow",context:"formatting"});default:return r.month(n,{width:"wide",context:"formatting"})}},L:function(t,e,r){var n=t.getUTCMonth();switch(e){case"L":return String(n+1);case"LL":return E(n+1,2);case"Lo":return r.ordinalNumber(n+1,{unit:"month"});case"LLL":return r.month(n,{width:"abbreviated",context:"standalone"});case"LLLLL":return r.month(n,{width:"narrow",context:"standalone"});default:return r.month(n,{width:"wide",context:"standalone"})}},w:function(t,e,r,n){var a=z(t,n);return"wo"===e?r.ordinalNumber(a,{unit:"week"}):E(a,e.length)},I:function(t,e,r){var n=I(t);return"Io"===e?r.ordinalNumber(n,{unit:"week"}):E(n,e.length)},d:function(t,e,r){return"do"===e?r.ordinalNumber(t.getUTCDate(),{unit:"date"}):O.d(t,e)},D:function(t,e,a){var i=function(t){r(1,arguments);var e=n(t),a=e.getTime();e.setUTCMonth(0,1),e.setUTCHours(0,0,0,0);var i=e.getTime(),o=a-i;return Math.floor(o/F)+1}(t);return"Do"===e?a.ordinalNumber(i,{unit:"dayOfYear"}):E(i,e.length)},E:function(t,e,r){var n=t.getUTCDay();switch(e){case"E":case"EE":case"EEE":return r.day(n,{width:"abbreviated",context:"formatting"});case"EEEEE":return r.day(n,{width:"narrow",context:"formatting"});case"EEEEEE":return r.day(n,{width:"short",context:"formatting"});default:return r.day(n,{width:"wide",context:"formatting"})}},e:function(t,e,r,n){var a=t.getUTCDay(),i=(a-n.weekStartsOn+8)%7||7;switch(e){case"e":return String(i);case"ee":return E(i,2);case"eo":return r.ordinalNumber(i,{unit:"day"});case"eee":return r.day(a,{width:"abbreviated",context:"formatting"});case"eeeee":return r.day(a,{width:"narrow",context:"formatting"});case"eeeeee":return r.day(a,{width:"short",context:"formatting"});default:return r.day(a,{width:"wide",context:"formatting"})}},c:function(t,e,r,n){var a=t.getUTCDay(),i=(a-n.weekStartsOn+8)%7||7;switch(e){case"c":return String(i);case"cc":return E(i,e.length);case"co":return r.ordinalNumber(i,{unit:"day"});case"ccc":return r.day(a,{width:"abbreviated",context:"standalone"});case"ccccc":return r.day(a,{width:"narrow",context:"standalone"});case"cccccc":return r.day(a,{width:"short",context:"standalone"});default:return r.day(a,{width:"wide",context:"standalone"})}},i:function(t,e,r){var n=t.getUTCDay(),a=0===n?7:n;switch(e){case"i":return String(a);case"ii":return E(a,e.length);case"io":return r.ordinalNumber(a,{unit:"day"});case"iii":return r.day(n,{width:"abbreviated",context:"formatting"});case"iiiii":return r.day(n,{width:"narrow",context:"formatting"});case"iiiiii":return r.day(n,{width:"short",context:"formatting"});default:return r.day(n,{width:"wide",context:"formatting"})}},a:function(t,e,r){var n=t.getUTCHours()/12>=1?"pm":"am";switch(e){case"a":case"aa":return r.dayPeriod(n,{width:"abbreviated",context:"formatting"});case"aaa":return r.dayPeriod(n,{width:"abbreviated",context:"formatting"}).toLowerCase();case"aaaaa":return r.dayPeriod(n,{width:"narrow",context:"formatting"});default:return r.dayPeriod(n,{width:"wide",context:"formatting"})}},b:function(t,e,r){var n,a=t.getUTCHours();switch(n=12===a?Z:0===a?A:a/12>=1?"pm":"am",e){case"b":case"bb":return r.dayPeriod(n,{width:"abbreviated",context:"formatting"});case"bbb":return r.dayPeriod(n,{width:"abbreviated",context:"formatting"}).toLowerCase();case"bbbbb":return r.dayPeriod(n,{width:"narrow",context:"formatting"});default:return r.dayPeriod(n,{width:"wide",context:"formatting"})}},B:function(t,e,r){var n,a=t.getUTCHours();switch(n=a>=17?_:a>=12?$:a>=4?K:J,e){case"B":case"BB":case"BBB":return r.dayPeriod(n,{width:"abbreviated",context:"formatting"});case"BBBBB":return r.dayPeriod(n,{width:"narrow",context:"formatting"});default:return r.dayPeriod(n,{width:"wide",context:"formatting"})}},h:function(t,e,r){if("ho"===e){var n=t.getUTCHours()%12;return 0===n&&(n=12),r.ordinalNumber(n,{unit:"hour"})}return O.h(t,e)},H:function(t,e,r){return"Ho"===e?r.ordinalNumber(t.getUTCHours(),{unit:"hour"}):O.H(t,e)},K:function(t,e,r){var n=t.getUTCHours()%12;return"Ko"===e?r.ordinalNumber(n,{unit:"hour"}):E(n,e.length)},k:function(t,e,r){var n=t.getUTCHours();return 0===n&&(n=24),"ko"===e?r.ordinalNumber(n,{unit:"hour"}):E(n,e.length)},m:function(t,e,r){return"mo"===e?r.ordinalNumber(t.getUTCMinutes(),{unit:"minute"}):O.m(t,e)},s:function(t,e,r){return"so"===e?r.ordinalNumber(t.getUTCSeconds(),{unit:"second"}):O.s(t,e)},S:function(t,e){return O.S(t,e)},X:function(t,e,r,n){var a=(n._originalDate||t).getTimezoneOffset();if(0===a)return"Z";switch(e){case"X":return et(a);case"XXXX":case"XX":return rt(a);default:return rt(a,":")}},x:function(t,e,r,n){var a=(n._originalDate||t).getTimezoneOffset();switch(e){case"x":return et(a);case"xxxx":case"xx":return rt(a);default:return rt(a,":")}},O:function(t,e,r,n){var a=(n._originalDate||t).getTimezoneOffset();switch(e){case"O":case"OO":case"OOO":return"GMT"+tt(a,":");default:return"GMT"+rt(a,":")}},z:function(t,e,r,n){var a=(n._originalDate||t).getTimezoneOffset();switch(e){case"z":case"zz":case"zzz":return"GMT"+tt(a,":");default:return"GMT"+rt(a,":")}},t:function(t,e,r,n){var a=n._originalDate||t;return E(Math.floor(a.getTime()/1e3),e.length)},T:function(t,e,r,n){return E((n._originalDate||t).getTime(),e.length)}};function tt(t,e){var r=t>0?"-":"+",n=Math.abs(t),a=Math.floor(n/60),i=n%60;if(0===i)return r+String(a);var o=e||"";return r+String(a)+o+E(i,2)}function et(t,e){return t%60==0?(t>0?"-":"+")+E(Math.abs(t)/60,2):rt(t,e)}function rt(t,e){var r=e||"",n=t>0?"-":"+",a=Math.abs(t);return n+E(Math.floor(a/60),2)+r+E(a%60,2)}var nt=V;function at(t,e){switch(t){case"P":return e.date({width:"short"});case"PP":return e.date({width:"medium"});case"PPP":return e.date({width:"long"});default:return e.date({width:"full"})}}function it(t,e){switch(t){case"p":return e.time({width:"short"});case"pp":return e.time({width:"medium"});case"ppp":return e.time({width:"long"});default:return e.time({width:"full"})}}var ot={p:it,P:function(t,e){var r,n=t.match(/(P+)(p+)?/),a=n[1],i=n[2];if(!i)return at(t,e);switch(a){case"P":r=e.dateTime({width:"short"});break;case"PP":r=e.dateTime({width:"medium"});break;case"PPP":r=e.dateTime({width:"long"});break;default:r=e.dateTime({width:"full"})}return r.replace("{{date}}",at(a,e)).replace("{{time}}",it(i,e))}},ut=ot,st=["D","DD"],ct=["YY","YYYY"];function dt(t){return-1!==st.indexOf(t)}function lt(t){return-1!==ct.indexOf(t)}function ft(t,e,r){if("YYYY"===t)throw new RangeError("Use `yyyy` instead of `YYYY` (in `".concat(e,"`) for formatting years to the input `").concat(r,"`; see: https://git.io/fxCyr"));if("YY"===t)throw new RangeError("Use `yy` instead of `YY` (in `".concat(e,"`) for formatting years to the input `").concat(r,"`; see: https://git.io/fxCyr"));if("D"===t)throw new RangeError("Use `d` instead of `D` (in `".concat(e,"`) for formatting days of the month to the input `").concat(r,"`; see: https://git.io/fxCyr"));if("DD"===t)throw new RangeError("Use `dd` instead of `DD` (in `".concat(e,"`) for formatting days of the month to the input `").concat(r,"`; see: https://git.io/fxCyr"))}var ht=/[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g,mt=/P+p+|P+|p+|''|'(''|[^'])+('|$)|./g,wt=/^'([^]*?)'?$/,gt=/''/g,vt=/[a-zA-Z]/;function yt(t){return t.match(wt)[1].replace(gt,"'")}function bt(t,e){if(null==t)throw new TypeError("assign requires that input parameter not be null or undefined");for(var r in e=e||{})e.hasOwnProperty(r)&&(t[r]=e[r]);return t}function Tt(t,a,i){r(2,arguments);var o=i||{},u=o.locale,s=u&&u.options&&u.options.weekStartsOn,c=null==s?0:e(s),d=null==o.weekStartsOn?c:e(o.weekStartsOn);if(!(d>=0&&d<=6))throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");var l=n(t),f=e(a),h=l.getUTCDay(),m=f%7,w=(m+7)%7,g=(w0,a=n?e:1-e;if(a<=50)r=t||100;else{var i=a+50;r=t+100*Math.floor(i/100)-(t>=i%100?100:0)}return n?r:1-r}var Jt=[31,28,31,30,31,30,31,31,30,31,30,31],Vt=[31,29,31,30,31,30,31,31,30,31,30,31];function te(t){return t%400==0||t%4==0&&t%100!=0}var ee={G:{priority:140,parse:function(t,e,r,n){switch(e){case"G":case"GG":case"GGG":return r.era(t,{width:"abbreviated"})||r.era(t,{width:"narrow"});case"GGGGG":return r.era(t,{width:"narrow"});default:return r.era(t,{width:"wide"})||r.era(t,{width:"abbreviated"})||r.era(t,{width:"narrow"})}},set:function(t,e,r,n){return e.era=r,t.setUTCFullYear(r,0,1),t.setUTCHours(0,0,0,0),t},incompatibleTokens:["R","u","t","T"]},y:{priority:130,parse:function(t,e,r,n){var a=function(t){return{year:t,isTwoDigitYear:"yy"===e}};switch(e){case"y":return Zt(4,t,a);case"yo":return r.ordinalNumber(t,{unit:"year",valueCallback:a});default:return Zt(e.length,t,a)}},validate:function(t,e,r){return e.isTwoDigitYear||e.year>0},set:function(t,e,r,n){var a=t.getUTCFullYear();if(r.isTwoDigitYear){var i=_t(r.year,a);return t.setUTCFullYear(i,0,1),t.setUTCHours(0,0,0,0),t}var o="era"in e&&1!==e.era?1-r.year:r.year;return t.setUTCFullYear(o,0,1),t.setUTCHours(0,0,0,0),t},incompatibleTokens:["Y","R","u","w","I","i","e","c","t","T"]},Y:{priority:130,parse:function(t,e,r,n){var a=function(t){return{year:t,isTwoDigitYear:"YY"===e}};switch(e){case"Y":return Zt(4,t,a);case"Yo":return r.ordinalNumber(t,{unit:"year",valueCallback:a});default:return Zt(e.length,t,a)}},validate:function(t,e,r){return e.isTwoDigitYear||e.year>0},set:function(t,e,r,n){var a=X(t,n);if(r.isTwoDigitYear){var i=_t(r.year,a);return t.setUTCFullYear(i,0,n.firstWeekContainsDate),t.setUTCHours(0,0,0,0),G(t,n)}var o="era"in e&&1!==e.era?1-r.year:r.year;return t.setUTCFullYear(o,0,n.firstWeekContainsDate),t.setUTCHours(0,0,0,0),G(t,n)},incompatibleTokens:["y","R","u","Q","q","M","L","I","d","D","i","t","T"]},R:{priority:130,parse:function(t,e,r,n){return Kt("R"===e?4:e.length,t)},set:function(t,e,r,n){var a=new Date(0);return a.setUTCFullYear(r,0,4),a.setUTCHours(0,0,0,0),W(a)},incompatibleTokens:["G","y","Y","u","Q","q","M","L","w","d","D","e","c","t","T"]},u:{priority:130,parse:function(t,e,r,n){return Kt("u"===e?4:e.length,t)},set:function(t,e,r,n){return t.setUTCFullYear(r,0,1),t.setUTCHours(0,0,0,0),t},incompatibleTokens:["G","y","Y","R","w","I","i","e","c","t","T"]},Q:{priority:120,parse:function(t,e,r,n){switch(e){case"Q":case"QQ":return Zt(e.length,t);case"Qo":return r.ordinalNumber(t,{unit:"quarter"});case"QQQ":return r.quarter(t,{width:"abbreviated",context:"formatting"})||r.quarter(t,{width:"narrow",context:"formatting"});case"QQQQQ":return r.quarter(t,{width:"narrow",context:"formatting"});default:return r.quarter(t,{width:"wide",context:"formatting"})||r.quarter(t,{width:"abbreviated",context:"formatting"})||r.quarter(t,{width:"narrow",context:"formatting"})}},validate:function(t,e,r){return e>=1&&e<=4},set:function(t,e,r,n){return t.setUTCMonth(3*(r-1),1),t.setUTCHours(0,0,0,0),t},incompatibleTokens:["Y","R","q","M","L","w","I","d","D","i","e","c","t","T"]},q:{priority:120,parse:function(t,e,r,n){switch(e){case"q":case"qq":return Zt(e.length,t);case"qo":return r.ordinalNumber(t,{unit:"quarter"});case"qqq":return r.quarter(t,{width:"abbreviated",context:"standalone"})||r.quarter(t,{width:"narrow",context:"standalone"});case"qqqqq":return r.quarter(t,{width:"narrow",context:"standalone"});default:return r.quarter(t,{width:"wide",context:"standalone"})||r.quarter(t,{width:"abbreviated",context:"standalone"})||r.quarter(t,{width:"narrow",context:"standalone"})}},validate:function(t,e,r){return e>=1&&e<=4},set:function(t,e,r,n){return t.setUTCMonth(3*(r-1),1),t.setUTCHours(0,0,0,0),t},incompatibleTokens:["Y","R","Q","M","L","w","I","d","D","i","e","c","t","T"]},M:{priority:110,parse:function(t,e,r,n){var a=function(t){return t-1};switch(e){case"M":return Bt(pt,t,a);case"MM":return Zt(2,t,a);case"Mo":return r.ordinalNumber(t,{unit:"month",valueCallback:a});case"MMM":return r.month(t,{width:"abbreviated",context:"formatting"})||r.month(t,{width:"narrow",context:"formatting"});case"MMMMM":return r.month(t,{width:"narrow",context:"formatting"});default:return r.month(t,{width:"wide",context:"formatting"})||r.month(t,{width:"abbreviated",context:"formatting"})||r.month(t,{width:"narrow",context:"formatting"})}},validate:function(t,e,r){return e>=0&&e<=11},set:function(t,e,r,n){return t.setUTCMonth(r,1),t.setUTCHours(0,0,0,0),t},incompatibleTokens:["Y","R","q","Q","L","w","I","D","i","e","c","t","T"]},L:{priority:110,parse:function(t,e,r,n){var a=function(t){return t-1};switch(e){case"L":return Bt(pt,t,a);case"LL":return Zt(2,t,a);case"Lo":return r.ordinalNumber(t,{unit:"month",valueCallback:a});case"LLL":return r.month(t,{width:"abbreviated",context:"standalone"})||r.month(t,{width:"narrow",context:"standalone"});case"LLLLL":return r.month(t,{width:"narrow",context:"standalone"});default:return r.month(t,{width:"wide",context:"standalone"})||r.month(t,{width:"abbreviated",context:"standalone"})||r.month(t,{width:"narrow",context:"standalone"})}},validate:function(t,e,r){return e>=0&&e<=11},set:function(t,e,r,n){return t.setUTCMonth(r,1),t.setUTCHours(0,0,0,0),t},incompatibleTokens:["Y","R","q","Q","M","w","I","D","i","e","c","t","T"]},w:{priority:100,parse:function(t,e,r,n){switch(e){case"w":return Bt(Dt,t);case"wo":return r.ordinalNumber(t,{unit:"week"});default:return Zt(e.length,t)}},validate:function(t,e,r){return e>=1&&e<=53},set:function(t,a,i,o){return G(function(t,a,i){r(2,arguments);var o=n(t),u=e(a),s=z(o,i)-u;return o.setUTCDate(o.getUTCDate()-7*s),o}(t,i,o),o)},incompatibleTokens:["y","R","u","q","Q","M","L","I","d","D","i","t","T"]},I:{priority:100,parse:function(t,e,r,n){switch(e){case"I":return Bt(Dt,t);case"Io":return r.ordinalNumber(t,{unit:"week"});default:return Zt(e.length,t)}},validate:function(t,e,r){return e>=1&&e<=53},set:function(t,a,i,o){return W(function(t,a){r(2,arguments);var i=n(t),o=e(a),u=I(i)-o;return i.setUTCDate(i.getUTCDate()-7*u),i}(t,i,o),o)},incompatibleTokens:["y","Y","u","q","Q","M","L","w","d","D","e","c","t","T"]},d:{priority:90,subPriority:1,parse:function(t,e,r,n){switch(e){case"d":return Bt(Ct,t);case"do":return r.ordinalNumber(t,{unit:"date"});default:return Zt(e.length,t)}},validate:function(t,e,r){var n=te(t.getUTCFullYear()),a=t.getUTCMonth();return n?e>=1&&e<=Vt[a]:e>=1&&e<=Jt[a]},set:function(t,e,r,n){return t.setUTCDate(r),t.setUTCHours(0,0,0,0),t},incompatibleTokens:["Y","R","q","Q","w","I","D","i","e","c","t","T"]},D:{priority:90,subPriority:1,parse:function(t,e,r,n){switch(e){case"D":case"DD":return Bt(Mt,t);case"Do":return r.ordinalNumber(t,{unit:"date"});default:return Zt(e.length,t)}},validate:function(t,e,r){return te(t.getUTCFullYear())?e>=1&&e<=366:e>=1&&e<=365},set:function(t,e,r,n){return t.setUTCMonth(0,r),t.setUTCHours(0,0,0,0),t},incompatibleTokens:["Y","R","q","Q","M","L","w","I","d","E","i","e","c","t","T"]},E:{priority:90,parse:function(t,e,r,n){switch(e){case"E":case"EE":case"EEE":return r.day(t,{width:"abbreviated",context:"formatting"})||r.day(t,{width:"short",context:"formatting"})||r.day(t,{width:"narrow",context:"formatting"});case"EEEEE":return r.day(t,{width:"narrow",context:"formatting"});case"EEEEEE":return r.day(t,{width:"short",context:"formatting"})||r.day(t,{width:"narrow",context:"formatting"});default:return r.day(t,{width:"wide",context:"formatting"})||r.day(t,{width:"abbreviated",context:"formatting"})||r.day(t,{width:"short",context:"formatting"})||r.day(t,{width:"narrow",context:"formatting"})}},validate:function(t,e,r){return e>=0&&e<=6},set:function(t,e,r,n){return(t=Tt(t,r,n)).setUTCHours(0,0,0,0),t},incompatibleTokens:["D","i","e","c","t","T"]},e:{priority:90,parse:function(t,e,r,n){var a=function(t){var e=7*Math.floor((t-1)/7);return(t+n.weekStartsOn+6)%7+e};switch(e){case"e":case"ee":return Zt(e.length,t,a);case"eo":return r.ordinalNumber(t,{unit:"day",valueCallback:a});case"eee":return r.day(t,{width:"abbreviated",context:"formatting"})||r.day(t,{width:"short",context:"formatting"})||r.day(t,{width:"narrow",context:"formatting"});case"eeeee":return r.day(t,{width:"narrow",context:"formatting"});case"eeeeee":return r.day(t,{width:"short",context:"formatting"})||r.day(t,{width:"narrow",context:"formatting"});default:return r.day(t,{width:"wide",context:"formatting"})||r.day(t,{width:"abbreviated",context:"formatting"})||r.day(t,{width:"short",context:"formatting"})||r.day(t,{width:"narrow",context:"formatting"})}},validate:function(t,e,r){return e>=0&&e<=6},set:function(t,e,r,n){return(t=Tt(t,r,n)).setUTCHours(0,0,0,0),t},incompatibleTokens:["y","R","u","q","Q","M","L","I","d","D","E","i","c","t","T"]},c:{priority:90,parse:function(t,e,r,n){var a=function(t){var e=7*Math.floor((t-1)/7);return(t+n.weekStartsOn+6)%7+e};switch(e){case"c":case"cc":return Zt(e.length,t,a);case"co":return r.ordinalNumber(t,{unit:"day",valueCallback:a});case"ccc":return r.day(t,{width:"abbreviated",context:"standalone"})||r.day(t,{width:"short",context:"standalone"})||r.day(t,{width:"narrow",context:"standalone"});case"ccccc":return r.day(t,{width:"narrow",context:"standalone"});case"cccccc":return r.day(t,{width:"short",context:"standalone"})||r.day(t,{width:"narrow",context:"standalone"});default:return r.day(t,{width:"wide",context:"standalone"})||r.day(t,{width:"abbreviated",context:"standalone"})||r.day(t,{width:"short",context:"standalone"})||r.day(t,{width:"narrow",context:"standalone"})}},validate:function(t,e,r){return e>=0&&e<=6},set:function(t,e,r,n){return(t=Tt(t,r,n)).setUTCHours(0,0,0,0),t},incompatibleTokens:["y","R","u","q","Q","M","L","I","d","D","E","i","e","t","T"]},i:{priority:90,parse:function(t,e,r,n){var a=function(t){return 0===t?7:t};switch(e){case"i":case"ii":return Zt(e.length,t);case"io":return r.ordinalNumber(t,{unit:"day"});case"iii":return r.day(t,{width:"abbreviated",context:"formatting",valueCallback:a})||r.day(t,{width:"short",context:"formatting",valueCallback:a})||r.day(t,{width:"narrow",context:"formatting",valueCallback:a});case"iiiii":return r.day(t,{width:"narrow",context:"formatting",valueCallback:a});case"iiiiii":return r.day(t,{width:"short",context:"formatting",valueCallback:a})||r.day(t,{width:"narrow",context:"formatting",valueCallback:a});default:return r.day(t,{width:"wide",context:"formatting",valueCallback:a})||r.day(t,{width:"abbreviated",context:"formatting",valueCallback:a})||r.day(t,{width:"short",context:"formatting",valueCallback:a})||r.day(t,{width:"narrow",context:"formatting",valueCallback:a})}},validate:function(t,e,r){return e>=1&&e<=7},set:function(t,a,i,o){return t=function(t,a){r(2,arguments);var i=e(a);i%7==0&&(i-=7);var o=1,u=n(t),s=u.getUTCDay(),c=((i%7+7)%7=1&&e<=12},set:function(t,e,r,n){var a=t.getUTCHours()>=12;return a&&r<12?t.setUTCHours(r+12,0,0,0):a||12!==r?t.setUTCHours(r,0,0,0):t.setUTCHours(0,0,0,0),t},incompatibleTokens:["H","K","k","t","T"]},H:{priority:70,parse:function(t,e,r,n){switch(e){case"H":return Bt(xt,t);case"Ho":return r.ordinalNumber(t,{unit:"hour"});default:return Zt(e.length,t)}},validate:function(t,e,r){return e>=0&&e<=23},set:function(t,e,r,n){return t.setUTCHours(r,0,0,0),t},incompatibleTokens:["a","b","h","K","k","t","T"]},K:{priority:70,parse:function(t,e,r,n){switch(e){case"K":return Bt(Ut,t);case"Ko":return r.ordinalNumber(t,{unit:"hour"});default:return Zt(e.length,t)}},validate:function(t,e,r){return e>=0&&e<=11},set:function(t,e,r,n){return t.getUTCHours()>=12&&r<12?t.setUTCHours(r+12,0,0,0):t.setUTCHours(r,0,0,0),t},incompatibleTokens:["a","b","h","H","k","t","T"]},k:{priority:70,parse:function(t,e,r,n){switch(e){case"k":return Bt(kt,t);case"ko":return r.ordinalNumber(t,{unit:"hour"});default:return Zt(e.length,t)}},validate:function(t,e,r){return e>=1&&e<=24},set:function(t,e,r,n){var a=r<=24?r%24:r;return t.setUTCHours(a,0,0,0),t},incompatibleTokens:["a","b","h","H","K","t","T"]},m:{priority:60,parse:function(t,e,r,n){switch(e){case"m":return Bt(Nt,t);case"mo":return r.ordinalNumber(t,{unit:"minute"});default:return Zt(e.length,t)}},validate:function(t,e,r){return e>=0&&e<=59},set:function(t,e,r,n){return t.setUTCMinutes(r,0,0),t},incompatibleTokens:["t","T"]},s:{priority:50,parse:function(t,e,r,n){switch(e){case"s":return Bt(St,t);case"so":return r.ordinalNumber(t,{unit:"second"});default:return Zt(e.length,t)}},validate:function(t,e,r){return e>=0&&e<=59},set:function(t,e,r,n){return t.setUTCSeconds(r,0),t},incompatibleTokens:["t","T"]},S:{priority:30,parse:function(t,e,r,n){return Zt(e.length,t,(function(t){return Math.floor(t*Math.pow(10,3-e.length))}))},set:function(t,e,r,n){return t.setUTCMilliseconds(r),t},incompatibleTokens:["t","T"]},X:{priority:10,parse:function(t,e,r,n){switch(e){case"X":return zt(Rt,t);case"XX":return zt(It,t);case"XXXX":return zt(Gt,t);case"XXXXX":return zt(jt,t);default:return zt(Xt,t)}},set:function(t,e,r,n){return e.timestampIsSet?t:new Date(t.getTime()-r)},incompatibleTokens:["t","T","x"]},x:{priority:10,parse:function(t,e,r,n){switch(e){case"x":return zt(Rt,t);case"xx":return zt(It,t);case"xxxx":return zt(Gt,t);case"xxxxx":return zt(jt,t);default:return zt(Xt,t)}},set:function(t,e,r,n){return e.timestampIsSet?t:new Date(t.getTime()-r)},incompatibleTokens:["t","T","X"]},t:{priority:40,parse:function(t,e,r,n){return At(t)},set:function(t,e,r,n){return[new Date(1e3*r),{timestampIsSet:!0}]},incompatibleTokens:"*"},T:{priority:20,parse:function(t,e,r,n){return At(t)},set:function(t,e,r,n){return[new Date(r),{timestampIsSet:!0}]},incompatibleTokens:"*"}},re=ee,ne=/[yYQqMLwIdDecihHKkms]o|(\w)\1*|''|'(''|[^'])+('|$)|./g,ae=/P+p+|P+|p+|''|'(''|[^'])+('|$)|./g,ie=/^'([^]*?)'?$/,oe=/''/g,ue=/\S/,se=/[a-zA-Z]/;function ce(t,e){if(e.timestampIsSet)return t;var r=new Date(0);return r.setFullYear(t.getUTCFullYear(),t.getUTCMonth(),t.getUTCDate()),r.setHours(t.getUTCHours(),t.getUTCMinutes(),t.getUTCSeconds(),t.getUTCMilliseconds()),r}function de(t){return t.match(ie)[1].replace(oe,"'")}var le=36e5,fe={dateTimeDelimiter:/[T ]/,timeZoneDelimiter:/[Z ]/i,timezone:/([Z+-].*)$/},he=/^-?(?:(\d{3})|(\d{2})(?:-?(\d{2}))?|W(\d{2})(?:-?(\d{1}))?|)$/,me=/^(\d{2}(?:[.,]\d*)?)(?::?(\d{2}(?:[.,]\d*)?))?(?::?(\d{2}(?:[.,]\d*)?))?$/,we=/^([+-])(\d{2})(?::?(\d{2}))?$/;function ge(t){var e,r={},n=t.split(fe.dateTimeDelimiter);if(n.length>2)return r;if(/:/.test(n[0])?(r.date=null,e=n[0]):(r.date=n[0],e=n[1],fe.timeZoneDelimiter.test(r.date)&&(r.date=t.split(fe.timeZoneDelimiter)[0],e=t.substr(r.date.length,t.length))),e){var a=fe.timezone.exec(e);a?(r.time=e.replace(a[1],""),r.timezone=a[1]):r.time=e}return r}function ve(t,e){var r=new RegExp("^(?:(\\d{4}|[+-]\\d{"+(4+e)+"})|(\\d{2}|[+-]\\d{"+(2+e)+"})$)"),n=t.match(r);if(!n)return{year:null};var a=n[1]&&parseInt(n[1]),i=n[2]&&parseInt(n[2]);return{year:null==i?a:100*i,restDateString:t.slice((n[1]||n[2]).length)}}function ye(t,e){if(null===e)return null;var r=t.match(he);if(!r)return null;var n=!!r[4],a=be(r[1]),i=be(r[2])-1,o=be(r[3]),u=be(r[4]),s=be(r[5])-1;if(n)return function(t,e,r){return e>=1&&e<=53&&r>=0&&r<=6}(0,u,s)?function(t,e,r){var n=new Date(0);n.setUTCFullYear(t,0,4);var a=n.getUTCDay()||7,i=7*(e-1)+r+1-a;return n.setUTCDate(n.getUTCDate()+i),n}(e,u,s):new Date(NaN);var c=new Date(0);return function(t,e,r){return e>=0&&e<=11&&r>=1&&r<=(Me[e]||(De(t)?29:28))}(e,i,o)&&function(t,e){return e>=1&&e<=(De(t)?366:365)}(e,a)?(c.setUTCFullYear(e,i,Math.max(a,o)),c):new Date(NaN)}function be(t){return t?parseInt(t):1}function Te(t){var e=t.match(me);if(!e)return null;var r=pe(e[1]),n=pe(e[2]),a=pe(e[3]);return function(t,e,r){if(24===t)return 0===e&&0===r;return r>=0&&r<60&&e>=0&&e<60&&t>=0&&t<25}(r,n,a)?r*le+6e4*n+1e3*a:NaN}function pe(t){return t&&parseFloat(t.replace(",","."))||0}function Ce(t){if("Z"===t)return 0;var e=t.match(we);if(!e)return 0;var r="+"===e[1]?-1:1,n=parseInt(e[2]),a=e[3]&&parseInt(e[3])||0;return function(t,e){return e>=0&&e<=59}(0,a)?r*(n*le+6e4*a):NaN}var Me=[31,null,31,30,31,30,31,31,30,31,30,31];function De(t){return t%400==0||t%4==0&&t%100}const xe={datetime:"MMM d, yyyy, h:mm:ss aaaa",millisecond:"h:mm:ss.SSS aaaa",second:"h:mm:ss aaaa",minute:"h:mm aaaa",hour:"ha",day:"MMM d",week:"PP",month:"MMM yyyy",quarter:"qqq - yyyy",year:"yyyy"};t._adapters._date.override({_id:"date-fns",formats:function(){return xe},parse:function(t,a){if(null==t)return null;const i=typeof t;return"number"===i||t instanceof Date?t=n(t):"string"===i&&(t="string"==typeof a?function(t,a,i,o){r(3,arguments);var u=String(t),s=String(a),d=o||{},l=d.locale||q;if(!l.match)throw new RangeError("locale must contain match property");var f=l.options&&l.options.firstWeekContainsDate,h=null==f?1:e(f),m=null==d.firstWeekContainsDate?h:e(d.firstWeekContainsDate);if(!(m>=1&&m<=7))throw new RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");var w=l.options&&l.options.weekStartsOn,g=null==w?0:e(w),v=null==d.weekStartsOn?g:e(d.weekStartsOn);if(!(v>=0&&v<=6))throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");if(""===s)return""===u?n(i):new Date(NaN);var y,b={firstWeekContainsDate:m,weekStartsOn:v,locale:l},T=[{priority:10,subPriority:-1,set:ce,index:0}],p=s.match(ae).map((function(t){var e=t[0];return"p"===e||"P"===e?(0,ut[e])(t,l.formatLong,b):t})).join("").match(ne),C=[];for(y=0;y0&&ue.test(u))return new Date(NaN);var P=T.map((function(t){return t.priority})).sort((function(t,e){return e-t})).filter((function(t,e,r){return r.indexOf(t)===e})).map((function(t){return T.filter((function(e){return e.priority===t})).sort((function(t,e){return e.subPriority-t.subPriority}))})).map((function(t){return t[0]})),E=n(i);if(isNaN(E))return new Date(NaN);var O=H(E,c(E)),F={};for(y=0;y=1&&f<=7))throw new RangeError("firstWeekContainsDate must be between 1 and 7 inclusively");var h=s.options&&s.options.weekStartsOn,w=null==h?0:e(h),g=null==u.weekStartsOn?w:e(u.weekStartsOn);if(!(g>=0&&g<=6))throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");if(!s.localize)throw new RangeError("locale must contain localize property");if(!s.formatLong)throw new RangeError("locale must contain formatLong property");var v=n(t);if(!m(v))throw new RangeError("Invalid time value");var y=c(v),b=H(v,y),T={firstWeekContainsDate:f,weekStartsOn:g,locale:s,_originalDate:v},p=o.match(mt).map((function(t){var e=t[0];return"p"===e||"P"===e?(0,ut[e])(t,s.formatLong,T):t})).join("").match(ht).map((function(e){if("''"===e)return"'";var r=e[0];if("'"===r)return yt(e);var n=nt[r];if(n)return!u.useAdditionalWeekYearTokens&<(e)&&ft(e,a,t),!u.useAdditionalDayOfYearTokens&&dt(e)&&ft(e,a,t),n(b,e,s.localize,T);if(r.match(vt))throw new RangeError("Format string contains an unescaped latin alphabet character `"+r+"`");return e})).join("");return p}(t,a,this.options)},add:function(t,n,s){switch(s){case"millisecond":return o(t,n);case"second":return function(t,n){r(2,arguments);var a=e(n);return o(t,1e3*a)}(t,n);case"minute":return function(t,n){r(2,arguments);var a=e(n);return o(t,6e4*a)}(t,n);case"hour":return function(t,n){r(2,arguments);var a=e(n);return o(t,a*u)}(t,n);case"day":return a(t,n);case"week":return function(t,n){r(2,arguments);var i=e(n),o=7*i;return a(t,o)}(t,n);case"month":return i(t,n);case"quarter":return function(t,n){r(2,arguments);var a=e(n),o=3*a;return i(t,o)}(t,n);case"year":return function(t,n){r(2,arguments);var a=e(n);return i(t,12*a)}(t,n);default:return t}},diff:function(t,e,a){switch(a){case"millisecond":return b(t,e);case"second":return function(t,e){r(2,arguments);var n=b(t,e)/1e3;return n>0?Math.floor(n):Math.ceil(n)}(t,e);case"minute":return function(t,e){r(2,arguments);var n=b(t,e)/6e4;return n>0?Math.floor(n):Math.ceil(n)}(t,e);case"hour":return function(t,e){r(2,arguments);var n=b(t,e)/T;return n>0?Math.floor(n):Math.ceil(n)}(t,e);case"day":return y(t,e);case"week":return function(t,e){r(2,arguments);var n=y(t,e)/7;return n>0?Math.floor(n):Math.ceil(n)}(t,e);case"month":return D(t,e);case"quarter":return function(t,e){r(2,arguments);var n=D(t,e)/3;return n>0?Math.floor(n):Math.ceil(n)}(t,e);case"year":return function(t,e){r(2,arguments);var a=n(t),i=n(e),o=h(a,i),u=Math.abs(g(a,i));a.setFullYear("1584"),i.setFullYear("1584");var s=h(a,i)===-o,c=o*(u-s);return 0===c?0:c}(t,e);default:return 0}},startOf:function(t,e,a){switch(e){case"second":return function(t){r(1,arguments);var e=n(t);return e.setMilliseconds(0),e}(t);case"minute":return function(t){r(1,arguments);var e=n(t);return e.setSeconds(0,0),e}(t);case"hour":return function(t){r(1,arguments);var e=n(t);return e.setMinutes(0,0,0),e}(t);case"day":return d(t);case"week":return s(t);case"isoWeek":return s(t,{weekStartsOn:+a});case"month":return function(t){r(1,arguments);var e=n(t);return e.setDate(1),e.setHours(0,0,0,0),e}(t);case"quarter":return function(t){r(1,arguments);var e=n(t),a=e.getMonth(),i=a-a%3;return e.setMonth(i,1),e.setHours(0,0,0,0),e}(t);case"year":return function(t){r(1,arguments);var e=n(t),a=new Date(0);return a.setFullYear(e.getFullYear(),0,1),a.setHours(0,0,0,0),a}(t);default:return t}},endOf:function(t,a){switch(a){case"second":return function(t){r(1,arguments);var e=n(t);return e.setMilliseconds(999),e}(t);case"minute":return function(t){r(1,arguments);var e=n(t);return e.setSeconds(59,999),e}(t);case"hour":return function(t){r(1,arguments);var e=n(t);return e.setMinutes(59,59,999),e}(t);case"day":return p(t);case"week":return function(t,a){r(1,arguments);var i=a||{},o=i.locale,u=o&&o.options&&o.options.weekStartsOn,s=null==u?0:e(u),c=null==i.weekStartsOn?s:e(i.weekStartsOn);if(!(c>=0&&c<=6))throw new RangeError("weekStartsOn must be between 0 and 6 inclusively");var d=n(t),l=d.getDay(),f=6+(lr.right&&(a|=2),er.bottom&&(a|=4),a}function u(t,e){var r,a,o=e.anchor,n=t;return e.clamp&&(n=function(t,e){for(var r,a,o,n=t.x0,i=t.y0,l=t.x1,u=t.y1,d=s(n,i,e),c=s(l,u,e);d|c&&!(d&c);)8&(r=d||c)?(a=n+(l-n)*(e.top-i)/(u-i),o=e.top):4&r?(a=n+(l-n)*(e.bottom-i)/(u-i),o=e.bottom):2&r?(o=i+(u-i)*(e.right-n)/(l-n),a=e.right):1&r&&(o=i+(u-i)*(e.left-n)/(l-n),a=e.left),r===d?d=s(n=a,i=o,e):c=s(l=a,u=o,e);return{x0:n,x1:l,y0:i,y1:u}}(n,e.area)),"start"===o?(r=n.x0,a=n.y0):"end"===o?(r=n.x1,a=n.y1):(r=(n.x0+n.x1)/2,a=(n.y0+n.y1)/2),function(t,e,r,a,o){switch(o){case"center":r=a=0;break;case"bottom":r=0,a=1;break;case"right":r=1,a=0;break;case"left":r=-1,a=0;break;case"top":r=0,a=-1;break;case"start":r=-r,a=-a;break;case"end":break;default:o*=Math.PI/180,r=Math.cos(o),a=Math.sin(o)}return{x:t,y:e,vx:r,vy:a}}(r,a,t.vx,t.vy,e.align)}var d=function(t,e){var r=(t.startAngle+t.endAngle)/2,a=Math.cos(r),o=Math.sin(r),n=t.innerRadius,i=t.outerRadius;return u({x0:t.x+a*n,y0:t.y+o*n,x1:t.x+a*i,y1:t.y+o*i,vx:a,vy:o},e)},c=function(t,e){var r=l(t,e.origin),a=r.x*t.options.radius,o=r.y*t.options.radius;return u({x0:t.x-a,y0:t.y-o,x1:t.x+a,y1:t.y+o,vx:r.x,vy:r.y},e)},h=function(t,e){var r=l(t,e.origin),a=t.x,o=t.y,n=0,i=0;return t.horizontal?(a=Math.min(t.x,t.base),n=Math.abs(t.base-t.x)):(o=Math.min(t.y,t.base),i=Math.abs(t.base-t.y)),u({x0:a,y0:o+i,x1:a+n,y1:o,vx:r.x,vy:r.y},e)},f=function(t,e){var r=l(t,e.origin);return u({x0:t.x,y0:t.y,x1:t.x,y1:t.y,vx:r.x,vy:r.y},e)},x=function(t){return Math.round(t*r)/r};function y(t,e){var r=e.chart.getDatasetMeta(e.datasetIndex).vScale;if(!r)return null;if(void 0!==r.xCenter&&void 0!==r.yCenter)return{x:r.xCenter,y:r.yCenter};var a=r.getBasePixel();return t.horizontal?{x:a,y:null}:{x:null,y:a}}function v(t,e,r){var a=r.backgroundColor,o=r.borderColor,n=r.borderWidth;(a||o&&n)&&(t.beginPath(),function(t,e,r,a,o,n){var i=Math.PI/2;if(n){var l=Math.min(n,o/2,a/2),s=e+l,u=r+l,d=e+a-l,c=r+o-l;t.moveTo(e,u),sr.x+r.w+2||t.y>r.y+r.h+2)},intersects:function(t){var e,r,a,o=this._points(),n=t._points(),i=[M(o[0],o[1]),M(o[0],o[3])];for(this._rotation!==t._rotation&&i.push(M(n[0],n[1]),M(n[0],n[3])),e=0;et.getProps([e],!0)[e]}),n=a.geometry(),i=$(l,a.model(),n),o._box.update(i,n,a.rotation()));(function(t,e){var r,a,o,n;for(r=t.length-1;r>=0;--r)for(o=t[r].$layout,a=r-1;a>=0&&o._visible;--a)(n=t[a].$layout)._visible&&o._box.intersects(n._box)&&e(o,n)})(t,(function(t,e){var r=t._hidable,a=e._hidable;r&&a||a?e._visible=!1:r&&(t._visible=!1)}))}(t)},lookup:function(t,e){var r,a;for(r=t.length-1;r>=0;--r)if((a=t[r].$layout)&&a._visible&&a._box.contains(e))return t[r];return null},draw:function(t,e){var r,a,o,n,i,l;for(r=0,a=e.length;r Date: Wed, 5 Apr 2023 13:00:19 +0300 Subject: [PATCH 03/11] feat(emacs): chart 1 done --- content/posts/2023-04-14-emacs.md | 2 +- static/js/2023-04-14-emacs.js | 216 ++++++++++++++++++++++++++++-- 2 files changed, 204 insertions(+), 14 deletions(-) diff --git a/content/posts/2023-04-14-emacs.md b/content/posts/2023-04-14-emacs.md index 64c7797..d62e74a 100644 --- a/content/posts/2023-04-14-emacs.md +++ b/content/posts/2023-04-14-emacs.md @@ -9,4 +9,4 @@ scripts = ["/js/chart.js", "/js/chartjs-adapter-date-fns.bundle.min.js", "/js/ch Hello world - \ No newline at end of file + diff --git a/static/js/2023-04-14-emacs.js b/static/js/2023-04-14-emacs.js index 3468942..d357071 100644 --- a/static/js/2023-04-14-emacs.js +++ b/static/js/2023-04-14-emacs.js @@ -1,8 +1,38 @@ const TODAY = new Date("2023-04-14"); const TODAY_LOCALE = TODAY.toLocaleDateString("en-GB"); +const EMACS_ITEM = { + backgroundColor: "#8261bb", + borderColor: "black", + borderWidth: 0, + borderSkipped: false, + borderRadius: 0, + datalabels: { + color: "white", + }, +}; + +const COLORS = [ + "#77bceb", + "#ff6384", + "#77c0c0", + "#ff9f40", + "#ffcd56", + "#c9cbcf", +]; + +let i = 0; + const EMACS_DATA = { - labels: ["Editor/IDE", "File manager"], + labels: [ + "Editor/IDE", + "File manager", + "Email", + "RSS", + "Passwords", + "Multimedia", + "WM", + ], datasets: [ { label: "Jupyter", @@ -43,6 +73,7 @@ const EMACS_DATA = { }, ], yAxisID: "yAxis1", + ...EMACS_ITEM, }, { label: "vifm", @@ -63,8 +94,160 @@ const EMACS_DATA = { }, ], yAxisID: "yAxis2", + ...EMACS_ITEM, }, - ], + { + label: "Mailspring", + data: [ + { + name: "Email", + span: [new Date("2019-01-28"), new Date("2021-01-29")], + }, + ], + yAxisID: "yAxis3", + }, + { + label: "notmuch", + data: [ + { + name: "Email", + span: [new Date("2021-01-29"), TODAY], + }, + ], + yAxisID: "yAxis3", + ...EMACS_ITEM, + }, + { + label: "newsboat", + data: [ + { + name: "RSS", + span: [new Date("2021-01-22"), new Date("2021-05-24")], + }, + ], + yAxisID: "yAxis4", + }, + { + label: "elfeed", + data: [ + { + name: "RSS", + span: [new Date("2021-05-24"), TODAY], + }, + ], + yAxisID: "yAxis4", + ...EMACS_ITEM, + }, + { + label: "Tiny Tiny RSS", + data: [ + { + name: "RSS", + span: [new Date("2022-05-28"), TODAY], + hint: "Sync with elfeed", + }, + ], + yAxisID: "yAxis4", + }, + { + label: "KeePassXC", + data: [ + { + name: "Passwords", + span: [new Date("2019-01-31"), new Date("2021-07-26")], + }, + ], + yAxisID: "yAxis5", + }, + { + label: "password-store & pass.el", + data: [ + { + name: "Passwords", + span: [new Date("2021-07-26"), TODAY], + }, + ], + yAxisID: "yAxis5", + }, + { + label: "MPD", + data: [ + { + name: "Multimedia", + span: [new Date("2020-07-26"), TODAY], + }, + ], + yAxisID: "yAxis6", + }, + { + label: "ncmpcpp", + data: [ + { + name: "Multimedia", + span: [new Date("2020-07-26"), new Date("2021-07-31")], + }, + ], + yAxisID: "yAxis6", + }, + { + label: "EMMS", + data: [ + { + name: "Multimedia", + span: [new Date("2021-07-31"), TODAY], + }, + ], + yAxisID: "yAxis6", + ...EMACS_ITEM, + }, + { + label: "MPV", + data: [ + { + name: "Multimedia", + span: [new Date("2021-09-07"), TODAY], + }, + ], + yAxisID: "yAxis6", + }, + { + label: "Cinnamon", + data: [ + { + name: "WM", + span: [new Date("2018-08-01"), new Date("2020-05-08")], + }, + ], + yAxisID: "yAxis7", + }, + { + label: "i3(-gaps)", + data: [ + { + name: "WM", + span: [new Date("2020-05-08"), new Date("2021-11-14")], + }, + ], + yAxisID: "yAxis7", + }, + { + label: "EXWM", + data: [ + { + name: "WM", + span: [new Date("2021-11-14"), TODAY], + }, + ], + yAxisID: "yAxis7", + ...EMACS_ITEM, + }, + ].map((d) => { + if (!d.backgroundColor) { + d.backgroundColor = COLORS[i]; + } + i = (i + 1) % COLORS.length; + return d; + }), }; function emacsChart() { @@ -76,6 +259,7 @@ function emacsChart() { options: { indexAxis: "y", grouped: true, + aspectRatio: 1.2, parsing: { yAxisKey: "name", xAxisKey: "span", @@ -86,23 +270,29 @@ function emacsChart() { scales: { x: { type: "time", - min: new Date("2018-06"), - }, - yAxis1: { - ticks: { - display: false, - }, - }, - yAxis2: { - ticks: { - // display: false - }, + min: new Date("2018-09"), }, + ...Object.fromEntries( + [1, 2, 3, 4, 5, 6].map((i) => [ + `yAxis${i}`, + { + display: false, + }, + ]) + ), }, plugins: { legend: { display: false, }, + title: { + display: true, + text: "Everything goes into Emacs", + color: "black", + font: { + size: 15 + } + }, datalabels: { formatter: function (value, context) { return context.dataset.label; From 6f5165555d3552cd5fa5e8e01b25b4d3d1e65433 Mon Sep 17 00:00:00 2001 From: SqrtMinusOne Date: Wed, 5 Apr 2023 16:24:51 +0300 Subject: [PATCH 04/11] feat(emacs): more charts --- content/posts/2023-04-14-emacs.md | 8 + org/2023-04-14-emacs.org | 16 + .../emacs-related-time-per-month.json | 33 + static/data/2023-03-14-emacs/lengths.csv | 577 ++++++++++++++++++ static/js/2023-04-14-emacs.js | 293 ++++++++- 5 files changed, 925 insertions(+), 2 deletions(-) create mode 100644 static/data/2023-03-14-emacs/emacs-related-time-per-month.json create mode 100644 static/data/2023-03-14-emacs/lengths.csv diff --git a/content/posts/2023-04-14-emacs.md b/content/posts/2023-04-14-emacs.md index d62e74a..870f8d2 100644 --- a/content/posts/2023-04-14-emacs.md +++ b/content/posts/2023-04-14-emacs.md @@ -10,3 +10,11 @@ scripts = ["/js/chart.js", "/js/chartjs-adapter-date-fns.bundle.min.js", "/js/ch Hello world + + + + + + + + \ No newline at end of file diff --git a/org/2023-04-14-emacs.org b/org/2023-04-14-emacs.org index cfc7d6d..8c0cd53 100644 --- a/org/2023-04-14-emacs.org +++ b/org/2023-04-14-emacs.org @@ -11,3 +11,19 @@ Hello world #+begin_export html #+end_export + +#+begin_export html + +#+end_export + +#+begin_export html + +#+end_export + +#+begin_export html + +#+end_export + +#+begin_export html + +#+end_export diff --git a/static/data/2023-03-14-emacs/emacs-related-time-per-month.json b/static/data/2023-03-14-emacs/emacs-related-time-per-month.json new file mode 100644 index 0000000..8394a19 --- /dev/null +++ b/static/data/2023-03-14-emacs/emacs-related-time-per-month.json @@ -0,0 +1,33 @@ +[ +{"period":"2020-10-01T00:00:00Z","misc_hours":21.499994166666667,"other_code_hours":45.492286944444444,"config_hours":16.605819444444446,"orgmode_hours":7.039610277777778,"package_hours":0.4319083333333334,"sqrt_hours":0.0}, +{"period":"2020-11-01T00:00:00Z","misc_hours":7.922545277777687,"other_code_hours":130.25115500000007,"config_hours":12.954636111111114,"orgmode_hours":8.673049444444446,"package_hours":0.6693083333333334,"sqrt_hours":0.0}, +{"period":"2020-12-01T00:00:00Z","misc_hours":44.62867111111112,"other_code_hours":172.2617105555556,"config_hours":7.404536111111111,"orgmode_hours":5.94598888888889,"package_hours":0.016411111111111112,"sqrt_hours":0.0}, +{"period":"2021-01-01T00:00:00Z","misc_hours":40.97078361111109,"other_code_hours":108.33508166666668,"config_hours":6.398185833333335,"orgmode_hours":1.7350899999999998,"package_hours":0.0,"sqrt_hours":0.0}, +{"period":"2021-02-01T00:00:00Z","misc_hours":23.105469444444452,"other_code_hours":103.90097305555558,"config_hours":9.639255277777778,"orgmode_hours":6.35959,"package_hours":0.1454027777777778,"sqrt_hours":9.579580555555557}, +{"period":"2021-03-01T00:00:00Z","misc_hours":85.43768361111111,"other_code_hours":70.83901499999999,"config_hours":5.351164444444444,"orgmode_hours":3.7601916666666666,"package_hours":0.050147222222222225,"sqrt_hours":0.0}, +{"period":"2021-04-01T00:00:00Z","misc_hours":39.610666111111044,"other_code_hours":125.15684861111119,"config_hours":17.82253972222222,"orgmode_hours":5.481723333333335,"package_hours":0.0683388888888889,"sqrt_hours":9.427069444444443}, +{"period":"2021-05-01T00:00:00Z","misc_hours":57.33526833333332,"other_code_hours":113.36815361111115,"config_hours":20.12919444444444,"orgmode_hours":9.530327777777776,"package_hours":3.1570388888888887,"sqrt_hours":0.85215}, +{"period":"2021-06-01T00:00:00Z","misc_hours":19.274042777777794,"other_code_hours":126.66362527777778,"config_hours":6.006847222222222,"orgmode_hours":1.051963888888889,"package_hours":0.0,"sqrt_hours":0.0}, +{"period":"2021-07-01T00:00:00Z","misc_hours":81.67501916666666,"other_code_hours":51.52624416666663,"config_hours":22.17445277777778,"orgmode_hours":12.676333333333334,"package_hours":0.6769444444444445,"sqrt_hours":0.0}, +{"period":"2021-08-01T00:00:00Z","misc_hours":61.93839333333341,"other_code_hours":130.07233138888884,"config_hours":11.854841666666667,"orgmode_hours":11.899877777777776,"package_hours":17.619797222222225,"sqrt_hours":2.2672416666666666}, +{"period":"2021-09-01T00:00:00Z","misc_hours":71.1573447222222,"other_code_hours":120.12417027777782,"config_hours":9.464760000000004,"orgmode_hours":12.50451666666667,"package_hours":0.01851111111111111,"sqrt_hours":6.370205555555555}, +{"period":"2021-10-01T00:00:00Z","misc_hours":81.92015388888885,"other_code_hours":116.64286166666663,"config_hours":11.370164166666664,"orgmode_hours":7.676310277777775,"package_hours":0.29834166666666667,"sqrt_hours":2.6114666666666664}, +{"period":"2021-11-01T00:00:00Z","misc_hours":54.09148222222214,"other_code_hours":83.06970250000002,"config_hours":26.667271388888892,"orgmode_hours":17.463530277777775,"package_hours":12.023868333333331,"sqrt_hours":2.957238888888889}, +{"period":"2021-12-01T00:00:00Z","misc_hours":73.14686083333333,"other_code_hours":98.72174722222223,"config_hours":18.940516666666674,"orgmode_hours":9.036408333333334,"package_hours":8.266713888888889,"sqrt_hours":2.5470305555555557}, +{"period":"2022-01-01T00:00:00Z","misc_hours":78.7037844444445,"other_code_hours":90.03770083333329,"config_hours":9.120791666666667,"orgmode_hours":12.36731388888889,"package_hours":20.481719166666664,"sqrt_hours":5.263049999999999}, +{"period":"2022-02-01T00:00:00Z","misc_hours":65.48075472222229,"other_code_hours":59.16844611111107,"config_hours":6.861180555555555,"orgmode_hours":11.32403333333334,"package_hours":22.03164722222222,"sqrt_hours":3.680427777777778}, +{"period":"2022-03-01T00:00:00Z","misc_hours":59.85770472222208,"other_code_hours":101.48262166666677,"config_hours":3.2610216666666663,"orgmode_hours":7.583500000000001,"package_hours":18.58566944444444,"sqrt_hours":0.11891944444444444}, +{"period":"2022-04-01T00:00:00Z","misc_hours":68.30733527777787,"other_code_hours":112.87104388888886,"config_hours":7.927665277777777,"orgmode_hours":7.156380555555556,"package_hours":6.058352777777777,"sqrt_hours":0.0}, +{"period":"2022-05-01T00:00:00Z","misc_hours":72.09807583333335,"other_code_hours":109.0747988888889,"config_hours":2.0066166666666665,"orgmode_hours":4.990799999999998,"package_hours":12.661681666666665,"sqrt_hours":5.370564722222222}, +{"period":"2022-06-01T00:00:00Z","misc_hours":79.17945000000002,"other_code_hours":99.92501694444441,"config_hours":2.295294722222222,"orgmode_hours":4.66531138888889,"package_hours":1.937625,"sqrt_hours":4.099763888888889}, +{"period":"2022-07-01T00:00:00Z","misc_hours":100.25373388888889,"other_code_hours":80.96754916666667,"config_hours":7.048831944444444,"orgmode_hours":6.63810111111111,"package_hours":8.259250000000002,"sqrt_hours":0.30644166666666667}, +{"period":"2022-08-01T00:00:00Z","misc_hours":51.45677333333333,"other_code_hours":42.76726638888889,"config_hours":5.659562777777778,"orgmode_hours":33.62366111111111,"package_hours":25.84174444444444,"sqrt_hours":0.007108333333333333}, +{"period":"2022-09-01T00:00:00Z","misc_hours":93.71000527777774,"other_code_hours":59.957424166666726,"config_hours":2.910955555555555,"orgmode_hours":20.163738888888883,"package_hours":0.0,"sqrt_hours":5.0835}, +{"period":"2022-10-01T00:00:00Z","misc_hours":100.06510222222227,"other_code_hours":75.89180972222216,"config_hours":1.3981391666666667,"orgmode_hours":16.778726111111112,"package_hours":0.03719166666666666,"sqrt_hours":0.31931388888888895}, +{"period":"2022-11-01T00:00:00Z","misc_hours":72.92531194444443,"other_code_hours":88.36294638888896,"config_hours":0.3248416666666667,"orgmode_hours":19.864126388888884,"package_hours":0.71435,"sqrt_hours":0.16440277777777776}, +{"period":"2022-12-01T00:00:00Z","misc_hours":90.02505416666664,"other_code_hours":70.48672027777783,"config_hours":3.6556722222222215,"orgmode_hours":24.646485833333337,"package_hours":6.301308333333334,"sqrt_hours":0.0}, +{"period":"2023-01-01T00:00:00Z","misc_hours":81.74121027777785,"other_code_hours":74.15600861111108,"config_hours":8.502313888888889,"orgmode_hours":23.546456388888878,"package_hours":1.2940805555555555,"sqrt_hours":3.091511111111111}, +{"period":"2023-02-01T00:00:00Z","misc_hours":59.22556611111115,"other_code_hours":71.66723777777779,"config_hours":6.266827777777776,"orgmode_hours":21.286059722222213,"package_hours":1.6511055555555558,"sqrt_hours":0.0}, +{"period":"2023-03-01T00:00:00Z","misc_hours":147.64586833333337,"other_code_hours":30.75426944444444,"config_hours":1.4991055555555552,"orgmode_hours":23.200755555555553,"package_hours":0.737786111111111,"sqrt_hours":0.027744444444444447}, +{"period":"2023-04-01T00:00:00Z","misc_hours":11.66882777777778,"other_code_hours":0.0,"config_hours":0.0,"orgmode_hours":0.0,"package_hours":0.0,"sqrt_hours":0.0} +] \ No newline at end of file diff --git a/static/data/2023-03-14-emacs/lengths.csv b/static/data/2023-03-14-emacs/lengths.csv new file mode 100644 index 0000000..b6dea44 --- /dev/null +++ b/static/data/2023-03-14-emacs/lengths.csv @@ -0,0 +1,577 @@ +commit,date,Emacs.org,init.el,init.vim,Desktop.org,Console.org,Mail.org,Guix.org +17d6192394e6321e80fde5417954f84256fb6f57,2022-06-17T23:36:47+03:00,7396,5092,1053,3756,1062,572,755 +0b1d5457a6a942d8b2f1c20400d09d4ffd0cfb81,2022-06-17T23:36:29+03:00,7396,5092,1053,3756,1062,572,755 +ca3ee40b6eb65e49f140c890853ef6e885aa210b,2022-06-09T22:26:56+03:00,7401,5097,1053,3756,1062,572,755 +a2c6f501ea650454dd1eebce9beec9dd67c1afd6,2022-06-06T22:31:53+03:00,7393,5089,1053,3756,1062,572,755 +95ac6c9e27eacf96208fac83763be6211f5ddf47,2022-06-06T22:29:27+03:00,7393,5089,1053,3756,1062,572,755 +8e591e0d2afd909ae5be00caf17f9b17c6cd8b61,2022-05-29T23:01:58+03:00,7408,5114,1053,3756,1062,572,755 +062233413d50c91bc4665ce3f6470e5bc7a425c6,2022-05-29T23:01:38+03:00,7408,5114,1053,3756,1062,572,755 +4b176a5bb1a5e20a7fdd7398b74df79701267a7e,2022-05-14T21:53:15+03:00,7322,5045,1053,3756,1062,572,755 +c838c4ca10392e6786d9f22d31bbd41196e4b1d9,2022-05-14T20:32:31+03:00,7153,4949,1053,3756,1062,572,755 +bf3a0c19d7aedb6cf35d1421113cfb1170fad053,2022-05-14T20:31:16+03:00,7153,4949,1053,3756,1062,572,755 +cbf772803b505ef7ca72b01c7e78aff91fee8605,2022-05-14T20:31:01+03:00,7153,4949,1053,3754,1062,572,755 +c6e3c19c31cd0e2ccfd42903bb21788276444798,2022-05-03T23:16:37+03:00,7145,4939,1053,3754,1062,572,755 +9010944b8b42c6d193896a29b2867126f2cf4c00,2022-05-03T23:15:53+03:00,7145,4939,1053,3753,1062,572,755 +586d0c9cd51e248b2e8cb4b4656d20c1182f8b42,2022-05-03T23:15:31+03:00,7103,4900,1053,3753,1062,572,755 +c42b693c51dcf11179573439ebfc9fe40adb1a59,2022-04-30T20:21:07+03:00,7103,4900,1053,3753,1062,572,755 +a33abd485d58bf20be4c3667feaa6897c7f401a4,2022-04-30T20:20:16+03:00,7103,4900,1053,3753,1062,572,755 +86bb113b322dcd94bc865c89b5a18836f5dd0fa0,2022-04-19T20:36:47+03:00,6825,4663,1053,3753,1062,572,755 +4d10d68737842c9629b678bb58b4d1878f9f6c10,2022-04-19T20:32:42+03:00,6825,4663,1053,3751,1062,572,755 +e6ce327e69cb1a7609a71a58bac62859e5efff8d,2022-04-16T12:47:29+03:00,6779,4629,1053,3751,1062,572,755 +cded48d484676b2a85a71a305a0a43c7a44ba3d9,2022-04-14T22:59:58+03:00,6831,4676,1053,3751,1062,572,755 +9b1a3b4b43986d5b0c9c2b96ac1f55fb1c3deb3e,2022-04-14T12:34:51+03:00,6831,4676,1053,3751,1062,572,755 +53eb9132dc38e042badd77fe63cf619141d4a895,2022-04-14T12:33:33+03:00,6714,4570,1053,3751,1062,572,755 +efe1aadaa1bb5b77607840c82405d3fab1abd2fd,2022-04-14T12:33:24+03:00,6714,4570,1053,3751,1062,551,755 +a1eef2a025e25fa1d58da52475e2fefe57c27943,2022-04-09T12:53:58+03:00,6714,4570,1053,3747,1062,551,755 +33a8a2b3382b0cd866b07d2c347b56036080a571,2022-04-09T12:51:02+03:00,6714,4570,1053,3747,1062,551,755 +9028fc32356e6874709bbff1883176fa9f2ae682,2022-04-09T12:20:05+03:00,6714,4570,1053,3747,1062,551,755 +24665dea142b613a6317c89bf215fef8823cac6b,2022-04-09T12:18:36+03:00,6714,4570,1053,3747,1062,551,755 +7190f2c42bdbd8233e734221f9676dfdcbd03fa8,2022-04-08T23:17:37+03:00,6714,4570,1053,3765,1062,551,755 +8145157f01ca6579e5909725ac78b774e89f3f7e,2022-04-08T23:17:01+03:00,6714,4570,1053,3765,1062,551,731 +ac1b6a54341bacce0c52a1674e56f695ae7c85dd,2022-04-01T00:11:48+03:00,6640,4449,1053,3765,1062,551,731 +93ef763b716832b852b35613543e474d8785af4d,2022-03-31T23:40:56+03:00,6588,4449,1053,3765,1062,551,731 +fb88d105ea4cbc0943d2164fae6d9776e01de32e,2022-03-30T14:48:38+03:00,6573,4449,1053,3765,1062,551,731 +64020613192947d106659c30e655619b5f67bf88,2022-03-30T14:48:22+03:00,6573,4449,1053,3765,1058,551,731 +f22856746acf6313ae0e48116c78e035ca9b41aa,2022-03-28T12:17:32+03:00,6573,4449,1053,3762,1058,551,731 +7380dfeb2b9ba65079bc02321de9a82358aa9ade,2022-03-28T12:14:04+03:00,6573,4449,1053,3762,1058,551,731 +025278a1e180e86f3aade20242e4ac1cdc1a2f13,2022-03-22T11:14:12+03:00,6682,4541,1053,3762,1058,551,731 +fc758b407365f7a582ab6c08c3c24a82afcada78,2022-03-22T11:11:08+03:00,6667,4533,1053,3762,1058,551,731 +5aba1733029458ddd880575e89cf5826ef167b70,2022-03-21T22:56:53+03:00,6667,4533,1053,3761,1058,551,731 +97f41fdca43b844b29f92bb767f6f8f24390305a,2022-03-19T23:05:35+03:00,6667,4533,1053,3761,1058,551,731 +c0957bacc87f56ed517d55904e0b46dfc2c34e96,2022-03-17T16:43:50+03:00,6667,4533,1053,3761,1058,551,731 +026f211498252ba4756170f7f243d18c928443af,2022-03-17T16:43:26+03:00,6667,4533,1053,3741,1058,551,731 +1a6c6cf01edcb351c41791e0e27ecce3564175bd,2022-02-25T10:10:00+03:00,6638,4514,1053,3741,1058,551,731 +68d2b3317dc38231d6ee441eaa189d3c798fda98,2022-02-17T23:01:26+03:00,6608,4496,1053,3741,1058,551,731 +4d922dad493f73994b6d7625e19f9456dbbcfa4f,2022-02-17T22:58:22+03:00,6608,4496,1053,3741,1058,551,731 +00ca2648ed3c3c7f926646f319a2064f80bfa691,2022-02-17T22:57:31+03:00,6608,4496,1053,3741,1058,548,731 +78447d47496920c06a47dac0249bc3da26474966,2022-02-15T21:56:26+03:00,6608,4496,1053,3728,1058,548,731 +a02a8c1466fb8362601b352a5f79361f64bd22b8,2022-02-13T18:36:34+03:00,6600,4489,1053,3728,1058,548,731 +33e22565a0c33d37f7547f1863cd4d4dc95f5106,2022-02-13T14:30:27+03:00,6588,4478,1053,3728,1058,548,731 +bb976c89dfb954ff178b8a202423b6f686007de2,2022-02-12T23:11:17+03:00,6588,4478,1053,3705,1058,548,731 +53e45a5e38f0fa2c8ec5372358e95955c5cbccf0,2022-02-12T23:10:16+03:00,6523,4475,1053,3705,1058,548,731 +fa4856faef8f8b2f0d7111c079132a1fd6068410,2022-02-12T23:09:39+03:00,6523,4475,1053,3589,1058,548,731 +f2ab0a59cf1ce70554c42952a9bf3c23d4db87f5,2022-02-10T11:09:40+03:00,6523,4475,1053,3589,1058,548,731 +51ba1ce4d91f46d00eb7445eb94a183a9445f606,2022-02-09T22:31:04+03:00,6523,4475,1053,3570,1058,548,731 +906f66c9e50b7074776568c466a985606414dfe3,2022-02-07T23:00:19+03:00,6523,4475,1053,3570,1058,548,731 +840c3607d1b070d2b296d19a826afc5cab547543,2022-02-02T23:35:19+03:00,6501,4459,1053,3570,1058,548,731 +a3690db9567574bbea77a85fecce20bb4c5cf349,2022-01-31T10:54:36+03:00,6501,4459,1053,3570,1058,548,731 +d2648918fcc338bd5c1cd6d5c0aa60a65077ccf7,2022-01-24T12:40:41+03:00,6802,4677,1053,3570,1058,548,731 +8c32db93f31b72454ecf7002e083e044dec3cfd3,2022-01-24T12:40:00+03:00,6796,4665,1053,3570,1058,545,731 +f3c770650359ba851c2a4f562ae60ee7de59c881,2022-01-22T22:28:23+03:00,6796,4665,1053,3570,1058,543,731 +c83041584d44537c35d2d8beb7b19911db258991,2022-01-22T22:27:27+03:00,6796,4665,1053,3570,1058,542,731 +cea6bbf45c11f675f6be66bdb7de9460ff8dd651,2022-01-20T00:00:25+03:00,6772,4624,1053,3570,1058,542,731 +9612c69ffc2dba30bfa8a697e032e7a04913b2be,2022-01-19T22:34:11+03:00,6772,4624,1053,3570,1042,542,731 +7971eb63e5c684757215a852dba8b53e1297f86e,2022-01-18T18:31:26+03:00,6739,4612,1053,3570,1042,540,731 +90d7c91f0c319554edbfc434419960a175ba21cf,2022-01-17T14:41:31+03:00,6739,4612,1053,3570,1042,540,731 +5b9d5db173b0d16e2485c8a18bb900e37dafe464,2022-01-17T14:41:18+03:00,6739,4612,1053,3569,1042,540,731 +2733147293b7f5b39f0b1a8c814414ebf48b4408,2022-01-17T11:00:52+03:00,6739,4612,1053,3569,1037,540,731 +2210e8f81b0ba08f69af3ee0cdbccf520fbcc69b,2022-01-15T18:34:06+03:00,6725,4605,1053,3569,1037,540,731 +3d87852745caacc0863c747f1fa9871d367240d2,2022-01-15T13:26:12+03:00,6725,4629,1053,3569,1037,540,731 +0f0b664922416ec4a409df3abecdb1d8c1161aff,2022-01-13T11:24:11+03:00,6718,4622,1053,3569,1037,540,731 +e606c96d2b3c35b3d107a25a889c68bd04e1deb7,2022-01-13T11:23:50+03:00,6718,4622,1053,3546,1037,540,731 +269a416e5b1c595927ed9da9f351521dc0792bd1,2022-01-13T11:23:19+03:00,6717,4621,1053,3546,1037,540,731 +e68db3ed0da46f27ea2e84ca3da9cd8230ef2de5,2022-01-12T12:01:05+03:00,6717,4621,1053,3546,1037,540,716 +d697aab011bb08f4b58b2833823ebdcdc431117d,2022-01-11T10:19:16+03:00,6717,4621,1053,3546,1037,540,716 +7d1d5b5b725dee8fcb83fa987abd6ac350643353,2022-01-11T08:56:47+03:00,6717,4621,1053,3546,1037,540,716 +aff8463412f03195747071c7d19e610487d5adee,2022-01-11T08:55:30+03:00,6717,4621,1053,3546,1037,540,716 +fcca97d5547876ec6dfa3347ef57bd890d26db00,2022-01-11T08:54:57+03:00,6717,4621,1053,3535,1037,540,716 +d5409891f023ea22d7f7384e0497ef79205fe3f5,2022-01-11T08:54:25+03:00,6696,4604,1053,3535,1037,540,716 +a4d42098976e591bd95096c713e956118f49a199,2022-01-09T21:52:55+03:00,6696,4604,1053,3535,1037,540,706 +b02ccf4aa79ee83eb8c79629c299462e4fe34755,2022-01-09T21:51:44+03:00,6696,4604,1053,3518,1037,540,706 +aaf9b8725f6fa8ff7c9f4da8edfec756dd5ad4a8,2022-01-09T21:19:39+03:00,6696,4604,1053,3518,1037,540,706 +b7896679f5d11e2371648e55bd20c09778b95f35,2022-01-09T21:19:01+03:00,6690,4596,1053,3518,1037,540,706 +49add5c0fbb0105f139e458131886145fcb41fe4,2022-01-07T00:27:09+03:00,6685,4593,1053,3518,1037,536,706 +803ab24b1e16760e1ac8dd0c3bc83e3176359ef6,2022-01-05T10:44:17+03:00,6679,4585,1053,3518,1037,540,706 +d8d1bb83edd3f44fb4d2c473f474547a5867c186,2022-01-05T10:15:34+03:00,6679,4585,1053,3518,1037,536,706 +4b1e141a6ee2a3039382619b39877cda36926318,2022-01-04T22:09:43+03:00,6679,4585,1053,3518,1031,536,706 +35ea3ab7964ea1c58411bd8167082814d5ed6798,2022-01-04T15:44:48+03:00,6679,4585,1053,3518,1031,535,706 +554c8b85ebff5952a6442b3653e660eefe2f5e98,2022-01-04T12:05:35+03:00,6679,4585,1053,3518,1031,535,706 +82aca7bad4a42334c885405de6710de586dd67af,2022-01-04T12:05:13+03:00,6679,4585,1053,3518,1024,535,706 +941c1d44ee5527bd5a037993c6f7c0ee939d53ad,2022-01-04T12:03:45+03:00,6679,4585,1053,3448,1024,535,706 +4617e07cfdce1cbcaf4da2abc7ca01681cf65891,2022-01-02T13:33:01+03:00,6634,4552,1053,3448,1024,535,706 +03c986cfb8246c3509a9010508ce953a7760de1a,2022-01-01T17:59:04+03:00,6634,4553,1053,3448,1024,535,706 +135b3419e4174754e9fcb173a36d29d42a9c0bd0,2022-01-01T17:58:21+03:00,6632,4551,1053,3448,1024,535,706 +ba38d54cf6366c742eb1f68fd2861911a292173a,2022-01-01T17:53:01+03:00,6633,4551,1053,3448,1024,535,706 +1121bd865cb9ed019e9e4c257155e2fb483d98c5,2021-12-29T13:22:38+03:00,6635,4553,1053,3379,1024,535,706 +623df333e4e115ddd540478b46b603ddbfb85f2f,2021-12-28T23:10:44+03:00,6633,4551,1053,3379,1024,535,706 +79bb3e8a687d4281f84f6e2497b2cc678b7ccf18,2021-12-28T23:10:27+03:00,6633,4551,1053,3384,1024,535,706 +5a3ff8d2554b4c9a18a8b088d4717010e73fa79d,2021-12-22T22:10:24+03:00,6625,4541,1053,3384,1024,535,706 +62eba36159f8cd6eb15faece59cb4904ead2105b,2021-12-20T17:12:33+03:00,6625,4541,1053,3383,1024,535,706 +a3ac781355ec59c44e7cbdad8f7d92bb36433bbc,2021-12-19T22:10:27+03:00,6562,4488,1053,3383,1024,535,706 +40c5ef92a017856f89a00862ded93382894d5fc6,2021-12-18T15:45:28+03:00,6554,4482,1053,3383,1024,535,706 +b0e93e10eecc2e7cbb703dca423dddc4ed130d48,2021-12-14T23:01:28+03:00,6091,4168,1053,3383,1024,535,706 +f4476648fad0b6be8675d74fb06efe23a372ad86,2021-12-12T22:28:56+03:00,6054,4146,1053,3383,1024,535,706 +f8eb4f63ceb9485e4c31dc91981ccd34e7ece12a,2021-12-08T21:56:14+03:00,6053,4145,1053,3356,1024,535,706 +5ae655b39c6f33eed21567023841047f77a919b8,2021-12-08T21:55:55+03:00,6043,4138,1053,3356,1024,535,706 +dcdb7d0109fb27b0610888320eecc1d46bf73982,2021-12-07T22:14:37+03:00,6043,4138,1053,3328,1024,535,706 +3c02a9ee3da300d58fece97f39e5773f94677981,2021-12-07T22:13:57+03:00,6032,4134,1053,3328,1024,535,706 +2cf8314c1f222f3f18a0ab16b3d6e8cfef7d9371,2021-12-06T23:38:47+03:00,6043,4138,1053,3328,1024,535,706 +5be9577a2eade9ee13f2f4c0cc641a9572a51467,2021-12-06T14:56:49+03:00,6032,4134,1053,3328,1024,535,706 +bcbea86087c7103de1780ba081aa251313abb327,2021-12-04T00:08:06+03:00,6035,4134,1053,3328,1024,535,706 +c6987720e980de48461f1682e5d6323a66950bca,2021-12-04T00:07:43+03:00,6035,4134,1053,3322,1024,535,706 +df2f07f949e9ec3efccc9af3f4ba082362e6520f,2021-12-03T17:57:42+03:00,6037,4120,1053,3322,1024,535,706 +9b0bee3ddd4a285b468e2279388dc8b599e1c985,2021-12-03T17:55:00+03:00,6037,4120,1053,3322,1024,535,706 +ff990dc88990a6b1079f5e73e25ad31c2a9408a7,2021-12-02T22:31:31+03:00,6033,4120,1053,3322,1024,535,706 +3c22b441befa8d4ed552f0d8432895ef967a92cf,2021-12-02T22:29:39+03:00,6033,4120,1053,3311,1024,535,706 +a17dee9be51d7f9e62f50ccd414ae0a3bdd8d0eb,2021-12-01T12:59:19+03:00,5959,4070,1053,3311,1024,535,706 +267fb8a98ed4bd60a46b627fb8d7befe5a27f785,2021-12-01T12:24:09+03:00,5959,4070,1053,3311,1024,535,706 +1bd1d0fe95f81bd860e7065c5697ca222f7a3c33,2021-12-01T12:23:02+03:00,5959,4070,1053,3328,1024,535,706 +8594d6f53e42c70bbf903e168607841854818a38,2021-11-27T14:44:54+03:00,6162,4213,1053,3328,1024,535,706 +19ff54db9fe21fd5bdf404a8d2612176baa8a6f5,2021-11-26T22:49:34+03:00,6312,4332,1053,3328,1024,535,706 +78ecd7e1bba152ac73ea6206906384aea384c58a,2021-11-26T21:01:20+03:00,6311,4330,1053,3327,1024,535,706 +ba92551ade9d231b2c13663f815b82804bcc60d3,2021-11-26T17:46:40+03:00,6311,4330,1053,3327,1024,535,706 +c30062c70f8a0b7ef2454996a670ab9eb6193c86,2021-11-25T09:37:31+03:00,6311,4330,1053,3327,1024,535,706 +739e0f69d928eccdcd7e7eec3d039d8b7d1e0d7d,2021-11-25T09:36:56+03:00,6184,4227,1053,3327,1024,535,706 +f31ada645dfd9f90fb09447e6b527af201e3a475,2021-11-23T18:24:51+03:00,6184,4227,1053,3326,1024,535,706 +b85731122cb10b324db0f511218ad87d0fa62360,2021-11-23T15:12:49+03:00,6184,4227,1053,3325,1024,535,706 +96175214c64351daf54edac73c4e8f9edc8e85d6,2021-11-21T10:24:19+03:00,6184,4227,1053,3086,1024,535,706 +45a5439661f26889a2ca5133672079679d7edaa9,2021-11-20T17:55:20+03:00,6184,4227,1053,3082,1024,535,706 +867644c28e482adf2440716e44a0bbd779c311d6,2021-11-20T17:47:25+03:00,6184,4227,1053,3081,1024,535,706 +aa530b1c732ebc391619efa052b179f987deea1e,2021-11-18T07:05:50+03:00,6180,4223,1053,3081,1024,535,706 +d3f9973d63d64a20fa05021357e61730b3e63b1a,2021-11-18T07:05:30+03:00,6176,4219,1053,3081,1024,535,706 +a8a2ea0b00339577023419fe0864fb128d5a0c65,2021-11-15T14:13:09+03:00,6176,4219,1053,3034,1024,535,706 +92f88b798f050b98d69df224aca73f887b2438b7,2021-11-15T14:07:34+03:00,6177,4219,1053,3016,1024,535,706 +851bb9bc974c18e9c906a0ba4e50a6821d8ca1cf,2021-11-09T22:03:45+03:00,6171,4207,1053,2533,1024,535,706 +54e1ee0ea70f38dd6b9f07323b8c91bc8e42e974,2021-11-05T22:17:26+03:00,6017,3999,1053,2533,1024,535,706 +67dabb3f4bc5cca24d5bb75f5bab42b5ee68a9a0,2021-11-05T22:17:11+03:00,6017,3999,1053,2518,1024,535,706 +785a6609f31f4573bf6cdf34599d9a566278995c,2021-11-01T19:15:36+03:00,6001,3989,1053,2518,1024,535,706 +90f60f3cc303f1543c41deeb3e625386bcc9ca1a,2021-11-01T19:15:08+03:00,6001,3989,1053,2513,1024,535,706 +e7aeb61ba2a9ee3a121a64f9def1410a7679d56d,2021-10-29T18:07:41+03:00,5973,3963,1053,2513,1024,535,706 +9df931b94c291851b6e9afc22e640cd20def6f4a,2021-10-28T15:49:32+03:00,5944,3948,1053,2513,1024,535,706 +0dc4420eccf84062659cf819b087215901d8d7da,2021-10-28T15:48:50+03:00,5923,3931,1053,2513,1024,535,706 +770a2421a6e0c719662d1fac29abddf5145bb9f2,2021-10-25T10:41:43+03:00,5923,3931,1053,2509,1024,535,706 +515101ffcde32dc4ac5889e92e841d6f069fc43d,2021-10-24T21:37:29+03:00,5918,3927,1053,2509,1024,535,706 +182125df06fab50aacb51b462f7f299300552d06,2021-10-24T21:35:14+03:00,5918,3927,1053,2509,1024,535,706 +710e838db4074fd51d945f668082e9db207aa8c9,2021-10-24T21:34:49+03:00,5918,3927,1053,2507,1023,535,706 +c87c2029c0f6196528f9c8fdbbc2ff36af335f4d,2021-10-21T20:56:29+03:00,5841,3874,1053,2507,1023,535,706 +1ed3800f8d3d9c4085e411222b821b832c7ac252,2021-10-21T20:55:12+03:00,5841,3874,1053,2507,1023,535,706 +7ac1215aded90d5c50f80d9df2b81f99948a3481,2021-10-21T20:54:42+03:00,5841,3874,1053,2507,1022,535,706 +b781888b847636e9fc33899ab08d0287b1e1fd53,2021-10-13T10:50:00+03:00,5778,3817,1053,2507,1022,535,706 +f8f21351a19dcbc8f3b6c29c23494fe6ea3804b0,2021-10-13T10:49:39+03:00,5750,3817,1053,2507,1022,535,706 +53692feda00bf0ccf246222dc7d0a06e86f97a6e,2021-10-13T10:49:03+03:00,5750,3817,1053,2506,1022,535,706 +a19a36e2d388570fc9610f9e87656fa19e6dfe68,2021-10-06T16:30:53+03:00,5750,3817,1053,2506,1008,535,706 +3331e30435c2eefb0587839d0aa417558f3a8a26,2021-10-04T11:21:26+03:00,5685,3779,1053,2506,1008,535,706 +20af706fa28d1c33e594b99e531aa385bb9ce26d,2021-10-03T20:46:40+03:00,5685,3779,1053,2495,1008,535,706 +a0f25dd23f9ca2e592676fc6a72d7e446c3a1edb,2021-10-01T18:55:52+03:00,5573,3705,1053,2480,1008,535,706 +c14a738f2abfa813b56e90745e99f5e13a770459,2021-10-01T18:49:37+03:00,5573,3705,1053,2480,1008,535,706 +44ce42a6f035235535e033242bf8ca5a97de5604,2021-09-30T19:15:18+03:00,5573,3705,1053,2480,1008,535,704 +138d5522f9e7fa0faf7b8e2a0bc40c73c21a8206,2021-09-30T19:14:03+03:00,5573,3705,1053,2480,1008,533,704 +f1e4731ca5cae8f383f48254d94eae954bc48561,2021-09-30T19:13:31+03:00,5573,3705,1053,2480,1000,533,704 +3d56b8db18ea22388751e9e3cf5b6297e583d097,2021-09-22T11:55:05+03:00,5549,3697,1053,2480,1000,533,704 +9f226b54be2e926c8957937259c1ae292d0199aa,2021-09-22T11:53:46+03:00,5489,3666,1053,2480,1000,533,704 +2dfa789d641564cea5e7bf1160c29936d20f7cd2,2021-09-18T23:08:20+03:00,5489,3666,1053,2465,1000,533,704 +0fb670bf083539ce5920eb0fc4cdcde1dc9cdaf9,2021-09-18T11:45:13+03:00,5489,3666,1053,2465,1000,533,704 +4f0dbc0529179b7d1fd49ba0292e844e1a7729c8,2021-09-18T10:04:12+03:00,5455,3645,1053,2465,1000,533,704 +15295971dbad55d7964de9e40dbea3bbc9898480,2021-09-18T10:03:46+03:00,5452,3635,1053,2465,1000,533,704 +9d89de7053f0be08e16a6fca550db4608928e514,2021-09-17T21:17:00+03:00,5452,3635,1053,2463,1000,533,703 +cbed53fc072960a10865371b2dc37f5a4c87753a,2021-09-11T10:35:17+03:00,5452,3635,1053,2462,1000,533,701 +456b4a24a0ad8d3213b0606f248627c63cfe6bd5,2021-09-11T10:35:07+03:00,5440,3636,1053,2462,1000,533,701 +1b9a46394b4bf9add804d4842ed4835d37bf79a6,2021-09-11T10:34:49+03:00,5440,3636,1053,2462,1000,533,701 +ba29177f960f2cd1d12c7eba4320dc9121fa7d55,2021-09-08T15:02:34+05:00,5440,3636,1053,2459,1000,533,701 +f9cecf57bb21e89b7d74d3079a1dd556762b667e,2021-09-03T13:43:07+05:00,5440,3636,1053,2459,1000,533,701 +50979e53c722d90eefb3a7272e1d6743c07bf0b0,2021-09-03T13:42:42+05:00,5440,3636,1053,2459,1000,533,701 +d6d6f40f2c756db7b8c7bbdf4e4ed3f805c00dfd,2021-08-31T16:40:49+05:00,5209,3454,1053,2459,1000,533,701 +3576f37d27585fda81e52f65c4015a278adbb95f,2021-08-31T16:39:15+05:00,5209,3454,1053,2458,1000,533,701 +4d759a129ccb08dc4ac4f604557e34775e3159f3,2021-08-25T19:32:09+03:00,5249,3487,1053,2458,1000,533,701 +08801fc5ecc77de57738797cb1b490a0630f737e,2021-08-25T19:25:57+03:00,5249,3487,1053,2458,1000,533,701 +c5294aea224ff136f5441094b9dde2424cf41659,2021-08-22T21:50:41+03:00,5242,3482,1053,2458,1000,533,701 +9148fea7cfec4dd19e3e023685820156568adee7,2021-08-22T12:50:42+03:00,5242,3482,1053,2458,1000,533,701 +bf5ad786470627382da83fde64c034a683b9c8eb,2021-08-19T14:29:56+03:00,5226,3475,1053,2453,997,529,698 +d22dc6c645b22ea6c7c0d5d53e11053c396ab0c4,2021-08-18T22:27:53+03:00,5226,3475,1053,2453,997,529,698 +0ad807a8416146c9a5b124fc6c5219fbd8239373,2021-08-18T22:27:14+03:00,5226,3475,1053,2444,997,529,698 +0ae6b3127d0486f1271b2279b9422160b7d8309a,2021-08-18T22:26:19+03:00,5150,3415,1053,2444,997,529,698 +ab7832732b8ecf58cb5cee9ff0b0194cb151443d,2021-08-18T14:25:04+03:00,5150,3415,1053,2444,990,529,698 +1a47ddbcc0cb26981a66b87651376be07942c24f,2021-08-13T21:16:35+03:00,5150,3415,1053,2444,990,529,698 +1a74ee8b6c93b91077394db40440501ca3a4c101,2021-08-13T21:15:44+03:00,5123,3392,1053,2444,990,529,698 +d1c61211df1f9253bc505cee2584e163071d6572,2021-08-12T10:10:33+03:00,5123,3392,1053,2441,990,529,698 +f2e42b9212e97dc390799ccfb2f24843873e0c4d,2021-08-11T22:17:21+03:00,5091,3363,1053,2441,990,529,698 +36106c8f47d48930512eb94fd1c31c3301ac0cd3,2021-08-11T13:14:55+03:00,5067,3352,1053,2441,990,529,698 +750b12ef7655f5b422e97e9a2d9d391784078616,2021-08-09T13:53:23+03:00,5065,3336,1053,2441,990,529,698 +cc296f08e8a96ce00be46f4a8684db7828fb6f30,2021-08-09T13:28:39+03:00,5065,3336,1053,2441,990,529,698 +e13ab60bb4acc1dbe3d4852f8572d51646c06713,2021-08-08T21:12:13+03:00,5027,3322,1053,2441,990,529,698 +0a3127d4254bb2ac9a1316cdbafa3981dfb3417a,2021-08-08T21:01:40+03:00,5027,3322,1053,2441,990,529,698 +32b2794b76288b8236ad688dcfa2db284c6be577,2021-08-07T18:57:23+03:00,4973,3283,1053,2441,990,529,698 +6fa7b9334ce28a8efccafc649576c6a92d39a56f,2021-08-07T18:57:06+03:00,4973,3283,1053,2441,983,529,698 +9854573203e6aa4e1bbd3ef5b342799a2e79d5b3,2021-08-07T09:58:55+03:00,4947,3255,1053,2441,983,529,698 +57559ee47d5763ceb77627d2be26d9301dc1810c,2021-08-05T17:07:51+03:00,4947,3255,1053,2441,983,529,698 +79e89529509d1711904e26f7576886b101a01601,2021-08-05T17:03:15+03:00,4947,3255,1053,2441,983,529,698 +0e769a951f5d9adee9e0e16a50a06f2105f7b959,2021-08-05T17:02:42+03:00,4947,3255,1053,2439,983,529,698 +56e87062d74149287e081ddf4b2889182a5be551,2021-08-05T17:02:23+03:00,4894,3214,1053,2439,983,529,698 +52bb3c9d2917c9fec02541fb73ea1f1a78640cea,2021-08-04T18:46:14+03:00,4894,3214,1053,2439,968,529,698 +624b24a4d3fcc79bab9ffd5b58a7b1542a33b466,2021-08-04T16:39:40+03:00,4894,3214,1053,2432,968,529,698 +7049a698224c1ea6078cf8a078ca9f58bf465db5,2021-08-04T16:29:03+03:00,4894,3214,1053,2432,968,529,698 +09aace32d759bc1a3503316e38d008ef8fd91d68,2021-08-04T16:28:32+03:00,4894,3214,1053,2432,968,527,698 +a2d1135165ab9a13311e5449e63499ebe2d60356,2021-08-04T12:02:45+03:00,4895,3214,1053,2432,968,527,698 +bc243cd1d3e44eb382031a54080ba1c9f3199b26,2021-08-04T11:29:35+03:00,4895,3209,1053,2432,968,527,698 +4c544d850853a45ef35eb678ad23c9a7512e6ad2,2021-08-04T11:29:27+03:00,4895,3209,1053,2432,968,527,698 +9f4a0b1e09601bd30e942cac5530b26357ea4602,2021-08-04T11:27:50+03:00,4759,3139,1053,2432,968,527,698 +1be22593a48bdc277971b24233dfbf4bf3de0521,2021-07-31T21:25:59+03:00,4759,3139,1053,2418,968,273,698 +304993a14eecf3292ea357a15b2304f4e8f1815b,2021-07-31T16:46:08+03:00,4767,3124,1053,2418,970,273,698 +b9f06e77275ef032dbc1a2fae36394b1c4fe171e,2021-07-31T16:44:20+03:00,4767,3124,1053,2418,968,273,698 +9ac94c39670da168de60daedbd77da029ad4a7fb,2021-07-31T16:28:25+03:00,4767,3124,1053,2418,930,273,698 +48fd28b543cf411bfc069e20818eb60e113b3df0,2021-07-31T09:46:48+03:00,4767,3124,1053,2418,916,273,698 +f92bd16c509fdbad1c18636341b1d5e2e23c0b69,2021-07-29T16:48:45+03:00,4736,3118,1053,2418,916,273,698 +d14808fa7fece33dd31eb3e62b96edf5401a9825,2021-07-29T16:47:57+03:00,4670,3087,1053,2418,916,273,698 +7f50bdb82ce941dce8fb109841346c38fe0e4aa1,2021-07-27T18:27:50+03:00,4670,3087,1053,2418,915,273,698 +a26e5fa8ef4cb2b4cc90dccfdf82a960306051b3,2021-07-27T12:49:23+03:00,4670,3087,1053,2416,915,252,698 +6070c4bca93967753399a95d14ab7b6fb4867c14,2021-07-27T12:46:27+03:00,4647,3073,1053,2416,914,252,698 +349b0fd5dd5665950a9c09a2651e72ae68f4473d,2021-07-26T17:39:15+03:00,4695,3073,1053,2416,807,252,697 +776cab2b89971e284a5413d7c7d0ed824a55ed14,2021-07-26T17:38:55+03:00,4620,3015,1053,2416,807,252,697 +3a441661bb2de23bf1a39121d22f315c1e4668ac,2021-07-26T17:37:05+03:00,4620,3015,1053,2412,807,252,697 +bd3743e3a370309d36d957188c7272dbe2f4279b,2021-07-22T22:06:24+03:00,4620,3015,1053,2412,807,252,697 +d209886abc2ddc8282e1a53f20afe3ad291fd582,2021-07-22T17:49:10+03:00,4498,2927,1053,2412,807,252,697 +ba9d50d4914cab4cc7270bbb90f073e2865469a1,2021-07-22T14:29:10+03:00,4472,2927,1053,2412,807,252,697 +740753d69683c4e04748f000e996e59ac9974833,2021-07-22T12:16:10+03:00,4472,2927,1053,2412,807,252,697 +b880e8a2e10c148b6aa1dd937315c21409587c63,2021-07-21T20:59:26+03:00,4426,2890,1053,2412,807,252,697 +57b757a78f3fb151ba012da56791686d90b74a07,2021-07-21T15:14:59+03:00,4423,2890,1053,2412,807,252,697 +4785f72fec3efa497cea17ac79b3c366185a90e3,2021-07-20T21:43:59+03:00,4423,2890,1053,2387,807,252,694 +7973aec28eedf4e40a4e1ad82d939dfc89acd24d,2021-07-20T21:43:08+03:00,4321,2801,1053,2387,807,252,694 +bd7d246fef7a25aaa2b21ed40499891b822c1b50,2021-07-20T21:41:58+03:00,4319,2799,1053,2387,799,252,694 +b89a27b39010799ad06db6004b7fccdd5af39b2f,2021-07-17T20:32:04+03:00,4319,2799,1053,2387,799,252,694 +f319f1a31f8dbdee045b06385bf7eace899b4fb1,2021-07-17T10:53:14+03:00,4257,2783,1053,2387,799,252,694 +99505117b4568d8c57a2b9fdd3c6c627c9e2b041,2021-07-17T10:50:50+03:00,4257,2783,1053,2384,799,252,689 +2615f584d2ea741b0b6da6dd45d4637c3f27327f,2021-07-14T21:57:17+03:00,4078,2698,1053,2384,799,252,689 +82d66af51b9ae6d1ba843f86df41bf6e9f707ca5,2021-07-14T21:57:02+03:00,4078,2698,1053,2384,799,236,689 +42065f16eec254a212622e51248dc258c80cb84b,2021-07-14T18:43:29+03:00,4060,2665,1053,2384,799,236,689 +68c28de2c6a72d36ffd7deb71a56d24c621dbaba,2021-07-14T18:43:00+03:00,4035,2665,1053,2384,799,236,689 +59d56cfb8aee27d5822f2127462bcd0d2729acd5,2021-07-13T16:04:41+03:00,4035,2665,1053,2384,749,236,689 +ab011b826f9cc1f8a4c33f974f3879171f1a1c98,2021-07-12T19:38:21+03:00,4027,2665,1053,2384,749,236,689 +342b9f5d485af8164856c5ae1a32d5de03c2a7c1,2021-07-12T19:33:35+03:00,4028,2666,1053,2384,749,236,689 +c138635f6aa5c79b1c058529b7186d64ea37864e,2021-07-12T12:14:23+03:00,4028,2666,1053,2384,716,236,649 +00141e7dca1a7c7fc381fa9399b17cc23f699b04,2021-07-12T10:10:38+03:00,4028,2666,1053,2387,716,236,632 +21d8917821634fe8b79200cb79e6c74197036fab,2021-07-10T19:49:10+03:00,4028,2666,1053,2387,716,249,632 +f5e7d44aedeb3c9e0969ad200072ae0fa271ad8d,2021-07-10T19:44:11+03:00,4028,2666,1053,2387,711,249,570 +e298ab4c667ad0e8ffa60bb92b2cebb7b4cd408c,2021-07-10T19:43:37+03:00,4028,2666,1053,2387,711,239,570 +2c3505505f8e5acb05370a564a9aec37016f47f8,2021-07-10T19:42:57+03:00,4025,2663,1053,2387,711,239,570 +b046e1dd06d181a252e76c0ca86ee1a04ffc85dc,2021-07-02T17:09:52+03:00,4025,2663,1053,2374,711,239,570 +53ce1053565d920e0cd7d511ef3e3f964a8b1d4f,2021-07-01T12:45:59+03:00,3986,2663,1053,2374,711,239,570 +5e4b4a6087c4ac9da53639f9cbddac8d8f522ded,2021-06-30T20:54:13+03:00,3986,2663,1053,2374,711,239,570 +9b2179110d1c133cc68c1b72883b0d19416c931f,2021-06-29T13:59:38+03:00,3905,2618,1053,2374,711,239,570 +27301786daa82dd29285abff0c2fa5a0ade6ceee,2021-06-26T18:34:06+03:00,3905,2618,1053,2365,711,239,565 +c2b1b0a66a3e5c3e627db5fb1513187dd38c6498,2021-06-25T20:30:45+03:00,3905,2618,1053,2365,711,239,580 +88fab62141ce1af37bff70f81f2784beb5f72ee2,2021-06-25T19:57:56+03:00,3901,2602,1053,2365,711,239,580 +d43a07adcf87eb032ab4ab1f158ca4b9895f7a2f,2021-06-23T20:32:52+03:00,3901,2602,1053,2355,711,239,580 +c2231d32b9f7cf9361a404926077f7d4cf70e05a,2021-06-23T20:01:12+03:00,3900,2602,1053,2331,711,215,574 +557a6765d879dd6392fcd3d9b3a56f47fb11c129,2021-06-23T19:59:48+03:00,3900,2602,1053,2331,711,215,556 +12e25acdeb334916fdd269e9743d02019b365ba4,2021-06-22T08:54:46+03:00,3900,2602,1053,2326,711,215,556 +f39b410440fe71da7b9029216c5785f234eda5fd,2021-06-22T08:54:38+03:00,3900,2602,1053,2323,696,215,555 +02664b08f71e63f0c5f41e334586e4845fccadff,2021-06-21T09:23:36+03:00,3901,2602,1053,2323,686,215,555 +b887ae0c7dd17923eabd91b747120b32c46f98d5,2021-06-20T20:16:34+03:00,3901,2602,1053,2277,685,215,518 +2747239adda94a6580646b39a50189e1fe7fbfe5,2021-06-20T19:05:05+03:00,3901,2602,1053,2282,685,215,507 +35d0a94387dc7f27ce4e59c400a6bcd4be20f2c8,2021-06-20T08:35:45+03:00,3901,2602,1053,2282,685,215,490 +fc674b814237648f3c004b2398ae62d99d00a88e,2021-06-20T07:40:24+03:00,3901,2602,1053,2282,685,215,490 +2380ebf4d101ce6269f48559db9983ff0cc3e92f,2021-06-20T07:40:14+03:00,3901,2602,1053,2282,685,215,490 +5e4504b764c313f72a393aa5885f419c24b36ed9,2021-06-20T07:37:55+03:00,3890,2585,1053,2282,685,215,490 +2d0893ed6d1fcda879640f34a17e389d7eaa5977,2021-06-20T07:37:26+03:00,3890,2585,1053,2278,685,215,489 +c38db5027e0f5efebb406683ab3d1334e429164c,2021-06-19T20:11:45+03:00,3890,2585,1053,2278,684,215,489 +12a25ded4ba3de9a96ff1b0953b5ce243cbe81b5,2021-06-19T17:18:51+03:00,3890,2585,1053,2278,684,215,489 +eec899a0b089d13ad70514489d6e2209f6ebb3a9,2021-06-18T21:36:50+03:00,3890,2585,1053,2277,684,215,418 +cd54e345e5f0cad99c9d4188b973faddd6bb5a09,2021-06-18T18:14:30+03:00,3890,2585,1053,2266,684,215,445 +a37ab00e9bbb2cf781f4eeb94bbc4ae2f3b42fdb,2021-06-18T18:13:55+03:00,3889,2584,1053,2266,684,215,445 +7d61969160b9a669335656a149cbda17f857d4dc,2021-06-18T17:06:12+03:00,3889,2584,1053,2249,677,215,443 +198156ab889643ca5397e7824201e9b40af9ac26,2021-06-18T17:05:28+03:00,3889,2584,1053,2249,676,215,443 +470794016384374b86129197385edf47965911ad,2021-06-18T17:03:51+03:00,3889,2584,1053,2191,676,215,443 +973062cca2f5f24e22fa7046807b335954b68823,2021-06-18T17:02:20+03:00,3900,2589,1053,2191,676,215,443 +c53d3a39322720d0f147fa402d80f91112e1e0cd,2021-06-18T09:50:42+03:00,3790,2547,1053,1932,554,0,0 +bee1990318a5a36cbc7394183c8c39fdf1c0b777,2021-06-17T11:46:49+03:00,3900,2589,1053,2191,676,0,443 +738595780fa6dd70e39e927f0a8fcbc3e540dba1,2021-06-17T11:45:59+03:00,3890,2562,1053,2191,676,0,443 +a3f937cd44640831db2183b81473037b83fedfa2,2021-06-11T19:13:03+03:00,3890,2562,1053,2149,676,0,443 +f63a3d7c98da8412dca75a5ed793d58bac87989f,2021-06-11T11:39:31+03:00,3890,2562,1053,2082,676,0,488 +e055f895d9b8d6b775755c34cfbd94cf9cea9eed,2021-06-11T11:39:31+03:00,3886,2562,1053,2082,676,0,488 +87124deb8c3eebf6f9721de05352c8205e6cf8ca,2021-06-11T11:39:31+03:00,3886,2562,1053,2081,676,0,488 +912ca5d181056723ada8c48629741bca0d0cb778,2021-06-11T11:39:31+03:00,3886,2562,1053,2081,676,0,488 +695629551ff9641e92bc2fe52ca4e5cb5d865dcb,2021-06-11T11:39:31+03:00,3886,2562,1053,2081,663,0,488 +d91c66288433fa864f7fb6021f33832328acd134,2021-06-11T11:39:31+03:00,3873,2562,1053,2081,663,0,488 +0f98e475c1785c2dc6adc42a79125859eae5eaae,2021-06-11T11:39:31+03:00,3873,2562,1053,2081,663,0,458 +07c4551000f45c7c9910db9662ba6b4ea3f5a992,2021-06-11T11:39:31+03:00,3873,2562,1053,2078,663,0,411 +9ea0f5834b1451fb7d15dc4b7a6032e180aa5fe8,2021-06-11T11:39:31+03:00,3873,2562,1053,1998,663,0,411 +8b6f2f37517758455c356866e3263478cbb1ae74,2021-06-11T11:39:31+03:00,3873,2562,1053,1998,663,0,360 +8c7105de9d64696b1fe2ed2d387ba0551073a84e,2021-06-11T11:39:30+03:00,3873,2562,1053,1998,655,0,360 +c40d199aad7fa076a155ed0d82f73090b722baf6,2021-06-11T11:39:30+03:00,3868,2561,1053,1989,650,0,324 +5d006c082ce4f9a43f391d354723512302a071f1,2021-06-11T11:39:30+03:00,3868,2561,1053,1989,650,0,278 +762ae0e5bc0c9eba00cb8e3738b9334481167cd0,2021-06-11T11:39:30+03:00,3868,2561,1053,1932,650,0,278 +d1dd4b8929b3be7e8c39f392416af948ab2a8ceb,2021-06-11T11:39:30+03:00,3868,2561,1053,1932,650,0,280 +349e9c66aa7066a85c23914657473b3ce577df3b,2021-06-11T11:39:30+03:00,3868,2561,1053,1932,650,0,148 +87e4cd15797198ce514e305f93e558d867a5caf8,2021-06-11T11:39:30+03:00,3868,2561,1053,1932,554,0,148 +fd2e6ea2adf1bb98528aac859f43093b79aaa07b,2021-06-11T11:39:28+03:00,3868,2561,1053,1932,554,0,144 +02540932bf150d4693731513ee08f13bcb008c1a,2021-06-11T11:33:48+03:00,3779,2530,1053,1932,554,0,144 +8aef8f37a65d824a5ce7612faaadf56e2dab21d8,2021-06-11T11:33:48+03:00,3779,2530,1053,1932,554,0,0 +338d1fcb59b4d712b4d4b10e54312e900a4bd1d5,2021-06-11T11:33:48+03:00,3779,2530,1053,1932,554,0,0 +11d91f9ad67d8674ac66e302506d57e9ec699964,2021-06-10T12:25:33+03:00,3779,2530,1053,1932,554,0,0 +24a43d5e0f3c6a27f8cdd290a719044a5dc76281,2021-05-29T22:02:49+03:00,3716,2471,1053,1932,554,0,0 +a09570538230bec8d2051282e09937d2d3a0f514,2021-05-28T19:12:53+03:00,3693,2471,1053,1932,554,0,0 +4ac1cc194ce62efeeff04c33d0a2b3185bb4c825,2021-05-26T21:13:43+03:00,3659,2444,1053,1932,554,0,0 +3ac14ed61736343e953d79ac621500dde4498fb3,2021-05-24T16:11:09+03:00,3623,2417,1053,1932,554,0,0 +6d896e9002dfd6509b14fcce53ae4432e6888e53,2021-05-24T16:10:17+03:00,3617,2417,1053,1932,554,0,0 +99d53def658470d765476a4398d07bf5283637c0,2021-05-21T09:31:26+03:00,3541,2364,1053,1932,554,0,0 +57fbd4ea49b483363d095f190e1058394c048411,2021-05-19T20:42:30+03:00,3534,2363,1053,1932,554,0,0 +9685c77a707d1f924a9af222ef1fe9b471fb4dae,2021-05-19T17:25:24+03:00,3534,2363,1053,1931,554,0,0 +4f50f53ae11c1fc64f7e23db1f1023d08c893830,2021-05-18T12:59:12+03:00,3503,2350,1053,1931,554,0,0 +741c6d77fa5fba19484cdaa96d98fa30424dcc42,2021-05-18T11:22:25+03:00,3497,2347,1053,1931,554,0,0 +ae58af4e7d5cf79e464c5a6def1f53b43e5e1a99,2021-05-16T10:11:27+03:00,3496,2346,1053,1931,554,0,0 +1b91184f12a3e71d008acdb5e7eb76b1e86f5a65,2021-05-15T12:56:49+03:00,3391,2251,1053,1931,554,0,0 +3a01bee95c8ae0cc1288e251fcdd538c624eea95,2021-05-14T19:52:08+03:00,3350,2228,1053,1931,554,0,0 +20590a08317ae7f712c59e5ce33d82ef2f183676,2021-05-09T19:21:32+03:00,3342,2221,1053,1931,554,0,0 +b576436028e544d6e751bd88bfd6168346411445,2021-05-08T17:23:37+03:00,3281,2175,1053,1931,554,0,0 +9b8459b5879e6954cb62edd6710bd48deb3ff51f,2021-05-08T12:52:35+03:00,3273,2174,1053,1931,554,0,0 +21d6ccd089f43ce0e6ba441b8497fff920f967ac,2021-05-06T22:46:13+03:00,3270,2171,1053,1931,554,0,0 +e0e0da8364bcacfda6846abc513c8d70e2af3316,2021-05-04T22:23:06+03:00,3220,2143,1053,1931,554,0,0 +edd7cfd8cef803f0124d083aac4de3d658443b2d,2021-05-04T20:11:15+03:00,3187,2117,1053,1931,554,0,0 +6b06c6f73af0e4b61d736ae940d4db19ef3cacd9,2021-05-04T12:11:09+03:00,3096,2061,1053,1931,554,0,0 +b5f98822bb56047cd39565f154a8cadfcb15f6c6,2021-05-02T18:16:22+03:00,3046,2020,1053,1931,554,0,0 +d4d65c6fcf696bb7dcf3a06d1b5a3ea87bb437ea,2021-05-02T18:07:13+03:00,3019,2006,1053,1931,554,0,0 +24db4458c03014010f050c832b8633084b249014,2021-05-01T19:03:07+03:00,3019,2006,1053,1931,555,0,0 +8654bd179bafccd3460d3373249d5aee6bcf2409,2021-05-01T18:56:52+03:00,3019,2006,1053,1931,555,0,0 +fe7ad2de8f642b89b7086114f661490dc50cf4d1,2021-05-01T18:52:59+03:00,2996,1990,1053,1930,555,0,0 +6b70df8719785bfb0100e27d14f5df7146053c2c,2021-04-29T20:43:34+03:00,2996,1990,1053,1857,544,0,0 +7f38639fc477a6640fce04774018114a9c328c9c,2021-04-26T16:33:34+03:00,2935,1959,1053,1857,544,0,0 +c0c9bdb65eb3136f7029df8bcc55035dc7b415f1,2021-04-26T16:16:10+03:00,2934,1945,1053,1857,544,0,0 +022afcfb98219cf13d9c2074f5b871fb571f90d5,2021-04-25T21:39:47+03:00,2888,1923,1053,1857,544,0,0 +31cab6a7872705ec7a11c7ee38740e6dcaf884fa,2021-04-22T22:01:59+03:00,2862,1909,1053,1857,544,0,0 +382bc7b3f3097e025a1262d2f58d889f624d679d,2021-04-22T18:47:30+03:00,2809,1820,1053,1857,544,0,0 +8eeee8e301bf266745a2efad22b01075644ccd44,2021-04-22T16:17:49+03:00,2809,1820,1053,1857,544,0,0 +aa9c57e331ba9fbb929f741ff4798e20a91616b4,2021-04-22T10:18:36+03:00,2793,1810,1053,1857,544,0,0 +b2ba760b8207b93914e748bb28e7acbe35ed839d,2021-04-22T10:18:17+03:00,2793,1810,1053,1857,544,0,0 +e78acbbcf965f718fa58f96ea66187a8d35e1e48,2021-04-21T22:43:08+03:00,2781,1801,1053,1857,544,0,0 +e49d12622ee3e14751215df9aed907e3fa069e14,2021-04-21T18:01:56+03:00,2781,1801,1053,1857,544,0,0 +35fa298833248615bde7e95fcf5647f0452dd23f,2021-04-21T17:57:41+03:00,2780,1801,1053,1857,544,0,0 +4f9cddd68771a81f3eb66cf5ad02cb17dab3980f,2021-04-21T17:55:42+03:00,2780,1801,1053,1857,544,0,0 +c7630813c36eac9cf8067af35fe743b8b9dc4064,2021-04-19T15:05:27+03:00,2768,1797,1053,1857,544,0,0 +81efbdf27277de7a7e9dde154f96081524a36ce1,2021-04-18T19:20:58+03:00,2724,1762,1053,1857,544,0,0 +9592cad3afd6e210157d77eba18560f8f0053cc2,2021-04-17T14:43:06+03:00,2697,1720,1053,1857,544,0,0 +f756d6c4fe42cd4bfc7a8596cba956f57d0ba0b1,2021-04-17T12:17:42+03:00,2696,1720,1053,1857,544,0,0 +c50e6ed2673fcebdad5a50e198c26de75636a57f,2021-04-17T10:56:53+03:00,2624,1603,1053,1857,544,0,0 +244da2546eb15f2dd8a68126d1e48489087985be,2021-04-17T10:56:20+03:00,2624,1603,1053,1857,544,0,0 +2b4935ba773f35238fdcc0a2056b316163f5cafc,2021-04-16T21:50:01+03:00,2624,1603,1053,1857,0,0,0 +6ebf968c017f93e3a8b4c33acd2cfd291f22963e,2021-04-16T16:48:18+03:00,2624,1603,1053,1857,0,0,0 +2fe8ce6f0dc0a3e09cd9ec426689b6157e62bee3,2021-04-15T11:36:07+03:00,2624,1603,1053,1857,0,0,0 +52618736ca77e5ecb39719807384f0c49c92822b,2021-04-13T20:12:47+03:00,2596,1572,1053,1857,0,0,0 +be475e702cf41aaab7540ac30569ac4c2311b21c,2021-04-13T20:00:37+03:00,2570,1556,1053,1857,0,0,0 +751106d8c86fb4056d8d79b82f7d92fcdbfbbacb,2021-04-10T22:00:55+03:00,2540,1517,1053,1857,0,0,0 +32014e97d2bcca6d0060afad8a1a2216e43d65c2,2021-04-10T20:02:07+03:00,2539,1514,1053,1857,0,0,0 +03faea8c65d0f55c8910dbbb91f0b0d69745075f,2021-04-09T21:34:32+03:00,2503,1484,1053,1857,0,0,0 +43c3446e9fb34636ea80aa149ac5c86e4f1f74c0,2021-04-06T20:17:51+03:00,2491,1483,1053,1857,0,0,0 +d55b62899800e9b6d317542eff153e8c1b63ac7d,2021-04-06T20:17:34+03:00,2486,1480,1053,1857,0,0,0 +af0211208a41462a160a466d26178ec7280dd696,2021-04-06T13:46:00+03:00,2487,1479,1053,1857,0,0,0 +87ad371915306dcd9ca563814193a54635a0b100,2021-04-05T20:56:04+03:00,2482,1476,1053,1857,0,0,0 +c41a2567b68db24153e2f78d2bef482ca77c3490,2021-04-05T18:59:22+03:00,2461,1460,1053,1857,0,0,0 +c777b0b4b2f5394d05c2d12fd6e91064284f196a,2021-04-04T21:41:53+03:00,2442,1446,1053,1857,0,0,0 +09c09ac94285b62722e26c4ccf25906e41a3e697,2021-04-04T11:38:40+03:00,2442,1446,1053,1857,0,0,0 +07a34b94fbb037e37d9e5479209a2807514e8d9c,2021-04-04T11:35:15+03:00,2442,1446,1053,1816,0,0,0 +9197605658b64f71b3d53e1ab8aabd1fc1975769,2021-04-03T22:13:29+03:00,2435,1442,1053,1816,0,0,0 +718014f5db3d3358e171b24e9218c2f9452e3b78,2021-04-03T22:08:17+03:00,2426,1433,1053,1816,0,0,0 +da773a1d4bd1e75bc0d8d20a8e1d999b9fa70e2d,2021-04-03T16:00:16+03:00,2381,1407,1053,1816,0,0,0 +5e5c243ba8ef363dcf6a443832341ea44d35666d,2021-04-03T15:55:16+03:00,2381,1407,1053,1816,0,0,0 +6bbf600710719bf844bd884e055b8e79bfbb6167,2021-04-03T15:53:08+03:00,2230,1407,1053,1816,0,0,0 +1fff2396552149436ff13fa5893cf16bb3bbb228,2021-04-03T15:40:12+03:00,2230,1407,1053,1816,0,0,0 +97d5d2bb699691f5220281cc075b6e78d6c0e765,2021-04-03T15:39:01+03:00,2230,1407,1053,1816,0,0,0 +dcffb1658060c093c38a6adada1de5c55630d09f,2021-04-03T15:38:41+03:00,2230,1407,1053,1816,0,0,0 +ab84a36a1348d6226df8c730f65b88ac3bbdd11b,2021-03-31T21:49:31+03:00,2098,1533,1053,1816,0,0,0 +80d6256f5ec9c43e53e4aca4cabae8de4a57506b,2021-03-31T21:48:20+03:00,2098,1533,1053,1812,0,0,0 +286994dd42913a27f78c9c7f2239915ef7fd9bc0,2021-03-31T21:47:03+03:00,2098,1533,1053,1812,0,0,0 +e46c512575f3dbdd375853a24bcefec6677fde61,2021-03-30T22:07:14+03:00,2098,1533,1053,1812,0,0,0 +9c30ffa3a198dbccd4ed4fafec8d844991d2e449,2021-03-30T21:45:27+03:00,2098,1533,1053,1716,0,0,0 +e7fce64a54f376f727c9c6d046665ac8f41d431e,2021-03-28T22:32:21+03:00,2098,1533,1053,1716,0,0,0 +78cfd6586b9352b6347f772922b075050f64e815,2021-03-28T13:13:02+03:00,2098,1533,1053,1329,0,0,0 +9d39f4ee90e5f8f4811a3a44c557a3aa10cfd8f6,2021-03-28T12:59:55+03:00,2098,1533,1053,1329,0,0,0 +e0fcb960ccaeef1fda6cb87f2f5476d87b8a4473,2021-03-28T12:56:53+03:00,2098,1533,1053,1329,0,0,0 +0eff8c56ac5ded25018f608b1018b95eb6b3912e,2021-03-28T12:21:15+03:00,2098,1533,1053,1113,0,0,0 +22d86a6c24e8593276f3d12d45517c7c4d3ab4bf,2021-03-28T11:14:59+03:00,2088,1530,1053,1063,0,0,0 +0e3b17edb685c91d6bbf7088e0f8cbaf762b831c,2021-03-27T21:54:12+03:00,2088,1530,1053,1063,0,0,0 +93a0573fc41f58c6c7f94ac5beb9d6c5222906a6,2021-03-27T17:35:21+03:00,2071,1517,1053,1063,0,0,0 +845e1a273963abbb19275c34fc92d0d2d708d8f0,2021-03-27T17:29:07+03:00,2069,1517,1053,1063,0,0,0 +d869192bf14ab2ee9d68c633bb4644588d357a27,2021-03-27T16:27:39+03:00,2069,1517,1053,536,0,0,0 +ef440cfb499ca873054350a53e821ad658cb6d35,2021-03-27T14:28:50+03:00,2069,1517,1053,538,0,0,0 +2c3dd0b0af7bbb6dd726c82fc44b149d3a350583,2021-03-27T12:47:05+03:00,2069,1517,1053,0,0,0,0 +7a992d21eb87e74c6f135e562e71e171d2590314,2021-03-27T12:46:42+03:00,2069,1517,1053,0,0,0,0 +c520a1387d0cabcb6f908e93d1316fde7b462af5,2021-03-27T12:46:14+03:00,2069,1517,1053,0,0,0,0 +cdbeaa1fffa1ce2e6d30ae0ceec97b39a87ca604,2021-03-24T10:21:49+03:00,2067,1505,1053,0,0,0,0 +67f69904c610757b5a7523ce027c36f5c79f7240,2021-03-24T10:18:46+03:00,2067,1505,1053,0,0,0,0 +ce14de2074b023c935cd1077a82797a9040c6d1b,2021-03-24T10:16:54+03:00,2067,1505,1053,0,0,0,0 +b6fb14b7054c3fa91b9c8cc482b50d4fd8463a70,2021-03-24T10:14:26+03:00,2067,1505,1053,0,0,0,0 +54e153d02dabc29ddc9ec553fa677725e674d047,2021-03-21T21:46:31+03:00,2067,1505,1053,0,0,0,0 +4d116f29495302e8970b0fa7d3494e598aaa995a,2021-03-21T21:27:56+03:00,2067,1505,1053,0,0,0,0 +47f8a13f8da87f7ff304f0095f65eba080ec14aa,2021-03-21T21:27:37+03:00,2067,1515,1053,0,0,0,0 +7f7afe5b68a97743152fddce32b879744541eab4,2021-03-16T13:01:56+03:00,2067,1505,1053,0,0,0,0 +e258ec45ffe7bd9813a846258eac2ecc379f0486,2021-03-16T13:01:49+03:00,2060,1522,1053,0,0,0,0 +67b6dc3d2c99caca93bb345c051a8bcd405eb451,2021-03-16T11:49:15+03:00,2067,1515,1053,0,0,0,0 +b3224f4eb6461f709a42a78b447f08d1eef491df,2021-03-16T07:30:26+03:00,2060,1532,1053,0,0,0,0 +24981a6c8e57063c83ee29247670c3d930a14958,2021-03-16T07:28:55+03:00,2060,1532,1053,0,0,0,0 +bce9a520f37f87e1f03f664ebe5391378f0c112e,2021-03-13T13:16:37+03:00,2060,1532,1053,0,0,0,0 +9eda3a739ceef8ff4f676be03738c7c10664a3d0,2021-03-09T08:55:44+03:00,2060,1532,1053,0,0,0,0 +9d1ef91caa5786d1d5c95ab0782dd83ee0f9dc95,2021-03-08T13:28:05+03:00,2060,1532,1053,0,0,0,0 +2c26a2116191b2366bb0e95791b3280443c7e2cf,2021-03-08T13:18:35+03:00,2060,1532,1053,0,0,0,0 +7e75f0d9340c57d5e3541dbe882ca7a129f77649,2021-03-07T16:03:28+03:00,2060,1532,1053,0,0,0,0 +3f9d86fe95083ba35e555971cdd09f07de8e2c6d,2021-03-07T16:02:27+03:00,2060,1532,1053,0,0,0,0 +fad031bcb92fdf419c577e5555504eef769e5901,2021-03-04T12:49:53+03:00,1998,1484,1053,0,0,0,0 +f39411a3cd079b0daae00383e2473aba39eb6953,2021-03-04T12:34:52+03:00,1995,1481,1053,0,0,0,0 +42276738dff3e3ea8dc69b831e70b9fc0bafde86,2021-03-04T11:38:01+03:00,1995,1481,1053,0,0,0,0 +fd5f3eb3ea8f6af19ad735e3f88baff34180060e,2021-03-04T10:28:32+03:00,1997,1483,1053,0,0,0,0 +708e3021479e4f8408a4ed68daa73269dff8cb09,2021-03-01T11:29:05+05:00,1983,1469,1053,0,0,0,0 +6d0217c49c3c83546cf11ee95c5d53484594d464,2021-02-28T15:01:49+03:00,1983,1469,1053,0,0,0,0 +0429ab2126e080435cafc77ccc1e9e86adef2510,2021-02-28T15:01:33+03:00,1983,1469,1053,0,0,0,0 +077391d793ef085cde93f83b70b5c760b1b6c6bf,2021-02-22T19:39:16+03:00,1959,1454,1053,0,0,0,0 +a5b8c27879cc18b2089a74f38c2207450ad12cd2,2021-02-22T19:37:10+03:00,1959,1454,1053,0,0,0,0 +e4edc119e69ae357403daf360430fe16800f1394,2021-02-15T12:24:20+03:00,1917,1425,1053,0,0,0,0 +483af5e3c4d56fb90a247527c38b528c78ceea20,2021-02-14T20:53:31+03:00,1876,1389,1053,0,0,0,0 +167f1d58ced56b7b3586b0650d9f85e74a58bacb,2021-02-14T20:53:00+03:00,1876,1389,1053,0,0,0,0 +22b6fc87325dad25baec84c9d89df3544dd87336,2021-02-12T21:39:01+03:00,1831,1348,1053,0,0,0,0 +ddcabd0b57affdcdc9b63f49cae239ced321fb43,2021-02-12T18:28:48+03:00,1831,1348,1053,0,0,0,0 +89c54713da960a18fdfdf7ce3a9ec6b13e32bbbc,2021-02-11T21:03:44+03:00,1831,1348,1053,0,0,0,0 +e7b0bbc58fa9c4d70027ce8a089a95db92e183f6,2021-02-11T21:02:52+03:00,1810,1329,1053,0,0,0,0 +b7a40a3b7c25673a8d7eb0dfd0a23f92e2534174,2021-02-10T11:05:44+03:00,1810,1329,1053,0,0,0,0 +2e3c0412b34ff51266da33cbb89c7b9fdf94b88a,2021-02-10T11:05:25+03:00,1810,1329,1053,0,0,0,0 +16326a010d26c1217fbec8ff42cdd299d0d39ae0,2021-02-06T21:28:00+03:00,1735,1341,1053,0,0,0,0 +5483eeb34eac68015a9a66def102bcf8db54c92c,2021-02-06T23:15:52+05:00,1735,1341,1053,0,0,0,0 +fbed354c68e3c4b466fb29f8726fc4a8c05fff6c,2021-02-04T20:48:12+05:00,1735,1341,1053,0,0,0,0 +133530c1c0763dccb9ba91b5f8d281ccff571190,2021-02-04T20:47:57+05:00,1730,1333,1053,0,0,0,0 +f3b697a935e1564ced0995be0f298d52c39ac719,2021-02-04T20:47:31+05:00,1730,1333,1053,0,0,0,0 +a533a06d061ddbe74f77fc7c66e5af2c2022c5e0,2021-02-01T11:16:37+05:00,1730,1333,1053,0,0,0,0 +1496e7ec0392cfea4eb424e1da2308878bcd300d,2021-02-01T11:15:44+05:00,1730,1333,1053,0,0,0,0 +55343c49a9ca3c49c9c6fa715cb215b66e66067f,2021-01-30T14:36:51+03:00,1730,1333,1053,0,0,0,0 +09fe035d6f5500147a1897d039d995e5ab627cc4,2021-01-29T21:59:37+03:00,1730,1331,1053,0,0,0,0 +27ce988287c518f798b926dda4efab0cf6e89c7f,2021-01-28T10:31:42+03:00,1728,1331,1053,0,0,0,0 +afcf8ef14c5a8187eae15142100704803f2980ec,2021-01-27T11:07:17+03:00,1728,1328,1053,0,0,0,0 +33b7ae403693d2df7628b8899b79da27e76498f6,2021-01-26T21:57:38+03:00,1726,1332,1053,0,0,0,0 +229dce2461ef05617cbc2b716a331a0bcbd15b56,2021-01-26T21:56:20+03:00,1688,1331,1053,0,0,0,0 +29f620f809a129b6e0ebe96247fe9d8c8afaee6c,2021-01-25T18:32:13+03:00,1688,1331,1053,0,0,0,0 +d5953c7dd0b4fbc89f930059322c4fb2aad64a8e,2021-01-25T18:06:11+03:00,1688,1331,1053,0,0,0,0 +54983088c0d82da49eaeb918ea1dfc2a1c506872,2021-01-25T18:05:33+03:00,1688,1331,1053,0,0,0,0 +dfa19d31418cece79ccb438297bc99c9402394fa,2021-01-25T12:39:18+03:00,1688,1331,1053,0,0,0,0 +c872a03c989bf9ce5453aa6903a58add9115eb4a,2021-01-25T12:39:00+03:00,1688,1331,1053,0,0,0,0 +63ebaff53cea4044089a39a0ec797eea727717e6,2021-01-22T21:00:24+03:00,1669,1329,1053,0,0,0,0 +29f9d3ee07376106a74670207fc0e7e01074923c,2021-01-22T20:59:43+03:00,1641,1302,1053,0,0,0,0 +7c4cc0a498f77c69b5f1b9bc5fa7d52602900bbc,2021-01-20T17:39:48+03:00,1641,1302,1053,0,0,0,0 +dfc9956cb8cd814221e3594c4a254be236c52f2a,2021-01-20T17:39:09+03:00,1638,1302,1053,0,0,0,0 +d578d31d6a60224793c6168ec9246b47ae36733a,2021-01-20T17:38:14+03:00,1638,1302,1053,0,0,0,0 +6fe3ba654de04250751f0762ac378eae6f8c7649,2021-01-14T12:41:37+03:00,1638,1302,1053,0,0,0,0 +e6167f6ac4c9cf26c16c95fe3ac0b02c783e0a0e,2021-01-14T12:33:22+03:00,1638,1302,1053,0,0,0,0 +1ab81470e4651a5d7945c8268d750cf88be136c4,2021-01-14T10:27:40+03:00,1638,1302,1053,0,0,0,0 +cba9ad4f2517396b31abecde1dabcbf582937180,2021-01-14T09:04:52+03:00,1632,1298,1053,0,0,0,0 +a0265b82e724a130e1d7181ddcd968dc1ae12a17,2021-01-14T09:04:05+03:00,1631,1297,1053,0,0,0,0 +7877dd1bc6ebe586e8c87b555471460d197524ec,2021-01-11T20:05:27+03:00,1619,1287,1053,0,0,0,0 +d2dad7072ac5aecc39d1c2bf4cb305c209fde4d5,2021-01-11T17:53:45+03:00,1618,1280,1053,0,0,0,0 +f5db6388432210a20210df5cd00dae1320369c9a,2021-01-10T12:36:32+03:00,1570,1294,1053,0,0,0,0 +5a3f3fa4d6bc1c65e96099ad6af2a2c26bead55c,2021-01-07T18:27:10+03:00,1550,1277,1053,0,0,0,0 +8b4424e4e392e3bda1f0e96dc289ff261ab7ab9e,2021-01-05T10:39:48+03:00,1534,1264,1053,0,0,0,0 +585ad0747660e3fd3fbff0261cf01b99ec3cbf03,2020-12-31T11:53:28+03:00,1503,1246,1053,0,0,0,0 +ac499424a9eb9b599443f4a4309b61eabe7c09e6,2020-12-31T09:48:31+03:00,1503,1246,1053,0,0,0,0 +e4bbb752a0cf80b325ae216e9ea81fc78bfdc857,2020-12-30T14:09:24+03:00,1491,1236,1053,0,0,0,0 +81fbfa7ab3e9862904ed99d62164474db6f91b80,2020-12-30T13:41:24+03:00,1491,1236,1053,0,0,0,0 +1fad2e5ebe70df29dedd5ffbd06c7447d9942b73,2020-12-30T13:28:23+03:00,1491,1236,1053,0,0,0,0 +4e0d2fb6e2681d53b160d676858e1cdb1e81fd95,2020-12-30T12:57:37+03:00,1491,1236,1053,0,0,0,0 +a3f3fd784eff39f3dac57789a3160e6ff3d32635,2020-12-30T12:28:30+03:00,1491,1236,0,0,0,0,0 +7abea5d6ceb3cf7356eea79b47f024ba4f05b076,2020-12-20T09:17:16+03:00,0,0,0,0,0,0,0 +e39bc85628ecaff84cded2f1e9bbe92a4d8c49d4,2020-12-20T08:17:16+03:00,1359,1143,1053,0,0,0,0 +bfd415a0dd77bb9ab5eef89a396329bb3e6c4cbd,2020-12-11T12:57:42+03:00,1345,1139,1053,0,0,0,0 +0cf54d68feb5253595f04f8e7434f2c6e298e20a,2020-11-28T11:47:18+03:00,1245,1051,1053,0,0,0,0 +3f3504ca33e79296357dfb0682eca09863beefbf,2020-11-25T20:19:24+03:00,1214,1023,1053,0,0,0,0 +707ddaddfea796478ac16d54185ddbd7a5f8c082,2020-11-24T18:47:13+03:00,1176,990,1053,0,0,0,0 +a83efdaec5386bee0c7ddc8093ec279bb1c4465b,2020-11-20T22:41:40+03:00,0,1036,1053,0,0,0,0 +30219f8ec1a08fa64a6f7f0bf32491a19130b9bb,2020-11-11T10:55:01+03:00,0,968,1053,0,0,0,0 +6ff999d23d7ce6393b49dbcded3279af9c3ae668,2020-10-27T17:18:29+03:00,0,905,1053,0,0,0,0 +a3271bb7a58760f49710329e68269ac588028391,2020-10-21T11:58:28+03:00,0,655,1053,0,0,0,0 +c42173d363499c5e073e51bdccc9d247e6421b18,2020-10-18T09:35:20+03:00,0,614,1053,0,0,0,0 +8cea88e9ea892c47daf54d0844e3f8e2bf69330a,2020-10-15T14:01:37+03:00,0,410,1053,0,0,0,0 +b3ab7d320771a826390995df660dacb6cbf773a4,2020-10-06T12:43:53+03:00,0,0,1053,0,0,0,0 +7d7208ad0384a8ebe2a4e9807b0f88bc214aeb85,2020-09-28T10:41:14+03:00,0,0,1053,0,0,0,0 +958f363ca70a092fbf636bc198a27a7f3511415e,2020-09-22T12:59:25+03:00,0,0,1053,0,0,0,0 +208f4553dc15c237df9dac00b8e115107d030263,2020-09-15T09:53:30+03:00,0,0,1041,0,0,0,0 +63f9a8c0345c0c276bb8d602d7afa740f4c09f95,2020-09-09T18:47:23+03:00,0,0,1041,0,0,0,0 +9e17ed451f30f88249a5236854974242bfa0bad1,2020-08-24T15:52:43+05:00,0,0,1041,0,0,0,0 +587d6edb6a999580d921d7feb4bb4b6fb27af7a2,2020-08-08T21:39:06+03:00,0,0,1038,0,0,0,0 +ab4aadffa7858deffadfc037d0c586ed61971d27,2020-08-08T16:02:42+03:00,0,0,1038,0,0,0,0 +44f15a73a342acc4f5a336d4afdaad55948f9969,2020-07-29T17:42:24+03:00,0,0,1038,0,0,0,0 +4fe9afc57b5e22537ddcef251a0ca12a7f7b4a55,2020-07-28T18:44:45+03:00,0,0,1038,0,0,0,0 +9c6ae2446ba4c62f94dc462d7cfca367e29a80a2,2020-07-28T18:43:54+03:00,0,0,1038,0,0,0,0 +835a98d398908cfc06594123bda22930bd496a5e,2020-07-26T15:49:48+03:00,0,0,1038,0,0,0,0 +45d65fa04392cebd6abc7f55319b46e11e097ed1,2020-07-26T15:48:34+03:00,0,0,1038,0,0,0,0 +983827586e37e8b7555e3079f85b2cc3317febca,2020-07-24T07:13:57+03:00,0,0,1038,0,0,0,0 +ba8b16fb05cd2a6382cbe64538562e69e54bfea8,2020-07-18T12:31:08+03:00,0,0,1038,0,0,0,0 +0212d5380e83d0d909a1beafede68382a48692a3,2020-07-18T12:24:30+03:00,0,0,1038,0,0,0,0 +f8e1ccfd17cc3a19ff8fcb9bc2a931bdd3cc4d2a,2020-07-16T18:49:21+03:00,0,0,1038,0,0,0,0 +281373a5f2a940dfe9dd088ab39ab9165c82b11f,2020-07-15T09:28:26+03:00,0,0,1038,0,0,0,0 +634ea50e9215d5eb5bb96a0a371897810de4bc9a,2020-07-15T09:21:35+03:00,0,0,1038,0,0,0,0 +19dbd1e74019486d7e6d01aa62a36fc34b9a5fb6,2020-07-15T09:20:53+03:00,0,0,1038,0,0,0,0 +2f67e73efaabe1f3f251d65e0ac0b3e123717d16,2020-06-09T21:39:27+03:00,0,0,1039,0,0,0,0 +6118624a167f6f554a1d87370583be5a2e9c8b20,2020-05-27T16:03:08+03:00,0,0,1013,0,0,0,0 +57d54e38d0a7536a0869e6a0942788963ee4ffee,2020-05-27T16:02:59+03:00,0,0,1013,0,0,0,0 +ffbb49576dc31133fad21a3ab3a57ff7723bfeaa,2020-05-22T14:26:14+03:00,0,0,1011,0,0,0,0 +c03481f21e52a2a165cbd16d53dc8a151e45c814,2020-05-19T21:39:54+03:00,0,0,1011,0,0,0,0 +d7418bdcbcde041b6461d54563ec0114ad48ae26,2020-05-19T21:39:51+03:00,0,0,1011,0,0,0,0 +1ce7bb3b7faf0f6abaeb22f74939b15f404035da,2020-05-13T19:00:35+03:00,0,0,1011,0,0,0,0 +25355ce8eeec1703e6c6e5c77c86c99b9d70d399,2020-05-13T18:05:05+03:00,0,0,1011,0,0,0,0 +a676fb74a9ddec73a6eed0c943adff22d82f86e9,2020-05-11T18:46:57+03:00,0,0,1009,0,0,0,0 +dba4c7051df1deb6bd3ce388fca91e18564c9f0e,2020-05-08T21:02:58+03:00,0,0,995,0,0,0,0 +35bc4fcd993f2abb906e4c126b46e6f6d4f495b8,2020-05-08T07:56:42+03:00,0,0,995,0,0,0,0 +db54f66d8c8323b63448a6bcac24c694b407a500,2020-04-27T18:18:10+03:00,0,0,995,0,0,0,0 +5051d4a9a93d6c53d08176e32de23ded500685e9,2020-04-11T19:58:49+03:00,0,0,968,0,0,0,0 +9c0374e0a3e26c21a4b94f58d0fce6ab748a1901,2020-04-08T20:35:04+03:00,0,0,968,0,0,0,0 +478e9d9bc505594ff39ad86dae80faba49639138,2020-04-07T08:52:31+03:00,0,0,967,0,0,0,0 +9b14b0bf4c4c2688d9bf0c8f507c2876c3e8c0fa,2020-03-27T08:25:41+03:00,0,0,894,0,0,0,0 +569544c81b9e1dffda20f6f6c3ccb8d8cd8183d8,2020-03-17T22:55:11+03:00,0,0,889,0,0,0,0 +068f6138b4d59258e854a889a51cb867b0fbef99,2020-03-15T21:44:00+03:00,0,0,889,0,0,0,0 +76e3b3f25f8cac86e5d16939535343979e600b93,2020-03-10T08:57:45+03:00,0,0,857,0,0,0,0 +e9585c86349037ed4a6abf3746b116662dc48ee4,2020-03-05T11:44:08+03:00,0,0,847,0,0,0,0 +cb059221310544f7931d0b08b5b22ae2acc9078e,2020-02-28T13:14:46+03:00,0,0,841,0,0,0,0 +2a78620d5dbdeac8928c70e46578900c8fae0350,2020-02-25T08:16:46+03:00,0,0,841,0,0,0,0 +ff00cc966fba6ada8402fc4d52544f064e8eb17d,2020-02-21T07:04:13+03:00,0,0,785,0,0,0,0 +367d7abd8bcfae477f70fd00bf6ba48bbce53d0b,2020-02-21T06:56:30+03:00,0,0,785,0,0,0,0 +25421d1454145e17b7e8196666f2f6e1af1f1e9f,2020-02-17T18:06:08+03:00,0,0,748,0,0,0,0 +39afeb939ef92a250823c8a0f60fc3c04db86d9f,2020-02-12T19:49:56+03:00,0,0,748,0,0,0,0 +6f181eb0e4ad99e4012340cd253c98734e7b6e87,2020-02-08T15:19:10+03:00,0,0,748,0,0,0,0 +bf887b0b4daa447cf80a155377345c39ff1645b1,2020-02-07T06:37:12+03:00,0,0,723,0,0,0,0 +ca75876e1c40d5ad47640d123b88c3ea02dfbd94,2020-02-06T10:25:39+03:00,0,0,717,0,0,0,0 +a620c11a68e9bc06d1d281e852b85d4124a58e5b,2020-02-04T22:05:24+03:00,0,0,717,0,0,0,0 +ef158ec872a6977b5b0d5443f41586aa8d639e07,2020-01-28T07:07:38+03:00,0,0,691,0,0,0,0 +040f24f12b6cdbfdd4f1fac431abc476de20b02c,2020-01-22T21:36:35+03:00,0,0,684,0,0,0,0 +c064a71918d3e17b26df80789da61e76507b83d2,2020-01-20T09:00:19+03:00,0,0,668,0,0,0,0 +97657355749ec681d2fcf41f422e077b69c1dc45,2020-01-15T17:53:26+03:00,0,0,644,0,0,0,0 +8d845533bccacf2e1a4bd9dc6052de8876935c96,2020-01-12T13:42:41+03:00,0,0,566,0,0,0,0 +36912a33427e29d480d6073e281b77bbffa50fa1,2020-01-05T13:20:36+03:00,0,0,484,0,0,0,0 +dd078552597b827c1ced12379bfdde5222654605,2019-12-31T16:56:49+03:00,0,0,418,0,0,0,0 +117176319fc584fd132865740b6d413c40f25edb,2019-12-25T07:53:39+03:00,0,0,411,0,0,0,0 +c17914fa4ffeb96cceaa59fed93f711f41869cc2,2019-11-30T13:34:57+03:00,0,0,398,0,0,0,0 +91983f536b450061c3b8931806dd1727364a4747,2019-11-21T08:25:37+03:00,0,0,388,0,0,0,0 +c217e480bfb2328d2ecb5d7bb822b002af6c4ff4,2019-11-21T08:25:19+03:00,0,0,388,0,0,0,0 +315e167fbd494bc1cc49b5e13410f67a5314de7f,2019-10-21T10:18:03+03:00,0,0,379,0,0,0,0 +87211c3e501388adf3e880154fc6d0fe30c1f02c,2019-10-21T08:31:34+03:00,0,0,379,0,0,0,0 +bfa5fb959a5ef7b5b8f362992414ff5e0380433d,2019-10-18T20:40:03+03:00,0,0,377,0,0,0,0 +26dc6f9f72a9ac76c4454146d4404c7ad018d1cb,2019-10-18T16:57:21+03:00,0,0,377,0,0,0,0 +f7ec83d186fc546c424c87b6b3394a2b5d6a6059,2019-10-16T22:06:02+03:00,0,0,377,0,0,0,0 +1e2550f7381f2506987f5e71380c43d28575bdfc,2019-10-14T10:48:32+03:00,0,0,377,0,0,0,0 +273b90172e8f451fcaa561bcdf682b287e4ee04b,2019-10-09T22:00:03+03:00,0,0,376,0,0,0,0 +474903d04ea3b7acc5d3c55f3b5d3283320ff4bb,2019-10-04T08:55:27+03:00,0,0,368,0,0,0,0 +2b82da4a18274de3ba82c99137083999b1df7e7a,2019-09-28T17:33:16+03:00,0,0,364,0,0,0,0 +ecc70effda3f7680864e5abc0ec9334c56288bb8,2019-09-18T20:18:25+03:00,0,0,354,0,0,0,0 +bd170af28494bcc3100fb9a98c2edbf5c9e4dcb3,2019-09-11T22:13:34+03:00,0,0,350,0,0,0,0 +4e13110bd4ee9007950a119c387cee53165209e7,2019-09-10T12:32:11+03:00,0,0,316,0,0,0,0 +69e6c77f0b382da16c2f704dee9f5c26a1033543,2019-06-21T20:19:08+03:00,0,0,304,0,0,0,0 +15f77e6947d4e6dc4a2c4eacc424436629e70535,2019-06-01T11:59:02+03:00,0,0,288,0,0,0,0 +b885ed7594f8f4e30e3396add6a9e5bb221cbe90,2019-05-23T18:12:27+03:00,0,0,264,0,0,0,0 +b866f7de55fb8e6383d4e7fc5446b73db08a0af5,2019-05-20T22:30:19+03:00,0,0,247,0,0,0,0 +e80709e371b9586a7cc104c908111f8c43b8cc6e,2019-05-20T10:31:15+03:00,0,0,229,0,0,0,0 +5587b1deb21e8b010f1e08ed7c54925e87b7ab7b,2019-05-20T10:30:51+03:00,0,0,229,0,0,0,0 +83450733e407d9d3988851086cc6a966b2e58302,2019-05-19T13:13:36+03:00,0,0,227,0,0,0,0 +5d3c243cbaef7e178f31d00b7d503aca2297af16,2019-05-18T23:38:16+03:00,0,0,227,0,0,0,0 +02e74e52f04758d0fbcca1531a45939bce2bc397,2019-05-17T14:25:10+03:00,0,0,218,0,0,0,0 +463db6e22059078ebbb42fcc4b8a2ac8815d42e2,2019-05-13T13:48:16+03:00,0,0,217,0,0,0,0 +e4a1a9e40a9eb00dc867d900f91cede36e415c38,2019-05-10T15:35:36+03:00,0,0,217,0,0,0,0 +c9727bf397a3941cdc98fc4e15f69dccbc29fc01,2019-05-08T21:07:58+03:00,0,0,203,0,0,0,0 +0b9731f31c6fb41921fd4bc0b89438dc509cbec4,2019-05-08T14:38:49+03:00,0,0,197,0,0,0,0 +18bd6fdf9d41ee5b56c4ae78c124c3d1fd5d87aa,2019-05-06T00:02:57+03:00,0,0,159,0,0,0,0 +2ed4d3a8ef86ef61b300412e28eb899635f657f3,2019-04-30T22:21:22+03:00,0,0,159,0,0,0,0 +0efdea9c6dcfbebafdd2c0477df04ca20fc27fb8,2019-04-22T13:39:06+03:00,0,0,145,0,0,0,0 +1a861308ba62c0ed7151de2ef177e9c4be9159f7,2019-04-22T11:51:31+03:00,0,0,145,0,0,0,0 +9c07ef14b5494720b850b4bd060d1deb088a95f6,2019-04-20T14:12:01+03:00,0,0,137,0,0,0,0 +6f0c52b7dbd8108638eeb7adc47736e1ed5d7649,2019-04-20T14:07:42+03:00,0,0,135,0,0,0,0 +5ce2dcd9fa929d3732230eac379073182eb56507,2019-04-18T18:24:31+03:00,0,0,134,0,0,0,0 +4bee614548d574c27202d7ed03895317e73df765,2019-04-17T23:07:21+03:00,0,0,132,0,0,0,0 +bed50d44db96ce0784539f4e7cd35c755e19bde8,2019-04-14T14:02:12+03:00,0,0,104,0,0,0,0 +aa45f576d4c2fbbb878af041495f7ee72781f49f,2019-04-12T23:42:06+03:00,0,0,99,0,0,0,0 +4d7fa920a40fdf3064fc71d16830cd6a4de046c4,2019-04-12T18:24:23+03:00,0,0,91,0,0,0,0 +1ff1714599ddf2c41e0ab75562be495e55bb35e2,2019-04-09T12:47:05+03:00,0,0,91,0,0,0,0 +f396584f72311246c3b52ed68d778745df5aea90,2019-04-03T10:36:35+03:00,0,0,91,0,0,0,0 +fa57d73f3597407223ff205439cfe84f338ec3bc,2019-04-02T17:52:05+03:00,0,0,91,0,0,0,0 +e4cc35e62e20104fec2dcdc1220de7ab1980cc3f,2019-03-31T20:06:29+03:00,0,0,62,0,0,0,0 +5044283019dc34c95d2836485ed492b34f49230e,2019-03-31T13:52:50+03:00,0,0,62,0,0,0,0 diff --git a/static/js/2023-04-14-emacs.js b/static/js/2023-04-14-emacs.js index d357071..92f74f7 100644 --- a/static/js/2023-04-14-emacs.js +++ b/static/js/2023-04-14-emacs.js @@ -290,8 +290,8 @@ function emacsChart() { text: "Everything goes into Emacs", color: "black", font: { - size: 15 - } + size: 15, + }, }, datalabels: { formatter: function (value, context) { @@ -321,10 +321,299 @@ function emacsChart() { }); } +async function emacsTimeChart() { + const response = await fetch( + "/data/2023-03-14-emacs/emacs-related-time-per-month.json" + ); + const rawData = await response.json(); + const labels = [ + ["config_hours", "Config", "#A989C5"], + ["package_hours", "Emacs Packages", "#7172AD"], + ["orgmode_hours", "Org Mode", "#509EE3"], + ["sqrt_hours", "sqrtminusone.xyz", "#51528D"], + ["other_code_hours", "Other Code", "#F2A86F"], + ["misc_hours", "Misc", "#F9D45C"], + ]; + const data = { + labels: rawData.map((d) => new Date(d["period"])), + datasets: labels.map(([key, label, color]) => ({ + label, + data: rawData.map((d) => ({ + period: new Date(d["period"]), + value: d[key], + })), + backgroundColor: color, + })), + }; + + const ctx = document.getElementById("chart-emacs-time"); + new Chart(ctx, { + type: "bar", + data, + options: { + parsing: { + xAxisKey: "period", + yAxisKey: "value", + }, + scales: { + x: { + type: "time", + min: data.labels[0], + stacked: true, + }, + y: { + stacked: true, + title: { + display: true, + text: "Hours", + }, + }, + }, + plugins: { + title: { + display: true, + text: "Emacs-related time per month", + color: "black", + font: { + size: 15, + }, + }, + }, + }, + }); + + const rawStackedData = rawData.map((d) => { + let sum = 0; + for (const [key] of labels) { + sum += d[key]; + } + for (const [key] of labels) { + d[key] /= sum; + } + return d; + }); + const stackedData = { + labels: rawData.map((d) => new Date(d["period"])), + datasets: labels.map(([key, label, color]) => ({ + label, + data: rawStackedData.map((d) => ({ + period: new Date(d["period"]), + value: d[key], + })), + backgroundColor: color, + })), + }; + + const stackedCtx = document.getElementById("chart-emacs-time-stacked"); + new Chart(stackedCtx, { + type: "bar", + data: stackedData, + options: { + parsing: { + xAxisKey: "period", + yAxisKey: "value", + }, + scales: { + x: { + type: "time", + min: data.labels[0], + stacked: true, + }, + y: { + stacked: true, + min: 0, + max: 1, + title: { + display: true, + text: "Hours (%)", + }, + }, + }, + plugins: { + title: { + display: true, + text: "Emacs-related time per month (stacked)", + color: "black", + font: { + size: 15, + }, + }, + }, + }, + }); +} + +async function configsChart() { + const response = await fetch("/data/2023-03-14-emacs/lengths.csv"); + const csv = await response.text(); + const lines = csv.split("\n"); + const labels = lines[0].split(","); + const rawData = lines + .slice(1) + .reverse() + .map((line) => { + const values = line.split(","); + return Object.fromEntries( + values.map((value, i) => { + const key = labels[i]; + switch (key) { + case "date": + value = new Date(value); + break; + case "commit": + break; + default: + value = Number(value); + break; + } + return [key, value]; + }) + ); + }); + const data = { + labels: rawData.map((d) => d.date), + datasets: [ + { + label: "Emacs.org", + data: rawData.map((d) => ({ + x: d.date, + y: d["Emacs.org"], + })), + }, + { + label: "init.el", + data: rawData.map((d) => ({ + x: d.date, + y: d["init.el"], + })), + }, + ], + }; + const ctx = document.getElementById("chart-emacs-config-size"); + new Chart(ctx, { + type: "line", + data, + options: { + pointRadius: 0, + tension: 0.1, + parsing: { + xAxisKey: "x", + yAxisKey: "y", + }, + scales: { + x: { + type: "time", + min: new Date("2020-10-01"), + }, + y: { + title: { + display: true, + text: "Lines of code", + }, + }, + }, + plugins: { + title: { + display: true, + text: "Emacs.org and init.el lengths", + color: "black", + font: { + size: 15, + }, + }, + }, + }, + }); + + const emacsVimData = { + datasets: [ + { + label: "Emacs.org", + data: rawData.map((d) => ({ + x: d.date, + y: d["Emacs.org"], + })), + xAxisID: "xAxis1", + }, + { + label: "init.el", + data: rawData.map((d) => ({ + x: d.date, + y: d["init.el"], + })), + xAxisID: "xAxis1", + }, + { + label: "init.vim", + data: rawData.map((d) => ({ + x: d.date, + y: d["init.vim"], + })), + xAxisID: "xAxis2", + }, + ], + }; + const ctxEmacsVim = document.getElementById("chart-emacs-vim-config-size"); + new Chart(ctxEmacsVim, { + type: "line", + data: emacsVimData, + options: { + pointRadius: 0, + tension: 0.1, + parsing: { + xAxisKey: "x", + yAxisKey: "y", + }, + scales: { + xAxis1: { + type: "time", + min: new Date("2020-10-12"), + max: new Date( + new Date("2020-10-12").getTime() + 450 * (1000 * 60 * 60 * 24) + ), + display: false, + }, + xAxis2: { + type: "time", + min: new Date("2019-03-30"), + max: new Date( + new Date("2019-03-30").getTime() + 450 * (1000 * 60 * 60 * 24) + ), + title: { + display: true, + text: "Days into", + }, + ticks: { + display: false, + }, + }, + y: { + title: { + display: true, + text: "Lines of code", + }, + }, + }, + plugins: { + title: { + display: true, + text: "Emacs vs. Vim config size", + color: "black", + font: { + size: 15, + }, + }, + }, + }, + }); +} + document.addEventListener( "DOMContentLoaded", function () { emacsChart(); + emacsTimeChart(); + configsChart(); }, false ); From b8a68761ddb4a861132dbe13d84220b97383940d Mon Sep 17 00:00:00 2001 From: SqrtMinusOne Date: Wed, 5 Apr 2023 17:06:11 +0300 Subject: [PATCH 05/11] feat(emacs): update csv --- static/data/2023-03-14-emacs/lengths.csv | 108 +++++++++++++++++++++++ static/js/2023-04-14-emacs.js | 1 + 2 files changed, 109 insertions(+) diff --git a/static/data/2023-03-14-emacs/lengths.csv b/static/data/2023-03-14-emacs/lengths.csv index b6dea44..da2fd24 100644 --- a/static/data/2023-03-14-emacs/lengths.csv +++ b/static/data/2023-03-14-emacs/lengths.csv @@ -1,4 +1,112 @@ commit,date,Emacs.org,init.el,init.vim,Desktop.org,Console.org,Mail.org,Guix.org +19911d3c96fda1f2eb0d6b0b9ca863498eebae7f,2023-04-03T11:30:26+03:00,8867,6235,1053,3747,1018,616,726 +516f7b0ffde496e5b6f073fde840f048132993ea,2023-04-03T11:28:32+03:00,8867,6235,1053,3747,1018,616,726 +d7f69b10715ddc43a38c3c9e84804dfd25f62cd2,2023-04-03T11:28:01+03:00,8867,6235,1053,3747,1018,616,726 +2a69f52ca0979437f5f8872a180c4fc5fa46257c,2023-03-20T13:29:04+03:00,8866,6234,1053,3747,1018,616,726 +cd7e9934a7f2e4b8cf3633a4c546ede9d7ac0ef4,2023-03-15T17:38:28+03:00,8866,6234,1053,3747,1018,616,726 +89d9a729e091c8bffadce98ddd598cbde7af0cbc,2023-03-14T12:34:56+03:00,8866,6234,1053,3747,1018,616,726 +9b52defcc8df025f6f80b59ce7bbd5018b5019af,2023-03-14T12:31:41+03:00,8866,6234,1053,3747,1018,616,726 +aefff14a6a25b2afcce3048e3ded8fc309b00423,2023-03-14T12:31:28+03:00,8866,6234,1053,3747,1018,616,726 +128c7d8020e52b22acd9d97ef7e661c3583bb1a4,2023-03-14T12:31:06+03:00,8866,6234,1053,3747,1018,616,726 +c8b995d6db6c83e326f13f908a11ad27a2f05e81,2023-03-07T23:06:01+03:00,8855,6227,1053,3747,1018,616,726 +5e0d3dc8e28cb8cecf1aec536e1c2fb867efc986,2023-03-01T22:16:33+03:00,8856,6227,1053,3747,1018,616,726 +a346ca31760f7367d41b2b6054a2b4142adb1cd6,2023-03-01T18:18:37+03:00,8835,6211,1053,3747,1018,616,726 +8017eea0ca1e9d4e9ec4da0175625370b25ea5cb,2023-03-01T18:18:16+03:00,8835,6211,1053,3747,1017,616,726 +f1780832f0f2065324fad65e242815e7f0c1b5b1,2023-03-01T18:17:57+03:00,8835,6211,1053,3743,1017,616,726 +018c35dba99112e8e444fda9408ca80e32e85104,2023-03-01T11:06:42+03:00,8831,6207,1053,3743,1017,616,726 +8a82a52ed017516c00a1d6753cea989253ae78e1,2023-02-22T18:54:45+03:00,8831,6207,1053,3741,1017,616,726 +ce2b447f15e7f1d790870abccc787cbbe3ce9115,2023-02-20T15:12:44+03:00,8814,6196,1053,3741,1017,616,726 +3adca25f883641cc7d43a7e8b8774fb6316aa399,2023-02-19T23:58:25+03:00,8813,6196,1053,3741,1017,616,726 +978e5f682676d2546506f9b26a8d3f1198f4f91a,2023-02-19T23:57:30+03:00,8813,6196,1053,3740,1017,616,726 +9831d1909245c818551660d1df6ed2e572445c3f,2023-02-18T17:33:37+03:00,8788,6178,1053,3740,1017,616,726 +6bbf74279c1e4f8c246bedb737318f02ddde75bd,2023-02-18T17:33:11+03:00,8788,6178,1053,3740,1017,616,726 +bd718b254d9bfb0d14c4f408350087eb220cf5d6,2023-02-17T21:07:13+03:00,8670,6087,1053,3740,1017,616,726 +739d92c5ed11d011852f9e2c18e45393d266c92e,2023-02-17T20:45:32+03:00,8670,6087,1053,3767,1017,616,726 +5056dceda84def0c791601f3d32196c7065ec466,2023-02-14T23:52:48+03:00,8657,6076,1053,3740,1017,616,726 +5ec42f4356a34f8577adfab5645f6a7181acd103,2023-02-13T18:38:57+03:00,8657,6076,1053,3740,1014,616,726 +45cc0e249d450a228211919c288ceca6a40dfd40,2023-02-13T18:30:50+03:00,8657,6076,1053,3740,1014,616,726 +868e94ef20694e583c9fad77d896ad371dc33bf6,2023-02-13T18:30:33+03:00,8657,6076,1053,3740,1014,616,726 +d2620549b86ce8beaeba45a88296946853183ae7,2023-02-12T23:37:13+03:00,8636,6061,1053,3740,1014,616,726 +41464749cfcdd17640b1ca8272cae373abf966c3,2023-02-08T23:54:00+03:00,8526,5998,1053,3740,1014,616,726 +5fe019fbd5cc653c73bb8702bcb59135350367df,2023-02-08T23:52:16+03:00,8509,5985,1053,3728,1009,616,726 +a1b77e233021fe22c6fcf1c2bc33da13586fe0c3,2023-02-08T13:08:16+03:00,8526,5998,1053,3740,1014,616,726 +b96a7f62fb09f662336676cbcb40430ea91ac95f,2023-02-08T13:02:35+03:00,8526,5998,1053,3740,1009,616,726 +8b954419fe17d0a32093d7b1b72eefbb555a5e68,2023-02-08T13:02:26+03:00,8526,5998,1053,3728,1009,616,726 +87626e053967305056f0d9c4463ababe63282368,2023-01-30T22:50:09+03:00,8509,5985,1053,3728,1009,616,726 +49398d4cb8f216858b0d0ce9c000ba2e8affd24f,2023-01-30T01:37:41+03:00,8509,5985,1053,3728,1002,616,726 +e966318c57215f6678eefbe1807520d98def61d7,2023-01-30T01:09:21+03:00,8488,5968,1053,3728,1002,616,726 +2b11ae1f67b2e7c1ef3e64f4076e45ac9b8095c2,2023-01-30T01:07:51+03:00,8388,5897,1053,3728,1001,616,726 +8516c33edccf7e60942344459f5842d9a6885b10,2023-01-27T13:52:21+03:00,8475,5958,1053,3728,1002,616,726 +be08c8b2b6f5dd021567d65a390746d6abbe5b33,2023-01-27T13:49:36+03:00,8474,5957,1053,3728,1002,616,726 +1b6951cf398a9ac04f5a8839d5a9fb2d7ad5d8d1,2023-01-27T13:48:45+03:00,8474,5957,1053,3728,1002,616,726 +2136be197ff9a9235cca896d8aa13423dd75b049,2023-01-25T17:30:47+03:00,8474,5957,1053,3728,1002,616,726 +c1532698cdb86c982a17e50b784af20b3205fbe9,2023-01-24T23:33:42+03:00,8474,5957,1053,3728,1001,616,726 +f5255ccecb0519a2dd21dd51c3a44e00f8eeddfe,2023-01-24T11:46:06+03:00,8375,5885,1053,3728,1001,616,726 +c8ba987151e70c01f4821b7a79da5f0bd1c88c35,2023-01-24T08:13:45+00:00,8375,5885,1053,3728,1001,616,726 +b2536657d2aba6975e286dd7a719ebe34683d11e,2023-01-21T23:53:09+03:00,8375,5885,1053,3728,1001,616,726 +44142f3c4b7a9f21d9281de00125f35ab382a512,2023-01-14T23:39:28+03:00,8353,5878,1053,3728,1001,616,726 +2cc69241abe26f090418006c10b906ddf53f8887,2023-01-14T23:39:21+03:00,8353,5878,1053,3728,1001,616,726 +0c6c2e6acfa4707426429c0dbe887ad57c1e2c4e,2023-01-14T23:39:07+03:00,8353,5878,1053,3728,1001,616,726 +86798c2875c81c6f89196efbd3dc77b781d62236,2023-01-08T23:52:07+03:00,8327,5856,1053,3728,1001,616,726 +2009a87910aa21337afeee73dd0e36190b8b7d6a,2023-01-07T23:13:43+03:00,8304,5840,1053,3728,1001,616,726 +eb20f672ebb17a1619a96108b2f6c5ab9b448968,2023-01-05T00:03:39+03:00,8146,5716,1053,3728,1001,616,726 +3f5967a5f63928ea9c8567d8d9f31e84cdbbc21f,2023-01-03T18:31:37+03:00,8142,5715,1053,3728,1001,616,726 +66c1734309a4c0b1655b99e24f79ac94cbaadee0,2023-01-02T12:05:25+03:00,8037,5688,1053,3728,1001,616,726 +33bac98368bf7f78482b843722bb6fa26dcd006a,2023-01-02T12:01:39+03:00,8037,5688,1053,3728,1001,616,726 +e7391ff0888d21b0f485bd1498ae37fd41a7349e,2023-01-02T12:01:25+03:00,8027,5683,1053,3728,1001,616,726 +1e5a588ef5c4e71466a3c09e1061c329eb4bc441,2022-12-27T10:25:02+03:00,8027,5683,1053,3728,1040,616,726 +fc68c8d0eb8ce9455a8fb12358d83515d073e82c,2022-12-27T10:24:40+03:00,7857,5538,1053,3728,1040,616,726 +33ecd0197e0ebbeb996ad0c98ee231d2cc770248,2022-12-03T23:35:48+03:00,7857,5538,1053,3728,1040,616,726 +d0be119ad6b38bf30dd313ece7de474d0c0af3a3,2022-12-03T23:35:27+03:00,7827,5513,1053,3728,1040,616,726 +f5e612afe9fdcd999e07cc9c479e7db4ee68385a,2022-12-02T15:26:27+03:00,7827,5513,1053,3730,1040,616,726 +d9cc1e6690ceb3ad5612233f7d1f8f6991631e6b,2022-12-02T15:21:55+03:00,7827,5513,1053,3730,1040,616,726 +e9e3899c9ecf07ed57dcc87cc8889ff6d0193527,2022-12-02T15:21:40+03:00,7827,5513,1053,3730,1040,616,726 +a05697a4236674aab9f1df3612ce08862a9a2687,2022-11-15T22:46:44+03:00,7827,5513,1053,3745,1040,616,726 +12ea14e42b0e938d6ae9644eb4e0a21e264115f5,2022-10-28T09:45:20+03:00,7720,5429,1053,3745,1040,616,726 +bf70b39efea5e957690e5d2cde668ddbe353db28,2022-10-28T09:44:59+03:00,7720,5429,1053,3745,1040,633,726 +d093e755fd97a88157d10f4df7353a1729071ee5,2022-10-22T13:29:27+03:00,7720,5429,1053,3745,1040,633,726 +cf592a86e2e4d034e2d966116683dca98bf796d7,2022-10-13T23:00:11+03:00,7720,5429,1053,3745,1040,633,726 +e855da1a9f7a8148a2a4fc880b4157c1f10f005e,2022-10-13T22:51:59+03:00,7699,5413,1053,3745,1040,633,726 +dee410617f609530771f94f6f42c429b00ef4a98,2022-09-23T16:32:30+03:00,7699,5413,1053,3744,1040,633,726 +1d3e2940b419f96ac1957647387154132071962e,2022-09-18T18:33:36+03:00,7678,5399,1053,3744,1040,633,726 +ca3b1781eb70346e0e253ca72fb40d68e34e4e30,2022-09-15T12:44:33+03:00,7599,5394,1053,3744,1040,633,726 +56b2711f52b201497582b1d884f63567d96b500f,2022-09-15T12:43:53+03:00,7599,5394,1053,3744,1040,633,726 +44cf90eb363e4c8b2649800272d31321e1c20938,2022-09-15T12:43:32+03:00,7599,5394,1053,3744,1040,633,726 +7c0e26d42c4385bd4e967d02f72dd0e2438a2ad8,2022-09-15T12:43:02+03:00,7559,5360,1053,3744,1040,633,726 +71c78397bb3b2fb479ff214348bc9a226aae5a1d,2022-09-03T12:49:12+03:00,7559,5360,1053,3743,1040,633,726 +86ed4185e13a4b1f95321e431b8e4fe27f34174e,2022-08-31T21:07:19+03:00,7493,5316,1053,3743,1040,625,726 +4c52cf6e80c3b540a778c601d128bef8e659309b,2022-08-31T16:22:43+03:00,7493,5316,1053,3743,1040,625,723 +804e6c2932477169a6374661d614e2424e55479e,2022-08-28T18:38:43+03:00,7489,5312,1053,3743,1040,625,723 +07cc13ad5c098e9ba3a9b1a0f5f63dbcb498e667,2022-08-19T10:08:00+05:00,7385,5228,1053,3743,1040,625,723 +46904ca73bec195a5a845e1433973e94abd42175,2022-08-19T10:04:54+05:00,7385,5228,1053,3743,1040,625,723 +749c354ef369e6376dfd4f76108426f5daf964ac,2022-08-19T10:04:38+05:00,7386,5229,1053,3743,1040,625,723 +182d01ace4468f53c8014ddd602946bd220721d9,2022-08-15T19:01:17+05:00,7386,5229,1053,3743,1040,625,723 +7f69c7851ee48f9ceede4d0d68c69bd1d0c9500e,2022-08-15T19:00:37+05:00,7386,5229,1053,3743,1040,625,723 +b5a3ed89e30e9f3dbfe8648a7f1cc06239f3d79e,2022-08-15T19:00:03+05:00,7386,5229,1053,3743,1035,625,723 +3a9eaa14421993917cd45758ed41f246c31f31df,2022-08-15T18:59:26+05:00,7308,5171,1053,3743,1035,625,723 +22762966dca788e0b88092cb52eb644b6d4fb237,2022-08-03T20:24:05+03:00,7308,5171,1053,3743,1035,625,723 +fbe878c3121ac4d3ab796b066cdb88a7050d08c7,2022-08-03T14:45:30+03:00,7308,5171,1053,3743,1035,625,723 +973be91ef9efec381e374fc0d38a577d5ee63ba6,2022-08-03T14:45:16+03:00,7308,5171,1053,3743,1025,625,723 +e2717a0ca8b3501ddd007003b34aad3784181e14,2022-07-28T23:20:51+03:00,7308,5171,1053,3741,1025,625,722 +ed580177698f2e65656335fafe33c1c0e5812341,2022-07-25T23:34:39+03:00,7291,5158,1053,3741,1025,625,722 +1af534fcd24c14cbe65d22301cb85821008210eb,2022-07-25T23:34:24+03:00,7291,5158,1053,3741,1025,625,722 +194aadcd1da9a68fb3e1aed4eb40a4f6218efacc,2022-07-25T00:15:53+03:00,7287,5154,1053,3741,1025,625,722 +36eccc1af1c85a01511d239f03626ea8be86e2dd,2022-07-24T23:30:41+03:00,7271,5138,1053,3741,1025,625,722 +ae469d99c9c172e1eedb6868abe936e404ee9db8,2022-07-24T23:30:23+03:00,7239,5113,1053,3741,1025,625,722 +7954f46715baf611f9bcf90586edee83e0dfa4f1,2022-07-24T20:53:41+03:00,7239,5113,1053,3626,1025,625,722 +bd688bdc866d3bba3bd6672e091746127ca54734,2022-07-24T19:36:39+03:00,7484,5113,1053,3760,1062,648,753 +4c97ef1a9c8c31d225bcee1ec49b5184c1936c53,2022-07-20T22:36:10+03:00,7469,5103,1053,3760,1062,648,753 +ce79da5b3f20539c4e29ed375c99ec4c0965cc39,2022-07-20T16:19:01+03:00,7462,5130,1053,3760,1062,648,753 +777c37245b62c326edee3ff60f7defd980c54b14,2022-07-14T23:01:01+03:00,7422,5120,1053,3760,1062,648,753 +23cb747ae8b560adfd416bc22a12aa025b6a6b34,2022-07-11T12:56:33+03:00,7386,5076,1053,3760,1062,648,753 +82ab1fa96e98e2e2331f954454262f702f7fb96e,2022-07-09T23:12:54+03:00,7386,5076,1053,3759,1062,648,753 +977c0c2be111287d056937827d569b5cbbcf77f0,2022-07-09T23:12:07+03:00,7386,5076,1053,3755,1062,648,753 +ae66dcacc14c9ca018cbe26a46b6546dfb55b906,2022-07-09T23:11:37+03:00,7372,5096,1053,3755,1062,648,753 +460e6a8d32b845fbebd51d0f07485ec349083abd,2022-07-02T14:56:16+03:00,7372,5096,1053,3755,1060,648,753 +7de55fa15f09b8e5229fc54471dcfcb642a8ff93,2022-06-26T22:03:18+03:00,7372,5096,1053,3755,1060,570,753 +f12737bb44edafecec2b79b8d9a70d5ed1a1ff99,2022-06-26T21:53:26+03:00,7372,5096,1053,3755,1060,570,753 +fbca334a3585ef6a1d595402ed708917a785789d,2022-06-26T21:53:11+03:00,7372,5096,1053,3756,1062,572,753 +3d1df15f9adf7d9ed734c2cd3664e3dd6c3e989c,2022-06-26T21:52:54+03:00,7372,5096,1053,3756,1062,572,755 17d6192394e6321e80fde5417954f84256fb6f57,2022-06-17T23:36:47+03:00,7396,5092,1053,3756,1062,572,755 0b1d5457a6a942d8b2f1c20400d09d4ffd0cfb81,2022-06-17T23:36:29+03:00,7396,5092,1053,3756,1062,572,755 ca3ee40b6eb65e49f140c890853ef6e885aa210b,2022-06-09T22:26:56+03:00,7401,5097,1053,3756,1062,572,755 diff --git a/static/js/2023-04-14-emacs.js b/static/js/2023-04-14-emacs.js index 92f74f7..7e587c0 100644 --- a/static/js/2023-04-14-emacs.js +++ b/static/js/2023-04-14-emacs.js @@ -504,6 +504,7 @@ async function configsChart() { x: { type: "time", min: new Date("2020-10-01"), + max: TODAY, }, y: { title: { From 9518c83a0d839ae5a1e4edd9dbc17c31b62bb85b Mon Sep 17 00:00:00 2001 From: SqrtMinusOne Date: Thu, 6 Apr 2023 21:12:29 +0300 Subject: [PATCH 06/11] feat(emacs): more charts --- content/posts/2023-04-14-emacs.md | 18 +- org/2023-04-14-emacs.org | 17 ++ .../data/2023-03-14-emacs/emacs-packages.json | 78 ++++++++ .../2023-03-14-emacs/emacs-vim-switch.json | 42 +++++ static/js/2023-04-14-emacs.js | 178 +++++++++++++++++- 5 files changed, 329 insertions(+), 4 deletions(-) create mode 100644 static/data/2023-03-14-emacs/emacs-packages.json create mode 100644 static/data/2023-03-14-emacs/emacs-vim-switch.json diff --git a/content/posts/2023-04-14-emacs.md b/content/posts/2023-04-14-emacs.md index 870f8d2..ca2ba24 100644 --- a/content/posts/2023-04-14-emacs.md +++ b/content/posts/2023-04-14-emacs.md @@ -9,6 +9,18 @@ scripts = ["/js/chart.js", "/js/chartjs-adapter-date-fns.bundle.min.js", "/js/ch Hello world + +## Numbers {#numbers} + +- Total time on Config: [REDACTED] +- Total time on Packages: [REDACTED] +- % time on Config: [REDACTED] +- Hours on `org-journal-tags`: [REDACTED] +- Total time on Vim config: 39 hours + + +## Charts {#charts} + @@ -17,4 +29,8 @@ Hello world - \ No newline at end of file + + + + + diff --git a/org/2023-04-14-emacs.org b/org/2023-04-14-emacs.org index 8c0cd53..c776b68 100644 --- a/org/2023-04-14-emacs.org +++ b/org/2023-04-14-emacs.org @@ -8,6 +8,15 @@ Hello world +* Numbers +- Total time on Config: @@html:[REDACTED]@@ +- Total time on Packages: @@html:[REDACTED]@@ +- % time on Config: @@html:[REDACTED]@@ +- Hours on =org-journal-tags=: @@html:[REDACTED]@@ +- Total time on Vim config: 39 hours + +* Charts + #+begin_export html #+end_export @@ -27,3 +36,11 @@ Hello world #+begin_export html #+end_export + +#+begin_export html + +#+end_export + +#+begin_export html + +#+end_export diff --git a/static/data/2023-03-14-emacs/emacs-packages.json b/static/data/2023-03-14-emacs/emacs-packages.json new file mode 100644 index 0000000..afd1b90 --- /dev/null +++ b/static/data/2023-03-14-emacs/emacs-packages.json @@ -0,0 +1,78 @@ +[ +{"name":"org-journal-tags","hours":45.80413027777777}, +{"name":"Unknown Project","hours":30.883538055555544}, +{"name":"elfeed-summary","hours":24.781949999999995}, +{"name":"lyrics-fetcher","hours":19.423725}, +{"name":"reverso","hours":16.14068888888889}, +{"name":"pomm","hours":15.724073888888888}, +{"name":"elfeed_sync","hours":10.33835}, +{"name":"perspective-exwm","hours":7.68676111111111}, +{"name":"ivy-pass","hours":4.8407888888888895}, +{"name":"exwm-modeline","hours":4.785227777777777}, +{"name":"elfeed","hours":1.9590416666666668}, +{"name":"elfeed-recommender","hours":1.606401111111111}, +{"name":"avy-dired","hours":1.5198916666666664}, +{"name":"sqrtminusone.xyz","hours":1.4861027777777778}, +{"name":"copilot","hours":1.393622222222222}, +{"name":"SEM10_DataP","hours":1.3383138888888888}, +{"name":"org-mode","hours":1.285122222222222}, +{"name":"emms","hours":1.2402194444444448}, +{"name":"digital-trajectories-backend","hours":0.817338888888889}, +{"name":"SEM11_SD","hours":0.6001722222222221}, +{"name":"dank-mode","hours":0.5951249999999999}, +{"name":"org-roam","hours":0.5180888888888888}, +{"name":"sqrtminusone.github.io","hours":0.4424444444444445}, +{"name":"eshell-info-banner","hours":0.3441305555555555}, +{"name":"org-ref","hours":0.3417222222222222}, +{"name":"org","hours":0.33160555555555554}, +{"name":"org-contrib","hours":0.2974138888888889}, +{"name":"perspective-el","hours":0.291275}, +{"name":"wakatime-mode","hours":0.2859333333333333}, +{"name":"exwm","hours":0.2593944444444445}, +{"name":"elcord","hours":0.25727777777777777}, +{"name":"general","hours":0.2553944444444444}, +{"name":"digital-trajectories-frontend","hours":0.25507222222222226}, +{"name":"flycheck-mix-alphabets","hours":0.1779611111111111}, +{"name":"evil-collection","hours":0.17116388888888892}, +{"name":"lispy","hours":0.16847222222222222}, +{"name":"devdocs","hours":0.16563333333333333}, +{"name":"mmm-mode","hours":0.14494444444444443}, +{"name":"posframe","hours":0.13803333333333334}, +{"name":"ytel","hours":0.13270833333333334}, +{"name":"melpa","hours":0.11238055555555555}, +{"name":"tldr","hours":0.11088888888888888}, +{"name":"org-journal","hours":0.10692777777777777}, +{"name":"deft","hours":0.09949999999999999}, +{"name":"org-transclusion","hours":0.08256666666666668}, +{"name":"transient","hours":0.08187777777777777}, +{"name":"treemacs","hours":0.08161666666666667}, +{"name":"lsp-treemacs","hours":0.07749722222222223}, +{"name":"web-mode","hours":0.07611666666666667}, +{"name":"dap-mode","hours":0.070775}, +{"name":"themes","hours":0.06796666666666668}, +{"name":"Emacs-langtool","hours":0.06696388888888888}, +{"name":"projectile","hours":0.0635}, +{"name":"doom-modeline","hours":0.06344999999999999}, +{"name":"package-build","hours":0.06199444444444445}, +{"name":"emacs-which-key","hours":0.06048055555555555}, +{"name":"jest-test-mode","hours":0.05506944444444444}, +{"name":"gazprom-classes-frontend","hours":0.04866388888888889}, +{"name":"digital-schedule-backend","hours":0.04549166666666667}, +{"name":"company-mode","hours":0.04083888888888889}, +{"name":"emacs-jupyter","hours":0.03719166666666666}, +{"name":"swiper","hours":0.03139444444444444}, +{"name":"org-habit-stats","hours":0.028275}, +{"name":"SEM9_AMOS","hours":0.016411111111111112}, +{"name":"elfeed-org","hours":0.014444444444444446}, +{"name":"org-agenda-conflict","hours":0.013563888888888887}, +{"name":"org-ql","hours":0.013541666666666667}, +{"name":"test","hours":0.013236111111111112}, +{"name":"alert","hours":0.012311111111111111}, +{"name":"prodigy","hours":0.0079}, +{"name":"lsp-mode","hours":0.007405555555555556}, +{"name":"google-translate","hours":0.007016666666666668}, +{"name":"err","hours":0.005344444444444444}, +{"name":"testing","hours":0.004497222222222223}, +{"name":"dired-plus","hours":0.003427777777777778}, +{"name":"magit","hours":0.0} +] \ No newline at end of file diff --git a/static/data/2023-03-14-emacs/emacs-vim-switch.json b/static/data/2023-03-14-emacs/emacs-vim-switch.json new file mode 100644 index 0000000..cd34d8f --- /dev/null +++ b/static/data/2023-03-14-emacs/emacs-vim-switch.json @@ -0,0 +1,42 @@ +[ +{"period":"2020-10-01T00:00:00Z","misc_emacs_hours":0.0,"emacs_other_code_hours":0.0,"vim_other_code_hours":4.593828333333334,"config_hours":0.0,"orgmode_hours":0.0,"package_hours":0.0}, +{"period":"2020-10-02T00:00:00Z","misc_emacs_hours":0.0,"emacs_other_code_hours":0.0,"vim_other_code_hours":5.804007777777778,"config_hours":0.0,"orgmode_hours":0.0,"package_hours":0.0}, +{"period":"2020-10-03T00:00:00Z","misc_emacs_hours":0.0,"emacs_other_code_hours":0.0,"vim_other_code_hours":0.7722222222222223,"config_hours":0.0,"orgmode_hours":0.0,"package_hours":0.0}, +{"period":"2020-10-04T00:00:00Z","misc_emacs_hours":0.0,"emacs_other_code_hours":0.0,"vim_other_code_hours":4.997453333333334,"config_hours":0.0,"orgmode_hours":0.0,"package_hours":0.0}, +{"period":"2020-10-05T00:00:00Z","misc_emacs_hours":0.0,"emacs_other_code_hours":0.0,"vim_other_code_hours":3.792777777777778,"config_hours":0.0,"orgmode_hours":0.0,"package_hours":0.0}, +{"period":"2020-10-06T00:00:00Z","misc_emacs_hours":0.0,"emacs_other_code_hours":0.0,"vim_other_code_hours":1.2219444444444443,"config_hours":0.0,"orgmode_hours":0.0,"package_hours":0.0}, +{"period":"2020-10-07T00:00:00Z","misc_emacs_hours":0.0,"emacs_other_code_hours":0.0,"vim_other_code_hours":0.6566666666666666,"config_hours":0.0,"orgmode_hours":0.0,"package_hours":0.0}, +{"period":"2020-10-08T00:00:00Z","misc_emacs_hours":0.0,"emacs_other_code_hours":0.0,"vim_other_code_hours":2.1977777777777776,"config_hours":0.0,"orgmode_hours":0.0,"package_hours":0.0}, +{"period":"2020-10-09T00:00:00Z","misc_emacs_hours":1.544538888888889,"emacs_other_code_hours":0.0,"vim_other_code_hours":2.2808333333333333,"config_hours":0.0,"orgmode_hours":0.0,"package_hours":0.0}, +{"period":"2020-10-10T00:00:00Z","misc_emacs_hours":2.166045,"emacs_other_code_hours":0.0,"vim_other_code_hours":2.765833333333333,"config_hours":0.0,"orgmode_hours":0.0,"package_hours":0.0}, +{"period":"2020-10-11T00:00:00Z","misc_emacs_hours":0.0,"emacs_other_code_hours":0.0,"vim_other_code_hours":1.522777777777778,"config_hours":0.0,"orgmode_hours":0.0,"package_hours":0.0}, +{"period":"2020-10-12T00:00:00Z","misc_emacs_hours":3.373538055555555,"emacs_other_code_hours":0.0,"vim_other_code_hours":2.8524999999999996,"config_hours":1.1968416666666668,"orgmode_hours":0.0,"package_hours":0.0}, +{"period":"2020-10-13T00:00:00Z","misc_emacs_hours":0.0,"emacs_other_code_hours":0.0,"vim_other_code_hours":3.1955855555555557,"config_hours":0.0,"orgmode_hours":0.0,"package_hours":0.0}, +{"period":"2020-10-14T00:00:00Z","misc_emacs_hours":0.0,"emacs_other_code_hours":0.6688305555555559,"vim_other_code_hours":0.07459444444444445,"config_hours":2.822041666666667,"orgmode_hours":0.0,"package_hours":0.06048055555555555}, +{"period":"2020-10-15T00:00:00Z","misc_emacs_hours":1.0370783333333335,"emacs_other_code_hours":4.3661255555555565,"vim_other_code_hours":0.24187555555555554,"config_hours":3.7891083333333335,"orgmode_hours":0.0,"package_hours":0.2898111111111111}, +{"period":"2020-10-16T00:00:00Z","misc_emacs_hours":1.2085813888888888,"emacs_other_code_hours":2.804672222222222,"vim_other_code_hours":0.0020166666666666666,"config_hours":0.4711361111111111,"orgmode_hours":0.0,"package_hours":0.0}, +{"period":"2020-10-17T00:00:00Z","misc_emacs_hours":1.5149327777777772,"emacs_other_code_hours":1.431163888888889,"vim_other_code_hours":0.24356111111111112,"config_hours":2.4144055555555557,"orgmode_hours":1.0415694444444443,"package_hours":0.0}, +{"period":"2020-10-18T00:00:00Z","misc_emacs_hours":1.185498611111111,"emacs_other_code_hours":4.190124999999999,"vim_other_code_hours":0.0,"config_hours":0.1758361111111111,"orgmode_hours":0.5317666666666666,"package_hours":0.0}, +{"period":"2020-10-19T00:00:00Z","misc_emacs_hours":1.0136511111111104,"emacs_other_code_hours":2.7192686111111115,"vim_other_code_hours":0.0022222222222222222,"config_hours":0.03091111111111111,"orgmode_hours":0.3985694444444444,"package_hours":0.0}, +{"period":"2020-10-20T00:00:00Z","misc_emacs_hours":1.6019416666666655,"emacs_other_code_hours":1.8278999999999996,"vim_other_code_hours":0.0,"config_hours":0.09761388888888889,"orgmode_hours":1.1227472222222223,"package_hours":0.0}, +{"period":"2020-10-21T00:00:00Z","misc_emacs_hours":0.10150999999999932,"emacs_other_code_hours":4.24669138888889,"vim_other_code_hours":0.014744444444444444,"config_hours":0.4583833333333333,"orgmode_hours":0.1297222222222222,"package_hours":0.0}, +{"period":"2020-10-22T00:00:00Z","misc_emacs_hours":0.0,"emacs_other_code_hours":5.37636388888889,"vim_other_code_hours":0.05089722222222222,"config_hours":0.024694444444444446,"orgmode_hours":0.21722777777777777,"package_hours":0.0}, +{"period":"2020-10-23T00:00:00Z","misc_emacs_hours":0.40990444444444485,"emacs_other_code_hours":4.576274999999999,"vim_other_code_hours":0.09225833333333333,"config_hours":0.6420833333333333,"orgmode_hours":0.5016444444444444,"package_hours":0.08161666666666667}, +{"period":"2020-10-24T00:00:00Z","misc_emacs_hours":0.07689472222222271,"emacs_other_code_hours":1.2494466666666666,"vim_other_code_hours":0.0061111111111111106,"config_hours":0.4475111111111111,"orgmode_hours":0.8585111111111111,"package_hours":0.0}, +{"period":"2020-10-25T00:00:00Z","misc_emacs_hours":1.3529136111111115,"emacs_other_code_hours":2.2984227777777777,"vim_other_code_hours":0.0,"config_hours":0.22775833333333334,"orgmode_hours":0.03581666666666667,"package_hours":0.0}, +{"period":"2020-10-26T00:00:00Z","misc_emacs_hours":2.2822991666666663,"emacs_other_code_hours":1.8299355555555556,"vim_other_code_hours":0.21062777777777777,"config_hours":0.5299861111111112,"orgmode_hours":0.9724463888888889,"package_hours":0.0}, +{"period":"2020-10-27T00:00:00Z","misc_emacs_hours":2.4492977777777787,"emacs_other_code_hours":1.3149833333333336,"vim_other_code_hours":0.0,"config_hours":1.6067777777777779,"orgmode_hours":0.7547583333333333,"package_hours":0.0}, +{"period":"2020-10-28T00:00:00Z","misc_emacs_hours":0.0,"emacs_other_code_hours":0.9042833333333333,"vim_other_code_hours":0.08348333333333334,"config_hours":0.7079055555555556,"orgmode_hours":0.14482499999999998,"package_hours":0.0}, +{"period":"2020-10-29T00:00:00Z","misc_emacs_hours":0.328835555555556,"emacs_other_code_hours":3.784140277777778,"vim_other_code_hours":0.15638888888888888,"config_hours":0.4212972222222222,"orgmode_hours":0.07462222222222221,"package_hours":0.0}, +{"period":"2020-10-30T00:00:00Z","misc_emacs_hours":0.27459194444444435,"emacs_other_code_hours":0.07239999999999996,"vim_other_code_hours":0.2136111111111111,"config_hours":0.38052222222222226,"orgmode_hours":0.20900277777777776,"package_hours":0.0}, +{"period":"2020-10-31T00:00:00Z","misc_emacs_hours":0.0,"emacs_other_code_hours":2.46487,"vim_other_code_hours":0.0,"config_hours":0.16100555555555557,"orgmode_hours":0.04638055555555556,"package_hours":0.0}, +{"period":"2020-11-01T00:00:00Z","misc_emacs_hours":0.609663055555556,"emacs_other_code_hours":5.329877777777778,"vim_other_code_hours":0.0,"config_hours":0.02627777777777778,"orgmode_hours":0.30374999999999996,"package_hours":0.0}, +{"period":"2020-11-02T00:00:00Z","misc_emacs_hours":1.6059166666666673,"emacs_other_code_hours":2.984023055555556,"vim_other_code_hours":0.02325,"config_hours":0.8176666666666665,"orgmode_hours":0.016177777777777777,"package_hours":0.003427777777777778}, +{"period":"2020-11-03T00:00:00Z","misc_emacs_hours":0.3323786111111109,"emacs_other_code_hours":2.076485,"vim_other_code_hours":0.0,"config_hours":0.0,"orgmode_hours":0.44376611111111114,"package_hours":0.0}, +{"period":"2020-11-04T00:00:00Z","misc_emacs_hours":0.0,"emacs_other_code_hours":5.921964722222222,"vim_other_code_hours":0.0,"config_hours":0.500686111111111,"orgmode_hours":1.411311111111111,"package_hours":0.0}, +{"period":"2020-11-05T00:00:00Z","misc_emacs_hours":0.0,"emacs_other_code_hours":7.012325,"vim_other_code_hours":0.0,"config_hours":0.3160166666666667,"orgmode_hours":0.008994444444444446,"package_hours":0.0}, +{"period":"2020-11-06T00:00:00Z","misc_emacs_hours":0.8303497222222229,"emacs_other_code_hours":1.9601530555555557,"vim_other_code_hours":0.0,"config_hours":0.0,"orgmode_hours":1.155611111111111,"package_hours":0.0}, +{"period":"2020-11-07T00:00:00Z","misc_emacs_hours":0.0,"emacs_other_code_hours":5.815349444444445,"vim_other_code_hours":0.0,"config_hours":0.0,"orgmode_hours":0.0,"package_hours":0.0}, +{"period":"2020-11-08T00:00:00Z","misc_emacs_hours":0.5992686111111123,"emacs_other_code_hours":7.439156111111109,"vim_other_code_hours":0.0,"config_hours":0.0,"orgmode_hours":0.08499444444444444,"package_hours":0.0}, +{"period":"2020-11-09T00:00:00Z","misc_emacs_hours":0.0,"emacs_other_code_hours":2.465256666666667,"vim_other_code_hours":0.0,"config_hours":0.0,"orgmode_hours":0.620813888888889,"package_hours":0.0} +] \ No newline at end of file diff --git a/static/js/2023-04-14-emacs.js b/static/js/2023-04-14-emacs.js index 7e587c0..98c0a3f 100644 --- a/static/js/2023-04-14-emacs.js +++ b/static/js/2023-04-14-emacs.js @@ -15,7 +15,7 @@ const EMACS_ITEM = { const COLORS = [ "#77bceb", "#ff6384", - "#77c0c0", + "#73d9d9", "#ff9f40", "#ffcd56", "#c9cbcf", @@ -75,6 +75,16 @@ const EMACS_DATA = { yAxisID: "yAxis1", ...EMACS_ITEM, }, + { + label: "ranger", + data: [ + { + name: "File manager", + span: [new Date("2019-04-03"), new Date("2020-02-17")], + }, + ], + yAxisID: "yAxis2", + }, { label: "vifm", data: [ @@ -169,6 +179,16 @@ const EMACS_DATA = { ], yAxisID: "yAxis5", }, + { + label: "Google Play Music", + data: [ + { + name: "Multimedia", + span: [new Date("2019-05-12"), new Date("2020-07-26")], + }, + ], + yAxisID: "yAxis6", + }, { label: "MPD", data: [ @@ -250,6 +270,15 @@ const EMACS_DATA = { }), }; +function replaceNumbers(data) { + for (const [key, value] of Object.entries(data)) { + const items = document.querySelectorAll(`[data-num="${key}"]`); + for (const item of items) { + item.innerHTML = value; + } + } +} + function emacsChart() { const ctx = document.getElementById("chart-emacs-history"); new Chart(ctx, { @@ -259,7 +288,7 @@ function emacsChart() { options: { indexAxis: "y", grouped: true, - aspectRatio: 1.2, + aspectRatio: 1.1, parsing: { yAxisKey: "name", xAxisKey: "span", @@ -345,6 +374,26 @@ async function emacsTimeChart() { backgroundColor: color, })), }; + const replaceData = {}; + for (const [key] of labels) { + replaceData[`${key}_total`] = 0; + replaceData[`${key}_percent`] = 0; + } + let total = 0; + for (const rawDatum of rawData) { + for (const [key] of labels) { + replaceData[`${key}_total`] += rawDatum[key] || 0; + total += rawDatum[key] || 0; + } + } + for (const [key] of labels) { + replaceData[`${key}_total`] = replaceData[`${key}_total`].toFixed(1); + replaceData[`${key}_percent`] = ( + (replaceData[`${key}_total`] / total) * + 100 + ).toFixed(1); + } + replaceNumbers(replaceData); const ctx = document.getElementById("chart-emacs-time"); new Chart(ctx, { @@ -609,12 +658,135 @@ async function configsChart() { }); } +async function packagesChart() { + const response = await fetch("/data/2023-03-14-emacs/emacs-packages.json"); + const rawData = await response.json(); + + const data = [ + ...rawData.slice(0, 15), + { + name: "Other", + hours: rawData.slice(15).reduce((acc, d) => acc + d.hours, 0), + }, + ]; + + const replaceData = {}; + for (const datum of data) { + replaceData[`${datum.name}_total`] = datum.hours.toFixed(1); + } + replaceNumbers(replaceData); + + const ctx = document.getElementById("chart-emacs-packages"); + new Chart(ctx, { + type: "bar", + data: { + labels: data.map((d) => d.name), + datasets: [ + { + data, + }, + ], + }, + options: { + aspectRatio: 1.3, + parsing: { + yAxisKey: "name", + xAxisKey: "hours", + }, + indexAxis: "y", + scales: { + x: { + title: { + display: true, + text: "Hours", + }, + }, + }, + plugins: { + title: { + display: true, + text: "Time per Emacs packages", + color: "black", + font: { + size: 15, + }, + }, + legend: { + display: false, + }, + }, + }, + }); +} + +async function emacsVimSwitchChart() { + const response = await fetch("/data/2023-03-14-emacs/emacs-vim-switch.json"); + const rawData = await response.json(); + const labels = [ + ["config_hours", "Config", "#A989C5"], + ["package_hours", "Emacs Packages", "#7172AD"], + ["orgmode_hours", "Org Mode", "#509EE3"], + ["emacs_other_code_hours", "Other Code (Emacs)", "#F2A86F"], + ["vim_other_code_hours", "Other Code (Vim)", "#59c26e"], + ["misc_emacs_hours", "Misc (Emacs)", "#F9D45C"], + ]; + const data = { + labels: rawData.map((d) => new Date(d["period"])), + datasets: labels.map(([key, label, color]) => ({ + label, + data: rawData.map((d) => ({ + period: new Date(d["period"]), + value: d[key], + })), + backgroundColor: color, + })), + }; + + const ctx = document.getElementById("chart-emacs-vim-switch"); + new Chart(ctx, { + type: "bar", + data, + options: { + parsing: { + xAxisKey: "period", + yAxisKey: "value", + }, + scales: { + x: { + type: "time", + min: data.labels[0], + stacked: true, + }, + y: { + stacked: true, + title: { + display: true, + text: "Hours", + }, + }, + }, + plugins: { + title: { + display: true, + text: "Switch from Emacs to Vim", + color: "black", + font: { + size: 15, + }, + }, + }, + }, + }); +} + document.addEventListener( "DOMContentLoaded", - function () { + async function () { emacsChart(); emacsTimeChart(); configsChart(); + packagesChart(); + emacsVimSwitchChart(); }, false ); From b3e1afe2290e29c81c54e1821dd192eef663a591 Mon Sep 17 00:00:00 2001 From: SqrtMinusOne Date: Fri, 7 Apr 2023 23:59:08 +0300 Subject: [PATCH 07/11] feat(emacs): some text --- content/posts/2023-04-14-emacs.md | 91 ++++++++++++++++-- org/2023-04-14-emacs.org | 95 +++++++++++++++++-- .../2023-03-14-emacs/emacs-screen-time.json | 33 +++++++ static/js/2023-04-14-emacs.js | 85 ++++++++++++++++- 4 files changed, 282 insertions(+), 22 deletions(-) create mode 100644 static/data/2023-03-14-emacs/emacs-screen-time.json diff --git a/content/posts/2023-04-14-emacs.md b/content/posts/2023-04-14-emacs.md index ca2ba24..59455a9 100644 --- a/content/posts/2023-04-14-emacs.md +++ b/content/posts/2023-04-14-emacs.md @@ -1,5 +1,5 @@ +++ -title = "Charts test" +title = "900 days of Emacs" author = ["Pavel Korytov"] date = 2023-02-02 tags = ["emacs"] @@ -7,12 +7,91 @@ draft = true scripts = ["/js/chart.js", "/js/chartjs-adapter-date-fns.bundle.min.js", "/js/chartjs-plugin-datalabels.js", "/js/2023-04-14-emacs.js"] +++ -Hello world + + +> Poof I made my free-time disappear + +

- Ellis Kenyő, on being called an "elisp mage" + +Little did I know when on the fateful day of **[2020-10-09 Fri]** I had installed [GNU Emacs](https://www.gnu.org/software/emacs/). I wasn't thinking about the [ethical aspects](https://www.gnu.org/philosophy/philosophy.html) of free software, [aesthetics of Lisp](https://www.webofstories.com/play/marvin.minsky/44), or these other things with which an occasional layperson explains to him or herself how an almost [half a century old](https://www.jwz.org/doc/emacs-timeline.html) program can still be in [active use](https://emacsconf.org/2022/talks/survey/). + +In fact, when considering using software X for anything, the most important question to me was: can X provide a better user experience? For Emacs, the answer to most of these questions turned out to be yes. + +So, over that time, Emacs has become my programming environment, email client, window manager, knowledge base [and a lot more](https://sqrtminusone.xyz/configs/emacs/). I think I ended up using Emacs for almost as many things as possible; I have even authored a few packages that implement certain parts of my workflows that weren't readily available. + +Among other things, the Emacs community is responsible for my introduction to [Zettelkasten](https://zettelkasten.de/), RSS, Lisps... Perhaps even my English became slightly less broken because Emacs is so text-centered. Indeed, a lot has changed over the course of these short 2.5 years. + +Anyway, I am writing this document because I happen to have a lot of data about how I use Emacs, mostly from projects called [ActivityWatch](https://activitywatch.net/) and [WakaTime](https://wakatime.com/). So, primarily I am curious myself --- how much time did all of that actually take? + +Also, every now and then I see Emacs people discussing their journeys through the Elisp-land, or a potential newcomer wondering whether this rabbit hole is worth investigating. If this applies to you, then you might find something interesting in the structure of my effort. + + + + +## Everything goes into Emacs {#everything-goes-into-emacs} + +It makes sense to begin with the evolution of the place of Emacs in my PC usage. Fig. 1 shows that as a Gantt chart. + + + +As you can see, I used Neovim for a bit more than a year. We'll get into some numbers on that later. + +And it took me about 13 months to move from knowing nothing about Emacs to using EXWM. + +Fig. 2 shows the dynamics of the direct screen time ratio spent in Emacs per each month, i.e. how many non-AFK seconds the Emacs window was active on average. + + + +It's hard to distinguish any general trend here. It seems like the ratio started at 0.2 in October 2020, was oscillating around 0.3 for about 7 months, then moved closer to 0.4 until January 2023, after which jumped to 0.45-0.5. + +The three peaks in September 2021 (0.526), January 2022 (0.532) and August 2022 (0.568) may match my vacations, in which I didn't have to spend time in Chrome DevTools (I do web development as my "main" job), but I'm not sure about that. + +The jump is January 2023 definitely matches my adoption of [telega.el](https://github.com/zevlg/telega.el) instead of the official desktop client. The time redistributes rather cleanly in the detailed ActivityWatch data. + +It's also interesting that switch from [i3](https://i3wm.org/) to [EXWM](https://github.com/ch11ng/exwm) didn't seem to have any particularly distinguishable effects. + +The mean Emacs screen time ratios are 0.39 since October 2020 and 0.47 since January 2023. So... that's a lot. + + +## Time spent in Emacs {#time-spent-in-emacs} + +Now let's turn to the structure of time spent in Emacs. Fig. 3 shows how many Emacs-hours per month I spent on what, Fig. 4 shows the same in the stacked form. + +Contrary to Fig. 2, the time here is calculated with a 15-minute timeout preference, like [it's done in WakaTime](https://wakatime.com/faq#timeout). For instance, if I do something in a project in Emacs for 10 minutes, then switch to something else for 10 minutes (i.e. no [heartbeats](https://wakatime.com/developers/#heartbeats) in that time), then switch back to the project for 10 more minutes, this will be accounted as 30 minutes in that project. + +This is mostly so because that's the default format of the [WakaTime export](https://wakatime.com/faq#exporting), but I also think that's reasonable, because I may open package documentation during configuration, experiment in scratch buffers while working on a package, etc. This time really has to be included in the final tally. + +Of course, this will also include all the times I was distracted to the [System Crafters](https://wiki.systemcrafters.net/community/chat-with-us/) Discord server, [emacs.ch](https://emacs.ch/) (a Mastodon instance), or whatever else. So treat the numbers below as an upper bound. + + + + + +The categories are as follows: + +- **Config** ([REDACTED] total hours, [REDACTED]% of all time)
+ Time spent on the actual Emacs configuration. +- **Emacs Packages** ([REDACTED] total hours, [REDACTED]% of all time)
+ Time spent in other Emacs Lisp files, i.e. writing my packages or debugging other packages. See the packages section. +- **Org Mode** ([REDACTED] total hours, [REDACTED]% of all time)
+ Time spent in my `org-mode` project, which is mostly [org-journal](https://github.com/bastibe/org-journal), [org-roam](https://www.orgroam.com/) and project management. By the way, guess the month in which I read [Sönke Ahrens' book](https://www.soenkeahrens.de/en/takesmartnotes) about Zettelkasten. +- **sqrtminusone.xyz** ([REDACTED] total hours, [REDACTED]% of all time)
+ Time spent doing something with this strage website. +- **Other Code** ([REDACTED] total hours, [REDACTED]% of all time)
+ Doing something marginally useful in Emacs, which is mostly work, education and a few personal projects that aren't related to Emacs. +- **Misc** ([REDACTED] total hours, [REDACTED]% of all time) + Time spent in Emacs but not in an actual project (i.e. accounted by ActivityWatch but not WakaTime). These are things like reading RSS, writing emails, using messengers, doing some idle experimentation in scratch buffers, etc. ## Numbers {#numbers} -- Total time on Config: [REDACTED] +- Total time on Config: - Total time on Packages: [REDACTED] - % time on Config: [REDACTED] - Hours on `org-journal-tags`: [REDACTED] @@ -21,12 +100,6 @@ Hello world ## Charts {#charts} - - - - - - diff --git a/org/2023-04-14-emacs.org b/org/2023-04-14-emacs.org index c776b68..eca90e4 100644 --- a/org/2023-04-14-emacs.org +++ b/org/2023-04-14-emacs.org @@ -1,26 +1,79 @@ #+HUGO_SECTION: posts #+HUGO_BASE_DIR: ../ -#+TITLE: Charts test +#+TITLE: 900 days of Emacs #+DATE: 2023-02-02 #+HUGO_TAGS: emacs #+HUGO_DRAFT: true #+HUGO_CUSTOM_FRONT_MATTER: :scripts '("/js/chart.js" "/js/chartjs-adapter-date-fns.bundle.min.js" "/js/chartjs-plugin-datalabels.js" "/js/2023-04-14-emacs.js") -Hello world +#+begin_export html + +#+end_export -* Numbers -- Total time on Config: @@html:[REDACTED]@@ -- Total time on Packages: @@html:[REDACTED]@@ -- % time on Config: @@html:[REDACTED]@@ -- Hours on =org-journal-tags=: @@html:[REDACTED]@@ -- Total time on Vim config: 39 hours +#+begin_quote +Poof I made my free-time disappear +#+end_quote -* Charts +@@html:

- Ellis Kenyő, on being called an "elisp mage"@@ + +Little did I know when on the fateful day of *[2020-10-09 Fri]* I had installed [[https://www.gnu.org/software/emacs/][GNU Emacs]]. I wasn't thinking about the [[https://www.gnu.org/philosophy/philosophy.html][ethical aspects]] of free software, [[https://www.webofstories.com/play/marvin.minsky/44][aesthetics of Lisp]], or these other things with which an occasional layperson explains to him or herself how an almost [[https://www.jwz.org/doc/emacs-timeline.html][half a century old]] program can still be in [[https://emacsconf.org/2022/talks/survey/][active use]]. + +In fact, when considering using software X for anything, the most important question to me was: can X provide a better user experience? For Emacs, the answer to most of these questions turned out to be yes. + +So, over that time, Emacs has become my programming environment, email client, window manager, knowledge base [[https://sqrtminusone.xyz/configs/emacs/][and a lot more]]. I think I ended up using Emacs for almost as many things as possible; I have even authored a few packages that implement certain parts of my workflows that weren't readily available. + +Among other things, the Emacs community is responsible for my introduction to [[https://zettelkasten.de/][Zettelkasten]], RSS, Lisps... Perhaps even my English became slightly less broken because Emacs is so text-centered. Indeed, a lot has changed over the course of these short 2.5 years. + +Anyway, I am writing this document because I happen to have a lot of data about how I use Emacs, mostly from projects called [[https://activitywatch.net/][ActivityWatch]] and [[https://wakatime.com/][WakaTime]]. So, primarily I am curious myself --- how much time did all of that actually take? + +Also, every now and then I see Emacs people discussing their journeys through the Elisp-land, or a potential newcomer wondering whether this rabbit hole is worth investigating. If this applies to you, then you might find something interesting in the structure of my effort. + +#+begin_export html + +#+end_export + +* Everything goes into Emacs +It makes sense to begin with the evolution of the place of Emacs in my PC usage. Fig. 1 shows that as a Gantt chart. #+begin_export html #+end_export +As you can see, I used Neovim for a bit more than a year. We'll get into some numbers on that later. + +And it took me about 13 months to move from knowing nothing about Emacs to using EXWM. + +Fig. 2 shows the dynamics of the direct screen time ratio spent in Emacs per each month, i.e. how many non-AFK seconds the Emacs window was active on average. + +#+begin_export html + +#+end_export + +It's hard to distinguish any general trend here. It seems like the ratio started at 0.2 in October 2020, was oscillating around 0.3 for about 7 months, then moved closer to 0.4 until January 2023, after which jumped to 0.45-0.5. + +The three peaks in September 2021 (0.526), January 2022 (0.532) and August 2022 (0.568) may match my vacations, in which I didn't have to spend time in Chrome DevTools (I do web development as my "main" job), but I'm not sure about that. + +The jump is January 2023 definitely matches my adoption of [[https://github.com/zevlg/telega.el][telega.el]] instead of the official desktop client. The time redistributes rather cleanly in the detailed ActivityWatch data. + +It's also interesting that switch from [[https://i3wm.org/][i3]] to [[https://github.com/ch11ng/exwm][EXWM]] didn't seem to have any particularly distinguishable effects. + +The mean Emacs screen time ratios are 0.39 since October 2020 and 0.47 since January 2023. So... that's a lot. + +* Time spent in Emacs +Now let's turn to the structure of time spent in Emacs. Fig. 3 shows how many Emacs-hours per month I spent on what, Fig. 4 shows the same in the stacked form. + +Contrary to Fig. 2, the time here is calculated with a 15-minute timeout preference, like [[https://wakatime.com/faq#timeout][it's done in WakaTime]]. For instance, if I do something in a project in Emacs for 10 minutes, then switch to something else for 10 minutes (i.e. no [[https://wakatime.com/developers/#heartbeats][heartbeats]] in that time), then switch back to the project for 10 more minutes, this will be accounted as 30 minutes in that project. + +This is mostly so because that's the default format of the [[https://wakatime.com/faq#exporting][WakaTime export]], but I also think that's reasonable, because I may open package documentation during configuration, experiment in scratch buffers while working on a package, etc. This time really has to be included in the final tally. + +Of course, this will also include all the times I was distracted to the [[https://wiki.systemcrafters.net/community/chat-with-us/][System Crafters]] Discord server, [[https://emacs.ch/][emacs.ch]] (a Mastodon instance), or whatever else. So treat the numbers below as an upper bound. + #+begin_export html #+end_export @@ -29,6 +82,30 @@ Hello world #+end_export +The categories are as follows: + +- *Config* (@@html:[REDACTED]@@ total hours, @@html:[REDACTED]@@% of all time)\\ + Time spent on the actual Emacs configuration. +- *Emacs Packages* (@@html:[REDACTED]@@ total hours, @@html:[REDACTED]@@% of all time)\\ + Time spent in other Emacs Lisp files, i.e. writing my packages or debugging other packages. See the packages section. +- *Org Mode* (@@html:[REDACTED]@@ total hours, @@html:[REDACTED]@@% of all time)\\ + Time spent in my =org-mode= project, which is mostly [[https://github.com/bastibe/org-journal][org-journal]], [[https://www.orgroam.com/][org-roam]] and project management. By the way, guess the month in which I read [[https://www.soenkeahrens.de/en/takesmartnotes][Sönke Ahrens' book]] about Zettelkasten. +- *sqrtminusone.xyz* (@@html:[REDACTED]@@ total hours, @@html:[REDACTED]@@% of all time)\\ + Time spent doing something with this strage website. +- *Other Code* (@@html:[REDACTED]@@ total hours, @@html:[REDACTED]@@% of all time)\\ + Doing something marginally useful in Emacs, which is mostly work, education and a few personal projects that aren't related to Emacs. +- *Misc* (@@html:[REDACTED]@@ total hours, @@html:[REDACTED]@@% of all time) + Time spent in Emacs but not in an actual project (i.e. accounted by the [[https://github.com/ActivityWatch/aw-watcher-window][window watcher]] of ActivityWatch but not WakaTime, which watches for projects). These are things like reading RSS, writing emails, using messengers, doing some idle experimentation in scratch buffers, etc. + +* Numbers +- Total time on Config: +- Total time on Packages: @@html:[REDACTED]@@ +- % time on Config: @@html:[REDACTED]@@ +- Hours on =org-journal-tags=: @@html:[REDACTED]@@ +- Total time on Vim config: 39 hours + +* Charts + #+begin_export html #+end_export diff --git a/static/data/2023-03-14-emacs/emacs-screen-time.json b/static/data/2023-03-14-emacs/emacs-screen-time.json new file mode 100644 index 0000000..9d1ba4f --- /dev/null +++ b/static/data/2023-03-14-emacs/emacs-screen-time.json @@ -0,0 +1,33 @@ +[ +{"date_trunc":"2020-10-01T00:00:00Z","percent":0.20421706158872063}, +{"date_trunc":"2020-11-01T00:00:00Z","percent":0.2656396332934231}, +{"date_trunc":"2020-12-01T00:00:00Z","percent":0.328156158373562}, +{"date_trunc":"2021-01-01T00:00:00Z","percent":0.30293494692052564}, +{"date_trunc":"2021-02-01T00:00:00Z","percent":0.29825278394208066}, +{"date_trunc":"2021-03-01T00:00:00Z","percent":0.24318066017980156}, +{"date_trunc":"2021-04-01T00:00:00Z","percent":0.3774396720741769}, +{"date_trunc":"2021-05-01T00:00:00Z","percent":0.2907218886830386}, +{"date_trunc":"2021-06-01T00:00:00Z","percent":0.37853346779023606}, +{"date_trunc":"2021-07-01T00:00:00Z","percent":0.3451648046146705}, +{"date_trunc":"2021-08-01T00:00:00Z","percent":0.5261220707445486}, +{"date_trunc":"2021-09-01T00:00:00Z","percent":0.4095219799672908}, +{"date_trunc":"2021-10-01T00:00:00Z","percent":0.3562719759085607}, +{"date_trunc":"2021-11-01T00:00:00Z","percent":0.3946809530892407}, +{"date_trunc":"2021-12-01T00:00:00Z","percent":0.46327503042546997}, +{"date_trunc":"2022-01-01T00:00:00Z","percent":0.5318326577174478}, +{"date_trunc":"2022-02-01T00:00:00Z","percent":0.4358549401255391}, +{"date_trunc":"2022-03-01T00:00:00Z","percent":0.41948172412528684}, +{"date_trunc":"2022-04-01T00:00:00Z","percent":0.4430246367606649}, +{"date_trunc":"2022-05-01T00:00:00Z","percent":0.39880827117107315}, +{"date_trunc":"2022-06-01T00:00:00Z","percent":0.39962422579568685}, +{"date_trunc":"2022-07-01T00:00:00Z","percent":0.3741313993218909}, +{"date_trunc":"2022-08-01T00:00:00Z","percent":0.5678526580569381}, +{"date_trunc":"2022-09-01T00:00:00Z","percent":0.3912379067398905}, +{"date_trunc":"2022-10-01T00:00:00Z","percent":0.3807843143331747}, +{"date_trunc":"2022-11-01T00:00:00Z","percent":0.36358283951988357}, +{"date_trunc":"2022-12-01T00:00:00Z","percent":0.3664672426322652}, +{"date_trunc":"2023-01-01T00:00:00Z","percent":0.5015832592260838}, +{"date_trunc":"2023-02-01T00:00:00Z","percent":0.48874221007685836}, +{"date_trunc":"2023-03-01T00:00:00Z","percent":0.43940966116785446}, +{"date_trunc":"2023-04-01T00:00:00Z","percent":0.44787489198857766} +] \ No newline at end of file diff --git a/static/js/2023-04-14-emacs.js b/static/js/2023-04-14-emacs.js index 98c0a3f..7f8974e 100644 --- a/static/js/2023-04-14-emacs.js +++ b/static/js/2023-04-14-emacs.js @@ -32,6 +32,7 @@ const EMACS_DATA = { "Passwords", "Multimedia", "WM", + "Messenger", ], datasets: [ { @@ -178,6 +179,7 @@ const EMACS_DATA = { }, ], yAxisID: "yAxis5", + ...EMACS_ITEM, }, { label: "Google Play Music", @@ -261,6 +263,27 @@ const EMACS_DATA = { yAxisID: "yAxis7", ...EMACS_ITEM, }, + { + label: "Telegram Desktop", + data: [ + { + name: "Messenger", + span: [new Date("2022-03-22"), new Date("2023-01-07")], + }, + ], + yAxisID: "yAxis8", + }, + { + label: "telega.el", + data: [ + { + name: "Messenger", + span: [new Date("2023-01-07"), TODAY], + }, + ], + yAxisID: "yAxis8", + ...EMACS_ITEM, + }, ].map((d) => { if (!d.backgroundColor) { d.backgroundColor = COLORS[i]; @@ -302,7 +325,7 @@ function emacsChart() { min: new Date("2018-09"), }, ...Object.fromEntries( - [1, 2, 3, 4, 5, 6].map((i) => [ + [1, 2, 3, 4, 5, 6, 7].map((i) => [ `yAxis${i}`, { display: false, @@ -316,7 +339,7 @@ function emacsChart() { }, title: { display: true, - text: "Everything goes into Emacs", + text: "Figure 1. Everything goes into Emacs", color: "black", font: { size: 15, @@ -350,6 +373,59 @@ function emacsChart() { }); } +async function emacsScreenTimeChart() { + const response = await fetch("/data/2023-03-14-emacs/emacs-screen-time.json"); + const rawData = await response.json(); + const data = { + labels: rawData.map((d) => new Date(d["date_trunc"])), + datasets: [ + { + data: rawData.map((d) => ({ + period: new Date(d["date_trunc"]), + value: d["percent"], + })), + }, + ], + }; + + const ctx = document.getElementById("chart-emacs-screen-time"); + new Chart(ctx, { + type: "bar", + data, + options: { + parsing: { + xAxisKey: "period", + yAxisKey: "value", + }, + scales: { + x: { + type: "time", + min: data.labels[0], + }, + y: { + title: { + display: true, + text: "Ratio of direct screen time", + }, + }, + }, + plugins: { + legend: { + display: false, + }, + title: { + display: true, + text: "Figure 2. Emacs direct screen time ratio over time", + color: "black", + font: { + size: 15, + }, + }, + }, + }, + }); +} + async function emacsTimeChart() { const response = await fetch( "/data/2023-03-14-emacs/emacs-related-time-per-month.json" @@ -421,7 +497,7 @@ async function emacsTimeChart() { plugins: { title: { display: true, - text: "Emacs-related time per month", + text: "Figure 3. Structure of Emacs usage per month", color: "black", font: { size: 15, @@ -481,7 +557,7 @@ async function emacsTimeChart() { plugins: { title: { display: true, - text: "Emacs-related time per month (stacked)", + text: "Figure 4. Structure of Emacs usage per month (stacked)", color: "black", font: { size: 15, @@ -783,6 +859,7 @@ document.addEventListener( "DOMContentLoaded", async function () { emacsChart(); + emacsScreenTimeChart(); emacsTimeChart(); configsChart(); packagesChart(); From 6698a8319b5b4a42dc304f900c47bdd10a7cd1cf Mon Sep 17 00:00:00 2001 From: SqrtMinusOne Date: Wed, 12 Apr 2023 12:09:28 +0300 Subject: [PATCH 08/11] feat(emacs): more text --- content/posts/2023-04-14-emacs.md | 85 ++- org/2023-04-14-emacs.org | 98 +++- static/data/2023-03-14-emacs/roam-stats.csv | 599 ++++++++++++++++++++ static/js/2023-04-14-emacs.js | 96 +++- 4 files changed, 838 insertions(+), 40 deletions(-) create mode 100644 static/data/2023-03-14-emacs/roam-stats.csv diff --git a/content/posts/2023-04-14-emacs.md b/content/posts/2023-04-14-emacs.md index 59455a9..d39e650 100644 --- a/content/posts/2023-04-14-emacs.md +++ b/content/posts/2023-04-14-emacs.md @@ -25,9 +25,9 @@ So, over that time, Emacs has become my programming environment, email client, w Among other things, the Emacs community is responsible for my introduction to [Zettelkasten](https://zettelkasten.de/), RSS, Lisps... Perhaps even my English became slightly less broken because Emacs is so text-centered. Indeed, a lot has changed over the course of these short 2.5 years. -Anyway, I am writing this document because I happen to have a lot of data about how I use Emacs, mostly from projects called [ActivityWatch](https://activitywatch.net/) and [WakaTime](https://wakatime.com/). So, primarily I am curious myself --- how much time did all of that actually take? +Anyway, this post is an attempt at quantifying some aspects of that story. The numbers mostly come from projects called [ActivityWatch](https://activitywatch.net/) and [WakaTime](https://wakatime.com/). -Also, every now and then I see Emacs people discussing their journeys through the Elisp-land, or a potential newcomer wondering whether this rabbit hole is worth investigating. If this applies to you, then you might find something interesting in the structure of my effort. +Mostly I'm curious myself, but also every now and then I see Emacs people discussing their journeys through the Elisp-land, or a potential convert wondering whether this rabbit hole is worth investigating. If any of this applies to you, you might find something interesting in this document.

Also, unfortunately this post turned out to be rather inaccessible for those reading that with a screen-reader. I guess, if that applies to you, just mentally skip the figure references.

+ +

I did try to describe what's going on in these in the post body.

+ As you can see, I used Neovim for a bit more than a year. We'll get into some numbers on that later. @@ -56,7 +60,7 @@ The jump is January 2023 definitely matches my adoption of [telega.el](https://g It's also interesting that switch from [i3](https://i3wm.org/) to [EXWM](https://github.com/ch11ng/exwm) didn't seem to have any particularly distinguishable effects. -The mean Emacs screen time ratios are 0.39 since October 2020 and 0.47 since January 2023. So... that's a lot. +The mean Emacs screen time ratios are 0.39 since October 2020 and 0.47 since January 2023. So, as you might infer, Emacs is quite prominent in my PC usage. ## Time spent in Emacs {#time-spent-in-emacs} @@ -82,28 +86,79 @@ The categories are as follows: - **Org Mode** ([REDACTED] total hours, [REDACTED]% of all time)
Time spent in my `org-mode` project, which is mostly [org-journal](https://github.com/bastibe/org-journal), [org-roam](https://www.orgroam.com/) and project management. By the way, guess the month in which I read [Sönke Ahrens' book](https://www.soenkeahrens.de/en/takesmartnotes) about Zettelkasten. - **sqrtminusone.xyz** ([REDACTED] total hours, [REDACTED]% of all time)
- Time spent doing something with this strage website. + Time spent doing something with this strange website. - **Other Code** ([REDACTED] total hours, [REDACTED]% of all time)
Doing something marginally useful in Emacs, which is mostly work, education and a few personal projects that aren't related to Emacs. - **Misc** ([REDACTED] total hours, [REDACTED]% of all time) - Time spent in Emacs but not in an actual project (i.e. accounted by ActivityWatch but not WakaTime). These are things like reading RSS, writing emails, using messengers, doing some idle experimentation in scratch buffers, etc. + Time spent in Emacs but not in an actual project (i.e. accounted by the [window watcher](https://github.com/ActivityWatch/aw-watcher-window) of ActivityWatch but not WakaTime, which watches for files). These are things like reading RSS, writing emails, using messengers, doing some idle experimentation in scratch buffers, etc. + +[REDACTED]% of time spent to configuration is actually less than I expected. Unsurprisingly, the first month has the highest value of about 20% (I used Emacs without WakaTime for a few days). + +By the way, I spent just 39.0 hours configuring Neovim, although the number is probably not representative anymore because Neovim changed a lot over these 2 years. -## Numbers {#numbers} +## Switching from Neovim {#switching-from-neovim} -- Total time on Config: -- Total time on Packages: [REDACTED] -- % time on Config: [REDACTED] -- Hours on `org-journal-tags`: [REDACTED] -- Total time on Vim config: 39 hours +The period of my switching from Neovim to Emacs seems particularly interesting. Fig 5 zooms in on that; the switch is represented by "Other Code (Emacs)" replacing "Other Code (Vim)". + + + +It seems like getting from zero to somewhat productive took me about 11.1 hours over 4 days of just playing with Emacs, and one day with 3.8 hours on configuring and 4.4 hours on coding, apparently alternating between the two. -## Charts {#charts} +## Configuration {#configuration} + +Now, let's see where these [REDACTED] hours went into. + +Configuration sizes are a fairly common topic in Emacs discussions. I'd guess mine falls into the category of the longest, although maybe I'll do some research on that one day. Fig. 6 shows how my config size changed over time. +So, my Emacs.org is [REDACTED] lines long, and the resulting init.el is [REDACTED] lines long. + +As you can see, I switched to [literate configuration](https://leanpub.com/lit-config) pretty early on; so far I didn't regret it. It's also interesting how the two sizes diverged as I was writing more elaborate commentary. + +I also never had any substantial issues with maintaining that configuration. Perhaps [Emacs Bankruptcies](https://www.emacswiki.org/emacs/DotEmacsBankruptcy) are just not that common nowadays. + +For the sake of completeness, let's compare that to my Neovim usage. Fig. 7 shows the config size dynamics for the first 400 days of using both programs. + +As I said, Neovim seems to have changed a lot since the last time I was using it, so my number of [REDACTED] init.vim lines may no longer be relevant. Still, it's pretty interesting. + + +## Emacs packages {#emacs-packages} + +Working with Emacs packages was an interesting experience, not least because it was my first experience with Lisp. Fig. 8 shows the structure of the [REDACTED] hours I spent on that. + - +Unsurprisingly to me, my [org-journal-tags](https://github.com/SqrtMinusOne/org-journal-tags) tops the chart with [REDACTED] hours. The most interesting part was implementing set logic on the [org-journal](https://github.com/bastibe/org-journal) entities in order to make a kind of query engine. But I use that package all the time. + +The second place, "Unknown project", stands for Emacs Lisp files that didn't belong to any project, which should be mostly built-in Emacs files. + +My [elfeed-summary](https://github.com/SqrtMinusOne/elfeed-summary) ([REDACTED] hours), [lyrics-fetcher](https://github.com/SqrtMinusOne/lyrics-fetcher.el) ([REDACTED] hours) and [reverso](https://github.com/SqrtMinusOne/reverso.el) ([REDACTED] hours) are also among the packages that I use almost daily. So I don't regret investing time in developing any of those. + + +## `org-roam` {#org-roam} + +It's not directly related to Emacs, but I include it here because it's highly unlikely that I would have heard the term "Zettelkasten" outside the Emacs space. + +And although I mentioned [Sönke Ahrens' book](https://www.soenkeahrens.de/en/takesmartnotes), I think the website called [zettelkasten.de](https://zettelkasten.de/posts/overview/) would be a better resource if you're curious what it's all about. And I was initially made curious by [this stream](https://www.youtube.com/watch?v=-TpWahIzueg) of David Wilson. + +Fig. 9 shows the dynamics of my [org-roam](https://github.com/org-roam/org-roam) nodes count over time. + + + +A significant fraction of my [REDACTED] hours spent on Org Mode went there. + + +## Some observations {#some-observations} + +So, as I said, I started from the point of zero experience with Lisp. I had a Bachelor's degree (now Master's) in software engineering, but I don't feel like it has helped me in any direct sense. At most, it exposed me to different kinds and concepts of programming, but I am confident that it's anything but a prerequisite, as also shown by the story of [Protesilaos](https://protesilaos.com/). + +The number of [REDACTED] total hours of configuration may seem huge, but I don't think it's that much over 2.5 years and in comparison to the alternatives. For instance, it would take 6th place from the top if placed among my job projects. Also, my [AntennaPod](https://antennapod.org/) shows 196.9 hours of podcasts played since December 2021, and some of my friends report having spent thousands of hours on video games. + +And keep in mind that I use Emacs almost as extensively as it gets. You might as well spend much less time figuring it out for a more limited use case. So, at least in my view, this weighs against describing Emacs usage in terms of sunk cost fallacy. + +However, my story is consistent with the perception of a [steep learning curve](https://stackoverflow.com/questions/10942008/what-does-emacs-learning-curve-actually-look-like) in the Emacs community. 19.3 hours over 5 days to get started is definitely a lot. diff --git a/org/2023-04-14-emacs.org b/org/2023-04-14-emacs.org index eca90e4..1aa8394 100644 --- a/org/2023-04-14-emacs.org +++ b/org/2023-04-14-emacs.org @@ -14,6 +14,8 @@ #+end_export +#+MACRO: num @@html:[REDACTED]@@ + #+begin_quote Poof I made my free-time disappear #+end_quote @@ -28,9 +30,9 @@ So, over that time, Emacs has become my programming environment, email client, w Among other things, the Emacs community is responsible for my introduction to [[https://zettelkasten.de/][Zettelkasten]], RSS, Lisps... Perhaps even my English became slightly less broken because Emacs is so text-centered. Indeed, a lot has changed over the course of these short 2.5 years. -Anyway, I am writing this document because I happen to have a lot of data about how I use Emacs, mostly from projects called [[https://activitywatch.net/][ActivityWatch]] and [[https://wakatime.com/][WakaTime]]. So, primarily I am curious myself --- how much time did all of that actually take? +Anyway, this post is an attempt at quantifying some aspects of that story. The numbers mostly come from projects called [[https://activitywatch.net/][ActivityWatch]] and [[https://wakatime.com/][WakaTime]]. -Also, every now and then I see Emacs people discussing their journeys through the Elisp-land, or a potential newcomer wondering whether this rabbit hole is worth investigating. If this applies to you, then you might find something interesting in the structure of my effort. +Mostly I'm curious myself, but also every now and then I see Emacs people discussing their journeys through the Elisp-land, or a potential convert wondering whether this rabbit hole is worth investigating. If any of this applies to you, you might find something interesting in this document. #+begin_export html