diff options
author | Marvin Borner | 2019-05-07 18:59:17 +0200 |
---|---|---|
committer | Marvin Borner | 2019-05-07 18:59:17 +0200 |
commit | 94c2214b819c4fe75a479f37aaad99e90bfe5b63 (patch) | |
tree | ca25e4382a1ff5bcf59dc291e2d291eb7f4f8367 | |
parent | 5e94a7a562030f06994ca28a3615ec0cb3b7483a (diff) |
Almost completely overridden and overworked project
-rw-r--r--[-rwxr-xr-x] | .gitignore | 6 | ||||
-rwxr-xr-x | README.md | 15 | ||||
-rw-r--r-- | assets/css/grid.css | 852 | ||||
-rw-r--r-- | assets/css/main.css | 35 | ||||
-rw-r--r-- | assets/css/main.sass | 68 | ||||
-rw-r--r-- | assets/css/normalize.css | 549 | ||||
-rwxr-xr-x | assets/js/chart.js | 25053 | ||||
-rw-r--r-- | assets/js/d3.js | 10554 | ||||
-rw-r--r-- | assets/js/heatmap.js | 339 | ||||
-rwxr-xr-x | assets/js/jQuery.js | 3939 | ||||
-rwxr-xr-x | assets/js/main.js | 595 | ||||
-rw-r--r-- | assets/js/moment.js | 1 | ||||
-rwxr-xr-x | assets/php/getData.php | 46 | ||||
-rw-r--r-- | assets/php/getInformation.php | 17 | ||||
-rwxr-xr-x | assets/php/getNetflixJson.php | 34 | ||||
-rwxr-xr-x | index.html | 61 |
16 files changed, 19705 insertions, 22459 deletions
diff --git a/.gitignore b/.gitignore index cc47d6c..44474c4 100755..100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1 @@ -assets/js/ExampleData.js -assets/css/main.css -assets/css/main.css.map - -min
\ No newline at end of file + .idea @@ -1,3 +1,14 @@ # NetflixPersonalStats -This tool uses the unofficial private api of netflix in combination of the users cookie -to display cool graphs and information about your watching behavior.
\ No newline at end of file + +## Instructions +* Clone the GitHub Repository with `git clone https://github.com/marvinborner/NetFlixPersonalStats` +* Move into the directory and setup a local PHP Server (eg. with `php -S localhost:8080`) +* Get your Netflix cookie by + * visiting `https://www.netflix.com/WiViewingActivity` + * pressing `F12` (Developer Menu) + * moving to the `Network` Tab + * selecting the first entry in the left sidebar ("WiViewingActivity"") + * copying the **complete** String of the "Cookie:" information in the "request headers" part + (make sure it looks like `memclid=***; otherNetflixCookie=****:` and so on) +* Visit `localhost:8080`, paste the cookie into the input field and press enter +* Get amazed of how long you're using Netflix every day diff --git a/assets/css/grid.css b/assets/css/grid.css deleted file mode 100644 index 7e27ea9..0000000 --- a/assets/css/grid.css +++ /dev/null @@ -1,852 +0,0 @@ -.container, -.container-fluid { - margin-right: auto; - margin-left: auto -} - -.container-fluid { - padding-right: 2rem; - padding-left: 2rem -} - -.row { - box-sizing: border-box; - display: -webkit-box; - display: -ms-flexbox; - display: flex; - -webkit-box-flex: 0; - -ms-flex: 0 1 auto; - flex: 0 1 auto; - -webkit-box-orient: horizontal; - -webkit-box-direction: normal; - -ms-flex-direction: row; - flex-direction: row; - -ms-flex-wrap: wrap; - flex-wrap: wrap; - margin-right: -.5rem; - margin-left: -.5rem -} - -.row.reverse { - -webkit-box-orient: horizontal; - -webkit-box-direction: reverse; - -ms-flex-direction: row-reverse; - flex-direction: row-reverse -} - -.col.reverse { - -webkit-box-orient: vertical; - -webkit-box-direction: reverse; - -ms-flex-direction: column-reverse; - flex-direction: column-reverse -} - -.col-xs, -.col-xs-1, -.col-xs-10, -.col-xs-11, -.col-xs-12, -.col-xs-2, -.col-xs-3, -.col-xs-4, -.col-xs-5, -.col-xs-6, -.col-xs-7, -.col-xs-8, -.col-xs-9, -.col-xs-offset-0, -.col-xs-offset-1, -.col-xs-offset-10, -.col-xs-offset-11, -.col-xs-offset-12, -.col-xs-offset-2, -.col-xs-offset-3, -.col-xs-offset-4, -.col-xs-offset-5, -.col-xs-offset-6, -.col-xs-offset-7, -.col-xs-offset-8, -.col-xs-offset-9 { - box-sizing: border-box; - -webkit-box-flex: 0; - -ms-flex: 0 0 auto; - flex: 0 0 auto; - padding-right: .5rem; - padding-left: .5rem -} - -.col-xs { - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; - -ms-flex-preferred-size: 0; - flex-basis: 0; - max-width: 100% -} - -.col-xs-1 { - -ms-flex-preferred-size: 8.33333333%; - flex-basis: 8.33333333%; - max-width: 8.33333333% -} - -.col-xs-2 { - -ms-flex-preferred-size: 16.66666667%; - flex-basis: 16.66666667%; - max-width: 16.66666667% -} - -.col-xs-3 { - -ms-flex-preferred-size: 25%; - flex-basis: 25%; - max-width: 25% -} - -.col-xs-4 { - -ms-flex-preferred-size: 33.33333333%; - flex-basis: 33.33333333%; - max-width: 33.33333333% -} - -.col-xs-5 { - -ms-flex-preferred-size: 41.66666667%; - flex-basis: 41.66666667%; - max-width: 41.66666667% -} - -.col-xs-6 { - -ms-flex-preferred-size: 50%; - flex-basis: 50%; - max-width: 50% -} - -.col-xs-7 { - -ms-flex-preferred-size: 58.33333333%; - flex-basis: 58.33333333%; - max-width: 58.33333333% -} - -.col-xs-8 { - -ms-flex-preferred-size: 66.66666667%; - flex-basis: 66.66666667%; - max-width: 66.66666667% -} - -.col-xs-9 { - -ms-flex-preferred-size: 75%; - flex-basis: 75%; - max-width: 75% -} - -.col-xs-10 { - -ms-flex-preferred-size: 83.33333333%; - flex-basis: 83.33333333%; - max-width: 83.33333333% -} - -.col-xs-11 { - -ms-flex-preferred-size: 91.66666667%; - flex-basis: 91.66666667%; - max-width: 91.66666667% -} - -.col-xs-12 { - -ms-flex-preferred-size: 100%; - flex-basis: 100%; - max-width: 100% -} - -.col-xs-offset-0 { - margin-left: 0 -} - -.col-xs-offset-1 { - margin-left: 8.33333333% -} - -.col-xs-offset-2 { - margin-left: 16.66666667% -} - -.col-xs-offset-3 { - margin-left: 25% -} - -.col-xs-offset-4 { - margin-left: 33.33333333% -} - -.col-xs-offset-5 { - margin-left: 41.66666667% -} - -.col-xs-offset-6 { - margin-left: 50% -} - -.col-xs-offset-7 { - margin-left: 58.33333333% -} - -.col-xs-offset-8 { - margin-left: 66.66666667% -} - -.col-xs-offset-9 { - margin-left: 75% -} - -.col-xs-offset-10 { - margin-left: 83.33333333% -} - -.col-xs-offset-11 { - margin-left: 91.66666667% -} - -.start-xs { - -webkit-box-pack: start; - -ms-flex-pack: start; - justify-content: flex-start; - text-align: start -} - -.center-xs { - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; - text-align: center -} - -.end-xs { - -webkit-box-pack: end; - -ms-flex-pack: end; - justify-content: flex-end; - text-align: end -} - -.top-xs { - -webkit-box-align: start; - -ms-flex-align: start; - align-items: flex-start -} - -.middle-xs { - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center -} - -.bottom-xs { - -webkit-box-align: end; - -ms-flex-align: end; - align-items: flex-end -} - -.around-xs { - -ms-flex-pack: distribute; - justify-content: space-around -} - -.between-xs { - -webkit-box-pack: justify; - -ms-flex-pack: justify; - justify-content: space-between -} - -.first-xs { - -webkit-box-ordinal-group: 0; - -ms-flex-order: -1; - order: -1 -} - -.last-xs { - -webkit-box-ordinal-group: 2; - -ms-flex-order: 1; - order: 1 -} - -@media only screen and (min-width:48em) { - .container { - width: 49rem - } - .col-sm, - .col-sm-1, - .col-sm-10, - .col-sm-11, - .col-sm-12, - .col-sm-2, - .col-sm-3, - .col-sm-4, - .col-sm-5, - .col-sm-6, - .col-sm-7, - .col-sm-8, - .col-sm-9, - .col-sm-offset-0, - .col-sm-offset-1, - .col-sm-offset-10, - .col-sm-offset-11, - .col-sm-offset-12, - .col-sm-offset-2, - .col-sm-offset-3, - .col-sm-offset-4, - .col-sm-offset-5, - .col-sm-offset-6, - .col-sm-offset-7, - .col-sm-offset-8, - .col-sm-offset-9 { - box-sizing: border-box; - -webkit-box-flex: 0; - -ms-flex: 0 0 auto; - flex: 0 0 auto; - padding-right: .5rem; - padding-left: .5rem - } - .col-sm { - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; - -ms-flex-preferred-size: 0; - flex-basis: 0; - max-width: 100% - } - .col-sm-1 { - -ms-flex-preferred-size: 8.33333333%; - flex-basis: 8.33333333%; - max-width: 8.33333333% - } - .col-sm-2 { - -ms-flex-preferred-size: 16.66666667%; - flex-basis: 16.66666667%; - max-width: 16.66666667% - } - .col-sm-3 { - -ms-flex-preferred-size: 25%; - flex-basis: 25%; - max-width: 25% - } - .col-sm-4 { - -ms-flex-preferred-size: 33.33333333%; - flex-basis: 33.33333333%; - max-width: 33.33333333% - } - .col-sm-5 { - -ms-flex-preferred-size: 41.66666667%; - flex-basis: 41.66666667%; - max-width: 41.66666667% - } - .col-sm-6 { - -ms-flex-preferred-size: 50%; - flex-basis: 50%; - max-width: 50% - } - .col-sm-7 { - -ms-flex-preferred-size: 58.33333333%; - flex-basis: 58.33333333%; - max-width: 58.33333333% - } - .col-sm-8 { - -ms-flex-preferred-size: 66.66666667%; - flex-basis: 66.66666667%; - max-width: 66.66666667% - } - .col-sm-9 { - -ms-flex-preferred-size: 75%; - flex-basis: 75%; - max-width: 75% - } - .col-sm-10 { - -ms-flex-preferred-size: 83.33333333%; - flex-basis: 83.33333333%; - max-width: 83.33333333% - } - .col-sm-11 { - -ms-flex-preferred-size: 91.66666667%; - flex-basis: 91.66666667%; - max-width: 91.66666667% - } - .col-sm-12 { - -ms-flex-preferred-size: 100%; - flex-basis: 100%; - max-width: 100% - } - .col-sm-offset-0 { - margin-left: 0 - } - .col-sm-offset-1 { - margin-left: 8.33333333% - } - .col-sm-offset-2 { - margin-left: 16.66666667% - } - .col-sm-offset-3 { - margin-left: 25% - } - .col-sm-offset-4 { - margin-left: 33.33333333% - } - .col-sm-offset-5 { - margin-left: 41.66666667% - } - .col-sm-offset-6 { - margin-left: 50% - } - .col-sm-offset-7 { - margin-left: 58.33333333% - } - .col-sm-offset-8 { - margin-left: 66.66666667% - } - .col-sm-offset-9 { - margin-left: 75% - } - .col-sm-offset-10 { - margin-left: 83.33333333% - } - .col-sm-offset-11 { - margin-left: 91.66666667% - } - .start-sm { - -webkit-box-pack: start; - -ms-flex-pack: start; - justify-content: flex-start; - text-align: start - } - .center-sm { - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; - text-align: center - } - .end-sm { - -webkit-box-pack: end; - -ms-flex-pack: end; - justify-content: flex-end; - text-align: end - } - .top-sm { - -webkit-box-align: start; - -ms-flex-align: start; - align-items: flex-start - } - .middle-sm { - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center - } - .bottom-sm { - -webkit-box-align: end; - -ms-flex-align: end; - align-items: flex-end - } - .around-sm { - -ms-flex-pack: distribute; - justify-content: space-around - } - .between-sm { - -webkit-box-pack: justify; - -ms-flex-pack: justify; - justify-content: space-between - } - .first-sm { - -webkit-box-ordinal-group: 0; - -ms-flex-order: -1; - order: -1 - } - .last-sm { - -webkit-box-ordinal-group: 2; - -ms-flex-order: 1; - order: 1 - } -} - -@media only screen and (min-width:64em) { - .container { - width: 65rem - } - .col-md, - .col-md-1, - .col-md-10, - .col-md-11, - .col-md-12, - .col-md-2, - .col-md-3, - .col-md-4, - .col-md-5, - .col-md-6, - .col-md-7, - .col-md-8, - .col-md-9, - .col-md-offset-0, - .col-md-offset-1, - .col-md-offset-10, - .col-md-offset-11, - .col-md-offset-12, - .col-md-offset-2, - .col-md-offset-3, - .col-md-offset-4, - .col-md-offset-5, - .col-md-offset-6, - .col-md-offset-7, - .col-md-offset-8, - .col-md-offset-9 { - box-sizing: border-box; - -webkit-box-flex: 0; - -ms-flex: 0 0 auto; - flex: 0 0 auto; - padding-right: .5rem; - padding-left: .5rem - } - .col-md { - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; - -ms-flex-preferred-size: 0; - flex-basis: 0; - max-width: 100% - } - .col-md-1 { - -ms-flex-preferred-size: 8.33333333%; - flex-basis: 8.33333333%; - max-width: 8.33333333% - } - .col-md-2 { - -ms-flex-preferred-size: 16.66666667%; - flex-basis: 16.66666667%; - max-width: 16.66666667% - } - .col-md-3 { - -ms-flex-preferred-size: 25%; - flex-basis: 25%; - max-width: 25% - } - .col-md-4 { - -ms-flex-preferred-size: 33.33333333%; - flex-basis: 33.33333333%; - max-width: 33.33333333% - } - .col-md-5 { - -ms-flex-preferred-size: 41.66666667%; - flex-basis: 41.66666667%; - max-width: 41.66666667% - } - .col-md-6 { - -ms-flex-preferred-size: 50%; - flex-basis: 50%; - max-width: 50% - } - .col-md-7 { - -ms-flex-preferred-size: 58.33333333%; - flex-basis: 58.33333333%; - max-width: 58.33333333% - } - .col-md-8 { - -ms-flex-preferred-size: 66.66666667%; - flex-basis: 66.66666667%; - max-width: 66.66666667% - } - .col-md-9 { - -ms-flex-preferred-size: 75%; - flex-basis: 75%; - max-width: 75% - } - .col-md-10 { - -ms-flex-preferred-size: 83.33333333%; - flex-basis: 83.33333333%; - max-width: 83.33333333% - } - .col-md-11 { - -ms-flex-preferred-size: 91.66666667%; - flex-basis: 91.66666667%; - max-width: 91.66666667% - } - .col-md-12 { - -ms-flex-preferred-size: 100%; - flex-basis: 100%; - max-width: 100% - } - .col-md-offset-0 { - margin-left: 0 - } - .col-md-offset-1 { - margin-left: 8.33333333% - } - .col-md-offset-2 { - margin-left: 16.66666667% - } - .col-md-offset-3 { - margin-left: 25% - } - .col-md-offset-4 { - margin-left: 33.33333333% - } - .col-md-offset-5 { - margin-left: 41.66666667% - } - .col-md-offset-6 { - margin-left: 50% - } - .col-md-offset-7 { - margin-left: 58.33333333% - } - .col-md-offset-8 { - margin-left: 66.66666667% - } - .col-md-offset-9 { - margin-left: 75% - } - .col-md-offset-10 { - margin-left: 83.33333333% - } - .col-md-offset-11 { - margin-left: 91.66666667% - } - .start-md { - -webkit-box-pack: start; - -ms-flex-pack: start; - justify-content: flex-start; - text-align: start - } - .center-md { - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; - text-align: center - } - .end-md { - -webkit-box-pack: end; - -ms-flex-pack: end; - justify-content: flex-end; - text-align: end - } - .top-md { - -webkit-box-align: start; - -ms-flex-align: start; - align-items: flex-start - } - .middle-md { - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center - } - .bottom-md { - -webkit-box-align: end; - -ms-flex-align: end; - align-items: flex-end - } - .around-md { - -ms-flex-pack: distribute; - justify-content: space-around - } - .between-md { - -webkit-box-pack: justify; - -ms-flex-pack: justify; - justify-content: space-between - } - .first-md { - -webkit-box-ordinal-group: 0; - -ms-flex-order: -1; - order: -1 - } - .last-md { - -webkit-box-ordinal-group: 2; - -ms-flex-order: 1; - order: 1 - } -} - -@media only screen and (min-width:75em) { - .container { - width: 76rem - } - .col-lg, - .col-lg-1, - .col-lg-10, - .col-lg-11, - .col-lg-12, - .col-lg-2, - .col-lg-3, - .col-lg-4, - .col-lg-5, - .col-lg-6, - .col-lg-7, - .col-lg-8, - .col-lg-9, - .col-lg-offset-0, - .col-lg-offset-1, - .col-lg-offset-10, - .col-lg-offset-11, - .col-lg-offset-12, - .col-lg-offset-2, - .col-lg-offset-3, - .col-lg-offset-4, - .col-lg-offset-5, - .col-lg-offset-6, - .col-lg-offset-7, - .col-lg-offset-8, - .col-lg-offset-9 { - box-sizing: border-box; - -webkit-box-flex: 0; - -ms-flex: 0 0 auto; - flex: 0 0 auto; - padding-right: .5rem; - padding-left: .5rem - } - .col-lg { - -webkit-box-flex: 1; - -ms-flex-positive: 1; - flex-grow: 1; - -ms-flex-preferred-size: 0; - flex-basis: 0; - max-width: 100% - } - .col-lg-1 { - -ms-flex-preferred-size: 8.33333333%; - flex-basis: 8.33333333%; - max-width: 8.33333333% - } - .col-lg-2 { - -ms-flex-preferred-size: 16.66666667%; - flex-basis: 16.66666667%; - max-width: 16.66666667% - } - .col-lg-3 { - -ms-flex-preferred-size: 25%; - flex-basis: 25%; - max-width: 25% - } - .col-lg-4 { - -ms-flex-preferred-size: 33.33333333%; - flex-basis: 33.33333333%; - max-width: 33.33333333% - } - .col-lg-5 { - -ms-flex-preferred-size: 41.66666667%; - flex-basis: 41.66666667%; - max-width: 41.66666667% - } - .col-lg-6 { - -ms-flex-preferred-size: 50%; - flex-basis: 50%; - max-width: 50% - } - .col-lg-7 { - -ms-flex-preferred-size: 58.33333333%; - flex-basis: 58.33333333%; - max-width: 58.33333333% - } - .col-lg-8 { - -ms-flex-preferred-size: 66.66666667%; - flex-basis: 66.66666667%; - max-width: 66.66666667% - } - .col-lg-9 { - -ms-flex-preferred-size: 75%; - flex-basis: 75%; - max-width: 75% - } - .col-lg-10 { - -ms-flex-preferred-size: 83.33333333%; - flex-basis: 83.33333333%; - max-width: 83.33333333% - } - .col-lg-11 { - -ms-flex-preferred-size: 91.66666667%; - flex-basis: 91.66666667%; - max-width: 91.66666667% - } - .col-lg-12 { - -ms-flex-preferred-size: 100%; - flex-basis: 100%; - max-width: 100% - } - .col-lg-offset-0 { - margin-left: 0 - } - .col-lg-offset-1 { - margin-left: 8.33333333% - } - .col-lg-offset-2 { - margin-left: 16.66666667% - } - .col-lg-offset-3 { - margin-left: 25% - } - .col-lg-offset-4 { - margin-left: 33.33333333% - } - .col-lg-offset-5 { - margin-left: 41.66666667% - } - .col-lg-offset-6 { - margin-left: 50% - } - .col-lg-offset-7 { - margin-left: 58.33333333% - } - .col-lg-offset-8 { - margin-left: 66.66666667% - } - .col-lg-offset-9 { - margin-left: 75% - } - .col-lg-offset-10 { - margin-left: 83.33333333% - } - .col-lg-offset-11 { - margin-left: 91.66666667% - } - .start-lg { - -webkit-box-pack: start; - -ms-flex-pack: start; - justify-content: flex-start; - text-align: start - } - .center-lg { - -webkit-box-pack: center; - -ms-flex-pack: center; - justify-content: center; - text-align: center - } - .end-lg { - -webkit-box-pack: end; - -ms-flex-pack: end; - justify-content: flex-end; - text-align: end - } - .top-lg { - -webkit-box-align: start; - -ms-flex-align: start; - align-items: flex-start - } - .middle-lg { - -webkit-box-align: center; - -ms-flex-align: center; - align-items: center - } - .bottom-lg { - -webkit-box-align: end; - -ms-flex-align: end; - align-items: flex-end - } - .around-lg { - -ms-flex-pack: distribute; - justify-content: space-around - } - .between-lg { - -webkit-box-pack: justify; - -ms-flex-pack: justify; - justify-content: space-between - } - .first-lg { - -webkit-box-ordinal-group: 0; - -ms-flex-order: -1; - order: -1 - } - .last-lg { - -webkit-box-ordinal-group: 2; - -ms-flex-order: 1; - order: 1 - } -}
\ No newline at end of file diff --git a/assets/css/main.css b/assets/css/main.css new file mode 100644 index 0000000..805975f --- /dev/null +++ b/assets/css/main.css @@ -0,0 +1,35 @@ +/** + * Stylesheet of the Netflix Stats Generator + * @author Marvin Borner + * @copyright Marvin Borner 2019 + */ + +html, body { + padding: 8px; + font-family: "Varela Round", sans-serif !important; + text-rendering: optimizeLegibility !important; +} + +.loading, .stats { + display: none; +} + +.stats { + text-align: center; +} + +.stats > div { + padding: 8px; + margin-top: 8px; + border: 1px solid black; +} + +.heatMap { + border-collapse: collapse; +} + +.heatMap td { + width: 2vw; + height: 2vw; + border: 1px solid black; +} diff --git a/assets/css/main.sass b/assets/css/main.sass deleted file mode 100644 index 65427d3..0000000 --- a/assets/css/main.sass +++ /dev/null @@ -1,68 +0,0 @@ -/** - * Design of the Netflix Stats Generator - * @author Marvin Borner - * @copyright Marvin Borner 2018 - -//// General -$BlueColor: #1e3264 - -html, body - width: 100vw !important - background-color: #141518 - font-family: "Varela Round", sans-serif !important - text-rendering: optimizeLegibility !important - color: #bbb - box-sizing: border-box !important - overflow-x: hidden - -.Main - // display: none - min-height: 100vh - -.row:not(.MostWatchedOverview) div - border: .5px solid #25272a - -//// Charts -.MostWatchedOverview - .Description - margin: 20px - .MostWatchedPoster - height: 50% - - -/// Heatmap -.HeatmapWrap - max-width: 100vw !important - -text.month-name, -text.calendar-heatmap-legend-text, -text.day-initial - fill: #bbb - font-size: 10px - font-family: Helvetica, arial, 'Open Sans', sans-serif - - -rect.day-cell:hover - stroke: #555555 - stroke-width: 1px - - -.day-cell-tooltip - position: absolute - z-index: 9999 - padding: 5px 9px - color: #bbbbbb - font-size: 12px - background: rgba(0, 0, 0, 0.85) - border-radius: 3px - text-align: center - - -.day-cell-tooltip>span - font-family: Helvetica, arial, 'Open Sans', sans-serif - - -.calendar-heatmap - overflow: visible - box-sizing: initial - diff --git a/assets/css/normalize.css b/assets/css/normalize.css index 3c3b6b4..b532f93 100644 --- a/assets/css/normalize.css +++ b/assets/css/normalize.css @@ -11,332 +11,331 @@ html { line-height: 1.15; /* 1 */ -webkit-text-size-adjust: 100%; /* 2 */ - } - - /* Sections - ========================================================================== */ - - /** - * Remove the margin in all browsers. - */ - - body { +} + +/* Sections + ========================================================================== */ + +/** + * Remove the margin in all browsers. + */ + +body { margin: 0; - } - - /** - * Correct the font size and margin on `h1` elements within `section` and - * `article` contexts in Chrome, Firefox, and Safari. - */ - - h1 { +} + +/** + * Correct the font size and margin on `h1` elements within `section` and + * `article` contexts in Chrome, Firefox, and Safari. + */ + +h1 { font-size: 2em; margin: 0.67em 0; - } - - /* Grouping content - ========================================================================== */ - - /** - * 1. Add the correct box sizing in Firefox. - * 2. Show the overflow in Edge and IE. - */ - - hr { +} + +/* Grouping content + ========================================================================== */ + +/** + * 1. Add the correct box sizing in Firefox. + * 2. Show the overflow in Edge and IE. + */ + +hr { box-sizing: content-box; /* 1 */ height: 0; /* 1 */ overflow: visible; /* 2 */ - } - - /** - * 1. Correct the inheritance and scaling of font size in all browsers. - * 2. Correct the odd `em` font sizing in all browsers. - */ - - pre { +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +pre { font-family: monospace, monospace; /* 1 */ font-size: 1em; /* 2 */ - } - - /* Text-level semantics - ========================================================================== */ - - /** - * Remove the gray background on active links in IE 10. - */ - - a { +} + +/* Text-level semantics + ========================================================================== */ + +/** + * Remove the gray background on active links in IE 10. + */ + +a { background-color: transparent; - } - - /** - * 1. Remove the bottom border in Chrome 57- - * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. - */ - - abbr[title] { +} + +/** + * 1. Remove the bottom border in Chrome 57- + * 2. Add the correct text decoration in Chrome, Edge, IE, Opera, and Safari. + */ + +abbr[title] { border-bottom: none; /* 1 */ text-decoration: underline; /* 2 */ text-decoration: underline dotted; /* 2 */ - } - - /** - * Add the correct font weight in Chrome, Edge, and Safari. - */ - - b, - strong { +} + +/** + * Add the correct font weight in Chrome, Edge, and Safari. + */ + +b, +strong { font-weight: bolder; - } - - /** - * 1. Correct the inheritance and scaling of font size in all browsers. - * 2. Correct the odd `em` font sizing in all browsers. - */ - - code, - kbd, - samp { +} + +/** + * 1. Correct the inheritance and scaling of font size in all browsers. + * 2. Correct the odd `em` font sizing in all browsers. + */ + +code, +kbd, +samp { font-family: monospace, monospace; /* 1 */ font-size: 1em; /* 2 */ - } - - /** - * Add the correct font size in all browsers. - */ - - small { +} + +/** + * Add the correct font size in all browsers. + */ + +small { font-size: 80%; - } - - /** - * Prevent `sub` and `sup` elements from affecting the line height in - * all browsers. - */ - - sub, - sup { +} + +/** + * Prevent `sub` and `sup` elements from affecting the line height in + * all browsers. + */ + +sub, +sup { font-size: 75%; line-height: 0; position: relative; vertical-align: baseline; - } - - sub { +} + +sub { bottom: -0.25em; - } - - sup { +} + +sup { top: -0.5em; - } - - /* Embedded content - ========================================================================== */ - - /** - * Remove the border on images inside links in IE 10. - */ - - img { +} + +/* Embedded content + ========================================================================== */ + +/** + * Remove the border on images inside links in IE 10. + */ + +img { border-style: none; - } - - /* Forms - ========================================================================== */ - - /** - * 1. Change the font styles in all browsers. - * 2. Remove the margin in Firefox and Safari. - */ - - button, - input, - optgroup, - select, - textarea { +} + +/* Forms + ========================================================================== */ + +/** + * 1. Change the font styles in all browsers. + * 2. Remove the margin in Firefox and Safari. + */ + +button, +input, +optgroup, +select, +textarea { font-family: inherit; /* 1 */ font-size: 100%; /* 1 */ line-height: 1.15; /* 1 */ margin: 0; /* 2 */ - } - - /** - * Show the overflow in IE. - * 1. Show the overflow in Edge. - */ - - button, - input { /* 1 */ +} + +/** + * Show the overflow in IE. + * 1. Show the overflow in Edge. + */ + +button, +input { /* 1 */ overflow: visible; - } - - /** - * Remove the inheritance of text transform in Edge, Firefox, and IE. - * 1. Remove the inheritance of text transform in Firefox. - */ - - button, - select { /* 1 */ +} + +/** + * Remove the inheritance of text transform in Edge, Firefox, and IE. + * 1. Remove the inheritance of text transform in Firefox. + */ + +button, +select { /* 1 */ text-transform: none; - } - - /** - * Correct the inability to style clickable types in iOS and Safari. - */ - - button, - [type="button"], - [type="reset"], - [type="submit"] { +} + +/** + * Correct the inability to style clickable types in iOS and Safari. + */ + +button, +[type="button"], +[type="reset"], +[type="submit"] { -webkit-appearance: button; - } - - /** - * Remove the inner border and padding in Firefox. - */ - - button::-moz-focus-inner, - [type="button"]::-moz-focus-inner, - [type="reset"]::-moz-focus-inner, - [type="submit"]::-moz-focus-inner { +} + +/** + * Remove the inner border and padding in Firefox. + */ + +button::-moz-focus-inner, +[type="button"]::-moz-focus-inner, +[type="reset"]::-moz-focus-inner, +[type="submit"]::-moz-focus-inner { border-style: none; padding: 0; - } - - /** - * Restore the focus styles unset by the previous rule. - */ - - button:-moz-focusring, - [type="button"]:-moz-focusring, - [type="reset"]:-moz-focusring, - [type="submit"]:-moz-focusring { +} + +/** + * Restore the focus styles unset by the previous rule. + */ + +button:-moz-focusring, +[type="button"]:-moz-focusring, +[type="reset"]:-moz-focusring, +[type="submit"]:-moz-focusring { outline: 1px dotted ButtonText; - } - - /** - * Correct the padding in Firefox. - */ - - fieldset { +} + +/** + * Correct the padding in Firefox. + */ + +fieldset { padding: 0.35em 0.75em 0.625em; - } - - /** - * 1. Correct the text wrapping in Edge and IE. - * 2. Correct the color inheritance from `fieldset` elements in IE. - * 3. Remove the padding so developers are not caught out when they zero out - * `fieldset` elements in all browsers. - */ - - legend { +} + +/** + * 1. Correct the text wrapping in Edge and IE. + * 2. Correct the color inheritance from `fieldset` elements in IE. + * 3. Remove the padding so developers are not caught out when they zero out + * `fieldset` elements in all browsers. + */ + +legend { box-sizing: border-box; /* 1 */ color: inherit; /* 2 */ display: table; /* 1 */ max-width: 100%; /* 1 */ padding: 0; /* 3 */ white-space: normal; /* 1 */ - } - - /** - * Add the correct vertical alignment in Chrome, Firefox, and Opera. - */ - - progress { +} + +/** + * Add the correct vertical alignment in Chrome, Firefox, and Opera. + */ + +progress { vertical-align: baseline; - } - - /** - * Remove the default vertical scrollbar in IE 10+. - */ - - textarea { +} + +/** + * Remove the default vertical scrollbar in IE 10+. + */ + +textarea { overflow: auto; - } - - /** - * 1. Add the correct box sizing in IE 10. - * 2. Remove the padding in IE 10. - */ - - [type="checkbox"], - [type="radio"] { +} + +/** + * 1. Add the correct box sizing in IE 10. + * 2. Remove the padding in IE 10. + */ + +[type="checkbox"], +[type="radio"] { box-sizing: border-box; /* 1 */ padding: 0; /* 2 */ - } - - /** - * Correct the cursor style of increment and decrement buttons in Chrome. - */ - - [type="number"]::-webkit-inner-spin-button, - [type="number"]::-webkit-outer-spin-button { +} + +/** + * Correct the cursor style of increment and decrement buttons in Chrome. + */ + +[type="number"]::-webkit-inner-spin-button, +[type="number"]::-webkit-outer-spin-button { height: auto; - } - - /** - * 1. Correct the odd appearance in Chrome and Safari. - * 2. Correct the outline style in Safari. - */ - - [type="search"] { +} + +/** + * 1. Correct the odd appearance in Chrome and Safari. + * 2. Correct the outline style in Safari. + */ + +[type="search"] { -webkit-appearance: textfield; /* 1 */ outline-offset: -2px; /* 2 */ - } - - /** - * Remove the inner padding in Chrome and Safari on macOS. - */ - - [type="search"]::-webkit-search-decoration { +} + +/** + * Remove the inner padding in Chrome and Safari on macOS. + */ + +[type="search"]::-webkit-search-decoration { -webkit-appearance: none; - } - - /** - * 1. Correct the inability to style clickable types in iOS and Safari. - * 2. Change font properties to `inherit` in Safari. - */ - - ::-webkit-file-upload-button { +} + +/** + * 1. Correct the inability to style clickable types in iOS and Safari. + * 2. Change font properties to `inherit` in Safari. + */ + +::-webkit-file-upload-button { -webkit-appearance: button; /* 1 */ font: inherit; /* 2 */ - } - - /* Interactive - ========================================================================== */ - - /* - * Add the correct display in Edge, IE 10+, and Firefox. - */ - - details { +} + +/* Interactive + ========================================================================== */ + +/* + * Add the correct display in Edge, IE 10+, and Firefox. + */ + +details { display: block; - } - - /* - * Add the correct display in all browsers. - */ - - summary { +} + +/* + * Add the correct display in all browsers. + */ + +summary { display: list-item; - } - - /* Misc - ========================================================================== */ - - /** - * Add the correct display in IE 10+. - */ - - template { +} + +/* Misc + ========================================================================== */ + +/** + * Add the correct display in IE 10+. + */ + +template { display: none; - } - - /** - * Add the correct display in IE 10. - */ - - [hidden] { +} + +/** + * Add the correct display in IE 10. + */ + +[hidden] { display: none; - } -
\ No newline at end of file +} diff --git a/assets/js/chart.js b/assets/js/chart.js index ba06c40..d3c7232 100755 --- a/assets/js/chart.js +++ b/assets/js/chart.js @@ -1,6210 +1,19371 @@ /*! - * Chart.js - * http://chartjs.org/ - * Version: 2.7.2 - * - * Copyright 2018 Chart.js Contributors - * Released under the MIT license - * https://github.com/chartjs/Chart.js/blob/master/LICENSE.md + * Chart.js v2.8.0 + * https://www.chartjs.org + * (c) 2019 Chart.js Contributors + * Released under the MIT License */ -!function (t) { - if ("object" == typeof exports && "undefined" != typeof module) module.exports = t(); else if ("function" == typeof define && define.amd) define([], t); else { - ("undefined" != typeof window ? window : "undefined" != typeof global ? global : "undefined" != typeof self ? self : this).Chart = t() - } -}(function () { - return function t(e, i, n) { - function a(o, s) { - if (!i[o]) { - if (!e[o]) { - var l = "function" == typeof require && require; - if (!s && l) return l(o, !0); - if (r) return r(o, !0); - var u = new Error("Cannot find module '" + o + "'"); - throw u.code = "MODULE_NOT_FOUND", u - } - var d = i[o] = {exports: {}}; - e[o][0].call(d.exports, function (t) { - var i = e[o][1][t]; - return a(i || t) - }, d, d.exports, t, e, i, n) - } - return i[o].exports - } - - for (var r = "function" == typeof require && require, o = 0; o < n.length; o++) a(n[o]); - return a - }({ - 1: [function (t, e, i) { - var n = t(5); - - function a(t) { - if (t) { - var e = [0, 0, 0], i = 1, a = t.match(/^#([a-fA-F0-9]{3})$/i); - if (a) { - a = a[1]; - for (var r = 0; r < e.length; r++) e[r] = parseInt(a[r] + a[r], 16) - } else if (a = t.match(/^#([a-fA-F0-9]{6})$/i)) { - a = a[1]; - for (r = 0; r < e.length; r++) e[r] = parseInt(a.slice(2 * r, 2 * r + 2), 16) - } else if (a = t.match(/^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i)) { - for (r = 0; r < e.length; r++) e[r] = parseInt(a[r + 1]); - i = parseFloat(a[4]) - } else if (a = t.match(/^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i)) { - for (r = 0; r < e.length; r++) e[r] = Math.round(2.55 * parseFloat(a[r + 1])); - i = parseFloat(a[4]) - } else if (a = t.match(/(\w+)/)) { - if ("transparent" == a[1]) return [0, 0, 0, 0]; - if (!(e = n[a[1]])) return - } - for (r = 0; r < e.length; r++) e[r] = d(e[r], 0, 255); - return i = i || 0 == i ? d(i, 0, 1) : 1, e[3] = i, e - } - } +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global.Chart = factory()); +}(this, (function () { + 'use strict'; - function r(t) { - if (t) { - var e = t.match(/^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/); - if (e) { - var i = parseFloat(e[4]); - return [d(parseInt(e[1]), 0, 360), d(parseFloat(e[2]), 0, 100), d(parseFloat(e[3]), 0, 100), d(isNaN(i) ? 1 : i, 0, 1)] - } - } + /* MIT license */ + + var conversions = { + rgb2hsl: rgb2hsl, + rgb2hsv: rgb2hsv, + rgb2hwb: rgb2hwb, + rgb2cmyk: rgb2cmyk, + rgb2keyword: rgb2keyword, + rgb2xyz: rgb2xyz, + rgb2lab: rgb2lab, + rgb2lch: rgb2lch, + + hsl2rgb: hsl2rgb, + hsl2hsv: hsl2hsv, + hsl2hwb: hsl2hwb, + hsl2cmyk: hsl2cmyk, + hsl2keyword: hsl2keyword, + + hsv2rgb: hsv2rgb, + hsv2hsl: hsv2hsl, + hsv2hwb: hsv2hwb, + hsv2cmyk: hsv2cmyk, + hsv2keyword: hsv2keyword, + + hwb2rgb: hwb2rgb, + hwb2hsl: hwb2hsl, + hwb2hsv: hwb2hsv, + hwb2cmyk: hwb2cmyk, + hwb2keyword: hwb2keyword, + + cmyk2rgb: cmyk2rgb, + cmyk2hsl: cmyk2hsl, + cmyk2hsv: cmyk2hsv, + cmyk2hwb: cmyk2hwb, + cmyk2keyword: cmyk2keyword, + + keyword2rgb: keyword2rgb, + keyword2hsl: keyword2hsl, + keyword2hsv: keyword2hsv, + keyword2hwb: keyword2hwb, + keyword2cmyk: keyword2cmyk, + keyword2lab: keyword2lab, + keyword2xyz: keyword2xyz, + + xyz2rgb: xyz2rgb, + xyz2lab: xyz2lab, + xyz2lch: xyz2lch, + + lab2xyz: lab2xyz, + lab2rgb: lab2rgb, + lab2lch: lab2lch, + + lch2lab: lch2lab, + lch2xyz: lch2xyz, + lch2rgb: lch2rgb + }; + + + function rgb2hsl(rgb) { + var r = rgb[0] / 255, + g = rgb[1] / 255, + b = rgb[2] / 255, + min = Math.min(r, g, b), + max = Math.max(r, g, b), + delta = max - min, + h, s, l; + + if (max == min) + h = 0; + else if (r == max) + h = (g - b) / delta; + else if (g == max) + h = 2 + (b - r) / delta; + else if (b == max) + h = 4 + (r - g) / delta; + + h = Math.min(h * 60, 360); + + if (h < 0) + h += 360; + + l = (min + max) / 2; + + if (max == min) + s = 0; + else if (l <= 0.5) + s = delta / (max + min); + else + s = delta / (2 - max - min); + + return [h, s * 100, l * 100]; + } + + function rgb2hsv(rgb) { + var r = rgb[0], + g = rgb[1], + b = rgb[2], + min = Math.min(r, g, b), + max = Math.max(r, g, b), + delta = max - min, + h, s, v; + + if (max == 0) + s = 0; + else + s = (delta / max * 1000) / 10; + + if (max == min) + h = 0; + else if (r == max) + h = (g - b) / delta; + else if (g == max) + h = 2 + (b - r) / delta; + else if (b == max) + h = 4 + (r - g) / delta; + + h = Math.min(h * 60, 360); + + if (h < 0) + h += 360; + + v = ((max / 255) * 1000) / 10; + + return [h, s, v]; + } + + function rgb2hwb(rgb) { + var r = rgb[0], + g = rgb[1], + b = rgb[2], + h = rgb2hsl(rgb)[0], + w = 1 / 255 * Math.min(r, Math.min(g, b)), + b = 1 - 1 / 255 * Math.max(r, Math.max(g, b)); + + return [h, w * 100, b * 100]; + } + + function rgb2cmyk(rgb) { + var r = rgb[0] / 255, + g = rgb[1] / 255, + b = rgb[2] / 255, + c, m, y, k; + + k = Math.min(1 - r, 1 - g, 1 - b); + c = (1 - r - k) / (1 - k) || 0; + m = (1 - g - k) / (1 - k) || 0; + y = (1 - b - k) / (1 - k) || 0; + return [c * 100, m * 100, y * 100, k * 100]; + } + + function rgb2keyword(rgb) { + return reverseKeywords[JSON.stringify(rgb)]; + } + + function rgb2xyz(rgb) { + var r = rgb[0] / 255, + g = rgb[1] / 255, + b = rgb[2] / 255; + + // assume sRGB + r = r > 0.04045 ? Math.pow(((r + 0.055) / 1.055), 2.4) : (r / 12.92); + g = g > 0.04045 ? Math.pow(((g + 0.055) / 1.055), 2.4) : (g / 12.92); + b = b > 0.04045 ? Math.pow(((b + 0.055) / 1.055), 2.4) : (b / 12.92); + + var x = (r * 0.4124) + (g * 0.3576) + (b * 0.1805); + var y = (r * 0.2126) + (g * 0.7152) + (b * 0.0722); + var z = (r * 0.0193) + (g * 0.1192) + (b * 0.9505); + + return [x * 100, y * 100, z * 100]; + } + + function rgb2lab(rgb) { + var xyz = rgb2xyz(rgb), + x = xyz[0], + y = xyz[1], + z = xyz[2], + l, a, b; + + x /= 95.047; + y /= 100; + z /= 108.883; + + x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116); + + l = (116 * y) - 16; + a = 500 * (x - y); + b = 200 * (y - z); + + return [l, a, b]; + } + + function rgb2lch(args) { + return lab2lch(rgb2lab(args)); + } + + function hsl2rgb(hsl) { + var h = hsl[0] / 360, + s = hsl[1] / 100, + l = hsl[2] / 100, + t1, t2, t3, rgb, val; + + if (s == 0) { + val = l * 255; + return [val, val, val]; + } + + if (l < 0.5) + t2 = l * (1 + s); + else + t2 = l + s - l * s; + t1 = 2 * l - t2; + + rgb = [0, 0, 0]; + for (var i = 0; i < 3; i++) { + t3 = h + 1 / 3 * -(i - 1); + t3 < 0 && t3++; + t3 > 1 && t3--; + + if (6 * t3 < 1) + val = t1 + (t2 - t1) * 6 * t3; + else if (2 * t3 < 1) + val = t2; + else if (3 * t3 < 2) + val = t1 + (t2 - t1) * (2 / 3 - t3) * 6; + else + val = t1; + + rgb[i] = val * 255; + } + + return rgb; + } + + function hsl2hsv(hsl) { + var h = hsl[0], + s = hsl[1] / 100, + l = hsl[2] / 100, + sv, v; + + if (l === 0) { + // no need to do calc on black + // also avoids divide by 0 error + return [0, 0, 0]; + } + + l *= 2; + s *= (l <= 1) ? l : 2 - l; + v = (l + s) / 2; + sv = (2 * s) / (l + s); + return [h, sv * 100, v * 100]; + } + + function hsl2hwb(args) { + return rgb2hwb(hsl2rgb(args)); + } + + function hsl2cmyk(args) { + return rgb2cmyk(hsl2rgb(args)); + } + + function hsl2keyword(args) { + return rgb2keyword(hsl2rgb(args)); + } + + + function hsv2rgb(hsv) { + var h = hsv[0] / 60, + s = hsv[1] / 100, + v = hsv[2] / 100, + hi = Math.floor(h) % 6; + + var f = h - Math.floor(h), + p = 255 * v * (1 - s), + q = 255 * v * (1 - (s * f)), + t = 255 * v * (1 - (s * (1 - f))), + v = 255 * v; + + switch (hi) { + case 0: + return [v, t, p]; + case 1: + return [q, v, p]; + case 2: + return [p, v, t]; + case 3: + return [p, q, v]; + case 4: + return [t, p, v]; + case 5: + return [v, p, q]; + } + } + + function hsv2hsl(hsv) { + var h = hsv[0], + s = hsv[1] / 100, + v = hsv[2] / 100, + sl, l; + + l = (2 - s) * v; + sl = s * v; + sl /= (l <= 1) ? l : 2 - l; + sl = sl || 0; + l /= 2; + return [h, sl * 100, l * 100]; + } + + function hsv2hwb(args) { + return rgb2hwb(hsv2rgb(args)) + } + + function hsv2cmyk(args) { + return rgb2cmyk(hsv2rgb(args)); + } + + function hsv2keyword(args) { + return rgb2keyword(hsv2rgb(args)); + } + +// http://dev.w3.org/csswg/css-color/#hwb-to-rgb + function hwb2rgb(hwb) { + var h = hwb[0] / 360, + wh = hwb[1] / 100, + bl = hwb[2] / 100, + ratio = wh + bl, + i, v, f, n; + + // wh + bl cant be > 1 + if (ratio > 1) { + wh /= ratio; + bl /= ratio; + } + + i = Math.floor(6 * h); + v = 1 - bl; + f = 6 * h - i; + if ((i & 0x01) != 0) { + f = 1 - f; + } + n = wh + f * (v - wh); // linear interpolation + + switch (i) { + default: + case 6: + case 0: + r = v; + g = n; + b = wh; + break; + case 1: + r = n; + g = v; + b = wh; + break; + case 2: + r = wh; + g = v; + b = n; + break; + case 3: + r = wh; + g = n; + b = v; + break; + case 4: + r = n; + g = wh; + b = v; + break; + case 5: + r = v; + g = wh; + b = n; + break; + } + + return [r * 255, g * 255, b * 255]; + } + + function hwb2hsl(args) { + return rgb2hsl(hwb2rgb(args)); + } + + function hwb2hsv(args) { + return rgb2hsv(hwb2rgb(args)); + } + + function hwb2cmyk(args) { + return rgb2cmyk(hwb2rgb(args)); + } + + function hwb2keyword(args) { + return rgb2keyword(hwb2rgb(args)); + } + + function cmyk2rgb(cmyk) { + var c = cmyk[0] / 100, + m = cmyk[1] / 100, + y = cmyk[2] / 100, + k = cmyk[3] / 100, + r, g, b; + + r = 1 - Math.min(1, c * (1 - k) + k); + g = 1 - Math.min(1, m * (1 - k) + k); + b = 1 - Math.min(1, y * (1 - k) + k); + return [r * 255, g * 255, b * 255]; + } + + function cmyk2hsl(args) { + return rgb2hsl(cmyk2rgb(args)); + } + + function cmyk2hsv(args) { + return rgb2hsv(cmyk2rgb(args)); + } + + function cmyk2hwb(args) { + return rgb2hwb(cmyk2rgb(args)); + } + + function cmyk2keyword(args) { + return rgb2keyword(cmyk2rgb(args)); + } + + + function xyz2rgb(xyz) { + var x = xyz[0] / 100, + y = xyz[1] / 100, + z = xyz[2] / 100, + r, g, b; + + r = (x * 3.2406) + (y * -1.5372) + (z * -0.4986); + g = (x * -0.9689) + (y * 1.8758) + (z * 0.0415); + b = (x * 0.0557) + (y * -0.2040) + (z * 1.0570); + + // assume sRGB + r = r > 0.0031308 ? ((1.055 * Math.pow(r, 1.0 / 2.4)) - 0.055) + : r = (r * 12.92); + + g = g > 0.0031308 ? ((1.055 * Math.pow(g, 1.0 / 2.4)) - 0.055) + : g = (g * 12.92); + + b = b > 0.0031308 ? ((1.055 * Math.pow(b, 1.0 / 2.4)) - 0.055) + : b = (b * 12.92); + + r = Math.min(Math.max(0, r), 1); + g = Math.min(Math.max(0, g), 1); + b = Math.min(Math.max(0, b), 1); + + return [r * 255, g * 255, b * 255]; + } + + function xyz2lab(xyz) { + var x = xyz[0], + y = xyz[1], + z = xyz[2], + l, a, b; + + x /= 95.047; + y /= 100; + z /= 108.883; + + x = x > 0.008856 ? Math.pow(x, 1 / 3) : (7.787 * x) + (16 / 116); + y = y > 0.008856 ? Math.pow(y, 1 / 3) : (7.787 * y) + (16 / 116); + z = z > 0.008856 ? Math.pow(z, 1 / 3) : (7.787 * z) + (16 / 116); + + l = (116 * y) - 16; + a = 500 * (x - y); + b = 200 * (y - z); + + return [l, a, b]; + } + + function xyz2lch(args) { + return lab2lch(xyz2lab(args)); + } + + function lab2xyz(lab) { + var l = lab[0], + a = lab[1], + b = lab[2], + x, y, z, y2; + + if (l <= 8) { + y = (l * 100) / 903.3; + y2 = (7.787 * (y / 100)) + (16 / 116); + } else { + y = 100 * Math.pow((l + 16) / 116, 3); + y2 = Math.pow(y / 100, 1 / 3); + } + + x = x / 95.047 <= 0.008856 ? x = (95.047 * ((a / 500) + y2 - (16 / 116))) / 7.787 : 95.047 * Math.pow((a / 500) + y2, 3); + + z = z / 108.883 <= 0.008859 ? z = (108.883 * (y2 - (b / 200) - (16 / 116))) / 7.787 : 108.883 * Math.pow(y2 - (b / 200), 3); + + return [x, y, z]; + } + + function lab2lch(lab) { + var l = lab[0], + a = lab[1], + b = lab[2], + hr, h, c; + + hr = Math.atan2(b, a); + h = hr * 360 / 2 / Math.PI; + if (h < 0) { + h += 360; + } + c = Math.sqrt(a * a + b * b); + return [l, c, h]; + } + + function lab2rgb(args) { + return xyz2rgb(lab2xyz(args)); + } + + function lch2lab(lch) { + var l = lch[0], + c = lch[1], + h = lch[2], + a, b, hr; + + hr = h / 360 * 2 * Math.PI; + a = c * Math.cos(hr); + b = c * Math.sin(hr); + return [l, a, b]; + } + + function lch2xyz(args) { + return lab2xyz(lch2lab(args)); + } + + function lch2rgb(args) { + return lab2rgb(lch2lab(args)); + } + + function keyword2rgb(keyword) { + return cssKeywords[keyword]; + } + + function keyword2hsl(args) { + return rgb2hsl(keyword2rgb(args)); + } + + function keyword2hsv(args) { + return rgb2hsv(keyword2rgb(args)); + } + + function keyword2hwb(args) { + return rgb2hwb(keyword2rgb(args)); + } + + function keyword2cmyk(args) { + return rgb2cmyk(keyword2rgb(args)); + } + + function keyword2lab(args) { + return rgb2lab(keyword2rgb(args)); + } + + function keyword2xyz(args) { + return rgb2xyz(keyword2rgb(args)); + } + + var cssKeywords = { + aliceblue: [240, 248, 255], + antiquewhite: [250, 235, 215], + aqua: [0, 255, 255], + aquamarine: [127, 255, 212], + azure: [240, 255, 255], + beige: [245, 245, 220], + bisque: [255, 228, 196], + black: [0, 0, 0], + blanchedalmond: [255, 235, 205], + blue: [0, 0, 255], + blueviolet: [138, 43, 226], + brown: [165, 42, 42], + burlywood: [222, 184, 135], + cadetblue: [95, 158, 160], + chartreuse: [127, 255, 0], + chocolate: [210, 105, 30], + coral: [255, 127, 80], + cornflowerblue: [100, 149, 237], + cornsilk: [255, 248, 220], + crimson: [220, 20, 60], + cyan: [0, 255, 255], + darkblue: [0, 0, 139], + darkcyan: [0, 139, 139], + darkgoldenrod: [184, 134, 11], + darkgray: [169, 169, 169], + darkgreen: [0, 100, 0], + darkgrey: [169, 169, 169], + darkkhaki: [189, 183, 107], + darkmagenta: [139, 0, 139], + darkolivegreen: [85, 107, 47], + darkorange: [255, 140, 0], + darkorchid: [153, 50, 204], + darkred: [139, 0, 0], + darksalmon: [233, 150, 122], + darkseagreen: [143, 188, 143], + darkslateblue: [72, 61, 139], + darkslategray: [47, 79, 79], + darkslategrey: [47, 79, 79], + darkturquoise: [0, 206, 209], + darkviolet: [148, 0, 211], + deeppink: [255, 20, 147], + deepskyblue: [0, 191, 255], + dimgray: [105, 105, 105], + dimgrey: [105, 105, 105], + dodgerblue: [30, 144, 255], + firebrick: [178, 34, 34], + floralwhite: [255, 250, 240], + forestgreen: [34, 139, 34], + fuchsia: [255, 0, 255], + gainsboro: [220, 220, 220], + ghostwhite: [248, 248, 255], + gold: [255, 215, 0], + goldenrod: [218, 165, 32], + gray: [128, 128, 128], + green: [0, 128, 0], + greenyellow: [173, 255, 47], + grey: [128, 128, 128], + honeydew: [240, 255, 240], + hotpink: [255, 105, 180], + indianred: [205, 92, 92], + indigo: [75, 0, 130], + ivory: [255, 255, 240], + khaki: [240, 230, 140], + lavender: [230, 230, 250], + lavenderblush: [255, 240, 245], + lawngreen: [124, 252, 0], + lemonchiffon: [255, 250, 205], + lightblue: [173, 216, 230], + lightcoral: [240, 128, 128], + lightcyan: [224, 255, 255], + lightgoldenrodyellow: [250, 250, 210], + lightgray: [211, 211, 211], + lightgreen: [144, 238, 144], + lightgrey: [211, 211, 211], + lightpink: [255, 182, 193], + lightsalmon: [255, 160, 122], + lightseagreen: [32, 178, 170], + lightskyblue: [135, 206, 250], + lightslategray: [119, 136, 153], + lightslategrey: [119, 136, 153], + lightsteelblue: [176, 196, 222], + lightyellow: [255, 255, 224], + lime: [0, 255, 0], + limegreen: [50, 205, 50], + linen: [250, 240, 230], + magenta: [255, 0, 255], + maroon: [128, 0, 0], + mediumaquamarine: [102, 205, 170], + mediumblue: [0, 0, 205], + mediumorchid: [186, 85, 211], + mediumpurple: [147, 112, 219], + mediumseagreen: [60, 179, 113], + mediumslateblue: [123, 104, 238], + mediumspringgreen: [0, 250, 154], + mediumturquoise: [72, 209, 204], + mediumvioletred: [199, 21, 133], + midnightblue: [25, 25, 112], + mintcream: [245, 255, 250], + mistyrose: [255, 228, 225], + moccasin: [255, 228, 181], + navajowhite: [255, 222, 173], + navy: [0, 0, 128], + oldlace: [253, 245, 230], + olive: [128, 128, 0], + olivedrab: [107, 142, 35], + orange: [255, 165, 0], + orangered: [255, 69, 0], + orchid: [218, 112, 214], + palegoldenrod: [238, 232, 170], + palegreen: [152, 251, 152], + paleturquoise: [175, 238, 238], + palevioletred: [219, 112, 147], + papayawhip: [255, 239, 213], + peachpuff: [255, 218, 185], + peru: [205, 133, 63], + pink: [255, 192, 203], + plum: [221, 160, 221], + powderblue: [176, 224, 230], + purple: [128, 0, 128], + rebeccapurple: [102, 51, 153], + red: [255, 0, 0], + rosybrown: [188, 143, 143], + royalblue: [65, 105, 225], + saddlebrown: [139, 69, 19], + salmon: [250, 128, 114], + sandybrown: [244, 164, 96], + seagreen: [46, 139, 87], + seashell: [255, 245, 238], + sienna: [160, 82, 45], + silver: [192, 192, 192], + skyblue: [135, 206, 235], + slateblue: [106, 90, 205], + slategray: [112, 128, 144], + slategrey: [112, 128, 144], + snow: [255, 250, 250], + springgreen: [0, 255, 127], + steelblue: [70, 130, 180], + tan: [210, 180, 140], + teal: [0, 128, 128], + thistle: [216, 191, 216], + tomato: [255, 99, 71], + turquoise: [64, 224, 208], + violet: [238, 130, 238], + wheat: [245, 222, 179], + white: [255, 255, 255], + whitesmoke: [245, 245, 245], + yellow: [255, 255, 0], + yellowgreen: [154, 205, 50] + }; + + var reverseKeywords = {}; + for (var key in cssKeywords) { + reverseKeywords[JSON.stringify(cssKeywords[key])] = key; + } + + var convert = function () { + return new Converter(); + }; + + for (var func in conversions) { + // export Raw versions + convert[func + "Raw"] = (function (func) { + // accept array or plain args + return function (arg) { + if (typeof arg == "number") + arg = Array.prototype.slice.call(arguments); + return conversions[func](arg); + } + })(func); + + var pair = /(\w+)2(\w+)/.exec(func), + from = pair[1], + to = pair[2]; + + // export rgb2hsl and ["rgb"]["hsl"] + convert[from] = convert[from] || {}; + + convert[from][to] = convert[func] = (function (func) { + return function (arg) { + if (typeof arg == "number") + arg = Array.prototype.slice.call(arguments); + + var val = conversions[func](arg); + if (typeof val == "string" || val === undefined) + return val; // keyword + + for (var i = 0; i < val.length; i++) + val[i] = Math.round(val[i]); + return val; + } + })(func); + } + + + /* Converter does lazy conversion and caching */ + var Converter = function () { + this.convs = {}; + }; + + /* Either get the values for a space or + set the values for a space, depending on args */ + Converter.prototype.routeSpace = function (space, args) { + var values = args[0]; + if (values === undefined) { + // color.rgb() + return this.getValues(space); + } + // color.rgb(10, 10, 10) + if (typeof values == "number") { + values = Array.prototype.slice.call(args); + } + + return this.setValues(space, values); + }; + + /* Set the values for a space, invalidating cache */ + Converter.prototype.setValues = function (space, values) { + this.space = space; + this.convs = {}; + this.convs[space] = values; + return this; + }; + + /* Get the values for a space. If there's already + a conversion for the space, fetch it, otherwise + compute it */ + Converter.prototype.getValues = function (space) { + var vals = this.convs[space]; + if (!vals) { + var fspace = this.space, + from = this.convs[fspace]; + vals = convert[fspace][space](from); + + this.convs[space] = vals; + } + return vals; + }; + + ["rgb", "hsl", "hsv", "cmyk", "keyword"].forEach(function (space) { + Converter.prototype[space] = function (vals) { + return this.routeSpace(space, arguments); + }; + }); + + var colorConvert = convert; + + var colorName = { + "aliceblue": [240, 248, 255], + "antiquewhite": [250, 235, 215], + "aqua": [0, 255, 255], + "aquamarine": [127, 255, 212], + "azure": [240, 255, 255], + "beige": [245, 245, 220], + "bisque": [255, 228, 196], + "black": [0, 0, 0], + "blanchedalmond": [255, 235, 205], + "blue": [0, 0, 255], + "blueviolet": [138, 43, 226], + "brown": [165, 42, 42], + "burlywood": [222, 184, 135], + "cadetblue": [95, 158, 160], + "chartreuse": [127, 255, 0], + "chocolate": [210, 105, 30], + "coral": [255, 127, 80], + "cornflowerblue": [100, 149, 237], + "cornsilk": [255, 248, 220], + "crimson": [220, 20, 60], + "cyan": [0, 255, 255], + "darkblue": [0, 0, 139], + "darkcyan": [0, 139, 139], + "darkgoldenrod": [184, 134, 11], + "darkgray": [169, 169, 169], + "darkgreen": [0, 100, 0], + "darkgrey": [169, 169, 169], + "darkkhaki": [189, 183, 107], + "darkmagenta": [139, 0, 139], + "darkolivegreen": [85, 107, 47], + "darkorange": [255, 140, 0], + "darkorchid": [153, 50, 204], + "darkred": [139, 0, 0], + "darksalmon": [233, 150, 122], + "darkseagreen": [143, 188, 143], + "darkslateblue": [72, 61, 139], + "darkslategray": [47, 79, 79], + "darkslategrey": [47, 79, 79], + "darkturquoise": [0, 206, 209], + "darkviolet": [148, 0, 211], + "deeppink": [255, 20, 147], + "deepskyblue": [0, 191, 255], + "dimgray": [105, 105, 105], + "dimgrey": [105, 105, 105], + "dodgerblue": [30, 144, 255], + "firebrick": [178, 34, 34], + "floralwhite": [255, 250, 240], + "forestgreen": [34, 139, 34], + "fuchsia": [255, 0, 255], + "gainsboro": [220, 220, 220], + "ghostwhite": [248, 248, 255], + "gold": [255, 215, 0], + "goldenrod": [218, 165, 32], + "gray": [128, 128, 128], + "green": [0, 128, 0], + "greenyellow": [173, 255, 47], + "grey": [128, 128, 128], + "honeydew": [240, 255, 240], + "hotpink": [255, 105, 180], + "indianred": [205, 92, 92], + "indigo": [75, 0, 130], + "ivory": [255, 255, 240], + "khaki": [240, 230, 140], + "lavender": [230, 230, 250], + "lavenderblush": [255, 240, 245], + "lawngreen": [124, 252, 0], + "lemonchiffon": [255, 250, 205], + "lightblue": [173, 216, 230], + "lightcoral": [240, 128, 128], + "lightcyan": [224, 255, 255], + "lightgoldenrodyellow": [250, 250, 210], + "lightgray": [211, 211, 211], + "lightgreen": [144, 238, 144], + "lightgrey": [211, 211, 211], + "lightpink": [255, 182, 193], + "lightsalmon": [255, 160, 122], + "lightseagreen": [32, 178, 170], + "lightskyblue": [135, 206, 250], + "lightslategray": [119, 136, 153], + "lightslategrey": [119, 136, 153], + "lightsteelblue": [176, 196, 222], + "lightyellow": [255, 255, 224], + "lime": [0, 255, 0], + "limegreen": [50, 205, 50], + "linen": [250, 240, 230], + "magenta": [255, 0, 255], + "maroon": [128, 0, 0], + "mediumaquamarine": [102, 205, 170], + "mediumblue": [0, 0, 205], + "mediumorchid": [186, 85, 211], + "mediumpurple": [147, 112, 219], + "mediumseagreen": [60, 179, 113], + "mediumslateblue": [123, 104, 238], + "mediumspringgreen": [0, 250, 154], + "mediumturquoise": [72, 209, 204], + "mediumvioletred": [199, 21, 133], + "midnightblue": [25, 25, 112], + "mintcream": [245, 255, 250], + "mistyrose": [255, 228, 225], + "moccasin": [255, 228, 181], + "navajowhite": [255, 222, 173], + "navy": [0, 0, 128], + "oldlace": [253, 245, 230], + "olive": [128, 128, 0], + "olivedrab": [107, 142, 35], + "orange": [255, 165, 0], + "orangered": [255, 69, 0], + "orchid": [218, 112, 214], + "palegoldenrod": [238, 232, 170], + "palegreen": [152, 251, 152], + "paleturquoise": [175, 238, 238], + "palevioletred": [219, 112, 147], + "papayawhip": [255, 239, 213], + "peachpuff": [255, 218, 185], + "peru": [205, 133, 63], + "pink": [255, 192, 203], + "plum": [221, 160, 221], + "powderblue": [176, 224, 230], + "purple": [128, 0, 128], + "rebeccapurple": [102, 51, 153], + "red": [255, 0, 0], + "rosybrown": [188, 143, 143], + "royalblue": [65, 105, 225], + "saddlebrown": [139, 69, 19], + "salmon": [250, 128, 114], + "sandybrown": [244, 164, 96], + "seagreen": [46, 139, 87], + "seashell": [255, 245, 238], + "sienna": [160, 82, 45], + "silver": [192, 192, 192], + "skyblue": [135, 206, 235], + "slateblue": [106, 90, 205], + "slategray": [112, 128, 144], + "slategrey": [112, 128, 144], + "snow": [255, 250, 250], + "springgreen": [0, 255, 127], + "steelblue": [70, 130, 180], + "tan": [210, 180, 140], + "teal": [0, 128, 128], + "thistle": [216, 191, 216], + "tomato": [255, 99, 71], + "turquoise": [64, 224, 208], + "violet": [238, 130, 238], + "wheat": [245, 222, 179], + "white": [255, 255, 255], + "whitesmoke": [245, 245, 245], + "yellow": [255, 255, 0], + "yellowgreen": [154, 205, 50] + }; + + /* MIT license */ + + + var colorString = { + getRgba: getRgba, + getHsla: getHsla, + getRgb: getRgb, + getHsl: getHsl, + getHwb: getHwb, + getAlpha: getAlpha, + + hexString: hexString, + rgbString: rgbString, + rgbaString: rgbaString, + percentString: percentString, + percentaString: percentaString, + hslString: hslString, + hslaString: hslaString, + hwbString: hwbString, + keyword: keyword + }; + + function getRgba(string) { + if (!string) { + return; + } + var abbr = /^#([a-fA-F0-9]{3,4})$/i, + hex = /^#([a-fA-F0-9]{6}([a-fA-F0-9]{2})?)$/i, + rgba = /^rgba?\(\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*,\s*([+-]?\d+)\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i, + per = /^rgba?\(\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*,\s*([+-]?[\d\.]+)\%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)$/i, + keyword = /(\w+)/; + + var rgb = [0, 0, 0], + a = 1, + match = string.match(abbr), + hexAlpha = ""; + if (match) { + match = match[1]; + hexAlpha = match[3]; + for (var i = 0; i < rgb.length; i++) { + rgb[i] = parseInt(match[i] + match[i], 16); + } + if (hexAlpha) { + a = Math.round((parseInt(hexAlpha + hexAlpha, 16) / 255) * 100) / 100; + } + } else if (match = string.match(hex)) { + hexAlpha = match[2]; + match = match[1]; + for (var i = 0; i < rgb.length; i++) { + rgb[i] = parseInt(match.slice(i * 2, i * 2 + 2), 16); + } + if (hexAlpha) { + a = Math.round((parseInt(hexAlpha, 16) / 255) * 100) / 100; + } + } else if (match = string.match(rgba)) { + for (var i = 0; i < rgb.length; i++) { + rgb[i] = parseInt(match[i + 1]); + } + a = parseFloat(match[4]); + } else if (match = string.match(per)) { + for (var i = 0; i < rgb.length; i++) { + rgb[i] = Math.round(parseFloat(match[i + 1]) * 2.55); + } + a = parseFloat(match[4]); + } else if (match = string.match(keyword)) { + if (match[1] == "transparent") { + return [0, 0, 0, 0]; + } + rgb = colorName[match[1]]; + if (!rgb) { + return; + } + } + + for (var i = 0; i < rgb.length; i++) { + rgb[i] = scale(rgb[i], 0, 255); + } + if (!a && a != 0) { + a = 1; + } else { + a = scale(a, 0, 1); + } + rgb[3] = a; + return rgb; + } + + function getHsla(string) { + if (!string) { + return; + } + var hsl = /^hsla?\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/; + var match = string.match(hsl); + if (match) { + var alpha = parseFloat(match[4]); + var h = scale(parseInt(match[1]), 0, 360), + s = scale(parseFloat(match[2]), 0, 100), + l = scale(parseFloat(match[3]), 0, 100), + a = scale(isNaN(alpha) ? 1 : alpha, 0, 1); + return [h, s, l, a]; + } + } + + function getHwb(string) { + if (!string) { + return; + } + var hwb = /^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/; + var match = string.match(hwb); + if (match) { + var alpha = parseFloat(match[4]); + var h = scale(parseInt(match[1]), 0, 360), + w = scale(parseFloat(match[2]), 0, 100), + b = scale(parseFloat(match[3]), 0, 100), + a = scale(isNaN(alpha) ? 1 : alpha, 0, 1); + return [h, w, b, a]; + } + } + + function getRgb(string) { + var rgba = getRgba(string); + return rgba && rgba.slice(0, 3); + } + + function getHsl(string) { + var hsla = getHsla(string); + return hsla && hsla.slice(0, 3); + } + + function getAlpha(string) { + var vals = getRgba(string); + if (vals) { + return vals[3]; + } else if (vals = getHsla(string)) { + return vals[3]; + } else if (vals = getHwb(string)) { + return vals[3]; + } + } + +// generators + function hexString(rgba, a) { + var a = (a !== undefined && rgba.length === 3) ? a : rgba[3]; + return "#" + hexDouble(rgba[0]) + + hexDouble(rgba[1]) + + hexDouble(rgba[2]) + + ( + (a >= 0 && a < 1) + ? hexDouble(Math.round(a * 255)) + : "" + ); + } + + function rgbString(rgba, alpha) { + if (alpha < 1 || (rgba[3] && rgba[3] < 1)) { + return rgbaString(rgba, alpha); + } + return "rgb(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] + ")"; + } + + function rgbaString(rgba, alpha) { + if (alpha === undefined) { + alpha = (rgba[3] !== undefined ? rgba[3] : 1); + } + return "rgba(" + rgba[0] + ", " + rgba[1] + ", " + rgba[2] + + ", " + alpha + ")"; + } + + function percentString(rgba, alpha) { + if (alpha < 1 || (rgba[3] && rgba[3] < 1)) { + return percentaString(rgba, alpha); + } + var r = Math.round(rgba[0] / 255 * 100), + g = Math.round(rgba[1] / 255 * 100), + b = Math.round(rgba[2] / 255 * 100); + + return "rgb(" + r + "%, " + g + "%, " + b + "%)"; + } + + function percentaString(rgba, alpha) { + var r = Math.round(rgba[0] / 255 * 100), + g = Math.round(rgba[1] / 255 * 100), + b = Math.round(rgba[2] / 255 * 100); + return "rgba(" + r + "%, " + g + "%, " + b + "%, " + (alpha || rgba[3] || 1) + ")"; + } + + function hslString(hsla, alpha) { + if (alpha < 1 || (hsla[3] && hsla[3] < 1)) { + return hslaString(hsla, alpha); + } + return "hsl(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%)"; + } + + function hslaString(hsla, alpha) { + if (alpha === undefined) { + alpha = (hsla[3] !== undefined ? hsla[3] : 1); + } + return "hsla(" + hsla[0] + ", " + hsla[1] + "%, " + hsla[2] + "%, " + + alpha + ")"; + } + +// hwb is a bit different than rgb(a) & hsl(a) since there is no alpha specific syntax +// (hwb have alpha optional & 1 is default value) + function hwbString(hwb, alpha) { + if (alpha === undefined) { + alpha = (hwb[3] !== undefined ? hwb[3] : 1); + } + return "hwb(" + hwb[0] + ", " + hwb[1] + "%, " + hwb[2] + "%" + + (alpha !== undefined && alpha !== 1 ? ", " + alpha : "") + ")"; + } + + function keyword(rgb) { + return reverseNames[rgb.slice(0, 3)]; + } + +// helpers + function scale(num, min, max) { + return Math.min(Math.max(min, num), max); + } + + function hexDouble(num) { + var str = num.toString(16).toUpperCase(); + return (str.length < 2) ? "0" + str : str; + } + + +//create a list of reverse color names + var reverseNames = {}; + for (var name in colorName) { + reverseNames[colorName[name]] = name; + } + + /* MIT license */ + + + var Color = function (obj) { + if (obj instanceof Color) { + return obj; + } + if (!(this instanceof Color)) { + return new Color(obj); + } + + this.valid = false; + this.values = { + rgb: [0, 0, 0], + hsl: [0, 0, 0], + hsv: [0, 0, 0], + hwb: [0, 0, 0], + cmyk: [0, 0, 0, 0], + alpha: 1 + }; + + // parse Color() argument + var vals; + if (typeof obj === 'string') { + vals = colorString.getRgba(obj); + if (vals) { + this.setValues('rgb', vals); + } else if (vals = colorString.getHsla(obj)) { + this.setValues('hsl', vals); + } else if (vals = colorString.getHwb(obj)) { + this.setValues('hwb', vals); + } + } else if (typeof obj === 'object') { + vals = obj; + if (vals.r !== undefined || vals.red !== undefined) { + this.setValues('rgb', vals); + } else if (vals.l !== undefined || vals.lightness !== undefined) { + this.setValues('hsl', vals); + } else if (vals.v !== undefined || vals.value !== undefined) { + this.setValues('hsv', vals); + } else if (vals.w !== undefined || vals.whiteness !== undefined) { + this.setValues('hwb', vals); + } else if (vals.c !== undefined || vals.cyan !== undefined) { + this.setValues('cmyk', vals); + } + } + }; + + Color.prototype = { + isValid: function () { + return this.valid; + }, + rgb: function () { + return this.setSpace('rgb', arguments); + }, + hsl: function () { + return this.setSpace('hsl', arguments); + }, + hsv: function () { + return this.setSpace('hsv', arguments); + }, + hwb: function () { + return this.setSpace('hwb', arguments); + }, + cmyk: function () { + return this.setSpace('cmyk', arguments); + }, + + rgbArray: function () { + return this.values.rgb; + }, + hslArray: function () { + return this.values.hsl; + }, + hsvArray: function () { + return this.values.hsv; + }, + hwbArray: function () { + var values = this.values; + if (values.alpha !== 1) { + return values.hwb.concat([values.alpha]); + } + return values.hwb; + }, + cmykArray: function () { + return this.values.cmyk; + }, + rgbaArray: function () { + var values = this.values; + return values.rgb.concat([values.alpha]); + }, + hslaArray: function () { + var values = this.values; + return values.hsl.concat([values.alpha]); + }, + alpha: function (val) { + if (val === undefined) { + return this.values.alpha; + } + this.setValues('alpha', val); + return this; + }, + + red: function (val) { + return this.setChannel('rgb', 0, val); + }, + green: function (val) { + return this.setChannel('rgb', 1, val); + }, + blue: function (val) { + return this.setChannel('rgb', 2, val); + }, + hue: function (val) { + if (val) { + val %= 360; + val = val < 0 ? 360 + val : val; + } + return this.setChannel('hsl', 0, val); + }, + saturation: function (val) { + return this.setChannel('hsl', 1, val); + }, + lightness: function (val) { + return this.setChannel('hsl', 2, val); + }, + saturationv: function (val) { + return this.setChannel('hsv', 1, val); + }, + whiteness: function (val) { + return this.setChannel('hwb', 1, val); + }, + blackness: function (val) { + return this.setChannel('hwb', 2, val); + }, + value: function (val) { + return this.setChannel('hsv', 2, val); + }, + cyan: function (val) { + return this.setChannel('cmyk', 0, val); + }, + magenta: function (val) { + return this.setChannel('cmyk', 1, val); + }, + yellow: function (val) { + return this.setChannel('cmyk', 2, val); + }, + black: function (val) { + return this.setChannel('cmyk', 3, val); + }, + + hexString: function () { + return colorString.hexString(this.values.rgb); + }, + rgbString: function () { + return colorString.rgbString(this.values.rgb, this.values.alpha); + }, + rgbaString: function () { + return colorString.rgbaString(this.values.rgb, this.values.alpha); + }, + percentString: function () { + return colorString.percentString(this.values.rgb, this.values.alpha); + }, + hslString: function () { + return colorString.hslString(this.values.hsl, this.values.alpha); + }, + hslaString: function () { + return colorString.hslaString(this.values.hsl, this.values.alpha); + }, + hwbString: function () { + return colorString.hwbString(this.values.hwb, this.values.alpha); + }, + keyword: function () { + return colorString.keyword(this.values.rgb, this.values.alpha); + }, + + rgbNumber: function () { + var rgb = this.values.rgb; + return (rgb[0] << 16) | (rgb[1] << 8) | rgb[2]; + }, + + luminosity: function () { + // http://www.w3.org/TR/WCAG20/#relativeluminancedef + var rgb = this.values.rgb; + var lum = []; + for (var i = 0; i < rgb.length; i++) { + var chan = rgb[i] / 255; + lum[i] = (chan <= 0.03928) ? chan / 12.92 : Math.pow(((chan + 0.055) / 1.055), 2.4); + } + return 0.2126 * lum[0] + 0.7152 * lum[1] + 0.0722 * lum[2]; + }, + + contrast: function (color2) { + // http://www.w3.org/TR/WCAG20/#contrast-ratiodef + var lum1 = this.luminosity(); + var lum2 = color2.luminosity(); + if (lum1 > lum2) { + return (lum1 + 0.05) / (lum2 + 0.05); + } + return (lum2 + 0.05) / (lum1 + 0.05); + }, + + level: function (color2) { + var contrastRatio = this.contrast(color2); + if (contrastRatio >= 7.1) { + return 'AAA'; + } + + return (contrastRatio >= 4.5) ? 'AA' : ''; + }, + + dark: function () { + // YIQ equation from http://24ways.org/2010/calculating-color-contrast + var rgb = this.values.rgb; + var yiq = (rgb[0] * 299 + rgb[1] * 587 + rgb[2] * 114) / 1000; + return yiq < 128; + }, + + light: function () { + return !this.dark(); + }, + + negate: function () { + var rgb = []; + for (var i = 0; i < 3; i++) { + rgb[i] = 255 - this.values.rgb[i]; + } + this.setValues('rgb', rgb); + return this; + }, + + lighten: function (ratio) { + var hsl = this.values.hsl; + hsl[2] += hsl[2] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + darken: function (ratio) { + var hsl = this.values.hsl; + hsl[2] -= hsl[2] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + saturate: function (ratio) { + var hsl = this.values.hsl; + hsl[1] += hsl[1] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + desaturate: function (ratio) { + var hsl = this.values.hsl; + hsl[1] -= hsl[1] * ratio; + this.setValues('hsl', hsl); + return this; + }, + + whiten: function (ratio) { + var hwb = this.values.hwb; + hwb[1] += hwb[1] * ratio; + this.setValues('hwb', hwb); + return this; + }, + + blacken: function (ratio) { + var hwb = this.values.hwb; + hwb[2] += hwb[2] * ratio; + this.setValues('hwb', hwb); + return this; + }, + + greyscale: function () { + var rgb = this.values.rgb; + // http://en.wikipedia.org/wiki/Grayscale#Converting_color_to_grayscale + var val = rgb[0] * 0.3 + rgb[1] * 0.59 + rgb[2] * 0.11; + this.setValues('rgb', [val, val, val]); + return this; + }, + + clearer: function (ratio) { + var alpha = this.values.alpha; + this.setValues('alpha', alpha - (alpha * ratio)); + return this; + }, + + opaquer: function (ratio) { + var alpha = this.values.alpha; + this.setValues('alpha', alpha + (alpha * ratio)); + return this; + }, + + rotate: function (degrees) { + var hsl = this.values.hsl; + var hue = (hsl[0] + degrees) % 360; + hsl[0] = hue < 0 ? 360 + hue : hue; + this.setValues('hsl', hsl); + return this; + }, + + /** + * Ported from sass implementation in C + * https://github.com/sass/libsass/blob/0e6b4a2850092356aa3ece07c6b249f0221caced/functions.cpp#L209 + */ + mix: function (mixinColor, weight) { + var color1 = this; + var color2 = mixinColor; + var p = weight === undefined ? 0.5 : weight; + + var w = 2 * p - 1; + var a = color1.alpha() - color2.alpha(); + + var w1 = (((w * a === -1) ? w : (w + a) / (1 + w * a)) + 1) / 2.0; + var w2 = 1 - w1; + + return this + .rgb( + w1 * color1.red() + w2 * color2.red(), + w1 * color1.green() + w2 * color2.green(), + w1 * color1.blue() + w2 * color2.blue() + ) + .alpha(color1.alpha() * p + color2.alpha() * (1 - p)); + }, + + toJSON: function () { + return this.rgb(); + }, + + clone: function () { + // NOTE(SB): using node-clone creates a dependency to Buffer when using browserify, + // making the final build way to big to embed in Chart.js. So let's do it manually, + // assuming that values to clone are 1 dimension arrays containing only numbers, + // except 'alpha' which is a number. + var result = new Color(); + var source = this.values; + var target = result.values; + var value, type; + + for (var prop in source) { + if (source.hasOwnProperty(prop)) { + value = source[prop]; + type = ({}).toString.call(value); + if (type === '[object Array]') { + target[prop] = value.slice(0); + } else if (type === '[object Number]') { + target[prop] = value; + } else { + console.error('unexpected color value:', value); + } + } + } + + return result; + } + }; + + Color.prototype.spaces = { + rgb: ['red', 'green', 'blue'], + hsl: ['hue', 'saturation', 'lightness'], + hsv: ['hue', 'saturation', 'value'], + hwb: ['hue', 'whiteness', 'blackness'], + cmyk: ['cyan', 'magenta', 'yellow', 'black'] + }; + + Color.prototype.maxes = { + rgb: [255, 255, 255], + hsl: [360, 100, 100], + hsv: [360, 100, 100], + hwb: [360, 100, 100], + cmyk: [100, 100, 100, 100] + }; + + Color.prototype.getValues = function (space) { + var values = this.values; + var vals = {}; + + for (var i = 0; i < space.length; i++) { + vals[space.charAt(i)] = values[space][i]; + } + + if (values.alpha !== 1) { + vals.a = values.alpha; + } + + // {r: 255, g: 255, b: 255, a: 0.4} + return vals; + }; + + Color.prototype.setValues = function (space, vals) { + var values = this.values; + var spaces = this.spaces; + var maxes = this.maxes; + var alpha = 1; + var i; + + this.valid = true; + + if (space === 'alpha') { + alpha = vals; + } else if (vals.length) { + // [10, 10, 10] + values[space] = vals.slice(0, space.length); + alpha = vals[space.length]; + } else if (vals[space.charAt(0)] !== undefined) { + // {r: 10, g: 10, b: 10} + for (i = 0; i < space.length; i++) { + values[space][i] = vals[space.charAt(i)]; + } + + alpha = vals.a; + } else if (vals[spaces[space][0]] !== undefined) { + // {red: 10, green: 10, blue: 10} + var chans = spaces[space]; + + for (i = 0; i < space.length; i++) { + values[space][i] = vals[chans[i]]; + } + + alpha = vals.alpha; + } + + values.alpha = Math.max(0, Math.min(1, (alpha === undefined ? values.alpha : alpha))); + + if (space === 'alpha') { + return false; + } + + var capped; + + // cap values of the space prior converting all values + for (i = 0; i < space.length; i++) { + capped = Math.max(0, Math.min(maxes[space][i], values[space][i])); + values[space][i] = Math.round(capped); + } + + // convert to all the other color spaces + for (var sname in spaces) { + if (sname !== space) { + values[sname] = colorConvert[space][sname](values[space]); + } + } + + return true; + }; + + Color.prototype.setSpace = function (space, args) { + var vals = args[0]; + + if (vals === undefined) { + // color.rgb() + return this.getValues(space); + } + + // color.rgb(10, 10, 10) + if (typeof vals === 'number') { + vals = Array.prototype.slice.call(args); + } + + this.setValues(space, vals); + return this; + }; + + Color.prototype.setChannel = function (space, index, val) { + var svalues = this.values[space]; + if (val === undefined) { + // color.red() + return svalues[index]; + } else if (val === svalues[index]) { + // color.red(color.red()) + return this; + } + + // color.red(100) + svalues[index] = val; + this.setValues(space, svalues); + + return this; + }; + + if (typeof window !== 'undefined') { + window.Color = Color; + } + + var chartjsColor = Color; + + /** + * @namespace Chart.helpers + */ + var helpers = { + /** + * An empty function that can be used, for example, for optional callback. + */ + noop: function () { + }, + + /** + * Returns a unique id, sequentially generated from a global variable. + * @returns {number} + * @function + */ + uid: (function () { + var id = 0; + return function () { + return id++; + }; + }()), + + /** + * Returns true if `value` is neither null nor undefined, else returns false. + * @param {*} value - The value to test. + * @returns {boolean} + * @since 2.7.0 + */ + isNullOrUndef: function (value) { + return value === null || typeof value === 'undefined'; + }, + + /** + * Returns true if `value` is an array (including typed arrays), else returns false. + * @param {*} value - The value to test. + * @returns {boolean} + * @function + */ + isArray: function (value) { + if (Array.isArray && Array.isArray(value)) { + return true; + } + var type = Object.prototype.toString.call(value); + if (type.substr(0, 7) === '[object' && type.substr(-6) === 'Array]') { + return true; + } + return false; + }, + + /** + * Returns true if `value` is an object (excluding null), else returns false. + * @param {*} value - The value to test. + * @returns {boolean} + * @since 2.7.0 + */ + isObject: function (value) { + return value !== null && Object.prototype.toString.call(value) === '[object Object]'; + }, + + /** + * Returns true if `value` is a finite number, else returns false + * @param {*} value - The value to test. + * @returns {boolean} + */ + isFinite: function (value) { + return (typeof value === 'number' || value instanceof Number) && isFinite(value); + }, + + /** + * Returns `value` if defined, else returns `defaultValue`. + * @param {*} value - The value to return if defined. + * @param {*} defaultValue - The value to return if `value` is undefined. + * @returns {*} + */ + valueOrDefault: function (value, defaultValue) { + return typeof value === 'undefined' ? defaultValue : value; + }, + + /** + * Returns value at the given `index` in array if defined, else returns `defaultValue`. + * @param {Array} value - The array to lookup for value at `index`. + * @param {number} index - The index in `value` to lookup for value. + * @param {*} defaultValue - The value to return if `value[index]` is undefined. + * @returns {*} + */ + valueAtIndexOrDefault: function (value, index, defaultValue) { + return helpers.valueOrDefault(helpers.isArray(value) ? value[index] : value, defaultValue); + }, + + /** + * Calls `fn` with the given `args` in the scope defined by `thisArg` and returns the + * value returned by `fn`. If `fn` is not a function, this method returns undefined. + * @param {function} fn - The function to call. + * @param {Array|undefined|null} args - The arguments with which `fn` should be called. + * @param {object} [thisArg] - The value of `this` provided for the call to `fn`. + * @returns {*} + */ + callback: function (fn, args, thisArg) { + if (fn && typeof fn.call === 'function') { + return fn.apply(thisArg, args); + } + }, + + /** + * Note(SB) for performance sake, this method should only be used when loopable type + * is unknown or in none intensive code (not called often and small loopable). Else + * it's preferable to use a regular for() loop and save extra function calls. + * @param {object|Array} loopable - The object or array to be iterated. + * @param {function} fn - The function to call for each item. + * @param {object} [thisArg] - The value of `this` provided for the call to `fn`. + * @param {boolean} [reverse] - If true, iterates backward on the loopable. + */ + each: function (loopable, fn, thisArg, reverse) { + var i, len, keys; + if (helpers.isArray(loopable)) { + len = loopable.length; + if (reverse) { + for (i = len - 1; i >= 0; i--) { + fn.call(thisArg, loopable[i], i); + } + } else { + for (i = 0; i < len; i++) { + fn.call(thisArg, loopable[i], i); + } + } + } else if (helpers.isObject(loopable)) { + keys = Object.keys(loopable); + len = keys.length; + for (i = 0; i < len; i++) { + fn.call(thisArg, loopable[keys[i]], keys[i]); + } + } + }, + + /** + * Returns true if the `a0` and `a1` arrays have the same content, else returns false. + * @see https://stackoverflow.com/a/14853974 + * @param {Array} a0 - The array to compare + * @param {Array} a1 - The array to compare + * @returns {boolean} + */ + arrayEquals: function (a0, a1) { + var i, ilen, v0, v1; + + if (!a0 || !a1 || a0.length !== a1.length) { + return false; + } + + for (i = 0, ilen = a0.length; i < ilen; ++i) { + v0 = a0[i]; + v1 = a1[i]; + + if (v0 instanceof Array && v1 instanceof Array) { + if (!helpers.arrayEquals(v0, v1)) { + return false; + } + } else if (v0 !== v1) { + // NOTE: two different object instances will never be equal: {x:20} != {x:20} + return false; + } + } + + return true; + }, + + /** + * Returns a deep copy of `source` without keeping references on objects and arrays. + * @param {*} source - The value to clone. + * @returns {*} + */ + clone: function (source) { + if (helpers.isArray(source)) { + return source.map(helpers.clone); + } + + if (helpers.isObject(source)) { + var target = {}; + var keys = Object.keys(source); + var klen = keys.length; + var k = 0; + + for (; k < klen; ++k) { + target[keys[k]] = helpers.clone(source[keys[k]]); + } + + return target; + } + + return source; + }, + + /** + * The default merger when Chart.helpers.merge is called without merger option. + * Note(SB): also used by mergeConfig and mergeScaleConfig as fallback. + * @private + */ + _merger: function (key, target, source, options) { + var tval = target[key]; + var sval = source[key]; + + if (helpers.isObject(tval) && helpers.isObject(sval)) { + helpers.merge(tval, sval, options); + } else { + target[key] = helpers.clone(sval); + } + }, + + /** + * Merges source[key] in target[key] only if target[key] is undefined. + * @private + */ + _mergerIf: function (key, target, source) { + var tval = target[key]; + var sval = source[key]; + + if (helpers.isObject(tval) && helpers.isObject(sval)) { + helpers.mergeIf(tval, sval); + } else if (!target.hasOwnProperty(key)) { + target[key] = helpers.clone(sval); + } + }, + + /** + * Recursively deep copies `source` properties into `target` with the given `options`. + * IMPORTANT: `target` is not cloned and will be updated with `source` properties. + * @param {object} target - The target object in which all sources are merged into. + * @param {object|object[]} source - Object(s) to merge into `target`. + * @param {object} [options] - Merging options: + * @param {function} [options.merger] - The merge method (key, target, source, options) + * @returns {object} The `target` object. + */ + merge: function (target, source, options) { + var sources = helpers.isArray(source) ? source : [source]; + var ilen = sources.length; + var merge, i, keys, klen, k; + + if (!helpers.isObject(target)) { + return target; + } + + options = options || {}; + merge = options.merger || helpers._merger; + + for (i = 0; i < ilen; ++i) { + source = sources[i]; + if (!helpers.isObject(source)) { + continue; + } + + keys = Object.keys(source); + for (k = 0, klen = keys.length; k < klen; ++k) { + merge(keys[k], target, source, options); + } + } + + return target; + }, + + /** + * Recursively deep copies `source` properties into `target` *only* if not defined in target. + * IMPORTANT: `target` is not cloned and will be updated with `source` properties. + * @param {object} target - The target object in which all sources are merged into. + * @param {object|object[]} source - Object(s) to merge into `target`. + * @returns {object} The `target` object. + */ + mergeIf: function (target, source) { + return helpers.merge(target, source, {merger: helpers._mergerIf}); + }, + + /** + * Applies the contents of two or more objects together into the first object. + * @param {object} target - The target object in which all objects are merged into. + * @param {object} arg1 - Object containing additional properties to merge in target. + * @param {object} argN - Additional objects containing properties to merge in target. + * @returns {object} The `target` object. + */ + extend: function (target) { + var setFn = function (value, key) { + target[key] = value; + }; + for (var i = 1, ilen = arguments.length; i < ilen; ++i) { + helpers.each(arguments[i], setFn); + } + return target; + }, + + /** + * Basic javascript inheritance based on the model created in Backbone.js + */ + inherits: function (extensions) { + var me = this; + var ChartElement = (extensions && extensions.hasOwnProperty('constructor')) ? extensions.constructor : function () { + return me.apply(this, arguments); + }; + + var Surrogate = function () { + this.constructor = ChartElement; + }; + + Surrogate.prototype = me.prototype; + ChartElement.prototype = new Surrogate(); + ChartElement.extend = helpers.inherits; + + if (extensions) { + helpers.extend(ChartElement.prototype, extensions); + } + + ChartElement.__super__ = me.prototype; + return ChartElement; + } + }; + + var helpers_core = helpers; + +// DEPRECATIONS + + /** + * Provided for backward compatibility, use Chart.helpers.callback instead. + * @function Chart.helpers.callCallback + * @deprecated since version 2.6.0 + * @todo remove at version 3 + * @private + */ + helpers.callCallback = helpers.callback; + + /** + * Provided for backward compatibility, use Array.prototype.indexOf instead. + * Array.prototype.indexOf compatibility: Chrome, Opera, Safari, FF1.5+, IE9+ + * @function Chart.helpers.indexOf + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ + helpers.indexOf = function (array, item, fromIndex) { + return Array.prototype.indexOf.call(array, item, fromIndex); + }; + + /** + * Provided for backward compatibility, use Chart.helpers.valueOrDefault instead. + * @function Chart.helpers.getValueOrDefault + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ + helpers.getValueOrDefault = helpers.valueOrDefault; + + /** + * Provided for backward compatibility, use Chart.helpers.valueAtIndexOrDefault instead. + * @function Chart.helpers.getValueAtIndexOrDefault + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ + helpers.getValueAtIndexOrDefault = helpers.valueAtIndexOrDefault; + + /** + * Easing functions adapted from Robert Penner's easing equations. + * @namespace Chart.helpers.easingEffects + * @see http://www.robertpenner.com/easing/ + */ + var effects = { + linear: function (t) { + return t; + }, + + easeInQuad: function (t) { + return t * t; + }, + + easeOutQuad: function (t) { + return -t * (t - 2); + }, + + easeInOutQuad: function (t) { + if ((t /= 0.5) < 1) { + return 0.5 * t * t; + } + return -0.5 * ((--t) * (t - 2) - 1); + }, + + easeInCubic: function (t) { + return t * t * t; + }, + + easeOutCubic: function (t) { + return (t = t - 1) * t * t + 1; + }, + + easeInOutCubic: function (t) { + if ((t /= 0.5) < 1) { + return 0.5 * t * t * t; + } + return 0.5 * ((t -= 2) * t * t + 2); + }, + + easeInQuart: function (t) { + return t * t * t * t; + }, + + easeOutQuart: function (t) { + return -((t = t - 1) * t * t * t - 1); + }, + + easeInOutQuart: function (t) { + if ((t /= 0.5) < 1) { + return 0.5 * t * t * t * t; + } + return -0.5 * ((t -= 2) * t * t * t - 2); + }, + + easeInQuint: function (t) { + return t * t * t * t * t; + }, + + easeOutQuint: function (t) { + return (t = t - 1) * t * t * t * t + 1; + }, + + easeInOutQuint: function (t) { + if ((t /= 0.5) < 1) { + return 0.5 * t * t * t * t * t; + } + return 0.5 * ((t -= 2) * t * t * t * t + 2); + }, + + easeInSine: function (t) { + return -Math.cos(t * (Math.PI / 2)) + 1; + }, + + easeOutSine: function (t) { + return Math.sin(t * (Math.PI / 2)); + }, + + easeInOutSine: function (t) { + return -0.5 * (Math.cos(Math.PI * t) - 1); + }, + + easeInExpo: function (t) { + return (t === 0) ? 0 : Math.pow(2, 10 * (t - 1)); + }, + + easeOutExpo: function (t) { + return (t === 1) ? 1 : -Math.pow(2, -10 * t) + 1; + }, + + easeInOutExpo: function (t) { + if (t === 0) { + return 0; + } + if (t === 1) { + return 1; + } + if ((t /= 0.5) < 1) { + return 0.5 * Math.pow(2, 10 * (t - 1)); + } + return 0.5 * (-Math.pow(2, -10 * --t) + 2); + }, + + easeInCirc: function (t) { + if (t >= 1) { + return t; + } + return -(Math.sqrt(1 - t * t) - 1); + }, + + easeOutCirc: function (t) { + return Math.sqrt(1 - (t = t - 1) * t); + }, + + easeInOutCirc: function (t) { + if ((t /= 0.5) < 1) { + return -0.5 * (Math.sqrt(1 - t * t) - 1); + } + return 0.5 * (Math.sqrt(1 - (t -= 2) * t) + 1); + }, + + easeInElastic: function (t) { + var s = 1.70158; + var p = 0; + var a = 1; + if (t === 0) { + return 0; + } + if (t === 1) { + return 1; + } + if (!p) { + p = 0.3; + } + if (a < 1) { + a = 1; + s = p / 4; + } else { + s = p / (2 * Math.PI) * Math.asin(1 / a); + } + return -(a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p)); + }, + + easeOutElastic: function (t) { + var s = 1.70158; + var p = 0; + var a = 1; + if (t === 0) { + return 0; + } + if (t === 1) { + return 1; + } + if (!p) { + p = 0.3; + } + if (a < 1) { + a = 1; + s = p / 4; + } else { + s = p / (2 * Math.PI) * Math.asin(1 / a); + } + return a * Math.pow(2, -10 * t) * Math.sin((t - s) * (2 * Math.PI) / p) + 1; + }, + + easeInOutElastic: function (t) { + var s = 1.70158; + var p = 0; + var a = 1; + if (t === 0) { + return 0; + } + if ((t /= 0.5) === 2) { + return 1; + } + if (!p) { + p = 0.45; + } + if (a < 1) { + a = 1; + s = p / 4; + } else { + s = p / (2 * Math.PI) * Math.asin(1 / a); + } + if (t < 1) { + return -0.5 * (a * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p)); + } + return a * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - s) * (2 * Math.PI) / p) * 0.5 + 1; + }, + easeInBack: function (t) { + var s = 1.70158; + return t * t * ((s + 1) * t - s); + }, + + easeOutBack: function (t) { + var s = 1.70158; + return (t = t - 1) * t * ((s + 1) * t + s) + 1; + }, + + easeInOutBack: function (t) { + var s = 1.70158; + if ((t /= 0.5) < 1) { + return 0.5 * (t * t * (((s *= (1.525)) + 1) * t - s)); + } + return 0.5 * ((t -= 2) * t * (((s *= (1.525)) + 1) * t + s) + 2); + }, + + easeInBounce: function (t) { + return 1 - effects.easeOutBounce(1 - t); + }, + + easeOutBounce: function (t) { + if (t < (1 / 2.75)) { + return 7.5625 * t * t; + } + if (t < (2 / 2.75)) { + return 7.5625 * (t -= (1.5 / 2.75)) * t + 0.75; + } + if (t < (2.5 / 2.75)) { + return 7.5625 * (t -= (2.25 / 2.75)) * t + 0.9375; + } + return 7.5625 * (t -= (2.625 / 2.75)) * t + 0.984375; + }, + + easeInOutBounce: function (t) { + if (t < 0.5) { + return effects.easeInBounce(t * 2) * 0.5; + } + return effects.easeOutBounce(t * 2 - 1) * 0.5 + 0.5; + } + }; + + var helpers_easing = { + effects: effects + }; + +// DEPRECATIONS + + /** + * Provided for backward compatibility, use Chart.helpers.easing.effects instead. + * @function Chart.helpers.easingEffects + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ + helpers_core.easingEffects = effects; + + var PI = Math.PI; + var RAD_PER_DEG = PI / 180; + var DOUBLE_PI = PI * 2; + var HALF_PI = PI / 2; + var QUARTER_PI = PI / 4; + var TWO_THIRDS_PI = PI * 2 / 3; + + /** + * @namespace Chart.helpers.canvas + */ + var exports$1 = { + /** + * Clears the entire canvas associated to the given `chart`. + * @param {Chart} chart - The chart for which to clear the canvas. + */ + clear: function (chart) { + chart.ctx.clearRect(0, 0, chart.width, chart.height); + }, + + /** + * Creates a "path" for a rectangle with rounded corners at position (x, y) with a + * given size (width, height) and the same `radius` for all corners. + * @param {CanvasRenderingContext2D} ctx - The canvas 2D Context. + * @param {number} x - The x axis of the coordinate for the rectangle starting point. + * @param {number} y - The y axis of the coordinate for the rectangle starting point. + * @param {number} width - The rectangle's width. + * @param {number} height - The rectangle's height. + * @param {number} radius - The rounded amount (in pixels) for the four corners. + * @todo handle `radius` as top-left, top-right, bottom-right, bottom-left array/object? + */ + roundedRect: function (ctx, x, y, width, height, radius) { + if (radius) { + var r = Math.min(radius, height / 2, width / 2); + var left = x + r; + var top = y + r; + var right = x + width - r; + var bottom = y + height - r; + + ctx.moveTo(x, top); + if (left < right && top < bottom) { + ctx.arc(left, top, r, -PI, -HALF_PI); + ctx.arc(right, top, r, -HALF_PI, 0); + ctx.arc(right, bottom, r, 0, HALF_PI); + ctx.arc(left, bottom, r, HALF_PI, PI); + } else if (left < right) { + ctx.moveTo(left, y); + ctx.arc(right, top, r, -HALF_PI, HALF_PI); + ctx.arc(left, top, r, HALF_PI, PI + HALF_PI); + } else if (top < bottom) { + ctx.arc(left, top, r, -PI, 0); + ctx.arc(left, bottom, r, 0, PI); + } else { + ctx.arc(left, top, r, -PI, PI); + } + ctx.closePath(); + ctx.moveTo(x, y); + } else { + ctx.rect(x, y, width, height); + } + }, + + drawPoint: function (ctx, style, radius, x, y, rotation) { + var type, xOffset, yOffset, size, cornerRadius; + var rad = (rotation || 0) * RAD_PER_DEG; + + if (style && typeof style === 'object') { + type = style.toString(); + if (type === '[object HTMLImageElement]' || type === '[object HTMLCanvasElement]') { + ctx.drawImage(style, x - style.width / 2, y - style.height / 2, style.width, style.height); + return; + } + } + + if (isNaN(radius) || radius <= 0) { + return; + } + + ctx.beginPath(); + + switch (style) { + // Default includes circle + default: + ctx.arc(x, y, radius, 0, DOUBLE_PI); + ctx.closePath(); + break; + case 'triangle': + ctx.moveTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); + rad += TWO_THIRDS_PI; + ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); + rad += TWO_THIRDS_PI; + ctx.lineTo(x + Math.sin(rad) * radius, y - Math.cos(rad) * radius); + ctx.closePath(); + break; + case 'rectRounded': + // NOTE: the rounded rect implementation changed to use `arc` instead of + // `quadraticCurveTo` since it generates better results when rect is + // almost a circle. 0.516 (instead of 0.5) produces results with visually + // closer proportion to the previous impl and it is inscribed in the + // circle with `radius`. For more details, see the following PRs: + // https://github.com/chartjs/Chart.js/issues/5597 + // https://github.com/chartjs/Chart.js/issues/5858 + cornerRadius = radius * 0.516; + size = radius - cornerRadius; + xOffset = Math.cos(rad + QUARTER_PI) * size; + yOffset = Math.sin(rad + QUARTER_PI) * size; + ctx.arc(x - xOffset, y - yOffset, cornerRadius, rad - PI, rad - HALF_PI); + ctx.arc(x + yOffset, y - xOffset, cornerRadius, rad - HALF_PI, rad); + ctx.arc(x + xOffset, y + yOffset, cornerRadius, rad, rad + HALF_PI); + ctx.arc(x - yOffset, y + xOffset, cornerRadius, rad + HALF_PI, rad + PI); + ctx.closePath(); + break; + case 'rect': + if (!rotation) { + size = Math.SQRT1_2 * radius; + ctx.rect(x - size, y - size, 2 * size, 2 * size); + break; + } + rad += QUARTER_PI; + /* falls through */ + case 'rectRot': + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + yOffset, y - xOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.lineTo(x - yOffset, y + xOffset); + ctx.closePath(); + break; + case 'crossRot': + rad += QUARTER_PI; + /* falls through */ + case 'cross': + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.moveTo(x + yOffset, y - xOffset); + ctx.lineTo(x - yOffset, y + xOffset); + break; + case 'star': + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.moveTo(x + yOffset, y - xOffset); + ctx.lineTo(x - yOffset, y + xOffset); + rad += QUARTER_PI; + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + ctx.moveTo(x + yOffset, y - xOffset); + ctx.lineTo(x - yOffset, y + xOffset); + break; + case 'line': + xOffset = Math.cos(rad) * radius; + yOffset = Math.sin(rad) * radius; + ctx.moveTo(x - xOffset, y - yOffset); + ctx.lineTo(x + xOffset, y + yOffset); + break; + case 'dash': + ctx.moveTo(x, y); + ctx.lineTo(x + Math.cos(rad) * radius, y + Math.sin(rad) * radius); + break; + } + + ctx.fill(); + ctx.stroke(); + }, + + /** + * Returns true if the point is inside the rectangle + * @param {object} point - The point to test + * @param {object} area - The rectangle + * @returns {boolean} + * @private + */ + _isPointInArea: function (point, area) { + var epsilon = 1e-6; // 1e-6 is margin in pixels for accumulated error. + + return point.x > area.left - epsilon && point.x < area.right + epsilon && + point.y > area.top - epsilon && point.y < area.bottom + epsilon; + }, + + clipArea: function (ctx, area) { + ctx.save(); + ctx.beginPath(); + ctx.rect(area.left, area.top, area.right - area.left, area.bottom - area.top); + ctx.clip(); + }, + + unclipArea: function (ctx) { + ctx.restore(); + }, + + lineTo: function (ctx, previous, target, flip) { + var stepped = target.steppedLine; + if (stepped) { + if (stepped === 'middle') { + var midpoint = (previous.x + target.x) / 2.0; + ctx.lineTo(midpoint, flip ? target.y : previous.y); + ctx.lineTo(midpoint, flip ? previous.y : target.y); + } else if ((stepped === 'after' && !flip) || (stepped !== 'after' && flip)) { + ctx.lineTo(previous.x, target.y); + } else { + ctx.lineTo(target.x, previous.y); + } + ctx.lineTo(target.x, target.y); + return; + } + + if (!target.tension) { + ctx.lineTo(target.x, target.y); + return; + } + + ctx.bezierCurveTo( + flip ? previous.controlPointPreviousX : previous.controlPointNextX, + flip ? previous.controlPointPreviousY : previous.controlPointNextY, + flip ? target.controlPointNextX : target.controlPointPreviousX, + flip ? target.controlPointNextY : target.controlPointPreviousY, + target.x, + target.y); + } + }; + + var helpers_canvas = exports$1; + +// DEPRECATIONS + + /** + * Provided for backward compatibility, use Chart.helpers.canvas.clear instead. + * @namespace Chart.helpers.clear + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ + helpers_core.clear = exports$1.clear; + + /** + * Provided for backward compatibility, use Chart.helpers.canvas.roundedRect instead. + * @namespace Chart.helpers.drawRoundedRectangle + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ + helpers_core.drawRoundedRectangle = function (ctx) { + ctx.beginPath(); + exports$1.roundedRect.apply(exports$1, arguments); + }; + + var defaults = { + /** + * @private + */ + _set: function (scope, values) { + return helpers_core.merge(this[scope] || (this[scope] = {}), values); + } + }; + + defaults._set('global', { + defaultColor: 'rgba(0,0,0,0.1)', + defaultFontColor: '#666', + defaultFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", + defaultFontSize: 12, + defaultFontStyle: 'normal', + defaultLineHeight: 1.2, + showLines: true + }); + + var core_defaults = defaults; + + var valueOrDefault = helpers_core.valueOrDefault; + + /** + * Converts the given font object into a CSS font string. + * @param {object} font - A font object. + * @return {string} The CSS font string. See https://developer.mozilla.org/en-US/docs/Web/CSS/font + * @private + */ + function toFontString(font) { + if (!font || helpers_core.isNullOrUndef(font.size) || helpers_core.isNullOrUndef(font.family)) { + return null; + } + + return (font.style ? font.style + ' ' : '') + + (font.weight ? font.weight + ' ' : '') + + font.size + 'px ' + + font.family; + } + + /** + * @alias Chart.helpers.options + * @namespace + */ + var helpers_options = { + /** + * Converts the given line height `value` in pixels for a specific font `size`. + * @param {number|string} value - The lineHeight to parse (eg. 1.6, '14px', '75%', '1.6em'). + * @param {number} size - The font size (in pixels) used to resolve relative `value`. + * @returns {number} The effective line height in pixels (size * 1.2 if value is invalid). + * @see https://developer.mozilla.org/en-US/docs/Web/CSS/line-height + * @since 2.7.0 + */ + toLineHeight: function (value, size) { + var matches = ('' + value).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/); + if (!matches || matches[1] === 'normal') { + return size * 1.2; + } + + value = +matches[2]; + + switch (matches[3]) { + case 'px': + return value; + case '%': + value /= 100; + break; + default: + break; + } + + return size * value; + }, + + /** + * Converts the given value into a padding object with pre-computed width/height. + * @param {number|object} value - If a number, set the value to all TRBL component, + * else, if and object, use defined properties and sets undefined ones to 0. + * @returns {object} The padding values (top, right, bottom, left, width, height) + * @since 2.7.0 + */ + toPadding: function (value) { + var t, r, b, l; + + if (helpers_core.isObject(value)) { + t = +value.top || 0; + r = +value.right || 0; + b = +value.bottom || 0; + l = +value.left || 0; + } else { + t = r = b = l = +value || 0; + } + + return { + top: t, + right: r, + bottom: b, + left: l, + height: t + b, + width: l + r + }; + }, + + /** + * Parses font options and returns the font object. + * @param {object} options - A object that contains font options to be parsed. + * @return {object} The font object. + * @todo Support font.* options and renamed to toFont(). + * @private + */ + _parseFont: function (options) { + var globalDefaults = core_defaults.global; + var size = valueOrDefault(options.fontSize, globalDefaults.defaultFontSize); + var font = { + family: valueOrDefault(options.fontFamily, globalDefaults.defaultFontFamily), + lineHeight: helpers_core.options.toLineHeight(valueOrDefault(options.lineHeight, globalDefaults.defaultLineHeight), size), + size: size, + style: valueOrDefault(options.fontStyle, globalDefaults.defaultFontStyle), + weight: null, + string: '' + }; + + font.string = toFontString(font); + return font; + }, + + /** + * Evaluates the given `inputs` sequentially and returns the first defined value. + * @param {Array} inputs - An array of values, falling back to the last value. + * @param {object} [context] - If defined and the current value is a function, the value + * is called with `context` as first argument and the result becomes the new input. + * @param {number} [index] - If defined and the current value is an array, the value + * at `index` become the new input. + * @since 2.7.0 + */ + resolve: function (inputs, context, index) { + var i, ilen, value; + + for (i = 0, ilen = inputs.length; i < ilen; ++i) { + value = inputs[i]; + if (value === undefined) { + continue; + } + if (context !== undefined && typeof value === 'function') { + value = value(context); + } + if (index !== undefined && helpers_core.isArray(value)) { + value = value[index]; + } + if (value !== undefined) { + return value; + } + } + } + }; + + var helpers$1 = helpers_core; + var easing = helpers_easing; + var canvas = helpers_canvas; + var options = helpers_options; + helpers$1.easing = easing; + helpers$1.canvas = canvas; + helpers$1.options = options; + + function interpolate(start, view, model, ease) { + var keys = Object.keys(model); + var i, ilen, key, actual, origin, target, type, c0, c1; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + + target = model[key]; + + // if a value is added to the model after pivot() has been called, the view + // doesn't contain it, so let's initialize the view to the target value. + if (!view.hasOwnProperty(key)) { + view[key] = target; + } + + actual = view[key]; + + if (actual === target || key[0] === '_') { + continue; + } + + if (!start.hasOwnProperty(key)) { + start[key] = actual; + } + + origin = start[key]; + + type = typeof target; + + if (type === typeof origin) { + if (type === 'string') { + c0 = chartjsColor(origin); + if (c0.valid) { + c1 = chartjsColor(target); + if (c1.valid) { + view[key] = c1.mix(c0, ease).rgbString(); + continue; } + } + } else if (helpers$1.isFinite(origin) && helpers$1.isFinite(target)) { + view[key] = origin + (target - origin) * ease; + continue; + } + } - function o(t) { - if (t) { - var e = t.match(/^hwb\(\s*([+-]?\d+)(?:deg)?\s*,\s*([+-]?[\d\.]+)%\s*,\s*([+-]?[\d\.]+)%\s*(?:,\s*([+-]?[\d\.]+)\s*)?\)/); - if (e) { - var i = parseFloat(e[4]); - return [d(parseInt(e[1]), 0, 360), d(parseFloat(e[2]), 0, 100), d(parseFloat(e[3]), 0, 100), d(isNaN(i) ? 1 : i, 0, 1)] - } - } + view[key] = target; + } + } + + var Element = function (configuration) { + helpers$1.extend(this, configuration); + this.initialize.apply(this, arguments); + }; + + helpers$1.extend(Element.prototype, { + + initialize: function () { + this.hidden = false; + }, + + pivot: function () { + var me = this; + if (!me._view) { + me._view = helpers$1.clone(me._model); + } + me._start = {}; + return me; + }, + + transition: function (ease) { + var me = this; + var model = me._model; + var start = me._start; + var view = me._view; + + // No animation -> No Transition + if (!model || ease === 1) { + me._view = model; + me._start = null; + return me; + } + + if (!view) { + view = me._view = {}; + } + + if (!start) { + start = me._start = {}; + } + + interpolate(start, view, model, ease); + + return me; + }, + + tooltipPosition: function () { + return { + x: this._model.x, + y: this._model.y + }; + }, + + hasValue: function () { + return helpers$1.isNumber(this._model.x) && helpers$1.isNumber(this._model.y); + } + }); + + Element.extend = helpers$1.inherits; + + var core_element = Element; + + var exports$2 = core_element.extend({ + chart: null, // the animation associated chart instance + currentStep: 0, // the current animation step + numSteps: 60, // default number of steps + easing: '', // the easing to use for this animation + render: null, // render function used by the animation service + + onAnimationProgress: null, // user specified callback to fire on each step of the animation + onAnimationComplete: null, // user specified callback to fire when the animation finishes + }); + + var core_animation = exports$2; + +// DEPRECATIONS + + /** + * Provided for backward compatibility, use Chart.Animation instead + * @prop Chart.Animation#animationObject + * @deprecated since version 2.6.0 + * @todo remove at version 3 + */ + Object.defineProperty(exports$2.prototype, 'animationObject', { + get: function () { + return this; + } + }); + + /** + * Provided for backward compatibility, use Chart.Animation#chart instead + * @prop Chart.Animation#chartInstance + * @deprecated since version 2.6.0 + * @todo remove at version 3 + */ + Object.defineProperty(exports$2.prototype, 'chartInstance', { + get: function () { + return this.chart; + }, + set: function (value) { + this.chart = value; + } + }); + + core_defaults._set('global', { + animation: { + duration: 1000, + easing: 'easeOutQuart', + onProgress: helpers$1.noop, + onComplete: helpers$1.noop + } + }); + + var core_animations = { + animations: [], + request: null, + + /** + * @param {Chart} chart - The chart to animate. + * @param {Chart.Animation} animation - The animation that we will animate. + * @param {number} duration - The animation duration in ms. + * @param {boolean} lazy - if true, the chart is not marked as animating to enable more responsive interactions + */ + addAnimation: function (chart, animation, duration, lazy) { + var animations = this.animations; + var i, ilen; + + animation.chart = chart; + animation.startTime = Date.now(); + animation.duration = duration; + + if (!lazy) { + chart.animating = true; + } + + for (i = 0, ilen = animations.length; i < ilen; ++i) { + if (animations[i].chart === chart) { + animations[i] = animation; + return; + } + } + + animations.push(animation); + + // If there are no animations queued, manually kickstart a digest, for lack of a better word + if (animations.length === 1) { + this.requestAnimationFrame(); + } + }, + + cancelAnimation: function (chart) { + var index = helpers$1.findIndex(this.animations, function (animation) { + return animation.chart === chart; + }); + + if (index !== -1) { + this.animations.splice(index, 1); + chart.animating = false; + } + }, + + requestAnimationFrame: function () { + var me = this; + if (me.request === null) { + // Skip animation frame requests until the active one is executed. + // This can happen when processing mouse events, e.g. 'mousemove' + // and 'mouseout' events will trigger multiple renders. + me.request = helpers$1.requestAnimFrame.call(window, function () { + me.request = null; + me.startDigest(); + }); + } + }, + + /** + * @private + */ + startDigest: function () { + var me = this; + + me.advance(); + + // Do we have more stuff to animate? + if (me.animations.length > 0) { + me.requestAnimationFrame(); + } + }, + + /** + * @private + */ + advance: function () { + var animations = this.animations; + var animation, chart, numSteps, nextStep; + var i = 0; + + // 1 animation per chart, so we are looping charts here + while (i < animations.length) { + animation = animations[i]; + chart = animation.chart; + numSteps = animation.numSteps; + + // Make sure that currentStep starts at 1 + // https://github.com/chartjs/Chart.js/issues/6104 + nextStep = Math.floor((Date.now() - animation.startTime) / animation.duration * numSteps) + 1; + animation.currentStep = Math.min(nextStep, numSteps); + + helpers$1.callback(animation.render, [chart, animation], chart); + helpers$1.callback(animation.onAnimationProgress, [animation], chart); + + if (animation.currentStep >= numSteps) { + helpers$1.callback(animation.onAnimationComplete, [animation], chart); + chart.animating = false; + animations.splice(i, 1); + } else { + ++i; + } + } + } + }; + + var resolve = helpers$1.options.resolve; + + var arrayEvents = ['push', 'pop', 'shift', 'splice', 'unshift']; + + /** + * Hooks the array methods that add or remove values ('push', pop', 'shift', 'splice', + * 'unshift') and notify the listener AFTER the array has been altered. Listeners are + * called on the 'onData*' callbacks (e.g. onDataPush, etc.) with same arguments. + */ + function listenArrayEvents(array, listener) { + if (array._chartjs) { + array._chartjs.listeners.push(listener); + return; + } + + Object.defineProperty(array, '_chartjs', { + configurable: true, + enumerable: false, + value: { + listeners: [listener] + } + }); + + arrayEvents.forEach(function (key) { + var method = 'onData' + key.charAt(0).toUpperCase() + key.slice(1); + var base = array[key]; + + Object.defineProperty(array, key, { + configurable: true, + enumerable: false, + value: function () { + var args = Array.prototype.slice.call(arguments); + var res = base.apply(this, args); + + helpers$1.each(array._chartjs.listeners, function (object) { + if (typeof object[method] === 'function') { + object[method].apply(object, args); } + }); + + return res; + } + }); + }); + } + + /** + * Removes the given array event listener and cleanup extra attached properties (such as + * the _chartjs stub and overridden methods) if array doesn't have any more listeners. + */ + function unlistenArrayEvents(array, listener) { + var stub = array._chartjs; + if (!stub) { + return; + } + + var listeners = stub.listeners; + var index = listeners.indexOf(listener); + if (index !== -1) { + listeners.splice(index, 1); + } + + if (listeners.length > 0) { + return; + } + + arrayEvents.forEach(function (key) { + delete array[key]; + }); + + delete array._chartjs; + } + +// Base class for all dataset controllers (line, bar, etc) + var DatasetController = function (chart, datasetIndex) { + this.initialize(chart, datasetIndex); + }; + + helpers$1.extend(DatasetController.prototype, { + + /** + * Element type used to generate a meta dataset (e.g. Chart.element.Line). + * @type {Chart.core.element} + */ + datasetElementType: null, + + /** + * Element type used to generate a meta data (e.g. Chart.element.Point). + * @type {Chart.core.element} + */ + dataElementType: null, + + initialize: function (chart, datasetIndex) { + var me = this; + me.chart = chart; + me.index = datasetIndex; + me.linkScales(); + me.addElements(); + }, + + updateIndex: function (datasetIndex) { + this.index = datasetIndex; + }, + + linkScales: function () { + var me = this; + var meta = me.getMeta(); + var dataset = me.getDataset(); + + if (meta.xAxisID === null || !(meta.xAxisID in me.chart.scales)) { + meta.xAxisID = dataset.xAxisID || me.chart.options.scales.xAxes[0].id; + } + if (meta.yAxisID === null || !(meta.yAxisID in me.chart.scales)) { + meta.yAxisID = dataset.yAxisID || me.chart.options.scales.yAxes[0].id; + } + }, + + getDataset: function () { + return this.chart.data.datasets[this.index]; + }, + + getMeta: function () { + return this.chart.getDatasetMeta(this.index); + }, + + getScaleForId: function (scaleID) { + return this.chart.scales[scaleID]; + }, + + /** + * @private + */ + _getValueScaleId: function () { + return this.getMeta().yAxisID; + }, + + /** + * @private + */ + _getIndexScaleId: function () { + return this.getMeta().xAxisID; + }, + + /** + * @private + */ + _getValueScale: function () { + return this.getScaleForId(this._getValueScaleId()); + }, + + /** + * @private + */ + _getIndexScale: function () { + return this.getScaleForId(this._getIndexScaleId()); + }, + + reset: function () { + this.update(true); + }, + + /** + * @private + */ + destroy: function () { + if (this._data) { + unlistenArrayEvents(this._data, this); + } + }, + + createMetaDataset: function () { + var me = this; + var type = me.datasetElementType; + return type && new type({ + _chart: me.chart, + _datasetIndex: me.index + }); + }, + + createMetaData: function (index) { + var me = this; + var type = me.dataElementType; + return type && new type({ + _chart: me.chart, + _datasetIndex: me.index, + _index: index + }); + }, + + addElements: function () { + var me = this; + var meta = me.getMeta(); + var data = me.getDataset().data || []; + var metaData = meta.data; + var i, ilen; + + for (i = 0, ilen = data.length; i < ilen; ++i) { + metaData[i] = metaData[i] || me.createMetaData(i); + } + + meta.dataset = meta.dataset || me.createMetaDataset(); + }, + + addElementAndReset: function (index) { + var element = this.createMetaData(index); + this.getMeta().data.splice(index, 0, element); + this.updateElement(element, index, true); + }, + + buildOrUpdateElements: function () { + var me = this; + var dataset = me.getDataset(); + var data = dataset.data || (dataset.data = []); + + // In order to correctly handle data addition/deletion animation (an thus simulate + // real-time charts), we need to monitor these data modifications and synchronize + // the internal meta data accordingly. + if (me._data !== data) { + if (me._data) { + // This case happens when the user replaced the data array instance. + unlistenArrayEvents(me._data, me); + } + + if (data && Object.isExtensible(data)) { + listenArrayEvents(data, me); + } + me._data = data; + } + + // Re-sync meta data in case the user replaced the data array or if we missed + // any updates and so make sure that we handle number of datapoints changing. + me.resyncElements(); + }, + + update: helpers$1.noop, + + transition: function (easingValue) { + var meta = this.getMeta(); + var elements = meta.data || []; + var ilen = elements.length; + var i = 0; + + for (; i < ilen; ++i) { + elements[i].transition(easingValue); + } + + if (meta.dataset) { + meta.dataset.transition(easingValue); + } + }, + + draw: function () { + var meta = this.getMeta(); + var elements = meta.data || []; + var ilen = elements.length; + var i = 0; + + if (meta.dataset) { + meta.dataset.draw(); + } + + for (; i < ilen; ++i) { + elements[i].draw(); + } + }, + + removeHoverStyle: function (element) { + helpers$1.merge(element._model, element.$previousStyle || {}); + delete element.$previousStyle; + }, + + setHoverStyle: function (element) { + var dataset = this.chart.data.datasets[element._datasetIndex]; + var index = element._index; + var custom = element.custom || {}; + var model = element._model; + var getHoverColor = helpers$1.getHoverColor; + + element.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth + }; + + model.backgroundColor = resolve([custom.hoverBackgroundColor, dataset.hoverBackgroundColor, getHoverColor(model.backgroundColor)], undefined, index); + model.borderColor = resolve([custom.hoverBorderColor, dataset.hoverBorderColor, getHoverColor(model.borderColor)], undefined, index); + model.borderWidth = resolve([custom.hoverBorderWidth, dataset.hoverBorderWidth, model.borderWidth], undefined, index); + }, + + /** + * @private + */ + resyncElements: function () { + var me = this; + var meta = me.getMeta(); + var data = me.getDataset().data; + var numMeta = meta.data.length; + var numData = data.length; + + if (numData < numMeta) { + meta.data.splice(numData, numMeta - numData); + } else if (numData > numMeta) { + me.insertElements(numMeta, numData - numMeta); + } + }, + + /** + * @private + */ + insertElements: function (start, count) { + for (var i = 0; i < count; ++i) { + this.addElementAndReset(start + i); + } + }, + + /** + * @private + */ + onDataPush: function () { + var count = arguments.length; + this.insertElements(this.getDataset().data.length - count, count); + }, + + /** + * @private + */ + onDataPop: function () { + this.getMeta().data.pop(); + }, + + /** + * @private + */ + onDataShift: function () { + this.getMeta().data.shift(); + }, + + /** + * @private + */ + onDataSplice: function (start, count) { + this.getMeta().data.splice(start, count); + this.insertElements(start, arguments.length - 2); + }, + + /** + * @private + */ + onDataUnshift: function () { + this.insertElements(0, arguments.length); + } + }); + + DatasetController.extend = helpers$1.inherits; + + var core_datasetController = DatasetController; + + core_defaults._set('global', { + elements: { + arc: { + backgroundColor: core_defaults.global.defaultColor, + borderColor: '#fff', + borderWidth: 2, + borderAlign: 'center' + } + } + }); + + var element_arc = core_element.extend({ + inLabelRange: function (mouseX) { + var vm = this._view; + + if (vm) { + return (Math.pow(mouseX - vm.x, 2) < Math.pow(vm.radius + vm.hoverRadius, 2)); + } + return false; + }, + + inRange: function (chartX, chartY) { + var vm = this._view; + + if (vm) { + var pointRelativePosition = helpers$1.getAngleFromPoint(vm, {x: chartX, y: chartY}); + var angle = pointRelativePosition.angle; + var distance = pointRelativePosition.distance; + + // Sanitise angle range + var startAngle = vm.startAngle; + var endAngle = vm.endAngle; + while (endAngle < startAngle) { + endAngle += 2.0 * Math.PI; + } + while (angle > endAngle) { + angle -= 2.0 * Math.PI; + } + while (angle < startAngle) { + angle += 2.0 * Math.PI; + } + + // Check if within the range of the open/close angle + var betweenAngles = (angle >= startAngle && angle <= endAngle); + var withinRadius = (distance >= vm.innerRadius && distance <= vm.outerRadius); + + return (betweenAngles && withinRadius); + } + return false; + }, + + getCenterPoint: function () { + var vm = this._view; + var halfAngle = (vm.startAngle + vm.endAngle) / 2; + var halfRadius = (vm.innerRadius + vm.outerRadius) / 2; + return { + x: vm.x + Math.cos(halfAngle) * halfRadius, + y: vm.y + Math.sin(halfAngle) * halfRadius + }; + }, + + getArea: function () { + var vm = this._view; + return Math.PI * ((vm.endAngle - vm.startAngle) / (2 * Math.PI)) * (Math.pow(vm.outerRadius, 2) - Math.pow(vm.innerRadius, 2)); + }, + + tooltipPosition: function () { + var vm = this._view; + var centreAngle = vm.startAngle + ((vm.endAngle - vm.startAngle) / 2); + var rangeFromCentre = (vm.outerRadius - vm.innerRadius) / 2 + vm.innerRadius; + + return { + x: vm.x + (Math.cos(centreAngle) * rangeFromCentre), + y: vm.y + (Math.sin(centreAngle) * rangeFromCentre) + }; + }, + + draw: function () { + var ctx = this._chart.ctx; + var vm = this._view; + var sA = vm.startAngle; + var eA = vm.endAngle; + var pixelMargin = (vm.borderAlign === 'inner') ? 0.33 : 0; + var angleMargin; + + ctx.save(); + + ctx.beginPath(); + ctx.arc(vm.x, vm.y, Math.max(vm.outerRadius - pixelMargin, 0), sA, eA); + ctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true); + ctx.closePath(); + + ctx.fillStyle = vm.backgroundColor; + ctx.fill(); + + if (vm.borderWidth) { + if (vm.borderAlign === 'inner') { + // Draw an inner border by cliping the arc and drawing a double-width border + // Enlarge the clipping arc by 0.33 pixels to eliminate glitches between borders + ctx.beginPath(); + angleMargin = pixelMargin / vm.outerRadius; + ctx.arc(vm.x, vm.y, vm.outerRadius, sA - angleMargin, eA + angleMargin); + if (vm.innerRadius > pixelMargin) { + angleMargin = pixelMargin / vm.innerRadius; + ctx.arc(vm.x, vm.y, vm.innerRadius - pixelMargin, eA + angleMargin, sA - angleMargin, true); + } else { + ctx.arc(vm.x, vm.y, pixelMargin, eA + Math.PI / 2, sA - Math.PI / 2); + } + ctx.closePath(); + ctx.clip(); + + ctx.beginPath(); + ctx.arc(vm.x, vm.y, vm.outerRadius, sA, eA); + ctx.arc(vm.x, vm.y, vm.innerRadius, eA, sA, true); + ctx.closePath(); + + ctx.lineWidth = vm.borderWidth * 2; + ctx.lineJoin = 'round'; + } else { + ctx.lineWidth = vm.borderWidth; + ctx.lineJoin = 'bevel'; + } + + ctx.strokeStyle = vm.borderColor; + ctx.stroke(); + } + + ctx.restore(); + } + }); + + var valueOrDefault$1 = helpers$1.valueOrDefault; + + var defaultColor = core_defaults.global.defaultColor; + + core_defaults._set('global', { + elements: { + line: { + tension: 0.4, + backgroundColor: defaultColor, + borderWidth: 3, + borderColor: defaultColor, + borderCapStyle: 'butt', + borderDash: [], + borderDashOffset: 0.0, + borderJoinStyle: 'miter', + capBezierPoints: true, + fill: true, // do we fill in the area between the line and its base axis + } + } + }); + + var element_line = core_element.extend({ + draw: function () { + var me = this; + var vm = me._view; + var ctx = me._chart.ctx; + var spanGaps = vm.spanGaps; + var points = me._children.slice(); // clone array + var globalDefaults = core_defaults.global; + var globalOptionLineElements = globalDefaults.elements.line; + var lastDrawnIndex = -1; + var index, current, previous, currentVM; + + // If we are looping, adding the first point again + if (me._loop && points.length) { + points.push(points[0]); + } + + ctx.save(); + + // Stroke Line Options + ctx.lineCap = vm.borderCapStyle || globalOptionLineElements.borderCapStyle; + + // IE 9 and 10 do not support line dash + if (ctx.setLineDash) { + ctx.setLineDash(vm.borderDash || globalOptionLineElements.borderDash); + } - function s(t, e) { - return void 0 === e && (e = void 0 !== t[3] ? t[3] : 1), "rgba(" + t[0] + ", " + t[1] + ", " + t[2] + ", " + e + ")" + ctx.lineDashOffset = valueOrDefault$1(vm.borderDashOffset, globalOptionLineElements.borderDashOffset); + ctx.lineJoin = vm.borderJoinStyle || globalOptionLineElements.borderJoinStyle; + ctx.lineWidth = valueOrDefault$1(vm.borderWidth, globalOptionLineElements.borderWidth); + ctx.strokeStyle = vm.borderColor || globalDefaults.defaultColor; + + // Stroke Line + ctx.beginPath(); + lastDrawnIndex = -1; + + for (index = 0; index < points.length; ++index) { + current = points[index]; + previous = helpers$1.previousItem(points, index); + currentVM = current._view; + + // First point moves to it's starting position no matter what + if (index === 0) { + if (!currentVM.skip) { + ctx.moveTo(currentVM.x, currentVM.y); + lastDrawnIndex = index; + } + } else { + previous = lastDrawnIndex === -1 ? previous : points[lastDrawnIndex]; + + if (!currentVM.skip) { + if ((lastDrawnIndex !== (index - 1) && !spanGaps) || lastDrawnIndex === -1) { + // There was a gap and this is the first point after the gap + ctx.moveTo(currentVM.x, currentVM.y); + } else { + // Line to next point + helpers$1.canvas.lineTo(ctx, previous._view, current._view); } + lastDrawnIndex = index; + } + } + } + + ctx.stroke(); + ctx.restore(); + } + }); + + var valueOrDefault$2 = helpers$1.valueOrDefault; + + var defaultColor$1 = core_defaults.global.defaultColor; + + core_defaults._set('global', { + elements: { + point: { + radius: 3, + pointStyle: 'circle', + backgroundColor: defaultColor$1, + borderColor: defaultColor$1, + borderWidth: 1, + // Hover + hitRadius: 1, + hoverRadius: 4, + hoverBorderWidth: 1 + } + } + }); + + function xRange(mouseX) { + var vm = this._view; + return vm ? (Math.abs(mouseX - vm.x) < vm.radius + vm.hitRadius) : false; + } + + function yRange(mouseY) { + var vm = this._view; + return vm ? (Math.abs(mouseY - vm.y) < vm.radius + vm.hitRadius) : false; + } + + var element_point = core_element.extend({ + inRange: function (mouseX, mouseY) { + var vm = this._view; + return vm ? ((Math.pow(mouseX - vm.x, 2) + Math.pow(mouseY - vm.y, 2)) < Math.pow(vm.hitRadius + vm.radius, 2)) : false; + }, + + inLabelRange: xRange, + inXRange: xRange, + inYRange: yRange, + + getCenterPoint: function () { + var vm = this._view; + return { + x: vm.x, + y: vm.y + }; + }, + + getArea: function () { + return Math.PI * Math.pow(this._view.radius, 2); + }, + + tooltipPosition: function () { + var vm = this._view; + return { + x: vm.x, + y: vm.y, + padding: vm.radius + vm.borderWidth + }; + }, + + draw: function (chartArea) { + var vm = this._view; + var ctx = this._chart.ctx; + var pointStyle = vm.pointStyle; + var rotation = vm.rotation; + var radius = vm.radius; + var x = vm.x; + var y = vm.y; + var globalDefaults = core_defaults.global; + var defaultColor = globalDefaults.defaultColor; // eslint-disable-line no-shadow + + if (vm.skip) { + return; + } + + // Clipping for Points. + if (chartArea === undefined || helpers$1.canvas._isPointInArea(vm, chartArea)) { + ctx.strokeStyle = vm.borderColor || defaultColor; + ctx.lineWidth = valueOrDefault$2(vm.borderWidth, globalDefaults.elements.point.borderWidth); + ctx.fillStyle = vm.backgroundColor || defaultColor; + helpers$1.canvas.drawPoint(ctx, pointStyle, radius, x, y, rotation); + } + } + }); + + var defaultColor$2 = core_defaults.global.defaultColor; + + core_defaults._set('global', { + elements: { + rectangle: { + backgroundColor: defaultColor$2, + borderColor: defaultColor$2, + borderSkipped: 'bottom', + borderWidth: 0 + } + } + }); + + function isVertical(vm) { + return vm && vm.width !== undefined; + } + + /** + * Helper function to get the bounds of the bar regardless of the orientation + * @param bar {Chart.Element.Rectangle} the bar + * @return {Bounds} bounds of the bar + * @private + */ + function getBarBounds(vm) { + var x1, x2, y1, y2, half; + + if (isVertical(vm)) { + half = vm.width / 2; + x1 = vm.x - half; + x2 = vm.x + half; + y1 = Math.min(vm.y, vm.base); + y2 = Math.max(vm.y, vm.base); + } else { + half = vm.height / 2; + x1 = Math.min(vm.x, vm.base); + x2 = Math.max(vm.x, vm.base); + y1 = vm.y - half; + y2 = vm.y + half; + } + + return { + left: x1, + top: y1, + right: x2, + bottom: y2 + }; + } + + function swap(orig, v1, v2) { + return orig === v1 ? v2 : orig === v2 ? v1 : orig; + } + + function parseBorderSkipped(vm) { + var edge = vm.borderSkipped; + var res = {}; + + if (!edge) { + return res; + } + + if (vm.horizontal) { + if (vm.base > vm.x) { + edge = swap(edge, 'left', 'right'); + } + } else if (vm.base < vm.y) { + edge = swap(edge, 'bottom', 'top'); + } + + res[edge] = true; + return res; + } + + function parseBorderWidth(vm, maxW, maxH) { + var value = vm.borderWidth; + var skip = parseBorderSkipped(vm); + var t, r, b, l; + + if (helpers$1.isObject(value)) { + t = +value.top || 0; + r = +value.right || 0; + b = +value.bottom || 0; + l = +value.left || 0; + } else { + t = r = b = l = +value || 0; + } + + return { + t: skip.top || (t < 0) ? 0 : t > maxH ? maxH : t, + r: skip.right || (r < 0) ? 0 : r > maxW ? maxW : r, + b: skip.bottom || (b < 0) ? 0 : b > maxH ? maxH : b, + l: skip.left || (l < 0) ? 0 : l > maxW ? maxW : l + }; + } + + function boundingRects(vm) { + var bounds = getBarBounds(vm); + var width = bounds.right - bounds.left; + var height = bounds.bottom - bounds.top; + var border = parseBorderWidth(vm, width / 2, height / 2); + + return { + outer: { + x: bounds.left, + y: bounds.top, + w: width, + h: height + }, + inner: { + x: bounds.left + border.l, + y: bounds.top + border.t, + w: width - border.l - border.r, + h: height - border.t - border.b + } + }; + } + + function inRange(vm, x, y) { + var skipX = x === null; + var skipY = y === null; + var bounds = !vm || (skipX && skipY) ? false : getBarBounds(vm); + + return bounds + && (skipX || x >= bounds.left && x <= bounds.right) + && (skipY || y >= bounds.top && y <= bounds.bottom); + } + + var element_rectangle = core_element.extend({ + draw: function () { + var ctx = this._chart.ctx; + var vm = this._view; + var rects = boundingRects(vm); + var outer = rects.outer; + var inner = rects.inner; + + ctx.fillStyle = vm.backgroundColor; + ctx.fillRect(outer.x, outer.y, outer.w, outer.h); + + if (outer.w === inner.w && outer.h === inner.h) { + return; + } + + ctx.save(); + ctx.beginPath(); + ctx.rect(outer.x, outer.y, outer.w, outer.h); + ctx.clip(); + ctx.fillStyle = vm.borderColor; + ctx.rect(inner.x, inner.y, inner.w, inner.h); + ctx.fill('evenodd'); + ctx.restore(); + }, + + height: function () { + var vm = this._view; + return vm.base - vm.y; + }, + + inRange: function (mouseX, mouseY) { + return inRange(this._view, mouseX, mouseY); + }, + + inLabelRange: function (mouseX, mouseY) { + var vm = this._view; + return isVertical(vm) + ? inRange(vm, mouseX, null) + : inRange(vm, null, mouseY); + }, + + inXRange: function (mouseX) { + return inRange(this._view, mouseX, null); + }, + + inYRange: function (mouseY) { + return inRange(this._view, null, mouseY); + }, + + getCenterPoint: function () { + var vm = this._view; + var x, y; + if (isVertical(vm)) { + x = vm.x; + y = (vm.y + vm.base) / 2; + } else { + x = (vm.x + vm.base) / 2; + y = vm.y; + } + + return {x: x, y: y}; + }, + + getArea: function () { + var vm = this._view; + + return isVertical(vm) + ? vm.width * Math.abs(vm.y - vm.base) + : vm.height * Math.abs(vm.x - vm.base); + }, + + tooltipPosition: function () { + var vm = this._view; + return { + x: vm.x, + y: vm.y + }; + } + }); + + var elements = {}; + var Arc = element_arc; + var Line = element_line; + var Point = element_point; + var Rectangle = element_rectangle; + elements.Arc = Arc; + elements.Line = Line; + elements.Point = Point; + elements.Rectangle = Rectangle; + + var resolve$1 = helpers$1.options.resolve; + + core_defaults._set('bar', { + hover: { + mode: 'label' + }, + + scales: { + xAxes: [{ + type: 'category', + categoryPercentage: 0.8, + barPercentage: 0.9, + offset: true, + gridLines: { + offsetGridLines: true + } + }], + + yAxes: [{ + type: 'linear' + }] + } + }); + + /** + * Computes the "optimal" sample size to maintain bars equally sized while preventing overlap. + * @private + */ + function computeMinSampleSize(scale, pixels) { + var min = scale.isHorizontal() ? scale.width : scale.height; + var ticks = scale.getTicks(); + var prev, curr, i, ilen; + + for (i = 1, ilen = pixels.length; i < ilen; ++i) { + min = Math.min(min, Math.abs(pixels[i] - pixels[i - 1])); + } + + for (i = 0, ilen = ticks.length; i < ilen; ++i) { + curr = scale.getPixelForTick(i); + min = i > 0 ? Math.min(min, curr - prev) : min; + prev = curr; + } + + return min; + } + + /** + * Computes an "ideal" category based on the absolute bar thickness or, if undefined or null, + * uses the smallest interval (see computeMinSampleSize) that prevents bar overlapping. This + * mode currently always generates bars equally sized (until we introduce scriptable options?). + * @private + */ + function computeFitCategoryTraits(index, ruler, options) { + var thickness = options.barThickness; + var count = ruler.stackCount; + var curr = ruler.pixels[index]; + var size, ratio; + + if (helpers$1.isNullOrUndef(thickness)) { + size = ruler.min * options.categoryPercentage; + ratio = options.barPercentage; + } else { + // When bar thickness is enforced, category and bar percentages are ignored. + // Note(SB): we could add support for relative bar thickness (e.g. barThickness: '50%') + // and deprecate barPercentage since this value is ignored when thickness is absolute. + size = thickness * count; + ratio = 1; + } + + return { + chunk: size / count, + ratio: ratio, + start: curr - (size / 2) + }; + } + + /** + * Computes an "optimal" category that globally arranges bars side by side (no gap when + * percentage options are 1), based on the previous and following categories. This mode + * generates bars with different widths when data are not evenly spaced. + * @private + */ + function computeFlexCategoryTraits(index, ruler, options) { + var pixels = ruler.pixels; + var curr = pixels[index]; + var prev = index > 0 ? pixels[index - 1] : null; + var next = index < pixels.length - 1 ? pixels[index + 1] : null; + var percent = options.categoryPercentage; + var start, size; + + if (prev === null) { + // first data: its size is double based on the next point or, + // if it's also the last data, we use the scale size. + prev = curr - (next === null ? ruler.end - ruler.start : next - curr); + } + + if (next === null) { + // last data: its size is also double based on the previous point. + next = curr + curr - prev; + } + + start = curr - (curr - Math.min(prev, next)) / 2 * percent; + size = Math.abs(next - prev) / 2 * percent; + + return { + chunk: size / ruler.stackCount, + ratio: options.barPercentage, + start: start + }; + } + + var controller_bar = core_datasetController.extend({ + + dataElementType: elements.Rectangle, + + initialize: function () { + var me = this; + var meta; + + core_datasetController.prototype.initialize.apply(me, arguments); + + meta = me.getMeta(); + meta.stack = me.getDataset().stack; + meta.bar = true; + }, + + update: function (reset) { + var me = this; + var rects = me.getMeta().data; + var i, ilen; + + me._ruler = me.getRuler(); + + for (i = 0, ilen = rects.length; i < ilen; ++i) { + me.updateElement(rects[i], i, reset); + } + }, + + updateElement: function (rectangle, index, reset) { + var me = this; + var meta = me.getMeta(); + var dataset = me.getDataset(); + var options = me._resolveElementOptions(rectangle, index); + + rectangle._xScale = me.getScaleForId(meta.xAxisID); + rectangle._yScale = me.getScaleForId(meta.yAxisID); + rectangle._datasetIndex = me.index; + rectangle._index = index; + rectangle._model = { + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderSkipped: options.borderSkipped, + borderWidth: options.borderWidth, + datasetLabel: dataset.label, + label: me.chart.data.labels[index] + }; + + me._updateElementGeometry(rectangle, index, reset); + + rectangle.pivot(); + }, + + /** + * @private + */ + _updateElementGeometry: function (rectangle, index, reset) { + var me = this; + var model = rectangle._model; + var vscale = me._getValueScale(); + var base = vscale.getBasePixel(); + var horizontal = vscale.isHorizontal(); + var ruler = me._ruler || me.getRuler(); + var vpixels = me.calculateBarValuePixels(me.index, index); + var ipixels = me.calculateBarIndexPixels(me.index, index, ruler); + + model.horizontal = horizontal; + model.base = reset ? base : vpixels.base; + model.x = horizontal ? reset ? base : vpixels.head : ipixels.center; + model.y = horizontal ? ipixels.center : reset ? base : vpixels.head; + model.height = horizontal ? ipixels.size : undefined; + model.width = horizontal ? undefined : ipixels.size; + }, + + /** + * Returns the stacks based on groups and bar visibility. + * @param {number} [last] - The dataset index + * @returns {string[]} The list of stack IDs + * @private + */ + _getStacks: function (last) { + var me = this; + var chart = me.chart; + var scale = me._getIndexScale(); + var stacked = scale.options.stacked; + var ilen = last === undefined ? chart.data.datasets.length : last + 1; + var stacks = []; + var i, meta; + + for (i = 0; i < ilen; ++i) { + meta = chart.getDatasetMeta(i); + if (meta.bar && chart.isDatasetVisible(i) && + (stacked === false || + (stacked === true && stacks.indexOf(meta.stack) === -1) || + (stacked === undefined && (meta.stack === undefined || stacks.indexOf(meta.stack) === -1)))) { + stacks.push(meta.stack); + } + } + + return stacks; + }, + + /** + * Returns the effective number of stacks based on groups and bar visibility. + * @private + */ + getStackCount: function () { + return this._getStacks().length; + }, + + /** + * Returns the stack index for the given dataset based on groups and bar visibility. + * @param {number} [datasetIndex] - The dataset index + * @param {string} [name] - The stack name to find + * @returns {number} The stack index + * @private + */ + getStackIndex: function (datasetIndex, name) { + var stacks = this._getStacks(datasetIndex); + var index = (name !== undefined) + ? stacks.indexOf(name) + : -1; // indexOf returns -1 if element is not present + + return (index === -1) + ? stacks.length - 1 + : index; + }, + + /** + * @private + */ + getRuler: function () { + var me = this; + var scale = me._getIndexScale(); + var stackCount = me.getStackCount(); + var datasetIndex = me.index; + var isHorizontal = scale.isHorizontal(); + var start = isHorizontal ? scale.left : scale.top; + var end = start + (isHorizontal ? scale.width : scale.height); + var pixels = []; + var i, ilen, min; + + for (i = 0, ilen = me.getMeta().data.length; i < ilen; ++i) { + pixels.push(scale.getPixelForValue(null, i, datasetIndex)); + } + + min = helpers$1.isNullOrUndef(scale.options.barThickness) + ? computeMinSampleSize(scale, pixels) + : -1; + + return { + min: min, + pixels: pixels, + start: start, + end: end, + stackCount: stackCount, + scale: scale + }; + }, + + /** + * Note: pixel values are not clamped to the scale area. + * @private + */ + calculateBarValuePixels: function (datasetIndex, index) { + var me = this; + var chart = me.chart; + var meta = me.getMeta(); + var scale = me._getValueScale(); + var isHorizontal = scale.isHorizontal(); + var datasets = chart.data.datasets; + var value = +scale.getRightValue(datasets[datasetIndex].data[index]); + var minBarLength = scale.options.minBarLength; + var stacked = scale.options.stacked; + var stack = meta.stack; + var start = 0; + var i, imeta, ivalue, base, head, size; + + if (stacked || (stacked === undefined && stack !== undefined)) { + for (i = 0; i < datasetIndex; ++i) { + imeta = chart.getDatasetMeta(i); + + if (imeta.bar && + imeta.stack === stack && + imeta.controller._getValueScaleId() === scale.id && + chart.isDatasetVisible(i)) { - function l(t, e) { - return "rgba(" + Math.round(t[0] / 255 * 100) + "%, " + Math.round(t[1] / 255 * 100) + "%, " + Math.round(t[2] / 255 * 100) + "%, " + (e || t[3] || 1) + ")" + ivalue = +scale.getRightValue(datasets[i].data[index]); + if ((value < 0 && ivalue < 0) || (value >= 0 && ivalue > 0)) { + start += ivalue; } + } + } + } + + base = scale.getPixelForValue(start); + head = scale.getPixelForValue(start + value); + size = head - base; + + if (minBarLength !== undefined && Math.abs(size) < minBarLength) { + size = minBarLength; + if (value >= 0 && !isHorizontal || value < 0 && isHorizontal) { + head = base - minBarLength; + } else { + head = base + minBarLength; + } + } + + return { + size: size, + base: base, + head: head, + center: head + size / 2 + }; + }, + + /** + * @private + */ + calculateBarIndexPixels: function (datasetIndex, index, ruler) { + var me = this; + var options = ruler.scale.options; + var range = options.barThickness === 'flex' + ? computeFlexCategoryTraits(index, ruler, options) + : computeFitCategoryTraits(index, ruler, options); + + var stackIndex = me.getStackIndex(datasetIndex, me.getMeta().stack); + var center = range.start + (range.chunk * stackIndex) + (range.chunk / 2); + var size = Math.min( + helpers$1.valueOrDefault(options.maxBarThickness, Infinity), + range.chunk * range.ratio); + + return { + base: center - size / 2, + head: center + size / 2, + center: center, + size: size + }; + }, + + draw: function () { + var me = this; + var chart = me.chart; + var scale = me._getValueScale(); + var rects = me.getMeta().data; + var dataset = me.getDataset(); + var ilen = rects.length; + var i = 0; + + helpers$1.canvas.clipArea(chart.ctx, chart.chartArea); + + for (; i < ilen; ++i) { + if (!isNaN(scale.getRightValue(dataset.data[i]))) { + rects[i].draw(); + } + } + + helpers$1.canvas.unclipArea(chart.ctx); + }, + + /** + * @private + */ + _resolveElementOptions: function (rectangle, index) { + var me = this; + var chart = me.chart; + var datasets = chart.data.datasets; + var dataset = datasets[me.index]; + var custom = rectangle.custom || {}; + var options = chart.options.elements.rectangle; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var keys = [ + 'backgroundColor', + 'borderColor', + 'borderSkipped', + 'borderWidth' + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$1([ + custom[key], + dataset[key], + options[key] + ], context, index); + } + + return values; + } + }); + + var valueOrDefault$3 = helpers$1.valueOrDefault; + var resolve$2 = helpers$1.options.resolve; + + core_defaults._set('bubble', { + hover: { + mode: 'single' + }, + + scales: { + xAxes: [{ + type: 'linear', // bubble should probably use a linear scale by default + position: 'bottom', + id: 'x-axis-0' // need an ID so datasets can reference the scale + }], + yAxes: [{ + type: 'linear', + position: 'left', + id: 'y-axis-0' + }] + }, + + tooltips: { + callbacks: { + title: function () { + // Title doesn't make sense for scatter since we format the data as a point + return ''; + }, + label: function (item, data) { + var datasetLabel = data.datasets[item.datasetIndex].label || ''; + var dataPoint = data.datasets[item.datasetIndex].data[item.index]; + return datasetLabel + ': (' + item.xLabel + ', ' + item.yLabel + ', ' + dataPoint.r + ')'; + } + } + } + }); + + var controller_bubble = core_datasetController.extend({ + /** + * @protected + */ + dataElementType: elements.Point, + + /** + * @protected + */ + update: function (reset) { + var me = this; + var meta = me.getMeta(); + var points = meta.data; + + // Update Points + helpers$1.each(points, function (point, index) { + me.updateElement(point, index, reset); + }); + }, + + /** + * @protected + */ + updateElement: function (point, index, reset) { + var me = this; + var meta = me.getMeta(); + var custom = point.custom || {}; + var xScale = me.getScaleForId(meta.xAxisID); + var yScale = me.getScaleForId(meta.yAxisID); + var options = me._resolveElementOptions(point, index); + var data = me.getDataset().data[index]; + var dsIndex = me.index; + + var x = reset ? xScale.getPixelForDecimal(0.5) : xScale.getPixelForValue(typeof data === 'object' ? data : NaN, index, dsIndex); + var y = reset ? yScale.getBasePixel() : yScale.getPixelForValue(data, index, dsIndex); + + point._xScale = xScale; + point._yScale = yScale; + point._options = options; + point._datasetIndex = dsIndex; + point._index = index; + point._model = { + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: options.borderWidth, + hitRadius: options.hitRadius, + pointStyle: options.pointStyle, + rotation: options.rotation, + radius: reset ? 0 : options.radius, + skip: custom.skip || isNaN(x) || isNaN(y), + x: x, + y: y, + }; + + point.pivot(); + }, + + /** + * @protected + */ + setHoverStyle: function (point) { + var model = point._model; + var options = point._options; + var getHoverColor = helpers$1.getHoverColor; + + point.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth, + radius: model.radius + }; + + model.backgroundColor = valueOrDefault$3(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); + model.borderColor = valueOrDefault$3(options.hoverBorderColor, getHoverColor(options.borderColor)); + model.borderWidth = valueOrDefault$3(options.hoverBorderWidth, options.borderWidth); + model.radius = options.radius + options.hoverRadius; + }, + + /** + * @private + */ + _resolveElementOptions: function (point, index) { + var me = this; + var chart = me.chart; + var datasets = chart.data.datasets; + var dataset = datasets[me.index]; + var custom = point.custom || {}; + var options = chart.options.elements.point; + var data = dataset.data[index]; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var keys = [ + 'backgroundColor', + 'borderColor', + 'borderWidth', + 'hoverBackgroundColor', + 'hoverBorderColor', + 'hoverBorderWidth', + 'hoverRadius', + 'hitRadius', + 'pointStyle', + 'rotation' + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$2([ + custom[key], + dataset[key], + options[key] + ], context, index); + } + + // Custom radius resolution + values.radius = resolve$2([ + custom.radius, + data ? data.r : undefined, + dataset.radius, + options.radius + ], context, index); + + return values; + } + }); + + var resolve$3 = helpers$1.options.resolve; + var valueOrDefault$4 = helpers$1.valueOrDefault; + + core_defaults._set('doughnut', { + animation: { + // Boolean - Whether we animate the rotation of the Doughnut + animateRotate: true, + // Boolean - Whether we animate scaling the Doughnut from the centre + animateScale: false + }, + hover: { + mode: 'single' + }, + legendCallback: function (chart) { + var text = []; + text.push('<ul class="' + chart.id + '-legend">'); + + var data = chart.data; + var datasets = data.datasets; + var labels = data.labels; + + if (datasets.length) { + for (var i = 0; i < datasets[0].data.length; ++i) { + text.push('<li><span style="background-color:' + datasets[0].backgroundColor[i] + '"></span>'); + if (labels[i]) { + text.push(labels[i]); + } + text.push('</li>'); + } + } + + text.push('</ul>'); + return text.join(''); + }, + legend: { + labels: { + generateLabels: function (chart) { + var data = chart.data; + if (data.labels.length && data.datasets.length) { + return data.labels.map(function (label, i) { + var meta = chart.getDatasetMeta(0); + var ds = data.datasets[0]; + var arc = meta.data[i]; + var custom = arc && arc.custom || {}; + var arcOpts = chart.options.elements.arc; + var fill = resolve$3([custom.backgroundColor, ds.backgroundColor, arcOpts.backgroundColor], undefined, i); + var stroke = resolve$3([custom.borderColor, ds.borderColor, arcOpts.borderColor], undefined, i); + var bw = resolve$3([custom.borderWidth, ds.borderWidth, arcOpts.borderWidth], undefined, i); + + return { + text: label, + fillStyle: fill, + strokeStyle: stroke, + lineWidth: bw, + hidden: isNaN(ds.data[i]) || meta.data[i].hidden, + + // Extra data used for toggling the correct item + index: i + }; + }); + } + return []; + } + }, + + onClick: function (e, legendItem) { + var index = legendItem.index; + var chart = this.chart; + var i, ilen, meta; + + for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { + meta = chart.getDatasetMeta(i); + // toggle visibility of index if exists + if (meta.data[index]) { + meta.data[index].hidden = !meta.data[index].hidden; + } + } + + chart.update(); + } + }, - function u(t, e) { - return void 0 === e && (e = void 0 !== t[3] ? t[3] : 1), "hsla(" + t[0] + ", " + t[1] + "%, " + t[2] + "%, " + e + ")" + // The percentage of the chart that we cut out of the middle. + cutoutPercentage: 50, + + // The rotation of the chart, where the first data arc begins. + rotation: Math.PI * -0.5, + + // The total circumference of the chart. + circumference: Math.PI * 2.0, + + // Need to override these to give a nice default + tooltips: { + callbacks: { + title: function () { + return ''; + }, + label: function (tooltipItem, data) { + var dataLabel = data.labels[tooltipItem.index]; + var value = ': ' + data.datasets[tooltipItem.datasetIndex].data[tooltipItem.index]; + + if (helpers$1.isArray(dataLabel)) { + // show value on first line of multiline label + // need to clone because we are changing the value + dataLabel = dataLabel.slice(); + dataLabel[0] += value; + } else { + dataLabel += value; + } + + return dataLabel; + } + } + } + }); + + var controller_doughnut = core_datasetController.extend({ + + dataElementType: elements.Arc, + + linkScales: helpers$1.noop, + + // Get index of the dataset in relation to the visible datasets. This allows determining the inner and outer radius correctly + getRingIndex: function (datasetIndex) { + var ringIndex = 0; + + for (var j = 0; j < datasetIndex; ++j) { + if (this.chart.isDatasetVisible(j)) { + ++ringIndex; + } + } + + return ringIndex; + }, + + update: function (reset) { + var me = this; + var chart = me.chart; + var chartArea = chart.chartArea; + var opts = chart.options; + var availableWidth = chartArea.right - chartArea.left; + var availableHeight = chartArea.bottom - chartArea.top; + var minSize = Math.min(availableWidth, availableHeight); + var offset = {x: 0, y: 0}; + var meta = me.getMeta(); + var arcs = meta.data; + var cutoutPercentage = opts.cutoutPercentage; + var circumference = opts.circumference; + var chartWeight = me._getRingWeight(me.index); + var i, ilen; + + // If the chart's circumference isn't a full circle, calculate minSize as a ratio of the width/height of the arc + if (circumference < Math.PI * 2.0) { + var startAngle = opts.rotation % (Math.PI * 2.0); + startAngle += Math.PI * 2.0 * (startAngle >= Math.PI ? -1 : startAngle < -Math.PI ? 1 : 0); + var endAngle = startAngle + circumference; + var start = {x: Math.cos(startAngle), y: Math.sin(startAngle)}; + var end = {x: Math.cos(endAngle), y: Math.sin(endAngle)}; + var contains0 = (startAngle <= 0 && endAngle >= 0) || (startAngle <= Math.PI * 2.0 && Math.PI * 2.0 <= endAngle); + var contains90 = (startAngle <= Math.PI * 0.5 && Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 2.5 && Math.PI * 2.5 <= endAngle); + var contains180 = (startAngle <= -Math.PI && -Math.PI <= endAngle) || (startAngle <= Math.PI && Math.PI <= endAngle); + var contains270 = (startAngle <= -Math.PI * 0.5 && -Math.PI * 0.5 <= endAngle) || (startAngle <= Math.PI * 1.5 && Math.PI * 1.5 <= endAngle); + var cutout = cutoutPercentage / 100.0; + var min = { + x: contains180 ? -1 : Math.min(start.x * (start.x < 0 ? 1 : cutout), end.x * (end.x < 0 ? 1 : cutout)), + y: contains270 ? -1 : Math.min(start.y * (start.y < 0 ? 1 : cutout), end.y * (end.y < 0 ? 1 : cutout)) + }; + var max = { + x: contains0 ? 1 : Math.max(start.x * (start.x > 0 ? 1 : cutout), end.x * (end.x > 0 ? 1 : cutout)), + y: contains90 ? 1 : Math.max(start.y * (start.y > 0 ? 1 : cutout), end.y * (end.y > 0 ? 1 : cutout)) + }; + var size = {width: (max.x - min.x) * 0.5, height: (max.y - min.y) * 0.5}; + minSize = Math.min(availableWidth / size.width, availableHeight / size.height); + offset = {x: (max.x + min.x) * -0.5, y: (max.y + min.y) * -0.5}; + } + + for (i = 0, ilen = arcs.length; i < ilen; ++i) { + arcs[i]._options = me._resolveElementOptions(arcs[i], i); + } + + chart.borderWidth = me.getMaxBorderWidth(); + chart.outerRadius = Math.max((minSize - chart.borderWidth) / 2, 0); + chart.innerRadius = Math.max(cutoutPercentage ? (chart.outerRadius / 100) * (cutoutPercentage) : 0, 0); + chart.radiusLength = (chart.outerRadius - chart.innerRadius) / (me._getVisibleDatasetWeightTotal() || 1); + chart.offsetX = offset.x * chart.outerRadius; + chart.offsetY = offset.y * chart.outerRadius; + + meta.total = me.calculateTotal(); + + me.outerRadius = chart.outerRadius - chart.radiusLength * me._getRingWeightOffset(me.index); + me.innerRadius = Math.max(me.outerRadius - chart.radiusLength * chartWeight, 0); + + for (i = 0, ilen = arcs.length; i < ilen; ++i) { + me.updateElement(arcs[i], i, reset); + } + }, + + updateElement: function (arc, index, reset) { + var me = this; + var chart = me.chart; + var chartArea = chart.chartArea; + var opts = chart.options; + var animationOpts = opts.animation; + var centerX = (chartArea.left + chartArea.right) / 2; + var centerY = (chartArea.top + chartArea.bottom) / 2; + var startAngle = opts.rotation; // non reset case handled later + var endAngle = opts.rotation; // non reset case handled later + var dataset = me.getDataset(); + var circumference = reset && animationOpts.animateRotate ? 0 : arc.hidden ? 0 : me.calculateCircumference(dataset.data[index]) * (opts.circumference / (2.0 * Math.PI)); + var innerRadius = reset && animationOpts.animateScale ? 0 : me.innerRadius; + var outerRadius = reset && animationOpts.animateScale ? 0 : me.outerRadius; + var options = arc._options || {}; + + helpers$1.extend(arc, { + // Utility + _datasetIndex: me.index, + _index: index, + + // Desired view properties + _model: { + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: options.borderWidth, + borderAlign: options.borderAlign, + x: centerX + chart.offsetX, + y: centerY + chart.offsetY, + startAngle: startAngle, + endAngle: endAngle, + circumference: circumference, + outerRadius: outerRadius, + innerRadius: innerRadius, + label: helpers$1.valueAtIndexOrDefault(dataset.label, index, chart.data.labels[index]) + } + }); + + var model = arc._model; + + // Set correct angles if not resetting + if (!reset || !animationOpts.animateRotate) { + if (index === 0) { + model.startAngle = opts.rotation; + } else { + model.startAngle = me.getMeta().data[index - 1]._model.endAngle; + } + + model.endAngle = model.startAngle + model.circumference; + } + + arc.pivot(); + }, + + calculateTotal: function () { + var dataset = this.getDataset(); + var meta = this.getMeta(); + var total = 0; + var value; + + helpers$1.each(meta.data, function (element, index) { + value = dataset.data[index]; + if (!isNaN(value) && !element.hidden) { + total += Math.abs(value); + } + }); + + /* if (total === 0) { + total = NaN; + }*/ + + return total; + }, + + calculateCircumference: function (value) { + var total = this.getMeta().total; + if (total > 0 && !isNaN(value)) { + return (Math.PI * 2.0) * (Math.abs(value) / total); + } + return 0; + }, + + // gets the max border or hover width to properly scale pie charts + getMaxBorderWidth: function (arcs) { + var me = this; + var max = 0; + var chart = me.chart; + var i, ilen, meta, arc, controller, options, borderWidth, hoverWidth; + + if (!arcs) { + // Find the outmost visible dataset + for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) { + if (chart.isDatasetVisible(i)) { + meta = chart.getDatasetMeta(i); + arcs = meta.data; + if (i !== me.index) { + controller = meta.controller; } + break; + } + } + } + + if (!arcs) { + return 0; + } + + for (i = 0, ilen = arcs.length; i < ilen; ++i) { + arc = arcs[i]; + options = controller ? controller._resolveElementOptions(arc, i) : arc._options; + if (options.borderAlign !== 'inner') { + borderWidth = options.borderWidth; + hoverWidth = options.hoverBorderWidth; + + max = borderWidth > max ? borderWidth : max; + max = hoverWidth > max ? hoverWidth : max; + } + } + return max; + }, + + /** + * @protected + */ + setHoverStyle: function (arc) { + var model = arc._model; + var options = arc._options; + var getHoverColor = helpers$1.getHoverColor; + + arc.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth, + }; + + model.backgroundColor = valueOrDefault$4(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); + model.borderColor = valueOrDefault$4(options.hoverBorderColor, getHoverColor(options.borderColor)); + model.borderWidth = valueOrDefault$4(options.hoverBorderWidth, options.borderWidth); + }, + + /** + * @private + */ + _resolveElementOptions: function (arc, index) { + var me = this; + var chart = me.chart; + var dataset = me.getDataset(); + var custom = arc.custom || {}; + var options = chart.options.elements.arc; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var keys = [ + 'backgroundColor', + 'borderColor', + 'borderWidth', + 'borderAlign', + 'hoverBackgroundColor', + 'hoverBorderColor', + 'hoverBorderWidth', + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$3([ + custom[key], + dataset[key], + options[key] + ], context, index); + } + + return values; + }, + + /** + * Get radius length offset of the dataset in relation to the visible datasets weights. This allows determining the inner and outer radius correctly + * @private + */ + _getRingWeightOffset: function (datasetIndex) { + var ringWeightOffset = 0; + + for (var i = 0; i < datasetIndex; ++i) { + if (this.chart.isDatasetVisible(i)) { + ringWeightOffset += this._getRingWeight(i); + } + } + + return ringWeightOffset; + }, + + /** + * @private + */ + _getRingWeight: function (dataSetIndex) { + return Math.max(valueOrDefault$4(this.chart.data.datasets[dataSetIndex].weight, 1), 0); + }, - function d(t, e, i) { - return Math.min(Math.max(e, t), i) + /** + * Returns the sum of all visibile data set weights. This value can be 0. + * @private + */ + _getVisibleDatasetWeightTotal: function () { + return this._getRingWeightOffset(this.chart.data.datasets.length); + } + }); + + core_defaults._set('horizontalBar', { + hover: { + mode: 'index', + axis: 'y' + }, + + scales: { + xAxes: [{ + type: 'linear', + position: 'bottom' + }], + + yAxes: [{ + type: 'category', + position: 'left', + categoryPercentage: 0.8, + barPercentage: 0.9, + offset: true, + gridLines: { + offsetGridLines: true + } + }] + }, + + elements: { + rectangle: { + borderSkipped: 'left' + } + }, + + tooltips: { + mode: 'index', + axis: 'y' + } + }); + + var controller_horizontalBar = controller_bar.extend({ + /** + * @private + */ + _getValueScaleId: function () { + return this.getMeta().xAxisID; + }, + + /** + * @private + */ + _getIndexScaleId: function () { + return this.getMeta().yAxisID; + } + }); + + var valueOrDefault$5 = helpers$1.valueOrDefault; + var resolve$4 = helpers$1.options.resolve; + var isPointInArea = helpers$1.canvas._isPointInArea; + + core_defaults._set('line', { + showLines: true, + spanGaps: false, + + hover: { + mode: 'label' + }, + + scales: { + xAxes: [{ + type: 'category', + id: 'x-axis-0' + }], + yAxes: [{ + type: 'linear', + id: 'y-axis-0' + }] + } + }); + + function lineEnabled(dataset, options) { + return valueOrDefault$5(dataset.showLine, options.showLines); + } + + var controller_line = core_datasetController.extend({ + + datasetElementType: elements.Line, + + dataElementType: elements.Point, + + update: function (reset) { + var me = this; + var meta = me.getMeta(); + var line = meta.dataset; + var points = meta.data || []; + var scale = me.getScaleForId(meta.yAxisID); + var dataset = me.getDataset(); + var showLine = lineEnabled(dataset, me.chart.options); + var i, ilen; + + // Update Line + if (showLine) { + // Compatibility: If the properties are defined with only the old name, use those values + if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) { + dataset.lineTension = dataset.tension; + } + + // Utility + line._scale = scale; + line._datasetIndex = me.index; + // Data + line._children = points; + // Model + line._model = me._resolveLineOptions(line); + + line.pivot(); + } + + // Update Points + for (i = 0, ilen = points.length; i < ilen; ++i) { + me.updateElement(points[i], i, reset); + } + + if (showLine && line._model.tension !== 0) { + me.updateBezierControlPoints(); + } + + // Now pivot the point for animation + for (i = 0, ilen = points.length; i < ilen; ++i) { + points[i].pivot(); + } + }, + + updateElement: function (point, index, reset) { + var me = this; + var meta = me.getMeta(); + var custom = point.custom || {}; + var dataset = me.getDataset(); + var datasetIndex = me.index; + var value = dataset.data[index]; + var yScale = me.getScaleForId(meta.yAxisID); + var xScale = me.getScaleForId(meta.xAxisID); + var lineModel = meta.dataset._model; + var x, y; + + var options = me._resolvePointOptions(point, index); + + x = xScale.getPixelForValue(typeof value === 'object' ? value : NaN, index, datasetIndex); + y = reset ? yScale.getBasePixel() : me.calculatePointY(value, index, datasetIndex); + + // Utility + point._xScale = xScale; + point._yScale = yScale; + point._options = options; + point._datasetIndex = datasetIndex; + point._index = index; + + // Desired view properties + point._model = { + x: x, + y: y, + skip: custom.skip || isNaN(x) || isNaN(y), + // Appearance + radius: options.radius, + pointStyle: options.pointStyle, + rotation: options.rotation, + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: options.borderWidth, + tension: valueOrDefault$5(custom.tension, lineModel ? lineModel.tension : 0), + steppedLine: lineModel ? lineModel.steppedLine : false, + // Tooltip + hitRadius: options.hitRadius + }; + }, + + /** + * @private + */ + _resolvePointOptions: function (element, index) { + var me = this; + var chart = me.chart; + var dataset = chart.data.datasets[me.index]; + var custom = element.custom || {}; + var options = chart.options.elements.point; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var ELEMENT_OPTIONS = { + backgroundColor: 'pointBackgroundColor', + borderColor: 'pointBorderColor', + borderWidth: 'pointBorderWidth', + hitRadius: 'pointHitRadius', + hoverBackgroundColor: 'pointHoverBackgroundColor', + hoverBorderColor: 'pointHoverBorderColor', + hoverBorderWidth: 'pointHoverBorderWidth', + hoverRadius: 'pointHoverRadius', + pointStyle: 'pointStyle', + radius: 'pointRadius', + rotation: 'pointRotation' + }; + var keys = Object.keys(ELEMENT_OPTIONS); + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$4([ + custom[key], + dataset[ELEMENT_OPTIONS[key]], + dataset[key], + options[key] + ], context, index); + } + + return values; + }, + + /** + * @private + */ + _resolveLineOptions: function (element) { + var me = this; + var chart = me.chart; + var dataset = chart.data.datasets[me.index]; + var custom = element.custom || {}; + var options = chart.options; + var elementOptions = options.elements.line; + var values = {}; + var i, ilen, key; + + var keys = [ + 'backgroundColor', + 'borderWidth', + 'borderColor', + 'borderCapStyle', + 'borderDash', + 'borderDashOffset', + 'borderJoinStyle', + 'fill', + 'cubicInterpolationMode' + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$4([ + custom[key], + dataset[key], + elementOptions[key] + ]); + } + + // The default behavior of lines is to break at null values, according + // to https://github.com/chartjs/Chart.js/issues/2435#issuecomment-216718158 + // This option gives lines the ability to span gaps + values.spanGaps = valueOrDefault$5(dataset.spanGaps, options.spanGaps); + values.tension = valueOrDefault$5(dataset.lineTension, elementOptions.tension); + values.steppedLine = resolve$4([custom.steppedLine, dataset.steppedLine, elementOptions.stepped]); + + return values; + }, + + calculatePointY: function (value, index, datasetIndex) { + var me = this; + var chart = me.chart; + var meta = me.getMeta(); + var yScale = me.getScaleForId(meta.yAxisID); + var sumPos = 0; + var sumNeg = 0; + var i, ds, dsMeta; + + if (yScale.options.stacked) { + for (i = 0; i < datasetIndex; i++) { + ds = chart.data.datasets[i]; + dsMeta = chart.getDatasetMeta(i); + if (dsMeta.type === 'line' && dsMeta.yAxisID === yScale.id && chart.isDatasetVisible(i)) { + var stackedRightValue = Number(yScale.getRightValue(ds.data[index])); + if (stackedRightValue < 0) { + sumNeg += stackedRightValue || 0; + } else { + sumPos += stackedRightValue || 0; } + } + } + + var rightValue = Number(yScale.getRightValue(value)); + if (rightValue < 0) { + return yScale.getPixelForValue(sumNeg + rightValue); + } + return yScale.getPixelForValue(sumPos + rightValue); + } + + return yScale.getPixelForValue(value); + }, - function h(t) { - var e = t.toString(16).toUpperCase(); - return e.length < 2 ? "0" + e : e + updateBezierControlPoints: function () { + var me = this; + var chart = me.chart; + var meta = me.getMeta(); + var lineModel = meta.dataset._model; + var area = chart.chartArea; + var points = meta.data || []; + var i, ilen, model, controlPoints; + + // Only consider points that are drawn in case the spanGaps option is used + if (lineModel.spanGaps) { + points = points.filter(function (pt) { + return !pt._model.skip; + }); + } + + function capControlPoint(pt, min, max) { + return Math.max(Math.min(pt, max), min); + } + + if (lineModel.cubicInterpolationMode === 'monotone') { + helpers$1.splineCurveMonotone(points); + } else { + for (i = 0, ilen = points.length; i < ilen; ++i) { + model = points[i]._model; + controlPoints = helpers$1.splineCurve( + helpers$1.previousItem(points, i)._model, + model, + helpers$1.nextItem(points, i)._model, + lineModel.tension + ); + model.controlPointPreviousX = controlPoints.previous.x; + model.controlPointPreviousY = controlPoints.previous.y; + model.controlPointNextX = controlPoints.next.x; + model.controlPointNextY = controlPoints.next.y; + } + } + + if (chart.options.elements.line.capBezierPoints) { + for (i = 0, ilen = points.length; i < ilen; ++i) { + model = points[i]._model; + if (isPointInArea(model, area)) { + if (i > 0 && isPointInArea(points[i - 1]._model, area)) { + model.controlPointPreviousX = capControlPoint(model.controlPointPreviousX, area.left, area.right); + model.controlPointPreviousY = capControlPoint(model.controlPointPreviousY, area.top, area.bottom); + } + if (i < points.length - 1 && isPointInArea(points[i + 1]._model, area)) { + model.controlPointNextX = capControlPoint(model.controlPointNextX, area.left, area.right); + model.controlPointNextY = capControlPoint(model.controlPointNextY, area.top, area.bottom); } + } + } + } + }, - e.exports = { - getRgba: a, getHsla: r, getRgb: function (t) { - var e = a(t); - return e && e.slice(0, 3) - }, getHsl: function (t) { - var e = r(t); - return e && e.slice(0, 3) - }, getHwb: o, getAlpha: function (t) { - var e = a(t); - { - if (e) return e[3]; - if (e = r(t)) return e[3]; - if (e = o(t)) return e[3] - } - }, hexString: function (t) { - return "#" + h(t[0]) + h(t[1]) + h(t[2]) - }, rgbString: function (t, e) { - if (e < 1 || t[3] && t[3] < 1) return s(t, e); - return "rgb(" + t[0] + ", " + t[1] + ", " + t[2] + ")" - }, rgbaString: s, percentString: function (t, e) { - if (e < 1 || t[3] && t[3] < 1) return l(t, e); - var i = Math.round(t[0] / 255 * 100), n = Math.round(t[1] / 255 * 100), - a = Math.round(t[2] / 255 * 100); - return "rgb(" + i + "%, " + n + "%, " + a + "%)" - }, percentaString: l, hslString: function (t, e) { - if (e < 1 || t[3] && t[3] < 1) return u(t, e); - return "hsl(" + t[0] + ", " + t[1] + "%, " + t[2] + "%)" - }, hslaString: u, hwbString: function (t, e) { - void 0 === e && (e = void 0 !== t[3] ? t[3] : 1); - return "hwb(" + t[0] + ", " + t[1] + "%, " + t[2] + "%" + (void 0 !== e && 1 !== e ? ", " + e : "") + ")" - }, keyword: function (t) { - return c[t.slice(0, 3)] - } - }; - var c = {}; - for (var f in n) c[n[f]] = f - }, {5: 5}], 2: [function (t, e, i) { - var n = t(4), a = t(1), r = function (t) { - return t instanceof r ? t : this instanceof r ? (this.valid = !1, this.values = { - rgb: [0, 0, 0], - hsl: [0, 0, 0], - hsv: [0, 0, 0], - hwb: [0, 0, 0], - cmyk: [0, 0, 0, 0], - alpha: 1 - }, void("string" == typeof t ? (e = a.getRgba(t)) ? this.setValues("rgb", e) : (e = a.getHsla(t)) ? this.setValues("hsl", e) : (e = a.getHwb(t)) && this.setValues("hwb", e) : "object" == typeof t && (void 0 !== (e = t).r || void 0 !== e.red ? this.setValues("rgb", e) : void 0 !== e.l || void 0 !== e.lightness ? this.setValues("hsl", e) : void 0 !== e.v || void 0 !== e.value ? this.setValues("hsv", e) : void 0 !== e.w || void 0 !== e.whiteness ? this.setValues("hwb", e) : void 0 === e.c && void 0 === e.cyan || this.setValues("cmyk", e)))) : new r(t); - var e + draw: function () { + var me = this; + var chart = me.chart; + var meta = me.getMeta(); + var points = meta.data || []; + var area = chart.chartArea; + var ilen = points.length; + var halfBorderWidth; + var i = 0; + + if (lineEnabled(me.getDataset(), chart.options)) { + halfBorderWidth = (meta.dataset._model.borderWidth || 0) / 2; + + helpers$1.canvas.clipArea(chart.ctx, { + left: area.left, + right: area.right, + top: area.top - halfBorderWidth, + bottom: area.bottom + halfBorderWidth + }); + + meta.dataset.draw(); + + helpers$1.canvas.unclipArea(chart.ctx); + } + + // Draw the points + for (; i < ilen; ++i) { + points[i].draw(area); + } + }, + + /** + * @protected + */ + setHoverStyle: function (point) { + var model = point._model; + var options = point._options; + var getHoverColor = helpers$1.getHoverColor; + + point.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth, + radius: model.radius + }; + + model.backgroundColor = valueOrDefault$5(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); + model.borderColor = valueOrDefault$5(options.hoverBorderColor, getHoverColor(options.borderColor)); + model.borderWidth = valueOrDefault$5(options.hoverBorderWidth, options.borderWidth); + model.radius = valueOrDefault$5(options.hoverRadius, options.radius); + }, + }); + + var resolve$5 = helpers$1.options.resolve; + + core_defaults._set('polarArea', { + scale: { + type: 'radialLinear', + angleLines: { + display: false + }, + gridLines: { + circular: true + }, + pointLabels: { + display: false + }, + ticks: { + beginAtZero: true + } + }, + + // Boolean - Whether to animate the rotation of the chart + animation: { + animateRotate: true, + animateScale: true + }, + + startAngle: -0.5 * Math.PI, + legendCallback: function (chart) { + var text = []; + text.push('<ul class="' + chart.id + '-legend">'); + + var data = chart.data; + var datasets = data.datasets; + var labels = data.labels; + + if (datasets.length) { + for (var i = 0; i < datasets[0].data.length; ++i) { + text.push('<li><span style="background-color:' + datasets[0].backgroundColor[i] + '"></span>'); + if (labels[i]) { + text.push(labels[i]); + } + text.push('</li>'); + } + } + + text.push('</ul>'); + return text.join(''); + }, + legend: { + labels: { + generateLabels: function (chart) { + var data = chart.data; + if (data.labels.length && data.datasets.length) { + return data.labels.map(function (label, i) { + var meta = chart.getDatasetMeta(0); + var ds = data.datasets[0]; + var arc = meta.data[i]; + var custom = arc.custom || {}; + var arcOpts = chart.options.elements.arc; + var fill = resolve$5([custom.backgroundColor, ds.backgroundColor, arcOpts.backgroundColor], undefined, i); + var stroke = resolve$5([custom.borderColor, ds.borderColor, arcOpts.borderColor], undefined, i); + var bw = resolve$5([custom.borderWidth, ds.borderWidth, arcOpts.borderWidth], undefined, i); + + return { + text: label, + fillStyle: fill, + strokeStyle: stroke, + lineWidth: bw, + hidden: isNaN(ds.data[i]) || meta.data[i].hidden, + + // Extra data used for toggling the correct item + index: i + }; + }); + } + return []; + } + }, + + onClick: function (e, legendItem) { + var index = legendItem.index; + var chart = this.chart; + var i, ilen, meta; + + for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { + meta = chart.getDatasetMeta(i); + meta.data[index].hidden = !meta.data[index].hidden; + } + + chart.update(); + } + }, + + // Need to override these to give a nice default + tooltips: { + callbacks: { + title: function () { + return ''; + }, + label: function (item, data) { + return data.labels[item.index] + ': ' + item.yLabel; + } + } + } + }); + + var controller_polarArea = core_datasetController.extend({ + + dataElementType: elements.Arc, + + linkScales: helpers$1.noop, + + update: function (reset) { + var me = this; + var dataset = me.getDataset(); + var meta = me.getMeta(); + var start = me.chart.options.startAngle || 0; + var starts = me._starts = []; + var angles = me._angles = []; + var arcs = meta.data; + var i, ilen, angle; + + me._updateRadius(); + + meta.count = me.countVisibleElements(); + + for (i = 0, ilen = dataset.data.length; i < ilen; i++) { + starts[i] = start; + angle = me._computeAngle(i); + angles[i] = angle; + start += angle; + } + + for (i = 0, ilen = arcs.length; i < ilen; ++i) { + arcs[i]._options = me._resolveElementOptions(arcs[i], i); + me.updateElement(arcs[i], i, reset); + } + }, + + /** + * @private + */ + _updateRadius: function () { + var me = this; + var chart = me.chart; + var chartArea = chart.chartArea; + var opts = chart.options; + var minSize = Math.min(chartArea.right - chartArea.left, chartArea.bottom - chartArea.top); + + chart.outerRadius = Math.max(minSize / 2, 0); + chart.innerRadius = Math.max(opts.cutoutPercentage ? (chart.outerRadius / 100) * (opts.cutoutPercentage) : 1, 0); + chart.radiusLength = (chart.outerRadius - chart.innerRadius) / chart.getVisibleDatasetCount(); + + me.outerRadius = chart.outerRadius - (chart.radiusLength * me.index); + me.innerRadius = me.outerRadius - chart.radiusLength; + }, + + updateElement: function (arc, index, reset) { + var me = this; + var chart = me.chart; + var dataset = me.getDataset(); + var opts = chart.options; + var animationOpts = opts.animation; + var scale = chart.scale; + var labels = chart.data.labels; + + var centerX = scale.xCenter; + var centerY = scale.yCenter; + + // var negHalfPI = -0.5 * Math.PI; + var datasetStartAngle = opts.startAngle; + var distance = arc.hidden ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]); + var startAngle = me._starts[index]; + var endAngle = startAngle + (arc.hidden ? 0 : me._angles[index]); + + var resetRadius = animationOpts.animateScale ? 0 : scale.getDistanceFromCenterForValue(dataset.data[index]); + var options = arc._options || {}; + + helpers$1.extend(arc, { + // Utility + _datasetIndex: me.index, + _index: index, + _scale: scale, + + // Desired view properties + _model: { + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: options.borderWidth, + borderAlign: options.borderAlign, + x: centerX, + y: centerY, + innerRadius: 0, + outerRadius: reset ? resetRadius : distance, + startAngle: reset && animationOpts.animateRotate ? datasetStartAngle : startAngle, + endAngle: reset && animationOpts.animateRotate ? datasetStartAngle : endAngle, + label: helpers$1.valueAtIndexOrDefault(labels, index, labels[index]) + } + }); + + arc.pivot(); + }, + + countVisibleElements: function () { + var dataset = this.getDataset(); + var meta = this.getMeta(); + var count = 0; + + helpers$1.each(meta.data, function (element, index) { + if (!isNaN(dataset.data[index]) && !element.hidden) { + count++; + } + }); + + return count; + }, + + /** + * @protected + */ + setHoverStyle: function (arc) { + var model = arc._model; + var options = arc._options; + var getHoverColor = helpers$1.getHoverColor; + var valueOrDefault = helpers$1.valueOrDefault; + + arc.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth, + }; + + model.backgroundColor = valueOrDefault(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); + model.borderColor = valueOrDefault(options.hoverBorderColor, getHoverColor(options.borderColor)); + model.borderWidth = valueOrDefault(options.hoverBorderWidth, options.borderWidth); + }, + + /** + * @private + */ + _resolveElementOptions: function (arc, index) { + var me = this; + var chart = me.chart; + var dataset = me.getDataset(); + var custom = arc.custom || {}; + var options = chart.options.elements.arc; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var keys = [ + 'backgroundColor', + 'borderColor', + 'borderWidth', + 'borderAlign', + 'hoverBackgroundColor', + 'hoverBorderColor', + 'hoverBorderWidth', + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$5([ + custom[key], + dataset[key], + options[key] + ], context, index); + } + + return values; + }, + + /** + * @private + */ + _computeAngle: function (index) { + var me = this; + var count = this.getMeta().count; + var dataset = me.getDataset(); + var meta = me.getMeta(); + + if (isNaN(dataset.data[index]) || meta.data[index].hidden) { + return 0; + } + + // Scriptable options + var context = { + chart: me.chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + return resolve$5([ + me.chart.options.elements.arc.angle, + (2 * Math.PI) / count + ], context, index); + } + }); + + core_defaults._set('pie', helpers$1.clone(core_defaults.doughnut)); + core_defaults._set('pie', { + cutoutPercentage: 0 + }); + +// Pie charts are Doughnut chart with different defaults + var controller_pie = controller_doughnut; + + var valueOrDefault$6 = helpers$1.valueOrDefault; + var resolve$6 = helpers$1.options.resolve; + + core_defaults._set('radar', { + scale: { + type: 'radialLinear' + }, + elements: { + line: { + tension: 0 // no bezier in radar + } + } + }); + + var controller_radar = core_datasetController.extend({ + + datasetElementType: elements.Line, + + dataElementType: elements.Point, + + linkScales: helpers$1.noop, + + update: function (reset) { + var me = this; + var meta = me.getMeta(); + var line = meta.dataset; + var points = meta.data || []; + var scale = me.chart.scale; + var dataset = me.getDataset(); + var i, ilen; + + // Compatibility: If the properties are defined with only the old name, use those values + if ((dataset.tension !== undefined) && (dataset.lineTension === undefined)) { + dataset.lineTension = dataset.tension; + } + + // Utility + line._scale = scale; + line._datasetIndex = me.index; + // Data + line._children = points; + line._loop = true; + // Model + line._model = me._resolveLineOptions(line); + + line.pivot(); + + // Update Points + for (i = 0, ilen = points.length; i < ilen; ++i) { + me.updateElement(points[i], i, reset); + } + + // Update bezier control points + me.updateBezierControlPoints(); + + // Now pivot the point for animation + for (i = 0, ilen = points.length; i < ilen; ++i) { + points[i].pivot(); + } + }, + + updateElement: function (point, index, reset) { + var me = this; + var custom = point.custom || {}; + var dataset = me.getDataset(); + var scale = me.chart.scale; + var pointPosition = scale.getPointPositionForValue(index, dataset.data[index]); + var options = me._resolvePointOptions(point, index); + var lineModel = me.getMeta().dataset._model; + var x = reset ? scale.xCenter : pointPosition.x; + var y = reset ? scale.yCenter : pointPosition.y; + + // Utility + point._scale = scale; + point._options = options; + point._datasetIndex = me.index; + point._index = index; + + // Desired view properties + point._model = { + x: x, // value not used in dataset scale, but we want a consistent API between scales + y: y, + skip: custom.skip || isNaN(x) || isNaN(y), + // Appearance + radius: options.radius, + pointStyle: options.pointStyle, + rotation: options.rotation, + backgroundColor: options.backgroundColor, + borderColor: options.borderColor, + borderWidth: options.borderWidth, + tension: valueOrDefault$6(custom.tension, lineModel ? lineModel.tension : 0), + + // Tooltip + hitRadius: options.hitRadius + }; + }, + + /** + * @private + */ + _resolvePointOptions: function (element, index) { + var me = this; + var chart = me.chart; + var dataset = chart.data.datasets[me.index]; + var custom = element.custom || {}; + var options = chart.options.elements.point; + var values = {}; + var i, ilen, key; + + // Scriptable options + var context = { + chart: chart, + dataIndex: index, + dataset: dataset, + datasetIndex: me.index + }; + + var ELEMENT_OPTIONS = { + backgroundColor: 'pointBackgroundColor', + borderColor: 'pointBorderColor', + borderWidth: 'pointBorderWidth', + hitRadius: 'pointHitRadius', + hoverBackgroundColor: 'pointHoverBackgroundColor', + hoverBorderColor: 'pointHoverBorderColor', + hoverBorderWidth: 'pointHoverBorderWidth', + hoverRadius: 'pointHoverRadius', + pointStyle: 'pointStyle', + radius: 'pointRadius', + rotation: 'pointRotation' + }; + var keys = Object.keys(ELEMENT_OPTIONS); + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$6([ + custom[key], + dataset[ELEMENT_OPTIONS[key]], + dataset[key], + options[key] + ], context, index); + } + + return values; + }, + + /** + * @private + */ + _resolveLineOptions: function (element) { + var me = this; + var chart = me.chart; + var dataset = chart.data.datasets[me.index]; + var custom = element.custom || {}; + var options = chart.options.elements.line; + var values = {}; + var i, ilen, key; + + var keys = [ + 'backgroundColor', + 'borderWidth', + 'borderColor', + 'borderCapStyle', + 'borderDash', + 'borderDashOffset', + 'borderJoinStyle', + 'fill' + ]; + + for (i = 0, ilen = keys.length; i < ilen; ++i) { + key = keys[i]; + values[key] = resolve$6([ + custom[key], + dataset[key], + options[key] + ]); + } + + values.tension = valueOrDefault$6(dataset.lineTension, options.tension); + + return values; + }, + + updateBezierControlPoints: function () { + var me = this; + var meta = me.getMeta(); + var area = me.chart.chartArea; + var points = meta.data || []; + var i, ilen, model, controlPoints; + + function capControlPoint(pt, min, max) { + return Math.max(Math.min(pt, max), min); + } + + for (i = 0, ilen = points.length; i < ilen; ++i) { + model = points[i]._model; + controlPoints = helpers$1.splineCurve( + helpers$1.previousItem(points, i, true)._model, + model, + helpers$1.nextItem(points, i, true)._model, + model.tension + ); + + // Prevent the bezier going outside of the bounds of the graph + model.controlPointPreviousX = capControlPoint(controlPoints.previous.x, area.left, area.right); + model.controlPointPreviousY = capControlPoint(controlPoints.previous.y, area.top, area.bottom); + model.controlPointNextX = capControlPoint(controlPoints.next.x, area.left, area.right); + model.controlPointNextY = capControlPoint(controlPoints.next.y, area.top, area.bottom); + } + }, + + setHoverStyle: function (point) { + var model = point._model; + var options = point._options; + var getHoverColor = helpers$1.getHoverColor; + + point.$previousStyle = { + backgroundColor: model.backgroundColor, + borderColor: model.borderColor, + borderWidth: model.borderWidth, + radius: model.radius + }; + + model.backgroundColor = valueOrDefault$6(options.hoverBackgroundColor, getHoverColor(options.backgroundColor)); + model.borderColor = valueOrDefault$6(options.hoverBorderColor, getHoverColor(options.borderColor)); + model.borderWidth = valueOrDefault$6(options.hoverBorderWidth, options.borderWidth); + model.radius = valueOrDefault$6(options.hoverRadius, options.radius); + } + }); + + core_defaults._set('scatter', { + hover: { + mode: 'single' + }, + + scales: { + xAxes: [{ + id: 'x-axis-1', // need an ID so datasets can reference the scale + type: 'linear', // scatter should not use a category axis + position: 'bottom' + }], + yAxes: [{ + id: 'y-axis-1', + type: 'linear', + position: 'left' + }] + }, + + showLines: false, + + tooltips: { + callbacks: { + title: function () { + return ''; // doesn't make sense for scatter since data are formatted as a point + }, + label: function (item) { + return '(' + item.xLabel + ', ' + item.yLabel + ')'; + } + } + } + }); + +// Scatter charts use line controllers + var controller_scatter = controller_line; + +// NOTE export a map in which the key represents the controller type, not +// the class, and so must be CamelCase in order to be correctly retrieved +// by the controller in core.controller.js (`controllers[meta.type]`). + + var controllers = { + bar: controller_bar, + bubble: controller_bubble, + doughnut: controller_doughnut, + horizontalBar: controller_horizontalBar, + line: controller_line, + polarArea: controller_polarArea, + pie: controller_pie, + radar: controller_radar, + scatter: controller_scatter + }; + + /** + * Helper function to get relative position for an event + * @param {Event|IEvent} event - The event to get the position for + * @param {Chart} chart - The chart + * @returns {object} the event position + */ + function getRelativePosition(e, chart) { + if (e.native) { + return { + x: e.x, + y: e.y + }; + } + + return helpers$1.getRelativePosition(e, chart); + } + + /** + * Helper function to traverse all of the visible elements in the chart + * @param {Chart} chart - the chart + * @param {function} handler - the callback to execute for each visible item + */ + function parseVisibleItems(chart, handler) { + var datasets = chart.data.datasets; + var meta, i, j, ilen, jlen; + + for (i = 0, ilen = datasets.length; i < ilen; ++i) { + if (!chart.isDatasetVisible(i)) { + continue; + } + + meta = chart.getDatasetMeta(i); + for (j = 0, jlen = meta.data.length; j < jlen; ++j) { + var element = meta.data[j]; + if (!element._view.skip) { + handler(element); + } + } + } + } + + /** + * Helper function to get the items that intersect the event position + * @param {ChartElement[]} items - elements to filter + * @param {object} position - the point to be nearest to + * @return {ChartElement[]} the nearest items + */ + function getIntersectItems(chart, position) { + var elements = []; + + parseVisibleItems(chart, function (element) { + if (element.inRange(position.x, position.y)) { + elements.push(element); + } + }); + + return elements; + } + + /** + * Helper function to get the items nearest to the event position considering all visible items in teh chart + * @param {Chart} chart - the chart to look at elements from + * @param {object} position - the point to be nearest to + * @param {boolean} intersect - if true, only consider items that intersect the position + * @param {function} distanceMetric - function to provide the distance between points + * @return {ChartElement[]} the nearest items + */ + function getNearestItems(chart, position, intersect, distanceMetric) { + var minDistance = Number.POSITIVE_INFINITY; + var nearestItems = []; + + parseVisibleItems(chart, function (element) { + if (intersect && !element.inRange(position.x, position.y)) { + return; + } + + var center = element.getCenterPoint(); + var distance = distanceMetric(position, center); + if (distance < minDistance) { + nearestItems = [element]; + minDistance = distance; + } else if (distance === minDistance) { + // Can have multiple items at the same distance in which case we sort by size + nearestItems.push(element); + } + }); + + return nearestItems; + } + + /** + * Get a distance metric function for two points based on the + * axis mode setting + * @param {string} axis - the axis mode. x|y|xy + */ + function getDistanceMetricForAxis(axis) { + var useX = axis.indexOf('x') !== -1; + var useY = axis.indexOf('y') !== -1; + + return function (pt1, pt2) { + var deltaX = useX ? Math.abs(pt1.x - pt2.x) : 0; + var deltaY = useY ? Math.abs(pt1.y - pt2.y) : 0; + return Math.sqrt(Math.pow(deltaX, 2) + Math.pow(deltaY, 2)); + }; + } + + function indexMode(chart, e, options) { + var position = getRelativePosition(e, chart); + // Default axis for index mode is 'x' to match old behaviour + options.axis = options.axis || 'x'; + var distanceMetric = getDistanceMetricForAxis(options.axis); + var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric); + var elements = []; + + if (!items.length) { + return []; + } + + chart.data.datasets.forEach(function (dataset, datasetIndex) { + if (chart.isDatasetVisible(datasetIndex)) { + var meta = chart.getDatasetMeta(datasetIndex); + var element = meta.data[items[0]._index]; + + // don't count items that are skipped (null data) + if (element && !element._view.skip) { + elements.push(element); + } + } + }); + + return elements; + } + + /** + * @interface IInteractionOptions + */ + /** + * If true, only consider items that intersect the point + * @name IInterfaceOptions#boolean + * @type Boolean + */ + + /** + * Contains interaction related functions + * @namespace Chart.Interaction + */ + var core_interaction = { + // Helper function for different modes + modes: { + single: function (chart, e) { + var position = getRelativePosition(e, chart); + var elements = []; + + parseVisibleItems(chart, function (element) { + if (element.inRange(position.x, position.y)) { + elements.push(element); + return elements; + } + }); + + return elements.slice(0, 1); + }, + + /** + * @function Chart.Interaction.modes.label + * @deprecated since version 2.4.0 + * @todo remove at version 3 + * @private + */ + label: indexMode, + + /** + * Returns items at the same index. If the options.intersect parameter is true, we only return items if we intersect something + * If the options.intersect mode is false, we find the nearest item and return the items at the same index as that item + * @function Chart.Interaction.modes.index + * @since v2.4.0 + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @param {IInteractionOptions} options - options to use during interaction + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + index: indexMode, + + /** + * Returns items in the same dataset. If the options.intersect parameter is true, we only return items if we intersect something + * If the options.intersect is false, we find the nearest item and return the items in that dataset + * @function Chart.Interaction.modes.dataset + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @param {IInteractionOptions} options - options to use during interaction + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + dataset: function (chart, e, options) { + var position = getRelativePosition(e, chart); + options.axis = options.axis || 'xy'; + var distanceMetric = getDistanceMetricForAxis(options.axis); + var items = options.intersect ? getIntersectItems(chart, position) : getNearestItems(chart, position, false, distanceMetric); + + if (items.length > 0) { + items = chart.getDatasetMeta(items[0]._datasetIndex).data; + } + + return items; + }, + + /** + * @function Chart.Interaction.modes.x-axis + * @deprecated since version 2.4.0. Use index mode and intersect == true + * @todo remove at version 3 + * @private + */ + 'x-axis': function (chart, e) { + return indexMode(chart, e, {intersect: false}); + }, + + /** + * Point mode returns all elements that hit test based on the event position + * of the event + * @function Chart.Interaction.modes.intersect + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + point: function (chart, e) { + var position = getRelativePosition(e, chart); + return getIntersectItems(chart, position); + }, + + /** + * nearest mode returns the element closest to the point + * @function Chart.Interaction.modes.intersect + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @param {IInteractionOptions} options - options to use + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + nearest: function (chart, e, options) { + var position = getRelativePosition(e, chart); + options.axis = options.axis || 'xy'; + var distanceMetric = getDistanceMetricForAxis(options.axis); + return getNearestItems(chart, position, options.intersect, distanceMetric); + }, + + /** + * x mode returns the elements that hit-test at the current x coordinate + * @function Chart.Interaction.modes.x + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @param {IInteractionOptions} options - options to use + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + x: function (chart, e, options) { + var position = getRelativePosition(e, chart); + var items = []; + var intersectsItem = false; + + parseVisibleItems(chart, function (element) { + if (element.inXRange(position.x)) { + items.push(element); + } + + if (element.inRange(position.x, position.y)) { + intersectsItem = true; + } + }); + + // If we want to trigger on an intersect and we don't have any items + // that intersect the position, return nothing + if (options.intersect && !intersectsItem) { + items = []; + } + return items; + }, + + /** + * y mode returns the elements that hit-test at the current y coordinate + * @function Chart.Interaction.modes.y + * @param {Chart} chart - the chart we are returning items from + * @param {Event} e - the event we are find things at + * @param {IInteractionOptions} options - options to use + * @return {Chart.Element[]} Array of elements that are under the point. If none are found, an empty array is returned + */ + y: function (chart, e, options) { + var position = getRelativePosition(e, chart); + var items = []; + var intersectsItem = false; + + parseVisibleItems(chart, function (element) { + if (element.inYRange(position.y)) { + items.push(element); + } + + if (element.inRange(position.x, position.y)) { + intersectsItem = true; + } + }); + + // If we want to trigger on an intersect and we don't have any items + // that intersect the position, return nothing + if (options.intersect && !intersectsItem) { + items = []; + } + return items; + } + } + }; + + function filterByPosition(array, position) { + return helpers$1.where(array, function (v) { + return v.position === position; + }); + } + + function sortByWeight(array, reverse) { + array.forEach(function (v, i) { + v._tmpIndex_ = i; + return v; + }); + array.sort(function (a, b) { + var v0 = reverse ? b : a; + var v1 = reverse ? a : b; + return v0.weight === v1.weight ? + v0._tmpIndex_ - v1._tmpIndex_ : + v0.weight - v1.weight; + }); + array.forEach(function (v) { + delete v._tmpIndex_; + }); + } + + function findMaxPadding(boxes) { + var top = 0; + var left = 0; + var bottom = 0; + var right = 0; + helpers$1.each(boxes, function (box) { + if (box.getPadding) { + var boxPadding = box.getPadding(); + top = Math.max(top, boxPadding.top); + left = Math.max(left, boxPadding.left); + bottom = Math.max(bottom, boxPadding.bottom); + right = Math.max(right, boxPadding.right); + } + }); + return { + top: top, + left: left, + bottom: bottom, + right: right + }; + } + + function addSizeByPosition(boxes, size) { + helpers$1.each(boxes, function (box) { + size[box.position] += box.isHorizontal() ? box.height : box.width; + }); + } + + core_defaults._set('global', { + layout: { + padding: { + top: 0, + right: 0, + bottom: 0, + left: 0 + } + } + }); + + /** + * @interface ILayoutItem + * @prop {string} position - The position of the item in the chart layout. Possible values are + * 'left', 'top', 'right', 'bottom', and 'chartArea' + * @prop {number} weight - The weight used to sort the item. Higher weights are further away from the chart area + * @prop {boolean} fullWidth - if true, and the item is horizontal, then push vertical boxes down + * @prop {function} isHorizontal - returns true if the layout item is horizontal (ie. top or bottom) + * @prop {function} update - Takes two parameters: width and height. Returns size of item + * @prop {function} getPadding - Returns an object with padding on the edges + * @prop {number} width - Width of item. Must be valid after update() + * @prop {number} height - Height of item. Must be valid after update() + * @prop {number} left - Left edge of the item. Set by layout system and cannot be used in update + * @prop {number} top - Top edge of the item. Set by layout system and cannot be used in update + * @prop {number} right - Right edge of the item. Set by layout system and cannot be used in update + * @prop {number} bottom - Bottom edge of the item. Set by layout system and cannot be used in update + */ + +// The layout service is very self explanatory. It's responsible for the layout within a chart. +// Scales, Legends and Plugins all rely on the layout service and can easily register to be placed anywhere they need +// It is this service's responsibility of carrying out that layout. + var core_layouts = { + defaults: {}, + + /** + * Register a box to a chart. + * A box is simply a reference to an object that requires layout. eg. Scales, Legend, Title. + * @param {Chart} chart - the chart to use + * @param {ILayoutItem} item - the item to add to be layed out + */ + addBox: function (chart, item) { + if (!chart.boxes) { + chart.boxes = []; + } + + // initialize item with default values + item.fullWidth = item.fullWidth || false; + item.position = item.position || 'top'; + item.weight = item.weight || 0; + + chart.boxes.push(item); + }, + + /** + * Remove a layoutItem from a chart + * @param {Chart} chart - the chart to remove the box from + * @param {ILayoutItem} layoutItem - the item to remove from the layout + */ + removeBox: function (chart, layoutItem) { + var index = chart.boxes ? chart.boxes.indexOf(layoutItem) : -1; + if (index !== -1) { + chart.boxes.splice(index, 1); + } + }, + + /** + * Sets (or updates) options on the given `item`. + * @param {Chart} chart - the chart in which the item lives (or will be added to) + * @param {ILayoutItem} item - the item to configure with the given options + * @param {object} options - the new item options. + */ + configure: function (chart, item, options) { + var props = ['fullWidth', 'position', 'weight']; + var ilen = props.length; + var i = 0; + var prop; + + for (; i < ilen; ++i) { + prop = props[i]; + if (options.hasOwnProperty(prop)) { + item[prop] = options[prop]; + } + } + }, + + /** + * Fits boxes of the given chart into the given size by having each box measure itself + * then running a fitting algorithm + * @param {Chart} chart - the chart + * @param {number} width - the width to fit into + * @param {number} height - the height to fit into + */ + update: function (chart, width, height) { + if (!chart) { + return; + } + + var layoutOptions = chart.options.layout || {}; + var padding = helpers$1.options.toPadding(layoutOptions.padding); + var leftPadding = padding.left; + var rightPadding = padding.right; + var topPadding = padding.top; + var bottomPadding = padding.bottom; + + var leftBoxes = filterByPosition(chart.boxes, 'left'); + var rightBoxes = filterByPosition(chart.boxes, 'right'); + var topBoxes = filterByPosition(chart.boxes, 'top'); + var bottomBoxes = filterByPosition(chart.boxes, 'bottom'); + var chartAreaBoxes = filterByPosition(chart.boxes, 'chartArea'); + + // Sort boxes by weight. A higher weight is further away from the chart area + sortByWeight(leftBoxes, true); + sortByWeight(rightBoxes, false); + sortByWeight(topBoxes, true); + sortByWeight(bottomBoxes, false); + + var verticalBoxes = leftBoxes.concat(rightBoxes); + var horizontalBoxes = topBoxes.concat(bottomBoxes); + var outerBoxes = verticalBoxes.concat(horizontalBoxes); + + // Essentially we now have any number of boxes on each of the 4 sides. + // Our canvas looks like the following. + // The areas L1 and L2 are the left axes. R1 is the right axis, T1 is the top axis and + // B1 is the bottom axis + // There are also 4 quadrant-like locations (left to right instead of clockwise) reserved for chart overlays + // These locations are single-box locations only, when trying to register a chartArea location that is already taken, + // an error will be thrown. + // + // |----------------------------------------------------| + // | T1 (Full Width) | + // |----------------------------------------------------| + // | | | T2 | | + // | |----|-------------------------------------|----| + // | | | C1 | | C2 | | + // | | |----| |----| | + // | | | | | + // | L1 | L2 | ChartArea (C0) | R1 | + // | | | | | + // | | |----| |----| | + // | | | C3 | | C4 | | + // | |----|-------------------------------------|----| + // | | | B1 | | + // |----------------------------------------------------| + // | B2 (Full Width) | + // |----------------------------------------------------| + // + // What we do to find the best sizing, we do the following + // 1. Determine the minimum size of the chart area. + // 2. Split the remaining width equally between each vertical axis + // 3. Split the remaining height equally between each horizontal axis + // 4. Give each layout the maximum size it can be. The layout will return it's minimum size + // 5. Adjust the sizes of each axis based on it's minimum reported size. + // 6. Refit each axis + // 7. Position each axis in the final location + // 8. Tell the chart the final location of the chart area + // 9. Tell any axes that overlay the chart area the positions of the chart area + + // Step 1 + var chartWidth = width - leftPadding - rightPadding; + var chartHeight = height - topPadding - bottomPadding; + var chartAreaWidth = chartWidth / 2; // min 50% + + // Step 2 + var verticalBoxWidth = (width - chartAreaWidth) / verticalBoxes.length; + + // Step 3 + // TODO re-limit horizontal axis height (this limit has affected only padding calculation since PR 1837) + // var horizontalBoxHeight = (height - chartAreaHeight) / horizontalBoxes.length; + + // Step 4 + var maxChartAreaWidth = chartWidth; + var maxChartAreaHeight = chartHeight; + var outerBoxSizes = { + top: topPadding, + left: leftPadding, + bottom: bottomPadding, + right: rightPadding + }; + var minBoxSizes = []; + var maxPadding; + + function getMinimumBoxSize(box) { + var minSize; + var isHorizontal = box.isHorizontal(); + + if (isHorizontal) { + minSize = box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2); + maxChartAreaHeight -= minSize.height; + } else { + minSize = box.update(verticalBoxWidth, maxChartAreaHeight); + maxChartAreaWidth -= minSize.width; + } + + minBoxSizes.push({ + horizontal: isHorizontal, + width: minSize.width, + box: box, + }); + } + + helpers$1.each(outerBoxes, getMinimumBoxSize); + + // If a horizontal box has padding, we move the left boxes over to avoid ugly charts (see issue #2478) + maxPadding = findMaxPadding(outerBoxes); + + // At this point, maxChartAreaHeight and maxChartAreaWidth are the size the chart area could + // be if the axes are drawn at their minimum sizes. + // Steps 5 & 6 + + // Function to fit a box + function fitBox(box) { + var minBoxSize = helpers$1.findNextWhere(minBoxSizes, function (minBox) { + return minBox.box === box; + }); + + if (minBoxSize) { + if (minBoxSize.horizontal) { + var scaleMargin = { + left: Math.max(outerBoxSizes.left, maxPadding.left), + right: Math.max(outerBoxSizes.right, maxPadding.right), + top: 0, + bottom: 0 }; - r.prototype = { - isValid: function () { - return this.valid - }, rgb: function () { - return this.setSpace("rgb", arguments) - }, hsl: function () { - return this.setSpace("hsl", arguments) - }, hsv: function () { - return this.setSpace("hsv", arguments) - }, hwb: function () { - return this.setSpace("hwb", arguments) - }, cmyk: function () { - return this.setSpace("cmyk", arguments) - }, rgbArray: function () { - return this.values.rgb - }, hslArray: function () { - return this.values.hsl - }, hsvArray: function () { - return this.values.hsv - }, hwbArray: function () { - var t = this.values; - return 1 !== t.alpha ? t.hwb.concat([t.alpha]) : t.hwb - }, cmykArray: function () { - return this.values.cmyk - }, rgbaArray: function () { - var t = this.values; - return t.rgb.concat([t.alpha]) - }, hslaArray: function () { - var t = this.values; - return t.hsl.concat([t.alpha]) - }, alpha: function (t) { - return void 0 === t ? this.values.alpha : (this.setValues("alpha", t), this) - }, red: function (t) { - return this.setChannel("rgb", 0, t) - }, green: function (t) { - return this.setChannel("rgb", 1, t) - }, blue: function (t) { - return this.setChannel("rgb", 2, t) - }, hue: function (t) { - return t && (t = (t %= 360) < 0 ? 360 + t : t), this.setChannel("hsl", 0, t) - }, saturation: function (t) { - return this.setChannel("hsl", 1, t) - }, lightness: function (t) { - return this.setChannel("hsl", 2, t) - }, saturationv: function (t) { - return this.setChannel("hsv", 1, t) - }, whiteness: function (t) { - return this.setChannel("hwb", 1, t) - }, blackness: function (t) { - return this.setChannel("hwb", 2, t) - }, value: function (t) { - return this.setChannel("hsv", 2, t) - }, cyan: function (t) { - return this.setChannel("cmyk", 0, t) - }, magenta: function (t) { - return this.setChannel("cmyk", 1, t) - }, yellow: function (t) { - return this.setChannel("cmyk", 2, t) - }, black: function (t) { - return this.setChannel("cmyk", 3, t) - }, hexString: function () { - return a.hexString(this.values.rgb) - }, rgbString: function () { - return a.rgbString(this.values.rgb, this.values.alpha) - }, rgbaString: function () { - return a.rgbaString(this.values.rgb, this.values.alpha) - }, percentString: function () { - return a.percentString(this.values.rgb, this.values.alpha) - }, hslString: function () { - return a.hslString(this.values.hsl, this.values.alpha) - }, hslaString: function () { - return a.hslaString(this.values.hsl, this.values.alpha) - }, hwbString: function () { - return a.hwbString(this.values.hwb, this.values.alpha) - }, keyword: function () { - return a.keyword(this.values.rgb, this.values.alpha) - }, rgbNumber: function () { - var t = this.values.rgb; - return t[0] << 16 | t[1] << 8 | t[2] - }, luminosity: function () { - for (var t = this.values.rgb, e = [], i = 0; i < t.length; i++) { - var n = t[i] / 255; - e[i] = n <= .03928 ? n / 12.92 : Math.pow((n + .055) / 1.055, 2.4) - } - return .2126 * e[0] + .7152 * e[1] + .0722 * e[2] - }, contrast: function (t) { - var e = this.luminosity(), i = t.luminosity(); - return e > i ? (e + .05) / (i + .05) : (i + .05) / (e + .05) - }, level: function (t) { - var e = this.contrast(t); - return e >= 7.1 ? "AAA" : e >= 4.5 ? "AA" : "" - }, dark: function () { - var t = this.values.rgb; - return (299 * t[0] + 587 * t[1] + 114 * t[2]) / 1e3 < 128 - }, light: function () { - return !this.dark() - }, negate: function () { - for (var t = [], e = 0; e < 3; e++) t[e] = 255 - this.values.rgb[e]; - return this.setValues("rgb", t), this - }, lighten: function (t) { - var e = this.values.hsl; - return e[2] += e[2] * t, this.setValues("hsl", e), this - }, darken: function (t) { - var e = this.values.hsl; - return e[2] -= e[2] * t, this.setValues("hsl", e), this - }, saturate: function (t) { - var e = this.values.hsl; - return e[1] += e[1] * t, this.setValues("hsl", e), this - }, desaturate: function (t) { - var e = this.values.hsl; - return e[1] -= e[1] * t, this.setValues("hsl", e), this - }, whiten: function (t) { - var e = this.values.hwb; - return e[1] += e[1] * t, this.setValues("hwb", e), this - }, blacken: function (t) { - var e = this.values.hwb; - return e[2] += e[2] * t, this.setValues("hwb", e), this - }, greyscale: function () { - var t = this.values.rgb, e = .3 * t[0] + .59 * t[1] + .11 * t[2]; - return this.setValues("rgb", [e, e, e]), this - }, clearer: function (t) { - var e = this.values.alpha; - return this.setValues("alpha", e - e * t), this - }, opaquer: function (t) { - var e = this.values.alpha; - return this.setValues("alpha", e + e * t), this - }, rotate: function (t) { - var e = this.values.hsl, i = (e[0] + t) % 360; - return e[0] = i < 0 ? 360 + i : i, this.setValues("hsl", e), this - }, mix: function (t, e) { - var i = this, n = t, a = void 0 === e ? .5 : e, r = 2 * a - 1, o = i.alpha() - n.alpha(), - s = ((r * o == -1 ? r : (r + o) / (1 + r * o)) + 1) / 2, l = 1 - s; - return this.rgb(s * i.red() + l * n.red(), s * i.green() + l * n.green(), s * i.blue() + l * n.blue()).alpha(i.alpha() * a + n.alpha() * (1 - a)) - }, toJSON: function () { - return this.rgb() - }, clone: function () { - var t, e, i = new r, n = this.values, a = i.values; - for (var o in n) n.hasOwnProperty(o) && (t = n[o], "[object Array]" === (e = {}.toString.call(t)) ? a[o] = t.slice(0) : "[object Number]" === e ? a[o] = t : console.error("unexpected color value:", t)); - return i - } - }, r.prototype.spaces = { - rgb: ["red", "green", "blue"], - hsl: ["hue", "saturation", "lightness"], - hsv: ["hue", "saturation", "value"], - hwb: ["hue", "whiteness", "blackness"], - cmyk: ["cyan", "magenta", "yellow", "black"] - }, r.prototype.maxes = { - rgb: [255, 255, 255], - hsl: [360, 100, 100], - hsv: [360, 100, 100], - hwb: [360, 100, 100], - cmyk: [100, 100, 100, 100] - }, r.prototype.getValues = function (t) { - for (var e = this.values, i = {}, n = 0; n < t.length; n++) i[t.charAt(n)] = e[t][n]; - return 1 !== e.alpha && (i.a = e.alpha), i - }, r.prototype.setValues = function (t, e) { - var i, a, r = this.values, o = this.spaces, s = this.maxes, l = 1; - if (this.valid = !0, "alpha" === t) l = e; else if (e.length) r[t] = e.slice(0, t.length), l = e[t.length]; else if (void 0 !== e[t.charAt(0)]) { - for (i = 0; i < t.length; i++) r[t][i] = e[t.charAt(i)]; - l = e.a - } else if (void 0 !== e[o[t][0]]) { - var u = o[t]; - for (i = 0; i < t.length; i++) r[t][i] = e[u[i]]; - l = e.alpha - } - if (r.alpha = Math.max(0, Math.min(1, void 0 === l ? r.alpha : l)), "alpha" === t) return !1; - for (i = 0; i < t.length; i++) a = Math.max(0, Math.min(s[t][i], r[t][i])), r[t][i] = Math.round(a); - for (var d in o) d !== t && (r[d] = n[t][d](r[t])); - return !0 - }, r.prototype.setSpace = function (t, e) { - var i = e[0]; - return void 0 === i ? this.getValues(t) : ("number" == typeof i && (i = Array.prototype.slice.call(e)), this.setValues(t, i), this) - }, r.prototype.setChannel = function (t, e, i) { - var n = this.values[t]; - return void 0 === i ? n[e] : i === n[e] ? this : (n[e] = i, this.setValues(t, n), this) - }, "undefined" != typeof window && (window.Color = r), e.exports = r - }, {1: 1, 4: 4}], 3: [function (t, e, i) { - function n(t) { - var e, i, n = t[0] / 255, a = t[1] / 255, r = t[2] / 255, o = Math.min(n, a, r), s = Math.max(n, a, r), - l = s - o; - return s == o ? e = 0 : n == s ? e = (a - r) / l : a == s ? e = 2 + (r - n) / l : r == s && (e = 4 + (n - a) / l), (e = Math.min(60 * e, 360)) < 0 && (e += 360), i = (o + s) / 2, [e, 100 * (s == o ? 0 : i <= .5 ? l / (s + o) : l / (2 - s - o)), 100 * i] - } - function a(t) { - var e, i, n = t[0], a = t[1], r = t[2], o = Math.min(n, a, r), s = Math.max(n, a, r), l = s - o; - return i = 0 == s ? 0 : l / s * 1e3 / 10, s == o ? e = 0 : n == s ? e = (a - r) / l : a == s ? e = 2 + (r - n) / l : r == s && (e = 4 + (n - a) / l), (e = Math.min(60 * e, 360)) < 0 && (e += 360), [e, i, s / 255 * 1e3 / 10] - } + // Don't use min size here because of label rotation. When the labels are rotated, their rotation highly depends + // on the margin. Sometimes they need to increase in size slightly + box.update(box.fullWidth ? chartWidth : maxChartAreaWidth, chartHeight / 2, scaleMargin); + } else { + box.update(minBoxSize.width, maxChartAreaHeight); + } + } + } - function o(t) { - var e = t[0], i = t[1], a = t[2]; - return [n(t)[0], 100 * (1 / 255 * Math.min(e, Math.min(i, a))), 100 * (a = 1 - 1 / 255 * Math.max(e, Math.max(i, a)))] - } + // Update, and calculate the left and right margins for the horizontal boxes + helpers$1.each(verticalBoxes, fitBox); + addSizeByPosition(verticalBoxes, outerBoxSizes); - function s(t) { - var e, i = t[0] / 255, n = t[1] / 255, a = t[2] / 255; - return [100 * ((1 - i - (e = Math.min(1 - i, 1 - n, 1 - a))) / (1 - e) || 0), 100 * ((1 - n - e) / (1 - e) || 0), 100 * ((1 - a - e) / (1 - e) || 0), 100 * e] - } + // Set the Left and Right margins for the horizontal boxes + helpers$1.each(horizontalBoxes, fitBox); + addSizeByPosition(horizontalBoxes, outerBoxSizes); - function l(t) { - return S[JSON.stringify(t)] - } + function finalFitVerticalBox(box) { + var minBoxSize = helpers$1.findNextWhere(minBoxSizes, function (minSize) { + return minSize.box === box; + }); - function u(t) { - var e = t[0] / 255, i = t[1] / 255, n = t[2] / 255; - return [100 * (.4124 * (e = e > .04045 ? Math.pow((e + .055) / 1.055, 2.4) : e / 12.92) + .3576 * (i = i > .04045 ? Math.pow((i + .055) / 1.055, 2.4) : i / 12.92) + .1805 * (n = n > .04045 ? Math.pow((n + .055) / 1.055, 2.4) : n / 12.92)), 100 * (.2126 * e + .7152 * i + .0722 * n), 100 * (.0193 * e + .1192 * i + .9505 * n)] - } + var scaleMargin = { + left: 0, + right: 0, + top: outerBoxSizes.top, + bottom: outerBoxSizes.bottom + }; - function d(t) { - var e = u(t), i = e[0], n = e[1], a = e[2]; - return n /= 100, a /= 108.883, i = (i /= 95.047) > .008856 ? Math.pow(i, 1 / 3) : 7.787 * i + 16 / 116, [116 * (n = n > .008856 ? Math.pow(n, 1 / 3) : 7.787 * n + 16 / 116) - 16, 500 * (i - n), 200 * (n - (a = a > .008856 ? Math.pow(a, 1 / 3) : 7.787 * a + 16 / 116))] - } + if (minBoxSize) { + box.update(minBoxSize.width, maxChartAreaHeight, scaleMargin); + } + } - function h(t) { - var e, i, n, a, r, o = t[0] / 360, s = t[1] / 100, l = t[2] / 100; - if (0 == s) return [r = 255 * l, r, r]; - e = 2 * l - (i = l < .5 ? l * (1 + s) : l + s - l * s), a = [0, 0, 0]; - for (var u = 0; u < 3; u++) (n = o + 1 / 3 * -(u - 1)) < 0 && n++, n > 1 && n--, r = 6 * n < 1 ? e + 6 * (i - e) * n : 2 * n < 1 ? i : 3 * n < 2 ? e + (i - e) * (2 / 3 - n) * 6 : e, a[u] = 255 * r; - return a - } + // Let the left layout know the final margin + helpers$1.each(verticalBoxes, finalFitVerticalBox); - function c(t) { - var e = t[0] / 60, i = t[1] / 100, n = t[2] / 100, a = Math.floor(e) % 6, r = e - Math.floor(e), - o = 255 * n * (1 - i), s = 255 * n * (1 - i * r), l = 255 * n * (1 - i * (1 - r)); - n *= 255; - switch (a) { - case 0: - return [n, l, o]; - case 1: - return [s, n, o]; - case 2: - return [o, n, l]; - case 3: - return [o, s, n]; - case 4: - return [l, o, n]; - case 5: - return [n, o, s] - } - } + // Recalculate because the size of each layout might have changed slightly due to the margins (label rotation for instance) + outerBoxSizes = { + top: topPadding, + left: leftPadding, + bottom: bottomPadding, + right: rightPadding + }; + addSizeByPosition(outerBoxes, outerBoxSizes); - function f(t) { - var e, i, n, a, o = t[0] / 360, s = t[1] / 100, l = t[2] / 100, u = s + l; - switch (u > 1 && (s /= u, l /= u), n = 6 * o - (e = Math.floor(6 * o)), 0 != (1 & e) && (n = 1 - n), a = s + n * ((i = 1 - l) - s), e) { - default: - case 6: - case 0: - r = i, g = a, b = s; - break; - case 1: - r = a, g = i, b = s; - break; - case 2: - r = s, g = i, b = a; - break; - case 3: - r = s, g = a, b = i; - break; - case 4: - r = a, g = s, b = i; - break; - case 5: - r = i, g = s, b = a - } - return [255 * r, 255 * g, 255 * b] - } + // We may be adding some padding to account for rotated x axis labels + var leftPaddingAddition = Math.max(maxPadding.left - outerBoxSizes.left, 0); + outerBoxSizes.left += leftPaddingAddition; + outerBoxSizes.right += Math.max(maxPadding.right - outerBoxSizes.right, 0); - function m(t) { - var e = t[0] / 100, i = t[1] / 100, n = t[2] / 100, a = t[3] / 100; - return [255 * (1 - Math.min(1, e * (1 - a) + a)), 255 * (1 - Math.min(1, i * (1 - a) + a)), 255 * (1 - Math.min(1, n * (1 - a) + a))] - } + var topPaddingAddition = Math.max(maxPadding.top - outerBoxSizes.top, 0); + outerBoxSizes.top += topPaddingAddition; + outerBoxSizes.bottom += Math.max(maxPadding.bottom - outerBoxSizes.bottom, 0); - function p(t) { - var e, i, n, a = t[0] / 100, r = t[1] / 100, o = t[2] / 100; - return i = -.9689 * a + 1.8758 * r + .0415 * o, n = .0557 * a + -.204 * r + 1.057 * o, e = (e = 3.2406 * a + -1.5372 * r + -.4986 * o) > .0031308 ? 1.055 * Math.pow(e, 1 / 2.4) - .055 : e *= 12.92, i = i > .0031308 ? 1.055 * Math.pow(i, 1 / 2.4) - .055 : i *= 12.92, n = n > .0031308 ? 1.055 * Math.pow(n, 1 / 2.4) - .055 : n *= 12.92, [255 * (e = Math.min(Math.max(0, e), 1)), 255 * (i = Math.min(Math.max(0, i), 1)), 255 * (n = Math.min(Math.max(0, n), 1))] - } + // Figure out if our chart area changed. This would occur if the dataset layout label rotation + // changed due to the application of the margins in step 6. Since we can only get bigger, this is safe to do + // without calling `fit` again + var newMaxChartAreaHeight = height - outerBoxSizes.top - outerBoxSizes.bottom; + var newMaxChartAreaWidth = width - outerBoxSizes.left - outerBoxSizes.right; - function v(t) { - var e = t[0], i = t[1], n = t[2]; - return i /= 100, n /= 108.883, e = (e /= 95.047) > .008856 ? Math.pow(e, 1 / 3) : 7.787 * e + 16 / 116, [116 * (i = i > .008856 ? Math.pow(i, 1 / 3) : 7.787 * i + 16 / 116) - 16, 500 * (e - i), 200 * (i - (n = n > .008856 ? Math.pow(n, 1 / 3) : 7.787 * n + 16 / 116))] - } + if (newMaxChartAreaWidth !== maxChartAreaWidth || newMaxChartAreaHeight !== maxChartAreaHeight) { + helpers$1.each(verticalBoxes, function (box) { + box.height = newMaxChartAreaHeight; + }); - function y(t) { - var e, i, n, a, r = t[0], o = t[1], s = t[2]; - return r <= 8 ? a = (i = 100 * r / 903.3) / 100 * 7.787 + 16 / 116 : (i = 100 * Math.pow((r + 16) / 116, 3), a = Math.pow(i / 100, 1 / 3)), [e = e / 95.047 <= .008856 ? e = 95.047 * (o / 500 + a - 16 / 116) / 7.787 : 95.047 * Math.pow(o / 500 + a, 3), i, n = n / 108.883 <= .008859 ? n = 108.883 * (a - s / 200 - 16 / 116) / 7.787 : 108.883 * Math.pow(a - s / 200, 3)] - } + helpers$1.each(horizontalBoxes, function (box) { + if (!box.fullWidth) { + box.width = newMaxChartAreaWidth; + } + }); - function x(t) { - var e, i = t[0], n = t[1], a = t[2]; - return (e = 360 * Math.atan2(a, n) / 2 / Math.PI) < 0 && (e += 360), [i, Math.sqrt(n * n + a * a), e] - } + maxChartAreaHeight = newMaxChartAreaHeight; + maxChartAreaWidth = newMaxChartAreaWidth; + } - function _(t) { - return p(y(t)) - } + // Step 7 - Position the boxes + var left = leftPadding + leftPaddingAddition; + var top = topPadding + topPaddingAddition; - function k(t) { - var e, i = t[0], n = t[1]; - return e = t[2] / 360 * 2 * Math.PI, [i, n * Math.cos(e), n * Math.sin(e)] - } + function placeBox(box) { + if (box.isHorizontal()) { + box.left = box.fullWidth ? leftPadding : outerBoxSizes.left; + box.right = box.fullWidth ? width - rightPadding : outerBoxSizes.left + maxChartAreaWidth; + box.top = top; + box.bottom = top + box.height; + + // Move to next point + top = box.bottom; + + } else { + + box.left = left; + box.right = left + box.width; + box.top = outerBoxSizes.top; + box.bottom = outerBoxSizes.top + maxChartAreaHeight; + + // Move to next point + left = box.right; + } + } + + helpers$1.each(leftBoxes.concat(topBoxes), placeBox); + + // Account for chart width and height + left += maxChartAreaWidth; + top += maxChartAreaHeight; + + helpers$1.each(rightBoxes, placeBox); + helpers$1.each(bottomBoxes, placeBox); + + // Step 8 + chart.chartArea = { + left: outerBoxSizes.left, + top: outerBoxSizes.top, + right: outerBoxSizes.left + maxChartAreaWidth, + bottom: outerBoxSizes.top + maxChartAreaHeight + }; + + // Step 9 + helpers$1.each(chartAreaBoxes, function (box) { + box.left = chart.chartArea.left; + box.top = chart.chartArea.top; + box.right = chart.chartArea.right; + box.bottom = chart.chartArea.bottom; + + box.update(maxChartAreaWidth, maxChartAreaHeight); + }); + } + }; + + /** + * Platform fallback implementation (minimal). + * @see https://github.com/chartjs/Chart.js/pull/4591#issuecomment-319575939 + */ + + var platform_basic = { + acquireContext: function (item) { + if (item && item.canvas) { + // Support for any object associated to a canvas (including a context2d) + item = item.canvas; + } + + return item && item.getContext('2d') || null; + } + }; + + var platform_dom = "/*\n * DOM element rendering detection\n * https://davidwalsh.name/detect-node-insertion\n */\n@keyframes chartjs-render-animation {\n\tfrom { opacity: 0.99; }\n\tto { opacity: 1; }\n}\n\n.chartjs-render-monitor {\n\tanimation: chartjs-render-animation 0.001s;\n}\n\n/*\n * DOM element resizing detection\n * https://github.com/marcj/css-element-queries\n */\n.chartjs-size-monitor,\n.chartjs-size-monitor-expand,\n.chartjs-size-monitor-shrink {\n\tposition: absolute;\n\tdirection: ltr;\n\tleft: 0;\n\ttop: 0;\n\tright: 0;\n\tbottom: 0;\n\toverflow: hidden;\n\tpointer-events: none;\n\tvisibility: hidden;\n\tz-index: -1;\n}\n\n.chartjs-size-monitor-expand > div {\n\tposition: absolute;\n\twidth: 1000000px;\n\theight: 1000000px;\n\tleft: 0;\n\ttop: 0;\n}\n\n.chartjs-size-monitor-shrink > div {\n\tposition: absolute;\n\twidth: 200%;\n\theight: 200%;\n\tleft: 0;\n\ttop: 0;\n}\n"; + + var platform_dom$1 = /*#__PURE__*/Object.freeze({ + default: platform_dom + }); + + var commonjsGlobal = typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {}; + + function commonjsRequire() { + throw new Error('Dynamic requires are not currently supported by rollup-plugin-commonjs'); + } + + function createCommonjsModule(fn, module) { + return module = {exports: {}}, fn(module, module.exports), module.exports; + } + + function getCjsExportFromNamespace(n) { + return n && n.default || n; + } + + var stylesheet = getCjsExportFromNamespace(platform_dom$1); + + var EXPANDO_KEY = '$chartjs'; + var CSS_PREFIX = 'chartjs-'; + var CSS_SIZE_MONITOR = CSS_PREFIX + 'size-monitor'; + var CSS_RENDER_MONITOR = CSS_PREFIX + 'render-monitor'; + var CSS_RENDER_ANIMATION = CSS_PREFIX + 'render-animation'; + var ANIMATION_START_EVENTS = ['animationstart', 'webkitAnimationStart']; + + /** + * DOM event types -> Chart.js event types. + * Note: only events with different types are mapped. + * @see https://developer.mozilla.org/en-US/docs/Web/Events + */ + var EVENT_TYPES = { + touchstart: 'mousedown', + touchmove: 'mousemove', + touchend: 'mouseup', + pointerenter: 'mouseenter', + pointerdown: 'mousedown', + pointermove: 'mousemove', + pointerup: 'mouseup', + pointerleave: 'mouseout', + pointerout: 'mouseout' + }; + + /** + * The "used" size is the final value of a dimension property after all calculations have + * been performed. This method uses the computed style of `element` but returns undefined + * if the computed style is not expressed in pixels. That can happen in some cases where + * `element` has a size relative to its parent and this last one is not yet displayed, + * for example because of `display: none` on a parent node. + * @see https://developer.mozilla.org/en-US/docs/Web/CSS/used_value + * @returns {number} Size in pixels or undefined if unknown. + */ + function readUsedSize(element, property) { + var value = helpers$1.getStyle(element, property); + var matches = value && value.match(/^(\d+)(\.\d+)?px$/); + return matches ? Number(matches[1]) : undefined; + } + + /** + * Initializes the canvas style and render size without modifying the canvas display size, + * since responsiveness is handled by the controller.resize() method. The config is used + * to determine the aspect ratio to apply in case no explicit height has been specified. + */ + function initCanvas(canvas, config) { + var style = canvas.style; + + // NOTE(SB) canvas.getAttribute('width') !== canvas.width: in the first case it + // returns null or '' if no explicit value has been set to the canvas attribute. + var renderHeight = canvas.getAttribute('height'); + var renderWidth = canvas.getAttribute('width'); + + // Chart.js modifies some canvas values that we want to restore on destroy + canvas[EXPANDO_KEY] = { + initial: { + height: renderHeight, + width: renderWidth, + style: { + display: style.display, + height: style.height, + width: style.width + } + } + }; + + // Force canvas to display as block to avoid extra space caused by inline + // elements, which would interfere with the responsive resize process. + // https://github.com/chartjs/Chart.js/issues/2538 + style.display = style.display || 'block'; + + if (renderWidth === null || renderWidth === '') { + var displayWidth = readUsedSize(canvas, 'width'); + if (displayWidth !== undefined) { + canvas.width = displayWidth; + } + } + + if (renderHeight === null || renderHeight === '') { + if (canvas.style.height === '') { + // If no explicit render height and style height, let's apply the aspect ratio, + // which one can be specified by the user but also by charts as default option + // (i.e. options.aspectRatio). If not specified, use canvas aspect ratio of 2. + canvas.height = canvas.width / (config.options.aspectRatio || 2); + } else { + var displayHeight = readUsedSize(canvas, 'height'); + if (displayWidth !== undefined) { + canvas.height = displayHeight; + } + } + } + + return canvas; + } + + /** + * Detects support for options object argument in addEventListener. + * https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener#Safely_detecting_option_support + * @private + */ + var supportsEventListenerOptions = (function () { + var supports = false; + try { + var options = Object.defineProperty({}, 'passive', { + // eslint-disable-next-line getter-return + get: function () { + supports = true; + } + }); + window.addEventListener('e', null, options); + } catch (e) { + // continue regardless of error + } + return supports; + }()); + +// Default passive to true as expected by Chrome for 'touchstart' and 'touchend' events. +// https://github.com/chartjs/Chart.js/issues/4287 + var eventListenerOptions = supportsEventListenerOptions ? {passive: true} : false; + + function addListener(node, type, listener) { + node.addEventListener(type, listener, eventListenerOptions); + } + + function removeListener(node, type, listener) { + node.removeEventListener(type, listener, eventListenerOptions); + } + + function createEvent(type, chart, x, y, nativeEvent) { + return { + type: type, + chart: chart, + native: nativeEvent || null, + x: x !== undefined ? x : null, + y: y !== undefined ? y : null, + }; + } + + function fromNativeEvent(event, chart) { + var type = EVENT_TYPES[event.type] || event.type; + var pos = helpers$1.getRelativePosition(event, chart); + return createEvent(type, chart, pos.x, pos.y, event); + } + + function throttled(fn, thisArg) { + var ticking = false; + var args = []; + + return function () { + args = Array.prototype.slice.call(arguments); + thisArg = thisArg || this; + + if (!ticking) { + ticking = true; + helpers$1.requestAnimFrame.call(window, function () { + ticking = false; + fn.apply(thisArg, args); + }); + } + }; + } + + function createDiv(cls) { + var el = document.createElement('div'); + el.className = cls || ''; + return el; + } + +// Implementation based on https://github.com/marcj/css-element-queries + function createResizer(handler) { + var maxSize = 1000000; + + // NOTE(SB) Don't use innerHTML because it could be considered unsafe. + // https://github.com/chartjs/Chart.js/issues/5902 + var resizer = createDiv(CSS_SIZE_MONITOR); + var expand = createDiv(CSS_SIZE_MONITOR + '-expand'); + var shrink = createDiv(CSS_SIZE_MONITOR + '-shrink'); + + expand.appendChild(createDiv()); + shrink.appendChild(createDiv()); + + resizer.appendChild(expand); + resizer.appendChild(shrink); + resizer._reset = function () { + expand.scrollLeft = maxSize; + expand.scrollTop = maxSize; + shrink.scrollLeft = maxSize; + shrink.scrollTop = maxSize; + }; + + var onScroll = function () { + resizer._reset(); + handler(); + }; + + addListener(expand, 'scroll', onScroll.bind(expand, 'expand')); + addListener(shrink, 'scroll', onScroll.bind(shrink, 'shrink')); + + return resizer; + } + +// https://davidwalsh.name/detect-node-insertion + function watchForRender(node, handler) { + var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {}); + var proxy = expando.renderProxy = function (e) { + if (e.animationName === CSS_RENDER_ANIMATION) { + handler(); + } + }; + + helpers$1.each(ANIMATION_START_EVENTS, function (type) { + addListener(node, type, proxy); + }); + + // #4737: Chrome might skip the CSS animation when the CSS_RENDER_MONITOR class + // is removed then added back immediately (same animation frame?). Accessing the + // `offsetParent` property will force a reflow and re-evaluate the CSS animation. + // https://gist.github.com/paulirish/5d52fb081b3570c81e3a#box-metrics + // https://github.com/chartjs/Chart.js/issues/4737 + expando.reflow = !!node.offsetParent; + + node.classList.add(CSS_RENDER_MONITOR); + } + + function unwatchForRender(node) { + var expando = node[EXPANDO_KEY] || {}; + var proxy = expando.renderProxy; + + if (proxy) { + helpers$1.each(ANIMATION_START_EVENTS, function (type) { + removeListener(node, type, proxy); + }); - function w(t) { - return M[t] + delete expando.renderProxy; + } + + node.classList.remove(CSS_RENDER_MONITOR); + } + + function addResizeListener(node, listener, chart) { + var expando = node[EXPANDO_KEY] || (node[EXPANDO_KEY] = {}); + + // Let's keep track of this added resizer and thus avoid DOM query when removing it. + var resizer = expando.resizer = createResizer(throttled(function () { + if (expando.resizer) { + var container = chart.options.maintainAspectRatio && node.parentNode; + var w = container ? container.clientWidth : 0; + listener(createEvent('resize', chart)); + if (container && container.clientWidth < w && chart.canvas) { + // If the container size shrank during chart resize, let's assume + // scrollbar appeared. So we resize again with the scrollbar visible - + // effectively making chart smaller and the scrollbar hidden again. + // Because we are inside `throttled`, and currently `ticking`, scroll + // events are ignored during this whole 2 resize process. + // If we assumed wrong and something else happened, we are resizing + // twice in a frame (potential performance issue) + listener(createEvent('resize', chart)); + } + } + })); + + // The resizer needs to be attached to the node parent, so we first need to be + // sure that `node` is attached to the DOM before injecting the resizer element. + watchForRender(node, function () { + if (expando.resizer) { + var container = node.parentNode; + if (container && container !== resizer.parentNode) { + container.insertBefore(resizer, container.firstChild); + } + + // The container size might have changed, let's reset the resizer state. + resizer._reset(); + } + }); + } + + function removeResizeListener(node) { + var expando = node[EXPANDO_KEY] || {}; + var resizer = expando.resizer; + + delete expando.resizer; + unwatchForRender(node); + + if (resizer && resizer.parentNode) { + resizer.parentNode.removeChild(resizer); + } + } + + function injectCSS(platform, css) { + // https://stackoverflow.com/q/3922139 + var style = platform._style || document.createElement('style'); + if (!platform._style) { + platform._style = style; + css = '/* Chart.js */\n' + css; + style.setAttribute('type', 'text/css'); + document.getElementsByTagName('head')[0].appendChild(style); + } + + style.appendChild(document.createTextNode(css)); + } + + var platform_dom$2 = { + /** + * When `true`, prevents the automatic injection of the stylesheet required to + * correctly detect when the chart is added to the DOM and then resized. This + * switch has been added to allow external stylesheet (`dist/Chart(.min)?.js`) + * to be manually imported to make this library compatible with any CSP. + * See https://github.com/chartjs/Chart.js/issues/5208 + */ + disableCSSInjection: false, + + /** + * This property holds whether this platform is enabled for the current environment. + * Currently used by platform.js to select the proper implementation. + * @private + */ + _enabled: typeof window !== 'undefined' && typeof document !== 'undefined', + + /** + * @private + */ + _ensureLoaded: function () { + if (this._loaded) { + return; + } + + this._loaded = true; + + // https://github.com/chartjs/Chart.js/issues/5208 + if (!this.disableCSSInjection) { + injectCSS(this, stylesheet); + } + }, + + acquireContext: function (item, config) { + if (typeof item === 'string') { + item = document.getElementById(item); + } else if (item.length) { + // Support for array based queries (such as jQuery) + item = item[0]; + } + + if (item && item.canvas) { + // Support for any object associated to a canvas (including a context2d) + item = item.canvas; + } + + // To prevent canvas fingerprinting, some add-ons undefine the getContext + // method, for example: https://github.com/kkapsner/CanvasBlocker + // https://github.com/chartjs/Chart.js/issues/2807 + var context = item && item.getContext && item.getContext('2d'); + + // Load platform resources on first chart creation, to make possible to change + // platform options after importing the library (e.g. `disableCSSInjection`). + this._ensureLoaded(); + + // `instanceof HTMLCanvasElement/CanvasRenderingContext2D` fails when the item is + // inside an iframe or when running in a protected environment. We could guess the + // types from their toString() value but let's keep things flexible and assume it's + // a sufficient condition if the item has a context2D which has item as `canvas`. + // https://github.com/chartjs/Chart.js/issues/3887 + // https://github.com/chartjs/Chart.js/issues/4102 + // https://github.com/chartjs/Chart.js/issues/4152 + if (context && context.canvas === item) { + initCanvas(item, config); + return context; + } + + return null; + }, + + releaseContext: function (context) { + var canvas = context.canvas; + if (!canvas[EXPANDO_KEY]) { + return; + } + + var initial = canvas[EXPANDO_KEY].initial; + ['height', 'width'].forEach(function (prop) { + var value = initial[prop]; + if (helpers$1.isNullOrUndef(value)) { + canvas.removeAttribute(prop); + } else { + canvas.setAttribute(prop, value); + } + }); + + helpers$1.each(initial.style || {}, function (value, key) { + canvas.style[key] = value; + }); + + // The canvas render size might have been changed (and thus the state stack discarded), + // we can't use save() and restore() to restore the initial state. So make sure that at + // least the canvas context is reset to the default state by setting the canvas width. + // https://www.w3.org/TR/2011/WD-html5-20110525/the-canvas-element.html + // eslint-disable-next-line no-self-assign + canvas.width = canvas.width; + + delete canvas[EXPANDO_KEY]; + }, + + addEventListener: function (chart, type, listener) { + var canvas = chart.canvas; + if (type === 'resize') { + // Note: the resize event is not supported on all browsers. + addResizeListener(canvas, listener, chart); + return; + } + + var expando = listener[EXPANDO_KEY] || (listener[EXPANDO_KEY] = {}); + var proxies = expando.proxies || (expando.proxies = {}); + var proxy = proxies[chart.id + '_' + type] = function (event) { + listener(fromNativeEvent(event, chart)); + }; + + addListener(canvas, type, proxy); + }, + + removeEventListener: function (chart, type, listener) { + var canvas = chart.canvas; + if (type === 'resize') { + // Note: the resize event is not supported on all browsers. + removeResizeListener(canvas); + return; + } + + var expando = listener[EXPANDO_KEY] || {}; + var proxies = expando.proxies || {}; + var proxy = proxies[chart.id + '_' + type]; + if (!proxy) { + return; + } + + removeListener(canvas, type, proxy); + } + }; + +// DEPRECATIONS + + /** + * Provided for backward compatibility, use EventTarget.addEventListener instead. + * EventTarget.addEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+ + * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/addEventListener + * @function Chart.helpers.addEvent + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ + helpers$1.addEvent = addListener; + + /** + * Provided for backward compatibility, use EventTarget.removeEventListener instead. + * EventTarget.removeEventListener compatibility: Chrome, Opera 7, Safari, FF1.5+, IE9+ + * @see https://developer.mozilla.org/en-US/docs/Web/API/EventTarget/removeEventListener + * @function Chart.helpers.removeEvent + * @deprecated since version 2.7.0 + * @todo remove at version 3 + * @private + */ + helpers$1.removeEvent = removeListener; + +// @TODO Make possible to select another platform at build time. + var implementation = platform_dom$2._enabled ? platform_dom$2 : platform_basic; + + /** + * @namespace Chart.platform + * @see https://chartjs.gitbooks.io/proposals/content/Platform.html + * @since 2.4.0 + */ + var platform = helpers$1.extend({ + /** + * @since 2.7.0 + */ + initialize: function () { + }, + + /** + * Called at chart construction time, returns a context2d instance implementing + * the [W3C Canvas 2D Context API standard]{@link https://www.w3.org/TR/2dcontext/}. + * @param {*} item - The native item from which to acquire context (platform specific) + * @param {object} options - The chart options + * @returns {CanvasRenderingContext2D} context2d instance + */ + acquireContext: function () { + }, + + /** + * Called at chart destruction time, releases any resources associated to the context + * previously returned by the acquireContext() method. + * @param {CanvasRenderingContext2D} context - The context2d instance + * @returns {boolean} true if the method succeeded, else false + */ + releaseContext: function () { + }, + + /** + * Registers the specified listener on the given chart. + * @param {Chart} chart - Chart from which to listen for event + * @param {string} type - The ({@link IEvent}) type to listen for + * @param {function} listener - Receives a notification (an object that implements + * the {@link IEvent} interface) when an event of the specified type occurs. + */ + addEventListener: function () { + }, + + /** + * Removes the specified listener previously registered with addEventListener. + * @param {Chart} chart - Chart from which to remove the listener + * @param {string} type - The ({@link IEvent}) type to remove + * @param {function} listener - The listener function to remove from the event target. + */ + removeEventListener: function () { + } + + }, implementation); + + core_defaults._set('global', { + plugins: {} + }); + + /** + * The plugin service singleton + * @namespace Chart.plugins + * @since 2.1.0 + */ + var core_plugins = { + /** + * Globally registered plugins. + * @private + */ + _plugins: [], + + /** + * This identifier is used to invalidate the descriptors cache attached to each chart + * when a global plugin is registered or unregistered. In this case, the cache ID is + * incremented and descriptors are regenerated during following API calls. + * @private + */ + _cacheId: 0, + + /** + * Registers the given plugin(s) if not already registered. + * @param {IPlugin[]|IPlugin} plugins plugin instance(s). + */ + register: function (plugins) { + var p = this._plugins; + ([]).concat(plugins).forEach(function (plugin) { + if (p.indexOf(plugin) === -1) { + p.push(plugin); + } + }); + + this._cacheId++; + }, + + /** + * Unregisters the given plugin(s) only if registered. + * @param {IPlugin[]|IPlugin} plugins plugin instance(s). + */ + unregister: function (plugins) { + var p = this._plugins; + ([]).concat(plugins).forEach(function (plugin) { + var idx = p.indexOf(plugin); + if (idx !== -1) { + p.splice(idx, 1); + } + }); + + this._cacheId++; + }, + + /** + * Remove all registered plugins. + * @since 2.1.5 + */ + clear: function () { + this._plugins = []; + this._cacheId++; + }, + + /** + * Returns the number of registered plugins? + * @returns {number} + * @since 2.1.5 + */ + count: function () { + return this._plugins.length; + }, + + /** + * Returns all registered plugin instances. + * @returns {IPlugin[]} array of plugin objects. + * @since 2.1.5 + */ + getAll: function () { + return this._plugins; + }, + + /** + * Calls enabled plugins for `chart` on the specified hook and with the given args. + * This method immediately returns as soon as a plugin explicitly returns false. The + * returned value can be used, for instance, to interrupt the current action. + * @param {Chart} chart - The chart instance for which plugins should be called. + * @param {string} hook - The name of the plugin method to call (e.g. 'beforeUpdate'). + * @param {Array} [args] - Extra arguments to apply to the hook call. + * @returns {boolean} false if any of the plugins return false, else returns true. + */ + notify: function (chart, hook, args) { + var descriptors = this.descriptors(chart); + var ilen = descriptors.length; + var i, descriptor, plugin, params, method; + + for (i = 0; i < ilen; ++i) { + descriptor = descriptors[i]; + plugin = descriptor.plugin; + method = plugin[hook]; + if (typeof method === 'function') { + params = [chart].concat(args || []); + params.push(descriptor.options); + if (method.apply(plugin, params) === false) { + return false; + } + } + } + + return true; + }, + + /** + * Returns descriptors of enabled plugins for the given chart. + * @returns {object[]} [{ plugin, options }] + * @private + */ + descriptors: function (chart) { + var cache = chart.$plugins || (chart.$plugins = {}); + if (cache.id === this._cacheId) { + return cache.descriptors; + } + + var plugins = []; + var descriptors = []; + var config = (chart && chart.config) || {}; + var options = (config.options && config.options.plugins) || {}; + + this._plugins.concat(config.plugins || []).forEach(function (plugin) { + var idx = plugins.indexOf(plugin); + if (idx !== -1) { + return; + } + + var id = plugin.id; + var opts = options[id]; + if (opts === false) { + return; + } + + if (opts === true) { + opts = helpers$1.clone(core_defaults.global.plugins[id]); + } + + plugins.push(plugin); + descriptors.push({ + plugin: plugin, + options: opts || {} + }); + }); + + cache.descriptors = descriptors; + cache.id = this._cacheId; + return descriptors; + }, + + /** + * Invalidates cache for the given chart: descriptors hold a reference on plugin option, + * but in some cases, this reference can be changed by the user when updating options. + * https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167 + * @private + */ + _invalidate: function (chart) { + delete chart.$plugins; + } + }; + + var core_scaleService = { + // Scale registration object. Extensions can register new scale types (such as log or DB scales) and then + // use the new chart options to grab the correct scale + constructors: {}, + // Use a registration function so that we can move to an ES6 map when we no longer need to support + // old browsers + + // Scale config defaults + defaults: {}, + registerScaleType: function (type, scaleConstructor, scaleDefaults) { + this.constructors[type] = scaleConstructor; + this.defaults[type] = helpers$1.clone(scaleDefaults); + }, + getScaleConstructor: function (type) { + return this.constructors.hasOwnProperty(type) ? this.constructors[type] : undefined; + }, + getScaleDefaults: function (type) { + // Return the scale defaults merged with the global settings so that we always use the latest ones + return this.defaults.hasOwnProperty(type) ? helpers$1.merge({}, [core_defaults.scale, this.defaults[type]]) : {}; + }, + updateScaleDefaults: function (type, additions) { + var me = this; + if (me.defaults.hasOwnProperty(type)) { + me.defaults[type] = helpers$1.extend(me.defaults[type], additions); + } + }, + addScalesToLayout: function (chart) { + // Adds each scale to the chart.boxes array to be sized accordingly + helpers$1.each(chart.scales, function (scale) { + // Set ILayoutItem parameters for backwards compatibility + scale.fullWidth = scale.options.fullWidth; + scale.position = scale.options.position; + scale.weight = scale.options.weight; + core_layouts.addBox(chart, scale); + }); + } + }; + + var valueOrDefault$7 = helpers$1.valueOrDefault; + + core_defaults._set('global', { + tooltips: { + enabled: true, + custom: null, + mode: 'nearest', + position: 'average', + intersect: true, + backgroundColor: 'rgba(0,0,0,0.8)', + titleFontStyle: 'bold', + titleSpacing: 2, + titleMarginBottom: 6, + titleFontColor: '#fff', + titleAlign: 'left', + bodySpacing: 2, + bodyFontColor: '#fff', + bodyAlign: 'left', + footerFontStyle: 'bold', + footerSpacing: 2, + footerMarginTop: 6, + footerFontColor: '#fff', + footerAlign: 'left', + yPadding: 6, + xPadding: 6, + caretPadding: 2, + caretSize: 5, + cornerRadius: 6, + multiKeyBackground: '#fff', + displayColors: true, + borderColor: 'rgba(0,0,0,0)', + borderWidth: 0, + callbacks: { + // Args are: (tooltipItems, data) + beforeTitle: helpers$1.noop, + title: function (tooltipItems, data) { + var title = ''; + var labels = data.labels; + var labelCount = labels ? labels.length : 0; + + if (tooltipItems.length > 0) { + var item = tooltipItems[0]; + if (item.label) { + title = item.label; + } else if (item.xLabel) { + title = item.xLabel; + } else if (labelCount > 0 && item.index < labelCount) { + title = labels[item.index]; } + } - e.exports = { - rgb2hsl: n, - rgb2hsv: a, - rgb2hwb: o, - rgb2cmyk: s, - rgb2keyword: l, - rgb2xyz: u, - rgb2lab: d, - rgb2lch: function (t) { - return x(d(t)) - }, - hsl2rgb: h, - hsl2hsv: function (t) { - var e = t[0], i = t[1] / 100, n = t[2] / 100; - if (0 === n) return [0, 0, 0]; - return [e, 100 * (2 * (i *= (n *= 2) <= 1 ? n : 2 - n) / (n + i)), 100 * ((n + i) / 2)] - }, - hsl2hwb: function (t) { - return o(h(t)) - }, - hsl2cmyk: function (t) { - return s(h(t)) - }, - hsl2keyword: function (t) { - return l(h(t)) - }, - hsv2rgb: c, - hsv2hsl: function (t) { - var e, i, n = t[0], a = t[1] / 100, r = t[2] / 100; - return e = a * r, [n, 100 * (e = (e /= (i = (2 - a) * r) <= 1 ? i : 2 - i) || 0), 100 * (i /= 2)] - }, - hsv2hwb: function (t) { - return o(c(t)) - }, - hsv2cmyk: function (t) { - return s(c(t)) - }, - hsv2keyword: function (t) { - return l(c(t)) - }, - hwb2rgb: f, - hwb2hsl: function (t) { - return n(f(t)) - }, - hwb2hsv: function (t) { - return a(f(t)) - }, - hwb2cmyk: function (t) { - return s(f(t)) - }, - hwb2keyword: function (t) { - return l(f(t)) - }, - cmyk2rgb: m, - cmyk2hsl: function (t) { - return n(m(t)) - }, - cmyk2hsv: function (t) { - return a(m(t)) - }, - cmyk2hwb: function (t) { - return o(m(t)) - }, - cmyk2keyword: function (t) { - return l(m(t)) - }, - keyword2rgb: w, - keyword2hsl: function (t) { - return n(w(t)) - }, - keyword2hsv: function (t) { - return a(w(t)) - }, - keyword2hwb: function (t) { - return o(w(t)) - }, - keyword2cmyk: function (t) { - return s(w(t)) - }, - keyword2lab: function (t) { - return d(w(t)) - }, - keyword2xyz: function (t) { - return u(w(t)) - }, - xyz2rgb: p, - xyz2lab: v, - xyz2lch: function (t) { - return x(v(t)) - }, - lab2xyz: y, - lab2rgb: _, - lab2lch: x, - lch2lab: k, - lch2xyz: function (t) { - return y(k(t)) - }, - lch2rgb: function (t) { - return _(k(t)) - } - }; - var M = { - aliceblue: [240, 248, 255], - antiquewhite: [250, 235, 215], - aqua: [0, 255, 255], - aquamarine: [127, 255, 212], - azure: [240, 255, 255], - beige: [245, 245, 220], - bisque: [255, 228, 196], - black: [0, 0, 0], - blanchedalmond: [255, 235, 205], - blue: [0, 0, 255], - blueviolet: [138, 43, 226], - brown: [165, 42, 42], - burlywood: [222, 184, 135], - cadetblue: [95, 158, 160], - chartreuse: [127, 255, 0], - chocolate: [210, 105, 30], - coral: [255, 127, 80], - cornflowerblue: [100, 149, 237], - cornsilk: [255, 248, 220], - crimson: [220, 20, 60], - cyan: [0, 255, 255], - darkblue: [0, 0, 139], - darkcyan: [0, 139, 139], - darkgoldenrod: [184, 134, 11], - darkgray: [169, 169, 169], - darkgreen: [0, 100, 0], - darkgrey: [169, 169, 169], - darkkhaki: [189, 183, 107], - darkmagenta: [139, 0, 139], - darkolivegreen: [85, 107, 47], - darkorange: [255, 140, 0], - darkorchid: [153, 50, 204], - darkred: [139, 0, 0], - darksalmon: [233, 150, 122], - darkseagreen: [143, 188, 143], - darkslateblue: [72, 61, 139], - darkslategray: [47, 79, 79], - darkslategrey: [47, 79, 79], - darkturquoise: [0, 206, 209], - darkviolet: [148, 0, 211], - deeppink: [255, 20, 147], - deepskyblue: [0, 191, 255], - dimgray: [105, 105, 105], - dimgrey: [105, 105, 105], - dodgerblue: [30, 144, 255], - firebrick: [178, 34, 34], - floralwhite: [255, 250, 240], - forestgreen: [34, 139, 34], - fuchsia: [255, 0, 255], - gainsboro: [220, 220, 220], - ghostwhite: [248, 248, 255], - gold: [255, 215, 0], - goldenrod: [218, 165, 32], - gray: [128, 128, 128], - green: [0, 128, 0], - greenyellow: [173, 255, 47], - grey: [128, 128, 128], - honeydew: [240, 255, 240], - hotpink: [255, 105, 180], - indianred: [205, 92, 92], - indigo: [75, 0, 130], - ivory: [255, 255, 240], - khaki: [240, 230, 140], - lavender: [230, 230, 250], - lavenderblush: [255, 240, 245], - lawngreen: [124, 252, 0], - lemonchiffon: [255, 250, 205], - lightblue: [173, 216, 230], - lightcoral: [240, 128, 128], - lightcyan: [224, 255, 255], - lightgoldenrodyellow: [250, 250, 210], - lightgray: [211, 211, 211], - lightgreen: [144, 238, 144], - lightgrey: [211, 211, 211], - lightpink: [255, 182, 193], - lightsalmon: [255, 160, 122], - lightseagreen: [32, 178, 170], - lightskyblue: [135, 206, 250], - lightslategray: [119, 136, 153], - lightslategrey: [119, 136, 153], - lightsteelblue: [176, 196, 222], - lightyellow: [255, 255, 224], - lime: [0, 255, 0], - limegreen: [50, 205, 50], - linen: [250, 240, 230], - magenta: [255, 0, 255], - maroon: [128, 0, 0], - mediumaquamarine: [102, 205, 170], - mediumblue: [0, 0, 205], - mediumorchid: [186, 85, 211], - mediumpurple: [147, 112, 219], - mediumseagreen: [60, 179, 113], - mediumslateblue: [123, 104, 238], - mediumspringgreen: [0, 250, 154], - mediumturquoise: [72, 209, 204], - mediumvioletred: [199, 21, 133], - midnightblue: [25, 25, 112], - mintcream: [245, 255, 250], - mistyrose: [255, 228, 225], - moccasin: [255, 228, 181], - navajowhite: [255, 222, 173], - navy: [0, 0, 128], - oldlace: [253, 245, 230], - olive: [128, 128, 0], - olivedrab: [107, 142, 35], - orange: [255, 165, 0], - orangered: [255, 69, 0], - orchid: [218, 112, 214], - palegoldenrod: [238, 232, 170], - palegreen: [152, 251, 152], - paleturquoise: [175, 238, 238], - palevioletred: [219, 112, 147], - papayawhip: [255, 239, 213], - peachpuff: [255, 218, 185], - peru: [205, 133, 63], - pink: [255, 192, 203], - plum: [221, 160, 221], - powderblue: [176, 224, 230], - purple: [128, 0, 128], - rebeccapurple: [102, 51, 153], - red: [255, 0, 0], - rosybrown: [188, 143, 143], - royalblue: [65, 105, 225], - saddlebrown: [139, 69, 19], - salmon: [250, 128, 114], - sandybrown: [244, 164, 96], - seagreen: [46, 139, 87], - seashell: [255, 245, 238], - sienna: [160, 82, 45], - silver: [192, 192, 192], - skyblue: [135, 206, 235], - slateblue: [106, 90, 205], - slategray: [112, 128, 144], - slategrey: [112, 128, 144], - snow: [255, 250, 250], - springgreen: [0, 255, 127], - steelblue: [70, 130, 180], - tan: [210, 180, 140], - teal: [0, 128, 128], - thistle: [216, 191, 216], - tomato: [255, 99, 71], - turquoise: [64, 224, 208], - violet: [238, 130, 238], - wheat: [245, 222, 179], - white: [255, 255, 255], - whitesmoke: [245, 245, 245], - yellow: [255, 255, 0], - yellowgreen: [154, 205, 50] - }, S = {}; - for (var D in M) S[JSON.stringify(M[D])] = D - }, {}], 4: [function (t, e, i) { - var n = t(3), a = function () { - return new u - }; - for (var r in n) { - a[r + "Raw"] = function (t) { - return function (e) { - return "number" == typeof e && (e = Array.prototype.slice.call(arguments)), n[t](e) - } - }(r); - var o = /(\w+)2(\w+)/.exec(r), s = o[1], l = o[2]; - (a[s] = a[s] || {})[l] = a[r] = function (t) { - return function (e) { - "number" == typeof e && (e = Array.prototype.slice.call(arguments)); - var i = n[t](e); - if ("string" == typeof i || void 0 === i) return i; - for (var a = 0; a < i.length; a++) i[a] = Math.round(i[a]); - return i - } - }(r) + return title; + }, + afterTitle: helpers$1.noop, + + // Args are: (tooltipItems, data) + beforeBody: helpers$1.noop, + + // Args are: (tooltipItem, data) + beforeLabel: helpers$1.noop, + label: function (tooltipItem, data) { + var label = data.datasets[tooltipItem.datasetIndex].label || ''; + + if (label) { + label += ': '; + } + if (!helpers$1.isNullOrUndef(tooltipItem.value)) { + label += tooltipItem.value; + } else { + label += tooltipItem.yLabel; + } + return label; + }, + labelColor: function (tooltipItem, chart) { + var meta = chart.getDatasetMeta(tooltipItem.datasetIndex); + var activeElement = meta.data[tooltipItem.index]; + var view = activeElement._view; + return { + borderColor: view.borderColor, + backgroundColor: view.backgroundColor + }; + }, + labelTextColor: function () { + return this._options.bodyFontColor; + }, + afterLabel: helpers$1.noop, + + // Args are: (tooltipItems, data) + afterBody: helpers$1.noop, + + // Args are: (tooltipItems, data) + beforeFooter: helpers$1.noop, + footer: helpers$1.noop, + afterFooter: helpers$1.noop + } + } + }); + + var positioners = { + /** + * Average mode places the tooltip at the average position of the elements shown + * @function Chart.Tooltip.positioners.average + * @param elements {ChartElement[]} the elements being displayed in the tooltip + * @returns {object} tooltip position + */ + average: function (elements) { + if (!elements.length) { + return false; + } + + var i, len; + var x = 0; + var y = 0; + var count = 0; + + for (i = 0, len = elements.length; i < len; ++i) { + var el = elements[i]; + if (el && el.hasValue()) { + var pos = el.tooltipPosition(); + x += pos.x; + y += pos.y; + ++count; + } + } + + return { + x: x / count, + y: y / count + }; + }, + + /** + * Gets the tooltip position nearest of the item nearest to the event position + * @function Chart.Tooltip.positioners.nearest + * @param elements {Chart.Element[]} the tooltip elements + * @param eventPosition {object} the position of the event in canvas coordinates + * @returns {object} the tooltip position + */ + nearest: function (elements, eventPosition) { + var x = eventPosition.x; + var y = eventPosition.y; + var minDistance = Number.POSITIVE_INFINITY; + var i, len, nearestElement; + + for (i = 0, len = elements.length; i < len; ++i) { + var el = elements[i]; + if (el && el.hasValue()) { + var center = el.getCenterPoint(); + var d = helpers$1.distanceBetweenPoints(eventPosition, center); + + if (d < minDistance) { + minDistance = d; + nearestElement = el; + } + } + } + + if (nearestElement) { + var tp = nearestElement.tooltipPosition(); + x = tp.x; + y = tp.y; + } + + return { + x: x, + y: y + }; + } + }; + +// Helper to push or concat based on if the 2nd parameter is an array or not + function pushOrConcat(base, toPush) { + if (toPush) { + if (helpers$1.isArray(toPush)) { + // base = base.concat(toPush); + Array.prototype.push.apply(base, toPush); + } else { + base.push(toPush); + } + } + + return base; + } + + /** + * Returns array of strings split by newline + * @param {string} value - The value to split by newline. + * @returns {string[]} value if newline present - Returned from String split() method + * @function + */ + function splitNewlines(str) { + if ((typeof str === 'string' || str instanceof String) && str.indexOf('\n') > -1) { + return str.split('\n'); + } + return str; + } + + + /** + * Private helper to create a tooltip item model + * @param element - the chart element (point, arc, bar) to create the tooltip item for + * @return new tooltip item + */ + function createTooltipItem(element) { + var xScale = element._xScale; + var yScale = element._yScale || element._scale; // handle radar || polarArea charts + var index = element._index; + var datasetIndex = element._datasetIndex; + var controller = element._chart.getDatasetMeta(datasetIndex).controller; + var indexScale = controller._getIndexScale(); + var valueScale = controller._getValueScale(); + + return { + xLabel: xScale ? xScale.getLabelForIndex(index, datasetIndex) : '', + yLabel: yScale ? yScale.getLabelForIndex(index, datasetIndex) : '', + label: indexScale ? '' + indexScale.getLabelForIndex(index, datasetIndex) : '', + value: valueScale ? '' + valueScale.getLabelForIndex(index, datasetIndex) : '', + index: index, + datasetIndex: datasetIndex, + x: element._model.x, + y: element._model.y + }; + } + + /** + * Helper to get the reset model for the tooltip + * @param tooltipOpts {object} the tooltip options + */ + function getBaseModel(tooltipOpts) { + var globalDefaults = core_defaults.global; + + return { + // Positioning + xPadding: tooltipOpts.xPadding, + yPadding: tooltipOpts.yPadding, + xAlign: tooltipOpts.xAlign, + yAlign: tooltipOpts.yAlign, + + // Body + bodyFontColor: tooltipOpts.bodyFontColor, + _bodyFontFamily: valueOrDefault$7(tooltipOpts.bodyFontFamily, globalDefaults.defaultFontFamily), + _bodyFontStyle: valueOrDefault$7(tooltipOpts.bodyFontStyle, globalDefaults.defaultFontStyle), + _bodyAlign: tooltipOpts.bodyAlign, + bodyFontSize: valueOrDefault$7(tooltipOpts.bodyFontSize, globalDefaults.defaultFontSize), + bodySpacing: tooltipOpts.bodySpacing, + + // Title + titleFontColor: tooltipOpts.titleFontColor, + _titleFontFamily: valueOrDefault$7(tooltipOpts.titleFontFamily, globalDefaults.defaultFontFamily), + _titleFontStyle: valueOrDefault$7(tooltipOpts.titleFontStyle, globalDefaults.defaultFontStyle), + titleFontSize: valueOrDefault$7(tooltipOpts.titleFontSize, globalDefaults.defaultFontSize), + _titleAlign: tooltipOpts.titleAlign, + titleSpacing: tooltipOpts.titleSpacing, + titleMarginBottom: tooltipOpts.titleMarginBottom, + + // Footer + footerFontColor: tooltipOpts.footerFontColor, + _footerFontFamily: valueOrDefault$7(tooltipOpts.footerFontFamily, globalDefaults.defaultFontFamily), + _footerFontStyle: valueOrDefault$7(tooltipOpts.footerFontStyle, globalDefaults.defaultFontStyle), + footerFontSize: valueOrDefault$7(tooltipOpts.footerFontSize, globalDefaults.defaultFontSize), + _footerAlign: tooltipOpts.footerAlign, + footerSpacing: tooltipOpts.footerSpacing, + footerMarginTop: tooltipOpts.footerMarginTop, + + // Appearance + caretSize: tooltipOpts.caretSize, + cornerRadius: tooltipOpts.cornerRadius, + backgroundColor: tooltipOpts.backgroundColor, + opacity: 0, + legendColorBackground: tooltipOpts.multiKeyBackground, + displayColors: tooltipOpts.displayColors, + borderColor: tooltipOpts.borderColor, + borderWidth: tooltipOpts.borderWidth + }; + } + + /** + * Get the size of the tooltip + */ + function getTooltipSize(tooltip, model) { + var ctx = tooltip._chart.ctx; + + var height = model.yPadding * 2; // Tooltip Padding + var width = 0; + + // Count of all lines in the body + var body = model.body; + var combinedBodyLength = body.reduce(function (count, bodyItem) { + return count + bodyItem.before.length + bodyItem.lines.length + bodyItem.after.length; + }, 0); + combinedBodyLength += model.beforeBody.length + model.afterBody.length; + + var titleLineCount = model.title.length; + var footerLineCount = model.footer.length; + var titleFontSize = model.titleFontSize; + var bodyFontSize = model.bodyFontSize; + var footerFontSize = model.footerFontSize; + + height += titleLineCount * titleFontSize; // Title Lines + height += titleLineCount ? (titleLineCount - 1) * model.titleSpacing : 0; // Title Line Spacing + height += titleLineCount ? model.titleMarginBottom : 0; // Title's bottom Margin + height += combinedBodyLength * bodyFontSize; // Body Lines + height += combinedBodyLength ? (combinedBodyLength - 1) * model.bodySpacing : 0; // Body Line Spacing + height += footerLineCount ? model.footerMarginTop : 0; // Footer Margin + height += footerLineCount * (footerFontSize); // Footer Lines + height += footerLineCount ? (footerLineCount - 1) * model.footerSpacing : 0; // Footer Line Spacing + + // Title width + var widthPadding = 0; + var maxLineWidth = function (line) { + width = Math.max(width, ctx.measureText(line).width + widthPadding); + }; + + ctx.font = helpers$1.fontString(titleFontSize, model._titleFontStyle, model._titleFontFamily); + helpers$1.each(model.title, maxLineWidth); + + // Body width + ctx.font = helpers$1.fontString(bodyFontSize, model._bodyFontStyle, model._bodyFontFamily); + helpers$1.each(model.beforeBody.concat(model.afterBody), maxLineWidth); + + // Body lines may include some extra width due to the color box + widthPadding = model.displayColors ? (bodyFontSize + 2) : 0; + helpers$1.each(body, function (bodyItem) { + helpers$1.each(bodyItem.before, maxLineWidth); + helpers$1.each(bodyItem.lines, maxLineWidth); + helpers$1.each(bodyItem.after, maxLineWidth); + }); + + // Reset back to 0 + widthPadding = 0; + + // Footer width + ctx.font = helpers$1.fontString(footerFontSize, model._footerFontStyle, model._footerFontFamily); + helpers$1.each(model.footer, maxLineWidth); + + // Add padding + width += 2 * model.xPadding; + + return { + width: width, + height: height + }; + } + + /** + * Helper to get the alignment of a tooltip given the size + */ + function determineAlignment(tooltip, size) { + var model = tooltip._model; + var chart = tooltip._chart; + var chartArea = tooltip._chart.chartArea; + var xAlign = 'center'; + var yAlign = 'center'; + + if (model.y < size.height) { + yAlign = 'top'; + } else if (model.y > (chart.height - size.height)) { + yAlign = 'bottom'; + } + + var lf, rf; // functions to determine left, right alignment + var olf, orf; // functions to determine if left/right alignment causes tooltip to go outside chart + var yf; // function to get the y alignment if the tooltip goes outside of the left or right edges + var midX = (chartArea.left + chartArea.right) / 2; + var midY = (chartArea.top + chartArea.bottom) / 2; + + if (yAlign === 'center') { + lf = function (x) { + return x <= midX; + }; + rf = function (x) { + return x > midX; + }; + } else { + lf = function (x) { + return x <= (size.width / 2); + }; + rf = function (x) { + return x >= (chart.width - (size.width / 2)); + }; + } + + olf = function (x) { + return x + size.width + model.caretSize + model.caretPadding > chart.width; + }; + orf = function (x) { + return x - size.width - model.caretSize - model.caretPadding < 0; + }; + yf = function (y) { + return y <= midY ? 'top' : 'bottom'; + }; + + if (lf(model.x)) { + xAlign = 'left'; + + // Is tooltip too wide and goes over the right side of the chart.? + if (olf(model.x)) { + xAlign = 'center'; + yAlign = yf(model.y); + } + } else if (rf(model.x)) { + xAlign = 'right'; + + // Is tooltip too wide and goes outside left edge of canvas? + if (orf(model.x)) { + xAlign = 'center'; + yAlign = yf(model.y); + } + } + + var opts = tooltip._options; + return { + xAlign: opts.xAlign ? opts.xAlign : xAlign, + yAlign: opts.yAlign ? opts.yAlign : yAlign + }; + } + + /** + * Helper to get the location a tooltip needs to be placed at given the initial position (via the vm) and the size and alignment + */ + function getBackgroundPoint(vm, size, alignment, chart) { + // Background Position + var x = vm.x; + var y = vm.y; + + var caretSize = vm.caretSize; + var caretPadding = vm.caretPadding; + var cornerRadius = vm.cornerRadius; + var xAlign = alignment.xAlign; + var yAlign = alignment.yAlign; + var paddingAndSize = caretSize + caretPadding; + var radiusAndPadding = cornerRadius + caretPadding; + + if (xAlign === 'right') { + x -= size.width; + } else if (xAlign === 'center') { + x -= (size.width / 2); + if (x + size.width > chart.width) { + x = chart.width - size.width; + } + if (x < 0) { + x = 0; + } + } + + if (yAlign === 'top') { + y += paddingAndSize; + } else if (yAlign === 'bottom') { + y -= size.height + paddingAndSize; + } else { + y -= (size.height / 2); + } + + if (yAlign === 'center') { + if (xAlign === 'left') { + x += paddingAndSize; + } else if (xAlign === 'right') { + x -= paddingAndSize; + } + } else if (xAlign === 'left') { + x -= radiusAndPadding; + } else if (xAlign === 'right') { + x += radiusAndPadding; + } + + return { + x: x, + y: y + }; + } + + function getAlignedX(vm, align) { + return align === 'center' + ? vm.x + vm.width / 2 + : align === 'right' + ? vm.x + vm.width - vm.xPadding + : vm.x + vm.xPadding; + } + + /** + * Helper to build before and after body lines + */ + function getBeforeAfterBodyLines(callback) { + return pushOrConcat([], splitNewlines(callback)); + } + + var exports$3 = core_element.extend({ + initialize: function () { + this._model = getBaseModel(this._options); + this._lastActive = []; + }, + + // Get the title + // Args are: (tooltipItem, data) + getTitle: function () { + var me = this; + var opts = me._options; + var callbacks = opts.callbacks; + + var beforeTitle = callbacks.beforeTitle.apply(me, arguments); + var title = callbacks.title.apply(me, arguments); + var afterTitle = callbacks.afterTitle.apply(me, arguments); + + var lines = []; + lines = pushOrConcat(lines, splitNewlines(beforeTitle)); + lines = pushOrConcat(lines, splitNewlines(title)); + lines = pushOrConcat(lines, splitNewlines(afterTitle)); + + return lines; + }, + + // Args are: (tooltipItem, data) + getBeforeBody: function () { + return getBeforeAfterBodyLines(this._options.callbacks.beforeBody.apply(this, arguments)); + }, + + // Args are: (tooltipItem, data) + getBody: function (tooltipItems, data) { + var me = this; + var callbacks = me._options.callbacks; + var bodyItems = []; + + helpers$1.each(tooltipItems, function (tooltipItem) { + var bodyItem = { + before: [], + lines: [], + after: [] + }; + pushOrConcat(bodyItem.before, splitNewlines(callbacks.beforeLabel.call(me, tooltipItem, data))); + pushOrConcat(bodyItem.lines, callbacks.label.call(me, tooltipItem, data)); + pushOrConcat(bodyItem.after, splitNewlines(callbacks.afterLabel.call(me, tooltipItem, data))); + + bodyItems.push(bodyItem); + }); + + return bodyItems; + }, + + // Args are: (tooltipItem, data) + getAfterBody: function () { + return getBeforeAfterBodyLines(this._options.callbacks.afterBody.apply(this, arguments)); + }, + + // Get the footer and beforeFooter and afterFooter lines + // Args are: (tooltipItem, data) + getFooter: function () { + var me = this; + var callbacks = me._options.callbacks; + + var beforeFooter = callbacks.beforeFooter.apply(me, arguments); + var footer = callbacks.footer.apply(me, arguments); + var afterFooter = callbacks.afterFooter.apply(me, arguments); + + var lines = []; + lines = pushOrConcat(lines, splitNewlines(beforeFooter)); + lines = pushOrConcat(lines, splitNewlines(footer)); + lines = pushOrConcat(lines, splitNewlines(afterFooter)); + + return lines; + }, + + update: function (changed) { + var me = this; + var opts = me._options; + + // Need to regenerate the model because its faster than using extend and it is necessary due to the optimization in Chart.Element.transition + // that does _view = _model if ease === 1. This causes the 2nd tooltip update to set properties in both the view and model at the same time + // which breaks any animations. + var existingModel = me._model; + var model = me._model = getBaseModel(opts); + var active = me._active; + + var data = me._data; + + // In the case where active.length === 0 we need to keep these at existing values for good animations + var alignment = { + xAlign: existingModel.xAlign, + yAlign: existingModel.yAlign + }; + var backgroundPoint = { + x: existingModel.x, + y: existingModel.y + }; + var tooltipSize = { + width: existingModel.width, + height: existingModel.height + }; + var tooltipPosition = { + x: existingModel.caretX, + y: existingModel.caretY + }; + + var i, len; + + if (active.length) { + model.opacity = 1; + + var labelColors = []; + var labelTextColors = []; + tooltipPosition = positioners[opts.position].call(me, active, me._eventPosition); + + var tooltipItems = []; + for (i = 0, len = active.length; i < len; ++i) { + tooltipItems.push(createTooltipItem(active[i])); + } + + // If the user provided a filter function, use it to modify the tooltip items + if (opts.filter) { + tooltipItems = tooltipItems.filter(function (a) { + return opts.filter(a, data); + }); + } + + // If the user provided a sorting function, use it to modify the tooltip items + if (opts.itemSort) { + tooltipItems = tooltipItems.sort(function (a, b) { + return opts.itemSort(a, b, data); + }); + } + + // Determine colors for boxes + helpers$1.each(tooltipItems, function (tooltipItem) { + labelColors.push(opts.callbacks.labelColor.call(me, tooltipItem, me._chart)); + labelTextColors.push(opts.callbacks.labelTextColor.call(me, tooltipItem, me._chart)); + }); + + + // Build the Text Lines + model.title = me.getTitle(tooltipItems, data); + model.beforeBody = me.getBeforeBody(tooltipItems, data); + model.body = me.getBody(tooltipItems, data); + model.afterBody = me.getAfterBody(tooltipItems, data); + model.footer = me.getFooter(tooltipItems, data); + + // Initial positioning and colors + model.x = tooltipPosition.x; + model.y = tooltipPosition.y; + model.caretPadding = opts.caretPadding; + model.labelColors = labelColors; + model.labelTextColors = labelTextColors; + + // data points + model.dataPoints = tooltipItems; + + // We need to determine alignment of the tooltip + tooltipSize = getTooltipSize(this, model); + alignment = determineAlignment(this, tooltipSize); + // Final Size and Position + backgroundPoint = getBackgroundPoint(model, tooltipSize, alignment, me._chart); + } else { + model.opacity = 0; + } + + model.xAlign = alignment.xAlign; + model.yAlign = alignment.yAlign; + model.x = backgroundPoint.x; + model.y = backgroundPoint.y; + model.width = tooltipSize.width; + model.height = tooltipSize.height; + + // Point where the caret on the tooltip points to + model.caretX = tooltipPosition.x; + model.caretY = tooltipPosition.y; + + me._model = model; + + if (changed && opts.custom) { + opts.custom.call(me, model); + } + + return me; + }, + + drawCaret: function (tooltipPoint, size) { + var ctx = this._chart.ctx; + var vm = this._view; + var caretPosition = this.getCaretPosition(tooltipPoint, size, vm); + + ctx.lineTo(caretPosition.x1, caretPosition.y1); + ctx.lineTo(caretPosition.x2, caretPosition.y2); + ctx.lineTo(caretPosition.x3, caretPosition.y3); + }, + getCaretPosition: function (tooltipPoint, size, vm) { + var x1, x2, x3, y1, y2, y3; + var caretSize = vm.caretSize; + var cornerRadius = vm.cornerRadius; + var xAlign = vm.xAlign; + var yAlign = vm.yAlign; + var ptX = tooltipPoint.x; + var ptY = tooltipPoint.y; + var width = size.width; + var height = size.height; + + if (yAlign === 'center') { + y2 = ptY + (height / 2); + + if (xAlign === 'left') { + x1 = ptX; + x2 = x1 - caretSize; + x3 = x1; + + y1 = y2 + caretSize; + y3 = y2 - caretSize; + } else { + x1 = ptX + width; + x2 = x1 + caretSize; + x3 = x1; + + y1 = y2 - caretSize; + y3 = y2 + caretSize; + } + } else { + if (xAlign === 'left') { + x2 = ptX + cornerRadius + (caretSize); + x1 = x2 - caretSize; + x3 = x2 + caretSize; + } else if (xAlign === 'right') { + x2 = ptX + width - cornerRadius - caretSize; + x1 = x2 - caretSize; + x3 = x2 + caretSize; + } else { + x2 = vm.caretX; + x1 = x2 - caretSize; + x3 = x2 + caretSize; + } + if (yAlign === 'top') { + y1 = ptY; + y2 = y1 - caretSize; + y3 = y1; + } else { + y1 = ptY + height; + y2 = y1 + caretSize; + y3 = y1; + // invert drawing order + var tmp = x3; + x3 = x1; + x1 = tmp; + } + } + return {x1: x1, x2: x2, x3: x3, y1: y1, y2: y2, y3: y3}; + }, + + drawTitle: function (pt, vm, ctx) { + var title = vm.title; + + if (title.length) { + pt.x = getAlignedX(vm, vm._titleAlign); + + ctx.textAlign = vm._titleAlign; + ctx.textBaseline = 'top'; + + var titleFontSize = vm.titleFontSize; + var titleSpacing = vm.titleSpacing; + + ctx.fillStyle = vm.titleFontColor; + ctx.font = helpers$1.fontString(titleFontSize, vm._titleFontStyle, vm._titleFontFamily); + + var i, len; + for (i = 0, len = title.length; i < len; ++i) { + ctx.fillText(title[i], pt.x, pt.y); + pt.y += titleFontSize + titleSpacing; // Line Height and spacing + + if (i + 1 === title.length) { + pt.y += vm.titleMarginBottom - titleSpacing; // If Last, add margin, remove spacing + } + } + } + }, + + drawBody: function (pt, vm, ctx) { + var bodyFontSize = vm.bodyFontSize; + var bodySpacing = vm.bodySpacing; + var bodyAlign = vm._bodyAlign; + var body = vm.body; + var drawColorBoxes = vm.displayColors; + var labelColors = vm.labelColors; + var xLinePadding = 0; + var colorX = drawColorBoxes ? getAlignedX(vm, 'left') : 0; + var textColor; + + ctx.textAlign = bodyAlign; + ctx.textBaseline = 'top'; + ctx.font = helpers$1.fontString(bodyFontSize, vm._bodyFontStyle, vm._bodyFontFamily); + + pt.x = getAlignedX(vm, bodyAlign); + + // Before Body + var fillLineOfText = function (line) { + ctx.fillText(line, pt.x + xLinePadding, pt.y); + pt.y += bodyFontSize + bodySpacing; + }; + + // Before body lines + ctx.fillStyle = vm.bodyFontColor; + helpers$1.each(vm.beforeBody, fillLineOfText); + + xLinePadding = drawColorBoxes && bodyAlign !== 'right' + ? bodyAlign === 'center' ? (bodyFontSize / 2 + 1) : (bodyFontSize + 2) + : 0; + + // Draw body lines now + helpers$1.each(body, function (bodyItem, i) { + textColor = vm.labelTextColors[i]; + ctx.fillStyle = textColor; + helpers$1.each(bodyItem.before, fillLineOfText); + + helpers$1.each(bodyItem.lines, function (line) { + // Draw Legend-like boxes if needed + if (drawColorBoxes) { + // Fill a white rect so that colours merge nicely if the opacity is < 1 + ctx.fillStyle = vm.legendColorBackground; + ctx.fillRect(colorX, pt.y, bodyFontSize, bodyFontSize); + + // Border + ctx.lineWidth = 1; + ctx.strokeStyle = labelColors[i].borderColor; + ctx.strokeRect(colorX, pt.y, bodyFontSize, bodyFontSize); + + // Inner square + ctx.fillStyle = labelColors[i].backgroundColor; + ctx.fillRect(colorX + 1, pt.y + 1, bodyFontSize - 2, bodyFontSize - 2); + ctx.fillStyle = textColor; + } + + fillLineOfText(line); + }); + + helpers$1.each(bodyItem.after, fillLineOfText); + }); + + // Reset back to 0 for after body + xLinePadding = 0; + + // After body lines + helpers$1.each(vm.afterBody, fillLineOfText); + pt.y -= bodySpacing; // Remove last body spacing + }, + + drawFooter: function (pt, vm, ctx) { + var footer = vm.footer; + + if (footer.length) { + pt.x = getAlignedX(vm, vm._footerAlign); + pt.y += vm.footerMarginTop; + + ctx.textAlign = vm._footerAlign; + ctx.textBaseline = 'top'; + + ctx.fillStyle = vm.footerFontColor; + ctx.font = helpers$1.fontString(vm.footerFontSize, vm._footerFontStyle, vm._footerFontFamily); + + helpers$1.each(footer, function (line) { + ctx.fillText(line, pt.x, pt.y); + pt.y += vm.footerFontSize + vm.footerSpacing; + }); + } + }, + + drawBackground: function (pt, vm, ctx, tooltipSize) { + ctx.fillStyle = vm.backgroundColor; + ctx.strokeStyle = vm.borderColor; + ctx.lineWidth = vm.borderWidth; + var xAlign = vm.xAlign; + var yAlign = vm.yAlign; + var x = pt.x; + var y = pt.y; + var width = tooltipSize.width; + var height = tooltipSize.height; + var radius = vm.cornerRadius; + + ctx.beginPath(); + ctx.moveTo(x + radius, y); + if (yAlign === 'top') { + this.drawCaret(pt, tooltipSize); + } + ctx.lineTo(x + width - radius, y); + ctx.quadraticCurveTo(x + width, y, x + width, y + radius); + if (yAlign === 'center' && xAlign === 'right') { + this.drawCaret(pt, tooltipSize); + } + ctx.lineTo(x + width, y + height - radius); + ctx.quadraticCurveTo(x + width, y + height, x + width - radius, y + height); + if (yAlign === 'bottom') { + this.drawCaret(pt, tooltipSize); + } + ctx.lineTo(x + radius, y + height); + ctx.quadraticCurveTo(x, y + height, x, y + height - radius); + if (yAlign === 'center' && xAlign === 'left') { + this.drawCaret(pt, tooltipSize); + } + ctx.lineTo(x, y + radius); + ctx.quadraticCurveTo(x, y, x + radius, y); + ctx.closePath(); + + ctx.fill(); + + if (vm.borderWidth > 0) { + ctx.stroke(); + } + }, + + draw: function () { + var ctx = this._chart.ctx; + var vm = this._view; + + if (vm.opacity === 0) { + return; + } + + var tooltipSize = { + width: vm.width, + height: vm.height + }; + var pt = { + x: vm.x, + y: vm.y + }; + + // IE11/Edge does not like very small opacities, so snap to 0 + var opacity = Math.abs(vm.opacity < 1e-3) ? 0 : vm.opacity; + + // Truthy/falsey value for empty tooltip + var hasTooltipContent = vm.title.length || vm.beforeBody.length || vm.body.length || vm.afterBody.length || vm.footer.length; + + if (this._options.enabled && hasTooltipContent) { + ctx.save(); + ctx.globalAlpha = opacity; + + // Draw Background + this.drawBackground(pt, vm, ctx, tooltipSize); + + // Draw Title, Body, and Footer + pt.y += vm.yPadding; + + // Titles + this.drawTitle(pt, vm, ctx); + + // Body + this.drawBody(pt, vm, ctx); + + // Footer + this.drawFooter(pt, vm, ctx); + + ctx.restore(); + } + }, + + /** + * Handle an event + * @private + * @param {IEvent} event - The event to handle + * @returns {boolean} true if the tooltip changed + */ + handleEvent: function (e) { + var me = this; + var options = me._options; + var changed = false; + + me._lastActive = me._lastActive || []; + + // Find Active Elements for tooltips + if (e.type === 'mouseout') { + me._active = []; + } else { + me._active = me._chart.getElementsAtEventForMode(e, options.mode, options); + } + + // Remember Last Actives + changed = !helpers$1.arrayEquals(me._active, me._lastActive); + + // Only handle target event on tooltip change + if (changed) { + me._lastActive = me._active; + + if (options.enabled || options.custom) { + me._eventPosition = { + x: e.x, + y: e.y + }; + + me.update(true); + me.pivot(); + } + } + + return changed; + } + }); + + /** + * @namespace Chart.Tooltip.positioners + */ + var positioners_1 = positioners; + + var core_tooltip = exports$3; + core_tooltip.positioners = positioners_1; + + var valueOrDefault$8 = helpers$1.valueOrDefault; + + core_defaults._set('global', { + elements: {}, + events: [ + 'mousemove', + 'mouseout', + 'click', + 'touchstart', + 'touchmove' + ], + hover: { + onHover: null, + mode: 'nearest', + intersect: true, + animationDuration: 400 + }, + onClick: null, + maintainAspectRatio: true, + responsive: true, + responsiveAnimationDuration: 0 + }); + + /** + * Recursively merge the given config objects representing the `scales` option + * by incorporating scale defaults in `xAxes` and `yAxes` array items, then + * returns a deep copy of the result, thus doesn't alter inputs. + */ + function mergeScaleConfig(/* config objects ... */) { + return helpers$1.merge({}, [].slice.call(arguments), { + merger: function (key, target, source, options) { + if (key === 'xAxes' || key === 'yAxes') { + var slen = source[key].length; + var i, type, scale; + + if (!target[key]) { + target[key] = []; + } + + for (i = 0; i < slen; ++i) { + scale = source[key][i]; + type = valueOrDefault$8(scale.type, key === 'xAxes' ? 'category' : 'linear'); + + if (i >= target[key].length) { + target[key].push({}); } - var u = function () { - this.convs = {} - }; - u.prototype.routeSpace = function (t, e) { - var i = e[0]; - return void 0 === i ? this.getValues(t) : ("number" == typeof i && (i = Array.prototype.slice.call(e)), this.setValues(t, i)) - }, u.prototype.setValues = function (t, e) { - return this.space = t, this.convs = {}, this.convs[t] = e, this - }, u.prototype.getValues = function (t) { - var e = this.convs[t]; - if (!e) { - var i = this.space, n = this.convs[i]; - e = a[i][t](n), this.convs[t] = e - } - return e - }, ["rgb", "hsl", "hsv", "cmyk", "keyword"].forEach(function (t) { - u.prototype[t] = function (e) { - return this.routeSpace(t, arguments) - } - }), e.exports = a - }, {3: 3}], 5: [function (t, e, i) { - "use strict"; - e.exports = { - aliceblue: [240, 248, 255], - antiquewhite: [250, 235, 215], - aqua: [0, 255, 255], - aquamarine: [127, 255, 212], - azure: [240, 255, 255], - beige: [245, 245, 220], - bisque: [255, 228, 196], - black: [0, 0, 0], - blanchedalmond: [255, 235, 205], - blue: [0, 0, 255], - blueviolet: [138, 43, 226], - brown: [165, 42, 42], - burlywood: [222, 184, 135], - cadetblue: [95, 158, 160], - chartreuse: [127, 255, 0], - chocolate: [210, 105, 30], - coral: [255, 127, 80], - cornflowerblue: [100, 149, 237], - cornsilk: [255, 248, 220], - crimson: [220, 20, 60], - cyan: [0, 255, 255], - darkblue: [0, 0, 139], - darkcyan: [0, 139, 139], - darkgoldenrod: [184, 134, 11], - darkgray: [169, 169, 169], - darkgreen: [0, 100, 0], - darkgrey: [169, 169, 169], - darkkhaki: [189, 183, 107], - darkmagenta: [139, 0, 139], - darkolivegreen: [85, 107, 47], - darkorange: [255, 140, 0], - darkorchid: [153, 50, 204], - darkred: [139, 0, 0], - darksalmon: [233, 150, 122], - darkseagreen: [143, 188, 143], - darkslateblue: [72, 61, 139], - darkslategray: [47, 79, 79], - darkslategrey: [47, 79, 79], - darkturquoise: [0, 206, 209], - darkviolet: [148, 0, 211], - deeppink: [255, 20, 147], - deepskyblue: [0, 191, 255], - dimgray: [105, 105, 105], - dimgrey: [105, 105, 105], - dodgerblue: [30, 144, 255], - firebrick: [178, 34, 34], - floralwhite: [255, 250, 240], - forestgreen: [34, 139, 34], - fuchsia: [255, 0, 255], - gainsboro: [220, 220, 220], - ghostwhite: [248, 248, 255], - gold: [255, 215, 0], - goldenrod: [218, 165, 32], - gray: [128, 128, 128], - green: [0, 128, 0], - greenyellow: [173, 255, 47], - grey: [128, 128, 128], - honeydew: [240, 255, 240], - hotpink: [255, 105, 180], - indianred: [205, 92, 92], - indigo: [75, 0, 130], - ivory: [255, 255, 240], - khaki: [240, 230, 140], - lavender: [230, 230, 250], - lavenderblush: [255, 240, 245], - lawngreen: [124, 252, 0], - lemonchiffon: [255, 250, 205], - lightblue: [173, 216, 230], - lightcoral: [240, 128, 128], - lightcyan: [224, 255, 255], - lightgoldenrodyellow: [250, 250, 210], - lightgray: [211, 211, 211], - lightgreen: [144, 238, 144], - lightgrey: [211, 211, 211], - lightpink: [255, 182, 193], - lightsalmon: [255, 160, 122], - lightseagreen: [32, 178, 170], - lightskyblue: [135, 206, 250], - lightslategray: [119, 136, 153], - lightslategrey: [119, 136, 153], - lightsteelblue: [176, 196, 222], - lightyellow: [255, 255, 224], - lime: [0, 255, 0], - limegreen: [50, 205, 50], - linen: [250, 240, 230], - magenta: [255, 0, 255], - maroon: [128, 0, 0], - mediumaquamarine: [102, 205, 170], - mediumblue: [0, 0, 205], - mediumorchid: [186, 85, 211], - mediumpurple: [147, 112, 219], - mediumseagreen: [60, 179, 113], - mediumslateblue: [123, 104, 238], - mediumspringgreen: [0, 250, 154], - mediumturquoise: [72, 209, 204], - mediumvioletred: [199, 21, 133], - midnightblue: [25, 25, 112], - mintcream: [245, 255, 250], - mistyrose: [255, 228, 225], - moccasin: [255, 228, 181], - navajowhite: [255, 222, 173], - navy: [0, 0, 128], - oldlace: [253, 245, 230], - olive: [128, 128, 0], - olivedrab: [107, 142, 35], - orange: [255, 165, 0], - orangered: [255, 69, 0], - orchid: [218, 112, 214], - palegoldenrod: [238, 232, 170], - palegreen: [152, 251, 152], - paleturquoise: [175, 238, 238], - palevioletred: [219, 112, 147], - papayawhip: [255, 239, 213], - peachpuff: [255, 218, 185], - peru: [205, 133, 63], - pink: [255, 192, 203], - plum: [221, 160, 221], - powderblue: [176, 224, 230], - purple: [128, 0, 128], - rebeccapurple: [102, 51, 153], - red: [255, 0, 0], - rosybrown: [188, 143, 143], - royalblue: [65, 105, 225], - saddlebrown: [139, 69, 19], - salmon: [250, 128, 114], - sandybrown: [244, 164, 96], - seagreen: [46, 139, 87], - seashell: [255, 245, 238], - sienna: [160, 82, 45], - silver: [192, 192, 192], - skyblue: [135, 206, 235], - slateblue: [106, 90, 205], - slategray: [112, 128, 144], - slategrey: [112, 128, 144], - snow: [255, 250, 250], - springgreen: [0, 255, 127], - steelblue: [70, 130, 180], - tan: [210, 180, 140], - teal: [0, 128, 128], - thistle: [216, 191, 216], - tomato: [255, 99, 71], - turquoise: [64, 224, 208], - violet: [238, 130, 238], - wheat: [245, 222, 179], - white: [255, 255, 255], - whitesmoke: [245, 245, 245], - yellow: [255, 255, 0], - yellowgreen: [154, 205, 50] + + if (!target[key][i].type || (scale.type && scale.type !== target[key][i].type)) { + // new/untyped scale or type changed: let's apply the new defaults + // then merge source scale to correctly overwrite the defaults. + helpers$1.merge(target[key][i], [core_scaleService.getScaleDefaults(type), scale]); + } else { + // scales type are the same + helpers$1.merge(target[key][i], scale); } - }, {}], 6: [function (t, e, i) { - var n, a; - n = this, a = function () { - "use strict"; - var i, n; - - function a() { - return i.apply(null, arguments) - } + } + } else { + helpers$1._merger(key, target, source, options); + } + } + }); + } - function r(t) { - return t instanceof Array || "[object Array]" === Object.prototype.toString.call(t) - } + /** + * Recursively merge the given config objects as the root options by handling + * default scale options for the `scales` and `scale` properties, then returns + * a deep copy of the result, thus doesn't alter inputs. + */ + function mergeConfig(/* config objects ... */) { + return helpers$1.merge({}, [].slice.call(arguments), { + merger: function (key, target, source, options) { + var tval = target[key] || {}; + var sval = source[key]; - function o(t) { - return null != t && "[object Object]" === Object.prototype.toString.call(t) - } + if (key === 'scales') { + // scale config merging is complex. Add our own function here for that + target[key] = mergeScaleConfig(tval, sval); + } else if (key === 'scale') { + // used in polar area & radar charts since there is only one scale + target[key] = helpers$1.merge(tval, [core_scaleService.getScaleDefaults(sval.type), sval]); + } else { + helpers$1._merger(key, target, source, options); + } + } + }); + } - function s(t) { - return void 0 === t - } + function initConfig(config) { + config = config || {}; - function l(t) { - return "number" == typeof t || "[object Number]" === Object.prototype.toString.call(t) - } + // Do NOT use mergeConfig for the data object because this method merges arrays + // and so would change references to labels and datasets, preventing data updates. + var data = config.data = config.data || {}; + data.datasets = data.datasets || []; + data.labels = data.labels || []; - function u(t) { - return t instanceof Date || "[object Date]" === Object.prototype.toString.call(t) - } + config.options = mergeConfig( + core_defaults.global, + core_defaults[config.type], + config.options || {}); - function d(t, e) { - var i, n = []; - for (i = 0; i < t.length; ++i) n.push(e(t[i], i)); - return n - } + return config; + } - function h(t, e) { - return Object.prototype.hasOwnProperty.call(t, e) - } + function updateConfig(chart) { + var newOptions = chart.options; - function c(t, e) { - for (var i in e) h(e, i) && (t[i] = e[i]); - return h(e, "toString") && (t.toString = e.toString), h(e, "valueOf") && (t.valueOf = e.valueOf), t - } + helpers$1.each(chart.scales, function (scale) { + core_layouts.removeBox(chart, scale); + }); - function f(t, e, i, n) { - return Pe(t, e, i, n, !0).utc() - } + newOptions = mergeConfig( + core_defaults.global, + core_defaults[chart.config.type], + newOptions); - function g(t) { - return null == t._pf && (t._pf = { - empty: !1, - unusedTokens: [], - unusedInput: [], - overflow: -2, - charsLeftOver: 0, - nullInput: !1, - invalidMonth: null, - invalidFormat: !1, - userInvalidated: !1, - iso: !1, - parsedDateParts: [], - meridiem: null, - rfc2822: !1, - weekdayMismatch: !1 - }), t._pf - } + chart.options = chart.config.options = newOptions; + chart.ensureScalesHaveIDs(); + chart.buildOrUpdateScales(); - function m(t) { - if (null == t._isValid) { - var e = g(t), i = n.call(e.parsedDateParts, function (t) { - return null != t - }), - a = !isNaN(t._d.getTime()) && e.overflow < 0 && !e.empty && !e.invalidMonth && !e.invalidWeekday && !e.weekdayMismatch && !e.nullInput && !e.invalidFormat && !e.userInvalidated && (!e.meridiem || e.meridiem && i); - if (t._strict && (a = a && 0 === e.charsLeftOver && 0 === e.unusedTokens.length && void 0 === e.bigHour), null != Object.isFrozen && Object.isFrozen(t)) return a; - t._isValid = a - } - return t._isValid - } + // Tooltip + chart.tooltip._options = newOptions.tooltips; + chart.tooltip.initialize(); + } - function p(t) { - var e = f(NaN); - return null != t ? c(g(e), t) : g(e).userInvalidated = !0, e - } + function positionIsHorizontal(position) { + return position === 'top' || position === 'bottom'; + } - n = Array.prototype.some ? Array.prototype.some : function (t) { - for (var e = Object(this), i = e.length >>> 0, n = 0; n < i; n++) if (n in e && t.call(this, e[n], n, e)) return !0; - return !1 - }; - var v = a.momentProperties = []; + var Chart = function (item, config) { + this.construct(item, config); + return this; + }; - function y(t, e) { - var i, n, a; - if (s(e._isAMomentObject) || (t._isAMomentObject = e._isAMomentObject), s(e._i) || (t._i = e._i), s(e._f) || (t._f = e._f), s(e._l) || (t._l = e._l), s(e._strict) || (t._strict = e._strict), s(e._tzm) || (t._tzm = e._tzm), s(e._isUTC) || (t._isUTC = e._isUTC), s(e._offset) || (t._offset = e._offset), s(e._pf) || (t._pf = g(e)), s(e._locale) || (t._locale = e._locale), v.length > 0) for (i = 0; i < v.length; i++) s(a = e[n = v[i]]) || (t[n] = a); - return t - } + helpers$1.extend(Chart.prototype, /** @lends Chart */ { + /** + * @private + */ + construct: function (item, config) { + var me = this; - var b = !1; + config = initConfig(config); - function x(t) { - y(this, t), this._d = new Date(null != t._d ? t._d.getTime() : NaN), this.isValid() || (this._d = new Date(NaN)), !1 === b && (b = !0, a.updateOffset(this), b = !1) - } + var context = platform.acquireContext(item, config); + var canvas = context && context.canvas; + var height = canvas && canvas.height; + var width = canvas && canvas.width; - function _(t) { - return t instanceof x || null != t && null != t._isAMomentObject - } + me.id = helpers$1.uid(); + me.ctx = context; + me.canvas = canvas; + me.config = config; + me.width = width; + me.height = height; + me.aspectRatio = height ? width / height : null; + me.options = config.options; + me._bufferedRender = false; - function k(t) { - return t < 0 ? Math.ceil(t) || 0 : Math.floor(t) - } + /** + * Provided for backward compatibility, Chart and Chart.Controller have been merged, + * the "instance" still need to be defined since it might be called from plugins. + * @prop Chart#chart + * @deprecated since version 2.6.0 + * @todo remove at version 3 + * @private + */ + me.chart = me; + me.controller = me; // chart.chart.controller #inception - function w(t) { - var e = +t, i = 0; - return 0 !== e && isFinite(e) && (i = k(e)), i - } + // Add the chart instance to the global namespace + Chart.instances[me.id] = me; - function M(t, e, i) { - var n, a = Math.min(t.length, e.length), r = Math.abs(t.length - e.length), o = 0; - for (n = 0; n < a; n++) (i && t[n] !== e[n] || !i && w(t[n]) !== w(e[n])) && o++; - return o + r - } + // Define alias to the config data: `chart.data === chart.config.data` + Object.defineProperty(me, 'data', { + get: function () { + return me.config.data; + }, + set: function (value) { + me.config.data = value; + } + }); - function S(t) { - !1 === a.suppressDeprecationWarnings && "undefined" != typeof console && console.warn && console.warn("Deprecation warning: " + t) - } + if (!context || !canvas) { + // The given item is not a compatible context2d element, let's return before finalizing + // the chart initialization but after setting basic chart / controller properties that + // can help to figure out that the chart is not valid (e.g chart.canvas !== null); + // https://github.com/chartjs/Chart.js/issues/2807 + console.error("Failed to create chart: can't acquire context from the given item"); + return; + } - function D(t, e) { - var i = !0; - return c(function () { - if (null != a.deprecationHandler && a.deprecationHandler(null, t), i) { - for (var n, r = [], o = 0; o < arguments.length; o++) { - if (n = "", "object" == typeof arguments[o]) { - for (var s in n += "\n[" + o + "] ", arguments[0]) n += s + ": " + arguments[0][s] + ", "; - n = n.slice(0, -2) - } else n = arguments[o]; - r.push(n) - } - S(t + "\nArguments: " + Array.prototype.slice.call(r).join("") + "\n" + (new Error).stack), i = !1 - } - return e.apply(this, arguments) - }, e) - } + me.initialize(); + me.update(); + }, - var C, P = {}; + /** + * @private + */ + initialize: function () { + var me = this; - function T(t, e) { - null != a.deprecationHandler && a.deprecationHandler(t, e), P[t] || (S(e), P[t] = !0) - } + // Before init plugin notification + core_plugins.notify(me, 'beforeInit'); - function O(t) { - return t instanceof Function || "[object Function]" === Object.prototype.toString.call(t) - } + helpers$1.retinaScale(me, me.options.devicePixelRatio); - function I(t, e) { - var i, n = c({}, t); - for (i in e) h(e, i) && (o(t[i]) && o(e[i]) ? (n[i] = {}, c(n[i], t[i]), c(n[i], e[i])) : null != e[i] ? n[i] = e[i] : delete n[i]); - for (i in t) h(t, i) && !h(e, i) && o(t[i]) && (n[i] = c({}, n[i])); - return n - } + me.bindEvents(); - function A(t) { - null != t && this.set(t) - } + if (me.options.responsive) { + // Initial resize before chart draws (must be silent to preserve initial animations). + me.resize(true); + } - a.suppressDeprecationWarnings = !1, a.deprecationHandler = null, C = Object.keys ? Object.keys : function (t) { - var e, i = []; - for (e in t) h(t, e) && i.push(e); - return i - }; - var F = {}; + // Make sure scales have IDs and are built before we build any controllers. + me.ensureScalesHaveIDs(); + me.buildOrUpdateScales(); + me.initToolTip(); - function R(t, e) { - var i = t.toLowerCase(); - F[i] = F[i + "s"] = F[e] = t - } + // After init plugin notification + core_plugins.notify(me, 'afterInit'); - function L(t) { - return "string" == typeof t ? F[t] || F[t.toLowerCase()] : void 0 - } + return me; + }, - function W(t) { - var e, i, n = {}; - for (i in t) h(t, i) && (e = L(i)) && (n[e] = t[i]); - return n - } + clear: function () { + helpers$1.canvas.clear(this); + return this; + }, - var Y = {}; + stop: function () { + // Stops any current animation loop occurring + core_animations.cancelAnimation(this); + return this; + }, - function N(t, e) { - Y[t] = e - } + resize: function (silent) { + var me = this; + var options = me.options; + var canvas = me.canvas; + var aspectRatio = (options.maintainAspectRatio && me.aspectRatio) || null; - function z(t, e, i) { - var n = "" + Math.abs(t), a = e - n.length; - return (t >= 0 ? i ? "+" : "" : "-") + Math.pow(10, Math.max(0, a)).toString().substr(1) + n - } + // the canvas render width and height will be casted to integers so make sure that + // the canvas display style uses the same integer values to avoid blurring effect. - var H = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g, - V = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g, B = {}, E = {}; - - function j(t, e, i, n) { - var a = n; - "string" == typeof n && (a = function () { - return this[n]() - }), t && (E[t] = a), e && (E[e[0]] = function () { - return z(a.apply(this, arguments), e[1], e[2]) - }), i && (E[i] = function () { - return this.localeData().ordinal(a.apply(this, arguments), t) - }) - } + // Set to 0 instead of canvas.size because the size defaults to 300x150 if the element is collapsed + var newWidth = Math.max(0, Math.floor(helpers$1.getMaximumWidth(canvas))); + var newHeight = Math.max(0, Math.floor(aspectRatio ? newWidth / aspectRatio : helpers$1.getMaximumHeight(canvas))); - function U(t, e) { - return t.isValid() ? (e = q(e, t.localeData()), B[e] = B[e] || function (t) { - var e, i, n, a = t.match(H); - for (e = 0, i = a.length; e < i; e++) E[a[e]] ? a[e] = E[a[e]] : a[e] = (n = a[e]).match(/\[[\s\S]/) ? n.replace(/^\[|\]$/g, "") : n.replace(/\\/g, ""); - return function (e) { - var n, r = ""; - for (n = 0; n < i; n++) r += O(a[n]) ? a[n].call(e, t) : a[n]; - return r - } - }(e), B[e](t)) : t.localeData().invalidDate() - } + if (me.width === newWidth && me.height === newHeight) { + return; + } - function q(t, e) { - var i = 5; + canvas.width = me.width = newWidth; + canvas.height = me.height = newHeight; + canvas.style.width = newWidth + 'px'; + canvas.style.height = newHeight + 'px'; - function n(t) { - return e.longDateFormat(t) || t - } + helpers$1.retinaScale(me, options.devicePixelRatio); - for (V.lastIndex = 0; i >= 0 && V.test(t);) t = t.replace(V, n), V.lastIndex = 0, i -= 1; - return t - } + if (!silent) { + // Notify any plugins about the resize + var newSize = {width: newWidth, height: newHeight}; + core_plugins.notify(me, 'resize', [newSize]); - var G = /\d/, Z = /\d\d/, X = /\d{3}/, J = /\d{4}/, K = /[+-]?\d{6}/, $ = /\d\d?/, Q = /\d\d\d\d?/, - tt = /\d\d\d\d\d\d?/, et = /\d{1,3}/, it = /\d{1,4}/, nt = /[+-]?\d{1,6}/, at = /\d+/, - rt = /[+-]?\d+/, ot = /Z|[+-]\d\d:?\d\d/gi, st = /Z|[+-]\d\d(?::?\d\d)?/gi, - lt = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i, - ut = {}; + // Notify of resize + if (options.onResize) { + options.onResize(me, newSize); + } - function dt(t, e, i) { - ut[t] = O(e) ? e : function (t, n) { - return t && i ? i : e - } - } + me.stop(); + me.update({ + duration: options.responsiveAnimationDuration + }); + } + }, - function ht(t, e) { - return h(ut, t) ? ut[t](e._strict, e._locale) : new RegExp(ct(t.replace("\\", "").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (t, e, i, n, a) { - return e || i || n || a - }))) - } + ensureScalesHaveIDs: function () { + var options = this.options; + var scalesOptions = options.scales || {}; + var scaleOptions = options.scale; - function ct(t) { - return t.replace(/[-\/\\^$*+?.()|[\]{}]/g, "\\$&") - } + helpers$1.each(scalesOptions.xAxes, function (xAxisOptions, index) { + xAxisOptions.id = xAxisOptions.id || ('x-axis-' + index); + }); - var ft = {}; + helpers$1.each(scalesOptions.yAxes, function (yAxisOptions, index) { + yAxisOptions.id = yAxisOptions.id || ('y-axis-' + index); + }); - function gt(t, e) { - var i, n = e; - for ("string" == typeof t && (t = [t]), l(e) && (n = function (t, i) { - i[e] = w(t) - }), i = 0; i < t.length; i++) ft[t[i]] = n - } + if (scaleOptions) { + scaleOptions.id = scaleOptions.id || 'scale'; + } + }, - function mt(t, e) { - gt(t, function (t, i, n, a) { - n._w = n._w || {}, e(t, n._w, n, a) - }) - } + /** + * Builds a map of scale ID to scale object for future lookup. + */ + buildOrUpdateScales: function () { + var me = this; + var options = me.options; + var scales = me.scales || {}; + var items = []; + var updated = Object.keys(scales).reduce(function (obj, id) { + obj[id] = false; + return obj; + }, {}); - var pt = 0, vt = 1, yt = 2, bt = 3, xt = 4, _t = 5, kt = 6, wt = 7, Mt = 8; + if (options.scales) { + items = items.concat( + (options.scales.xAxes || []).map(function (xAxisOptions) { + return {options: xAxisOptions, dtype: 'category', dposition: 'bottom'}; + }), + (options.scales.yAxes || []).map(function (yAxisOptions) { + return {options: yAxisOptions, dtype: 'linear', dposition: 'left'}; + }) + ); + } - function St(t) { - return Dt(t) ? 366 : 365 - } + if (options.scale) { + items.push({ + options: options.scale, + dtype: 'radialLinear', + isDefault: true, + dposition: 'chartArea' + }); + } - function Dt(t) { - return t % 4 == 0 && t % 100 != 0 || t % 400 == 0 - } + helpers$1.each(items, function (item) { + var scaleOptions = item.options; + var id = scaleOptions.id; + var scaleType = valueOrDefault$8(scaleOptions.type, item.dtype); - j("Y", 0, 0, function () { - var t = this.year(); - return t <= 9999 ? "" + t : "+" + t - }), j(0, ["YY", 2], 0, function () { - return this.year() % 100 - }), j(0, ["YYYY", 4], 0, "year"), j(0, ["YYYYY", 5], 0, "year"), j(0, ["YYYYYY", 6, !0], 0, "year"), R("year", "y"), N("year", 1), dt("Y", rt), dt("YY", $, Z), dt("YYYY", it, J), dt("YYYYY", nt, K), dt("YYYYYY", nt, K), gt(["YYYYY", "YYYYYY"], pt), gt("YYYY", function (t, e) { - e[pt] = 2 === t.length ? a.parseTwoDigitYear(t) : w(t) - }), gt("YY", function (t, e) { - e[pt] = a.parseTwoDigitYear(t) - }), gt("Y", function (t, e) { - e[pt] = parseInt(t, 10) - }), a.parseTwoDigitYear = function (t) { - return w(t) + (w(t) > 68 ? 1900 : 2e3) - }; - var Ct, Pt = Tt("FullYear", !0); - - function Tt(t, e) { - return function (i) { - return null != i ? (It(this, t, i), a.updateOffset(this, e), this) : Ot(this, t) - } - } + if (positionIsHorizontal(scaleOptions.position) !== positionIsHorizontal(item.dposition)) { + scaleOptions.position = item.dposition; + } - function Ot(t, e) { - return t.isValid() ? t._d["get" + (t._isUTC ? "UTC" : "") + e]() : NaN - } + updated[id] = true; + var scale = null; + if (id in scales && scales[id].type === scaleType) { + scale = scales[id]; + scale.options = scaleOptions; + scale.ctx = me.ctx; + scale.chart = me; + } else { + var scaleClass = core_scaleService.getScaleConstructor(scaleType); + if (!scaleClass) { + return; + } + scale = new scaleClass({ + id: id, + type: scaleType, + options: scaleOptions, + ctx: me.ctx, + chart: me + }); + scales[scale.id] = scale; + } - function It(t, e, i) { - t.isValid() && !isNaN(i) && ("FullYear" === e && Dt(t.year()) && 1 === t.month() && 29 === t.date() ? t._d["set" + (t._isUTC ? "UTC" : "") + e](i, t.month(), At(i, t.month())) : t._d["set" + (t._isUTC ? "UTC" : "") + e](i)) - } + scale.mergeTicksOptions(); - function At(t, e) { - if (isNaN(t) || isNaN(e)) return NaN; - var i, n = (e % (i = 12) + i) % i; - return t += (e - n) / 12, 1 === n ? Dt(t) ? 29 : 28 : 31 - n % 7 % 2 - } + // TODO(SB): I think we should be able to remove this custom case (options.scale) + // and consider it as a regular scale part of the "scales"" map only! This would + // make the logic easier and remove some useless? custom code. + if (item.isDefault) { + me.scale = scale; + } + }); + // clear up discarded scales + helpers$1.each(updated, function (hasUpdated, id) { + if (!hasUpdated) { + delete scales[id]; + } + }); - Ct = Array.prototype.indexOf ? Array.prototype.indexOf : function (t) { - var e; - for (e = 0; e < this.length; ++e) if (this[e] === t) return e; - return -1 - }, j("M", ["MM", 2], "Mo", function () { - return this.month() + 1 - }), j("MMM", 0, 0, function (t) { - return this.localeData().monthsShort(this, t) - }), j("MMMM", 0, 0, function (t) { - return this.localeData().months(this, t) - }), R("month", "M"), N("month", 8), dt("M", $), dt("MM", $, Z), dt("MMM", function (t, e) { - return e.monthsShortRegex(t) - }), dt("MMMM", function (t, e) { - return e.monthsRegex(t) - }), gt(["M", "MM"], function (t, e) { - e[vt] = w(t) - 1 - }), gt(["MMM", "MMMM"], function (t, e, i, n) { - var a = i._locale.monthsParse(t, n, i._strict); - null != a ? e[vt] = a : g(i).invalidMonth = t - }); - var Ft = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/, - Rt = "January_February_March_April_May_June_July_August_September_October_November_December".split("_"); - var Lt = "Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"); - - function Wt(t, e) { - var i; - if (!t.isValid()) return t; - if ("string" == typeof e) if (/^\d+$/.test(e)) e = w(e); else if (!l(e = t.localeData().monthsParse(e))) return t; - return i = Math.min(t.date(), At(t.year(), e)), t._d["set" + (t._isUTC ? "UTC" : "") + "Month"](e, i), t - } + me.scales = scales; - function Yt(t) { - return null != t ? (Wt(this, t), a.updateOffset(this, !0), this) : Ot(this, "Month") - } + core_scaleService.addScalesToLayout(this); + }, - var Nt = lt; - var zt = lt; + buildOrUpdateControllers: function () { + var me = this; + var newControllers = []; - function Ht() { - function t(t, e) { - return e.length - t.length - } + helpers$1.each(me.data.datasets, function (dataset, datasetIndex) { + var meta = me.getDatasetMeta(datasetIndex); + var type = dataset.type || me.config.type; - var e, i, n = [], a = [], r = []; - for (e = 0; e < 12; e++) i = f([2e3, e]), n.push(this.monthsShort(i, "")), a.push(this.months(i, "")), r.push(this.months(i, "")), r.push(this.monthsShort(i, "")); - for (n.sort(t), a.sort(t), r.sort(t), e = 0; e < 12; e++) n[e] = ct(n[e]), a[e] = ct(a[e]); - for (e = 0; e < 24; e++) r[e] = ct(r[e]); - this._monthsRegex = new RegExp("^(" + r.join("|") + ")", "i"), this._monthsShortRegex = this._monthsRegex, this._monthsStrictRegex = new RegExp("^(" + a.join("|") + ")", "i"), this._monthsShortStrictRegex = new RegExp("^(" + n.join("|") + ")", "i") - } + if (meta.type && meta.type !== type) { + me.destroyDatasetMeta(datasetIndex); + meta = me.getDatasetMeta(datasetIndex); + } + meta.type = type; - function Vt(t) { - var e = new Date(Date.UTC.apply(null, arguments)); - return t < 100 && t >= 0 && isFinite(e.getUTCFullYear()) && e.setUTCFullYear(t), e - } + if (meta.controller) { + meta.controller.updateIndex(datasetIndex); + meta.controller.linkScales(); + } else { + var ControllerClass = controllers[meta.type]; + if (ControllerClass === undefined) { + throw new Error('"' + meta.type + '" is not a chart type.'); + } - function Bt(t, e, i) { - var n = 7 + e - i; - return -((7 + Vt(t, 0, n).getUTCDay() - e) % 7) + n - 1 - } + meta.controller = new ControllerClass(me, datasetIndex); + newControllers.push(meta.controller); + } + }, me); - function Et(t, e, i, n, a) { - var r, o, s = 1 + 7 * (e - 1) + (7 + i - n) % 7 + Bt(t, n, a); - return s <= 0 ? o = St(r = t - 1) + s : s > St(t) ? (r = t + 1, o = s - St(t)) : (r = t, o = s), { - year: r, - dayOfYear: o - } - } + return newControllers; + }, - function jt(t, e, i) { - var n, a, r = Bt(t.year(), e, i), o = Math.floor((t.dayOfYear() - r - 1) / 7) + 1; - return o < 1 ? n = o + Ut(a = t.year() - 1, e, i) : o > Ut(t.year(), e, i) ? (n = o - Ut(t.year(), e, i), a = t.year() + 1) : (a = t.year(), n = o), { - week: n, - year: a - } - } + /** + * Reset the elements of all datasets + * @private + */ + resetElements: function () { + var me = this; + helpers$1.each(me.data.datasets, function (dataset, datasetIndex) { + me.getDatasetMeta(datasetIndex).controller.reset(); + }, me); + }, - function Ut(t, e, i) { - var n = Bt(t, e, i), a = Bt(t + 1, e, i); - return (St(t) - n + a) / 7 - } + /** + * Resets the chart back to it's state before the initial animation + */ + reset: function () { + this.resetElements(); + this.tooltip.initialize(); + }, - j("w", ["ww", 2], "wo", "week"), j("W", ["WW", 2], "Wo", "isoWeek"), R("week", "w"), R("isoWeek", "W"), N("week", 5), N("isoWeek", 5), dt("w", $), dt("ww", $, Z), dt("W", $), dt("WW", $, Z), mt(["w", "ww", "W", "WW"], function (t, e, i, n) { - e[n.substr(0, 1)] = w(t) - }); - j("d", 0, "do", "day"), j("dd", 0, 0, function (t) { - return this.localeData().weekdaysMin(this, t) - }), j("ddd", 0, 0, function (t) { - return this.localeData().weekdaysShort(this, t) - }), j("dddd", 0, 0, function (t) { - return this.localeData().weekdays(this, t) - }), j("e", 0, 0, "weekday"), j("E", 0, 0, "isoWeekday"), R("day", "d"), R("weekday", "e"), R("isoWeekday", "E"), N("day", 11), N("weekday", 11), N("isoWeekday", 11), dt("d", $), dt("e", $), dt("E", $), dt("dd", function (t, e) { - return e.weekdaysMinRegex(t) - }), dt("ddd", function (t, e) { - return e.weekdaysShortRegex(t) - }), dt("dddd", function (t, e) { - return e.weekdaysRegex(t) - }), mt(["dd", "ddd", "dddd"], function (t, e, i, n) { - var a = i._locale.weekdaysParse(t, n, i._strict); - null != a ? e.d = a : g(i).invalidWeekday = t - }), mt(["d", "e", "E"], function (t, e, i, n) { - e[n] = w(t) - }); - var qt = "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"); - var Gt = "Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"); - var Zt = "Su_Mo_Tu_We_Th_Fr_Sa".split("_"); - var Xt = lt; - var Jt = lt; - var Kt = lt; - - function $t() { - function t(t, e) { - return e.length - t.length - } - - var e, i, n, a, r, o = [], s = [], l = [], u = []; - for (e = 0; e < 7; e++) i = f([2e3, 1]).day(e), n = this.weekdaysMin(i, ""), a = this.weekdaysShort(i, ""), r = this.weekdays(i, ""), o.push(n), s.push(a), l.push(r), u.push(n), u.push(a), u.push(r); - for (o.sort(t), s.sort(t), l.sort(t), u.sort(t), e = 0; e < 7; e++) s[e] = ct(s[e]), l[e] = ct(l[e]), u[e] = ct(u[e]); - this._weekdaysRegex = new RegExp("^(" + u.join("|") + ")", "i"), this._weekdaysShortRegex = this._weekdaysRegex, this._weekdaysMinRegex = this._weekdaysRegex, this._weekdaysStrictRegex = new RegExp("^(" + l.join("|") + ")", "i"), this._weekdaysShortStrictRegex = new RegExp("^(" + s.join("|") + ")", "i"), this._weekdaysMinStrictRegex = new RegExp("^(" + o.join("|") + ")", "i") - } + update: function (config) { + var me = this; - function Qt() { - return this.hours() % 12 || 12 - } + if (!config || typeof config !== 'object') { + // backwards compatibility + config = { + duration: config, + lazy: arguments[1] + }; + } - function te(t, e) { - j(t, 0, 0, function () { - return this.localeData().meridiem(this.hours(), this.minutes(), e) - }) - } + updateConfig(me); - function ee(t, e) { - return e._meridiemParse - } + // plugins options references might have change, let's invalidate the cache + // https://github.com/chartjs/Chart.js/issues/5111#issuecomment-355934167 + core_plugins._invalidate(me); - j("H", ["HH", 2], 0, "hour"), j("h", ["hh", 2], 0, Qt), j("k", ["kk", 2], 0, function () { - return this.hours() || 24 - }), j("hmm", 0, 0, function () { - return "" + Qt.apply(this) + z(this.minutes(), 2) - }), j("hmmss", 0, 0, function () { - return "" + Qt.apply(this) + z(this.minutes(), 2) + z(this.seconds(), 2) - }), j("Hmm", 0, 0, function () { - return "" + this.hours() + z(this.minutes(), 2) - }), j("Hmmss", 0, 0, function () { - return "" + this.hours() + z(this.minutes(), 2) + z(this.seconds(), 2) - }), te("a", !0), te("A", !1), R("hour", "h"), N("hour", 13), dt("a", ee), dt("A", ee), dt("H", $), dt("h", $), dt("k", $), dt("HH", $, Z), dt("hh", $, Z), dt("kk", $, Z), dt("hmm", Q), dt("hmmss", tt), dt("Hmm", Q), dt("Hmmss", tt), gt(["H", "HH"], bt), gt(["k", "kk"], function (t, e, i) { - var n = w(t); - e[bt] = 24 === n ? 0 : n - }), gt(["a", "A"], function (t, e, i) { - i._isPm = i._locale.isPM(t), i._meridiem = t - }), gt(["h", "hh"], function (t, e, i) { - e[bt] = w(t), g(i).bigHour = !0 - }), gt("hmm", function (t, e, i) { - var n = t.length - 2; - e[bt] = w(t.substr(0, n)), e[xt] = w(t.substr(n)), g(i).bigHour = !0 - }), gt("hmmss", function (t, e, i) { - var n = t.length - 4, a = t.length - 2; - e[bt] = w(t.substr(0, n)), e[xt] = w(t.substr(n, 2)), e[_t] = w(t.substr(a)), g(i).bigHour = !0 - }), gt("Hmm", function (t, e, i) { - var n = t.length - 2; - e[bt] = w(t.substr(0, n)), e[xt] = w(t.substr(n)) - }), gt("Hmmss", function (t, e, i) { - var n = t.length - 4, a = t.length - 2; - e[bt] = w(t.substr(0, n)), e[xt] = w(t.substr(n, 2)), e[_t] = w(t.substr(a)) - }); - var ie, ne = Tt("Hours", !0), ae = { - calendar: { - sameDay: "[Today at] LT", - nextDay: "[Tomorrow at] LT", - nextWeek: "dddd [at] LT", - lastDay: "[Yesterday at] LT", - lastWeek: "[Last] dddd [at] LT", - sameElse: "L" - }, - longDateFormat: { - LTS: "h:mm:ss A", - LT: "h:mm A", - L: "MM/DD/YYYY", - LL: "MMMM D, YYYY", - LLL: "MMMM D, YYYY h:mm A", - LLLL: "dddd, MMMM D, YYYY h:mm A" - }, - invalidDate: "Invalid date", - ordinal: "%d", - dayOfMonthOrdinalParse: /\d{1,2}/, - relativeTime: { - future: "in %s", - past: "%s ago", - s: "a few seconds", - ss: "%d seconds", - m: "a minute", - mm: "%d minutes", - h: "an hour", - hh: "%d hours", - d: "a day", - dd: "%d days", - M: "a month", - MM: "%d months", - y: "a year", - yy: "%d years" - }, - months: Rt, - monthsShort: Lt, - week: {dow: 0, doy: 6}, - weekdays: qt, - weekdaysMin: Zt, - weekdaysShort: Gt, - meridiemParse: /[ap]\.?m?\.?/i - }, re = {}, oe = {}; - - function se(t) { - return t ? t.toLowerCase().replace("_", "-") : t - } + if (core_plugins.notify(me, 'beforeUpdate') === false) { + return; + } - function le(i) { - var n = null; - if (!re[i] && void 0 !== e && e && e.exports) try { - n = ie._abbr, t("./locale/" + i), ue(n) - } catch (t) { - } - return re[i] - } + // In case the entire data object changed + me.tooltip._data = me.data; - function ue(t, e) { - var i; - return t && (i = s(e) ? he(t) : de(t, e)) && (ie = i), ie._abbr - } + // Make sure dataset controllers are updated and new controllers are reset + var newControllers = me.buildOrUpdateControllers(); - function de(t, e) { - if (null !== e) { - var i = ae; - if (e.abbr = t, null != re[t]) T("defineLocaleOverride", "use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."), i = re[t]._config; else if (null != e.parentLocale) { - if (null == re[e.parentLocale]) return oe[e.parentLocale] || (oe[e.parentLocale] = []), oe[e.parentLocale].push({ - name: t, - config: e - }), null; - i = re[e.parentLocale]._config - } - return re[t] = new A(I(i, e)), oe[t] && oe[t].forEach(function (t) { - de(t.name, t.config) - }), ue(t), re[t] - } - return delete re[t], null - } + // Make sure all dataset controllers have correct meta data counts + helpers$1.each(me.data.datasets, function (dataset, datasetIndex) { + me.getDatasetMeta(datasetIndex).controller.buildOrUpdateElements(); + }, me); - function he(t) { - var e; - if (t && t._locale && t._locale._abbr && (t = t._locale._abbr), !t) return ie; - if (!r(t)) { - if (e = le(t)) return e; - t = [t] - } - return function (t) { - for (var e, i, n, a, r = 0; r < t.length;) { - for (e = (a = se(t[r]).split("-")).length, i = (i = se(t[r + 1])) ? i.split("-") : null; e > 0;) { - if (n = le(a.slice(0, e).join("-"))) return n; - if (i && i.length >= e && M(a, i, !0) >= e - 1) break; - e-- - } - r++ - } - return null - }(t) - } + me.updateLayout(); - function ce(t) { - var e, i = t._a; - return i && -2 === g(t).overflow && (e = i[vt] < 0 || i[vt] > 11 ? vt : i[yt] < 1 || i[yt] > At(i[pt], i[vt]) ? yt : i[bt] < 0 || i[bt] > 24 || 24 === i[bt] && (0 !== i[xt] || 0 !== i[_t] || 0 !== i[kt]) ? bt : i[xt] < 0 || i[xt] > 59 ? xt : i[_t] < 0 || i[_t] > 59 ? _t : i[kt] < 0 || i[kt] > 999 ? kt : -1, g(t)._overflowDayOfYear && (e < pt || e > yt) && (e = yt), g(t)._overflowWeeks && -1 === e && (e = wt), g(t)._overflowWeekday && -1 === e && (e = Mt), g(t).overflow = e), t - } + // Can only reset the new controllers after the scales have been updated + if (me.options.animation && me.options.animation.duration) { + helpers$1.each(newControllers, function (controller) { + controller.reset(); + }); + } - function fe(t, e, i) { - return null != t ? t : null != e ? e : i - } + me.updateDatasets(); - function ge(t) { - var e, i, n, r, o, s = []; - if (!t._d) { - var l, u; - for (l = t, u = new Date(a.now()), n = l._useUTC ? [u.getUTCFullYear(), u.getUTCMonth(), u.getUTCDate()] : [u.getFullYear(), u.getMonth(), u.getDate()], t._w && null == t._a[yt] && null == t._a[vt] && function (t) { - var e, i, n, a, r, o, s, l; - if (null != (e = t._w).GG || null != e.W || null != e.E) r = 1, o = 4, i = fe(e.GG, t._a[pt], jt(Te(), 1, 4).year), n = fe(e.W, 1), ((a = fe(e.E, 1)) < 1 || a > 7) && (l = !0); else { - r = t._locale._week.dow, o = t._locale._week.doy; - var u = jt(Te(), r, o); - i = fe(e.gg, t._a[pt], u.year), n = fe(e.w, u.week), null != e.d ? ((a = e.d) < 0 || a > 6) && (l = !0) : null != e.e ? (a = e.e + r, (e.e < 0 || e.e > 6) && (l = !0)) : a = r - } - n < 1 || n > Ut(i, r, o) ? g(t)._overflowWeeks = !0 : null != l ? g(t)._overflowWeekday = !0 : (s = Et(i, n, a, r, o), t._a[pt] = s.year, t._dayOfYear = s.dayOfYear) - }(t), null != t._dayOfYear && (o = fe(t._a[pt], n[pt]), (t._dayOfYear > St(o) || 0 === t._dayOfYear) && (g(t)._overflowDayOfYear = !0), i = Vt(o, 0, t._dayOfYear), t._a[vt] = i.getUTCMonth(), t._a[yt] = i.getUTCDate()), e = 0; e < 3 && null == t._a[e]; ++e) t._a[e] = s[e] = n[e]; - for (; e < 7; e++) t._a[e] = s[e] = null == t._a[e] ? 2 === e ? 1 : 0 : t._a[e]; - 24 === t._a[bt] && 0 === t._a[xt] && 0 === t._a[_t] && 0 === t._a[kt] && (t._nextDay = !0, t._a[bt] = 0), t._d = (t._useUTC ? Vt : function (t, e, i, n, a, r, o) { - var s = new Date(t, e, i, n, a, r, o); - return t < 100 && t >= 0 && isFinite(s.getFullYear()) && s.setFullYear(t), s - }).apply(null, s), r = t._useUTC ? t._d.getUTCDay() : t._d.getDay(), null != t._tzm && t._d.setUTCMinutes(t._d.getUTCMinutes() - t._tzm), t._nextDay && (t._a[bt] = 24), t._w && void 0 !== t._w.d && t._w.d !== r && (g(t).weekdayMismatch = !0) - } - } + // Need to reset tooltip in case it is displayed with elements that are removed + // after update. + me.tooltip.initialize(); - var me = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/, - pe = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/, - ve = /Z|[+-]\d\d(?::?\d\d)?/, - ye = [["YYYYYY-MM-DD", /[+-]\d{6}-\d\d-\d\d/], ["YYYY-MM-DD", /\d{4}-\d\d-\d\d/], ["GGGG-[W]WW-E", /\d{4}-W\d\d-\d/], ["GGGG-[W]WW", /\d{4}-W\d\d/, !1], ["YYYY-DDD", /\d{4}-\d{3}/], ["YYYY-MM", /\d{4}-\d\d/, !1], ["YYYYYYMMDD", /[+-]\d{10}/], ["YYYYMMDD", /\d{8}/], ["GGGG[W]WWE", /\d{4}W\d{3}/], ["GGGG[W]WW", /\d{4}W\d{2}/, !1], ["YYYYDDD", /\d{7}/]], - be = [["HH:mm:ss.SSSS", /\d\d:\d\d:\d\d\.\d+/], ["HH:mm:ss,SSSS", /\d\d:\d\d:\d\d,\d+/], ["HH:mm:ss", /\d\d:\d\d:\d\d/], ["HH:mm", /\d\d:\d\d/], ["HHmmss.SSSS", /\d\d\d\d\d\d\.\d+/], ["HHmmss,SSSS", /\d\d\d\d\d\d,\d+/], ["HHmmss", /\d\d\d\d\d\d/], ["HHmm", /\d\d\d\d/], ["HH", /\d\d/]], - xe = /^\/?Date\((\-?\d+)/i; - - function _e(t) { - var e, i, n, a, r, o, s = t._i, l = me.exec(s) || pe.exec(s); - if (l) { - for (g(t).iso = !0, e = 0, i = ye.length; e < i; e++) if (ye[e][1].exec(l[1])) { - a = ye[e][0], n = !1 !== ye[e][2]; - break - } - if (null == a) return void(t._isValid = !1); - if (l[3]) { - for (e = 0, i = be.length; e < i; e++) if (be[e][1].exec(l[3])) { - r = (l[2] || " ") + be[e][0]; - break - } - if (null == r) return void(t._isValid = !1) - } - if (!n && null != r) return void(t._isValid = !1); - if (l[4]) { - if (!ve.exec(l[4])) return void(t._isValid = !1); - o = "Z" - } - t._f = a + (r || "") + (o || ""), De(t) - } else t._isValid = !1 - } + // Last active contains items that were previously in the tooltip. + // When we reset the tooltip, we need to clear it + me.lastActive = []; - var ke = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/; - - function we(t, e, i, n, a, r) { - var o = [function (t) { - var e = parseInt(t, 10); - { - if (e <= 49) return 2e3 + e; - if (e <= 999) return 1900 + e - } - return e - }(t), Lt.indexOf(e), parseInt(i, 10), parseInt(n, 10), parseInt(a, 10)]; - return r && o.push(parseInt(r, 10)), o - } + // Do this before render so that any plugins that need final scale updates can use it + core_plugins.notify(me, 'afterUpdate'); - var Me = { - UT: 0, - GMT: 0, - EDT: -240, - EST: -300, - CDT: -300, - CST: -360, - MDT: -360, - MST: -420, - PDT: -420, - PST: -480 - }; - - function Se(t) { - var e, i, n, a = ke.exec(t._i.replace(/\([^)]*\)|[\n\t]/g, " ").replace(/(\s\s+)/g, " ").trim()); - if (a) { - var r = we(a[4], a[3], a[2], a[5], a[6], a[7]); - if (e = a[1], i = r, n = t, e && Gt.indexOf(e) !== new Date(i[0], i[1], i[2]).getDay() && (g(n).weekdayMismatch = !0, n._isValid = !1, 1)) return; - t._a = r, t._tzm = function (t, e, i) { - if (t) return Me[t]; - if (e) return 0; - var n = parseInt(i, 10), a = n % 100; - return (n - a) / 100 * 60 + a - }(a[8], a[9], a[10]), t._d = Vt.apply(null, t._a), t._d.setUTCMinutes(t._d.getUTCMinutes() - t._tzm), g(t).rfc2822 = !0 - } else t._isValid = !1 - } + if (me._bufferedRender) { + me._bufferedRequest = { + duration: config.duration, + easing: config.easing, + lazy: config.lazy + }; + } else { + me.render(config); + } + }, - function De(t) { - if (t._f !== a.ISO_8601) if (t._f !== a.RFC_2822) { - t._a = [], g(t).empty = !0; - var e, i, n, r, o, s, l, u, d = "" + t._i, c = d.length, f = 0; - for (n = q(t._f, t._locale).match(H) || [], e = 0; e < n.length; e++) r = n[e], (i = (d.match(ht(r, t)) || [])[0]) && ((o = d.substr(0, d.indexOf(i))).length > 0 && g(t).unusedInput.push(o), d = d.slice(d.indexOf(i) + i.length), f += i.length), E[r] ? (i ? g(t).empty = !1 : g(t).unusedTokens.push(r), s = r, u = t, null != (l = i) && h(ft, s) && ft[s](l, u._a, u, s)) : t._strict && !i && g(t).unusedTokens.push(r); - g(t).charsLeftOver = c - f, d.length > 0 && g(t).unusedInput.push(d), t._a[bt] <= 12 && !0 === g(t).bigHour && t._a[bt] > 0 && (g(t).bigHour = void 0), g(t).parsedDateParts = t._a.slice(0), g(t).meridiem = t._meridiem, t._a[bt] = function (t, e, i) { - var n; - if (null == i) return e; - return null != t.meridiemHour ? t.meridiemHour(e, i) : null != t.isPM ? ((n = t.isPM(i)) && e < 12 && (e += 12), n || 12 !== e || (e = 0), e) : e - }(t._locale, t._a[bt], t._meridiem), ge(t), ce(t) - } else Se(t); else _e(t) - } + /** + * Updates the chart layout unless a plugin returns `false` to the `beforeLayout` + * hook, in which case, plugins will not be called on `afterLayout`. + * @private + */ + updateLayout: function () { + var me = this; - function Ce(t) { - var e, i, n, h, f = t._i, v = t._f; - return t._locale = t._locale || he(t._l), null === f || void 0 === v && "" === f ? p({nullInput: !0}) : ("string" == typeof f && (t._i = f = t._locale.preparse(f)), _(f) ? new x(ce(f)) : (u(f) ? t._d = f : r(v) ? function (t) { - var e, i, n, a, r; - if (0 === t._f.length) return g(t).invalidFormat = !0, void(t._d = new Date(NaN)); - for (a = 0; a < t._f.length; a++) r = 0, e = y({}, t), null != t._useUTC && (e._useUTC = t._useUTC), e._f = t._f[a], De(e), m(e) && (r += g(e).charsLeftOver, r += 10 * g(e).unusedTokens.length, g(e).score = r, (null == n || r < n) && (n = r, i = e)); - c(t, i || e) - }(t) : v ? De(t) : s(i = (e = t)._i) ? e._d = new Date(a.now()) : u(i) ? e._d = new Date(i.valueOf()) : "string" == typeof i ? (n = e, null === (h = xe.exec(n._i)) ? (_e(n), !1 === n._isValid && (delete n._isValid, Se(n), !1 === n._isValid && (delete n._isValid, a.createFromInputFallback(n)))) : n._d = new Date(+h[1])) : r(i) ? (e._a = d(i.slice(0), function (t) { - return parseInt(t, 10) - }), ge(e)) : o(i) ? function (t) { - if (!t._d) { - var e = W(t._i); - t._a = d([e.year, e.month, e.day || e.date, e.hour, e.minute, e.second, e.millisecond], function (t) { - return t && parseInt(t, 10) - }), ge(t) - } - }(e) : l(i) ? e._d = new Date(i) : a.createFromInputFallback(e), m(t) || (t._d = null), t)) - } + if (core_plugins.notify(me, 'beforeLayout') === false) { + return; + } - function Pe(t, e, i, n, a) { - var s, l = {}; - return !0 !== i && !1 !== i || (n = i, i = void 0), (o(t) && function (t) { - if (Object.getOwnPropertyNames) return 0 === Object.getOwnPropertyNames(t).length; - var e; - for (e in t) if (t.hasOwnProperty(e)) return !1; - return !0 - }(t) || r(t) && 0 === t.length) && (t = void 0), l._isAMomentObject = !0, l._useUTC = l._isUTC = a, l._l = i, l._i = t, l._f = e, l._strict = n, (s = new x(ce(Ce(l))))._nextDay && (s.add(1, "d"), s._nextDay = void 0), s - } + core_layouts.update(this, this.width, this.height); - function Te(t, e, i, n) { - return Pe(t, e, i, n, !1) - } + /** + * Provided for backward compatibility, use `afterLayout` instead. + * @method IPlugin#afterScaleUpdate + * @deprecated since version 2.5.0 + * @todo remove at version 3 + * @private + */ + core_plugins.notify(me, 'afterScaleUpdate'); + core_plugins.notify(me, 'afterLayout'); + }, - a.createFromInputFallback = D("value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged and will be removed in an upcoming major release. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.", function (t) { - t._d = new Date(t._i + (t._useUTC ? " UTC" : "")) - }), a.ISO_8601 = function () { - }, a.RFC_2822 = function () { - }; - var Oe = D("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/", function () { - var t = Te.apply(null, arguments); - return this.isValid() && t.isValid() ? t < this ? this : t : p() - }), - Ie = D("moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/", function () { - var t = Te.apply(null, arguments); - return this.isValid() && t.isValid() ? t > this ? this : t : p() - }); - - function Ae(t, e) { - var i, n; - if (1 === e.length && r(e[0]) && (e = e[0]), !e.length) return Te(); - for (i = e[0], n = 1; n < e.length; ++n) e[n].isValid() && !e[n][t](i) || (i = e[n]); - return i - } + /** + * Updates all datasets unless a plugin returns `false` to the `beforeDatasetsUpdate` + * hook, in which case, plugins will not be called on `afterDatasetsUpdate`. + * @private + */ + updateDatasets: function () { + var me = this; - var Fe = ["year", "quarter", "month", "week", "day", "hour", "minute", "second", "millisecond"]; - - function Re(t) { - var e = W(t), i = e.year || 0, n = e.quarter || 0, a = e.month || 0, r = e.week || 0, - o = e.day || 0, s = e.hour || 0, l = e.minute || 0, u = e.second || 0, d = e.millisecond || 0; - this._isValid = function (t) { - for (var e in t) if (-1 === Ct.call(Fe, e) || null != t[e] && isNaN(t[e])) return !1; - for (var i = !1, n = 0; n < Fe.length; ++n) if (t[Fe[n]]) { - if (i) return !1; - parseFloat(t[Fe[n]]) !== w(t[Fe[n]]) && (i = !0) - } - return !0 - }(e), this._milliseconds = +d + 1e3 * u + 6e4 * l + 1e3 * s * 60 * 60, this._days = +o + 7 * r, this._months = +a + 3 * n + 12 * i, this._data = {}, this._locale = he(), this._bubble() - } + if (core_plugins.notify(me, 'beforeDatasetsUpdate') === false) { + return; + } - function Le(t) { - return t instanceof Re - } + for (var i = 0, ilen = me.data.datasets.length; i < ilen; ++i) { + me.updateDataset(i); + } - function We(t) { - return t < 0 ? -1 * Math.round(-1 * t) : Math.round(t) - } + core_plugins.notify(me, 'afterDatasetsUpdate'); + }, - function Ye(t, e) { - j(t, 0, 0, function () { - var t = this.utcOffset(), i = "+"; - return t < 0 && (t = -t, i = "-"), i + z(~~(t / 60), 2) + e + z(~~t % 60, 2) - }) - } + /** + * Updates dataset at index unless a plugin returns `false` to the `beforeDatasetUpdate` + * hook, in which case, plugins will not be called on `afterDatasetUpdate`. + * @private + */ + updateDataset: function (index) { + var me = this; + var meta = me.getDatasetMeta(index); + var args = { + meta: meta, + index: index + }; - Ye("Z", ":"), Ye("ZZ", ""), dt("Z", st), dt("ZZ", st), gt(["Z", "ZZ"], function (t, e, i) { - i._useUTC = !0, i._tzm = ze(st, t) - }); - var Ne = /([\+\-]|\d\d)/gi; + if (core_plugins.notify(me, 'beforeDatasetUpdate', [args]) === false) { + return; + } - function ze(t, e) { - var i = (e || "").match(t); - if (null === i) return null; - var n = ((i[i.length - 1] || []) + "").match(Ne) || ["-", 0, 0], a = 60 * n[1] + w(n[2]); - return 0 === a ? 0 : "+" === n[0] ? a : -a - } + meta.controller.update(); - function He(t, e) { - var i, n; - return e._isUTC ? (i = e.clone(), n = (_(t) || u(t) ? t.valueOf() : Te(t).valueOf()) - i.valueOf(), i._d.setTime(i._d.valueOf() + n), a.updateOffset(i, !1), i) : Te(t).local() - } + core_plugins.notify(me, 'afterDatasetUpdate', [args]); + }, - function Ve(t) { - return 15 * -Math.round(t._d.getTimezoneOffset() / 15) - } + render: function (config) { + var me = this; - function Be() { - return !!this.isValid() && (this._isUTC && 0 === this._offset) - } + if (!config || typeof config !== 'object') { + // backwards compatibility + config = { + duration: config, + lazy: arguments[1] + }; + } - a.updateOffset = function () { - }; - var Ee = /^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/, - je = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/; - - function Ue(t, e) { - var i, n, a, r = t, o = null; - return Le(t) ? r = { - ms: t._milliseconds, - d: t._days, - M: t._months - } : l(t) ? (r = {}, e ? r[e] = t : r.milliseconds = t) : (o = Ee.exec(t)) ? (i = "-" === o[1] ? -1 : 1, r = { - y: 0, - d: w(o[yt]) * i, - h: w(o[bt]) * i, - m: w(o[xt]) * i, - s: w(o[_t]) * i, - ms: w(We(1e3 * o[kt])) * i - }) : (o = je.exec(t)) ? (i = "-" === o[1] ? -1 : (o[1], 1), r = { - y: qe(o[2], i), - M: qe(o[3], i), - w: qe(o[4], i), - d: qe(o[5], i), - h: qe(o[6], i), - m: qe(o[7], i), - s: qe(o[8], i) - }) : null == r ? r = {} : "object" == typeof r && ("from" in r || "to" in r) && (a = function (t, e) { - var i; - if (!t.isValid() || !e.isValid()) return {milliseconds: 0, months: 0}; - e = He(e, t), t.isBefore(e) ? i = Ge(t, e) : ((i = Ge(e, t)).milliseconds = -i.milliseconds, i.months = -i.months); - return i - }(Te(r.from), Te(r.to)), (r = {}).ms = a.milliseconds, r.M = a.months), n = new Re(r), Le(t) && h(t, "_locale") && (n._locale = t._locale), n - } + var animationOptions = me.options.animation; + var duration = valueOrDefault$8(config.duration, animationOptions && animationOptions.duration); + var lazy = config.lazy; - function qe(t, e) { - var i = t && parseFloat(t.replace(",", ".")); - return (isNaN(i) ? 0 : i) * e - } + if (core_plugins.notify(me, 'beforeRender') === false) { + return; + } - function Ge(t, e) { - var i = {milliseconds: 0, months: 0}; - return i.months = e.month() - t.month() + 12 * (e.year() - t.year()), t.clone().add(i.months, "M").isAfter(e) && --i.months, i.milliseconds = +e - +t.clone().add(i.months, "M"), i - } + var onComplete = function (animation) { + core_plugins.notify(me, 'afterRender'); + helpers$1.callback(animationOptions && animationOptions.onComplete, [animation], me); + }; - function Ze(t, e) { - return function (i, n) { - var a; - return null === n || isNaN(+n) || (T(e, "moment()." + e + "(period, number) is deprecated. Please use moment()." + e + "(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."), a = i, i = n, n = a), Xe(this, Ue(i = "string" == typeof i ? +i : i, n), t), this - } - } + if (animationOptions && duration) { + var animation = new core_animation({ + numSteps: duration / 16.66, // 60 fps + easing: config.easing || animationOptions.easing, - function Xe(t, e, i, n) { - var r = e._milliseconds, o = We(e._days), s = We(e._months); - t.isValid() && (n = null == n || n, s && Wt(t, Ot(t, "Month") + s * i), o && It(t, "Date", Ot(t, "Date") + o * i), r && t._d.setTime(t._d.valueOf() + r * i), n && a.updateOffset(t, o || s)) - } + render: function (chart, animationObject) { + var easingFunction = helpers$1.easing.effects[animationObject.easing]; + var currentStep = animationObject.currentStep; + var stepDecimal = currentStep / animationObject.numSteps; - Ue.fn = Re.prototype, Ue.invalid = function () { - return Ue(NaN) - }; - var Je = Ze(1, "add"), Ke = Ze(-1, "subtract"); + chart.draw(easingFunction(stepDecimal), stepDecimal, currentStep); + }, - function $e(t, e) { - var i = 12 * (e.year() - t.year()) + (e.month() - t.month()), n = t.clone().add(i, "months"); - return -(i + (e - n < 0 ? (e - n) / (n - t.clone().add(i - 1, "months")) : (e - n) / (t.clone().add(i + 1, "months") - n))) || 0 - } + onAnimationProgress: animationOptions.onProgress, + onAnimationComplete: onComplete + }); - function Qe(t) { - var e; - return void 0 === t ? this._locale._abbr : (null != (e = he(t)) && (this._locale = e), this) - } + core_animations.addAnimation(me, animation, duration, lazy); + } else { + me.draw(); - a.defaultFormat = "YYYY-MM-DDTHH:mm:ssZ", a.defaultFormatUtc = "YYYY-MM-DDTHH:mm:ss[Z]"; - var ti = D("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.", function (t) { - return void 0 === t ? this.localeData() : this.locale(t) - }); + // See https://github.com/chartjs/Chart.js/issues/3781 + onComplete(new core_animation({numSteps: 0, chart: me})); + } - function ei() { - return this._locale - } + return me; + }, - function ii(t, e) { - j(0, [t, t.length], 0, e) - } + draw: function (easingValue) { + var me = this; - function ni(t, e, i, n, a) { - var r; - return null == t ? jt(this, n, a).year : (e > (r = Ut(t, n, a)) && (e = r), function (t, e, i, n, a) { - var r = Et(t, e, i, n, a), o = Vt(r.year, 0, r.dayOfYear); - return this.year(o.getUTCFullYear()), this.month(o.getUTCMonth()), this.date(o.getUTCDate()), this - }.call(this, t, e, i, n, a)) - } + me.clear(); - j(0, ["gg", 2], 0, function () { - return this.weekYear() % 100 - }), j(0, ["GG", 2], 0, function () { - return this.isoWeekYear() % 100 - }), ii("gggg", "weekYear"), ii("ggggg", "weekYear"), ii("GGGG", "isoWeekYear"), ii("GGGGG", "isoWeekYear"), R("weekYear", "gg"), R("isoWeekYear", "GG"), N("weekYear", 1), N("isoWeekYear", 1), dt("G", rt), dt("g", rt), dt("GG", $, Z), dt("gg", $, Z), dt("GGGG", it, J), dt("gggg", it, J), dt("GGGGG", nt, K), dt("ggggg", nt, K), mt(["gggg", "ggggg", "GGGG", "GGGGG"], function (t, e, i, n) { - e[n.substr(0, 2)] = w(t) - }), mt(["gg", "GG"], function (t, e, i, n) { - e[n] = a.parseTwoDigitYear(t) - }), j("Q", 0, "Qo", "quarter"), R("quarter", "Q"), N("quarter", 7), dt("Q", G), gt("Q", function (t, e) { - e[vt] = 3 * (w(t) - 1) - }), j("D", ["DD", 2], "Do", "date"), R("date", "D"), N("date", 9), dt("D", $), dt("DD", $, Z), dt("Do", function (t, e) { - return t ? e._dayOfMonthOrdinalParse || e._ordinalParse : e._dayOfMonthOrdinalParseLenient - }), gt(["D", "DD"], yt), gt("Do", function (t, e) { - e[yt] = w(t.match($)[0]) - }); - var ai = Tt("Date", !0); - j("DDD", ["DDDD", 3], "DDDo", "dayOfYear"), R("dayOfYear", "DDD"), N("dayOfYear", 4), dt("DDD", et), dt("DDDD", X), gt(["DDD", "DDDD"], function (t, e, i) { - i._dayOfYear = w(t) - }), j("m", ["mm", 2], 0, "minute"), R("minute", "m"), N("minute", 14), dt("m", $), dt("mm", $, Z), gt(["m", "mm"], xt); - var ri = Tt("Minutes", !1); - j("s", ["ss", 2], 0, "second"), R("second", "s"), N("second", 15), dt("s", $), dt("ss", $, Z), gt(["s", "ss"], _t); - var oi, si = Tt("Seconds", !1); - for (j("S", 0, 0, function () { - return ~~(this.millisecond() / 100) - }), j(0, ["SS", 2], 0, function () { - return ~~(this.millisecond() / 10) - }), j(0, ["SSS", 3], 0, "millisecond"), j(0, ["SSSS", 4], 0, function () { - return 10 * this.millisecond() - }), j(0, ["SSSSS", 5], 0, function () { - return 100 * this.millisecond() - }), j(0, ["SSSSSS", 6], 0, function () { - return 1e3 * this.millisecond() - }), j(0, ["SSSSSSS", 7], 0, function () { - return 1e4 * this.millisecond() - }), j(0, ["SSSSSSSS", 8], 0, function () { - return 1e5 * this.millisecond() - }), j(0, ["SSSSSSSSS", 9], 0, function () { - return 1e6 * this.millisecond() - }), R("millisecond", "ms"), N("millisecond", 16), dt("S", et, G), dt("SS", et, Z), dt("SSS", et, X), oi = "SSSS"; oi.length <= 9; oi += "S") dt(oi, at); - - function li(t, e) { - e[kt] = w(1e3 * ("0." + t)) - } + if (helpers$1.isNullOrUndef(easingValue)) { + easingValue = 1; + } - for (oi = "S"; oi.length <= 9; oi += "S") gt(oi, li); - var ui = Tt("Milliseconds", !1); - j("z", 0, 0, "zoneAbbr"), j("zz", 0, 0, "zoneName"); - var di = x.prototype; + me.transition(easingValue); - function hi(t) { - return t - } + if (me.width <= 0 || me.height <= 0) { + return; + } - di.add = Je, di.calendar = function (t, e) { - var i = t || Te(), n = He(i, this).startOf("day"), r = a.calendarFormat(this, n) || "sameElse", - o = e && (O(e[r]) ? e[r].call(this, i) : e[r]); - return this.format(o || this.localeData().calendar(r, this, Te(i))) - }, di.clone = function () { - return new x(this) - }, di.diff = function (t, e, i) { - var n, a, r; - if (!this.isValid()) return NaN; - if (!(n = He(t, this)).isValid()) return NaN; - switch (a = 6e4 * (n.utcOffset() - this.utcOffset()), e = L(e)) { - case"year": - r = $e(this, n) / 12; - break; - case"month": - r = $e(this, n); - break; - case"quarter": - r = $e(this, n) / 3; - break; - case"second": - r = (this - n) / 1e3; - break; - case"minute": - r = (this - n) / 6e4; - break; - case"hour": - r = (this - n) / 36e5; - break; - case"day": - r = (this - n - a) / 864e5; - break; - case"week": - r = (this - n - a) / 6048e5; - break; - default: - r = this - n - } - return i ? r : k(r) - }, di.endOf = function (t) { - return void 0 === (t = L(t)) || "millisecond" === t ? this : ("date" === t && (t = "day"), this.startOf(t).add(1, "isoWeek" === t ? "week" : t).subtract(1, "ms")) - }, di.format = function (t) { - t || (t = this.isUtc() ? a.defaultFormatUtc : a.defaultFormat); - var e = U(this, t); - return this.localeData().postformat(e) - }, di.from = function (t, e) { - return this.isValid() && (_(t) && t.isValid() || Te(t).isValid()) ? Ue({ - to: this, - from: t - }).locale(this.locale()).humanize(!e) : this.localeData().invalidDate() - }, di.fromNow = function (t) { - return this.from(Te(), t) - }, di.to = function (t, e) { - return this.isValid() && (_(t) && t.isValid() || Te(t).isValid()) ? Ue({ - from: this, - to: t - }).locale(this.locale()).humanize(!e) : this.localeData().invalidDate() - }, di.toNow = function (t) { - return this.to(Te(), t) - }, di.get = function (t) { - return O(this[t = L(t)]) ? this[t]() : this - }, di.invalidAt = function () { - return g(this).overflow - }, di.isAfter = function (t, e) { - var i = _(t) ? t : Te(t); - return !(!this.isValid() || !i.isValid()) && ("millisecond" === (e = L(s(e) ? "millisecond" : e)) ? this.valueOf() > i.valueOf() : i.valueOf() < this.clone().startOf(e).valueOf()) - }, di.isBefore = function (t, e) { - var i = _(t) ? t : Te(t); - return !(!this.isValid() || !i.isValid()) && ("millisecond" === (e = L(s(e) ? "millisecond" : e)) ? this.valueOf() < i.valueOf() : this.clone().endOf(e).valueOf() < i.valueOf()) - }, di.isBetween = function (t, e, i, n) { - return ("(" === (n = n || "()")[0] ? this.isAfter(t, i) : !this.isBefore(t, i)) && (")" === n[1] ? this.isBefore(e, i) : !this.isAfter(e, i)) - }, di.isSame = function (t, e) { - var i, n = _(t) ? t : Te(t); - return !(!this.isValid() || !n.isValid()) && ("millisecond" === (e = L(e || "millisecond")) ? this.valueOf() === n.valueOf() : (i = n.valueOf(), this.clone().startOf(e).valueOf() <= i && i <= this.clone().endOf(e).valueOf())) - }, di.isSameOrAfter = function (t, e) { - return this.isSame(t, e) || this.isAfter(t, e) - }, di.isSameOrBefore = function (t, e) { - return this.isSame(t, e) || this.isBefore(t, e) - }, di.isValid = function () { - return m(this) - }, di.lang = ti, di.locale = Qe, di.localeData = ei, di.max = Ie, di.min = Oe, di.parsingFlags = function () { - return c({}, g(this)) - }, di.set = function (t, e) { - if ("object" == typeof t) for (var i = function (t) { - var e = []; - for (var i in t) e.push({unit: i, priority: Y[i]}); - return e.sort(function (t, e) { - return t.priority - e.priority - }), e - }(t = W(t)), n = 0; n < i.length; n++) this[i[n].unit](t[i[n].unit]); else if (O(this[t = L(t)])) return this[t](e); - return this - }, di.startOf = function (t) { - switch (t = L(t)) { - case"year": - this.month(0); - case"quarter": - case"month": - this.date(1); - case"week": - case"isoWeek": - case"day": - case"date": - this.hours(0); - case"hour": - this.minutes(0); - case"minute": - this.seconds(0); - case"second": - this.milliseconds(0) - } - return "week" === t && this.weekday(0), "isoWeek" === t && this.isoWeekday(1), "quarter" === t && this.month(3 * Math.floor(this.month() / 3)), this - }, di.subtract = Ke, di.toArray = function () { - var t = this; - return [t.year(), t.month(), t.date(), t.hour(), t.minute(), t.second(), t.millisecond()] - }, di.toObject = function () { - var t = this; - return { - years: t.year(), - months: t.month(), - date: t.date(), - hours: t.hours(), - minutes: t.minutes(), - seconds: t.seconds(), - milliseconds: t.milliseconds() - } - }, di.toDate = function () { - return new Date(this.valueOf()) - }, di.toISOString = function (t) { - if (!this.isValid()) return null; - var e = !0 !== t, i = e ? this.clone().utc() : this; - return i.year() < 0 || i.year() > 9999 ? U(i, e ? "YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]" : "YYYYYY-MM-DD[T]HH:mm:ss.SSSZ") : O(Date.prototype.toISOString) ? e ? this.toDate().toISOString() : new Date(this._d.valueOf()).toISOString().replace("Z", U(i, "Z")) : U(i, e ? "YYYY-MM-DD[T]HH:mm:ss.SSS[Z]" : "YYYY-MM-DD[T]HH:mm:ss.SSSZ") - }, di.inspect = function () { - if (!this.isValid()) return "moment.invalid(/* " + this._i + " */)"; - var t = "moment", e = ""; - this.isLocal() || (t = 0 === this.utcOffset() ? "moment.utc" : "moment.parseZone", e = "Z"); - var i = "[" + t + '("]', n = 0 <= this.year() && this.year() <= 9999 ? "YYYY" : "YYYYYY", - a = e + '[")]'; - return this.format(i + n + "-MM-DD[T]HH:mm:ss.SSS" + a) - }, di.toJSON = function () { - return this.isValid() ? this.toISOString() : null - }, di.toString = function () { - return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ") - }, di.unix = function () { - return Math.floor(this.valueOf() / 1e3) - }, di.valueOf = function () { - return this._d.valueOf() - 6e4 * (this._offset || 0) - }, di.creationData = function () { - return { - input: this._i, - format: this._f, - locale: this._locale, - isUTC: this._isUTC, - strict: this._strict - } - }, di.year = Pt, di.isLeapYear = function () { - return Dt(this.year()) - }, di.weekYear = function (t) { - return ni.call(this, t, this.week(), this.weekday(), this.localeData()._week.dow, this.localeData()._week.doy) - }, di.isoWeekYear = function (t) { - return ni.call(this, t, this.isoWeek(), this.isoWeekday(), 1, 4) - }, di.quarter = di.quarters = function (t) { - return null == t ? Math.ceil((this.month() + 1) / 3) : this.month(3 * (t - 1) + this.month() % 3) - }, di.month = Yt, di.daysInMonth = function () { - return At(this.year(), this.month()) - }, di.week = di.weeks = function (t) { - var e = this.localeData().week(this); - return null == t ? e : this.add(7 * (t - e), "d") - }, di.isoWeek = di.isoWeeks = function (t) { - var e = jt(this, 1, 4).week; - return null == t ? e : this.add(7 * (t - e), "d") - }, di.weeksInYear = function () { - var t = this.localeData()._week; - return Ut(this.year(), t.dow, t.doy) - }, di.isoWeeksInYear = function () { - return Ut(this.year(), 1, 4) - }, di.date = ai, di.day = di.days = function (t) { - if (!this.isValid()) return null != t ? this : NaN; - var e, i, n = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); - return null != t ? (e = t, i = this.localeData(), t = "string" != typeof e ? e : isNaN(e) ? "number" == typeof(e = i.weekdaysParse(e)) ? e : null : parseInt(e, 10), this.add(t - n, "d")) : n - }, di.weekday = function (t) { - if (!this.isValid()) return null != t ? this : NaN; - var e = (this.day() + 7 - this.localeData()._week.dow) % 7; - return null == t ? e : this.add(t - e, "d") - }, di.isoWeekday = function (t) { - if (!this.isValid()) return null != t ? this : NaN; - if (null != t) { - var e = (i = t, n = this.localeData(), "string" == typeof i ? n.weekdaysParse(i) % 7 || 7 : isNaN(i) ? null : i); - return this.day(this.day() % 7 ? e : e - 7) - } - return this.day() || 7; - var i, n - }, di.dayOfYear = function (t) { - var e = Math.round((this.clone().startOf("day") - this.clone().startOf("year")) / 864e5) + 1; - return null == t ? e : this.add(t - e, "d") - }, di.hour = di.hours = ne, di.minute = di.minutes = ri, di.second = di.seconds = si, di.millisecond = di.milliseconds = ui, di.utcOffset = function (t, e, i) { - var n, r = this._offset || 0; - if (!this.isValid()) return null != t ? this : NaN; - if (null != t) { - if ("string" == typeof t) { - if (null === (t = ze(st, t))) return this - } else Math.abs(t) < 16 && !i && (t *= 60); - return !this._isUTC && e && (n = Ve(this)), this._offset = t, this._isUTC = !0, null != n && this.add(n, "m"), r !== t && (!e || this._changeInProgress ? Xe(this, Ue(t - r, "m"), 1, !1) : this._changeInProgress || (this._changeInProgress = !0, a.updateOffset(this, !0), this._changeInProgress = null)), this - } - return this._isUTC ? r : Ve(this) - }, di.utc = function (t) { - return this.utcOffset(0, t) - }, di.local = function (t) { - return this._isUTC && (this.utcOffset(0, t), this._isUTC = !1, t && this.subtract(Ve(this), "m")), this - }, di.parseZone = function () { - if (null != this._tzm) this.utcOffset(this._tzm, !1, !0); else if ("string" == typeof this._i) { - var t = ze(ot, this._i); - null != t ? this.utcOffset(t) : this.utcOffset(0, !0) - } - return this - }, di.hasAlignedHourOffset = function (t) { - return !!this.isValid() && (t = t ? Te(t).utcOffset() : 0, (this.utcOffset() - t) % 60 == 0) - }, di.isDST = function () { - return this.utcOffset() > this.clone().month(0).utcOffset() || this.utcOffset() > this.clone().month(5).utcOffset() - }, di.isLocal = function () { - return !!this.isValid() && !this._isUTC - }, di.isUtcOffset = function () { - return !!this.isValid() && this._isUTC - }, di.isUtc = Be, di.isUTC = Be, di.zoneAbbr = function () { - return this._isUTC ? "UTC" : "" - }, di.zoneName = function () { - return this._isUTC ? "Coordinated Universal Time" : "" - }, di.dates = D("dates accessor is deprecated. Use date instead.", ai), di.months = D("months accessor is deprecated. Use month instead", Yt), di.years = D("years accessor is deprecated. Use year instead", Pt), di.zone = D("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/", function (t, e) { - return null != t ? ("string" != typeof t && (t = -t), this.utcOffset(t, e), this) : -this.utcOffset() - }), di.isDSTShifted = D("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information", function () { - if (!s(this._isDSTShifted)) return this._isDSTShifted; - var t = {}; - if (y(t, this), (t = Ce(t))._a) { - var e = t._isUTC ? f(t._a) : Te(t._a); - this._isDSTShifted = this.isValid() && M(t._a, e.toArray()) > 0 - } else this._isDSTShifted = !1; - return this._isDSTShifted - }); - var ci = A.prototype; + if (core_plugins.notify(me, 'beforeDraw', [easingValue]) === false) { + return; + } - function fi(t, e, i, n) { - var a = he(), r = f().set(n, e); - return a[i](r, t) - } + // Draw all the scales + helpers$1.each(me.boxes, function (box) { + box.draw(me.chartArea); + }, me); - function gi(t, e, i) { - if (l(t) && (e = t, t = void 0), t = t || "", null != e) return fi(t, e, i, "month"); - var n, a = []; - for (n = 0; n < 12; n++) a[n] = fi(t, n, i, "month"); - return a - } + me.drawDatasets(easingValue); + me._drawTooltip(easingValue); - function mi(t, e, i, n) { - "boolean" == typeof t ? (l(e) && (i = e, e = void 0), e = e || "") : (i = e = t, t = !1, l(e) && (i = e, e = void 0), e = e || ""); - var a, r = he(), o = t ? r._week.dow : 0; - if (null != i) return fi(e, (i + o) % 7, n, "day"); - var s = []; - for (a = 0; a < 7; a++) s[a] = fi(e, (a + o) % 7, n, "day"); - return s - } + core_plugins.notify(me, 'afterDraw', [easingValue]); + }, - ci.calendar = function (t, e, i) { - var n = this._calendar[t] || this._calendar.sameElse; - return O(n) ? n.call(e, i) : n - }, ci.longDateFormat = function (t) { - var e = this._longDateFormat[t], i = this._longDateFormat[t.toUpperCase()]; - return e || !i ? e : (this._longDateFormat[t] = i.replace(/MMMM|MM|DD|dddd/g, function (t) { - return t.slice(1) - }), this._longDateFormat[t]) - }, ci.invalidDate = function () { - return this._invalidDate - }, ci.ordinal = function (t) { - return this._ordinal.replace("%d", t) - }, ci.preparse = hi, ci.postformat = hi, ci.relativeTime = function (t, e, i, n) { - var a = this._relativeTime[i]; - return O(a) ? a(t, e, i, n) : a.replace(/%d/i, t) - }, ci.pastFuture = function (t, e) { - var i = this._relativeTime[t > 0 ? "future" : "past"]; - return O(i) ? i(e) : i.replace(/%s/i, e) - }, ci.set = function (t) { - var e, i; - for (i in t) O(e = t[i]) ? this[i] = e : this["_" + i] = e; - this._config = t, this._dayOfMonthOrdinalParseLenient = new RegExp((this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) + "|" + /\d{1,2}/.source) - }, ci.months = function (t, e) { - return t ? r(this._months) ? this._months[t.month()] : this._months[(this._months.isFormat || Ft).test(e) ? "format" : "standalone"][t.month()] : r(this._months) ? this._months : this._months.standalone - }, ci.monthsShort = function (t, e) { - return t ? r(this._monthsShort) ? this._monthsShort[t.month()] : this._monthsShort[Ft.test(e) ? "format" : "standalone"][t.month()] : r(this._monthsShort) ? this._monthsShort : this._monthsShort.standalone - }, ci.monthsParse = function (t, e, i) { - var n, a, r; - if (this._monthsParseExact) return function (t, e, i) { - var n, a, r, o = t.toLocaleLowerCase(); - if (!this._monthsParse) for (this._monthsParse = [], this._longMonthsParse = [], this._shortMonthsParse = [], n = 0; n < 12; ++n) r = f([2e3, n]), this._shortMonthsParse[n] = this.monthsShort(r, "").toLocaleLowerCase(), this._longMonthsParse[n] = this.months(r, "").toLocaleLowerCase(); - return i ? "MMM" === e ? -1 !== (a = Ct.call(this._shortMonthsParse, o)) ? a : null : -1 !== (a = Ct.call(this._longMonthsParse, o)) ? a : null : "MMM" === e ? -1 !== (a = Ct.call(this._shortMonthsParse, o)) ? a : -1 !== (a = Ct.call(this._longMonthsParse, o)) ? a : null : -1 !== (a = Ct.call(this._longMonthsParse, o)) ? a : -1 !== (a = Ct.call(this._shortMonthsParse, o)) ? a : null - }.call(this, t, e, i); - for (this._monthsParse || (this._monthsParse = [], this._longMonthsParse = [], this._shortMonthsParse = []), n = 0; n < 12; n++) { - if (a = f([2e3, n]), i && !this._longMonthsParse[n] && (this._longMonthsParse[n] = new RegExp("^" + this.months(a, "").replace(".", "") + "$", "i"), this._shortMonthsParse[n] = new RegExp("^" + this.monthsShort(a, "").replace(".", "") + "$", "i")), i || this._monthsParse[n] || (r = "^" + this.months(a, "") + "|^" + this.monthsShort(a, ""), this._monthsParse[n] = new RegExp(r.replace(".", ""), "i")), i && "MMMM" === e && this._longMonthsParse[n].test(t)) return n; - if (i && "MMM" === e && this._shortMonthsParse[n].test(t)) return n; - if (!i && this._monthsParse[n].test(t)) return n - } - }, ci.monthsRegex = function (t) { - return this._monthsParseExact ? (h(this, "_monthsRegex") || Ht.call(this), t ? this._monthsStrictRegex : this._monthsRegex) : (h(this, "_monthsRegex") || (this._monthsRegex = zt), this._monthsStrictRegex && t ? this._monthsStrictRegex : this._monthsRegex) - }, ci.monthsShortRegex = function (t) { - return this._monthsParseExact ? (h(this, "_monthsRegex") || Ht.call(this), t ? this._monthsShortStrictRegex : this._monthsShortRegex) : (h(this, "_monthsShortRegex") || (this._monthsShortRegex = Nt), this._monthsShortStrictRegex && t ? this._monthsShortStrictRegex : this._monthsShortRegex) - }, ci.week = function (t) { - return jt(t, this._week.dow, this._week.doy).week - }, ci.firstDayOfYear = function () { - return this._week.doy - }, ci.firstDayOfWeek = function () { - return this._week.dow - }, ci.weekdays = function (t, e) { - return t ? r(this._weekdays) ? this._weekdays[t.day()] : this._weekdays[this._weekdays.isFormat.test(e) ? "format" : "standalone"][t.day()] : r(this._weekdays) ? this._weekdays : this._weekdays.standalone - }, ci.weekdaysMin = function (t) { - return t ? this._weekdaysMin[t.day()] : this._weekdaysMin - }, ci.weekdaysShort = function (t) { - return t ? this._weekdaysShort[t.day()] : this._weekdaysShort - }, ci.weekdaysParse = function (t, e, i) { - var n, a, r; - if (this._weekdaysParseExact) return function (t, e, i) { - var n, a, r, o = t.toLocaleLowerCase(); - if (!this._weekdaysParse) for (this._weekdaysParse = [], this._shortWeekdaysParse = [], this._minWeekdaysParse = [], n = 0; n < 7; ++n) r = f([2e3, 1]).day(n), this._minWeekdaysParse[n] = this.weekdaysMin(r, "").toLocaleLowerCase(), this._shortWeekdaysParse[n] = this.weekdaysShort(r, "").toLocaleLowerCase(), this._weekdaysParse[n] = this.weekdays(r, "").toLocaleLowerCase(); - return i ? "dddd" === e ? -1 !== (a = Ct.call(this._weekdaysParse, o)) ? a : null : "ddd" === e ? -1 !== (a = Ct.call(this._shortWeekdaysParse, o)) ? a : null : -1 !== (a = Ct.call(this._minWeekdaysParse, o)) ? a : null : "dddd" === e ? -1 !== (a = Ct.call(this._weekdaysParse, o)) ? a : -1 !== (a = Ct.call(this._shortWeekdaysParse, o)) ? a : -1 !== (a = Ct.call(this._minWeekdaysParse, o)) ? a : null : "ddd" === e ? -1 !== (a = Ct.call(this._shortWeekdaysParse, o)) ? a : -1 !== (a = Ct.call(this._weekdaysParse, o)) ? a : -1 !== (a = Ct.call(this._minWeekdaysParse, o)) ? a : null : -1 !== (a = Ct.call(this._minWeekdaysParse, o)) ? a : -1 !== (a = Ct.call(this._weekdaysParse, o)) ? a : -1 !== (a = Ct.call(this._shortWeekdaysParse, o)) ? a : null - }.call(this, t, e, i); - for (this._weekdaysParse || (this._weekdaysParse = [], this._minWeekdaysParse = [], this._shortWeekdaysParse = [], this._fullWeekdaysParse = []), n = 0; n < 7; n++) { - if (a = f([2e3, 1]).day(n), i && !this._fullWeekdaysParse[n] && (this._fullWeekdaysParse[n] = new RegExp("^" + this.weekdays(a, "").replace(".", ".?") + "$", "i"), this._shortWeekdaysParse[n] = new RegExp("^" + this.weekdaysShort(a, "").replace(".", ".?") + "$", "i"), this._minWeekdaysParse[n] = new RegExp("^" + this.weekdaysMin(a, "").replace(".", ".?") + "$", "i")), this._weekdaysParse[n] || (r = "^" + this.weekdays(a, "") + "|^" + this.weekdaysShort(a, "") + "|^" + this.weekdaysMin(a, ""), this._weekdaysParse[n] = new RegExp(r.replace(".", ""), "i")), i && "dddd" === e && this._fullWeekdaysParse[n].test(t)) return n; - if (i && "ddd" === e && this._shortWeekdaysParse[n].test(t)) return n; - if (i && "dd" === e && this._minWeekdaysParse[n].test(t)) return n; - if (!i && this._weekdaysParse[n].test(t)) return n - } - }, ci.weekdaysRegex = function (t) { - return this._weekdaysParseExact ? (h(this, "_weekdaysRegex") || $t.call(this), t ? this._weekdaysStrictRegex : this._weekdaysRegex) : (h(this, "_weekdaysRegex") || (this._weekdaysRegex = Xt), this._weekdaysStrictRegex && t ? this._weekdaysStrictRegex : this._weekdaysRegex) - }, ci.weekdaysShortRegex = function (t) { - return this._weekdaysParseExact ? (h(this, "_weekdaysRegex") || $t.call(this), t ? this._weekdaysShortStrictRegex : this._weekdaysShortRegex) : (h(this, "_weekdaysShortRegex") || (this._weekdaysShortRegex = Jt), this._weekdaysShortStrictRegex && t ? this._weekdaysShortStrictRegex : this._weekdaysShortRegex) - }, ci.weekdaysMinRegex = function (t) { - return this._weekdaysParseExact ? (h(this, "_weekdaysRegex") || $t.call(this), t ? this._weekdaysMinStrictRegex : this._weekdaysMinRegex) : (h(this, "_weekdaysMinRegex") || (this._weekdaysMinRegex = Kt), this._weekdaysMinStrictRegex && t ? this._weekdaysMinStrictRegex : this._weekdaysMinRegex) - }, ci.isPM = function (t) { - return "p" === (t + "").toLowerCase().charAt(0) - }, ci.meridiem = function (t, e, i) { - return t > 11 ? i ? "pm" : "PM" : i ? "am" : "AM" - }, ue("en", { - dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, ordinal: function (t) { - var e = t % 10; - return t + (1 === w(t % 100 / 10) ? "th" : 1 === e ? "st" : 2 === e ? "nd" : 3 === e ? "rd" : "th") - } - }), a.lang = D("moment.lang is deprecated. Use moment.locale instead.", ue), a.langData = D("moment.langData is deprecated. Use moment.localeData instead.", he); - var pi = Math.abs; - - function vi(t, e, i, n) { - var a = Ue(e, i); - return t._milliseconds += n * a._milliseconds, t._days += n * a._days, t._months += n * a._months, t._bubble() - } + /** + * @private + */ + transition: function (easingValue) { + var me = this; - function yi(t) { - return t < 0 ? Math.floor(t) : Math.ceil(t) - } + for (var i = 0, ilen = (me.data.datasets || []).length; i < ilen; ++i) { + if (me.isDatasetVisible(i)) { + me.getDatasetMeta(i).controller.transition(easingValue); + } + } - function bi(t) { - return 4800 * t / 146097 - } + me.tooltip.transition(easingValue); + }, - function xi(t) { - return 146097 * t / 4800 - } + /** + * Draws all datasets unless a plugin returns `false` to the `beforeDatasetsDraw` + * hook, in which case, plugins will not be called on `afterDatasetsDraw`. + * @private + */ + drawDatasets: function (easingValue) { + var me = this; - function _i(t) { - return function () { - return this.as(t) - } - } + if (core_plugins.notify(me, 'beforeDatasetsDraw', [easingValue]) === false) { + return; + } - var ki = _i("ms"), wi = _i("s"), Mi = _i("m"), Si = _i("h"), Di = _i("d"), Ci = _i("w"), Pi = _i("M"), - Ti = _i("y"); + // Draw datasets reversed to support proper line stacking + for (var i = (me.data.datasets || []).length - 1; i >= 0; --i) { + if (me.isDatasetVisible(i)) { + me.drawDataset(i, easingValue); + } + } - function Oi(t) { - return function () { - return this.isValid() ? this._data[t] : NaN - } - } + core_plugins.notify(me, 'afterDatasetsDraw', [easingValue]); + }, - var Ii = Oi("milliseconds"), Ai = Oi("seconds"), Fi = Oi("minutes"), Ri = Oi("hours"), Li = Oi("days"), - Wi = Oi("months"), Yi = Oi("years"); - var Ni = Math.round, zi = {ss: 44, s: 45, m: 45, h: 22, d: 26, M: 11}; - var Hi = Math.abs; + /** + * Draws dataset at index unless a plugin returns `false` to the `beforeDatasetDraw` + * hook, in which case, plugins will not be called on `afterDatasetDraw`. + * @private + */ + drawDataset: function (index, easingValue) { + var me = this; + var meta = me.getDatasetMeta(index); + var args = { + meta: meta, + index: index, + easingValue: easingValue + }; - function Vi(t) { - return (t > 0) - (t < 0) || +t - } + if (core_plugins.notify(me, 'beforeDatasetDraw', [args]) === false) { + return; + } - function Bi() { - if (!this.isValid()) return this.localeData().invalidDate(); - var t, e, i = Hi(this._milliseconds) / 1e3, n = Hi(this._days), a = Hi(this._months); - e = k((t = k(i / 60)) / 60), i %= 60, t %= 60; - var r = k(a / 12), o = a %= 12, s = n, l = e, u = t, - d = i ? i.toFixed(3).replace(/\.?0+$/, "") : "", h = this.asSeconds(); - if (!h) return "P0D"; - var c = h < 0 ? "-" : "", f = Vi(this._months) !== Vi(h) ? "-" : "", - g = Vi(this._days) !== Vi(h) ? "-" : "", m = Vi(this._milliseconds) !== Vi(h) ? "-" : ""; - return c + "P" + (r ? f + r + "Y" : "") + (o ? f + o + "M" : "") + (s ? g + s + "D" : "") + (l || u || d ? "T" : "") + (l ? m + l + "H" : "") + (u ? m + u + "M" : "") + (d ? m + d + "S" : "") - } + meta.controller.draw(easingValue); - var Ei = Re.prototype; - return Ei.isValid = function () { - return this._isValid - }, Ei.abs = function () { - var t = this._data; - return this._milliseconds = pi(this._milliseconds), this._days = pi(this._days), this._months = pi(this._months), t.milliseconds = pi(t.milliseconds), t.seconds = pi(t.seconds), t.minutes = pi(t.minutes), t.hours = pi(t.hours), t.months = pi(t.months), t.years = pi(t.years), this - }, Ei.add = function (t, e) { - return vi(this, t, e, 1) - }, Ei.subtract = function (t, e) { - return vi(this, t, e, -1) - }, Ei.as = function (t) { - if (!this.isValid()) return NaN; - var e, i, n = this._milliseconds; - if ("month" === (t = L(t)) || "year" === t) return e = this._days + n / 864e5, i = this._months + bi(e), "month" === t ? i : i / 12; - switch (e = this._days + Math.round(xi(this._months)), t) { - case"week": - return e / 7 + n / 6048e5; - case"day": - return e + n / 864e5; - case"hour": - return 24 * e + n / 36e5; - case"minute": - return 1440 * e + n / 6e4; - case"second": - return 86400 * e + n / 1e3; - case"millisecond": - return Math.floor(864e5 * e) + n; - default: - throw new Error("Unknown unit " + t) - } - }, Ei.asMilliseconds = ki, Ei.asSeconds = wi, Ei.asMinutes = Mi, Ei.asHours = Si, Ei.asDays = Di, Ei.asWeeks = Ci, Ei.asMonths = Pi, Ei.asYears = Ti, Ei.valueOf = function () { - return this.isValid() ? this._milliseconds + 864e5 * this._days + this._months % 12 * 2592e6 + 31536e6 * w(this._months / 12) : NaN - }, Ei._bubble = function () { - var t, e, i, n, a, r = this._milliseconds, o = this._days, s = this._months, l = this._data; - return r >= 0 && o >= 0 && s >= 0 || r <= 0 && o <= 0 && s <= 0 || (r += 864e5 * yi(xi(s) + o), o = 0, s = 0), l.milliseconds = r % 1e3, t = k(r / 1e3), l.seconds = t % 60, e = k(t / 60), l.minutes = e % 60, i = k(e / 60), l.hours = i % 24, s += a = k(bi(o += k(i / 24))), o -= yi(xi(a)), n = k(s / 12), s %= 12, l.days = o, l.months = s, l.years = n, this - }, Ei.clone = function () { - return Ue(this) - }, Ei.get = function (t) { - return t = L(t), this.isValid() ? this[t + "s"]() : NaN - }, Ei.milliseconds = Ii, Ei.seconds = Ai, Ei.minutes = Fi, Ei.hours = Ri, Ei.days = Li, Ei.weeks = function () { - return k(this.days() / 7) - }, Ei.months = Wi, Ei.years = Yi, Ei.humanize = function (t) { - if (!this.isValid()) return this.localeData().invalidDate(); - var e, i, n, a, r, o, s, l, u, d, h, c = this.localeData(), - f = (i = !t, n = c, a = Ue(e = this).abs(), r = Ni(a.as("s")), o = Ni(a.as("m")), s = Ni(a.as("h")), l = Ni(a.as("d")), u = Ni(a.as("M")), d = Ni(a.as("y")), (h = r <= zi.ss && ["s", r] || r < zi.s && ["ss", r] || o <= 1 && ["m"] || o < zi.m && ["mm", o] || s <= 1 && ["h"] || s < zi.h && ["hh", s] || l <= 1 && ["d"] || l < zi.d && ["dd", l] || u <= 1 && ["M"] || u < zi.M && ["MM", u] || d <= 1 && ["y"] || ["yy", d])[2] = i, h[3] = +e > 0, h[4] = n, function (t, e, i, n, a) { - return a.relativeTime(e || 1, !!i, t, n) - }.apply(null, h)); - return t && (f = c.pastFuture(+this, f)), c.postformat(f) - }, Ei.toISOString = Bi, Ei.toString = Bi, Ei.toJSON = Bi, Ei.locale = Qe, Ei.localeData = ei, Ei.toIsoString = D("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)", Bi), Ei.lang = ti, j("X", 0, 0, "unix"), j("x", 0, 0, "valueOf"), dt("x", rt), dt("X", /[+-]?\d+(\.\d{1,3})?/), gt("X", function (t, e, i) { - i._d = new Date(1e3 * parseFloat(t, 10)) - }), gt("x", function (t, e, i) { - i._d = new Date(w(t)) - }), a.version = "2.20.1", i = Te, a.fn = di, a.min = function () { - return Ae("isBefore", [].slice.call(arguments, 0)) - }, a.max = function () { - return Ae("isAfter", [].slice.call(arguments, 0)) - }, a.now = function () { - return Date.now ? Date.now() : +new Date - }, a.utc = f, a.unix = function (t) { - return Te(1e3 * t) - }, a.months = function (t, e) { - return gi(t, e, "months") - }, a.isDate = u, a.locale = ue, a.invalid = p, a.duration = Ue, a.isMoment = _, a.weekdays = function (t, e, i) { - return mi(t, e, i, "weekdays") - }, a.parseZone = function () { - return Te.apply(null, arguments).parseZone() - }, a.localeData = he, a.isDuration = Le, a.monthsShort = function (t, e) { - return gi(t, e, "monthsShort") - }, a.weekdaysMin = function (t, e, i) { - return mi(t, e, i, "weekdaysMin") - }, a.defineLocale = de, a.updateLocale = function (t, e) { - if (null != e) { - var i, n, a = ae; - null != (n = le(t)) && (a = n._config), (i = new A(e = I(a, e))).parentLocale = re[t], re[t] = i, ue(t) - } else null != re[t] && (null != re[t].parentLocale ? re[t] = re[t].parentLocale : null != re[t] && delete re[t]); - return re[t] - }, a.locales = function () { - return C(re) - }, a.weekdaysShort = function (t, e, i) { - return mi(t, e, i, "weekdaysShort") - }, a.normalizeUnits = L, a.relativeTimeRounding = function (t) { - return void 0 === t ? Ni : "function" == typeof t && (Ni = t, !0) - }, a.relativeTimeThreshold = function (t, e) { - return void 0 !== zi[t] && (void 0 === e ? zi[t] : (zi[t] = e, "s" === t && (zi.ss = e - 1), !0)) - }, a.calendarFormat = function (t, e) { - var i = t.diff(e, "days", !0); - return i < -6 ? "sameElse" : i < -1 ? "lastWeek" : i < 0 ? "lastDay" : i < 1 ? "sameDay" : i < 2 ? "nextDay" : i < 7 ? "nextWeek" : "sameElse" - }, a.prototype = di, a.HTML5_FMT = { - DATETIME_LOCAL: "YYYY-MM-DDTHH:mm", - DATETIME_LOCAL_SECONDS: "YYYY-MM-DDTHH:mm:ss", - DATETIME_LOCAL_MS: "YYYY-MM-DDTHH:mm:ss.SSS", - DATE: "YYYY-MM-DD", - TIME: "HH:mm", - TIME_SECONDS: "HH:mm:ss", - TIME_MS: "HH:mm:ss.SSS", - WEEK: "YYYY-[W]WW", - MONTH: "YYYY-MM" - }, a - }, "object" == typeof i && void 0 !== e ? e.exports = a() : n.moment = a() - }, {}], 7: [function (t, e, i) { - var n = t(29)(); - n.helpers = t(45), t(27)(n), n.defaults = t(25), n.Element = t(26), n.elements = t(40), n.Interaction = t(28), n.layouts = t(30), n.platform = t(48), n.plugins = t(31), n.Ticks = t(34), t(22)(n), t(23)(n), t(24)(n), t(33)(n), t(32)(n), t(35)(n), t(55)(n), t(53)(n), t(54)(n), t(56)(n), t(57)(n), t(58)(n), t(15)(n), t(16)(n), t(17)(n), t(18)(n), t(19)(n), t(20)(n), t(21)(n), t(8)(n), t(9)(n), t(10)(n), t(11)(n), t(12)(n), t(13)(n), t(14)(n); - var a = t(49); - for (var r in a) a.hasOwnProperty(r) && n.plugins.register(a[r]); - n.platform.initialize(), e.exports = n, "undefined" != typeof window && (window.Chart = n), n.Legend = a.legend._element, n.Title = a.title._element, n.pluginService = n.plugins, n.PluginBase = n.Element.extend({}), n.canvasHelpers = n.helpers.canvas, n.layoutService = n.layouts - }, { - 10: 10, - 11: 11, - 12: 12, - 13: 13, - 14: 14, - 15: 15, - 16: 16, - 17: 17, - 18: 18, - 19: 19, - 20: 20, - 21: 21, - 22: 22, - 23: 23, - 24: 24, - 25: 25, - 26: 26, - 27: 27, - 28: 28, - 29: 29, - 30: 30, - 31: 31, - 32: 32, - 33: 33, - 34: 34, - 35: 35, - 40: 40, - 45: 45, - 48: 48, - 49: 49, - 53: 53, - 54: 54, - 55: 55, - 56: 56, - 57: 57, - 58: 58, - 8: 8, - 9: 9 - }], 8: [function (t, e, i) { - "use strict"; - e.exports = function (t) { - t.Bar = function (e, i) { - return i.type = "bar", new t(e, i) - } + core_plugins.notify(me, 'afterDatasetDraw', [args]); + }, + + /** + * Draws tooltip unless a plugin returns `false` to the `beforeTooltipDraw` + * hook, in which case, plugins will not be called on `afterTooltipDraw`. + * @private + */ + _drawTooltip: function (easingValue) { + var me = this; + var tooltip = me.tooltip; + var args = { + tooltip: tooltip, + easingValue: easingValue + }; + + if (core_plugins.notify(me, 'beforeTooltipDraw', [args]) === false) { + return; + } + + tooltip.draw(); + + core_plugins.notify(me, 'afterTooltipDraw', [args]); + }, + + /** + * Get the single element that was clicked on + * @return An object containing the dataset index and element index of the matching element. Also contains the rectangle that was draw + */ + getElementAtEvent: function (e) { + return core_interaction.modes.single(this, e); + }, + + getElementsAtEvent: function (e) { + return core_interaction.modes.label(this, e, {intersect: true}); + }, + + getElementsAtXAxis: function (e) { + return core_interaction.modes['x-axis'](this, e, {intersect: true}); + }, + + getElementsAtEventForMode: function (e, mode, options) { + var method = core_interaction.modes[mode]; + if (typeof method === 'function') { + return method(this, e, options); + } + + return []; + }, + + getDatasetAtEvent: function (e) { + return core_interaction.modes.dataset(this, e, {intersect: true}); + }, + + getDatasetMeta: function (datasetIndex) { + var me = this; + var dataset = me.data.datasets[datasetIndex]; + if (!dataset._meta) { + dataset._meta = {}; + } + + var meta = dataset._meta[me.id]; + if (!meta) { + meta = dataset._meta[me.id] = { + type: null, + data: [], + dataset: null, + controller: null, + hidden: null, // See isDatasetVisible() comment + xAxisID: null, + yAxisID: null + }; + } + + return meta; + }, + + getVisibleDatasetCount: function () { + var count = 0; + for (var i = 0, ilen = this.data.datasets.length; i < ilen; ++i) { + if (this.isDatasetVisible(i)) { + count++; + } + } + return count; + }, + + isDatasetVisible: function (datasetIndex) { + var meta = this.getDatasetMeta(datasetIndex); + + // meta.hidden is a per chart dataset hidden flag override with 3 states: if true or false, + // the dataset.hidden value is ignored, else if null, the dataset hidden state is returned. + return typeof meta.hidden === 'boolean' ? !meta.hidden : !this.data.datasets[datasetIndex].hidden; + }, + + generateLegend: function () { + return this.options.legendCallback(this); + }, + + /** + * @private + */ + destroyDatasetMeta: function (datasetIndex) { + var id = this.id; + var dataset = this.data.datasets[datasetIndex]; + var meta = dataset._meta && dataset._meta[id]; + + if (meta) { + meta.controller.destroy(); + delete dataset._meta[id]; + } + }, + + destroy: function () { + var me = this; + var canvas = me.canvas; + var i, ilen; + + me.stop(); + + // dataset controllers need to cleanup associated data + for (i = 0, ilen = me.data.datasets.length; i < ilen; ++i) { + me.destroyDatasetMeta(i); + } + + if (canvas) { + me.unbindEvents(); + helpers$1.canvas.clear(me); + platform.releaseContext(me.ctx); + me.canvas = null; + me.ctx = null; + } + + core_plugins.notify(me, 'destroy'); + + delete Chart.instances[me.id]; + }, + + toBase64Image: function () { + return this.canvas.toDataURL.apply(this.canvas, arguments); + }, + + initToolTip: function () { + var me = this; + me.tooltip = new core_tooltip({ + _chart: me, + _chartInstance: me, // deprecated, backward compatibility + _data: me.data, + _options: me.options.tooltips + }, me); + }, + + /** + * @private + */ + bindEvents: function () { + var me = this; + var listeners = me._listeners = {}; + var listener = function () { + me.eventHandler.apply(me, arguments); + }; + + helpers$1.each(me.options.events, function (type) { + platform.addEventListener(me, type, listener); + listeners[type] = listener; + }); + + // Elements used to detect size change should not be injected for non responsive charts. + // See https://github.com/chartjs/Chart.js/issues/2210 + if (me.options.responsive) { + listener = function () { + me.resize(); + }; + + platform.addEventListener(me, 'resize', listener); + listeners.resize = listener; + } + }, + + /** + * @private + */ + unbindEvents: function () { + var me = this; + var listeners = me._listeners; + if (!listeners) { + return; + } + + delete me._listeners; + helpers$1.each(listeners, function (listener, type) { + platform.removeEventListener(me, type, listener); + }); + }, + + updateHoverStyle: function (elements, mode, enabled) { + var method = enabled ? 'setHoverStyle' : 'removeHoverStyle'; + var element, i, ilen; + + for (i = 0, ilen = elements.length; i < ilen; ++i) { + element = elements[i]; + if (element) { + this.getDatasetMeta(element._datasetIndex).controller[method](element); + } + } + }, + + /** + * @private + */ + eventHandler: function (e) { + var me = this; + var tooltip = me.tooltip; + + if (core_plugins.notify(me, 'beforeEvent', [e]) === false) { + return; + } + + // Buffer any update calls so that renders do not occur + me._bufferedRender = true; + me._bufferedRequest = null; + + var changed = me.handleEvent(e); + // for smooth tooltip animations issue #4989 + // the tooltip should be the source of change + // Animation check workaround: + // tooltip._start will be null when tooltip isn't animating + if (tooltip) { + changed = tooltip._start + ? tooltip.handleEvent(e) + : changed | tooltip.handleEvent(e); + } + + core_plugins.notify(me, 'afterEvent', [e]); + + var bufferedRequest = me._bufferedRequest; + if (bufferedRequest) { + // If we have an update that was triggered, we need to do a normal render + me.render(bufferedRequest); + } else if (changed && !me.animating) { + // If entering, leaving, or changing elements, animate the change via pivot + me.stop(); + + // We only need to render at this point. Updating will cause scales to be + // recomputed generating flicker & using more memory than necessary. + me.render({ + duration: me.options.hover.animationDuration, + lazy: true + }); + } + + me._bufferedRender = false; + me._bufferedRequest = null; + + return me; + }, + + /** + * Handle an event + * @private + * @param {IEvent} event the event to handle + * @return {boolean} true if the chart needs to re-render + */ + handleEvent: function (e) { + var me = this; + var options = me.options || {}; + var hoverOptions = options.hover; + var changed = false; + + me.lastActive = me.lastActive || []; + + // Find Active Elements for hover and tooltips + if (e.type === 'mouseout') { + me.active = []; + } else { + me.active = me.getElementsAtEventForMode(e, hoverOptions.mode, hoverOptions); + } + + // Invoke onHover hook + // Need to call with native event here to not break backwards compatibility + helpers$1.callback(options.onHover || options.hover.onHover, [e.native, me.active], me); + + if (e.type === 'mouseup' || e.type === 'click') { + if (options.onClick) { + // Use e.native here for backwards compatibility + options.onClick.call(me, e.native, me.active); + } + } + + // Remove styling for last active (even if it may still be active) + if (me.lastActive.length) { + me.updateHoverStyle(me.lastActive, hoverOptions.mode, false); + } + + // Built in hover styling + if (me.active.length && hoverOptions.mode) { + me.updateHoverStyle(me.active, hoverOptions.mode, true); + } + + changed = !helpers$1.arrayEquals(me.active, me.lastActive); + + // Remember Last Actives + me.lastActive = me.active; + + return changed; + } + }); + + /** + * NOTE(SB) We actually don't use this container anymore but we need to keep it + * for backward compatibility. Though, it can still be useful for plugins that + * would need to work on multiple charts?! + */ + Chart.instances = {}; + + var core_controller = Chart; + +// DEPRECATIONS + + /** + * Provided for backward compatibility, use Chart instead. + * @class Chart.Controller + * @deprecated since version 2.6 + * @todo remove at version 3 + * @private + */ + Chart.Controller = Chart; + + /** + * Provided for backward compatibility, not available anymore. + * @namespace Chart + * @deprecated since version 2.8 + * @todo remove at version 3 + * @private + */ + Chart.types = {}; + + /** + * Provided for backward compatibility, not available anymore. + * @namespace Chart.helpers.configMerge + * @deprecated since version 2.8.0 + * @todo remove at version 3 + * @private + */ + helpers$1.configMerge = mergeConfig; + + /** + * Provided for backward compatibility, not available anymore. + * @namespace Chart.helpers.scaleMerge + * @deprecated since version 2.8.0 + * @todo remove at version 3 + * @private + */ + helpers$1.scaleMerge = mergeScaleConfig; + + var core_helpers = function () { + + // -- Basic js utility methods + + helpers$1.where = function (collection, filterCallback) { + if (helpers$1.isArray(collection) && Array.prototype.filter) { + return collection.filter(filterCallback); + } + var filtered = []; + + helpers$1.each(collection, function (item) { + if (filterCallback(item)) { + filtered.push(item); + } + }); + + return filtered; + }; + helpers$1.findIndex = Array.prototype.findIndex ? + function (array, callback, scope) { + return array.findIndex(callback, scope); + } : + function (array, callback, scope) { + scope = scope === undefined ? array : scope; + for (var i = 0, ilen = array.length; i < ilen; ++i) { + if (callback.call(scope, array[i], i, array)) { + return i; + } + } + return -1; + }; + helpers$1.findNextWhere = function (arrayToSearch, filterCallback, startIndex) { + // Default to start of the array + if (helpers$1.isNullOrUndef(startIndex)) { + startIndex = -1; + } + for (var i = startIndex + 1; i < arrayToSearch.length; i++) { + var currentItem = arrayToSearch[i]; + if (filterCallback(currentItem)) { + return currentItem; + } + } + }; + helpers$1.findPreviousWhere = function (arrayToSearch, filterCallback, startIndex) { + // Default to end of the array + if (helpers$1.isNullOrUndef(startIndex)) { + startIndex = arrayToSearch.length; + } + for (var i = startIndex - 1; i >= 0; i--) { + var currentItem = arrayToSearch[i]; + if (filterCallback(currentItem)) { + return currentItem; + } + } + }; + + // -- Math methods + helpers$1.isNumber = function (n) { + return !isNaN(parseFloat(n)) && isFinite(n); + }; + helpers$1.almostEquals = function (x, y, epsilon) { + return Math.abs(x - y) < epsilon; + }; + helpers$1.almostWhole = function (x, epsilon) { + var rounded = Math.round(x); + return (((rounded - epsilon) < x) && ((rounded + epsilon) > x)); + }; + helpers$1.max = function (array) { + return array.reduce(function (max, value) { + if (!isNaN(value)) { + return Math.max(max, value); + } + return max; + }, Number.NEGATIVE_INFINITY); + }; + helpers$1.min = function (array) { + return array.reduce(function (min, value) { + if (!isNaN(value)) { + return Math.min(min, value); + } + return min; + }, Number.POSITIVE_INFINITY); + }; + helpers$1.sign = Math.sign ? + function (x) { + return Math.sign(x); + } : + function (x) { + x = +x; // convert to a number + if (x === 0 || isNaN(x)) { + return x; + } + return x > 0 ? 1 : -1; + }; + helpers$1.log10 = Math.log10 ? + function (x) { + return Math.log10(x); + } : + function (x) { + var exponent = Math.log(x) * Math.LOG10E; // Math.LOG10E = 1 / Math.LN10. + // Check for whole powers of 10, + // which due to floating point rounding error should be corrected. + var powerOf10 = Math.round(exponent); + var isPowerOf10 = x === Math.pow(10, powerOf10); + + return isPowerOf10 ? powerOf10 : exponent; + }; + helpers$1.toRadians = function (degrees) { + return degrees * (Math.PI / 180); + }; + helpers$1.toDegrees = function (radians) { + return radians * (180 / Math.PI); + }; + + /** + * Returns the number of decimal places + * i.e. the number of digits after the decimal point, of the value of this Number. + * @param {number} x - A number. + * @returns {number} The number of decimal places. + * @private + */ + helpers$1._decimalPlaces = function (x) { + if (!helpers$1.isFinite(x)) { + return; + } + var e = 1; + var p = 0; + while (Math.round(x * e) / e !== x) { + e *= 10; + p++; + } + return p; + }; + + // Gets the angle from vertical upright to the point about a centre. + helpers$1.getAngleFromPoint = function (centrePoint, anglePoint) { + var distanceFromXCenter = anglePoint.x - centrePoint.x; + var distanceFromYCenter = anglePoint.y - centrePoint.y; + var radialDistanceFromCenter = Math.sqrt(distanceFromXCenter * distanceFromXCenter + distanceFromYCenter * distanceFromYCenter); + + var angle = Math.atan2(distanceFromYCenter, distanceFromXCenter); + + if (angle < (-0.5 * Math.PI)) { + angle += 2.0 * Math.PI; // make sure the returned angle is in the range of (-PI/2, 3PI/2] + } + + return { + angle: angle, + distance: radialDistanceFromCenter + }; + }; + helpers$1.distanceBetweenPoints = function (pt1, pt2) { + return Math.sqrt(Math.pow(pt2.x - pt1.x, 2) + Math.pow(pt2.y - pt1.y, 2)); + }; + + /** + * Provided for backward compatibility, not available anymore + * @function Chart.helpers.aliasPixel + * @deprecated since version 2.8.0 + * @todo remove at version 3 + */ + helpers$1.aliasPixel = function (pixelWidth) { + return (pixelWidth % 2 === 0) ? 0 : 0.5; + }; + + /** + * Returns the aligned pixel value to avoid anti-aliasing blur + * @param {Chart} chart - The chart instance. + * @param {number} pixel - A pixel value. + * @param {number} width - The width of the element. + * @returns {number} The aligned pixel value. + * @private + */ + helpers$1._alignPixel = function (chart, pixel, width) { + var devicePixelRatio = chart.currentDevicePixelRatio; + var halfWidth = width / 2; + return Math.round((pixel - halfWidth) * devicePixelRatio) / devicePixelRatio + halfWidth; + }; + + helpers$1.splineCurve = function (firstPoint, middlePoint, afterPoint, t) { + // Props to Rob Spencer at scaled innovation for his post on splining between points + // http://scaledinnovation.com/analytics/splines/aboutSplines.html + + // This function must also respect "skipped" points + + var previous = firstPoint.skip ? middlePoint : firstPoint; + var current = middlePoint; + var next = afterPoint.skip ? middlePoint : afterPoint; + + var d01 = Math.sqrt(Math.pow(current.x - previous.x, 2) + Math.pow(current.y - previous.y, 2)); + var d12 = Math.sqrt(Math.pow(next.x - current.x, 2) + Math.pow(next.y - current.y, 2)); + + var s01 = d01 / (d01 + d12); + var s12 = d12 / (d01 + d12); + + // If all points are the same, s01 & s02 will be inf + s01 = isNaN(s01) ? 0 : s01; + s12 = isNaN(s12) ? 0 : s12; + + var fa = t * s01; // scaling factor for triangle Ta + var fb = t * s12; + + return { + previous: { + x: current.x - fa * (next.x - previous.x), + y: current.y - fa * (next.y - previous.y) + }, + next: { + x: current.x + fb * (next.x - previous.x), + y: current.y + fb * (next.y - previous.y) + } + }; + }; + helpers$1.EPSILON = Number.EPSILON || 1e-14; + helpers$1.splineCurveMonotone = function (points) { + // This function calculates Bézier control points in a similar way than |splineCurve|, + // but preserves monotonicity of the provided data and ensures no local extremums are added + // between the dataset discrete points due to the interpolation. + // See : https://en.wikipedia.org/wiki/Monotone_cubic_interpolation + + var pointsWithTangents = (points || []).map(function (point) { + return { + model: point._model, + deltaK: 0, + mK: 0 + }; + }); + + // Calculate slopes (deltaK) and initialize tangents (mK) + var pointsLen = pointsWithTangents.length; + var i, pointBefore, pointCurrent, pointAfter; + for (i = 0; i < pointsLen; ++i) { + pointCurrent = pointsWithTangents[i]; + if (pointCurrent.model.skip) { + continue; + } + + pointBefore = i > 0 ? pointsWithTangents[i - 1] : null; + pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null; + if (pointAfter && !pointAfter.model.skip) { + var slopeDeltaX = (pointAfter.model.x - pointCurrent.model.x); + + // In the case of two points that appear at the same x pixel, slopeDeltaX is 0 + pointCurrent.deltaK = slopeDeltaX !== 0 ? (pointAfter.model.y - pointCurrent.model.y) / slopeDeltaX : 0; + } + + if (!pointBefore || pointBefore.model.skip) { + pointCurrent.mK = pointCurrent.deltaK; + } else if (!pointAfter || pointAfter.model.skip) { + pointCurrent.mK = pointBefore.deltaK; + } else if (this.sign(pointBefore.deltaK) !== this.sign(pointCurrent.deltaK)) { + pointCurrent.mK = 0; + } else { + pointCurrent.mK = (pointBefore.deltaK + pointCurrent.deltaK) / 2; + } + } + + // Adjust tangents to ensure monotonic properties + var alphaK, betaK, tauK, squaredMagnitude; + for (i = 0; i < pointsLen - 1; ++i) { + pointCurrent = pointsWithTangents[i]; + pointAfter = pointsWithTangents[i + 1]; + if (pointCurrent.model.skip || pointAfter.model.skip) { + continue; + } + + if (helpers$1.almostEquals(pointCurrent.deltaK, 0, this.EPSILON)) { + pointCurrent.mK = pointAfter.mK = 0; + continue; + } + + alphaK = pointCurrent.mK / pointCurrent.deltaK; + betaK = pointAfter.mK / pointCurrent.deltaK; + squaredMagnitude = Math.pow(alphaK, 2) + Math.pow(betaK, 2); + if (squaredMagnitude <= 9) { + continue; + } + + tauK = 3 / Math.sqrt(squaredMagnitude); + pointCurrent.mK = alphaK * tauK * pointCurrent.deltaK; + pointAfter.mK = betaK * tauK * pointCurrent.deltaK; + } + + // Compute control points + var deltaX; + for (i = 0; i < pointsLen; ++i) { + pointCurrent = pointsWithTangents[i]; + if (pointCurrent.model.skip) { + continue; + } + + pointBefore = i > 0 ? pointsWithTangents[i - 1] : null; + pointAfter = i < pointsLen - 1 ? pointsWithTangents[i + 1] : null; + if (pointBefore && !pointBefore.model.skip) { + deltaX = (pointCurrent.model.x - pointBefore.model.x) / 3; + pointCurrent.model.controlPointPreviousX = pointCurrent.model.x - deltaX; + pointCurrent.model.controlPointPreviousY = pointCurrent.model.y - deltaX * pointCurrent.mK; + } + if (pointAfter && !pointAfter.model.skip) { + deltaX = (pointAfter.model.x - pointCurrent.model.x) / 3; + pointCurrent.model.controlPointNextX = pointCurrent.model.x + deltaX; + pointCurrent.model.controlPointNextY = pointCurrent.model.y + deltaX * pointCurrent.mK; + } + } + }; + helpers$1.nextItem = function (collection, index, loop) { + if (loop) { + return index >= collection.length - 1 ? collection[0] : collection[index + 1]; + } + return index >= collection.length - 1 ? collection[collection.length - 1] : collection[index + 1]; + }; + helpers$1.previousItem = function (collection, index, loop) { + if (loop) { + return index <= 0 ? collection[collection.length - 1] : collection[index - 1]; + } + return index <= 0 ? collection[0] : collection[index - 1]; + }; + // Implementation of the nice number algorithm used in determining where axis labels will go + helpers$1.niceNum = function (range, round) { + var exponent = Math.floor(helpers$1.log10(range)); + var fraction = range / Math.pow(10, exponent); + var niceFraction; + + if (round) { + if (fraction < 1.5) { + niceFraction = 1; + } else if (fraction < 3) { + niceFraction = 2; + } else if (fraction < 7) { + niceFraction = 5; + } else { + niceFraction = 10; + } + } else if (fraction <= 1.0) { + niceFraction = 1; + } else if (fraction <= 2) { + niceFraction = 2; + } else if (fraction <= 5) { + niceFraction = 5; + } else { + niceFraction = 10; + } + + return niceFraction * Math.pow(10, exponent); + }; + // Request animation polyfill - https://www.paulirish.com/2011/requestanimationframe-for-smart-animating/ + helpers$1.requestAnimFrame = (function () { + if (typeof window === 'undefined') { + return function (callback) { + callback(); + }; + } + return window.requestAnimationFrame || + window.webkitRequestAnimationFrame || + window.mozRequestAnimationFrame || + window.oRequestAnimationFrame || + window.msRequestAnimationFrame || + function (callback) { + return window.setTimeout(callback, 1000 / 60); + }; + }()); + // -- DOM methods + helpers$1.getRelativePosition = function (evt, chart) { + var mouseX, mouseY; + var e = evt.originalEvent || evt; + var canvas = evt.target || evt.srcElement; + var boundingRect = canvas.getBoundingClientRect(); + + var touches = e.touches; + if (touches && touches.length > 0) { + mouseX = touches[0].clientX; + mouseY = touches[0].clientY; + + } else { + mouseX = e.clientX; + mouseY = e.clientY; + } + + // Scale mouse coordinates into canvas coordinates + // by following the pattern laid out by 'jerryj' in the comments of + // https://www.html5canvastutorials.com/advanced/html5-canvas-mouse-coordinates/ + var paddingLeft = parseFloat(helpers$1.getStyle(canvas, 'padding-left')); + var paddingTop = parseFloat(helpers$1.getStyle(canvas, 'padding-top')); + var paddingRight = parseFloat(helpers$1.getStyle(canvas, 'padding-right')); + var paddingBottom = parseFloat(helpers$1.getStyle(canvas, 'padding-bottom')); + var width = boundingRect.right - boundingRect.left - paddingLeft - paddingRight; + var height = boundingRect.bottom - boundingRect.top - paddingTop - paddingBottom; + + // We divide by the current device pixel ratio, because the canvas is scaled up by that amount in each direction. However + // the backend model is in unscaled coordinates. Since we are going to deal with our model coordinates, we go back here + mouseX = Math.round((mouseX - boundingRect.left - paddingLeft) / (width) * canvas.width / chart.currentDevicePixelRatio); + mouseY = Math.round((mouseY - boundingRect.top - paddingTop) / (height) * canvas.height / chart.currentDevicePixelRatio); + + return { + x: mouseX, + y: mouseY + }; + + }; + + // Private helper function to convert max-width/max-height values that may be percentages into a number + function parseMaxStyle(styleValue, node, parentProperty) { + var valueInPixels; + if (typeof styleValue === 'string') { + valueInPixels = parseInt(styleValue, 10); + + if (styleValue.indexOf('%') !== -1) { + // percentage * size in dimension + valueInPixels = valueInPixels / 100 * node.parentNode[parentProperty]; + } + } else { + valueInPixels = styleValue; + } + + return valueInPixels; + } + + /** + * Returns if the given value contains an effective constraint. + * @private + */ + function isConstrainedValue(value) { + return value !== undefined && value !== null && value !== 'none'; + } + + /** + * Returns the max width or height of the given DOM node in a cross-browser compatible fashion + * @param {HTMLElement} domNode - the node to check the constraint on + * @param {string} maxStyle - the style that defines the maximum for the direction we are using ('max-width' / 'max-height') + * @param {string} percentageProperty - property of parent to use when calculating width as a percentage + * @see {@link https://www.nathanaeljones.com/blog/2013/reading-max-width-cross-browser} + */ + function getConstraintDimension(domNode, maxStyle, percentageProperty) { + var view = document.defaultView; + var parentNode = helpers$1._getParentNode(domNode); + var constrainedNode = view.getComputedStyle(domNode)[maxStyle]; + var constrainedContainer = view.getComputedStyle(parentNode)[maxStyle]; + var hasCNode = isConstrainedValue(constrainedNode); + var hasCContainer = isConstrainedValue(constrainedContainer); + var infinity = Number.POSITIVE_INFINITY; + + if (hasCNode || hasCContainer) { + return Math.min( + hasCNode ? parseMaxStyle(constrainedNode, domNode, percentageProperty) : infinity, + hasCContainer ? parseMaxStyle(constrainedContainer, parentNode, percentageProperty) : infinity); + } + + return 'none'; + } + + // returns Number or undefined if no constraint + helpers$1.getConstraintWidth = function (domNode) { + return getConstraintDimension(domNode, 'max-width', 'clientWidth'); + }; + // returns Number or undefined if no constraint + helpers$1.getConstraintHeight = function (domNode) { + return getConstraintDimension(domNode, 'max-height', 'clientHeight'); + }; + /** + * @private + */ + helpers$1._calculatePadding = function (container, padding, parentDimension) { + padding = helpers$1.getStyle(container, padding); + + return padding.indexOf('%') > -1 ? parentDimension * parseInt(padding, 10) / 100 : parseInt(padding, 10); + }; + /** + * @private + */ + helpers$1._getParentNode = function (domNode) { + var parent = domNode.parentNode; + if (parent && parent.toString() === '[object ShadowRoot]') { + parent = parent.host; + } + return parent; + }; + helpers$1.getMaximumWidth = function (domNode) { + var container = helpers$1._getParentNode(domNode); + if (!container) { + return domNode.clientWidth; + } + + var clientWidth = container.clientWidth; + var paddingLeft = helpers$1._calculatePadding(container, 'padding-left', clientWidth); + var paddingRight = helpers$1._calculatePadding(container, 'padding-right', clientWidth); + + var w = clientWidth - paddingLeft - paddingRight; + var cw = helpers$1.getConstraintWidth(domNode); + return isNaN(cw) ? w : Math.min(w, cw); + }; + helpers$1.getMaximumHeight = function (domNode) { + var container = helpers$1._getParentNode(domNode); + if (!container) { + return domNode.clientHeight; + } + + var clientHeight = container.clientHeight; + var paddingTop = helpers$1._calculatePadding(container, 'padding-top', clientHeight); + var paddingBottom = helpers$1._calculatePadding(container, 'padding-bottom', clientHeight); + + var h = clientHeight - paddingTop - paddingBottom; + var ch = helpers$1.getConstraintHeight(domNode); + return isNaN(ch) ? h : Math.min(h, ch); + }; + helpers$1.getStyle = function (el, property) { + return el.currentStyle ? + el.currentStyle[property] : + document.defaultView.getComputedStyle(el, null).getPropertyValue(property); + }; + helpers$1.retinaScale = function (chart, forceRatio) { + var pixelRatio = chart.currentDevicePixelRatio = forceRatio || (typeof window !== 'undefined' && window.devicePixelRatio) || 1; + if (pixelRatio === 1) { + return; + } + + var canvas = chart.canvas; + var height = chart.height; + var width = chart.width; + + canvas.height = height * pixelRatio; + canvas.width = width * pixelRatio; + chart.ctx.scale(pixelRatio, pixelRatio); + + // If no style has been set on the canvas, the render size is used as display size, + // making the chart visually bigger, so let's enforce it to the "correct" values. + // See https://github.com/chartjs/Chart.js/issues/3575 + if (!canvas.style.height && !canvas.style.width) { + canvas.style.height = height + 'px'; + canvas.style.width = width + 'px'; + } + }; + // -- Canvas methods + helpers$1.fontString = function (pixelSize, fontStyle, fontFamily) { + return fontStyle + ' ' + pixelSize + 'px ' + fontFamily; + }; + helpers$1.longestText = function (ctx, font, arrayOfThings, cache) { + cache = cache || {}; + var data = cache.data = cache.data || {}; + var gc = cache.garbageCollect = cache.garbageCollect || []; + + if (cache.font !== font) { + data = cache.data = {}; + gc = cache.garbageCollect = []; + cache.font = font; + } + + ctx.font = font; + var longest = 0; + helpers$1.each(arrayOfThings, function (thing) { + // Undefined strings and arrays should not be measured + if (thing !== undefined && thing !== null && helpers$1.isArray(thing) !== true) { + longest = helpers$1.measureText(ctx, data, gc, longest, thing); + } else if (helpers$1.isArray(thing)) { + // if it is an array lets measure each element + // to do maybe simplify this function a bit so we can do this more recursively? + helpers$1.each(thing, function (nestedThing) { + // Undefined strings and arrays should not be measured + if (nestedThing !== undefined && nestedThing !== null && !helpers$1.isArray(nestedThing)) { + longest = helpers$1.measureText(ctx, data, gc, longest, nestedThing); } - }, {}], 9: [function (t, e, i) { - "use strict"; - e.exports = function (t) { - t.Bubble = function (e, i) { - return i.type = "bubble", new t(e, i) - } + }); + } + }); + + var gcLen = gc.length / 2; + if (gcLen > arrayOfThings.length) { + for (var i = 0; i < gcLen; i++) { + delete data[gc[i]]; + } + gc.splice(0, gcLen); + } + return longest; + }; + helpers$1.measureText = function (ctx, data, gc, longest, string) { + var textWidth = data[string]; + if (!textWidth) { + textWidth = data[string] = ctx.measureText(string).width; + gc.push(string); + } + if (textWidth > longest) { + longest = textWidth; + } + return longest; + }; + helpers$1.numberOfLabelLines = function (arrayOfThings) { + var numberOfLines = 1; + helpers$1.each(arrayOfThings, function (thing) { + if (helpers$1.isArray(thing)) { + if (thing.length > numberOfLines) { + numberOfLines = thing.length; + } + } + }); + return numberOfLines; + }; + + helpers$1.color = !chartjsColor ? + function (value) { + console.error('Color.js not found!'); + return value; + } : + function (value) { + /* global CanvasGradient */ + if (value instanceof CanvasGradient) { + value = core_defaults.global.defaultColor; + } + + return chartjsColor(value); + }; + + helpers$1.getHoverColor = function (colorValue) { + /* global CanvasPattern */ + return (colorValue instanceof CanvasPattern || colorValue instanceof CanvasGradient) ? + colorValue : + helpers$1.color(colorValue).saturate(0.5).darken(0.1).rgbString(); + }; + }; + + function abstract() { + throw new Error( + 'This method is not implemented: either no adapter can ' + + 'be found or an incomplete integration was provided.' + ); + } + + /** + * Date adapter (current used by the time scale) + * @namespace Chart._adapters._date + * @memberof Chart._adapters + * @private + */ + + /** + * Currently supported unit string values. + * @typedef {('millisecond'|'second'|'minute'|'hour'|'day'|'week'|'month'|'quarter'|'year')} + * @memberof Chart._adapters._date + * @name Unit + */ + + /** + * @class + */ + function DateAdapter(options) { + this.options = options || {}; + } + + helpers$1.extend(DateAdapter.prototype, /** @lends DateAdapter */ { + /** + * Returns a map of time formats for the supported formatting units defined + * in Unit as well as 'datetime' representing a detailed date/time string. + * @returns {{string: string}} + */ + formats: abstract, + + /** + * Parses the given `value` and return the associated timestamp. + * @param {any} value - the value to parse (usually comes from the data) + * @param {string} [format] - the expected data format + * @returns {(number|null)} + * @function + */ + parse: abstract, + + /** + * Returns the formatted date in the specified `format` for a given `timestamp`. + * @param {number} timestamp - the timestamp to format + * @param {string} format - the date/time token + * @return {string} + * @function + */ + format: abstract, + + /** + * Adds the specified `amount` of `unit` to the given `timestamp`. + * @param {number} timestamp - the input timestamp + * @param {number} amount - the amount to add + * @param {Unit} unit - the unit as string + * @return {number} + * @function + */ + add: abstract, + + /** + * Returns the number of `unit` between the given timestamps. + * @param {number} max - the input timestamp (reference) + * @param {number} min - the timestamp to substract + * @param {Unit} unit - the unit as string + * @return {number} + * @function + */ + diff: abstract, + + /** + * Returns start of `unit` for the given `timestamp`. + * @param {number} timestamp - the input timestamp + * @param {Unit} unit - the unit as string + * @param {number} [weekday] - the ISO day of the week with 1 being Monday + * and 7 being Sunday (only needed if param *unit* is `isoWeek`). + * @function + */ + startOf: abstract, + + /** + * Returns end of `unit` for the given `timestamp`. + * @param {number} timestamp - the input timestamp + * @param {Unit} unit - the unit as string + * @function + */ + endOf: abstract, + + // DEPRECATIONS + + /** + * Provided for backward compatibility for scale.getValueForPixel(), + * this method should be overridden only by the moment adapter. + * @deprecated since version 2.8.0 + * @todo remove at version 3 + * @private + */ + _create: function (value) { + return value; + } + }); + + DateAdapter.override = function (members) { + helpers$1.extend(DateAdapter.prototype, members); + }; + + var _date = DateAdapter; + + var core_adapters = { + _date: _date + }; + + /** + * Namespace to hold static tick generation functions + * @namespace Chart.Ticks + */ + var core_ticks = { + /** + * Namespace to hold formatters for different types of ticks + * @namespace Chart.Ticks.formatters + */ + formatters: { + /** + * Formatter for value labels + * @method Chart.Ticks.formatters.values + * @param value the value to display + * @return {string|string[]} the label to display + */ + values: function (value) { + return helpers$1.isArray(value) ? value : '' + value; + }, + + /** + * Formatter for linear numeric ticks + * @method Chart.Ticks.formatters.linear + * @param tickValue {number} the value to be formatted + * @param index {number} the position of the tickValue parameter in the ticks array + * @param ticks {number[]} the list of ticks being converted + * @return {string} string representation of the tickValue parameter + */ + linear: function (tickValue, index, ticks) { + // If we have lots of ticks, don't use the ones + var delta = ticks.length > 3 ? ticks[2] - ticks[1] : ticks[1] - ticks[0]; + + // If we have a number like 2.5 as the delta, figure out how many decimal places we need + if (Math.abs(delta) > 1) { + if (tickValue !== Math.floor(tickValue)) { + // not an integer + delta = tickValue - Math.floor(tickValue); + } + } + + var logDelta = helpers$1.log10(Math.abs(delta)); + var tickString = ''; + + if (tickValue !== 0) { + var maxTick = Math.max(Math.abs(ticks[0]), Math.abs(ticks[ticks.length - 1])); + if (maxTick < 1e-4) { // all ticks are small numbers; use scientific notation + var logTick = helpers$1.log10(Math.abs(tickValue)); + tickString = tickValue.toExponential(Math.floor(logTick) - Math.floor(logDelta)); + } else { + var numDecimal = -1 * Math.floor(logDelta); + numDecimal = Math.max(Math.min(numDecimal, 20), 0); // toFixed has a max of 20 decimal places + tickString = tickValue.toFixed(numDecimal); + } + } else { + tickString = '0'; // never show decimal places for 0 + } + + return tickString; + }, + + logarithmic: function (tickValue, index, ticks) { + var remain = tickValue / (Math.pow(10, Math.floor(helpers$1.log10(tickValue)))); + + if (tickValue === 0) { + return '0'; + } else if (remain === 1 || remain === 2 || remain === 5 || index === 0 || index === ticks.length - 1) { + return tickValue.toExponential(); + } + return ''; + } + } + }; + + var valueOrDefault$9 = helpers$1.valueOrDefault; + var valueAtIndexOrDefault = helpers$1.valueAtIndexOrDefault; + + core_defaults._set('scale', { + display: true, + position: 'left', + offset: false, + + // grid line settings + gridLines: { + display: true, + color: 'rgba(0, 0, 0, 0.1)', + lineWidth: 1, + drawBorder: true, + drawOnChartArea: true, + drawTicks: true, + tickMarkLength: 10, + zeroLineWidth: 1, + zeroLineColor: 'rgba(0,0,0,0.25)', + zeroLineBorderDash: [], + zeroLineBorderDashOffset: 0.0, + offsetGridLines: false, + borderDash: [], + borderDashOffset: 0.0 + }, + + // scale label + scaleLabel: { + // display property + display: false, + + // actual label + labelString: '', + + // top/bottom padding + padding: { + top: 4, + bottom: 4 + } + }, + + // label settings + ticks: { + beginAtZero: false, + minRotation: 0, + maxRotation: 50, + mirror: false, + padding: 0, + reverse: false, + display: true, + autoSkip: true, + autoSkipPadding: 0, + labelOffset: 0, + // We pass through arrays to be rendered as multiline labels, we convert Others to strings here. + callback: core_ticks.formatters.values, + minor: {}, + major: {} + } + }); + + function labelsFromTicks(ticks) { + var labels = []; + var i, ilen; + + for (i = 0, ilen = ticks.length; i < ilen; ++i) { + labels.push(ticks[i].label); + } + + return labels; + } + + function getPixelForGridLine(scale, index, offsetGridLines) { + var lineValue = scale.getPixelForTick(index); + + if (offsetGridLines) { + if (scale.getTicks().length === 1) { + lineValue -= scale.isHorizontal() ? + Math.max(lineValue - scale.left, scale.right - lineValue) : + Math.max(lineValue - scale.top, scale.bottom - lineValue); + } else if (index === 0) { + lineValue -= (scale.getPixelForTick(1) - lineValue) / 2; + } else { + lineValue -= (lineValue - scale.getPixelForTick(index - 1)) / 2; + } + } + return lineValue; + } + + function computeTextSize(context, tick, font) { + return helpers$1.isArray(tick) ? + helpers$1.longestText(context, font, tick) : + context.measureText(tick).width; + } + + var core_scale = core_element.extend({ + /** + * Get the padding needed for the scale + * @method getPadding + * @private + * @returns {Padding} the necessary padding + */ + getPadding: function () { + var me = this; + return { + left: me.paddingLeft || 0, + top: me.paddingTop || 0, + right: me.paddingRight || 0, + bottom: me.paddingBottom || 0 + }; + }, + + /** + * Returns the scale tick objects ({label, major}) + * @since 2.7 + */ + getTicks: function () { + return this._ticks; + }, + + // These methods are ordered by lifecyle. Utilities then follow. + // Any function defined here is inherited by all scale types. + // Any function can be extended by the scale type + + mergeTicksOptions: function () { + var ticks = this.options.ticks; + if (ticks.minor === false) { + ticks.minor = { + display: false + }; + } + if (ticks.major === false) { + ticks.major = { + display: false + }; + } + for (var key in ticks) { + if (key !== 'major' && key !== 'minor') { + if (typeof ticks.minor[key] === 'undefined') { + ticks.minor[key] = ticks[key]; + } + if (typeof ticks.major[key] === 'undefined') { + ticks.major[key] = ticks[key]; + } + } + } + }, + beforeUpdate: function () { + helpers$1.callback(this.options.beforeUpdate, [this]); + }, + + update: function (maxWidth, maxHeight, margins) { + var me = this; + var i, ilen, labels, label, ticks, tick; + + // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) + me.beforeUpdate(); + + // Absorb the master measurements + me.maxWidth = maxWidth; + me.maxHeight = maxHeight; + me.margins = helpers$1.extend({ + left: 0, + right: 0, + top: 0, + bottom: 0 + }, margins); + + me._maxLabelLines = 0; + me.longestLabelWidth = 0; + me.longestTextCache = me.longestTextCache || {}; + + // Dimensions + me.beforeSetDimensions(); + me.setDimensions(); + me.afterSetDimensions(); + + // Data min/max + me.beforeDataLimits(); + me.determineDataLimits(); + me.afterDataLimits(); + + // Ticks - `this.ticks` is now DEPRECATED! + // Internal ticks are now stored as objects in the PRIVATE `this._ticks` member + // and must not be accessed directly from outside this class. `this.ticks` being + // around for long time and not marked as private, we can't change its structure + // without unexpected breaking changes. If you need to access the scale ticks, + // use scale.getTicks() instead. + + me.beforeBuildTicks(); + + // New implementations should return an array of objects but for BACKWARD COMPAT, + // we still support no return (`this.ticks` internally set by calling this method). + ticks = me.buildTicks() || []; + + // Allow modification of ticks in callback. + ticks = me.afterBuildTicks(ticks) || ticks; + + me.beforeTickToLabelConversion(); + + // New implementations should return the formatted tick labels but for BACKWARD + // COMPAT, we still support no return (`this.ticks` internally changed by calling + // this method and supposed to contain only string values). + labels = me.convertTicksToLabels(ticks) || me.ticks; + + me.afterTickToLabelConversion(); + + me.ticks = labels; // BACKWARD COMPATIBILITY + + // IMPORTANT: from this point, we consider that `this.ticks` will NEVER change! + + // BACKWARD COMPAT: synchronize `_ticks` with labels (so potentially `this.ticks`) + for (i = 0, ilen = labels.length; i < ilen; ++i) { + label = labels[i]; + tick = ticks[i]; + if (!tick) { + ticks.push(tick = { + label: label, + major: false + }); + } else { + tick.label = label; + } + } + + me._ticks = ticks; + + // Tick Rotation + me.beforeCalculateTickRotation(); + me.calculateTickRotation(); + me.afterCalculateTickRotation(); + // Fit + me.beforeFit(); + me.fit(); + me.afterFit(); + // + me.afterUpdate(); + + return me.minSize; + + }, + afterUpdate: function () { + helpers$1.callback(this.options.afterUpdate, [this]); + }, + + // + + beforeSetDimensions: function () { + helpers$1.callback(this.options.beforeSetDimensions, [this]); + }, + setDimensions: function () { + var me = this; + // Set the unconstrained dimension before label rotation + if (me.isHorizontal()) { + // Reset position before calculating rotation + me.width = me.maxWidth; + me.left = 0; + me.right = me.width; + } else { + me.height = me.maxHeight; + + // Reset position before calculating rotation + me.top = 0; + me.bottom = me.height; + } + + // Reset padding + me.paddingLeft = 0; + me.paddingTop = 0; + me.paddingRight = 0; + me.paddingBottom = 0; + }, + afterSetDimensions: function () { + helpers$1.callback(this.options.afterSetDimensions, [this]); + }, + + // Data limits + beforeDataLimits: function () { + helpers$1.callback(this.options.beforeDataLimits, [this]); + }, + determineDataLimits: helpers$1.noop, + afterDataLimits: function () { + helpers$1.callback(this.options.afterDataLimits, [this]); + }, + + // + beforeBuildTicks: function () { + helpers$1.callback(this.options.beforeBuildTicks, [this]); + }, + buildTicks: helpers$1.noop, + afterBuildTicks: function (ticks) { + var me = this; + // ticks is empty for old axis implementations here + if (helpers$1.isArray(ticks) && ticks.length) { + return helpers$1.callback(me.options.afterBuildTicks, [me, ticks]); + } + // Support old implementations (that modified `this.ticks` directly in buildTicks) + me.ticks = helpers$1.callback(me.options.afterBuildTicks, [me, me.ticks]) || me.ticks; + return ticks; + }, + + beforeTickToLabelConversion: function () { + helpers$1.callback(this.options.beforeTickToLabelConversion, [this]); + }, + convertTicksToLabels: function () { + var me = this; + // Convert ticks to strings + var tickOpts = me.options.ticks; + me.ticks = me.ticks.map(tickOpts.userCallback || tickOpts.callback, this); + }, + afterTickToLabelConversion: function () { + helpers$1.callback(this.options.afterTickToLabelConversion, [this]); + }, + + // + + beforeCalculateTickRotation: function () { + helpers$1.callback(this.options.beforeCalculateTickRotation, [this]); + }, + calculateTickRotation: function () { + var me = this; + var context = me.ctx; + var tickOpts = me.options.ticks; + var labels = labelsFromTicks(me._ticks); + + // Get the width of each grid by calculating the difference + // between x offsets between 0 and 1. + var tickFont = helpers$1.options._parseFont(tickOpts); + context.font = tickFont.string; + + var labelRotation = tickOpts.minRotation || 0; + + if (labels.length && me.options.display && me.isHorizontal()) { + var originalLabelWidth = helpers$1.longestText(context, tickFont.string, labels, me.longestTextCache); + var labelWidth = originalLabelWidth; + var cosRotation, sinRotation; + + // Allow 3 pixels x2 padding either side for label readability + var tickWidth = me.getPixelForTick(1) - me.getPixelForTick(0) - 6; + + // Max label rotation can be set or default to 90 - also act as a loop counter + while (labelWidth > tickWidth && labelRotation < tickOpts.maxRotation) { + var angleRadians = helpers$1.toRadians(labelRotation); + cosRotation = Math.cos(angleRadians); + sinRotation = Math.sin(angleRadians); + + if (sinRotation * originalLabelWidth > me.maxHeight) { + // go back one step + labelRotation--; + break; + } + + labelRotation++; + labelWidth = cosRotation * originalLabelWidth; + } + } + + me.labelRotation = labelRotation; + }, + afterCalculateTickRotation: function () { + helpers$1.callback(this.options.afterCalculateTickRotation, [this]); + }, + + // + + beforeFit: function () { + helpers$1.callback(this.options.beforeFit, [this]); + }, + fit: function () { + var me = this; + // Reset + var minSize = me.minSize = { + width: 0, + height: 0 + }; + + var labels = labelsFromTicks(me._ticks); + + var opts = me.options; + var tickOpts = opts.ticks; + var scaleLabelOpts = opts.scaleLabel; + var gridLineOpts = opts.gridLines; + var display = me._isVisible(); + var position = opts.position; + var isHorizontal = me.isHorizontal(); + + var parseFont = helpers$1.options._parseFont; + var tickFont = parseFont(tickOpts); + var tickMarkLength = opts.gridLines.tickMarkLength; + + // Width + if (isHorizontal) { + // subtract the margins to line up with the chartArea if we are a full width scale + minSize.width = me.isFullWidth() ? me.maxWidth - me.margins.left - me.margins.right : me.maxWidth; + } else { + minSize.width = display && gridLineOpts.drawTicks ? tickMarkLength : 0; + } + + // height + if (isHorizontal) { + minSize.height = display && gridLineOpts.drawTicks ? tickMarkLength : 0; + } else { + minSize.height = me.maxHeight; // fill all the height + } + + // Are we showing a title for the scale? + if (scaleLabelOpts.display && display) { + var scaleLabelFont = parseFont(scaleLabelOpts); + var scaleLabelPadding = helpers$1.options.toPadding(scaleLabelOpts.padding); + var deltaHeight = scaleLabelFont.lineHeight + scaleLabelPadding.height; + + if (isHorizontal) { + minSize.height += deltaHeight; + } else { + minSize.width += deltaHeight; + } + } + + // Don't bother fitting the ticks if we are not showing the labels + if (tickOpts.display && display) { + var largestTextWidth = helpers$1.longestText(me.ctx, tickFont.string, labels, me.longestTextCache); + var tallestLabelHeightInLines = helpers$1.numberOfLabelLines(labels); + var lineSpace = tickFont.size * 0.5; + var tickPadding = me.options.ticks.padding; + + // Store max number of lines and widest label for _autoSkip + me._maxLabelLines = tallestLabelHeightInLines; + me.longestLabelWidth = largestTextWidth; + + if (isHorizontal) { + var angleRadians = helpers$1.toRadians(me.labelRotation); + var cosRotation = Math.cos(angleRadians); + var sinRotation = Math.sin(angleRadians); + + // TODO - improve this calculation + var labelHeight = (sinRotation * largestTextWidth) + + (tickFont.lineHeight * tallestLabelHeightInLines) + + lineSpace; // padding + + minSize.height = Math.min(me.maxHeight, minSize.height + labelHeight + tickPadding); + + me.ctx.font = tickFont.string; + var firstLabelWidth = computeTextSize(me.ctx, labels[0], tickFont.string); + var lastLabelWidth = computeTextSize(me.ctx, labels[labels.length - 1], tickFont.string); + var offsetLeft = me.getPixelForTick(0) - me.left; + var offsetRight = me.right - me.getPixelForTick(labels.length - 1); + var paddingLeft, paddingRight; + + // Ensure that our ticks are always inside the canvas. When rotated, ticks are right aligned + // which means that the right padding is dominated by the font height + if (me.labelRotation !== 0) { + paddingLeft = position === 'bottom' ? (cosRotation * firstLabelWidth) : (cosRotation * lineSpace); + paddingRight = position === 'bottom' ? (cosRotation * lineSpace) : (cosRotation * lastLabelWidth); + } else { + paddingLeft = firstLabelWidth / 2; + paddingRight = lastLabelWidth / 2; + } + me.paddingLeft = Math.max(paddingLeft - offsetLeft, 0) + 3; // add 3 px to move away from canvas edges + me.paddingRight = Math.max(paddingRight - offsetRight, 0) + 3; + } else { + // A vertical axis is more constrained by the width. Labels are the + // dominant factor here, so get that length first and account for padding + if (tickOpts.mirror) { + largestTextWidth = 0; + } else { + // use lineSpace for consistency with horizontal axis + // tickPadding is not implemented for horizontal + largestTextWidth += tickPadding + lineSpace; + } + + minSize.width = Math.min(me.maxWidth, minSize.width + largestTextWidth); + + me.paddingTop = tickFont.size / 2; + me.paddingBottom = tickFont.size / 2; + } + } + + me.handleMargins(); + + me.width = minSize.width; + me.height = minSize.height; + }, + + /** + * Handle margins and padding interactions + * @private + */ + handleMargins: function () { + var me = this; + if (me.margins) { + me.paddingLeft = Math.max(me.paddingLeft - me.margins.left, 0); + me.paddingTop = Math.max(me.paddingTop - me.margins.top, 0); + me.paddingRight = Math.max(me.paddingRight - me.margins.right, 0); + me.paddingBottom = Math.max(me.paddingBottom - me.margins.bottom, 0); + } + }, + + afterFit: function () { + helpers$1.callback(this.options.afterFit, [this]); + }, + + // Shared Methods + isHorizontal: function () { + return this.options.position === 'top' || this.options.position === 'bottom'; + }, + isFullWidth: function () { + return (this.options.fullWidth); + }, + + // Get the correct value. NaN bad inputs, If the value type is object get the x or y based on whether we are horizontal or not + getRightValue: function (rawValue) { + // Null and undefined values first + if (helpers$1.isNullOrUndef(rawValue)) { + return NaN; + } + // isNaN(object) returns true, so make sure NaN is checking for a number; Discard Infinite values + if ((typeof rawValue === 'number' || rawValue instanceof Number) && !isFinite(rawValue)) { + return NaN; + } + // If it is in fact an object, dive in one more level + if (rawValue) { + if (this.isHorizontal()) { + if (rawValue.x !== undefined) { + return this.getRightValue(rawValue.x); + } + } else if (rawValue.y !== undefined) { + return this.getRightValue(rawValue.y); + } + } + + // Value is good, return it + return rawValue; + }, + + /** + * Used to get the value to display in the tooltip for the data at the given index + * @param index + * @param datasetIndex + */ + getLabelForIndex: helpers$1.noop, + + /** + * Returns the location of the given data point. Value can either be an index or a numerical value + * The coordinate (0, 0) is at the upper-left corner of the canvas + * @param value + * @param index + * @param datasetIndex + */ + getPixelForValue: helpers$1.noop, + + /** + * Used to get the data value from a given pixel. This is the inverse of getPixelForValue + * The coordinate (0, 0) is at the upper-left corner of the canvas + * @param pixel + */ + getValueForPixel: helpers$1.noop, + + /** + * Returns the location of the tick at the given index + * The coordinate (0, 0) is at the upper-left corner of the canvas + */ + getPixelForTick: function (index) { + var me = this; + var offset = me.options.offset; + if (me.isHorizontal()) { + var innerWidth = me.width - (me.paddingLeft + me.paddingRight); + var tickWidth = innerWidth / Math.max((me._ticks.length - (offset ? 0 : 1)), 1); + var pixel = (tickWidth * index) + me.paddingLeft; + + if (offset) { + pixel += tickWidth / 2; + } + + var finalVal = me.left + pixel; + finalVal += me.isFullWidth() ? me.margins.left : 0; + return finalVal; + } + var innerHeight = me.height - (me.paddingTop + me.paddingBottom); + return me.top + (index * (innerHeight / (me._ticks.length - 1))); + }, + + /** + * Utility for getting the pixel location of a percentage of scale + * The coordinate (0, 0) is at the upper-left corner of the canvas + */ + getPixelForDecimal: function (decimal) { + var me = this; + if (me.isHorizontal()) { + var innerWidth = me.width - (me.paddingLeft + me.paddingRight); + var valueOffset = (innerWidth * decimal) + me.paddingLeft; + + var finalVal = me.left + valueOffset; + finalVal += me.isFullWidth() ? me.margins.left : 0; + return finalVal; + } + return me.top + (decimal * me.height); + }, + + /** + * Returns the pixel for the minimum chart value + * The coordinate (0, 0) is at the upper-left corner of the canvas + */ + getBasePixel: function () { + return this.getPixelForValue(this.getBaseValue()); + }, + + getBaseValue: function () { + var me = this; + var min = me.min; + var max = me.max; + + return me.beginAtZero ? 0 : + min < 0 && max < 0 ? max : + min > 0 && max > 0 ? min : + 0; + }, + + /** + * Returns a subset of ticks to be plotted to avoid overlapping labels. + * @private + */ + _autoSkip: function (ticks) { + var me = this; + var isHorizontal = me.isHorizontal(); + var optionTicks = me.options.ticks.minor; + var tickCount = ticks.length; + var skipRatio = false; + var maxTicks = optionTicks.maxTicksLimit; + + // Total space needed to display all ticks. First and last ticks are + // drawn as their center at end of axis, so tickCount-1 + var ticksLength = me._tickSize() * (tickCount - 1); + + // Axis length + var axisLength = isHorizontal + ? me.width - (me.paddingLeft + me.paddingRight) + : me.height - (me.paddingTop + me.PaddingBottom); + + var result = []; + var i, tick; + + if (ticksLength > axisLength) { + skipRatio = 1 + Math.floor(ticksLength / axisLength); + } + + // if they defined a max number of optionTicks, + // increase skipRatio until that number is met + if (tickCount > maxTicks) { + skipRatio = Math.max(skipRatio, 1 + Math.floor(tickCount / maxTicks)); + } + + for (i = 0; i < tickCount; i++) { + tick = ticks[i]; + + if (skipRatio > 1 && i % skipRatio > 0) { + // leave tick in place but make sure it's not displayed (#4635) + delete tick.label; + } + result.push(tick); + } + return result; + }, + + /** + * @private + */ + _tickSize: function () { + var me = this; + var isHorizontal = me.isHorizontal(); + var optionTicks = me.options.ticks.minor; + + // Calculate space needed by label in axis direction. + var rot = helpers$1.toRadians(me.labelRotation); + var cos = Math.abs(Math.cos(rot)); + var sin = Math.abs(Math.sin(rot)); + + var padding = optionTicks.autoSkipPadding || 0; + var w = (me.longestLabelWidth + padding) || 0; + + var tickFont = helpers$1.options._parseFont(optionTicks); + var h = (me._maxLabelLines * tickFont.lineHeight + padding) || 0; + + // Calculate space needed for 1 tick in axis direction. + return isHorizontal + ? h * cos > w * sin ? w / cos : h / sin + : h * sin < w * cos ? h / cos : w / sin; + }, + + /** + * @private + */ + _isVisible: function () { + var me = this; + var chart = me.chart; + var display = me.options.display; + var i, ilen, meta; + + if (display !== 'auto') { + return !!display; + } + + // When 'auto', the scale is visible if at least one associated dataset is visible. + for (i = 0, ilen = chart.data.datasets.length; i < ilen; ++i) { + if (chart.isDatasetVisible(i)) { + meta = chart.getDatasetMeta(i); + if (meta.xAxisID === me.id || meta.yAxisID === me.id) { + return true; + } + } + } + + return false; + }, + + /** + * Actually draw the scale on the canvas + * @param {object} chartArea - the area of the chart to draw full grid lines on + */ + draw: function (chartArea) { + var me = this; + var options = me.options; + + if (!me._isVisible()) { + return; + } + + var chart = me.chart; + var context = me.ctx; + var globalDefaults = core_defaults.global; + var defaultFontColor = globalDefaults.defaultFontColor; + var optionTicks = options.ticks.minor; + var optionMajorTicks = options.ticks.major || optionTicks; + var gridLines = options.gridLines; + var scaleLabel = options.scaleLabel; + var position = options.position; + + var isRotated = me.labelRotation !== 0; + var isMirrored = optionTicks.mirror; + var isHorizontal = me.isHorizontal(); + + var parseFont = helpers$1.options._parseFont; + var ticks = optionTicks.display && optionTicks.autoSkip ? me._autoSkip(me.getTicks()) : me.getTicks(); + var tickFontColor = valueOrDefault$9(optionTicks.fontColor, defaultFontColor); + var tickFont = parseFont(optionTicks); + var lineHeight = tickFont.lineHeight; + var majorTickFontColor = valueOrDefault$9(optionMajorTicks.fontColor, defaultFontColor); + var majorTickFont = parseFont(optionMajorTicks); + var tickPadding = optionTicks.padding; + var labelOffset = optionTicks.labelOffset; + + var tl = gridLines.drawTicks ? gridLines.tickMarkLength : 0; + + var scaleLabelFontColor = valueOrDefault$9(scaleLabel.fontColor, defaultFontColor); + var scaleLabelFont = parseFont(scaleLabel); + var scaleLabelPadding = helpers$1.options.toPadding(scaleLabel.padding); + var labelRotationRadians = helpers$1.toRadians(me.labelRotation); + + var itemsToDraw = []; + + var axisWidth = gridLines.drawBorder ? valueAtIndexOrDefault(gridLines.lineWidth, 0, 0) : 0; + var alignPixel = helpers$1._alignPixel; + var borderValue, tickStart, tickEnd; + + if (position === 'top') { + borderValue = alignPixel(chart, me.bottom, axisWidth); + tickStart = me.bottom - tl; + tickEnd = borderValue - axisWidth / 2; + } else if (position === 'bottom') { + borderValue = alignPixel(chart, me.top, axisWidth); + tickStart = borderValue + axisWidth / 2; + tickEnd = me.top + tl; + } else if (position === 'left') { + borderValue = alignPixel(chart, me.right, axisWidth); + tickStart = me.right - tl; + tickEnd = borderValue - axisWidth / 2; + } else { + borderValue = alignPixel(chart, me.left, axisWidth); + tickStart = borderValue + axisWidth / 2; + tickEnd = me.left + tl; + } + + var epsilon = 0.0000001; // 0.0000001 is margin in pixels for Accumulated error. + + helpers$1.each(ticks, function (tick, index) { + // autoskipper skipped this tick (#4635) + if (helpers$1.isNullOrUndef(tick.label)) { + return; + } + + var label = tick.label; + var lineWidth, lineColor, borderDash, borderDashOffset; + if (index === me.zeroLineIndex && options.offset === gridLines.offsetGridLines) { + // Draw the first index specially + lineWidth = gridLines.zeroLineWidth; + lineColor = gridLines.zeroLineColor; + borderDash = gridLines.zeroLineBorderDash || []; + borderDashOffset = gridLines.zeroLineBorderDashOffset || 0.0; + } else { + lineWidth = valueAtIndexOrDefault(gridLines.lineWidth, index); + lineColor = valueAtIndexOrDefault(gridLines.color, index); + borderDash = gridLines.borderDash || []; + borderDashOffset = gridLines.borderDashOffset || 0.0; + } + + // Common properties + var tx1, ty1, tx2, ty2, x1, y1, x2, y2, labelX, labelY, textOffset, textAlign; + var labelCount = helpers$1.isArray(label) ? label.length : 1; + var lineValue = getPixelForGridLine(me, index, gridLines.offsetGridLines); + + if (isHorizontal) { + var labelYOffset = tl + tickPadding; + + if (lineValue < me.left - epsilon) { + lineColor = 'rgba(0,0,0,0)'; + } + + tx1 = tx2 = x1 = x2 = alignPixel(chart, lineValue, lineWidth); + ty1 = tickStart; + ty2 = tickEnd; + labelX = me.getPixelForTick(index) + labelOffset; // x values for optionTicks (need to consider offsetLabel option) + + if (position === 'top') { + y1 = alignPixel(chart, chartArea.top, axisWidth) + axisWidth / 2; + y2 = chartArea.bottom; + textOffset = ((!isRotated ? 0.5 : 1) - labelCount) * lineHeight; + textAlign = !isRotated ? 'center' : 'left'; + labelY = me.bottom - labelYOffset; + } else { + y1 = chartArea.top; + y2 = alignPixel(chart, chartArea.bottom, axisWidth) - axisWidth / 2; + textOffset = (!isRotated ? 0.5 : 0) * lineHeight; + textAlign = !isRotated ? 'center' : 'right'; + labelY = me.top + labelYOffset; + } + } else { + var labelXOffset = (isMirrored ? 0 : tl) + tickPadding; + + if (lineValue < me.top - epsilon) { + lineColor = 'rgba(0,0,0,0)'; + } + + tx1 = tickStart; + tx2 = tickEnd; + ty1 = ty2 = y1 = y2 = alignPixel(chart, lineValue, lineWidth); + labelY = me.getPixelForTick(index) + labelOffset; + textOffset = (1 - labelCount) * lineHeight / 2; + + if (position === 'left') { + x1 = alignPixel(chart, chartArea.left, axisWidth) + axisWidth / 2; + x2 = chartArea.right; + textAlign = isMirrored ? 'left' : 'right'; + labelX = me.right - labelXOffset; + } else { + x1 = chartArea.left; + x2 = alignPixel(chart, chartArea.right, axisWidth) - axisWidth / 2; + textAlign = isMirrored ? 'right' : 'left'; + labelX = me.left + labelXOffset; + } + } + + itemsToDraw.push({ + tx1: tx1, + ty1: ty1, + tx2: tx2, + ty2: ty2, + x1: x1, + y1: y1, + x2: x2, + y2: y2, + labelX: labelX, + labelY: labelY, + glWidth: lineWidth, + glColor: lineColor, + glBorderDash: borderDash, + glBorderDashOffset: borderDashOffset, + rotation: -1 * labelRotationRadians, + label: label, + major: tick.major, + textOffset: textOffset, + textAlign: textAlign + }); + }); + + // Draw all of the tick labels, tick marks, and grid lines at the correct places + helpers$1.each(itemsToDraw, function (itemToDraw) { + var glWidth = itemToDraw.glWidth; + var glColor = itemToDraw.glColor; + + if (gridLines.display && glWidth && glColor) { + context.save(); + context.lineWidth = glWidth; + context.strokeStyle = glColor; + if (context.setLineDash) { + context.setLineDash(itemToDraw.glBorderDash); + context.lineDashOffset = itemToDraw.glBorderDashOffset; + } + + context.beginPath(); + + if (gridLines.drawTicks) { + context.moveTo(itemToDraw.tx1, itemToDraw.ty1); + context.lineTo(itemToDraw.tx2, itemToDraw.ty2); + } + + if (gridLines.drawOnChartArea) { + context.moveTo(itemToDraw.x1, itemToDraw.y1); + context.lineTo(itemToDraw.x2, itemToDraw.y2); + } + + context.stroke(); + context.restore(); + } + + if (optionTicks.display) { + // Make sure we draw text in the correct color and font + context.save(); + context.translate(itemToDraw.labelX, itemToDraw.labelY); + context.rotate(itemToDraw.rotation); + context.font = itemToDraw.major ? majorTickFont.string : tickFont.string; + context.fillStyle = itemToDraw.major ? majorTickFontColor : tickFontColor; + context.textBaseline = 'middle'; + context.textAlign = itemToDraw.textAlign; + + var label = itemToDraw.label; + var y = itemToDraw.textOffset; + if (helpers$1.isArray(label)) { + for (var i = 0; i < label.length; ++i) { + // We just make sure the multiline element is a string here.. + context.fillText('' + label[i], 0, y); + y += lineHeight; } - }, {}], 10: [function (t, e, i) { - "use strict"; - e.exports = function (t) { - t.Doughnut = function (e, i) { - return i.type = "doughnut", new t(e, i) - } + } else { + context.fillText(label, 0, y); + } + context.restore(); + } + }); + + if (scaleLabel.display) { + // Draw the scale label + var scaleLabelX; + var scaleLabelY; + var rotation = 0; + var halfLineHeight = scaleLabelFont.lineHeight / 2; + + if (isHorizontal) { + scaleLabelX = me.left + ((me.right - me.left) / 2); // midpoint of the width + scaleLabelY = position === 'bottom' + ? me.bottom - halfLineHeight - scaleLabelPadding.bottom + : me.top + halfLineHeight + scaleLabelPadding.top; + } else { + var isLeft = position === 'left'; + scaleLabelX = isLeft + ? me.left + halfLineHeight + scaleLabelPadding.top + : me.right - halfLineHeight - scaleLabelPadding.top; + scaleLabelY = me.top + ((me.bottom - me.top) / 2); + rotation = isLeft ? -0.5 * Math.PI : 0.5 * Math.PI; + } + + context.save(); + context.translate(scaleLabelX, scaleLabelY); + context.rotate(rotation); + context.textAlign = 'center'; + context.textBaseline = 'middle'; + context.fillStyle = scaleLabelFontColor; // render in correct colour + context.font = scaleLabelFont.string; + context.fillText(scaleLabel.labelString, 0, 0); + context.restore(); + } + + if (axisWidth) { + // Draw the line at the edge of the axis + var firstLineWidth = axisWidth; + var lastLineWidth = valueAtIndexOrDefault(gridLines.lineWidth, ticks.length - 1, 0); + var x1, x2, y1, y2; + + if (isHorizontal) { + x1 = alignPixel(chart, me.left, firstLineWidth) - firstLineWidth / 2; + x2 = alignPixel(chart, me.right, lastLineWidth) + lastLineWidth / 2; + y1 = y2 = borderValue; + } else { + y1 = alignPixel(chart, me.top, firstLineWidth) - firstLineWidth / 2; + y2 = alignPixel(chart, me.bottom, lastLineWidth) + lastLineWidth / 2; + x1 = x2 = borderValue; + } + + context.lineWidth = axisWidth; + context.strokeStyle = valueAtIndexOrDefault(gridLines.color, 0); + context.beginPath(); + context.moveTo(x1, y1); + context.lineTo(x2, y2); + context.stroke(); + } + } + }); + + var defaultConfig = { + position: 'bottom' + }; + + var scale_category = core_scale.extend({ + /** + * Internal function to get the correct labels. If data.xLabels or data.yLabels are defined, use those + * else fall back to data.labels + * @private + */ + getLabels: function () { + var data = this.chart.data; + return this.options.labels || (this.isHorizontal() ? data.xLabels : data.yLabels) || data.labels; + }, + + determineDataLimits: function () { + var me = this; + var labels = me.getLabels(); + me.minIndex = 0; + me.maxIndex = labels.length - 1; + var findIndex; + + if (me.options.ticks.min !== undefined) { + // user specified min value + findIndex = labels.indexOf(me.options.ticks.min); + me.minIndex = findIndex !== -1 ? findIndex : me.minIndex; + } + + if (me.options.ticks.max !== undefined) { + // user specified max value + findIndex = labels.indexOf(me.options.ticks.max); + me.maxIndex = findIndex !== -1 ? findIndex : me.maxIndex; + } + + me.min = labels[me.minIndex]; + me.max = labels[me.maxIndex]; + }, + + buildTicks: function () { + var me = this; + var labels = me.getLabels(); + // If we are viewing some subset of labels, slice the original array + me.ticks = (me.minIndex === 0 && me.maxIndex === labels.length - 1) ? labels : labels.slice(me.minIndex, me.maxIndex + 1); + }, + + getLabelForIndex: function (index, datasetIndex) { + var me = this; + var chart = me.chart; + + if (chart.getDatasetMeta(datasetIndex).controller._getValueScaleId() === me.id) { + return me.getRightValue(chart.data.datasets[datasetIndex].data[index]); + } + + return me.ticks[index - me.minIndex]; + }, + + // Used to get data value locations. Value can either be an index or a numerical value + getPixelForValue: function (value, index) { + var me = this; + var offset = me.options.offset; + // 1 is added because we need the length but we have the indexes + var offsetAmt = Math.max((me.maxIndex + 1 - me.minIndex - (offset ? 0 : 1)), 1); + + // If value is a data object, then index is the index in the data array, + // not the index of the scale. We need to change that. + var valueCategory; + if (value !== undefined && value !== null) { + valueCategory = me.isHorizontal() ? value.x : value.y; + } + if (valueCategory !== undefined || (value !== undefined && isNaN(index))) { + var labels = me.getLabels(); + value = valueCategory || value; + var idx = labels.indexOf(value); + index = idx !== -1 ? idx : index; + } + + if (me.isHorizontal()) { + var valueWidth = me.width / offsetAmt; + var widthOffset = (valueWidth * (index - me.minIndex)); + + if (offset) { + widthOffset += (valueWidth / 2); + } + + return me.left + widthOffset; + } + var valueHeight = me.height / offsetAmt; + var heightOffset = (valueHeight * (index - me.minIndex)); + + if (offset) { + heightOffset += (valueHeight / 2); + } + + return me.top + heightOffset; + }, + + getPixelForTick: function (index) { + return this.getPixelForValue(this.ticks[index], index + this.minIndex, null); + }, + + getValueForPixel: function (pixel) { + var me = this; + var offset = me.options.offset; + var value; + var offsetAmt = Math.max((me._ticks.length - (offset ? 0 : 1)), 1); + var horz = me.isHorizontal(); + var valueDimension = (horz ? me.width : me.height) / offsetAmt; + + pixel -= horz ? me.left : me.top; + + if (offset) { + pixel -= (valueDimension / 2); + } + + if (pixel <= 0) { + value = 0; + } else { + value = Math.round(pixel / valueDimension); + } + + return value + me.minIndex; + }, + + getBasePixel: function () { + return this.bottom; + } + }); + +// INTERNAL: static default options, registered in src/index.js + var _defaults = defaultConfig; + scale_category._defaults = _defaults; + + var noop = helpers$1.noop; + var isNullOrUndef = helpers$1.isNullOrUndef; + + /** + * Generate a set of linear ticks + * @param generationOptions the options used to generate the ticks + * @param dataRange the range of the data + * @returns {number[]} array of tick values + */ + function generateTicks(generationOptions, dataRange) { + var ticks = []; + // To get a "nice" value for the tick spacing, we will use the appropriately named + // "nice number" algorithm. See https://stackoverflow.com/questions/8506881/nice-label-algorithm-for-charts-with-minimum-ticks + // for details. + + var MIN_SPACING = 1e-14; + var stepSize = generationOptions.stepSize; + var unit = stepSize || 1; + var maxNumSpaces = generationOptions.maxTicks - 1; + var min = generationOptions.min; + var max = generationOptions.max; + var precision = generationOptions.precision; + var rmin = dataRange.min; + var rmax = dataRange.max; + var spacing = helpers$1.niceNum((rmax - rmin) / maxNumSpaces / unit) * unit; + var factor, niceMin, niceMax, numSpaces; + + // Beyond MIN_SPACING floating point numbers being to lose precision + // such that we can't do the math necessary to generate ticks + if (spacing < MIN_SPACING && isNullOrUndef(min) && isNullOrUndef(max)) { + return [rmin, rmax]; + } + + numSpaces = Math.ceil(rmax / spacing) - Math.floor(rmin / spacing); + if (numSpaces > maxNumSpaces) { + // If the calculated num of spaces exceeds maxNumSpaces, recalculate it + spacing = helpers$1.niceNum(numSpaces * spacing / maxNumSpaces / unit) * unit; + } + + if (stepSize || isNullOrUndef(precision)) { + // If a precision is not specified, calculate factor based on spacing + factor = Math.pow(10, helpers$1._decimalPlaces(spacing)); + } else { + // If the user specified a precision, round to that number of decimal places + factor = Math.pow(10, precision); + spacing = Math.ceil(spacing * factor) / factor; + } + + niceMin = Math.floor(rmin / spacing) * spacing; + niceMax = Math.ceil(rmax / spacing) * spacing; + + // If min, max and stepSize is set and they make an evenly spaced scale use it. + if (stepSize) { + // If very close to our whole number, use it. + if (!isNullOrUndef(min) && helpers$1.almostWhole(min / spacing, spacing / 1000)) { + niceMin = min; + } + if (!isNullOrUndef(max) && helpers$1.almostWhole(max / spacing, spacing / 1000)) { + niceMax = max; + } + } + + numSpaces = (niceMax - niceMin) / spacing; + // If very close to our rounded value, use it. + if (helpers$1.almostEquals(numSpaces, Math.round(numSpaces), spacing / 1000)) { + numSpaces = Math.round(numSpaces); + } else { + numSpaces = Math.ceil(numSpaces); + } + + niceMin = Math.round(niceMin * factor) / factor; + niceMax = Math.round(niceMax * factor) / factor; + ticks.push(isNullOrUndef(min) ? niceMin : min); + for (var j = 1; j < numSpaces; ++j) { + ticks.push(Math.round((niceMin + j * spacing) * factor) / factor); + } + ticks.push(isNullOrUndef(max) ? niceMax : max); + + return ticks; + } + + var scale_linearbase = core_scale.extend({ + getRightValue: function (value) { + if (typeof value === 'string') { + return +value; + } + return core_scale.prototype.getRightValue.call(this, value); + }, + + handleTickRangeOptions: function () { + var me = this; + var opts = me.options; + var tickOpts = opts.ticks; + + // If we are forcing it to begin at 0, but 0 will already be rendered on the chart, + // do nothing since that would make the chart weird. If the user really wants a weird chart + // axis, they can manually override it + if (tickOpts.beginAtZero) { + var minSign = helpers$1.sign(me.min); + var maxSign = helpers$1.sign(me.max); + + if (minSign < 0 && maxSign < 0) { + // move the top up to 0 + me.max = 0; + } else if (minSign > 0 && maxSign > 0) { + // move the bottom down to 0 + me.min = 0; + } + } + + var setMin = tickOpts.min !== undefined || tickOpts.suggestedMin !== undefined; + var setMax = tickOpts.max !== undefined || tickOpts.suggestedMax !== undefined; + + if (tickOpts.min !== undefined) { + me.min = tickOpts.min; + } else if (tickOpts.suggestedMin !== undefined) { + if (me.min === null) { + me.min = tickOpts.suggestedMin; + } else { + me.min = Math.min(me.min, tickOpts.suggestedMin); + } + } + + if (tickOpts.max !== undefined) { + me.max = tickOpts.max; + } else if (tickOpts.suggestedMax !== undefined) { + if (me.max === null) { + me.max = tickOpts.suggestedMax; + } else { + me.max = Math.max(me.max, tickOpts.suggestedMax); + } + } + + if (setMin !== setMax) { + // We set the min or the max but not both. + // So ensure that our range is good + // Inverted or 0 length range can happen when + // ticks.min is set, and no datasets are visible + if (me.min >= me.max) { + if (setMin) { + me.max = me.min + 1; + } else { + me.min = me.max - 1; + } + } + } + + if (me.min === me.max) { + me.max++; + + if (!tickOpts.beginAtZero) { + me.min--; + } + } + }, + + getTickLimit: function () { + var me = this; + var tickOpts = me.options.ticks; + var stepSize = tickOpts.stepSize; + var maxTicksLimit = tickOpts.maxTicksLimit; + var maxTicks; + + if (stepSize) { + maxTicks = Math.ceil(me.max / stepSize) - Math.floor(me.min / stepSize) + 1; + } else { + maxTicks = me._computeTickLimit(); + maxTicksLimit = maxTicksLimit || 11; + } + + if (maxTicksLimit) { + maxTicks = Math.min(maxTicksLimit, maxTicks); + } + + return maxTicks; + }, + + _computeTickLimit: function () { + return Number.POSITIVE_INFINITY; + }, + + handleDirectionalChanges: noop, + + buildTicks: function () { + var me = this; + var opts = me.options; + var tickOpts = opts.ticks; + + // Figure out what the max number of ticks we can support it is based on the size of + // the axis area. For now, we say that the minimum tick spacing in pixels must be 40 + // We also limit the maximum number of ticks to 11 which gives a nice 10 squares on + // the graph. Make sure we always have at least 2 ticks + var maxTicks = me.getTickLimit(); + maxTicks = Math.max(2, maxTicks); + + var numericGeneratorOptions = { + maxTicks: maxTicks, + min: tickOpts.min, + max: tickOpts.max, + precision: tickOpts.precision, + stepSize: helpers$1.valueOrDefault(tickOpts.fixedStepSize, tickOpts.stepSize) + }; + var ticks = me.ticks = generateTicks(numericGeneratorOptions, me); + + me.handleDirectionalChanges(); + + // At this point, we need to update our max and min given the tick values since we have expanded the + // range of the scale + me.max = helpers$1.max(ticks); + me.min = helpers$1.min(ticks); + + if (tickOpts.reverse) { + ticks.reverse(); + + me.start = me.max; + me.end = me.min; + } else { + me.start = me.min; + me.end = me.max; + } + }, + + convertTicksToLabels: function () { + var me = this; + me.ticksAsNumbers = me.ticks.slice(); + me.zeroLineIndex = me.ticks.indexOf(0); + + core_scale.prototype.convertTicksToLabels.call(me); + } + }); + + var defaultConfig$1 = { + position: 'left', + ticks: { + callback: core_ticks.formatters.linear + } + }; + + var scale_linear = scale_linearbase.extend({ + determineDataLimits: function () { + var me = this; + var opts = me.options; + var chart = me.chart; + var data = chart.data; + var datasets = data.datasets; + var isHorizontal = me.isHorizontal(); + var DEFAULT_MIN = 0; + var DEFAULT_MAX = 1; + + function IDMatches(meta) { + return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id; + } + + // First Calculate the range + me.min = null; + me.max = null; + + var hasStacks = opts.stacked; + if (hasStacks === undefined) { + helpers$1.each(datasets, function (dataset, datasetIndex) { + if (hasStacks) { + return; + } + + var meta = chart.getDatasetMeta(datasetIndex); + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) && + meta.stack !== undefined) { + hasStacks = true; + } + }); + } + + if (opts.stacked || hasStacks) { + var valuesPerStack = {}; + + helpers$1.each(datasets, function (dataset, datasetIndex) { + var meta = chart.getDatasetMeta(datasetIndex); + var key = [ + meta.type, + // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined + ((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''), + meta.stack + ].join('.'); + + if (valuesPerStack[key] === undefined) { + valuesPerStack[key] = { + positiveValues: [], + negativeValues: [] + }; + } + + // Store these per type + var positiveValues = valuesPerStack[key].positiveValues; + var negativeValues = valuesPerStack[key].negativeValues; + + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { + helpers$1.each(dataset.data, function (rawValue, index) { + var value = +me.getRightValue(rawValue); + if (isNaN(value) || meta.data[index].hidden) { + return; + } + + positiveValues[index] = positiveValues[index] || 0; + negativeValues[index] = negativeValues[index] || 0; + + if (opts.relativePoints) { + positiveValues[index] = 100; + } else if (value < 0) { + negativeValues[index] += value; + } else { + positiveValues[index] += value; + } + }); + } + }); + + helpers$1.each(valuesPerStack, function (valuesForType) { + var values = valuesForType.positiveValues.concat(valuesForType.negativeValues); + var minVal = helpers$1.min(values); + var maxVal = helpers$1.max(values); + me.min = me.min === null ? minVal : Math.min(me.min, minVal); + me.max = me.max === null ? maxVal : Math.max(me.max, maxVal); + }); + + } else { + helpers$1.each(datasets, function (dataset, datasetIndex) { + var meta = chart.getDatasetMeta(datasetIndex); + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { + helpers$1.each(dataset.data, function (rawValue, index) { + var value = +me.getRightValue(rawValue); + if (isNaN(value) || meta.data[index].hidden) { + return; + } + + if (me.min === null) { + me.min = value; + } else if (value < me.min) { + me.min = value; + } + + if (me.max === null) { + me.max = value; + } else if (value > me.max) { + me.max = value; + } + }); + } + }); + } + + me.min = isFinite(me.min) && !isNaN(me.min) ? me.min : DEFAULT_MIN; + me.max = isFinite(me.max) && !isNaN(me.max) ? me.max : DEFAULT_MAX; + + // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero + this.handleTickRangeOptions(); + }, + + // Returns the maximum number of ticks based on the scale dimension + _computeTickLimit: function () { + var me = this; + var tickFont; + + if (me.isHorizontal()) { + return Math.ceil(me.width / 40); + } + tickFont = helpers$1.options._parseFont(me.options.ticks); + return Math.ceil(me.height / tickFont.lineHeight); + }, + + // Called after the ticks are built. We need + handleDirectionalChanges: function () { + if (!this.isHorizontal()) { + // We are in a vertical orientation. The top value is the highest. So reverse the array + this.ticks.reverse(); + } + }, + + getLabelForIndex: function (index, datasetIndex) { + return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); + }, + + // Utils + getPixelForValue: function (value) { + // This must be called after fit has been run so that + // this.left, this.top, this.right, and this.bottom have been defined + var me = this; + var start = me.start; + + var rightValue = +me.getRightValue(value); + var pixel; + var range = me.end - start; + + if (me.isHorizontal()) { + pixel = me.left + (me.width / range * (rightValue - start)); + } else { + pixel = me.bottom - (me.height / range * (rightValue - start)); + } + return pixel; + }, + + getValueForPixel: function (pixel) { + var me = this; + var isHorizontal = me.isHorizontal(); + var innerDimension = isHorizontal ? me.width : me.height; + var offset = (isHorizontal ? pixel - me.left : me.bottom - pixel) / innerDimension; + return me.start + ((me.end - me.start) * offset); + }, + + getPixelForTick: function (index) { + return this.getPixelForValue(this.ticksAsNumbers[index]); + } + }); + +// INTERNAL: static default options, registered in src/index.js + var _defaults$1 = defaultConfig$1; + scale_linear._defaults = _defaults$1; + + var valueOrDefault$a = helpers$1.valueOrDefault; + + /** + * Generate a set of logarithmic ticks + * @param generationOptions the options used to generate the ticks + * @param dataRange the range of the data + * @returns {number[]} array of tick values + */ + function generateTicks$1(generationOptions, dataRange) { + var ticks = []; + + var tickVal = valueOrDefault$a(generationOptions.min, Math.pow(10, Math.floor(helpers$1.log10(dataRange.min)))); + + var endExp = Math.floor(helpers$1.log10(dataRange.max)); + var endSignificand = Math.ceil(dataRange.max / Math.pow(10, endExp)); + var exp, significand; + + if (tickVal === 0) { + exp = Math.floor(helpers$1.log10(dataRange.minNotZero)); + significand = Math.floor(dataRange.minNotZero / Math.pow(10, exp)); + + ticks.push(tickVal); + tickVal = significand * Math.pow(10, exp); + } else { + exp = Math.floor(helpers$1.log10(tickVal)); + significand = Math.floor(tickVal / Math.pow(10, exp)); + } + var precision = exp < 0 ? Math.pow(10, Math.abs(exp)) : 1; + + do { + ticks.push(tickVal); + + ++significand; + if (significand === 10) { + significand = 1; + ++exp; + precision = exp >= 0 ? 1 : precision; + } + + tickVal = Math.round(significand * Math.pow(10, exp) * precision) / precision; + } while (exp < endExp || (exp === endExp && significand < endSignificand)); + + var lastTick = valueOrDefault$a(generationOptions.max, tickVal); + ticks.push(lastTick); + + return ticks; + } + + var defaultConfig$2 = { + position: 'left', + + // label settings + ticks: { + callback: core_ticks.formatters.logarithmic + } + }; + +// TODO(v3): change this to positiveOrDefault + function nonNegativeOrDefault(value, defaultValue) { + return helpers$1.isFinite(value) && value >= 0 ? value : defaultValue; + } + + var scale_logarithmic = core_scale.extend({ + determineDataLimits: function () { + var me = this; + var opts = me.options; + var chart = me.chart; + var data = chart.data; + var datasets = data.datasets; + var isHorizontal = me.isHorizontal(); + + function IDMatches(meta) { + return isHorizontal ? meta.xAxisID === me.id : meta.yAxisID === me.id; + } + + // Calculate Range + me.min = null; + me.max = null; + me.minNotZero = null; + + var hasStacks = opts.stacked; + if (hasStacks === undefined) { + helpers$1.each(datasets, function (dataset, datasetIndex) { + if (hasStacks) { + return; + } + + var meta = chart.getDatasetMeta(datasetIndex); + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta) && + meta.stack !== undefined) { + hasStacks = true; + } + }); + } + + if (opts.stacked || hasStacks) { + var valuesPerStack = {}; + + helpers$1.each(datasets, function (dataset, datasetIndex) { + var meta = chart.getDatasetMeta(datasetIndex); + var key = [ + meta.type, + // we have a separate stack for stack=undefined datasets when the opts.stacked is undefined + ((opts.stacked === undefined && meta.stack === undefined) ? datasetIndex : ''), + meta.stack + ].join('.'); + + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { + if (valuesPerStack[key] === undefined) { + valuesPerStack[key] = []; } - }, {}], 11: [function (t, e, i) { - "use strict"; - e.exports = function (t) { - t.Line = function (e, i) { - return i.type = "line", new t(e, i) - } + + helpers$1.each(dataset.data, function (rawValue, index) { + var values = valuesPerStack[key]; + var value = +me.getRightValue(rawValue); + // invalid, hidden and negative values are ignored + if (isNaN(value) || meta.data[index].hidden || value < 0) { + return; + } + values[index] = values[index] || 0; + values[index] += value; + }); + } + }); + + helpers$1.each(valuesPerStack, function (valuesForType) { + if (valuesForType.length > 0) { + var minVal = helpers$1.min(valuesForType); + var maxVal = helpers$1.max(valuesForType); + me.min = me.min === null ? minVal : Math.min(me.min, minVal); + me.max = me.max === null ? maxVal : Math.max(me.max, maxVal); + } + }); + + } else { + helpers$1.each(datasets, function (dataset, datasetIndex) { + var meta = chart.getDatasetMeta(datasetIndex); + if (chart.isDatasetVisible(datasetIndex) && IDMatches(meta)) { + helpers$1.each(dataset.data, function (rawValue, index) { + var value = +me.getRightValue(rawValue); + // invalid, hidden and negative values are ignored + if (isNaN(value) || meta.data[index].hidden || value < 0) { + return; + } + + if (me.min === null) { + me.min = value; + } else if (value < me.min) { + me.min = value; + } + + if (me.max === null) { + me.max = value; + } else if (value > me.max) { + me.max = value; + } + + if (value !== 0 && (me.minNotZero === null || value < me.minNotZero)) { + me.minNotZero = value; + } + }); + } + }); + } + + // Common base implementation to handle ticks.min, ticks.max + this.handleTickRangeOptions(); + }, + + handleTickRangeOptions: function () { + var me = this; + var tickOpts = me.options.ticks; + var DEFAULT_MIN = 1; + var DEFAULT_MAX = 10; + + me.min = nonNegativeOrDefault(tickOpts.min, me.min); + me.max = nonNegativeOrDefault(tickOpts.max, me.max); + + if (me.min === me.max) { + if (me.min !== 0 && me.min !== null) { + me.min = Math.pow(10, Math.floor(helpers$1.log10(me.min)) - 1); + me.max = Math.pow(10, Math.floor(helpers$1.log10(me.max)) + 1); + } else { + me.min = DEFAULT_MIN; + me.max = DEFAULT_MAX; + } + } + if (me.min === null) { + me.min = Math.pow(10, Math.floor(helpers$1.log10(me.max)) - 1); + } + if (me.max === null) { + me.max = me.min !== 0 + ? Math.pow(10, Math.floor(helpers$1.log10(me.min)) + 1) + : DEFAULT_MAX; + } + if (me.minNotZero === null) { + if (me.min > 0) { + me.minNotZero = me.min; + } else if (me.max < 1) { + me.minNotZero = Math.pow(10, Math.floor(helpers$1.log10(me.max))); + } else { + me.minNotZero = DEFAULT_MIN; + } + } + }, + + buildTicks: function () { + var me = this; + var tickOpts = me.options.ticks; + var reverse = !me.isHorizontal(); + + var generationOptions = { + min: nonNegativeOrDefault(tickOpts.min), + max: nonNegativeOrDefault(tickOpts.max) + }; + var ticks = me.ticks = generateTicks$1(generationOptions, me); + + // At this point, we need to update our max and min given the tick values since we have expanded the + // range of the scale + me.max = helpers$1.max(ticks); + me.min = helpers$1.min(ticks); + + if (tickOpts.reverse) { + reverse = !reverse; + me.start = me.max; + me.end = me.min; + } else { + me.start = me.min; + me.end = me.max; + } + if (reverse) { + ticks.reverse(); + } + }, + + convertTicksToLabels: function () { + this.tickValues = this.ticks.slice(); + + core_scale.prototype.convertTicksToLabels.call(this); + }, + + // Get the correct tooltip label + getLabelForIndex: function (index, datasetIndex) { + return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); + }, + + getPixelForTick: function (index) { + return this.getPixelForValue(this.tickValues[index]); + }, + + /** + * Returns the value of the first tick. + * @param {number} value - The minimum not zero value. + * @return {number} The first tick value. + * @private + */ + _getFirstTickValue: function (value) { + var exp = Math.floor(helpers$1.log10(value)); + var significand = Math.floor(value / Math.pow(10, exp)); + + return significand * Math.pow(10, exp); + }, + + getPixelForValue: function (value) { + var me = this; + var tickOpts = me.options.ticks; + var reverse = tickOpts.reverse; + var log10 = helpers$1.log10; + var firstTickValue = me._getFirstTickValue(me.minNotZero); + var offset = 0; + var innerDimension, pixel, start, end, sign; + + value = +me.getRightValue(value); + if (reverse) { + start = me.end; + end = me.start; + sign = -1; + } else { + start = me.start; + end = me.end; + sign = 1; + } + if (me.isHorizontal()) { + innerDimension = me.width; + pixel = reverse ? me.right : me.left; + } else { + innerDimension = me.height; + sign *= -1; // invert, since the upper-left corner of the canvas is at pixel (0, 0) + pixel = reverse ? me.top : me.bottom; + } + if (value !== start) { + if (start === 0) { // include zero tick + offset = valueOrDefault$a(tickOpts.fontSize, core_defaults.global.defaultFontSize); + innerDimension -= offset; + start = firstTickValue; + } + if (value !== 0) { + offset += innerDimension / (log10(end) - log10(start)) * (log10(value) - log10(start)); + } + pixel += sign * offset; + } + return pixel; + }, + + getValueForPixel: function (pixel) { + var me = this; + var tickOpts = me.options.ticks; + var reverse = tickOpts.reverse; + var log10 = helpers$1.log10; + var firstTickValue = me._getFirstTickValue(me.minNotZero); + var innerDimension, start, end, value; + + if (reverse) { + start = me.end; + end = me.start; + } else { + start = me.start; + end = me.end; + } + if (me.isHorizontal()) { + innerDimension = me.width; + value = reverse ? me.right - pixel : pixel - me.left; + } else { + innerDimension = me.height; + value = reverse ? pixel - me.top : me.bottom - pixel; + } + if (value !== start) { + if (start === 0) { // include zero tick + var offset = valueOrDefault$a(tickOpts.fontSize, core_defaults.global.defaultFontSize); + value -= offset; + innerDimension -= offset; + start = firstTickValue; + } + value *= log10(end) - log10(start); + value /= innerDimension; + value = Math.pow(10, log10(start) + value); + } + return value; + } + }); + +// INTERNAL: static default options, registered in src/index.js + var _defaults$2 = defaultConfig$2; + scale_logarithmic._defaults = _defaults$2; + + var valueOrDefault$b = helpers$1.valueOrDefault; + var valueAtIndexOrDefault$1 = helpers$1.valueAtIndexOrDefault; + var resolve$7 = helpers$1.options.resolve; + + var defaultConfig$3 = { + display: true, + + // Boolean - Whether to animate scaling the chart from the centre + animate: true, + position: 'chartArea', + + angleLines: { + display: true, + color: 'rgba(0, 0, 0, 0.1)', + lineWidth: 1, + borderDash: [], + borderDashOffset: 0.0 + }, + + gridLines: { + circular: false + }, + + // label settings + ticks: { + // Boolean - Show a backdrop to the scale label + showLabelBackdrop: true, + + // String - The colour of the label backdrop + backdropColor: 'rgba(255,255,255,0.75)', + + // Number - The backdrop padding above & below the label in pixels + backdropPaddingY: 2, + + // Number - The backdrop padding to the side of the label in pixels + backdropPaddingX: 2, + + callback: core_ticks.formatters.linear + }, + + pointLabels: { + // Boolean - if true, show point labels + display: true, + + // Number - Point label font size in pixels + fontSize: 10, + + // Function - Used to convert point labels + callback: function (label) { + return label; + } + } + }; + + function getValueCount(scale) { + var opts = scale.options; + return opts.angleLines.display || opts.pointLabels.display ? scale.chart.data.labels.length : 0; + } + + function getTickBackdropHeight(opts) { + var tickOpts = opts.ticks; + + if (tickOpts.display && opts.display) { + return valueOrDefault$b(tickOpts.fontSize, core_defaults.global.defaultFontSize) + tickOpts.backdropPaddingY * 2; + } + return 0; + } + + function measureLabelSize(ctx, lineHeight, label) { + if (helpers$1.isArray(label)) { + return { + w: helpers$1.longestText(ctx, ctx.font, label), + h: label.length * lineHeight + }; + } + + return { + w: ctx.measureText(label).width, + h: lineHeight + }; + } + + function determineLimits(angle, pos, size, min, max) { + if (angle === min || angle === max) { + return { + start: pos - (size / 2), + end: pos + (size / 2) + }; + } else if (angle < min || angle > max) { + return { + start: pos - size, + end: pos + }; + } + + return { + start: pos, + end: pos + size + }; + } + + /** + * Helper function to fit a radial linear scale with point labels + */ + function fitWithPointLabels(scale) { + + // Right, this is really confusing and there is a lot of maths going on here + // The gist of the problem is here: https://gist.github.com/nnnick/696cc9c55f4b0beb8fe9 + // + // Reaction: https://dl.dropboxusercontent.com/u/34601363/toomuchscience.gif + // + // Solution: + // + // We assume the radius of the polygon is half the size of the canvas at first + // at each index we check if the text overlaps. + // + // Where it does, we store that angle and that index. + // + // After finding the largest index and angle we calculate how much we need to remove + // from the shape radius to move the point inwards by that x. + // + // We average the left and right distances to get the maximum shape radius that can fit in the box + // along with labels. + // + // Once we have that, we can find the centre point for the chart, by taking the x text protrusion + // on each side, removing that from the size, halving it and adding the left x protrusion width. + // + // This will mean we have a shape fitted to the canvas, as large as it can be with the labels + // and position it in the most space efficient manner + // + // https://dl.dropboxusercontent.com/u/34601363/yeahscience.gif + + var plFont = helpers$1.options._parseFont(scale.options.pointLabels); + + // Get maximum radius of the polygon. Either half the height (minus the text width) or half the width. + // Use this to calculate the offset + change. - Make sure L/R protrusion is at least 0 to stop issues with centre points + var furthestLimits = { + l: 0, + r: scale.width, + t: 0, + b: scale.height - scale.paddingTop + }; + var furthestAngles = {}; + var i, textSize, pointPosition; + + scale.ctx.font = plFont.string; + scale._pointLabelSizes = []; + + var valueCount = getValueCount(scale); + for (i = 0; i < valueCount; i++) { + pointPosition = scale.getPointPosition(i, scale.drawingArea + 5); + textSize = measureLabelSize(scale.ctx, plFont.lineHeight, scale.pointLabels[i] || ''); + scale._pointLabelSizes[i] = textSize; + + // Add quarter circle to make degree 0 mean top of circle + var angleRadians = scale.getIndexAngle(i); + var angle = helpers$1.toDegrees(angleRadians) % 360; + var hLimits = determineLimits(angle, pointPosition.x, textSize.w, 0, 180); + var vLimits = determineLimits(angle, pointPosition.y, textSize.h, 90, 270); + + if (hLimits.start < furthestLimits.l) { + furthestLimits.l = hLimits.start; + furthestAngles.l = angleRadians; + } + + if (hLimits.end > furthestLimits.r) { + furthestLimits.r = hLimits.end; + furthestAngles.r = angleRadians; + } + + if (vLimits.start < furthestLimits.t) { + furthestLimits.t = vLimits.start; + furthestAngles.t = angleRadians; + } + + if (vLimits.end > furthestLimits.b) { + furthestLimits.b = vLimits.end; + furthestAngles.b = angleRadians; + } + } + + scale.setReductions(scale.drawingArea, furthestLimits, furthestAngles); + } + + function getTextAlignForAngle(angle) { + if (angle === 0 || angle === 180) { + return 'center'; + } else if (angle < 180) { + return 'left'; + } + + return 'right'; + } + + function fillText(ctx, text, position, lineHeight) { + var y = position.y + lineHeight / 2; + var i, ilen; + + if (helpers$1.isArray(text)) { + for (i = 0, ilen = text.length; i < ilen; ++i) { + ctx.fillText(text[i], position.x, y); + y += lineHeight; + } + } else { + ctx.fillText(text, position.x, y); + } + } + + function adjustPointPositionForLabelHeight(angle, textSize, position) { + if (angle === 90 || angle === 270) { + position.y -= (textSize.h / 2); + } else if (angle > 270 || angle < 90) { + position.y -= textSize.h; + } + } + + function drawPointLabels(scale) { + var ctx = scale.ctx; + var opts = scale.options; + var angleLineOpts = opts.angleLines; + var gridLineOpts = opts.gridLines; + var pointLabelOpts = opts.pointLabels; + var lineWidth = valueOrDefault$b(angleLineOpts.lineWidth, gridLineOpts.lineWidth); + var lineColor = valueOrDefault$b(angleLineOpts.color, gridLineOpts.color); + var tickBackdropHeight = getTickBackdropHeight(opts); + + ctx.save(); + ctx.lineWidth = lineWidth; + ctx.strokeStyle = lineColor; + if (ctx.setLineDash) { + ctx.setLineDash(resolve$7([angleLineOpts.borderDash, gridLineOpts.borderDash, []])); + ctx.lineDashOffset = resolve$7([angleLineOpts.borderDashOffset, gridLineOpts.borderDashOffset, 0.0]); + } + + var outerDistance = scale.getDistanceFromCenterForValue(opts.ticks.reverse ? scale.min : scale.max); + + // Point Label Font + var plFont = helpers$1.options._parseFont(pointLabelOpts); + + ctx.font = plFont.string; + ctx.textBaseline = 'middle'; + + for (var i = getValueCount(scale) - 1; i >= 0; i--) { + if (angleLineOpts.display && lineWidth && lineColor) { + var outerPosition = scale.getPointPosition(i, outerDistance); + ctx.beginPath(); + ctx.moveTo(scale.xCenter, scale.yCenter); + ctx.lineTo(outerPosition.x, outerPosition.y); + ctx.stroke(); + } + + if (pointLabelOpts.display) { + // Extra pixels out for some label spacing + var extra = (i === 0 ? tickBackdropHeight / 2 : 0); + var pointLabelPosition = scale.getPointPosition(i, outerDistance + extra + 5); + + // Keep this in loop since we may support array properties here + var pointLabelFontColor = valueAtIndexOrDefault$1(pointLabelOpts.fontColor, i, core_defaults.global.defaultFontColor); + ctx.fillStyle = pointLabelFontColor; + + var angleRadians = scale.getIndexAngle(i); + var angle = helpers$1.toDegrees(angleRadians); + ctx.textAlign = getTextAlignForAngle(angle); + adjustPointPositionForLabelHeight(angle, scale._pointLabelSizes[i], pointLabelPosition); + fillText(ctx, scale.pointLabels[i] || '', pointLabelPosition, plFont.lineHeight); + } + } + ctx.restore(); + } + + function drawRadiusLine(scale, gridLineOpts, radius, index) { + var ctx = scale.ctx; + var circular = gridLineOpts.circular; + var valueCount = getValueCount(scale); + var lineColor = valueAtIndexOrDefault$1(gridLineOpts.color, index - 1); + var lineWidth = valueAtIndexOrDefault$1(gridLineOpts.lineWidth, index - 1); + var pointPosition; + + if ((!circular && !valueCount) || !lineColor || !lineWidth) { + return; + } + + ctx.save(); + ctx.strokeStyle = lineColor; + ctx.lineWidth = lineWidth; + if (ctx.setLineDash) { + ctx.setLineDash(gridLineOpts.borderDash || []); + ctx.lineDashOffset = gridLineOpts.borderDashOffset || 0.0; + } + + ctx.beginPath(); + if (circular) { + // Draw circular arcs between the points + ctx.arc(scale.xCenter, scale.yCenter, radius, 0, Math.PI * 2); + } else { + // Draw straight lines connecting each index + pointPosition = scale.getPointPosition(0, radius); + ctx.moveTo(pointPosition.x, pointPosition.y); + + for (var i = 1; i < valueCount; i++) { + pointPosition = scale.getPointPosition(i, radius); + ctx.lineTo(pointPosition.x, pointPosition.y); + } + } + ctx.closePath(); + ctx.stroke(); + ctx.restore(); + } + + function numberOrZero(param) { + return helpers$1.isNumber(param) ? param : 0; + } + + var scale_radialLinear = scale_linearbase.extend({ + setDimensions: function () { + var me = this; + + // Set the unconstrained dimension before label rotation + me.width = me.maxWidth; + me.height = me.maxHeight; + me.paddingTop = getTickBackdropHeight(me.options) / 2; + me.xCenter = Math.floor(me.width / 2); + me.yCenter = Math.floor((me.height - me.paddingTop) / 2); + me.drawingArea = Math.min(me.height - me.paddingTop, me.width) / 2; + }, + + determineDataLimits: function () { + var me = this; + var chart = me.chart; + var min = Number.POSITIVE_INFINITY; + var max = Number.NEGATIVE_INFINITY; + + helpers$1.each(chart.data.datasets, function (dataset, datasetIndex) { + if (chart.isDatasetVisible(datasetIndex)) { + var meta = chart.getDatasetMeta(datasetIndex); + + helpers$1.each(dataset.data, function (rawValue, index) { + var value = +me.getRightValue(rawValue); + if (isNaN(value) || meta.data[index].hidden) { + return; } - }, {}], 12: [function (t, e, i) { - "use strict"; - e.exports = function (t) { - t.PolarArea = function (e, i) { - return i.type = "polarArea", new t(e, i) - } + + min = Math.min(value, min); + max = Math.max(value, max); + }); + } + }); + + me.min = (min === Number.POSITIVE_INFINITY ? 0 : min); + me.max = (max === Number.NEGATIVE_INFINITY ? 0 : max); + + // Common base implementation to handle ticks.min, ticks.max, ticks.beginAtZero + me.handleTickRangeOptions(); + }, + + // Returns the maximum number of ticks based on the scale dimension + _computeTickLimit: function () { + return Math.ceil(this.drawingArea / getTickBackdropHeight(this.options)); + }, + + convertTicksToLabels: function () { + var me = this; + + scale_linearbase.prototype.convertTicksToLabels.call(me); + + // Point labels + me.pointLabels = me.chart.data.labels.map(me.options.pointLabels.callback, me); + }, + + getLabelForIndex: function (index, datasetIndex) { + return +this.getRightValue(this.chart.data.datasets[datasetIndex].data[index]); + }, + + fit: function () { + var me = this; + var opts = me.options; + + if (opts.display && opts.pointLabels.display) { + fitWithPointLabels(me); + } else { + me.setCenterPoint(0, 0, 0, 0); + } + }, + + /** + * Set radius reductions and determine new radius and center point + * @private + */ + setReductions: function (largestPossibleRadius, furthestLimits, furthestAngles) { + var me = this; + var radiusReductionLeft = furthestLimits.l / Math.sin(furthestAngles.l); + var radiusReductionRight = Math.max(furthestLimits.r - me.width, 0) / Math.sin(furthestAngles.r); + var radiusReductionTop = -furthestLimits.t / Math.cos(furthestAngles.t); + var radiusReductionBottom = -Math.max(furthestLimits.b - (me.height - me.paddingTop), 0) / Math.cos(furthestAngles.b); + + radiusReductionLeft = numberOrZero(radiusReductionLeft); + radiusReductionRight = numberOrZero(radiusReductionRight); + radiusReductionTop = numberOrZero(radiusReductionTop); + radiusReductionBottom = numberOrZero(radiusReductionBottom); + + me.drawingArea = Math.min( + Math.floor(largestPossibleRadius - (radiusReductionLeft + radiusReductionRight) / 2), + Math.floor(largestPossibleRadius - (radiusReductionTop + radiusReductionBottom) / 2)); + me.setCenterPoint(radiusReductionLeft, radiusReductionRight, radiusReductionTop, radiusReductionBottom); + }, + + setCenterPoint: function (leftMovement, rightMovement, topMovement, bottomMovement) { + var me = this; + var maxRight = me.width - rightMovement - me.drawingArea; + var maxLeft = leftMovement + me.drawingArea; + var maxTop = topMovement + me.drawingArea; + var maxBottom = (me.height - me.paddingTop) - bottomMovement - me.drawingArea; + + me.xCenter = Math.floor(((maxLeft + maxRight) / 2) + me.left); + me.yCenter = Math.floor(((maxTop + maxBottom) / 2) + me.top + me.paddingTop); + }, + + getIndexAngle: function (index) { + var angleMultiplier = (Math.PI * 2) / getValueCount(this); + var startAngle = this.chart.options && this.chart.options.startAngle ? + this.chart.options.startAngle : + 0; + + var startAngleRadians = startAngle * Math.PI * 2 / 360; + + // Start from the top instead of right, so remove a quarter of the circle + return index * angleMultiplier + startAngleRadians; + }, + + getDistanceFromCenterForValue: function (value) { + var me = this; + + if (value === null) { + return 0; // null always in center + } + + // Take into account half font size + the yPadding of the top value + var scalingFactor = me.drawingArea / (me.max - me.min); + if (me.options.ticks.reverse) { + return (me.max - value) * scalingFactor; + } + return (value - me.min) * scalingFactor; + }, + + getPointPosition: function (index, distanceFromCenter) { + var me = this; + var thisAngle = me.getIndexAngle(index) - (Math.PI / 2); + return { + x: Math.cos(thisAngle) * distanceFromCenter + me.xCenter, + y: Math.sin(thisAngle) * distanceFromCenter + me.yCenter + }; + }, + + getPointPositionForValue: function (index, value) { + return this.getPointPosition(index, this.getDistanceFromCenterForValue(value)); + }, + + getBasePosition: function () { + var me = this; + var min = me.min; + var max = me.max; + + return me.getPointPositionForValue(0, + me.beginAtZero ? 0 : + min < 0 && max < 0 ? max : + min > 0 && max > 0 ? min : + 0); + }, + + draw: function () { + var me = this; + var opts = me.options; + var gridLineOpts = opts.gridLines; + var tickOpts = opts.ticks; + + if (opts.display) { + var ctx = me.ctx; + var startAngle = this.getIndexAngle(0); + var tickFont = helpers$1.options._parseFont(tickOpts); + + if (opts.angleLines.display || opts.pointLabels.display) { + drawPointLabels(me); + } + + helpers$1.each(me.ticks, function (label, index) { + // Don't draw a centre value (if it is minimum) + if (index > 0 || tickOpts.reverse) { + var yCenterOffset = me.getDistanceFromCenterForValue(me.ticksAsNumbers[index]); + + // Draw circular lines around the scale + if (gridLineOpts.display && index !== 0) { + drawRadiusLine(me, gridLineOpts, yCenterOffset, index); } - }, {}], 13: [function (t, e, i) { - "use strict"; - e.exports = function (t) { - t.Radar = function (e, i) { - return i.type = "radar", new t(e, i) - } + + if (tickOpts.display) { + var tickFontColor = valueOrDefault$b(tickOpts.fontColor, core_defaults.global.defaultFontColor); + ctx.font = tickFont.string; + + ctx.save(); + ctx.translate(me.xCenter, me.yCenter); + ctx.rotate(startAngle); + + if (tickOpts.showLabelBackdrop) { + var labelWidth = ctx.measureText(label).width; + ctx.fillStyle = tickOpts.backdropColor; + ctx.fillRect( + -labelWidth / 2 - tickOpts.backdropPaddingX, + -yCenterOffset - tickFont.size / 2 - tickOpts.backdropPaddingY, + labelWidth + tickOpts.backdropPaddingX * 2, + tickFont.size + tickOpts.backdropPaddingY * 2 + ); + } + + ctx.textAlign = 'center'; + ctx.textBaseline = 'middle'; + ctx.fillStyle = tickFontColor; + ctx.fillText(label, 0, -yCenterOffset); + ctx.restore(); } - }, {}], 14: [function (t, e, i) { - "use strict"; - e.exports = function (t) { - t.Scatter = function (e, i) { - return i.type = "scatter", new t(e, i) - } + } + }); + } + } + }); + +// INTERNAL: static default options, registered in src/index.js + var _defaults$3 = defaultConfig$3; + scale_radialLinear._defaults = _defaults$3; + + var valueOrDefault$c = helpers$1.valueOrDefault; + +// Integer constants are from the ES6 spec. + var MIN_INTEGER = Number.MIN_SAFE_INTEGER || -9007199254740991; + var MAX_INTEGER = Number.MAX_SAFE_INTEGER || 9007199254740991; + + var INTERVALS = { + millisecond: { + common: true, + size: 1, + steps: [1, 2, 5, 10, 20, 50, 100, 250, 500] + }, + second: { + common: true, + size: 1000, + steps: [1, 2, 5, 10, 15, 30] + }, + minute: { + common: true, + size: 60000, + steps: [1, 2, 5, 10, 15, 30] + }, + hour: { + common: true, + size: 3600000, + steps: [1, 2, 3, 6, 12] + }, + day: { + common: true, + size: 86400000, + steps: [1, 2, 5] + }, + week: { + common: false, + size: 604800000, + steps: [1, 2, 3, 4] + }, + month: { + common: true, + size: 2.628e9, + steps: [1, 2, 3] + }, + quarter: { + common: false, + size: 7.884e9, + steps: [1, 2, 3, 4] + }, + year: { + common: true, + size: 3.154e10 + } + }; + + var UNITS = Object.keys(INTERVALS); + + function sorter(a, b) { + return a - b; + } + + function arrayUnique(items) { + var hash = {}; + var out = []; + var i, ilen, item; + + for (i = 0, ilen = items.length; i < ilen; ++i) { + item = items[i]; + if (!hash[item]) { + hash[item] = true; + out.push(item); + } + } + + return out; + } + + /** + * Returns an array of {time, pos} objects used to interpolate a specific `time` or position + * (`pos`) on the scale, by searching entries before and after the requested value. `pos` is + * a decimal between 0 and 1: 0 being the start of the scale (left or top) and 1 the other + * extremity (left + width or top + height). Note that it would be more optimized to directly + * store pre-computed pixels, but the scale dimensions are not guaranteed at the time we need + * to create the lookup table. The table ALWAYS contains at least two items: min and max. + * + * @param {number[]} timestamps - timestamps sorted from lowest to highest. + * @param {string} distribution - If 'linear', timestamps will be spread linearly along the min + * and max range, so basically, the table will contains only two items: {min, 0} and {max, 1}. + * If 'series', timestamps will be positioned at the same distance from each other. In this + * case, only timestamps that break the time linearity are registered, meaning that in the + * best case, all timestamps are linear, the table contains only min and max. + */ + function buildLookupTable(timestamps, min, max, distribution) { + if (distribution === 'linear' || !timestamps.length) { + return [ + {time: min, pos: 0}, + {time: max, pos: 1} + ]; + } + + var table = []; + var items = [min]; + var i, ilen, prev, curr, next; + + for (i = 0, ilen = timestamps.length; i < ilen; ++i) { + curr = timestamps[i]; + if (curr > min && curr < max) { + items.push(curr); + } + } + + items.push(max); + + for (i = 0, ilen = items.length; i < ilen; ++i) { + next = items[i + 1]; + prev = items[i - 1]; + curr = items[i]; + + // only add points that breaks the scale linearity + if (prev === undefined || next === undefined || Math.round((next + prev) / 2) !== curr) { + table.push({time: curr, pos: i / (ilen - 1)}); + } + } + + return table; + } + +// @see adapted from https://www.anujgakhar.com/2014/03/01/binary-search-in-javascript/ + function lookup(table, key, value) { + var lo = 0; + var hi = table.length - 1; + var mid, i0, i1; + + while (lo >= 0 && lo <= hi) { + mid = (lo + hi) >> 1; + i0 = table[mid - 1] || null; + i1 = table[mid]; + + if (!i0) { + // given value is outside table (before first item) + return {lo: null, hi: i1}; + } else if (i1[key] < value) { + lo = mid + 1; + } else if (i0[key] > value) { + hi = mid - 1; + } else { + return {lo: i0, hi: i1}; + } + } + + // given value is outside table (after last item) + return {lo: i1, hi: null}; + } + + /** + * Linearly interpolates the given source `value` using the table items `skey` values and + * returns the associated `tkey` value. For example, interpolate(table, 'time', 42, 'pos') + * returns the position for a timestamp equal to 42. If value is out of bounds, values at + * index [0, 1] or [n - 1, n] are used for the interpolation. + */ + function interpolate$1(table, skey, sval, tkey) { + var range = lookup(table, skey, sval); + + // Note: the lookup table ALWAYS contains at least 2 items (min and max) + var prev = !range.lo ? table[0] : !range.hi ? table[table.length - 2] : range.lo; + var next = !range.lo ? table[1] : !range.hi ? table[table.length - 1] : range.hi; + + var span = next[skey] - prev[skey]; + var ratio = span ? (sval - prev[skey]) / span : 0; + var offset = (next[tkey] - prev[tkey]) * ratio; + + return prev[tkey] + offset; + } + + function toTimestamp(scale, input) { + var adapter = scale._adapter; + var options = scale.options.time; + var parser = options.parser; + var format = parser || options.format; + var value = input; + + if (typeof parser === 'function') { + value = parser(value); + } + + // Only parse if its not a timestamp already + if (!helpers$1.isFinite(value)) { + value = typeof format === 'string' + ? adapter.parse(value, format) + : adapter.parse(value); + } + + if (value !== null) { + return +value; + } + + // Labels are in an incompatible format and no `parser` has been provided. + // The user might still use the deprecated `format` option for parsing. + if (!parser && typeof format === 'function') { + value = format(input); + + // `format` could return something else than a timestamp, if so, parse it + if (!helpers$1.isFinite(value)) { + value = adapter.parse(value); + } + } + + return value; + } + + function parse(scale, input) { + if (helpers$1.isNullOrUndef(input)) { + return null; + } + + var options = scale.options.time; + var value = toTimestamp(scale, scale.getRightValue(input)); + if (value === null) { + return value; + } + + if (options.round) { + value = +scale._adapter.startOf(value, options.round); + } + + return value; + } + + /** + * Returns the number of unit to skip to be able to display up to `capacity` number of ticks + * in `unit` for the given `min` / `max` range and respecting the interval steps constraints. + */ + function determineStepSize(min, max, unit, capacity) { + var range = max - min; + var interval = INTERVALS[unit]; + var milliseconds = interval.size; + var steps = interval.steps; + var i, ilen, factor; + + if (!steps) { + return Math.ceil(range / (capacity * milliseconds)); + } + + for (i = 0, ilen = steps.length; i < ilen; ++i) { + factor = steps[i]; + if (Math.ceil(range / (milliseconds * factor)) <= capacity) { + break; + } + } + + return factor; + } + + /** + * Figures out what unit results in an appropriate number of auto-generated ticks + */ + function determineUnitForAutoTicks(minUnit, min, max, capacity) { + var ilen = UNITS.length; + var i, interval, factor; + + for (i = UNITS.indexOf(minUnit); i < ilen - 1; ++i) { + interval = INTERVALS[UNITS[i]]; + factor = interval.steps ? interval.steps[interval.steps.length - 1] : MAX_INTEGER; + + if (interval.common && Math.ceil((max - min) / (factor * interval.size)) <= capacity) { + return UNITS[i]; + } + } + + return UNITS[ilen - 1]; + } + + /** + * Figures out what unit to format a set of ticks with + */ + function determineUnitForFormatting(scale, ticks, minUnit, min, max) { + var ilen = UNITS.length; + var i, unit; + + for (i = ilen - 1; i >= UNITS.indexOf(minUnit); i--) { + unit = UNITS[i]; + if (INTERVALS[unit].common && scale._adapter.diff(max, min, unit) >= ticks.length) { + return unit; + } + } + + return UNITS[minUnit ? UNITS.indexOf(minUnit) : 0]; + } + + function determineMajorUnit(unit) { + for (var i = UNITS.indexOf(unit) + 1, ilen = UNITS.length; i < ilen; ++i) { + if (INTERVALS[UNITS[i]].common) { + return UNITS[i]; + } + } + } + + /** + * Generates a maximum of `capacity` timestamps between min and max, rounded to the + * `minor` unit, aligned on the `major` unit and using the given scale time `options`. + * Important: this method can return ticks outside the min and max range, it's the + * responsibility of the calling code to clamp values if needed. + */ + function generate(scale, min, max, capacity) { + var adapter = scale._adapter; + var options = scale.options; + var timeOpts = options.time; + var minor = timeOpts.unit || determineUnitForAutoTicks(timeOpts.minUnit, min, max, capacity); + var major = determineMajorUnit(minor); + var stepSize = valueOrDefault$c(timeOpts.stepSize, timeOpts.unitStepSize); + var weekday = minor === 'week' ? timeOpts.isoWeekday : false; + var majorTicksEnabled = options.ticks.major.enabled; + var interval = INTERVALS[minor]; + var first = min; + var last = max; + var ticks = []; + var time; + + if (!stepSize) { + stepSize = determineStepSize(min, max, minor, capacity); + } + + // For 'week' unit, handle the first day of week option + if (weekday) { + first = +adapter.startOf(first, 'isoWeek', weekday); + last = +adapter.startOf(last, 'isoWeek', weekday); + } + + // Align first/last ticks on unit + first = +adapter.startOf(first, weekday ? 'day' : minor); + last = +adapter.startOf(last, weekday ? 'day' : minor); + + // Make sure that the last tick include max + if (last < max) { + last = +adapter.add(last, 1, minor); + } + + time = first; + + if (majorTicksEnabled && major && !weekday && !timeOpts.round) { + // Align the first tick on the previous `minor` unit aligned on the `major` unit: + // we first aligned time on the previous `major` unit then add the number of full + // stepSize there is between first and the previous major time. + time = +adapter.startOf(time, major); + time = +adapter.add(time, ~~((first - time) / (interval.size * stepSize)) * stepSize, minor); + } + + for (; time < last; time = +adapter.add(time, stepSize, minor)) { + ticks.push(+time); + } + + ticks.push(+time); + + return ticks; + } + + /** + * Returns the start and end offsets from edges in the form of {start, end} + * where each value is a relative width to the scale and ranges between 0 and 1. + * They add extra margins on the both sides by scaling down the original scale. + * Offsets are added when the `offset` option is true. + */ + function computeOffsets(table, ticks, min, max, options) { + var start = 0; + var end = 0; + var first, last; + + if (options.offset && ticks.length) { + if (!options.time.min) { + first = interpolate$1(table, 'time', ticks[0], 'pos'); + if (ticks.length === 1) { + start = 1 - first; + } else { + start = (interpolate$1(table, 'time', ticks[1], 'pos') - first) / 2; + } + } + if (!options.time.max) { + last = interpolate$1(table, 'time', ticks[ticks.length - 1], 'pos'); + if (ticks.length === 1) { + end = last; + } else { + end = (last - interpolate$1(table, 'time', ticks[ticks.length - 2], 'pos')) / 2; + } + } + } + + return {start: start, end: end}; + } + + function ticksFromTimestamps(scale, values, majorUnit) { + var ticks = []; + var i, ilen, value, major; + + for (i = 0, ilen = values.length; i < ilen; ++i) { + value = values[i]; + major = majorUnit ? value === +scale._adapter.startOf(value, majorUnit) : false; + + ticks.push({ + value: value, + major: major + }); + } + + return ticks; + } + + var defaultConfig$4 = { + position: 'bottom', + + /** + * Data distribution along the scale: + * - 'linear': data are spread according to their time (distances can vary), + * - 'series': data are spread at the same distance from each other. + * @see https://github.com/chartjs/Chart.js/pull/4507 + * @since 2.7.0 + */ + distribution: 'linear', + + /** + * Scale boundary strategy (bypassed by min/max time options) + * - `data`: make sure data are fully visible, ticks outside are removed + * - `ticks`: make sure ticks are fully visible, data outside are truncated + * @see https://github.com/chartjs/Chart.js/pull/4556 + * @since 2.7.0 + */ + bounds: 'data', + + adapters: {}, + time: { + parser: false, // false == a pattern string from https://momentjs.com/docs/#/parsing/string-format/ or a custom callback that converts its argument to a moment + format: false, // DEPRECATED false == date objects, moment object, callback or a pattern string from https://momentjs.com/docs/#/parsing/string-format/ + unit: false, // false == automatic or override with week, month, year, etc. + round: false, // none, or override with week, month, year, etc. + displayFormat: false, // DEPRECATED + isoWeekday: false, // override week start day - see https://momentjs.com/docs/#/get-set/iso-weekday/ + minUnit: 'millisecond', + displayFormats: {} + }, + ticks: { + autoSkip: false, + + /** + * Ticks generation input values: + * - 'auto': generates "optimal" ticks based on scale size and time options. + * - 'data': generates ticks from data (including labels from data {t|x|y} objects). + * - 'labels': generates ticks from user given `data.labels` values ONLY. + * @see https://github.com/chartjs/Chart.js/pull/4507 + * @since 2.7.0 + */ + source: 'auto', + + major: { + enabled: false + } + } + }; + + var scale_time = core_scale.extend({ + initialize: function () { + this.mergeTicksOptions(); + core_scale.prototype.initialize.call(this); + }, + + update: function () { + var me = this; + var options = me.options; + var time = options.time || (options.time = {}); + var adapter = me._adapter = new core_adapters._date(options.adapters.date); + + // DEPRECATIONS: output a message only one time per update + if (time.format) { + console.warn('options.time.format is deprecated and replaced by options.time.parser.'); + } + + // Backward compatibility: before introducing adapter, `displayFormats` was + // supposed to contain *all* unit/string pairs but this can't be resolved + // when loading the scale (adapters are loaded afterward), so let's populate + // missing formats on update + helpers$1.mergeIf(time.displayFormats, adapter.formats()); + + return core_scale.prototype.update.apply(me, arguments); + }, + + /** + * Allows data to be referenced via 't' attribute + */ + getRightValue: function (rawValue) { + if (rawValue && rawValue.t !== undefined) { + rawValue = rawValue.t; + } + return core_scale.prototype.getRightValue.call(this, rawValue); + }, + + determineDataLimits: function () { + var me = this; + var chart = me.chart; + var adapter = me._adapter; + var timeOpts = me.options.time; + var unit = timeOpts.unit || 'day'; + var min = MAX_INTEGER; + var max = MIN_INTEGER; + var timestamps = []; + var datasets = []; + var labels = []; + var i, j, ilen, jlen, data, timestamp; + var dataLabels = chart.data.labels || []; + + // Convert labels to timestamps + for (i = 0, ilen = dataLabels.length; i < ilen; ++i) { + labels.push(parse(me, dataLabels[i])); + } + + // Convert data to timestamps + for (i = 0, ilen = (chart.data.datasets || []).length; i < ilen; ++i) { + if (chart.isDatasetVisible(i)) { + data = chart.data.datasets[i].data; + + // Let's consider that all data have the same format. + if (helpers$1.isObject(data[0])) { + datasets[i] = []; + + for (j = 0, jlen = data.length; j < jlen; ++j) { + timestamp = parse(me, data[j]); + timestamps.push(timestamp); + datasets[i][j] = timestamp; } - }, {}], 15: [function (t, e, i) { - "use strict"; - var n = t(25), a = t(40), r = t(45); - n._set("bar", { - hover: {mode: "label"}, - scales: { - xAxes: [{ - type: "category", - categoryPercentage: .8, - barPercentage: .9, - offset: !0, - gridLines: {offsetGridLines: !0} - }], yAxes: [{type: "linear"}] - } - }), n._set("horizontalBar", { - hover: {mode: "index", axis: "y"}, - scales: { - xAxes: [{type: "linear", position: "bottom"}], - yAxes: [{ - position: "left", - type: "category", - categoryPercentage: .8, - barPercentage: .9, - offset: !0, - gridLines: {offsetGridLines: !0} - }] - }, - elements: {rectangle: {borderSkipped: "left"}}, - tooltips: { - callbacks: { - title: function (t, e) { - var i = ""; - return t.length > 0 && (t[0].yLabel ? i = t[0].yLabel : e.labels.length > 0 && t[0].index < e.labels.length && (i = e.labels[t[0].index])), i - }, label: function (t, e) { - return (e.datasets[t.datasetIndex].label || "") + ": " + t.xLabel - } - }, mode: "index", axis: "y" - } - }), e.exports = function (t) { - t.controllers.bar = t.DatasetController.extend({ - dataElementType: a.Rectangle, initialize: function () { - var e; - t.DatasetController.prototype.initialize.apply(this, arguments), (e = this.getMeta()).stack = this.getDataset().stack, e.bar = !0 - }, update: function (t) { - var e, i, n = this.getMeta().data; - for (this._ruler = this.getRuler(), e = 0, i = n.length; e < i; ++e) this.updateElement(n[e], e, t) - }, updateElement: function (t, e, i) { - var n = this, a = n.chart, o = n.getMeta(), s = n.getDataset(), l = t.custom || {}, - u = a.options.elements.rectangle; - t._xScale = n.getScaleForId(o.xAxisID), t._yScale = n.getScaleForId(o.yAxisID), t._datasetIndex = n.index, t._index = e, t._model = { - datasetLabel: s.label, - label: a.data.labels[e], - borderSkipped: l.borderSkipped ? l.borderSkipped : u.borderSkipped, - backgroundColor: l.backgroundColor ? l.backgroundColor : r.valueAtIndexOrDefault(s.backgroundColor, e, u.backgroundColor), - borderColor: l.borderColor ? l.borderColor : r.valueAtIndexOrDefault(s.borderColor, e, u.borderColor), - borderWidth: l.borderWidth ? l.borderWidth : r.valueAtIndexOrDefault(s.borderWidth, e, u.borderWidth) - }, n.updateElementGeometry(t, e, i), t.pivot() - }, updateElementGeometry: function (t, e, i) { - var n = this, a = t._model, r = n.getValueScale(), o = r.getBasePixel(), s = r.isHorizontal(), - l = n._ruler || n.getRuler(), u = n.calculateBarValuePixels(n.index, e), - d = n.calculateBarIndexPixels(n.index, e, l); - a.horizontal = s, a.base = i ? o : u.base, a.x = s ? i ? o : u.head : d.center, a.y = s ? d.center : i ? o : u.head, a.height = s ? d.size : void 0, a.width = s ? void 0 : d.size - }, getValueScaleId: function () { - return this.getMeta().yAxisID - }, getIndexScaleId: function () { - return this.getMeta().xAxisID - }, getValueScale: function () { - return this.getScaleForId(this.getValueScaleId()) - }, getIndexScale: function () { - return this.getScaleForId(this.getIndexScaleId()) - }, _getStacks: function (t) { - var e, i, n = this.chart, a = this.getIndexScale().options.stacked, - r = void 0 === t ? n.data.datasets.length : t + 1, o = []; - for (e = 0; e < r; ++e) (i = n.getDatasetMeta(e)).bar && n.isDatasetVisible(e) && (!1 === a || !0 === a && -1 === o.indexOf(i.stack) || void 0 === a && (void 0 === i.stack || -1 === o.indexOf(i.stack))) && o.push(i.stack); - return o - }, getStackCount: function () { - return this._getStacks().length - }, getStackIndex: function (t, e) { - var i = this._getStacks(t), n = void 0 !== e ? i.indexOf(e) : -1; - return -1 === n ? i.length - 1 : n - }, getRuler: function () { - var t, e, i = this.getIndexScale(), n = this.getStackCount(), a = this.index, - o = i.isHorizontal(), s = o ? i.left : i.top, l = s + (o ? i.width : i.height), u = []; - for (t = 0, e = this.getMeta().data.length; t < e; ++t) u.push(i.getPixelForValue(null, t, a)); - return { - min: r.isNullOrUndef(i.options.barThickness) ? function (t, e) { - var i, n, a, r, o = t.isHorizontal() ? t.width : t.height, s = t.getTicks(); - for (a = 1, r = e.length; a < r; ++a) o = Math.min(o, e[a] - e[a - 1]); - for (a = 0, r = s.length; a < r; ++a) n = t.getPixelForTick(a), o = a > 0 ? Math.min(o, n - i) : o, i = n; - return o - }(i, u) : -1, pixels: u, start: s, end: l, stackCount: n, scale: i - } - }, calculateBarValuePixels: function (t, e) { - var i, n, a, r, o, s, l = this.chart, u = this.getMeta(), d = this.getValueScale(), - h = l.data.datasets, c = d.getRightValue(h[t].data[e]), f = d.options.stacked, g = u.stack, - m = 0; - if (f || void 0 === f && void 0 !== g) for (i = 0; i < t; ++i) (n = l.getDatasetMeta(i)).bar && n.stack === g && n.controller.getValueScaleId() === d.id && l.isDatasetVisible(i) && (a = d.getRightValue(h[i].data[e]), (c < 0 && a < 0 || c >= 0 && a > 0) && (m += a)); - return r = d.getPixelForValue(m), { - size: s = ((o = d.getPixelForValue(m + c)) - r) / 2, - base: r, - head: o, - center: o + s / 2 - } - }, calculateBarIndexPixels: function (t, e, i) { - var n, a, o, s, l, u, d, h, c, f, g, m, p, v, y, b, x, _ = i.scale.options, - k = "flex" === _.barThickness ? (c = e, g = _, p = (f = i).pixels, v = p[c], y = c > 0 ? p[c - 1] : null, b = c < p.length - 1 ? p[c + 1] : null, x = g.categoryPercentage, null === y && (y = v - (null === b ? f.end - v : b - v)), null === b && (b = v + v - y), m = v - (v - y) / 2 * x, { - chunk: (b - y) / 2 * x / f.stackCount, - ratio: g.barPercentage, - start: m - }) : (n = e, a = i, u = (o = _).barThickness, d = a.stackCount, h = a.pixels[n], r.isNullOrUndef(u) ? (s = a.min * o.categoryPercentage, l = o.barPercentage) : (s = u * d, l = 1), { - chunk: s / d, - ratio: l, - start: h - s / 2 - }), w = this.getStackIndex(t, this.getMeta().stack), - M = k.start + k.chunk * w + k.chunk / 2, - S = Math.min(r.valueOrDefault(_.maxBarThickness, 1 / 0), k.chunk * k.ratio); - return {base: M - S / 2, head: M + S / 2, center: M, size: S} - }, draw: function () { - var t = this.chart, e = this.getValueScale(), i = this.getMeta().data, n = this.getDataset(), - a = i.length, o = 0; - for (r.canvas.clipArea(t.ctx, t.chartArea); o < a; ++o) isNaN(e.getRightValue(n.data[o])) || i[o].draw(); - r.canvas.unclipArea(t.ctx) - }, setHoverStyle: function (t) { - var e = this.chart.data.datasets[t._datasetIndex], i = t._index, n = t.custom || {}, - a = t._model; - a.backgroundColor = n.hoverBackgroundColor ? n.hoverBackgroundColor : r.valueAtIndexOrDefault(e.hoverBackgroundColor, i, r.getHoverColor(a.backgroundColor)), a.borderColor = n.hoverBorderColor ? n.hoverBorderColor : r.valueAtIndexOrDefault(e.hoverBorderColor, i, r.getHoverColor(a.borderColor)), a.borderWidth = n.hoverBorderWidth ? n.hoverBorderWidth : r.valueAtIndexOrDefault(e.hoverBorderWidth, i, a.borderWidth) - }, removeHoverStyle: function (t) { - var e = this.chart.data.datasets[t._datasetIndex], i = t._index, n = t.custom || {}, - a = t._model, o = this.chart.options.elements.rectangle; - a.backgroundColor = n.backgroundColor ? n.backgroundColor : r.valueAtIndexOrDefault(e.backgroundColor, i, o.backgroundColor), a.borderColor = n.borderColor ? n.borderColor : r.valueAtIndexOrDefault(e.borderColor, i, o.borderColor), a.borderWidth = n.borderWidth ? n.borderWidth : r.valueAtIndexOrDefault(e.borderWidth, i, o.borderWidth) - } - }), t.controllers.horizontalBar = t.controllers.bar.extend({ - getValueScaleId: function () { - return this.getMeta().xAxisID - }, getIndexScaleId: function () { - return this.getMeta().yAxisID - } - }) + } else { + for (j = 0, jlen = labels.length; j < jlen; ++j) { + timestamps.push(labels[j]); } - }, {25: 25, 40: 40, 45: 45}], 16: [function (t, e, i) { - "use strict"; - var n = t(25), a = t(40), r = t(45); - n._set("bubble", { - hover: {mode: "single"}, - scales: { - xAxes: [{type: "linear", position: "bottom", id: "x-axis-0"}], - yAxes: [{type: "linear", position: "left", id: "y-axis-0"}] - }, - tooltips: { - callbacks: { - title: function () { - return "" - }, label: function (t, e) { - var i = e.datasets[t.datasetIndex].label || "", - n = e.datasets[t.datasetIndex].data[t.index]; - return i + ": (" + t.xLabel + ", " + t.yLabel + ", " + n.r + ")" - } - } - } - }), e.exports = function (t) { - t.controllers.bubble = t.DatasetController.extend({ - dataElementType: a.Point, update: function (t) { - var e = this, i = e.getMeta().data; - r.each(i, function (i, n) { - e.updateElement(i, n, t) - }) - }, updateElement: function (t, e, i) { - var n = this, a = n.getMeta(), r = t.custom || {}, o = n.getScaleForId(a.xAxisID), - s = n.getScaleForId(a.yAxisID), l = n._resolveElementOptions(t, e), - u = n.getDataset().data[e], d = n.index, - h = i ? o.getPixelForDecimal(.5) : o.getPixelForValue("object" == typeof u ? u : NaN, e, d), - c = i ? s.getBasePixel() : s.getPixelForValue(u, e, d); - t._xScale = o, t._yScale = s, t._options = l, t._datasetIndex = d, t._index = e, t._model = { - backgroundColor: l.backgroundColor, - borderColor: l.borderColor, - borderWidth: l.borderWidth, - hitRadius: l.hitRadius, - pointStyle: l.pointStyle, - radius: i ? 0 : l.radius, - skip: r.skip || isNaN(h) || isNaN(c), - x: h, - y: c - }, t.pivot() - }, setHoverStyle: function (t) { - var e = t._model, i = t._options; - e.backgroundColor = r.valueOrDefault(i.hoverBackgroundColor, r.getHoverColor(i.backgroundColor)), e.borderColor = r.valueOrDefault(i.hoverBorderColor, r.getHoverColor(i.borderColor)), e.borderWidth = r.valueOrDefault(i.hoverBorderWidth, i.borderWidth), e.radius = i.radius + i.hoverRadius - }, removeHoverStyle: function (t) { - var e = t._model, i = t._options; - e.backgroundColor = i.backgroundColor, e.borderColor = i.borderColor, e.borderWidth = i.borderWidth, e.radius = i.radius - }, _resolveElementOptions: function (t, e) { - var i, n, a, o = this.chart, s = o.data.datasets[this.index], l = t.custom || {}, - u = o.options.elements.point, d = r.options.resolve, h = s.data[e], c = {}, - f = {chart: o, dataIndex: e, dataset: s, datasetIndex: this.index}, - g = ["backgroundColor", "borderColor", "borderWidth", "hoverBackgroundColor", "hoverBorderColor", "hoverBorderWidth", "hoverRadius", "hitRadius", "pointStyle"]; - for (i = 0, n = g.length; i < n; ++i) c[a = g[i]] = d([l[a], s[a], u[a]], f, e); - return c.radius = d([l.radius, h ? h.r : void 0, s.radius, u.radius], f, e), c - } - }) + datasets[i] = labels.slice(0); + } + } else { + datasets[i] = []; + } + } + + if (labels.length) { + // Sort labels **after** data have been converted + labels = arrayUnique(labels).sort(sorter); + min = Math.min(min, labels[0]); + max = Math.max(max, labels[labels.length - 1]); + } + + if (timestamps.length) { + timestamps = arrayUnique(timestamps).sort(sorter); + min = Math.min(min, timestamps[0]); + max = Math.max(max, timestamps[timestamps.length - 1]); + } + + min = parse(me, timeOpts.min) || min; + max = parse(me, timeOpts.max) || max; + + // In case there is no valid min/max, set limits based on unit time option + min = min === MAX_INTEGER ? +adapter.startOf(Date.now(), unit) : min; + max = max === MIN_INTEGER ? +adapter.endOf(Date.now(), unit) + 1 : max; + + // Make sure that max is strictly higher than min (required by the lookup table) + me.min = Math.min(min, max); + me.max = Math.max(min + 1, max); + + // PRIVATE + me._horizontal = me.isHorizontal(); + me._table = []; + me._timestamps = { + data: timestamps, + datasets: datasets, + labels: labels + }; + }, + + buildTicks: function () { + var me = this; + var min = me.min; + var max = me.max; + var options = me.options; + var timeOpts = options.time; + var timestamps = []; + var ticks = []; + var i, ilen, timestamp; + + switch (options.ticks.source) { + case 'data': + timestamps = me._timestamps.data; + break; + case 'labels': + timestamps = me._timestamps.labels; + break; + case 'auto': + default: + timestamps = generate(me, min, max, me.getLabelCapacity(min), options); + } + + if (options.bounds === 'ticks' && timestamps.length) { + min = timestamps[0]; + max = timestamps[timestamps.length - 1]; + } + + // Enforce limits with user min/max options + min = parse(me, timeOpts.min) || min; + max = parse(me, timeOpts.max) || max; + + // Remove ticks outside the min/max range + for (i = 0, ilen = timestamps.length; i < ilen; ++i) { + timestamp = timestamps[i]; + if (timestamp >= min && timestamp <= max) { + ticks.push(timestamp); + } + } + + me.min = min; + me.max = max; + + // PRIVATE + me._unit = timeOpts.unit || determineUnitForFormatting(me, ticks, timeOpts.minUnit, me.min, me.max); + me._majorUnit = determineMajorUnit(me._unit); + me._table = buildLookupTable(me._timestamps.data, min, max, options.distribution); + me._offsets = computeOffsets(me._table, ticks, min, max, options); + + if (options.ticks.reverse) { + ticks.reverse(); + } + + return ticksFromTimestamps(me, ticks, me._majorUnit); + }, + + getLabelForIndex: function (index, datasetIndex) { + var me = this; + var adapter = me._adapter; + var data = me.chart.data; + var timeOpts = me.options.time; + var label = data.labels && index < data.labels.length ? data.labels[index] : ''; + var value = data.datasets[datasetIndex].data[index]; + + if (helpers$1.isObject(value)) { + label = me.getRightValue(value); + } + if (timeOpts.tooltipFormat) { + return adapter.format(toTimestamp(me, label), timeOpts.tooltipFormat); + } + if (typeof label === 'string') { + return label; + } + return adapter.format(toTimestamp(me, label), timeOpts.displayFormats.datetime); + }, + + /** + * Function to format an individual tick mark + * @private + */ + tickFormatFunction: function (time, index, ticks, format) { + var me = this; + var adapter = me._adapter; + var options = me.options; + var formats = options.time.displayFormats; + var minorFormat = formats[me._unit]; + var majorUnit = me._majorUnit; + var majorFormat = formats[majorUnit]; + var majorTime = +adapter.startOf(time, majorUnit); + var majorTickOpts = options.ticks.major; + var major = majorTickOpts.enabled && majorUnit && majorFormat && time === majorTime; + var label = adapter.format(time, format ? format : major ? majorFormat : minorFormat); + var tickOpts = major ? majorTickOpts : options.ticks.minor; + var formatter = valueOrDefault$c(tickOpts.callback, tickOpts.userCallback); + + return formatter ? formatter(label, index, ticks) : label; + }, + + convertTicksToLabels: function (ticks) { + var labels = []; + var i, ilen; + + for (i = 0, ilen = ticks.length; i < ilen; ++i) { + labels.push(this.tickFormatFunction(ticks[i].value, i, ticks)); + } + + return labels; + }, + + /** + * @private + */ + getPixelForOffset: function (time) { + var me = this; + var isReverse = me.options.ticks.reverse; + var size = me._horizontal ? me.width : me.height; + var start = me._horizontal ? isReverse ? me.right : me.left : isReverse ? me.bottom : me.top; + var pos = interpolate$1(me._table, 'time', time, 'pos'); + var offset = size * (me._offsets.start + pos) / (me._offsets.start + 1 + me._offsets.end); + + return isReverse ? start - offset : start + offset; + }, + + getPixelForValue: function (value, index, datasetIndex) { + var me = this; + var time = null; + + if (index !== undefined && datasetIndex !== undefined) { + time = me._timestamps.datasets[datasetIndex][index]; + } + + if (time === null) { + time = parse(me, value); + } + + if (time !== null) { + return me.getPixelForOffset(time); + } + }, + + getPixelForTick: function (index) { + var ticks = this.getTicks(); + return index >= 0 && index < ticks.length ? + this.getPixelForOffset(ticks[index].value) : + null; + }, + + getValueForPixel: function (pixel) { + var me = this; + var size = me._horizontal ? me.width : me.height; + var start = me._horizontal ? me.left : me.top; + var pos = (size ? (pixel - start) / size : 0) * (me._offsets.start + 1 + me._offsets.start) - me._offsets.end; + var time = interpolate$1(me._table, 'pos', pos, 'time'); + + // DEPRECATION, we should return time directly + return me._adapter._create(time); + }, + + /** + * Crude approximation of what the label width might be + * @private + */ + getLabelWidth: function (label) { + var me = this; + var ticksOpts = me.options.ticks; + var tickLabelWidth = me.ctx.measureText(label).width; + var angle = helpers$1.toRadians(ticksOpts.maxRotation); + var cosRotation = Math.cos(angle); + var sinRotation = Math.sin(angle); + var tickFontSize = valueOrDefault$c(ticksOpts.fontSize, core_defaults.global.defaultFontSize); + + return (tickLabelWidth * cosRotation) + (tickFontSize * sinRotation); + }, + + /** + * @private + */ + getLabelCapacity: function (exampleTime) { + var me = this; + + // pick the longest format (milliseconds) for guestimation + var format = me.options.time.displayFormats.millisecond; + var exampleLabel = me.tickFormatFunction(exampleTime, 0, [], format); + var tickLabelWidth = me.getLabelWidth(exampleLabel); + var innerWidth = me.isHorizontal() ? me.width : me.height; + var capacity = Math.floor(innerWidth / tickLabelWidth); + + return capacity > 0 ? capacity : 1; + } + }); + +// INTERNAL: static default options, registered in src/index.js + var _defaults$4 = defaultConfig$4; + scale_time._defaults = _defaults$4; + + var scales = { + category: scale_category, + linear: scale_linear, + logarithmic: scale_logarithmic, + radialLinear: scale_radialLinear, + time: scale_time + }; + + var moment = createCommonjsModule(function (module, exports) { + (function (global, factory) { + module.exports = factory(); + }(commonjsGlobal, (function () { + var hookCallback; + + function hooks() { + return hookCallback.apply(null, arguments); + } + + // This is done to register the method called with moment() + // without creating circular dependencies. + function setHookCallback(callback) { + hookCallback = callback; + } + + function isArray(input) { + return input instanceof Array || Object.prototype.toString.call(input) === '[object Array]'; + } + + function isObject(input) { + // IE8 will treat undefined and null as object if it wasn't for + // input != null + return input != null && Object.prototype.toString.call(input) === '[object Object]'; + } + + function isObjectEmpty(obj) { + if (Object.getOwnPropertyNames) { + return (Object.getOwnPropertyNames(obj).length === 0); + } else { + var k; + for (k in obj) { + if (obj.hasOwnProperty(k)) { + return false; } - }, {25: 25, 40: 40, 45: 45}], 17: [function (t, e, i) { - "use strict"; - var n = t(25), a = t(40), r = t(45); - n._set("doughnut", { - animation: {animateRotate: !0, animateScale: !1}, - hover: {mode: "single"}, - legendCallback: function (t) { - var e = []; - e.push('<ul class="' + t.id + '-legend">'); - var i = t.data, n = i.datasets, a = i.labels; - if (n.length) for (var r = 0; r < n[0].data.length; ++r) e.push('<li><span style="background-color:' + n[0].backgroundColor[r] + '"></span>'), a[r] && e.push(a[r]), e.push("</li>"); - return e.push("</ul>"), e.join("") - }, - legend: { - labels: { - generateLabels: function (t) { - var e = t.data; - return e.labels.length && e.datasets.length ? e.labels.map(function (i, n) { - var a = t.getDatasetMeta(0), o = e.datasets[0], s = a.data[n], l = s && s.custom || {}, - u = r.valueAtIndexOrDefault, d = t.options.elements.arc; - return { - text: i, - fillStyle: l.backgroundColor ? l.backgroundColor : u(o.backgroundColor, n, d.backgroundColor), - strokeStyle: l.borderColor ? l.borderColor : u(o.borderColor, n, d.borderColor), - lineWidth: l.borderWidth ? l.borderWidth : u(o.borderWidth, n, d.borderWidth), - hidden: isNaN(o.data[n]) || a.data[n].hidden, - index: n - } - }) : [] - } - }, onClick: function (t, e) { - var i, n, a, r = e.index, o = this.chart; - for (i = 0, n = (o.data.datasets || []).length; i < n; ++i) (a = o.getDatasetMeta(i)).data[r] && (a.data[r].hidden = !a.data[r].hidden); - o.update() - } - }, - cutoutPercentage: 50, - rotation: -.5 * Math.PI, - circumference: 2 * Math.PI, - tooltips: { - callbacks: { - title: function () { - return "" - }, label: function (t, e) { - var i = e.labels[t.index], n = ": " + e.datasets[t.datasetIndex].data[t.index]; - return r.isArray(i) ? (i = i.slice())[0] += n : i += n, i - } - } - } - }), n._set("pie", r.clone(n.doughnut)), n._set("pie", {cutoutPercentage: 0}), e.exports = function (t) { - t.controllers.doughnut = t.controllers.pie = t.DatasetController.extend({ - dataElementType: a.Arc, - linkScales: r.noop, - getRingIndex: function (t) { - for (var e = 0, i = 0; i < t; ++i) this.chart.isDatasetVisible(i) && ++e; - return e - }, - update: function (t) { - var e = this, i = e.chart, n = i.chartArea, a = i.options, o = a.elements.arc, - s = n.right - n.left - o.borderWidth, l = n.bottom - n.top - o.borderWidth, - u = Math.min(s, l), d = {x: 0, y: 0}, h = e.getMeta(), c = a.cutoutPercentage, - f = a.circumference; - if (f < 2 * Math.PI) { - var g = a.rotation % (2 * Math.PI), - m = (g += 2 * Math.PI * (g >= Math.PI ? -1 : g < -Math.PI ? 1 : 0)) + f, - p = Math.cos(g), v = Math.sin(g), y = Math.cos(m), b = Math.sin(m), - x = g <= 0 && m >= 0 || g <= 2 * Math.PI && 2 * Math.PI <= m, - _ = g <= .5 * Math.PI && .5 * Math.PI <= m || g <= 2.5 * Math.PI && 2.5 * Math.PI <= m, - k = g <= -Math.PI && -Math.PI <= m || g <= Math.PI && Math.PI <= m, - w = g <= .5 * -Math.PI && .5 * -Math.PI <= m || g <= 1.5 * Math.PI && 1.5 * Math.PI <= m, - M = c / 100, S = k ? -1 : Math.min(p * (p < 0 ? 1 : M), y * (y < 0 ? 1 : M)), - D = w ? -1 : Math.min(v * (v < 0 ? 1 : M), b * (b < 0 ? 1 : M)), - C = x ? 1 : Math.max(p * (p > 0 ? 1 : M), y * (y > 0 ? 1 : M)), - P = _ ? 1 : Math.max(v * (v > 0 ? 1 : M), b * (b > 0 ? 1 : M)), T = .5 * (C - S), - O = .5 * (P - D); - u = Math.min(s / T, l / O), d = {x: -.5 * (C + S), y: -.5 * (P + D)} - } - i.borderWidth = e.getMaxBorderWidth(h.data), i.outerRadius = Math.max((u - i.borderWidth) / 2, 0), i.innerRadius = Math.max(c ? i.outerRadius / 100 * c : 0, 0), i.radiusLength = (i.outerRadius - i.innerRadius) / i.getVisibleDatasetCount(), i.offsetX = d.x * i.outerRadius, i.offsetY = d.y * i.outerRadius, h.total = e.calculateTotal(), e.outerRadius = i.outerRadius - i.radiusLength * e.getRingIndex(e.index), e.innerRadius = Math.max(e.outerRadius - i.radiusLength, 0), r.each(h.data, function (i, n) { - e.updateElement(i, n, t) - }) - }, - updateElement: function (t, e, i) { - var n = this, a = n.chart, o = a.chartArea, s = a.options, l = s.animation, - u = (o.left + o.right) / 2, d = (o.top + o.bottom) / 2, h = s.rotation, c = s.rotation, - f = n.getDataset(), - g = i && l.animateRotate ? 0 : t.hidden ? 0 : n.calculateCircumference(f.data[e]) * (s.circumference / (2 * Math.PI)), - m = i && l.animateScale ? 0 : n.innerRadius, p = i && l.animateScale ? 0 : n.outerRadius, - v = r.valueAtIndexOrDefault; - r.extend(t, { - _datasetIndex: n.index, - _index: e, - _model: { - x: u + a.offsetX, - y: d + a.offsetY, - startAngle: h, - endAngle: c, - circumference: g, - outerRadius: p, - innerRadius: m, - label: v(f.label, e, a.data.labels[e]) - } - }); - var y = t._model; - this.removeHoverStyle(t), i && l.animateRotate || (y.startAngle = 0 === e ? s.rotation : n.getMeta().data[e - 1]._model.endAngle, y.endAngle = y.startAngle + y.circumference), t.pivot() - }, - removeHoverStyle: function (e) { - t.DatasetController.prototype.removeHoverStyle.call(this, e, this.chart.options.elements.arc) - }, - calculateTotal: function () { - var t, e = this.getDataset(), i = this.getMeta(), n = 0; - return r.each(i.data, function (i, a) { - t = e.data[a], isNaN(t) || i.hidden || (n += Math.abs(t)) - }), n - }, - calculateCircumference: function (t) { - var e = this.getMeta().total; - return e > 0 && !isNaN(t) ? 2 * Math.PI * (Math.abs(t) / e) : 0 - }, - getMaxBorderWidth: function (t) { - for (var e, i, n = 0, a = this.index, r = t.length, o = 0; o < r; o++) e = t[o]._model ? t[o]._model.borderWidth : 0, n = (i = t[o]._chart ? t[o]._chart.config.data.datasets[a].hoverBorderWidth : 0) > (n = e > n ? e : n) ? i : n; - return n - } - }) + } + return true; + } + } + + function isUndefined(input) { + return input === void 0; + } + + function isNumber(input) { + return typeof input === 'number' || Object.prototype.toString.call(input) === '[object Number]'; + } + + function isDate(input) { + return input instanceof Date || Object.prototype.toString.call(input) === '[object Date]'; + } + + function map(arr, fn) { + var res = [], i; + for (i = 0; i < arr.length; ++i) { + res.push(fn(arr[i], i)); + } + return res; + } + + function hasOwnProp(a, b) { + return Object.prototype.hasOwnProperty.call(a, b); + } + + function extend(a, b) { + for (var i in b) { + if (hasOwnProp(b, i)) { + a[i] = b[i]; + } + } + + if (hasOwnProp(b, 'toString')) { + a.toString = b.toString; + } + + if (hasOwnProp(b, 'valueOf')) { + a.valueOf = b.valueOf; + } + + return a; + } + + function createUTC(input, format, locale, strict) { + return createLocalOrUTC(input, format, locale, strict, true).utc(); + } + + function defaultParsingFlags() { + // We need to deep clone this object. + return { + empty: false, + unusedTokens: [], + unusedInput: [], + overflow: -2, + charsLeftOver: 0, + nullInput: false, + invalidMonth: null, + invalidFormat: false, + userInvalidated: false, + iso: false, + parsedDateParts: [], + meridiem: null, + rfc2822: false, + weekdayMismatch: false + }; + } + + function getParsingFlags(m) { + if (m._pf == null) { + m._pf = defaultParsingFlags(); + } + return m._pf; + } + + var some; + if (Array.prototype.some) { + some = Array.prototype.some; + } else { + some = function (fun) { + var t = Object(this); + var len = t.length >>> 0; + + for (var i = 0; i < len; i++) { + if (i in t && fun.call(this, t[i], i, t)) { + return true; } - }, {25: 25, 40: 40, 45: 45}], 18: [function (t, e, i) { - "use strict"; - var n = t(25), a = t(40), r = t(45); - n._set("line", { - showLines: !0, - spanGaps: !1, - hover: {mode: "label"}, - scales: {xAxes: [{type: "category", id: "x-axis-0"}], yAxes: [{type: "linear", id: "y-axis-0"}]} - }), e.exports = function (t) { - function e(t, e) { - return r.valueOrDefault(t.showLine, e.showLines) - } + } + + return false; + }; + } + + function isValid(m) { + if (m._isValid == null) { + var flags = getParsingFlags(m); + var parsedParts = some.call(flags.parsedDateParts, function (i) { + return i != null; + }); + var isNowValid = !isNaN(m._d.getTime()) && + flags.overflow < 0 && + !flags.empty && + !flags.invalidMonth && + !flags.invalidWeekday && + !flags.weekdayMismatch && + !flags.nullInput && + !flags.invalidFormat && + !flags.userInvalidated && + (!flags.meridiem || (flags.meridiem && parsedParts)); + + if (m._strict) { + isNowValid = isNowValid && + flags.charsLeftOver === 0 && + flags.unusedTokens.length === 0 && + flags.bigHour === undefined; + } - t.controllers.line = t.DatasetController.extend({ - datasetElementType: a.Line, - dataElementType: a.Point, - update: function (t) { - var i, n, a, o = this, s = o.getMeta(), l = s.dataset, u = s.data || [], d = o.chart.options, - h = d.elements.line, c = o.getScaleForId(s.yAxisID), f = o.getDataset(), g = e(f, d); - for (g && (a = l.custom || {}, void 0 !== f.tension && void 0 === f.lineTension && (f.lineTension = f.tension), l._scale = c, l._datasetIndex = o.index, l._children = u, l._model = { - spanGaps: f.spanGaps ? f.spanGaps : d.spanGaps, - tension: a.tension ? a.tension : r.valueOrDefault(f.lineTension, h.tension), - backgroundColor: a.backgroundColor ? a.backgroundColor : f.backgroundColor || h.backgroundColor, - borderWidth: a.borderWidth ? a.borderWidth : f.borderWidth || h.borderWidth, - borderColor: a.borderColor ? a.borderColor : f.borderColor || h.borderColor, - borderCapStyle: a.borderCapStyle ? a.borderCapStyle : f.borderCapStyle || h.borderCapStyle, - borderDash: a.borderDash ? a.borderDash : f.borderDash || h.borderDash, - borderDashOffset: a.borderDashOffset ? a.borderDashOffset : f.borderDashOffset || h.borderDashOffset, - borderJoinStyle: a.borderJoinStyle ? a.borderJoinStyle : f.borderJoinStyle || h.borderJoinStyle, - fill: a.fill ? a.fill : void 0 !== f.fill ? f.fill : h.fill, - steppedLine: a.steppedLine ? a.steppedLine : r.valueOrDefault(f.steppedLine, h.stepped), - cubicInterpolationMode: a.cubicInterpolationMode ? a.cubicInterpolationMode : r.valueOrDefault(f.cubicInterpolationMode, h.cubicInterpolationMode) - }, l.pivot()), i = 0, n = u.length; i < n; ++i) o.updateElement(u[i], i, t); - for (g && 0 !== l._model.tension && o.updateBezierControlPoints(), i = 0, n = u.length; i < n; ++i) u[i].pivot() - }, - getPointBackgroundColor: function (t, e) { - var i = this.chart.options.elements.point.backgroundColor, n = this.getDataset(), - a = t.custom || {}; - return a.backgroundColor ? i = a.backgroundColor : n.pointBackgroundColor ? i = r.valueAtIndexOrDefault(n.pointBackgroundColor, e, i) : n.backgroundColor && (i = n.backgroundColor), i - }, - getPointBorderColor: function (t, e) { - var i = this.chart.options.elements.point.borderColor, n = this.getDataset(), - a = t.custom || {}; - return a.borderColor ? i = a.borderColor : n.pointBorderColor ? i = r.valueAtIndexOrDefault(n.pointBorderColor, e, i) : n.borderColor && (i = n.borderColor), i - }, - getPointBorderWidth: function (t, e) { - var i = this.chart.options.elements.point.borderWidth, n = this.getDataset(), - a = t.custom || {}; - return isNaN(a.borderWidth) ? !isNaN(n.pointBorderWidth) || r.isArray(n.pointBorderWidth) ? i = r.valueAtIndexOrDefault(n.pointBorderWidth, e, i) : isNaN(n.borderWidth) || (i = n.borderWidth) : i = a.borderWidth, i - }, - updateElement: function (t, e, i) { - var n, a, o = this, s = o.getMeta(), l = t.custom || {}, u = o.getDataset(), d = o.index, - h = u.data[e], c = o.getScaleForId(s.yAxisID), f = o.getScaleForId(s.xAxisID), - g = o.chart.options.elements.point; - void 0 !== u.radius && void 0 === u.pointRadius && (u.pointRadius = u.radius), void 0 !== u.hitRadius && void 0 === u.pointHitRadius && (u.pointHitRadius = u.hitRadius), n = f.getPixelForValue("object" == typeof h ? h : NaN, e, d), a = i ? c.getBasePixel() : o.calculatePointY(h, e, d), t._xScale = f, t._yScale = c, t._datasetIndex = d, t._index = e, t._model = { - x: n, - y: a, - skip: l.skip || isNaN(n) || isNaN(a), - radius: l.radius || r.valueAtIndexOrDefault(u.pointRadius, e, g.radius), - pointStyle: l.pointStyle || r.valueAtIndexOrDefault(u.pointStyle, e, g.pointStyle), - backgroundColor: o.getPointBackgroundColor(t, e), - borderColor: o.getPointBorderColor(t, e), - borderWidth: o.getPointBorderWidth(t, e), - tension: s.dataset._model ? s.dataset._model.tension : 0, - steppedLine: !!s.dataset._model && s.dataset._model.steppedLine, - hitRadius: l.hitRadius || r.valueAtIndexOrDefault(u.pointHitRadius, e, g.hitRadius) - } - }, - calculatePointY: function (t, e, i) { - var n, a, r, o = this.chart, s = this.getMeta(), l = this.getScaleForId(s.yAxisID), u = 0, - d = 0; - if (l.options.stacked) { - for (n = 0; n < i; n++) if (a = o.data.datasets[n], "line" === (r = o.getDatasetMeta(n)).type && r.yAxisID === l.id && o.isDatasetVisible(n)) { - var h = Number(l.getRightValue(a.data[e])); - h < 0 ? d += h || 0 : u += h || 0 - } - var c = Number(l.getRightValue(t)); - return c < 0 ? l.getPixelForValue(d + c) : l.getPixelForValue(u + c) - } - return l.getPixelForValue(t) - }, - updateBezierControlPoints: function () { - var t, e, i, n, a = this.getMeta(), o = this.chart.chartArea, s = a.data || []; - - function l(t, e, i) { - return Math.max(Math.min(t, i), e) - } - - if (a.dataset._model.spanGaps && (s = s.filter(function (t) { - return !t._model.skip - })), "monotone" === a.dataset._model.cubicInterpolationMode) r.splineCurveMonotone(s); else for (t = 0, e = s.length; t < e; ++t) i = s[t]._model, n = r.splineCurve(r.previousItem(s, t)._model, i, r.nextItem(s, t)._model, a.dataset._model.tension), i.controlPointPreviousX = n.previous.x, i.controlPointPreviousY = n.previous.y, i.controlPointNextX = n.next.x, i.controlPointNextY = n.next.y; - if (this.chart.options.elements.line.capBezierPoints) for (t = 0, e = s.length; t < e; ++t) (i = s[t]._model).controlPointPreviousX = l(i.controlPointPreviousX, o.left, o.right), i.controlPointPreviousY = l(i.controlPointPreviousY, o.top, o.bottom), i.controlPointNextX = l(i.controlPointNextX, o.left, o.right), i.controlPointNextY = l(i.controlPointNextY, o.top, o.bottom) - }, - draw: function () { - var t = this.chart, i = this.getMeta(), n = i.data || [], a = t.chartArea, o = n.length, s = 0; - for (r.canvas.clipArea(t.ctx, a), e(this.getDataset(), t.options) && i.dataset.draw(), r.canvas.unclipArea(t.ctx); s < o; ++s) n[s].draw(a) - }, - setHoverStyle: function (t) { - var e = this.chart.data.datasets[t._datasetIndex], i = t._index, n = t.custom || {}, - a = t._model; - a.radius = n.hoverRadius || r.valueAtIndexOrDefault(e.pointHoverRadius, i, this.chart.options.elements.point.hoverRadius), a.backgroundColor = n.hoverBackgroundColor || r.valueAtIndexOrDefault(e.pointHoverBackgroundColor, i, r.getHoverColor(a.backgroundColor)), a.borderColor = n.hoverBorderColor || r.valueAtIndexOrDefault(e.pointHoverBorderColor, i, r.getHoverColor(a.borderColor)), a.borderWidth = n.hoverBorderWidth || r.valueAtIndexOrDefault(e.pointHoverBorderWidth, i, a.borderWidth) - }, - removeHoverStyle: function (t) { - var e = this, i = e.chart.data.datasets[t._datasetIndex], n = t._index, a = t.custom || {}, - o = t._model; - void 0 !== i.radius && void 0 === i.pointRadius && (i.pointRadius = i.radius), o.radius = a.radius || r.valueAtIndexOrDefault(i.pointRadius, n, e.chart.options.elements.point.radius), o.backgroundColor = e.getPointBackgroundColor(t, n), o.borderColor = e.getPointBorderColor(t, n), o.borderWidth = e.getPointBorderWidth(t, n) - } - }) + if (Object.isFrozen == null || !Object.isFrozen(m)) { + m._isValid = isNowValid; + } else { + return isNowValid; + } + } + return m._isValid; + } + + function createInvalid(flags) { + var m = createUTC(NaN); + if (flags != null) { + extend(getParsingFlags(m), flags); + } else { + getParsingFlags(m).userInvalidated = true; + } + + return m; + } + + // Plugins that add properties should also add the key here (null value), + // so we can properly clone ourselves. + var momentProperties = hooks.momentProperties = []; + + function copyConfig(to, from) { + var i, prop, val; + + if (!isUndefined(from._isAMomentObject)) { + to._isAMomentObject = from._isAMomentObject; + } + if (!isUndefined(from._i)) { + to._i = from._i; + } + if (!isUndefined(from._f)) { + to._f = from._f; + } + if (!isUndefined(from._l)) { + to._l = from._l; + } + if (!isUndefined(from._strict)) { + to._strict = from._strict; + } + if (!isUndefined(from._tzm)) { + to._tzm = from._tzm; + } + if (!isUndefined(from._isUTC)) { + to._isUTC = from._isUTC; + } + if (!isUndefined(from._offset)) { + to._offset = from._offset; + } + if (!isUndefined(from._pf)) { + to._pf = getParsingFlags(from); + } + if (!isUndefined(from._locale)) { + to._locale = from._locale; + } + + if (momentProperties.length > 0) { + for (i = 0; i < momentProperties.length; i++) { + prop = momentProperties[i]; + val = from[prop]; + if (!isUndefined(val)) { + to[prop] = val; } - }, {25: 25, 40: 40, 45: 45}], 19: [function (t, e, i) { - "use strict"; - var n = t(25), a = t(40), r = t(45); - n._set("polarArea", { - scale: { - type: "radialLinear", - angleLines: {display: !1}, - gridLines: {circular: !0}, - pointLabels: {display: !1}, - ticks: {beginAtZero: !0} - }, - animation: {animateRotate: !0, animateScale: !0}, - startAngle: -.5 * Math.PI, - legendCallback: function (t) { - var e = []; - e.push('<ul class="' + t.id + '-legend">'); - var i = t.data, n = i.datasets, a = i.labels; - if (n.length) for (var r = 0; r < n[0].data.length; ++r) e.push('<li><span style="background-color:' + n[0].backgroundColor[r] + '"></span>'), a[r] && e.push(a[r]), e.push("</li>"); - return e.push("</ul>"), e.join("") - }, - legend: { - labels: { - generateLabels: function (t) { - var e = t.data; - return e.labels.length && e.datasets.length ? e.labels.map(function (i, n) { - var a = t.getDatasetMeta(0), o = e.datasets[0], s = a.data[n].custom || {}, - l = r.valueAtIndexOrDefault, u = t.options.elements.arc; - return { - text: i, - fillStyle: s.backgroundColor ? s.backgroundColor : l(o.backgroundColor, n, u.backgroundColor), - strokeStyle: s.borderColor ? s.borderColor : l(o.borderColor, n, u.borderColor), - lineWidth: s.borderWidth ? s.borderWidth : l(o.borderWidth, n, u.borderWidth), - hidden: isNaN(o.data[n]) || a.data[n].hidden, - index: n - } - }) : [] - } - }, onClick: function (t, e) { - var i, n, a, r = e.index, o = this.chart; - for (i = 0, n = (o.data.datasets || []).length; i < n; ++i) (a = o.getDatasetMeta(i)).data[r].hidden = !a.data[r].hidden; - o.update() - } - }, - tooltips: { - callbacks: { - title: function () { - return "" - }, label: function (t, e) { - return e.labels[t.index] + ": " + t.yLabel - } - } + } + } + + return to; + } + + var updateInProgress = false; + + // Moment prototype object + function Moment(config) { + copyConfig(this, config); + this._d = new Date(config._d != null ? config._d.getTime() : NaN); + if (!this.isValid()) { + this._d = new Date(NaN); + } + // Prevent infinite loop in case updateOffset creates new moment + // objects. + if (updateInProgress === false) { + updateInProgress = true; + hooks.updateOffset(this); + updateInProgress = false; + } + } + + function isMoment(obj) { + return obj instanceof Moment || (obj != null && obj._isAMomentObject != null); + } + + function absFloor(number) { + if (number < 0) { + // -0 -> 0 + return Math.ceil(number) || 0; + } else { + return Math.floor(number); + } + } + + function toInt(argumentForCoercion) { + var coercedNumber = +argumentForCoercion, + value = 0; + + if (coercedNumber !== 0 && isFinite(coercedNumber)) { + value = absFloor(coercedNumber); + } + + return value; + } + + // compare two arrays, return the number of differences + function compareArrays(array1, array2, dontConvert) { + var len = Math.min(array1.length, array2.length), + lengthDiff = Math.abs(array1.length - array2.length), + diffs = 0, + i; + for (i = 0; i < len; i++) { + if ((dontConvert && array1[i] !== array2[i]) || + (!dontConvert && toInt(array1[i]) !== toInt(array2[i]))) { + diffs++; + } + } + return diffs + lengthDiff; + } + + function warn(msg) { + if (hooks.suppressDeprecationWarnings === false && + (typeof console !== 'undefined') && console.warn) { + console.warn('Deprecation warning: ' + msg); + } + } + + function deprecate(msg, fn) { + var firstTime = true; + + return extend(function () { + if (hooks.deprecationHandler != null) { + hooks.deprecationHandler(null, msg); + } + if (firstTime) { + var args = []; + var arg; + for (var i = 0; i < arguments.length; i++) { + arg = ''; + if (typeof arguments[i] === 'object') { + arg += '\n[' + i + '] '; + for (var key in arguments[0]) { + arg += key + ': ' + arguments[0][key] + ', '; } - }), e.exports = function (t) { - t.controllers.polarArea = t.DatasetController.extend({ - dataElementType: a.Arc, - linkScales: r.noop, - update: function (t) { - var e = this, i = e.chart, n = i.chartArea, a = e.getMeta(), o = i.options, s = o.elements.arc, - l = Math.min(n.right - n.left, n.bottom - n.top); - i.outerRadius = Math.max((l - s.borderWidth / 2) / 2, 0), i.innerRadius = Math.max(o.cutoutPercentage ? i.outerRadius / 100 * o.cutoutPercentage : 1, 0), i.radiusLength = (i.outerRadius - i.innerRadius) / i.getVisibleDatasetCount(), e.outerRadius = i.outerRadius - i.radiusLength * e.index, e.innerRadius = e.outerRadius - i.radiusLength, a.count = e.countVisibleElements(), r.each(a.data, function (i, n) { - e.updateElement(i, n, t) - }) - }, - updateElement: function (t, e, i) { - for (var n = this, a = n.chart, o = n.getDataset(), s = a.options, l = s.animation, u = a.scale, d = a.data.labels, h = n.calculateCircumference(o.data[e]), c = u.xCenter, f = u.yCenter, g = 0, m = n.getMeta(), p = 0; p < e; ++p) isNaN(o.data[p]) || m.data[p].hidden || ++g; - var v = s.startAngle, y = t.hidden ? 0 : u.getDistanceFromCenterForValue(o.data[e]), - b = v + h * g, x = b + (t.hidden ? 0 : h), - _ = l.animateScale ? 0 : u.getDistanceFromCenterForValue(o.data[e]); - r.extend(t, { - _datasetIndex: n.index, - _index: e, - _scale: u, - _model: { - x: c, - y: f, - innerRadius: 0, - outerRadius: i ? _ : y, - startAngle: i && l.animateRotate ? v : b, - endAngle: i && l.animateRotate ? v : x, - label: r.valueAtIndexOrDefault(d, e, d[e]) - } - }), n.removeHoverStyle(t), t.pivot() - }, - removeHoverStyle: function (e) { - t.DatasetController.prototype.removeHoverStyle.call(this, e, this.chart.options.elements.arc) - }, - countVisibleElements: function () { - var t = this.getDataset(), e = this.getMeta(), i = 0; - return r.each(e.data, function (e, n) { - isNaN(t.data[n]) || e.hidden || i++ - }), i - }, - calculateCircumference: function (t) { - var e = this.getMeta().count; - return e > 0 && !isNaN(t) ? 2 * Math.PI / e : 0 - } - }) + arg = arg.slice(0, -2); // Remove trailing comma and space + } else { + arg = arguments[i]; + } + args.push(arg); } - }, {25: 25, 40: 40, 45: 45}], 20: [function (t, e, i) { - "use strict"; - var n = t(25), a = t(40), r = t(45); - n._set("radar", {scale: {type: "radialLinear"}, elements: {line: {tension: 0}}}), e.exports = function (t) { - t.controllers.radar = t.DatasetController.extend({ - datasetElementType: a.Line, - dataElementType: a.Point, - linkScales: r.noop, - update: function (t) { - var e = this, i = e.getMeta(), n = i.dataset, a = i.data, o = n.custom || {}, - s = e.getDataset(), l = e.chart.options.elements.line, u = e.chart.scale; - void 0 !== s.tension && void 0 === s.lineTension && (s.lineTension = s.tension), r.extend(i.dataset, { - _datasetIndex: e.index, - _scale: u, - _children: a, - _loop: !0, - _model: { - tension: o.tension ? o.tension : r.valueOrDefault(s.lineTension, l.tension), - backgroundColor: o.backgroundColor ? o.backgroundColor : s.backgroundColor || l.backgroundColor, - borderWidth: o.borderWidth ? o.borderWidth : s.borderWidth || l.borderWidth, - borderColor: o.borderColor ? o.borderColor : s.borderColor || l.borderColor, - fill: o.fill ? o.fill : void 0 !== s.fill ? s.fill : l.fill, - borderCapStyle: o.borderCapStyle ? o.borderCapStyle : s.borderCapStyle || l.borderCapStyle, - borderDash: o.borderDash ? o.borderDash : s.borderDash || l.borderDash, - borderDashOffset: o.borderDashOffset ? o.borderDashOffset : s.borderDashOffset || l.borderDashOffset, - borderJoinStyle: o.borderJoinStyle ? o.borderJoinStyle : s.borderJoinStyle || l.borderJoinStyle - } - }), i.dataset.pivot(), r.each(a, function (i, n) { - e.updateElement(i, n, t) - }, e), e.updateBezierControlPoints() - }, - updateElement: function (t, e, i) { - var n = this, a = t.custom || {}, o = n.getDataset(), s = n.chart.scale, - l = n.chart.options.elements.point, u = s.getPointPositionForValue(e, o.data[e]); - void 0 !== o.radius && void 0 === o.pointRadius && (o.pointRadius = o.radius), void 0 !== o.hitRadius && void 0 === o.pointHitRadius && (o.pointHitRadius = o.hitRadius), r.extend(t, { - _datasetIndex: n.index, - _index: e, - _scale: s, - _model: { - x: i ? s.xCenter : u.x, - y: i ? s.yCenter : u.y, - tension: a.tension ? a.tension : r.valueOrDefault(o.lineTension, n.chart.options.elements.line.tension), - radius: a.radius ? a.radius : r.valueAtIndexOrDefault(o.pointRadius, e, l.radius), - backgroundColor: a.backgroundColor ? a.backgroundColor : r.valueAtIndexOrDefault(o.pointBackgroundColor, e, l.backgroundColor), - borderColor: a.borderColor ? a.borderColor : r.valueAtIndexOrDefault(o.pointBorderColor, e, l.borderColor), - borderWidth: a.borderWidth ? a.borderWidth : r.valueAtIndexOrDefault(o.pointBorderWidth, e, l.borderWidth), - pointStyle: a.pointStyle ? a.pointStyle : r.valueAtIndexOrDefault(o.pointStyle, e, l.pointStyle), - hitRadius: a.hitRadius ? a.hitRadius : r.valueAtIndexOrDefault(o.pointHitRadius, e, l.hitRadius) - } - }), t._model.skip = a.skip ? a.skip : isNaN(t._model.x) || isNaN(t._model.y) - }, - updateBezierControlPoints: function () { - var t = this.chart.chartArea, e = this.getMeta(); - r.each(e.data, function (i, n) { - var a = i._model, - o = r.splineCurve(r.previousItem(e.data, n, !0)._model, a, r.nextItem(e.data, n, !0)._model, a.tension); - a.controlPointPreviousX = Math.max(Math.min(o.previous.x, t.right), t.left), a.controlPointPreviousY = Math.max(Math.min(o.previous.y, t.bottom), t.top), a.controlPointNextX = Math.max(Math.min(o.next.x, t.right), t.left), a.controlPointNextY = Math.max(Math.min(o.next.y, t.bottom), t.top), i.pivot() - }) - }, - setHoverStyle: function (t) { - var e = this.chart.data.datasets[t._datasetIndex], i = t.custom || {}, n = t._index, - a = t._model; - a.radius = i.hoverRadius ? i.hoverRadius : r.valueAtIndexOrDefault(e.pointHoverRadius, n, this.chart.options.elements.point.hoverRadius), a.backgroundColor = i.hoverBackgroundColor ? i.hoverBackgroundColor : r.valueAtIndexOrDefault(e.pointHoverBackgroundColor, n, r.getHoverColor(a.backgroundColor)), a.borderColor = i.hoverBorderColor ? i.hoverBorderColor : r.valueAtIndexOrDefault(e.pointHoverBorderColor, n, r.getHoverColor(a.borderColor)), a.borderWidth = i.hoverBorderWidth ? i.hoverBorderWidth : r.valueAtIndexOrDefault(e.pointHoverBorderWidth, n, a.borderWidth) - }, - removeHoverStyle: function (t) { - var e = this.chart.data.datasets[t._datasetIndex], i = t.custom || {}, n = t._index, - a = t._model, o = this.chart.options.elements.point; - a.radius = i.radius ? i.radius : r.valueAtIndexOrDefault(e.pointRadius, n, o.radius), a.backgroundColor = i.backgroundColor ? i.backgroundColor : r.valueAtIndexOrDefault(e.pointBackgroundColor, n, o.backgroundColor), a.borderColor = i.borderColor ? i.borderColor : r.valueAtIndexOrDefault(e.pointBorderColor, n, o.borderColor), a.borderWidth = i.borderWidth ? i.borderWidth : r.valueAtIndexOrDefault(e.pointBorderWidth, n, o.borderWidth) - } - }) + warn(msg + '\nArguments: ' + Array.prototype.slice.call(args).join('') + '\n' + (new Error()).stack); + firstTime = false; + } + return fn.apply(this, arguments); + }, fn); + } + + var deprecations = {}; + + function deprecateSimple(name, msg) { + if (hooks.deprecationHandler != null) { + hooks.deprecationHandler(name, msg); + } + if (!deprecations[name]) { + warn(msg); + deprecations[name] = true; + } + } + + hooks.suppressDeprecationWarnings = false; + hooks.deprecationHandler = null; + + function isFunction(input) { + return input instanceof Function || Object.prototype.toString.call(input) === '[object Function]'; + } + + function set(config) { + var prop, i; + for (i in config) { + prop = config[i]; + if (isFunction(prop)) { + this[i] = prop; + } else { + this['_' + i] = prop; + } + } + this._config = config; + // Lenient ordinal parsing accepts just a number in addition to + // number + (possibly) stuff coming from _dayOfMonthOrdinalParse. + // TODO: Remove "ordinalParse" fallback in next major release. + this._dayOfMonthOrdinalParseLenient = new RegExp( + (this._dayOfMonthOrdinalParse.source || this._ordinalParse.source) + + '|' + (/\d{1,2}/).source); + } + + function mergeConfigs(parentConfig, childConfig) { + var res = extend({}, parentConfig), prop; + for (prop in childConfig) { + if (hasOwnProp(childConfig, prop)) { + if (isObject(parentConfig[prop]) && isObject(childConfig[prop])) { + res[prop] = {}; + extend(res[prop], parentConfig[prop]); + extend(res[prop], childConfig[prop]); + } else if (childConfig[prop] != null) { + res[prop] = childConfig[prop]; + } else { + delete res[prop]; } - }, {25: 25, 40: 40, 45: 45}], 21: [function (t, e, i) { - "use strict"; - t(25)._set("scatter", { - hover: {mode: "single"}, - scales: { - xAxes: [{id: "x-axis-1", type: "linear", position: "bottom"}], - yAxes: [{id: "y-axis-1", type: "linear", position: "left"}] - }, - showLines: !1, - tooltips: { - callbacks: { - title: function () { - return "" - }, label: function (t) { - return "(" + t.xLabel + ", " + t.yLabel + ")" - } - } - } - }), e.exports = function (t) { - t.controllers.scatter = t.controllers.line + } + } + for (prop in parentConfig) { + if (hasOwnProp(parentConfig, prop) && + !hasOwnProp(childConfig, prop) && + isObject(parentConfig[prop])) { + // make sure changes to properties don't modify parent config + res[prop] = extend({}, res[prop]); + } + } + return res; + } + + function Locale(config) { + if (config != null) { + this.set(config); + } + } + + var keys; + + if (Object.keys) { + keys = Object.keys; + } else { + keys = function (obj) { + var i, res = []; + for (i in obj) { + if (hasOwnProp(obj, i)) { + res.push(i); } - }, {25: 25}], 22: [function (t, e, i) { - "use strict"; - var n = t(25), a = t(26), r = t(45); - n._set("global", { - animation: { - duration: 1e3, - easing: "easeOutQuart", - onProgress: r.noop, - onComplete: r.noop - } - }), e.exports = function (t) { - t.Animation = a.extend({ - chart: null, - currentStep: 0, - numSteps: 60, - easing: "", - render: null, - onAnimationProgress: null, - onAnimationComplete: null - }), t.animationService = { - frameDuration: 17, - animations: [], - dropFrames: 0, - request: null, - addAnimation: function (t, e, i, n) { - var a, r, o = this.animations; - for (e.chart = t, n || (t.animating = !0), a = 0, r = o.length; a < r; ++a) if (o[a].chart === t) return void(o[a] = e); - o.push(e), 1 === o.length && this.requestAnimationFrame() - }, - cancelAnimation: function (t) { - var e = r.findIndex(this.animations, function (e) { - return e.chart === t - }); - -1 !== e && (this.animations.splice(e, 1), t.animating = !1) - }, - requestAnimationFrame: function () { - var t = this; - null === t.request && (t.request = r.requestAnimFrame.call(window, function () { - t.request = null, t.startDigest() - })) - }, - startDigest: function () { - var t = this, e = Date.now(), i = 0; - t.dropFrames > 1 && (i = Math.floor(t.dropFrames), t.dropFrames = t.dropFrames % 1), t.advance(1 + i); - var n = Date.now(); - t.dropFrames += (n - e) / t.frameDuration, t.animations.length > 0 && t.requestAnimationFrame() - }, - advance: function (t) { - for (var e, i, n = this.animations, a = 0; a < n.length;) i = (e = n[a]).chart, e.currentStep = (e.currentStep || 0) + t, e.currentStep = Math.min(e.currentStep, e.numSteps), r.callback(e.render, [i, e], i), r.callback(e.onAnimationProgress, [e], i), e.currentStep >= e.numSteps ? (r.callback(e.onAnimationComplete, [e], i), i.animating = !1, n.splice(a, 1)) : ++a - } - }, Object.defineProperty(t.Animation.prototype, "animationObject", { - get: function () { - return this - } - }), Object.defineProperty(t.Animation.prototype, "chartInstance", { - get: function () { - return this.chart - }, set: function (t) { - this.chart = t - } - }) + } + return res; + }; + } + + var defaultCalendar = { + sameDay: '[Today at] LT', + nextDay: '[Tomorrow at] LT', + nextWeek: 'dddd [at] LT', + lastDay: '[Yesterday at] LT', + lastWeek: '[Last] dddd [at] LT', + sameElse: 'L' + }; + + function calendar(key, mom, now) { + var output = this._calendar[key] || this._calendar['sameElse']; + return isFunction(output) ? output.call(mom, now) : output; + } + + var defaultLongDateFormat = { + LTS: 'h:mm:ss A', + LT: 'h:mm A', + L: 'MM/DD/YYYY', + LL: 'MMMM D, YYYY', + LLL: 'MMMM D, YYYY h:mm A', + LLLL: 'dddd, MMMM D, YYYY h:mm A' + }; + + function longDateFormat(key) { + var format = this._longDateFormat[key], + formatUpper = this._longDateFormat[key.toUpperCase()]; + + if (format || !formatUpper) { + return format; + } + + this._longDateFormat[key] = formatUpper.replace(/MMMM|MM|DD|dddd/g, function (val) { + return val.slice(1); + }); + + return this._longDateFormat[key]; + } + + var defaultInvalidDate = 'Invalid date'; + + function invalidDate() { + return this._invalidDate; + } + + var defaultOrdinal = '%d'; + var defaultDayOfMonthOrdinalParse = /\d{1,2}/; + + function ordinal(number) { + return this._ordinal.replace('%d', number); + } + + var defaultRelativeTime = { + future: 'in %s', + past: '%s ago', + s: 'a few seconds', + ss: '%d seconds', + m: 'a minute', + mm: '%d minutes', + h: 'an hour', + hh: '%d hours', + d: 'a day', + dd: '%d days', + M: 'a month', + MM: '%d months', + y: 'a year', + yy: '%d years' + }; + + function relativeTime(number, withoutSuffix, string, isFuture) { + var output = this._relativeTime[string]; + return (isFunction(output)) ? + output(number, withoutSuffix, string, isFuture) : + output.replace(/%d/i, number); + } + + function pastFuture(diff, output) { + var format = this._relativeTime[diff > 0 ? 'future' : 'past']; + return isFunction(format) ? format(output) : format.replace(/%s/i, output); + } + + var aliases = {}; + + function addUnitAlias(unit, shorthand) { + var lowerCase = unit.toLowerCase(); + aliases[lowerCase] = aliases[lowerCase + 's'] = aliases[shorthand] = unit; + } + + function normalizeUnits(units) { + return typeof units === 'string' ? aliases[units] || aliases[units.toLowerCase()] : undefined; + } + + function normalizeObjectUnits(inputObject) { + var normalizedInput = {}, + normalizedProp, + prop; + + for (prop in inputObject) { + if (hasOwnProp(inputObject, prop)) { + normalizedProp = normalizeUnits(prop); + if (normalizedProp) { + normalizedInput[normalizedProp] = inputObject[prop]; } - }, {25: 25, 26: 26, 45: 45}], 23: [function (t, e, i) { - "use strict"; - var n = t(25), a = t(45), r = t(28), o = t(30), s = t(48), l = t(31); - e.exports = function (t) { - function e(t) { - return "top" === t || "bottom" === t - } + } + } + + return normalizedInput; + } + + var priorities = {}; + + function addUnitPriority(unit, priority) { + priorities[unit] = priority; + } + + function getPrioritizedUnits(unitsObj) { + var units = []; + for (var u in unitsObj) { + units.push({unit: u, priority: priorities[u]}); + } + units.sort(function (a, b) { + return a.priority - b.priority; + }); + return units; + } + + function zeroFill(number, targetLength, forceSign) { + var absNumber = '' + Math.abs(number), + zerosToFill = targetLength - absNumber.length, + sign = number >= 0; + return (sign ? (forceSign ? '+' : '') : '-') + + Math.pow(10, Math.max(0, zerosToFill)).toString().substr(1) + absNumber; + } + + var formattingTokens = /(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g; + + var localFormattingTokens = /(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g; + + var formatFunctions = {}; + + var formatTokenFunctions = {}; + + // token: 'M' + // padded: ['MM', 2] + // ordinal: 'Mo' + // callback: function () { this.month() + 1 } + function addFormatToken(token, padded, ordinal, callback) { + var func = callback; + if (typeof callback === 'string') { + func = function () { + return this[callback](); + }; + } + if (token) { + formatTokenFunctions[token] = func; + } + if (padded) { + formatTokenFunctions[padded[0]] = function () { + return zeroFill(func.apply(this, arguments), padded[1], padded[2]); + }; + } + if (ordinal) { + formatTokenFunctions[ordinal] = function () { + return this.localeData().ordinal(func.apply(this, arguments), token); + }; + } + } + + function removeFormattingTokens(input) { + if (input.match(/\[[\s\S]/)) { + return input.replace(/^\[|\]$/g, ''); + } + return input.replace(/\\/g, ''); + } + + function makeFormatFunction(format) { + var array = format.match(formattingTokens), i, length; + + for (i = 0, length = array.length; i < length; i++) { + if (formatTokenFunctions[array[i]]) { + array[i] = formatTokenFunctions[array[i]]; + } else { + array[i] = removeFormattingTokens(array[i]); + } + } + + return function (mom) { + var output = '', i; + for (i = 0; i < length; i++) { + output += isFunction(array[i]) ? array[i].call(mom, format) : array[i]; + } + return output; + }; + } + + // format date using native date object + function formatMoment(m, format) { + if (!m.isValid()) { + return m.localeData().invalidDate(); + } + + format = expandFormat(format, m.localeData()); + formatFunctions[format] = formatFunctions[format] || makeFormatFunction(format); + + return formatFunctions[format](m); + } + + function expandFormat(format, locale) { + var i = 5; + + function replaceLongDateFormatTokens(input) { + return locale.longDateFormat(input) || input; + } + + localFormattingTokens.lastIndex = 0; + while (i >= 0 && localFormattingTokens.test(format)) { + format = format.replace(localFormattingTokens, replaceLongDateFormatTokens); + localFormattingTokens.lastIndex = 0; + i -= 1; + } + + return format; + } + + var match1 = /\d/; // 0 - 9 + var match2 = /\d\d/; // 00 - 99 + var match3 = /\d{3}/; // 000 - 999 + var match4 = /\d{4}/; // 0000 - 9999 + var match6 = /[+-]?\d{6}/; // -999999 - 999999 + var match1to2 = /\d\d?/; // 0 - 99 + var match3to4 = /\d\d\d\d?/; // 999 - 9999 + var match5to6 = /\d\d\d\d\d\d?/; // 99999 - 999999 + var match1to3 = /\d{1,3}/; // 0 - 999 + var match1to4 = /\d{1,4}/; // 0 - 9999 + var match1to6 = /[+-]?\d{1,6}/; // -999999 - 999999 + + var matchUnsigned = /\d+/; // 0 - inf + var matchSigned = /[+-]?\d+/; // -inf - inf + + var matchOffset = /Z|[+-]\d\d:?\d\d/gi; // +00:00 -00:00 +0000 -0000 or Z + var matchShortOffset = /Z|[+-]\d\d(?::?\d\d)?/gi; // +00 -00 +00:00 -00:00 +0000 -0000 or Z + + var matchTimestamp = /[+-]?\d+(\.\d{1,3})?/; // 123456789 123456789.123 + + // any word (or two) characters or numbers including two/three word month in arabic. + // includes scottish gaelic two word and hyphenated months + var matchWord = /[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i; + + var regexes = {}; + + function addRegexToken(token, regex, strictRegex) { + regexes[token] = isFunction(regex) ? regex : function (isStrict, localeData) { + return (isStrict && strictRegex) ? strictRegex : regex; + }; + } + + function getParseRegexForToken(token, config) { + if (!hasOwnProp(regexes, token)) { + return new RegExp(unescapeFormat(token)); + } + + return regexes[token](config._strict, config._locale); + } + + // Code from http://stackoverflow.com/questions/3561493/is-there-a-regexp-escape-function-in-javascript + function unescapeFormat(s) { + return regexEscape(s.replace('\\', '').replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g, function (matched, p1, p2, p3, p4) { + return p1 || p2 || p3 || p4; + })); + } + + function regexEscape(s) { + return s.replace(/[-\/\\^$*+?.()|[\]{}]/g, '\\$&'); + } + + var tokens = {}; + + function addParseToken(token, callback) { + var i, func = callback; + if (typeof token === 'string') { + token = [token]; + } + if (isNumber(callback)) { + func = function (input, array) { + array[callback] = toInt(input); + }; + } + for (i = 0; i < token.length; i++) { + tokens[token[i]] = func; + } + } + + function addWeekParseToken(token, callback) { + addParseToken(token, function (input, array, config, token) { + config._w = config._w || {}; + callback(input, config._w, config, token); + }); + } + + function addTimeToArrayFromToken(token, input, config) { + if (input != null && hasOwnProp(tokens, token)) { + tokens[token](input, config._a, config, token); + } + } + + var YEAR = 0; + var MONTH = 1; + var DATE = 2; + var HOUR = 3; + var MINUTE = 4; + var SECOND = 5; + var MILLISECOND = 6; + var WEEK = 7; + var WEEKDAY = 8; + + // FORMATTING + + addFormatToken('Y', 0, 0, function () { + var y = this.year(); + return y <= 9999 ? '' + y : '+' + y; + }); + + addFormatToken(0, ['YY', 2], 0, function () { + return this.year() % 100; + }); + + addFormatToken(0, ['YYYY', 4], 0, 'year'); + addFormatToken(0, ['YYYYY', 5], 0, 'year'); + addFormatToken(0, ['YYYYYY', 6, true], 0, 'year'); + + // ALIASES + + addUnitAlias('year', 'y'); + + // PRIORITIES + + addUnitPriority('year', 1); + + // PARSING + + addRegexToken('Y', matchSigned); + addRegexToken('YY', match1to2, match2); + addRegexToken('YYYY', match1to4, match4); + addRegexToken('YYYYY', match1to6, match6); + addRegexToken('YYYYYY', match1to6, match6); + + addParseToken(['YYYYY', 'YYYYYY'], YEAR); + addParseToken('YYYY', function (input, array) { + array[YEAR] = input.length === 2 ? hooks.parseTwoDigitYear(input) : toInt(input); + }); + addParseToken('YY', function (input, array) { + array[YEAR] = hooks.parseTwoDigitYear(input); + }); + addParseToken('Y', function (input, array) { + array[YEAR] = parseInt(input, 10); + }); + + // HELPERS - t.types = {}, t.instances = {}, t.controllers = {}, a.extend(t.prototype, { - construct: function (e, i) { - var r, o, l = this; - (o = (r = (r = i) || {}).data = r.data || {}).datasets = o.datasets || [], o.labels = o.labels || [], r.options = a.configMerge(n.global, n[r.type], r.options || {}), i = r; - var u = s.acquireContext(e, i), d = u && u.canvas, h = d && d.height, c = d && d.width; - l.id = a.uid(), l.ctx = u, l.canvas = d, l.config = i, l.width = c, l.height = h, l.aspectRatio = h ? c / h : null, l.options = i.options, l._bufferedRender = !1, l.chart = l, l.controller = l, t.instances[l.id] = l, Object.defineProperty(l, "data", { - get: function () { - return l.config.data - }, set: function (t) { - l.config.data = t - } - }), u && d ? (l.initialize(), l.update()) : console.error("Failed to create chart: can't acquire context from the given item") - }, initialize: function () { - var t = this; - return l.notify(t, "beforeInit"), a.retinaScale(t, t.options.devicePixelRatio), t.bindEvents(), t.options.responsive && t.resize(!0), t.ensureScalesHaveIDs(), t.buildOrUpdateScales(), t.initToolTip(), l.notify(t, "afterInit"), t - }, clear: function () { - return a.canvas.clear(this), this - }, stop: function () { - return t.animationService.cancelAnimation(this), this - }, resize: function (t) { - var e = this, i = e.options, n = e.canvas, r = i.maintainAspectRatio && e.aspectRatio || null, - o = Math.max(0, Math.floor(a.getMaximumWidth(n))), - s = Math.max(0, Math.floor(r ? o / r : a.getMaximumHeight(n))); - if ((e.width !== o || e.height !== s) && (n.width = e.width = o, n.height = e.height = s, n.style.width = o + "px", n.style.height = s + "px", a.retinaScale(e, i.devicePixelRatio), !t)) { - var u = {width: o, height: s}; - l.notify(e, "resize", [u]), e.options.onResize && e.options.onResize(e, u), e.stop(), e.update(e.options.responsiveAnimationDuration) - } - }, ensureScalesHaveIDs: function () { - var t = this.options, e = t.scales || {}, i = t.scale; - a.each(e.xAxes, function (t, e) { - t.id = t.id || "x-axis-" + e - }), a.each(e.yAxes, function (t, e) { - t.id = t.id || "y-axis-" + e - }), i && (i.id = i.id || "scale") - }, buildOrUpdateScales: function () { - var i = this, n = i.options, r = i.scales || {}, o = [], - s = Object.keys(r).reduce(function (t, e) { - return t[e] = !1, t - }, {}); - n.scales && (o = o.concat((n.scales.xAxes || []).map(function (t) { - return {options: t, dtype: "category", dposition: "bottom"} - }), (n.scales.yAxes || []).map(function (t) { - return {options: t, dtype: "linear", dposition: "left"} - }))), n.scale && o.push({ - options: n.scale, - dtype: "radialLinear", - isDefault: !0, - dposition: "chartArea" - }), a.each(o, function (n) { - var o = n.options, l = o.id, u = a.valueOrDefault(o.type, n.dtype); - e(o.position) !== e(n.dposition) && (o.position = n.dposition), s[l] = !0; - var d = null; - if (l in r && r[l].type === u) (d = r[l]).options = o, d.ctx = i.ctx, d.chart = i; else { - var h = t.scaleService.getScaleConstructor(u); - if (!h) return; - d = new h({id: l, type: u, options: o, ctx: i.ctx, chart: i}), r[d.id] = d - } - d.mergeTicksOptions(), n.isDefault && (i.scale = d) - }), a.each(s, function (t, e) { - t || delete r[e] - }), i.scales = r, t.scaleService.addScalesToLayout(this) - }, buildOrUpdateControllers: function () { - var e = this, i = [], n = []; - return a.each(e.data.datasets, function (a, r) { - var o = e.getDatasetMeta(r), s = a.type || e.config.type; - if (o.type && o.type !== s && (e.destroyDatasetMeta(r), o = e.getDatasetMeta(r)), o.type = s, i.push(o.type), o.controller) o.controller.updateIndex(r), o.controller.linkScales(); else { - var l = t.controllers[o.type]; - if (void 0 === l) throw new Error('"' + o.type + '" is not a chart type.'); - o.controller = new l(e, r), n.push(o.controller) - } - }, e), n - }, resetElements: function () { - var t = this; - a.each(t.data.datasets, function (e, i) { - t.getDatasetMeta(i).controller.reset() - }, t) - }, reset: function () { - this.resetElements(), this.tooltip.initialize() - }, update: function (e) { - var i, n, r = this; - if (e && "object" == typeof e || (e = { - duration: e, - lazy: arguments[1] - }), n = (i = r).options, a.each(i.scales, function (t) { - o.removeBox(i, t) - }), n = a.configMerge(t.defaults.global, t.defaults[i.config.type], n), i.options = i.config.options = n, i.ensureScalesHaveIDs(), i.buildOrUpdateScales(), i.tooltip._options = n.tooltips, i.tooltip.initialize(), l._invalidate(r), !1 !== l.notify(r, "beforeUpdate")) { - r.tooltip._data = r.data; - var s = r.buildOrUpdateControllers(); - a.each(r.data.datasets, function (t, e) { - r.getDatasetMeta(e).controller.buildOrUpdateElements() - }, r), r.updateLayout(), r.options.animation && r.options.animation.duration && a.each(s, function (t) { - t.reset() - }), r.updateDatasets(), r.tooltip.initialize(), r.lastActive = [], l.notify(r, "afterUpdate"), r._bufferedRender ? r._bufferedRequest = { - duration: e.duration, - easing: e.easing, - lazy: e.lazy - } : r.render(e) - } - }, updateLayout: function () { - !1 !== l.notify(this, "beforeLayout") && (o.update(this, this.width, this.height), l.notify(this, "afterScaleUpdate"), l.notify(this, "afterLayout")) - }, updateDatasets: function () { - if (!1 !== l.notify(this, "beforeDatasetsUpdate")) { - for (var t = 0, e = this.data.datasets.length; t < e; ++t) this.updateDataset(t); - l.notify(this, "afterDatasetsUpdate") - } - }, updateDataset: function (t) { - var e = this.getDatasetMeta(t), i = {meta: e, index: t}; - !1 !== l.notify(this, "beforeDatasetUpdate", [i]) && (e.controller.update(), l.notify(this, "afterDatasetUpdate", [i])) - }, render: function (e) { - var i = this; - e && "object" == typeof e || (e = {duration: e, lazy: arguments[1]}); - var n = e.duration, r = e.lazy; - if (!1 !== l.notify(i, "beforeRender")) { - var o = i.options.animation, s = function (t) { - l.notify(i, "afterRender"), a.callback(o && o.onComplete, [t], i) - }; - if (o && (void 0 !== n && 0 !== n || void 0 === n && 0 !== o.duration)) { - var u = new t.Animation({ - numSteps: (n || o.duration) / 16.66, - easing: e.easing || o.easing, - render: function (t, e) { - var i = a.easing.effects[e.easing], n = e.currentStep, r = n / e.numSteps; - t.draw(i(r), r, n) - }, - onAnimationProgress: o.onProgress, - onAnimationComplete: s - }); - t.animationService.addAnimation(i, u, n, r) - } else i.draw(), s(new t.Animation({numSteps: 0, chart: i})); - return i - } - }, draw: function (t) { - var e = this; - e.clear(), a.isNullOrUndef(t) && (t = 1), e.transition(t), !1 !== l.notify(e, "beforeDraw", [t]) && (a.each(e.boxes, function (t) { - t.draw(e.chartArea) - }, e), e.scale && e.scale.draw(), e.drawDatasets(t), e._drawTooltip(t), l.notify(e, "afterDraw", [t])) - }, transition: function (t) { - for (var e = 0, i = (this.data.datasets || []).length; e < i; ++e) this.isDatasetVisible(e) && this.getDatasetMeta(e).controller.transition(t); - this.tooltip.transition(t) - }, drawDatasets: function (t) { - var e = this; - if (!1 !== l.notify(e, "beforeDatasetsDraw", [t])) { - for (var i = (e.data.datasets || []).length - 1; i >= 0; --i) e.isDatasetVisible(i) && e.drawDataset(i, t); - l.notify(e, "afterDatasetsDraw", [t]) - } - }, drawDataset: function (t, e) { - var i = this.getDatasetMeta(t), n = {meta: i, index: t, easingValue: e}; - !1 !== l.notify(this, "beforeDatasetDraw", [n]) && (i.controller.draw(e), l.notify(this, "afterDatasetDraw", [n])) - }, _drawTooltip: function (t) { - var e = this.tooltip, i = {tooltip: e, easingValue: t}; - !1 !== l.notify(this, "beforeTooltipDraw", [i]) && (e.draw(), l.notify(this, "afterTooltipDraw", [i])) - }, getElementAtEvent: function (t) { - return r.modes.single(this, t) - }, getElementsAtEvent: function (t) { - return r.modes.label(this, t, {intersect: !0}) - }, getElementsAtXAxis: function (t) { - return r.modes["x-axis"](this, t, {intersect: !0}) - }, getElementsAtEventForMode: function (t, e, i) { - var n = r.modes[e]; - return "function" == typeof n ? n(this, t, i) : [] - }, getDatasetAtEvent: function (t) { - return r.modes.dataset(this, t, {intersect: !0}) - }, getDatasetMeta: function (t) { - var e = this.data.datasets[t]; - e._meta || (e._meta = {}); - var i = e._meta[this.id]; - return i || (i = e._meta[this.id] = { - type: null, - data: [], - dataset: null, - controller: null, - hidden: null, - xAxisID: null, - yAxisID: null - }), i - }, getVisibleDatasetCount: function () { - for (var t = 0, e = 0, i = this.data.datasets.length; e < i; ++e) this.isDatasetVisible(e) && t++; - return t - }, isDatasetVisible: function (t) { - var e = this.getDatasetMeta(t); - return "boolean" == typeof e.hidden ? !e.hidden : !this.data.datasets[t].hidden - }, generateLegend: function () { - return this.options.legendCallback(this) - }, destroyDatasetMeta: function (t) { - var e = this.id, i = this.data.datasets[t], n = i._meta && i._meta[e]; - n && (n.controller.destroy(), delete i._meta[e]) - }, destroy: function () { - var e, i, n = this, r = n.canvas; - for (n.stop(), e = 0, i = n.data.datasets.length; e < i; ++e) n.destroyDatasetMeta(e); - r && (n.unbindEvents(), a.canvas.clear(n), s.releaseContext(n.ctx), n.canvas = null, n.ctx = null), l.notify(n, "destroy"), delete t.instances[n.id] - }, toBase64Image: function () { - return this.canvas.toDataURL.apply(this.canvas, arguments) - }, initToolTip: function () { - var e = this; - e.tooltip = new t.Tooltip({ - _chart: e, - _chartInstance: e, - _data: e.data, - _options: e.options.tooltips - }, e) - }, bindEvents: function () { - var t = this, e = t._listeners = {}, i = function () { - t.eventHandler.apply(t, arguments) - }; - a.each(t.options.events, function (n) { - s.addEventListener(t, n, i), e[n] = i - }), t.options.responsive && (i = function () { - t.resize() - }, s.addEventListener(t, "resize", i), e.resize = i) - }, unbindEvents: function () { - var t = this, e = t._listeners; - e && (delete t._listeners, a.each(e, function (e, i) { - s.removeEventListener(t, i, e) - })) - }, updateHoverStyle: function (t, e, i) { - var n, a, r, o = i ? "setHoverStyle" : "removeHoverStyle"; - for (a = 0, r = t.length; a < r; ++a) (n = t[a]) && this.getDatasetMeta(n._datasetIndex).controller[o](n) - }, eventHandler: function (t) { - var e = this, i = e.tooltip; - if (!1 !== l.notify(e, "beforeEvent", [t])) { - e._bufferedRender = !0, e._bufferedRequest = null; - var n = e.handleEvent(t); - i && (n = i._start ? i.handleEvent(t) : n | i.handleEvent(t)), l.notify(e, "afterEvent", [t]); - var a = e._bufferedRequest; - return a ? e.render(a) : n && !e.animating && (e.stop(), e.render(e.options.hover.animationDuration, !0)), e._bufferedRender = !1, e._bufferedRequest = null, e - } - }, handleEvent: function (t) { - var e, i = this, n = i.options || {}, r = n.hover; - return i.lastActive = i.lastActive || [], "mouseout" === t.type ? i.active = [] : i.active = i.getElementsAtEventForMode(t, r.mode, r), a.callback(n.onHover || n.hover.onHover, [t.native, i.active], i), "mouseup" !== t.type && "click" !== t.type || n.onClick && n.onClick.call(i, t.native, i.active), i.lastActive.length && i.updateHoverStyle(i.lastActive, r.mode, !1), i.active.length && r.mode && i.updateHoverStyle(i.active, r.mode, !0), e = !a.arrayEquals(i.active, i.lastActive), i.lastActive = i.active, e - } - }), t.Controller = t + function daysInYear(year) { + return isLeapYear(year) ? 366 : 365; + } + + function isLeapYear(year) { + return (year % 4 === 0 && year % 100 !== 0) || year % 400 === 0; + } + + // HOOKS + + hooks.parseTwoDigitYear = function (input) { + return toInt(input) + (toInt(input) > 68 ? 1900 : 2000); + }; + + // MOMENTS + + var getSetYear = makeGetSet('FullYear', true); + + function getIsLeapYear() { + return isLeapYear(this.year()); + } + + function makeGetSet(unit, keepTime) { + return function (value) { + if (value != null) { + set$1(this, unit, value); + hooks.updateOffset(this, keepTime); + return this; + } else { + return get(this, unit); + } + }; + } + + function get(mom, unit) { + return mom.isValid() ? + mom._d['get' + (mom._isUTC ? 'UTC' : '') + unit]() : NaN; + } + + function set$1(mom, unit, value) { + if (mom.isValid() && !isNaN(value)) { + if (unit === 'FullYear' && isLeapYear(mom.year()) && mom.month() === 1 && mom.date() === 29) { + mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value, mom.month(), daysInMonth(value, mom.month())); + } else { + mom._d['set' + (mom._isUTC ? 'UTC' : '') + unit](value); + } + } + } + + // MOMENTS + + function stringGet(units) { + units = normalizeUnits(units); + if (isFunction(this[units])) { + return this[units](); + } + return this; + } + + + function stringSet(units, value) { + if (typeof units === 'object') { + units = normalizeObjectUnits(units); + var prioritized = getPrioritizedUnits(units); + for (var i = 0; i < prioritized.length; i++) { + this[prioritized[i].unit](units[prioritized[i].unit]); + } + } else { + units = normalizeUnits(units); + if (isFunction(this[units])) { + return this[units](value); + } + } + return this; + } + + function mod(n, x) { + return ((n % x) + x) % x; + } + + var indexOf; + + if (Array.prototype.indexOf) { + indexOf = Array.prototype.indexOf; + } else { + indexOf = function (o) { + // I know + var i; + for (i = 0; i < this.length; ++i) { + if (this[i] === o) { + return i; } - }, {25: 25, 28: 28, 30: 30, 31: 31, 45: 45, 48: 48}], 24: [function (t, e, i) { - "use strict"; - var n = t(45); - e.exports = function (t) { - var e = ["push", "pop", "shift", "splice", "unshift"]; - - function i(t, i) { - var n = t._chartjs; - if (n) { - var a = n.listeners, r = a.indexOf(i); - -1 !== r && a.splice(r, 1), a.length > 0 || (e.forEach(function (e) { - delete t[e] - }), delete t._chartjs) - } - } + } + return -1; + }; + } + + function daysInMonth(year, month) { + if (isNaN(year) || isNaN(month)) { + return NaN; + } + var modMonth = mod(month, 12); + year += (month - modMonth) / 12; + return modMonth === 1 ? (isLeapYear(year) ? 29 : 28) : (31 - modMonth % 7 % 2); + } + + // FORMATTING + + addFormatToken('M', ['MM', 2], 'Mo', function () { + return this.month() + 1; + }); + + addFormatToken('MMM', 0, 0, function (format) { + return this.localeData().monthsShort(this, format); + }); + + addFormatToken('MMMM', 0, 0, function (format) { + return this.localeData().months(this, format); + }); + + // ALIASES + + addUnitAlias('month', 'M'); - t.DatasetController = function (t, e) { - this.initialize(t, e) - }, n.extend(t.DatasetController.prototype, { - datasetElementType: null, - dataElementType: null, - initialize: function (t, e) { - this.chart = t, this.index = e, this.linkScales(), this.addElements() - }, - updateIndex: function (t) { - this.index = t - }, - linkScales: function () { - var t = this, e = t.getMeta(), i = t.getDataset(); - null !== e.xAxisID && e.xAxisID in t.chart.scales || (e.xAxisID = i.xAxisID || t.chart.options.scales.xAxes[0].id), null !== e.yAxisID && e.yAxisID in t.chart.scales || (e.yAxisID = i.yAxisID || t.chart.options.scales.yAxes[0].id) - }, - getDataset: function () { - return this.chart.data.datasets[this.index] - }, - getMeta: function () { - return this.chart.getDatasetMeta(this.index) - }, - getScaleForId: function (t) { - return this.chart.scales[t] - }, - reset: function () { - this.update(!0) - }, - destroy: function () { - this._data && i(this._data, this) - }, - createMetaDataset: function () { - var t = this.datasetElementType; - return t && new t({_chart: this.chart, _datasetIndex: this.index}) - }, - createMetaData: function (t) { - var e = this.dataElementType; - return e && new e({_chart: this.chart, _datasetIndex: this.index, _index: t}) - }, - addElements: function () { - var t, e, i = this.getMeta(), n = this.getDataset().data || [], a = i.data; - for (t = 0, e = n.length; t < e; ++t) a[t] = a[t] || this.createMetaData(t); - i.dataset = i.dataset || this.createMetaDataset() - }, - addElementAndReset: function (t) { - var e = this.createMetaData(t); - this.getMeta().data.splice(t, 0, e), this.updateElement(e, t, !0) - }, - buildOrUpdateElements: function () { - var t, a, r = this, o = r.getDataset(), s = o.data || (o.data = []); - r._data !== s && (r._data && i(r._data, r), a = r, (t = s)._chartjs ? t._chartjs.listeners.push(a) : (Object.defineProperty(t, "_chartjs", { - configurable: !0, - enumerable: !1, - value: {listeners: [a]} - }), e.forEach(function (e) { - var i = "onData" + e.charAt(0).toUpperCase() + e.slice(1), a = t[e]; - Object.defineProperty(t, e, { - configurable: !0, enumerable: !1, value: function () { - var e = Array.prototype.slice.call(arguments), r = a.apply(this, e); - return n.each(t._chartjs.listeners, function (t) { - "function" == typeof t[i] && t[i].apply(t, e) - }), r - } - }) - })), r._data = s), r.resyncElements() - }, - update: n.noop, - transition: function (t) { - for (var e = this.getMeta(), i = e.data || [], n = i.length, a = 0; a < n; ++a) i[a].transition(t); - e.dataset && e.dataset.transition(t) - }, - draw: function () { - var t = this.getMeta(), e = t.data || [], i = e.length, n = 0; - for (t.dataset && t.dataset.draw(); n < i; ++n) e[n].draw() - }, - removeHoverStyle: function (t, e) { - var i = this.chart.data.datasets[t._datasetIndex], a = t._index, r = t.custom || {}, - o = n.valueAtIndexOrDefault, s = t._model; - s.backgroundColor = r.backgroundColor ? r.backgroundColor : o(i.backgroundColor, a, e.backgroundColor), s.borderColor = r.borderColor ? r.borderColor : o(i.borderColor, a, e.borderColor), s.borderWidth = r.borderWidth ? r.borderWidth : o(i.borderWidth, a, e.borderWidth) - }, - setHoverStyle: function (t) { - var e = this.chart.data.datasets[t._datasetIndex], i = t._index, a = t.custom || {}, - r = n.valueAtIndexOrDefault, o = n.getHoverColor, s = t._model; - s.backgroundColor = a.hoverBackgroundColor ? a.hoverBackgroundColor : r(e.hoverBackgroundColor, i, o(s.backgroundColor)), s.borderColor = a.hoverBorderColor ? a.hoverBorderColor : r(e.hoverBorderColor, i, o(s.borderColor)), s.borderWidth = a.hoverBorderWidth ? a.hoverBorderWidth : r(e.hoverBorderWidth, i, s.borderWidth) - }, - resyncElements: function () { - var t = this.getMeta(), e = this.getDataset().data, i = t.data.length, n = e.length; - n < i ? t.data.splice(n, i - n) : n > i && this.insertElements(i, n - i) - }, - insertElements: function (t, e) { - for (var i = 0; i < e; ++i) this.addElementAndReset(t + i) - }, - onDataPush: function () { - this.insertElements(this.getDataset().data.length - 1, arguments.length) - }, - onDataPop: function () { - this.getMeta().data.pop() - }, - onDataShift: function () { - this.getMeta().data.shift() - }, - onDataSplice: function (t, e) { - this.getMeta().data.splice(t, e), this.insertElements(t, arguments.length - 2) - }, - onDataUnshift: function () { - this.insertElements(0, arguments.length) - } - }), t.DatasetController.extend = n.inherits + // PRIORITY + + addUnitPriority('month', 8); + + // PARSING + + addRegexToken('M', match1to2); + addRegexToken('MM', match1to2, match2); + addRegexToken('MMM', function (isStrict, locale) { + return locale.monthsShortRegex(isStrict); + }); + addRegexToken('MMMM', function (isStrict, locale) { + return locale.monthsRegex(isStrict); + }); + + addParseToken(['M', 'MM'], function (input, array) { + array[MONTH] = toInt(input) - 1; + }); + + addParseToken(['MMM', 'MMMM'], function (input, array, config, token) { + var month = config._locale.monthsParse(input, token, config._strict); + // if we didn't find a month name, mark the date as invalid. + if (month != null) { + array[MONTH] = month; + } else { + getParsingFlags(config).invalidMonth = input; + } + }); + + // LOCALES + + var MONTHS_IN_FORMAT = /D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/; + var defaultLocaleMonths = 'January_February_March_April_May_June_July_August_September_October_November_December'.split('_'); + + function localeMonths(m, format) { + if (!m) { + return isArray(this._months) ? this._months : + this._months['standalone']; + } + return isArray(this._months) ? this._months[m.month()] : + this._months[(this._months.isFormat || MONTHS_IN_FORMAT).test(format) ? 'format' : 'standalone'][m.month()]; + } + + var defaultLocaleMonthsShort = 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'); + + function localeMonthsShort(m, format) { + if (!m) { + return isArray(this._monthsShort) ? this._monthsShort : + this._monthsShort['standalone']; + } + return isArray(this._monthsShort) ? this._monthsShort[m.month()] : + this._monthsShort[MONTHS_IN_FORMAT.test(format) ? 'format' : 'standalone'][m.month()]; + } + + function handleStrictParse(monthName, format, strict) { + var i, ii, mom, llc = monthName.toLocaleLowerCase(); + if (!this._monthsParse) { + // this is not used + this._monthsParse = []; + this._longMonthsParse = []; + this._shortMonthsParse = []; + for (i = 0; i < 12; ++i) { + mom = createUTC([2000, i]); + this._shortMonthsParse[i] = this.monthsShort(mom, '').toLocaleLowerCase(); + this._longMonthsParse[i] = this.months(mom, '').toLocaleLowerCase(); + } + } + + if (strict) { + if (format === 'MMM') { + ii = indexOf.call(this._shortMonthsParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._longMonthsParse, llc); + return ii !== -1 ? ii : null; + } + } else { + if (format === 'MMM') { + ii = indexOf.call(this._shortMonthsParse, llc); + if (ii !== -1) { + return ii; } - }, {45: 45}], 25: [function (t, e, i) { - "use strict"; - var n = t(45); - e.exports = { - _set: function (t, e) { - return n.merge(this[t] || (this[t] = {}), e) - } + ii = indexOf.call(this._longMonthsParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._longMonthsParse, llc); + if (ii !== -1) { + return ii; } - }, {45: 45}], 26: [function (t, e, i) { - "use strict"; - var n = t(2), a = t(45); - var r = function (t) { - a.extend(this, t), this.initialize.apply(this, arguments) - }; - a.extend(r.prototype, { - initialize: function () { - this.hidden = !1 - }, pivot: function () { - var t = this; - return t._view || (t._view = a.clone(t._model)), t._start = {}, t - }, transition: function (t) { - var e = this, i = e._model, a = e._start, r = e._view; - return i && 1 !== t ? (r || (r = e._view = {}), a || (a = e._start = {}), function (t, e, i, a) { - var r, o, s, l, u, d, h, c, f, g = Object.keys(i); - for (r = 0, o = g.length; r < o; ++r) if (d = i[s = g[r]], e.hasOwnProperty(s) || (e[s] = d), (l = e[s]) !== d && "_" !== s[0]) { - if (t.hasOwnProperty(s) || (t[s] = l), (h = typeof d) == typeof(u = t[s])) if ("string" === h) { - if ((c = n(u)).valid && (f = n(d)).valid) { - e[s] = f.mix(c, a).rgbString(); - continue - } - } else if ("number" === h && isFinite(u) && isFinite(d)) { - e[s] = u + (d - u) * a; - continue - } - e[s] = d - } - }(a, r, i, t), e) : (e._view = i, e._start = null, e) - }, tooltipPosition: function () { - return {x: this._model.x, y: this._model.y} - }, hasValue: function () { - return a.isNumber(this._model.x) && a.isNumber(this._model.y) - } - }), r.extend = a.inherits, e.exports = r - }, {2: 2, 45: 45}], 27: [function (t, e, i) { - "use strict"; - var n = t(2), a = t(25), r = t(45); - e.exports = function (t) { - function e(t, e, i) { - var n; - return "string" == typeof t ? (n = parseInt(t, 10), -1 !== t.indexOf("%") && (n = n / 100 * e.parentNode[i])) : n = t, n - } + ii = indexOf.call(this._shortMonthsParse, llc); + return ii !== -1 ? ii : null; + } + } + } - function i(t) { - return null != t && "none" !== t - } + function localeMonthsParse(monthName, format, strict) { + var i, mom, regex; - function o(t, n, a) { - var r = document.defaultView, o = t.parentNode, s = r.getComputedStyle(t)[n], - l = r.getComputedStyle(o)[n], u = i(s), d = i(l), h = Number.POSITIVE_INFINITY; - return u || d ? Math.min(u ? e(s, t, a) : h, d ? e(l, o, a) : h) : "none" - } + if (this._monthsParseExact) { + return handleStrictParse.call(this, monthName, format, strict); + } - r.configMerge = function () { - return r.merge(r.clone(arguments[0]), [].slice.call(arguments, 1), { - merger: function (e, i, n, a) { - var o = i[e] || {}, s = n[e]; - "scales" === e ? i[e] = r.scaleMerge(o, s) : "scale" === e ? i[e] = r.merge(o, [t.scaleService.getScaleDefaults(s.type), s]) : r._merger(e, i, n, a) - } - }) - }, r.scaleMerge = function () { - return r.merge(r.clone(arguments[0]), [].slice.call(arguments, 1), { - merger: function (e, i, n, a) { - if ("xAxes" === e || "yAxes" === e) { - var o, s, l, u = n[e].length; - for (i[e] || (i[e] = []), o = 0; o < u; ++o) l = n[e][o], s = r.valueOrDefault(l.type, "xAxes" === e ? "category" : "linear"), o >= i[e].length && i[e].push({}), !i[e][o].type || l.type && l.type !== i[e][o].type ? r.merge(i[e][o], [t.scaleService.getScaleDefaults(s), l]) : r.merge(i[e][o], l) - } else r._merger(e, i, n, a) - } - }) - }, r.where = function (t, e) { - if (r.isArray(t) && Array.prototype.filter) return t.filter(e); - var i = []; - return r.each(t, function (t) { - e(t) && i.push(t) - }), i - }, r.findIndex = Array.prototype.findIndex ? function (t, e, i) { - return t.findIndex(e, i) - } : function (t, e, i) { - i = void 0 === i ? t : i; - for (var n = 0, a = t.length; n < a; ++n) if (e.call(i, t[n], n, t)) return n; - return -1 - }, r.findNextWhere = function (t, e, i) { - r.isNullOrUndef(i) && (i = -1); - for (var n = i + 1; n < t.length; n++) { - var a = t[n]; - if (e(a)) return a - } - }, r.findPreviousWhere = function (t, e, i) { - r.isNullOrUndef(i) && (i = t.length); - for (var n = i - 1; n >= 0; n--) { - var a = t[n]; - if (e(a)) return a - } - }, r.isNumber = function (t) { - return !isNaN(parseFloat(t)) && isFinite(t) - }, r.almostEquals = function (t, e, i) { - return Math.abs(t - e) < i - }, r.almostWhole = function (t, e) { - var i = Math.round(t); - return i - e < t && i + e > t - }, r.max = function (t) { - return t.reduce(function (t, e) { - return isNaN(e) ? t : Math.max(t, e) - }, Number.NEGATIVE_INFINITY) - }, r.min = function (t) { - return t.reduce(function (t, e) { - return isNaN(e) ? t : Math.min(t, e) - }, Number.POSITIVE_INFINITY) - }, r.sign = Math.sign ? function (t) { - return Math.sign(t) - } : function (t) { - return 0 === (t = +t) || isNaN(t) ? t : t > 0 ? 1 : -1 - }, r.log10 = Math.log10 ? function (t) { - return Math.log10(t) - } : function (t) { - var e = Math.log(t) * Math.LOG10E, i = Math.round(e); - return t === Math.pow(10, i) ? i : e - }, r.toRadians = function (t) { - return t * (Math.PI / 180) - }, r.toDegrees = function (t) { - return t * (180 / Math.PI) - }, r.getAngleFromPoint = function (t, e) { - var i = e.x - t.x, n = e.y - t.y, a = Math.sqrt(i * i + n * n), r = Math.atan2(n, i); - return r < -.5 * Math.PI && (r += 2 * Math.PI), {angle: r, distance: a} - }, r.distanceBetweenPoints = function (t, e) { - return Math.sqrt(Math.pow(e.x - t.x, 2) + Math.pow(e.y - t.y, 2)) - }, r.aliasPixel = function (t) { - return t % 2 == 0 ? 0 : .5 - }, r.splineCurve = function (t, e, i, n) { - var a = t.skip ? e : t, r = e, o = i.skip ? e : i, - s = Math.sqrt(Math.pow(r.x - a.x, 2) + Math.pow(r.y - a.y, 2)), - l = Math.sqrt(Math.pow(o.x - r.x, 2) + Math.pow(o.y - r.y, 2)), u = s / (s + l), - d = l / (s + l), h = n * (u = isNaN(u) ? 0 : u), c = n * (d = isNaN(d) ? 0 : d); - return { - previous: {x: r.x - h * (o.x - a.x), y: r.y - h * (o.y - a.y)}, - next: {x: r.x + c * (o.x - a.x), y: r.y + c * (o.y - a.y)} - } - }, r.EPSILON = Number.EPSILON || 1e-14, r.splineCurveMonotone = function (t) { - var e, i, n, a, o, s, l, u, d, h = (t || []).map(function (t) { - return {model: t._model, deltaK: 0, mK: 0} - }), c = h.length; - for (e = 0; e < c; ++e) if (!(n = h[e]).model.skip) { - if (i = e > 0 ? h[e - 1] : null, (a = e < c - 1 ? h[e + 1] : null) && !a.model.skip) { - var f = a.model.x - n.model.x; - n.deltaK = 0 !== f ? (a.model.y - n.model.y) / f : 0 - } - !i || i.model.skip ? n.mK = n.deltaK : !a || a.model.skip ? n.mK = i.deltaK : this.sign(i.deltaK) !== this.sign(n.deltaK) ? n.mK = 0 : n.mK = (i.deltaK + n.deltaK) / 2 - } - for (e = 0; e < c - 1; ++e) n = h[e], a = h[e + 1], n.model.skip || a.model.skip || (r.almostEquals(n.deltaK, 0, this.EPSILON) ? n.mK = a.mK = 0 : (o = n.mK / n.deltaK, s = a.mK / n.deltaK, (u = Math.pow(o, 2) + Math.pow(s, 2)) <= 9 || (l = 3 / Math.sqrt(u), n.mK = o * l * n.deltaK, a.mK = s * l * n.deltaK))); - for (e = 0; e < c; ++e) (n = h[e]).model.skip || (i = e > 0 ? h[e - 1] : null, a = e < c - 1 ? h[e + 1] : null, i && !i.model.skip && (d = (n.model.x - i.model.x) / 3, n.model.controlPointPreviousX = n.model.x - d, n.model.controlPointPreviousY = n.model.y - d * n.mK), a && !a.model.skip && (d = (a.model.x - n.model.x) / 3, n.model.controlPointNextX = n.model.x + d, n.model.controlPointNextY = n.model.y + d * n.mK)) - }, r.nextItem = function (t, e, i) { - return i ? e >= t.length - 1 ? t[0] : t[e + 1] : e >= t.length - 1 ? t[t.length - 1] : t[e + 1] - }, r.previousItem = function (t, e, i) { - return i ? e <= 0 ? t[t.length - 1] : t[e - 1] : e <= 0 ? t[0] : t[e - 1] - }, r.niceNum = function (t, e) { - var i = Math.floor(r.log10(t)), n = t / Math.pow(10, i); - return (e ? n < 1.5 ? 1 : n < 3 ? 2 : n < 7 ? 5 : 10 : n <= 1 ? 1 : n <= 2 ? 2 : n <= 5 ? 5 : 10) * Math.pow(10, i) - }, r.requestAnimFrame = "undefined" == typeof window ? function (t) { - t() - } : window.requestAnimationFrame || window.webkitRequestAnimationFrame || window.mozRequestAnimationFrame || window.oRequestAnimationFrame || window.msRequestAnimationFrame || function (t) { - return window.setTimeout(t, 1e3 / 60) - }, r.getRelativePosition = function (t, e) { - var i, n, a = t.originalEvent || t, o = t.currentTarget || t.srcElement, - s = o.getBoundingClientRect(), l = a.touches; - l && l.length > 0 ? (i = l[0].clientX, n = l[0].clientY) : (i = a.clientX, n = a.clientY); - var u = parseFloat(r.getStyle(o, "padding-left")), d = parseFloat(r.getStyle(o, "padding-top")), - h = parseFloat(r.getStyle(o, "padding-right")), c = parseFloat(r.getStyle(o, "padding-bottom")), - f = s.right - s.left - u - h, g = s.bottom - s.top - d - c; - return { - x: i = Math.round((i - s.left - u) / f * o.width / e.currentDevicePixelRatio), - y: n = Math.round((n - s.top - d) / g * o.height / e.currentDevicePixelRatio) - } - }, r.getConstraintWidth = function (t) { - return o(t, "max-width", "clientWidth") - }, r.getConstraintHeight = function (t) { - return o(t, "max-height", "clientHeight") - }, r.getMaximumWidth = function (t) { - var e = t.parentNode; - if (!e) return t.clientWidth; - var i = parseInt(r.getStyle(e, "padding-left"), 10), - n = parseInt(r.getStyle(e, "padding-right"), 10), a = e.clientWidth - i - n, - o = r.getConstraintWidth(t); - return isNaN(o) ? a : Math.min(a, o) - }, r.getMaximumHeight = function (t) { - var e = t.parentNode; - if (!e) return t.clientHeight; - var i = parseInt(r.getStyle(e, "padding-top"), 10), - n = parseInt(r.getStyle(e, "padding-bottom"), 10), a = e.clientHeight - i - n, - o = r.getConstraintHeight(t); - return isNaN(o) ? a : Math.min(a, o) - }, r.getStyle = function (t, e) { - return t.currentStyle ? t.currentStyle[e] : document.defaultView.getComputedStyle(t, null).getPropertyValue(e) - }, r.retinaScale = function (t, e) { - var i = t.currentDevicePixelRatio = e || window.devicePixelRatio || 1; - if (1 !== i) { - var n = t.canvas, a = t.height, r = t.width; - n.height = a * i, n.width = r * i, t.ctx.scale(i, i), n.style.height || n.style.width || (n.style.height = a + "px", n.style.width = r + "px") - } - }, r.fontString = function (t, e, i) { - return e + " " + t + "px " + i - }, r.longestText = function (t, e, i, n) { - var a = (n = n || {}).data = n.data || {}, o = n.garbageCollect = n.garbageCollect || []; - n.font !== e && (a = n.data = {}, o = n.garbageCollect = [], n.font = e), t.font = e; - var s = 0; - r.each(i, function (e) { - null != e && !0 !== r.isArray(e) ? s = r.measureText(t, a, o, s, e) : r.isArray(e) && r.each(e, function (e) { - null == e || r.isArray(e) || (s = r.measureText(t, a, o, s, e)) - }) - }); - var l = o.length / 2; - if (l > i.length) { - for (var u = 0; u < l; u++) delete a[o[u]]; - o.splice(0, l) - } - return s - }, r.measureText = function (t, e, i, n, a) { - var r = e[a]; - return r || (r = e[a] = t.measureText(a).width, i.push(a)), r > n && (n = r), n - }, r.numberOfLabelLines = function (t) { - var e = 1; - return r.each(t, function (t) { - r.isArray(t) && t.length > e && (e = t.length) - }), e - }, r.color = n ? function (t) { - return t instanceof CanvasGradient && (t = a.global.defaultColor), n(t) - } : function (t) { - return console.error("Color.js not found!"), t - }, r.getHoverColor = function (t) { - return t instanceof CanvasPattern ? t : r.color(t).saturate(.5).darken(.1).rgbString() - } - } - }, {2: 2, 25: 25, 45: 45}], 28: [function (t, e, i) { - "use strict"; - var n = t(45); + if (!this._monthsParse) { + this._monthsParse = []; + this._longMonthsParse = []; + this._shortMonthsParse = []; + } - function a(t, e) { - return t.native ? {x: t.x, y: t.y} : n.getRelativePosition(t, e) - } + // TODO: add sorting + // Sorting makes sure if one month (or abbr) is a prefix of another + // see sorting in computeMonthsParse + for (i = 0; i < 12; i++) { + // make the regex if we don't have it already + mom = createUTC([2000, i]); + if (strict && !this._longMonthsParse[i]) { + this._longMonthsParse[i] = new RegExp('^' + this.months(mom, '').replace('.', '') + '$', 'i'); + this._shortMonthsParse[i] = new RegExp('^' + this.monthsShort(mom, '').replace('.', '') + '$', 'i'); + } + if (!strict && !this._monthsParse[i]) { + regex = '^' + this.months(mom, '') + '|^' + this.monthsShort(mom, ''); + this._monthsParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (strict && format === 'MMMM' && this._longMonthsParse[i].test(monthName)) { + return i; + } else if (strict && format === 'MMM' && this._shortMonthsParse[i].test(monthName)) { + return i; + } else if (!strict && this._monthsParse[i].test(monthName)) { + return i; + } + } + } - function r(t, e) { - var i, n, a, r, o; - for (n = 0, r = t.data.datasets.length; n < r; ++n) if (t.isDatasetVisible(n)) for (a = 0, o = (i = t.getDatasetMeta(n)).data.length; a < o; ++a) { - var s = i.data[a]; - s._view.skip || e(s) - } - } + // MOMENTS - function o(t, e) { - var i = []; - return r(t, function (t) { - t.inRange(e.x, e.y) && i.push(t) - }), i - } + function setMonth(mom, value) { + var dayOfMonth; - function s(t, e, i, n) { - var a = Number.POSITIVE_INFINITY, o = []; - return r(t, function (t) { - if (!i || t.inRange(e.x, e.y)) { - var r = t.getCenterPoint(), s = n(e, r); - s < a ? (o = [t], a = s) : s === a && o.push(t) - } - }), o - } + if (!mom.isValid()) { + // No op + return mom; + } - function l(t) { - var e = -1 !== t.indexOf("x"), i = -1 !== t.indexOf("y"); - return function (t, n) { - var a = e ? Math.abs(t.x - n.x) : 0, r = i ? Math.abs(t.y - n.y) : 0; - return Math.sqrt(Math.pow(a, 2) + Math.pow(r, 2)) - } + if (typeof value === 'string') { + if (/^\d+$/.test(value)) { + value = toInt(value); + } else { + value = mom.localeData().monthsParse(value); + // TODO: Another silent failure? + if (!isNumber(value)) { + return mom; } + } + } - function u(t, e, i) { - var n = a(e, t); - i.axis = i.axis || "x"; - var r = l(i.axis), u = i.intersect ? o(t, n) : s(t, n, !1, r), d = []; - return u.length ? (t.data.datasets.forEach(function (e, i) { - if (t.isDatasetVisible(i)) { - var n = t.getDatasetMeta(i).data[u[0]._index]; - n && !n._view.skip && d.push(n) - } - }), d) : [] - } + dayOfMonth = Math.min(mom.date(), daysInMonth(mom.year(), value)); + mom._d['set' + (mom._isUTC ? 'UTC' : '') + 'Month'](value, dayOfMonth); + return mom; + } - e.exports = { - modes: { - single: function (t, e) { - var i = a(e, t), n = []; - return r(t, function (t) { - if (t.inRange(i.x, i.y)) return n.push(t), n - }), n.slice(0, 1) - }, label: u, index: u, dataset: function (t, e, i) { - var n = a(e, t); - i.axis = i.axis || "xy"; - var r = l(i.axis), u = i.intersect ? o(t, n) : s(t, n, !1, r); - return u.length > 0 && (u = t.getDatasetMeta(u[0]._datasetIndex).data), u - }, "x-axis": function (t, e) { - return u(t, e, {intersect: !1}) - }, point: function (t, e) { - return o(t, a(e, t)) - }, nearest: function (t, e, i) { - var n = a(e, t); - i.axis = i.axis || "xy"; - var r = l(i.axis), o = s(t, n, i.intersect, r); - return o.length > 1 && o.sort(function (t, e) { - var i = t.getArea() - e.getArea(); - return 0 === i && (i = t._datasetIndex - e._datasetIndex), i - }), o.slice(0, 1) - }, x: function (t, e, i) { - var n = a(e, t), o = [], s = !1; - return r(t, function (t) { - t.inXRange(n.x) && o.push(t), t.inRange(n.x, n.y) && (s = !0) - }), i.intersect && !s && (o = []), o - }, y: function (t, e, i) { - var n = a(e, t), o = [], s = !1; - return r(t, function (t) { - t.inYRange(n.y) && o.push(t), t.inRange(n.x, n.y) && (s = !0) - }), i.intersect && !s && (o = []), o - } - } - } - }, {45: 45}], 29: [function (t, e, i) { - "use strict"; - t(25)._set("global", { - responsive: !0, - responsiveAnimationDuration: 0, - maintainAspectRatio: !0, - events: ["mousemove", "mouseout", "click", "touchstart", "touchmove"], - hover: {onHover: null, mode: "nearest", intersect: !0, animationDuration: 400}, - onClick: null, - defaultColor: "rgba(0,0,0,0.1)", - defaultFontColor: "#666", - defaultFontFamily: "'Helvetica Neue', 'Helvetica', 'Arial', sans-serif", - defaultFontSize: 12, - defaultFontStyle: "normal", - showLines: !0, - elements: {}, - layout: {padding: {top: 0, right: 0, bottom: 0, left: 0}} - }), e.exports = function () { - var t = function (t, e) { - return this.construct(t, e), this - }; - return t.Chart = t, t + function getSetMonth(value) { + if (value != null) { + setMonth(this, value); + hooks.updateOffset(this, true); + return this; + } else { + return get(this, 'Month'); + } + } + + function getDaysInMonth() { + return daysInMonth(this.year(), this.month()); + } + + var defaultMonthsShortRegex = matchWord; + + function monthsShortRegex(isStrict) { + if (this._monthsParseExact) { + if (!hasOwnProp(this, '_monthsRegex')) { + computeMonthsParse.call(this); + } + if (isStrict) { + return this._monthsShortStrictRegex; + } else { + return this._monthsShortRegex; + } + } else { + if (!hasOwnProp(this, '_monthsShortRegex')) { + this._monthsShortRegex = defaultMonthsShortRegex; + } + return this._monthsShortStrictRegex && isStrict ? + this._monthsShortStrictRegex : this._monthsShortRegex; + } + } + + var defaultMonthsRegex = matchWord; + + function monthsRegex(isStrict) { + if (this._monthsParseExact) { + if (!hasOwnProp(this, '_monthsRegex')) { + computeMonthsParse.call(this); + } + if (isStrict) { + return this._monthsStrictRegex; + } else { + return this._monthsRegex; + } + } else { + if (!hasOwnProp(this, '_monthsRegex')) { + this._monthsRegex = defaultMonthsRegex; + } + return this._monthsStrictRegex && isStrict ? + this._monthsStrictRegex : this._monthsRegex; + } + } + + function computeMonthsParse() { + function cmpLenRev(a, b) { + return b.length - a.length; + } + + var shortPieces = [], longPieces = [], mixedPieces = [], + i, mom; + for (i = 0; i < 12; i++) { + // make the regex if we don't have it already + mom = createUTC([2000, i]); + shortPieces.push(this.monthsShort(mom, '')); + longPieces.push(this.months(mom, '')); + mixedPieces.push(this.months(mom, '')); + mixedPieces.push(this.monthsShort(mom, '')); + } + // Sorting makes sure if one month (or abbr) is a prefix of another it + // will match the longer piece. + shortPieces.sort(cmpLenRev); + longPieces.sort(cmpLenRev); + mixedPieces.sort(cmpLenRev); + for (i = 0; i < 12; i++) { + shortPieces[i] = regexEscape(shortPieces[i]); + longPieces[i] = regexEscape(longPieces[i]); + } + for (i = 0; i < 24; i++) { + mixedPieces[i] = regexEscape(mixedPieces[i]); + } + + this._monthsRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); + this._monthsShortRegex = this._monthsRegex; + this._monthsStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); + this._monthsShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); + } + + function createDate(y, m, d, h, M, s, ms) { + // can't just apply() to create a date: + // https://stackoverflow.com/q/181348 + var date; + // the date constructor remaps years 0-99 to 1900-1999 + if (y < 100 && y >= 0) { + // preserve leap years using a full 400 year cycle, then reset + date = new Date(y + 400, m, d, h, M, s, ms); + if (isFinite(date.getFullYear())) { + date.setFullYear(y); + } + } else { + date = new Date(y, m, d, h, M, s, ms); + } + + return date; + } + + function createUTCDate(y) { + var date; + // the Date.UTC function remaps years 0-99 to 1900-1999 + if (y < 100 && y >= 0) { + var args = Array.prototype.slice.call(arguments); + // preserve leap years using a full 400 year cycle, then reset + args[0] = y + 400; + date = new Date(Date.UTC.apply(null, args)); + if (isFinite(date.getUTCFullYear())) { + date.setUTCFullYear(y); + } + } else { + date = new Date(Date.UTC.apply(null, arguments)); + } + + return date; + } + + // start-of-first-week - start-of-year + function firstWeekOffset(year, dow, doy) { + var // first-week day -- which january is always in the first week (4 for iso, 1 for other) + fwd = 7 + dow - doy, + // first-week day local weekday -- which local weekday is fwd + fwdlw = (7 + createUTCDate(year, 0, fwd).getUTCDay() - dow) % 7; + + return -fwdlw + fwd - 1; + } + + // https://en.wikipedia.org/wiki/ISO_week_date#Calculating_a_date_given_the_year.2C_week_number_and_weekday + function dayOfYearFromWeeks(year, week, weekday, dow, doy) { + var localWeekday = (7 + weekday - dow) % 7, + weekOffset = firstWeekOffset(year, dow, doy), + dayOfYear = 1 + 7 * (week - 1) + localWeekday + weekOffset, + resYear, resDayOfYear; + + if (dayOfYear <= 0) { + resYear = year - 1; + resDayOfYear = daysInYear(resYear) + dayOfYear; + } else if (dayOfYear > daysInYear(year)) { + resYear = year + 1; + resDayOfYear = dayOfYear - daysInYear(year); + } else { + resYear = year; + resDayOfYear = dayOfYear; + } + + return { + year: resYear, + dayOfYear: resDayOfYear + }; + } + + function weekOfYear(mom, dow, doy) { + var weekOffset = firstWeekOffset(mom.year(), dow, doy), + week = Math.floor((mom.dayOfYear() - weekOffset - 1) / 7) + 1, + resWeek, resYear; + + if (week < 1) { + resYear = mom.year() - 1; + resWeek = week + weeksInYear(resYear, dow, doy); + } else if (week > weeksInYear(mom.year(), dow, doy)) { + resWeek = week - weeksInYear(mom.year(), dow, doy); + resYear = mom.year() + 1; + } else { + resYear = mom.year(); + resWeek = week; + } + + return { + week: resWeek, + year: resYear + }; + } + + function weeksInYear(year, dow, doy) { + var weekOffset = firstWeekOffset(year, dow, doy), + weekOffsetNext = firstWeekOffset(year + 1, dow, doy); + return (daysInYear(year) - weekOffset + weekOffsetNext) / 7; + } + + // FORMATTING + + addFormatToken('w', ['ww', 2], 'wo', 'week'); + addFormatToken('W', ['WW', 2], 'Wo', 'isoWeek'); + + // ALIASES + + addUnitAlias('week', 'w'); + addUnitAlias('isoWeek', 'W'); + + // PRIORITIES + + addUnitPriority('week', 5); + addUnitPriority('isoWeek', 5); + + // PARSING + + addRegexToken('w', match1to2); + addRegexToken('ww', match1to2, match2); + addRegexToken('W', match1to2); + addRegexToken('WW', match1to2, match2); + + addWeekParseToken(['w', 'ww', 'W', 'WW'], function (input, week, config, token) { + week[token.substr(0, 1)] = toInt(input); + }); + + // HELPERS + + // LOCALES + + function localeWeek(mom) { + return weekOfYear(mom, this._week.dow, this._week.doy).week; + } + + var defaultLocaleWeek = { + dow: 0, // Sunday is the first day of the week. + doy: 6 // The week that contains Jan 6th is the first week of the year. + }; + + function localeFirstDayOfWeek() { + return this._week.dow; + } + + function localeFirstDayOfYear() { + return this._week.doy; + } + + // MOMENTS + + function getSetWeek(input) { + var week = this.localeData().week(this); + return input == null ? week : this.add((input - week) * 7, 'd'); + } + + function getSetISOWeek(input) { + var week = weekOfYear(this, 1, 4).week; + return input == null ? week : this.add((input - week) * 7, 'd'); + } + + // FORMATTING + + addFormatToken('d', 0, 'do', 'day'); + + addFormatToken('dd', 0, 0, function (format) { + return this.localeData().weekdaysMin(this, format); + }); + + addFormatToken('ddd', 0, 0, function (format) { + return this.localeData().weekdaysShort(this, format); + }); + + addFormatToken('dddd', 0, 0, function (format) { + return this.localeData().weekdays(this, format); + }); + + addFormatToken('e', 0, 0, 'weekday'); + addFormatToken('E', 0, 0, 'isoWeekday'); + + // ALIASES + + addUnitAlias('day', 'd'); + addUnitAlias('weekday', 'e'); + addUnitAlias('isoWeekday', 'E'); + + // PRIORITY + addUnitPriority('day', 11); + addUnitPriority('weekday', 11); + addUnitPriority('isoWeekday', 11); + + // PARSING + + addRegexToken('d', match1to2); + addRegexToken('e', match1to2); + addRegexToken('E', match1to2); + addRegexToken('dd', function (isStrict, locale) { + return locale.weekdaysMinRegex(isStrict); + }); + addRegexToken('ddd', function (isStrict, locale) { + return locale.weekdaysShortRegex(isStrict); + }); + addRegexToken('dddd', function (isStrict, locale) { + return locale.weekdaysRegex(isStrict); + }); + + addWeekParseToken(['dd', 'ddd', 'dddd'], function (input, week, config, token) { + var weekday = config._locale.weekdaysParse(input, token, config._strict); + // if we didn't get a weekday name, mark the date as invalid + if (weekday != null) { + week.d = weekday; + } else { + getParsingFlags(config).invalidWeekday = input; + } + }); + + addWeekParseToken(['d', 'e', 'E'], function (input, week, config, token) { + week[token] = toInt(input); + }); + + // HELPERS + + function parseWeekday(input, locale) { + if (typeof input !== 'string') { + return input; + } + + if (!isNaN(input)) { + return parseInt(input, 10); + } + + input = locale.weekdaysParse(input); + if (typeof input === 'number') { + return input; + } + + return null; + } + + function parseIsoWeekday(input, locale) { + if (typeof input === 'string') { + return locale.weekdaysParse(input) % 7 || 7; + } + return isNaN(input) ? null : input; + } + + // LOCALES + function shiftWeekdays(ws, n) { + return ws.slice(n, 7).concat(ws.slice(0, n)); + } + + var defaultLocaleWeekdays = 'Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday'.split('_'); + + function localeWeekdays(m, format) { + var weekdays = isArray(this._weekdays) ? this._weekdays : + this._weekdays[(m && m !== true && this._weekdays.isFormat.test(format)) ? 'format' : 'standalone']; + return (m === true) ? shiftWeekdays(weekdays, this._week.dow) + : (m) ? weekdays[m.day()] : weekdays; + } + + var defaultLocaleWeekdaysShort = 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'); + + function localeWeekdaysShort(m) { + return (m === true) ? shiftWeekdays(this._weekdaysShort, this._week.dow) + : (m) ? this._weekdaysShort[m.day()] : this._weekdaysShort; + } + + var defaultLocaleWeekdaysMin = 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'); + + function localeWeekdaysMin(m) { + return (m === true) ? shiftWeekdays(this._weekdaysMin, this._week.dow) + : (m) ? this._weekdaysMin[m.day()] : this._weekdaysMin; + } + + function handleStrictParse$1(weekdayName, format, strict) { + var i, ii, mom, llc = weekdayName.toLocaleLowerCase(); + if (!this._weekdaysParse) { + this._weekdaysParse = []; + this._shortWeekdaysParse = []; + this._minWeekdaysParse = []; + + for (i = 0; i < 7; ++i) { + mom = createUTC([2000, 1]).day(i); + this._minWeekdaysParse[i] = this.weekdaysMin(mom, '').toLocaleLowerCase(); + this._shortWeekdaysParse[i] = this.weekdaysShort(mom, '').toLocaleLowerCase(); + this._weekdaysParse[i] = this.weekdays(mom, '').toLocaleLowerCase(); + } + } + + if (strict) { + if (format === 'dddd') { + ii = indexOf.call(this._weekdaysParse, llc); + return ii !== -1 ? ii : null; + } else if (format === 'ddd') { + ii = indexOf.call(this._shortWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._minWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } + } else { + if (format === 'dddd') { + ii = indexOf.call(this._weekdaysParse, llc); + if (ii !== -1) { + return ii; } - }, {25: 25}], 30: [function (t, e, i) { - "use strict"; - var n = t(45); - - function a(t, e) { - return n.where(t, function (t) { - return t.position === e - }) + ii = indexOf.call(this._shortWeekdaysParse, llc); + if (ii !== -1) { + return ii; } - - function r(t, e) { - t.forEach(function (t, e) { - return t._tmpIndex_ = e, t - }), t.sort(function (t, i) { - var n = e ? i : t, a = e ? t : i; - return n.weight === a.weight ? n._tmpIndex_ - a._tmpIndex_ : n.weight - a.weight - }), t.forEach(function (t) { - delete t._tmpIndex_ - }) + ii = indexOf.call(this._minWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } else if (format === 'ddd') { + ii = indexOf.call(this._shortWeekdaysParse, llc); + if (ii !== -1) { + return ii; } - - e.exports = { - defaults: {}, addBox: function (t, e) { - t.boxes || (t.boxes = []), e.fullWidth = e.fullWidth || !1, e.position = e.position || "top", e.weight = e.weight || 0, t.boxes.push(e) - }, removeBox: function (t, e) { - var i = t.boxes ? t.boxes.indexOf(e) : -1; - -1 !== i && t.boxes.splice(i, 1) - }, configure: function (t, e, i) { - for (var n, a = ["fullWidth", "position", "weight"], r = a.length, o = 0; o < r; ++o) n = a[o], i.hasOwnProperty(n) && (e[n] = i[n]) - }, update: function (t, e, i) { - if (t) { - var o = t.options.layout || {}, s = n.options.toPadding(o.padding), l = s.left, u = s.right, - d = s.top, h = s.bottom, c = a(t.boxes, "left"), f = a(t.boxes, "right"), - g = a(t.boxes, "top"), m = a(t.boxes, "bottom"), p = a(t.boxes, "chartArea"); - r(c, !0), r(f, !1), r(g, !0), r(m, !1); - var v = e - l - u, y = i - d - h, b = y / 2, x = (e - v / 2) / (c.length + f.length), - _ = (i - b) / (g.length + m.length), k = v, w = y, M = []; - n.each(c.concat(f, g, m), function (t) { - var e, i = t.isHorizontal(); - i ? (e = t.update(t.fullWidth ? v : k, _), w -= e.height) : (e = t.update(x, w), k -= e.width), M.push({ - horizontal: i, - minSize: e, - box: t - }) - }); - var S = 0, D = 0, C = 0, P = 0; - n.each(g.concat(m), function (t) { - if (t.getPadding) { - var e = t.getPadding(); - S = Math.max(S, e.left), D = Math.max(D, e.right) - } - }), n.each(c.concat(f), function (t) { - if (t.getPadding) { - var e = t.getPadding(); - C = Math.max(C, e.top), P = Math.max(P, e.bottom) - } - }); - var T = l, O = u, I = d, A = h; - n.each(c.concat(f), z), n.each(c, function (t) { - T += t.width - }), n.each(f, function (t) { - O += t.width - }), n.each(g.concat(m), z), n.each(g, function (t) { - I += t.height - }), n.each(m, function (t) { - A += t.height - }), n.each(c.concat(f), function (t) { - var e = n.findNextWhere(M, function (e) { - return e.box === t - }), i = {left: 0, right: 0, top: I, bottom: A}; - e && t.update(e.minSize.width, w, i) - }), T = l, O = u, I = d, A = h, n.each(c, function (t) { - T += t.width - }), n.each(f, function (t) { - O += t.width - }), n.each(g, function (t) { - I += t.height - }), n.each(m, function (t) { - A += t.height - }); - var F = Math.max(S - T, 0); - T += F, O += Math.max(D - O, 0); - var R = Math.max(C - I, 0); - I += R, A += Math.max(P - A, 0); - var L = i - I - A, W = e - T - O; - W === k && L === w || (n.each(c, function (t) { - t.height = L - }), n.each(f, function (t) { - t.height = L - }), n.each(g, function (t) { - t.fullWidth || (t.width = W) - }), n.each(m, function (t) { - t.fullWidth || (t.width = W) - }), w = L, k = W); - var Y = l + F, N = d + R; - n.each(c.concat(g), H), Y += k, N += w, n.each(f, H), n.each(m, H), t.chartArea = { - left: T, - top: I, - right: T + k, - bottom: I + w - }, n.each(p, function (e) { - e.left = t.chartArea.left, e.top = t.chartArea.top, e.right = t.chartArea.right, e.bottom = t.chartArea.bottom, e.update(k, w) - }) - } - - function z(t) { - var e = n.findNextWhere(M, function (e) { - return e.box === t - }); - if (e) if (t.isHorizontal()) { - var i = {left: Math.max(T, S), right: Math.max(O, D), top: 0, bottom: 0}; - t.update(t.fullWidth ? v : k, y / 2, i) - } else t.update(e.minSize.width, w) - } - - function H(t) { - t.isHorizontal() ? (t.left = t.fullWidth ? l : T, t.right = t.fullWidth ? e - u : T + k, t.top = N, t.bottom = N + t.height, N = t.bottom) : (t.left = Y, t.right = Y + t.width, t.top = I, t.bottom = I + w, Y = t.right) - } - } + ii = indexOf.call(this._weekdaysParse, llc); + if (ii !== -1) { + return ii; } - }, {45: 45}], 31: [function (t, e, i) { - "use strict"; - var n = t(25), a = t(45); - n._set("global", {plugins: {}}), e.exports = { - _plugins: [], _cacheId: 0, register: function (t) { - var e = this._plugins; - [].concat(t).forEach(function (t) { - -1 === e.indexOf(t) && e.push(t) - }), this._cacheId++ - }, unregister: function (t) { - var e = this._plugins; - [].concat(t).forEach(function (t) { - var i = e.indexOf(t); - -1 !== i && e.splice(i, 1) - }), this._cacheId++ - }, clear: function () { - this._plugins = [], this._cacheId++ - }, count: function () { - return this._plugins.length - }, getAll: function () { - return this._plugins - }, notify: function (t, e, i) { - var n, a, r, o, s, l = this.descriptors(t), u = l.length; - for (n = 0; n < u; ++n) if ("function" == typeof(s = (r = (a = l[n]).plugin)[e]) && ((o = [t].concat(i || [])).push(a.options), !1 === s.apply(r, o))) return !1; - return !0 - }, descriptors: function (t) { - var e = t.$plugins || (t.$plugins = {}); - if (e.id === this._cacheId) return e.descriptors; - var i = [], r = [], o = t && t.config || {}, s = o.options && o.options.plugins || {}; - return this._plugins.concat(o.plugins || []).forEach(function (t) { - if (-1 === i.indexOf(t)) { - var e = t.id, o = s[e]; - !1 !== o && (!0 === o && (o = a.clone(n.global.plugins[e])), i.push(t), r.push({ - plugin: t, - options: o || {} - })) - } - }), e.descriptors = r, e.id = this._cacheId, r - }, _invalidate: function (t) { - delete t.$plugins - } + ii = indexOf.call(this._minWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } else { + ii = indexOf.call(this._minWeekdaysParse, llc); + if (ii !== -1) { + return ii; } - }, {25: 25, 45: 45}], 32: [function (t, e, i) { - "use strict"; - var n = t(25), a = t(26), r = t(45), o = t(34); - - function s(t) { - var e, i, n = []; - for (e = 0, i = t.length; e < i; ++e) n.push(t[e].label); - return n + ii = indexOf.call(this._weekdaysParse, llc); + if (ii !== -1) { + return ii; } + ii = indexOf.call(this._shortWeekdaysParse, llc); + return ii !== -1 ? ii : null; + } + } + } - function l(t, e, i) { - var n = t.getPixelForTick(e); - return i && (n -= 0 === e ? (t.getPixelForTick(1) - n) / 2 : (n - t.getPixelForTick(e - 1)) / 2), n - } + function localeWeekdaysParse(weekdayName, format, strict) { + var i, mom, regex; - n._set("scale", { - display: !0, - position: "left", - offset: !1, - gridLines: { - display: !0, - color: "rgba(0, 0, 0, 0.1)", - lineWidth: 1, - drawBorder: !0, - drawOnChartArea: !0, - drawTicks: !0, - tickMarkLength: 10, - zeroLineWidth: 1, - zeroLineColor: "rgba(0,0,0,0.25)", - zeroLineBorderDash: [], - zeroLineBorderDashOffset: 0, - offsetGridLines: !1, - borderDash: [], - borderDashOffset: 0 - }, - scaleLabel: {display: !1, labelString: "", lineHeight: 1.2, padding: {top: 4, bottom: 4}}, - ticks: { - beginAtZero: !1, - minRotation: 0, - maxRotation: 50, - mirror: !1, - padding: 0, - reverse: !1, - display: !0, - autoSkip: !0, - autoSkipPadding: 0, - labelOffset: 0, - callback: o.formatters.values, - minor: {}, - major: {} - } - }), e.exports = function (t) { - function e(t, e, i) { - return r.isArray(e) ? r.longestText(t, i, e) : t.measureText(e).width - } + if (this._weekdaysParseExact) { + return handleStrictParse$1.call(this, weekdayName, format, strict); + } - function i(t) { - var e = r.valueOrDefault, i = n.global, a = e(t.fontSize, i.defaultFontSize), - o = e(t.fontStyle, i.defaultFontStyle), s = e(t.fontFamily, i.defaultFontFamily); - return {size: a, style: o, family: s, font: r.fontString(a, o, s)} - } + if (!this._weekdaysParse) { + this._weekdaysParse = []; + this._minWeekdaysParse = []; + this._shortWeekdaysParse = []; + this._fullWeekdaysParse = []; + } - function o(t) { - return r.options.toLineHeight(r.valueOrDefault(t.lineHeight, 1.2), r.valueOrDefault(t.fontSize, n.global.defaultFontSize)) - } + for (i = 0; i < 7; i++) { + // make the regex if we don't have it already - t.Scale = a.extend({ - getPadding: function () { - return { - left: this.paddingLeft || 0, - top: this.paddingTop || 0, - right: this.paddingRight || 0, - bottom: this.paddingBottom || 0 - } - }, - getTicks: function () { - return this._ticks - }, - mergeTicksOptions: function () { - var t = this.options.ticks; - for (var e in!1 === t.minor && (t.minor = {display: !1}), !1 === t.major && (t.major = {display: !1}), t) "major" !== e && "minor" !== e && (void 0 === t.minor[e] && (t.minor[e] = t[e]), void 0 === t.major[e] && (t.major[e] = t[e])) - }, - beforeUpdate: function () { - r.callback(this.options.beforeUpdate, [this]) - }, - update: function (t, e, i) { - var n, a, o, s, l, u, d = this; - for (d.beforeUpdate(), d.maxWidth = t, d.maxHeight = e, d.margins = r.extend({ - left: 0, - right: 0, - top: 0, - bottom: 0 - }, i), d.longestTextCache = d.longestTextCache || {}, d.beforeSetDimensions(), d.setDimensions(), d.afterSetDimensions(), d.beforeDataLimits(), d.determineDataLimits(), d.afterDataLimits(), d.beforeBuildTicks(), l = d.buildTicks() || [], d.afterBuildTicks(), d.beforeTickToLabelConversion(), o = d.convertTicksToLabels(l) || d.ticks, d.afterTickToLabelConversion(), d.ticks = o, n = 0, a = o.length; n < a; ++n) s = o[n], (u = l[n]) ? u.label = s : l.push(u = { - label: s, - major: !1 - }); - return d._ticks = l, d.beforeCalculateTickRotation(), d.calculateTickRotation(), d.afterCalculateTickRotation(), d.beforeFit(), d.fit(), d.afterFit(), d.afterUpdate(), d.minSize - }, - afterUpdate: function () { - r.callback(this.options.afterUpdate, [this]) - }, - beforeSetDimensions: function () { - r.callback(this.options.beforeSetDimensions, [this]) - }, - setDimensions: function () { - var t = this; - t.isHorizontal() ? (t.width = t.maxWidth, t.left = 0, t.right = t.width) : (t.height = t.maxHeight, t.top = 0, t.bottom = t.height), t.paddingLeft = 0, t.paddingTop = 0, t.paddingRight = 0, t.paddingBottom = 0 - }, - afterSetDimensions: function () { - r.callback(this.options.afterSetDimensions, [this]) - }, - beforeDataLimits: function () { - r.callback(this.options.beforeDataLimits, [this]) - }, - determineDataLimits: r.noop, - afterDataLimits: function () { - r.callback(this.options.afterDataLimits, [this]) - }, - beforeBuildTicks: function () { - r.callback(this.options.beforeBuildTicks, [this]) - }, - buildTicks: r.noop, - afterBuildTicks: function () { - r.callback(this.options.afterBuildTicks, [this]) - }, - beforeTickToLabelConversion: function () { - r.callback(this.options.beforeTickToLabelConversion, [this]) - }, - convertTicksToLabels: function () { - var t = this.options.ticks; - this.ticks = this.ticks.map(t.userCallback || t.callback, this) - }, - afterTickToLabelConversion: function () { - r.callback(this.options.afterTickToLabelConversion, [this]) - }, - beforeCalculateTickRotation: function () { - r.callback(this.options.beforeCalculateTickRotation, [this]) - }, - calculateTickRotation: function () { - var t = this, e = t.ctx, n = t.options.ticks, a = s(t._ticks), o = i(n); - e.font = o.font; - var l = n.minRotation || 0; - if (a.length && t.options.display && t.isHorizontal()) for (var u, d = r.longestText(e, o.font, a, t.longestTextCache), h = d, c = t.getPixelForTick(1) - t.getPixelForTick(0) - 6; h > c && l < n.maxRotation;) { - var f = r.toRadians(l); - if (u = Math.cos(f), Math.sin(f) * d > t.maxHeight) { - l--; - break - } - l++, h = u * d - } - t.labelRotation = l - }, - afterCalculateTickRotation: function () { - r.callback(this.options.afterCalculateTickRotation, [this]) - }, - beforeFit: function () { - r.callback(this.options.beforeFit, [this]) - }, - fit: function () { - var t = this, n = t.minSize = {width: 0, height: 0}, a = s(t._ticks), l = t.options, - u = l.ticks, d = l.scaleLabel, h = l.gridLines, c = l.display, f = t.isHorizontal(), - g = i(u), m = l.gridLines.tickMarkLength; - if (n.width = f ? t.isFullWidth() ? t.maxWidth - t.margins.left - t.margins.right : t.maxWidth : c && h.drawTicks ? m : 0, n.height = f ? c && h.drawTicks ? m : 0 : t.maxHeight, d.display && c) { - var p = o(d) + r.options.toPadding(d.padding).height; - f ? n.height += p : n.width += p - } - if (u.display && c) { - var v = r.longestText(t.ctx, g.font, a, t.longestTextCache), y = r.numberOfLabelLines(a), - b = .5 * g.size, x = t.options.ticks.padding; - if (f) { - t.longestLabelWidth = v; - var _ = r.toRadians(t.labelRotation), k = Math.cos(_), - w = Math.sin(_) * v + g.size * y + b * (y - 1) + b; - n.height = Math.min(t.maxHeight, n.height + w + x), t.ctx.font = g.font; - var M = e(t.ctx, a[0], g.font), S = e(t.ctx, a[a.length - 1], g.font); - 0 !== t.labelRotation ? (t.paddingLeft = "bottom" === l.position ? k * M + 3 : k * b + 3, t.paddingRight = "bottom" === l.position ? k * b + 3 : k * S + 3) : (t.paddingLeft = M / 2 + 3, t.paddingRight = S / 2 + 3) - } else u.mirror ? v = 0 : v += x + b, n.width = Math.min(t.maxWidth, n.width + v), t.paddingTop = g.size / 2, t.paddingBottom = g.size / 2 - } - t.handleMargins(), t.width = n.width, t.height = n.height - }, - handleMargins: function () { - var t = this; - t.margins && (t.paddingLeft = Math.max(t.paddingLeft - t.margins.left, 0), t.paddingTop = Math.max(t.paddingTop - t.margins.top, 0), t.paddingRight = Math.max(t.paddingRight - t.margins.right, 0), t.paddingBottom = Math.max(t.paddingBottom - t.margins.bottom, 0)) - }, - afterFit: function () { - r.callback(this.options.afterFit, [this]) - }, - isHorizontal: function () { - return "top" === this.options.position || "bottom" === this.options.position - }, - isFullWidth: function () { - return this.options.fullWidth - }, - getRightValue: function (t) { - if (r.isNullOrUndef(t)) return NaN; - if ("number" == typeof t && !isFinite(t)) return NaN; - if (t) if (this.isHorizontal()) { - if (void 0 !== t.x) return this.getRightValue(t.x) - } else if (void 0 !== t.y) return this.getRightValue(t.y); - return t - }, - getLabelForIndex: r.noop, - getPixelForValue: r.noop, - getValueForPixel: r.noop, - getPixelForTick: function (t) { - var e = this, i = e.options.offset; - if (e.isHorizontal()) { - var n = (e.width - (e.paddingLeft + e.paddingRight)) / Math.max(e._ticks.length - (i ? 0 : 1), 1), - a = n * t + e.paddingLeft; - i && (a += n / 2); - var r = e.left + Math.round(a); - return r += e.isFullWidth() ? e.margins.left : 0 - } - var o = e.height - (e.paddingTop + e.paddingBottom); - return e.top + t * (o / (e._ticks.length - 1)) - }, - getPixelForDecimal: function (t) { - var e = this; - if (e.isHorizontal()) { - var i = (e.width - (e.paddingLeft + e.paddingRight)) * t + e.paddingLeft, - n = e.left + Math.round(i); - return n += e.isFullWidth() ? e.margins.left : 0 - } - return e.top + t * e.height - }, - getBasePixel: function () { - return this.getPixelForValue(this.getBaseValue()) - }, - getBaseValue: function () { - var t = this.min, e = this.max; - return this.beginAtZero ? 0 : t < 0 && e < 0 ? e : t > 0 && e > 0 ? t : 0 - }, - _autoSkip: function (t) { - var e, i, n, a, o = this, s = o.isHorizontal(), l = o.options.ticks.minor, u = t.length, - d = r.toRadians(o.labelRotation), h = Math.cos(d), c = o.longestLabelWidth * h, f = []; - for (l.maxTicksLimit && (a = l.maxTicksLimit), s && (e = !1, (c + l.autoSkipPadding) * u > o.width - (o.paddingLeft + o.paddingRight) && (e = 1 + Math.floor((c + l.autoSkipPadding) * u / (o.width - (o.paddingLeft + o.paddingRight)))), a && u > a && (e = Math.max(e, Math.floor(u / a)))), i = 0; i < u; i++) n = t[i], (e > 1 && i % e > 0 || i % e == 0 && i + e >= u) && i !== u - 1 && delete n.label, f.push(n); - return f - }, - draw: function (t) { - var e = this, a = e.options; - if (a.display) { - var s = e.ctx, u = n.global, d = a.ticks.minor, h = a.ticks.major || d, c = a.gridLines, - f = a.scaleLabel, g = 0 !== e.labelRotation, m = e.isHorizontal(), - p = d.autoSkip ? e._autoSkip(e.getTicks()) : e.getTicks(), - v = r.valueOrDefault(d.fontColor, u.defaultFontColor), y = i(d), - b = r.valueOrDefault(h.fontColor, u.defaultFontColor), x = i(h), - _ = c.drawTicks ? c.tickMarkLength : 0, - k = r.valueOrDefault(f.fontColor, u.defaultFontColor), w = i(f), - M = r.options.toPadding(f.padding), S = r.toRadians(e.labelRotation), D = [], - C = e.options.gridLines.lineWidth, - P = "right" === a.position ? e.right : e.right - C - _, - T = "right" === a.position ? e.right + _ : e.right, - O = "bottom" === a.position ? e.top + C : e.bottom - _ - C, - I = "bottom" === a.position ? e.top + C + _ : e.bottom + C; - if (r.each(p, function (i, n) { - if (!r.isNullOrUndef(i.label)) { - var o, s, h, f, v, y, b, x, k, w, M, A, F, R, L = i.label; - n === e.zeroLineIndex && a.offset === c.offsetGridLines ? (o = c.zeroLineWidth, s = c.zeroLineColor, h = c.zeroLineBorderDash, f = c.zeroLineBorderDashOffset) : (o = r.valueAtIndexOrDefault(c.lineWidth, n), s = r.valueAtIndexOrDefault(c.color, n), h = r.valueOrDefault(c.borderDash, u.borderDash), f = r.valueOrDefault(c.borderDashOffset, u.borderDashOffset)); - var W = "middle", Y = "middle", N = d.padding; - if (m) { - var z = _ + N; - "bottom" === a.position ? (Y = g ? "middle" : "top", W = g ? "right" : "center", R = e.top + z) : (Y = g ? "middle" : "bottom", W = g ? "left" : "center", R = e.bottom - z); - var H = l(e, n, c.offsetGridLines && p.length > 1); - H < e.left && (s = "rgba(0,0,0,0)"), H += r.aliasPixel(o), F = e.getPixelForTick(n) + d.labelOffset, v = b = k = M = H, y = O, x = I, w = t.top, A = t.bottom + C - } else { - var V, B = "left" === a.position; - d.mirror ? (W = B ? "left" : "right", V = N) : (W = B ? "right" : "left", V = _ + N), F = B ? e.right - V : e.left + V; - var E = l(e, n, c.offsetGridLines && p.length > 1); - E < e.top && (s = "rgba(0,0,0,0)"), E += r.aliasPixel(o), R = e.getPixelForTick(n) + d.labelOffset, v = P, b = T, k = t.left, M = t.right + C, y = x = w = A = E - } - D.push({ - tx1: v, - ty1: y, - tx2: b, - ty2: x, - x1: k, - y1: w, - x2: M, - y2: A, - labelX: F, - labelY: R, - glWidth: o, - glColor: s, - glBorderDash: h, - glBorderDashOffset: f, - rotation: -1 * S, - label: L, - major: i.major, - textBaseline: Y, - textAlign: W - }) - } - }), r.each(D, function (t) { - if (c.display && (s.save(), s.lineWidth = t.glWidth, s.strokeStyle = t.glColor, s.setLineDash && (s.setLineDash(t.glBorderDash), s.lineDashOffset = t.glBorderDashOffset), s.beginPath(), c.drawTicks && (s.moveTo(t.tx1, t.ty1), s.lineTo(t.tx2, t.ty2)), c.drawOnChartArea && (s.moveTo(t.x1, t.y1), s.lineTo(t.x2, t.y2)), s.stroke(), s.restore()), d.display) { - s.save(), s.translate(t.labelX, t.labelY), s.rotate(t.rotation), s.font = t.major ? x.font : y.font, s.fillStyle = t.major ? b : v, s.textBaseline = t.textBaseline, s.textAlign = t.textAlign; - var i = t.label; - if (r.isArray(i)) for (var n = i.length, a = 1.5 * y.size, o = e.isHorizontal() ? 0 : -a * (n - 1) / 2, l = 0; l < n; ++l) s.fillText("" + i[l], 0, o), o += a; else s.fillText(i, 0, 0); - s.restore() - } - }), f.display) { - var A, F, R = 0, L = o(f) / 2; - if (m) A = e.left + (e.right - e.left) / 2, F = "bottom" === a.position ? e.bottom - L - M.bottom : e.top + L + M.top; else { - var W = "left" === a.position; - A = W ? e.left + L + M.top : e.right - L - M.top, F = e.top + (e.bottom - e.top) / 2, R = W ? -.5 * Math.PI : .5 * Math.PI - } - s.save(), s.translate(A, F), s.rotate(R), s.textAlign = "center", s.textBaseline = "middle", s.fillStyle = k, s.font = w.font, s.fillText(f.labelString, 0, 0), s.restore() - } - if (c.drawBorder) { - s.lineWidth = r.valueAtIndexOrDefault(c.lineWidth, 0), s.strokeStyle = r.valueAtIndexOrDefault(c.color, 0); - var Y = e.left, N = e.right + C, z = e.top, H = e.bottom + C, - V = r.aliasPixel(s.lineWidth); - m ? (z = H = "top" === a.position ? e.bottom : e.top, z += V, H += V) : (Y = N = "left" === a.position ? e.right : e.left, Y += V, N += V), s.beginPath(), s.moveTo(Y, z), s.lineTo(N, H), s.stroke() - } - } - } - }) - } - }, {25: 25, 26: 26, 34: 34, 45: 45}], 33: [function (t, e, i) { - "use strict"; - var n = t(25), a = t(45), r = t(30); - e.exports = function (t) { - t.scaleService = { - constructors: {}, defaults: {}, registerScaleType: function (t, e, i) { - this.constructors[t] = e, this.defaults[t] = a.clone(i) - }, getScaleConstructor: function (t) { - return this.constructors.hasOwnProperty(t) ? this.constructors[t] : void 0 - }, getScaleDefaults: function (t) { - return this.defaults.hasOwnProperty(t) ? a.merge({}, [n.scale, this.defaults[t]]) : {} - }, updateScaleDefaults: function (t, e) { - this.defaults.hasOwnProperty(t) && (this.defaults[t] = a.extend(this.defaults[t], e)) - }, addScalesToLayout: function (t) { - a.each(t.scales, function (e) { - e.fullWidth = e.options.fullWidth, e.position = e.options.position, e.weight = e.options.weight, r.addBox(t, e) - }) - } - } + mom = createUTC([2000, 1]).day(i); + if (strict && !this._fullWeekdaysParse[i]) { + this._fullWeekdaysParse[i] = new RegExp('^' + this.weekdays(mom, '').replace('.', '\\.?') + '$', 'i'); + this._shortWeekdaysParse[i] = new RegExp('^' + this.weekdaysShort(mom, '').replace('.', '\\.?') + '$', 'i'); + this._minWeekdaysParse[i] = new RegExp('^' + this.weekdaysMin(mom, '').replace('.', '\\.?') + '$', 'i'); + } + if (!this._weekdaysParse[i]) { + regex = '^' + this.weekdays(mom, '') + '|^' + this.weekdaysShort(mom, '') + '|^' + this.weekdaysMin(mom, ''); + this._weekdaysParse[i] = new RegExp(regex.replace('.', ''), 'i'); + } + // test the regex + if (strict && format === 'dddd' && this._fullWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (strict && format === 'ddd' && this._shortWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (strict && format === 'dd' && this._minWeekdaysParse[i].test(weekdayName)) { + return i; + } else if (!strict && this._weekdaysParse[i].test(weekdayName)) { + return i; + } + } + } + + // MOMENTS + + function getSetDayOfWeek(input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } + var day = this._isUTC ? this._d.getUTCDay() : this._d.getDay(); + if (input != null) { + input = parseWeekday(input, this.localeData()); + return this.add(input - day, 'd'); + } else { + return day; + } + } + + function getSetLocaleDayOfWeek(input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } + var weekday = (this.day() + 7 - this.localeData()._week.dow) % 7; + return input == null ? weekday : this.add(input - weekday, 'd'); + } + + function getSetISODayOfWeek(input) { + if (!this.isValid()) { + return input != null ? this : NaN; + } + + // behaves the same as moment#day except + // as a getter, returns 7 instead of 0 (1-7 range instead of 0-6) + // as a setter, sunday should belong to the previous week. + + if (input != null) { + var weekday = parseIsoWeekday(input, this.localeData()); + return this.day(this.day() % 7 ? weekday : weekday - 7); + } else { + return this.day() || 7; + } + } + + var defaultWeekdaysRegex = matchWord; + + function weekdaysRegex(isStrict) { + if (this._weekdaysParseExact) { + if (!hasOwnProp(this, '_weekdaysRegex')) { + computeWeekdaysParse.call(this); + } + if (isStrict) { + return this._weekdaysStrictRegex; + } else { + return this._weekdaysRegex; + } + } else { + if (!hasOwnProp(this, '_weekdaysRegex')) { + this._weekdaysRegex = defaultWeekdaysRegex; + } + return this._weekdaysStrictRegex && isStrict ? + this._weekdaysStrictRegex : this._weekdaysRegex; + } + } + + var defaultWeekdaysShortRegex = matchWord; + + function weekdaysShortRegex(isStrict) { + if (this._weekdaysParseExact) { + if (!hasOwnProp(this, '_weekdaysRegex')) { + computeWeekdaysParse.call(this); + } + if (isStrict) { + return this._weekdaysShortStrictRegex; + } else { + return this._weekdaysShortRegex; + } + } else { + if (!hasOwnProp(this, '_weekdaysShortRegex')) { + this._weekdaysShortRegex = defaultWeekdaysShortRegex; + } + return this._weekdaysShortStrictRegex && isStrict ? + this._weekdaysShortStrictRegex : this._weekdaysShortRegex; + } + } + + var defaultWeekdaysMinRegex = matchWord; + + function weekdaysMinRegex(isStrict) { + if (this._weekdaysParseExact) { + if (!hasOwnProp(this, '_weekdaysRegex')) { + computeWeekdaysParse.call(this); + } + if (isStrict) { + return this._weekdaysMinStrictRegex; + } else { + return this._weekdaysMinRegex; + } + } else { + if (!hasOwnProp(this, '_weekdaysMinRegex')) { + this._weekdaysMinRegex = defaultWeekdaysMinRegex; + } + return this._weekdaysMinStrictRegex && isStrict ? + this._weekdaysMinStrictRegex : this._weekdaysMinRegex; + } + } + + + function computeWeekdaysParse() { + function cmpLenRev(a, b) { + return b.length - a.length; + } + + var minPieces = [], shortPieces = [], longPieces = [], mixedPieces = [], + i, mom, minp, shortp, longp; + for (i = 0; i < 7; i++) { + // make the regex if we don't have it already + mom = createUTC([2000, 1]).day(i); + minp = this.weekdaysMin(mom, ''); + shortp = this.weekdaysShort(mom, ''); + longp = this.weekdays(mom, ''); + minPieces.push(minp); + shortPieces.push(shortp); + longPieces.push(longp); + mixedPieces.push(minp); + mixedPieces.push(shortp); + mixedPieces.push(longp); + } + // Sorting makes sure if one weekday (or abbr) is a prefix of another it + // will match the longer piece. + minPieces.sort(cmpLenRev); + shortPieces.sort(cmpLenRev); + longPieces.sort(cmpLenRev); + mixedPieces.sort(cmpLenRev); + for (i = 0; i < 7; i++) { + shortPieces[i] = regexEscape(shortPieces[i]); + longPieces[i] = regexEscape(longPieces[i]); + mixedPieces[i] = regexEscape(mixedPieces[i]); + } + + this._weekdaysRegex = new RegExp('^(' + mixedPieces.join('|') + ')', 'i'); + this._weekdaysShortRegex = this._weekdaysRegex; + this._weekdaysMinRegex = this._weekdaysRegex; + + this._weekdaysStrictRegex = new RegExp('^(' + longPieces.join('|') + ')', 'i'); + this._weekdaysShortStrictRegex = new RegExp('^(' + shortPieces.join('|') + ')', 'i'); + this._weekdaysMinStrictRegex = new RegExp('^(' + minPieces.join('|') + ')', 'i'); + } + + // FORMATTING + + function hFormat() { + return this.hours() % 12 || 12; + } + + function kFormat() { + return this.hours() || 24; + } + + addFormatToken('H', ['HH', 2], 0, 'hour'); + addFormatToken('h', ['hh', 2], 0, hFormat); + addFormatToken('k', ['kk', 2], 0, kFormat); + + addFormatToken('hmm', 0, 0, function () { + return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2); + }); + + addFormatToken('hmmss', 0, 0, function () { + return '' + hFormat.apply(this) + zeroFill(this.minutes(), 2) + + zeroFill(this.seconds(), 2); + }); + + addFormatToken('Hmm', 0, 0, function () { + return '' + this.hours() + zeroFill(this.minutes(), 2); + }); + + addFormatToken('Hmmss', 0, 0, function () { + return '' + this.hours() + zeroFill(this.minutes(), 2) + + zeroFill(this.seconds(), 2); + }); + + function meridiem(token, lowercase) { + addFormatToken(token, 0, 0, function () { + return this.localeData().meridiem(this.hours(), this.minutes(), lowercase); + }); + } + + meridiem('a', true); + meridiem('A', false); + + // ALIASES + + addUnitAlias('hour', 'h'); + + // PRIORITY + addUnitPriority('hour', 13); + + // PARSING + + function matchMeridiem(isStrict, locale) { + return locale._meridiemParse; + } + + addRegexToken('a', matchMeridiem); + addRegexToken('A', matchMeridiem); + addRegexToken('H', match1to2); + addRegexToken('h', match1to2); + addRegexToken('k', match1to2); + addRegexToken('HH', match1to2, match2); + addRegexToken('hh', match1to2, match2); + addRegexToken('kk', match1to2, match2); + + addRegexToken('hmm', match3to4); + addRegexToken('hmmss', match5to6); + addRegexToken('Hmm', match3to4); + addRegexToken('Hmmss', match5to6); + + addParseToken(['H', 'HH'], HOUR); + addParseToken(['k', 'kk'], function (input, array, config) { + var kInput = toInt(input); + array[HOUR] = kInput === 24 ? 0 : kInput; + }); + addParseToken(['a', 'A'], function (input, array, config) { + config._isPm = config._locale.isPM(input); + config._meridiem = input; + }); + addParseToken(['h', 'hh'], function (input, array, config) { + array[HOUR] = toInt(input); + getParsingFlags(config).bigHour = true; + }); + addParseToken('hmm', function (input, array, config) { + var pos = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos)); + array[MINUTE] = toInt(input.substr(pos)); + getParsingFlags(config).bigHour = true; + }); + addParseToken('hmmss', function (input, array, config) { + var pos1 = input.length - 4; + var pos2 = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos1)); + array[MINUTE] = toInt(input.substr(pos1, 2)); + array[SECOND] = toInt(input.substr(pos2)); + getParsingFlags(config).bigHour = true; + }); + addParseToken('Hmm', function (input, array, config) { + var pos = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos)); + array[MINUTE] = toInt(input.substr(pos)); + }); + addParseToken('Hmmss', function (input, array, config) { + var pos1 = input.length - 4; + var pos2 = input.length - 2; + array[HOUR] = toInt(input.substr(0, pos1)); + array[MINUTE] = toInt(input.substr(pos1, 2)); + array[SECOND] = toInt(input.substr(pos2)); + }); + + // LOCALES + + function localeIsPM(input) { + // IE8 Quirks Mode & IE7 Standards Mode do not allow accessing strings like arrays + // Using charAt should be more compatible. + return ((input + '').toLowerCase().charAt(0) === 'p'); + } + + var defaultLocaleMeridiemParse = /[ap]\.?m?\.?/i; + + function localeMeridiem(hours, minutes, isLower) { + if (hours > 11) { + return isLower ? 'pm' : 'PM'; + } else { + return isLower ? 'am' : 'AM'; + } + } + + + // MOMENTS + + // Setting the hour should keep the time, because the user explicitly + // specified which hour they want. So trying to maintain the same hour (in + // a new timezone) makes sense. Adding/subtracting hours does not follow + // this rule. + var getSetHour = makeGetSet('Hours', true); + + var baseConfig = { + calendar: defaultCalendar, + longDateFormat: defaultLongDateFormat, + invalidDate: defaultInvalidDate, + ordinal: defaultOrdinal, + dayOfMonthOrdinalParse: defaultDayOfMonthOrdinalParse, + relativeTime: defaultRelativeTime, + + months: defaultLocaleMonths, + monthsShort: defaultLocaleMonthsShort, + + week: defaultLocaleWeek, + + weekdays: defaultLocaleWeekdays, + weekdaysMin: defaultLocaleWeekdaysMin, + weekdaysShort: defaultLocaleWeekdaysShort, + + meridiemParse: defaultLocaleMeridiemParse + }; + + // internal storage for locale config files + var locales = {}; + var localeFamilies = {}; + var globalLocale; + + function normalizeLocale(key) { + return key ? key.toLowerCase().replace('_', '-') : key; + } + + // pick the locale from the array + // try ['en-au', 'en-gb'] as 'en-au', 'en-gb', 'en', as in move through the list trying each + // substring from most specific to least, but move to the next array item if it's a more specific variant than the current root + function chooseLocale(names) { + var i = 0, j, next, locale, split; + + while (i < names.length) { + split = normalizeLocale(names[i]).split('-'); + j = split.length; + next = normalizeLocale(names[i + 1]); + next = next ? next.split('-') : null; + while (j > 0) { + locale = loadLocale(split.slice(0, j).join('-')); + if (locale) { + return locale; } - }, {25: 25, 30: 30, 45: 45}], 34: [function (t, e, i) { - "use strict"; - var n = t(45); - e.exports = { - formatters: { - values: function (t) { - return n.isArray(t) ? t : "" + t - }, linear: function (t, e, i) { - var a = i.length > 3 ? i[2] - i[1] : i[1] - i[0]; - Math.abs(a) > 1 && t !== Math.floor(t) && (a = t - Math.floor(t)); - var r = n.log10(Math.abs(a)), o = ""; - if (0 !== t) { - var s = -1 * Math.floor(r); - s = Math.max(Math.min(s, 20), 0), o = t.toFixed(s) - } else o = "0"; - return o - }, logarithmic: function (t, e, i) { - var a = t / Math.pow(10, Math.floor(n.log10(t))); - return 0 === t ? "0" : 1 === a || 2 === a || 5 === a || 0 === e || e === i.length - 1 ? t.toExponential() : "" - } - } + if (next && next.length >= j && compareArrays(split, next, true) >= j - 1) { + //the next array item is better than a shallower substring of this one + break; } - }, {45: 45}], 35: [function (t, e, i) { - "use strict"; - var n = t(25), a = t(26), r = t(45); - n._set("global", { - tooltips: { - enabled: !0, - custom: null, - mode: "nearest", - position: "average", - intersect: !0, - backgroundColor: "rgba(0,0,0,0.8)", - titleFontStyle: "bold", - titleSpacing: 2, - titleMarginBottom: 6, - titleFontColor: "#fff", - titleAlign: "left", - bodySpacing: 2, - bodyFontColor: "#fff", - bodyAlign: "left", - footerFontStyle: "bold", - footerSpacing: 2, - footerMarginTop: 6, - footerFontColor: "#fff", - footerAlign: "left", - yPadding: 6, - xPadding: 6, - caretPadding: 2, - caretSize: 5, - cornerRadius: 6, - multiKeyBackground: "#fff", - displayColors: !0, - borderColor: "rgba(0,0,0,0)", - borderWidth: 0, - callbacks: { - beforeTitle: r.noop, - title: function (t, e) { - var i = "", n = e.labels, a = n ? n.length : 0; - if (t.length > 0) { - var r = t[0]; - r.xLabel ? i = r.xLabel : a > 0 && r.index < a && (i = n[r.index]) - } - return i - }, - afterTitle: r.noop, - beforeBody: r.noop, - beforeLabel: r.noop, - label: function (t, e) { - var i = e.datasets[t.datasetIndex].label || ""; - return i && (i += ": "), i += t.yLabel - }, - labelColor: function (t, e) { - var i = e.getDatasetMeta(t.datasetIndex).data[t.index]._view; - return {borderColor: i.borderColor, backgroundColor: i.backgroundColor} - }, - labelTextColor: function () { - return this._options.bodyFontColor - }, - afterLabel: r.noop, - afterBody: r.noop, - beforeFooter: r.noop, - footer: r.noop, - afterFooter: r.noop - } - } - }), e.exports = function (t) { - function e(t, e) { - var i = r.color(t); - return i.alpha(e * i.alpha()).rgbaString() - } + j--; + } + i++; + } + return globalLocale; + } - function i(t, e) { - return e && (r.isArray(e) ? Array.prototype.push.apply(t, e) : t.push(e)), t - } + function loadLocale(name) { + var oldLocale = null; + // TODO: Find a better way to register and load all the locales in Node + if (!locales[name] && ('object' !== 'undefined') && + module && module.exports) { + try { + oldLocale = globalLocale._abbr; + var aliasedRequire = commonjsRequire; + aliasedRequire('./locale/' + name); + getSetGlobalLocale(oldLocale); + } catch (e) { + } + } + return locales[name]; + } - function o(t) { - var e = n.global, i = r.valueOrDefault; - return { - xPadding: t.xPadding, - yPadding: t.yPadding, - xAlign: t.xAlign, - yAlign: t.yAlign, - bodyFontColor: t.bodyFontColor, - _bodyFontFamily: i(t.bodyFontFamily, e.defaultFontFamily), - _bodyFontStyle: i(t.bodyFontStyle, e.defaultFontStyle), - _bodyAlign: t.bodyAlign, - bodyFontSize: i(t.bodyFontSize, e.defaultFontSize), - bodySpacing: t.bodySpacing, - titleFontColor: t.titleFontColor, - _titleFontFamily: i(t.titleFontFamily, e.defaultFontFamily), - _titleFontStyle: i(t.titleFontStyle, e.defaultFontStyle), - titleFontSize: i(t.titleFontSize, e.defaultFontSize), - _titleAlign: t.titleAlign, - titleSpacing: t.titleSpacing, - titleMarginBottom: t.titleMarginBottom, - footerFontColor: t.footerFontColor, - _footerFontFamily: i(t.footerFontFamily, e.defaultFontFamily), - _footerFontStyle: i(t.footerFontStyle, e.defaultFontStyle), - footerFontSize: i(t.footerFontSize, e.defaultFontSize), - _footerAlign: t.footerAlign, - footerSpacing: t.footerSpacing, - footerMarginTop: t.footerMarginTop, - caretSize: t.caretSize, - cornerRadius: t.cornerRadius, - backgroundColor: t.backgroundColor, - opacity: 0, - legendColorBackground: t.multiKeyBackground, - displayColors: t.displayColors, - borderColor: t.borderColor, - borderWidth: t.borderWidth - } - } + // This function will load locale and then set the global locale. If + // no arguments are passed in, it will simply return the current global + // locale key. + function getSetGlobalLocale(key, values) { + var data; + if (key) { + if (isUndefined(values)) { + data = getLocale(key); + } else { + data = defineLocale(key, values); + } - t.Tooltip = a.extend({ - initialize: function () { - this._model = o(this._options), this._lastActive = [] - }, getTitle: function () { - var t = this._options.callbacks, e = t.beforeTitle.apply(this, arguments), - n = t.title.apply(this, arguments), a = t.afterTitle.apply(this, arguments), r = []; - return r = i(r = i(r = i(r, e), n), a) - }, getBeforeBody: function () { - var t = this._options.callbacks.beforeBody.apply(this, arguments); - return r.isArray(t) ? t : void 0 !== t ? [t] : [] - }, getBody: function (t, e) { - var n = this, a = n._options.callbacks, o = []; - return r.each(t, function (t) { - var r = {before: [], lines: [], after: []}; - i(r.before, a.beforeLabel.call(n, t, e)), i(r.lines, a.label.call(n, t, e)), i(r.after, a.afterLabel.call(n, t, e)), o.push(r) - }), o - }, getAfterBody: function () { - var t = this._options.callbacks.afterBody.apply(this, arguments); - return r.isArray(t) ? t : void 0 !== t ? [t] : [] - }, getFooter: function () { - var t = this._options.callbacks, e = t.beforeFooter.apply(this, arguments), - n = t.footer.apply(this, arguments), a = t.afterFooter.apply(this, arguments), r = []; - return r = i(r = i(r = i(r, e), n), a) - }, update: function (e) { - var i, n, a, s, l, u, d, h, c, f, g, m, p, v, y, b, x, _, k, w, M = this, S = M._options, - D = M._model, C = M._model = o(S), P = M._active, T = M._data, - O = {xAlign: D.xAlign, yAlign: D.yAlign}, I = {x: D.x, y: D.y}, - A = {width: D.width, height: D.height}, F = {x: D.caretX, y: D.caretY}; - if (P.length) { - C.opacity = 1; - var R = [], L = []; - F = t.Tooltip.positioners[S.position].call(M, P, M._eventPosition); - var W = []; - for (i = 0, n = P.length; i < n; ++i) W.push((b = P[i], x = void 0, _ = void 0, void 0, void 0, x = b._xScale, _ = b._yScale || b._scale, k = b._index, w = b._datasetIndex, { - xLabel: x ? x.getLabelForIndex(k, w) : "", - yLabel: _ ? _.getLabelForIndex(k, w) : "", - index: k, - datasetIndex: w, - x: b._model.x, - y: b._model.y - })); - S.filter && (W = W.filter(function (t) { - return S.filter(t, T) - })), S.itemSort && (W = W.sort(function (t, e) { - return S.itemSort(t, e, T) - })), r.each(W, function (t) { - R.push(S.callbacks.labelColor.call(M, t, M._chart)), L.push(S.callbacks.labelTextColor.call(M, t, M._chart)) - }), C.title = M.getTitle(W, T), C.beforeBody = M.getBeforeBody(W, T), C.body = M.getBody(W, T), C.afterBody = M.getAfterBody(W, T), C.footer = M.getFooter(W, T), C.x = Math.round(F.x), C.y = Math.round(F.y), C.caretPadding = S.caretPadding, C.labelColors = R, C.labelTextColors = L, C.dataPoints = W, O = function (t, e) { - var i, n, a, r, o, s = t._model, l = t._chart, u = t._chart.chartArea, d = "center", - h = "center"; - s.y < e.height ? h = "top" : s.y > l.height - e.height && (h = "bottom"); - var c = (u.left + u.right) / 2, f = (u.top + u.bottom) / 2; - "center" === h ? (i = function (t) { - return t <= c - }, n = function (t) { - return t > c - }) : (i = function (t) { - return t <= e.width / 2 - }, n = function (t) { - return t >= l.width - e.width / 2 - }), a = function (t) { - return t + e.width + s.caretSize + s.caretPadding > l.width - }, r = function (t) { - return t - e.width - s.caretSize - s.caretPadding < 0 - }, o = function (t) { - return t <= f ? "top" : "bottom" - }, i(s.x) ? (d = "left", a(s.x) && (d = "center", h = o(s.y))) : n(s.x) && (d = "right", r(s.x) && (d = "center", h = o(s.y))); - var g = t._options; - return {xAlign: g.xAlign ? g.xAlign : d, yAlign: g.yAlign ? g.yAlign : h} - }(this, A = function (t, e) { - var i = t._chart.ctx, n = 2 * e.yPadding, a = 0, o = e.body, - s = o.reduce(function (t, e) { - return t + e.before.length + e.lines.length + e.after.length - }, 0); - s += e.beforeBody.length + e.afterBody.length; - var l = e.title.length, u = e.footer.length, d = e.titleFontSize, h = e.bodyFontSize, - c = e.footerFontSize; - n += l * d, n += l ? (l - 1) * e.titleSpacing : 0, n += l ? e.titleMarginBottom : 0, n += s * h, n += s ? (s - 1) * e.bodySpacing : 0, n += u ? e.footerMarginTop : 0, n += u * c, n += u ? (u - 1) * e.footerSpacing : 0; - var f = 0, g = function (t) { - a = Math.max(a, i.measureText(t).width + f) - }; - return i.font = r.fontString(d, e._titleFontStyle, e._titleFontFamily), r.each(e.title, g), i.font = r.fontString(h, e._bodyFontStyle, e._bodyFontFamily), r.each(e.beforeBody.concat(e.afterBody), g), f = e.displayColors ? h + 2 : 0, r.each(o, function (t) { - r.each(t.before, g), r.each(t.lines, g), r.each(t.after, g) - }), f = 0, i.font = r.fontString(c, e._footerFontStyle, e._footerFontFamily), r.each(e.footer, g), { - width: a += 2 * e.xPadding, - height: n - } - }(this, C)), a = C, s = A, l = O, u = M._chart, d = a.x, h = a.y, c = a.caretSize, f = a.caretPadding, g = a.cornerRadius, m = l.xAlign, p = l.yAlign, v = c + f, y = g + f, "right" === m ? d -= s.width : "center" === m && ((d -= s.width / 2) + s.width > u.width && (d = u.width - s.width), d < 0 && (d = 0)), "top" === p ? h += v : h -= "bottom" === p ? s.height + v : s.height / 2, "center" === p ? "left" === m ? d += v : "right" === m && (d -= v) : "left" === m ? d -= y : "right" === m && (d += y), I = { - x: d, - y: h - } - } else C.opacity = 0; - return C.xAlign = O.xAlign, C.yAlign = O.yAlign, C.x = I.x, C.y = I.y, C.width = A.width, C.height = A.height, C.caretX = F.x, C.caretY = F.y, M._model = C, e && S.custom && S.custom.call(M, C), M - }, drawCaret: function (t, e) { - var i = this._chart.ctx, n = this._view, a = this.getCaretPosition(t, e, n); - i.lineTo(a.x1, a.y1), i.lineTo(a.x2, a.y2), i.lineTo(a.x3, a.y3) - }, getCaretPosition: function (t, e, i) { - var n, a, r, o, s, l, u = i.caretSize, d = i.cornerRadius, h = i.xAlign, c = i.yAlign, f = t.x, - g = t.y, m = e.width, p = e.height; - if ("center" === c) s = g + p / 2, "left" === h ? (a = (n = f) - u, r = n, o = s + u, l = s - u) : (a = (n = f + m) + u, r = n, o = s - u, l = s + u); else if ("left" === h ? (n = (a = f + d + u) - u, r = a + u) : "right" === h ? (n = (a = f + m - d - u) - u, r = a + u) : (n = (a = i.caretX) - u, r = a + u), "top" === c) s = (o = g) - u, l = o; else { - s = (o = g + p) + u, l = o; - var v = r; - r = n, n = v - } - return {x1: n, x2: a, x3: r, y1: o, y2: s, y3: l} - }, drawTitle: function (t, i, n, a) { - var o = i.title; - if (o.length) { - n.textAlign = i._titleAlign, n.textBaseline = "top"; - var s, l, u = i.titleFontSize, d = i.titleSpacing; - for (n.fillStyle = e(i.titleFontColor, a), n.font = r.fontString(u, i._titleFontStyle, i._titleFontFamily), s = 0, l = o.length; s < l; ++s) n.fillText(o[s], t.x, t.y), t.y += u + d, s + 1 === o.length && (t.y += i.titleMarginBottom - d) - } - }, drawBody: function (t, i, n, a) { - var o = i.bodyFontSize, s = i.bodySpacing, l = i.body; - n.textAlign = i._bodyAlign, n.textBaseline = "top", n.font = r.fontString(o, i._bodyFontStyle, i._bodyFontFamily); - var u = 0, d = function (e) { - n.fillText(e, t.x + u, t.y), t.y += o + s - }; - n.fillStyle = e(i.bodyFontColor, a), r.each(i.beforeBody, d); - var h = i.displayColors; - u = h ? o + 2 : 0, r.each(l, function (s, l) { - var u = e(i.labelTextColors[l], a); - n.fillStyle = u, r.each(s.before, d), r.each(s.lines, function (r) { - h && (n.fillStyle = e(i.legendColorBackground, a), n.fillRect(t.x, t.y, o, o), n.lineWidth = 1, n.strokeStyle = e(i.labelColors[l].borderColor, a), n.strokeRect(t.x, t.y, o, o), n.fillStyle = e(i.labelColors[l].backgroundColor, a), n.fillRect(t.x + 1, t.y + 1, o - 2, o - 2), n.fillStyle = u), d(r) - }), r.each(s.after, d) - }), u = 0, r.each(i.afterBody, d), t.y -= s - }, drawFooter: function (t, i, n, a) { - var o = i.footer; - o.length && (t.y += i.footerMarginTop, n.textAlign = i._footerAlign, n.textBaseline = "top", n.fillStyle = e(i.footerFontColor, a), n.font = r.fontString(i.footerFontSize, i._footerFontStyle, i._footerFontFamily), r.each(o, function (e) { - n.fillText(e, t.x, t.y), t.y += i.footerFontSize + i.footerSpacing - })) - }, drawBackground: function (t, i, n, a, r) { - n.fillStyle = e(i.backgroundColor, r), n.strokeStyle = e(i.borderColor, r), n.lineWidth = i.borderWidth; - var o = i.xAlign, s = i.yAlign, l = t.x, u = t.y, d = a.width, h = a.height, c = i.cornerRadius; - n.beginPath(), n.moveTo(l + c, u), "top" === s && this.drawCaret(t, a), n.lineTo(l + d - c, u), n.quadraticCurveTo(l + d, u, l + d, u + c), "center" === s && "right" === o && this.drawCaret(t, a), n.lineTo(l + d, u + h - c), n.quadraticCurveTo(l + d, u + h, l + d - c, u + h), "bottom" === s && this.drawCaret(t, a), n.lineTo(l + c, u + h), n.quadraticCurveTo(l, u + h, l, u + h - c), "center" === s && "left" === o && this.drawCaret(t, a), n.lineTo(l, u + c), n.quadraticCurveTo(l, u, l + c, u), n.closePath(), n.fill(), i.borderWidth > 0 && n.stroke() - }, draw: function () { - var t = this._chart.ctx, e = this._view; - if (0 !== e.opacity) { - var i = {width: e.width, height: e.height}, n = {x: e.x, y: e.y}, - a = Math.abs(e.opacity < .001) ? 0 : e.opacity, - r = e.title.length || e.beforeBody.length || e.body.length || e.afterBody.length || e.footer.length; - this._options.enabled && r && (this.drawBackground(n, e, t, i, a), n.x += e.xPadding, n.y += e.yPadding, this.drawTitle(n, e, t, a), this.drawBody(n, e, t, a), this.drawFooter(n, e, t, a)) - } - }, handleEvent: function (t) { - var e, i = this, n = i._options; - return i._lastActive = i._lastActive || [], "mouseout" === t.type ? i._active = [] : i._active = i._chart.getElementsAtEventForMode(t, n.mode, n), (e = !r.arrayEquals(i._active, i._lastActive)) && (i._lastActive = i._active, (n.enabled || n.custom) && (i._eventPosition = { - x: t.x, - y: t.y - }, i.update(!0), i.pivot())), e - } - }), t.Tooltip.positioners = { - average: function (t) { - if (!t.length) return !1; - var e, i, n = 0, a = 0, r = 0; - for (e = 0, i = t.length; e < i; ++e) { - var o = t[e]; - if (o && o.hasValue()) { - var s = o.tooltipPosition(); - n += s.x, a += s.y, ++r - } - } - return {x: Math.round(n / r), y: Math.round(a / r)} - }, nearest: function (t, e) { - var i, n, a, o = e.x, s = e.y, l = Number.POSITIVE_INFINITY; - for (i = 0, n = t.length; i < n; ++i) { - var u = t[i]; - if (u && u.hasValue()) { - var d = u.getCenterPoint(), h = r.distanceBetweenPoints(e, d); - h < l && (l = h, a = u) - } - } - if (a) { - var c = a.tooltipPosition(); - o = c.x, s = c.y - } - return {x: o, y: s} - } - } + if (data) { + // moment.duration._locale = moment._locale = data; + globalLocale = data; + } else { + if ((typeof console !== 'undefined') && console.warn) { + //warn user if arguments are passed but the locale could not be set + console.warn('Locale ' + key + ' not found. Did you forget to load it?'); } - }, {25: 25, 26: 26, 45: 45}], 36: [function (t, e, i) { - "use strict"; - var n = t(25), a = t(26), r = t(45); - n._set("global", { - elements: { - arc: { - backgroundColor: n.global.defaultColor, - borderColor: "#fff", - borderWidth: 2 - } - } - }), e.exports = a.extend({ - inLabelRange: function (t) { - var e = this._view; - return !!e && Math.pow(t - e.x, 2) < Math.pow(e.radius + e.hoverRadius, 2) - }, inRange: function (t, e) { - var i = this._view; - if (i) { - for (var n = r.getAngleFromPoint(i, { - x: t, - y: e - }), a = n.angle, o = n.distance, s = i.startAngle, l = i.endAngle; l < s;) l += 2 * Math.PI; - for (; a > l;) a -= 2 * Math.PI; - for (; a < s;) a += 2 * Math.PI; - var u = a >= s && a <= l, d = o >= i.innerRadius && o <= i.outerRadius; - return u && d - } - return !1 - }, getCenterPoint: function () { - var t = this._view, e = (t.startAngle + t.endAngle) / 2, i = (t.innerRadius + t.outerRadius) / 2; - return {x: t.x + Math.cos(e) * i, y: t.y + Math.sin(e) * i} - }, getArea: function () { - var t = this._view; - return Math.PI * ((t.endAngle - t.startAngle) / (2 * Math.PI)) * (Math.pow(t.outerRadius, 2) - Math.pow(t.innerRadius, 2)) - }, tooltipPosition: function () { - var t = this._view, e = t.startAngle + (t.endAngle - t.startAngle) / 2, - i = (t.outerRadius - t.innerRadius) / 2 + t.innerRadius; - return {x: t.x + Math.cos(e) * i, y: t.y + Math.sin(e) * i} - }, draw: function () { - var t = this._chart.ctx, e = this._view, i = e.startAngle, n = e.endAngle; - t.beginPath(), t.arc(e.x, e.y, e.outerRadius, i, n), t.arc(e.x, e.y, e.innerRadius, n, i, !0), t.closePath(), t.strokeStyle = e.borderColor, t.lineWidth = e.borderWidth, t.fillStyle = e.backgroundColor, t.fill(), t.lineJoin = "bevel", e.borderWidth && t.stroke() - } - }) - }, {25: 25, 26: 26, 45: 45}], 37: [function (t, e, i) { - "use strict"; - var n = t(25), a = t(26), r = t(45), o = n.global; - n._set("global", { - elements: { - line: { - tension: .4, - backgroundColor: o.defaultColor, - borderWidth: 3, - borderColor: o.defaultColor, - borderCapStyle: "butt", - borderDash: [], - borderDashOffset: 0, - borderJoinStyle: "miter", - capBezierPoints: !0, - fill: !0 - } - } - }), e.exports = a.extend({ - draw: function () { - var t, e, i, n, a = this._view, s = this._chart.ctx, l = a.spanGaps, u = this._children.slice(), - d = o.elements.line, h = -1; - for (this._loop && u.length && u.push(u[0]), s.save(), s.lineCap = a.borderCapStyle || d.borderCapStyle, s.setLineDash && s.setLineDash(a.borderDash || d.borderDash), s.lineDashOffset = a.borderDashOffset || d.borderDashOffset, s.lineJoin = a.borderJoinStyle || d.borderJoinStyle, s.lineWidth = a.borderWidth || d.borderWidth, s.strokeStyle = a.borderColor || o.defaultColor, s.beginPath(), h = -1, t = 0; t < u.length; ++t) e = u[t], i = r.previousItem(u, t), n = e._view, 0 === t ? n.skip || (s.moveTo(n.x, n.y), h = t) : (i = -1 === h ? i : u[h], n.skip || (h !== t - 1 && !l || -1 === h ? s.moveTo(n.x, n.y) : r.canvas.lineTo(s, i._view, e._view), h = t)); - s.stroke(), s.restore() + } + } + + return globalLocale._abbr; + } + + function defineLocale(name, config) { + if (config !== null) { + var locale, parentConfig = baseConfig; + config.abbr = name; + if (locales[name] != null) { + deprecateSimple('defineLocaleOverride', + 'use moment.updateLocale(localeName, config) to change ' + + 'an existing locale. moment.defineLocale(localeName, ' + + 'config) should only be used for creating a new locale ' + + 'See http://momentjs.com/guides/#/warnings/define-locale/ for more info.'); + parentConfig = locales[name]._config; + } else if (config.parentLocale != null) { + if (locales[config.parentLocale] != null) { + parentConfig = locales[config.parentLocale]._config; + } else { + locale = loadLocale(config.parentLocale); + if (locale != null) { + parentConfig = locale._config; + } else { + if (!localeFamilies[config.parentLocale]) { + localeFamilies[config.parentLocale] = []; } - }) - }, {25: 25, 26: 26, 45: 45}], 38: [function (t, e, i) { - "use strict"; - var n = t(25), a = t(26), r = t(45), o = n.global.defaultColor; - - function s(t) { - var e = this._view; - return !!e && Math.abs(t - e.x) < e.radius + e.hitRadius + localeFamilies[config.parentLocale].push({ + name: name, + config: config + }); + return null; + } } + } + locales[name] = new Locale(mergeConfigs(parentConfig, config)); - n._set("global", { - elements: { - point: { - radius: 3, - pointStyle: "circle", - backgroundColor: o, - borderColor: o, - borderWidth: 1, - hitRadius: 1, - hoverRadius: 4, - hoverBorderWidth: 1 - } - } - }), e.exports = a.extend({ - inRange: function (t, e) { - var i = this._view; - return !!i && Math.pow(t - i.x, 2) + Math.pow(e - i.y, 2) < Math.pow(i.hitRadius + i.radius, 2) - }, inLabelRange: s, inXRange: s, inYRange: function (t) { - var e = this._view; - return !!e && Math.abs(t - e.y) < e.radius + e.hitRadius - }, getCenterPoint: function () { - var t = this._view; - return {x: t.x, y: t.y} - }, getArea: function () { - return Math.PI * Math.pow(this._view.radius, 2) - }, tooltipPosition: function () { - var t = this._view; - return {x: t.x, y: t.y, padding: t.radius + t.borderWidth} - }, draw: function (t) { - var e = this._view, i = this._model, a = this._chart.ctx, s = e.pointStyle, l = e.radius, u = e.x, - d = e.y, h = r.color, c = 0; - e.skip || (a.strokeStyle = e.borderColor || o, a.lineWidth = r.valueOrDefault(e.borderWidth, n.global.elements.point.borderWidth), a.fillStyle = e.backgroundColor || o, void 0 !== t && (i.x < t.left || 1.01 * t.right < i.x || i.y < t.top || 1.01 * t.bottom < i.y) && (i.x < t.left ? c = (u - i.x) / (t.left - i.x) : 1.01 * t.right < i.x ? c = (i.x - u) / (i.x - t.right) : i.y < t.top ? c = (d - i.y) / (t.top - i.y) : 1.01 * t.bottom < i.y && (c = (i.y - d) / (i.y - t.bottom)), c = Math.round(100 * c) / 100, a.strokeStyle = h(a.strokeStyle).alpha(c).rgbString(), a.fillStyle = h(a.fillStyle).alpha(c).rgbString()), r.canvas.drawPoint(a, s, l, u, d)) - } - }) - }, {25: 25, 26: 26, 45: 45}], 39: [function (t, e, i) { - "use strict"; - var n = t(25), a = t(26); + if (localeFamilies[name]) { + localeFamilies[name].forEach(function (x) { + defineLocale(x.name, x.config); + }); + } + + // backwards compat for now: also set the locale + // make sure we set the locale AFTER all child locales have been + // created, so we won't end up with the child locale set. + getSetGlobalLocale(name); + + + return locales[name]; + } else { + // useful for testing + delete locales[name]; + return null; + } + } + + function updateLocale(name, config) { + if (config != null) { + var locale, tmpLocale, parentConfig = baseConfig; + // MERGE + tmpLocale = loadLocale(name); + if (tmpLocale != null) { + parentConfig = tmpLocale._config; + } + config = mergeConfigs(parentConfig, config); + locale = new Locale(config); + locale.parentLocale = locales[name]; + locales[name] = locale; - function r(t) { - return void 0 !== t._view.width + // backwards compat for now: also set the locale + getSetGlobalLocale(name); + } else { + // pass null for config to unupdate, useful for tests + if (locales[name] != null) { + if (locales[name].parentLocale != null) { + locales[name] = locales[name].parentLocale; + } else if (locales[name] != null) { + delete locales[name]; } + } + } + return locales[name]; + } - function o(t) { - var e, i, n, a, o = t._view; - if (r(t)) { - var s = o.width / 2; - e = o.x - s, i = o.x + s, n = Math.min(o.y, o.base), a = Math.max(o.y, o.base) - } else { - var l = o.height / 2; - e = Math.min(o.x, o.base), i = Math.max(o.x, o.base), n = o.y - l, a = o.y + l - } - return {left: e, top: n, right: i, bottom: a} + // returns locale data + function getLocale(key) { + var locale; + + if (key && key._locale && key._locale._abbr) { + key = key._locale._abbr; + } + + if (!key) { + return globalLocale; + } + + if (!isArray(key)) { + //short-circuit everything else + locale = loadLocale(key); + if (locale) { + return locale; + } + key = [key]; + } + + return chooseLocale(key); + } + + function listLocales() { + return keys(locales); + } + + function checkOverflow(m) { + var overflow; + var a = m._a; + + if (a && getParsingFlags(m).overflow === -2) { + overflow = + a[MONTH] < 0 || a[MONTH] > 11 ? MONTH : + a[DATE] < 1 || a[DATE] > daysInMonth(a[YEAR], a[MONTH]) ? DATE : + a[HOUR] < 0 || a[HOUR] > 24 || (a[HOUR] === 24 && (a[MINUTE] !== 0 || a[SECOND] !== 0 || a[MILLISECOND] !== 0)) ? HOUR : + a[MINUTE] < 0 || a[MINUTE] > 59 ? MINUTE : + a[SECOND] < 0 || a[SECOND] > 59 ? SECOND : + a[MILLISECOND] < 0 || a[MILLISECOND] > 999 ? MILLISECOND : + -1; + + if (getParsingFlags(m)._overflowDayOfYear && (overflow < YEAR || overflow > DATE)) { + overflow = DATE; + } + if (getParsingFlags(m)._overflowWeeks && overflow === -1) { + overflow = WEEK; + } + if (getParsingFlags(m)._overflowWeekday && overflow === -1) { + overflow = WEEKDAY; + } + + getParsingFlags(m).overflow = overflow; + } + + return m; + } + + // Pick the first defined of two or three arguments. + function defaults(a, b, c) { + if (a != null) { + return a; + } + if (b != null) { + return b; + } + return c; + } + + function currentDateArray(config) { + // hooks is actually the exported moment object + var nowValue = new Date(hooks.now()); + if (config._useUTC) { + return [nowValue.getUTCFullYear(), nowValue.getUTCMonth(), nowValue.getUTCDate()]; + } + return [nowValue.getFullYear(), nowValue.getMonth(), nowValue.getDate()]; + } + + // convert an array to a date. + // the array should mirror the parameters below + // note: all values past the year are optional and will default to the lowest possible value. + // [year, month, day , hour, minute, second, millisecond] + function configFromArray(config) { + var i, date, input = [], currentDate, expectedWeekday, yearToUse; + + if (config._d) { + return; + } + + currentDate = currentDateArray(config); + + //compute day of the year from weeks and weekdays + if (config._w && config._a[DATE] == null && config._a[MONTH] == null) { + dayOfYearFromWeekInfo(config); + } + + //if the day of the year is set, figure out what it is + if (config._dayOfYear != null) { + yearToUse = defaults(config._a[YEAR], currentDate[YEAR]); + + if (config._dayOfYear > daysInYear(yearToUse) || config._dayOfYear === 0) { + getParsingFlags(config)._overflowDayOfYear = true; + } + + date = createUTCDate(yearToUse, 0, config._dayOfYear); + config._a[MONTH] = date.getUTCMonth(); + config._a[DATE] = date.getUTCDate(); + } + + // Default to current date. + // * if no year, month, day of month are given, default to today + // * if day of month is given, default month and year + // * if month is given, default only year + // * if year is given, don't default anything + for (i = 0; i < 3 && config._a[i] == null; ++i) { + config._a[i] = input[i] = currentDate[i]; + } + + // Zero out whatever was not defaulted, including time + for (; i < 7; i++) { + config._a[i] = input[i] = (config._a[i] == null) ? (i === 2 ? 1 : 0) : config._a[i]; + } + + // Check for 24:00:00.000 + if (config._a[HOUR] === 24 && + config._a[MINUTE] === 0 && + config._a[SECOND] === 0 && + config._a[MILLISECOND] === 0) { + config._nextDay = true; + config._a[HOUR] = 0; + } + + config._d = (config._useUTC ? createUTCDate : createDate).apply(null, input); + expectedWeekday = config._useUTC ? config._d.getUTCDay() : config._d.getDay(); + + // Apply timezone offset from input. The actual utcOffset can be changed + // with parseZone. + if (config._tzm != null) { + config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); + } + + if (config._nextDay) { + config._a[HOUR] = 24; + } + + // check for mismatching day of week + if (config._w && typeof config._w.d !== 'undefined' && config._w.d !== expectedWeekday) { + getParsingFlags(config).weekdayMismatch = true; + } + } + + function dayOfYearFromWeekInfo(config) { + var w, weekYear, week, weekday, dow, doy, temp, weekdayOverflow; + + w = config._w; + if (w.GG != null || w.W != null || w.E != null) { + dow = 1; + doy = 4; + + // TODO: We need to take the current isoWeekYear, but that depends on + // how we interpret now (local, utc, fixed offset). So create + // a now version of current config (take local/utc/offset flags, and + // create now). + weekYear = defaults(w.GG, config._a[YEAR], weekOfYear(createLocal(), 1, 4).year); + week = defaults(w.W, 1); + weekday = defaults(w.E, 1); + if (weekday < 1 || weekday > 7) { + weekdayOverflow = true; + } + } else { + dow = config._locale._week.dow; + doy = config._locale._week.doy; + + var curWeek = weekOfYear(createLocal(), dow, doy); + + weekYear = defaults(w.gg, config._a[YEAR], curWeek.year); + + // Default to current week. + week = defaults(w.w, curWeek.week); + + if (w.d != null) { + // weekday -- low day numbers are considered next week + weekday = w.d; + if (weekday < 0 || weekday > 6) { + weekdayOverflow = true; } + } else if (w.e != null) { + // local weekday -- counting starts from beginning of week + weekday = w.e + dow; + if (w.e < 0 || w.e > 6) { + weekdayOverflow = true; + } + } else { + // default to beginning of week + weekday = dow; + } + } + if (week < 1 || week > weeksInYear(weekYear, dow, doy)) { + getParsingFlags(config)._overflowWeeks = true; + } else if (weekdayOverflow != null) { + getParsingFlags(config)._overflowWeekday = true; + } else { + temp = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy); + config._a[YEAR] = temp.year; + config._dayOfYear = temp.dayOfYear; + } + } - n._set("global", { - elements: { - rectangle: { - backgroundColor: n.global.defaultColor, - borderColor: n.global.defaultColor, - borderSkipped: "bottom", - borderWidth: 0 - } - } - }), e.exports = a.extend({ - draw: function () { - var t, e, i, n, a, r, o, s = this._chart.ctx, l = this._view, u = l.borderWidth; - if (l.horizontal ? (t = l.base, e = l.x, i = l.y - l.height / 2, n = l.y + l.height / 2, a = e > t ? 1 : -1, r = 1, o = l.borderSkipped || "left") : (t = l.x - l.width / 2, e = l.x + l.width / 2, i = l.y, a = 1, r = (n = l.base) > i ? 1 : -1, o = l.borderSkipped || "bottom"), u) { - var d = Math.min(Math.abs(t - e), Math.abs(i - n)), h = (u = u > d ? d : u) / 2, - c = t + ("left" !== o ? h * a : 0), f = e + ("right" !== o ? -h * a : 0), - g = i + ("top" !== o ? h * r : 0), m = n + ("bottom" !== o ? -h * r : 0); - c !== f && (i = g, n = m), g !== m && (t = c, e = f) - } - s.beginPath(), s.fillStyle = l.backgroundColor, s.strokeStyle = l.borderColor, s.lineWidth = u; - var p = [[t, n], [t, i], [e, i], [e, n]], v = ["bottom", "left", "top", "right"].indexOf(o, 0); - - function y(t) { - return p[(v + t) % 4] - } - - -1 === v && (v = 0); - var b = y(0); - s.moveTo(b[0], b[1]); - for (var x = 1; x < 4; x++) b = y(x), s.lineTo(b[0], b[1]); - s.fill(), u && s.stroke() - }, height: function () { - var t = this._view; - return t.base - t.y - }, inRange: function (t, e) { - var i = !1; - if (this._view) { - var n = o(this); - i = t >= n.left && t <= n.right && e >= n.top && e <= n.bottom - } - return i - }, inLabelRange: function (t, e) { - if (!this._view) return !1; - var i = o(this); - return r(this) ? t >= i.left && t <= i.right : e >= i.top && e <= i.bottom - }, inXRange: function (t) { - var e = o(this); - return t >= e.left && t <= e.right - }, inYRange: function (t) { - var e = o(this); - return t >= e.top && t <= e.bottom - }, getCenterPoint: function () { - var t, e, i = this._view; - return r(this) ? (t = i.x, e = (i.y + i.base) / 2) : (t = (i.x + i.base) / 2, e = i.y), {x: t, y: e} - }, getArea: function () { - var t = this._view; - return t.width * Math.abs(t.y - t.base) - }, tooltipPosition: function () { - var t = this._view; - return {x: t.x, y: t.y} - } - }) - }, {25: 25, 26: 26}], 40: [function (t, e, i) { - "use strict"; - e.exports = {}, e.exports.Arc = t(36), e.exports.Line = t(37), e.exports.Point = t(38), e.exports.Rectangle = t(39) - }, {36: 36, 37: 37, 38: 38, 39: 39}], 41: [function (t, e, i) { - "use strict"; - var n = t(42); - i = e.exports = { - clear: function (t) { - t.ctx.clearRect(0, 0, t.width, t.height) - }, roundedRect: function (t, e, i, n, a, r) { - if (r) { - var o = Math.min(r, n / 2), s = Math.min(r, a / 2); - t.moveTo(e + o, i), t.lineTo(e + n - o, i), t.quadraticCurveTo(e + n, i, e + n, i + s), t.lineTo(e + n, i + a - s), t.quadraticCurveTo(e + n, i + a, e + n - o, i + a), t.lineTo(e + o, i + a), t.quadraticCurveTo(e, i + a, e, i + a - s), t.lineTo(e, i + s), t.quadraticCurveTo(e, i, e + o, i) - } else t.rect(e, i, n, a) - }, drawPoint: function (t, e, i, n, a) { - var r, o, s, l, u, d; - if (!e || "object" != typeof e || "[object HTMLImageElement]" !== (r = e.toString()) && "[object HTMLCanvasElement]" !== r) { - if (!(isNaN(i) || i <= 0)) { - switch (e) { - default: - t.beginPath(), t.arc(n, a, i, 0, 2 * Math.PI), t.closePath(), t.fill(); - break; - case"triangle": - t.beginPath(), u = (o = 3 * i / Math.sqrt(3)) * Math.sqrt(3) / 2, t.moveTo(n - o / 2, a + u / 3), t.lineTo(n + o / 2, a + u / 3), t.lineTo(n, a - 2 * u / 3), t.closePath(), t.fill(); - break; - case"rect": - d = 1 / Math.SQRT2 * i, t.beginPath(), t.fillRect(n - d, a - d, 2 * d, 2 * d), t.strokeRect(n - d, a - d, 2 * d, 2 * d); - break; - case"rectRounded": - var h = i / Math.SQRT2, c = n - h, f = a - h, g = Math.SQRT2 * i; - t.beginPath(), this.roundedRect(t, c, f, g, g, i / 2), t.closePath(), t.fill(); - break; - case"rectRot": - d = 1 / Math.SQRT2 * i, t.beginPath(), t.moveTo(n - d, a), t.lineTo(n, a + d), t.lineTo(n + d, a), t.lineTo(n, a - d), t.closePath(), t.fill(); - break; - case"cross": - t.beginPath(), t.moveTo(n, a + i), t.lineTo(n, a - i), t.moveTo(n - i, a), t.lineTo(n + i, a), t.closePath(); - break; - case"crossRot": - t.beginPath(), s = Math.cos(Math.PI / 4) * i, l = Math.sin(Math.PI / 4) * i, t.moveTo(n - s, a - l), t.lineTo(n + s, a + l), t.moveTo(n - s, a + l), t.lineTo(n + s, a - l), t.closePath(); - break; - case"star": - t.beginPath(), t.moveTo(n, a + i), t.lineTo(n, a - i), t.moveTo(n - i, a), t.lineTo(n + i, a), s = Math.cos(Math.PI / 4) * i, l = Math.sin(Math.PI / 4) * i, t.moveTo(n - s, a - l), t.lineTo(n + s, a + l), t.moveTo(n - s, a + l), t.lineTo(n + s, a - l), t.closePath(); - break; - case"line": - t.beginPath(), t.moveTo(n - i, a), t.lineTo(n + i, a), t.closePath(); - break; - case"dash": - t.beginPath(), t.moveTo(n, a), t.lineTo(n + i, a), t.closePath() - } - t.stroke() - } - } else t.drawImage(e, n - e.width / 2, a - e.height / 2, e.width, e.height) - }, clipArea: function (t, e) { - t.save(), t.beginPath(), t.rect(e.left, e.top, e.right - e.left, e.bottom - e.top), t.clip() - }, unclipArea: function (t) { - t.restore() - }, lineTo: function (t, e, i, n) { - if (i.steppedLine) return "after" === i.steppedLine && !n || "after" !== i.steppedLine && n ? t.lineTo(e.x, i.y) : t.lineTo(i.x, e.y), void t.lineTo(i.x, i.y); - i.tension ? t.bezierCurveTo(n ? e.controlPointPreviousX : e.controlPointNextX, n ? e.controlPointPreviousY : e.controlPointNextY, n ? i.controlPointNextX : i.controlPointPreviousX, n ? i.controlPointNextY : i.controlPointPreviousY, i.x, i.y) : t.lineTo(i.x, i.y) - } - }; - n.clear = i.clear, n.drawRoundedRectangle = function (t) { - t.beginPath(), i.roundedRect.apply(i, arguments), t.closePath() + // iso 8601 regex + // 0000-00-00 0000-W00 or 0000-W00-0 + T + 00 or 00:00 or 00:00:00 or 00:00:00.000 + +00:00 or +0000 or +00) + var extendedIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; + var basicIsoRegex = /^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/; + + var tzRegex = /Z|[+-]\d\d(?::?\d\d)?/; + + var isoDates = [ + ['YYYYYY-MM-DD', /[+-]\d{6}-\d\d-\d\d/], + ['YYYY-MM-DD', /\d{4}-\d\d-\d\d/], + ['GGGG-[W]WW-E', /\d{4}-W\d\d-\d/], + ['GGGG-[W]WW', /\d{4}-W\d\d/, false], + ['YYYY-DDD', /\d{4}-\d{3}/], + ['YYYY-MM', /\d{4}-\d\d/, false], + ['YYYYYYMMDD', /[+-]\d{10}/], + ['YYYYMMDD', /\d{8}/], + // YYYYMM is NOT allowed by the standard + ['GGGG[W]WWE', /\d{4}W\d{3}/], + ['GGGG[W]WW', /\d{4}W\d{2}/, false], + ['YYYYDDD', /\d{7}/] + ]; + + // iso time formats and regexes + var isoTimes = [ + ['HH:mm:ss.SSSS', /\d\d:\d\d:\d\d\.\d+/], + ['HH:mm:ss,SSSS', /\d\d:\d\d:\d\d,\d+/], + ['HH:mm:ss', /\d\d:\d\d:\d\d/], + ['HH:mm', /\d\d:\d\d/], + ['HHmmss.SSSS', /\d\d\d\d\d\d\.\d+/], + ['HHmmss,SSSS', /\d\d\d\d\d\d,\d+/], + ['HHmmss', /\d\d\d\d\d\d/], + ['HHmm', /\d\d\d\d/], + ['HH', /\d\d/] + ]; + + var aspNetJsonRegex = /^\/?Date\((\-?\d+)/i; + + // date from iso format + function configFromISO(config) { + var i, l, + string = config._i, + match = extendedIsoRegex.exec(string) || basicIsoRegex.exec(string), + allowTime, dateFormat, timeFormat, tzFormat; + + if (match) { + getParsingFlags(config).iso = true; + + for (i = 0, l = isoDates.length; i < l; i++) { + if (isoDates[i][1].exec(match[1])) { + dateFormat = isoDates[i][0]; + allowTime = isoDates[i][2] !== false; + break; } - }, {42: 42}], 42: [function (t, e, i) { - "use strict"; - var n, a = { - noop: function () { - }, uid: (n = 0, function () { - return n++ - }), isNullOrUndef: function (t) { - return null == t - }, isArray: Array.isArray ? Array.isArray : function (t) { - return "[object Array]" === Object.prototype.toString.call(t) - }, isObject: function (t) { - return null !== t && "[object Object]" === Object.prototype.toString.call(t) - }, valueOrDefault: function (t, e) { - return void 0 === t ? e : t - }, valueAtIndexOrDefault: function (t, e, i) { - return a.valueOrDefault(a.isArray(t) ? t[e] : t, i) - }, callback: function (t, e, i) { - if (t && "function" == typeof t.call) return t.apply(i, e) - }, each: function (t, e, i, n) { - var r, o, s; - if (a.isArray(t)) if (o = t.length, n) for (r = o - 1; r >= 0; r--) e.call(i, t[r], r); else for (r = 0; r < o; r++) e.call(i, t[r], r); else if (a.isObject(t)) for (o = (s = Object.keys(t)).length, r = 0; r < o; r++) e.call(i, t[s[r]], s[r]) - }, arrayEquals: function (t, e) { - var i, n, r, o; - if (!t || !e || t.length !== e.length) return !1; - for (i = 0, n = t.length; i < n; ++i) if (r = t[i], o = e[i], r instanceof Array && o instanceof Array) { - if (!a.arrayEquals(r, o)) return !1 - } else if (r !== o) return !1; - return !0 - }, clone: function (t) { - if (a.isArray(t)) return t.map(a.clone); - if (a.isObject(t)) { - for (var e = {}, i = Object.keys(t), n = i.length, r = 0; r < n; ++r) e[i[r]] = a.clone(t[i[r]]); - return e - } - return t - }, _merger: function (t, e, i, n) { - var r = e[t], o = i[t]; - a.isObject(r) && a.isObject(o) ? a.merge(r, o, n) : e[t] = a.clone(o) - }, _mergerIf: function (t, e, i) { - var n = e[t], r = i[t]; - a.isObject(n) && a.isObject(r) ? a.mergeIf(n, r) : e.hasOwnProperty(t) || (e[t] = a.clone(r)) - }, merge: function (t, e, i) { - var n, r, o, s, l, u = a.isArray(e) ? e : [e], d = u.length; - if (!a.isObject(t)) return t; - for (n = (i = i || {}).merger || a._merger, r = 0; r < d; ++r) if (e = u[r], a.isObject(e)) for (l = 0, s = (o = Object.keys(e)).length; l < s; ++l) n(o[l], t, e, i); - return t - }, mergeIf: function (t, e) { - return a.merge(t, e, {merger: a._mergerIf}) - }, extend: function (t) { - for (var e = function (e, i) { - t[i] = e - }, i = 1, n = arguments.length; i < n; ++i) a.each(arguments[i], e); - return t - }, inherits: function (t) { - var e = this, i = t && t.hasOwnProperty("constructor") ? t.constructor : function () { - return e.apply(this, arguments) - }, n = function () { - this.constructor = i - }; - return n.prototype = e.prototype, i.prototype = new n, i.extend = a.inherits, t && a.extend(i.prototype, t), i.__super__ = e.prototype, i - } - }; - e.exports = a, a.callCallback = a.callback, a.indexOf = function (t, e, i) { - return Array.prototype.indexOf.call(t, e, i) - }, a.getValueOrDefault = a.valueOrDefault, a.getValueAtIndexOrDefault = a.valueAtIndexOrDefault - }, {}], 43: [function (t, e, i) { - "use strict"; - var n = t(42), a = { - linear: function (t) { - return t - }, easeInQuad: function (t) { - return t * t - }, easeOutQuad: function (t) { - return -t * (t - 2) - }, easeInOutQuad: function (t) { - return (t /= .5) < 1 ? .5 * t * t : -.5 * (--t * (t - 2) - 1) - }, easeInCubic: function (t) { - return t * t * t - }, easeOutCubic: function (t) { - return (t -= 1) * t * t + 1 - }, easeInOutCubic: function (t) { - return (t /= .5) < 1 ? .5 * t * t * t : .5 * ((t -= 2) * t * t + 2) - }, easeInQuart: function (t) { - return t * t * t * t - }, easeOutQuart: function (t) { - return -((t -= 1) * t * t * t - 1) - }, easeInOutQuart: function (t) { - return (t /= .5) < 1 ? .5 * t * t * t * t : -.5 * ((t -= 2) * t * t * t - 2) - }, easeInQuint: function (t) { - return t * t * t * t * t - }, easeOutQuint: function (t) { - return (t -= 1) * t * t * t * t + 1 - }, easeInOutQuint: function (t) { - return (t /= .5) < 1 ? .5 * t * t * t * t * t : .5 * ((t -= 2) * t * t * t * t + 2) - }, easeInSine: function (t) { - return 1 - Math.cos(t * (Math.PI / 2)) - }, easeOutSine: function (t) { - return Math.sin(t * (Math.PI / 2)) - }, easeInOutSine: function (t) { - return -.5 * (Math.cos(Math.PI * t) - 1) - }, easeInExpo: function (t) { - return 0 === t ? 0 : Math.pow(2, 10 * (t - 1)) - }, easeOutExpo: function (t) { - return 1 === t ? 1 : 1 - Math.pow(2, -10 * t) - }, easeInOutExpo: function (t) { - return 0 === t ? 0 : 1 === t ? 1 : (t /= .5) < 1 ? .5 * Math.pow(2, 10 * (t - 1)) : .5 * (2 - Math.pow(2, -10 * --t)) - }, easeInCirc: function (t) { - return t >= 1 ? t : -(Math.sqrt(1 - t * t) - 1) - }, easeOutCirc: function (t) { - return Math.sqrt(1 - (t -= 1) * t) - }, easeInOutCirc: function (t) { - return (t /= .5) < 1 ? -.5 * (Math.sqrt(1 - t * t) - 1) : .5 * (Math.sqrt(1 - (t -= 2) * t) + 1) - }, easeInElastic: function (t) { - var e = 1.70158, i = 0, n = 1; - return 0 === t ? 0 : 1 === t ? 1 : (i || (i = .3), n < 1 ? (n = 1, e = i / 4) : e = i / (2 * Math.PI) * Math.asin(1 / n), -n * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - e) * (2 * Math.PI) / i)) - }, easeOutElastic: function (t) { - var e = 1.70158, i = 0, n = 1; - return 0 === t ? 0 : 1 === t ? 1 : (i || (i = .3), n < 1 ? (n = 1, e = i / 4) : e = i / (2 * Math.PI) * Math.asin(1 / n), n * Math.pow(2, -10 * t) * Math.sin((t - e) * (2 * Math.PI) / i) + 1) - }, easeInOutElastic: function (t) { - var e = 1.70158, i = 0, n = 1; - return 0 === t ? 0 : 2 == (t /= .5) ? 1 : (i || (i = .45), n < 1 ? (n = 1, e = i / 4) : e = i / (2 * Math.PI) * Math.asin(1 / n), t < 1 ? n * Math.pow(2, 10 * (t -= 1)) * Math.sin((t - e) * (2 * Math.PI) / i) * -.5 : n * Math.pow(2, -10 * (t -= 1)) * Math.sin((t - e) * (2 * Math.PI) / i) * .5 + 1) - }, easeInBack: function (t) { - return t * t * (2.70158 * t - 1.70158) - }, easeOutBack: function (t) { - return (t -= 1) * t * (2.70158 * t + 1.70158) + 1 - }, easeInOutBack: function (t) { - var e = 1.70158; - return (t /= .5) < 1 ? t * t * ((1 + (e *= 1.525)) * t - e) * .5 : .5 * ((t -= 2) * t * ((1 + (e *= 1.525)) * t + e) + 2) - }, easeInBounce: function (t) { - return 1 - a.easeOutBounce(1 - t) - }, easeOutBounce: function (t) { - return t < 1 / 2.75 ? 7.5625 * t * t : t < 2 / 2.75 ? 7.5625 * (t -= 1.5 / 2.75) * t + .75 : t < 2.5 / 2.75 ? 7.5625 * (t -= 2.25 / 2.75) * t + .9375 : 7.5625 * (t -= 2.625 / 2.75) * t + .984375 - }, easeInOutBounce: function (t) { - return t < .5 ? .5 * a.easeInBounce(2 * t) : .5 * a.easeOutBounce(2 * t - 1) + .5 - } - }; - e.exports = {effects: a}, n.easingEffects = a - }, {42: 42}], 44: [function (t, e, i) { - "use strict"; - var n = t(42); - e.exports = { - toLineHeight: function (t, e) { - var i = ("" + t).match(/^(normal|(\d+(?:\.\d+)?)(px|em|%)?)$/); - if (!i || "normal" === i[1]) return 1.2 * e; - switch (t = +i[2], i[3]) { - case"px": - return t; - case"%": - t /= 100 - } - return e * t - }, toPadding: function (t) { - var e, i, a, r; - return n.isObject(t) ? (e = +t.top || 0, i = +t.right || 0, a = +t.bottom || 0, r = +t.left || 0) : e = i = a = r = +t || 0, { - top: e, - right: i, - bottom: a, - left: r, - height: e + a, - width: r + i - } - }, resolve: function (t, e, i) { - var a, r, o; - for (a = 0, r = t.length; a < r; ++a) if (void 0 !== (o = t[a]) && (void 0 !== e && "function" == typeof o && (o = o(e)), void 0 !== i && n.isArray(o) && (o = o[i]), void 0 !== o)) return o - } + } + if (dateFormat == null) { + config._isValid = false; + return; + } + if (match[3]) { + for (i = 0, l = isoTimes.length; i < l; i++) { + if (isoTimes[i][1].exec(match[3])) { + // match[2] should be 'T' or space + timeFormat = (match[2] || ' ') + isoTimes[i][0]; + break; + } } - }, {42: 42}], 45: [function (t, e, i) { - "use strict"; - e.exports = t(42), e.exports.easing = t(43), e.exports.canvas = t(41), e.exports.options = t(44) - }, {41: 41, 42: 42, 43: 43, 44: 44}], 46: [function (t, e, i) { - e.exports = { - acquireContext: function (t) { - return t && t.canvas && (t = t.canvas), t && t.getContext("2d") || null - } + if (timeFormat == null) { + config._isValid = false; + return; } - }, {}], 47: [function (t, e, i) { - "use strict"; - var n = t(45), a = "$chartjs", r = "chartjs-", o = r + "render-monitor", s = r + "render-animation", - l = ["animationstart", "webkitAnimationStart"], u = { - touchstart: "mousedown", - touchmove: "mousemove", - touchend: "mouseup", - pointerenter: "mouseenter", - pointerdown: "mousedown", - pointermove: "mousemove", - pointerup: "mouseup", - pointerleave: "mouseout", - pointerout: "mouseout" - }; - - function d(t, e) { - var i = n.getStyle(t, e), a = i && i.match(/^(\d+)(\.\d+)?px$/); - return a ? Number(a[1]) : void 0 + } + if (!allowTime && timeFormat != null) { + config._isValid = false; + return; + } + if (match[4]) { + if (tzRegex.exec(match[4])) { + tzFormat = 'Z'; + } else { + config._isValid = false; + return; } + } + config._f = dateFormat + (timeFormat || '') + (tzFormat || ''); + configFromStringAndFormat(config); + } else { + config._isValid = false; + } + } - var h = !!function () { - var t = !1; - try { - var e = Object.defineProperty({}, "passive", { - get: function () { - t = !0 - } - }); - window.addEventListener("e", null, e) - } catch (t) { - } - return t - }() && {passive: !0}; + // RFC 2822 regex: For details see https://tools.ietf.org/html/rfc2822#section-3.3 + var rfc2822 = /^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/; - function c(t, e, i) { - t.addEventListener(e, i, h) - } + function extractFromRFC2822Strings(yearStr, monthStr, dayStr, hourStr, minuteStr, secondStr) { + var result = [ + untruncateYear(yearStr), + defaultLocaleMonthsShort.indexOf(monthStr), + parseInt(dayStr, 10), + parseInt(hourStr, 10), + parseInt(minuteStr, 10) + ]; - function f(t, e, i) { - t.removeEventListener(e, i, h) - } + if (secondStr) { + result.push(parseInt(secondStr, 10)); + } - function g(t, e, i, n, a) { - return {type: t, chart: e, native: a || null, x: void 0 !== i ? i : null, y: void 0 !== n ? n : null} - } + return result; + } - function m(t, e, i) { - var u, d, h, f, m, p, v, y, b = t[a] || (t[a] = {}), x = b.resizer = function (t) { - var e = document.createElement("div"), i = r + "size-monitor", - n = "position:absolute;left:0;top:0;right:0;bottom:0;overflow:hidden;pointer-events:none;visibility:hidden;z-index:-1;"; - e.style.cssText = n, e.className = i, e.innerHTML = '<div class="' + i + '-expand" style="' + n + '"><div style="position:absolute;width:1000000px;height:1000000px;left:0;top:0"></div></div><div class="' + i + '-shrink" style="' + n + '"><div style="position:absolute;width:200%;height:200%;left:0; top:0"></div></div>'; - var a = e.childNodes[0], o = e.childNodes[1]; - e._reset = function () { - a.scrollLeft = 1e6, a.scrollTop = 1e6, o.scrollLeft = 1e6, o.scrollTop = 1e6 - }; - var s = function () { - e._reset(), t() - }; - return c(a, "scroll", s.bind(a, "expand")), c(o, "scroll", s.bind(o, "shrink")), e - }((u = function () { - if (b.resizer) return e(g("resize", i)) - }, h = !1, f = [], function () { - f = Array.prototype.slice.call(arguments), d = d || this, h || (h = !0, n.requestAnimFrame.call(window, function () { - h = !1, u.apply(d, f) - })) - })); - p = function () { - if (b.resizer) { - var e = t.parentNode; - e && e !== x.parentNode && e.insertBefore(x, e.firstChild), x._reset() - } - }, v = (m = t)[a] || (m[a] = {}), y = v.renderProxy = function (t) { - t.animationName === s && p() - }, n.each(l, function (t) { - c(m, t, y) - }), v.reflow = !!m.offsetParent, m.classList.add(o) - } + function untruncateYear(yearStr) { + var year = parseInt(yearStr, 10); + if (year <= 49) { + return 2000 + year; + } else if (year <= 999) { + return 1900 + year; + } + return year; + } - function p(t) { - var e, i, r, s = t[a] || {}, u = s.resizer; - delete s.resizer, i = (e = t)[a] || {}, (r = i.renderProxy) && (n.each(l, function (t) { - f(e, t, r) - }), delete i.renderProxy), e.classList.remove(o), u && u.parentNode && u.parentNode.removeChild(u) - } + function preprocessRFC2822(s) { + // Remove comments and folding whitespace and replace multiple-spaces with a single space + return s.replace(/\([^)]*\)|[\n\t]/g, ' ').replace(/(\s\s+)/g, ' ').replace(/^\s\s*/, '').replace(/\s\s*$/, ''); + } - e.exports = { - _enabled: "undefined" != typeof window && "undefined" != typeof document, - initialize: function () { - var t, e, i, n = "from{opacity:0.99}to{opacity:1}"; - e = "@-webkit-keyframes " + s + "{" + n + "}@keyframes " + s + "{" + n + "}." + o + "{-webkit-animation:" + s + " 0.001s;animation:" + s + " 0.001s;}", i = (t = this)._style || document.createElement("style"), t._style || (t._style = i, e = "/* Chart.js */\n" + e, i.setAttribute("type", "text/css"), document.getElementsByTagName("head")[0].appendChild(i)), i.appendChild(document.createTextNode(e)) - }, - acquireContext: function (t, e) { - "string" == typeof t ? t = document.getElementById(t) : t.length && (t = t[0]), t && t.canvas && (t = t.canvas); - var i = t && t.getContext && t.getContext("2d"); - return i && i.canvas === t ? (function (t, e) { - var i = t.style, n = t.getAttribute("height"), r = t.getAttribute("width"); - if (t[a] = { - initial: { - height: n, - width: r, - style: {display: i.display, height: i.height, width: i.width} - } - }, i.display = i.display || "block", null === r || "" === r) { - var o = d(t, "width"); - void 0 !== o && (t.width = o) - } - if (null === n || "" === n) if ("" === t.style.height) t.height = t.width / (e.options.aspectRatio || 2); else { - var s = d(t, "height"); - void 0 !== o && (t.height = s) - } - }(t, e), i) : null - }, - releaseContext: function (t) { - var e = t.canvas; - if (e[a]) { - var i = e[a].initial; - ["height", "width"].forEach(function (t) { - var a = i[t]; - n.isNullOrUndef(a) ? e.removeAttribute(t) : e.setAttribute(t, a) - }), n.each(i.style || {}, function (t, i) { - e.style[i] = t - }), e.width = e.width, delete e[a] - } - }, - addEventListener: function (t, e, i) { - var r = t.canvas; - if ("resize" !== e) { - var o = i[a] || (i[a] = {}); - c(r, e, (o.proxies || (o.proxies = {}))[t.id + "_" + e] = function (e) { - var a, r, o, s; - i((r = t, o = u[(a = e).type] || a.type, s = n.getRelativePosition(a, r), g(o, r, s.x, s.y, a))) - }) - } else m(r, i, t) - }, - removeEventListener: function (t, e, i) { - var n = t.canvas; - if ("resize" !== e) { - var r = ((i[a] || {}).proxies || {})[t.id + "_" + e]; - r && f(n, e, r) - } else p(n) - } - }, n.addEvent = c, n.removeEvent = f - }, {45: 45}], 48: [function (t, e, i) { - "use strict"; - var n = t(45), a = t(46), r = t(47), o = r._enabled ? r : a; - e.exports = n.extend({ - initialize: function () { - }, acquireContext: function () { - }, releaseContext: function () { - }, addEventListener: function () { - }, removeEventListener: function () { - } - }, o) - }, {45: 45, 46: 46, 47: 47}], 49: [function (t, e, i) { - "use strict"; - e.exports = {}, e.exports.filler = t(50), e.exports.legend = t(51), e.exports.title = t(52) - }, {50: 50, 51: 51, 52: 52}], 50: [function (t, e, i) { - "use strict"; - var n = t(25), a = t(40), r = t(45); - n._set("global", {plugins: {filler: {propagate: !0}}}); - var o = { - dataset: function (t) { - var e = t.fill, i = t.chart, n = i.getDatasetMeta(e), - a = n && i.isDatasetVisible(e) && n.dataset._children || [], r = a.length || 0; - return r ? function (t, e) { - return e < r && a[e]._view || null - } : null - }, boundary: function (t) { - var e = t.boundary, i = e ? e.x : null, n = e ? e.y : null; - return function (t) { - return {x: null === i ? t.x : i, y: null === n ? t.y : n} - } - } - }; + function checkWeekday(weekdayStr, parsedInput, config) { + if (weekdayStr) { + // TODO: Replace the vanilla JS Date object with an indepentent day-of-week check. + var weekdayProvided = defaultLocaleWeekdaysShort.indexOf(weekdayStr), + weekdayActual = new Date(parsedInput[0], parsedInput[1], parsedInput[2]).getDay(); + if (weekdayProvided !== weekdayActual) { + getParsingFlags(config).weekdayMismatch = true; + config._isValid = false; + return false; + } + } + return true; + } - function s(t, e, i) { - var n, a = t._model || {}, r = a.fill; - if (void 0 === r && (r = !!a.backgroundColor), !1 === r || null === r) return !1; - if (!0 === r) return "origin"; - if (n = parseFloat(r, 10), isFinite(n) && Math.floor(n) === n) return "-" !== r[0] && "+" !== r[0] || (n = e + n), !(n === e || n < 0 || n >= i) && n; - switch (r) { - case"bottom": - return "start"; - case"top": - return "end"; - case"zero": - return "origin"; - case"origin": - case"start": - case"end": - return r; - default: - return !1 - } - } + var obsOffsets = { + UT: 0, + GMT: 0, + EDT: -4 * 60, + EST: -5 * 60, + CDT: -5 * 60, + CST: -6 * 60, + MDT: -6 * 60, + MST: -7 * 60, + PDT: -7 * 60, + PST: -8 * 60 + }; - function l(t) { - var e, i = t.el._model || {}, n = t.el._scale || {}, a = t.fill, r = null; - if (isFinite(a)) return null; - if ("start" === a ? r = void 0 === i.scaleBottom ? n.bottom : i.scaleBottom : "end" === a ? r = void 0 === i.scaleTop ? n.top : i.scaleTop : void 0 !== i.scaleZero ? r = i.scaleZero : n.getBasePosition ? r = n.getBasePosition() : n.getBasePixel && (r = n.getBasePixel()), null != r) { - if (void 0 !== r.x && void 0 !== r.y) return r; - if ("number" == typeof r && isFinite(r)) return { - x: (e = n.isHorizontal()) ? r : null, - y: e ? null : r - } - } - return null - } + function calculateOffset(obsOffset, militaryOffset, numOffset) { + if (obsOffset) { + return obsOffsets[obsOffset]; + } else if (militaryOffset) { + // the only allowed military tz is Z + return 0; + } else { + var hm = parseInt(numOffset, 10); + var m = hm % 100, h = (hm - m) / 100; + return h * 60 + m; + } + } - function u(t, e, i) { - var n, a = t[e].fill, r = [e]; - if (!i) return a; - for (; !1 !== a && -1 === r.indexOf(a);) { - if (!isFinite(a)) return a; - if (!(n = t[a])) return !1; - if (n.visible) return a; - r.push(a), a = n.fill - } - return !1 - } + // date and time from ref 2822 format + function configFromRFC2822(config) { + var match = rfc2822.exec(preprocessRFC2822(config._i)); + if (match) { + var parsedArray = extractFromRFC2822Strings(match[4], match[3], match[2], match[5], match[6], match[7]); + if (!checkWeekday(match[1], parsedArray, config)) { + return; + } - function d(t) { - return t && !t.skip - } + config._a = parsedArray; + config._tzm = calculateOffset(match[8], match[9], match[10]); - function h(t, e, i, n, a) { - var o; - if (n && a) { - for (t.moveTo(e[0].x, e[0].y), o = 1; o < n; ++o) r.canvas.lineTo(t, e[o - 1], e[o]); - for (t.lineTo(i[a - 1].x, i[a - 1].y), o = a - 1; o > 0; --o) r.canvas.lineTo(t, i[o], i[o - 1], !0) - } - } + config._d = createUTCDate.apply(null, config._a); + config._d.setUTCMinutes(config._d.getUTCMinutes() - config._tzm); - e.exports = { - id: "filler", afterDatasetsUpdate: function (t, e) { - var i, n, r, d, h, c, f, g = (t.data.datasets || []).length, m = e.propagate, p = []; - for (n = 0; n < g; ++n) d = null, (r = (i = t.getDatasetMeta(n)).dataset) && r._model && r instanceof a.Line && (d = { - visible: t.isDatasetVisible(n), - fill: s(r, n, g), - chart: t, - el: r - }), i.$filler = d, p.push(d); - for (n = 0; n < g; ++n) (d = p[n]) && (d.fill = u(p, n, m), d.boundary = l(d), d.mapper = (void 0, f = void 0, c = (h = d).fill, f = "dataset", !1 === c ? null : (isFinite(c) || (f = "boundary"), o[f](h)))) - }, beforeDatasetDraw: function (t, e) { - var i = e.meta.$filler; - if (i) { - var a = t.ctx, o = i.el, s = o._view, l = o._children || [], u = i.mapper, - c = s.backgroundColor || n.global.defaultColor; - u && c && l.length && (r.canvas.clipArea(a, t.chartArea), function (t, e, i, n, a, r) { - var o, s, l, u, c, f, g, m = e.length, p = n.spanGaps, v = [], y = [], b = 0, x = 0; - for (t.beginPath(), o = 0, s = m + !!r; o < s; ++o) c = i(u = e[l = o % m]._view, l, n), f = d(u), g = d(c), f && g ? (b = v.push(u), x = y.push(c)) : b && x && (p ? (f && v.push(u), g && y.push(c)) : (h(t, v, y, b, x), b = x = 0, v = [], y = [])); - h(t, v, y, b, x), t.closePath(), t.fillStyle = a, t.fill() - }(a, l, u, s, c, o._loop), r.canvas.unclipArea(a)) - } - } - } - }, {25: 25, 40: 40, 45: 45}], 51: [function (t, e, i) { - "use strict"; - var n = t(25), a = t(26), r = t(45), o = t(30), s = r.noop; + getParsingFlags(config).rfc2822 = true; + } else { + config._isValid = false; + } + } - function l(t, e) { - return t.usePointStyle ? e * Math.SQRT2 : t.boxWidth - } + // date from iso format or fallback + function configFromString(config) { + var matched = aspNetJsonRegex.exec(config._i); - n._set("global", { - legend: { - display: !0, - position: "top", - fullWidth: !0, - reverse: !1, - weight: 1e3, - onClick: function (t, e) { - var i = e.datasetIndex, n = this.chart, a = n.getDatasetMeta(i); - a.hidden = null === a.hidden ? !n.data.datasets[i].hidden : null, n.update() - }, - onHover: null, - labels: { - boxWidth: 40, padding: 10, generateLabels: function (t) { - var e = t.data; - return r.isArray(e.datasets) ? e.datasets.map(function (e, i) { - return { - text: e.label, - fillStyle: r.isArray(e.backgroundColor) ? e.backgroundColor[0] : e.backgroundColor, - hidden: !t.isDatasetVisible(i), - lineCap: e.borderCapStyle, - lineDash: e.borderDash, - lineDashOffset: e.borderDashOffset, - lineJoin: e.borderJoinStyle, - lineWidth: e.borderWidth, - strokeStyle: e.borderColor, - pointStyle: e.pointStyle, - datasetIndex: i - } - }, this) : [] - } - } - }, legendCallback: function (t) { - var e = []; - e.push('<ul class="' + t.id + '-legend">'); - for (var i = 0; i < t.data.datasets.length; i++) e.push('<li><span style="background-color:' + t.data.datasets[i].backgroundColor + '"></span>'), t.data.datasets[i].label && e.push(t.data.datasets[i].label), e.push("</li>"); - return e.push("</ul>"), e.join("") - } - }); - var u = a.extend({ - initialize: function (t) { - r.extend(this, t), this.legendHitBoxes = [], this.doughnutMode = !1 - }, beforeUpdate: s, update: function (t, e, i) { - var n = this; - return n.beforeUpdate(), n.maxWidth = t, n.maxHeight = e, n.margins = i, n.beforeSetDimensions(), n.setDimensions(), n.afterSetDimensions(), n.beforeBuildLabels(), n.buildLabels(), n.afterBuildLabels(), n.beforeFit(), n.fit(), n.afterFit(), n.afterUpdate(), n.minSize - }, afterUpdate: s, beforeSetDimensions: s, setDimensions: function () { - var t = this; - t.isHorizontal() ? (t.width = t.maxWidth, t.left = 0, t.right = t.width) : (t.height = t.maxHeight, t.top = 0, t.bottom = t.height), t.paddingLeft = 0, t.paddingTop = 0, t.paddingRight = 0, t.paddingBottom = 0, t.minSize = { - width: 0, - height: 0 - } - }, afterSetDimensions: s, beforeBuildLabels: s, buildLabels: function () { - var t = this, e = t.options.labels || {}, i = r.callback(e.generateLabels, [t.chart], t) || []; - e.filter && (i = i.filter(function (i) { - return e.filter(i, t.chart.data) - })), t.options.reverse && i.reverse(), t.legendItems = i - }, afterBuildLabels: s, beforeFit: s, fit: function () { - var t = this, e = t.options, i = e.labels, a = e.display, o = t.ctx, s = n.global, - u = r.valueOrDefault, d = u(i.fontSize, s.defaultFontSize), - h = u(i.fontStyle, s.defaultFontStyle), c = u(i.fontFamily, s.defaultFontFamily), - f = r.fontString(d, h, c), g = t.legendHitBoxes = [], m = t.minSize, p = t.isHorizontal(); - if (p ? (m.width = t.maxWidth, m.height = a ? 10 : 0) : (m.width = a ? 10 : 0, m.height = t.maxHeight), a) if (o.font = f, p) { - var v = t.lineWidths = [0], y = t.legendItems.length ? d + i.padding : 0; - o.textAlign = "left", o.textBaseline = "top", r.each(t.legendItems, function (e, n) { - var a = l(i, d) + d / 2 + o.measureText(e.text).width; - v[v.length - 1] + a + i.padding >= t.width && (y += d + i.padding, v[v.length] = t.left), g[n] = { - left: 0, - top: 0, - width: a, - height: d - }, v[v.length - 1] += a + i.padding - }), m.height += y - } else { - var b = i.padding, x = t.columnWidths = [], _ = i.padding, k = 0, w = 0, M = d + b; - r.each(t.legendItems, function (t, e) { - var n = l(i, d) + d / 2 + o.measureText(t.text).width; - w + M > m.height && (_ += k + i.padding, x.push(k), k = 0, w = 0), k = Math.max(k, n), w += M, g[e] = { - left: 0, - top: 0, - width: n, - height: d - } - }), _ += k, x.push(k), m.width += _ - } - t.width = m.width, t.height = m.height - }, afterFit: s, isHorizontal: function () { - return "top" === this.options.position || "bottom" === this.options.position - }, draw: function () { - var t = this, e = t.options, i = e.labels, a = n.global, o = a.elements.line, s = t.width, - u = t.lineWidths; - if (e.display) { - var d, h = t.ctx, c = r.valueOrDefault, f = c(i.fontColor, a.defaultFontColor), - g = c(i.fontSize, a.defaultFontSize), m = c(i.fontStyle, a.defaultFontStyle), - p = c(i.fontFamily, a.defaultFontFamily), v = r.fontString(g, m, p); - h.textAlign = "left", h.textBaseline = "middle", h.lineWidth = .5, h.strokeStyle = f, h.fillStyle = f, h.font = v; - var y = l(i, g), b = t.legendHitBoxes, x = t.isHorizontal(); - d = x ? {x: t.left + (s - u[0]) / 2, y: t.top + i.padding, line: 0} : { - x: t.left + i.padding, - y: t.top + i.padding, - line: 0 - }; - var _ = g + i.padding; - r.each(t.legendItems, function (n, l) { - var f, m, p, v, k, w = h.measureText(n.text).width, M = y + g / 2 + w, S = d.x, D = d.y; - x ? S + M >= s && (D = d.y += _, d.line++, S = d.x = t.left + (s - u[d.line]) / 2) : D + _ > t.bottom && (S = d.x = S + t.columnWidths[d.line] + i.padding, D = d.y = t.top + i.padding, d.line++), function (t, i, n) { - if (!(isNaN(y) || y <= 0)) { - h.save(), h.fillStyle = c(n.fillStyle, a.defaultColor), h.lineCap = c(n.lineCap, o.borderCapStyle), h.lineDashOffset = c(n.lineDashOffset, o.borderDashOffset), h.lineJoin = c(n.lineJoin, o.borderJoinStyle), h.lineWidth = c(n.lineWidth, o.borderWidth), h.strokeStyle = c(n.strokeStyle, a.defaultColor); - var s = 0 === c(n.lineWidth, o.borderWidth); - if (h.setLineDash && h.setLineDash(c(n.lineDash, o.borderDash)), e.labels && e.labels.usePointStyle) { - var l = g * Math.SQRT2 / 2, u = l / Math.SQRT2, d = t + u, f = i + u; - r.canvas.drawPoint(h, n.pointStyle, l, d, f) - } else s || h.strokeRect(t, i, y, g), h.fillRect(t, i, y, g); - h.restore() - } - }(S, D, n), b[l].left = S, b[l].top = D, f = n, m = w, v = y + (p = g / 2) + S, k = D + p, h.fillText(f.text, v, k), f.hidden && (h.beginPath(), h.lineWidth = 2, h.moveTo(v, k), h.lineTo(v + m, k), h.stroke()), x ? d.x += M + i.padding : d.y += _ - }) - } - }, handleEvent: function (t) { - var e = this, i = e.options, n = "mouseup" === t.type ? "click" : t.type, a = !1; - if ("mousemove" === n) { - if (!i.onHover) return - } else { - if ("click" !== n) return; - if (!i.onClick) return - } - var r = t.x, o = t.y; - if (r >= e.left && r <= e.right && o >= e.top && o <= e.bottom) for (var s = e.legendHitBoxes, l = 0; l < s.length; ++l) { - var u = s[l]; - if (r >= u.left && r <= u.left + u.width && o >= u.top && o <= u.top + u.height) { - if ("click" === n) { - i.onClick.call(e, t.native, e.legendItems[l]), a = !0; - break - } - if ("mousemove" === n) { - i.onHover.call(e, t.native, e.legendItems[l]), a = !0; - break - } - } - } - return a - } - }); + if (matched !== null) { + config._d = new Date(+matched[1]); + return; + } - function d(t, e) { - var i = new u({ctx: t.ctx, options: e, chart: t}); - o.configure(t, i, e), o.addBox(t, i), t.legend = i - } + configFromISO(config); + if (config._isValid === false) { + delete config._isValid; + } else { + return; + } - e.exports = { - id: "legend", _element: u, beforeInit: function (t) { - var e = t.options.legend; - e && d(t, e) - }, beforeUpdate: function (t) { - var e = t.options.legend, i = t.legend; - e ? (r.mergeIf(e, n.global.legend), i ? (o.configure(t, i, e), i.options = e) : d(t, e)) : i && (o.removeBox(t, i), delete t.legend) - }, afterEvent: function (t, e) { - var i = t.legend; - i && i.handleEvent(e) - } - } - }, {25: 25, 26: 26, 30: 30, 45: 45}], 52: [function (t, e, i) { - "use strict"; - var n = t(25), a = t(26), r = t(45), o = t(30), s = r.noop; - n._set("global", { - title: { - display: !1, - fontStyle: "bold", - fullWidth: !0, - lineHeight: 1.2, - padding: 10, - position: "top", - text: "", - weight: 2e3 - } - }); - var l = a.extend({ - initialize: function (t) { - r.extend(this, t), this.legendHitBoxes = [] - }, - beforeUpdate: s, - update: function (t, e, i) { - var n = this; - return n.beforeUpdate(), n.maxWidth = t, n.maxHeight = e, n.margins = i, n.beforeSetDimensions(), n.setDimensions(), n.afterSetDimensions(), n.beforeBuildLabels(), n.buildLabels(), n.afterBuildLabels(), n.beforeFit(), n.fit(), n.afterFit(), n.afterUpdate(), n.minSize - }, - afterUpdate: s, - beforeSetDimensions: s, - setDimensions: function () { - var t = this; - t.isHorizontal() ? (t.width = t.maxWidth, t.left = 0, t.right = t.width) : (t.height = t.maxHeight, t.top = 0, t.bottom = t.height), t.paddingLeft = 0, t.paddingTop = 0, t.paddingRight = 0, t.paddingBottom = 0, t.minSize = { - width: 0, - height: 0 - } - }, - afterSetDimensions: s, - beforeBuildLabels: s, - buildLabels: s, - afterBuildLabels: s, - beforeFit: s, - fit: function () { - var t = r.valueOrDefault, e = this.options, i = e.display, - a = t(e.fontSize, n.global.defaultFontSize), o = this.minSize, - s = r.isArray(e.text) ? e.text.length : 1, l = r.options.toLineHeight(e.lineHeight, a), - u = i ? s * l + 2 * e.padding : 0; - this.isHorizontal() ? (o.width = this.maxWidth, o.height = u) : (o.width = u, o.height = this.maxHeight), this.width = o.width, this.height = o.height - }, - afterFit: s, - isHorizontal: function () { - var t = this.options.position; - return "top" === t || "bottom" === t - }, - draw: function () { - var t = this.ctx, e = r.valueOrDefault, i = this.options, a = n.global; - if (i.display) { - var o, s, l, u = e(i.fontSize, a.defaultFontSize), d = e(i.fontStyle, a.defaultFontStyle), - h = e(i.fontFamily, a.defaultFontFamily), c = r.fontString(u, d, h), - f = r.options.toLineHeight(i.lineHeight, u), g = f / 2 + i.padding, m = 0, p = this.top, - v = this.left, y = this.bottom, b = this.right; - t.fillStyle = e(i.fontColor, a.defaultFontColor), t.font = c, this.isHorizontal() ? (s = v + (b - v) / 2, l = p + g, o = b - v) : (s = "left" === i.position ? v + g : b - g, l = p + (y - p) / 2, o = y - p, m = Math.PI * ("left" === i.position ? -.5 : .5)), t.save(), t.translate(s, l), t.rotate(m), t.textAlign = "center", t.textBaseline = "middle"; - var x = i.text; - if (r.isArray(x)) for (var _ = 0, k = 0; k < x.length; ++k) t.fillText(x[k], 0, _, o), _ += f; else t.fillText(x, 0, 0, o); - t.restore() - } - } - }); + configFromRFC2822(config); + if (config._isValid === false) { + delete config._isValid; + } else { + return; + } - function u(t, e) { - var i = new l({ctx: t.ctx, options: e, chart: t}); - o.configure(t, i, e), o.addBox(t, i), t.titleBlock = i - } + // Final attempt, use Input Fallback + hooks.createFromInputFallback(config); + } - e.exports = { - id: "title", _element: l, beforeInit: function (t) { - var e = t.options.title; - e && u(t, e) - }, beforeUpdate: function (t) { - var e = t.options.title, i = t.titleBlock; - e ? (r.mergeIf(e, n.global.title), i ? (o.configure(t, i, e), i.options = e) : u(t, e)) : i && (o.removeBox(t, i), delete t.titleBlock) - } - } - }, {25: 25, 26: 26, 30: 30, 45: 45}], 53: [function (t, e, i) { - "use strict"; - e.exports = function (t) { - var e = t.Scale.extend({ - getLabels: function () { - var t = this.chart.data; - return this.options.labels || (this.isHorizontal() ? t.xLabels : t.yLabels) || t.labels - }, determineDataLimits: function () { - var t, e = this, i = e.getLabels(); - e.minIndex = 0, e.maxIndex = i.length - 1, void 0 !== e.options.ticks.min && (t = i.indexOf(e.options.ticks.min), e.minIndex = -1 !== t ? t : e.minIndex), void 0 !== e.options.ticks.max && (t = i.indexOf(e.options.ticks.max), e.maxIndex = -1 !== t ? t : e.maxIndex), e.min = i[e.minIndex], e.max = i[e.maxIndex] - }, buildTicks: function () { - var t = this.getLabels(); - this.ticks = 0 === this.minIndex && this.maxIndex === t.length - 1 ? t : t.slice(this.minIndex, this.maxIndex + 1) - }, getLabelForIndex: function (t, e) { - var i = this.chart.data, n = this.isHorizontal(); - return i.yLabels && !n ? this.getRightValue(i.datasets[e].data[t]) : this.ticks[t - this.minIndex] - }, getPixelForValue: function (t, e) { - var i, n = this, a = n.options.offset, - r = Math.max(n.maxIndex + 1 - n.minIndex - (a ? 0 : 1), 1); - if (null != t && (i = n.isHorizontal() ? t.x : t.y), void 0 !== i || void 0 !== t && isNaN(e)) { - t = i || t; - var o = n.getLabels().indexOf(t); - e = -1 !== o ? o : e - } - if (n.isHorizontal()) { - var s = n.width / r, l = s * (e - n.minIndex); - return a && (l += s / 2), n.left + Math.round(l) - } - var u = n.height / r, d = u * (e - n.minIndex); - return a && (d += u / 2), n.top + Math.round(d) - }, getPixelForTick: function (t) { - return this.getPixelForValue(this.ticks[t], t + this.minIndex, null) - }, getValueForPixel: function (t) { - var e = this.options.offset, i = Math.max(this._ticks.length - (e ? 0 : 1), 1), - n = this.isHorizontal(), a = (n ? this.width : this.height) / i; - return t -= n ? this.left : this.top, e && (t -= a / 2), (t <= 0 ? 0 : Math.round(t / a)) + this.minIndex - }, getBasePixel: function () { - return this.bottom - } - }); - t.scaleService.registerScaleType("category", e, {position: "bottom"}) + hooks.createFromInputFallback = deprecate( + 'value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), ' + + 'which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are ' + + 'discouraged and will be removed in an upcoming major release. Please refer to ' + + 'http://momentjs.com/guides/#/warnings/js-date/ for more info.', + function (config) { + config._d = new Date(config._i + (config._useUTC ? ' UTC' : '')); + } + ); + + // constant that refers to the ISO standard + hooks.ISO_8601 = function () { + }; + + // constant that refers to the RFC 2822 form + hooks.RFC_2822 = function () { + }; + + // date from string and format string + function configFromStringAndFormat(config) { + // TODO: Move this to another part of the creation flow to prevent circular deps + if (config._f === hooks.ISO_8601) { + configFromISO(config); + return; + } + if (config._f === hooks.RFC_2822) { + configFromRFC2822(config); + return; + } + config._a = []; + getParsingFlags(config).empty = true; + + // This array is used to make a Date, either with `new Date` or `Date.UTC` + var string = '' + config._i, + i, parsedInput, tokens, token, skipped, + stringLength = string.length, + totalParsedInputLength = 0; + + tokens = expandFormat(config._f, config._locale).match(formattingTokens) || []; + + for (i = 0; i < tokens.length; i++) { + token = tokens[i]; + parsedInput = (string.match(getParseRegexForToken(token, config)) || [])[0]; + // console.log('token', token, 'parsedInput', parsedInput, + // 'regex', getParseRegexForToken(token, config)); + if (parsedInput) { + skipped = string.substr(0, string.indexOf(parsedInput)); + if (skipped.length > 0) { + getParsingFlags(config).unusedInput.push(skipped); } - }, {}], 54: [function (t, e, i) { - "use strict"; - var n = t(25), a = t(45), r = t(34); - e.exports = function (t) { - var e = {position: "left", ticks: {callback: r.formatters.linear}}, i = t.LinearScaleBase.extend({ - determineDataLimits: function () { - var t = this, e = t.options, i = t.chart, n = i.data.datasets, r = t.isHorizontal(); - - function o(e) { - return r ? e.xAxisID === t.id : e.yAxisID === t.id - } - - t.min = null, t.max = null; - var s = e.stacked; - if (void 0 === s && a.each(n, function (t, e) { - if (!s) { - var n = i.getDatasetMeta(e); - i.isDatasetVisible(e) && o(n) && void 0 !== n.stack && (s = !0) - } - }), e.stacked || s) { - var l = {}; - a.each(n, function (n, r) { - var s = i.getDatasetMeta(r), - u = [s.type, void 0 === e.stacked && void 0 === s.stack ? r : "", s.stack].join("."); - void 0 === l[u] && (l[u] = {positiveValues: [], negativeValues: []}); - var d = l[u].positiveValues, h = l[u].negativeValues; - i.isDatasetVisible(r) && o(s) && a.each(n.data, function (i, n) { - var a = +t.getRightValue(i); - isNaN(a) || s.data[n].hidden || (d[n] = d[n] || 0, h[n] = h[n] || 0, e.relativePoints ? d[n] = 100 : a < 0 ? h[n] += a : d[n] += a) - }) - }), a.each(l, function (e) { - var i = e.positiveValues.concat(e.negativeValues), n = a.min(i), r = a.max(i); - t.min = null === t.min ? n : Math.min(t.min, n), t.max = null === t.max ? r : Math.max(t.max, r) - }) - } else a.each(n, function (e, n) { - var r = i.getDatasetMeta(n); - i.isDatasetVisible(n) && o(r) && a.each(e.data, function (e, i) { - var n = +t.getRightValue(e); - isNaN(n) || r.data[i].hidden || (null === t.min ? t.min = n : n < t.min && (t.min = n), null === t.max ? t.max = n : n > t.max && (t.max = n)) - }) - }); - t.min = isFinite(t.min) && !isNaN(t.min) ? t.min : 0, t.max = isFinite(t.max) && !isNaN(t.max) ? t.max : 1, this.handleTickRangeOptions() - }, getTickLimit: function () { - var t, e = this.options.ticks; - if (this.isHorizontal()) t = Math.min(e.maxTicksLimit ? e.maxTicksLimit : 11, Math.ceil(this.width / 50)); else { - var i = a.valueOrDefault(e.fontSize, n.global.defaultFontSize); - t = Math.min(e.maxTicksLimit ? e.maxTicksLimit : 11, Math.ceil(this.height / (2 * i))) - } - return t - }, handleDirectionalChanges: function () { - this.isHorizontal() || this.ticks.reverse() - }, getLabelForIndex: function (t, e) { - return +this.getRightValue(this.chart.data.datasets[e].data[t]) - }, getPixelForValue: function (t) { - var e = this.start, i = +this.getRightValue(t), n = this.end - e; - return this.isHorizontal() ? this.left + this.width / n * (i - e) : this.bottom - this.height / n * (i - e) - }, getValueForPixel: function (t) { - var e = this.isHorizontal(), i = e ? this.width : this.height, - n = (e ? t - this.left : this.bottom - t) / i; - return this.start + (this.end - this.start) * n - }, getPixelForTick: function (t) { - return this.getPixelForValue(this.ticksAsNumbers[t]) - } - }); - t.scaleService.registerScaleType("linear", i, e) + string = string.slice(string.indexOf(parsedInput) + parsedInput.length); + totalParsedInputLength += parsedInput.length; + } + // don't parse if it's not a known token + if (formatTokenFunctions[token]) { + if (parsedInput) { + getParsingFlags(config).empty = false; + } else { + getParsingFlags(config).unusedTokens.push(token); } - }, {25: 25, 34: 34, 45: 45}], 55: [function (t, e, i) { - "use strict"; - var n = t(45); - e.exports = function (t) { - var e = n.noop; - t.LinearScaleBase = t.Scale.extend({ - getRightValue: function (e) { - return "string" == typeof e ? +e : t.Scale.prototype.getRightValue.call(this, e) - }, handleTickRangeOptions: function () { - var t = this, e = t.options.ticks; - if (e.beginAtZero) { - var i = n.sign(t.min), a = n.sign(t.max); - i < 0 && a < 0 ? t.max = 0 : i > 0 && a > 0 && (t.min = 0) - } - var r = void 0 !== e.min || void 0 !== e.suggestedMin, - o = void 0 !== e.max || void 0 !== e.suggestedMax; - void 0 !== e.min ? t.min = e.min : void 0 !== e.suggestedMin && (null === t.min ? t.min = e.suggestedMin : t.min = Math.min(t.min, e.suggestedMin)), void 0 !== e.max ? t.max = e.max : void 0 !== e.suggestedMax && (null === t.max ? t.max = e.suggestedMax : t.max = Math.max(t.max, e.suggestedMax)), r !== o && t.min >= t.max && (r ? t.max = t.min + 1 : t.min = t.max - 1), t.min === t.max && (t.max++, e.beginAtZero || t.min--) - }, getTickLimit: e, handleDirectionalChanges: e, buildTicks: function () { - var t = this, e = t.options.ticks, i = t.getTickLimit(), a = { - maxTicks: i = Math.max(2, i), - min: e.min, - max: e.max, - stepSize: n.valueOrDefault(e.fixedStepSize, e.stepSize) - }, r = t.ticks = function (t, e) { - var i, a = []; - if (t.stepSize && t.stepSize > 0) i = t.stepSize; else { - var r = n.niceNum(e.max - e.min, !1); - i = n.niceNum(r / (t.maxTicks - 1), !0) - } - var o = Math.floor(e.min / i) * i, s = Math.ceil(e.max / i) * i; - t.min && t.max && t.stepSize && n.almostWhole((t.max - t.min) / t.stepSize, i / 1e3) && (o = t.min, s = t.max); - var l = (s - o) / i; - l = n.almostEquals(l, Math.round(l), i / 1e3) ? Math.round(l) : Math.ceil(l); - var u = 1; - i < 1 && (u = Math.pow(10, i.toString().length - 2), o = Math.round(o * u) / u, s = Math.round(s * u) / u), a.push(void 0 !== t.min ? t.min : o); - for (var d = 1; d < l; ++d) a.push(Math.round((o + d * i) * u) / u); - return a.push(void 0 !== t.max ? t.max : s), a - }(a, t); - t.handleDirectionalChanges(), t.max = n.max(r), t.min = n.min(r), e.reverse ? (r.reverse(), t.start = t.max, t.end = t.min) : (t.start = t.min, t.end = t.max) - }, convertTicksToLabels: function () { - this.ticksAsNumbers = this.ticks.slice(), this.zeroLineIndex = this.ticks.indexOf(0), t.Scale.prototype.convertTicksToLabels.call(this) - } - }) + addTimeToArrayFromToken(token, parsedInput, config); + } else if (config._strict && !parsedInput) { + getParsingFlags(config).unusedTokens.push(token); + } + } + + // add remaining unparsed input length to the string + getParsingFlags(config).charsLeftOver = stringLength - totalParsedInputLength; + if (string.length > 0) { + getParsingFlags(config).unusedInput.push(string); + } + + // clear _12h flag if hour is <= 12 + if (config._a[HOUR] <= 12 && + getParsingFlags(config).bigHour === true && + config._a[HOUR] > 0) { + getParsingFlags(config).bigHour = undefined; + } + + getParsingFlags(config).parsedDateParts = config._a.slice(0); + getParsingFlags(config).meridiem = config._meridiem; + // handle meridiem + config._a[HOUR] = meridiemFixWrap(config._locale, config._a[HOUR], config._meridiem); + + configFromArray(config); + checkOverflow(config); + } + + + function meridiemFixWrap(locale, hour, meridiem) { + var isPm; + + if (meridiem == null) { + // nothing to do + return hour; + } + if (locale.meridiemHour != null) { + return locale.meridiemHour(hour, meridiem); + } else if (locale.isPM != null) { + // Fallback + isPm = locale.isPM(meridiem); + if (isPm && hour < 12) { + hour += 12; + } + if (!isPm && hour === 12) { + hour = 0; + } + return hour; + } else { + // this is not supposed to happen + return hour; + } + } + + // date from string and array of format strings + function configFromStringAndArray(config) { + var tempConfig, + bestMoment, + + scoreToBeat, + i, + currentScore; + + if (config._f.length === 0) { + getParsingFlags(config).invalidFormat = true; + config._d = new Date(NaN); + return; + } + + for (i = 0; i < config._f.length; i++) { + currentScore = 0; + tempConfig = copyConfig({}, config); + if (config._useUTC != null) { + tempConfig._useUTC = config._useUTC; + } + tempConfig._f = config._f[i]; + configFromStringAndFormat(tempConfig); + + if (!isValid(tempConfig)) { + continue; + } + + // if there is any input that was not parsed add a penalty for that format + currentScore += getParsingFlags(tempConfig).charsLeftOver; + + //or tokens + currentScore += getParsingFlags(tempConfig).unusedTokens.length * 10; + + getParsingFlags(tempConfig).score = currentScore; + + if (scoreToBeat == null || currentScore < scoreToBeat) { + scoreToBeat = currentScore; + bestMoment = tempConfig; + } + } + + extend(config, bestMoment || tempConfig); + } + + function configFromObject(config) { + if (config._d) { + return; + } + + var i = normalizeObjectUnits(config._i); + config._a = map([i.year, i.month, i.day || i.date, i.hour, i.minute, i.second, i.millisecond], function (obj) { + return obj && parseInt(obj, 10); + }); + + configFromArray(config); + } + + function createFromConfig(config) { + var res = new Moment(checkOverflow(prepareConfig(config))); + if (res._nextDay) { + // Adding is smart enough around DST + res.add(1, 'd'); + res._nextDay = undefined; + } + + return res; + } + + function prepareConfig(config) { + var input = config._i, + format = config._f; + + config._locale = config._locale || getLocale(config._l); + + if (input === null || (format === undefined && input === '')) { + return createInvalid({nullInput: true}); + } + + if (typeof input === 'string') { + config._i = input = config._locale.preparse(input); + } + + if (isMoment(input)) { + return new Moment(checkOverflow(input)); + } else if (isDate(input)) { + config._d = input; + } else if (isArray(format)) { + configFromStringAndArray(config); + } else if (format) { + configFromStringAndFormat(config); + } else { + configFromInput(config); + } + + if (!isValid(config)) { + config._d = null; + } + + return config; + } + + function configFromInput(config) { + var input = config._i; + if (isUndefined(input)) { + config._d = new Date(hooks.now()); + } else if (isDate(input)) { + config._d = new Date(input.valueOf()); + } else if (typeof input === 'string') { + configFromString(config); + } else if (isArray(input)) { + config._a = map(input.slice(0), function (obj) { + return parseInt(obj, 10); + }); + configFromArray(config); + } else if (isObject(input)) { + configFromObject(config); + } else if (isNumber(input)) { + // from milliseconds + config._d = new Date(input); + } else { + hooks.createFromInputFallback(config); + } + } + + function createLocalOrUTC(input, format, locale, strict, isUTC) { + var c = {}; + + if (locale === true || locale === false) { + strict = locale; + locale = undefined; + } + + if ((isObject(input) && isObjectEmpty(input)) || + (isArray(input) && input.length === 0)) { + input = undefined; + } + // object construction must be done this way. + // https://github.com/moment/moment/issues/1423 + c._isAMomentObject = true; + c._useUTC = c._isUTC = isUTC; + c._l = locale; + c._i = input; + c._f = format; + c._strict = strict; + + return createFromConfig(c); + } + + function createLocal(input, format, locale, strict) { + return createLocalOrUTC(input, format, locale, strict, false); + } + + var prototypeMin = deprecate( + 'moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/', + function () { + var other = createLocal.apply(null, arguments); + if (this.isValid() && other.isValid()) { + return other < this ? this : other; + } else { + return createInvalid(); + } + } + ); + + var prototypeMax = deprecate( + 'moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/', + function () { + var other = createLocal.apply(null, arguments); + if (this.isValid() && other.isValid()) { + return other > this ? this : other; + } else { + return createInvalid(); + } + } + ); + + // Pick a moment m from moments so that m[fn](other) is true for all + // other. This relies on the function fn to be transitive. + // + // moments should either be an array of moment objects or an array, whose + // first element is an array of moment objects. + function pickBy(fn, moments) { + var res, i; + if (moments.length === 1 && isArray(moments[0])) { + moments = moments[0]; + } + if (!moments.length) { + return createLocal(); + } + res = moments[0]; + for (i = 1; i < moments.length; ++i) { + if (!moments[i].isValid() || moments[i][fn](res)) { + res = moments[i]; + } + } + return res; + } + + // TODO: Use [].sort instead? + function min() { + var args = [].slice.call(arguments, 0); + + return pickBy('isBefore', args); + } + + function max() { + var args = [].slice.call(arguments, 0); + + return pickBy('isAfter', args); + } + + var now = function () { + return Date.now ? Date.now() : +(new Date()); + }; + + var ordering = ['year', 'quarter', 'month', 'week', 'day', 'hour', 'minute', 'second', 'millisecond']; + + function isDurationValid(m) { + for (var key in m) { + if (!(indexOf.call(ordering, key) !== -1 && (m[key] == null || !isNaN(m[key])))) { + return false; + } + } + + var unitHasDecimal = false; + for (var i = 0; i < ordering.length; ++i) { + if (m[ordering[i]]) { + if (unitHasDecimal) { + return false; // only allow non-integers for smallest unit } - }, {45: 45}], 56: [function (t, e, i) { - "use strict"; - var n = t(45), a = t(34); - e.exports = function (t) { - var e = {position: "left", ticks: {callback: a.formatters.logarithmic}}, i = t.Scale.extend({ - determineDataLimits: function () { - var t = this, e = t.options, i = t.chart, a = i.data.datasets, r = t.isHorizontal(); - - function o(e) { - return r ? e.xAxisID === t.id : e.yAxisID === t.id - } - - t.min = null, t.max = null, t.minNotZero = null; - var s = e.stacked; - if (void 0 === s && n.each(a, function (t, e) { - if (!s) { - var n = i.getDatasetMeta(e); - i.isDatasetVisible(e) && o(n) && void 0 !== n.stack && (s = !0) - } - }), e.stacked || s) { - var l = {}; - n.each(a, function (a, r) { - var s = i.getDatasetMeta(r), - u = [s.type, void 0 === e.stacked && void 0 === s.stack ? r : "", s.stack].join("."); - i.isDatasetVisible(r) && o(s) && (void 0 === l[u] && (l[u] = []), n.each(a.data, function (e, i) { - var n = l[u], a = +t.getRightValue(e); - isNaN(a) || s.data[i].hidden || a < 0 || (n[i] = n[i] || 0, n[i] += a) - })) - }), n.each(l, function (e) { - if (e.length > 0) { - var i = n.min(e), a = n.max(e); - t.min = null === t.min ? i : Math.min(t.min, i), t.max = null === t.max ? a : Math.max(t.max, a) - } - }) - } else n.each(a, function (e, a) { - var r = i.getDatasetMeta(a); - i.isDatasetVisible(a) && o(r) && n.each(e.data, function (e, i) { - var n = +t.getRightValue(e); - isNaN(n) || r.data[i].hidden || n < 0 || (null === t.min ? t.min = n : n < t.min && (t.min = n), null === t.max ? t.max = n : n > t.max && (t.max = n), 0 !== n && (null === t.minNotZero || n < t.minNotZero) && (t.minNotZero = n)) - }) - }); - this.handleTickRangeOptions() - }, handleTickRangeOptions: function () { - var t = this, e = t.options.ticks, i = n.valueOrDefault; - t.min = i(e.min, t.min), t.max = i(e.max, t.max), t.min === t.max && (0 !== t.min && null !== t.min ? (t.min = Math.pow(10, Math.floor(n.log10(t.min)) - 1), t.max = Math.pow(10, Math.floor(n.log10(t.max)) + 1)) : (t.min = 1, t.max = 10)), null === t.min && (t.min = Math.pow(10, Math.floor(n.log10(t.max)) - 1)), null === t.max && (t.max = 0 !== t.min ? Math.pow(10, Math.floor(n.log10(t.min)) + 1) : 10), null === t.minNotZero && (t.min > 0 ? t.minNotZero = t.min : t.max < 1 ? t.minNotZero = Math.pow(10, Math.floor(n.log10(t.max))) : t.minNotZero = 1) - }, buildTicks: function () { - var t = this, e = t.options.ticks, i = !t.isHorizontal(), a = {min: e.min, max: e.max}, - r = t.ticks = function (t, e) { - var i, a, r = [], o = n.valueOrDefault, - s = o(t.min, Math.pow(10, Math.floor(n.log10(e.min)))), - l = Math.floor(n.log10(e.max)), u = Math.ceil(e.max / Math.pow(10, l)); - 0 === s ? (i = Math.floor(n.log10(e.minNotZero)), a = Math.floor(e.minNotZero / Math.pow(10, i)), r.push(s), s = a * Math.pow(10, i)) : (i = Math.floor(n.log10(s)), a = Math.floor(s / Math.pow(10, i))); - for (var d = i < 0 ? Math.pow(10, Math.abs(i)) : 1; r.push(s), 10 == ++a && (a = 1, d = ++i >= 0 ? 1 : d), s = Math.round(a * Math.pow(10, i) * d) / d, i < l || i === l && a < u;) ; - var h = o(t.max, s); - return r.push(h), r - }(a, t); - t.max = n.max(r), t.min = n.min(r), e.reverse ? (i = !i, t.start = t.max, t.end = t.min) : (t.start = t.min, t.end = t.max), i && r.reverse() - }, convertTicksToLabels: function () { - this.tickValues = this.ticks.slice(), t.Scale.prototype.convertTicksToLabels.call(this) - }, getLabelForIndex: function (t, e) { - return +this.getRightValue(this.chart.data.datasets[e].data[t]) - }, getPixelForTick: function (t) { - return this.getPixelForValue(this.tickValues[t]) - }, _getFirstTickValue: function (t) { - var e = Math.floor(n.log10(t)); - return Math.floor(t / Math.pow(10, e)) * Math.pow(10, e) - }, getPixelForValue: function (e) { - var i, a, r, o, s, l = this, u = l.options.ticks.reverse, d = n.log10, - h = l._getFirstTickValue(l.minNotZero), c = 0; - return e = +l.getRightValue(e), u ? (r = l.end, o = l.start, s = -1) : (r = l.start, o = l.end, s = 1), l.isHorizontal() ? (i = l.width, a = u ? l.right : l.left) : (i = l.height, s *= -1, a = u ? l.top : l.bottom), e !== r && (0 === r && (i -= c = n.getValueOrDefault(l.options.ticks.fontSize, t.defaults.global.defaultFontSize), r = h), 0 !== e && (c += i / (d(o) - d(r)) * (d(e) - d(r))), a += s * c), a - }, getValueForPixel: function (e) { - var i, a, r, o, s = this, l = s.options.ticks.reverse, u = n.log10, - d = s._getFirstTickValue(s.minNotZero); - if (l ? (a = s.end, r = s.start) : (a = s.start, r = s.end), s.isHorizontal() ? (i = s.width, o = l ? s.right - e : e - s.left) : (i = s.height, o = l ? e - s.top : s.bottom - e), o !== a) { - if (0 === a) { - var h = n.getValueOrDefault(s.options.ticks.fontSize, t.defaults.global.defaultFontSize); - o -= h, i -= h, a = d - } - o *= u(r) - u(a), o /= i, o = Math.pow(10, u(a) + o) - } - return o - } - }); - t.scaleService.registerScaleType("logarithmic", i, e) + if (parseFloat(m[ordering[i]]) !== toInt(m[ordering[i]])) { + unitHasDecimal = true; } - }, {34: 34, 45: 45}], 57: [function (t, e, i) { - "use strict"; - var n = t(25), a = t(45), r = t(34); - e.exports = function (t) { - var e = n.global, i = { - display: !0, - animate: !0, - position: "chartArea", - angleLines: {display: !0, color: "rgba(0, 0, 0, 0.1)", lineWidth: 1}, - gridLines: {circular: !1}, - ticks: { - showLabelBackdrop: !0, - backdropColor: "rgba(255,255,255,0.75)", - backdropPaddingY: 2, - backdropPaddingX: 2, - callback: r.formatters.linear - }, - pointLabels: { - display: !0, fontSize: 10, callback: function (t) { - return t - } - } - }; - - function o(t) { - var e = t.options; - return e.angleLines.display || e.pointLabels.display ? t.chart.data.labels.length : 0 - } + } + } - function s(t) { - var i = t.options.pointLabels, n = a.valueOrDefault(i.fontSize, e.defaultFontSize), - r = a.valueOrDefault(i.fontStyle, e.defaultFontStyle), - o = a.valueOrDefault(i.fontFamily, e.defaultFontFamily); - return {size: n, style: r, family: o, font: a.fontString(n, r, o)} - } + return true; + } - function l(t, e, i, n, a) { - return t === n || t === a ? {start: e - i / 2, end: e + i / 2} : t < n || t > a ? { - start: e - i - 5, - end: e - } : {start: e, end: e + i + 5} - } + function isValid$1() { + return this._isValid; + } - function u(t, e, i, n) { - if (a.isArray(e)) for (var r = i.y, o = 1.5 * n, s = 0; s < e.length; ++s) t.fillText(e[s], i.x, r), r += o; else t.fillText(e, i.x, i.y) - } + function createInvalid$1() { + return createDuration(NaN); + } - function d(t) { - return a.isNumber(t) ? t : 0 - } + function Duration(duration) { + var normalizedInput = normalizeObjectUnits(duration), + years = normalizedInput.year || 0, + quarters = normalizedInput.quarter || 0, + months = normalizedInput.month || 0, + weeks = normalizedInput.week || normalizedInput.isoWeek || 0, + days = normalizedInput.day || 0, + hours = normalizedInput.hour || 0, + minutes = normalizedInput.minute || 0, + seconds = normalizedInput.second || 0, + milliseconds = normalizedInput.millisecond || 0; - var h = t.LinearScaleBase.extend({ - setDimensions: function () { - var t = this, i = t.options, n = i.ticks; - t.width = t.maxWidth, t.height = t.maxHeight, t.xCenter = Math.round(t.width / 2), t.yCenter = Math.round(t.height / 2); - var r = a.min([t.height, t.width]), o = a.valueOrDefault(n.fontSize, e.defaultFontSize); - t.drawingArea = i.display ? r / 2 - (o / 2 + n.backdropPaddingY) : r / 2 - }, determineDataLimits: function () { - var t = this, e = t.chart, i = Number.POSITIVE_INFINITY, n = Number.NEGATIVE_INFINITY; - a.each(e.data.datasets, function (r, o) { - if (e.isDatasetVisible(o)) { - var s = e.getDatasetMeta(o); - a.each(r.data, function (e, a) { - var r = +t.getRightValue(e); - isNaN(r) || s.data[a].hidden || (i = Math.min(r, i), n = Math.max(r, n)) - }) - } - }), t.min = i === Number.POSITIVE_INFINITY ? 0 : i, t.max = n === Number.NEGATIVE_INFINITY ? 0 : n, t.handleTickRangeOptions() - }, getTickLimit: function () { - var t = this.options.ticks, i = a.valueOrDefault(t.fontSize, e.defaultFontSize); - return Math.min(t.maxTicksLimit ? t.maxTicksLimit : 11, Math.ceil(this.drawingArea / (1.5 * i))) - }, convertTicksToLabels: function () { - t.LinearScaleBase.prototype.convertTicksToLabels.call(this), this.pointLabels = this.chart.data.labels.map(this.options.pointLabels.callback, this) - }, getLabelForIndex: function (t, e) { - return +this.getRightValue(this.chart.data.datasets[e].data[t]) - }, fit: function () { - var t, e; - this.options.pointLabels.display ? function (t) { - var e, i, n, r = s(t), u = Math.min(t.height / 2, t.width / 2), - d = {r: t.width, l: 0, t: t.height, b: 0}, h = {}; - t.ctx.font = r.font, t._pointLabelSizes = []; - var c, f, g, m = o(t); - for (e = 0; e < m; e++) { - n = t.getPointPosition(e, u), c = t.ctx, f = r.size, g = t.pointLabels[e] || "", i = a.isArray(g) ? { - w: a.longestText(c, c.font, g), - h: g.length * f + 1.5 * (g.length - 1) * f - } : {w: c.measureText(g).width, h: f}, t._pointLabelSizes[e] = i; - var p = t.getIndexAngle(e), v = a.toDegrees(p) % 360, y = l(v, n.x, i.w, 0, 180), - b = l(v, n.y, i.h, 90, 270); - y.start < d.l && (d.l = y.start, h.l = p), y.end > d.r && (d.r = y.end, h.r = p), b.start < d.t && (d.t = b.start, h.t = p), b.end > d.b && (d.b = b.end, h.b = p) - } - t.setReductions(u, d, h) - }(this) : (t = this, e = Math.min(t.height / 2, t.width / 2), t.drawingArea = Math.round(e), t.setCenterPoint(0, 0, 0, 0)) - }, setReductions: function (t, e, i) { - var n = e.l / Math.sin(i.l), a = Math.max(e.r - this.width, 0) / Math.sin(i.r), - r = -e.t / Math.cos(i.t), o = -Math.max(e.b - this.height, 0) / Math.cos(i.b); - n = d(n), a = d(a), r = d(r), o = d(o), this.drawingArea = Math.min(Math.round(t - (n + a) / 2), Math.round(t - (r + o) / 2)), this.setCenterPoint(n, a, r, o) - }, setCenterPoint: function (t, e, i, n) { - var a = this, r = a.width - e - a.drawingArea, o = t + a.drawingArea, s = i + a.drawingArea, - l = a.height - n - a.drawingArea; - a.xCenter = Math.round((o + r) / 2 + a.left), a.yCenter = Math.round((s + l) / 2 + a.top) - }, getIndexAngle: function (t) { - return t * (2 * Math.PI / o(this)) + (this.chart.options && this.chart.options.startAngle ? this.chart.options.startAngle : 0) * Math.PI * 2 / 360 - }, getDistanceFromCenterForValue: function (t) { - if (null === t) return 0; - var e = this.drawingArea / (this.max - this.min); - return this.options.ticks.reverse ? (this.max - t) * e : (t - this.min) * e - }, getPointPosition: function (t, e) { - var i = this.getIndexAngle(t) - Math.PI / 2; - return { - x: Math.round(Math.cos(i) * e) + this.xCenter, - y: Math.round(Math.sin(i) * e) + this.yCenter - } - }, getPointPositionForValue: function (t, e) { - return this.getPointPosition(t, this.getDistanceFromCenterForValue(e)) - }, getBasePosition: function () { - var t = this.min, e = this.max; - return this.getPointPositionForValue(0, this.beginAtZero ? 0 : t < 0 && e < 0 ? e : t > 0 && e > 0 ? t : 0) - }, draw: function () { - var t = this, i = t.options, n = i.gridLines, r = i.ticks, l = a.valueOrDefault; - if (i.display) { - var d = t.ctx, h = this.getIndexAngle(0), c = l(r.fontSize, e.defaultFontSize), - f = l(r.fontStyle, e.defaultFontStyle), g = l(r.fontFamily, e.defaultFontFamily), - m = a.fontString(c, f, g); - a.each(t.ticks, function (i, s) { - if (s > 0 || r.reverse) { - var u = t.getDistanceFromCenterForValue(t.ticksAsNumbers[s]); - if (n.display && 0 !== s && function (t, e, i, n) { - var r = t.ctx; - if (r.strokeStyle = a.valueAtIndexOrDefault(e.color, n - 1), r.lineWidth = a.valueAtIndexOrDefault(e.lineWidth, n - 1), t.options.gridLines.circular) r.beginPath(), r.arc(t.xCenter, t.yCenter, i, 0, 2 * Math.PI), r.closePath(), r.stroke(); else { - var s = o(t); - if (0 === s) return; - r.beginPath(); - var l = t.getPointPosition(0, i); - r.moveTo(l.x, l.y); - for (var u = 1; u < s; u++) l = t.getPointPosition(u, i), r.lineTo(l.x, l.y); - r.closePath(), r.stroke() - } - }(t, n, u, s), r.display) { - var f = l(r.fontColor, e.defaultFontColor); - if (d.font = m, d.save(), d.translate(t.xCenter, t.yCenter), d.rotate(h), r.showLabelBackdrop) { - var g = d.measureText(i).width; - d.fillStyle = r.backdropColor, d.fillRect(-g / 2 - r.backdropPaddingX, -u - c / 2 - r.backdropPaddingY, g + 2 * r.backdropPaddingX, c + 2 * r.backdropPaddingY) - } - d.textAlign = "center", d.textBaseline = "middle", d.fillStyle = f, d.fillText(i, 0, -u), d.restore() - } - } - }), (i.angleLines.display || i.pointLabels.display) && function (t) { - var i = t.ctx, n = t.options, r = n.angleLines, l = n.pointLabels; - i.lineWidth = r.lineWidth, i.strokeStyle = r.color; - var d, h, c, f, g = t.getDistanceFromCenterForValue(n.ticks.reverse ? t.min : t.max), - m = s(t); - i.textBaseline = "top"; - for (var p = o(t) - 1; p >= 0; p--) { - if (r.display) { - var v = t.getPointPosition(p, g); - i.beginPath(), i.moveTo(t.xCenter, t.yCenter), i.lineTo(v.x, v.y), i.stroke(), i.closePath() - } - if (l.display) { - var y = t.getPointPosition(p, g + 5), - b = a.valueAtIndexOrDefault(l.fontColor, p, e.defaultFontColor); - i.font = m.font, i.fillStyle = b; - var x = t.getIndexAngle(p), _ = a.toDegrees(x); - i.textAlign = 0 === (f = _) || 180 === f ? "center" : f < 180 ? "left" : "right", d = _, h = t._pointLabelSizes[p], c = y, 90 === d || 270 === d ? c.y -= h.h / 2 : (d > 270 || d < 90) && (c.y -= h.h), u(i, t.pointLabels[p] || "", y, m.size) - } - } - }(t) - } - } - }); - t.scaleService.registerScaleType("radialLinear", h, i) + this._isValid = isDurationValid(normalizedInput); + + // representation for dateAddRemove + this._milliseconds = +milliseconds + + seconds * 1e3 + // 1000 + minutes * 6e4 + // 1000 * 60 + hours * 1000 * 60 * 60; //using 1000 * 60 * 60 instead of 36e5 to avoid floating point rounding errors https://github.com/moment/moment/issues/2978 + // Because of dateAddRemove treats 24 hours as different from a + // day when working around DST, we need to store them separately + this._days = +days + + weeks * 7; + // It is impossible to translate months into days without knowing + // which months you are are talking about, so we have to store + // it separately. + this._months = +months + + quarters * 3 + + years * 12; + + this._data = {}; + + this._locale = getLocale(); + + this._bubble(); + } + + function isDuration(obj) { + return obj instanceof Duration; + } + + function absRound(number) { + if (number < 0) { + return Math.round(-1 * number) * -1; + } else { + return Math.round(number); + } + } + + // FORMATTING + + function offset(token, separator) { + addFormatToken(token, 0, 0, function () { + var offset = this.utcOffset(); + var sign = '+'; + if (offset < 0) { + offset = -offset; + sign = '-'; + } + return sign + zeroFill(~~(offset / 60), 2) + separator + zeroFill(~~(offset) % 60, 2); + }); + } + + offset('Z', ':'); + offset('ZZ', ''); + + // PARSING + + addRegexToken('Z', matchShortOffset); + addRegexToken('ZZ', matchShortOffset); + addParseToken(['Z', 'ZZ'], function (input, array, config) { + config._useUTC = true; + config._tzm = offsetFromString(matchShortOffset, input); + }); + + // HELPERS + + // timezone chunker + // '+10:00' > ['10', '00'] + // '-1530' > ['-15', '30'] + var chunkOffset = /([\+\-]|\d\d)/gi; + + function offsetFromString(matcher, string) { + var matches = (string || '').match(matcher); + + if (matches === null) { + return null; + } + + var chunk = matches[matches.length - 1] || []; + var parts = (chunk + '').match(chunkOffset) || ['-', 0, 0]; + var minutes = +(parts[1] * 60) + toInt(parts[2]); + + return minutes === 0 ? + 0 : + parts[0] === '+' ? minutes : -minutes; + } + + // Return a moment from input, that is local/utc/zone equivalent to model. + function cloneWithOffset(input, model) { + var res, diff; + if (model._isUTC) { + res = model.clone(); + diff = (isMoment(input) || isDate(input) ? input.valueOf() : createLocal(input).valueOf()) - res.valueOf(); + // Use low-level api, because this fn is low-level api. + res._d.setTime(res._d.valueOf() + diff); + hooks.updateOffset(res, false); + return res; + } else { + return createLocal(input).local(); + } + } + + function getDateOffset(m) { + // On Firefox.24 Date#getTimezoneOffset returns a floating point. + // https://github.com/moment/moment/pull/1871 + return -Math.round(m._d.getTimezoneOffset() / 15) * 15; + } + + // HOOKS + + // This function will be called whenever a moment is mutated. + // It is intended to keep the offset in sync with the timezone. + hooks.updateOffset = function () { + }; + + // MOMENTS + + // keepLocalTime = true means only change the timezone, without + // affecting the local hour. So 5:31:26 +0300 --[utcOffset(2, true)]--> + // 5:31:26 +0200 It is possible that 5:31:26 doesn't exist with offset + // +0200, so we adjust the time as needed, to be valid. + // + // Keeping the time actually adds/subtracts (one hour) + // from the actual represented time. That is why we call updateOffset + // a second time. In case it wants us to change the offset again + // _changeInProgress == true case, then we have to adjust, because + // there is no such time in the given timezone. + function getSetOffset(input, keepLocalTime, keepMinutes) { + var offset = this._offset || 0, + localAdjust; + if (!this.isValid()) { + return input != null ? this : NaN; + } + if (input != null) { + if (typeof input === 'string') { + input = offsetFromString(matchShortOffset, input); + if (input === null) { + return this; } - }, {25: 25, 34: 34, 45: 45}], 58: [function (t, e, i) { - "use strict"; - var n = t(6); - n = "function" == typeof n ? n : window.moment; - var a = t(25), r = t(45), o = Number.MIN_SAFE_INTEGER || -9007199254740991, - s = Number.MAX_SAFE_INTEGER || 9007199254740991, l = { - millisecond: {common: !0, size: 1, steps: [1, 2, 5, 10, 20, 50, 100, 250, 500]}, - second: {common: !0, size: 1e3, steps: [1, 2, 5, 10, 30]}, - minute: {common: !0, size: 6e4, steps: [1, 2, 5, 10, 30]}, - hour: {common: !0, size: 36e5, steps: [1, 2, 3, 6, 12]}, - day: {common: !0, size: 864e5, steps: [1, 2, 5]}, - week: {common: !1, size: 6048e5, steps: [1, 2, 3, 4]}, - month: {common: !0, size: 2628e6, steps: [1, 2, 3]}, - quarter: {common: !1, size: 7884e6, steps: [1, 2, 3, 4]}, - year: {common: !0, size: 3154e7} - }, u = Object.keys(l); - - function d(t, e) { - return t - e + } else if (Math.abs(input) < 16 && !keepMinutes) { + input = input * 60; + } + if (!this._isUTC && keepLocalTime) { + localAdjust = getDateOffset(this); + } + this._offset = input; + this._isUTC = true; + if (localAdjust != null) { + this.add(localAdjust, 'm'); + } + if (offset !== input) { + if (!keepLocalTime || this._changeInProgress) { + addSubtract(this, createDuration(input - offset, 'm'), 1, false); + } else if (!this._changeInProgress) { + this._changeInProgress = true; + hooks.updateOffset(this, true); + this._changeInProgress = null; } + } + return this; + } else { + return this._isUTC ? offset : getDateOffset(this); + } + } - function h(t) { - var e, i, n, a = {}, r = []; - for (e = 0, i = t.length; e < i; ++e) a[n = t[e]] || (a[n] = !0, r.push(n)); - return r - } + function getSetZone(input, keepLocalTime) { + if (input != null) { + if (typeof input !== 'string') { + input = -input; + } - function c(t, e, i, n) { - var a = function (t, e, i) { - for (var n, a, r, o = 0, s = t.length - 1; o >= 0 && o <= s;) { - if (a = t[(n = o + s >> 1) - 1] || null, r = t[n], !a) return {lo: null, hi: r}; - if (r[e] < i) o = n + 1; else { - if (!(a[e] > i)) return {lo: a, hi: r}; - s = n - 1 - } - } - return {lo: r, hi: null} - }(t, e, i), r = a.lo ? a.hi ? a.lo : t[t.length - 2] : t[0], - o = a.lo ? a.hi ? a.hi : t[t.length - 1] : t[1], s = o[e] - r[e], l = s ? (i - r[e]) / s : 0, - u = (o[n] - r[n]) * l; - return r[n] + u - } + this.utcOffset(input, keepLocalTime); - function f(t, e) { - var i = e.parser, a = e.parser || e.format; - return "function" == typeof i ? i(t) : "string" == typeof t && "string" == typeof a ? n(t, a) : (t instanceof n || (t = n(t)), t.isValid() ? t : "function" == typeof a ? a(t) : t) - } + return this; + } else { + return -this.utcOffset(); + } + } + + function setOffsetToUTC(keepLocalTime) { + return this.utcOffset(0, keepLocalTime); + } + + function setOffsetToLocal(keepLocalTime) { + if (this._isUTC) { + this.utcOffset(0, keepLocalTime); + this._isUTC = false; + + if (keepLocalTime) { + this.subtract(getDateOffset(this), 'm'); + } + } + return this; + } + + function setOffsetToParsedOffset() { + if (this._tzm != null) { + this.utcOffset(this._tzm, false, true); + } else if (typeof this._i === 'string') { + var tZone = offsetFromString(matchOffset, this._i); + if (tZone != null) { + this.utcOffset(tZone); + } else { + this.utcOffset(0, true); + } + } + return this; + } + + function hasAlignedHourOffset(input) { + if (!this.isValid()) { + return false; + } + input = input ? createLocal(input).utcOffset() : 0; + + return (this.utcOffset() - input) % 60 === 0; + } + + function isDaylightSavingTime() { + return ( + this.utcOffset() > this.clone().month(0).utcOffset() || + this.utcOffset() > this.clone().month(5).utcOffset() + ); + } + + function isDaylightSavingTimeShifted() { + if (!isUndefined(this._isDSTShifted)) { + return this._isDSTShifted; + } + + var c = {}; + + copyConfig(c, this); + c = prepareConfig(c); + + if (c._a) { + var other = c._isUTC ? createUTC(c._a) : createLocal(c._a); + this._isDSTShifted = this.isValid() && + compareArrays(c._a, other.toArray()) > 0; + } else { + this._isDSTShifted = false; + } + + return this._isDSTShifted; + } + + function isLocal() { + return this.isValid() ? !this._isUTC : false; + } + + function isUtcOffset() { + return this.isValid() ? this._isUTC : false; + } + + function isUtc() { + return this.isValid() ? this._isUTC && this._offset === 0 : false; + } + + // ASP.NET json date format regex + var aspNetRegex = /^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/; + + // from http://docs.closure-library.googlecode.com/git/closure_goog_date_date.js.source.html + // somewhat more in line with 4.4.3.2 2004 spec, but allows decimal anywhere + // and further modified to allow for strings containing both week and day + var isoRegex = /^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/; + + function createDuration(input, key) { + var duration = input, + // matching against regexp is expensive, do it on demand + match = null, + sign, + ret, + diffRes; + + if (isDuration(input)) { + duration = { + ms: input._milliseconds, + d: input._days, + M: input._months + }; + } else if (isNumber(input)) { + duration = {}; + if (key) { + duration[key] = input; + } else { + duration.milliseconds = input; + } + } else if (!!(match = aspNetRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : 1; + duration = { + y: 0, + d: toInt(match[DATE]) * sign, + h: toInt(match[HOUR]) * sign, + m: toInt(match[MINUTE]) * sign, + s: toInt(match[SECOND]) * sign, + ms: toInt(absRound(match[MILLISECOND] * 1000)) * sign // the millisecond decimal point is included in the match + }; + } else if (!!(match = isoRegex.exec(input))) { + sign = (match[1] === '-') ? -1 : 1; + duration = { + y: parseIso(match[2], sign), + M: parseIso(match[3], sign), + w: parseIso(match[4], sign), + d: parseIso(match[5], sign), + h: parseIso(match[6], sign), + m: parseIso(match[7], sign), + s: parseIso(match[8], sign) + }; + } else if (duration == null) {// checks for null or undefined + duration = {}; + } else if (typeof duration === 'object' && ('from' in duration || 'to' in duration)) { + diffRes = momentsDifference(createLocal(duration.from), createLocal(duration.to)); + + duration = {}; + duration.ms = diffRes.milliseconds; + duration.M = diffRes.months; + } + + ret = new Duration(duration); + + if (isDuration(input) && hasOwnProp(input, '_locale')) { + ret._locale = input._locale; + } + + return ret; + } + + createDuration.fn = Duration.prototype; + createDuration.invalid = createInvalid$1; + + function parseIso(inp, sign) { + // We'd normally use ~~inp for this, but unfortunately it also + // converts floats to ints. + // inp may be undefined, so careful calling replace on it. + var res = inp && parseFloat(inp.replace(',', '.')); + // apply sign while we're at it + return (isNaN(res) ? 0 : res) * sign; + } + + function positiveMomentsDifference(base, other) { + var res = {}; + + res.months = other.month() - base.month() + + (other.year() - base.year()) * 12; + if (base.clone().add(res.months, 'M').isAfter(other)) { + --res.months; + } + + res.milliseconds = +other - +(base.clone().add(res.months, 'M')); + + return res; + } + + function momentsDifference(base, other) { + var res; + if (!(base.isValid() && other.isValid())) { + return {milliseconds: 0, months: 0}; + } + + other = cloneWithOffset(other, base); + if (base.isBefore(other)) { + res = positiveMomentsDifference(base, other); + } else { + res = positiveMomentsDifference(other, base); + res.milliseconds = -res.milliseconds; + res.months = -res.months; + } + + return res; + } + + // TODO: remove 'name' arg after deprecation is removed + function createAdder(direction, name) { + return function (val, period) { + var dur, tmp; + //invert the arguments, but complain about it + if (period !== null && !isNaN(+period)) { + deprecateSimple(name, 'moment().' + name + '(period, number) is deprecated. Please use moment().' + name + '(number, period). ' + + 'See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.'); + tmp = val; + val = period; + period = tmp; + } + + val = typeof val === 'string' ? +val : val; + dur = createDuration(val, period); + addSubtract(this, dur, direction); + return this; + }; + } + + function addSubtract(mom, duration, isAdding, updateOffset) { + var milliseconds = duration._milliseconds, + days = absRound(duration._days), + months = absRound(duration._months); + + if (!mom.isValid()) { + // No op + return; + } + + updateOffset = updateOffset == null ? true : updateOffset; + + if (months) { + setMonth(mom, get(mom, 'Month') + months * isAdding); + } + if (days) { + set$1(mom, 'Date', get(mom, 'Date') + days * isAdding); + } + if (milliseconds) { + mom._d.setTime(mom._d.valueOf() + milliseconds * isAdding); + } + if (updateOffset) { + hooks.updateOffset(mom, days || months); + } + } + + var add = createAdder(1, 'add'); + var subtract = createAdder(-1, 'subtract'); + + function getCalendarFormat(myMoment, now) { + var diff = myMoment.diff(now, 'days', true); + return diff < -6 ? 'sameElse' : + diff < -1 ? 'lastWeek' : + diff < 0 ? 'lastDay' : + diff < 1 ? 'sameDay' : + diff < 2 ? 'nextDay' : + diff < 7 ? 'nextWeek' : 'sameElse'; + } + + function calendar$1(time, formats) { + // We want to compare the start of today, vs this. + // Getting start-of-today depends on whether we're local/utc/offset or not. + var now = time || createLocal(), + sod = cloneWithOffset(now, this).startOf('day'), + format = hooks.calendarFormat(this, sod) || 'sameElse'; + + var output = formats && (isFunction(formats[format]) ? formats[format].call(this, now) : formats[format]); + + return this.format(output || this.localeData().calendar(format, this, createLocal(now))); + } + + function clone() { + return new Moment(this); + } + + function isAfter(input, units) { + var localInput = isMoment(input) ? input : createLocal(input); + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(units) || 'millisecond'; + if (units === 'millisecond') { + return this.valueOf() > localInput.valueOf(); + } else { + return localInput.valueOf() < this.clone().startOf(units).valueOf(); + } + } + + function isBefore(input, units) { + var localInput = isMoment(input) ? input : createLocal(input); + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(units) || 'millisecond'; + if (units === 'millisecond') { + return this.valueOf() < localInput.valueOf(); + } else { + return this.clone().endOf(units).valueOf() < localInput.valueOf(); + } + } + + function isBetween(from, to, units, inclusivity) { + var localFrom = isMoment(from) ? from : createLocal(from), + localTo = isMoment(to) ? to : createLocal(to); + if (!(this.isValid() && localFrom.isValid() && localTo.isValid())) { + return false; + } + inclusivity = inclusivity || '()'; + return (inclusivity[0] === '(' ? this.isAfter(localFrom, units) : !this.isBefore(localFrom, units)) && + (inclusivity[1] === ')' ? this.isBefore(localTo, units) : !this.isAfter(localTo, units)); + } + + function isSame(input, units) { + var localInput = isMoment(input) ? input : createLocal(input), + inputMs; + if (!(this.isValid() && localInput.isValid())) { + return false; + } + units = normalizeUnits(units) || 'millisecond'; + if (units === 'millisecond') { + return this.valueOf() === localInput.valueOf(); + } else { + inputMs = localInput.valueOf(); + return this.clone().startOf(units).valueOf() <= inputMs && inputMs <= this.clone().endOf(units).valueOf(); + } + } + + function isSameOrAfter(input, units) { + return this.isSame(input, units) || this.isAfter(input, units); + } + + function isSameOrBefore(input, units) { + return this.isSame(input, units) || this.isBefore(input, units); + } + + function diff(input, units, asFloat) { + var that, + zoneDelta, + output; + + if (!this.isValid()) { + return NaN; + } + + that = cloneWithOffset(input, this); + + if (!that.isValid()) { + return NaN; + } + + zoneDelta = (that.utcOffset() - this.utcOffset()) * 6e4; + + units = normalizeUnits(units); + + switch (units) { + case 'year': + output = monthDiff(this, that) / 12; + break; + case 'month': + output = monthDiff(this, that); + break; + case 'quarter': + output = monthDiff(this, that) / 3; + break; + case 'second': + output = (this - that) / 1e3; + break; // 1000 + case 'minute': + output = (this - that) / 6e4; + break; // 1000 * 60 + case 'hour': + output = (this - that) / 36e5; + break; // 1000 * 60 * 60 + case 'day': + output = (this - that - zoneDelta) / 864e5; + break; // 1000 * 60 * 60 * 24, negate dst + case 'week': + output = (this - that - zoneDelta) / 6048e5; + break; // 1000 * 60 * 60 * 24 * 7, negate dst + default: + output = this - that; + } + + return asFloat ? output : absFloor(output); + } + + function monthDiff(a, b) { + // difference in months + var wholeMonthDiff = ((b.year() - a.year()) * 12) + (b.month() - a.month()), + // b is in (anchor - 1 month, anchor + 1 month) + anchor = a.clone().add(wholeMonthDiff, 'months'), + anchor2, adjust; + + if (b - anchor < 0) { + anchor2 = a.clone().add(wholeMonthDiff - 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor - anchor2); + } else { + anchor2 = a.clone().add(wholeMonthDiff + 1, 'months'); + // linear across the month + adjust = (b - anchor) / (anchor2 - anchor); + } + + //check for negative zero, return zero if negative zero + return -(wholeMonthDiff + adjust) || 0; + } + + hooks.defaultFormat = 'YYYY-MM-DDTHH:mm:ssZ'; + hooks.defaultFormatUtc = 'YYYY-MM-DDTHH:mm:ss[Z]'; + + function toString() { + return this.clone().locale('en').format('ddd MMM DD YYYY HH:mm:ss [GMT]ZZ'); + } + + function toISOString(keepOffset) { + if (!this.isValid()) { + return null; + } + var utc = keepOffset !== true; + var m = utc ? this.clone().utc() : this; + if (m.year() < 0 || m.year() > 9999) { + return formatMoment(m, utc ? 'YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYYYY-MM-DD[T]HH:mm:ss.SSSZ'); + } + if (isFunction(Date.prototype.toISOString)) { + // native implementation is ~50x faster, use it when we can + if (utc) { + return this.toDate().toISOString(); + } else { + return new Date(this.valueOf() + this.utcOffset() * 60 * 1000).toISOString().replace('Z', formatMoment(m, 'Z')); + } + } + return formatMoment(m, utc ? 'YYYY-MM-DD[T]HH:mm:ss.SSS[Z]' : 'YYYY-MM-DD[T]HH:mm:ss.SSSZ'); + } + + /** + * Return a human readable representation of a moment that can + * also be evaluated to get a new moment which is the same + * + * @link https://nodejs.org/dist/latest/docs/api/util.html#util_custom_inspect_function_on_objects + */ + function inspect() { + if (!this.isValid()) { + return 'moment.invalid(/* ' + this._i + ' */)'; + } + var func = 'moment'; + var zone = ''; + if (!this.isLocal()) { + func = this.utcOffset() === 0 ? 'moment.utc' : 'moment.parseZone'; + zone = 'Z'; + } + var prefix = '[' + func + '("]'; + var year = (0 <= this.year() && this.year() <= 9999) ? 'YYYY' : 'YYYYYY'; + var datetime = '-MM-DD[T]HH:mm:ss.SSS'; + var suffix = zone + '[")]'; + + return this.format(prefix + year + datetime + suffix); + } + + function format(inputString) { + if (!inputString) { + inputString = this.isUtc() ? hooks.defaultFormatUtc : hooks.defaultFormat; + } + var output = formatMoment(this, inputString); + return this.localeData().postformat(output); + } + + function from(time, withoutSuffix) { + if (this.isValid() && + ((isMoment(time) && time.isValid()) || + createLocal(time).isValid())) { + return createDuration({ + to: this, + from: time + }).locale(this.locale()).humanize(!withoutSuffix); + } else { + return this.localeData().invalidDate(); + } + } + + function fromNow(withoutSuffix) { + return this.from(createLocal(), withoutSuffix); + } + + function to(time, withoutSuffix) { + if (this.isValid() && + ((isMoment(time) && time.isValid()) || + createLocal(time).isValid())) { + return createDuration({ + from: this, + to: time + }).locale(this.locale()).humanize(!withoutSuffix); + } else { + return this.localeData().invalidDate(); + } + } + + function toNow(withoutSuffix) { + return this.to(createLocal(), withoutSuffix); + } + + // If passed a locale key, it will set the locale for this + // instance. Otherwise, it will return the locale configuration + // variables for this instance. + function locale(key) { + var newLocaleData; + + if (key === undefined) { + return this._locale._abbr; + } else { + newLocaleData = getLocale(key); + if (newLocaleData != null) { + this._locale = newLocaleData; + } + return this; + } + } + + var lang = deprecate( + 'moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.', + function (key) { + if (key === undefined) { + return this.localeData(); + } else { + return this.locale(key); + } + } + ); + + function localeData() { + return this._locale; + } + + var MS_PER_SECOND = 1000; + var MS_PER_MINUTE = 60 * MS_PER_SECOND; + var MS_PER_HOUR = 60 * MS_PER_MINUTE; + var MS_PER_400_YEARS = (365 * 400 + 97) * 24 * MS_PER_HOUR; + + // actual modulo - handles negative numbers (for dates before 1970): + function mod$1(dividend, divisor) { + return (dividend % divisor + divisor) % divisor; + } + + function localStartOfDate(y, m, d) { + // the date constructor remaps years 0-99 to 1900-1999 + if (y < 100 && y >= 0) { + // preserve leap years using a full 400 year cycle, then reset + return new Date(y + 400, m, d) - MS_PER_400_YEARS; + } else { + return new Date(y, m, d).valueOf(); + } + } + + function utcStartOfDate(y, m, d) { + // Date.UTC remaps years 0-99 to 1900-1999 + if (y < 100 && y >= 0) { + // preserve leap years using a full 400 year cycle, then reset + return Date.UTC(y + 400, m, d) - MS_PER_400_YEARS; + } else { + return Date.UTC(y, m, d); + } + } + + function startOf(units) { + var time; + units = normalizeUnits(units); + if (units === undefined || units === 'millisecond' || !this.isValid()) { + return this; + } + + var startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate; + + switch (units) { + case 'year': + time = startOfDate(this.year(), 0, 1); + break; + case 'quarter': + time = startOfDate(this.year(), this.month() - this.month() % 3, 1); + break; + case 'month': + time = startOfDate(this.year(), this.month(), 1); + break; + case 'week': + time = startOfDate(this.year(), this.month(), this.date() - this.weekday()); + break; + case 'isoWeek': + time = startOfDate(this.year(), this.month(), this.date() - (this.isoWeekday() - 1)); + break; + case 'day': + case 'date': + time = startOfDate(this.year(), this.month(), this.date()); + break; + case 'hour': + time = this._d.valueOf(); + time -= mod$1(time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE), MS_PER_HOUR); + break; + case 'minute': + time = this._d.valueOf(); + time -= mod$1(time, MS_PER_MINUTE); + break; + case 'second': + time = this._d.valueOf(); + time -= mod$1(time, MS_PER_SECOND); + break; + } + + this._d.setTime(time); + hooks.updateOffset(this, true); + return this; + } + + function endOf(units) { + var time; + units = normalizeUnits(units); + if (units === undefined || units === 'millisecond' || !this.isValid()) { + return this; + } + + var startOfDate = this._isUTC ? utcStartOfDate : localStartOfDate; + + switch (units) { + case 'year': + time = startOfDate(this.year() + 1, 0, 1) - 1; + break; + case 'quarter': + time = startOfDate(this.year(), this.month() - this.month() % 3 + 3, 1) - 1; + break; + case 'month': + time = startOfDate(this.year(), this.month() + 1, 1) - 1; + break; + case 'week': + time = startOfDate(this.year(), this.month(), this.date() - this.weekday() + 7) - 1; + break; + case 'isoWeek': + time = startOfDate(this.year(), this.month(), this.date() - (this.isoWeekday() - 1) + 7) - 1; + break; + case 'day': + case 'date': + time = startOfDate(this.year(), this.month(), this.date() + 1) - 1; + break; + case 'hour': + time = this._d.valueOf(); + time += MS_PER_HOUR - mod$1(time + (this._isUTC ? 0 : this.utcOffset() * MS_PER_MINUTE), MS_PER_HOUR) - 1; + break; + case 'minute': + time = this._d.valueOf(); + time += MS_PER_MINUTE - mod$1(time, MS_PER_MINUTE) - 1; + break; + case 'second': + time = this._d.valueOf(); + time += MS_PER_SECOND - mod$1(time, MS_PER_SECOND) - 1; + break; + } + + this._d.setTime(time); + hooks.updateOffset(this, true); + return this; + } + + function valueOf() { + return this._d.valueOf() - ((this._offset || 0) * 60000); + } + + function unix() { + return Math.floor(this.valueOf() / 1000); + } + + function toDate() { + return new Date(this.valueOf()); + } + + function toArray() { + var m = this; + return [m.year(), m.month(), m.date(), m.hour(), m.minute(), m.second(), m.millisecond()]; + } + + function toObject() { + var m = this; + return { + years: m.year(), + months: m.month(), + date: m.date(), + hours: m.hours(), + minutes: m.minutes(), + seconds: m.seconds(), + milliseconds: m.milliseconds() + }; + } + + function toJSON() { + // new Date(NaN).toJSON() === null + return this.isValid() ? this.toISOString() : null; + } + + function isValid$2() { + return isValid(this); + } + + function parsingFlags() { + return extend({}, getParsingFlags(this)); + } + + function invalidAt() { + return getParsingFlags(this).overflow; + } + + function creationData() { + return { + input: this._i, + format: this._f, + locale: this._locale, + isUTC: this._isUTC, + strict: this._strict + }; + } + + // FORMATTING + + addFormatToken(0, ['gg', 2], 0, function () { + return this.weekYear() % 100; + }); + + addFormatToken(0, ['GG', 2], 0, function () { + return this.isoWeekYear() % 100; + }); + + function addWeekYearFormatToken(token, getter) { + addFormatToken(0, [token, token.length], 0, getter); + } + + addWeekYearFormatToken('gggg', 'weekYear'); + addWeekYearFormatToken('ggggg', 'weekYear'); + addWeekYearFormatToken('GGGG', 'isoWeekYear'); + addWeekYearFormatToken('GGGGG', 'isoWeekYear'); + + // ALIASES + + addUnitAlias('weekYear', 'gg'); + addUnitAlias('isoWeekYear', 'GG'); + + // PRIORITY + + addUnitPriority('weekYear', 1); + addUnitPriority('isoWeekYear', 1); + + + // PARSING + + addRegexToken('G', matchSigned); + addRegexToken('g', matchSigned); + addRegexToken('GG', match1to2, match2); + addRegexToken('gg', match1to2, match2); + addRegexToken('GGGG', match1to4, match4); + addRegexToken('gggg', match1to4, match4); + addRegexToken('GGGGG', match1to6, match6); + addRegexToken('ggggg', match1to6, match6); + + addWeekParseToken(['gggg', 'ggggg', 'GGGG', 'GGGGG'], function (input, week, config, token) { + week[token.substr(0, 2)] = toInt(input); + }); + + addWeekParseToken(['gg', 'GG'], function (input, week, config, token) { + week[token] = hooks.parseTwoDigitYear(input); + }); + + // MOMENTS + + function getSetWeekYear(input) { + return getSetWeekYearHelper.call(this, + input, + this.week(), + this.weekday(), + this.localeData()._week.dow, + this.localeData()._week.doy); + } + + function getSetISOWeekYear(input) { + return getSetWeekYearHelper.call(this, + input, this.isoWeek(), this.isoWeekday(), 1, 4); + } + + function getISOWeeksInYear() { + return weeksInYear(this.year(), 1, 4); + } + + function getWeeksInYear() { + var weekInfo = this.localeData()._week; + return weeksInYear(this.year(), weekInfo.dow, weekInfo.doy); + } + + function getSetWeekYearHelper(input, week, weekday, dow, doy) { + var weeksTarget; + if (input == null) { + return weekOfYear(this, dow, doy).year; + } else { + weeksTarget = weeksInYear(input, dow, doy); + if (week > weeksTarget) { + week = weeksTarget; + } + return setWeekAll.call(this, input, week, weekday, dow, doy); + } + } + + function setWeekAll(weekYear, week, weekday, dow, doy) { + var dayOfYearData = dayOfYearFromWeeks(weekYear, week, weekday, dow, doy), + date = createUTCDate(dayOfYearData.year, 0, dayOfYearData.dayOfYear); + + this.year(date.getUTCFullYear()); + this.month(date.getUTCMonth()); + this.date(date.getUTCDate()); + return this; + } + + // FORMATTING + + addFormatToken('Q', 0, 'Qo', 'quarter'); + + // ALIASES + + addUnitAlias('quarter', 'Q'); + + // PRIORITY + + addUnitPriority('quarter', 7); + + // PARSING + + addRegexToken('Q', match1); + addParseToken('Q', function (input, array) { + array[MONTH] = (toInt(input) - 1) * 3; + }); + + // MOMENTS + + function getSetQuarter(input) { + return input == null ? Math.ceil((this.month() + 1) / 3) : this.month((input - 1) * 3 + this.month() % 3); + } + + // FORMATTING + + addFormatToken('D', ['DD', 2], 'Do', 'date'); + + // ALIASES + + addUnitAlias('date', 'D'); + + // PRIORITY + addUnitPriority('date', 9); + + // PARSING + + addRegexToken('D', match1to2); + addRegexToken('DD', match1to2, match2); + addRegexToken('Do', function (isStrict, locale) { + // TODO: Remove "ordinalParse" fallback in next major release. + return isStrict ? + (locale._dayOfMonthOrdinalParse || locale._ordinalParse) : + locale._dayOfMonthOrdinalParseLenient; + }); + + addParseToken(['D', 'DD'], DATE); + addParseToken('Do', function (input, array) { + array[DATE] = toInt(input.match(match1to2)[0]); + }); + + // MOMENTS + + var getSetDayOfMonth = makeGetSet('Date', true); - function g(t, e) { - if (r.isNullOrUndef(t)) return null; - var i = e.options.time, n = f(e.getRightValue(t), i); - return n.isValid() ? (i.round && n.startOf(i.round), n.valueOf()) : null + // FORMATTING + + addFormatToken('DDD', ['DDDD', 3], 'DDDo', 'dayOfYear'); + + // ALIASES + + addUnitAlias('dayOfYear', 'DDD'); + + // PRIORITY + addUnitPriority('dayOfYear', 4); + + // PARSING + + addRegexToken('DDD', match1to3); + addRegexToken('DDDD', match3); + addParseToken(['DDD', 'DDDD'], function (input, array, config) { + config._dayOfYear = toInt(input); + }); + + // HELPERS + + // MOMENTS + + function getSetDayOfYear(input) { + var dayOfYear = Math.round((this.clone().startOf('day') - this.clone().startOf('year')) / 864e5) + 1; + return input == null ? dayOfYear : this.add((input - dayOfYear), 'd'); + } + + // FORMATTING + + addFormatToken('m', ['mm', 2], 0, 'minute'); + + // ALIASES + + addUnitAlias('minute', 'm'); + + // PRIORITY + + addUnitPriority('minute', 14); + + // PARSING + + addRegexToken('m', match1to2); + addRegexToken('mm', match1to2, match2); + addParseToken(['m', 'mm'], MINUTE); + + // MOMENTS + + var getSetMinute = makeGetSet('Minutes', false); + + // FORMATTING + + addFormatToken('s', ['ss', 2], 0, 'second'); + + // ALIASES + + addUnitAlias('second', 's'); + + // PRIORITY + + addUnitPriority('second', 15); + + // PARSING + + addRegexToken('s', match1to2); + addRegexToken('ss', match1to2, match2); + addParseToken(['s', 'ss'], SECOND); + + // MOMENTS + + var getSetSecond = makeGetSet('Seconds', false); + + // FORMATTING + + addFormatToken('S', 0, 0, function () { + return ~~(this.millisecond() / 100); + }); + + addFormatToken(0, ['SS', 2], 0, function () { + return ~~(this.millisecond() / 10); + }); + + addFormatToken(0, ['SSS', 3], 0, 'millisecond'); + addFormatToken(0, ['SSSS', 4], 0, function () { + return this.millisecond() * 10; + }); + addFormatToken(0, ['SSSSS', 5], 0, function () { + return this.millisecond() * 100; + }); + addFormatToken(0, ['SSSSSS', 6], 0, function () { + return this.millisecond() * 1000; + }); + addFormatToken(0, ['SSSSSSS', 7], 0, function () { + return this.millisecond() * 10000; + }); + addFormatToken(0, ['SSSSSSSS', 8], 0, function () { + return this.millisecond() * 100000; + }); + addFormatToken(0, ['SSSSSSSSS', 9], 0, function () { + return this.millisecond() * 1000000; + }); + + + // ALIASES + + addUnitAlias('millisecond', 'ms'); + + // PRIORITY + + addUnitPriority('millisecond', 16); + + // PARSING + + addRegexToken('S', match1to3, match1); + addRegexToken('SS', match1to3, match2); + addRegexToken('SSS', match1to3, match3); + + var token; + for (token = 'SSSS'; token.length <= 9; token += 'S') { + addRegexToken(token, matchUnsigned); + } + + function parseMs(input, array) { + array[MILLISECOND] = toInt(('0.' + input) * 1000); + } + + for (token = 'S'; token.length <= 9; token += 'S') { + addParseToken(token, parseMs); + } + // MOMENTS + + var getSetMillisecond = makeGetSet('Milliseconds', false); + + // FORMATTING + + addFormatToken('z', 0, 0, 'zoneAbbr'); + addFormatToken('zz', 0, 0, 'zoneName'); + + // MOMENTS + + function getZoneAbbr() { + return this._isUTC ? 'UTC' : ''; + } + + function getZoneName() { + return this._isUTC ? 'Coordinated Universal Time' : ''; + } + + var proto = Moment.prototype; + + proto.add = add; + proto.calendar = calendar$1; + proto.clone = clone; + proto.diff = diff; + proto.endOf = endOf; + proto.format = format; + proto.from = from; + proto.fromNow = fromNow; + proto.to = to; + proto.toNow = toNow; + proto.get = stringGet; + proto.invalidAt = invalidAt; + proto.isAfter = isAfter; + proto.isBefore = isBefore; + proto.isBetween = isBetween; + proto.isSame = isSame; + proto.isSameOrAfter = isSameOrAfter; + proto.isSameOrBefore = isSameOrBefore; + proto.isValid = isValid$2; + proto.lang = lang; + proto.locale = locale; + proto.localeData = localeData; + proto.max = prototypeMax; + proto.min = prototypeMin; + proto.parsingFlags = parsingFlags; + proto.set = stringSet; + proto.startOf = startOf; + proto.subtract = subtract; + proto.toArray = toArray; + proto.toObject = toObject; + proto.toDate = toDate; + proto.toISOString = toISOString; + proto.inspect = inspect; + proto.toJSON = toJSON; + proto.toString = toString; + proto.unix = unix; + proto.valueOf = valueOf; + proto.creationData = creationData; + proto.year = getSetYear; + proto.isLeapYear = getIsLeapYear; + proto.weekYear = getSetWeekYear; + proto.isoWeekYear = getSetISOWeekYear; + proto.quarter = proto.quarters = getSetQuarter; + proto.month = getSetMonth; + proto.daysInMonth = getDaysInMonth; + proto.week = proto.weeks = getSetWeek; + proto.isoWeek = proto.isoWeeks = getSetISOWeek; + proto.weeksInYear = getWeeksInYear; + proto.isoWeeksInYear = getISOWeeksInYear; + proto.date = getSetDayOfMonth; + proto.day = proto.days = getSetDayOfWeek; + proto.weekday = getSetLocaleDayOfWeek; + proto.isoWeekday = getSetISODayOfWeek; + proto.dayOfYear = getSetDayOfYear; + proto.hour = proto.hours = getSetHour; + proto.minute = proto.minutes = getSetMinute; + proto.second = proto.seconds = getSetSecond; + proto.millisecond = proto.milliseconds = getSetMillisecond; + proto.utcOffset = getSetOffset; + proto.utc = setOffsetToUTC; + proto.local = setOffsetToLocal; + proto.parseZone = setOffsetToParsedOffset; + proto.hasAlignedHourOffset = hasAlignedHourOffset; + proto.isDST = isDaylightSavingTime; + proto.isLocal = isLocal; + proto.isUtcOffset = isUtcOffset; + proto.isUtc = isUtc; + proto.isUTC = isUtc; + proto.zoneAbbr = getZoneAbbr; + proto.zoneName = getZoneName; + proto.dates = deprecate('dates accessor is deprecated. Use date instead.', getSetDayOfMonth); + proto.months = deprecate('months accessor is deprecated. Use month instead', getSetMonth); + proto.years = deprecate('years accessor is deprecated. Use year instead', getSetYear); + proto.zone = deprecate('moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/', getSetZone); + proto.isDSTShifted = deprecate('isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information', isDaylightSavingTimeShifted); + + function createUnix(input) { + return createLocal(input * 1000); + } + + function createInZone() { + return createLocal.apply(null, arguments).parseZone(); + } + + function preParsePostFormat(string) { + return string; + } + + var proto$1 = Locale.prototype; + + proto$1.calendar = calendar; + proto$1.longDateFormat = longDateFormat; + proto$1.invalidDate = invalidDate; + proto$1.ordinal = ordinal; + proto$1.preparse = preParsePostFormat; + proto$1.postformat = preParsePostFormat; + proto$1.relativeTime = relativeTime; + proto$1.pastFuture = pastFuture; + proto$1.set = set; + + proto$1.months = localeMonths; + proto$1.monthsShort = localeMonthsShort; + proto$1.monthsParse = localeMonthsParse; + proto$1.monthsRegex = monthsRegex; + proto$1.monthsShortRegex = monthsShortRegex; + proto$1.week = localeWeek; + proto$1.firstDayOfYear = localeFirstDayOfYear; + proto$1.firstDayOfWeek = localeFirstDayOfWeek; + + proto$1.weekdays = localeWeekdays; + proto$1.weekdaysMin = localeWeekdaysMin; + proto$1.weekdaysShort = localeWeekdaysShort; + proto$1.weekdaysParse = localeWeekdaysParse; + + proto$1.weekdaysRegex = weekdaysRegex; + proto$1.weekdaysShortRegex = weekdaysShortRegex; + proto$1.weekdaysMinRegex = weekdaysMinRegex; + + proto$1.isPM = localeIsPM; + proto$1.meridiem = localeMeridiem; + + function get$1(format, index, field, setter) { + var locale = getLocale(); + var utc = createUTC().set(setter, index); + return locale[field](utc, format); + } + + function listMonthsImpl(format, index, field) { + if (isNumber(format)) { + index = format; + format = undefined; + } + + format = format || ''; + + if (index != null) { + return get$1(format, index, field, 'month'); + } + + var i; + var out = []; + for (i = 0; i < 12; i++) { + out[i] = get$1(format, i, field, 'month'); + } + return out; + } + + // () + // (5) + // (fmt, 5) + // (fmt) + // (true) + // (true, 5) + // (true, fmt, 5) + // (true, fmt) + function listWeekdaysImpl(localeSorted, format, index, field) { + if (typeof localeSorted === 'boolean') { + if (isNumber(format)) { + index = format; + format = undefined; + } + + format = format || ''; + } else { + format = localeSorted; + index = format; + localeSorted = false; + + if (isNumber(format)) { + index = format; + format = undefined; + } + + format = format || ''; + } + + var locale = getLocale(), + shift = localeSorted ? locale._week.dow : 0; + + if (index != null) { + return get$1(format, (index + shift) % 7, field, 'day'); + } + + var i; + var out = []; + for (i = 0; i < 7; i++) { + out[i] = get$1(format, (i + shift) % 7, field, 'day'); + } + return out; + } + + function listMonths(format, index) { + return listMonthsImpl(format, index, 'months'); + } + + function listMonthsShort(format, index) { + return listMonthsImpl(format, index, 'monthsShort'); + } + + function listWeekdays(localeSorted, format, index) { + return listWeekdaysImpl(localeSorted, format, index, 'weekdays'); + } + + function listWeekdaysShort(localeSorted, format, index) { + return listWeekdaysImpl(localeSorted, format, index, 'weekdaysShort'); + } + + function listWeekdaysMin(localeSorted, format, index) { + return listWeekdaysImpl(localeSorted, format, index, 'weekdaysMin'); + } + + getSetGlobalLocale('en', { + dayOfMonthOrdinalParse: /\d{1,2}(th|st|nd|rd)/, + ordinal: function (number) { + var b = number % 10, + output = (toInt(number % 100 / 10) === 1) ? 'th' : + (b === 1) ? 'st' : + (b === 2) ? 'nd' : + (b === 3) ? 'rd' : 'th'; + return number + output; + } + }); + + // Side effect imports + + hooks.lang = deprecate('moment.lang is deprecated. Use moment.locale instead.', getSetGlobalLocale); + hooks.langData = deprecate('moment.langData is deprecated. Use moment.localeData instead.', getLocale); + + var mathAbs = Math.abs; + + function abs() { + var data = this._data; + + this._milliseconds = mathAbs(this._milliseconds); + this._days = mathAbs(this._days); + this._months = mathAbs(this._months); + + data.milliseconds = mathAbs(data.milliseconds); + data.seconds = mathAbs(data.seconds); + data.minutes = mathAbs(data.minutes); + data.hours = mathAbs(data.hours); + data.months = mathAbs(data.months); + data.years = mathAbs(data.years); + + return this; + } + + function addSubtract$1(duration, input, value, direction) { + var other = createDuration(input, value); + + duration._milliseconds += direction * other._milliseconds; + duration._days += direction * other._days; + duration._months += direction * other._months; + + return duration._bubble(); + } + + // supports only 2.0-style add(1, 's') or add(duration) + function add$1(input, value) { + return addSubtract$1(this, input, value, 1); + } + + // supports only 2.0-style subtract(1, 's') or subtract(duration) + function subtract$1(input, value) { + return addSubtract$1(this, input, value, -1); + } + + function absCeil(number) { + if (number < 0) { + return Math.floor(number); + } else { + return Math.ceil(number); + } + } + + function bubble() { + var milliseconds = this._milliseconds; + var days = this._days; + var months = this._months; + var data = this._data; + var seconds, minutes, hours, years, monthsFromDays; + + // if we have a mix of positive and negative values, bubble down first + // check: https://github.com/moment/moment/issues/2166 + if (!((milliseconds >= 0 && days >= 0 && months >= 0) || + (milliseconds <= 0 && days <= 0 && months <= 0))) { + milliseconds += absCeil(monthsToDays(months) + days) * 864e5; + days = 0; + months = 0; + } + + // The following code bubbles up values, see the tests for + // examples of what that means. + data.milliseconds = milliseconds % 1000; + + seconds = absFloor(milliseconds / 1000); + data.seconds = seconds % 60; + + minutes = absFloor(seconds / 60); + data.minutes = minutes % 60; + + hours = absFloor(minutes / 60); + data.hours = hours % 24; + + days += absFloor(hours / 24); + + // convert days to months + monthsFromDays = absFloor(daysToMonths(days)); + months += monthsFromDays; + days -= absCeil(monthsToDays(monthsFromDays)); + + // 12 months -> 1 year + years = absFloor(months / 12); + months %= 12; + + data.days = days; + data.months = months; + data.years = years; + + return this; + } + + function daysToMonths(days) { + // 400 years have 146097 days (taking into account leap year rules) + // 400 years have 12 months === 4800 + return days * 4800 / 146097; + } + + function monthsToDays(months) { + // the reverse of daysToMonths + return months * 146097 / 4800; + } + + function as(units) { + if (!this.isValid()) { + return NaN; + } + var days; + var months; + var milliseconds = this._milliseconds; + + units = normalizeUnits(units); + + if (units === 'month' || units === 'quarter' || units === 'year') { + days = this._days + milliseconds / 864e5; + months = this._months + daysToMonths(days); + switch (units) { + case 'month': + return months; + case 'quarter': + return months / 3; + case 'year': + return months / 12; + } + } else { + // handle milliseconds separately because of floating point math errors (issue #1867) + days = this._days + Math.round(monthsToDays(this._months)); + switch (units) { + case 'week' : + return days / 7 + milliseconds / 6048e5; + case 'day' : + return days + milliseconds / 864e5; + case 'hour' : + return days * 24 + milliseconds / 36e5; + case 'minute' : + return days * 1440 + milliseconds / 6e4; + case 'second' : + return days * 86400 + milliseconds / 1000; + // Math.floor prevents floating point math errors here + case 'millisecond': + return Math.floor(days * 864e5) + milliseconds; + default: + throw new Error('Unknown unit ' + units); + } + } + } + + // TODO: Use this.as('ms')? + function valueOf$1() { + if (!this.isValid()) { + return NaN; + } + return ( + this._milliseconds + + this._days * 864e5 + + (this._months % 12) * 2592e6 + + toInt(this._months / 12) * 31536e6 + ); + } + + function makeAs(alias) { + return function () { + return this.as(alias); + }; + } + + var asMilliseconds = makeAs('ms'); + var asSeconds = makeAs('s'); + var asMinutes = makeAs('m'); + var asHours = makeAs('h'); + var asDays = makeAs('d'); + var asWeeks = makeAs('w'); + var asMonths = makeAs('M'); + var asQuarters = makeAs('Q'); + var asYears = makeAs('y'); + + function clone$1() { + return createDuration(this); + } + + function get$2(units) { + units = normalizeUnits(units); + return this.isValid() ? this[units + 's']() : NaN; + } + + function makeGetter(name) { + return function () { + return this.isValid() ? this._data[name] : NaN; + }; + } + + var milliseconds = makeGetter('milliseconds'); + var seconds = makeGetter('seconds'); + var minutes = makeGetter('minutes'); + var hours = makeGetter('hours'); + var days = makeGetter('days'); + var months = makeGetter('months'); + var years = makeGetter('years'); + + function weeks() { + return absFloor(this.days() / 7); + } + + var round = Math.round; + var thresholds = { + ss: 44, // a few seconds to seconds + s: 45, // seconds to minute + m: 45, // minutes to hour + h: 22, // hours to day + d: 26, // days to month + M: 11 // months to year + }; + + // helper function for moment.fn.from, moment.fn.fromNow, and moment.duration.fn.humanize + function substituteTimeAgo(string, number, withoutSuffix, isFuture, locale) { + return locale.relativeTime(number || 1, !!withoutSuffix, string, isFuture); + } + + function relativeTime$1(posNegDuration, withoutSuffix, locale) { + var duration = createDuration(posNegDuration).abs(); + var seconds = round(duration.as('s')); + var minutes = round(duration.as('m')); + var hours = round(duration.as('h')); + var days = round(duration.as('d')); + var months = round(duration.as('M')); + var years = round(duration.as('y')); + + var a = seconds <= thresholds.ss && ['s', seconds] || + seconds < thresholds.s && ['ss', seconds] || + minutes <= 1 && ['m'] || + minutes < thresholds.m && ['mm', minutes] || + hours <= 1 && ['h'] || + hours < thresholds.h && ['hh', hours] || + days <= 1 && ['d'] || + days < thresholds.d && ['dd', days] || + months <= 1 && ['M'] || + months < thresholds.M && ['MM', months] || + years <= 1 && ['y'] || ['yy', years]; + + a[2] = withoutSuffix; + a[3] = +posNegDuration > 0; + a[4] = locale; + return substituteTimeAgo.apply(null, a); + } + + // This function allows you to set the rounding function for relative time strings + function getSetRelativeTimeRounding(roundingFunction) { + if (roundingFunction === undefined) { + return round; + } + if (typeof (roundingFunction) === 'function') { + round = roundingFunction; + return true; + } + return false; + } + + // This function allows you to set a threshold for relative time strings + function getSetRelativeTimeThreshold(threshold, limit) { + if (thresholds[threshold] === undefined) { + return false; + } + if (limit === undefined) { + return thresholds[threshold]; + } + thresholds[threshold] = limit; + if (threshold === 's') { + thresholds.ss = limit - 1; + } + return true; + } + + function humanize(withSuffix) { + if (!this.isValid()) { + return this.localeData().invalidDate(); + } + + var locale = this.localeData(); + var output = relativeTime$1(this, !withSuffix, locale); + + if (withSuffix) { + output = locale.pastFuture(+this, output); + } + + return locale.postformat(output); + } + + var abs$1 = Math.abs; + + function sign(x) { + return ((x > 0) - (x < 0)) || +x; + } + + function toISOString$1() { + // for ISO strings we do not use the normal bubbling rules: + // * milliseconds bubble up until they become hours + // * days do not bubble at all + // * months bubble up until they become years + // This is because there is no context-free conversion between hours and days + // (think of clock changes) + // and also not between days and months (28-31 days per month) + if (!this.isValid()) { + return this.localeData().invalidDate(); + } + + var seconds = abs$1(this._milliseconds) / 1000; + var days = abs$1(this._days); + var months = abs$1(this._months); + var minutes, hours, years; + + // 3600 seconds -> 60 minutes -> 1 hour + minutes = absFloor(seconds / 60); + hours = absFloor(minutes / 60); + seconds %= 60; + minutes %= 60; + + // 12 months -> 1 year + years = absFloor(months / 12); + months %= 12; + + + // inspired by https://github.com/dordille/moment-isoduration/blob/master/moment.isoduration.js + var Y = years; + var M = months; + var D = days; + var h = hours; + var m = minutes; + var s = seconds ? seconds.toFixed(3).replace(/\.?0+$/, '') : ''; + var total = this.asSeconds(); + + if (!total) { + // this is the same as C#'s (Noda) and python (isodate)... + // but not other JS (goog.date) + return 'P0D'; + } + + var totalSign = total < 0 ? '-' : ''; + var ymSign = sign(this._months) !== sign(total) ? '-' : ''; + var daysSign = sign(this._days) !== sign(total) ? '-' : ''; + var hmsSign = sign(this._milliseconds) !== sign(total) ? '-' : ''; + + return totalSign + 'P' + + (Y ? ymSign + Y + 'Y' : '') + + (M ? ymSign + M + 'M' : '') + + (D ? daysSign + D + 'D' : '') + + ((h || m || s) ? 'T' : '') + + (h ? hmsSign + h + 'H' : '') + + (m ? hmsSign + m + 'M' : '') + + (s ? hmsSign + s + 'S' : ''); + } + + var proto$2 = Duration.prototype; + + proto$2.isValid = isValid$1; + proto$2.abs = abs; + proto$2.add = add$1; + proto$2.subtract = subtract$1; + proto$2.as = as; + proto$2.asMilliseconds = asMilliseconds; + proto$2.asSeconds = asSeconds; + proto$2.asMinutes = asMinutes; + proto$2.asHours = asHours; + proto$2.asDays = asDays; + proto$2.asWeeks = asWeeks; + proto$2.asMonths = asMonths; + proto$2.asQuarters = asQuarters; + proto$2.asYears = asYears; + proto$2.valueOf = valueOf$1; + proto$2._bubble = bubble; + proto$2.clone = clone$1; + proto$2.get = get$2; + proto$2.milliseconds = milliseconds; + proto$2.seconds = seconds; + proto$2.minutes = minutes; + proto$2.hours = hours; + proto$2.days = days; + proto$2.weeks = weeks; + proto$2.months = months; + proto$2.years = years; + proto$2.humanize = humanize; + proto$2.toISOString = toISOString$1; + proto$2.toString = toISOString$1; + proto$2.toJSON = toISOString$1; + proto$2.locale = locale; + proto$2.localeData = localeData; + + proto$2.toIsoString = deprecate('toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)', toISOString$1); + proto$2.lang = lang; + + // Side effect imports + + // FORMATTING + + addFormatToken('X', 0, 0, 'unix'); + addFormatToken('x', 0, 0, 'valueOf'); + + // PARSING + + addRegexToken('x', matchSigned); + addRegexToken('X', matchTimestamp); + addParseToken('X', function (input, array, config) { + config._d = new Date(parseFloat(input, 10) * 1000); + }); + addParseToken('x', function (input, array, config) { + config._d = new Date(toInt(input)); + }); + + // Side effect imports + + + hooks.version = '2.24.0'; + + setHookCallback(createLocal); + + hooks.fn = proto; + hooks.min = min; + hooks.max = max; + hooks.now = now; + hooks.utc = createUTC; + hooks.unix = createUnix; + hooks.months = listMonths; + hooks.isDate = isDate; + hooks.locale = getSetGlobalLocale; + hooks.invalid = createInvalid; + hooks.duration = createDuration; + hooks.isMoment = isMoment; + hooks.weekdays = listWeekdays; + hooks.parseZone = createInZone; + hooks.localeData = getLocale; + hooks.isDuration = isDuration; + hooks.monthsShort = listMonthsShort; + hooks.weekdaysMin = listWeekdaysMin; + hooks.defineLocale = defineLocale; + hooks.updateLocale = updateLocale; + hooks.locales = listLocales; + hooks.weekdaysShort = listWeekdaysShort; + hooks.normalizeUnits = normalizeUnits; + hooks.relativeTimeRounding = getSetRelativeTimeRounding; + hooks.relativeTimeThreshold = getSetRelativeTimeThreshold; + hooks.calendarFormat = getCalendarFormat; + hooks.prototype = proto; + + // currently HTML5 input type only supports 24-hour formats + hooks.HTML5_FMT = { + DATETIME_LOCAL: 'YYYY-MM-DDTHH:mm', // <input type="datetime-local" /> + DATETIME_LOCAL_SECONDS: 'YYYY-MM-DDTHH:mm:ss', // <input type="datetime-local" step="1" /> + DATETIME_LOCAL_MS: 'YYYY-MM-DDTHH:mm:ss.SSS', // <input type="datetime-local" step="0.001" /> + DATE: 'YYYY-MM-DD', // <input type="date" /> + TIME: 'HH:mm', // <input type="time" /> + TIME_SECONDS: 'HH:mm:ss', // <input type="time" step="1" /> + TIME_MS: 'HH:mm:ss.SSS', // <input type="time" step="0.001" /> + WEEK: 'GGGG-[W]WW', // <input type="week" /> + MONTH: 'YYYY-MM' // <input type="month" /> + }; + + return hooks; + + }))); + }); + + var FORMATS = { + datetime: 'MMM D, YYYY, h:mm:ss a', + millisecond: 'h:mm:ss.SSS a', + second: 'h:mm:ss a', + minute: 'h:mm a', + hour: 'hA', + day: 'MMM D', + week: 'll', + month: 'MMM YYYY', + quarter: '[Q]Q - YYYY', + year: 'YYYY' + }; + + core_adapters._date.override(typeof moment === 'function' ? { + _id: 'moment', // DEBUG ONLY + + formats: function () { + return FORMATS; + }, + + parse: function (value, format) { + if (typeof value === 'string' && typeof format === 'string') { + value = moment(value, format); + } else if (!(value instanceof moment)) { + value = moment(value); + } + return value.isValid() ? value.valueOf() : null; + }, + + format: function (time, format) { + return moment(time).format(format); + }, + + add: function (time, amount, unit) { + return moment(time).add(amount, unit).valueOf(); + }, + + diff: function (max, min, unit) { + return moment.duration(moment(max).diff(moment(min))).as(unit); + }, + + startOf: function (time, unit, weekday) { + time = moment(time); + if (unit === 'isoWeek') { + return time.isoWeekday(weekday).valueOf(); + } + return time.startOf(unit).valueOf(); + }, + + endOf: function (time, unit) { + return moment(time).endOf(unit).valueOf(); + }, + + // DEPRECATIONS + + /** + * Provided for backward compatibility with scale.getValueForPixel(). + * @deprecated since version 2.8.0 + * @todo remove at version 3 + * @private + */ + _create: function (time) { + return moment(time); + }, + } : {}); + + core_defaults._set('global', { + plugins: { + filler: { + propagate: true + } + } + }); + + var mappers = { + dataset: function (source) { + var index = source.fill; + var chart = source.chart; + var meta = chart.getDatasetMeta(index); + var visible = meta && chart.isDatasetVisible(index); + var points = (visible && meta.dataset._children) || []; + var length = points.length || 0; + + return !length ? null : function (point, i) { + return (i < length && points[i]._view) || null; + }; + }, + + boundary: function (source) { + var boundary = source.boundary; + var x = boundary ? boundary.x : null; + var y = boundary ? boundary.y : null; + + return function (point) { + return { + x: x === null ? point.x : x, + y: y === null ? point.y : y, + }; + }; + } + }; + +// @todo if (fill[0] === '#') + function decodeFill(el, index, count) { + var model = el._model || {}; + var fill = model.fill; + var target; + + if (fill === undefined) { + fill = !!model.backgroundColor; + } + + if (fill === false || fill === null) { + return false; + } + + if (fill === true) { + return 'origin'; + } + + target = parseFloat(fill, 10); + if (isFinite(target) && Math.floor(target) === target) { + if (fill[0] === '-' || fill[0] === '+') { + target = index + target; + } + + if (target === index || target < 0 || target >= count) { + return false; + } + + return target; + } + + switch (fill) { + // compatibility + case 'bottom': + return 'start'; + case 'top': + return 'end'; + case 'zero': + return 'origin'; + // supported boundaries + case 'origin': + case 'start': + case 'end': + return fill; + // invalid fill values + default: + return false; + } + } + + function computeBoundary(source) { + var model = source.el._model || {}; + var scale = source.el._scale || {}; + var fill = source.fill; + var target = null; + var horizontal; + + if (isFinite(fill)) { + return null; + } + + // Backward compatibility: until v3, we still need to support boundary values set on + // the model (scaleTop, scaleBottom and scaleZero) because some external plugins and + // controllers might still use it (e.g. the Smith chart). + + if (fill === 'start') { + target = model.scaleBottom === undefined ? scale.bottom : model.scaleBottom; + } else if (fill === 'end') { + target = model.scaleTop === undefined ? scale.top : model.scaleTop; + } else if (model.scaleZero !== undefined) { + target = model.scaleZero; + } else if (scale.getBasePosition) { + target = scale.getBasePosition(); + } else if (scale.getBasePixel) { + target = scale.getBasePixel(); + } + + if (target !== undefined && target !== null) { + if (target.x !== undefined && target.y !== undefined) { + return target; + } + + if (helpers$1.isFinite(target)) { + horizontal = scale.isHorizontal(); + return { + x: horizontal ? target : null, + y: horizontal ? null : target + }; + } + } + + return null; + } + + function resolveTarget(sources, index, propagate) { + var source = sources[index]; + var fill = source.fill; + var visited = [index]; + var target; + + if (!propagate) { + return fill; + } + + while (fill !== false && visited.indexOf(fill) === -1) { + if (!isFinite(fill)) { + return fill; + } + + target = sources[fill]; + if (!target) { + return false; + } + + if (target.visible) { + return fill; + } + + visited.push(fill); + fill = target.fill; + } + + return false; + } + + function createMapper(source) { + var fill = source.fill; + var type = 'dataset'; + + if (fill === false) { + return null; + } + + if (!isFinite(fill)) { + type = 'boundary'; + } + + return mappers[type](source); + } + + function isDrawable(point) { + return point && !point.skip; + } + + function drawArea(ctx, curve0, curve1, len0, len1) { + var i; + + if (!len0 || !len1) { + return; + } + + // building first area curve (normal) + ctx.moveTo(curve0[0].x, curve0[0].y); + for (i = 1; i < len0; ++i) { + helpers$1.canvas.lineTo(ctx, curve0[i - 1], curve0[i]); + } + + // joining the two area curves + ctx.lineTo(curve1[len1 - 1].x, curve1[len1 - 1].y); + + // building opposite area curve (reverse) + for (i = len1 - 1; i > 0; --i) { + helpers$1.canvas.lineTo(ctx, curve1[i], curve1[i - 1], true); + } + } + + function doFill(ctx, points, mapper, view, color, loop) { + var count = points.length; + var span = view.spanGaps; + var curve0 = []; + var curve1 = []; + var len0 = 0; + var len1 = 0; + var i, ilen, index, p0, p1, d0, d1; + + ctx.beginPath(); + + for (i = 0, ilen = (count + !!loop); i < ilen; ++i) { + index = i % count; + p0 = points[index]._view; + p1 = mapper(p0, index, view); + d0 = isDrawable(p0); + d1 = isDrawable(p1); + + if (d0 && d1) { + len0 = curve0.push(p0); + len1 = curve1.push(p1); + } else if (len0 && len1) { + if (!span) { + drawArea(ctx, curve0, curve1, len0, len1); + len0 = len1 = 0; + curve0 = []; + curve1 = []; + } else { + if (d0) { + curve0.push(p0); + } + if (d1) { + curve1.push(p1); + } + } + } + } + + drawArea(ctx, curve0, curve1, len0, len1); + + ctx.closePath(); + ctx.fillStyle = color; + ctx.fill(); + } + + var plugin_filler = { + id: 'filler', + + afterDatasetsUpdate: function (chart, options) { + var count = (chart.data.datasets || []).length; + var propagate = options.propagate; + var sources = []; + var meta, i, el, source; + + for (i = 0; i < count; ++i) { + meta = chart.getDatasetMeta(i); + el = meta.dataset; + source = null; + + if (el && el._model && el instanceof elements.Line) { + source = { + visible: chart.isDatasetVisible(i), + fill: decodeFill(el, i, count), + chart: chart, + el: el + }; + } + + meta.$filler = source; + sources.push(source); + } + + for (i = 0; i < count; ++i) { + source = sources[i]; + if (!source) { + continue; + } + + source.fill = resolveTarget(sources, i, propagate); + source.boundary = computeBoundary(source); + source.mapper = createMapper(source); + } + }, + + beforeDatasetDraw: function (chart, args) { + var meta = args.meta.$filler; + if (!meta) { + return; + } + + var ctx = chart.ctx; + var el = meta.el; + var view = el._view; + var points = el._children || []; + var mapper = meta.mapper; + var color = view.backgroundColor || core_defaults.global.defaultColor; + + if (mapper && color && points.length) { + helpers$1.canvas.clipArea(ctx, chart.chartArea); + doFill(ctx, points, mapper, view, color, el._loop); + helpers$1.canvas.unclipArea(ctx); + } + } + }; + + var noop$1 = helpers$1.noop; + var valueOrDefault$d = helpers$1.valueOrDefault; + + core_defaults._set('global', { + legend: { + display: true, + position: 'top', + fullWidth: true, + reverse: false, + weight: 1000, + + // a callback that will handle + onClick: function (e, legendItem) { + var index = legendItem.datasetIndex; + var ci = this.chart; + var meta = ci.getDatasetMeta(index); + + // See controller.isDatasetVisible comment + meta.hidden = meta.hidden === null ? !ci.data.datasets[index].hidden : null; + + // We hid a dataset ... rerender the chart + ci.update(); + }, + + onHover: null, + onLeave: null, + + labels: { + boxWidth: 40, + padding: 10, + // Generates labels shown in the legend + // Valid properties to return: + // text : text to display + // fillStyle : fill of coloured box + // strokeStyle: stroke of coloured box + // hidden : if this legend item refers to a hidden item + // lineCap : cap style for line + // lineDash + // lineDashOffset : + // lineJoin : + // lineWidth : + generateLabels: function (chart) { + var data = chart.data; + return helpers$1.isArray(data.datasets) ? data.datasets.map(function (dataset, i) { + return { + text: dataset.label, + fillStyle: (!helpers$1.isArray(dataset.backgroundColor) ? dataset.backgroundColor : dataset.backgroundColor[0]), + hidden: !chart.isDatasetVisible(i), + lineCap: dataset.borderCapStyle, + lineDash: dataset.borderDash, + lineDashOffset: dataset.borderDashOffset, + lineJoin: dataset.borderJoinStyle, + lineWidth: dataset.borderWidth, + strokeStyle: dataset.borderColor, + pointStyle: dataset.pointStyle, + + // Below is extra data used for toggling the datasets + datasetIndex: i + }; + }, this) : []; + } + } + }, + + legendCallback: function (chart) { + var text = []; + text.push('<ul class="' + chart.id + '-legend">'); + for (var i = 0; i < chart.data.datasets.length; i++) { + text.push('<li><span style="background-color:' + chart.data.datasets[i].backgroundColor + '"></span>'); + if (chart.data.datasets[i].label) { + text.push(chart.data.datasets[i].label); + } + text.push('</li>'); + } + text.push('</ul>'); + return text.join(''); + } + }); + + /** + * Helper function to get the box width based on the usePointStyle option + * @param {object} labelopts - the label options on the legend + * @param {number} fontSize - the label font size + * @return {number} width of the color box area + */ + function getBoxWidth(labelOpts, fontSize) { + return labelOpts.usePointStyle && labelOpts.boxWidth > fontSize ? + fontSize : + labelOpts.boxWidth; + } + + /** + * IMPORTANT: this class is exposed publicly as Chart.Legend, backward compatibility required! + */ + var Legend = core_element.extend({ + + initialize: function (config) { + helpers$1.extend(this, config); + + // Contains hit boxes for each dataset (in dataset order) + this.legendHitBoxes = []; + + /** + * @private + */ + this._hoveredItem = null; + + // Are we in doughnut mode which has a different data type + this.doughnutMode = false; + }, + + // These methods are ordered by lifecycle. Utilities then follow. + // Any function defined here is inherited by all legend types. + // Any function can be extended by the legend type + + beforeUpdate: noop$1, + update: function (maxWidth, maxHeight, margins) { + var me = this; + + // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) + me.beforeUpdate(); + + // Absorb the master measurements + me.maxWidth = maxWidth; + me.maxHeight = maxHeight; + me.margins = margins; + + // Dimensions + me.beforeSetDimensions(); + me.setDimensions(); + me.afterSetDimensions(); + // Labels + me.beforeBuildLabels(); + me.buildLabels(); + me.afterBuildLabels(); + + // Fit + me.beforeFit(); + me.fit(); + me.afterFit(); + // + me.afterUpdate(); + + return me.minSize; + }, + afterUpdate: noop$1, + + // + + beforeSetDimensions: noop$1, + setDimensions: function () { + var me = this; + // Set the unconstrained dimension before label rotation + if (me.isHorizontal()) { + // Reset position before calculating rotation + me.width = me.maxWidth; + me.left = 0; + me.right = me.width; + } else { + me.height = me.maxHeight; + + // Reset position before calculating rotation + me.top = 0; + me.bottom = me.height; + } + + // Reset padding + me.paddingLeft = 0; + me.paddingTop = 0; + me.paddingRight = 0; + me.paddingBottom = 0; + + // Reset minSize + me.minSize = { + width: 0, + height: 0 + }; + }, + afterSetDimensions: noop$1, + + // + + beforeBuildLabels: noop$1, + buildLabels: function () { + var me = this; + var labelOpts = me.options.labels || {}; + var legendItems = helpers$1.callback(labelOpts.generateLabels, [me.chart], me) || []; + + if (labelOpts.filter) { + legendItems = legendItems.filter(function (item) { + return labelOpts.filter(item, me.chart.data); + }); + } + + if (me.options.reverse) { + legendItems.reverse(); + } + + me.legendItems = legendItems; + }, + afterBuildLabels: noop$1, + + // + + beforeFit: noop$1, + fit: function () { + var me = this; + var opts = me.options; + var labelOpts = opts.labels; + var display = opts.display; + + var ctx = me.ctx; + + var labelFont = helpers$1.options._parseFont(labelOpts); + var fontSize = labelFont.size; + + // Reset hit boxes + var hitboxes = me.legendHitBoxes = []; + + var minSize = me.minSize; + var isHorizontal = me.isHorizontal(); + + if (isHorizontal) { + minSize.width = me.maxWidth; // fill all the width + minSize.height = display ? 10 : 0; + } else { + minSize.width = display ? 10 : 0; + minSize.height = me.maxHeight; // fill all the height + } + + // Increase sizes here + if (display) { + ctx.font = labelFont.string; + + if (isHorizontal) { + // Labels + + // Width of each line of legend boxes. Labels wrap onto multiple lines when there are too many to fit on one + var lineWidths = me.lineWidths = [0]; + var totalHeight = 0; + + ctx.textAlign = 'left'; + ctx.textBaseline = 'top'; + + helpers$1.each(me.legendItems, function (legendItem, i) { + var boxWidth = getBoxWidth(labelOpts, fontSize); + var width = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width; + + if (i === 0 || lineWidths[lineWidths.length - 1] + width + labelOpts.padding > minSize.width) { + totalHeight += fontSize + labelOpts.padding; + lineWidths[lineWidths.length - (i > 0 ? 0 : 1)] = labelOpts.padding; } - function m(t) { - for (var e = u.indexOf(t) + 1, i = u.length; e < i; ++e) if (l[u[e]].common) return u[e] + // Store the hitbox width and height here. Final position will be updated in `draw` + hitboxes[i] = { + left: 0, + top: 0, + width: width, + height: fontSize + }; + + lineWidths[lineWidths.length - 1] += width + labelOpts.padding; + }); + + minSize.height += totalHeight; + + } else { + var vPadding = labelOpts.padding; + var columnWidths = me.columnWidths = []; + var totalWidth = labelOpts.padding; + var currentColWidth = 0; + var currentColHeight = 0; + var itemHeight = fontSize + vPadding; + + helpers$1.each(me.legendItems, function (legendItem, i) { + var boxWidth = getBoxWidth(labelOpts, fontSize); + var itemWidth = boxWidth + (fontSize / 2) + ctx.measureText(legendItem.text).width; + + // If too tall, go to new column + if (i > 0 && currentColHeight + itemHeight > minSize.height - vPadding) { + totalWidth += currentColWidth + labelOpts.padding; + columnWidths.push(currentColWidth); // previous column width + + currentColWidth = 0; + currentColHeight = 0; } - function p(t, e, i, a) { - var o, d = a.time, h = d.unit || function (t, e, i, n) { - var a, r, o, d = u.length; - for (a = u.indexOf(t); a < d - 1; ++a) if (o = (r = l[u[a]]).steps ? r.steps[r.steps.length - 1] : s, r.common && Math.ceil((i - e) / (o * r.size)) <= n) return u[a]; - return u[d - 1] - }(d.minUnit, t, e, i), c = m(h), f = r.valueOrDefault(d.stepSize, d.unitStepSize), - g = "week" === h && d.isoWeekday, p = a.ticks.major.enabled, v = l[h], y = n(t), b = n(e), x = []; - for (f || (f = function (t, e, i, n) { - var a, r, o, s = e - t, u = l[i], d = u.size, h = u.steps; - if (!h) return Math.ceil(s / (n * d)); - for (a = 0, r = h.length; a < r && (o = h[a], !(Math.ceil(s / (d * o)) <= n)); ++a) ; - return o - }(t, e, h, i)), g && (y = y.isoWeekday(g), b = b.isoWeekday(g)), y = y.startOf(g ? "day" : h), (b = b.startOf(g ? "day" : h)) < e && b.add(1, h), o = n(y), p && c && !g && !d.round && (o.startOf(c), o.add(~~((y - o) / (v.size * f)) * f, h)); o < b; o.add(f, h)) x.push(+o); - return x.push(+o), x + // Get max width + currentColWidth = Math.max(currentColWidth, itemWidth); + currentColHeight += itemHeight; + + // Store the hitbox width and height here. Final position will be updated in `draw` + hitboxes[i] = { + left: 0, + top: 0, + width: itemWidth, + height: fontSize + }; + }); + + totalWidth += currentColWidth; + columnWidths.push(currentColWidth); + minSize.width += totalWidth; + } + } + + me.width = minSize.width; + me.height = minSize.height; + }, + afterFit: noop$1, + + // Shared Methods + isHorizontal: function () { + return this.options.position === 'top' || this.options.position === 'bottom'; + }, + + // Actually draw the legend on the canvas + draw: function () { + var me = this; + var opts = me.options; + var labelOpts = opts.labels; + var globalDefaults = core_defaults.global; + var defaultColor = globalDefaults.defaultColor; + var lineDefault = globalDefaults.elements.line; + var legendWidth = me.width; + var lineWidths = me.lineWidths; + + if (opts.display) { + var ctx = me.ctx; + var fontColor = valueOrDefault$d(labelOpts.fontColor, globalDefaults.defaultFontColor); + var labelFont = helpers$1.options._parseFont(labelOpts); + var fontSize = labelFont.size; + var cursor; + + // Canvas setup + ctx.textAlign = 'left'; + ctx.textBaseline = 'middle'; + ctx.lineWidth = 0.5; + ctx.strokeStyle = fontColor; // for strikethrough effect + ctx.fillStyle = fontColor; // render in correct colour + ctx.font = labelFont.string; + + var boxWidth = getBoxWidth(labelOpts, fontSize); + var hitboxes = me.legendHitBoxes; + + // current position + var drawLegendBox = function (x, y, legendItem) { + if (isNaN(boxWidth) || boxWidth <= 0) { + return; + } + + // Set the ctx for the box + ctx.save(); + + var lineWidth = valueOrDefault$d(legendItem.lineWidth, lineDefault.borderWidth); + ctx.fillStyle = valueOrDefault$d(legendItem.fillStyle, defaultColor); + ctx.lineCap = valueOrDefault$d(legendItem.lineCap, lineDefault.borderCapStyle); + ctx.lineDashOffset = valueOrDefault$d(legendItem.lineDashOffset, lineDefault.borderDashOffset); + ctx.lineJoin = valueOrDefault$d(legendItem.lineJoin, lineDefault.borderJoinStyle); + ctx.lineWidth = lineWidth; + ctx.strokeStyle = valueOrDefault$d(legendItem.strokeStyle, defaultColor); + + if (ctx.setLineDash) { + // IE 9 and 10 do not support line dash + ctx.setLineDash(valueOrDefault$d(legendItem.lineDash, lineDefault.borderDash)); + } + + if (opts.labels && opts.labels.usePointStyle) { + // Recalculate x and y for drawPoint() because its expecting + // x and y to be center of figure (instead of top left) + var radius = boxWidth * Math.SQRT2 / 2; + var centerX = x + boxWidth / 2; + var centerY = y + fontSize / 2; + + // Draw pointStyle as legend symbol + helpers$1.canvas.drawPoint(ctx, legendItem.pointStyle, radius, centerX, centerY); + } else { + // Draw box as legend symbol + if (lineWidth !== 0) { + ctx.strokeRect(x, y, boxWidth, fontSize); } + ctx.fillRect(x, y, boxWidth, fontSize); + } - e.exports = function (t) { - var e = t.Scale.extend({ - initialize: function () { - if (!n) throw new Error("Chart.js - Moment.js could not be found! You must include it before Chart.js to use the time scale. Download at https://momentjs.com"); - this.mergeTicksOptions(), t.Scale.prototype.initialize.call(this) - }, update: function () { - var e = this.options; - return e.time && e.time.format && console.warn("options.time.format is deprecated and replaced by options.time.parser."), t.Scale.prototype.update.apply(this, arguments) - }, getRightValue: function (e) { - return e && void 0 !== e.t && (e = e.t), t.Scale.prototype.getRightValue.call(this, e) - }, determineDataLimits: function () { - var t, e, i, a, l, u, c = this, f = c.chart, m = c.options.time, p = m.unit || "day", v = s, - y = o, b = [], x = [], _ = []; - for (t = 0, i = f.data.labels.length; t < i; ++t) _.push(g(f.data.labels[t], c)); - for (t = 0, i = (f.data.datasets || []).length; t < i; ++t) if (f.isDatasetVisible(t)) if (l = f.data.datasets[t].data, r.isObject(l[0])) for (x[t] = [], e = 0, a = l.length; e < a; ++e) u = g(l[e], c), b.push(u), x[t][e] = u; else b.push.apply(b, _), x[t] = _.slice(0); else x[t] = []; - _.length && (_ = h(_).sort(d), v = Math.min(v, _[0]), y = Math.max(y, _[_.length - 1])), b.length && (b = h(b).sort(d), v = Math.min(v, b[0]), y = Math.max(y, b[b.length - 1])), v = g(m.min, c) || v, y = g(m.max, c) || y, v = v === s ? +n().startOf(p) : v, y = y === o ? +n().endOf(p) + 1 : y, c.min = Math.min(v, y), c.max = Math.max(v + 1, y), c._horizontal = c.isHorizontal(), c._table = [], c._timestamps = { - data: b, - datasets: x, - labels: _ - } - }, buildTicks: function () { - var t, e, i, a, r, o, s, d, h, v, y, b, x = this, _ = x.min, k = x.max, w = x.options, - M = w.time, S = [], D = []; - switch (w.ticks.source) { - case"data": - S = x._timestamps.data; - break; - case"labels": - S = x._timestamps.labels; - break; - case"auto": - default: - S = p(_, k, x.getLabelCapacity(_), w) - } - for ("ticks" === w.bounds && S.length && (_ = S[0], k = S[S.length - 1]), _ = g(M.min, x) || _, k = g(M.max, x) || k, t = 0, e = S.length; t < e; ++t) (i = S[t]) >= _ && i <= k && D.push(i); - return x.min = _, x.max = k, x._unit = M.unit || function (t, e, i, a) { - var r, o, s = n.duration(n(a).diff(n(i))); - for (r = u.length - 1; r >= u.indexOf(e); r--) if (o = u[r], l[o].common && s.as(o) >= t.length) return o; - return u[e ? u.indexOf(e) : 0] - }(D, M.minUnit, x.min, x.max), x._majorUnit = m(x._unit), x._table = function (t, e, i, n) { - if ("linear" === n || !t.length) return [{time: e, pos: 0}, {time: i, pos: 1}]; - var a, r, o, s, l, u = [], d = [e]; - for (a = 0, r = t.length; a < r; ++a) (s = t[a]) > e && s < i && d.push(s); - for (d.push(i), a = 0, r = d.length; a < r; ++a) l = d[a + 1], o = d[a - 1], s = d[a], void 0 !== o && void 0 !== l && Math.round((l + o) / 2) === s || u.push({ - time: s, - pos: a / (r - 1) - }); - return u - }(x._timestamps.data, _, k, w.distribution), x._offsets = (a = x._table, r = D, o = _, s = k, y = 0, b = 0, (d = w).offset && r.length && (d.time.min || (h = r.length > 1 ? r[1] : s, v = r[0], y = (c(a, "time", h, "pos") - c(a, "time", v, "pos")) / 2), d.time.max || (h = r[r.length - 1], v = r.length > 1 ? r[r.length - 2] : o, b = (c(a, "time", h, "pos") - c(a, "time", v, "pos")) / 2)), { - left: y, - right: b - }), x._labelFormat = function (t, e) { - var i, n, a, r = t.length; - for (i = 0; i < r; i++) { - if (0 !== (n = f(t[i], e)).millisecond()) return "MMM D, YYYY h:mm:ss.SSS a"; - 0 === n.second() && 0 === n.minute() && 0 === n.hour() || (a = !0) - } - return a ? "MMM D, YYYY h:mm:ss a" : "MMM D, YYYY" - }(x._timestamps.data, M), function (t, e) { - var i, a, r, o, s = []; - for (i = 0, a = t.length; i < a; ++i) r = t[i], o = !!e && r === +n(r).startOf(e), s.push({ - value: r, - major: o - }); - return s - }(D, x._majorUnit) - }, getLabelForIndex: function (t, e) { - var i = this.chart.data, n = this.options.time, - a = i.labels && t < i.labels.length ? i.labels[t] : "", o = i.datasets[e].data[t]; - return r.isObject(o) && (a = this.getRightValue(o)), n.tooltipFormat ? f(a, n).format(n.tooltipFormat) : "string" == typeof a ? a : f(a, n).format(this._labelFormat) - }, tickFormatFunction: function (t, e, i, n) { - var a = this.options, o = t.valueOf(), s = a.time.displayFormats, l = s[this._unit], - u = this._majorUnit, d = s[u], h = t.clone().startOf(u).valueOf(), c = a.ticks.major, - f = c.enabled && u && d && o === h, g = t.format(n || (f ? d : l)), - m = f ? c : a.ticks.minor, p = r.valueOrDefault(m.callback, m.userCallback); - return p ? p(g, e, i) : g - }, convertTicksToLabels: function (t) { - var e, i, a = []; - for (e = 0, i = t.length; e < i; ++e) a.push(this.tickFormatFunction(n(t[e].value), e, t)); - return a - }, getPixelForOffset: function (t) { - var e = this, i = e._horizontal ? e.width : e.height, n = e._horizontal ? e.left : e.top, - a = c(e._table, "time", t, "pos"); - return n + i * (e._offsets.left + a) / (e._offsets.left + 1 + e._offsets.right) - }, getPixelForValue: function (t, e, i) { - var n = null; - if (void 0 !== e && void 0 !== i && (n = this._timestamps.datasets[i][e]), null === n && (n = g(t, this)), null !== n) return this.getPixelForOffset(n) - }, getPixelForTick: function (t) { - var e = this.getTicks(); - return t >= 0 && t < e.length ? this.getPixelForOffset(e[t].value) : null - }, getValueForPixel: function (t) { - var e = this, i = e._horizontal ? e.width : e.height, a = e._horizontal ? e.left : e.top, - r = (i ? (t - a) / i : 0) * (e._offsets.left + 1 + e._offsets.left) - e._offsets.right, - o = c(e._table, "pos", r, "time"); - return n(o) - }, getLabelWidth: function (t) { - var e = this.options.ticks, i = this.ctx.measureText(t).width, n = r.toRadians(e.maxRotation), - o = Math.cos(n), s = Math.sin(n); - return i * o + r.valueOrDefault(e.fontSize, a.global.defaultFontSize) * s - }, getLabelCapacity: function (t) { - var e = this.options.time.displayFormats.millisecond, - i = this.tickFormatFunction(n(t), 0, [], e), a = this.getLabelWidth(i), - r = this.isHorizontal() ? this.width : this.height, o = Math.floor(r / a); - return o > 0 ? o : 1 - } - }); - t.scaleService.registerScaleType("time", e, { - position: "bottom", - distribution: "linear", - bounds: "data", - time: { - parser: !1, - format: !1, - unit: !1, - round: !1, - displayFormat: !1, - isoWeekday: !1, - minUnit: "millisecond", - displayFormats: { - millisecond: "h:mm:ss.SSS a", - second: "h:mm:ss a", - minute: "h:mm a", - hour: "hA", - day: "MMM D", - week: "ll", - month: "MMM YYYY", - quarter: "[Q]Q - YYYY", - year: "YYYY" - } - }, - ticks: {autoSkip: !1, source: "auto", major: {enabled: !1}} - }) + ctx.restore(); + }; + var fillText = function (x, y, legendItem, textWidth) { + var halfFontSize = fontSize / 2; + var xLeft = boxWidth + halfFontSize + x; + var yMiddle = y + halfFontSize; + + ctx.fillText(legendItem.text, xLeft, yMiddle); + + if (legendItem.hidden) { + // Strikethrough the text if hidden + ctx.beginPath(); + ctx.lineWidth = 2; + ctx.moveTo(xLeft, yMiddle); + ctx.lineTo(xLeft + textWidth, yMiddle); + ctx.stroke(); + } + }; + + // Horizontal + var isHorizontal = me.isHorizontal(); + if (isHorizontal) { + cursor = { + x: me.left + ((legendWidth - lineWidths[0]) / 2) + labelOpts.padding, + y: me.top + labelOpts.padding, + line: 0 + }; + } else { + cursor = { + x: me.left + labelOpts.padding, + y: me.top + labelOpts.padding, + line: 0 + }; + } + + var itemHeight = fontSize + labelOpts.padding; + helpers$1.each(me.legendItems, function (legendItem, i) { + var textWidth = ctx.measureText(legendItem.text).width; + var width = boxWidth + (fontSize / 2) + textWidth; + var x = cursor.x; + var y = cursor.y; + + // Use (me.left + me.minSize.width) and (me.top + me.minSize.height) + // instead of me.right and me.bottom because me.width and me.height + // may have been changed since me.minSize was calculated + if (isHorizontal) { + if (i > 0 && x + width + labelOpts.padding > me.left + me.minSize.width) { + y = cursor.y += itemHeight; + cursor.line++; + x = cursor.x = me.left + ((legendWidth - lineWidths[cursor.line]) / 2) + labelOpts.padding; } - }, {25: 25, 45: 45, 6: 6}] - }, {}, [7])(7) -});
\ No newline at end of file + } else if (i > 0 && y + itemHeight > me.top + me.minSize.height) { + x = cursor.x = x + me.columnWidths[cursor.line] + labelOpts.padding; + y = cursor.y = me.top + labelOpts.padding; + cursor.line++; + } + + drawLegendBox(x, y, legendItem); + + hitboxes[i].left = x; + hitboxes[i].top = y; + + // Fill the actual label + fillText(x, y, legendItem, textWidth); + + if (isHorizontal) { + cursor.x += width + labelOpts.padding; + } else { + cursor.y += itemHeight; + } + + }); + } + }, + + /** + * @private + */ + _getLegendItemAt: function (x, y) { + var me = this; + var i, hitBox, lh; + + if (x >= me.left && x <= me.right && y >= me.top && y <= me.bottom) { + // See if we are touching one of the dataset boxes + lh = me.legendHitBoxes; + for (i = 0; i < lh.length; ++i) { + hitBox = lh[i]; + + if (x >= hitBox.left && x <= hitBox.left + hitBox.width && y >= hitBox.top && y <= hitBox.top + hitBox.height) { + // Touching an element + return me.legendItems[i]; + } + } + } + + return null; + }, + + /** + * Handle an event + * @private + * @param {IEvent} event - The event to handle + */ + handleEvent: function (e) { + var me = this; + var opts = me.options; + var type = e.type === 'mouseup' ? 'click' : e.type; + var hoveredItem; + + if (type === 'mousemove') { + if (!opts.onHover && !opts.onLeave) { + return; + } + } else if (type === 'click') { + if (!opts.onClick) { + return; + } + } else { + return; + } + + // Chart event already has relative position in it + hoveredItem = me._getLegendItemAt(e.x, e.y); + + if (type === 'click') { + if (hoveredItem && opts.onClick) { + // use e.native for backwards compatibility + opts.onClick.call(me, e.native, hoveredItem); + } + } else { + if (opts.onLeave && hoveredItem !== me._hoveredItem) { + if (me._hoveredItem) { + opts.onLeave.call(me, e.native, me._hoveredItem); + } + me._hoveredItem = hoveredItem; + } + + if (opts.onHover && hoveredItem) { + // use e.native for backwards compatibility + opts.onHover.call(me, e.native, hoveredItem); + } + } + } + }); + + function createNewLegendAndAttach(chart, legendOpts) { + var legend = new Legend({ + ctx: chart.ctx, + options: legendOpts, + chart: chart + }); + + core_layouts.configure(chart, legend, legendOpts); + core_layouts.addBox(chart, legend); + chart.legend = legend; + } + + var plugin_legend = { + id: 'legend', + + /** + * Backward compatibility: since 2.1.5, the legend is registered as a plugin, making + * Chart.Legend obsolete. To avoid a breaking change, we export the Legend as part of + * the plugin, which one will be re-exposed in the chart.js file. + * https://github.com/chartjs/Chart.js/pull/2640 + * @private + */ + _element: Legend, + + beforeInit: function (chart) { + var legendOpts = chart.options.legend; + + if (legendOpts) { + createNewLegendAndAttach(chart, legendOpts); + } + }, + + beforeUpdate: function (chart) { + var legendOpts = chart.options.legend; + var legend = chart.legend; + + if (legendOpts) { + helpers$1.mergeIf(legendOpts, core_defaults.global.legend); + + if (legend) { + core_layouts.configure(chart, legend, legendOpts); + legend.options = legendOpts; + } else { + createNewLegendAndAttach(chart, legendOpts); + } + } else if (legend) { + core_layouts.removeBox(chart, legend); + delete chart.legend; + } + }, + + afterEvent: function (chart, e) { + var legend = chart.legend; + if (legend) { + legend.handleEvent(e); + } + } + }; + + var noop$2 = helpers$1.noop; + + core_defaults._set('global', { + title: { + display: false, + fontStyle: 'bold', + fullWidth: true, + padding: 10, + position: 'top', + text: '', + weight: 2000 // by default greater than legend (1000) to be above + } + }); + + /** + * IMPORTANT: this class is exposed publicly as Chart.Legend, backward compatibility required! + */ + var Title = core_element.extend({ + initialize: function (config) { + var me = this; + helpers$1.extend(me, config); + + // Contains hit boxes for each dataset (in dataset order) + me.legendHitBoxes = []; + }, + + // These methods are ordered by lifecycle. Utilities then follow. + + beforeUpdate: noop$2, + update: function (maxWidth, maxHeight, margins) { + var me = this; + + // Update Lifecycle - Probably don't want to ever extend or overwrite this function ;) + me.beforeUpdate(); + + // Absorb the master measurements + me.maxWidth = maxWidth; + me.maxHeight = maxHeight; + me.margins = margins; + + // Dimensions + me.beforeSetDimensions(); + me.setDimensions(); + me.afterSetDimensions(); + // Labels + me.beforeBuildLabels(); + me.buildLabels(); + me.afterBuildLabels(); + + // Fit + me.beforeFit(); + me.fit(); + me.afterFit(); + // + me.afterUpdate(); + + return me.minSize; + + }, + afterUpdate: noop$2, + + // + + beforeSetDimensions: noop$2, + setDimensions: function () { + var me = this; + // Set the unconstrained dimension before label rotation + if (me.isHorizontal()) { + // Reset position before calculating rotation + me.width = me.maxWidth; + me.left = 0; + me.right = me.width; + } else { + me.height = me.maxHeight; + + // Reset position before calculating rotation + me.top = 0; + me.bottom = me.height; + } + + // Reset padding + me.paddingLeft = 0; + me.paddingTop = 0; + me.paddingRight = 0; + me.paddingBottom = 0; + + // Reset minSize + me.minSize = { + width: 0, + height: 0 + }; + }, + afterSetDimensions: noop$2, + + // + + beforeBuildLabels: noop$2, + buildLabels: noop$2, + afterBuildLabels: noop$2, + + // + + beforeFit: noop$2, + fit: function () { + var me = this; + var opts = me.options; + var display = opts.display; + var minSize = me.minSize; + var lineCount = helpers$1.isArray(opts.text) ? opts.text.length : 1; + var fontOpts = helpers$1.options._parseFont(opts); + var textSize = display ? (lineCount * fontOpts.lineHeight) + (opts.padding * 2) : 0; + + if (me.isHorizontal()) { + minSize.width = me.maxWidth; // fill all the width + minSize.height = textSize; + } else { + minSize.width = textSize; + minSize.height = me.maxHeight; // fill all the height + } + + me.width = minSize.width; + me.height = minSize.height; + + }, + afterFit: noop$2, + + // Shared Methods + isHorizontal: function () { + var pos = this.options.position; + return pos === 'top' || pos === 'bottom'; + }, + + // Actually draw the title block on the canvas + draw: function () { + var me = this; + var ctx = me.ctx; + var opts = me.options; + + if (opts.display) { + var fontOpts = helpers$1.options._parseFont(opts); + var lineHeight = fontOpts.lineHeight; + var offset = lineHeight / 2 + opts.padding; + var rotation = 0; + var top = me.top; + var left = me.left; + var bottom = me.bottom; + var right = me.right; + var maxWidth, titleX, titleY; + + ctx.fillStyle = helpers$1.valueOrDefault(opts.fontColor, core_defaults.global.defaultFontColor); // render in correct colour + ctx.font = fontOpts.string; + + // Horizontal + if (me.isHorizontal()) { + titleX = left + ((right - left) / 2); // midpoint of the width + titleY = top + offset; + maxWidth = right - left; + } else { + titleX = opts.position === 'left' ? left + offset : right - offset; + titleY = top + ((bottom - top) / 2); + maxWidth = bottom - top; + rotation = Math.PI * (opts.position === 'left' ? -0.5 : 0.5); + } + + ctx.save(); + ctx.translate(titleX, titleY); + ctx.rotate(rotation); + ctx.textAlign = 'center'; + ctx.textBaseline = 'middle'; + + var text = opts.text; + if (helpers$1.isArray(text)) { + var y = 0; + for (var i = 0; i < text.length; ++i) { + ctx.fillText(text[i], 0, y, maxWidth); + y += lineHeight; + } + } else { + ctx.fillText(text, 0, 0, maxWidth); + } + + ctx.restore(); + } + } + }); + + function createNewTitleBlockAndAttach(chart, titleOpts) { + var title = new Title({ + ctx: chart.ctx, + options: titleOpts, + chart: chart + }); + + core_layouts.configure(chart, title, titleOpts); + core_layouts.addBox(chart, title); + chart.titleBlock = title; + } + + var plugin_title = { + id: 'title', + + /** + * Backward compatibility: since 2.1.5, the title is registered as a plugin, making + * Chart.Title obsolete. To avoid a breaking change, we export the Title as part of + * the plugin, which one will be re-exposed in the chart.js file. + * https://github.com/chartjs/Chart.js/pull/2640 + * @private + */ + _element: Title, + + beforeInit: function (chart) { + var titleOpts = chart.options.title; + + if (titleOpts) { + createNewTitleBlockAndAttach(chart, titleOpts); + } + }, + + beforeUpdate: function (chart) { + var titleOpts = chart.options.title; + var titleBlock = chart.titleBlock; + + if (titleOpts) { + helpers$1.mergeIf(titleOpts, core_defaults.global.title); + + if (titleBlock) { + core_layouts.configure(chart, titleBlock, titleOpts); + titleBlock.options = titleOpts; + } else { + createNewTitleBlockAndAttach(chart, titleOpts); + } + } else if (titleBlock) { + core_layouts.removeBox(chart, titleBlock); + delete chart.titleBlock; + } + } + }; + + var plugins = {}; + var filler = plugin_filler; + var legend = plugin_legend; + var title = plugin_title; + plugins.filler = filler; + plugins.legend = legend; + plugins.title = title; + + /** + * @namespace Chart + */ + + + core_controller.helpers = helpers$1; + +// @todo dispatch these helpers into appropriated helpers/helpers.* file and write unit tests! + core_helpers(core_controller); + + core_controller._adapters = core_adapters; + core_controller.Animation = core_animation; + core_controller.animationService = core_animations; + core_controller.controllers = controllers; + core_controller.DatasetController = core_datasetController; + core_controller.defaults = core_defaults; + core_controller.Element = core_element; + core_controller.elements = elements; + core_controller.Interaction = core_interaction; + core_controller.layouts = core_layouts; + core_controller.platform = platform; + core_controller.plugins = core_plugins; + core_controller.Scale = core_scale; + core_controller.scaleService = core_scaleService; + core_controller.Ticks = core_ticks; + core_controller.Tooltip = core_tooltip; + +// Register built-in scales + + core_controller.helpers.each(scales, function (scale, type) { + core_controller.scaleService.registerScaleType(type, scale, scale._defaults); + }); + +// Load to register built-in adapters (as side effects) + + +// Loading built-in plugins + + for (var k in plugins) { + if (plugins.hasOwnProperty(k)) { + core_controller.plugins.register(plugins[k]); + } + } + + core_controller.platform.initialize(); + + var src = core_controller; + if (typeof window !== 'undefined') { + window.Chart = core_controller; + } + +// DEPRECATIONS + + /** + * Provided for backward compatibility, not available anymore + * @namespace Chart.Chart + * @deprecated since version 2.8.0 + * @todo remove at version 3 + * @private + */ + core_controller.Chart = core_controller; + + /** + * Provided for backward compatibility, not available anymore + * @namespace Chart.Legend + * @deprecated since version 2.1.5 + * @todo remove at version 3 + * @private + */ + core_controller.Legend = plugins.legend._element; + + /** + * Provided for backward compatibility, not available anymore + * @namespace Chart.Title + * @deprecated since version 2.1.5 + * @todo remove at version 3 + * @private + */ + core_controller.Title = plugins.title._element; + + /** + * Provided for backward compatibility, use Chart.plugins instead + * @namespace Chart.pluginService + * @deprecated since version 2.1.5 + * @todo remove at version 3 + * @private + */ + core_controller.pluginService = core_controller.plugins; + + /** + * Provided for backward compatibility, inheriting from Chart.PlugingBase has no + * effect, instead simply create/register plugins via plain JavaScript objects. + * @interface Chart.PluginBase + * @deprecated since version 2.5.0 + * @todo remove at version 3 + * @private + */ + core_controller.PluginBase = core_controller.Element.extend({}); + + /** + * Provided for backward compatibility, use Chart.helpers.canvas instead. + * @namespace Chart.canvasHelpers + * @deprecated since version 2.6.0 + * @todo remove at version 3 + * @private + */ + core_controller.canvasHelpers = core_controller.helpers.canvas; + + /** + * Provided for backward compatibility, use Chart.layouts instead. + * @namespace Chart.layoutService + * @deprecated since version 2.7.3 + * @todo remove at version 3 + * @private + */ + core_controller.layoutService = core_controller.layouts; + + /** + * Provided for backward compatibility, not available anymore. + * @namespace Chart.LinearScaleBase + * @deprecated since version 2.8 + * @todo remove at version 3 + * @private + */ + core_controller.LinearScaleBase = scale_linearbase; + + /** + * Provided for backward compatibility, instead we should create a new Chart + * by setting the type in the config (`new Chart(id, {type: '{chart-type}'}`). + * @deprecated since version 2.8.0 + * @todo remove at version 3 + */ + core_controller.helpers.each( + [ + 'Bar', + 'Bubble', + 'Doughnut', + 'Line', + 'PolarArea', + 'Radar', + 'Scatter' + ], + function (klass) { + core_controller[klass] = function (ctx, cfg) { + return new core_controller(ctx, core_controller.helpers.merge(cfg || {}, { + type: klass.charAt(0).toLowerCase() + klass.slice(1) + })); + }; + } + ); + + return src; + +}))); diff --git a/assets/js/d3.js b/assets/js/d3.js deleted file mode 100644 index 542bdc7..0000000 --- a/assets/js/d3.js +++ /dev/null @@ -1,10554 +0,0 @@ -// https://d3js.org Version 4.10.2. Copyright 2017 Mike Bostock. -(function (t, n) { - "object" == typeof exports && "undefined" != typeof module ? n(exports) : "function" == typeof define && define.amd ? define(["exports"], n) : n(t.d3 = t.d3 || {}) -})(this, function (t) { - "use strict"; - - function n(t) { - return function (n, e) { - return ss(t(n), e) - } - } - - function e(t, n) { - return [t, n] - } - - function r(t, n, e) { - var r = (n - t) / Math.max(0, e), - i = Math.floor(Math.log(r) / Math.LN10), - o = r / Math.pow(10, i); - return i >= 0 ? (o >= Ts ? 10 : o >= ks ? 5 : o >= Ns ? 2 : 1) * Math.pow(10, i) : -Math.pow(10, -i) / (o >= Ts ? 10 : o >= ks ? 5 : o >= Ns ? 2 : 1) - } - - function i(t, n, e) { - var r = Math.abs(n - t) / Math.max(0, e), - i = Math.pow(10, Math.floor(Math.log(r) / Math.LN10)), - o = r / i; - return o >= Ts ? i *= 10 : o >= ks ? i *= 5 : o >= Ns && (i *= 2), n < t ? -i : i - } - - function o(t) { - return t.length - } - - function u(t) { - return "translate(" + (t + .5) + ",0)" - } - - function a(t) { - return "translate(0," + (t + .5) + ")" - } - - function c(t) { - return function (n) { - return +t(n) - } - } - - function s(t) { - var n = Math.max(0, t.bandwidth() - 1) / 2; - return t.round() && (n = Math.round(n)), - function (e) { - return +t(e) + n - } - } - - function f() { - return !this.__axis - } - - function l(t, n) { - function e(e) { - var u = null == i ? n.ticks ? n.ticks.apply(n, r) : n.domain() : i, - a = null == o ? n.tickFormat ? n.tickFormat.apply(n, r) : Ls : o, - y = Math.max(l, 0) + p, - g = n.range(), - m = +g[0] + .5, - x = +g[g.length - 1] + .5, - b = (n.bandwidth ? s : c)(n.copy()), - w = e.selection ? e.selection() : e, - M = w.selectAll(".domain").data([null]), - T = w.selectAll(".tick").data(u, n).order(), - k = T.exit(), - N = T.enter().append("g").attr("class", "tick"), - S = T.select("line"), - E = T.select("text"); - M = M.merge(M.enter().insert("path", ".tick").attr("class", "domain").attr("stroke", "#000")), T = T.merge(N), S = S.merge(N.append("line").attr("stroke", "#000").attr(v + "2", d * l)), E = E.merge(N.append("text").attr("fill", "#000").attr(v, d * y).attr("dy", t === qs ? "0em" : t === Ds ? "0.71em" : "0.32em")), e !== w && (M = M.transition(e), T = T.transition(e), S = S.transition(e), E = E.transition(e), k = k.transition(e).attr("opacity", Fs).attr("transform", function (t) { - return isFinite(t = b(t)) ? _(t) : this.getAttribute("transform") - }), N.attr("opacity", Fs).attr("transform", function (t) { - var n = this.parentNode.__axis; - return _(n && isFinite(n = n(t)) ? n : b(t)) - })), k.remove(), M.attr("d", t === Os || t == Us ? "M" + d * h + "," + m + "H0.5V" + x + "H" + d * h : "M" + m + "," + d * h + "V0.5H" + x + "V" + d * h), T.attr("opacity", 1).attr("transform", function (t) { - return _(b(t)) - }), S.attr(v + "2", d * l), E.attr(v, d * y).text(a), w.filter(f).attr("fill", "none").attr("font-size", 10).attr("font-family", "sans-serif").attr("text-anchor", t === Us ? "start" : t === Os ? "end" : "middle"), w.each(function () { - this.__axis = b - }) - } - var r = [], - i = null, - o = null, - l = 6, - h = 6, - p = 3, - d = t === qs || t === Os ? -1 : 1, - v = t === Os || t === Us ? "x" : "y", - _ = t === qs || t === Ds ? u : a; - return e.scale = function (t) { - return arguments.length ? (n = t, e) : n - }, e.ticks = function () { - return r = Rs.call(arguments), e - }, e.tickArguments = function (t) { - return arguments.length ? (r = null == t ? [] : Rs.call(t), e) : r.slice() - }, e.tickValues = function (t) { - return arguments.length ? (i = null == t ? null : Rs.call(t), e) : i && i.slice() - }, e.tickFormat = function (t) { - return arguments.length ? (o = t, e) : o - }, e.tickSize = function (t) { - return arguments.length ? (l = h = +t, e) : l - }, e.tickSizeInner = function (t) { - return arguments.length ? (l = +t, e) : l - }, e.tickSizeOuter = function (t) { - return arguments.length ? (h = +t, e) : h - }, e.tickPadding = function (t) { - return arguments.length ? (p = +t, e) : p - }, e - } - - function h() { - for (var t, n = 0, e = arguments.length, r = {}; n < e; ++n) { - if (!(t = arguments[n] + "") || t in r) throw new Error("illegal type: " + t); - r[t] = [] - } - return new p(r) - } - - function p(t) { - this._ = t - } - - function d(t, n) { - return t.trim().split(/^|\s+/).map(function (t) { - var e = "", - r = t.indexOf("."); - if (r >= 0 && (e = t.slice(r + 1), t = t.slice(0, r)), t && !n.hasOwnProperty(t)) throw new Error("unknown type: " + t); - return { - type: t, - name: e - } - }) - } - - function v(t, n) { - for (var e, r = 0, i = t.length; r < i; ++r) - if ((e = t[r]).name === n) return e.value - } - - function _(t, n, e) { - for (var r = 0, i = t.length; r < i; ++r) - if (t[r].name === n) { - t[r] = Is, t = t.slice(0, r).concat(t.slice(r + 1)); - break - } - return null != e && t.push({ - name: n, - value: e - }), t - } - - function y(t) { - return function () { - var n = this.ownerDocument, - e = this.namespaceURI; - return e === Ys && n.documentElement.namespaceURI === Ys ? n.createElement(t) : n.createElementNS(e, t) - } - } - - function g(t) { - return function () { - return this.ownerDocument.createElementNS(t.space, t.local) - } - } - - function m() { - return new x - } - - function x() { - this._ = "@" + (++Xs).toString(36) - } - - function b(t, n, e) { - return t = w(t, n, e), - function (n) { - var e = n.relatedTarget; - e && (e === this || 8 & e.compareDocumentPosition(this)) || t.call(this, n) - } - } - - function w(n, e, r) { - return function (i) { - var o = t.event; - t.event = i; - try { - n.call(this, this.__data__, e, r) - } finally { - t.event = o - } - } - } - - function M(t) { - return t.trim().split(/^|\s+/).map(function (t) { - var n = "", - e = t.indexOf("."); - return e >= 0 && (n = t.slice(e + 1), t = t.slice(0, e)), { - type: t, - name: n - } - }) - } - - function T(t) { - return function () { - var n = this.__on; - if (n) { - for (var e, r = 0, i = -1, o = n.length; r < o; ++r) e = n[r], t.type && e.type !== t.type || e.name !== t.name ? n[++i] = e : this.removeEventListener(e.type, e.listener, e.capture); - ++i ? n.length = i : delete this.__on - } - } - } - - function k(t, n, e) { - var r = Gs.hasOwnProperty(t.type) ? b : w; - return function (i, o, u) { - var a, c = this.__on, - s = r(n, o, u); - if (c) - for (var f = 0, l = c.length; f < l; ++f) - if ((a = c[f]).type === t.type && a.name === t.name) return this.removeEventListener(a.type, a.listener, a.capture), this.addEventListener(a.type, a.listener = s, a.capture = e), void(a.value = n); - this.addEventListener(t.type, s, e), a = { - type: t.type, - name: t.name, - value: n, - listener: s, - capture: e - }, c ? c.push(a) : this.__on = [a] - } - } - - function N(n, e, r, i) { - var o = t.event; - n.sourceEvent = t.event, t.event = n; - try { - return e.apply(r, i) - } finally { - t.event = o - } - } - - function S() {} - - function E() { - return [] - } - - function A(t, n) { - this.ownerDocument = t.ownerDocument, this.namespaceURI = t.namespaceURI, this._next = null, this._parent = t, this.__data__ = n - } - - function C(t, n, e, r, i, o) { - for (var u, a = 0, c = n.length, s = o.length; a < s; ++a)(u = n[a]) ? (u.__data__ = o[a], r[a] = u) : e[a] = new A(t, o[a]); - for (; a < c; ++a)(u = n[a]) && (i[a] = u) - } - - function z(t, n, e, r, i, o, u) { - var a, c, s, f = {}, - l = n.length, - h = o.length, - p = new Array(l); - for (a = 0; a < l; ++a)(c = n[a]) && (p[a] = s = of +u.call(c, c.__data__, a, n), s in f ? i[a] = c : f[s] = c); - for (a = 0; a < h; ++a)(c = f[s = of +u.call(t, o[a], a, o)]) ? (r[a] = c, c.__data__ = o[a], f[s] = null) : e[a] = new A(t, o[a]); - for (a = 0; a < l; ++a)(c = n[a]) && f[p[a]] === c && (i[a] = c) - } - - function P(t, n) { - return t < n ? -1 : t > n ? 1 : t >= n ? 0 : NaN - } - - function R(t) { - return function () { - this.removeAttribute(t) - } - } - - function L(t) { - return function () { - this.removeAttributeNS(t.space, t.local) - } - } - - function q(t, n) { - return function () { - this.setAttribute(t, n) - } - } - - function U(t, n) { - return function () { - this.setAttributeNS(t.space, t.local, n) - } - } - - function D(t, n) { - return function () { - var e = n.apply(this, arguments); - null == e ? this.removeAttribute(t) : this.setAttribute(t, e) - } - } - - function O(t, n) { - return function () { - var e = n.apply(this, arguments); - null == e ? this.removeAttributeNS(t.space, t.local) : this.setAttributeNS(t.space, t.local, e) - } - } - - function F(t) { - return function () { - this.style.removeProperty(t) - } - } - - function I(t, n, e) { - return function () { - this.style.setProperty(t, n, e) - } - } - - function Y(t, n, e) { - return function () { - var r = n.apply(this, arguments); - null == r ? this.style.removeProperty(t) : this.style.setProperty(t, r, e) - } - } - - function B(t, n) { - return t.style.getPropertyValue(n) || uf(t).getComputedStyle(t, null).getPropertyValue(n) - } - - function j(t) { - return function () { - delete this[t] - } - } - - function H(t, n) { - return function () { - this[t] = n - } - } - - function X(t, n) { - return function () { - var e = n.apply(this, arguments); - null == e ? delete this[t] : this[t] = e - } - } - - function $(t) { - return t.trim().split(/^|\s+/) - } - - function V(t) { - return t.classList || new W(t) - } - - function W(t) { - this._node = t, this._names = $(t.getAttribute("class") || "") - } - - function Z(t, n) { - for (var e = V(t), r = -1, i = n.length; ++r < i;) e.add(n[r]) - } - - function G(t, n) { - for (var e = V(t), r = -1, i = n.length; ++r < i;) e.remove(n[r]) - } - - function J(t) { - return function () { - Z(this, t) - } - } - - function Q(t) { - return function () { - G(this, t) - } - } - - function K(t, n) { - return function () { - (n.apply(this, arguments) ? Z : G)(this, t) - } - } - - function tt() { - this.textContent = "" - } - - function nt(t) { - return function () { - this.textContent = t - } - } - - function et(t) { - return function () { - var n = t.apply(this, arguments); - this.textContent = null == n ? "" : n - } - } - - function rt() { - this.innerHTML = "" - } - - function it(t) { - return function () { - this.innerHTML = t - } - } - - function ot(t) { - return function () { - var n = t.apply(this, arguments); - this.innerHTML = null == n ? "" : n - } - } - - function ut() { - this.nextSibling && this.parentNode.appendChild(this) - } - - function at() { - this.previousSibling && this.parentNode.insertBefore(this, this.parentNode.firstChild) - } - - function ct() { - return null - } - - function st() { - var t = this.parentNode; - t && t.removeChild(this) - } - - function ft(t, n, e) { - var r = uf(t), - i = r.CustomEvent; - "function" == typeof i ? i = new i(n, e) : (i = r.document.createEvent("Event"), e ? (i.initEvent(n, e.bubbles, e.cancelable), i.detail = e.detail) : i.initEvent(n, !1, !1)), t.dispatchEvent(i) - } - - function lt(t, n) { - return function () { - return ft(this, t, n) - } - } - - function ht(t, n) { - return function () { - return ft(this, t, n.apply(this, arguments)) - } - } - - function pt(t, n) { - this._groups = t, this._parents = n - } - - function dt() { - return new pt([ - [document.documentElement] - ], af) - } - - function vt() { - t.event.stopImmediatePropagation() - } - - function _t(t, n) { - var e = t.document.documentElement, - r = cf(t).on("dragstart.drag", null); - n && (r.on("click.drag", ff, !0), setTimeout(function () { - r.on("click.drag", null) - }, 0)), "onselectstart" in e ? r.on("selectstart.drag", null) : (e.style.MozUserSelect = e.__noselect, delete e.__noselect) - } - - function yt(t, n, e, r, i, o, u, a, c, s) { - this.target = t, this.type = n, this.subject = e, this.identifier = r, this.active = i, this.x = o, this.y = u, this.dx = a, this.dy = c, this._ = s - } - - function gt() { - return !t.event.button - } - - function mt() { - return this.parentNode - } - - function xt(n) { - return null == n ? { - x: t.event.x, - y: t.event.y - } : n - } - - function bt() { - return "ontouchstart" in this - } - - function wt(t, n) { - var e = Object.create(t.prototype); - for (var r in n) e[r] = n[r]; - return e - } - - function Mt() {} - - function Tt(t) { - var n; - return t = (t + "").trim().toLowerCase(), (n = yf.exec(t)) ? (n = parseInt(n[1], 16), new At(n >> 8 & 15 | n >> 4 & 240, n >> 4 & 15 | 240 & n, (15 & n) << 4 | 15 & n, 1)) : (n = gf.exec(t)) ? kt(parseInt(n[1], 16)) : (n = mf.exec(t)) ? new At(n[1], n[2], n[3], 1) : (n = xf.exec(t)) ? new At(255 * n[1] / 100, 255 * n[2] / 100, 255 * n[3] / 100, 1) : (n = bf.exec(t)) ? Nt(n[1], n[2], n[3], n[4]) : (n = wf.exec(t)) ? Nt(255 * n[1] / 100, 255 * n[2] / 100, 255 * n[3] / 100, n[4]) : (n = Mf.exec(t)) ? Ct(n[1], n[2] / 100, n[3] / 100, 1) : (n = Tf.exec(t)) ? Ct(n[1], n[2] / 100, n[3] / 100, n[4]) : kf.hasOwnProperty(t) ? kt(kf[t]) : "transparent" === t ? new At(NaN, NaN, NaN, 0) : null - } - - function kt(t) { - return new At(t >> 16 & 255, t >> 8 & 255, 255 & t, 1) - } - - function Nt(t, n, e, r) { - return r <= 0 && (t = n = e = NaN), new At(t, n, e, r) - } - - function St(t) { - return t instanceof Mt || (t = Tt(t)), t ? (t = t.rgb(), new At(t.r, t.g, t.b, t.opacity)) : new At - } - - function Et(t, n, e, r) { - return 1 === arguments.length ? St(t) : new At(t, n, e, null == r ? 1 : r) - } - - function At(t, n, e, r) { - this.r = +t, this.g = +n, this.b = +e, this.opacity = +r - } - - function Ct(t, n, e, r) { - return r <= 0 ? t = n = e = NaN : e <= 0 || e >= 1 ? t = n = NaN : n <= 0 && (t = NaN), new Rt(t, n, e, r) - } - - function zt(t) { - if (t instanceof Rt) return new Rt(t.h, t.s, t.l, t.opacity); - if (t instanceof Mt || (t = Tt(t)), !t) return new Rt; - if (t instanceof Rt) return t; - var n = (t = t.rgb()).r / 255, - e = t.g / 255, - r = t.b / 255, - i = Math.min(n, e, r), - o = Math.max(n, e, r), - u = NaN, - a = o - i, - c = (o + i) / 2; - return a ? (u = n === o ? (e - r) / a + 6 * (e < r) : e === o ? (r - n) / a + 2 : (n - e) / a + 4, a /= c < .5 ? o + i : 2 - o - i, u *= 60) : a = c > 0 && c < 1 ? 0 : u, new Rt(u, a, c, t.opacity) - } - - function Pt(t, n, e, r) { - return 1 === arguments.length ? zt(t) : new Rt(t, n, e, null == r ? 1 : r) - } - - function Rt(t, n, e, r) { - this.h = +t, this.s = +n, this.l = +e, this.opacity = +r - } - - function Lt(t, n, e) { - return 255 * (t < 60 ? n + (e - n) * t / 60 : t < 180 ? e : t < 240 ? n + (e - n) * (240 - t) / 60 : n) - } - - function qt(t) { - if (t instanceof Dt) return new Dt(t.l, t.a, t.b, t.opacity); - if (t instanceof Ht) { - var n = t.h * Nf; - return new Dt(t.l, Math.cos(n) * t.c, Math.sin(n) * t.c, t.opacity) - } - t instanceof At || (t = St(t)); - var e = Yt(t.r), - r = Yt(t.g), - i = Yt(t.b), - o = Ot((.4124564 * e + .3575761 * r + .1804375 * i) / Ef), - u = Ot((.2126729 * e + .7151522 * r + .072175 * i) / Af); - return new Dt(116 * u - 16, 500 * (o - u), 200 * (u - Ot((.0193339 * e + .119192 * r + .9503041 * i) / Cf)), t.opacity) - } - - function Ut(t, n, e, r) { - return 1 === arguments.length ? qt(t) : new Dt(t, n, e, null == r ? 1 : r) - } - - function Dt(t, n, e, r) { - this.l = +t, this.a = +n, this.b = +e, this.opacity = +r - } - - function Ot(t) { - return t > Lf ? Math.pow(t, 1 / 3) : t / Rf + zf - } - - function Ft(t) { - return t > Pf ? t * t * t : Rf * (t - zf) - } - - function It(t) { - return 255 * (t <= .0031308 ? 12.92 * t : 1.055 * Math.pow(t, 1 / 2.4) - .055) - } - - function Yt(t) { - return (t /= 255) <= .04045 ? t / 12.92 : Math.pow((t + .055) / 1.055, 2.4) - } - - function Bt(t) { - if (t instanceof Ht) return new Ht(t.h, t.c, t.l, t.opacity); - t instanceof Dt || (t = qt(t)); - var n = Math.atan2(t.b, t.a) * Sf; - return new Ht(n < 0 ? n + 360 : n, Math.sqrt(t.a * t.a + t.b * t.b), t.l, t.opacity) - } - - function jt(t, n, e, r) { - return 1 === arguments.length ? Bt(t) : new Ht(t, n, e, null == r ? 1 : r) - } - - function Ht(t, n, e, r) { - this.h = +t, this.c = +n, this.l = +e, this.opacity = +r - } - - function Xt(t) { - if (t instanceof Vt) return new Vt(t.h, t.s, t.l, t.opacity); - t instanceof At || (t = St(t)); - var n = t.r / 255, - e = t.g / 255, - r = t.b / 255, - i = (Bf * r + If * n - Yf * e) / (Bf + If - Yf), - o = r - i, - u = (Ff * (e - i) - Df * o) / Of, - a = Math.sqrt(u * u + o * o) / (Ff * i * (1 - i)), - c = a ? Math.atan2(u, o) * Sf - 120 : NaN; - return new Vt(c < 0 ? c + 360 : c, a, i, t.opacity) - } - - function $t(t, n, e, r) { - return 1 === arguments.length ? Xt(t) : new Vt(t, n, e, null == r ? 1 : r) - } - - function Vt(t, n, e, r) { - this.h = +t, this.s = +n, this.l = +e, this.opacity = +r - } - - function Wt(t, n, e, r, i) { - var o = t * t, - u = o * t; - return ((1 - 3 * t + 3 * o - u) * n + (4 - 6 * o + 3 * u) * e + (1 + 3 * t + 3 * o - 3 * u) * r + u * i) / 6 - } - - function Zt(t, n) { - return function (e) { - return t + e * n - } - } - - function Gt(t, n, e) { - return t = Math.pow(t, e), n = Math.pow(n, e) - t, e = 1 / e, - function (r) { - return Math.pow(t + r * n, e) - } - } - - function Jt(t, n) { - var e = n - t; - return e ? Zt(t, e > 180 || e < -180 ? e - 360 * Math.round(e / 360) : e) : Jf(isNaN(t) ? n : t) - } - - function Qt(t) { - return 1 == (t = +t) ? Kt : function (n, e) { - return e - n ? Gt(n, e, t) : Jf(isNaN(n) ? e : n) - } - } - - function Kt(t, n) { - var e = n - t; - return e ? Zt(t, e) : Jf(isNaN(t) ? n : t) - } - - function tn(t) { - return function (n) { - var e, r, i = n.length, - o = new Array(i), - u = new Array(i), - a = new Array(i); - for (e = 0; e < i; ++e) r = Et(n[e]), o[e] = r.r || 0, u[e] = r.g || 0, a[e] = r.b || 0; - return o = t(o), u = t(u), a = t(a), r.opacity = 1, - function (t) { - return r.r = o(t), r.g = u(t), r.b = a(t), r + "" - } - } - } - - function nn(t) { - return function () { - return t - } - } - - function en(t) { - return function (n) { - return t(n) + "" - } - } - - function rn(t, n, e, r) { - function i(t) { - return t.length ? t.pop() + " " : "" - } - - function o(t, r, i, o, u, a) { - if (t !== i || r !== o) { - var c = u.push("translate(", null, n, null, e); - a.push({ - i: c - 4, - x: rl(t, i) - }, { - i: c - 2, - x: rl(r, o) - }) - } else(i || o) && u.push("translate(" + i + n + o + e) - } - - function u(t, n, e, o) { - t !== n ? (t - n > 180 ? n += 360 : n - t > 180 && (t += 360), o.push({ - i: e.push(i(e) + "rotate(", null, r) - 2, - x: rl(t, n) - })) : n && e.push(i(e) + "rotate(" + n + r) - } - - function a(t, n, e, o) { - t !== n ? o.push({ - i: e.push(i(e) + "skewX(", null, r) - 2, - x: rl(t, n) - }) : n && e.push(i(e) + "skewX(" + n + r) - } - - function c(t, n, e, r, o, u) { - if (t !== e || n !== r) { - var a = o.push(i(o) + "scale(", null, ",", null, ")"); - u.push({ - i: a - 4, - x: rl(t, e) - }, { - i: a - 2, - x: rl(n, r) - }) - } else 1 === e && 1 === r || o.push(i(o) + "scale(" + e + "," + r + ")") - } - return function (n, e) { - var r = [], - i = []; - return n = t(n), e = t(e), o(n.translateX, n.translateY, e.translateX, e.translateY, r, i), u(n.rotate, e.rotate, r, i), a(n.skewX, e.skewX, r, i), c(n.scaleX, n.scaleY, e.scaleX, e.scaleY, r, i), n = e = null, - function (t) { - for (var n, e = -1, o = i.length; ++e < o;) r[(n = i[e]).i] = n.x(t); - return r.join("") - } - } - } - - function on(t) { - return ((t = Math.exp(t)) + 1 / t) / 2 - } - - function un(t) { - return ((t = Math.exp(t)) - 1 / t) / 2 - } - - function an(t) { - return ((t = Math.exp(2 * t)) - 1) / (t + 1) - } - - function cn(t) { - return function (n, e) { - var r = t((n = Pt(n)).h, (e = Pt(e)).h), - i = Kt(n.s, e.s), - o = Kt(n.l, e.l), - u = Kt(n.opacity, e.opacity); - return function (t) { - return n.h = r(t), n.s = i(t), n.l = o(t), n.opacity = u(t), n + "" - } - } - } - - function sn(t) { - return function (n, e) { - var r = t((n = jt(n)).h, (e = jt(e)).h), - i = Kt(n.c, e.c), - o = Kt(n.l, e.l), - u = Kt(n.opacity, e.opacity); - return function (t) { - return n.h = r(t), n.c = i(t), n.l = o(t), n.opacity = u(t), n + "" - } - } - } - - function fn(t) { - return function n(e) { - function r(n, r) { - var i = t((n = $t(n)).h, (r = $t(r)).h), - o = Kt(n.s, r.s), - u = Kt(n.l, r.l), - a = Kt(n.opacity, r.opacity); - return function (t) { - return n.h = i(t), n.s = o(t), n.l = u(Math.pow(t, e)), n.opacity = a(t), n + "" - } - } - return e = +e, r.gamma = n, r - }(1) - } - - function ln() { - return El || (zl(hn), El = Cl.now() + Al) - } - - function hn() { - El = 0 - } - - function pn() { - this._call = this._time = this._next = null - } - - function dn(t, n, e) { - var r = new pn; - return r.restart(t, n, e), r - } - - function vn() { - ln(), ++Ml; - for (var t, n = Vf; n;)(t = El - n._time) >= 0 && n._call.call(null, t), n = n._next; - --Ml - } - - function _n() { - El = (Sl = Cl.now()) + Al, Ml = Tl = 0; - try { - vn() - } finally { - Ml = 0, gn(), El = 0 - } - } - - function yn() { - var t = Cl.now(), - n = t - Sl; - n > Nl && (Al -= n, Sl = t) - } - - function gn() { - for (var t, n, e = Vf, r = 1 / 0; e;) e._call ? (r > e._time && (r = e._time), t = e, e = e._next) : (n = e._next, e._next = null, e = t ? t._next = n : Vf = n); - Wf = t, mn(r) - } - - function mn(t) { - Ml || (Tl && (Tl = clearTimeout(Tl)), t - El > 24 ? (t < 1 / 0 && (Tl = setTimeout(_n, t - Cl.now() - Al)), kl && (kl = clearInterval(kl))) : (kl || (Sl = Cl.now(), kl = setInterval(yn, Nl)), Ml = 1, zl(_n))) - } - - function xn(t, n) { - var e = t.__transition; - if (!e || !(e = e[n]) || e.state > ql) throw new Error("too late"); - return e - } - - function bn(t, n) { - var e = t.__transition; - if (!e || !(e = e[n]) || e.state > Dl) throw new Error("too late"); - return e - } - - function wn(t, n) { - var e = t.__transition; - if (!e || !(e = e[n])) throw new Error("too late"); - return e - } - - function Mn(t, n, e) { - function r(c) { - var s, f, l, h; - if (e.state !== Ul) return o(); - for (s in a) - if ((h = a[s]).name === e.name) { - if (h.state === Ol) return Pl(r); - h.state === Fl ? (h.state = Yl, h.timer.stop(), h.on.call("interrupt", t, t.__data__, h.index, h.group), delete a[s]) : +s < n && (h.state = Yl, h.timer.stop(), delete a[s]) - } - if (Pl(function () { - e.state === Ol && (e.state = Fl, e.timer.restart(i, e.delay, e.time), i(c)) - }), e.state = Dl, e.on.call("start", t, t.__data__, e.index, e.group), e.state === Dl) { - for (e.state = Ol, u = new Array(l = e.tween.length), s = 0, f = -1; s < l; ++s)(h = e.tween[s].value.call(t, t.__data__, e.index, e.group)) && (u[++f] = h); - u.length = f + 1 - } - } - - function i(n) { - for (var r = n < e.duration ? e.ease.call(null, n / e.duration) : (e.timer.restart(o), e.state = Il, 1), i = -1, a = u.length; ++i < a;) u[i].call(null, r); - e.state === Il && (e.on.call("end", t, t.__data__, e.index, e.group), o()) - } - - function o() { - e.state = Yl, e.timer.stop(), delete a[n]; - for (var r in a) return; - delete t.__transition - } - var u, a = t.__transition; - a[n] = e, e.timer = dn(function (t) { - e.state = Ul, e.timer.restart(r, e.delay, e.time), e.delay <= t && r(t - e.delay) - }, 0, e.time) - } - - function Tn(t, n) { - var e, r; - return function () { - var i = bn(this, t), - o = i.tween; - if (o !== e) - for (var u = 0, a = (r = e = o).length; u < a; ++u) - if (r[u].name === n) { - (r = r.slice()).splice(u, 1); - break - } - i.tween = r - } - } - - function kn(t, n, e) { - var r, i; - if ("function" != typeof e) throw new Error; - return function () { - var o = bn(this, t), - u = o.tween; - if (u !== r) { - i = (r = u).slice(); - for (var a = { - name: n, - value: e - }, c = 0, s = i.length; c < s; ++c) - if (i[c].name === n) { - i[c] = a; - break - } - c === s && i.push(a) - } - o.tween = i - } - } - - function Nn(t, n, e) { - var r = t._id; - return t.each(function () { - var t = bn(this, r); - (t.value || (t.value = {}))[n] = e.apply(this, arguments) - }), - function (t) { - return wn(t, r).value[n] - } - } - - function Sn(t) { - return function () { - this.removeAttribute(t) - } - } - - function En(t) { - return function () { - this.removeAttributeNS(t.space, t.local) - } - } - - function An(t, n, e) { - var r, i; - return function () { - var o = this.getAttribute(t); - return o === e ? null : o === r ? i : i = n(r = o, e) - } - } - - function Cn(t, n, e) { - var r, i; - return function () { - var o = this.getAttributeNS(t.space, t.local); - return o === e ? null : o === r ? i : i = n(r = o, e) - } - } - - function zn(t, n, e) { - var r, i, o; - return function () { - var u, a = e(this); { - if (null != a) return (u = this.getAttribute(t)) === a ? null : u === r && a === i ? o : o = n(r = u, i = a); - this.removeAttribute(t) - } - } - } - - function Pn(t, n, e) { - var r, i, o; - return function () { - var u, a = e(this); { - if (null != a) return (u = this.getAttributeNS(t.space, t.local)) === a ? null : u === r && a === i ? o : o = n(r = u, i = a); - this.removeAttributeNS(t.space, t.local) - } - } - } - - function Rn(t, n) { - function e() { - var e = this, - r = n.apply(e, arguments); - return r && function (n) { - e.setAttributeNS(t.space, t.local, r(n)) - } - } - return e._value = n, e - } - - function Ln(t, n) { - function e() { - var e = this, - r = n.apply(e, arguments); - return r && function (n) { - e.setAttribute(t, r(n)) - } - } - return e._value = n, e - } - - function qn(t, n) { - return function () { - xn(this, t).delay = +n.apply(this, arguments) - } - } - - function Un(t, n) { - return n = +n, - function () { - xn(this, t).delay = n - } - } - - function Dn(t, n) { - return function () { - bn(this, t).duration = +n.apply(this, arguments) - } - } - - function On(t, n) { - return n = +n, - function () { - bn(this, t).duration = n - } - } - - function Fn(t, n) { - if ("function" != typeof n) throw new Error; - return function () { - bn(this, t).ease = n - } - } - - function In(t) { - return (t + "").trim().split(/^|\s+/).every(function (t) { - var n = t.indexOf("."); - return n >= 0 && (t = t.slice(0, n)), !t || "start" === t - }) - } - - function Yn(t, n, e) { - var r, i, o = In(n) ? xn : bn; - return function () { - var u = o(this, t), - a = u.on; - a !== r && (i = (r = a).copy()).on(n, e), u.on = i - } - } - - function Bn(t) { - return function () { - var n = this.parentNode; - for (var e in this.__transition) - if (+e !== t) return; - n && n.removeChild(this) - } - } - - function jn(t, n) { - var e, r, i; - return function () { - var o = B(this, t), - u = (this.style.removeProperty(t), B(this, t)); - return o === u ? null : o === e && u === r ? i : i = n(e = o, r = u) - } - } - - function Hn(t) { - return function () { - this.style.removeProperty(t) - } - } - - function Xn(t, n, e) { - var r, i; - return function () { - var o = B(this, t); - return o === e ? null : o === r ? i : i = n(r = o, e) - } - } - - function $n(t, n, e) { - var r, i, o; - return function () { - var u = B(this, t), - a = e(this); - return null == a && (this.style.removeProperty(t), a = B(this, t)), u === a ? null : u === r && a === i ? o : o = n(r = u, i = a) - } - } - - function Vn(t, n, e) { - function r() { - var r = this, - i = n.apply(r, arguments); - return i && function (n) { - r.style.setProperty(t, i(n), e) - } - } - return r._value = n, r - } - - function Wn(t) { - return function () { - this.textContent = t - } - } - - function Zn(t) { - return function () { - var n = t(this); - this.textContent = null == n ? "" : n - } - } - - function Gn(t, n, e, r) { - this._groups = t, this._parents = n, this._name = e, this._id = r - } - - function Jn(t) { - return dt().transition(t) - } - - function Qn() { - return ++$l - } - - function Kn(t) { - return ((t *= 2) <= 1 ? t * t : --t * (2 - t) + 1) / 2 - } - - function te(t) { - return ((t *= 2) <= 1 ? t * t * t : (t -= 2) * t * t + 2) / 2 - } - - function ne(t) { - return (1 - Math.cos(Jl * t)) / 2 - } - - function ee(t) { - return ((t *= 2) <= 1 ? Math.pow(2, 10 * t - 10) : 2 - Math.pow(2, 10 - 10 * t)) / 2 - } - - function re(t) { - return ((t *= 2) <= 1 ? 1 - Math.sqrt(1 - t * t) : Math.sqrt(1 - (t -= 2) * t) + 1) / 2 - } - - function ie(t) { - return (t = +t) < Kl ? ch * t * t : t < nh ? ch * (t -= th) * t + eh : t < ih ? ch * (t -= rh) * t + oh : ch * (t -= uh) * t + ah - } - - function oe(t, n) { - for (var e; !(e = t.__transition) || !(e = e[n]);) - if (!(t = t.parentNode)) return _h.time = ln(), _h; - return e - } - - function ue() { - t.event.stopImmediatePropagation() - } - - function ae(t) { - return { - type: t - } - } - - function ce() { - return !t.event.button - } - - function se() { - var t = this.ownerSVGElement || this; - return [ - [0, 0], - [t.width.baseVal.value, t.height.baseVal.value] - ] - } - - function fe(t) { - for (; !t.__brush;) - if (!(t = t.parentNode)) return; - return t.__brush - } - - function le(t) { - return t[0][0] === t[1][0] || t[0][1] === t[1][1] - } - - function he(n) { - function e(t) { - var e = t.property("__brush", a).selectAll(".overlay").data([ae("overlay")]); - e.enter().append("rect").attr("class", "overlay").attr("pointer-events", "all").attr("cursor", Eh.overlay).merge(e).each(function () { - var t = fe(this).extent; - cf(this).attr("x", t[0][0]).attr("y", t[0][1]).attr("width", t[1][0] - t[0][0]).attr("height", t[1][1] - t[0][1]) - }), t.selectAll(".selection").data([ae("selection")]).enter().append("rect").attr("class", "selection").attr("cursor", Eh.selection).attr("fill", "#777").attr("fill-opacity", .3).attr("stroke", "#fff").attr("shape-rendering", "crispEdges"); - var i = t.selectAll(".handle").data(n.handles, function (t) { - return t.type - }); - i.exit().remove(), i.enter().append("rect").attr("class", function (t) { - return "handle handle--" + t.type - }).attr("cursor", function (t) { - return Eh[t.type] - }), t.each(r).attr("fill", "none").attr("pointer-events", "all").style("-webkit-tap-highlight-color", "rgba(0,0,0,0)").on("mousedown.brush touchstart.brush", u) - } - - function r() { - var t = cf(this), - n = fe(this).selection; - n ? (t.selectAll(".selection").style("display", null).attr("x", n[0][0]).attr("y", n[0][1]).attr("width", n[1][0] - n[0][0]).attr("height", n[1][1] - n[0][1]), t.selectAll(".handle").style("display", null).attr("x", function (t) { - return "e" === t.type[t.type.length - 1] ? n[1][0] - p / 2 : n[0][0] - p / 2 - }).attr("y", function (t) { - return "s" === t.type[0] ? n[1][1] - p / 2 : n[0][1] - p / 2 - }).attr("width", function (t) { - return "n" === t.type || "s" === t.type ? n[1][0] - n[0][0] + p : p - }).attr("height", function (t) { - return "e" === t.type || "w" === t.type ? n[1][1] - n[0][1] + p : p - })) : t.selectAll(".selection,.handle").style("display", "none").attr("x", null).attr("y", null).attr("width", null).attr("height", null) - } - - function i(t, n) { - return t.__brush.emitter || new o(t, n) - } - - function o(t, n) { - this.that = t, this.args = n, this.state = t.__brush, this.active = 0 - } - - function u() { - function e() { - var t = Ks(w); - !L || x || b || (Math.abs(t[0] - U[0]) > Math.abs(t[1] - U[1]) ? b = !0 : x = !0), U = t, m = !0, xh(), o() - } - - function o() { - var t; - switch (y = U[0] - q[0], g = U[1] - q[1], T) { - case wh: - case bh: - k && (y = Math.max(C - a, Math.min(P - p, y)), s = a + y, d = p + y), N && (g = Math.max(z - l, Math.min(R - v, g)), h = l + g, _ = v + g); - break; - case Mh: - k < 0 ? (y = Math.max(C - a, Math.min(P - a, y)), s = a + y, d = p) : k > 0 && (y = Math.max(C - p, Math.min(P - p, y)), s = a, d = p + y), N < 0 ? (g = Math.max(z - l, Math.min(R - l, g)), h = l + g, _ = v) : N > 0 && (g = Math.max(z - v, Math.min(R - v, g)), h = l, _ = v + g); - break; - case Th: - k && (s = Math.max(C, Math.min(P, a - y * k)), d = Math.max(C, Math.min(P, p + y * k))), N && (h = Math.max(z, Math.min(R, l - g * N)), _ = Math.max(z, Math.min(R, v + g * N))) - } - d < s && (k *= -1, t = a, a = p, p = t, t = s, s = d, d = t, M in Ah && F.attr("cursor", Eh[M = Ah[M]])), _ < h && (N *= -1, t = l, l = v, v = t, t = h, h = _, _ = t, M in Ch && F.attr("cursor", Eh[M = Ch[M]])), S.selection && (A = S.selection), x && (s = A[0][0], d = A[1][0]), b && (h = A[0][1], _ = A[1][1]), A[0][0] === s && A[0][1] === h && A[1][0] === d && A[1][1] === _ || (S.selection = [ - [s, h], - [d, _] - ], r.call(w), D.brush()) - } - - function u() { - if (ue(), t.event.touches) { - if (t.event.touches.length) return; - c && clearTimeout(c), c = setTimeout(function () { - c = null - }, 500), O.on("touchmove.brush touchend.brush touchcancel.brush", null) - } else _t(t.event.view, m), I.on("keydown.brush keyup.brush mousemove.brush mouseup.brush", null); - O.attr("pointer-events", "all"), F.attr("cursor", Eh.overlay), S.selection && (A = S.selection), le(A) && (S.selection = null, r.call(w)), D.end() - } - if (t.event.touches) { - if (t.event.changedTouches.length < t.event.touches.length) return xh() - } else if (c) return; - if (f.apply(this, arguments)) { - var a, s, l, h, p, d, v, _, y, g, m, x, b, w = this, - M = t.event.target.__data__.type, - T = "selection" === (t.event.metaKey ? M = "overlay" : M) ? bh : t.event.altKey ? Th : Mh, - k = n === Nh ? null : zh[M], - N = n === kh ? null : Ph[M], - S = fe(w), - E = S.extent, - A = S.selection, - C = E[0][0], - z = E[0][1], - P = E[1][0], - R = E[1][1], - L = k && N && t.event.shiftKey, - q = Ks(w), - U = q, - D = i(w, arguments).beforestart(); - "overlay" === M ? S.selection = A = [ - [a = n === Nh ? C : q[0], l = n === kh ? z : q[1]], - [p = n === Nh ? P : a, v = n === kh ? R : l] - ] : (a = A[0][0], l = A[0][1], p = A[1][0], v = A[1][1]), s = a, h = l, d = p, _ = v; - var O = cf(w).attr("pointer-events", "none"), - F = O.selectAll(".overlay").attr("cursor", Eh[M]); - if (t.event.touches) O.on("touchmove.brush", e, !0).on("touchend.brush touchcancel.brush", u, !0); - else { - var I = cf(t.event.view).on("keydown.brush", function () { - switch (t.event.keyCode) { - case 16: - L = k && N; - break; - case 18: - T === Mh && (k && (p = d - y * k, a = s + y * k), N && (v = _ - g * N, l = h + g * N), T = Th, o()); - break; - case 32: - T !== Mh && T !== Th || (k < 0 ? p = d - y : k > 0 && (a = s - y), N < 0 ? v = _ - g : N > 0 && (l = h - g), T = wh, F.attr("cursor", Eh.selection), o()); - break; - default: - return - } - xh() - }, !0).on("keyup.brush", function () { - switch (t.event.keyCode) { - case 16: - L && (x = b = L = !1, o()); - break; - case 18: - T === Th && (k < 0 ? p = d : k > 0 && (a = s), N < 0 ? v = _ : N > 0 && (l = h), T = Mh, o()); - break; - case 32: - T === wh && (t.event.altKey ? (k && (p = d - y * k, a = s + y * k), N && (v = _ - g * N, l = h + g * N), T = Th) : (k < 0 ? p = d : k > 0 && (a = s), N < 0 ? v = _ : N > 0 && (l = h), T = Mh), F.attr("cursor", Eh[M]), o()); - break; - default: - return - } - xh() - }, !0).on("mousemove.brush", e, !0).on("mouseup.brush", u, !0); - lf(t.event.view) - } - ue(), jl(w), r.call(w), D.start() - } - } - - function a() { - var t = this.__brush || { - selection: null - }; - return t.extent = s.apply(this, arguments), t.dim = n, t - } - var c, s = se, - f = ce, - l = h(e, "start", "brush", "end"), - p = 6; - return e.move = function (t, e) { - t.selection ? t.on("start.brush", function () { - i(this, arguments).beforestart().start() - }).on("interrupt.brush end.brush", function () { - i(this, arguments).end() - }).tween("brush", function () { - function t(t) { - u.selection = 1 === t && le(s) ? null : f(t), r.call(o), a.brush() - } - var o = this, - u = o.__brush, - a = i(o, arguments), - c = u.selection, - s = n.input("function" == typeof e ? e.apply(this, arguments) : e, u.extent), - f = cl(c, s); - return c && s ? t : t(1) - }) : t.each(function () { - var t = this, - o = arguments, - u = t.__brush, - a = n.input("function" == typeof e ? e.apply(t, o) : e, u.extent), - c = i(t, o).beforestart(); - jl(t), u.selection = null == a || le(a) ? null : a, r.call(t), c.start().brush().end() - }) - }, o.prototype = { - beforestart: function () { - return 1 == ++this.active && (this.state.emitter = this, this.starting = !0), this - }, - start: function () { - return this.starting && (this.starting = !1, this.emit("start")), this - }, - brush: function () { - return this.emit("brush"), this - }, - end: function () { - return 0 == --this.active && (delete this.state.emitter, this.emit("end")), this - }, - emit: function (t) { - N(new mh(e, t, n.output(this.state.selection)), l.apply, l, [t, this.that, this.args]) - } - }, e.extent = function (t) { - return arguments.length ? (s = "function" == typeof t ? t : gh([ - [+t[0][0], +t[0][1]], - [+t[1][0], +t[1][1]] - ]), e) : s - }, e.filter = function (t) { - return arguments.length ? (f = "function" == typeof t ? t : gh(!!t), e) : f - }, e.handleSize = function (t) { - return arguments.length ? (p = +t, e) : p - }, e.on = function () { - var t = l.on.apply(l, arguments); - return t === l ? e : t - }, e - } - - function pe(t) { - return function (n, e) { - return t(n.source.value + n.target.value, e.source.value + e.target.value) - } - } - - function de() { - this._x0 = this._y0 = this._x1 = this._y1 = null, this._ = "" - } - - function ve() { - return new de - } - - function _e(t) { - return t.source - } - - function ye(t) { - return t.target - } - - function ge(t) { - return t.radius - } - - function me(t) { - return t.startAngle - } - - function xe(t) { - return t.endAngle - } - - function be() {} - - function we(t, n) { - var e = new be; - if (t instanceof be) t.each(function (t, n) { - e.set(n, t) - }); - else if (Array.isArray(t)) { - var r, i = -1, - o = t.length; - if (null == n) - for (; ++i < o;) e.set(i, t[i]); - else - for (; ++i < o;) e.set(n(r = t[i], i, t), r) - } else if (t) - for (var u in t) e.set(u, t[u]); - return e - } - - function Me() { - return {} - } - - function Te(t, n, e) { - t[n] = e - } - - function ke() { - return we() - } - - function Ne(t, n, e) { - t.set(n, e) - } - - function Se() {} - - function Ee(t, n) { - var e = new Se; - if (t instanceof Se) t.each(function (t) { - e.add(t) - }); - else if (t) { - var r = -1, - i = t.length; - if (null == n) - for (; ++r < i;) e.add(t[r]); - else - for (; ++r < i;) e.add(n(t[r], r, t)) - } - return e - } - - function Ae(t) { - return new Function("d", "return {" + t.map(function (t, n) { - return JSON.stringify(t) + ": d[" + n + "]" - }).join(",") + "}") - } - - function Ce(t, n) { - var e = Ae(t); - return function (r, i) { - return n(e(r), i, t) - } - } - - function ze(t) { - var n = Object.create(null), - e = []; - return t.forEach(function (t) { - for (var r in t) r in n || e.push(n[r] = r) - }), e - } - - function Pe(t, n, e, r) { - if (isNaN(n) || isNaN(e)) return t; - var i, o, u, a, c, s, f, l, h, p = t._root, - d = { - data: r - }, - v = t._x0, - _ = t._y0, - y = t._x1, - g = t._y1; - if (!p) return t._root = d, t; - for (; p.length;) - if ((s = n >= (o = (v + y) / 2)) ? v = o : y = o, (f = e >= (u = (_ + g) / 2)) ? _ = u : g = u, i = p, !(p = p[l = f << 1 | s])) return i[l] = d, t; - if (a = +t._x.call(null, p.data), c = +t._y.call(null, p.data), n === a && e === c) return d.next = p, i ? i[l] = d : t._root = d, t; - do { - i = i ? i[l] = new Array(4) : t._root = new Array(4), (s = n >= (o = (v + y) / 2)) ? v = o : y = o, (f = e >= (u = (_ + g) / 2)) ? _ = u : g = u - } while ((l = f << 1 | s) == (h = (c >= u) << 1 | a >= o)); - return i[h] = p, i[l] = d, t - } - - function Re(t) { - return t[0] - } - - function Le(t) { - return t[1] - } - - function qe(t, n, e) { - var r = new Ue(null == n ? Re : n, null == e ? Le : e, NaN, NaN, NaN, NaN); - return null == t ? r : r.addAll(t) - } - - function Ue(t, n, e, r, i, o) { - this._x = t, this._y = n, this._x0 = e, this._y0 = r, this._x1 = i, this._y1 = o, this._root = void 0 - } - - function De(t) { - for (var n = { - data: t.data - }, e = n; t = t.next;) e = e.next = { - data: t.data - }; - return n - } - - function Oe(t) { - return t.x + t.vx - } - - function Fe(t) { - return t.y + t.vy - } - - function Ie(t) { - return t.index - } - - function Ye(t, n) { - var e = t.get(n); - if (!e) throw new Error("missing: " + n); - return e - } - - function Be(t) { - return t.x - } - - function je(t) { - return t.y - } - - function He(t) { - return new Xe(t) - } - - function Xe(t) { - if (!(n = xp.exec(t))) throw new Error("invalid format: " + t); - var n, e = n[1] || " ", - r = n[2] || ">", - i = n[3] || "-", - o = n[4] || "", - u = !!n[5], - a = n[6] && +n[6], - c = !!n[7], - s = n[8] && +n[8].slice(1), - f = n[9] || ""; - "n" === f ? (c = !0, f = "g") : mp[f] || (f = ""), (u || "0" === e && "=" === r) && (u = !0, e = "0", r = "="), this.fill = e, this.align = r, this.sign = i, this.symbol = o, this.zero = u, this.width = a, this.comma = c, this.precision = s, this.type = f - } - - function $e(n) { - return bp = Tp(n), t.format = bp.format, t.formatPrefix = bp.formatPrefix, bp - } - - function Ve() { - this.reset() - } - - function We(t, n, e) { - var r = t.s = n + e, - i = r - n, - o = r - i; - t.t = n - o + (e - i) - } - - function Ze(t) { - return t > 1 ? 0 : t < -1 ? cd : Math.acos(t) - } - - function Ge(t) { - return t > 1 ? sd : t < -1 ? -sd : Math.asin(t) - } - - function Je(t) { - return (t = wd(t / 2)) * t - } - - function Qe() {} - - function Ke(t, n) { - t && Sd.hasOwnProperty(t.type) && Sd[t.type](t, n) - } - - function tr(t, n, e) { - var r, i = -1, - o = t.length - e; - for (n.lineStart(); ++i < o;) r = t[i], n.point(r[0], r[1], r[2]); - n.lineEnd() - } - - function nr(t, n) { - var e = -1, - r = t.length; - for (n.polygonStart(); ++e < r;) tr(t[e], n, 1); - n.polygonEnd() - } - - function er() { - zd.point = ir - } - - function rr() { - or(Ap, Cp) - } - - function ir(t, n) { - zd.point = or, Ap = t, Cp = n, zp = t *= pd, Pp = yd(n = (n *= pd) / 2 + fd), Rp = wd(n) - } - - function or(t, n) { - n = (n *= pd) / 2 + fd; - var e = (t *= pd) - zp, - r = e >= 0 ? 1 : -1, - i = r * e, - o = yd(n), - u = wd(n), - a = Rp * u, - c = Pp * o + a * yd(i), - s = a * r * wd(i); - Ad.add(_d(s, c)), zp = t, Pp = o, Rp = u - } - - function ur(t) { - return [_d(t[1], t[0]), Ge(t[2])] - } - - function ar(t) { - var n = t[0], - e = t[1], - r = yd(e); - return [r * yd(n), r * wd(n), wd(e)] - } - - function cr(t, n) { - return t[0] * n[0] + t[1] * n[1] + t[2] * n[2] - } - - function sr(t, n) { - return [t[1] * n[2] - t[2] * n[1], t[2] * n[0] - t[0] * n[2], t[0] * n[1] - t[1] * n[0]] - } - - function fr(t, n) { - t[0] += n[0], t[1] += n[1], t[2] += n[2] - } - - function lr(t, n) { - return [t[0] * n, t[1] * n, t[2] * n] - } - - function hr(t) { - var n = Td(t[0] * t[0] + t[1] * t[1] + t[2] * t[2]); - t[0] /= n, t[1] /= n, t[2] /= n - } - - function pr(t, n) { - Bp.push(jp = [Lp = t, Up = t]), n < qp && (qp = n), n > Dp && (Dp = n) - } - - function dr(t, n) { - var e = ar([t * pd, n * pd]); - if (Yp) { - var r = sr(Yp, e), - i = sr([r[1], -r[0], 0], r); - hr(i), i = ur(i); - var o, u = t - Op, - a = u > 0 ? 1 : -1, - c = i[0] * hd * a, - s = dd(u) > 180; - s ^ (a * Op < c && c < a * t) ? (o = i[1] * hd) > Dp && (Dp = o) : (c = (c + 360) % 360 - 180, s ^ (a * Op < c && c < a * t) ? (o = -i[1] * hd) < qp && (qp = o) : (n < qp && (qp = n), n > Dp && (Dp = n))), s ? t < Op ? xr(Lp, t) > xr(Lp, Up) && (Up = t) : xr(t, Up) > xr(Lp, Up) && (Lp = t) : Up >= Lp ? (t < Lp && (Lp = t), t > Up && (Up = t)) : t > Op ? xr(Lp, t) > xr(Lp, Up) && (Up = t) : xr(t, Up) > xr(Lp, Up) && (Lp = t) - } else Bp.push(jp = [Lp = t, Up = t]); - n < qp && (qp = n), n > Dp && (Dp = n), Yp = e, Op = t - } - - function vr() { - Rd.point = dr - } - - function _r() { - jp[0] = Lp, jp[1] = Up, Rd.point = pr, Yp = null - } - - function yr(t, n) { - if (Yp) { - var e = t - Op; - Pd.add(dd(e) > 180 ? e + (e > 0 ? 360 : -360) : e) - } else Fp = t, Ip = n; - zd.point(t, n), dr(t, n) - } - - function gr() { - zd.lineStart() - } - - function mr() { - yr(Fp, Ip), zd.lineEnd(), dd(Pd) > ad && (Lp = -(Up = 180)), jp[0] = Lp, jp[1] = Up, Yp = null - } - - function xr(t, n) { - return (n -= t) < 0 ? n + 360 : n - } - - function br(t, n) { - return t[0] - n[0] - } - - function wr(t, n) { - return t[0] <= t[1] ? t[0] <= n && n <= t[1] : n < t[0] || t[1] < n - } - - function Mr(t, n) { - t *= pd; - var e = yd(n *= pd); - Tr(e * yd(t), e * wd(t), wd(n)) - } - - function Tr(t, n, e) { - $p += (t - $p) / ++Hp, Vp += (n - Vp) / Hp, Wp += (e - Wp) / Hp - } - - function kr() { - Ld.point = Nr - } - - function Nr(t, n) { - t *= pd; - var e = yd(n *= pd); - rd = e * yd(t), id = e * wd(t), od = wd(n), Ld.point = Sr, Tr(rd, id, od) - } - - function Sr(t, n) { - t *= pd; - var e = yd(n *= pd), - r = e * yd(t), - i = e * wd(t), - o = wd(n), - u = _d(Td((u = id * o - od * i) * u + (u = od * r - rd * o) * u + (u = rd * i - id * r) * u), rd * r + id * i + od * o); - Xp += u, Zp += u * (rd + (rd = r)), Gp += u * (id + (id = i)), Jp += u * (od + (od = o)), Tr(rd, id, od) - } - - function Er() { - Ld.point = Mr - } - - function Ar() { - Ld.point = zr - } - - function Cr() { - Pr(nd, ed), Ld.point = Mr - } - - function zr(t, n) { - nd = t, ed = n, t *= pd, n *= pd, Ld.point = Pr; - var e = yd(n); - rd = e * yd(t), id = e * wd(t), od = wd(n), Tr(rd, id, od) - } - - function Pr(t, n) { - t *= pd; - var e = yd(n *= pd), - r = e * yd(t), - i = e * wd(t), - o = wd(n), - u = id * o - od * i, - a = od * r - rd * o, - c = rd * i - id * r, - s = Td(u * u + a * a + c * c), - f = Ge(s), - l = s && -f / s; - Qp += l * u, Kp += l * a, td += l * c, Xp += f, Zp += f * (rd + (rd = r)), Gp += f * (id + (id = i)), Jp += f * (od + (od = o)), Tr(rd, id, od) - } - - function Rr(t, n) { - return [t > cd ? t - ld : t < -cd ? t + ld : t, n] - } - - function Lr(t, n, e) { - return (t %= ld) ? n || e ? Ud(Ur(t), Dr(n, e)) : Ur(t) : n || e ? Dr(n, e) : Rr - } - - function qr(t) { - return function (n, e) { - return n += t, [n > cd ? n - ld : n < -cd ? n + ld : n, e] - } - } - - function Ur(t) { - var n = qr(t); - return n.invert = qr(-t), n - } - - function Dr(t, n) { - function e(t, n) { - var e = yd(n), - a = yd(t) * e, - c = wd(t) * e, - s = wd(n), - f = s * r + a * i; - return [_d(c * o - f * u, a * r - s * i), Ge(f * o + c * u)] - } - var r = yd(t), - i = wd(t), - o = yd(n), - u = wd(n); - return e.invert = function (t, n) { - var e = yd(n), - a = yd(t) * e, - c = wd(t) * e, - s = wd(n), - f = s * o - c * u; - return [_d(c * o + s * u, a * r + f * i), Ge(f * r - a * i)] - }, e - } - - function Or(t, n, e, r, i, o) { - if (e) { - var u = yd(n), - a = wd(n), - c = r * e; - null == i ? (i = n + r * ld, o = n - c / 2) : (i = Fr(u, i), o = Fr(u, o), (r > 0 ? i < o : i > o) && (i += r * ld)); - for (var s, f = i; r > 0 ? f > o : f < o; f -= c) s = ur([u, -a * yd(f), -a * wd(f)]), t.point(s[0], s[1]) - } - } - - function Fr(t, n) { - (n = ar(n))[0] -= t, hr(n); - var e = Ze(-n[1]); - return ((-n[2] < 0 ? -e : e) + ld - ad) % ld - } - - function Ir(t, n, e, r) { - this.x = t, this.z = n, this.o = e, this.e = r, this.v = !1, this.n = this.p = null - } - - function Yr(t) { - if (n = t.length) { - for (var n, e, r = 0, i = t[0]; ++r < n;) i.n = e = t[r], e.p = i, i = e; - i.n = e = t[0], e.p = i - } - } - - function Br(t, n, e, r) { - function i(i, o) { - return t <= i && i <= e && n <= o && o <= r - } - - function o(i, o, a, s) { - var f = 0, - l = 0; - if (null == i || (f = u(i, a)) !== (l = u(o, a)) || c(i, o) < 0 ^ a > 0) - do { - s.point(0 === f || 3 === f ? t : e, f > 1 ? r : n) - } while ((f = (f + a + 4) % 4) !== l); - else s.point(o[0], o[1]) - } - - function u(r, i) { - return dd(r[0] - t) < ad ? i > 0 ? 0 : 3 : dd(r[0] - e) < ad ? i > 0 ? 2 : 1 : dd(r[1] - n) < ad ? i > 0 ? 1 : 0 : i > 0 ? 3 : 2 - } - - function a(t, n) { - return c(t.x, n.x) - } - - function c(t, n) { - var e = u(t, 1), - r = u(n, 1); - return e !== r ? e - r : 0 === e ? n[1] - t[1] : 1 === e ? t[0] - n[0] : 2 === e ? t[1] - n[1] : n[0] - t[0] - } - return function (u) { - function c(t, n) { - i(t, n) && w.point(t, n) - } - - function s() { - for (var n = 0, e = 0, i = h.length; e < i; ++e) - for (var o, u, a = h[e], c = 1, s = a.length, f = a[0], l = f[0], p = f[1]; c < s; ++c) o = l, u = p, l = (f = a[c])[0], p = f[1], u <= r ? p > r && (l - o) * (r - u) > (p - u) * (t - o) && ++n : p <= r && (l - o) * (r - u) < (p - u) * (t - o) && --n; - return n - } - - function f(o, u) { - var a = i(o, u); - if (h && p.push([o, u]), x) d = o, v = u, _ = a, x = !1, a && (w.lineStart(), w.point(o, u)); - else if (a && m) w.point(o, u); - else { - var c = [y = Math.max(tv, Math.min(Kd, y)), g = Math.max(tv, Math.min(Kd, g))], - s = [o = Math.max(tv, Math.min(Kd, o)), u = Math.max(tv, Math.min(Kd, u))]; - Gd(c, s, t, n, e, r) ? (m || (w.lineStart(), w.point(c[0], c[1])), w.point(s[0], s[1]), a || w.lineEnd(), b = !1) : a && (w.lineStart(), w.point(o, u), b = !1) - } - y = o, g = u, m = a - } - var l, h, p, d, v, _, y, g, m, x, b, w = u, - M = Zd(), - T = { - point: c, - lineStart: function () { - T.point = f, h && h.push(p = []), x = !0, m = !1, y = g = NaN - }, - lineEnd: function () { - l && (f(d, v), _ && m && M.rejoin(), l.push(M.result())), T.point = c, m && w.lineEnd() - }, - polygonStart: function () { - w = M, l = [], h = [], b = !0 - }, - polygonEnd: function () { - var t = s(), - n = b && t, - e = (l = Cs(l)).length; - (n || e) && (u.polygonStart(), n && (u.lineStart(), o(null, null, 1, u), u.lineEnd()), e && Qd(l, a, t, o, u), u.polygonEnd()), w = u, l = h = p = null - } - }; - return T - } - } - - function jr() { - iv.point = iv.lineEnd = Qe - } - - function Hr(t, n) { - Dd = t *= pd, Od = wd(n *= pd), Fd = yd(n), iv.point = Xr - } - - function Xr(t, n) { - t *= pd; - var e = wd(n *= pd), - r = yd(n), - i = dd(t - Dd), - o = yd(i), - u = r * wd(i), - a = Fd * e - Od * r * o, - c = Od * e + Fd * r * o; - rv.add(_d(Td(u * u + a * a), c)), Dd = t, Od = e, Fd = r - } - - function $r(t, n) { - return !(!t || !fv.hasOwnProperty(t.type)) && fv[t.type](t, n) - } - - function Vr(t, n) { - return 0 === cv(t, n) - } - - function Wr(t, n) { - var e = cv(t[0], t[1]); - return cv(t[0], n) + cv(n, t[1]) <= e + ad - } - - function Zr(t, n) { - return !!ev(t.map(Gr), Jr(n)) - } - - function Gr(t) { - return (t = t.map(Jr)).pop(), t - } - - function Jr(t) { - return [t[0] * pd, t[1] * pd] - } - - function Qr(t, n, e) { - var r = Ms(t, n - ad, e).concat(n); - return function (t) { - return r.map(function (n) { - return [t, n] - }) - } - } - - function Kr(t, n, e) { - var r = Ms(t, n - ad, e).concat(n); - return function (t) { - return r.map(function (n) { - return [n, t] - }) - } - } - - function ti() { - function t() { - return { - type: "MultiLineString", - coordinates: n() - } - } - - function n() { - return Ms(gd(o / _) * _, i, _).map(h).concat(Ms(gd(s / y) * y, c, y).map(p)).concat(Ms(gd(r / d) * d, e, d).filter(function (t) { - return dd(t % _) > ad - }).map(f)).concat(Ms(gd(a / v) * v, u, v).filter(function (t) { - return dd(t % y) > ad - }).map(l)) - } - var e, r, i, o, u, a, c, s, f, l, h, p, d = 10, - v = d, - _ = 90, - y = 360, - g = 2.5; - return t.lines = function () { - return n().map(function (t) { - return { - type: "LineString", - coordinates: t - } - }) - }, t.outline = function () { - return { - type: "Polygon", - coordinates: [h(o).concat(p(c).slice(1), h(i).reverse().slice(1), p(s).reverse().slice(1))] - } - }, t.extent = function (n) { - return arguments.length ? t.extentMajor(n).extentMinor(n) : t.extentMinor() - }, t.extentMajor = function (n) { - return arguments.length ? (o = +n[0][0], i = +n[1][0], s = +n[0][1], c = +n[1][1], o > i && (n = o, o = i, i = n), s > c && (n = s, s = c, c = n), t.precision(g)) : [ - [o, s], - [i, c] - ] - }, t.extentMinor = function (n) { - return arguments.length ? (r = +n[0][0], e = +n[1][0], a = +n[0][1], u = +n[1][1], r > e && (n = r, r = e, e = n), a > u && (n = a, a = u, u = n), t.precision(g)) : [ - [r, a], - [e, u] - ] - }, t.step = function (n) { - return arguments.length ? t.stepMajor(n).stepMinor(n) : t.stepMinor() - }, t.stepMajor = function (n) { - return arguments.length ? (_ = +n[0], y = +n[1], t) : [_, y] - }, t.stepMinor = function (n) { - return arguments.length ? (d = +n[0], v = +n[1], t) : [d, v] - }, t.precision = function (n) { - return arguments.length ? (g = +n, f = Qr(a, u, 90), l = Kr(r, e, g), h = Qr(s, c, 90), p = Kr(o, i, g), t) : g - }, t.extentMajor([ - [-180, -90 + ad], - [180, 90 - ad] - ]).extentMinor([ - [-180, -80 - ad], - [180, 80 + ad] - ]) - } - - function ni() { - dv.point = ei - } - - function ei(t, n) { - dv.point = ri, Id = Bd = t, Yd = jd = n - } - - function ri(t, n) { - pv.add(jd * t - Bd * n), Bd = t, jd = n - } - - function ii() { - ri(Id, Yd) - } - - function oi(t, n) { - xv += t, bv += n, ++wv - } - - function ui() { - Av.point = ai - } - - function ai(t, n) { - Av.point = ci, oi($d = t, Vd = n) - } - - function ci(t, n) { - var e = t - $d, - r = n - Vd, - i = Td(e * e + r * r); - Mv += i * ($d + t) / 2, Tv += i * (Vd + n) / 2, kv += i, oi($d = t, Vd = n) - } - - function si() { - Av.point = oi - } - - function fi() { - Av.point = hi - } - - function li() { - pi(Hd, Xd) - } - - function hi(t, n) { - Av.point = pi, oi(Hd = $d = t, Xd = Vd = n) - } - - function pi(t, n) { - var e = t - $d, - r = n - Vd, - i = Td(e * e + r * r); - Mv += i * ($d + t) / 2, Tv += i * (Vd + n) / 2, kv += i, Nv += (i = Vd * t - $d * n) * ($d + t), Sv += i * (Vd + n), Ev += 3 * i, oi($d = t, Vd = n) - } - - function di(t) { - this._context = t - } - - function vi(t, n) { - Uv.point = _i, zv = Rv = t, Pv = Lv = n - } - - function _i(t, n) { - Rv -= t, Lv -= n, qv.add(Td(Rv * Rv + Lv * Lv)), Rv = t, Lv = n - } - - function yi() { - this._string = [] - } - - function gi(t) { - return "m0," + t + "a" + t + "," + t + " 0 1,1 0," + -2 * t + "a" + t + "," + t + " 0 1,1 0," + 2 * t + "z" - } - - function mi(t) { - return t.length > 1 - } - - function xi(t, n) { - return ((t = t.x)[0] < 0 ? t[1] - sd - ad : sd - t[1]) - ((n = n.x)[0] < 0 ? n[1] - sd - ad : sd - n[1]) - } - - function bi(t, n, e, r) { - var i, o, u = wd(t - e); - return dd(u) > ad ? vd((wd(n) * (o = yd(r)) * wd(e) - wd(r) * (i = yd(n)) * wd(t)) / (i * o * u)) : (n + r) / 2 - } - - function wi(t) { - return function (n) { - var e = new Mi; - for (var r in t) e[r] = t[r]; - return e.stream = n, e - } - } - - function Mi() {} - - function Ti(t, n, e) { - var r = n[1][0] - n[0][0], - i = n[1][1] - n[0][1], - o = t.clipExtent && t.clipExtent(); - t.scale(150).translate([0, 0]), null != o && t.clipExtent(null), Ed(e, t.stream(mv)); - var u = mv.result(), - a = Math.min(r / (u[1][0] - u[0][0]), i / (u[1][1] - u[0][1])), - c = +n[0][0] + (r - a * (u[1][0] + u[0][0])) / 2, - s = +n[0][1] + (i - a * (u[1][1] + u[0][1])) / 2; - return null != o && t.clipExtent(o), t.scale(150 * a).translate([c, s]) - } - - function ki(t, n, e) { - return Ti(t, [ - [0, 0], n - ], e) - } - - function Ni(t) { - return wi({ - point: function (n, e) { - n = t(n, e), this.stream.point(n[0], n[1]) - } - }) - } - - function Si(t, n) { - function e(r, i, o, u, a, c, s, f, l, h, p, d, v, _) { - var y = s - r, - g = f - i, - m = y * y + g * g; - if (m > 4 * n && v--) { - var x = u + h, - b = a + p, - w = c + d, - M = Td(x * x + b * b + w * w), - T = Ge(w /= M), - k = dd(dd(w) - 1) < ad || dd(o - l) < ad ? (o + l) / 2 : _d(b, x), - N = t(k, T), - S = N[0], - E = N[1], - A = S - r, - C = E - i, - z = g * A - y * C; - (z * z / m > n || dd((y * A + g * C) / m - .5) > .3 || u * h + a * p + c * d < Yv) && (e(r, i, o, u, a, c, S, E, k, x /= M, b /= M, w, v, _), _.point(S, E), e(S, E, k, x, b, w, s, f, l, h, p, d, v, _)) - } - } - return function (n) { - function r(e, r) { - e = t(e, r), n.point(e[0], e[1]) - } - - function i() { - y = NaN, w.point = o, n.lineStart() - } - - function o(r, i) { - var o = ar([r, i]), - u = t(r, i); - e(y, g, _, m, x, b, y = u[0], g = u[1], _ = r, m = o[0], x = o[1], b = o[2], Iv, n), n.point(y, g) - } - - function u() { - w.point = r, n.lineEnd() - } - - function a() { - i(), w.point = c, w.lineEnd = s - } - - function c(t, n) { - o(f = t, n), l = y, h = g, p = m, d = x, v = b, w.point = o - } - - function s() { - e(y, g, _, m, x, b, l, h, f, p, d, v, Iv, n), w.lineEnd = u, u() - } - var f, l, h, p, d, v, _, y, g, m, x, b, w = { - point: r, - lineStart: i, - lineEnd: u, - polygonStart: function () { - n.polygonStart(), w.lineStart = a - }, - polygonEnd: function () { - n.polygonEnd(), w.lineStart = i - } - }; - return w - } - } - - function Ei(t) { - return Ai(function () { - return t - })() - } - - function Ai(t) { - function n(t) { - return t = f(t[0] * pd, t[1] * pd), [t[0] * _ + a, c - t[1] * _] - } - - function e(t) { - return (t = f.invert((t[0] - a) / _, (c - t[1]) / _)) && [t[0] * hd, t[1] * hd] - } - - function r(t, n) { - return t = u(t, n), [t[0] * _ + a, c - t[1] * _] - } - - function i() { - f = Ud(s = Lr(b, w, M), u); - var t = u(m, x); - return a = y - t[0] * _, c = g + t[1] * _, o() - } - - function o() { - return d = v = null, n - } - var u, a, c, s, f, l, h, p, d, v, _ = 150, - y = 480, - g = 250, - m = 0, - x = 0, - b = 0, - w = 0, - M = 0, - T = null, - k = Ov, - N = null, - S = lv, - E = .5, - A = Bv(r, E); - return n.stream = function (t) { - return d && v === t ? d : d = jv(k(s, A(S(v = t)))) - }, n.clipAngle = function (t) { - return arguments.length ? (k = +t ? Fv(T = t * pd, 6 * pd) : (T = null, Ov), o()) : T * hd - }, n.clipExtent = function (t) { - return arguments.length ? (S = null == t ? (N = l = h = p = null, lv) : Br(N = +t[0][0], l = +t[0][1], h = +t[1][0], p = +t[1][1]), o()) : null == N ? null : [ - [N, l], - [h, p] - ] - }, n.scale = function (t) { - return arguments.length ? (_ = +t, i()) : _ - }, n.translate = function (t) { - return arguments.length ? (y = +t[0], g = +t[1], i()) : [y, g] - }, n.center = function (t) { - return arguments.length ? (m = t[0] % 360 * pd, x = t[1] % 360 * pd, i()) : [m * hd, x * hd] - }, n.rotate = function (t) { - return arguments.length ? (b = t[0] % 360 * pd, w = t[1] % 360 * pd, M = t.length > 2 ? t[2] % 360 * pd : 0, i()) : [b * hd, w * hd, M * hd] - }, n.precision = function (t) { - return arguments.length ? (A = Bv(r, E = t * t), o()) : Td(E) - }, n.fitExtent = function (t, e) { - return Ti(n, t, e) - }, n.fitSize = function (t, e) { - return ki(n, t, e) - }, - function () { - return u = t.apply(this, arguments), n.invert = u.invert && e, i() - } - } - - function Ci(t) { - var n = 0, - e = cd / 3, - r = Ai(t), - i = r(n, e); - return i.parallels = function (t) { - return arguments.length ? r(n = t[0] * pd, e = t[1] * pd) : [n * hd, e * hd] - }, i - } - - function zi(t) { - function n(t, n) { - return [t * e, wd(n) / e] - } - var e = yd(t); - return n.invert = function (t, n) { - return [t / e, Ge(n * e)] - }, n - } - - function Pi(t, n) { - function e(t, n) { - var e = Td(o - 2 * i * wd(n)) / i; - return [e * wd(t *= i), u - e * yd(t)] - } - var r = wd(t), - i = (r + wd(n)) / 2; - if (dd(i) < ad) return zi(t); - var o = 1 + r * (2 * i - r), - u = Td(o) / i; - return e.invert = function (t, n) { - var e = u - n; - return [_d(t, dd(e)) / i * Md(e), Ge((o - (t * t + e * e) * i * i) / (2 * i))] - }, e - } - - function Ri(t) { - var n = t.length; - return { - point: function (e, r) { - for (var i = -1; ++i < n;) t[i].point(e, r) - }, - sphere: function () { - for (var e = -1; ++e < n;) t[e].sphere() - }, - lineStart: function () { - for (var e = -1; ++e < n;) t[e].lineStart() - }, - lineEnd: function () { - for (var e = -1; ++e < n;) t[e].lineEnd() - }, - polygonStart: function () { - for (var e = -1; ++e < n;) t[e].polygonStart() - }, - polygonEnd: function () { - for (var e = -1; ++e < n;) t[e].polygonEnd() - } - } - } - - function Li(t) { - return function (n, e) { - var r = yd(n), - i = yd(e), - o = t(r * i); - return [o * i * wd(n), o * wd(e)] - } - } - - function qi(t) { - return function (n, e) { - var r = Td(n * n + e * e), - i = t(r), - o = wd(i), - u = yd(i); - return [_d(n * o, r * u), Ge(r && e * o / r)] - } - } - - function Ui(t, n) { - return [t, xd(kd((sd + n) / 2))] - } - - function Di(t) { - function n() { - var n = cd * a(), - u = o(Wd(o.rotate()).invert([0, 0])); - return s(null == f ? [ - [u[0] - n, u[1] - n], - [u[0] + n, u[1] + n] - ] : t === Ui ? [ - [Math.max(u[0] - n, f), e], - [Math.min(u[0] + n, r), i] - ] : [ - [f, Math.max(u[1] - n, e)], - [r, Math.min(u[1] + n, i)] - ]) - } - var e, r, i, o = Ei(t), - u = o.center, - a = o.scale, - c = o.translate, - s = o.clipExtent, - f = null; - return o.scale = function (t) { - return arguments.length ? (a(t), n()) : a() - }, o.translate = function (t) { - return arguments.length ? (c(t), n()) : c() - }, o.center = function (t) { - return arguments.length ? (u(t), n()) : u() - }, o.clipExtent = function (t) { - return arguments.length ? (null == t ? f = e = r = i = null : (f = +t[0][0], e = +t[0][1], r = +t[1][0], i = +t[1][1]), n()) : null == f ? null : [ - [f, e], - [r, i] - ] - }, n() - } - - function Oi(t) { - return kd((sd + t) / 2) - } - - function Fi(t, n) { - function e(t, n) { - o > 0 ? n < -sd + ad && (n = -sd + ad) : n > sd - ad && (n = sd - ad); - var e = o / bd(Oi(n), i); - return [e * wd(i * t), o - e * yd(i * t)] - } - var r = yd(t), - i = t === n ? wd(t) : xd(r / yd(n)) / xd(Oi(n) / Oi(t)), - o = r * bd(Oi(t), i) / i; - return i ? (e.invert = function (t, n) { - var e = o - n, - r = Md(i) * Td(t * t + e * e); - return [_d(t, dd(e)) / i * Md(e), 2 * vd(bd(o / r, 1 / i)) - sd] - }, e) : Ui - } - - function Ii(t, n) { - return [t, n] - } - - function Yi(t, n) { - function e(t, n) { - var e = o - n, - r = i * t; - return [e * wd(r), o - e * yd(r)] - } - var r = yd(t), - i = t === n ? wd(t) : (r - yd(n)) / (n - t), - o = r / i + t; - return dd(i) < ad ? Ii : (e.invert = function (t, n) { - var e = o - n; - return [_d(t, dd(e)) / i * Md(e), o - Md(i) * Td(t * t + e * e)] - }, e) - } - - function Bi(t, n) { - var e = yd(n), - r = yd(t) * e; - return [e * wd(t) / r, wd(n) / r] - } - - function ji(t, n, e, r) { - return 1 === t && 1 === n && 0 === e && 0 === r ? lv : wi({ - point: function (i, o) { - this.stream.point(i * t + e, o * n + r) - } - }) - } - - function Hi(t, n) { - return [yd(n) * wd(t), wd(n)] - } - - function Xi(t, n) { - var e = yd(n), - r = 1 + yd(t) * e; - return [e * wd(t) / r, wd(n) / r] - } - - function $i(t, n) { - return [xd(kd((sd + n) / 2)), -t] - } - - function Vi(t, n) { - return t.parent === n.parent ? 1 : 2 - } - - function Wi(t) { - return t.reduce(Zi, 0) / t.length - } - - function Zi(t, n) { - return t + n.x - } - - function Gi(t) { - return 1 + t.reduce(Ji, 0) - } - - function Ji(t, n) { - return Math.max(t, n.y) - } - - function Qi(t) { - for (var n; n = t.children;) t = n[0]; - return t - } - - function Ki(t) { - for (var n; n = t.children;) t = n[n.length - 1]; - return t - } - - function to(t) { - var n = 0, - e = t.children, - r = e && e.length; - if (r) - for (; --r >= 0;) n += e[r].value; - else n = 1; - t.value = n - } - - function no(t, n) { - if (t === n) return t; - var e = t.ancestors(), - r = n.ancestors(), - i = null; - for (t = e.pop(), n = r.pop(); t === n;) i = t, t = e.pop(), n = r.pop(); - return i - } - - function eo(t, n) { - var e, r, i, o, u, a = new uo(t), - c = +t.value && (a.value = t.value), - s = [a]; - for (null == n && (n = ro); e = s.pop();) - if (c && (e.value = +e.data.value), (i = n(e.data)) && (u = i.length)) - for (e.children = new Array(u), o = u - 1; o >= 0; --o) s.push(r = e.children[o] = new uo(i[o])), r.parent = e, r.depth = e.depth + 1; - return a.eachBefore(oo) - } - - function ro(t) { - return t.children - } - - function io(t) { - t.data = t.data.data - } - - function oo(t) { - var n = 0; - do { - t.height = n - } while ((t = t.parent) && t.height < ++n) - } - - function uo(t) { - this.data = t, this.depth = this.height = 0, this.parent = null - } - - function ao(t) { - for (var n, e, r = t.length; r;) e = Math.random() * r-- | 0, n = t[r], t[r] = t[e], t[e] = n; - return t - } - - function co(t, n) { - var e, r; - if (lo(n, t)) return [n]; - for (e = 0; e < t.length; ++e) - if (so(n, t[e]) && lo(vo(t[e], n), t)) return [t[e], n]; - for (e = 0; e < t.length - 1; ++e) - for (r = e + 1; r < t.length; ++r) - if (so(vo(t[e], t[r]), n) && so(vo(t[e], n), t[r]) && so(vo(t[r], n), t[e]) && lo(_o(t[e], t[r], n), t)) return [t[e], t[r], n]; - throw new Error - } - - function so(t, n) { - var e = t.r - n.r, - r = n.x - t.x, - i = n.y - t.y; - return e < 0 || e * e < r * r + i * i - } - - function fo(t, n) { - var e = t.r - n.r + 1e-6, - r = n.x - t.x, - i = n.y - t.y; - return e > 0 && e * e > r * r + i * i - } - - function lo(t, n) { - for (var e = 0; e < n.length; ++e) - if (!fo(t, n[e])) return !1; - return !0 - } - - function ho(t) { - switch (t.length) { - case 1: - return po(t[0]); - case 2: - return vo(t[0], t[1]); - case 3: - return _o(t[0], t[1], t[2]) - } - } - - function po(t) { - return { - x: t.x, - y: t.y, - r: t.r - } - } - - function vo(t, n) { - var e = t.x, - r = t.y, - i = t.r, - o = n.x, - u = n.y, - a = n.r, - c = o - e, - s = u - r, - f = a - i, - l = Math.sqrt(c * c + s * s); - return { - x: (e + o + c / l * f) / 2, - y: (r + u + s / l * f) / 2, - r: (l + i + a) / 2 - } - } - - function _o(t, n, e) { - var r = t.x, - i = t.y, - o = t.r, - u = n.x, - a = n.y, - c = n.r, - s = e.x, - f = e.y, - l = e.r, - h = r - u, - p = r - s, - d = i - a, - v = i - f, - _ = c - o, - y = l - o, - g = r * r + i * i - o * o, - m = g - u * u - a * a + c * c, - x = g - s * s - f * f + l * l, - b = p * d - h * v, - w = (d * x - v * m) / (2 * b) - r, - M = (v * _ - d * y) / b, - T = (p * m - h * x) / (2 * b) - i, - k = (h * y - p * _) / b, - N = M * M + k * k - 1, - S = 2 * (o + w * M + T * k), - E = w * w + T * T - o * o, - A = -(N ? (S + Math.sqrt(S * S - 4 * N * E)) / (2 * N) : E / S); - return { - x: r + w + M * A, - y: i + T + k * A, - r: A - } - } - - function yo(t, n, e) { - var r = t.x, - i = t.y, - o = n.r + e.r, - u = t.r + e.r, - a = n.x - r, - c = n.y - i, - s = a * a + c * c; - if (s) { - var f = .5 + ((u *= u) - (o *= o)) / (2 * s), - l = Math.sqrt(Math.max(0, 2 * o * (u + s) - (u -= s) * u - o * o)) / (2 * s); - e.x = r + f * a + l * c, e.y = i + f * c - l * a - } else e.x = r + u, e.y = i - } - - function go(t, n) { - var e = n.x - t.x, - r = n.y - t.y, - i = t.r + n.r; - return i * i - 1e-6 > e * e + r * r - } - - function mo(t) { - var n = t._, - e = t.next._, - r = n.r + e.r, - i = (n.x * e.r + e.x * n.r) / r, - o = (n.y * e.r + e.y * n.r) / r; - return i * i + o * o - } - - function xo(t) { - this._ = t, this.next = null, this.previous = null - } - - function bo(t) { - if (!(i = t.length)) return 0; - var n, e, r, i, o, u, a, c, s, f, l; - if (n = t[0], n.x = 0, n.y = 0, !(i > 1)) return n.r; - if (e = t[1], n.x = -e.r, e.x = n.r, e.y = 0, !(i > 2)) return n.r + e.r; - yo(e, n, r = t[2]), n = new xo(n), e = new xo(e), r = new xo(r), n.next = r.previous = e, e.next = n.previous = r, r.next = e.previous = n; - t: for (a = 3; a < i; ++a) { - yo(n._, e._, r = t[a]), r = new xo(r), c = e.next, s = n.previous, f = e._.r, l = n._.r; - do { - if (f <= l) { - if (go(c._, r._)) { - e = c, n.next = e, e.previous = n, --a; - continue t - } - f += c._.r, c = c.next - } else { - if (go(s._, r._)) { - (n = s).next = e, e.previous = n, --a; - continue t - } - l += s._.r, s = s.previous - } - } while (c !== s.next); - for (r.previous = n, r.next = e, n.next = e.previous = e = r, o = mo(n); - (r = r.next) !== e;)(u = mo(r)) < o && (n = r, o = u); - e = n.next - } - for (n = [e._], r = e; - (r = r.next) !== e;) n.push(r._); - for (r = Zv(n), a = 0; a < i; ++a) n = t[a], n.x -= r.x, n.y -= r.y; - return r.r - } - - function wo(t) { - return null == t ? null : Mo(t) - } - - function Mo(t) { - if ("function" != typeof t) throw new Error; - return t - } - - function To() { - return 0 - } - - function ko(t) { - return Math.sqrt(t.value) - } - - function No(t) { - return function (n) { - n.children || (n.r = Math.max(0, +t(n) || 0)) - } - } - - function So(t, n) { - return function (e) { - if (r = e.children) { - var r, i, o, u = r.length, - a = t(e) * n || 0; - if (a) - for (i = 0; i < u; ++i) r[i].r += a; - if (o = bo(r), a) - for (i = 0; i < u; ++i) r[i].r -= a; - e.r = o + a - } - } - } - - function Eo(t) { - return function (n) { - var e = n.parent; - n.r *= t, e && (n.x = e.x + t * n.x, n.y = e.y + t * n.y) - } - } - - function Ao(t) { - return t.id - } - - function Co(t) { - return t.parentId - } - - function zo(t, n) { - return t.parent === n.parent ? 1 : 2 - } - - function Po(t) { - var n = t.children; - return n ? n[0] : t.t - } - - function Ro(t) { - var n = t.children; - return n ? n[n.length - 1] : t.t - } - - function Lo(t, n, e) { - var r = e / (n.i - t.i); - n.c -= r, n.s += e, t.c += r, n.z += e, n.m += e - } - - function qo(t) { - for (var n, e = 0, r = 0, i = t.children, o = i.length; --o >= 0;)(n = i[o]).z += e, n.m += e, e += n.s + (r += n.c) - } - - function Uo(t, n, e) { - return t.a.parent === n.parent ? t.a : e - } - - function Do(t, n) { - this._ = t, this.parent = null, this.children = null, this.A = null, this.a = this, this.z = 0, this.m = 0, this.c = 0, this.s = 0, this.t = null, this.i = n - } - - function Oo(t) { - for (var n, e, r, i, o, u = new Do(t, 0), a = [u]; n = a.pop();) - if (r = n._.children) - for (n.children = new Array(o = r.length), i = o - 1; i >= 0; --i) a.push(e = n.children[i] = new Do(r[i], i)), e.parent = n; - return (u.parent = new Do(null, 0)).children = [u], u - } - - function Fo(t, n, e, r, i, o) { - for (var u, a, c, s, f, l, h, p, d, v, _, y = [], g = n.children, m = 0, x = 0, b = g.length, w = n.value; m < b;) { - c = i - e, s = o - r; - do { - f = g[x++].value - } while (!f && x < b); - for (l = h = f, _ = f * f * (v = Math.max(s / c, c / s) / (w * t)), d = Math.max(h / _, _ / l); x < b; ++x) { - if (f += a = g[x].value, a < l && (l = a), a > h && (h = a), _ = f * f * v, (p = Math.max(h / _, _ / l)) > d) { - f -= a; - break - } - d = p - } - y.push(u = { - value: f, - dice: c < s, - children: g.slice(m, x) - }), u.dice ? Qv(u, e, r, i, w ? r += s * f / w : o) : e_(u, e, r, w ? e += c * f / w : i, o), w -= f, m = x - } - return y - } - - function Io(t, n) { - return t[0] - n[0] || t[1] - n[1] - } - - function Yo(t) { - for (var n = t.length, e = [0, 1], r = 2, i = 2; i < n; ++i) { - for (; r > 1 && u_(t[e[r - 2]], t[e[r - 1]], t[i]) <= 0;) --r; - e[r++] = i - } - return e.slice(0, r) - } - - function Bo(t) { - this._size = t, this._call = this._error = null, this._tasks = [], this._data = [], this._waiting = this._active = this._ended = this._start = 0 - } - - function jo(t) { - if (!t._start) try { - Ho(t) - } catch (n) { - if (t._tasks[t._ended + t._active - 1]) $o(t, n); - else if (!t._data) throw n - } - } - - function Ho(t) { - for (; t._start = t._waiting && t._active < t._size;) { - var n = t._ended + t._active, - e = t._tasks[n], - r = e.length - 1, - i = e[r]; - e[r] = Xo(t, n), --t._waiting, ++t._active, e = i.apply(null, e), t._tasks[n] && (t._tasks[n] = e || c_) - } - } - - function Xo(t, n) { - return function (e, r) { - t._tasks[n] && (--t._active, ++t._ended, t._tasks[n] = null, null == t._error && (null != e ? $o(t, e) : (t._data[n] = r, t._waiting ? jo(t) : Vo(t)))) - } - } - - function $o(t, n) { - var e, r = t._tasks.length; - for (t._error = n, t._data = void 0, t._waiting = NaN; --r >= 0;) - if ((e = t._tasks[r]) && (t._tasks[r] = null, e.abort)) try { - e.abort() - } catch (n) {} - t._active = NaN, Vo(t) - } - - function Vo(t) { - if (!t._active && t._call) { - var n = t._data; - t._data = void 0, t._call(t._error, n) - } - } - - function Wo(t) { - if (null == t) t = 1 / 0; - else if (!((t = +t) >= 1)) throw new Error("invalid concurrency"); - return new Bo(t) - } - - function Zo(t) { - return function (n, e) { - t(null == n ? e : null) - } - } - - function Go(t) { - var n = t.responseType; - return n && "text" !== n ? t.response : t.responseText - } - - function Jo(t, n) { - return function (e) { - return t(e.responseText, n) - } - } - - function Qo(t) { - function n(n) { - var o = n + "", - u = e.get(o); - if (!u) { - if (i !== E_) return i; - e.set(o, u = r.push(n)) - } - return t[(u - 1) % t.length] - } - var e = we(), - r = [], - i = E_; - return t = null == t ? [] : S_.call(t), n.domain = function (t) { - if (!arguments.length) return r.slice(); - r = [], e = we(); - for (var i, o, u = -1, a = t.length; ++u < a;) e.has(o = (i = t[u]) + "") || e.set(o, r.push(i)); - return n - }, n.range = function (e) { - return arguments.length ? (t = S_.call(e), n) : t.slice() - }, n.unknown = function (t) { - return arguments.length ? (i = t, n) : i - }, n.copy = function () { - return Qo().domain(r).range(t).unknown(i) - }, n - } - - function Ko() { - function t() { - var t = i().length, - r = u[1] < u[0], - l = u[r - 0], - h = u[1 - r]; - n = (h - l) / Math.max(1, t - c + 2 * s), a && (n = Math.floor(n)), l += (h - l - n * (t - c)) * f, e = n * (1 - c), a && (l = Math.round(l), e = Math.round(e)); - var p = Ms(t).map(function (t) { - return l + n * t - }); - return o(r ? p.reverse() : p) - } - var n, e, r = Qo().unknown(void 0), - i = r.domain, - o = r.range, - u = [0, 1], - a = !1, - c = 0, - s = 0, - f = .5; - return delete r.unknown, r.domain = function (n) { - return arguments.length ? (i(n), t()) : i() - }, r.range = function (n) { - return arguments.length ? (u = [+n[0], +n[1]], t()) : u.slice() - }, r.rangeRound = function (n) { - return u = [+n[0], +n[1]], a = !0, t() - }, r.bandwidth = function () { - return e - }, r.step = function () { - return n - }, r.round = function (n) { - return arguments.length ? (a = !!n, t()) : a - }, r.padding = function (n) { - return arguments.length ? (c = s = Math.max(0, Math.min(1, n)), t()) : c - }, r.paddingInner = function (n) { - return arguments.length ? (c = Math.max(0, Math.min(1, n)), t()) : c - }, r.paddingOuter = function (n) { - return arguments.length ? (s = Math.max(0, Math.min(1, n)), t()) : s - }, r.align = function (n) { - return arguments.length ? (f = Math.max(0, Math.min(1, n)), t()) : f - }, r.copy = function () { - return Ko().domain(i()).range(u).round(a).paddingInner(c).paddingOuter(s).align(f) - }, t() - } - - function tu(t) { - var n = t.copy; - return t.padding = t.paddingOuter, delete t.paddingInner, delete t.paddingOuter, t.copy = function () { - return tu(n()) - }, t - } - - function nu(t, n) { - return (n -= t = +t) ? function (e) { - return (e - t) / n - } : A_(n) - } - - function eu(t) { - return function (n, e) { - var r = t(n = +n, e = +e); - return function (t) { - return t <= n ? 0 : t >= e ? 1 : r(t) - } - } - } - - function ru(t) { - return function (n, e) { - var r = t(n = +n, e = +e); - return function (t) { - return t <= 0 ? n : t >= 1 ? e : r(t) - } - } - } - - function iu(t, n, e, r) { - var i = t[0], - o = t[1], - u = n[0], - a = n[1]; - return o < i ? (i = e(o, i), u = r(a, u)) : (i = e(i, o), u = r(u, a)), - function (t) { - return u(i(t)) - } - } - - function ou(t, n, e, r) { - var i = Math.min(t.length, n.length) - 1, - o = new Array(i), - u = new Array(i), - a = -1; - for (t[i] < t[0] && (t = t.slice().reverse(), n = n.slice().reverse()); ++a < i;) o[a] = e(t[a], t[a + 1]), u[a] = r(n[a], n[a + 1]); - return function (n) { - var e = hs(t, n, 1, i) - 1; - return u[e](o[e](n)) - } - } - - function uu(t, n) { - return n.domain(t.domain()).range(t.range()).interpolate(t.interpolate()).clamp(t.clamp()) - } - - function au(t, n) { - function e() { - return i = Math.min(a.length, c.length) > 2 ? ou : iu, o = u = null, r - } - - function r(n) { - return (o || (o = i(a, c, f ? eu(t) : t, s)))(+n) - } - var i, o, u, a = z_, - c = z_, - s = cl, - f = !1; - return r.invert = function (t) { - return (u || (u = i(c, a, nu, f ? ru(n) : n)))(+t) - }, r.domain = function (t) { - return arguments.length ? (a = N_.call(t, C_), e()) : a.slice() - }, r.range = function (t) { - return arguments.length ? (c = S_.call(t), e()) : c.slice() - }, r.rangeRound = function (t) { - return c = S_.call(t), s = sl, e() - }, r.clamp = function (t) { - return arguments.length ? (f = !!t, e()) : f - }, r.interpolate = function (t) { - return arguments.length ? (s = t, e()) : s - }, e() - } - - function cu(t) { - var n = t.domain; - return t.ticks = function (t) { - var e = n(); - return Ss(e[0], e[e.length - 1], null == t ? 10 : t) - }, t.tickFormat = function (t, e) { - return P_(n(), t, e) - }, t.nice = function (e) { - null == e && (e = 10); - var i, o = n(), - u = 0, - a = o.length - 1, - c = o[u], - s = o[a]; - return s < c && (i = c, c = s, s = i, i = u, u = a, a = i), (i = r(c, s, e)) > 0 ? i = r(c = Math.floor(c / i) * i, s = Math.ceil(s / i) * i, e) : i < 0 && (i = r(c = Math.ceil(c * i) / i, s = Math.floor(s * i) / i, e)), i > 0 ? (o[u] = Math.floor(c / i) * i, o[a] = Math.ceil(s / i) * i, n(o)) : i < 0 && (o[u] = Math.ceil(c * i) / i, o[a] = Math.floor(s * i) / i, n(o)), t - }, t - } - - function su() { - var t = au(nu, rl); - return t.copy = function () { - return uu(t, su()) - }, cu(t) - } - - function fu() { - function t(t) { - return +t - } - var n = [0, 1]; - return t.invert = t, t.domain = t.range = function (e) { - return arguments.length ? (n = N_.call(e, C_), t) : n.slice() - }, t.copy = function () { - return fu().domain(n) - }, cu(t) - } - - function lu(t, n) { - return (n = Math.log(n / t)) ? function (e) { - return Math.log(e / t) / n - } : A_(n) - } - - function hu(t, n) { - return t < 0 ? function (e) { - return -Math.pow(-n, e) * Math.pow(-t, 1 - e) - } : function (e) { - return Math.pow(n, e) * Math.pow(t, 1 - e) - } - } - - function pu(t) { - return isFinite(t) ? +("1e" + t) : t < 0 ? 0 : t - } - - function du(t) { - return 10 === t ? pu : t === Math.E ? Math.exp : function (n) { - return Math.pow(t, n) - } - } - - function vu(t) { - return t === Math.E ? Math.log : 10 === t && Math.log10 || 2 === t && Math.log2 || (t = Math.log(t), function (n) { - return Math.log(n) / t - }) - } - - function _u(t) { - return function (n) { - return -t(-n) - } - } - - function yu() { - function n() { - return o = vu(i), u = du(i), r()[0] < 0 && (o = _u(o), u = _u(u)), e - } - var e = au(lu, hu).domain([1, 10]), - r = e.domain, - i = 10, - o = vu(10), - u = du(10); - return e.base = function (t) { - return arguments.length ? (i = +t, n()) : i - }, e.domain = function (t) { - return arguments.length ? (r(t), n()) : r() - }, e.ticks = function (t) { - var n, e = r(), - a = e[0], - c = e[e.length - 1]; - (n = c < a) && (h = a, a = c, c = h); - var s, f, l, h = o(a), - p = o(c), - d = null == t ? 10 : +t, - v = []; - if (!(i % 1) && p - h < d) { - if (h = Math.round(h) - 1, p = Math.round(p) + 1, a > 0) { - for (; h < p; ++h) - for (f = 1, s = u(h); f < i; ++f) - if (!((l = s * f) < a)) { - if (l > c) break; - v.push(l) - } - } else - for (; h < p; ++h) - for (f = i - 1, s = u(h); f >= 1; --f) - if (!((l = s * f) < a)) { - if (l > c) break; - v.push(l) - } - } else v = Ss(h, p, Math.min(p - h, d)).map(u); - return n ? v.reverse() : v - }, e.tickFormat = function (n, r) { - if (null == r && (r = 10 === i ? ".0e" : ","), "function" != typeof r && (r = t.format(r)), n === 1 / 0) return r; - null == n && (n = 10); - var a = Math.max(1, i * n / e.ticks().length); - return function (t) { - var n = t / u(Math.round(o(t))); - return n * i < i - .5 && (n *= i), n <= a ? r(t) : "" - } - }, e.nice = function () { - return r(R_(r(), { - floor: function (t) { - return u(Math.floor(o(t))) - }, - ceil: function (t) { - return u(Math.ceil(o(t))) - } - })) - }, e.copy = function () { - return uu(e, yu().base(i)) - }, e - } - - function gu(t, n) { - return t < 0 ? -Math.pow(-t, n) : Math.pow(t, n) - } - - function mu() { - var t = 1, - n = au(function (n, e) { - return (e = gu(e, t) - (n = gu(n, t))) ? function (r) { - return (gu(r, t) - n) / e - } : A_(e) - }, function (n, e) { - return e = gu(e, t) - (n = gu(n, t)), - function (r) { - return gu(n + e * r, 1 / t) - } - }), - e = n.domain; - return n.exponent = function (n) { - return arguments.length ? (t = +n, e(e())) : t - }, n.copy = function () { - return uu(n, mu().exponent(t)) - }, cu(n) - } - - function xu() { - function t() { - var t = 0, - o = Math.max(1, r.length); - for (i = new Array(o - 1); ++t < o;) i[t - 1] = As(e, t / o); - return n - } - - function n(t) { - if (!isNaN(t = +t)) return r[hs(i, t)] - } - var e = [], - r = [], - i = []; - return n.invertExtent = function (t) { - var n = r.indexOf(t); - return n < 0 ? [NaN, NaN] : [n > 0 ? i[n - 1] : e[0], n < i.length ? i[n] : e[e.length - 1]] - }, n.domain = function (n) { - if (!arguments.length) return e.slice(); - e = []; - for (var r, i = 0, o = n.length; i < o; ++i) null == (r = n[i]) || isNaN(r = +r) || e.push(r); - return e.sort(ss), t() - }, n.range = function (n) { - return arguments.length ? (r = S_.call(n), t()) : r.slice() - }, n.quantiles = function () { - return i.slice() - }, n.copy = function () { - return xu().domain(e).range(r) - }, n - } - - function bu() { - function t(t) { - if (t <= t) return u[hs(o, t, 0, i)] - } - - function n() { - var n = -1; - for (o = new Array(i); ++n < i;) o[n] = ((n + 1) * r - (n - i) * e) / (i + 1); - return t - } - var e = 0, - r = 1, - i = 1, - o = [.5], - u = [0, 1]; - return t.domain = function (t) { - return arguments.length ? (e = +t[0], r = +t[1], n()) : [e, r] - }, t.range = function (t) { - return arguments.length ? (i = (u = S_.call(t)).length - 1, n()) : u.slice() - }, t.invertExtent = function (t) { - var n = u.indexOf(t); - return n < 0 ? [NaN, NaN] : n < 1 ? [e, o[0]] : n >= i ? [o[i - 1], r] : [o[n - 1], o[n]] - }, t.copy = function () { - return bu().domain([e, r]).range(u) - }, cu(t) - } - - function wu() { - function t(t) { - if (t <= t) return e[hs(n, t, 0, r)] - } - var n = [.5], - e = [0, 1], - r = 1; - return t.domain = function (i) { - return arguments.length ? (n = S_.call(i), r = Math.min(n.length, e.length - 1), t) : n.slice() - }, t.range = function (i) { - return arguments.length ? (e = S_.call(i), r = Math.min(n.length, e.length - 1), t) : e.slice() - }, t.invertExtent = function (t) { - var r = e.indexOf(t); - return [n[r - 1], n[r]] - }, t.copy = function () { - return wu().domain(n).range(e) - }, t - } - - function Mu(t, n, e, r) { - function i(n) { - return t(n = new Date(+n)), n - } - return i.floor = i, i.ceil = function (e) { - return t(e = new Date(e - 1)), n(e, 1), t(e), e - }, i.round = function (t) { - var n = i(t), - e = i.ceil(t); - return t - n < e - t ? n : e - }, i.offset = function (t, e) { - return n(t = new Date(+t), null == e ? 1 : Math.floor(e)), t - }, i.range = function (e, r, o) { - var u = []; - if (e = i.ceil(e), o = null == o ? 1 : Math.floor(o), !(e < r && o > 0)) return u; - do { - u.push(new Date(+e)) - } while (n(e, o), t(e), e < r); - return u - }, i.filter = function (e) { - return Mu(function (n) { - if (n >= n) - for (; t(n), !e(n);) n.setTime(n - 1) - }, function (t, r) { - if (t >= t) - if (r < 0) - for (; ++r <= 0;) - for (; n(t, -1), !e(t);); - else - for (; --r >= 0;) - for (; n(t, 1), !e(t);); - }) - }, e && (i.count = function (n, r) { - return L_.setTime(+n), q_.setTime(+r), t(L_), t(q_), Math.floor(e(L_, q_)) - }, i.every = function (t) { - return t = Math.floor(t), isFinite(t) && t > 0 ? t > 1 ? i.filter(r ? function (n) { - return r(n) % t == 0 - } : function (n) { - return i.count(0, n) % t == 0 - }) : i : null - }), i - } - - function Tu(t) { - return Mu(function (n) { - n.setDate(n.getDate() - (n.getDay() + 7 - t) % 7), n.setHours(0, 0, 0, 0) - }, function (t, n) { - t.setDate(t.getDate() + 7 * n) - }, function (t, n) { - return (n - t - (n.getTimezoneOffset() - t.getTimezoneOffset()) * O_) / F_ - }) - } - - function ku(t) { - return Mu(function (n) { - n.setUTCDate(n.getUTCDate() - (n.getUTCDay() + 7 - t) % 7), n.setUTCHours(0, 0, 0, 0) - }, function (t, n) { - t.setUTCDate(t.getUTCDate() + 7 * n) - }, function (t, n) { - return (n - t) / F_ - }) - } - - function Nu(t) { - if (0 <= t.y && t.y < 100) { - var n = new Date(-1, t.m, t.d, t.H, t.M, t.S, t.L); - return n.setFullYear(t.y), n - } - return new Date(t.y, t.m, t.d, t.H, t.M, t.S, t.L) - } - - function Su(t) { - if (0 <= t.y && t.y < 100) { - var n = new Date(Date.UTC(-1, t.m, t.d, t.H, t.M, t.S, t.L)); - return n.setUTCFullYear(t.y), n - } - return new Date(Date.UTC(t.y, t.m, t.d, t.H, t.M, t.S, t.L)) - } - - function Eu(t) { - return { - y: t, - m: 0, - d: 1, - H: 0, - M: 0, - S: 0, - L: 0 - } - } - - function Au(t) { - function n(t, n) { - return function (e) { - var r, i, o, u = [], - a = -1, - c = 0, - s = t.length; - for (e instanceof Date || (e = new Date(+e)); ++a < s;) 37 === t.charCodeAt(a) && (u.push(t.slice(c, a)), null != (i = Dy[r = t.charAt(++a)]) ? r = t.charAt(++a) : i = "e" === r ? " " : "0", (o = n[r]) && (r = o(e, i)), u.push(r), c = a + 1); - return u.push(t.slice(c, a)), u.join("") - } - } - - function e(t, n) { - return function (e) { - var i = Eu(1900); - if (r(i, t, e += "", 0) != e.length) return null; - if ("p" in i && (i.H = i.H % 12 + 12 * i.p), "W" in i || "U" in i) { - "w" in i || (i.w = "W" in i ? 1 : 0); - var o = "Z" in i ? Su(Eu(i.y)).getUTCDay() : n(Eu(i.y)).getDay(); - i.m = 0, i.d = "W" in i ? (i.w + 6) % 7 + 7 * i.W - (o + 5) % 7 : i.w + 7 * i.U - (o + 6) % 7 - } - return "Z" in i ? (i.H += i.Z / 100 | 0, i.M += i.Z % 100, Su(i)) : n(i) - } - } - - function r(t, n, e, r) { - for (var i, o, u = 0, a = n.length, c = e.length; u < a;) { - if (r >= c) return -1; - if (37 === (i = n.charCodeAt(u++))) { - if (i = n.charAt(u++), !(o = T[i in Dy ? n.charAt(u++) : i]) || (r = o(t, e, r)) < 0) return -1 - } else if (i != e.charCodeAt(r++)) return -1 - } - return r - } - var i = t.dateTime, - o = t.date, - u = t.time, - a = t.periods, - c = t.days, - s = t.shortDays, - f = t.months, - l = t.shortMonths, - h = Pu(a), - p = Ru(a), - d = Pu(c), - v = Ru(c), - _ = Pu(s), - y = Ru(s), - g = Pu(f), - m = Ru(f), - x = Pu(l), - b = Ru(l), - w = { - a: function (t) { - return s[t.getDay()] - }, - A: function (t) { - return c[t.getDay()] - }, - b: function (t) { - return l[t.getMonth()] - }, - B: function (t) { - return f[t.getMonth()] - }, - c: null, - d: Wu, - e: Wu, - H: Zu, - I: Gu, - j: Ju, - L: Qu, - m: Ku, - M: ta, - p: function (t) { - return a[+(t.getHours() >= 12)] - }, - S: na, - U: ea, - w: ra, - W: ia, - x: null, - X: null, - y: oa, - Y: ua, - Z: aa, - "%": wa - }, - M = { - a: function (t) { - return s[t.getUTCDay()] - }, - A: function (t) { - return c[t.getUTCDay()] - }, - b: function (t) { - return l[t.getUTCMonth()] - }, - B: function (t) { - return f[t.getUTCMonth()] - }, - c: null, - d: ca, - e: ca, - H: sa, - I: fa, - j: la, - L: ha, - m: pa, - M: da, - p: function (t) { - return a[+(t.getUTCHours() >= 12)] - }, - S: va, - U: _a, - w: ya, - W: ga, - x: null, - X: null, - y: ma, - Y: xa, - Z: ba, - "%": wa - }, - T = { - a: function (t, n, e) { - var r = _.exec(n.slice(e)); - return r ? (t.w = y[r[0].toLowerCase()], e + r[0].length) : -1 - }, - A: function (t, n, e) { - var r = d.exec(n.slice(e)); - return r ? (t.w = v[r[0].toLowerCase()], e + r[0].length) : -1 - }, - b: function (t, n, e) { - var r = x.exec(n.slice(e)); - return r ? (t.m = b[r[0].toLowerCase()], e + r[0].length) : -1 - }, - B: function (t, n, e) { - var r = g.exec(n.slice(e)); - return r ? (t.m = m[r[0].toLowerCase()], e + r[0].length) : -1 - }, - c: function (t, n, e) { - return r(t, i, n, e) - }, - d: Yu, - e: Yu, - H: ju, - I: ju, - j: Bu, - L: $u, - m: Iu, - M: Hu, - p: function (t, n, e) { - var r = h.exec(n.slice(e)); - return r ? (t.p = p[r[0].toLowerCase()], e + r[0].length) : -1 - }, - S: Xu, - U: qu, - w: Lu, - W: Uu, - x: function (t, n, e) { - return r(t, o, n, e) - }, - X: function (t, n, e) { - return r(t, u, n, e) - }, - y: Ou, - Y: Du, - Z: Fu, - "%": Vu - }; - return w.x = n(o, w), w.X = n(u, w), w.c = n(i, w), M.x = n(o, M), M.X = n(u, M), M.c = n(i, M), { - format: function (t) { - var e = n(t += "", w); - return e.toString = function () { - return t - }, e - }, - parse: function (t) { - var n = e(t += "", Nu); - return n.toString = function () { - return t - }, n - }, - utcFormat: function (t) { - var e = n(t += "", M); - return e.toString = function () { - return t - }, e - }, - utcParse: function (t) { - var n = e(t, Su); - return n.toString = function () { - return t - }, n - } - } - } - - function Cu(t, n, e) { - var r = t < 0 ? "-" : "", - i = (r ? -t : t) + "", - o = i.length; - return r + (o < e ? new Array(e - o + 1).join(n) + i : i) - } - - function zu(t) { - return t.replace(Iy, "\\$&") - } - - function Pu(t) { - return new RegExp("^(?:" + t.map(zu).join("|") + ")", "i") - } - - function Ru(t) { - for (var n = {}, e = -1, r = t.length; ++e < r;) n[t[e].toLowerCase()] = e; - return n - } - - function Lu(t, n, e) { - var r = Oy.exec(n.slice(e, e + 1)); - return r ? (t.w = +r[0], e + r[0].length) : -1 - } - - function qu(t, n, e) { - var r = Oy.exec(n.slice(e)); - return r ? (t.U = +r[0], e + r[0].length) : -1 - } - - function Uu(t, n, e) { - var r = Oy.exec(n.slice(e)); - return r ? (t.W = +r[0], e + r[0].length) : -1 - } - - function Du(t, n, e) { - var r = Oy.exec(n.slice(e, e + 4)); - return r ? (t.y = +r[0], e + r[0].length) : -1 - } - - function Ou(t, n, e) { - var r = Oy.exec(n.slice(e, e + 2)); - return r ? (t.y = +r[0] + (+r[0] > 68 ? 1900 : 2e3), e + r[0].length) : -1 - } - - function Fu(t, n, e) { - var r = /^(Z)|([+-]\d\d)(?:\:?(\d\d))?/.exec(n.slice(e, e + 6)); - return r ? (t.Z = r[1] ? 0 : -(r[2] + (r[3] || "00")), e + r[0].length) : -1 - } - - function Iu(t, n, e) { - var r = Oy.exec(n.slice(e, e + 2)); - return r ? (t.m = r[0] - 1, e + r[0].length) : -1 - } - - function Yu(t, n, e) { - var r = Oy.exec(n.slice(e, e + 2)); - return r ? (t.d = +r[0], e + r[0].length) : -1 - } - - function Bu(t, n, e) { - var r = Oy.exec(n.slice(e, e + 3)); - return r ? (t.m = 0, t.d = +r[0], e + r[0].length) : -1 - } - - function ju(t, n, e) { - var r = Oy.exec(n.slice(e, e + 2)); - return r ? (t.H = +r[0], e + r[0].length) : -1 - } - - function Hu(t, n, e) { - var r = Oy.exec(n.slice(e, e + 2)); - return r ? (t.M = +r[0], e + r[0].length) : -1 - } - - function Xu(t, n, e) { - var r = Oy.exec(n.slice(e, e + 2)); - return r ? (t.S = +r[0], e + r[0].length) : -1 - } - - function $u(t, n, e) { - var r = Oy.exec(n.slice(e, e + 3)); - return r ? (t.L = +r[0], e + r[0].length) : -1 - } - - function Vu(t, n, e) { - var r = Fy.exec(n.slice(e, e + 1)); - return r ? e + r[0].length : -1 - } - - function Wu(t, n) { - return Cu(t.getDate(), n, 2) - } - - function Zu(t, n) { - return Cu(t.getHours(), n, 2) - } - - function Gu(t, n) { - return Cu(t.getHours() % 12 || 12, n, 2) - } - - function Ju(t, n) { - return Cu(1 + $_.count(fy(t), t), n, 3) - } - - function Qu(t, n) { - return Cu(t.getMilliseconds(), n, 3) - } - - function Ku(t, n) { - return Cu(t.getMonth() + 1, n, 2) - } - - function ta(t, n) { - return Cu(t.getMinutes(), n, 2) - } - - function na(t, n) { - return Cu(t.getSeconds(), n, 2) - } - - function ea(t, n) { - return Cu(W_.count(fy(t), t), n, 2) - } - - function ra(t) { - return t.getDay() - } - - function ia(t, n) { - return Cu(Z_.count(fy(t), t), n, 2) - } - - function oa(t, n) { - return Cu(t.getFullYear() % 100, n, 2) - } - - function ua(t, n) { - return Cu(t.getFullYear() % 1e4, n, 4) - } - - function aa(t) { - var n = t.getTimezoneOffset(); - return (n > 0 ? "-" : (n *= -1, "+")) + Cu(n / 60 | 0, "0", 2) + Cu(n % 60, "0", 2) - } - - function ca(t, n) { - return Cu(t.getUTCDate(), n, 2) - } - - function sa(t, n) { - return Cu(t.getUTCHours(), n, 2) - } - - function fa(t, n) { - return Cu(t.getUTCHours() % 12 || 12, n, 2) - } - - function la(t, n) { - return Cu(1 + _y.count(Ly(t), t), n, 3) - } - - function ha(t, n) { - return Cu(t.getUTCMilliseconds(), n, 3) - } - - function pa(t, n) { - return Cu(t.getUTCMonth() + 1, n, 2) - } - - function da(t, n) { - return Cu(t.getUTCMinutes(), n, 2) - } - - function va(t, n) { - return Cu(t.getUTCSeconds(), n, 2) - } - - function _a(t, n) { - return Cu(gy.count(Ly(t), t), n, 2) - } - - function ya(t) { - return t.getUTCDay() - } - - function ga(t, n) { - return Cu(my.count(Ly(t), t), n, 2) - } - - function ma(t, n) { - return Cu(t.getUTCFullYear() % 100, n, 2) - } - - function xa(t, n) { - return Cu(t.getUTCFullYear() % 1e4, n, 4) - } - - function ba() { - return "+0000" - } - - function wa() { - return "%" - } - - function Ma(n) { - return qy = Au(n), t.timeFormat = qy.format, t.timeParse = qy.parse, t.utcFormat = qy.utcFormat, t.utcParse = qy.utcParse, qy - } - - function Ta(t) { - return new Date(t) - } - - function ka(t) { - return t instanceof Date ? +t : +new Date(+t) - } - - function Na(t, n, e, r, o, u, a, c, s) { - function f(i) { - return (a(i) < i ? v : u(i) < i ? _ : o(i) < i ? y : r(i) < i ? g : n(i) < i ? e(i) < i ? m : x : t(i) < i ? b : w)(i) - } - - function l(n, e, r, o) { - if (null == n && (n = 10), "number" == typeof n) { - var u = Math.abs(r - e) / n, - a = fs(function (t) { - return t[2] - }).right(M, u); - a === M.length ? (o = i(e / Zy, r / Zy, n), n = t) : a ? (o = (a = M[u / M[a - 1][2] < M[a][2] / u ? a - 1 : a])[1], n = a[0]) : (o = i(e, r, n), n = c) - } - return null == o ? n : n.every(o) - } - var h = au(nu, rl), - p = h.invert, - d = h.domain, - v = s(".%L"), - _ = s(":%S"), - y = s("%I:%M"), - g = s("%I %p"), - m = s("%a %d"), - x = s("%b %d"), - b = s("%B"), - w = s("%Y"), - M = [ - [a, 1, jy], - [a, 5, 5 * jy], - [a, 15, 15 * jy], - [a, 30, 30 * jy], - [u, 1, Hy], - [u, 5, 5 * Hy], - [u, 15, 15 * Hy], - [u, 30, 30 * Hy], - [o, 1, Xy], - [o, 3, 3 * Xy], - [o, 6, 6 * Xy], - [o, 12, 12 * Xy], - [r, 1, $y], - [r, 2, 2 * $y], - [e, 1, Vy], - [n, 1, Wy], - [n, 3, 3 * Wy], - [t, 1, Zy] - ]; - return h.invert = function (t) { - return new Date(p(t)) - }, h.domain = function (t) { - return arguments.length ? d(N_.call(t, ka)) : d().map(Ta) - }, h.ticks = function (t, n) { - var e, r = d(), - i = r[0], - o = r[r.length - 1], - u = o < i; - return u && (e = i, i = o, o = e), e = l(t, i, o, n), e = e ? e.range(i, o + 1) : [], u ? e.reverse() : e - }, h.tickFormat = function (t, n) { - return null == n ? f : s(n) - }, h.nice = function (t, n) { - var e = d(); - return (t = l(t, e[0], e[e.length - 1], n)) ? d(R_(e, t)) : h - }, h.copy = function () { - return uu(h, Na(t, n, e, r, o, u, a, c, s)) - }, h - } - - function Sa(t) { - var n = t.length; - return function (e) { - return t[Math.max(0, Math.min(n - 1, Math.floor(e * n)))] - } - } - - function Ea(t) { - function n(n) { - var o = (n - e) / (r - e); - return t(i ? Math.max(0, Math.min(1, o)) : o) - } - var e = 0, - r = 1, - i = !1; - return n.domain = function (t) { - return arguments.length ? (e = +t[0], r = +t[1], n) : [e, r] - }, n.clamp = function (t) { - return arguments.length ? (i = !!t, n) : i - }, n.interpolator = function (e) { - return arguments.length ? (t = e, n) : t - }, n.copy = function () { - return Ea(t).domain([e, r]).clamp(i) - }, cu(n) - } - - function Aa(t) { - return t > 1 ? 0 : t < -1 ? gg : Math.acos(t) - } - - function Ca(t) { - return t >= 1 ? mg : t <= -1 ? -mg : Math.asin(t) - } - - function za(t) { - return t.innerRadius - } - - function Pa(t) { - return t.outerRadius - } - - function Ra(t) { - return t.startAngle - } - - function La(t) { - return t.endAngle - } - - function qa(t) { - return t && t.padAngle - } - - function Ua(t, n, e, r, i, o, u, a) { - var c = e - t, - s = r - n, - f = u - i, - l = a - o, - h = (f * (n - o) - l * (t - i)) / (l * c - f * s); - return [t + h * c, n + h * s] - } - - function Da(t, n, e, r, i, o, u) { - var a = t - e, - c = n - r, - s = (u ? o : -o) / _g(a * a + c * c), - f = s * c, - l = -s * a, - h = t + f, - p = n + l, - d = e + f, - v = r + l, - _ = (h + d) / 2, - y = (p + v) / 2, - g = d - h, - m = v - p, - x = g * g + m * m, - b = i - o, - w = h * v - d * p, - M = (m < 0 ? -1 : 1) * _g(pg(0, b * b * x - w * w)), - T = (w * m - g * M) / x, - k = (-w * g - m * M) / x, - N = (w * m + g * M) / x, - S = (-w * g + m * M) / x, - E = T - _, - A = k - y, - C = N - _, - z = S - y; - return E * E + A * A > C * C + z * z && (T = N, k = S), { - cx: T, - cy: k, - x01: -f, - y01: -l, - x11: T * (i / b - 1), - y11: k * (i / b - 1) - } - } - - function Oa(t) { - this._context = t - } - - function Fa(t) { - return t[0] - } - - function Ia(t) { - return t[1] - } - - function Ya(t) { - this._curve = t - } - - function Ba(t) { - function n(n) { - return new Ya(t(n)) - } - return n._curve = t, n - } - - function ja(t) { - var n = t.curve; - return t.angle = t.x, delete t.x, t.radius = t.y, delete t.y, t.curve = function (t) { - return arguments.length ? n(Ba(t)) : n()._curve - }, t - } - - function Ha(t) { - return t.source - } - - function Xa(t) { - return t.target - } - - function $a(t) { - function n() { - var n, a = Cg.call(arguments), - c = e.apply(this, a), - s = r.apply(this, a); - if (u || (u = n = ve()), t(u, +i.apply(this, (a[0] = c, a)), +o.apply(this, a), +i.apply(this, (a[0] = s, a)), +o.apply(this, a)), n) return u = null, n + "" || null - } - var e = Ha, - r = Xa, - i = Fa, - o = Ia, - u = null; - return n.source = function (t) { - return arguments.length ? (e = t, n) : e - }, n.target = function (t) { - return arguments.length ? (r = t, n) : r - }, n.x = function (t) { - return arguments.length ? (i = "function" == typeof t ? t : sg(+t), n) : i - }, n.y = function (t) { - return arguments.length ? (o = "function" == typeof t ? t : sg(+t), n) : o - }, n.context = function (t) { - return arguments.length ? (u = null == t ? null : t, n) : u - }, n - } - - function Va(t, n, e, r, i) { - t.moveTo(n, e), t.bezierCurveTo(n = (n + r) / 2, e, n, i, r, i) - } - - function Wa(t, n, e, r, i) { - t.moveTo(n, e), t.bezierCurveTo(n, e = (e + i) / 2, r, e, r, i) - } - - function Za(t, n, e, r, i) { - var o = Ag(n, e), - u = Ag(n, e = (e + i) / 2), - a = Ag(r, e), - c = Ag(r, i); - t.moveTo(o[0], o[1]), t.bezierCurveTo(u[0], u[1], a[0], a[1], c[0], c[1]) - } - - function Ga(t, n, e) { - t._context.bezierCurveTo((2 * t._x0 + t._x1) / 3, (2 * t._y0 + t._y1) / 3, (t._x0 + 2 * t._x1) / 3, (t._y0 + 2 * t._y1) / 3, (t._x0 + 4 * t._x1 + n) / 6, (t._y0 + 4 * t._y1 + e) / 6) - } - - function Ja(t) { - this._context = t - } - - function Qa(t) { - this._context = t - } - - function Ka(t) { - this._context = t - } - - function tc(t, n) { - this._basis = new Ja(t), this._beta = n - } - - function nc(t, n, e) { - t._context.bezierCurveTo(t._x1 + t._k * (t._x2 - t._x0), t._y1 + t._k * (t._y2 - t._y0), t._x2 + t._k * (t._x1 - n), t._y2 + t._k * (t._y1 - e), t._x2, t._y2) - } - - function ec(t, n) { - this._context = t, this._k = (1 - n) / 6 - } - - function rc(t, n) { - this._context = t, this._k = (1 - n) / 6 - } - - function ic(t, n) { - this._context = t, this._k = (1 - n) / 6 - } - - function oc(t, n, e) { - var r = t._x1, - i = t._y1, - o = t._x2, - u = t._y2; - if (t._l01_a > yg) { - var a = 2 * t._l01_2a + 3 * t._l01_a * t._l12_a + t._l12_2a, - c = 3 * t._l01_a * (t._l01_a + t._l12_a); - r = (r * a - t._x0 * t._l12_2a + t._x2 * t._l01_2a) / c, i = (i * a - t._y0 * t._l12_2a + t._y2 * t._l01_2a) / c - } - if (t._l23_a > yg) { - var s = 2 * t._l23_2a + 3 * t._l23_a * t._l12_a + t._l12_2a, - f = 3 * t._l23_a * (t._l23_a + t._l12_a); - o = (o * s + t._x1 * t._l23_2a - n * t._l12_2a) / f, u = (u * s + t._y1 * t._l23_2a - e * t._l12_2a) / f - } - t._context.bezierCurveTo(r, i, o, u, t._x2, t._y2) - } - - function uc(t, n) { - this._context = t, this._alpha = n - } - - function ac(t, n) { - this._context = t, this._alpha = n - } - - function cc(t, n) { - this._context = t, this._alpha = n - } - - function sc(t) { - this._context = t - } - - function fc(t) { - return t < 0 ? -1 : 1 - } - - function lc(t, n, e) { - var r = t._x1 - t._x0, - i = n - t._x1, - o = (t._y1 - t._y0) / (r || i < 0 && -0), - u = (e - t._y1) / (i || r < 0 && -0), - a = (o * i + u * r) / (r + i); - return (fc(o) + fc(u)) * Math.min(Math.abs(o), Math.abs(u), .5 * Math.abs(a)) || 0 - } - - function hc(t, n) { - var e = t._x1 - t._x0; - return e ? (3 * (t._y1 - t._y0) / e - n) / 2 : n - } - - function pc(t, n, e) { - var r = t._x0, - i = t._y0, - o = t._x1, - u = t._y1, - a = (o - r) / 3; - t._context.bezierCurveTo(r + a, i + a * n, o - a, u - a * e, o, u) - } - - function dc(t) { - this._context = t - } - - function vc(t) { - this._context = new _c(t) - } - - function _c(t) { - this._context = t - } - - function yc(t) { - this._context = t - } - - function gc(t) { - var n, e, r = t.length - 1, - i = new Array(r), - o = new Array(r), - u = new Array(r); - for (i[0] = 0, o[0] = 2, u[0] = t[0] + 2 * t[1], n = 1; n < r - 1; ++n) i[n] = 1, o[n] = 4, u[n] = 4 * t[n] + 2 * t[n + 1]; - for (i[r - 1] = 2, o[r - 1] = 7, u[r - 1] = 8 * t[r - 1] + t[r], n = 1; n < r; ++n) e = i[n] / o[n - 1], o[n] -= e, u[n] -= e * u[n - 1]; - for (i[r - 1] = u[r - 1] / o[r - 1], n = r - 2; n >= 0; --n) i[n] = (u[n] - i[n + 1]) / o[n]; - for (o[r - 1] = (t[r] + i[r - 1]) / 2, n = 0; n < r - 1; ++n) o[n] = 2 * t[n + 1] - i[n + 1]; - return [i, o] - } - - function mc(t, n) { - this._context = t, this._t = n - } - - function xc(t, n) { - return t[n] - } - - function bc(t) { - for (var n, e = 0, r = -1, i = t.length; ++r < i;)(n = +t[r][1]) && (e += n); - return e - } - - function wc(t) { - return t[0] - } - - function Mc(t) { - return t[1] - } - - function Tc() { - this._ = null - } - - function kc(t) { - t.U = t.C = t.L = t.R = t.P = t.N = null - } - - function Nc(t, n) { - var e = n, - r = n.R, - i = e.U; - i ? i.L === e ? i.L = r : i.R = r : t._ = r, r.U = i, e.U = r, e.R = r.L, e.R && (e.R.U = e), r.L = e - } - - function Sc(t, n) { - var e = n, - r = n.L, - i = e.U; - i ? i.L === e ? i.L = r : i.R = r : t._ = r, r.U = i, e.U = r, e.L = r.R, e.L && (e.L.U = e), r.R = e - } - - function Ec(t) { - for (; t.L;) t = t.L; - return t - } - - function Ac(t, n, e, r) { - var i = [null, null], - o = lm.push(i) - 1; - return i.left = t, i.right = n, e && zc(i, t, n, e), r && zc(i, n, t, r), sm[t.index].halfedges.push(o), sm[n.index].halfedges.push(o), i - } - - function Cc(t, n, e) { - var r = [n, e]; - return r.left = t, r - } - - function zc(t, n, e, r) { - t[0] || t[1] ? t.left === e ? t[1] = r : t[0] = r : (t[0] = r, t.left = n, t.right = e) - } - - function Pc(t, n, e, r, i) { - var o, u = t[0], - a = t[1], - c = u[0], - s = u[1], - f = 0, - l = 1, - h = a[0] - c, - p = a[1] - s; - if (o = n - c, h || !(o > 0)) { - if (o /= h, h < 0) { - if (o < f) return; - o < l && (l = o) - } else if (h > 0) { - if (o > l) return; - o > f && (f = o) - } - if (o = r - c, h || !(o < 0)) { - if (o /= h, h < 0) { - if (o > l) return; - o > f && (f = o) - } else if (h > 0) { - if (o < f) return; - o < l && (l = o) - } - if (o = e - s, p || !(o > 0)) { - if (o /= p, p < 0) { - if (o < f) return; - o < l && (l = o) - } else if (p > 0) { - if (o > l) return; - o > f && (f = o) - } - if (o = i - s, p || !(o < 0)) { - if (o /= p, p < 0) { - if (o > l) return; - o > f && (f = o) - } else if (p > 0) { - if (o < f) return; - o < l && (l = o) - } - return !(f > 0 || l < 1) || (f > 0 && (t[0] = [c + f * h, s + f * p]), l < 1 && (t[1] = [c + l * h, s + l * p]), !0) - } - } - } - } - } - - function Rc(t, n, e, r, i) { - var o = t[1]; - if (o) return !0; - var u, a, c = t[0], - s = t.left, - f = t.right, - l = s[0], - h = s[1], - p = f[0], - d = f[1], - v = (l + p) / 2, - _ = (h + d) / 2; - if (d === h) { - if (v < n || v >= r) return; - if (l > p) { - if (c) { - if (c[1] >= i) return - } else c = [v, e]; - o = [v, i] - } else { - if (c) { - if (c[1] < e) return - } else c = [v, i]; - o = [v, e] - } - } else if (u = (l - p) / (d - h), a = _ - u * v, u < -1 || u > 1) - if (l > p) { - if (c) { - if (c[1] >= i) return - } else c = [(e - a) / u, e]; - o = [(i - a) / u, i] - } else { - if (c) { - if (c[1] < e) return - } else c = [(i - a) / u, i]; - o = [(e - a) / u, e] - } - else if (h < d) { - if (c) { - if (c[0] >= r) return - } else c = [n, u * n + a]; - o = [r, u * r + a] - } else { - if (c) { - if (c[0] < n) return - } else c = [r, u * r + a]; - o = [n, u * n + a] - } - return t[0] = c, t[1] = o, !0 - } - - function Lc(t, n, e, r) { - for (var i, o = lm.length; o--;) Rc(i = lm[o], t, n, e, r) && Pc(i, t, n, e, r) && (Math.abs(i[0][0] - i[1][0]) > dm || Math.abs(i[0][1] - i[1][1]) > dm) || delete lm[o] - } - - function qc(t) { - return sm[t.index] = { - site: t, - halfedges: [] - } - } - - function Uc(t, n) { - var e = t.site, - r = n.left, - i = n.right; - return e === i && (i = r, r = e), i ? Math.atan2(i[1] - r[1], i[0] - r[0]) : (e === r ? (r = n[1], i = n[0]) : (r = n[0], i = n[1]), Math.atan2(r[0] - i[0], i[1] - r[1])) - } - - function Dc(t, n) { - return n[+(n.left !== t.site)] - } - - function Oc(t, n) { - return n[+(n.left === t.site)] - } - - function Fc() { - for (var t, n, e, r, i = 0, o = sm.length; i < o; ++i) - if ((t = sm[i]) && (r = (n = t.halfedges).length)) { - var u = new Array(r), - a = new Array(r); - for (e = 0; e < r; ++e) u[e] = e, a[e] = Uc(t, lm[n[e]]); - for (u.sort(function (t, n) { - return a[n] - a[t] - }), e = 0; e < r; ++e) a[e] = n[u[e]]; - for (e = 0; e < r; ++e) n[e] = a[e] - } - } - - function Ic(t, n, e, r) { - var i, o, u, a, c, s, f, l, h, p, d, v, _ = sm.length, - y = !0; - for (i = 0; i < _; ++i) - if (o = sm[i]) { - for (u = o.site, a = (c = o.halfedges).length; a--;) lm[c[a]] || c.splice(a, 1); - for (a = 0, s = c.length; a < s;) d = (p = Oc(o, lm[c[a]]))[0], v = p[1], l = (f = Dc(o, lm[c[++a % s]]))[0], h = f[1], (Math.abs(d - l) > dm || Math.abs(v - h) > dm) && (c.splice(a, 0, lm.push(Cc(u, p, Math.abs(d - t) < dm && r - v > dm ? [t, Math.abs(l - t) < dm ? h : r] : Math.abs(v - r) < dm && e - d > dm ? [Math.abs(h - r) < dm ? l : e, r] : Math.abs(d - e) < dm && v - n > dm ? [e, Math.abs(l - e) < dm ? h : n] : Math.abs(v - n) < dm && d - t > dm ? [Math.abs(h - n) < dm ? l : t, n] : null)) - 1), ++s); - s && (y = !1) - } - if (y) { - var g, m, x, b = 1 / 0; - for (i = 0, y = null; i < _; ++i)(o = sm[i]) && (x = (g = (u = o.site)[0] - t) * g + (m = u[1] - n) * m) < b && (b = x, y = o); - if (y) { - var w = [t, n], - M = [t, r], - T = [e, r], - k = [e, n]; - y.halfedges.push(lm.push(Cc(u = y.site, w, M)) - 1, lm.push(Cc(u, M, T)) - 1, lm.push(Cc(u, T, k)) - 1, lm.push(Cc(u, k, w)) - 1) - } - } - for (i = 0; i < _; ++i)(o = sm[i]) && (o.halfedges.length || delete sm[i]) - } - - function Yc() { - kc(this), this.x = this.y = this.arc = this.site = this.cy = null - } - - function Bc(t) { - var n = t.P, - e = t.N; - if (n && e) { - var r = n.site, - i = t.site, - o = e.site; - if (r !== o) { - var u = i[0], - a = i[1], - c = r[0] - u, - s = r[1] - a, - f = o[0] - u, - l = o[1] - a, - h = 2 * (c * l - s * f); - if (!(h >= -vm)) { - var p = c * c + s * s, - d = f * f + l * l, - v = (l * p - s * d) / h, - _ = (c * d - f * p) / h, - y = hm.pop() || new Yc; - y.arc = t, y.site = i, y.x = v + u, y.y = (y.cy = _ + a) + Math.sqrt(v * v + _ * _), t.circle = y; - for (var g = null, m = fm._; m;) - if (y.y < m.y || y.y === m.y && y.x <= m.x) { - if (!m.L) { - g = m.P; - break - } - m = m.L - } else { - if (!m.R) { - g = m; - break - } - m = m.R - } - fm.insert(g, y), g || (am = y) - } - } - } - } - - function jc(t) { - var n = t.circle; - n && (n.P || (am = n.N), fm.remove(n), hm.push(n), kc(n), t.circle = null) - } - - function Hc() { - kc(this), this.edge = this.site = this.circle = null - } - - function Xc(t) { - var n = pm.pop() || new Hc; - return n.site = t, n - } - - function $c(t) { - jc(t), cm.remove(t), pm.push(t), kc(t) - } - - function Vc(t) { - var n = t.circle, - e = n.x, - r = n.cy, - i = [e, r], - o = t.P, - u = t.N, - a = [t]; - $c(t); - for (var c = o; c.circle && Math.abs(e - c.circle.x) < dm && Math.abs(r - c.circle.cy) < dm;) o = c.P, a.unshift(c), $c(c), c = o; - a.unshift(c), jc(c); - for (var s = u; s.circle && Math.abs(e - s.circle.x) < dm && Math.abs(r - s.circle.cy) < dm;) u = s.N, a.push(s), $c(s), s = u; - a.push(s), jc(s); - var f, l = a.length; - for (f = 1; f < l; ++f) s = a[f], c = a[f - 1], zc(s.edge, c.site, s.site, i); - c = a[0], (s = a[l - 1]).edge = Ac(c.site, s.site, null, i), Bc(c), Bc(s) - } - - function Wc(t) { - for (var n, e, r, i, o = t[0], u = t[1], a = cm._; a;) - if ((r = Zc(a, u) - o) > dm) a = a.L; - else { - if (!((i = o - Gc(a, u)) > dm)) { - r > -dm ? (n = a.P, e = a) : i > -dm ? (n = a, e = a.N) : n = e = a; - break - } - if (!a.R) { - n = a; - break - } - a = a.R - } - qc(t); - var c = Xc(t); - if (cm.insert(n, c), n || e) { - if (n === e) return jc(n), e = Xc(n.site), cm.insert(c, e), c.edge = e.edge = Ac(n.site, c.site), Bc(n), void Bc(e); - if (e) { - jc(n), jc(e); - var s = n.site, - f = s[0], - l = s[1], - h = t[0] - f, - p = t[1] - l, - d = e.site, - v = d[0] - f, - _ = d[1] - l, - y = 2 * (h * _ - p * v), - g = h * h + p * p, - m = v * v + _ * _, - x = [(_ * g - p * m) / y + f, (h * m - v * g) / y + l]; - zc(e.edge, s, d, x), c.edge = Ac(s, t, null, x), e.edge = Ac(t, d, null, x), Bc(n), Bc(e) - } else c.edge = Ac(n.site, c.site) - } - } - - function Zc(t, n) { - var e = t.site, - r = e[0], - i = e[1], - o = i - n; - if (!o) return r; - var u = t.P; - if (!u) return -1 / 0; - var a = (e = u.site)[0], - c = e[1], - s = c - n; - if (!s) return a; - var f = a - r, - l = 1 / o - 1 / s, - h = f / s; - return l ? (-h + Math.sqrt(h * h - 2 * l * (f * f / (-2 * s) - c + s / 2 + i - o / 2))) / l + r : (r + a) / 2 - } - - function Gc(t, n) { - var e = t.N; - if (e) return Zc(e, n); - var r = t.site; - return r[1] === n ? r[0] : 1 / 0 - } - - function Jc(t, n, e) { - return (t[0] - e[0]) * (n[1] - t[1]) - (t[0] - n[0]) * (e[1] - t[1]) - } - - function Qc(t, n) { - return n[1] - t[1] || n[0] - t[0] - } - - function Kc(t, n) { - var e, r, i, o = t.sort(Qc).pop(); - for (lm = [], sm = new Array(t.length), cm = new Tc, fm = new Tc;;) - if (i = am, o && (!i || o[1] < i.y || o[1] === i.y && o[0] < i.x)) o[0] === e && o[1] === r || (Wc(o), e = o[0], r = o[1]), o = t.pop(); - else { - if (!i) break; - Vc(i.arc) - } - if (Fc(), n) { - var u = +n[0][0], - a = +n[0][1], - c = +n[1][0], - s = +n[1][1]; - Lc(u, a, c, s), Ic(u, a, c, s) - } - this.edges = lm, this.cells = sm, cm = fm = lm = sm = null - } - - function ts(t, n, e) { - this.target = t, this.type = n, this.transform = e - } - - function ns(t, n, e) { - this.k = t, this.x = n, this.y = e - } - - function es(t) { - return t.__zoom || ym - } - - function rs() { - t.event.stopImmediatePropagation() - } - - function is() { - return !t.event.button - } - - function os() { - var t, n, e = this; - return e instanceof SVGElement ? (t = (e = e.ownerSVGElement || e).width.baseVal.value, n = e.height.baseVal.value) : (t = e.clientWidth, n = e.clientHeight), [ - [0, 0], - [t, n] - ] - } - - function us() { - return this.__zoom || ym - } - - function as() { - return -t.event.deltaY * (t.event.deltaMode ? 120 : 1) / 500 - } - - function cs() { - return "ontouchstart" in this - } - var ss = function (t, n) { - return t < n ? -1 : t > n ? 1 : t >= n ? 0 : NaN - }, - fs = function (t) { - return 1 === t.length && (t = n(t)), { - left: function (n, e, r, i) { - for (null == r && (r = 0), null == i && (i = n.length); r < i;) { - var o = r + i >>> 1; - t(n[o], e) < 0 ? r = o + 1 : i = o - } - return r - }, - right: function (n, e, r, i) { - for (null == r && (r = 0), null == i && (i = n.length); r < i;) { - var o = r + i >>> 1; - t(n[o], e) > 0 ? i = o : r = o + 1 - } - return r - } - } - }, - ls = fs(ss), - hs = ls.right, - ps = ls.left, - ds = function (t) { - return null === t ? NaN : +t - }, - vs = function (t, n) { - var e, r, i = t.length, - o = 0, - u = -1, - a = 0, - c = 0; - if (null == n) - for (; ++u < i;) isNaN(e = ds(t[u])) || (c += (r = e - a) * (e - (a += r / ++o))); - else - for (; ++u < i;) isNaN(e = ds(n(t[u], u, t))) || (c += (r = e - a) * (e - (a += r / ++o))); - if (o > 1) return c / (o - 1) - }, - _s = function (t, n) { - var e = vs(t, n); - return e ? Math.sqrt(e) : e - }, - ys = function (t, n) { - var e, r, i, o = t.length, - u = -1; - if (null == n) { - for (; ++u < o;) - if (null != (e = t[u]) && e >= e) - for (r = i = e; ++u < o;) null != (e = t[u]) && (r > e && (r = e), i < e && (i = e)) - } else - for (; ++u < o;) - if (null != (e = n(t[u], u, t)) && e >= e) - for (r = i = e; ++u < o;) null != (e = n(t[u], u, t)) && (r > e && (r = e), i < e && (i = e)); - return [r, i] - }, - gs = Array.prototype, - ms = gs.slice, - xs = gs.map, - bs = function (t) { - return function () { - return t - } - }, - ws = function (t) { - return t - }, - Ms = function (t, n, e) { - t = +t, n = +n, e = (i = arguments.length) < 2 ? (n = t, t = 0, 1) : i < 3 ? 1 : +e; - for (var r = -1, i = 0 | Math.max(0, Math.ceil((n - t) / e)), o = new Array(i); ++r < i;) o[r] = t + r * e; - return o - }, - Ts = Math.sqrt(50), - ks = Math.sqrt(10), - Ns = Math.sqrt(2), - Ss = function (t, n, e) { - var i, o, u, a = n < t, - c = -1; - if (a && (i = t, t = n, n = i), 0 === (u = r(t, n, e)) || !isFinite(u)) return []; - if (u > 0) - for (t = Math.ceil(t / u), n = Math.floor(n / u), o = new Array(i = Math.ceil(n - t + 1)); ++c < i;) o[c] = (t + c) * u; - else - for (t = Math.floor(t * u), n = Math.ceil(n * u), o = new Array(i = Math.ceil(t - n + 1)); ++c < i;) o[c] = (t - c) / u; - return a && o.reverse(), o - }, - Es = function (t) { - return Math.ceil(Math.log(t.length) / Math.LN2) + 1 - }, - As = function (t, n, e) { - if (null == e && (e = ds), r = t.length) { - if ((n = +n) <= 0 || r < 2) return +e(t[0], 0, t); - if (n >= 1) return +e(t[r - 1], r - 1, t); - var r, i = (r - 1) * n, - o = Math.floor(i), - u = +e(t[o], o, t); - return u + (+e(t[o + 1], o + 1, t) - u) * (i - o) - } - }, - Cs = function (t) { - for (var n, e, r, i = t.length, o = -1, u = 0; ++o < i;) u += t[o].length; - for (e = new Array(u); --i >= 0;) - for (n = (r = t[i]).length; --n >= 0;) e[--u] = r[n]; - return e - }, - zs = function (t, n) { - var e, r, i = t.length, - o = -1; - if (null == n) { - for (; ++o < i;) - if (null != (e = t[o]) && e >= e) - for (r = e; ++o < i;) null != (e = t[o]) && r > e && (r = e) - } else - for (; ++o < i;) - if (null != (e = n(t[o], o, t)) && e >= e) - for (r = e; ++o < i;) null != (e = n(t[o], o, t)) && r > e && (r = e); - return r - }, - Ps = function (t) { - if (!(i = t.length)) return []; - for (var n = -1, e = zs(t, o), r = new Array(e); ++n < e;) - for (var i, u = -1, a = r[n] = new Array(i); ++u < i;) a[u] = t[u][n]; - return r - }, - Rs = Array.prototype.slice, - Ls = function (t) { - return t - }, - qs = 1, - Us = 2, - Ds = 3, - Os = 4, - Fs = 1e-6, - Is = { - value: function () {} - }; - p.prototype = h.prototype = { - constructor: p, - on: function (t, n) { - var e, r = this._, - i = d(t + "", r), - o = -1, - u = i.length; { - if (!(arguments.length < 2)) { - if (null != n && "function" != typeof n) throw new Error("invalid callback: " + n); - for (; ++o < u;) - if (e = (t = i[o]).type) r[e] = _(r[e], t.name, n); - else if (null == n) - for (e in r) r[e] = _(r[e], t.name, null); - return this - } - for (; ++o < u;) - if ((e = (t = i[o]).type) && (e = v(r[e], t.name))) return e - } - }, - copy: function () { - var t = {}, - n = this._; - for (var e in n) t[e] = n[e].slice(); - return new p(t) - }, - call: function (t, n) { - if ((e = arguments.length - 2) > 0) - for (var e, r, i = new Array(e), o = 0; o < e; ++o) i[o] = arguments[o + 2]; - if (!this._.hasOwnProperty(t)) throw new Error("unknown type: " + t); - for (o = 0, e = (r = this._[t]).length; o < e; ++o) r[o].value.apply(n, i) - }, - apply: function (t, n, e) { - if (!this._.hasOwnProperty(t)) throw new Error("unknown type: " + t); - for (var r = this._[t], i = 0, o = r.length; i < o; ++i) r[i].value.apply(n, e) - } - }; - var Ys = "http://www.w3.org/1999/xhtml", - Bs = { - svg: "http://www.w3.org/2000/svg", - xhtml: Ys, - xlink: "http://www.w3.org/1999/xlink", - xml: "http://www.w3.org/XML/1998/namespace", - xmlns: "http://www.w3.org/2000/xmlns/" - }, - js = function (t) { - var n = t += "", - e = n.indexOf(":"); - return e >= 0 && "xmlns" !== (n = t.slice(0, e)) && (t = t.slice(e + 1)), Bs.hasOwnProperty(n) ? { - space: Bs[n], - local: t - } : t - }, - Hs = function (t) { - var n = js(t); - return (n.local ? g : y)(n) - }, - Xs = 0; - x.prototype = m.prototype = { - constructor: x, - get: function (t) { - for (var n = this._; !(n in t);) - if (!(t = t.parentNode)) return; - return t[n] - }, - set: function (t, n) { - return t[this._] = n - }, - remove: function (t) { - return this._ in t && delete t[this._] - }, - toString: function () { - return this._ - } - }; - var $s = function (t) { - return function () { - return this.matches(t) - } - }; - if ("undefined" != typeof document) { - var Vs = document.documentElement; - if (!Vs.matches) { - var Ws = Vs.webkitMatchesSelector || Vs.msMatchesSelector || Vs.mozMatchesSelector || Vs.oMatchesSelector; - $s = function (t) { - return function () { - return Ws.call(this, t) - } - } - } - } - var Zs = $s, - Gs = {}; - t.event = null, "undefined" != typeof document && ("onmouseenter" in document.documentElement || (Gs = { - mouseenter: "mouseover", - mouseleave: "mouseout" - })); - var Js = function () { - for (var n, e = t.event; n = e.sourceEvent;) e = n; - return e - }, - Qs = function (t, n) { - var e = t.ownerSVGElement || t; - if (e.createSVGPoint) { - var r = e.createSVGPoint(); - return r.x = n.clientX, r.y = n.clientY, r = r.matrixTransform(t.getScreenCTM().inverse()), [r.x, r.y] - } - var i = t.getBoundingClientRect(); - return [n.clientX - i.left - t.clientLeft, n.clientY - i.top - t.clientTop] - }, - Ks = function (t) { - var n = Js(); - return n.changedTouches && (n = n.changedTouches[0]), Qs(t, n) - }, - tf = function (t) { - return null == t ? S : function () { - return this.querySelector(t) - } - }, - nf = function (t) { - return null == t ? E : function () { - return this.querySelectorAll(t) - } - }, - ef = function (t) { - return new Array(t.length) - }; - A.prototype = { - constructor: A, - appendChild: function (t) { - return this._parent.insertBefore(t, this._next) - }, - insertBefore: function (t, n) { - return this._parent.insertBefore(t, n) - }, - querySelector: function (t) { - return this._parent.querySelector(t) - }, - querySelectorAll: function (t) { - return this._parent.querySelectorAll(t) - } - }; - var rf = function (t) { - return function () { - return t - } - }, - of = "$", - uf = function (t) { - return t.ownerDocument && t.ownerDocument.defaultView || t.document && t || t.defaultView - }; - W.prototype = { - add: function (t) { - this._names.indexOf(t) < 0 && (this._names.push(t), this._node.setAttribute("class", this._names.join(" "))) - }, - remove: function (t) { - var n = this._names.indexOf(t); - n >= 0 && (this._names.splice(n, 1), this._node.setAttribute("class", this._names.join(" "))) - }, - contains: function (t) { - return this._names.indexOf(t) >= 0 - } - }; - var af = [null]; - pt.prototype = dt.prototype = { - constructor: pt, - select: function (t) { - "function" != typeof t && (t = tf(t)); - for (var n = this._groups, e = n.length, r = new Array(e), i = 0; i < e; ++i) - for (var o, u, a = n[i], c = a.length, s = r[i] = new Array(c), f = 0; f < c; ++f)(o = a[f]) && (u = t.call(o, o.__data__, f, a)) && ("__data__" in o && (u.__data__ = o.__data__), s[f] = u); - return new pt(r, this._parents) - }, - selectAll: function (t) { - "function" != typeof t && (t = nf(t)); - for (var n = this._groups, e = n.length, r = [], i = [], o = 0; o < e; ++o) - for (var u, a = n[o], c = a.length, s = 0; s < c; ++s)(u = a[s]) && (r.push(t.call(u, u.__data__, s, a)), i.push(u)); - return new pt(r, i) - }, - filter: function (t) { - "function" != typeof t && (t = Zs(t)); - for (var n = this._groups, e = n.length, r = new Array(e), i = 0; i < e; ++i) - for (var o, u = n[i], a = u.length, c = r[i] = [], s = 0; s < a; ++s)(o = u[s]) && t.call(o, o.__data__, s, u) && c.push(o); - return new pt(r, this._parents) - }, - data: function (t, n) { - if (!t) return p = new Array(this.size()), s = -1, this.each(function (t) { - p[++s] = t - }), p; - var e = n ? z : C, - r = this._parents, - i = this._groups; - "function" != typeof t && (t = rf(t)); - for (var o = i.length, u = new Array(o), a = new Array(o), c = new Array(o), s = 0; s < o; ++s) { - var f = r[s], - l = i[s], - h = l.length, - p = t.call(f, f && f.__data__, s, r), - d = p.length, - v = a[s] = new Array(d), - _ = u[s] = new Array(d); - e(f, l, v, _, c[s] = new Array(h), p, n); - for (var y, g, m = 0, x = 0; m < d; ++m) - if (y = v[m]) { - for (m >= x && (x = m + 1); !(g = _[x]) && ++x < d;); - y._next = g || null - } - } - return u = new pt(u, r), u._enter = a, u._exit = c, u - }, - enter: function () { - return new pt(this._enter || this._groups.map(ef), this._parents) - }, - exit: function () { - return new pt(this._exit || this._groups.map(ef), this._parents) - }, - merge: function (t) { - for (var n = this._groups, e = t._groups, r = n.length, i = e.length, o = Math.min(r, i), u = new Array(r), a = 0; a < o; ++a) - for (var c, s = n[a], f = e[a], l = s.length, h = u[a] = new Array(l), p = 0; p < l; ++p)(c = s[p] || f[p]) && (h[p] = c); - for (; a < r; ++a) u[a] = n[a]; - return new pt(u, this._parents) - }, - order: function () { - for (var t = this._groups, n = -1, e = t.length; ++n < e;) - for (var r, i = t[n], o = i.length - 1, u = i[o]; --o >= 0;)(r = i[o]) && (u && u !== r.nextSibling && u.parentNode.insertBefore(r, u), u = r); - return this - }, - sort: function (t) { - t || (t = P); - for (var n = this._groups, e = n.length, r = new Array(e), i = 0; i < e; ++i) { - for (var o, u = n[i], a = u.length, c = r[i] = new Array(a), s = 0; s < a; ++s)(o = u[s]) && (c[s] = o); - c.sort(function (n, e) { - return n && e ? t(n.__data__, e.__data__) : !n - !e - }) - } - return new pt(r, this._parents).order() - }, - call: function () { - var t = arguments[0]; - return arguments[0] = this, t.apply(null, arguments), this - }, - nodes: function () { - var t = new Array(this.size()), - n = -1; - return this.each(function () { - t[++n] = this - }), t - }, - node: function () { - for (var t = this._groups, n = 0, e = t.length; n < e; ++n) - for (var r = t[n], i = 0, o = r.length; i < o; ++i) { - var u = r[i]; - if (u) return u - } - return null - }, - size: function () { - var t = 0; - return this.each(function () { - ++t - }), t - }, - empty: function () { - return !this.node() - }, - each: function (t) { - for (var n = this._groups, e = 0, r = n.length; e < r; ++e) - for (var i, o = n[e], u = 0, a = o.length; u < a; ++u)(i = o[u]) && t.call(i, i.__data__, u, o); - return this - }, - attr: function (t, n) { - var e = js(t); - if (arguments.length < 2) { - var r = this.node(); - return e.local ? r.getAttributeNS(e.space, e.local) : r.getAttribute(e) - } - return this.each((null == n ? e.local ? L : R : "function" == typeof n ? e.local ? O : D : e.local ? U : q)(e, n)) - }, - style: function (t, n, e) { - return arguments.length > 1 ? this.each((null == n ? F : "function" == typeof n ? Y : I)(t, n, null == e ? "" : e)) : B(this.node(), t) - }, - property: function (t, n) { - return arguments.length > 1 ? this.each((null == n ? j : "function" == typeof n ? X : H)(t, n)) : this.node()[t] - }, - classed: function (t, n) { - var e = $(t + ""); - if (arguments.length < 2) { - for (var r = V(this.node()), i = -1, o = e.length; ++i < o;) - if (!r.contains(e[i])) return !1; - return !0 - } - return this.each(("function" == typeof n ? K : n ? J : Q)(e, n)) - }, - text: function (t) { - return arguments.length ? this.each(null == t ? tt : ("function" == typeof t ? et : nt)(t)) : this.node().textContent - }, - html: function (t) { - return arguments.length ? this.each(null == t ? rt : ("function" == typeof t ? ot : it)(t)) : this.node().innerHTML - }, - raise: function () { - return this.each(ut) - }, - lower: function () { - return this.each(at) - }, - append: function (t) { - var n = "function" == typeof t ? t : Hs(t); - return this.select(function () { - return this.appendChild(n.apply(this, arguments)) - }) - }, - insert: function (t, n) { - var e = "function" == typeof t ? t : Hs(t), - r = null == n ? ct : "function" == typeof n ? n : tf(n); - return this.select(function () { - return this.insertBefore(e.apply(this, arguments), r.apply(this, arguments) || null) - }) - }, - remove: function () { - return this.each(st) - }, - datum: function (t) { - return arguments.length ? this.property("__data__", t) : this.node().__data__ - }, - on: function (t, n, e) { - var r, i, o = M(t + ""), - u = o.length; { - if (!(arguments.length < 2)) { - for (a = n ? k : T, null == e && (e = !1), r = 0; r < u; ++r) this.each(a(o[r], n, e)); - return this - } - var a = this.node().__on; - if (a) - for (var c, s = 0, f = a.length; s < f; ++s) - for (r = 0, c = a[s]; r < u; ++r) - if ((i = o[r]).type === c.type && i.name === c.name) return c.value - } - }, - dispatch: function (t, n) { - return this.each(("function" == typeof n ? ht : lt)(t, n)) - } - }; - var cf = function (t) { - return "string" == typeof t ? new pt([ - [document.querySelector(t)] - ], [document.documentElement]) : new pt([ - [t] - ], af) - }, - sf = function (t, n, e) { - arguments.length < 3 && (e = n, n = Js().changedTouches); - for (var r, i = 0, o = n ? n.length : 0; i < o; ++i) - if ((r = n[i]).identifier === e) return Qs(t, r); - return null - }, - ff = function () { - t.event.preventDefault(), t.event.stopImmediatePropagation() - }, - lf = function (t) { - var n = t.document.documentElement, - e = cf(t).on("dragstart.drag", ff, !0); - "onselectstart" in n ? e.on("selectstart.drag", ff, !0) : (n.__noselect = n.style.MozUserSelect, n.style.MozUserSelect = "none") - }, - hf = function (t) { - return function () { - return t - } - }; - yt.prototype.on = function () { - var t = this._.on.apply(this._, arguments); - return t === this._ ? this : t - }; - var pf = function (t, n, e) { - t.prototype = n.prototype = e, e.constructor = t - }, - df = "\\s*([+-]?\\d+)\\s*", - vf = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)\\s*", - _f = "\\s*([+-]?\\d*\\.?\\d+(?:[eE][+-]?\\d+)?)%\\s*", - yf = /^#([0-9a-f]{3})$/, - gf = /^#([0-9a-f]{6})$/, - mf = new RegExp("^rgb\\(" + [df, df, df] + "\\)$"), - xf = new RegExp("^rgb\\(" + [_f, _f, _f] + "\\)$"), - bf = new RegExp("^rgba\\(" + [df, df, df, vf] + "\\)$"), - wf = new RegExp("^rgba\\(" + [_f, _f, _f, vf] + "\\)$"), - Mf = new RegExp("^hsl\\(" + [vf, _f, _f] + "\\)$"), - Tf = new RegExp("^hsla\\(" + [vf, _f, _f, vf] + "\\)$"), - kf = { - aliceblue: 15792383, - antiquewhite: 16444375, - aqua: 65535, - aquamarine: 8388564, - azure: 15794175, - beige: 16119260, - bisque: 16770244, - black: 0, - blanchedalmond: 16772045, - blue: 255, - blueviolet: 9055202, - brown: 10824234, - burlywood: 14596231, - cadetblue: 6266528, - chartreuse: 8388352, - chocolate: 13789470, - coral: 16744272, - cornflowerblue: 6591981, - cornsilk: 16775388, - crimson: 14423100, - cyan: 65535, - darkblue: 139, - darkcyan: 35723, - darkgoldenrod: 12092939, - darkgray: 11119017, - darkgreen: 25600, - darkgrey: 11119017, - darkkhaki: 12433259, - darkmagenta: 9109643, - darkolivegreen: 5597999, - darkorange: 16747520, - darkorchid: 10040012, - darkred: 9109504, - darksalmon: 15308410, - darkseagreen: 9419919, - darkslateblue: 4734347, - darkslategray: 3100495, - darkslategrey: 3100495, - darkturquoise: 52945, - darkviolet: 9699539, - deeppink: 16716947, - deepskyblue: 49151, - dimgray: 6908265, - dimgrey: 6908265, - dodgerblue: 2003199, - firebrick: 11674146, - floralwhite: 16775920, - forestgreen: 2263842, - fuchsia: 16711935, - gainsboro: 14474460, - ghostwhite: 16316671, - gold: 16766720, - goldenrod: 14329120, - gray: 8421504, - green: 32768, - greenyellow: 11403055, - grey: 8421504, - honeydew: 15794160, - hotpink: 16738740, - indianred: 13458524, - indigo: 4915330, - ivory: 16777200, - khaki: 15787660, - lavender: 15132410, - lavenderblush: 16773365, - lawngreen: 8190976, - lemonchiffon: 16775885, - lightblue: 11393254, - lightcoral: 15761536, - lightcyan: 14745599, - lightgoldenrodyellow: 16448210, - lightgray: 13882323, - lightgreen: 9498256, - lightgrey: 13882323, - lightpink: 16758465, - lightsalmon: 16752762, - lightseagreen: 2142890, - lightskyblue: 8900346, - lightslategray: 7833753, - lightslategrey: 7833753, - lightsteelblue: 11584734, - lightyellow: 16777184, - lime: 65280, - limegreen: 3329330, - linen: 16445670, - magenta: 16711935, - maroon: 8388608, - mediumaquamarine: 6737322, - mediumblue: 205, - mediumorchid: 12211667, - mediumpurple: 9662683, - mediumseagreen: 3978097, - mediumslateblue: 8087790, - mediumspringgreen: 64154, - mediumturquoise: 4772300, - mediumvioletred: 13047173, - midnightblue: 1644912, - mintcream: 16121850, - mistyrose: 16770273, - moccasin: 16770229, - navajowhite: 16768685, - navy: 128, - oldlace: 16643558, - olive: 8421376, - olivedrab: 7048739, - orange: 16753920, - orangered: 16729344, - orchid: 14315734, - palegoldenrod: 15657130, - palegreen: 10025880, - paleturquoise: 11529966, - palevioletred: 14381203, - papayawhip: 16773077, - peachpuff: 16767673, - peru: 13468991, - pink: 16761035, - plum: 14524637, - powderblue: 11591910, - purple: 8388736, - rebeccapurple: 6697881, - red: 16711680, - rosybrown: 12357519, - royalblue: 4286945, - saddlebrown: 9127187, - salmon: 16416882, - sandybrown: 16032864, - seagreen: 3050327, - seashell: 16774638, - sienna: 10506797, - silver: 12632256, - skyblue: 8900331, - slateblue: 6970061, - slategray: 7372944, - slategrey: 7372944, - snow: 16775930, - springgreen: 65407, - steelblue: 4620980, - tan: 13808780, - teal: 32896, - thistle: 14204888, - tomato: 16737095, - turquoise: 4251856, - violet: 15631086, - wheat: 16113331, - white: 16777215, - whitesmoke: 16119285, - yellow: 16776960, - yellowgreen: 10145074 - }; - pf(Mt, Tt, { - displayable: function () { - return this.rgb().displayable() - }, - toString: function () { - return this.rgb() + "" - } - }), pf(At, Et, wt(Mt, { - brighter: function (t) { - return t = null == t ? 1 / .7 : Math.pow(1 / .7, t), new At(this.r * t, this.g * t, this.b * t, this.opacity) - }, - darker: function (t) { - return t = null == t ? .7 : Math.pow(.7, t), new At(this.r * t, this.g * t, this.b * t, this.opacity) - }, - rgb: function () { - return this - }, - displayable: function () { - return 0 <= this.r && this.r <= 255 && 0 <= this.g && this.g <= 255 && 0 <= this.b && this.b <= 255 && 0 <= this.opacity && this.opacity <= 1 - }, - toString: function () { - var t = this.opacity; - return (1 === (t = isNaN(t) ? 1 : Math.max(0, Math.min(1, t))) ? "rgb(" : "rgba(") + Math.max(0, Math.min(255, Math.round(this.r) || 0)) + ", " + Math.max(0, Math.min(255, Math.round(this.g) || 0)) + ", " + Math.max(0, Math.min(255, Math.round(this.b) || 0)) + (1 === t ? ")" : ", " + t + ")") - } - })), pf(Rt, Pt, wt(Mt, { - brighter: function (t) { - return t = null == t ? 1 / .7 : Math.pow(1 / .7, t), new Rt(this.h, this.s, this.l * t, this.opacity) - }, - darker: function (t) { - return t = null == t ? .7 : Math.pow(.7, t), new Rt(this.h, this.s, this.l * t, this.opacity) - }, - rgb: function () { - var t = this.h % 360 + 360 * (this.h < 0), - n = isNaN(t) || isNaN(this.s) ? 0 : this.s, - e = this.l, - r = e + (e < .5 ? e : 1 - e) * n, - i = 2 * e - r; - return new At(Lt(t >= 240 ? t - 240 : t + 120, i, r), Lt(t, i, r), Lt(t < 120 ? t + 240 : t - 120, i, r), this.opacity) - }, - displayable: function () { - return (0 <= this.s && this.s <= 1 || isNaN(this.s)) && 0 <= this.l && this.l <= 1 && 0 <= this.opacity && this.opacity <= 1 - } - })); - var Nf = Math.PI / 180, - Sf = 180 / Math.PI, - Ef = .95047, - Af = 1, - Cf = 1.08883, - zf = 4 / 29, - Pf = 6 / 29, - Rf = 3 * Pf * Pf, - Lf = Pf * Pf * Pf; - pf(Dt, Ut, wt(Mt, { - brighter: function (t) { - return new Dt(this.l + 18 * (null == t ? 1 : t), this.a, this.b, this.opacity) - }, - darker: function (t) { - return new Dt(this.l - 18 * (null == t ? 1 : t), this.a, this.b, this.opacity) - }, - rgb: function () { - var t = (this.l + 16) / 116, - n = isNaN(this.a) ? t : t + this.a / 500, - e = isNaN(this.b) ? t : t - this.b / 200; - return t = Af * Ft(t), n = Ef * Ft(n), e = Cf * Ft(e), new At(It(3.2404542 * n - 1.5371385 * t - .4985314 * e), It(-.969266 * n + 1.8760108 * t + .041556 * e), It(.0556434 * n - .2040259 * t + 1.0572252 * e), this.opacity) - } - })), pf(Ht, jt, wt(Mt, { - brighter: function (t) { - return new Ht(this.h, this.c, this.l + 18 * (null == t ? 1 : t), this.opacity) - }, - darker: function (t) { - return new Ht(this.h, this.c, this.l - 18 * (null == t ? 1 : t), this.opacity) - }, - rgb: function () { - return qt(this).rgb() - } - })); - var qf = -.14861, - Uf = 1.78277, - Df = -.29227, - Of = -.90649, - Ff = 1.97294, - If = Ff * Of, - Yf = Ff * Uf, - Bf = Uf * Df - Of * qf; - pf(Vt, $t, wt(Mt, { - brighter: function (t) { - return t = null == t ? 1 / .7 : Math.pow(1 / .7, t), new Vt(this.h, this.s, this.l * t, this.opacity) - }, - darker: function (t) { - return t = null == t ? .7 : Math.pow(.7, t), new Vt(this.h, this.s, this.l * t, this.opacity) - }, - rgb: function () { - var t = isNaN(this.h) ? 0 : (this.h + 120) * Nf, - n = +this.l, - e = isNaN(this.s) ? 0 : this.s * n * (1 - n), - r = Math.cos(t), - i = Math.sin(t); - return new At(255 * (n + e * (qf * r + Uf * i)), 255 * (n + e * (Df * r + Of * i)), 255 * (n + e * (Ff * r)), this.opacity) - } - })); - var jf, Hf, Xf, $f, Vf, Wf, Zf = function (t) { - var n = t.length - 1; - return function (e) { - var r = e <= 0 ? e = 0 : e >= 1 ? (e = 1, n - 1) : Math.floor(e * n), - i = t[r], - o = t[r + 1], - u = r > 0 ? t[r - 1] : 2 * i - o, - a = r < n - 1 ? t[r + 2] : 2 * o - i; - return Wt((e - r / n) * n, u, i, o, a) - } - }, - Gf = function (t) { - var n = t.length; - return function (e) { - var r = Math.floor(((e %= 1) < 0 ? ++e : e) * n), - i = t[(r + n - 1) % n], - o = t[r % n], - u = t[(r + 1) % n], - a = t[(r + 2) % n]; - return Wt((e - r / n) * n, i, o, u, a) - } - }, - Jf = function (t) { - return function () { - return t - } - }, - Qf = function t(n) { - function e(t, n) { - var e = r((t = Et(t)).r, (n = Et(n)).r), - i = r(t.g, n.g), - o = r(t.b, n.b), - u = Kt(t.opacity, n.opacity); - return function (n) { - return t.r = e(n), t.g = i(n), t.b = o(n), t.opacity = u(n), t + "" - } - } - var r = Qt(n); - return e.gamma = t, e - }(1), - Kf = tn(Zf), - tl = tn(Gf), - nl = function (t, n) { - var e, r = n ? n.length : 0, - i = t ? Math.min(r, t.length) : 0, - o = new Array(r), - u = new Array(r); - for (e = 0; e < i; ++e) o[e] = cl(t[e], n[e]); - for (; e < r; ++e) u[e] = n[e]; - return function (t) { - for (e = 0; e < i; ++e) u[e] = o[e](t); - return u - } - }, - el = function (t, n) { - var e = new Date; - return t = +t, n -= t, - function (r) { - return e.setTime(t + n * r), e - } - }, - rl = function (t, n) { - return t = +t, n -= t, - function (e) { - return t + n * e - } - }, - il = function (t, n) { - var e, r = {}, - i = {}; - null !== t && "object" == typeof t || (t = {}), null !== n && "object" == typeof n || (n = {}); - for (e in n) e in t ? r[e] = cl(t[e], n[e]) : i[e] = n[e]; - return function (t) { - for (e in r) i[e] = r[e](t); - return i - } - }, - ol = /[-+]?(?:\d+\.?\d*|\.?\d+)(?:[eE][-+]?\d+)?/g, - ul = new RegExp(ol.source, "g"), - al = function (t, n) { - var e, r, i, o = ol.lastIndex = ul.lastIndex = 0, - u = -1, - a = [], - c = []; - for (t += "", n += ""; - (e = ol.exec(t)) && (r = ul.exec(n));)(i = r.index) > o && (i = n.slice(o, i), a[u] ? a[u] += i : a[++u] = i), (e = e[0]) === (r = r[0]) ? a[u] ? a[u] += r : a[++u] = r : (a[++u] = null, c.push({ - i: u, - x: rl(e, r) - })), o = ul.lastIndex; - return o < n.length && (i = n.slice(o), a[u] ? a[u] += i : a[++u] = i), a.length < 2 ? c[0] ? en(c[0].x) : nn(n) : (n = c.length, function (t) { - for (var e, r = 0; r < n; ++r) a[(e = c[r]).i] = e.x(t); - return a.join("") - }) - }, - cl = function (t, n) { - var e, r = typeof n; - return null == n || "boolean" === r ? Jf(n) : ("number" === r ? rl : "string" === r ? (e = Tt(n)) ? (n = e, Qf) : al : n instanceof Tt ? Qf : n instanceof Date ? el : Array.isArray(n) ? nl : "function" != typeof n.valueOf && "function" != typeof n.toString || isNaN(n) ? il : rl)(t, n) - }, - sl = function (t, n) { - return t = +t, n -= t, - function (e) { - return Math.round(t + n * e) - } - }, - fl = 180 / Math.PI, - ll = { - translateX: 0, - translateY: 0, - rotate: 0, - skewX: 0, - scaleX: 1, - scaleY: 1 - }, - hl = function (t, n, e, r, i, o) { - var u, a, c; - return (u = Math.sqrt(t * t + n * n)) && (t /= u, n /= u), (c = t * e + n * r) && (e -= t * c, r -= n * c), (a = Math.sqrt(e * e + r * r)) && (e /= a, r /= a, c /= a), t * r < n * e && (t = -t, n = -n, c = -c, u = -u), { - translateX: i, - translateY: o, - rotate: Math.atan2(n, t) * fl, - skewX: Math.atan(c) * fl, - scaleX: u, - scaleY: a - } - }, - pl = rn(function (t) { - return "none" === t ? ll : (jf || (jf = document.createElement("DIV"), Hf = document.documentElement, Xf = document.defaultView), jf.style.transform = t, t = Xf.getComputedStyle(Hf.appendChild(jf), null).getPropertyValue("transform"), Hf.removeChild(jf), t = t.slice(7, -1).split(","), hl(+t[0], +t[1], +t[2], +t[3], +t[4], +t[5])) - }, "px, ", "px)", "deg)"), - dl = rn(function (t) { - return null == t ? ll : ($f || ($f = document.createElementNS("http://www.w3.org/2000/svg", "g")), $f.setAttribute("transform", t), (t = $f.transform.baseVal.consolidate()) ? (t = t.matrix, hl(t.a, t.b, t.c, t.d, t.e, t.f)) : ll) - }, ", ", ")", ")"), - vl = Math.SQRT2, - _l = function (t, n) { - var e, r, i = t[0], - o = t[1], - u = t[2], - a = n[0], - c = n[1], - s = n[2], - f = a - i, - l = c - o, - h = f * f + l * l; - if (h < 1e-12) r = Math.log(s / u) / vl, e = function (t) { - return [i + t * f, o + t * l, u * Math.exp(vl * t * r)] - }; - else { - var p = Math.sqrt(h), - d = (s * s - u * u + 4 * h) / (2 * u * 2 * p), - v = (s * s - u * u - 4 * h) / (2 * s * 2 * p), - _ = Math.log(Math.sqrt(d * d + 1) - d), - y = Math.log(Math.sqrt(v * v + 1) - v); - r = (y - _) / vl, e = function (t) { - var n = t * r, - e = on(_), - a = u / (2 * p) * (e * an(vl * n + _) - un(_)); - return [i + a * f, o + a * l, u * e / on(vl * n + _)] - } - } - return e.duration = 1e3 * r, e - }, - yl = cn(Jt), - gl = cn(Kt), - ml = sn(Jt), - xl = sn(Kt), - bl = fn(Jt), - wl = fn(Kt), - Ml = 0, - Tl = 0, - kl = 0, - Nl = 1e3, - Sl = 0, - El = 0, - Al = 0, - Cl = "object" == typeof performance && performance.now ? performance : Date, - zl = "object" == typeof window && window.requestAnimationFrame ? window.requestAnimationFrame.bind(window) : function (t) { - setTimeout(t, 17) - }; - pn.prototype = dn.prototype = { - constructor: pn, - restart: function (t, n, e) { - if ("function" != typeof t) throw new TypeError("callback is not a function"); - e = (null == e ? ln() : +e) + (null == n ? 0 : +n), this._next || Wf === this || (Wf ? Wf._next = this : Vf = this, Wf = this), this._call = t, this._time = e, mn() - }, - stop: function () { - this._call && (this._call = null, this._time = 1 / 0, mn()) - } - }; - var Pl = function (t, n, e) { - var r = new pn; - return n = null == n ? 0 : +n, r.restart(function (e) { - r.stop(), t(e + n) - }, n, e), r - }, - Rl = h("start", "end", "interrupt"), - Ll = [], - ql = 0, - Ul = 1, - Dl = 2, - Ol = 3, - Fl = 4, - Il = 5, - Yl = 6, - Bl = function (t, n, e, r, i, o) { - var u = t.__transition; - if (u) { - if (e in u) return - } else t.__transition = {}; - Mn(t, e, { - name: n, - index: r, - group: i, - on: Rl, - tween: Ll, - time: o.time, - delay: o.delay, - duration: o.duration, - ease: o.ease, - timer: null, - state: ql - }) - }, - jl = function (t, n) { - var e, r, i, o = t.__transition, - u = !0; - if (o) { - n = null == n ? null : n + ""; - for (i in o)(e = o[i]).name === n ? (r = e.state > Dl && e.state < Il, e.state = Yl, e.timer.stop(), r && e.on.call("interrupt", t, t.__data__, e.index, e.group), delete o[i]) : u = !1; - u && delete t.__transition - } - }, - Hl = function (t, n) { - var e; - return ("number" == typeof n ? rl : n instanceof Tt ? Qf : (e = Tt(n)) ? (n = e, Qf) : al)(t, n) - }, - Xl = dt.prototype.constructor, - $l = 0, - Vl = dt.prototype; - Gn.prototype = Jn.prototype = { - constructor: Gn, - select: function (t) { - var n = this._name, - e = this._id; - "function" != typeof t && (t = tf(t)); - for (var r = this._groups, i = r.length, o = new Array(i), u = 0; u < i; ++u) - for (var a, c, s = r[u], f = s.length, l = o[u] = new Array(f), h = 0; h < f; ++h)(a = s[h]) && (c = t.call(a, a.__data__, h, s)) && ("__data__" in a && (c.__data__ = a.__data__), l[h] = c, Bl(l[h], n, e, h, l, wn(a, e))); - return new Gn(o, this._parents, n, e) - }, - selectAll: function (t) { - var n = this._name, - e = this._id; - "function" != typeof t && (t = nf(t)); - for (var r = this._groups, i = r.length, o = [], u = [], a = 0; a < i; ++a) - for (var c, s = r[a], f = s.length, l = 0; l < f; ++l) - if (c = s[l]) { - for (var h, p = t.call(c, c.__data__, l, s), d = wn(c, e), v = 0, _ = p.length; v < _; ++v)(h = p[v]) && Bl(h, n, e, v, p, d); - o.push(p), u.push(c) - } - return new Gn(o, u, n, e) - }, - filter: function (t) { - "function" != typeof t && (t = Zs(t)); - for (var n = this._groups, e = n.length, r = new Array(e), i = 0; i < e; ++i) - for (var o, u = n[i], a = u.length, c = r[i] = [], s = 0; s < a; ++s)(o = u[s]) && t.call(o, o.__data__, s, u) && c.push(o); - return new Gn(r, this._parents, this._name, this._id) - }, - merge: function (t) { - if (t._id !== this._id) throw new Error; - for (var n = this._groups, e = t._groups, r = n.length, i = e.length, o = Math.min(r, i), u = new Array(r), a = 0; a < o; ++a) - for (var c, s = n[a], f = e[a], l = s.length, h = u[a] = new Array(l), p = 0; p < l; ++p)(c = s[p] || f[p]) && (h[p] = c); - for (; a < r; ++a) u[a] = n[a]; - return new Gn(u, this._parents, this._name, this._id) - }, - selection: function () { - return new Xl(this._groups, this._parents) - }, - transition: function () { - for (var t = this._name, n = this._id, e = Qn(), r = this._groups, i = r.length, o = 0; o < i; ++o) - for (var u, a = r[o], c = a.length, s = 0; s < c; ++s) - if (u = a[s]) { - var f = wn(u, n); - Bl(u, t, e, s, a, { - time: f.time + f.delay + f.duration, - delay: 0, - duration: f.duration, - ease: f.ease - }) - } - return new Gn(r, this._parents, t, e) - }, - call: Vl.call, - nodes: Vl.nodes, - node: Vl.node, - size: Vl.size, - empty: Vl.empty, - each: Vl.each, - on: function (t, n) { - var e = this._id; - return arguments.length < 2 ? wn(this.node(), e).on.on(t) : this.each(Yn(e, t, n)) - }, - attr: function (t, n) { - var e = js(t), - r = "transform" === e ? dl : Hl; - return this.attrTween(t, "function" == typeof n ? (e.local ? Pn : zn)(e, r, Nn(this, "attr." + t, n)) : null == n ? (e.local ? En : Sn)(e) : (e.local ? Cn : An)(e, r, n + "")) - }, - attrTween: function (t, n) { - var e = "attr." + t; - if (arguments.length < 2) return (e = this.tween(e)) && e._value; - if (null == n) return this.tween(e, null); - if ("function" != typeof n) throw new Error; - var r = js(t); - return this.tween(e, (r.local ? Rn : Ln)(r, n)) - }, - style: function (t, n, e) { - var r = "transform" == (t += "") ? pl : Hl; - return null == n ? this.styleTween(t, jn(t, r)).on("end.style." + t, Hn(t)) : this.styleTween(t, "function" == typeof n ? $n(t, r, Nn(this, "style." + t, n)) : Xn(t, r, n + ""), e) - }, - styleTween: function (t, n, e) { - var r = "style." + (t += ""); - if (arguments.length < 2) return (r = this.tween(r)) && r._value; - if (null == n) return this.tween(r, null); - if ("function" != typeof n) throw new Error; - return this.tween(r, Vn(t, n, null == e ? "" : e)) - }, - text: function (t) { - return this.tween("text", "function" == typeof t ? Zn(Nn(this, "text", t)) : Wn(null == t ? "" : t + "")) - }, - remove: function () { - return this.on("end.remove", Bn(this._id)) - }, - tween: function (t, n) { - var e = this._id; - if (t += "", arguments.length < 2) { - for (var r, i = wn(this.node(), e).tween, o = 0, u = i.length; o < u; ++o) - if ((r = i[o]).name === t) return r.value; - return null - } - return this.each((null == n ? Tn : kn)(e, t, n)) - }, - delay: function (t) { - var n = this._id; - return arguments.length ? this.each(("function" == typeof t ? qn : Un)(n, t)) : wn(this.node(), n).delay - }, - duration: function (t) { - var n = this._id; - return arguments.length ? this.each(("function" == typeof t ? Dn : On)(n, t)) : wn(this.node(), n).duration - }, - ease: function (t) { - var n = this._id; - return arguments.length ? this.each(Fn(n, t)) : wn(this.node(), n).ease - } - }; - var Wl = function t(n) { - function e(t) { - return Math.pow(t, n) - } - return n = +n, e.exponent = t, e - }(3), - Zl = function t(n) { - function e(t) { - return 1 - Math.pow(1 - t, n) - } - return n = +n, e.exponent = t, e - }(3), - Gl = function t(n) { - function e(t) { - return ((t *= 2) <= 1 ? Math.pow(t, n) : 2 - Math.pow(2 - t, n)) / 2 - } - return n = +n, e.exponent = t, e - }(3), - Jl = Math.PI, - Ql = Jl / 2, - Kl = 4 / 11, - th = 6 / 11, - nh = 8 / 11, - eh = .75, - rh = 9 / 11, - ih = 10 / 11, - oh = .9375, - uh = 21 / 22, - ah = 63 / 64, - ch = 1 / Kl / Kl, - sh = function t(n) { - function e(t) { - return t * t * ((n + 1) * t - n) - } - return n = +n, e.overshoot = t, e - }(1.70158), - fh = function t(n) { - function e(t) { - return --t * t * ((n + 1) * t + n) + 1 - } - return n = +n, e.overshoot = t, e - }(1.70158), - lh = function t(n) { - function e(t) { - return ((t *= 2) < 1 ? t * t * ((n + 1) * t - n) : (t -= 2) * t * ((n + 1) * t + n) + 2) / 2 - } - return n = +n, e.overshoot = t, e - }(1.70158), - hh = 2 * Math.PI, - ph = function t(n, e) { - function r(t) { - return n * Math.pow(2, 10 * --t) * Math.sin((i - t) / e) - } - var i = Math.asin(1 / (n = Math.max(1, n))) * (e /= hh); - return r.amplitude = function (n) { - return t(n, e * hh) - }, r.period = function (e) { - return t(n, e) - }, r - }(1, .3), - dh = function t(n, e) { - function r(t) { - return 1 - n * Math.pow(2, -10 * (t = +t)) * Math.sin((t + i) / e) - } - var i = Math.asin(1 / (n = Math.max(1, n))) * (e /= hh); - return r.amplitude = function (n) { - return t(n, e * hh) - }, r.period = function (e) { - return t(n, e) - }, r - }(1, .3), - vh = function t(n, e) { - function r(t) { - return ((t = 2 * t - 1) < 0 ? n * Math.pow(2, 10 * t) * Math.sin((i - t) / e) : 2 - n * Math.pow(2, -10 * t) * Math.sin((i + t) / e)) / 2 - } - var i = Math.asin(1 / (n = Math.max(1, n))) * (e /= hh); - return r.amplitude = function (n) { - return t(n, e * hh) - }, r.period = function (e) { - return t(n, e) - }, r - }(1, .3), - _h = { - time: null, - delay: 0, - duration: 250, - ease: te - }; - dt.prototype.interrupt = function (t) { - return this.each(function () { - jl(this, t) - }) - }, dt.prototype.transition = function (t) { - var n, e; - t instanceof Gn ? (n = t._id, t = t._name) : (n = Qn(), (e = _h).time = ln(), t = null == t ? null : t + ""); - for (var r = this._groups, i = r.length, o = 0; o < i; ++o) - for (var u, a = r[o], c = a.length, s = 0; s < c; ++s)(u = a[s]) && Bl(u, t, n, s, a, e || oe(u, n)); - return new Gn(r, this._parents, t, n) - }; - var yh = [null], - gh = function (t) { - return function () { - return t - } - }, - mh = function (t, n, e) { - this.target = t, this.type = n, this.selection = e - }, - xh = function () { - t.event.preventDefault(), t.event.stopImmediatePropagation() - }, - bh = { - name: "drag" - }, - wh = { - name: "space" - }, - Mh = { - name: "handle" - }, - Th = { - name: "center" - }, - kh = { - name: "x", - handles: ["e", "w"].map(ae), - input: function (t, n) { - return t && [ - [t[0], n[0][1]], - [t[1], n[1][1]] - ] - }, - output: function (t) { - return t && [t[0][0], t[1][0]] - } - }, - Nh = { - name: "y", - handles: ["n", "s"].map(ae), - input: function (t, n) { - return t && [ - [n[0][0], t[0]], - [n[1][0], t[1]] - ] - }, - output: function (t) { - return t && [t[0][1], t[1][1]] - } - }, - Sh = { - name: "xy", - handles: ["n", "e", "s", "w", "nw", "ne", "se", "sw"].map(ae), - input: function (t) { - return t - }, - output: function (t) { - return t - } - }, - Eh = { - overlay: "crosshair", - selection: "move", - n: "ns-resize", - e: "ew-resize", - s: "ns-resize", - w: "ew-resize", - nw: "nwse-resize", - ne: "nesw-resize", - se: "nwse-resize", - sw: "nesw-resize" - }, - Ah = { - e: "w", - w: "e", - nw: "ne", - ne: "nw", - se: "sw", - sw: "se" - }, - Ch = { - n: "s", - s: "n", - nw: "sw", - ne: "se", - se: "ne", - sw: "nw" - }, - zh = { - overlay: 1, - selection: 1, - n: null, - e: 1, - s: null, - w: -1, - nw: -1, - ne: 1, - se: 1, - sw: -1 - }, - Ph = { - overlay: 1, - selection: 1, - n: -1, - e: null, - s: 1, - w: null, - nw: -1, - ne: -1, - se: 1, - sw: 1 - }, - Rh = Math.cos, - Lh = Math.sin, - qh = Math.PI, - Uh = qh / 2, - Dh = 2 * qh, - Oh = Math.max, - Fh = Array.prototype.slice, - Ih = function (t) { - return function () { - return t - } - }, - Yh = Math.PI, - Bh = 2 * Yh, - jh = Bh - 1e-6; - de.prototype = ve.prototype = { - constructor: de, - moveTo: function (t, n) { - this._ += "M" + (this._x0 = this._x1 = +t) + "," + (this._y0 = this._y1 = +n) - }, - closePath: function () { - null !== this._x1 && (this._x1 = this._x0, this._y1 = this._y0, this._ += "Z") - }, - lineTo: function (t, n) { - this._ += "L" + (this._x1 = +t) + "," + (this._y1 = +n) - }, - quadraticCurveTo: function (t, n, e, r) { - this._ += "Q" + +t + "," + +n + "," + (this._x1 = +e) + "," + (this._y1 = +r) - }, - bezierCurveTo: function (t, n, e, r, i, o) { - this._ += "C" + +t + "," + +n + "," + +e + "," + +r + "," + (this._x1 = +i) + "," + (this._y1 = +o) - }, - arcTo: function (t, n, e, r, i) { - t = +t, n = +n, e = +e, r = +r, i = +i; - var o = this._x1, - u = this._y1, - a = e - t, - c = r - n, - s = o - t, - f = u - n, - l = s * s + f * f; - if (i < 0) throw new Error("negative radius: " + i); - if (null === this._x1) this._ += "M" + (this._x1 = t) + "," + (this._y1 = n); - else if (l > 1e-6) - if (Math.abs(f * a - c * s) > 1e-6 && i) { - var h = e - o, - p = r - u, - d = a * a + c * c, - v = h * h + p * p, - _ = Math.sqrt(d), - y = Math.sqrt(l), - g = i * Math.tan((Yh - Math.acos((d + l - v) / (2 * _ * y))) / 2), - m = g / y, - x = g / _; - Math.abs(m - 1) > 1e-6 && (this._ += "L" + (t + m * s) + "," + (n + m * f)), this._ += "A" + i + "," + i + ",0,0," + +(f * h > s * p) + "," + (this._x1 = t + x * a) + "," + (this._y1 = n + x * c) - } else this._ += "L" + (this._x1 = t) + "," + (this._y1 = n); - else; - }, - arc: function (t, n, e, r, i, o) { - t = +t, n = +n; - var u = (e = +e) * Math.cos(r), - a = e * Math.sin(r), - c = t + u, - s = n + a, - f = 1 ^ o, - l = o ? r - i : i - r; - if (e < 0) throw new Error("negative radius: " + e); - null === this._x1 ? this._ += "M" + c + "," + s : (Math.abs(this._x1 - c) > 1e-6 || Math.abs(this._y1 - s) > 1e-6) && (this._ += "L" + c + "," + s), e && (l < 0 && (l = l % Bh + Bh), l > jh ? this._ += "A" + e + "," + e + ",0,1," + f + "," + (t - u) + "," + (n - a) + "A" + e + "," + e + ",0,1," + f + "," + (this._x1 = c) + "," + (this._y1 = s) : l > 1e-6 && (this._ += "A" + e + "," + e + ",0," + +(l >= Yh) + "," + f + "," + (this._x1 = t + e * Math.cos(i)) + "," + (this._y1 = n + e * Math.sin(i)))) - }, - rect: function (t, n, e, r) { - this._ += "M" + (this._x0 = this._x1 = +t) + "," + (this._y0 = this._y1 = +n) + "h" + +e + "v" + +r + "h" + -e + "Z" - }, - toString: function () { - return this._ - } - }; - be.prototype = we.prototype = { - constructor: be, - has: function (t) { - return "$" + t in this - }, - get: function (t) { - return this["$" + t] - }, - set: function (t, n) { - return this["$" + t] = n, this - }, - remove: function (t) { - var n = "$" + t; - return n in this && delete this[n] - }, - clear: function () { - for (var t in this) "$" === t[0] && delete this[t] - }, - keys: function () { - var t = []; - for (var n in this) "$" === n[0] && t.push(n.slice(1)); - return t - }, - values: function () { - var t = []; - for (var n in this) "$" === n[0] && t.push(this[n]); - return t - }, - entries: function () { - var t = []; - for (var n in this) "$" === n[0] && t.push({ - key: n.slice(1), - value: this[n] - }); - return t - }, - size: function () { - var t = 0; - for (var n in this) "$" === n[0] && ++t; - return t - }, - empty: function () { - for (var t in this) - if ("$" === t[0]) return !1; - return !0 - }, - each: function (t) { - for (var n in this) "$" === n[0] && t(this[n], n.slice(1), this) - } - }; - var Hh = we.prototype; - Se.prototype = Ee.prototype = { - constructor: Se, - has: Hh.has, - add: function (t) { - return t += "", this["$" + t] = t, this - }, - remove: Hh.remove, - clear: Hh.clear, - values: Hh.keys, - size: Hh.size, - empty: Hh.empty, - each: Hh.each - }; - var Xh = {}, - $h = {}, - Vh = 34, - Wh = 10, - Zh = 13, - Gh = function (t) { - function n(t, n) { - function e() { - if (s) return $h; - if (f) return f = !1, Xh; - var n, e, r = a; - if (t.charCodeAt(r) === Vh) { - for (; a++ < u && t.charCodeAt(a) !== Vh || t.charCodeAt(++a) === Vh;); - return (n = a) >= u ? s = !0 : (e = t.charCodeAt(a++)) === Wh ? f = !0 : e === Zh && (f = !0, t.charCodeAt(a) === Wh && ++a), t.slice(r + 1, n - 1).replace(/""/g, '"') - } - for (; a < u;) { - if ((e = t.charCodeAt(n = a++)) === Wh) f = !0; - else if (e === Zh) f = !0, t.charCodeAt(a) === Wh && ++a; - else if (e !== o) continue; - return t.slice(r, n) - } - return s = !0, t.slice(r, u) - } - var r, i = [], - u = t.length, - a = 0, - c = 0, - s = u <= 0, - f = !1; - for (t.charCodeAt(u - 1) === Wh && --u, t.charCodeAt(u - 1) === Zh && --u; - (r = e()) !== $h;) { - for (var l = []; r !== Xh && r !== $h;) l.push(r), r = e(); - n && null == (l = n(l, c++)) || i.push(l) - } - return i - } - - function e(n) { - return n.map(r).join(t) - } - - function r(t) { - return null == t ? "" : i.test(t += "") ? '"' + t.replace(/"/g, '""') + '"' : t - } - var i = new RegExp('["' + t + "\n\r]"), - o = t.charCodeAt(0); - return { - parse: function (t, e) { - var r, i, o = n(t, function (t, n) { - if (r) return r(t, n - 1); - i = t, r = e ? Ce(t, e) : Ae(t) - }); - return o.columns = i, o - }, - parseRows: n, - format: function (n, e) { - return null == e && (e = ze(n)), [e.map(r).join(t)].concat(n.map(function (n) { - return e.map(function (t) { - return r(n[t]) - }).join(t) - })).join("\n") - }, - formatRows: function (t) { - return t.map(e).join("\n") - } - } - }, - Jh = Gh(","), - Qh = Jh.parse, - Kh = Jh.parseRows, - tp = Jh.format, - np = Jh.formatRows, - ep = Gh("\t"), - rp = ep.parse, - ip = ep.parseRows, - op = ep.format, - up = ep.formatRows, - ap = function (t) { - return function () { - return t - } - }, - cp = function () { - return 1e-6 * (Math.random() - .5) - }, - sp = function (t, n, e, r, i) { - this.node = t, this.x0 = n, this.y0 = e, this.x1 = r, this.y1 = i - }, - fp = qe.prototype = Ue.prototype; - fp.copy = function () { - var t, n, e = new Ue(this._x, this._y, this._x0, this._y0, this._x1, this._y1), - r = this._root; - if (!r) return e; - if (!r.length) return e._root = De(r), e; - for (t = [{ - source: r, - target: e._root = new Array(4) - }]; r = t.pop();) - for (var i = 0; i < 4; ++i)(n = r.source[i]) && (n.length ? t.push({ - source: n, - target: r.target[i] = new Array(4) - }) : r.target[i] = De(n)); - return e - }, fp.add = function (t) { - var n = +this._x.call(null, t), - e = +this._y.call(null, t); - return Pe(this.cover(n, e), n, e, t) - }, fp.addAll = function (t) { - var n, e, r, i, o = t.length, - u = new Array(o), - a = new Array(o), - c = 1 / 0, - s = 1 / 0, - f = -1 / 0, - l = -1 / 0; - for (e = 0; e < o; ++e) isNaN(r = +this._x.call(null, n = t[e])) || isNaN(i = +this._y.call(null, n)) || (u[e] = r, a[e] = i, r < c && (c = r), r > f && (f = r), i < s && (s = i), i > l && (l = i)); - for (f < c && (c = this._x0, f = this._x1), l < s && (s = this._y0, l = this._y1), this.cover(c, s).cover(f, l), e = 0; e < o; ++e) Pe(this, u[e], a[e], t[e]); - return this - }, fp.cover = function (t, n) { - if (isNaN(t = +t) || isNaN(n = +n)) return this; - var e = this._x0, - r = this._y0, - i = this._x1, - o = this._y1; - if (isNaN(e)) i = (e = Math.floor(t)) + 1, o = (r = Math.floor(n)) + 1; - else { - if (!(e > t || t > i || r > n || n > o)) return this; - var u, a, c = i - e, - s = this._root; - switch (a = (n < (r + o) / 2) << 1 | t < (e + i) / 2) { - case 0: - do { - u = new Array(4), u[a] = s, s = u - } while (c *= 2, i = e + c, o = r + c, t > i || n > o); - break; - case 1: - do { - u = new Array(4), u[a] = s, s = u - } while (c *= 2, e = i - c, o = r + c, e > t || n > o); - break; - case 2: - do { - u = new Array(4), u[a] = s, s = u - } while (c *= 2, i = e + c, r = o - c, t > i || r > n); - break; - case 3: - do { - u = new Array(4), u[a] = s, s = u - } while (c *= 2, e = i - c, r = o - c, e > t || r > n) - } - this._root && this._root.length && (this._root = s) - } - return this._x0 = e, this._y0 = r, this._x1 = i, this._y1 = o, this - }, fp.data = function () { - var t = []; - return this.visit(function (n) { - if (!n.length) - do { - t.push(n.data) - } while (n = n.next) - }), t - }, fp.extent = function (t) { - return arguments.length ? this.cover(+t[0][0], +t[0][1]).cover(+t[1][0], +t[1][1]) : isNaN(this._x0) ? void 0 : [ - [this._x0, this._y0], - [this._x1, this._y1] - ] - }, fp.find = function (t, n, e) { - var r, i, o, u, a, c, s, f = this._x0, - l = this._y0, - h = this._x1, - p = this._y1, - d = [], - v = this._root; - for (v && d.push(new sp(v, f, l, h, p)), null == e ? e = 1 / 0 : (f = t - e, l = n - e, h = t + e, p = n + e, e *= e); c = d.pop();) - if (!(!(v = c.node) || (i = c.x0) > h || (o = c.y0) > p || (u = c.x1) < f || (a = c.y1) < l)) - if (v.length) { - var _ = (i + u) / 2, - y = (o + a) / 2; - d.push(new sp(v[3], _, y, u, a), new sp(v[2], i, y, _, a), new sp(v[1], _, o, u, y), new sp(v[0], i, o, _, y)), (s = (n >= y) << 1 | t >= _) && (c = d[d.length - 1], d[d.length - 1] = d[d.length - 1 - s], d[d.length - 1 - s] = c) - } else { - var g = t - +this._x.call(null, v.data), - m = n - +this._y.call(null, v.data), - x = g * g + m * m; - if (x < e) { - var b = Math.sqrt(e = x); - f = t - b, l = n - b, h = t + b, p = n + b, r = v.data - } - } - return r - }, fp.remove = function (t) { - if (isNaN(o = +this._x.call(null, t)) || isNaN(u = +this._y.call(null, t))) return this; - var n, e, r, i, o, u, a, c, s, f, l, h, p = this._root, - d = this._x0, - v = this._y0, - _ = this._x1, - y = this._y1; - if (!p) return this; - if (p.length) - for (;;) { - if ((s = o >= (a = (d + _) / 2)) ? d = a : _ = a, (f = u >= (c = (v + y) / 2)) ? v = c : y = c, n = p, !(p = p[l = f << 1 | s])) return this; - if (!p.length) break; - (n[l + 1 & 3] || n[l + 2 & 3] || n[l + 3 & 3]) && (e = n, h = l) - } - for (; p.data !== t;) - if (r = p, !(p = p.next)) return this; - return (i = p.next) && delete p.next, r ? (i ? r.next = i : delete r.next, this) : n ? (i ? n[l] = i : delete n[l], (p = n[0] || n[1] || n[2] || n[3]) && p === (n[3] || n[2] || n[1] || n[0]) && !p.length && (e ? e[h] = p : this._root = p), this) : (this._root = i, this) - }, fp.removeAll = function (t) { - for (var n = 0, e = t.length; n < e; ++n) this.remove(t[n]); - return this - }, fp.root = function () { - return this._root - }, fp.size = function () { - var t = 0; - return this.visit(function (n) { - if (!n.length) - do { - ++t - } while (n = n.next) - }), t - }, fp.visit = function (t) { - var n, e, r, i, o, u, a = [], - c = this._root; - for (c && a.push(new sp(c, this._x0, this._y0, this._x1, this._y1)); n = a.pop();) - if (!t(c = n.node, r = n.x0, i = n.y0, o = n.x1, u = n.y1) && c.length) { - var s = (r + o) / 2, - f = (i + u) / 2; - (e = c[3]) && a.push(new sp(e, s, f, o, u)), (e = c[2]) && a.push(new sp(e, r, f, s, u)), (e = c[1]) && a.push(new sp(e, s, i, o, f)), (e = c[0]) && a.push(new sp(e, r, i, s, f)) - } - return this - }, fp.visitAfter = function (t) { - var n, e = [], - r = []; - for (this._root && e.push(new sp(this._root, this._x0, this._y0, this._x1, this._y1)); n = e.pop();) { - var i = n.node; - if (i.length) { - var o, u = n.x0, - a = n.y0, - c = n.x1, - s = n.y1, - f = (u + c) / 2, - l = (a + s) / 2; - (o = i[0]) && e.push(new sp(o, u, a, f, l)), (o = i[1]) && e.push(new sp(o, f, a, c, l)), (o = i[2]) && e.push(new sp(o, u, l, f, s)), (o = i[3]) && e.push(new sp(o, f, l, c, s)) - } - r.push(n) - } - for (; n = r.pop();) t(n.node, n.x0, n.y0, n.x1, n.y1); - return this - }, fp.x = function (t) { - return arguments.length ? (this._x = t, this) : this._x - }, fp.y = function (t) { - return arguments.length ? (this._y = t, this) : this._y - }; - var lp, hp = 10, - pp = Math.PI * (3 - Math.sqrt(5)), - dp = function (t, n) { - if ((e = (t = n ? t.toExponential(n - 1) : t.toExponential()).indexOf("e")) < 0) return null; - var e, r = t.slice(0, e); - return [r.length > 1 ? r[0] + r.slice(2) : r, +t.slice(e + 1)] - }, - vp = function (t) { - return (t = dp(Math.abs(t))) ? t[1] : NaN - }, - _p = function (t, n) { - return function (e, r) { - for (var i = e.length, o = [], u = 0, a = t[0], c = 0; i > 0 && a > 0 && (c + a + 1 > r && (a = Math.max(1, r - c)), o.push(e.substring(i -= a, i + a)), !((c += a + 1) > r));) a = t[u = (u + 1) % t.length]; - return o.reverse().join(n) - } - }, - yp = function (t) { - return function (n) { - return n.replace(/[0-9]/g, function (n) { - return t[+n] - }) - } - }, - gp = function (t, n) { - var e = dp(t, n); - if (!e) return t + ""; - var r = e[0], - i = e[1]; - return i < 0 ? "0." + new Array(-i).join("0") + r : r.length > i + 1 ? r.slice(0, i + 1) + "." + r.slice(i + 1) : r + new Array(i - r.length + 2).join("0") - }, - mp = { - "": function (t, n) { - t: for (var e, r = (t = t.toPrecision(n)).length, i = 1, o = -1; i < r; ++i) switch (t[i]) { - case ".": - o = e = i; - break; - case "0": - 0 === o && (o = i), e = i; - break; - case "e": - break t; - default: - o > 0 && (o = 0) - } - return o > 0 ? t.slice(0, o) + t.slice(e + 1) : t - }, - "%": function (t, n) { - return (100 * t).toFixed(n) - }, - b: function (t) { - return Math.round(t).toString(2) - }, - c: function (t) { - return t + "" - }, - d: function (t) { - return Math.round(t).toString(10) - }, - e: function (t, n) { - return t.toExponential(n) - }, - f: function (t, n) { - return t.toFixed(n) - }, - g: function (t, n) { - return t.toPrecision(n) - }, - o: function (t) { - return Math.round(t).toString(8) - }, - p: function (t, n) { - return gp(100 * t, n) - }, - r: gp, - s: function (t, n) { - var e = dp(t, n); - if (!e) return t + ""; - var r = e[0], - i = e[1], - o = i - (lp = 3 * Math.max(-8, Math.min(8, Math.floor(i / 3)))) + 1, - u = r.length; - return o === u ? r : o > u ? r + new Array(o - u + 1).join("0") : o > 0 ? r.slice(0, o) + "." + r.slice(o) : "0." + new Array(1 - o).join("0") + dp(t, Math.max(0, n + o - 1))[0] - }, - X: function (t) { - return Math.round(t).toString(16).toUpperCase() - }, - x: function (t) { - return Math.round(t).toString(16) - } - }, - xp = /^(?:(.)?([<>=^]))?([+\-\( ])?([$#])?(0)?(\d+)?(,)?(\.\d+)?([a-z%])?$/i; - He.prototype = Xe.prototype, Xe.prototype.toString = function () { - return this.fill + this.align + this.sign + this.symbol + (this.zero ? "0" : "") + (null == this.width ? "" : Math.max(1, 0 | this.width)) + (this.comma ? "," : "") + (null == this.precision ? "" : "." + Math.max(0, 0 | this.precision)) + this.type - }; - var bp, wp = function (t) { - return t - }, - Mp = ["y", "z", "a", "f", "p", "n", "µ", "m", "", "k", "M", "G", "T", "P", "E", "Z", "Y"], - Tp = function (t) { - function n(t) { - function n(t) { - var n, r, u, f = _, - x = y; - if ("c" === v) x = g(t) + x, t = ""; - else { - var b = (t = +t) < 0; - if (t = g(Math.abs(t), d), b && 0 == +t && (b = !1), f = (b ? "(" === s ? s : "-" : "-" === s || "(" === s ? "" : s) + f, x = x + ("s" === v ? Mp[8 + lp / 3] : "") + (b && "(" === s ? ")" : ""), m) - for (n = -1, r = t.length; ++n < r;) - if (48 > (u = t.charCodeAt(n)) || u > 57) { - x = (46 === u ? i + t.slice(n + 1) : t.slice(n)) + x, t = t.slice(0, n); - break - } - } - p && !l && (t = e(t, 1 / 0)); - var w = f.length + t.length + x.length, - M = w < h ? new Array(h - w + 1).join(a) : ""; - switch (p && l && (t = e(M + t, M.length ? h - x.length : 1 / 0), M = ""), c) { - case "<": - t = f + t + x + M; - break; - case "=": - t = f + M + t + x; - break; - case "^": - t = M.slice(0, w = M.length >> 1) + f + t + x + M.slice(w); - break; - default: - t = M + f + t + x - } - return o(t) - } - var a = (t = He(t)).fill, - c = t.align, - s = t.sign, - f = t.symbol, - l = t.zero, - h = t.width, - p = t.comma, - d = t.precision, - v = t.type, - _ = "$" === f ? r[0] : "#" === f && /[boxX]/.test(v) ? "0" + v.toLowerCase() : "", - y = "$" === f ? r[1] : /[%p]/.test(v) ? u : "", - g = mp[v], - m = !v || /[defgprs%]/.test(v); - return d = null == d ? v ? 6 : 12 : /[gprs]/.test(v) ? Math.max(1, Math.min(21, d)) : Math.max(0, Math.min(20, d)), n.toString = function () { - return t + "" - }, n - } - var e = t.grouping && t.thousands ? _p(t.grouping, t.thousands) : wp, - r = t.currency, - i = t.decimal, - o = t.numerals ? yp(t.numerals) : wp, - u = t.percent || "%"; - return { - format: n, - formatPrefix: function (t, e) { - var r = n((t = He(t), t.type = "f", t)), - i = 3 * Math.max(-8, Math.min(8, Math.floor(vp(e) / 3))), - o = Math.pow(10, -i), - u = Mp[8 + i / 3]; - return function (t) { - return r(o * t) + u - } - } - } - }; - $e({ - decimal: ".", - thousands: ",", - grouping: [3], - currency: ["$", ""] - }); - var kp = function (t) { - return Math.max(0, -vp(Math.abs(t))) - }, - Np = function (t, n) { - return Math.max(0, 3 * Math.max(-8, Math.min(8, Math.floor(vp(n) / 3))) - vp(Math.abs(t))) - }, - Sp = function (t, n) { - return t = Math.abs(t), n = Math.abs(n) - t, Math.max(0, vp(n) - vp(t)) + 1 - }, - Ep = function () { - return new Ve - }; - Ve.prototype = { - constructor: Ve, - reset: function () { - this.s = this.t = 0 - }, - add: function (t) { - We(ud, t, this.t), We(this, ud.s, this.s), this.s ? this.t += ud.t : this.s = ud.t - }, - valueOf: function () { - return this.s - } - }; - var Ap, Cp, zp, Pp, Rp, Lp, qp, Up, Dp, Op, Fp, Ip, Yp, Bp, jp, Hp, Xp, $p, Vp, Wp, Zp, Gp, Jp, Qp, Kp, td, nd, ed, rd, id, od, ud = new Ve, - ad = 1e-6, - cd = Math.PI, - sd = cd / 2, - fd = cd / 4, - ld = 2 * cd, - hd = 180 / cd, - pd = cd / 180, - dd = Math.abs, - vd = Math.atan, - _d = Math.atan2, - yd = Math.cos, - gd = Math.ceil, - md = Math.exp, - xd = Math.log, - bd = Math.pow, - wd = Math.sin, - Md = Math.sign || function (t) { - return t > 0 ? 1 : t < 0 ? -1 : 0 - }, - Td = Math.sqrt, - kd = Math.tan, - Nd = { - Feature: function (t, n) { - Ke(t.geometry, n) - }, - FeatureCollection: function (t, n) { - for (var e = t.features, r = -1, i = e.length; ++r < i;) Ke(e[r].geometry, n) - } - }, - Sd = { - Sphere: function (t, n) { - n.sphere() - }, - Point: function (t, n) { - t = t.coordinates, n.point(t[0], t[1], t[2]) - }, - MultiPoint: function (t, n) { - for (var e = t.coordinates, r = -1, i = e.length; ++r < i;) t = e[r], n.point(t[0], t[1], t[2]) - }, - LineString: function (t, n) { - tr(t.coordinates, n, 0) - }, - MultiLineString: function (t, n) { - for (var e = t.coordinates, r = -1, i = e.length; ++r < i;) tr(e[r], n, 0) - }, - Polygon: function (t, n) { - nr(t.coordinates, n) - }, - MultiPolygon: function (t, n) { - for (var e = t.coordinates, r = -1, i = e.length; ++r < i;) nr(e[r], n) - }, - GeometryCollection: function (t, n) { - for (var e = t.geometries, r = -1, i = e.length; ++r < i;) Ke(e[r], n) - } - }, - Ed = function (t, n) { - t && Nd.hasOwnProperty(t.type) ? Nd[t.type](t, n) : Ke(t, n) - }, - Ad = Ep(), - Cd = Ep(), - zd = { - point: Qe, - lineStart: Qe, - lineEnd: Qe, - polygonStart: function () { - Ad.reset(), zd.lineStart = er, zd.lineEnd = rr - }, - polygonEnd: function () { - var t = +Ad; - Cd.add(t < 0 ? ld + t : t), this.lineStart = this.lineEnd = this.point = Qe - }, - sphere: function () { - Cd.add(ld) - } - }, - Pd = Ep(), - Rd = { - point: pr, - lineStart: vr, - lineEnd: _r, - polygonStart: function () { - Rd.point = yr, Rd.lineStart = gr, Rd.lineEnd = mr, Pd.reset(), zd.polygonStart() - }, - polygonEnd: function () { - zd.polygonEnd(), Rd.point = pr, Rd.lineStart = vr, Rd.lineEnd = _r, Ad < 0 ? (Lp = -(Up = 180), qp = -(Dp = 90)) : Pd > ad ? Dp = 90 : Pd < -ad && (qp = -90), jp[0] = Lp, jp[1] = Up - } - }, - Ld = { - sphere: Qe, - point: Mr, - lineStart: kr, - lineEnd: Er, - polygonStart: function () { - Ld.lineStart = Ar, Ld.lineEnd = Cr - }, - polygonEnd: function () { - Ld.lineStart = kr, Ld.lineEnd = Er - } - }, - qd = function (t) { - return function () { - return t - } - }, - Ud = function (t, n) { - function e(e, r) { - return e = t(e, r), n(e[0], e[1]) - } - return t.invert && n.invert && (e.invert = function (e, r) { - return (e = n.invert(e, r)) && t.invert(e[0], e[1]) - }), e - }; - Rr.invert = Rr; - var Dd, Od, Fd, Id, Yd, Bd, jd, Hd, Xd, $d, Vd, Wd = function (t) { - function n(n) { - return n = t(n[0] * pd, n[1] * pd), n[0] *= hd, n[1] *= hd, n - } - return t = Lr(t[0] * pd, t[1] * pd, t.length > 2 ? t[2] * pd : 0), n.invert = function (n) { - return n = t.invert(n[0] * pd, n[1] * pd), n[0] *= hd, n[1] *= hd, n - }, n - }, - Zd = function () { - var t, n = []; - return { - point: function (n, e) { - t.push([n, e]) - }, - lineStart: function () { - n.push(t = []) - }, - lineEnd: Qe, - rejoin: function () { - n.length > 1 && n.push(n.pop().concat(n.shift())) - }, - result: function () { - var e = n; - return n = [], t = null, e - } - } - }, - Gd = function (t, n, e, r, i, o) { - var u, a = t[0], - c = t[1], - s = 0, - f = 1, - l = n[0] - a, - h = n[1] - c; - if (u = e - a, l || !(u > 0)) { - if (u /= l, l < 0) { - if (u < s) return; - u < f && (f = u) - } else if (l > 0) { - if (u > f) return; - u > s && (s = u) - } - if (u = i - a, l || !(u < 0)) { - if (u /= l, l < 0) { - if (u > f) return; - u > s && (s = u) - } else if (l > 0) { - if (u < s) return; - u < f && (f = u) - } - if (u = r - c, h || !(u > 0)) { - if (u /= h, h < 0) { - if (u < s) return; - u < f && (f = u) - } else if (h > 0) { - if (u > f) return; - u > s && (s = u) - } - if (u = o - c, h || !(u < 0)) { - if (u /= h, h < 0) { - if (u > f) return; - u > s && (s = u) - } else if (h > 0) { - if (u < s) return; - u < f && (f = u) - } - return s > 0 && (t[0] = a + s * l, t[1] = c + s * h), f < 1 && (n[0] = a + f * l, n[1] = c + f * h), !0 - } - } - } - } - }, - Jd = function (t, n) { - return dd(t[0] - n[0]) < ad && dd(t[1] - n[1]) < ad - }, - Qd = function (t, n, e, r, i) { - var o, u, a = [], - c = []; - if (t.forEach(function (t) { - if (!((n = t.length - 1) <= 0)) { - var n, e, r = t[0], - u = t[n]; - if (Jd(r, u)) { - for (i.lineStart(), o = 0; o < n; ++o) i.point((r = t[o])[0], r[1]); - i.lineEnd() - } else a.push(e = new Ir(r, t, null, !0)), c.push(e.o = new Ir(r, null, e, !1)), a.push(e = new Ir(u, t, null, !1)), c.push(e.o = new Ir(u, null, e, !0)) - } - }), a.length) { - for (c.sort(n), Yr(a), Yr(c), o = 0, u = c.length; o < u; ++o) c[o].e = e = !e; - for (var s, f, l = a[0];;) { - for (var h = l, p = !0; h.v;) - if ((h = h.n) === l) return; - s = h.z, i.lineStart(); - do { - if (h.v = h.o.v = !0, h.e) { - if (p) - for (o = 0, u = s.length; o < u; ++o) i.point((f = s[o])[0], f[1]); - else r(h.x, h.n.x, 1, i); - h = h.n - } else { - if (p) - for (s = h.p.z, o = s.length - 1; o >= 0; --o) i.point((f = s[o])[0], f[1]); - else r(h.x, h.p.x, -1, i); - h = h.p - } - s = (h = h.o).z, p = !p - } while (!h.v); - i.lineEnd() - } - } - }, - Kd = 1e9, - tv = -Kd, - nv = Ep(), - ev = function (t, n) { - var e = n[0], - r = n[1], - i = [wd(e), -yd(e), 0], - o = 0, - u = 0; - nv.reset(); - for (var a = 0, c = t.length; a < c; ++a) - if (f = (s = t[a]).length) - for (var s, f, l = s[f - 1], h = l[0], p = l[1] / 2 + fd, d = wd(p), v = yd(p), _ = 0; _ < f; ++_, h = g, d = x, v = b, l = y) { - var y = s[_], - g = y[0], - m = y[1] / 2 + fd, - x = wd(m), - b = yd(m), - w = g - h, - M = w >= 0 ? 1 : -1, - T = M * w, - k = T > cd, - N = d * x; - if (nv.add(_d(N * M * wd(T), v * b + N * yd(T))), o += k ? w + M * ld : w, k ^ h >= e ^ g >= e) { - var S = sr(ar(l), ar(y)); - hr(S); - var E = sr(i, S); - hr(E); - var A = (k ^ w >= 0 ? -1 : 1) * Ge(E[2]); - (r > A || r === A && (S[0] || S[1])) && (u += k ^ w >= 0 ? 1 : -1) - } - } - return (o < -ad || o < ad && nv < -ad) ^ 1 & u - }, - rv = Ep(), - iv = { - sphere: Qe, - point: Qe, - lineStart: function () { - iv.point = Hr, iv.lineEnd = jr - }, - lineEnd: Qe, - polygonStart: Qe, - polygonEnd: Qe - }, - ov = function (t) { - return rv.reset(), Ed(t, iv), +rv - }, - uv = [null, null], - av = { - type: "LineString", - coordinates: uv - }, - cv = function (t, n) { - return uv[0] = t, uv[1] = n, ov(av) - }, - sv = { - Feature: function (t, n) { - return $r(t.geometry, n) - }, - FeatureCollection: function (t, n) { - for (var e = t.features, r = -1, i = e.length; ++r < i;) - if ($r(e[r].geometry, n)) return !0; - return !1 - } - }, - fv = { - Sphere: function () { - return !0 - }, - Point: function (t, n) { - return Vr(t.coordinates, n) - }, - MultiPoint: function (t, n) { - for (var e = t.coordinates, r = -1, i = e.length; ++r < i;) - if (Vr(e[r], n)) return !0; - return !1 - }, - LineString: function (t, n) { - return Wr(t.coordinates, n) - }, - MultiLineString: function (t, n) { - for (var e = t.coordinates, r = -1, i = e.length; ++r < i;) - if (Wr(e[r], n)) return !0; - return !1 - }, - Polygon: function (t, n) { - return Zr(t.coordinates, n) - }, - MultiPolygon: function (t, n) { - for (var e = t.coordinates, r = -1, i = e.length; ++r < i;) - if (Zr(e[r], n)) return !0; - return !1 - }, - GeometryCollection: function (t, n) { - for (var e = t.geometries, r = -1, i = e.length; ++r < i;) - if ($r(e[r], n)) return !0; - return !1 - } - }, - lv = function (t) { - return t - }, - hv = Ep(), - pv = Ep(), - dv = { - point: Qe, - lineStart: Qe, - lineEnd: Qe, - polygonStart: function () { - dv.lineStart = ni, dv.lineEnd = ii - }, - polygonEnd: function () { - dv.lineStart = dv.lineEnd = dv.point = Qe, hv.add(dd(pv)), pv.reset() - }, - result: function () { - var t = hv / 2; - return hv.reset(), t - } - }, - vv = 1 / 0, - _v = vv, - yv = -vv, - gv = yv, - mv = { - point: function (t, n) { - t < vv && (vv = t), t > yv && (yv = t), n < _v && (_v = n), n > gv && (gv = n) - }, - lineStart: Qe, - lineEnd: Qe, - polygonStart: Qe, - polygonEnd: Qe, - result: function () { - var t = [ - [vv, _v], - [yv, gv] - ]; - return yv = gv = -(_v = vv = 1 / 0), t - } - }, - xv = 0, - bv = 0, - wv = 0, - Mv = 0, - Tv = 0, - kv = 0, - Nv = 0, - Sv = 0, - Ev = 0, - Av = { - point: oi, - lineStart: ui, - lineEnd: si, - polygonStart: function () { - Av.lineStart = fi, Av.lineEnd = li - }, - polygonEnd: function () { - Av.point = oi, Av.lineStart = ui, Av.lineEnd = si - }, - result: function () { - var t = Ev ? [Nv / Ev, Sv / Ev] : kv ? [Mv / kv, Tv / kv] : wv ? [xv / wv, bv / wv] : [NaN, NaN]; - return xv = bv = wv = Mv = Tv = kv = Nv = Sv = Ev = 0, t - } - }; - di.prototype = { - _radius: 4.5, - pointRadius: function (t) { - return this._radius = t, this - }, - polygonStart: function () { - this._line = 0 - }, - polygonEnd: function () { - this._line = NaN - }, - lineStart: function () { - this._point = 0 - }, - lineEnd: function () { - 0 === this._line && this._context.closePath(), this._point = NaN - }, - point: function (t, n) { - switch (this._point) { - case 0: - this._context.moveTo(t, n), this._point = 1; - break; - case 1: - this._context.lineTo(t, n); - break; - default: - this._context.moveTo(t + this._radius, n), this._context.arc(t, n, this._radius, 0, ld) - } - }, - result: Qe - }; - var Cv, zv, Pv, Rv, Lv, qv = Ep(), - Uv = { - point: Qe, - lineStart: function () { - Uv.point = vi - }, - lineEnd: function () { - Cv && _i(zv, Pv), Uv.point = Qe - }, - polygonStart: function () { - Cv = !0 - }, - polygonEnd: function () { - Cv = null - }, - result: function () { - var t = +qv; - return qv.reset(), t - } - }; - yi.prototype = { - _radius: 4.5, - _circle: gi(4.5), - pointRadius: function (t) { - return (t = +t) !== this._radius && (this._radius = t, this._circle = null), this - }, - polygonStart: function () { - this._line = 0 - }, - polygonEnd: function () { - this._line = NaN - }, - lineStart: function () { - this._point = 0 - }, - lineEnd: function () { - 0 === this._line && this._string.push("Z"), this._point = NaN - }, - point: function (t, n) { - switch (this._point) { - case 0: - this._string.push("M", t, ",", n), this._point = 1; - break; - case 1: - this._string.push("L", t, ",", n); - break; - default: - null == this._circle && (this._circle = gi(this._radius)), this._string.push("M", t, ",", n, this._circle) - } - }, - result: function () { - if (this._string.length) { - var t = this._string.join(""); - return this._string = [], t - } - return null - } - }; - var Dv = function (t, n, e, r) { - return function (i, o) { - function u(n, e) { - var r = i(n, e); - t(n = r[0], e = r[1]) && o.point(n, e) - } - - function a(t, n) { - var e = i(t, n); - _.point(e[0], e[1]) - } - - function c() { - b.point = a, _.lineStart() - } - - function s() { - b.point = u, _.lineEnd() - } - - function f(t, n) { - v.push([t, n]); - var e = i(t, n); - m.point(e[0], e[1]) - } - - function l() { - m.lineStart(), v = [] - } - - function h() { - f(v[0][0], v[0][1]), m.lineEnd(); - var t, n, e, r, i = m.clean(), - u = g.result(), - a = u.length; - if (v.pop(), p.push(v), v = null, a) - if (1 & i) { - if (e = u[0], (n = e.length - 1) > 0) { - for (x || (o.polygonStart(), x = !0), o.lineStart(), t = 0; t < n; ++t) o.point((r = e[t])[0], r[1]); - o.lineEnd() - } - } else a > 1 && 2 & i && u.push(u.pop().concat(u.shift())), d.push(u.filter(mi)) - } - var p, d, v, _ = n(o), - y = i.invert(r[0], r[1]), - g = Zd(), - m = n(g), - x = !1, - b = { - point: u, - lineStart: c, - lineEnd: s, - polygonStart: function () { - b.point = f, b.lineStart = l, b.lineEnd = h, d = [], p = [] - }, - polygonEnd: function () { - b.point = u, b.lineStart = c, b.lineEnd = s, d = Cs(d); - var t = ev(p, y); - d.length ? (x || (o.polygonStart(), x = !0), Qd(d, xi, t, e, o)) : t && (x || (o.polygonStart(), x = !0), o.lineStart(), e(null, null, 1, o), o.lineEnd()), x && (o.polygonEnd(), x = !1), d = p = null - }, - sphere: function () { - o.polygonStart(), o.lineStart(), e(null, null, 1, o), o.lineEnd(), o.polygonEnd() - } - }; - return b - } - }, - Ov = Dv(function () { - return !0 - }, function (t) { - var n, e = NaN, - r = NaN, - i = NaN; - return { - lineStart: function () { - t.lineStart(), n = 1 - }, - point: function (o, u) { - var a = o > 0 ? cd : -cd, - c = dd(o - e); - dd(c - cd) < ad ? (t.point(e, r = (r + u) / 2 > 0 ? sd : -sd), t.point(i, r), t.lineEnd(), t.lineStart(), t.point(a, r), t.point(o, r), n = 0) : i !== a && c >= cd && (dd(e - i) < ad && (e -= i * ad), dd(o - a) < ad && (o -= a * ad), r = bi(e, r, o, u), t.point(i, r), t.lineEnd(), t.lineStart(), t.point(a, r), n = 0), t.point(e = o, r = u), i = a - }, - lineEnd: function () { - t.lineEnd(), e = r = NaN - }, - clean: function () { - return 2 - n - } - } - }, function (t, n, e, r) { - var i; - if (null == t) i = e * sd, r.point(-cd, i), r.point(0, i), r.point(cd, i), r.point(cd, 0), r.point(cd, -i), r.point(0, -i), r.point(-cd, -i), r.point(-cd, 0), r.point(-cd, i); - else if (dd(t[0] - n[0]) > ad) { - var o = t[0] < n[0] ? cd : -cd; - i = e * o / 2, r.point(-o, i), r.point(0, i), r.point(o, i) - } else r.point(n[0], n[1]) - }, [-cd, -sd]), - Fv = function (t, n) { - function e(t, n) { - return yd(t) * yd(n) > o - } - - function r(t, n, e) { - var r = [1, 0, 0], - i = sr(ar(t), ar(n)), - u = cr(i, i), - a = i[0], - c = u - a * a; - if (!c) return !e && t; - var s = o * u / c, - f = -o * a / c, - l = sr(r, i), - h = lr(r, s); - fr(h, lr(i, f)); - var p = l, - d = cr(h, p), - v = cr(p, p), - _ = d * d - v * (cr(h, h) - 1); - if (!(_ < 0)) { - var y = Td(_), - g = lr(p, (-d - y) / v); - if (fr(g, h), g = ur(g), !e) return g; - var m, x = t[0], - b = n[0], - w = t[1], - M = n[1]; - b < x && (m = x, x = b, b = m); - var T = b - x, - k = dd(T - cd) < ad, - N = k || T < ad; - if (!k && M < w && (m = w, w = M, M = m), N ? k ? w + M > 0 ^ g[1] < (dd(g[0] - x) < ad ? w : M) : w <= g[1] && g[1] <= M : T > cd ^ (x <= g[0] && g[0] <= b)) { - var S = lr(p, (-d + y) / v); - return fr(S, h), [g, ur(S)] - } - } - } - - function i(n, e) { - var r = u ? t : cd - t, - i = 0; - return n < -r ? i |= 1 : n > r && (i |= 2), e < -r ? i |= 4 : e > r && (i |= 8), i - } - var o = yd(t), - u = o > 0, - a = dd(o) > ad; - return Dv(e, function (t) { - var n, o, c, s, f; - return { - lineStart: function () { - s = c = !1, f = 1 - }, - point: function (l, h) { - var p, d = [l, h], - v = e(l, h), - _ = u ? v ? 0 : i(l, h) : v ? i(l + (l < 0 ? cd : -cd), h) : 0; - if (!n && (s = c = v) && t.lineStart(), v !== c && (!(p = r(n, d)) || Jd(n, p) || Jd(d, p)) && (d[0] += ad, d[1] += ad, v = e(d[0], d[1])), v !== c) f = 0, v ? (t.lineStart(), p = r(d, n), t.point(p[0], p[1])) : (p = r(n, d), t.point(p[0], p[1]), t.lineEnd()), n = p; - else if (a && n && u ^ v) { - var y; - _ & o || !(y = r(d, n, !0)) || (f = 0, u ? (t.lineStart(), t.point(y[0][0], y[0][1]), t.point(y[1][0], y[1][1]), t.lineEnd()) : (t.point(y[1][0], y[1][1]), t.lineEnd(), t.lineStart(), t.point(y[0][0], y[0][1]))) - }!v || n && Jd(n, d) || t.point(d[0], d[1]), n = d, c = v, o = _ - }, - lineEnd: function () { - c && t.lineEnd(), n = null - }, - clean: function () { - return f | (s && c) << 1 - } - } - }, function (e, r, i, o) { - Or(o, t, n, i, e, r) - }, u ? [0, -t] : [-cd, t - cd]) - }; - Mi.prototype = { - constructor: Mi, - point: function (t, n) { - this.stream.point(t, n) - }, - sphere: function () { - this.stream.sphere() - }, - lineStart: function () { - this.stream.lineStart() - }, - lineEnd: function () { - this.stream.lineEnd() - }, - polygonStart: function () { - this.stream.polygonStart() - }, - polygonEnd: function () { - this.stream.polygonEnd() - } - }; - var Iv = 16, - Yv = yd(30 * pd), - Bv = function (t, n) { - return +n ? Si(t, n) : Ni(t) - }, - jv = wi({ - point: function (t, n) { - this.stream.point(t * pd, n * pd) - } - }), - Hv = function () { - return Ci(Pi).scale(155.424).center([0, 33.6442]) - }, - Xv = function () { - return Hv().parallels([29.5, 45.5]).scale(1070).translate([480, 250]).rotate([96, 0]).center([-.6, 38.7]) - }, - $v = Li(function (t) { - return Td(2 / (1 + t)) - }); - $v.invert = qi(function (t) { - return 2 * Ge(t / 2) - }); - var Vv = Li(function (t) { - return (t = Ze(t)) && t / wd(t) - }); - Vv.invert = qi(function (t) { - return t - }); - Ui.invert = function (t, n) { - return [t, 2 * vd(md(n)) - sd] - }; - Ii.invert = Ii; - Bi.invert = qi(vd); - Hi.invert = qi(Ge); - Xi.invert = qi(function (t) { - return 2 * vd(t) - }); - $i.invert = function (t, n) { - return [-n, 2 * vd(md(t)) - sd] - }; - uo.prototype = eo.prototype = { - constructor: uo, - count: function () { - return this.eachAfter(to) - }, - each: function (t) { - var n, e, r, i, o = this, - u = [o]; - do { - for (n = u.reverse(), u = []; o = n.pop();) - if (t(o), e = o.children) - for (r = 0, i = e.length; r < i; ++r) u.push(e[r]) - } while (u.length); - return this - }, - eachAfter: function (t) { - for (var n, e, r, i = this, o = [i], u = []; i = o.pop();) - if (u.push(i), n = i.children) - for (e = 0, r = n.length; e < r; ++e) o.push(n[e]); - for (; i = u.pop();) t(i); - return this - }, - eachBefore: function (t) { - for (var n, e, r = this, i = [r]; r = i.pop();) - if (t(r), n = r.children) - for (e = n.length - 1; e >= 0; --e) i.push(n[e]); - return this - }, - sum: function (t) { - return this.eachAfter(function (n) { - for (var e = +t(n.data) || 0, r = n.children, i = r && r.length; --i >= 0;) e += r[i].value; - n.value = e - }) - }, - sort: function (t) { - return this.eachBefore(function (n) { - n.children && n.children.sort(t) - }) - }, - path: function (t) { - for (var n = this, e = no(n, t), r = [n]; n !== e;) n = n.parent, r.push(n); - for (var i = r.length; t !== e;) r.splice(i, 0, t), t = t.parent; - return r - }, - ancestors: function () { - for (var t = this, n = [t]; t = t.parent;) n.push(t); - return n - }, - descendants: function () { - var t = []; - return this.each(function (n) { - t.push(n) - }), t - }, - leaves: function () { - var t = []; - return this.eachBefore(function (n) { - n.children || t.push(n) - }), t - }, - links: function () { - var t = this, - n = []; - return t.each(function (e) { - e !== t && n.push({ - source: e.parent, - target: e - }) - }), n - }, - copy: function () { - return eo(this).eachBefore(io) - } - }; - var Wv = Array.prototype.slice, - Zv = function (t) { - for (var n, e, r = 0, i = (t = ao(Wv.call(t))).length, o = []; r < i;) n = t[r], e && fo(e, n) ? ++r : (e = ho(o = co(o, n)), r = 0); - return e - }, - Gv = function (t) { - return function () { - return t - } - }, - Jv = function (t) { - t.x0 = Math.round(t.x0), t.y0 = Math.round(t.y0), t.x1 = Math.round(t.x1), t.y1 = Math.round(t.y1) - }, - Qv = function (t, n, e, r, i) { - for (var o, u = t.children, a = -1, c = u.length, s = t.value && (r - n) / t.value; ++a < c;)(o = u[a]).y0 = e, o.y1 = i, o.x0 = n, o.x1 = n += o.value * s - }, - Kv = "$", - t_ = { - depth: -1 - }, - n_ = {}; - Do.prototype = Object.create(uo.prototype); - var e_ = function (t, n, e, r, i) { - for (var o, u = t.children, a = -1, c = u.length, s = t.value && (i - e) / t.value; ++a < c;)(o = u[a]).x0 = n, o.x1 = r, o.y0 = e, o.y1 = e += o.value * s - }, - r_ = (1 + Math.sqrt(5)) / 2, - i_ = function t(n) { - function e(t, e, r, i, o) { - Fo(n, t, e, r, i, o) - } - return e.ratio = function (n) { - return t((n = +n) > 1 ? n : 1) - }, e - }(r_), - o_ = function t(n) { - function e(t, e, r, i, o) { - if ((u = t._squarify) && u.ratio === n) - for (var u, a, c, s, f, l = -1, h = u.length, p = t.value; ++l < h;) { - for (c = (a = u[l]).children, s = a.value = 0, f = c.length; s < f; ++s) a.value += c[s].value; - a.dice ? Qv(a, e, r, i, r += (o - r) * a.value / p) : e_(a, e, r, e += (i - e) * a.value / p, o), p -= a.value - } else t._squarify = u = Fo(n, t, e, r, i, o), u.ratio = n - } - return e.ratio = function (n) { - return t((n = +n) > 1 ? n : 1) - }, e - }(r_), - u_ = function (t, n, e) { - return (n[0] - t[0]) * (e[1] - t[1]) - (n[1] - t[1]) * (e[0] - t[0]) - }, - a_ = [].slice, - c_ = {}; - Bo.prototype = Wo.prototype = { - constructor: Bo, - defer: function (t) { - if ("function" != typeof t) throw new Error("invalid callback"); - if (this._call) throw new Error("defer after await"); - if (null != this._error) return this; - var n = a_.call(arguments, 1); - return n.push(t), ++this._waiting, this._tasks.push(n), jo(this), this - }, - abort: function () { - return null == this._error && $o(this, new Error("abort")), this - }, - await: function (t) { - if ("function" != typeof t) throw new Error("invalid callback"); - if (this._call) throw new Error("multiple await"); - return this._call = function (n, e) { - t.apply(null, [n].concat(e)) - }, Vo(this), this - }, - awaitAll: function (t) { - if ("function" != typeof t) throw new Error("invalid callback"); - if (this._call) throw new Error("multiple await"); - return this._call = t, Vo(this), this - } - }; - var s_ = function () { - return Math.random() - }, - f_ = function t(n) { - function e(t, e) { - return t = null == t ? 0 : +t, e = null == e ? 1 : +e, 1 === arguments.length ? (e = t, t = 0) : e -= t, - function () { - return n() * e + t - } - } - return e.source = t, e - }(s_), - l_ = function t(n) { - function e(t, e) { - var r, i; - return t = null == t ? 0 : +t, e = null == e ? 1 : +e, - function () { - var o; - if (null != r) o = r, r = null; - else - do { - r = 2 * n() - 1, o = 2 * n() - 1, i = r * r + o * o - } while (!i || i > 1); - return t + e * o * Math.sqrt(-2 * Math.log(i) / i) - } - } - return e.source = t, e - }(s_), - h_ = function t(n) { - function e() { - var t = l_.source(n).apply(this, arguments); - return function () { - return Math.exp(t()) - } - } - return e.source = t, e - }(s_), - p_ = function t(n) { - function e(t) { - return function () { - for (var e = 0, r = 0; r < t; ++r) e += n(); - return e - } - } - return e.source = t, e - }(s_), - d_ = function t(n) { - function e(t) { - var e = p_.source(n)(t); - return function () { - return e() / t - } - } - return e.source = t, e - }(s_), - v_ = function t(n) { - function e(t) { - return function () { - return -Math.log(1 - n()) / t - } - } - return e.source = t, e - }(s_), - __ = function (t, n) { - function e(t) { - var n, e = s.status; - if (!e && Go(s) || e >= 200 && e < 300 || 304 === e) { - if (o) try { - n = o.call(r, s) - } catch (t) { - return void a.call("error", r, t) - } else n = s; - a.call("load", r, n) - } else a.call("error", r, t) - } - var r, i, o, u, a = h("beforesend", "progress", "load", "error"), - c = we(), - s = new XMLHttpRequest, - f = null, - l = null, - p = 0; - if ("undefined" == typeof XDomainRequest || "withCredentials" in s || !/^(http(s)?:)?\/\//.test(t) || (s = new XDomainRequest), "onload" in s ? s.onload = s.onerror = s.ontimeout = e : s.onreadystatechange = function (t) { - s.readyState > 3 && e(t) - }, s.onprogress = function (t) { - a.call("progress", r, t) - }, r = { - header: function (t, n) { - return t = (t + "").toLowerCase(), arguments.length < 2 ? c.get(t) : (null == n ? c.remove(t) : c.set(t, n + ""), r) - }, - mimeType: function (t) { - return arguments.length ? (i = null == t ? null : t + "", r) : i - }, - responseType: function (t) { - return arguments.length ? (u = t, r) : u - }, - timeout: function (t) { - return arguments.length ? (p = +t, r) : p - }, - user: function (t) { - return arguments.length < 1 ? f : (f = null == t ? null : t + "", r) - }, - password: function (t) { - return arguments.length < 1 ? l : (l = null == t ? null : t + "", r) - }, - response: function (t) { - return o = t, r - }, - get: function (t, n) { - return r.send("GET", t, n) - }, - post: function (t, n) { - return r.send("POST", t, n) - }, - send: function (n, e, o) { - return s.open(n, t, !0, f, l), null == i || c.has("accept") || c.set("accept", i + ",*/*"), s.setRequestHeader && c.each(function (t, n) { - s.setRequestHeader(n, t) - }), null != i && s.overrideMimeType && s.overrideMimeType(i), null != u && (s.responseType = u), p > 0 && (s.timeout = p), null == o && "function" == typeof e && (o = e, e = null), null != o && 1 === o.length && (o = Zo(o)), null != o && r.on("error", o).on("load", function (t) { - o(null, t) - }), a.call("beforesend", r, s), s.send(null == e ? null : e), r - }, - abort: function () { - return s.abort(), r - }, - on: function () { - var t = a.on.apply(a, arguments); - return t === a ? r : t - } - }, null != n) { - if ("function" != typeof n) throw new Error("invalid callback: " + n); - return r.get(n) - } - return r - }, - y_ = function (t, n) { - return function (e, r) { - var i = __(e).mimeType(t).response(n); - if (null != r) { - if ("function" != typeof r) throw new Error("invalid callback: " + r); - return i.get(r) - } - return i - } - }, - g_ = y_("text/html", function (t) { - return document.createRange().createContextualFragment(t.responseText) - }), - m_ = y_("application/json", function (t) { - return JSON.parse(t.responseText) - }), - x_ = y_("text/plain", function (t) { - return t.responseText - }), - b_ = y_("application/xml", function (t) { - var n = t.responseXML; - if (!n) throw new Error("parse error"); - return n - }), - w_ = function (t, n) { - return function (e, r, i) { - arguments.length < 3 && (i = r, r = null); - var o = __(e).mimeType(t); - return o.row = function (t) { - return arguments.length ? o.response(Jo(n, r = t)) : r - }, o.row(r), i ? o.get(i) : o - } - }, - M_ = w_("text/csv", Qh), - T_ = w_("text/tab-separated-values", rp), - k_ = Array.prototype, - N_ = k_.map, - S_ = k_.slice, - E_ = { - name: "implicit" - }, - A_ = function (t) { - return function () { - return t - } - }, - C_ = function (t) { - return +t - }, - z_ = [0, 1], - P_ = function (n, e, r) { - var o, u = n[0], - a = n[n.length - 1], - c = i(u, a, null == e ? 10 : e); - switch ((r = He(null == r ? ",f" : r)).type) { - case "s": - var s = Math.max(Math.abs(u), Math.abs(a)); - return null != r.precision || isNaN(o = Np(c, s)) || (r.precision = o), t.formatPrefix(r, s); - case "": - case "e": - case "g": - case "p": - case "r": - null != r.precision || isNaN(o = Sp(c, Math.max(Math.abs(u), Math.abs(a)))) || (r.precision = o - ("e" === r.type)); - break; - case "f": - case "%": - null != r.precision || isNaN(o = kp(c)) || (r.precision = o - 2 * ("%" === r.type)) - } - return t.format(r) - }, - R_ = function (t, n) { - var e, r = 0, - i = (t = t.slice()).length - 1, - o = t[r], - u = t[i]; - return u < o && (e = r, r = i, i = e, e = o, o = u, u = e), t[r] = n.floor(o), t[i] = n.ceil(u), t - }, - L_ = new Date, - q_ = new Date, - U_ = Mu(function () {}, function (t, n) { - t.setTime(+t + n) - }, function (t, n) { - return n - t - }); - U_.every = function (t) { - return t = Math.floor(t), isFinite(t) && t > 0 ? t > 1 ? Mu(function (n) { - n.setTime(Math.floor(n / t) * t) - }, function (n, e) { - n.setTime(+n + e * t) - }, function (n, e) { - return (e - n) / t - }) : U_ : null - }; - var D_ = U_.range, - O_ = 6e4, - F_ = 6048e5, - I_ = Mu(function (t) { - t.setTime(1e3 * Math.floor(t / 1e3)) - }, function (t, n) { - t.setTime(+t + 1e3 * n) - }, function (t, n) { - return (n - t) / 1e3 - }, function (t) { - return t.getUTCSeconds() - }), - Y_ = I_.range, - B_ = Mu(function (t) { - t.setTime(Math.floor(t / O_) * O_) - }, function (t, n) { - t.setTime(+t + n * O_) - }, function (t, n) { - return (n - t) / O_ - }, function (t) { - return t.getMinutes() - }), - j_ = B_.range, - H_ = Mu(function (t) { - var n = t.getTimezoneOffset() * O_ % 36e5; - n < 0 && (n += 36e5), t.setTime(36e5 * Math.floor((+t - n) / 36e5) + n) - }, function (t, n) { - t.setTime(+t + 36e5 * n) - }, function (t, n) { - return (n - t) / 36e5 - }, function (t) { - return t.getHours() - }), - X_ = H_.range, - $_ = Mu(function (t) { - t.setHours(0, 0, 0, 0) - }, function (t, n) { - t.setDate(t.getDate() + n) - }, function (t, n) { - return (n - t - (n.getTimezoneOffset() - t.getTimezoneOffset()) * O_) / 864e5 - }, function (t) { - return t.getDate() - 1 - }), - V_ = $_.range, - W_ = Tu(0), - Z_ = Tu(1), - G_ = Tu(2), - J_ = Tu(3), - Q_ = Tu(4), - K_ = Tu(5), - ty = Tu(6), - ny = W_.range, - ey = Z_.range, - ry = G_.range, - iy = J_.range, - oy = Q_.range, - uy = K_.range, - ay = ty.range, - cy = Mu(function (t) { - t.setDate(1), t.setHours(0, 0, 0, 0) - }, function (t, n) { - t.setMonth(t.getMonth() + n) - }, function (t, n) { - return n.getMonth() - t.getMonth() + 12 * (n.getFullYear() - t.getFullYear()) - }, function (t) { - return t.getMonth() - }), - sy = cy.range, - fy = Mu(function (t) { - t.setMonth(0, 1), t.setHours(0, 0, 0, 0) - }, function (t, n) { - t.setFullYear(t.getFullYear() + n) - }, function (t, n) { - return n.getFullYear() - t.getFullYear() - }, function (t) { - return t.getFullYear() - }); - fy.every = function (t) { - return isFinite(t = Math.floor(t)) && t > 0 ? Mu(function (n) { - n.setFullYear(Math.floor(n.getFullYear() / t) * t), n.setMonth(0, 1), n.setHours(0, 0, 0, 0) - }, function (n, e) { - n.setFullYear(n.getFullYear() + e * t) - }) : null - }; - var ly = fy.range, - hy = Mu(function (t) { - t.setUTCSeconds(0, 0) - }, function (t, n) { - t.setTime(+t + n * O_) - }, function (t, n) { - return (n - t) / O_ - }, function (t) { - return t.getUTCMinutes() - }), - py = hy.range, - dy = Mu(function (t) { - t.setUTCMinutes(0, 0, 0) - }, function (t, n) { - t.setTime(+t + 36e5 * n) - }, function (t, n) { - return (n - t) / 36e5 - }, function (t) { - return t.getUTCHours() - }), - vy = dy.range, - _y = Mu(function (t) { - t.setUTCHours(0, 0, 0, 0) - }, function (t, n) { - t.setUTCDate(t.getUTCDate() + n) - }, function (t, n) { - return (n - t) / 864e5 - }, function (t) { - return t.getUTCDate() - 1 - }), - yy = _y.range, - gy = ku(0), - my = ku(1), - xy = ku(2), - by = ku(3), - wy = ku(4), - My = ku(5), - Ty = ku(6), - ky = gy.range, - Ny = my.range, - Sy = xy.range, - Ey = by.range, - Ay = wy.range, - Cy = My.range, - zy = Ty.range, - Py = Mu(function (t) { - t.setUTCDate(1), t.setUTCHours(0, 0, 0, 0) - }, function (t, n) { - t.setUTCMonth(t.getUTCMonth() + n) - }, function (t, n) { - return n.getUTCMonth() - t.getUTCMonth() + 12 * (n.getUTCFullYear() - t.getUTCFullYear()) - }, function (t) { - return t.getUTCMonth() - }), - Ry = Py.range, - Ly = Mu(function (t) { - t.setUTCMonth(0, 1), t.setUTCHours(0, 0, 0, 0) - }, function (t, n) { - t.setUTCFullYear(t.getUTCFullYear() + n) - }, function (t, n) { - return n.getUTCFullYear() - t.getUTCFullYear() - }, function (t) { - return t.getUTCFullYear() - }); - Ly.every = function (t) { - return isFinite(t = Math.floor(t)) && t > 0 ? Mu(function (n) { - n.setUTCFullYear(Math.floor(n.getUTCFullYear() / t) * t), n.setUTCMonth(0, 1), n.setUTCHours(0, 0, 0, 0) - }, function (n, e) { - n.setUTCFullYear(n.getUTCFullYear() + e * t) - }) : null - }; - var qy, Uy = Ly.range, - Dy = { - "-": "", - _: " ", - 0: "0" - }, - Oy = /^\s*\d+/, - Fy = /^%/, - Iy = /[\\\^\$\*\+\?\|\[\]\(\)\.\{\}]/g; - Ma({ - dateTime: "%x, %X", - date: "%-m/%-d/%Y", - time: "%-I:%M:%S %p", - periods: ["AM", "PM"], - days: ["Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"], - shortDays: ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"], - months: ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"], - shortMonths: ["Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec"] - }); - var Yy = Date.prototype.toISOString ? function (t) { - return t.toISOString() - } : t.utcFormat("%Y-%m-%dT%H:%M:%S.%LZ"), - By = +new Date("2000-01-01T00:00:00.000Z") ? function (t) { - var n = new Date(t); - return isNaN(n) ? null : n - } : t.utcParse("%Y-%m-%dT%H:%M:%S.%LZ"), - jy = 1e3, - Hy = 60 * jy, - Xy = 60 * Hy, - $y = 24 * Xy, - Vy = 7 * $y, - Wy = 30 * $y, - Zy = 365 * $y, - Gy = function (t) { - return t.match(/.{6}/g).map(function (t) { - return "#" + t - }) - }, - Jy = Gy("1f77b4ff7f0e2ca02cd627289467bd8c564be377c27f7f7fbcbd2217becf"), - Qy = Gy("393b795254a36b6ecf9c9ede6379398ca252b5cf6bcedb9c8c6d31bd9e39e7ba52e7cb94843c39ad494ad6616be7969c7b4173a55194ce6dbdde9ed6"), - Ky = Gy("3182bd6baed69ecae1c6dbefe6550dfd8d3cfdae6bfdd0a231a35474c476a1d99bc7e9c0756bb19e9ac8bcbddcdadaeb636363969696bdbdbdd9d9d9"), - tg = Gy("1f77b4aec7e8ff7f0effbb782ca02c98df8ad62728ff98969467bdc5b0d58c564bc49c94e377c2f7b6d27f7f7fc7c7c7bcbd22dbdb8d17becf9edae5"), - ng = wl($t(300, .5, 0), $t(-240, .5, 1)), - eg = wl($t(-100, .75, .35), $t(80, 1.5, .8)), - rg = wl($t(260, .75, .35), $t(80, 1.5, .8)), - ig = $t(), - og = Sa(Gy("44015444025645045745055946075a46085c460a5d460b5e470d60470e6147106347116447136548146748166848176948186a481a6c481b6d481c6e481d6f481f70482071482173482374482475482576482677482878482979472a7a472c7a472d7b472e7c472f7d46307e46327e46337f463480453581453781453882443983443a83443b84433d84433e85423f854240864241864142874144874045884046883f47883f48893e49893e4a893e4c8a3d4d8a3d4e8a3c4f8a3c508b3b518b3b528b3a538b3a548c39558c39568c38588c38598c375a8c375b8d365c8d365d8d355e8d355f8d34608d34618d33628d33638d32648e32658e31668e31678e31688e30698e306a8e2f6b8e2f6c8e2e6d8e2e6e8e2e6f8e2d708e2d718e2c718e2c728e2c738e2b748e2b758e2a768e2a778e2a788e29798e297a8e297b8e287c8e287d8e277e8e277f8e27808e26818e26828e26828e25838e25848e25858e24868e24878e23888e23898e238a8d228b8d228c8d228d8d218e8d218f8d21908d21918c20928c20928c20938c1f948c1f958b1f968b1f978b1f988b1f998a1f9a8a1e9b8a1e9c891e9d891f9e891f9f881fa0881fa1881fa1871fa28720a38620a48621a58521a68522a78522a88423a98324aa8325ab8225ac8226ad8127ad8128ae8029af7f2ab07f2cb17e2db27d2eb37c2fb47c31b57b32b67a34b67935b77937b87838b9773aba763bbb753dbc743fbc7340bd7242be7144bf7046c06f48c16e4ac16d4cc26c4ec36b50c46a52c56954c56856c66758c7655ac8645cc8635ec96260ca6063cb5f65cb5e67cc5c69cd5b6ccd5a6ece5870cf5773d05675d05477d1537ad1517cd2507fd34e81d34d84d44b86d54989d5488bd6468ed64590d74393d74195d84098d83e9bd93c9dd93ba0da39a2da37a5db36a8db34aadc32addc30b0dd2fb2dd2db5de2bb8de29bade28bddf26c0df25c2df23c5e021c8e020cae11fcde11dd0e11cd2e21bd5e21ad8e219dae319dde318dfe318e2e418e5e419e7e419eae51aece51befe51cf1e51df4e61ef6e620f8e621fbe723fde725")), - ug = Sa(Gy("00000401000501010601010802010902020b02020d03030f03031204041405041606051806051a07061c08071e0907200a08220b09240c09260d0a290e0b2b100b2d110c2f120d31130d34140e36150e38160f3b180f3d19103f1a10421c10441d11471e114920114b21114e22115024125325125527125829115a2a115c2c115f2d11612f116331116533106734106936106b38106c390f6e3b0f703d0f713f0f72400f74420f75440f764510774710784910784a10794c117a4e117b4f127b51127c52137c54137d56147d57157e59157e5a167e5c167f5d177f5f187f601880621980641a80651a80671b80681c816a1c816b1d816d1d816e1e81701f81721f817320817521817621817822817922827b23827c23827e24828025828125818326818426818627818827818928818b29818c29818e2a81902a81912b81932b80942c80962c80982d80992d809b2e7f9c2e7f9e2f7fa02f7fa1307ea3307ea5317ea6317da8327daa337dab337cad347cae347bb0357bb2357bb3367ab5367ab73779b83779ba3878bc3978bd3977bf3a77c03a76c23b75c43c75c53c74c73d73c83e73ca3e72cc3f71cd4071cf4070d0416fd2426fd3436ed5446dd6456cd8456cd9466bdb476adc4869de4968df4a68e04c67e24d66e34e65e44f64e55064e75263e85362e95462ea5661eb5760ec5860ed5a5fee5b5eef5d5ef05f5ef1605df2625df2645cf3655cf4675cf4695cf56b5cf66c5cf66e5cf7705cf7725cf8745cf8765cf9785df9795df97b5dfa7d5efa7f5efa815ffb835ffb8560fb8761fc8961fc8a62fc8c63fc8e64fc9065fd9266fd9467fd9668fd9869fd9a6afd9b6bfe9d6cfe9f6dfea16efea36ffea571fea772fea973feaa74feac76feae77feb078feb27afeb47bfeb67cfeb77efeb97ffebb81febd82febf84fec185fec287fec488fec68afec88cfeca8dfecc8ffecd90fecf92fed194fed395fed597fed799fed89afdda9cfddc9efddea0fde0a1fde2a3fde3a5fde5a7fde7a9fde9aafdebacfcecaefceeb0fcf0b2fcf2b4fcf4b6fcf6b8fcf7b9fcf9bbfcfbbdfcfdbf")), - ag = Sa(Gy("00000401000501010601010802010a02020c02020e03021004031204031405041706041907051b08051d09061f0a07220b07240c08260d08290e092b10092d110a30120a32140b34150b37160b39180c3c190c3e1b0c411c0c431e0c451f0c48210c4a230c4c240c4f260c51280b53290b552b0b572d0b592f0a5b310a5c320a5e340a5f3609613809623909633b09643d09653e0966400a67420a68440a68450a69470b6a490b6a4a0c6b4c0c6b4d0d6c4f0d6c510e6c520e6d540f6d550f6d57106e59106e5a116e5c126e5d126e5f136e61136e62146e64156e65156e67166e69166e6a176e6c186e6d186e6f196e71196e721a6e741a6e751b6e771c6d781c6d7a1d6d7c1d6d7d1e6d7f1e6c801f6c82206c84206b85216b87216b88226a8a226a8c23698d23698f24699025689225689326679526679727669827669a28659b29649d29649f2a63a02a63a22b62a32c61a52c60a62d60a82e5fa92e5eab2f5ead305dae305cb0315bb1325ab3325ab43359b63458b73557b93556ba3655bc3754bd3853bf3952c03a51c13a50c33b4fc43c4ec63d4dc73e4cc83f4bca404acb4149cc4248ce4347cf4446d04545d24644d34743d44842d54a41d74b3fd84c3ed94d3dda4e3cdb503bdd513ade5238df5337e05536e15635e25734e35933e45a31e55c30e65d2fe75e2ee8602de9612bea632aeb6429eb6628ec6726ed6925ee6a24ef6c23ef6e21f06f20f1711ff1731df2741cf3761bf37819f47918f57b17f57d15f67e14f68013f78212f78410f8850ff8870ef8890cf98b0bf98c0af98e09fa9008fa9207fa9407fb9606fb9706fb9906fb9b06fb9d07fc9f07fca108fca309fca50afca60cfca80dfcaa0ffcac11fcae12fcb014fcb216fcb418fbb61afbb81dfbba1ffbbc21fbbe23fac026fac228fac42afac62df9c72ff9c932f9cb35f8cd37f8cf3af7d13df7d340f6d543f6d746f5d949f5db4cf4dd4ff4df53f4e156f3e35af3e55df2e661f2e865f2ea69f1ec6df1ed71f1ef75f1f179f2f27df2f482f3f586f3f68af4f88ef5f992f6fa96f8fb9af9fc9dfafda1fcffa4")), - cg = Sa(Gy("0d088710078813078916078a19068c1b068d1d068e20068f2206902406912605912805922a05932c05942e05952f059631059733059735049837049938049a3a049a3c049b3e049c3f049c41049d43039e44039e46039f48039f4903a04b03a14c02a14e02a25002a25102a35302a35502a45601a45801a45901a55b01a55c01a65e01a66001a66100a76300a76400a76600a76700a86900a86a00a86c00a86e00a86f00a87100a87201a87401a87501a87701a87801a87a02a87b02a87d03a87e03a88004a88104a78305a78405a78606a68707a68808a68a09a58b0aa58d0ba58e0ca48f0da4910ea3920fa39410a29511a19613a19814a099159f9a169f9c179e9d189d9e199da01a9ca11b9ba21d9aa31e9aa51f99a62098a72197a82296aa2395ab2494ac2694ad2793ae2892b02991b12a90b22b8fb32c8eb42e8db52f8cb6308bb7318ab83289ba3388bb3488bc3587bd3786be3885bf3984c03a83c13b82c23c81c33d80c43e7fc5407ec6417dc7427cc8437bc9447aca457acb4679cc4778cc4977cd4a76ce4b75cf4c74d04d73d14e72d24f71d35171d45270d5536fd5546ed6556dd7566cd8576bd9586ada5a6ada5b69db5c68dc5d67dd5e66de5f65de6164df6263e06363e16462e26561e26660e3685fe4695ee56a5de56b5de66c5ce76e5be76f5ae87059e97158e97257ea7457eb7556eb7655ec7754ed7953ed7a52ee7b51ef7c51ef7e50f07f4ff0804ef1814df1834cf2844bf3854bf3874af48849f48948f58b47f58c46f68d45f68f44f79044f79143f79342f89441f89540f9973ff9983ef99a3efa9b3dfa9c3cfa9e3bfb9f3afba139fba238fca338fca537fca636fca835fca934fdab33fdac33fdae32fdaf31fdb130fdb22ffdb42ffdb52efeb72dfeb82cfeba2cfebb2bfebd2afebe2afec029fdc229fdc328fdc527fdc627fdc827fdca26fdcb26fccd25fcce25fcd025fcd225fbd324fbd524fbd724fad824fada24f9dc24f9dd25f8df25f8e125f7e225f7e425f6e626f6e826f5e926f5eb27f4ed27f3ee27f3f027f2f227f1f426f1f525f0f724f0f921")), - sg = function (t) { - return function () { - return t - } - }, - fg = Math.abs, - lg = Math.atan2, - hg = Math.cos, - pg = Math.max, - dg = Math.min, - vg = Math.sin, - _g = Math.sqrt, - yg = 1e-12, - gg = Math.PI, - mg = gg / 2, - xg = 2 * gg; - Oa.prototype = { - areaStart: function () { - this._line = 0 - }, - areaEnd: function () { - this._line = NaN - }, - lineStart: function () { - this._point = 0 - }, - lineEnd: function () { - (this._line || 0 !== this._line && 1 === this._point) && this._context.closePath(), this._line = 1 - this._line - }, - point: function (t, n) { - switch (t = +t, n = +n, this._point) { - case 0: - this._point = 1, this._line ? this._context.lineTo(t, n) : this._context.moveTo(t, n); - break; - case 1: - this._point = 2; - default: - this._context.lineTo(t, n) - } - } - }; - var bg = function (t) { - return new Oa(t) - }, - wg = function () { - function t(t) { - var a, c, s, f = t.length, - l = !1; - for (null == i && (u = o(s = ve())), a = 0; a <= f; ++a) !(a < f && r(c = t[a], a, t)) === l && ((l = !l) ? u.lineStart() : u.lineEnd()), l && u.point(+n(c, a, t), +e(c, a, t)); - if (s) return u = null, s + "" || null - } - var n = Fa, - e = Ia, - r = sg(!0), - i = null, - o = bg, - u = null; - return t.x = function (e) { - return arguments.length ? (n = "function" == typeof e ? e : sg(+e), t) : n - }, t.y = function (n) { - return arguments.length ? (e = "function" == typeof n ? n : sg(+n), t) : e - }, t.defined = function (n) { - return arguments.length ? (r = "function" == typeof n ? n : sg(!!n), t) : r - }, t.curve = function (n) { - return arguments.length ? (o = n, null != i && (u = o(i)), t) : o - }, t.context = function (n) { - return arguments.length ? (null == n ? i = u = null : u = o(i = n), t) : i - }, t - }, - Mg = function () { - function t(t) { - var n, f, l, h, p, d = t.length, - v = !1, - _ = new Array(d), - y = new Array(d); - for (null == a && (s = c(p = ve())), n = 0; n <= d; ++n) { - if (!(n < d && u(h = t[n], n, t)) === v) - if (v = !v) f = n, s.areaStart(), s.lineStart(); - else { - for (s.lineEnd(), s.lineStart(), l = n - 1; l >= f; --l) s.point(_[l], y[l]); - s.lineEnd(), s.areaEnd() - } - v && (_[n] = +e(h, n, t), y[n] = +i(h, n, t), s.point(r ? +r(h, n, t) : _[n], o ? +o(h, n, t) : y[n])) - } - if (p) return s = null, p + "" || null - } - - function n() { - return wg().defined(u).curve(c).context(a) - } - var e = Fa, - r = null, - i = sg(0), - o = Ia, - u = sg(!0), - a = null, - c = bg, - s = null; - return t.x = function (n) { - return arguments.length ? (e = "function" == typeof n ? n : sg(+n), r = null, t) : e - }, t.x0 = function (n) { - return arguments.length ? (e = "function" == typeof n ? n : sg(+n), t) : e - }, t.x1 = function (n) { - return arguments.length ? (r = null == n ? null : "function" == typeof n ? n : sg(+n), t) : r - }, t.y = function (n) { - return arguments.length ? (i = "function" == typeof n ? n : sg(+n), o = null, t) : i - }, t.y0 = function (n) { - return arguments.length ? (i = "function" == typeof n ? n : sg(+n), t) : i - }, t.y1 = function (n) { - return arguments.length ? (o = null == n ? null : "function" == typeof n ? n : sg(+n), t) : o - }, t.lineX0 = t.lineY0 = function () { - return n().x(e).y(i) - }, t.lineY1 = function () { - return n().x(e).y(o) - }, t.lineX1 = function () { - return n().x(r).y(i) - }, t.defined = function (n) { - return arguments.length ? (u = "function" == typeof n ? n : sg(!!n), t) : u - }, t.curve = function (n) { - return arguments.length ? (c = n, null != a && (s = c(a)), t) : c - }, t.context = function (n) { - return arguments.length ? (null == n ? a = s = null : s = c(a = n), t) : a - }, t - }, - Tg = function (t, n) { - return n < t ? -1 : n > t ? 1 : n >= t ? 0 : NaN - }, - kg = function (t) { - return t - }, - Ng = Ba(bg); - Ya.prototype = { - areaStart: function () { - this._curve.areaStart() - }, - areaEnd: function () { - this._curve.areaEnd() - }, - lineStart: function () { - this._curve.lineStart() - }, - lineEnd: function () { - this._curve.lineEnd() - }, - point: function (t, n) { - this._curve.point(n * Math.sin(t), n * -Math.cos(t)) - } - }; - var Sg = function () { - return ja(wg().curve(Ng)) - }, - Eg = function () { - var t = Mg().curve(Ng), - n = t.curve, - e = t.lineX0, - r = t.lineX1, - i = t.lineY0, - o = t.lineY1; - return t.angle = t.x, delete t.x, t.startAngle = t.x0, delete t.x0, t.endAngle = t.x1, delete t.x1, t.radius = t.y, delete t.y, t.innerRadius = t.y0, delete t.y0, t.outerRadius = t.y1, delete t.y1, t.lineStartAngle = function () { - return ja(e()) - }, delete t.lineX0, t.lineEndAngle = function () { - return ja(r()) - }, delete t.lineX1, t.lineInnerRadius = function () { - return ja(i()) - }, delete t.lineY0, t.lineOuterRadius = function () { - return ja(o()) - }, delete t.lineY1, t.curve = function (t) { - return arguments.length ? n(Ba(t)) : n()._curve - }, t - }, - Ag = function (t, n) { - return [(n = +n) * Math.cos(t -= Math.PI / 2), n * Math.sin(t)] - }, - Cg = Array.prototype.slice, - zg = { - draw: function (t, n) { - var e = Math.sqrt(n / gg); - t.moveTo(e, 0), t.arc(0, 0, e, 0, xg) - } - }, - Pg = { - draw: function (t, n) { - var e = Math.sqrt(n / 5) / 2; - t.moveTo(-3 * e, -e), t.lineTo(-e, -e), t.lineTo(-e, -3 * e), t.lineTo(e, -3 * e), t.lineTo(e, -e), t.lineTo(3 * e, -e), t.lineTo(3 * e, e), t.lineTo(e, e), t.lineTo(e, 3 * e), t.lineTo(-e, 3 * e), t.lineTo(-e, e), t.lineTo(-3 * e, e), t.closePath() - } - }, - Rg = Math.sqrt(1 / 3), - Lg = 2 * Rg, - qg = { - draw: function (t, n) { - var e = Math.sqrt(n / Lg), - r = e * Rg; - t.moveTo(0, -e), t.lineTo(r, 0), t.lineTo(0, e), t.lineTo(-r, 0), t.closePath() - } - }, - Ug = Math.sin(gg / 10) / Math.sin(7 * gg / 10), - Dg = Math.sin(xg / 10) * Ug, - Og = -Math.cos(xg / 10) * Ug, - Fg = { - draw: function (t, n) { - var e = Math.sqrt(.8908130915292852 * n), - r = Dg * e, - i = Og * e; - t.moveTo(0, -e), t.lineTo(r, i); - for (var o = 1; o < 5; ++o) { - var u = xg * o / 5, - a = Math.cos(u), - c = Math.sin(u); - t.lineTo(c * e, -a * e), t.lineTo(a * r - c * i, c * r + a * i) - } - t.closePath() - } - }, - Ig = { - draw: function (t, n) { - var e = Math.sqrt(n), - r = -e / 2; - t.rect(r, r, e, e) - } - }, - Yg = Math.sqrt(3), - Bg = { - draw: function (t, n) { - var e = -Math.sqrt(n / (3 * Yg)); - t.moveTo(0, 2 * e), t.lineTo(-Yg * e, -e), t.lineTo(Yg * e, -e), t.closePath() - } - }, - jg = -.5, - Hg = Math.sqrt(3) / 2, - Xg = 1 / Math.sqrt(12), - $g = 3 * (Xg / 2 + 1), - Vg = { - draw: function (t, n) { - var e = Math.sqrt(n / $g), - r = e / 2, - i = e * Xg, - o = r, - u = e * Xg + e, - a = -o, - c = u; - t.moveTo(r, i), t.lineTo(o, u), t.lineTo(a, c), t.lineTo(jg * r - Hg * i, Hg * r + jg * i), t.lineTo(jg * o - Hg * u, Hg * o + jg * u), t.lineTo(jg * a - Hg * c, Hg * a + jg * c), t.lineTo(jg * r + Hg * i, jg * i - Hg * r), t.lineTo(jg * o + Hg * u, jg * u - Hg * o), t.lineTo(jg * a + Hg * c, jg * c - Hg * a), t.closePath() - } - }, - Wg = [zg, Pg, qg, Ig, Fg, Bg, Vg], - Zg = function () {}; - Ja.prototype = { - areaStart: function () { - this._line = 0 - }, - areaEnd: function () { - this._line = NaN - }, - lineStart: function () { - this._x0 = this._x1 = this._y0 = this._y1 = NaN, this._point = 0 - }, - lineEnd: function () { - switch (this._point) { - case 3: - Ga(this, this._x1, this._y1); - case 2: - this._context.lineTo(this._x1, this._y1) - }(this._line || 0 !== this._line && 1 === this._point) && this._context.closePath(), this._line = 1 - this._line - }, - point: function (t, n) { - switch (t = +t, n = +n, this._point) { - case 0: - this._point = 1, this._line ? this._context.lineTo(t, n) : this._context.moveTo(t, n); - break; - case 1: - this._point = 2; - break; - case 2: - this._point = 3, this._context.lineTo((5 * this._x0 + this._x1) / 6, (5 * this._y0 + this._y1) / 6); - default: - Ga(this, t, n) - } - this._x0 = this._x1, this._x1 = t, this._y0 = this._y1, this._y1 = n - } - }; - Qa.prototype = { - areaStart: Zg, - areaEnd: Zg, - lineStart: function () { - this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = NaN, this._point = 0 - }, - lineEnd: function () { - switch (this._point) { - case 1: - this._context.moveTo(this._x2, this._y2), this._context.closePath(); - break; - case 2: - this._context.moveTo((this._x2 + 2 * this._x3) / 3, (this._y2 + 2 * this._y3) / 3), this._context.lineTo((this._x3 + 2 * this._x2) / 3, (this._y3 + 2 * this._y2) / 3), this._context.closePath(); - break; - case 3: - this.point(this._x2, this._y2), this.point(this._x3, this._y3), this.point(this._x4, this._y4) - } - }, - point: function (t, n) { - switch (t = +t, n = +n, this._point) { - case 0: - this._point = 1, this._x2 = t, this._y2 = n; - break; - case 1: - this._point = 2, this._x3 = t, this._y3 = n; - break; - case 2: - this._point = 3, this._x4 = t, this._y4 = n, this._context.moveTo((this._x0 + 4 * this._x1 + t) / 6, (this._y0 + 4 * this._y1 + n) / 6); - break; - default: - Ga(this, t, n) - } - this._x0 = this._x1, this._x1 = t, this._y0 = this._y1, this._y1 = n - } - }; - Ka.prototype = { - areaStart: function () { - this._line = 0 - }, - areaEnd: function () { - this._line = NaN - }, - lineStart: function () { - this._x0 = this._x1 = this._y0 = this._y1 = NaN, this._point = 0 - }, - lineEnd: function () { - (this._line || 0 !== this._line && 3 === this._point) && this._context.closePath(), this._line = 1 - this._line - }, - point: function (t, n) { - switch (t = +t, n = +n, this._point) { - case 0: - this._point = 1; - break; - case 1: - this._point = 2; - break; - case 2: - this._point = 3; - var e = (this._x0 + 4 * this._x1 + t) / 6, - r = (this._y0 + 4 * this._y1 + n) / 6; - this._line ? this._context.lineTo(e, r) : this._context.moveTo(e, r); - break; - case 3: - this._point = 4; - default: - Ga(this, t, n) - } - this._x0 = this._x1, this._x1 = t, this._y0 = this._y1, this._y1 = n - } - }; - tc.prototype = { - lineStart: function () { - this._x = [], this._y = [], this._basis.lineStart() - }, - lineEnd: function () { - var t = this._x, - n = this._y, - e = t.length - 1; - if (e > 0) - for (var r, i = t[0], o = n[0], u = t[e] - i, a = n[e] - o, c = -1; ++c <= e;) r = c / e, this._basis.point(this._beta * t[c] + (1 - this._beta) * (i + r * u), this._beta * n[c] + (1 - this._beta) * (o + r * a)); - this._x = this._y = null, this._basis.lineEnd() - }, - point: function (t, n) { - this._x.push(+t), this._y.push(+n) - } - }; - var Gg = function t(n) { - function e(t) { - return 1 === n ? new Ja(t) : new tc(t, n) - } - return e.beta = function (n) { - return t(+n) - }, e - }(.85); - ec.prototype = { - areaStart: function () { - this._line = 0 - }, - areaEnd: function () { - this._line = NaN - }, - lineStart: function () { - this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN, this._point = 0 - }, - lineEnd: function () { - switch (this._point) { - case 2: - this._context.lineTo(this._x2, this._y2); - break; - case 3: - nc(this, this._x1, this._y1) - }(this._line || 0 !== this._line && 1 === this._point) && this._context.closePath(), this._line = 1 - this._line - }, - point: function (t, n) { - switch (t = +t, n = +n, this._point) { - case 0: - this._point = 1, this._line ? this._context.lineTo(t, n) : this._context.moveTo(t, n); - break; - case 1: - this._point = 2, this._x1 = t, this._y1 = n; - break; - case 2: - this._point = 3; - default: - nc(this, t, n) - } - this._x0 = this._x1, this._x1 = this._x2, this._x2 = t, this._y0 = this._y1, this._y1 = this._y2, this._y2 = n - } - }; - var Jg = function t(n) { - function e(t) { - return new ec(t, n) - } - return e.tension = function (n) { - return t(+n) - }, e - }(0); - rc.prototype = { - areaStart: Zg, - areaEnd: Zg, - lineStart: function () { - this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN, this._point = 0 - }, - lineEnd: function () { - switch (this._point) { - case 1: - this._context.moveTo(this._x3, this._y3), this._context.closePath(); - break; - case 2: - this._context.lineTo(this._x3, this._y3), this._context.closePath(); - break; - case 3: - this.point(this._x3, this._y3), this.point(this._x4, this._y4), this.point(this._x5, this._y5) - } - }, - point: function (t, n) { - switch (t = +t, n = +n, this._point) { - case 0: - this._point = 1, this._x3 = t, this._y3 = n; - break; - case 1: - this._point = 2, this._context.moveTo(this._x4 = t, this._y4 = n); - break; - case 2: - this._point = 3, this._x5 = t, this._y5 = n; - break; - default: - nc(this, t, n) - } - this._x0 = this._x1, this._x1 = this._x2, this._x2 = t, this._y0 = this._y1, this._y1 = this._y2, this._y2 = n - } - }; - var Qg = function t(n) { - function e(t) { - return new rc(t, n) - } - return e.tension = function (n) { - return t(+n) - }, e - }(0); - ic.prototype = { - areaStart: function () { - this._line = 0 - }, - areaEnd: function () { - this._line = NaN - }, - lineStart: function () { - this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN, this._point = 0 - }, - lineEnd: function () { - (this._line || 0 !== this._line && 3 === this._point) && this._context.closePath(), this._line = 1 - this._line - }, - point: function (t, n) { - switch (t = +t, n = +n, this._point) { - case 0: - this._point = 1; - break; - case 1: - this._point = 2; - break; - case 2: - this._point = 3, this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); - break; - case 3: - this._point = 4; - default: - nc(this, t, n) - } - this._x0 = this._x1, this._x1 = this._x2, this._x2 = t, this._y0 = this._y1, this._y1 = this._y2, this._y2 = n - } - }; - var Kg = function t(n) { - function e(t) { - return new ic(t, n) - } - return e.tension = function (n) { - return t(+n) - }, e - }(0); - uc.prototype = { - areaStart: function () { - this._line = 0 - }, - areaEnd: function () { - this._line = NaN - }, - lineStart: function () { - this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN, this._l01_a = this._l12_a = this._l23_a = this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0 - }, - lineEnd: function () { - switch (this._point) { - case 2: - this._context.lineTo(this._x2, this._y2); - break; - case 3: - this.point(this._x2, this._y2) - }(this._line || 0 !== this._line && 1 === this._point) && this._context.closePath(), this._line = 1 - this._line - }, - point: function (t, n) { - if (t = +t, n = +n, this._point) { - var e = this._x2 - t, - r = this._y2 - n; - this._l23_a = Math.sqrt(this._l23_2a = Math.pow(e * e + r * r, this._alpha)) - } - switch (this._point) { - case 0: - this._point = 1, this._line ? this._context.lineTo(t, n) : this._context.moveTo(t, n); - break; - case 1: - this._point = 2; - break; - case 2: - this._point = 3; - default: - oc(this, t, n) - } - this._l01_a = this._l12_a, this._l12_a = this._l23_a, this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a, this._x0 = this._x1, this._x1 = this._x2, this._x2 = t, this._y0 = this._y1, this._y1 = this._y2, this._y2 = n - } - }; - var tm = function t(n) { - function e(t) { - return n ? new uc(t, n) : new ec(t, 0) - } - return e.alpha = function (n) { - return t(+n) - }, e - }(.5); - ac.prototype = { - areaStart: Zg, - areaEnd: Zg, - lineStart: function () { - this._x0 = this._x1 = this._x2 = this._x3 = this._x4 = this._x5 = this._y0 = this._y1 = this._y2 = this._y3 = this._y4 = this._y5 = NaN, this._l01_a = this._l12_a = this._l23_a = this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0 - }, - lineEnd: function () { - switch (this._point) { - case 1: - this._context.moveTo(this._x3, this._y3), this._context.closePath(); - break; - case 2: - this._context.lineTo(this._x3, this._y3), this._context.closePath(); - break; - case 3: - this.point(this._x3, this._y3), this.point(this._x4, this._y4), this.point(this._x5, this._y5) - } - }, - point: function (t, n) { - if (t = +t, n = +n, this._point) { - var e = this._x2 - t, - r = this._y2 - n; - this._l23_a = Math.sqrt(this._l23_2a = Math.pow(e * e + r * r, this._alpha)) - } - switch (this._point) { - case 0: - this._point = 1, this._x3 = t, this._y3 = n; - break; - case 1: - this._point = 2, this._context.moveTo(this._x4 = t, this._y4 = n); - break; - case 2: - this._point = 3, this._x5 = t, this._y5 = n; - break; - default: - oc(this, t, n) - } - this._l01_a = this._l12_a, this._l12_a = this._l23_a, this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a, this._x0 = this._x1, this._x1 = this._x2, this._x2 = t, this._y0 = this._y1, this._y1 = this._y2, this._y2 = n - } - }; - var nm = function t(n) { - function e(t) { - return n ? new ac(t, n) : new rc(t, 0) - } - return e.alpha = function (n) { - return t(+n) - }, e - }(.5); - cc.prototype = { - areaStart: function () { - this._line = 0 - }, - areaEnd: function () { - this._line = NaN - }, - lineStart: function () { - this._x0 = this._x1 = this._x2 = this._y0 = this._y1 = this._y2 = NaN, this._l01_a = this._l12_a = this._l23_a = this._l01_2a = this._l12_2a = this._l23_2a = this._point = 0 - }, - lineEnd: function () { - (this._line || 0 !== this._line && 3 === this._point) && this._context.closePath(), this._line = 1 - this._line - }, - point: function (t, n) { - if (t = +t, n = +n, this._point) { - var e = this._x2 - t, - r = this._y2 - n; - this._l23_a = Math.sqrt(this._l23_2a = Math.pow(e * e + r * r, this._alpha)) - } - switch (this._point) { - case 0: - this._point = 1; - break; - case 1: - this._point = 2; - break; - case 2: - this._point = 3, this._line ? this._context.lineTo(this._x2, this._y2) : this._context.moveTo(this._x2, this._y2); - break; - case 3: - this._point = 4; - default: - oc(this, t, n) - } - this._l01_a = this._l12_a, this._l12_a = this._l23_a, this._l01_2a = this._l12_2a, this._l12_2a = this._l23_2a, this._x0 = this._x1, this._x1 = this._x2, this._x2 = t, this._y0 = this._y1, this._y1 = this._y2, this._y2 = n - } - }; - var em = function t(n) { - function e(t) { - return n ? new cc(t, n) : new ic(t, 0) - } - return e.alpha = function (n) { - return t(+n) - }, e - }(.5); - sc.prototype = { - areaStart: Zg, - areaEnd: Zg, - lineStart: function () { - this._point = 0 - }, - lineEnd: function () { - this._point && this._context.closePath() - }, - point: function (t, n) { - t = +t, n = +n, this._point ? this._context.lineTo(t, n) : (this._point = 1, this._context.moveTo(t, n)) - } - }; - dc.prototype = { - areaStart: function () { - this._line = 0 - }, - areaEnd: function () { - this._line = NaN - }, - lineStart: function () { - this._x0 = this._x1 = this._y0 = this._y1 = this._t0 = NaN, this._point = 0 - }, - lineEnd: function () { - switch (this._point) { - case 2: - this._context.lineTo(this._x1, this._y1); - break; - case 3: - pc(this, this._t0, hc(this, this._t0)) - }(this._line || 0 !== this._line && 1 === this._point) && this._context.closePath(), this._line = 1 - this._line - }, - point: function (t, n) { - var e = NaN; - if (t = +t, n = +n, t !== this._x1 || n !== this._y1) { - switch (this._point) { - case 0: - this._point = 1, this._line ? this._context.lineTo(t, n) : this._context.moveTo(t, n); - break; - case 1: - this._point = 2; - break; - case 2: - this._point = 3, pc(this, hc(this, e = lc(this, t, n)), e); - break; - default: - pc(this, this._t0, e = lc(this, t, n)) - } - this._x0 = this._x1, this._x1 = t, this._y0 = this._y1, this._y1 = n, this._t0 = e - } - } - }, (vc.prototype = Object.create(dc.prototype)).point = function (t, n) { - dc.prototype.point.call(this, n, t) - }, _c.prototype = { - moveTo: function (t, n) { - this._context.moveTo(n, t) - }, - closePath: function () { - this._context.closePath() - }, - lineTo: function (t, n) { - this._context.lineTo(n, t) - }, - bezierCurveTo: function (t, n, e, r, i, o) { - this._context.bezierCurveTo(n, t, r, e, o, i) - } - }, yc.prototype = { - areaStart: function () { - this._line = 0 - }, - areaEnd: function () { - this._line = NaN - }, - lineStart: function () { - this._x = [], this._y = [] - }, - lineEnd: function () { - var t = this._x, - n = this._y, - e = t.length; - if (e) - if (this._line ? this._context.lineTo(t[0], n[0]) : this._context.moveTo(t[0], n[0]), 2 === e) this._context.lineTo(t[1], n[1]); - else - for (var r = gc(t), i = gc(n), o = 0, u = 1; u < e; ++o, ++u) this._context.bezierCurveTo(r[0][o], i[0][o], r[1][o], i[1][o], t[u], n[u]); - (this._line || 0 !== this._line && 1 === e) && this._context.closePath(), this._line = 1 - this._line, this._x = this._y = null - }, - point: function (t, n) { - this._x.push(+t), this._y.push(+n) - } - }; - mc.prototype = { - areaStart: function () { - this._line = 0 - }, - areaEnd: function () { - this._line = NaN - }, - lineStart: function () { - this._x = this._y = NaN, this._point = 0 - }, - lineEnd: function () { - 0 < this._t && this._t < 1 && 2 === this._point && this._context.lineTo(this._x, this._y), (this._line || 0 !== this._line && 1 === this._point) && this._context.closePath(), this._line >= 0 && (this._t = 1 - this._t, this._line = 1 - this._line) - }, - point: function (t, n) { - switch (t = +t, n = +n, this._point) { - case 0: - this._point = 1, this._line ? this._context.lineTo(t, n) : this._context.moveTo(t, n); - break; - case 1: - this._point = 2; - default: - if (this._t <= 0) this._context.lineTo(this._x, n), this._context.lineTo(t, n); - else { - var e = this._x * (1 - this._t) + t * this._t; - this._context.lineTo(e, this._y), this._context.lineTo(e, n) - } - } - this._x = t, this._y = n - } - }; - var rm = function (t, n) { - if ((i = t.length) > 1) - for (var e, r, i, o = 1, u = t[n[0]], a = u.length; o < i; ++o) - for (r = u, u = t[n[o]], e = 0; e < a; ++e) u[e][1] += u[e][0] = isNaN(r[e][1]) ? r[e][0] : r[e][1] - }, - im = function (t) { - for (var n = t.length, e = new Array(n); --n >= 0;) e[n] = n; - return e - }, - om = function (t) { - var n = t.map(bc); - return im(t).sort(function (t, e) { - return n[t] - n[e] - }) - }, - um = function (t) { - return function () { - return t - } - }; - Tc.prototype = { - constructor: Tc, - insert: function (t, n) { - var e, r, i; - if (t) { - if (n.P = t, n.N = t.N, t.N && (t.N.P = n), t.N = n, t.R) { - for (t = t.R; t.L;) t = t.L; - t.L = n - } else t.R = n; - e = t - } else this._ ? (t = Ec(this._), n.P = null, n.N = t, t.P = t.L = n, e = t) : (n.P = n.N = null, this._ = n, e = null); - for (n.L = n.R = null, n.U = e, n.C = !0, t = n; e && e.C;) e === (r = e.U).L ? (i = r.R) && i.C ? (e.C = i.C = !1, r.C = !0, t = r) : (t === e.R && (Nc(this, e), e = (t = e).U), e.C = !1, r.C = !0, Sc(this, r)) : (i = r.L) && i.C ? (e.C = i.C = !1, r.C = !0, t = r) : (t === e.L && (Sc(this, e), e = (t = e).U), e.C = !1, r.C = !0, Nc(this, r)), e = t.U; - this._.C = !1 - }, - remove: function (t) { - t.N && (t.N.P = t.P), t.P && (t.P.N = t.N), t.N = t.P = null; - var n, e, r, i = t.U, - o = t.L, - u = t.R; - if (e = o ? u ? Ec(u) : o : u, i ? i.L === t ? i.L = e : i.R = e : this._ = e, o && u ? (r = e.C, e.C = t.C, e.L = o, o.U = e, e !== u ? (i = e.U, e.U = t.U, t = e.R, i.L = t, e.R = u, u.U = e) : (e.U = i, i = e, t = e.R)) : (r = t.C, t = e), t && (t.U = i), !r) - if (t && t.C) t.C = !1; - else { - do { - if (t === this._) break; - if (t === i.L) { - if ((n = i.R).C && (n.C = !1, i.C = !0, Nc(this, i), n = i.R), n.L && n.L.C || n.R && n.R.C) { - n.R && n.R.C || (n.L.C = !1, n.C = !0, Sc(this, n), n = i.R), n.C = i.C, i.C = n.R.C = !1, Nc(this, i), t = this._; - break - } - } else if ((n = i.L).C && (n.C = !1, i.C = !0, Sc(this, i), n = i.L), n.L && n.L.C || n.R && n.R.C) { - n.L && n.L.C || (n.R.C = !1, n.C = !0, Nc(this, n), n = i.L), n.C = i.C, i.C = n.L.C = !1, Sc(this, i), t = this._; - break - } - n.C = !0, t = i, i = i.U - } while (!t.C); - t && (t.C = !1) - } - } - }; - var am, cm, sm, fm, lm, hm = [], - pm = [], - dm = 1e-6, - vm = 1e-12; - Kc.prototype = { - constructor: Kc, - polygons: function () { - var t = this.edges; - return this.cells.map(function (n) { - var e = n.halfedges.map(function (e) { - return Dc(n, t[e]) - }); - return e.data = n.site.data, e - }) - }, - triangles: function () { - var t = [], - n = this.edges; - return this.cells.forEach(function (e, r) { - if (o = (i = e.halfedges).length) - for (var i, o, u, a = e.site, c = -1, s = n[i[o - 1]], f = s.left === a ? s.right : s.left; ++c < o;) u = f, f = (s = n[i[c]]).left === a ? s.right : s.left, u && f && r < u.index && r < f.index && Jc(a, u, f) < 0 && t.push([a.data, u.data, f.data]) - }), t - }, - links: function () { - return this.edges.filter(function (t) { - return t.right - }).map(function (t) { - return { - source: t.left.data, - target: t.right.data - } - }) - }, - find: function (t, n, e) { - for (var r, i, o = this, u = o._found || 0, a = o.cells.length; !(i = o.cells[u]);) - if (++u >= a) return null; - var c = t - i.site[0], - s = n - i.site[1], - f = c * c + s * s; - do { - i = o.cells[r = u], u = null, i.halfedges.forEach(function (e) { - var r = o.edges[e], - a = r.left; - if (a !== i.site && a || (a = r.right)) { - var c = t - a[0], - s = n - a[1], - l = c * c + s * s; - l < f && (f = l, u = a.index) - } - }) - } while (null !== u); - return o._found = r, null == e || f <= e * e ? i.site : null - } - }; - var _m = function (t) { - return function () { - return t - } - }; - ns.prototype = { - constructor: ns, - scale: function (t) { - return 1 === t ? this : new ns(this.k * t, this.x, this.y) - }, - translate: function (t, n) { - return 0 === t & 0 === n ? this : new ns(this.k, this.x + this.k * t, this.y + this.k * n) - }, - apply: function (t) { - return [t[0] * this.k + this.x, t[1] * this.k + this.y] - }, - applyX: function (t) { - return t * this.k + this.x - }, - applyY: function (t) { - return t * this.k + this.y - }, - invert: function (t) { - return [(t[0] - this.x) / this.k, (t[1] - this.y) / this.k] - }, - invertX: function (t) { - return (t - this.x) / this.k - }, - invertY: function (t) { - return (t - this.y) / this.k - }, - rescaleX: function (t) { - return t.copy().domain(t.range().map(this.invertX, this).map(t.invert, t)) - }, - rescaleY: function (t) { - return t.copy().domain(t.range().map(this.invertY, this).map(t.invert, t)) - }, - toString: function () { - return "translate(" + this.x + "," + this.y + ") scale(" + this.k + ")" - } - }; - var ym = new ns(1, 0, 0); - es.prototype = ns.prototype; - var gm = function () { - t.event.preventDefault(), t.event.stopImmediatePropagation() - }; - t.version = "4.10.2", t.bisect = hs, t.bisectRight = hs, t.bisectLeft = ps, t.ascending = ss, t.bisector = fs, t.cross = function (t, n, r) { - var i, o, u, a, c = t.length, - s = n.length, - f = new Array(c * s); - for (null == r && (r = e), i = u = 0; i < c; ++i) - for (a = t[i], o = 0; o < s; ++o, ++u) f[u] = r(a, n[o]); - return f - }, t.descending = function (t, n) { - return n < t ? -1 : n > t ? 1 : n >= t ? 0 : NaN - }, t.deviation = _s, t.extent = ys, t.histogram = function () { - function t(t) { - var o, u, a = t.length, - c = new Array(a); - for (o = 0; o < a; ++o) c[o] = n(t[o], o, t); - var s = e(c), - f = s[0], - l = s[1], - h = r(c, f, l); - Array.isArray(h) || (h = i(f, l, h), h = Ms(Math.ceil(f / h) * h, Math.floor(l / h) * h, h)); - for (var p = h.length; h[0] <= f;) h.shift(), --p; - for (; h[p - 1] > l;) h.pop(), --p; - var d, v = new Array(p + 1); - for (o = 0; o <= p; ++o)(d = v[o] = []).x0 = o > 0 ? h[o - 1] : f, d.x1 = o < p ? h[o] : l; - for (o = 0; o < a; ++o) f <= (u = c[o]) && u <= l && v[hs(h, u, 0, p)].push(t[o]); - return v - } - var n = ws, - e = ys, - r = Es; - return t.value = function (e) { - return arguments.length ? (n = "function" == typeof e ? e : bs(e), t) : n - }, t.domain = function (n) { - return arguments.length ? (e = "function" == typeof n ? n : bs([n[0], n[1]]), t) : e - }, t.thresholds = function (n) { - return arguments.length ? (r = "function" == typeof n ? n : bs(Array.isArray(n) ? ms.call(n) : n), t) : r - }, t - }, t.thresholdFreedmanDiaconis = function (t, n, e) { - return t = xs.call(t, ds).sort(ss), Math.ceil((e - n) / (2 * (As(t, .75) - As(t, .25)) * Math.pow(t.length, -1 / 3))) - }, t.thresholdScott = function (t, n, e) { - return Math.ceil((e - n) / (3.5 * _s(t) * Math.pow(t.length, -1 / 3))) - }, t.thresholdSturges = Es, t.max = function (t, n) { - var e, r, i = t.length, - o = -1; - if (null == n) { - for (; ++o < i;) - if (null != (e = t[o]) && e >= e) - for (r = e; ++o < i;) null != (e = t[o]) && e > r && (r = e) - } else - for (; ++o < i;) - if (null != (e = n(t[o], o, t)) && e >= e) - for (r = e; ++o < i;) null != (e = n(t[o], o, t)) && e > r && (r = e); - return r - }, t.mean = function (t, n) { - var e, r = t.length, - i = r, - o = -1, - u = 0; - if (null == n) - for (; ++o < r;) isNaN(e = ds(t[o])) ? --i : u += e; - else - for (; ++o < r;) isNaN(e = ds(n(t[o], o, t))) ? --i : u += e; - if (i) return u / i - }, t.median = function (t, n) { - var e, r = t.length, - i = -1, - o = []; - if (null == n) - for (; ++i < r;) isNaN(e = ds(t[i])) || o.push(e); - else - for (; ++i < r;) isNaN(e = ds(n(t[i], i, t))) || o.push(e); - return As(o.sort(ss), .5) - }, t.merge = Cs, t.min = zs, t.pairs = function (t, n) { - null == n && (n = e); - for (var r = 0, i = t.length - 1, o = t[0], u = new Array(i < 0 ? 0 : i); r < i;) u[r] = n(o, o = t[++r]); - return u - }, t.permute = function (t, n) { - for (var e = n.length, r = new Array(e); e--;) r[e] = t[n[e]]; - return r - }, t.quantile = As, t.range = Ms, t.scan = function (t, n) { - if (e = t.length) { - var e, r, i = 0, - o = 0, - u = t[o]; - for (null == n && (n = ss); ++i < e;)(n(r = t[i], u) < 0 || 0 !== n(u, u)) && (u = r, o = i); - return 0 === n(u, u) ? o : void 0 - } - }, t.shuffle = function (t, n, e) { - for (var r, i, o = (null == e ? t.length : e) - (n = null == n ? 0 : +n); o;) i = Math.random() * o-- | 0, r = t[o + n], t[o + n] = t[i + n], t[i + n] = r; - return t - }, t.sum = function (t, n) { - var e, r = t.length, - i = -1, - o = 0; - if (null == n) - for (; ++i < r;)(e = +t[i]) && (o += e); - else - for (; ++i < r;)(e = +n(t[i], i, t)) && (o += e); - return o - }, t.ticks = Ss, t.tickIncrement = r, t.tickStep = i, t.transpose = Ps, t.variance = vs, t.zip = function () { - return Ps(arguments) - }, t.axisTop = function (t) { - return l(qs, t) - }, t.axisRight = function (t) { - return l(Us, t) - }, t.axisBottom = function (t) { - return l(Ds, t) - }, t.axisLeft = function (t) { - return l(Os, t) - }, t.brush = function () { - return he(Sh) - }, t.brushX = function () { - return he(kh) - }, t.brushY = function () { - return he(Nh) - }, t.brushSelection = function (t) { - var n = t.__brush; - return n ? n.dim.output(n.selection) : null - }, t.chord = function () { - function t(t) { - var o, u, a, c, s, f, l = t.length, - h = [], - p = Ms(l), - d = [], - v = [], - _ = v.groups = new Array(l), - y = new Array(l * l); - for (o = 0, s = -1; ++s < l;) { - for (u = 0, f = -1; ++f < l;) u += t[s][f]; - h.push(u), d.push(Ms(l)), o += u - } - for (e && p.sort(function (t, n) { - return e(h[t], h[n]) - }), r && d.forEach(function (n, e) { - n.sort(function (n, i) { - return r(t[e][n], t[e][i]) - }) - }), c = (o = Oh(0, Dh - n * l) / o) ? n : Dh / l, u = 0, s = -1; ++s < l;) { - for (a = u, f = -1; ++f < l;) { - var g = p[s], - m = d[g][f], - x = t[g][m], - b = u, - w = u += x * o; - y[m * l + g] = { - index: g, - subindex: m, - startAngle: b, - endAngle: w, - value: x - } - } - _[g] = { - index: g, - startAngle: a, - endAngle: u, - value: h[g] - }, u += c - } - for (s = -1; ++s < l;) - for (f = s - 1; ++f < l;) { - var M = y[f * l + s], - T = y[s * l + f]; - (M.value || T.value) && v.push(M.value < T.value ? { - source: T, - target: M - } : { - source: M, - target: T - }) - } - return i ? v.sort(i) : v - } - var n = 0, - e = null, - r = null, - i = null; - return t.padAngle = function (e) { - return arguments.length ? (n = Oh(0, e), t) : n - }, t.sortGroups = function (n) { - return arguments.length ? (e = n, t) : e - }, t.sortSubgroups = function (n) { - return arguments.length ? (r = n, t) : r - }, t.sortChords = function (n) { - return arguments.length ? (null == n ? i = null : (i = pe(n))._ = n, t) : i && i._ - }, t - }, t.ribbon = function () { - function t() { - var t, a = Fh.call(arguments), - c = n.apply(this, a), - s = e.apply(this, a), - f = +r.apply(this, (a[0] = c, a)), - l = i.apply(this, a) - Uh, - h = o.apply(this, a) - Uh, - p = f * Rh(l), - d = f * Lh(l), - v = +r.apply(this, (a[0] = s, a)), - _ = i.apply(this, a) - Uh, - y = o.apply(this, a) - Uh; - if (u || (u = t = ve()), u.moveTo(p, d), u.arc(0, 0, f, l, h), l === _ && h === y || (u.quadraticCurveTo(0, 0, v * Rh(_), v * Lh(_)), u.arc(0, 0, v, _, y)), u.quadraticCurveTo(0, 0, p, d), u.closePath(), t) return u = null, t + "" || null - } - var n = _e, - e = ye, - r = ge, - i = me, - o = xe, - u = null; - return t.radius = function (n) { - return arguments.length ? (r = "function" == typeof n ? n : Ih(+n), t) : r - }, t.startAngle = function (n) { - return arguments.length ? (i = "function" == typeof n ? n : Ih(+n), t) : i - }, t.endAngle = function (n) { - return arguments.length ? (o = "function" == typeof n ? n : Ih(+n), t) : o - }, t.source = function (e) { - return arguments.length ? (n = e, t) : n - }, t.target = function (n) { - return arguments.length ? (e = n, t) : e - }, t.context = function (n) { - return arguments.length ? (u = null == n ? null : n, t) : u - }, t - }, t.nest = function () { - function t(n, i, u, a) { - if (i >= o.length) return null != e && n.sort(e), null != r ? r(n) : n; - for (var c, s, f, l = -1, h = n.length, p = o[i++], d = we(), v = u(); ++l < h;)(f = d.get(c = p(s = n[l]) + "")) ? f.push(s) : d.set(c, [s]); - return d.each(function (n, e) { - a(v, e, t(n, i, u, a)) - }), v - } - - function n(t, e) { - if (++e > o.length) return t; - var i, a = u[e - 1]; - return null != r && e >= o.length ? i = t.entries() : (i = [], t.each(function (t, r) { - i.push({ - key: r, - values: n(t, e) - }) - })), null != a ? i.sort(function (t, n) { - return a(t.key, n.key) - }) : i - } - var e, r, i, o = [], - u = []; - return i = { - object: function (n) { - return t(n, 0, Me, Te) - }, - map: function (n) { - return t(n, 0, ke, Ne) - }, - entries: function (e) { - return n(t(e, 0, ke, Ne), 0) - }, - key: function (t) { - return o.push(t), i - }, - sortKeys: function (t) { - return u[o.length - 1] = t, i - }, - sortValues: function (t) { - return e = t, i - }, - rollup: function (t) { - return r = t, i - } - } - }, t.set = Ee, t.map = we, t.keys = function (t) { - var n = []; - for (var e in t) n.push(e); - return n - }, t.values = function (t) { - var n = []; - for (var e in t) n.push(t[e]); - return n - }, t.entries = function (t) { - var n = []; - for (var e in t) n.push({ - key: e, - value: t[e] - }); - return n - }, t.color = Tt, t.rgb = Et, t.hsl = Pt, t.lab = Ut, t.hcl = jt, t.cubehelix = $t, t.dispatch = h, t.drag = function () { - function n(t) { - t.on("mousedown.drag", e).filter(bt).on("touchstart.drag", o).on("touchmove.drag", u).on("touchend.drag touchcancel.drag", a).style("touch-action", "none").style("-webkit-tap-highlight-color", "rgba(0,0,0,0)") - } - - function e() { - if (!p && d.apply(this, arguments)) { - var n = c("mouse", v.apply(this, arguments), Ks, this, arguments); - n && (cf(t.event.view).on("mousemove.drag", r, !0).on("mouseup.drag", i, !0), lf(t.event.view), vt(), l = !1, s = t.event.clientX, f = t.event.clientY, n("start")) - } - } - - function r() { - if (ff(), !l) { - var n = t.event.clientX - s, - e = t.event.clientY - f; - l = n * n + e * e > x - } - y.mouse("drag") - } - - function i() { - cf(t.event.view).on("mousemove.drag mouseup.drag", null), _t(t.event.view, l), ff(), y.mouse("end") - } - - function o() { - if (d.apply(this, arguments)) { - var n, e, r = t.event.changedTouches, - i = v.apply(this, arguments), - o = r.length; - for (n = 0; n < o; ++n)(e = c(r[n].identifier, i, sf, this, arguments)) && (vt(), e("start")) - } - } - - function u() { - var n, e, r = t.event.changedTouches, - i = r.length; - for (n = 0; n < i; ++n)(e = y[r[n].identifier]) && (ff(), e("drag")) - } - - function a() { - var n, e, r = t.event.changedTouches, - i = r.length; - for (p && clearTimeout(p), p = setTimeout(function () { - p = null - }, 500), n = 0; n < i; ++n)(e = y[r[n].identifier]) && (vt(), e("end")) - } - - function c(e, r, i, o, u) { - var a, c, s, f = i(r, e), - l = g.copy(); - if (N(new yt(n, "beforestart", a, e, m, f[0], f[1], 0, 0, l), function () { - return null != (t.event.subject = a = _.apply(o, u)) && (c = a.x - f[0] || 0, s = a.y - f[1] || 0, !0) - })) return function t(h) { - var p, d = f; - switch (h) { - case "start": - y[e] = t, p = m++; - break; - case "end": - delete y[e], --m; - case "drag": - f = i(r, e), p = m - } - N(new yt(n, h, a, e, p, f[0] + c, f[1] + s, f[0] - d[0], f[1] - d[1], l), l.apply, l, [h, o, u]) - } - } - var s, f, l, p, d = gt, - v = mt, - _ = xt, - y = {}, - g = h("start", "drag", "end"), - m = 0, - x = 0; - return n.filter = function (t) { - return arguments.length ? (d = "function" == typeof t ? t : hf(!!t), n) : d - }, n.container = function (t) { - return arguments.length ? (v = "function" == typeof t ? t : hf(t), n) : v - }, n.subject = function (t) { - return arguments.length ? (_ = "function" == typeof t ? t : hf(t), n) : _ - }, n.on = function () { - var t = g.on.apply(g, arguments); - return t === g ? n : t - }, n.clickDistance = function (t) { - return arguments.length ? (x = (t = +t) * t, n) : Math.sqrt(x) - }, n - }, t.dragDisable = lf, t.dragEnable = _t, t.dsvFormat = Gh, t.csvParse = Qh, t.csvParseRows = Kh, t.csvFormat = tp, t.csvFormatRows = np, t.tsvParse = rp, t.tsvParseRows = ip, t.tsvFormat = op, t.tsvFormatRows = up, t.easeLinear = function (t) { - return +t - }, t.easeQuad = Kn, t.easeQuadIn = function (t) { - return t * t - }, t.easeQuadOut = function (t) { - return t * (2 - t) - }, t.easeQuadInOut = Kn, t.easeCubic = te, t.easeCubicIn = function (t) { - return t * t * t - }, t.easeCubicOut = function (t) { - return --t * t * t + 1 - }, t.easeCubicInOut = te, t.easePoly = Gl, t.easePolyIn = Wl, t.easePolyOut = Zl, t.easePolyInOut = Gl, t.easeSin = ne, t.easeSinIn = function (t) { - return 1 - Math.cos(t * Ql) - }, t.easeSinOut = function (t) { - return Math.sin(t * Ql) - }, t.easeSinInOut = ne, t.easeExp = ee, t.easeExpIn = function (t) { - return Math.pow(2, 10 * t - 10) - }, t.easeExpOut = function (t) { - return 1 - Math.pow(2, -10 * t) - }, t.easeExpInOut = ee, t.easeCircle = re, t.easeCircleIn = function (t) { - return 1 - Math.sqrt(1 - t * t) - }, t.easeCircleOut = function (t) { - return Math.sqrt(1 - --t * t) - }, t.easeCircleInOut = re, t.easeBounce = ie, t.easeBounceIn = function (t) { - return 1 - ie(1 - t) - }, t.easeBounceOut = ie, t.easeBounceInOut = function (t) { - return ((t *= 2) <= 1 ? 1 - ie(1 - t) : ie(t - 1) + 1) / 2 - }, t.easeBack = lh, t.easeBackIn = sh, t.easeBackOut = fh, t.easeBackInOut = lh, t.easeElastic = dh, t.easeElasticIn = ph, t.easeElasticOut = dh, t.easeElasticInOut = vh, t.forceCenter = function (t, n) { - function e() { - var e, i, o = r.length, - u = 0, - a = 0; - for (e = 0; e < o; ++e) u += (i = r[e]).x, a += i.y; - for (u = u / o - t, a = a / o - n, e = 0; e < o; ++e)(i = r[e]).x -= u, i.y -= a - } - var r; - return null == t && (t = 0), null == n && (n = 0), e.initialize = function (t) { - r = t - }, e.x = function (n) { - return arguments.length ? (t = +n, e) : t - }, e.y = function (t) { - return arguments.length ? (n = +t, e) : n - }, e - }, t.forceCollide = function (t) { - function n() { - for (var t, n, r, c, s, f, l, h = i.length, p = 0; p < a; ++p) - for (n = qe(i, Oe, Fe).visitAfter(e), t = 0; t < h; ++t) r = i[t], f = o[r.index], l = f * f, c = r.x + r.vx, s = r.y + r.vy, n.visit(function (t, n, e, i, o) { - var a = t.data, - h = t.r, - p = f + h; - if (!a) return n > c + p || i < c - p || e > s + p || o < s - p; - if (a.index > r.index) { - var d = c - a.x - a.vx, - v = s - a.y - a.vy, - _ = d * d + v * v; - _ < p * p && (0 === d && (d = cp(), _ += d * d), 0 === v && (v = cp(), _ += v * v), _ = (p - (_ = Math.sqrt(_))) / _ * u, r.vx += (d *= _) * (p = (h *= h) / (l + h)), r.vy += (v *= _) * p, a.vx -= d * (p = 1 - p), a.vy -= v * p) - } - }) - } - - function e(t) { - if (t.data) return t.r = o[t.data.index]; - for (var n = t.r = 0; n < 4; ++n) t[n] && t[n].r > t.r && (t.r = t[n].r) - } - - function r() { - if (i) { - var n, e, r = i.length; - for (o = new Array(r), n = 0; n < r; ++n) e = i[n], o[e.index] = +t(e, n, i) - } - } - var i, o, u = 1, - a = 1; - return "function" != typeof t && (t = ap(null == t ? 1 : +t)), n.initialize = function (t) { - i = t, r() - }, n.iterations = function (t) { - return arguments.length ? (a = +t, n) : a - }, n.strength = function (t) { - return arguments.length ? (u = +t, n) : u - }, n.radius = function (e) { - return arguments.length ? (t = "function" == typeof e ? e : ap(+e), r(), n) : t - }, n - }, t.forceLink = function (t) { - function n(n) { - for (var e = 0, r = t.length; e < p; ++e) - for (var i, a, c, f, l, h, d, v = 0; v < r; ++v) a = (i = t[v]).source, f = (c = i.target).x + c.vx - a.x - a.vx || cp(), l = c.y + c.vy - a.y - a.vy || cp(), f *= h = ((h = Math.sqrt(f * f + l * l)) - u[v]) / h * n * o[v], l *= h, c.vx -= f * (d = s[v]), c.vy -= l * d, a.vx += f * (d = 1 - d), a.vy += l * d - } - - function e() { - if (a) { - var n, e, l = a.length, - h = t.length, - p = we(a, f); - for (n = 0, c = new Array(l); n < h; ++n)(e = t[n]).index = n, "object" != typeof e.source && (e.source = Ye(p, e.source)), "object" != typeof e.target && (e.target = Ye(p, e.target)), c[e.source.index] = (c[e.source.index] || 0) + 1, c[e.target.index] = (c[e.target.index] || 0) + 1; - for (n = 0, s = new Array(h); n < h; ++n) e = t[n], s[n] = c[e.source.index] / (c[e.source.index] + c[e.target.index]); - o = new Array(h), r(), u = new Array(h), i() - } - } - - function r() { - if (a) - for (var n = 0, e = t.length; n < e; ++n) o[n] = +l(t[n], n, t) - } - - function i() { - if (a) - for (var n = 0, e = t.length; n < e; ++n) u[n] = +h(t[n], n, t) - } - var o, u, a, c, s, f = Ie, - l = function (t) { - return 1 / Math.min(c[t.source.index], c[t.target.index]) - }, - h = ap(30), - p = 1; - return null == t && (t = []), n.initialize = function (t) { - a = t, e() - }, n.links = function (r) { - return arguments.length ? (t = r, e(), n) : t - }, n.id = function (t) { - return arguments.length ? (f = t, n) : f - }, n.iterations = function (t) { - return arguments.length ? (p = +t, n) : p - }, n.strength = function (t) { - return arguments.length ? (l = "function" == typeof t ? t : ap(+t), r(), n) : l - }, n.distance = function (t) { - return arguments.length ? (h = "function" == typeof t ? t : ap(+t), i(), n) : h - }, n - }, t.forceManyBody = function () { - function t(t) { - var n, a = i.length, - c = qe(i, Be, je).visitAfter(e); - for (u = t, n = 0; n < a; ++n) o = i[n], c.visit(r) - } - - function n() { - if (i) { - var t, n, e = i.length; - for (a = new Array(e), t = 0; t < e; ++t) n = i[t], a[n.index] = +c(n, t, i) - } - } - - function e(t) { - var n, e, r, i, o, u = 0; - if (t.length) { - for (r = i = o = 0; o < 4; ++o)(n = t[o]) && (e = n.value) && (u += e, r += e * n.x, i += e * n.y); - t.x = r / u, t.y = i / u - } else { - (n = t).x = n.data.x, n.y = n.data.y; - do { - u += a[n.data.index] - } while (n = n.next) - } - t.value = u - } - - function r(t, n, e, r) { - if (!t.value) return !0; - var i = t.x - o.x, - c = t.y - o.y, - h = r - n, - p = i * i + c * c; - if (h * h / l < p) return p < f && (0 === i && (i = cp(), p += i * i), 0 === c && (c = cp(), p += c * c), p < s && (p = Math.sqrt(s * p)), o.vx += i * t.value * u / p, o.vy += c * t.value * u / p), !0; - if (!(t.length || p >= f)) { - (t.data !== o || t.next) && (0 === i && (i = cp(), p += i * i), 0 === c && (c = cp(), p += c * c), p < s && (p = Math.sqrt(s * p))); - do { - t.data !== o && (h = a[t.data.index] * u / p, o.vx += i * h, o.vy += c * h) - } while (t = t.next) - } - } - var i, o, u, a, c = ap(-30), - s = 1, - f = 1 / 0, - l = .81; - return t.initialize = function (t) { - i = t, n() - }, t.strength = function (e) { - return arguments.length ? (c = "function" == typeof e ? e : ap(+e), n(), t) : c - }, t.distanceMin = function (n) { - return arguments.length ? (s = n * n, t) : Math.sqrt(s) - }, t.distanceMax = function (n) { - return arguments.length ? (f = n * n, t) : Math.sqrt(f) - }, t.theta = function (n) { - return arguments.length ? (l = n * n, t) : Math.sqrt(l) - }, t - }, t.forceSimulation = function (t) { - function n() { - e(), d.call("tick", o), u < a && (p.stop(), d.call("end", o)) - } - - function e() { - var n, e, r = t.length; - for (u += (s - u) * c, l.each(function (t) { - t(u) - }), n = 0; n < r; ++n) null == (e = t[n]).fx ? e.x += e.vx *= f : (e.x = e.fx, e.vx = 0), null == e.fy ? e.y += e.vy *= f : (e.y = e.fy, e.vy = 0) - } - - function r() { - for (var n, e = 0, r = t.length; e < r; ++e) { - if (n = t[e], n.index = e, isNaN(n.x) || isNaN(n.y)) { - var i = hp * Math.sqrt(e), - o = e * pp; - n.x = i * Math.cos(o), n.y = i * Math.sin(o) - }(isNaN(n.vx) || isNaN(n.vy)) && (n.vx = n.vy = 0) - } - } - - function i(n) { - return n.initialize && n.initialize(t), n - } - var o, u = 1, - a = .001, - c = 1 - Math.pow(a, 1 / 300), - s = 0, - f = .6, - l = we(), - p = dn(n), - d = h("tick", "end"); - return null == t && (t = []), r(), o = { - tick: e, - restart: function () { - return p.restart(n), o - }, - stop: function () { - return p.stop(), o - }, - nodes: function (n) { - return arguments.length ? (t = n, r(), l.each(i), o) : t - }, - alpha: function (t) { - return arguments.length ? (u = +t, o) : u - }, - alphaMin: function (t) { - return arguments.length ? (a = +t, o) : a - }, - alphaDecay: function (t) { - return arguments.length ? (c = +t, o) : +c - }, - alphaTarget: function (t) { - return arguments.length ? (s = +t, o) : s - }, - velocityDecay: function (t) { - return arguments.length ? (f = 1 - t, o) : 1 - f - }, - force: function (t, n) { - return arguments.length > 1 ? (null == n ? l.remove(t) : l.set(t, i(n)), o) : l.get(t) - }, - find: function (n, e, r) { - var i, o, u, a, c, s = 0, - f = t.length; - for (null == r ? r = 1 / 0 : r *= r, s = 0; s < f; ++s)(u = (i = n - (a = t[s]).x) * i + (o = e - a.y) * o) < r && (c = a, r = u); - return c - }, - on: function (t, n) { - return arguments.length > 1 ? (d.on(t, n), o) : d.on(t) - } - } - }, t.forceX = function (t) { - function n(t) { - for (var n, e = 0, u = r.length; e < u; ++e)(n = r[e]).vx += (o[e] - n.x) * i[e] * t - } - - function e() { - if (r) { - var n, e = r.length; - for (i = new Array(e), o = new Array(e), n = 0; n < e; ++n) i[n] = isNaN(o[n] = +t(r[n], n, r)) ? 0 : +u(r[n], n, r) - } - } - var r, i, o, u = ap(.1); - return "function" != typeof t && (t = ap(null == t ? 0 : +t)), n.initialize = function (t) { - r = t, e() - }, n.strength = function (t) { - return arguments.length ? (u = "function" == typeof t ? t : ap(+t), e(), n) : u - }, n.x = function (r) { - return arguments.length ? (t = "function" == typeof r ? r : ap(+r), e(), n) : t - }, n - }, t.forceY = function (t) { - function n(t) { - for (var n, e = 0, u = r.length; e < u; ++e)(n = r[e]).vy += (o[e] - n.y) * i[e] * t - } - - function e() { - if (r) { - var n, e = r.length; - for (i = new Array(e), o = new Array(e), n = 0; n < e; ++n) i[n] = isNaN(o[n] = +t(r[n], n, r)) ? 0 : +u(r[n], n, r) - } - } - var r, i, o, u = ap(.1); - return "function" != typeof t && (t = ap(null == t ? 0 : +t)), n.initialize = function (t) { - r = t, e() - }, n.strength = function (t) { - return arguments.length ? (u = "function" == typeof t ? t : ap(+t), e(), n) : u - }, n.y = function (r) { - return arguments.length ? (t = "function" == typeof r ? r : ap(+r), e(), n) : t - }, n - }, t.formatDefaultLocale = $e, t.formatLocale = Tp, t.formatSpecifier = He, t.precisionFixed = kp, t.precisionPrefix = Np, t.precisionRound = Sp, t.geoArea = function (t) { - return Cd.reset(), Ed(t, zd), 2 * Cd - }, t.geoBounds = function (t) { - var n, e, r, i, o, u, a; - if (Dp = Up = -(Lp = qp = 1 / 0), Bp = [], Ed(t, Rd), e = Bp.length) { - for (Bp.sort(br), n = 1, o = [r = Bp[0]]; n < e; ++n) wr(r, (i = Bp[n])[0]) || wr(r, i[1]) ? (xr(r[0], i[1]) > xr(r[0], r[1]) && (r[1] = i[1]), xr(i[0], r[1]) > xr(r[0], r[1]) && (r[0] = i[0])) : o.push(r = i); - for (u = -1 / 0, n = 0, r = o[e = o.length - 1]; n <= e; r = i, ++n) i = o[n], (a = xr(r[1], i[0])) > u && (u = a, Lp = i[0], Up = r[1]) - } - return Bp = jp = null, Lp === 1 / 0 || qp === 1 / 0 ? [ - [NaN, NaN], - [NaN, NaN] - ] : [ - [Lp, qp], - [Up, Dp] - ] - }, t.geoCentroid = function (t) { - Hp = Xp = $p = Vp = Wp = Zp = Gp = Jp = Qp = Kp = td = 0, Ed(t, Ld); - var n = Qp, - e = Kp, - r = td, - i = n * n + e * e + r * r; - return i < 1e-12 && (n = Zp, e = Gp, r = Jp, Xp < ad && (n = $p, e = Vp, r = Wp), (i = n * n + e * e + r * r) < 1e-12) ? [NaN, NaN] : [_d(e, n) * hd, Ge(r / Td(i)) * hd] - }, t.geoCircle = function () { - function t() { - var t = r.apply(this, arguments), - a = i.apply(this, arguments) * pd, - c = o.apply(this, arguments) * pd; - return n = [], e = Lr(-t[0] * pd, -t[1] * pd, 0).invert, Or(u, a, c, 1), t = { - type: "Polygon", - coordinates: [n] - }, n = e = null, t - } - var n, e, r = qd([0, 0]), - i = qd(90), - o = qd(6), - u = { - point: function (t, r) { - n.push(t = e(t, r)), t[0] *= hd, t[1] *= hd - } - }; - return t.center = function (n) { - return arguments.length ? (r = "function" == typeof n ? n : qd([+n[0], +n[1]]), t) : r - }, t.radius = function (n) { - return arguments.length ? (i = "function" == typeof n ? n : qd(+n), t) : i - }, t.precision = function (n) { - return arguments.length ? (o = "function" == typeof n ? n : qd(+n), t) : o - }, t - }, t.geoClipExtent = function () { - var t, n, e, r = 0, - i = 0, - o = 960, - u = 500; - return e = { - stream: function (e) { - return t && n === e ? t : t = Br(r, i, o, u)(n = e) - }, - extent: function (a) { - return arguments.length ? (r = +a[0][0], i = +a[0][1], o = +a[1][0], u = +a[1][1], t = n = null, e) : [ - [r, i], - [o, u] - ] - } - } - }, t.geoContains = function (t, n) { - return (t && sv.hasOwnProperty(t.type) ? sv[t.type] : $r)(t, n) - }, t.geoDistance = cv, t.geoGraticule = ti, t.geoGraticule10 = function () { - return ti()() - }, t.geoInterpolate = function (t, n) { - var e = t[0] * pd, - r = t[1] * pd, - i = n[0] * pd, - o = n[1] * pd, - u = yd(r), - a = wd(r), - c = yd(o), - s = wd(o), - f = u * yd(e), - l = u * wd(e), - h = c * yd(i), - p = c * wd(i), - d = 2 * Ge(Td(Je(o - r) + u * c * Je(i - e))), - v = wd(d), - _ = d ? function (t) { - var n = wd(t *= d) / v, - e = wd(d - t) / v, - r = e * f + n * h, - i = e * l + n * p, - o = e * a + n * s; - return [_d(i, r) * hd, _d(o, Td(r * r + i * i)) * hd] - } : function () { - return [e * hd, r * hd] - }; - return _.distance = d, _ - }, t.geoLength = ov, t.geoPath = function (t, n) { - function e(t) { - return t && ("function" == typeof o && i.pointRadius(+o.apply(this, arguments)), Ed(t, r(i))), i.result() - } - var r, i, o = 4.5; - return e.area = function (t) { - return Ed(t, r(dv)), dv.result() - }, e.measure = function (t) { - return Ed(t, r(Uv)), Uv.result() - }, e.bounds = function (t) { - return Ed(t, r(mv)), mv.result() - }, e.centroid = function (t) { - return Ed(t, r(Av)), Av.result() - }, e.projection = function (n) { - return arguments.length ? (r = null == n ? (t = null, lv) : (t = n).stream, e) : t - }, e.context = function (t) { - return arguments.length ? (i = null == t ? (n = null, new yi) : new di(n = t), "function" != typeof o && i.pointRadius(o), e) : n - }, e.pointRadius = function (t) { - return arguments.length ? (o = "function" == typeof t ? t : (i.pointRadius(+t), +t), e) : o - }, e.projection(t).context(n) - }, t.geoAlbers = Xv, t.geoAlbersUsa = function () { - function t(t) { - var n = t[0], - e = t[1]; - return a = null, i.point(n, e), a || (o.point(n, e), a) || (u.point(n, e), a) - } - - function n() { - return e = r = null, t - } - var e, r, i, o, u, a, c = Xv(), - s = Hv().rotate([154, 0]).center([-2, 58.5]).parallels([55, 65]), - f = Hv().rotate([157, 0]).center([-3, 19.9]).parallels([8, 18]), - l = { - point: function (t, n) { - a = [t, n] - } - }; - return t.invert = function (t) { - var n = c.scale(), - e = c.translate(), - r = (t[0] - e[0]) / n, - i = (t[1] - e[1]) / n; - return (i >= .12 && i < .234 && r >= -.425 && r < -.214 ? s : i >= .166 && i < .234 && r >= -.214 && r < -.115 ? f : c).invert(t) - }, t.stream = function (t) { - return e && r === t ? e : e = Ri([c.stream(r = t), s.stream(t), f.stream(t)]) - }, t.precision = function (t) { - return arguments.length ? (c.precision(t), s.precision(t), f.precision(t), n()) : c.precision() - }, t.scale = function (n) { - return arguments.length ? (c.scale(n), s.scale(.35 * n), f.scale(n), t.translate(c.translate())) : c.scale() - }, t.translate = function (t) { - if (!arguments.length) return c.translate(); - var e = c.scale(), - r = +t[0], - a = +t[1]; - return i = c.translate(t).clipExtent([ - [r - .455 * e, a - .238 * e], - [r + .455 * e, a + .238 * e] - ]).stream(l), o = s.translate([r - .307 * e, a + .201 * e]).clipExtent([ - [r - .425 * e + ad, a + .12 * e + ad], - [r - .214 * e - ad, a + .234 * e - ad] - ]).stream(l), u = f.translate([r - .205 * e, a + .212 * e]).clipExtent([ - [r - .214 * e + ad, a + .166 * e + ad], - [r - .115 * e - ad, a + .234 * e - ad] - ]).stream(l), n() - }, t.fitExtent = function (n, e) { - return Ti(t, n, e) - }, t.fitSize = function (n, e) { - return ki(t, n, e) - }, t.scale(1070) - }, t.geoAzimuthalEqualArea = function () { - return Ei($v).scale(124.75).clipAngle(179.999) - }, t.geoAzimuthalEqualAreaRaw = $v, t.geoAzimuthalEquidistant = function () { - return Ei(Vv).scale(79.4188).clipAngle(179.999) - }, t.geoAzimuthalEquidistantRaw = Vv, t.geoConicConformal = function () { - return Ci(Fi).scale(109.5).parallels([30, 30]) - }, t.geoConicConformalRaw = Fi, t.geoConicEqualArea = Hv, t.geoConicEqualAreaRaw = Pi, t.geoConicEquidistant = function () { - return Ci(Yi).scale(131.154).center([0, 13.9389]) - }, t.geoConicEquidistantRaw = Yi, t.geoEquirectangular = function () { - return Ei(Ii).scale(152.63) - }, t.geoEquirectangularRaw = Ii, t.geoGnomonic = function () { - return Ei(Bi).scale(144.049).clipAngle(60) - }, t.geoGnomonicRaw = Bi, t.geoIdentity = function () { - function t() { - return i = o = null, u - } - var n, e, r, i, o, u, a = 1, - c = 0, - s = 0, - f = 1, - l = 1, - h = lv, - p = null, - d = lv; - return u = { - stream: function (t) { - return i && o === t ? i : i = h(d(o = t)) - }, - clipExtent: function (i) { - return arguments.length ? (d = null == i ? (p = n = e = r = null, lv) : Br(p = +i[0][0], n = +i[0][1], e = +i[1][0], r = +i[1][1]), t()) : null == p ? null : [ - [p, n], - [e, r] - ] - }, - scale: function (n) { - return arguments.length ? (h = ji((a = +n) * f, a * l, c, s), t()) : a - }, - translate: function (n) { - return arguments.length ? (h = ji(a * f, a * l, c = +n[0], s = +n[1]), t()) : [c, s] - }, - reflectX: function (n) { - return arguments.length ? (h = ji(a * (f = n ? -1 : 1), a * l, c, s), t()) : f < 0 - }, - reflectY: function (n) { - return arguments.length ? (h = ji(a * f, a * (l = n ? -1 : 1), c, s), t()) : l < 0 - }, - fitExtent: function (t, n) { - return Ti(u, t, n) - }, - fitSize: function (t, n) { - return ki(u, t, n) - } - } - }, t.geoProjection = Ei, t.geoProjectionMutator = Ai, t.geoMercator = function () { - return Di(Ui).scale(961 / ld) - }, t.geoMercatorRaw = Ui, t.geoOrthographic = function () { - return Ei(Hi).scale(249.5).clipAngle(90 + ad) - }, t.geoOrthographicRaw = Hi, t.geoStereographic = function () { - return Ei(Xi).scale(250).clipAngle(142) - }, t.geoStereographicRaw = Xi, t.geoTransverseMercator = function () { - var t = Di($i), - n = t.center, - e = t.rotate; - return t.center = function (t) { - return arguments.length ? n([-t[1], t[0]]) : (t = n(), [t[1], -t[0]]) - }, t.rotate = function (t) { - return arguments.length ? e([t[0], t[1], t.length > 2 ? t[2] + 90 : 90]) : (t = e(), [t[0], t[1], t[2] - 90]) - }, e([0, 0, 90]).scale(159.155) - }, t.geoTransverseMercatorRaw = $i, t.geoRotation = Wd, t.geoStream = Ed, t.geoTransform = function (t) { - return { - stream: wi(t) - } - }, t.cluster = function () { - function t(t) { - var o, u = 0; - t.eachAfter(function (t) { - var e = t.children; - e ? (t.x = Wi(e), t.y = Gi(e)) : (t.x = o ? u += n(t, o) : 0, t.y = 0, o = t) - }); - var a = Qi(t), - c = Ki(t), - s = a.x - n(a, c) / 2, - f = c.x + n(c, a) / 2; - return t.eachAfter(i ? function (n) { - n.x = (n.x - t.x) * e, n.y = (t.y - n.y) * r - } : function (n) { - n.x = (n.x - s) / (f - s) * e, n.y = (1 - (t.y ? n.y / t.y : 1)) * r - }) - } - var n = Vi, - e = 1, - r = 1, - i = !1; - return t.separation = function (e) { - return arguments.length ? (n = e, t) : n - }, t.size = function (n) { - return arguments.length ? (i = !1, e = +n[0], r = +n[1], t) : i ? null : [e, r] - }, t.nodeSize = function (n) { - return arguments.length ? (i = !0, e = +n[0], r = +n[1], t) : i ? [e, r] : null - }, t - }, t.hierarchy = eo, t.pack = function () { - function t(t) { - return t.x = e / 2, t.y = r / 2, n ? t.eachBefore(No(n)).eachAfter(So(i, .5)).eachBefore(Eo(1)) : t.eachBefore(No(ko)).eachAfter(So(To, 1)).eachAfter(So(i, t.r / Math.min(e, r))).eachBefore(Eo(Math.min(e, r) / (2 * t.r))), t - } - var n = null, - e = 1, - r = 1, - i = To; - return t.radius = function (e) { - return arguments.length ? (n = wo(e), t) : n - }, t.size = function (n) { - return arguments.length ? (e = +n[0], r = +n[1], t) : [e, r] - }, t.padding = function (n) { - return arguments.length ? (i = "function" == typeof n ? n : Gv(+n), t) : i - }, t - }, t.packSiblings = function (t) { - return bo(t), t - }, t.packEnclose = Zv, t.partition = function () { - function t(t) { - var u = t.height + 1; - return t.x0 = t.y0 = i, t.x1 = e, t.y1 = r / u, t.eachBefore(n(r, u)), o && t.eachBefore(Jv), t - } - - function n(t, n) { - return function (e) { - e.children && Qv(e, e.x0, t * (e.depth + 1) / n, e.x1, t * (e.depth + 2) / n); - var r = e.x0, - o = e.y0, - u = e.x1 - i, - a = e.y1 - i; - u < r && (r = u = (r + u) / 2), a < o && (o = a = (o + a) / 2), e.x0 = r, e.y0 = o, e.x1 = u, e.y1 = a - } - } - var e = 1, - r = 1, - i = 0, - o = !1; - return t.round = function (n) { - return arguments.length ? (o = !!n, t) : o - }, t.size = function (n) { - return arguments.length ? (e = +n[0], r = +n[1], t) : [e, r] - }, t.padding = function (n) { - return arguments.length ? (i = +n, t) : i - }, t - }, t.stratify = function () { - function t(t) { - var r, i, o, u, a, c, s, f = t.length, - l = new Array(f), - h = {}; - for (i = 0; i < f; ++i) r = t[i], a = l[i] = new uo(r), null != (c = n(r, i, t)) && (c += "") && (h[s = Kv + (a.id = c)] = s in h ? n_ : a); - for (i = 0; i < f; ++i) - if (a = l[i], null != (c = e(t[i], i, t)) && (c += "")) { - if (!(u = h[Kv + c])) throw new Error("missing: " + c); - if (u === n_) throw new Error("ambiguous: " + c); - u.children ? u.children.push(a) : u.children = [a], a.parent = u - } else { - if (o) throw new Error("multiple roots"); - o = a - } - if (!o) throw new Error("no root"); - if (o.parent = t_, o.eachBefore(function (t) { - t.depth = t.parent.depth + 1, --f - }).eachBefore(oo), o.parent = null, f > 0) throw new Error("cycle"); - return o - } - var n = Ao, - e = Co; - return t.id = function (e) { - return arguments.length ? (n = Mo(e), t) : n - }, t.parentId = function (n) { - return arguments.length ? (e = Mo(n), t) : e - }, t - }, t.tree = function () { - function t(t) { - var r = Oo(t); - if (r.eachAfter(n), r.parent.m = -r.z, r.eachBefore(e), c) t.eachBefore(i); - else { - var s = t, - f = t, - l = t; - t.eachBefore(function (t) { - t.x < s.x && (s = t), t.x > f.x && (f = t), t.depth > l.depth && (l = t) - }); - var h = s === f ? 1 : o(s, f) / 2, - p = h - s.x, - d = u / (f.x + h + p), - v = a / (l.depth || 1); - t.eachBefore(function (t) { - t.x = (t.x + p) * d, t.y = t.depth * v - }) - } - return t - } - - function n(t) { - var n = t.children, - e = t.parent.children, - i = t.i ? e[t.i - 1] : null; - if (n) { - qo(t); - var u = (n[0].z + n[n.length - 1].z) / 2; - i ? (t.z = i.z + o(t._, i._), t.m = t.z - u) : t.z = u - } else i && (t.z = i.z + o(t._, i._)); - t.parent.A = r(t, i, t.parent.A || e[0]) - } - - function e(t) { - t._.x = t.z + t.parent.m, t.m += t.parent.m - } - - function r(t, n, e) { - if (n) { - for (var r, i = t, u = t, a = n, c = i.parent.children[0], s = i.m, f = u.m, l = a.m, h = c.m; a = Ro(a), i = Po(i), a && i;) c = Po(c), (u = Ro(u)).a = t, (r = a.z + l - i.z - s + o(a._, i._)) > 0 && (Lo(Uo(a, t, e), t, r), s += r, f += r), l += a.m, s += i.m, h += c.m, f += u.m; - a && !Ro(u) && (u.t = a, u.m += l - f), i && !Po(c) && (c.t = i, c.m += s - h, e = t) - } - return e - } - - function i(t) { - t.x *= u, t.y = t.depth * a - } - var o = zo, - u = 1, - a = 1, - c = null; - return t.separation = function (n) { - return arguments.length ? (o = n, t) : o - }, t.size = function (n) { - return arguments.length ? (c = !1, u = +n[0], a = +n[1], t) : c ? null : [u, a] - }, t.nodeSize = function (n) { - return arguments.length ? (c = !0, u = +n[0], a = +n[1], t) : c ? [u, a] : null - }, t - }, t.treemap = function () { - function t(t) { - return t.x0 = t.y0 = 0, t.x1 = i, t.y1 = o, t.eachBefore(n), u = [0], r && t.eachBefore(Jv), t - } - - function n(t) { - var n = u[t.depth], - r = t.x0 + n, - i = t.y0 + n, - o = t.x1 - n, - h = t.y1 - n; - o < r && (r = o = (r + o) / 2), h < i && (i = h = (i + h) / 2), t.x0 = r, t.y0 = i, t.x1 = o, t.y1 = h, t.children && (n = u[t.depth + 1] = a(t) / 2, r += l(t) - n, i += c(t) - n, o -= s(t) - n, h -= f(t) - n, o < r && (r = o = (r + o) / 2), h < i && (i = h = (i + h) / 2), e(t, r, i, o, h)) - } - var e = i_, - r = !1, - i = 1, - o = 1, - u = [0], - a = To, - c = To, - s = To, - f = To, - l = To; - return t.round = function (n) { - return arguments.length ? (r = !!n, t) : r - }, t.size = function (n) { - return arguments.length ? (i = +n[0], o = +n[1], t) : [i, o] - }, t.tile = function (n) { - return arguments.length ? (e = Mo(n), t) : e - }, t.padding = function (n) { - return arguments.length ? t.paddingInner(n).paddingOuter(n) : t.paddingInner() - }, t.paddingInner = function (n) { - return arguments.length ? (a = "function" == typeof n ? n : Gv(+n), t) : a - }, t.paddingOuter = function (n) { - return arguments.length ? t.paddingTop(n).paddingRight(n).paddingBottom(n).paddingLeft(n) : t.paddingTop() - }, t.paddingTop = function (n) { - return arguments.length ? (c = "function" == typeof n ? n : Gv(+n), t) : c - }, t.paddingRight = function (n) { - return arguments.length ? (s = "function" == typeof n ? n : Gv(+n), t) : s - }, t.paddingBottom = function (n) { - return arguments.length ? (f = "function" == typeof n ? n : Gv(+n), t) : f - }, t.paddingLeft = function (n) { - return arguments.length ? (l = "function" == typeof n ? n : Gv(+n), t) : l - }, t - }, t.treemapBinary = function (t, n, e, r, i) { - function o(t, n, e, r, i, u, a) { - if (t >= n - 1) { - var s = c[t]; - return s.x0 = r, s.y0 = i, s.x1 = u, void(s.y1 = a) - } - for (var l = f[t], h = e / 2 + l, p = t + 1, d = n - 1; p < d;) { - var v = p + d >>> 1; - f[v] < h ? p = v + 1 : d = v - } - h - f[p - 1] < f[p] - h && t + 1 < p && --p; - var _ = f[p] - l, - y = e - _; - if (u - r > a - i) { - var g = (r * y + u * _) / e; - o(t, p, _, r, i, g, a), o(p, n, y, g, i, u, a) - } else { - var m = (i * y + a * _) / e; - o(t, p, _, r, i, u, m), o(p, n, y, r, m, u, a) - } - } - var u, a, c = t.children, - s = c.length, - f = new Array(s + 1); - for (f[0] = a = u = 0; u < s; ++u) f[u + 1] = a += c[u].value; - o(0, s, t.value, n, e, r, i) - }, t.treemapDice = Qv, t.treemapSlice = e_, t.treemapSliceDice = function (t, n, e, r, i) { - (1 & t.depth ? e_ : Qv)(t, n, e, r, i) - }, t.treemapSquarify = i_, t.treemapResquarify = o_, t.interpolate = cl, t.interpolateArray = nl, t.interpolateBasis = Zf, t.interpolateBasisClosed = Gf, t.interpolateDate = el, t.interpolateNumber = rl, t.interpolateObject = il, t.interpolateRound = sl, t.interpolateString = al, t.interpolateTransformCss = pl, t.interpolateTransformSvg = dl, t.interpolateZoom = _l, t.interpolateRgb = Qf, t.interpolateRgbBasis = Kf, t.interpolateRgbBasisClosed = tl, t.interpolateHsl = yl, t.interpolateHslLong = gl, t.interpolateLab = function (t, n) { - var e = Kt((t = Ut(t)).l, (n = Ut(n)).l), - r = Kt(t.a, n.a), - i = Kt(t.b, n.b), - o = Kt(t.opacity, n.opacity); - return function (n) { - return t.l = e(n), t.a = r(n), t.b = i(n), t.opacity = o(n), t + "" - } - }, t.interpolateHcl = ml, t.interpolateHclLong = xl, t.interpolateCubehelix = bl, t.interpolateCubehelixLong = wl, t.quantize = function (t, n) { - for (var e = new Array(n), r = 0; r < n; ++r) e[r] = t(r / (n - 1)); - return e - }, t.path = ve, t.polygonArea = function (t) { - for (var n, e = -1, r = t.length, i = t[r - 1], o = 0; ++e < r;) n = i, i = t[e], o += n[1] * i[0] - n[0] * i[1]; - return o / 2 - }, t.polygonCentroid = function (t) { - for (var n, e, r = -1, i = t.length, o = 0, u = 0, a = t[i - 1], c = 0; ++r < i;) n = a, a = t[r], c += e = n[0] * a[1] - a[0] * n[1], o += (n[0] + a[0]) * e, u += (n[1] + a[1]) * e; - return c *= 3, [o / c, u / c] - }, t.polygonHull = function (t) { - if ((e = t.length) < 3) return null; - var n, e, r = new Array(e), - i = new Array(e); - for (n = 0; n < e; ++n) r[n] = [+t[n][0], +t[n][1], n]; - for (r.sort(Io), n = 0; n < e; ++n) i[n] = [r[n][0], -r[n][1]]; - var o = Yo(r), - u = Yo(i), - a = u[0] === o[0], - c = u[u.length - 1] === o[o.length - 1], - s = []; - for (n = o.length - 1; n >= 0; --n) s.push(t[r[o[n]][2]]); - for (n = +a; n < u.length - c; ++n) s.push(t[r[u[n]][2]]); - return s - }, t.polygonContains = function (t, n) { - for (var e, r, i = t.length, o = t[i - 1], u = n[0], a = n[1], c = o[0], s = o[1], f = !1, l = 0; l < i; ++l) e = (o = t[l])[0], (r = o[1]) > a != s > a && u < (c - e) * (a - r) / (s - r) + e && (f = !f), c = e, s = r; - return f - }, t.polygonLength = function (t) { - for (var n, e, r = -1, i = t.length, o = t[i - 1], u = o[0], a = o[1], c = 0; ++r < i;) n = u, e = a, n -= u = (o = t[r])[0], e -= a = o[1], c += Math.sqrt(n * n + e * e); - return c - }, t.quadtree = qe, t.queue = Wo, t.randomUniform = f_, t.randomNormal = l_, t.randomLogNormal = h_, t.randomBates = d_, t.randomIrwinHall = p_, t.randomExponential = v_, t.request = __, t.html = g_, t.json = m_, t.text = x_, t.xml = b_, t.csv = M_, t.tsv = T_, t.scaleBand = Ko, t.scalePoint = function () { - return tu(Ko().paddingInner(1)) - }, t.scaleIdentity = fu, t.scaleLinear = su, t.scaleLog = yu, t.scaleOrdinal = Qo, t.scaleImplicit = E_, t.scalePow = mu, t.scaleSqrt = function () { - return mu().exponent(.5) - }, t.scaleQuantile = xu, t.scaleQuantize = bu, t.scaleThreshold = wu, t.scaleTime = function () { - return Na(fy, cy, W_, $_, H_, B_, I_, U_, t.timeFormat).domain([new Date(2e3, 0, 1), new Date(2e3, 0, 2)]) - }, t.scaleUtc = function () { - return Na(Ly, Py, gy, _y, dy, hy, I_, U_, t.utcFormat).domain([Date.UTC(2e3, 0, 1), Date.UTC(2e3, 0, 2)]) - }, t.schemeCategory10 = Jy, t.schemeCategory20b = Qy, t.schemeCategory20c = Ky, t.schemeCategory20 = tg, t.interpolateCubehelixDefault = ng, t.interpolateRainbow = function (t) { - (t < 0 || t > 1) && (t -= Math.floor(t)); - var n = Math.abs(t - .5); - return ig.h = 360 * t - 100, ig.s = 1.5 - 1.5 * n, ig.l = .8 - .9 * n, ig + "" - }, t.interpolateWarm = eg, t.interpolateCool = rg, t.interpolateViridis = og, t.interpolateMagma = ug, t.interpolateInferno = ag, t.interpolatePlasma = cg, t.scaleSequential = Ea, t.creator = Hs, t.local = m, t.matcher = Zs, t.mouse = Ks, t.namespace = js, t.namespaces = Bs, t.select = cf, t.selectAll = function (t) { - return "string" == typeof t ? new pt([document.querySelectorAll(t)], [document.documentElement]) : new pt([null == t ? [] : t], af) - }, t.selection = dt, t.selector = tf, t.selectorAll = nf, t.style = B, t.touch = sf, t.touches = function (t, n) { - null == n && (n = Js().touches); - for (var e = 0, r = n ? n.length : 0, i = new Array(r); e < r; ++e) i[e] = Qs(t, n[e]); - return i - }, t.window = uf, t.customEvent = N, t.arc = function () { - function t() { - var t, s, f = +n.apply(this, arguments), - l = +e.apply(this, arguments), - h = o.apply(this, arguments) - mg, - p = u.apply(this, arguments) - mg, - d = fg(p - h), - v = p > h; - if (c || (c = t = ve()), l < f && (s = l, l = f, f = s), l > yg) - if (d > xg - yg) c.moveTo(l * hg(h), l * vg(h)), c.arc(0, 0, l, h, p, !v), f > yg && (c.moveTo(f * hg(p), f * vg(p)), c.arc(0, 0, f, p, h, v)); - else { - var _, y, g = h, - m = p, - x = h, - b = p, - w = d, - M = d, - T = a.apply(this, arguments) / 2, - k = T > yg && (i ? +i.apply(this, arguments) : _g(f * f + l * l)), - N = dg(fg(l - f) / 2, +r.apply(this, arguments)), - S = N, - E = N; - if (k > yg) { - var A = Ca(k / f * vg(T)), - C = Ca(k / l * vg(T)); - (w -= 2 * A) > yg ? (A *= v ? 1 : -1, x += A, b -= A) : (w = 0, x = b = (h + p) / 2), (M -= 2 * C) > yg ? (C *= v ? 1 : -1, g += C, m -= C) : (M = 0, g = m = (h + p) / 2) - } - var z = l * hg(g), - P = l * vg(g), - R = f * hg(b), - L = f * vg(b); - if (N > yg) { - var q = l * hg(m), - U = l * vg(m), - D = f * hg(x), - O = f * vg(x); - if (d < gg) { - var F = w > yg ? Ua(z, P, D, O, q, U, R, L) : [R, L], - I = z - F[0], - Y = P - F[1], - B = q - F[0], - j = U - F[1], - H = 1 / vg(Aa((I * B + Y * j) / (_g(I * I + Y * Y) * _g(B * B + j * j))) / 2), - X = _g(F[0] * F[0] + F[1] * F[1]); - S = dg(N, (f - X) / (H - 1)), E = dg(N, (l - X) / (H + 1)) - } - } - M > yg ? E > yg ? (_ = Da(D, O, z, P, l, E, v), y = Da(q, U, R, L, l, E, v), c.moveTo(_.cx + _.x01, _.cy + _.y01), E < N ? c.arc(_.cx, _.cy, E, lg(_.y01, _.x01), lg(y.y01, y.x01), !v) : (c.arc(_.cx, _.cy, E, lg(_.y01, _.x01), lg(_.y11, _.x11), !v), c.arc(0, 0, l, lg(_.cy + _.y11, _.cx + _.x11), lg(y.cy + y.y11, y.cx + y.x11), !v), c.arc(y.cx, y.cy, E, lg(y.y11, y.x11), lg(y.y01, y.x01), !v))) : (c.moveTo(z, P), c.arc(0, 0, l, g, m, !v)) : c.moveTo(z, P), f > yg && w > yg ? S > yg ? (_ = Da(R, L, q, U, f, -S, v), y = Da(z, P, D, O, f, -S, v), c.lineTo(_.cx + _.x01, _.cy + _.y01), S < N ? c.arc(_.cx, _.cy, S, lg(_.y01, _.x01), lg(y.y01, y.x01), !v) : (c.arc(_.cx, _.cy, S, lg(_.y01, _.x01), lg(_.y11, _.x11), !v), c.arc(0, 0, f, lg(_.cy + _.y11, _.cx + _.x11), lg(y.cy + y.y11, y.cx + y.x11), v), c.arc(y.cx, y.cy, S, lg(y.y11, y.x11), lg(y.y01, y.x01), !v))) : c.arc(0, 0, f, b, x, v) : c.lineTo(R, L) - } - else c.moveTo(0, 0); - if (c.closePath(), t) return c = null, t + "" || null - } - var n = za, - e = Pa, - r = sg(0), - i = null, - o = Ra, - u = La, - a = qa, - c = null; - return t.centroid = function () { - var t = (+n.apply(this, arguments) + +e.apply(this, arguments)) / 2, - r = (+o.apply(this, arguments) + +u.apply(this, arguments)) / 2 - gg / 2; - return [hg(r) * t, vg(r) * t] - }, t.innerRadius = function (e) { - return arguments.length ? (n = "function" == typeof e ? e : sg(+e), t) : n - }, t.outerRadius = function (n) { - return arguments.length ? (e = "function" == typeof n ? n : sg(+n), t) : e - }, t.cornerRadius = function (n) { - return arguments.length ? (r = "function" == typeof n ? n : sg(+n), t) : r - }, t.padRadius = function (n) { - return arguments.length ? (i = null == n ? null : "function" == typeof n ? n : sg(+n), t) : i - }, t.startAngle = function (n) { - return arguments.length ? (o = "function" == typeof n ? n : sg(+n), t) : o - }, t.endAngle = function (n) { - return arguments.length ? (u = "function" == typeof n ? n : sg(+n), t) : u - }, t.padAngle = function (n) { - return arguments.length ? (a = "function" == typeof n ? n : sg(+n), t) : a - }, t.context = function (n) { - return arguments.length ? (c = null == n ? null : n, t) : c - }, t - }, t.area = Mg, t.line = wg, t.pie = function () { - function t(t) { - var a, c, s, f, l, h = t.length, - p = 0, - d = new Array(h), - v = new Array(h), - _ = +i.apply(this, arguments), - y = Math.min(xg, Math.max(-xg, o.apply(this, arguments) - _)), - g = Math.min(Math.abs(y) / h, u.apply(this, arguments)), - m = g * (y < 0 ? -1 : 1); - for (a = 0; a < h; ++a)(l = v[d[a] = a] = +n(t[a], a, t)) > 0 && (p += l); - for (null != e ? d.sort(function (t, n) { - return e(v[t], v[n]) - }) : null != r && d.sort(function (n, e) { - return r(t[n], t[e]) - }), a = 0, s = p ? (y - h * m) / p : 0; a < h; ++a, _ = f) c = d[a], f = _ + ((l = v[c]) > 0 ? l * s : 0) + m, v[c] = { - data: t[c], - index: a, - value: l, - startAngle: _, - endAngle: f, - padAngle: g - }; - return v - } - var n = kg, - e = Tg, - r = null, - i = sg(0), - o = sg(xg), - u = sg(0); - return t.value = function (e) { - return arguments.length ? (n = "function" == typeof e ? e : sg(+e), t) : n - }, t.sortValues = function (n) { - return arguments.length ? (e = n, r = null, t) : e - }, t.sort = function (n) { - return arguments.length ? (r = n, e = null, t) : r - }, t.startAngle = function (n) { - return arguments.length ? (i = "function" == typeof n ? n : sg(+n), t) : i - }, t.endAngle = function (n) { - return arguments.length ? (o = "function" == typeof n ? n : sg(+n), t) : o - }, t.padAngle = function (n) { - return arguments.length ? (u = "function" == typeof n ? n : sg(+n), t) : u - }, t - }, t.areaRadial = Eg, t.radialArea = Eg, t.lineRadial = Sg, t.radialLine = Sg, t.pointRadial = Ag, t.linkHorizontal = function () { - return $a(Va) - }, t.linkVertical = function () { - return $a(Wa) - }, t.linkRadial = function () { - var t = $a(Za); - return t.angle = t.x, delete t.x, t.radius = t.y, delete t.y, t - }, t.symbol = function () { - function t() { - var t; - if (r || (r = t = ve()), n.apply(this, arguments).draw(r, +e.apply(this, arguments)), t) return r = null, t + "" || null - } - var n = sg(zg), - e = sg(64), - r = null; - return t.type = function (e) { - return arguments.length ? (n = "function" == typeof e ? e : sg(e), t) : n - }, t.size = function (n) { - return arguments.length ? (e = "function" == typeof n ? n : sg(+n), t) : e - }, t.context = function (n) { - return arguments.length ? (r = null == n ? null : n, t) : r - }, t - }, t.symbols = Wg, t.symbolCircle = zg, t.symbolCross = Pg, t.symbolDiamond = qg, t.symbolSquare = Ig, t.symbolStar = Fg, t.symbolTriangle = Bg, t.symbolWye = Vg, t.curveBasisClosed = function (t) { - return new Qa(t) - }, t.curveBasisOpen = function (t) { - return new Ka(t) - }, t.curveBasis = function (t) { - return new Ja(t) - }, t.curveBundle = Gg, t.curveCardinalClosed = Qg, t.curveCardinalOpen = Kg, t.curveCardinal = Jg, t.curveCatmullRomClosed = nm, t.curveCatmullRomOpen = em, t.curveCatmullRom = tm, t.curveLinearClosed = function (t) { - return new sc(t) - }, t.curveLinear = bg, t.curveMonotoneX = function (t) { - return new dc(t) - }, t.curveMonotoneY = function (t) { - return new vc(t) - }, t.curveNatural = function (t) { - return new yc(t) - }, t.curveStep = function (t) { - return new mc(t, .5) - }, t.curveStepAfter = function (t) { - return new mc(t, 1) - }, t.curveStepBefore = function (t) { - return new mc(t, 0) - }, t.stack = function () { - function t(t) { - var o, u, a = n.apply(this, arguments), - c = t.length, - s = a.length, - f = new Array(s); - for (o = 0; o < s; ++o) { - for (var l, h = a[o], p = f[o] = new Array(c), d = 0; d < c; ++d) p[d] = l = [0, +i(t[d], h, d, t)], l.data = t[d]; - p.key = h - } - for (o = 0, u = e(f); o < s; ++o) f[u[o]].index = o; - return r(f, u), f - } - var n = sg([]), - e = im, - r = rm, - i = xc; - return t.keys = function (e) { - return arguments.length ? (n = "function" == typeof e ? e : sg(Cg.call(e)), t) : n - }, t.value = function (n) { - return arguments.length ? (i = "function" == typeof n ? n : sg(+n), t) : i - }, t.order = function (n) { - return arguments.length ? (e = null == n ? im : "function" == typeof n ? n : sg(Cg.call(n)), t) : e - }, t.offset = function (n) { - return arguments.length ? (r = null == n ? rm : n, t) : r - }, t - }, t.stackOffsetExpand = function (t, n) { - if ((r = t.length) > 0) { - for (var e, r, i, o = 0, u = t[0].length; o < u; ++o) { - for (i = e = 0; e < r; ++e) i += t[e][o][1] || 0; - if (i) - for (e = 0; e < r; ++e) t[e][o][1] /= i - } - rm(t, n) - } - }, t.stackOffsetDiverging = function (t, n) { - if ((a = t.length) > 1) - for (var e, r, i, o, u, a, c = 0, s = t[n[0]].length; c < s; ++c) - for (o = u = 0, e = 0; e < a; ++e)(i = (r = t[n[e]][c])[1] - r[0]) >= 0 ? (r[0] = o, r[1] = o += i) : i < 0 ? (r[1] = u, r[0] = u += i) : r[0] = o - }, t.stackOffsetNone = rm, t.stackOffsetSilhouette = function (t, n) { - if ((e = t.length) > 0) { - for (var e, r = 0, i = t[n[0]], o = i.length; r < o; ++r) { - for (var u = 0, a = 0; u < e; ++u) a += t[u][r][1] || 0; - i[r][1] += i[r][0] = -a / 2 - } - rm(t, n) - } - }, t.stackOffsetWiggle = function (t, n) { - if ((i = t.length) > 0 && (r = (e = t[n[0]]).length) > 0) { - for (var e, r, i, o = 0, u = 1; u < r; ++u) { - for (var a = 0, c = 0, s = 0; a < i; ++a) { - for (var f = t[n[a]], l = f[u][1] || 0, h = (l - (f[u - 1][1] || 0)) / 2, p = 0; p < a; ++p) { - var d = t[n[p]]; - h += (d[u][1] || 0) - (d[u - 1][1] || 0) - } - c += l, s += h * l - } - e[u - 1][1] += e[u - 1][0] = o, c && (o -= s / c) - } - e[u - 1][1] += e[u - 1][0] = o, rm(t, n) - } - }, t.stackOrderAscending = om, t.stackOrderDescending = function (t) { - return om(t).reverse() - }, t.stackOrderInsideOut = function (t) { - var n, e, r = t.length, - i = t.map(bc), - o = im(t).sort(function (t, n) { - return i[n] - i[t] - }), - u = 0, - a = 0, - c = [], - s = []; - for (n = 0; n < r; ++n) e = o[n], u < a ? (u += i[e], c.push(e)) : (a += i[e], s.push(e)); - return s.reverse().concat(c) - }, t.stackOrderNone = im, t.stackOrderReverse = function (t) { - return im(t).reverse() - }, t.timeInterval = Mu, t.timeMillisecond = U_, t.timeMilliseconds = D_, t.utcMillisecond = U_, t.utcMilliseconds = D_, t.timeSecond = I_, t.timeSeconds = Y_, t.utcSecond = I_, t.utcSeconds = Y_, t.timeMinute = B_, t.timeMinutes = j_, t.timeHour = H_, t.timeHours = X_, t.timeDay = $_, t.timeDays = V_, t.timeWeek = W_, t.timeWeeks = ny, t.timeSunday = W_, t.timeSundays = ny, t.timeMonday = Z_, t.timeMondays = ey, t.timeTuesday = G_, t.timeTuesdays = ry, t.timeWednesday = J_, t.timeWednesdays = iy, t.timeThursday = Q_, t.timeThursdays = oy, t.timeFriday = K_, t.timeFridays = uy, t.timeSaturday = ty, t.timeSaturdays = ay, t.timeMonth = cy, t.timeMonths = sy, t.timeYear = fy, t.timeYears = ly, t.utcMinute = hy, t.utcMinutes = py, t.utcHour = dy, t.utcHours = vy, t.utcDay = _y, t.utcDays = yy, t.utcWeek = gy, t.utcWeeks = ky, t.utcSunday = gy, t.utcSundays = ky, t.utcMonday = my, t.utcMondays = Ny, t.utcTuesday = xy, t.utcTuesdays = Sy, t.utcWednesday = by, t.utcWednesdays = Ey, t.utcThursday = wy, t.utcThursdays = Ay, t.utcFriday = My, t.utcFridays = Cy, t.utcSaturday = Ty, t.utcSaturdays = zy, t.utcMonth = Py, t.utcMonths = Ry, t.utcYear = Ly, t.utcYears = Uy, t.timeFormatDefaultLocale = Ma, t.timeFormatLocale = Au, t.isoFormat = Yy, t.isoParse = By, t.now = ln, t.timer = dn, t.timerFlush = vn, t.timeout = Pl, t.interval = function (t, n, e) { - var r = new pn, - i = n; - return null == n ? (r.restart(t, n, e), r) : (n = +n, e = null == e ? ln() : +e, r.restart(function o(u) { - u += i, r.restart(o, i += n, e), t(u) - }, n, e), r) - }, t.transition = Jn, t.active = function (t, n) { - var e, r, i = t.__transition; - if (i) { - n = null == n ? null : n + ""; - for (r in i) - if ((e = i[r]).state > Ul && e.name === n) return new Gn([ - [t] - ], yh, n, +r) - } - return null - }, t.interrupt = jl, t.voronoi = function () { - function t(t) { - return new Kc(t.map(function (r, i) { - var o = [Math.round(n(r, i, t) / dm) * dm, Math.round(e(r, i, t) / dm) * dm]; - return o.index = i, o.data = r, o - }), r) - } - var n = wc, - e = Mc, - r = null; - return t.polygons = function (n) { - return t(n).polygons() - }, t.links = function (n) { - return t(n).links() - }, t.triangles = function (n) { - return t(n).triangles() - }, t.x = function (e) { - return arguments.length ? (n = "function" == typeof e ? e : um(+e), t) : n - }, t.y = function (n) { - return arguments.length ? (e = "function" == typeof n ? n : um(+n), t) : e - }, t.extent = function (n) { - return arguments.length ? (r = null == n ? null : [ - [+n[0][0], +n[0][1]], - [+n[1][0], +n[1][1]] - ], t) : r && [ - [r[0][0], r[0][1]], - [r[1][0], r[1][1]] - ] - }, t.size = function (n) { - return arguments.length ? (r = null == n ? null : [ - [0, 0], - [+n[0], +n[1]] - ], t) : r && [r[1][0] - r[0][0], r[1][1] - r[0][1]] - }, t - }, t.zoom = function () { - function n(t) { - t.property("__zoom", us).on("wheel.zoom", s).on("mousedown.zoom", f).on("dblclick.zoom", l).filter(cs).on("touchstart.zoom", p).on("touchmove.zoom", d).on("touchend.zoom touchcancel.zoom", v).style("touch-action", "none").style("-webkit-tap-highlight-color", "rgba(0,0,0,0)") - } - - function e(t, n) { - return (n = Math.max(b, Math.min(w, n))) === t.k ? t : new ns(n, t.x, t.y) - } - - function r(t, n, e) { - var r = n[0] - e[0] * t.k, - i = n[1] - e[1] * t.k; - return r === t.x && i === t.y ? t : new ns(t.k, r, i) - } - - function i(t, n) { - var e = t.invertX(n[0][0]) - M, - r = t.invertX(n[1][0]) - T, - i = t.invertY(n[0][1]) - k, - o = t.invertY(n[1][1]) - S; - return t.translate(r > e ? (e + r) / 2 : Math.min(0, e) || Math.max(0, r), o > i ? (i + o) / 2 : Math.min(0, i) || Math.max(0, o)) - } - - function o(t) { - return [(+t[0][0] + +t[1][0]) / 2, (+t[0][1] + +t[1][1]) / 2] - } - - function u(t, n, e) { - t.on("start.zoom", function () { - a(this, arguments).start() - }).on("interrupt.zoom end.zoom", function () { - a(this, arguments).end() - }).tween("zoom", function () { - var t = this, - r = arguments, - i = a(t, r), - u = m.apply(t, r), - c = e || o(u), - s = Math.max(u[1][0] - u[0][0], u[1][1] - u[0][1]), - f = t.__zoom, - l = "function" == typeof n ? n.apply(t, r) : n, - h = A(f.invert(c).concat(s / f.k), l.invert(c).concat(s / l.k)); - return function (t) { - if (1 === t) t = l; - else { - var n = h(t), - e = s / n[2]; - t = new ns(e, c[0] - n[0] * e, c[1] - n[1] * e) - } - i.zoom(null, t) - } - }) - } - - function a(t, n) { - for (var e, r = 0, i = C.length; r < i; ++r) - if ((e = C[r]).that === t) return e; - return new c(t, n) - } - - function c(t, n) { - this.that = t, this.args = n, this.index = -1, this.active = 0, this.extent = m.apply(t, n) - } - - function s() { - if (g.apply(this, arguments)) { - var t = a(this, arguments), - n = this.__zoom, - o = Math.max(b, Math.min(w, n.k * Math.pow(2, x.apply(this, arguments)))), - u = Ks(this); - if (t.wheel) t.mouse[0][0] === u[0] && t.mouse[0][1] === u[1] || (t.mouse[1] = n.invert(t.mouse[0] = u)), clearTimeout(t.wheel); - else { - if (n.k === o) return; - t.mouse = [u, n.invert(u)], jl(this), t.start() - } - gm(), t.wheel = setTimeout(function () { - t.wheel = null, t.end() - }, R), t.zoom("mouse", i(r(e(n, o), t.mouse[0], t.mouse[1]), t.extent)) - } - } - - function f() { - if (!y && g.apply(this, arguments)) { - var n = a(this, arguments), - e = cf(t.event.view).on("mousemove.zoom", function () { - if (gm(), !n.moved) { - var e = t.event.clientX - u, - o = t.event.clientY - c; - n.moved = e * e + o * o > L - } - n.zoom("mouse", i(r(n.that.__zoom, n.mouse[0] = Ks(n.that), n.mouse[1]), n.extent)) - }, !0).on("mouseup.zoom", function () { - e.on("mousemove.zoom mouseup.zoom", null), _t(t.event.view, n.moved), gm(), n.end() - }, !0), - o = Ks(this), - u = t.event.clientX, - c = t.event.clientY; - lf(t.event.view), rs(), n.mouse = [o, this.__zoom.invert(o)], jl(this), n.start() - } - } - - function l() { - if (g.apply(this, arguments)) { - var o = this.__zoom, - a = Ks(this), - c = o.invert(a), - s = i(r(e(o, o.k * (t.event.shiftKey ? .5 : 2)), a, c), m.apply(this, arguments)); - gm(), E > 0 ? cf(this).transition().duration(E).call(u, s, a) : cf(this).call(n.transform, s) - } - } - - function p() { - if (g.apply(this, arguments)) { - var n, e, r, i, o = a(this, arguments), - u = t.event.changedTouches, - c = u.length; - for (rs(), e = 0; e < c; ++e) r = u[e], i = [i = sf(this, u, r.identifier), this.__zoom.invert(i), r.identifier], o.touch0 ? o.touch1 || (o.touch1 = i) : (o.touch0 = i, n = !0); - if (_ && (_ = clearTimeout(_), !o.touch1)) return o.end(), void((i = cf(this).on("dblclick.zoom")) && i.apply(this, arguments)); - n && (_ = setTimeout(function () { - _ = null - }, P), jl(this), o.start()) - } - } - - function d() { - var n, o, u, c, s = a(this, arguments), - f = t.event.changedTouches, - l = f.length; - for (gm(), _ && (_ = clearTimeout(_)), n = 0; n < l; ++n) o = f[n], u = sf(this, f, o.identifier), s.touch0 && s.touch0[2] === o.identifier ? s.touch0[0] = u : s.touch1 && s.touch1[2] === o.identifier && (s.touch1[0] = u); - if (o = s.that.__zoom, s.touch1) { - var h = s.touch0[0], - p = s.touch0[1], - d = s.touch1[0], - v = s.touch1[1], - y = (y = d[0] - h[0]) * y + (y = d[1] - h[1]) * y, - g = (g = v[0] - p[0]) * g + (g = v[1] - p[1]) * g; - o = e(o, Math.sqrt(y / g)), u = [(h[0] + d[0]) / 2, (h[1] + d[1]) / 2], c = [(p[0] + v[0]) / 2, (p[1] + v[1]) / 2] - } else { - if (!s.touch0) return; - u = s.touch0[0], c = s.touch0[1] - } - s.zoom("touch", i(r(o, u, c), s.extent)) - } - - function v() { - var n, e, r = a(this, arguments), - i = t.event.changedTouches, - o = i.length; - for (rs(), y && clearTimeout(y), y = setTimeout(function () { - y = null - }, P), n = 0; n < o; ++n) e = i[n], r.touch0 && r.touch0[2] === e.identifier ? delete r.touch0 : r.touch1 && r.touch1[2] === e.identifier && delete r.touch1; - r.touch1 && !r.touch0 && (r.touch0 = r.touch1, delete r.touch1), r.touch0 ? r.touch0[1] = this.__zoom.invert(r.touch0[0]) : r.end() - } - var _, y, g = is, - m = os, - x = as, - b = 0, - w = 1 / 0, - M = -w, - T = w, - k = M, - S = T, - E = 250, - A = _l, - C = [], - z = h("start", "zoom", "end"), - P = 500, - R = 150, - L = 0; - return n.transform = function (t, n) { - var e = t.selection ? t.selection() : t; - e.property("__zoom", us), t !== e ? u(t, n) : e.interrupt().each(function () { - a(this, arguments).start().zoom(null, "function" == typeof n ? n.apply(this, arguments) : n).end() - }) - }, n.scaleBy = function (t, e) { - n.scaleTo(t, function () { - return this.__zoom.k * ("function" == typeof e ? e.apply(this, arguments) : e) - }) - }, n.scaleTo = function (t, u) { - n.transform(t, function () { - var t = m.apply(this, arguments), - n = this.__zoom, - a = o(t), - c = n.invert(a); - return i(r(e(n, "function" == typeof u ? u.apply(this, arguments) : u), a, c), t) - }) - }, n.translateBy = function (t, e, r) { - n.transform(t, function () { - return i(this.__zoom.translate("function" == typeof e ? e.apply(this, arguments) : e, "function" == typeof r ? r.apply(this, arguments) : r), m.apply(this, arguments)) - }) - }, n.translateTo = function (t, e, r) { - n.transform(t, function () { - var t = m.apply(this, arguments), - n = this.__zoom, - u = o(t); - return i(ym.translate(u[0], u[1]).scale(n.k).translate("function" == typeof e ? -e.apply(this, arguments) : -e, "function" == typeof r ? -r.apply(this, arguments) : -r), t) - }) - }, c.prototype = { - start: function () { - return 1 == ++this.active && (this.index = C.push(this) - 1, this.emit("start")), this - }, - zoom: function (t, n) { - return this.mouse && "mouse" !== t && (this.mouse[1] = n.invert(this.mouse[0])), this.touch0 && "touch" !== t && (this.touch0[1] = n.invert(this.touch0[0])), this.touch1 && "touch" !== t && (this.touch1[1] = n.invert(this.touch1[0])), this.that.__zoom = n, this.emit("zoom"), this - }, - end: function () { - return 0 == --this.active && (C.splice(this.index, 1), this.index = -1, this.emit("end")), this - }, - emit: function (t) { - N(new ts(n, t, this.that.__zoom), z.apply, z, [t, this.that, this.args]) - } - }, n.wheelDelta = function (t) { - return arguments.length ? (x = "function" == typeof t ? t : _m(+t), n) : x - }, n.filter = function (t) { - return arguments.length ? (g = "function" == typeof t ? t : _m(!!t), n) : g - }, n.extent = function (t) { - return arguments.length ? (m = "function" == typeof t ? t : _m([ - [+t[0][0], +t[0][1]], - [+t[1][0], +t[1][1]] - ]), n) : m - }, n.scaleExtent = function (t) { - return arguments.length ? (b = +t[0], w = +t[1], n) : [b, w] - }, n.translateExtent = function (t) { - return arguments.length ? (M = +t[0][0], T = +t[1][0], k = +t[0][1], S = +t[1][1], n) : [ - [M, k], - [T, S] - ] - }, n.duration = function (t) { - return arguments.length ? (E = +t, n) : E - }, n.interpolate = function (t) { - return arguments.length ? (A = t, n) : A - }, n.on = function () { - var t = z.on.apply(z, arguments); - return t === z ? n : t - }, n.clickDistance = function (t) { - return arguments.length ? (L = (t = +t) * t, n) : Math.sqrt(L) - }, n - }, t.zoomTransform = es, t.zoomIdentity = ym, Object.defineProperty(t, "__esModule", { - value: !0 - }) -});
\ No newline at end of file diff --git a/assets/js/heatmap.js b/assets/js/heatmap.js deleted file mode 100644 index 00dab42..0000000 --- a/assets/js/heatmap.js +++ /dev/null @@ -1,339 +0,0 @@ -function calendarHeatmap() { - // defaults - var width = Number($(document).width()) - 72; - var height = 7.5 * (Number($(document).width()) / 70 + 2); - var legendWidth = 0; - var selector = 'body'; - var SQUARE_LENGTH = Number($(document).width()) / 70; - var SQUARE_PADDING = 2; - var MONTH_LABEL_PADDING = 6; - var now = moment().endOf('day').toDate(); - var yearAgo = moment().startOf('day').subtract(1, 'year').toDate(); - var startDate = null; - var counterMap = {}; - var data = []; - var max = null; - var colorRange = ['#D8E6E7', '#218380']; - var tooltipEnabled = true; - var tooltipUnit = 'watched title'; - var legendEnabled = false; - var onClick = null; - var weekStart = 0; //0 for Sunday, 1 for Monday - var locale = { - months: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'], - days: ['S', 'M', 'T', 'W', 'T', 'F', 'S'], - No: 'No', - on: 'on', - Less: 'Less', - More: 'More' - }; - var v = Number(d3.version.split('.')[0]); - - // setters and getters - chart.data = function (value) { - if (!arguments.length) { - return data; - } - data = value; - - counterMap = {}; - - data.forEach(function (element, index) { - var key = moment(element.date).format('YYYY-MM-DD'); - var counter = counterMap[key] || 0; - counterMap[key] = counter + element.count; - }); - - return chart; - }; - - chart.max = function (value) { - if (!arguments.length) { - return max; - } - max = value; - return chart; - }; - - chart.selector = function (value) { - if (!arguments.length) { - return selector; - } - selector = value; - return chart; - }; - - chart.startDate = function (value) { - if (!arguments.length) { - return startDate; - } - yearAgo = value; - now = moment(value).endOf('day').add(1, 'year').toDate(); - return chart; - }; - - chart.colorRange = function (value) { - if (!arguments.length) { - return colorRange; - } - colorRange = value; - return chart; - }; - - chart.tooltipEnabled = function (value) { - if (!arguments.length) { - return tooltipEnabled; - } - tooltipEnabled = value; - return chart; - }; - - chart.tooltipUnit = function (value) { - if (!arguments.length) { - return tooltipUnit; - } - tooltipUnit = value; - return chart; - }; - - chart.legendEnabled = function (value) { - if (!arguments.length) { - return legendEnabled; - } - legendEnabled = value; - return chart; - }; - - chart.onClick = function (value) { - if (!arguments.length) { - return onClick(); - } - onClick = value; - return chart; - }; - - chart.locale = function (value) { - if (!arguments.length) { - return locale; - } - locale = value; - return chart; - }; - - function chart() { - - d3.select(chart.selector()).selectAll('svg.calendar-heatmap').remove(); // remove the existing chart, if it exists - - var dateRange = ((d3.time && d3.time.days) || d3.timeDays)(yearAgo, now); // generates an array of date objects within the specified range - var monthRange = ((d3.time && d3.time.months) || d3.timeMonths)(moment(yearAgo).startOf('month').toDate(), now); // it ignores the first month if the 1st date is after the start of the month - var firstDate = moment(dateRange[0]); - if (chart.data().length == 0) { - max = 0; - } else if (max === null) { - max = d3.max(chart.data(), function (d) { - return d.count; - }); // max data value - } - - // color range - var color = ((d3.scale && d3.scale.linear) || d3.scaleLinear)() - .range(chart.colorRange()) - .domain([0, max]); - - var tooltip; - var dayRects; - - drawChart(); - - function drawChart() { - var svg = d3.select(chart.selector()) - .style('position', 'relative') - .append('svg') - .attr('width', width) - .attr('class', 'calendar-heatmap') - .attr('height', height) - .style('padding', '36px') - .style('text-align', 'center'); - - dayRects = svg.selectAll('.day-cell') - .data(dateRange); // array of days for the last yr - - var enterSelection = dayRects.enter().append('rect') - .attr('class', 'day-cell') - .attr('width', SQUARE_LENGTH) - .attr('height', SQUARE_LENGTH) - .attr('fill', function (d) { - return color(countForDate(d)); - }) - .attr('x', function (d, i) { - var cellDate = moment(d); - var result = cellDate.week() - firstDate.week() + (firstDate.weeksInYear() * (cellDate.weekYear() - firstDate.weekYear())); - return result * (SQUARE_LENGTH + SQUARE_PADDING); - }) - .attr('y', function (d, i) { - return MONTH_LABEL_PADDING + formatWeekday(d.getDay()) * (SQUARE_LENGTH + SQUARE_PADDING); - }); - - if (typeof onClick === 'function') { - (v === 3 ? enterSelection : enterSelection.merge(dayRects)).on('click', function (d) { - var count = countForDate(d); - onClick({ - date: d, - count: count - }); - }); - } - - if (chart.tooltipEnabled()) { - (v === 3 ? enterSelection : enterSelection.merge(dayRects)).on('mouseover', function (d, i) { - tooltip = d3.select(chart.selector()) - .append('div') - .attr('class', 'day-cell-tooltip') - .html(tooltipHTMLForDate(d)) - .style('left', function () { - return Math.floor(i / 7) * SQUARE_LENGTH + 'px'; - }) - .style('top', function () { - return formatWeekday(d.getDay()) * (SQUARE_LENGTH + SQUARE_PADDING) + MONTH_LABEL_PADDING * 2 + 'px'; - }); - }) - .on('mouseout', function (d, i) { - tooltip.remove(); - }); - } - - if (chart.legendEnabled()) { - var colorRange = [color(0)]; - for (var i = 3; i > 0; i--) { - colorRange.push(color(max / i)); - } - - var legendGroup = svg.append('g'); - legendGroup.selectAll('.calendar-heatmap-legend') - .data(colorRange) - .enter() - .append('rect') - .attr('class', 'calendar-heatmap-legend') - .attr('width', SQUARE_LENGTH) - .attr('height', SQUARE_LENGTH) - .attr('x', function (d, i) { - return (width - legendWidth) + (i + 1) * 13; - }) - .attr('y', height + SQUARE_PADDING) - .attr('fill', function (d) { - return d; - }); - - legendGroup.append('text') - .attr('class', 'calendar-heatmap-legend-text calendar-heatmap-legend-text-less') - .attr('x', width - legendWidth - 13) - .attr('y', height + SQUARE_LENGTH) - .text(locale.Less); - - legendGroup.append('text') - .attr('class', 'calendar-heatmap-legend-text calendar-heatmap-legend-text-more') - .attr('x', (width - legendWidth + SQUARE_PADDING) + (colorRange.length + 1) * 13) - .attr('y', height + SQUARE_LENGTH) - .text(locale.More); - } - - dayRects.exit().remove(); - var monthLabels = svg.selectAll('.month') - .data(monthRange) - .enter().append('text') - .attr('class', 'month-name') - .text(function (d) { - return locale.months[d.getMonth()]; - }) - .attr('x', function (d, i) { - var matchIndex = 0; - dateRange.find(function (element, index) { - matchIndex = index; - return moment(d).isSame(element, 'month') && moment(d).isSame(element, 'year'); - }); - - return Math.floor(matchIndex / 7) * (SQUARE_LENGTH + SQUARE_PADDING); - }) - .attr('y', 0); // fix these to the top - - locale.days.forEach(function (day, index) { - index = formatWeekday(index); - if (index % 2) { - svg.append('text') - .attr('class', 'day-initial') - .attr('transform', 'translate(-8,' + (SQUARE_LENGTH + SQUARE_PADDING) * (index + 1) + ')') - .style('text-anchor', 'middle') - .attr('dy', '2') - .text(day); - } - }); - } - - function pluralizedTooltipUnit(count) { - if ('string' === typeof tooltipUnit) { - return (tooltipUnit + (count === 1 ? '' : 's')); - } - for (var i in tooltipUnit) { - var _rule = tooltipUnit[i]; - var _min = _rule.min; - var _max = _rule.max || _rule.min; - _max = _max === 'Infinity' ? Infinity : _max; - if (count >= _min && count <= _max) { - return _rule.unit; - } - } - } - - function tooltipHTMLForDate(d) { - var dateStr = moment(d).format('ddd, MMM Do YYYY'); - var count = countForDate(d); - return '<span><strong>' + (count ? count : locale.No) + ' ' + pluralizedTooltipUnit(count) + '</strong> ' + locale.on + ' ' + dateStr + '</span>'; - } - - function countForDate(d) { - var key = moment(d).format('YYYY-MM-DD'); - return counterMap[key] || 0; - } - - function formatWeekday(weekDay) { - if (weekStart === 1) { - if (weekDay === 0) { - return 6; - } else { - return weekDay - 1; - } - } - return weekDay; - } - - } - - return chart; -} - - -// polyfill for Array.find() method -/* jshint ignore:start */ -if (!Array.prototype.find) { - Array.prototype.find = function (predicate) { - if (this === null) { - throw new TypeError('Array.prototype.find called on null or undefined'); - } - if (typeof predicate !== 'function') { - throw new TypeError('predicate must be a function'); - } - var list = Object(this); - var length = list.length >>> 0; - var thisArg = arguments[1]; - var value; - - for (var i = 0; i < length; i++) { - value = list[i]; - if (predicate.call(thisArg, value, i, list)) { - return value; - } - } - return undefined; - }; -} -/* jshint ignore:end */
\ No newline at end of file diff --git a/assets/js/jQuery.js b/assets/js/jQuery.js deleted file mode 100755 index 3428ffa..0000000 --- a/assets/js/jQuery.js +++ /dev/null @@ -1,3939 +0,0 @@ -/*! jQuery v3.3.1 | (c) JS Foundation and other contributors | jquery.org/license */ ! function (e, t) { - "use strict"; - "object" == typeof module && "object" == typeof module.exports ? module.exports = e.document ? t(e, !0) : function (e) { - if (!e.document) throw new Error("jQuery requires a window with a document"); - return t(e) - } : t(e) -}("undefined" != typeof window ? window : this, function (e, t) { - "use strict"; - var n = [], - r = e.document, - i = Object.getPrototypeOf, - o = n.slice, - a = n.concat, - s = n.push, - u = n.indexOf, - l = {}, - c = l.toString, - f = l.hasOwnProperty, - p = f.toString, - d = p.call(Object), - h = {}, - g = function e(t) { - return "function" == typeof t && "number" != typeof t.nodeType - }, - y = function e(t) { - return null != t && t === t.window - }, - v = { - type: !0, - src: !0, - noModule: !0 - }; - - function m(e, t, n) { - var i, o = (t = t || r).createElement("script"); - if (o.text = e, n) - for (i in v) n[i] && (o[i] = n[i]); - t.head.appendChild(o).parentNode.removeChild(o) - } - - function x(e) { - return null == e ? e + "" : "object" == typeof e || "function" == typeof e ? l[c.call(e)] || "object" : typeof e - } - - var b = "3.3.1", - w = function (e, t) { - return new w.fn.init(e, t) - }, - T = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g; - w.fn = w.prototype = { - jquery: "3.3.1", - constructor: w, - length: 0, - toArray: function () { - return o.call(this) - }, - get: function (e) { - return null == e ? o.call(this) : e < 0 ? this[e + this.length] : this[e] - }, - pushStack: function (e) { - var t = w.merge(this.constructor(), e); - return t.prevObject = this, t - }, - each: function (e) { - return w.each(this, e) - }, - map: function (e) { - return this.pushStack(w.map(this, function (t, n) { - return e.call(t, n, t) - })) - }, - slice: function () { - return this.pushStack(o.apply(this, arguments)) - }, - first: function () { - return this.eq(0) - }, - last: function () { - return this.eq(-1) - }, - eq: function (e) { - var t = this.length, - n = +e + (e < 0 ? t : 0); - return this.pushStack(n >= 0 && n < t ? [this[n]] : []) - }, - end: function () { - return this.prevObject || this.constructor() - }, - push: s, - sort: n.sort, - splice: n.splice - }, w.extend = w.fn.extend = function () { - var e, t, n, r, i, o, a = arguments[0] || {}, - s = 1, - u = arguments.length, - l = !1; - for ("boolean" == typeof a && (l = a, a = arguments[s] || {}, s++), "object" == typeof a || g(a) || (a = {}), s === u && (a = this, s--); s < u; s++) - if (null != (e = arguments[s])) - for (t in e) n = a[t], a !== (r = e[t]) && (l && r && (w.isPlainObject(r) || (i = Array.isArray(r))) ? (i ? (i = !1, o = n && Array.isArray(n) ? n : []) : o = n && w.isPlainObject(n) ? n : {}, a[t] = w.extend(l, o, r)) : void 0 !== r && (a[t] = r)); - return a - }, w.extend({ - expando: "jQuery" + ("3.3.1" + Math.random()).replace(/\D/g, ""), - isReady: !0, - error: function (e) { - throw new Error(e) - }, - noop: function () {}, - isPlainObject: function (e) { - var t, n; - return !(!e || "[object Object]" !== c.call(e)) && (!(t = i(e)) || "function" == typeof (n = f.call(t, "constructor") && t.constructor) && p.call(n) === d) - }, - isEmptyObject: function (e) { - var t; - for (t in e) return !1; - return !0 - }, - globalEval: function (e) { - m(e) - }, - each: function (e, t) { - var n, r = 0; - if (C(e)) { - for (n = e.length; r < n; r++) - if (!1 === t.call(e[r], r, e[r])) break - } else - for (r in e) - if (!1 === t.call(e[r], r, e[r])) break; - return e - }, - trim: function (e) { - return null == e ? "" : (e + "").replace(T, "") - }, - makeArray: function (e, t) { - var n = t || []; - return null != e && (C(Object(e)) ? w.merge(n, "string" == typeof e ? [e] : e) : s.call(n, e)), n - }, - inArray: function (e, t, n) { - return null == t ? -1 : u.call(t, e, n) - }, - merge: function (e, t) { - for (var n = +t.length, r = 0, i = e.length; r < n; r++) e[i++] = t[r]; - return e.length = i, e - }, - grep: function (e, t, n) { - for (var r, i = [], o = 0, a = e.length, s = !n; o < a; o++)(r = !t(e[o], o)) !== s && i.push(e[o]); - return i - }, - map: function (e, t, n) { - var r, i, o = 0, - s = []; - if (C(e)) - for (r = e.length; o < r; o++) null != (i = t(e[o], o, n)) && s.push(i); - else - for (o in e) null != (i = t(e[o], o, n)) && s.push(i); - return a.apply([], s) - }, - guid: 1, - support: h - }), "function" == typeof Symbol && (w.fn[Symbol.iterator] = n[Symbol.iterator]), w.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "), function (e, t) { - l["[object " + t + "]"] = t.toLowerCase() - }); - - function C(e) { - var t = !!e && "length" in e && e.length, - n = x(e); - return !g(e) && !y(e) && ("array" === n || 0 === t || "number" == typeof t && t > 0 && t - 1 in e) - } - - var E = function (e) { - var t, n, r, i, o, a, s, u, l, c, f, p, d, h, g, y, v, m, x, b = "sizzle" + 1 * new Date, - w = e.document, - T = 0, - C = 0, - E = ae(), - k = ae(), - S = ae(), - D = function (e, t) { - return e === t && (f = !0), 0 - }, - N = {}.hasOwnProperty, - A = [], - j = A.pop, - q = A.push, - L = A.push, - H = A.slice, - O = function (e, t) { - for (var n = 0, r = e.length; n < r; n++) - if (e[n] === t) return n; - return -1 - }, - P = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped", - M = "[\\x20\\t\\r\\n\\f]", - R = "(?:\\\\.|[\\w-]|[^\0-\\xa0])+", - I = "\\[" + M + "*(" + R + ")(?:" + M + "*([*^$|!~]?=)" + M + "*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + R + "))|)" + M + "*\\]", - W = ":(" + R + ")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|" + I + ")*)|.*)\\)|)", - $ = new RegExp(M + "+", "g"), - B = new RegExp("^" + M + "+|((?:^|[^\\\\])(?:\\\\.)*)" + M + "+$", "g"), - F = new RegExp("^" + M + "*," + M + "*"), - _ = new RegExp("^" + M + "*([>+~]|" + M + ")" + M + "*"), - z = new RegExp("=" + M + "*([^\\]'\"]*?)" + M + "*\\]", "g"), - X = new RegExp(W), - U = new RegExp("^" + R + "$"), - V = { - ID: new RegExp("^#(" + R + ")"), - CLASS: new RegExp("^\\.(" + R + ")"), - TAG: new RegExp("^(" + R + "|[*])"), - ATTR: new RegExp("^" + I), - PSEUDO: new RegExp("^" + W), - CHILD: new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + M + "*(even|odd|(([+-]|)(\\d*)n|)" + M + "*(?:([+-]|)" + M + "*(\\d+)|))" + M + "*\\)|)", "i"), - bool: new RegExp("^(?:" + P + ")$", "i"), - needsContext: new RegExp("^" + M + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" + M + "*((?:-\\d)?\\d*)" + M + "*\\)|)(?=[^-]|$)", "i") - }, - G = /^(?:input|select|textarea|button)$/i, - Y = /^h\d$/i, - Q = /^[^{]+\{\s*\[native \w/, - J = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - K = /[+~]/, - Z = new RegExp("\\\\([\\da-f]{1,6}" + M + "?|(" + M + ")|.)", "ig"), - ee = function (e, t, n) { - var r = "0x" + t - 65536; - return r !== r || n ? t : r < 0 ? String.fromCharCode(r + 65536) : String.fromCharCode(r >> 10 | 55296, 1023 & r | 56320) - }, - te = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, - ne = function (e, t) { - return t ? "\0" === e ? "\ufffd" : e.slice(0, -1) + "\\" + e.charCodeAt(e.length - 1).toString(16) + " " : "\\" + e - }, - re = function () { - p() - }, - ie = me(function (e) { - return !0 === e.disabled && ("form" in e || "label" in e) - }, { - dir: "parentNode", - next: "legend" - }); - try { - L.apply(A = H.call(w.childNodes), w.childNodes), A[w.childNodes.length].nodeType - } catch (e) { - L = { - apply: A.length ? function (e, t) { - q.apply(e, H.call(t)) - } : function (e, t) { - var n = e.length, - r = 0; - while (e[n++] = t[r++]); - e.length = n - 1 - } - } - } - - function oe(e, t, r, i) { - var o, s, l, c, f, h, v, m = t && t.ownerDocument, - T = t ? t.nodeType : 9; - if (r = r || [], "string" != typeof e || !e || 1 !== T && 9 !== T && 11 !== T) return r; - if (!i && ((t ? t.ownerDocument || t : w) !== d && p(t), t = t || d, g)) { - if (11 !== T && (f = J.exec(e))) - if (o = f[1]) { - if (9 === T) { - if (!(l = t.getElementById(o))) return r; - if (l.id === o) return r.push(l), r - } else if (m && (l = m.getElementById(o)) && x(t, l) && l.id === o) return r.push(l), r - } else { - if (f[2]) return L.apply(r, t.getElementsByTagName(e)), r; - if ((o = f[3]) && n.getElementsByClassName && t.getElementsByClassName) return L.apply(r, t.getElementsByClassName(o)), r - } - if (n.qsa && !S[e + " "] && (!y || !y.test(e))) { - if (1 !== T) m = t, v = e; - else if ("object" !== t.nodeName.toLowerCase()) { - (c = t.getAttribute("id")) ? c = c.replace(te, ne): t.setAttribute("id", c = b), s = (h = a(e)).length; - while (s--) h[s] = "#" + c + " " + ve(h[s]); - v = h.join(","), m = K.test(e) && ge(t.parentNode) || t - } - if (v) try { - return L.apply(r, m.querySelectorAll(v)), r - } catch (e) {} finally { - c === b && t.removeAttribute("id") - } - } - } - return u(e.replace(B, "$1"), t, r, i) - } - - function ae() { - var e = []; - - function t(n, i) { - return e.push(n + " ") > r.cacheLength && delete t[e.shift()], t[n + " "] = i - } - - return t - } - - function se(e) { - return e[b] = !0, e - } - - function ue(e) { - var t = d.createElement("fieldset"); - try { - return !!e(t) - } catch (e) { - return !1 - } finally { - t.parentNode && t.parentNode.removeChild(t), t = null - } - } - - function le(e, t) { - var n = e.split("|"), - i = n.length; - while (i--) r.attrHandle[n[i]] = t - } - - function ce(e, t) { - var n = t && e, - r = n && 1 === e.nodeType && 1 === t.nodeType && e.sourceIndex - t.sourceIndex; - if (r) return r; - if (n) - while (n = n.nextSibling) - if (n === t) return -1; - return e ? 1 : -1 - } - - function fe(e) { - return function (t) { - return "input" === t.nodeName.toLowerCase() && t.type === e - } - } - - function pe(e) { - return function (t) { - var n = t.nodeName.toLowerCase(); - return ("input" === n || "button" === n) && t.type === e - } - } - - function de(e) { - return function (t) { - return "form" in t ? t.parentNode && !1 === t.disabled ? "label" in t ? "label" in t.parentNode ? t.parentNode.disabled === e : t.disabled === e : t.isDisabled === e || t.isDisabled !== !e && ie(t) === e : t.disabled === e : "label" in t && t.disabled === e - } - } - - function he(e) { - return se(function (t) { - return t = +t, se(function (n, r) { - var i, o = e([], n.length, t), - a = o.length; - while (a--) n[i = o[a]] && (n[i] = !(r[i] = n[i])) - }) - }) - } - - function ge(e) { - return e && "undefined" != typeof e.getElementsByTagName && e - } - - n = oe.support = {}, o = oe.isXML = function (e) { - var t = e && (e.ownerDocument || e).documentElement; - return !!t && "HTML" !== t.nodeName - }, p = oe.setDocument = function (e) { - var t, i, a = e ? e.ownerDocument || e : w; - return a !== d && 9 === a.nodeType && a.documentElement ? (d = a, h = d.documentElement, g = !o(d), w !== d && (i = d.defaultView) && i.top !== i && (i.addEventListener ? i.addEventListener("unload", re, !1) : i.attachEvent && i.attachEvent("onunload", re)), n.attributes = ue(function (e) { - return e.className = "i", !e.getAttribute("className") - }), n.getElementsByTagName = ue(function (e) { - return e.appendChild(d.createComment("")), !e.getElementsByTagName("*").length - }), n.getElementsByClassName = Q.test(d.getElementsByClassName), n.getById = ue(function (e) { - return h.appendChild(e).id = b, !d.getElementsByName || !d.getElementsByName(b).length - }), n.getById ? (r.filter.ID = function (e) { - var t = e.replace(Z, ee); - return function (e) { - return e.getAttribute("id") === t - } - }, r.find.ID = function (e, t) { - if ("undefined" != typeof t.getElementById && g) { - var n = t.getElementById(e); - return n ? [n] : [] - } - }) : (r.filter.ID = function (e) { - var t = e.replace(Z, ee); - return function (e) { - var n = "undefined" != typeof e.getAttributeNode && e.getAttributeNode("id"); - return n && n.value === t - } - }, r.find.ID = function (e, t) { - if ("undefined" != typeof t.getElementById && g) { - var n, r, i, o = t.getElementById(e); - if (o) { - if ((n = o.getAttributeNode("id")) && n.value === e) return [o]; - i = t.getElementsByName(e), r = 0; - while (o = i[r++]) - if ((n = o.getAttributeNode("id")) && n.value === e) return [o] - } - return [] - } - }), r.find.TAG = n.getElementsByTagName ? function (e, t) { - return "undefined" != typeof t.getElementsByTagName ? t.getElementsByTagName(e) : n.qsa ? t.querySelectorAll(e) : void 0 - } : function (e, t) { - var n, r = [], - i = 0, - o = t.getElementsByTagName(e); - if ("*" === e) { - while (n = o[i++]) 1 === n.nodeType && r.push(n); - return r - } - return o - }, r.find.CLASS = n.getElementsByClassName && function (e, t) { - if ("undefined" != typeof t.getElementsByClassName && g) return t.getElementsByClassName(e) - }, v = [], y = [], (n.qsa = Q.test(d.querySelectorAll)) && (ue(function (e) { - h.appendChild(e).innerHTML = "<a id='" + b + "'></a><select id='" + b + "-\r\\' msallowcapture=''><option selected=''></option></select>", e.querySelectorAll("[msallowcapture^='']").length && y.push("[*^$]=" + M + "*(?:''|\"\")"), e.querySelectorAll("[selected]").length || y.push("\\[" + M + "*(?:value|" + P + ")"), e.querySelectorAll("[id~=" + b + "-]").length || y.push("~="), e.querySelectorAll(":checked").length || y.push(":checked"), e.querySelectorAll("a#" + b + "+*").length || y.push(".#.+[+~]") - }), ue(function (e) { - e.innerHTML = "<a href='' disabled='disabled'></a><select disabled='disabled'><option/></select>"; - var t = d.createElement("input"); - t.setAttribute("type", "hidden"), e.appendChild(t).setAttribute("name", "D"), e.querySelectorAll("[name=d]").length && y.push("name" + M + "*[*^$|!~]?="), 2 !== e.querySelectorAll(":enabled").length && y.push(":enabled", ":disabled"), h.appendChild(e).disabled = !0, 2 !== e.querySelectorAll(":disabled").length && y.push(":enabled", ":disabled"), e.querySelectorAll("*,:x"), y.push(",.*:") - })), (n.matchesSelector = Q.test(m = h.matches || h.webkitMatchesSelector || h.mozMatchesSelector || h.oMatchesSelector || h.msMatchesSelector)) && ue(function (e) { - n.disconnectedMatch = m.call(e, "*"), m.call(e, "[s!='']:x"), v.push("!=", W) - }), y = y.length && new RegExp(y.join("|")), v = v.length && new RegExp(v.join("|")), t = Q.test(h.compareDocumentPosition), x = t || Q.test(h.contains) ? function (e, t) { - var n = 9 === e.nodeType ? e.documentElement : e, - r = t && t.parentNode; - return e === r || !(!r || 1 !== r.nodeType || !(n.contains ? n.contains(r) : e.compareDocumentPosition && 16 & e.compareDocumentPosition(r))) - } : function (e, t) { - if (t) - while (t = t.parentNode) - if (t === e) return !0; - return !1 - }, D = t ? function (e, t) { - if (e === t) return f = !0, 0; - var r = !e.compareDocumentPosition - !t.compareDocumentPosition; - return r || (1 & (r = (e.ownerDocument || e) === (t.ownerDocument || t) ? e.compareDocumentPosition(t) : 1) || !n.sortDetached && t.compareDocumentPosition(e) === r ? e === d || e.ownerDocument === w && x(w, e) ? -1 : t === d || t.ownerDocument === w && x(w, t) ? 1 : c ? O(c, e) - O(c, t) : 0 : 4 & r ? -1 : 1) - } : function (e, t) { - if (e === t) return f = !0, 0; - var n, r = 0, - i = e.parentNode, - o = t.parentNode, - a = [e], - s = [t]; - if (!i || !o) return e === d ? -1 : t === d ? 1 : i ? -1 : o ? 1 : c ? O(c, e) - O(c, t) : 0; - if (i === o) return ce(e, t); - n = e; - while (n = n.parentNode) a.unshift(n); - n = t; - while (n = n.parentNode) s.unshift(n); - while (a[r] === s[r]) r++; - return r ? ce(a[r], s[r]) : a[r] === w ? -1 : s[r] === w ? 1 : 0 - }, d) : d - }, oe.matches = function (e, t) { - return oe(e, null, null, t) - }, oe.matchesSelector = function (e, t) { - if ((e.ownerDocument || e) !== d && p(e), t = t.replace(z, "='$1']"), n.matchesSelector && g && !S[t + " "] && (!v || !v.test(t)) && (!y || !y.test(t))) try { - var r = m.call(e, t); - if (r || n.disconnectedMatch || e.document && 11 !== e.document.nodeType) return r - } catch (e) {} - return oe(t, d, null, [e]).length > 0 - }, oe.contains = function (e, t) { - return (e.ownerDocument || e) !== d && p(e), x(e, t) - }, oe.attr = function (e, t) { - (e.ownerDocument || e) !== d && p(e); - var i = r.attrHandle[t.toLowerCase()], - o = i && N.call(r.attrHandle, t.toLowerCase()) ? i(e, t, !g) : void 0; - return void 0 !== o ? o : n.attributes || !g ? e.getAttribute(t) : (o = e.getAttributeNode(t)) && o.specified ? o.value : null - }, oe.escape = function (e) { - return (e + "").replace(te, ne) - }, oe.error = function (e) { - throw new Error("Syntax error, unrecognized expression: " + e) - }, oe.uniqueSort = function (e) { - var t, r = [], - i = 0, - o = 0; - if (f = !n.detectDuplicates, c = !n.sortStable && e.slice(0), e.sort(D), f) { - while (t = e[o++]) t === e[o] && (i = r.push(o)); - while (i--) e.splice(r[i], 1) - } - return c = null, e - }, i = oe.getText = function (e) { - var t, n = "", - r = 0, - o = e.nodeType; - if (o) { - if (1 === o || 9 === o || 11 === o) { - if ("string" == typeof e.textContent) return e.textContent; - for (e = e.firstChild; e; e = e.nextSibling) n += i(e) - } else if (3 === o || 4 === o) return e.nodeValue - } else - while (t = e[r++]) n += i(t); - return n - }, (r = oe.selectors = { - cacheLength: 50, - createPseudo: se, - match: V, - attrHandle: {}, - find: {}, - relative: { - ">": { - dir: "parentNode", - first: !0 - }, - " ": { - dir: "parentNode" - }, - "+": { - dir: "previousSibling", - first: !0 - }, - "~": { - dir: "previousSibling" - } - }, - preFilter: { - ATTR: function (e) { - return e[1] = e[1].replace(Z, ee), e[3] = (e[3] || e[4] || e[5] || "").replace(Z, ee), "~=" === e[2] && (e[3] = " " + e[3] + " "), e.slice(0, 4) - }, - CHILD: function (e) { - return e[1] = e[1].toLowerCase(), "nth" === e[1].slice(0, 3) ? (e[3] || oe.error(e[0]), e[4] = +(e[4] ? e[5] + (e[6] || 1) : 2 * ("even" === e[3] || "odd" === e[3])), e[5] = +(e[7] + e[8] || "odd" === e[3])) : e[3] && oe.error(e[0]), e - }, - PSEUDO: function (e) { - var t, n = !e[6] && e[2]; - return V.CHILD.test(e[0]) ? null : (e[3] ? e[2] = e[4] || e[5] || "" : n && X.test(n) && (t = a(n, !0)) && (t = n.indexOf(")", n.length - t) - n.length) && (e[0] = e[0].slice(0, t), e[2] = n.slice(0, t)), e.slice(0, 3)) - } - }, - filter: { - TAG: function (e) { - var t = e.replace(Z, ee).toLowerCase(); - return "*" === e ? function () { - return !0 - } : function (e) { - return e.nodeName && e.nodeName.toLowerCase() === t - } - }, - CLASS: function (e) { - var t = E[e + " "]; - return t || (t = new RegExp("(^|" + M + ")" + e + "(" + M + "|$)")) && E(e, function (e) { - return t.test("string" == typeof e.className && e.className || "undefined" != typeof e.getAttribute && e.getAttribute("class") || "") - }) - }, - ATTR: function (e, t, n) { - return function (r) { - var i = oe.attr(r, e); - return null == i ? "!=" === t : !t || (i += "", "=" === t ? i === n : "!=" === t ? i !== n : "^=" === t ? n && 0 === i.indexOf(n) : "*=" === t ? n && i.indexOf(n) > -1 : "$=" === t ? n && i.slice(-n.length) === n : "~=" === t ? (" " + i.replace($, " ") + " ").indexOf(n) > -1 : "|=" === t && (i === n || i.slice(0, n.length + 1) === n + "-")) - } - }, - CHILD: function (e, t, n, r, i) { - var o = "nth" !== e.slice(0, 3), - a = "last" !== e.slice(-4), - s = "of-type" === t; - return 1 === r && 0 === i ? function (e) { - return !!e.parentNode - } : function (t, n, u) { - var l, c, f, p, d, h, g = o !== a ? "nextSibling" : "previousSibling", - y = t.parentNode, - v = s && t.nodeName.toLowerCase(), - m = !u && !s, - x = !1; - if (y) { - if (o) { - while (g) { - p = t; - while (p = p[g]) - if (s ? p.nodeName.toLowerCase() === v : 1 === p.nodeType) return !1; - h = g = "only" === e && !h && "nextSibling" - } - return !0 - } - if (h = [a ? y.firstChild : y.lastChild], a && m) { - x = (d = (l = (c = (f = (p = y)[b] || (p[b] = {}))[p.uniqueID] || (f[p.uniqueID] = {}))[e] || [])[0] === T && l[1]) && l[2], p = d && y.childNodes[d]; - while (p = ++d && p && p[g] || (x = d = 0) || h.pop()) - if (1 === p.nodeType && ++x && p === t) { - c[e] = [T, d, x]; - break - } - } else if (m && (x = d = (l = (c = (f = (p = t)[b] || (p[b] = {}))[p.uniqueID] || (f[p.uniqueID] = {}))[e] || [])[0] === T && l[1]), !1 === x) - while (p = ++d && p && p[g] || (x = d = 0) || h.pop()) - if ((s ? p.nodeName.toLowerCase() === v : 1 === p.nodeType) && ++x && (m && ((c = (f = p[b] || (p[b] = {}))[p.uniqueID] || (f[p.uniqueID] = {}))[e] = [T, x]), p === t)) break; - return (x -= i) === r || x % r == 0 && x / r >= 0 - } - } - }, - PSEUDO: function (e, t) { - var n, i = r.pseudos[e] || r.setFilters[e.toLowerCase()] || oe.error("unsupported pseudo: " + e); - return i[b] ? i(t) : i.length > 1 ? (n = [e, e, "", t], r.setFilters.hasOwnProperty(e.toLowerCase()) ? se(function (e, n) { - var r, o = i(e, t), - a = o.length; - while (a--) e[r = O(e, o[a])] = !(n[r] = o[a]) - }) : function (e) { - return i(e, 0, n) - }) : i - } - }, - pseudos: { - not: se(function (e) { - var t = [], - n = [], - r = s(e.replace(B, "$1")); - return r[b] ? se(function (e, t, n, i) { - var o, a = r(e, null, i, []), - s = e.length; - while (s--)(o = a[s]) && (e[s] = !(t[s] = o)) - }) : function (e, i, o) { - return t[0] = e, r(t, null, o, n), t[0] = null, !n.pop() - } - }), - has: se(function (e) { - return function (t) { - return oe(e, t).length > 0 - } - }), - contains: se(function (e) { - return e = e.replace(Z, ee), - function (t) { - return (t.textContent || t.innerText || i(t)).indexOf(e) > -1 - } - }), - lang: se(function (e) { - return U.test(e || "") || oe.error("unsupported lang: " + e), e = e.replace(Z, ee).toLowerCase(), - function (t) { - var n; - do { - if (n = g ? t.lang : t.getAttribute("xml:lang") || t.getAttribute("lang")) return (n = n.toLowerCase()) === e || 0 === n.indexOf(e + "-") - } while ((t = t.parentNode) && 1 === t.nodeType); - return !1 - } - }), - target: function (t) { - var n = e.location && e.location.hash; - return n && n.slice(1) === t.id - }, - root: function (e) { - return e === h - }, - focus: function (e) { - return e === d.activeElement && (!d.hasFocus || d.hasFocus()) && !!(e.type || e.href || ~e.tabIndex) - }, - enabled: de(!1), - disabled: de(!0), - checked: function (e) { - var t = e.nodeName.toLowerCase(); - return "input" === t && !!e.checked || "option" === t && !!e.selected - }, - selected: function (e) { - return e.parentNode && e.parentNode.selectedIndex, !0 === e.selected - }, - empty: function (e) { - for (e = e.firstChild; e; e = e.nextSibling) - if (e.nodeType < 6) return !1; - return !0 - }, - parent: function (e) { - return !r.pseudos.empty(e) - }, - header: function (e) { - return Y.test(e.nodeName) - }, - input: function (e) { - return G.test(e.nodeName) - }, - button: function (e) { - var t = e.nodeName.toLowerCase(); - return "input" === t && "button" === e.type || "button" === t - }, - text: function (e) { - var t; - return "input" === e.nodeName.toLowerCase() && "text" === e.type && (null == (t = e.getAttribute("type")) || "text" === t.toLowerCase()) - }, - first: he(function () { - return [0] - }), - last: he(function (e, t) { - return [t - 1] - }), - eq: he(function (e, t, n) { - return [n < 0 ? n + t : n] - }), - even: he(function (e, t) { - for (var n = 0; n < t; n += 2) e.push(n); - return e - }), - odd: he(function (e, t) { - for (var n = 1; n < t; n += 2) e.push(n); - return e - }), - lt: he(function (e, t, n) { - for (var r = n < 0 ? n + t : n; --r >= 0;) e.push(r); - return e - }), - gt: he(function (e, t, n) { - for (var r = n < 0 ? n + t : n; ++r < t;) e.push(r); - return e - }) - } - }).pseudos.nth = r.pseudos.eq; - for (t in { - radio: !0, - checkbox: !0, - file: !0, - password: !0, - image: !0 - }) r.pseudos[t] = fe(t); - for (t in { - submit: !0, - reset: !0 - }) r.pseudos[t] = pe(t); - - function ye() {} - - ye.prototype = r.filters = r.pseudos, r.setFilters = new ye, a = oe.tokenize = function (e, t) { - var n, i, o, a, s, u, l, c = k[e + " "]; - if (c) return t ? 0 : c.slice(0); - s = e, u = [], l = r.preFilter; - while (s) { - n && !(i = F.exec(s)) || (i && (s = s.slice(i[0].length) || s), u.push(o = [])), n = !1, (i = _.exec(s)) && (n = i.shift(), o.push({ - value: n, - type: i[0].replace(B, " ") - }), s = s.slice(n.length)); - for (a in r.filter) !(i = V[a].exec(s)) || l[a] && !(i = l[a](i)) || (n = i.shift(), o.push({ - value: n, - type: a, - matches: i - }), s = s.slice(n.length)); - if (!n) break - } - return t ? s.length : s ? oe.error(e) : k(e, u).slice(0) - }; - - function ve(e) { - for (var t = 0, n = e.length, r = ""; t < n; t++) r += e[t].value; - return r - } - - function me(e, t, n) { - var r = t.dir, - i = t.next, - o = i || r, - a = n && "parentNode" === o, - s = C++; - return t.first ? function (t, n, i) { - while (t = t[r]) - if (1 === t.nodeType || a) return e(t, n, i); - return !1 - } : function (t, n, u) { - var l, c, f, p = [T, s]; - if (u) { - while (t = t[r]) - if ((1 === t.nodeType || a) && e(t, n, u)) return !0 - } else - while (t = t[r]) - if (1 === t.nodeType || a) - if (f = t[b] || (t[b] = {}), c = f[t.uniqueID] || (f[t.uniqueID] = {}), i && i === t.nodeName.toLowerCase()) t = t[r] || t; - else { - if ((l = c[o]) && l[0] === T && l[1] === s) return p[2] = l[2]; - if (c[o] = p, p[2] = e(t, n, u)) return !0 - } - return !1 - } - } - - function xe(e) { - return e.length > 1 ? function (t, n, r) { - var i = e.length; - while (i--) - if (!e[i](t, n, r)) return !1; - return !0 - } : e[0] - } - - function be(e, t, n) { - for (var r = 0, i = t.length; r < i; r++) oe(e, t[r], n); - return n - } - - function we(e, t, n, r, i) { - for (var o, a = [], s = 0, u = e.length, l = null != t; s < u; s++)(o = e[s]) && (n && !n(o, r, i) || (a.push(o), l && t.push(s))); - return a - } - - function Te(e, t, n, r, i, o) { - return r && !r[b] && (r = Te(r)), i && !i[b] && (i = Te(i, o)), se(function (o, a, s, u) { - var l, c, f, p = [], - d = [], - h = a.length, - g = o || be(t || "*", s.nodeType ? [s] : s, []), - y = !e || !o && t ? g : we(g, p, e, s, u), - v = n ? i || (o ? e : h || r) ? [] : a : y; - if (n && n(y, v, s, u), r) { - l = we(v, d), r(l, [], s, u), c = l.length; - while (c--)(f = l[c]) && (v[d[c]] = !(y[d[c]] = f)) - } - if (o) { - if (i || e) { - if (i) { - l = [], c = v.length; - while (c--)(f = v[c]) && l.push(y[c] = f); - i(null, v = [], l, u) - } - c = v.length; - while (c--)(f = v[c]) && (l = i ? O(o, f) : p[c]) > -1 && (o[l] = !(a[l] = f)) - } - } else v = we(v === a ? v.splice(h, v.length) : v), i ? i(null, a, v, u) : L.apply(a, v) - }) - } - - function Ce(e) { - for (var t, n, i, o = e.length, a = r.relative[e[0].type], s = a || r.relative[" "], u = a ? 1 : 0, c = me(function (e) { - return e === t - }, s, !0), f = me(function (e) { - return O(t, e) > -1 - }, s, !0), p = [function (e, n, r) { - var i = !a && (r || n !== l) || ((t = n).nodeType ? c(e, n, r) : f(e, n, r)); - return t = null, i - }]; u < o; u++) - if (n = r.relative[e[u].type]) p = [me(xe(p), n)]; - else { - if ((n = r.filter[e[u].type].apply(null, e[u].matches))[b]) { - for (i = ++u; i < o; i++) - if (r.relative[e[i].type]) break; - return Te(u > 1 && xe(p), u > 1 && ve(e.slice(0, u - 1).concat({ - value: " " === e[u - 2].type ? "*" : "" - })).replace(B, "$1"), n, u < i && Ce(e.slice(u, i)), i < o && Ce(e = e.slice(i)), i < o && ve(e)) - } - p.push(n) - } - return xe(p) - } - - function Ee(e, t) { - var n = t.length > 0, - i = e.length > 0, - o = function (o, a, s, u, c) { - var f, h, y, v = 0, - m = "0", - x = o && [], - b = [], - w = l, - C = o || i && r.find.TAG("*", c), - E = T += null == w ? 1 : Math.random() || .1, - k = C.length; - for (c && (l = a === d || a || c); m !== k && null != (f = C[m]); m++) { - if (i && f) { - h = 0, a || f.ownerDocument === d || (p(f), s = !g); - while (y = e[h++]) - if (y(f, a || d, s)) { - u.push(f); - break - } - c && (T = E) - } - n && ((f = !y && f) && v--, o && x.push(f)) - } - if (v += m, n && m !== v) { - h = 0; - while (y = t[h++]) y(x, b, a, s); - if (o) { - if (v > 0) - while (m--) x[m] || b[m] || (b[m] = j.call(u)); - b = we(b) - } - L.apply(u, b), c && !o && b.length > 0 && v + t.length > 1 && oe.uniqueSort(u) - } - return c && (T = E, l = w), x - }; - return n ? se(o) : o - } - - return s = oe.compile = function (e, t) { - var n, r = [], - i = [], - o = S[e + " "]; - if (!o) { - t || (t = a(e)), n = t.length; - while (n--)(o = Ce(t[n]))[b] ? r.push(o) : i.push(o); - (o = S(e, Ee(i, r))).selector = e - } - return o - }, u = oe.select = function (e, t, n, i) { - var o, u, l, c, f, p = "function" == typeof e && e, - d = !i && a(e = p.selector || e); - if (n = n || [], 1 === d.length) { - if ((u = d[0] = d[0].slice(0)).length > 2 && "ID" === (l = u[0]).type && 9 === t.nodeType && g && r.relative[u[1].type]) { - if (!(t = (r.find.ID(l.matches[0].replace(Z, ee), t) || [])[0])) return n; - p && (t = t.parentNode), e = e.slice(u.shift().value.length) - } - o = V.needsContext.test(e) ? 0 : u.length; - while (o--) { - if (l = u[o], r.relative[c = l.type]) break; - if ((f = r.find[c]) && (i = f(l.matches[0].replace(Z, ee), K.test(u[0].type) && ge(t.parentNode) || t))) { - if (u.splice(o, 1), !(e = i.length && ve(u))) return L.apply(n, i), n; - break - } - } - } - return (p || s(e, d))(i, t, !g, n, !t || K.test(e) && ge(t.parentNode) || t), n - }, n.sortStable = b.split("").sort(D).join("") === b, n.detectDuplicates = !!f, p(), n.sortDetached = ue(function (e) { - return 1 & e.compareDocumentPosition(d.createElement("fieldset")) - }), ue(function (e) { - return e.innerHTML = "<a href='#'></a>", "#" === e.firstChild.getAttribute("href") - }) || le("type|href|height|width", function (e, t, n) { - if (!n) return e.getAttribute(t, "type" === t.toLowerCase() ? 1 : 2) - }), n.attributes && ue(function (e) { - return e.innerHTML = "<input/>", e.firstChild.setAttribute("value", ""), "" === e.firstChild.getAttribute("value") - }) || le("value", function (e, t, n) { - if (!n && "input" === e.nodeName.toLowerCase()) return e.defaultValue - }), ue(function (e) { - return null == e.getAttribute("disabled") - }) || le(P, function (e, t, n) { - var r; - if (!n) return !0 === e[t] ? t.toLowerCase() : (r = e.getAttributeNode(t)) && r.specified ? r.value : null - }), oe - }(e); - w.find = E, w.expr = E.selectors, w.expr[":"] = w.expr.pseudos, w.uniqueSort = w.unique = E.uniqueSort, w.text = E.getText, w.isXMLDoc = E.isXML, w.contains = E.contains, w.escapeSelector = E.escape; - var k = function (e, t, n) { - var r = [], - i = void 0 !== n; - while ((e = e[t]) && 9 !== e.nodeType) - if (1 === e.nodeType) { - if (i && w(e).is(n)) break; - r.push(e) - } - return r - }, - S = function (e, t) { - for (var n = []; e; e = e.nextSibling) 1 === e.nodeType && e !== t && n.push(e); - return n - }, - D = w.expr.match.needsContext; - - function N(e, t) { - return e.nodeName && e.nodeName.toLowerCase() === t.toLowerCase() - } - - var A = /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i; - - function j(e, t, n) { - return g(t) ? w.grep(e, function (e, r) { - return !!t.call(e, r, e) !== n - }) : t.nodeType ? w.grep(e, function (e) { - return e === t !== n - }) : "string" != typeof t ? w.grep(e, function (e) { - return u.call(t, e) > -1 !== n - }) : w.filter(t, e, n) - } - - w.filter = function (e, t, n) { - var r = t[0]; - return n && (e = ":not(" + e + ")"), 1 === t.length && 1 === r.nodeType ? w.find.matchesSelector(r, e) ? [r] : [] : w.find.matches(e, w.grep(t, function (e) { - return 1 === e.nodeType - })) - }, w.fn.extend({ - find: function (e) { - var t, n, r = this.length, - i = this; - if ("string" != typeof e) return this.pushStack(w(e).filter(function () { - for (t = 0; t < r; t++) - if (w.contains(i[t], this)) return !0 - })); - for (n = this.pushStack([]), t = 0; t < r; t++) w.find(e, i[t], n); - return r > 1 ? w.uniqueSort(n) : n - }, - filter: function (e) { - return this.pushStack(j(this, e || [], !1)) - }, - not: function (e) { - return this.pushStack(j(this, e || [], !0)) - }, - is: function (e) { - return !!j(this, "string" == typeof e && D.test(e) ? w(e) : e || [], !1).length - } - }); - var q, L = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/; - (w.fn.init = function (e, t, n) { - var i, o; - if (!e) return this; - if (n = n || q, "string" == typeof e) { - if (!(i = "<" === e[0] && ">" === e[e.length - 1] && e.length >= 3 ? [null, e, null] : L.exec(e)) || !i[1] && t) return !t || t.jquery ? (t || n).find(e) : this.constructor(t).find(e); - if (i[1]) { - if (t = t instanceof w ? t[0] : t, w.merge(this, w.parseHTML(i[1], t && t.nodeType ? t.ownerDocument || t : r, !0)), A.test(i[1]) && w.isPlainObject(t)) - for (i in t) g(this[i]) ? this[i](t[i]) : this.attr(i, t[i]); - return this - } - return (o = r.getElementById(i[2])) && (this[0] = o, this.length = 1), this - } - return e.nodeType ? (this[0] = e, this.length = 1, this) : g(e) ? void 0 !== n.ready ? n.ready(e) : e(w) : w.makeArray(e, this) - }).prototype = w.fn, q = w(r); - var H = /^(?:parents|prev(?:Until|All))/, - O = { - children: !0, - contents: !0, - next: !0, - prev: !0 - }; - w.fn.extend({ - has: function (e) { - var t = w(e, this), - n = t.length; - return this.filter(function () { - for (var e = 0; e < n; e++) - if (w.contains(this, t[e])) return !0 - }) - }, - closest: function (e, t) { - var n, r = 0, - i = this.length, - o = [], - a = "string" != typeof e && w(e); - if (!D.test(e)) - for (; r < i; r++) - for (n = this[r]; n && n !== t; n = n.parentNode) - if (n.nodeType < 11 && (a ? a.index(n) > -1 : 1 === n.nodeType && w.find.matchesSelector(n, e))) { - o.push(n); - break - } - return this.pushStack(o.length > 1 ? w.uniqueSort(o) : o) - }, - index: function (e) { - return e ? "string" == typeof e ? u.call(w(e), this[0]) : u.call(this, e.jquery ? e[0] : e) : this[0] && this[0].parentNode ? this.first().prevAll().length : -1 - }, - add: function (e, t) { - return this.pushStack(w.uniqueSort(w.merge(this.get(), w(e, t)))) - }, - addBack: function (e) { - return this.add(null == e ? this.prevObject : this.prevObject.filter(e)) - } - }); - - function P(e, t) { - while ((e = e[t]) && 1 !== e.nodeType); - return e - } - - w.each({ - parent: function (e) { - var t = e.parentNode; - return t && 11 !== t.nodeType ? t : null - }, - parents: function (e) { - return k(e, "parentNode") - }, - parentsUntil: function (e, t, n) { - return k(e, "parentNode", n) - }, - next: function (e) { - return P(e, "nextSibling") - }, - prev: function (e) { - return P(e, "previousSibling") - }, - nextAll: function (e) { - return k(e, "nextSibling") - }, - prevAll: function (e) { - return k(e, "previousSibling") - }, - nextUntil: function (e, t, n) { - return k(e, "nextSibling", n) - }, - prevUntil: function (e, t, n) { - return k(e, "previousSibling", n) - }, - siblings: function (e) { - return S((e.parentNode || {}).firstChild, e) - }, - children: function (e) { - return S(e.firstChild) - }, - contents: function (e) { - return N(e, "iframe") ? e.contentDocument : (N(e, "template") && (e = e.content || e), w.merge([], e.childNodes)) - } - }, function (e, t) { - w.fn[e] = function (n, r) { - var i = w.map(this, t, n); - return "Until" !== e.slice(-5) && (r = n), r && "string" == typeof r && (i = w.filter(r, i)), this.length > 1 && (O[e] || w.uniqueSort(i), H.test(e) && i.reverse()), this.pushStack(i) - } - }); - var M = /[^\x20\t\r\n\f]+/g; - - function R(e) { - var t = {}; - return w.each(e.match(M) || [], function (e, n) { - t[n] = !0 - }), t - } - - w.Callbacks = function (e) { - e = "string" == typeof e ? R(e) : w.extend({}, e); - var t, n, r, i, o = [], - a = [], - s = -1, - u = function () { - for (i = i || e.once, r = t = !0; a.length; s = -1) { - n = a.shift(); - while (++s < o.length) !1 === o[s].apply(n[0], n[1]) && e.stopOnFalse && (s = o.length, n = !1) - } - e.memory || (n = !1), t = !1, i && (o = n ? [] : "") - }, - l = { - add: function () { - return o && (n && !t && (s = o.length - 1, a.push(n)), function t(n) { - w.each(n, function (n, r) { - g(r) ? e.unique && l.has(r) || o.push(r) : r && r.length && "string" !== x(r) && t(r) - }) - }(arguments), n && !t && u()), this - }, - remove: function () { - return w.each(arguments, function (e, t) { - var n; - while ((n = w.inArray(t, o, n)) > -1) o.splice(n, 1), n <= s && s-- - }), this - }, - has: function (e) { - return e ? w.inArray(e, o) > -1 : o.length > 0 - }, - empty: function () { - return o && (o = []), this - }, - disable: function () { - return i = a = [], o = n = "", this - }, - disabled: function () { - return !o - }, - lock: function () { - return i = a = [], n || t || (o = n = ""), this - }, - locked: function () { - return !!i - }, - fireWith: function (e, n) { - return i || (n = [e, (n = n || []).slice ? n.slice() : n], a.push(n), t || u()), this - }, - fire: function () { - return l.fireWith(this, arguments), this - }, - fired: function () { - return !!r - } - }; - return l - }; - - function I(e) { - return e - } - - function W(e) { - throw e - } - - function $(e, t, n, r) { - var i; - try { - e && g(i = e.promise) ? i.call(e).done(t).fail(n) : e && g(i = e.then) ? i.call(e, t, n) : t.apply(void 0, [e].slice(r)) - } catch (e) { - n.apply(void 0, [e]) - } - } - - w.extend({ - Deferred: function (t) { - var n = [ - ["notify", "progress", w.Callbacks("memory"), w.Callbacks("memory"), 2], - ["resolve", "done", w.Callbacks("once memory"), w.Callbacks("once memory"), 0, "resolved"], - ["reject", "fail", w.Callbacks("once memory"), w.Callbacks("once memory"), 1, "rejected"] - ], - r = "pending", - i = { - state: function () { - return r - }, - always: function () { - return o.done(arguments).fail(arguments), this - }, - "catch": function (e) { - return i.then(null, e) - }, - pipe: function () { - var e = arguments; - return w.Deferred(function (t) { - w.each(n, function (n, r) { - var i = g(e[r[4]]) && e[r[4]]; - o[r[1]](function () { - var e = i && i.apply(this, arguments); - e && g(e.promise) ? e.promise().progress(t.notify).done(t.resolve).fail(t.reject) : t[r[0] + "With"](this, i ? [e] : arguments) - }) - }), e = null - }).promise() - }, - then: function (t, r, i) { - var o = 0; - - function a(t, n, r, i) { - return function () { - var s = this, - u = arguments, - l = function () { - var e, l; - if (!(t < o)) { - if ((e = r.apply(s, u)) === n.promise()) throw new TypeError("Thenable self-resolution"); - l = e && ("object" == typeof e || "function" == typeof e) && e.then, g(l) ? i ? l.call(e, a(o, n, I, i), a(o, n, W, i)) : (o++, l.call(e, a(o, n, I, i), a(o, n, W, i), a(o, n, I, n.notifyWith))) : (r !== I && (s = void 0, u = [e]), (i || n.resolveWith)(s, u)) - } - }, - c = i ? l : function () { - try { - l() - } catch (e) { - w.Deferred.exceptionHook && w.Deferred.exceptionHook(e, c.stackTrace), t + 1 >= o && (r !== W && (s = void 0, u = [e]), n.rejectWith(s, u)) - } - }; - t ? c() : (w.Deferred.getStackHook && (c.stackTrace = w.Deferred.getStackHook()), e.setTimeout(c)) - } - } - - return w.Deferred(function (e) { - n[0][3].add(a(0, e, g(i) ? i : I, e.notifyWith)), n[1][3].add(a(0, e, g(t) ? t : I)), n[2][3].add(a(0, e, g(r) ? r : W)) - }).promise() - }, - promise: function (e) { - return null != e ? w.extend(e, i) : i - } - }, - o = {}; - return w.each(n, function (e, t) { - var a = t[2], - s = t[5]; - i[t[1]] = a.add, s && a.add(function () { - r = s - }, n[3 - e][2].disable, n[3 - e][3].disable, n[0][2].lock, n[0][3].lock), a.add(t[3].fire), o[t[0]] = function () { - return o[t[0] + "With"](this === o ? void 0 : this, arguments), this - }, o[t[0] + "With"] = a.fireWith - }), i.promise(o), t && t.call(o, o), o - }, - when: function (e) { - var t = arguments.length, - n = t, - r = Array(n), - i = o.call(arguments), - a = w.Deferred(), - s = function (e) { - return function (n) { - r[e] = this, i[e] = arguments.length > 1 ? o.call(arguments) : n, --t || a.resolveWith(r, i) - } - }; - if (t <= 1 && ($(e, a.done(s(n)).resolve, a.reject, !t), "pending" === a.state() || g(i[n] && i[n].then))) return a.then(); - while (n--) $(i[n], s(n), a.reject); - return a.promise() - } - }); - var B = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/; - w.Deferred.exceptionHook = function (t, n) { - e.console && e.console.warn && t && B.test(t.name) && e.console.warn("jQuery.Deferred exception: " + t.message, t.stack, n) - }, w.readyException = function (t) { - e.setTimeout(function () { - throw t - }) - }; - var F = w.Deferred(); - w.fn.ready = function (e) { - return F.then(e)["catch"](function (e) { - w.readyException(e) - }), this - }, w.extend({ - isReady: !1, - readyWait: 1, - ready: function (e) { - (!0 === e ? --w.readyWait : w.isReady) || (w.isReady = !0, !0 !== e && --w.readyWait > 0 || F.resolveWith(r, [w])) - } - }), w.ready.then = F.then; - - function _() { - r.removeEventListener("DOMContentLoaded", _), e.removeEventListener("load", _), w.ready() - } - - "complete" === r.readyState || "loading" !== r.readyState && !r.documentElement.doScroll ? e.setTimeout(w.ready) : (r.addEventListener("DOMContentLoaded", _), e.addEventListener("load", _)); - var z = function (e, t, n, r, i, o, a) { - var s = 0, - u = e.length, - l = null == n; - if ("object" === x(n)) { - i = !0; - for (s in n) z(e, t, s, n[s], !0, o, a) - } else if (void 0 !== r && (i = !0, g(r) || (a = !0), l && (a ? (t.call(e, r), t = null) : (l = t, t = function (e, t, n) { - return l.call(w(e), n) - })), t)) - for (; s < u; s++) t(e[s], n, a ? r : r.call(e[s], s, t(e[s], n))); - return i ? e : l ? t.call(e) : u ? t(e[0], n) : o - }, - X = /^-ms-/, - U = /-([a-z])/g; - - function V(e, t) { - return t.toUpperCase() - } - - function G(e) { - return e.replace(X, "ms-").replace(U, V) - } - - var Y = function (e) { - return 1 === e.nodeType || 9 === e.nodeType || !+e.nodeType - }; - - function Q() { - this.expando = w.expando + Q.uid++ - } - - Q.uid = 1, Q.prototype = { - cache: function (e) { - var t = e[this.expando]; - return t || (t = {}, Y(e) && (e.nodeType ? e[this.expando] = t : Object.defineProperty(e, this.expando, { - value: t, - configurable: !0 - }))), t - }, - set: function (e, t, n) { - var r, i = this.cache(e); - if ("string" == typeof t) i[G(t)] = n; - else - for (r in t) i[G(r)] = t[r]; - return i - }, - get: function (e, t) { - return void 0 === t ? this.cache(e) : e[this.expando] && e[this.expando][G(t)] - }, - access: function (e, t, n) { - return void 0 === t || t && "string" == typeof t && void 0 === n ? this.get(e, t) : (this.set(e, t, n), void 0 !== n ? n : t) - }, - remove: function (e, t) { - var n, r = e[this.expando]; - if (void 0 !== r) { - if (void 0 !== t) { - n = (t = Array.isArray(t) ? t.map(G) : (t = G(t)) in r ? [t] : t.match(M) || []).length; - while (n--) delete r[t[n]] - } - (void 0 === t || w.isEmptyObject(r)) && (e.nodeType ? e[this.expando] = void 0 : delete e[this.expando]) - } - }, - hasData: function (e) { - var t = e[this.expando]; - return void 0 !== t && !w.isEmptyObject(t) - } - }; - var J = new Q, - K = new Q, - Z = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - ee = /[A-Z]/g; - - function te(e) { - return "true" === e || "false" !== e && ("null" === e ? null : e === +e + "" ? +e : Z.test(e) ? JSON.parse(e) : e) - } - - function ne(e, t, n) { - var r; - if (void 0 === n && 1 === e.nodeType) - if (r = "data-" + t.replace(ee, "-$&").toLowerCase(), "string" == typeof (n = e.getAttribute(r))) { - try { - n = te(n) - } catch (e) {} - K.set(e, t, n) - } else n = void 0; - return n - } - - w.extend({ - hasData: function (e) { - return K.hasData(e) || J.hasData(e) - }, - data: function (e, t, n) { - return K.access(e, t, n) - }, - removeData: function (e, t) { - K.remove(e, t) - }, - _data: function (e, t, n) { - return J.access(e, t, n) - }, - _removeData: function (e, t) { - J.remove(e, t) - } - }), w.fn.extend({ - data: function (e, t) { - var n, r, i, o = this[0], - a = o && o.attributes; - if (void 0 === e) { - if (this.length && (i = K.get(o), 1 === o.nodeType && !J.get(o, "hasDataAttrs"))) { - n = a.length; - while (n--) a[n] && 0 === (r = a[n].name).indexOf("data-") && (r = G(r.slice(5)), ne(o, r, i[r])); - J.set(o, "hasDataAttrs", !0) - } - return i - } - return "object" == typeof e ? this.each(function () { - K.set(this, e) - }) : z(this, function (t) { - var n; - if (o && void 0 === t) { - if (void 0 !== (n = K.get(o, e))) return n; - if (void 0 !== (n = ne(o, e))) return n - } else this.each(function () { - K.set(this, e, t) - }) - }, null, t, arguments.length > 1, null, !0) - }, - removeData: function (e) { - return this.each(function () { - K.remove(this, e) - }) - } - }), w.extend({ - queue: function (e, t, n) { - var r; - if (e) return t = (t || "fx") + "queue", r = J.get(e, t), n && (!r || Array.isArray(n) ? r = J.access(e, t, w.makeArray(n)) : r.push(n)), r || [] - }, - dequeue: function (e, t) { - t = t || "fx"; - var n = w.queue(e, t), - r = n.length, - i = n.shift(), - o = w._queueHooks(e, t), - a = function () { - w.dequeue(e, t) - }; - "inprogress" === i && (i = n.shift(), r--), i && ("fx" === t && n.unshift("inprogress"), delete o.stop, i.call(e, a, o)), !r && o && o.empty.fire() - }, - _queueHooks: function (e, t) { - var n = t + "queueHooks"; - return J.get(e, n) || J.access(e, n, { - empty: w.Callbacks("once memory").add(function () { - J.remove(e, [t + "queue", n]) - }) - }) - } - }), w.fn.extend({ - queue: function (e, t) { - var n = 2; - return "string" != typeof e && (t = e, e = "fx", n--), arguments.length < n ? w.queue(this[0], e) : void 0 === t ? this : this.each(function () { - var n = w.queue(this, e, t); - w._queueHooks(this, e), "fx" === e && "inprogress" !== n[0] && w.dequeue(this, e) - }) - }, - dequeue: function (e) { - return this.each(function () { - w.dequeue(this, e) - }) - }, - clearQueue: function (e) { - return this.queue(e || "fx", []) - }, - promise: function (e, t) { - var n, r = 1, - i = w.Deferred(), - o = this, - a = this.length, - s = function () { - --r || i.resolveWith(o, [o]) - }; - "string" != typeof e && (t = e, e = void 0), e = e || "fx"; - while (a--)(n = J.get(o[a], e + "queueHooks")) && n.empty && (r++, n.empty.add(s)); - return s(), i.promise(t) - } - }); - var re = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source, - ie = new RegExp("^(?:([+-])=|)(" + re + ")([a-z%]*)$", "i"), - oe = ["Top", "Right", "Bottom", "Left"], - ae = function (e, t) { - return "none" === (e = t || e).style.display || "" === e.style.display && w.contains(e.ownerDocument, e) && "none" === w.css(e, "display") - }, - se = function (e, t, n, r) { - var i, o, a = {}; - for (o in t) a[o] = e.style[o], e.style[o] = t[o]; - i = n.apply(e, r || []); - for (o in t) e.style[o] = a[o]; - return i - }; - - function ue(e, t, n, r) { - var i, o, a = 20, - s = r ? function () { - return r.cur() - } : function () { - return w.css(e, t, "") - }, - u = s(), - l = n && n[3] || (w.cssNumber[t] ? "" : "px"), - c = (w.cssNumber[t] || "px" !== l && +u) && ie.exec(w.css(e, t)); - if (c && c[3] !== l) { - u /= 2, l = l || c[3], c = +u || 1; - while (a--) w.style(e, t, c + l), (1 - o) * (1 - (o = s() / u || .5)) <= 0 && (a = 0), c /= o; - c *= 2, w.style(e, t, c + l), n = n || [] - } - return n && (c = +c || +u || 0, i = n[1] ? c + (n[1] + 1) * n[2] : +n[2], r && (r.unit = l, r.start = c, r.end = i)), i - } - - var le = {}; - - function ce(e) { - var t, n = e.ownerDocument, - r = e.nodeName, - i = le[r]; - return i || (t = n.body.appendChild(n.createElement(r)), i = w.css(t, "display"), t.parentNode.removeChild(t), "none" === i && (i = "block"), le[r] = i, i) - } - - function fe(e, t) { - for (var n, r, i = [], o = 0, a = e.length; o < a; o++)(r = e[o]).style && (n = r.style.display, t ? ("none" === n && (i[o] = J.get(r, "display") || null, i[o] || (r.style.display = "")), "" === r.style.display && ae(r) && (i[o] = ce(r))) : "none" !== n && (i[o] = "none", J.set(r, "display", n))); - for (o = 0; o < a; o++) null != i[o] && (e[o].style.display = i[o]); - return e - } - - w.fn.extend({ - show: function () { - return fe(this, !0) - }, - hide: function () { - return fe(this) - }, - toggle: function (e) { - return "boolean" == typeof e ? e ? this.show() : this.hide() : this.each(function () { - ae(this) ? w(this).show() : w(this).hide() - }) - } - }); - var pe = /^(?:checkbox|radio)$/i, - de = /<([a-z][^\/\0>\x20\t\r\n\f]+)/i, - he = /^$|^module$|\/(?:java|ecma)script/i, - ge = { - option: [1, "<select multiple='multiple'>", "</select>"], - thead: [1, "<table>", "</table>"], - col: [2, "<table><colgroup>", "</colgroup></table>"], - tr: [2, "<table><tbody>", "</tbody></table>"], - td: [3, "<table><tbody><tr>", "</tr></tbody></table>"], - _default: [0, "", ""] - }; - ge.optgroup = ge.option, ge.tbody = ge.tfoot = ge.colgroup = ge.caption = ge.thead, ge.th = ge.td; - - function ye(e, t) { - var n; - return n = "undefined" != typeof e.getElementsByTagName ? e.getElementsByTagName(t || "*") : "undefined" != typeof e.querySelectorAll ? e.querySelectorAll(t || "*") : [], void 0 === t || t && N(e, t) ? w.merge([e], n) : n - } - - function ve(e, t) { - for (var n = 0, r = e.length; n < r; n++) J.set(e[n], "globalEval", !t || J.get(t[n], "globalEval")) - } - - var me = /<|&#?\w+;/; - - function xe(e, t, n, r, i) { - for (var o, a, s, u, l, c, f = t.createDocumentFragment(), p = [], d = 0, h = e.length; d < h; d++) - if ((o = e[d]) || 0 === o) - if ("object" === x(o)) w.merge(p, o.nodeType ? [o] : o); - else if (me.test(o)) { - a = a || f.appendChild(t.createElement("div")), s = (de.exec(o) || ["", ""])[1].toLowerCase(), u = ge[s] || ge._default, a.innerHTML = u[1] + w.htmlPrefilter(o) + u[2], c = u[0]; - while (c--) a = a.lastChild; - w.merge(p, a.childNodes), (a = f.firstChild).textContent = "" - } else p.push(t.createTextNode(o)); - f.textContent = "", d = 0; - while (o = p[d++]) - if (r && w.inArray(o, r) > -1) i && i.push(o); - else if (l = w.contains(o.ownerDocument, o), a = ye(f.appendChild(o), "script"), l && ve(a), n) { - c = 0; - while (o = a[c++]) he.test(o.type || "") && n.push(o) - } - return f - } - - ! function () { - var e = r.createDocumentFragment().appendChild(r.createElement("div")), - t = r.createElement("input"); - t.setAttribute("type", "radio"), t.setAttribute("checked", "checked"), t.setAttribute("name", "t"), e.appendChild(t), h.checkClone = e.cloneNode(!0).cloneNode(!0).lastChild.checked, e.innerHTML = "<textarea>x</textarea>", h.noCloneChecked = !!e.cloneNode(!0).lastChild.defaultValue - }(); - var be = r.documentElement, - we = /^key/, - Te = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, - Ce = /^([^.]*)(?:\.(.+)|)/; - - function Ee() { - return !0 - } - - function ke() { - return !1 - } - - function Se() { - try { - return r.activeElement - } catch (e) {} - } - - function De(e, t, n, r, i, o) { - var a, s; - if ("object" == typeof t) { - "string" != typeof n && (r = r || n, n = void 0); - for (s in t) De(e, s, n, r, t[s], o); - return e - } - if (null == r && null == i ? (i = n, r = n = void 0) : null == i && ("string" == typeof n ? (i = r, r = void 0) : (i = r, r = n, n = void 0)), !1 === i) i = ke; - else if (!i) return e; - return 1 === o && (a = i, (i = function (e) { - return w().off(e), a.apply(this, arguments) - }).guid = a.guid || (a.guid = w.guid++)), e.each(function () { - w.event.add(this, t, i, r, n) - }) - } - - w.event = { - global: {}, - add: function (e, t, n, r, i) { - var o, a, s, u, l, c, f, p, d, h, g, y = J.get(e); - if (y) { - n.handler && (n = (o = n).handler, i = o.selector), i && w.find.matchesSelector(be, i), n.guid || (n.guid = w.guid++), (u = y.events) || (u = y.events = {}), (a = y.handle) || (a = y.handle = function (t) { - return "undefined" != typeof w && w.event.triggered !== t.type ? w.event.dispatch.apply(e, arguments) : void 0 - }), l = (t = (t || "").match(M) || [""]).length; - while (l--) d = g = (s = Ce.exec(t[l]) || [])[1], h = (s[2] || "").split(".").sort(), d && (f = w.event.special[d] || {}, d = (i ? f.delegateType : f.bindType) || d, f = w.event.special[d] || {}, c = w.extend({ - type: d, - origType: g, - data: r, - handler: n, - guid: n.guid, - selector: i, - needsContext: i && w.expr.match.needsContext.test(i), - namespace: h.join(".") - }, o), (p = u[d]) || ((p = u[d] = []).delegateCount = 0, f.setup && !1 !== f.setup.call(e, r, h, a) || e.addEventListener && e.addEventListener(d, a)), f.add && (f.add.call(e, c), c.handler.guid || (c.handler.guid = n.guid)), i ? p.splice(p.delegateCount++, 0, c) : p.push(c), w.event.global[d] = !0) - } - }, - remove: function (e, t, n, r, i) { - var o, a, s, u, l, c, f, p, d, h, g, y = J.hasData(e) && J.get(e); - if (y && (u = y.events)) { - l = (t = (t || "").match(M) || [""]).length; - while (l--) - if (s = Ce.exec(t[l]) || [], d = g = s[1], h = (s[2] || "").split(".").sort(), d) { - f = w.event.special[d] || {}, p = u[d = (r ? f.delegateType : f.bindType) || d] || [], s = s[2] && new RegExp("(^|\\.)" + h.join("\\.(?:.*\\.|)") + "(\\.|$)"), a = o = p.length; - while (o--) c = p[o], !i && g !== c.origType || n && n.guid !== c.guid || s && !s.test(c.namespace) || r && r !== c.selector && ("**" !== r || !c.selector) || (p.splice(o, 1), c.selector && p.delegateCount--, f.remove && f.remove.call(e, c)); - a && !p.length && (f.teardown && !1 !== f.teardown.call(e, h, y.handle) || w.removeEvent(e, d, y.handle), delete u[d]) - } else - for (d in u) w.event.remove(e, d + t[l], n, r, !0); - w.isEmptyObject(u) && J.remove(e, "handle events") - } - }, - dispatch: function (e) { - var t = w.event.fix(e), - n, r, i, o, a, s, u = new Array(arguments.length), - l = (J.get(this, "events") || {})[t.type] || [], - c = w.event.special[t.type] || {}; - for (u[0] = t, n = 1; n < arguments.length; n++) u[n] = arguments[n]; - if (t.delegateTarget = this, !c.preDispatch || !1 !== c.preDispatch.call(this, t)) { - s = w.event.handlers.call(this, t, l), n = 0; - while ((o = s[n++]) && !t.isPropagationStopped()) { - t.currentTarget = o.elem, r = 0; - while ((a = o.handlers[r++]) && !t.isImmediatePropagationStopped()) t.rnamespace && !t.rnamespace.test(a.namespace) || (t.handleObj = a, t.data = a.data, void 0 !== (i = ((w.event.special[a.origType] || {}).handle || a.handler).apply(o.elem, u)) && !1 === (t.result = i) && (t.preventDefault(), t.stopPropagation())) - } - return c.postDispatch && c.postDispatch.call(this, t), t.result - } - }, - handlers: function (e, t) { - var n, r, i, o, a, s = [], - u = t.delegateCount, - l = e.target; - if (u && l.nodeType && !("click" === e.type && e.button >= 1)) - for (; l !== this; l = l.parentNode || this) - if (1 === l.nodeType && ("click" !== e.type || !0 !== l.disabled)) { - for (o = [], a = {}, n = 0; n < u; n++) void 0 === a[i = (r = t[n]).selector + " "] && (a[i] = r.needsContext ? w(i, this).index(l) > -1 : w.find(i, this, null, [l]).length), a[i] && o.push(r); - o.length && s.push({ - elem: l, - handlers: o - }) - } - return l = this, u < t.length && s.push({ - elem: l, - handlers: t.slice(u) - }), s - }, - addProp: function (e, t) { - Object.defineProperty(w.Event.prototype, e, { - enumerable: !0, - configurable: !0, - get: g(t) ? function () { - if (this.originalEvent) return t(this.originalEvent) - } : function () { - if (this.originalEvent) return this.originalEvent[e] - }, - set: function (t) { - Object.defineProperty(this, e, { - enumerable: !0, - configurable: !0, - writable: !0, - value: t - }) - } - }) - }, - fix: function (e) { - return e[w.expando] ? e : new w.Event(e) - }, - special: { - load: { - noBubble: !0 - }, - focus: { - trigger: function () { - if (this !== Se() && this.focus) return this.focus(), !1 - }, - delegateType: "focusin" - }, - blur: { - trigger: function () { - if (this === Se() && this.blur) return this.blur(), !1 - }, - delegateType: "focusout" - }, - click: { - trigger: function () { - if ("checkbox" === this.type && this.click && N(this, "input")) return this.click(), !1 - }, - _default: function (e) { - return N(e.target, "a") - } - }, - beforeunload: { - postDispatch: function (e) { - void 0 !== e.result && e.originalEvent && (e.originalEvent.returnValue = e.result) - } - } - } - }, w.removeEvent = function (e, t, n) { - e.removeEventListener && e.removeEventListener(t, n) - }, w.Event = function (e, t) { - if (!(this instanceof w.Event)) return new w.Event(e, t); - e && e.type ? (this.originalEvent = e, this.type = e.type, this.isDefaultPrevented = e.defaultPrevented || void 0 === e.defaultPrevented && !1 === e.returnValue ? Ee : ke, this.target = e.target && 3 === e.target.nodeType ? e.target.parentNode : e.target, this.currentTarget = e.currentTarget, this.relatedTarget = e.relatedTarget) : this.type = e, t && w.extend(this, t), this.timeStamp = e && e.timeStamp || Date.now(), this[w.expando] = !0 - }, w.Event.prototype = { - constructor: w.Event, - isDefaultPrevented: ke, - isPropagationStopped: ke, - isImmediatePropagationStopped: ke, - isSimulated: !1, - preventDefault: function () { - var e = this.originalEvent; - this.isDefaultPrevented = Ee, e && !this.isSimulated && e.preventDefault() - }, - stopPropagation: function () { - var e = this.originalEvent; - this.isPropagationStopped = Ee, e && !this.isSimulated && e.stopPropagation() - }, - stopImmediatePropagation: function () { - var e = this.originalEvent; - this.isImmediatePropagationStopped = Ee, e && !this.isSimulated && e.stopImmediatePropagation(), this.stopPropagation() - } - }, w.each({ - altKey: !0, - bubbles: !0, - cancelable: !0, - changedTouches: !0, - ctrlKey: !0, - detail: !0, - eventPhase: !0, - metaKey: !0, - pageX: !0, - pageY: !0, - shiftKey: !0, - view: !0, - "char": !0, - charCode: !0, - key: !0, - keyCode: !0, - button: !0, - buttons: !0, - clientX: !0, - clientY: !0, - offsetX: !0, - offsetY: !0, - pointerId: !0, - pointerType: !0, - screenX: !0, - screenY: !0, - targetTouches: !0, - toElement: !0, - touches: !0, - which: function (e) { - var t = e.button; - return null == e.which && we.test(e.type) ? null != e.charCode ? e.charCode : e.keyCode : !e.which && void 0 !== t && Te.test(e.type) ? 1 & t ? 1 : 2 & t ? 3 : 4 & t ? 2 : 0 : e.which - } - }, w.event.addProp), w.each({ - mouseenter: "mouseover", - mouseleave: "mouseout", - pointerenter: "pointerover", - pointerleave: "pointerout" - }, function (e, t) { - w.event.special[e] = { - delegateType: t, - bindType: t, - handle: function (e) { - var n, r = this, - i = e.relatedTarget, - o = e.handleObj; - return i && (i === r || w.contains(r, i)) || (e.type = o.origType, n = o.handler.apply(this, arguments), e.type = t), n - } - } - }), w.fn.extend({ - on: function (e, t, n, r) { - return De(this, e, t, n, r) - }, - one: function (e, t, n, r) { - return De(this, e, t, n, r, 1) - }, - off: function (e, t, n) { - var r, i; - if (e && e.preventDefault && e.handleObj) return r = e.handleObj, w(e.delegateTarget).off(r.namespace ? r.origType + "." + r.namespace : r.origType, r.selector, r.handler), this; - if ("object" == typeof e) { - for (i in e) this.off(i, t, e[i]); - return this - } - return !1 !== t && "function" != typeof t || (n = t, t = void 0), !1 === n && (n = ke), this.each(function () { - w.event.remove(this, e, n, t) - }) - } - }); - var Ne = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, - Ae = /<script|<style|<link/i, - je = /checked\s*(?:[^=]|=\s*.checked.)/i, - qe = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g; - - function Le(e, t) { - return N(e, "table") && N(11 !== t.nodeType ? t : t.firstChild, "tr") ? w(e).children("tbody")[0] || e : e - } - - function He(e) { - return e.type = (null !== e.getAttribute("type")) + "/" + e.type, e - } - - function Oe(e) { - return "true/" === (e.type || "").slice(0, 5) ? e.type = e.type.slice(5) : e.removeAttribute("type"), e - } - - function Pe(e, t) { - var n, r, i, o, a, s, u, l; - if (1 === t.nodeType) { - if (J.hasData(e) && (o = J.access(e), a = J.set(t, o), l = o.events)) { - delete a.handle, a.events = {}; - for (i in l) - for (n = 0, r = l[i].length; n < r; n++) w.event.add(t, i, l[i][n]) - } - K.hasData(e) && (s = K.access(e), u = w.extend({}, s), K.set(t, u)) - } - } - - function Me(e, t) { - var n = t.nodeName.toLowerCase(); - "input" === n && pe.test(e.type) ? t.checked = e.checked : "input" !== n && "textarea" !== n || (t.defaultValue = e.defaultValue) - } - - function Re(e, t, n, r) { - t = a.apply([], t); - var i, o, s, u, l, c, f = 0, - p = e.length, - d = p - 1, - y = t[0], - v = g(y); - if (v || p > 1 && "string" == typeof y && !h.checkClone && je.test(y)) return e.each(function (i) { - var o = e.eq(i); - v && (t[0] = y.call(this, i, o.html())), Re(o, t, n, r) - }); - if (p && (i = xe(t, e[0].ownerDocument, !1, e, r), o = i.firstChild, 1 === i.childNodes.length && (i = o), o || r)) { - for (u = (s = w.map(ye(i, "script"), He)).length; f < p; f++) l = i, f !== d && (l = w.clone(l, !0, !0), u && w.merge(s, ye(l, "script"))), n.call(e[f], l, f); - if (u) - for (c = s[s.length - 1].ownerDocument, w.map(s, Oe), f = 0; f < u; f++) l = s[f], he.test(l.type || "") && !J.access(l, "globalEval") && w.contains(c, l) && (l.src && "module" !== (l.type || "").toLowerCase() ? w._evalUrl && w._evalUrl(l.src) : m(l.textContent.replace(qe, ""), c, l)) - } - return e - } - - function Ie(e, t, n) { - for (var r, i = t ? w.filter(t, e) : e, o = 0; null != (r = i[o]); o++) n || 1 !== r.nodeType || w.cleanData(ye(r)), r.parentNode && (n && w.contains(r.ownerDocument, r) && ve(ye(r, "script")), r.parentNode.removeChild(r)); - return e - } - - w.extend({ - htmlPrefilter: function (e) { - return e.replace(Ne, "<$1></$2>") - }, - clone: function (e, t, n) { - var r, i, o, a, s = e.cloneNode(!0), - u = w.contains(e.ownerDocument, e); - if (!(h.noCloneChecked || 1 !== e.nodeType && 11 !== e.nodeType || w.isXMLDoc(e))) - for (a = ye(s), r = 0, i = (o = ye(e)).length; r < i; r++) Me(o[r], a[r]); - if (t) - if (n) - for (o = o || ye(e), a = a || ye(s), r = 0, i = o.length; r < i; r++) Pe(o[r], a[r]); - else Pe(e, s); - return (a = ye(s, "script")).length > 0 && ve(a, !u && ye(e, "script")), s - }, - cleanData: function (e) { - for (var t, n, r, i = w.event.special, o = 0; void 0 !== (n = e[o]); o++) - if (Y(n)) { - if (t = n[J.expando]) { - if (t.events) - for (r in t.events) i[r] ? w.event.remove(n, r) : w.removeEvent(n, r, t.handle); - n[J.expando] = void 0 - } - n[K.expando] && (n[K.expando] = void 0) - } - } - }), w.fn.extend({ - detach: function (e) { - return Ie(this, e, !0) - }, - remove: function (e) { - return Ie(this, e) - }, - text: function (e) { - return z(this, function (e) { - return void 0 === e ? w.text(this) : this.empty().each(function () { - 1 !== this.nodeType && 11 !== this.nodeType && 9 !== this.nodeType || (this.textContent = e) - }) - }, null, e, arguments.length) - }, - append: function () { - return Re(this, arguments, function (e) { - 1 !== this.nodeType && 11 !== this.nodeType && 9 !== this.nodeType || Le(this, e).appendChild(e) - }) - }, - prepend: function () { - return Re(this, arguments, function (e) { - if (1 === this.nodeType || 11 === this.nodeType || 9 === this.nodeType) { - var t = Le(this, e); - t.insertBefore(e, t.firstChild) - } - }) - }, - before: function () { - return Re(this, arguments, function (e) { - this.parentNode && this.parentNode.insertBefore(e, this) - }) - }, - after: function () { - return Re(this, arguments, function (e) { - this.parentNode && this.parentNode.insertBefore(e, this.nextSibling) - }) - }, - empty: function () { - for (var e, t = 0; null != (e = this[t]); t++) 1 === e.nodeType && (w.cleanData(ye(e, !1)), e.textContent = ""); - return this - }, - clone: function (e, t) { - return e = null != e && e, t = null == t ? e : t, this.map(function () { - return w.clone(this, e, t) - }) - }, - html: function (e) { - return z(this, function (e) { - var t = this[0] || {}, - n = 0, - r = this.length; - if (void 0 === e && 1 === t.nodeType) return t.innerHTML; - if ("string" == typeof e && !Ae.test(e) && !ge[(de.exec(e) || ["", ""])[1].toLowerCase()]) { - e = w.htmlPrefilter(e); - try { - for (; n < r; n++) 1 === (t = this[n] || {}).nodeType && (w.cleanData(ye(t, !1)), t.innerHTML = e); - t = 0 - } catch (e) {} - } - t && this.empty().append(e) - }, null, e, arguments.length) - }, - replaceWith: function () { - var e = []; - return Re(this, arguments, function (t) { - var n = this.parentNode; - w.inArray(this, e) < 0 && (w.cleanData(ye(this)), n && n.replaceChild(t, this)) - }, e) - } - }), w.each({ - appendTo: "append", - prependTo: "prepend", - insertBefore: "before", - insertAfter: "after", - replaceAll: "replaceWith" - }, function (e, t) { - w.fn[e] = function (e) { - for (var n, r = [], i = w(e), o = i.length - 1, a = 0; a <= o; a++) n = a === o ? this : this.clone(!0), w(i[a])[t](n), s.apply(r, n.get()); - return this.pushStack(r) - } - }); - var We = new RegExp("^(" + re + ")(?!px)[a-z%]+$", "i"), - $e = function (t) { - var n = t.ownerDocument.defaultView; - return n && n.opener || (n = e), n.getComputedStyle(t) - }, - Be = new RegExp(oe.join("|"), "i"); - ! function () { - function t() { - if (c) { - l.style.cssText = "position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0", c.style.cssText = "position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%", be.appendChild(l).appendChild(c); - var t = e.getComputedStyle(c); - i = "1%" !== t.top, u = 12 === n(t.marginLeft), c.style.right = "60%", s = 36 === n(t.right), o = 36 === n(t.width), c.style.position = "absolute", a = 36 === c.offsetWidth || "absolute", be.removeChild(l), c = null - } - } - - function n(e) { - return Math.round(parseFloat(e)) - } - - var i, o, a, s, u, l = r.createElement("div"), - c = r.createElement("div"); - c.style && (c.style.backgroundClip = "content-box", c.cloneNode(!0).style.backgroundClip = "", h.clearCloneStyle = "content-box" === c.style.backgroundClip, w.extend(h, { - boxSizingReliable: function () { - return t(), o - }, - pixelBoxStyles: function () { - return t(), s - }, - pixelPosition: function () { - return t(), i - }, - reliableMarginLeft: function () { - return t(), u - }, - scrollboxSize: function () { - return t(), a - } - })) - }(); - - function Fe(e, t, n) { - var r, i, o, a, s = e.style; - return (n = n || $e(e)) && ("" !== (a = n.getPropertyValue(t) || n[t]) || w.contains(e.ownerDocument, e) || (a = w.style(e, t)), !h.pixelBoxStyles() && We.test(a) && Be.test(t) && (r = s.width, i = s.minWidth, o = s.maxWidth, s.minWidth = s.maxWidth = s.width = a, a = n.width, s.width = r, s.minWidth = i, s.maxWidth = o)), void 0 !== a ? a + "" : a - } - - function _e(e, t) { - return { - get: function () { - if (!e()) return (this.get = t).apply(this, arguments); - delete this.get - } - } - } - - var ze = /^(none|table(?!-c[ea]).+)/, - Xe = /^--/, - Ue = { - position: "absolute", - visibility: "hidden", - display: "block" - }, - Ve = { - letterSpacing: "0", - fontWeight: "400" - }, - Ge = ["Webkit", "Moz", "ms"], - Ye = r.createElement("div").style; - - function Qe(e) { - if (e in Ye) return e; - var t = e[0].toUpperCase() + e.slice(1), - n = Ge.length; - while (n--) - if ((e = Ge[n] + t) in Ye) return e - } - - function Je(e) { - var t = w.cssProps[e]; - return t || (t = w.cssProps[e] = Qe(e) || e), t - } - - function Ke(e, t, n) { - var r = ie.exec(t); - return r ? Math.max(0, r[2] - (n || 0)) + (r[3] || "px") : t - } - - function Ze(e, t, n, r, i, o) { - var a = "width" === t ? 1 : 0, - s = 0, - u = 0; - if (n === (r ? "border" : "content")) return 0; - for (; a < 4; a += 2) "margin" === n && (u += w.css(e, n + oe[a], !0, i)), r ? ("content" === n && (u -= w.css(e, "padding" + oe[a], !0, i)), "margin" !== n && (u -= w.css(e, "border" + oe[a] + "Width", !0, i))) : (u += w.css(e, "padding" + oe[a], !0, i), "padding" !== n ? u += w.css(e, "border" + oe[a] + "Width", !0, i) : s += w.css(e, "border" + oe[a] + "Width", !0, i)); - return !r && o >= 0 && (u += Math.max(0, Math.ceil(e["offset" + t[0].toUpperCase() + t.slice(1)] - o - u - s - .5))), u - } - - function et(e, t, n) { - var r = $e(e), - i = Fe(e, t, r), - o = "border-box" === w.css(e, "boxSizing", !1, r), - a = o; - if (We.test(i)) { - if (!n) return i; - i = "auto" - } - return a = a && (h.boxSizingReliable() || i === e.style[t]), ("auto" === i || !parseFloat(i) && "inline" === w.css(e, "display", !1, r)) && (i = e["offset" + t[0].toUpperCase() + t.slice(1)], a = !0), (i = parseFloat(i) || 0) + Ze(e, t, n || (o ? "border" : "content"), a, r, i) + "px" - } - - w.extend({ - cssHooks: { - opacity: { - get: function (e, t) { - if (t) { - var n = Fe(e, "opacity"); - return "" === n ? "1" : n - } - } - } - }, - cssNumber: { - animationIterationCount: !0, - columnCount: !0, - fillOpacity: !0, - flexGrow: !0, - flexShrink: !0, - fontWeight: !0, - lineHeight: !0, - opacity: !0, - order: !0, - orphans: !0, - widows: !0, - zIndex: !0, - zoom: !0 - }, - cssProps: {}, - style: function (e, t, n, r) { - if (e && 3 !== e.nodeType && 8 !== e.nodeType && e.style) { - var i, o, a, s = G(t), - u = Xe.test(t), - l = e.style; - if (u || (t = Je(s)), a = w.cssHooks[t] || w.cssHooks[s], void 0 === n) return a && "get" in a && void 0 !== (i = a.get(e, !1, r)) ? i : l[t]; - "string" == (o = typeof n) && (i = ie.exec(n)) && i[1] && (n = ue(e, t, i), o = "number"), null != n && n === n && ("number" === o && (n += i && i[3] || (w.cssNumber[s] ? "" : "px")), h.clearCloneStyle || "" !== n || 0 !== t.indexOf("background") || (l[t] = "inherit"), a && "set" in a && void 0 === (n = a.set(e, n, r)) || (u ? l.setProperty(t, n) : l[t] = n)) - } - }, - css: function (e, t, n, r) { - var i, o, a, s = G(t); - return Xe.test(t) || (t = Je(s)), (a = w.cssHooks[t] || w.cssHooks[s]) && "get" in a && (i = a.get(e, !0, n)), void 0 === i && (i = Fe(e, t, r)), "normal" === i && t in Ve && (i = Ve[t]), "" === n || n ? (o = parseFloat(i), !0 === n || isFinite(o) ? o || 0 : i) : i - } - }), w.each(["height", "width"], function (e, t) { - w.cssHooks[t] = { - get: function (e, n, r) { - if (n) return !ze.test(w.css(e, "display")) || e.getClientRects().length && e.getBoundingClientRect().width ? et(e, t, r) : se(e, Ue, function () { - return et(e, t, r) - }) - }, - set: function (e, n, r) { - var i, o = $e(e), - a = "border-box" === w.css(e, "boxSizing", !1, o), - s = r && Ze(e, t, r, a, o); - return a && h.scrollboxSize() === o.position && (s -= Math.ceil(e["offset" + t[0].toUpperCase() + t.slice(1)] - parseFloat(o[t]) - Ze(e, t, "border", !1, o) - .5)), s && (i = ie.exec(n)) && "px" !== (i[3] || "px") && (e.style[t] = n, n = w.css(e, t)), Ke(e, n, s) - } - } - }), w.cssHooks.marginLeft = _e(h.reliableMarginLeft, function (e, t) { - if (t) return (parseFloat(Fe(e, "marginLeft")) || e.getBoundingClientRect().left - se(e, { - marginLeft: 0 - }, function () { - return e.getBoundingClientRect().left - })) + "px" - }), w.each({ - margin: "", - padding: "", - border: "Width" - }, function (e, t) { - w.cssHooks[e + t] = { - expand: function (n) { - for (var r = 0, i = {}, o = "string" == typeof n ? n.split(" ") : [n]; r < 4; r++) i[e + oe[r] + t] = o[r] || o[r - 2] || o[0]; - return i - } - }, "margin" !== e && (w.cssHooks[e + t].set = Ke) - }), w.fn.extend({ - css: function (e, t) { - return z(this, function (e, t, n) { - var r, i, o = {}, - a = 0; - if (Array.isArray(t)) { - for (r = $e(e), i = t.length; a < i; a++) o[t[a]] = w.css(e, t[a], !1, r); - return o - } - return void 0 !== n ? w.style(e, t, n) : w.css(e, t) - }, e, t, arguments.length > 1) - } - }); - - function tt(e, t, n, r, i) { - return new tt.prototype.init(e, t, n, r, i) - } - - w.Tween = tt, tt.prototype = { - constructor: tt, - init: function (e, t, n, r, i, o) { - this.elem = e, this.prop = n, this.easing = i || w.easing._default, this.options = t, this.start = this.now = this.cur(), this.end = r, this.unit = o || (w.cssNumber[n] ? "" : "px") - }, - cur: function () { - var e = tt.propHooks[this.prop]; - return e && e.get ? e.get(this) : tt.propHooks._default.get(this) - }, - run: function (e) { - var t, n = tt.propHooks[this.prop]; - return this.options.duration ? this.pos = t = w.easing[this.easing](e, this.options.duration * e, 0, 1, this.options.duration) : this.pos = t = e, this.now = (this.end - this.start) * t + this.start, this.options.step && this.options.step.call(this.elem, this.now, this), n && n.set ? n.set(this) : tt.propHooks._default.set(this), this - } - }, tt.prototype.init.prototype = tt.prototype, tt.propHooks = { - _default: { - get: function (e) { - var t; - return 1 !== e.elem.nodeType || null != e.elem[e.prop] && null == e.elem.style[e.prop] ? e.elem[e.prop] : (t = w.css(e.elem, e.prop, "")) && "auto" !== t ? t : 0 - }, - set: function (e) { - w.fx.step[e.prop] ? w.fx.step[e.prop](e) : 1 !== e.elem.nodeType || null == e.elem.style[w.cssProps[e.prop]] && !w.cssHooks[e.prop] ? e.elem[e.prop] = e.now : w.style(e.elem, e.prop, e.now + e.unit) - } - } - }, tt.propHooks.scrollTop = tt.propHooks.scrollLeft = { - set: function (e) { - e.elem.nodeType && e.elem.parentNode && (e.elem[e.prop] = e.now) - } - }, w.easing = { - linear: function (e) { - return e - }, - swing: function (e) { - return .5 - Math.cos(e * Math.PI) / 2 - }, - _default: "swing" - }, w.fx = tt.prototype.init, w.fx.step = {}; - var nt, rt, it = /^(?:toggle|show|hide)$/, - ot = /queueHooks$/; - - function at() { - rt && (!1 === r.hidden && e.requestAnimationFrame ? e.requestAnimationFrame(at) : e.setTimeout(at, w.fx.interval), w.fx.tick()) - } - - function st() { - return e.setTimeout(function () { - nt = void 0 - }), nt = Date.now() - } - - function ut(e, t) { - var n, r = 0, - i = { - height: e - }; - for (t = t ? 1 : 0; r < 4; r += 2 - t) i["margin" + (n = oe[r])] = i["padding" + n] = e; - return t && (i.opacity = i.width = e), i - } - - function lt(e, t, n) { - for (var r, i = (pt.tweeners[t] || []).concat(pt.tweeners["*"]), o = 0, a = i.length; o < a; o++) - if (r = i[o].call(n, t, e)) return r - } - - function ct(e, t, n) { - var r, i, o, a, s, u, l, c, f = "width" in t || "height" in t, - p = this, - d = {}, - h = e.style, - g = e.nodeType && ae(e), - y = J.get(e, "fxshow"); - n.queue || (null == (a = w._queueHooks(e, "fx")).unqueued && (a.unqueued = 0, s = a.empty.fire, a.empty.fire = function () { - a.unqueued || s() - }), a.unqueued++, p.always(function () { - p.always(function () { - a.unqueued--, w.queue(e, "fx").length || a.empty.fire() - }) - })); - for (r in t) - if (i = t[r], it.test(i)) { - if (delete t[r], o = o || "toggle" === i, i === (g ? "hide" : "show")) { - if ("show" !== i || !y || void 0 === y[r]) continue; - g = !0 - } - d[r] = y && y[r] || w.style(e, r) - } - if ((u = !w.isEmptyObject(t)) || !w.isEmptyObject(d)) { - f && 1 === e.nodeType && (n.overflow = [h.overflow, h.overflowX, h.overflowY], null == (l = y && y.display) && (l = J.get(e, "display")), "none" === (c = w.css(e, "display")) && (l ? c = l : (fe([e], !0), l = e.style.display || l, c = w.css(e, "display"), fe([e]))), ("inline" === c || "inline-block" === c && null != l) && "none" === w.css(e, "float") && (u || (p.done(function () { - h.display = l - }), null == l && (c = h.display, l = "none" === c ? "" : c)), h.display = "inline-block")), n.overflow && (h.overflow = "hidden", p.always(function () { - h.overflow = n.overflow[0], h.overflowX = n.overflow[1], h.overflowY = n.overflow[2] - })), u = !1; - for (r in d) u || (y ? "hidden" in y && (g = y.hidden) : y = J.access(e, "fxshow", { - display: l - }), o && (y.hidden = !g), g && fe([e], !0), p.done(function () { - g || fe([e]), J.remove(e, "fxshow"); - for (r in d) w.style(e, r, d[r]) - })), u = lt(g ? y[r] : 0, r, p), r in y || (y[r] = u.start, g && (u.end = u.start, u.start = 0)) - } - } - - function ft(e, t) { - var n, r, i, o, a; - for (n in e) - if (r = G(n), i = t[r], o = e[n], Array.isArray(o) && (i = o[1], o = e[n] = o[0]), n !== r && (e[r] = o, delete e[n]), (a = w.cssHooks[r]) && "expand" in a) { - o = a.expand(o), delete e[r]; - for (n in o) n in e || (e[n] = o[n], t[n] = i) - } else t[r] = i - } - - function pt(e, t, n) { - var r, i, o = 0, - a = pt.prefilters.length, - s = w.Deferred().always(function () { - delete u.elem - }), - u = function () { - if (i) return !1; - for (var t = nt || st(), n = Math.max(0, l.startTime + l.duration - t), r = 1 - (n / l.duration || 0), o = 0, a = l.tweens.length; o < a; o++) l.tweens[o].run(r); - return s.notifyWith(e, [l, r, n]), r < 1 && a ? n : (a || s.notifyWith(e, [l, 1, 0]), s.resolveWith(e, [l]), !1) - }, - l = s.promise({ - elem: e, - props: w.extend({}, t), - opts: w.extend(!0, { - specialEasing: {}, - easing: w.easing._default - }, n), - originalProperties: t, - originalOptions: n, - startTime: nt || st(), - duration: n.duration, - tweens: [], - createTween: function (t, n) { - var r = w.Tween(e, l.opts, t, n, l.opts.specialEasing[t] || l.opts.easing); - return l.tweens.push(r), r - }, - stop: function (t) { - var n = 0, - r = t ? l.tweens.length : 0; - if (i) return this; - for (i = !0; n < r; n++) l.tweens[n].run(1); - return t ? (s.notifyWith(e, [l, 1, 0]), s.resolveWith(e, [l, t])) : s.rejectWith(e, [l, t]), this - } - }), - c = l.props; - for (ft(c, l.opts.specialEasing); o < a; o++) - if (r = pt.prefilters[o].call(l, e, c, l.opts)) return g(r.stop) && (w._queueHooks(l.elem, l.opts.queue).stop = r.stop.bind(r)), r; - return w.map(c, lt, l), g(l.opts.start) && l.opts.start.call(e, l), l.progress(l.opts.progress).done(l.opts.done, l.opts.complete).fail(l.opts.fail).always(l.opts.always), w.fx.timer(w.extend(u, { - elem: e, - anim: l, - queue: l.opts.queue - })), l - } - - w.Animation = w.extend(pt, { - tweeners: { - "*": [function (e, t) { - var n = this.createTween(e, t); - return ue(n.elem, e, ie.exec(t), n), n - }] - }, - tweener: function (e, t) { - g(e) ? (t = e, e = ["*"]) : e = e.match(M); - for (var n, r = 0, i = e.length; r < i; r++) n = e[r], pt.tweeners[n] = pt.tweeners[n] || [], pt.tweeners[n].unshift(t) - }, - prefilters: [ct], - prefilter: function (e, t) { - t ? pt.prefilters.unshift(e) : pt.prefilters.push(e) - } - }), w.speed = function (e, t, n) { - var r = e && "object" == typeof e ? w.extend({}, e) : { - complete: n || !n && t || g(e) && e, - duration: e, - easing: n && t || t && !g(t) && t - }; - return w.fx.off ? r.duration = 0 : "number" != typeof r.duration && (r.duration in w.fx.speeds ? r.duration = w.fx.speeds[r.duration] : r.duration = w.fx.speeds._default), null != r.queue && !0 !== r.queue || (r.queue = "fx"), r.old = r.complete, r.complete = function () { - g(r.old) && r.old.call(this), r.queue && w.dequeue(this, r.queue) - }, r - }, w.fn.extend({ - fadeTo: function (e, t, n, r) { - return this.filter(ae).css("opacity", 0).show().end().animate({ - opacity: t - }, e, n, r) - }, - animate: function (e, t, n, r) { - var i = w.isEmptyObject(e), - o = w.speed(t, n, r), - a = function () { - var t = pt(this, w.extend({}, e), o); - (i || J.get(this, "finish")) && t.stop(!0) - }; - return a.finish = a, i || !1 === o.queue ? this.each(a) : this.queue(o.queue, a) - }, - stop: function (e, t, n) { - var r = function (e) { - var t = e.stop; - delete e.stop, t(n) - }; - return "string" != typeof e && (n = t, t = e, e = void 0), t && !1 !== e && this.queue(e || "fx", []), this.each(function () { - var t = !0, - i = null != e && e + "queueHooks", - o = w.timers, - a = J.get(this); - if (i) a[i] && a[i].stop && r(a[i]); - else - for (i in a) a[i] && a[i].stop && ot.test(i) && r(a[i]); - for (i = o.length; i--;) o[i].elem !== this || null != e && o[i].queue !== e || (o[i].anim.stop(n), t = !1, o.splice(i, 1)); - !t && n || w.dequeue(this, e) - }) - }, - finish: function (e) { - return !1 !== e && (e = e || "fx"), this.each(function () { - var t, n = J.get(this), - r = n[e + "queue"], - i = n[e + "queueHooks"], - o = w.timers, - a = r ? r.length : 0; - for (n.finish = !0, w.queue(this, e, []), i && i.stop && i.stop.call(this, !0), t = o.length; t--;) o[t].elem === this && o[t].queue === e && (o[t].anim.stop(!0), o.splice(t, 1)); - for (t = 0; t < a; t++) r[t] && r[t].finish && r[t].finish.call(this); - delete n.finish - }) - } - }), w.each(["toggle", "show", "hide"], function (e, t) { - var n = w.fn[t]; - w.fn[t] = function (e, r, i) { - return null == e || "boolean" == typeof e ? n.apply(this, arguments) : this.animate(ut(t, !0), e, r, i) - } - }), w.each({ - slideDown: ut("show"), - slideUp: ut("hide"), - slideToggle: ut("toggle"), - fadeIn: { - opacity: "show" - }, - fadeOut: { - opacity: "hide" - }, - fadeToggle: { - opacity: "toggle" - } - }, function (e, t) { - w.fn[e] = function (e, n, r) { - return this.animate(t, e, n, r) - } - }), w.timers = [], w.fx.tick = function () { - var e, t = 0, - n = w.timers; - for (nt = Date.now(); t < n.length; t++)(e = n[t])() || n[t] !== e || n.splice(t--, 1); - n.length || w.fx.stop(), nt = void 0 - }, w.fx.timer = function (e) { - w.timers.push(e), w.fx.start() - }, w.fx.interval = 13, w.fx.start = function () { - rt || (rt = !0, at()) - }, w.fx.stop = function () { - rt = null - }, w.fx.speeds = { - slow: 600, - fast: 200, - _default: 400 - }, w.fn.delay = function (t, n) { - return t = w.fx ? w.fx.speeds[t] || t : t, n = n || "fx", this.queue(n, function (n, r) { - var i = e.setTimeout(n, t); - r.stop = function () { - e.clearTimeout(i) - } - }) - }, - function () { - var e = r.createElement("input"), - t = r.createElement("select").appendChild(r.createElement("option")); - e.type = "checkbox", h.checkOn = "" !== e.value, h.optSelected = t.selected, (e = r.createElement("input")).value = "t", e.type = "radio", h.radioValue = "t" === e.value - }(); - var dt, ht = w.expr.attrHandle; - w.fn.extend({ - attr: function (e, t) { - return z(this, w.attr, e, t, arguments.length > 1) - }, - removeAttr: function (e) { - return this.each(function () { - w.removeAttr(this, e) - }) - } - }), w.extend({ - attr: function (e, t, n) { - var r, i, o = e.nodeType; - if (3 !== o && 8 !== o && 2 !== o) return "undefined" == typeof e.getAttribute ? w.prop(e, t, n) : (1 === o && w.isXMLDoc(e) || (i = w.attrHooks[t.toLowerCase()] || (w.expr.match.bool.test(t) ? dt : void 0)), void 0 !== n ? null === n ? void w.removeAttr(e, t) : i && "set" in i && void 0 !== (r = i.set(e, n, t)) ? r : (e.setAttribute(t, n + ""), n) : i && "get" in i && null !== (r = i.get(e, t)) ? r : null == (r = w.find.attr(e, t)) ? void 0 : r) - }, - attrHooks: { - type: { - set: function (e, t) { - if (!h.radioValue && "radio" === t && N(e, "input")) { - var n = e.value; - return e.setAttribute("type", t), n && (e.value = n), t - } - } - } - }, - removeAttr: function (e, t) { - var n, r = 0, - i = t && t.match(M); - if (i && 1 === e.nodeType) - while (n = i[r++]) e.removeAttribute(n) - } - }), dt = { - set: function (e, t, n) { - return !1 === t ? w.removeAttr(e, n) : e.setAttribute(n, n), n - } - }, w.each(w.expr.match.bool.source.match(/\w+/g), function (e, t) { - var n = ht[t] || w.find.attr; - ht[t] = function (e, t, r) { - var i, o, a = t.toLowerCase(); - return r || (o = ht[a], ht[a] = i, i = null != n(e, t, r) ? a : null, ht[a] = o), i - } - }); - var gt = /^(?:input|select|textarea|button)$/i, - yt = /^(?:a|area)$/i; - w.fn.extend({ - prop: function (e, t) { - return z(this, w.prop, e, t, arguments.length > 1) - }, - removeProp: function (e) { - return this.each(function () { - delete this[w.propFix[e] || e] - }) - } - }), w.extend({ - prop: function (e, t, n) { - var r, i, o = e.nodeType; - if (3 !== o && 8 !== o && 2 !== o) return 1 === o && w.isXMLDoc(e) || (t = w.propFix[t] || t, i = w.propHooks[t]), void 0 !== n ? i && "set" in i && void 0 !== (r = i.set(e, n, t)) ? r : e[t] = n : i && "get" in i && null !== (r = i.get(e, t)) ? r : e[t] - }, - propHooks: { - tabIndex: { - get: function (e) { - var t = w.find.attr(e, "tabindex"); - return t ? parseInt(t, 10) : gt.test(e.nodeName) || yt.test(e.nodeName) && e.href ? 0 : -1 - } - } - }, - propFix: { - "for": "htmlFor", - "class": "className" - } - }), h.optSelected || (w.propHooks.selected = { - get: function (e) { - var t = e.parentNode; - return t && t.parentNode && t.parentNode.selectedIndex, null - }, - set: function (e) { - var t = e.parentNode; - t && (t.selectedIndex, t.parentNode && t.parentNode.selectedIndex) - } - }), w.each(["tabIndex", "readOnly", "maxLength", "cellSpacing", "cellPadding", "rowSpan", "colSpan", "useMap", "frameBorder", "contentEditable"], function () { - w.propFix[this.toLowerCase()] = this - }); - - function vt(e) { - return (e.match(M) || []).join(" ") - } - - function mt(e) { - return e.getAttribute && e.getAttribute("class") || "" - } - - function xt(e) { - return Array.isArray(e) ? e : "string" == typeof e ? e.match(M) || [] : [] - } - - w.fn.extend({ - addClass: function (e) { - var t, n, r, i, o, a, s, u = 0; - if (g(e)) return this.each(function (t) { - w(this).addClass(e.call(this, t, mt(this))) - }); - if ((t = xt(e)).length) - while (n = this[u++]) - if (i = mt(n), r = 1 === n.nodeType && " " + vt(i) + " ") { - a = 0; - while (o = t[a++]) r.indexOf(" " + o + " ") < 0 && (r += o + " "); - i !== (s = vt(r)) && n.setAttribute("class", s) - } - return this - }, - removeClass: function (e) { - var t, n, r, i, o, a, s, u = 0; - if (g(e)) return this.each(function (t) { - w(this).removeClass(e.call(this, t, mt(this))) - }); - if (!arguments.length) return this.attr("class", ""); - if ((t = xt(e)).length) - while (n = this[u++]) - if (i = mt(n), r = 1 === n.nodeType && " " + vt(i) + " ") { - a = 0; - while (o = t[a++]) - while (r.indexOf(" " + o + " ") > -1) r = r.replace(" " + o + " ", " "); - i !== (s = vt(r)) && n.setAttribute("class", s) - } - return this - }, - toggleClass: function (e, t) { - var n = typeof e, - r = "string" === n || Array.isArray(e); - return "boolean" == typeof t && r ? t ? this.addClass(e) : this.removeClass(e) : g(e) ? this.each(function (n) { - w(this).toggleClass(e.call(this, n, mt(this), t), t) - }) : this.each(function () { - var t, i, o, a; - if (r) { - i = 0, o = w(this), a = xt(e); - while (t = a[i++]) o.hasClass(t) ? o.removeClass(t) : o.addClass(t) - } else void 0 !== e && "boolean" !== n || ((t = mt(this)) && J.set(this, "__className__", t), this.setAttribute && this.setAttribute("class", t || !1 === e ? "" : J.get(this, "__className__") || "")) - }) - }, - hasClass: function (e) { - var t, n, r = 0; - t = " " + e + " "; - while (n = this[r++]) - if (1 === n.nodeType && (" " + vt(mt(n)) + " ").indexOf(t) > -1) return !0; - return !1 - } - }); - var bt = /\r/g; - w.fn.extend({ - val: function (e) { - var t, n, r, i = this[0]; { - if (arguments.length) return r = g(e), this.each(function (n) { - var i; - 1 === this.nodeType && (null == (i = r ? e.call(this, n, w(this).val()) : e) ? i = "" : "number" == typeof i ? i += "" : Array.isArray(i) && (i = w.map(i, function (e) { - return null == e ? "" : e + "" - })), (t = w.valHooks[this.type] || w.valHooks[this.nodeName.toLowerCase()]) && "set" in t && void 0 !== t.set(this, i, "value") || (this.value = i)) - }); - if (i) return (t = w.valHooks[i.type] || w.valHooks[i.nodeName.toLowerCase()]) && "get" in t && void 0 !== (n = t.get(i, "value")) ? n : "string" == typeof (n = i.value) ? n.replace(bt, "") : null == n ? "" : n - } - } - }), w.extend({ - valHooks: { - option: { - get: function (e) { - var t = w.find.attr(e, "value"); - return null != t ? t : vt(w.text(e)) - } - }, - select: { - get: function (e) { - var t, n, r, i = e.options, - o = e.selectedIndex, - a = "select-one" === e.type, - s = a ? null : [], - u = a ? o + 1 : i.length; - for (r = o < 0 ? u : a ? o : 0; r < u; r++) - if (((n = i[r]).selected || r === o) && !n.disabled && (!n.parentNode.disabled || !N(n.parentNode, "optgroup"))) { - if (t = w(n).val(), a) return t; - s.push(t) - } - return s - }, - set: function (e, t) { - var n, r, i = e.options, - o = w.makeArray(t), - a = i.length; - while (a--)((r = i[a]).selected = w.inArray(w.valHooks.option.get(r), o) > -1) && (n = !0); - return n || (e.selectedIndex = -1), o - } - } - } - }), w.each(["radio", "checkbox"], function () { - w.valHooks[this] = { - set: function (e, t) { - if (Array.isArray(t)) return e.checked = w.inArray(w(e).val(), t) > -1 - } - }, h.checkOn || (w.valHooks[this].get = function (e) { - return null === e.getAttribute("value") ? "on" : e.value - }) - }), h.focusin = "onfocusin" in e; - var wt = /^(?:focusinfocus|focusoutblur)$/, - Tt = function (e) { - e.stopPropagation() - }; - w.extend(w.event, { - trigger: function (t, n, i, o) { - var a, s, u, l, c, p, d, h, v = [i || r], - m = f.call(t, "type") ? t.type : t, - x = f.call(t, "namespace") ? t.namespace.split(".") : []; - if (s = h = u = i = i || r, 3 !== i.nodeType && 8 !== i.nodeType && !wt.test(m + w.event.triggered) && (m.indexOf(".") > -1 && (m = (x = m.split(".")).shift(), x.sort()), c = m.indexOf(":") < 0 && "on" + m, t = t[w.expando] ? t : new w.Event(m, "object" == typeof t && t), t.isTrigger = o ? 2 : 3, t.namespace = x.join("."), t.rnamespace = t.namespace ? new RegExp("(^|\\.)" + x.join("\\.(?:.*\\.|)") + "(\\.|$)") : null, t.result = void 0, t.target || (t.target = i), n = null == n ? [t] : w.makeArray(n, [t]), d = w.event.special[m] || {}, o || !d.trigger || !1 !== d.trigger.apply(i, n))) { - if (!o && !d.noBubble && !y(i)) { - for (l = d.delegateType || m, wt.test(l + m) || (s = s.parentNode); s; s = s.parentNode) v.push(s), u = s; - u === (i.ownerDocument || r) && v.push(u.defaultView || u.parentWindow || e) - } - a = 0; - while ((s = v[a++]) && !t.isPropagationStopped()) h = s, t.type = a > 1 ? l : d.bindType || m, (p = (J.get(s, "events") || {})[t.type] && J.get(s, "handle")) && p.apply(s, n), (p = c && s[c]) && p.apply && Y(s) && (t.result = p.apply(s, n), !1 === t.result && t.preventDefault()); - return t.type = m, o || t.isDefaultPrevented() || d._default && !1 !== d._default.apply(v.pop(), n) || !Y(i) || c && g(i[m]) && !y(i) && ((u = i[c]) && (i[c] = null), w.event.triggered = m, t.isPropagationStopped() && h.addEventListener(m, Tt), i[m](), t.isPropagationStopped() && h.removeEventListener(m, Tt), w.event.triggered = void 0, u && (i[c] = u)), t.result - } - }, - simulate: function (e, t, n) { - var r = w.extend(new w.Event, n, { - type: e, - isSimulated: !0 - }); - w.event.trigger(r, null, t) - } - }), w.fn.extend({ - trigger: function (e, t) { - return this.each(function () { - w.event.trigger(e, t, this) - }) - }, - triggerHandler: function (e, t) { - var n = this[0]; - if (n) return w.event.trigger(e, t, n, !0) - } - }), h.focusin || w.each({ - focus: "focusin", - blur: "focusout" - }, function (e, t) { - var n = function (e) { - w.event.simulate(t, e.target, w.event.fix(e)) - }; - w.event.special[t] = { - setup: function () { - var r = this.ownerDocument || this, - i = J.access(r, t); - i || r.addEventListener(e, n, !0), J.access(r, t, (i || 0) + 1) - }, - teardown: function () { - var r = this.ownerDocument || this, - i = J.access(r, t) - 1; - i ? J.access(r, t, i) : (r.removeEventListener(e, n, !0), J.remove(r, t)) - } - } - }); - var Ct = e.location, - Et = Date.now(), - kt = /\?/; - w.parseXML = function (t) { - var n; - if (!t || "string" != typeof t) return null; - try { - n = (new e.DOMParser).parseFromString(t, "text/xml") - } catch (e) { - n = void 0 - } - return n && !n.getElementsByTagName("parsererror").length || w.error("Invalid XML: " + t), n - }; - var St = /\[\]$/, - Dt = /\r?\n/g, - Nt = /^(?:submit|button|image|reset|file)$/i, - At = /^(?:input|select|textarea|keygen)/i; - - function jt(e, t, n, r) { - var i; - if (Array.isArray(t)) w.each(t, function (t, i) { - n || St.test(e) ? r(e, i) : jt(e + "[" + ("object" == typeof i && null != i ? t : "") + "]", i, n, r) - }); - else if (n || "object" !== x(t)) r(e, t); - else - for (i in t) jt(e + "[" + i + "]", t[i], n, r) - } - - w.param = function (e, t) { - var n, r = [], - i = function (e, t) { - var n = g(t) ? t() : t; - r[r.length] = encodeURIComponent(e) + "=" + encodeURIComponent(null == n ? "" : n) - }; - if (Array.isArray(e) || e.jquery && !w.isPlainObject(e)) w.each(e, function () { - i(this.name, this.value) - }); - else - for (n in e) jt(n, e[n], t, i); - return r.join("&") - }, w.fn.extend({ - serialize: function () { - return w.param(this.serializeArray()) - }, - serializeArray: function () { - return this.map(function () { - var e = w.prop(this, "elements"); - return e ? w.makeArray(e) : this - }).filter(function () { - var e = this.type; - return this.name && !w(this).is(":disabled") && At.test(this.nodeName) && !Nt.test(e) && (this.checked || !pe.test(e)) - }).map(function (e, t) { - var n = w(this).val(); - return null == n ? null : Array.isArray(n) ? w.map(n, function (e) { - return { - name: t.name, - value: e.replace(Dt, "\r\n") - } - }) : { - name: t.name, - value: n.replace(Dt, "\r\n") - } - }).get() - } - }); - var qt = /%20/g, - Lt = /#.*$/, - Ht = /([?&])_=[^&]*/, - Ot = /^(.*?):[ \t]*([^\r\n]*)$/gm, - Pt = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, - Mt = /^(?:GET|HEAD)$/, - Rt = /^\/\//, - It = {}, - Wt = {}, - $t = "*/".concat("*"), - Bt = r.createElement("a"); - Bt.href = Ct.href; - - function Ft(e) { - return function (t, n) { - "string" != typeof t && (n = t, t = "*"); - var r, i = 0, - o = t.toLowerCase().match(M) || []; - if (g(n)) - while (r = o[i++]) "+" === r[0] ? (r = r.slice(1) || "*", (e[r] = e[r] || []).unshift(n)) : (e[r] = e[r] || []).push(n) - } - } - - function _t(e, t, n, r) { - var i = {}, - o = e === Wt; - - function a(s) { - var u; - return i[s] = !0, w.each(e[s] || [], function (e, s) { - var l = s(t, n, r); - return "string" != typeof l || o || i[l] ? o ? !(u = l) : void 0 : (t.dataTypes.unshift(l), a(l), !1) - }), u - } - - return a(t.dataTypes[0]) || !i["*"] && a("*") - } - - function zt(e, t) { - var n, r, i = w.ajaxSettings.flatOptions || {}; - for (n in t) void 0 !== t[n] && ((i[n] ? e : r || (r = {}))[n] = t[n]); - return r && w.extend(!0, e, r), e - } - - function Xt(e, t, n) { - var r, i, o, a, s = e.contents, - u = e.dataTypes; - while ("*" === u[0]) u.shift(), void 0 === r && (r = e.mimeType || t.getResponseHeader("Content-Type")); - if (r) - for (i in s) - if (s[i] && s[i].test(r)) { - u.unshift(i); - break - } - if (u[0] in n) o = u[0]; - else { - for (i in n) { - if (!u[0] || e.converters[i + " " + u[0]]) { - o = i; - break - } - a || (a = i) - } - o = o || a - } - if (o) return o !== u[0] && u.unshift(o), n[o] - } - - function Ut(e, t, n, r) { - var i, o, a, s, u, l = {}, - c = e.dataTypes.slice(); - if (c[1]) - for (a in e.converters) l[a.toLowerCase()] = e.converters[a]; - o = c.shift(); - while (o) - if (e.responseFields[o] && (n[e.responseFields[o]] = t), !u && r && e.dataFilter && (t = e.dataFilter(t, e.dataType)), u = o, o = c.shift()) - if ("*" === o) o = u; - else if ("*" !== u && u !== o) { - if (!(a = l[u + " " + o] || l["* " + o])) - for (i in l) - if ((s = i.split(" "))[1] === o && (a = l[u + " " + s[0]] || l["* " + s[0]])) { - !0 === a ? a = l[i] : !0 !== l[i] && (o = s[0], c.unshift(s[1])); - break - } - if (!0 !== a) - if (a && e["throws"]) t = a(t); - else try { - t = a(t) - } catch (e) { - return { - state: "parsererror", - error: a ? e : "No conversion from " + u + " to " + o - } - } - } - return { - state: "success", - data: t - } - } - - w.extend({ - active: 0, - lastModified: {}, - etag: {}, - ajaxSettings: { - url: Ct.href, - type: "GET", - isLocal: Pt.test(Ct.protocol), - global: !0, - processData: !0, - async: !0, - contentType: "application/x-www-form-urlencoded; charset=UTF-8", - accepts: { - "*": $t, - text: "text/plain", - html: "text/html", - xml: "application/xml, text/xml", - json: "application/json, text/javascript" - }, - contents: { - xml: /\bxml\b/, - html: /\bhtml/, - json: /\bjson\b/ - }, - responseFields: { - xml: "responseXML", - text: "responseText", - json: "responseJSON" - }, - converters: { - "* text": String, - "text html": !0, - "text json": JSON.parse, - "text xml": w.parseXML - }, - flatOptions: { - url: !0, - context: !0 - } - }, - ajaxSetup: function (e, t) { - return t ? zt(zt(e, w.ajaxSettings), t) : zt(w.ajaxSettings, e) - }, - ajaxPrefilter: Ft(It), - ajaxTransport: Ft(Wt), - ajax: function (t, n) { - "object" == typeof t && (n = t, t = void 0), n = n || {}; - var i, o, a, s, u, l, c, f, p, d, h = w.ajaxSetup({}, n), - g = h.context || h, - y = h.context && (g.nodeType || g.jquery) ? w(g) : w.event, - v = w.Deferred(), - m = w.Callbacks("once memory"), - x = h.statusCode || {}, - b = {}, - T = {}, - C = "canceled", - E = { - readyState: 0, - getResponseHeader: function (e) { - var t; - if (c) { - if (!s) { - s = {}; - while (t = Ot.exec(a)) s[t[1].toLowerCase()] = t[2] - } - t = s[e.toLowerCase()] - } - return null == t ? null : t - }, - getAllResponseHeaders: function () { - return c ? a : null - }, - setRequestHeader: function (e, t) { - return null == c && (e = T[e.toLowerCase()] = T[e.toLowerCase()] || e, b[e] = t), this - }, - overrideMimeType: function (e) { - return null == c && (h.mimeType = e), this - }, - statusCode: function (e) { - var t; - if (e) - if (c) E.always(e[E.status]); - else - for (t in e) x[t] = [x[t], e[t]]; - return this - }, - abort: function (e) { - var t = e || C; - return i && i.abort(t), k(0, t), this - } - }; - if (v.promise(E), h.url = ((t || h.url || Ct.href) + "").replace(Rt, Ct.protocol + "//"), h.type = n.method || n.type || h.method || h.type, h.dataTypes = (h.dataType || "*").toLowerCase().match(M) || [""], null == h.crossDomain) { - l = r.createElement("a"); - try { - l.href = h.url, l.href = l.href, h.crossDomain = Bt.protocol + "//" + Bt.host != l.protocol + "//" + l.host - } catch (e) { - h.crossDomain = !0 - } - } - if (h.data && h.processData && "string" != typeof h.data && (h.data = w.param(h.data, h.traditional)), _t(It, h, n, E), c) return E; - (f = w.event && h.global) && 0 == w.active++ && w.event.trigger("ajaxStart"), h.type = h.type.toUpperCase(), h.hasContent = !Mt.test(h.type), o = h.url.replace(Lt, ""), h.hasContent ? h.data && h.processData && 0 === (h.contentType || "").indexOf("application/x-www-form-urlencoded") && (h.data = h.data.replace(qt, "+")) : (d = h.url.slice(o.length), h.data && (h.processData || "string" == typeof h.data) && (o += (kt.test(o) ? "&" : "?") + h.data, delete h.data), !1 === h.cache && (o = o.replace(Ht, "$1"), d = (kt.test(o) ? "&" : "?") + "_=" + Et++ + d), h.url = o + d), h.ifModified && (w.lastModified[o] && E.setRequestHeader("If-Modified-Since", w.lastModified[o]), w.etag[o] && E.setRequestHeader("If-None-Match", w.etag[o])), (h.data && h.hasContent && !1 !== h.contentType || n.contentType) && E.setRequestHeader("Content-Type", h.contentType), E.setRequestHeader("Accept", h.dataTypes[0] && h.accepts[h.dataTypes[0]] ? h.accepts[h.dataTypes[0]] + ("*" !== h.dataTypes[0] ? ", " + $t + "; q=0.01" : "") : h.accepts["*"]); - for (p in h.headers) E.setRequestHeader(p, h.headers[p]); - if (h.beforeSend && (!1 === h.beforeSend.call(g, E, h) || c)) return E.abort(); - if (C = "abort", m.add(h.complete), E.done(h.success), E.fail(h.error), i = _t(Wt, h, n, E)) { - if (E.readyState = 1, f && y.trigger("ajaxSend", [E, h]), c) return E; - h.async && h.timeout > 0 && (u = e.setTimeout(function () { - E.abort("timeout") - }, h.timeout)); - try { - c = !1, i.send(b, k) - } catch (e) { - if (c) throw e; - k(-1, e) - } - } else k(-1, "No Transport"); - - function k(t, n, r, s) { - var l, p, d, b, T, C = n; - c || (c = !0, u && e.clearTimeout(u), i = void 0, a = s || "", E.readyState = t > 0 ? 4 : 0, l = t >= 200 && t < 300 || 304 === t, r && (b = Xt(h, E, r)), b = Ut(h, b, E, l), l ? (h.ifModified && ((T = E.getResponseHeader("Last-Modified")) && (w.lastModified[o] = T), (T = E.getResponseHeader("etag")) && (w.etag[o] = T)), 204 === t || "HEAD" === h.type ? C = "nocontent" : 304 === t ? C = "notmodified" : (C = b.state, p = b.data, l = !(d = b.error))) : (d = C, !t && C || (C = "error", t < 0 && (t = 0))), E.status = t, E.statusText = (n || C) + "", l ? v.resolveWith(g, [p, C, E]) : v.rejectWith(g, [E, C, d]), E.statusCode(x), x = void 0, f && y.trigger(l ? "ajaxSuccess" : "ajaxError", [E, h, l ? p : d]), m.fireWith(g, [E, C]), f && (y.trigger("ajaxComplete", [E, h]), --w.active || w.event.trigger("ajaxStop"))) - } - - return E - }, - getJSON: function (e, t, n) { - return w.get(e, t, n, "json") - }, - getScript: function (e, t) { - return w.get(e, void 0, t, "script") - } - }), w.each(["get", "post"], function (e, t) { - w[t] = function (e, n, r, i) { - return g(n) && (i = i || r, r = n, n = void 0), w.ajax(w.extend({ - url: e, - type: t, - dataType: i, - data: n, - success: r - }, w.isPlainObject(e) && e)) - } - }), w._evalUrl = function (e) { - return w.ajax({ - url: e, - type: "GET", - dataType: "script", - cache: !0, - async: !1, - global: !1, - "throws": !0 - }) - }, w.fn.extend({ - wrapAll: function (e) { - var t; - return this[0] && (g(e) && (e = e.call(this[0])), t = w(e, this[0].ownerDocument).eq(0).clone(!0), this[0].parentNode && t.insertBefore(this[0]), t.map(function () { - var e = this; - while (e.firstElementChild) e = e.firstElementChild; - return e - }).append(this)), this - }, - wrapInner: function (e) { - return g(e) ? this.each(function (t) { - w(this).wrapInner(e.call(this, t)) - }) : this.each(function () { - var t = w(this), - n = t.contents(); - n.length ? n.wrapAll(e) : t.append(e) - }) - }, - wrap: function (e) { - var t = g(e); - return this.each(function (n) { - w(this).wrapAll(t ? e.call(this, n) : e) - }) - }, - unwrap: function (e) { - return this.parent(e).not("body").each(function () { - w(this).replaceWith(this.childNodes) - }), this - } - }), w.expr.pseudos.hidden = function (e) { - return !w.expr.pseudos.visible(e) - }, w.expr.pseudos.visible = function (e) { - return !!(e.offsetWidth || e.offsetHeight || e.getClientRects().length) - }, w.ajaxSettings.xhr = function () { - try { - return new e.XMLHttpRequest - } catch (e) {} - }; - var Vt = { - 0: 200, - 1223: 204 - }, - Gt = w.ajaxSettings.xhr(); - h.cors = !!Gt && "withCredentials" in Gt, h.ajax = Gt = !!Gt, w.ajaxTransport(function (t) { - var n, r; - if (h.cors || Gt && !t.crossDomain) return { - send: function (i, o) { - var a, s = t.xhr(); - if (s.open(t.type, t.url, t.async, t.username, t.password), t.xhrFields) - for (a in t.xhrFields) s[a] = t.xhrFields[a]; - t.mimeType && s.overrideMimeType && s.overrideMimeType(t.mimeType), t.crossDomain || i["X-Requested-With"] || (i["X-Requested-With"] = "XMLHttpRequest"); - for (a in i) s.setRequestHeader(a, i[a]); - n = function (e) { - return function () { - n && (n = r = s.onload = s.onerror = s.onabort = s.ontimeout = s.onreadystatechange = null, "abort" === e ? s.abort() : "error" === e ? "number" != typeof s.status ? o(0, "error") : o(s.status, s.statusText) : o(Vt[s.status] || s.status, s.statusText, "text" !== (s.responseType || "text") || "string" != typeof s.responseText ? { - binary: s.response - } : { - text: s.responseText - }, s.getAllResponseHeaders())) - } - }, s.onload = n(), r = s.onerror = s.ontimeout = n("error"), void 0 !== s.onabort ? s.onabort = r : s.onreadystatechange = function () { - 4 === s.readyState && e.setTimeout(function () { - n && r() - }) - }, n = n("abort"); - try { - s.send(t.hasContent && t.data || null) - } catch (e) { - if (n) throw e - } - }, - abort: function () { - n && n() - } - } - }), w.ajaxPrefilter(function (e) { - e.crossDomain && (e.contents.script = !1) - }), w.ajaxSetup({ - accepts: { - script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript" - }, - contents: { - script: /\b(?:java|ecma)script\b/ - }, - converters: { - "text script": function (e) { - return w.globalEval(e), e - } - } - }), w.ajaxPrefilter("script", function (e) { - void 0 === e.cache && (e.cache = !1), e.crossDomain && (e.type = "GET") - }), w.ajaxTransport("script", function (e) { - if (e.crossDomain) { - var t, n; - return { - send: function (i, o) { - t = w("<script>").prop({ - charset: e.scriptCharset, - src: e.url - }).on("load error", n = function (e) { - t.remove(), n = null, e && o("error" === e.type ? 404 : 200, e.type) - }), r.head.appendChild(t[0]) - }, - abort: function () { - n && n() - } - } - } - }); - var Yt = [], - Qt = /(=)\?(?=&|$)|\?\?/; - w.ajaxSetup({ - jsonp: "callback", - jsonpCallback: function () { - var e = Yt.pop() || w.expando + "_" + Et++; - return this[e] = !0, e - } - }), w.ajaxPrefilter("json jsonp", function (t, n, r) { - var i, o, a, - s = !1 !== t.jsonp && (Qt.test(t.url) ? "url" : "string" == typeof t.data && 0 === (t.contentType || "").indexOf("application/x-www-form-urlencoded") && Qt.test(t.data) && "data"); - if (s || "jsonp" === t.dataTypes[0]) return i = t.jsonpCallback = g(t.jsonpCallback) ? t.jsonpCallback() : t.jsonpCallback, s ? t[s] = t[s].replace(Qt, "$1" + i) : !1 !== t.jsonp && (t.url += (kt.test(t.url) ? "&" : "?") + t.jsonp + "=" + i), t.converters["script json"] = function () { - return a || w.error(i + " was not called"), a[0] - }, t.dataTypes[0] = "json", o = e[i], e[i] = function () { - a = arguments - }, r.always(function () { - void 0 === o ? w(e).removeProp(i) : e[i] = o, t[i] && (t.jsonpCallback = n.jsonpCallback, Yt.push(i)), a && g(o) && o(a[0]), a = o = void 0 - }), "script" - }), h.createHTMLDocument = function () { - var e = r.implementation.createHTMLDocument("").body; - return e.innerHTML = "<form></form><form></form>", 2 === e.childNodes.length - }(), w.parseHTML = function (e, t, n) { - if ("string" != typeof e) return []; - "boolean" == typeof t && (n = t, t = !1); - var i, o, a; - return t || (h.createHTMLDocument ? ((i = (t = r.implementation.createHTMLDocument("")).createElement("base")).href = r.location.href, t.head.appendChild(i)) : t = r), o = A.exec(e), a = !n && [], o ? [t.createElement(o[1])] : (o = xe([e], t, a), a && a.length && w(a).remove(), w.merge([], o.childNodes)) - }, w.fn.load = function (e, t, n) { - var r, i, o, a = this, - s = e.indexOf(" "); - return s > -1 && (r = vt(e.slice(s)), e = e.slice(0, s)), g(t) ? (n = t, t = void 0) : t && "object" == typeof t && (i = "POST"), a.length > 0 && w.ajax({ - url: e, - type: i || "GET", - dataType: "html", - data: t - }).done(function (e) { - o = arguments, a.html(r ? w("<div>").append(w.parseHTML(e)).find(r) : e) - }).always(n && function (e, t) { - a.each(function () { - n.apply(this, o || [e.responseText, t, e]) - }) - }), this - }, w.each(["ajaxStart", "ajaxStop", "ajaxComplete", "ajaxError", "ajaxSuccess", "ajaxSend"], function (e, t) { - w.fn[t] = function (e) { - return this.on(t, e) - } - }), w.expr.pseudos.animated = function (e) { - return w.grep(w.timers, function (t) { - return e === t.elem - }).length - }, w.offset = { - setOffset: function (e, t, n) { - var r, i, o, a, s, u, l, c = w.css(e, "position"), - f = w(e), - p = {}; - "static" === c && (e.style.position = "relative"), s = f.offset(), o = w.css(e, "top"), u = w.css(e, "left"), (l = ("absolute" === c || "fixed" === c) && (o + u).indexOf("auto") > -1) ? (a = (r = f.position()).top, i = r.left) : (a = parseFloat(o) || 0, i = parseFloat(u) || 0), g(t) && (t = t.call(e, n, w.extend({}, s))), null != t.top && (p.top = t.top - s.top + a), null != t.left && (p.left = t.left - s.left + i), "using" in t ? t.using.call(e, p) : f.css(p) - } - }, w.fn.extend({ - offset: function (e) { - if (arguments.length) return void 0 === e ? this : this.each(function (t) { - w.offset.setOffset(this, e, t) - }); - var t, n, r = this[0]; - if (r) return r.getClientRects().length ? (t = r.getBoundingClientRect(), n = r.ownerDocument.defaultView, { - top: t.top + n.pageYOffset, - left: t.left + n.pageXOffset - }) : { - top: 0, - left: 0 - } - }, - position: function () { - if (this[0]) { - var e, t, n, r = this[0], - i = { - top: 0, - left: 0 - }; - if ("fixed" === w.css(r, "position")) t = r.getBoundingClientRect(); - else { - t = this.offset(), n = r.ownerDocument, e = r.offsetParent || n.documentElement; - while (e && (e === n.body || e === n.documentElement) && "static" === w.css(e, "position")) e = e.parentNode; - e && e !== r && 1 === e.nodeType && ((i = w(e).offset()).top += w.css(e, "borderTopWidth", !0), i.left += w.css(e, "borderLeftWidth", !0)) - } - return { - top: t.top - i.top - w.css(r, "marginTop", !0), - left: t.left - i.left - w.css(r, "marginLeft", !0) - } - } - }, - offsetParent: function () { - return this.map(function () { - var e = this.offsetParent; - while (e && "static" === w.css(e, "position")) e = e.offsetParent; - return e || be - }) - } - }), w.each({ - scrollLeft: "pageXOffset", - scrollTop: "pageYOffset" - }, function (e, t) { - var n = "pageYOffset" === t; - w.fn[e] = function (r) { - return z(this, function (e, r, i) { - var o; - if (y(e) ? o = e : 9 === e.nodeType && (o = e.defaultView), void 0 === i) return o ? o[t] : e[r]; - o ? o.scrollTo(n ? o.pageXOffset : i, n ? i : o.pageYOffset) : e[r] = i - }, e, r, arguments.length) - } - }), w.each(["top", "left"], function (e, t) { - w.cssHooks[t] = _e(h.pixelPosition, function (e, n) { - if (n) return n = Fe(e, t), We.test(n) ? w(e).position()[t] + "px" : n - }) - }), w.each({ - Height: "height", - Width: "width" - }, function (e, t) { - w.each({ - padding: "inner" + e, - content: t, - "": "outer" + e - }, function (n, r) { - w.fn[r] = function (i, o) { - var a = arguments.length && (n || "boolean" != typeof i), - s = n || (!0 === i || !0 === o ? "margin" : "border"); - return z(this, function (t, n, i) { - var o; - return y(t) ? 0 === r.indexOf("outer") ? t["inner" + e] : t.document.documentElement["client" + e] : 9 === t.nodeType ? (o = t.documentElement, Math.max(t.body["scroll" + e], o["scroll" + e], t.body["offset" + e], o["offset" + e], o["client" + e])) : void 0 === i ? w.css(t, n, s) : w.style(t, n, i, s) - }, t, a ? i : void 0, a) - } - }) - }), w.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "), function (e, t) { - w.fn[t] = function (e, n) { - return arguments.length > 0 ? this.on(t, null, e, n) : this.trigger(t) - } - }), w.fn.extend({ - hover: function (e, t) { - return this.mouseenter(e).mouseleave(t || e) - } - }), w.fn.extend({ - bind: function (e, t, n) { - return this.on(e, null, t, n) - }, - unbind: function (e, t) { - return this.off(e, null, t) - }, - delegate: function (e, t, n, r) { - return this.on(t, e, n, r) - }, - undelegate: function (e, t, n) { - return 1 === arguments.length ? this.off(e, "**") : this.off(t, e || "**", n) - } - }), w.proxy = function (e, t) { - var n, r, i; - if ("string" == typeof t && (n = e[t], t = e, e = n), g(e)) return r = o.call(arguments, 2), i = function () { - return e.apply(t || this, r.concat(o.call(arguments))) - }, i.guid = e.guid = e.guid || w.guid++, i - }, w.holdReady = function (e) { - e ? w.readyWait++ : w.ready(!0) - }, w.isArray = Array.isArray, w.parseJSON = JSON.parse, w.nodeName = N, w.isFunction = g, w.isWindow = y, w.camelCase = G, w.type = x, w.now = Date.now, w.isNumeric = function (e) { - var t = w.type(e); - return ("number" === t || "string" === t) && !isNaN(e - parseFloat(e)) - }, "function" == typeof define && define.amd && define("jquery", [], function () { - return w - }); - var Jt = e.jQuery, - Kt = e.$; - return w.noConflict = function (t) { - return e.$ === w && (e.$ = Kt), t && e.jQuery === w && (e.jQuery = Jt), w - }, t || (e.jQuery = e.$ = w), w -}); - -/*! -Waypoints - 4.0.0 -Copyright © 2011-2015 Caleb Troughton -Licensed under the MIT license. -https://github.com/imakewebthings/waypoints/blob/master/licenses.txt -*/ -(function () { - 'use strict' - - var keyCounter = 0 - var allWaypoints = {} - - /* http://imakewebthings.com/waypoints/api/waypoint */ - function Waypoint(options) { - if (!options) { - throw new Error('No options passed to Waypoint constructor') - } - if (!options.element) { - throw new Error('No element option passed to Waypoint constructor') - } - if (!options.handler) { - throw new Error('No handler option passed to Waypoint constructor') - } - - this.key = 'waypoint-' + keyCounter - this.options = Waypoint.Adapter.extend({}, Waypoint.defaults, options) - this.element = this.options.element - this.adapter = new Waypoint.Adapter(this.element) - this.callback = options.handler - this.axis = this.options.horizontal ? 'horizontal' : 'vertical' - this.enabled = this.options.enabled - this.triggerPoint = null - this.group = Waypoint.Group.findOrCreate({ - name: this.options.group, - axis: this.axis - }) - this.context = Waypoint.Context.findOrCreateByElement(this.options.context) - - if (Waypoint.offsetAliases[this.options.offset]) { - this.options.offset = Waypoint.offsetAliases[this.options.offset] - } - this.group.add(this) - this.context.add(this) - allWaypoints[this.key] = this - keyCounter += 1 - } - - /* Private */ - Waypoint.prototype.queueTrigger = function (direction) { - this.group.queueTrigger(this, direction) - } - - /* Private */ - Waypoint.prototype.trigger = function (args) { - if (!this.enabled) { - return - } - if (this.callback) { - this.callback.apply(this, args) - } - } - - /* Public */ - /* http://imakewebthings.com/waypoints/api/destroy */ - Waypoint.prototype.destroy = function () { - this.context.remove(this) - this.group.remove(this) - delete allWaypoints[this.key] - } - - /* Public */ - /* http://imakewebthings.com/waypoints/api/disable */ - Waypoint.prototype.disable = function () { - this.enabled = false - return this - } - - /* Public */ - /* http://imakewebthings.com/waypoints/api/enable */ - Waypoint.prototype.enable = function () { - this.context.refresh() - this.enabled = true - return this - } - - /* Public */ - /* http://imakewebthings.com/waypoints/api/next */ - Waypoint.prototype.next = function () { - return this.group.next(this) - } - - /* Public */ - /* http://imakewebthings.com/waypoints/api/previous */ - Waypoint.prototype.previous = function () { - return this.group.previous(this) - } - - /* Private */ - Waypoint.invokeAll = function (method) { - var allWaypointsArray = [] - for (var waypointKey in allWaypoints) { - allWaypointsArray.push(allWaypoints[waypointKey]) - } - for (var i = 0, end = allWaypointsArray.length; i < end; i++) { - allWaypointsArray[i][method]() - } - } - - /* Public */ - /* http://imakewebthings.com/waypoints/api/destroy-all */ - Waypoint.destroyAll = function () { - Waypoint.invokeAll('destroy') - } - - /* Public */ - /* http://imakewebthings.com/waypoints/api/disable-all */ - Waypoint.disableAll = function () { - Waypoint.invokeAll('disable') - } - - /* Public */ - /* http://imakewebthings.com/waypoints/api/enable-all */ - Waypoint.enableAll = function () { - Waypoint.invokeAll('enable') - } - - /* Public */ - /* http://imakewebthings.com/waypoints/api/refresh-all */ - Waypoint.refreshAll = function () { - Waypoint.Context.refreshAll() - } - - /* Public */ - /* http://imakewebthings.com/waypoints/api/viewport-height */ - Waypoint.viewportHeight = function () { - return window.innerHeight || document.documentElement.clientHeight - } - - /* Public */ - /* http://imakewebthings.com/waypoints/api/viewport-width */ - Waypoint.viewportWidth = function () { - return document.documentElement.clientWidth - } - - Waypoint.adapters = [] - - Waypoint.defaults = { - context: window, - continuous: true, - enabled: true, - group: 'default', - horizontal: false, - offset: 0 - } - - Waypoint.offsetAliases = { - 'bottom-in-view': function () { - return this.context.innerHeight() - this.adapter.outerHeight() - }, - 'right-in-view': function () { - return this.context.innerWidth() - this.adapter.outerWidth() - } - } - - window.Waypoint = Waypoint -}()); -(function () { - 'use strict' - - function requestAnimationFrameShim(callback) { - window.setTimeout(callback, 1000 / 60) - } - - var keyCounter = 0 - var contexts = {} - var Waypoint = window.Waypoint - var oldWindowLoad = window.onload - - /* http://imakewebthings.com/waypoints/api/context */ - function Context(element) { - this.element = element - this.Adapter = Waypoint.Adapter - this.adapter = new this.Adapter(element) - this.key = 'waypoint-context-' + keyCounter - this.didScroll = false - this.didResize = false - this.oldScroll = { - x: this.adapter.scrollLeft(), - y: this.adapter.scrollTop() - } - this.waypoints = { - vertical: {}, - horizontal: {} - } - - element.waypointContextKey = this.key - contexts[element.waypointContextKey] = this - keyCounter += 1 - - this.createThrottledScrollHandler() - this.createThrottledResizeHandler() - } - - /* Private */ - Context.prototype.add = function (waypoint) { - var axis = waypoint.options.horizontal ? 'horizontal' : 'vertical' - this.waypoints[axis][waypoint.key] = waypoint - this.refresh() - } - - /* Private */ - Context.prototype.checkEmpty = function () { - var horizontalEmpty = this.Adapter.isEmptyObject(this.waypoints.horizontal) - var verticalEmpty = this.Adapter.isEmptyObject(this.waypoints.vertical) - if (horizontalEmpty && verticalEmpty) { - this.adapter.off('.waypoints') - delete contexts[this.key] - } - } - - /* Private */ - Context.prototype.createThrottledResizeHandler = function () { - var self = this - - function resizeHandler() { - self.handleResize() - self.didResize = false - } - - this.adapter.on('resize.waypoints', function () { - if (!self.didResize) { - self.didResize = true - Waypoint.requestAnimationFrame(resizeHandler) - } - }) - } - - /* Private */ - Context.prototype.createThrottledScrollHandler = function () { - var self = this - - function scrollHandler() { - self.handleScroll() - self.didScroll = false - } - - this.adapter.on('scroll.waypoints', function () { - if (!self.didScroll || Waypoint.isTouch) { - self.didScroll = true - Waypoint.requestAnimationFrame(scrollHandler) - } - }) - } - - /* Private */ - Context.prototype.handleResize = function () { - Waypoint.Context.refreshAll() - } - - /* Private */ - Context.prototype.handleScroll = function () { - var triggeredGroups = {} - var axes = { - horizontal: { - newScroll: this.adapter.scrollLeft(), - oldScroll: this.oldScroll.x, - forward: 'right', - backward: 'left' - }, - vertical: { - newScroll: this.adapter.scrollTop(), - oldScroll: this.oldScroll.y, - forward: 'down', - backward: 'up' - } - } - - for (var axisKey in axes) { - var axis = axes[axisKey] - var isForward = axis.newScroll > axis.oldScroll - var direction = isForward ? axis.forward : axis.backward - - for (var waypointKey in this.waypoints[axisKey]) { - var waypoint = this.waypoints[axisKey][waypointKey] - var wasBeforeTriggerPoint = axis.oldScroll < waypoint.triggerPoint - var nowAfterTriggerPoint = axis.newScroll >= waypoint.triggerPoint - var crossedForward = wasBeforeTriggerPoint && nowAfterTriggerPoint - var crossedBackward = !wasBeforeTriggerPoint && !nowAfterTriggerPoint - if (crossedForward || crossedBackward) { - waypoint.queueTrigger(direction) - triggeredGroups[waypoint.group.id] = waypoint.group - } - } - } - - for (var groupKey in triggeredGroups) { - triggeredGroups[groupKey].flushTriggers() - } - - this.oldScroll = { - x: axes.horizontal.newScroll, - y: axes.vertical.newScroll - } - } - - /* Private */ - Context.prototype.innerHeight = function () { - /*eslint-disable eqeqeq */ - if (this.element == this.element.window) { - return Waypoint.viewportHeight() - } - /*eslint-enable eqeqeq */ - return this.adapter.innerHeight() - } - - /* Private */ - Context.prototype.remove = function (waypoint) { - delete this.waypoints[waypoint.axis][waypoint.key] - this.checkEmpty() - } - - /* Private */ - Context.prototype.innerWidth = function () { - /*eslint-disable eqeqeq */ - if (this.element == this.element.window) { - return Waypoint.viewportWidth() - } - /*eslint-enable eqeqeq */ - return this.adapter.innerWidth() - } - - /* Public */ - /* http://imakewebthings.com/waypoints/api/context-destroy */ - Context.prototype.destroy = function () { - var allWaypoints = [] - for (var axis in this.waypoints) { - for (var waypointKey in this.waypoints[axis]) { - allWaypoints.push(this.waypoints[axis][waypointKey]) - } - } - for (var i = 0, end = allWaypoints.length; i < end; i++) { - allWaypoints[i].destroy() - } - } - - /* Public */ - /* http://imakewebthings.com/waypoints/api/context-refresh */ - Context.prototype.refresh = function () { - /*eslint-disable eqeqeq */ - var isWindow = this.element == this.element.window - /*eslint-enable eqeqeq */ - var contextOffset = isWindow ? undefined : this.adapter.offset() - var triggeredGroups = {} - var axes - - this.handleScroll() - axes = { - horizontal: { - contextOffset: isWindow ? 0 : contextOffset.left, - contextScroll: isWindow ? 0 : this.oldScroll.x, - contextDimension: this.innerWidth(), - oldScroll: this.oldScroll.x, - forward: 'right', - backward: 'left', - offsetProp: 'left' - }, - vertical: { - contextOffset: isWindow ? 0 : contextOffset.top, - contextScroll: isWindow ? 0 : this.oldScroll.y, - contextDimension: this.innerHeight(), - oldScroll: this.oldScroll.y, - forward: 'down', - backward: 'up', - offsetProp: 'top' - } - } - - for (var axisKey in axes) { - var axis = axes[axisKey] - for (var waypointKey in this.waypoints[axisKey]) { - var waypoint = this.waypoints[axisKey][waypointKey] - var adjustment = waypoint.options.offset - var oldTriggerPoint = waypoint.triggerPoint - var elementOffset = 0 - var freshWaypoint = oldTriggerPoint == null - var contextModifier, wasBeforeScroll, nowAfterScroll - var triggeredBackward, triggeredForward - - if (waypoint.element !== waypoint.element.window) { - elementOffset = waypoint.adapter.offset()[axis.offsetProp] - } - - if (typeof adjustment === 'function') { - adjustment = adjustment.apply(waypoint) - } else if (typeof adjustment === 'string') { - adjustment = parseFloat(adjustment) - if (waypoint.options.offset.indexOf('%') > -1) { - adjustment = Math.ceil(axis.contextDimension * adjustment / 100) - } - } - - contextModifier = axis.contextScroll - axis.contextOffset - waypoint.triggerPoint = elementOffset + contextModifier - adjustment - wasBeforeScroll = oldTriggerPoint < axis.oldScroll - nowAfterScroll = waypoint.triggerPoint >= axis.oldScroll - triggeredBackward = wasBeforeScroll && nowAfterScroll - triggeredForward = !wasBeforeScroll && !nowAfterScroll - - if (!freshWaypoint && triggeredBackward) { - waypoint.queueTrigger(axis.backward) - triggeredGroups[waypoint.group.id] = waypoint.group - } else if (!freshWaypoint && triggeredForward) { - waypoint.queueTrigger(axis.forward) - triggeredGroups[waypoint.group.id] = waypoint.group - } else if (freshWaypoint && axis.oldScroll >= waypoint.triggerPoint) { - waypoint.queueTrigger(axis.forward) - triggeredGroups[waypoint.group.id] = waypoint.group - } - } - } - - Waypoint.requestAnimationFrame(function () { - for (var groupKey in triggeredGroups) { - triggeredGroups[groupKey].flushTriggers() - } - }) - - return this - } - - /* Private */ - Context.findOrCreateByElement = function (element) { - return Context.findByElement(element) || new Context(element) - } - - /* Private */ - Context.refreshAll = function () { - for (var contextId in contexts) { - contexts[contextId].refresh() - } - } - - /* Public */ - /* http://imakewebthings.com/waypoints/api/context-find-by-element */ - Context.findByElement = function (element) { - return contexts[element.waypointContextKey] - } - - window.onload = function () { - if (oldWindowLoad) { - oldWindowLoad() - } - Context.refreshAll() - } - - Waypoint.requestAnimationFrame = function (callback) { - var requestFn = window.requestAnimationFrame || - window.mozRequestAnimationFrame || - window.webkitRequestAnimationFrame || - requestAnimationFrameShim - requestFn.call(window, callback) - } - Waypoint.Context = Context -}()); -(function () { - 'use strict' - - function byTriggerPoint(a, b) { - return a.triggerPoint - b.triggerPoint - } - - function byReverseTriggerPoint(a, b) { - return b.triggerPoint - a.triggerPoint - } - - var groups = { - vertical: {}, - horizontal: {} - } - var Waypoint = window.Waypoint - - /* http://imakewebthings.com/waypoints/api/group */ - function Group(options) { - this.name = options.name - this.axis = options.axis - this.id = this.name + '-' + this.axis - this.waypoints = [] - this.clearTriggerQueues() - groups[this.axis][this.name] = this - } - - /* Private */ - Group.prototype.add = function (waypoint) { - this.waypoints.push(waypoint) - } - - /* Private */ - Group.prototype.clearTriggerQueues = function () { - this.triggerQueues = { - up: [], - down: [], - left: [], - right: [] - } - } - - /* Private */ - Group.prototype.flushTriggers = function () { - for (var direction in this.triggerQueues) { - var waypoints = this.triggerQueues[direction] - var reverse = direction === 'up' || direction === 'left' - waypoints.sort(reverse ? byReverseTriggerPoint : byTriggerPoint) - for (var i = 0, end = waypoints.length; i < end; i += 1) { - var waypoint = waypoints[i] - if (waypoint.options.continuous || i === waypoints.length - 1) { - waypoint.trigger([direction]) - } - } - } - this.clearTriggerQueues() - } - - /* Private */ - Group.prototype.next = function (waypoint) { - this.waypoints.sort(byTriggerPoint) - var index = Waypoint.Adapter.inArray(waypoint, this.waypoints) - var isLast = index === this.waypoints.length - 1 - return isLast ? null : this.waypoints[index + 1] - } - - /* Private */ - Group.prototype.previous = function (waypoint) { - this.waypoints.sort(byTriggerPoint) - var index = Waypoint.Adapter.inArray(waypoint, this.waypoints) - return index ? this.waypoints[index - 1] : null - } - - /* Private */ - Group.prototype.queueTrigger = function (waypoint, direction) { - this.triggerQueues[direction].push(waypoint) - } - - /* Private */ - Group.prototype.remove = function (waypoint) { - var index = Waypoint.Adapter.inArray(waypoint, this.waypoints) - if (index > -1) { - this.waypoints.splice(index, 1) - } - } - - /* Public */ - /* http://imakewebthings.com/waypoints/api/first */ - Group.prototype.first = function () { - return this.waypoints[0] - } - - /* Public */ - /* http://imakewebthings.com/waypoints/api/last */ - Group.prototype.last = function () { - return this.waypoints[this.waypoints.length - 1] - } - - /* Private */ - Group.findOrCreate = function (options) { - return groups[options.axis][options.name] || new Group(options) - } - - Waypoint.Group = Group -}()); -(function () { - 'use strict' - - var $ = window.jQuery - var Waypoint = window.Waypoint - - function JQueryAdapter(element) { - this.$element = $(element) - } - - $.each([ - 'innerHeight', - 'innerWidth', - 'off', - 'offset', - 'on', - 'outerHeight', - 'outerWidth', - 'scrollLeft', - 'scrollTop' - ], function (i, method) { - JQueryAdapter.prototype[method] = function () { - var args = Array.prototype.slice.call(arguments) - return this.$element[method].apply(this.$element, args) - } - }) - - $.each([ - 'extend', - 'inArray', - 'isEmptyObject' - ], function (i, method) { - JQueryAdapter[method] = $[method] - }) - - Waypoint.adapters.push({ - name: 'jquery', - Adapter: JQueryAdapter - }) - Waypoint.Adapter = JQueryAdapter -}()); -(function () { - 'use strict' - - var Waypoint = window.Waypoint - - function createExtension(framework) { - return function () { - var waypoints = [] - var overrides = arguments[0] - - if (framework.isFunction(arguments[0])) { - overrides = framework.extend({}, arguments[1]) - overrides.handler = arguments[0] - } - - this.each(function () { - var options = framework.extend({}, overrides, { - element: this - }) - if (typeof options.context === 'string') { - options.context = framework(this).closest(options.context)[0] - } - waypoints.push(new Waypoint(options)) - }) - - return waypoints - } - } - - if (window.jQuery) { - window.jQuery.fn.waypoint = createExtension(window.jQuery) - } - if (window.Zepto) { - window.Zepto.fn.waypoint = createExtension(window.Zepto) - } -}());
\ No newline at end of file diff --git a/assets/js/main.js b/assets/js/main.js index 42ff881..76b9544 100755 --- a/assets/js/main.js +++ b/assets/js/main.js @@ -1,414 +1,217 @@ /** - * Clientside Script of the Netflix Stats Generator + * Client-side Script of the Netflix Stats Generator * @author Marvin Borner - * @copyright Marvin Borner 2018 + * @copyright Marvin Borner 2019 */ -$(() => { - const DebuggingMode = true; - const CookieInput = $(".CookieInput"); - let NetflixJson; - - moment.locale("de"); - moment().utcOffset(0); // offset for unix timestamp - - if (!DebuggingMode) { - CookieInput.keyup(e => { - if (e.keyCode === 13) { - $.ajax({ - url: "assets/php/getNetflixJson.php", - data: { - Cookie: CookieInput.val() - }, - type: "POST" - }).done(response => { - CookieInput.val(""); - CookieInput.hide(); - $(".Main").fadeIn(); - AnalyzeData(response); - }); - } - }); - } else { - CookieInput.hide(); - $.ajax({ - url: "assets/js/ExampleData.js", - type: "POST" - }).done(response => { - $(".Main").fadeIn(); - AnalyzeData(response); - }); - } - - /** - * Analyzes the Netflix data JSON response - * @param {JSON} JsonResponse - */ - function AnalyzeData(JsonResponse) { - /** - * @example response of a series: - * bookmark: 0 - * country: "DE" - * date: 1529338765489 - * dateStr: "18.06.18" - * deviceType: 1481 - * duration: 3302 - * episodeTitle: "Folge 13" - * estRating: "50" - * index: 0 - * movieID: 80205354 - * seasonDescriptor: "Teil 1" - * series: 80192098 - * seriesTitle: "Haus des Geldes" - * title: "Teil 1: \"Folge 13\"" - * topNodeId: "80192098" - * videoTitle: "Folge 13" - * - * @example response of a movie: - * bookmark: 7771 - * country: "DE" - * date: 1476477258019 - * dateStr: "14.10.16" - * deviceType: 1193 - * duration: 8160 - * estRating: "30" - * index: 916 - * movieID: 20557937 - * title: "Matrix" - * topNodeId: "20557937" - * videoTitle: "Matrix" - */ - NetflixJson = JSON.parse(JsonResponse); - console.log(NetflixJson); - let EveryWatched = []; - let TitleWatchTime = {}; //how long you watched a series/movies - let HeatmapDatesAll = []; - let HeatmapDates = []; - let IndividualTitles = []; - let IndividualSeries = []; - let IndividualMovies = []; - let AverageWatchTimes = []; // when you watched a series/movie - - NetflixJson.forEach((item, pageKey) => { - item.forEach((eachItem, ItemNumber) => { - const currentObject = NetflixJson[pageKey][ItemNumber]; - let currentTitle; // will be overriden by 'if series' - - if ("seriesTitle" in eachItem) { - // is series - currentTitle = currentObject.seriesTitle; - EveryWatched.push(currentTitle); - if ( - IndividualSeries.indexOf(currentTitle) === -1 && - currentTitle !== undefined - ) { - // only if not already crawled -> individualism - IndividualSeries.push(currentTitle); - } - } else { - // is movie - currentTitle = currentObject.videoTitle; - EveryWatched.push(currentTitle); - if ( - IndividualMovies.indexOf(currentTitle) === -1 && - currentTitle !== undefined - ) { - // only if not already crawled -> individualism - IndividualMovies.push(currentTitle); - } - } - - // individualism check for every title - if ( - IndividualMovies.indexOf(currentTitle) === -1 && - currentTitle !== undefined - ) { - if (!(IndividualTitles.includes(currentTitle))) IndividualTitles.push(currentTitle); - - // get watch-time in hours (how long you watched a series/movies) - const watchTimeInHours = currentObject.duration / 60 / 60; - let watchTime; - if (currentTitle in TitleWatchTime) { - // already in object -> add to previous - const previousTitleWatchTime = TitleWatchTime[currentTitle]; - watchTime = watchTimeInHours + previousTitleWatchTime; - } else { - watchTime = watchTimeInHours; - } - TitleWatchTime[currentTitle] = watchTime; - } - - // get watch time as date (when you watched a series/movie) - const DayTimeInHours = Number(moment.unix(currentObject.date).format('HH')); - AverageWatchTimes.push(DayTimeInHours); - - // get dates and push to heatmap date array for later duplicate deletion - HeatmapDatesAll.push(currentObject.dateStr); - // HeatmapDates.push({ - // date: moment(currentObject.dateStr, 'DD.MM.YY').toDate(), - // count: 1 - // }); - }); - }); - - // calculate count of dates for heatmap chart - const HeatmapDatesOccurrenceCounter = new Map( - [...new Set(HeatmapDatesAll)].map(x => [ - x, - HeatmapDatesAll.filter(y => y === x).length // get length (=> occurrence) of filtered array - ]) - ); - - uniqueHeatmapDates = HeatmapDatesAll.filter(function (item, pos) { - return HeatmapDatesAll.indexOf(item) == pos; - }); - - uniqueHeatmapDates.forEach((index, val) => { - HeatmapDates.push({ - date: moment(uniqueHeatmapDates[val], 'DD.MM.YY').toDate(), - count: HeatmapDatesOccurrenceCounter.get(uniqueHeatmapDates[val]) - }); - }); - - - const TotalSeriesWatched = IndividualSeries.length; - - // Calculate watch time occurrence (times in which the user watched sth.) - let AverageWatchTimeOccurrence = []; - const WatchTimeOccurrenceCounter = new Map( - [...new Set(AverageWatchTimes)].map(x => [ - x, - AverageWatchTimes.filter(y => y === x).length // get length (=> occurrence) of filtered array - ]) - ); - for (let i = 0; i < 24; i++) { - AverageWatchTimeOccurrence.push(WatchTimeOccurrenceCounter.get(i)); - } - - // Calculate the most watched series/movies - const UnsortedTitleOccurrenceCounter = EveryWatched.reduce( - (prev, curr) => ((prev[curr] = ++prev[curr] || 1), prev), {} - ); - const SortedTitleOccurrenceCounter = sortObject( - UnsortedTitleOccurrenceCounter - ); - const TopSeries = Object.keys(SortedTitleOccurrenceCounter)[ - Object.keys(SortedTitleOccurrenceCounter).length - 1 - ]; - - // log - console.table(IndividualTitles); - console.table(IndividualSeries); - console.table(IndividualMovies); - console.table(AverageWatchTimeOccurrence); - console.table(SortedTitleOccurrenceCounter); - console.table(TitleWatchTime); - - // render - RenderTopSeries(TopSeries); - RenderDayTimeChart(AverageWatchTimeOccurrence); - RenderMostWatchedChart(SortedTitleOccurrenceCounter, TitleWatchTime); - RenderHeatmap(HeatmapDates); - } - - /** - * Renders the day time chart - * @param {Array} AverageWatchTimeOccurrenceArray - */ - function RenderDayTimeChart(AverageWatchTimeOccurrenceArray) { - var randomColorGenerator = () => { - return "#" + (Math.random().toString(16) + "0000000").slice(2, 8); +const cookie = document.querySelector("#cookie"); +const cookieWrap = document.querySelector("#cookie_wrap"); +const loading = document.querySelector("#loading"); +const stats = document.querySelector("#stats"); +const heatMap = document.querySelector("#heatMap"); + +cookie.addEventListener("keyup", e => { + if (e.key === "Enter") { + const request = new XMLHttpRequest(); + request.onreadystatechange = () => { + if (request.readyState === 4 && request.status === 200) { + analyze(request.responseText); + loading.style.display = "none"; + stats.style.display = "block"; + } else if (request.readyState === 4 && request.status !== 200) + alert("Cookie is not valid!") }; - - // Render day time chart - const WatchTimeChartElement = document - .getElementById("WatchTimeChart") - .getContext("2d"); - new Chart(WatchTimeChartElement, { - type: "line", - data: { - labels: [ - "12am", - "1am", - "2am", - "3am", - "4am", - "5am", - "6am", - "7am", - "8am", - "9am", - "10am", - "11am", - "12pm", - "1pm", - "2pm", - "3pm", - "4pm", - "5pm", - "6pm", - "7pm", - "8pm", - "9pm", - "10pm", - "11pm" - ], - datasets: [{ - label: "Watches at daytime", - borderColor: "rgb(255, 99, 132)", - cubicInterpolationMode: "monotone", - pointRadius: 0, - pointHitRadius: 15, - data: AverageWatchTimeOccurrenceArray - }] - }, - options: { - scales: { - yAxes: [{ - ticks: { - display: false - }, - gridLines: { - zeroLineColor: "transparent", - zeroLineWidth: 2, - drawTicks: false, - drawBorder: false, - color: "transparent" - } - }], - xAxes: [{ - gridLines: { - zeroLineColor: "rgba(255, 255, 255, 0.25)", - display: true, - drawBorder: false, - color: "rgba(255, 255, 255, 0.25)" - } - }] - }, - tension: 1 - } - }); + request.open("POST", "assets/php/getData.php", true); + request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded"); + request.send("cookie=" + cookie.value); + loading.style.display = "block"; + cookieWrap.style.display = "none"; } - - /** - * Renders the "most watched series" doughnut chart - * @param {Object} TitleOccurrenceCounterObject - * @param {Object} TitleWatchTimeObject - */ - function RenderMostWatchedChart(TitleOccurrenceCounterObject, TitleWatchTimeObject) { - // Render and calculate most watched chart - const GenerateRandomColorArray = () => { - let RandomColorArray = []; - const Generate = () => { - var letters = "0123456789ABCDEF".split(""); - var color = "#"; - for (var i = 0; i < 6; i++) { - color += letters[Math.floor(Math.random() * 16)]; - } - return color; +}); + +function analyze(data) { + data = JSON.parse(data).flat(1); + let totalWatchedSeconds = 0; + const hourObject = Array(24).fill(0); + const watchCountObject = {}; + + data.forEach(element => { + let title; + const seriesTitle = element.seriesTitle; + const movieTitle = element.title; + const watchDate = element.date; + const duration = element.duration; + + // Generate watch time array (eg. 12am) + hourObject[(new Date(watchDate)).getHours()]++; + + if (seriesTitle !== undefined) title = seriesTitle; + else title = movieTitle; + + if (watchCountObject[title] !== undefined) { + watchCountObject[title].date.push(new Date(watchDate)); + watchCountObject[title].watchTimeInSeconds += duration; + watchCountObject[title].watchTime = secondsToHours(watchCountObject[title].watchTimeInSeconds); + watchCountObject[title].count++; + totalWatchedSeconds += duration + } else { + watchCountObject[title] = { + date: [new Date(watchDate)], + watchTime: secondsToHours(duration), + watchTimeInSeconds: duration, + count: 1 }; - for (var key in TitleOccurrenceCounterObject) { - RandomColorArray.push(Generate()); - } - return RandomColorArray; - }; - - const MostWatchedChartElement = document - .getElementById("MostWatchedChart") - .getContext("2d"); - var MostWatchedChartData = { - labels: [], + totalWatchedSeconds += duration; + } + }); + + renderTotalSpent(totalWatchedSeconds); + renderHourChart(hourObject); + renderTopChart(watchCountObject); + renderHeatMap(watchCountObject); + console.log(watchCountObject); +} + +function renderTotalSpent(total) { + document.querySelector("#totalSpent").innerHTML = ` + Days: ${Math.floor(total / 60 / 60 / 24)}, + Hours: ${Math.floor(total / 60 / 60)}, + Minutes: ${Math.round(total / 60)}, + Seconds: ${total}` +} + +function renderHourChart(hourObject) { + const element = document + .getElementById("hourChart") + .getContext("2d"); + + new Chart(element, { + type: "line", + data: { + labels: [ + "12am", + "1am", + "2am", + "3am", + "4am", + "5am", + "6am", + "7am", + "8am", + "9am", + "10am", + "11am", + "12pm", + "1pm", + "2pm", + "3pm", + "4pm", + "5pm", + "6pm", + "7pm", + "8pm", + "9pm", + "10pm", + "11pm" + ], datasets: [{ - label: "Most watched", - backgroundColor: GenerateRandomColorArray(), - data: [] + label: "Average watch times", + borderColor: "rgb(255, 99, 132)", + cubicInterpolationMode: "monotone", + pointRadius: 0, + pointHitRadius: 15, + data: hourObject }] - }; - Chart.pluginService.register({ - beforeInit: chart => { - var data = chart.config.data; - for (var key in TitleOccurrenceCounterObject) { - if (TitleOccurrenceCounterObject.hasOwnProperty(key)) { - if (TitleOccurrenceCounterObject[key] > 1) { - data.labels.push(`${key} (Time: ${Math.round(TitleWatchTimeObject[key] * 100) / 100} hours)`); // add label with rounded watch time - data.datasets[0].data.push(TitleOccurrenceCounterObject[key]); - } + }, + options: { + scales: { + yAxes: [{ + ticks: { + display: false } - } + }] + }, + legend: { + display: false } - }); - new Chart(MostWatchedChartElement, { - type: "doughnut", - data: MostWatchedChartData, - options: { - animation: { - animateScale: true, - animateRotate: true - }, - legend: { - display: false - } + } + }); +} + +function renderTopChart(object) { + const sorted = Object.keys(object).sort((a, b) => { + return object[b].watchTimeInSeconds - object[a].watchTimeInSeconds + }); + const data = sorted.map(element => object[element].watchTimeInSeconds); + const labels = sorted.map(element => { + return element + " (" + Math.floor(object[element].watchTimeInSeconds / 60 / 60) + " hours)" + }); + const colorArray = Array.from({length: data.length}, () => + "#" + ((1 << 24) * Math.random() | 0).toString(16)); + + const element = document + .getElementById("topChart") + .getContext("2d"); + + new Chart(element, { + type: 'doughnut', + data: { + datasets: [{ + data: data, + backgroundColor: colorArray + }], + labels: labels, + }, + options: { + animation: { + animateScale: true, + animateRotate: true + }, + legend: { + display: false } - }); + } + }); +} + +function renderHeatMap(object) { + const allDates = Object.keys(object).map(element => object[element].date).flat(10) + .map(element => element.setHours(0, 0, 0, 0)); + const watchedPerWeek = [[], [], [], [], [], [], []]; + + for (let i = 0; i < 366; i++) { + const date = new Date(); + date.setDate(date.getDate() - i); + date.setHours(0, 0, 0, 0); + watchedPerWeek[date.getDay()].push(allDates.map(element => element === date.getTime()).filter(Boolean).length); } - /** - * Renders the top series in the DOM - * @param {String} Title - */ - function RenderTopSeries(Title) { - $.ajax({ - url: "assets/php/getInformation.php", - data: { - Title: Title - }, - type: "POST" - }).done(result => { - const TopInformation = JSON.parse(result); - $(".MostWatchedOverview > .MostWatchedPoster").attr( - "src", - `https://image.tmdb.org/t/p/w300${TopInformation.poster_path}` - ); - $(".MostWatchedOverview > .Description").text( - TopInformation.overview - ); - console.log(TopInformation); - }); - } + const maxWatchedPerDay = Math.max.apply(Math, watchedPerWeek.flat(2)); - /** - * Renders a heatmap of all watched days - * @param {Array} chartData - */ - function RenderHeatmap(chartData) { - const Heatmap = calendarHeatmap() - .data(chartData) - .selector('#Heatmap') - .colorRange(['#ffd3d3', '#fc1111']) - .tooltipEnabled(true) - .onClick(function (data) { - console.log('onClick callback. Data:', data); - }); + watchedPerWeek.map((element, i) => { + watchedPerWeek[i].push(["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"][i]); + return watchedPerWeek[i].reverse(); + }); - Heatmap(); - } + watchedPerWeek.forEach(element => { + const tableRow = document.createElement("tr"); + element.forEach(count => { + const tableData = document.createElement("td"); + tableData.style.backgroundColor = "rgba(255,13,0," + count / maxWatchedPerDay + ")"; + if (typeof count !== "number") tableData.appendChild(document.createTextNode(count)); + tableRow.appendChild(tableData); - /** - * Sorts an js object by value {int} - * @param {Object} list - */ - function sortObject(list) { - var sortable = []; - for (var key in list) { - sortable.push([key, list[key]]); - } - sortable.sort((a, b) => { - return a[1] < b[1] ? -1 : a[1] > b[1] ? 1 : 0; + tableData.addEventListener("mouseover", () => { + document.querySelector("#information").innerText = `You've watched ${count} titles on that day!`; + }); }); - var orderedList = {}; - for (var i = 0; i < sortable.length; i++) { - orderedList[sortable[i][0]] = sortable[i][1]; - } - return orderedList; - } -});
\ No newline at end of file + + heatMap.appendChild(tableRow) + }) +} + +function secondsToHours(seconds) { + const date = new Date(null); + date.setSeconds(seconds); + return date.toISOString().substr(11, 8) +} diff --git a/assets/js/moment.js b/assets/js/moment.js deleted file mode 100644 index 580a6a2..0000000 --- a/assets/js/moment.js +++ /dev/null @@ -1 +0,0 @@ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):e.moment=t()}(this,function(){"use strict";var e,i;function c(){return e.apply(null,arguments)}function o(e){return e instanceof Array||"[object Array]"===Object.prototype.toString.call(e)}function u(e){return null!=e&&"[object Object]"===Object.prototype.toString.call(e)}function l(e){return void 0===e}function d(e){return"number"==typeof e||"[object Number]"===Object.prototype.toString.call(e)}function h(e){return e instanceof Date||"[object Date]"===Object.prototype.toString.call(e)}function f(e,t){var n,s=[];for(n=0;n<e.length;++n)s.push(t(e[n],n));return s}function m(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function _(e,t){for(var n in t)m(t,n)&&(e[n]=t[n]);return m(t,"toString")&&(e.toString=t.toString),m(t,"valueOf")&&(e.valueOf=t.valueOf),e}function y(e,t,n,s){return Ot(e,t,n,s,!0).utc()}function g(e){return null==e._pf&&(e._pf={empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1,parsedDateParts:[],meridiem:null,rfc2822:!1,weekdayMismatch:!1}),e._pf}function p(e){if(null==e._isValid){var t=g(e),n=i.call(t.parsedDateParts,function(e){return null!=e}),s=!isNaN(e._d.getTime())&&t.overflow<0&&!t.empty&&!t.invalidMonth&&!t.invalidWeekday&&!t.weekdayMismatch&&!t.nullInput&&!t.invalidFormat&&!t.userInvalidated&&(!t.meridiem||t.meridiem&&n);if(e._strict&&(s=s&&0===t.charsLeftOver&&0===t.unusedTokens.length&&void 0===t.bigHour),null!=Object.isFrozen&&Object.isFrozen(e))return s;e._isValid=s}return e._isValid}function v(e){var t=y(NaN);return null!=e?_(g(t),e):g(t).userInvalidated=!0,t}i=Array.prototype.some?Array.prototype.some:function(e){for(var t=Object(this),n=t.length>>>0,s=0;s<n;s++)if(s in t&&e.call(this,t[s],s,t))return!0;return!1};var r=c.momentProperties=[];function w(e,t){var n,s,i;if(l(t._isAMomentObject)||(e._isAMomentObject=t._isAMomentObject),l(t._i)||(e._i=t._i),l(t._f)||(e._f=t._f),l(t._l)||(e._l=t._l),l(t._strict)||(e._strict=t._strict),l(t._tzm)||(e._tzm=t._tzm),l(t._isUTC)||(e._isUTC=t._isUTC),l(t._offset)||(e._offset=t._offset),l(t._pf)||(e._pf=g(t)),l(t._locale)||(e._locale=t._locale),0<r.length)for(n=0;n<r.length;n++)l(i=t[s=r[n]])||(e[s]=i);return e}var t=!1;function M(e){w(this,e),this._d=new Date(null!=e._d?e._d.getTime():NaN),this.isValid()||(this._d=new Date(NaN)),!1===t&&(t=!0,c.updateOffset(this),t=!1)}function S(e){return e instanceof M||null!=e&&null!=e._isAMomentObject}function D(e){return e<0?Math.ceil(e)||0:Math.floor(e)}function k(e){var t=+e,n=0;return 0!==t&&isFinite(t)&&(n=D(t)),n}function a(e,t,n){var s,i=Math.min(e.length,t.length),r=Math.abs(e.length-t.length),a=0;for(s=0;s<i;s++)(n&&e[s]!==t[s]||!n&&k(e[s])!==k(t[s]))&&a++;return a+r}function Y(e){!1===c.suppressDeprecationWarnings&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+e)}function n(i,r){var a=!0;return _(function(){if(null!=c.deprecationHandler&&c.deprecationHandler(null,i),a){for(var e,t=[],n=0;n<arguments.length;n++){if(e="","object"==typeof arguments[n]){for(var s in e+="\n["+n+"] ",arguments[0])e+=s+": "+arguments[0][s]+", ";e=e.slice(0,-2)}else e=arguments[n];t.push(e)}Y(i+"\nArguments: "+Array.prototype.slice.call(t).join("")+"\n"+(new Error).stack),a=!1}return r.apply(this,arguments)},r)}var s,O={};function T(e,t){null!=c.deprecationHandler&&c.deprecationHandler(e,t),O[e]||(Y(t),O[e]=!0)}function x(e){return e instanceof Function||"[object Function]"===Object.prototype.toString.call(e)}function b(e,t){var n,s=_({},e);for(n in t)m(t,n)&&(u(e[n])&&u(t[n])?(s[n]={},_(s[n],e[n]),_(s[n],t[n])):null!=t[n]?s[n]=t[n]:delete s[n]);for(n in e)m(e,n)&&!m(t,n)&&u(e[n])&&(s[n]=_({},s[n]));return s}function P(e){null!=e&&this.set(e)}c.suppressDeprecationWarnings=!1,c.deprecationHandler=null,s=Object.keys?Object.keys:function(e){var t,n=[];for(t in e)m(e,t)&&n.push(t);return n};var W={};function H(e,t){var n=e.toLowerCase();W[n]=W[n+"s"]=W[t]=e}function R(e){return"string"==typeof e?W[e]||W[e.toLowerCase()]:void 0}function C(e){var t,n,s={};for(n in e)m(e,n)&&(t=R(n))&&(s[t]=e[n]);return s}var F={};function L(e,t){F[e]=t}function U(e,t,n){var s=""+Math.abs(e),i=t-s.length;return(0<=e?n?"+":"":"-")+Math.pow(10,Math.max(0,i)).toString().substr(1)+s}var N=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,G=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,V={},E={};function I(e,t,n,s){var i=s;"string"==typeof s&&(i=function(){return this[s]()}),e&&(E[e]=i),t&&(E[t[0]]=function(){return U(i.apply(this,arguments),t[1],t[2])}),n&&(E[n]=function(){return this.localeData().ordinal(i.apply(this,arguments),e)})}function A(e,t){return e.isValid()?(t=j(t,e.localeData()),V[t]=V[t]||function(s){var e,i,t,r=s.match(N);for(e=0,i=r.length;e<i;e++)E[r[e]]?r[e]=E[r[e]]:r[e]=(t=r[e]).match(/\[[\s\S]/)?t.replace(/^\[|\]$/g,""):t.replace(/\\/g,"");return function(e){var t,n="";for(t=0;t<i;t++)n+=x(r[t])?r[t].call(e,s):r[t];return n}}(t),V[t](e)):e.localeData().invalidDate()}function j(e,t){var n=5;function s(e){return t.longDateFormat(e)||e}for(G.lastIndex=0;0<=n&&G.test(e);)e=e.replace(G,s),G.lastIndex=0,n-=1;return e}var Z=/\d/,z=/\d\d/,$=/\d{3}/,q=/\d{4}/,J=/[+-]?\d{6}/,B=/\d\d?/,Q=/\d\d\d\d?/,X=/\d\d\d\d\d\d?/,K=/\d{1,3}/,ee=/\d{1,4}/,te=/[+-]?\d{1,6}/,ne=/\d+/,se=/[+-]?\d+/,ie=/Z|[+-]\d\d:?\d\d/gi,re=/Z|[+-]\d\d(?::?\d\d)?/gi,ae=/[0-9]{0,256}['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFF07\uFF10-\uFFEF]{1,256}|[\u0600-\u06FF\/]{1,256}(\s*?[\u0600-\u06FF]{1,256}){1,2}/i,oe={};function ue(e,n,s){oe[e]=x(n)?n:function(e,t){return e&&s?s:n}}function le(e,t){return m(oe,e)?oe[e](t._strict,t._locale):new RegExp(de(e.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(e,t,n,s,i){return t||n||s||i})))}function de(e){return e.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}var he={};function ce(e,n){var t,s=n;for("string"==typeof e&&(e=[e]),d(n)&&(s=function(e,t){t[n]=k(e)}),t=0;t<e.length;t++)he[e[t]]=s}function fe(e,i){ce(e,function(e,t,n,s){n._w=n._w||{},i(e,n._w,n,s)})}var me=0,_e=1,ye=2,ge=3,pe=4,ve=5,we=6,Me=7,Se=8;function De(e){return ke(e)?366:365}function ke(e){return e%4==0&&e%100!=0||e%400==0}I("Y",0,0,function(){var e=this.year();return e<=9999?""+e:"+"+e}),I(0,["YY",2],0,function(){return this.year()%100}),I(0,["YYYY",4],0,"year"),I(0,["YYYYY",5],0,"year"),I(0,["YYYYYY",6,!0],0,"year"),H("year","y"),L("year",1),ue("Y",se),ue("YY",B,z),ue("YYYY",ee,q),ue("YYYYY",te,J),ue("YYYYYY",te,J),ce(["YYYYY","YYYYYY"],me),ce("YYYY",function(e,t){t[me]=2===e.length?c.parseTwoDigitYear(e):k(e)}),ce("YY",function(e,t){t[me]=c.parseTwoDigitYear(e)}),ce("Y",function(e,t){t[me]=parseInt(e,10)}),c.parseTwoDigitYear=function(e){return k(e)+(68<k(e)?1900:2e3)};var Ye,Oe=Te("FullYear",!0);function Te(t,n){return function(e){return null!=e?(be(this,t,e),c.updateOffset(this,n),this):xe(this,t)}}function xe(e,t){return e.isValid()?e._d["get"+(e._isUTC?"UTC":"")+t]():NaN}function be(e,t,n){e.isValid()&&!isNaN(n)&&("FullYear"===t&&ke(e.year())&&1===e.month()&&29===e.date()?e._d["set"+(e._isUTC?"UTC":"")+t](n,e.month(),Pe(n,e.month())):e._d["set"+(e._isUTC?"UTC":"")+t](n))}function Pe(e,t){if(isNaN(e)||isNaN(t))return NaN;var n,s=(t%(n=12)+n)%n;return e+=(t-s)/12,1===s?ke(e)?29:28:31-s%7%2}Ye=Array.prototype.indexOf?Array.prototype.indexOf:function(e){var t;for(t=0;t<this.length;++t)if(this[t]===e)return t;return-1},I("M",["MM",2],"Mo",function(){return this.month()+1}),I("MMM",0,0,function(e){return this.localeData().monthsShort(this,e)}),I("MMMM",0,0,function(e){return this.localeData().months(this,e)}),H("month","M"),L("month",8),ue("M",B),ue("MM",B,z),ue("MMM",function(e,t){return t.monthsShortRegex(e)}),ue("MMMM",function(e,t){return t.monthsRegex(e)}),ce(["M","MM"],function(e,t){t[_e]=k(e)-1}),ce(["MMM","MMMM"],function(e,t,n,s){var i=n._locale.monthsParse(e,s,n._strict);null!=i?t[_e]=i:g(n).invalidMonth=e});var We=/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/,He="January_February_March_April_May_June_July_August_September_October_November_December".split("_");var Re="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_");function Ce(e,t){var n;if(!e.isValid())return e;if("string"==typeof t)if(/^\d+$/.test(t))t=k(t);else if(!d(t=e.localeData().monthsParse(t)))return e;return n=Math.min(e.date(),Pe(e.year(),t)),e._d["set"+(e._isUTC?"UTC":"")+"Month"](t,n),e}function Fe(e){return null!=e?(Ce(this,e),c.updateOffset(this,!0),this):xe(this,"Month")}var Le=ae;var Ue=ae;function Ne(){function e(e,t){return t.length-e.length}var t,n,s=[],i=[],r=[];for(t=0;t<12;t++)n=y([2e3,t]),s.push(this.monthsShort(n,"")),i.push(this.months(n,"")),r.push(this.months(n,"")),r.push(this.monthsShort(n,""));for(s.sort(e),i.sort(e),r.sort(e),t=0;t<12;t++)s[t]=de(s[t]),i[t]=de(i[t]);for(t=0;t<24;t++)r[t]=de(r[t]);this._monthsRegex=new RegExp("^("+r.join("|")+")","i"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp("^("+i.join("|")+")","i"),this._monthsShortStrictRegex=new RegExp("^("+s.join("|")+")","i")}function Ge(e){var t=new Date(Date.UTC.apply(null,arguments));return e<100&&0<=e&&isFinite(t.getUTCFullYear())&&t.setUTCFullYear(e),t}function Ve(e,t,n){var s=7+t-n;return-((7+Ge(e,0,s).getUTCDay()-t)%7)+s-1}function Ee(e,t,n,s,i){var r,a,o=1+7*(t-1)+(7+n-s)%7+Ve(e,s,i);return o<=0?a=De(r=e-1)+o:o>De(e)?(r=e+1,a=o-De(e)):(r=e,a=o),{year:r,dayOfYear:a}}function Ie(e,t,n){var s,i,r=Ve(e.year(),t,n),a=Math.floor((e.dayOfYear()-r-1)/7)+1;return a<1?s=a+Ae(i=e.year()-1,t,n):a>Ae(e.year(),t,n)?(s=a-Ae(e.year(),t,n),i=e.year()+1):(i=e.year(),s=a),{week:s,year:i}}function Ae(e,t,n){var s=Ve(e,t,n),i=Ve(e+1,t,n);return(De(e)-s+i)/7}I("w",["ww",2],"wo","week"),I("W",["WW",2],"Wo","isoWeek"),H("week","w"),H("isoWeek","W"),L("week",5),L("isoWeek",5),ue("w",B),ue("ww",B,z),ue("W",B),ue("WW",B,z),fe(["w","ww","W","WW"],function(e,t,n,s){t[s.substr(0,1)]=k(e)});I("d",0,"do","day"),I("dd",0,0,function(e){return this.localeData().weekdaysMin(this,e)}),I("ddd",0,0,function(e){return this.localeData().weekdaysShort(this,e)}),I("dddd",0,0,function(e){return this.localeData().weekdays(this,e)}),I("e",0,0,"weekday"),I("E",0,0,"isoWeekday"),H("day","d"),H("weekday","e"),H("isoWeekday","E"),L("day",11),L("weekday",11),L("isoWeekday",11),ue("d",B),ue("e",B),ue("E",B),ue("dd",function(e,t){return t.weekdaysMinRegex(e)}),ue("ddd",function(e,t){return t.weekdaysShortRegex(e)}),ue("dddd",function(e,t){return t.weekdaysRegex(e)}),fe(["dd","ddd","dddd"],function(e,t,n,s){var i=n._locale.weekdaysParse(e,s,n._strict);null!=i?t.d=i:g(n).invalidWeekday=e}),fe(["d","e","E"],function(e,t,n,s){t[s]=k(e)});var je="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_");var Ze="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_");var ze="Su_Mo_Tu_We_Th_Fr_Sa".split("_");var $e=ae;var qe=ae;var Je=ae;function Be(){function e(e,t){return t.length-e.length}var t,n,s,i,r,a=[],o=[],u=[],l=[];for(t=0;t<7;t++)n=y([2e3,1]).day(t),s=this.weekdaysMin(n,""),i=this.weekdaysShort(n,""),r=this.weekdays(n,""),a.push(s),o.push(i),u.push(r),l.push(s),l.push(i),l.push(r);for(a.sort(e),o.sort(e),u.sort(e),l.sort(e),t=0;t<7;t++)o[t]=de(o[t]),u[t]=de(u[t]),l[t]=de(l[t]);this._weekdaysRegex=new RegExp("^("+l.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+u.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+o.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+a.join("|")+")","i")}function Qe(){return this.hours()%12||12}function Xe(e,t){I(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}function Ke(e,t){return t._meridiemParse}I("H",["HH",2],0,"hour"),I("h",["hh",2],0,Qe),I("k",["kk",2],0,function(){return this.hours()||24}),I("hmm",0,0,function(){return""+Qe.apply(this)+U(this.minutes(),2)}),I("hmmss",0,0,function(){return""+Qe.apply(this)+U(this.minutes(),2)+U(this.seconds(),2)}),I("Hmm",0,0,function(){return""+this.hours()+U(this.minutes(),2)}),I("Hmmss",0,0,function(){return""+this.hours()+U(this.minutes(),2)+U(this.seconds(),2)}),Xe("a",!0),Xe("A",!1),H("hour","h"),L("hour",13),ue("a",Ke),ue("A",Ke),ue("H",B),ue("h",B),ue("k",B),ue("HH",B,z),ue("hh",B,z),ue("kk",B,z),ue("hmm",Q),ue("hmmss",X),ue("Hmm",Q),ue("Hmmss",X),ce(["H","HH"],ge),ce(["k","kk"],function(e,t,n){var s=k(e);t[ge]=24===s?0:s}),ce(["a","A"],function(e,t,n){n._isPm=n._locale.isPM(e),n._meridiem=e}),ce(["h","hh"],function(e,t,n){t[ge]=k(e),g(n).bigHour=!0}),ce("hmm",function(e,t,n){var s=e.length-2;t[ge]=k(e.substr(0,s)),t[pe]=k(e.substr(s)),g(n).bigHour=!0}),ce("hmmss",function(e,t,n){var s=e.length-4,i=e.length-2;t[ge]=k(e.substr(0,s)),t[pe]=k(e.substr(s,2)),t[ve]=k(e.substr(i)),g(n).bigHour=!0}),ce("Hmm",function(e,t,n){var s=e.length-2;t[ge]=k(e.substr(0,s)),t[pe]=k(e.substr(s))}),ce("Hmmss",function(e,t,n){var s=e.length-4,i=e.length-2;t[ge]=k(e.substr(0,s)),t[pe]=k(e.substr(s,2)),t[ve]=k(e.substr(i))});var et,tt=Te("Hours",!0),nt={calendar:{sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},longDateFormat:{LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},invalidDate:"Invalid date",ordinal:"%d",dayOfMonthOrdinalParse:/\d{1,2}/,relativeTime:{future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},months:He,monthsShort:Re,week:{dow:0,doy:6},weekdays:je,weekdaysMin:ze,weekdaysShort:Ze,meridiemParse:/[ap]\.?m?\.?/i},st={},it={};function rt(e){return e?e.toLowerCase().replace("_","-"):e}function at(e){var t=null;if(!st[e]&&"undefined"!=typeof module&&module&&module.exports)try{t=et._abbr,require("./locale/"+e),ot(t)}catch(e){}return st[e]}function ot(e,t){var n;return e&&((n=l(t)?lt(e):ut(e,t))?et=n:"undefined"!=typeof console&&console.warn&&console.warn("Locale "+e+" not found. Did you forget to load it?")),et._abbr}function ut(e,t){if(null!==t){var n,s=nt;if(t.abbr=e,null!=st[e])T("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),s=st[e]._config;else if(null!=t.parentLocale)if(null!=st[t.parentLocale])s=st[t.parentLocale]._config;else{if(null==(n=at(t.parentLocale)))return it[t.parentLocale]||(it[t.parentLocale]=[]),it[t.parentLocale].push({name:e,config:t}),null;s=n._config}return st[e]=new P(b(s,t)),it[e]&&it[e].forEach(function(e){ut(e.name,e.config)}),ot(e),st[e]}return delete st[e],null}function lt(e){var t;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr),!e)return et;if(!o(e)){if(t=at(e))return t;e=[e]}return function(e){for(var t,n,s,i,r=0;r<e.length;){for(t=(i=rt(e[r]).split("-")).length,n=(n=rt(e[r+1]))?n.split("-"):null;0<t;){if(s=at(i.slice(0,t).join("-")))return s;if(n&&n.length>=t&&a(i,n,!0)>=t-1)break;t--}r++}return et}(e)}function dt(e){var t,n=e._a;return n&&-2===g(e).overflow&&(t=n[_e]<0||11<n[_e]?_e:n[ye]<1||n[ye]>Pe(n[me],n[_e])?ye:n[ge]<0||24<n[ge]||24===n[ge]&&(0!==n[pe]||0!==n[ve]||0!==n[we])?ge:n[pe]<0||59<n[pe]?pe:n[ve]<0||59<n[ve]?ve:n[we]<0||999<n[we]?we:-1,g(e)._overflowDayOfYear&&(t<me||ye<t)&&(t=ye),g(e)._overflowWeeks&&-1===t&&(t=Me),g(e)._overflowWeekday&&-1===t&&(t=Se),g(e).overflow=t),e}function ht(e,t,n){return null!=e?e:null!=t?t:n}function ct(e){var t,n,s,i,r,a=[];if(!e._d){var o,u;for(o=e,u=new Date(c.now()),s=o._useUTC?[u.getUTCFullYear(),u.getUTCMonth(),u.getUTCDate()]:[u.getFullYear(),u.getMonth(),u.getDate()],e._w&&null==e._a[ye]&&null==e._a[_e]&&function(e){var t,n,s,i,r,a,o,u;if(null!=(t=e._w).GG||null!=t.W||null!=t.E)r=1,a=4,n=ht(t.GG,e._a[me],Ie(Tt(),1,4).year),s=ht(t.W,1),((i=ht(t.E,1))<1||7<i)&&(u=!0);else{r=e._locale._week.dow,a=e._locale._week.doy;var l=Ie(Tt(),r,a);n=ht(t.gg,e._a[me],l.year),s=ht(t.w,l.week),null!=t.d?((i=t.d)<0||6<i)&&(u=!0):null!=t.e?(i=t.e+r,(t.e<0||6<t.e)&&(u=!0)):i=r}s<1||s>Ae(n,r,a)?g(e)._overflowWeeks=!0:null!=u?g(e)._overflowWeekday=!0:(o=Ee(n,s,i,r,a),e._a[me]=o.year,e._dayOfYear=o.dayOfYear)}(e),null!=e._dayOfYear&&(r=ht(e._a[me],s[me]),(e._dayOfYear>De(r)||0===e._dayOfYear)&&(g(e)._overflowDayOfYear=!0),n=Ge(r,0,e._dayOfYear),e._a[_e]=n.getUTCMonth(),e._a[ye]=n.getUTCDate()),t=0;t<3&&null==e._a[t];++t)e._a[t]=a[t]=s[t];for(;t<7;t++)e._a[t]=a[t]=null==e._a[t]?2===t?1:0:e._a[t];24===e._a[ge]&&0===e._a[pe]&&0===e._a[ve]&&0===e._a[we]&&(e._nextDay=!0,e._a[ge]=0),e._d=(e._useUTC?Ge:function(e,t,n,s,i,r,a){var o=new Date(e,t,n,s,i,r,a);return e<100&&0<=e&&isFinite(o.getFullYear())&&o.setFullYear(e),o}).apply(null,a),i=e._useUTC?e._d.getUTCDay():e._d.getDay(),null!=e._tzm&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[ge]=24),e._w&&void 0!==e._w.d&&e._w.d!==i&&(g(e).weekdayMismatch=!0)}}var ft=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,mt=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,_t=/Z|[+-]\d\d(?::?\d\d)?/,yt=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],gt=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],pt=/^\/?Date\((\-?\d+)/i;function vt(e){var t,n,s,i,r,a,o=e._i,u=ft.exec(o)||mt.exec(o);if(u){for(g(e).iso=!0,t=0,n=yt.length;t<n;t++)if(yt[t][1].exec(u[1])){i=yt[t][0],s=!1!==yt[t][2];break}if(null==i)return void(e._isValid=!1);if(u[3]){for(t=0,n=gt.length;t<n;t++)if(gt[t][1].exec(u[3])){r=(u[2]||" ")+gt[t][0];break}if(null==r)return void(e._isValid=!1)}if(!s&&null!=r)return void(e._isValid=!1);if(u[4]){if(!_t.exec(u[4]))return void(e._isValid=!1);a="Z"}e._f=i+(r||"")+(a||""),kt(e)}else e._isValid=!1}var wt=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d{1,2})\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(\d{2,4})\s(\d\d):(\d\d)(?::(\d\d))?\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\d{4}))$/;function Mt(e,t,n,s,i,r){var a=[function(e){var t=parseInt(e,10);{if(t<=49)return 2e3+t;if(t<=999)return 1900+t}return t}(e),Re.indexOf(t),parseInt(n,10),parseInt(s,10),parseInt(i,10)];return r&&a.push(parseInt(r,10)),a}var St={UT:0,GMT:0,EDT:-240,EST:-300,CDT:-300,CST:-360,MDT:-360,MST:-420,PDT:-420,PST:-480};function Dt(e){var t,n,s,i=wt.exec(e._i.replace(/\([^)]*\)|[\n\t]/g," ").replace(/(\s\s+)/g," ").replace(/^\s\s*/,"").replace(/\s\s*$/,""));if(i){var r=Mt(i[4],i[3],i[2],i[5],i[6],i[7]);if(t=i[1],n=r,s=e,t&&Ze.indexOf(t)!==new Date(n[0],n[1],n[2]).getDay()&&(g(s).weekdayMismatch=!0,!(s._isValid=!1)))return;e._a=r,e._tzm=function(e,t,n){if(e)return St[e];if(t)return 0;var s=parseInt(n,10),i=s%100;return(s-i)/100*60+i}(i[8],i[9],i[10]),e._d=Ge.apply(null,e._a),e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),g(e).rfc2822=!0}else e._isValid=!1}function kt(e){if(e._f!==c.ISO_8601)if(e._f!==c.RFC_2822){e._a=[],g(e).empty=!0;var t,n,s,i,r,a,o,u,l=""+e._i,d=l.length,h=0;for(s=j(e._f,e._locale).match(N)||[],t=0;t<s.length;t++)i=s[t],(n=(l.match(le(i,e))||[])[0])&&(0<(r=l.substr(0,l.indexOf(n))).length&&g(e).unusedInput.push(r),l=l.slice(l.indexOf(n)+n.length),h+=n.length),E[i]?(n?g(e).empty=!1:g(e).unusedTokens.push(i),a=i,u=e,null!=(o=n)&&m(he,a)&&he[a](o,u._a,u,a)):e._strict&&!n&&g(e).unusedTokens.push(i);g(e).charsLeftOver=d-h,0<l.length&&g(e).unusedInput.push(l),e._a[ge]<=12&&!0===g(e).bigHour&&0<e._a[ge]&&(g(e).bigHour=void 0),g(e).parsedDateParts=e._a.slice(0),g(e).meridiem=e._meridiem,e._a[ge]=function(e,t,n){var s;if(null==n)return t;return null!=e.meridiemHour?e.meridiemHour(t,n):(null!=e.isPM&&((s=e.isPM(n))&&t<12&&(t+=12),s||12!==t||(t=0)),t)}(e._locale,e._a[ge],e._meridiem),ct(e),dt(e)}else Dt(e);else vt(e)}function Yt(e){var t,n,s,i,r=e._i,a=e._f;return e._locale=e._locale||lt(e._l),null===r||void 0===a&&""===r?v({nullInput:!0}):("string"==typeof r&&(e._i=r=e._locale.preparse(r)),S(r)?new M(dt(r)):(h(r)?e._d=r:o(a)?function(e){var t,n,s,i,r;if(0===e._f.length)return g(e).invalidFormat=!0,e._d=new Date(NaN);for(i=0;i<e._f.length;i++)r=0,t=w({},e),null!=e._useUTC&&(t._useUTC=e._useUTC),t._f=e._f[i],kt(t),p(t)&&(r+=g(t).charsLeftOver,r+=10*g(t).unusedTokens.length,g(t).score=r,(null==s||r<s)&&(s=r,n=t));_(e,n||t)}(e):a?kt(e):l(n=(t=e)._i)?t._d=new Date(c.now()):h(n)?t._d=new Date(n.valueOf()):"string"==typeof n?(s=t,null===(i=pt.exec(s._i))?(vt(s),!1===s._isValid&&(delete s._isValid,Dt(s),!1===s._isValid&&(delete s._isValid,c.createFromInputFallback(s)))):s._d=new Date(+i[1])):o(n)?(t._a=f(n.slice(0),function(e){return parseInt(e,10)}),ct(t)):u(n)?function(e){if(!e._d){var t=C(e._i);e._a=f([t.year,t.month,t.day||t.date,t.hour,t.minute,t.second,t.millisecond],function(e){return e&&parseInt(e,10)}),ct(e)}}(t):d(n)?t._d=new Date(n):c.createFromInputFallback(t),p(e)||(e._d=null),e))}function Ot(e,t,n,s,i){var r,a={};return!0!==n&&!1!==n||(s=n,n=void 0),(u(e)&&function(e){if(Object.getOwnPropertyNames)return 0===Object.getOwnPropertyNames(e).length;var t;for(t in e)if(e.hasOwnProperty(t))return!1;return!0}(e)||o(e)&&0===e.length)&&(e=void 0),a._isAMomentObject=!0,a._useUTC=a._isUTC=i,a._l=n,a._i=e,a._f=t,a._strict=s,(r=new M(dt(Yt(a))))._nextDay&&(r.add(1,"d"),r._nextDay=void 0),r}function Tt(e,t,n,s){return Ot(e,t,n,s,!1)}c.createFromInputFallback=n("value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged and will be removed in an upcoming major release. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.",function(e){e._d=new Date(e._i+(e._useUTC?" UTC":""))}),c.ISO_8601=function(){},c.RFC_2822=function(){};var xt=n("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var e=Tt.apply(null,arguments);return this.isValid()&&e.isValid()?e<this?this:e:v()}),bt=n("moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var e=Tt.apply(null,arguments);return this.isValid()&&e.isValid()?this<e?this:e:v()});function Pt(e,t){var n,s;if(1===t.length&&o(t[0])&&(t=t[0]),!t.length)return Tt();for(n=t[0],s=1;s<t.length;++s)t[s].isValid()&&!t[s][e](n)||(n=t[s]);return n}var Wt=["year","quarter","month","week","day","hour","minute","second","millisecond"];function Ht(e){var t=C(e),n=t.year||0,s=t.quarter||0,i=t.month||0,r=t.week||0,a=t.day||0,o=t.hour||0,u=t.minute||0,l=t.second||0,d=t.millisecond||0;this._isValid=function(e){for(var t in e)if(-1===Ye.call(Wt,t)||null!=e[t]&&isNaN(e[t]))return!1;for(var n=!1,s=0;s<Wt.length;++s)if(e[Wt[s]]){if(n)return!1;parseFloat(e[Wt[s]])!==k(e[Wt[s]])&&(n=!0)}return!0}(t),this._milliseconds=+d+1e3*l+6e4*u+1e3*o*60*60,this._days=+a+7*r,this._months=+i+3*s+12*n,this._data={},this._locale=lt(),this._bubble()}function Rt(e){return e instanceof Ht}function Ct(e){return e<0?-1*Math.round(-1*e):Math.round(e)}function Ft(e,n){I(e,0,0,function(){var e=this.utcOffset(),t="+";return e<0&&(e=-e,t="-"),t+U(~~(e/60),2)+n+U(~~e%60,2)})}Ft("Z",":"),Ft("ZZ",""),ue("Z",re),ue("ZZ",re),ce(["Z","ZZ"],function(e,t,n){n._useUTC=!0,n._tzm=Ut(re,e)});var Lt=/([\+\-]|\d\d)/gi;function Ut(e,t){var n=(t||"").match(e);if(null===n)return null;var s=((n[n.length-1]||[])+"").match(Lt)||["-",0,0],i=60*s[1]+k(s[2]);return 0===i?0:"+"===s[0]?i:-i}function Nt(e,t){var n,s;return t._isUTC?(n=t.clone(),s=(S(e)||h(e)?e.valueOf():Tt(e).valueOf())-n.valueOf(),n._d.setTime(n._d.valueOf()+s),c.updateOffset(n,!1),n):Tt(e).local()}function Gt(e){return 15*-Math.round(e._d.getTimezoneOffset()/15)}function Vt(){return!!this.isValid()&&(this._isUTC&&0===this._offset)}c.updateOffset=function(){};var Et=/^(\-|\+)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,It=/^(-|\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function At(e,t){var n,s,i,r=e,a=null;return Rt(e)?r={ms:e._milliseconds,d:e._days,M:e._months}:d(e)?(r={},t?r[t]=e:r.milliseconds=e):(a=Et.exec(e))?(n="-"===a[1]?-1:1,r={y:0,d:k(a[ye])*n,h:k(a[ge])*n,m:k(a[pe])*n,s:k(a[ve])*n,ms:k(Ct(1e3*a[we]))*n}):(a=It.exec(e))?(n="-"===a[1]?-1:(a[1],1),r={y:jt(a[2],n),M:jt(a[3],n),w:jt(a[4],n),d:jt(a[5],n),h:jt(a[6],n),m:jt(a[7],n),s:jt(a[8],n)}):null==r?r={}:"object"==typeof r&&("from"in r||"to"in r)&&(i=function(e,t){var n;if(!e.isValid()||!t.isValid())return{milliseconds:0,months:0};t=Nt(t,e),e.isBefore(t)?n=Zt(e,t):((n=Zt(t,e)).milliseconds=-n.milliseconds,n.months=-n.months);return n}(Tt(r.from),Tt(r.to)),(r={}).ms=i.milliseconds,r.M=i.months),s=new Ht(r),Rt(e)&&m(e,"_locale")&&(s._locale=e._locale),s}function jt(e,t){var n=e&&parseFloat(e.replace(",","."));return(isNaN(n)?0:n)*t}function Zt(e,t){var n={milliseconds:0,months:0};return n.months=t.month()-e.month()+12*(t.year()-e.year()),e.clone().add(n.months,"M").isAfter(t)&&--n.months,n.milliseconds=+t-+e.clone().add(n.months,"M"),n}function zt(s,i){return function(e,t){var n;return null===t||isNaN(+t)||(T(i,"moment()."+i+"(period, number) is deprecated. Please use moment()."+i+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),n=e,e=t,t=n),$t(this,At(e="string"==typeof e?+e:e,t),s),this}}function $t(e,t,n,s){var i=t._milliseconds,r=Ct(t._days),a=Ct(t._months);e.isValid()&&(s=null==s||s,a&&Ce(e,xe(e,"Month")+a*n),r&&be(e,"Date",xe(e,"Date")+r*n),i&&e._d.setTime(e._d.valueOf()+i*n),s&&c.updateOffset(e,r||a))}At.fn=Ht.prototype,At.invalid=function(){return At(NaN)};var qt=zt(1,"add"),Jt=zt(-1,"subtract");function Bt(e,t){var n=12*(t.year()-e.year())+(t.month()-e.month()),s=e.clone().add(n,"months");return-(n+(t-s<0?(t-s)/(s-e.clone().add(n-1,"months")):(t-s)/(e.clone().add(n+1,"months")-s)))||0}function Qt(e){var t;return void 0===e?this._locale._abbr:(null!=(t=lt(e))&&(this._locale=t),this)}c.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",c.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var Xt=n("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(e){return void 0===e?this.localeData():this.locale(e)});function Kt(){return this._locale}function en(e,t){I(0,[e,e.length],0,t)}function tn(e,t,n,s,i){var r;return null==e?Ie(this,s,i).year:((r=Ae(e,s,i))<t&&(t=r),function(e,t,n,s,i){var r=Ee(e,t,n,s,i),a=Ge(r.year,0,r.dayOfYear);return this.year(a.getUTCFullYear()),this.month(a.getUTCMonth()),this.date(a.getUTCDate()),this}.call(this,e,t,n,s,i))}I(0,["gg",2],0,function(){return this.weekYear()%100}),I(0,["GG",2],0,function(){return this.isoWeekYear()%100}),en("gggg","weekYear"),en("ggggg","weekYear"),en("GGGG","isoWeekYear"),en("GGGGG","isoWeekYear"),H("weekYear","gg"),H("isoWeekYear","GG"),L("weekYear",1),L("isoWeekYear",1),ue("G",se),ue("g",se),ue("GG",B,z),ue("gg",B,z),ue("GGGG",ee,q),ue("gggg",ee,q),ue("GGGGG",te,J),ue("ggggg",te,J),fe(["gggg","ggggg","GGGG","GGGGG"],function(e,t,n,s){t[s.substr(0,2)]=k(e)}),fe(["gg","GG"],function(e,t,n,s){t[s]=c.parseTwoDigitYear(e)}),I("Q",0,"Qo","quarter"),H("quarter","Q"),L("quarter",7),ue("Q",Z),ce("Q",function(e,t){t[_e]=3*(k(e)-1)}),I("D",["DD",2],"Do","date"),H("date","D"),L("date",9),ue("D",B),ue("DD",B,z),ue("Do",function(e,t){return e?t._dayOfMonthOrdinalParse||t._ordinalParse:t._dayOfMonthOrdinalParseLenient}),ce(["D","DD"],ye),ce("Do",function(e,t){t[ye]=k(e.match(B)[0])});var nn=Te("Date",!0);I("DDD",["DDDD",3],"DDDo","dayOfYear"),H("dayOfYear","DDD"),L("dayOfYear",4),ue("DDD",K),ue("DDDD",$),ce(["DDD","DDDD"],function(e,t,n){n._dayOfYear=k(e)}),I("m",["mm",2],0,"minute"),H("minute","m"),L("minute",14),ue("m",B),ue("mm",B,z),ce(["m","mm"],pe);var sn=Te("Minutes",!1);I("s",["ss",2],0,"second"),H("second","s"),L("second",15),ue("s",B),ue("ss",B,z),ce(["s","ss"],ve);var rn,an=Te("Seconds",!1);for(I("S",0,0,function(){return~~(this.millisecond()/100)}),I(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),I(0,["SSS",3],0,"millisecond"),I(0,["SSSS",4],0,function(){return 10*this.millisecond()}),I(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),I(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),I(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),I(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),I(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),H("millisecond","ms"),L("millisecond",16),ue("S",K,Z),ue("SS",K,z),ue("SSS",K,$),rn="SSSS";rn.length<=9;rn+="S")ue(rn,ne);function on(e,t){t[we]=k(1e3*("0."+e))}for(rn="S";rn.length<=9;rn+="S")ce(rn,on);var un=Te("Milliseconds",!1);I("z",0,0,"zoneAbbr"),I("zz",0,0,"zoneName");var ln=M.prototype;function dn(e){return e}ln.add=qt,ln.calendar=function(e,t){var n=e||Tt(),s=Nt(n,this).startOf("day"),i=c.calendarFormat(this,s)||"sameElse",r=t&&(x(t[i])?t[i].call(this,n):t[i]);return this.format(r||this.localeData().calendar(i,this,Tt(n)))},ln.clone=function(){return new M(this)},ln.diff=function(e,t,n){var s,i,r;if(!this.isValid())return NaN;if(!(s=Nt(e,this)).isValid())return NaN;switch(i=6e4*(s.utcOffset()-this.utcOffset()),t=R(t)){case"year":r=Bt(this,s)/12;break;case"month":r=Bt(this,s);break;case"quarter":r=Bt(this,s)/3;break;case"second":r=(this-s)/1e3;break;case"minute":r=(this-s)/6e4;break;case"hour":r=(this-s)/36e5;break;case"day":r=(this-s-i)/864e5;break;case"week":r=(this-s-i)/6048e5;break;default:r=this-s}return n?r:D(r)},ln.endOf=function(e){return void 0===(e=R(e))||"millisecond"===e?this:("date"===e&&(e="day"),this.startOf(e).add(1,"isoWeek"===e?"week":e).subtract(1,"ms"))},ln.format=function(e){e||(e=this.isUtc()?c.defaultFormatUtc:c.defaultFormat);var t=A(this,e);return this.localeData().postformat(t)},ln.from=function(e,t){return this.isValid()&&(S(e)&&e.isValid()||Tt(e).isValid())?At({to:this,from:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()},ln.fromNow=function(e){return this.from(Tt(),e)},ln.to=function(e,t){return this.isValid()&&(S(e)&&e.isValid()||Tt(e).isValid())?At({from:this,to:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()},ln.toNow=function(e){return this.to(Tt(),e)},ln.get=function(e){return x(this[e=R(e)])?this[e]():this},ln.invalidAt=function(){return g(this).overflow},ln.isAfter=function(e,t){var n=S(e)?e:Tt(e);return!(!this.isValid()||!n.isValid())&&("millisecond"===(t=R(l(t)?"millisecond":t))?this.valueOf()>n.valueOf():n.valueOf()<this.clone().startOf(t).valueOf())},ln.isBefore=function(e,t){var n=S(e)?e:Tt(e);return!(!this.isValid()||!n.isValid())&&("millisecond"===(t=R(l(t)?"millisecond":t))?this.valueOf()<n.valueOf():this.clone().endOf(t).valueOf()<n.valueOf())},ln.isBetween=function(e,t,n,s){return("("===(s=s||"()")[0]?this.isAfter(e,n):!this.isBefore(e,n))&&(")"===s[1]?this.isBefore(t,n):!this.isAfter(t,n))},ln.isSame=function(e,t){var n,s=S(e)?e:Tt(e);return!(!this.isValid()||!s.isValid())&&("millisecond"===(t=R(t||"millisecond"))?this.valueOf()===s.valueOf():(n=s.valueOf(),this.clone().startOf(t).valueOf()<=n&&n<=this.clone().endOf(t).valueOf()))},ln.isSameOrAfter=function(e,t){return this.isSame(e,t)||this.isAfter(e,t)},ln.isSameOrBefore=function(e,t){return this.isSame(e,t)||this.isBefore(e,t)},ln.isValid=function(){return p(this)},ln.lang=Xt,ln.locale=Qt,ln.localeData=Kt,ln.max=bt,ln.min=xt,ln.parsingFlags=function(){return _({},g(this))},ln.set=function(e,t){if("object"==typeof e)for(var n=function(e){var t=[];for(var n in e)t.push({unit:n,priority:F[n]});return t.sort(function(e,t){return e.priority-t.priority}),t}(e=C(e)),s=0;s<n.length;s++)this[n[s].unit](e[n[s].unit]);else if(x(this[e=R(e)]))return this[e](t);return this},ln.startOf=function(e){switch(e=R(e)){case"year":this.month(0);case"quarter":case"month":this.date(1);case"week":case"isoWeek":case"day":case"date":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===e&&this.weekday(0),"isoWeek"===e&&this.isoWeekday(1),"quarter"===e&&this.month(3*Math.floor(this.month()/3)),this},ln.subtract=Jt,ln.toArray=function(){var e=this;return[e.year(),e.month(),e.date(),e.hour(),e.minute(),e.second(),e.millisecond()]},ln.toObject=function(){var e=this;return{years:e.year(),months:e.month(),date:e.date(),hours:e.hours(),minutes:e.minutes(),seconds:e.seconds(),milliseconds:e.milliseconds()}},ln.toDate=function(){return new Date(this.valueOf())},ln.toISOString=function(e){if(!this.isValid())return null;var t=!0!==e,n=t?this.clone().utc():this;return n.year()<0||9999<n.year()?A(n,t?"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ"):x(Date.prototype.toISOString)?t?this.toDate().toISOString():new Date(this.valueOf()+60*this.utcOffset()*1e3).toISOString().replace("Z",A(n,"Z")):A(n,t?"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]":"YYYY-MM-DD[T]HH:mm:ss.SSSZ")},ln.inspect=function(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var e="moment",t="";this.isLocal()||(e=0===this.utcOffset()?"moment.utc":"moment.parseZone",t="Z");var n="["+e+'("]',s=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",i=t+'[")]';return this.format(n+s+"-MM-DD[T]HH:mm:ss.SSS"+i)},ln.toJSON=function(){return this.isValid()?this.toISOString():null},ln.toString=function(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")},ln.unix=function(){return Math.floor(this.valueOf()/1e3)},ln.valueOf=function(){return this._d.valueOf()-6e4*(this._offset||0)},ln.creationData=function(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}},ln.year=Oe,ln.isLeapYear=function(){return ke(this.year())},ln.weekYear=function(e){return tn.call(this,e,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)},ln.isoWeekYear=function(e){return tn.call(this,e,this.isoWeek(),this.isoWeekday(),1,4)},ln.quarter=ln.quarters=function(e){return null==e?Math.ceil((this.month()+1)/3):this.month(3*(e-1)+this.month()%3)},ln.month=Fe,ln.daysInMonth=function(){return Pe(this.year(),this.month())},ln.week=ln.weeks=function(e){var t=this.localeData().week(this);return null==e?t:this.add(7*(e-t),"d")},ln.isoWeek=ln.isoWeeks=function(e){var t=Ie(this,1,4).week;return null==e?t:this.add(7*(e-t),"d")},ln.weeksInYear=function(){var e=this.localeData()._week;return Ae(this.year(),e.dow,e.doy)},ln.isoWeeksInYear=function(){return Ae(this.year(),1,4)},ln.date=nn,ln.day=ln.days=function(e){if(!this.isValid())return null!=e?this:NaN;var t,n,s=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=e?(t=e,n=this.localeData(),e="string"!=typeof t?t:isNaN(t)?"number"==typeof(t=n.weekdaysParse(t))?t:null:parseInt(t,10),this.add(e-s,"d")):s},ln.weekday=function(e){if(!this.isValid())return null!=e?this:NaN;var t=(this.day()+7-this.localeData()._week.dow)%7;return null==e?t:this.add(e-t,"d")},ln.isoWeekday=function(e){if(!this.isValid())return null!=e?this:NaN;if(null!=e){var t=(n=e,s=this.localeData(),"string"==typeof n?s.weekdaysParse(n)%7||7:isNaN(n)?null:n);return this.day(this.day()%7?t:t-7)}return this.day()||7;var n,s},ln.dayOfYear=function(e){var t=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==e?t:this.add(e-t,"d")},ln.hour=ln.hours=tt,ln.minute=ln.minutes=sn,ln.second=ln.seconds=an,ln.millisecond=ln.milliseconds=un,ln.utcOffset=function(e,t,n){var s,i=this._offset||0;if(!this.isValid())return null!=e?this:NaN;if(null!=e){if("string"==typeof e){if(null===(e=Ut(re,e)))return this}else Math.abs(e)<16&&!n&&(e*=60);return!this._isUTC&&t&&(s=Gt(this)),this._offset=e,this._isUTC=!0,null!=s&&this.add(s,"m"),i!==e&&(!t||this._changeInProgress?$t(this,At(e-i,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,c.updateOffset(this,!0),this._changeInProgress=null)),this}return this._isUTC?i:Gt(this)},ln.utc=function(e){return this.utcOffset(0,e)},ln.local=function(e){return this._isUTC&&(this.utcOffset(0,e),this._isUTC=!1,e&&this.subtract(Gt(this),"m")),this},ln.parseZone=function(){if(null!=this._tzm)this.utcOffset(this._tzm,!1,!0);else if("string"==typeof this._i){var e=Ut(ie,this._i);null!=e?this.utcOffset(e):this.utcOffset(0,!0)}return this},ln.hasAlignedHourOffset=function(e){return!!this.isValid()&&(e=e?Tt(e).utcOffset():0,(this.utcOffset()-e)%60==0)},ln.isDST=function(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()},ln.isLocal=function(){return!!this.isValid()&&!this._isUTC},ln.isUtcOffset=function(){return!!this.isValid()&&this._isUTC},ln.isUtc=Vt,ln.isUTC=Vt,ln.zoneAbbr=function(){return this._isUTC?"UTC":""},ln.zoneName=function(){return this._isUTC?"Coordinated Universal Time":""},ln.dates=n("dates accessor is deprecated. Use date instead.",nn),ln.months=n("months accessor is deprecated. Use month instead",Fe),ln.years=n("years accessor is deprecated. Use year instead",Oe),ln.zone=n("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",function(e,t){return null!=e?("string"!=typeof e&&(e=-e),this.utcOffset(e,t),this):-this.utcOffset()}),ln.isDSTShifted=n("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",function(){if(!l(this._isDSTShifted))return this._isDSTShifted;var e={};if(w(e,this),(e=Yt(e))._a){var t=e._isUTC?y(e._a):Tt(e._a);this._isDSTShifted=this.isValid()&&0<a(e._a,t.toArray())}else this._isDSTShifted=!1;return this._isDSTShifted});var hn=P.prototype;function cn(e,t,n,s){var i=lt(),r=y().set(s,t);return i[n](r,e)}function fn(e,t,n){if(d(e)&&(t=e,e=void 0),e=e||"",null!=t)return cn(e,t,n,"month");var s,i=[];for(s=0;s<12;s++)i[s]=cn(e,s,n,"month");return i}function mn(e,t,n,s){"boolean"==typeof e?d(t)&&(n=t,t=void 0):(t=e,e=!1,d(n=t)&&(n=t,t=void 0)),t=t||"";var i,r=lt(),a=e?r._week.dow:0;if(null!=n)return cn(t,(n+a)%7,s,"day");var o=[];for(i=0;i<7;i++)o[i]=cn(t,(i+a)%7,s,"day");return o}hn.calendar=function(e,t,n){var s=this._calendar[e]||this._calendar.sameElse;return x(s)?s.call(t,n):s},hn.longDateFormat=function(e){var t=this._longDateFormat[e],n=this._longDateFormat[e.toUpperCase()];return t||!n?t:(this._longDateFormat[e]=n.replace(/MMMM|MM|DD|dddd/g,function(e){return e.slice(1)}),this._longDateFormat[e])},hn.invalidDate=function(){return this._invalidDate},hn.ordinal=function(e){return this._ordinal.replace("%d",e)},hn.preparse=dn,hn.postformat=dn,hn.relativeTime=function(e,t,n,s){var i=this._relativeTime[n];return x(i)?i(e,t,n,s):i.replace(/%d/i,e)},hn.pastFuture=function(e,t){var n=this._relativeTime[0<e?"future":"past"];return x(n)?n(t):n.replace(/%s/i,t)},hn.set=function(e){var t,n;for(n in e)x(t=e[n])?this[n]=t:this["_"+n]=t;this._config=e,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)},hn.months=function(e,t){return e?o(this._months)?this._months[e.month()]:this._months[(this._months.isFormat||We).test(t)?"format":"standalone"][e.month()]:o(this._months)?this._months:this._months.standalone},hn.monthsShort=function(e,t){return e?o(this._monthsShort)?this._monthsShort[e.month()]:this._monthsShort[We.test(t)?"format":"standalone"][e.month()]:o(this._monthsShort)?this._monthsShort:this._monthsShort.standalone},hn.monthsParse=function(e,t,n){var s,i,r;if(this._monthsParseExact)return function(e,t,n){var s,i,r,a=e.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],s=0;s<12;++s)r=y([2e3,s]),this._shortMonthsParse[s]=this.monthsShort(r,"").toLocaleLowerCase(),this._longMonthsParse[s]=this.months(r,"").toLocaleLowerCase();return n?"MMM"===t?-1!==(i=Ye.call(this._shortMonthsParse,a))?i:null:-1!==(i=Ye.call(this._longMonthsParse,a))?i:null:"MMM"===t?-1!==(i=Ye.call(this._shortMonthsParse,a))?i:-1!==(i=Ye.call(this._longMonthsParse,a))?i:null:-1!==(i=Ye.call(this._longMonthsParse,a))?i:-1!==(i=Ye.call(this._shortMonthsParse,a))?i:null}.call(this,e,t,n);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),s=0;s<12;s++){if(i=y([2e3,s]),n&&!this._longMonthsParse[s]&&(this._longMonthsParse[s]=new RegExp("^"+this.months(i,"").replace(".","")+"$","i"),this._shortMonthsParse[s]=new RegExp("^"+this.monthsShort(i,"").replace(".","")+"$","i")),n||this._monthsParse[s]||(r="^"+this.months(i,"")+"|^"+this.monthsShort(i,""),this._monthsParse[s]=new RegExp(r.replace(".",""),"i")),n&&"MMMM"===t&&this._longMonthsParse[s].test(e))return s;if(n&&"MMM"===t&&this._shortMonthsParse[s].test(e))return s;if(!n&&this._monthsParse[s].test(e))return s}},hn.monthsRegex=function(e){return this._monthsParseExact?(m(this,"_monthsRegex")||Ne.call(this),e?this._monthsStrictRegex:this._monthsRegex):(m(this,"_monthsRegex")||(this._monthsRegex=Ue),this._monthsStrictRegex&&e?this._monthsStrictRegex:this._monthsRegex)},hn.monthsShortRegex=function(e){return this._monthsParseExact?(m(this,"_monthsRegex")||Ne.call(this),e?this._monthsShortStrictRegex:this._monthsShortRegex):(m(this,"_monthsShortRegex")||(this._monthsShortRegex=Le),this._monthsShortStrictRegex&&e?this._monthsShortStrictRegex:this._monthsShortRegex)},hn.week=function(e){return Ie(e,this._week.dow,this._week.doy).week},hn.firstDayOfYear=function(){return this._week.doy},hn.firstDayOfWeek=function(){return this._week.dow},hn.weekdays=function(e,t){return e?o(this._weekdays)?this._weekdays[e.day()]:this._weekdays[this._weekdays.isFormat.test(t)?"format":"standalone"][e.day()]:o(this._weekdays)?this._weekdays:this._weekdays.standalone},hn.weekdaysMin=function(e){return e?this._weekdaysMin[e.day()]:this._weekdaysMin},hn.weekdaysShort=function(e){return e?this._weekdaysShort[e.day()]:this._weekdaysShort},hn.weekdaysParse=function(e,t,n){var s,i,r;if(this._weekdaysParseExact)return function(e,t,n){var s,i,r,a=e.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],s=0;s<7;++s)r=y([2e3,1]).day(s),this._minWeekdaysParse[s]=this.weekdaysMin(r,"").toLocaleLowerCase(),this._shortWeekdaysParse[s]=this.weekdaysShort(r,"").toLocaleLowerCase(),this._weekdaysParse[s]=this.weekdays(r,"").toLocaleLowerCase();return n?"dddd"===t?-1!==(i=Ye.call(this._weekdaysParse,a))?i:null:"ddd"===t?-1!==(i=Ye.call(this._shortWeekdaysParse,a))?i:null:-1!==(i=Ye.call(this._minWeekdaysParse,a))?i:null:"dddd"===t?-1!==(i=Ye.call(this._weekdaysParse,a))?i:-1!==(i=Ye.call(this._shortWeekdaysParse,a))?i:-1!==(i=Ye.call(this._minWeekdaysParse,a))?i:null:"ddd"===t?-1!==(i=Ye.call(this._shortWeekdaysParse,a))?i:-1!==(i=Ye.call(this._weekdaysParse,a))?i:-1!==(i=Ye.call(this._minWeekdaysParse,a))?i:null:-1!==(i=Ye.call(this._minWeekdaysParse,a))?i:-1!==(i=Ye.call(this._weekdaysParse,a))?i:-1!==(i=Ye.call(this._shortWeekdaysParse,a))?i:null}.call(this,e,t,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),s=0;s<7;s++){if(i=y([2e3,1]).day(s),n&&!this._fullWeekdaysParse[s]&&(this._fullWeekdaysParse[s]=new RegExp("^"+this.weekdays(i,"").replace(".","\\.?")+"$","i"),this._shortWeekdaysParse[s]=new RegExp("^"+this.weekdaysShort(i,"").replace(".","\\.?")+"$","i"),this._minWeekdaysParse[s]=new RegExp("^"+this.weekdaysMin(i,"").replace(".","\\.?")+"$","i")),this._weekdaysParse[s]||(r="^"+this.weekdays(i,"")+"|^"+this.weekdaysShort(i,"")+"|^"+this.weekdaysMin(i,""),this._weekdaysParse[s]=new RegExp(r.replace(".",""),"i")),n&&"dddd"===t&&this._fullWeekdaysParse[s].test(e))return s;if(n&&"ddd"===t&&this._shortWeekdaysParse[s].test(e))return s;if(n&&"dd"===t&&this._minWeekdaysParse[s].test(e))return s;if(!n&&this._weekdaysParse[s].test(e))return s}},hn.weekdaysRegex=function(e){return this._weekdaysParseExact?(m(this,"_weekdaysRegex")||Be.call(this),e?this._weekdaysStrictRegex:this._weekdaysRegex):(m(this,"_weekdaysRegex")||(this._weekdaysRegex=$e),this._weekdaysStrictRegex&&e?this._weekdaysStrictRegex:this._weekdaysRegex)},hn.weekdaysShortRegex=function(e){return this._weekdaysParseExact?(m(this,"_weekdaysRegex")||Be.call(this),e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(m(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=qe),this._weekdaysShortStrictRegex&&e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)},hn.weekdaysMinRegex=function(e){return this._weekdaysParseExact?(m(this,"_weekdaysRegex")||Be.call(this),e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(m(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Je),this._weekdaysMinStrictRegex&&e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)},hn.isPM=function(e){return"p"===(e+"").toLowerCase().charAt(0)},hn.meridiem=function(e,t,n){return 11<e?n?"pm":"PM":n?"am":"AM"},ot("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var t=e%10;return e+(1===k(e%100/10)?"th":1===t?"st":2===t?"nd":3===t?"rd":"th")}}),c.lang=n("moment.lang is deprecated. Use moment.locale instead.",ot),c.langData=n("moment.langData is deprecated. Use moment.localeData instead.",lt);var _n=Math.abs;function yn(e,t,n,s){var i=At(t,n);return e._milliseconds+=s*i._milliseconds,e._days+=s*i._days,e._months+=s*i._months,e._bubble()}function gn(e){return e<0?Math.floor(e):Math.ceil(e)}function pn(e){return 4800*e/146097}function vn(e){return 146097*e/4800}function wn(e){return function(){return this.as(e)}}var Mn=wn("ms"),Sn=wn("s"),Dn=wn("m"),kn=wn("h"),Yn=wn("d"),On=wn("w"),Tn=wn("M"),xn=wn("y");function bn(e){return function(){return this.isValid()?this._data[e]:NaN}}var Pn=bn("milliseconds"),Wn=bn("seconds"),Hn=bn("minutes"),Rn=bn("hours"),Cn=bn("days"),Fn=bn("months"),Ln=bn("years");var Un=Math.round,Nn={ss:44,s:45,m:45,h:22,d:26,M:11};var Gn=Math.abs;function Vn(e){return(0<e)-(e<0)||+e}function En(){if(!this.isValid())return this.localeData().invalidDate();var e,t,n=Gn(this._milliseconds)/1e3,s=Gn(this._days),i=Gn(this._months);t=D((e=D(n/60))/60),n%=60,e%=60;var r=D(i/12),a=i%=12,o=s,u=t,l=e,d=n?n.toFixed(3).replace(/\.?0+$/,""):"",h=this.asSeconds();if(!h)return"P0D";var c=h<0?"-":"",f=Vn(this._months)!==Vn(h)?"-":"",m=Vn(this._days)!==Vn(h)?"-":"",_=Vn(this._milliseconds)!==Vn(h)?"-":"";return c+"P"+(r?f+r+"Y":"")+(a?f+a+"M":"")+(o?m+o+"D":"")+(u||l||d?"T":"")+(u?_+u+"H":"")+(l?_+l+"M":"")+(d?_+d+"S":"")}var In=Ht.prototype;return In.isValid=function(){return this._isValid},In.abs=function(){var e=this._data;return this._milliseconds=_n(this._milliseconds),this._days=_n(this._days),this._months=_n(this._months),e.milliseconds=_n(e.milliseconds),e.seconds=_n(e.seconds),e.minutes=_n(e.minutes),e.hours=_n(e.hours),e.months=_n(e.months),e.years=_n(e.years),this},In.add=function(e,t){return yn(this,e,t,1)},In.subtract=function(e,t){return yn(this,e,t,-1)},In.as=function(e){if(!this.isValid())return NaN;var t,n,s=this._milliseconds;if("month"===(e=R(e))||"year"===e)return t=this._days+s/864e5,n=this._months+pn(t),"month"===e?n:n/12;switch(t=this._days+Math.round(vn(this._months)),e){case"week":return t/7+s/6048e5;case"day":return t+s/864e5;case"hour":return 24*t+s/36e5;case"minute":return 1440*t+s/6e4;case"second":return 86400*t+s/1e3;case"millisecond":return Math.floor(864e5*t)+s;default:throw new Error("Unknown unit "+e)}},In.asMilliseconds=Mn,In.asSeconds=Sn,In.asMinutes=Dn,In.asHours=kn,In.asDays=Yn,In.asWeeks=On,In.asMonths=Tn,In.asYears=xn,In.valueOf=function(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*k(this._months/12):NaN},In._bubble=function(){var e,t,n,s,i,r=this._milliseconds,a=this._days,o=this._months,u=this._data;return 0<=r&&0<=a&&0<=o||r<=0&&a<=0&&o<=0||(r+=864e5*gn(vn(o)+a),o=a=0),u.milliseconds=r%1e3,e=D(r/1e3),u.seconds=e%60,t=D(e/60),u.minutes=t%60,n=D(t/60),u.hours=n%24,o+=i=D(pn(a+=D(n/24))),a-=gn(vn(i)),s=D(o/12),o%=12,u.days=a,u.months=o,u.years=s,this},In.clone=function(){return At(this)},In.get=function(e){return e=R(e),this.isValid()?this[e+"s"]():NaN},In.milliseconds=Pn,In.seconds=Wn,In.minutes=Hn,In.hours=Rn,In.days=Cn,In.weeks=function(){return D(this.days()/7)},In.months=Fn,In.years=Ln,In.humanize=function(e){if(!this.isValid())return this.localeData().invalidDate();var t,n,s,i,r,a,o,u,l,d,h,c=this.localeData(),f=(n=!e,s=c,i=At(t=this).abs(),r=Un(i.as("s")),a=Un(i.as("m")),o=Un(i.as("h")),u=Un(i.as("d")),l=Un(i.as("M")),d=Un(i.as("y")),(h=r<=Nn.ss&&["s",r]||r<Nn.s&&["ss",r]||a<=1&&["m"]||a<Nn.m&&["mm",a]||o<=1&&["h"]||o<Nn.h&&["hh",o]||u<=1&&["d"]||u<Nn.d&&["dd",u]||l<=1&&["M"]||l<Nn.M&&["MM",l]||d<=1&&["y"]||["yy",d])[2]=n,h[3]=0<+t,h[4]=s,function(e,t,n,s,i){return i.relativeTime(t||1,!!n,e,s)}.apply(null,h));return e&&(f=c.pastFuture(+this,f)),c.postformat(f)},In.toISOString=En,In.toString=En,In.toJSON=En,In.locale=Qt,In.localeData=Kt,In.toIsoString=n("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",En),In.lang=Xt,I("X",0,0,"unix"),I("x",0,0,"valueOf"),ue("x",se),ue("X",/[+-]?\d+(\.\d{1,3})?/),ce("X",function(e,t,n){n._d=new Date(1e3*parseFloat(e,10))}),ce("x",function(e,t,n){n._d=new Date(k(e))}),c.version="2.22.2",e=Tt,c.fn=ln,c.min=function(){return Pt("isBefore",[].slice.call(arguments,0))},c.max=function(){return Pt("isAfter",[].slice.call(arguments,0))},c.now=function(){return Date.now?Date.now():+new Date},c.utc=y,c.unix=function(e){return Tt(1e3*e)},c.months=function(e,t){return fn(e,t,"months")},c.isDate=h,c.locale=ot,c.invalid=v,c.duration=At,c.isMoment=S,c.weekdays=function(e,t,n){return mn(e,t,n,"weekdays")},c.parseZone=function(){return Tt.apply(null,arguments).parseZone()},c.localeData=lt,c.isDuration=Rt,c.monthsShort=function(e,t){return fn(e,t,"monthsShort")},c.weekdaysMin=function(e,t,n){return mn(e,t,n,"weekdaysMin")},c.defineLocale=ut,c.updateLocale=function(e,t){if(null!=t){var n,s,i=nt;null!=(s=at(e))&&(i=s._config),(n=new P(t=b(i,t))).parentLocale=st[e],st[e]=n,ot(e)}else null!=st[e]&&(null!=st[e].parentLocale?st[e]=st[e].parentLocale:null!=st[e]&&delete st[e]);return st[e]},c.locales=function(){return s(st)},c.weekdaysShort=function(e,t,n){return mn(e,t,n,"weekdaysShort")},c.normalizeUnits=R,c.relativeTimeRounding=function(e){return void 0===e?Un:"function"==typeof e&&(Un=e,!0)},c.relativeTimeThreshold=function(e,t){return void 0!==Nn[e]&&(void 0===t?Nn[e]:(Nn[e]=t,"s"===e&&(Nn.ss=t-1),!0))},c.calendarFormat=function(e,t){var n=e.diff(t,"days",!0);return n<-6?"sameElse":n<-1?"lastWeek":n<0?"lastDay":n<1?"sameDay":n<2?"nextDay":n<7?"nextWeek":"sameElse"},c.prototype=ln,c.HTML5_FMT={DATETIME_LOCAL:"YYYY-MM-DDTHH:mm",DATETIME_LOCAL_SECONDS:"YYYY-MM-DDTHH:mm:ss",DATETIME_LOCAL_MS:"YYYY-MM-DDTHH:mm:ss.SSS",DATE:"YYYY-MM-DD",TIME:"HH:mm",TIME_SECONDS:"HH:mm:ss",TIME_MS:"HH:mm:ss.SSS",WEEK:"YYYY-[W]WW",MONTH:"YYYY-MM"},c});
\ No newline at end of file diff --git a/assets/php/getData.php b/assets/php/getData.php new file mode 100755 index 0000000..22f0f26 --- /dev/null +++ b/assets/php/getData.php @@ -0,0 +1,46 @@ +<?php +/** + * Server-side script of the Netflix Stats Generator to get the personal Netflix JSON + * @author Marvin Borner + * @copyright Marvin Borner 2018 + */ + +$cookie = $_POST['cookie']; + +if (isset($cookie)) { + $isLastPage = false; + $currentPage = 0; + $result = '['; + + while ($isLastPage === false) { + $ch = curl_init('https://www.netflix.com/api/shakti/ve8ded8cd/viewingactivity?pg=' . $currentPage . '&pgSize=100'); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_HEADER, 0); + curl_setopt($ch, CURLOPT_COOKIE, $cookie); + $answer = curl_exec($ch); + + if ($isLastPage = (count(json_decode($answer, true)['viewedItems']) > 0)) { + $isLastPage = false; + $result .= json_encode(json_decode($answer, true)['viewedItems']) . ','; + } else { + $isLastPage = true; + $result = substr($result, 0, -1); + } + + curl_close($ch); + $currentPage++; + } + + if ($result !== '') { + print_r($result . ']'); + } else { + http_response_code(404); + die(); + } +} else { + http_response_code(404); + die(); +} + + + diff --git a/assets/php/getInformation.php b/assets/php/getInformation.php deleted file mode 100644 index c5f3ea2..0000000 --- a/assets/php/getInformation.php +++ /dev/null @@ -1,17 +0,0 @@ -<?php -/** - * Serverside Script of the Netflix Stats Generator to get information of a movie/series - * @author Marvin Borner - * @copyright Marvin Borner 2018 - */ - -$RequestedTitle = $_POST["Title"]; - -$ApiKey = file_get_contents("../../../../ApiKeys/ThemoviedbApiKey.txt"); -$ch = curl_init("https://api.themoviedb.org/3/search/multi?api_key=" . $ApiKey . "&language=en-US&query=" . urlencode($RequestedTitle) . "&page=1&include_adult=true"); -curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); -curl_setopt($ch, CURLOPT_HEADER, 0); -$Result = json_decode(curl_exec($ch), true); -curl_close($ch); - -print_r(json_encode($Result["results"][0])); diff --git a/assets/php/getNetflixJson.php b/assets/php/getNetflixJson.php deleted file mode 100755 index 3a2fbe4..0000000 --- a/assets/php/getNetflixJson.php +++ /dev/null @@ -1,34 +0,0 @@ -<?php -/** - * Serverside Script of the Netflix Stats Generator to get the personal Netflix JSON - * @author Marvin Borner - * @copyright Marvin Borner 2018 - */ - -$NetflixCookie = $_POST["Cookie"]; - -$LastPage = false; -$CurPage = 0; -$NetflixJson = "["; - -while ($LastPage === false) { - $ch = curl_init("https://www.netflix.com/api/shakti/7742b8c7/viewingactivity?pg=" . (string) $CurPage . "&pgSize=100"); - curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); - curl_setopt($ch, CURLOPT_HEADER, 0); - curl_setopt($ch, CURLOPT_COOKIE, $NetflixCookie); - $Result = curl_exec($ch); - //print_r((json_decode($Result, TRUE)["viewedItems"])); - //echo count(json_decode(curl_exec($ch),true)["viewedItems"]); - if ($LastPage = count(json_decode($Result, true)["viewedItems"]) > 0) { - $LastPage = false; - $NetflixJson .= json_encode(json_decode($Result, true)["viewedItems"]) . ","; - } else { - $LastPage = true; - $NetflixJson = substr($NetflixJson, 0, -1); - } - - curl_close($ch); - $CurPage++; -} - -print_r($NetflixJson . "]"); @@ -8,43 +8,42 @@ <head> <meta charset="UTF-8"> - <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> - <meta http-equiv="X-UA-Compatible" content="ie=edge"> - <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Varela+Round"> - <link rel="stylesheet" href="assets/css/normalize.css"> - <link rel="stylesheet" href="assets/css/grid.css"> - <link rel="stylesheet" href="assets/css/main.css"> - <title>Netflix Personal Stats Generator</title> + <meta content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0" + name="viewport"> + <meta content="ie=edge" http-equiv="X-UA-Compatible"> + <link href="https://fonts.googleapis.com/css?family=Varela+Round" rel="stylesheet"> + <link href="assets/css/normalize.css" rel="stylesheet"> + <link href="assets/css/main.css" rel="stylesheet"> + <title>Netflix Statistics</title> </head> <body> +<div id="cookie_wrap"> + <label for="cookie">Enter your cookie:</label> + <input class="cookie" id="cookie" placeholder="memclid=***; ..." type="text"> +</div> - <input class="CookieInput" type="text" placeholder="Type your cookie..."> +<div class="loading" id="loading">Loading...</div> - <div class="Main"> - <div class="row around-xs middle-xs MostWatchedOverview"> - <div class="col-xs-8 Description"></div> - <img class="col-xs-3 MostWatchedPoster" src="" alt=""> - </div> - - <div class="row"> - <div class="col-xs"> - <canvas id="WatchTimeChart"></canvas> - </div> - <div class="col-xs"> - <canvas class="MostWatchedChart" id="MostWatchedChart"></canvas> - </div> - </div> - <div class="row"> - <div class="col-xs"> - <div class="HeatmapWrap"> - <div class="Heatmap" id="Heatmap"></div> - </div> - </div> - </div> +<div class="stats" id="stats"> + <h2>Netflix Statistics</h2> + <div>Total watch time: <span id="totalSpent"></span></div> + <div> + <canvas id="hourChart"></canvas> + </div> + <div> + <p>Most watched titles: </p> + <canvas id="topChart"></canvas> + </div> + <div> + <p>Overview of the year:</p> + <div id="information"></div> + <table class="heatMap" id="heatMap"></table> </div> +</div> - <script src="/min/?f=assets/js/jQuery.js,assets/js/chart.js,assets/js/moment.js,assets/js/d3.js,assets/js/heatmap.js,assets/js/main.js&debug=1"></script> +<script src="assets/js/chart.js"></script> +<script src="assets/js/main.js"></script> </body> -</html>
\ No newline at end of file +</html> |