{"version":3,"file":"bundle.js","sources":["../../node_modules/svelte/internal/index.mjs","../../node_modules/svelte-loading-spinners/Circle.svelte","../../src/components/ErrorMessage.svelte","../../node_modules/svelte/store/index.mjs","../../src/stores.js","../../node_modules/svelte/transition/index.mjs","../../src/constants/api.js","../../src/util/jwt.js","../../src/util/api.js","../../src/util/parseCsv.js","../../src/constants/config.js","../../src/components/StatusBar.svelte","../../src/components/SunsetApiSourceAttribution.svelte","../../node_modules/ms/index.js","../../node_modules/debug/src/common.js","../../node_modules/debug/src/browser.js","../../src/components/ThumbnailGrid.svelte","../../src/util/date.js","../../src/components/WalkCalendar.svelte","../../src/views/Calendar.svelte","../../node_modules/@kurkle/color/dist/color.esm.js","../../node_modules/chart.js/dist/chunks/helpers.segment.js","../../node_modules/chart.js/dist/chart.js","../../node_modules/chart.js/auto/auto.js","../../src/views/Stats.svelte","../../src/App.svelte","../../src/main.js"],"sourcesContent":["function noop() { }\nconst identity = x => x;\nfunction assign(tar, src) {\n    // @ts-ignore\n    for (const k in src)\n        tar[k] = src[k];\n    return tar;\n}\n// Adapted from https://github.com/then/is-promise/blob/master/index.js\n// Distributed under MIT License https://github.com/then/is-promise/blob/master/LICENSE\nfunction is_promise(value) {\n    return !!value && (typeof value === 'object' || typeof value === 'function') && typeof value.then === 'function';\n}\nfunction add_location(element, file, line, column, char) {\n    element.__svelte_meta = {\n        loc: { file, line, column, char }\n    };\n}\nfunction run(fn) {\n    return fn();\n}\nfunction blank_object() {\n    return Object.create(null);\n}\nfunction run_all(fns) {\n    fns.forEach(run);\n}\nfunction is_function(thing) {\n    return typeof thing === 'function';\n}\nfunction safe_not_equal(a, b) {\n    return a != a ? b == b : a !== b || ((a && typeof a === 'object') || typeof a === 'function');\n}\nlet src_url_equal_anchor;\nfunction src_url_equal(element_src, url) {\n    if (!src_url_equal_anchor) {\n        src_url_equal_anchor = document.createElement('a');\n    }\n    src_url_equal_anchor.href = url;\n    return element_src === src_url_equal_anchor.href;\n}\nfunction not_equal(a, b) {\n    return a != a ? b == b : a !== b;\n}\nfunction is_empty(obj) {\n    return Object.keys(obj).length === 0;\n}\nfunction validate_store(store, name) {\n    if (store != null && typeof store.subscribe !== 'function') {\n        throw new Error(`'${name}' is not a store with a 'subscribe' method`);\n    }\n}\nfunction subscribe(store, ...callbacks) {\n    if (store == null) {\n        return noop;\n    }\n    const unsub = store.subscribe(...callbacks);\n    return unsub.unsubscribe ? () => unsub.unsubscribe() : unsub;\n}\nfunction get_store_value(store) {\n    let value;\n    subscribe(store, _ => value = _)();\n    return value;\n}\nfunction component_subscribe(component, store, callback) {\n    component.$$.on_destroy.push(subscribe(store, callback));\n}\nfunction create_slot(definition, ctx, $$scope, fn) {\n    if (definition) {\n        const slot_ctx = get_slot_context(definition, ctx, $$scope, fn);\n        return definition[0](slot_ctx);\n    }\n}\nfunction get_slot_context(definition, ctx, $$scope, fn) {\n    return definition[1] && fn\n        ? assign($$scope.ctx.slice(), definition[1](fn(ctx)))\n        : $$scope.ctx;\n}\nfunction get_slot_changes(definition, $$scope, dirty, fn) {\n    if (definition[2] && fn) {\n        const lets = definition[2](fn(dirty));\n        if ($$scope.dirty === undefined) {\n            return lets;\n        }\n        if (typeof lets === 'object') {\n            const merged = [];\n            const len = Math.max($$scope.dirty.length, lets.length);\n            for (let i = 0; i < len; i += 1) {\n                merged[i] = $$scope.dirty[i] | lets[i];\n            }\n            return merged;\n        }\n        return $$scope.dirty | lets;\n    }\n    return $$scope.dirty;\n}\nfunction update_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn) {\n    if (slot_changes) {\n        const slot_context = get_slot_context(slot_definition, ctx, $$scope, get_slot_context_fn);\n        slot.p(slot_context, slot_changes);\n    }\n}\nfunction update_slot(slot, slot_definition, ctx, $$scope, dirty, get_slot_changes_fn, get_slot_context_fn) {\n    const slot_changes = get_slot_changes(slot_definition, $$scope, dirty, get_slot_changes_fn);\n    update_slot_base(slot, slot_definition, ctx, $$scope, slot_changes, get_slot_context_fn);\n}\nfunction get_all_dirty_from_scope($$scope) {\n    if ($$scope.ctx.length > 32) {\n        const dirty = [];\n        const length = $$scope.ctx.length / 32;\n        for (let i = 0; i < length; i++) {\n            dirty[i] = -1;\n        }\n        return dirty;\n    }\n    return -1;\n}\nfunction exclude_internal_props(props) {\n    const result = {};\n    for (const k in props)\n        if (k[0] !== '$')\n            result[k] = props[k];\n    return result;\n}\nfunction compute_rest_props(props, keys) {\n    const rest = {};\n    keys = new Set(keys);\n    for (const k in props)\n        if (!keys.has(k) && k[0] !== '$')\n            rest[k] = props[k];\n    return rest;\n}\nfunction compute_slots(slots) {\n    const result = {};\n    for (const key in slots) {\n        result[key] = true;\n    }\n    return result;\n}\nfunction once(fn) {\n    let ran = false;\n    return function (...args) {\n        if (ran)\n            return;\n        ran = true;\n        fn.call(this, ...args);\n    };\n}\nfunction null_to_empty(value) {\n    return value == null ? '' : value;\n}\nfunction set_store_value(store, ret, value) {\n    store.set(value);\n    return ret;\n}\nconst has_prop = (obj, prop) => Object.prototype.hasOwnProperty.call(obj, prop);\nfunction action_destroyer(action_result) {\n    return action_result && is_function(action_result.destroy) ? action_result.destroy : noop;\n}\nfunction split_css_unit(value) {\n    const split = typeof value === 'string' && value.match(/^\\s*(-?[\\d.]+)([^\\s]*)\\s*$/);\n    return split ? [parseFloat(split[1]), split[2] || 'px'] : [value, 'px'];\n}\nconst contenteditable_truthy_values = ['', true, 1, 'true', 'contenteditable'];\n\nconst is_client = typeof window !== 'undefined';\nlet now = is_client\n    ? () => window.performance.now()\n    : () => Date.now();\nlet raf = is_client ? cb => requestAnimationFrame(cb) : noop;\n// used internally for testing\nfunction set_now(fn) {\n    now = fn;\n}\nfunction set_raf(fn) {\n    raf = fn;\n}\n\nconst tasks = new Set();\nfunction run_tasks(now) {\n    tasks.forEach(task => {\n        if (!task.c(now)) {\n            tasks.delete(task);\n            task.f();\n        }\n    });\n    if (tasks.size !== 0)\n        raf(run_tasks);\n}\n/**\n * For testing purposes only!\n */\nfunction clear_loops() {\n    tasks.clear();\n}\n/**\n * Creates a new task that runs on each raf frame\n * until it returns a falsy value or is aborted\n */\nfunction loop(callback) {\n    let task;\n    if (tasks.size === 0)\n        raf(run_tasks);\n    return {\n        promise: new Promise(fulfill => {\n            tasks.add(task = { c: callback, f: fulfill });\n        }),\n        abort() {\n            tasks.delete(task);\n        }\n    };\n}\n\nconst globals = (typeof window !== 'undefined'\n    ? window\n    : typeof globalThis !== 'undefined'\n        ? globalThis\n        : global);\n\n/**\n * Resize observer singleton.\n * One listener per element only!\n * https://groups.google.com/a/chromium.org/g/blink-dev/c/z6ienONUb5A/m/F5-VcUZtBAAJ\n */\nclass ResizeObserverSingleton {\n    constructor(options) {\n        this.options = options;\n        this._listeners = 'WeakMap' in globals ? new WeakMap() : undefined;\n    }\n    observe(element, listener) {\n        this._listeners.set(element, listener);\n        this._getObserver().observe(element, this.options);\n        return () => {\n            this._listeners.delete(element);\n            this._observer.unobserve(element); // this line can probably be removed\n        };\n    }\n    _getObserver() {\n        var _a;\n        return (_a = this._observer) !== null && _a !== void 0 ? _a : (this._observer = new ResizeObserver((entries) => {\n            var _a;\n            for (const entry of entries) {\n                ResizeObserverSingleton.entries.set(entry.target, entry);\n                (_a = this._listeners.get(entry.target)) === null || _a === void 0 ? void 0 : _a(entry);\n            }\n        }));\n    }\n}\n// Needs to be written like this to pass the tree-shake-test\nResizeObserverSingleton.entries = 'WeakMap' in globals ? new WeakMap() : undefined;\n\n// Track which nodes are claimed during hydration. Unclaimed nodes can then be removed from the DOM\n// at the end of hydration without touching the remaining nodes.\nlet is_hydrating = false;\nfunction start_hydrating() {\n    is_hydrating = true;\n}\nfunction end_hydrating() {\n    is_hydrating = false;\n}\nfunction upper_bound(low, high, key, value) {\n    // Return first index of value larger than input value in the range [low, high)\n    while (low < high) {\n        const mid = low + ((high - low) >> 1);\n        if (key(mid) <= value) {\n            low = mid + 1;\n        }\n        else {\n            high = mid;\n        }\n    }\n    return low;\n}\nfunction init_hydrate(target) {\n    if (target.hydrate_init)\n        return;\n    target.hydrate_init = true;\n    // We know that all children have claim_order values since the unclaimed have been detached if target is not <head>\n    let children = target.childNodes;\n    // If target is <head>, there may be children without claim_order\n    if (target.nodeName === 'HEAD') {\n        const myChildren = [];\n        for (let i = 0; i < children.length; i++) {\n            const node = children[i];\n            if (node.claim_order !== undefined) {\n                myChildren.push(node);\n            }\n        }\n        children = myChildren;\n    }\n    /*\n    * Reorder claimed children optimally.\n    * We can reorder claimed children optimally by finding the longest subsequence of\n    * nodes that are already claimed in order and only moving the rest. The longest\n    * subsequence of nodes that are claimed in order can be found by\n    * computing the longest increasing subsequence of .claim_order values.\n    *\n    * This algorithm is optimal in generating the least amount of reorder operations\n    * possible.\n    *\n    * Proof:\n    * We know that, given a set of reordering operations, the nodes that do not move\n    * always form an increasing subsequence, since they do not move among each other\n    * meaning that they must be already ordered among each other. Thus, the maximal\n    * set of nodes that do not move form a longest increasing subsequence.\n    */\n    // Compute longest increasing subsequence\n    // m: subsequence length j => index k of smallest value that ends an increasing subsequence of length j\n    const m = new Int32Array(children.length + 1);\n    // Predecessor indices + 1\n    const p = new Int32Array(children.length);\n    m[0] = -1;\n    let longest = 0;\n    for (let i = 0; i < children.length; i++) {\n        const current = children[i].claim_order;\n        // Find the largest subsequence length such that it ends in a value less than our current value\n        // upper_bound returns first greater value, so we subtract one\n        // with fast path for when we are on the current longest subsequence\n        const seqLen = ((longest > 0 && children[m[longest]].claim_order <= current) ? longest + 1 : upper_bound(1, longest, idx => children[m[idx]].claim_order, current)) - 1;\n        p[i] = m[seqLen] + 1;\n        const newLen = seqLen + 1;\n        // We can guarantee that current is the smallest value. Otherwise, we would have generated a longer sequence.\n        m[newLen] = i;\n        longest = Math.max(newLen, longest);\n    }\n    // The longest increasing subsequence of nodes (initially reversed)\n    const lis = [];\n    // The rest of the nodes, nodes that will be moved\n    const toMove = [];\n    let last = children.length - 1;\n    for (let cur = m[longest] + 1; cur != 0; cur = p[cur - 1]) {\n        lis.push(children[cur - 1]);\n        for (; last >= cur; last--) {\n            toMove.push(children[last]);\n        }\n        last--;\n    }\n    for (; last >= 0; last--) {\n        toMove.push(children[last]);\n    }\n    lis.reverse();\n    // We sort the nodes being moved to guarantee that their insertion order matches the claim order\n    toMove.sort((a, b) => a.claim_order - b.claim_order);\n    // Finally, we move the nodes\n    for (let i = 0, j = 0; i < toMove.length; i++) {\n        while (j < lis.length && toMove[i].claim_order >= lis[j].claim_order) {\n            j++;\n        }\n        const anchor = j < lis.length ? lis[j] : null;\n        target.insertBefore(toMove[i], anchor);\n    }\n}\nfunction append(target, node) {\n    target.appendChild(node);\n}\nfunction append_styles(target, style_sheet_id, styles) {\n    const append_styles_to = get_root_for_style(target);\n    if (!append_styles_to.getElementById(style_sheet_id)) {\n        const style = element('style');\n        style.id = style_sheet_id;\n        style.textContent = styles;\n        append_stylesheet(append_styles_to, style);\n    }\n}\nfunction get_root_for_style(node) {\n    if (!node)\n        return document;\n    const root = node.getRootNode ? node.getRootNode() : node.ownerDocument;\n    if (root && root.host) {\n        return root;\n    }\n    return node.ownerDocument;\n}\nfunction append_empty_stylesheet(node) {\n    const style_element = element('style');\n    append_stylesheet(get_root_for_style(node), style_element);\n    return style_element.sheet;\n}\nfunction append_stylesheet(node, style) {\n    append(node.head || node, style);\n    return style.sheet;\n}\nfunction append_hydration(target, node) {\n    if (is_hydrating) {\n        init_hydrate(target);\n        if ((target.actual_end_child === undefined) || ((target.actual_end_child !== null) && (target.actual_end_child.parentNode !== target))) {\n            target.actual_end_child = target.firstChild;\n        }\n        // Skip nodes of undefined ordering\n        while ((target.actual_end_child !== null) && (target.actual_end_child.claim_order === undefined)) {\n            target.actual_end_child = target.actual_end_child.nextSibling;\n        }\n        if (node !== target.actual_end_child) {\n            // We only insert if the ordering of this node should be modified or the parent node is not target\n            if (node.claim_order !== undefined || node.parentNode !== target) {\n                target.insertBefore(node, target.actual_end_child);\n            }\n        }\n        else {\n            target.actual_end_child = node.nextSibling;\n        }\n    }\n    else if (node.parentNode !== target || node.nextSibling !== null) {\n        target.appendChild(node);\n    }\n}\nfunction insert(target, node, anchor) {\n    target.insertBefore(node, anchor || null);\n}\nfunction insert_hydration(target, node, anchor) {\n    if (is_hydrating && !anchor) {\n        append_hydration(target, node);\n    }\n    else if (node.parentNode !== target || node.nextSibling != anchor) {\n        target.insertBefore(node, anchor || null);\n    }\n}\nfunction detach(node) {\n    if (node.parentNode) {\n        node.parentNode.removeChild(node);\n    }\n}\nfunction destroy_each(iterations, detaching) {\n    for (let i = 0; i < iterations.length; i += 1) {\n        if (iterations[i])\n            iterations[i].d(detaching);\n    }\n}\nfunction element(name) {\n    return document.createElement(name);\n}\nfunction element_is(name, is) {\n    return document.createElement(name, { is });\n}\nfunction object_without_properties(obj, exclude) {\n    const target = {};\n    for (const k in obj) {\n        if (has_prop(obj, k)\n            // @ts-ignore\n            && exclude.indexOf(k) === -1) {\n            // @ts-ignore\n            target[k] = obj[k];\n        }\n    }\n    return target;\n}\nfunction svg_element(name) {\n    return document.createElementNS('http://www.w3.org/2000/svg', name);\n}\nfunction text(data) {\n    return document.createTextNode(data);\n}\nfunction space() {\n    return text(' ');\n}\nfunction empty() {\n    return text('');\n}\nfunction comment(content) {\n    return document.createComment(content);\n}\nfunction listen(node, event, handler, options) {\n    node.addEventListener(event, handler, options);\n    return () => node.removeEventListener(event, handler, options);\n}\nfunction prevent_default(fn) {\n    return function (event) {\n        event.preventDefault();\n        // @ts-ignore\n        return fn.call(this, event);\n    };\n}\nfunction stop_propagation(fn) {\n    return function (event) {\n        event.stopPropagation();\n        // @ts-ignore\n        return fn.call(this, event);\n    };\n}\nfunction stop_immediate_propagation(fn) {\n    return function (event) {\n        event.stopImmediatePropagation();\n        // @ts-ignore\n        return fn.call(this, event);\n    };\n}\nfunction self(fn) {\n    return function (event) {\n        // @ts-ignore\n        if (event.target === this)\n            fn.call(this, event);\n    };\n}\nfunction trusted(fn) {\n    return function (event) {\n        // @ts-ignore\n        if (event.isTrusted)\n            fn.call(this, event);\n    };\n}\nfunction attr(node, attribute, value) {\n    if (value == null)\n        node.removeAttribute(attribute);\n    else if (node.getAttribute(attribute) !== value)\n        node.setAttribute(attribute, value);\n}\n/**\n * List of attributes that should always be set through the attr method,\n * because updating them through the property setter doesn't work reliably.\n * In the example of `width`/`height`, the problem is that the setter only\n * accepts numeric values, but the attribute can also be set to a string like `50%`.\n * If this list becomes too big, rethink this approach.\n */\nconst always_set_through_set_attribute = ['width', 'height'];\nfunction set_attributes(node, attributes) {\n    // @ts-ignore\n    const descriptors = Object.getOwnPropertyDescriptors(node.__proto__);\n    for (const key in attributes) {\n        if (attributes[key] == null) {\n            node.removeAttribute(key);\n        }\n        else if (key === 'style') {\n            node.style.cssText = attributes[key];\n        }\n        else if (key === '__value') {\n            node.value = node[key] = attributes[key];\n        }\n        else if (descriptors[key] && descriptors[key].set && always_set_through_set_attribute.indexOf(key) === -1) {\n            node[key] = attributes[key];\n        }\n        else {\n            attr(node, key, attributes[key]);\n        }\n    }\n}\nfunction set_svg_attributes(node, attributes) {\n    for (const key in attributes) {\n        attr(node, key, attributes[key]);\n    }\n}\nfunction set_custom_element_data_map(node, data_map) {\n    Object.keys(data_map).forEach((key) => {\n        set_custom_element_data(node, key, data_map[key]);\n    });\n}\nfunction set_custom_element_data(node, prop, value) {\n    if (prop in node) {\n        node[prop] = typeof node[prop] === 'boolean' && value === '' ? true : value;\n    }\n    else {\n        attr(node, prop, value);\n    }\n}\nfunction set_dynamic_element_data(tag) {\n    return (/-/.test(tag)) ? set_custom_element_data_map : set_attributes;\n}\nfunction xlink_attr(node, attribute, value) {\n    node.setAttributeNS('http://www.w3.org/1999/xlink', attribute, value);\n}\nfunction get_binding_group_value(group, __value, checked) {\n    const value = new Set();\n    for (let i = 0; i < group.length; i += 1) {\n        if (group[i].checked)\n            value.add(group[i].__value);\n    }\n    if (!checked) {\n        value.delete(__value);\n    }\n    return Array.from(value);\n}\nfunction init_binding_group(group) {\n    let _inputs;\n    return {\n        /* push */ p(...inputs) {\n            _inputs = inputs;\n            _inputs.forEach(input => group.push(input));\n        },\n        /* remove */ r() {\n            _inputs.forEach(input => group.splice(group.indexOf(input), 1));\n        }\n    };\n}\nfunction init_binding_group_dynamic(group, indexes) {\n    let _group = get_binding_group(group);\n    let _inputs;\n    function get_binding_group(group) {\n        for (let i = 0; i < indexes.length; i++) {\n            group = group[indexes[i]] = group[indexes[i]] || [];\n        }\n        return group;\n    }\n    function push() {\n        _inputs.forEach(input => _group.push(input));\n    }\n    function remove() {\n        _inputs.forEach(input => _group.splice(_group.indexOf(input), 1));\n    }\n    return {\n        /* update */ u(new_indexes) {\n            indexes = new_indexes;\n            const new_group = get_binding_group(group);\n            if (new_group !== _group) {\n                remove();\n                _group = new_group;\n                push();\n            }\n        },\n        /* push */ p(...inputs) {\n            _inputs = inputs;\n            push();\n        },\n        /* remove */ r: remove\n    };\n}\nfunction to_number(value) {\n    return value === '' ? null : +value;\n}\nfunction time_ranges_to_array(ranges) {\n    const array = [];\n    for (let i = 0; i < ranges.length; i += 1) {\n        array.push({ start: ranges.start(i), end: ranges.end(i) });\n    }\n    return array;\n}\nfunction children(element) {\n    return Array.from(element.childNodes);\n}\nfunction init_claim_info(nodes) {\n    if (nodes.claim_info === undefined) {\n        nodes.claim_info = { last_index: 0, total_claimed: 0 };\n    }\n}\nfunction claim_node(nodes, predicate, processNode, createNode, dontUpdateLastIndex = false) {\n    // Try to find nodes in an order such that we lengthen the longest increasing subsequence\n    init_claim_info(nodes);\n    const resultNode = (() => {\n        // We first try to find an element after the previous one\n        for (let i = nodes.claim_info.last_index; i < nodes.length; i++) {\n            const node = nodes[i];\n            if (predicate(node)) {\n                const replacement = processNode(node);\n                if (replacement === undefined) {\n                    nodes.splice(i, 1);\n                }\n                else {\n                    nodes[i] = replacement;\n                }\n                if (!dontUpdateLastIndex) {\n                    nodes.claim_info.last_index = i;\n                }\n                return node;\n            }\n        }\n        // Otherwise, we try to find one before\n        // We iterate in reverse so that we don't go too far back\n        for (let i = nodes.claim_info.last_index - 1; i >= 0; i--) {\n            const node = nodes[i];\n            if (predicate(node)) {\n                const replacement = processNode(node);\n                if (replacement === undefined) {\n                    nodes.splice(i, 1);\n                }\n                else {\n                    nodes[i] = replacement;\n                }\n                if (!dontUpdateLastIndex) {\n                    nodes.claim_info.last_index = i;\n                }\n                else if (replacement === undefined) {\n                    // Since we spliced before the last_index, we decrease it\n                    nodes.claim_info.last_index--;\n                }\n                return node;\n            }\n        }\n        // If we can't find any matching node, we create a new one\n        return createNode();\n    })();\n    resultNode.claim_order = nodes.claim_info.total_claimed;\n    nodes.claim_info.total_claimed += 1;\n    return resultNode;\n}\nfunction claim_element_base(nodes, name, attributes, create_element) {\n    return claim_node(nodes, (node) => node.nodeName === name, (node) => {\n        const remove = [];\n        for (let j = 0; j < node.attributes.length; j++) {\n            const attribute = node.attributes[j];\n            if (!attributes[attribute.name]) {\n                remove.push(attribute.name);\n            }\n        }\n        remove.forEach(v => node.removeAttribute(v));\n        return undefined;\n    }, () => create_element(name));\n}\nfunction claim_element(nodes, name, attributes) {\n    return claim_element_base(nodes, name, attributes, element);\n}\nfunction claim_svg_element(nodes, name, attributes) {\n    return claim_element_base(nodes, name, attributes, svg_element);\n}\nfunction claim_text(nodes, data) {\n    return claim_node(nodes, (node) => node.nodeType === 3, (node) => {\n        const dataStr = '' + data;\n        if (node.data.startsWith(dataStr)) {\n            if (node.data.length !== dataStr.length) {\n                return node.splitText(dataStr.length);\n            }\n        }\n        else {\n            node.data = dataStr;\n        }\n    }, () => text(data), true // Text nodes should not update last index since it is likely not worth it to eliminate an increasing subsequence of actual elements\n    );\n}\nfunction claim_space(nodes) {\n    return claim_text(nodes, ' ');\n}\nfunction claim_comment(nodes, data) {\n    return claim_node(nodes, (node) => node.nodeType === 8, (node) => {\n        node.data = '' + data;\n        return undefined;\n    }, () => comment(data), true);\n}\nfunction find_comment(nodes, text, start) {\n    for (let i = start; i < nodes.length; i += 1) {\n        const node = nodes[i];\n        if (node.nodeType === 8 /* comment node */ && node.textContent.trim() === text) {\n            return i;\n        }\n    }\n    return nodes.length;\n}\nfunction claim_html_tag(nodes, is_svg) {\n    // find html opening tag\n    const start_index = find_comment(nodes, 'HTML_TAG_START', 0);\n    const end_index = find_comment(nodes, 'HTML_TAG_END', start_index);\n    if (start_index === end_index) {\n        return new HtmlTagHydration(undefined, is_svg);\n    }\n    init_claim_info(nodes);\n    const html_tag_nodes = nodes.splice(start_index, end_index - start_index + 1);\n    detach(html_tag_nodes[0]);\n    detach(html_tag_nodes[html_tag_nodes.length - 1]);\n    const claimed_nodes = html_tag_nodes.slice(1, html_tag_nodes.length - 1);\n    for (const n of claimed_nodes) {\n        n.claim_order = nodes.claim_info.total_claimed;\n        nodes.claim_info.total_claimed += 1;\n    }\n    return new HtmlTagHydration(claimed_nodes, is_svg);\n}\nfunction set_data(text, data) {\n    data = '' + data;\n    if (text.data === data)\n        return;\n    text.data = data;\n}\nfunction set_data_contenteditable(text, data) {\n    data = '' + data;\n    if (text.wholeText === data)\n        return;\n    text.data = data;\n}\nfunction set_data_maybe_contenteditable(text, data, attr_value) {\n    if (~contenteditable_truthy_values.indexOf(attr_value)) {\n        set_data_contenteditable(text, data);\n    }\n    else {\n        set_data(text, data);\n    }\n}\nfunction set_input_value(input, value) {\n    input.value = value == null ? '' : value;\n}\nfunction set_input_type(input, type) {\n    try {\n        input.type = type;\n    }\n    catch (e) {\n        // do nothing\n    }\n}\nfunction set_style(node, key, value, important) {\n    if (value == null) {\n        node.style.removeProperty(key);\n    }\n    else {\n        node.style.setProperty(key, value, important ? 'important' : '');\n    }\n}\nfunction select_option(select, value, mounting) {\n    for (let i = 0; i < select.options.length; i += 1) {\n        const option = select.options[i];\n        if (option.__value === value) {\n            option.selected = true;\n            return;\n        }\n    }\n    if (!mounting || value !== undefined) {\n        select.selectedIndex = -1; // no option should be selected\n    }\n}\nfunction select_options(select, value) {\n    for (let i = 0; i < select.options.length; i += 1) {\n        const option = select.options[i];\n        option.selected = ~value.indexOf(option.__value);\n    }\n}\nfunction select_value(select) {\n    const selected_option = select.querySelector(':checked');\n    return selected_option && selected_option.__value;\n}\nfunction select_multiple_value(select) {\n    return [].map.call(select.querySelectorAll(':checked'), option => option.__value);\n}\n// unfortunately this can't be a constant as that wouldn't be tree-shakeable\n// so we cache the result instead\nlet crossorigin;\nfunction is_crossorigin() {\n    if (crossorigin === undefined) {\n        crossorigin = false;\n        try {\n            if (typeof window !== 'undefined' && window.parent) {\n                void window.parent.document;\n            }\n        }\n        catch (error) {\n            crossorigin = true;\n        }\n    }\n    return crossorigin;\n}\nfunction add_iframe_resize_listener(node, fn) {\n    const computed_style = getComputedStyle(node);\n    if (computed_style.position === 'static') {\n        node.style.position = 'relative';\n    }\n    const iframe = element('iframe');\n    iframe.setAttribute('style', 'display: block; position: absolute; top: 0; left: 0; width: 100%; height: 100%; ' +\n        'overflow: hidden; border: 0; opacity: 0; pointer-events: none; z-index: -1;');\n    iframe.setAttribute('aria-hidden', 'true');\n    iframe.tabIndex = -1;\n    const crossorigin = is_crossorigin();\n    let unsubscribe;\n    if (crossorigin) {\n        iframe.src = \"data:text/html,<script>onresize=function(){parent.postMessage(0,'*')}</script>\";\n        unsubscribe = listen(window, 'message', (event) => {\n            if (event.source === iframe.contentWindow)\n                fn();\n        });\n    }\n    else {\n        iframe.src = 'about:blank';\n        iframe.onload = () => {\n            unsubscribe = listen(iframe.contentWindow, 'resize', fn);\n            // make sure an initial resize event is fired _after_ the iframe is loaded (which is asynchronous)\n            // see https://github.com/sveltejs/svelte/issues/4233\n            fn();\n        };\n    }\n    append(node, iframe);\n    return () => {\n        if (crossorigin) {\n            unsubscribe();\n        }\n        else if (unsubscribe && iframe.contentWindow) {\n            unsubscribe();\n        }\n        detach(iframe);\n    };\n}\nconst resize_observer_content_box = /* @__PURE__ */ new ResizeObserverSingleton({ box: 'content-box' });\nconst resize_observer_border_box = /* @__PURE__ */ new ResizeObserverSingleton({ box: 'border-box' });\nconst resize_observer_device_pixel_content_box = /* @__PURE__ */ new ResizeObserverSingleton({ box: 'device-pixel-content-box' });\nfunction toggle_class(element, name, toggle) {\n    element.classList[toggle ? 'add' : 'remove'](name);\n}\nfunction custom_event(type, detail, { bubbles = false, cancelable = false } = {}) {\n    const e = document.createEvent('CustomEvent');\n    e.initCustomEvent(type, bubbles, cancelable, detail);\n    return e;\n}\nfunction query_selector_all(selector, parent = document.body) {\n    return Array.from(parent.querySelectorAll(selector));\n}\nfunction head_selector(nodeId, head) {\n    const result = [];\n    let started = 0;\n    for (const node of head.childNodes) {\n        if (node.nodeType === 8 /* comment node */) {\n            const comment = node.textContent.trim();\n            if (comment === `HEAD_${nodeId}_END`) {\n                started -= 1;\n                result.push(node);\n            }\n            else if (comment === `HEAD_${nodeId}_START`) {\n                started += 1;\n                result.push(node);\n            }\n        }\n        else if (started > 0) {\n            result.push(node);\n        }\n    }\n    return result;\n}\nclass HtmlTag {\n    constructor(is_svg = false) {\n        this.is_svg = false;\n        this.is_svg = is_svg;\n        this.e = this.n = null;\n    }\n    c(html) {\n        this.h(html);\n    }\n    m(html, target, anchor = null) {\n        if (!this.e) {\n            if (this.is_svg)\n                this.e = svg_element(target.nodeName);\n            /** #7364  target for <template> may be provided as #document-fragment(11) */\n            else\n                this.e = element((target.nodeType === 11 ? 'TEMPLATE' : target.nodeName));\n            this.t = target.tagName !== 'TEMPLATE' ? target : target.content;\n            this.c(html);\n        }\n        this.i(anchor);\n    }\n    h(html) {\n        this.e.innerHTML = html;\n        this.n = Array.from(this.e.nodeName === 'TEMPLATE' ? this.e.content.childNodes : this.e.childNodes);\n    }\n    i(anchor) {\n        for (let i = 0; i < this.n.length; i += 1) {\n            insert(this.t, this.n[i], anchor);\n        }\n    }\n    p(html) {\n        this.d();\n        this.h(html);\n        this.i(this.a);\n    }\n    d() {\n        this.n.forEach(detach);\n    }\n}\nclass HtmlTagHydration extends HtmlTag {\n    constructor(claimed_nodes, is_svg = false) {\n        super(is_svg);\n        this.e = this.n = null;\n        this.l = claimed_nodes;\n    }\n    c(html) {\n        if (this.l) {\n            this.n = this.l;\n        }\n        else {\n            super.c(html);\n        }\n    }\n    i(anchor) {\n        for (let i = 0; i < this.n.length; i += 1) {\n            insert_hydration(this.t, this.n[i], anchor);\n        }\n    }\n}\nfunction attribute_to_object(attributes) {\n    const result = {};\n    for (const attribute of attributes) {\n        result[attribute.name] = attribute.value;\n    }\n    return result;\n}\nfunction get_custom_elements_slots(element) {\n    const result = {};\n    element.childNodes.forEach((node) => {\n        result[node.slot || 'default'] = true;\n    });\n    return result;\n}\nfunction construct_svelte_component(component, props) {\n    return new component(props);\n}\n\n// we need to store the information for multiple documents because a Svelte application could also contain iframes\n// https://github.com/sveltejs/svelte/issues/3624\nconst managed_styles = new Map();\nlet active = 0;\n// https://github.com/darkskyapp/string-hash/blob/master/index.js\nfunction hash(str) {\n    let hash = 5381;\n    let i = str.length;\n    while (i--)\n        hash = ((hash << 5) - hash) ^ str.charCodeAt(i);\n    return hash >>> 0;\n}\nfunction create_style_information(doc, node) {\n    const info = { stylesheet: append_empty_stylesheet(node), rules: {} };\n    managed_styles.set(doc, info);\n    return info;\n}\nfunction create_rule(node, a, b, duration, delay, ease, fn, uid = 0) {\n    const step = 16.666 / duration;\n    let keyframes = '{\\n';\n    for (let p = 0; p <= 1; p += step) {\n        const t = a + (b - a) * ease(p);\n        keyframes += p * 100 + `%{${fn(t, 1 - t)}}\\n`;\n    }\n    const rule = keyframes + `100% {${fn(b, 1 - b)}}\\n}`;\n    const name = `__svelte_${hash(rule)}_${uid}`;\n    const doc = get_root_for_style(node);\n    const { stylesheet, rules } = managed_styles.get(doc) || create_style_information(doc, node);\n    if (!rules[name]) {\n        rules[name] = true;\n        stylesheet.insertRule(`@keyframes ${name} ${rule}`, stylesheet.cssRules.length);\n    }\n    const animation = node.style.animation || '';\n    node.style.animation = `${animation ? `${animation}, ` : ''}${name} ${duration}ms linear ${delay}ms 1 both`;\n    active += 1;\n    return name;\n}\nfunction delete_rule(node, name) {\n    const previous = (node.style.animation || '').split(', ');\n    const next = previous.filter(name\n        ? anim => anim.indexOf(name) < 0 // remove specific animation\n        : anim => anim.indexOf('__svelte') === -1 // remove all Svelte animations\n    );\n    const deleted = previous.length - next.length;\n    if (deleted) {\n        node.style.animation = next.join(', ');\n        active -= deleted;\n        if (!active)\n            clear_rules();\n    }\n}\nfunction clear_rules() {\n    raf(() => {\n        if (active)\n            return;\n        managed_styles.forEach(info => {\n            const { ownerNode } = info.stylesheet;\n            // there is no ownerNode if it runs on jsdom.\n            if (ownerNode)\n                detach(ownerNode);\n        });\n        managed_styles.clear();\n    });\n}\n\nfunction create_animation(node, from, fn, params) {\n    if (!from)\n        return noop;\n    const to = node.getBoundingClientRect();\n    if (from.left === to.left && from.right === to.right && from.top === to.top && from.bottom === to.bottom)\n        return noop;\n    const { delay = 0, duration = 300, easing = identity, \n    // @ts-ignore todo: should this be separated from destructuring? Or start/end added to public api and documentation?\n    start: start_time = now() + delay, \n    // @ts-ignore todo:\n    end = start_time + duration, tick = noop, css } = fn(node, { from, to }, params);\n    let running = true;\n    let started = false;\n    let name;\n    function start() {\n        if (css) {\n            name = create_rule(node, 0, 1, duration, delay, easing, css);\n        }\n        if (!delay) {\n            started = true;\n        }\n    }\n    function stop() {\n        if (css)\n            delete_rule(node, name);\n        running = false;\n    }\n    loop(now => {\n        if (!started && now >= start_time) {\n            started = true;\n        }\n        if (started && now >= end) {\n            tick(1, 0);\n            stop();\n        }\n        if (!running) {\n            return false;\n        }\n        if (started) {\n            const p = now - start_time;\n            const t = 0 + 1 * easing(p / duration);\n            tick(t, 1 - t);\n        }\n        return true;\n    });\n    start();\n    tick(0, 1);\n    return stop;\n}\nfunction fix_position(node) {\n    const style = getComputedStyle(node);\n    if (style.position !== 'absolute' && style.position !== 'fixed') {\n        const { width, height } = style;\n        const a = node.getBoundingClientRect();\n        node.style.position = 'absolute';\n        node.style.width = width;\n        node.style.height = height;\n        add_transform(node, a);\n    }\n}\nfunction add_transform(node, a) {\n    const b = node.getBoundingClientRect();\n    if (a.left !== b.left || a.top !== b.top) {\n        const style = getComputedStyle(node);\n        const transform = style.transform === 'none' ? '' : style.transform;\n        node.style.transform = `${transform} translate(${a.left - b.left}px, ${a.top - b.top}px)`;\n    }\n}\n\nlet current_component;\nfunction set_current_component(component) {\n    current_component = component;\n}\nfunction get_current_component() {\n    if (!current_component)\n        throw new Error('Function called outside component initialization');\n    return current_component;\n}\n/**\n * Schedules a callback to run immediately before the component is updated after any state change.\n *\n * The first time the callback runs will be before the initial `onMount`\n *\n * https://svelte.dev/docs#run-time-svelte-beforeupdate\n */\nfunction beforeUpdate(fn) {\n    get_current_component().$$.before_update.push(fn);\n}\n/**\n * The `onMount` function schedules a callback to run as soon as the component has been mounted to the DOM.\n * It must be called during the component's initialisation (but doesn't need to live *inside* the component;\n * it can be called from an external module).\n *\n * `onMount` does not run inside a [server-side component](/docs#run-time-server-side-component-api).\n *\n * https://svelte.dev/docs#run-time-svelte-onmount\n */\nfunction onMount(fn) {\n    get_current_component().$$.on_mount.push(fn);\n}\n/**\n * Schedules a callback to run immediately after the component has been updated.\n *\n * The first time the callback runs will be after the initial `onMount`\n */\nfunction afterUpdate(fn) {\n    get_current_component().$$.after_update.push(fn);\n}\n/**\n * Schedules a callback to run immediately before the component is unmounted.\n *\n * Out of `onMount`, `beforeUpdate`, `afterUpdate` and `onDestroy`, this is the\n * only one that runs inside a server-side component.\n *\n * https://svelte.dev/docs#run-time-svelte-ondestroy\n */\nfunction onDestroy(fn) {\n    get_current_component().$$.on_destroy.push(fn);\n}\n/**\n * Creates an event dispatcher that can be used to dispatch [component events](/docs#template-syntax-component-directives-on-eventname).\n * Event dispatchers are functions that can take two arguments: `name` and `detail`.\n *\n * Component events created with `createEventDispatcher` create a\n * [CustomEvent](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent).\n * These events do not [bubble](https://developer.mozilla.org/en-US/docs/Learn/JavaScript/Building_blocks/Events#Event_bubbling_and_capture).\n * The `detail` argument corresponds to the [CustomEvent.detail](https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/detail)\n * property and can contain any type of data.\n *\n * https://svelte.dev/docs#run-time-svelte-createeventdispatcher\n */\nfunction createEventDispatcher() {\n    const component = get_current_component();\n    return (type, detail, { cancelable = false } = {}) => {\n        const callbacks = component.$$.callbacks[type];\n        if (callbacks) {\n            // TODO are there situations where events could be dispatched\n            // in a server (non-DOM) environment?\n            const event = custom_event(type, detail, { cancelable });\n            callbacks.slice().forEach(fn => {\n                fn.call(component, event);\n            });\n            return !event.defaultPrevented;\n        }\n        return true;\n    };\n}\n/**\n * Associates an arbitrary `context` object with the current component and the specified `key`\n * and returns that object. The context is then available to children of the component\n * (including slotted content) with `getContext`.\n *\n * Like lifecycle functions, this must be called during component initialisation.\n *\n * https://svelte.dev/docs#run-time-svelte-setcontext\n */\nfunction setContext(key, context) {\n    get_current_component().$$.context.set(key, context);\n    return context;\n}\n/**\n * Retrieves the context that belongs to the closest parent component with the specified `key`.\n * Must be called during component initialisation.\n *\n * https://svelte.dev/docs#run-time-svelte-getcontext\n */\nfunction getContext(key) {\n    return get_current_component().$$.context.get(key);\n}\n/**\n * Retrieves the whole context map that belongs to the closest parent component.\n * Must be called during component initialisation. Useful, for example, if you\n * programmatically create a component and want to pass the existing context to it.\n *\n * https://svelte.dev/docs#run-time-svelte-getallcontexts\n */\nfunction getAllContexts() {\n    return get_current_component().$$.context;\n}\n/**\n * Checks whether a given `key` has been set in the context of a parent component.\n * Must be called during component initialisation.\n *\n * https://svelte.dev/docs#run-time-svelte-hascontext\n */\nfunction hasContext(key) {\n    return get_current_component().$$.context.has(key);\n}\n// TODO figure out if we still want to support\n// shorthand events, or if we want to implement\n// a real bubbling mechanism\nfunction bubble(component, event) {\n    const callbacks = component.$$.callbacks[event.type];\n    if (callbacks) {\n        // @ts-ignore\n        callbacks.slice().forEach(fn => fn.call(this, event));\n    }\n}\n\nconst dirty_components = [];\nconst intros = { enabled: false };\nconst binding_callbacks = [];\nlet render_callbacks = [];\nconst flush_callbacks = [];\nconst resolved_promise = /* @__PURE__ */ Promise.resolve();\nlet update_scheduled = false;\nfunction schedule_update() {\n    if (!update_scheduled) {\n        update_scheduled = true;\n        resolved_promise.then(flush);\n    }\n}\nfunction tick() {\n    schedule_update();\n    return resolved_promise;\n}\nfunction add_render_callback(fn) {\n    render_callbacks.push(fn);\n}\nfunction add_flush_callback(fn) {\n    flush_callbacks.push(fn);\n}\n// flush() calls callbacks in this order:\n// 1. All beforeUpdate callbacks, in order: parents before children\n// 2. All bind:this callbacks, in reverse order: children before parents.\n// 3. All afterUpdate callbacks, in order: parents before children. EXCEPT\n//    for afterUpdates called during the initial onMount, which are called in\n//    reverse order: children before parents.\n// Since callbacks might update component values, which could trigger another\n// call to flush(), the following steps guard against this:\n// 1. During beforeUpdate, any updated components will be added to the\n//    dirty_components array and will cause a reentrant call to flush(). Because\n//    the flush index is kept outside the function, the reentrant call will pick\n//    up where the earlier call left off and go through all dirty components. The\n//    current_component value is saved and restored so that the reentrant call will\n//    not interfere with the \"parent\" flush() call.\n// 2. bind:this callbacks cannot trigger new flush() calls.\n// 3. During afterUpdate, any updated components will NOT have their afterUpdate\n//    callback called a second time; the seen_callbacks set, outside the flush()\n//    function, guarantees this behavior.\nconst seen_callbacks = new Set();\nlet flushidx = 0; // Do *not* move this inside the flush() function\nfunction flush() {\n    // Do not reenter flush while dirty components are updated, as this can\n    // result in an infinite loop. Instead, let the inner flush handle it.\n    // Reentrancy is ok afterwards for bindings etc.\n    if (flushidx !== 0) {\n        return;\n    }\n    const saved_component = current_component;\n    do {\n        // first, call beforeUpdate functions\n        // and update components\n        try {\n            while (flushidx < dirty_components.length) {\n                const component = dirty_components[flushidx];\n                flushidx++;\n                set_current_component(component);\n                update(component.$$);\n            }\n        }\n        catch (e) {\n            // reset dirty state to not end up in a deadlocked state and then rethrow\n            dirty_components.length = 0;\n            flushidx = 0;\n            throw e;\n        }\n        set_current_component(null);\n        dirty_components.length = 0;\n        flushidx = 0;\n        while (binding_callbacks.length)\n            binding_callbacks.pop()();\n        // then, once components are updated, call\n        // afterUpdate functions. This may cause\n        // subsequent updates...\n        for (let i = 0; i < render_callbacks.length; i += 1) {\n            const callback = render_callbacks[i];\n            if (!seen_callbacks.has(callback)) {\n                // ...so guard against infinite loops\n                seen_callbacks.add(callback);\n                callback();\n            }\n        }\n        render_callbacks.length = 0;\n    } while (dirty_components.length);\n    while (flush_callbacks.length) {\n        flush_callbacks.pop()();\n    }\n    update_scheduled = false;\n    seen_callbacks.clear();\n    set_current_component(saved_component);\n}\nfunction update($$) {\n    if ($$.fragment !== null) {\n        $$.update();\n        run_all($$.before_update);\n        const dirty = $$.dirty;\n        $$.dirty = [-1];\n        $$.fragment && $$.fragment.p($$.ctx, dirty);\n        $$.after_update.forEach(add_render_callback);\n    }\n}\n/**\n * Useful for example to execute remaining `afterUpdate` callbacks before executing `destroy`.\n */\nfunction flush_render_callbacks(fns) {\n    const filtered = [];\n    const targets = [];\n    render_callbacks.forEach((c) => fns.indexOf(c) === -1 ? filtered.push(c) : targets.push(c));\n    targets.forEach((c) => c());\n    render_callbacks = filtered;\n}\n\nlet promise;\nfunction wait() {\n    if (!promise) {\n        promise = Promise.resolve();\n        promise.then(() => {\n            promise = null;\n        });\n    }\n    return promise;\n}\nfunction dispatch(node, direction, kind) {\n    node.dispatchEvent(custom_event(`${direction ? 'intro' : 'outro'}${kind}`));\n}\nconst outroing = new Set();\nlet outros;\nfunction group_outros() {\n    outros = {\n        r: 0,\n        c: [],\n        p: outros // parent group\n    };\n}\nfunction check_outros() {\n    if (!outros.r) {\n        run_all(outros.c);\n    }\n    outros = outros.p;\n}\nfunction transition_in(block, local) {\n    if (block && block.i) {\n        outroing.delete(block);\n        block.i(local);\n    }\n}\nfunction transition_out(block, local, detach, callback) {\n    if (block && block.o) {\n        if (outroing.has(block))\n            return;\n        outroing.add(block);\n        outros.c.push(() => {\n            outroing.delete(block);\n            if (callback) {\n                if (detach)\n                    block.d(1);\n                callback();\n            }\n        });\n        block.o(local);\n    }\n    else if (callback) {\n        callback();\n    }\n}\nconst null_transition = { duration: 0 };\nfunction create_in_transition(node, fn, params) {\n    const options = { direction: 'in' };\n    let config = fn(node, params, options);\n    let running = false;\n    let animation_name;\n    let task;\n    let uid = 0;\n    function cleanup() {\n        if (animation_name)\n            delete_rule(node, animation_name);\n    }\n    function go() {\n        const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n        if (css)\n            animation_name = create_rule(node, 0, 1, duration, delay, easing, css, uid++);\n        tick(0, 1);\n        const start_time = now() + delay;\n        const end_time = start_time + duration;\n        if (task)\n            task.abort();\n        running = true;\n        add_render_callback(() => dispatch(node, true, 'start'));\n        task = loop(now => {\n            if (running) {\n                if (now >= end_time) {\n                    tick(1, 0);\n                    dispatch(node, true, 'end');\n                    cleanup();\n                    return running = false;\n                }\n                if (now >= start_time) {\n                    const t = easing((now - start_time) / duration);\n                    tick(t, 1 - t);\n                }\n            }\n            return running;\n        });\n    }\n    let started = false;\n    return {\n        start() {\n            if (started)\n                return;\n            started = true;\n            delete_rule(node);\n            if (is_function(config)) {\n                config = config(options);\n                wait().then(go);\n            }\n            else {\n                go();\n            }\n        },\n        invalidate() {\n            started = false;\n        },\n        end() {\n            if (running) {\n                cleanup();\n                running = false;\n            }\n        }\n    };\n}\nfunction create_out_transition(node, fn, params) {\n    const options = { direction: 'out' };\n    let config = fn(node, params, options);\n    let running = true;\n    let animation_name;\n    const group = outros;\n    group.r += 1;\n    function go() {\n        const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n        if (css)\n            animation_name = create_rule(node, 1, 0, duration, delay, easing, css);\n        const start_time = now() + delay;\n        const end_time = start_time + duration;\n        add_render_callback(() => dispatch(node, false, 'start'));\n        loop(now => {\n            if (running) {\n                if (now >= end_time) {\n                    tick(0, 1);\n                    dispatch(node, false, 'end');\n                    if (!--group.r) {\n                        // this will result in `end()` being called,\n                        // so we don't need to clean up here\n                        run_all(group.c);\n                    }\n                    return false;\n                }\n                if (now >= start_time) {\n                    const t = easing((now - start_time) / duration);\n                    tick(1 - t, t);\n                }\n            }\n            return running;\n        });\n    }\n    if (is_function(config)) {\n        wait().then(() => {\n            // @ts-ignore\n            config = config(options);\n            go();\n        });\n    }\n    else {\n        go();\n    }\n    return {\n        end(reset) {\n            if (reset && config.tick) {\n                config.tick(1, 0);\n            }\n            if (running) {\n                if (animation_name)\n                    delete_rule(node, animation_name);\n                running = false;\n            }\n        }\n    };\n}\nfunction create_bidirectional_transition(node, fn, params, intro) {\n    const options = { direction: 'both' };\n    let config = fn(node, params, options);\n    let t = intro ? 0 : 1;\n    let running_program = null;\n    let pending_program = null;\n    let animation_name = null;\n    function clear_animation() {\n        if (animation_name)\n            delete_rule(node, animation_name);\n    }\n    function init(program, duration) {\n        const d = (program.b - t);\n        duration *= Math.abs(d);\n        return {\n            a: t,\n            b: program.b,\n            d,\n            duration,\n            start: program.start,\n            end: program.start + duration,\n            group: program.group\n        };\n    }\n    function go(b) {\n        const { delay = 0, duration = 300, easing = identity, tick = noop, css } = config || null_transition;\n        const program = {\n            start: now() + delay,\n            b\n        };\n        if (!b) {\n            // @ts-ignore todo: improve typings\n            program.group = outros;\n            outros.r += 1;\n        }\n        if (running_program || pending_program) {\n            pending_program = program;\n        }\n        else {\n            // if this is an intro, and there's a delay, we need to do\n            // an initial tick and/or apply CSS animation immediately\n            if (css) {\n                clear_animation();\n                animation_name = create_rule(node, t, b, duration, delay, easing, css);\n            }\n            if (b)\n                tick(0, 1);\n            running_program = init(program, duration);\n            add_render_callback(() => dispatch(node, b, 'start'));\n            loop(now => {\n                if (pending_program && now > pending_program.start) {\n                    running_program = init(pending_program, duration);\n                    pending_program = null;\n                    dispatch(node, running_program.b, 'start');\n                    if (css) {\n                        clear_animation();\n                        animation_name = create_rule(node, t, running_program.b, running_program.duration, 0, easing, config.css);\n                    }\n                }\n                if (running_program) {\n                    if (now >= running_program.end) {\n                        tick(t = running_program.b, 1 - t);\n                        dispatch(node, running_program.b, 'end');\n                        if (!pending_program) {\n                            // we're done\n                            if (running_program.b) {\n                                // intro — we can tidy up immediately\n                                clear_animation();\n                            }\n                            else {\n                                // outro — needs to be coordinated\n                                if (!--running_program.group.r)\n                                    run_all(running_program.group.c);\n                            }\n                        }\n                        running_program = null;\n                    }\n                    else if (now >= running_program.start) {\n                        const p = now - running_program.start;\n                        t = running_program.a + running_program.d * easing(p / running_program.duration);\n                        tick(t, 1 - t);\n                    }\n                }\n                return !!(running_program || pending_program);\n            });\n        }\n    }\n    return {\n        run(b) {\n            if (is_function(config)) {\n                wait().then(() => {\n                    // @ts-ignore\n                    config = config(options);\n                    go(b);\n                });\n            }\n            else {\n                go(b);\n            }\n        },\n        end() {\n            clear_animation();\n            running_program = pending_program = null;\n        }\n    };\n}\n\nfunction handle_promise(promise, info) {\n    const token = info.token = {};\n    function update(type, index, key, value) {\n        if (info.token !== token)\n            return;\n        info.resolved = value;\n        let child_ctx = info.ctx;\n        if (key !== undefined) {\n            child_ctx = child_ctx.slice();\n            child_ctx[key] = value;\n        }\n        const block = type && (info.current = type)(child_ctx);\n        let needs_flush = false;\n        if (info.block) {\n            if (info.blocks) {\n                info.blocks.forEach((block, i) => {\n                    if (i !== index && block) {\n                        group_outros();\n                        transition_out(block, 1, 1, () => {\n                            if (info.blocks[i] === block) {\n                                info.blocks[i] = null;\n                            }\n                        });\n                        check_outros();\n                    }\n                });\n            }\n            else {\n                info.block.d(1);\n            }\n            block.c();\n            transition_in(block, 1);\n            block.m(info.mount(), info.anchor);\n            needs_flush = true;\n        }\n        info.block = block;\n        if (info.blocks)\n            info.blocks[index] = block;\n        if (needs_flush) {\n            flush();\n        }\n    }\n    if (is_promise(promise)) {\n        const current_component = get_current_component();\n        promise.then(value => {\n            set_current_component(current_component);\n            update(info.then, 1, info.value, value);\n            set_current_component(null);\n        }, error => {\n            set_current_component(current_component);\n            update(info.catch, 2, info.error, error);\n            set_current_component(null);\n            if (!info.hasCatch) {\n                throw error;\n            }\n        });\n        // if we previously had a then/catch block, destroy it\n        if (info.current !== info.pending) {\n            update(info.pending, 0);\n            return true;\n        }\n    }\n    else {\n        if (info.current !== info.then) {\n            update(info.then, 1, info.value, promise);\n            return true;\n        }\n        info.resolved = promise;\n    }\n}\nfunction update_await_block_branch(info, ctx, dirty) {\n    const child_ctx = ctx.slice();\n    const { resolved } = info;\n    if (info.current === info.then) {\n        child_ctx[info.value] = resolved;\n    }\n    if (info.current === info.catch) {\n        child_ctx[info.error] = resolved;\n    }\n    info.block.p(child_ctx, dirty);\n}\n\nfunction destroy_block(block, lookup) {\n    block.d(1);\n    lookup.delete(block.key);\n}\nfunction outro_and_destroy_block(block, lookup) {\n    transition_out(block, 1, 1, () => {\n        lookup.delete(block.key);\n    });\n}\nfunction fix_and_destroy_block(block, lookup) {\n    block.f();\n    destroy_block(block, lookup);\n}\nfunction fix_and_outro_and_destroy_block(block, lookup) {\n    block.f();\n    outro_and_destroy_block(block, lookup);\n}\nfunction update_keyed_each(old_blocks, dirty, get_key, dynamic, ctx, list, lookup, node, destroy, create_each_block, next, get_context) {\n    let o = old_blocks.length;\n    let n = list.length;\n    let i = o;\n    const old_indexes = {};\n    while (i--)\n        old_indexes[old_blocks[i].key] = i;\n    const new_blocks = [];\n    const new_lookup = new Map();\n    const deltas = new Map();\n    const updates = [];\n    i = n;\n    while (i--) {\n        const child_ctx = get_context(ctx, list, i);\n        const key = get_key(child_ctx);\n        let block = lookup.get(key);\n        if (!block) {\n            block = create_each_block(key, child_ctx);\n            block.c();\n        }\n        else if (dynamic) {\n            // defer updates until all the DOM shuffling is done\n            updates.push(() => block.p(child_ctx, dirty));\n        }\n        new_lookup.set(key, new_blocks[i] = block);\n        if (key in old_indexes)\n            deltas.set(key, Math.abs(i - old_indexes[key]));\n    }\n    const will_move = new Set();\n    const did_move = new Set();\n    function insert(block) {\n        transition_in(block, 1);\n        block.m(node, next);\n        lookup.set(block.key, block);\n        next = block.first;\n        n--;\n    }\n    while (o && n) {\n        const new_block = new_blocks[n - 1];\n        const old_block = old_blocks[o - 1];\n        const new_key = new_block.key;\n        const old_key = old_block.key;\n        if (new_block === old_block) {\n            // do nothing\n            next = new_block.first;\n            o--;\n            n--;\n        }\n        else if (!new_lookup.has(old_key)) {\n            // remove old block\n            destroy(old_block, lookup);\n            o--;\n        }\n        else if (!lookup.has(new_key) || will_move.has(new_key)) {\n            insert(new_block);\n        }\n        else if (did_move.has(old_key)) {\n            o--;\n        }\n        else if (deltas.get(new_key) > deltas.get(old_key)) {\n            did_move.add(new_key);\n            insert(new_block);\n        }\n        else {\n            will_move.add(old_key);\n            o--;\n        }\n    }\n    while (o--) {\n        const old_block = old_blocks[o];\n        if (!new_lookup.has(old_block.key))\n            destroy(old_block, lookup);\n    }\n    while (n)\n        insert(new_blocks[n - 1]);\n    run_all(updates);\n    return new_blocks;\n}\nfunction validate_each_keys(ctx, list, get_context, get_key) {\n    const keys = new Set();\n    for (let i = 0; i < list.length; i++) {\n        const key = get_key(get_context(ctx, list, i));\n        if (keys.has(key)) {\n            throw new Error('Cannot have duplicate keys in a keyed each');\n        }\n        keys.add(key);\n    }\n}\n\nfunction get_spread_update(levels, updates) {\n    const update = {};\n    const to_null_out = {};\n    const accounted_for = { $$scope: 1 };\n    let i = levels.length;\n    while (i--) {\n        const o = levels[i];\n        const n = updates[i];\n        if (n) {\n            for (const key in o) {\n                if (!(key in n))\n                    to_null_out[key] = 1;\n            }\n            for (const key in n) {\n                if (!accounted_for[key]) {\n                    update[key] = n[key];\n                    accounted_for[key] = 1;\n                }\n            }\n            levels[i] = n;\n        }\n        else {\n            for (const key in o) {\n                accounted_for[key] = 1;\n            }\n        }\n    }\n    for (const key in to_null_out) {\n        if (!(key in update))\n            update[key] = undefined;\n    }\n    return update;\n}\nfunction get_spread_object(spread_props) {\n    return typeof spread_props === 'object' && spread_props !== null ? spread_props : {};\n}\n\nconst _boolean_attributes = [\n    'allowfullscreen',\n    'allowpaymentrequest',\n    'async',\n    'autofocus',\n    'autoplay',\n    'checked',\n    'controls',\n    'default',\n    'defer',\n    'disabled',\n    'formnovalidate',\n    'hidden',\n    'inert',\n    'ismap',\n    'loop',\n    'multiple',\n    'muted',\n    'nomodule',\n    'novalidate',\n    'open',\n    'playsinline',\n    'readonly',\n    'required',\n    'reversed',\n    'selected'\n];\n/**\n * List of HTML boolean attributes (e.g. `<input disabled>`).\n * Source: https://html.spec.whatwg.org/multipage/indices.html\n */\nconst boolean_attributes = new Set([..._boolean_attributes]);\n\n/** regex of all html void element names */\nconst void_element_names = /^(?:area|base|br|col|command|embed|hr|img|input|keygen|link|meta|param|source|track|wbr)$/;\nfunction is_void(name) {\n    return void_element_names.test(name) || name.toLowerCase() === '!doctype';\n}\n\nconst invalid_attribute_name_character = /[\\s'\">/=\\u{FDD0}-\\u{FDEF}\\u{FFFE}\\u{FFFF}\\u{1FFFE}\\u{1FFFF}\\u{2FFFE}\\u{2FFFF}\\u{3FFFE}\\u{3FFFF}\\u{4FFFE}\\u{4FFFF}\\u{5FFFE}\\u{5FFFF}\\u{6FFFE}\\u{6FFFF}\\u{7FFFE}\\u{7FFFF}\\u{8FFFE}\\u{8FFFF}\\u{9FFFE}\\u{9FFFF}\\u{AFFFE}\\u{AFFFF}\\u{BFFFE}\\u{BFFFF}\\u{CFFFE}\\u{CFFFF}\\u{DFFFE}\\u{DFFFF}\\u{EFFFE}\\u{EFFFF}\\u{FFFFE}\\u{FFFFF}\\u{10FFFE}\\u{10FFFF}]/u;\n// https://html.spec.whatwg.org/multipage/syntax.html#attributes-2\n// https://infra.spec.whatwg.org/#noncharacter\nfunction spread(args, attrs_to_add) {\n    const attributes = Object.assign({}, ...args);\n    if (attrs_to_add) {\n        const classes_to_add = attrs_to_add.classes;\n        const styles_to_add = attrs_to_add.styles;\n        if (classes_to_add) {\n            if (attributes.class == null) {\n                attributes.class = classes_to_add;\n            }\n            else {\n                attributes.class += ' ' + classes_to_add;\n            }\n        }\n        if (styles_to_add) {\n            if (attributes.style == null) {\n                attributes.style = style_object_to_string(styles_to_add);\n            }\n            else {\n                attributes.style = style_object_to_string(merge_ssr_styles(attributes.style, styles_to_add));\n            }\n        }\n    }\n    let str = '';\n    Object.keys(attributes).forEach(name => {\n        if (invalid_attribute_name_character.test(name))\n            return;\n        const value = attributes[name];\n        if (value === true)\n            str += ' ' + name;\n        else if (boolean_attributes.has(name.toLowerCase())) {\n            if (value)\n                str += ' ' + name;\n        }\n        else if (value != null) {\n            str += ` ${name}=\"${value}\"`;\n        }\n    });\n    return str;\n}\nfunction merge_ssr_styles(style_attribute, style_directive) {\n    const style_object = {};\n    for (const individual_style of style_attribute.split(';')) {\n        const colon_index = individual_style.indexOf(':');\n        const name = individual_style.slice(0, colon_index).trim();\n        const value = individual_style.slice(colon_index + 1).trim();\n        if (!name)\n            continue;\n        style_object[name] = value;\n    }\n    for (const name in style_directive) {\n        const value = style_directive[name];\n        if (value) {\n            style_object[name] = value;\n        }\n        else {\n            delete style_object[name];\n        }\n    }\n    return style_object;\n}\nconst ATTR_REGEX = /[&\"]/g;\nconst CONTENT_REGEX = /[&<]/g;\n/**\n * Note: this method is performance sensitive and has been optimized\n * https://github.com/sveltejs/svelte/pull/5701\n */\nfunction escape(value, is_attr = false) {\n    const str = String(value);\n    const pattern = is_attr ? ATTR_REGEX : CONTENT_REGEX;\n    pattern.lastIndex = 0;\n    let escaped = '';\n    let last = 0;\n    while (pattern.test(str)) {\n        const i = pattern.lastIndex - 1;\n        const ch = str[i];\n        escaped += str.substring(last, i) + (ch === '&' ? '&amp;' : (ch === '\"' ? '&quot;' : '&lt;'));\n        last = i + 1;\n    }\n    return escaped + str.substring(last);\n}\nfunction escape_attribute_value(value) {\n    // keep booleans, null, and undefined for the sake of `spread`\n    const should_escape = typeof value === 'string' || (value && typeof value === 'object');\n    return should_escape ? escape(value, true) : value;\n}\nfunction escape_object(obj) {\n    const result = {};\n    for (const key in obj) {\n        result[key] = escape_attribute_value(obj[key]);\n    }\n    return result;\n}\nfunction each(items, fn) {\n    let str = '';\n    for (let i = 0; i < items.length; i += 1) {\n        str += fn(items[i], i);\n    }\n    return str;\n}\nconst missing_component = {\n    $$render: () => ''\n};\nfunction validate_component(component, name) {\n    if (!component || !component.$$render) {\n        if (name === 'svelte:component')\n            name += ' this={...}';\n        throw new Error(`<${name}> is not a valid SSR component. You may need to review your build config to ensure that dependencies are compiled, rather than imported as pre-compiled modules. Otherwise you may need to fix a <${name}>.`);\n    }\n    return component;\n}\nfunction debug(file, line, column, values) {\n    console.log(`{@debug} ${file ? file + ' ' : ''}(${line}:${column})`); // eslint-disable-line no-console\n    console.log(values); // eslint-disable-line no-console\n    return '';\n}\nlet on_destroy;\nfunction create_ssr_component(fn) {\n    function $$render(result, props, bindings, slots, context) {\n        const parent_component = current_component;\n        const $$ = {\n            on_destroy,\n            context: new Map(context || (parent_component ? parent_component.$$.context : [])),\n            // these will be immediately discarded\n            on_mount: [],\n            before_update: [],\n            after_update: [],\n            callbacks: blank_object()\n        };\n        set_current_component({ $$ });\n        const html = fn(result, props, bindings, slots);\n        set_current_component(parent_component);\n        return html;\n    }\n    return {\n        render: (props = {}, { $$slots = {}, context = new Map() } = {}) => {\n            on_destroy = [];\n            const result = { title: '', head: '', css: new Set() };\n            const html = $$render(result, props, {}, $$slots, context);\n            run_all(on_destroy);\n            return {\n                html,\n                css: {\n                    code: Array.from(result.css).map(css => css.code).join('\\n'),\n                    map: null // TODO\n                },\n                head: result.title + result.head\n            };\n        },\n        $$render\n    };\n}\nfunction add_attribute(name, value, boolean) {\n    if (value == null || (boolean && !value))\n        return '';\n    const assignment = (boolean && value === true) ? '' : `=\"${escape(value, true)}\"`;\n    return ` ${name}${assignment}`;\n}\nfunction add_classes(classes) {\n    return classes ? ` class=\"${classes}\"` : '';\n}\nfunction style_object_to_string(style_object) {\n    return Object.keys(style_object)\n        .filter(key => style_object[key])\n        .map(key => `${key}: ${escape_attribute_value(style_object[key])};`)\n        .join(' ');\n}\nfunction add_styles(style_object) {\n    const styles = style_object_to_string(style_object);\n    return styles ? ` style=\"${styles}\"` : '';\n}\n\nfunction bind(component, name, callback) {\n    const index = component.$$.props[name];\n    if (index !== undefined) {\n        component.$$.bound[index] = callback;\n        callback(component.$$.ctx[index]);\n    }\n}\nfunction create_component(block) {\n    block && block.c();\n}\nfunction claim_component(block, parent_nodes) {\n    block && block.l(parent_nodes);\n}\nfunction mount_component(component, target, anchor, customElement) {\n    const { fragment, after_update } = component.$$;\n    fragment && fragment.m(target, anchor);\n    if (!customElement) {\n        // onMount happens before the initial afterUpdate\n        add_render_callback(() => {\n            const new_on_destroy = component.$$.on_mount.map(run).filter(is_function);\n            // if the component was destroyed immediately\n            // it will update the `$$.on_destroy` reference to `null`.\n            // the destructured on_destroy may still reference to the old array\n            if (component.$$.on_destroy) {\n                component.$$.on_destroy.push(...new_on_destroy);\n            }\n            else {\n                // Edge case - component was destroyed immediately,\n                // most likely as a result of a binding initialising\n                run_all(new_on_destroy);\n            }\n            component.$$.on_mount = [];\n        });\n    }\n    after_update.forEach(add_render_callback);\n}\nfunction destroy_component(component, detaching) {\n    const $$ = component.$$;\n    if ($$.fragment !== null) {\n        flush_render_callbacks($$.after_update);\n        run_all($$.on_destroy);\n        $$.fragment && $$.fragment.d(detaching);\n        // TODO null out other refs, including component.$$ (but need to\n        // preserve final state?)\n        $$.on_destroy = $$.fragment = null;\n        $$.ctx = [];\n    }\n}\nfunction make_dirty(component, i) {\n    if (component.$$.dirty[0] === -1) {\n        dirty_components.push(component);\n        schedule_update();\n        component.$$.dirty.fill(0);\n    }\n    component.$$.dirty[(i / 31) | 0] |= (1 << (i % 31));\n}\nfunction init(component, options, instance, create_fragment, not_equal, props, append_styles, dirty = [-1]) {\n    const parent_component = current_component;\n    set_current_component(component);\n    const $$ = component.$$ = {\n        fragment: null,\n        ctx: [],\n        // state\n        props,\n        update: noop,\n        not_equal,\n        bound: blank_object(),\n        // lifecycle\n        on_mount: [],\n        on_destroy: [],\n        on_disconnect: [],\n        before_update: [],\n        after_update: [],\n        context: new Map(options.context || (parent_component ? parent_component.$$.context : [])),\n        // everything else\n        callbacks: blank_object(),\n        dirty,\n        skip_bound: false,\n        root: options.target || parent_component.$$.root\n    };\n    append_styles && append_styles($$.root);\n    let ready = false;\n    $$.ctx = instance\n        ? instance(component, options.props || {}, (i, ret, ...rest) => {\n            const value = rest.length ? rest[0] : ret;\n            if ($$.ctx && not_equal($$.ctx[i], $$.ctx[i] = value)) {\n                if (!$$.skip_bound && $$.bound[i])\n                    $$.bound[i](value);\n                if (ready)\n                    make_dirty(component, i);\n            }\n            return ret;\n        })\n        : [];\n    $$.update();\n    ready = true;\n    run_all($$.before_update);\n    // `false` as a special case of no DOM component\n    $$.fragment = create_fragment ? create_fragment($$.ctx) : false;\n    if (options.target) {\n        if (options.hydrate) {\n            start_hydrating();\n            const nodes = children(options.target);\n            // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n            $$.fragment && $$.fragment.l(nodes);\n            nodes.forEach(detach);\n        }\n        else {\n            // eslint-disable-next-line @typescript-eslint/no-non-null-assertion\n            $$.fragment && $$.fragment.c();\n        }\n        if (options.intro)\n            transition_in(component.$$.fragment);\n        mount_component(component, options.target, options.anchor, options.customElement);\n        end_hydrating();\n        flush();\n    }\n    set_current_component(parent_component);\n}\nlet SvelteElement;\nif (typeof HTMLElement === 'function') {\n    SvelteElement = class extends HTMLElement {\n        constructor() {\n            super();\n            this.attachShadow({ mode: 'open' });\n        }\n        connectedCallback() {\n            const { on_mount } = this.$$;\n            this.$$.on_disconnect = on_mount.map(run).filter(is_function);\n            // @ts-ignore todo: improve typings\n            for (const key in this.$$.slotted) {\n                // @ts-ignore todo: improve typings\n                this.appendChild(this.$$.slotted[key]);\n            }\n        }\n        attributeChangedCallback(attr, _oldValue, newValue) {\n            this[attr] = newValue;\n        }\n        disconnectedCallback() {\n            run_all(this.$$.on_disconnect);\n        }\n        $destroy() {\n            destroy_component(this, 1);\n            this.$destroy = noop;\n        }\n        $on(type, callback) {\n            // TODO should this delegate to addEventListener?\n            if (!is_function(callback)) {\n                return noop;\n            }\n            const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));\n            callbacks.push(callback);\n            return () => {\n                const index = callbacks.indexOf(callback);\n                if (index !== -1)\n                    callbacks.splice(index, 1);\n            };\n        }\n        $set($$props) {\n            if (this.$$set && !is_empty($$props)) {\n                this.$$.skip_bound = true;\n                this.$$set($$props);\n                this.$$.skip_bound = false;\n            }\n        }\n    };\n}\n/**\n * Base class for Svelte components. Used when dev=false.\n */\nclass SvelteComponent {\n    $destroy() {\n        destroy_component(this, 1);\n        this.$destroy = noop;\n    }\n    $on(type, callback) {\n        if (!is_function(callback)) {\n            return noop;\n        }\n        const callbacks = (this.$$.callbacks[type] || (this.$$.callbacks[type] = []));\n        callbacks.push(callback);\n        return () => {\n            const index = callbacks.indexOf(callback);\n            if (index !== -1)\n                callbacks.splice(index, 1);\n        };\n    }\n    $set($$props) {\n        if (this.$$set && !is_empty($$props)) {\n            this.$$.skip_bound = true;\n            this.$$set($$props);\n            this.$$.skip_bound = false;\n        }\n    }\n}\n\nfunction dispatch_dev(type, detail) {\n    document.dispatchEvent(custom_event(type, Object.assign({ version: '3.59.2' }, detail), { bubbles: true }));\n}\nfunction append_dev(target, node) {\n    dispatch_dev('SvelteDOMInsert', { target, node });\n    append(target, node);\n}\nfunction append_hydration_dev(target, node) {\n    dispatch_dev('SvelteDOMInsert', { target, node });\n    append_hydration(target, node);\n}\nfunction insert_dev(target, node, anchor) {\n    dispatch_dev('SvelteDOMInsert', { target, node, anchor });\n    insert(target, node, anchor);\n}\nfunction insert_hydration_dev(target, node, anchor) {\n    dispatch_dev('SvelteDOMInsert', { target, node, anchor });\n    insert_hydration(target, node, anchor);\n}\nfunction detach_dev(node) {\n    dispatch_dev('SvelteDOMRemove', { node });\n    detach(node);\n}\nfunction detach_between_dev(before, after) {\n    while (before.nextSibling && before.nextSibling !== after) {\n        detach_dev(before.nextSibling);\n    }\n}\nfunction detach_before_dev(after) {\n    while (after.previousSibling) {\n        detach_dev(after.previousSibling);\n    }\n}\nfunction detach_after_dev(before) {\n    while (before.nextSibling) {\n        detach_dev(before.nextSibling);\n    }\n}\nfunction listen_dev(node, event, handler, options, has_prevent_default, has_stop_propagation, has_stop_immediate_propagation) {\n    const modifiers = options === true ? ['capture'] : options ? Array.from(Object.keys(options)) : [];\n    if (has_prevent_default)\n        modifiers.push('preventDefault');\n    if (has_stop_propagation)\n        modifiers.push('stopPropagation');\n    if (has_stop_immediate_propagation)\n        modifiers.push('stopImmediatePropagation');\n    dispatch_dev('SvelteDOMAddEventListener', { node, event, handler, modifiers });\n    const dispose = listen(node, event, handler, options);\n    return () => {\n        dispatch_dev('SvelteDOMRemoveEventListener', { node, event, handler, modifiers });\n        dispose();\n    };\n}\nfunction attr_dev(node, attribute, value) {\n    attr(node, attribute, value);\n    if (value == null)\n        dispatch_dev('SvelteDOMRemoveAttribute', { node, attribute });\n    else\n        dispatch_dev('SvelteDOMSetAttribute', { node, attribute, value });\n}\nfunction prop_dev(node, property, value) {\n    node[property] = value;\n    dispatch_dev('SvelteDOMSetProperty', { node, property, value });\n}\nfunction dataset_dev(node, property, value) {\n    node.dataset[property] = value;\n    dispatch_dev('SvelteDOMSetDataset', { node, property, value });\n}\nfunction set_data_dev(text, data) {\n    data = '' + data;\n    if (text.data === data)\n        return;\n    dispatch_dev('SvelteDOMSetData', { node: text, data });\n    text.data = data;\n}\nfunction set_data_contenteditable_dev(text, data) {\n    data = '' + data;\n    if (text.wholeText === data)\n        return;\n    dispatch_dev('SvelteDOMSetData', { node: text, data });\n    text.data = data;\n}\nfunction set_data_maybe_contenteditable_dev(text, data, attr_value) {\n    if (~contenteditable_truthy_values.indexOf(attr_value)) {\n        set_data_contenteditable_dev(text, data);\n    }\n    else {\n        set_data_dev(text, data);\n    }\n}\nfunction validate_each_argument(arg) {\n    if (typeof arg !== 'string' && !(arg && typeof arg === 'object' && 'length' in arg)) {\n        let msg = '{#each} only iterates over array-like objects.';\n        if (typeof Symbol === 'function' && arg && Symbol.iterator in arg) {\n            msg += ' You can use a spread to convert this iterable into an array.';\n        }\n        throw new Error(msg);\n    }\n}\nfunction validate_slots(name, slot, keys) {\n    for (const slot_key of Object.keys(slot)) {\n        if (!~keys.indexOf(slot_key)) {\n            console.warn(`<${name}> received an unexpected slot \"${slot_key}\".`);\n        }\n    }\n}\nfunction validate_dynamic_element(tag) {\n    const is_string = typeof tag === 'string';\n    if (tag && !is_string) {\n        throw new Error('<svelte:element> expects \"this\" attribute to be a string.');\n    }\n}\nfunction validate_void_dynamic_element(tag) {\n    if (tag && is_void(tag)) {\n        console.warn(`<svelte:element this=\"${tag}\"> is self-closing and cannot have content.`);\n    }\n}\nfunction construct_svelte_component_dev(component, props) {\n    const error_message = 'this={...} of <svelte:component> should specify a Svelte component.';\n    try {\n        const instance = new component(props);\n        if (!instance.$$ || !instance.$set || !instance.$on || !instance.$destroy) {\n            throw new Error(error_message);\n        }\n        return instance;\n    }\n    catch (err) {\n        const { message } = err;\n        if (typeof message === 'string' && message.indexOf('is not a constructor') !== -1) {\n            throw new Error(error_message);\n        }\n        else {\n            throw err;\n        }\n    }\n}\n/**\n * Base class for Svelte components with some minor dev-enhancements. Used when dev=true.\n */\nclass SvelteComponentDev extends SvelteComponent {\n    constructor(options) {\n        if (!options || (!options.target && !options.$$inline)) {\n            throw new Error(\"'target' is a required option\");\n        }\n        super();\n    }\n    $destroy() {\n        super.$destroy();\n        this.$destroy = () => {\n            console.warn('Component was already destroyed'); // eslint-disable-line no-console\n        };\n    }\n    $capture_state() { }\n    $inject_state() { }\n}\n/**\n * Base class to create strongly typed Svelte components.\n * This only exists for typing purposes and should be used in `.d.ts` files.\n *\n * ### Example:\n *\n * You have component library on npm called `component-library`, from which\n * you export a component called `MyComponent`. For Svelte+TypeScript users,\n * you want to provide typings. Therefore you create a `index.d.ts`:\n * ```ts\n * import { SvelteComponentTyped } from \"svelte\";\n * export class MyComponent extends SvelteComponentTyped<{foo: string}> {}\n * ```\n * Typing this makes it possible for IDEs like VS Code with the Svelte extension\n * to provide intellisense and to use the component like this in a Svelte file\n * with TypeScript:\n * ```svelte\n * <script lang=\"ts\">\n * \timport { MyComponent } from \"component-library\";\n * </script>\n * <MyComponent foo={'bar'} />\n * ```\n *\n * #### Why not make this part of `SvelteComponent(Dev)`?\n * Because\n * ```ts\n * class ASubclassOfSvelteComponent extends SvelteComponent<{foo: string}> {}\n * const component: typeof SvelteComponent = ASubclassOfSvelteComponent;\n * ```\n * will throw a type error, so we need to separate the more strictly typed class.\n */\nclass SvelteComponentTyped extends SvelteComponentDev {\n    constructor(options) {\n        super(options);\n    }\n}\nfunction loop_guard(timeout) {\n    const start = Date.now();\n    return () => {\n        if (Date.now() - start > timeout) {\n            throw new Error('Infinite loop detected');\n        }\n    };\n}\n\nexport { HtmlTag, HtmlTagHydration, ResizeObserverSingleton, SvelteComponent, SvelteComponentDev, SvelteComponentTyped, SvelteElement, action_destroyer, add_attribute, add_classes, add_flush_callback, add_iframe_resize_listener, add_location, add_render_callback, add_styles, add_transform, afterUpdate, append, append_dev, append_empty_stylesheet, append_hydration, append_hydration_dev, append_styles, assign, attr, attr_dev, attribute_to_object, beforeUpdate, bind, binding_callbacks, blank_object, bubble, check_outros, children, claim_comment, claim_component, claim_element, claim_html_tag, claim_space, claim_svg_element, claim_text, clear_loops, comment, component_subscribe, compute_rest_props, compute_slots, construct_svelte_component, construct_svelte_component_dev, contenteditable_truthy_values, createEventDispatcher, create_animation, create_bidirectional_transition, create_component, create_in_transition, create_out_transition, create_slot, create_ssr_component, current_component, custom_event, dataset_dev, debug, destroy_block, destroy_component, destroy_each, detach, detach_after_dev, detach_before_dev, detach_between_dev, detach_dev, dirty_components, dispatch_dev, each, element, element_is, empty, end_hydrating, escape, escape_attribute_value, escape_object, exclude_internal_props, fix_and_destroy_block, fix_and_outro_and_destroy_block, fix_position, flush, flush_render_callbacks, getAllContexts, getContext, get_all_dirty_from_scope, get_binding_group_value, get_current_component, get_custom_elements_slots, get_root_for_style, get_slot_changes, get_spread_object, get_spread_update, get_store_value, globals, group_outros, handle_promise, hasContext, has_prop, head_selector, identity, init, init_binding_group, init_binding_group_dynamic, insert, insert_dev, insert_hydration, insert_hydration_dev, intros, invalid_attribute_name_character, is_client, is_crossorigin, is_empty, is_function, is_promise, is_void, listen, listen_dev, loop, loop_guard, merge_ssr_styles, missing_component, mount_component, noop, not_equal, now, null_to_empty, object_without_properties, onDestroy, onMount, once, outro_and_destroy_block, prevent_default, prop_dev, query_selector_all, raf, resize_observer_border_box, resize_observer_content_box, resize_observer_device_pixel_content_box, run, run_all, safe_not_equal, schedule_update, select_multiple_value, select_option, select_options, select_value, self, setContext, set_attributes, set_current_component, set_custom_element_data, set_custom_element_data_map, set_data, set_data_contenteditable, set_data_contenteditable_dev, set_data_dev, set_data_maybe_contenteditable, set_data_maybe_contenteditable_dev, set_dynamic_element_data, set_input_type, set_input_value, set_now, set_raf, set_store_value, set_style, set_svg_attributes, space, split_css_unit, spread, src_url_equal, start_hydrating, stop_immediate_propagation, stop_propagation, subscribe, svg_element, text, tick, time_ranges_to_array, to_number, toggle_class, transition_in, transition_out, trusted, update_await_block_branch, update_keyed_each, update_slot, update_slot_base, validate_component, validate_dynamic_element, validate_each_argument, validate_each_keys, validate_slots, validate_store, validate_void_dynamic_element, xlink_attr };\n","<script>export let color = '#FF3E00';\nexport let unit = 'px';\nexport let duration = '0.75s';\nexport let size = '60';\nexport let pause = false;\n</script>\n\n<div\n\tclass=\"circle\"\n\tclass:pause-animation={pause}\n\tstyle=\"--size: {size}{unit}; --color: {color}; --duration: {duration}\"\n/>\n\n<style>\n\t.circle {\n\t\theight: var(--size);\n\t\twidth: var(--size);\n\t\tborder-color: var(--color) transparent var(--color) var(--color);\n\t\tborder-width: calc(var(--size) / 15);\n\t\tborder-style: solid;\n\t\tborder-image: initial;\n\t\tborder-radius: 50%;\n\t\tanimation: var(--duration) linear 0s infinite normal none running rotate;\n\t}\n\t.pause-animation {\n\t\tanimation-play-state: paused;\n\t}\n\t@keyframes rotate {\n\t\t0% {\n\t\t\ttransform: rotate(0);\n\t\t}\n\t\t100% {\n\t\t\ttransform: rotate(360deg);\n\t\t}\n\t}\n</style>\n","<div>\n\tThere was a problem. Try refreshing to see if that fixes it.\n</div>\n<br>\n<button on:click={() => window.location.reload()}>Refresh</button>","import { noop, safe_not_equal, subscribe, run_all, is_function } from '../internal/index.mjs';\nexport { get_store_value as get } from '../internal/index.mjs';\n\nconst subscriber_queue = [];\n/**\n * Creates a `Readable` store that allows reading by subscription.\n * @param value initial value\n * @param {StartStopNotifier} [start]\n */\nfunction readable(value, start) {\n    return {\n        subscribe: writable(value, start).subscribe\n    };\n}\n/**\n * Create a `Writable` store that allows both updating and reading by subscription.\n * @param {*=}value initial value\n * @param {StartStopNotifier=} start\n */\nfunction writable(value, start = noop) {\n    let stop;\n    const subscribers = new Set();\n    function set(new_value) {\n        if (safe_not_equal(value, new_value)) {\n            value = new_value;\n            if (stop) { // store is ready\n                const run_queue = !subscriber_queue.length;\n                for (const subscriber of subscribers) {\n                    subscriber[1]();\n                    subscriber_queue.push(subscriber, value);\n                }\n                if (run_queue) {\n                    for (let i = 0; i < subscriber_queue.length; i += 2) {\n                        subscriber_queue[i][0](subscriber_queue[i + 1]);\n                    }\n                    subscriber_queue.length = 0;\n                }\n            }\n        }\n    }\n    function update(fn) {\n        set(fn(value));\n    }\n    function subscribe(run, invalidate = noop) {\n        const subscriber = [run, invalidate];\n        subscribers.add(subscriber);\n        if (subscribers.size === 1) {\n            stop = start(set) || noop;\n        }\n        run(value);\n        return () => {\n            subscribers.delete(subscriber);\n            if (subscribers.size === 0 && stop) {\n                stop();\n                stop = null;\n            }\n        };\n    }\n    return { set, update, subscribe };\n}\nfunction derived(stores, fn, initial_value) {\n    const single = !Array.isArray(stores);\n    const stores_array = single\n        ? [stores]\n        : stores;\n    const auto = fn.length < 2;\n    return readable(initial_value, (set) => {\n        let started = false;\n        const values = [];\n        let pending = 0;\n        let cleanup = noop;\n        const sync = () => {\n            if (pending) {\n                return;\n            }\n            cleanup();\n            const result = fn(single ? values[0] : values, set);\n            if (auto) {\n                set(result);\n            }\n            else {\n                cleanup = is_function(result) ? result : noop;\n            }\n        };\n        const unsubscribers = stores_array.map((store, i) => subscribe(store, (value) => {\n            values[i] = value;\n            pending &= ~(1 << i);\n            if (started) {\n                sync();\n            }\n        }, () => {\n            pending |= (1 << i);\n        }));\n        started = true;\n        sync();\n        return function stop() {\n            run_all(unsubscribers);\n            cleanup();\n            // We need to set this to false because callbacks can still happen despite having unsubscribed:\n            // Callbacks might already be placed in the queue which doesn't know it should no longer\n            // invoke this derived store.\n            started = false;\n        };\n    });\n}\n/**\n * Takes a store and returns a new one derived from the old one that is readable.\n *\n * @param store - store to make readonly\n */\nfunction readonly(store) {\n    return {\n        subscribe: store.subscribe.bind(store)\n    };\n}\n\nexport { derived, readable, readonly, writable };\n","import { writable } from 'svelte/store';\r\n\r\nexport const EVENTS_DATA = writable(null);\r\nexport const EVENTS_DATA_IN_PROGRESS = writable(false);\r\nexport const YOUTUBE_DATA = writable(null);\r\nexport const ORIGINAL_ROUTES_DATA = writable(null);\r\nexport const ROUTES_DATA = writable(null);\r\nexport const SUNX_DATA = writable(null);\r\nexport const GLOBAL_STATS_DATA = writable(null);","import { cubicInOut, linear, cubicOut } from '../easing/index.mjs';\nimport { split_css_unit, is_function, assign } from '../internal/index.mjs';\n\n/******************************************************************************\r\nCopyright (c) Microsoft Corporation.\r\n\r\nPermission to use, copy, modify, and/or distribute this software for any\r\npurpose with or without fee is hereby granted.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\r\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\r\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\r\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\r\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\r\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\r\nPERFORMANCE OF THIS SOFTWARE.\r\n***************************************************************************** */\r\n\r\nfunction __rest(s, e) {\r\n    var t = {};\r\n    for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\r\n        t[p] = s[p];\r\n    if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\r\n        for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\r\n            if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\r\n                t[p[i]] = s[p[i]];\r\n        }\r\n    return t;\r\n}\n\nfunction blur(node, { delay = 0, duration = 400, easing = cubicInOut, amount = 5, opacity = 0 } = {}) {\n    const style = getComputedStyle(node);\n    const target_opacity = +style.opacity;\n    const f = style.filter === 'none' ? '' : style.filter;\n    const od = target_opacity * (1 - opacity);\n    const [value, unit] = split_css_unit(amount);\n    return {\n        delay,\n        duration,\n        easing,\n        css: (_t, u) => `opacity: ${target_opacity - (od * u)}; filter: ${f} blur(${u * value}${unit});`\n    };\n}\nfunction fade(node, { delay = 0, duration = 400, easing = linear } = {}) {\n    const o = +getComputedStyle(node).opacity;\n    return {\n        delay,\n        duration,\n        easing,\n        css: t => `opacity: ${t * o}`\n    };\n}\nfunction fly(node, { delay = 0, duration = 400, easing = cubicOut, x = 0, y = 0, opacity = 0 } = {}) {\n    const style = getComputedStyle(node);\n    const target_opacity = +style.opacity;\n    const transform = style.transform === 'none' ? '' : style.transform;\n    const od = target_opacity * (1 - opacity);\n    const [xValue, xUnit] = split_css_unit(x);\n    const [yValue, yUnit] = split_css_unit(y);\n    return {\n        delay,\n        duration,\n        easing,\n        css: (t, u) => `\n\t\t\ttransform: ${transform} translate(${(1 - t) * xValue}${xUnit}, ${(1 - t) * yValue}${yUnit});\n\t\t\topacity: ${target_opacity - (od * u)}`\n    };\n}\nfunction slide(node, { delay = 0, duration = 400, easing = cubicOut, axis = 'y' } = {}) {\n    const style = getComputedStyle(node);\n    const opacity = +style.opacity;\n    const primary_property = axis === 'y' ? 'height' : 'width';\n    const primary_property_value = parseFloat(style[primary_property]);\n    const secondary_properties = axis === 'y' ? ['top', 'bottom'] : ['left', 'right'];\n    const capitalized_secondary_properties = secondary_properties.map((e) => `${e[0].toUpperCase()}${e.slice(1)}`);\n    const padding_start_value = parseFloat(style[`padding${capitalized_secondary_properties[0]}`]);\n    const padding_end_value = parseFloat(style[`padding${capitalized_secondary_properties[1]}`]);\n    const margin_start_value = parseFloat(style[`margin${capitalized_secondary_properties[0]}`]);\n    const margin_end_value = parseFloat(style[`margin${capitalized_secondary_properties[1]}`]);\n    const border_width_start_value = parseFloat(style[`border${capitalized_secondary_properties[0]}Width`]);\n    const border_width_end_value = parseFloat(style[`border${capitalized_secondary_properties[1]}Width`]);\n    return {\n        delay,\n        duration,\n        easing,\n        css: t => 'overflow: hidden;' +\n            `opacity: ${Math.min(t * 20, 1) * opacity};` +\n            `${primary_property}: ${t * primary_property_value}px;` +\n            `padding-${secondary_properties[0]}: ${t * padding_start_value}px;` +\n            `padding-${secondary_properties[1]}: ${t * padding_end_value}px;` +\n            `margin-${secondary_properties[0]}: ${t * margin_start_value}px;` +\n            `margin-${secondary_properties[1]}: ${t * margin_end_value}px;` +\n            `border-${secondary_properties[0]}-width: ${t * border_width_start_value}px;` +\n            `border-${secondary_properties[1]}-width: ${t * border_width_end_value}px;`\n    };\n}\nfunction scale(node, { delay = 0, duration = 400, easing = cubicOut, start = 0, opacity = 0 } = {}) {\n    const style = getComputedStyle(node);\n    const target_opacity = +style.opacity;\n    const transform = style.transform === 'none' ? '' : style.transform;\n    const sd = 1 - start;\n    const od = target_opacity * (1 - opacity);\n    return {\n        delay,\n        duration,\n        easing,\n        css: (_t, u) => `\n\t\t\ttransform: ${transform} scale(${1 - (sd * u)});\n\t\t\topacity: ${target_opacity - (od * u)}\n\t\t`\n    };\n}\nfunction draw(node, { delay = 0, speed, duration, easing = cubicInOut } = {}) {\n    let len = node.getTotalLength();\n    const style = getComputedStyle(node);\n    if (style.strokeLinecap !== 'butt') {\n        len += parseInt(style.strokeWidth);\n    }\n    if (duration === undefined) {\n        if (speed === undefined) {\n            duration = 800;\n        }\n        else {\n            duration = len / speed;\n        }\n    }\n    else if (typeof duration === 'function') {\n        duration = duration(len);\n    }\n    return {\n        delay,\n        duration,\n        easing,\n        css: (_, u) => `\n\t\t\tstroke-dasharray: ${len};\n\t\t\tstroke-dashoffset: ${u * len};\n\t\t`\n    };\n}\nfunction crossfade(_a) {\n    var { fallback } = _a, defaults = __rest(_a, [\"fallback\"]);\n    const to_receive = new Map();\n    const to_send = new Map();\n    function crossfade(from_node, node, params) {\n        const { delay = 0, duration = d => Math.sqrt(d) * 30, easing = cubicOut } = assign(assign({}, defaults), params);\n        const from = from_node.getBoundingClientRect();\n        const to = node.getBoundingClientRect();\n        const dx = from.left - to.left;\n        const dy = from.top - to.top;\n        const dw = from.width / to.width;\n        const dh = from.height / to.height;\n        const d = Math.sqrt(dx * dx + dy * dy);\n        const style = getComputedStyle(node);\n        const transform = style.transform === 'none' ? '' : style.transform;\n        const opacity = +style.opacity;\n        return {\n            delay,\n            duration: is_function(duration) ? duration(d) : duration,\n            easing,\n            css: (t, u) => `\n\t\t\t\topacity: ${t * opacity};\n\t\t\t\ttransform-origin: top left;\n\t\t\t\ttransform: ${transform} translate(${u * dx}px,${u * dy}px) scale(${t + (1 - t) * dw}, ${t + (1 - t) * dh});\n\t\t\t`\n        };\n    }\n    function transition(items, counterparts, intro) {\n        return (node, params) => {\n            items.set(params.key, node);\n            return () => {\n                if (counterparts.has(params.key)) {\n                    const other_node = counterparts.get(params.key);\n                    counterparts.delete(params.key);\n                    return crossfade(other_node, node, params);\n                }\n                // if the node is disappearing altogether\n                // (i.e. wasn't claimed by the other list)\n                // then we need to supply an outro\n                items.delete(params.key);\n                return fallback && fallback(node, params, intro);\n            };\n        };\n    }\n    return [\n        transition(to_send, to_receive, false),\n        transition(to_receive, to_send, true)\n    ];\n}\n\nexport { blur, crossfade, draw, fade, fly, scale, slide };\n","export const baseUrl = 'https://walks.mikeboharsik.com';\nexport const baseApiUrl = `${baseUrl}/api`;\n","const tokenStorageKey = 'authToken';\n\nexport function storeJwt() {\n\tconst hash = window.location.hash;\n\tif (hash !== '') {\n\t\tconst [key, val] = hash.replace('#', '').split('=');\n\t\tif (key === 'token') {\n\t\t\tlocalStorage.setItem(tokenStorageKey, val);\n\t\t\thistory.pushState('', document.title, '/');\n\t\t}\n\t}\n}\n\nexport function getJwt() {\n\treturn localStorage.getItem(tokenStorageKey);\n}","import { baseApiUrl } from '../constants/api';\nimport { parseCsv } from './parseCsv';\nimport { getJwt } from './jwt';\n\nexport function getApiOptions() {\n\tlet options = { headers: {} };\n\n\tlet accessToken = getJwt();\n\tif (accessToken) {\n\t\toptions.headers.Authorization = `Bearer ${accessToken}`;\n\t}\n\n\treturn options;\n}\n\nexport function withAcceptCsv(options) {\n\toptions.headers.Accept = 'text/csv';\n\treturn options;\n}\n\nexport async function getEvents(q) {\n\tconst options = withAcceptCsv(getApiOptions());\n\n\treturn fetch(`${baseApiUrl}/events?q=${q}`, withAcceptCsv(options))\n\t\t.then(res => res.text())\n\t\t.then(res => parseCsv(res))\n}\n\nexport async function getGit() {\n\tconst options = getApiOptions();\n\n\treturn fetch(`${baseApiUrl}/git`, options)\n\t\t.then(res => res.json());\n}\n\nexport async function getSunx(date) {\n\tconst options = getApiOptions();\n\n\treturn fetch(`${baseApiUrl}/sunx?date=${date}`, options)\n\t\t.then(res => res.json());\n}\n\nexport async function getGlobalStats() {\n\tconst options = getApiOptions();\n\n\treturn fetch(`${baseApiUrl}/globalStats`, options)\n\t\t.then(res => res.json());\n}","export function parseCsv(rawCsv) {\n\tconst result = rawCsv\n\t\t.split(\"\\n\")\n\t\t.filter(e => e)\n\t\t.reduce((acc, cur, idx, arr) => {\n\t\t\tif(idx > 0) {\n\t\t\t\tconst [joinedKeys] = arr;\n\t\t\t\tconst keys = joinedKeys.split(\",\");\n\t\t\t\tconst curPieces = cur.split(\",\");\n\t\t\t\tconst newEntry = {};\n\t\t\t\tfor (let i = 0; i < keys.length; i++) {\n\t\t\t\t\tconst key = keys[i].slice(1, -1);\n\t\t\t\t\tlet val = curPieces[i].slice(1, -1);\n\t\t\t\t\ttry {\n\t\t\t\t\t\tnewEntry[key] = JSON.parse(val);\n\t\t\t\t\t} catch {\n\t\t\t\t\t\tnewEntry[key] = val;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tacc.push(newEntry);\n\t\t\t}\n\t\t\treturn acc;\n\t\t}, []);\n\n\treturn result;\n}\n","export const toFixedDefault = 2;\nexport const firstMonth = new Date(2022, 6, 1);","<script>\n\timport { onMount } from 'svelte';\n\timport { fade } from 'svelte/transition';\n\n\timport { getEvents } from '../util/api';\n\timport { firstMonth, toFixedDefault } from '../constants/config';\n\timport { EVENTS_DATA, EVENTS_DATA_IN_PROGRESS } from '../stores.js';\n\n\texport let currentMonth;\n\texport let currentMonthData;\n\texport let monthNames;\n\texport let now;\n\texport let realMonth;\n\texport let isRealMonth;\n\n\tconst hiddenStyle = 'visibility: hidden; pointer-events: none;';\n\n\tlet currentMonthTotalDistance = 0;\n\tlet isEarliestMonth;\n\tlet shouldHideLeftLeftButton;\n\tlet shouldHideRightRightButton;\n\n\tasync function updateEvents() {\n\t\tconst month = `${now.getFullYear()}-${(now.getMonth()+1).toString().padStart(2, '0')}`;\n\t\tEVENTS_DATA_IN_PROGRESS.update(() => true);\n\t\tconst monthEvents = await getEvents(month);\n\t\tEVENTS_DATA_IN_PROGRESS.update(() => false);\n\t\tEVENTS_DATA.update(() => monthEvents);\n\t}\n\n\tfunction subtractMonth() {\n\t\tnow = new Date(now.getFullYear(), now.getMonth() - 1, 1);\n\t\tupdateEvents();\n\t}\n\n\tfunction addMonth() {\n\t\tnow = new Date(now.getFullYear(), now.getMonth() + 1, 1);\n\t\tupdateEvents();\n\t}\n\n\tfunction setFirstMonth() {\n\t\tnow = firstMonth;\n\t\tupdateEvents();\n\t}\n\n\tfunction setLastMonth() {\n\t\tnow = new Date();\n\t\tupdateEvents();\n\t}\n\n\tonMount(async() => {\n\t\t\n\t});\n\n\t$: {\n\t\tshouldHideLeftLeftButton = parseInt(currentMonth) <= 8 && now.getFullYear() === 2022;\n\t\tisEarliestMonth = currentMonth === '07' && now.getFullYear() === 2022;\n\t\t// TODO: FIX: we need to check the absolute Date rather than just the number of month\n\t\tshouldHideRightRightButton = currentMonth >= realMonth - 1 && now.getFullYear() === new Date().getFullYear();\n\n\t\tconst monthDistanceInMeters = currentMonthData.reduce((monthTotal, curDay, idx) => {\n\t\t\treturn monthTotal + (curDay?.reduce((acc, cur) => acc + cur.distance, 0) ?? 0);\n\t\t}, 0);\n\n\t\tcurrentMonthTotalDistance = (monthDistanceInMeters / 1609).toFixed(toFixedDefault);\n\t}\n</script>\n\n<div transition:fade id=\"container-statusbar\">\n\t<div transition:fade>\n\t\t{now.getFullYear()}\n\t</div>\n\n\t<div transition:fade id=\"navButtons\">\n\t\t{#if shouldHideLeftLeftButton}\n\t\t<button style={hiddenStyle} on:click={setFirstMonth}>{'|<'}</button>\n\t\t{:else}\n\t\t<button on:click={setFirstMonth}>{'|<'}</button>\n\t\t{/if}\n\n\t\t&nbsp;&nbsp;&nbsp;\n\n\t\t{#if isEarliestMonth}\n\t\t<button style={hiddenStyle} on:click={subtractMonth}>{'<<'}</button>\n\t\t{:else}\n\t\t<button on:click={subtractMonth}>{'<<'}</button>\n\t\t{/if}\n\n\t\t&nbsp;&nbsp;&nbsp;\n\n\t\t<div id=\"monthName\">\n\t\t\t{monthNames[now.getMonth()]}\n\t\t</div>\n\n\t\t&nbsp;&nbsp;&nbsp;\n\n\t\t{#if isRealMonth}\n\t\t\t<button style={hiddenStyle} on:click={addMonth}>{'>>'}</button>\n\t\t{:else}\n\t\t\t<button on:click={addMonth}>{'>>'}</button>\n\t\t{/if}\n\n\t\t&nbsp;&nbsp;&nbsp;\n\n\t\t{#if shouldHideRightRightButton}\n\t\t\t<button style={hiddenStyle} on:click={setLastMonth}>{'>|'}</button>\n\t\t{:else}\n\t\t\t<button on:click={setLastMonth}>{'>|'}</button>\n\t\t{/if}\n\t</div>\n\n\t<div transition:fade>\n\t\t{currentMonthTotalDistance} miles\n\t</div>\n</div>\n\n<style>\n\t@media (prefers-color-scheme: dark) {\n\t\tbutton {\n\t\t\tbackground-color: #111;\n\t\t\tborder: 2px solid #666;\n\t\t\tcolor: #fff;\n\t\t}\n\n\t\t#container-statusbar {\n\t\t\ttext-shadow: black 0px 0px 4px, black 0px 0px 4px, black 0px 0px 4px, black 0px 0px 4px; user-select: none\n\t\t}\n\t}\n\n\t@media (prefers-color-scheme: light) {\n\t\tbutton {\n\t\t\tbackground-color: #eee;\n\t\t\tcolor: #000;\n\t\t}\n\n\t\t#container-statusbar {\n\t\t\ttext-shadow: white 0px 0px 4px, white 0px 0px 4px, white 0px 0px 4px, white 0px 0px 4px; user-select: none;\n\t\t}\n\t}\n\n\tbutton {\n\t\tborder-radius: 4px;\n\t\tfont-family: monospace;\n\t\tpadding-bottom: 3px;\n\t}\n\n\t#container-statusbar {\n\t\tbackdrop-filter: blur(8px);\n\t\tborder-radius: 4px;\n\t\tpadding: 8px;\n\t\tuser-select: none;\n\t}\n\n\t#navButtons {\n\t\tdisplay: flex;\n\t\tflex-direction: row\n\t}\n\n\t#monthName {\n\t\twidth: 96px; /* maintain consistent width to prevent button positions shifting when month changes */\n\t}\n</style>\n","<script>\n\timport { fade } from 'svelte/transition';\n</script>\n\n<div transition:fade id=\"container-sunsetapisourceattribution\">\n\tSunset data provided by <a target=\"_blank\" href=\"https://api.sunrise-sunset.org\">api.sunrise-sunset.org</a>\n</div>\n\n<style>\n\t@media (prefers-color-scheme: dark) {\n\t\ta {\n\t\t\tcolor: #66f;\n\t\t}\n\n\t\ta:visited {\n\t\t\tcolor: #66f;\n\t\t}\n\n\t\t#container-sunsetapisourceattribution {\n\t\t\ttext-shadow: black 0px 0px 4px, black 0px 0px 4px, black 0px 0px 4px, black 0px 0px 4px;\n\t\t}\n\t}\n\n\t@media (prefers-color-scheme: light) {\n\t\ta {\n\t\t\tcolor: navy;\n\t\t}\n\n\t\ta:visited {\n\t\t\tcolor: navy;\n\t\t}\n\n\t\t#container-sunsetapisourceattribution {\n\t\t\ttext-shadow: white 0px 0px 4px, white 0px 0px 4px, white 0px 0px 4px, white 0px 0px 4px;\n\t\t}\n\t}\n\n\tdiv {\n\t\tbackdrop-filter: blur(4px);\n\t\tborder-radius: 4px;\n\t\tpadding: 4px;\n\t\tfont-size: 0.66em;\n\t}\n</style>\n","/**\n * Helpers.\n */\n\nvar s = 1000;\nvar m = s * 60;\nvar h = m * 60;\nvar d = h * 24;\nvar w = d * 7;\nvar y = d * 365.25;\n\n/**\n * Parse or format the given `val`.\n *\n * Options:\n *\n *  - `long` verbose formatting [false]\n *\n * @param {String|Number} val\n * @param {Object} [options]\n * @throws {Error} throw an error if val is not a non-empty string or a number\n * @return {String|Number}\n * @api public\n */\n\nmodule.exports = function (val, options) {\n  options = options || {};\n  var type = typeof val;\n  if (type === 'string' && val.length > 0) {\n    return parse(val);\n  } else if (type === 'number' && isFinite(val)) {\n    return options.long ? fmtLong(val) : fmtShort(val);\n  }\n  throw new Error(\n    'val is not a non-empty string or a valid number. val=' +\n      JSON.stringify(val)\n  );\n};\n\n/**\n * Parse the given `str` and return milliseconds.\n *\n * @param {String} str\n * @return {Number}\n * @api private\n */\n\nfunction parse(str) {\n  str = String(str);\n  if (str.length > 100) {\n    return;\n  }\n  var match = /^(-?(?:\\d+)?\\.?\\d+) *(milliseconds?|msecs?|ms|seconds?|secs?|s|minutes?|mins?|m|hours?|hrs?|h|days?|d|weeks?|w|years?|yrs?|y)?$/i.exec(\n    str\n  );\n  if (!match) {\n    return;\n  }\n  var n = parseFloat(match[1]);\n  var type = (match[2] || 'ms').toLowerCase();\n  switch (type) {\n    case 'years':\n    case 'year':\n    case 'yrs':\n    case 'yr':\n    case 'y':\n      return n * y;\n    case 'weeks':\n    case 'week':\n    case 'w':\n      return n * w;\n    case 'days':\n    case 'day':\n    case 'd':\n      return n * d;\n    case 'hours':\n    case 'hour':\n    case 'hrs':\n    case 'hr':\n    case 'h':\n      return n * h;\n    case 'minutes':\n    case 'minute':\n    case 'mins':\n    case 'min':\n    case 'm':\n      return n * m;\n    case 'seconds':\n    case 'second':\n    case 'secs':\n    case 'sec':\n    case 's':\n      return n * s;\n    case 'milliseconds':\n    case 'millisecond':\n    case 'msecs':\n    case 'msec':\n    case 'ms':\n      return n;\n    default:\n      return undefined;\n  }\n}\n\n/**\n * Short format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtShort(ms) {\n  var msAbs = Math.abs(ms);\n  if (msAbs >= d) {\n    return Math.round(ms / d) + 'd';\n  }\n  if (msAbs >= h) {\n    return Math.round(ms / h) + 'h';\n  }\n  if (msAbs >= m) {\n    return Math.round(ms / m) + 'm';\n  }\n  if (msAbs >= s) {\n    return Math.round(ms / s) + 's';\n  }\n  return ms + 'ms';\n}\n\n/**\n * Long format for `ms`.\n *\n * @param {Number} ms\n * @return {String}\n * @api private\n */\n\nfunction fmtLong(ms) {\n  var msAbs = Math.abs(ms);\n  if (msAbs >= d) {\n    return plural(ms, msAbs, d, 'day');\n  }\n  if (msAbs >= h) {\n    return plural(ms, msAbs, h, 'hour');\n  }\n  if (msAbs >= m) {\n    return plural(ms, msAbs, m, 'minute');\n  }\n  if (msAbs >= s) {\n    return plural(ms, msAbs, s, 'second');\n  }\n  return ms + ' ms';\n}\n\n/**\n * Pluralization helper.\n */\n\nfunction plural(ms, msAbs, n, name) {\n  var isPlural = msAbs >= n * 1.5;\n  return Math.round(ms / n) + ' ' + name + (isPlural ? 's' : '');\n}\n","\n/**\n * This is the common logic for both the Node.js and web browser\n * implementations of `debug()`.\n */\n\nfunction setup(env) {\n\tcreateDebug.debug = createDebug;\n\tcreateDebug.default = createDebug;\n\tcreateDebug.coerce = coerce;\n\tcreateDebug.disable = disable;\n\tcreateDebug.enable = enable;\n\tcreateDebug.enabled = enabled;\n\tcreateDebug.humanize = require('ms');\n\tcreateDebug.destroy = destroy;\n\n\tObject.keys(env).forEach(key => {\n\t\tcreateDebug[key] = env[key];\n\t});\n\n\t/**\n\t* The currently active debug mode names, and names to skip.\n\t*/\n\n\tcreateDebug.names = [];\n\tcreateDebug.skips = [];\n\n\t/**\n\t* Map of special \"%n\" handling functions, for the debug \"format\" argument.\n\t*\n\t* Valid key names are a single, lower or upper-case letter, i.e. \"n\" and \"N\".\n\t*/\n\tcreateDebug.formatters = {};\n\n\t/**\n\t* Selects a color for a debug namespace\n\t* @param {String} namespace The namespace string for the debug instance to be colored\n\t* @return {Number|String} An ANSI color code for the given namespace\n\t* @api private\n\t*/\n\tfunction selectColor(namespace) {\n\t\tlet hash = 0;\n\n\t\tfor (let i = 0; i < namespace.length; i++) {\n\t\t\thash = ((hash << 5) - hash) + namespace.charCodeAt(i);\n\t\t\thash |= 0; // Convert to 32bit integer\n\t\t}\n\n\t\treturn createDebug.colors[Math.abs(hash) % createDebug.colors.length];\n\t}\n\tcreateDebug.selectColor = selectColor;\n\n\t/**\n\t* Create a debugger with the given `namespace`.\n\t*\n\t* @param {String} namespace\n\t* @return {Function}\n\t* @api public\n\t*/\n\tfunction createDebug(namespace) {\n\t\tlet prevTime;\n\t\tlet enableOverride = null;\n\t\tlet namespacesCache;\n\t\tlet enabledCache;\n\n\t\tfunction debug(...args) {\n\t\t\t// Disabled?\n\t\t\tif (!debug.enabled) {\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst self = debug;\n\n\t\t\t// Set `diff` timestamp\n\t\t\tconst curr = Number(new Date());\n\t\t\tconst ms = curr - (prevTime || curr);\n\t\t\tself.diff = ms;\n\t\t\tself.prev = prevTime;\n\t\t\tself.curr = curr;\n\t\t\tprevTime = curr;\n\n\t\t\targs[0] = createDebug.coerce(args[0]);\n\n\t\t\tif (typeof args[0] !== 'string') {\n\t\t\t\t// Anything else let's inspect with %O\n\t\t\t\targs.unshift('%O');\n\t\t\t}\n\n\t\t\t// Apply any `formatters` transformations\n\t\t\tlet index = 0;\n\t\t\targs[0] = args[0].replace(/%([a-zA-Z%])/g, (match, format) => {\n\t\t\t\t// If we encounter an escaped % then don't increase the array index\n\t\t\t\tif (match === '%%') {\n\t\t\t\t\treturn '%';\n\t\t\t\t}\n\t\t\t\tindex++;\n\t\t\t\tconst formatter = createDebug.formatters[format];\n\t\t\t\tif (typeof formatter === 'function') {\n\t\t\t\t\tconst val = args[index];\n\t\t\t\t\tmatch = formatter.call(self, val);\n\n\t\t\t\t\t// Now we need to remove `args[index]` since it's inlined in the `format`\n\t\t\t\t\targs.splice(index, 1);\n\t\t\t\t\tindex--;\n\t\t\t\t}\n\t\t\t\treturn match;\n\t\t\t});\n\n\t\t\t// Apply env-specific formatting (colors, etc.)\n\t\t\tcreateDebug.formatArgs.call(self, args);\n\n\t\t\tconst logFn = self.log || createDebug.log;\n\t\t\tlogFn.apply(self, args);\n\t\t}\n\n\t\tdebug.namespace = namespace;\n\t\tdebug.useColors = createDebug.useColors();\n\t\tdebug.color = createDebug.selectColor(namespace);\n\t\tdebug.extend = extend;\n\t\tdebug.destroy = createDebug.destroy; // XXX Temporary. Will be removed in the next major release.\n\n\t\tObject.defineProperty(debug, 'enabled', {\n\t\t\tenumerable: true,\n\t\t\tconfigurable: false,\n\t\t\tget: () => {\n\t\t\t\tif (enableOverride !== null) {\n\t\t\t\t\treturn enableOverride;\n\t\t\t\t}\n\t\t\t\tif (namespacesCache !== createDebug.namespaces) {\n\t\t\t\t\tnamespacesCache = createDebug.namespaces;\n\t\t\t\t\tenabledCache = createDebug.enabled(namespace);\n\t\t\t\t}\n\n\t\t\t\treturn enabledCache;\n\t\t\t},\n\t\t\tset: v => {\n\t\t\t\tenableOverride = v;\n\t\t\t}\n\t\t});\n\n\t\t// Env-specific initialization logic for debug instances\n\t\tif (typeof createDebug.init === 'function') {\n\t\t\tcreateDebug.init(debug);\n\t\t}\n\n\t\treturn debug;\n\t}\n\n\tfunction extend(namespace, delimiter) {\n\t\tconst newDebug = createDebug(this.namespace + (typeof delimiter === 'undefined' ? ':' : delimiter) + namespace);\n\t\tnewDebug.log = this.log;\n\t\treturn newDebug;\n\t}\n\n\t/**\n\t* Enables a debug mode by namespaces. This can include modes\n\t* separated by a colon and wildcards.\n\t*\n\t* @param {String} namespaces\n\t* @api public\n\t*/\n\tfunction enable(namespaces) {\n\t\tcreateDebug.save(namespaces);\n\t\tcreateDebug.namespaces = namespaces;\n\n\t\tcreateDebug.names = [];\n\t\tcreateDebug.skips = [];\n\n\t\tconst split = (typeof namespaces === 'string' ? namespaces : '')\n\t\t\t.trim()\n\t\t\t.replace(' ', ',')\n\t\t\t.split(',')\n\t\t\t.filter(Boolean);\n\n\t\tfor (const ns of split) {\n\t\t\tif (ns[0] === '-') {\n\t\t\t\tcreateDebug.skips.push(ns.slice(1));\n\t\t\t} else {\n\t\t\t\tcreateDebug.names.push(ns);\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Checks if the given string matches a namespace template, honoring\n\t * asterisks as wildcards.\n\t *\n\t * @param {String} search\n\t * @param {String} template\n\t * @return {Boolean}\n\t */\n\tfunction matchesTemplate(search, template) {\n\t\tlet searchIndex = 0;\n\t\tlet templateIndex = 0;\n\t\tlet starIndex = -1;\n\t\tlet matchIndex = 0;\n\n\t\twhile (searchIndex < search.length) {\n\t\t\tif (templateIndex < template.length && (template[templateIndex] === search[searchIndex] || template[templateIndex] === '*')) {\n\t\t\t\t// Match character or proceed with wildcard\n\t\t\t\tif (template[templateIndex] === '*') {\n\t\t\t\t\tstarIndex = templateIndex;\n\t\t\t\t\tmatchIndex = searchIndex;\n\t\t\t\t\ttemplateIndex++; // Skip the '*'\n\t\t\t\t} else {\n\t\t\t\t\tsearchIndex++;\n\t\t\t\t\ttemplateIndex++;\n\t\t\t\t}\n\t\t\t} else if (starIndex !== -1) { // eslint-disable-line no-negated-condition\n\t\t\t\t// Backtrack to the last '*' and try to match more characters\n\t\t\t\ttemplateIndex = starIndex + 1;\n\t\t\t\tmatchIndex++;\n\t\t\t\tsearchIndex = matchIndex;\n\t\t\t} else {\n\t\t\t\treturn false; // No match\n\t\t\t}\n\t\t}\n\n\t\t// Handle trailing '*' in template\n\t\twhile (templateIndex < template.length && template[templateIndex] === '*') {\n\t\t\ttemplateIndex++;\n\t\t}\n\n\t\treturn templateIndex === template.length;\n\t}\n\n\t/**\n\t* Disable debug output.\n\t*\n\t* @return {String} namespaces\n\t* @api public\n\t*/\n\tfunction disable() {\n\t\tconst namespaces = [\n\t\t\t...createDebug.names,\n\t\t\t...createDebug.skips.map(namespace => '-' + namespace)\n\t\t].join(',');\n\t\tcreateDebug.enable('');\n\t\treturn namespaces;\n\t}\n\n\t/**\n\t* Returns true if the given mode name is enabled, false otherwise.\n\t*\n\t* @param {String} name\n\t* @return {Boolean}\n\t* @api public\n\t*/\n\tfunction enabled(name) {\n\t\tfor (const skip of createDebug.skips) {\n\t\t\tif (matchesTemplate(name, skip)) {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t}\n\n\t\tfor (const ns of createDebug.names) {\n\t\t\tif (matchesTemplate(name, ns)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\n\t\treturn false;\n\t}\n\n\t/**\n\t* Coerce `val`.\n\t*\n\t* @param {Mixed} val\n\t* @return {Mixed}\n\t* @api private\n\t*/\n\tfunction coerce(val) {\n\t\tif (val instanceof Error) {\n\t\t\treturn val.stack || val.message;\n\t\t}\n\t\treturn val;\n\t}\n\n\t/**\n\t* XXX DO NOT USE. This is a temporary stub function.\n\t* XXX It WILL be removed in the next major release.\n\t*/\n\tfunction destroy() {\n\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t}\n\n\tcreateDebug.enable(createDebug.load());\n\n\treturn createDebug;\n}\n\nmodule.exports = setup;\n","/* eslint-env browser */\n\n/**\n * This is the web browser implementation of `debug()`.\n */\n\nexports.formatArgs = formatArgs;\nexports.save = save;\nexports.load = load;\nexports.useColors = useColors;\nexports.storage = localstorage();\nexports.destroy = (() => {\n\tlet warned = false;\n\n\treturn () => {\n\t\tif (!warned) {\n\t\t\twarned = true;\n\t\t\tconsole.warn('Instance method `debug.destroy()` is deprecated and no longer does anything. It will be removed in the next major version of `debug`.');\n\t\t}\n\t};\n})();\n\n/**\n * Colors.\n */\n\nexports.colors = [\n\t'#0000CC',\n\t'#0000FF',\n\t'#0033CC',\n\t'#0033FF',\n\t'#0066CC',\n\t'#0066FF',\n\t'#0099CC',\n\t'#0099FF',\n\t'#00CC00',\n\t'#00CC33',\n\t'#00CC66',\n\t'#00CC99',\n\t'#00CCCC',\n\t'#00CCFF',\n\t'#3300CC',\n\t'#3300FF',\n\t'#3333CC',\n\t'#3333FF',\n\t'#3366CC',\n\t'#3366FF',\n\t'#3399CC',\n\t'#3399FF',\n\t'#33CC00',\n\t'#33CC33',\n\t'#33CC66',\n\t'#33CC99',\n\t'#33CCCC',\n\t'#33CCFF',\n\t'#6600CC',\n\t'#6600FF',\n\t'#6633CC',\n\t'#6633FF',\n\t'#66CC00',\n\t'#66CC33',\n\t'#9900CC',\n\t'#9900FF',\n\t'#9933CC',\n\t'#9933FF',\n\t'#99CC00',\n\t'#99CC33',\n\t'#CC0000',\n\t'#CC0033',\n\t'#CC0066',\n\t'#CC0099',\n\t'#CC00CC',\n\t'#CC00FF',\n\t'#CC3300',\n\t'#CC3333',\n\t'#CC3366',\n\t'#CC3399',\n\t'#CC33CC',\n\t'#CC33FF',\n\t'#CC6600',\n\t'#CC6633',\n\t'#CC9900',\n\t'#CC9933',\n\t'#CCCC00',\n\t'#CCCC33',\n\t'#FF0000',\n\t'#FF0033',\n\t'#FF0066',\n\t'#FF0099',\n\t'#FF00CC',\n\t'#FF00FF',\n\t'#FF3300',\n\t'#FF3333',\n\t'#FF3366',\n\t'#FF3399',\n\t'#FF33CC',\n\t'#FF33FF',\n\t'#FF6600',\n\t'#FF6633',\n\t'#FF9900',\n\t'#FF9933',\n\t'#FFCC00',\n\t'#FFCC33'\n];\n\n/**\n * Currently only WebKit-based Web Inspectors, Firefox >= v31,\n * and the Firebug extension (any Firefox version) are known\n * to support \"%c\" CSS customizations.\n *\n * TODO: add a `localStorage` variable to explicitly enable/disable colors\n */\n\n// eslint-disable-next-line complexity\nfunction useColors() {\n\t// NB: In an Electron preload script, document will be defined but not fully\n\t// initialized. Since we know we're in Chrome, we'll just detect this case\n\t// explicitly\n\tif (typeof window !== 'undefined' && window.process && (window.process.type === 'renderer' || window.process.__nwjs)) {\n\t\treturn true;\n\t}\n\n\t// Internet Explorer and Edge do not support colors.\n\tif (typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/(edge|trident)\\/(\\d+)/)) {\n\t\treturn false;\n\t}\n\n\tlet m;\n\n\t// Is webkit? http://stackoverflow.com/a/16459606/376773\n\t// document is undefined in react-native: https://github.com/facebook/react-native/pull/1632\n\t// eslint-disable-next-line no-return-assign\n\treturn (typeof document !== 'undefined' && document.documentElement && document.documentElement.style && document.documentElement.style.WebkitAppearance) ||\n\t\t// Is firebug? http://stackoverflow.com/a/398120/376773\n\t\t(typeof window !== 'undefined' && window.console && (window.console.firebug || (window.console.exception && window.console.table))) ||\n\t\t// Is firefox >= v31?\n\t\t// https://developer.mozilla.org/en-US/docs/Tools/Web_Console#Styling_messages\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && (m = navigator.userAgent.toLowerCase().match(/firefox\\/(\\d+)/)) && parseInt(m[1], 10) >= 31) ||\n\t\t// Double check webkit in userAgent just in case we are in a worker\n\t\t(typeof navigator !== 'undefined' && navigator.userAgent && navigator.userAgent.toLowerCase().match(/applewebkit\\/(\\d+)/));\n}\n\n/**\n * Colorize log arguments if enabled.\n *\n * @api public\n */\n\nfunction formatArgs(args) {\n\targs[0] = (this.useColors ? '%c' : '') +\n\t\tthis.namespace +\n\t\t(this.useColors ? ' %c' : ' ') +\n\t\targs[0] +\n\t\t(this.useColors ? '%c ' : ' ') +\n\t\t'+' + module.exports.humanize(this.diff);\n\n\tif (!this.useColors) {\n\t\treturn;\n\t}\n\n\tconst c = 'color: ' + this.color;\n\targs.splice(1, 0, c, 'color: inherit');\n\n\t// The final \"%c\" is somewhat tricky, because there could be other\n\t// arguments passed either before or after the %c, so we need to\n\t// figure out the correct index to insert the CSS into\n\tlet index = 0;\n\tlet lastC = 0;\n\targs[0].replace(/%[a-zA-Z%]/g, match => {\n\t\tif (match === '%%') {\n\t\t\treturn;\n\t\t}\n\t\tindex++;\n\t\tif (match === '%c') {\n\t\t\t// We only are interested in the *last* %c\n\t\t\t// (the user may have provided their own)\n\t\t\tlastC = index;\n\t\t}\n\t});\n\n\targs.splice(lastC, 0, c);\n}\n\n/**\n * Invokes `console.debug()` when available.\n * No-op when `console.debug` is not a \"function\".\n * If `console.debug` is not available, falls back\n * to `console.log`.\n *\n * @api public\n */\nexports.log = console.debug || console.log || (() => {});\n\n/**\n * Save `namespaces`.\n *\n * @param {String} namespaces\n * @api private\n */\nfunction save(namespaces) {\n\ttry {\n\t\tif (namespaces) {\n\t\t\texports.storage.setItem('debug', namespaces);\n\t\t} else {\n\t\t\texports.storage.removeItem('debug');\n\t\t}\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\n/**\n * Load `namespaces`.\n *\n * @return {String} returns the previously persisted debug modes\n * @api private\n */\nfunction load() {\n\tlet r;\n\ttry {\n\t\tr = exports.storage.getItem('debug');\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n\n\t// If debug isn't set in LS, and we're in Electron, try to load $DEBUG\n\tif (!r && typeof process !== 'undefined' && 'env' in process) {\n\t\tr = process.env.DEBUG;\n\t}\n\n\treturn r;\n}\n\n/**\n * Localstorage attempts to return the localstorage.\n *\n * This is necessary because safari throws\n * when a user disables cookies/localstorage\n * and you attempt to access it.\n *\n * @return {LocalStorage}\n * @api private\n */\n\nfunction localstorage() {\n\ttry {\n\t\t// TVMLKit (Apple TV JS Runtime) does not have a window object, just localStorage in the global context\n\t\t// The Browser also has localStorage in the global context.\n\t\treturn localStorage;\n\t} catch (error) {\n\t\t// Swallow\n\t\t// XXX (@Qix-) should we be logging these?\n\t}\n}\n\nmodule.exports = require('./common')(exports);\n\nconst {formatters} = module.exports;\n\n/**\n * Map %j to `JSON.stringify()`, since no Web Inspectors do that by default.\n */\n\nformatters.j = function (v) {\n\ttry {\n\t\treturn JSON.stringify(v);\n\t} catch (error) {\n\t\treturn '[UnexpectedJSONParseError]: ' + error.message;\n\t}\n};\n","<script>\n\timport { onMount } from 'svelte';\n\timport { fade } from 'svelte/transition';\n\n\timport debug from 'debug';\n\n\timport { baseApiUrl } from '../constants/api';\n\n\tconst log = debug('ThumbnailGrid');\n\n\tconst thumbnailWidth = 160;\n\tconst thumbnailHeight = 90;\n\n\tconst marginX = 4;\n\tconst marginY = 4;\n\tconst paddingX = 2;\n\tconst paddingY = 2;\n\n\tconst imageFadeTime = 15000;\n\tconst newImageInterval = parseInt((1/9) * imageFadeTime);\n\n\tlet imageCountX = 0;\n\tlet imageCountY = 0;\n\tlet imageCells;\n\tlet lastFrameTime = 0;\n\n\tlet intervalRef;\n\tlet allVideoIds = [];\n\tlet thumbnailCache = {};\n\n\tlet isTabInFocus = true;\n\tlet lastPausedTime = null;\n\tlet populateImageGridCellLastLog = null;\n\n\tconst offset = 32;\n\tconst darkModeColor = `${offset}, ${offset}, ${offset}`;\n\tconst lightModeColor = `${256 - offset}, ${256 - offset}, ${256 - offset}`;\n\tlet backgroundColor = window.matchMedia('(prefers-color-scheme: dark)').matches ? darkModeColor : lightModeColor;\n\n\twindow.matchMedia('(prefers-color-scheme: dark)')\n\t\t.addEventListener('change', event => {\n\t\t\tif (event.matches) {\n\t\t\t\tbackgroundColor = darkModeColor;\n\t\t\t} else {\n\t\t\t\tbackgroundColor = lightModeColor;\n\t\t\t}\n\t\t});\n\n\twindow.addEventListener('blur', () => { isTabInFocus = false; lastPausedTime = performance.now(); });\n\twindow.addEventListener('focus', () => { isTabInFocus = true; });\n\n\tasync function getBitmapForThumbnail(videoId) {\n\t\tif (!videoId) {\n\t\t\tthrow new Error(\"Cannot fetch a thumbnail for an undefined video\");\n\t\t}\n\n\t\tconst cached = thumbnailCache[videoId];\n\t\tif (cached) {\n\t\t\treturn cached;\n\t\t}\n\n\t\treturn await fetch(`${baseApiUrl}/yt-thumbnail?videoId=${videoId}`)\n\t\t\t.then(res => res.blob())\n\t\t\t.then(imgData => createImageBitmap(imgData));\n\t}\n\n\tfunction populateImageArray() {\n\t\tconst calendarContainer = document.querySelector('#container-walkcalendar');\n\t\tif (!calendarContainer) {\n\t\t\tlog('Failed to find the calendar container');\n\t\t\treturn;\n\t\t}\n\n\t\tconst calendarBoundingRect = calendarContainer.getBoundingClientRect();\n\n\t\tconst initImageCountX = imageCountX;\n\t\tconst initImageCountY = imageCountY;\n\n\t\timageCountX = Math.floor((window.innerWidth - (marginX * 2)) / (thumbnailWidth + paddingX));\n\t\timageCountY = Math.floor((window.innerHeight - (marginY * 2)) / (thumbnailHeight + paddingY));\n\n\t\tif (initImageCountX === imageCountX && initImageCountY === imageCountY) {\n\t\t\treturn;\n\t\t}\n\n\t\timageCells = new Array(imageCountX);\n\t\tfor (let x = 0; x < imageCountX; x++) {\n\t\t\timageCells[x] = new Array(imageCountY);\n\t\t\tfor (let y = 0; y < imageCountY; y++) {\n\t\t\t\tconst posX = marginX + x * thumbnailWidth + x;\n\t\t\t\tconst posY = marginY + y * thumbnailHeight + y;\n\n\t\t\t\tconst isHidden = posX + thumbnailWidth >= calendarBoundingRect.left && posX <= calendarBoundingRect.right;\n\n\t\t\t\timageCells[x][y] = {\n\t\t\t\t\tisPointInside: function(inX, inY) {\n\t\t\t\t\t\tlet withinXBounds = inX > posX && inX < posX + thumbnailWidth;\n\t\t\t\t\t\tlet withinYBounds = inY > posY && inY < posY + thumbnailHeight;\n\n\t\t\t\t\t\treturn withinXBounds && withinYBounds;\n\t\t\t\t\t},\n\t\t\t\t\tisHidden,\n\t\t\t\t\tposX,\n\t\t\t\t\tposY,\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction handleCanvasClick(e) {\n\t\te.prev\n\n\t\tconst { x, y } = e;\n\n\t\tconst hit = imageCells.flat().find(({ isHidden, isPointInside, videoId }) => !isHidden && videoId && isPointInside(x, y));\n\t\tif (hit) {\n\t\t\twindow.open(`https://youtu.be/${hit.videoId}`, '_blank', 'noopener');\n\t\t}\n\t}\n\n\tfunction draw(ts) {\n\t\tif (!isTabInFocus) {\n\t\t\tif (!populateImageGridCellLastLog || new Date().getTime() - populateImageGridCellLastLog > 1000) {\n\t\t\t\tlog('Skipping draw as tab is not in focus');\n\t\t\t\tpopulateImageGridCellLastLog = new Date().getTime();\n\t\t\t}\n\t\t\treturn window.requestAnimationFrame(draw);\n\t\t}\n\n\t\tlet dt;\n\t\tif (lastPausedTime) {\n\t\t\tconst timePaused = ts - lastPausedTime;\n\t\t\tdt = parseInt(ts - lastFrameTime - timePaused);\n\t\t\tlastPausedTime = null;\n\t\t\tlog(`Set dt to ${dt} based on lastPausedTime`);\n\t\t} else {\n\t\t\tdt = parseInt(ts - lastFrameTime);\n\t\t}\n\n\t\tconst canvas = document.getElementById('canvas');\n\t\tlet ctx;\n\t\ttry {\n\t\t\tctx = canvas.getContext('2d');\n\t\t} catch (e) {\n\t\t\treturn;\n\t\t}\n\n\t\tctx.save();\n\t\tctx.fillStyle = `rgba(${backgroundColor}, 255)`;\n\t\tctx.fillRect(0, 0, canvas.width, canvas.height);\n\t\tctx.restore();\n\n\t\tfor (let x = 0; x < imageCountX; x++) {\n\t\t\tfor (let y = 0; y < imageCountY; y++) {\n\t\t\t\ttry {\n\t\t\t\t\tconst curCell = imageCells[x][y];\n\t\t\t\t\tconst { image, posX, posY, timeLeft } = curCell;\n\n\t\t\t\t\tif (image && timeLeft) {\n\t\t\t\t\t\t// multiply by 2 since we want to use the entire loaded image but scale it to half its size, which is the thumbnail width and height\n\t\t\t\t\t\tctx.drawImage(image, 0, 0, thumbnailWidth * 2, thumbnailHeight * 2, posX, posY, thumbnailWidth, thumbnailHeight);\n\n\t\t\t\t\t\tctx.save();\n\t\t\t\t\t\tconst alpha = (imageFadeTime - timeLeft) / imageFadeTime;\n\t\t\t\t\t\tctx.fillStyle = `rgba(${backgroundColor}, ${alpha})`;\n\t\t\t\t\t\tctx.fillRect(posX, posY, thumbnailWidth, thumbnailHeight);\n\t\t\t\t\t\tctx.restore();\n\n\t\t\t\t\t\tcurCell.timeLeft -= dt;\n\n\t\t\t\t\t\tif (curCell.timeLeft <= 0) {\n\t\t\t\t\t\t\tcurCell.image = null;\n\t\t\t\t\t\t\tcurCell.timeLeft = null;\n\t\t\t\t\t\t\tcurCell.videoId = null;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} catch(e) {\n\t\t\t\t\tlog(e, x, y, imageCountX * x + y);\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tlastFrameTime = ts;\n\n\t\twindow.requestAnimationFrame(draw);\n\t}\n\n\tfunction getRandomWithMax(max) {\n\t\treturn Math.floor(Math.random() * max);\n\t}\n\n\tasync function populateImageGridCell() {\n\t\tif (!isTabInFocus) {\n\t\t\tlog('Skipping populateImageGridCell as tab is not in focus');\n\t\t\treturn;\n\t\t}\n\n\t\tif (allVideoIds.length <= 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst candidates = imageCells.flat().filter(({ isHidden, timeLeft }) => !isHidden && !timeLeft);\n\t\t// TODO: what if there are no remaining candidates?\n\n\t\tconst cell = candidates[getRandomWithMax(candidates.length)];\n\n\t\tif (cell) {\n\t\t\tlet availableVideoIds = allVideoIds.filter(videoId => !Object.keys(thumbnailCache).includes(videoId));\n\t\t\tif (availableVideoIds.length <= 0) {\n\t\t\t\tconsole.debug('Ran out of thumbnails to fetch, falling back to cached images');\n\t\t\t\tavailableVideoIds = Object.keys(thumbnailCache);\n\t\t\t}\n\n\t\t\tconst vidIdx = getRandomWithMax(availableVideoIds.length);\n\t\t\tconst vidId = availableVideoIds[vidIdx];\n\n\t\t\tcell.image = await getBitmapForThumbnail(vidId);\n\t\t\tcell.timeLeft = imageFadeTime;\n\t\t\tcell.videoId = vidId;\n\n\t\t\tthumbnailCache[vidId] = cell.image;\n\t\t} else {\n\t\t\tlog('bad index', cell, imageCells);\n\t\t}\n\t}\n\n\tasync function setupCanvas() {\n\t\tconst canvas = document.getElementById('canvas');\n\t\tif (!canvas) {\n\t\t\tlog('Failed to get canvas');\n\t\t\treturn;\n\t\t}\n\n\t\tcanvas.height = window.innerHeight;\n\t\tcanvas.width = window.innerWidth;\n\n\t\tpopulateImageArray();\n\n\t\tallVideoIds = await fetch(`${baseApiUrl}/youtubeIds`).then(res => res.json());\n\n\t\twindow.requestAnimationFrame(draw);\n\n\t\taddEventListener(\"resize\", () => {\n\t\t\tcanvas.height = window.innerHeight;\n\t\t\tcanvas.width = window.innerWidth;\n\n\t\t\tpopulateImageArray();\n\t\t\tdraw();\n\n\t\t\tclearInterval(intervalRef);\n\t\t\tintervalRef = setInterval(populateImageGridCell, newImageInterval);\n\t\t});\n\n\t\tclearInterval(intervalRef);\n\t\tintervalRef = setInterval(populateImageGridCell, newImageInterval);\n\t}\n\n\tonMount(() => {\n\t\tsetupCanvas();\n\t});\n</script>\n\n<canvas\n\tstyle=\"position: absolute; top: 0; left: 0;\"\n\ttransition:fade\n\tid=\"canvas\"\n\ton:click={handleCanvasClick}\n>\n</canvas>\n\n<style>\n</style>\n","function padNumber(n) {\n\treturn n.toString().padStart(2, '0');\n}\n\nexport function getPaddedDateString(date) {\n\treturn `${padNumber(date.getFullYear())}-${padNumber(date.getMonth() + 1)}-${padNumber(date.getDate())}`;\n}\n\nexport function getPaddedTimeString(date) {\n\treturn `${padNumber(date.getHours())}:${padNumber(date.getMinutes())}:${padNumber(date.getSeconds())}`;\n}\n","<script>\n\timport { fade } from 'svelte/transition';\n\n\timport { toFixedDefault } from '../constants/config';\n\timport { EVENTS_DATA_IN_PROGRESS, SUNX_DATA } from '../stores.js';\n\n\timport { getPaddedDateString, getPaddedTimeString } from '../util/date';\n\n\texport let currentMonthData = [];\n\texport let currentDate;\n\texport let firstDayOffset;\n\texport let isRealMonth;\n\texport let daysInMonth;\n\n\tlet sunxData = null;\n\tSUNX_DATA.subscribe(val => sunxData = val);\n\n\tlet eventsDataInProgress = false;\n\tEVENTS_DATA_IN_PROGRESS.subscribe(val => eventsDataInProgress = val);\n\n\tconst now = new Date();\n\tconst todaySunrise = new Date(sunxData.today.sunrise);\n\tconst todaySunset = new Date(sunxData.today.sunset);\n\tconst tomorrowSunrise = new Date(sunxData.tomorrow.sunrise);\n\n\tconst isPastTodaySunrise = now > todaySunrise;\n\n\tconst didWalkToday = !!currentMonthData.find((dayData) => dayData?.date === getPaddedDateString(now));\n\n\tconst dayNames = [\n\t\t'Su',\n\t\t'Mo',\n\t\t'Tu',\n\t\t'We',\n\t\t'Th',\n\t\t'Fr',\n\t\t'Sa'\n\t];\n\n\tfunction getDayClasses({ isEmptyDay, isFutureDay, isFuturePaddingDay, isPendingDay, isTomorrow, isWalkDay }) {\n\t\tlet classes = ['day'];\n\n\t\tif (eventsDataInProgress) {\n\t\t\t// do not push classes\n\t\t}\n\t\telse if (isPendingDay || didWalkToday && isTomorrow) {\n\t\t\tclasses.push('pending-day');\n\t\t}\n\t\telse if (isWalkDay) {\n\t\t\tclasses.push('walk-day');\n\t\t}\n\t\telse if (isFuturePaddingDay) {\n\t\t\tclasses.push('future-padding-day');\n\t\t}\n\t\telse if (!isEmptyDay && !isFutureDay) {\n\t\t\tclasses.push('non-walk-day');\n\t\t}\n\n\t\treturn classes.join(' ');\n\t}\n\n\tfunction getDateDistanceSum(date) {\n\t\ttry {\n\t\t\treturn ((currentMonthData\n\t\t\t\t.find(dayData => dayData?.some(e => e.date === date))\n\t\t\t\t.reduce((acc, { distance }) => { return acc + (distance ?? 0); }, 0)) / 1609).toFixed(toFixedDefault);\n\t\t}\tcatch(e) {\n\t\t\tconsole.error(e);\n\t\t\treturn null;\n\t\t}\n\t}\n\n\t$: {\n\t\t// console.log({ currentMonthData });\n\t}\n</script>\n\n<div transition:fade id=\"container-walkcalendar\">\n\t{#each dayNames as day}\n\t\t<h5>{day}</h5>\n\t{/each}\n\n\t{#each currentMonthData as dayData, idx}\n\t\t{@const dateNumber = idx - firstDayOffset + 1}\n\t\t{@const currentDateIdx = currentDate + firstDayOffset - 1}\n\t\t{@const isCurrentDate = idx === currentDateIdx}\n\n\t\t{@const isEmptyDay = idx < firstDayOffset}\n\t\t{@const isFutureDay = isRealMonth && idx > currentDateIdx}\n\t\t{@const isTomorrow = isRealMonth && idx === currentDateIdx + 1}\n\t\t{@const isPendingDay = isRealMonth && isCurrentDate && !dayData?.length}\n\t\t{@const isWalkDay = !!dayData?.length}\n\t\t{@const isFuturePaddingDay = idx > daysInMonth + firstDayOffset - 1}\n\n\t\t{@const classes = getDayClasses({ isEmptyDay, isFutureDay, isFuturePaddingDay, isPendingDay, isTomorrow, isWalkDay })}\n\n\t\t{@const dateDistanceSum = dayData?.[0]?.date ? getDateDistanceSum(dayData?.[0]?.date) : null}\n\t\t{@const walkDayContent = dateDistanceSum === null ? null : `${dateDistanceSum} miles`}\n\n\t\t<div class={classes}>\n\t\t\t{#if !isEmptyDay && !isFuturePaddingDay}\n\t\t\t\t<div class=\"date-number\">{dateNumber}</div>\n\t\t\t{/if}\n\t\t\t{#if isWalkDay}\n\t\t\t\t<div style={`opacity: ${walkDayContent ? 1 : 0}`}>{walkDayContent}</div>\n\t\t\t\t<div style=\"display: flex\">\n\t\t\t\t\t{#each dayData as walk}\n\t\t\t\t\t\t<div style=\"display: flex; font-size: 0.8em; flex-direction: column\">\n\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\thref={`https://walks.mikeboharsik.com/api/routes?date=${walk.date}`}\n\t\t\t\t\t\t\t\tnoreferrer\n\t\t\t\t\t\t\t\tnoopener\n\t\t\t\t\t\t\t\tstyle=\"text-decoration: none\"\n\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\ttitle={`Walk Route`}\n\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t🗺️\n\t\t\t\t\t\t\t</a>\n\n\t\t\t\t\t\t\t{#if walk.youtubeId}\n\t\t\t\t\t\t\t\t<a\n\t\t\t\t\t\t\t\t\thref={`https://youtu.be/${walk.youtubeId}`}\n\t\t\t\t\t\t\t\t\tnoreferrer\n\t\t\t\t\t\t\t\t\tnoopener\n\t\t\t\t\t\t\t\t\tstyle=\"text-decoration: none\"\n\t\t\t\t\t\t\t\t\ttarget=\"_blank\"\n\t\t\t\t\t\t\t\t\ttitle={`Walk Video`}\n\t\t\t\t\t\t\t\t>\n\t\t\t\t\t\t\t\t\t🎥\n\t\t\t\t\t\t\t\t</a>\n\t\t\t\t\t\t\t{/if}\n\t\t\t\t\t\t</div>\n\t\t\t\t\t{/each}\n\t\t\t\t</div>\n\t\t\t{:else if isPendingDay && !isPastTodaySunrise}\n\t\t\t\t{`Sun rises at ${getPaddedTimeString(todaySunrise)}`}\n\t\t\t{:else if isPendingDay}\n\t\t\t\t{`Sun sets at ${getPaddedTimeString(todaySunset)}`}\n\t\t\t{:else if didWalkToday && isTomorrow}\n\t\t\t\t{`Sun rises at ${getPaddedTimeString(tomorrowSunrise)}`}\n\t\t\t{/if}\n\t\t</div>\n\t{/each}\n</div>\n\n<style>\n\t@media (prefers-color-scheme: dark) {\n\t\th5 {\n\t\t\tcolor: white;\n\t\t\ttext-shadow: black 0px 0px 4px, black 0px 0px 4px, black 0px 0px 4px, black 0px 0px 4px; user-select: none\n\t\t}\n\n\t\t.day {\n\t\t\tbackground-color: #777;\n\t\t\tborder: 1px solid #aaa;\n\t\t\tcolor: #333;\n\t\t}\n\n\t\t.non-walk-day {\n\t\t\tbackground-color: #f99;\n\t\t}\n\t\t.walk-day {\n\t\t\tbackground-color: #9f9;\n\t\t}\n\t\t.pending-day {\n\t\t\tbackground-color: #ff9;\n\t\t}\n\t}\n\n\t@media (prefers-color-scheme: light) {\n\t\th5 {\n\t\t\ttext-shadow: white 0px 0px 4px, white 0px 0px 4px, white 0px 0px 4px, white 0px 0px 4px; user-select: none;\n\t\t}\n\n\t\t.day {\n\t\t\tbackground-color: #eee;\n\t\t\tborder: 1px solid black;\n\t\t}\n\n\t\t.non-walk-day {\n\t\t\tbackground-color: #faa;\n\t\t}\n\t\t.walk-day {\n\t\t\tbackground-color: #afa;\n\t\t}\n\t\t.pending-day {\n\t\t\tbackground-color: #ffa;\n\t\t}\n\t}\n\n\t@media (max-width: 1000px) {\n\t\t.day {\n\t\t\theight: 96px;\n\t\t\twidth: 96px;\n\t\t}\n\n\t\t.date-number {\n\t\t\tleft: 0.1em;\n\t\t\ttop: 0.1em;\n\t\t}\n\t}\n\n\t@media (min-width: 1001px) {\n\t\t.day {\n\t\t\theight: 96px;\n\t\t\twidth: 96px;\n\t\t}\n\n\t\t.date-number {\n\t\t\tleft: 0.1em;\n\t\t\ttop: 0.1em;\n\t\t}\n\t}\n\n\t#container-walkcalendar {\n\t\tdisplay: grid;\n\t\tgrid-template-columns: 1fr 1fr 1fr 1fr 1fr 1fr 1fr;\n\t\tgrid-gap: 1px;\n\t\tz-index: 1;\n\t}\n\n\t.day {\n\t\talign-items: center;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tfont-size: 1rem;\n\t\tjustify-content: center;\n\t\tposition: relative;\n\t}\n\n\t.date-number {\n\t\tfont-size: 0.75rem;\n\t\tposition: absolute;\n\t}\n\n\t.non-walk-day {\n\t\tdisplay: inline;\n\t\ttext-align: left;\n\t}\n\n\t.future-padding-day {\n\t\tvisibility: hidden;\n\t}\t\n</style>\n","<script>\n\timport { EVENTS_DATA } from '../stores.js';\n\n\timport StatusBar from '../components/StatusBar.svelte';\n\timport SunsetApiSourceAttribution from '../components/SunsetApiSourceAttribution.svelte';\n\timport ThumbnailGrid from '../components/ThumbnailGrid.svelte';\n\timport WalkCalendar from '../components/WalkCalendar.svelte';\n\n\tconst monthNames = [\n\t\t'January',\n\t\t'February',\n\t\t'March',\n\t\t'April',\n\t\t'May',\n\t\t'June',\n\t\t'July',\n\t\t'August',\n\t\t'September',\n\t\t'October',\n\t\t'November',\n\t\t'December'\n\t];\n\n\tfunction getCurrentMonthData() {\n\t\t\tconst maxWeeksInDays = 6 * 7; // always make table have the maximum amount of cells so that changing month does not change the layout due to more/less rows existing\n\t\t\tconst toAdd = maxWeeksInDays - (daysInMonth + firstDayOffset);\n\t\t\tconst newCurrentMonthData = Array.from(new Array(daysInMonth + firstDayOffset + toAdd));\n\n\t\t\tconst searchPattern = new RegExp(`${now.getFullYear()}-${currentMonth}-\\\\d{2}`);\n\t\t\tconst matches = eventsData.filter(e => e.date.match(searchPattern));\n\n\t\t\tnewCurrentMonthData.forEach((e, i, a) => {\n\t\t\t\tconst dayIsInMonth = i > (firstDayOffset - 1);\n\t\t\t\tif (dayIsInMonth) {\n\t\t\t\t\tconst corresponding = matches.filter(e => parseInt(e.date.slice(-2)) === (i - (firstDayOffset - 1)));\n\t\t\t\t\tif (corresponding) {\n\t\t\t\t\t\ta[i] = corresponding;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\t\treturn newCurrentMonthData;\n\t\t}\n\n\tlet now = new Date();\n\tconst humanMonthNumber = now.getMonth() + 1;\n\tconst realMonth = humanMonthNumber < 10 ? '0' + (now.getMonth() + 1) : humanMonthNumber.toString();\n\tconst currentDate = now.getDate();\n\t\n\tlet currentMonthData = [];\n\tlet currentMonth;\n\tlet firstDayOffset;\n\tlet daysInMonth;\n\tlet isRealMonth;\n\n\tlet eventsData = null;\n\tEVENTS_DATA.subscribe(val => eventsData = val);\n\n\t$: {\n\t\teventsData = eventsData;\n\t\tlet tempHumanMonthNumber = now.getMonth() + 1;\n\t\tcurrentMonth = tempHumanMonthNumber < 10 ? '0' + tempHumanMonthNumber : tempHumanMonthNumber.toString();\n\t\tfirstDayOffset = new Date(now.getFullYear(), now.getMonth(), 1).getDay();\n\t\tdaysInMonth = new Date(now.getFullYear(), now.getMonth() + 1, 0).getDate();\n\n\t\tcurrentMonthData = getCurrentMonthData();\n\t\tisRealMonth = new Date().getFullYear() === now.getFullYear() && currentMonth === realMonth;\n\t}\n</script>\n\n{#if !navigator?.userAgentData?.mobile}\n\t<ThumbnailGrid />\n{/if}\n\n<StatusBar bind:now {currentMonthData} {currentMonth} {isRealMonth} {monthNames} {realMonth} />\n\n<WalkCalendar {currentMonthData} {currentDate} {firstDayOffset} {isRealMonth} {daysInMonth} />\n\n<SunsetApiSourceAttribution />\n","/*!\n * @kurkle/color v0.3.4\n * https://github.com/kurkle/color#readme\n * (c) 2024 Jukka Kurkela\n * Released under the MIT License\n */\nfunction round(v) {\n  return v + 0.5 | 0;\n}\nconst lim = (v, l, h) => Math.max(Math.min(v, h), l);\nfunction p2b(v) {\n  return lim(round(v * 2.55), 0, 255);\n}\nfunction b2p(v) {\n  return lim(round(v / 2.55), 0, 100);\n}\nfunction n2b(v) {\n  return lim(round(v * 255), 0, 255);\n}\nfunction b2n(v) {\n  return lim(round(v / 2.55) / 100, 0, 1);\n}\nfunction n2p(v) {\n  return lim(round(v * 100), 0, 100);\n}\n\nconst map$1 = {0: 0, 1: 1, 2: 2, 3: 3, 4: 4, 5: 5, 6: 6, 7: 7, 8: 8, 9: 9, A: 10, B: 11, C: 12, D: 13, E: 14, F: 15, a: 10, b: 11, c: 12, d: 13, e: 14, f: 15};\nconst hex = [...'0123456789ABCDEF'];\nconst h1 = b => hex[b & 0xF];\nconst h2 = b => hex[(b & 0xF0) >> 4] + hex[b & 0xF];\nconst eq = b => ((b & 0xF0) >> 4) === (b & 0xF);\nconst isShort = v => eq(v.r) && eq(v.g) && eq(v.b) && eq(v.a);\nfunction hexParse(str) {\n  var len = str.length;\n  var ret;\n  if (str[0] === '#') {\n    if (len === 4 || len === 5) {\n      ret = {\n        r: 255 & map$1[str[1]] * 17,\n        g: 255 & map$1[str[2]] * 17,\n        b: 255 & map$1[str[3]] * 17,\n        a: len === 5 ? map$1[str[4]] * 17 : 255\n      };\n    } else if (len === 7 || len === 9) {\n      ret = {\n        r: map$1[str[1]] << 4 | map$1[str[2]],\n        g: map$1[str[3]] << 4 | map$1[str[4]],\n        b: map$1[str[5]] << 4 | map$1[str[6]],\n        a: len === 9 ? (map$1[str[7]] << 4 | map$1[str[8]]) : 255\n      };\n    }\n  }\n  return ret;\n}\nconst alpha = (a, f) => a < 255 ? f(a) : '';\nfunction hexString(v) {\n  var f = isShort(v) ? h1 : h2;\n  return v\n    ? '#' + f(v.r) + f(v.g) + f(v.b) + alpha(v.a, f)\n    : undefined;\n}\n\nconst HUE_RE = /^(hsla?|hwb|hsv)\\(\\s*([-+.e\\d]+)(?:deg)?[\\s,]+([-+.e\\d]+)%[\\s,]+([-+.e\\d]+)%(?:[\\s,]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction hsl2rgbn(h, s, l) {\n  const a = s * Math.min(l, 1 - l);\n  const f = (n, k = (n + h / 30) % 12) => l - a * Math.max(Math.min(k - 3, 9 - k, 1), -1);\n  return [f(0), f(8), f(4)];\n}\nfunction hsv2rgbn(h, s, v) {\n  const f = (n, k = (n + h / 60) % 6) => v - v * s * Math.max(Math.min(k, 4 - k, 1), 0);\n  return [f(5), f(3), f(1)];\n}\nfunction hwb2rgbn(h, w, b) {\n  const rgb = hsl2rgbn(h, 1, 0.5);\n  let i;\n  if (w + b > 1) {\n    i = 1 / (w + b);\n    w *= i;\n    b *= i;\n  }\n  for (i = 0; i < 3; i++) {\n    rgb[i] *= 1 - w - b;\n    rgb[i] += w;\n  }\n  return rgb;\n}\nfunction hueValue(r, g, b, d, max) {\n  if (r === max) {\n    return ((g - b) / d) + (g < b ? 6 : 0);\n  }\n  if (g === max) {\n    return (b - r) / d + 2;\n  }\n  return (r - g) / d + 4;\n}\nfunction rgb2hsl(v) {\n  const range = 255;\n  const r = v.r / range;\n  const g = v.g / range;\n  const b = v.b / range;\n  const max = Math.max(r, g, b);\n  const min = Math.min(r, g, b);\n  const l = (max + min) / 2;\n  let h, s, d;\n  if (max !== min) {\n    d = max - min;\n    s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n    h = hueValue(r, g, b, d, max);\n    h = h * 60 + 0.5;\n  }\n  return [h | 0, s || 0, l];\n}\nfunction calln(f, a, b, c) {\n  return (\n    Array.isArray(a)\n      ? f(a[0], a[1], a[2])\n      : f(a, b, c)\n  ).map(n2b);\n}\nfunction hsl2rgb(h, s, l) {\n  return calln(hsl2rgbn, h, s, l);\n}\nfunction hwb2rgb(h, w, b) {\n  return calln(hwb2rgbn, h, w, b);\n}\nfunction hsv2rgb(h, s, v) {\n  return calln(hsv2rgbn, h, s, v);\n}\nfunction hue(h) {\n  return (h % 360 + 360) % 360;\n}\nfunction hueParse(str) {\n  const m = HUE_RE.exec(str);\n  let a = 255;\n  let v;\n  if (!m) {\n    return;\n  }\n  if (m[5] !== v) {\n    a = m[6] ? p2b(+m[5]) : n2b(+m[5]);\n  }\n  const h = hue(+m[2]);\n  const p1 = +m[3] / 100;\n  const p2 = +m[4] / 100;\n  if (m[1] === 'hwb') {\n    v = hwb2rgb(h, p1, p2);\n  } else if (m[1] === 'hsv') {\n    v = hsv2rgb(h, p1, p2);\n  } else {\n    v = hsl2rgb(h, p1, p2);\n  }\n  return {\n    r: v[0],\n    g: v[1],\n    b: v[2],\n    a: a\n  };\n}\nfunction rotate(v, deg) {\n  var h = rgb2hsl(v);\n  h[0] = hue(h[0] + deg);\n  h = hsl2rgb(h);\n  v.r = h[0];\n  v.g = h[1];\n  v.b = h[2];\n}\nfunction hslString(v) {\n  if (!v) {\n    return;\n  }\n  const a = rgb2hsl(v);\n  const h = a[0];\n  const s = n2p(a[1]);\n  const l = n2p(a[2]);\n  return v.a < 255\n    ? `hsla(${h}, ${s}%, ${l}%, ${b2n(v.a)})`\n    : `hsl(${h}, ${s}%, ${l}%)`;\n}\n\nconst map = {\n\tx: 'dark',\n\tZ: 'light',\n\tY: 're',\n\tX: 'blu',\n\tW: 'gr',\n\tV: 'medium',\n\tU: 'slate',\n\tA: 'ee',\n\tT: 'ol',\n\tS: 'or',\n\tB: 'ra',\n\tC: 'lateg',\n\tD: 'ights',\n\tR: 'in',\n\tQ: 'turquois',\n\tE: 'hi',\n\tP: 'ro',\n\tO: 'al',\n\tN: 'le',\n\tM: 'de',\n\tL: 'yello',\n\tF: 'en',\n\tK: 'ch',\n\tG: 'arks',\n\tH: 'ea',\n\tI: 'ightg',\n\tJ: 'wh'\n};\nconst names$1 = {\n\tOiceXe: 'f0f8ff',\n\tantiquewEte: 'faebd7',\n\taqua: 'ffff',\n\taquamarRe: '7fffd4',\n\tazuY: 'f0ffff',\n\tbeige: 'f5f5dc',\n\tbisque: 'ffe4c4',\n\tblack: '0',\n\tblanKedOmond: 'ffebcd',\n\tXe: 'ff',\n\tXeviTet: '8a2be2',\n\tbPwn: 'a52a2a',\n\tburlywood: 'deb887',\n\tcaMtXe: '5f9ea0',\n\tKartYuse: '7fff00',\n\tKocTate: 'd2691e',\n\tcSO: 'ff7f50',\n\tcSnflowerXe: '6495ed',\n\tcSnsilk: 'fff8dc',\n\tcrimson: 'dc143c',\n\tcyan: 'ffff',\n\txXe: '8b',\n\txcyan: '8b8b',\n\txgTMnPd: 'b8860b',\n\txWay: 'a9a9a9',\n\txgYF: '6400',\n\txgYy: 'a9a9a9',\n\txkhaki: 'bdb76b',\n\txmagFta: '8b008b',\n\txTivegYF: '556b2f',\n\txSange: 'ff8c00',\n\txScEd: '9932cc',\n\txYd: '8b0000',\n\txsOmon: 'e9967a',\n\txsHgYF: '8fbc8f',\n\txUXe: '483d8b',\n\txUWay: '2f4f4f',\n\txUgYy: '2f4f4f',\n\txQe: 'ced1',\n\txviTet: '9400d3',\n\tdAppRk: 'ff1493',\n\tdApskyXe: 'bfff',\n\tdimWay: '696969',\n\tdimgYy: '696969',\n\tdodgerXe: '1e90ff',\n\tfiYbrick: 'b22222',\n\tflSOwEte: 'fffaf0',\n\tfoYstWAn: '228b22',\n\tfuKsia: 'ff00ff',\n\tgaRsbSo: 'dcdcdc',\n\tghostwEte: 'f8f8ff',\n\tgTd: 'ffd700',\n\tgTMnPd: 'daa520',\n\tWay: '808080',\n\tgYF: '8000',\n\tgYFLw: 'adff2f',\n\tgYy: '808080',\n\thoneyMw: 'f0fff0',\n\thotpRk: 'ff69b4',\n\tRdianYd: 'cd5c5c',\n\tRdigo: '4b0082',\n\tivSy: 'fffff0',\n\tkhaki: 'f0e68c',\n\tlavFMr: 'e6e6fa',\n\tlavFMrXsh: 'fff0f5',\n\tlawngYF: '7cfc00',\n\tNmoncEffon: 'fffacd',\n\tZXe: 'add8e6',\n\tZcSO: 'f08080',\n\tZcyan: 'e0ffff',\n\tZgTMnPdLw: 'fafad2',\n\tZWay: 'd3d3d3',\n\tZgYF: '90ee90',\n\tZgYy: 'd3d3d3',\n\tZpRk: 'ffb6c1',\n\tZsOmon: 'ffa07a',\n\tZsHgYF: '20b2aa',\n\tZskyXe: '87cefa',\n\tZUWay: '778899',\n\tZUgYy: '778899',\n\tZstAlXe: 'b0c4de',\n\tZLw: 'ffffe0',\n\tlime: 'ff00',\n\tlimegYF: '32cd32',\n\tlRF: 'faf0e6',\n\tmagFta: 'ff00ff',\n\tmaPon: '800000',\n\tVaquamarRe: '66cdaa',\n\tVXe: 'cd',\n\tVScEd: 'ba55d3',\n\tVpurpN: '9370db',\n\tVsHgYF: '3cb371',\n\tVUXe: '7b68ee',\n\tVsprRggYF: 'fa9a',\n\tVQe: '48d1cc',\n\tVviTetYd: 'c71585',\n\tmidnightXe: '191970',\n\tmRtcYam: 'f5fffa',\n\tmistyPse: 'ffe4e1',\n\tmoccasR: 'ffe4b5',\n\tnavajowEte: 'ffdead',\n\tnavy: '80',\n\tTdlace: 'fdf5e6',\n\tTive: '808000',\n\tTivedBb: '6b8e23',\n\tSange: 'ffa500',\n\tSangeYd: 'ff4500',\n\tScEd: 'da70d6',\n\tpOegTMnPd: 'eee8aa',\n\tpOegYF: '98fb98',\n\tpOeQe: 'afeeee',\n\tpOeviTetYd: 'db7093',\n\tpapayawEp: 'ffefd5',\n\tpHKpuff: 'ffdab9',\n\tperu: 'cd853f',\n\tpRk: 'ffc0cb',\n\tplum: 'dda0dd',\n\tpowMrXe: 'b0e0e6',\n\tpurpN: '800080',\n\tYbeccapurpN: '663399',\n\tYd: 'ff0000',\n\tPsybrown: 'bc8f8f',\n\tPyOXe: '4169e1',\n\tsaddNbPwn: '8b4513',\n\tsOmon: 'fa8072',\n\tsandybPwn: 'f4a460',\n\tsHgYF: '2e8b57',\n\tsHshell: 'fff5ee',\n\tsiFna: 'a0522d',\n\tsilver: 'c0c0c0',\n\tskyXe: '87ceeb',\n\tUXe: '6a5acd',\n\tUWay: '708090',\n\tUgYy: '708090',\n\tsnow: 'fffafa',\n\tsprRggYF: 'ff7f',\n\tstAlXe: '4682b4',\n\ttan: 'd2b48c',\n\tteO: '8080',\n\ttEstN: 'd8bfd8',\n\ttomato: 'ff6347',\n\tQe: '40e0d0',\n\tviTet: 'ee82ee',\n\tJHt: 'f5deb3',\n\twEte: 'ffffff',\n\twEtesmoke: 'f5f5f5',\n\tLw: 'ffff00',\n\tLwgYF: '9acd32'\n};\nfunction unpack() {\n  const unpacked = {};\n  const keys = Object.keys(names$1);\n  const tkeys = Object.keys(map);\n  let i, j, k, ok, nk;\n  for (i = 0; i < keys.length; i++) {\n    ok = nk = keys[i];\n    for (j = 0; j < tkeys.length; j++) {\n      k = tkeys[j];\n      nk = nk.replace(k, map[k]);\n    }\n    k = parseInt(names$1[ok], 16);\n    unpacked[nk] = [k >> 16 & 0xFF, k >> 8 & 0xFF, k & 0xFF];\n  }\n  return unpacked;\n}\n\nlet names;\nfunction nameParse(str) {\n  if (!names) {\n    names = unpack();\n    names.transparent = [0, 0, 0, 0];\n  }\n  const a = names[str.toLowerCase()];\n  return a && {\n    r: a[0],\n    g: a[1],\n    b: a[2],\n    a: a.length === 4 ? a[3] : 255\n  };\n}\n\nconst RGB_RE = /^rgba?\\(\\s*([-+.\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?[\\s,]+([-+.e\\d]+)(%)?(?:[\\s,/]+([-+.e\\d]+)(%)?)?\\s*\\)$/;\nfunction rgbParse(str) {\n  const m = RGB_RE.exec(str);\n  let a = 255;\n  let r, g, b;\n  if (!m) {\n    return;\n  }\n  if (m[7] !== r) {\n    const v = +m[7];\n    a = m[8] ? p2b(v) : lim(v * 255, 0, 255);\n  }\n  r = +m[1];\n  g = +m[3];\n  b = +m[5];\n  r = 255 & (m[2] ? p2b(r) : lim(r, 0, 255));\n  g = 255 & (m[4] ? p2b(g) : lim(g, 0, 255));\n  b = 255 & (m[6] ? p2b(b) : lim(b, 0, 255));\n  return {\n    r: r,\n    g: g,\n    b: b,\n    a: a\n  };\n}\nfunction rgbString(v) {\n  return v && (\n    v.a < 255\n      ? `rgba(${v.r}, ${v.g}, ${v.b}, ${b2n(v.a)})`\n      : `rgb(${v.r}, ${v.g}, ${v.b})`\n  );\n}\n\nconst to = v => v <= 0.0031308 ? v * 12.92 : Math.pow(v, 1.0 / 2.4) * 1.055 - 0.055;\nconst from = v => v <= 0.04045 ? v / 12.92 : Math.pow((v + 0.055) / 1.055, 2.4);\nfunction interpolate(rgb1, rgb2, t) {\n  const r = from(b2n(rgb1.r));\n  const g = from(b2n(rgb1.g));\n  const b = from(b2n(rgb1.b));\n  return {\n    r: n2b(to(r + t * (from(b2n(rgb2.r)) - r))),\n    g: n2b(to(g + t * (from(b2n(rgb2.g)) - g))),\n    b: n2b(to(b + t * (from(b2n(rgb2.b)) - b))),\n    a: rgb1.a + t * (rgb2.a - rgb1.a)\n  };\n}\n\nfunction modHSL(v, i, ratio) {\n  if (v) {\n    let tmp = rgb2hsl(v);\n    tmp[i] = Math.max(0, Math.min(tmp[i] + tmp[i] * ratio, i === 0 ? 360 : 1));\n    tmp = hsl2rgb(tmp);\n    v.r = tmp[0];\n    v.g = tmp[1];\n    v.b = tmp[2];\n  }\n}\nfunction clone(v, proto) {\n  return v ? Object.assign(proto || {}, v) : v;\n}\nfunction fromObject(input) {\n  var v = {r: 0, g: 0, b: 0, a: 255};\n  if (Array.isArray(input)) {\n    if (input.length >= 3) {\n      v = {r: input[0], g: input[1], b: input[2], a: 255};\n      if (input.length > 3) {\n        v.a = n2b(input[3]);\n      }\n    }\n  } else {\n    v = clone(input, {r: 0, g: 0, b: 0, a: 1});\n    v.a = n2b(v.a);\n  }\n  return v;\n}\nfunction functionParse(str) {\n  if (str.charAt(0) === 'r') {\n    return rgbParse(str);\n  }\n  return hueParse(str);\n}\nclass Color {\n  constructor(input) {\n    if (input instanceof Color) {\n      return input;\n    }\n    const type = typeof input;\n    let v;\n    if (type === 'object') {\n      v = fromObject(input);\n    } else if (type === 'string') {\n      v = hexParse(input) || nameParse(input) || functionParse(input);\n    }\n    this._rgb = v;\n    this._valid = !!v;\n  }\n  get valid() {\n    return this._valid;\n  }\n  get rgb() {\n    var v = clone(this._rgb);\n    if (v) {\n      v.a = b2n(v.a);\n    }\n    return v;\n  }\n  set rgb(obj) {\n    this._rgb = fromObject(obj);\n  }\n  rgbString() {\n    return this._valid ? rgbString(this._rgb) : undefined;\n  }\n  hexString() {\n    return this._valid ? hexString(this._rgb) : undefined;\n  }\n  hslString() {\n    return this._valid ? hslString(this._rgb) : undefined;\n  }\n  mix(color, weight) {\n    if (color) {\n      const c1 = this.rgb;\n      const c2 = color.rgb;\n      let w2;\n      const p = weight === w2 ? 0.5 : weight;\n      const w = 2 * p - 1;\n      const a = c1.a - c2.a;\n      const w1 = ((w * a === -1 ? w : (w + a) / (1 + w * a)) + 1) / 2.0;\n      w2 = 1 - w1;\n      c1.r = 0xFF & w1 * c1.r + w2 * c2.r + 0.5;\n      c1.g = 0xFF & w1 * c1.g + w2 * c2.g + 0.5;\n      c1.b = 0xFF & w1 * c1.b + w2 * c2.b + 0.5;\n      c1.a = p * c1.a + (1 - p) * c2.a;\n      this.rgb = c1;\n    }\n    return this;\n  }\n  interpolate(color, t) {\n    if (color) {\n      this._rgb = interpolate(this._rgb, color._rgb, t);\n    }\n    return this;\n  }\n  clone() {\n    return new Color(this.rgb);\n  }\n  alpha(a) {\n    this._rgb.a = n2b(a);\n    return this;\n  }\n  clearer(ratio) {\n    const rgb = this._rgb;\n    rgb.a *= 1 - ratio;\n    return this;\n  }\n  greyscale() {\n    const rgb = this._rgb;\n    const val = round(rgb.r * 0.3 + rgb.g * 0.59 + rgb.b * 0.11);\n    rgb.r = rgb.g = rgb.b = val;\n    return this;\n  }\n  opaquer(ratio) {\n    const rgb = this._rgb;\n    rgb.a *= 1 + ratio;\n    return this;\n  }\n  negate() {\n    const v = this._rgb;\n    v.r = 255 - v.r;\n    v.g = 255 - v.g;\n    v.b = 255 - v.b;\n    return this;\n  }\n  lighten(ratio) {\n    modHSL(this._rgb, 2, ratio);\n    return this;\n  }\n  darken(ratio) {\n    modHSL(this._rgb, 2, -ratio);\n    return this;\n  }\n  saturate(ratio) {\n    modHSL(this._rgb, 1, ratio);\n    return this;\n  }\n  desaturate(ratio) {\n    modHSL(this._rgb, 1, -ratio);\n    return this;\n  }\n  rotate(deg) {\n    rotate(this._rgb, deg);\n    return this;\n  }\n}\n\nfunction index_esm(input) {\n  return new Color(input);\n}\n\nexport { Color, b2n, b2p, index_esm as default, hexParse, hexString, hsl2rgb, hslString, hsv2rgb, hueParse, hwb2rgb, lim, n2b, n2p, nameParse, p2b, rgb2hsl, rgbParse, rgbString, rotate, round };\n","/*!\n * Chart.js v4.4.8\n * https://www.chartjs.org\n * (c) 2025 Chart.js Contributors\n * Released under the MIT License\n */\nimport { Color } from '@kurkle/color';\n\n/**\n * @namespace Chart.helpers\n */ /**\n * An empty function that can be used, for example, for optional callback.\n */ function noop() {\n/* noop */ }\n/**\n * Returns a unique id, sequentially generated from a global variable.\n */ const uid = (()=>{\n    let id = 0;\n    return ()=>id++;\n})();\n/**\n * Returns true if `value` is neither null nor undefined, else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */ function isNullOrUndef(value) {\n    return value === null || value === undefined;\n}\n/**\n * Returns true if `value` is an array (including typed arrays), else returns false.\n * @param value - The value to test.\n * @function\n */ function isArray(value) {\n    if (Array.isArray && Array.isArray(value)) {\n        return true;\n    }\n    const type = Object.prototype.toString.call(value);\n    if (type.slice(0, 7) === '[object' && type.slice(-6) === 'Array]') {\n        return true;\n    }\n    return false;\n}\n/**\n * Returns true if `value` is an object (excluding null), else returns false.\n * @param value - The value to test.\n * @since 2.7.0\n */ function isObject(value) {\n    return value !== null && Object.prototype.toString.call(value) === '[object Object]';\n}\n/**\n * Returns true if `value` is a finite number, else returns false\n * @param value  - The value to test.\n */ function isNumberFinite(value) {\n    return (typeof value === 'number' || value instanceof Number) && isFinite(+value);\n}\n/**\n * Returns `value` if finite, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is not finite.\n */ function finiteOrDefault(value, defaultValue) {\n    return isNumberFinite(value) ? value : defaultValue;\n}\n/**\n * Returns `value` if defined, else returns `defaultValue`.\n * @param value - The value to return if defined.\n * @param defaultValue - The value to return if `value` is undefined.\n */ function valueOrDefault(value, defaultValue) {\n    return typeof value === 'undefined' ? defaultValue : value;\n}\nconst toPercentage = (value, dimension)=>typeof value === 'string' && value.endsWith('%') ? parseFloat(value) / 100 : +value / dimension;\nconst toDimension = (value, dimension)=>typeof value === 'string' && value.endsWith('%') ? parseFloat(value) / 100 * dimension : +value;\n/**\n * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the\n * value returned by `fn`. If `fn` is not a function, this method returns undefined.\n * @param fn - The function to call.\n * @param args - The arguments with which `fn` should be called.\n * @param [thisArg] - The value of `this` provided for the call to `fn`.\n */ function callback(fn, args, thisArg) {\n    if (fn && typeof fn.call === 'function') {\n        return fn.apply(thisArg, args);\n    }\n}\nfunction each(loopable, fn, thisArg, reverse) {\n    let i, len, keys;\n    if (isArray(loopable)) {\n        len = loopable.length;\n        if (reverse) {\n            for(i = len - 1; i >= 0; i--){\n                fn.call(thisArg, loopable[i], i);\n            }\n        } else {\n            for(i = 0; i < len; i++){\n                fn.call(thisArg, loopable[i], i);\n            }\n        }\n    } else if (isObject(loopable)) {\n        keys = Object.keys(loopable);\n        len = keys.length;\n        for(i = 0; i < len; i++){\n            fn.call(thisArg, loopable[keys[i]], keys[i]);\n        }\n    }\n}\n/**\n * Returns true if the `a0` and `a1` arrays have the same content, else returns false.\n * @param a0 - The array to compare\n * @param a1 - The array to compare\n * @private\n */ function _elementsEqual(a0, a1) {\n    let i, ilen, v0, v1;\n    if (!a0 || !a1 || a0.length !== a1.length) {\n        return false;\n    }\n    for(i = 0, ilen = a0.length; i < ilen; ++i){\n        v0 = a0[i];\n        v1 = a1[i];\n        if (v0.datasetIndex !== v1.datasetIndex || v0.index !== v1.index) {\n            return false;\n        }\n    }\n    return true;\n}\n/**\n * Returns a deep copy of `source` without keeping references on objects and arrays.\n * @param source - The value to clone.\n */ function clone(source) {\n    if (isArray(source)) {\n        return source.map(clone);\n    }\n    if (isObject(source)) {\n        const target = Object.create(null);\n        const keys = Object.keys(source);\n        const klen = keys.length;\n        let k = 0;\n        for(; k < klen; ++k){\n            target[keys[k]] = clone(source[keys[k]]);\n        }\n        return target;\n    }\n    return source;\n}\nfunction isValidKey(key) {\n    return [\n        '__proto__',\n        'prototype',\n        'constructor'\n    ].indexOf(key) === -1;\n}\n/**\n * The default merger when Chart.helpers.merge is called without merger option.\n * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback.\n * @private\n */ function _merger(key, target, source, options) {\n    if (!isValidKey(key)) {\n        return;\n    }\n    const tval = target[key];\n    const sval = source[key];\n    if (isObject(tval) && isObject(sval)) {\n        // eslint-disable-next-line @typescript-eslint/no-use-before-define\n        merge(tval, sval, options);\n    } else {\n        target[key] = clone(sval);\n    }\n}\nfunction merge(target, source, options) {\n    const sources = isArray(source) ? source : [\n        source\n    ];\n    const ilen = sources.length;\n    if (!isObject(target)) {\n        return target;\n    }\n    options = options || {};\n    const merger = options.merger || _merger;\n    let current;\n    for(let i = 0; i < ilen; ++i){\n        current = sources[i];\n        if (!isObject(current)) {\n            continue;\n        }\n        const keys = Object.keys(current);\n        for(let k = 0, klen = keys.length; k < klen; ++k){\n            merger(keys[k], target, current, options);\n        }\n    }\n    return target;\n}\nfunction mergeIf(target, source) {\n    // eslint-disable-next-line @typescript-eslint/no-use-before-define\n    return merge(target, source, {\n        merger: _mergerIf\n    });\n}\n/**\n * Merges source[key] in target[key] only if target[key] is undefined.\n * @private\n */ function _mergerIf(key, target, source) {\n    if (!isValidKey(key)) {\n        return;\n    }\n    const tval = target[key];\n    const sval = source[key];\n    if (isObject(tval) && isObject(sval)) {\n        mergeIf(tval, sval);\n    } else if (!Object.prototype.hasOwnProperty.call(target, key)) {\n        target[key] = clone(sval);\n    }\n}\n/**\n * @private\n */ function _deprecated(scope, value, previous, current) {\n    if (value !== undefined) {\n        console.warn(scope + ': \"' + previous + '\" is deprecated. Please use \"' + current + '\" instead');\n    }\n}\n// resolveObjectKey resolver cache\nconst keyResolvers = {\n    // Chart.helpers.core resolveObjectKey should resolve empty key to root object\n    '': (v)=>v,\n    // default resolvers\n    x: (o)=>o.x,\n    y: (o)=>o.y\n};\n/**\n * @private\n */ function _splitKey(key) {\n    const parts = key.split('.');\n    const keys = [];\n    let tmp = '';\n    for (const part of parts){\n        tmp += part;\n        if (tmp.endsWith('\\\\')) {\n            tmp = tmp.slice(0, -1) + '.';\n        } else {\n            keys.push(tmp);\n            tmp = '';\n        }\n    }\n    return keys;\n}\nfunction _getKeyResolver(key) {\n    const keys = _splitKey(key);\n    return (obj)=>{\n        for (const k of keys){\n            if (k === '') {\n                break;\n            }\n            obj = obj && obj[k];\n        }\n        return obj;\n    };\n}\nfunction resolveObjectKey(obj, key) {\n    const resolver = keyResolvers[key] || (keyResolvers[key] = _getKeyResolver(key));\n    return resolver(obj);\n}\n/**\n * @private\n */ function _capitalize(str) {\n    return str.charAt(0).toUpperCase() + str.slice(1);\n}\nconst defined = (value)=>typeof value !== 'undefined';\nconst isFunction = (value)=>typeof value === 'function';\n// Adapted from https://stackoverflow.com/questions/31128855/comparing-ecma6-sets-for-equality#31129384\nconst setsEqual = (a, b)=>{\n    if (a.size !== b.size) {\n        return false;\n    }\n    for (const item of a){\n        if (!b.has(item)) {\n            return false;\n        }\n    }\n    return true;\n};\n/**\n * @param e - The event\n * @private\n */ function _isClickEvent(e) {\n    return e.type === 'mouseup' || e.type === 'click' || e.type === 'contextmenu';\n}\n\n/**\n * @alias Chart.helpers.math\n * @namespace\n */ const PI = Math.PI;\nconst TAU = 2 * PI;\nconst PITAU = TAU + PI;\nconst INFINITY = Number.POSITIVE_INFINITY;\nconst RAD_PER_DEG = PI / 180;\nconst HALF_PI = PI / 2;\nconst QUARTER_PI = PI / 4;\nconst TWO_THIRDS_PI = PI * 2 / 3;\nconst log10 = Math.log10;\nconst sign = Math.sign;\nfunction almostEquals(x, y, epsilon) {\n    return Math.abs(x - y) < epsilon;\n}\n/**\n * Implementation of the nice number algorithm used in determining where axis labels will go\n */ function niceNum(range) {\n    const roundedRange = Math.round(range);\n    range = almostEquals(range, roundedRange, range / 1000) ? roundedRange : range;\n    const niceRange = Math.pow(10, Math.floor(log10(range)));\n    const fraction = range / niceRange;\n    const niceFraction = fraction <= 1 ? 1 : fraction <= 2 ? 2 : fraction <= 5 ? 5 : 10;\n    return niceFraction * niceRange;\n}\n/**\n * Returns an array of factors sorted from 1 to sqrt(value)\n * @private\n */ function _factorize(value) {\n    const result = [];\n    const sqrt = Math.sqrt(value);\n    let i;\n    for(i = 1; i < sqrt; i++){\n        if (value % i === 0) {\n            result.push(i);\n            result.push(value / i);\n        }\n    }\n    if (sqrt === (sqrt | 0)) {\n        result.push(sqrt);\n    }\n    result.sort((a, b)=>a - b).pop();\n    return result;\n}\n/**\n * Verifies that attempting to coerce n to string or number won't throw a TypeError.\n */ function isNonPrimitive(n) {\n    return typeof n === 'symbol' || typeof n === 'object' && n !== null && !(Symbol.toPrimitive in n || 'toString' in n || 'valueOf' in n);\n}\nfunction isNumber(n) {\n    return !isNonPrimitive(n) && !isNaN(parseFloat(n)) && isFinite(n);\n}\nfunction almostWhole(x, epsilon) {\n    const rounded = Math.round(x);\n    return rounded - epsilon <= x && rounded + epsilon >= x;\n}\n/**\n * @private\n */ function _setMinAndMaxByKey(array, target, property) {\n    let i, ilen, value;\n    for(i = 0, ilen = array.length; i < ilen; i++){\n        value = array[i][property];\n        if (!isNaN(value)) {\n            target.min = Math.min(target.min, value);\n            target.max = Math.max(target.max, value);\n        }\n    }\n}\nfunction toRadians(degrees) {\n    return degrees * (PI / 180);\n}\nfunction toDegrees(radians) {\n    return radians * (180 / PI);\n}\n/**\n * Returns the number of decimal places\n * i.e. the number of digits after the decimal point, of the value of this Number.\n * @param x - A number.\n * @returns The number of decimal places.\n * @private\n */ function _decimalPlaces(x) {\n    if (!isNumberFinite(x)) {\n        return;\n    }\n    let e = 1;\n    let p = 0;\n    while(Math.round(x * e) / e !== x){\n        e *= 10;\n        p++;\n    }\n    return p;\n}\n// Gets the angle from vertical upright to the point about a centre.\nfunction getAngleFromPoint(centrePoint, anglePoint) {\n    const distanceFromXCenter = anglePoint.x - centrePoint.x;\n    const distanceFromYCenter = anglePoint.y - centrePoint.y;\n    const radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter);\n    let angle = Math.atan2(distanceFromYCenter, distanceFromXCenter);\n    if (angle < -0.5 * PI) {\n        angle += TAU; // make sure the returned angle is in the range of (-PI/2, 3PI/2]\n    }\n    return {\n        angle,\n        distance: radialDistanceFromCenter\n    };\n}\nfunction distanceBetweenPoints(pt1, pt2) {\n    return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2));\n}\n/**\n * Shortest distance between angles, in either direction.\n * @private\n */ function _angleDiff(a, b) {\n    return (a - b + PITAU) % TAU - PI;\n}\n/**\n * Normalize angle to be between 0 and 2*PI\n * @private\n */ function _normalizeAngle(a) {\n    return (a % TAU + TAU) % TAU;\n}\n/**\n * @private\n */ function _angleBetween(angle, start, end, sameAngleIsFullCircle) {\n    const a = _normalizeAngle(angle);\n    const s = _normalizeAngle(start);\n    const e = _normalizeAngle(end);\n    const angleToStart = _normalizeAngle(s - a);\n    const angleToEnd = _normalizeAngle(e - a);\n    const startToAngle = _normalizeAngle(a - s);\n    const endToAngle = _normalizeAngle(a - e);\n    return a === s || a === e || sameAngleIsFullCircle && s === e || angleToStart > angleToEnd && startToAngle < endToAngle;\n}\n/**\n * Limit `value` between `min` and `max`\n * @param value\n * @param min\n * @param max\n * @private\n */ function _limitValue(value, min, max) {\n    return Math.max(min, Math.min(max, value));\n}\n/**\n * @param {number} value\n * @private\n */ function _int16Range(value) {\n    return _limitValue(value, -32768, 32767);\n}\n/**\n * @param value\n * @param start\n * @param end\n * @param [epsilon]\n * @private\n */ function _isBetween(value, start, end, epsilon = 1e-6) {\n    return value >= Math.min(start, end) - epsilon && value <= Math.max(start, end) + epsilon;\n}\n\nfunction _lookup(table, value, cmp) {\n    cmp = cmp || ((index)=>table[index] < value);\n    let hi = table.length - 1;\n    let lo = 0;\n    let mid;\n    while(hi - lo > 1){\n        mid = lo + hi >> 1;\n        if (cmp(mid)) {\n            lo = mid;\n        } else {\n            hi = mid;\n        }\n    }\n    return {\n        lo,\n        hi\n    };\n}\n/**\n * Binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @param last - lookup last index\n * @private\n */ const _lookupByKey = (table, key, value, last)=>_lookup(table, value, last ? (index)=>{\n        const ti = table[index][key];\n        return ti < value || ti === value && table[index + 1][key] === value;\n    } : (index)=>table[index][key] < value);\n/**\n * Reverse binary search\n * @param table - the table search. must be sorted!\n * @param key - property name for the value in each entry\n * @param value - value to find\n * @private\n */ const _rlookupByKey = (table, key, value)=>_lookup(table, value, (index)=>table[index][key] >= value);\n/**\n * Return subset of `values` between `min` and `max` inclusive.\n * Values are assumed to be in sorted order.\n * @param values - sorted array of values\n * @param min - min value\n * @param max - max value\n */ function _filterBetween(values, min, max) {\n    let start = 0;\n    let end = values.length;\n    while(start < end && values[start] < min){\n        start++;\n    }\n    while(end > start && values[end - 1] > max){\n        end--;\n    }\n    return start > 0 || end < values.length ? values.slice(start, end) : values;\n}\nconst arrayEvents = [\n    'push',\n    'pop',\n    'shift',\n    'splice',\n    'unshift'\n];\nfunction listenArrayEvents(array, listener) {\n    if (array._chartjs) {\n        array._chartjs.listeners.push(listener);\n        return;\n    }\n    Object.defineProperty(array, '_chartjs', {\n        configurable: true,\n        enumerable: false,\n        value: {\n            listeners: [\n                listener\n            ]\n        }\n    });\n    arrayEvents.forEach((key)=>{\n        const method = '_onData' + _capitalize(key);\n        const base = array[key];\n        Object.defineProperty(array, key, {\n            configurable: true,\n            enumerable: false,\n            value (...args) {\n                const res = base.apply(this, args);\n                array._chartjs.listeners.forEach((object)=>{\n                    if (typeof object[method] === 'function') {\n                        object[method](...args);\n                    }\n                });\n                return res;\n            }\n        });\n    });\n}\nfunction unlistenArrayEvents(array, listener) {\n    const stub = array._chartjs;\n    if (!stub) {\n        return;\n    }\n    const listeners = stub.listeners;\n    const index = listeners.indexOf(listener);\n    if (index !== -1) {\n        listeners.splice(index, 1);\n    }\n    if (listeners.length > 0) {\n        return;\n    }\n    arrayEvents.forEach((key)=>{\n        delete array[key];\n    });\n    delete array._chartjs;\n}\n/**\n * @param items\n */ function _arrayUnique(items) {\n    const set = new Set(items);\n    if (set.size === items.length) {\n        return items;\n    }\n    return Array.from(set);\n}\n\nfunction fontString(pixelSize, fontStyle, fontFamily) {\n    return fontStyle + ' ' + pixelSize + 'px ' + fontFamily;\n}\n/**\n* Request animation polyfill\n*/ const requestAnimFrame = function() {\n    if (typeof window === 'undefined') {\n        return function(callback) {\n            return callback();\n        };\n    }\n    return window.requestAnimationFrame;\n}();\n/**\n * Throttles calling `fn` once per animation frame\n * Latest arguments are used on the actual call\n */ function throttled(fn, thisArg) {\n    let argsToUse = [];\n    let ticking = false;\n    return function(...args) {\n        // Save the args for use later\n        argsToUse = args;\n        if (!ticking) {\n            ticking = true;\n            requestAnimFrame.call(window, ()=>{\n                ticking = false;\n                fn.apply(thisArg, argsToUse);\n            });\n        }\n    };\n}\n/**\n * Debounces calling `fn` for `delay` ms\n */ function debounce(fn, delay) {\n    let timeout;\n    return function(...args) {\n        if (delay) {\n            clearTimeout(timeout);\n            timeout = setTimeout(fn, delay, args);\n        } else {\n            fn.apply(this, args);\n        }\n        return delay;\n    };\n}\n/**\n * Converts 'start' to 'left', 'end' to 'right' and others to 'center'\n * @private\n */ const _toLeftRightCenter = (align)=>align === 'start' ? 'left' : align === 'end' ? 'right' : 'center';\n/**\n * Returns `start`, `end` or `(start + end) / 2` depending on `align`. Defaults to `center`\n * @private\n */ const _alignStartEnd = (align, start, end)=>align === 'start' ? start : align === 'end' ? end : (start + end) / 2;\n/**\n * Returns `left`, `right` or `(left + right) / 2` depending on `align`. Defaults to `left`\n * @private\n */ const _textX = (align, left, right, rtl)=>{\n    const check = rtl ? 'left' : 'right';\n    return align === check ? right : align === 'center' ? (left + right) / 2 : left;\n};\n/**\n * Return start and count of visible points.\n * @private\n */ function _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled) {\n    const pointCount = points.length;\n    let start = 0;\n    let count = pointCount;\n    if (meta._sorted) {\n        const { iScale , vScale , _parsed  } = meta;\n        const spanGaps = meta.dataset ? meta.dataset.options ? meta.dataset.options.spanGaps : null : null;\n        const axis = iScale.axis;\n        const { min , max , minDefined , maxDefined  } = iScale.getUserBounds();\n        if (minDefined) {\n            start = Math.min(// @ts-expect-error Need to type _parsed\n            _lookupByKey(_parsed, axis, min).lo, // @ts-expect-error Need to fix types on _lookupByKey\n            animationsDisabled ? pointCount : _lookupByKey(points, axis, iScale.getPixelForValue(min)).lo);\n            if (spanGaps) {\n                const distanceToDefinedLo = _parsed.slice(0, start + 1).reverse().findIndex((point)=>!isNullOrUndef(point[vScale.axis]));\n                start -= Math.max(0, distanceToDefinedLo);\n            }\n            start = _limitValue(start, 0, pointCount - 1);\n        }\n        if (maxDefined) {\n            let end = Math.max(// @ts-expect-error Need to type _parsed\n            _lookupByKey(_parsed, iScale.axis, max, true).hi + 1, // @ts-expect-error Need to fix types on _lookupByKey\n            animationsDisabled ? 0 : _lookupByKey(points, axis, iScale.getPixelForValue(max), true).hi + 1);\n            if (spanGaps) {\n                const distanceToDefinedHi = _parsed.slice(end - 1).findIndex((point)=>!isNullOrUndef(point[vScale.axis]));\n                end += Math.max(0, distanceToDefinedHi);\n            }\n            count = _limitValue(end, start, pointCount) - start;\n        } else {\n            count = pointCount - start;\n        }\n    }\n    return {\n        start,\n        count\n    };\n}\n/**\n * Checks if the scale ranges have changed.\n * @param {object} meta - dataset meta.\n * @returns {boolean}\n * @private\n */ function _scaleRangesChanged(meta) {\n    const { xScale , yScale , _scaleRanges  } = meta;\n    const newRanges = {\n        xmin: xScale.min,\n        xmax: xScale.max,\n        ymin: yScale.min,\n        ymax: yScale.max\n    };\n    if (!_scaleRanges) {\n        meta._scaleRanges = newRanges;\n        return true;\n    }\n    const changed = _scaleRanges.xmin !== xScale.min || _scaleRanges.xmax !== xScale.max || _scaleRanges.ymin !== yScale.min || _scaleRanges.ymax !== yScale.max;\n    Object.assign(_scaleRanges, newRanges);\n    return changed;\n}\n\nconst atEdge = (t)=>t === 0 || t === 1;\nconst elasticIn = (t, s, p)=>-(Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * TAU / p));\nconst elasticOut = (t, s, p)=>Math.pow(2, -10 * t) * Math.sin((t - s) * TAU / p) + 1;\n/**\n * Easing functions adapted from Robert Penner's easing equations.\n * @namespace Chart.helpers.easing.effects\n * @see http://www.robertpenner.com/easing/\n */ const effects = {\n    linear: (t)=>t,\n    easeInQuad: (t)=>t * t,\n    easeOutQuad: (t)=>-t * (t - 2),\n    easeInOutQuad: (t)=>(t /= 0.5) < 1 ? 0.5 * t * t : -0.5 * (--t * (t - 2) - 1),\n    easeInCubic: (t)=>t * t * t,\n    easeOutCubic: (t)=>(t -= 1) * t * t + 1,\n    easeInOutCubic: (t)=>(t /= 0.5) < 1 ? 0.5 * t * t * t : 0.5 * ((t -= 2) * t * t + 2),\n    easeInQuart: (t)=>t * t * t * t,\n    easeOutQuart: (t)=>-((t -= 1) * t * t * t - 1),\n    easeInOutQuart: (t)=>(t /= 0.5) < 1 ? 0.5 * t * t * t * t : -0.5 * ((t -= 2) * t * t * t - 2),\n    easeInQuint: (t)=>t * t * t * t * t,\n    easeOutQuint: (t)=>(t -= 1) * t * t * t * t + 1,\n    easeInOutQuint: (t)=>(t /= 0.5) < 1 ? 0.5 * t * t * t * t * t : 0.5 * ((t -= 2) * t * t * t * t + 2),\n    easeInSine: (t)=>-Math.cos(t * HALF_PI) + 1,\n    easeOutSine: (t)=>Math.sin(t * HALF_PI),\n    easeInOutSine: (t)=>-0.5 * (Math.cos(PI * t) - 1),\n    easeInExpo: (t)=>t === 0 ? 0 : Math.pow(2, 10 * (t - 1)),\n    easeOutExpo: (t)=>t === 1 ? 1 : -Math.pow(2, -10 * t) + 1,\n    easeInOutExpo: (t)=>atEdge(t) ? t : t < 0.5 ? 0.5 * Math.pow(2, 10 * (t * 2 - 1)) : 0.5 * (-Math.pow(2, -10 * (t * 2 - 1)) + 2),\n    easeInCirc: (t)=>t >= 1 ? t : -(Math.sqrt(1 - t * t) - 1),\n    easeOutCirc: (t)=>Math.sqrt(1 - (t -= 1) * t),\n    easeInOutCirc: (t)=>(t /= 0.5) < 1 ? -0.5 * (Math.sqrt(1 - t * t) - 1) : 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1),\n    easeInElastic: (t)=>atEdge(t) ? t : elasticIn(t, 0.075, 0.3),\n    easeOutElastic: (t)=>atEdge(t) ? t : elasticOut(t, 0.075, 0.3),\n    easeInOutElastic (t) {\n        const s = 0.1125;\n        const p = 0.45;\n        return atEdge(t) ? t : t < 0.5 ? 0.5 * elasticIn(t * 2, s, p) : 0.5 + 0.5 * elasticOut(t * 2 - 1, s, p);\n    },\n    easeInBack (t) {\n        const s = 1.70158;\n        return t * t * ((s + 1) * t - s);\n    },\n    easeOutBack (t) {\n        const s = 1.70158;\n        return (t -= 1) * t * ((s + 1) * t + s) + 1;\n    },\n    easeInOutBack (t) {\n        let s = 1.70158;\n        if ((t /= 0.5) < 1) {\n            return 0.5 * (t * t * (((s *= 1.525) + 1) * t - s));\n        }\n        return 0.5 * ((t -= 2) * t * (((s *= 1.525) + 1) * t + s) + 2);\n    },\n    easeInBounce: (t)=>1 - effects.easeOutBounce(1 - t),\n    easeOutBounce (t) {\n        const m = 7.5625;\n        const d = 2.75;\n        if (t < 1 / d) {\n            return m * t * t;\n        }\n        if (t < 2 / d) {\n            return m * (t -= 1.5 / d) * t + 0.75;\n        }\n        if (t < 2.5 / d) {\n            return m * (t -= 2.25 / d) * t + 0.9375;\n        }\n        return m * (t -= 2.625 / d) * t + 0.984375;\n    },\n    easeInOutBounce: (t)=>t < 0.5 ? effects.easeInBounce(t * 2) * 0.5 : effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5\n};\n\nfunction isPatternOrGradient(value) {\n    if (value && typeof value === 'object') {\n        const type = value.toString();\n        return type === '[object CanvasPattern]' || type === '[object CanvasGradient]';\n    }\n    return false;\n}\nfunction color(value) {\n    return isPatternOrGradient(value) ? value : new Color(value);\n}\nfunction getHoverColor(value) {\n    return isPatternOrGradient(value) ? value : new Color(value).saturate(0.5).darken(0.1).hexString();\n}\n\nconst numbers = [\n    'x',\n    'y',\n    'borderWidth',\n    'radius',\n    'tension'\n];\nconst colors = [\n    'color',\n    'borderColor',\n    'backgroundColor'\n];\nfunction applyAnimationsDefaults(defaults) {\n    defaults.set('animation', {\n        delay: undefined,\n        duration: 1000,\n        easing: 'easeOutQuart',\n        fn: undefined,\n        from: undefined,\n        loop: undefined,\n        to: undefined,\n        type: undefined\n    });\n    defaults.describe('animation', {\n        _fallback: false,\n        _indexable: false,\n        _scriptable: (name)=>name !== 'onProgress' && name !== 'onComplete' && name !== 'fn'\n    });\n    defaults.set('animations', {\n        colors: {\n            type: 'color',\n            properties: colors\n        },\n        numbers: {\n            type: 'number',\n            properties: numbers\n        }\n    });\n    defaults.describe('animations', {\n        _fallback: 'animation'\n    });\n    defaults.set('transitions', {\n        active: {\n            animation: {\n                duration: 400\n            }\n        },\n        resize: {\n            animation: {\n                duration: 0\n            }\n        },\n        show: {\n            animations: {\n                colors: {\n                    from: 'transparent'\n                },\n                visible: {\n                    type: 'boolean',\n                    duration: 0\n                }\n            }\n        },\n        hide: {\n            animations: {\n                colors: {\n                    to: 'transparent'\n                },\n                visible: {\n                    type: 'boolean',\n                    easing: 'linear',\n                    fn: (v)=>v | 0\n                }\n            }\n        }\n    });\n}\n\nfunction applyLayoutsDefaults(defaults) {\n    defaults.set('layout', {\n        autoPadding: true,\n        padding: {\n            top: 0,\n            right: 0,\n            bottom: 0,\n            left: 0\n        }\n    });\n}\n\nconst intlCache = new Map();\nfunction getNumberFormat(locale, options) {\n    options = options || {};\n    const cacheKey = locale + JSON.stringify(options);\n    let formatter = intlCache.get(cacheKey);\n    if (!formatter) {\n        formatter = new Intl.NumberFormat(locale, options);\n        intlCache.set(cacheKey, formatter);\n    }\n    return formatter;\n}\nfunction formatNumber(num, locale, options) {\n    return getNumberFormat(locale, options).format(num);\n}\n\nconst formatters = {\n values (value) {\n        return isArray(value) ?  value : '' + value;\n    },\n numeric (tickValue, index, ticks) {\n        if (tickValue === 0) {\n            return '0';\n        }\n        const locale = this.chart.options.locale;\n        let notation;\n        let delta = tickValue;\n        if (ticks.length > 1) {\n            const maxTick = Math.max(Math.abs(ticks[0].value), Math.abs(ticks[ticks.length - 1].value));\n            if (maxTick < 1e-4 || maxTick > 1e+15) {\n                notation = 'scientific';\n            }\n            delta = calculateDelta(tickValue, ticks);\n        }\n        const logDelta = log10(Math.abs(delta));\n        const numDecimal = isNaN(logDelta) ? 1 : Math.max(Math.min(-1 * Math.floor(logDelta), 20), 0);\n        const options = {\n            notation,\n            minimumFractionDigits: numDecimal,\n            maximumFractionDigits: numDecimal\n        };\n        Object.assign(options, this.options.ticks.format);\n        return formatNumber(tickValue, locale, options);\n    },\n logarithmic (tickValue, index, ticks) {\n        if (tickValue === 0) {\n            return '0';\n        }\n        const remain = ticks[index].significand || tickValue / Math.pow(10, Math.floor(log10(tickValue)));\n        if ([\n            1,\n            2,\n            3,\n            5,\n            10,\n            15\n        ].includes(remain) || index > 0.8 * ticks.length) {\n            return formatters.numeric.call(this, tickValue, index, ticks);\n        }\n        return '';\n    }\n};\nfunction calculateDelta(tickValue, ticks) {\n    let delta = ticks.length > 3 ? ticks[2].value - ticks[1].value : ticks[1].value - ticks[0].value;\n    if (Math.abs(delta) >= 1 && tickValue !== Math.floor(tickValue)) {\n        delta = tickValue - Math.floor(tickValue);\n    }\n    return delta;\n}\n var Ticks = {\n    formatters\n};\n\nfunction applyScaleDefaults(defaults) {\n    defaults.set('scale', {\n        display: true,\n        offset: false,\n        reverse: false,\n        beginAtZero: false,\n bounds: 'ticks',\n        clip: true,\n grace: 0,\n        grid: {\n            display: true,\n            lineWidth: 1,\n            drawOnChartArea: true,\n            drawTicks: true,\n            tickLength: 8,\n            tickWidth: (_ctx, options)=>options.lineWidth,\n            tickColor: (_ctx, options)=>options.color,\n            offset: false\n        },\n        border: {\n            display: true,\n            dash: [],\n            dashOffset: 0.0,\n            width: 1\n        },\n        title: {\n            display: false,\n            text: '',\n            padding: {\n                top: 4,\n                bottom: 4\n            }\n        },\n        ticks: {\n            minRotation: 0,\n            maxRotation: 50,\n            mirror: false,\n            textStrokeWidth: 0,\n            textStrokeColor: '',\n            padding: 3,\n            display: true,\n            autoSkip: true,\n            autoSkipPadding: 3,\n            labelOffset: 0,\n            callback: Ticks.formatters.values,\n            minor: {},\n            major: {},\n            align: 'center',\n            crossAlign: 'near',\n            showLabelBackdrop: false,\n            backdropColor: 'rgba(255, 255, 255, 0.75)',\n            backdropPadding: 2\n        }\n    });\n    defaults.route('scale.ticks', 'color', '', 'color');\n    defaults.route('scale.grid', 'color', '', 'borderColor');\n    defaults.route('scale.border', 'color', '', 'borderColor');\n    defaults.route('scale.title', 'color', '', 'color');\n    defaults.describe('scale', {\n        _fallback: false,\n        _scriptable: (name)=>!name.startsWith('before') && !name.startsWith('after') && name !== 'callback' && name !== 'parser',\n        _indexable: (name)=>name !== 'borderDash' && name !== 'tickBorderDash' && name !== 'dash'\n    });\n    defaults.describe('scales', {\n        _fallback: 'scale'\n    });\n    defaults.describe('scale.ticks', {\n        _scriptable: (name)=>name !== 'backdropPadding' && name !== 'callback',\n        _indexable: (name)=>name !== 'backdropPadding'\n    });\n}\n\nconst overrides = Object.create(null);\nconst descriptors = Object.create(null);\n function getScope$1(node, key) {\n    if (!key) {\n        return node;\n    }\n    const keys = key.split('.');\n    for(let i = 0, n = keys.length; i < n; ++i){\n        const k = keys[i];\n        node = node[k] || (node[k] = Object.create(null));\n    }\n    return node;\n}\nfunction set(root, scope, values) {\n    if (typeof scope === 'string') {\n        return merge(getScope$1(root, scope), values);\n    }\n    return merge(getScope$1(root, ''), scope);\n}\n class Defaults {\n    constructor(_descriptors, _appliers){\n        this.animation = undefined;\n        this.backgroundColor = 'rgba(0,0,0,0.1)';\n        this.borderColor = 'rgba(0,0,0,0.1)';\n        this.color = '#666';\n        this.datasets = {};\n        this.devicePixelRatio = (context)=>context.chart.platform.getDevicePixelRatio();\n        this.elements = {};\n        this.events = [\n            'mousemove',\n            'mouseout',\n            'click',\n            'touchstart',\n            'touchmove'\n        ];\n        this.font = {\n            family: \"'Helvetica Neue', 'Helvetica', 'Arial', sans-serif\",\n            size: 12,\n            style: 'normal',\n            lineHeight: 1.2,\n            weight: null\n        };\n        this.hover = {};\n        this.hoverBackgroundColor = (ctx, options)=>getHoverColor(options.backgroundColor);\n        this.hoverBorderColor = (ctx, options)=>getHoverColor(options.borderColor);\n        this.hoverColor = (ctx, options)=>getHoverColor(options.color);\n        this.indexAxis = 'x';\n        this.interaction = {\n            mode: 'nearest',\n            intersect: true,\n            includeInvisible: false\n        };\n        this.maintainAspectRatio = true;\n        this.onHover = null;\n        this.onClick = null;\n        this.parsing = true;\n        this.plugins = {};\n        this.responsive = true;\n        this.scale = undefined;\n        this.scales = {};\n        this.showLine = true;\n        this.drawActiveElementsOnTop = true;\n        this.describe(_descriptors);\n        this.apply(_appliers);\n    }\n set(scope, values) {\n        return set(this, scope, values);\n    }\n get(scope) {\n        return getScope$1(this, scope);\n    }\n describe(scope, values) {\n        return set(descriptors, scope, values);\n    }\n    override(scope, values) {\n        return set(overrides, scope, values);\n    }\n route(scope, name, targetScope, targetName) {\n        const scopeObject = getScope$1(this, scope);\n        const targetScopeObject = getScope$1(this, targetScope);\n        const privateName = '_' + name;\n        Object.defineProperties(scopeObject, {\n            [privateName]: {\n                value: scopeObject[name],\n                writable: true\n            },\n            [name]: {\n                enumerable: true,\n                get () {\n                    const local = this[privateName];\n                    const target = targetScopeObject[targetName];\n                    if (isObject(local)) {\n                        return Object.assign({}, target, local);\n                    }\n                    return valueOrDefault(local, target);\n                },\n                set (value) {\n                    this[privateName] = value;\n                }\n            }\n        });\n    }\n    apply(appliers) {\n        appliers.forEach((apply)=>apply(this));\n    }\n}\nvar defaults = /* #__PURE__ */ new Defaults({\n    _scriptable: (name)=>!name.startsWith('on'),\n    _indexable: (name)=>name !== 'events',\n    hover: {\n        _fallback: 'interaction'\n    },\n    interaction: {\n        _scriptable: false,\n        _indexable: false\n    }\n}, [\n    applyAnimationsDefaults,\n    applyLayoutsDefaults,\n    applyScaleDefaults\n]);\n\n/**\n * Converts the given font object into a CSS font string.\n * @param font - A font object.\n * @return The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font\n * @private\n */ function toFontString(font) {\n    if (!font || isNullOrUndef(font.size) || isNullOrUndef(font.family)) {\n        return null;\n    }\n    return (font.style ? font.style + ' ' : '') + (font.weight ? font.weight + ' ' : '') + font.size + 'px ' + font.family;\n}\n/**\n * @private\n */ function _measureText(ctx, data, gc, longest, string) {\n    let textWidth = data[string];\n    if (!textWidth) {\n        textWidth = data[string] = ctx.measureText(string).width;\n        gc.push(string);\n    }\n    if (textWidth > longest) {\n        longest = textWidth;\n    }\n    return longest;\n}\n/**\n * @private\n */ // eslint-disable-next-line complexity\nfunction _longestText(ctx, font, arrayOfThings, cache) {\n    cache = cache || {};\n    let data = cache.data = cache.data || {};\n    let gc = cache.garbageCollect = cache.garbageCollect || [];\n    if (cache.font !== font) {\n        data = cache.data = {};\n        gc = cache.garbageCollect = [];\n        cache.font = font;\n    }\n    ctx.save();\n    ctx.font = font;\n    let longest = 0;\n    const ilen = arrayOfThings.length;\n    let i, j, jlen, thing, nestedThing;\n    for(i = 0; i < ilen; i++){\n        thing = arrayOfThings[i];\n        // Undefined strings and arrays should not be measured\n        if (thing !== undefined && thing !== null && !isArray(thing)) {\n            longest = _measureText(ctx, data, gc, longest, thing);\n        } else if (isArray(thing)) {\n            // if it is an array lets measure each element\n            // to do maybe simplify this function a bit so we can do this more recursively?\n            for(j = 0, jlen = thing.length; j < jlen; j++){\n                nestedThing = thing[j];\n                // Undefined strings and arrays should not be measured\n                if (nestedThing !== undefined && nestedThing !== null && !isArray(nestedThing)) {\n                    longest = _measureText(ctx, data, gc, longest, nestedThing);\n                }\n            }\n        }\n    }\n    ctx.restore();\n    const gcLen = gc.length / 2;\n    if (gcLen > arrayOfThings.length) {\n        for(i = 0; i < gcLen; i++){\n            delete data[gc[i]];\n        }\n        gc.splice(0, gcLen);\n    }\n    return longest;\n}\n/**\n * Returns the aligned pixel value to avoid anti-aliasing blur\n * @param chart - The chart instance.\n * @param pixel - A pixel value.\n * @param width - The width of the element.\n * @returns The aligned pixel value.\n * @private\n */ function _alignPixel(chart, pixel, width) {\n    const devicePixelRatio = chart.currentDevicePixelRatio;\n    const halfWidth = width !== 0 ? Math.max(width / 2, 0.5) : 0;\n    return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth;\n}\n/**\n * Clears the entire canvas.\n */ function clearCanvas(canvas, ctx) {\n    if (!ctx && !canvas) {\n        return;\n    }\n    ctx = ctx || canvas.getContext('2d');\n    ctx.save();\n    // canvas.width and canvas.height do not consider the canvas transform,\n    // while clearRect does\n    ctx.resetTransform();\n    ctx.clearRect(0, 0, canvas.width, canvas.height);\n    ctx.restore();\n}\nfunction drawPoint(ctx, options, x, y) {\n    // eslint-disable-next-line @typescript-eslint/no-use-before-define\n    drawPointLegend(ctx, options, x, y, null);\n}\n// eslint-disable-next-line complexity\nfunction drawPointLegend(ctx, options, x, y, w) {\n    let type, xOffset, yOffset, size, cornerRadius, width, xOffsetW, yOffsetW;\n    const style = options.pointStyle;\n    const rotation = options.rotation;\n    const radius = options.radius;\n    let rad = (rotation || 0) * RAD_PER_DEG;\n    if (style && typeof style === 'object') {\n        type = style.toString();\n        if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') {\n            ctx.save();\n            ctx.translate(x, y);\n            ctx.rotate(rad);\n            ctx.drawImage(style, -style.width / 2, -style.height / 2, style.width, style.height);\n            ctx.restore();\n            return;\n        }\n    }\n    if (isNaN(radius) || radius <= 0) {\n        return;\n    }\n    ctx.beginPath();\n    switch(style){\n        // Default includes circle\n        default:\n            if (w) {\n                ctx.ellipse(x, y, w / 2, radius, 0, 0, TAU);\n            } else {\n                ctx.arc(x, y, radius, 0, TAU);\n            }\n            ctx.closePath();\n            break;\n        case 'triangle':\n            width = w ? w / 2 : radius;\n            ctx.moveTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n            rad += TWO_THIRDS_PI;\n            ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n            rad += TWO_THIRDS_PI;\n            ctx.lineTo(x + Math.sin(rad) * width, y - Math.cos(rad) * radius);\n            ctx.closePath();\n            break;\n        case 'rectRounded':\n            // NOTE: the rounded rect implementation changed to use `arc` instead of\n            // `quadraticCurveTo` since it generates better results when rect is\n            // almost a circle. 0.516 (instead of 0.5) produces results with visually\n            // closer proportion to the previous impl and it is inscribed in the\n            // circle with `radius`. For more details, see the following PRs:\n            // https://github.com/chartjs/Chart.js/issues/5597\n            // https://github.com/chartjs/Chart.js/issues/5858\n            cornerRadius = radius * 0.516;\n            size = radius - cornerRadius;\n            xOffset = Math.cos(rad + QUARTER_PI) * size;\n            xOffsetW = Math.cos(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n            yOffset = Math.sin(rad + QUARTER_PI) * size;\n            yOffsetW = Math.sin(rad + QUARTER_PI) * (w ? w / 2 - cornerRadius : size);\n            ctx.arc(x - xOffsetW, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI);\n            ctx.arc(x + yOffsetW, y - xOffset, cornerRadius, rad - HALF_PI, rad);\n            ctx.arc(x + xOffsetW, y + yOffset, cornerRadius, rad, rad + HALF_PI);\n            ctx.arc(x - yOffsetW, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI);\n            ctx.closePath();\n            break;\n        case 'rect':\n            if (!rotation) {\n                size = Math.SQRT1_2 * radius;\n                width = w ? w / 2 : size;\n                ctx.rect(x - width, y - size, 2 * width, 2 * size);\n                break;\n            }\n            rad += QUARTER_PI;\n        /* falls through */ case 'rectRot':\n            xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n            xOffset = Math.cos(rad) * radius;\n            yOffset = Math.sin(rad) * radius;\n            yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n            ctx.moveTo(x - xOffsetW, y - yOffset);\n            ctx.lineTo(x + yOffsetW, y - xOffset);\n            ctx.lineTo(x + xOffsetW, y + yOffset);\n            ctx.lineTo(x - yOffsetW, y + xOffset);\n            ctx.closePath();\n            break;\n        case 'crossRot':\n            rad += QUARTER_PI;\n        /* falls through */ case 'cross':\n            xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n            xOffset = Math.cos(rad) * radius;\n            yOffset = Math.sin(rad) * radius;\n            yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n            ctx.moveTo(x - xOffsetW, y - yOffset);\n            ctx.lineTo(x + xOffsetW, y + yOffset);\n            ctx.moveTo(x + yOffsetW, y - xOffset);\n            ctx.lineTo(x - yOffsetW, y + xOffset);\n            break;\n        case 'star':\n            xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n            xOffset = Math.cos(rad) * radius;\n            yOffset = Math.sin(rad) * radius;\n            yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n            ctx.moveTo(x - xOffsetW, y - yOffset);\n            ctx.lineTo(x + xOffsetW, y + yOffset);\n            ctx.moveTo(x + yOffsetW, y - xOffset);\n            ctx.lineTo(x - yOffsetW, y + xOffset);\n            rad += QUARTER_PI;\n            xOffsetW = Math.cos(rad) * (w ? w / 2 : radius);\n            xOffset = Math.cos(rad) * radius;\n            yOffset = Math.sin(rad) * radius;\n            yOffsetW = Math.sin(rad) * (w ? w / 2 : radius);\n            ctx.moveTo(x - xOffsetW, y - yOffset);\n            ctx.lineTo(x + xOffsetW, y + yOffset);\n            ctx.moveTo(x + yOffsetW, y - xOffset);\n            ctx.lineTo(x - yOffsetW, y + xOffset);\n            break;\n        case 'line':\n            xOffset = w ? w / 2 : Math.cos(rad) * radius;\n            yOffset = Math.sin(rad) * radius;\n            ctx.moveTo(x - xOffset, y - yOffset);\n            ctx.lineTo(x + xOffset, y + yOffset);\n            break;\n        case 'dash':\n            ctx.moveTo(x, y);\n            ctx.lineTo(x + Math.cos(rad) * (w ? w / 2 : radius), y + Math.sin(rad) * radius);\n            break;\n        case false:\n            ctx.closePath();\n            break;\n    }\n    ctx.fill();\n    if (options.borderWidth > 0) {\n        ctx.stroke();\n    }\n}\n/**\n * Returns true if the point is inside the rectangle\n * @param point - The point to test\n * @param area - The rectangle\n * @param margin - allowed margin\n * @private\n */ function _isPointInArea(point, area, margin) {\n    margin = margin || 0.5; // margin - default is to match rounded decimals\n    return !area || point && point.x > area.left - margin && point.x < area.right + margin && point.y > area.top - margin && point.y < area.bottom + margin;\n}\nfunction clipArea(ctx, area) {\n    ctx.save();\n    ctx.beginPath();\n    ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top);\n    ctx.clip();\n}\nfunction unclipArea(ctx) {\n    ctx.restore();\n}\n/**\n * @private\n */ function _steppedLineTo(ctx, previous, target, flip, mode) {\n    if (!previous) {\n        return ctx.lineTo(target.x, target.y);\n    }\n    if (mode === 'middle') {\n        const midpoint = (previous.x + target.x) / 2.0;\n        ctx.lineTo(midpoint, previous.y);\n        ctx.lineTo(midpoint, target.y);\n    } else if (mode === 'after' !== !!flip) {\n        ctx.lineTo(previous.x, target.y);\n    } else {\n        ctx.lineTo(target.x, previous.y);\n    }\n    ctx.lineTo(target.x, target.y);\n}\n/**\n * @private\n */ function _bezierCurveTo(ctx, previous, target, flip) {\n    if (!previous) {\n        return ctx.lineTo(target.x, target.y);\n    }\n    ctx.bezierCurveTo(flip ? previous.cp1x : previous.cp2x, flip ? previous.cp1y : previous.cp2y, flip ? target.cp2x : target.cp1x, flip ? target.cp2y : target.cp1y, target.x, target.y);\n}\nfunction setRenderOpts(ctx, opts) {\n    if (opts.translation) {\n        ctx.translate(opts.translation[0], opts.translation[1]);\n    }\n    if (!isNullOrUndef(opts.rotation)) {\n        ctx.rotate(opts.rotation);\n    }\n    if (opts.color) {\n        ctx.fillStyle = opts.color;\n    }\n    if (opts.textAlign) {\n        ctx.textAlign = opts.textAlign;\n    }\n    if (opts.textBaseline) {\n        ctx.textBaseline = opts.textBaseline;\n    }\n}\nfunction decorateText(ctx, x, y, line, opts) {\n    if (opts.strikethrough || opts.underline) {\n        /**\n     * Now that IE11 support has been dropped, we can use more\n     * of the TextMetrics object. The actual bounding boxes\n     * are unflagged in Chrome, Firefox, Edge, and Safari so they\n     * can be safely used.\n     * See https://developer.mozilla.org/en-US/docs/Web/API/TextMetrics#Browser_compatibility\n     */ const metrics = ctx.measureText(line);\n        const left = x - metrics.actualBoundingBoxLeft;\n        const right = x + metrics.actualBoundingBoxRight;\n        const top = y - metrics.actualBoundingBoxAscent;\n        const bottom = y + metrics.actualBoundingBoxDescent;\n        const yDecoration = opts.strikethrough ? (top + bottom) / 2 : bottom;\n        ctx.strokeStyle = ctx.fillStyle;\n        ctx.beginPath();\n        ctx.lineWidth = opts.decorationWidth || 2;\n        ctx.moveTo(left, yDecoration);\n        ctx.lineTo(right, yDecoration);\n        ctx.stroke();\n    }\n}\nfunction drawBackdrop(ctx, opts) {\n    const oldColor = ctx.fillStyle;\n    ctx.fillStyle = opts.color;\n    ctx.fillRect(opts.left, opts.top, opts.width, opts.height);\n    ctx.fillStyle = oldColor;\n}\n/**\n * Render text onto the canvas\n */ function renderText(ctx, text, x, y, font, opts = {}) {\n    const lines = isArray(text) ? text : [\n        text\n    ];\n    const stroke = opts.strokeWidth > 0 && opts.strokeColor !== '';\n    let i, line;\n    ctx.save();\n    ctx.font = font.string;\n    setRenderOpts(ctx, opts);\n    for(i = 0; i < lines.length; ++i){\n        line = lines[i];\n        if (opts.backdrop) {\n            drawBackdrop(ctx, opts.backdrop);\n        }\n        if (stroke) {\n            if (opts.strokeColor) {\n                ctx.strokeStyle = opts.strokeColor;\n            }\n            if (!isNullOrUndef(opts.strokeWidth)) {\n                ctx.lineWidth = opts.strokeWidth;\n            }\n            ctx.strokeText(line, x, y, opts.maxWidth);\n        }\n        ctx.fillText(line, x, y, opts.maxWidth);\n        decorateText(ctx, x, y, line, opts);\n        y += Number(font.lineHeight);\n    }\n    ctx.restore();\n}\n/**\n * Add a path of a rectangle with rounded corners to the current sub-path\n * @param ctx - Context\n * @param rect - Bounding rect\n */ function addRoundedRectPath(ctx, rect) {\n    const { x , y , w , h , radius  } = rect;\n    // top left arc\n    ctx.arc(x + radius.topLeft, y + radius.topLeft, radius.topLeft, 1.5 * PI, PI, true);\n    // line from top left to bottom left\n    ctx.lineTo(x, y + h - radius.bottomLeft);\n    // bottom left arc\n    ctx.arc(x + radius.bottomLeft, y + h - radius.bottomLeft, radius.bottomLeft, PI, HALF_PI, true);\n    // line from bottom left to bottom right\n    ctx.lineTo(x + w - radius.bottomRight, y + h);\n    // bottom right arc\n    ctx.arc(x + w - radius.bottomRight, y + h - radius.bottomRight, radius.bottomRight, HALF_PI, 0, true);\n    // line from bottom right to top right\n    ctx.lineTo(x + w, y + radius.topRight);\n    // top right arc\n    ctx.arc(x + w - radius.topRight, y + radius.topRight, radius.topRight, 0, -HALF_PI, true);\n    // line from top right to top left\n    ctx.lineTo(x + radius.topLeft, y);\n}\n\nconst LINE_HEIGHT = /^(normal|(\\d+(?:\\.\\d+)?)(px|em|%)?)$/;\nconst FONT_STYLE = /^(normal|italic|initial|inherit|unset|(oblique( -?[0-9]?[0-9]deg)?))$/;\n/**\n * @alias Chart.helpers.options\n * @namespace\n */ /**\n * Converts the given line height `value` in pixels for a specific font `size`.\n * @param value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em').\n * @param size - The font size (in pixels) used to resolve relative `value`.\n * @returns The effective line height in pixels (size * 1.2 if value is invalid).\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height\n * @since 2.7.0\n */ function toLineHeight(value, size) {\n    const matches = ('' + value).match(LINE_HEIGHT);\n    if (!matches || matches[1] === 'normal') {\n        return size * 1.2;\n    }\n    value = +matches[2];\n    switch(matches[3]){\n        case 'px':\n            return value;\n        case '%':\n            value /= 100;\n            break;\n    }\n    return size * value;\n}\nconst numberOrZero = (v)=>+v || 0;\nfunction _readValueToProps(value, props) {\n    const ret = {};\n    const objProps = isObject(props);\n    const keys = objProps ? Object.keys(props) : props;\n    const read = isObject(value) ? objProps ? (prop)=>valueOrDefault(value[prop], value[props[prop]]) : (prop)=>value[prop] : ()=>value;\n    for (const prop of keys){\n        ret[prop] = numberOrZero(read(prop));\n    }\n    return ret;\n}\n/**\n * Converts the given value into a TRBL object.\n * @param value - If a number, set the value to all TRBL component,\n *  else, if an object, use defined properties and sets undefined ones to 0.\n *  x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left)\n * @since 3.0.0\n */ function toTRBL(value) {\n    return _readValueToProps(value, {\n        top: 'y',\n        right: 'x',\n        bottom: 'y',\n        left: 'x'\n    });\n}\n/**\n * Converts the given value into a TRBL corners object (similar with css border-radius).\n * @param value - If a number, set the value to all TRBL corner components,\n *  else, if an object, use defined properties and sets undefined ones to 0.\n * @returns The TRBL corner values (topLeft, topRight, bottomLeft, bottomRight)\n * @since 3.0.0\n */ function toTRBLCorners(value) {\n    return _readValueToProps(value, [\n        'topLeft',\n        'topRight',\n        'bottomLeft',\n        'bottomRight'\n    ]);\n}\n/**\n * Converts the given value into a padding object with pre-computed width/height.\n * @param value - If a number, set the value to all TRBL component,\n *  else, if an object, use defined properties and sets undefined ones to 0.\n *  x / y are shorthands for same value for left/right and top/bottom.\n * @returns The padding values (top, right, bottom, left, width, height)\n * @since 2.7.0\n */ function toPadding(value) {\n    const obj = toTRBL(value);\n    obj.width = obj.left + obj.right;\n    obj.height = obj.top + obj.bottom;\n    return obj;\n}\n/**\n * Parses font options and returns the font object.\n * @param options - A object that contains font options to be parsed.\n * @param fallback - A object that contains fallback font options.\n * @return The font object.\n * @private\n */ function toFont(options, fallback) {\n    options = options || {};\n    fallback = fallback || defaults.font;\n    let size = valueOrDefault(options.size, fallback.size);\n    if (typeof size === 'string') {\n        size = parseInt(size, 10);\n    }\n    let style = valueOrDefault(options.style, fallback.style);\n    if (style && !('' + style).match(FONT_STYLE)) {\n        console.warn('Invalid font style specified: \"' + style + '\"');\n        style = undefined;\n    }\n    const font = {\n        family: valueOrDefault(options.family, fallback.family),\n        lineHeight: toLineHeight(valueOrDefault(options.lineHeight, fallback.lineHeight), size),\n        size,\n        style,\n        weight: valueOrDefault(options.weight, fallback.weight),\n        string: ''\n    };\n    font.string = toFontString(font);\n    return font;\n}\n/**\n * Evaluates the given `inputs` sequentially and returns the first defined value.\n * @param inputs - An array of values, falling back to the last value.\n * @param context - If defined and the current value is a function, the value\n * is called with `context` as first argument and the result becomes the new input.\n * @param index - If defined and the current value is an array, the value\n * at `index` become the new input.\n * @param info - object to return information about resolution in\n * @param info.cacheable - Will be set to `false` if option is not cacheable.\n * @since 2.7.0\n */ function resolve(inputs, context, index, info) {\n    let cacheable = true;\n    let i, ilen, value;\n    for(i = 0, ilen = inputs.length; i < ilen; ++i){\n        value = inputs[i];\n        if (value === undefined) {\n            continue;\n        }\n        if (context !== undefined && typeof value === 'function') {\n            value = value(context);\n            cacheable = false;\n        }\n        if (index !== undefined && isArray(value)) {\n            value = value[index % value.length];\n            cacheable = false;\n        }\n        if (value !== undefined) {\n            if (info && !cacheable) {\n                info.cacheable = false;\n            }\n            return value;\n        }\n    }\n}\n/**\n * @param minmax\n * @param grace\n * @param beginAtZero\n * @private\n */ function _addGrace(minmax, grace, beginAtZero) {\n    const { min , max  } = minmax;\n    const change = toDimension(grace, (max - min) / 2);\n    const keepZero = (value, add)=>beginAtZero && value === 0 ? 0 : value + add;\n    return {\n        min: keepZero(min, -Math.abs(change)),\n        max: keepZero(max, change)\n    };\n}\nfunction createContext(parentContext, context) {\n    return Object.assign(Object.create(parentContext), context);\n}\n\n/**\n * Creates a Proxy for resolving raw values for options.\n * @param scopes - The option scopes to look for values, in resolution order\n * @param prefixes - The prefixes for values, in resolution order.\n * @param rootScopes - The root option scopes\n * @param fallback - Parent scopes fallback\n * @param getTarget - callback for getting the target for changed values\n * @returns Proxy\n * @private\n */ function _createResolver(scopes, prefixes = [\n    ''\n], rootScopes, fallback, getTarget = ()=>scopes[0]) {\n    const finalRootScopes = rootScopes || scopes;\n    if (typeof fallback === 'undefined') {\n        fallback = _resolve('_fallback', scopes);\n    }\n    const cache = {\n        [Symbol.toStringTag]: 'Object',\n        _cacheable: true,\n        _scopes: scopes,\n        _rootScopes: finalRootScopes,\n        _fallback: fallback,\n        _getTarget: getTarget,\n        override: (scope)=>_createResolver([\n                scope,\n                ...scopes\n            ], prefixes, finalRootScopes, fallback)\n    };\n    return new Proxy(cache, {\n        /**\n     * A trap for the delete operator.\n     */ deleteProperty (target, prop) {\n            delete target[prop]; // remove from cache\n            delete target._keys; // remove cached keys\n            delete scopes[0][prop]; // remove from top level scope\n            return true;\n        },\n        /**\n     * A trap for getting property values.\n     */ get (target, prop) {\n            return _cached(target, prop, ()=>_resolveWithPrefixes(prop, prefixes, scopes, target));\n        },\n        /**\n     * A trap for Object.getOwnPropertyDescriptor.\n     * Also used by Object.hasOwnProperty.\n     */ getOwnPropertyDescriptor (target, prop) {\n            return Reflect.getOwnPropertyDescriptor(target._scopes[0], prop);\n        },\n        /**\n     * A trap for Object.getPrototypeOf.\n     */ getPrototypeOf () {\n            return Reflect.getPrototypeOf(scopes[0]);\n        },\n        /**\n     * A trap for the in operator.\n     */ has (target, prop) {\n            return getKeysFromAllScopes(target).includes(prop);\n        },\n        /**\n     * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n     */ ownKeys (target) {\n            return getKeysFromAllScopes(target);\n        },\n        /**\n     * A trap for setting property values.\n     */ set (target, prop, value) {\n            const storage = target._storage || (target._storage = getTarget());\n            target[prop] = storage[prop] = value; // set to top level scope + cache\n            delete target._keys; // remove cached keys\n            return true;\n        }\n    });\n}\n/**\n * Returns an Proxy for resolving option values with context.\n * @param proxy - The Proxy returned by `_createResolver`\n * @param context - Context object for scriptable/indexable options\n * @param subProxy - The proxy provided for scriptable options\n * @param descriptorDefaults - Defaults for descriptors\n * @private\n */ function _attachContext(proxy, context, subProxy, descriptorDefaults) {\n    const cache = {\n        _cacheable: false,\n        _proxy: proxy,\n        _context: context,\n        _subProxy: subProxy,\n        _stack: new Set(),\n        _descriptors: _descriptors(proxy, descriptorDefaults),\n        setContext: (ctx)=>_attachContext(proxy, ctx, subProxy, descriptorDefaults),\n        override: (scope)=>_attachContext(proxy.override(scope), context, subProxy, descriptorDefaults)\n    };\n    return new Proxy(cache, {\n        /**\n     * A trap for the delete operator.\n     */ deleteProperty (target, prop) {\n            delete target[prop]; // remove from cache\n            delete proxy[prop]; // remove from proxy\n            return true;\n        },\n        /**\n     * A trap for getting property values.\n     */ get (target, prop, receiver) {\n            return _cached(target, prop, ()=>_resolveWithContext(target, prop, receiver));\n        },\n        /**\n     * A trap for Object.getOwnPropertyDescriptor.\n     * Also used by Object.hasOwnProperty.\n     */ getOwnPropertyDescriptor (target, prop) {\n            return target._descriptors.allKeys ? Reflect.has(proxy, prop) ? {\n                enumerable: true,\n                configurable: true\n            } : undefined : Reflect.getOwnPropertyDescriptor(proxy, prop);\n        },\n        /**\n     * A trap for Object.getPrototypeOf.\n     */ getPrototypeOf () {\n            return Reflect.getPrototypeOf(proxy);\n        },\n        /**\n     * A trap for the in operator.\n     */ has (target, prop) {\n            return Reflect.has(proxy, prop);\n        },\n        /**\n     * A trap for Object.getOwnPropertyNames and Object.getOwnPropertySymbols.\n     */ ownKeys () {\n            return Reflect.ownKeys(proxy);\n        },\n        /**\n     * A trap for setting property values.\n     */ set (target, prop, value) {\n            proxy[prop] = value; // set to proxy\n            delete target[prop]; // remove from cache\n            return true;\n        }\n    });\n}\n/**\n * @private\n */ function _descriptors(proxy, defaults = {\n    scriptable: true,\n    indexable: true\n}) {\n    const { _scriptable =defaults.scriptable , _indexable =defaults.indexable , _allKeys =defaults.allKeys  } = proxy;\n    return {\n        allKeys: _allKeys,\n        scriptable: _scriptable,\n        indexable: _indexable,\n        isScriptable: isFunction(_scriptable) ? _scriptable : ()=>_scriptable,\n        isIndexable: isFunction(_indexable) ? _indexable : ()=>_indexable\n    };\n}\nconst readKey = (prefix, name)=>prefix ? prefix + _capitalize(name) : name;\nconst needsSubResolver = (prop, value)=>isObject(value) && prop !== 'adapters' && (Object.getPrototypeOf(value) === null || value.constructor === Object);\nfunction _cached(target, prop, resolve) {\n    if (Object.prototype.hasOwnProperty.call(target, prop) || prop === 'constructor') {\n        return target[prop];\n    }\n    const value = resolve();\n    // cache the resolved value\n    target[prop] = value;\n    return value;\n}\nfunction _resolveWithContext(target, prop, receiver) {\n    const { _proxy , _context , _subProxy , _descriptors: descriptors  } = target;\n    let value = _proxy[prop]; // resolve from proxy\n    // resolve with context\n    if (isFunction(value) && descriptors.isScriptable(prop)) {\n        value = _resolveScriptable(prop, value, target, receiver);\n    }\n    if (isArray(value) && value.length) {\n        value = _resolveArray(prop, value, target, descriptors.isIndexable);\n    }\n    if (needsSubResolver(prop, value)) {\n        // if the resolved value is an object, create a sub resolver for it\n        value = _attachContext(value, _context, _subProxy && _subProxy[prop], descriptors);\n    }\n    return value;\n}\nfunction _resolveScriptable(prop, getValue, target, receiver) {\n    const { _proxy , _context , _subProxy , _stack  } = target;\n    if (_stack.has(prop)) {\n        throw new Error('Recursion detected: ' + Array.from(_stack).join('->') + '->' + prop);\n    }\n    _stack.add(prop);\n    let value = getValue(_context, _subProxy || receiver);\n    _stack.delete(prop);\n    if (needsSubResolver(prop, value)) {\n        // When scriptable option returns an object, create a resolver on that.\n        value = createSubResolver(_proxy._scopes, _proxy, prop, value);\n    }\n    return value;\n}\nfunction _resolveArray(prop, value, target, isIndexable) {\n    const { _proxy , _context , _subProxy , _descriptors: descriptors  } = target;\n    if (typeof _context.index !== 'undefined' && isIndexable(prop)) {\n        return value[_context.index % value.length];\n    } else if (isObject(value[0])) {\n        // Array of objects, return array or resolvers\n        const arr = value;\n        const scopes = _proxy._scopes.filter((s)=>s !== arr);\n        value = [];\n        for (const item of arr){\n            const resolver = createSubResolver(scopes, _proxy, prop, item);\n            value.push(_attachContext(resolver, _context, _subProxy && _subProxy[prop], descriptors));\n        }\n    }\n    return value;\n}\nfunction resolveFallback(fallback, prop, value) {\n    return isFunction(fallback) ? fallback(prop, value) : fallback;\n}\nconst getScope = (key, parent)=>key === true ? parent : typeof key === 'string' ? resolveObjectKey(parent, key) : undefined;\nfunction addScopes(set, parentScopes, key, parentFallback, value) {\n    for (const parent of parentScopes){\n        const scope = getScope(key, parent);\n        if (scope) {\n            set.add(scope);\n            const fallback = resolveFallback(scope._fallback, key, value);\n            if (typeof fallback !== 'undefined' && fallback !== key && fallback !== parentFallback) {\n                // When we reach the descriptor that defines a new _fallback, return that.\n                // The fallback will resume to that new scope.\n                return fallback;\n            }\n        } else if (scope === false && typeof parentFallback !== 'undefined' && key !== parentFallback) {\n            // Fallback to `false` results to `false`, when falling back to different key.\n            // For example `interaction` from `hover` or `plugins.tooltip` and `animation` from `animations`\n            return null;\n        }\n    }\n    return false;\n}\nfunction createSubResolver(parentScopes, resolver, prop, value) {\n    const rootScopes = resolver._rootScopes;\n    const fallback = resolveFallback(resolver._fallback, prop, value);\n    const allScopes = [\n        ...parentScopes,\n        ...rootScopes\n    ];\n    const set = new Set();\n    set.add(value);\n    let key = addScopesFromKey(set, allScopes, prop, fallback || prop, value);\n    if (key === null) {\n        return false;\n    }\n    if (typeof fallback !== 'undefined' && fallback !== prop) {\n        key = addScopesFromKey(set, allScopes, fallback, key, value);\n        if (key === null) {\n            return false;\n        }\n    }\n    return _createResolver(Array.from(set), [\n        ''\n    ], rootScopes, fallback, ()=>subGetTarget(resolver, prop, value));\n}\nfunction addScopesFromKey(set, allScopes, key, fallback, item) {\n    while(key){\n        key = addScopes(set, allScopes, key, fallback, item);\n    }\n    return key;\n}\nfunction subGetTarget(resolver, prop, value) {\n    const parent = resolver._getTarget();\n    if (!(prop in parent)) {\n        parent[prop] = {};\n    }\n    const target = parent[prop];\n    if (isArray(target) && isObject(value)) {\n        // For array of objects, the object is used to store updated values\n        return value;\n    }\n    return target || {};\n}\nfunction _resolveWithPrefixes(prop, prefixes, scopes, proxy) {\n    let value;\n    for (const prefix of prefixes){\n        value = _resolve(readKey(prefix, prop), scopes);\n        if (typeof value !== 'undefined') {\n            return needsSubResolver(prop, value) ? createSubResolver(scopes, proxy, prop, value) : value;\n        }\n    }\n}\nfunction _resolve(key, scopes) {\n    for (const scope of scopes){\n        if (!scope) {\n            continue;\n        }\n        const value = scope[key];\n        if (typeof value !== 'undefined') {\n            return value;\n        }\n    }\n}\nfunction getKeysFromAllScopes(target) {\n    let keys = target._keys;\n    if (!keys) {\n        keys = target._keys = resolveKeysFromAllScopes(target._scopes);\n    }\n    return keys;\n}\nfunction resolveKeysFromAllScopes(scopes) {\n    const set = new Set();\n    for (const scope of scopes){\n        for (const key of Object.keys(scope).filter((k)=>!k.startsWith('_'))){\n            set.add(key);\n        }\n    }\n    return Array.from(set);\n}\nfunction _parseObjectDataRadialScale(meta, data, start, count) {\n    const { iScale  } = meta;\n    const { key ='r'  } = this._parsing;\n    const parsed = new Array(count);\n    let i, ilen, index, item;\n    for(i = 0, ilen = count; i < ilen; ++i){\n        index = i + start;\n        item = data[index];\n        parsed[i] = {\n            r: iScale.parse(resolveObjectKey(item, key), index)\n        };\n    }\n    return parsed;\n}\n\nconst EPSILON = Number.EPSILON || 1e-14;\nconst getPoint = (points, i)=>i < points.length && !points[i].skip && points[i];\nconst getValueAxis = (indexAxis)=>indexAxis === 'x' ? 'y' : 'x';\nfunction splineCurve(firstPoint, middlePoint, afterPoint, t) {\n    // Props to Rob Spencer at scaled innovation for his post on splining between points\n    // http://scaledinnovation.com/analytics/splines/aboutSplines.html\n    // This function must also respect \"skipped\" points\n    const previous = firstPoint.skip ? middlePoint : firstPoint;\n    const current = middlePoint;\n    const next = afterPoint.skip ? middlePoint : afterPoint;\n    const d01 = distanceBetweenPoints(current, previous);\n    const d12 = distanceBetweenPoints(next, current);\n    let s01 = d01 / (d01 + d12);\n    let s12 = d12 / (d01 + d12);\n    // If all points are the same, s01 & s02 will be inf\n    s01 = isNaN(s01) ? 0 : s01;\n    s12 = isNaN(s12) ? 0 : s12;\n    const fa = t * s01; // scaling factor for triangle Ta\n    const fb = t * s12;\n    return {\n        previous: {\n            x: current.x - fa * (next.x - previous.x),\n            y: current.y - fa * (next.y - previous.y)\n        },\n        next: {\n            x: current.x + fb * (next.x - previous.x),\n            y: current.y + fb * (next.y - previous.y)\n        }\n    };\n}\n/**\n * Adjust tangents to ensure monotonic properties\n */ function monotoneAdjust(points, deltaK, mK) {\n    const pointsLen = points.length;\n    let alphaK, betaK, tauK, squaredMagnitude, pointCurrent;\n    let pointAfter = getPoint(points, 0);\n    for(let i = 0; i < pointsLen - 1; ++i){\n        pointCurrent = pointAfter;\n        pointAfter = getPoint(points, i + 1);\n        if (!pointCurrent || !pointAfter) {\n            continue;\n        }\n        if (almostEquals(deltaK[i], 0, EPSILON)) {\n            mK[i] = mK[i + 1] = 0;\n            continue;\n        }\n        alphaK = mK[i] / deltaK[i];\n        betaK = mK[i + 1] / deltaK[i];\n        squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2);\n        if (squaredMagnitude <= 9) {\n            continue;\n        }\n        tauK = 3 / Math.sqrt(squaredMagnitude);\n        mK[i] = alphaK * tauK * deltaK[i];\n        mK[i + 1] = betaK * tauK * deltaK[i];\n    }\n}\nfunction monotoneCompute(points, mK, indexAxis = 'x') {\n    const valueAxis = getValueAxis(indexAxis);\n    const pointsLen = points.length;\n    let delta, pointBefore, pointCurrent;\n    let pointAfter = getPoint(points, 0);\n    for(let i = 0; i < pointsLen; ++i){\n        pointBefore = pointCurrent;\n        pointCurrent = pointAfter;\n        pointAfter = getPoint(points, i + 1);\n        if (!pointCurrent) {\n            continue;\n        }\n        const iPixel = pointCurrent[indexAxis];\n        const vPixel = pointCurrent[valueAxis];\n        if (pointBefore) {\n            delta = (iPixel - pointBefore[indexAxis]) / 3;\n            pointCurrent[`cp1${indexAxis}`] = iPixel - delta;\n            pointCurrent[`cp1${valueAxis}`] = vPixel - delta * mK[i];\n        }\n        if (pointAfter) {\n            delta = (pointAfter[indexAxis] - iPixel) / 3;\n            pointCurrent[`cp2${indexAxis}`] = iPixel + delta;\n            pointCurrent[`cp2${valueAxis}`] = vPixel + delta * mK[i];\n        }\n    }\n}\n/**\n * This function calculates Bézier control points in a similar way than |splineCurve|,\n * but preserves monotonicity of the provided data and ensures no local extremums are added\n * between the dataset discrete points due to the interpolation.\n * See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation\n */ function splineCurveMonotone(points, indexAxis = 'x') {\n    const valueAxis = getValueAxis(indexAxis);\n    const pointsLen = points.length;\n    const deltaK = Array(pointsLen).fill(0);\n    const mK = Array(pointsLen);\n    // Calculate slopes (deltaK) and initialize tangents (mK)\n    let i, pointBefore, pointCurrent;\n    let pointAfter = getPoint(points, 0);\n    for(i = 0; i < pointsLen; ++i){\n        pointBefore = pointCurrent;\n        pointCurrent = pointAfter;\n        pointAfter = getPoint(points, i + 1);\n        if (!pointCurrent) {\n            continue;\n        }\n        if (pointAfter) {\n            const slopeDelta = pointAfter[indexAxis] - pointCurrent[indexAxis];\n            // In the case of two points that appear at the same x pixel, slopeDeltaX is 0\n            deltaK[i] = slopeDelta !== 0 ? (pointAfter[valueAxis] - pointCurrent[valueAxis]) / slopeDelta : 0;\n        }\n        mK[i] = !pointBefore ? deltaK[i] : !pointAfter ? deltaK[i - 1] : sign(deltaK[i - 1]) !== sign(deltaK[i]) ? 0 : (deltaK[i - 1] + deltaK[i]) / 2;\n    }\n    monotoneAdjust(points, deltaK, mK);\n    monotoneCompute(points, mK, indexAxis);\n}\nfunction capControlPoint(pt, min, max) {\n    return Math.max(Math.min(pt, max), min);\n}\nfunction capBezierPoints(points, area) {\n    let i, ilen, point, inArea, inAreaPrev;\n    let inAreaNext = _isPointInArea(points[0], area);\n    for(i = 0, ilen = points.length; i < ilen; ++i){\n        inAreaPrev = inArea;\n        inArea = inAreaNext;\n        inAreaNext = i < ilen - 1 && _isPointInArea(points[i + 1], area);\n        if (!inArea) {\n            continue;\n        }\n        point = points[i];\n        if (inAreaPrev) {\n            point.cp1x = capControlPoint(point.cp1x, area.left, area.right);\n            point.cp1y = capControlPoint(point.cp1y, area.top, area.bottom);\n        }\n        if (inAreaNext) {\n            point.cp2x = capControlPoint(point.cp2x, area.left, area.right);\n            point.cp2y = capControlPoint(point.cp2y, area.top, area.bottom);\n        }\n    }\n}\n/**\n * @private\n */ function _updateBezierControlPoints(points, options, area, loop, indexAxis) {\n    let i, ilen, point, controlPoints;\n    // Only consider points that are drawn in case the spanGaps option is used\n    if (options.spanGaps) {\n        points = points.filter((pt)=>!pt.skip);\n    }\n    if (options.cubicInterpolationMode === 'monotone') {\n        splineCurveMonotone(points, indexAxis);\n    } else {\n        let prev = loop ? points[points.length - 1] : points[0];\n        for(i = 0, ilen = points.length; i < ilen; ++i){\n            point = points[i];\n            controlPoints = splineCurve(prev, point, points[Math.min(i + 1, ilen - (loop ? 0 : 1)) % ilen], options.tension);\n            point.cp1x = controlPoints.previous.x;\n            point.cp1y = controlPoints.previous.y;\n            point.cp2x = controlPoints.next.x;\n            point.cp2y = controlPoints.next.y;\n            prev = point;\n        }\n    }\n    if (options.capBezierPoints) {\n        capBezierPoints(points, area);\n    }\n}\n\n/**\n * @private\n */ function _isDomSupported() {\n    return typeof window !== 'undefined' && typeof document !== 'undefined';\n}\n/**\n * @private\n */ function _getParentNode(domNode) {\n    let parent = domNode.parentNode;\n    if (parent && parent.toString() === '[object ShadowRoot]') {\n        parent = parent.host;\n    }\n    return parent;\n}\n/**\n * convert max-width/max-height values that may be percentages into a number\n * @private\n */ function parseMaxStyle(styleValue, node, parentProperty) {\n    let valueInPixels;\n    if (typeof styleValue === 'string') {\n        valueInPixels = parseInt(styleValue, 10);\n        if (styleValue.indexOf('%') !== -1) {\n            // percentage * size in dimension\n            valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty];\n        }\n    } else {\n        valueInPixels = styleValue;\n    }\n    return valueInPixels;\n}\nconst getComputedStyle = (element)=>element.ownerDocument.defaultView.getComputedStyle(element, null);\nfunction getStyle(el, property) {\n    return getComputedStyle(el).getPropertyValue(property);\n}\nconst positions = [\n    'top',\n    'right',\n    'bottom',\n    'left'\n];\nfunction getPositionedStyle(styles, style, suffix) {\n    const result = {};\n    suffix = suffix ? '-' + suffix : '';\n    for(let i = 0; i < 4; i++){\n        const pos = positions[i];\n        result[pos] = parseFloat(styles[style + '-' + pos + suffix]) || 0;\n    }\n    result.width = result.left + result.right;\n    result.height = result.top + result.bottom;\n    return result;\n}\nconst useOffsetPos = (x, y, target)=>(x > 0 || y > 0) && (!target || !target.shadowRoot);\n/**\n * @param e\n * @param canvas\n * @returns Canvas position\n */ function getCanvasPosition(e, canvas) {\n    const touches = e.touches;\n    const source = touches && touches.length ? touches[0] : e;\n    const { offsetX , offsetY  } = source;\n    let box = false;\n    let x, y;\n    if (useOffsetPos(offsetX, offsetY, e.target)) {\n        x = offsetX;\n        y = offsetY;\n    } else {\n        const rect = canvas.getBoundingClientRect();\n        x = source.clientX - rect.left;\n        y = source.clientY - rect.top;\n        box = true;\n    }\n    return {\n        x,\n        y,\n        box\n    };\n}\n/**\n * Gets an event's x, y coordinates, relative to the chart area\n * @param event\n * @param chart\n * @returns x and y coordinates of the event\n */ function getRelativePosition(event, chart) {\n    if ('native' in event) {\n        return event;\n    }\n    const { canvas , currentDevicePixelRatio  } = chart;\n    const style = getComputedStyle(canvas);\n    const borderBox = style.boxSizing === 'border-box';\n    const paddings = getPositionedStyle(style, 'padding');\n    const borders = getPositionedStyle(style, 'border', 'width');\n    const { x , y , box  } = getCanvasPosition(event, canvas);\n    const xOffset = paddings.left + (box && borders.left);\n    const yOffset = paddings.top + (box && borders.top);\n    let { width , height  } = chart;\n    if (borderBox) {\n        width -= paddings.width + borders.width;\n        height -= paddings.height + borders.height;\n    }\n    return {\n        x: Math.round((x - xOffset) / width * canvas.width / currentDevicePixelRatio),\n        y: Math.round((y - yOffset) / height * canvas.height / currentDevicePixelRatio)\n    };\n}\nfunction getContainerSize(canvas, width, height) {\n    let maxWidth, maxHeight;\n    if (width === undefined || height === undefined) {\n        const container = canvas && _getParentNode(canvas);\n        if (!container) {\n            width = canvas.clientWidth;\n            height = canvas.clientHeight;\n        } else {\n            const rect = container.getBoundingClientRect(); // this is the border box of the container\n            const containerStyle = getComputedStyle(container);\n            const containerBorder = getPositionedStyle(containerStyle, 'border', 'width');\n            const containerPadding = getPositionedStyle(containerStyle, 'padding');\n            width = rect.width - containerPadding.width - containerBorder.width;\n            height = rect.height - containerPadding.height - containerBorder.height;\n            maxWidth = parseMaxStyle(containerStyle.maxWidth, container, 'clientWidth');\n            maxHeight = parseMaxStyle(containerStyle.maxHeight, container, 'clientHeight');\n        }\n    }\n    return {\n        width,\n        height,\n        maxWidth: maxWidth || INFINITY,\n        maxHeight: maxHeight || INFINITY\n    };\n}\nconst round1 = (v)=>Math.round(v * 10) / 10;\n// eslint-disable-next-line complexity\nfunction getMaximumSize(canvas, bbWidth, bbHeight, aspectRatio) {\n    const style = getComputedStyle(canvas);\n    const margins = getPositionedStyle(style, 'margin');\n    const maxWidth = parseMaxStyle(style.maxWidth, canvas, 'clientWidth') || INFINITY;\n    const maxHeight = parseMaxStyle(style.maxHeight, canvas, 'clientHeight') || INFINITY;\n    const containerSize = getContainerSize(canvas, bbWidth, bbHeight);\n    let { width , height  } = containerSize;\n    if (style.boxSizing === 'content-box') {\n        const borders = getPositionedStyle(style, 'border', 'width');\n        const paddings = getPositionedStyle(style, 'padding');\n        width -= paddings.width + borders.width;\n        height -= paddings.height + borders.height;\n    }\n    width = Math.max(0, width - margins.width);\n    height = Math.max(0, aspectRatio ? width / aspectRatio : height - margins.height);\n    width = round1(Math.min(width, maxWidth, containerSize.maxWidth));\n    height = round1(Math.min(height, maxHeight, containerSize.maxHeight));\n    if (width && !height) {\n        // https://github.com/chartjs/Chart.js/issues/4659\n        // If the canvas has width, but no height, default to aspectRatio of 2 (canvas default)\n        height = round1(width / 2);\n    }\n    const maintainHeight = bbWidth !== undefined || bbHeight !== undefined;\n    if (maintainHeight && aspectRatio && containerSize.height && height > containerSize.height) {\n        height = containerSize.height;\n        width = round1(Math.floor(height * aspectRatio));\n    }\n    return {\n        width,\n        height\n    };\n}\n/**\n * @param chart\n * @param forceRatio\n * @param forceStyle\n * @returns True if the canvas context size or transformation has changed.\n */ function retinaScale(chart, forceRatio, forceStyle) {\n    const pixelRatio = forceRatio || 1;\n    const deviceHeight = Math.floor(chart.height * pixelRatio);\n    const deviceWidth = Math.floor(chart.width * pixelRatio);\n    chart.height = Math.floor(chart.height);\n    chart.width = Math.floor(chart.width);\n    const canvas = chart.canvas;\n    // If no style has been set on the canvas, the render size is used as display size,\n    // making the chart visually bigger, so let's enforce it to the \"correct\" values.\n    // See https://github.com/chartjs/Chart.js/issues/3575\n    if (canvas.style && (forceStyle || !canvas.style.height && !canvas.style.width)) {\n        canvas.style.height = `${chart.height}px`;\n        canvas.style.width = `${chart.width}px`;\n    }\n    if (chart.currentDevicePixelRatio !== pixelRatio || canvas.height !== deviceHeight || canvas.width !== deviceWidth) {\n        chart.currentDevicePixelRatio = pixelRatio;\n        canvas.height = deviceHeight;\n        canvas.width = deviceWidth;\n        chart.ctx.setTransform(pixelRatio, 0, 0, pixelRatio, 0, 0);\n        return true;\n    }\n    return false;\n}\n/**\n * Detects support for options object argument in addEventListener.\n * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support\n * @private\n */ const supportsEventListenerOptions = function() {\n    let passiveSupported = false;\n    try {\n        const options = {\n            get passive () {\n                passiveSupported = true;\n                return false;\n            }\n        };\n        if (_isDomSupported()) {\n            window.addEventListener('test', null, options);\n            window.removeEventListener('test', null, options);\n        }\n    } catch (e) {\n    // continue regardless of error\n    }\n    return passiveSupported;\n}();\n/**\n * The \"used\" size is the final value of a dimension property after all calculations have\n * been performed. This method uses the computed style of `element` but returns undefined\n * if the computed style is not expressed in pixels. That can happen in some cases where\n * `element` has a size relative to its parent and this last one is not yet displayed,\n * for example because of `display: none` on a parent node.\n * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value\n * @returns Size in pixels or undefined if unknown.\n */ function readUsedSize(element, property) {\n    const value = getStyle(element, property);\n    const matches = value && value.match(/^(\\d+)(\\.\\d+)?px$/);\n    return matches ? +matches[1] : undefined;\n}\n\n/**\n * @private\n */ function _pointInLine(p1, p2, t, mode) {\n    return {\n        x: p1.x + t * (p2.x - p1.x),\n        y: p1.y + t * (p2.y - p1.y)\n    };\n}\n/**\n * @private\n */ function _steppedInterpolation(p1, p2, t, mode) {\n    return {\n        x: p1.x + t * (p2.x - p1.x),\n        y: mode === 'middle' ? t < 0.5 ? p1.y : p2.y : mode === 'after' ? t < 1 ? p1.y : p2.y : t > 0 ? p2.y : p1.y\n    };\n}\n/**\n * @private\n */ function _bezierInterpolation(p1, p2, t, mode) {\n    const cp1 = {\n        x: p1.cp2x,\n        y: p1.cp2y\n    };\n    const cp2 = {\n        x: p2.cp1x,\n        y: p2.cp1y\n    };\n    const a = _pointInLine(p1, cp1, t);\n    const b = _pointInLine(cp1, cp2, t);\n    const c = _pointInLine(cp2, p2, t);\n    const d = _pointInLine(a, b, t);\n    const e = _pointInLine(b, c, t);\n    return _pointInLine(d, e, t);\n}\n\nconst getRightToLeftAdapter = function(rectX, width) {\n    return {\n        x (x) {\n            return rectX + rectX + width - x;\n        },\n        setWidth (w) {\n            width = w;\n        },\n        textAlign (align) {\n            if (align === 'center') {\n                return align;\n            }\n            return align === 'right' ? 'left' : 'right';\n        },\n        xPlus (x, value) {\n            return x - value;\n        },\n        leftForLtr (x, itemWidth) {\n            return x - itemWidth;\n        }\n    };\n};\nconst getLeftToRightAdapter = function() {\n    return {\n        x (x) {\n            return x;\n        },\n        setWidth (w) {},\n        textAlign (align) {\n            return align;\n        },\n        xPlus (x, value) {\n            return x + value;\n        },\n        leftForLtr (x, _itemWidth) {\n            return x;\n        }\n    };\n};\nfunction getRtlAdapter(rtl, rectX, width) {\n    return rtl ? getRightToLeftAdapter(rectX, width) : getLeftToRightAdapter();\n}\nfunction overrideTextDirection(ctx, direction) {\n    let style, original;\n    if (direction === 'ltr' || direction === 'rtl') {\n        style = ctx.canvas.style;\n        original = [\n            style.getPropertyValue('direction'),\n            style.getPropertyPriority('direction')\n        ];\n        style.setProperty('direction', direction, 'important');\n        ctx.prevTextDirection = original;\n    }\n}\nfunction restoreTextDirection(ctx, original) {\n    if (original !== undefined) {\n        delete ctx.prevTextDirection;\n        ctx.canvas.style.setProperty('direction', original[0], original[1]);\n    }\n}\n\nfunction propertyFn(property) {\n    if (property === 'angle') {\n        return {\n            between: _angleBetween,\n            compare: _angleDiff,\n            normalize: _normalizeAngle\n        };\n    }\n    return {\n        between: _isBetween,\n        compare: (a, b)=>a - b,\n        normalize: (x)=>x\n    };\n}\nfunction normalizeSegment({ start , end , count , loop , style  }) {\n    return {\n        start: start % count,\n        end: end % count,\n        loop: loop && (end - start + 1) % count === 0,\n        style\n    };\n}\nfunction getSegment(segment, points, bounds) {\n    const { property , start: startBound , end: endBound  } = bounds;\n    const { between , normalize  } = propertyFn(property);\n    const count = points.length;\n    let { start , end , loop  } = segment;\n    let i, ilen;\n    if (loop) {\n        start += count;\n        end += count;\n        for(i = 0, ilen = count; i < ilen; ++i){\n            if (!between(normalize(points[start % count][property]), startBound, endBound)) {\n                break;\n            }\n            start--;\n            end--;\n        }\n        start %= count;\n        end %= count;\n    }\n    if (end < start) {\n        end += count;\n    }\n    return {\n        start,\n        end,\n        loop,\n        style: segment.style\n    };\n}\n function _boundSegment(segment, points, bounds) {\n    if (!bounds) {\n        return [\n            segment\n        ];\n    }\n    const { property , start: startBound , end: endBound  } = bounds;\n    const count = points.length;\n    const { compare , between , normalize  } = propertyFn(property);\n    const { start , end , loop , style  } = getSegment(segment, points, bounds);\n    const result = [];\n    let inside = false;\n    let subStart = null;\n    let value, point, prevValue;\n    const startIsBefore = ()=>between(startBound, prevValue, value) && compare(startBound, prevValue) !== 0;\n    const endIsBefore = ()=>compare(endBound, value) === 0 || between(endBound, prevValue, value);\n    const shouldStart = ()=>inside || startIsBefore();\n    const shouldStop = ()=>!inside || endIsBefore();\n    for(let i = start, prev = start; i <= end; ++i){\n        point = points[i % count];\n        if (point.skip) {\n            continue;\n        }\n        value = normalize(point[property]);\n        if (value === prevValue) {\n            continue;\n        }\n        inside = between(value, startBound, endBound);\n        if (subStart === null && shouldStart()) {\n            subStart = compare(value, startBound) === 0 ? i : prev;\n        }\n        if (subStart !== null && shouldStop()) {\n            result.push(normalizeSegment({\n                start: subStart,\n                end: i,\n                loop,\n                count,\n                style\n            }));\n            subStart = null;\n        }\n        prev = i;\n        prevValue = value;\n    }\n    if (subStart !== null) {\n        result.push(normalizeSegment({\n            start: subStart,\n            end,\n            loop,\n            count,\n            style\n        }));\n    }\n    return result;\n}\n function _boundSegments(line, bounds) {\n    const result = [];\n    const segments = line.segments;\n    for(let i = 0; i < segments.length; i++){\n        const sub = _boundSegment(segments[i], line.points, bounds);\n        if (sub.length) {\n            result.push(...sub);\n        }\n    }\n    return result;\n}\n function findStartAndEnd(points, count, loop, spanGaps) {\n    let start = 0;\n    let end = count - 1;\n    if (loop && !spanGaps) {\n        while(start < count && !points[start].skip){\n            start++;\n        }\n    }\n    while(start < count && points[start].skip){\n        start++;\n    }\n    start %= count;\n    if (loop) {\n        end += start;\n    }\n    while(end > start && points[end % count].skip){\n        end--;\n    }\n    end %= count;\n    return {\n        start,\n        end\n    };\n}\n function solidSegments(points, start, max, loop) {\n    const count = points.length;\n    const result = [];\n    let last = start;\n    let prev = points[start];\n    let end;\n    for(end = start + 1; end <= max; ++end){\n        const cur = points[end % count];\n        if (cur.skip || cur.stop) {\n            if (!prev.skip) {\n                loop = false;\n                result.push({\n                    start: start % count,\n                    end: (end - 1) % count,\n                    loop\n                });\n                start = last = cur.stop ? end : null;\n            }\n        } else {\n            last = end;\n            if (prev.skip) {\n                start = end;\n            }\n        }\n        prev = cur;\n    }\n    if (last !== null) {\n        result.push({\n            start: start % count,\n            end: last % count,\n            loop\n        });\n    }\n    return result;\n}\n function _computeSegments(line, segmentOptions) {\n    const points = line.points;\n    const spanGaps = line.options.spanGaps;\n    const count = points.length;\n    if (!count) {\n        return [];\n    }\n    const loop = !!line._loop;\n    const { start , end  } = findStartAndEnd(points, count, loop, spanGaps);\n    if (spanGaps === true) {\n        return splitByStyles(line, [\n            {\n                start,\n                end,\n                loop\n            }\n        ], points, segmentOptions);\n    }\n    const max = end < start ? end + count : end;\n    const completeLoop = !!line._fullLoop && start === 0 && end === count - 1;\n    return splitByStyles(line, solidSegments(points, start, max, completeLoop), points, segmentOptions);\n}\n function splitByStyles(line, segments, points, segmentOptions) {\n    if (!segmentOptions || !segmentOptions.setContext || !points) {\n        return segments;\n    }\n    return doSplitByStyles(line, segments, points, segmentOptions);\n}\n function doSplitByStyles(line, segments, points, segmentOptions) {\n    const chartContext = line._chart.getContext();\n    const baseStyle = readStyle(line.options);\n    const { _datasetIndex: datasetIndex , options: { spanGaps  }  } = line;\n    const count = points.length;\n    const result = [];\n    let prevStyle = baseStyle;\n    let start = segments[0].start;\n    let i = start;\n    function addStyle(s, e, l, st) {\n        const dir = spanGaps ? -1 : 1;\n        if (s === e) {\n            return;\n        }\n        s += count;\n        while(points[s % count].skip){\n            s -= dir;\n        }\n        while(points[e % count].skip){\n            e += dir;\n        }\n        if (s % count !== e % count) {\n            result.push({\n                start: s % count,\n                end: e % count,\n                loop: l,\n                style: st\n            });\n            prevStyle = st;\n            start = e % count;\n        }\n    }\n    for (const segment of segments){\n        start = spanGaps ? start : segment.start;\n        let prev = points[start % count];\n        let style;\n        for(i = start + 1; i <= segment.end; i++){\n            const pt = points[i % count];\n            style = readStyle(segmentOptions.setContext(createContext(chartContext, {\n                type: 'segment',\n                p0: prev,\n                p1: pt,\n                p0DataIndex: (i - 1) % count,\n                p1DataIndex: i % count,\n                datasetIndex\n            })));\n            if (styleChanged(style, prevStyle)) {\n                addStyle(start, i - 1, segment.loop, prevStyle);\n            }\n            prev = pt;\n            prevStyle = style;\n        }\n        if (start < i - 1) {\n            addStyle(start, i - 1, segment.loop, prevStyle);\n        }\n    }\n    return result;\n}\nfunction readStyle(options) {\n    return {\n        backgroundColor: options.backgroundColor,\n        borderCapStyle: options.borderCapStyle,\n        borderDash: options.borderDash,\n        borderDashOffset: options.borderDashOffset,\n        borderJoinStyle: options.borderJoinStyle,\n        borderWidth: options.borderWidth,\n        borderColor: options.borderColor\n    };\n}\nfunction styleChanged(style, prevStyle) {\n    if (!prevStyle) {\n        return false;\n    }\n    const cache = [];\n    const replacer = function(key, value) {\n        if (!isPatternOrGradient(value)) {\n            return value;\n        }\n        if (!cache.includes(value)) {\n            cache.push(value);\n        }\n        return cache.indexOf(value);\n    };\n    return JSON.stringify(style, replacer) !== JSON.stringify(prevStyle, replacer);\n}\n\nexport { unclipArea as $, _rlookupByKey as A, _lookupByKey as B, _isPointInArea as C, getAngleFromPoint as D, toPadding as E, each as F, getMaximumSize as G, HALF_PI as H, _getParentNode as I, readUsedSize as J, supportsEventListenerOptions as K, throttled as L, _isDomSupported as M, _factorize as N, finiteOrDefault as O, PI as P, callback as Q, _addGrace as R, _limitValue as S, TAU as T, toDegrees as U, _measureText as V, _int16Range as W, _alignPixel as X, clipArea as Y, renderText as Z, _arrayUnique as _, resolve as a, fontString as a$, toFont as a0, _toLeftRightCenter as a1, _alignStartEnd as a2, overrides as a3, merge as a4, _capitalize as a5, descriptors as a6, isFunction as a7, _attachContext as a8, _createResolver as a9, overrideTextDirection as aA, _textX as aB, restoreTextDirection as aC, drawPointLegend as aD, distanceBetweenPoints as aE, noop as aF, _setMinAndMaxByKey as aG, niceNum as aH, almostWhole as aI, almostEquals as aJ, _decimalPlaces as aK, Ticks as aL, log10 as aM, _longestText as aN, _filterBetween as aO, _lookup as aP, isPatternOrGradient as aQ, getHoverColor as aR, clone as aS, _merger as aT, _mergerIf as aU, _deprecated as aV, _splitKey as aW, toFontString as aX, splineCurve as aY, splineCurveMonotone as aZ, getStyle as a_, _descriptors as aa, mergeIf as ab, uid as ac, debounce as ad, retinaScale as ae, clearCanvas as af, setsEqual as ag, _elementsEqual as ah, _isClickEvent as ai, _isBetween as aj, _readValueToProps as ak, _updateBezierControlPoints as al, _computeSegments as am, _boundSegments as an, _steppedInterpolation as ao, _bezierInterpolation as ap, _pointInLine as aq, _steppedLineTo as ar, _bezierCurveTo as as, drawPoint as at, addRoundedRectPath as au, toTRBL as av, toTRBLCorners as aw, _boundSegment as ax, _normalizeAngle as ay, getRtlAdapter as az, isArray as b, toLineHeight as b0, PITAU as b1, INFINITY as b2, RAD_PER_DEG as b3, QUARTER_PI as b4, TWO_THIRDS_PI as b5, _angleDiff as b6, color as c, defaults as d, effects as e, resolveObjectKey as f, isNumberFinite as g, defined as h, isObject as i, createContext as j, isNullOrUndef as k, listenArrayEvents as l, toPercentage as m, toDimension as n, formatNumber as o, _angleBetween as p, _getStartAndCountOfVisiblePoints as q, requestAnimFrame as r, sign as s, toRadians as t, unlistenArrayEvents as u, valueOrDefault as v, _scaleRangesChanged as w, isNumber as x, _parseObjectDataRadialScale as y, getRelativePosition as z };\n//# sourceMappingURL=helpers.segment.js.map\n","/*!\n * Chart.js v4.4.8\n * https://www.chartjs.org\n * (c) 2025 Chart.js Contributors\n * Released under the MIT License\n */\nimport { r as requestAnimFrame, a as resolve, e as effects, c as color, i as isObject, d as defaults, b as isArray, v as valueOrDefault, u as unlistenArrayEvents, l as listenArrayEvents, f as resolveObjectKey, g as isNumberFinite, h as defined, s as sign, j as createContext, k as isNullOrUndef, _ as _arrayUnique, t as toRadians, m as toPercentage, n as toDimension, T as TAU, o as formatNumber, p as _angleBetween, H as HALF_PI, P as PI, q as _getStartAndCountOfVisiblePoints, w as _scaleRangesChanged, x as isNumber, y as _parseObjectDataRadialScale, z as getRelativePosition, A as _rlookupByKey, B as _lookupByKey, C as _isPointInArea, D as getAngleFromPoint, E as toPadding, F as each, G as getMaximumSize, I as _getParentNode, J as readUsedSize, K as supportsEventListenerOptions, L as throttled, M as _isDomSupported, N as _factorize, O as finiteOrDefault, Q as callback, R as _addGrace, S as _limitValue, U as toDegrees, V as _measureText, W as _int16Range, X as _alignPixel, Y as clipArea, Z as renderText, $ as unclipArea, a0 as toFont, a1 as _toLeftRightCenter, a2 as _alignStartEnd, a3 as overrides, a4 as merge, a5 as _capitalize, a6 as descriptors, a7 as isFunction, a8 as _attachContext, a9 as _createResolver, aa as _descriptors, ab as mergeIf, ac as uid, ad as debounce, ae as retinaScale, af as clearCanvas, ag as setsEqual, ah as _elementsEqual, ai as _isClickEvent, aj as _isBetween, ak as _readValueToProps, al as _updateBezierControlPoints, am as _computeSegments, an as _boundSegments, ao as _steppedInterpolation, ap as _bezierInterpolation, aq as _pointInLine, ar as _steppedLineTo, as as _bezierCurveTo, at as drawPoint, au as addRoundedRectPath, av as toTRBL, aw as toTRBLCorners, ax as _boundSegment, ay as _normalizeAngle, az as getRtlAdapter, aA as overrideTextDirection, aB as _textX, aC as restoreTextDirection, aD as drawPointLegend, aE as distanceBetweenPoints, aF as noop, aG as _setMinAndMaxByKey, aH as niceNum, aI as almostWhole, aJ as almostEquals, aK as _decimalPlaces, aL as Ticks, aM as log10, aN as _longestText, aO as _filterBetween, aP as _lookup } from './chunks/helpers.segment.js';\nimport '@kurkle/color';\n\nclass Animator {\n    constructor(){\n        this._request = null;\n        this._charts = new Map();\n        this._running = false;\n        this._lastDate = undefined;\n    }\n _notify(chart, anims, date, type) {\n        const callbacks = anims.listeners[type];\n        const numSteps = anims.duration;\n        callbacks.forEach((fn)=>fn({\n                chart,\n                initial: anims.initial,\n                numSteps,\n                currentStep: Math.min(date - anims.start, numSteps)\n            }));\n    }\n _refresh() {\n        if (this._request) {\n            return;\n        }\n        this._running = true;\n        this._request = requestAnimFrame.call(window, ()=>{\n            this._update();\n            this._request = null;\n            if (this._running) {\n                this._refresh();\n            }\n        });\n    }\n _update(date = Date.now()) {\n        let remaining = 0;\n        this._charts.forEach((anims, chart)=>{\n            if (!anims.running || !anims.items.length) {\n                return;\n            }\n            const items = anims.items;\n            let i = items.length - 1;\n            let draw = false;\n            let item;\n            for(; i >= 0; --i){\n                item = items[i];\n                if (item._active) {\n                    if (item._total > anims.duration) {\n                        anims.duration = item._total;\n                    }\n                    item.tick(date);\n                    draw = true;\n                } else {\n                    items[i] = items[items.length - 1];\n                    items.pop();\n                }\n            }\n            if (draw) {\n                chart.draw();\n                this._notify(chart, anims, date, 'progress');\n            }\n            if (!items.length) {\n                anims.running = false;\n                this._notify(chart, anims, date, 'complete');\n                anims.initial = false;\n            }\n            remaining += items.length;\n        });\n        this._lastDate = date;\n        if (remaining === 0) {\n            this._running = false;\n        }\n    }\n _getAnims(chart) {\n        const charts = this._charts;\n        let anims = charts.get(chart);\n        if (!anims) {\n            anims = {\n                running: false,\n                initial: true,\n                items: [],\n                listeners: {\n                    complete: [],\n                    progress: []\n                }\n            };\n            charts.set(chart, anims);\n        }\n        return anims;\n    }\n listen(chart, event, cb) {\n        this._getAnims(chart).listeners[event].push(cb);\n    }\n add(chart, items) {\n        if (!items || !items.length) {\n            return;\n        }\n        this._getAnims(chart).items.push(...items);\n    }\n has(chart) {\n        return this._getAnims(chart).items.length > 0;\n    }\n start(chart) {\n        const anims = this._charts.get(chart);\n        if (!anims) {\n            return;\n        }\n        anims.running = true;\n        anims.start = Date.now();\n        anims.duration = anims.items.reduce((acc, cur)=>Math.max(acc, cur._duration), 0);\n        this._refresh();\n    }\n    running(chart) {\n        if (!this._running) {\n            return false;\n        }\n        const anims = this._charts.get(chart);\n        if (!anims || !anims.running || !anims.items.length) {\n            return false;\n        }\n        return true;\n    }\n stop(chart) {\n        const anims = this._charts.get(chart);\n        if (!anims || !anims.items.length) {\n            return;\n        }\n        const items = anims.items;\n        let i = items.length - 1;\n        for(; i >= 0; --i){\n            items[i].cancel();\n        }\n        anims.items = [];\n        this._notify(chart, anims, Date.now(), 'complete');\n    }\n remove(chart) {\n        return this._charts.delete(chart);\n    }\n}\nvar animator = /* #__PURE__ */ new Animator();\n\nconst transparent = 'transparent';\nconst interpolators = {\n    boolean (from, to, factor) {\n        return factor > 0.5 ? to : from;\n    },\n color (from, to, factor) {\n        const c0 = color(from || transparent);\n        const c1 = c0.valid && color(to || transparent);\n        return c1 && c1.valid ? c1.mix(c0, factor).hexString() : to;\n    },\n    number (from, to, factor) {\n        return from + (to - from) * factor;\n    }\n};\nclass Animation {\n    constructor(cfg, target, prop, to){\n        const currentValue = target[prop];\n        to = resolve([\n            cfg.to,\n            to,\n            currentValue,\n            cfg.from\n        ]);\n        const from = resolve([\n            cfg.from,\n            currentValue,\n            to\n        ]);\n        this._active = true;\n        this._fn = cfg.fn || interpolators[cfg.type || typeof from];\n        this._easing = effects[cfg.easing] || effects.linear;\n        this._start = Math.floor(Date.now() + (cfg.delay || 0));\n        this._duration = this._total = Math.floor(cfg.duration);\n        this._loop = !!cfg.loop;\n        this._target = target;\n        this._prop = prop;\n        this._from = from;\n        this._to = to;\n        this._promises = undefined;\n    }\n    active() {\n        return this._active;\n    }\n    update(cfg, to, date) {\n        if (this._active) {\n            this._notify(false);\n            const currentValue = this._target[this._prop];\n            const elapsed = date - this._start;\n            const remain = this._duration - elapsed;\n            this._start = date;\n            this._duration = Math.floor(Math.max(remain, cfg.duration));\n            this._total += elapsed;\n            this._loop = !!cfg.loop;\n            this._to = resolve([\n                cfg.to,\n                to,\n                currentValue,\n                cfg.from\n            ]);\n            this._from = resolve([\n                cfg.from,\n                currentValue,\n                to\n            ]);\n        }\n    }\n    cancel() {\n        if (this._active) {\n            this.tick(Date.now());\n            this._active = false;\n            this._notify(false);\n        }\n    }\n    tick(date) {\n        const elapsed = date - this._start;\n        const duration = this._duration;\n        const prop = this._prop;\n        const from = this._from;\n        const loop = this._loop;\n        const to = this._to;\n        let factor;\n        this._active = from !== to && (loop || elapsed < duration);\n        if (!this._active) {\n            this._target[prop] = to;\n            this._notify(true);\n            return;\n        }\n        if (elapsed < 0) {\n            this._target[prop] = from;\n            return;\n        }\n        factor = elapsed / duration % 2;\n        factor = loop && factor > 1 ? 2 - factor : factor;\n        factor = this._easing(Math.min(1, Math.max(0, factor)));\n        this._target[prop] = this._fn(from, to, factor);\n    }\n    wait() {\n        const promises = this._promises || (this._promises = []);\n        return new Promise((res, rej)=>{\n            promises.push({\n                res,\n                rej\n            });\n        });\n    }\n    _notify(resolved) {\n        const method = resolved ? 'res' : 'rej';\n        const promises = this._promises || [];\n        for(let i = 0; i < promises.length; i++){\n            promises[i][method]();\n        }\n    }\n}\n\nclass Animations {\n    constructor(chart, config){\n        this._chart = chart;\n        this._properties = new Map();\n        this.configure(config);\n    }\n    configure(config) {\n        if (!isObject(config)) {\n            return;\n        }\n        const animationOptions = Object.keys(defaults.animation);\n        const animatedProps = this._properties;\n        Object.getOwnPropertyNames(config).forEach((key)=>{\n            const cfg = config[key];\n            if (!isObject(cfg)) {\n                return;\n            }\n            const resolved = {};\n            for (const option of animationOptions){\n                resolved[option] = cfg[option];\n            }\n            (isArray(cfg.properties) && cfg.properties || [\n                key\n            ]).forEach((prop)=>{\n                if (prop === key || !animatedProps.has(prop)) {\n                    animatedProps.set(prop, resolved);\n                }\n            });\n        });\n    }\n _animateOptions(target, values) {\n        const newOptions = values.options;\n        const options = resolveTargetOptions(target, newOptions);\n        if (!options) {\n            return [];\n        }\n        const animations = this._createAnimations(options, newOptions);\n        if (newOptions.$shared) {\n            awaitAll(target.options.$animations, newOptions).then(()=>{\n                target.options = newOptions;\n            }, ()=>{\n            });\n        }\n        return animations;\n    }\n _createAnimations(target, values) {\n        const animatedProps = this._properties;\n        const animations = [];\n        const running = target.$animations || (target.$animations = {});\n        const props = Object.keys(values);\n        const date = Date.now();\n        let i;\n        for(i = props.length - 1; i >= 0; --i){\n            const prop = props[i];\n            if (prop.charAt(0) === '$') {\n                continue;\n            }\n            if (prop === 'options') {\n                animations.push(...this._animateOptions(target, values));\n                continue;\n            }\n            const value = values[prop];\n            let animation = running[prop];\n            const cfg = animatedProps.get(prop);\n            if (animation) {\n                if (cfg && animation.active()) {\n                    animation.update(cfg, value, date);\n                    continue;\n                } else {\n                    animation.cancel();\n                }\n            }\n            if (!cfg || !cfg.duration) {\n                target[prop] = value;\n                continue;\n            }\n            running[prop] = animation = new Animation(cfg, target, prop, value);\n            animations.push(animation);\n        }\n        return animations;\n    }\n update(target, values) {\n        if (this._properties.size === 0) {\n            Object.assign(target, values);\n            return;\n        }\n        const animations = this._createAnimations(target, values);\n        if (animations.length) {\n            animator.add(this._chart, animations);\n            return true;\n        }\n    }\n}\nfunction awaitAll(animations, properties) {\n    const running = [];\n    const keys = Object.keys(properties);\n    for(let i = 0; i < keys.length; i++){\n        const anim = animations[keys[i]];\n        if (anim && anim.active()) {\n            running.push(anim.wait());\n        }\n    }\n    return Promise.all(running);\n}\nfunction resolveTargetOptions(target, newOptions) {\n    if (!newOptions) {\n        return;\n    }\n    let options = target.options;\n    if (!options) {\n        target.options = newOptions;\n        return;\n    }\n    if (options.$shared) {\n        target.options = options = Object.assign({}, options, {\n            $shared: false,\n            $animations: {}\n        });\n    }\n    return options;\n}\n\nfunction scaleClip(scale, allowedOverflow) {\n    const opts = scale && scale.options || {};\n    const reverse = opts.reverse;\n    const min = opts.min === undefined ? allowedOverflow : 0;\n    const max = opts.max === undefined ? allowedOverflow : 0;\n    return {\n        start: reverse ? max : min,\n        end: reverse ? min : max\n    };\n}\nfunction defaultClip(xScale, yScale, allowedOverflow) {\n    if (allowedOverflow === false) {\n        return false;\n    }\n    const x = scaleClip(xScale, allowedOverflow);\n    const y = scaleClip(yScale, allowedOverflow);\n    return {\n        top: y.end,\n        right: x.end,\n        bottom: y.start,\n        left: x.start\n    };\n}\nfunction toClip(value) {\n    let t, r, b, l;\n    if (isObject(value)) {\n        t = value.top;\n        r = value.right;\n        b = value.bottom;\n        l = value.left;\n    } else {\n        t = r = b = l = value;\n    }\n    return {\n        top: t,\n        right: r,\n        bottom: b,\n        left: l,\n        disabled: value === false\n    };\n}\nfunction getSortedDatasetIndices(chart, filterVisible) {\n    const keys = [];\n    const metasets = chart._getSortedDatasetMetas(filterVisible);\n    let i, ilen;\n    for(i = 0, ilen = metasets.length; i < ilen; ++i){\n        keys.push(metasets[i].index);\n    }\n    return keys;\n}\nfunction applyStack(stack, value, dsIndex, options = {}) {\n    const keys = stack.keys;\n    const singleMode = options.mode === 'single';\n    let i, ilen, datasetIndex, otherValue;\n    if (value === null) {\n        return;\n    }\n    let found = false;\n    for(i = 0, ilen = keys.length; i < ilen; ++i){\n        datasetIndex = +keys[i];\n        if (datasetIndex === dsIndex) {\n            found = true;\n            if (options.all) {\n                continue;\n            }\n            break;\n        }\n        otherValue = stack.values[datasetIndex];\n        if (isNumberFinite(otherValue) && (singleMode || value === 0 || sign(value) === sign(otherValue))) {\n            value += otherValue;\n        }\n    }\n    if (!found && !options.all) {\n        return 0;\n    }\n    return value;\n}\nfunction convertObjectDataToArray(data, meta) {\n    const { iScale , vScale  } = meta;\n    const iAxisKey = iScale.axis === 'x' ? 'x' : 'y';\n    const vAxisKey = vScale.axis === 'x' ? 'x' : 'y';\n    const keys = Object.keys(data);\n    const adata = new Array(keys.length);\n    let i, ilen, key;\n    for(i = 0, ilen = keys.length; i < ilen; ++i){\n        key = keys[i];\n        adata[i] = {\n            [iAxisKey]: key,\n            [vAxisKey]: data[key]\n        };\n    }\n    return adata;\n}\nfunction isStacked(scale, meta) {\n    const stacked = scale && scale.options.stacked;\n    return stacked || stacked === undefined && meta.stack !== undefined;\n}\nfunction getStackKey(indexScale, valueScale, meta) {\n    return `${indexScale.id}.${valueScale.id}.${meta.stack || meta.type}`;\n}\nfunction getUserBounds(scale) {\n    const { min , max , minDefined , maxDefined  } = scale.getUserBounds();\n    return {\n        min: minDefined ? min : Number.NEGATIVE_INFINITY,\n        max: maxDefined ? max : Number.POSITIVE_INFINITY\n    };\n}\nfunction getOrCreateStack(stacks, stackKey, indexValue) {\n    const subStack = stacks[stackKey] || (stacks[stackKey] = {});\n    return subStack[indexValue] || (subStack[indexValue] = {});\n}\nfunction getLastIndexInStack(stack, vScale, positive, type) {\n    for (const meta of vScale.getMatchingVisibleMetas(type).reverse()){\n        const value = stack[meta.index];\n        if (positive && value > 0 || !positive && value < 0) {\n            return meta.index;\n        }\n    }\n    return null;\n}\nfunction updateStacks(controller, parsed) {\n    const { chart , _cachedMeta: meta  } = controller;\n    const stacks = chart._stacks || (chart._stacks = {});\n    const { iScale , vScale , index: datasetIndex  } = meta;\n    const iAxis = iScale.axis;\n    const vAxis = vScale.axis;\n    const key = getStackKey(iScale, vScale, meta);\n    const ilen = parsed.length;\n    let stack;\n    for(let i = 0; i < ilen; ++i){\n        const item = parsed[i];\n        const { [iAxis]: index , [vAxis]: value  } = item;\n        const itemStacks = item._stacks || (item._stacks = {});\n        stack = itemStacks[vAxis] = getOrCreateStack(stacks, key, index);\n        stack[datasetIndex] = value;\n        stack._top = getLastIndexInStack(stack, vScale, true, meta.type);\n        stack._bottom = getLastIndexInStack(stack, vScale, false, meta.type);\n        const visualValues = stack._visualValues || (stack._visualValues = {});\n        visualValues[datasetIndex] = value;\n    }\n}\nfunction getFirstScaleId(chart, axis) {\n    const scales = chart.scales;\n    return Object.keys(scales).filter((key)=>scales[key].axis === axis).shift();\n}\nfunction createDatasetContext(parent, index) {\n    return createContext(parent, {\n        active: false,\n        dataset: undefined,\n        datasetIndex: index,\n        index,\n        mode: 'default',\n        type: 'dataset'\n    });\n}\nfunction createDataContext(parent, index, element) {\n    return createContext(parent, {\n        active: false,\n        dataIndex: index,\n        parsed: undefined,\n        raw: undefined,\n        element,\n        index,\n        mode: 'default',\n        type: 'data'\n    });\n}\nfunction clearStacks(meta, items) {\n    const datasetIndex = meta.controller.index;\n    const axis = meta.vScale && meta.vScale.axis;\n    if (!axis) {\n        return;\n    }\n    items = items || meta._parsed;\n    for (const parsed of items){\n        const stacks = parsed._stacks;\n        if (!stacks || stacks[axis] === undefined || stacks[axis][datasetIndex] === undefined) {\n            return;\n        }\n        delete stacks[axis][datasetIndex];\n        if (stacks[axis]._visualValues !== undefined && stacks[axis]._visualValues[datasetIndex] !== undefined) {\n            delete stacks[axis]._visualValues[datasetIndex];\n        }\n    }\n}\nconst isDirectUpdateMode = (mode)=>mode === 'reset' || mode === 'none';\nconst cloneIfNotShared = (cached, shared)=>shared ? cached : Object.assign({}, cached);\nconst createStack = (canStack, meta, chart)=>canStack && !meta.hidden && meta._stacked && {\n        keys: getSortedDatasetIndices(chart, true),\n        values: null\n    };\nclass DatasetController {\n static defaults = {};\n static datasetElementType = null;\n static dataElementType = null;\n constructor(chart, datasetIndex){\n        this.chart = chart;\n        this._ctx = chart.ctx;\n        this.index = datasetIndex;\n        this._cachedDataOpts = {};\n        this._cachedMeta = this.getMeta();\n        this._type = this._cachedMeta.type;\n        this.options = undefined;\n         this._parsing = false;\n        this._data = undefined;\n        this._objectData = undefined;\n        this._sharedOptions = undefined;\n        this._drawStart = undefined;\n        this._drawCount = undefined;\n        this.enableOptionSharing = false;\n        this.supportsDecimation = false;\n        this.$context = undefined;\n        this._syncList = [];\n        this.datasetElementType = new.target.datasetElementType;\n        this.dataElementType = new.target.dataElementType;\n        this.initialize();\n    }\n    initialize() {\n        const meta = this._cachedMeta;\n        this.configure();\n        this.linkScales();\n        meta._stacked = isStacked(meta.vScale, meta);\n        this.addElements();\n        if (this.options.fill && !this.chart.isPluginEnabled('filler')) {\n            console.warn(\"Tried to use the 'fill' option without the 'Filler' plugin enabled. Please import and register the 'Filler' plugin and make sure it is not disabled in the options\");\n        }\n    }\n    updateIndex(datasetIndex) {\n        if (this.index !== datasetIndex) {\n            clearStacks(this._cachedMeta);\n        }\n        this.index = datasetIndex;\n    }\n    linkScales() {\n        const chart = this.chart;\n        const meta = this._cachedMeta;\n        const dataset = this.getDataset();\n        const chooseId = (axis, x, y, r)=>axis === 'x' ? x : axis === 'r' ? r : y;\n        const xid = meta.xAxisID = valueOrDefault(dataset.xAxisID, getFirstScaleId(chart, 'x'));\n        const yid = meta.yAxisID = valueOrDefault(dataset.yAxisID, getFirstScaleId(chart, 'y'));\n        const rid = meta.rAxisID = valueOrDefault(dataset.rAxisID, getFirstScaleId(chart, 'r'));\n        const indexAxis = meta.indexAxis;\n        const iid = meta.iAxisID = chooseId(indexAxis, xid, yid, rid);\n        const vid = meta.vAxisID = chooseId(indexAxis, yid, xid, rid);\n        meta.xScale = this.getScaleForId(xid);\n        meta.yScale = this.getScaleForId(yid);\n        meta.rScale = this.getScaleForId(rid);\n        meta.iScale = this.getScaleForId(iid);\n        meta.vScale = this.getScaleForId(vid);\n    }\n    getDataset() {\n        return this.chart.data.datasets[this.index];\n    }\n    getMeta() {\n        return this.chart.getDatasetMeta(this.index);\n    }\n getScaleForId(scaleID) {\n        return this.chart.scales[scaleID];\n    }\n _getOtherScale(scale) {\n        const meta = this._cachedMeta;\n        return scale === meta.iScale ? meta.vScale : meta.iScale;\n    }\n    reset() {\n        this._update('reset');\n    }\n _destroy() {\n        const meta = this._cachedMeta;\n        if (this._data) {\n            unlistenArrayEvents(this._data, this);\n        }\n        if (meta._stacked) {\n            clearStacks(meta);\n        }\n    }\n _dataCheck() {\n        const dataset = this.getDataset();\n        const data = dataset.data || (dataset.data = []);\n        const _data = this._data;\n        if (isObject(data)) {\n            const meta = this._cachedMeta;\n            this._data = convertObjectDataToArray(data, meta);\n        } else if (_data !== data) {\n            if (_data) {\n                unlistenArrayEvents(_data, this);\n                const meta = this._cachedMeta;\n                clearStacks(meta);\n                meta._parsed = [];\n            }\n            if (data && Object.isExtensible(data)) {\n                listenArrayEvents(data, this);\n            }\n            this._syncList = [];\n            this._data = data;\n        }\n    }\n    addElements() {\n        const meta = this._cachedMeta;\n        this._dataCheck();\n        if (this.datasetElementType) {\n            meta.dataset = new this.datasetElementType();\n        }\n    }\n    buildOrUpdateElements(resetNewElements) {\n        const meta = this._cachedMeta;\n        const dataset = this.getDataset();\n        let stackChanged = false;\n        this._dataCheck();\n        const oldStacked = meta._stacked;\n        meta._stacked = isStacked(meta.vScale, meta);\n        if (meta.stack !== dataset.stack) {\n            stackChanged = true;\n            clearStacks(meta);\n            meta.stack = dataset.stack;\n        }\n        this._resyncElements(resetNewElements);\n        if (stackChanged || oldStacked !== meta._stacked) {\n            updateStacks(this, meta._parsed);\n            meta._stacked = isStacked(meta.vScale, meta);\n        }\n    }\n configure() {\n        const config = this.chart.config;\n        const scopeKeys = config.datasetScopeKeys(this._type);\n        const scopes = config.getOptionScopes(this.getDataset(), scopeKeys, true);\n        this.options = config.createResolver(scopes, this.getContext());\n        this._parsing = this.options.parsing;\n        this._cachedDataOpts = {};\n    }\n parse(start, count) {\n        const { _cachedMeta: meta , _data: data  } = this;\n        const { iScale , _stacked  } = meta;\n        const iAxis = iScale.axis;\n        let sorted = start === 0 && count === data.length ? true : meta._sorted;\n        let prev = start > 0 && meta._parsed[start - 1];\n        let i, cur, parsed;\n        if (this._parsing === false) {\n            meta._parsed = data;\n            meta._sorted = true;\n            parsed = data;\n        } else {\n            if (isArray(data[start])) {\n                parsed = this.parseArrayData(meta, data, start, count);\n            } else if (isObject(data[start])) {\n                parsed = this.parseObjectData(meta, data, start, count);\n            } else {\n                parsed = this.parsePrimitiveData(meta, data, start, count);\n            }\n            const isNotInOrderComparedToPrev = ()=>cur[iAxis] === null || prev && cur[iAxis] < prev[iAxis];\n            for(i = 0; i < count; ++i){\n                meta._parsed[i + start] = cur = parsed[i];\n                if (sorted) {\n                    if (isNotInOrderComparedToPrev()) {\n                        sorted = false;\n                    }\n                    prev = cur;\n                }\n            }\n            meta._sorted = sorted;\n        }\n        if (_stacked) {\n            updateStacks(this, parsed);\n        }\n    }\n parsePrimitiveData(meta, data, start, count) {\n        const { iScale , vScale  } = meta;\n        const iAxis = iScale.axis;\n        const vAxis = vScale.axis;\n        const labels = iScale.getLabels();\n        const singleScale = iScale === vScale;\n        const parsed = new Array(count);\n        let i, ilen, index;\n        for(i = 0, ilen = count; i < ilen; ++i){\n            index = i + start;\n            parsed[i] = {\n                [iAxis]: singleScale || iScale.parse(labels[index], index),\n                [vAxis]: vScale.parse(data[index], index)\n            };\n        }\n        return parsed;\n    }\n parseArrayData(meta, data, start, count) {\n        const { xScale , yScale  } = meta;\n        const parsed = new Array(count);\n        let i, ilen, index, item;\n        for(i = 0, ilen = count; i < ilen; ++i){\n            index = i + start;\n            item = data[index];\n            parsed[i] = {\n                x: xScale.parse(item[0], index),\n                y: yScale.parse(item[1], index)\n            };\n        }\n        return parsed;\n    }\n parseObjectData(meta, data, start, count) {\n        const { xScale , yScale  } = meta;\n        const { xAxisKey ='x' , yAxisKey ='y'  } = this._parsing;\n        const parsed = new Array(count);\n        let i, ilen, index, item;\n        for(i = 0, ilen = count; i < ilen; ++i){\n            index = i + start;\n            item = data[index];\n            parsed[i] = {\n                x: xScale.parse(resolveObjectKey(item, xAxisKey), index),\n                y: yScale.parse(resolveObjectKey(item, yAxisKey), index)\n            };\n        }\n        return parsed;\n    }\n getParsed(index) {\n        return this._cachedMeta._parsed[index];\n    }\n getDataElement(index) {\n        return this._cachedMeta.data[index];\n    }\n applyStack(scale, parsed, mode) {\n        const chart = this.chart;\n        const meta = this._cachedMeta;\n        const value = parsed[scale.axis];\n        const stack = {\n            keys: getSortedDatasetIndices(chart, true),\n            values: parsed._stacks[scale.axis]._visualValues\n        };\n        return applyStack(stack, value, meta.index, {\n            mode\n        });\n    }\n updateRangeFromParsed(range, scale, parsed, stack) {\n        const parsedValue = parsed[scale.axis];\n        let value = parsedValue === null ? NaN : parsedValue;\n        const values = stack && parsed._stacks[scale.axis];\n        if (stack && values) {\n            stack.values = values;\n            value = applyStack(stack, parsedValue, this._cachedMeta.index);\n        }\n        range.min = Math.min(range.min, value);\n        range.max = Math.max(range.max, value);\n    }\n getMinMax(scale, canStack) {\n        const meta = this._cachedMeta;\n        const _parsed = meta._parsed;\n        const sorted = meta._sorted && scale === meta.iScale;\n        const ilen = _parsed.length;\n        const otherScale = this._getOtherScale(scale);\n        const stack = createStack(canStack, meta, this.chart);\n        const range = {\n            min: Number.POSITIVE_INFINITY,\n            max: Number.NEGATIVE_INFINITY\n        };\n        const { min: otherMin , max: otherMax  } = getUserBounds(otherScale);\n        let i, parsed;\n        function _skip() {\n            parsed = _parsed[i];\n            const otherValue = parsed[otherScale.axis];\n            return !isNumberFinite(parsed[scale.axis]) || otherMin > otherValue || otherMax < otherValue;\n        }\n        for(i = 0; i < ilen; ++i){\n            if (_skip()) {\n                continue;\n            }\n            this.updateRangeFromParsed(range, scale, parsed, stack);\n            if (sorted) {\n                break;\n            }\n        }\n        if (sorted) {\n            for(i = ilen - 1; i >= 0; --i){\n                if (_skip()) {\n                    continue;\n                }\n                this.updateRangeFromParsed(range, scale, parsed, stack);\n                break;\n            }\n        }\n        return range;\n    }\n    getAllParsedValues(scale) {\n        const parsed = this._cachedMeta._parsed;\n        const values = [];\n        let i, ilen, value;\n        for(i = 0, ilen = parsed.length; i < ilen; ++i){\n            value = parsed[i][scale.axis];\n            if (isNumberFinite(value)) {\n                values.push(value);\n            }\n        }\n        return values;\n    }\n getMaxOverflow() {\n        return false;\n    }\n getLabelAndValue(index) {\n        const meta = this._cachedMeta;\n        const iScale = meta.iScale;\n        const vScale = meta.vScale;\n        const parsed = this.getParsed(index);\n        return {\n            label: iScale ? '' + iScale.getLabelForValue(parsed[iScale.axis]) : '',\n            value: vScale ? '' + vScale.getLabelForValue(parsed[vScale.axis]) : ''\n        };\n    }\n _update(mode) {\n        const meta = this._cachedMeta;\n        this.update(mode || 'default');\n        meta._clip = toClip(valueOrDefault(this.options.clip, defaultClip(meta.xScale, meta.yScale, this.getMaxOverflow())));\n    }\n update(mode) {}\n    draw() {\n        const ctx = this._ctx;\n        const chart = this.chart;\n        const meta = this._cachedMeta;\n        const elements = meta.data || [];\n        const area = chart.chartArea;\n        const active = [];\n        const start = this._drawStart || 0;\n        const count = this._drawCount || elements.length - start;\n        const drawActiveElementsOnTop = this.options.drawActiveElementsOnTop;\n        let i;\n        if (meta.dataset) {\n            meta.dataset.draw(ctx, area, start, count);\n        }\n        for(i = start; i < start + count; ++i){\n            const element = elements[i];\n            if (element.hidden) {\n                continue;\n            }\n            if (element.active && drawActiveElementsOnTop) {\n                active.push(element);\n            } else {\n                element.draw(ctx, area);\n            }\n        }\n        for(i = 0; i < active.length; ++i){\n            active[i].draw(ctx, area);\n        }\n    }\n getStyle(index, active) {\n        const mode = active ? 'active' : 'default';\n        return index === undefined && this._cachedMeta.dataset ? this.resolveDatasetElementOptions(mode) : this.resolveDataElementOptions(index || 0, mode);\n    }\n getContext(index, active, mode) {\n        const dataset = this.getDataset();\n        let context;\n        if (index >= 0 && index < this._cachedMeta.data.length) {\n            const element = this._cachedMeta.data[index];\n            context = element.$context || (element.$context = createDataContext(this.getContext(), index, element));\n            context.parsed = this.getParsed(index);\n            context.raw = dataset.data[index];\n            context.index = context.dataIndex = index;\n        } else {\n            context = this.$context || (this.$context = createDatasetContext(this.chart.getContext(), this.index));\n            context.dataset = dataset;\n            context.index = context.datasetIndex = this.index;\n        }\n        context.active = !!active;\n        context.mode = mode;\n        return context;\n    }\n resolveDatasetElementOptions(mode) {\n        return this._resolveElementOptions(this.datasetElementType.id, mode);\n    }\n resolveDataElementOptions(index, mode) {\n        return this._resolveElementOptions(this.dataElementType.id, mode, index);\n    }\n _resolveElementOptions(elementType, mode = 'default', index) {\n        const active = mode === 'active';\n        const cache = this._cachedDataOpts;\n        const cacheKey = elementType + '-' + mode;\n        const cached = cache[cacheKey];\n        const sharing = this.enableOptionSharing && defined(index);\n        if (cached) {\n            return cloneIfNotShared(cached, sharing);\n        }\n        const config = this.chart.config;\n        const scopeKeys = config.datasetElementScopeKeys(this._type, elementType);\n        const prefixes = active ? [\n            `${elementType}Hover`,\n            'hover',\n            elementType,\n            ''\n        ] : [\n            elementType,\n            ''\n        ];\n        const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n        const names = Object.keys(defaults.elements[elementType]);\n        const context = ()=>this.getContext(index, active, mode);\n        const values = config.resolveNamedOptions(scopes, names, context, prefixes);\n        if (values.$shared) {\n            values.$shared = sharing;\n            cache[cacheKey] = Object.freeze(cloneIfNotShared(values, sharing));\n        }\n        return values;\n    }\n _resolveAnimations(index, transition, active) {\n        const chart = this.chart;\n        const cache = this._cachedDataOpts;\n        const cacheKey = `animation-${transition}`;\n        const cached = cache[cacheKey];\n        if (cached) {\n            return cached;\n        }\n        let options;\n        if (chart.options.animation !== false) {\n            const config = this.chart.config;\n            const scopeKeys = config.datasetAnimationScopeKeys(this._type, transition);\n            const scopes = config.getOptionScopes(this.getDataset(), scopeKeys);\n            options = config.createResolver(scopes, this.getContext(index, active, transition));\n        }\n        const animations = new Animations(chart, options && options.animations);\n        if (options && options._cacheable) {\n            cache[cacheKey] = Object.freeze(animations);\n        }\n        return animations;\n    }\n getSharedOptions(options) {\n        if (!options.$shared) {\n            return;\n        }\n        return this._sharedOptions || (this._sharedOptions = Object.assign({}, options));\n    }\n includeOptions(mode, sharedOptions) {\n        return !sharedOptions || isDirectUpdateMode(mode) || this.chart._animationsDisabled;\n    }\n _getSharedOptions(start, mode) {\n        const firstOpts = this.resolveDataElementOptions(start, mode);\n        const previouslySharedOptions = this._sharedOptions;\n        const sharedOptions = this.getSharedOptions(firstOpts);\n        const includeOptions = this.includeOptions(mode, sharedOptions) || sharedOptions !== previouslySharedOptions;\n        this.updateSharedOptions(sharedOptions, mode, firstOpts);\n        return {\n            sharedOptions,\n            includeOptions\n        };\n    }\n updateElement(element, index, properties, mode) {\n        if (isDirectUpdateMode(mode)) {\n            Object.assign(element, properties);\n        } else {\n            this._resolveAnimations(index, mode).update(element, properties);\n        }\n    }\n updateSharedOptions(sharedOptions, mode, newOptions) {\n        if (sharedOptions && !isDirectUpdateMode(mode)) {\n            this._resolveAnimations(undefined, mode).update(sharedOptions, newOptions);\n        }\n    }\n _setStyle(element, index, mode, active) {\n        element.active = active;\n        const options = this.getStyle(index, active);\n        this._resolveAnimations(index, mode, active).update(element, {\n            options: !active && this.getSharedOptions(options) || options\n        });\n    }\n    removeHoverStyle(element, datasetIndex, index) {\n        this._setStyle(element, index, 'active', false);\n    }\n    setHoverStyle(element, datasetIndex, index) {\n        this._setStyle(element, index, 'active', true);\n    }\n _removeDatasetHoverStyle() {\n        const element = this._cachedMeta.dataset;\n        if (element) {\n            this._setStyle(element, undefined, 'active', false);\n        }\n    }\n _setDatasetHoverStyle() {\n        const element = this._cachedMeta.dataset;\n        if (element) {\n            this._setStyle(element, undefined, 'active', true);\n        }\n    }\n _resyncElements(resetNewElements) {\n        const data = this._data;\n        const elements = this._cachedMeta.data;\n        for (const [method, arg1, arg2] of this._syncList){\n            this[method](arg1, arg2);\n        }\n        this._syncList = [];\n        const numMeta = elements.length;\n        const numData = data.length;\n        const count = Math.min(numData, numMeta);\n        if (count) {\n            this.parse(0, count);\n        }\n        if (numData > numMeta) {\n            this._insertElements(numMeta, numData - numMeta, resetNewElements);\n        } else if (numData < numMeta) {\n            this._removeElements(numData, numMeta - numData);\n        }\n    }\n _insertElements(start, count, resetNewElements = true) {\n        const meta = this._cachedMeta;\n        const data = meta.data;\n        const end = start + count;\n        let i;\n        const move = (arr)=>{\n            arr.length += count;\n            for(i = arr.length - 1; i >= end; i--){\n                arr[i] = arr[i - count];\n            }\n        };\n        move(data);\n        for(i = start; i < end; ++i){\n            data[i] = new this.dataElementType();\n        }\n        if (this._parsing) {\n            move(meta._parsed);\n        }\n        this.parse(start, count);\n        if (resetNewElements) {\n            this.updateElements(data, start, count, 'reset');\n        }\n    }\n    updateElements(element, start, count, mode) {}\n _removeElements(start, count) {\n        const meta = this._cachedMeta;\n        if (this._parsing) {\n            const removed = meta._parsed.splice(start, count);\n            if (meta._stacked) {\n                clearStacks(meta, removed);\n            }\n        }\n        meta.data.splice(start, count);\n    }\n _sync(args) {\n        if (this._parsing) {\n            this._syncList.push(args);\n        } else {\n            const [method, arg1, arg2] = args;\n            this[method](arg1, arg2);\n        }\n        this.chart._dataChanges.push([\n            this.index,\n            ...args\n        ]);\n    }\n    _onDataPush() {\n        const count = arguments.length;\n        this._sync([\n            '_insertElements',\n            this.getDataset().data.length - count,\n            count\n        ]);\n    }\n    _onDataPop() {\n        this._sync([\n            '_removeElements',\n            this._cachedMeta.data.length - 1,\n            1\n        ]);\n    }\n    _onDataShift() {\n        this._sync([\n            '_removeElements',\n            0,\n            1\n        ]);\n    }\n    _onDataSplice(start, count) {\n        if (count) {\n            this._sync([\n                '_removeElements',\n                start,\n                count\n            ]);\n        }\n        const newCount = arguments.length - 2;\n        if (newCount) {\n            this._sync([\n                '_insertElements',\n                start,\n                newCount\n            ]);\n        }\n    }\n    _onDataUnshift() {\n        this._sync([\n            '_insertElements',\n            0,\n            arguments.length\n        ]);\n    }\n}\n\nfunction getAllScaleValues(scale, type) {\n    if (!scale._cache.$bar) {\n        const visibleMetas = scale.getMatchingVisibleMetas(type);\n        let values = [];\n        for(let i = 0, ilen = visibleMetas.length; i < ilen; i++){\n            values = values.concat(visibleMetas[i].controller.getAllParsedValues(scale));\n        }\n        scale._cache.$bar = _arrayUnique(values.sort((a, b)=>a - b));\n    }\n    return scale._cache.$bar;\n}\n function computeMinSampleSize(meta) {\n    const scale = meta.iScale;\n    const values = getAllScaleValues(scale, meta.type);\n    let min = scale._length;\n    let i, ilen, curr, prev;\n    const updateMinAndPrev = ()=>{\n        if (curr === 32767 || curr === -32768) {\n            return;\n        }\n        if (defined(prev)) {\n            min = Math.min(min, Math.abs(curr - prev) || min);\n        }\n        prev = curr;\n    };\n    for(i = 0, ilen = values.length; i < ilen; ++i){\n        curr = scale.getPixelForValue(values[i]);\n        updateMinAndPrev();\n    }\n    prev = undefined;\n    for(i = 0, ilen = scale.ticks.length; i < ilen; ++i){\n        curr = scale.getPixelForTick(i);\n        updateMinAndPrev();\n    }\n    return min;\n}\n function computeFitCategoryTraits(index, ruler, options, stackCount) {\n    const thickness = options.barThickness;\n    let size, ratio;\n    if (isNullOrUndef(thickness)) {\n        size = ruler.min * options.categoryPercentage;\n        ratio = options.barPercentage;\n    } else {\n        size = thickness * stackCount;\n        ratio = 1;\n    }\n    return {\n        chunk: size / stackCount,\n        ratio,\n        start: ruler.pixels[index] - size / 2\n    };\n}\n function computeFlexCategoryTraits(index, ruler, options, stackCount) {\n    const pixels = ruler.pixels;\n    const curr = pixels[index];\n    let prev = index > 0 ? pixels[index - 1] : null;\n    let next = index < pixels.length - 1 ? pixels[index + 1] : null;\n    const percent = options.categoryPercentage;\n    if (prev === null) {\n        prev = curr - (next === null ? ruler.end - ruler.start : next - curr);\n    }\n    if (next === null) {\n        next = curr + curr - prev;\n    }\n    const start = curr - (curr - Math.min(prev, next)) / 2 * percent;\n    const size = Math.abs(next - prev) / 2 * percent;\n    return {\n        chunk: size / stackCount,\n        ratio: options.barPercentage,\n        start\n    };\n}\nfunction parseFloatBar(entry, item, vScale, i) {\n    const startValue = vScale.parse(entry[0], i);\n    const endValue = vScale.parse(entry[1], i);\n    const min = Math.min(startValue, endValue);\n    const max = Math.max(startValue, endValue);\n    let barStart = min;\n    let barEnd = max;\n    if (Math.abs(min) > Math.abs(max)) {\n        barStart = max;\n        barEnd = min;\n    }\n    item[vScale.axis] = barEnd;\n    item._custom = {\n        barStart,\n        barEnd,\n        start: startValue,\n        end: endValue,\n        min,\n        max\n    };\n}\nfunction parseValue(entry, item, vScale, i) {\n    if (isArray(entry)) {\n        parseFloatBar(entry, item, vScale, i);\n    } else {\n        item[vScale.axis] = vScale.parse(entry, i);\n    }\n    return item;\n}\nfunction parseArrayOrPrimitive(meta, data, start, count) {\n    const iScale = meta.iScale;\n    const vScale = meta.vScale;\n    const labels = iScale.getLabels();\n    const singleScale = iScale === vScale;\n    const parsed = [];\n    let i, ilen, item, entry;\n    for(i = start, ilen = start + count; i < ilen; ++i){\n        entry = data[i];\n        item = {};\n        item[iScale.axis] = singleScale || iScale.parse(labels[i], i);\n        parsed.push(parseValue(entry, item, vScale, i));\n    }\n    return parsed;\n}\nfunction isFloatBar(custom) {\n    return custom && custom.barStart !== undefined && custom.barEnd !== undefined;\n}\nfunction barSign(size, vScale, actualBase) {\n    if (size !== 0) {\n        return sign(size);\n    }\n    return (vScale.isHorizontal() ? 1 : -1) * (vScale.min >= actualBase ? 1 : -1);\n}\nfunction borderProps(properties) {\n    let reverse, start, end, top, bottom;\n    if (properties.horizontal) {\n        reverse = properties.base > properties.x;\n        start = 'left';\n        end = 'right';\n    } else {\n        reverse = properties.base < properties.y;\n        start = 'bottom';\n        end = 'top';\n    }\n    if (reverse) {\n        top = 'end';\n        bottom = 'start';\n    } else {\n        top = 'start';\n        bottom = 'end';\n    }\n    return {\n        start,\n        end,\n        reverse,\n        top,\n        bottom\n    };\n}\nfunction setBorderSkipped(properties, options, stack, index) {\n    let edge = options.borderSkipped;\n    const res = {};\n    if (!edge) {\n        properties.borderSkipped = res;\n        return;\n    }\n    if (edge === true) {\n        properties.borderSkipped = {\n            top: true,\n            right: true,\n            bottom: true,\n            left: true\n        };\n        return;\n    }\n    const { start , end , reverse , top , bottom  } = borderProps(properties);\n    if (edge === 'middle' && stack) {\n        properties.enableBorderRadius = true;\n        if ((stack._top || 0) === index) {\n            edge = top;\n        } else if ((stack._bottom || 0) === index) {\n            edge = bottom;\n        } else {\n            res[parseEdge(bottom, start, end, reverse)] = true;\n            edge = top;\n        }\n    }\n    res[parseEdge(edge, start, end, reverse)] = true;\n    properties.borderSkipped = res;\n}\nfunction parseEdge(edge, a, b, reverse) {\n    if (reverse) {\n        edge = swap(edge, a, b);\n        edge = startEnd(edge, b, a);\n    } else {\n        edge = startEnd(edge, a, b);\n    }\n    return edge;\n}\nfunction swap(orig, v1, v2) {\n    return orig === v1 ? v2 : orig === v2 ? v1 : orig;\n}\nfunction startEnd(v, start, end) {\n    return v === 'start' ? start : v === 'end' ? end : v;\n}\nfunction setInflateAmount(properties, { inflateAmount  }, ratio) {\n    properties.inflateAmount = inflateAmount === 'auto' ? ratio === 1 ? 0.33 : 0 : inflateAmount;\n}\nclass BarController extends DatasetController {\n    static id = 'bar';\n static defaults = {\n        datasetElementType: false,\n        dataElementType: 'bar',\n        categoryPercentage: 0.8,\n        barPercentage: 0.9,\n        grouped: true,\n        animations: {\n            numbers: {\n                type: 'number',\n                properties: [\n                    'x',\n                    'y',\n                    'base',\n                    'width',\n                    'height'\n                ]\n            }\n        }\n    };\n static overrides = {\n        scales: {\n            _index_: {\n                type: 'category',\n                offset: true,\n                grid: {\n                    offset: true\n                }\n            },\n            _value_: {\n                type: 'linear',\n                beginAtZero: true\n            }\n        }\n    };\n parsePrimitiveData(meta, data, start, count) {\n        return parseArrayOrPrimitive(meta, data, start, count);\n    }\n parseArrayData(meta, data, start, count) {\n        return parseArrayOrPrimitive(meta, data, start, count);\n    }\n parseObjectData(meta, data, start, count) {\n        const { iScale , vScale  } = meta;\n        const { xAxisKey ='x' , yAxisKey ='y'  } = this._parsing;\n        const iAxisKey = iScale.axis === 'x' ? xAxisKey : yAxisKey;\n        const vAxisKey = vScale.axis === 'x' ? xAxisKey : yAxisKey;\n        const parsed = [];\n        let i, ilen, item, obj;\n        for(i = start, ilen = start + count; i < ilen; ++i){\n            obj = data[i];\n            item = {};\n            item[iScale.axis] = iScale.parse(resolveObjectKey(obj, iAxisKey), i);\n            parsed.push(parseValue(resolveObjectKey(obj, vAxisKey), item, vScale, i));\n        }\n        return parsed;\n    }\n updateRangeFromParsed(range, scale, parsed, stack) {\n        super.updateRangeFromParsed(range, scale, parsed, stack);\n        const custom = parsed._custom;\n        if (custom && scale === this._cachedMeta.vScale) {\n            range.min = Math.min(range.min, custom.min);\n            range.max = Math.max(range.max, custom.max);\n        }\n    }\n getMaxOverflow() {\n        return 0;\n    }\n getLabelAndValue(index) {\n        const meta = this._cachedMeta;\n        const { iScale , vScale  } = meta;\n        const parsed = this.getParsed(index);\n        const custom = parsed._custom;\n        const value = isFloatBar(custom) ? '[' + custom.start + ', ' + custom.end + ']' : '' + vScale.getLabelForValue(parsed[vScale.axis]);\n        return {\n            label: '' + iScale.getLabelForValue(parsed[iScale.axis]),\n            value\n        };\n    }\n    initialize() {\n        this.enableOptionSharing = true;\n        super.initialize();\n        const meta = this._cachedMeta;\n        meta.stack = this.getDataset().stack;\n    }\n    update(mode) {\n        const meta = this._cachedMeta;\n        this.updateElements(meta.data, 0, meta.data.length, mode);\n    }\n    updateElements(bars, start, count, mode) {\n        const reset = mode === 'reset';\n        const { index , _cachedMeta: { vScale  }  } = this;\n        const base = vScale.getBasePixel();\n        const horizontal = vScale.isHorizontal();\n        const ruler = this._getRuler();\n        const { sharedOptions , includeOptions  } = this._getSharedOptions(start, mode);\n        for(let i = start; i < start + count; i++){\n            const parsed = this.getParsed(i);\n            const vpixels = reset || isNullOrUndef(parsed[vScale.axis]) ? {\n                base,\n                head: base\n            } : this._calculateBarValuePixels(i);\n            const ipixels = this._calculateBarIndexPixels(i, ruler);\n            const stack = (parsed._stacks || {})[vScale.axis];\n            const properties = {\n                horizontal,\n                base: vpixels.base,\n                enableBorderRadius: !stack || isFloatBar(parsed._custom) || index === stack._top || index === stack._bottom,\n                x: horizontal ? vpixels.head : ipixels.center,\n                y: horizontal ? ipixels.center : vpixels.head,\n                height: horizontal ? ipixels.size : Math.abs(vpixels.size),\n                width: horizontal ? Math.abs(vpixels.size) : ipixels.size\n            };\n            if (includeOptions) {\n                properties.options = sharedOptions || this.resolveDataElementOptions(i, bars[i].active ? 'active' : mode);\n            }\n            const options = properties.options || bars[i].options;\n            setBorderSkipped(properties, options, stack, index);\n            setInflateAmount(properties, options, ruler.ratio);\n            this.updateElement(bars[i], i, properties, mode);\n        }\n    }\n _getStacks(last, dataIndex) {\n        const { iScale  } = this._cachedMeta;\n        const metasets = iScale.getMatchingVisibleMetas(this._type).filter((meta)=>meta.controller.options.grouped);\n        const stacked = iScale.options.stacked;\n        const stacks = [];\n        const currentParsed = this._cachedMeta.controller.getParsed(dataIndex);\n        const iScaleValue = currentParsed && currentParsed[iScale.axis];\n        const skipNull = (meta)=>{\n            const parsed = meta._parsed.find((item)=>item[iScale.axis] === iScaleValue);\n            const val = parsed && parsed[meta.vScale.axis];\n            if (isNullOrUndef(val) || isNaN(val)) {\n                return true;\n            }\n        };\n        for (const meta of metasets){\n            if (dataIndex !== undefined && skipNull(meta)) {\n                continue;\n            }\n            if (stacked === false || stacks.indexOf(meta.stack) === -1 || stacked === undefined && meta.stack === undefined) {\n                stacks.push(meta.stack);\n            }\n            if (meta.index === last) {\n                break;\n            }\n        }\n        if (!stacks.length) {\n            stacks.push(undefined);\n        }\n        return stacks;\n    }\n _getStackCount(index) {\n        return this._getStacks(undefined, index).length;\n    }\n _getStackIndex(datasetIndex, name, dataIndex) {\n        const stacks = this._getStacks(datasetIndex, dataIndex);\n        const index = name !== undefined ? stacks.indexOf(name) : -1;\n        return index === -1 ? stacks.length - 1 : index;\n    }\n _getRuler() {\n        const opts = this.options;\n        const meta = this._cachedMeta;\n        const iScale = meta.iScale;\n        const pixels = [];\n        let i, ilen;\n        for(i = 0, ilen = meta.data.length; i < ilen; ++i){\n            pixels.push(iScale.getPixelForValue(this.getParsed(i)[iScale.axis], i));\n        }\n        const barThickness = opts.barThickness;\n        const min = barThickness || computeMinSampleSize(meta);\n        return {\n            min,\n            pixels,\n            start: iScale._startPixel,\n            end: iScale._endPixel,\n            stackCount: this._getStackCount(),\n            scale: iScale,\n            grouped: opts.grouped,\n            ratio: barThickness ? 1 : opts.categoryPercentage * opts.barPercentage\n        };\n    }\n _calculateBarValuePixels(index) {\n        const { _cachedMeta: { vScale , _stacked , index: datasetIndex  } , options: { base: baseValue , minBarLength  }  } = this;\n        const actualBase = baseValue || 0;\n        const parsed = this.getParsed(index);\n        const custom = parsed._custom;\n        const floating = isFloatBar(custom);\n        let value = parsed[vScale.axis];\n        let start = 0;\n        let length = _stacked ? this.applyStack(vScale, parsed, _stacked) : value;\n        let head, size;\n        if (length !== value) {\n            start = length - value;\n            length = value;\n        }\n        if (floating) {\n            value = custom.barStart;\n            length = custom.barEnd - custom.barStart;\n            if (value !== 0 && sign(value) !== sign(custom.barEnd)) {\n                start = 0;\n            }\n            start += value;\n        }\n        const startValue = !isNullOrUndef(baseValue) && !floating ? baseValue : start;\n        let base = vScale.getPixelForValue(startValue);\n        if (this.chart.getDataVisibility(index)) {\n            head = vScale.getPixelForValue(start + length);\n        } else {\n            head = base;\n        }\n        size = head - base;\n        if (Math.abs(size) < minBarLength) {\n            size = barSign(size, vScale, actualBase) * minBarLength;\n            if (value === actualBase) {\n                base -= size / 2;\n            }\n            const startPixel = vScale.getPixelForDecimal(0);\n            const endPixel = vScale.getPixelForDecimal(1);\n            const min = Math.min(startPixel, endPixel);\n            const max = Math.max(startPixel, endPixel);\n            base = Math.max(Math.min(base, max), min);\n            head = base + size;\n            if (_stacked && !floating) {\n                parsed._stacks[vScale.axis]._visualValues[datasetIndex] = vScale.getValueForPixel(head) - vScale.getValueForPixel(base);\n            }\n        }\n        if (base === vScale.getPixelForValue(actualBase)) {\n            const halfGrid = sign(size) * vScale.getLineWidthForValue(actualBase) / 2;\n            base += halfGrid;\n            size -= halfGrid;\n        }\n        return {\n            size,\n            base,\n            head,\n            center: head + size / 2\n        };\n    }\n _calculateBarIndexPixels(index, ruler) {\n        const scale = ruler.scale;\n        const options = this.options;\n        const skipNull = options.skipNull;\n        const maxBarThickness = valueOrDefault(options.maxBarThickness, Infinity);\n        let center, size;\n        if (ruler.grouped) {\n            const stackCount = skipNull ? this._getStackCount(index) : ruler.stackCount;\n            const range = options.barThickness === 'flex' ? computeFlexCategoryTraits(index, ruler, options, stackCount) : computeFitCategoryTraits(index, ruler, options, stackCount);\n            const stackIndex = this._getStackIndex(this.index, this._cachedMeta.stack, skipNull ? index : undefined);\n            center = range.start + range.chunk * stackIndex + range.chunk / 2;\n            size = Math.min(maxBarThickness, range.chunk * range.ratio);\n        } else {\n            center = scale.getPixelForValue(this.getParsed(index)[scale.axis], index);\n            size = Math.min(maxBarThickness, ruler.min * ruler.ratio);\n        }\n        return {\n            base: center - size / 2,\n            head: center + size / 2,\n            center,\n            size\n        };\n    }\n    draw() {\n        const meta = this._cachedMeta;\n        const vScale = meta.vScale;\n        const rects = meta.data;\n        const ilen = rects.length;\n        let i = 0;\n        for(; i < ilen; ++i){\n            if (this.getParsed(i)[vScale.axis] !== null && !rects[i].hidden) {\n                rects[i].draw(this._ctx);\n            }\n        }\n    }\n}\n\nclass BubbleController extends DatasetController {\n    static id = 'bubble';\n static defaults = {\n        datasetElementType: false,\n        dataElementType: 'point',\n        animations: {\n            numbers: {\n                type: 'number',\n                properties: [\n                    'x',\n                    'y',\n                    'borderWidth',\n                    'radius'\n                ]\n            }\n        }\n    };\n static overrides = {\n        scales: {\n            x: {\n                type: 'linear'\n            },\n            y: {\n                type: 'linear'\n            }\n        }\n    };\n    initialize() {\n        this.enableOptionSharing = true;\n        super.initialize();\n    }\n parsePrimitiveData(meta, data, start, count) {\n        const parsed = super.parsePrimitiveData(meta, data, start, count);\n        for(let i = 0; i < parsed.length; i++){\n            parsed[i]._custom = this.resolveDataElementOptions(i + start).radius;\n        }\n        return parsed;\n    }\n parseArrayData(meta, data, start, count) {\n        const parsed = super.parseArrayData(meta, data, start, count);\n        for(let i = 0; i < parsed.length; i++){\n            const item = data[start + i];\n            parsed[i]._custom = valueOrDefault(item[2], this.resolveDataElementOptions(i + start).radius);\n        }\n        return parsed;\n    }\n parseObjectData(meta, data, start, count) {\n        const parsed = super.parseObjectData(meta, data, start, count);\n        for(let i = 0; i < parsed.length; i++){\n            const item = data[start + i];\n            parsed[i]._custom = valueOrDefault(item && item.r && +item.r, this.resolveDataElementOptions(i + start).radius);\n        }\n        return parsed;\n    }\n getMaxOverflow() {\n        const data = this._cachedMeta.data;\n        let max = 0;\n        for(let i = data.length - 1; i >= 0; --i){\n            max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n        }\n        return max > 0 && max;\n    }\n getLabelAndValue(index) {\n        const meta = this._cachedMeta;\n        const labels = this.chart.data.labels || [];\n        const { xScale , yScale  } = meta;\n        const parsed = this.getParsed(index);\n        const x = xScale.getLabelForValue(parsed.x);\n        const y = yScale.getLabelForValue(parsed.y);\n        const r = parsed._custom;\n        return {\n            label: labels[index] || '',\n            value: '(' + x + ', ' + y + (r ? ', ' + r : '') + ')'\n        };\n    }\n    update(mode) {\n        const points = this._cachedMeta.data;\n        this.updateElements(points, 0, points.length, mode);\n    }\n    updateElements(points, start, count, mode) {\n        const reset = mode === 'reset';\n        const { iScale , vScale  } = this._cachedMeta;\n        const { sharedOptions , includeOptions  } = this._getSharedOptions(start, mode);\n        const iAxis = iScale.axis;\n        const vAxis = vScale.axis;\n        for(let i = start; i < start + count; i++){\n            const point = points[i];\n            const parsed = !reset && this.getParsed(i);\n            const properties = {};\n            const iPixel = properties[iAxis] = reset ? iScale.getPixelForDecimal(0.5) : iScale.getPixelForValue(parsed[iAxis]);\n            const vPixel = properties[vAxis] = reset ? vScale.getBasePixel() : vScale.getPixelForValue(parsed[vAxis]);\n            properties.skip = isNaN(iPixel) || isNaN(vPixel);\n            if (includeOptions) {\n                properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n                if (reset) {\n                    properties.options.radius = 0;\n                }\n            }\n            this.updateElement(point, i, properties, mode);\n        }\n    }\n resolveDataElementOptions(index, mode) {\n        const parsed = this.getParsed(index);\n        let values = super.resolveDataElementOptions(index, mode);\n        if (values.$shared) {\n            values = Object.assign({}, values, {\n                $shared: false\n            });\n        }\n        const radius = values.radius;\n        if (mode !== 'active') {\n            values.radius = 0;\n        }\n        values.radius += valueOrDefault(parsed && parsed._custom, radius);\n        return values;\n    }\n}\n\nfunction getRatioAndOffset(rotation, circumference, cutout) {\n    let ratioX = 1;\n    let ratioY = 1;\n    let offsetX = 0;\n    let offsetY = 0;\n    if (circumference < TAU) {\n        const startAngle = rotation;\n        const endAngle = startAngle + circumference;\n        const startX = Math.cos(startAngle);\n        const startY = Math.sin(startAngle);\n        const endX = Math.cos(endAngle);\n        const endY = Math.sin(endAngle);\n        const calcMax = (angle, a, b)=>_angleBetween(angle, startAngle, endAngle, true) ? 1 : Math.max(a, a * cutout, b, b * cutout);\n        const calcMin = (angle, a, b)=>_angleBetween(angle, startAngle, endAngle, true) ? -1 : Math.min(a, a * cutout, b, b * cutout);\n        const maxX = calcMax(0, startX, endX);\n        const maxY = calcMax(HALF_PI, startY, endY);\n        const minX = calcMin(PI, startX, endX);\n        const minY = calcMin(PI + HALF_PI, startY, endY);\n        ratioX = (maxX - minX) / 2;\n        ratioY = (maxY - minY) / 2;\n        offsetX = -(maxX + minX) / 2;\n        offsetY = -(maxY + minY) / 2;\n    }\n    return {\n        ratioX,\n        ratioY,\n        offsetX,\n        offsetY\n    };\n}\nclass DoughnutController extends DatasetController {\n    static id = 'doughnut';\n static defaults = {\n        datasetElementType: false,\n        dataElementType: 'arc',\n        animation: {\n            animateRotate: true,\n            animateScale: false\n        },\n        animations: {\n            numbers: {\n                type: 'number',\n                properties: [\n                    'circumference',\n                    'endAngle',\n                    'innerRadius',\n                    'outerRadius',\n                    'startAngle',\n                    'x',\n                    'y',\n                    'offset',\n                    'borderWidth',\n                    'spacing'\n                ]\n            }\n        },\n        cutout: '50%',\n        rotation: 0,\n        circumference: 360,\n        radius: '100%',\n        spacing: 0,\n        indexAxis: 'r'\n    };\n    static descriptors = {\n        _scriptable: (name)=>name !== 'spacing',\n        _indexable: (name)=>name !== 'spacing' && !name.startsWith('borderDash') && !name.startsWith('hoverBorderDash')\n    };\n static overrides = {\n        aspectRatio: 1,\n        plugins: {\n            legend: {\n                labels: {\n                    generateLabels (chart) {\n                        const data = chart.data;\n                        if (data.labels.length && data.datasets.length) {\n                            const { labels: { pointStyle , color  }  } = chart.legend.options;\n                            return data.labels.map((label, i)=>{\n                                const meta = chart.getDatasetMeta(0);\n                                const style = meta.controller.getStyle(i);\n                                return {\n                                    text: label,\n                                    fillStyle: style.backgroundColor,\n                                    strokeStyle: style.borderColor,\n                                    fontColor: color,\n                                    lineWidth: style.borderWidth,\n                                    pointStyle: pointStyle,\n                                    hidden: !chart.getDataVisibility(i),\n                                    index: i\n                                };\n                            });\n                        }\n                        return [];\n                    }\n                },\n                onClick (e, legendItem, legend) {\n                    legend.chart.toggleDataVisibility(legendItem.index);\n                    legend.chart.update();\n                }\n            }\n        }\n    };\n    constructor(chart, datasetIndex){\n        super(chart, datasetIndex);\n        this.enableOptionSharing = true;\n        this.innerRadius = undefined;\n        this.outerRadius = undefined;\n        this.offsetX = undefined;\n        this.offsetY = undefined;\n    }\n    linkScales() {}\n parse(start, count) {\n        const data = this.getDataset().data;\n        const meta = this._cachedMeta;\n        if (this._parsing === false) {\n            meta._parsed = data;\n        } else {\n            let getter = (i)=>+data[i];\n            if (isObject(data[start])) {\n                const { key ='value'  } = this._parsing;\n                getter = (i)=>+resolveObjectKey(data[i], key);\n            }\n            let i, ilen;\n            for(i = start, ilen = start + count; i < ilen; ++i){\n                meta._parsed[i] = getter(i);\n            }\n        }\n    }\n _getRotation() {\n        return toRadians(this.options.rotation - 90);\n    }\n _getCircumference() {\n        return toRadians(this.options.circumference);\n    }\n _getRotationExtents() {\n        let min = TAU;\n        let max = -TAU;\n        for(let i = 0; i < this.chart.data.datasets.length; ++i){\n            if (this.chart.isDatasetVisible(i) && this.chart.getDatasetMeta(i).type === this._type) {\n                const controller = this.chart.getDatasetMeta(i).controller;\n                const rotation = controller._getRotation();\n                const circumference = controller._getCircumference();\n                min = Math.min(min, rotation);\n                max = Math.max(max, rotation + circumference);\n            }\n        }\n        return {\n            rotation: min,\n            circumference: max - min\n        };\n    }\n update(mode) {\n        const chart = this.chart;\n        const { chartArea  } = chart;\n        const meta = this._cachedMeta;\n        const arcs = meta.data;\n        const spacing = this.getMaxBorderWidth() + this.getMaxOffset(arcs) + this.options.spacing;\n        const maxSize = Math.max((Math.min(chartArea.width, chartArea.height) - spacing) / 2, 0);\n        const cutout = Math.min(toPercentage(this.options.cutout, maxSize), 1);\n        const chartWeight = this._getRingWeight(this.index);\n        const { circumference , rotation  } = this._getRotationExtents();\n        const { ratioX , ratioY , offsetX , offsetY  } = getRatioAndOffset(rotation, circumference, cutout);\n        const maxWidth = (chartArea.width - spacing) / ratioX;\n        const maxHeight = (chartArea.height - spacing) / ratioY;\n        const maxRadius = Math.max(Math.min(maxWidth, maxHeight) / 2, 0);\n        const outerRadius = toDimension(this.options.radius, maxRadius);\n        const innerRadius = Math.max(outerRadius * cutout, 0);\n        const radiusLength = (outerRadius - innerRadius) / this._getVisibleDatasetWeightTotal();\n        this.offsetX = offsetX * outerRadius;\n        this.offsetY = offsetY * outerRadius;\n        meta.total = this.calculateTotal();\n        this.outerRadius = outerRadius - radiusLength * this._getRingWeightOffset(this.index);\n        this.innerRadius = Math.max(this.outerRadius - radiusLength * chartWeight, 0);\n        this.updateElements(arcs, 0, arcs.length, mode);\n    }\n _circumference(i, reset) {\n        const opts = this.options;\n        const meta = this._cachedMeta;\n        const circumference = this._getCircumference();\n        if (reset && opts.animation.animateRotate || !this.chart.getDataVisibility(i) || meta._parsed[i] === null || meta.data[i].hidden) {\n            return 0;\n        }\n        return this.calculateCircumference(meta._parsed[i] * circumference / TAU);\n    }\n    updateElements(arcs, start, count, mode) {\n        const reset = mode === 'reset';\n        const chart = this.chart;\n        const chartArea = chart.chartArea;\n        const opts = chart.options;\n        const animationOpts = opts.animation;\n        const centerX = (chartArea.left + chartArea.right) / 2;\n        const centerY = (chartArea.top + chartArea.bottom) / 2;\n        const animateScale = reset && animationOpts.animateScale;\n        const innerRadius = animateScale ? 0 : this.innerRadius;\n        const outerRadius = animateScale ? 0 : this.outerRadius;\n        const { sharedOptions , includeOptions  } = this._getSharedOptions(start, mode);\n        let startAngle = this._getRotation();\n        let i;\n        for(i = 0; i < start; ++i){\n            startAngle += this._circumference(i, reset);\n        }\n        for(i = start; i < start + count; ++i){\n            const circumference = this._circumference(i, reset);\n            const arc = arcs[i];\n            const properties = {\n                x: centerX + this.offsetX,\n                y: centerY + this.offsetY,\n                startAngle,\n                endAngle: startAngle + circumference,\n                circumference,\n                outerRadius,\n                innerRadius\n            };\n            if (includeOptions) {\n                properties.options = sharedOptions || this.resolveDataElementOptions(i, arc.active ? 'active' : mode);\n            }\n            startAngle += circumference;\n            this.updateElement(arc, i, properties, mode);\n        }\n    }\n    calculateTotal() {\n        const meta = this._cachedMeta;\n        const metaData = meta.data;\n        let total = 0;\n        let i;\n        for(i = 0; i < metaData.length; i++){\n            const value = meta._parsed[i];\n            if (value !== null && !isNaN(value) && this.chart.getDataVisibility(i) && !metaData[i].hidden) {\n                total += Math.abs(value);\n            }\n        }\n        return total;\n    }\n    calculateCircumference(value) {\n        const total = this._cachedMeta.total;\n        if (total > 0 && !isNaN(value)) {\n            return TAU * (Math.abs(value) / total);\n        }\n        return 0;\n    }\n    getLabelAndValue(index) {\n        const meta = this._cachedMeta;\n        const chart = this.chart;\n        const labels = chart.data.labels || [];\n        const value = formatNumber(meta._parsed[index], chart.options.locale);\n        return {\n            label: labels[index] || '',\n            value\n        };\n    }\n    getMaxBorderWidth(arcs) {\n        let max = 0;\n        const chart = this.chart;\n        let i, ilen, meta, controller, options;\n        if (!arcs) {\n            for(i = 0, ilen = chart.data.datasets.length; i < ilen; ++i){\n                if (chart.isDatasetVisible(i)) {\n                    meta = chart.getDatasetMeta(i);\n                    arcs = meta.data;\n                    controller = meta.controller;\n                    break;\n                }\n            }\n        }\n        if (!arcs) {\n            return 0;\n        }\n        for(i = 0, ilen = arcs.length; i < ilen; ++i){\n            options = controller.resolveDataElementOptions(i);\n            if (options.borderAlign !== 'inner') {\n                max = Math.max(max, options.borderWidth || 0, options.hoverBorderWidth || 0);\n            }\n        }\n        return max;\n    }\n    getMaxOffset(arcs) {\n        let max = 0;\n        for(let i = 0, ilen = arcs.length; i < ilen; ++i){\n            const options = this.resolveDataElementOptions(i);\n            max = Math.max(max, options.offset || 0, options.hoverOffset || 0);\n        }\n        return max;\n    }\n _getRingWeightOffset(datasetIndex) {\n        let ringWeightOffset = 0;\n        for(let i = 0; i < datasetIndex; ++i){\n            if (this.chart.isDatasetVisible(i)) {\n                ringWeightOffset += this._getRingWeight(i);\n            }\n        }\n        return ringWeightOffset;\n    }\n _getRingWeight(datasetIndex) {\n        return Math.max(valueOrDefault(this.chart.data.datasets[datasetIndex].weight, 1), 0);\n    }\n _getVisibleDatasetWeightTotal() {\n        return this._getRingWeightOffset(this.chart.data.datasets.length) || 1;\n    }\n}\n\nclass LineController extends DatasetController {\n    static id = 'line';\n static defaults = {\n        datasetElementType: 'line',\n        dataElementType: 'point',\n        showLine: true,\n        spanGaps: false\n    };\n static overrides = {\n        scales: {\n            _index_: {\n                type: 'category'\n            },\n            _value_: {\n                type: 'linear'\n            }\n        }\n    };\n    initialize() {\n        this.enableOptionSharing = true;\n        this.supportsDecimation = true;\n        super.initialize();\n    }\n    update(mode) {\n        const meta = this._cachedMeta;\n        const { dataset: line , data: points = [] , _dataset  } = meta;\n        const animationsDisabled = this.chart._animationsDisabled;\n        let { start , count  } = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n        this._drawStart = start;\n        this._drawCount = count;\n        if (_scaleRangesChanged(meta)) {\n            start = 0;\n            count = points.length;\n        }\n        line._chart = this.chart;\n        line._datasetIndex = this.index;\n        line._decimated = !!_dataset._decimated;\n        line.points = points;\n        const options = this.resolveDatasetElementOptions(mode);\n        if (!this.options.showLine) {\n            options.borderWidth = 0;\n        }\n        options.segment = this.options.segment;\n        this.updateElement(line, undefined, {\n            animated: !animationsDisabled,\n            options\n        }, mode);\n        this.updateElements(points, start, count, mode);\n    }\n    updateElements(points, start, count, mode) {\n        const reset = mode === 'reset';\n        const { iScale , vScale , _stacked , _dataset  } = this._cachedMeta;\n        const { sharedOptions , includeOptions  } = this._getSharedOptions(start, mode);\n        const iAxis = iScale.axis;\n        const vAxis = vScale.axis;\n        const { spanGaps , segment  } = this.options;\n        const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n        const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n        const end = start + count;\n        const pointsCount = points.length;\n        let prevParsed = start > 0 && this.getParsed(start - 1);\n        for(let i = 0; i < pointsCount; ++i){\n            const point = points[i];\n            const properties = directUpdate ? point : {};\n            if (i < start || i >= end) {\n                properties.skip = true;\n                continue;\n            }\n            const parsed = this.getParsed(i);\n            const nullData = isNullOrUndef(parsed[vAxis]);\n            const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n            const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n            properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n            properties.stop = i > 0 && Math.abs(parsed[iAxis] - prevParsed[iAxis]) > maxGapLength;\n            if (segment) {\n                properties.parsed = parsed;\n                properties.raw = _dataset.data[i];\n            }\n            if (includeOptions) {\n                properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n            }\n            if (!directUpdate) {\n                this.updateElement(point, i, properties, mode);\n            }\n            prevParsed = parsed;\n        }\n    }\n getMaxOverflow() {\n        const meta = this._cachedMeta;\n        const dataset = meta.dataset;\n        const border = dataset.options && dataset.options.borderWidth || 0;\n        const data = meta.data || [];\n        if (!data.length) {\n            return border;\n        }\n        const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n        const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n        return Math.max(border, firstPoint, lastPoint) / 2;\n    }\n    draw() {\n        const meta = this._cachedMeta;\n        meta.dataset.updateControlPoints(this.chart.chartArea, meta.iScale.axis);\n        super.draw();\n    }\n}\n\nclass PolarAreaController extends DatasetController {\n    static id = 'polarArea';\n static defaults = {\n        dataElementType: 'arc',\n        animation: {\n            animateRotate: true,\n            animateScale: true\n        },\n        animations: {\n            numbers: {\n                type: 'number',\n                properties: [\n                    'x',\n                    'y',\n                    'startAngle',\n                    'endAngle',\n                    'innerRadius',\n                    'outerRadius'\n                ]\n            }\n        },\n        indexAxis: 'r',\n        startAngle: 0\n    };\n static overrides = {\n        aspectRatio: 1,\n        plugins: {\n            legend: {\n                labels: {\n                    generateLabels (chart) {\n                        const data = chart.data;\n                        if (data.labels.length && data.datasets.length) {\n                            const { labels: { pointStyle , color  }  } = chart.legend.options;\n                            return data.labels.map((label, i)=>{\n                                const meta = chart.getDatasetMeta(0);\n                                const style = meta.controller.getStyle(i);\n                                return {\n                                    text: label,\n                                    fillStyle: style.backgroundColor,\n                                    strokeStyle: style.borderColor,\n                                    fontColor: color,\n                                    lineWidth: style.borderWidth,\n                                    pointStyle: pointStyle,\n                                    hidden: !chart.getDataVisibility(i),\n                                    index: i\n                                };\n                            });\n                        }\n                        return [];\n                    }\n                },\n                onClick (e, legendItem, legend) {\n                    legend.chart.toggleDataVisibility(legendItem.index);\n                    legend.chart.update();\n                }\n            }\n        },\n        scales: {\n            r: {\n                type: 'radialLinear',\n                angleLines: {\n                    display: false\n                },\n                beginAtZero: true,\n                grid: {\n                    circular: true\n                },\n                pointLabels: {\n                    display: false\n                },\n                startAngle: 0\n            }\n        }\n    };\n    constructor(chart, datasetIndex){\n        super(chart, datasetIndex);\n        this.innerRadius = undefined;\n        this.outerRadius = undefined;\n    }\n    getLabelAndValue(index) {\n        const meta = this._cachedMeta;\n        const chart = this.chart;\n        const labels = chart.data.labels || [];\n        const value = formatNumber(meta._parsed[index].r, chart.options.locale);\n        return {\n            label: labels[index] || '',\n            value\n        };\n    }\n    parseObjectData(meta, data, start, count) {\n        return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n    }\n    update(mode) {\n        const arcs = this._cachedMeta.data;\n        this._updateRadius();\n        this.updateElements(arcs, 0, arcs.length, mode);\n    }\n getMinMax() {\n        const meta = this._cachedMeta;\n        const range = {\n            min: Number.POSITIVE_INFINITY,\n            max: Number.NEGATIVE_INFINITY\n        };\n        meta.data.forEach((element, index)=>{\n            const parsed = this.getParsed(index).r;\n            if (!isNaN(parsed) && this.chart.getDataVisibility(index)) {\n                if (parsed < range.min) {\n                    range.min = parsed;\n                }\n                if (parsed > range.max) {\n                    range.max = parsed;\n                }\n            }\n        });\n        return range;\n    }\n _updateRadius() {\n        const chart = this.chart;\n        const chartArea = chart.chartArea;\n        const opts = chart.options;\n        const minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top);\n        const outerRadius = Math.max(minSize / 2, 0);\n        const innerRadius = Math.max(opts.cutoutPercentage ? outerRadius / 100 * opts.cutoutPercentage : 1, 0);\n        const radiusLength = (outerRadius - innerRadius) / chart.getVisibleDatasetCount();\n        this.outerRadius = outerRadius - radiusLength * this.index;\n        this.innerRadius = this.outerRadius - radiusLength;\n    }\n    updateElements(arcs, start, count, mode) {\n        const reset = mode === 'reset';\n        const chart = this.chart;\n        const opts = chart.options;\n        const animationOpts = opts.animation;\n        const scale = this._cachedMeta.rScale;\n        const centerX = scale.xCenter;\n        const centerY = scale.yCenter;\n        const datasetStartAngle = scale.getIndexAngle(0) - 0.5 * PI;\n        let angle = datasetStartAngle;\n        let i;\n        const defaultAngle = 360 / this.countVisibleElements();\n        for(i = 0; i < start; ++i){\n            angle += this._computeAngle(i, mode, defaultAngle);\n        }\n        for(i = start; i < start + count; i++){\n            const arc = arcs[i];\n            let startAngle = angle;\n            let endAngle = angle + this._computeAngle(i, mode, defaultAngle);\n            let outerRadius = chart.getDataVisibility(i) ? scale.getDistanceFromCenterForValue(this.getParsed(i).r) : 0;\n            angle = endAngle;\n            if (reset) {\n                if (animationOpts.animateScale) {\n                    outerRadius = 0;\n                }\n                if (animationOpts.animateRotate) {\n                    startAngle = endAngle = datasetStartAngle;\n                }\n            }\n            const properties = {\n                x: centerX,\n                y: centerY,\n                innerRadius: 0,\n                outerRadius,\n                startAngle,\n                endAngle,\n                options: this.resolveDataElementOptions(i, arc.active ? 'active' : mode)\n            };\n            this.updateElement(arc, i, properties, mode);\n        }\n    }\n    countVisibleElements() {\n        const meta = this._cachedMeta;\n        let count = 0;\n        meta.data.forEach((element, index)=>{\n            if (!isNaN(this.getParsed(index).r) && this.chart.getDataVisibility(index)) {\n                count++;\n            }\n        });\n        return count;\n    }\n _computeAngle(index, mode, defaultAngle) {\n        return this.chart.getDataVisibility(index) ? toRadians(this.resolveDataElementOptions(index, mode).angle || defaultAngle) : 0;\n    }\n}\n\nclass PieController extends DoughnutController {\n    static id = 'pie';\n static defaults = {\n        cutout: 0,\n        rotation: 0,\n        circumference: 360,\n        radius: '100%'\n    };\n}\n\nclass RadarController extends DatasetController {\n    static id = 'radar';\n static defaults = {\n        datasetElementType: 'line',\n        dataElementType: 'point',\n        indexAxis: 'r',\n        showLine: true,\n        elements: {\n            line: {\n                fill: 'start'\n            }\n        }\n    };\n static overrides = {\n        aspectRatio: 1,\n        scales: {\n            r: {\n                type: 'radialLinear'\n            }\n        }\n    };\n getLabelAndValue(index) {\n        const vScale = this._cachedMeta.vScale;\n        const parsed = this.getParsed(index);\n        return {\n            label: vScale.getLabels()[index],\n            value: '' + vScale.getLabelForValue(parsed[vScale.axis])\n        };\n    }\n    parseObjectData(meta, data, start, count) {\n        return _parseObjectDataRadialScale.bind(this)(meta, data, start, count);\n    }\n    update(mode) {\n        const meta = this._cachedMeta;\n        const line = meta.dataset;\n        const points = meta.data || [];\n        const labels = meta.iScale.getLabels();\n        line.points = points;\n        if (mode !== 'resize') {\n            const options = this.resolveDatasetElementOptions(mode);\n            if (!this.options.showLine) {\n                options.borderWidth = 0;\n            }\n            const properties = {\n                _loop: true,\n                _fullLoop: labels.length === points.length,\n                options\n            };\n            this.updateElement(line, undefined, properties, mode);\n        }\n        this.updateElements(points, 0, points.length, mode);\n    }\n    updateElements(points, start, count, mode) {\n        const scale = this._cachedMeta.rScale;\n        const reset = mode === 'reset';\n        for(let i = start; i < start + count; i++){\n            const point = points[i];\n            const options = this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n            const pointPosition = scale.getPointPositionForValue(i, this.getParsed(i).r);\n            const x = reset ? scale.xCenter : pointPosition.x;\n            const y = reset ? scale.yCenter : pointPosition.y;\n            const properties = {\n                x,\n                y,\n                angle: pointPosition.angle,\n                skip: isNaN(x) || isNaN(y),\n                options\n            };\n            this.updateElement(point, i, properties, mode);\n        }\n    }\n}\n\nclass ScatterController extends DatasetController {\n    static id = 'scatter';\n static defaults = {\n        datasetElementType: false,\n        dataElementType: 'point',\n        showLine: false,\n        fill: false\n    };\n static overrides = {\n        interaction: {\n            mode: 'point'\n        },\n        scales: {\n            x: {\n                type: 'linear'\n            },\n            y: {\n                type: 'linear'\n            }\n        }\n    };\n getLabelAndValue(index) {\n        const meta = this._cachedMeta;\n        const labels = this.chart.data.labels || [];\n        const { xScale , yScale  } = meta;\n        const parsed = this.getParsed(index);\n        const x = xScale.getLabelForValue(parsed.x);\n        const y = yScale.getLabelForValue(parsed.y);\n        return {\n            label: labels[index] || '',\n            value: '(' + x + ', ' + y + ')'\n        };\n    }\n    update(mode) {\n        const meta = this._cachedMeta;\n        const { data: points = []  } = meta;\n        const animationsDisabled = this.chart._animationsDisabled;\n        let { start , count  } = _getStartAndCountOfVisiblePoints(meta, points, animationsDisabled);\n        this._drawStart = start;\n        this._drawCount = count;\n        if (_scaleRangesChanged(meta)) {\n            start = 0;\n            count = points.length;\n        }\n        if (this.options.showLine) {\n            if (!this.datasetElementType) {\n                this.addElements();\n            }\n            const { dataset: line , _dataset  } = meta;\n            line._chart = this.chart;\n            line._datasetIndex = this.index;\n            line._decimated = !!_dataset._decimated;\n            line.points = points;\n            const options = this.resolveDatasetElementOptions(mode);\n            options.segment = this.options.segment;\n            this.updateElement(line, undefined, {\n                animated: !animationsDisabled,\n                options\n            }, mode);\n        } else if (this.datasetElementType) {\n            delete meta.dataset;\n            this.datasetElementType = false;\n        }\n        this.updateElements(points, start, count, mode);\n    }\n    addElements() {\n        const { showLine  } = this.options;\n        if (!this.datasetElementType && showLine) {\n            this.datasetElementType = this.chart.registry.getElement('line');\n        }\n        super.addElements();\n    }\n    updateElements(points, start, count, mode) {\n        const reset = mode === 'reset';\n        const { iScale , vScale , _stacked , _dataset  } = this._cachedMeta;\n        const firstOpts = this.resolveDataElementOptions(start, mode);\n        const sharedOptions = this.getSharedOptions(firstOpts);\n        const includeOptions = this.includeOptions(mode, sharedOptions);\n        const iAxis = iScale.axis;\n        const vAxis = vScale.axis;\n        const { spanGaps , segment  } = this.options;\n        const maxGapLength = isNumber(spanGaps) ? spanGaps : Number.POSITIVE_INFINITY;\n        const directUpdate = this.chart._animationsDisabled || reset || mode === 'none';\n        let prevParsed = start > 0 && this.getParsed(start - 1);\n        for(let i = start; i < start + count; ++i){\n            const point = points[i];\n            const parsed = this.getParsed(i);\n            const properties = directUpdate ? point : {};\n            const nullData = isNullOrUndef(parsed[vAxis]);\n            const iPixel = properties[iAxis] = iScale.getPixelForValue(parsed[iAxis], i);\n            const vPixel = properties[vAxis] = reset || nullData ? vScale.getBasePixel() : vScale.getPixelForValue(_stacked ? this.applyStack(vScale, parsed, _stacked) : parsed[vAxis], i);\n            properties.skip = isNaN(iPixel) || isNaN(vPixel) || nullData;\n            properties.stop = i > 0 && Math.abs(parsed[iAxis] - prevParsed[iAxis]) > maxGapLength;\n            if (segment) {\n                properties.parsed = parsed;\n                properties.raw = _dataset.data[i];\n            }\n            if (includeOptions) {\n                properties.options = sharedOptions || this.resolveDataElementOptions(i, point.active ? 'active' : mode);\n            }\n            if (!directUpdate) {\n                this.updateElement(point, i, properties, mode);\n            }\n            prevParsed = parsed;\n        }\n        this.updateSharedOptions(sharedOptions, mode, firstOpts);\n    }\n getMaxOverflow() {\n        const meta = this._cachedMeta;\n        const data = meta.data || [];\n        if (!this.options.showLine) {\n            let max = 0;\n            for(let i = data.length - 1; i >= 0; --i){\n                max = Math.max(max, data[i].size(this.resolveDataElementOptions(i)) / 2);\n            }\n            return max > 0 && max;\n        }\n        const dataset = meta.dataset;\n        const border = dataset.options && dataset.options.borderWidth || 0;\n        if (!data.length) {\n            return border;\n        }\n        const firstPoint = data[0].size(this.resolveDataElementOptions(0));\n        const lastPoint = data[data.length - 1].size(this.resolveDataElementOptions(data.length - 1));\n        return Math.max(border, firstPoint, lastPoint) / 2;\n    }\n}\n\nvar controllers = /*#__PURE__*/Object.freeze({\n__proto__: null,\nBarController: BarController,\nBubbleController: BubbleController,\nDoughnutController: DoughnutController,\nLineController: LineController,\nPieController: PieController,\nPolarAreaController: PolarAreaController,\nRadarController: RadarController,\nScatterController: ScatterController\n});\n\n/**\n * @namespace Chart._adapters\n * @since 2.8.0\n * @private\n */ function abstract() {\n    throw new Error('This method is not implemented: Check that a complete date adapter is provided.');\n}\n/**\n * Date adapter (current used by the time scale)\n * @namespace Chart._adapters._date\n * @memberof Chart._adapters\n * @private\n */ class DateAdapterBase {\n    /**\n   * Override default date adapter methods.\n   * Accepts type parameter to define options type.\n   * @example\n   * Chart._adapters._date.override<{myAdapterOption: string}>({\n   *   init() {\n   *     console.log(this.options.myAdapterOption);\n   *   }\n   * })\n   */ static override(members) {\n        Object.assign(DateAdapterBase.prototype, members);\n    }\n    options;\n    constructor(options){\n        this.options = options || {};\n    }\n    // eslint-disable-next-line @typescript-eslint/no-empty-function\n    init() {}\n    formats() {\n        return abstract();\n    }\n    parse() {\n        return abstract();\n    }\n    format() {\n        return abstract();\n    }\n    add() {\n        return abstract();\n    }\n    diff() {\n        return abstract();\n    }\n    startOf() {\n        return abstract();\n    }\n    endOf() {\n        return abstract();\n    }\n}\nvar adapters = {\n    _date: DateAdapterBase\n};\n\nfunction binarySearch(metaset, axis, value, intersect) {\n    const { controller , data , _sorted  } = metaset;\n    const iScale = controller._cachedMeta.iScale;\n    const spanGaps = metaset.dataset ? metaset.dataset.options ? metaset.dataset.options.spanGaps : null : null;\n    if (iScale && axis === iScale.axis && axis !== 'r' && _sorted && data.length) {\n        const lookupMethod = iScale._reversePixels ? _rlookupByKey : _lookupByKey;\n        if (!intersect) {\n            const result = lookupMethod(data, axis, value);\n            if (spanGaps) {\n                const { vScale  } = controller._cachedMeta;\n                const { _parsed  } = metaset;\n                const distanceToDefinedLo = _parsed.slice(0, result.lo + 1).reverse().findIndex((point)=>!isNullOrUndef(point[vScale.axis]));\n                result.lo -= Math.max(0, distanceToDefinedLo);\n                const distanceToDefinedHi = _parsed.slice(result.hi).findIndex((point)=>!isNullOrUndef(point[vScale.axis]));\n                result.hi += Math.max(0, distanceToDefinedHi);\n            }\n            return result;\n        } else if (controller._sharedOptions) {\n            const el = data[0];\n            const range = typeof el.getRange === 'function' && el.getRange(axis);\n            if (range) {\n                const start = lookupMethod(data, axis, value - range);\n                const end = lookupMethod(data, axis, value + range);\n                return {\n                    lo: start.lo,\n                    hi: end.hi\n                };\n            }\n        }\n    }\n    return {\n        lo: 0,\n        hi: data.length - 1\n    };\n}\n function evaluateInteractionItems(chart, axis, position, handler, intersect) {\n    const metasets = chart.getSortedVisibleDatasetMetas();\n    const value = position[axis];\n    for(let i = 0, ilen = metasets.length; i < ilen; ++i){\n        const { index , data  } = metasets[i];\n        const { lo , hi  } = binarySearch(metasets[i], axis, value, intersect);\n        for(let j = lo; j <= hi; ++j){\n            const element = data[j];\n            if (!element.skip) {\n                handler(element, index, j);\n            }\n        }\n    }\n}\n function getDistanceMetricForAxis(axis) {\n    const useX = axis.indexOf('x') !== -1;\n    const useY = axis.indexOf('y') !== -1;\n    return function(pt1, pt2) {\n        const deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0;\n        const deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0;\n        return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2));\n    };\n}\n function getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) {\n    const items = [];\n    if (!includeInvisible && !chart.isPointInArea(position)) {\n        return items;\n    }\n    const evaluationFunc = function(element, datasetIndex, index) {\n        if (!includeInvisible && !_isPointInArea(element, chart.chartArea, 0)) {\n            return;\n        }\n        if (element.inRange(position.x, position.y, useFinalPosition)) {\n            items.push({\n                element,\n                datasetIndex,\n                index\n            });\n        }\n    };\n    evaluateInteractionItems(chart, axis, position, evaluationFunc, true);\n    return items;\n}\n function getNearestRadialItems(chart, position, axis, useFinalPosition) {\n    let items = [];\n    function evaluationFunc(element, datasetIndex, index) {\n        const { startAngle , endAngle  } = element.getProps([\n            'startAngle',\n            'endAngle'\n        ], useFinalPosition);\n        const { angle  } = getAngleFromPoint(element, {\n            x: position.x,\n            y: position.y\n        });\n        if (_angleBetween(angle, startAngle, endAngle)) {\n            items.push({\n                element,\n                datasetIndex,\n                index\n            });\n        }\n    }\n    evaluateInteractionItems(chart, axis, position, evaluationFunc);\n    return items;\n}\n function getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n    let items = [];\n    const distanceMetric = getDistanceMetricForAxis(axis);\n    let minDistance = Number.POSITIVE_INFINITY;\n    function evaluationFunc(element, datasetIndex, index) {\n        const inRange = element.inRange(position.x, position.y, useFinalPosition);\n        if (intersect && !inRange) {\n            return;\n        }\n        const center = element.getCenterPoint(useFinalPosition);\n        const pointInArea = !!includeInvisible || chart.isPointInArea(center);\n        if (!pointInArea && !inRange) {\n            return;\n        }\n        const distance = distanceMetric(position, center);\n        if (distance < minDistance) {\n            items = [\n                {\n                    element,\n                    datasetIndex,\n                    index\n                }\n            ];\n            minDistance = distance;\n        } else if (distance === minDistance) {\n            items.push({\n                element,\n                datasetIndex,\n                index\n            });\n        }\n    }\n    evaluateInteractionItems(chart, axis, position, evaluationFunc);\n    return items;\n}\n function getNearestItems(chart, position, axis, intersect, useFinalPosition, includeInvisible) {\n    if (!includeInvisible && !chart.isPointInArea(position)) {\n        return [];\n    }\n    return axis === 'r' && !intersect ? getNearestRadialItems(chart, position, axis, useFinalPosition) : getNearestCartesianItems(chart, position, axis, intersect, useFinalPosition, includeInvisible);\n}\n function getAxisItems(chart, position, axis, intersect, useFinalPosition) {\n    const items = [];\n    const rangeMethod = axis === 'x' ? 'inXRange' : 'inYRange';\n    let intersectsItem = false;\n    evaluateInteractionItems(chart, axis, position, (element, datasetIndex, index)=>{\n        if (element[rangeMethod] && element[rangeMethod](position[axis], useFinalPosition)) {\n            items.push({\n                element,\n                datasetIndex,\n                index\n            });\n            intersectsItem = intersectsItem || element.inRange(position.x, position.y, useFinalPosition);\n        }\n    });\n    if (intersect && !intersectsItem) {\n        return [];\n    }\n    return items;\n}\n var Interaction = {\n    evaluateInteractionItems,\n    modes: {\n index (chart, e, options, useFinalPosition) {\n            const position = getRelativePosition(e, chart);\n            const axis = options.axis || 'x';\n            const includeInvisible = options.includeInvisible || false;\n            const items = options.intersect ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n            const elements = [];\n            if (!items.length) {\n                return [];\n            }\n            chart.getSortedVisibleDatasetMetas().forEach((meta)=>{\n                const index = items[0].index;\n                const element = meta.data[index];\n                if (element && !element.skip) {\n                    elements.push({\n                        element,\n                        datasetIndex: meta.index,\n                        index\n                    });\n                }\n            });\n            return elements;\n        },\n dataset (chart, e, options, useFinalPosition) {\n            const position = getRelativePosition(e, chart);\n            const axis = options.axis || 'xy';\n            const includeInvisible = options.includeInvisible || false;\n            let items = options.intersect ? getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible) : getNearestItems(chart, position, axis, false, useFinalPosition, includeInvisible);\n            if (items.length > 0) {\n                const datasetIndex = items[0].datasetIndex;\n                const data = chart.getDatasetMeta(datasetIndex).data;\n                items = [];\n                for(let i = 0; i < data.length; ++i){\n                    items.push({\n                        element: data[i],\n                        datasetIndex,\n                        index: i\n                    });\n                }\n            }\n            return items;\n        },\n point (chart, e, options, useFinalPosition) {\n            const position = getRelativePosition(e, chart);\n            const axis = options.axis || 'xy';\n            const includeInvisible = options.includeInvisible || false;\n            return getIntersectItems(chart, position, axis, useFinalPosition, includeInvisible);\n        },\n nearest (chart, e, options, useFinalPosition) {\n            const position = getRelativePosition(e, chart);\n            const axis = options.axis || 'xy';\n            const includeInvisible = options.includeInvisible || false;\n            return getNearestItems(chart, position, axis, options.intersect, useFinalPosition, includeInvisible);\n        },\n x (chart, e, options, useFinalPosition) {\n            const position = getRelativePosition(e, chart);\n            return getAxisItems(chart, position, 'x', options.intersect, useFinalPosition);\n        },\n y (chart, e, options, useFinalPosition) {\n            const position = getRelativePosition(e, chart);\n            return getAxisItems(chart, position, 'y', options.intersect, useFinalPosition);\n        }\n    }\n};\n\nconst STATIC_POSITIONS = [\n    'left',\n    'top',\n    'right',\n    'bottom'\n];\nfunction filterByPosition(array, position) {\n    return array.filter((v)=>v.pos === position);\n}\nfunction filterDynamicPositionByAxis(array, axis) {\n    return array.filter((v)=>STATIC_POSITIONS.indexOf(v.pos) === -1 && v.box.axis === axis);\n}\nfunction sortByWeight(array, reverse) {\n    return array.sort((a, b)=>{\n        const v0 = reverse ? b : a;\n        const v1 = reverse ? a : b;\n        return v0.weight === v1.weight ? v0.index - v1.index : v0.weight - v1.weight;\n    });\n}\nfunction wrapBoxes(boxes) {\n    const layoutBoxes = [];\n    let i, ilen, box, pos, stack, stackWeight;\n    for(i = 0, ilen = (boxes || []).length; i < ilen; ++i){\n        box = boxes[i];\n        ({ position: pos , options: { stack , stackWeight =1  }  } = box);\n        layoutBoxes.push({\n            index: i,\n            box,\n            pos,\n            horizontal: box.isHorizontal(),\n            weight: box.weight,\n            stack: stack && pos + stack,\n            stackWeight\n        });\n    }\n    return layoutBoxes;\n}\nfunction buildStacks(layouts) {\n    const stacks = {};\n    for (const wrap of layouts){\n        const { stack , pos , stackWeight  } = wrap;\n        if (!stack || !STATIC_POSITIONS.includes(pos)) {\n            continue;\n        }\n        const _stack = stacks[stack] || (stacks[stack] = {\n            count: 0,\n            placed: 0,\n            weight: 0,\n            size: 0\n        });\n        _stack.count++;\n        _stack.weight += stackWeight;\n    }\n    return stacks;\n}\n function setLayoutDims(layouts, params) {\n    const stacks = buildStacks(layouts);\n    const { vBoxMaxWidth , hBoxMaxHeight  } = params;\n    let i, ilen, layout;\n    for(i = 0, ilen = layouts.length; i < ilen; ++i){\n        layout = layouts[i];\n        const { fullSize  } = layout.box;\n        const stack = stacks[layout.stack];\n        const factor = stack && layout.stackWeight / stack.weight;\n        if (layout.horizontal) {\n            layout.width = factor ? factor * vBoxMaxWidth : fullSize && params.availableWidth;\n            layout.height = hBoxMaxHeight;\n        } else {\n            layout.width = vBoxMaxWidth;\n            layout.height = factor ? factor * hBoxMaxHeight : fullSize && params.availableHeight;\n        }\n    }\n    return stacks;\n}\nfunction buildLayoutBoxes(boxes) {\n    const layoutBoxes = wrapBoxes(boxes);\n    const fullSize = sortByWeight(layoutBoxes.filter((wrap)=>wrap.box.fullSize), true);\n    const left = sortByWeight(filterByPosition(layoutBoxes, 'left'), true);\n    const right = sortByWeight(filterByPosition(layoutBoxes, 'right'));\n    const top = sortByWeight(filterByPosition(layoutBoxes, 'top'), true);\n    const bottom = sortByWeight(filterByPosition(layoutBoxes, 'bottom'));\n    const centerHorizontal = filterDynamicPositionByAxis(layoutBoxes, 'x');\n    const centerVertical = filterDynamicPositionByAxis(layoutBoxes, 'y');\n    return {\n        fullSize,\n        leftAndTop: left.concat(top),\n        rightAndBottom: right.concat(centerVertical).concat(bottom).concat(centerHorizontal),\n        chartArea: filterByPosition(layoutBoxes, 'chartArea'),\n        vertical: left.concat(right).concat(centerVertical),\n        horizontal: top.concat(bottom).concat(centerHorizontal)\n    };\n}\nfunction getCombinedMax(maxPadding, chartArea, a, b) {\n    return Math.max(maxPadding[a], chartArea[a]) + Math.max(maxPadding[b], chartArea[b]);\n}\nfunction updateMaxPadding(maxPadding, boxPadding) {\n    maxPadding.top = Math.max(maxPadding.top, boxPadding.top);\n    maxPadding.left = Math.max(maxPadding.left, boxPadding.left);\n    maxPadding.bottom = Math.max(maxPadding.bottom, boxPadding.bottom);\n    maxPadding.right = Math.max(maxPadding.right, boxPadding.right);\n}\nfunction updateDims(chartArea, params, layout, stacks) {\n    const { pos , box  } = layout;\n    const maxPadding = chartArea.maxPadding;\n    if (!isObject(pos)) {\n        if (layout.size) {\n            chartArea[pos] -= layout.size;\n        }\n        const stack = stacks[layout.stack] || {\n            size: 0,\n            count: 1\n        };\n        stack.size = Math.max(stack.size, layout.horizontal ? box.height : box.width);\n        layout.size = stack.size / stack.count;\n        chartArea[pos] += layout.size;\n    }\n    if (box.getPadding) {\n        updateMaxPadding(maxPadding, box.getPadding());\n    }\n    const newWidth = Math.max(0, params.outerWidth - getCombinedMax(maxPadding, chartArea, 'left', 'right'));\n    const newHeight = Math.max(0, params.outerHeight - getCombinedMax(maxPadding, chartArea, 'top', 'bottom'));\n    const widthChanged = newWidth !== chartArea.w;\n    const heightChanged = newHeight !== chartArea.h;\n    chartArea.w = newWidth;\n    chartArea.h = newHeight;\n    return layout.horizontal ? {\n        same: widthChanged,\n        other: heightChanged\n    } : {\n        same: heightChanged,\n        other: widthChanged\n    };\n}\nfunction handleMaxPadding(chartArea) {\n    const maxPadding = chartArea.maxPadding;\n    function updatePos(pos) {\n        const change = Math.max(maxPadding[pos] - chartArea[pos], 0);\n        chartArea[pos] += change;\n        return change;\n    }\n    chartArea.y += updatePos('top');\n    chartArea.x += updatePos('left');\n    updatePos('right');\n    updatePos('bottom');\n}\nfunction getMargins(horizontal, chartArea) {\n    const maxPadding = chartArea.maxPadding;\n    function marginForPositions(positions) {\n        const margin = {\n            left: 0,\n            top: 0,\n            right: 0,\n            bottom: 0\n        };\n        positions.forEach((pos)=>{\n            margin[pos] = Math.max(chartArea[pos], maxPadding[pos]);\n        });\n        return margin;\n    }\n    return horizontal ? marginForPositions([\n        'left',\n        'right'\n    ]) : marginForPositions([\n        'top',\n        'bottom'\n    ]);\n}\nfunction fitBoxes(boxes, chartArea, params, stacks) {\n    const refitBoxes = [];\n    let i, ilen, layout, box, refit, changed;\n    for(i = 0, ilen = boxes.length, refit = 0; i < ilen; ++i){\n        layout = boxes[i];\n        box = layout.box;\n        box.update(layout.width || chartArea.w, layout.height || chartArea.h, getMargins(layout.horizontal, chartArea));\n        const { same , other  } = updateDims(chartArea, params, layout, stacks);\n        refit |= same && refitBoxes.length;\n        changed = changed || other;\n        if (!box.fullSize) {\n            refitBoxes.push(layout);\n        }\n    }\n    return refit && fitBoxes(refitBoxes, chartArea, params, stacks) || changed;\n}\nfunction setBoxDims(box, left, top, width, height) {\n    box.top = top;\n    box.left = left;\n    box.right = left + width;\n    box.bottom = top + height;\n    box.width = width;\n    box.height = height;\n}\nfunction placeBoxes(boxes, chartArea, params, stacks) {\n    const userPadding = params.padding;\n    let { x , y  } = chartArea;\n    for (const layout of boxes){\n        const box = layout.box;\n        const stack = stacks[layout.stack] || {\n            count: 1,\n            placed: 0,\n            weight: 1\n        };\n        const weight = layout.stackWeight / stack.weight || 1;\n        if (layout.horizontal) {\n            const width = chartArea.w * weight;\n            const height = stack.size || box.height;\n            if (defined(stack.start)) {\n                y = stack.start;\n            }\n            if (box.fullSize) {\n                setBoxDims(box, userPadding.left, y, params.outerWidth - userPadding.right - userPadding.left, height);\n            } else {\n                setBoxDims(box, chartArea.left + stack.placed, y, width, height);\n            }\n            stack.start = y;\n            stack.placed += width;\n            y = box.bottom;\n        } else {\n            const height = chartArea.h * weight;\n            const width = stack.size || box.width;\n            if (defined(stack.start)) {\n                x = stack.start;\n            }\n            if (box.fullSize) {\n                setBoxDims(box, x, userPadding.top, width, params.outerHeight - userPadding.bottom - userPadding.top);\n            } else {\n                setBoxDims(box, x, chartArea.top + stack.placed, width, height);\n            }\n            stack.start = x;\n            stack.placed += height;\n            x = box.right;\n        }\n    }\n    chartArea.x = x;\n    chartArea.y = y;\n}\nvar layouts = {\n addBox (chart, item) {\n        if (!chart.boxes) {\n            chart.boxes = [];\n        }\n        item.fullSize = item.fullSize || false;\n        item.position = item.position || 'top';\n        item.weight = item.weight || 0;\n        item._layers = item._layers || function() {\n            return [\n                {\n                    z: 0,\n                    draw (chartArea) {\n                        item.draw(chartArea);\n                    }\n                }\n            ];\n        };\n        chart.boxes.push(item);\n    },\n removeBox (chart, layoutItem) {\n        const index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1;\n        if (index !== -1) {\n            chart.boxes.splice(index, 1);\n        }\n    },\n configure (chart, item, options) {\n        item.fullSize = options.fullSize;\n        item.position = options.position;\n        item.weight = options.weight;\n    },\n update (chart, width, height, minPadding) {\n        if (!chart) {\n            return;\n        }\n        const padding = toPadding(chart.options.layout.padding);\n        const availableWidth = Math.max(width - padding.width, 0);\n        const availableHeight = Math.max(height - padding.height, 0);\n        const boxes = buildLayoutBoxes(chart.boxes);\n        const verticalBoxes = boxes.vertical;\n        const horizontalBoxes = boxes.horizontal;\n        each(chart.boxes, (box)=>{\n            if (typeof box.beforeLayout === 'function') {\n                box.beforeLayout();\n            }\n        });\n        const visibleVerticalBoxCount = verticalBoxes.reduce((total, wrap)=>wrap.box.options && wrap.box.options.display === false ? total : total + 1, 0) || 1;\n        const params = Object.freeze({\n            outerWidth: width,\n            outerHeight: height,\n            padding,\n            availableWidth,\n            availableHeight,\n            vBoxMaxWidth: availableWidth / 2 / visibleVerticalBoxCount,\n            hBoxMaxHeight: availableHeight / 2\n        });\n        const maxPadding = Object.assign({}, padding);\n        updateMaxPadding(maxPadding, toPadding(minPadding));\n        const chartArea = Object.assign({\n            maxPadding,\n            w: availableWidth,\n            h: availableHeight,\n            x: padding.left,\n            y: padding.top\n        }, padding);\n        const stacks = setLayoutDims(verticalBoxes.concat(horizontalBoxes), params);\n        fitBoxes(boxes.fullSize, chartArea, params, stacks);\n        fitBoxes(verticalBoxes, chartArea, params, stacks);\n        if (fitBoxes(horizontalBoxes, chartArea, params, stacks)) {\n            fitBoxes(verticalBoxes, chartArea, params, stacks);\n        }\n        handleMaxPadding(chartArea);\n        placeBoxes(boxes.leftAndTop, chartArea, params, stacks);\n        chartArea.x += chartArea.w;\n        chartArea.y += chartArea.h;\n        placeBoxes(boxes.rightAndBottom, chartArea, params, stacks);\n        chart.chartArea = {\n            left: chartArea.left,\n            top: chartArea.top,\n            right: chartArea.left + chartArea.w,\n            bottom: chartArea.top + chartArea.h,\n            height: chartArea.h,\n            width: chartArea.w\n        };\n        each(boxes.chartArea, (layout)=>{\n            const box = layout.box;\n            Object.assign(box, chart.chartArea);\n            box.update(chartArea.w, chartArea.h, {\n                left: 0,\n                top: 0,\n                right: 0,\n                bottom: 0\n            });\n        });\n    }\n};\n\nclass BasePlatform {\n acquireContext(canvas, aspectRatio) {}\n releaseContext(context) {\n        return false;\n    }\n addEventListener(chart, type, listener) {}\n removeEventListener(chart, type, listener) {}\n getDevicePixelRatio() {\n        return 1;\n    }\n getMaximumSize(element, width, height, aspectRatio) {\n        width = Math.max(0, width || element.width);\n        height = height || element.height;\n        return {\n            width,\n            height: Math.max(0, aspectRatio ? Math.floor(width / aspectRatio) : height)\n        };\n    }\n isAttached(canvas) {\n        return true;\n    }\n updateConfig(config) {\n    }\n}\n\nclass BasicPlatform extends BasePlatform {\n    acquireContext(item) {\n        return item && item.getContext && item.getContext('2d') || null;\n    }\n    updateConfig(config) {\n        config.options.animation = false;\n    }\n}\n\nconst EXPANDO_KEY = '$chartjs';\n const EVENT_TYPES = {\n    touchstart: 'mousedown',\n    touchmove: 'mousemove',\n    touchend: 'mouseup',\n    pointerenter: 'mouseenter',\n    pointerdown: 'mousedown',\n    pointermove: 'mousemove',\n    pointerup: 'mouseup',\n    pointerleave: 'mouseout',\n    pointerout: 'mouseout'\n};\nconst isNullOrEmpty = (value)=>value === null || value === '';\n function initCanvas(canvas, aspectRatio) {\n    const style = canvas.style;\n    const renderHeight = canvas.getAttribute('height');\n    const renderWidth = canvas.getAttribute('width');\n    canvas[EXPANDO_KEY] = {\n        initial: {\n            height: renderHeight,\n            width: renderWidth,\n            style: {\n                display: style.display,\n                height: style.height,\n                width: style.width\n            }\n        }\n    };\n    style.display = style.display || 'block';\n    style.boxSizing = style.boxSizing || 'border-box';\n    if (isNullOrEmpty(renderWidth)) {\n        const displayWidth = readUsedSize(canvas, 'width');\n        if (displayWidth !== undefined) {\n            canvas.width = displayWidth;\n        }\n    }\n    if (isNullOrEmpty(renderHeight)) {\n        if (canvas.style.height === '') {\n            canvas.height = canvas.width / (aspectRatio || 2);\n        } else {\n            const displayHeight = readUsedSize(canvas, 'height');\n            if (displayHeight !== undefined) {\n                canvas.height = displayHeight;\n            }\n        }\n    }\n    return canvas;\n}\nconst eventListenerOptions = supportsEventListenerOptions ? {\n    passive: true\n} : false;\nfunction addListener(node, type, listener) {\n    if (node) {\n        node.addEventListener(type, listener, eventListenerOptions);\n    }\n}\nfunction removeListener(chart, type, listener) {\n    if (chart && chart.canvas) {\n        chart.canvas.removeEventListener(type, listener, eventListenerOptions);\n    }\n}\nfunction fromNativeEvent(event, chart) {\n    const type = EVENT_TYPES[event.type] || event.type;\n    const { x , y  } = getRelativePosition(event, chart);\n    return {\n        type,\n        chart,\n        native: event,\n        x: x !== undefined ? x : null,\n        y: y !== undefined ? y : null\n    };\n}\nfunction nodeListContains(nodeList, canvas) {\n    for (const node of nodeList){\n        if (node === canvas || node.contains(canvas)) {\n            return true;\n        }\n    }\n}\nfunction createAttachObserver(chart, type, listener) {\n    const canvas = chart.canvas;\n    const observer = new MutationObserver((entries)=>{\n        let trigger = false;\n        for (const entry of entries){\n            trigger = trigger || nodeListContains(entry.addedNodes, canvas);\n            trigger = trigger && !nodeListContains(entry.removedNodes, canvas);\n        }\n        if (trigger) {\n            listener();\n        }\n    });\n    observer.observe(document, {\n        childList: true,\n        subtree: true\n    });\n    return observer;\n}\nfunction createDetachObserver(chart, type, listener) {\n    const canvas = chart.canvas;\n    const observer = new MutationObserver((entries)=>{\n        let trigger = false;\n        for (const entry of entries){\n            trigger = trigger || nodeListContains(entry.removedNodes, canvas);\n            trigger = trigger && !nodeListContains(entry.addedNodes, canvas);\n        }\n        if (trigger) {\n            listener();\n        }\n    });\n    observer.observe(document, {\n        childList: true,\n        subtree: true\n    });\n    return observer;\n}\nconst drpListeningCharts = new Map();\nlet oldDevicePixelRatio = 0;\nfunction onWindowResize() {\n    const dpr = window.devicePixelRatio;\n    if (dpr === oldDevicePixelRatio) {\n        return;\n    }\n    oldDevicePixelRatio = dpr;\n    drpListeningCharts.forEach((resize, chart)=>{\n        if (chart.currentDevicePixelRatio !== dpr) {\n            resize();\n        }\n    });\n}\nfunction listenDevicePixelRatioChanges(chart, resize) {\n    if (!drpListeningCharts.size) {\n        window.addEventListener('resize', onWindowResize);\n    }\n    drpListeningCharts.set(chart, resize);\n}\nfunction unlistenDevicePixelRatioChanges(chart) {\n    drpListeningCharts.delete(chart);\n    if (!drpListeningCharts.size) {\n        window.removeEventListener('resize', onWindowResize);\n    }\n}\nfunction createResizeObserver(chart, type, listener) {\n    const canvas = chart.canvas;\n    const container = canvas && _getParentNode(canvas);\n    if (!container) {\n        return;\n    }\n    const resize = throttled((width, height)=>{\n        const w = container.clientWidth;\n        listener(width, height);\n        if (w < container.clientWidth) {\n            listener();\n        }\n    }, window);\n    const observer = new ResizeObserver((entries)=>{\n        const entry = entries[0];\n        const width = entry.contentRect.width;\n        const height = entry.contentRect.height;\n        if (width === 0 && height === 0) {\n            return;\n        }\n        resize(width, height);\n    });\n    observer.observe(container);\n    listenDevicePixelRatioChanges(chart, resize);\n    return observer;\n}\nfunction releaseObserver(chart, type, observer) {\n    if (observer) {\n        observer.disconnect();\n    }\n    if (type === 'resize') {\n        unlistenDevicePixelRatioChanges(chart);\n    }\n}\nfunction createProxyAndListen(chart, type, listener) {\n    const canvas = chart.canvas;\n    const proxy = throttled((event)=>{\n        if (chart.ctx !== null) {\n            listener(fromNativeEvent(event, chart));\n        }\n    }, chart);\n    addListener(canvas, type, proxy);\n    return proxy;\n}\n class DomPlatform extends BasePlatform {\n acquireContext(canvas, aspectRatio) {\n        const context = canvas && canvas.getContext && canvas.getContext('2d');\n        if (context && context.canvas === canvas) {\n            initCanvas(canvas, aspectRatio);\n            return context;\n        }\n        return null;\n    }\n releaseContext(context) {\n        const canvas = context.canvas;\n        if (!canvas[EXPANDO_KEY]) {\n            return false;\n        }\n        const initial = canvas[EXPANDO_KEY].initial;\n        [\n            'height',\n            'width'\n        ].forEach((prop)=>{\n            const value = initial[prop];\n            if (isNullOrUndef(value)) {\n                canvas.removeAttribute(prop);\n            } else {\n                canvas.setAttribute(prop, value);\n            }\n        });\n        const style = initial.style || {};\n        Object.keys(style).forEach((key)=>{\n            canvas.style[key] = style[key];\n        });\n        canvas.width = canvas.width;\n        delete canvas[EXPANDO_KEY];\n        return true;\n    }\n addEventListener(chart, type, listener) {\n        this.removeEventListener(chart, type);\n        const proxies = chart.$proxies || (chart.$proxies = {});\n        const handlers = {\n            attach: createAttachObserver,\n            detach: createDetachObserver,\n            resize: createResizeObserver\n        };\n        const handler = handlers[type] || createProxyAndListen;\n        proxies[type] = handler(chart, type, listener);\n    }\n removeEventListener(chart, type) {\n        const proxies = chart.$proxies || (chart.$proxies = {});\n        const proxy = proxies[type];\n        if (!proxy) {\n            return;\n        }\n        const handlers = {\n            attach: releaseObserver,\n            detach: releaseObserver,\n            resize: releaseObserver\n        };\n        const handler = handlers[type] || removeListener;\n        handler(chart, type, proxy);\n        proxies[type] = undefined;\n    }\n    getDevicePixelRatio() {\n        return window.devicePixelRatio;\n    }\n getMaximumSize(canvas, width, height, aspectRatio) {\n        return getMaximumSize(canvas, width, height, aspectRatio);\n    }\n isAttached(canvas) {\n        const container = canvas && _getParentNode(canvas);\n        return !!(container && container.isConnected);\n    }\n}\n\nfunction _detectPlatform(canvas) {\n    if (!_isDomSupported() || typeof OffscreenCanvas !== 'undefined' && canvas instanceof OffscreenCanvas) {\n        return BasicPlatform;\n    }\n    return DomPlatform;\n}\n\nclass Element {\n    static defaults = {};\n    static defaultRoutes = undefined;\n    x;\n    y;\n    active = false;\n    options;\n    $animations;\n    tooltipPosition(useFinalPosition) {\n        const { x , y  } = this.getProps([\n            'x',\n            'y'\n        ], useFinalPosition);\n        return {\n            x,\n            y\n        };\n    }\n    hasValue() {\n        return isNumber(this.x) && isNumber(this.y);\n    }\n    getProps(props, final) {\n        const anims = this.$animations;\n        if (!final || !anims) {\n            // let's not create an object, if not needed\n            return this;\n        }\n        const ret = {};\n        props.forEach((prop)=>{\n            ret[prop] = anims[prop] && anims[prop].active() ? anims[prop]._to : this[prop];\n        });\n        return ret;\n    }\n}\n\nfunction autoSkip(scale, ticks) {\n    const tickOpts = scale.options.ticks;\n    const determinedMaxTicks = determineMaxTicks(scale);\n    const ticksLimit = Math.min(tickOpts.maxTicksLimit || determinedMaxTicks, determinedMaxTicks);\n    const majorIndices = tickOpts.major.enabled ? getMajorIndices(ticks) : [];\n    const numMajorIndices = majorIndices.length;\n    const first = majorIndices[0];\n    const last = majorIndices[numMajorIndices - 1];\n    const newTicks = [];\n    if (numMajorIndices > ticksLimit) {\n        skipMajors(ticks, newTicks, majorIndices, numMajorIndices / ticksLimit);\n        return newTicks;\n    }\n    const spacing = calculateSpacing(majorIndices, ticks, ticksLimit);\n    if (numMajorIndices > 0) {\n        let i, ilen;\n        const avgMajorSpacing = numMajorIndices > 1 ? Math.round((last - first) / (numMajorIndices - 1)) : null;\n        skip(ticks, newTicks, spacing, isNullOrUndef(avgMajorSpacing) ? 0 : first - avgMajorSpacing, first);\n        for(i = 0, ilen = numMajorIndices - 1; i < ilen; i++){\n            skip(ticks, newTicks, spacing, majorIndices[i], majorIndices[i + 1]);\n        }\n        skip(ticks, newTicks, spacing, last, isNullOrUndef(avgMajorSpacing) ? ticks.length : last + avgMajorSpacing);\n        return newTicks;\n    }\n    skip(ticks, newTicks, spacing);\n    return newTicks;\n}\nfunction determineMaxTicks(scale) {\n    const offset = scale.options.offset;\n    const tickLength = scale._tickSize();\n    const maxScale = scale._length / tickLength + (offset ? 0 : 1);\n    const maxChart = scale._maxLength / tickLength;\n    return Math.floor(Math.min(maxScale, maxChart));\n}\n function calculateSpacing(majorIndices, ticks, ticksLimit) {\n    const evenMajorSpacing = getEvenSpacing(majorIndices);\n    const spacing = ticks.length / ticksLimit;\n    if (!evenMajorSpacing) {\n        return Math.max(spacing, 1);\n    }\n    const factors = _factorize(evenMajorSpacing);\n    for(let i = 0, ilen = factors.length - 1; i < ilen; i++){\n        const factor = factors[i];\n        if (factor > spacing) {\n            return factor;\n        }\n    }\n    return Math.max(spacing, 1);\n}\n function getMajorIndices(ticks) {\n    const result = [];\n    let i, ilen;\n    for(i = 0, ilen = ticks.length; i < ilen; i++){\n        if (ticks[i].major) {\n            result.push(i);\n        }\n    }\n    return result;\n}\n function skipMajors(ticks, newTicks, majorIndices, spacing) {\n    let count = 0;\n    let next = majorIndices[0];\n    let i;\n    spacing = Math.ceil(spacing);\n    for(i = 0; i < ticks.length; i++){\n        if (i === next) {\n            newTicks.push(ticks[i]);\n            count++;\n            next = majorIndices[count * spacing];\n        }\n    }\n}\n function skip(ticks, newTicks, spacing, majorStart, majorEnd) {\n    const start = valueOrDefault(majorStart, 0);\n    const end = Math.min(valueOrDefault(majorEnd, ticks.length), ticks.length);\n    let count = 0;\n    let length, i, next;\n    spacing = Math.ceil(spacing);\n    if (majorEnd) {\n        length = majorEnd - majorStart;\n        spacing = length / Math.floor(length / spacing);\n    }\n    next = start;\n    while(next < 0){\n        count++;\n        next = Math.round(start + count * spacing);\n    }\n    for(i = Math.max(start, 0); i < end; i++){\n        if (i === next) {\n            newTicks.push(ticks[i]);\n            count++;\n            next = Math.round(start + count * spacing);\n        }\n    }\n}\n function getEvenSpacing(arr) {\n    const len = arr.length;\n    let i, diff;\n    if (len < 2) {\n        return false;\n    }\n    for(diff = arr[0], i = 1; i < len; ++i){\n        if (arr[i] - arr[i - 1] !== diff) {\n            return false;\n        }\n    }\n    return diff;\n}\n\nconst reverseAlign = (align)=>align === 'left' ? 'right' : align === 'right' ? 'left' : align;\nconst offsetFromEdge = (scale, edge, offset)=>edge === 'top' || edge === 'left' ? scale[edge] + offset : scale[edge] - offset;\nconst getTicksLimit = (ticksLength, maxTicksLimit)=>Math.min(maxTicksLimit || ticksLength, ticksLength);\n function sample(arr, numItems) {\n    const result = [];\n    const increment = arr.length / numItems;\n    const len = arr.length;\n    let i = 0;\n    for(; i < len; i += increment){\n        result.push(arr[Math.floor(i)]);\n    }\n    return result;\n}\n function getPixelForGridLine(scale, index, offsetGridLines) {\n    const length = scale.ticks.length;\n    const validIndex = Math.min(index, length - 1);\n    const start = scale._startPixel;\n    const end = scale._endPixel;\n    const epsilon = 1e-6;\n    let lineValue = scale.getPixelForTick(validIndex);\n    let offset;\n    if (offsetGridLines) {\n        if (length === 1) {\n            offset = Math.max(lineValue - start, end - lineValue);\n        } else if (index === 0) {\n            offset = (scale.getPixelForTick(1) - lineValue) / 2;\n        } else {\n            offset = (lineValue - scale.getPixelForTick(validIndex - 1)) / 2;\n        }\n        lineValue += validIndex < index ? offset : -offset;\n        if (lineValue < start - epsilon || lineValue > end + epsilon) {\n            return;\n        }\n    }\n    return lineValue;\n}\n function garbageCollect(caches, length) {\n    each(caches, (cache)=>{\n        const gc = cache.gc;\n        const gcLen = gc.length / 2;\n        let i;\n        if (gcLen > length) {\n            for(i = 0; i < gcLen; ++i){\n                delete cache.data[gc[i]];\n            }\n            gc.splice(0, gcLen);\n        }\n    });\n}\n function getTickMarkLength(options) {\n    return options.drawTicks ? options.tickLength : 0;\n}\n function getTitleHeight(options, fallback) {\n    if (!options.display) {\n        return 0;\n    }\n    const font = toFont(options.font, fallback);\n    const padding = toPadding(options.padding);\n    const lines = isArray(options.text) ? options.text.length : 1;\n    return lines * font.lineHeight + padding.height;\n}\nfunction createScaleContext(parent, scale) {\n    return createContext(parent, {\n        scale,\n        type: 'scale'\n    });\n}\nfunction createTickContext(parent, index, tick) {\n    return createContext(parent, {\n        tick,\n        index,\n        type: 'tick'\n    });\n}\nfunction titleAlign(align, position, reverse) {\n     let ret = _toLeftRightCenter(align);\n    if (reverse && position !== 'right' || !reverse && position === 'right') {\n        ret = reverseAlign(ret);\n    }\n    return ret;\n}\nfunction titleArgs(scale, offset, position, align) {\n    const { top , left , bottom , right , chart  } = scale;\n    const { chartArea , scales  } = chart;\n    let rotation = 0;\n    let maxWidth, titleX, titleY;\n    const height = bottom - top;\n    const width = right - left;\n    if (scale.isHorizontal()) {\n        titleX = _alignStartEnd(align, left, right);\n        if (isObject(position)) {\n            const positionAxisID = Object.keys(position)[0];\n            const value = position[positionAxisID];\n            titleY = scales[positionAxisID].getPixelForValue(value) + height - offset;\n        } else if (position === 'center') {\n            titleY = (chartArea.bottom + chartArea.top) / 2 + height - offset;\n        } else {\n            titleY = offsetFromEdge(scale, position, offset);\n        }\n        maxWidth = right - left;\n    } else {\n        if (isObject(position)) {\n            const positionAxisID = Object.keys(position)[0];\n            const value = position[positionAxisID];\n            titleX = scales[positionAxisID].getPixelForValue(value) - width + offset;\n        } else if (position === 'center') {\n            titleX = (chartArea.left + chartArea.right) / 2 - width + offset;\n        } else {\n            titleX = offsetFromEdge(scale, position, offset);\n        }\n        titleY = _alignStartEnd(align, bottom, top);\n        rotation = position === 'left' ? -HALF_PI : HALF_PI;\n    }\n    return {\n        titleX,\n        titleY,\n        maxWidth,\n        rotation\n    };\n}\nclass Scale extends Element {\n    constructor(cfg){\n        super();\n         this.id = cfg.id;\n         this.type = cfg.type;\n         this.options = undefined;\n         this.ctx = cfg.ctx;\n         this.chart = cfg.chart;\n         this.top = undefined;\n         this.bottom = undefined;\n         this.left = undefined;\n         this.right = undefined;\n         this.width = undefined;\n         this.height = undefined;\n        this._margins = {\n            left: 0,\n            right: 0,\n            top: 0,\n            bottom: 0\n        };\n         this.maxWidth = undefined;\n         this.maxHeight = undefined;\n         this.paddingTop = undefined;\n         this.paddingBottom = undefined;\n         this.paddingLeft = undefined;\n         this.paddingRight = undefined;\n         this.axis = undefined;\n         this.labelRotation = undefined;\n        this.min = undefined;\n        this.max = undefined;\n        this._range = undefined;\n         this.ticks = [];\n         this._gridLineItems = null;\n         this._labelItems = null;\n         this._labelSizes = null;\n        this._length = 0;\n        this._maxLength = 0;\n        this._longestTextCache = {};\n         this._startPixel = undefined;\n         this._endPixel = undefined;\n        this._reversePixels = false;\n        this._userMax = undefined;\n        this._userMin = undefined;\n        this._suggestedMax = undefined;\n        this._suggestedMin = undefined;\n        this._ticksLength = 0;\n        this._borderValue = 0;\n        this._cache = {};\n        this._dataLimitsCached = false;\n        this.$context = undefined;\n    }\n init(options) {\n        this.options = options.setContext(this.getContext());\n        this.axis = options.axis;\n        this._userMin = this.parse(options.min);\n        this._userMax = this.parse(options.max);\n        this._suggestedMin = this.parse(options.suggestedMin);\n        this._suggestedMax = this.parse(options.suggestedMax);\n    }\n parse(raw, index) {\n        return raw;\n    }\n getUserBounds() {\n        let { _userMin , _userMax , _suggestedMin , _suggestedMax  } = this;\n        _userMin = finiteOrDefault(_userMin, Number.POSITIVE_INFINITY);\n        _userMax = finiteOrDefault(_userMax, Number.NEGATIVE_INFINITY);\n        _suggestedMin = finiteOrDefault(_suggestedMin, Number.POSITIVE_INFINITY);\n        _suggestedMax = finiteOrDefault(_suggestedMax, Number.NEGATIVE_INFINITY);\n        return {\n            min: finiteOrDefault(_userMin, _suggestedMin),\n            max: finiteOrDefault(_userMax, _suggestedMax),\n            minDefined: isNumberFinite(_userMin),\n            maxDefined: isNumberFinite(_userMax)\n        };\n    }\n getMinMax(canStack) {\n        let { min , max , minDefined , maxDefined  } = this.getUserBounds();\n        let range;\n        if (minDefined && maxDefined) {\n            return {\n                min,\n                max\n            };\n        }\n        const metas = this.getMatchingVisibleMetas();\n        for(let i = 0, ilen = metas.length; i < ilen; ++i){\n            range = metas[i].controller.getMinMax(this, canStack);\n            if (!minDefined) {\n                min = Math.min(min, range.min);\n            }\n            if (!maxDefined) {\n                max = Math.max(max, range.max);\n            }\n        }\n        min = maxDefined && min > max ? max : min;\n        max = minDefined && min > max ? min : max;\n        return {\n            min: finiteOrDefault(min, finiteOrDefault(max, min)),\n            max: finiteOrDefault(max, finiteOrDefault(min, max))\n        };\n    }\n getPadding() {\n        return {\n            left: this.paddingLeft || 0,\n            top: this.paddingTop || 0,\n            right: this.paddingRight || 0,\n            bottom: this.paddingBottom || 0\n        };\n    }\n getTicks() {\n        return this.ticks;\n    }\n getLabels() {\n        const data = this.chart.data;\n        return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels || [];\n    }\n getLabelItems(chartArea = this.chart.chartArea) {\n        const items = this._labelItems || (this._labelItems = this._computeLabelItems(chartArea));\n        return items;\n    }\n    beforeLayout() {\n        this._cache = {};\n        this._dataLimitsCached = false;\n    }\n    beforeUpdate() {\n        callback(this.options.beforeUpdate, [\n            this\n        ]);\n    }\n update(maxWidth, maxHeight, margins) {\n        const { beginAtZero , grace , ticks: tickOpts  } = this.options;\n        const sampleSize = tickOpts.sampleSize;\n        this.beforeUpdate();\n        this.maxWidth = maxWidth;\n        this.maxHeight = maxHeight;\n        this._margins = margins = Object.assign({\n            left: 0,\n            right: 0,\n            top: 0,\n            bottom: 0\n        }, margins);\n        this.ticks = null;\n        this._labelSizes = null;\n        this._gridLineItems = null;\n        this._labelItems = null;\n        this.beforeSetDimensions();\n        this.setDimensions();\n        this.afterSetDimensions();\n        this._maxLength = this.isHorizontal() ? this.width + margins.left + margins.right : this.height + margins.top + margins.bottom;\n        if (!this._dataLimitsCached) {\n            this.beforeDataLimits();\n            this.determineDataLimits();\n            this.afterDataLimits();\n            this._range = _addGrace(this, grace, beginAtZero);\n            this._dataLimitsCached = true;\n        }\n        this.beforeBuildTicks();\n        this.ticks = this.buildTicks() || [];\n        this.afterBuildTicks();\n        const samplingEnabled = sampleSize < this.ticks.length;\n        this._convertTicksToLabels(samplingEnabled ? sample(this.ticks, sampleSize) : this.ticks);\n        this.configure();\n        this.beforeCalculateLabelRotation();\n        this.calculateLabelRotation();\n        this.afterCalculateLabelRotation();\n        if (tickOpts.display && (tickOpts.autoSkip || tickOpts.source === 'auto')) {\n            this.ticks = autoSkip(this, this.ticks);\n            this._labelSizes = null;\n            this.afterAutoSkip();\n        }\n        if (samplingEnabled) {\n            this._convertTicksToLabels(this.ticks);\n        }\n        this.beforeFit();\n        this.fit();\n        this.afterFit();\n        this.afterUpdate();\n    }\n configure() {\n        let reversePixels = this.options.reverse;\n        let startPixel, endPixel;\n        if (this.isHorizontal()) {\n            startPixel = this.left;\n            endPixel = this.right;\n        } else {\n            startPixel = this.top;\n            endPixel = this.bottom;\n            reversePixels = !reversePixels;\n        }\n        this._startPixel = startPixel;\n        this._endPixel = endPixel;\n        this._reversePixels = reversePixels;\n        this._length = endPixel - startPixel;\n        this._alignToPixels = this.options.alignToPixels;\n    }\n    afterUpdate() {\n        callback(this.options.afterUpdate, [\n            this\n        ]);\n    }\n    beforeSetDimensions() {\n        callback(this.options.beforeSetDimensions, [\n            this\n        ]);\n    }\n    setDimensions() {\n        if (this.isHorizontal()) {\n            this.width = this.maxWidth;\n            this.left = 0;\n            this.right = this.width;\n        } else {\n            this.height = this.maxHeight;\n            this.top = 0;\n            this.bottom = this.height;\n        }\n        this.paddingLeft = 0;\n        this.paddingTop = 0;\n        this.paddingRight = 0;\n        this.paddingBottom = 0;\n    }\n    afterSetDimensions() {\n        callback(this.options.afterSetDimensions, [\n            this\n        ]);\n    }\n    _callHooks(name) {\n        this.chart.notifyPlugins(name, this.getContext());\n        callback(this.options[name], [\n            this\n        ]);\n    }\n    beforeDataLimits() {\n        this._callHooks('beforeDataLimits');\n    }\n    determineDataLimits() {}\n    afterDataLimits() {\n        this._callHooks('afterDataLimits');\n    }\n    beforeBuildTicks() {\n        this._callHooks('beforeBuildTicks');\n    }\n buildTicks() {\n        return [];\n    }\n    afterBuildTicks() {\n        this._callHooks('afterBuildTicks');\n    }\n    beforeTickToLabelConversion() {\n        callback(this.options.beforeTickToLabelConversion, [\n            this\n        ]);\n    }\n generateTickLabels(ticks) {\n        const tickOpts = this.options.ticks;\n        let i, ilen, tick;\n        for(i = 0, ilen = ticks.length; i < ilen; i++){\n            tick = ticks[i];\n            tick.label = callback(tickOpts.callback, [\n                tick.value,\n                i,\n                ticks\n            ], this);\n        }\n    }\n    afterTickToLabelConversion() {\n        callback(this.options.afterTickToLabelConversion, [\n            this\n        ]);\n    }\n    beforeCalculateLabelRotation() {\n        callback(this.options.beforeCalculateLabelRotation, [\n            this\n        ]);\n    }\n    calculateLabelRotation() {\n        const options = this.options;\n        const tickOpts = options.ticks;\n        const numTicks = getTicksLimit(this.ticks.length, options.ticks.maxTicksLimit);\n        const minRotation = tickOpts.minRotation || 0;\n        const maxRotation = tickOpts.maxRotation;\n        let labelRotation = minRotation;\n        let tickWidth, maxHeight, maxLabelDiagonal;\n        if (!this._isVisible() || !tickOpts.display || minRotation >= maxRotation || numTicks <= 1 || !this.isHorizontal()) {\n            this.labelRotation = minRotation;\n            return;\n        }\n        const labelSizes = this._getLabelSizes();\n        const maxLabelWidth = labelSizes.widest.width;\n        const maxLabelHeight = labelSizes.highest.height;\n        const maxWidth = _limitValue(this.chart.width - maxLabelWidth, 0, this.maxWidth);\n        tickWidth = options.offset ? this.maxWidth / numTicks : maxWidth / (numTicks - 1);\n        if (maxLabelWidth + 6 > tickWidth) {\n            tickWidth = maxWidth / (numTicks - (options.offset ? 0.5 : 1));\n            maxHeight = this.maxHeight - getTickMarkLength(options.grid) - tickOpts.padding - getTitleHeight(options.title, this.chart.options.font);\n            maxLabelDiagonal = Math.sqrt(maxLabelWidth * maxLabelWidth + maxLabelHeight * maxLabelHeight);\n            labelRotation = toDegrees(Math.min(Math.asin(_limitValue((labelSizes.highest.height + 6) / tickWidth, -1, 1)), Math.asin(_limitValue(maxHeight / maxLabelDiagonal, -1, 1)) - Math.asin(_limitValue(maxLabelHeight / maxLabelDiagonal, -1, 1))));\n            labelRotation = Math.max(minRotation, Math.min(maxRotation, labelRotation));\n        }\n        this.labelRotation = labelRotation;\n    }\n    afterCalculateLabelRotation() {\n        callback(this.options.afterCalculateLabelRotation, [\n            this\n        ]);\n    }\n    afterAutoSkip() {}\n    beforeFit() {\n        callback(this.options.beforeFit, [\n            this\n        ]);\n    }\n    fit() {\n        const minSize = {\n            width: 0,\n            height: 0\n        };\n        const { chart , options: { ticks: tickOpts , title: titleOpts , grid: gridOpts  }  } = this;\n        const display = this._isVisible();\n        const isHorizontal = this.isHorizontal();\n        if (display) {\n            const titleHeight = getTitleHeight(titleOpts, chart.options.font);\n            if (isHorizontal) {\n                minSize.width = this.maxWidth;\n                minSize.height = getTickMarkLength(gridOpts) + titleHeight;\n            } else {\n                minSize.height = this.maxHeight;\n                minSize.width = getTickMarkLength(gridOpts) + titleHeight;\n            }\n            if (tickOpts.display && this.ticks.length) {\n                const { first , last , widest , highest  } = this._getLabelSizes();\n                const tickPadding = tickOpts.padding * 2;\n                const angleRadians = toRadians(this.labelRotation);\n                const cos = Math.cos(angleRadians);\n                const sin = Math.sin(angleRadians);\n                if (isHorizontal) {\n                    const labelHeight = tickOpts.mirror ? 0 : sin * widest.width + cos * highest.height;\n                    minSize.height = Math.min(this.maxHeight, minSize.height + labelHeight + tickPadding);\n                } else {\n                    const labelWidth = tickOpts.mirror ? 0 : cos * widest.width + sin * highest.height;\n                    minSize.width = Math.min(this.maxWidth, minSize.width + labelWidth + tickPadding);\n                }\n                this._calculatePadding(first, last, sin, cos);\n            }\n        }\n        this._handleMargins();\n        if (isHorizontal) {\n            this.width = this._length = chart.width - this._margins.left - this._margins.right;\n            this.height = minSize.height;\n        } else {\n            this.width = minSize.width;\n            this.height = this._length = chart.height - this._margins.top - this._margins.bottom;\n        }\n    }\n    _calculatePadding(first, last, sin, cos) {\n        const { ticks: { align , padding  } , position  } = this.options;\n        const isRotated = this.labelRotation !== 0;\n        const labelsBelowTicks = position !== 'top' && this.axis === 'x';\n        if (this.isHorizontal()) {\n            const offsetLeft = this.getPixelForTick(0) - this.left;\n            const offsetRight = this.right - this.getPixelForTick(this.ticks.length - 1);\n            let paddingLeft = 0;\n            let paddingRight = 0;\n            if (isRotated) {\n                if (labelsBelowTicks) {\n                    paddingLeft = cos * first.width;\n                    paddingRight = sin * last.height;\n                } else {\n                    paddingLeft = sin * first.height;\n                    paddingRight = cos * last.width;\n                }\n            } else if (align === 'start') {\n                paddingRight = last.width;\n            } else if (align === 'end') {\n                paddingLeft = first.width;\n            } else if (align !== 'inner') {\n                paddingLeft = first.width / 2;\n                paddingRight = last.width / 2;\n            }\n            this.paddingLeft = Math.max((paddingLeft - offsetLeft + padding) * this.width / (this.width - offsetLeft), 0);\n            this.paddingRight = Math.max((paddingRight - offsetRight + padding) * this.width / (this.width - offsetRight), 0);\n        } else {\n            let paddingTop = last.height / 2;\n            let paddingBottom = first.height / 2;\n            if (align === 'start') {\n                paddingTop = 0;\n                paddingBottom = first.height;\n            } else if (align === 'end') {\n                paddingTop = last.height;\n                paddingBottom = 0;\n            }\n            this.paddingTop = paddingTop + padding;\n            this.paddingBottom = paddingBottom + padding;\n        }\n    }\n _handleMargins() {\n        if (this._margins) {\n            this._margins.left = Math.max(this.paddingLeft, this._margins.left);\n            this._margins.top = Math.max(this.paddingTop, this._margins.top);\n            this._margins.right = Math.max(this.paddingRight, this._margins.right);\n            this._margins.bottom = Math.max(this.paddingBottom, this._margins.bottom);\n        }\n    }\n    afterFit() {\n        callback(this.options.afterFit, [\n            this\n        ]);\n    }\n isHorizontal() {\n        const { axis , position  } = this.options;\n        return position === 'top' || position === 'bottom' || axis === 'x';\n    }\n isFullSize() {\n        return this.options.fullSize;\n    }\n _convertTicksToLabels(ticks) {\n        this.beforeTickToLabelConversion();\n        this.generateTickLabels(ticks);\n        let i, ilen;\n        for(i = 0, ilen = ticks.length; i < ilen; i++){\n            if (isNullOrUndef(ticks[i].label)) {\n                ticks.splice(i, 1);\n                ilen--;\n                i--;\n            }\n        }\n        this.afterTickToLabelConversion();\n    }\n _getLabelSizes() {\n        let labelSizes = this._labelSizes;\n        if (!labelSizes) {\n            const sampleSize = this.options.ticks.sampleSize;\n            let ticks = this.ticks;\n            if (sampleSize < ticks.length) {\n                ticks = sample(ticks, sampleSize);\n            }\n            this._labelSizes = labelSizes = this._computeLabelSizes(ticks, ticks.length, this.options.ticks.maxTicksLimit);\n        }\n        return labelSizes;\n    }\n _computeLabelSizes(ticks, length, maxTicksLimit) {\n        const { ctx , _longestTextCache: caches  } = this;\n        const widths = [];\n        const heights = [];\n        const increment = Math.floor(length / getTicksLimit(length, maxTicksLimit));\n        let widestLabelSize = 0;\n        let highestLabelSize = 0;\n        let i, j, jlen, label, tickFont, fontString, cache, lineHeight, width, height, nestedLabel;\n        for(i = 0; i < length; i += increment){\n            label = ticks[i].label;\n            tickFont = this._resolveTickFontOptions(i);\n            ctx.font = fontString = tickFont.string;\n            cache = caches[fontString] = caches[fontString] || {\n                data: {},\n                gc: []\n            };\n            lineHeight = tickFont.lineHeight;\n            width = height = 0;\n            if (!isNullOrUndef(label) && !isArray(label)) {\n                width = _measureText(ctx, cache.data, cache.gc, width, label);\n                height = lineHeight;\n            } else if (isArray(label)) {\n                for(j = 0, jlen = label.length; j < jlen; ++j){\n                    nestedLabel =  label[j];\n                    if (!isNullOrUndef(nestedLabel) && !isArray(nestedLabel)) {\n                        width = _measureText(ctx, cache.data, cache.gc, width, nestedLabel);\n                        height += lineHeight;\n                    }\n                }\n            }\n            widths.push(width);\n            heights.push(height);\n            widestLabelSize = Math.max(width, widestLabelSize);\n            highestLabelSize = Math.max(height, highestLabelSize);\n        }\n        garbageCollect(caches, length);\n        const widest = widths.indexOf(widestLabelSize);\n        const highest = heights.indexOf(highestLabelSize);\n        const valueAt = (idx)=>({\n                width: widths[idx] || 0,\n                height: heights[idx] || 0\n            });\n        return {\n            first: valueAt(0),\n            last: valueAt(length - 1),\n            widest: valueAt(widest),\n            highest: valueAt(highest),\n            widths,\n            heights\n        };\n    }\n getLabelForValue(value) {\n        return value;\n    }\n getPixelForValue(value, index) {\n        return NaN;\n    }\n getValueForPixel(pixel) {}\n getPixelForTick(index) {\n        const ticks = this.ticks;\n        if (index < 0 || index > ticks.length - 1) {\n            return null;\n        }\n        return this.getPixelForValue(ticks[index].value);\n    }\n getPixelForDecimal(decimal) {\n        if (this._reversePixels) {\n            decimal = 1 - decimal;\n        }\n        const pixel = this._startPixel + decimal * this._length;\n        return _int16Range(this._alignToPixels ? _alignPixel(this.chart, pixel, 0) : pixel);\n    }\n getDecimalForPixel(pixel) {\n        const decimal = (pixel - this._startPixel) / this._length;\n        return this._reversePixels ? 1 - decimal : decimal;\n    }\n getBasePixel() {\n        return this.getPixelForValue(this.getBaseValue());\n    }\n getBaseValue() {\n        const { min , max  } = this;\n        return min < 0 && max < 0 ? max : min > 0 && max > 0 ? min : 0;\n    }\n getContext(index) {\n        const ticks = this.ticks || [];\n        if (index >= 0 && index < ticks.length) {\n            const tick = ticks[index];\n            return tick.$context || (tick.$context = createTickContext(this.getContext(), index, tick));\n        }\n        return this.$context || (this.$context = createScaleContext(this.chart.getContext(), this));\n    }\n _tickSize() {\n        const optionTicks = this.options.ticks;\n        const rot = toRadians(this.labelRotation);\n        const cos = Math.abs(Math.cos(rot));\n        const sin = Math.abs(Math.sin(rot));\n        const labelSizes = this._getLabelSizes();\n        const padding = optionTicks.autoSkipPadding || 0;\n        const w = labelSizes ? labelSizes.widest.width + padding : 0;\n        const h = labelSizes ? labelSizes.highest.height + padding : 0;\n        return this.isHorizontal() ? h * cos > w * sin ? w / cos : h / sin : h * sin < w * cos ? h / cos : w / sin;\n    }\n _isVisible() {\n        const display = this.options.display;\n        if (display !== 'auto') {\n            return !!display;\n        }\n        return this.getMatchingVisibleMetas().length > 0;\n    }\n _computeGridLineItems(chartArea) {\n        const axis = this.axis;\n        const chart = this.chart;\n        const options = this.options;\n        const { grid , position , border  } = options;\n        const offset = grid.offset;\n        const isHorizontal = this.isHorizontal();\n        const ticks = this.ticks;\n        const ticksLength = ticks.length + (offset ? 1 : 0);\n        const tl = getTickMarkLength(grid);\n        const items = [];\n        const borderOpts = border.setContext(this.getContext());\n        const axisWidth = borderOpts.display ? borderOpts.width : 0;\n        const axisHalfWidth = axisWidth / 2;\n        const alignBorderValue = function(pixel) {\n            return _alignPixel(chart, pixel, axisWidth);\n        };\n        let borderValue, i, lineValue, alignedLineValue;\n        let tx1, ty1, tx2, ty2, x1, y1, x2, y2;\n        if (position === 'top') {\n            borderValue = alignBorderValue(this.bottom);\n            ty1 = this.bottom - tl;\n            ty2 = borderValue - axisHalfWidth;\n            y1 = alignBorderValue(chartArea.top) + axisHalfWidth;\n            y2 = chartArea.bottom;\n        } else if (position === 'bottom') {\n            borderValue = alignBorderValue(this.top);\n            y1 = chartArea.top;\n            y2 = alignBorderValue(chartArea.bottom) - axisHalfWidth;\n            ty1 = borderValue + axisHalfWidth;\n            ty2 = this.top + tl;\n        } else if (position === 'left') {\n            borderValue = alignBorderValue(this.right);\n            tx1 = this.right - tl;\n            tx2 = borderValue - axisHalfWidth;\n            x1 = alignBorderValue(chartArea.left) + axisHalfWidth;\n            x2 = chartArea.right;\n        } else if (position === 'right') {\n            borderValue = alignBorderValue(this.left);\n            x1 = chartArea.left;\n            x2 = alignBorderValue(chartArea.right) - axisHalfWidth;\n            tx1 = borderValue + axisHalfWidth;\n            tx2 = this.left + tl;\n        } else if (axis === 'x') {\n            if (position === 'center') {\n                borderValue = alignBorderValue((chartArea.top + chartArea.bottom) / 2 + 0.5);\n            } else if (isObject(position)) {\n                const positionAxisID = Object.keys(position)[0];\n                const value = position[positionAxisID];\n                borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n            }\n            y1 = chartArea.top;\n            y2 = chartArea.bottom;\n            ty1 = borderValue + axisHalfWidth;\n            ty2 = ty1 + tl;\n        } else if (axis === 'y') {\n            if (position === 'center') {\n                borderValue = alignBorderValue((chartArea.left + chartArea.right) / 2);\n            } else if (isObject(position)) {\n                const positionAxisID = Object.keys(position)[0];\n                const value = position[positionAxisID];\n                borderValue = alignBorderValue(this.chart.scales[positionAxisID].getPixelForValue(value));\n            }\n            tx1 = borderValue - axisHalfWidth;\n            tx2 = tx1 - tl;\n            x1 = chartArea.left;\n            x2 = chartArea.right;\n        }\n        const limit = valueOrDefault(options.ticks.maxTicksLimit, ticksLength);\n        const step = Math.max(1, Math.ceil(ticksLength / limit));\n        for(i = 0; i < ticksLength; i += step){\n            const context = this.getContext(i);\n            const optsAtIndex = grid.setContext(context);\n            const optsAtIndexBorder = border.setContext(context);\n            const lineWidth = optsAtIndex.lineWidth;\n            const lineColor = optsAtIndex.color;\n            const borderDash = optsAtIndexBorder.dash || [];\n            const borderDashOffset = optsAtIndexBorder.dashOffset;\n            const tickWidth = optsAtIndex.tickWidth;\n            const tickColor = optsAtIndex.tickColor;\n            const tickBorderDash = optsAtIndex.tickBorderDash || [];\n            const tickBorderDashOffset = optsAtIndex.tickBorderDashOffset;\n            lineValue = getPixelForGridLine(this, i, offset);\n            if (lineValue === undefined) {\n                continue;\n            }\n            alignedLineValue = _alignPixel(chart, lineValue, lineWidth);\n            if (isHorizontal) {\n                tx1 = tx2 = x1 = x2 = alignedLineValue;\n            } else {\n                ty1 = ty2 = y1 = y2 = alignedLineValue;\n            }\n            items.push({\n                tx1,\n                ty1,\n                tx2,\n                ty2,\n                x1,\n                y1,\n                x2,\n                y2,\n                width: lineWidth,\n                color: lineColor,\n                borderDash,\n                borderDashOffset,\n                tickWidth,\n                tickColor,\n                tickBorderDash,\n                tickBorderDashOffset\n            });\n        }\n        this._ticksLength = ticksLength;\n        this._borderValue = borderValue;\n        return items;\n    }\n _computeLabelItems(chartArea) {\n        const axis = this.axis;\n        const options = this.options;\n        const { position , ticks: optionTicks  } = options;\n        const isHorizontal = this.isHorizontal();\n        const ticks = this.ticks;\n        const { align , crossAlign , padding , mirror  } = optionTicks;\n        const tl = getTickMarkLength(options.grid);\n        const tickAndPadding = tl + padding;\n        const hTickAndPadding = mirror ? -padding : tickAndPadding;\n        const rotation = -toRadians(this.labelRotation);\n        const items = [];\n        let i, ilen, tick, label, x, y, textAlign, pixel, font, lineHeight, lineCount, textOffset;\n        let textBaseline = 'middle';\n        if (position === 'top') {\n            y = this.bottom - hTickAndPadding;\n            textAlign = this._getXAxisLabelAlignment();\n        } else if (position === 'bottom') {\n            y = this.top + hTickAndPadding;\n            textAlign = this._getXAxisLabelAlignment();\n        } else if (position === 'left') {\n            const ret = this._getYAxisLabelAlignment(tl);\n            textAlign = ret.textAlign;\n            x = ret.x;\n        } else if (position === 'right') {\n            const ret = this._getYAxisLabelAlignment(tl);\n            textAlign = ret.textAlign;\n            x = ret.x;\n        } else if (axis === 'x') {\n            if (position === 'center') {\n                y = (chartArea.top + chartArea.bottom) / 2 + tickAndPadding;\n            } else if (isObject(position)) {\n                const positionAxisID = Object.keys(position)[0];\n                const value = position[positionAxisID];\n                y = this.chart.scales[positionAxisID].getPixelForValue(value) + tickAndPadding;\n            }\n            textAlign = this._getXAxisLabelAlignment();\n        } else if (axis === 'y') {\n            if (position === 'center') {\n                x = (chartArea.left + chartArea.right) / 2 - tickAndPadding;\n            } else if (isObject(position)) {\n                const positionAxisID = Object.keys(position)[0];\n                const value = position[positionAxisID];\n                x = this.chart.scales[positionAxisID].getPixelForValue(value);\n            }\n            textAlign = this._getYAxisLabelAlignment(tl).textAlign;\n        }\n        if (axis === 'y') {\n            if (align === 'start') {\n                textBaseline = 'top';\n            } else if (align === 'end') {\n                textBaseline = 'bottom';\n            }\n        }\n        const labelSizes = this._getLabelSizes();\n        for(i = 0, ilen = ticks.length; i < ilen; ++i){\n            tick = ticks[i];\n            label = tick.label;\n            const optsAtIndex = optionTicks.setContext(this.getContext(i));\n            pixel = this.getPixelForTick(i) + optionTicks.labelOffset;\n            font = this._resolveTickFontOptions(i);\n            lineHeight = font.lineHeight;\n            lineCount = isArray(label) ? label.length : 1;\n            const halfCount = lineCount / 2;\n            const color = optsAtIndex.color;\n            const strokeColor = optsAtIndex.textStrokeColor;\n            const strokeWidth = optsAtIndex.textStrokeWidth;\n            let tickTextAlign = textAlign;\n            if (isHorizontal) {\n                x = pixel;\n                if (textAlign === 'inner') {\n                    if (i === ilen - 1) {\n                        tickTextAlign = !this.options.reverse ? 'right' : 'left';\n                    } else if (i === 0) {\n                        tickTextAlign = !this.options.reverse ? 'left' : 'right';\n                    } else {\n                        tickTextAlign = 'center';\n                    }\n                }\n                if (position === 'top') {\n                    if (crossAlign === 'near' || rotation !== 0) {\n                        textOffset = -lineCount * lineHeight + lineHeight / 2;\n                    } else if (crossAlign === 'center') {\n                        textOffset = -labelSizes.highest.height / 2 - halfCount * lineHeight + lineHeight;\n                    } else {\n                        textOffset = -labelSizes.highest.height + lineHeight / 2;\n                    }\n                } else {\n                    if (crossAlign === 'near' || rotation !== 0) {\n                        textOffset = lineHeight / 2;\n                    } else if (crossAlign === 'center') {\n                        textOffset = labelSizes.highest.height / 2 - halfCount * lineHeight;\n                    } else {\n                        textOffset = labelSizes.highest.height - lineCount * lineHeight;\n                    }\n                }\n                if (mirror) {\n                    textOffset *= -1;\n                }\n                if (rotation !== 0 && !optsAtIndex.showLabelBackdrop) {\n                    x += lineHeight / 2 * Math.sin(rotation);\n                }\n            } else {\n                y = pixel;\n                textOffset = (1 - lineCount) * lineHeight / 2;\n            }\n            let backdrop;\n            if (optsAtIndex.showLabelBackdrop) {\n                const labelPadding = toPadding(optsAtIndex.backdropPadding);\n                const height = labelSizes.heights[i];\n                const width = labelSizes.widths[i];\n                let top = textOffset - labelPadding.top;\n                let left = 0 - labelPadding.left;\n                switch(textBaseline){\n                    case 'middle':\n                        top -= height / 2;\n                        break;\n                    case 'bottom':\n                        top -= height;\n                        break;\n                }\n                switch(textAlign){\n                    case 'center':\n                        left -= width / 2;\n                        break;\n                    case 'right':\n                        left -= width;\n                        break;\n                    case 'inner':\n                        if (i === ilen - 1) {\n                            left -= width;\n                        } else if (i > 0) {\n                            left -= width / 2;\n                        }\n                        break;\n                }\n                backdrop = {\n                    left,\n                    top,\n                    width: width + labelPadding.width,\n                    height: height + labelPadding.height,\n                    color: optsAtIndex.backdropColor\n                };\n            }\n            items.push({\n                label,\n                font,\n                textOffset,\n                options: {\n                    rotation,\n                    color,\n                    strokeColor,\n                    strokeWidth,\n                    textAlign: tickTextAlign,\n                    textBaseline,\n                    translation: [\n                        x,\n                        y\n                    ],\n                    backdrop\n                }\n            });\n        }\n        return items;\n    }\n    _getXAxisLabelAlignment() {\n        const { position , ticks  } = this.options;\n        const rotation = -toRadians(this.labelRotation);\n        if (rotation) {\n            return position === 'top' ? 'left' : 'right';\n        }\n        let align = 'center';\n        if (ticks.align === 'start') {\n            align = 'left';\n        } else if (ticks.align === 'end') {\n            align = 'right';\n        } else if (ticks.align === 'inner') {\n            align = 'inner';\n        }\n        return align;\n    }\n    _getYAxisLabelAlignment(tl) {\n        const { position , ticks: { crossAlign , mirror , padding  }  } = this.options;\n        const labelSizes = this._getLabelSizes();\n        const tickAndPadding = tl + padding;\n        const widest = labelSizes.widest.width;\n        let textAlign;\n        let x;\n        if (position === 'left') {\n            if (mirror) {\n                x = this.right + padding;\n                if (crossAlign === 'near') {\n                    textAlign = 'left';\n                } else if (crossAlign === 'center') {\n                    textAlign = 'center';\n                    x += widest / 2;\n                } else {\n                    textAlign = 'right';\n                    x += widest;\n                }\n            } else {\n                x = this.right - tickAndPadding;\n                if (crossAlign === 'near') {\n                    textAlign = 'right';\n                } else if (crossAlign === 'center') {\n                    textAlign = 'center';\n                    x -= widest / 2;\n                } else {\n                    textAlign = 'left';\n                    x = this.left;\n                }\n            }\n        } else if (position === 'right') {\n            if (mirror) {\n                x = this.left + padding;\n                if (crossAlign === 'near') {\n                    textAlign = 'right';\n                } else if (crossAlign === 'center') {\n                    textAlign = 'center';\n                    x -= widest / 2;\n                } else {\n                    textAlign = 'left';\n                    x -= widest;\n                }\n            } else {\n                x = this.left + tickAndPadding;\n                if (crossAlign === 'near') {\n                    textAlign = 'left';\n                } else if (crossAlign === 'center') {\n                    textAlign = 'center';\n                    x += widest / 2;\n                } else {\n                    textAlign = 'right';\n                    x = this.right;\n                }\n            }\n        } else {\n            textAlign = 'right';\n        }\n        return {\n            textAlign,\n            x\n        };\n    }\n _computeLabelArea() {\n        if (this.options.ticks.mirror) {\n            return;\n        }\n        const chart = this.chart;\n        const position = this.options.position;\n        if (position === 'left' || position === 'right') {\n            return {\n                top: 0,\n                left: this.left,\n                bottom: chart.height,\n                right: this.right\n            };\n        }\n        if (position === 'top' || position === 'bottom') {\n            return {\n                top: this.top,\n                left: 0,\n                bottom: this.bottom,\n                right: chart.width\n            };\n        }\n    }\n drawBackground() {\n        const { ctx , options: { backgroundColor  } , left , top , width , height  } = this;\n        if (backgroundColor) {\n            ctx.save();\n            ctx.fillStyle = backgroundColor;\n            ctx.fillRect(left, top, width, height);\n            ctx.restore();\n        }\n    }\n    getLineWidthForValue(value) {\n        const grid = this.options.grid;\n        if (!this._isVisible() || !grid.display) {\n            return 0;\n        }\n        const ticks = this.ticks;\n        const index = ticks.findIndex((t)=>t.value === value);\n        if (index >= 0) {\n            const opts = grid.setContext(this.getContext(index));\n            return opts.lineWidth;\n        }\n        return 0;\n    }\n drawGrid(chartArea) {\n        const grid = this.options.grid;\n        const ctx = this.ctx;\n        const items = this._gridLineItems || (this._gridLineItems = this._computeGridLineItems(chartArea));\n        let i, ilen;\n        const drawLine = (p1, p2, style)=>{\n            if (!style.width || !style.color) {\n                return;\n            }\n            ctx.save();\n            ctx.lineWidth = style.width;\n            ctx.strokeStyle = style.color;\n            ctx.setLineDash(style.borderDash || []);\n            ctx.lineDashOffset = style.borderDashOffset;\n            ctx.beginPath();\n            ctx.moveTo(p1.x, p1.y);\n            ctx.lineTo(p2.x, p2.y);\n            ctx.stroke();\n            ctx.restore();\n        };\n        if (grid.display) {\n            for(i = 0, ilen = items.length; i < ilen; ++i){\n                const item = items[i];\n                if (grid.drawOnChartArea) {\n                    drawLine({\n                        x: item.x1,\n                        y: item.y1\n                    }, {\n                        x: item.x2,\n                        y: item.y2\n                    }, item);\n                }\n                if (grid.drawTicks) {\n                    drawLine({\n                        x: item.tx1,\n                        y: item.ty1\n                    }, {\n                        x: item.tx2,\n                        y: item.ty2\n                    }, {\n                        color: item.tickColor,\n                        width: item.tickWidth,\n                        borderDash: item.tickBorderDash,\n                        borderDashOffset: item.tickBorderDashOffset\n                    });\n                }\n            }\n        }\n    }\n drawBorder() {\n        const { chart , ctx , options: { border , grid  }  } = this;\n        const borderOpts = border.setContext(this.getContext());\n        const axisWidth = border.display ? borderOpts.width : 0;\n        if (!axisWidth) {\n            return;\n        }\n        const lastLineWidth = grid.setContext(this.getContext(0)).lineWidth;\n        const borderValue = this._borderValue;\n        let x1, x2, y1, y2;\n        if (this.isHorizontal()) {\n            x1 = _alignPixel(chart, this.left, axisWidth) - axisWidth / 2;\n            x2 = _alignPixel(chart, this.right, lastLineWidth) + lastLineWidth / 2;\n            y1 = y2 = borderValue;\n        } else {\n            y1 = _alignPixel(chart, this.top, axisWidth) - axisWidth / 2;\n            y2 = _alignPixel(chart, this.bottom, lastLineWidth) + lastLineWidth / 2;\n            x1 = x2 = borderValue;\n        }\n        ctx.save();\n        ctx.lineWidth = borderOpts.width;\n        ctx.strokeStyle = borderOpts.color;\n        ctx.beginPath();\n        ctx.moveTo(x1, y1);\n        ctx.lineTo(x2, y2);\n        ctx.stroke();\n        ctx.restore();\n    }\n drawLabels(chartArea) {\n        const optionTicks = this.options.ticks;\n        if (!optionTicks.display) {\n            return;\n        }\n        const ctx = this.ctx;\n        const area = this._computeLabelArea();\n        if (area) {\n            clipArea(ctx, area);\n        }\n        const items = this.getLabelItems(chartArea);\n        for (const item of items){\n            const renderTextOptions = item.options;\n            const tickFont = item.font;\n            const label = item.label;\n            const y = item.textOffset;\n            renderText(ctx, label, 0, y, tickFont, renderTextOptions);\n        }\n        if (area) {\n            unclipArea(ctx);\n        }\n    }\n drawTitle() {\n        const { ctx , options: { position , title , reverse  }  } = this;\n        if (!title.display) {\n            return;\n        }\n        const font = toFont(title.font);\n        const padding = toPadding(title.padding);\n        const align = title.align;\n        let offset = font.lineHeight / 2;\n        if (position === 'bottom' || position === 'center' || isObject(position)) {\n            offset += padding.bottom;\n            if (isArray(title.text)) {\n                offset += font.lineHeight * (title.text.length - 1);\n            }\n        } else {\n            offset += padding.top;\n        }\n        const { titleX , titleY , maxWidth , rotation  } = titleArgs(this, offset, position, align);\n        renderText(ctx, title.text, 0, 0, font, {\n            color: title.color,\n            maxWidth,\n            rotation,\n            textAlign: titleAlign(align, position, reverse),\n            textBaseline: 'middle',\n            translation: [\n                titleX,\n                titleY\n            ]\n        });\n    }\n    draw(chartArea) {\n        if (!this._isVisible()) {\n            return;\n        }\n        this.drawBackground();\n        this.drawGrid(chartArea);\n        this.drawBorder();\n        this.drawTitle();\n        this.drawLabels(chartArea);\n    }\n _layers() {\n        const opts = this.options;\n        const tz = opts.ticks && opts.ticks.z || 0;\n        const gz = valueOrDefault(opts.grid && opts.grid.z, -1);\n        const bz = valueOrDefault(opts.border && opts.border.z, 0);\n        if (!this._isVisible() || this.draw !== Scale.prototype.draw) {\n            return [\n                {\n                    z: tz,\n                    draw: (chartArea)=>{\n                        this.draw(chartArea);\n                    }\n                }\n            ];\n        }\n        return [\n            {\n                z: gz,\n                draw: (chartArea)=>{\n                    this.drawBackground();\n                    this.drawGrid(chartArea);\n                    this.drawTitle();\n                }\n            },\n            {\n                z: bz,\n                draw: ()=>{\n                    this.drawBorder();\n                }\n            },\n            {\n                z: tz,\n                draw: (chartArea)=>{\n                    this.drawLabels(chartArea);\n                }\n            }\n        ];\n    }\n getMatchingVisibleMetas(type) {\n        const metas = this.chart.getSortedVisibleDatasetMetas();\n        const axisID = this.axis + 'AxisID';\n        const result = [];\n        let i, ilen;\n        for(i = 0, ilen = metas.length; i < ilen; ++i){\n            const meta = metas[i];\n            if (meta[axisID] === this.id && (!type || meta.type === type)) {\n                result.push(meta);\n            }\n        }\n        return result;\n    }\n _resolveTickFontOptions(index) {\n        const opts = this.options.ticks.setContext(this.getContext(index));\n        return toFont(opts.font);\n    }\n _maxDigits() {\n        const fontSize = this._resolveTickFontOptions(0).lineHeight;\n        return (this.isHorizontal() ? this.width : this.height) / fontSize;\n    }\n}\n\nclass TypedRegistry {\n    constructor(type, scope, override){\n        this.type = type;\n        this.scope = scope;\n        this.override = override;\n        this.items = Object.create(null);\n    }\n    isForType(type) {\n        return Object.prototype.isPrototypeOf.call(this.type.prototype, type.prototype);\n    }\n register(item) {\n        const proto = Object.getPrototypeOf(item);\n        let parentScope;\n        if (isIChartComponent(proto)) {\n            parentScope = this.register(proto);\n        }\n        const items = this.items;\n        const id = item.id;\n        const scope = this.scope + '.' + id;\n        if (!id) {\n            throw new Error('class does not have id: ' + item);\n        }\n        if (id in items) {\n            return scope;\n        }\n        items[id] = item;\n        registerDefaults(item, scope, parentScope);\n        if (this.override) {\n            defaults.override(item.id, item.overrides);\n        }\n        return scope;\n    }\n get(id) {\n        return this.items[id];\n    }\n unregister(item) {\n        const items = this.items;\n        const id = item.id;\n        const scope = this.scope;\n        if (id in items) {\n            delete items[id];\n        }\n        if (scope && id in defaults[scope]) {\n            delete defaults[scope][id];\n            if (this.override) {\n                delete overrides[id];\n            }\n        }\n    }\n}\nfunction registerDefaults(item, scope, parentScope) {\n    const itemDefaults = merge(Object.create(null), [\n        parentScope ? defaults.get(parentScope) : {},\n        defaults.get(scope),\n        item.defaults\n    ]);\n    defaults.set(scope, itemDefaults);\n    if (item.defaultRoutes) {\n        routeDefaults(scope, item.defaultRoutes);\n    }\n    if (item.descriptors) {\n        defaults.describe(scope, item.descriptors);\n    }\n}\nfunction routeDefaults(scope, routes) {\n    Object.keys(routes).forEach((property)=>{\n        const propertyParts = property.split('.');\n        const sourceName = propertyParts.pop();\n        const sourceScope = [\n            scope\n        ].concat(propertyParts).join('.');\n        const parts = routes[property].split('.');\n        const targetName = parts.pop();\n        const targetScope = parts.join('.');\n        defaults.route(sourceScope, sourceName, targetScope, targetName);\n    });\n}\nfunction isIChartComponent(proto) {\n    return 'id' in proto && 'defaults' in proto;\n}\n\nclass Registry {\n    constructor(){\n        this.controllers = new TypedRegistry(DatasetController, 'datasets', true);\n        this.elements = new TypedRegistry(Element, 'elements');\n        this.plugins = new TypedRegistry(Object, 'plugins');\n        this.scales = new TypedRegistry(Scale, 'scales');\n        this._typedRegistries = [\n            this.controllers,\n            this.scales,\n            this.elements\n        ];\n    }\n add(...args) {\n        this._each('register', args);\n    }\n    remove(...args) {\n        this._each('unregister', args);\n    }\n addControllers(...args) {\n        this._each('register', args, this.controllers);\n    }\n addElements(...args) {\n        this._each('register', args, this.elements);\n    }\n addPlugins(...args) {\n        this._each('register', args, this.plugins);\n    }\n addScales(...args) {\n        this._each('register', args, this.scales);\n    }\n getController(id) {\n        return this._get(id, this.controllers, 'controller');\n    }\n getElement(id) {\n        return this._get(id, this.elements, 'element');\n    }\n getPlugin(id) {\n        return this._get(id, this.plugins, 'plugin');\n    }\n getScale(id) {\n        return this._get(id, this.scales, 'scale');\n    }\n removeControllers(...args) {\n        this._each('unregister', args, this.controllers);\n    }\n removeElements(...args) {\n        this._each('unregister', args, this.elements);\n    }\n removePlugins(...args) {\n        this._each('unregister', args, this.plugins);\n    }\n removeScales(...args) {\n        this._each('unregister', args, this.scales);\n    }\n _each(method, args, typedRegistry) {\n        [\n            ...args\n        ].forEach((arg)=>{\n            const reg = typedRegistry || this._getRegistryForType(arg);\n            if (typedRegistry || reg.isForType(arg) || reg === this.plugins && arg.id) {\n                this._exec(method, reg, arg);\n            } else {\n                each(arg, (item)=>{\n                    const itemReg = typedRegistry || this._getRegistryForType(item);\n                    this._exec(method, itemReg, item);\n                });\n            }\n        });\n    }\n _exec(method, registry, component) {\n        const camelMethod = _capitalize(method);\n        callback(component['before' + camelMethod], [], component);\n        registry[method](component);\n        callback(component['after' + camelMethod], [], component);\n    }\n _getRegistryForType(type) {\n        for(let i = 0; i < this._typedRegistries.length; i++){\n            const reg = this._typedRegistries[i];\n            if (reg.isForType(type)) {\n                return reg;\n            }\n        }\n        return this.plugins;\n    }\n _get(id, typedRegistry, type) {\n        const item = typedRegistry.get(id);\n        if (item === undefined) {\n            throw new Error('\"' + id + '\" is not a registered ' + type + '.');\n        }\n        return item;\n    }\n}\nvar registry = /* #__PURE__ */ new Registry();\n\nclass PluginService {\n    constructor(){\n        this._init = [];\n    }\n notify(chart, hook, args, filter) {\n        if (hook === 'beforeInit') {\n            this._init = this._createDescriptors(chart, true);\n            this._notify(this._init, chart, 'install');\n        }\n        const descriptors = filter ? this._descriptors(chart).filter(filter) : this._descriptors(chart);\n        const result = this._notify(descriptors, chart, hook, args);\n        if (hook === 'afterDestroy') {\n            this._notify(descriptors, chart, 'stop');\n            this._notify(this._init, chart, 'uninstall');\n        }\n        return result;\n    }\n _notify(descriptors, chart, hook, args) {\n        args = args || {};\n        for (const descriptor of descriptors){\n            const plugin = descriptor.plugin;\n            const method = plugin[hook];\n            const params = [\n                chart,\n                args,\n                descriptor.options\n            ];\n            if (callback(method, params, plugin) === false && args.cancelable) {\n                return false;\n            }\n        }\n        return true;\n    }\n    invalidate() {\n        if (!isNullOrUndef(this._cache)) {\n            this._oldCache = this._cache;\n            this._cache = undefined;\n        }\n    }\n _descriptors(chart) {\n        if (this._cache) {\n            return this._cache;\n        }\n        const descriptors = this._cache = this._createDescriptors(chart);\n        this._notifyStateChanges(chart);\n        return descriptors;\n    }\n    _createDescriptors(chart, all) {\n        const config = chart && chart.config;\n        const options = valueOrDefault(config.options && config.options.plugins, {});\n        const plugins = allPlugins(config);\n        return options === false && !all ? [] : createDescriptors(chart, plugins, options, all);\n    }\n _notifyStateChanges(chart) {\n        const previousDescriptors = this._oldCache || [];\n        const descriptors = this._cache;\n        const diff = (a, b)=>a.filter((x)=>!b.some((y)=>x.plugin.id === y.plugin.id));\n        this._notify(diff(previousDescriptors, descriptors), chart, 'stop');\n        this._notify(diff(descriptors, previousDescriptors), chart, 'start');\n    }\n}\n function allPlugins(config) {\n    const localIds = {};\n    const plugins = [];\n    const keys = Object.keys(registry.plugins.items);\n    for(let i = 0; i < keys.length; i++){\n        plugins.push(registry.getPlugin(keys[i]));\n    }\n    const local = config.plugins || [];\n    for(let i = 0; i < local.length; i++){\n        const plugin = local[i];\n        if (plugins.indexOf(plugin) === -1) {\n            plugins.push(plugin);\n            localIds[plugin.id] = true;\n        }\n    }\n    return {\n        plugins,\n        localIds\n    };\n}\nfunction getOpts(options, all) {\n    if (!all && options === false) {\n        return null;\n    }\n    if (options === true) {\n        return {};\n    }\n    return options;\n}\nfunction createDescriptors(chart, { plugins , localIds  }, options, all) {\n    const result = [];\n    const context = chart.getContext();\n    for (const plugin of plugins){\n        const id = plugin.id;\n        const opts = getOpts(options[id], all);\n        if (opts === null) {\n            continue;\n        }\n        result.push({\n            plugin,\n            options: pluginOpts(chart.config, {\n                plugin,\n                local: localIds[id]\n            }, opts, context)\n        });\n    }\n    return result;\n}\nfunction pluginOpts(config, { plugin , local  }, opts, context) {\n    const keys = config.pluginScopeKeys(plugin);\n    const scopes = config.getOptionScopes(opts, keys);\n    if (local && plugin.defaults) {\n        scopes.push(plugin.defaults);\n    }\n    return config.createResolver(scopes, context, [\n        ''\n    ], {\n        scriptable: false,\n        indexable: false,\n        allKeys: true\n    });\n}\n\nfunction getIndexAxis(type, options) {\n    const datasetDefaults = defaults.datasets[type] || {};\n    const datasetOptions = (options.datasets || {})[type] || {};\n    return datasetOptions.indexAxis || options.indexAxis || datasetDefaults.indexAxis || 'x';\n}\nfunction getAxisFromDefaultScaleID(id, indexAxis) {\n    let axis = id;\n    if (id === '_index_') {\n        axis = indexAxis;\n    } else if (id === '_value_') {\n        axis = indexAxis === 'x' ? 'y' : 'x';\n    }\n    return axis;\n}\nfunction getDefaultScaleIDFromAxis(axis, indexAxis) {\n    return axis === indexAxis ? '_index_' : '_value_';\n}\nfunction idMatchesAxis(id) {\n    if (id === 'x' || id === 'y' || id === 'r') {\n        return id;\n    }\n}\nfunction axisFromPosition(position) {\n    if (position === 'top' || position === 'bottom') {\n        return 'x';\n    }\n    if (position === 'left' || position === 'right') {\n        return 'y';\n    }\n}\nfunction determineAxis(id, ...scaleOptions) {\n    if (idMatchesAxis(id)) {\n        return id;\n    }\n    for (const opts of scaleOptions){\n        const axis = opts.axis || axisFromPosition(opts.position) || id.length > 1 && idMatchesAxis(id[0].toLowerCase());\n        if (axis) {\n            return axis;\n        }\n    }\n    throw new Error(`Cannot determine type of '${id}' axis. Please provide 'axis' or 'position' option.`);\n}\nfunction getAxisFromDataset(id, axis, dataset) {\n    if (dataset[axis + 'AxisID'] === id) {\n        return {\n            axis\n        };\n    }\n}\nfunction retrieveAxisFromDatasets(id, config) {\n    if (config.data && config.data.datasets) {\n        const boundDs = config.data.datasets.filter((d)=>d.xAxisID === id || d.yAxisID === id);\n        if (boundDs.length) {\n            return getAxisFromDataset(id, 'x', boundDs[0]) || getAxisFromDataset(id, 'y', boundDs[0]);\n        }\n    }\n    return {};\n}\nfunction mergeScaleConfig(config, options) {\n    const chartDefaults = overrides[config.type] || {\n        scales: {}\n    };\n    const configScales = options.scales || {};\n    const chartIndexAxis = getIndexAxis(config.type, options);\n    const scales = Object.create(null);\n    Object.keys(configScales).forEach((id)=>{\n        const scaleConf = configScales[id];\n        if (!isObject(scaleConf)) {\n            return console.error(`Invalid scale configuration for scale: ${id}`);\n        }\n        if (scaleConf._proxy) {\n            return console.warn(`Ignoring resolver passed as options for scale: ${id}`);\n        }\n        const axis = determineAxis(id, scaleConf, retrieveAxisFromDatasets(id, config), defaults.scales[scaleConf.type]);\n        const defaultId = getDefaultScaleIDFromAxis(axis, chartIndexAxis);\n        const defaultScaleOptions = chartDefaults.scales || {};\n        scales[id] = mergeIf(Object.create(null), [\n            {\n                axis\n            },\n            scaleConf,\n            defaultScaleOptions[axis],\n            defaultScaleOptions[defaultId]\n        ]);\n    });\n    config.data.datasets.forEach((dataset)=>{\n        const type = dataset.type || config.type;\n        const indexAxis = dataset.indexAxis || getIndexAxis(type, options);\n        const datasetDefaults = overrides[type] || {};\n        const defaultScaleOptions = datasetDefaults.scales || {};\n        Object.keys(defaultScaleOptions).forEach((defaultID)=>{\n            const axis = getAxisFromDefaultScaleID(defaultID, indexAxis);\n            const id = dataset[axis + 'AxisID'] || axis;\n            scales[id] = scales[id] || Object.create(null);\n            mergeIf(scales[id], [\n                {\n                    axis\n                },\n                configScales[id],\n                defaultScaleOptions[defaultID]\n            ]);\n        });\n    });\n    Object.keys(scales).forEach((key)=>{\n        const scale = scales[key];\n        mergeIf(scale, [\n            defaults.scales[scale.type],\n            defaults.scale\n        ]);\n    });\n    return scales;\n}\nfunction initOptions(config) {\n    const options = config.options || (config.options = {});\n    options.plugins = valueOrDefault(options.plugins, {});\n    options.scales = mergeScaleConfig(config, options);\n}\nfunction initData(data) {\n    data = data || {};\n    data.datasets = data.datasets || [];\n    data.labels = data.labels || [];\n    return data;\n}\nfunction initConfig(config) {\n    config = config || {};\n    config.data = initData(config.data);\n    initOptions(config);\n    return config;\n}\nconst keyCache = new Map();\nconst keysCached = new Set();\nfunction cachedKeys(cacheKey, generate) {\n    let keys = keyCache.get(cacheKey);\n    if (!keys) {\n        keys = generate();\n        keyCache.set(cacheKey, keys);\n        keysCached.add(keys);\n    }\n    return keys;\n}\nconst addIfFound = (set, obj, key)=>{\n    const opts = resolveObjectKey(obj, key);\n    if (opts !== undefined) {\n        set.add(opts);\n    }\n};\nclass Config {\n    constructor(config){\n        this._config = initConfig(config);\n        this._scopeCache = new Map();\n        this._resolverCache = new Map();\n    }\n    get platform() {\n        return this._config.platform;\n    }\n    get type() {\n        return this._config.type;\n    }\n    set type(type) {\n        this._config.type = type;\n    }\n    get data() {\n        return this._config.data;\n    }\n    set data(data) {\n        this._config.data = initData(data);\n    }\n    get options() {\n        return this._config.options;\n    }\n    set options(options) {\n        this._config.options = options;\n    }\n    get plugins() {\n        return this._config.plugins;\n    }\n    update() {\n        const config = this._config;\n        this.clearCache();\n        initOptions(config);\n    }\n    clearCache() {\n        this._scopeCache.clear();\n        this._resolverCache.clear();\n    }\n datasetScopeKeys(datasetType) {\n        return cachedKeys(datasetType, ()=>[\n                [\n                    `datasets.${datasetType}`,\n                    ''\n                ]\n            ]);\n    }\n datasetAnimationScopeKeys(datasetType, transition) {\n        return cachedKeys(`${datasetType}.transition.${transition}`, ()=>[\n                [\n                    `datasets.${datasetType}.transitions.${transition}`,\n                    `transitions.${transition}`\n                ],\n                [\n                    `datasets.${datasetType}`,\n                    ''\n                ]\n            ]);\n    }\n datasetElementScopeKeys(datasetType, elementType) {\n        return cachedKeys(`${datasetType}-${elementType}`, ()=>[\n                [\n                    `datasets.${datasetType}.elements.${elementType}`,\n                    `datasets.${datasetType}`,\n                    `elements.${elementType}`,\n                    ''\n                ]\n            ]);\n    }\n pluginScopeKeys(plugin) {\n        const id = plugin.id;\n        const type = this.type;\n        return cachedKeys(`${type}-plugin-${id}`, ()=>[\n                [\n                    `plugins.${id}`,\n                    ...plugin.additionalOptionScopes || []\n                ]\n            ]);\n    }\n _cachedScopes(mainScope, resetCache) {\n        const _scopeCache = this._scopeCache;\n        let cache = _scopeCache.get(mainScope);\n        if (!cache || resetCache) {\n            cache = new Map();\n            _scopeCache.set(mainScope, cache);\n        }\n        return cache;\n    }\n getOptionScopes(mainScope, keyLists, resetCache) {\n        const { options , type  } = this;\n        const cache = this._cachedScopes(mainScope, resetCache);\n        const cached = cache.get(keyLists);\n        if (cached) {\n            return cached;\n        }\n        const scopes = new Set();\n        keyLists.forEach((keys)=>{\n            if (mainScope) {\n                scopes.add(mainScope);\n                keys.forEach((key)=>addIfFound(scopes, mainScope, key));\n            }\n            keys.forEach((key)=>addIfFound(scopes, options, key));\n            keys.forEach((key)=>addIfFound(scopes, overrides[type] || {}, key));\n            keys.forEach((key)=>addIfFound(scopes, defaults, key));\n            keys.forEach((key)=>addIfFound(scopes, descriptors, key));\n        });\n        const array = Array.from(scopes);\n        if (array.length === 0) {\n            array.push(Object.create(null));\n        }\n        if (keysCached.has(keyLists)) {\n            cache.set(keyLists, array);\n        }\n        return array;\n    }\n chartOptionScopes() {\n        const { options , type  } = this;\n        return [\n            options,\n            overrides[type] || {},\n            defaults.datasets[type] || {},\n            {\n                type\n            },\n            defaults,\n            descriptors\n        ];\n    }\n resolveNamedOptions(scopes, names, context, prefixes = [\n        ''\n    ]) {\n        const result = {\n            $shared: true\n        };\n        const { resolver , subPrefixes  } = getResolver(this._resolverCache, scopes, prefixes);\n        let options = resolver;\n        if (needContext(resolver, names)) {\n            result.$shared = false;\n            context = isFunction(context) ? context() : context;\n            const subResolver = this.createResolver(scopes, context, subPrefixes);\n            options = _attachContext(resolver, context, subResolver);\n        }\n        for (const prop of names){\n            result[prop] = options[prop];\n        }\n        return result;\n    }\n createResolver(scopes, context, prefixes = [\n        ''\n    ], descriptorDefaults) {\n        const { resolver  } = getResolver(this._resolverCache, scopes, prefixes);\n        return isObject(context) ? _attachContext(resolver, context, undefined, descriptorDefaults) : resolver;\n    }\n}\nfunction getResolver(resolverCache, scopes, prefixes) {\n    let cache = resolverCache.get(scopes);\n    if (!cache) {\n        cache = new Map();\n        resolverCache.set(scopes, cache);\n    }\n    const cacheKey = prefixes.join();\n    let cached = cache.get(cacheKey);\n    if (!cached) {\n        const resolver = _createResolver(scopes, prefixes);\n        cached = {\n            resolver,\n            subPrefixes: prefixes.filter((p)=>!p.toLowerCase().includes('hover'))\n        };\n        cache.set(cacheKey, cached);\n    }\n    return cached;\n}\nconst hasFunction = (value)=>isObject(value) && Object.getOwnPropertyNames(value).some((key)=>isFunction(value[key]));\nfunction needContext(proxy, names) {\n    const { isScriptable , isIndexable  } = _descriptors(proxy);\n    for (const prop of names){\n        const scriptable = isScriptable(prop);\n        const indexable = isIndexable(prop);\n        const value = (indexable || scriptable) && proxy[prop];\n        if (scriptable && (isFunction(value) || hasFunction(value)) || indexable && isArray(value)) {\n            return true;\n        }\n    }\n    return false;\n}\n\nvar version = \"4.4.8\";\n\nconst KNOWN_POSITIONS = [\n    'top',\n    'bottom',\n    'left',\n    'right',\n    'chartArea'\n];\nfunction positionIsHorizontal(position, axis) {\n    return position === 'top' || position === 'bottom' || KNOWN_POSITIONS.indexOf(position) === -1 && axis === 'x';\n}\nfunction compare2Level(l1, l2) {\n    return function(a, b) {\n        return a[l1] === b[l1] ? a[l2] - b[l2] : a[l1] - b[l1];\n    };\n}\nfunction onAnimationsComplete(context) {\n    const chart = context.chart;\n    const animationOptions = chart.options.animation;\n    chart.notifyPlugins('afterRender');\n    callback(animationOptions && animationOptions.onComplete, [\n        context\n    ], chart);\n}\nfunction onAnimationProgress(context) {\n    const chart = context.chart;\n    const animationOptions = chart.options.animation;\n    callback(animationOptions && animationOptions.onProgress, [\n        context\n    ], chart);\n}\n function getCanvas(item) {\n    if (_isDomSupported() && typeof item === 'string') {\n        item = document.getElementById(item);\n    } else if (item && item.length) {\n        item = item[0];\n    }\n    if (item && item.canvas) {\n        item = item.canvas;\n    }\n    return item;\n}\nconst instances = {};\nconst getChart = (key)=>{\n    const canvas = getCanvas(key);\n    return Object.values(instances).filter((c)=>c.canvas === canvas).pop();\n};\nfunction moveNumericKeys(obj, start, move) {\n    const keys = Object.keys(obj);\n    for (const key of keys){\n        const intKey = +key;\n        if (intKey >= start) {\n            const value = obj[key];\n            delete obj[key];\n            if (move > 0 || intKey > start) {\n                obj[intKey + move] = value;\n            }\n        }\n    }\n}\n function determineLastEvent(e, lastEvent, inChartArea, isClick) {\n    if (!inChartArea || e.type === 'mouseout') {\n        return null;\n    }\n    if (isClick) {\n        return lastEvent;\n    }\n    return e;\n}\nfunction getSizeForArea(scale, chartArea, field) {\n    return scale.options.clip ? scale[field] : chartArea[field];\n}\nfunction getDatasetArea(meta, chartArea) {\n    const { xScale , yScale  } = meta;\n    if (xScale && yScale) {\n        return {\n            left: getSizeForArea(xScale, chartArea, 'left'),\n            right: getSizeForArea(xScale, chartArea, 'right'),\n            top: getSizeForArea(yScale, chartArea, 'top'),\n            bottom: getSizeForArea(yScale, chartArea, 'bottom')\n        };\n    }\n    return chartArea;\n}\nclass Chart {\n    static defaults = defaults;\n    static instances = instances;\n    static overrides = overrides;\n    static registry = registry;\n    static version = version;\n    static getChart = getChart;\n    static register(...items) {\n        registry.add(...items);\n        invalidatePlugins();\n    }\n    static unregister(...items) {\n        registry.remove(...items);\n        invalidatePlugins();\n    }\n    constructor(item, userConfig){\n        const config = this.config = new Config(userConfig);\n        const initialCanvas = getCanvas(item);\n        const existingChart = getChart(initialCanvas);\n        if (existingChart) {\n            throw new Error('Canvas is already in use. Chart with ID \\'' + existingChart.id + '\\'' + ' must be destroyed before the canvas with ID \\'' + existingChart.canvas.id + '\\' can be reused.');\n        }\n        const options = config.createResolver(config.chartOptionScopes(), this.getContext());\n        this.platform = new (config.platform || _detectPlatform(initialCanvas))();\n        this.platform.updateConfig(config);\n        const context = this.platform.acquireContext(initialCanvas, options.aspectRatio);\n        const canvas = context && context.canvas;\n        const height = canvas && canvas.height;\n        const width = canvas && canvas.width;\n        this.id = uid();\n        this.ctx = context;\n        this.canvas = canvas;\n        this.width = width;\n        this.height = height;\n        this._options = options;\n        this._aspectRatio = this.aspectRatio;\n        this._layers = [];\n        this._metasets = [];\n        this._stacks = undefined;\n        this.boxes = [];\n        this.currentDevicePixelRatio = undefined;\n        this.chartArea = undefined;\n        this._active = [];\n        this._lastEvent = undefined;\n        this._listeners = {};\n         this._responsiveListeners = undefined;\n        this._sortedMetasets = [];\n        this.scales = {};\n        this._plugins = new PluginService();\n        this.$proxies = {};\n        this._hiddenIndices = {};\n        this.attached = false;\n        this._animationsDisabled = undefined;\n        this.$context = undefined;\n        this._doResize = debounce((mode)=>this.update(mode), options.resizeDelay || 0);\n        this._dataChanges = [];\n        instances[this.id] = this;\n        if (!context || !canvas) {\n            console.error(\"Failed to create chart: can't acquire context from the given item\");\n            return;\n        }\n        animator.listen(this, 'complete', onAnimationsComplete);\n        animator.listen(this, 'progress', onAnimationProgress);\n        this._initialize();\n        if (this.attached) {\n            this.update();\n        }\n    }\n    get aspectRatio() {\n        const { options: { aspectRatio , maintainAspectRatio  } , width , height , _aspectRatio  } = this;\n        if (!isNullOrUndef(aspectRatio)) {\n            return aspectRatio;\n        }\n        if (maintainAspectRatio && _aspectRatio) {\n            return _aspectRatio;\n        }\n        return height ? width / height : null;\n    }\n    get data() {\n        return this.config.data;\n    }\n    set data(data) {\n        this.config.data = data;\n    }\n    get options() {\n        return this._options;\n    }\n    set options(options) {\n        this.config.options = options;\n    }\n    get registry() {\n        return registry;\n    }\n _initialize() {\n        this.notifyPlugins('beforeInit');\n        if (this.options.responsive) {\n            this.resize();\n        } else {\n            retinaScale(this, this.options.devicePixelRatio);\n        }\n        this.bindEvents();\n        this.notifyPlugins('afterInit');\n        return this;\n    }\n    clear() {\n        clearCanvas(this.canvas, this.ctx);\n        return this;\n    }\n    stop() {\n        animator.stop(this);\n        return this;\n    }\n resize(width, height) {\n        if (!animator.running(this)) {\n            this._resize(width, height);\n        } else {\n            this._resizeBeforeDraw = {\n                width,\n                height\n            };\n        }\n    }\n    _resize(width, height) {\n        const options = this.options;\n        const canvas = this.canvas;\n        const aspectRatio = options.maintainAspectRatio && this.aspectRatio;\n        const newSize = this.platform.getMaximumSize(canvas, width, height, aspectRatio);\n        const newRatio = options.devicePixelRatio || this.platform.getDevicePixelRatio();\n        const mode = this.width ? 'resize' : 'attach';\n        this.width = newSize.width;\n        this.height = newSize.height;\n        this._aspectRatio = this.aspectRatio;\n        if (!retinaScale(this, newRatio, true)) {\n            return;\n        }\n        this.notifyPlugins('resize', {\n            size: newSize\n        });\n        callback(options.onResize, [\n            this,\n            newSize\n        ], this);\n        if (this.attached) {\n            if (this._doResize(mode)) {\n                this.render();\n            }\n        }\n    }\n    ensureScalesHaveIDs() {\n        const options = this.options;\n        const scalesOptions = options.scales || {};\n        each(scalesOptions, (axisOptions, axisID)=>{\n            axisOptions.id = axisID;\n        });\n    }\n buildOrUpdateScales() {\n        const options = this.options;\n        const scaleOpts = options.scales;\n        const scales = this.scales;\n        const updated = Object.keys(scales).reduce((obj, id)=>{\n            obj[id] = false;\n            return obj;\n        }, {});\n        let items = [];\n        if (scaleOpts) {\n            items = items.concat(Object.keys(scaleOpts).map((id)=>{\n                const scaleOptions = scaleOpts[id];\n                const axis = determineAxis(id, scaleOptions);\n                const isRadial = axis === 'r';\n                const isHorizontal = axis === 'x';\n                return {\n                    options: scaleOptions,\n                    dposition: isRadial ? 'chartArea' : isHorizontal ? 'bottom' : 'left',\n                    dtype: isRadial ? 'radialLinear' : isHorizontal ? 'category' : 'linear'\n                };\n            }));\n        }\n        each(items, (item)=>{\n            const scaleOptions = item.options;\n            const id = scaleOptions.id;\n            const axis = determineAxis(id, scaleOptions);\n            const scaleType = valueOrDefault(scaleOptions.type, item.dtype);\n            if (scaleOptions.position === undefined || positionIsHorizontal(scaleOptions.position, axis) !== positionIsHorizontal(item.dposition)) {\n                scaleOptions.position = item.dposition;\n            }\n            updated[id] = true;\n            let scale = null;\n            if (id in scales && scales[id].type === scaleType) {\n                scale = scales[id];\n            } else {\n                const scaleClass = registry.getScale(scaleType);\n                scale = new scaleClass({\n                    id,\n                    type: scaleType,\n                    ctx: this.ctx,\n                    chart: this\n                });\n                scales[scale.id] = scale;\n            }\n            scale.init(scaleOptions, options);\n        });\n        each(updated, (hasUpdated, id)=>{\n            if (!hasUpdated) {\n                delete scales[id];\n            }\n        });\n        each(scales, (scale)=>{\n            layouts.configure(this, scale, scale.options);\n            layouts.addBox(this, scale);\n        });\n    }\n _updateMetasets() {\n        const metasets = this._metasets;\n        const numData = this.data.datasets.length;\n        const numMeta = metasets.length;\n        metasets.sort((a, b)=>a.index - b.index);\n        if (numMeta > numData) {\n            for(let i = numData; i < numMeta; ++i){\n                this._destroyDatasetMeta(i);\n            }\n            metasets.splice(numData, numMeta - numData);\n        }\n        this._sortedMetasets = metasets.slice(0).sort(compare2Level('order', 'index'));\n    }\n _removeUnreferencedMetasets() {\n        const { _metasets: metasets , data: { datasets  }  } = this;\n        if (metasets.length > datasets.length) {\n            delete this._stacks;\n        }\n        metasets.forEach((meta, index)=>{\n            if (datasets.filter((x)=>x === meta._dataset).length === 0) {\n                this._destroyDatasetMeta(index);\n            }\n        });\n    }\n    buildOrUpdateControllers() {\n        const newControllers = [];\n        const datasets = this.data.datasets;\n        let i, ilen;\n        this._removeUnreferencedMetasets();\n        for(i = 0, ilen = datasets.length; i < ilen; i++){\n            const dataset = datasets[i];\n            let meta = this.getDatasetMeta(i);\n            const type = dataset.type || this.config.type;\n            if (meta.type && meta.type !== type) {\n                this._destroyDatasetMeta(i);\n                meta = this.getDatasetMeta(i);\n            }\n            meta.type = type;\n            meta.indexAxis = dataset.indexAxis || getIndexAxis(type, this.options);\n            meta.order = dataset.order || 0;\n            meta.index = i;\n            meta.label = '' + dataset.label;\n            meta.visible = this.isDatasetVisible(i);\n            if (meta.controller) {\n                meta.controller.updateIndex(i);\n                meta.controller.linkScales();\n            } else {\n                const ControllerClass = registry.getController(type);\n                const { datasetElementType , dataElementType  } = defaults.datasets[type];\n                Object.assign(ControllerClass, {\n                    dataElementType: registry.getElement(dataElementType),\n                    datasetElementType: datasetElementType && registry.getElement(datasetElementType)\n                });\n                meta.controller = new ControllerClass(this, i);\n                newControllers.push(meta.controller);\n            }\n        }\n        this._updateMetasets();\n        return newControllers;\n    }\n _resetElements() {\n        each(this.data.datasets, (dataset, datasetIndex)=>{\n            this.getDatasetMeta(datasetIndex).controller.reset();\n        }, this);\n    }\n reset() {\n        this._resetElements();\n        this.notifyPlugins('reset');\n    }\n    update(mode) {\n        const config = this.config;\n        config.update();\n        const options = this._options = config.createResolver(config.chartOptionScopes(), this.getContext());\n        const animsDisabled = this._animationsDisabled = !options.animation;\n        this._updateScales();\n        this._checkEventBindings();\n        this._updateHiddenIndices();\n        this._plugins.invalidate();\n        if (this.notifyPlugins('beforeUpdate', {\n            mode,\n            cancelable: true\n        }) === false) {\n            return;\n        }\n        const newControllers = this.buildOrUpdateControllers();\n        this.notifyPlugins('beforeElementsUpdate');\n        let minPadding = 0;\n        for(let i = 0, ilen = this.data.datasets.length; i < ilen; i++){\n            const { controller  } = this.getDatasetMeta(i);\n            const reset = !animsDisabled && newControllers.indexOf(controller) === -1;\n            controller.buildOrUpdateElements(reset);\n            minPadding = Math.max(+controller.getMaxOverflow(), minPadding);\n        }\n        minPadding = this._minPadding = options.layout.autoPadding ? minPadding : 0;\n        this._updateLayout(minPadding);\n        if (!animsDisabled) {\n            each(newControllers, (controller)=>{\n                controller.reset();\n            });\n        }\n        this._updateDatasets(mode);\n        this.notifyPlugins('afterUpdate', {\n            mode\n        });\n        this._layers.sort(compare2Level('z', '_idx'));\n        const { _active , _lastEvent  } = this;\n        if (_lastEvent) {\n            this._eventHandler(_lastEvent, true);\n        } else if (_active.length) {\n            this._updateHoverStyles(_active, _active, true);\n        }\n        this.render();\n    }\n _updateScales() {\n        each(this.scales, (scale)=>{\n            layouts.removeBox(this, scale);\n        });\n        this.ensureScalesHaveIDs();\n        this.buildOrUpdateScales();\n    }\n _checkEventBindings() {\n        const options = this.options;\n        const existingEvents = new Set(Object.keys(this._listeners));\n        const newEvents = new Set(options.events);\n        if (!setsEqual(existingEvents, newEvents) || !!this._responsiveListeners !== options.responsive) {\n            this.unbindEvents();\n            this.bindEvents();\n        }\n    }\n _updateHiddenIndices() {\n        const { _hiddenIndices  } = this;\n        const changes = this._getUniformDataChanges() || [];\n        for (const { method , start , count  } of changes){\n            const move = method === '_removeElements' ? -count : count;\n            moveNumericKeys(_hiddenIndices, start, move);\n        }\n    }\n _getUniformDataChanges() {\n        const _dataChanges = this._dataChanges;\n        if (!_dataChanges || !_dataChanges.length) {\n            return;\n        }\n        this._dataChanges = [];\n        const datasetCount = this.data.datasets.length;\n        const makeSet = (idx)=>new Set(_dataChanges.filter((c)=>c[0] === idx).map((c, i)=>i + ',' + c.splice(1).join(',')));\n        const changeSet = makeSet(0);\n        for(let i = 1; i < datasetCount; i++){\n            if (!setsEqual(changeSet, makeSet(i))) {\n                return;\n            }\n        }\n        return Array.from(changeSet).map((c)=>c.split(',')).map((a)=>({\n                method: a[1],\n                start: +a[2],\n                count: +a[3]\n            }));\n    }\n _updateLayout(minPadding) {\n        if (this.notifyPlugins('beforeLayout', {\n            cancelable: true\n        }) === false) {\n            return;\n        }\n        layouts.update(this, this.width, this.height, minPadding);\n        const area = this.chartArea;\n        const noArea = area.width <= 0 || area.height <= 0;\n        this._layers = [];\n        each(this.boxes, (box)=>{\n            if (noArea && box.position === 'chartArea') {\n                return;\n            }\n            if (box.configure) {\n                box.configure();\n            }\n            this._layers.push(...box._layers());\n        }, this);\n        this._layers.forEach((item, index)=>{\n            item._idx = index;\n        });\n        this.notifyPlugins('afterLayout');\n    }\n _updateDatasets(mode) {\n        if (this.notifyPlugins('beforeDatasetsUpdate', {\n            mode,\n            cancelable: true\n        }) === false) {\n            return;\n        }\n        for(let i = 0, ilen = this.data.datasets.length; i < ilen; ++i){\n            this.getDatasetMeta(i).controller.configure();\n        }\n        for(let i = 0, ilen = this.data.datasets.length; i < ilen; ++i){\n            this._updateDataset(i, isFunction(mode) ? mode({\n                datasetIndex: i\n            }) : mode);\n        }\n        this.notifyPlugins('afterDatasetsUpdate', {\n            mode\n        });\n    }\n _updateDataset(index, mode) {\n        const meta = this.getDatasetMeta(index);\n        const args = {\n            meta,\n            index,\n            mode,\n            cancelable: true\n        };\n        if (this.notifyPlugins('beforeDatasetUpdate', args) === false) {\n            return;\n        }\n        meta.controller._update(mode);\n        args.cancelable = false;\n        this.notifyPlugins('afterDatasetUpdate', args);\n    }\n    render() {\n        if (this.notifyPlugins('beforeRender', {\n            cancelable: true\n        }) === false) {\n            return;\n        }\n        if (animator.has(this)) {\n            if (this.attached && !animator.running(this)) {\n                animator.start(this);\n            }\n        } else {\n            this.draw();\n            onAnimationsComplete({\n                chart: this\n            });\n        }\n    }\n    draw() {\n        let i;\n        if (this._resizeBeforeDraw) {\n            const { width , height  } = this._resizeBeforeDraw;\n            this._resizeBeforeDraw = null;\n            this._resize(width, height);\n        }\n        this.clear();\n        if (this.width <= 0 || this.height <= 0) {\n            return;\n        }\n        if (this.notifyPlugins('beforeDraw', {\n            cancelable: true\n        }) === false) {\n            return;\n        }\n        const layers = this._layers;\n        for(i = 0; i < layers.length && layers[i].z <= 0; ++i){\n            layers[i].draw(this.chartArea);\n        }\n        this._drawDatasets();\n        for(; i < layers.length; ++i){\n            layers[i].draw(this.chartArea);\n        }\n        this.notifyPlugins('afterDraw');\n    }\n _getSortedDatasetMetas(filterVisible) {\n        const metasets = this._sortedMetasets;\n        const result = [];\n        let i, ilen;\n        for(i = 0, ilen = metasets.length; i < ilen; ++i){\n            const meta = metasets[i];\n            if (!filterVisible || meta.visible) {\n                result.push(meta);\n            }\n        }\n        return result;\n    }\n getSortedVisibleDatasetMetas() {\n        return this._getSortedDatasetMetas(true);\n    }\n _drawDatasets() {\n        if (this.notifyPlugins('beforeDatasetsDraw', {\n            cancelable: true\n        }) === false) {\n            return;\n        }\n        const metasets = this.getSortedVisibleDatasetMetas();\n        for(let i = metasets.length - 1; i >= 0; --i){\n            this._drawDataset(metasets[i]);\n        }\n        this.notifyPlugins('afterDatasetsDraw');\n    }\n _drawDataset(meta) {\n        const ctx = this.ctx;\n        const clip = meta._clip;\n        const useClip = !clip.disabled;\n        const area = getDatasetArea(meta, this.chartArea);\n        const args = {\n            meta,\n            index: meta.index,\n            cancelable: true\n        };\n        if (this.notifyPlugins('beforeDatasetDraw', args) === false) {\n            return;\n        }\n        if (useClip) {\n            clipArea(ctx, {\n                left: clip.left === false ? 0 : area.left - clip.left,\n                right: clip.right === false ? this.width : area.right + clip.right,\n                top: clip.top === false ? 0 : area.top - clip.top,\n                bottom: clip.bottom === false ? this.height : area.bottom + clip.bottom\n            });\n        }\n        meta.controller.draw();\n        if (useClip) {\n            unclipArea(ctx);\n        }\n        args.cancelable = false;\n        this.notifyPlugins('afterDatasetDraw', args);\n    }\n isPointInArea(point) {\n        return _isPointInArea(point, this.chartArea, this._minPadding);\n    }\n    getElementsAtEventForMode(e, mode, options, useFinalPosition) {\n        const method = Interaction.modes[mode];\n        if (typeof method === 'function') {\n            return method(this, e, options, useFinalPosition);\n        }\n        return [];\n    }\n    getDatasetMeta(datasetIndex) {\n        const dataset = this.data.datasets[datasetIndex];\n        const metasets = this._metasets;\n        let meta = metasets.filter((x)=>x && x._dataset === dataset).pop();\n        if (!meta) {\n            meta = {\n                type: null,\n                data: [],\n                dataset: null,\n                controller: null,\n                hidden: null,\n                xAxisID: null,\n                yAxisID: null,\n                order: dataset && dataset.order || 0,\n                index: datasetIndex,\n                _dataset: dataset,\n                _parsed: [],\n                _sorted: false\n            };\n            metasets.push(meta);\n        }\n        return meta;\n    }\n    getContext() {\n        return this.$context || (this.$context = createContext(null, {\n            chart: this,\n            type: 'chart'\n        }));\n    }\n    getVisibleDatasetCount() {\n        return this.getSortedVisibleDatasetMetas().length;\n    }\n    isDatasetVisible(datasetIndex) {\n        const dataset = this.data.datasets[datasetIndex];\n        if (!dataset) {\n            return false;\n        }\n        const meta = this.getDatasetMeta(datasetIndex);\n        return typeof meta.hidden === 'boolean' ? !meta.hidden : !dataset.hidden;\n    }\n    setDatasetVisibility(datasetIndex, visible) {\n        const meta = this.getDatasetMeta(datasetIndex);\n        meta.hidden = !visible;\n    }\n    toggleDataVisibility(index) {\n        this._hiddenIndices[index] = !this._hiddenIndices[index];\n    }\n    getDataVisibility(index) {\n        return !this._hiddenIndices[index];\n    }\n _updateVisibility(datasetIndex, dataIndex, visible) {\n        const mode = visible ? 'show' : 'hide';\n        const meta = this.getDatasetMeta(datasetIndex);\n        const anims = meta.controller._resolveAnimations(undefined, mode);\n        if (defined(dataIndex)) {\n            meta.data[dataIndex].hidden = !visible;\n            this.update();\n        } else {\n            this.setDatasetVisibility(datasetIndex, visible);\n            anims.update(meta, {\n                visible\n            });\n            this.update((ctx)=>ctx.datasetIndex === datasetIndex ? mode : undefined);\n        }\n    }\n    hide(datasetIndex, dataIndex) {\n        this._updateVisibility(datasetIndex, dataIndex, false);\n    }\n    show(datasetIndex, dataIndex) {\n        this._updateVisibility(datasetIndex, dataIndex, true);\n    }\n _destroyDatasetMeta(datasetIndex) {\n        const meta = this._metasets[datasetIndex];\n        if (meta && meta.controller) {\n            meta.controller._destroy();\n        }\n        delete this._metasets[datasetIndex];\n    }\n    _stop() {\n        let i, ilen;\n        this.stop();\n        animator.remove(this);\n        for(i = 0, ilen = this.data.datasets.length; i < ilen; ++i){\n            this._destroyDatasetMeta(i);\n        }\n    }\n    destroy() {\n        this.notifyPlugins('beforeDestroy');\n        const { canvas , ctx  } = this;\n        this._stop();\n        this.config.clearCache();\n        if (canvas) {\n            this.unbindEvents();\n            clearCanvas(canvas, ctx);\n            this.platform.releaseContext(ctx);\n            this.canvas = null;\n            this.ctx = null;\n        }\n        delete instances[this.id];\n        this.notifyPlugins('afterDestroy');\n    }\n    toBase64Image(...args) {\n        return this.canvas.toDataURL(...args);\n    }\n bindEvents() {\n        this.bindUserEvents();\n        if (this.options.responsive) {\n            this.bindResponsiveEvents();\n        } else {\n            this.attached = true;\n        }\n    }\n bindUserEvents() {\n        const listeners = this._listeners;\n        const platform = this.platform;\n        const _add = (type, listener)=>{\n            platform.addEventListener(this, type, listener);\n            listeners[type] = listener;\n        };\n        const listener = (e, x, y)=>{\n            e.offsetX = x;\n            e.offsetY = y;\n            this._eventHandler(e);\n        };\n        each(this.options.events, (type)=>_add(type, listener));\n    }\n bindResponsiveEvents() {\n        if (!this._responsiveListeners) {\n            this._responsiveListeners = {};\n        }\n        const listeners = this._responsiveListeners;\n        const platform = this.platform;\n        const _add = (type, listener)=>{\n            platform.addEventListener(this, type, listener);\n            listeners[type] = listener;\n        };\n        const _remove = (type, listener)=>{\n            if (listeners[type]) {\n                platform.removeEventListener(this, type, listener);\n                delete listeners[type];\n            }\n        };\n        const listener = (width, height)=>{\n            if (this.canvas) {\n                this.resize(width, height);\n            }\n        };\n        let detached;\n        const attached = ()=>{\n            _remove('attach', attached);\n            this.attached = true;\n            this.resize();\n            _add('resize', listener);\n            _add('detach', detached);\n        };\n        detached = ()=>{\n            this.attached = false;\n            _remove('resize', listener);\n            this._stop();\n            this._resize(0, 0);\n            _add('attach', attached);\n        };\n        if (platform.isAttached(this.canvas)) {\n            attached();\n        } else {\n            detached();\n        }\n    }\n unbindEvents() {\n        each(this._listeners, (listener, type)=>{\n            this.platform.removeEventListener(this, type, listener);\n        });\n        this._listeners = {};\n        each(this._responsiveListeners, (listener, type)=>{\n            this.platform.removeEventListener(this, type, listener);\n        });\n        this._responsiveListeners = undefined;\n    }\n    updateHoverStyle(items, mode, enabled) {\n        const prefix = enabled ? 'set' : 'remove';\n        let meta, item, i, ilen;\n        if (mode === 'dataset') {\n            meta = this.getDatasetMeta(items[0].datasetIndex);\n            meta.controller['_' + prefix + 'DatasetHoverStyle']();\n        }\n        for(i = 0, ilen = items.length; i < ilen; ++i){\n            item = items[i];\n            const controller = item && this.getDatasetMeta(item.datasetIndex).controller;\n            if (controller) {\n                controller[prefix + 'HoverStyle'](item.element, item.datasetIndex, item.index);\n            }\n        }\n    }\n getActiveElements() {\n        return this._active || [];\n    }\n setActiveElements(activeElements) {\n        const lastActive = this._active || [];\n        const active = activeElements.map(({ datasetIndex , index  })=>{\n            const meta = this.getDatasetMeta(datasetIndex);\n            if (!meta) {\n                throw new Error('No dataset found at index ' + datasetIndex);\n            }\n            return {\n                datasetIndex,\n                element: meta.data[index],\n                index\n            };\n        });\n        const changed = !_elementsEqual(active, lastActive);\n        if (changed) {\n            this._active = active;\n            this._lastEvent = null;\n            this._updateHoverStyles(active, lastActive);\n        }\n    }\n notifyPlugins(hook, args, filter) {\n        return this._plugins.notify(this, hook, args, filter);\n    }\n isPluginEnabled(pluginId) {\n        return this._plugins._cache.filter((p)=>p.plugin.id === pluginId).length === 1;\n    }\n _updateHoverStyles(active, lastActive, replay) {\n        const hoverOptions = this.options.hover;\n        const diff = (a, b)=>a.filter((x)=>!b.some((y)=>x.datasetIndex === y.datasetIndex && x.index === y.index));\n        const deactivated = diff(lastActive, active);\n        const activated = replay ? active : diff(active, lastActive);\n        if (deactivated.length) {\n            this.updateHoverStyle(deactivated, hoverOptions.mode, false);\n        }\n        if (activated.length && hoverOptions.mode) {\n            this.updateHoverStyle(activated, hoverOptions.mode, true);\n        }\n    }\n _eventHandler(e, replay) {\n        const args = {\n            event: e,\n            replay,\n            cancelable: true,\n            inChartArea: this.isPointInArea(e)\n        };\n        const eventFilter = (plugin)=>(plugin.options.events || this.options.events).includes(e.native.type);\n        if (this.notifyPlugins('beforeEvent', args, eventFilter) === false) {\n            return;\n        }\n        const changed = this._handleEvent(e, replay, args.inChartArea);\n        args.cancelable = false;\n        this.notifyPlugins('afterEvent', args, eventFilter);\n        if (changed || args.changed) {\n            this.render();\n        }\n        return this;\n    }\n _handleEvent(e, replay, inChartArea) {\n        const { _active: lastActive = [] , options  } = this;\n        const useFinalPosition = replay;\n        const active = this._getActiveElements(e, lastActive, inChartArea, useFinalPosition);\n        const isClick = _isClickEvent(e);\n        const lastEvent = determineLastEvent(e, this._lastEvent, inChartArea, isClick);\n        if (inChartArea) {\n            this._lastEvent = null;\n            callback(options.onHover, [\n                e,\n                active,\n                this\n            ], this);\n            if (isClick) {\n                callback(options.onClick, [\n                    e,\n                    active,\n                    this\n                ], this);\n            }\n        }\n        const changed = !_elementsEqual(active, lastActive);\n        if (changed || replay) {\n            this._active = active;\n            this._updateHoverStyles(active, lastActive, replay);\n        }\n        this._lastEvent = lastEvent;\n        return changed;\n    }\n _getActiveElements(e, lastActive, inChartArea, useFinalPosition) {\n        if (e.type === 'mouseout') {\n            return [];\n        }\n        if (!inChartArea) {\n            return lastActive;\n        }\n        const hoverOptions = this.options.hover;\n        return this.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions, useFinalPosition);\n    }\n}\nfunction invalidatePlugins() {\n    return each(Chart.instances, (chart)=>chart._plugins.invalidate());\n}\n\nfunction clipArc(ctx, element, endAngle) {\n    const { startAngle , pixelMargin , x , y , outerRadius , innerRadius  } = element;\n    let angleMargin = pixelMargin / outerRadius;\n    // Draw an inner border by clipping the arc and drawing a double-width border\n    // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders\n    ctx.beginPath();\n    ctx.arc(x, y, outerRadius, startAngle - angleMargin, endAngle + angleMargin);\n    if (innerRadius > pixelMargin) {\n        angleMargin = pixelMargin / innerRadius;\n        ctx.arc(x, y, innerRadius, endAngle + angleMargin, startAngle - angleMargin, true);\n    } else {\n        ctx.arc(x, y, pixelMargin, endAngle + HALF_PI, startAngle - HALF_PI);\n    }\n    ctx.closePath();\n    ctx.clip();\n}\nfunction toRadiusCorners(value) {\n    return _readValueToProps(value, [\n        'outerStart',\n        'outerEnd',\n        'innerStart',\n        'innerEnd'\n    ]);\n}\n/**\n * Parse border radius from the provided options\n */ function parseBorderRadius$1(arc, innerRadius, outerRadius, angleDelta) {\n    const o = toRadiusCorners(arc.options.borderRadius);\n    const halfThickness = (outerRadius - innerRadius) / 2;\n    const innerLimit = Math.min(halfThickness, angleDelta * innerRadius / 2);\n    // Outer limits are complicated. We want to compute the available angular distance at\n    // a radius of outerRadius - borderRadius because for small angular distances, this term limits.\n    // We compute at r = outerRadius - borderRadius because this circle defines the center of the border corners.\n    //\n    // If the borderRadius is large, that value can become negative.\n    // This causes the outer borders to lose their radius entirely, which is rather unexpected. To solve that, if borderRadius > outerRadius\n    // we know that the thickness term will dominate and compute the limits at that point\n    const computeOuterLimit = (val)=>{\n        const outerArcLimit = (outerRadius - Math.min(halfThickness, val)) * angleDelta / 2;\n        return _limitValue(val, 0, Math.min(halfThickness, outerArcLimit));\n    };\n    return {\n        outerStart: computeOuterLimit(o.outerStart),\n        outerEnd: computeOuterLimit(o.outerEnd),\n        innerStart: _limitValue(o.innerStart, 0, innerLimit),\n        innerEnd: _limitValue(o.innerEnd, 0, innerLimit)\n    };\n}\n/**\n * Convert (r, 𝜃) to (x, y)\n */ function rThetaToXY(r, theta, x, y) {\n    return {\n        x: x + r * Math.cos(theta),\n        y: y + r * Math.sin(theta)\n    };\n}\n/**\n * Path the arc, respecting border radius by separating into left and right halves.\n *\n *   Start      End\n *\n *    1--->a--->2    Outer\n *   /           \\\n *   8           3\n *   |           |\n *   |           |\n *   7           4\n *   \\           /\n *    6<---b<---5    Inner\n */ function pathArc(ctx, element, offset, spacing, end, circular) {\n    const { x , y , startAngle: start , pixelMargin , innerRadius: innerR  } = element;\n    const outerRadius = Math.max(element.outerRadius + spacing + offset - pixelMargin, 0);\n    const innerRadius = innerR > 0 ? innerR + spacing + offset + pixelMargin : 0;\n    let spacingOffset = 0;\n    const alpha = end - start;\n    if (spacing) {\n        // When spacing is present, it is the same for all items\n        // So we adjust the start and end angle of the arc such that\n        // the distance is the same as it would be without the spacing\n        const noSpacingInnerRadius = innerR > 0 ? innerR - spacing : 0;\n        const noSpacingOuterRadius = outerRadius > 0 ? outerRadius - spacing : 0;\n        const avNogSpacingRadius = (noSpacingInnerRadius + noSpacingOuterRadius) / 2;\n        const adjustedAngle = avNogSpacingRadius !== 0 ? alpha * avNogSpacingRadius / (avNogSpacingRadius + spacing) : alpha;\n        spacingOffset = (alpha - adjustedAngle) / 2;\n    }\n    const beta = Math.max(0.001, alpha * outerRadius - offset / PI) / outerRadius;\n    const angleOffset = (alpha - beta) / 2;\n    const startAngle = start + angleOffset + spacingOffset;\n    const endAngle = end - angleOffset - spacingOffset;\n    const { outerStart , outerEnd , innerStart , innerEnd  } = parseBorderRadius$1(element, innerRadius, outerRadius, endAngle - startAngle);\n    const outerStartAdjustedRadius = outerRadius - outerStart;\n    const outerEndAdjustedRadius = outerRadius - outerEnd;\n    const outerStartAdjustedAngle = startAngle + outerStart / outerStartAdjustedRadius;\n    const outerEndAdjustedAngle = endAngle - outerEnd / outerEndAdjustedRadius;\n    const innerStartAdjustedRadius = innerRadius + innerStart;\n    const innerEndAdjustedRadius = innerRadius + innerEnd;\n    const innerStartAdjustedAngle = startAngle + innerStart / innerStartAdjustedRadius;\n    const innerEndAdjustedAngle = endAngle - innerEnd / innerEndAdjustedRadius;\n    ctx.beginPath();\n    if (circular) {\n        // The first arc segments from point 1 to point a to point 2\n        const outerMidAdjustedAngle = (outerStartAdjustedAngle + outerEndAdjustedAngle) / 2;\n        ctx.arc(x, y, outerRadius, outerStartAdjustedAngle, outerMidAdjustedAngle);\n        ctx.arc(x, y, outerRadius, outerMidAdjustedAngle, outerEndAdjustedAngle);\n        // The corner segment from point 2 to point 3\n        if (outerEnd > 0) {\n            const pCenter = rThetaToXY(outerEndAdjustedRadius, outerEndAdjustedAngle, x, y);\n            ctx.arc(pCenter.x, pCenter.y, outerEnd, outerEndAdjustedAngle, endAngle + HALF_PI);\n        }\n        // The line from point 3 to point 4\n        const p4 = rThetaToXY(innerEndAdjustedRadius, endAngle, x, y);\n        ctx.lineTo(p4.x, p4.y);\n        // The corner segment from point 4 to point 5\n        if (innerEnd > 0) {\n            const pCenter = rThetaToXY(innerEndAdjustedRadius, innerEndAdjustedAngle, x, y);\n            ctx.arc(pCenter.x, pCenter.y, innerEnd, endAngle + HALF_PI, innerEndAdjustedAngle + Math.PI);\n        }\n        // The inner arc from point 5 to point b to point 6\n        const innerMidAdjustedAngle = (endAngle - innerEnd / innerRadius + (startAngle + innerStart / innerRadius)) / 2;\n        ctx.arc(x, y, innerRadius, endAngle - innerEnd / innerRadius, innerMidAdjustedAngle, true);\n        ctx.arc(x, y, innerRadius, innerMidAdjustedAngle, startAngle + innerStart / innerRadius, true);\n        // The corner segment from point 6 to point 7\n        if (innerStart > 0) {\n            const pCenter = rThetaToXY(innerStartAdjustedRadius, innerStartAdjustedAngle, x, y);\n            ctx.arc(pCenter.x, pCenter.y, innerStart, innerStartAdjustedAngle + Math.PI, startAngle - HALF_PI);\n        }\n        // The line from point 7 to point 8\n        const p8 = rThetaToXY(outerStartAdjustedRadius, startAngle, x, y);\n        ctx.lineTo(p8.x, p8.y);\n        // The corner segment from point 8 to point 1\n        if (outerStart > 0) {\n            const pCenter = rThetaToXY(outerStartAdjustedRadius, outerStartAdjustedAngle, x, y);\n            ctx.arc(pCenter.x, pCenter.y, outerStart, startAngle - HALF_PI, outerStartAdjustedAngle);\n        }\n    } else {\n        ctx.moveTo(x, y);\n        const outerStartX = Math.cos(outerStartAdjustedAngle) * outerRadius + x;\n        const outerStartY = Math.sin(outerStartAdjustedAngle) * outerRadius + y;\n        ctx.lineTo(outerStartX, outerStartY);\n        const outerEndX = Math.cos(outerEndAdjustedAngle) * outerRadius + x;\n        const outerEndY = Math.sin(outerEndAdjustedAngle) * outerRadius + y;\n        ctx.lineTo(outerEndX, outerEndY);\n    }\n    ctx.closePath();\n}\nfunction drawArc(ctx, element, offset, spacing, circular) {\n    const { fullCircles , startAngle , circumference  } = element;\n    let endAngle = element.endAngle;\n    if (fullCircles) {\n        pathArc(ctx, element, offset, spacing, endAngle, circular);\n        for(let i = 0; i < fullCircles; ++i){\n            ctx.fill();\n        }\n        if (!isNaN(circumference)) {\n            endAngle = startAngle + (circumference % TAU || TAU);\n        }\n    }\n    pathArc(ctx, element, offset, spacing, endAngle, circular);\n    ctx.fill();\n    return endAngle;\n}\nfunction drawBorder(ctx, element, offset, spacing, circular) {\n    const { fullCircles , startAngle , circumference , options  } = element;\n    const { borderWidth , borderJoinStyle , borderDash , borderDashOffset  } = options;\n    const inner = options.borderAlign === 'inner';\n    if (!borderWidth) {\n        return;\n    }\n    ctx.setLineDash(borderDash || []);\n    ctx.lineDashOffset = borderDashOffset;\n    if (inner) {\n        ctx.lineWidth = borderWidth * 2;\n        ctx.lineJoin = borderJoinStyle || 'round';\n    } else {\n        ctx.lineWidth = borderWidth;\n        ctx.lineJoin = borderJoinStyle || 'bevel';\n    }\n    let endAngle = element.endAngle;\n    if (fullCircles) {\n        pathArc(ctx, element, offset, spacing, endAngle, circular);\n        for(let i = 0; i < fullCircles; ++i){\n            ctx.stroke();\n        }\n        if (!isNaN(circumference)) {\n            endAngle = startAngle + (circumference % TAU || TAU);\n        }\n    }\n    if (inner) {\n        clipArc(ctx, element, endAngle);\n    }\n    if (!fullCircles) {\n        pathArc(ctx, element, offset, spacing, endAngle, circular);\n        ctx.stroke();\n    }\n}\nclass ArcElement extends Element {\n    static id = 'arc';\n    static defaults = {\n        borderAlign: 'center',\n        borderColor: '#fff',\n        borderDash: [],\n        borderDashOffset: 0,\n        borderJoinStyle: undefined,\n        borderRadius: 0,\n        borderWidth: 2,\n        offset: 0,\n        spacing: 0,\n        angle: undefined,\n        circular: true\n    };\n    static defaultRoutes = {\n        backgroundColor: 'backgroundColor'\n    };\n    static descriptors = {\n        _scriptable: true,\n        _indexable: (name)=>name !== 'borderDash'\n    };\n    circumference;\n    endAngle;\n    fullCircles;\n    innerRadius;\n    outerRadius;\n    pixelMargin;\n    startAngle;\n    constructor(cfg){\n        super();\n        this.options = undefined;\n        this.circumference = undefined;\n        this.startAngle = undefined;\n        this.endAngle = undefined;\n        this.innerRadius = undefined;\n        this.outerRadius = undefined;\n        this.pixelMargin = 0;\n        this.fullCircles = 0;\n        if (cfg) {\n            Object.assign(this, cfg);\n        }\n    }\n    inRange(chartX, chartY, useFinalPosition) {\n        const point = this.getProps([\n            'x',\n            'y'\n        ], useFinalPosition);\n        const { angle , distance  } = getAngleFromPoint(point, {\n            x: chartX,\n            y: chartY\n        });\n        const { startAngle , endAngle , innerRadius , outerRadius , circumference  } = this.getProps([\n            'startAngle',\n            'endAngle',\n            'innerRadius',\n            'outerRadius',\n            'circumference'\n        ], useFinalPosition);\n        const rAdjust = (this.options.spacing + this.options.borderWidth) / 2;\n        const _circumference = valueOrDefault(circumference, endAngle - startAngle);\n        const nonZeroBetween = _angleBetween(angle, startAngle, endAngle) && startAngle !== endAngle;\n        const betweenAngles = _circumference >= TAU || nonZeroBetween;\n        const withinRadius = _isBetween(distance, innerRadius + rAdjust, outerRadius + rAdjust);\n        return betweenAngles && withinRadius;\n    }\n    getCenterPoint(useFinalPosition) {\n        const { x , y , startAngle , endAngle , innerRadius , outerRadius  } = this.getProps([\n            'x',\n            'y',\n            'startAngle',\n            'endAngle',\n            'innerRadius',\n            'outerRadius'\n        ], useFinalPosition);\n        const { offset , spacing  } = this.options;\n        const halfAngle = (startAngle + endAngle) / 2;\n        const halfRadius = (innerRadius + outerRadius + spacing + offset) / 2;\n        return {\n            x: x + Math.cos(halfAngle) * halfRadius,\n            y: y + Math.sin(halfAngle) * halfRadius\n        };\n    }\n    tooltipPosition(useFinalPosition) {\n        return this.getCenterPoint(useFinalPosition);\n    }\n    draw(ctx) {\n        const { options , circumference  } = this;\n        const offset = (options.offset || 0) / 4;\n        const spacing = (options.spacing || 0) / 2;\n        const circular = options.circular;\n        this.pixelMargin = options.borderAlign === 'inner' ? 0.33 : 0;\n        this.fullCircles = circumference > TAU ? Math.floor(circumference / TAU) : 0;\n        if (circumference === 0 || this.innerRadius < 0 || this.outerRadius < 0) {\n            return;\n        }\n        ctx.save();\n        const halfAngle = (this.startAngle + this.endAngle) / 2;\n        ctx.translate(Math.cos(halfAngle) * offset, Math.sin(halfAngle) * offset);\n        const fix = 1 - Math.sin(Math.min(PI, circumference || 0));\n        const radiusOffset = offset * fix;\n        ctx.fillStyle = options.backgroundColor;\n        ctx.strokeStyle = options.borderColor;\n        drawArc(ctx, this, radiusOffset, spacing, circular);\n        drawBorder(ctx, this, radiusOffset, spacing, circular);\n        ctx.restore();\n    }\n}\n\nfunction setStyle(ctx, options, style = options) {\n    ctx.lineCap = valueOrDefault(style.borderCapStyle, options.borderCapStyle);\n    ctx.setLineDash(valueOrDefault(style.borderDash, options.borderDash));\n    ctx.lineDashOffset = valueOrDefault(style.borderDashOffset, options.borderDashOffset);\n    ctx.lineJoin = valueOrDefault(style.borderJoinStyle, options.borderJoinStyle);\n    ctx.lineWidth = valueOrDefault(style.borderWidth, options.borderWidth);\n    ctx.strokeStyle = valueOrDefault(style.borderColor, options.borderColor);\n}\nfunction lineTo(ctx, previous, target) {\n    ctx.lineTo(target.x, target.y);\n}\n function getLineMethod(options) {\n    if (options.stepped) {\n        return _steppedLineTo;\n    }\n    if (options.tension || options.cubicInterpolationMode === 'monotone') {\n        return _bezierCurveTo;\n    }\n    return lineTo;\n}\nfunction pathVars(points, segment, params = {}) {\n    const count = points.length;\n    const { start: paramsStart = 0 , end: paramsEnd = count - 1  } = params;\n    const { start: segmentStart , end: segmentEnd  } = segment;\n    const start = Math.max(paramsStart, segmentStart);\n    const end = Math.min(paramsEnd, segmentEnd);\n    const outside = paramsStart < segmentStart && paramsEnd < segmentStart || paramsStart > segmentEnd && paramsEnd > segmentEnd;\n    return {\n        count,\n        start,\n        loop: segment.loop,\n        ilen: end < start && !outside ? count + end - start : end - start\n    };\n}\n function pathSegment(ctx, line, segment, params) {\n    const { points , options  } = line;\n    const { count , start , loop , ilen  } = pathVars(points, segment, params);\n    const lineMethod = getLineMethod(options);\n    let { move =true , reverse  } = params || {};\n    let i, point, prev;\n    for(i = 0; i <= ilen; ++i){\n        point = points[(start + (reverse ? ilen - i : i)) % count];\n        if (point.skip) {\n            continue;\n        } else if (move) {\n            ctx.moveTo(point.x, point.y);\n            move = false;\n        } else {\n            lineMethod(ctx, prev, point, reverse, options.stepped);\n        }\n        prev = point;\n    }\n    if (loop) {\n        point = points[(start + (reverse ? ilen : 0)) % count];\n        lineMethod(ctx, prev, point, reverse, options.stepped);\n    }\n    return !!loop;\n}\n function fastPathSegment(ctx, line, segment, params) {\n    const points = line.points;\n    const { count , start , ilen  } = pathVars(points, segment, params);\n    const { move =true , reverse  } = params || {};\n    let avgX = 0;\n    let countX = 0;\n    let i, point, prevX, minY, maxY, lastY;\n    const pointIndex = (index)=>(start + (reverse ? ilen - index : index)) % count;\n    const drawX = ()=>{\n        if (minY !== maxY) {\n            ctx.lineTo(avgX, maxY);\n            ctx.lineTo(avgX, minY);\n            ctx.lineTo(avgX, lastY);\n        }\n    };\n    if (move) {\n        point = points[pointIndex(0)];\n        ctx.moveTo(point.x, point.y);\n    }\n    for(i = 0; i <= ilen; ++i){\n        point = points[pointIndex(i)];\n        if (point.skip) {\n            continue;\n        }\n        const x = point.x;\n        const y = point.y;\n        const truncX = x | 0;\n        if (truncX === prevX) {\n            if (y < minY) {\n                minY = y;\n            } else if (y > maxY) {\n                maxY = y;\n            }\n            avgX = (countX * avgX + x) / ++countX;\n        } else {\n            drawX();\n            ctx.lineTo(x, y);\n            prevX = truncX;\n            countX = 0;\n            minY = maxY = y;\n        }\n        lastY = y;\n    }\n    drawX();\n}\n function _getSegmentMethod(line) {\n    const opts = line.options;\n    const borderDash = opts.borderDash && opts.borderDash.length;\n    const useFastPath = !line._decimated && !line._loop && !opts.tension && opts.cubicInterpolationMode !== 'monotone' && !opts.stepped && !borderDash;\n    return useFastPath ? fastPathSegment : pathSegment;\n}\n function _getInterpolationMethod(options) {\n    if (options.stepped) {\n        return _steppedInterpolation;\n    }\n    if (options.tension || options.cubicInterpolationMode === 'monotone') {\n        return _bezierInterpolation;\n    }\n    return _pointInLine;\n}\nfunction strokePathWithCache(ctx, line, start, count) {\n    let path = line._path;\n    if (!path) {\n        path = line._path = new Path2D();\n        if (line.path(path, start, count)) {\n            path.closePath();\n        }\n    }\n    setStyle(ctx, line.options);\n    ctx.stroke(path);\n}\nfunction strokePathDirect(ctx, line, start, count) {\n    const { segments , options  } = line;\n    const segmentMethod = _getSegmentMethod(line);\n    for (const segment of segments){\n        setStyle(ctx, options, segment.style);\n        ctx.beginPath();\n        if (segmentMethod(ctx, line, segment, {\n            start,\n            end: start + count - 1\n        })) {\n            ctx.closePath();\n        }\n        ctx.stroke();\n    }\n}\nconst usePath2D = typeof Path2D === 'function';\nfunction draw(ctx, line, start, count) {\n    if (usePath2D && !line.options.segment) {\n        strokePathWithCache(ctx, line, start, count);\n    } else {\n        strokePathDirect(ctx, line, start, count);\n    }\n}\nclass LineElement extends Element {\n    static id = 'line';\n static defaults = {\n        borderCapStyle: 'butt',\n        borderDash: [],\n        borderDashOffset: 0,\n        borderJoinStyle: 'miter',\n        borderWidth: 3,\n        capBezierPoints: true,\n        cubicInterpolationMode: 'default',\n        fill: false,\n        spanGaps: false,\n        stepped: false,\n        tension: 0\n    };\n static defaultRoutes = {\n        backgroundColor: 'backgroundColor',\n        borderColor: 'borderColor'\n    };\n    static descriptors = {\n        _scriptable: true,\n        _indexable: (name)=>name !== 'borderDash' && name !== 'fill'\n    };\n    constructor(cfg){\n        super();\n        this.animated = true;\n        this.options = undefined;\n        this._chart = undefined;\n        this._loop = undefined;\n        this._fullLoop = undefined;\n        this._path = undefined;\n        this._points = undefined;\n        this._segments = undefined;\n        this._decimated = false;\n        this._pointsUpdated = false;\n        this._datasetIndex = undefined;\n        if (cfg) {\n            Object.assign(this, cfg);\n        }\n    }\n    updateControlPoints(chartArea, indexAxis) {\n        const options = this.options;\n        if ((options.tension || options.cubicInterpolationMode === 'monotone') && !options.stepped && !this._pointsUpdated) {\n            const loop = options.spanGaps ? this._loop : this._fullLoop;\n            _updateBezierControlPoints(this._points, options, chartArea, loop, indexAxis);\n            this._pointsUpdated = true;\n        }\n    }\n    set points(points) {\n        this._points = points;\n        delete this._segments;\n        delete this._path;\n        this._pointsUpdated = false;\n    }\n    get points() {\n        return this._points;\n    }\n    get segments() {\n        return this._segments || (this._segments = _computeSegments(this, this.options.segment));\n    }\n first() {\n        const segments = this.segments;\n        const points = this.points;\n        return segments.length && points[segments[0].start];\n    }\n last() {\n        const segments = this.segments;\n        const points = this.points;\n        const count = segments.length;\n        return count && points[segments[count - 1].end];\n    }\n interpolate(point, property) {\n        const options = this.options;\n        const value = point[property];\n        const points = this.points;\n        const segments = _boundSegments(this, {\n            property,\n            start: value,\n            end: value\n        });\n        if (!segments.length) {\n            return;\n        }\n        const result = [];\n        const _interpolate = _getInterpolationMethod(options);\n        let i, ilen;\n        for(i = 0, ilen = segments.length; i < ilen; ++i){\n            const { start , end  } = segments[i];\n            const p1 = points[start];\n            const p2 = points[end];\n            if (p1 === p2) {\n                result.push(p1);\n                continue;\n            }\n            const t = Math.abs((value - p1[property]) / (p2[property] - p1[property]));\n            const interpolated = _interpolate(p1, p2, t, options.stepped);\n            interpolated[property] = point[property];\n            result.push(interpolated);\n        }\n        return result.length === 1 ? result[0] : result;\n    }\n pathSegment(ctx, segment, params) {\n        const segmentMethod = _getSegmentMethod(this);\n        return segmentMethod(ctx, this, segment, params);\n    }\n path(ctx, start, count) {\n        const segments = this.segments;\n        const segmentMethod = _getSegmentMethod(this);\n        let loop = this._loop;\n        start = start || 0;\n        count = count || this.points.length - start;\n        for (const segment of segments){\n            loop &= segmentMethod(ctx, this, segment, {\n                start,\n                end: start + count - 1\n            });\n        }\n        return !!loop;\n    }\n draw(ctx, chartArea, start, count) {\n        const options = this.options || {};\n        const points = this.points || [];\n        if (points.length && options.borderWidth) {\n            ctx.save();\n            draw(ctx, this, start, count);\n            ctx.restore();\n        }\n        if (this.animated) {\n            this._pointsUpdated = false;\n            this._path = undefined;\n        }\n    }\n}\n\nfunction inRange$1(el, pos, axis, useFinalPosition) {\n    const options = el.options;\n    const { [axis]: value  } = el.getProps([\n        axis\n    ], useFinalPosition);\n    return Math.abs(pos - value) < options.radius + options.hitRadius;\n}\nclass PointElement extends Element {\n    static id = 'point';\n    parsed;\n    skip;\n    stop;\n    /**\n   * @type {any}\n   */ static defaults = {\n        borderWidth: 1,\n        hitRadius: 1,\n        hoverBorderWidth: 1,\n        hoverRadius: 4,\n        pointStyle: 'circle',\n        radius: 3,\n        rotation: 0\n    };\n    /**\n   * @type {any}\n   */ static defaultRoutes = {\n        backgroundColor: 'backgroundColor',\n        borderColor: 'borderColor'\n    };\n    constructor(cfg){\n        super();\n        this.options = undefined;\n        this.parsed = undefined;\n        this.skip = undefined;\n        this.stop = undefined;\n        if (cfg) {\n            Object.assign(this, cfg);\n        }\n    }\n    inRange(mouseX, mouseY, useFinalPosition) {\n        const options = this.options;\n        const { x , y  } = this.getProps([\n            'x',\n            'y'\n        ], useFinalPosition);\n        return Math.pow(mouseX - x, 2) + Math.pow(mouseY - y, 2) < Math.pow(options.hitRadius + options.radius, 2);\n    }\n    inXRange(mouseX, useFinalPosition) {\n        return inRange$1(this, mouseX, 'x', useFinalPosition);\n    }\n    inYRange(mouseY, useFinalPosition) {\n        return inRange$1(this, mouseY, 'y', useFinalPosition);\n    }\n    getCenterPoint(useFinalPosition) {\n        const { x , y  } = this.getProps([\n            'x',\n            'y'\n        ], useFinalPosition);\n        return {\n            x,\n            y\n        };\n    }\n    size(options) {\n        options = options || this.options || {};\n        let radius = options.radius || 0;\n        radius = Math.max(radius, radius && options.hoverRadius || 0);\n        const borderWidth = radius && options.borderWidth || 0;\n        return (radius + borderWidth) * 2;\n    }\n    draw(ctx, area) {\n        const options = this.options;\n        if (this.skip || options.radius < 0.1 || !_isPointInArea(this, area, this.size(options) / 2)) {\n            return;\n        }\n        ctx.strokeStyle = options.borderColor;\n        ctx.lineWidth = options.borderWidth;\n        ctx.fillStyle = options.backgroundColor;\n        drawPoint(ctx, options, this.x, this.y);\n    }\n    getRange() {\n        const options = this.options || {};\n        // @ts-expect-error Fallbacks should never be hit in practice\n        return options.radius + options.hitRadius;\n    }\n}\n\nfunction getBarBounds(bar, useFinalPosition) {\n    const { x , y , base , width , height  } =  bar.getProps([\n        'x',\n        'y',\n        'base',\n        'width',\n        'height'\n    ], useFinalPosition);\n    let left, right, top, bottom, half;\n    if (bar.horizontal) {\n        half = height / 2;\n        left = Math.min(x, base);\n        right = Math.max(x, base);\n        top = y - half;\n        bottom = y + half;\n    } else {\n        half = width / 2;\n        left = x - half;\n        right = x + half;\n        top = Math.min(y, base);\n        bottom = Math.max(y, base);\n    }\n    return {\n        left,\n        top,\n        right,\n        bottom\n    };\n}\nfunction skipOrLimit(skip, value, min, max) {\n    return skip ? 0 : _limitValue(value, min, max);\n}\nfunction parseBorderWidth(bar, maxW, maxH) {\n    const value = bar.options.borderWidth;\n    const skip = bar.borderSkipped;\n    const o = toTRBL(value);\n    return {\n        t: skipOrLimit(skip.top, o.top, 0, maxH),\n        r: skipOrLimit(skip.right, o.right, 0, maxW),\n        b: skipOrLimit(skip.bottom, o.bottom, 0, maxH),\n        l: skipOrLimit(skip.left, o.left, 0, maxW)\n    };\n}\nfunction parseBorderRadius(bar, maxW, maxH) {\n    const { enableBorderRadius  } = bar.getProps([\n        'enableBorderRadius'\n    ]);\n    const value = bar.options.borderRadius;\n    const o = toTRBLCorners(value);\n    const maxR = Math.min(maxW, maxH);\n    const skip = bar.borderSkipped;\n    const enableBorder = enableBorderRadius || isObject(value);\n    return {\n        topLeft: skipOrLimit(!enableBorder || skip.top || skip.left, o.topLeft, 0, maxR),\n        topRight: skipOrLimit(!enableBorder || skip.top || skip.right, o.topRight, 0, maxR),\n        bottomLeft: skipOrLimit(!enableBorder || skip.bottom || skip.left, o.bottomLeft, 0, maxR),\n        bottomRight: skipOrLimit(!enableBorder || skip.bottom || skip.right, o.bottomRight, 0, maxR)\n    };\n}\nfunction boundingRects(bar) {\n    const bounds = getBarBounds(bar);\n    const width = bounds.right - bounds.left;\n    const height = bounds.bottom - bounds.top;\n    const border = parseBorderWidth(bar, width / 2, height / 2);\n    const radius = parseBorderRadius(bar, width / 2, height / 2);\n    return {\n        outer: {\n            x: bounds.left,\n            y: bounds.top,\n            w: width,\n            h: height,\n            radius\n        },\n        inner: {\n            x: bounds.left + border.l,\n            y: bounds.top + border.t,\n            w: width - border.l - border.r,\n            h: height - border.t - border.b,\n            radius: {\n                topLeft: Math.max(0, radius.topLeft - Math.max(border.t, border.l)),\n                topRight: Math.max(0, radius.topRight - Math.max(border.t, border.r)),\n                bottomLeft: Math.max(0, radius.bottomLeft - Math.max(border.b, border.l)),\n                bottomRight: Math.max(0, radius.bottomRight - Math.max(border.b, border.r))\n            }\n        }\n    };\n}\nfunction inRange(bar, x, y, useFinalPosition) {\n    const skipX = x === null;\n    const skipY = y === null;\n    const skipBoth = skipX && skipY;\n    const bounds = bar && !skipBoth && getBarBounds(bar, useFinalPosition);\n    return bounds && (skipX || _isBetween(x, bounds.left, bounds.right)) && (skipY || _isBetween(y, bounds.top, bounds.bottom));\n}\nfunction hasRadius(radius) {\n    return radius.topLeft || radius.topRight || radius.bottomLeft || radius.bottomRight;\n}\n function addNormalRectPath(ctx, rect) {\n    ctx.rect(rect.x, rect.y, rect.w, rect.h);\n}\nfunction inflateRect(rect, amount, refRect = {}) {\n    const x = rect.x !== refRect.x ? -amount : 0;\n    const y = rect.y !== refRect.y ? -amount : 0;\n    const w = (rect.x + rect.w !== refRect.x + refRect.w ? amount : 0) - x;\n    const h = (rect.y + rect.h !== refRect.y + refRect.h ? amount : 0) - y;\n    return {\n        x: rect.x + x,\n        y: rect.y + y,\n        w: rect.w + w,\n        h: rect.h + h,\n        radius: rect.radius\n    };\n}\nclass BarElement extends Element {\n    static id = 'bar';\n static defaults = {\n        borderSkipped: 'start',\n        borderWidth: 0,\n        borderRadius: 0,\n        inflateAmount: 'auto',\n        pointStyle: undefined\n    };\n static defaultRoutes = {\n        backgroundColor: 'backgroundColor',\n        borderColor: 'borderColor'\n    };\n    constructor(cfg){\n        super();\n        this.options = undefined;\n        this.horizontal = undefined;\n        this.base = undefined;\n        this.width = undefined;\n        this.height = undefined;\n        this.inflateAmount = undefined;\n        if (cfg) {\n            Object.assign(this, cfg);\n        }\n    }\n    draw(ctx) {\n        const { inflateAmount , options: { borderColor , backgroundColor  }  } = this;\n        const { inner , outer  } = boundingRects(this);\n        const addRectPath = hasRadius(outer.radius) ? addRoundedRectPath : addNormalRectPath;\n        ctx.save();\n        if (outer.w !== inner.w || outer.h !== inner.h) {\n            ctx.beginPath();\n            addRectPath(ctx, inflateRect(outer, inflateAmount, inner));\n            ctx.clip();\n            addRectPath(ctx, inflateRect(inner, -inflateAmount, outer));\n            ctx.fillStyle = borderColor;\n            ctx.fill('evenodd');\n        }\n        ctx.beginPath();\n        addRectPath(ctx, inflateRect(inner, inflateAmount));\n        ctx.fillStyle = backgroundColor;\n        ctx.fill();\n        ctx.restore();\n    }\n    inRange(mouseX, mouseY, useFinalPosition) {\n        return inRange(this, mouseX, mouseY, useFinalPosition);\n    }\n    inXRange(mouseX, useFinalPosition) {\n        return inRange(this, mouseX, null, useFinalPosition);\n    }\n    inYRange(mouseY, useFinalPosition) {\n        return inRange(this, null, mouseY, useFinalPosition);\n    }\n    getCenterPoint(useFinalPosition) {\n        const { x , y , base , horizontal  } =  this.getProps([\n            'x',\n            'y',\n            'base',\n            'horizontal'\n        ], useFinalPosition);\n        return {\n            x: horizontal ? (x + base) / 2 : x,\n            y: horizontal ? y : (y + base) / 2\n        };\n    }\n    getRange(axis) {\n        return axis === 'x' ? this.width / 2 : this.height / 2;\n    }\n}\n\nvar elements = /*#__PURE__*/Object.freeze({\n__proto__: null,\nArcElement: ArcElement,\nBarElement: BarElement,\nLineElement: LineElement,\nPointElement: PointElement\n});\n\nconst BORDER_COLORS = [\n    'rgb(54, 162, 235)',\n    'rgb(255, 99, 132)',\n    'rgb(255, 159, 64)',\n    'rgb(255, 205, 86)',\n    'rgb(75, 192, 192)',\n    'rgb(153, 102, 255)',\n    'rgb(201, 203, 207)' // grey\n];\n// Border colors with 50% transparency\nconst BACKGROUND_COLORS = /* #__PURE__ */ BORDER_COLORS.map((color)=>color.replace('rgb(', 'rgba(').replace(')', ', 0.5)'));\nfunction getBorderColor(i) {\n    return BORDER_COLORS[i % BORDER_COLORS.length];\n}\nfunction getBackgroundColor(i) {\n    return BACKGROUND_COLORS[i % BACKGROUND_COLORS.length];\n}\nfunction colorizeDefaultDataset(dataset, i) {\n    dataset.borderColor = getBorderColor(i);\n    dataset.backgroundColor = getBackgroundColor(i);\n    return ++i;\n}\nfunction colorizeDoughnutDataset(dataset, i) {\n    dataset.backgroundColor = dataset.data.map(()=>getBorderColor(i++));\n    return i;\n}\nfunction colorizePolarAreaDataset(dataset, i) {\n    dataset.backgroundColor = dataset.data.map(()=>getBackgroundColor(i++));\n    return i;\n}\nfunction getColorizer(chart) {\n    let i = 0;\n    return (dataset, datasetIndex)=>{\n        const controller = chart.getDatasetMeta(datasetIndex).controller;\n        if (controller instanceof DoughnutController) {\n            i = colorizeDoughnutDataset(dataset, i);\n        } else if (controller instanceof PolarAreaController) {\n            i = colorizePolarAreaDataset(dataset, i);\n        } else if (controller) {\n            i = colorizeDefaultDataset(dataset, i);\n        }\n    };\n}\nfunction containsColorsDefinitions(descriptors) {\n    let k;\n    for(k in descriptors){\n        if (descriptors[k].borderColor || descriptors[k].backgroundColor) {\n            return true;\n        }\n    }\n    return false;\n}\nfunction containsColorsDefinition(descriptor) {\n    return descriptor && (descriptor.borderColor || descriptor.backgroundColor);\n}\nfunction containsDefaultColorsDefenitions() {\n    return defaults.borderColor !== 'rgba(0,0,0,0.1)' || defaults.backgroundColor !== 'rgba(0,0,0,0.1)';\n}\nvar plugin_colors = {\n    id: 'colors',\n    defaults: {\n        enabled: true,\n        forceOverride: false\n    },\n    beforeLayout (chart, _args, options) {\n        if (!options.enabled) {\n            return;\n        }\n        const { data: { datasets  } , options: chartOptions  } = chart.config;\n        const { elements  } = chartOptions;\n        const containsColorDefenition = containsColorsDefinitions(datasets) || containsColorsDefinition(chartOptions) || elements && containsColorsDefinitions(elements) || containsDefaultColorsDefenitions();\n        if (!options.forceOverride && containsColorDefenition) {\n            return;\n        }\n        const colorizer = getColorizer(chart);\n        datasets.forEach(colorizer);\n    }\n};\n\nfunction lttbDecimation(data, start, count, availableWidth, options) {\n const samples = options.samples || availableWidth;\n    if (samples >= count) {\n        return data.slice(start, start + count);\n    }\n    const decimated = [];\n    const bucketWidth = (count - 2) / (samples - 2);\n    let sampledIndex = 0;\n    const endIndex = start + count - 1;\n    let a = start;\n    let i, maxAreaPoint, maxArea, area, nextA;\n    decimated[sampledIndex++] = data[a];\n    for(i = 0; i < samples - 2; i++){\n        let avgX = 0;\n        let avgY = 0;\n        let j;\n        const avgRangeStart = Math.floor((i + 1) * bucketWidth) + 1 + start;\n        const avgRangeEnd = Math.min(Math.floor((i + 2) * bucketWidth) + 1, count) + start;\n        const avgRangeLength = avgRangeEnd - avgRangeStart;\n        for(j = avgRangeStart; j < avgRangeEnd; j++){\n            avgX += data[j].x;\n            avgY += data[j].y;\n        }\n        avgX /= avgRangeLength;\n        avgY /= avgRangeLength;\n        const rangeOffs = Math.floor(i * bucketWidth) + 1 + start;\n        const rangeTo = Math.min(Math.floor((i + 1) * bucketWidth) + 1, count) + start;\n        const { x: pointAx , y: pointAy  } = data[a];\n        maxArea = area = -1;\n        for(j = rangeOffs; j < rangeTo; j++){\n            area = 0.5 * Math.abs((pointAx - avgX) * (data[j].y - pointAy) - (pointAx - data[j].x) * (avgY - pointAy));\n            if (area > maxArea) {\n                maxArea = area;\n                maxAreaPoint = data[j];\n                nextA = j;\n            }\n        }\n        decimated[sampledIndex++] = maxAreaPoint;\n        a = nextA;\n    }\n    decimated[sampledIndex++] = data[endIndex];\n    return decimated;\n}\nfunction minMaxDecimation(data, start, count, availableWidth) {\n    let avgX = 0;\n    let countX = 0;\n    let i, point, x, y, prevX, minIndex, maxIndex, startIndex, minY, maxY;\n    const decimated = [];\n    const endIndex = start + count - 1;\n    const xMin = data[start].x;\n    const xMax = data[endIndex].x;\n    const dx = xMax - xMin;\n    for(i = start; i < start + count; ++i){\n        point = data[i];\n        x = (point.x - xMin) / dx * availableWidth;\n        y = point.y;\n        const truncX = x | 0;\n        if (truncX === prevX) {\n            if (y < minY) {\n                minY = y;\n                minIndex = i;\n            } else if (y > maxY) {\n                maxY = y;\n                maxIndex = i;\n            }\n            avgX = (countX * avgX + point.x) / ++countX;\n        } else {\n            const lastIndex = i - 1;\n            if (!isNullOrUndef(minIndex) && !isNullOrUndef(maxIndex)) {\n                const intermediateIndex1 = Math.min(minIndex, maxIndex);\n                const intermediateIndex2 = Math.max(minIndex, maxIndex);\n                if (intermediateIndex1 !== startIndex && intermediateIndex1 !== lastIndex) {\n                    decimated.push({\n                        ...data[intermediateIndex1],\n                        x: avgX\n                    });\n                }\n                if (intermediateIndex2 !== startIndex && intermediateIndex2 !== lastIndex) {\n                    decimated.push({\n                        ...data[intermediateIndex2],\n                        x: avgX\n                    });\n                }\n            }\n            if (i > 0 && lastIndex !== startIndex) {\n                decimated.push(data[lastIndex]);\n            }\n            decimated.push(point);\n            prevX = truncX;\n            countX = 0;\n            minY = maxY = y;\n            minIndex = maxIndex = startIndex = i;\n        }\n    }\n    return decimated;\n}\nfunction cleanDecimatedDataset(dataset) {\n    if (dataset._decimated) {\n        const data = dataset._data;\n        delete dataset._decimated;\n        delete dataset._data;\n        Object.defineProperty(dataset, 'data', {\n            configurable: true,\n            enumerable: true,\n            writable: true,\n            value: data\n        });\n    }\n}\nfunction cleanDecimatedData(chart) {\n    chart.data.datasets.forEach((dataset)=>{\n        cleanDecimatedDataset(dataset);\n    });\n}\nfunction getStartAndCountOfVisiblePointsSimplified(meta, points) {\n    const pointCount = points.length;\n    let start = 0;\n    let count;\n    const { iScale  } = meta;\n    const { min , max , minDefined , maxDefined  } = iScale.getUserBounds();\n    if (minDefined) {\n        start = _limitValue(_lookupByKey(points, iScale.axis, min).lo, 0, pointCount - 1);\n    }\n    if (maxDefined) {\n        count = _limitValue(_lookupByKey(points, iScale.axis, max).hi + 1, start, pointCount) - start;\n    } else {\n        count = pointCount - start;\n    }\n    return {\n        start,\n        count\n    };\n}\nvar plugin_decimation = {\n    id: 'decimation',\n    defaults: {\n        algorithm: 'min-max',\n        enabled: false\n    },\n    beforeElementsUpdate: (chart, args, options)=>{\n        if (!options.enabled) {\n            cleanDecimatedData(chart);\n            return;\n        }\n        const availableWidth = chart.width;\n        chart.data.datasets.forEach((dataset, datasetIndex)=>{\n            const { _data , indexAxis  } = dataset;\n            const meta = chart.getDatasetMeta(datasetIndex);\n            const data = _data || dataset.data;\n            if (resolve([\n                indexAxis,\n                chart.options.indexAxis\n            ]) === 'y') {\n                return;\n            }\n            if (!meta.controller.supportsDecimation) {\n                return;\n            }\n            const xAxis = chart.scales[meta.xAxisID];\n            if (xAxis.type !== 'linear' && xAxis.type !== 'time') {\n                return;\n            }\n            if (chart.options.parsing) {\n                return;\n            }\n            let { start , count  } = getStartAndCountOfVisiblePointsSimplified(meta, data);\n            const threshold = options.threshold || 4 * availableWidth;\n            if (count <= threshold) {\n                cleanDecimatedDataset(dataset);\n                return;\n            }\n            if (isNullOrUndef(_data)) {\n                dataset._data = data;\n                delete dataset.data;\n                Object.defineProperty(dataset, 'data', {\n                    configurable: true,\n                    enumerable: true,\n                    get: function() {\n                        return this._decimated;\n                    },\n                    set: function(d) {\n                        this._data = d;\n                    }\n                });\n            }\n            let decimated;\n            switch(options.algorithm){\n                case 'lttb':\n                    decimated = lttbDecimation(data, start, count, availableWidth, options);\n                    break;\n                case 'min-max':\n                    decimated = minMaxDecimation(data, start, count, availableWidth);\n                    break;\n                default:\n                    throw new Error(`Unsupported decimation algorithm '${options.algorithm}'`);\n            }\n            dataset._decimated = decimated;\n        });\n    },\n    destroy (chart) {\n        cleanDecimatedData(chart);\n    }\n};\n\nfunction _segments(line, target, property) {\n    const segments = line.segments;\n    const points = line.points;\n    const tpoints = target.points;\n    const parts = [];\n    for (const segment of segments){\n        let { start , end  } = segment;\n        end = _findSegmentEnd(start, end, points);\n        const bounds = _getBounds(property, points[start], points[end], segment.loop);\n        if (!target.segments) {\n            parts.push({\n                source: segment,\n                target: bounds,\n                start: points[start],\n                end: points[end]\n            });\n            continue;\n        }\n        const targetSegments = _boundSegments(target, bounds);\n        for (const tgt of targetSegments){\n            const subBounds = _getBounds(property, tpoints[tgt.start], tpoints[tgt.end], tgt.loop);\n            const fillSources = _boundSegment(segment, points, subBounds);\n            for (const fillSource of fillSources){\n                parts.push({\n                    source: fillSource,\n                    target: tgt,\n                    start: {\n                        [property]: _getEdge(bounds, subBounds, 'start', Math.max)\n                    },\n                    end: {\n                        [property]: _getEdge(bounds, subBounds, 'end', Math.min)\n                    }\n                });\n            }\n        }\n    }\n    return parts;\n}\nfunction _getBounds(property, first, last, loop) {\n    if (loop) {\n        return;\n    }\n    let start = first[property];\n    let end = last[property];\n    if (property === 'angle') {\n        start = _normalizeAngle(start);\n        end = _normalizeAngle(end);\n    }\n    return {\n        property,\n        start,\n        end\n    };\n}\nfunction _pointsFromSegments(boundary, line) {\n    const { x =null , y =null  } = boundary || {};\n    const linePoints = line.points;\n    const points = [];\n    line.segments.forEach(({ start , end  })=>{\n        end = _findSegmentEnd(start, end, linePoints);\n        const first = linePoints[start];\n        const last = linePoints[end];\n        if (y !== null) {\n            points.push({\n                x: first.x,\n                y\n            });\n            points.push({\n                x: last.x,\n                y\n            });\n        } else if (x !== null) {\n            points.push({\n                x,\n                y: first.y\n            });\n            points.push({\n                x,\n                y: last.y\n            });\n        }\n    });\n    return points;\n}\nfunction _findSegmentEnd(start, end, points) {\n    for(; end > start; end--){\n        const point = points[end];\n        if (!isNaN(point.x) && !isNaN(point.y)) {\n            break;\n        }\n    }\n    return end;\n}\nfunction _getEdge(a, b, prop, fn) {\n    if (a && b) {\n        return fn(a[prop], b[prop]);\n    }\n    return a ? a[prop] : b ? b[prop] : 0;\n}\n\nfunction _createBoundaryLine(boundary, line) {\n    let points = [];\n    let _loop = false;\n    if (isArray(boundary)) {\n        _loop = true;\n        points = boundary;\n    } else {\n        points = _pointsFromSegments(boundary, line);\n    }\n    return points.length ? new LineElement({\n        points,\n        options: {\n            tension: 0\n        },\n        _loop,\n        _fullLoop: _loop\n    }) : null;\n}\nfunction _shouldApplyFill(source) {\n    return source && source.fill !== false;\n}\n\nfunction _resolveTarget(sources, index, propagate) {\n    const source = sources[index];\n    let fill = source.fill;\n    const visited = [\n        index\n    ];\n    let target;\n    if (!propagate) {\n        return fill;\n    }\n    while(fill !== false && visited.indexOf(fill) === -1){\n        if (!isNumberFinite(fill)) {\n            return fill;\n        }\n        target = sources[fill];\n        if (!target) {\n            return false;\n        }\n        if (target.visible) {\n            return fill;\n        }\n        visited.push(fill);\n        fill = target.fill;\n    }\n    return false;\n}\n function _decodeFill(line, index, count) {\n     const fill = parseFillOption(line);\n    if (isObject(fill)) {\n        return isNaN(fill.value) ? false : fill;\n    }\n    let target = parseFloat(fill);\n    if (isNumberFinite(target) && Math.floor(target) === target) {\n        return decodeTargetIndex(fill[0], index, target, count);\n    }\n    return [\n        'origin',\n        'start',\n        'end',\n        'stack',\n        'shape'\n    ].indexOf(fill) >= 0 && fill;\n}\nfunction decodeTargetIndex(firstCh, index, target, count) {\n    if (firstCh === '-' || firstCh === '+') {\n        target = index + target;\n    }\n    if (target === index || target < 0 || target >= count) {\n        return false;\n    }\n    return target;\n}\n function _getTargetPixel(fill, scale) {\n    let pixel = null;\n    if (fill === 'start') {\n        pixel = scale.bottom;\n    } else if (fill === 'end') {\n        pixel = scale.top;\n    } else if (isObject(fill)) {\n        pixel = scale.getPixelForValue(fill.value);\n    } else if (scale.getBasePixel) {\n        pixel = scale.getBasePixel();\n    }\n    return pixel;\n}\n function _getTargetValue(fill, scale, startValue) {\n    let value;\n    if (fill === 'start') {\n        value = startValue;\n    } else if (fill === 'end') {\n        value = scale.options.reverse ? scale.min : scale.max;\n    } else if (isObject(fill)) {\n        value = fill.value;\n    } else {\n        value = scale.getBaseValue();\n    }\n    return value;\n}\n function parseFillOption(line) {\n    const options = line.options;\n    const fillOption = options.fill;\n    let fill = valueOrDefault(fillOption && fillOption.target, fillOption);\n    if (fill === undefined) {\n        fill = !!options.backgroundColor;\n    }\n    if (fill === false || fill === null) {\n        return false;\n    }\n    if (fill === true) {\n        return 'origin';\n    }\n    return fill;\n}\n\nfunction _buildStackLine(source) {\n    const { scale , index , line  } = source;\n    const points = [];\n    const segments = line.segments;\n    const sourcePoints = line.points;\n    const linesBelow = getLinesBelow(scale, index);\n    linesBelow.push(_createBoundaryLine({\n        x: null,\n        y: scale.bottom\n    }, line));\n    for(let i = 0; i < segments.length; i++){\n        const segment = segments[i];\n        for(let j = segment.start; j <= segment.end; j++){\n            addPointsBelow(points, sourcePoints[j], linesBelow);\n        }\n    }\n    return new LineElement({\n        points,\n        options: {}\n    });\n}\n function getLinesBelow(scale, index) {\n    const below = [];\n    const metas = scale.getMatchingVisibleMetas('line');\n    for(let i = 0; i < metas.length; i++){\n        const meta = metas[i];\n        if (meta.index === index) {\n            break;\n        }\n        if (!meta.hidden) {\n            below.unshift(meta.dataset);\n        }\n    }\n    return below;\n}\n function addPointsBelow(points, sourcePoint, linesBelow) {\n    const postponed = [];\n    for(let j = 0; j < linesBelow.length; j++){\n        const line = linesBelow[j];\n        const { first , last , point  } = findPoint(line, sourcePoint, 'x');\n        if (!point || first && last) {\n            continue;\n        }\n        if (first) {\n            postponed.unshift(point);\n        } else {\n            points.push(point);\n            if (!last) {\n                break;\n            }\n        }\n    }\n    points.push(...postponed);\n}\n function findPoint(line, sourcePoint, property) {\n    const point = line.interpolate(sourcePoint, property);\n    if (!point) {\n        return {};\n    }\n    const pointValue = point[property];\n    const segments = line.segments;\n    const linePoints = line.points;\n    let first = false;\n    let last = false;\n    for(let i = 0; i < segments.length; i++){\n        const segment = segments[i];\n        const firstValue = linePoints[segment.start][property];\n        const lastValue = linePoints[segment.end][property];\n        if (_isBetween(pointValue, firstValue, lastValue)) {\n            first = pointValue === firstValue;\n            last = pointValue === lastValue;\n            break;\n        }\n    }\n    return {\n        first,\n        last,\n        point\n    };\n}\n\nclass simpleArc {\n    constructor(opts){\n        this.x = opts.x;\n        this.y = opts.y;\n        this.radius = opts.radius;\n    }\n    pathSegment(ctx, bounds, opts) {\n        const { x , y , radius  } = this;\n        bounds = bounds || {\n            start: 0,\n            end: TAU\n        };\n        ctx.arc(x, y, radius, bounds.end, bounds.start, true);\n        return !opts.bounds;\n    }\n    interpolate(point) {\n        const { x , y , radius  } = this;\n        const angle = point.angle;\n        return {\n            x: x + Math.cos(angle) * radius,\n            y: y + Math.sin(angle) * radius,\n            angle\n        };\n    }\n}\n\nfunction _getTarget(source) {\n    const { chart , fill , line  } = source;\n    if (isNumberFinite(fill)) {\n        return getLineByIndex(chart, fill);\n    }\n    if (fill === 'stack') {\n        return _buildStackLine(source);\n    }\n    if (fill === 'shape') {\n        return true;\n    }\n    const boundary = computeBoundary(source);\n    if (boundary instanceof simpleArc) {\n        return boundary;\n    }\n    return _createBoundaryLine(boundary, line);\n}\n function getLineByIndex(chart, index) {\n    const meta = chart.getDatasetMeta(index);\n    const visible = meta && chart.isDatasetVisible(index);\n    return visible ? meta.dataset : null;\n}\nfunction computeBoundary(source) {\n    const scale = source.scale || {};\n    if (scale.getPointPositionForValue) {\n        return computeCircularBoundary(source);\n    }\n    return computeLinearBoundary(source);\n}\nfunction computeLinearBoundary(source) {\n    const { scale ={} , fill  } = source;\n    const pixel = _getTargetPixel(fill, scale);\n    if (isNumberFinite(pixel)) {\n        const horizontal = scale.isHorizontal();\n        return {\n            x: horizontal ? pixel : null,\n            y: horizontal ? null : pixel\n        };\n    }\n    return null;\n}\nfunction computeCircularBoundary(source) {\n    const { scale , fill  } = source;\n    const options = scale.options;\n    const length = scale.getLabels().length;\n    const start = options.reverse ? scale.max : scale.min;\n    const value = _getTargetValue(fill, scale, start);\n    const target = [];\n    if (options.grid.circular) {\n        const center = scale.getPointPositionForValue(0, start);\n        return new simpleArc({\n            x: center.x,\n            y: center.y,\n            radius: scale.getDistanceFromCenterForValue(value)\n        });\n    }\n    for(let i = 0; i < length; ++i){\n        target.push(scale.getPointPositionForValue(i, value));\n    }\n    return target;\n}\n\nfunction _drawfill(ctx, source, area) {\n    const target = _getTarget(source);\n    const { line , scale , axis  } = source;\n    const lineOpts = line.options;\n    const fillOption = lineOpts.fill;\n    const color = lineOpts.backgroundColor;\n    const { above =color , below =color  } = fillOption || {};\n    if (target && line.points.length) {\n        clipArea(ctx, area);\n        doFill(ctx, {\n            line,\n            target,\n            above,\n            below,\n            area,\n            scale,\n            axis\n        });\n        unclipArea(ctx);\n    }\n}\nfunction doFill(ctx, cfg) {\n    const { line , target , above , below , area , scale  } = cfg;\n    const property = line._loop ? 'angle' : cfg.axis;\n    ctx.save();\n    if (property === 'x' && below !== above) {\n        clipVertical(ctx, target, area.top);\n        fill(ctx, {\n            line,\n            target,\n            color: above,\n            scale,\n            property\n        });\n        ctx.restore();\n        ctx.save();\n        clipVertical(ctx, target, area.bottom);\n    }\n    fill(ctx, {\n        line,\n        target,\n        color: below,\n        scale,\n        property\n    });\n    ctx.restore();\n}\nfunction clipVertical(ctx, target, clipY) {\n    const { segments , points  } = target;\n    let first = true;\n    let lineLoop = false;\n    ctx.beginPath();\n    for (const segment of segments){\n        const { start , end  } = segment;\n        const firstPoint = points[start];\n        const lastPoint = points[_findSegmentEnd(start, end, points)];\n        if (first) {\n            ctx.moveTo(firstPoint.x, firstPoint.y);\n            first = false;\n        } else {\n            ctx.lineTo(firstPoint.x, clipY);\n            ctx.lineTo(firstPoint.x, firstPoint.y);\n        }\n        lineLoop = !!target.pathSegment(ctx, segment, {\n            move: lineLoop\n        });\n        if (lineLoop) {\n            ctx.closePath();\n        } else {\n            ctx.lineTo(lastPoint.x, clipY);\n        }\n    }\n    ctx.lineTo(target.first().x, clipY);\n    ctx.closePath();\n    ctx.clip();\n}\nfunction fill(ctx, cfg) {\n    const { line , target , property , color , scale  } = cfg;\n    const segments = _segments(line, target, property);\n    for (const { source: src , target: tgt , start , end  } of segments){\n        const { style: { backgroundColor =color  } = {}  } = src;\n        const notShape = target !== true;\n        ctx.save();\n        ctx.fillStyle = backgroundColor;\n        clipBounds(ctx, scale, notShape && _getBounds(property, start, end));\n        ctx.beginPath();\n        const lineLoop = !!line.pathSegment(ctx, src);\n        let loop;\n        if (notShape) {\n            if (lineLoop) {\n                ctx.closePath();\n            } else {\n                interpolatedLineTo(ctx, target, end, property);\n            }\n            const targetLoop = !!target.pathSegment(ctx, tgt, {\n                move: lineLoop,\n                reverse: true\n            });\n            loop = lineLoop && targetLoop;\n            if (!loop) {\n                interpolatedLineTo(ctx, target, start, property);\n            }\n        }\n        ctx.closePath();\n        ctx.fill(loop ? 'evenodd' : 'nonzero');\n        ctx.restore();\n    }\n}\nfunction clipBounds(ctx, scale, bounds) {\n    const { top , bottom  } = scale.chart.chartArea;\n    const { property , start , end  } = bounds || {};\n    if (property === 'x') {\n        ctx.beginPath();\n        ctx.rect(start, top, end - start, bottom - top);\n        ctx.clip();\n    }\n}\nfunction interpolatedLineTo(ctx, target, point, property) {\n    const interpolatedPoint = target.interpolate(point, property);\n    if (interpolatedPoint) {\n        ctx.lineTo(interpolatedPoint.x, interpolatedPoint.y);\n    }\n}\n\nvar index = {\n    id: 'filler',\n    afterDatasetsUpdate (chart, _args, options) {\n        const count = (chart.data.datasets || []).length;\n        const sources = [];\n        let meta, i, line, source;\n        for(i = 0; i < count; ++i){\n            meta = chart.getDatasetMeta(i);\n            line = meta.dataset;\n            source = null;\n            if (line && line.options && line instanceof LineElement) {\n                source = {\n                    visible: chart.isDatasetVisible(i),\n                    index: i,\n                    fill: _decodeFill(line, i, count),\n                    chart,\n                    axis: meta.controller.options.indexAxis,\n                    scale: meta.vScale,\n                    line\n                };\n            }\n            meta.$filler = source;\n            sources.push(source);\n        }\n        for(i = 0; i < count; ++i){\n            source = sources[i];\n            if (!source || source.fill === false) {\n                continue;\n            }\n            source.fill = _resolveTarget(sources, i, options.propagate);\n        }\n    },\n    beforeDraw (chart, _args, options) {\n        const draw = options.drawTime === 'beforeDraw';\n        const metasets = chart.getSortedVisibleDatasetMetas();\n        const area = chart.chartArea;\n        for(let i = metasets.length - 1; i >= 0; --i){\n            const source = metasets[i].$filler;\n            if (!source) {\n                continue;\n            }\n            source.line.updateControlPoints(area, source.axis);\n            if (draw && source.fill) {\n                _drawfill(chart.ctx, source, area);\n            }\n        }\n    },\n    beforeDatasetsDraw (chart, _args, options) {\n        if (options.drawTime !== 'beforeDatasetsDraw') {\n            return;\n        }\n        const metasets = chart.getSortedVisibleDatasetMetas();\n        for(let i = metasets.length - 1; i >= 0; --i){\n            const source = metasets[i].$filler;\n            if (_shouldApplyFill(source)) {\n                _drawfill(chart.ctx, source, chart.chartArea);\n            }\n        }\n    },\n    beforeDatasetDraw (chart, args, options) {\n        const source = args.meta.$filler;\n        if (!_shouldApplyFill(source) || options.drawTime !== 'beforeDatasetDraw') {\n            return;\n        }\n        _drawfill(chart.ctx, source, chart.chartArea);\n    },\n    defaults: {\n        propagate: true,\n        drawTime: 'beforeDatasetDraw'\n    }\n};\n\nconst getBoxSize = (labelOpts, fontSize)=>{\n    let { boxHeight =fontSize , boxWidth =fontSize  } = labelOpts;\n    if (labelOpts.usePointStyle) {\n        boxHeight = Math.min(boxHeight, fontSize);\n        boxWidth = labelOpts.pointStyleWidth || Math.min(boxWidth, fontSize);\n    }\n    return {\n        boxWidth,\n        boxHeight,\n        itemHeight: Math.max(fontSize, boxHeight)\n    };\n};\nconst itemsEqual = (a, b)=>a !== null && b !== null && a.datasetIndex === b.datasetIndex && a.index === b.index;\nclass Legend extends Element {\n constructor(config){\n        super();\n        this._added = false;\n        this.legendHitBoxes = [];\n this._hoveredItem = null;\n        this.doughnutMode = false;\n        this.chart = config.chart;\n        this.options = config.options;\n        this.ctx = config.ctx;\n        this.legendItems = undefined;\n        this.columnSizes = undefined;\n        this.lineWidths = undefined;\n        this.maxHeight = undefined;\n        this.maxWidth = undefined;\n        this.top = undefined;\n        this.bottom = undefined;\n        this.left = undefined;\n        this.right = undefined;\n        this.height = undefined;\n        this.width = undefined;\n        this._margins = undefined;\n        this.position = undefined;\n        this.weight = undefined;\n        this.fullSize = undefined;\n    }\n    update(maxWidth, maxHeight, margins) {\n        this.maxWidth = maxWidth;\n        this.maxHeight = maxHeight;\n        this._margins = margins;\n        this.setDimensions();\n        this.buildLabels();\n        this.fit();\n    }\n    setDimensions() {\n        if (this.isHorizontal()) {\n            this.width = this.maxWidth;\n            this.left = this._margins.left;\n            this.right = this.width;\n        } else {\n            this.height = this.maxHeight;\n            this.top = this._margins.top;\n            this.bottom = this.height;\n        }\n    }\n    buildLabels() {\n        const labelOpts = this.options.labels || {};\n        let legendItems = callback(labelOpts.generateLabels, [\n            this.chart\n        ], this) || [];\n        if (labelOpts.filter) {\n            legendItems = legendItems.filter((item)=>labelOpts.filter(item, this.chart.data));\n        }\n        if (labelOpts.sort) {\n            legendItems = legendItems.sort((a, b)=>labelOpts.sort(a, b, this.chart.data));\n        }\n        if (this.options.reverse) {\n            legendItems.reverse();\n        }\n        this.legendItems = legendItems;\n    }\n    fit() {\n        const { options , ctx  } = this;\n        if (!options.display) {\n            this.width = this.height = 0;\n            return;\n        }\n        const labelOpts = options.labels;\n        const labelFont = toFont(labelOpts.font);\n        const fontSize = labelFont.size;\n        const titleHeight = this._computeTitleHeight();\n        const { boxWidth , itemHeight  } = getBoxSize(labelOpts, fontSize);\n        let width, height;\n        ctx.font = labelFont.string;\n        if (this.isHorizontal()) {\n            width = this.maxWidth;\n            height = this._fitRows(titleHeight, fontSize, boxWidth, itemHeight) + 10;\n        } else {\n            height = this.maxHeight;\n            width = this._fitCols(titleHeight, labelFont, boxWidth, itemHeight) + 10;\n        }\n        this.width = Math.min(width, options.maxWidth || this.maxWidth);\n        this.height = Math.min(height, options.maxHeight || this.maxHeight);\n    }\n _fitRows(titleHeight, fontSize, boxWidth, itemHeight) {\n        const { ctx , maxWidth , options: { labels: { padding  }  }  } = this;\n        const hitboxes = this.legendHitBoxes = [];\n        const lineWidths = this.lineWidths = [\n            0\n        ];\n        const lineHeight = itemHeight + padding;\n        let totalHeight = titleHeight;\n        ctx.textAlign = 'left';\n        ctx.textBaseline = 'middle';\n        let row = -1;\n        let top = -lineHeight;\n        this.legendItems.forEach((legendItem, i)=>{\n            const itemWidth = boxWidth + fontSize / 2 + ctx.measureText(legendItem.text).width;\n            if (i === 0 || lineWidths[lineWidths.length - 1] + itemWidth + 2 * padding > maxWidth) {\n                totalHeight += lineHeight;\n                lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = 0;\n                top += lineHeight;\n                row++;\n            }\n            hitboxes[i] = {\n                left: 0,\n                top,\n                row,\n                width: itemWidth,\n                height: itemHeight\n            };\n            lineWidths[lineWidths.length - 1] += itemWidth + padding;\n        });\n        return totalHeight;\n    }\n    _fitCols(titleHeight, labelFont, boxWidth, _itemHeight) {\n        const { ctx , maxHeight , options: { labels: { padding  }  }  } = this;\n        const hitboxes = this.legendHitBoxes = [];\n        const columnSizes = this.columnSizes = [];\n        const heightLimit = maxHeight - titleHeight;\n        let totalWidth = padding;\n        let currentColWidth = 0;\n        let currentColHeight = 0;\n        let left = 0;\n        let col = 0;\n        this.legendItems.forEach((legendItem, i)=>{\n            const { itemWidth , itemHeight  } = calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight);\n            if (i > 0 && currentColHeight + itemHeight + 2 * padding > heightLimit) {\n                totalWidth += currentColWidth + padding;\n                columnSizes.push({\n                    width: currentColWidth,\n                    height: currentColHeight\n                });\n                left += currentColWidth + padding;\n                col++;\n                currentColWidth = currentColHeight = 0;\n            }\n            hitboxes[i] = {\n                left,\n                top: currentColHeight,\n                col,\n                width: itemWidth,\n                height: itemHeight\n            };\n            currentColWidth = Math.max(currentColWidth, itemWidth);\n            currentColHeight += itemHeight + padding;\n        });\n        totalWidth += currentColWidth;\n        columnSizes.push({\n            width: currentColWidth,\n            height: currentColHeight\n        });\n        return totalWidth;\n    }\n    adjustHitBoxes() {\n        if (!this.options.display) {\n            return;\n        }\n        const titleHeight = this._computeTitleHeight();\n        const { legendHitBoxes: hitboxes , options: { align , labels: { padding  } , rtl  }  } = this;\n        const rtlHelper = getRtlAdapter(rtl, this.left, this.width);\n        if (this.isHorizontal()) {\n            let row = 0;\n            let left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n            for (const hitbox of hitboxes){\n                if (row !== hitbox.row) {\n                    row = hitbox.row;\n                    left = _alignStartEnd(align, this.left + padding, this.right - this.lineWidths[row]);\n                }\n                hitbox.top += this.top + titleHeight + padding;\n                hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(left), hitbox.width);\n                left += hitbox.width + padding;\n            }\n        } else {\n            let col = 0;\n            let top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n            for (const hitbox of hitboxes){\n                if (hitbox.col !== col) {\n                    col = hitbox.col;\n                    top = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - this.columnSizes[col].height);\n                }\n                hitbox.top = top;\n                hitbox.left += this.left + padding;\n                hitbox.left = rtlHelper.leftForLtr(rtlHelper.x(hitbox.left), hitbox.width);\n                top += hitbox.height + padding;\n            }\n        }\n    }\n    isHorizontal() {\n        return this.options.position === 'top' || this.options.position === 'bottom';\n    }\n    draw() {\n        if (this.options.display) {\n            const ctx = this.ctx;\n            clipArea(ctx, this);\n            this._draw();\n            unclipArea(ctx);\n        }\n    }\n _draw() {\n        const { options: opts , columnSizes , lineWidths , ctx  } = this;\n        const { align , labels: labelOpts  } = opts;\n        const defaultColor = defaults.color;\n        const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n        const labelFont = toFont(labelOpts.font);\n        const { padding  } = labelOpts;\n        const fontSize = labelFont.size;\n        const halfFontSize = fontSize / 2;\n        let cursor;\n        this.drawTitle();\n        ctx.textAlign = rtlHelper.textAlign('left');\n        ctx.textBaseline = 'middle';\n        ctx.lineWidth = 0.5;\n        ctx.font = labelFont.string;\n        const { boxWidth , boxHeight , itemHeight  } = getBoxSize(labelOpts, fontSize);\n        const drawLegendBox = function(x, y, legendItem) {\n            if (isNaN(boxWidth) || boxWidth <= 0 || isNaN(boxHeight) || boxHeight < 0) {\n                return;\n            }\n            ctx.save();\n            const lineWidth = valueOrDefault(legendItem.lineWidth, 1);\n            ctx.fillStyle = valueOrDefault(legendItem.fillStyle, defaultColor);\n            ctx.lineCap = valueOrDefault(legendItem.lineCap, 'butt');\n            ctx.lineDashOffset = valueOrDefault(legendItem.lineDashOffset, 0);\n            ctx.lineJoin = valueOrDefault(legendItem.lineJoin, 'miter');\n            ctx.lineWidth = lineWidth;\n            ctx.strokeStyle = valueOrDefault(legendItem.strokeStyle, defaultColor);\n            ctx.setLineDash(valueOrDefault(legendItem.lineDash, []));\n            if (labelOpts.usePointStyle) {\n                const drawOptions = {\n                    radius: boxHeight * Math.SQRT2 / 2,\n                    pointStyle: legendItem.pointStyle,\n                    rotation: legendItem.rotation,\n                    borderWidth: lineWidth\n                };\n                const centerX = rtlHelper.xPlus(x, boxWidth / 2);\n                const centerY = y + halfFontSize;\n                drawPointLegend(ctx, drawOptions, centerX, centerY, labelOpts.pointStyleWidth && boxWidth);\n            } else {\n                const yBoxTop = y + Math.max((fontSize - boxHeight) / 2, 0);\n                const xBoxLeft = rtlHelper.leftForLtr(x, boxWidth);\n                const borderRadius = toTRBLCorners(legendItem.borderRadius);\n                ctx.beginPath();\n                if (Object.values(borderRadius).some((v)=>v !== 0)) {\n                    addRoundedRectPath(ctx, {\n                        x: xBoxLeft,\n                        y: yBoxTop,\n                        w: boxWidth,\n                        h: boxHeight,\n                        radius: borderRadius\n                    });\n                } else {\n                    ctx.rect(xBoxLeft, yBoxTop, boxWidth, boxHeight);\n                }\n                ctx.fill();\n                if (lineWidth !== 0) {\n                    ctx.stroke();\n                }\n            }\n            ctx.restore();\n        };\n        const fillText = function(x, y, legendItem) {\n            renderText(ctx, legendItem.text, x, y + itemHeight / 2, labelFont, {\n                strikethrough: legendItem.hidden,\n                textAlign: rtlHelper.textAlign(legendItem.textAlign)\n            });\n        };\n        const isHorizontal = this.isHorizontal();\n        const titleHeight = this._computeTitleHeight();\n        if (isHorizontal) {\n            cursor = {\n                x: _alignStartEnd(align, this.left + padding, this.right - lineWidths[0]),\n                y: this.top + padding + titleHeight,\n                line: 0\n            };\n        } else {\n            cursor = {\n                x: this.left + padding,\n                y: _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[0].height),\n                line: 0\n            };\n        }\n        overrideTextDirection(this.ctx, opts.textDirection);\n        const lineHeight = itemHeight + padding;\n        this.legendItems.forEach((legendItem, i)=>{\n            ctx.strokeStyle = legendItem.fontColor;\n            ctx.fillStyle = legendItem.fontColor;\n            const textWidth = ctx.measureText(legendItem.text).width;\n            const textAlign = rtlHelper.textAlign(legendItem.textAlign || (legendItem.textAlign = labelOpts.textAlign));\n            const width = boxWidth + halfFontSize + textWidth;\n            let x = cursor.x;\n            let y = cursor.y;\n            rtlHelper.setWidth(this.width);\n            if (isHorizontal) {\n                if (i > 0 && x + width + padding > this.right) {\n                    y = cursor.y += lineHeight;\n                    cursor.line++;\n                    x = cursor.x = _alignStartEnd(align, this.left + padding, this.right - lineWidths[cursor.line]);\n                }\n            } else if (i > 0 && y + lineHeight > this.bottom) {\n                x = cursor.x = x + columnSizes[cursor.line].width + padding;\n                cursor.line++;\n                y = cursor.y = _alignStartEnd(align, this.top + titleHeight + padding, this.bottom - columnSizes[cursor.line].height);\n            }\n            const realX = rtlHelper.x(x);\n            drawLegendBox(realX, y, legendItem);\n            x = _textX(textAlign, x + boxWidth + halfFontSize, isHorizontal ? x + width : this.right, opts.rtl);\n            fillText(rtlHelper.x(x), y, legendItem);\n            if (isHorizontal) {\n                cursor.x += width + padding;\n            } else if (typeof legendItem.text !== 'string') {\n                const fontLineHeight = labelFont.lineHeight;\n                cursor.y += calculateLegendItemHeight(legendItem, fontLineHeight) + padding;\n            } else {\n                cursor.y += lineHeight;\n            }\n        });\n        restoreTextDirection(this.ctx, opts.textDirection);\n    }\n drawTitle() {\n        const opts = this.options;\n        const titleOpts = opts.title;\n        const titleFont = toFont(titleOpts.font);\n        const titlePadding = toPadding(titleOpts.padding);\n        if (!titleOpts.display) {\n            return;\n        }\n        const rtlHelper = getRtlAdapter(opts.rtl, this.left, this.width);\n        const ctx = this.ctx;\n        const position = titleOpts.position;\n        const halfFontSize = titleFont.size / 2;\n        const topPaddingPlusHalfFontSize = titlePadding.top + halfFontSize;\n        let y;\n        let left = this.left;\n        let maxWidth = this.width;\n        if (this.isHorizontal()) {\n            maxWidth = Math.max(...this.lineWidths);\n            y = this.top + topPaddingPlusHalfFontSize;\n            left = _alignStartEnd(opts.align, left, this.right - maxWidth);\n        } else {\n            const maxHeight = this.columnSizes.reduce((acc, size)=>Math.max(acc, size.height), 0);\n            y = topPaddingPlusHalfFontSize + _alignStartEnd(opts.align, this.top, this.bottom - maxHeight - opts.labels.padding - this._computeTitleHeight());\n        }\n        const x = _alignStartEnd(position, left, left + maxWidth);\n        ctx.textAlign = rtlHelper.textAlign(_toLeftRightCenter(position));\n        ctx.textBaseline = 'middle';\n        ctx.strokeStyle = titleOpts.color;\n        ctx.fillStyle = titleOpts.color;\n        ctx.font = titleFont.string;\n        renderText(ctx, titleOpts.text, x, y, titleFont);\n    }\n _computeTitleHeight() {\n        const titleOpts = this.options.title;\n        const titleFont = toFont(titleOpts.font);\n        const titlePadding = toPadding(titleOpts.padding);\n        return titleOpts.display ? titleFont.lineHeight + titlePadding.height : 0;\n    }\n _getLegendItemAt(x, y) {\n        let i, hitBox, lh;\n        if (_isBetween(x, this.left, this.right) && _isBetween(y, this.top, this.bottom)) {\n            lh = this.legendHitBoxes;\n            for(i = 0; i < lh.length; ++i){\n                hitBox = lh[i];\n                if (_isBetween(x, hitBox.left, hitBox.left + hitBox.width) && _isBetween(y, hitBox.top, hitBox.top + hitBox.height)) {\n                    return this.legendItems[i];\n                }\n            }\n        }\n        return null;\n    }\n handleEvent(e) {\n        const opts = this.options;\n        if (!isListened(e.type, opts)) {\n            return;\n        }\n        const hoveredItem = this._getLegendItemAt(e.x, e.y);\n        if (e.type === 'mousemove' || e.type === 'mouseout') {\n            const previous = this._hoveredItem;\n            const sameItem = itemsEqual(previous, hoveredItem);\n            if (previous && !sameItem) {\n                callback(opts.onLeave, [\n                    e,\n                    previous,\n                    this\n                ], this);\n            }\n            this._hoveredItem = hoveredItem;\n            if (hoveredItem && !sameItem) {\n                callback(opts.onHover, [\n                    e,\n                    hoveredItem,\n                    this\n                ], this);\n            }\n        } else if (hoveredItem) {\n            callback(opts.onClick, [\n                e,\n                hoveredItem,\n                this\n            ], this);\n        }\n    }\n}\nfunction calculateItemSize(boxWidth, labelFont, ctx, legendItem, _itemHeight) {\n    const itemWidth = calculateItemWidth(legendItem, boxWidth, labelFont, ctx);\n    const itemHeight = calculateItemHeight(_itemHeight, legendItem, labelFont.lineHeight);\n    return {\n        itemWidth,\n        itemHeight\n    };\n}\nfunction calculateItemWidth(legendItem, boxWidth, labelFont, ctx) {\n    let legendItemText = legendItem.text;\n    if (legendItemText && typeof legendItemText !== 'string') {\n        legendItemText = legendItemText.reduce((a, b)=>a.length > b.length ? a : b);\n    }\n    return boxWidth + labelFont.size / 2 + ctx.measureText(legendItemText).width;\n}\nfunction calculateItemHeight(_itemHeight, legendItem, fontLineHeight) {\n    let itemHeight = _itemHeight;\n    if (typeof legendItem.text !== 'string') {\n        itemHeight = calculateLegendItemHeight(legendItem, fontLineHeight);\n    }\n    return itemHeight;\n}\nfunction calculateLegendItemHeight(legendItem, fontLineHeight) {\n    const labelHeight = legendItem.text ? legendItem.text.length : 0;\n    return fontLineHeight * labelHeight;\n}\nfunction isListened(type, opts) {\n    if ((type === 'mousemove' || type === 'mouseout') && (opts.onHover || opts.onLeave)) {\n        return true;\n    }\n    if (opts.onClick && (type === 'click' || type === 'mouseup')) {\n        return true;\n    }\n    return false;\n}\nvar plugin_legend = {\n    id: 'legend',\n _element: Legend,\n    start (chart, _args, options) {\n        const legend = chart.legend = new Legend({\n            ctx: chart.ctx,\n            options,\n            chart\n        });\n        layouts.configure(chart, legend, options);\n        layouts.addBox(chart, legend);\n    },\n    stop (chart) {\n        layouts.removeBox(chart, chart.legend);\n        delete chart.legend;\n    },\n    beforeUpdate (chart, _args, options) {\n        const legend = chart.legend;\n        layouts.configure(chart, legend, options);\n        legend.options = options;\n    },\n    afterUpdate (chart) {\n        const legend = chart.legend;\n        legend.buildLabels();\n        legend.adjustHitBoxes();\n    },\n    afterEvent (chart, args) {\n        if (!args.replay) {\n            chart.legend.handleEvent(args.event);\n        }\n    },\n    defaults: {\n        display: true,\n        position: 'top',\n        align: 'center',\n        fullSize: true,\n        reverse: false,\n        weight: 1000,\n        onClick (e, legendItem, legend) {\n            const index = legendItem.datasetIndex;\n            const ci = legend.chart;\n            if (ci.isDatasetVisible(index)) {\n                ci.hide(index);\n                legendItem.hidden = true;\n            } else {\n                ci.show(index);\n                legendItem.hidden = false;\n            }\n        },\n        onHover: null,\n        onLeave: null,\n        labels: {\n            color: (ctx)=>ctx.chart.options.color,\n            boxWidth: 40,\n            padding: 10,\n            generateLabels (chart) {\n                const datasets = chart.data.datasets;\n                const { labels: { usePointStyle , pointStyle , textAlign , color , useBorderRadius , borderRadius  }  } = chart.legend.options;\n                return chart._getSortedDatasetMetas().map((meta)=>{\n                    const style = meta.controller.getStyle(usePointStyle ? 0 : undefined);\n                    const borderWidth = toPadding(style.borderWidth);\n                    return {\n                        text: datasets[meta.index].label,\n                        fillStyle: style.backgroundColor,\n                        fontColor: color,\n                        hidden: !meta.visible,\n                        lineCap: style.borderCapStyle,\n                        lineDash: style.borderDash,\n                        lineDashOffset: style.borderDashOffset,\n                        lineJoin: style.borderJoinStyle,\n                        lineWidth: (borderWidth.width + borderWidth.height) / 4,\n                        strokeStyle: style.borderColor,\n                        pointStyle: pointStyle || style.pointStyle,\n                        rotation: style.rotation,\n                        textAlign: textAlign || style.textAlign,\n                        borderRadius: useBorderRadius && (borderRadius || style.borderRadius),\n                        datasetIndex: meta.index\n                    };\n                }, this);\n            }\n        },\n        title: {\n            color: (ctx)=>ctx.chart.options.color,\n            display: false,\n            position: 'center',\n            text: ''\n        }\n    },\n    descriptors: {\n        _scriptable: (name)=>!name.startsWith('on'),\n        labels: {\n            _scriptable: (name)=>![\n                    'generateLabels',\n                    'filter',\n                    'sort'\n                ].includes(name)\n        }\n    }\n};\n\nclass Title extends Element {\n constructor(config){\n        super();\n        this.chart = config.chart;\n        this.options = config.options;\n        this.ctx = config.ctx;\n        this._padding = undefined;\n        this.top = undefined;\n        this.bottom = undefined;\n        this.left = undefined;\n        this.right = undefined;\n        this.width = undefined;\n        this.height = undefined;\n        this.position = undefined;\n        this.weight = undefined;\n        this.fullSize = undefined;\n    }\n    update(maxWidth, maxHeight) {\n        const opts = this.options;\n        this.left = 0;\n        this.top = 0;\n        if (!opts.display) {\n            this.width = this.height = this.right = this.bottom = 0;\n            return;\n        }\n        this.width = this.right = maxWidth;\n        this.height = this.bottom = maxHeight;\n        const lineCount = isArray(opts.text) ? opts.text.length : 1;\n        this._padding = toPadding(opts.padding);\n        const textSize = lineCount * toFont(opts.font).lineHeight + this._padding.height;\n        if (this.isHorizontal()) {\n            this.height = textSize;\n        } else {\n            this.width = textSize;\n        }\n    }\n    isHorizontal() {\n        const pos = this.options.position;\n        return pos === 'top' || pos === 'bottom';\n    }\n    _drawArgs(offset) {\n        const { top , left , bottom , right , options  } = this;\n        const align = options.align;\n        let rotation = 0;\n        let maxWidth, titleX, titleY;\n        if (this.isHorizontal()) {\n            titleX = _alignStartEnd(align, left, right);\n            titleY = top + offset;\n            maxWidth = right - left;\n        } else {\n            if (options.position === 'left') {\n                titleX = left + offset;\n                titleY = _alignStartEnd(align, bottom, top);\n                rotation = PI * -0.5;\n            } else {\n                titleX = right - offset;\n                titleY = _alignStartEnd(align, top, bottom);\n                rotation = PI * 0.5;\n            }\n            maxWidth = bottom - top;\n        }\n        return {\n            titleX,\n            titleY,\n            maxWidth,\n            rotation\n        };\n    }\n    draw() {\n        const ctx = this.ctx;\n        const opts = this.options;\n        if (!opts.display) {\n            return;\n        }\n        const fontOpts = toFont(opts.font);\n        const lineHeight = fontOpts.lineHeight;\n        const offset = lineHeight / 2 + this._padding.top;\n        const { titleX , titleY , maxWidth , rotation  } = this._drawArgs(offset);\n        renderText(ctx, opts.text, 0, 0, fontOpts, {\n            color: opts.color,\n            maxWidth,\n            rotation,\n            textAlign: _toLeftRightCenter(opts.align),\n            textBaseline: 'middle',\n            translation: [\n                titleX,\n                titleY\n            ]\n        });\n    }\n}\nfunction createTitle(chart, titleOpts) {\n    const title = new Title({\n        ctx: chart.ctx,\n        options: titleOpts,\n        chart\n    });\n    layouts.configure(chart, title, titleOpts);\n    layouts.addBox(chart, title);\n    chart.titleBlock = title;\n}\nvar plugin_title = {\n    id: 'title',\n _element: Title,\n    start (chart, _args, options) {\n        createTitle(chart, options);\n    },\n    stop (chart) {\n        const titleBlock = chart.titleBlock;\n        layouts.removeBox(chart, titleBlock);\n        delete chart.titleBlock;\n    },\n    beforeUpdate (chart, _args, options) {\n        const title = chart.titleBlock;\n        layouts.configure(chart, title, options);\n        title.options = options;\n    },\n    defaults: {\n        align: 'center',\n        display: false,\n        font: {\n            weight: 'bold'\n        },\n        fullSize: true,\n        padding: 10,\n        position: 'top',\n        text: '',\n        weight: 2000\n    },\n    defaultRoutes: {\n        color: 'color'\n    },\n    descriptors: {\n        _scriptable: true,\n        _indexable: false\n    }\n};\n\nconst map = new WeakMap();\nvar plugin_subtitle = {\n    id: 'subtitle',\n    start (chart, _args, options) {\n        const title = new Title({\n            ctx: chart.ctx,\n            options,\n            chart\n        });\n        layouts.configure(chart, title, options);\n        layouts.addBox(chart, title);\n        map.set(chart, title);\n    },\n    stop (chart) {\n        layouts.removeBox(chart, map.get(chart));\n        map.delete(chart);\n    },\n    beforeUpdate (chart, _args, options) {\n        const title = map.get(chart);\n        layouts.configure(chart, title, options);\n        title.options = options;\n    },\n    defaults: {\n        align: 'center',\n        display: false,\n        font: {\n            weight: 'normal'\n        },\n        fullSize: true,\n        padding: 0,\n        position: 'top',\n        text: '',\n        weight: 1500\n    },\n    defaultRoutes: {\n        color: 'color'\n    },\n    descriptors: {\n        _scriptable: true,\n        _indexable: false\n    }\n};\n\nconst positioners = {\n average (items) {\n        if (!items.length) {\n            return false;\n        }\n        let i, len;\n        let xSet = new Set();\n        let y = 0;\n        let count = 0;\n        for(i = 0, len = items.length; i < len; ++i){\n            const el = items[i].element;\n            if (el && el.hasValue()) {\n                const pos = el.tooltipPosition();\n                xSet.add(pos.x);\n                y += pos.y;\n                ++count;\n            }\n        }\n        if (count === 0 || xSet.size === 0) {\n            return false;\n        }\n        const xAverage = [\n            ...xSet\n        ].reduce((a, b)=>a + b) / xSet.size;\n        return {\n            x: xAverage,\n            y: y / count\n        };\n    },\n nearest (items, eventPosition) {\n        if (!items.length) {\n            return false;\n        }\n        let x = eventPosition.x;\n        let y = eventPosition.y;\n        let minDistance = Number.POSITIVE_INFINITY;\n        let i, len, nearestElement;\n        for(i = 0, len = items.length; i < len; ++i){\n            const el = items[i].element;\n            if (el && el.hasValue()) {\n                const center = el.getCenterPoint();\n                const d = distanceBetweenPoints(eventPosition, center);\n                if (d < minDistance) {\n                    minDistance = d;\n                    nearestElement = el;\n                }\n            }\n        }\n        if (nearestElement) {\n            const tp = nearestElement.tooltipPosition();\n            x = tp.x;\n            y = tp.y;\n        }\n        return {\n            x,\n            y\n        };\n    }\n};\nfunction pushOrConcat(base, toPush) {\n    if (toPush) {\n        if (isArray(toPush)) {\n            Array.prototype.push.apply(base, toPush);\n        } else {\n            base.push(toPush);\n        }\n    }\n    return base;\n}\n function splitNewlines(str) {\n    if ((typeof str === 'string' || str instanceof String) && str.indexOf('\\n') > -1) {\n        return str.split('\\n');\n    }\n    return str;\n}\n function createTooltipItem(chart, item) {\n    const { element , datasetIndex , index  } = item;\n    const controller = chart.getDatasetMeta(datasetIndex).controller;\n    const { label , value  } = controller.getLabelAndValue(index);\n    return {\n        chart,\n        label,\n        parsed: controller.getParsed(index),\n        raw: chart.data.datasets[datasetIndex].data[index],\n        formattedValue: value,\n        dataset: controller.getDataset(),\n        dataIndex: index,\n        datasetIndex,\n        element\n    };\n}\n function getTooltipSize(tooltip, options) {\n    const ctx = tooltip.chart.ctx;\n    const { body , footer , title  } = tooltip;\n    const { boxWidth , boxHeight  } = options;\n    const bodyFont = toFont(options.bodyFont);\n    const titleFont = toFont(options.titleFont);\n    const footerFont = toFont(options.footerFont);\n    const titleLineCount = title.length;\n    const footerLineCount = footer.length;\n    const bodyLineItemCount = body.length;\n    const padding = toPadding(options.padding);\n    let height = padding.height;\n    let width = 0;\n    let combinedBodyLength = body.reduce((count, bodyItem)=>count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length, 0);\n    combinedBodyLength += tooltip.beforeBody.length + tooltip.afterBody.length;\n    if (titleLineCount) {\n        height += titleLineCount * titleFont.lineHeight + (titleLineCount - 1) * options.titleSpacing + options.titleMarginBottom;\n    }\n    if (combinedBodyLength) {\n        const bodyLineHeight = options.displayColors ? Math.max(boxHeight, bodyFont.lineHeight) : bodyFont.lineHeight;\n        height += bodyLineItemCount * bodyLineHeight + (combinedBodyLength - bodyLineItemCount) * bodyFont.lineHeight + (combinedBodyLength - 1) * options.bodySpacing;\n    }\n    if (footerLineCount) {\n        height += options.footerMarginTop + footerLineCount * footerFont.lineHeight + (footerLineCount - 1) * options.footerSpacing;\n    }\n    let widthPadding = 0;\n    const maxLineWidth = function(line) {\n        width = Math.max(width, ctx.measureText(line).width + widthPadding);\n    };\n    ctx.save();\n    ctx.font = titleFont.string;\n    each(tooltip.title, maxLineWidth);\n    ctx.font = bodyFont.string;\n    each(tooltip.beforeBody.concat(tooltip.afterBody), maxLineWidth);\n    widthPadding = options.displayColors ? boxWidth + 2 + options.boxPadding : 0;\n    each(body, (bodyItem)=>{\n        each(bodyItem.before, maxLineWidth);\n        each(bodyItem.lines, maxLineWidth);\n        each(bodyItem.after, maxLineWidth);\n    });\n    widthPadding = 0;\n    ctx.font = footerFont.string;\n    each(tooltip.footer, maxLineWidth);\n    ctx.restore();\n    width += padding.width;\n    return {\n        width,\n        height\n    };\n}\nfunction determineYAlign(chart, size) {\n    const { y , height  } = size;\n    if (y < height / 2) {\n        return 'top';\n    } else if (y > chart.height - height / 2) {\n        return 'bottom';\n    }\n    return 'center';\n}\nfunction doesNotFitWithAlign(xAlign, chart, options, size) {\n    const { x , width  } = size;\n    const caret = options.caretSize + options.caretPadding;\n    if (xAlign === 'left' && x + width + caret > chart.width) {\n        return true;\n    }\n    if (xAlign === 'right' && x - width - caret < 0) {\n        return true;\n    }\n}\nfunction determineXAlign(chart, options, size, yAlign) {\n    const { x , width  } = size;\n    const { width: chartWidth , chartArea: { left , right  }  } = chart;\n    let xAlign = 'center';\n    if (yAlign === 'center') {\n        xAlign = x <= (left + right) / 2 ? 'left' : 'right';\n    } else if (x <= width / 2) {\n        xAlign = 'left';\n    } else if (x >= chartWidth - width / 2) {\n        xAlign = 'right';\n    }\n    if (doesNotFitWithAlign(xAlign, chart, options, size)) {\n        xAlign = 'center';\n    }\n    return xAlign;\n}\n function determineAlignment(chart, options, size) {\n    const yAlign = size.yAlign || options.yAlign || determineYAlign(chart, size);\n    return {\n        xAlign: size.xAlign || options.xAlign || determineXAlign(chart, options, size, yAlign),\n        yAlign\n    };\n}\nfunction alignX(size, xAlign) {\n    let { x , width  } = size;\n    if (xAlign === 'right') {\n        x -= width;\n    } else if (xAlign === 'center') {\n        x -= width / 2;\n    }\n    return x;\n}\nfunction alignY(size, yAlign, paddingAndSize) {\n    let { y , height  } = size;\n    if (yAlign === 'top') {\n        y += paddingAndSize;\n    } else if (yAlign === 'bottom') {\n        y -= height + paddingAndSize;\n    } else {\n        y -= height / 2;\n    }\n    return y;\n}\n function getBackgroundPoint(options, size, alignment, chart) {\n    const { caretSize , caretPadding , cornerRadius  } = options;\n    const { xAlign , yAlign  } = alignment;\n    const paddingAndSize = caretSize + caretPadding;\n    const { topLeft , topRight , bottomLeft , bottomRight  } = toTRBLCorners(cornerRadius);\n    let x = alignX(size, xAlign);\n    const y = alignY(size, yAlign, paddingAndSize);\n    if (yAlign === 'center') {\n        if (xAlign === 'left') {\n            x += paddingAndSize;\n        } else if (xAlign === 'right') {\n            x -= paddingAndSize;\n        }\n    } else if (xAlign === 'left') {\n        x -= Math.max(topLeft, bottomLeft) + caretSize;\n    } else if (xAlign === 'right') {\n        x += Math.max(topRight, bottomRight) + caretSize;\n    }\n    return {\n        x: _limitValue(x, 0, chart.width - size.width),\n        y: _limitValue(y, 0, chart.height - size.height)\n    };\n}\nfunction getAlignedX(tooltip, align, options) {\n    const padding = toPadding(options.padding);\n    return align === 'center' ? tooltip.x + tooltip.width / 2 : align === 'right' ? tooltip.x + tooltip.width - padding.right : tooltip.x + padding.left;\n}\n function getBeforeAfterBodyLines(callback) {\n    return pushOrConcat([], splitNewlines(callback));\n}\nfunction createTooltipContext(parent, tooltip, tooltipItems) {\n    return createContext(parent, {\n        tooltip,\n        tooltipItems,\n        type: 'tooltip'\n    });\n}\nfunction overrideCallbacks(callbacks, context) {\n    const override = context && context.dataset && context.dataset.tooltip && context.dataset.tooltip.callbacks;\n    return override ? callbacks.override(override) : callbacks;\n}\nconst defaultCallbacks = {\n    beforeTitle: noop,\n    title (tooltipItems) {\n        if (tooltipItems.length > 0) {\n            const item = tooltipItems[0];\n            const labels = item.chart.data.labels;\n            const labelCount = labels ? labels.length : 0;\n            if (this && this.options && this.options.mode === 'dataset') {\n                return item.dataset.label || '';\n            } else if (item.label) {\n                return item.label;\n            } else if (labelCount > 0 && item.dataIndex < labelCount) {\n                return labels[item.dataIndex];\n            }\n        }\n        return '';\n    },\n    afterTitle: noop,\n    beforeBody: noop,\n    beforeLabel: noop,\n    label (tooltipItem) {\n        if (this && this.options && this.options.mode === 'dataset') {\n            return tooltipItem.label + ': ' + tooltipItem.formattedValue || tooltipItem.formattedValue;\n        }\n        let label = tooltipItem.dataset.label || '';\n        if (label) {\n            label += ': ';\n        }\n        const value = tooltipItem.formattedValue;\n        if (!isNullOrUndef(value)) {\n            label += value;\n        }\n        return label;\n    },\n    labelColor (tooltipItem) {\n        const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n        const options = meta.controller.getStyle(tooltipItem.dataIndex);\n        return {\n            borderColor: options.borderColor,\n            backgroundColor: options.backgroundColor,\n            borderWidth: options.borderWidth,\n            borderDash: options.borderDash,\n            borderDashOffset: options.borderDashOffset,\n            borderRadius: 0\n        };\n    },\n    labelTextColor () {\n        return this.options.bodyColor;\n    },\n    labelPointStyle (tooltipItem) {\n        const meta = tooltipItem.chart.getDatasetMeta(tooltipItem.datasetIndex);\n        const options = meta.controller.getStyle(tooltipItem.dataIndex);\n        return {\n            pointStyle: options.pointStyle,\n            rotation: options.rotation\n        };\n    },\n    afterLabel: noop,\n    afterBody: noop,\n    beforeFooter: noop,\n    footer: noop,\n    afterFooter: noop\n};\n function invokeCallbackWithFallback(callbacks, name, ctx, arg) {\n    const result = callbacks[name].call(ctx, arg);\n    if (typeof result === 'undefined') {\n        return defaultCallbacks[name].call(ctx, arg);\n    }\n    return result;\n}\nclass Tooltip extends Element {\n static positioners = positioners;\n    constructor(config){\n        super();\n        this.opacity = 0;\n        this._active = [];\n        this._eventPosition = undefined;\n        this._size = undefined;\n        this._cachedAnimations = undefined;\n        this._tooltipItems = [];\n        this.$animations = undefined;\n        this.$context = undefined;\n        this.chart = config.chart;\n        this.options = config.options;\n        this.dataPoints = undefined;\n        this.title = undefined;\n        this.beforeBody = undefined;\n        this.body = undefined;\n        this.afterBody = undefined;\n        this.footer = undefined;\n        this.xAlign = undefined;\n        this.yAlign = undefined;\n        this.x = undefined;\n        this.y = undefined;\n        this.height = undefined;\n        this.width = undefined;\n        this.caretX = undefined;\n        this.caretY = undefined;\n        this.labelColors = undefined;\n        this.labelPointStyles = undefined;\n        this.labelTextColors = undefined;\n    }\n    initialize(options) {\n        this.options = options;\n        this._cachedAnimations = undefined;\n        this.$context = undefined;\n    }\n _resolveAnimations() {\n        const cached = this._cachedAnimations;\n        if (cached) {\n            return cached;\n        }\n        const chart = this.chart;\n        const options = this.options.setContext(this.getContext());\n        const opts = options.enabled && chart.options.animation && options.animations;\n        const animations = new Animations(this.chart, opts);\n        if (opts._cacheable) {\n            this._cachedAnimations = Object.freeze(animations);\n        }\n        return animations;\n    }\n getContext() {\n        return this.$context || (this.$context = createTooltipContext(this.chart.getContext(), this, this._tooltipItems));\n    }\n    getTitle(context, options) {\n        const { callbacks  } = options;\n        const beforeTitle = invokeCallbackWithFallback(callbacks, 'beforeTitle', this, context);\n        const title = invokeCallbackWithFallback(callbacks, 'title', this, context);\n        const afterTitle = invokeCallbackWithFallback(callbacks, 'afterTitle', this, context);\n        let lines = [];\n        lines = pushOrConcat(lines, splitNewlines(beforeTitle));\n        lines = pushOrConcat(lines, splitNewlines(title));\n        lines = pushOrConcat(lines, splitNewlines(afterTitle));\n        return lines;\n    }\n    getBeforeBody(tooltipItems, options) {\n        return getBeforeAfterBodyLines(invokeCallbackWithFallback(options.callbacks, 'beforeBody', this, tooltipItems));\n    }\n    getBody(tooltipItems, options) {\n        const { callbacks  } = options;\n        const bodyItems = [];\n        each(tooltipItems, (context)=>{\n            const bodyItem = {\n                before: [],\n                lines: [],\n                after: []\n            };\n            const scoped = overrideCallbacks(callbacks, context);\n            pushOrConcat(bodyItem.before, splitNewlines(invokeCallbackWithFallback(scoped, 'beforeLabel', this, context)));\n            pushOrConcat(bodyItem.lines, invokeCallbackWithFallback(scoped, 'label', this, context));\n            pushOrConcat(bodyItem.after, splitNewlines(invokeCallbackWithFallback(scoped, 'afterLabel', this, context)));\n            bodyItems.push(bodyItem);\n        });\n        return bodyItems;\n    }\n    getAfterBody(tooltipItems, options) {\n        return getBeforeAfterBodyLines(invokeCallbackWithFallback(options.callbacks, 'afterBody', this, tooltipItems));\n    }\n    getFooter(tooltipItems, options) {\n        const { callbacks  } = options;\n        const beforeFooter = invokeCallbackWithFallback(callbacks, 'beforeFooter', this, tooltipItems);\n        const footer = invokeCallbackWithFallback(callbacks, 'footer', this, tooltipItems);\n        const afterFooter = invokeCallbackWithFallback(callbacks, 'afterFooter', this, tooltipItems);\n        let lines = [];\n        lines = pushOrConcat(lines, splitNewlines(beforeFooter));\n        lines = pushOrConcat(lines, splitNewlines(footer));\n        lines = pushOrConcat(lines, splitNewlines(afterFooter));\n        return lines;\n    }\n _createItems(options) {\n        const active = this._active;\n        const data = this.chart.data;\n        const labelColors = [];\n        const labelPointStyles = [];\n        const labelTextColors = [];\n        let tooltipItems = [];\n        let i, len;\n        for(i = 0, len = active.length; i < len; ++i){\n            tooltipItems.push(createTooltipItem(this.chart, active[i]));\n        }\n        if (options.filter) {\n            tooltipItems = tooltipItems.filter((element, index, array)=>options.filter(element, index, array, data));\n        }\n        if (options.itemSort) {\n            tooltipItems = tooltipItems.sort((a, b)=>options.itemSort(a, b, data));\n        }\n        each(tooltipItems, (context)=>{\n            const scoped = overrideCallbacks(options.callbacks, context);\n            labelColors.push(invokeCallbackWithFallback(scoped, 'labelColor', this, context));\n            labelPointStyles.push(invokeCallbackWithFallback(scoped, 'labelPointStyle', this, context));\n            labelTextColors.push(invokeCallbackWithFallback(scoped, 'labelTextColor', this, context));\n        });\n        this.labelColors = labelColors;\n        this.labelPointStyles = labelPointStyles;\n        this.labelTextColors = labelTextColors;\n        this.dataPoints = tooltipItems;\n        return tooltipItems;\n    }\n    update(changed, replay) {\n        const options = this.options.setContext(this.getContext());\n        const active = this._active;\n        let properties;\n        let tooltipItems = [];\n        if (!active.length) {\n            if (this.opacity !== 0) {\n                properties = {\n                    opacity: 0\n                };\n            }\n        } else {\n            const position = positioners[options.position].call(this, active, this._eventPosition);\n            tooltipItems = this._createItems(options);\n            this.title = this.getTitle(tooltipItems, options);\n            this.beforeBody = this.getBeforeBody(tooltipItems, options);\n            this.body = this.getBody(tooltipItems, options);\n            this.afterBody = this.getAfterBody(tooltipItems, options);\n            this.footer = this.getFooter(tooltipItems, options);\n            const size = this._size = getTooltipSize(this, options);\n            const positionAndSize = Object.assign({}, position, size);\n            const alignment = determineAlignment(this.chart, options, positionAndSize);\n            const backgroundPoint = getBackgroundPoint(options, positionAndSize, alignment, this.chart);\n            this.xAlign = alignment.xAlign;\n            this.yAlign = alignment.yAlign;\n            properties = {\n                opacity: 1,\n                x: backgroundPoint.x,\n                y: backgroundPoint.y,\n                width: size.width,\n                height: size.height,\n                caretX: position.x,\n                caretY: position.y\n            };\n        }\n        this._tooltipItems = tooltipItems;\n        this.$context = undefined;\n        if (properties) {\n            this._resolveAnimations().update(this, properties);\n        }\n        if (changed && options.external) {\n            options.external.call(this, {\n                chart: this.chart,\n                tooltip: this,\n                replay\n            });\n        }\n    }\n    drawCaret(tooltipPoint, ctx, size, options) {\n        const caretPosition = this.getCaretPosition(tooltipPoint, size, options);\n        ctx.lineTo(caretPosition.x1, caretPosition.y1);\n        ctx.lineTo(caretPosition.x2, caretPosition.y2);\n        ctx.lineTo(caretPosition.x3, caretPosition.y3);\n    }\n    getCaretPosition(tooltipPoint, size, options) {\n        const { xAlign , yAlign  } = this;\n        const { caretSize , cornerRadius  } = options;\n        const { topLeft , topRight , bottomLeft , bottomRight  } = toTRBLCorners(cornerRadius);\n        const { x: ptX , y: ptY  } = tooltipPoint;\n        const { width , height  } = size;\n        let x1, x2, x3, y1, y2, y3;\n        if (yAlign === 'center') {\n            y2 = ptY + height / 2;\n            if (xAlign === 'left') {\n                x1 = ptX;\n                x2 = x1 - caretSize;\n                y1 = y2 + caretSize;\n                y3 = y2 - caretSize;\n            } else {\n                x1 = ptX + width;\n                x2 = x1 + caretSize;\n                y1 = y2 - caretSize;\n                y3 = y2 + caretSize;\n            }\n            x3 = x1;\n        } else {\n            if (xAlign === 'left') {\n                x2 = ptX + Math.max(topLeft, bottomLeft) + caretSize;\n            } else if (xAlign === 'right') {\n                x2 = ptX + width - Math.max(topRight, bottomRight) - caretSize;\n            } else {\n                x2 = this.caretX;\n            }\n            if (yAlign === 'top') {\n                y1 = ptY;\n                y2 = y1 - caretSize;\n                x1 = x2 - caretSize;\n                x3 = x2 + caretSize;\n            } else {\n                y1 = ptY + height;\n                y2 = y1 + caretSize;\n                x1 = x2 + caretSize;\n                x3 = x2 - caretSize;\n            }\n            y3 = y1;\n        }\n        return {\n            x1,\n            x2,\n            x3,\n            y1,\n            y2,\n            y3\n        };\n    }\n    drawTitle(pt, ctx, options) {\n        const title = this.title;\n        const length = title.length;\n        let titleFont, titleSpacing, i;\n        if (length) {\n            const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n            pt.x = getAlignedX(this, options.titleAlign, options);\n            ctx.textAlign = rtlHelper.textAlign(options.titleAlign);\n            ctx.textBaseline = 'middle';\n            titleFont = toFont(options.titleFont);\n            titleSpacing = options.titleSpacing;\n            ctx.fillStyle = options.titleColor;\n            ctx.font = titleFont.string;\n            for(i = 0; i < length; ++i){\n                ctx.fillText(title[i], rtlHelper.x(pt.x), pt.y + titleFont.lineHeight / 2);\n                pt.y += titleFont.lineHeight + titleSpacing;\n                if (i + 1 === length) {\n                    pt.y += options.titleMarginBottom - titleSpacing;\n                }\n            }\n        }\n    }\n _drawColorBox(ctx, pt, i, rtlHelper, options) {\n        const labelColor = this.labelColors[i];\n        const labelPointStyle = this.labelPointStyles[i];\n        const { boxHeight , boxWidth  } = options;\n        const bodyFont = toFont(options.bodyFont);\n        const colorX = getAlignedX(this, 'left', options);\n        const rtlColorX = rtlHelper.x(colorX);\n        const yOffSet = boxHeight < bodyFont.lineHeight ? (bodyFont.lineHeight - boxHeight) / 2 : 0;\n        const colorY = pt.y + yOffSet;\n        if (options.usePointStyle) {\n            const drawOptions = {\n                radius: Math.min(boxWidth, boxHeight) / 2,\n                pointStyle: labelPointStyle.pointStyle,\n                rotation: labelPointStyle.rotation,\n                borderWidth: 1\n            };\n            const centerX = rtlHelper.leftForLtr(rtlColorX, boxWidth) + boxWidth / 2;\n            const centerY = colorY + boxHeight / 2;\n            ctx.strokeStyle = options.multiKeyBackground;\n            ctx.fillStyle = options.multiKeyBackground;\n            drawPoint(ctx, drawOptions, centerX, centerY);\n            ctx.strokeStyle = labelColor.borderColor;\n            ctx.fillStyle = labelColor.backgroundColor;\n            drawPoint(ctx, drawOptions, centerX, centerY);\n        } else {\n            ctx.lineWidth = isObject(labelColor.borderWidth) ? Math.max(...Object.values(labelColor.borderWidth)) : labelColor.borderWidth || 1;\n            ctx.strokeStyle = labelColor.borderColor;\n            ctx.setLineDash(labelColor.borderDash || []);\n            ctx.lineDashOffset = labelColor.borderDashOffset || 0;\n            const outerX = rtlHelper.leftForLtr(rtlColorX, boxWidth);\n            const innerX = rtlHelper.leftForLtr(rtlHelper.xPlus(rtlColorX, 1), boxWidth - 2);\n            const borderRadius = toTRBLCorners(labelColor.borderRadius);\n            if (Object.values(borderRadius).some((v)=>v !== 0)) {\n                ctx.beginPath();\n                ctx.fillStyle = options.multiKeyBackground;\n                addRoundedRectPath(ctx, {\n                    x: outerX,\n                    y: colorY,\n                    w: boxWidth,\n                    h: boxHeight,\n                    radius: borderRadius\n                });\n                ctx.fill();\n                ctx.stroke();\n                ctx.fillStyle = labelColor.backgroundColor;\n                ctx.beginPath();\n                addRoundedRectPath(ctx, {\n                    x: innerX,\n                    y: colorY + 1,\n                    w: boxWidth - 2,\n                    h: boxHeight - 2,\n                    radius: borderRadius\n                });\n                ctx.fill();\n            } else {\n                ctx.fillStyle = options.multiKeyBackground;\n                ctx.fillRect(outerX, colorY, boxWidth, boxHeight);\n                ctx.strokeRect(outerX, colorY, boxWidth, boxHeight);\n                ctx.fillStyle = labelColor.backgroundColor;\n                ctx.fillRect(innerX, colorY + 1, boxWidth - 2, boxHeight - 2);\n            }\n        }\n        ctx.fillStyle = this.labelTextColors[i];\n    }\n    drawBody(pt, ctx, options) {\n        const { body  } = this;\n        const { bodySpacing , bodyAlign , displayColors , boxHeight , boxWidth , boxPadding  } = options;\n        const bodyFont = toFont(options.bodyFont);\n        let bodyLineHeight = bodyFont.lineHeight;\n        let xLinePadding = 0;\n        const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n        const fillLineOfText = function(line) {\n            ctx.fillText(line, rtlHelper.x(pt.x + xLinePadding), pt.y + bodyLineHeight / 2);\n            pt.y += bodyLineHeight + bodySpacing;\n        };\n        const bodyAlignForCalculation = rtlHelper.textAlign(bodyAlign);\n        let bodyItem, textColor, lines, i, j, ilen, jlen;\n        ctx.textAlign = bodyAlign;\n        ctx.textBaseline = 'middle';\n        ctx.font = bodyFont.string;\n        pt.x = getAlignedX(this, bodyAlignForCalculation, options);\n        ctx.fillStyle = options.bodyColor;\n        each(this.beforeBody, fillLineOfText);\n        xLinePadding = displayColors && bodyAlignForCalculation !== 'right' ? bodyAlign === 'center' ? boxWidth / 2 + boxPadding : boxWidth + 2 + boxPadding : 0;\n        for(i = 0, ilen = body.length; i < ilen; ++i){\n            bodyItem = body[i];\n            textColor = this.labelTextColors[i];\n            ctx.fillStyle = textColor;\n            each(bodyItem.before, fillLineOfText);\n            lines = bodyItem.lines;\n            if (displayColors && lines.length) {\n                this._drawColorBox(ctx, pt, i, rtlHelper, options);\n                bodyLineHeight = Math.max(bodyFont.lineHeight, boxHeight);\n            }\n            for(j = 0, jlen = lines.length; j < jlen; ++j){\n                fillLineOfText(lines[j]);\n                bodyLineHeight = bodyFont.lineHeight;\n            }\n            each(bodyItem.after, fillLineOfText);\n        }\n        xLinePadding = 0;\n        bodyLineHeight = bodyFont.lineHeight;\n        each(this.afterBody, fillLineOfText);\n        pt.y -= bodySpacing;\n    }\n    drawFooter(pt, ctx, options) {\n        const footer = this.footer;\n        const length = footer.length;\n        let footerFont, i;\n        if (length) {\n            const rtlHelper = getRtlAdapter(options.rtl, this.x, this.width);\n            pt.x = getAlignedX(this, options.footerAlign, options);\n            pt.y += options.footerMarginTop;\n            ctx.textAlign = rtlHelper.textAlign(options.footerAlign);\n            ctx.textBaseline = 'middle';\n            footerFont = toFont(options.footerFont);\n            ctx.fillStyle = options.footerColor;\n            ctx.font = footerFont.string;\n            for(i = 0; i < length; ++i){\n                ctx.fillText(footer[i], rtlHelper.x(pt.x), pt.y + footerFont.lineHeight / 2);\n                pt.y += footerFont.lineHeight + options.footerSpacing;\n            }\n        }\n    }\n    drawBackground(pt, ctx, tooltipSize, options) {\n        const { xAlign , yAlign  } = this;\n        const { x , y  } = pt;\n        const { width , height  } = tooltipSize;\n        const { topLeft , topRight , bottomLeft , bottomRight  } = toTRBLCorners(options.cornerRadius);\n        ctx.fillStyle = options.backgroundColor;\n        ctx.strokeStyle = options.borderColor;\n        ctx.lineWidth = options.borderWidth;\n        ctx.beginPath();\n        ctx.moveTo(x + topLeft, y);\n        if (yAlign === 'top') {\n            this.drawCaret(pt, ctx, tooltipSize, options);\n        }\n        ctx.lineTo(x + width - topRight, y);\n        ctx.quadraticCurveTo(x + width, y, x + width, y + topRight);\n        if (yAlign === 'center' && xAlign === 'right') {\n            this.drawCaret(pt, ctx, tooltipSize, options);\n        }\n        ctx.lineTo(x + width, y + height - bottomRight);\n        ctx.quadraticCurveTo(x + width, y + height, x + width - bottomRight, y + height);\n        if (yAlign === 'bottom') {\n            this.drawCaret(pt, ctx, tooltipSize, options);\n        }\n        ctx.lineTo(x + bottomLeft, y + height);\n        ctx.quadraticCurveTo(x, y + height, x, y + height - bottomLeft);\n        if (yAlign === 'center' && xAlign === 'left') {\n            this.drawCaret(pt, ctx, tooltipSize, options);\n        }\n        ctx.lineTo(x, y + topLeft);\n        ctx.quadraticCurveTo(x, y, x + topLeft, y);\n        ctx.closePath();\n        ctx.fill();\n        if (options.borderWidth > 0) {\n            ctx.stroke();\n        }\n    }\n _updateAnimationTarget(options) {\n        const chart = this.chart;\n        const anims = this.$animations;\n        const animX = anims && anims.x;\n        const animY = anims && anims.y;\n        if (animX || animY) {\n            const position = positioners[options.position].call(this, this._active, this._eventPosition);\n            if (!position) {\n                return;\n            }\n            const size = this._size = getTooltipSize(this, options);\n            const positionAndSize = Object.assign({}, position, this._size);\n            const alignment = determineAlignment(chart, options, positionAndSize);\n            const point = getBackgroundPoint(options, positionAndSize, alignment, chart);\n            if (animX._to !== point.x || animY._to !== point.y) {\n                this.xAlign = alignment.xAlign;\n                this.yAlign = alignment.yAlign;\n                this.width = size.width;\n                this.height = size.height;\n                this.caretX = position.x;\n                this.caretY = position.y;\n                this._resolveAnimations().update(this, point);\n            }\n        }\n    }\n _willRender() {\n        return !!this.opacity;\n    }\n    draw(ctx) {\n        const options = this.options.setContext(this.getContext());\n        let opacity = this.opacity;\n        if (!opacity) {\n            return;\n        }\n        this._updateAnimationTarget(options);\n        const tooltipSize = {\n            width: this.width,\n            height: this.height\n        };\n        const pt = {\n            x: this.x,\n            y: this.y\n        };\n        opacity = Math.abs(opacity) < 1e-3 ? 0 : opacity;\n        const padding = toPadding(options.padding);\n        const hasTooltipContent = this.title.length || this.beforeBody.length || this.body.length || this.afterBody.length || this.footer.length;\n        if (options.enabled && hasTooltipContent) {\n            ctx.save();\n            ctx.globalAlpha = opacity;\n            this.drawBackground(pt, ctx, tooltipSize, options);\n            overrideTextDirection(ctx, options.textDirection);\n            pt.y += padding.top;\n            this.drawTitle(pt, ctx, options);\n            this.drawBody(pt, ctx, options);\n            this.drawFooter(pt, ctx, options);\n            restoreTextDirection(ctx, options.textDirection);\n            ctx.restore();\n        }\n    }\n getActiveElements() {\n        return this._active || [];\n    }\n setActiveElements(activeElements, eventPosition) {\n        const lastActive = this._active;\n        const active = activeElements.map(({ datasetIndex , index  })=>{\n            const meta = this.chart.getDatasetMeta(datasetIndex);\n            if (!meta) {\n                throw new Error('Cannot find a dataset at index ' + datasetIndex);\n            }\n            return {\n                datasetIndex,\n                element: meta.data[index],\n                index\n            };\n        });\n        const changed = !_elementsEqual(lastActive, active);\n        const positionChanged = this._positionChanged(active, eventPosition);\n        if (changed || positionChanged) {\n            this._active = active;\n            this._eventPosition = eventPosition;\n            this._ignoreReplayEvents = true;\n            this.update(true);\n        }\n    }\n handleEvent(e, replay, inChartArea = true) {\n        if (replay && this._ignoreReplayEvents) {\n            return false;\n        }\n        this._ignoreReplayEvents = false;\n        const options = this.options;\n        const lastActive = this._active || [];\n        const active = this._getActiveElements(e, lastActive, replay, inChartArea);\n        const positionChanged = this._positionChanged(active, e);\n        const changed = replay || !_elementsEqual(active, lastActive) || positionChanged;\n        if (changed) {\n            this._active = active;\n            if (options.enabled || options.external) {\n                this._eventPosition = {\n                    x: e.x,\n                    y: e.y\n                };\n                this.update(true, replay);\n            }\n        }\n        return changed;\n    }\n _getActiveElements(e, lastActive, replay, inChartArea) {\n        const options = this.options;\n        if (e.type === 'mouseout') {\n            return [];\n        }\n        if (!inChartArea) {\n            return lastActive.filter((i)=>this.chart.data.datasets[i.datasetIndex] && this.chart.getDatasetMeta(i.datasetIndex).controller.getParsed(i.index) !== undefined);\n        }\n        const active = this.chart.getElementsAtEventForMode(e, options.mode, options, replay);\n        if (options.reverse) {\n            active.reverse();\n        }\n        return active;\n    }\n _positionChanged(active, e) {\n        const { caretX , caretY , options  } = this;\n        const position = positioners[options.position].call(this, active, e);\n        return position !== false && (caretX !== position.x || caretY !== position.y);\n    }\n}\nvar plugin_tooltip = {\n    id: 'tooltip',\n    _element: Tooltip,\n    positioners,\n    afterInit (chart, _args, options) {\n        if (options) {\n            chart.tooltip = new Tooltip({\n                chart,\n                options\n            });\n        }\n    },\n    beforeUpdate (chart, _args, options) {\n        if (chart.tooltip) {\n            chart.tooltip.initialize(options);\n        }\n    },\n    reset (chart, _args, options) {\n        if (chart.tooltip) {\n            chart.tooltip.initialize(options);\n        }\n    },\n    afterDraw (chart) {\n        const tooltip = chart.tooltip;\n        if (tooltip && tooltip._willRender()) {\n            const args = {\n                tooltip\n            };\n            if (chart.notifyPlugins('beforeTooltipDraw', {\n                ...args,\n                cancelable: true\n            }) === false) {\n                return;\n            }\n            tooltip.draw(chart.ctx);\n            chart.notifyPlugins('afterTooltipDraw', args);\n        }\n    },\n    afterEvent (chart, args) {\n        if (chart.tooltip) {\n            const useFinalPosition = args.replay;\n            if (chart.tooltip.handleEvent(args.event, useFinalPosition, args.inChartArea)) {\n                args.changed = true;\n            }\n        }\n    },\n    defaults: {\n        enabled: true,\n        external: null,\n        position: 'average',\n        backgroundColor: 'rgba(0,0,0,0.8)',\n        titleColor: '#fff',\n        titleFont: {\n            weight: 'bold'\n        },\n        titleSpacing: 2,\n        titleMarginBottom: 6,\n        titleAlign: 'left',\n        bodyColor: '#fff',\n        bodySpacing: 2,\n        bodyFont: {},\n        bodyAlign: 'left',\n        footerColor: '#fff',\n        footerSpacing: 2,\n        footerMarginTop: 6,\n        footerFont: {\n            weight: 'bold'\n        },\n        footerAlign: 'left',\n        padding: 6,\n        caretPadding: 2,\n        caretSize: 5,\n        cornerRadius: 6,\n        boxHeight: (ctx, opts)=>opts.bodyFont.size,\n        boxWidth: (ctx, opts)=>opts.bodyFont.size,\n        multiKeyBackground: '#fff',\n        displayColors: true,\n        boxPadding: 0,\n        borderColor: 'rgba(0,0,0,0)',\n        borderWidth: 0,\n        animation: {\n            duration: 400,\n            easing: 'easeOutQuart'\n        },\n        animations: {\n            numbers: {\n                type: 'number',\n                properties: [\n                    'x',\n                    'y',\n                    'width',\n                    'height',\n                    'caretX',\n                    'caretY'\n                ]\n            },\n            opacity: {\n                easing: 'linear',\n                duration: 200\n            }\n        },\n        callbacks: defaultCallbacks\n    },\n    defaultRoutes: {\n        bodyFont: 'font',\n        footerFont: 'font',\n        titleFont: 'font'\n    },\n    descriptors: {\n        _scriptable: (name)=>name !== 'filter' && name !== 'itemSort' && name !== 'external',\n        _indexable: false,\n        callbacks: {\n            _scriptable: false,\n            _indexable: false\n        },\n        animation: {\n            _fallback: false\n        },\n        animations: {\n            _fallback: 'animation'\n        }\n    },\n    additionalOptionScopes: [\n        'interaction'\n    ]\n};\n\nvar plugins = /*#__PURE__*/Object.freeze({\n__proto__: null,\nColors: plugin_colors,\nDecimation: plugin_decimation,\nFiller: index,\nLegend: plugin_legend,\nSubTitle: plugin_subtitle,\nTitle: plugin_title,\nTooltip: plugin_tooltip\n});\n\nconst addIfString = (labels, raw, index, addedLabels)=>{\n    if (typeof raw === 'string') {\n        index = labels.push(raw) - 1;\n        addedLabels.unshift({\n            index,\n            label: raw\n        });\n    } else if (isNaN(raw)) {\n        index = null;\n    }\n    return index;\n};\nfunction findOrAddLabel(labels, raw, index, addedLabels) {\n    const first = labels.indexOf(raw);\n    if (first === -1) {\n        return addIfString(labels, raw, index, addedLabels);\n    }\n    const last = labels.lastIndexOf(raw);\n    return first !== last ? index : first;\n}\nconst validIndex = (index, max)=>index === null ? null : _limitValue(Math.round(index), 0, max);\nfunction _getLabelForValue(value) {\n    const labels = this.getLabels();\n    if (value >= 0 && value < labels.length) {\n        return labels[value];\n    }\n    return value;\n}\nclass CategoryScale extends Scale {\n    static id = 'category';\n static defaults = {\n        ticks: {\n            callback: _getLabelForValue\n        }\n    };\n    constructor(cfg){\n        super(cfg);\n         this._startValue = undefined;\n        this._valueRange = 0;\n        this._addedLabels = [];\n    }\n    init(scaleOptions) {\n        const added = this._addedLabels;\n        if (added.length) {\n            const labels = this.getLabels();\n            for (const { index , label  } of added){\n                if (labels[index] === label) {\n                    labels.splice(index, 1);\n                }\n            }\n            this._addedLabels = [];\n        }\n        super.init(scaleOptions);\n    }\n    parse(raw, index) {\n        if (isNullOrUndef(raw)) {\n            return null;\n        }\n        const labels = this.getLabels();\n        index = isFinite(index) && labels[index] === raw ? index : findOrAddLabel(labels, raw, valueOrDefault(index, raw), this._addedLabels);\n        return validIndex(index, labels.length - 1);\n    }\n    determineDataLimits() {\n        const { minDefined , maxDefined  } = this.getUserBounds();\n        let { min , max  } = this.getMinMax(true);\n        if (this.options.bounds === 'ticks') {\n            if (!minDefined) {\n                min = 0;\n            }\n            if (!maxDefined) {\n                max = this.getLabels().length - 1;\n            }\n        }\n        this.min = min;\n        this.max = max;\n    }\n    buildTicks() {\n        const min = this.min;\n        const max = this.max;\n        const offset = this.options.offset;\n        const ticks = [];\n        let labels = this.getLabels();\n        labels = min === 0 && max === labels.length - 1 ? labels : labels.slice(min, max + 1);\n        this._valueRange = Math.max(labels.length - (offset ? 0 : 1), 1);\n        this._startValue = this.min - (offset ? 0.5 : 0);\n        for(let value = min; value <= max; value++){\n            ticks.push({\n                value\n            });\n        }\n        return ticks;\n    }\n    getLabelForValue(value) {\n        return _getLabelForValue.call(this, value);\n    }\n configure() {\n        super.configure();\n        if (!this.isHorizontal()) {\n            this._reversePixels = !this._reversePixels;\n        }\n    }\n    getPixelForValue(value) {\n        if (typeof value !== 'number') {\n            value = this.parse(value);\n        }\n        return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n    }\n    getPixelForTick(index) {\n        const ticks = this.ticks;\n        if (index < 0 || index > ticks.length - 1) {\n            return null;\n        }\n        return this.getPixelForValue(ticks[index].value);\n    }\n    getValueForPixel(pixel) {\n        return Math.round(this._startValue + this.getDecimalForPixel(pixel) * this._valueRange);\n    }\n    getBasePixel() {\n        return this.bottom;\n    }\n}\n\nfunction generateTicks$1(generationOptions, dataRange) {\n    const ticks = [];\n    const MIN_SPACING = 1e-14;\n    const { bounds , step , min , max , precision , count , maxTicks , maxDigits , includeBounds  } = generationOptions;\n    const unit = step || 1;\n    const maxSpaces = maxTicks - 1;\n    const { min: rmin , max: rmax  } = dataRange;\n    const minDefined = !isNullOrUndef(min);\n    const maxDefined = !isNullOrUndef(max);\n    const countDefined = !isNullOrUndef(count);\n    const minSpacing = (rmax - rmin) / (maxDigits + 1);\n    let spacing = niceNum((rmax - rmin) / maxSpaces / unit) * unit;\n    let factor, niceMin, niceMax, numSpaces;\n    if (spacing < MIN_SPACING && !minDefined && !maxDefined) {\n        return [\n            {\n                value: rmin\n            },\n            {\n                value: rmax\n            }\n        ];\n    }\n    numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing);\n    if (numSpaces > maxSpaces) {\n        spacing = niceNum(numSpaces * spacing / maxSpaces / unit) * unit;\n    }\n    if (!isNullOrUndef(precision)) {\n        factor = Math.pow(10, precision);\n        spacing = Math.ceil(spacing * factor) / factor;\n    }\n    if (bounds === 'ticks') {\n        niceMin = Math.floor(rmin / spacing) * spacing;\n        niceMax = Math.ceil(rmax / spacing) * spacing;\n    } else {\n        niceMin = rmin;\n        niceMax = rmax;\n    }\n    if (minDefined && maxDefined && step && almostWhole((max - min) / step, spacing / 1000)) {\n        numSpaces = Math.round(Math.min((max - min) / spacing, maxTicks));\n        spacing = (max - min) / numSpaces;\n        niceMin = min;\n        niceMax = max;\n    } else if (countDefined) {\n        niceMin = minDefined ? min : niceMin;\n        niceMax = maxDefined ? max : niceMax;\n        numSpaces = count - 1;\n        spacing = (niceMax - niceMin) / numSpaces;\n    } else {\n        numSpaces = (niceMax - niceMin) / spacing;\n        if (almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) {\n            numSpaces = Math.round(numSpaces);\n        } else {\n            numSpaces = Math.ceil(numSpaces);\n        }\n    }\n    const decimalPlaces = Math.max(_decimalPlaces(spacing), _decimalPlaces(niceMin));\n    factor = Math.pow(10, isNullOrUndef(precision) ? decimalPlaces : precision);\n    niceMin = Math.round(niceMin * factor) / factor;\n    niceMax = Math.round(niceMax * factor) / factor;\n    let j = 0;\n    if (minDefined) {\n        if (includeBounds && niceMin !== min) {\n            ticks.push({\n                value: min\n            });\n            if (niceMin < min) {\n                j++;\n            }\n            if (almostEquals(Math.round((niceMin + j * spacing) * factor) / factor, min, relativeLabelSize(min, minSpacing, generationOptions))) {\n                j++;\n            }\n        } else if (niceMin < min) {\n            j++;\n        }\n    }\n    for(; j < numSpaces; ++j){\n        const tickValue = Math.round((niceMin + j * spacing) * factor) / factor;\n        if (maxDefined && tickValue > max) {\n            break;\n        }\n        ticks.push({\n            value: tickValue\n        });\n    }\n    if (maxDefined && includeBounds && niceMax !== max) {\n        if (ticks.length && almostEquals(ticks[ticks.length - 1].value, max, relativeLabelSize(max, minSpacing, generationOptions))) {\n            ticks[ticks.length - 1].value = max;\n        } else {\n            ticks.push({\n                value: max\n            });\n        }\n    } else if (!maxDefined || niceMax === max) {\n        ticks.push({\n            value: niceMax\n        });\n    }\n    return ticks;\n}\nfunction relativeLabelSize(value, minSpacing, { horizontal , minRotation  }) {\n    const rad = toRadians(minRotation);\n    const ratio = (horizontal ? Math.sin(rad) : Math.cos(rad)) || 0.001;\n    const length = 0.75 * minSpacing * ('' + value).length;\n    return Math.min(minSpacing / ratio, length);\n}\nclass LinearScaleBase extends Scale {\n    constructor(cfg){\n        super(cfg);\n         this.start = undefined;\n         this.end = undefined;\n         this._startValue = undefined;\n         this._endValue = undefined;\n        this._valueRange = 0;\n    }\n    parse(raw, index) {\n        if (isNullOrUndef(raw)) {\n            return null;\n        }\n        if ((typeof raw === 'number' || raw instanceof Number) && !isFinite(+raw)) {\n            return null;\n        }\n        return +raw;\n    }\n    handleTickRangeOptions() {\n        const { beginAtZero  } = this.options;\n        const { minDefined , maxDefined  } = this.getUserBounds();\n        let { min , max  } = this;\n        const setMin = (v)=>min = minDefined ? min : v;\n        const setMax = (v)=>max = maxDefined ? max : v;\n        if (beginAtZero) {\n            const minSign = sign(min);\n            const maxSign = sign(max);\n            if (minSign < 0 && maxSign < 0) {\n                setMax(0);\n            } else if (minSign > 0 && maxSign > 0) {\n                setMin(0);\n            }\n        }\n        if (min === max) {\n            let offset = max === 0 ? 1 : Math.abs(max * 0.05);\n            setMax(max + offset);\n            if (!beginAtZero) {\n                setMin(min - offset);\n            }\n        }\n        this.min = min;\n        this.max = max;\n    }\n    getTickLimit() {\n        const tickOpts = this.options.ticks;\n        let { maxTicksLimit , stepSize  } = tickOpts;\n        let maxTicks;\n        if (stepSize) {\n            maxTicks = Math.ceil(this.max / stepSize) - Math.floor(this.min / stepSize) + 1;\n            if (maxTicks > 1000) {\n                console.warn(`scales.${this.id}.ticks.stepSize: ${stepSize} would result generating up to ${maxTicks} ticks. Limiting to 1000.`);\n                maxTicks = 1000;\n            }\n        } else {\n            maxTicks = this.computeTickLimit();\n            maxTicksLimit = maxTicksLimit || 11;\n        }\n        if (maxTicksLimit) {\n            maxTicks = Math.min(maxTicksLimit, maxTicks);\n        }\n        return maxTicks;\n    }\n computeTickLimit() {\n        return Number.POSITIVE_INFINITY;\n    }\n    buildTicks() {\n        const opts = this.options;\n        const tickOpts = opts.ticks;\n        let maxTicks = this.getTickLimit();\n        maxTicks = Math.max(2, maxTicks);\n        const numericGeneratorOptions = {\n            maxTicks,\n            bounds: opts.bounds,\n            min: opts.min,\n            max: opts.max,\n            precision: tickOpts.precision,\n            step: tickOpts.stepSize,\n            count: tickOpts.count,\n            maxDigits: this._maxDigits(),\n            horizontal: this.isHorizontal(),\n            minRotation: tickOpts.minRotation || 0,\n            includeBounds: tickOpts.includeBounds !== false\n        };\n        const dataRange = this._range || this;\n        const ticks = generateTicks$1(numericGeneratorOptions, dataRange);\n        if (opts.bounds === 'ticks') {\n            _setMinAndMaxByKey(ticks, this, 'value');\n        }\n        if (opts.reverse) {\n            ticks.reverse();\n            this.start = this.max;\n            this.end = this.min;\n        } else {\n            this.start = this.min;\n            this.end = this.max;\n        }\n        return ticks;\n    }\n configure() {\n        const ticks = this.ticks;\n        let start = this.min;\n        let end = this.max;\n        super.configure();\n        if (this.options.offset && ticks.length) {\n            const offset = (end - start) / Math.max(ticks.length - 1, 1) / 2;\n            start -= offset;\n            end += offset;\n        }\n        this._startValue = start;\n        this._endValue = end;\n        this._valueRange = end - start;\n    }\n    getLabelForValue(value) {\n        return formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n    }\n}\n\nclass LinearScale extends LinearScaleBase {\n    static id = 'linear';\n static defaults = {\n        ticks: {\n            callback: Ticks.formatters.numeric\n        }\n    };\n    determineDataLimits() {\n        const { min , max  } = this.getMinMax(true);\n        this.min = isNumberFinite(min) ? min : 0;\n        this.max = isNumberFinite(max) ? max : 1;\n        this.handleTickRangeOptions();\n    }\n computeTickLimit() {\n        const horizontal = this.isHorizontal();\n        const length = horizontal ? this.width : this.height;\n        const minRotation = toRadians(this.options.ticks.minRotation);\n        const ratio = (horizontal ? Math.sin(minRotation) : Math.cos(minRotation)) || 0.001;\n        const tickFont = this._resolveTickFontOptions(0);\n        return Math.ceil(length / Math.min(40, tickFont.lineHeight / ratio));\n    }\n    getPixelForValue(value) {\n        return value === null ? NaN : this.getPixelForDecimal((value - this._startValue) / this._valueRange);\n    }\n    getValueForPixel(pixel) {\n        return this._startValue + this.getDecimalForPixel(pixel) * this._valueRange;\n    }\n}\n\nconst log10Floor = (v)=>Math.floor(log10(v));\nconst changeExponent = (v, m)=>Math.pow(10, log10Floor(v) + m);\nfunction isMajor(tickVal) {\n    const remain = tickVal / Math.pow(10, log10Floor(tickVal));\n    return remain === 1;\n}\nfunction steps(min, max, rangeExp) {\n    const rangeStep = Math.pow(10, rangeExp);\n    const start = Math.floor(min / rangeStep);\n    const end = Math.ceil(max / rangeStep);\n    return end - start;\n}\nfunction startExp(min, max) {\n    const range = max - min;\n    let rangeExp = log10Floor(range);\n    while(steps(min, max, rangeExp) > 10){\n        rangeExp++;\n    }\n    while(steps(min, max, rangeExp) < 10){\n        rangeExp--;\n    }\n    return Math.min(rangeExp, log10Floor(min));\n}\n function generateTicks(generationOptions, { min , max  }) {\n    min = finiteOrDefault(generationOptions.min, min);\n    const ticks = [];\n    const minExp = log10Floor(min);\n    let exp = startExp(min, max);\n    let precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1;\n    const stepSize = Math.pow(10, exp);\n    const base = minExp > exp ? Math.pow(10, minExp) : 0;\n    const start = Math.round((min - base) * precision) / precision;\n    const offset = Math.floor((min - base) / stepSize / 10) * stepSize * 10;\n    let significand = Math.floor((start - offset) / Math.pow(10, exp));\n    let value = finiteOrDefault(generationOptions.min, Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision);\n    while(value < max){\n        ticks.push({\n            value,\n            major: isMajor(value),\n            significand\n        });\n        if (significand >= 10) {\n            significand = significand < 15 ? 15 : 20;\n        } else {\n            significand++;\n        }\n        if (significand >= 20) {\n            exp++;\n            significand = 2;\n            precision = exp >= 0 ? 1 : precision;\n        }\n        value = Math.round((base + offset + significand * Math.pow(10, exp)) * precision) / precision;\n    }\n    const lastTick = finiteOrDefault(generationOptions.max, value);\n    ticks.push({\n        value: lastTick,\n        major: isMajor(lastTick),\n        significand\n    });\n    return ticks;\n}\nclass LogarithmicScale extends Scale {\n    static id = 'logarithmic';\n static defaults = {\n        ticks: {\n            callback: Ticks.formatters.logarithmic,\n            major: {\n                enabled: true\n            }\n        }\n    };\n    constructor(cfg){\n        super(cfg);\n         this.start = undefined;\n         this.end = undefined;\n         this._startValue = undefined;\n        this._valueRange = 0;\n    }\n    parse(raw, index) {\n        const value = LinearScaleBase.prototype.parse.apply(this, [\n            raw,\n            index\n        ]);\n        if (value === 0) {\n            this._zero = true;\n            return undefined;\n        }\n        return isNumberFinite(value) && value > 0 ? value : null;\n    }\n    determineDataLimits() {\n        const { min , max  } = this.getMinMax(true);\n        this.min = isNumberFinite(min) ? Math.max(0, min) : null;\n        this.max = isNumberFinite(max) ? Math.max(0, max) : null;\n        if (this.options.beginAtZero) {\n            this._zero = true;\n        }\n        if (this._zero && this.min !== this._suggestedMin && !isNumberFinite(this._userMin)) {\n            this.min = min === changeExponent(this.min, 0) ? changeExponent(this.min, -1) : changeExponent(this.min, 0);\n        }\n        this.handleTickRangeOptions();\n    }\n    handleTickRangeOptions() {\n        const { minDefined , maxDefined  } = this.getUserBounds();\n        let min = this.min;\n        let max = this.max;\n        const setMin = (v)=>min = minDefined ? min : v;\n        const setMax = (v)=>max = maxDefined ? max : v;\n        if (min === max) {\n            if (min <= 0) {\n                setMin(1);\n                setMax(10);\n            } else {\n                setMin(changeExponent(min, -1));\n                setMax(changeExponent(max, +1));\n            }\n        }\n        if (min <= 0) {\n            setMin(changeExponent(max, -1));\n        }\n        if (max <= 0) {\n            setMax(changeExponent(min, +1));\n        }\n        this.min = min;\n        this.max = max;\n    }\n    buildTicks() {\n        const opts = this.options;\n        const generationOptions = {\n            min: this._userMin,\n            max: this._userMax\n        };\n        const ticks = generateTicks(generationOptions, this);\n        if (opts.bounds === 'ticks') {\n            _setMinAndMaxByKey(ticks, this, 'value');\n        }\n        if (opts.reverse) {\n            ticks.reverse();\n            this.start = this.max;\n            this.end = this.min;\n        } else {\n            this.start = this.min;\n            this.end = this.max;\n        }\n        return ticks;\n    }\n getLabelForValue(value) {\n        return value === undefined ? '0' : formatNumber(value, this.chart.options.locale, this.options.ticks.format);\n    }\n configure() {\n        const start = this.min;\n        super.configure();\n        this._startValue = log10(start);\n        this._valueRange = log10(this.max) - log10(start);\n    }\n    getPixelForValue(value) {\n        if (value === undefined || value === 0) {\n            value = this.min;\n        }\n        if (value === null || isNaN(value)) {\n            return NaN;\n        }\n        return this.getPixelForDecimal(value === this.min ? 0 : (log10(value) - this._startValue) / this._valueRange);\n    }\n    getValueForPixel(pixel) {\n        const decimal = this.getDecimalForPixel(pixel);\n        return Math.pow(10, this._startValue + decimal * this._valueRange);\n    }\n}\n\nfunction getTickBackdropHeight(opts) {\n    const tickOpts = opts.ticks;\n    if (tickOpts.display && opts.display) {\n        const padding = toPadding(tickOpts.backdropPadding);\n        return valueOrDefault(tickOpts.font && tickOpts.font.size, defaults.font.size) + padding.height;\n    }\n    return 0;\n}\nfunction measureLabelSize(ctx, font, label) {\n    label = isArray(label) ? label : [\n        label\n    ];\n    return {\n        w: _longestText(ctx, font.string, label),\n        h: label.length * font.lineHeight\n    };\n}\nfunction determineLimits(angle, pos, size, min, max) {\n    if (angle === min || angle === max) {\n        return {\n            start: pos - size / 2,\n            end: pos + size / 2\n        };\n    } else if (angle < min || angle > max) {\n        return {\n            start: pos - size,\n            end: pos\n        };\n    }\n    return {\n        start: pos,\n        end: pos + size\n    };\n}\n function fitWithPointLabels(scale) {\n    const orig = {\n        l: scale.left + scale._padding.left,\n        r: scale.right - scale._padding.right,\n        t: scale.top + scale._padding.top,\n        b: scale.bottom - scale._padding.bottom\n    };\n    const limits = Object.assign({}, orig);\n    const labelSizes = [];\n    const padding = [];\n    const valueCount = scale._pointLabels.length;\n    const pointLabelOpts = scale.options.pointLabels;\n    const additionalAngle = pointLabelOpts.centerPointLabels ? PI / valueCount : 0;\n    for(let i = 0; i < valueCount; i++){\n        const opts = pointLabelOpts.setContext(scale.getPointLabelContext(i));\n        padding[i] = opts.padding;\n        const pointPosition = scale.getPointPosition(i, scale.drawingArea + padding[i], additionalAngle);\n        const plFont = toFont(opts.font);\n        const textSize = measureLabelSize(scale.ctx, plFont, scale._pointLabels[i]);\n        labelSizes[i] = textSize;\n        const angleRadians = _normalizeAngle(scale.getIndexAngle(i) + additionalAngle);\n        const angle = Math.round(toDegrees(angleRadians));\n        const hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180);\n        const vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270);\n        updateLimits(limits, orig, angleRadians, hLimits, vLimits);\n    }\n    scale.setCenterPoint(orig.l - limits.l, limits.r - orig.r, orig.t - limits.t, limits.b - orig.b);\n    scale._pointLabelItems = buildPointLabelItems(scale, labelSizes, padding);\n}\nfunction updateLimits(limits, orig, angle, hLimits, vLimits) {\n    const sin = Math.abs(Math.sin(angle));\n    const cos = Math.abs(Math.cos(angle));\n    let x = 0;\n    let y = 0;\n    if (hLimits.start < orig.l) {\n        x = (orig.l - hLimits.start) / sin;\n        limits.l = Math.min(limits.l, orig.l - x);\n    } else if (hLimits.end > orig.r) {\n        x = (hLimits.end - orig.r) / sin;\n        limits.r = Math.max(limits.r, orig.r + x);\n    }\n    if (vLimits.start < orig.t) {\n        y = (orig.t - vLimits.start) / cos;\n        limits.t = Math.min(limits.t, orig.t - y);\n    } else if (vLimits.end > orig.b) {\n        y = (vLimits.end - orig.b) / cos;\n        limits.b = Math.max(limits.b, orig.b + y);\n    }\n}\nfunction createPointLabelItem(scale, index, itemOpts) {\n    const outerDistance = scale.drawingArea;\n    const { extra , additionalAngle , padding , size  } = itemOpts;\n    const pointLabelPosition = scale.getPointPosition(index, outerDistance + extra + padding, additionalAngle);\n    const angle = Math.round(toDegrees(_normalizeAngle(pointLabelPosition.angle + HALF_PI)));\n    const y = yForAngle(pointLabelPosition.y, size.h, angle);\n    const textAlign = getTextAlignForAngle(angle);\n    const left = leftForTextAlign(pointLabelPosition.x, size.w, textAlign);\n    return {\n        visible: true,\n        x: pointLabelPosition.x,\n        y,\n        textAlign,\n        left,\n        top: y,\n        right: left + size.w,\n        bottom: y + size.h\n    };\n}\nfunction isNotOverlapped(item, area) {\n    if (!area) {\n        return true;\n    }\n    const { left , top , right , bottom  } = item;\n    const apexesInArea = _isPointInArea({\n        x: left,\n        y: top\n    }, area) || _isPointInArea({\n        x: left,\n        y: bottom\n    }, area) || _isPointInArea({\n        x: right,\n        y: top\n    }, area) || _isPointInArea({\n        x: right,\n        y: bottom\n    }, area);\n    return !apexesInArea;\n}\nfunction buildPointLabelItems(scale, labelSizes, padding) {\n    const items = [];\n    const valueCount = scale._pointLabels.length;\n    const opts = scale.options;\n    const { centerPointLabels , display  } = opts.pointLabels;\n    const itemOpts = {\n        extra: getTickBackdropHeight(opts) / 2,\n        additionalAngle: centerPointLabels ? PI / valueCount : 0\n    };\n    let area;\n    for(let i = 0; i < valueCount; i++){\n        itemOpts.padding = padding[i];\n        itemOpts.size = labelSizes[i];\n        const item = createPointLabelItem(scale, i, itemOpts);\n        items.push(item);\n        if (display === 'auto') {\n            item.visible = isNotOverlapped(item, area);\n            if (item.visible) {\n                area = item;\n            }\n        }\n    }\n    return items;\n}\nfunction getTextAlignForAngle(angle) {\n    if (angle === 0 || angle === 180) {\n        return 'center';\n    } else if (angle < 180) {\n        return 'left';\n    }\n    return 'right';\n}\nfunction leftForTextAlign(x, w, align) {\n    if (align === 'right') {\n        x -= w;\n    } else if (align === 'center') {\n        x -= w / 2;\n    }\n    return x;\n}\nfunction yForAngle(y, h, angle) {\n    if (angle === 90 || angle === 270) {\n        y -= h / 2;\n    } else if (angle > 270 || angle < 90) {\n        y -= h;\n    }\n    return y;\n}\nfunction drawPointLabelBox(ctx, opts, item) {\n    const { left , top , right , bottom  } = item;\n    const { backdropColor  } = opts;\n    if (!isNullOrUndef(backdropColor)) {\n        const borderRadius = toTRBLCorners(opts.borderRadius);\n        const padding = toPadding(opts.backdropPadding);\n        ctx.fillStyle = backdropColor;\n        const backdropLeft = left - padding.left;\n        const backdropTop = top - padding.top;\n        const backdropWidth = right - left + padding.width;\n        const backdropHeight = bottom - top + padding.height;\n        if (Object.values(borderRadius).some((v)=>v !== 0)) {\n            ctx.beginPath();\n            addRoundedRectPath(ctx, {\n                x: backdropLeft,\n                y: backdropTop,\n                w: backdropWidth,\n                h: backdropHeight,\n                radius: borderRadius\n            });\n            ctx.fill();\n        } else {\n            ctx.fillRect(backdropLeft, backdropTop, backdropWidth, backdropHeight);\n        }\n    }\n}\nfunction drawPointLabels(scale, labelCount) {\n    const { ctx , options: { pointLabels  }  } = scale;\n    for(let i = labelCount - 1; i >= 0; i--){\n        const item = scale._pointLabelItems[i];\n        if (!item.visible) {\n            continue;\n        }\n        const optsAtIndex = pointLabels.setContext(scale.getPointLabelContext(i));\n        drawPointLabelBox(ctx, optsAtIndex, item);\n        const plFont = toFont(optsAtIndex.font);\n        const { x , y , textAlign  } = item;\n        renderText(ctx, scale._pointLabels[i], x, y + plFont.lineHeight / 2, plFont, {\n            color: optsAtIndex.color,\n            textAlign: textAlign,\n            textBaseline: 'middle'\n        });\n    }\n}\nfunction pathRadiusLine(scale, radius, circular, labelCount) {\n    const { ctx  } = scale;\n    if (circular) {\n        ctx.arc(scale.xCenter, scale.yCenter, radius, 0, TAU);\n    } else {\n        let pointPosition = scale.getPointPosition(0, radius);\n        ctx.moveTo(pointPosition.x, pointPosition.y);\n        for(let i = 1; i < labelCount; i++){\n            pointPosition = scale.getPointPosition(i, radius);\n            ctx.lineTo(pointPosition.x, pointPosition.y);\n        }\n    }\n}\nfunction drawRadiusLine(scale, gridLineOpts, radius, labelCount, borderOpts) {\n    const ctx = scale.ctx;\n    const circular = gridLineOpts.circular;\n    const { color , lineWidth  } = gridLineOpts;\n    if (!circular && !labelCount || !color || !lineWidth || radius < 0) {\n        return;\n    }\n    ctx.save();\n    ctx.strokeStyle = color;\n    ctx.lineWidth = lineWidth;\n    ctx.setLineDash(borderOpts.dash || []);\n    ctx.lineDashOffset = borderOpts.dashOffset;\n    ctx.beginPath();\n    pathRadiusLine(scale, radius, circular, labelCount);\n    ctx.closePath();\n    ctx.stroke();\n    ctx.restore();\n}\nfunction createPointLabelContext(parent, index, label) {\n    return createContext(parent, {\n        label,\n        index,\n        type: 'pointLabel'\n    });\n}\nclass RadialLinearScale extends LinearScaleBase {\n    static id = 'radialLinear';\n static defaults = {\n        display: true,\n        animate: true,\n        position: 'chartArea',\n        angleLines: {\n            display: true,\n            lineWidth: 1,\n            borderDash: [],\n            borderDashOffset: 0.0\n        },\n        grid: {\n            circular: false\n        },\n        startAngle: 0,\n        ticks: {\n            showLabelBackdrop: true,\n            callback: Ticks.formatters.numeric\n        },\n        pointLabels: {\n            backdropColor: undefined,\n            backdropPadding: 2,\n            display: true,\n            font: {\n                size: 10\n            },\n            callback (label) {\n                return label;\n            },\n            padding: 5,\n            centerPointLabels: false\n        }\n    };\n    static defaultRoutes = {\n        'angleLines.color': 'borderColor',\n        'pointLabels.color': 'color',\n        'ticks.color': 'color'\n    };\n    static descriptors = {\n        angleLines: {\n            _fallback: 'grid'\n        }\n    };\n    constructor(cfg){\n        super(cfg);\n         this.xCenter = undefined;\n         this.yCenter = undefined;\n         this.drawingArea = undefined;\n         this._pointLabels = [];\n        this._pointLabelItems = [];\n    }\n    setDimensions() {\n        const padding = this._padding = toPadding(getTickBackdropHeight(this.options) / 2);\n        const w = this.width = this.maxWidth - padding.width;\n        const h = this.height = this.maxHeight - padding.height;\n        this.xCenter = Math.floor(this.left + w / 2 + padding.left);\n        this.yCenter = Math.floor(this.top + h / 2 + padding.top);\n        this.drawingArea = Math.floor(Math.min(w, h) / 2);\n    }\n    determineDataLimits() {\n        const { min , max  } = this.getMinMax(false);\n        this.min = isNumberFinite(min) && !isNaN(min) ? min : 0;\n        this.max = isNumberFinite(max) && !isNaN(max) ? max : 0;\n        this.handleTickRangeOptions();\n    }\n computeTickLimit() {\n        return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options));\n    }\n    generateTickLabels(ticks) {\n        LinearScaleBase.prototype.generateTickLabels.call(this, ticks);\n        this._pointLabels = this.getLabels().map((value, index)=>{\n            const label = callback(this.options.pointLabels.callback, [\n                value,\n                index\n            ], this);\n            return label || label === 0 ? label : '';\n        }).filter((v, i)=>this.chart.getDataVisibility(i));\n    }\n    fit() {\n        const opts = this.options;\n        if (opts.display && opts.pointLabels.display) {\n            fitWithPointLabels(this);\n        } else {\n            this.setCenterPoint(0, 0, 0, 0);\n        }\n    }\n    setCenterPoint(leftMovement, rightMovement, topMovement, bottomMovement) {\n        this.xCenter += Math.floor((leftMovement - rightMovement) / 2);\n        this.yCenter += Math.floor((topMovement - bottomMovement) / 2);\n        this.drawingArea -= Math.min(this.drawingArea / 2, Math.max(leftMovement, rightMovement, topMovement, bottomMovement));\n    }\n    getIndexAngle(index) {\n        const angleMultiplier = TAU / (this._pointLabels.length || 1);\n        const startAngle = this.options.startAngle || 0;\n        return _normalizeAngle(index * angleMultiplier + toRadians(startAngle));\n    }\n    getDistanceFromCenterForValue(value) {\n        if (isNullOrUndef(value)) {\n            return NaN;\n        }\n        const scalingFactor = this.drawingArea / (this.max - this.min);\n        if (this.options.reverse) {\n            return (this.max - value) * scalingFactor;\n        }\n        return (value - this.min) * scalingFactor;\n    }\n    getValueForDistanceFromCenter(distance) {\n        if (isNullOrUndef(distance)) {\n            return NaN;\n        }\n        const scaledDistance = distance / (this.drawingArea / (this.max - this.min));\n        return this.options.reverse ? this.max - scaledDistance : this.min + scaledDistance;\n    }\n    getPointLabelContext(index) {\n        const pointLabels = this._pointLabels || [];\n        if (index >= 0 && index < pointLabels.length) {\n            const pointLabel = pointLabels[index];\n            return createPointLabelContext(this.getContext(), index, pointLabel);\n        }\n    }\n    getPointPosition(index, distanceFromCenter, additionalAngle = 0) {\n        const angle = this.getIndexAngle(index) - HALF_PI + additionalAngle;\n        return {\n            x: Math.cos(angle) * distanceFromCenter + this.xCenter,\n            y: Math.sin(angle) * distanceFromCenter + this.yCenter,\n            angle\n        };\n    }\n    getPointPositionForValue(index, value) {\n        return this.getPointPosition(index, this.getDistanceFromCenterForValue(value));\n    }\n    getBasePosition(index) {\n        return this.getPointPositionForValue(index || 0, this.getBaseValue());\n    }\n    getPointLabelPosition(index) {\n        const { left , top , right , bottom  } = this._pointLabelItems[index];\n        return {\n            left,\n            top,\n            right,\n            bottom\n        };\n    }\n drawBackground() {\n        const { backgroundColor , grid: { circular  }  } = this.options;\n        if (backgroundColor) {\n            const ctx = this.ctx;\n            ctx.save();\n            ctx.beginPath();\n            pathRadiusLine(this, this.getDistanceFromCenterForValue(this._endValue), circular, this._pointLabels.length);\n            ctx.closePath();\n            ctx.fillStyle = backgroundColor;\n            ctx.fill();\n            ctx.restore();\n        }\n    }\n drawGrid() {\n        const ctx = this.ctx;\n        const opts = this.options;\n        const { angleLines , grid , border  } = opts;\n        const labelCount = this._pointLabels.length;\n        let i, offset, position;\n        if (opts.pointLabels.display) {\n            drawPointLabels(this, labelCount);\n        }\n        if (grid.display) {\n            this.ticks.forEach((tick, index)=>{\n                if (index !== 0 || index === 0 && this.min < 0) {\n                    offset = this.getDistanceFromCenterForValue(tick.value);\n                    const context = this.getContext(index);\n                    const optsAtIndex = grid.setContext(context);\n                    const optsAtIndexBorder = border.setContext(context);\n                    drawRadiusLine(this, optsAtIndex, offset, labelCount, optsAtIndexBorder);\n                }\n            });\n        }\n        if (angleLines.display) {\n            ctx.save();\n            for(i = labelCount - 1; i >= 0; i--){\n                const optsAtIndex = angleLines.setContext(this.getPointLabelContext(i));\n                const { color , lineWidth  } = optsAtIndex;\n                if (!lineWidth || !color) {\n                    continue;\n                }\n                ctx.lineWidth = lineWidth;\n                ctx.strokeStyle = color;\n                ctx.setLineDash(optsAtIndex.borderDash);\n                ctx.lineDashOffset = optsAtIndex.borderDashOffset;\n                offset = this.getDistanceFromCenterForValue(opts.reverse ? this.min : this.max);\n                position = this.getPointPosition(i, offset);\n                ctx.beginPath();\n                ctx.moveTo(this.xCenter, this.yCenter);\n                ctx.lineTo(position.x, position.y);\n                ctx.stroke();\n            }\n            ctx.restore();\n        }\n    }\n drawBorder() {}\n drawLabels() {\n        const ctx = this.ctx;\n        const opts = this.options;\n        const tickOpts = opts.ticks;\n        if (!tickOpts.display) {\n            return;\n        }\n        const startAngle = this.getIndexAngle(0);\n        let offset, width;\n        ctx.save();\n        ctx.translate(this.xCenter, this.yCenter);\n        ctx.rotate(startAngle);\n        ctx.textAlign = 'center';\n        ctx.textBaseline = 'middle';\n        this.ticks.forEach((tick, index)=>{\n            if (index === 0 && this.min >= 0 && !opts.reverse) {\n                return;\n            }\n            const optsAtIndex = tickOpts.setContext(this.getContext(index));\n            const tickFont = toFont(optsAtIndex.font);\n            offset = this.getDistanceFromCenterForValue(this.ticks[index].value);\n            if (optsAtIndex.showLabelBackdrop) {\n                ctx.font = tickFont.string;\n                width = ctx.measureText(tick.label).width;\n                ctx.fillStyle = optsAtIndex.backdropColor;\n                const padding = toPadding(optsAtIndex.backdropPadding);\n                ctx.fillRect(-width / 2 - padding.left, -offset - tickFont.size / 2 - padding.top, width + padding.width, tickFont.size + padding.height);\n            }\n            renderText(ctx, tick.label, 0, -offset, tickFont, {\n                color: optsAtIndex.color,\n                strokeColor: optsAtIndex.textStrokeColor,\n                strokeWidth: optsAtIndex.textStrokeWidth\n            });\n        });\n        ctx.restore();\n    }\n drawTitle() {}\n}\n\nconst INTERVALS = {\n    millisecond: {\n        common: true,\n        size: 1,\n        steps: 1000\n    },\n    second: {\n        common: true,\n        size: 1000,\n        steps: 60\n    },\n    minute: {\n        common: true,\n        size: 60000,\n        steps: 60\n    },\n    hour: {\n        common: true,\n        size: 3600000,\n        steps: 24\n    },\n    day: {\n        common: true,\n        size: 86400000,\n        steps: 30\n    },\n    week: {\n        common: false,\n        size: 604800000,\n        steps: 4\n    },\n    month: {\n        common: true,\n        size: 2.628e9,\n        steps: 12\n    },\n    quarter: {\n        common: false,\n        size: 7.884e9,\n        steps: 4\n    },\n    year: {\n        common: true,\n        size: 3.154e10\n    }\n};\n const UNITS =  /* #__PURE__ */ Object.keys(INTERVALS);\n function sorter(a, b) {\n    return a - b;\n}\n function parse(scale, input) {\n    if (isNullOrUndef(input)) {\n        return null;\n    }\n    const adapter = scale._adapter;\n    const { parser , round , isoWeekday  } = scale._parseOpts;\n    let value = input;\n    if (typeof parser === 'function') {\n        value = parser(value);\n    }\n    if (!isNumberFinite(value)) {\n        value = typeof parser === 'string' ? adapter.parse(value, parser) : adapter.parse(value);\n    }\n    if (value === null) {\n        return null;\n    }\n    if (round) {\n        value = round === 'week' && (isNumber(isoWeekday) || isoWeekday === true) ? adapter.startOf(value, 'isoWeek', isoWeekday) : adapter.startOf(value, round);\n    }\n    return +value;\n}\n function determineUnitForAutoTicks(minUnit, min, max, capacity) {\n    const ilen = UNITS.length;\n    for(let i = UNITS.indexOf(minUnit); i < ilen - 1; ++i){\n        const interval = INTERVALS[UNITS[i]];\n        const factor = interval.steps ? interval.steps : Number.MAX_SAFE_INTEGER;\n        if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) {\n            return UNITS[i];\n        }\n    }\n    return UNITS[ilen - 1];\n}\n function determineUnitForFormatting(scale, numTicks, minUnit, min, max) {\n    for(let i = UNITS.length - 1; i >= UNITS.indexOf(minUnit); i--){\n        const unit = UNITS[i];\n        if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= numTicks - 1) {\n            return unit;\n        }\n    }\n    return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0];\n}\n function determineMajorUnit(unit) {\n    for(let i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i){\n        if (INTERVALS[UNITS[i]].common) {\n            return UNITS[i];\n        }\n    }\n}\n function addTick(ticks, time, timestamps) {\n    if (!timestamps) {\n        ticks[time] = true;\n    } else if (timestamps.length) {\n        const { lo , hi  } = _lookup(timestamps, time);\n        const timestamp = timestamps[lo] >= time ? timestamps[lo] : timestamps[hi];\n        ticks[timestamp] = true;\n    }\n}\n function setMajorTicks(scale, ticks, map, majorUnit) {\n    const adapter = scale._adapter;\n    const first = +adapter.startOf(ticks[0].value, majorUnit);\n    const last = ticks[ticks.length - 1].value;\n    let major, index;\n    for(major = first; major <= last; major = +adapter.add(major, 1, majorUnit)){\n        index = map[major];\n        if (index >= 0) {\n            ticks[index].major = true;\n        }\n    }\n    return ticks;\n}\n function ticksFromTimestamps(scale, values, majorUnit) {\n    const ticks = [];\n     const map = {};\n    const ilen = values.length;\n    let i, value;\n    for(i = 0; i < ilen; ++i){\n        value = values[i];\n        map[value] = i;\n        ticks.push({\n            value,\n            major: false\n        });\n    }\n    return ilen === 0 || !majorUnit ? ticks : setMajorTicks(scale, ticks, map, majorUnit);\n}\nclass TimeScale extends Scale {\n    static id = 'time';\n static defaults = {\n bounds: 'data',\n        adapters: {},\n        time: {\n            parser: false,\n            unit: false,\n            round: false,\n            isoWeekday: false,\n            minUnit: 'millisecond',\n            displayFormats: {}\n        },\n        ticks: {\n source: 'auto',\n            callback: false,\n            major: {\n                enabled: false\n            }\n        }\n    };\n constructor(props){\n        super(props);\n         this._cache = {\n            data: [],\n            labels: [],\n            all: []\n        };\n         this._unit = 'day';\n         this._majorUnit = undefined;\n        this._offsets = {};\n        this._normalized = false;\n        this._parseOpts = undefined;\n    }\n    init(scaleOpts, opts = {}) {\n        const time = scaleOpts.time || (scaleOpts.time = {});\n         const adapter = this._adapter = new adapters._date(scaleOpts.adapters.date);\n        adapter.init(opts);\n        mergeIf(time.displayFormats, adapter.formats());\n        this._parseOpts = {\n            parser: time.parser,\n            round: time.round,\n            isoWeekday: time.isoWeekday\n        };\n        super.init(scaleOpts);\n        this._normalized = opts.normalized;\n    }\n parse(raw, index) {\n        if (raw === undefined) {\n            return null;\n        }\n        return parse(this, raw);\n    }\n    beforeLayout() {\n        super.beforeLayout();\n        this._cache = {\n            data: [],\n            labels: [],\n            all: []\n        };\n    }\n    determineDataLimits() {\n        const options = this.options;\n        const adapter = this._adapter;\n        const unit = options.time.unit || 'day';\n        let { min , max , minDefined , maxDefined  } = this.getUserBounds();\n function _applyBounds(bounds) {\n            if (!minDefined && !isNaN(bounds.min)) {\n                min = Math.min(min, bounds.min);\n            }\n            if (!maxDefined && !isNaN(bounds.max)) {\n                max = Math.max(max, bounds.max);\n            }\n        }\n        if (!minDefined || !maxDefined) {\n            _applyBounds(this._getLabelBounds());\n            if (options.bounds !== 'ticks' || options.ticks.source !== 'labels') {\n                _applyBounds(this.getMinMax(false));\n            }\n        }\n        min = isNumberFinite(min) && !isNaN(min) ? min : +adapter.startOf(Date.now(), unit);\n        max = isNumberFinite(max) && !isNaN(max) ? max : +adapter.endOf(Date.now(), unit) + 1;\n        this.min = Math.min(min, max - 1);\n        this.max = Math.max(min + 1, max);\n    }\n _getLabelBounds() {\n        const arr = this.getLabelTimestamps();\n        let min = Number.POSITIVE_INFINITY;\n        let max = Number.NEGATIVE_INFINITY;\n        if (arr.length) {\n            min = arr[0];\n            max = arr[arr.length - 1];\n        }\n        return {\n            min,\n            max\n        };\n    }\n buildTicks() {\n        const options = this.options;\n        const timeOpts = options.time;\n        const tickOpts = options.ticks;\n        const timestamps = tickOpts.source === 'labels' ? this.getLabelTimestamps() : this._generate();\n        if (options.bounds === 'ticks' && timestamps.length) {\n            this.min = this._userMin || timestamps[0];\n            this.max = this._userMax || timestamps[timestamps.length - 1];\n        }\n        const min = this.min;\n        const max = this.max;\n        const ticks = _filterBetween(timestamps, min, max);\n        this._unit = timeOpts.unit || (tickOpts.autoSkip ? determineUnitForAutoTicks(timeOpts.minUnit, this.min, this.max, this._getLabelCapacity(min)) : determineUnitForFormatting(this, ticks.length, timeOpts.minUnit, this.min, this.max));\n        this._majorUnit = !tickOpts.major.enabled || this._unit === 'year' ? undefined : determineMajorUnit(this._unit);\n        this.initOffsets(timestamps);\n        if (options.reverse) {\n            ticks.reverse();\n        }\n        return ticksFromTimestamps(this, ticks, this._majorUnit);\n    }\n    afterAutoSkip() {\n        if (this.options.offsetAfterAutoskip) {\n            this.initOffsets(this.ticks.map((tick)=>+tick.value));\n        }\n    }\n initOffsets(timestamps = []) {\n        let start = 0;\n        let end = 0;\n        let first, last;\n        if (this.options.offset && timestamps.length) {\n            first = this.getDecimalForValue(timestamps[0]);\n            if (timestamps.length === 1) {\n                start = 1 - first;\n            } else {\n                start = (this.getDecimalForValue(timestamps[1]) - first) / 2;\n            }\n            last = this.getDecimalForValue(timestamps[timestamps.length - 1]);\n            if (timestamps.length === 1) {\n                end = last;\n            } else {\n                end = (last - this.getDecimalForValue(timestamps[timestamps.length - 2])) / 2;\n            }\n        }\n        const limit = timestamps.length < 3 ? 0.5 : 0.25;\n        start = _limitValue(start, 0, limit);\n        end = _limitValue(end, 0, limit);\n        this._offsets = {\n            start,\n            end,\n            factor: 1 / (start + 1 + end)\n        };\n    }\n _generate() {\n        const adapter = this._adapter;\n        const min = this.min;\n        const max = this.max;\n        const options = this.options;\n        const timeOpts = options.time;\n        const minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, this._getLabelCapacity(min));\n        const stepSize = valueOrDefault(options.ticks.stepSize, 1);\n        const weekday = minor === 'week' ? timeOpts.isoWeekday : false;\n        const hasWeekday = isNumber(weekday) || weekday === true;\n        const ticks = {};\n        let first = min;\n        let time, count;\n        if (hasWeekday) {\n            first = +adapter.startOf(first, 'isoWeek', weekday);\n        }\n        first = +adapter.startOf(first, hasWeekday ? 'day' : minor);\n        if (adapter.diff(max, min, minor) > 100000 * stepSize) {\n            throw new Error(min + ' and ' + max + ' are too far apart with stepSize of ' + stepSize + ' ' + minor);\n        }\n        const timestamps = options.ticks.source === 'data' && this.getDataTimestamps();\n        for(time = first, count = 0; time < max; time = +adapter.add(time, stepSize, minor), count++){\n            addTick(ticks, time, timestamps);\n        }\n        if (time === max || options.bounds === 'ticks' || count === 1) {\n            addTick(ticks, time, timestamps);\n        }\n        return Object.keys(ticks).sort(sorter).map((x)=>+x);\n    }\n getLabelForValue(value) {\n        const adapter = this._adapter;\n        const timeOpts = this.options.time;\n        if (timeOpts.tooltipFormat) {\n            return adapter.format(value, timeOpts.tooltipFormat);\n        }\n        return adapter.format(value, timeOpts.displayFormats.datetime);\n    }\n format(value, format) {\n        const options = this.options;\n        const formats = options.time.displayFormats;\n        const unit = this._unit;\n        const fmt = format || formats[unit];\n        return this._adapter.format(value, fmt);\n    }\n _tickFormatFunction(time, index, ticks, format) {\n        const options = this.options;\n        const formatter = options.ticks.callback;\n        if (formatter) {\n            return callback(formatter, [\n                time,\n                index,\n                ticks\n            ], this);\n        }\n        const formats = options.time.displayFormats;\n        const unit = this._unit;\n        const majorUnit = this._majorUnit;\n        const minorFormat = unit && formats[unit];\n        const majorFormat = majorUnit && formats[majorUnit];\n        const tick = ticks[index];\n        const major = majorUnit && majorFormat && tick && tick.major;\n        return this._adapter.format(time, format || (major ? majorFormat : minorFormat));\n    }\n generateTickLabels(ticks) {\n        let i, ilen, tick;\n        for(i = 0, ilen = ticks.length; i < ilen; ++i){\n            tick = ticks[i];\n            tick.label = this._tickFormatFunction(tick.value, i, ticks);\n        }\n    }\n getDecimalForValue(value) {\n        return value === null ? NaN : (value - this.min) / (this.max - this.min);\n    }\n getPixelForValue(value) {\n        const offsets = this._offsets;\n        const pos = this.getDecimalForValue(value);\n        return this.getPixelForDecimal((offsets.start + pos) * offsets.factor);\n    }\n getValueForPixel(pixel) {\n        const offsets = this._offsets;\n        const pos = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n        return this.min + pos * (this.max - this.min);\n    }\n _getLabelSize(label) {\n        const ticksOpts = this.options.ticks;\n        const tickLabelWidth = this.ctx.measureText(label).width;\n        const angle = toRadians(this.isHorizontal() ? ticksOpts.maxRotation : ticksOpts.minRotation);\n        const cosRotation = Math.cos(angle);\n        const sinRotation = Math.sin(angle);\n        const tickFontSize = this._resolveTickFontOptions(0).size;\n        return {\n            w: tickLabelWidth * cosRotation + tickFontSize * sinRotation,\n            h: tickLabelWidth * sinRotation + tickFontSize * cosRotation\n        };\n    }\n _getLabelCapacity(exampleTime) {\n        const timeOpts = this.options.time;\n        const displayFormats = timeOpts.displayFormats;\n        const format = displayFormats[timeOpts.unit] || displayFormats.millisecond;\n        const exampleLabel = this._tickFormatFunction(exampleTime, 0, ticksFromTimestamps(this, [\n            exampleTime\n        ], this._majorUnit), format);\n        const size = this._getLabelSize(exampleLabel);\n        const capacity = Math.floor(this.isHorizontal() ? this.width / size.w : this.height / size.h) - 1;\n        return capacity > 0 ? capacity : 1;\n    }\n getDataTimestamps() {\n        let timestamps = this._cache.data || [];\n        let i, ilen;\n        if (timestamps.length) {\n            return timestamps;\n        }\n        const metas = this.getMatchingVisibleMetas();\n        if (this._normalized && metas.length) {\n            return this._cache.data = metas[0].controller.getAllParsedValues(this);\n        }\n        for(i = 0, ilen = metas.length; i < ilen; ++i){\n            timestamps = timestamps.concat(metas[i].controller.getAllParsedValues(this));\n        }\n        return this._cache.data = this.normalize(timestamps);\n    }\n getLabelTimestamps() {\n        const timestamps = this._cache.labels || [];\n        let i, ilen;\n        if (timestamps.length) {\n            return timestamps;\n        }\n        const labels = this.getLabels();\n        for(i = 0, ilen = labels.length; i < ilen; ++i){\n            timestamps.push(parse(this, labels[i]));\n        }\n        return this._cache.labels = this._normalized ? timestamps : this.normalize(timestamps);\n    }\n normalize(values) {\n        return _arrayUnique(values.sort(sorter));\n    }\n}\n\nfunction interpolate(table, val, reverse) {\n    let lo = 0;\n    let hi = table.length - 1;\n    let prevSource, nextSource, prevTarget, nextTarget;\n    if (reverse) {\n        if (val >= table[lo].pos && val <= table[hi].pos) {\n            ({ lo , hi  } = _lookupByKey(table, 'pos', val));\n        }\n        ({ pos: prevSource , time: prevTarget  } = table[lo]);\n        ({ pos: nextSource , time: nextTarget  } = table[hi]);\n    } else {\n        if (val >= table[lo].time && val <= table[hi].time) {\n            ({ lo , hi  } = _lookupByKey(table, 'time', val));\n        }\n        ({ time: prevSource , pos: prevTarget  } = table[lo]);\n        ({ time: nextSource , pos: nextTarget  } = table[hi]);\n    }\n    const span = nextSource - prevSource;\n    return span ? prevTarget + (nextTarget - prevTarget) * (val - prevSource) / span : prevTarget;\n}\nclass TimeSeriesScale extends TimeScale {\n    static id = 'timeseries';\n static defaults = TimeScale.defaults;\n constructor(props){\n        super(props);\n         this._table = [];\n         this._minPos = undefined;\n         this._tableRange = undefined;\n    }\n initOffsets() {\n        const timestamps = this._getTimestampsForTable();\n        const table = this._table = this.buildLookupTable(timestamps);\n        this._minPos = interpolate(table, this.min);\n        this._tableRange = interpolate(table, this.max) - this._minPos;\n        super.initOffsets(timestamps);\n    }\n buildLookupTable(timestamps) {\n        const { min , max  } = this;\n        const items = [];\n        const table = [];\n        let i, ilen, prev, curr, next;\n        for(i = 0, ilen = timestamps.length; i < ilen; ++i){\n            curr = timestamps[i];\n            if (curr >= min && curr <= max) {\n                items.push(curr);\n            }\n        }\n        if (items.length < 2) {\n            return [\n                {\n                    time: min,\n                    pos: 0\n                },\n                {\n                    time: max,\n                    pos: 1\n                }\n            ];\n        }\n        for(i = 0, ilen = items.length; i < ilen; ++i){\n            next = items[i + 1];\n            prev = items[i - 1];\n            curr = items[i];\n            if (Math.round((next + prev) / 2) !== curr) {\n                table.push({\n                    time: curr,\n                    pos: i / (ilen - 1)\n                });\n            }\n        }\n        return table;\n    }\n _generate() {\n        const min = this.min;\n        const max = this.max;\n        let timestamps = super.getDataTimestamps();\n        if (!timestamps.includes(min) || !timestamps.length) {\n            timestamps.splice(0, 0, min);\n        }\n        if (!timestamps.includes(max) || timestamps.length === 1) {\n            timestamps.push(max);\n        }\n        return timestamps.sort((a, b)=>a - b);\n    }\n _getTimestampsForTable() {\n        let timestamps = this._cache.all || [];\n        if (timestamps.length) {\n            return timestamps;\n        }\n        const data = this.getDataTimestamps();\n        const label = this.getLabelTimestamps();\n        if (data.length && label.length) {\n            timestamps = this.normalize(data.concat(label));\n        } else {\n            timestamps = data.length ? data : label;\n        }\n        timestamps = this._cache.all = timestamps;\n        return timestamps;\n    }\n getDecimalForValue(value) {\n        return (interpolate(this._table, value) - this._minPos) / this._tableRange;\n    }\n getValueForPixel(pixel) {\n        const offsets = this._offsets;\n        const decimal = this.getDecimalForPixel(pixel) / offsets.factor - offsets.end;\n        return interpolate(this._table, decimal * this._tableRange + this._minPos, true);\n    }\n}\n\nvar scales = /*#__PURE__*/Object.freeze({\n__proto__: null,\nCategoryScale: CategoryScale,\nLinearScale: LinearScale,\nLogarithmicScale: LogarithmicScale,\nRadialLinearScale: RadialLinearScale,\nTimeScale: TimeScale,\nTimeSeriesScale: TimeSeriesScale\n});\n\nconst registerables = [\n    controllers,\n    elements,\n    plugins,\n    scales\n];\n\nexport { Animation, Animations, ArcElement, BarController, BarElement, BasePlatform, BasicPlatform, BubbleController, CategoryScale, Chart, plugin_colors as Colors, DatasetController, plugin_decimation as Decimation, DomPlatform, DoughnutController, Element, index as Filler, Interaction, plugin_legend as Legend, LineController, LineElement, LinearScale, LogarithmicScale, PieController, PointElement, PolarAreaController, RadarController, RadialLinearScale, Scale, ScatterController, plugin_subtitle as SubTitle, Ticks, TimeScale, TimeSeriesScale, plugin_title as Title, plugin_tooltip as Tooltip, adapters as _adapters, _detectPlatform, animator, controllers, defaults, elements, layouts, plugins, registerables, registry, scales };\n//# sourceMappingURL=chart.js.map\n","import {Chart, registerables} from '../dist/chart.js';\n\nChart.register(...registerables);\n\nexport * from '../dist/chart.js';\nexport default Chart;\n","<script>\n\timport { onMount } from 'svelte';\n\timport { Circle } from 'svelte-loading-spinners';\n\timport Chart from 'chart.js/auto';\n\n\timport { getGlobalStats } from '../util/api';\n\n\timport { GLOBAL_STATS_DATA } from '../stores.js';\n\n\tlet isLoaded = false;\n\n\tlet tab = null;\n\n\tlet globalStatsData;\n\tGLOBAL_STATS_DATA.subscribe(val => globalStatsData = val);\n\n\tlet chart;\n\n\tonMount(async() => {\n\t\tconst initialDataJobs = [\n\t\t\tgetGlobalStats(),\n\t\t];\n\n\t\ttry {\n\t\t\tconst results = await Promise.allSettled(initialDataJobs);\n\t\t\t\n\t\t\tconst [\n\t\t\t\t{ value: globalStatsResult }\n\t\t\t] = results;\n\n\t\t\tGLOBAL_STATS_DATA.update(() => globalStatsResult);\n\t\t} catch(e) {\n\t\t\tconsole.error(e);\n\t\t\tisErrorDuringLoad = true;\n\t\t}\tfinally {\n\t\t\tisLoaded = true;\n\t\t}\n\t});\n</script>\n\n<div>\n\t{#if isLoaded}\n\t\t<div>\n\t\t\t<span\n\t\t\t\tstyle=\"cursor: pointer\"\n\t\t\t\ton:click={() => {\n\t\t\t\t\ttab = 'walk distance';\n\t\t\t\t\tchart?.destroy();\n\t\t\t\t\tchart = new Chart(document.getElementById('testChart'), {\n\t\t\t\t\t\ttype: 'bar',\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tlabels: ['Mean', 'Median', 'Total'],\n\t\t\t\t\t\t\tdatasets: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tlabel: 'Distance in miles',\n\t\t\t\t\t\t\t\t\tdata: [(globalStatsData.meanWalkDistance / 1609).toFixed(2), (globalStatsData.medianWalkDistance / 1609).toFixed(2), (globalStatsData.totalDistance / 1609).toFixed(2)]\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t},\n\t\t\t\t\t\toptions: {\n\t\t\t\t\t\t\tscales: {\n\t\t\t\t\t\t\t\ty: {\n\t\t\t\t\t\t\t\t\ttype: 'logarithmic',\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}}\n\t\t\t>Walk distance</span>\n\t\t\t|\n\t\t\t<span\n\t\t\t\ton:click={() => {\n\t\t\t\t\ttab = 'towns';\n\t\t\t\t\tconst data = Object.keys(globalStatsData.towns).reduce((acc, state) => {\n\t\t\t\t\t\tconst townsInState = Object.keys(globalStatsData.towns[state]);\n\t\t\t\t\t\ttownsInState.forEach(town => acc[`${town}, ${state}`] =  globalStatsData.towns[state][town] );\n\t\t\t\t\t\treturn acc;\n\t\t\t\t\t}, {});\n\t\t\t\t\tchart?.destroy();\n\t\t\t\t\tchart = new Chart(document.getElementById('testChart'), {\n\t\t\t\t\t\ttype: 'pie',\n\t\t\t\t\t\tdata: {\n\t\t\t\t\t\t\tlabels: Object.keys(data),\n\t\t\t\t\t\t\tdatasets: [\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tlabel: 'Town',\n\t\t\t\t\t\t\t\t\tdata: Object.values(data)\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t]\n\t\t\t\t\t\t},\n\t\t\t\t\t});\n\t\t\t\t}}\n\t\t\t\tstyle=\"cursor: pointer\">Towns</span>\n\t\t</div>\n\t\t{#if tab === 'walk distance'}\n\t\t\t<div style=\"width: 540px; margin-top: 3em\">\n\t\t\t\tSummary across {globalStatsData.totalWalks} walks\n\t\t\t</div>\n\t\t{:else if tab === 'towns'}\n\t\t\t<div style=\"width: 540px; margin-top: 3em\">\n\t\t\t\tSummary across {globalStatsData.totalWalks} walks\n\t\t\t</div>\n\t\t{/if}\n\t\t<canvas style={isLoaded ? 'opacity: 1' : 'opacity: 0'} id=\"testChart\"></canvas>\n\t{:else}\n\t\t<div style=\"position: absolute; left: 50%; top: 50%\">\n\t\t\t<Circle />\n\t\t</div>\n\t{/if}\n</div>\n\n<style>\n\n</style>","<script>\r\n\timport { onMount } from 'svelte';\r\n\timport { Circle } from 'svelte-loading-spinners';\r\n\r\n\timport ErrorMessage from './components/ErrorMessage.svelte';\r\n\r\n\timport Calendar from './views/Calendar.svelte';\r\n\timport Stats from './views/Stats.svelte';\r\n\r\n\timport { EVENTS_DATA, ORIGINAL_ROUTES_DATA, SUNX_DATA } from './stores.js';\r\n\r\n\timport { getEvents, getGit, getSunx } from './util/api';\r\n\timport { getPaddedDateString } from './util/date';\r\n\timport { storeJwt, getJwt } from './util/jwt';\r\n\r\n\tconst PAGES = { CALENDAR: 'CALENDAR', STATS: 'STATS' };\r\n\r\n\tlet page = localStorage.getItem('page');\r\n\tif (page === null) {\r\n\t\tpage = PAGES.CALENDAR;\r\n\t\tlocalStorage.setItem('page', page);\r\n\t}\r\n\r\n\tlet isLoaded = false;\r\n\tlet isErrorDuringLoad = false;\r\n\tlet gitHashes = {};\r\n\r\n\tonMount(async() => {\r\n\t\tstoreJwt();\r\n\r\n\t\tconst dateStr = getPaddedDateString(new Date());\r\n\r\n\t\tconst tomorrowDate = new Date();\r\n\t\ttomorrowDate.setDate(tomorrowDate.getDate() + 1);\r\n\t\tconst tomorrowDateStr = getPaddedDateString(tomorrowDate);\r\n\r\n\t\tconst today = new Date();\r\n\t\tconst todayYearAndMonth = `${today.getFullYear()}-${(today.getMonth() + 1).toString().padStart(2, '0')}`;\r\n\r\n\t\tconst initialDataJobs = [\r\n\t\t\tgetEvents(todayYearAndMonth),\r\n\t\t\tgetGit(),\r\n\t\t\tgetSunx(dateStr),\r\n\t\t\tgetSunx(tomorrowDateStr),\r\n\t\t];\r\n\r\n\t\ttry {\r\n\t\t\tconst results = await Promise.allSettled(initialDataJobs);\r\n\t\t\t\r\n\t\t\tconst [\r\n\t\t\t\t{ value: eventsDataResult },\r\n\t\t\t\t{ value: gitResult },\r\n\t\t\t\t{ value: { results: sunxTodayResult } },\r\n\t\t\t\t{ value: { results: sunxTomorrowResult } },\r\n\t\t\t] = results;\r\n\r\n\t\t\tgitHashes = gitResult;\r\n\t\t\tEVENTS_DATA.update(() => eventsDataResult);\r\n\t\t\tSUNX_DATA.update(() => ({ today: sunxTodayResult, tomorrow: sunxTomorrowResult }));\r\n\t\t} catch(e) {\r\n\t\t\tconsole.error(e);\r\n\t\t\tisErrorDuringLoad = true;\r\n\t\t}\tfinally {\r\n\t\t\tisLoaded = true;\r\n\t\t}\r\n\t});\r\n\r\n\tlet originalRoutesData;\r\n\tORIGINAL_ROUTES_DATA.subscribe(data => originalRoutesData = data);\r\n</script>\r\n\r\n<svelte:window on:keydown={({ altKey, code, shiftKey }) => {\r\n\tif (getJwt() && originalRoutesData && altKey && shiftKey && code === 'KeyT') {\r\n\t\tconst encodedRouteData = encodeURIComponent(JSON.stringify(originalRoutesData));\r\n\t\twindow.open(`https://geojson.io/#data=data:application/json,${encodedRouteData}`, '_blank', 'noopener');\r\n\t}\r\n}} />\r\n\r\n<div id=\"container-app\">\r\n\t{#if isLoaded}\r\n\t\t{#if isErrorDuringLoad}\r\n\t\t\t<ErrorMessage />\r\n\t\t{:else}\r\n\t\t\t{#if page === PAGES.CALENDAR}\r\n\t\t\t\t<Calendar />\r\n\t\t\t{:else if page === PAGES.STATS}\r\n\t\t\t\t<Stats />\r\n\t\t\t{/if}\r\n\t\t{/if}\r\n\r\n\t\t<div style=\"position: absolute; top: 1em; border: 0; margin: 0; color: white\">\r\n\t\t\t<span\r\n\t\t\t\ton:click={() => { page = PAGES.CALENDAR; localStorage.setItem('page', page); }}\r\n\t\t\t\tstyle={'cursor: pointer' + (page === PAGES.CALENDAR ? '; font-weight: bold' : '')}\r\n\t\t\t>\r\n\t\t\t\tCalendar\r\n\t\t\t</span>\r\n\t\t\t|\r\n\t\t\t<span\r\n\t\t\t\ton:click={() => { page = PAGES.STATS; localStorage.setItem('page', page); }}\r\n\t\t\t\tstyle={'cursor: pointer' + (page === PAGES.STATS ? '; font-weight: bold' : '')}\r\n\t\t\t>\r\n\t\t\t\tStats\r\n\t\t\t</span>\r\n\t\t</div>\r\n\t{:else}\r\n\t\t<div style=\"position: absolute\">\r\n\t\t\t<Circle />\r\n\t\t</div>\r\n\t{/if}\r\n</div>\r\n\r\n<style>\r\n\t@media (prefers-color-scheme: dark) {\r\n\t\t\t#container-app {\r\n\t\t\t\tbackground-color: rgb(32, 32, 32);\r\n\t\t\t\tcolor: white;\r\n\t\t\t}\r\n\t}\r\n\r\n\t@media (prefers-color-scheme: light) {\r\n\t\t\t#container-app {\r\n\t\t\t\tbackground-color: rgb(224, 244, 244);\r\n\t\t\t\tcolor: black;\r\n\t\t\t}\r\n\t}\r\n\r\n\t#container-app {\r\n\t\talign-items: center;\r\n\t\tdisplay: flex;\r\n\t\tflex-direction: column;\r\n\t\tjustify-content: center;\r\n\t\ttext-align: center;\r\n\r\n\t\theight: 100%;\r\n\t\twidth: 100%;\r\n\r\n\t\tposition: relative;\r\n\t}\r\n</style>\r\n","import App from './App.svelte';\n\nvar app = new App({\n\ttarget: document.body\n});\n\nexport default app;"],"names":["noop","identity","x","run","fn","blank_object","Object","create","run_all","fns","forEach","is_function","thing","safe_not_equal","a","b","null_to_empty","value","is_client","window","now","performance","Date","raf","cb","requestAnimationFrame","tasks","Set","run_tasks","task","c","delete","f","size","globals","globalThis","global","append","target","node","appendChild","get_root_for_style","document","root","getRootNode","ownerDocument","host","append_empty_stylesheet","style_element","element","style","head","sheet","append_stylesheet","insert","anchor","insertBefore","detach","parentNode","removeChild","destroy_each","iterations","detaching","i","length","d","name","createElement","text","data","createTextNode","space","listen","event","handler","options","addEventListener","removeEventListener","attr","attribute","removeAttribute","getAttribute","setAttribute","set_data","set_style","key","important","removeProperty","setProperty","toggle_class","toggle","classList","managed_styles","Map","current_component","active","create_rule","duration","delay","ease","uid","step","keyframes","p","t","rule","str","hash","charCodeAt","doc","stylesheet","rules","get","info","set","create_style_information","insertRule","cssRules","animation","delete_rule","previous","split","next","filter","anim","indexOf","deleted","join","ownerNode","clear","set_current_component","component","onMount","Error","get_current_component","$$","on_mount","push","dirty_components","binding_callbacks","render_callbacks","flush_callbacks","resolved_promise","Promise","resolve","update_scheduled","add_render_callback","seen_callbacks","promise","flushidx","flush","saved_component","update","e","pop","callback","has","add","fragment","before_update","dirty","ctx","after_update","dispatch","direction","kind","dispatchEvent","type","detail","bubbles","cancelable","createEvent","initCustomEvent","custom_event","outroing","outros","group_outros","r","check_outros","transition_in","block","local","transition_out","o","null_transition","create_bidirectional_transition","params","intro","config","running_program","pending_program","animation_name","clear_animation","init","program","Math","abs","start","end","group","go","easing","tick","css","fulfill","loop","then","create_component","mount_component","customElement","m","new_on_destroy","map","on_destroy","destroy_component","filtered","targets","flush_render_callbacks","make_dirty","fill","instance","create_fragment","not_equal","props","append_styles","parent_component","bound","on_disconnect","context","callbacks","skip_bound","ready","ret","rest","hydrate","nodes","Array","from","childNodes","children","l","SvelteComponent","$destroy","this","$on","index","splice","$set","$$props","obj","$$set","keys","div","color","unit","pause","br","button","location","reload","subscriber_queue","writable","stop","subscribers","new_value","run_queue","subscriber","subscribe","invalidate","EVENTS_DATA","EVENTS_DATA_IN_PROGRESS","ORIGINAL_ROUTES_DATA","SUNX_DATA","GLOBAL_STATS_DATA","fade","linear","getComputedStyle","opacity","baseApiUrl","tokenStorageKey","getJwt","localStorage","getItem","getApiOptions","headers","accessToken","Authorization","withAcceptCsv","Accept","async","getEvents","q","fetch","res","reduce","acc","cur","idx","arr","joinedKeys","curPieces","newEntry","slice","val","JSON","parse","getGit","json","getSunx","date","getGlobalStats","firstMonth","hiddenStyle","t0_value","getFullYear","getMonth","create_if_block_3","create_if_block_2","create_if_block_1","create_if_block","div4","div0","div2","div1","div3","current","t0","t4","t4_value","isEarliestMonth","shouldHideLeftLeftButton","shouldHideRightRightButton","currentMonth","currentMonthData","monthNames","realMonth","isRealMonth","currentMonthTotalDistance","updateEvents","month","toString","padStart","monthEvents","parseInt","$$invalidate","monthDistanceInMeters","monthTotal","curDay","distance","toFixed","s","h","w","y","ms","String","match","exec","n","parseFloat","toLowerCase","isFinite","long","msAbs","plural","fmtLong","round","fmtShort","stringify","isPlural","common","env","createDebug","namespace","prevTime","namespacesCache","enabledCache","enableOverride","debug","args","enabled","self","curr","Number","diff","prev","coerce","unshift","replace","format","formatter","formatters","call","formatArgs","log","apply","useColors","selectColor","extend","destroy","defineProperty","enumerable","configurable","namespaces","v","delimiter","newDebug","matchesTemplate","search","template","searchIndex","templateIndex","starIndex","matchIndex","default","stack","message","disable","names","skips","enable","save","trim","Boolean","ns","skip","humanize","require$$0","console","warn","colors","load","exports","module","lastC","storage","setItem","removeItem","error","process","DEBUG","__nwjs","navigator","userAgent","documentElement","WebkitAppearance","firebug","exception","table","localstorage","warned","j","canvas","thumbnailWidth","thumbnailHeight","imageFadeTime","getRandomWithMax","max","floor","random","newImageInterval","imageCells","intervalRef","imageCountX","imageCountY","lastFrameTime","allVideoIds","thumbnailCache","isTabInFocus","lastPausedTime","populateImageGridCellLastLog","darkModeColor","lightModeColor","backgroundColor","matchMedia","matches","populateImageArray","calendarContainer","querySelector","calendarBoundingRect","getBoundingClientRect","initImageCountX","initImageCountY","innerWidth","marginX","innerHeight","marginY","posX","posY","isHidden","left","right","isPointInside","inX","inY","draw","ts","getTime","dt","getElementById","getContext","fillStyle","fillRect","width","height","restore","curCell","image","timeLeft","drawImage","alpha","videoId","populateImageGridCell","candidates","flat","cell","availableVideoIds","includes","vidId","blob","imgData","createImageBitmap","getBitmapForThumbnail","clearInterval","setInterval","setupCanvas","hit","find","open","padNumber","getPaddedDateString","getDate","getPaddedTimeString","getHours","getMinutes","getSeconds","child_ctx","constants_2","constants_3","constants_5","constants_6","constants_7","constants_8","isEmptyDay","isFutureDay","isFuturePaddingDay","isPendingDay","isTomorrow","isWalkDay","constants_11","h5","t_value","a_href_value","youtubeId","if_block","if_block0","create_if_block_5","create_if_block_4","currentDate","firstDayOffset","daysInMonth","sunxData","eventsDataInProgress","todaySunrise","today","sunrise","todaySunset","sunset","tomorrowSunrise","tomorrow","isPastTodaySunrise","didWalkToday","dayData","classes","some","userAgentData","mobile","undefined","humanMonthNumber","eventsData","tempHumanMonthNumber","getDay","toAdd","newCurrentMonthData","searchPattern","RegExp","corresponding","getCurrentMonthData","lim","min","p2b","n2b","b2n","n2p","map$1","A","B","C","D","E","F","hex","h1","h2","eq","hexString","g","isShort","HUE_RE","hsl2rgbn","k","hsv2rgbn","hwb2rgbn","rgb","rgb2hsl","hueValue","calln","isArray","hsl2rgb","hue","hueParse","p1","p2","hwb2rgb","hsv2rgb","Z","Y","X","W","V","U","T","S","R","Q","P","O","N","M","L","K","G","H","I","J","names$1","OiceXe","antiquewEte","aqua","aquamarRe","azuY","beige","bisque","black","blanKedOmond","Xe","XeviTet","bPwn","burlywood","caMtXe","KartYuse","KocTate","cSO","cSnflowerXe","cSnsilk","crimson","cyan","xXe","xcyan","xgTMnPd","xWay","xgYF","xgYy","xkhaki","xmagFta","xTivegYF","xSange","xScEd","xYd","xsOmon","xsHgYF","xUXe","xUWay","xUgYy","xQe","xviTet","dAppRk","dApskyXe","dimWay","dimgYy","dodgerXe","fiYbrick","flSOwEte","foYstWAn","fuKsia","gaRsbSo","ghostwEte","gTd","gTMnPd","Way","gYF","gYFLw","gYy","honeyMw","hotpRk","RdianYd","Rdigo","ivSy","khaki","lavFMr","lavFMrXsh","lawngYF","NmoncEffon","ZXe","ZcSO","Zcyan","ZgTMnPdLw","ZWay","ZgYF","ZgYy","ZpRk","ZsOmon","ZsHgYF","ZskyXe","ZUWay","ZUgYy","ZstAlXe","ZLw","lime","limegYF","lRF","magFta","maPon","VaquamarRe","VXe","VScEd","VpurpN","VsHgYF","VUXe","VsprRggYF","VQe","VviTetYd","midnightXe","mRtcYam","mistyPse","moccasR","navajowEte","navy","Tdlace","Tive","TivedBb","Sange","SangeYd","ScEd","pOegTMnPd","pOegYF","pOeQe","pOeviTetYd","papayawEp","pHKpuff","peru","pRk","plum","powMrXe","purpN","YbeccapurpN","Yd","Psybrown","PyOXe","saddNbPwn","sOmon","sandybPwn","sHgYF","sHshell","siFna","silver","skyXe","UXe","UWay","UgYy","snow","sprRggYF","stAlXe","tan","teO","tEstN","tomato","Qe","viTet","JHt","wEte","wEtesmoke","Lw","LwgYF","nameParse","unpacked","tkeys","ok","nk","unpack","transparent","RGB_RE","to","pow","modHSL","ratio","tmp","clone","proto","assign","fromObject","input","functionParse","charAt","rgbParse","Color","constructor","len","_rgb","_valid","valid","rgbString","hslString","mix","weight","c1","c2","w2","w1","interpolate","rgb1","rgb2","clearer","greyscale","opaquer","negate","lighten","darken","saturate","desaturate","rotate","deg","id","isNullOrUndef","prototype","isObject","isNumberFinite","finiteOrDefault","defaultValue","valueOrDefault","toDimension","dimension","endsWith","thisArg","each","loopable","reverse","_elementsEqual","a0","a1","ilen","v0","v1","datasetIndex","source","klen","isValidKey","_merger","tval","sval","merge","sources","merger","mergeIf","_mergerIf","hasOwnProperty","keyResolvers","resolveObjectKey","resolver","parts","part","_splitKey","_getKeyResolver","_capitalize","toUpperCase","defined","isFunction","setsEqual","item","PI","TAU","PITAU","INFINITY","POSITIVE_INFINITY","RAD_PER_DEG","HALF_PI","QUARTER_PI","TWO_THIRDS_PI","log10","sign","almostEquals","epsilon","niceNum","range","roundedRange","niceRange","fraction","isNumber","Symbol","toPrimitive","isNonPrimitive","isNaN","_setMinAndMaxByKey","array","property","toRadians","degrees","toDegrees","radians","_decimalPlaces","getAngleFromPoint","centrePoint","anglePoint","distanceFromXCenter","distanceFromYCenter","radialDistanceFromCenter","sqrt","angle","atan2","distanceBetweenPoints","pt1","pt2","_angleDiff","_normalizeAngle","_angleBetween","sameAngleIsFullCircle","angleToStart","angleToEnd","startToAngle","endToAngle","_limitValue","_isBetween","_lookup","cmp","mid","hi","lo","_lookupByKey","last","ti","_rlookupByKey","arrayEvents","unlistenArrayEvents","listener","stub","_chartjs","listeners","_arrayUnique","items","requestAnimFrame","throttled","argsToUse","ticking","_toLeftRightCenter","align","_alignStartEnd","_getStartAndCountOfVisiblePoints","meta","points","animationsDisabled","pointCount","count","_sorted","iScale","vScale","_parsed","spanGaps","dataset","axis","minDefined","maxDefined","getUserBounds","getPixelForValue","distanceToDefinedLo","findIndex","point","distanceToDefinedHi","_scaleRangesChanged","xScale","yScale","_scaleRanges","newRanges","xmin","xmax","ymin","ymax","changed","atEdge","elasticIn","sin","elasticOut","effects","easeInQuad","easeOutQuad","easeInOutQuad","easeInCubic","easeOutCubic","easeInOutCubic","easeInQuart","easeOutQuart","easeInOutQuart","easeInQuint","easeOutQuint","easeInOutQuint","easeInSine","cos","easeOutSine","easeInOutSine","easeInExpo","easeOutExpo","easeInOutExpo","easeInCirc","easeOutCirc","easeInOutCirc","easeInElastic","easeOutElastic","easeInOutElastic","easeInBack","easeOutBack","easeInOutBack","easeInBounce","easeOutBounce","easeInOutBounce","isPatternOrGradient","getHoverColor","numbers","intlCache","formatNumber","num","locale","cacheKey","Intl","NumberFormat","getNumberFormat","values","numeric","tickValue","ticks","chart","notation","delta","maxTick","calculateDelta","logDelta","numDecimal","minimumFractionDigits","maximumFractionDigits","logarithmic","remain","significand","Ticks","overrides","descriptors","getScope$1","scope","Defaults","_descriptors","_appliers","borderColor","datasets","devicePixelRatio","platform","getDevicePixelRatio","elements","events","font","family","lineHeight","hover","hoverBackgroundColor","hoverBorderColor","hoverColor","indexAxis","interaction","mode","intersect","includeInvisible","maintainAspectRatio","onHover","onClick","parsing","plugins","responsive","scale","scales","showLine","drawActiveElementsOnTop","describe","override","route","targetScope","targetName","scopeObject","targetScopeObject","privateName","defineProperties","appliers","defaults","_scriptable","startsWith","_indexable","_fallback","properties","resize","show","animations","visible","hide","autoPadding","padding","top","bottom","display","offset","beginAtZero","bounds","clip","grace","grid","lineWidth","drawOnChartArea","drawTicks","tickLength","tickWidth","_ctx","tickColor","border","dash","dashOffset","title","minRotation","maxRotation","mirror","textStrokeWidth","textStrokeColor","autoSkip","autoSkipPadding","labelOffset","minor","major","crossAlign","showLabelBackdrop","backdropColor","backdropPadding","_measureText","gc","longest","string","textWidth","measureText","_longestText","arrayOfThings","cache","garbageCollect","jlen","nestedThing","gcLen","_alignPixel","pixel","currentDevicePixelRatio","halfWidth","clearCanvas","resetTransform","clearRect","drawPoint","drawPointLegend","xOffset","yOffset","cornerRadius","xOffsetW","yOffsetW","pointStyle","rotation","radius","rad","translate","beginPath","ellipse","arc","closePath","moveTo","lineTo","SQRT1_2","rect","borderWidth","stroke","_isPointInArea","area","margin","clipArea","unclipArea","_steppedLineTo","flip","midpoint","_bezierCurveTo","bezierCurveTo","cp1x","cp2x","cp1y","cp2y","decorateText","line","opts","strikethrough","underline","metrics","actualBoundingBoxLeft","actualBoundingBoxRight","actualBoundingBoxAscent","actualBoundingBoxDescent","yDecoration","strokeStyle","decorationWidth","drawBackdrop","oldColor","renderText","lines","strokeWidth","strokeColor","translation","textAlign","textBaseline","setRenderOpts","backdrop","strokeText","maxWidth","fillText","addRoundedRectPath","topLeft","bottomLeft","bottomRight","topRight","LINE_HEIGHT","FONT_STYLE","toLineHeight","_readValueToProps","objProps","read","prop","toTRBL","toTRBLCorners","toPadding","toFont","fallback","toFontString","inputs","cacheable","createContext","parentContext","_createResolver","scopes","prefixes","rootScopes","getTarget","finalRootScopes","_resolve","toStringTag","_cacheable","_scopes","_rootScopes","_getTarget","Proxy","deleteProperty","_keys","_cached","proxy","prefix","readKey","needsSubResolver","createSubResolver","_resolveWithPrefixes","getOwnPropertyDescriptor","Reflect","getPrototypeOf","getKeysFromAllScopes","ownKeys","_storage","_attachContext","subProxy","descriptorDefaults","_proxy","_context","_subProxy","_stack","setContext","receiver","isScriptable","getValue","_resolveScriptable","isIndexable","_resolveArray","_resolveWithContext","allKeys","scriptable","indexable","_allKeys","resolveFallback","getScope","parent","addScopes","parentScopes","parentFallback","allScopes","addScopesFromKey","subGetTarget","resolveKeysFromAllScopes","_parseObjectDataRadialScale","_parsing","parsed","EPSILON","getPoint","getValueAxis","splineCurve","firstPoint","middlePoint","afterPoint","d01","d12","s01","s12","fa","fb","splineCurveMonotone","valueAxis","pointsLen","deltaK","mK","pointBefore","pointCurrent","pointAfter","slopeDelta","alphaK","betaK","tauK","squaredMagnitude","monotoneAdjust","iPixel","vPixel","monotoneCompute","capControlPoint","pt","_updateBezierControlPoints","controlPoints","cubicInterpolationMode","tension","capBezierPoints","inArea","inAreaPrev","inAreaNext","_isDomSupported","_getParentNode","domNode","parseMaxStyle","styleValue","parentProperty","valueInPixels","defaultView","positions","getPositionedStyle","styles","suffix","result","pos","getRelativePosition","borderBox","boxSizing","paddings","borders","box","touches","offsetX","offsetY","shadowRoot","useOffsetPos","clientX","clientY","getCanvasPosition","round1","getMaximumSize","bbWidth","bbHeight","aspectRatio","margins","maxHeight","containerSize","container","containerStyle","containerBorder","containerPadding","clientWidth","clientHeight","getContainerSize","retinaScale","forceRatio","forceStyle","pixelRatio","deviceHeight","deviceWidth","setTransform","supportsEventListenerOptions","passiveSupported","passive","readUsedSize","el","getPropertyValue","getStyle","_pointInLine","_steppedInterpolation","_bezierInterpolation","cp1","cp2","getRtlAdapter","rtl","rectX","setWidth","xPlus","leftForLtr","itemWidth","getRightToLeftAdapter","_itemWidth","overrideTextDirection","original","getPropertyPriority","prevTextDirection","restoreTextDirection","propertyFn","between","compare","normalize","normalizeSegment","_boundSegment","segment","startBound","endBound","getSegment","prevValue","inside","subStart","shouldStart","shouldStop","_boundSegments","segments","sub","splitByStyles","segmentOptions","chartContext","_chart","baseStyle","readStyle","_datasetIndex","prevStyle","addStyle","st","dir","p0","p0DataIndex","p1DataIndex","styleChanged","doSplitByStyles","borderCapStyle","borderDash","borderDashOffset","borderJoinStyle","replacer","Animator","_request","_charts","_running","_lastDate","_notify","anims","numSteps","initial","currentStep","_refresh","_update","remaining","running","_active","_total","_getAnims","charts","complete","progress","_duration","cancel","remove","animator","interpolators","boolean","factor","c0","number","Animation","cfg","currentValue","_fn","_easing","_start","_loop","_target","_prop","_from","_to","_promises","elapsed","wait","promises","rej","resolved","method","Animations","_properties","configure","animationOptions","animatedProps","getOwnPropertyNames","option","_animateOptions","newOptions","$shared","$animations","resolveTargetOptions","_createAnimations","all","awaitAll","scaleClip","allowedOverflow","getSortedDatasetIndices","filterVisible","metasets","_getSortedDatasetMetas","applyStack","dsIndex","singleMode","otherValue","found","isStacked","stacked","getOrCreateStack","stacks","stackKey","indexValue","subStack","getLastIndexInStack","positive","getMatchingVisibleMetas","updateStacks","controller","_cachedMeta","_stacks","iAxis","vAxis","indexScale","valueScale","getStackKey","_top","_bottom","_visualValues","getFirstScaleId","shift","clearStacks","isDirectUpdateMode","cloneIfNotShared","cached","shared","DatasetController","static","_cachedDataOpts","getMeta","_type","_data","_objectData","_sharedOptions","_drawStart","_drawCount","enableOptionSharing","supportsDecimation","$context","_syncList","datasetElementType","dataElementType","initialize","linkScales","_stacked","addElements","isPluginEnabled","updateIndex","getDataset","chooseId","xid","xAxisID","yid","yAxisID","rid","rAxisID","iid","iAxisID","vid","vAxisID","getScaleForId","rScale","getDatasetMeta","scaleID","_getOtherScale","reset","_destroy","_dataCheck","iAxisKey","vAxisKey","adata","convertObjectDataToArray","isExtensible","base","object","buildOrUpdateElements","resetNewElements","stackChanged","oldStacked","_resyncElements","scopeKeys","datasetScopeKeys","getOptionScopes","createResolver","sorted","parseArrayData","parseObjectData","parsePrimitiveData","isNotInOrderComparedToPrev","labels","getLabels","singleScale","xAxisKey","yAxisKey","getParsed","getDataElement","updateRangeFromParsed","parsedValue","NaN","getMinMax","canStack","otherScale","hidden","createStack","NEGATIVE_INFINITY","otherMin","otherMax","_skip","getAllParsedValues","getMaxOverflow","getLabelAndValue","label","getLabelForValue","_clip","disabled","toClip","defaultClip","chartArea","resolveDatasetElementOptions","resolveDataElementOptions","dataIndex","raw","createDataContext","createDatasetContext","_resolveElementOptions","elementType","sharing","datasetElementScopeKeys","resolveNamedOptions","freeze","_resolveAnimations","transition","datasetAnimationScopeKeys","getSharedOptions","includeOptions","sharedOptions","_animationsDisabled","_getSharedOptions","firstOpts","previouslySharedOptions","updateSharedOptions","updateElement","_setStyle","removeHoverStyle","setHoverStyle","_removeDatasetHoverStyle","_setDatasetHoverStyle","arg1","arg2","numMeta","numData","_insertElements","_removeElements","move","updateElements","removed","_sync","_dataChanges","_onDataPush","arguments","_onDataPop","_onDataShift","_onDataSplice","newCount","_onDataUnshift","computeMinSampleSize","_cache","$bar","visibleMetas","concat","sort","getAllScaleValues","_length","updateMinAndPrev","getPixelForTick","parseValue","entry","startValue","endValue","barStart","barEnd","_custom","parseFloatBar","parseArrayOrPrimitive","isFloatBar","custom","setBorderSkipped","edge","borderSkipped","horizontal","borderProps","enableBorderRadius","parseEdge","orig","v2","startEnd","setInflateAmount","inflateAmount","DoughnutController","animateRotate","animateScale","cutout","circumference","spacing","legend","generateLabels","fontColor","getDataVisibility","legendItem","toggleDataVisibility","super","innerRadius","outerRadius","getter","_getRotation","_getCircumference","_getRotationExtents","isDatasetVisible","arcs","getMaxBorderWidth","getMaxOffset","maxSize","chartWeight","_getRingWeight","ratioX","ratioY","startAngle","endAngle","startX","startY","endX","endY","calcMax","calcMin","maxX","maxY","minX","minY","getRatioAndOffset","maxRadius","radiusLength","_getVisibleDatasetWeightTotal","total","calculateTotal","_getRingWeightOffset","_circumference","calculateCircumference","animationOpts","centerX","centerY","metaData","borderAlign","hoverBorderWidth","hoverOffset","ringWeightOffset","PolarAreaController","angleLines","circular","pointLabels","bind","_updateRadius","minSize","cutoutPercentage","getVisibleDatasetCount","xCenter","yCenter","datasetStartAngle","getIndexAngle","defaultAngle","countVisibleElements","_computeAngle","getDistanceFromCenterForValue","controllers","__proto__","BarController","categoryPercentage","barPercentage","grouped","_index_","_value_","bars","getBasePixel","isHorizontal","ruler","_getRuler","vpixels","_calculateBarValuePixels","ipixels","_calculateBarIndexPixels","center","_getStacks","currentParsed","iScaleValue","skipNull","_getStackCount","_getStackIndex","pixels","barThickness","_startPixel","_endPixel","stackCount","baseValue","minBarLength","actualBase","floating","barSign","startPixel","getPixelForDecimal","endPixel","getValueForPixel","halfGrid","getLineWidthForValue","maxBarThickness","Infinity","percent","chunk","computeFlexCategoryTraits","thickness","computeFitCategoryTraits","stackIndex","rects","BubbleController","LineController","_dataset","_decimated","animated","maxGapLength","directUpdate","pointsCount","prevParsed","nullData","lastPoint","updateControlPoints","PieController","RadarController","_fullLoop","pointPosition","getPointPositionForValue","ScatterController","registry","getElement","abstract","DateAdapterBase","members","formats","startOf","endOf","adapters","binarySearch","metaset","lookupMethod","_reversePixels","getRange","evaluateInteractionItems","position","getSortedVisibleDatasetMetas","getIntersectItems","useFinalPosition","isPointInArea","inRange","getNearestCartesianItems","distanceMetric","useX","useY","deltaX","deltaY","getDistanceMetricForAxis","minDistance","getCenterPoint","getNearestItems","getProps","getNearestRadialItems","getAxisItems","rangeMethod","intersectsItem","Interaction","modes","nearest","STATIC_POSITIONS","filterByPosition","filterDynamicPositionByAxis","sortByWeight","setLayoutDims","layouts","wrap","stackWeight","placed","buildStacks","vBoxMaxWidth","hBoxMaxHeight","layout","fullSize","availableWidth","availableHeight","getCombinedMax","maxPadding","updateMaxPadding","boxPadding","updateDims","getPadding","newWidth","outerWidth","newHeight","outerHeight","widthChanged","heightChanged","same","other","getMargins","marginForPositions","fitBoxes","boxes","refitBoxes","refit","setBoxDims","placeBoxes","userPadding","addBox","_layers","z","removeBox","layoutItem","minPadding","layoutBoxes","wrapBoxes","centerHorizontal","centerVertical","leftAndTop","rightAndBottom","vertical","buildLayoutBoxes","verticalBoxes","horizontalBoxes","beforeLayout","visibleVerticalBoxCount","updatePos","change","handleMaxPadding","BasePlatform","acquireContext","releaseContext","isAttached","updateConfig","BasicPlatform","EXPANDO_KEY","EVENT_TYPES","touchstart","touchmove","touchend","pointerenter","pointerdown","pointermove","pointerup","pointerleave","pointerout","isNullOrEmpty","eventListenerOptions","removeListener","nodeListContains","nodeList","contains","createAttachObserver","observer","MutationObserver","entries","trigger","addedNodes","removedNodes","observe","childList","subtree","createDetachObserver","drpListeningCharts","oldDevicePixelRatio","onWindowResize","dpr","createResizeObserver","ResizeObserver","contentRect","listenDevicePixelRatioChanges","releaseObserver","disconnect","unlistenDevicePixelRatioChanges","createProxyAndListen","native","fromNativeEvent","addListener","DomPlatform","renderHeight","renderWidth","displayWidth","displayHeight","initCanvas","proxies","$proxies","attach","isConnected","Element","tooltipPosition","hasValue","final","tickOpts","determinedMaxTicks","_tickSize","maxScale","maxChart","_maxLength","determineMaxTicks","ticksLimit","maxTicksLimit","majorIndices","getMajorIndices","numMajorIndices","first","newTicks","ceil","skipMajors","evenMajorSpacing","getEvenSpacing","factors","_factorize","calculateSpacing","avgMajorSpacing","majorStart","majorEnd","offsetFromEdge","getTicksLimit","ticksLength","sample","numItems","increment","getPixelForGridLine","offsetGridLines","validIndex","lineValue","getTickMarkLength","getTitleHeight","titleAlign","reverseAlign","Scale","_margins","paddingTop","paddingBottom","paddingLeft","paddingRight","labelRotation","_range","_gridLineItems","_labelItems","_labelSizes","_longestTextCache","_userMax","_userMin","_suggestedMax","_suggestedMin","_ticksLength","_borderValue","_dataLimitsCached","suggestedMin","suggestedMax","metas","getTicks","xLabels","yLabels","getLabelItems","_computeLabelItems","beforeUpdate","sampleSize","beforeSetDimensions","setDimensions","afterSetDimensions","beforeDataLimits","determineDataLimits","afterDataLimits","minmax","keepZero","_addGrace","beforeBuildTicks","buildTicks","afterBuildTicks","samplingEnabled","_convertTicksToLabels","beforeCalculateLabelRotation","calculateLabelRotation","afterCalculateLabelRotation","afterAutoSkip","beforeFit","fit","afterFit","afterUpdate","reversePixels","_alignToPixels","alignToPixels","_callHooks","notifyPlugins","beforeTickToLabelConversion","generateTickLabels","afterTickToLabelConversion","numTicks","maxLabelDiagonal","_isVisible","labelSizes","_getLabelSizes","maxLabelWidth","widest","maxLabelHeight","highest","asin","titleOpts","gridOpts","titleHeight","tickPadding","angleRadians","labelHeight","labelWidth","_calculatePadding","_handleMargins","isRotated","labelsBelowTicks","offsetLeft","offsetRight","isFullSize","_computeLabelSizes","caches","widths","heights","tickFont","fontString","nestedLabel","widestLabelSize","highestLabelSize","_resolveTickFontOptions","valueAt","decimal","getDecimalForPixel","getBaseValue","createTickContext","optionTicks","rot","_computeGridLineItems","tl","borderOpts","axisWidth","axisHalfWidth","alignBorderValue","borderValue","alignedLineValue","tx1","ty1","tx2","ty2","x1","y1","x2","y2","positionAxisID","limit","optsAtIndex","optsAtIndexBorder","lineColor","tickBorderDash","tickBorderDashOffset","tickAndPadding","hTickAndPadding","lineCount","textOffset","_getXAxisLabelAlignment","_getYAxisLabelAlignment","halfCount","tickTextAlign","labelPadding","_computeLabelArea","drawBackground","drawGrid","drawLine","setLineDash","lineDashOffset","drawBorder","lastLineWidth","drawLabels","renderTextOptions","drawTitle","titleX","titleY","titleArgs","tz","gz","bz","axisID","_maxDigits","fontSize","TypedRegistry","isForType","isPrototypeOf","register","parentScope","isIChartComponent","itemDefaults","defaultRoutes","routes","propertyParts","sourceName","sourceScope","routeDefaults","registerDefaults","unregister","Registry","_typedRegistries","_each","addControllers","addPlugins","addScales","getController","_get","getPlugin","getScale","removeControllers","removeElements","removePlugins","removeScales","typedRegistry","arg","reg","_getRegistryForType","_exec","itemReg","camelMethod","PluginService","_init","notify","hook","_createDescriptors","descriptor","plugin","_oldCache","_notifyStateChanges","localIds","allPlugins","getOpts","pluginOpts","createDescriptors","previousDescriptors","pluginScopeKeys","getIndexAxis","datasetDefaults","idMatchesAxis","determineAxis","scaleOptions","getAxisFromDataset","mergeScaleConfig","chartDefaults","configScales","chartIndexAxis","scaleConf","boundDs","retrieveAxisFromDatasets","defaultId","getDefaultScaleIDFromAxis","defaultScaleOptions","defaultID","getAxisFromDefaultScaleID","initOptions","initData","keyCache","keysCached","cachedKeys","generate","addIfFound","Config","_config","initConfig","_scopeCache","_resolverCache","clearCache","datasetType","additionalOptionScopes","_cachedScopes","mainScope","resetCache","keyLists","chartOptionScopes","subPrefixes","getResolver","hasFunction","needContext","resolverCache","KNOWN_POSITIONS","positionIsHorizontal","compare2Level","l1","l2","onAnimationsComplete","onComplete","onAnimationProgress","onProgress","getCanvas","instances","getChart","moveNumericKeys","intKey","getSizeForArea","field","Chart","invalidatePlugins","userConfig","initialCanvas","existingChart","OffscreenCanvas","_detectPlatform","_options","_aspectRatio","_metasets","_lastEvent","_listeners","_responsiveListeners","_sortedMetasets","_plugins","_hiddenIndices","attached","_doResize","timeout","clearTimeout","setTimeout","debounce","resizeDelay","_initialize","bindEvents","_resizeBeforeDraw","_resize","newSize","newRatio","onResize","render","ensureScalesHaveIDs","axisOptions","buildOrUpdateScales","scaleOpts","updated","isRadial","dposition","dtype","scaleType","hasUpdated","_updateMetasets","_destroyDatasetMeta","_removeUnreferencedMetasets","buildOrUpdateControllers","newControllers","order","ControllerClass","_resetElements","animsDisabled","_updateScales","_checkEventBindings","_updateHiddenIndices","_minPadding","_updateLayout","_updateDatasets","_eventHandler","_updateHoverStyles","existingEvents","newEvents","unbindEvents","changes","_getUniformDataChanges","datasetCount","makeSet","changeSet","noArea","_idx","_updateDataset","layers","_drawDatasets","_drawDataset","useClip","getDatasetArea","getElementsAtEventForMode","setDatasetVisibility","_updateVisibility","_stop","toBase64Image","toDataURL","bindUserEvents","bindResponsiveEvents","_add","_remove","detached","updateHoverStyle","getActiveElements","setActiveElements","activeElements","lastActive","pluginId","replay","hoverOptions","deactivated","activated","inChartArea","eventFilter","_handleEvent","_getActiveElements","isClick","_isClickEvent","lastEvent","determineLastEvent","parseBorderRadius$1","angleDelta","borderRadius","halfThickness","innerLimit","computeOuterLimit","outerArcLimit","outerStart","outerEnd","innerStart","innerEnd","rThetaToXY","theta","pathArc","pixelMargin","innerR","spacingOffset","avNogSpacingRadius","angleOffset","outerStartAdjustedRadius","outerEndAdjustedRadius","outerStartAdjustedAngle","outerEndAdjustedAngle","innerStartAdjustedRadius","innerEndAdjustedRadius","innerStartAdjustedAngle","innerEndAdjustedAngle","outerMidAdjustedAngle","pCenter","p4","innerMidAdjustedAngle","p8","outerStartX","outerStartY","outerEndX","outerEndY","fullCircles","inner","lineJoin","angleMargin","clipArc","setStyle","lineCap","pathVars","paramsStart","paramsEnd","segmentStart","segmentEnd","outside","pathSegment","lineMethod","stepped","getLineMethod","fastPathSegment","prevX","lastY","avgX","countX","pointIndex","drawX","truncX","_getSegmentMethod","usePath2D","Path2D","path","_path","strokePathWithCache","segmentMethod","strokePathDirect","LineElement","_points","_segments","_pointsUpdated","findStartAndEnd","solidSegments","_computeSegments","_interpolate","_getInterpolationMethod","interpolated","inRange$1","hitRadius","getBarBounds","bar","half","skipOrLimit","boundingRects","maxW","maxH","parseBorderWidth","maxR","enableBorder","parseBorderRadius","outer","skipX","skipY","addNormalRectPath","inflateRect","amount","refRect","ArcElement","chartX","chartY","rAdjust","nonZeroBetween","betweenAngles","withinRadius","halfAngle","halfRadius","radiusOffset","drawArc","BarElement","addRectPath","mouseX","mouseY","inXRange","inYRange","PointElement","hoverRadius","BORDER_COLORS","BACKGROUND_COLORS","getBorderColor","getBackgroundColor","getColorizer","colorizeDoughnutDataset","colorizePolarAreaDataset","colorizeDefaultDataset","containsColorsDefinitions","plugin_colors","forceOverride","_args","chartOptions","containsColorDefenition","colorizer","cleanDecimatedDataset","cleanDecimatedData","plugin_decimation","algorithm","beforeElementsUpdate","xAxis","getStartAndCountOfVisiblePointsSimplified","threshold","decimated","samples","bucketWidth","sampledIndex","endIndex","maxAreaPoint","maxArea","nextA","avgY","avgRangeStart","avgRangeEnd","avgRangeLength","rangeOffs","rangeTo","pointAx","pointAy","lttbDecimation","minIndex","maxIndex","startIndex","xMin","dx","lastIndex","intermediateIndex1","intermediateIndex2","minMaxDecimation","_getBounds","_findSegmentEnd","_getEdge","_createBoundaryLine","boundary","linePoints","_pointsFromSegments","_shouldApplyFill","_resolveTarget","propagate","visited","_decodeFill","fillOption","parseFillOption","firstCh","decodeTargetIndex","addPointsBelow","sourcePoint","linesBelow","postponed","findPoint","pointValue","firstValue","lastValue","simpleArc","getLineByIndex","sourcePoints","below","getLinesBelow","_buildStackLine","_getTargetValue","computeCircularBoundary","_getTargetPixel","computeLinearBoundary","computeBoundary","_drawfill","lineOpts","above","clipVertical","doFill","clipY","lineLoop","tpoints","targetSegments","tgt","subBounds","fillSources","fillSource","src","notShape","clipBounds","interpolatedLineTo","targetLoop","interpolatedPoint","afterDatasetsUpdate","$filler","beforeDraw","drawTime","beforeDatasetsDraw","beforeDatasetDraw","getBoxSize","labelOpts","boxHeight","boxWidth","usePointStyle","pointStyleWidth","itemHeight","Legend","_added","legendHitBoxes","_hoveredItem","doughnutMode","legendItems","columnSizes","lineWidths","buildLabels","labelFont","_computeTitleHeight","_fitRows","_fitCols","hitboxes","totalHeight","row","_itemHeight","heightLimit","totalWidth","currentColWidth","currentColHeight","col","legendItemText","calculateItemWidth","fontLineHeight","calculateLegendItemHeight","calculateItemHeight","calculateItemSize","adjustHitBoxes","rtlHelper","hitbox","_draw","defaultColor","halfFontSize","cursor","textDirection","lineDash","drawOptions","SQRT2","yBoxTop","xBoxLeft","drawLegendBox","_textX","titleFont","titlePadding","topPaddingPlusHalfFontSize","_getLegendItemAt","hitBox","lh","handleEvent","onLeave","isListened","hoveredItem","sameItem","plugin_legend","_element","afterEvent","ci","useBorderRadius","Title","_padding","textSize","_drawArgs","fontOpts","plugin_title","titleBlock","createTitle","WeakMap","plugin_subtitle","positioners","average","xSet","eventPosition","nearestElement","tp","pushOrConcat","toPush","splitNewlines","createTooltipItem","formattedValue","getTooltipSize","tooltip","body","footer","bodyFont","footerFont","titleLineCount","footerLineCount","bodyLineItemCount","combinedBodyLength","bodyItem","before","after","beforeBody","afterBody","titleSpacing","titleMarginBottom","displayColors","bodySpacing","footerMarginTop","footerSpacing","widthPadding","maxLineWidth","determineXAlign","yAlign","chartWidth","xAlign","caret","caretSize","caretPadding","doesNotFitWithAlign","determineAlignment","determineYAlign","getBackgroundPoint","alignment","paddingAndSize","alignX","alignY","getAlignedX","getBeforeAfterBodyLines","overrideCallbacks","defaultCallbacks","beforeTitle","tooltipItems","labelCount","afterTitle","beforeLabel","tooltipItem","labelColor","labelTextColor","bodyColor","labelPointStyle","afterLabel","beforeFooter","afterFooter","invokeCallbackWithFallback","Tooltip","_eventPosition","_size","_cachedAnimations","_tooltipItems","dataPoints","caretX","caretY","labelColors","labelPointStyles","labelTextColors","getTitle","getBeforeBody","getBody","bodyItems","scoped","getAfterBody","getFooter","_createItems","itemSort","positionAndSize","backgroundPoint","external","drawCaret","tooltipPoint","caretPosition","getCaretPosition","x3","y3","ptX","ptY","titleColor","_drawColorBox","colorX","rtlColorX","yOffSet","colorY","multiKeyBackground","outerX","innerX","strokeRect","drawBody","bodyAlign","bodyLineHeight","xLinePadding","fillLineOfText","bodyAlignForCalculation","textColor","drawFooter","footerAlign","footerColor","tooltipSize","quadraticCurveTo","_updateAnimationTarget","animX","animY","_willRender","hasTooltipContent","globalAlpha","positionChanged","_positionChanged","_ignoreReplayEvents","plugin_tooltip","afterInit","afterDraw","Colors","Decimation","Filler","SubTitle","findOrAddLabel","addedLabels","addIfString","lastIndexOf","_getLabelForValue","generateTicks$1","generationOptions","dataRange","precision","maxTicks","maxDigits","includeBounds","maxSpaces","rmin","rmax","countDefined","minSpacing","niceMin","niceMax","numSpaces","rounded","almostWhole","decimalPlaces","relativeLabelSize","LinearScaleBase","_startValue","_endValue","_valueRange","handleTickRangeOptions","setMin","setMax","minSign","maxSign","getTickLimit","stepSize","computeTickLimit","LinearScale","log10Floor","changeExponent","isMajor","tickVal","steps","rangeExp","rangeStep","generateTicks","minExp","exp","startExp","lastTick","LogarithmicScale","_zero","getTickBackdropHeight","determineLimits","fitWithPointLabels","limits","valueCount","_pointLabels","pointLabelOpts","additionalAngle","centerPointLabels","getPointLabelContext","getPointPosition","drawingArea","plFont","updateLimits","setCenterPoint","_pointLabelItems","itemOpts","extra","createPointLabelItem","isNotOverlapped","buildPointLabelItems","hLimits","vLimits","outerDistance","pointLabelPosition","yForAngle","getTextAlignForAngle","leftForTextAlign","drawPointLabelBox","backdropLeft","backdropTop","backdropWidth","backdropHeight","pathRadiusLine","RadialLinearScale","animate","leftMovement","rightMovement","topMovement","bottomMovement","scalingFactor","getValueForDistanceFromCenter","scaledDistance","pointLabel","createPointLabelContext","distanceFromCenter","getBasePosition","getPointLabelPosition","drawPointLabels","gridLineOpts","drawRadiusLine","INTERVALS","millisecond","second","minute","hour","day","week","quarter","year","UNITS","sorter","adapter","_adapter","parser","isoWeekday","_parseOpts","determineUnitForAutoTicks","minUnit","capacity","interval","MAX_SAFE_INTEGER","addTick","time","timestamps","ticksFromTimestamps","majorUnit","setMajorTicks","TimeScale","displayFormats","_unit","_majorUnit","_offsets","_normalized","normalized","_applyBounds","_getLabelBounds","getLabelTimestamps","timeOpts","_generate","_filterBetween","_getLabelCapacity","determineUnitForFormatting","determineMajorUnit","initOffsets","offsetAfterAutoskip","getDecimalForValue","weekday","hasWeekday","getDataTimestamps","tooltipFormat","datetime","fmt","_tickFormatFunction","minorFormat","majorFormat","offsets","_getLabelSize","ticksOpts","tickLabelWidth","cosRotation","sinRotation","tickFontSize","exampleTime","exampleLabel","prevSource","nextSource","prevTarget","nextTarget","span","CategoryScale","_addedLabels","added","TimeSeriesScale","_table","_minPos","_tableRange","_getTimestampsForTable","buildLookupTable","registerables","span0","span1","t1_value","totalWalks","t1","globalStatsData","isLoaded","tab","initialDataJobs","results","allSettled","globalStatsResult","isErrorDuringLoad","meanWalkDistance","medianWalkDistance","totalDistance","towns","state","town","CALENDAR","STATS","span0_style_value","span1_style_value","PAGES","page","originalRoutesData","gitHashes","history","pushState","storeJwt","dateStr","tomorrowDate","setDate","tomorrowDateStr","eventsDataResult","gitResult","sunxTodayResult","sunxTomorrowResult","altKey","code","shiftKey","encodedRouteData","encodeURIComponent"],"mappings":"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"}