<canvas id="myChart" width="300" height="300"></canvas>
<script>
    $(document).ready(function() {
        var count = 10;
        var data = {
            labels: ["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"],
            datasets: [{
                    fillColor: "rgba(220,220,220,0.5)",
                    strokeColor: "rgba(220,220,220,1)",
                    pointColor: "rgba(220,220,220,1)",
                    pointStrokeColor: "#fff",
                    data: [65, 59, 90, 81, 56, 45, 30, 20, 3, 37]
                },
                {
                    fillColor: "rgba(151,187,205,0.5)",
                    strokeColor: "rgba(151,187,205,1)",
                    pointColor: "rgba(151,187,205,1)",
                    pointStrokeColor: "#fff",
                    data: [28, 48, 40, 19, 96, 87, 66, 97, 92, 85]
                }
            ]
        }
        // this is ugly, don't judge me
        var updateData = function(oldData) {
            var labels = oldData["labels"];
            var dataSetA = oldData["datasets"][0]["data"];
            var dataSetB = oldData["datasets"][1]["data"];

            labels.shift();
            count++;
            labels.push(count.toString());
            var newDataA = dataSetA[9] + (20 - Math.floor(Math.random() * (41)));
            var newDataB = dataSetB[9] + (20 - Math.floor(Math.random() * (41)));
            dataSetA.push(newDataA);
            dataSetB.push(newDataB);
            dataSetA.shift();
            dataSetB.shift();
        };

        var optionsAnimation = {
            //Boolean - If we want to override with a hard coded scale
            scaleOverride: true,
            //** Required if scaleOverride is true **
            //Number - The number of steps in a hard coded scale
            scaleSteps: 10,
            //Number - The value jump in the hard coded scale
            scaleStepWidth: 10,
            //Number - The scale starting value
            scaleStartValue: 0
        }

        // Not sure why the scaleOverride isn't working...
        var optionsNoAnimation = {
            animation: false,
            //Boolean - If we want to override with a hard coded scale
            scaleOverride: true,
            //** Required if scaleOverride is true **
            //Number - The number of steps in a hard coded scale
            scaleSteps: 20,
            //Number - The value jump in the hard coded scale
            scaleStepWidth: 10,
            //Number - The scale starting value
            scaleStartValue: 0
        }

        //Get the context of the canvas element we want to select
        var ctx = document.getElementById("myChart").getContext("2d");
        var optionsNoAnimation = {
            animation: false
        }
        var myNewChart = new Chart(ctx);
        myNewChart.Line(data, optionsAnimation);

        setInterval(function() {
            updateData(data);
            myNewChart.Line(data, optionsNoAnimation);
        }, 2000);
    });


    // ChartJS
    var Chart = function(s) {
        function v(a, c, b) {
            a = A((a - c.graphMin) / (c.steps * c.stepValue), 1, 0);
            return b * c.steps * a
        }

        function x(a, c, b, e) {
            function h() {
                g += f;
                var k = a.animation ? A(d(g), null, 0) : 1;
                e.clearRect(0, 0, q, u);
                a.scaleOverlay ? (b(k), c()) : (c(), b(k));
                if (1 >= g) D(h);
                else if ("function" == typeof a.onAnimationComplete) a.onAnimationComplete()
            }
            var f = a.animation ? 1 / A(a.animationSteps, Number.MAX_VALUE, 1) : 1,
                d = B[a.animationEasing],
                g = a.animation ? 0 : 1;
            "function" !== typeof c && (c = function() {});
            D(h)
        }

        function C(a, c, b, e, h, f) {
            var d;
            a =
                Math.floor(Math.log(e - h) / Math.LN10);
            h = Math.floor(h / (1 * Math.pow(10, a))) * Math.pow(10, a);
            e = Math.ceil(e / (1 * Math.pow(10, a))) * Math.pow(10, a) - h;
            a = Math.pow(10, a);
            for (d = Math.round(e / a); d < b || d > c;) a = d < b ? a / 2 : 2 * a, d = Math.round(e / a);
            c = [];
            z(f, c, d, h, a);
            return {
                steps: d,
                stepValue: a,
                graphMin: h,
                labels: c
            }
        }

        function z(a, c, b, e, h) {
            if (a)
                for (var f = 1; f < b + 1; f++) c.push(E(a, {
                    value: (e + h * f).toFixed(0 != h % 1 ? h.toString().split(".")[1].length : 0)
                }))
        }

        function A(a, c, b) {
            return !isNaN(parseFloat(c)) && isFinite(c) && a > c ? c : !isNaN(parseFloat(b)) &&
                isFinite(b) && a < b ? b : a
        }

        function y(a, c) {
            var b = {},
                e;
            for (e in a) b[e] = a[e];
            for (e in c) b[e] = c[e];
            return b
        }

        function E(a, c) {
            var b = !/\W/.test(a) ? F[a] = F[a] || E(document.getElementById(a).innerHTML) : new Function("obj", "var p=[],print=function(){p.push.apply(p,arguments);};with(obj){p.push('" + a.replace(/[\r\t\n]/g, " ").split(" <%").join("\t").replace(/((^|%>)[^\t]*)'/g, "$1\r").replace(/\t=(.*?)%>/g, "',$1,'").split("\t").join("');").split("%>").join("p.push('").split("\r").join("\\'") + "');}return p.join('');");
            return c ?
                b(c) : b
        }
        var r = this,
            B = {
                linear: function(a) {
                    return a
                },
                easeInQuad: function(a) {
                    return a * a
                },
                easeOutQuad: function(a) {
                    return -1 * a * (a - 2)
                },
                easeInOutQuad: function(a) {
                    return 1 > (a /= 0.5) ? 0.5 * a * a : -0.5 * (--a * (a - 2) - 1)
                },
                easeInCubic: function(a) {
                    return a * a * a
                },
                easeOutCubic: function(a) {
                    return 1 * ((a = a / 1 - 1) * a * a + 1)
                },
                easeInOutCubic: function(a) {
                    return 1 > (a /= 0.5) ? 0.5 * a * a * a : 0.5 * ((a -= 2) * a * a + 2)
                },
                easeInQuart: function(a) {
                    return a * a * a * a
                },
                easeOutQuart: function(a) {
                    return -1 * ((a = a / 1 - 1) * a * a * a - 1)
                },
                easeInOutQuart: function(a) {
                    return 1 > (a /= 0.5) ?
                        0.5 * a * a * a * a : -0.5 * ((a -= 2) * a * a * a - 2)
                },
                easeInQuint: function(a) {
                    return 1 * (a /= 1) * a * a * a * a
                },
                easeOutQuint: function(a) {
                    return 1 * ((a = a / 1 - 1) * a * a * a * a + 1)
                },
                easeInOutQuint: function(a) {
                    return 1 > (a /= 0.5) ? 0.5 * a * a * a * a * a : 0.5 * ((a -= 2) * a * a * a * a + 2)
                },
                easeInSine: function(a) {
                    return -1 * Math.cos(a / 1 * (Math.PI / 2)) + 1
                },
                easeOutSine: function(a) {
                    return 1 * Math.sin(a / 1 * (Math.PI / 2))
                },
                easeInOutSine: function(a) {
                    return -0.5 * (Math.cos(Math.PI * a / 1) - 1)
                },
                easeInExpo: function(a) {
                    return 0 == a ? 1 : 1 * Math.pow(2, 10 * (a / 1 - 1))
                },
                easeOutExpo: function(a) {
                    return 1 ==
                        a ? 1 : 1 * (-Math.pow(2, -10 * a / 1) + 1)
                },
                easeInOutExpo: function(a) {
                    return 0 == a ? 0 : 1 == a ? 1 : 1 > (a /= 0.5) ? 0.5 * Math.pow(2, 10 * (a - 1)) : 0.5 * (-Math.pow(2, -10 * --a) + 2)
                },
                easeInCirc: function(a) {
                    return 1 <= a ? a : -1 * (Math.sqrt(1 - (a /= 1) * a) - 1)
                },
                easeOutCirc: function(a) {
                    return 1 * Math.sqrt(1 - (a = a / 1 - 1) * a)
                },
                easeInOutCirc: function(a) {
                    return 1 > (a /= 0.5) ? -0.5 * (Math.sqrt(1 - a * a) - 1) : 0.5 * (Math.sqrt(1 - (a -= 2) * a) + 1)
                },
                easeInElastic: function(a) {
                    var c = 1.70158,
                        b = 0,
                        e = 1;
                    if (0 == a) return 0;
                    if (1 == (a /= 1)) return 1;
                    b || (b = 0.3);
                    e < Math.abs(1) ? (e = 1, c = b / 4) : c = b / (2 * Math.PI) * Math.asin(1 / e);
                    return -(e * Math.pow(2, 10 * (a -= 1)) * Math.sin((1 * a - c) * 2 * Math.PI / b))
                },
                easeOutElastic: function(a) {
                    var c = 1.70158,
                        b = 0,
                        e = 1;
                    if (0 == a) return 0;
                    if (1 == (a /= 1)) return 1;
                    b || (b = 0.3);
                    e < Math.abs(1) ? (e = 1, c = b / 4) : c = b / (2 * Math.PI) * Math.asin(1 / e);
                    return e * Math.pow(2, -10 * a) * Math.sin((1 * a - c) * 2 * Math.PI / b) + 1
                },
                easeInOutElastic: function(a) {
                    var c = 1.70158,
                        b = 0,
                        e = 1;
                    if (0 == a) return 0;
                    if (2 == (a /= 0.5)) return 1;
                    b || (b = 1 * 0.3 * 1.5);
                    e < Math.abs(1) ? (e = 1, c = b / 4) : c = b / (2 * Math.PI) * Math.asin(1 / e);
                    return 1 > a ? -0.5 * e * Math.pow(2, 10 *
                        (a -= 1)) * Math.sin((1 * a - c) * 2 * Math.PI / b) : 0.5 * e * Math.pow(2, -10 * (a -= 1)) * Math.sin((1 * a - c) * 2 * Math.PI / b) + 1
                },
                easeInBack: function(a) {
                    return 1 * (a /= 1) * a * (2.70158 * a - 1.70158)
                },
                easeOutBack: function(a) {
                    return 1 * ((a = a / 1 - 1) * a * (2.70158 * a + 1.70158) + 1)
                },
                easeInOutBack: function(a) {
                    var c = 1.70158;
                    return 1 > (a /= 0.5) ? 0.5 * a * a * (((c *= 1.525) + 1) * a - c) : 0.5 * ((a -= 2) * a * (((c *= 1.525) + 1) * a + c) + 2)
                },
                easeInBounce: function(a) {
                    return 1 - B.easeOutBounce(1 - a)
                },
                easeOutBounce: function(a) {
                    return (a /= 1) < 1 / 2.75 ? 1 * 7.5625 * a * a : a < 2 / 2.75 ? 1 * (7.5625 * (a -= 1.5 / 2.75) * a + 0.75) : a < 2.5 / 2.75 ? 1 * (7.5625 * (a -= 2.25 / 2.75) * a + 0.9375) : 1 * (7.5625 * (a -= 2.625 / 2.75) * a + 0.984375)
                },
                easeInOutBounce: function(a) {
                    return 0.5 > a ? 0.5 * B.easeInBounce(2 * a) : 0.5 * B.easeOutBounce(2 * a - 1) + 0.5
                }
            },
            q = s.canvas.width,
            u = s.canvas.height;
        window.devicePixelRatio && (s.canvas.style.width = q + "px", s.canvas.style.height = u + "px", s.canvas.height = u * window.devicePixelRatio, s.canvas.width = q * window.devicePixelRatio, s.scale(window.devicePixelRatio, window.devicePixelRatio));
        this.PolarArea = function(a, c) {
            r.PolarArea.defaults = {
                scaleOverlay: !0,
                scaleOverride: !1,
                scaleSteps: null,
                scaleStepWidth: null,
                scaleStartValue: null,
                scaleShowLine: !0,
                scaleLineColor: "rgba(0,0,0,.1)",
                scaleLineWidth: 1,
                scaleShowLabels: !0,
                scaleLabel: "<%=value%>",
                scaleFontFamily: "'Arial'",
                scaleFontSize: 12,
                scaleFontStyle: "normal",
                scaleFontColor: "#666",
                scaleShowLabelBackdrop: !0,
                scaleBackdropColor: "rgba(255,255,255,0.75)",
                scaleBackdropPaddingY: 2,
                scaleBackdropPaddingX: 2,
                segmentShowStroke: !0,
                segmentStrokeColor: "#fff",
                segmentStrokeWidth: 2,
                animation: !0,
                animationSteps: 100,
                animationEasing: "easeOutBounce",
                animateRotate: !0,
                animateScale: !1,
                onAnimationComplete: null
            };
            var b = c ? y(r.PolarArea.defaults, c) : r.PolarArea.defaults;
            return new G(a, b, s)
        };
        this.Radar = function(a, c) {
            r.Radar.defaults = {
                scaleOverlay: !1,
                scaleOverride: !1,
                scaleSteps: null,
                scaleStepWidth: null,
                scaleStartValue: null,
                scaleShowLine: !0,
                scaleLineColor: "rgba(0,0,0,.1)",
                scaleLineWidth: 1,
                scaleShowLabels: !1,
                scaleLabel: "<%=value%>",
                scaleFontFamily: "'Arial'",
                scaleFontSize: 12,
                scaleFontStyle: "normal",
                scaleFontColor: "#666",
                scaleShowLabelBackdrop: !0,
                scaleBackdropColor: "rgba(255,255,255,0.75)",
                scaleBackdropPaddingY: 2,
                scaleBackdropPaddingX: 2,
                angleShowLineOut: !0,
                angleLineColor: "rgba(0,0,0,.1)",
                angleLineWidth: 1,
                pointLabelFontFamily: "'Arial'",
                pointLabelFontStyle: "normal",
                pointLabelFontSize: 12,
                pointLabelFontColor: "#666",
                pointDot: !0,
                pointDotRadius: 3,
                pointDotStrokeWidth: 1,
                datasetStroke: !0,
                datasetStrokeWidth: 2,
                datasetFill: !0,
                animation: !0,
                animationSteps: 60,
                animationEasing: "easeOutQuart",
                onAnimationComplete: null
            };
            var b = c ? y(r.Radar.defaults, c) : r.Radar.defaults;
            return new H(a, b, s)
        };
        this.Pie = function(a,
            c) {
            r.Pie.defaults = {
                segmentShowStroke: !0,
                segmentStrokeColor: "#fff",
                segmentStrokeWidth: 2,
                animation: !0,
                animationSteps: 100,
                animationEasing: "easeOutBounce",
                animateRotate: !0,
                animateScale: !1,
                onAnimationComplete: null
            };
            var b = c ? y(r.Pie.defaults, c) : r.Pie.defaults;
            return new I(a, b, s)
        };
        this.Doughnut = function(a, c) {
            r.Doughnut.defaults = {
                segmentShowStroke: !0,
                segmentStrokeColor: "#fff",
                segmentStrokeWidth: 2,
                percentageInnerCutout: 50,
                animation: !0,
                animationSteps: 100,
                animationEasing: "easeOutBounce",
                animateRotate: !0,
                animateScale: !1,
                onAnimationComplete: null
            };
            var b = c ? y(r.Doughnut.defaults, c) : r.Doughnut.defaults;
            return new J(a, b, s)
        };
        this.Line = function(a, c) {
            r.Line.defaults = {
                scaleOverlay: !1,
                scaleOverride: !1,
                scaleSteps: null,
                scaleStepWidth: null,
                scaleStartValue: null,
                scaleLineColor: "rgba(0,0,0,.1)",
                scaleLineWidth: 1,
                scaleShowLabels: !0,
                scaleLabel: "<%=value%>",
                scaleFontFamily: "'Arial'",
                scaleFontSize: 12,
                scaleFontStyle: "normal",
                scaleFontColor: "#666",
                scaleShowGridLines: !0,
                scaleGridLineColor: "rgba(0,0,0,.05)",
                scaleGridLineWidth: 1,
                bezierCurve: !0,
                pointDot: !0,
                pointDotRadius: 4,
                pointDotStrokeWidth: 2,
                datasetStroke: !0,
                datasetStrokeWidth: 2,
                datasetFill: !0,
                animation: !0,
                animationSteps: 60,
                animationEasing: "easeOutQuart",
                onAnimationComplete: null
            };
            var b = c ? y(r.Line.defaults, c) : r.Line.defaults;
            return new K(a, b, s)
        };
        this.Bar = function(a, c) {
            r.Bar.defaults = {
                scaleOverlay: !1,
                scaleOverride: !1,
                scaleSteps: null,
                scaleStepWidth: null,
                scaleStartValue: null,
                scaleLineColor: "rgba(0,0,0,.1)",
                scaleLineWidth: 1,
                scaleShowLabels: !0,
                scaleLabel: "<%=value%>",
                scaleFontFamily: "'Arial'",
                scaleFontSize: 12,
                scaleFontStyle: "normal",
                scaleFontColor: "#666",
                scaleShowGridLines: !0,
                scaleGridLineColor: "rgba(0,0,0,.05)",
                scaleGridLineWidth: 1,
                barShowStroke: !0,
                barStrokeWidth: 2,
                barValueSpacing: 5,
                barDatasetSpacing: 1,
                animation: !0,
                animationSteps: 60,
                animationEasing: "easeOutQuart",
                onAnimationComplete: null
            };
            var b = c ? y(r.Bar.defaults, c) : r.Bar.defaults;
            return new L(a, b, s)
        };
        var G = function(a, c, b) {
                var e, h, f, d, g, k, j, l, m;
                g = Math.min.apply(Math, [q, u]) / 2;
                g -= Math.max.apply(Math, [0.5 * c.scaleFontSize, 0.5 * c.scaleLineWidth]);
                d = 2 * c.scaleFontSize;
                c.scaleShowLabelBackdrop && (d += 2 * c.scaleBackdropPaddingY, g -= 1.5 * c.scaleBackdropPaddingY);
                l = g;
                d = d ? d : 5;
                e = Number.MIN_VALUE;
                h = Number.MAX_VALUE;
                for (f = 0; f < a.length; f++) a[f].value > e && (e = a[f].value), a[f].value < h && (h = a[f].value);
                f = Math.floor(l / (0.66 * d));
                d = Math.floor(0.5 * (l / d));
                m = c.scaleShowLabels ? c.scaleLabel : null;
                c.scaleOverride ? (j = {
                    steps: c.scaleSteps,
                    stepValue: c.scaleStepWidth,
                    graphMin: c.scaleStartValue,
                    labels: []
                }, z(m, j.labels, j.steps, c.scaleStartValue, c.scaleStepWidth)) : j = C(l, f, d, e, h, m);
                k = g / j.steps;
                x(c, function() {
                    for (var a = 0; a < j.steps; a++)
                        if (c.scaleShowLine && (b.beginPath(), b.arc(q / 2, u / 2, k * (a + 1), 0, 2 * Math.PI, !0), b.strokeStyle = c.scaleLineColor, b.lineWidth = c.scaleLineWidth, b.stroke()), c.scaleShowLabels) {
                            b.textAlign = "center";
                            b.font = c.scaleFontStyle + " " + c.scaleFontSize + " px " + c.scaleFontFamily;
                            var e = j.labels[a];
                            if (c.scaleShowLabelBackdrop) {
                                var d = b.measureText(e).width;
                                b.fillStyle = c.scaleBackdropColor;
                                b.beginPath();
                                b.rect(Math.round(q / 2 - d / 2 - c.scaleBackdropPaddingX), Math.round(u / 2 - k * (a +
                                    1) - 0.5 * c.scaleFontSize - c.scaleBackdropPaddingY), Math.round(d + 2 * c.scaleBackdropPaddingX), Math.round(c.scaleFontSize + 2 * c.scaleBackdropPaddingY));
                                b.fill()
                            }
                            b.textBaseline = " middle";
                            b.fillStyle = c.scaleFontColor;
                            b.fillText(e, q / 2, u / 2 - k * (a + 1))
                        }
                }, function(e) {
                    var d = -Math.PI / 2,
                        g = 2 * Math.PI / a.length,
                        f = 1,
                        h = 1;
                    c.animation && (c.animateScale && (f = e), c.animateRotate && (h = e));
                    for (e = 0; e < a.length; e++) b.beginPath(), b.arc(q / 2, u / 2, f * v(a[e].value, j, k), d, d + h * g, !1), b.lineTo(q / 2, u / 2), b.closePath(), b.fillStyle = a[e].color, b.fill(), c.segmentShowStroke && (b.strokeStyle = c.segmentStrokeColor, b.lineWidth = c.segmentStrokeWidth, b.stroke()), d += h * g
                }, b)
            },
            H = function(a, c, b) {
                var e, h, f, d, g, k, j, l, m;
                a.labels || (a.labels = []);
                g = Math.min.apply(Math, [q, u]) / 2;
                d = 2 * c.scaleFontSize;
                for (e = l = 0; e < a.labels.length; e++) b.font = c.pointLabelFontStyle + " " + c.pointLabelFontSize + " px " + c.pointLabelFontFamily, h = b.measureText(a.labels[e]).width, h > l && (l = h);
                g -= Math.max.apply(Math, [l, 1.5 * (c.pointLabelFontSize / 2)]);
                g -= c.pointLabelFontSize;
                l = g = A(g, null, 0);
                d = d ? d : 5;
                e = Number.MIN_VALUE;
                h = Number.MAX_VALUE;
                for (f = 0; f < a.datasets.length; f++)
                    for (m = 0; m < a.datasets[f].data.length; m++) a.datasets[f].data[m] > e && (e = a.datasets[f].data[m]), a.datasets[f].data[m] < h && (h = a.datasets[f].data[m]);
                f = Math.floor(l / (0.66 * d));
                d = Math.floor(0.5 * (l / d));
                m = c.scaleShowLabels ? c.scaleLabel : null;
                c.scaleOverride ? (j = {
                    steps: c.scaleSteps,
                    stepValue: c.scaleStepWidth,
                    graphMin: c.scaleStartValue,
                    labels: []
                }, z(m, j.labels, j.steps, c.scaleStartValue, c.scaleStepWidth)) : j = C(l, f, d, e, h, m);
                k = g / j.steps;
                x(c, function() {
                    var e = 2 * Math.PI /
                        a.datasets[0].data.length;
                    b.save();
                    b.translate(q / 2, u / 2);
                    if (c.angleShowLineOut) {
                        b.strokeStyle = c.angleLineColor;
                        b.lineWidth = c.angleLineWidth;
                        for (var d = 0; d < a.datasets[0].data.length; d++) b.rotate(e), b.beginPath(), b.moveTo(0, 0), b.lineTo(0, -g), b.stroke()
                    }
                    for (d = 0; d < j.steps; d++) {
                        b.beginPath();
                        if (c.scaleShowLine) {
                            b.strokeStyle = c.scaleLineColor;
                            b.lineWidth = c.scaleLineWidth;
                            b.moveTo(0, -k * (d + 1));
                            for (var f = 0; f < a.datasets[0].data.length; f++) b.rotate(e), b.lineTo(0, -k * (d + 1));
                            b.closePath();
                            b.stroke()
                        }
                        c.scaleShowLabels &&
                            (b.textAlign = " center", b.font = c.scaleFontStyle + " " + c.scaleFontSize + " px " + c.scaleFontFamily, b.textBaseline = " middle", c.scaleShowLabelBackdrop && (f = b.measureText(j.labels[d]).width, b.fillStyle = c.scaleBackdropColor, b.beginPath(), b.rect(Math.round(-f / 2 - c.scaleBackdropPaddingX), Math.round(-k * (d + 1) - 0.5 * c.scaleFontSize - c.scaleBackdropPaddingY), Math.round(f + 2 * c.scaleBackdropPaddingX), Math.round(c.scaleFontSize + 2 * c.scaleBackdropPaddingY)), b.fill()), b.fillStyle = c.scaleFontColor, b.fillText(j.labels[d], 0, -k * (d + 1)))
                    }
                    for (d = 0; d < a.labels.length; d++) {
                        b.font = c.pointLabelFontStyle + " " + c.pointLabelFontSize + " px " + c.pointLabelFontFamily;
                        b.fillStyle = c.pointLabelFontColor;
                        var f = Math.sin(e * d) * (g + c.pointLabelFontSize),
                            h = Math.cos(e * d) * (g + c.pointLabelFontSize);
                        b.textAlign = e * d == Math.PI || 0 == e * d ? " center" : e * d > Math.PI ? "right" : "left";
                        b.textBaseline = "middle";
                        b.fillText(a.labels[d], f, -h)
                    }
                    b.restore()
                }, function(d) {
                    var e = 2 * Math.PI / a.datasets[0].data.length;
                    b.save();
                    b.translate(q / 2, u / 2);
                    for (var g = 0; g < a.datasets.length; g++) {
                        b.beginPath();
                        b.moveTo(0, d * -1 * v(a.datasets[g].data[0], j, k));
                        for (var f = 1; f < a.datasets[g].data.length; f++) b.rotate(e), b.lineTo(0, d * -1 * v(a.datasets[g].data[f], j, k));
                        b.closePath();
                        b.fillStyle = a.datasets[g].fillColor;
                        b.strokeStyle = a.datasets[g].strokeColor;
                        b.lineWidth = c.datasetStrokeWidth;
                        b.fill();
                        b.stroke();
                        if (c.pointDot) {
                            b.fillStyle = a.datasets[g].pointColor;
                            b.strokeStyle = a.datasets[g].pointStrokeColor;
                            b.lineWidth = c.pointDotStrokeWidth;
                            for (f = 0; f < a.datasets[g].data.length; f++) b.rotate(e), b.beginPath(), b.arc(0, d * -1 * v(a.datasets[g].data[f], j, k), c.pointDotRadius, 2 * Math.PI, !1), b.fill(), b.stroke()
                        }
                        b.rotate(e)
                    }
                    b.restore()
                }, b)
            },
            I = function(a, c, b) {
                for (var e = 0, h = Math.min.apply(Math, [u / 2, q / 2]) - 5, f = 0; f < a.length; f++) e += a[f].value;
                x(c, null, function(d) {
                    var g = -Math.PI / 2,
                        f = 1,
                        j = 1;
                    c.animation && (c.animateScale && (f = d), c.animateRotate && (j = d));
                    for (d = 0; d < a.length; d++) {
                        var l = j * a[d].value / e * 2 * Math.PI;
                        b.beginPath();
                        b.arc(q / 2, u / 2, f * h, g, g + l);
                        b.lineTo(q / 2, u / 2);
                        b.closePath();
                        b.fillStyle = a[d].color;
                        b.fill();
                        c.segmentShowStroke && (b.lineWidth = c.segmentStrokeWidth, b.strokeStyle = c.segmentStrokeColor, b.stroke());
                        g += l
                    }
                }, b)
            },
            J = function(a, c, b) {
                for (var e = 0, h = Math.min.apply(Math, [u / 2, q / 2]) - 5, f = h * (c.percentageInnerCutout / 100), d = 0; d < a.length; d++) e += a[d].value;
                x(c, null, function(d) {
                    var k = -Math.PI / 2,
                        j = 1,
                        l = 1;
                    c.animation && (c.animateScale && (j = d), c.animateRotate && (l = d));
                    for (d = 0; d < a.length; d++) {
                        var m = l * a[d].value / e * 2 * Math.PI;
                        b.beginPath();
                        b.arc(q / 2, u / 2, j * h, k, k + m, !1);
                        b.arc(q / 2, u / 2, j * f, k + m, k, !0);
                        b.closePath();
                        b.fillStyle = a[d].color;
                        b.fill();
                        c.segmentShowStroke && (b.lineWidth = c.segmentStrokeWidth, b.strokeStyle = c.segmentStrokeColor, b.stroke());
                        k += m
                    }
                }, b)
            },
            K = function(a, c, b) {
                var e, h, f, d, g, k, j, l, m, t, r, n, p, s = 0;
                g = u;
                b.font = c.scaleFontStyle + " " + c.scaleFontSize + " px " + c.scaleFontFamily;
                t = 1;
                for (d = 0; d < a.labels.length; d++) e = b.measureText(a.labels[d]).width, t = e > t ? e : t;
                q / a.labels.length < t ? (s = 45, q / a.labels.length < Math.cos(s) * t ? (s = 90, g -= t) : g -= Math.sin(s) * t) : g -= c.scaleFontSize;
                d = c.scaleFontSize;
                g = g - 5 - d;
                e = Number.MIN_VALUE;
                h = Number.MAX_VALUE;
                for (f = 0; f < a.datasets.length; f++)
                    for (l =
                        0; l < a.datasets[f].data.length; l++) a.datasets[f].data[l] > e && (e = a.datasets[f].data[l]), a.datasets[f].data[l] < h && (h = a.datasets[f].data[l]);
                f = Math.floor(g / (0.66 * d));
                d = Math.floor(0.5 * (g / d));
                l = c.scaleShowLabels ? c.scaleLabel : "";
                c.scaleOverride ? (j = {
                    steps: c.scaleSteps,
                    stepValue: c.scaleStepWidth,
                    graphMin: c.scaleStartValue,
                    labels: []
                }, z(l, j.labels, j.steps, c.scaleStartValue, c.scaleStepWidth)) : j = C(g, f, d, e, h, l);
                k = Math.floor(g / j.steps);
                d = 1;
                if (c.scaleShowLabels) {
                    b.font = c.scaleFontStyle + " " + c.scaleFontSize + " px " + c.scaleFontFamily;
                    for (e = 0; e < j.labels.length; e++) h = b.measureText(j.labels[e]).width, d = h > d ? h : d;
                    d += 10
                }
                r = q - d - t;
                m = Math.floor(r / (a.labels.length - 1));
                n = q - t / 2 - r;
                p = g + c.scaleFontSize / 2;
                x(c, function() {
                    b.lineWidth = c.scaleLineWidth;
                    b.strokeStyle = c.scaleLineColor;
                    b.beginPath();
                    b.moveTo(q - t / 2 + 5, p);
                    b.lineTo(q - t / 2 - r - 5, p);
                    b.stroke();
                    0 < s ? (b.save(), b.textAlign = " right") : b.textAlign = "center";
                    b.fillStyle = c.scaleFontColor;
                    for (var d = 0; d < a.labels.length; d++) b.save(), 0 < s ? (b.translate(n + d * m, p + c.scaleFontSize), b.rotate(-(s * (Math.PI / 180))), b.fillText(a.labels[d], 0, 0), b.restore()) : b.fillText(a.labels[d], n + d * m, p + c.scaleFontSize + 3), b.beginPath(), b.moveTo(n + d * m, p + 3), c.scaleShowGridLines && 0 < d ? (b.lineWidth = c.scaleGridLineWidth, b.strokeStyle = c.scaleGridLineColor, b.lineTo(n + d * m, 5)) : b.lineTo(n + d * m, p + 3), b.stroke();
                    b.lineWidth = c.scaleLineWidth;
                    b.strokeStyle = c.scaleLineColor;
                    b.beginPath();
                    b.moveTo(n, p + 5);
                    b.lineTo(n, 5);
                    b.stroke();
                    b.textAlign = "right";
                    b.textBaseline = "middle";
                    for (d = 0; d < j.steps; d++) b.beginPath(), b.moveTo(n - 3, p - (d + 1) * k), c.scaleShowGridLines ? (b.lineWidth = c.scaleGridLineWidth, b.strokeStyle = c.scaleGridLineColor, b.lineTo(n + r + 5, p - (d + 1) * k)) : b.lineTo(n - 0.5, p - (d + 1) * k), b.stroke(), c.scaleShowLabels && b.fillText(j.labels[d], n - 8, p - (d + 1) * k)
                }, function(d) {
                    function e(b, c) {
                        return p - d * v(a.datasets[b].data[c], j, k)
                    }
                    for (var f = 0; f < a.datasets.length; f++) {
                        b.strokeStyle = a.datasets[f].strokeColor;
                        b.lineWidth = c.datasetStrokeWidth;
                        b.beginPath();
                        b.moveTo(n, p - d * v(a.datasets[f].data[0], j, k));
                        for (var g = 1; g < a.datasets[f].data.length; g++) c.bezierCurve ? b.bezierCurveTo(n + m * (g - 0.5), e(f, g - 1), n + m * (g - 0.5), e(f, g), n + m * g, e(f, g)) : b.lineTo(n + m * g, e(f, g));
                        b.stroke();
                        c.datasetFill ? (b.lineTo(n + m * (a.datasets[f].data.length - 1), p), b.lineTo(n, p), b.closePath(), b.fillStyle = a.datasets[f].fillColor, b.fill()) : b.closePath();
                        if (c.pointDot) {
                            b.fillStyle = a.datasets[f].pointColor;
                            b.strokeStyle = a.datasets[f].pointStrokeColor;
                            b.lineWidth = c.pointDotStrokeWidth;
                            for (g = 0; g < a.datasets[f].data.length; g++) b.beginPath(), b.arc(n + m * g, p - d * v(a.datasets[f].data[g], j, k), c.pointDotRadius, 0, 2 * Math.PI, !0), b.fill(), b.stroke()
                        }
                    }
                }, b)
            },
            L = function(a, c, b) {
                var e, h, f, d, g, k, j, l, m, t, r, n, p, s, w = 0;
                g = u;
                b.font = c.scaleFontStyle + " " + c.scaleFontSize + " px " + c.scaleFontFamily;
                t = 1;
                for (d = 0; d < a.labels.length; d++) e = b.measureText(a.labels[d]).width, t = e > t ? e : t;
                q / a.labels.length < t ? (w = 45, q / a.labels.length < Math.cos(w) * t ? (w = 90, g -= t) : g -= Math.sin(w) * t) : g -= c.scaleFontSize;
                d = c.scaleFontSize;
                g = g - 5 - d;
                e = Number.MIN_VALUE;
                h = Number.MAX_VALUE;
                for (f = 0; f < a.datasets.length; f++)
                    for (l = 0; l < a.datasets[f].data.length; l++) a.datasets[f].data[l] > e && (e = a.datasets[f].data[l]), a.datasets[f].data[l] <
                        h && (h = a.datasets[f].data[l]);
                f = Math.floor(g / (0.66 * d));
                d = Math.floor(0.5 * (g / d));
                l = c.scaleShowLabels ? c.scaleLabel : "";
                c.scaleOverride ? (j = {
                    steps: c.scaleSteps,
                    stepValue: c.scaleStepWidth,
                    graphMin: c.scaleStartValue,
                    labels: []
                }, z(l, j.labels, j.steps, c.scaleStartValue, c.scaleStepWidth)) : j = C(g, f, d, e, h, l);
                k = Math.floor(g / j.steps);
                d = 1;
                if (c.scaleShowLabels) {
                    b.font = c.scaleFontStyle + " " + c.scaleFontSize + " px " + c.scaleFontFamily;
                    for (e = 0; e < j.labels.length; e++) h = b.measureText(j.labels[e]).width, d = h > d ? h : d;
                    d += 10
                }
                r = q - d - t;
                m =
                    Math.floor(r / a.labels.length);
                s = (m - 2 * c.scaleGridLineWidth - 2 * c.barValueSpacing - (c.barDatasetSpacing * a.datasets.length - 1) - (c.barStrokeWidth / 2 * a.datasets.length - 1)) / a.datasets.length;
                n = q - t / 2 - r;
                p = g + c.scaleFontSize / 2;
                x(c, function() {
                    b.lineWidth = c.scaleLineWidth;
                    b.strokeStyle = c.scaleLineColor;
                    b.beginPath();
                    b.moveTo(q - t / 2 + 5, p);
                    b.lineTo(q - t / 2 - r - 5, p);
                    b.stroke();
                    0 < w ? (b.save(), b.textAlign = " right") : b.textAlign = "center";
                    b.fillStyle = c.scaleFontColor;
                    for (var d = 0; d < a.labels.length; d++) b.save(), 0 < w ? (b.translate(n + d * m, p + c.scaleFontSize), b.rotate(-(w * (Math.PI / 180))), b.fillText(a.labels[d], 0, 0), b.restore()) : b.fillText(a.labels[d], n + d * m + m / 2, p + c.scaleFontSize + 3), b.beginPath(), b.moveTo(n + (d + 1) * m, p + 3), b.lineWidth = c.scaleGridLineWidth, b.strokeStyle = c.scaleGridLineColor, b.lineTo(n + (d + 1) * m, 5), b.stroke();
                    b.lineWidth = c.scaleLineWidth;
                    b.strokeStyle = c.scaleLineColor;
                    b.beginPath();
                    b.moveTo(n, p + 5);
                    b.lineTo(n, 5);
                    b.stroke();
                    b.textAlign = "right";
                    b.textBaseline = "middle";
                    for (d = 0; d < j.steps; d++) b.beginPath(), b.moveTo(n - 3, p - (d + 1) * k), c.scaleShowGridLines ? (b.lineWidth = c.scaleGridLineWidth, b.strokeStyle = c.scaleGridLineColor, b.lineTo(n + r + 5, p - (d + 1) * k)) : b.lineTo(n - 0.5, p - (d + 1) * k), b.stroke(), c.scaleShowLabels && b.fillText(j.labels[d], n - 8, p - (d + 1) * k)
                }, function(d) {
                    b.lineWidth = c.barStrokeWidth;
                    for (var e = 0; e < a.datasets.length; e++) {
                        b.fillStyle = a.datasets[e].fillColor;
                        b.strokeStyle = a.datasets[e].strokeColor;
                        for (var f = 0; f < a.datasets[e].data.length; f++) {
                            var g = n + c.barValueSpacing + m * f + s * e + c.barDatasetSpacing * e + c.barStrokeWidth * e;
                            b.beginPath();
                            b.moveTo(g, p);
                            b.lineTo(g, p - d * v(a.datasets[e].data[f], j, k) + c.barStrokeWidth / 2);
                            b.lineTo(g + s, p - d * v(a.datasets[e].data[f], j, k) + c.barStrokeWidth / 2);
                            b.lineTo(g + s, p);
                            c.barShowStroke && b.stroke();
                            b.closePath();
                            b.fill()
                        }
                    }
                }, b)
            },
            D = window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function(a) {
                window.setTimeout(a, 1E3 / 60)
            },
            F = {}
    };
    HTML
</script>