/*!
 * chartjs-plugin-datalabels v2.2.0
 * https://chartjs-plugin-datalabels.netlify.app
 * (c) 2017-2022 chartjs-plugin-datalabels contributors
 * Released under the MIT license
 */
! function(t, e) {
    "object" == typeof exports && "undefined" != typeof module ? module.exports = e(require("chart.js/helpers"), require("chart.js")) : "function" == typeof define && define.amd ? define(["chart.js/helpers", "chart.js"], e) : (t = "undefined" != typeof globalThis ? globalThis : t || self).ChartDataLabels = e(t.Chart.helpers, t.Chart)
}(this, (function(t, e) {
    "use strict";
    var r = function() {
            if ("undefined" != typeof window) {
                if (window.devicePixelRatio) return window.devicePixelRatio;
                var t = window.screen;
                if (t) return (t.deviceXDPI || 1) / (t.logicalXDPI || 1)
            }
            return 1
        }(),
        a = function(e) {
            var r, a = [];
            for (e = [].concat(e); e.length;) "string" == typeof(r = e.pop()) ? a.unshift.apply(a, r.split("\n")) : Array.isArray(r) ? e.push.apply(e, r) : t.isNullOrUndef(e) || a.unshift("" + r);
            return a
        },
        o = function(t, e, r) {
            var a, o = [].concat(e),
                n = o.length,
                i = t.font,
                l = 0;
            for (t.font = r.string, a = 0; a < n; ++a) l = Math.max(t.measureText(o[a]).width, l);
            return t.font = i, {
                height: n * r.lineHeight,
                width: l
            }
        },
        n = function(t, e, r) {
            return Math.max(t, Math.min(e, r))
        },
        i = function(t, e) {
            var r, a, o, n, i = t.slice(),
                l = [];
            for (r = 0, o = e.length; r < o; ++r) n = e[r], -1 === (a = i.indexOf(n)) ? l.push([n, 1]) : i.splice(a, 1);
            for (r = 0, o = i.length; r < o; ++r) l.push([i[r], -1]);
            return l
        };

    function l(t, e) {
        var r = e.x,
            a = e.y;
        if (null === r) return {
            x: 0,
            y: -1
        };
        if (null === a) return {
            x: 1,
            y: 0
        };
        var o = t.x - r,
            n = t.y - a,
            i = Math.sqrt(o * o + n * n);
        return {
            x: i ? o / i : 0,
            y: i ? n / i : -1
        }
    }

    function s(t, e, r) {
        var a = 0;
        return t < r.left ? a |= 1 : t > r.right && (a |= 2), e < r.top ? a |= 8 : e > r.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 + (t.width || 0),
                y1: t.y + (t.height || 0),
                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), s < d && u < c ? (t.arc(s, u, l, -Math.PI, -i), t.arc(d, u, l, -i, 0), t.arc(d, c, l, 0, i), t.arc(s, c, l, i, Math.PI)) : s < d ? (t.moveTo(s, r), t.arc(d, u, l, -i, i), t.arc(s, u, l, i, Math.PI + i)) : u < c ? (t.arc(s, u, l, -Math.PI, 0), t.arc(s, c, l, 0, Math.PI)) : t.arc(s, u, l, -Math.PI, Math.PI), t.closePath(), t.moveTo(e, r)
            } else t.rect(e, r, a, o)
        }(t, x(e.x) + n / 2, x(e.y) + n / 2, x(e.w) - n, x(e.h) - n, r.borderRadius), t.closePath(), a && (t.fillStyle = a, t.fill()), o && n && (t.strokeStyle = o, t.lineWidth = n, t.lineJoin = "miter", t.stroke()))
    }

    function b(t, e, r) {
        var a = t.shadowBlur,
            o = r.stroked,
            n = x(r.x),
            i = x(r.y),
            l = x(r.w);
        o && t.strokeText(e, n, i, l), r.filled && (a && o && (t.shadowBlur = 0), t.fillText(e, n, i, l), a && o && (t.shadowBlur = a))
    }
    var _ = function(t, e, r, a) {
        var o = this;
        o._config = t, o._index = a, o._model = null, o._rects = null, o._ctx = e, o._el = r
    };
    t.merge(_.prototype, {
        _modelize: function(r, a, n, i) {
            var l, s = this,
                u = s._index,
                x = t.toFont(t.resolve([n.font, {}], i, u)),
                v = t.resolve([n.color, e.defaults.color], i, u);
            return {
                align: t.resolve([n.align, "center"], i, u),
                anchor: t.resolve([n.anchor, "center"], i, u),
                area: i.chart.chartArea,
                backgroundColor: t.resolve([n.backgroundColor, null], i, u),
                borderColor: t.resolve([n.borderColor, null], i, u),
                borderRadius: t.resolve([n.borderRadius, 0], i, u),
                borderWidth: t.resolve([n.borderWidth, 0], i, u),
                clamp: t.resolve([n.clamp, !1], i, u),
                clip: t.resolve([n.clip, !1], i, u),
                color: v,
                display: r,
                font: x,
                lines: a,
                offset: t.resolve([n.offset, 4], i, u),
                opacity: t.resolve([n.opacity, 1], i, u),
                origin: y(s._el, i),
                padding: t.toPadding(t.resolve([n.padding, 4], i, u)),
                positioner: (l = s._el, l instanceof e.ArcElement ? d : l instanceof e.PointElement ? c : l instanceof e.BarElement ? h : f),
                rotation: t.resolve([n.rotation, 0], i, u) * (Math.PI / 180),
                size: o(s._ctx, a, x),
                textAlign: t.resolve([n.textAlign, "start"], i, u),
                textShadowBlur: t.resolve([n.textShadowBlur, 0], i, u),
                textShadowColor: t.resolve([n.textShadowColor, v], i, u),
                textStrokeColor: t.resolve([n.textStrokeColor, v], i, u),
                textStrokeWidth: t.resolve([n.textStrokeWidth, 0], i, u)
            }
        },
        update: function(e) {
            var r, o, n, i = this,
                l = null,
                s = null,
                u = i._index,
                d = i._config,
                c = t.resolve([d.display, !0], e, u);
            c && (r = e.dataset.data[u], o = t.valueOrDefault(t.callback(d.formatter, [r, e]), r), (n = t.isNullOrUndef(o) ? [] : a(o)).length && (s = function(t) {
                var e = t.borderWidth || 0,
                    r = t.padding,
                    a = t.size.height,
                    o = t.size.width,
                    n = -o / 2,
                    i = -a / 2;
                return {
                    frame: {
                        x: n - r.left - e,
                        y: i - r.top - e,
                        w: o + r.width + 2 * e,
                        h: a + r.height + 2 * e
                    },
                    text: {
                        x: n,
                        y: i,
                        w: o,
                        h: a
                    }
                }
            }(l = i._modelize(c, n, d, e)))), i._model = l, i._rects = s
        },
        geometry: function() {
            return this._rects ? this._rects.frame : {}
        },
        rotation: function() {
            return this._model ? this._model.rotation : 0
        },
        visible: function() {
            return this._model && this._model.opacity
        },
        model: function() {
            return this._model
        },
        draw: function(t, e) {
            var r, a = t.ctx,
                o = this._model,
                i = this._rects;
            this.visible() && (a.save(), o.clip && (r = o.area, a.beginPath(), a.rect(r.left, r.top, r.right - r.left, r.bottom - r.top), a.clip()), a.globalAlpha = n(0, o.opacity, 1), a.translate(x(e.x), x(e.y)), a.rotate(o.rotation), v(a, i.frame, o), function(t, e, r, a) {
                var o, n = a.textAlign,
                    i = a.color,
                    l = !!i,
                    s = a.font,
                    u = e.length,
                    d = a.textStrokeColor,
                    c = a.textStrokeWidth,
                    h = d && c;
                if (u && (l || h))
                    for (r = function(t, e, r) {
                            var a = r.lineHeight,
                                o = t.w,
                                n = t.x;
                            return "center" === e ? n += o / 2 : "end" !== e && "right" !== e || (n += o), {
                                h: a,
                                w: o,
                                x: n,
                                y: t.y + a / 2
                            }
                        }(r, n, s), t.font = s.string, t.textAlign = n, t.textBaseline = "middle", t.shadowBlur = a.textShadowBlur, t.shadowColor = a.textShadowColor, l && (t.fillStyle = i), h && (t.lineJoin = "round", t.lineWidth = c, t.strokeStyle = d), o = 0, u = e.length; o < u; ++o) b(t, e[o], {
                        stroked: h,
                        filled: l,
                        w: r.w,
                        x: r.x,
                        y: r.y + r.h * o
                    })
            }(a, o.lines, i.text, o), a.restore())
        }
    });
    var p = Number.MIN_SAFE_INTEGER || -9007199254740991,
        g = Number.MAX_SAFE_INTEGER || 9007199254740991;

    function m(t, e, r) {
        var a = Math.cos(r),
            o = Math.sin(r),
            n = e.x,
            i = e.y;
        return {
            x: n + a * (t.x - n) - o * (t.y - i),
            y: i + o * (t.x - n) + a * (t.y - i)
        }
    }

    function w(t, e) {
        var r, a, o, n, i, l = g,
            s = p,
            u = e.origin;
        for (r = 0; r < t.length; ++r) o = (a = t[r]).x - u.x, n = a.y - u.y, i = e.vx * o + e.vy * n, l = Math.min(l, i), s = Math.max(s, i);
        return {
            min: l,
            max: s
        }
    }

    function M(t, e) {
        var r = e.x - t.x,
            a = e.y - t.y,
            o = Math.sqrt(r * r + a * a);
        return {
            vx: (e.x - t.x) / o,
            vy: (e.y - t.y) / o,
            origin: t,
            ln: o
        }
    }
    var k = function() {
        this._rotation = 0, this._rect = {
            x: 0,
            y: 0,
            w: 0,
            h: 0
        }
    };

    function $(t, e, r) {
        var a = e.positioner(t, e),
            o = a.vx,
            n = a.vy;
        if (!o && !n) return {
            x: a.x,
            y: a.y
        };
        var i = r.w,
            l = r.h,
            s = e.rotation,
            u = Math.abs(i / 2 * Math.cos(s)) + Math.abs(l / 2 * Math.sin(s)),
            d = Math.abs(i / 2 * Math.sin(s)) + Math.abs(l / 2 * Math.cos(s)),
            c = 1 / Math.max(Math.abs(o), Math.abs(n));
        return u *= o * c, d *= n * c, u += e.offset * o, d += e.offset * n, {
            x: a.x + u,
            y: a.y + d
        }
    }
    t.merge(k.prototype, {
        center: function() {
            var t = this._rect;
            return {
                x: t.x + t.w / 2,
                y: t.y + t.h / 2
            }
        },
        update: function(t, e, r) {
            this._rotation = r, this._rect = {
                x: e.x + t.x,
                y: e.y + t.y,
                w: e.w,
                h: e.h
            }
        },
        contains: function(t) {
            var e = this,
                r = e._rect;
            return !((t = m(t, e.center(), -e._rotation)).x < r.x - 1 || t.y < r.y - 1 || t.x > r.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; e < i.length; ++e)
                if (r = w(o, i[e]), a = w(n, i[e]), r.max < a.min || a.max < r.min) return !1;
            return !0
        },
        _points: function() {
            var t = this,
                e = t._rect,
                r = t._rotation,
                a = t.center();
            return [m({
                x: e.x,
                y: e.y
            }, a, r), m({
                x: e.x + e.w,
                y: e.y
            }, a, r), m({
                x: e.x + e.w,
                y: e.y + e.h
            }, a, r), m({
                x: e.x,
                y: e.y + e.h
            }, a, r)]
        }
    });
    var C = {
            prepare: function(t) {
                var e, r, a, o, n, i = [];
                for (e = 0, a = t.length; e < a; ++e)
                    for (r = 0, o = t[e].length; r < o; ++r) n = t[e][r], i.push(n), n.$layout = {
                        _box: new k,
                        _hidable: !1,
                        _visible: !0,
                        _set: e,
                        _idx: n._index
                    };
                return i.sort((function(t, e) {
                    var r = t.$layout,
                        a = e.$layout;
                    return r._idx === a._idx ? a._set - r._set : a._idx - r._idx
                })), this.update(i), i
            },
            update: function(t) {
                var e, r, a, o, n, i = !1;
                for (e = 0, r = t.length; e < r; ++e) o = (a = t[e]).model(), (n = a.$layout)._hidable = o && "auto" === o.display, n._visible = a.visible(), i |= n._hidable;
                i && function(t) {
                    var e, r, a, o, n, i, l;
                    for (e = 0, r = t.length; e < r; ++e)(o = (a = t[e]).$layout)._visible && (l = new Proxy(a._el, {
                        get: (t, e) => t.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 < a; ++r)(n = (o = e[r]).$layout)._visible && (i = o.geometry(), l = $(o._el, o.model(), i), n._box.update(l, i, o.rotation()), o.draw(t, l))
            }
        },
        P = "$default";

    function S(e, r, a, o) {
        if (r) {
            var n, i = a.$context,
                l = a.$groups;
            r[l._set] && (n = r[l._set][l._key]) && !0 === t.callback(n, [i, o]) && (e.$datalabels._dirty = !0, a.update(i))
        }
    }

    function I(t, e) {
        var r, a, o = t.$datalabels,
            n = o._listeners;
        if (n.enter || n.leave) {
            if ("mousemove" === e.type) a = C.lookup(o._labels, e);
            else if ("mouseout" !== e.type) return;
            r = o._hovered, o._hovered = a,
                function(t, e, r, a, o) {
                    var n, i;
                    (r || a) && (r ? a ? r !== a && (i = n = !0) : i = !0 : n = !0, i && S(t, e.leave, r, o), n && S(t, e.enter, a, o))
                }(t, n, r, a, e)
        }
    }
    return {
        id: "datalabels",
        defaults: {
            align: "center",
            anchor: "center",
            backgroundColor: null,
            borderColor: null,
            borderRadius: 0,
            borderWidth: 0,
            clamp: !1,
            clip: !1,
            color: void 0,
            display: !0,
            font: {
                family: void 0,
                lineHeight: 1.2,
                size: void 0,
                style: void 0,
                weight: null
            },
            formatter: function(e) {
                if (t.isNullOrUndef(e)) return null;
                var r, a, o, n = e;
                if (t.isObject(e))
                    if (t.isNullOrUndef(e.label))
                        if (t.isNullOrUndef(e.r))
                            for (n = "", o = 0, a = (r = Object.keys(e)).length; o < a; ++o) n += (0 !== o ? ", " : "") + r[o] + ": " + e[r[o]];
                        else n = e.r;
                else n = e.label;
                return "" + n
            },
            labels: void 0,
            listeners: {},
            offset: 4,
            opacity: 1,
            padding: {
                top: 4,
                right: 4,
                bottom: 4,
                left: 4
            },
            rotation: 0,
            textAlign: "start",
            textStrokeColor: void 0,
            textStrokeWidth: 0,
            textShadowBlur: 0,
            textShadowColor: void 0
        },
        beforeInit: function(t) {
            t.$datalabels = {
                _actives: []
            }
        },
        beforeUpdate: function(t) {
            var e = t.$datalabels;
            e._listened = !1, e._listeners = {}, e._datasets = [], e._labels = []
        },
        afterDatasetUpdate: function(e, r, a) {
            var o, n, i, l, s, u, d, c, h = r.index,
                f = e.$datalabels,
                x = f._datasets[h] = [],
                y = e.isDatasetVisible(h),
                v = e.data.datasets[h],
                b = function(e, r) {
                    var a, o, n, i = e.datalabels,
                        l = [];
                    return !1 === i ? null : (!0 === i && (i = {}), r = t.merge({}, [r, i]), o = r.labels || {}, n = Object.keys(o), delete r.labels, n.length ? n.forEach((function(e) {
                        o[e] && l.push(t.merge({}, [r, o[e], {
                            _key: e
                        }]))
                    })) : l.push(r), a = l.reduce((function(e, r) {
                        return t.each(r.listeners || {}, (function(t, a) {
                            e[a] = e[a] || {}, e[a][r._key || P] = t
                        })), delete r.listeners, e
                    }), {}), {
                        labels: l,
                        listeners: a
                    })
                }(v, a),
                p = r.meta.data || [],
                g = e.ctx;
            for (g.save(), o = 0, i = p.length; o < i; ++o)
                if ((d = p[o]).$datalabels = [], y && d && e.getDataVisibility(o) && !d.skip)
                    for (n = 0, l = b.labels.length; n < l; ++n) u = (s = b.labels[n])._key, (c = new _(s, g, d, o)).$groups = {
                        _set: h,
                        _key: u || P
                    }, c.$context = {
                        active: !1,
                        chart: e,
                        dataIndex: o,
                        dataset: v,
                        datasetIndex: h
                    }, c.update(c.$context), d.$datalabels.push(c), x.push(c);
            g.restore(), t.merge(f._listeners, b.listeners, {
                merger: function(t, e, a) {
                    e[t] = e[t] || {}, e[t][r.index] = a[t], f._listened = !0
                }
            })
        },
        afterUpdate: function(t) {
            t.$datalabels._labels = C.prepare(t.$datalabels._datasets)
        },
        afterDatasetsDraw: function(t) {
            C.draw(t, t.$datalabels._labels)
        },
        beforeEvent: function(t, e) {
            if (t.$datalabels._listened) {
                var r = e.event;
                switch (r.type) {
                    case "mousemove":
                    case "mouseout":
                        I(t, r);
                        break;
                    case "click":
                        ! function(t, e) {
                            var r = t.$datalabels,
                                a = r._listeners.click,
                                o = a && C.lookup(r._labels, e);
                            o && S(t, a, o, e)
                        }(t, r)
                }
            }
        },
        afterEvent: function(t) {
            var e, r, a, o, n, l, s, u = t.$datalabels,
                d = u._actives,
                c = u._actives = t.getActiveElements(),
                h = i(d, c);
            for (e = 0, r = h.length; e < r; ++e)
                if ((n = h[e])[1])
                    for (a = 0, o = (s = n[0].element.$datalabels || []).length; a < o; ++a)(l = s[a]).$context.active = 1 === n[1], l.update(l.$context);
            (u._dirty || h.length) && (C.update(u._labels), t.render()), delete u._dirty
        }
    }
}));